[
  {
    "path": ".gitignore",
    "content": "#\n# NOTE! Don't add files that are generated in specific\n# subdirectories here. Add them in the \".gitignore\" file\n# in that subdirectory instead.\n#\n# NOTE! Please use 'git ls-files -i --exclude-standard'\n# command after changing this file, to see if there are\n# any tracked files which get ignored after the change.\n#\n# Normal rules\n#\n.*\n*.o\n*.o.*\n*.ko\n*.mod.c\nModule.symvers\nmodules.order\ncscope.*\n\n#\n# git files that we don't want to ignore even it they are dot-files\n#\n!.gitignore\n\n"
  },
  {
    "path": "Kconfig",
    "content": "config RTL8814AU\n\ttristate \"Realtek 8814A USB WiFi\"\n\tdepends on USB\n\t---help---\n\t  Help message of RTL8814AU\n\n"
  },
  {
    "path": "LICENSE",
    "content": "# SPDX-Full-Name: GNU General Public License v2.0 only\n# SPDX-License-Identifier: GPL-2.0\n# SPDX-License-URL: https://spdx.org/licenses/GPL-2.0.html\n\n            GNU GENERAL PUBLIC LICENSE\n               Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n            GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n             END OF TERMS AND CONDITIONS\n\f\n        How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n\n"
  },
  {
    "path": "Makefile",
    "content": "EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS)\nEXTRA_CFLAGS += -O1\n#EXTRA_CFLAGS += -O3\n#EXTRA_CFLAGS += -Wall\n#EXTRA_CFLAGS += -Wextra\n#EXTRA_CFLAGS += -Werror\n#EXTRA_CFLAGS += -pedantic\n#EXTRA_CFLAGS += -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes\n\nEXTRA_CFLAGS += -Wno-unused-variable\nEXTRA_CFLAGS += -Wno-unused-value\nEXTRA_CFLAGS += -Wno-unused-label\nEXTRA_CFLAGS += -Wno-unused-parameter\nEXTRA_CFLAGS += -Wno-unused-function\nEXTRA_CFLAGS += -Wno-unused\n#EXTRA_CFLAGS += -Wno-uninitialized\n#EXTRA_CFLAGS += -Wno-error=date-time\t# Fix compile error on gcc 4.9 and later\n\nEXTRA_CFLAGS += -I$(src)/include\nEXTRA_CFLAGS += -I$(src)/hal/phydm\n\nEXTRA_LDFLAGS += --strip-debug\n\nCONFIG_AUTOCFG_CP = n\n\n########################## WIFI IC ############################\nCONFIG_MULTIDRV = n\nCONFIG_RTL8188E = n\nCONFIG_RTL8812A = n\nCONFIG_RTL8821A = n\nCONFIG_RTL8192E = n\nCONFIG_RTL8723B = n\nCONFIG_RTL8814A = y\nCONFIG_RTL8723C = n\nCONFIG_RTL8188F = n\n######################### Interface ###########################\nCONFIG_USB_HCI = y\nCONFIG_PCI_HCI = n\nCONFIG_SDIO_HCI = n\nCONFIG_GSPI_HCI = n\n########################## Features ###########################\nCONFIG_MP_INCLUDED = y\nCONFIG_POWER_SAVING = y\nCONFIG_USB_AUTOSUSPEND = n\nCONFIG_HW_PWRP_DETECTION = n\nCONFIG_WIFI_TEST = n\nCONFIG_BT_COEXIST = n\nCONFIG_INTEL_WIDI = n\nCONFIG_WAPI_SUPPORT = n\nCONFIG_EFUSE_CONFIG_FILE = n\nCONFIG_EXT_CLK = n\nCONFIG_TRAFFIC_PROTECT = y\nCONFIG_LOAD_PHY_PARA_FROM_FILE = y\nCONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = y\nCONFIG_CALIBRATE_TX_POWER_TO_MAX = n\nCONFIG_RTW_ADAPTIVITY_EN = disable\nCONFIG_RTW_ADAPTIVITY_MODE = normal\nCONFIG_SIGNAL_SCALE_MAPPING = n\nCONFIG_80211W = n\nCONFIG_REDUCE_TX_CPU_LOADING = n\nCONFIG_BR_EXT = y\nCONFIG_ANTENNA_DIVERSITY = n\nCONFIG_TDLS = n\nCONFIG_WIFI_MONITOR = n\nCONFIG_APPEND_VENDOR_IE_ENABLE = n\n######################## Wake On Lan ##########################\nCONFIG_WOWLAN = n\nCONFIG_GPIO_WAKEUP = n\nCONFIG_WAKEUP_GPIO_IDX = default\nCONFIG_HIGH_ACTIVE = n\nCONFIG_PNO_SUPPORT = n\nCONFIG_PNO_SET_DEBUG = n\nCONFIG_AP_WOWLAN = n\n######### Notify SDIO Host Keep Power During Syspend ##########\nCONFIG_RTW_SDIO_PM_KEEP_POWER = y\n###################### MP HW TX MODE FOR VHT #######################\nCONFIG_MP_VHT_HW_TX_MODE = n\n###################### Platform Related #######################\nCONFIG_PLATFORM_I386_PC = y\nCONFIG_PLATFORM_ANDROID_X86 = n\nCONFIG_PLATFORM_ANDROID_INTEL_X86 = n\nCONFIG_PLATFORM_JB_X86 = n\nCONFIG_PLATFORM_ARM_S3C2K4 = n\nCONFIG_PLATFORM_ARM_PXA2XX = n\nCONFIG_PLATFORM_ARM_S3C6K4 = n\nCONFIG_PLATFORM_MIPS_RMI = n\nCONFIG_PLATFORM_RTD2880B = n\nCONFIG_PLATFORM_MIPS_AR9132 = n\nCONFIG_PLATFORM_RTK_DMP = n\nCONFIG_PLATFORM_MIPS_PLM = n\nCONFIG_PLATFORM_MSTAR389 = n\nCONFIG_PLATFORM_MT53XX = n\nCONFIG_PLATFORM_ARM_MX51_241H = n\nCONFIG_PLATFORM_FS_MX61 = n\nCONFIG_PLATFORM_ACTIONS_ATJ227X = n\nCONFIG_PLATFORM_TEGRA3_CARDHU = n\nCONFIG_PLATFORM_TEGRA4_DALMORE = n\nCONFIG_PLATFORM_ARM_TCC8900 = n\nCONFIG_PLATFORM_ARM_TCC8920 = n\nCONFIG_PLATFORM_ARM_TCC8920_JB42 = n\nCONFIG_PLATFORM_ARM_TCC8930_JB42 = n\nCONFIG_PLATFORM_ARM_RK2818 = n\nCONFIG_PLATFORM_ARM_RK3066 = n\nCONFIG_PLATFORM_ARM_RK3188 = n\nCONFIG_PLATFORM_ARM_URBETTER = n\nCONFIG_PLATFORM_ARM_TI_PANDA = n\nCONFIG_PLATFORM_MIPS_JZ4760 = n\nCONFIG_PLATFORM_DMP_PHILIPS = n\nCONFIG_PLATFORM_MSTAR_TITANIA12 = n\nCONFIG_PLATFORM_MSTAR = n\nCONFIG_PLATFORM_SZEBOOK = n\nCONFIG_PLATFORM_ARM_SUNxI = n\nCONFIG_PLATFORM_ARM_SUN6I = n\nCONFIG_PLATFORM_ARM_SUN7I = n\nCONFIG_PLATFORM_ARM_SUN8I_W3P1 = n\nCONFIG_PLATFORM_ARM_SUN8I_W5P1 = n\nCONFIG_PLATFORM_ACTIONS_ATM702X = n\nCONFIG_PLATFORM_ACTIONS_ATV5201 = n\nCONFIG_PLATFORM_ACTIONS_ATM705X = n\nCONFIG_PLATFORM_ARM_SUN50IW1P1 = n\nCONFIG_PLATFORM_ARM_RTD299X = n\nCONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n\nCONFIG_PLATFORM_ARM_SPREADTRUM_8810 = n\nCONFIG_PLATFORM_ARM_WMT = n\nCONFIG_PLATFORM_TI_DM365 = n\nCONFIG_PLATFORM_MOZART = n\nCONFIG_PLATFORM_RTK119X = n\nCONFIG_PLATFORM_NOVATEK_NT72668 = n\nCONFIG_PLATFORM_HISILICON = n\n###############################################################\n\nCONFIG_DRVEXT_MODULE = n\n\nexport TopDIR ?= $(shell pwd)\n\n########### COMMON  #################################\nifeq ($(CONFIG_GSPI_HCI), y)\nHCI_NAME = gspi\nendif\n\nifeq ($(CONFIG_SDIO_HCI), y)\nHCI_NAME = sdio\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\nHCI_NAME = usb\nendif\n\nifeq ($(CONFIG_PCI_HCI), y)\nHCI_NAME = pci\nendif\n\n\n_OS_INTFS_FILES :=\tos_dep/osdep_service.o \\\n\t\t\tos_dep/linux/os_intfs.o \\\n\t\t\tos_dep/linux/$(HCI_NAME)_intf.o \\\n\t\t\tos_dep/linux/$(HCI_NAME)_ops_linux.o \\\n\t\t\tos_dep/linux/ioctl_linux.o \\\n\t\t\tos_dep/linux/xmit_linux.o \\\n\t\t\tos_dep/linux/mlme_linux.o \\\n\t\t\tos_dep/linux/recv_linux.o \\\n\t\t\tos_dep/linux/ioctl_cfg80211.o \\\n\t\t\tos_dep/linux/rtw_cfgvendor.o \\\n\t\t\tos_dep/linux/wifi_regd.o \\\n\t\t\tos_dep/linux/rtw_android.o \\\n\t\t\tos_dep/linux/rtw_proc.o\n\nifeq ($(CONFIG_MP_INCLUDED), y)\n_OS_INTFS_FILES += os_dep/linux/ioctl_mp.o\nendif\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_OS_INTFS_FILES += os_dep/linux/custom_gpio_linux.o\n_OS_INTFS_FILES += os_dep/linux/$(HCI_NAME)_ops_linux.o\nendif\n\nifeq ($(CONFIG_GSPI_HCI), y)\n_OS_INTFS_FILES += os_dep/linux/custom_gpio_linux.o\n_OS_INTFS_FILES += os_dep/linux/$(HCI_NAME)_ops_linux.o\nendif\n\n\n_HAL_INTFS_FILES :=\thal/hal_intf.o \\\n\t\t\thal/hal_com.o \\\n\t\t\thal/hal_com_phycfg.o \\\n\t\t\thal/hal_phy.o \\\n\t\t\thal/hal_dm.o \\\n\t\t\thal/hal_btcoex.o \\\n\t\t\thal/hal_mp.o \\\n\t\t\thal/hal_hci/hal_$(HCI_NAME).o \\\n\t\t\thal/led/hal_$(HCI_NAME)_led.o\n\n\t\t\t\n_OUTSRC_FILES := hal/phydm/phydm_debug.o\t\\\n\t\thal/phydm/phydm_antdiv.o\\\n\t\thal/phydm/phydm_antdect.o\\\n\t\thal/phydm/phydm_interface.o\\\n\t\thal/phydm/phydm_hwconfig.o\\\n\t\thal/phydm/phydm.o\\\n\t\thal/phydm/halphyrf_ce.o\\\n\t\thal/phydm/phydm_edcaturbocheck.o\\\n\t\thal/phydm/phydm_dig.o\\\n\t\thal/phydm/phydm_pathdiv.o\\\n\t\thal/phydm/phydm_rainfo.o\\\n\t\thal/phydm/phydm_dynamicbbpowersaving.o\\\n\t\thal/phydm/phydm_powertracking_ce.o\\\n\t\thal/phydm/phydm_dynamictxpower.o\\\n\t\thal/phydm/phydm_adaptivity.o\\\n\t\thal/phydm/phydm_cfotracking.o\\\n\t\thal/phydm/phydm_noisemonitor.o\\\n\t\thal/phydm/phydm_acs.o\\\n\t\thal/phydm/phydm_beamforming.o\\\n\t\thal/phydm/txbf/halcomtxbf.o\\\n\t\thal/phydm/txbf/haltxbfinterface.o\n\n\nEXTRA_CFLAGS += -I$(src)/platform\n_PLATFORM_FILES := platform/platform_ops.o\n\nifeq ($(CONFIG_BT_COEXIST), y)\nEXTRA_CFLAGS += -I$(src)/hal/btc\n_OUTSRC_FILES += hal/btc/HalBtc8192e1Ant.o \\\n\t\t\t\thal/btc/HalBtc8192e2Ant.o \\\n\t\t\t\thal/btc/HalBtc8723b1Ant.o \\\n\t\t\t\thal/btc/HalBtc8723b2Ant.o \\\n\t\t\t\thal/btc/HalBtc8812a1Ant.o \\\n\t\t\t\thal/btc/HalBtc8812a2Ant.o \\\n\t\t\t\thal/btc/HalBtc8821a1Ant.o \\\n\t\t\t\thal/btc/HalBtc8821a2Ant.o \\\n\t\t\t\thal/btc/HalBtc8821aCsr2Ant.o \\\n\t\t\t\thal/btc/HalBtc8703b1Ant.o \\\n\t\t\t\thal/btc/HalBtc8703b2Ant.o \nendif\n\n\n########### HAL_RTL8188E #################################\nifeq ($(CONFIG_RTL8188E), y)\n\nRTL871X = rtl8188e\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8189es\nendif\n\nifeq ($(CONFIG_GSPI_HCI), y)\nMODULE_NAME = 8189es\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8188eu\nendif\n\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8188ee\nendif\nEXTRA_CFLAGS += -DCONFIG_RTL8188E\n\n_HAL_INTFS_FILES +=\thal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8188EPwrSeq.o\\\n \t\t\t\t\thal/$(RTL871X)/$(RTL871X)_xmit.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\nifeq ($(CONFIG_GSPI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nendif\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_PCIE.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188E_SDIO.o\nendif\n\n#hal/OUTSRC/$(RTL871X)/Hal8188EFWImg_CE.o\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8188e_mac.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8188e_bb.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8188e_rf.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8188e_t_fw.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8188e_s_fw.o\\\n\t\thal/phydm/$(RTL871X)/halphyrf_8188e_ce.o\\\n\t\thal/phydm/$(RTL871X)/phydm_regconfig8188e.o\\\n\t\thal/phydm/$(RTL871X)/hal8188erateadaptive.o\\\n\t\thal/phydm/$(RTL871X)/phydm_rtl8188e.o\n\nendif\n\n########### HAL_RTL8192E #################################\nifeq ($(CONFIG_RTL8192E), y)\n\nRTL871X = rtl8192e\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8192es\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8192eu\nendif\n\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8192ee\nendif\nEXTRA_CFLAGS += -DCONFIG_RTL8192E\n_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8192EPwrSeq.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_xmit.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\nifeq ($(CONFIG_GSPI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nendif\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8192E_PCIE.o\nendif\n\n#hal/OUTSRC/$(RTL871X)/HalHWImg8188E_FW.o\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8192e_mac.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8192e_bb.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8192e_rf.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8192e_fw.o\\\n\t\thal/phydm/$(RTL871X)/halphyrf_8192e_ce.o\\\n\t\thal/phydm/$(RTL871X)/phydm_regconfig8192e.o\\\n\t\thal/phydm/$(RTL871X)/phydm_rtl8192e.o\n\nendif\n\n########### HAL_RTL8812A_RTL8821A #################################\n\nifneq ($(CONFIG_RTL8812A)_$(CONFIG_RTL8821A), n_n)\n\nRTL871X = rtl8812a\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8812au\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8812ae\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8812as\nendif\n\n_HAL_INTFS_FILES +=  hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8812PwrSeq.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8821APwrSeq.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_xmit.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\nifeq ($(CONFIG_GSPI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nendif\nendif\n\nifeq ($(CONFIG_RTL8812A), y)\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8812A_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8812A_PCIE.o\nendif\nendif\nifeq ($(CONFIG_RTL8821A), y)\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8821A_PCIE.o\nendif\nendif\n\nifeq ($(CONFIG_RTL8812A), y)\nEXTRA_CFLAGS += -DCONFIG_RTL8812A\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8812a_fw.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8812a_mac.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8812a_bb.o\\\n\t\thal/phydm/$(RTL871X)/halhwimg8812a_rf.o\\\n\t\thal/phydm/$(RTL871X)/halphyrf_8812a_ce.o\\\n\t\thal/phydm/$(RTL871X)/phydm_regconfig8812a.o\\\n\t\thal/phydm/$(RTL871X)/phydm_rtl8812a.o\\\n\t\thal/phydm/txbf/haltxbfjaguar.o\nendif\n\nifeq ($(CONFIG_RTL8821A), y)\n\nifeq ($(CONFIG_RTL8812A), n)\n\nRTL871X = rtl8821a\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME := 8821au\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME := 8821ae\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME := 8821as\nendif\n\nendif\n\nEXTRA_CFLAGS += -DCONFIG_RTL8821A\n_OUTSRC_FILES += hal/phydm/rtl8821a/halhwimg8821a_fw.o\\\n\t\thal/phydm/rtl8821a/halhwimg8821a_mac.o\\\n\t\thal/phydm/rtl8821a/halhwimg8821a_bb.o\\\n\t\thal/phydm/rtl8821a/halhwimg8821a_rf.o\\\n\t\thal/phydm/rtl8812a/halphyrf_8812a_ce.o\\\n\t\thal/phydm/rtl8821a/halphyrf_8821a_ce.o\\\n\t\thal/phydm/rtl8821a/phydm_regconfig8821a.o\\\n\t\thal/phydm/rtl8821a/phydm_rtl8821a.o\\\n\t\thal/phydm/rtl8821a/phydm_iqk_8821a_ce.o\\\n\t\thal/phydm/txbf/haltxbfjaguar.o\n\t\t\nendif\n\nendif\n\n########### HAL_RTL8723B #################################\nifeq ($(CONFIG_RTL8723B), y)\n\nRTL871X = rtl8723b\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8723bu\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8723be\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8723bs\nendif\n\nEXTRA_CFLAGS += -DCONFIG_RTL8723B\n\n_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8723BPwrSeq.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\n\n_HAL_INTFS_FILES +=\t\\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8723B_PCIE.o\nendif\n\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8723b_bb.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8723b_mac.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8723b_rf.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8723b_fw.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8723b_mp.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_regconfig8723b.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halphyrf_8723b_ce.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_rtl8723b.o\n\nendif\n\n########### HAL_RTL8814A #################################\nifeq ($(CONFIG_RTL8814A), y)\n## ADD NEW VHT MP HW TX MODE ##\n#EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE\n#CONFIG_MP_VHT_HW_TX_MODE = y\n##########################################\nRTL871X = rtl8814a\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8814au\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8814ae\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8814as\nendif\n\nEXTRA_CFLAGS += -DCONFIG_RTL8814A\n\n_HAL_INTFS_FILES +=  hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8814PwrSeq.o \\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_xmit.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\n\n_HAL_INTFS_FILES +=\t\\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\nifeq ($(CONFIG_GSPI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nendif\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8814A_PCIE.o\nendif\n\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8814a_bb.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8814a_mac.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8814a_rf.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8814a_fw.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_iqk_8814a.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_regconfig8814a.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halphyrf_8814a_ce.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_rtl8814a.o\\\n\t\t\t\t\t\t\t\thal/phydm/txbf/haltxbf8814a.o\n\nendif\n\n\n########### HAL_RTL8723C #################################\nifeq ($(CONFIG_RTL8723C), y)\n\nRTL871X = rtl8703b\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8723cu\nMODULE_SUB_NAME = 8703bu\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8723ce\nMODULE_SUB_NAME = 8703be\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8723cs\nMODULE_SUB_NAME = 8703bs\nendif\n\nEXTRA_CFLAGS += -DCONFIG_RTL8703B\n\n_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8703BPwrSeq.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\n\n_HAL_INTFS_FILES +=\t\\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_SUB_NAME)_recv.o\n\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8703B_USB.o\nendif\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8703B_PCIE.o\nendif\n\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8703b_bb.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8703b_mac.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8703b_rf.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8703b_fw.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_regconfig8703b.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halphyrf_8703b.o\nendif\n\n########### HAL_RTL8188F #################################\nifeq ($(CONFIG_RTL8188F), y)\n\nRTL871X = rtl8188f\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME = 8188fu\nendif\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME = 8188fe\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME = 8189fs\nendif\n\nEXTRA_CFLAGS += -DCONFIG_RTL8188F\n\n_HAL_INTFS_FILES += hal/HalPwrSeqCmd.o \\\n\t\t\t\t\thal/$(RTL871X)/Hal8188FPwrSeq.o\\\n\t\t\t\t\thal/$(RTL871X)/$(RTL871X)_sreset.o\n\n_HAL_INTFS_FILES +=\thal/$(RTL871X)/$(RTL871X)_hal_init.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_phycfg.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rf6052.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_dm.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_rxdesc.o \\\n\t\t\thal/$(RTL871X)/$(RTL871X)_cmd.o \\\n\n\n_HAL_INTFS_FILES +=\t\\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_halinit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_led.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_xmit.o \\\n\t\t\thal/$(RTL871X)/$(HCI_NAME)/rtl$(MODULE_NAME)_recv.o\n\nifeq ($(CONFIG_PCI_HCI), y)\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops_linux.o\nelse\n_HAL_INTFS_FILES += hal/$(RTL871X)/$(HCI_NAME)/$(HCI_NAME)_ops.o\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188F_USB.o\nendif\n\nifeq ($(CONFIG_SDIO_HCI), y)\n_HAL_INTFS_FILES +=hal/efuse/$(RTL871X)/HalEfuseMask8188F_SDIO.o\nendif\n\n_OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8188f_bb.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8188f_mac.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8188f_rf.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halhwimg8188f_fw.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_regconfig8188f.o\\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/halphyrf_8188f.o \\\n\t\t\t\t\t\t\t\thal/phydm/$(RTL871X)/phydm_rtl8188f.o\n\nendif\n\n########### AUTO_CFG  #################################\n\nifeq ($(CONFIG_AUTOCFG_CP), y)\n\nifeq ($(CONFIG_MULTIDRV), y)\n$(shell cp $(TopDIR)/autoconf_multidrv_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)\nelse\nifeq ($(CONFIG_RTL8188E)$(CONFIG_SDIO_HCI),yy)\n$(shell cp $(TopDIR)/autoconf_rtl8189e_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)\nelse ifeq ($(CONFIG_RTL8188F)$(CONFIG_SDIO_HCI),yy)\n$(shell cp $(TopDIR)/autoconf_rtl8189f_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)\nelse ifeq ($(CONFIG_RTL8723C),y)\n$(shell cp $(TopDIR)/autoconf_rtl8723c_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)\nelse\n$(shell cp $(TopDIR)/autoconf_$(RTL871X)_$(HCI_NAME)_linux.h $(TopDIR)/include/autoconf.h)\nendif\nendif\n\nendif\n\n########### END OF PATH  #################################\n\n\nifeq ($(CONFIG_USB_HCI), y)\nifeq ($(CONFIG_USB_AUTOSUSPEND), y)\nEXTRA_CFLAGS += -DCONFIG_USB_AUTOSUSPEND\nendif\nendif\n\nifeq ($(CONFIG_MP_INCLUDED), y)\n#MODULE_NAME := $(MODULE_NAME)_mp\nEXTRA_CFLAGS += -DCONFIG_MP_INCLUDED\nendif\n\nifeq ($(CONFIG_POWER_SAVING), y)\nEXTRA_CFLAGS += -DCONFIG_POWER_SAVING\nendif\n\nifeq ($(CONFIG_HW_PWRP_DETECTION), y)\nEXTRA_CFLAGS += -DCONFIG_HW_PWRP_DETECTION\nendif\n\nifeq ($(CONFIG_WIFI_TEST), y)\nEXTRA_CFLAGS += -DCONFIG_WIFI_TEST\nendif\n\nifeq ($(CONFIG_BT_COEXIST), y)\nEXTRA_CFLAGS += -DCONFIG_BT_COEXIST\nendif\n\nifeq ($(CONFIG_INTEL_WIDI), y)\nEXTRA_CFLAGS += -DCONFIG_INTEL_WIDI\nendif\n\nifeq ($(CONFIG_WAPI_SUPPORT), y)\nEXTRA_CFLAGS += -DCONFIG_WAPI_SUPPORT\nendif\n\n\nifeq ($(CONFIG_EFUSE_CONFIG_FILE), y)\nEXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE\n\n#EFUSE_MAP_PATH\nUSER_EFUSE_MAP_PATH ?=\nifneq ($(USER_EFUSE_MAP_PATH),)\nEXTRA_CFLAGS += -DEFUSE_MAP_PATH=\\\"$(USER_EFUSE_MAP_PATH)\\\"\nelse ifeq ($(MODULE_NAME), 8189es)\nEXTRA_CFLAGS += -DEFUSE_MAP_PATH=\\\"/system/etc/wifi/wifi_efuse_8189e.map\\\"\nelse ifeq ($(MODULE_NAME), 8723bs)\nEXTRA_CFLAGS += -DEFUSE_MAP_PATH=\\\"/system/etc/wifi/wifi_efuse_8723bs.map\\\"\nelse\nEXTRA_CFLAGS += -DEFUSE_MAP_PATH=\\\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\\\"\nendif\n\n#WIFIMAC_PATH\nUSER_WIFIMAC_PATH ?=\nifneq ($(USER_WIFIMAC_PATH),)\nEXTRA_CFLAGS += -DWIFIMAC_PATH=\\\"$(USER_WIFIMAC_PATH)\\\"\nelse\nEXTRA_CFLAGS += -DWIFIMAC_PATH=\\\"/data/wifimac.txt\\\"\nendif\n\nendif\n\nifeq ($(CONFIG_EXT_CLK), y)\nEXTRA_CFLAGS += -DCONFIG_EXT_CLK\nendif\n\nifeq ($(CONFIG_TRAFFIC_PROTECT), y)\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\nendif\n\nifeq ($(CONFIG_LOAD_PHY_PARA_FROM_FILE), y)\nEXTRA_CFLAGS += -DCONFIG_LOAD_PHY_PARA_FROM_FILE\n#EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\\\"/lib/firmware/\\\"\nEXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\\\"\\\"\nendif\n\nifeq ($(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY), y)\nEXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\nendif\n\nifeq ($(CONFIG_CALIBRATE_TX_POWER_TO_MAX), y)\nEXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_TO_MAX\nendif\n\nifeq ($(CONFIG_RTW_ADAPTIVITY_EN), disable)\nEXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=0\nelse ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), enable)\nEXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=1\nendif\n\nifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), normal)\nEXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=0\nelse ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), carrier_sense)\nEXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=1\nendif\n\nifeq ($(CONFIG_SIGNAL_SCALE_MAPPING), y)\nEXTRA_CFLAGS += -DCONFIG_SIGNAL_SCALE_MAPPING\nendif\n\nifeq ($(CONFIG_80211W), y)\nEXTRA_CFLAGS += -DCONFIG_IEEE80211W\nendif\n\nifeq ($(CONFIG_WOWLAN), y)\nEXTRA_CFLAGS += -DCONFIG_WOWLAN\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER\nendif\nendif\n\nifeq ($(CONFIG_AP_WOWLAN), y)\nEXTRA_CFLAGS += -DCONFIG_AP_WOWLAN\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER\nendif\nendif\n\nifeq ($(CONFIG_PNO_SUPPORT), y)\nEXTRA_CFLAGS += -DCONFIG_PNO_SUPPORT\nifeq ($(CONFIG_PNO_SET_DEBUG), y)\nEXTRA_CFLAGS += -DCONFIG_PNO_SET_DEBUG\nendif\nendif\n\nifeq ($(CONFIG_GPIO_WAKEUP), y)\nEXTRA_CFLAGS += -DCONFIG_GPIO_WAKEUP\nifeq ($(CONFIG_HIGH_ACTIVE), y)\nEXTRA_CFLAGS += -DHIGH_ACTIVE=1\nelse\nEXTRA_CFLAGS += -DHIGH_ACTIVE=0\nendif\nendif\n\nifneq ($(CONFIG_WAKEUP_GPIO_IDX), default)\nEXTRA_CFLAGS += -DWAKEUP_GPIO_IDX=$(CONFIG_WAKEUP_GPIO_IDX)\nendif\n\nifeq ($(CONFIG_RTW_SDIO_PM_KEEP_POWER), y)\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_RTW_SDIO_PM_KEEP_POWER\nendif\nendif\n\nifeq ($(CONFIG_REDUCE_TX_CPU_LOADING), y)\nEXTRA_CFLAGS += -DCONFIG_REDUCE_TX_CPU_LOADING\nendif\n\nifeq ($(CONFIG_BR_EXT), y)\nBR_NAME = br0\nEXTRA_CFLAGS += -DCONFIG_BR_EXT\nEXTRA_CFLAGS += '-DCONFIG_BR_EXT_BRNAME=\"'$(BR_NAME)'\"'\nendif\n\nifeq ($(CONFIG_ANTENNA_DIVERSITY), y)\nEXTRA_CFLAGS += -DCONFIG_ANTENNA_DIVERSITY\nendif\n\nifeq ($(CONFIG_TDLS), y)\nEXTRA_CFLAGS += -DCONFIG_TDLS\nendif\n\nifeq ($(CONFIG_WIFI_MONITOR), y)\nEXTRA_CFLAGS += -DCONFIG_WIFI_MONITOR\nendif\n\nifeq ($(CONFIG_MP_VHT_HW_TX_MODE), y)\nEXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE\nifeq ($(CONFIG_PLATFORM_I386_PC), y)\n## For I386 X86 ToolChain use Hardware FLOATING\nEXTRA_CFLAGS += -mhard-float\nelse\n## For ARM ToolChain use Hardware FLOATING\nEXTRA_CFLAGS += -mfloat-abi=hard\nendif\nendif\n\nifeq ($(CONFIG_APPEND_VENDOR_IE_ENABLE), y)\nEXTRA_CFLAGS += -DCONFIG_APPEND_VENDOR_IE_ENABLE\nendif\n\nEXTRA_CFLAGS += -DDM_ODM_SUPPORT_TYPE=0x04\n\nifeq ($(CONFIG_PLATFORM_I386_PC), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nSUBARCH := $(shell uname -m | sed -e s/i.86/i386/)\nARCH ?= $(SUBARCH)\nCROSS_COMPILE ?=\nKVER  ?= $(shell uname -r)\nKSRC := /lib/modules/$(KVER)/build\nMODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/\nINSTALL_PREFIX :=\nendif\n\nifeq ($(CONFIG_PLATFORM_ACTIONS_ATM702X), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ACTIONS_ATM702X\n#ARCH := arm\nARCH := $(R_ARCH)\n#CROSS_COMPILE := arm-none-linux-gnueabi-\nCROSS_COMPILE := $(R_CROSS_COMPILE)\nKVER:= 3.4.0\n#KSRC := ../../../../build/out/kernel\nKSRC := $(KERNEL_BUILD_PATH)\nMODULE_NAME :=wlan\nendif\n\n\nifeq ($(CONFIG_PLATFORM_ACTIONS_ATM705X), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n#EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC\n# default setting for Android 4.1, 4.2, 4.3, 4.4\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ACTIONS_ATM705X\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\n\n# Enable this for Android 5.0\nEXTRA_CFLAGS += -DCONFIG_RADIO_WORK\n\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\n_PLATFORM_FILES += platform/platform_arm_act_sdio.o\nendif\n\nARCH := arm\nCROSS_COMPILE := /opt/arm-2011.09/bin/arm-none-linux-gnueabi-\nKSRC := /home/android_sdk/Action-semi/705a_android_L/android/kernel\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SUN50IW1P1), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN50IW1P1\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nEXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\n\n# Enable this for Android 5.0\nEXTRA_CFLAGS += -DCONFIG_RADIO_WORK\n\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_SUN50IW1P1_sdio.o\nendif\n\nARCH := arm64\n# ===Cross compile setting for Android 5.1(64) SDK ===\nCROSS_COMPILE := /home/android_sdk/Allwinner/a64/android-51/lichee/out/sun50iw1p1/android/common/buildroot/external-toolchain/bin/aarch64-linux-gnu-\nKSRC :=/home/android_sdk/Allwinner/a64/android-51/lichee/linux-3.10/\nendif\n\nifeq ($(CONFIG_PLATFORM_TI_AM3517), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE\nCROSS_COMPILE := arm-eabi-\nKSRC := $(shell pwd)/../../../Android/kernel\nARCH := arm\nendif\n\nifeq ($(CONFIG_PLATFORM_MSTAR_TITANIA12), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_PLATFORM_MSTAR_TITANIA12\nARCH:=mips\nCROSS_COMPILE:= /usr/src/Mstar_kernel/mips-4.3/bin/mips-linux-gnu-\nKVER:= 2.6.28.9\nKSRC:= /usr/src/Mstar_kernel/2.6.28.9/\nendif\n\nifeq ($(CONFIG_PLATFORM_MSTAR), y)\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR -DCONFIG_USE_USB_BUFFER_ALLOC_TX -DCONFIG_FIX_NR_BULKIN_BUFFER -DCONFIG_PREALLOC_RX_SKB_BUFFER\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_MSTAR_HIGH\nARCH:=arm\nCROSS_COMPILE:= /usr/src/bin/arm-none-linux-gnueabi-\nKVER:= 3.1.10\nKSRC:= /usr/src/Mstar_kernel/3.1.10/\nendif\n\nifeq ($(CONFIG_PLATFORM_ANDROID_X86), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nSUBARCH := $(shell uname -m | sed -e s/i.86/i386/)\nARCH := $(SUBARCH)\nCROSS_COMPILE := /media/DATA-2/android-x86/ics-x86_20120130/prebuilt/linux-x86/toolchain/i686-unknown-linux-gnu-4.2.1/bin/i686-unknown-linux-gnu-\nKSRC := /media/DATA-2/android-x86/ics-x86_20120130/out/target/product/generic_x86/obj/kernel\nMODULE_NAME :=wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ANDROID_INTEL_X86), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ANDROID_INTEL_X86\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nEXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE\nendif\nendif\n\nifeq ($(CONFIG_PLATFORM_JB_X86), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nSUBARCH := $(shell uname -m | sed -e s/i.86/i386/)\nARCH := $(SUBARCH)\nCROSS_COMPILE := /home/android_sdk/android-x86_JB/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7/bin/i686-linux-android-\nKSRC := /home/android_sdk/android-x86_JB/out/target/product/x86/obj/kernel/\nMODULE_NAME :=wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_PXA2XX), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := arm-none-linux-gnueabi-\nKVER  := 2.6.34.1\nKSRC ?= /usr/src/linux-2.6.34.1\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_S3C2K4), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := arm-linux-\nKVER  := 2.6.24.7_$(ARCH)\nKSRC := /usr/src/kernels/linux-$(KVER)\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_S3C6K4), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := arm-none-linux-gnueabi-\nKVER  := 2.6.34.1\nKSRC ?= /usr/src/linux-2.6.34.1\nendif\n\nifeq ($(CONFIG_PLATFORM_RTD2880B), y)\nEXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN -DCONFIG_PLATFORM_RTD2880B\nARCH:=\nCROSS_COMPILE:=\nKVER:=\nKSRC:=\nendif\n\nifeq ($(CONFIG_PLATFORM_MIPS_RMI), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH:=mips\nCROSS_COMPILE:=mipsisa32r2-uclibc-\nKVER:=\nKSRC:= /root/work/kernel_realtek\nendif\n\nifeq ($(CONFIG_PLATFORM_MIPS_PLM), y)\nEXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN\nARCH:=mips\nCROSS_COMPILE:=mipsisa32r2-uclibc-\nKVER:=\nKSRC:= /root/work/kernel_realtek\nendif\n\nifeq ($(CONFIG_PLATFORM_MSTAR389), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MSTAR389\nARCH:=mips\nCROSS_COMPILE:= mips-linux-gnu-\nKVER:= 2.6.28.10\nKSRC:= /home/mstar/mstar_linux/2.6.28.9/\nendif\n\nifeq ($(CONFIG_PLATFORM_MIPS_AR9132), y)\nEXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN\nARCH := mips\nCROSS_COMPILE := mips-openwrt-linux-\nKSRC := /home/alex/test_openwrt/tmp/linux-2.6.30.9\nendif\n\nifeq ($(CONFIG_PLATFORM_DMP_PHILIPS), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM\nARCH := mips\n#CROSS_COMPILE:=/usr/local/msdk-4.3.6-mips-EL-2.6.12.6-0.9.30.3/bin/mipsel-linux-\nCROSS_COMPILE:=/usr/local/toolchain_mipsel/bin/mipsel-linux-\nKSRC ?=/usr/local/Jupiter/linux-2.6.12\nendif\n\nifeq ($(CONFIG_PLATFORM_RTK_DMP), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DRTK_DMP_PLATFORM  -DCONFIG_WIRELESS_EXT\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\n_PLATFORM_FILES += platform/platform_RTK_DMP_usb.o\nendif\nARCH:=mips\nCROSS_COMPILE:=mipsel-linux-\nKVER:=\nKSRC ?= /usr/src/DMP_Kernel/jupiter/linux-2.6.12\nendif\n\nifeq ($(CONFIG_PLATFORM_MT53XX), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MT53XX\nARCH:= arm\nCROSS_COMPILE:= arm11_mtk_le-\nKVER:= 2.6.27\nKSRC?= /proj/mtk00802/BD_Compare/BDP/Dev/BDP_V301/BDP_Linux/linux-2.6.27\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_MX51_241H), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_WISTRON_PLATFORM\nARCH := arm\nCROSS_COMPILE := /opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-\nKVER  := 2.6.31\nKSRC ?= /lib/modules/2.6.31-770-g0e46b52/source\nendif\n\nifeq ($(CONFIG_PLATFORM_FS_MX61), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := /home/share/CusEnv/FreeScale/arm-eabi-4.4.3/bin/arm-eabi-\nKSRC ?= /home/share/CusEnv/FreeScale/FS_kernel_env\nendif\n\n\n\nifeq ($(CONFIG_PLATFORM_ACTIONS_ATJ227X), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ACTIONS_ATJ227X\nARCH := mips\nCROSS_COMPILE := /home/cnsd4/project/actions/tools-2.6.27/bin/mipsel-linux-gnu-\nKVER  := 2.6.27\nKSRC := /home/cnsd4/project/actions/linux-2.6.27.28\nendif\n\nifeq ($(CONFIG_PLATFORM_TI_DM365), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_TI_DM365\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX\nEXTRA_CFLAGS += -DCONFIG_SINGLE_XMIT_BUF -DCONFIG_SINGLE_RECV_BUF\nARCH := arm\n#CROSS_COMPILE := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-\n#KSRC := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/lsp/ti-davinci/linux-dm365\nCROSS_COMPILE := /opt/montavista/pro5.0/devkit/arm/v5t_le/bin/arm-linux-\nKSRC:= /home/vivotek/lsp/DM365/kernel_platform/kernel/linux-2.6.18\nKERNELOUTPUT := ${PRODUCTDIR}/tmp\nKVER  := 2.6.18\nendif\n\nifeq ($(CONFIG_PLATFORM_MOZART), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MOZART\nARCH := arm\nCROSS_COMPILE := /home/vivotek/lsp/mozart3v2/Mozart3e_Toolchain/build_arm_nofpu/usr/bin/arm-linux-\nKVER  := $(shell uname -r)\nKSRC:= /opt/Vivotek/lsp/mozart3v2/kernel_platform/kernel/mozart_kernel-1.17\nKERNELOUTPUT := /home/pink/sample/ODM/IP8136W-VINT/tmp/kernel\nendif\n\nifeq ($(CONFIG_PLATFORM_TEGRA3_CARDHU), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\nKSRC := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/out/target/product/cardhu/obj/KERNEL\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_TEGRA4_DALMORE), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-\nKSRC := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/out/target/product/dalmore/obj/KERNEL\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_TCC8900), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Telechips/SDK_2304_20110613/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\nKSRC := /home/android_sdk/Telechips/SDK_2304_20110613/kernel\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_TCC8920), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Telechips/v12.06_r1-tcc-android-4.0.4/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\nKSRC := /home/android_sdk/Telechips/v12.06_r1-tcc-android-4.0.4/kernel\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_TCC8920_JB42), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-\nKSRC := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/kernel\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_RK2818), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS\nARCH := arm\nCROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-\nKSRC := /usr/src/release_fae_version/kernel25_A7_281x\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS\n# default setting for Android 4.1, 4.2, 4.3, 4.4\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\n# default setting for Power control\nEXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC\nEXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN\n# default setting for Special function\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-\nKSRC := /home/android_sdk/Rockchip/Rk3188/kernel\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_RK3066), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_RK3066\nEXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN\nendif\nEXTRA_CFLAGS += -fno-pic\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Rockchip/rk3066_20130607/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-\n#CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3066sdk/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-\nKSRC := /home/android_sdk/Rockchip/Rk3066sdk/kernel\nMODULE_NAME :=wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_URBETTER), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN #-DCONFIG_MINIMAL_MEMORY_USAGE\nARCH := arm\nCROSS_COMPILE := /media/DATA-1/urbetter/arm-2009q3/bin/arm-none-linux-gnueabi-\nKSRC := /media/DATA-1/urbetter/ics-urbetter/kernel\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_TI_PANDA), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN #-DCONFIG_MINIMAL_MEMORY_USAGE\nARCH := arm\n#CROSS_COMPILE := /media/DATA-1/aosp/ics-aosp_20111227/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\n#KSRC := /media/DATA-1/aosp/android-omap-panda-3.0_20120104\nCROSS_COMPILE := /media/DATA-1/android-4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-\nKSRC := /media/DATA-1/android-4.0/panda_kernel/omap\nMODULE_NAME := wlan\nendif\n\nifeq ($(CONFIG_PLATFORM_MIPS_JZ4760), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_MINIMAL_MEMORY_USAGE\nARCH ?= mips\nCROSS_COMPILE ?= /mnt/sdb5/Ingenic/Umido/mips-4.3/bin/mips-linux-gnu-\nKSRC ?= /mnt/sdb5/Ingenic/Umido/kernel\nendif\n\nifeq ($(CONFIG_PLATFORM_SZEBOOK), y)\nEXTRA_CFLAGS += -DCONFIG_BIG_ENDIAN\nARCH:=arm\nCROSS_COMPILE:=/opt/crosstool2/bin/armeb-unknown-linux-gnueabi-\nKVER:= 2.6.31.6\nKSRC:= ../code/linux-2.6.31.6-2020/\nendif\n\n#Add setting for MN10300\nifeq ($(CONFIG_PLATFORM_MN10300), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_MN10300\nARCH := mn10300\nCROSS_COMPILE := mn10300-linux-\nKVER := 2.6.32.2\nKSRC := /home/winuser/work/Plat_sLD2T_V3010/usr/src/linux-2.6.32.2\nINSTALL_PREFIX :=\nendif\n\n\nifeq ($(CONFIG_PLATFORM_ARM_SUNxI), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUNxI\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DDCONFIG_P2P_IPS\n\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n# default setting for A10-EVB mmc0\n#EXTRA_CFLAGS += -DCONFIG_WITS_EVB_V13\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_sdio.o\nendif\n\nARCH := arm\n#CROSS_COMPILE := arm-none-linux-gnueabi-\nCROSS_COMPILE=/home/android_sdk/Allwinner/a10/android-jb42/lichee-jb42/buildroot/output/external-toolchain/bin/arm-none-linux-gnueabi-\nKVER  := 3.0.8\n#KSRC:= ../lichee/linux-3.0/\nKSRC=/home/android_sdk/Allwinner/a10/android-jb42/lichee-jb42/linux-3.0\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SUN6I), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN6I\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2, 4.3, 4.4\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION\n\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n# default setting for A31-EVB mmc0\nEXTRA_CFLAGS += -DCONFIG_A31_EVB\n_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o\nendif\n\nARCH := arm\n#Android-JB42\n#CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-jb42/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-\n#KSRC :=/home/android_sdk/Allwinner/a31/android-jb42/lichee/linux-3.3\n#ifeq ($(CONFIG_USB_HCI), y)\n#MODULE_NAME := 8188eu_sw\n#endif\n# ==== Cross compile setting for kitkat-a3x_v4.5 =====\nCROSS_COMPILE := /home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-\nKSRC :=/home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/linux-3.3\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SUN7I), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN7I\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2, 4.3, 4.4\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION\n\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o\nendif\n\nARCH := arm\n# ===Cross compile setting for Android 4.2 SDK ===\n#CROSS_COMPILE := /home/android_sdk/Allwinner/a20_evb/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\n#KSRC := /home/android_sdk/Allwinner/a20_evb/lichee/linux-3.3\n# ==== Cross compile setting for Android 4.3 SDK =====\n#CROSS_COMPILE := /home/android_sdk/Allwinner/a20/android-jb43/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\n#KSRC := /home/android_sdk/Allwinner/a20/android-jb43/lichee/linux-3.4\n# ==== Cross compile setting for kitkat-a20_v4.4 =====\nCROSS_COMPILE := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\nKSRC := /home/android_sdk/Allwinner/a20/kitkat-a20_v4.4/lichee/linux-3.4\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SUN8I_W3P1), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I_W3P1\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\n\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o\nendif\n\nARCH := arm\n# ===Cross compile setting for Android 4.2 SDK ===\n#CROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-jb42/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\n#KSRC :=/home/android_sdk/Allwinner/a23/android-jb42/lichee/linux-3.4\n# ===Cross compile setting for Android 4.4 SDK ===\nCROSS_COMPILE := /home/android_sdk/Allwinner/a23/android-kk44/lichee/out/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\nKSRC :=/home/android_sdk/Allwinner/a23/android-kk44/lichee/linux-3.4\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SUN8I_W5P1), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN8I_W5P1\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\n\n# Enable this for Android 5.0\nEXTRA_CFLAGS += -DCONFIG_RADIO_WORK\n\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o\nendif\n\nARCH := arm\n# ===Cross compile setting for Android L SDK ===\nCROSS_COMPILE := /home/android_sdk/Allwinner/a33/android-L/lichee/out/sun8iw5p1/android/common/buildroot/external-toolchain/bin/arm-linux-gnueabi-\nKSRC :=/home/android_sdk/Allwinner/a33/android-L/lichee/linux-3.4\nendif\n\nifeq ($(CONFIG_PLATFORM_ACTIONS_ATV5201), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ACTIONS_ATV5201\nEXTRA_CFLAGS += -DCONFIG_SDIO_DISABLE_RXFIFO_POLLING_LOOP\nARCH := mips\nCROSS_COMPILE := mipsel-linux-gnu-\nKVER  := $(KERNEL_VER)\nKSRC:= $(CFGDIR)/../../kernel/linux-$(KERNEL_VER)\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_RTD299X), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DUSB_XMITBUF_ALIGN_SZ=1024 -DUSB_PACKET_OFFSET_SZ=0\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nifeq ($(CONFIG_ANDROID), y)\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\n# Enable this for Android 5.0\nEXTRA_CFLAGS += -DCONFIG_RADIO_WORK\nendif\n#ARCH, CROSS_COMPILE, KSRC,and  MODDESTDIR are provided by external makefile\nINSTALL_PREFIX :=\nendif\n\nifeq ($(CONFIG_PLATFORM_HISILICON), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_HISILICON\nifeq ($(SUPPORT_CONCURRENT),y)\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nendif\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nifeq ($(CROSS_COMPILE),)\n       CROSS_COMPILE = arm-hisiv200-linux-\nendif\nMODULE_NAME := rtl8192eu\nifeq ($(KSRC),)\n       KSRC := ../../../../../../kernel/linux-3.4.y\nendif\nendif\n\n# Platform setting\nifeq ($(CONFIG_PLATFORM_ARM_SPREADTRUM_6820), y)\nifeq ($(CONFIG_ANDROID_2X), y)\nEXTRA_CFLAGS += -DANDROID_2X\nendif\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD\nEXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_6820\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nifeq ($(RTL871X), rtl8188e)\nEXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\n_PLATFORM_FILES += platform/platform_sprd_sdio.o\nendif\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_SPREADTRUM_8810), y)\nifeq ($(CONFIG_ANDROID_2X), y)\nEXTRA_CFLAGS += -DANDROID_2X\nendif\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_SPRD\nEXTRA_CFLAGS += -DPLATFORM_SPREADTRUM_8810\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nifeq ($(RTL871X), rtl8188e)\nEXTRA_CFLAGS += -DSOFTAP_PS_DURATION=50\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\n_PLATFORM_FILES += platform/platform_sprd_sdio.o\nendif\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_WMT), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_WMT_sdio.o\nendif\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/WonderMedia/wm8880-android4.4/toolchain/arm_201103_gcc4.5.2/mybin/arm_1103_le-\nKSRC := /home/android_sdk/WonderMedia/wm8880-android4.4/kernel4.4/\nMODULE_NAME :=8189es_kk\nendif\n\nifeq ($(CONFIG_PLATFORM_RTK119X), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n#EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUN7I\nEXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\n#EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION\nEXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION\n\n#EXTRA_CFLAGS += -DCONFIG_#PLATFORM_OPS\nifeq ($(CONFIG_USB_HCI), y)\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\n#_PLATFORM_FILES += platform/platform_ARM_SUNxI_usb.o\nendif\nifeq ($(CONFIG_SDIO_HCI), y)\n_PLATFORM_FILES += platform/platform_ARM_SUNnI_sdio.o\nendif\n\nARCH := arm\n\n# ==== Cross compile setting for Android 4.4 SDK =====\n#CROSS_COMPILE := arm-linux-gnueabihf-\nKVER  := 3.10.24\n#KSRC :=/home/android_sdk/Allwinner/a20/android-kitkat44/lichee/linux-3.4\nCROSS_COMPILE := /home/realtek/software_phoenix/phoenix/toolchain/usr/local/arm-2013.11/bin/arm-linux-gnueabihf-\nKSRC := /home/realtek/software_phoenix/linux-kernel\nMODULE_NAME := 8192eu\n\nendif\n\nifeq ($(CONFIG_PLATFORM_NOVATEK_NT72668), y)\nEXTRA_CFLAGS += -DCONFIG_PLATFORM_NOVATEK_NT72668\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DDCONFIG_P2P_IPS\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX\nEXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX\nARCH ?= arm\nCROSS_COMPILE := arm-linux-gnueabihf-\nKVER := 3.8.0\nKSRC := /Custom/Novatek/TCL/linux-3.8_header\n#KSRC := $(KERNELDIR)\nendif\n\nifeq ($(CONFIG_PLATFORM_ARM_TCC8930_JB42), y)\nEXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN\n# default setting for Android 4.1, 4.2\nEXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE\nEXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT\nEXTRA_CFLAGS += -DCONFIG_P2P_IPS\nARCH := arm\nCROSS_COMPILE := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-\nKSRC := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/kernel\nMODULE_NAME := wlan\nendif \n\nifeq ($(CONFIG_MULTIDRV), y)\n\nifeq ($(CONFIG_SDIO_HCI), y)\nMODULE_NAME := rtw_sdio\nendif\n\nifeq ($(CONFIG_USB_HCI), y)\nMODULE_NAME := rtw_usb\nendif\n\nifeq ($(CONFIG_PCI_HCI), y)\nMODULE_NAME := rtw_pci\nendif\n\n\nendif\n\nUSER_MODULE_NAME ?=\nifneq ($(USER_MODULE_NAME),)\nMODULE_NAME := $(USER_MODULE_NAME)\nendif\n\nifneq ($(KERNELRELEASE),)\n\nrtk_core :=\tcore/rtw_cmd.o \\\n\t\tcore/rtw_security.o \\\n\t\tcore/rtw_debug.o \\\n\t\tcore/rtw_io.o \\\n\t\tcore/rtw_ioctl_query.o \\\n\t\tcore/rtw_ioctl_set.o \\\n\t\tcore/rtw_ieee80211.o \\\n\t\tcore/rtw_mlme.o \\\n\t\tcore/rtw_mlme_ext.o \\\n\t\tcore/rtw_wlan_util.o \\\n\t\tcore/rtw_vht.o \\\n\t\tcore/rtw_pwrctrl.o \\\n\t\tcore/rtw_rf.o \\\n\t\tcore/rtw_recv.o \\\n\t\tcore/rtw_sta_mgt.o \\\n\t\tcore/rtw_ap.o \\\n\t\tcore/rtw_xmit.o\t\\\n\t\tcore/rtw_p2p.o \\\n\t\tcore/rtw_tdls.o \\\n\t\tcore/rtw_br_ext.o \\\n\t\tcore/rtw_iol.o \\\n\t\tcore/rtw_sreset.o \\\n\t\tcore/rtw_btcoex.o \\\n\t\tcore/rtw_beamforming.o \\\n\t\tcore/rtw_odm.o \\\n\t\tcore/efuse/rtw_efuse.o \n\n$(MODULE_NAME)-y += $(rtk_core)\n\n$(MODULE_NAME)-$(CONFIG_INTEL_WIDI) += core/rtw_intel_widi.o\n\n$(MODULE_NAME)-$(CONFIG_WAPI_SUPPORT) += core/rtw_wapi.o\t\\\n\t\t\t\t\tcore/rtw_wapi_sms4.o\n\n$(MODULE_NAME)-y += $(_OS_INTFS_FILES)\n$(MODULE_NAME)-y += $(_HAL_INTFS_FILES)\n$(MODULE_NAME)-y += $(_OUTSRC_FILES)\n$(MODULE_NAME)-y += $(_PLATFORM_FILES)\n\n$(MODULE_NAME)-$(CONFIG_MP_INCLUDED) += core/rtw_mp.o \\\n\t\t\t\t\tcore/rtw_mp_ioctl.o\n\nifeq ($(CONFIG_RTL8723B), y)\n$(MODULE_NAME)-$(CONFIG_MP_INCLUDED)+= core/rtw_bt_mp.o\nendif\n\nobj-$(CONFIG_RTL8814AU) := $(MODULE_NAME).o\n\nelse\n\nexport CONFIG_RTL8814AU = m\n\nall: modules\n\nmodules:\n\t$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KSRC) M=$(shell pwd)  modules\n\nstrip:\n\t$(CROSS_COMPILE)strip $(MODULE_NAME).ko --strip-unneeded\n\ninstall:\n\tinstall -p -m 644 $(MODULE_NAME).ko  $(MODDESTDIR)\n\t/sbin/depmod -a ${KVER}\n\nuninstall:\n\trm -f $(MODDESTDIR)/$(MODULE_NAME).ko\n\t/sbin/depmod -a ${KVER}\n\nconfig_r:\n\t@echo \"make config\"\n\t/bin/bash script/Configure script/config.in\n\n\n.PHONY: modules clean\n\nclean:\n\tcd hal/phydm/ ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko\n\tcd hal/phydm/ ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd hal/led ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd hal ; rm -fr */*/*.mod.c */*/*.mod */*/*.o */*/.*.cmd */*/*.ko\n\tcd hal ; rm -fr */*.mod.c */*.mod */*.o */.*.cmd */*.ko\n\tcd hal ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd core/efuse ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd core ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd os_dep/linux ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd os_dep ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\tcd platform ; rm -fr *.mod.c *.mod *.o .*.cmd *.ko\n\trm -fr Module.symvers ; rm -fr Module.markers ; rm -fr modules.order\n\trm -fr *.mod.c *.mod *.o .*.cmd *.ko *~\n\trm -fr .tmp_versions\nendif\n\n"
  },
  {
    "path": "README.md",
    "content": "# rtl8814AU\nRealtek 8814AU USB WiFi driver.\n\nForked from [Diederik de Haas](https://github.com/diederikdehaas/rtl8814AU)'\nrepository which is based on version 4.3.21 of an Edimax driver for the\nEW-7833UAC device.\n\nUpdated with support for kernels >= 4.14.\n\n# DKMS support\n\nFrom your src dir\n\n````\nsudo cp -R . /usr/src/rtl8814au-4.3.21\nsudo dkms build -m rtl8814au -v 4.3.21\nsudo dkms install -m rtl8814au -v 4.3.21\n````\n\nThis should keep your 8814AU adapter working post kernel updates.\n"
  },
  {
    "path": "clean",
    "content": "#!/bin/bash\nrmmod 8192cu\nrmmod 8192ce\nrmmod 8192du\nrmmod 8192de\n"
  },
  {
    "path": "core/efuse/rtw_efuse.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_EFUSE_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#include \"../hal/efuse/efuse_mask.h\"\n\n/*------------------------Define local variable------------------------------*/\nu8\tfakeEfuseBank=0;\nu32\tfakeEfuseUsedBytes=0;\nu8\tfakeEfuseContent[EFUSE_MAX_HW_SIZE]={0};\nu8\tfakeEfuseInitMap[EFUSE_MAX_MAP_LEN]={0};\nu8\tfakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN]={0};\n\nu32\tBTEfuseUsedBytes=0;\nu8\tBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\nu8\tBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};\nu8\tBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};\n\nu32\tfakeBTEfuseUsedBytes=0;\nu8\tfakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\nu8\tfakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN]={0};\nu8\tfakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN]={0};\n\nu8 \tmaskfileBuffer[32];\n/*------------------------Define local variable------------------------------*/\n\n//------------------------------------------------------------------------------\n#define REG_EFUSE_CTRL\t\t0x0030\n#define EFUSE_CTRL\t\t\tREG_EFUSE_CTRL\t\t// E-Fuse Control.\n//------------------------------------------------------------------------------\n\nBOOLEAN\nEfuse_Read1ByteFromFakeContent(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu16\t\tOffset,\n\tIN OUT\tu8\t\t*Value\t);\nBOOLEAN\nEfuse_Read1ByteFromFakeContent(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu16\t\tOffset,\n\tIN OUT\tu8\t\t*Value\t)\n{\n\tif(Offset >= EFUSE_MAX_HW_SIZE)\n\t{\n\t\treturn _FALSE;\n\t}\n\t//DbgPrint(\"Read fake content, offset = %d\\n\", Offset);\n\tif(fakeEfuseBank == 0)\n\t\t*Value = fakeEfuseContent[Offset];\n\telse\n\t\t*Value = fakeBTEfuseContent[fakeEfuseBank-1][Offset];\n\treturn _TRUE;\n}\n\nBOOLEAN\nEfuse_Write1ByteToFakeContent(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu16\t\tOffset,\n\tIN \t\tu8\t\tValue\t);\nBOOLEAN\nEfuse_Write1ByteToFakeContent(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu16\t\tOffset,\n\tIN \t\tu8\t\tValue\t)\n{\n\tif(Offset >= EFUSE_MAX_HW_SIZE)\n\t{\n\t\treturn _FALSE;\n\t}\n\tif(fakeEfuseBank == 0)\n\t\tfakeEfuseContent[Offset] = Value;\n\telse\n\t{\n\t\tfakeBTEfuseContent[fakeEfuseBank-1][Offset] = Value;\n\t}\n\treturn _TRUE;\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tEfuse_PowerSwitch\n *\n * Overview:\tWhen we want to enable write operation, we should change to \n *\t\t\t\tpwr on state. When we stop write, we should switch to 500k mode\n *\t\t\t\tand disable LDO 2.5V.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/17/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nVOID\nEfuse_PowerSwitch(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tbWrite,\n\tIN\tu8\t\tPwrState)\n{\n\tpAdapter->HalFunc.EfusePowerSwitch(pAdapter, bWrite, PwrState);\n}\n\nVOID\nBTEfuse_PowerSwitch(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tbWrite,\n\tIN\tu8\t\tPwrState)\n{\n\tif(pAdapter->HalFunc.BTEfusePowerSwitch)\n\t\tpAdapter->HalFunc.BTEfusePowerSwitch(pAdapter, bWrite, PwrState);\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tefuse_GetCurrentSize\n *\n * Overview:\tGet current efuse size!!!\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/16/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nu16\nEfuse_GetCurrentSize(\n\tIN PADAPTER\t\tpAdapter,\n\tIN u8\t\t\tefuseType,\n\tIN BOOLEAN\t\tbPseudoTest)\n{\n\tu16 ret=0;\n\n\tret = pAdapter->HalFunc.EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest);\n\n\treturn ret;\n}\n\n/*  11/16/2008 MH Add description. Get current efuse area enabled word!!. */\nu8\nEfuse_CalculateWordCnts(IN u8\tword_en)\n{\n\tu8 word_cnts = 0;\n\tif(!(word_en & BIT(0)))\tword_cnts++; // 0 : write enable\n\tif(!(word_en & BIT(1)))\tword_cnts++;\n\tif(!(word_en & BIT(2)))\tword_cnts++;\n\tif(!(word_en & BIT(3)))\tword_cnts++;\n\treturn word_cnts;\n}\n\n//\n//\tDescription:\n//\t\tExecute E-Fuse read byte operation.\n//\t\tRefered from SD1 Richard.\n//\n//\tAssumption:\n//\t\t1. Boot from E-Fuse and successfully auto-load.\n//\t\t2. PASSIVE_LEVEL (USB interface)\n//\n//\tCreated by Roger, 2008.10.21.\n//\nVOID\nReadEFuseByte(\n\t\tPADAPTER\tAdapter,\n\t\tu16 \t\t\t_offset, \n\t\tu8 \t\t\t*pbuf, \n\t\tIN BOOLEAN\tbPseudoTest) \n{\n\tu32\tvalue32;\n\tu8\treadbyte;\n\tu16\tretry;\n\t//u32 start=rtw_get_current_time();\n\n\tif(bPseudoTest)\n\t{\n\t\tEfuse_Read1ByteFromFakeContent(Adapter, _offset, pbuf);\n\t\treturn;\n\t}\n\tif (IS_HARDWARE_TYPE_8723B(Adapter))\n\t{\n\t\t// <20130121, Kordan> For SMIC S55 EFUSE specificatoin.\n\t\t//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])\n\t\tPHY_SetMacReg(Adapter, EFUSE_TEST, BIT11, 0);\n\t}\n\t//Write Address\n\trtw_write8(Adapter, EFUSE_CTRL+1, (_offset & 0xff));  \t\t\n\treadbyte = rtw_read8(Adapter, EFUSE_CTRL+2);\n\trtw_write8(Adapter, EFUSE_CTRL+2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc));  \t\t\n\n\t//Write bit 32 0\n\treadbyte = rtw_read8(Adapter, EFUSE_CTRL+3);\t\t\n\trtw_write8(Adapter, EFUSE_CTRL+3, (readbyte & 0x7f));  \t\n\t\n\t//Check bit 32 read-ready\n\tretry = 0;\n\tvalue32 = rtw_read32(Adapter, EFUSE_CTRL);\n\t//while(!(((value32 >> 24) & 0xff) & 0x80)  && (retry<10))\n\twhile(!(((value32 >> 24) & 0xff) & 0x80)  && (retry<10000))\n\t{\n\t\tvalue32 = rtw_read32(Adapter, EFUSE_CTRL);\n\t\tretry++;\n\t}\n\n\t// 20100205 Joseph: Add delay suggested by SD1 Victor.\n\t// This fix the problem that Efuse read error in high temperature condition.\n\t// Designer says that there shall be some delay after ready bit is set, or the\n\t// result will always stay on last data we read.\n\trtw_udelay_os(50);\n\tvalue32 = rtw_read32(Adapter, EFUSE_CTRL);\n\t\n\t*pbuf = (u8)(value32 & 0xff);\n\t//DBG_871X(\"ReadEFuseByte _offset:%08u, in %d ms\\n\",_offset ,rtw_get_passing_time_ms(start));\n\t\n}\n\n//\n//\tDescription:\n//\t\t1. Execute E-Fuse read byte operation according as map offset and \n//\t\t    save to E-Fuse table.\n//\t\t2. Refered from SD1 Richard.\n//\n//\tAssumption:\n//\t\t1. Boot from E-Fuse and successfully auto-load.\n//\t\t2. PASSIVE_LEVEL (USB interface)\n//\n//\tCreated by Roger, 2008.10.21.\n//\n//\t2008/12/12 MH \t1. Reorganize code flow and reserve bytes. and add description.\n//\t\t\t\t\t2. Add efuse utilization collect.\n//\t2008/12/22 MH\tRead Efuse must check if we write section 1 data again!!! Sec1\n//\t\t\t\t\twrite addr must be after sec5.\n//\n\nVOID\nefuse_ReadEFuse(\n\tPADAPTER\tAdapter,\n\tu8\t\tefuseType,\n\tu16\t\t_offset,\n\tu16 \t\t_size_byte,\n\tu8      \t*pbuf,\n\tIN\tBOOLEAN\tbPseudoTest\n\t);\nVOID\nefuse_ReadEFuse(\n\tPADAPTER\tAdapter,\n\tu8\t\tefuseType,\n\tu16\t\t_offset,\n\tu16 \t\t_size_byte,\n\tu8      \t*pbuf,\n\tIN\tBOOLEAN\tbPseudoTest\n\t)\n{\n\tAdapter->HalFunc.ReadEFuse(Adapter, efuseType, _offset, _size_byte, pbuf, bPseudoTest);\n}\n\nVOID\nEFUSE_GetEfuseDefinition(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu8\t\tefuseType,\n\tIN\t\tu8\t\ttype,\n\tOUT\t\tvoid\t\t*pOut,\n\tIN\t\tBOOLEAN\t\tbPseudoTest\n\t)\n{\n\tpAdapter->HalFunc.EFUSEGetEfuseDefinition(pAdapter, efuseType, type, pOut, bPseudoTest);\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tEFUSE_Read1Byte\n *\n * Overview:\tCopy from WMAC fot EFUSE read 1 byte.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 09/23/2008 \tMHC\t\tCopy from WMAC.\n *\n *---------------------------------------------------------------------------*/\nu8\nEFUSE_Read1Byte(\t\n\tIN\tPADAPTER\tAdapter, \n\tIN\tu16\t\tAddress)\n{\n\tu8\tdata;\n\tu8\tBytetemp = {0x00};\n\tu8\ttemp = {0x00};\n\tu32\tk=0;\n\tu16\tcontentLen=0;\n\n\tEFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);\n\n\tif (Address < contentLen)\t//E-fuse 512Byte\n\t{\n\t\t//Write E-fuse Register address bit0~7\n\t\ttemp = Address & 0xFF;\t\n\t\trtw_write8(Adapter, EFUSE_CTRL+1, temp);\t\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);\t\n\t\t//Write E-fuse Register address bit8~9\n\t\ttemp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);\t\n\t\trtw_write8(Adapter, EFUSE_CTRL+2, temp);\t\n\n\t\t//Write 0x30[31]=0\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\n\t\ttemp = Bytetemp & 0x7F;\n\t\trtw_write8(Adapter, EFUSE_CTRL+3, temp);\n\n\t\t//Wait Write-ready (0x30[31]=1)\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\n\t\twhile(!(Bytetemp & 0x80))\n\t\t{\t\t\t\t\n\t\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\n\t\t\tk++;\n\t\t\tif(k==1000)\n\t\t\t{\n\t\t\t\tk=0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tdata=rtw_read8(Adapter, EFUSE_CTRL);\n\t\treturn data;\n\t}\n\telse\n\t\treturn 0xFF;\n\t\n}/* EFUSE_Read1Byte */\n\n/*-----------------------------------------------------------------------------\n * Function:\tEFUSE_Write1Byte\n *\n * Overview:\tCopy from WMAC fot EFUSE write 1 byte.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 09/23/2008 \tMHC\t\tCopy from WMAC.\n *\n *---------------------------------------------------------------------------*/\n\nvoid\t\nEFUSE_Write1Byte(\t\n\tIN\tPADAPTER\tAdapter, \n\tIN\tu16\t\tAddress,\n\tIN\tu8\t\tValue);\nvoid\t\nEFUSE_Write1Byte(\t\n\tIN\tPADAPTER\tAdapter, \n\tIN\tu16\t\tAddress,\n\tIN\tu8\t\tValue)\n{\n\tu8\tBytetemp = {0x00};\n\tu8\ttemp = {0x00};\n\tu32\tk=0;\n\tu16\tcontentLen=0;\n\n\t//RT_TRACE(COMP_EFUSE, DBG_LOUD, (\"Addr=%x Data =%x\\n\", Address, Value));\n\tEFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI , TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&contentLen, _FALSE);\n\n\tif( Address < contentLen)\t//E-fuse 512Byte\n\t{\n\t\trtw_write8(Adapter, EFUSE_CTRL, Value);\n\n\t\t//Write E-fuse Register address bit0~7\n\t\ttemp = Address & 0xFF;\t\n\t\trtw_write8(Adapter, EFUSE_CTRL+1, temp);\t\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+2);\t\n\t\t\n\t\t//Write E-fuse Register address bit8~9\n\t\ttemp = ((Address >> 8) & 0x03) | (Bytetemp & 0xFC);\t\n\t\trtw_write8(Adapter, EFUSE_CTRL+2, temp);\t\n\n\t\t//Write 0x30[31]=1\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\n\t\ttemp = Bytetemp | 0x80;\n\t\trtw_write8(Adapter, EFUSE_CTRL+3, temp);\n\n\t\t//Wait Write-ready (0x30[31]=0)\n\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\n\t\twhile(Bytetemp & 0x80)\n\t\t{\n\t\t\tBytetemp = rtw_read8(Adapter, EFUSE_CTRL+3);\t\t\t\n\t\t\tk++;\n\t\t\tif(k==100)\n\t\t\t{\n\t\t\t\tk=0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}/* EFUSE_Write1Byte */\n\n\n/*  11/16/2008 MH Read one byte from real Efuse. */\nu8\nefuse_OneByteRead(\n\tIN\tPADAPTER\tpAdapter, \n\tIN\tu16\t\t\taddr,\n\tIN\tu8\t\t\t*data,\n\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu32\ttmpidx = 0;\n\tu8\tbResult;\n\tu8\treadbyte;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\t//DBG_871X(\"===> EFUSE_OneByteRead(), addr = %x\\n\", addr);\n\t//DBG_871X(\"===> EFUSE_OneByteRead() start, 0x34 = 0x%X\\n\", rtw_read32(pAdapter, EFUSE_TEST));\n\n\tif(bPseudoTest)\n\t{\n\t\tbResult = Efuse_Read1ByteFromFakeContent(pAdapter, addr, data);\n\t\treturn bResult;\n\t}\n\t\n\tif(\tIS_HARDWARE_TYPE_8723B(pAdapter) ||\n\t\t(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||\n\t\t(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID))\n\t  )\n\t{\n\t\t// <20130121, Kordan> For SMIC EFUSE specificatoin.\n\t\t//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])\t\n\t\t//PHY_SetMacReg(pAdapter, 0x34, BIT11, 0);\n\t\trtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)& (~BIT11) ); \n\t}\n\n\t// -----------------e-fuse reg ctrl ---------------------------------\n\t//address\t\t\t\n\trtw_write8(pAdapter, EFUSE_CTRL+1, (u8)(addr&0xff));\t\t\n\trtw_write8(pAdapter, EFUSE_CTRL+2, ((u8)((addr>>8) &0x03) ) |\n\t(rtw_read8(pAdapter, EFUSE_CTRL+2)&0xFC ));\t\n\n\t//rtw_write8(pAdapter, EFUSE_CTRL+3,  0x72);//read cmd\t\n\t//Write bit 32 0\n\treadbyte = rtw_read8(pAdapter, EFUSE_CTRL+3);\t\t\n\trtw_write8(pAdapter, EFUSE_CTRL+3, (readbyte & 0x7f));\n\n\twhile(!(0x80 &rtw_read8(pAdapter, EFUSE_CTRL+3))&&(tmpidx<1000))\n\t{\n\t\trtw_mdelay_os(1);\n\t\ttmpidx++;\n\t}\n\tif(tmpidx<100)\n\t{\t\t\t\n\t\t*data=rtw_read8(pAdapter, EFUSE_CTRL);\t\t\n\t\tbResult = _TRUE;\n\t}\n\telse\n\t{\n\t\t*data = 0xff;\t\n\t\tbResult = _FALSE;\n\t\tDBG_871X(\"%s: [ERROR] addr=0x%x bResult=%d time out 1s !!!\\n\", __FUNCTION__, addr, bResult);\n\t\tDBG_871X(\"%s: [ERROR] EFUSE_CTRL =0x%08x !!!\\n\", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));\n\t}\n\n\treturn bResult;\n}\n\t\t\n/*  11/16/2008 MH Write one byte to reald Efuse. */\nu8\nefuse_OneByteWrite(\n\tIN\tPADAPTER\tpAdapter,  \n\tIN\tu16\t\t\taddr, \n\tIN\tu8\t\t\tdata,\n\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu8\ttmpidx = 0;\n\tu8\tbResult=_FALSE;\n\tu32 efuseValue = 0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\t//DBG_871X(\"===> EFUSE_OneByteWrite(), addr = %x data=%x\\n\", addr, data);\n\t//DBG_871X(\"===> EFUSE_OneByteWrite() start, 0x34 = 0x%X\\n\", rtw_read32(pAdapter, EFUSE_TEST));\n\n\tif(bPseudoTest)\n\t{\n\t\tbResult = Efuse_Write1ByteToFakeContent(pAdapter, addr, data);\n\t\treturn bResult;\n\t}\n\n\n\t// -----------------e-fuse reg ctrl ---------------------------------\t\n\t//address\t\t\t\n\n\t\n\tefuseValue = rtw_read32(pAdapter, EFUSE_CTRL);\n\tefuseValue |= (BIT21|BIT31);\n\tefuseValue &= ~(0x3FFFF);\n\tefuseValue |= ((addr<<8 | data) & 0x3FFFF);\n\n\t// <20130227, Kordan> 8192E MP chip A-cut had better not set 0x34[11] until B-Cut.\n\tif (\tIS_HARDWARE_TYPE_8723B(pAdapter) ||\n\t\t(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||\n\t\t(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID))\n\t\t) {\n\t\t// <20130121, Kordan> For SMIC EFUSE specificatoin.\n\t\t//0x34[11]: SW force PGMEN input of efuse to high. (for the bank selected by 0x34[9:8])\n\t\t//PHY_SetMacReg(pAdapter, 0x34, BIT11, 1);\n\t\trtw_write16(pAdapter, 0x34, rtw_read16(pAdapter,0x34)| (BIT11) );\n\t\trtw_write32(pAdapter, EFUSE_CTRL, 0x90600000|((addr<<8 | data)) );\n\t}\n\telse\n\t{\n\t\trtw_write32(pAdapter, EFUSE_CTRL, efuseValue);\n\t}\n\n\twhile((0x80 &  rtw_read8(pAdapter, EFUSE_CTRL+3)) && (tmpidx<100) ){\n\t\trtw_mdelay_os(1);\n\t\ttmpidx++;\n\t}\n\n\tif(tmpidx<100)\n\t{\n\t\tbResult = _TRUE;\n\t}\n\telse\n\t{\n\t\tbResult = _FALSE;\n\t\tDBG_871X(\"%s: [ERROR] addr=0x%x ,efuseValue=0x%x ,bResult=%d time out 1s !!! \\n\",\n\t\t\t\t\t__FUNCTION__, addr, efuseValue, bResult);\n\t\tDBG_871X(\"%s: [ERROR] EFUSE_CTRL =0x%08x !!!\\n\", __FUNCTION__, rtw_read32(pAdapter, EFUSE_CTRL));\n\t}\n\n\t// disable Efuse program enable\n\tif (\tIS_HARDWARE_TYPE_8723B(pAdapter) ||\n\t\t(IS_HARDWARE_TYPE_8192E(pAdapter) && (!IS_A_CUT(pHalData->VersionID))) ||\n\t\t(IS_VENDOR_8188E_I_CUT_SERIES(pAdapter)) || (IS_CHIP_VENDOR_SMIC(pHalData->VersionID))\n\t\t) {\n\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0);\n\t}\n\n\treturn bResult;\n}\n\nint\nEfuse_PgPacketRead(\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\tIN\tu8\t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\t*data,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tint\tret=0;\n\n\tret =  pAdapter->HalFunc.Efuse_PgPacketRead(pAdapter, offset, data, bPseudoTest);\n\n\treturn ret;\n}\n\nint \nEfuse_PgPacketWrite(IN\tPADAPTER\tpAdapter, \n\t\t\t\t\tIN\tu8 \t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\tword_en,\n\t\t\t\t\tIN\tu8\t\t\t*data,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tint ret;\n\n\tret =  pAdapter->HalFunc.Efuse_PgPacketWrite(pAdapter, offset, word_en, data, bPseudoTest);\n\n\treturn ret;\n}\n\n\nint \nEfuse_PgPacketWrite_BT(IN\tPADAPTER\tpAdapter, \n\t\t\t\t\tIN\tu8 \t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\tword_en,\n\t\t\t\t\tIN\tu8\t\t\t*data,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tint ret;\n\n\tret =  pAdapter->HalFunc.Efuse_PgPacketWrite_BT(pAdapter, offset, word_en, data, bPseudoTest);\n\n\treturn ret;\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tefuse_WordEnableDataRead\n *\n * Overview:\tRead allowed word in current efuse section data.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/16/2008 \tMHC\t\tCreate Version 0.\n * 11/21/2008 \tMHC\t\tFix Write bug when we only enable late word.\n *\n *---------------------------------------------------------------------------*/\nvoid\nefuse_WordEnableDataRead(IN\tu8\tword_en,\n\t\t\t\t\t\t\tIN\tu8\t*sourdata,\n\t\t\t\t\t\t\tIN\tu8\t*targetdata)\n{\t\n\tif (!(word_en&BIT(0)))\n\t{\n\t\ttargetdata[0] = sourdata[0];\n\t\ttargetdata[1] = sourdata[1];\n\t}\n\tif (!(word_en&BIT(1)))\n\t{\n\t\ttargetdata[2] = sourdata[2];\n\t\ttargetdata[3] = sourdata[3];\n\t}\n\tif (!(word_en&BIT(2)))\n\t{\n\t\ttargetdata[4] = sourdata[4];\n\t\ttargetdata[5] = sourdata[5];\n\t}\n\tif (!(word_en&BIT(3)))\n\t{\n\t\ttargetdata[6] = sourdata[6];\n\t\ttargetdata[7] = sourdata[7];\n\t}\n}\n\n\nu8\nEfuse_WordEnableDataWrite(\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\tIN\tu16\t\tefuse_addr,\n\t\t\t\t\t\t\tIN\tu8\t\tword_en, \n\t\t\t\t\t\t\tIN\tu8\t\t*data,\n\t\t\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu8\tret=0;\n\n\tret =  pAdapter->HalFunc.Efuse_WordEnableDataWrite(pAdapter, efuse_addr, word_en, data, bPseudoTest);\n\t\n\treturn ret;\n}\n\nstatic u8 efuse_read8(PADAPTER padapter, u16 address, u8 *value)\n{\n\treturn efuse_OneByteRead(padapter,address, value, _FALSE);\n}\n\nstatic u8 efuse_write8(PADAPTER padapter, u16 address, u8 *value)\n{\n\treturn efuse_OneByteWrite(padapter,address, *value, _FALSE);\n}\n\n/*\n * read/wirte raw efuse data\n */\nu8 rtw_efuse_access(PADAPTER padapter, u8 bWrite, u16 start_addr, u16 cnts, u8 *data)\n{\n\tint i = 0;\n\tu16\treal_content_len = 0, max_available_size = 0;\n\tu8 res = _FAIL ;\n\tu8 (*rw8)(PADAPTER, u16, u8*);\n\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_REAL_CONTENT_LEN, (PVOID)&real_content_len, _FALSE);\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\n\tif (start_addr > real_content_len)\n\t\treturn _FAIL;\n\n\tif (_TRUE == bWrite) {\n\t\tif ((start_addr + cnts) > max_available_size)\n\t\t\treturn _FAIL;\n\t\trw8 = &efuse_write8;\n\t} else\n\t\trw8 = &efuse_read8;\n\n\tEfuse_PowerSwitch(padapter, bWrite, _TRUE);\n\n\t// e-fuse one byte read / write\n\tfor (i = 0; i < cnts; i++) {\n\t\tif (start_addr >= real_content_len) {\n\t\t\tres = _FAIL;\n\t\t\tbreak;\n\t\t}\n\n\t\tres = rw8(padapter, start_addr++, data++);\n\t\tif (_FAIL == res) break;\n\t}\n\n\tEfuse_PowerSwitch(padapter, bWrite, _FALSE);\n\n\treturn res;\n}\n//------------------------------------------------------------------------------\nu16 efuse_GetMaxSize(PADAPTER padapter)\n{\n\tu16\tmax_size;\n\n\tmax_size = 0;\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE);\n\treturn max_size;\n}\n//------------------------------------------------------------------------------\nu8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size)\n{\n\tEfuse_PowerSwitch(padapter, _FALSE, _TRUE);\n\t*size = Efuse_GetCurrentSize(padapter, EFUSE_WIFI, _FALSE);\n\tEfuse_PowerSwitch(padapter, _FALSE, _FALSE);\n\n\treturn _SUCCESS;\n}\n//------------------------------------------------------------------------------\nu8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)\n{\n\tu16\tmapLen=0;\n\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\n\tif ((addr + cnts) > mapLen)\n\t\treturn _FAIL;\n\n\tEfuse_PowerSwitch(padapter, _FALSE, _TRUE);\n\n\tefuse_ReadEFuse(padapter, EFUSE_WIFI, addr, cnts, data, _FALSE);\n\n\tEfuse_PowerSwitch(padapter, _FALSE, _FALSE);\n\n\treturn _SUCCESS;\n}\n\nu8 rtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)\n{\n\tu16\tmapLen=0;\n\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\n\tif ((addr + cnts) > mapLen)\n\t\treturn _FAIL;\n\n\tEfuse_PowerSwitch(padapter, _FALSE, _TRUE);\n\n\tefuse_ReadEFuse(padapter, EFUSE_BT, addr, cnts, data, _FALSE);\n\n\tEfuse_PowerSwitch(padapter, _FALSE, _FALSE);\n\n\treturn _SUCCESS;\n}\n\nBOOLEAN rtw_file_efuse_IsMasked(\n\tPADAPTER\tpAdapter,\n\tu16\t\tOffset\n\t)\n{\n\tint r = Offset/16;\n\tint c = (Offset%16) / 2;\n\tint result = 0;\n\t\n\tif(pAdapter->registrypriv.boffefusemask)\n\t\treturn FALSE;\n\n\t//DBG_871X(\" %s ,Offset=%x r= %d , c=%d , maskfileBuffer[r]= %x \\n\",__func__,Offset,r,c,maskfileBuffer[r]);\n\tif (c < 4) // Upper double word\n\t    result = (maskfileBuffer[r] & (0x10 << c));\n\telse\n\t    result = (maskfileBuffer[r] & (0x01 << (c-4)));\n\t\n\treturn (result > 0) ? 0 : 1;\n\n}\n\n\nu8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf,u32 len)\n{\n\tchar *ptmp;\n\tchar *ptmpbuf=NULL;\n\tu32 rtStatus;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tptmpbuf = rtw_zmalloc(2048);\n\n\tif (ptmpbuf == NULL)\n\t\treturn _FALSE;\n\n\t_rtw_memset(ptmpbuf,'\\0',2048);\n\t\n\trtStatus = rtw_retrieve_from_file(filepatch, ptmpbuf, 2048);\n\n\tif( rtStatus > 100 )\n\t{\n\t\tu32 i,j;\n\t\tfor(i=0,j=0;j<len;i+=2,j++)\n\t\t{\n\t\t\tif (( ptmpbuf[i] == ' ' ) && (ptmpbuf[i+1] != '\\n' && ptmpbuf[i+1] != '\\0')) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif( (ptmpbuf[i+1] != '\\n' && ptmpbuf[i+1] != '\\0'))\n\t\t\t{\n\t\t\t\t\tbuf[j] = simple_strtoul(&ptmpbuf[i],&ptmp, 16);\n\t\t\t\t\tDBG_871X(\" i=%d,j=%d, %x \\n\",i,j,buf[j]);\n\n\t\t\t} else {\n\t\t\t\tj--;\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t} else {\n\t\tDBG_871X(\" %s ,filepatch %s , FAIL %d\\n\", __func__, filepatch, rtStatus);\n\t\treturn _FALSE;\n\t}\n\trtw_mfree(ptmpbuf, 2048);\n\tDBG_871X(\" %s ,filepatch %s , done %d\\n\", __func__, filepatch, rtStatus);\n\treturn _TRUE;\n}\n\n\nBOOLEAN \nefuse_IsMasked(\n\tPADAPTER\tpAdapter,\n\tu16\t\tOffset\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\n\t//if (bEfuseMaskOFF(pAdapter))\n\tif(pAdapter->registrypriv.boffefusemask)\n\t\treturn FALSE;\n\t\t\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n#if defined(CONFIG_RTL8188E)\n\tif (IS_HARDWARE_TYPE_8188E(pAdapter))  \n\t\treturn (IS_MASKED(8188E,_MUSB,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8812A)\n\tif (IS_HARDWARE_TYPE_8812(pAdapter))  \n\t\treturn (IS_MASKED(8812A,_MUSB,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8821A)\n\t//if (IS_HARDWARE_TYPE_8811AU(pAdapter))  \n\t//\treturn (IS_MASKED(8811A,_MUSB,Offset)) ? TRUE : FALSE;\n\tif (IS_HARDWARE_TYPE_8821(pAdapter))  \n\t\treturn (IS_MASKED(8821A,_MUSB,Offset)) ? TRUE : FALSE;\t\t\n#endif\t\t\n#if defined(CONFIG_RTL8192E)\n\tif (IS_HARDWARE_TYPE_8192E(pAdapter))  \n\t\treturn (IS_MASKED(8192E,_MUSB,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8723B)\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter))  \n\t\treturn (IS_MASKED(8723B,_MUSB,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8703B)\n\tif (IS_HARDWARE_TYPE_8703B(pAdapter))\n\t\treturn (IS_MASKED(8703B, _MUSB, Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8814A)\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\treturn (IS_MASKED(8814A, _MUSB, Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8188F)\n\tif (IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\treturn (IS_MASKED(8188F, _MUSB, Offset)) ? TRUE : FALSE;\n#endif\n#elif DEV_BUS_TYPE == RT_PCI_INTERFACE\n#if defined(CONFIG_RTL8188E)\n\tif (IS_HARDWARE_TYPE_8188E(pAdapter))  \n\t\treturn (IS_MASKED(8188E,_MPCIE,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8192E)\n   \tif (IS_HARDWARE_TYPE_8192E(pAdapter))\t\n\t\treturn (IS_MASKED(8192E,_MPCIE,Offset)) ? TRUE : FALSE;\n#endif\t\n#if defined(CONFIG_RTL8812A)\n\tif (IS_HARDWARE_TYPE_8812(pAdapter))  \n\t\treturn (IS_MASKED(8812A,_MPCIE,Offset)) ? TRUE : FALSE;\n#endif\t\n#if defined(CONFIG_RTL8821A)\n\tif (IS_HARDWARE_TYPE_8821(pAdapter))  \n\t\treturn (IS_MASKED(8821A,_MPCIE,Offset)) ? TRUE : FALSE;\n#endif\n#if defined(CONFIG_RTL8723B)\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter))  \n\t\treturn (IS_MASKED(8723B,_MPCIE,Offset)) ? TRUE : FALSE; \n#endif\n#if defined(CONFIG_RTL8814A)\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\treturn (IS_MASKED(8814A, _MPCIE, Offset)) ? TRUE : FALSE;\n#endif\n\t//else if (IS_HARDWARE_TYPE_8821B(pAdapter))  \n\t//\treturn (IS_MASKED(8821B,_MPCIE,Offset)) ? TRUE : FALSE; \n\n#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE\n#ifdef CONFIG_RTL8188E_SDIO\n\tif (IS_HARDWARE_TYPE_8188E(pAdapter))  \n\t\treturn (IS_MASKED(8188E,_MSDIO,Offset)) ? TRUE : FALSE;\n#endif\n#ifdef CONFIG_RTL8188F_SDIO\n\tif (IS_HARDWARE_TYPE_8188F(pAdapter))  \n\t\treturn (IS_MASKED(8188F, _MSDIO, Offset)) ? TRUE : FALSE;\n#endif\n#endif\n\n\treturn FALSE;\t\n}\n\n//------------------------------------------------------------------------------\nu8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)\n{\n#define RT_ASSERT_RET(expr)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif(!(expr)) {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tprintk( \"Assertion failed! %s at ......\\n\", #expr);\t\t\t\t\t\t\t\\\n\t\tprintk( \"      ......%s,%s,line=%d\\n\",__FILE__,__FUNCTION__,__LINE__);\t\\\n\t\treturn _FAIL;\t\\\n\t}\n\n\tu8\toffset, word_en;\n\tu8\t*map;\n\tu8\tnewdata[PGPKT_DATA_SIZE];\n\ts32\ti, j, idx;\n\tu8\tret = _SUCCESS;\n\tu16\tmapLen=0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\n\tif ((addr + cnts) > mapLen)\n\t\treturn _FAIL;\n\n\tRT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment\n\tRT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy\n\n\tmap = rtw_zmalloc(mapLen);\n\tif(map == NULL){\n\t\treturn _FAIL;\n\t}\n\t\n\t_rtw_memset(map, 0xFF, mapLen);\n\t\n\tret = rtw_efuse_map_read(padapter, 0, mapLen, map);\n\tif (ret == _FAIL) goto exit;\n\n\tif(padapter->registrypriv.boffefusemask==0)\n\t{\n\t\tfor (i =0; i < cnts; i++)\n\t\t{ \n\t\t\tif(padapter->registrypriv.bFileMaskEfuse==_TRUE)\n\t\t\t{\n\t\t\t\tif (rtw_file_efuse_IsMasked(padapter, addr+i))\t/*use file efuse mask. */\n\t\t\t\t\t\tdata[i] = map[addr+i];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( efuse_IsMasked(padapter, addr+i ))\n\t\t\t\t\t\tdata[i] = map[addr+i];\n\t\t\t}\n\t\t\tDBG_8192C(\"%s , data[%d] = %x, map[addr+i]= %x\\n\", __func__, i, data[i], map[addr+i]);\n\t\t}\n\t}\n\tEfuse_PowerSwitch(padapter, _TRUE, _TRUE);\n\n\tidx = 0;\n\toffset = (addr >> 3);\n\twhile (idx < cnts)\n\t{\n\t\tword_en = 0xF;\n\t\tj = (addr + idx) & 0x7;\n\t\t_rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);\n\t\tfor (i = j; i<PGPKT_DATA_SIZE && idx < cnts; i++, idx++)\n\t\t{\n\t\t\tif (data[idx] != map[addr + idx])\n\t\t\t{\n\t\t\t\tword_en &= ~BIT(i >> 1);\n\t\t\t\tnewdata[i] = data[idx];\n#ifdef CONFIG_RTL8723B\t\t\t\t\t\n\t\t\t\t if( addr + idx == 0x8)\n\t\t\t\t {\t\n\t\t\t\t\tif (IS_C_CUT(pHalData->VersionID) || IS_B_CUT(pHalData->VersionID))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pHalData->adjuseVoltageVal == 6)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnewdata[i] = map[addr + idx];\n\t\t\t\t\t\t\t \tDBG_8192C(\" %s ,\\n adjuseVoltageVal = %d ,newdata[%d] = %x \\n\",__func__,pHalData->adjuseVoltageVal,i,newdata[i]);\t \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t  }\n#endif\n\t\t\t}\n\t\t}\n\n\t\tif (word_en != 0xF) {\n\t\t\tret = Efuse_PgPacketWrite(padapter, offset, word_en, newdata, _FALSE);\n\t\t\tDBG_871X(\"offset=%x \\n\",offset);\n\t\t\tDBG_871X(\"word_en=%x \\n\",word_en);\n\n\t\t\tfor(i=0;i<PGPKT_DATA_SIZE;i++)\n\t\t\t{\n\t\t\t\tDBG_871X(\"data=%x \\t\",newdata[i]);\n\t\t\t}\n\t\t\tif (ret == _FAIL) break;\n\t\t}\n\n\t\toffset++;\n\t}\n\n\tEfuse_PowerSwitch(padapter, _TRUE, _FALSE);\n\nexit:\n\n\trtw_mfree(map, mapLen);\n\n\treturn ret;\n}\n\nu8 rtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)\n{\n\tu8\tret = _SUCCESS;\n\tu16\tmapLen = 0, i = 0;\n\t\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\t\n\tret = rtw_efuse_map_read(padapter, addr, cnts , data);\n\n\tif (padapter->registrypriv.boffefusemask == 0) {\n\n\t\t\tfor (i = 0; i < cnts; i++) { \n\t\t\t\tif (padapter->registrypriv.bFileMaskEfuse == _TRUE) {\n\t\t\t\t\tif (rtw_file_efuse_IsMasked(padapter, addr+i)) /*use file efuse mask.*/ \n\t\t\t\t\t\t\tdata[i] = 0xff;\n\t\t\t\t} else {\n\t\t\t\t\t/*DBG_8192C(\" %s , data[%d] = %x\\n\", __func__, i, data[i]);*/\n\t\t\t\t\tif (efuse_IsMasked(padapter, addr+i)) {\n\t\t\t\t\t\tdata[i] = 0xff;\n\t\t\t\t\t\t/*DBG_8192C(\" %s ,mask data[%d] = %x\\n\", __func__, i, data[i]);*/\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t}\n\treturn ret;\n\n}\n\nu8 rtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data)\n{\n#define RT_ASSERT_RET(expr)\t\t\t\t\t\t\t\t\t\t\t\t\\\n\tif(!(expr)) {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tprintk( \"Assertion failed! %s at ......\\n\", #expr);\t\t\t\t\t\t\t\\\n\t\tprintk( \"      ......%s,%s,line=%d\\n\",__FILE__,__FUNCTION__,__LINE__);\t\\\n\t\treturn _FAIL;\t\\\n\t}\n\n\tu8\toffset, word_en;\n\tu8\t*map;\n\tu8\tnewdata[PGPKT_DATA_SIZE];\n\ts32\ti=0, j=0, idx;\n\tu8\tret = _SUCCESS;\n\tu16\tmapLen=0;\n\n\tEFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\n\tif ((addr + cnts) > mapLen)\n\t\treturn _FAIL;\n\n\tRT_ASSERT_RET(PGPKT_DATA_SIZE == 8); // have to be 8 byte alignment\n\tRT_ASSERT_RET((mapLen & 0x7) == 0); // have to be PGPKT_DATA_SIZE alignment for memcpy\n\n\tmap = rtw_zmalloc(mapLen);\n\tif(map == NULL){\n\t\treturn _FAIL;\n\t}\n\n\tret = rtw_BT_efuse_map_read(padapter, 0, mapLen, map);\n\tif (ret == _FAIL) goto exit;\n\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\tfor (i=0; i<1024; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF\n\t{\n\t\t\tDBG_871X(\"0x%03x\\t\", i);\n\t\t\tfor (j=0; j<8; j++) {\n\t\t\t\tDBG_871X(\"%02X \", map[i+j]);\n\t\t\t}\n\t\t\tDBG_871X(\"\\t\");\n\t\t\tfor (; j<16; j++) {\n\t\t\t\tDBG_871X(\"%02X \", map[i+j]);\n\t\t\t}\n\t\t\tDBG_871X(\"\\n\");\n\t}\n\tDBG_871X(\"\\n\");\n\tEfuse_PowerSwitch(padapter, _TRUE, _TRUE);\n\n\tidx = 0;\n\toffset = (addr >> 3);\n\twhile (idx < cnts)\n\t{\n\t\tword_en = 0xF;\n\t\tj = (addr + idx) & 0x7;\n\t\t_rtw_memcpy(newdata, &map[offset << 3], PGPKT_DATA_SIZE);\n\t\tfor (i = j; i<PGPKT_DATA_SIZE && idx < cnts; i++, idx++)\n\t\t{\n\t\t\tif (data[idx] != map[addr + idx])\n\t\t\t{\n\t\t\t\tword_en &= ~BIT(i >> 1);\n\t\t\t\tnewdata[i] = data[idx];\n\t\t\t}\n\t\t}\n\n\t\tif (word_en != 0xF) {\n\t\t\tDBG_871X(\"offset=%x \\n\",offset);\n\t\t\tDBG_871X(\"word_en=%x \\n\",word_en);\n\t\t\tDBG_871X(\"%s: data=\", __FUNCTION__);\n\t\t\tfor(i=0;i<PGPKT_DATA_SIZE;i++)\n\t\t\t{\n\t\t\t\tDBG_871X(\"0x%02X \", newdata[i]);\n\t\t\t}\n\t\t\tDBG_871X(\"\\n\");\n\t\t\tret = Efuse_PgPacketWrite_BT(padapter, offset, word_en, newdata, _FALSE);\n\t\t\tif (ret == _FAIL) break;\n\t\t}\n\n\t\toffset++;\n\t}\n\n\tEfuse_PowerSwitch(padapter, _TRUE, _FALSE);\n\nexit:\n\n\trtw_mfree(map, mapLen);\n\n\treturn ret;\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tEfuse_ReadAllMap\n *\n * Overview:\tRead All Efuse content\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/11/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nVOID \nEfuse_ReadAllMap(\n\tIN\t\tPADAPTER\tpAdapter, \n\tIN\t\tu8\t\tefuseType,\n\tIN OUT\tu8\t\t*Efuse,\n\tIN\t\tBOOLEAN\t\tbPseudoTest);\nVOID \nEfuse_ReadAllMap(\n\tIN\t\tPADAPTER\tpAdapter, \n\tIN\t\tu8\t\tefuseType,\n\tIN OUT\tu8\t\t*Efuse,\n\tIN\t\tBOOLEAN\t\tbPseudoTest)\n{\n\tu16\tmapLen=0;\n\n\tEfuse_PowerSwitch(pAdapter,_FALSE, _TRUE);\n\n\tEFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);\n\n\tefuse_ReadEFuse(pAdapter, efuseType, 0, mapLen, Efuse, bPseudoTest);\n\n\tEfuse_PowerSwitch(pAdapter,_FALSE, _FALSE);\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tefuse_ShadowRead1Byte\n *\t\t\tefuse_ShadowRead2Byte\n *\t\t\tefuse_ShadowRead4Byte\n *\n * Overview:\tRead from efuse init map by one/two/four bytes !!!!!\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/12/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nstatic VOID\nefuse_ShadowRead1Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN OUT\tu8\t\t*Value)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\n\t*Value = pHalData->efuse_eeprom_data[Offset];\n\n}\t// EFUSE_ShadowRead1Byte\n\n//---------------Read Two Bytes\nstatic VOID\nefuse_ShadowRead2Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN OUT\tu16\t\t*Value)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\n\t*Value = pHalData->efuse_eeprom_data[Offset];\n\t*Value |= pHalData->efuse_eeprom_data[Offset+1]<<8;\n\n}\t// EFUSE_ShadowRead2Byte\n\n//---------------Read Four Bytes\nstatic VOID\nefuse_ShadowRead4Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN OUT\tu32\t\t*Value)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\n\t*Value = pHalData->efuse_eeprom_data[Offset];\n\t*Value |= pHalData->efuse_eeprom_data[Offset+1]<<8;\n\t*Value |= pHalData->efuse_eeprom_data[Offset+2]<<16;\n\t*Value |= pHalData->efuse_eeprom_data[Offset+3]<<24;\n\n}\t// efuse_ShadowRead4Byte\n\n\n/*-----------------------------------------------------------------------------\n * Function:\tefuse_ShadowWrite1Byte\n *\t\t\tefuse_ShadowWrite2Byte\n *\t\t\tefuse_ShadowWrite4Byte\n *\n * Overview:\tWrite efuse modify map by one/two/four byte.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/12/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\n#ifdef PLATFORM\nstatic VOID\nefuse_ShadowWrite1Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN \tu8\t\tValue);\n#endif //PLATFORM\nstatic VOID\nefuse_ShadowWrite1Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN \tu8\t\tValue)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\n\tpHalData->efuse_eeprom_data[Offset] = Value;\n\n}\t// efuse_ShadowWrite1Byte\n\n//---------------Write Two Bytes\nstatic VOID\nefuse_ShadowWrite2Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN \tu16\t\tValue)\n{\n\t\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\t\n\n\tpHalData->efuse_eeprom_data[Offset] = Value&0x00FF;\n\tpHalData->efuse_eeprom_data[Offset+1] = Value>>8;\n\n}\t// efuse_ShadowWrite1Byte\n\n//---------------Write Four Bytes\nstatic VOID\nefuse_ShadowWrite4Byte(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu16\t\tOffset,\n\tIN\tu32\t\tValue)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\n\tpHalData->efuse_eeprom_data[Offset] = (u8)(Value&0x000000FF);\n\tpHalData->efuse_eeprom_data[Offset+1] = (u8)((Value>>8)&0x0000FF);\n\tpHalData->efuse_eeprom_data[Offset+2] = (u8)((Value>>16)&0x00FF);\n\tpHalData->efuse_eeprom_data[Offset+3] = (u8)((Value>>24)&0xFF);\n\n}\t// efuse_ShadowWrite1Byte\n\n/*-----------------------------------------------------------------------------\n * Function:\tEFUSE_ShadowMapUpdate\n *\n * Overview:\tTransfer current EFUSE content to shadow init and modify map.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/13/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nvoid EFUSE_ShadowMapUpdate(\n\tIN PADAPTER\tpAdapter,\n\tIN u8\t\tefuseType,\n\tIN BOOLEAN\tbPseudoTest)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);\n\tu16\tmapLen=0;\n\n\tEFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, bPseudoTest);\n\n\tif (pHalData->bautoload_fail_flag == _TRUE)\n\t{\n\t\t_rtw_memset(pHalData->efuse_eeprom_data, 0xFF, mapLen);\n\t}\n\telse\n\t{\n\t\t#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\t\t\t\n\t\tif(_SUCCESS != retriveAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data)) {\n\t\t#endif\n\t\t\n\t\tEfuse_ReadAllMap(pAdapter, efuseType, pHalData->efuse_eeprom_data, bPseudoTest);\n\t\t\n\t\t#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\n\t\t\tstoreAdaptorInfoFile(pAdapter->registrypriv.adaptor_info_caching_file_path, pHalData->efuse_eeprom_data);\n\t\t}\n\t\t#endif\n\t}\n\n\t//PlatformMoveMemory((PVOID)&pHalData->EfuseMap[EFUSE_MODIFY_MAP][0], \n\t//(PVOID)&pHalData->EfuseMap[EFUSE_INIT_MAP][0], mapLen);\n}// EFUSE_ShadowMapUpdate\n\n\n/*-----------------------------------------------------------------------------\n * Function:\tEFUSE_ShadowRead\n *\n * Overview:\tRead from efuse init map !!!!!\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/12/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nvoid\nEFUSE_ShadowRead(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu8\t\tType,\n\tIN\t\tu16\t\tOffset,\n\tIN OUT\tu32\t\t*Value\t)\n{\n\tif (Type == 1)\n\t\tefuse_ShadowRead1Byte(pAdapter, Offset, (u8 *)Value);\n\telse if (Type == 2)\n\t\tefuse_ShadowRead2Byte(pAdapter, Offset, (u16 *)Value);\n\telse if (Type == 4)\n\t\tefuse_ShadowRead4Byte(pAdapter, Offset, (u32 *)Value);\n\t\n}\t// EFUSE_ShadowRead\n\n/*-----------------------------------------------------------------------------\n * Function:\tEFUSE_ShadowWrite\n *\n * Overview:\tWrite efuse modify map for later update operation to use!!!!!\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/12/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nVOID\nEFUSE_ShadowWrite(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tType,\n\tIN\tu16\t\tOffset,\n\tIN OUT\tu32\t\tValue);\nVOID\nEFUSE_ShadowWrite(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tType,\n\tIN\tu16\t\tOffset,\n\tIN OUT\tu32\t\tValue)\n{\n#if (MP_DRIVER == 0)\n\treturn;\n#endif\n\tif ( pAdapter->registrypriv.mp_mode == 0)\n\t\treturn;\n\n\n\tif (Type == 1)\n\t\tefuse_ShadowWrite1Byte(pAdapter, Offset, (u8)Value);\n\telse if (Type == 2)\n\t\tefuse_ShadowWrite2Byte(pAdapter, Offset, (u16)Value);\n\telse if (Type == 4)\n\t\tefuse_ShadowWrite4Byte(pAdapter, Offset, (u32)Value);\n\n}\t// EFUSE_ShadowWrite\n\nVOID\nEfuse_InitSomeVar(\n\tIN\t\tPADAPTER\tpAdapter\n\t);\nVOID\nEfuse_InitSomeVar(\n\tIN\t\tPADAPTER\tpAdapter\n\t)\n{\n\tu8 i;\n\t\n\t_rtw_memset((PVOID)&fakeEfuseContent[0], 0xff, EFUSE_MAX_HW_SIZE);\n\t_rtw_memset((PVOID)&fakeEfuseInitMap[0], 0xff, EFUSE_MAX_MAP_LEN);\n\t_rtw_memset((PVOID)&fakeEfuseModifiedMap[0], 0xff, EFUSE_MAX_MAP_LEN);\n\n\tfor(i=0; i<EFUSE_MAX_BT_BANK; i++)\n\t{\n\t\t_rtw_memset((PVOID)&BTEfuseContent[i][0], EFUSE_MAX_HW_SIZE, 0xff);\n\t}\n\t_rtw_memset((PVOID)&BTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);\n\t_rtw_memset((PVOID)&BTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);\n\n\tfor(i=0; i<EFUSE_MAX_BT_BANK; i++)\n\t{\n\t\t_rtw_memset((PVOID)&fakeBTEfuseContent[i][0], 0xff, EFUSE_MAX_HW_SIZE);\n\t}\n\t_rtw_memset((PVOID)&fakeBTEfuseInitMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);\n\t_rtw_memset((PVOID)&fakeBTEfuseModifiedMap[0], 0xff, EFUSE_BT_MAX_MAP_LEN);\n}\n\n#ifdef PLATFORM_LINUX\n#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\n//#include <rtw_eeprom.h>\n\n int isAdaptorInfoFileValid(void)\n{\n\treturn _TRUE;\n}\n\nint storeAdaptorInfoFile(char *path, u8* efuse_data)\n{\n\tint ret =_SUCCESS;\n\n\tif(path && efuse_data) {\n\t\tret = rtw_store_to_file(path, efuse_data, EEPROM_MAX_SIZE_512);\n\t\tif(ret == EEPROM_MAX_SIZE)\n\t\t\tret = _SUCCESS;\n\t\telse\n\t\t\tret = _FAIL;\n\t} else {\n\t\tDBG_871X(\"%s NULL pointer\\n\",__FUNCTION__);\n\t\tret =  _FAIL;\n\t}\n\treturn ret;\n}\n\nint retriveAdaptorInfoFile(char *path, u8* efuse_data)\n{\n\tint ret = _SUCCESS;\n\tmm_segment_t oldfs;\n\tstruct file *fp;\n\t\n\tif(path && efuse_data) {\n\n\t\tret = rtw_retrieve_from_file(path, efuse_data, EEPROM_MAX_SIZE);\n\t\t\n\t\tif(ret == EEPROM_MAX_SIZE)\n\t\t\tret = _SUCCESS;\n\t\telse\n\t\t\tret = _FAIL;\n\n\t\t#if 0\n\t\tif(isAdaptorInfoFileValid()) {\t\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn _FAIL;\n\t\t}\n\t\t#endif\n\t\t\n\t} else {\n\t\tDBG_871X(\"%s NULL pointer\\n\",__FUNCTION__);\n\t\tret = _FAIL;\n\t}\n\treturn ret;\n}\n#endif /* CONFIG_ADAPTOR_INFO_CACHING_FILE */\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\nu32 rtw_read_efuse_from_file(const char *path, u8 *buf)\n{\n\tu32 i;\n\tu8 temp[3];\n\tu32 ret = _FAIL;\n\n\tstruct file *fp;\n\tmm_segment_t fs;\n\tloff_t pos = 0;\n\n\tfp = filp_open(path, O_RDONLY, 0);\n\tif (fp == NULL || IS_ERR(fp)) {\n\t\tif (fp != NULL)\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s open %s fail, err:%ld\\n\"\n\t\t\t\t, __func__, path, PTR_ERR(fp));\n\t\telse\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s open %s fail, fp is NULL\\n\"\n\t\t\t\t, __func__, path);\n\n\t\tgoto exit;\n\t}\n\n\ttemp[2] = 0; /* add end of string '\\0' */\n\n\tfs = get_fs();\n\tset_fs(KERNEL_DS);\n\n\tfor (i = 0 ; i < HWSET_MAX_SIZE ; i++) {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))\n\t\tkernel_read(fp, temp, 2, &pos);\n#else\n\t\tvfs_read(fp, temp, 2, &pos);\n#endif\n\t\tif (sscanf(temp, \"%hhx\", &buf[i]) != 1) {\n\t\t\tif (0)\n\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s sscanf fail\\n\", __func__);\n\t\t\tbuf[i] = 0xFF;\n\t\t}\n\t\tif ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {\n\t\t\t/* Filter the lates space char. */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))\n\t\t\tkernel_read(fp, temp, 1, &pos);\n#else\n\t\t\tvfs_read(fp, temp, 1, &pos);\n#endif\n\t\t\tif (strchr(temp, ' ') == NULL) {\n\t\t\t\tpos--;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))\n\t\t\t\tkernel_read(fp, temp, 2, &pos);\n#else\n\t\t\t\tvfs_read(fp, temp, 2, &pos);\n#endif\n\t\t\t}\n\t\t} else {\n\t\t\tpos += 1; /* Filter the space character */\n\t\t}\n\t}\n\n\tset_fs(fs);\n\n\tDBG_871X_LEVEL(_drv_always_, \"efuse file: %s\\n\", path);\n#ifdef CONFIG_DEBUG\n\tfor (i = 0; i < HWSET_MAX_SIZE; i++) {\n\t\tif (i % 16 == 0)\n\t\t\tDBG_871X_SEL_NL(RTW_DBGDUMP, \"0x%03x: \", i);\n\n\t\tDBG_871X_SEL(RTW_DBGDUMP, \"%02X%s\"\n\t\t\t, buf[i]\n\t\t\t, ((i + 1) % 16 == 0) ? \"\\n\" : (((i + 1) % 8 == 0) ? \"    \" : \" \")\n\t\t);\n\t}\n\tDBG_871X_SEL(RTW_DBGDUMP, \"\\n\");\n#endif\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nu32 rtw_read_macaddr_from_file(const char *path, u8 *buf)\n{\n\tstruct file *fp;\n\tmm_segment_t fs;\n\tloff_t pos = 0;\n\n\tu8 source_addr[18];\n\tu8 *head, *end;\n\tint i;\n\tu32 ret = _FAIL;\n\n\t_rtw_memset(source_addr, 0, 18);\n\n\tfp = filp_open(path, O_RDONLY, 0);\n\tif (fp == NULL || IS_ERR(fp)) {\n\t\tif (fp != NULL)\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s open %s fail, err:%ld\\n\"\n\t\t\t\t, __func__, path, PTR_ERR(fp));\n\t\telse\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s open %s fail, fp is NULL\\n\"\n\t\t\t\t, __func__, path);\n\n\t\tgoto exit;\n\t}\n\n\tfs = get_fs();\n\tset_fs(KERNEL_DS);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))\n\tkernel_read(fp, source_addr, 18, &pos);\n#else\n\tvfs_read(fp, source_addr, 18, &pos);\n#endif\n\tsource_addr[17] = ':';\n\n\thead = end = source_addr;\n\tfor (i = 0; i < ETH_ALEN; i++) {\n\t\twhile (end && (*end != ':'))\n\t\t\tend++;\n\n\t\tif (end && (*end == ':'))\n\t\t\t*end = '\\0';\n\n\t\tif (sscanf(head, \"%hhx\", &buf[i]) != 1) {\n\t\t\tif (0)\n\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s sscanf fail\\n\", __func__);\n\t\t\tbuf[i] = 0xFF;\n\t\t}\n\n\t\tif (end) {\n\t\t\tend++;\n\t\t\thead = end;\n\t\t}\n\t}\n\n\tset_fs(fs);\n\n\tDBG_871X_LEVEL(_drv_always_, \"wifi_mac file: %s\\n\", path);\n#ifdef CONFIG_DEBUG\n\tDBG_871X(MAC_FMT\"\\n\", MAC_ARG(buf));\n#endif\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n#endif /* CONFIG_EFUSE_CONFIG_FILE */\n\n#endif /* PLATFORM_LINUX */\n\n"
  },
  {
    "path": "core/rtw_ap.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_AP_C_\n\n#include <drv_types.h>\n\n\n#ifdef CONFIG_AP_MODE\n\nextern unsigned char\tRTW_WPA_OUI[];\nextern unsigned char \tWMM_OUI[];\nextern unsigned char\tWPS_OUI[];\nextern unsigned char\tP2P_OUI[];\nextern unsigned char\tWFD_OUI[];\n\nvoid init_mlme_ap_info(_adapter *padapter)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\t\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t\n\n\t_rtw_spinlock_init(&pmlmepriv->bcn_update_lock);\t\n\n\t//for ACL \n\t_rtw_init_queue(&pacl_list->acl_node_q);\n\n\t//pmlmeext->bstart_bss = _FALSE;\n\n\tstart_ap_mode(padapter);\n}\n\nvoid free_mlme_ap_info(_adapter *padapter)\n{\n\t_irqL irqL;\n\tstruct sta_info *psta=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//stop_ap_mode(padapter);\n\n\tpmlmepriv->update_bcn = _FALSE;\n\tpmlmeext->bstart_bss = _FALSE;\t\n\t\n\trtw_sta_flush(padapter, _TRUE);\n\n\tpmlmeinfo->state = _HW_STATE_NOLINK_;\n\n\t//free_assoc_sta_resources\n\trtw_free_all_stainfo(padapter);\n\n\t//free bc/mc sta_info\n\tpsta = rtw_get_bcmc_stainfo(padapter);\t\n\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\trtw_free_stainfo(padapter, psta);\n\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\n\n\t_rtw_spinlock_free(&pmlmepriv->bcn_update_lock);\n\t\n}\n\nstatic void update_BCNTIM(_adapter *padapter)\n{\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network);\n\tunsigned char *pie = pnetwork_mlmeext->IEs;\n\n/*\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\t//update TIM IE\n\t//if(pstapriv->tim_bitmap)\n*/\n\tif (_TRUE) {\n\t\tu8 *p, *dst_ie, *premainder_ie = NULL, *pbackup_remainder_ie = NULL;\n\t\tu16 tim_bitmap_le;\n\t\tuint offset, tmp_len, tim_ielen, tim_ie_offset, remainder_ielen;\t\n\t\n\t\ttim_bitmap_le = cpu_to_le16(pstapriv->tim_bitmap);\n\n\t\tp = rtw_get_ie(pie + _FIXED_IE_LENGTH_, _TIM_IE_, &tim_ielen, pnetwork_mlmeext->IELength - _FIXED_IE_LENGTH_);\n\t\tif (p != NULL && tim_ielen > 0) {\n\t\t\ttim_ielen += 2;\n\t\t\t\n\t\t\tpremainder_ie = p + tim_ielen;\n\n\t\t\ttim_ie_offset = (sint)(p -pie);\n\t\t\t\n\t\t\tremainder_ielen = pnetwork_mlmeext->IELength - tim_ie_offset - tim_ielen;\n\n\t\t\t/*append TIM IE from dst_ie offset*/\n\t\t\tdst_ie = p;\n\t\t} else {\n\t\t\ttim_ielen = 0;\n\n\t\t\t/*calculate head_len*/\n\t\t\toffset = _FIXED_IE_LENGTH_;\n\n\t\t\t/* get ssid_ie len */\n\t\t\tp = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SSID_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));\n\t\t\tif (p != NULL)\n\t\t\t\toffset += tmp_len+2;\n\n\t\t\t/*get supported rates len*/\n\t\t\tp = rtw_get_ie(pie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &tmp_len, (pnetwork_mlmeext->IELength - _BEACON_IE_OFFSET_));\t\n\t\t\tif (p !=  NULL) \n\t\t\t{\t\t\t\n\t\t\t\toffset += tmp_len+2;\n\t\t\t}\n\n\t\t\t/*DS Parameter Set IE, len=3*/\n\t\t\toffset += 3;\n\n\t\t\tpremainder_ie = pie + offset;\n\n\t\t\tremainder_ielen = pnetwork_mlmeext->IELength - offset - tim_ielen;\t\n\n\t\t\t/*append TIM IE from offset*/\n\t\t\tdst_ie = pie + offset;\n\t\t\t\n\t\t}\n\t\t\n\t\tif (remainder_ielen > 0) {\n\t\t\tpbackup_remainder_ie = rtw_malloc(remainder_ielen);\n\t\t\tif(pbackup_remainder_ie && premainder_ie)\n\t\t\t\t_rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);\n\t\t}\t\t\n\t\t\n\t\t*dst_ie++=_TIM_IE_;\n\n\t\tif ((pstapriv->tim_bitmap&0xff00) && (pstapriv->tim_bitmap&0x00fe))\t\t\t\n\t\t\ttim_ielen = 5;\n\t\telse\n\t\t\ttim_ielen = 4;\n\n\t\t*dst_ie++ = tim_ielen;\n\t\t\n\t\t*dst_ie++ = 0;/*DTIM count*/\n\t\t*dst_ie++ = 1;/*DTIM period*/\n\t\t\n\t\tif (pstapriv->tim_bitmap & BIT(0))/*for bc/mc frames*/\n\t\t\t*dst_ie++ = BIT(0);/*bitmap ctrl */\n\t\telse\n\t\t\t*dst_ie++ = 0;\n\n\t\tif (tim_ielen == 4) {\n\t\t\tu8 pvb = 0;\n\t\t\t\n\t\t\tif (pstapriv->tim_bitmap & 0x00fe)\n\t\t\t\tpvb = (u8)tim_bitmap_le;\n\t\t\telse if (pstapriv->tim_bitmap & 0xff00)\t\t\t\n\t\t\t\tpvb = (u8)(tim_bitmap_le >> 8);\n\t\t\telse\n\t\t\t\tpvb = (u8)tim_bitmap_le;\n\n\t\t\t*dst_ie++ = pvb;\n\t\t\t\n\t\t} else if (tim_ielen == 5) {\n\t\t\t_rtw_memcpy(dst_ie, &tim_bitmap_le, 2);\n\t\t\tdst_ie += 2;\t\t\t\t\n\t\t}\t\n\t\t\n\t\t/*copy remainder IE*/\n\t\tif (pbackup_remainder_ie) {\n\t\t\t_rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);\n\n\t\t\trtw_mfree(pbackup_remainder_ie, remainder_ielen);\n\t\t}\t\n\n\t\toffset =  (uint)(dst_ie - pie);\n\t\tpnetwork_mlmeext->IELength = offset + remainder_ielen;\n\t\n\t}\n}\n\nvoid rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len)\n{\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8\tbmatch = _FALSE;\n\tu8\t*pie = pnetwork->IEs;\n\tu8\t*p=NULL, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;\n\tu32\ti, offset, ielen, ie_offset, remainder_ielen = 0;\n\n\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < pnetwork->IELength;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);\n\n\t\tif (pIE->ElementID > index)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\telse if(pIE->ElementID == index) // already exist the same IE\n\t\t{\n\t\t\tp = (u8 *)pIE;\n\t\t\tielen = pIE->Length;\n\t\t\tbmatch = _TRUE;\n\t\t\tbreak;\n\t\t}\n\n\t\tp = (u8 *)pIE;\n\t\tielen = pIE->Length;\n\t\ti += (pIE->Length + 2);\n\t}\n\n\tif (p != NULL && ielen>0)\n\t{\n\t\tielen += 2;\n\t\t\n\t\tpremainder_ie = p+ielen;\n\n\t\tie_offset = (sint)(p -pie);\n\t\t\n\t\tremainder_ielen = pnetwork->IELength - ie_offset - ielen;\n\n\t\tif(bmatch)\n\t\t\tdst_ie = p;\n\t\telse\n\t\t\tdst_ie = (p+ielen);\n\t}\n\n\tif(dst_ie == NULL)\n\t\treturn;\n\n\tif(remainder_ielen>0)\n\t{\n\t\tpbackup_remainder_ie = rtw_malloc(remainder_ielen);\n\t\tif(pbackup_remainder_ie && premainder_ie)\n\t\t\t_rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);\n\t}\n\n\t*dst_ie++=index;\n\t*dst_ie++=len;\n\n\t_rtw_memcpy(dst_ie, data, len);\n\tdst_ie+=len;\n\n\t//copy remainder IE\n\tif(pbackup_remainder_ie)\n\t{\n\t\t_rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);\n\n\t\trtw_mfree(pbackup_remainder_ie, remainder_ielen);\n\t}\n\n\toffset =  (uint)(dst_ie - pie);\n\tpnetwork->IELength = offset + remainder_ielen;\n}\n\nvoid rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index)\n{\n\tu8 *p, *dst_ie=NULL, *premainder_ie=NULL, *pbackup_remainder_ie=NULL;\n\tuint offset, ielen, ie_offset, remainder_ielen = 0;\n\tu8\t*pie = pnetwork->IEs;\n\n\tp = rtw_get_ie(pie + _FIXED_IE_LENGTH_, index, &ielen, pnetwork->IELength - _FIXED_IE_LENGTH_);\n\tif (p != NULL && ielen>0)\n\t{\n\t\tielen += 2;\n\t\t\n\t\tpremainder_ie = p+ielen;\n\n\t\tie_offset = (sint)(p -pie);\n\t\t\n\t\tremainder_ielen = pnetwork->IELength - ie_offset - ielen;\n\n\t\tdst_ie = p;\n\t}\n\telse {\n\t\treturn;\n\t}\n\n\tif(remainder_ielen>0)\n\t{\n\t\tpbackup_remainder_ie = rtw_malloc(remainder_ielen);\n\t\tif(pbackup_remainder_ie && premainder_ie)\n\t\t\t_rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);\n\t}\n\n\t//copy remainder IE\n\tif(pbackup_remainder_ie)\n\t{\n\t\t_rtw_memcpy(dst_ie, pbackup_remainder_ie, remainder_ielen);\n\n\t\trtw_mfree(pbackup_remainder_ie, remainder_ielen);\n\t}\n\n\toffset =  (uint)(dst_ie - pie);\n\tpnetwork->IELength = offset + remainder_ielen;\n}\n\n\nu8 chk_sta_is_alive(struct sta_info *psta);\nu8 chk_sta_is_alive(struct sta_info *psta)\n{\n\tu8 ret = _FALSE;\n\t#ifdef DBG_EXPIRATION_CHK\n\tDBG_871X(\"sta:\"MAC_FMT\", rssi:%d, rx:\"STA_PKTS_FMT\", expire_to:%u, %s%ssq_len:%u\\n\"\n\t\t, MAC_ARG(psta->hwaddr)\n\t\t, psta->rssi_stat.UndecoratedSmoothedPWDB\n\t\t//, STA_RX_PKTS_ARG(psta)\n\t\t, STA_RX_PKTS_DIFF_ARG(psta)\n\t\t, psta->expire_to\n\t\t, psta->state&WIFI_SLEEP_STATE?\"PS, \":\"\"\n\t\t, psta->state&WIFI_STA_ALIVE_CHK_STATE?\"SAC, \":\"\"\n\t\t, psta->sleepq_len\n\t);\n\t#endif\n\n\t//if(sta_last_rx_pkts(psta) == sta_rx_pkts(psta))\n\tif((psta->sta_stats.last_rx_data_pkts + psta->sta_stats.last_rx_ctrl_pkts) == (psta->sta_stats.rx_data_pkts + psta->sta_stats.rx_ctrl_pkts))\n\t{\n\t\t#if 0\n\t\tif(psta->state&WIFI_SLEEP_STATE)\n\t\t\tret = _TRUE;\n\t\t#endif\n\t}\n\telse\n\t{\n\t\tret = _TRUE;\n\t}\n\n\tsta_update_last_rx_pkts(psta);\n\n\treturn ret;\n}\n\nvoid\texpire_timeout_chk(_adapter *padapter)\n{\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tu8 updated = _FALSE;\n\tstruct sta_info *psta=NULL;\t\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 chk_alive_num = 0;\n\tchar chk_alive_list[NUM_STA];\n\tint i;\n\n\n\t_enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\n\tphead = &pstapriv->auth_list;\n\tplist = get_next(phead);\n\t\n\t//check auth_queue\n\t#ifdef DBG_EXPIRATION_CHK\n\tif (rtw_end_of_queue_search(phead, plist) == _FALSE) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" auth_list, cnt:%u\\n\"\n\t\t\t, FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->auth_list_cnt);\n\t}\n\t#endif\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t{\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, auth_list);\n\n\t\tplist = get_next(plist);\n\n\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t\tif (_TRUE == _rtw_memcmp((void *)(pstapriv->atmel_rc_pattern), (void *)(psta->hwaddr), ETH_ALEN))\n\t\t\tcontinue;\n\t\tif (psta->flag_atmel_rc)\n\t\t\tcontinue;\n#endif\n\t\tif(psta->expire_to>0)\n\t\t{\n\t\t\tpsta->expire_to--;\n\t\t\tif (psta->expire_to == 0)\n\t\t\t{\n\t\t\t\trtw_list_delete(&psta->auth_list);\n\t\t\t\tpstapriv->auth_list_cnt--;\n\t\t\t\t\n\t\t\t\tDBG_871X(\"auth expire %02X%02X%02X%02X%02X%02X\\n\",\n\t\t\t\t\tpsta->hwaddr[0],psta->hwaddr[1],psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]);\n\t\t\t\t\n\t\t\t\t_exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\t\t\t\n\t\t\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\n\t\t\t\trtw_free_stainfo(padapter, psta);\n\t\t\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\n\t\t\t\t\n\t\t\t\t_enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\t\t}\t\n\t\t}\t\n\t\t\n\t}\n\n\t_exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\tpsta = NULL;\n\t\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\n\t//check asoc_queue\n\t#ifdef DBG_EXPIRATION_CHK\n\tif (rtw_end_of_queue_search(phead, plist) == _FALSE) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" asoc_list, cnt:%u\\n\"\n\t\t\t, FUNC_NDEV_ARG(padapter->pnetdev), pstapriv->asoc_list_cnt);\n\t}\n\t#endif\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t\tDBG_871X(\"%s:%d  psta=%p, %02x,%02x||%02x,%02x  \\n\\n\", __func__,  __LINE__,\n\t\t\tpsta,pstapriv->atmel_rc_pattern[0], pstapriv->atmel_rc_pattern[5], psta->hwaddr[0], psta->hwaddr[5]);\n\t\tif (_TRUE == _rtw_memcmp((void *)pstapriv->atmel_rc_pattern, (void *)(psta->hwaddr), ETH_ALEN))\n\t\t\tcontinue;\t\t\n\t\tif (psta->flag_atmel_rc)\n\t\t\tcontinue;\n\t\tDBG_871X(\"%s: debug line:%d \\n\", __func__, __LINE__);\n#endif\n#ifdef CONFIG_AUTO_AP_MODE\n\t\tif(psta->isrc)\n\t\t\tcontinue;\n#endif\n\t\tif (chk_sta_is_alive(psta) || !psta->expire_to) {\n\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\tpsta->keep_alive_trycnt = 0;\n\t\t\t#ifdef CONFIG_TX_MCAST2UNI\n\t\t\tpsta->under_exist_checking = 0;\n\t\t\t#endif\t// CONFIG_TX_MCAST2UNI\n\t\t} else {\n\t\t\tpsta->expire_to--;\n\t\t}\n\n#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n#ifdef CONFIG_80211N_HT\n#ifdef CONFIG_TX_MCAST2UNI\n\t\tif ( (psta->flags & WLAN_STA_HT) && (psta->htpriv.agg_enable_bitmap || psta->under_exist_checking) ) {\n\t\t\t// check sta by delba(addba) for 11n STA \n\t\t\t// ToDo: use CCX report to check for all STAs\n\t\t\t//DBG_871X(\"asoc check by DELBA/ADDBA! (pstapriv->expire_to=%d s)(psta->expire_to=%d s), [%02x, %d]\\n\", pstapriv->expire_to*2, psta->expire_to*2, psta->htpriv.agg_enable_bitmap, psta->under_exist_checking);\n\t\t\t\n\t\t\t\tif ( psta->expire_to <= (pstapriv->expire_to - 50 ) ) {\n\t\t\t\tDBG_871X(\"asoc expire by DELBA/ADDBA! (%d s)\\n\", (pstapriv->expire_to-psta->expire_to)*2);\n\t\t\t\tpsta->under_exist_checking = 0;\n\t\t\t\tpsta->expire_to = 0;\n\t\t\t} else if ( psta->expire_to <= (pstapriv->expire_to - 3) && (psta->under_exist_checking==0)) {\n\t\t\t\tDBG_871X(\"asoc check by DELBA/ADDBA! (%d s)\\n\", (pstapriv->expire_to-psta->expire_to)*2);\n\t\t\t\tpsta->under_exist_checking = 1;\n\t\t\t\t//tear down TX AMPDU\n\t\t\t\tsend_delba(padapter, 1, psta->hwaddr);// // originator\n\t\t\t\tpsta->htpriv.agg_enable_bitmap = 0x0;//reset\n\t\t\t\tpsta->htpriv.candidate_tid_bitmap = 0x0;//reset\n\t\t\t}\n\t\t}\n#endif //CONFIG_TX_MCAST2UNI\n#endif //CONFIG_80211N_HT\n#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\n\t\tif (psta->expire_to <= 0)\n\t\t{\n\t\t\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\t\t\tif (padapter->registrypriv.wifi_spec == 1)\n\t\t\t{\n\t\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\t\tcontinue;\n\t\t\t}\n\n#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n#ifdef CONFIG_80211N_HT\n\n#define KEEP_ALIVE_TRYCNT (3)\n\n\t\t\tif(psta->keep_alive_trycnt > 0 && psta->keep_alive_trycnt <= KEEP_ALIVE_TRYCNT)\n\t\t\t{\t\t\t\t\n\t\t\t\tif(psta->state & WIFI_STA_ALIVE_CHK_STATE)\n\t\t\t\t\tpsta->state ^= WIFI_STA_ALIVE_CHK_STATE;\n\t\t\t\telse\n\t\t\t\t\tpsta->keep_alive_trycnt = 0;\n\t\t\t\t\n\t\t\t}\n\t\t\telse if((psta->keep_alive_trycnt > KEEP_ALIVE_TRYCNT) && !(psta->state & WIFI_STA_ALIVE_CHK_STATE))\n\t\t\t{\n\t\t\t\tpsta->keep_alive_trycnt = 0;\n\t\t\t}\t\t\t\n\t\t\tif((psta->htpriv.ht_option==_TRUE) && (psta->htpriv.ampdu_enable==_TRUE)) \n\t\t\t{\n\t\t\t\tuint priority = 1; //test using BK\n\t\t\t\tu8 issued=0;\t\t\t\t\n\t\t\n\t\t\t\t//issued = (psta->htpriv.agg_enable_bitmap>>priority)&0x1;\n\t\t\t\tissued |= (psta->htpriv.candidate_tid_bitmap>>priority)&0x1;\n\n\t\t\t\tif(0==issued)\n\t\t\t\t{\n\t\t\t\t\tif (!(psta->state & WIFI_STA_ALIVE_CHK_STATE))\n\t\t\t\t\t{\n\t\t\t\t\t\tpsta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);\n\n\t\t\t\t\t\tif (psta->state & WIFI_SLEEP_STATE) \n\t\t\t\t\t\t\tpsta->expire_to = 2; // 2x2=4 sec\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpsta->expire_to = 1; // 2 sec\n\t\t\t\t\t\n\t\t\t\t\t\tpsta->state |= WIFI_STA_ALIVE_CHK_STATE;\n\t\t\t\t\t\n\t\t\t\t\t\t//add_ba_hdl(padapter, (u8*)paddbareq_parm);\n\n\t\t\t\t\t\tDBG_871X(\"issue addba_req to check if sta alive, keep_alive_trycnt=%d\\n\", psta->keep_alive_trycnt);\n\n\t\t\t\t\t\tissue_addba_req(padapter, psta->hwaddr, (u8)priority);\n\t\t\n\t\t\t\t\t\t_set_timer(&psta->addba_retry_timer, ADDBA_TO);\n\t\t\t\t\t\t\n\t\t\t\t\t\tpsta->keep_alive_trycnt++;\t\t\t\t\t\t\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\t\t\t\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\t\t\tif(psta->keep_alive_trycnt > 0 && psta->state & WIFI_STA_ALIVE_CHK_STATE)\n\t\t\t{\n\t\t\t\tpsta->keep_alive_trycnt = 0;\n\t\t\t\tpsta->state ^= WIFI_STA_ALIVE_CHK_STATE;\n\t\t\t\tDBG_871X(\"change to another methods to check alive if staion is at ps mode\\n\");\n\t\t\t}\t\n\t\t\t\n#endif //CONFIG_80211N_HT\n#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK\t\n\t\t\tif (psta->state & WIFI_SLEEP_STATE) {\n\t\t\t\tif (!(psta->state & WIFI_STA_ALIVE_CHK_STATE)) {\n\t\t\t\t\t//to check if alive by another methods if staion is at ps mode.\t\t\t\t\t\n\t\t\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\t\t\tpsta->state |= WIFI_STA_ALIVE_CHK_STATE;\n\n\t\t\t\t\t//DBG_871X(\"alive chk, sta:\" MAC_FMT \" is at ps mode!\\n\", MAC_ARG(psta->hwaddr));\n\n\t\t\t\t\t//to update bcn with tim_bitmap for this station\n\t\t\t\t\tpstapriv->tim_bitmap |= BIT(psta->aid);\n\t\t\t\t\tupdate_beacon(padapter, _TIM_IE_, NULL, _TRUE);\n\n\t\t\t\t\tif(!pmlmeext->active_keep_alive_check)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\t#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\t\t\tif (pmlmeext->active_keep_alive_check) {\n\t\t\t\tint stainfo_offset;\n\n\t\t\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, psta);\n\t\t\t\tif (stainfo_offset_valid(stainfo_offset)) {\n\t\t\t\t\tchk_alive_list[chk_alive_num++] = stainfo_offset;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */\n\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\tDBG_871X(\"asoc expire \"MAC_FMT\", state=0x%x\\n\", MAC_ARG(psta->hwaddr), psta->state);\n\t\t\tupdated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE);\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\t/* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */\n\t\t\tif (psta->sleepq_len > (NR_XMITFRAME/pstapriv->asoc_list_cnt)\n\t\t\t\t&& padapter->xmitpriv.free_xmitframe_cnt < ((NR_XMITFRAME/pstapriv->asoc_list_cnt)/2)\n\t\t\t){\n\t\t\t\tDBG_871X(\"%s sta:\"MAC_FMT\", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\\n\", __func__\n\t\t\t\t\t, MAC_ARG(psta->hwaddr)\n\t\t\t\t\t, psta->sleepq_len, padapter->xmitpriv.free_xmitframe_cnt, pstapriv->asoc_list_cnt);\n\t\t\t\twakeup_sta_to_xmit(padapter, psta);\n\t\t\t}\n\t\t}\n\t}\n\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\nif (chk_alive_num) {\n\n\tu8 backup_oper_channel=0;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\t/* switch to correct channel of current network  before issue keep-alive frames */\n\tif (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) {\n\t\tbackup_oper_channel = rtw_get_oper_ch(padapter);\n\t\tSelectChannel(padapter, pmlmeext->cur_channel);\n\t}\n\n\t/* issue null data to check sta alive*/\n\tfor (i = 0; i < chk_alive_num; i++) {\n\t\tint ret = _FAIL;\n\n\t\tpsta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t\tif (_TRUE == _rtw_memcmp(  pstapriv->atmel_rc_pattern, psta->hwaddr, ETH_ALEN))\n\t\t\tcontinue;\n\t\tif (psta->flag_atmel_rc)\n\t\t\tcontinue;\n#endif\n\t\tif(!(psta->state &_FW_LINKED))\n\t\t\tcontinue;\t\t\n\t\n\t\tif (psta->state & WIFI_SLEEP_STATE)\n\t\t\tret = issue_nulldata(padapter, psta->hwaddr, 0, 1, 50);\n\t\telse\n\t\t\tret = issue_nulldata(padapter, psta->hwaddr, 0, 3, 50);\n\n\t\tpsta->keep_alive_trycnt++;\n\t\tif (ret == _SUCCESS)\n\t\t{\n\t\t\tDBG_871X(\"asoc check, sta(\" MAC_FMT \") is alive\\n\", MAC_ARG(psta->hwaddr));\n\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\tpsta->keep_alive_trycnt = 0;\n\t\t\tcontinue;\n\t\t}\n\t\telse if (psta->keep_alive_trycnt <= 3)\n\t\t{\n\t\t\tDBG_871X(\"ack check for asoc expire, keep_alive_trycnt=%d\\n\", psta->keep_alive_trycnt);\n\t\t\tpsta->expire_to = 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tpsta->keep_alive_trycnt = 0;\n\t\tDBG_871X(\"asoc expire \"MAC_FMT\", state=0x%x\\n\", MAC_ARG(psta->hwaddr), psta->state);\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\tif (rtw_is_list_empty(&psta->asoc_list)==_FALSE) {\n\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\tupdated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_DEAUTH_LEAVING, _TRUE);\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t}\n\n\tif (backup_oper_channel>0) /* back to the original operation channel */\n\t\tSelectChannel(padapter, backup_oper_channel);\n}\n#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */\n\n\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n}\n\nvoid add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level)\n{\t\n\tint i;\n\tu8 rf_type;\n\tunsigned char sta_band = 0, shortGIrate = _FALSE;\n\tu64 tx_ra_bitmap = 0;\n\tstruct ht_priv\t*psta_ht = NULL;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\n\n#ifdef CONFIG_80211N_HT\n\tif(psta)\n\t\tpsta_ht = &psta->htpriv;\n\telse\n\t\treturn;\n#endif //CONFIG_80211N_HT\n\n\tif(!(psta->state & _FW_LINKED))\n\t\treturn;\n\n#if 0//gtest\n\tif(get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)\n\t{\n\t\t//is this a 2r STA?\n\t\tif((pstat->tx_ra_bitmap & 0x0ff00000) != 0 && !(priv->pshare->has_2r_sta & BIT(pstat->aid)))\n\t\t{\n\t\t\tpriv->pshare->has_2r_sta |= BIT(pstat->aid);\n\t\t\tif(rtw_read16(padapter, 0x102501f6) != 0xffff)\n\t\t\t{\n\t\t\t\trtw_write16(padapter, 0x102501f6, 0xffff);\n\t\t\t\treset_1r_sta_RA(priv, 0xffff);\n\t\t\t\tSwitch_1SS_Antenna(priv, 3);\n\t\t\t}\n\t\t}\n\t\telse// bg or 1R STA? \n\t\t{ \n\t\t\tif((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len && priv->pshare->has_2r_sta == 0)\n\t\t\t{\n\t\t\t\tif(rtw_read16(padapter, 0x102501f6) != 0x7777)\n\t\t\t\t{ // MCS7 SGI\n\t\t\t\t\trtw_write16(padapter, 0x102501f6,0x7777);\n\t\t\t\t\treset_1r_sta_RA(priv, 0x7777);\n\t\t\t\t\tSwitch_1SS_Antenna(priv, 2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n\tif ((pstat->rssi_level < 1) || (pstat->rssi_level > 3)) \n\t{\n\t\tif (pstat->rssi >= priv->pshare->rf_ft_var.raGoDownUpper)\n\t\t\tpstat->rssi_level = 1;\n\t\telse if ((pstat->rssi >= priv->pshare->rf_ft_var.raGoDown20MLower) ||\n\t\t\t((priv->pshare->is_40m_bw) && (pstat->ht_cap_len) &&\n\t\t\t(pstat->rssi >= priv->pshare->rf_ft_var.raGoDown40MLower) &&\n\t\t\t(pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_SUPPORT_CH_WDTH_))))\n\t\t\tpstat->rssi_level = 2;\n\t\telse\n\t\t\tpstat->rssi_level = 3;\n\t}\n\n\t// rate adaptive by rssi\n\tif ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) && pstat->ht_cap_len)\n\t{\n\t\tif ((get_rf_mimo_mode(priv) == MIMO_1T2R) || (get_rf_mimo_mode(priv) == MIMO_1T1R))\n\t\t{\n\t\t\tswitch (pstat->rssi_level) {\n\t\t\t\tcase 1:\n\t\t\t\t\tpstat->tx_ra_bitmap &= 0x100f0000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tpstat->tx_ra_bitmap &= 0x100ff000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tif (priv->pshare->is_40m_bw)\n\t\t\t\t\t\tpstat->tx_ra_bitmap &= 0x100ff005;\n\t\t\t\t\telse\n\t\t\t\t\t\tpstat->tx_ra_bitmap &= 0x100ff001;\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\tswitch (pstat->rssi_level) {\n\t\t\t\tcase 1:\n\t\t\t\t\tpstat->tx_ra_bitmap &= 0x1f0f0000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tpstat->tx_ra_bitmap &= 0x1f0ff000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tif (priv->pshare->is_40m_bw)\n\t\t\t\t\t\tpstat->tx_ra_bitmap &= 0x000ff005;\n\t\t\t\t\telse\n\t\t\t\t\t\tpstat->tx_ra_bitmap &= 0x000ff001;\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Don't need to mask high rates due to new rate adaptive parameters\n\t\t\t//if (pstat->is_broadcom_sta)\t\t// use MCS12 as the highest rate vs. Broadcom sta\n\t\t\t//\tpstat->tx_ra_bitmap &= 0x81ffffff;\n\n\t\t\t// NIC driver will report not supporting MCS15 and MCS14 in asoc req\n\t\t\t//if (pstat->is_rtl8190_sta && !pstat->is_2t_mimo_sta)\n\t\t\t//\tpstat->tx_ra_bitmap &= 0x83ffffff;\t\t// if Realtek 1x2 sta, don't use MCS15 and MCS14\n\t\t}\n\t}\n\telse if ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) && isErpSta(pstat))\n\t{\n\t\tswitch (pstat->rssi_level) {\n\t\t\tcase 1:\n\t\t\t\tpstat->tx_ra_bitmap &= 0x00000f00;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpstat->tx_ra_bitmap &= 0x00000ff0;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tpstat->tx_ra_bitmap &= 0x00000ff5;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse \n\t{\n\t\tpstat->tx_ra_bitmap &= 0x0000000d;\n\t}\n\n\t// disable tx short GI when station cannot rx MCS15(AP is 2T2R)\n\t// disable tx short GI when station cannot rx MCS7 (AP is 1T2R or 1T1R)\n\t// if there is only 1r STA and we are 2T2R, DO NOT mask SGI rate\n\tif ((!(pstat->tx_ra_bitmap & 0x8000000) && (priv->pshare->has_2r_sta > 0) && (get_rf_mimo_mode(padapter) == RTL8712_RF_2T2R)) ||\n\t\t (!(pstat->tx_ra_bitmap & 0x80000) && (get_rf_mimo_mode(padapter) != RTL8712_RF_2T2R)))\n\t{\n\t\tpstat->tx_ra_bitmap &= ~BIT(28);\t\n\t}\n#endif\n\n\trtw_hal_update_sta_rate_mask(padapter, psta);\n\ttx_ra_bitmap = psta->ra_mask;\n\n\tshortGIrate = query_ra_short_GI(psta);\n\n\tif ( pcur_network->Configuration.DSConfig > 14 ) {\n\t\t\n\t\tif (tx_ra_bitmap & 0xffff000)\n\t\t\tsta_band |= WIRELESS_11_5N ;\n\n\t\tif (tx_ra_bitmap & 0xff0)\n\t\t\tsta_band |= WIRELESS_11A;\n\n\t\t// 5G band\n\t\t#ifdef CONFIG_80211AC_VHT\n\t\tif (psta->vhtpriv.vht_option)  {\n\t\t\tsta_band = WIRELESS_11_5AC;\n\t\t}\t\t\n\t\t#endif\n\t\t\n\t} else {\n\t\tif (tx_ra_bitmap & 0xffff000)\n\t\t\tsta_band |= WIRELESS_11_24N;\n\n\t\tif (tx_ra_bitmap & 0xff0)\n\t\t\tsta_band |= WIRELESS_11G;\n\n\t\tif (tx_ra_bitmap & 0x0f)\n\t\t\tsta_band |= WIRELESS_11B;\n\t}\n\n\tpsta->wireless_mode = sta_band;\n\tpsta->raid = rtw_hal_networktype_to_raid(padapter, psta);\n\t\n\tif (psta->aid < NUM_STA)\n\t{\n\t\tu8\targ[4] = {0};\n\n\t\targ[0] = psta->mac_id;\n\t\targ[1] = psta->raid;\n\t\targ[2] = shortGIrate;\n\t\targ[3] = psta->init_rate;\n\n\t\tDBG_871X(\"%s=> mac_id:%d , raid:%d , shortGIrate=%d, tx_ra_bitmap:0x%016llx, networkType:0x%02x\\n\", \n\t\t\t__FUNCTION__, psta->mac_id, psta->raid, shortGIrate, tx_ra_bitmap, psta->wireless_mode);\n\t\t\t\n\t\trtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level);\n\t}\n\telse \n\t{\n\t\tDBG_871X(\"station aid %d exceed the max number\\n\", psta->aid);\n\t}\n\n}\n\nvoid update_bmc_sta(_adapter *padapter)\n{\n\t_irqL\tirqL;\n\tunsigned char\tnetwork_type;\n\tint supportRateNum = 0;\n\tu64 tx_ra_bitmap = 0;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\t\n\tWLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\t\n\tstruct sta_info *psta = rtw_get_bcmc_stainfo(padapter);\n\n\tif(psta)\n\t{\n\t\tpsta->aid = 0;//default set to 0\n\n\t\tpmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;\n\n\t\tpsta->qos_option = 0;\n#ifdef CONFIG_80211N_HT\t\n\t\tpsta->htpriv.ht_option = _FALSE;\n#endif //CONFIG_80211N_HT\n\n\t\tpsta->ieee8021x_blocked = 0;\n\n\t\t_rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));\n\n\t\t//psta->dot118021XPrivacy = _NO_PRIVACY_;//!!! remove it, because it has been set before this.\n\n\t\t//prepare for add_RATid\t\t\n\t\tsupportRateNum = rtw_get_rateset_len((u8*)&pcur_network->SupportedRates);\n\t\tnetwork_type = rtw_check_network_type((u8*)&pcur_network->SupportedRates, supportRateNum, pcur_network->Configuration.DSConfig);\n\t\tif (IsSupportedTxCCK(network_type)) {\n\t\t\tnetwork_type = WIRELESS_11B;\n\t\t}\n\t\telse if (network_type == WIRELESS_INVALID) { // error handling\n\t\t\tif ( pcur_network->Configuration.DSConfig > 14 )\n\t\t\t\tnetwork_type = WIRELESS_11A;\n\t\t\telse\n\t\t\t\tnetwork_type = WIRELESS_11B;\n\t\t}\n\t\tupdate_sta_basic_rate(psta, network_type);\n\t\tpsta->wireless_mode = network_type;\n\n\t\trtw_hal_update_sta_rate_mask(padapter, psta);\n\t\ttx_ra_bitmap = psta->ra_mask;\n\n\t\tpsta->raid = rtw_hal_networktype_to_raid(padapter,psta);\n\n\t\t//ap mode\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE);\n\n\t\t//if(pHalData->fw_ractrl == _TRUE)\n\t\t{\n\t\t\tu8\targ[4] = {0};\n\n\t\t\targ[0] = psta->mac_id;\n\t\t\targ[1] = psta->raid;\n\t\t\targ[2] = 0;\n\t\t\targ[3] = psta->init_rate;\n\n\t\t\tDBG_871X(\"%s=> mac_id:%d , raid:%d , bitmap=0x%016llx\\n\", \n\t\t\t\t__FUNCTION__ , psta->mac_id, psta->raid , tx_ra_bitmap);\n\n\t\t\trtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0);\n\t\t}\n\n\t\trtw_sta_media_status_rpt(padapter, psta, 1);\n\n\t\t_enter_critical_bh(&psta->lock, &irqL);\n\t\tpsta->state = _FW_LINKED;\n\t\t_exit_critical_bh(&psta->lock, &irqL);\n\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"add_RATid_bmc_sta error!\\n\");\n\t}\n\t\t\n}\n\n//notes:\n//AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode \n//MAC_ID = AID+1 for sta in ap/adhoc mode \n//MAC_ID = 1 for bc/mc for sta/ap/adhoc\n//MAC_ID = 0 for bssid for sta/ap/adhoc\n//CAM_ID = //0~3 for default key, cmd_id=macid + 3, macid=aid+1;\n\nvoid update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)\n{\t\n\t_irqL\tirqL;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n#ifdef CONFIG_80211N_HT\n\tstruct ht_priv\t*phtpriv_ap = &pmlmepriv->htpriv;\n\tstruct ht_priv\t*phtpriv_sta = &psta->htpriv;\n#endif //CONFIG_80211N_HT\n\tu8\tcur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0;\n\t//set intf_tag to if1\n\t//psta->intf_tag = 0;\n\n        DBG_871X(\"%s\\n\",__FUNCTION__);\n\n\t//psta->mac_id = psta->aid+4;\n\t//psta->mac_id = psta->aid+1;//alloc macid when call rtw_alloc_stainfo(),\n\t\t                                       //release macid when call rtw_free_stainfo()\n\n\t//ap mode\n\trtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE);\n\t\n\tif(psecuritypriv->dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n\t\tpsta->ieee8021x_blocked = _TRUE;\n\telse\n\t\tpsta->ieee8021x_blocked = _FALSE;\n\t\n\n\t//update sta's cap\n\t\n\t//ERP\n\tVCS_update(padapter, psta);\n#ifdef CONFIG_80211N_HT\t\n\t//HT related cap\n\tif(phtpriv_sta->ht_option)\n\t{\n\t\t//check if sta supports rx ampdu\n\t\tphtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable;\n\n\t\tphtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;\n\t\n\t\t// bwmode\n\t\tif((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))\n\t\t{\t\t\t\n\t\t\tpsta->bw_mode = CHANNEL_WIDTH_40;\n\t\t}\n\t\telse\n\t\t{\t\t\t\n\t\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\t}\n\n\t\tif (psta->ht_40mhz_intolerant)\n\t\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\t\n\t\tif(pmlmeext->cur_bwmode < psta->bw_mode)\n\t\t{\n\t\t\tpsta->bw_mode = pmlmeext->cur_bwmode;\n\t\t}\n\n\t\tphtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\n\n\n\t\t//check if sta support s Short GI 20M \n\t\tif((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\n\t\t{\n\t\t\tphtpriv_sta->sgi_20m = _TRUE;\n\t\t}\n\t\t\n\t\t//check if sta support s Short GI 40M \n\t\tif((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\n\t\t{\n\t\t\tif(psta->bw_mode == CHANNEL_WIDTH_40) //according to psta->bw_mode\n\t\t\t\tphtpriv_sta->sgi_40m = _TRUE;\n\t\t\telse\n\t\t\t\tphtpriv_sta->sgi_40m = _FALSE;\n\t\t}\n\n\t\tpsta->qos_option = _TRUE;\n\n\t\t// B0 Config LDPC Coding Capability\n\t\tif (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && \n\t\t\tGET_HT_CAP_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap)))\n\t\t{\n\t\t\tSET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));\n\t\t\tDBG_871X(\"Enable HT Tx LDPC for STA(%d)\\n\",psta->aid);\n\t\t}\n\n\t\t// B7 B8 B9 Config STBC setting\n\t\tif (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) &&\n\t\t\tGET_HT_CAP_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap)))\n\t\t{\n\t\t\tSET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );\n\t\t\tDBG_871X(\"Enable HT Tx STBC for STA(%d)\\n\",psta->aid);\n\t\t}\n\n#ifdef CONFIG_BEAMFORMING\n\t\t/*Config Tx beamforming setting*/\n\t\tif (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && \n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP((u8 *)(&phtpriv_sta->ht_cap)))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\n\t\t\t/*Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 6);\n\t\t}\n\n\t\tif (TEST_FLAG(phtpriv_ap->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&\n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP((u8 *)(&phtpriv_sta->ht_cap)))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\n\t\t\t/*Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS((u8 *)(&phtpriv_sta->ht_cap)) << 4);\n\t\t}\n\t\tif (cur_beamform_cap) {\n\t\t\tDBG_871X(\"Client STA(%d) HT Beamforming Cap = 0x%02X\\n\", psta->aid, cur_beamform_cap);\n\t\t}\n#endif /*CONFIG_BEAMFORMING*/\n\t}\n\telse\n\t{\n\t\tphtpriv_sta->ampdu_enable = _FALSE;\n\t\t\n\t\tphtpriv_sta->sgi_20m = _FALSE;\n\t\tphtpriv_sta->sgi_40m = _FALSE;\n\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\tphtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t}\n\n\tphtpriv_sta->ldpc_cap = cur_ldpc_cap;\n\tphtpriv_sta->stbc_cap = cur_stbc_cap;\n\tphtpriv_sta->beamform_cap = cur_beamform_cap;\n\n\t//Rx AMPDU\n\tsend_delba(padapter, 0, psta->hwaddr);// recipient\n\t\n\t//TX AMPDU\n\tsend_delba(padapter, 1, psta->hwaddr);// // originator\n\tphtpriv_sta->agg_enable_bitmap = 0x0;//reset\n\tphtpriv_sta->candidate_tid_bitmap = 0x0;//reset\n#endif //CONFIG_80211N_HT\n\n#ifdef CONFIG_80211AC_VHT\n\tupdate_sta_vht_info_apmode(padapter, psta);\n#endif\n\n\tupdate_ldpc_stbc_cap(psta);\n\n\t//todo: init other variables\n\t\n\t_rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));\n\n\n\t//add ratid\n\t//add_RATid(padapter, psta);//move to ap_sta_info_defer_update()\n\n\n\t_enter_critical_bh(&psta->lock, &irqL);\n\tpsta->state |= _FW_LINKED;\n\t_exit_critical_bh(&psta->lock, &irqL);\n\t\n\n}\n\nstatic void update_ap_info(_adapter *padapter, struct sta_info *psta)\n{\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n#ifdef CONFIG_80211N_HT\n\tstruct ht_priv\t*phtpriv_ap = &pmlmepriv->htpriv;\n#endif //CONFIG_80211N_HT\n\n\tpsta->wireless_mode = pmlmeext->cur_wireless_mode;\n\n\tpsta->bssratelen = rtw_get_rateset_len(pnetwork->SupportedRates);\n\t_rtw_memcpy(psta->bssrateset, pnetwork->SupportedRates, psta->bssratelen);\n\n#ifdef CONFIG_80211N_HT\t\n\t//HT related cap\n\tif(phtpriv_ap->ht_option)\n\t{\n\t\t//check if sta supports rx ampdu\n\t\t//phtpriv_ap->ampdu_enable = phtpriv_ap->ampdu_enable;\n\n\t\t//check if sta support s Short GI 20M\n\t\tif((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\n\t\t{\n\t\t\tphtpriv_ap->sgi_20m = _TRUE;\n\t\t}\n\t\t//check if sta support s Short GI 40M\n\t\tif((phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\n\t\t{\n\t\t\tphtpriv_ap->sgi_40m = _TRUE;\n\t\t}\n\n\t\tpsta->qos_option = _TRUE;\n\t}\n\telse\n\t{\n\t\tphtpriv_ap->ampdu_enable = _FALSE;\n\t\t\n\t\tphtpriv_ap->sgi_20m = _FALSE;\n\t\tphtpriv_ap->sgi_40m = _FALSE;\n\t}\n\n\tpsta->bw_mode = pmlmeext->cur_bwmode;\n\tphtpriv_ap->ch_offset = pmlmeext->cur_ch_offset;\n\n\tphtpriv_ap->agg_enable_bitmap = 0x0;//reset\n\tphtpriv_ap->candidate_tid_bitmap = 0x0;//reset\n\n\t_rtw_memcpy(&psta->htpriv, &pmlmepriv->htpriv, sizeof(struct ht_priv));\n\n#ifdef CONFIG_80211AC_VHT\n\t_rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv));\n#endif //CONFIG_80211AC_VHT\n\n#endif //CONFIG_80211N_HT\n\n\tpsta->state |= WIFI_AP_STATE; /* Aries, add,fix bug of flush_cam_entry at STOP AP mode , 0724 */\n}\n\nstatic void rtw_set_hw_wmm_param(_adapter *padapter)\n{\n\tu8\tACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime;\n\tu8\tacm_mask;\n\tu16\tTXOP;\n\tu32\tacParm, i;\n\tu32\tedca[4], inx[4];\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct xmit_priv\t\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct registry_priv\t *pregpriv = &padapter->registrypriv;\n\n\tacm_mask = 0;\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || \n\t\t(pmlmeext->cur_wireless_mode & WIRELESS_11_24N))\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tif (pmlmeinfo->WMM_enable == 0) {\n\t\tpadapter->mlmepriv.acm_mask = 0;\n\n\t\tAIFS = aSifsTime + (2 * pmlmeinfo->slotTime);\n\n\t\tif (pmlmeext->cur_wireless_mode & (WIRELESS_11G | WIRELESS_11A)) {\n\t\t\tECWMin = 4;\n\t\t\tECWMax = 10;\n\t\t} else if (pmlmeext->cur_wireless_mode & WIRELESS_11B) {\n\t\t\tECWMin = 5;\n\t\t\tECWMax = 10;\n\t\t} else {\n\t\t\tECWMin = 4;\n\t\t\tECWMax = 10;\n\t\t}\n\n\t\tTXOP = 0;\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));\n\n\t\tECWMin = 2;\n\t\tECWMax = 3;\n\t\tTXOP = 0x2f;\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));\n\t\t\n\t} else {\n\t\tedca[0] = edca[1] = edca[2] = edca[3] = 0;\n\n\t\t/*TODO:*/\n\t\tacm_mask = 0;\n\t\tpadapter->mlmepriv.acm_mask = acm_mask;\n\n\t\t/*\n\t\t//BK\n\t\t//AIFS = AIFSN * slot time + SIFS - r2t phy delay\n\t\t*/\n\t\tAIFS = (7 * pmlmeinfo->slotTime) + aSifsTime;\n\t\tECWMin = 4;\n\t\tECWMax = 10;\n\t\tTXOP = 0;\t\t\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));\n\t\tedca[XMIT_BK_QUEUE] = acParm;\n\t\tDBG_871X(\"WMM(BK): %x\\n\", acParm);\n\t\t\n\t\t/* BE */\n\t\tAIFS = (3 * pmlmeinfo->slotTime) + aSifsTime;\n\t\tECWMin = 4;\n\t\tECWMax = 6;\n\t\tTXOP = 0;\t\t\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));\n\t\tedca[XMIT_BE_QUEUE] = acParm;\n\t\tDBG_871X(\"WMM(BE): %x\\n\", acParm);\n\n\t\t/* VI */\n\t\tAIFS = (1 * pmlmeinfo->slotTime) + aSifsTime;\n\t\tECWMin = 3;\n\t\tECWMax = 4;\n\t\tTXOP = 94;\t\t\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));\n\t\tedca[XMIT_VI_QUEUE] = acParm;\n\t\tDBG_871X(\"WMM(VI): %x\\n\", acParm);\n\n\t\t/* VO */\n\t\tAIFS = (1 * pmlmeinfo->slotTime) + aSifsTime;\n\t\tECWMin = 2;\n\t\tECWMax = 3;\n\t\tTXOP = 47;\t\t\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));\n\t\tedca[XMIT_VO_QUEUE] = acParm;\n\t\tDBG_871X(\"WMM(VO): %x\\n\", acParm);\n\n\t\t\n\t\tif (padapter->registrypriv.acm_method == 1)\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));\n\t\telse\n\t\t\tpadapter->mlmepriv.acm_mask = acm_mask;\n\n\t\tinx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;\n\n\t\tif (pregpriv->wifi_spec == 1) {\n\t\t\tu32\tj, tmp, change_inx = _FALSE;\n\n\t\t\t/* entry indx: 0->vo, 1->vi, 2->be, 3->bk. */\n\t\t\tfor (i = 0 ; i < 4 ; i++) {\n\t\t\t\tfor (j = i+1 ; j < 4 ; j++) {\n\t\t\t\t\t/* compare CW and AIFS */\n\t\t\t\t\tif ((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF)) {\n\t\t\t\t\t\tchange_inx = _TRUE;\n\t\t\t\t\t} else if ((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF)) {\n\t\t\t\t\t\t/* compare TXOP */\n\t\t\t\t\t\tif ((edca[j] >> 16) > (edca[i] >> 16))\n\t\t\t\t\t\t\tchange_inx = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tif (change_inx) {\n\t\t\t\t\t\ttmp = edca[i];\n\t\t\t\t\t\tedca[i] = edca[j];\n\t\t\t\t\t\tedca[j] = tmp;\n\n\t\t\t\t\t\ttmp = inx[i];\n\t\t\t\t\t\tinx[i] = inx[j];\n\t\t\t\t\t\tinx[j] = tmp;\n\n\t\t\t\t\t\tchange_inx = _FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0 ; i < 4 ; i++) {\n\t\t\tpxmitpriv->wmm_para_seq[i] = inx[i];\n\t\t\tDBG_871X(\"wmm_para_seq(%d): %d\\n\", i, pxmitpriv->wmm_para_seq[i]);\n\t\t}\n\t\t\n\t}\n\t\n}\n\nstatic void update_hw_ht_param(_adapter *padapter)\n{\n\tunsigned char\t\tmax_AMPDU_len;\n\tunsigned char\t\tmin_MPDU_spacing;\n\tstruct registry_priv\t *pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\n\t//handle A-MPDU parameter field\n\t/* \t\n\t\tAMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k\n\t\tAMPDU_para [4:2]:Min MPDU Start Spacing\t\n\t*/\n\tmax_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;\t\n\t\n\tmin_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;\t\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));\n\n\t//\n\t// Config SM Power Save setting\n\t//\n\tpmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;\n\tif(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)\n\t{\n\t\t/*u8 i;\n\t\t//update the MCS rates\n\t\tfor (i = 0; i < 16; i++)\n\t\t{\n\t\t\tpmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];\n\t\t}*/\n\t\tDBG_871X(\"%s(): WLAN_HT_CAP_SM_PS_STATIC\\n\",__FUNCTION__);\n\t}\n\n\t//\n\t// Config current HT Protection mode.\n\t//\n\t//pmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;\n\n}\n\nstatic void rtw_ap_check_scan(_adapter *padapter)\n{\n\t_irqL\tirqL;\n\t_list\t\t*plist, *phead;\n\tu32\tdelta_time, lifetime;\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tWLAN_BSSID_EX *pbss = NULL;\t\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tu8 do_scan = _FALSE;\n\n\tlifetime = SCANQUEUE_LIFETIME; /* 20 sec */\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\tphead = get_list_head(queue);\n\tif (rtw_end_of_queue_search(phead, get_next(phead)) == _TRUE)\n\t\tif (padapter->registrypriv.wifi_spec)\n\t\t\tdo_scan = _TRUE;\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tif (padapter->registrypriv.acs_auto_scan) {\n\t\tdo_scan = _TRUE;\n\t\trtw_acs_start(padapter, _TRUE);\n\t}\n#endif\n\t\t\n\tif (_TRUE == do_scan) {\n\t\tDBG_871X(\"%s : drv scans by itself and wait_completed\\n\", __func__);\n\t\trtw_drv_scan_by_self(padapter);\n\t\trtw_scan_wait_completed(padapter);\n\t}\n\t\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tif (padapter->registrypriv.acs_auto_scan)\n\t\trtw_acs_start(padapter, _FALSE);\n#endif\t\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1) {\n\t\t\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\t\n\t\tif (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0\n\t\t\t&& rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE\n\t\t\t&& _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))) {\t\t\n\t\t\tdelta_time = (u32) rtw_get_passing_time_ms(pnetwork->last_scanned);\n\t\t\t\n\t\t\tif (delta_time < lifetime) {\n\n\t\t\t\tuint ie_len = 0;\t\n\t\t\t\tu8 *pbuf = NULL;\n\t\t\t\tu8 *ie = NULL;\n\t\t\n\t\t\t\tpbss = &pnetwork->network;\n\t\t\t\tie = pbss->IEs;\n\t\t\n\t\t\t\t/*check if HT CAP INFO IE exists or not*/\n\t\t\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss->IELength - _BEACON_IE_OFFSET_));\n\t\t\t\tif (pbuf == NULL) {\n\t\t\t\t\t/* HT CAP INFO IE don't exist, it is b/g mode bss.*/\n\t\t\t\t\n\t\t\t\t\tif (pmlmepriv->olbc == _FALSE)\n\t\t\t\t\t\tpmlmepriv->olbc = _TRUE;\n\n\t\t\t\t\tif (pmlmepriv->olbc_ht == _FALSE)\n\t\t\t\t\t\tpmlmepriv->olbc_ht = _TRUE;\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t}\n\n\t\tplist = get_next(plist);\t\n\t\t\n\t}\n\t\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tpmlmepriv->num_sta_no_ht = 0; /* reset to 0 after ap do scanning*/\n\t\n}\n\nvoid rtw_start_bss_hdl_after_chbw_decided(_adapter *adapter)\n{\n\tWLAN_BSSID_EX *pnetwork = &(adapter->mlmepriv.cur_network.network);\n\tstruct sta_info *sta = NULL;\n\n\t/* update cur_wireless_mode */\n\tupdate_wireless_mode(adapter);\n\n\t/* update RRSR and RTS_INIT_RATE register after set channel and bandwidth */\n\tUpdateBrateTbl(adapter, pnetwork->SupportedRates);\n\trtw_hal_set_hwreg(adapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates);\n\n\t/* update capability after cur_wireless_mode updated */\n\tupdate_capinfo(adapter, rtw_get_capability(pnetwork));\n\n\t/* update bc/mc sta_info */\n\tupdate_bmc_sta(adapter);\n\n\t/* update AP's sta info */\n\tsta = rtw_get_stainfo(&adapter->stapriv, pnetwork->MacAddress);\n\tif (!sta) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" !sta for macaddr=\"MAC_FMT\"\\n\", FUNC_ADPT_ARG(adapter), MAC_ARG(pnetwork->MacAddress));\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tupdate_ap_info(adapter, sta);\n}\n\nvoid start_bss_network(_adapter *padapter, struct createbss_parm *parm)\n{\n#define DUMP_ADAPTERS_STATUS 0\n\n\tu8 val8;\n\tu16 bcn_interval;\n\tu32\tacparm;\n\tstruct registry_priv\t *pregpriv = &padapter->registrypriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\t\n\tWLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network; /* used as input */\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork_mlmeext = &(pmlmeinfo->network);\n\tu8 req_ch, req_bw, req_offset;\n\tbool ch_setting_changed = _FALSE;\n\tu8 ch_to_set = 0, bw_to_set, offset_to_set;\n\n\tif (parm->req_ch == 0) {\n\t\t/* change to unspecificed ch, bw, offset, get from IE */\n\t\tgoto get_cbhw_from_ie;\n\t} else if (parm->req_ch > 0) {\n\t\t/* change ch, bw, offset */\n\t\treq_ch = parm->req_ch;\n\t\treq_bw = parm->req_bw;\n\t\treq_offset = parm->req_offset;\n\t\tgoto change_chbw;\n\t}\n\n\tbcn_interval = (u16)pnetwork->Configuration.BeaconPeriod;\t\n\n\t//check if there is wps ie, \n\t//if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd,\n\t//and at first time the security ie ( RSN/WPA IE) will not include in beacon.\n\tif(NULL == rtw_get_wps_ie(pnetwork->IEs+_FIXED_IE_LENGTH_, pnetwork->IELength-_FIXED_IE_LENGTH_, NULL, NULL))\n\t{\n\t\tpmlmeext->bstart_bss = _TRUE;\n\t}\n\n\t//todo: update wmm, ht cap\n\t//pmlmeinfo->WMM_enable;\n\t//pmlmeinfo->HT_enable;\n\tif(pmlmepriv->qospriv.qos_option)\n\t\tpmlmeinfo->WMM_enable = _TRUE;\n#ifdef CONFIG_80211N_HT\n\tif(pmlmepriv->htpriv.ht_option)\n\t{\n\t\tpmlmeinfo->WMM_enable = _TRUE;\n\t\tpmlmeinfo->HT_enable = _TRUE;\n\t\t//pmlmeinfo->HT_info_enable = _TRUE;\n\t\t//pmlmeinfo->HT_caps_enable = _TRUE;\n\n\t\tupdate_hw_ht_param(padapter);\n\t}\n#endif //#CONFIG_80211N_HT\n\n#ifdef CONFIG_80211AC_VHT\n\tif(pmlmepriv->vhtpriv.vht_option) {\n\t\tpmlmeinfo->VHT_enable = _TRUE;\n\t\tupdate_hw_vht_param(padapter);\n\t}\n#endif //CONFIG_80211AC_VHT\n\n\tif(pmlmepriv->cur_network.join_res != _TRUE) //setting only at  first time\n\t{\n\t\t//WEP Key will be set before this function, do not clear CAM.\n\t\tif ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_))\n\t\t\tflush_all_cam_entry(padapter);\t//clear CAM\n\t}\t\n\n\t//set MSR to AP_Mode\t\t\n\tSet_MSR(padapter, _HW_STATE_AP_);\t\n\t\t\n\t//Set BSSID REG\n\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress);\n\n\t//Set EDCA param reg\n#ifdef CONFIG_CONCURRENT_MODE\n\tacparm = 0x005ea42b;\n#else\n\tacparm = 0x002F3217; // VO\n#endif\n\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));\n\tacparm = 0x005E4317; // VI\n\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));\n\t//acparm = 0x00105320; // BE\n\tacparm = 0x005ea42b;\n\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));\n\tacparm = 0x0000A444; // BK\n\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));\n\n\t//Set Security\n\tval8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;\n\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));\n\n\t//Beacon Control related register\n\trtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval));\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL);\n\n#if 0\n\tif(pmlmepriv->cur_network.join_res != _TRUE) //setting only at  first time\n\t{\n\t\t//u32 initialgain;\n\n\t\t//initialgain = 0x1e;\n\n\n\t\t//disable dynamic functions, such as high power, DIG\n\t\t/*rtw_phydm_ability_backup(padapter);*/\n\t\t/*rtw_phydm_func_disable_all(padapter);*/\n\t\t\n\t\t//turn on all dynamic functions\t\n\t\t/* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE);*/\n\n\t\t/*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/\n\t\n\t}\n#endif\n\nget_cbhw_from_ie:\n\trtw_ies_get_chbw(pnetwork->IEs + sizeof(NDIS_802_11_FIXED_IEs)\n\t\t, pnetwork->IELength - sizeof(NDIS_802_11_FIXED_IEs)\n\t\t, &req_ch, &req_bw, &req_offset);\n\nchange_chbw:\n\trtw_warn_on(req_ch == 0);\n\n\tch_setting_changed = rtw_ap_chbw_decision(padapter, req_ch, req_bw, req_offset\n\t\t, &ch_to_set, &bw_to_set, &offset_to_set);\n\n\t//let pnetwork_mlmeext == pnetwork_mlme.\n\t_rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);\n\n\trtw_start_bss_hdl_after_chbw_decided(padapter);\n\n\t#if defined(CONFIG_DFS_MASTER)\n\trtw_dfs_master_status_apply(padapter, MLME_AP_STARTED);\n\t#endif\n\n\tif (ch_to_set != 0)\n\t\tset_channel_bwmode(padapter, ch_to_set, offset_to_set, bw_to_set);\n\n\tif (DUMP_ADAPTERS_STATUS) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" done\\n\", FUNC_ADPT_ARG(padapter));\n\t\tdump_adapters_status(RTW_DBGDUMP , adapter_to_dvobj(padapter));\n\t}\n\n\tif (_TRUE == pmlmeext->bstart_bss\n\t\t&& !check_fwstate(pmlmepriv, WIFI_SITE_MONITOR)\n\t\t&& !check_fwstate(pmlmepriv, WIFI_OP_CH_SWITCHING)\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t&& !check_buddy_fwstate(padapter, WIFI_SITE_MONITOR)\n\t\t#endif\n\t) {\n\n\t       if ((pmlmepriv->olbc == _TRUE) || (pmlmepriv->olbc_ht == _TRUE)) {\n\n\t\t\t/* AP is not starting a 40 MHz BSS in presence of an 802.11g BSS. */\n\n\t\t\tpmlmepriv->ht_op_mode &= (~HT_INFO_OPERATION_MODE_OP_MODE_MASK);\n\t\t\tpmlmepriv->ht_op_mode |= OP_MODE_MAY_BE_LEGACY_STAS;\n\t\t\tupdate_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE);\n\t\t}\n\n\t\tupdate_beacon(padapter, _TIM_IE_, NULL, _TRUE);\n\n\t\t#if !defined(CONFIG_INTERRUPT_BASED_TXBCN)\n\t\t#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\t/* other case will  tx beacon when bcn interrupt coming in. */\n\t\tif (send_beacon(padapter) == _FAIL)\n\t\t\tDBG_871X(\"issue_beacon, fail!\\n\");\n\t\t#endif \n\t\t#endif /* !defined(CONFIG_INTERRUPT_BASED_TXBCN) */\n\t}\n\n\t/*Set EDCA param reg after update cur_wireless_mode & update_capinfo*/\n\tif (pregpriv->wifi_spec == 1)\n\t\trtw_set_hw_wmm_param(padapter);\n\t\n\t/*pmlmeext->bstart_bss = _TRUE;*/\n}\n\nint rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len)\n{\n\tint ret=_SUCCESS;\n\tu8 *p;\n\tu8 *pHT_caps_ie=NULL;\n\tu8 *pHT_info_ie=NULL;\n\tu16 cap, ht_cap=_FALSE;\n\tuint ie_len = 0;\n\tint group_cipher, pairwise_cipher;\t\n\tu8\tchannel, network_type, supportRate[NDIS_802_11_LENGTH_RATES_EX];\n\tint supportRateNum = 0;\n\tu8 OUI1[] = {0x00, 0x50, 0xf2,0x01};\n\tu8 wps_oui[4]={0x0,0x50,0xf2,0x04};\n\tu8 WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};\t\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX *pbss_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\t\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ie = pbss_network->IEs;\n\tu8 vht_cap=_FALSE;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 rf_num = 0;\n\t\n\t/* SSID */\n\t/* Supported rates */\n\t/* DS Params */\n\t/* WLAN_EID_COUNTRY */\n\t/* ERP Information element */\n\t/* Extended supported rates */\n\t/* WPA/WPA2 */\n\t/* Wi-Fi Wireless Multimedia Extensions */\n\t/* ht_capab, ht_oper */\n\t/* WPS IE */\n\n\tDBG_871X(\"%s, len=%d\\n\", __FUNCTION__, len);\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn _FAIL;\n\n\n\tif(len>MAX_IE_SZ)\n\t\treturn _FAIL;\n\t\n\tpbss_network->IELength = len;\n\n\t_rtw_memset(ie, 0, MAX_IE_SZ);\n\t\n\t_rtw_memcpy(ie, pbuf, pbss_network->IELength);\n\n\n\tif(pbss_network->InfrastructureMode!=Ndis802_11APMode)\n\t\treturn _FAIL;\n\n\n\trtw_ap_check_scan(padapter);\n\t\n\n\tpbss_network->Rssi = 0;\n\n\t_rtw_memcpy(pbss_network->MacAddress, adapter_mac_addr(padapter), ETH_ALEN);\n\t\n\t//beacon interval\n\tp = rtw_get_beacon_interval_from_ie(ie);//ie + 8;\t// 8: TimeStamp, 2: Beacon Interval 2:Capability\n\t//pbss_network->Configuration.BeaconPeriod = le16_to_cpu(*(unsigned short*)p);\n\tpbss_network->Configuration.BeaconPeriod = RTW_GET_LE16(p);\n\t\n\t//capability\n\t//cap = *(unsigned short *)rtw_get_capability_from_ie(ie);\n\t//cap = le16_to_cpu(cap);\n\tcap = RTW_GET_LE16(ie);\n\n\t//SSID\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->IELength -_BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t{\n\t\t_rtw_memset(&pbss_network->Ssid, 0, sizeof(NDIS_802_11_SSID));\n\t\t_rtw_memcpy(pbss_network->Ssid.Ssid, (p + 2), ie_len);\n\t\tpbss_network->Ssid.SsidLength = ie_len;\n\t\t#ifdef CONFIG_P2P\n\t\t_rtw_memcpy(padapter->wdinfo.p2p_group_ssid, pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);\n\t\tpadapter->wdinfo.p2p_group_ssid_len = pbss_network->Ssid.SsidLength;\n\t\t#endif\n\t}\n\n\t//chnnel\n\tchannel = 0;\n\tpbss_network->Configuration.Length = 0;\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _DSSET_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t\tchannel = *(p + 2);\n\n\tpbss_network->Configuration.DSConfig = channel;\n\n\t\n\t_rtw_memset(supportRate, 0, NDIS_802_11_LENGTH_RATES_EX);\n\t// get supported rates\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\t\n\tif (p !=  NULL) \n\t{\n\t\t_rtw_memcpy(supportRate, p+2, ie_len);\t\n\t\tsupportRateNum = ie_len;\n\t}\n\t\n\t//get ext_supported rates\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->IELength - _BEACON_IE_OFFSET_);\t\n\tif (p !=  NULL)\n\t{\n\t\t_rtw_memcpy(supportRate+supportRateNum, p+2, ie_len);\n\t\tsupportRateNum += ie_len;\n\t\n\t}\n\n\tnetwork_type = rtw_check_network_type(supportRate, supportRateNum, channel);\n\n\trtw_set_supported_rate(pbss_network->SupportedRates, network_type);\n\n\n\t//parsing ERP_IE\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t{\n\t\tERP_IE_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)p);\n\t}\n\n\t//update privacy/security\n\tif (cap & BIT(4))\n\t\tpbss_network->Privacy = 1;\n\telse\n\t\tpbss_network->Privacy = 0;\n\n\tpsecuritypriv->wpa_psk = 0;\n\n\t//wpa2\n\tgroup_cipher = 0; pairwise_cipher = 0;\n\tpsecuritypriv->wpa2_group_cipher = _NO_PRIVACY_;\n\tpsecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_;\t\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\t\t\n\tif(p && ie_len>0)\n\t{\n\t\tif(rtw_parse_wpa2_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpsecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\t\n\t\t\tpsecuritypriv->dot8021xalg = 1;//psk,  todo:802.1x\n\t\t\tpsecuritypriv->wpa_psk |= BIT(1);\n\n\t\t\tpsecuritypriv->wpa2_group_cipher = group_cipher;\n\t\t\tpsecuritypriv->wpa2_pairwise_cipher = pairwise_cipher;\n#if 0\n\t\t\tswitch(group_cipher)\n\t\t\t{\n\t\t\t\tcase WPA_CIPHER_NONE:\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_group_cipher = _NO_PRIVACY_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_WEP40:\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_group_cipher = _WEP40_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_TKIP:\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_group_cipher = _TKIP_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_CCMP:\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_group_cipher = _AES_;\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_WEP104:\t\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_group_cipher = _WEP104_;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch(pairwise_cipher)\n\t\t\t{\n\t\t\t\tcase WPA_CIPHER_NONE:\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_pairwise_cipher = _NO_PRIVACY_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_WEP40:\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_pairwise_cipher = _WEP40_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_TKIP:\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_pairwise_cipher = _TKIP_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_CCMP:\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_pairwise_cipher = _AES_;\n\t\t\t\tbreak;\n\t\t\t\tcase WPA_CIPHER_WEP104:\t\t\t\t\t\n\t\t\t\tpsecuritypriv->wpa2_pairwise_cipher = _WEP104_;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\t\t\t\n\t\t}\n\t\t\n\t}\n\n\t//wpa\n\tie_len = 0;\n\tgroup_cipher = 0; pairwise_cipher = 0;\n\tpsecuritypriv->wpa_group_cipher = _NO_PRIVACY_;\n\tpsecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_;\t\n\tfor (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2))\n\t{\n\t\tp = rtw_get_ie(p, _SSN_IE_1_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));\t\t\n\t\tif ((p) && (_rtw_memcmp(p+2, OUI1, 4)))\n\t\t{\n\t\t\tif(rtw_parse_wpa_ie(p, ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t\t{\n\t\t\t\tpsecuritypriv->dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\t\t\n\t\t\t\tpsecuritypriv->dot8021xalg = 1;//psk,  todo:802.1x\n\n\t\t\t\tpsecuritypriv->wpa_psk |= BIT(0);\n\n\t\t\t\tpsecuritypriv->wpa_group_cipher = group_cipher;\n\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = pairwise_cipher;\n\n#if 0\n\t\t\t\tswitch(group_cipher)\n\t\t\t\t{\n\t\t\t\t\tcase WPA_CIPHER_NONE:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_group_cipher = _NO_PRIVACY_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_WEP40:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_group_cipher = _WEP40_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_TKIP:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_group_cipher = _TKIP_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_CCMP:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_group_cipher = _AES_;\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_WEP104:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_group_cipher = _WEP104_;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tswitch(pairwise_cipher)\n\t\t\t\t{\n\t\t\t\t\tcase WPA_CIPHER_NONE:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = _NO_PRIVACY_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_WEP40:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = _WEP40_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_TKIP:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = _TKIP_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_CCMP:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = _AES_;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase WPA_CIPHER_WEP104:\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->wpa_pairwise_cipher = _WEP104_;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n#endif\t\t\t\t\n\t\t\t}\n\n\t\t\tbreak;\n\t\t\t\n\t\t}\n\t\t\t\n\t\tif ((p == NULL) || (ie_len == 0))\n\t\t{\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t}\n\n\t//wmm\n\tie_len = 0;\n\tpmlmepriv->qospriv.qos_option = 0;\n\tif(pregistrypriv->wmm_enable)\n\t{\n\t\tfor (p = ie + _BEACON_IE_OFFSET_; ;p += (ie_len + 2))\n\t\t{\t\t\t\n\t\t\tp = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));\t\n\t\t\tif((p) && _rtw_memcmp(p+2, WMM_PARA_IE, 6)) \n\t\t\t{\n\t\t\t\tpmlmepriv->qospriv.qos_option = 1;\t\n\n\t\t\t\t*(p+8) |= BIT(7);//QoS Info, support U-APSD\n\t\t\t\t\n\t\t\t\t/* disable all ACM bits since the WMM admission control is not supported */\n\t\t\t\t*(p + 10) &= ~BIT(4); /* BE */\n\t\t\t\t*(p + 14) &= ~BIT(4); /* BK */\n\t\t\t\t*(p + 18) &= ~BIT(4); /* VI */\n\t\t\t\t*(p + 22) &= ~BIT(4); /* VO */\n\t\t\t\t\n\t\t\t\tbreak;\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ((p == NULL) || (ie_len == 0))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t}\n#ifdef CONFIG_80211N_HT\n\t//parsing HT_CAP_IE\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t{\n\t\tu8 rf_type=0;\n\t\tHT_CAP_AMPDU_FACTOR max_rx_ampdu_factor=MAX_AMPDU_FACTOR_64K;\n\t\tstruct rtw_ieee80211_ht_cap *pht_cap = (struct rtw_ieee80211_ht_cap *)(p+2);\n\n\t\tif (0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" HT_CAP_IE from upper layer:\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tdump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len);\n\t\t}\n\n\t\tpHT_caps_ie=p;\n\n\t\tht_cap = _TRUE;\n\t\tnetwork_type |= WIRELESS_11_24N;\n\n\t\trtw_ht_use_default_setting(padapter);\n\n\t\t/* Update HT Capabilities Info field */\n\t\tif (pmlmepriv->htpriv.sgi_20m == _FALSE)\n\t\t\tpht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_20);\n\n\t\tif (pmlmepriv->htpriv.sgi_40m == _FALSE)\n\t\t\tpht_cap->cap_info &= ~(IEEE80211_HT_CAP_SGI_40);\n\n\t\tif (!TEST_FLAG(pmlmepriv->htpriv.ldpc_cap, LDPC_HT_ENABLE_RX))\n\t\t{\n\t\t\tpht_cap->cap_info &= ~(IEEE80211_HT_CAP_LDPC_CODING);\n\t\t}\n\n\t\tif (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_TX))\n\t\t{\n\t\t\tpht_cap->cap_info &= ~(IEEE80211_HT_CAP_TX_STBC);\n\t\t}\t\t\n\n\t\tif (!TEST_FLAG(pmlmepriv->htpriv.stbc_cap, STBC_HT_ENABLE_RX))\n\t\t{\n\t\t\tpht_cap->cap_info &= ~(IEEE80211_HT_CAP_RX_STBC_3R);\n\t\t}\n\n\t\t/* Update A-MPDU Parameters field */\n\t\tpht_cap->ampdu_params_info &= ~(IEEE80211_HT_CAP_AMPDU_FACTOR|IEEE80211_HT_CAP_AMPDU_DENSITY);\n\n\t\tif((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) ||\n\t\t\t(psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP))\n\t\t{\n\t\t\tpht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&(0x07<<2));\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\tpht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);\t\n\t\t}\t\n\n\t\trtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\n\t\tpht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_FACTOR & max_rx_ampdu_factor); //set  Max Rx AMPDU size  to 64K\n\t\t\n\t\t_rtw_memcpy(&(pmlmeinfo->HT_caps), pht_cap, sizeof(struct HT_caps_element));\n\n\t\t/* Update Supported MCS Set field */\n\t\t{\n\t\t\tint i;\n\n\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\t\t\t/* RX MCS Bitmask */\n\t\t\tswitch(rf_type)\n\t\t\t{\n\t\t\t\tcase RF_1T1R:\n\t\t\t\tcase RF_1T2R: //?\n\t\t\t\t\tset_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_1R);\n\t\t\t\t\tbreak;\n\t\t\t\tcase RF_2T2R:\n\t\t\t\t\tset_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_2R);\n\t\t\t\t\tbreak;\n\t\t\t\tcase RF_3T3R:\n\t\t\t\t\tset_mcs_rate_by_mask(HT_CAP_ELE_RX_MCS_MAP(pht_cap), MCS_RATE_3R);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBG_871X(\"[warning] rf_type %d is not expected\\n\", rf_type);\n\t\t\t}\n\t\t\tfor (i = 0; i < 10; i++)\n\t\t\t\t*(HT_CAP_ELE_RX_MCS_MAP(pht_cap)+i) &= padapter->mlmeextpriv.default_supported_mcs_set[i];\n\t\t}\n\n#ifdef CONFIG_BEAMFORMING\n\t\t// Use registry value to enable HT Beamforming.\n\t\t// ToDo: use configure file to set these capability.\n\t\tpht_cap->tx_BF_cap_info = 0;\n\n\t\t// HT Beamformer\n\t\tif(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE))\n\t\t{\n\t\t\t// Transmit NDP Capable\n\t\t\tSET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(pht_cap, 1);\n\t\t\t// Explicit Compressed Steering Capable\n\t\t\tSET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pht_cap, 1);\n\t\t\t// Compressed Steering Number Antennas\n\t\t\tSET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, 1);\n\t\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num);\n\t\t\tSET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pht_cap, rf_num);\t\t\n\t\t}\n\n\t\t// HT Beamformee\n\t\tif(TEST_FLAG(pmlmepriv->htpriv.beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE))\n\t\t{\n\t\t\t// Receive NDP Capable\n\t\t\tSET_HT_CAP_TXBF_RECEIVE_NDP_CAP(pht_cap, 1);\n\t\t\t// Explicit Compressed Beamforming Feedback Capable\n\t\t\tSET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pht_cap, 2);\n\t\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num);\n\t\t\tSET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pht_cap, rf_num);\n\t\t}\n#endif //CONFIG_BEAMFORMING\n\n\t\t_rtw_memcpy(&pmlmepriv->htpriv.ht_cap, p+2, ie_len);\n\n\t\tif (0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" HT_CAP_IE driver masked:\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tdump_ht_cap_ie_content(RTW_DBGDUMP, p+2, ie_len);\n\t\t}\n\t}\n\n\t//parsing HT_INFO_IE\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t{\n\t\tpHT_info_ie=p;\n\t}\n#endif //CONFIG_80211N_HT\n\tswitch(network_type)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\tpbss_network->NetworkTypeInUse = Ndis802_11DS;\n\t\t\tbreak;\t\n\t\tcase WIRELESS_11G:\n\t\tcase WIRELESS_11BG:\n             case WIRELESS_11G_24N:\n\t\tcase WIRELESS_11BG_24N:\n\t\t\tpbss_network->NetworkTypeInUse = Ndis802_11OFDM24;\n\t\t\tbreak;\n\t\tcase WIRELESS_11A:\n\t\t\tpbss_network->NetworkTypeInUse = Ndis802_11OFDM5;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tpbss_network->NetworkTypeInUse = Ndis802_11OFDM24;\n\t\t\tbreak;\n\t}\n\t\n\tpmlmepriv->cur_network.network_type = network_type;\n\n#ifdef CONFIG_80211N_HT\n\tpmlmepriv->htpriv.ht_option = _FALSE;\n\n\tif( (psecuritypriv->wpa2_pairwise_cipher&WPA_CIPHER_TKIP) ||\n\t\t      (psecuritypriv->wpa_pairwise_cipher&WPA_CIPHER_TKIP))\n\t{\t\n\t\t//todo:\n\t\t//ht_cap = _FALSE;\n\t}\n\t\t      \n\t//ht_cap\t\n\tif(pregistrypriv->ht_enable && ht_cap==_TRUE)\n\t{\t\t\n\t\tpmlmepriv->htpriv.ht_option = _TRUE;\n\t\tpmlmepriv->qospriv.qos_option = 1;\n\n\t\tif(pregistrypriv->ampdu_enable==1)\n\t\t{\n\t\t\tpmlmepriv->htpriv.ampdu_enable = _TRUE;\n\t\t}\n\n\t\tHT_caps_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_caps_ie);\n\t\t\n\t\tHT_info_handler(padapter, (PNDIS_802_11_VARIABLE_IEs)pHT_info_ie);\n\t}\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n\n\t//Parsing VHT CAP IE\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pbss_network->IELength - _BEACON_IE_OFFSET_));\n\tif(p && ie_len>0)\n\t{\t\n\t\tvht_cap = _TRUE; \n\t}\n\t//Parsing VHT OPERATION IE\n\t\n\n\tpmlmepriv->vhtpriv.vht_option = _FALSE;\n\t// if channel in 5G band, then add vht ie .\n\tif ((pbss_network->Configuration.DSConfig > 14) && \n\t\t(pmlmepriv->htpriv.ht_option == _TRUE) &&\n\t\t(pregistrypriv->vht_enable)) \n\t{\n\t\tif(vht_cap == _TRUE)\n\t\t{\n\t\t\tpmlmepriv->vhtpriv.vht_option = _TRUE;\n\t\t}\n\t\telse if(pregistrypriv->vht_enable == 2) // auto enabled\n\t\t{\n\t\t\tu8\tcap_len, operation_len;\n\n\t\t\trtw_vht_use_default_setting(padapter);\n\n\t\t\t{\n\t\t\t\t/* VHT Operation mode notifiy bit in Extended IE (127) */\n\t\t\t\tuint len = 0;\n\t\t\t\t\n\t\t\t\tSET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(pmlmepriv->ext_capab_ie_data, 1);\n\t\t\t\tpmlmepriv->ext_capab_ie_len = 10;\n\t\t\t\trtw_set_ie(pbss_network->IEs + pbss_network->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len);\n\t\t\t\tpbss_network->IELength += pmlmepriv->ext_capab_ie_len;\n\t\t\t}\n\t\t\t\n\t\t\t// VHT Capabilities element\n\t\t\tcap_len = rtw_build_vht_cap_ie(padapter, pbss_network->IEs + pbss_network->IELength);\n\t\t\tpbss_network->IELength += cap_len;\n\n\t\t\t// VHT Operation element\n\t\t\toperation_len = rtw_build_vht_operation_ie(padapter, pbss_network->IEs + pbss_network->IELength, pbss_network->Configuration.DSConfig);\n\t\t\tpbss_network->IELength += operation_len;\n\n\t\t\tpmlmepriv->vhtpriv.vht_option = _TRUE;\n\t\t}\t\t\n\t}\n#endif //CONFIG_80211AC_VHT\n\n\tpbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX  *)pbss_network);\n\n\trtw_ies_get_chbw(pbss_network->IEs + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_\n\t\t, &pmlmepriv->ori_ch, &pmlmepriv->ori_bw, &pmlmepriv->ori_offset);\n\trtw_warn_on(pmlmepriv->ori_ch == 0);\n\n{\n\t/* alloc sta_info for ap itself */\n\n\tstruct sta_info *sta;\n\n\tsta = rtw_get_stainfo(&padapter->stapriv, pbss_network->MacAddress);\n\tif (!sta) {\n\t\tsta = rtw_alloc_stainfo(&padapter->stapriv, pbss_network->MacAddress);\n\t\tif (sta == NULL) \n\t\t\treturn _FAIL;\n\t}\n}\n\n\trtw_startbss_cmd(padapter, RTW_CMDF_WAIT_ACK);\n\n\trtw_indicate_connect( padapter);\n\n\tpmlmepriv->cur_network.join_res = _TRUE;//for check if already set beacon\n\t\t\n\t//update bc/mc sta_info\n\t//update_bmc_sta(padapter);\n\n\treturn ret;\n\n}\n\nvoid rtw_set_macaddr_acl(_adapter *padapter, int mode)\n{\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\n\tDBG_871X(\"%s, mode=%d\\n\", __func__, mode);\n\n\tpacl_list->mode = mode;\n}\n\nint rtw_acl_add_sta(_adapter *padapter, u8 *addr)\n{\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tu8 added = _FALSE;\n\tint i, ret=0;\n\tstruct rtw_wlan_acl_node *paclnode;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t_queue\t*pacl_node_q =&pacl_list->acl_node_q;\t\n\n\tDBG_871X(\"%s(acl_num=%d)=\" MAC_FMT \"\\n\", __func__, pacl_list->num, MAC_ARG(addr));\t\n\n\tif((NUM_ACL-1) < pacl_list->num)\n\t\treturn (-1);\t\n\n\n\t_enter_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\tphead = get_list_head(pacl_node_q);\n\tplist = get_next(phead);\n\t\t\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpaclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);\n\t\tplist = get_next(plist);\n\n\t\tif(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN))\n\t\t{\n\t\t\tif(paclnode->valid == _TRUE)\n\t\t\t{\n\t\t\t\tadded = _TRUE;\n\t\t\t\tDBG_871X(\"%s, sta has been added\\n\", __func__);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\n\t}\n\t\n\t_exit_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\n\tif(added == _TRUE)\n\t\treturn ret;\n\t\n\n\t_enter_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\tfor(i=0; i< NUM_ACL; i++)\n\t{\n\t\tpaclnode = &pacl_list->aclnode[i];\n\n\t\tif(paclnode->valid == _FALSE)\n\t\t{\n\t\t\t_rtw_init_listhead(&paclnode->list);\n\t\n\t\t\t_rtw_memcpy(paclnode->addr, addr, ETH_ALEN);\n\t\t\n\t\t\tpaclnode->valid = _TRUE;\n\n\t\t\trtw_list_insert_tail(&paclnode->list, get_list_head(pacl_node_q));\n\t\n\t\t\tpacl_list->num++;\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBG_871X(\"%s, acl_num=%d\\n\", __func__, pacl_list->num);\n\t\n\t_exit_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\treturn ret;\n}\n\nint rtw_acl_remove_sta(_adapter *padapter, u8 *addr)\n{\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tint i, ret=0;\n\tstruct rtw_wlan_acl_node *paclnode;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t_queue\t*pacl_node_q =&pacl_list->acl_node_q;\n\tu8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\t//Baddr is used for clearing acl_list\n\n\tDBG_871X(\"%s(acl_num=%d)=\" MAC_FMT \"\\n\", __func__, pacl_list->num, MAC_ARG(addr));\t\n\n\t_enter_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\tphead = get_list_head(pacl_node_q);\n\tplist = get_next(phead);\n\t\t\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpaclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);\n\t\tplist = get_next(plist);\n\n\t\tif(_rtw_memcmp(paclnode->addr, addr, ETH_ALEN) || _rtw_memcmp(baddr, addr, ETH_ALEN))\n\t\t{\n\t\t\tif(paclnode->valid == _TRUE)\n\t\t\t{\n\t\t\t\tpaclnode->valid = _FALSE;\n\n\t\t\t\trtw_list_delete(&paclnode->list);\n\t\t\t\t\n\t\t\t\tpacl_list->num--;\n\t\t\t}\n\t\t}\t\t\n\t}\n\t\n\t_exit_critical_bh(&(pacl_node_q->lock), &irqL);\n\n\tDBG_871X(\"%s, acl_num=%d\\n\", __func__, pacl_list->num);\n\t\n\treturn ret;\n\n}\n\nu8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct set_stakey_parm\t*psetstakey_para;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\t\n\tu8\tres=_SUCCESS;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif ( ph2c == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpsetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));\n\tif(psetstakey_para==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);\n\n\n\tpsetstakey_para->algorithm = (u8)psta->dot118021XPrivacy;\n\n\t_rtw_memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN);\t\n\t\n\t_rtw_memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16);\n\n\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\nexit:\n\n\treturn res;\n\t\n}\n\nstatic int rtw_ap_set_key(_adapter *padapter, u8 *key, u8 alg, int keyid, u8 set_tx)\n{\n\tu8 keylen;\n\tstruct cmd_obj* pcmd;\n\tstruct setkey_parm *psetkeyparm;\n\tstruct cmd_priv\t*pcmdpriv=&(padapter->cmdpriv);\t\n\tint res=_SUCCESS;\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\tpcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(pcmd==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tpsetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));\n\tif(psetkeyparm==NULL){\n\t\trtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));\n\t\t\n\tpsetkeyparm->keyid=(u8)keyid;\n\tif (is_wep_enc(alg))\n\t\tpadapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid);\n\n\tpsetkeyparm->algorithm = alg;\n\n\tpsetkeyparm->set_tx = set_tx;\n\n\tswitch(alg)\n\t{\n\t\tcase _WEP40_:\t\t\t\t\t\n\t\t\tkeylen = 5;\n\t\t\tbreak;\n\t\tcase _WEP104_:\n\t\t\tkeylen = 13;\t\t\t\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\tcase _TKIP_WTMIC_:\n\t\tcase _AES_:\n\t\tdefault:\n\t\t\tkeylen = 16;\n\t}\n\n\t_rtw_memcpy(&(psetkeyparm->key[0]), key, keylen);\n\t\n\tpcmd->cmdcode = _SetKey_CMD_;\n\tpcmd->parmbuf = (u8 *)psetkeyparm;   \n\tpcmd->cmdsz =  (sizeof(struct setkey_parm));  \n\tpcmd->rsp = NULL;\n\tpcmd->rspsz = 0;\n\n\n\t_rtw_init_listhead(&pcmd->list);\n\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmd);\n\nexit:\n\n\treturn res;\n}\n\nint rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\treturn rtw_ap_set_key(padapter, key, alg, keyid, 1);\n}\n\nint rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx)\n{\n\tu8 alg;\n\n\tswitch(keylen)\n\t{\n\t\tcase 5:\n\t\t\talg =_WEP40_;\t\t\t\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\talg =_WEP104_;\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\talg =_NO_PRIVACY_;\t\t\t\n\t}\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\treturn rtw_ap_set_key(padapter, key, alg, keyid, set_tx);\n}\n\nu8 rtw_ap_bmc_frames_hdl(_adapter *padapter)\n{\n#define HIQ_XMIT_COUNTS (6)\n\t_irqL irqL;\n\tstruct sta_info *psta_bmc;\n\t_list\t*xmitframe_plist, *xmitframe_phead;\n\tstruct xmit_frame *pxmitframe = NULL;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct sta_priv  *pstapriv = &padapter->stapriv;\n\tbool update_tim = _FALSE;\n\n\n\tif (padapter->registrypriv.wifi_spec != 1)\n\t\treturn H2C_SUCCESS;\n\n\t\n\tpsta_bmc = rtw_get_bcmc_stainfo(padapter);\n\tif (!psta_bmc)\n\t\treturn H2C_SUCCESS;\n\n\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tif ((pstapriv->tim_bitmap & BIT(0)) && (psta_bmc->sleepq_len > 0)) {\n\t\tint tx_counts = 0;\n\t\t\n\t\t_update_beacon(padapter, _TIM_IE_, NULL, _FALSE, \"update TIM with TIB=1\");\n\n\t\tDBG_871X(\"sleepq_len of bmc_sta = %d\\n\", psta_bmc->sleepq_len);\n\n\t\txmitframe_phead = get_list_head(&psta_bmc->sleep_q);\n\t\txmitframe_plist = get_next(xmitframe_phead);\n\n\t\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {\n\t\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\t\trtw_list_delete(&pxmitframe->list);\n\n\t\t\tpsta_bmc->sleepq_len--;\n\t\t\ttx_counts++;\n\t\t\t\n\t\t\tif (psta_bmc->sleepq_len > 0)\n\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\telse\n\t\t\t\tpxmitframe->attrib.mdata = 0;\n\n\t\t\tif (tx_counts == HIQ_XMIT_COUNTS)\n\t\t\t\tpxmitframe->attrib.mdata = 0;\n\t\t\t\n\t\t\tpxmitframe->attrib.triggered = 1;\n\n\t\t\tif (xmitframe_hiq_filter(pxmitframe) == _TRUE)\n\t\t\t\tpxmitframe->attrib.qsel = QSLT_HIGH;/*HIQ*/\n\n\t\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\n\t\t\tif (tx_counts == HIQ_XMIT_COUNTS)\n\t\t\t\tbreak;\n\t\t\t\n\t\t}\n\n\t} else {\n\t\tif (psta_bmc->sleepq_len == 0) {\n\t\t\t\n\t\t\t/*DBG_871X(\"sleepq_len of bmc_sta = %d\\n\", psta_bmc->sleepq_len);*/\n\t\t\t\n\t\t\tif (pstapriv->tim_bitmap & BIT(0))\n\t\t\t\tupdate_tim = _TRUE;\n\n\t\t\tpstapriv->tim_bitmap &= ~BIT(0);\n\t\t\tpstapriv->sta_dz_bitmap &= ~BIT(0);\n\n\t\t\tif (update_tim == _TRUE) {\n\t\t\t\tDBG_871X(\"clear TIB\\n\");\n\t\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"bmc sleepq and HIQ empty\");\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n/*\n\t//HIQ Check\n\trtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);\n\n\twhile (_FALSE == empty && rtw_get_passing_time_ms(start) < 3000)\n\t{\n\t\trtw_msleep_os(100);\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);\n\t}\n\n\n\tprintk(\"check if hiq empty=%d\\n\", empty);\n*/\n\n\treturn H2C_SUCCESS;\n}\n\n#ifdef CONFIG_NATIVEAP_MLME\n\nstatic void associated_stainfo_update(_adapter *padapter, struct sta_info *psta, u32 sta_info_type)\n{\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tDBG_871X(\"%s: \"MAC_FMT\", updated_type=0x%x\\n\", __func__, MAC_ARG(psta->hwaddr), sta_info_type);\n\t\n\tif (sta_info_type & STA_INFO_UPDATE_BW) {\n\n\t\tif ((psta->flags & WLAN_STA_HT) && !psta->ht_20mhz_set) {\n\t\t\tif (pmlmepriv->sw_to_20mhz) {\n\t\t\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\t\t\t/*psta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;*/\n\t\t\t\tpsta->htpriv.sgi_40m = _FALSE;\t\t\t\t\n\t\t\t} else {\n\t\t\t\t/*TODO: Switch back to 40MHZ?80MHZ*/\n\t\t\t}\n\t\t}\t\t\n\t}\n\n/*\n\tif (sta_info_type & STA_INFO_UPDATE_RATE) {\n\t\t\n\t}\n*/\t\n\n\tif (sta_info_type & STA_INFO_UPDATE_PROTECTION_MODE)\n\t\tVCS_update(padapter, psta);\n\t\n/*\n\tif (sta_info_type & STA_INFO_UPDATE_CAP) {\n\t\t\n\t}\n\n\tif (sta_info_type & STA_INFO_UPDATE_HT_CAP) {\n\t\t\n\t}\n\n\tif (sta_info_type & STA_INFO_UPDATE_VHT_CAP) {\n\t\t\n\t}\t\n*/\n\n}\n\nstatic void update_bcn_ext_capab_ie(_adapter *padapter)\n{\n\tsint ie_len = 0;\n\tunsigned char\t*pbuf;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);\n\tu8 *ie = pnetwork->IEs; \n\tu8 null_extcap_data[8] = {0};\n\t\n\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_CAP_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\tif (pbuf && ie_len > 0)\n\t\trtw_remove_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_);\n\n\tif ((pmlmepriv->ext_capab_ie_len > 0) && \n\t\t(_rtw_memcmp(pmlmepriv->ext_capab_ie_data, null_extcap_data, sizeof(null_extcap_data)) == _FALSE))\n\t\trtw_add_bcn_ie(padapter, pnetwork, _EXT_CAP_IE_, pmlmepriv->ext_capab_ie_data, pmlmepriv->ext_capab_ie_len);\n\t\n}\n\nstatic void update_bcn_fixed_ie(_adapter *padapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n}\n\nstatic void update_bcn_erpinfo_ie(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);\n\tunsigned char *p, *ie = pnetwork->IEs;\n\tu32 len = 0;\n\n\tDBG_871X(\"%s, ERP_enable=%d\\n\", __FUNCTION__, pmlmeinfo->ERP_enable);\n\n\tif(!pmlmeinfo->ERP_enable)\n\t\treturn;\n\n\t//parsing ERP_IE\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _ERPINFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\tif(p && len>0)\n\t{\n\t\tPNDIS_802_11_VARIABLE_IEs pIE = (PNDIS_802_11_VARIABLE_IEs)p;\n\n\t\tif (pmlmepriv->num_sta_non_erp == 1)\n\t\t\tpIE->data[0] |= RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION;\n\t\telse\n\t\t\tpIE->data[0] &= ~(RTW_ERP_INFO_NON_ERP_PRESENT|RTW_ERP_INFO_USE_PROTECTION);\n\n\t\tif(pmlmepriv->num_sta_no_short_preamble > 0)\n\t\t\tpIE->data[0] |= RTW_ERP_INFO_BARKER_PREAMBLE_MODE;\n\t\telse\n\t\t\tpIE->data[0] &= ~(RTW_ERP_INFO_BARKER_PREAMBLE_MODE);\n\t\n\t\tERP_IE_handler(padapter, pIE);\n\t}\n\t\n}\n\nstatic void update_bcn_htcap_ie(_adapter *padapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n}\n\nstatic void update_bcn_htinfo_ie(_adapter *padapter)\n{\t\n\t/*\n\tu8 beacon_updated = _FALSE;\n\tu32 sta_info_update_type = STA_INFO_UPDATE_NONE;\t\n\t*/\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);\n\tunsigned char *p, *ie = pnetwork->IEs;\n\tu32 len = 0;\t\n\n\tif (pmlmepriv->htpriv.ht_option == _FALSE) \n\t\treturn;\n\n\tif (pmlmeinfo->HT_info_enable != 1)\n\t\treturn;\n\n\n\tDBG_871X(\"%s current operation mode=0x%X\\n\",\n\t\t   __FUNCTION__, pmlmepriv->ht_op_mode);\n\n\tDBG_871X(\"num_sta_40mhz_intolerant(%d), 20mhz_width_req(%d), intolerant_ch_rpt(%d), olbc(%d)\\n\", \n\t\t\t\t\tpmlmepriv->num_sta_40mhz_intolerant, pmlmepriv->ht_20mhz_width_req, pmlmepriv->ht_intolerant_ch_reported, pmlmepriv->olbc);\n\n\t/*parsing HT_INFO_IE, currently only update ht_op_mode - pht_info->infos[1] & pht_info->infos[2] for wifi logo test*/\n\tp = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\tif (p && len > 0) {\n\t\tstruct HT_info_element *pht_info = NULL;\n\t\t\n\t\tpht_info = (struct HT_info_element *)(p + 2);\t\t\n\n\t\t/* for STA Channel Width/Secondary Channel Offset*/\n\t\tif ((pmlmepriv->sw_to_20mhz == 0) && (pmlmeext->cur_channel <= 14)) {\n\t\t\tif ((pmlmepriv->num_sta_40mhz_intolerant > 0) || (pmlmepriv->ht_20mhz_width_req == _TRUE) \n\t\t\t\t|| (pmlmepriv->ht_intolerant_ch_reported == _TRUE) || (pmlmepriv->olbc == _TRUE)) {\n\t\t\t\tSET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, 0);\n\t\t\t\tSET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 0);\n\n\t\t\t\tpmlmepriv->sw_to_20mhz = 1;\n\t\t\t\t/*\n\t\t\t\tsta_info_update_type |= STA_INFO_UPDATE_BW;\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\t*/\n\t\n\t\t\t\tDBG_871X(\"%s:switching to 20Mhz\\n\", __FUNCTION__);\t\n\n\t\t\t\t/*TODO : cur_bwmode/cur_ch_offset switches to 20Mhz*/\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ((pmlmepriv->num_sta_40mhz_intolerant == 0) && (pmlmepriv->ht_20mhz_width_req == _FALSE) \n\t\t\t\t&& (pmlmepriv->ht_intolerant_ch_reported == _FALSE) && (pmlmepriv->olbc == _FALSE)) {\n\n\t\t\t\tif (pmlmeext->cur_bwmode >= CHANNEL_WIDTH_40) {\n\t\t\t\t\t\n\t\t\t\t\tSET_HT_OP_ELE_STA_CHL_WIDTH(pht_info, 1);\n\n\t\t\t\t\tSET_HT_OP_ELE_2ND_CHL_OFFSET(pht_info, \n\t\t\t\t\t(pmlmeext->cur_ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER) ? \n\t\t\t\t\t\tHT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE : HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW);\n\t\t\t\t\t\n\t\t\t\t\tpmlmepriv->sw_to_20mhz = 0;\n\t\t\t\t\t/*\n\t\t\t\t\tsta_info_update_type |= STA_INFO_UPDATE_BW;\n\t\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\t\t*/\n\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"%s:switching back to 40Mhz\\n\", __FUNCTION__);\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* to update  ht_op_mode*/\n\t\t*(u16 *)(pht_info->infos + 1) = cpu_to_le16(pmlmepriv->ht_op_mode);\n\t\t\n\t}\t\n\n\t/*associated_clients_update(padapter, beacon_updated, sta_info_update_type);*/\n\n}\n\nstatic void update_bcn_rsn_ie(_adapter *padapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n}\n\nstatic void update_bcn_wpa_ie(_adapter *padapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n}\n\nstatic void update_bcn_wmm_ie(_adapter *padapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n}\n\nstatic void update_bcn_wps_ie(_adapter *padapter)\n{\n\tu8 *pwps_ie=NULL, *pwps_ie_src, *premainder_ie, *pbackup_remainder_ie=NULL;\n\tuint wps_ielen=0, wps_offset, remainder_ielen;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);\n\tunsigned char *ie = pnetwork->IEs;\n\tu32 ielen = pnetwork->IELength;\n\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwps_ie = rtw_get_wps_ie(ie+_FIXED_IE_LENGTH_, ielen-_FIXED_IE_LENGTH_, NULL, &wps_ielen);\n\t\n\tif(pwps_ie==NULL || wps_ielen==0)\n\t\treturn;\n\n\tpwps_ie_src = pmlmepriv->wps_beacon_ie;\n\tif(pwps_ie_src == NULL)\n\t\treturn;\n\n\twps_offset = (uint)(pwps_ie-ie);\n\n\tpremainder_ie = pwps_ie + wps_ielen;\n\n\tremainder_ielen = ielen - wps_offset - wps_ielen;\n\n\tif(remainder_ielen>0)\n\t{\n\t\tpbackup_remainder_ie = rtw_malloc(remainder_ielen);\n\t\tif(pbackup_remainder_ie)\n\t\t\t_rtw_memcpy(pbackup_remainder_ie, premainder_ie, remainder_ielen);\n\t}\n\n\twps_ielen = (uint)pwps_ie_src[1];//to get ie data len\n\tif((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ)\n\t{\n\t\t_rtw_memcpy(pwps_ie, pwps_ie_src, wps_ielen+2);\n\t\tpwps_ie += (wps_ielen+2);\n\n\t\tif(pbackup_remainder_ie)\n\t\t\t_rtw_memcpy(pwps_ie, pbackup_remainder_ie, remainder_ielen);\n\n\t\t//update IELength\n\t\tpnetwork->IELength = wps_offset + (wps_ielen+2) + remainder_ielen;\n\t}\n\n\tif(pbackup_remainder_ie)\n\t\trtw_mfree(pbackup_remainder_ie, remainder_ielen);\n\t\n\t// deal with the case without set_tx_beacon_cmd() in update_beacon() \n#if defined( CONFIG_INTERRUPT_BASED_TXBCN ) || defined( CONFIG_PCI_HCI )\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\tu8 sr = 0;\n\t\trtw_get_wps_attr_content(pwps_ie_src,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\n\t\n\t\tif( sr ) {\n\t\t\tset_fwstate(pmlmepriv, WIFI_UNDER_WPS);\n\t\t\tDBG_871X(\"%s, set WIFI_UNDER_WPS\\n\", __func__);\n\t\t}\n\t}\n#endif\n}\n\nstatic void update_bcn_p2p_ie(_adapter *padapter)\n{\n\n}\n\nstatic void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif(_rtw_memcmp(RTW_WPA_OUI, oui, 4))\n\t{\n\t\tupdate_bcn_wpa_ie(padapter);\n\t}\n\telse if(_rtw_memcmp(WMM_OUI, oui, 4))\n\t{\n\t\tupdate_bcn_wmm_ie(padapter);\n\t}\n\telse if(_rtw_memcmp(WPS_OUI, oui, 4))\n\t{\n\t\tupdate_bcn_wps_ie(padapter);\n\t}\n\telse if(_rtw_memcmp(P2P_OUI, oui, 4))\n\t{\n\t\tupdate_bcn_p2p_ie(padapter);\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"unknown OUI type!\\n\");\n \t}\n\t\n\t\n}\n\nvoid _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag)\n{\n\t_irqL irqL;\n\tstruct mlme_priv *pmlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext;\n\t//struct mlme_ext_info\t*pmlmeinfo;\n\t\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif(!padapter)\n\t\treturn;\n\n\tpmlmepriv = &(padapter->mlmepriv);\n\tpmlmeext = &(padapter->mlmeextpriv);\n\t//pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(_FALSE == pmlmeext->bstart_bss)\n\t\treturn;\n\n\t_enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\n\n\tswitch(ie_id)\n\t{\n\t\tcase 0xFF:\n\n\t\t\tupdate_bcn_fixed_ie(padapter);//8: TimeStamp, 2: Beacon Interval 2:Capability\n\t\t\t\n\t\t\tbreak;\n\t\n\t\tcase _TIM_IE_:\n\t\t\t\n\t\t\tupdate_BCNTIM(padapter);\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase _ERPINFO_IE_:\n\n\t\t\tupdate_bcn_erpinfo_ie(padapter);\n\n\t\t\tbreak;\n\n\t\tcase _HT_CAPABILITY_IE_:\n\n\t\t\tupdate_bcn_htcap_ie(padapter);\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase _RSN_IE_2_:\n\n\t\t\tupdate_bcn_rsn_ie(padapter);\n\n\t\t\tbreak;\n\t\t\t\n\t\tcase _HT_ADD_INFO_IE_:\n\n\t\t\tupdate_bcn_htinfo_ie(padapter);\n\t\t\t\n\t\t\tbreak;\n\t\n\t\tcase _EXT_CAP_IE_:\n\n\t\t\tupdate_bcn_ext_capab_ie(padapter);\n\n\t\t\tbreak;\n\t\n\t\tcase _VENDOR_SPECIFIC_IE_:\n\n\t\t\tupdate_bcn_vendor_spec_ie(padapter, oui);\n\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tpmlmepriv->update_bcn = _TRUE;\n\t\n\t_exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\t\t\n\t\n#ifndef CONFIG_INTERRUPT_BASED_TXBCN \n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tif(tx)\n\t{\n\t\t//send_beacon(padapter);//send_beacon must execute on TSR level\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" ie_id:%u - %s\\n\", FUNC_ADPT_ARG(padapter), ie_id, tag);\n\t\tset_tx_beacon_cmd(padapter);\n\t}\n#else\n\t{\t\n\t\t//PCI will issue beacon when BCN interrupt occurs.\t\t\n\t}\n#endif\n#endif //!CONFIG_INTERRUPT_BASED_TXBCN\n\t\n}\n\n#ifdef CONFIG_80211N_HT\n\nvoid rtw_process_public_act_bsscoex(_adapter *padapter, u8 *pframe, uint frame_len)\n{\n\tstruct sta_info *psta;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 beacon_updated = _FALSE;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\t\n\tuint frame_body_len = frame_len - sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu8 category, action;\n\n\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\n\tif (psta == NULL) \n\t\treturn;\n\n\n\tcategory = frame_body[0];\n\taction = frame_body[1];\n\n\tif (frame_body_len > 0) {\n\t\tif ((frame_body[2] == EID_BSSCoexistence) && (frame_body[3] > 0)) {\t\t\t\n\t\t\tu8 ie_data = frame_body[4];\n\n\t\t\tif (ie_data & RTW_WLAN_20_40_BSS_COEX_40MHZ_INTOL) {\n\t\t\t\tif (psta->ht_40mhz_intolerant == 0) {\t\t\t\t\n\t\t\t\t\tpsta->ht_40mhz_intolerant = 1;\n\t\t\t\t\tpmlmepriv->num_sta_40mhz_intolerant++;\n\t\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\t}\t\n\t\t\t} else if (ie_data & RTW_WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ)\t{\t\t\t\t\n\t\t\t\tif (pmlmepriv->ht_20mhz_width_req == _FALSE) {\t\t\t\t\n\t\t\t\t\tpmlmepriv->ht_20mhz_width_req = _TRUE;\t\t\t\n\t\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\t}\t\n\t\t\t} else\n\t\t\t\tbeacon_updated = _FALSE;\n\t\t}\t\t\n\t}\n\n\tif (frame_body_len > 8) {\n\t\t/* if EID_BSSIntolerantChlReport ie exists */\n\t\tif ((frame_body[5] == EID_BSSIntolerantChlReport) && (frame_body[6] > 0)) {\n\t\t\t/*todo:*/\n\t\t\tif (pmlmepriv->ht_intolerant_ch_reported == _FALSE) {\t\t\t\t\n\t\t\t\tpmlmepriv->ht_intolerant_ch_reported = _TRUE;\t\t\t\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t}\n\t\t}\t\t\t\n\t}\n\n\tif (beacon_updated) {\n\t\t\n\t\tupdate_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);\n\t\n\t\tassociated_stainfo_update(padapter, psta, STA_INFO_UPDATE_BW);\n\t}\n\n\t\n\t\n}\n\nvoid rtw_process_ht_action_smps(_adapter *padapter, u8 *ta, u8 ctrl_field)\n{\n\tu8 e_field, m_field;\n\tstruct sta_info *psta;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tpsta = rtw_get_stainfo(pstapriv, ta);\n\tif (psta == NULL) \n\t\treturn;\n\n\te_field = (ctrl_field & BIT(0)) ? 1 : 0;\n\tm_field = (ctrl_field & BIT(1)) ? 1 : 0;\t\n\n\tif (e_field) {\n\n\t\t/* enable */\n\t\t/* 0:static SMPS, 1:dynamic SMPS, 3:SMPS disabled, 2:reserved*/\n\t\t \n\t\tif (m_field) /*mode*/\n\t\t\tpsta->htpriv.smps_cap = 1;\n\t\telse\n\t\t\tpsta->htpriv.smps_cap = 0;\n\t} else {\n\t\t/*disable*/\n\t\tpsta->htpriv.smps_cap = 3;\n\t}\n\n\trtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta);\n\n}\n\n/*\nop_mode\nSet to 0 (HT pure) under the followign conditions\n\t- all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or\n\t- all STAs in the BSS are 20 MHz HT in 20 MHz BSS\nSet to 1 (HT non-member protection) if there may be non-HT STAs\n\tin both the primary and the secondary channel\nSet to 2 if only HT STAs are associated in BSS,\n\thowever and at least one 20 MHz HT STA is associated\nSet to 3 (HT mixed mode) when one or more non-HT STAs are associated\n\t(currently non-GF HT station is considered as non-HT STA also)\n*/\nstatic int rtw_ht_operation_update(_adapter *padapter)\n{\n\tu16 cur_op_mode, new_op_mode;\n\tint op_mode_changes = 0;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct ht_priv\t*phtpriv_ap = &pmlmepriv->htpriv;\n\n\tif (pmlmepriv->htpriv.ht_option == _FALSE) \n\t\treturn 0;\n\t\n\t/*if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed)\n\t\treturn 0;*/\n\n\tDBG_871X(\"%s current operation mode=0x%X\\n\",\n\t\t   __FUNCTION__, pmlmepriv->ht_op_mode);\n\n\tif (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)\n\t    && pmlmepriv->num_sta_ht_no_gf) {\n\t\tpmlmepriv->ht_op_mode |=\n\t\t\tHT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;\n\t\top_mode_changes++;\n\t} else if ((pmlmepriv->ht_op_mode &\n\t\t    HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT) &&\n\t\t   pmlmepriv->num_sta_ht_no_gf == 0) {\n\t\tpmlmepriv->ht_op_mode &=\n\t\t\t~HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT;\n\t\top_mode_changes++;\n\t}\n\n\tif (!(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&\n\t    (pmlmepriv->num_sta_no_ht || pmlmepriv->olbc_ht)) {\n\t\tpmlmepriv->ht_op_mode |= HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;\n\t\top_mode_changes++;\n\t} else if ((pmlmepriv->ht_op_mode &\n\t\t    HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT) &&\n\t\t   (pmlmepriv->num_sta_no_ht == 0 && !pmlmepriv->olbc_ht)) {\n\t\tpmlmepriv->ht_op_mode &=\n\t\t\t~HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT;\n\t\top_mode_changes++;\n\t}\n\n\t/* Note: currently we switch to the MIXED op mode if HT non-greenfield\n\t * station is associated. Probably it's a theoretical case, since\n\t * it looks like all known HT STAs support greenfield.\n\t */\n\tnew_op_mode = 0;\n\tif (pmlmepriv->num_sta_no_ht /*||\n\t    (pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/)\n\t\tnew_op_mode = OP_MODE_MIXED;\n\telse if ((phtpriv_ap->ht_cap.cap_info & IEEE80211_HT_CAP_SUP_WIDTH)\n\t\t && pmlmepriv->num_sta_ht_20mhz)\n\t\tnew_op_mode = OP_MODE_20MHZ_HT_STA_ASSOCED;\n\telse if (pmlmepriv->olbc_ht)\n\t\tnew_op_mode = OP_MODE_MAY_BE_LEGACY_STAS;\n\telse\n\t\tnew_op_mode = OP_MODE_PURE;\n\n\tcur_op_mode = pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_OP_MODE_MASK;\n\tif (cur_op_mode != new_op_mode) {\n\t\tpmlmepriv->ht_op_mode &= ~HT_INFO_OPERATION_MODE_OP_MODE_MASK;\n\t\tpmlmepriv->ht_op_mode |= new_op_mode;\n\t\top_mode_changes++;\n\t}\n\n\tDBG_871X(\"%s new operation mode=0x%X changes=%d\\n\",\n\t\t   __FUNCTION__, pmlmepriv->ht_op_mode, op_mode_changes);\n\n\treturn op_mode_changes;\n\t\n}\n\n#endif /* CONFIG_80211N_HT */\n\nvoid associated_clients_update(_adapter *padapter, u8 updated, u32 sta_info_type)\n{\n\t//update associcated stations cap.\n\tif(updated == _TRUE)\n\t{\n\t\t_irqL irqL;\n\t\t_list\t*phead, *plist;\n\t\tstruct sta_info *psta=NULL;\t\n\t\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\t\t\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\n\t\tphead = &pstapriv->asoc_list;\n\t\tplist = get_next(phead);\n\t\t\n\t\t//check asoc_queue\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t\t{\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\n\t\t\tplist = get_next(plist);\n\n\t\t\tassociated_stainfo_update(padapter, psta, sta_info_type);\t\t\t\n\t\t}\n\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t}\t\t\n\n}\n\n/* called > TSR LEVEL for USB or SDIO Interface*/\nvoid bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta)\n{\n\tu8 beacon_updated = _FALSE;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\n\t\n#if 0\n\tif (!(psta->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) &&\n\t    !psta->no_short_preamble_set) {\n\t\tpsta->no_short_preamble_set = 1;\n\t\tpmlmepriv->num_sta_no_short_preamble++;\n\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && \n\t\t     (pmlmepriv->num_sta_no_short_preamble == 1))\n\t\t\tieee802_11_set_beacons(hapd->iface);\n\t}\n#endif\n\n\n\tif(!(psta->flags & WLAN_STA_SHORT_PREAMBLE))\t\n\t{\n\t\tif(!psta->no_short_preamble_set)\n\t\t{\n\t\t\tpsta->no_short_preamble_set = 1;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_no_short_preamble++;\n\t\t\t\n\t\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && \n\t\t     \t\t(pmlmepriv->num_sta_no_short_preamble == 1))\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t\t}\t\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(psta->no_short_preamble_set)\n\t\t{\n\t\t\tpsta->no_short_preamble_set = 0;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_no_short_preamble--;\n\t\t\t\n\t\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && \n\t\t     \t\t(pmlmepriv->num_sta_no_short_preamble == 0))\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t\t}\t\n\t\t\t\n\t\t}\n\t}\n\n#if 0\n\tif (psta->flags & WLAN_STA_NONERP && !psta->nonerp_set) {\n\t\tpsta->nonerp_set = 1;\n\t\tpmlmepriv->num_sta_non_erp++;\n\t\tif (pmlmepriv->num_sta_non_erp == 1)\n\t\t\tieee802_11_set_beacons(hapd->iface);\n\t}\n#endif\n\n\tif(psta->flags & WLAN_STA_NONERP)\n\t{\n\t\tif(!psta->nonerp_set)\n\t\t{\n\t\t\tpsta->nonerp_set = 1;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_non_erp++;\n\t\t\t\n\t\t\tif (pmlmepriv->num_sta_non_erp == 1)\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);\n\t\t\t}\t\n\t\t}\n\t\t\n\t}\n\telse\n\t{\n\t\tif(psta->nonerp_set)\n\t\t{\n\t\t\tpsta->nonerp_set = 0;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_non_erp--;\n\t\t\t\n\t\t\tif (pmlmepriv->num_sta_non_erp == 0)\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);\n\t\t\t}\t\n\t\t}\n\t\t\n\t}\n\n\n#if 0\n\tif (!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT) &&\n\t    !psta->no_short_slot_time_set) {\n\t\tpsta->no_short_slot_time_set = 1;\n\t\tpmlmepriv->num_sta_no_short_slot_time++;\n\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&\n\t\t    (pmlmepriv->num_sta_no_short_slot_time == 1))\n\t\t\tieee802_11_set_beacons(hapd->iface);\n\t}\n#endif\n\n\tif(!(psta->capability & WLAN_CAPABILITY_SHORT_SLOT))\n\t{\n\t\tif(!psta->no_short_slot_time_set)\n\t\t{\n\t\t\tpsta->no_short_slot_time_set = 1;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_no_short_slot_time++;\n\t\t\t\n\t\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&\n\t\t   \t\t (pmlmepriv->num_sta_no_short_slot_time == 1))\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t\t}\t\t\t\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(psta->no_short_slot_time_set)\n\t\t{\n\t\t\tpsta->no_short_slot_time_set = 0;\n\t\t\t\n\t\t\tpmlmepriv->num_sta_no_short_slot_time--;\n\t\t\t\n\t\t\tif ((pmlmeext->cur_wireless_mode > WIRELESS_11B) &&\n\t\t   \t\t (pmlmepriv->num_sta_no_short_slot_time == 0))\n\t\t\t{\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t\t}\t\t\t\n\t\t}\n\t}\t\n\t\n#ifdef CONFIG_80211N_HT\n\n\tif (psta->flags & WLAN_STA_HT) \n\t{\n\t\tu16 ht_capab = le16_to_cpu(psta->htpriv.ht_cap.cap_info);\n\t\t\t\n\t\tDBG_871X(\"HT: STA \" MAC_FMT \" HT Capabilities \"\n\t\t\t   \"Info: 0x%04x\\n\", MAC_ARG(psta->hwaddr), ht_capab);\n\n\t\tif (psta->no_ht_set) {\n\t\t\tpsta->no_ht_set = 0;\n\t\t\tpmlmepriv->num_sta_no_ht--;\n\t\t}\n\t\t\n\t\tif ((ht_capab & IEEE80211_HT_CAP_GRN_FLD) == 0) {\n\t\t\tif (!psta->no_ht_gf_set) {\n\t\t\t\tpsta->no_ht_gf_set = 1;\n\t\t\t\tpmlmepriv->num_sta_ht_no_gf++;\n\t\t\t}\n\t\t\tDBG_871X(\"%s STA \" MAC_FMT \" - no \"\n\t\t\t\t   \"greenfield, num of non-gf stations %d\\n\",\n\t\t\t\t   __FUNCTION__, MAC_ARG(psta->hwaddr),\n\t\t\t\t   pmlmepriv->num_sta_ht_no_gf);\n\t\t}\n\t\t\n\t\tif ((ht_capab & IEEE80211_HT_CAP_SUP_WIDTH) == 0) {\n\t\t\tif (!psta->ht_20mhz_set) {\n\t\t\t\tpsta->ht_20mhz_set = 1;\n\t\t\t\tpmlmepriv->num_sta_ht_20mhz++;\n\t\t\t}\n\t\t\tDBG_871X(\"%s STA \" MAC_FMT \" - 20 MHz HT, \"\n\t\t\t\t   \"num of 20MHz HT STAs %d\\n\",\n\t\t\t\t   __FUNCTION__, MAC_ARG(psta->hwaddr),\n\t\t\t\t   pmlmepriv->num_sta_ht_20mhz);\n\t\t}\n\t\t\n\n\t\tif (ht_capab & RTW_IEEE80211_HT_CAP_40MHZ_INTOLERANT) {\n\n\t\t\tif (!psta->ht_40mhz_intolerant) {\n\t\t\t\tpsta->ht_40mhz_intolerant = 1;\n\t\t\t\tpmlmepriv->num_sta_40mhz_intolerant++;\n\t\t\t\tDBG_871X(\"%s STA \" MAC_FMT \" - HT_CAP_40MHZ_INTOLERANT is set\\n\" ,\n\t\t\t\t   __FUNCTION__, MAC_ARG(psta->hwaddr));\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t}\n\t\t\t\t\n/*\n\t\t\tif (pmlmepriv->ht_40mhz_intolerant == _FALSE) {\n\t\t\t\t\n\t\t\t\tpmlmepriv->ht_40mhz_intolerant = _TRUE;\t\t\t\t\n\t\t\t\n\t\t\t\tDBG_871X(\"%s STA \" MAC_FMT \" - HT_CAP_40MHZ_INTOLERANT is set\\n\" ,\n\t\t\t\t   __FUNCTION__, MAC_ARG(psta->hwaddr));\n\n\t\t\t\tbeacon_updated = _TRUE;\n\t\t\t}\n*/\t\t\t\n\n\t\t\t/*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/\n\t\t\tif (pmlmepriv->ext_capab_ie_len == 0)\n\t\t\t\tpmlmepriv->ext_capab_ie_len = 1;\n\t\t\tSET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 1);\n\n\t\t\tupdate_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE);\n\t\t}\t\t\n\t\t\n\t} \n\telse \n\t{\n\t\tif (!psta->no_ht_set) {\n\t\t\tpsta->no_ht_set = 1;\n\t\t\tpmlmepriv->num_sta_no_ht++;\n\t\t}\n\t\tif(pmlmepriv->htpriv.ht_option == _TRUE) {\t\t\n\t\t\tDBG_871X(\"%s STA \" MAC_FMT\n\t\t\t\t   \" - no HT, num of non-HT stations %d\\n\",\n\t\t\t\t   __FUNCTION__, MAC_ARG(psta->hwaddr),\n\t\t\t\t   pmlmepriv->num_sta_no_ht);\n\t\t}\n\t}\n\n\tif (rtw_ht_operation_update(padapter) > 0) {\n\t\tupdate_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE);\n\t\tupdate_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);\n\t\t/*beacon_updated = _TRUE;*/\n\t}\t\n\t\n#endif /* CONFIG_80211N_HT */\n\n\t//update associcated stations cap.\n\tassociated_clients_update(padapter,  beacon_updated, STA_INFO_UPDATE_ALL);\n\n\tDBG_871X(\"%s, updated=%d\\n\", __func__, beacon_updated);\n\n}\n\nu8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta)\n{\n\tu8 beacon_updated = _FALSE;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\n\tif(!psta)\n\t\treturn beacon_updated;\n\n\tif (psta->no_short_preamble_set) {\n\t\tpsta->no_short_preamble_set = 0;\n\t\tpmlmepriv->num_sta_no_short_preamble--;\n\t\tif (pmlmeext->cur_wireless_mode > WIRELESS_11B\n\t\t    && pmlmepriv->num_sta_no_short_preamble == 0)\n\t\t{\n\t\t\tbeacon_updated = _TRUE;\n\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t}\t\n\t}\t\n\n\tif (psta->nonerp_set) {\n\t\tpsta->nonerp_set = 0;\t\t\n\t\tpmlmepriv->num_sta_non_erp--;\n\t\tif (pmlmepriv->num_sta_non_erp == 0)\n\t\t{\n\t\t\tbeacon_updated = _TRUE;\n\t\t\tupdate_beacon(padapter, _ERPINFO_IE_, NULL, _TRUE);\n\t\t}\t\n\t}\n\n\tif (psta->no_short_slot_time_set) {\n\t\tpsta->no_short_slot_time_set = 0;\n\t\tpmlmepriv->num_sta_no_short_slot_time--;\n\t\tif (pmlmeext->cur_wireless_mode > WIRELESS_11B\n\t\t    && pmlmepriv->num_sta_no_short_slot_time == 0)\n\t\t{\n\t\t\tbeacon_updated = _TRUE;\n\t\t\tupdate_beacon(padapter, 0xFF, NULL, _TRUE);\n\t\t}\t\n\t}\n\t\n#ifdef CONFIG_80211N_HT\n\n\tif (psta->no_ht_gf_set) {\n\t\tpsta->no_ht_gf_set = 0;\n\t\tpmlmepriv->num_sta_ht_no_gf--;\n\t}\n\n\tif (psta->no_ht_set) {\n\t\tpsta->no_ht_set = 0;\n\t\tpmlmepriv->num_sta_no_ht--;\n\t}\n\n\tif (psta->ht_20mhz_set) {\n\t\tpsta->ht_20mhz_set = 0;\n\t\tpmlmepriv->num_sta_ht_20mhz--;\n\t}\n\n\tif (psta->ht_40mhz_intolerant) {\n\t\tpsta->ht_40mhz_intolerant = 0;\n\t\tpmlmepriv->num_sta_40mhz_intolerant--;\n\n\t\t/*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/\n\t\tif ((pmlmepriv->ext_capab_ie_len > 0) && (pmlmepriv->num_sta_40mhz_intolerant == 0)) {\n\t\t\tSET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 0);\n\t\t\tupdate_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE);\n\t\t}\n\t\t\n\t\tbeacon_updated = _TRUE;\n\n\t\tupdate_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE);\n\t}\n\n\tif (rtw_ht_operation_update(padapter) > 0) {\n\t\tupdate_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE);\n\t\tupdate_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);\n\t}\n\t\n#endif /* CONFIG_80211N_HT */\n\n\t/* update associated stations cap.\n\tassociated_clients_update(padapter,  beacon_updated, STA_INFO_UPDATE_ALL); //move it to avoid deadlock\n\t*/\n\t\n\tDBG_871X(\"%s, updated=%d\\n\", __func__, beacon_updated);\n\n\treturn beacon_updated;\n\n}\n\nu8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason, bool enqueue)\n{\n\t_irqL irqL;\n\tu8 beacon_updated = _FALSE;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tif(!psta)\n\t\treturn beacon_updated;\n\n\tif (active == _TRUE)\n\t{\n#ifdef CONFIG_80211N_HT\n\t\t//tear down Rx AMPDU\n\t\tsend_delba(padapter, 0, psta->hwaddr);// recipient\n\t\n\t\t//tear down TX AMPDU\n\t\tsend_delba(padapter, 1, psta->hwaddr);// // originator\n\t\t\n#endif //CONFIG_80211N_HT\n\n\t\tissue_deauth(padapter, psta->hwaddr, reason);\n\t}\n\n#ifdef CONFIG_BEAMFORMING\n\tbeamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1);\n#endif\n\n\tpsta->htpriv.agg_enable_bitmap = 0x0;//reset\n\tpsta->htpriv.candidate_tid_bitmap = 0x0;//reset\n\n\t//clear cam entry / key\n\trtw_clearstakey_cmd(padapter, psta, enqueue);\n\n\n\t_enter_critical_bh(&psta->lock, &irqL);\n\tpsta->state &= ~_FW_LINKED;\n\t_exit_critical_bh(&psta->lock, &irqL);\n\n\t#ifdef CONFIG_IOCTL_CFG80211\n\tif (1) {\n\t\t#ifdef COMPAT_KERNEL_RELEASE\n\t\trtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason);\n\t\t#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\t\trtw_cfg80211_indicate_sta_disassoc(padapter, psta->hwaddr, reason);\n\t\t#else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\t\t/* will call rtw_cfg80211_indicate_sta_disassoc() in cmd_thread for old API context */\n\t\t#endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\t} else\n\t#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\trtw_indicate_sta_disassoc_event(padapter, psta);\n\t}\n\n\treport_del_sta_event(padapter, psta->hwaddr, reason, enqueue);\n\n\tbeacon_updated = bss_cap_update_on_sta_leave(padapter, psta);\n\n\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\t\t\t\n\trtw_free_stainfo(padapter, psta);\n\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\n\n\treturn beacon_updated;\n\n}\n\nint rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset)\n{\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tint ret=0;\t\n\tstruct sta_info *psta = NULL;\t\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\n\tif((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\n\t\treturn ret;\n\n\tDBG_871X(FUNC_NDEV_FMT\" with ch:%u, offset:%u\\n\",\n\t\tFUNC_NDEV_ARG(padapter->pnetdev), new_ch, ch_offset);\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\t\n\t/* for each sta in asoc_queue */\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t{\t\t\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\n\n\t\tissue_action_spct_ch_switch(padapter, psta->hwaddr, new_ch, ch_offset);\n\t\tpsta->expire_to = ((pstapriv->expire_to * 2) > 5) ? 5 : (pstapriv->expire_to * 2);\n\t}\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\tissue_action_spct_ch_switch(padapter, bc_addr, new_ch, ch_offset);\n\n\treturn ret;\n}\n\nint rtw_sta_flush(_adapter *padapter, bool enqueue)\n{\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tint ret = 0;\n\tstruct sta_info *psta = NULL;\t\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\tu8 flush_num = 0;\n\tchar flush_list[NUM_STA];\n\tint i;\n\n\tif ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\n\t\treturn ret;\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(padapter->pnetdev));\n\n\t/* pick sta from sta asoc_queue */\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\tint stainfo_offset;\n\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\n\n\t\trtw_list_delete(&psta->asoc_list);\n\t\tpstapriv->asoc_list_cnt--;\n\n\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, psta);\n\t\tif (stainfo_offset_valid(stainfo_offset))\n\t\t\tflush_list[flush_num++] = stainfo_offset;\n\t\telse\n\t\t\trtw_warn_on(1);\n\t}\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t/* call ap_free_sta() for each sta picked */\n\tfor (i = 0; i < flush_num; i++) {\n\t\tpsta = rtw_get_stainfo_by_offset(pstapriv, flush_list[i]);\n\t\tap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, enqueue);\n\t}\n\n\tissue_deauth(padapter, bc_addr, WLAN_REASON_DEAUTH_LEAVING);\n\n\tassociated_clients_update(padapter, _TRUE, STA_INFO_UPDATE_ALL);\n\n\treturn ret;\n}\n\n/* called > TSR LEVEL for USB or SDIO Interface*/\nvoid sta_info_update(_adapter *padapter, struct sta_info *psta)\n{\t\n\tint flags = psta->flags;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\n\t\t\t\t\n\t//update wmm cap.\n\tif(WLAN_STA_WME&flags)\n\t\tpsta->qos_option = 1;\n\telse\n\t\tpsta->qos_option = 0;\n\n\tif(pmlmepriv->qospriv.qos_option == 0)\t\n\t\tpsta->qos_option = 0;\n\n\t\t\n#ifdef CONFIG_80211N_HT\t\t\n\t//update 802.11n ht cap.\n\tif(WLAN_STA_HT&flags)\n\t{\n\t\tpsta->htpriv.ht_option = _TRUE;\n\t\tpsta->qos_option = 1;\t\n\n\t\tpsta->htpriv.smps_cap = (psta->htpriv.ht_cap.cap_info & IEEE80211_HT_CAP_SM_PS)>>2;\n\t}\n\telse\t\t\n\t{\n\t\tpsta->htpriv.ht_option = _FALSE;\n\t}\n\t\t\n\tif(pmlmepriv->htpriv.ht_option == _FALSE)\t\n\t\tpsta->htpriv.ht_option = _FALSE;\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n\t//update 802.11AC vht cap.\n\tif(WLAN_STA_VHT&flags)\n\t{\n\t\tpsta->vhtpriv.vht_option = _TRUE;\n\t}\n\telse\t\t\n\t{\n\t\tpsta->vhtpriv.vht_option = _FALSE;\n\t}\n\n\tif(pmlmepriv->vhtpriv.vht_option == _FALSE)\n\t\tpsta->vhtpriv.vht_option = _FALSE;\n#endif\t\n\n\n\tupdate_sta_info_apmode(padapter, psta);\n\t\t\n\n}\n\n/* called >= TSR LEVEL for USB or SDIO Interface*/\nvoid ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(psta->state & _FW_LINKED)\n\t{\n\t\tpmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;\n\t\n\t\t//add ratid\n\t\tadd_RATid(padapter, psta, 0);//DM_RATR_STA_INIT\n\t}\t\n}\n/* restore hw setting from sw data structures */\nvoid rtw_ap_restore_network(_adapter *padapter)\n{\n\tstruct mlme_priv *mlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tu8 chk_alive_num = 0;\n\tchar chk_alive_list[NUM_STA];\n\tint i;\n\n\trtw_setopmode_cmd(padapter, Ndis802_11APMode,_FALSE);\n\n\tset_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n\trtw_startbss_cmd(padapter, RTW_CMDF_DIRECTLY);\n\n\tif((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||\n\t\t(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))\n\t{\n\t\t/* restore group key, WEP keys is restored in ips_leave() */\n\t\trtw_set_key(padapter, psecuritypriv, psecuritypriv->dot118021XGrpKeyid, 0,_FALSE);\n\t}\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\tint stainfo_offset;\n\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\n\n\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, psta);\n\t\tif (stainfo_offset_valid(stainfo_offset)) {\n\t\t\tchk_alive_list[chk_alive_num++] = stainfo_offset;\n\t\t}\n\t}\n\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\tfor (i = 0; i < chk_alive_num; i++) {\n\t\tpsta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);\n\n\t\tif (psta == NULL) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" sta_info is null\\n\", FUNC_ADPT_ARG(padapter));\n\t\t} else if (psta->state &_FW_LINKED) {\n\t\t\trtw_sta_media_status_rpt(padapter, psta, 1);\n\t\t\tUpdate_RA_Entry(padapter, psta);\n\t\t\t//pairwise key\n\t\t\t/* per sta pairwise key and settings */\n\t\t\tif(\t(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||\n\t\t\t\t(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))\n\t\t\t{\n\t\t\t\trtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE);\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\n}\n\nvoid start_ap_mode(_adapter *padapter)\n{\n\tint i;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t\n\tpmlmepriv->update_bcn = _FALSE;\n\t\n\t/*init_mlme_ap_info(padapter);*/\n\t\n\tpmlmeext->bstart_bss = _FALSE;\n\n\tpmlmepriv->num_sta_non_erp = 0;\n\n\tpmlmepriv->num_sta_no_short_slot_time = 0;\n\n\tpmlmepriv->num_sta_no_short_preamble = 0;\n\n\tpmlmepriv->num_sta_ht_no_gf = 0;\n#ifdef CONFIG_80211N_HT\n\tpmlmepriv->num_sta_no_ht = 0;\n#endif //CONFIG_80211N_HT\n\tpmlmeinfo->HT_info_enable = 0;\n\tpmlmeinfo->HT_caps_enable = 0;\n\tpmlmeinfo->HT_enable = 0;\n\t\n\tpmlmepriv->num_sta_ht_20mhz = 0;\n\tpmlmepriv->num_sta_40mhz_intolerant = 0;\n\tpmlmepriv->olbc = _FALSE;\n\tpmlmepriv->olbc_ht = _FALSE;\n\t\n#ifdef CONFIG_80211N_HT\n\tpmlmepriv->ht_20mhz_width_req = _FALSE;\n\tpmlmepriv->ht_intolerant_ch_reported = _FALSE;\n\tpmlmepriv->ht_op_mode = 0;\n\tpmlmepriv->sw_to_20mhz = 0;\n#endif\n\n\t_rtw_memset(pmlmepriv->ext_capab_ie_data, 0, sizeof(pmlmepriv->ext_capab_ie_data));\n\tpmlmepriv->ext_capab_ie_len = 0;\n\n\tfor (i = 0 ;  i < NUM_STA ; i++)\n\t\tpstapriv->sta_aid[i] = NULL;\n\n/* to avoid memory leak issue, don't set to NULL directly\n\tpmlmepriv->wps_beacon_ie = NULL;\t\n\tpmlmepriv->wps_probe_resp_ie = NULL;\n\tpmlmepriv->wps_assoc_resp_ie = NULL;\n\t\n\tpmlmepriv->p2p_beacon_ie = NULL;\n\tpmlmepriv->p2p_probe_resp_ie = NULL;\n*/\n\t\n\t//for ACL \n\t_rtw_init_listhead(&(pacl_list->acl_node_q.queue));\n\tpacl_list->num = 0;\n\tpacl_list->mode = 0;\n\tfor(i = 0; i < NUM_ACL; i++)\n\t{\t\t\n\t\t_rtw_init_listhead(&pacl_list->aclnode[i].list);\n\t\tpacl_list->aclnode[i].valid = _FALSE;\n\t}\n\n}\n\nvoid stop_ap_mode(_adapter *padapter)\n{\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tstruct rtw_wlan_acl_node *paclnode;\n\tstruct sta_info *psta=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\t\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t_queue\t*pacl_node_q =&pacl_list->acl_node_q;\t\n\n\tpmlmepriv->update_bcn = _FALSE;\n\tpmlmeext->bstart_bss = _FALSE;\n\tpadapter->netif_up = _FALSE;\n\t//_rtw_spinlock_free(&pmlmepriv->bcn_update_lock);\n\t\n\t//reset and init security priv , this can refine with rtw_reset_securitypriv\n\t_rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv));\n\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;\n\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled;\n\n\t#ifdef CONFIG_DFS_MASTER\n\trtw_dfs_master_status_apply(padapter, MLME_AP_STOPPED);\n\t#endif\n\n\t/* free scan queue */\n\trtw_free_network_queue(padapter, _TRUE);\n\n\t//for ACL\n\t_enter_critical_bh(&(pacl_node_q->lock), &irqL);\n\tphead = get_list_head(pacl_node_q);\n\tplist = get_next(phead);\t\t\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpaclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);\n\t\tplist = get_next(plist);\n\n\t\tif(paclnode->valid == _TRUE)\n\t\t{\n\t\t\tpaclnode->valid = _FALSE;\n\n\t\t\trtw_list_delete(&paclnode->list);\n\t\t\t\t\n\t\t\tpacl_list->num--;\t\t\n\t\t}\t\t\n\t}\t\n\t_exit_critical_bh(&(pacl_node_q->lock), &irqL);\n\t\n\tDBG_871X(\"%s, free acl_node_queue, num=%d\\n\", __func__, pacl_list->num);\n\t\n\trtw_sta_flush(padapter, _TRUE);\n\n\t//free_assoc_sta_resources\t\n\trtw_free_all_stainfo(padapter);\n\t\n\tpsta = rtw_get_bcmc_stainfo(padapter);\n\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\trtw_free_stainfo(padapter, psta);\n\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\n\trtw_init_bcmc_stainfo(padapter);\t\n\n\trtw_free_mlme_priv_ie_data(pmlmepriv);\n\n#ifdef CONFIG_BT_COEXIST\n\trtw_btcoex_MediaStatusNotify(padapter, 0); //disconnect \n#endif\t\n\n}\n\n#endif //CONFIG_NATIVEAP_MLME\n\nvoid rtw_ap_update_bss_chbw(_adapter *adapter, WLAN_BSSID_EX *bss, u8 ch, u8 bw, u8 offset)\n{\n#define UPDATE_VHT_CAP 1\n#define UPDATE_HT_CAP 1\n\n#ifdef CONFIG_80211AC_VHT\n\t{\n\t\tstruct vht_priv\t*vhtpriv = &adapter->mlmepriv.vhtpriv;\n\t\tu8 *vht_cap_ie, *vht_op_ie;\n\t\tint vht_cap_ielen, vht_op_ielen;\n\t\tu8\tcenter_freq;\n\n\t\tvht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTCapability, &vht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)));\n\t\tvht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_VHTOperation, &vht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)));\n\t\tcenter_freq = rtw_get_center_ch(ch, bw, offset);\n\n\t\t/* update vht cap ie */\n\t\tif (vht_cap_ie && vht_cap_ielen) {\n\t\t\t#if UPDATE_VHT_CAP\n\t\t\t/* if ((bw == CHANNEL_WIDTH_160 || bw == CHANNEL_WIDTH_80_80) && pvhtpriv->sgi_160m)\n\t\t\t\tSET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvht_cap_ie + 2, 1);\n\t\t\telse */\n\t\t\t\tSET_VHT_CAPABILITY_ELE_SHORT_GI160M(vht_cap_ie + 2, 0);\n\n\t\t\tif (bw >= CHANNEL_WIDTH_80 && vhtpriv->sgi_80m)\n\t\t\t\tSET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 1);\n\t\t\telse\n\t\t\t\tSET_VHT_CAPABILITY_ELE_SHORT_GI80M(vht_cap_ie + 2, 0);\n\t\t\t#endif\n\t\t}\n\n\t\t/* update vht op ie */\n\t\tif (vht_op_ie && vht_op_ielen) {\n\t\t\tif (bw < CHANNEL_WIDTH_80) {\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 0);\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, 0);\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0);\n\t\t\t} else if (bw == CHANNEL_WIDTH_80) {\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2, 1);\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(vht_op_ie + 2, center_freq);\n\t\t\t\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(vht_op_ie + 2, 0);\n\t\t\t} else {\n\t\t\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" unsupported BW:%u\\n\", FUNC_ADPT_ARG(adapter), bw);\n\t\t\t\trtw_warn_on(1);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_80211AC_VHT */\n#ifdef CONFIG_80211N_HT\n\t{\n\t\tstruct ht_priv\t*htpriv = &adapter->mlmepriv.htpriv;\n\t\tu8 *ht_cap_ie, *ht_op_ie;\n\t\tint ht_cap_ielen, ht_op_ielen;\n\n\t\tht_cap_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTCapability, &ht_cap_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)));\n\t\tht_op_ie = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), EID_HTInfo, &ht_op_ielen, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)));\n\n\t\t/* update ht cap ie */\n\t\tif (ht_cap_ie && ht_cap_ielen) {\n\t\t\t#if UPDATE_HT_CAP\n\t\t\tif (bw >= CHANNEL_WIDTH_40)\n\t\t\t\tSET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 1);\n\t\t\telse\n\t\t\t\tSET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2, 0);\n\n\t\t\tif (bw >= CHANNEL_WIDTH_40 && htpriv->sgi_40m)\n\t\t\t\tSET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 1);\n\t\t\telse\n\t\t\t\tSET_HT_CAP_ELE_SHORT_GI40M(ht_cap_ie + 2, 0);\n\n\t\t\tif (htpriv->sgi_20m)\n\t\t\t\tSET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 1);\n\t\t\telse\n\t\t\t\tSET_HT_CAP_ELE_SHORT_GI20M(ht_cap_ie + 2, 0);\n\t\t\t#endif\n\t\t}\n\n\t\t/* update ht op ie */\n\t\tif (ht_op_ie && ht_op_ielen) {\n\t\t\tSET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2, ch);\n\t\t\tswitch (offset) {\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_LOWER:\n\t\t\t\tSET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCA);\n\t\t\t\tbreak;\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_UPPER:\n\t\t\t\tSET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCB);\n\t\t\t\tbreak;\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_DONT_CARE:\n\t\t\tdefault:\n\t\t\t\tSET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2, SCN);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (bw >= CHANNEL_WIDTH_40)\n\t\t\t\tSET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 1);\n\t\t\telse\n\t\t\t\tSET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2, 0);\n\t\t}\n\t}\n#endif /* CONFIG_80211N_HT */\n\n{\n\tu8 *p;\n\tint ie_len;\n\tu8 old_ch = bss->Configuration.DSConfig;\n\tbool change_band = _FALSE;\n\n\tif ((ch <= 14 && old_ch >= 36) || (ch >= 36 && old_ch <= 14))\n\t\tchange_band = _TRUE;\n\n\t/* update channel in IE */\n\tp = rtw_get_ie((bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)), _DSSET_IE_, &ie_len, (bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)));\n\tif (p && ie_len > 0)\n\t\t*(p + 2) = ch;\n\n\tbss->Configuration.DSConfig = ch;\n\n\t/* band is changed, update ERP, support rate, ext support rate IE */\n\tif (change_band == _TRUE)\n\t\tchange_band_update_ie(adapter, bss, ch);\n}\n\n}\n\nbool rtw_ap_chbw_decision(_adapter *adapter, u8 req_ch, u8 req_bw, u8 req_offset\n\t, u8 *ch, u8 *bw, u8 *offset)\n{\n\tu8 dec_ch, dec_bw, dec_offset;\n\tu8 u_ch = 0, u_offset, u_bw;\n\tbool changed = _FALSE;\n\tstruct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);\n\tu8 sta_num;\n\tu8 ld_sta_num;\n\tu8 lg_sta_num;\n\tu8 ap_num;\n\tu8 ld_ap_num;\n\tbool set_u_ch = _FALSE, set_dec_ch = _FALSE;\n\n\tdec_ch = req_ch;\n\tdec_bw = req_bw;\n\tdec_offset = req_offset;\n\t\n\trtw_dev_iface_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num);\n\tDBG_871X(FUNC_ADPT_FMT\" ld_sta_num:%u, lg_sta_num%u, ap_num:%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), ld_sta_num, lg_sta_num, ap_num);\n\n\tif (ld_sta_num || ap_num) {\n\t\t/* has linked STA or AP mode, follow */\n\n\t\trtw_warn_on(!rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset));\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" union no self: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\t\tDBG_871X(FUNC_ADPT_FMT\" req: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset);\n\n\t\trtw_adjust_chbw(adapter, u_ch, &dec_bw, &dec_offset);\n\n\t\trtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset\n\t\t\t, &u_ch, &u_bw, &u_offset);\n\n\t\trtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network)\n\t\t\t, dec_ch, dec_bw, dec_offset);\n\n\t\tset_u_ch = _TRUE;\n\t} else if (lg_sta_num) {\n\t\t/* has linking STA */\n\n\t\trtw_warn_on(!rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset));\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" union no self: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\t\tDBG_871X(FUNC_ADPT_FMT\" req: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset);\n\n\t\trtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset);\n\t\t\n\t\tif (rtw_is_chbw_grouped(u_ch, u_bw, u_offset, dec_ch, dec_bw, dec_offset)) {\n\n\t\t\trtw_sync_chbw(&dec_ch, &dec_bw, &dec_offset\n\t\t\t\t\t, &u_ch, &u_bw, &u_offset);\n\n\t\t\trtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network)\n\t\t\t\t, dec_ch, dec_bw, dec_offset);\n\n\t\t\tset_u_ch = _TRUE;\n\t\t} else {\n\t\t\t/* set this for possible ch change when join down*/\n\t\t\tset_fwstate(&adapter->mlmepriv, WIFI_OP_CH_SWITCHING);\n\t\t}\n\t} else {\n\t\t/* single AP mode */\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" req: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), req_ch, req_bw, req_offset);\n\t\trtw_adjust_chbw(adapter, dec_ch, &dec_bw, &dec_offset);\n\n\t\t#if defined(CONFIG_DFS_MASTER)\n\t\t/* check NOL */\n\t\tif (rtw_chset_is_ch_non_ocp(mlmeext->channel_set, dec_ch, dec_bw, dec_offset)) {\n\t\t\t/* choose 5G DFS channel for debug */\n\t\t\tif (adapter_to_rfctl(adapter)->dbg_dfs_master_choose_dfs_ch_first\n\t\t\t\t&& rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_NON_DFS) == _TRUE) {\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" choose 5G DFS channel for debug\\n\", FUNC_ADPT_ARG(adapter));\n\t\t\t} else \n\t\t\t/* choose from 5G no DFS */\n\t\t\tif (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_DFS) == _FALSE) {\n\t\t\t\t/* including 5G DFS, not long CAC */\n\t\t\t\tif (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G|RTW_CHF_LONG_CAC) == _FALSE) {\n\t\t\t\t\t/* including 5G DFS, long CAC */\n\t\t\t\t\tif (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_2G) == _FALSE) {\n\t\t\t\t\t\t/* including 2.4G channel */\n\t\t\t\t\t\tif (rtw_choose_available_chbw(adapter, req_bw, &dec_ch, &dec_bw, &dec_offset, RTW_CHF_5G) == _FALSE) {\n\t\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" no available ch\\n\", FUNC_ADPT_ARG(adapter));\n\t\t\t\t\t\t\trtw_warn_on(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#endif /* defined(CONFIG_DFS_MASTER) */\n\n\t\trtw_ap_update_bss_chbw(adapter, &(adapter->mlmepriv.cur_network.network)\n\t\t\t\t, dec_ch, dec_bw, dec_offset);\n\n\t\tset_dec_ch = _TRUE;\n\t}\n\n\tif (check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY)\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| check_buddy_fwstate(adapter, _FW_UNDER_SURVEY)\n\t\t#endif\n\t) {\n\t\t/* scanning, leave ch setting to scan state machine */\n\t\tset_u_ch = set_dec_ch = _FALSE;\n\t}\n\n\tif (mlmeext->cur_channel != dec_ch\n\t\t|| mlmeext->cur_bwmode != dec_bw\n\t\t|| mlmeext->cur_ch_offset != dec_offset)\n\t\tchanged = _TRUE;\n\n\tif (changed == _TRUE && rtw_linked_check(adapter) == _TRUE) {\n\t\t#ifdef CONFIG_SPCT_CH_SWITCH\n\t\tif (1)\n\t\t\trtw_ap_inform_ch_switch(adapter, dec_ch, dec_offset);\n\t\telse\n\t\t#endif\n\t\t\trtw_sta_flush(adapter, _FALSE);\n\t}\n\n\tmlmeext->cur_channel = dec_ch;\n\tmlmeext->cur_bwmode = dec_bw;\n\tmlmeext->cur_ch_offset = dec_offset;\n\n\tif (u_ch != 0)\n\t\tDBG_871X(FUNC_ADPT_FMT\" union: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\n\tDBG_871X(FUNC_ADPT_FMT\" dec: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), dec_ch, dec_bw, dec_offset);\n\n\tif (set_u_ch == _TRUE) {\n\t\t*ch = u_ch;\n\t\t*bw = u_bw;\n\t\t*offset = u_offset;\n\t} else if (set_dec_ch == _TRUE) {\n\t\t*ch = dec_ch;\n\t\t*bw = dec_bw;\n\t\t*offset = dec_offset;\n\t}\t\n\n\treturn changed;\n}\n\n#endif //CONFIG_AP_MODE\n\n"
  },
  {
    "path": "core/rtw_beamforming.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_BEAMFORMING_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#ifdef CONFIG_BEAMFORMING\n\n#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/\nstruct beamforming_entry\t*beamforming_get_entry_by_addr(struct mlme_priv *pmlmepriv, u8* ra,u8* idx)\n{\n\tu8\ti = 0;\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\t\n\tfor(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\n\t{\n\t\tif(\tpBeamInfo->beamforming_entry[i].bUsed && \n\t\t\t(_rtw_memcmp(ra,pBeamInfo->beamforming_entry[i].mac_addr, ETH_ALEN)))\n\t\t{\n\t\t\t*idx = i;\n\t\t\treturn &(pBeamInfo->beamforming_entry[i]);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nBEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv ,u8 mac_id)\n{\n\tu8\ti = 0;\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO((struct mlme_priv *)pmlmepriv);\n\tBEAMFORMING_CAP\t\tBeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\n\tfor(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\n\t{\n\t\tif(\tpBeamInfo->beamforming_entry[i].bUsed && \n\t\t\t(mac_id == pBeamInfo->beamforming_entry[i].mac_id))\n\t\t{\n\t\t\tBeamformEntryCap =  pBeamInfo->beamforming_entry[i].beamforming_entry_cap;\n\t\t\ti = BEAMFORMING_ENTRY_NUM;\n\t\t}\n\t}\n\n\treturn BeamformEntryCap;\n}\n\nstruct beamforming_entry\t*beamforming_get_free_entry(struct mlme_priv *pmlmepriv, u8* idx)\n{\n\tu8\ti = 0;\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\n\tfor(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\n\t{\n\t\tif(pBeamInfo->beamforming_entry[i].bUsed == _FALSE)\n\t\t{\n\t\t\t*idx = i;\n\t\t\treturn &(pBeamInfo->beamforming_entry[i]);\n\t\t}\t\n\t}\n\treturn NULL;\n}\n\n\nstruct beamforming_entry\t*beamforming_add_entry(PADAPTER adapter, u8* ra, u16 aid,\n\tu16 mac_id, CHANNEL_WIDTH bw, BEAMFORMING_CAP beamfrom_cap, u8* idx)\n{\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct beamforming_entry\t*pEntry = beamforming_get_free_entry(pmlmepriv, idx);\n\n\tif(pEntry != NULL)\n\t{\t\n\t\tpEntry->bUsed = _TRUE;\n\t\tpEntry->aid = aid;\n\t\tpEntry->mac_id = mac_id;\n\t\tpEntry->sound_bw = bw;\n\t\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\t{\n\t\t\tu16\tBSSID = ((*(adapter_mac_addr(adapter) + 5) & 0xf0) >> 4) ^ \n\t\t\t\t(*(adapter_mac_addr(adapter) + 5) & 0xf); /* BSSID[44:47] xor BSSID[40:43] */\n\t\t\tpEntry->p_aid = (aid + BSSID * 32) & 0x1ff;\t\t// (dec(A) + dec(B)*32) mod 512\n\t\t\tpEntry->g_id = 63;\n\t\t}\t\t\n\t\telse if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))\n\t\t{\n\t\t\tpEntry->p_aid = 0;\n\t\t\tpEntry->g_id = 63;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpEntry->p_aid =  ra[5];\t\t\t\t\t\t// BSSID[39:47]\n\t\t\tpEntry->p_aid = (pEntry->p_aid << 1) | (ra[4] >> 7 );\n\t\t\tpEntry->g_id = 0;\n\t\t}\n\t\t_rtw_memcpy(pEntry->mac_addr, ra, ETH_ALEN);\n\t\tpEntry->bSound = _FALSE;\n\n\t\t//3 TODO SW/FW sound period\n\t\tpEntry->sound_period = 200;\n\t\tpEntry->beamforming_entry_cap = beamfrom_cap;\n\t\tpEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\n\n\t\tpEntry->PreLogSeq = 0;\t/*Modified by Jeffery @2015-04-13*/\n\t\tpEntry->LogSeq = 0;\t\t/*Modified by Jeffery @2014-10-29*/\n\t\tpEntry->LogRetryCnt = 0;\t/*Modified by Jeffery @2014-10-29*/\n\t\tpEntry->LogSuccess = 0;\t/*LogSuccess is NOT needed to be accumulated, so  LogSuccessCnt->LogSuccess, 2015-04-13, Jeffery*/\n\t\tpEntry->ClockResetTimes = 0;\t/*Modified by Jeffery @2015-04-13*/\n\t\tpEntry->LogStatusFailCnt = 0;\n\n\t\treturn pEntry;\n\t}\n\telse\n\t\treturn NULL;\n}\n\nBOOLEAN\tbeamforming_remove_entry(struct mlme_priv *pmlmepriv, u8* ra, u8* idx)\n{\n\tstruct beamforming_entry\t*pEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx);\n\n\tif(pEntry != NULL)\n\t{\t\n\t\tpEntry->bUsed = _FALSE;\n\t\tpEntry->beamforming_entry_cap = BEAMFORMING_CAP_NONE;\n\t\tpEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\t\treturn _TRUE;\n\t}\n\telse\n\t\treturn _FALSE;\n}\n\n/* Used for BeamformingStart_V1  */\nvoid\tbeamforming_dym_ndpa_rate(PADAPTER adapter)\n{\n\tu16\tNDPARate = MGN_6M;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(adapter);\n\t\n\tif(pHalData->MinUndecoratedPWDBForDM > 30) // link RSSI > 30%\n\t\tNDPARate = MGN_24M;\n\telse\n\t\tNDPARate = MGN_6M;\n\n\t//BW = CHANNEL_WIDTH_20;\n\tNDPARate = NDPARate << 8;\n\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_RATE, (u8 *)&NDPARate);\n}\n\nvoid beamforming_dym_period(PADAPTER Adapter)\n{\n\tu8\tIdx;\n\tBOOLEAN\tbChangePeriod = _FALSE;\n\tu16\tSoundPeriod_SW, SoundPeriod_FW;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(Adapter);\n\tstruct beamforming_entry\t*pBeamformEntry;\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(( &Adapter->mlmepriv));\n\tstruct sounding_info\t\t*pSoundInfo = &(pBeamInfo->sounding_info);\n\t\n\t//3 TODO  per-client throughput caculation.\n\n\tif(pdvobjpriv->traffic_stat.cur_tx_tp + pdvobjpriv->traffic_stat.cur_rx_tp > 2)\n\t{\n\t\tSoundPeriod_SW = 32*20;\n\t\tSoundPeriod_FW = 2;\n\t}\t\n\telse\n\t{\n\t\tSoundPeriod_SW = 32*2000;\n\t\tSoundPeriod_FW = 200;\n\t}\t\n\n\tfor(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++)\n\t{\n\t\tpBeamformEntry = pBeamInfo->beamforming_entry+Idx;\n\t\tif(pBeamformEntry->bDefaultCSI)\n\t\t{\n\t\t\tSoundPeriod_SW = 32*2000;\n\t\t\tSoundPeriod_FW = 200;\n\t\t}\n\n\t\tif(pBeamformEntry->beamforming_entry_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\n\t\t{\n\t\t\tif(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER)\n\t\t\t{\t\t\t\t\n\t\t\t\tif(pBeamformEntry->sound_period != SoundPeriod_FW)\n\t\t\t\t{\n\t\t\t\t\tpBeamformEntry->sound_period = SoundPeriod_FW;\n\t\t\t\t\tbChangePeriod = _TRUE;\t// Only FW sounding need to send H2C packet to change sound period. \n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(pBeamformEntry->sound_period != SoundPeriod_SW)\n\t\t\t{\n\t\t\t\tpBeamformEntry->sound_period = SoundPeriod_SW;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(bChangePeriod)\n\t\trtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&Idx);\n}\n\nBOOLEAN\tissue_ht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx)\n{\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\n\tu8\t*pframe;\n\tu16\t*fctrl;\n\tu16\tduration = 0;\n\tu8\taSifsTime = 0;\n\tu8\tNDPTxRate = 0;\n\n\tDBG_871X(\"%s: issue_ht_sw_ndpa_packet!\\n\", __func__);\n\n\tNDPTxRate = MGN_MCS8;\n\tDBG_871X(\"%s: NDPTxRate =%d\\n\", __func__, NDPTxRate);\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\t\n\tif (pmgntframe == NULL)\n\t\treturn _FALSE;\n\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\tpattrib->qsel = QSLT_MGNT;\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = bw;\n\tpattrib->order = 1;\n\tpattrib->subtype = WIFI_ACTION_NOACK;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetOrderBit(pframe);\n\tSetFrameSubType(pframe, WIFI_ACTION_NOACK);\n\n\t_rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tif (pmlmeext->cur_wireless_mode == WIRELESS_11B)\n\t\taSifsTime = 10;\n\telse\n\t\taSifsTime = 16;\n\n\tduration = 2*aSifsTime + 40;\n\t\n\tif (bw == CHANNEL_WIDTH_40)\n\t\tduration += 87;\n\telse\t\n\t\tduration += 180;\n\n\tSetDuration(pframe, duration);\n\n\t/*HT control field*/\n\tSET_HT_CTRL_CSI_STEERING(pframe+24, 3);\n\tSET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1);\n\n\t_rtw_memcpy(pframe+28, ActionHdr, 4);\n\n\tpattrib->pktlen = 32;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n\n\n}\nBOOLEAN\tissue_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx)\n{\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\n\tu8\t*pframe;\n\tu16\t*fctrl;\n\tu16\tduration = 0;\n\tu8\taSifsTime = 0;\n\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\n\tif (pmgntframe == NULL)\n\t\treturn _FALSE;\n\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\n\tif (qidx == BCN_QUEUE_INX)\n\t\tpattrib->qsel = QSLT_BEACON;\n\tpattrib->rate = MGN_MCS8;\n\tpattrib->bwmode = bw;\n\tpattrib->order = 1;\n\tpattrib->subtype = WIFI_ACTION_NOACK;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetOrderBit(pframe);\n\tSetFrameSubType(pframe, WIFI_ACTION_NOACK);\n\n\t_rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tif( pmlmeext->cur_wireless_mode == WIRELESS_11B)\n\t\taSifsTime = 10;\n\telse\n\t\taSifsTime = 16;\n\n\tduration = 2*aSifsTime + 40;\n\t\n\tif(bw == CHANNEL_WIDTH_40)\n\t\tduration+= 87;\n\telse\t\n\t\tduration+= 180;\n\n\tSetDuration(pframe, duration);\n\n\t//HT control field\n\tSET_HT_CTRL_CSI_STEERING(pframe+24, 3);\n\tSET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1);\n\n\t_rtw_memcpy(pframe+28, ActionHdr, 4);\n\n\tpattrib->pktlen = 32;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n}\n\nBOOLEAN\tbeamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx)\n{\n\treturn issue_ht_ndpa_packet(Adapter, ra, bw, qidx);\n}\nBOOLEAN\tissue_vht_sw_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx)\n{\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct rtw_ndpa_sta_info\tsta_info;\n\tu8\t\t NDPTxRate = 0;\n\t\n\tu8\t*pframe;\n\tu16\t*fctrl;\n\tu16\tduration = 0;\n\tu8\tsequence = 0, aSifsTime = 0;\n\n\tDBG_871X(\"%s: issue_vht_sw_ndpa_packet!\\n\", __func__);\n\n\t\n\tNDPTxRate = MGN_VHT2SS_MCS0;\n\tDBG_871X(\"%s: NDPTxRate =%d\\n\", __func__, NDPTxRate);\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\tpattrib->qsel = QSLT_MGNT;\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = bw;\n\tpattrib->subtype = WIFI_NDPA;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetFrameSubType(pframe, WIFI_NDPA);\n\n\t_rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN);\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode))\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tduration = 2*aSifsTime + 44;\n\t\n\tif (bw == CHANNEL_WIDTH_80)\n\t\tduration += 40;\n\telse if (bw == CHANNEL_WIDTH_40)\n\t\tduration += 87;\n\telse\t\n\t\tduration += 180;\n\n\tSetDuration(pframe, duration);\n\t\n\tsequence = pBeamInfo->sounding_sequence << 2;\n\tif (pBeamInfo->sounding_sequence >= 0x3f)\n\t\tpBeamInfo->sounding_sequence = 0;\n\telse\n\t\tpBeamInfo->sounding_sequence++;\n\n\t_rtw_memcpy(pframe+16, &sequence, 1);\n\tif (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\taid = 0;\t\t\n\n\tsta_info.aid = aid;\n\tsta_info.feedback_type = 0;\n\tsta_info.nc_index = 0;\n\t\n\t_rtw_memcpy(pframe+17, (u8 *)&sta_info, 2);\n\n\tpattrib->pktlen = 19;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\t\n\n\treturn _TRUE;\n\n}\nBOOLEAN\tissue_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx)\n{\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct rtw_ndpa_sta_info\tsta_info;\n\tu8\t*pframe;\n\tu16\t*fctrl;\n\tu16\tduration = 0;\n\tu8\tsequence = 0, aSifsTime = 0;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\treturn _FALSE;\n\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\n\tif (qidx == BCN_QUEUE_INX)\n\t\tpattrib->qsel = QSLT_BEACON;\n\tpattrib->rate = MGN_VHT2SS_MCS0;\n\tpattrib->bwmode = bw;\n\tpattrib->subtype = WIFI_NDPA;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetFrameSubType(pframe, WIFI_NDPA);\n\n\t_rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(Adapter), ETH_ALEN);\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode))\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tduration = 2*aSifsTime + 44;\n\t\n\tif(bw == CHANNEL_WIDTH_80)\n\t\tduration += 40;\n\telse if(bw == CHANNEL_WIDTH_40)\n\t\tduration+= 87;\n\telse\t\n\t\tduration+= 180;\n\n\tSetDuration(pframe, duration);\n\n\tsequence = pBeamInfo->sounding_sequence<< 2;\n\tif (pBeamInfo->sounding_sequence >= 0x3f)\n\t\tpBeamInfo->sounding_sequence = 0;\n\telse\n\t\tpBeamInfo->sounding_sequence++;\n\n\t_rtw_memcpy(pframe+16, &sequence,1);\n\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\taid = 0;\t\t\n\n\tsta_info.aid = aid;\n\tsta_info.feedback_type = 0;\n\tsta_info.nc_index= 0;\n\t\n\t_rtw_memcpy(pframe+17, (u8 *)&sta_info, 2);\n\n\tpattrib->pktlen = 19;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n}\n\nBOOLEAN\tbeamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx)\n{\n\treturn issue_vht_ndpa_packet(Adapter, ra, aid, bw, qidx);\n}\n\nBOOLEAN\tbeamfomring_bSounding(struct beamforming_info *pBeamInfo)\n{\n\tBOOLEAN\t\tbSounding = _FALSE;\n\n\tif(( beamforming_get_beamform_cap(pBeamInfo) & BEAMFORMER_CAP) == 0)\n\t\tbSounding = _FALSE;\n\telse \n\t\tbSounding = _TRUE;\n\n\treturn bSounding;\n}\n\nu8\tbeamforming_sounding_idx(struct beamforming_info *pBeamInfo)\n{\n\tu8\tidx = 0;\n\tu8\ti;\n\n\tfor(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\n\t{\n\t\tif (pBeamInfo->beamforming_entry[i].bUsed &&\n\t\t\t(_FALSE == pBeamInfo->beamforming_entry[i].bSound))\n\t\t{\n\t\t\tidx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn idx;\n}\n\nSOUNDING_MODE\tbeamforming_sounding_mode(struct beamforming_info *pBeamInfo, u8 idx)\n{\n\tstruct beamforming_entry\tBeamEntry = pBeamInfo->beamforming_entry[idx];\n\tSOUNDING_MODE\tmode;\n\n\tif(BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU)\n\t{\n\t\tmode = SOUNDING_FW_VHT_TIMER;\n\t}\n\telse if(BeamEntry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT)\n\t{\n\t\tmode = SOUNDING_FW_HT_TIMER;\n\t}\n\telse\n\t{\n\t\tmode = SOUNDING_STOP_All_TIMER;\n\t}\n\n\treturn mode;\n}\n\nu16\tbeamforming_sounding_time(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx)\n{\n\tu16\t\t\t\t\t\tsounding_time = 0xffff;\n\tstruct beamforming_entry\tBeamEntry = pBeamInfo->beamforming_entry[idx];\n\n\tsounding_time = BeamEntry.sound_period;\n\n\treturn sounding_time;\n}\n\nCHANNEL_WIDTH\tbeamforming_sounding_bw(struct beamforming_info *pBeamInfo, SOUNDING_MODE mode, u8 idx)\n{\n\tCHANNEL_WIDTH\t\t\t\tsounding_bw = CHANNEL_WIDTH_20;\n\tstruct beamforming_entry\t\tBeamEntry = pBeamInfo->beamforming_entry[idx];\n\n\tsounding_bw = BeamEntry.sound_bw;\n\n\treturn sounding_bw;\n}\n\nBOOLEAN\tbeamforming_select_beam_entry(struct beamforming_info *pBeamInfo)\n{\n\tstruct sounding_info\t\t*pSoundInfo = &(pBeamInfo->sounding_info);\n\n\tpSoundInfo->sound_idx = beamforming_sounding_idx(pBeamInfo);\n\n\tif(pSoundInfo->sound_idx < BEAMFORMING_ENTRY_NUM)\n\t\tpSoundInfo->sound_mode = beamforming_sounding_mode(pBeamInfo, pSoundInfo->sound_idx);\n\telse\n\t\tpSoundInfo->sound_mode = SOUNDING_STOP_All_TIMER;\n\t\n\tif(SOUNDING_STOP_All_TIMER == pSoundInfo->sound_mode)\n\t{\n\t\treturn _FALSE;\n\t}\n\telse\n\t{\n\t\tpSoundInfo->sound_bw = beamforming_sounding_bw(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx );\n\t\tpSoundInfo->sound_period = beamforming_sounding_time(pBeamInfo, pSoundInfo->sound_mode, pSoundInfo->sound_idx );\n\t\treturn _TRUE;\n\t}\n}\n\nBOOLEAN\tbeamforming_start_fw(PADAPTER adapter, u8 idx)\n{\n\tu8\t\t\t\t\t\t*RA = NULL;\n\tstruct beamforming_entry\t*pEntry;\n\tBOOLEAN\t\t\t\t\tret = _TRUE;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\n\tpEntry = &(pBeamInfo->beamforming_entry[idx]);\n\tif(pEntry->bUsed == _FALSE)\n\t{\n\t\tDBG_871X(\"Skip Beamforming, no entry for Idx =%d\\n\", idx);\n\t\treturn _FALSE;\n\t}\n\n\tpEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSING;\n\tpEntry->bSound = _TRUE;\n\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx);\n\n\treturn _TRUE;\n}\n\nvoid\tbeamforming_end_fw(PADAPTER adapter)\n{\n\tu8\tidx = 0;\n\n\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&idx);\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n}\n\nBOOLEAN\tbeamforming_start_period(PADAPTER adapter)\n{\n\tBOOLEAN\tret = _TRUE;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct sounding_info\t\t*pSoundInfo = &(pBeamInfo->sounding_info);\n\n\tbeamforming_dym_ndpa_rate(adapter);\n\n\tbeamforming_select_beam_entry(pBeamInfo);\n\n\tif(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER)\n\t{\n\t\tret = beamforming_start_fw(adapter, pSoundInfo->sound_idx);\n\t}\n\telse\n\t{\n\t\tret = _FALSE;\n\t}\n\n\tDBG_871X(\"%s Idx %d Mode %d BW %d Period %d\\n\", __FUNCTION__, \n\t\t\tpSoundInfo->sound_idx, pSoundInfo->sound_mode, pSoundInfo->sound_bw, pSoundInfo->sound_period);\n\n\treturn ret;\n}\n\nvoid\tbeamforming_end_period(PADAPTER adapter)\n{\n\tu8\t\t\t\t\t\tidx = 0;\n\tstruct beamforming_entry\t*pBeamformEntry;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct sounding_info\t\t*pSoundInfo = &(pBeamInfo->sounding_info);\n\n\n\tif(pSoundInfo->sound_mode == SOUNDING_FW_VHT_TIMER || pSoundInfo->sound_mode == SOUNDING_FW_HT_TIMER)\n\t{\t\t\n\t\tbeamforming_end_fw(adapter);\n\t}\n}\n\nvoid\tbeamforming_notify(PADAPTER adapter)\n{\n\tBOOLEAN\t\tbSounding = _FALSE;\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(&(adapter->mlmepriv));\n\n\tbSounding = beamfomring_bSounding(pBeamInfo);\n\t\n\tif(pBeamInfo->beamforming_state == BEAMFORMING_STATE_IDLE)\n\t{\n\t\tif(bSounding)\n\t\t{\t\t\t\n\t\t\tif(beamforming_start_period(adapter) == _TRUE)\n\t\t\t\tpBeamInfo->beamforming_state = BEAMFORMING_STATE_START;\n\t\t}\n\t}\n\telse if(pBeamInfo->beamforming_state == BEAMFORMING_STATE_START)\n\t{\n\t\tif(bSounding)\n\t\t{\n\t\t\tif(beamforming_start_period(adapter) == _FALSE)\n\t\t\t\tpBeamInfo->beamforming_state = BEAMFORMING_STATE_END;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbeamforming_end_period(adapter);\n\t\t\tpBeamInfo->beamforming_state = BEAMFORMING_STATE_END;\n\t\t}\n\t}\n\telse if(pBeamInfo->beamforming_state == BEAMFORMING_STATE_END)\n\t{\n\t\tif(bSounding)\n\t\t{\n\t\t\tif(beamforming_start_period(adapter) == _TRUE)\n\t\t\t\tpBeamInfo->beamforming_state = BEAMFORMING_STATE_START;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s BeamformState %d\\n\", __FUNCTION__, pBeamInfo->beamforming_state);\n\t}\n\n\tDBG_871X(\"%s BeamformState %d bSounding %d\\n\", __FUNCTION__, pBeamInfo->beamforming_state, bSounding);\n}\n\nBOOLEAN\tbeamforming_init_entry(PADAPTER\tadapter, struct sta_info *psta, u8* idx)\n{\n\tstruct mlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct ht_priv\t\t*phtpriv = &(pmlmepriv->htpriv);\n#ifdef CONFIG_80211AC_VHT\t\n\tstruct vht_priv\t\t*pvhtpriv = &(pmlmepriv->vhtpriv);\n#endif\n\tstruct mlme_ext_priv\t*pmlmeext = &(adapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct beamforming_entry\t*pBeamformEntry = NULL;\n\tu8\t*ra; \n\tu16\taid, mac_id;\n\tu8\twireless_mode;\n\tCHANNEL_WIDTH\tbw = CHANNEL_WIDTH_20;\n\tBEAMFORMING_CAP\tbeamform_cap = BEAMFORMING_CAP_NONE;\n\n\t// The current setting does not support Beaforming\n\tif (0 == phtpriv->beamform_cap \n#ifdef CONFIG_80211AC_VHT\n\t\t&& 0 == pvhtpriv->beamform_cap\n#endif\n\t\t) {\n\t\tDBG_871X(\"The configuration disabled Beamforming! Skip...\\n\");\n\t\treturn _FALSE;\n\t}\n\n\taid = psta->aid;\n\tra = psta->hwaddr;\n\tmac_id = psta->mac_id;\n\twireless_mode = psta->wireless_mode;\n\tbw = psta->bw_mode;\n\n\tif (IsSupportedHT(wireless_mode) || IsSupportedVHT(wireless_mode)) {\n\t\t//3 // HT\n\t\tu8\tcur_beamform;\n\n\t\tcur_beamform = psta->htpriv.beamform_cap;\n\n\t\t// We are Beamformee because the STA is Beamformer\n\t\tif(TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMER_ENABLE))\n\t\t\tbeamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMEE_CAP_HT_EXPLICIT);\n\n\t\t// We are Beamformer because the STA is Beamformee\n\t\tif(TEST_FLAG(cur_beamform, BEAMFORMING_HT_BEAMFORMEE_ENABLE))\n\t\t\tbeamform_cap =(BEAMFORMING_CAP)(beamform_cap | BEAMFORMER_CAP_HT_EXPLICIT);\n#ifdef CONFIG_80211AC_VHT\n\t\tif (IsSupportedVHT(wireless_mode)) {\n\t\t\t//3 // VHT\n\t\t\tcur_beamform = psta->vhtpriv.beamform_cap;\n\n\t\t\t// We are Beamformee because the STA is Beamformer\n\t\t\tif(TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMER_ENABLE))\n\t\t\t\tbeamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMEE_CAP_VHT_SU);\n\t\t\t// We are Beamformer because the STA is Beamformee\n\t\t\tif(TEST_FLAG(cur_beamform, BEAMFORMING_VHT_BEAMFORMEE_ENABLE))\n\t\t\t\tbeamform_cap =(BEAMFORMING_CAP)(beamform_cap |BEAMFORMER_CAP_VHT_SU);\n\t\t}\n#endif //CONFIG_80211AC_VHT\n\n\t\tif(beamform_cap == BEAMFORMING_CAP_NONE)\n\t\t\treturn _FALSE;\n\t\t\n\t\tDBG_871X(\"Beamforming Config Capability = 0x%02X\\n\", beamform_cap);\n\n\t\tpBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ra, idx);\n\t\tif (pBeamformEntry == NULL) {\n\t\t\tpBeamformEntry = beamforming_add_entry(adapter, ra, aid, mac_id, bw, beamform_cap, idx);\n\t\t\tif(pBeamformEntry == NULL)\n\t\t\t\treturn _FALSE;\n\t\t\telse\n\t\t\t\tpBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING;\n\t\t} else {\n\t\t\t// Entry has been created. If entry is initialing or progressing then errors occur.\n\t\t\tif (pBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_INITIALIZED && \n\t\t\t\tpBeamformEntry->beamforming_entry_state != BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\t\tDBG_871X(\"Error State of Beamforming\");\n\t\t\t\treturn _FALSE;\n\t\t\t} else {\n\t\t\t\tpBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZEING;\n\t\t\t}\n\t\t}\n\n\t\tpBeamformEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\tpsta->txbf_paid = pBeamformEntry->p_aid;\n\t\tpsta->txbf_gid = pBeamformEntry->g_id;\n\n\t\tDBG_871X(\"%s Idx %d\\n\", __FUNCTION__, *idx);\n\t} else {\n\t\treturn _FALSE;\n\t}\n\n\treturn _SUCCESS;\n}\n\nvoid\tbeamforming_deinit_entry(PADAPTER adapter, u8* ra)\n{\n\tu8\tidx = 0;\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\t\n\tif(beamforming_remove_entry(pmlmepriv, ra, &idx) == _TRUE)\n\t{\n\t\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx);\n\t}\n\n\tDBG_871X(\"%s Idx %d\\n\", __FUNCTION__, idx);\n}\n\nvoid\tbeamforming_reset(PADAPTER adapter)\n{\n\tu8\tidx = 0;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\n\tfor(idx = 0; idx < BEAMFORMING_ENTRY_NUM; idx++)\n\t{\n\t\tif(pBeamInfo->beamforming_entry[idx].bUsed == _TRUE)\n\t\t{\n\t\t\tpBeamInfo->beamforming_entry[idx].bUsed = _FALSE;\n\t\t\tpBeamInfo->beamforming_entry[idx].beamforming_entry_cap = BEAMFORMING_CAP_NONE;\n\t\t\tpBeamInfo->beamforming_entry[idx].beamforming_entry_state= BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_LEAVE, (u8 *)&idx);\n\t\t}\n\t}\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n}\n\nvoid beamforming_sounding_fail(PADAPTER Adapter)\n{\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct beamforming_entry\t*pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]);\n\n\tpEntry->bSound = _FALSE;\n\trtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx);\n\tbeamforming_deinit_entry(Adapter, pEntry->mac_addr);\n}\n\nvoid\tbeamforming_check_sounding_success(PADAPTER Adapter,BOOLEAN status)\n{\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct beamforming_entry\t*pEntry = &(pBeamInfo->beamforming_entry[pBeamInfo->beamforming_cur_idx]);\n\n\tif(status == 1)\n\t{\n\t\tpEntry->LogStatusFailCnt = 0;\n\t}\t\n\telse\n\t{\n\t\tpEntry->LogStatusFailCnt++;\n\t\tDBG_871X(\"%s LogStatusFailCnt %d\\n\", __FUNCTION__, pEntry->LogStatusFailCnt);\n\t}\n\tif(pEntry->LogStatusFailCnt > 20)\n\t{\n\t\tDBG_871X(\"%s LogStatusFailCnt > 20, Stop SOUNDING\\n\", __FUNCTION__);\n\t\t//pEntry->bSound = _FALSE;\n\t\t//rtw_hal_set_hwreg(Adapter, HW_VAR_SOUNDING_FW_NDPA, (u8 *)&pBeamInfo->beamforming_cur_idx);\n\t\t//beamforming_deinit_entry(Adapter, pEntry->mac_addr);\n\t\tbeamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_FAIL, NULL, 0, 1);\n\t}\n}\n\nvoid\tbeamforming_enter(PADAPTER adapter, PVOID psta)\n{\n\tu8\tidx = 0xff;\n\n\tif(beamforming_init_entry(adapter, (struct sta_info *)psta, &idx))\n\t\trtw_hal_set_hwreg(adapter, HW_VAR_SOUNDING_ENTER, (u8 *)&idx);\n\n\t//DBG_871X(\"%s Idx %d\\n\", __FUNCTION__, idx);\n}\n\nvoid\tbeamforming_leave(PADAPTER adapter,u8* ra)\n{\n\tif(ra == NULL)\n\t\tbeamforming_reset(adapter);\n\telse\n\t\tbeamforming_deinit_entry(adapter, ra);\n\n\tbeamforming_notify(adapter);\n}\n\nBEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info\t*pBeamInfo)\n{\n\tu8\ti;\n\tBOOLEAN \t\t\t\tbSelfBeamformer = _FALSE;\n\tBOOLEAN \t\t\t\tbSelfBeamformee = _FALSE;\n\tstruct beamforming_entry\tbeamforming_entry;\n\tBEAMFORMING_CAP \t\tbeamform_cap = BEAMFORMING_CAP_NONE;\n\n\tfor(i = 0; i < BEAMFORMING_ENTRY_NUM; i++)\n\t{\n\t\tbeamforming_entry = pBeamInfo->beamforming_entry[i];\n\n\t\tif(beamforming_entry.bUsed)\n\t\t{\n\t\t\tif( (beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) ||\n\t\t\t\t(beamforming_entry.beamforming_entry_cap & BEAMFORMEE_CAP_HT_EXPLICIT))\n\t\t\t\tbSelfBeamformee = _TRUE;\n\t\t\tif( (beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) ||\n\t\t\t\t(beamforming_entry.beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT))\n\t\t\t\tbSelfBeamformer = _TRUE;\n\t\t}\n\n\t\tif(bSelfBeamformer && bSelfBeamformee)\n\t\t\ti = BEAMFORMING_ENTRY_NUM;\n\t}\n\n\tif(bSelfBeamformer)\n\t\tbeamform_cap |= BEAMFORMER_CAP;\n\tif(bSelfBeamformee)\n\t\tbeamform_cap |= BEAMFORMEE_CAP;\n\n\treturn beamform_cap;\n}\n\nvoid\tbeamforming_watchdog(PADAPTER Adapter)\n{\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(( &(Adapter->mlmepriv)));\n\n\tif(pBeamInfo->beamforming_state != BEAMFORMING_STATE_START)\n\t\treturn;\n\n\tbeamforming_dym_period(Adapter);\n\tbeamforming_dym_ndpa_rate(Adapter);\n}\n#endif/* #if (BEAMFORMING_SUPPORT ==0) - for diver defined beamforming*/\n\nu32\tbeamforming_get_report_frame(PADAPTER\t Adapter, union recv_frame *precv_frame)\n{\n\tu32\tret = _SUCCESS;\n#if (BEAMFORMING_SUPPORT == 1)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\n\tret = Beamforming_GetReportFrame(pDM_Odm, precv_frame);\n\t\n#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/\n\tstruct beamforming_entry\t*pBeamformEntry = NULL;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tu8\t*pframe = precv_frame->u.hdr.rx_data;\n\tu32\tframe_len = precv_frame->u.hdr.len;\n\tu8\t*ta;\n\tu8\tidx, offset;\n\t\n\t/*DBG_871X(\"beamforming_get_report_frame\\n\");*/\n\n\t/*Memory comparison to see if CSI report is the same with previous one*/\n\tta = GetAddr2Ptr(pframe);\n\tpBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx);\n\tif (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU)\n\t\toffset = 31;\t/*24+(1+1+3)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/\n\telse if (pBeamformEntry->beamforming_entry_cap & BEAMFORMER_CAP_HT_EXPLICIT)\n\t\toffset = 34;\t/*24+(1+1+6)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/\n\telse\n\t\treturn ret;\n\n\t/*DBG_871X(\"%s MacId %d offset=%d\\n\", __FUNCTION__, pBeamformEntry->mac_id, offset);*/\n\n\tif (_rtw_memcmp(pBeamformEntry->PreCsiReport + offset, pframe+offset, frame_len-offset) == _FALSE)\n\t\tpBeamformEntry->DefaultCsiCnt = 0;\n\telse \n\t\tpBeamformEntry->DefaultCsiCnt++;\n\t\n\t_rtw_memcpy(&pBeamformEntry->PreCsiReport, pframe, frame_len);\n\n\tpBeamformEntry->bDefaultCSI = _FALSE;\n\n\tif (pBeamformEntry->DefaultCsiCnt > 20)\n\t\tpBeamformEntry->bDefaultCSI = _TRUE;\n\telse\n\t\tpBeamformEntry->bDefaultCSI = _FALSE;\n#endif\n\treturn ret;\n}\n\nvoid\tbeamforming_get_ndpa_frame(PADAPTER\t Adapter, union recv_frame *precv_frame)\n{\n#if (BEAMFORMING_SUPPORT == 1)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\n\tBeamforming_GetNDPAFrame(pDM_Odm, precv_frame);\n\n#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/\n\tu8\t*ta;\n\tu8\tidx, Sequence;\n\tu8\t*pframe = precv_frame->u.hdr.rx_data;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_entry\t*pBeamformEntry = NULL;\n\n\t/*DBG_871X(\"beamforming_get_ndpa_frame\\n\");*/\n\n\tif (IS_HARDWARE_TYPE_8812(Adapter) == _FALSE)\n\t\treturn;\n\telse if (GetFrameSubType(pframe) != WIFI_NDPA)\n\t\treturn;\n\n\tta = GetAddr2Ptr(pframe);\n\t/*Remove signaling TA. */\n\tta[0] = ta[0] & 0xFE; \n\t\n\tpBeamformEntry = beamforming_get_entry_by_addr(pmlmepriv, ta, &idx);\n\n\tif (pBeamformEntry == NULL)\n\t\treturn;\n\telse if (!(pBeamformEntry->beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU))\n\t\treturn;\n\t/*LogSuccess: As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is NO LONGER needed !2015-04-10, Jeffery*/\n\t/*ClockResetTimes: While BFer entry always doesn't receive our CSI, clock will reset again and again.So ClockResetTimes is limited to 5 times.2015-04-13, Jeffery*/\n\telse if ((pBeamformEntry->LogSuccess == 1) || (pBeamformEntry->ClockResetTimes == 5)) {\n\t\tDBG_871X(\"[%s] LogSeq=%d, PreLogSeq=%d\\n\", __func__, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq);\n\t\treturn;\n\t}\n\n\tSequence = (pframe[16]) >> 2;\n\tDBG_871X(\"[%s] Start, Sequence=%d, LogSeq=%d, PreLogSeq=%d, LogRetryCnt=%d, ClockResetTimes=%d, LogSuccess=%d\\n\", \n\t\t__func__, Sequence, pBeamformEntry->LogSeq, pBeamformEntry->PreLogSeq, pBeamformEntry->LogRetryCnt, pBeamformEntry->ClockResetTimes, pBeamformEntry->LogSuccess);\n\n\tif ((pBeamformEntry->LogSeq != 0) && (pBeamformEntry->PreLogSeq != 0)) {\n\t\t/*Success condition*/\n\t\tif ((pBeamformEntry->LogSeq != Sequence) && (pBeamformEntry->PreLogSeq != pBeamformEntry->LogSeq)) {\n\t\t\t/* break option for clcok reset, 2015-03-30, Jeffery */\n\t\t\tpBeamformEntry->LogRetryCnt = 0;\n\t\t\t/*As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is no longer needed.*/\n\t\t\t/*That is, LogSuccess is NOT needed to be reset to zero, 2015-04-13, Jeffery*/\n\t\t\tpBeamformEntry->LogSuccess = 1;\n\t\t\n\t\t} else {/*Fail condition*/\n\n\t\t\tif (pBeamformEntry->LogRetryCnt == 5) {\n\t\t\t\tpBeamformEntry->ClockResetTimes++;\n\t\tpBeamformEntry->LogRetryCnt = 0;\n\n\t\t\t\tDBG_871X(\"[%s] Clock Reset!!! ClockResetTimes=%d\\n\",  __func__, pBeamformEntry->ClockResetTimes);\n\t\t\tbeamforming_wk_cmd(Adapter, BEAMFORMING_CTRL_SOUNDING_CLK, NULL, 0, 1);\n\n\t\t\t} else\n\t\tpBeamformEntry->LogRetryCnt++;\n\t}\n\t}\n\n\t/*Update LogSeq & PreLogSeq*/\n\tpBeamformEntry->PreLogSeq = pBeamformEntry->LogSeq;\n\tpBeamformEntry->LogSeq = Sequence;\n\n#endif\n\t\n}\n\n\n\n\nvoid\tbeamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n_func_enter_;\n\n#if (BEAMFORMING_SUPPORT == 1) /*(BEAMFORMING_SUPPORT == 1)- for PHYDM beamfoming*/\n\tswitch (type) {\n\tcase BEAMFORMING_CTRL_ENTER:\n\t{\n\t\tstruct sta_info\t*psta = (PVOID)pbuf;\n\t\tu16\t\t\tstaIdx = psta->mac_id;\n\n\t\tBeamforming_Enter(pDM_Odm, staIdx);\t\t\n\t\tbreak;\n\t}\n\tcase BEAMFORMING_CTRL_LEAVE:\n\t\tBeamforming_Leave(pDM_Odm, pbuf);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\n\t}\n#else /*(BEAMFORMING_SUPPORT == 0)- for drv beamfoming*/\n\tswitch (type) {\t\n\t\tcase BEAMFORMING_CTRL_ENTER:\n\t\t\tbeamforming_enter(padapter, (PVOID)pbuf);\n\t\t\tbreak;\n\n\t\tcase BEAMFORMING_CTRL_LEAVE:\n\t\t\tbeamforming_leave(padapter, pbuf);\n\t\t\tbreak;\n\n\t\tcase BEAMFORMING_CTRL_SOUNDING_FAIL:\n\t\t\tbeamforming_sounding_fail(padapter);\n\t\t\tbreak;\n\n\t\tcase BEAMFORMING_CTRL_SOUNDING_CLK:\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_SOUNDING_CLK, NULL);\n\t\t\tbreak;\n\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n#endif\n_func_exit_;\n}\n\nu8\tbeamforming_wk_cmd(_adapter*padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n_func_enter_;\n\n\tif(enqueue)\n\t{\n\t\tu8\t*wk_buf;\n\t\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif(ph2c==NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\t\tif(pdrvextra_cmd_parm==NULL){\n\t\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (pbuf != NULL) {\n\t\t\twk_buf = rtw_zmalloc(size);\n\t\t\tif(wk_buf==NULL){\n\t\t\t\trtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj));\n\t\t\t\trtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));\n\t\t\t\tres= _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\t_rtw_memcpy(wk_buf, pbuf, size);\n\t\t} else {\n\t\t\twk_buf = NULL;\n\t\t\tsize = 0;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = BEAMFORMING_WK_CID;\n\t\tpdrvextra_cmd_parm->type = type;\n\t\tpdrvextra_cmd_parm->size = size;\n\t\tpdrvextra_cmd_parm->pbuf = wk_buf;\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\telse\n\t{\n\t\tbeamforming_wk_hdl(padapter, type, pbuf);\n\t}\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n}\n\nvoid update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)\n{\n\tif (psta) {\n\t\tpattrib->txbf_g_id = psta->txbf_gid;\n\t\tpattrib->txbf_p_aid = psta->txbf_paid;\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "core/rtw_br_ext.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_BR_EXT_C_\n\n#ifdef __KERNEL__\n#include <linux/if_arp.h>\n#include <net/ip.h>\n#include <net/ipx.h>\n#include <linux/atalk.h>\n#include <linux/udp.h>\n#include <linux/if_pppox.h>\n#endif\n\n#if 1\t// rtw_wifi_driver\n#include <drv_types.h>\n#else\t// rtw_wifi_driver\n#include \"./8192cd_cfg.h\"\n\n#ifndef __KERNEL__\n#include \"./sys-support.h\"\n#endif\n\n#include \"./8192cd.h\"\n#include \"./8192cd_headers.h\"\n#include \"./8192cd_br_ext.h\"\n#include \"./8192cd_debug.h\"\n#endif\t// rtw_wifi_driver\n\n#ifdef CL_IPV6_PASS\n#ifdef __KERNEL__\n#include <linux/ipv6.h>\n#include <linux/icmpv6.h>\n#include <net/ndisc.h>\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))\n#include <net/ip6_checksum.h>\n#else\n#include <net/checksum.h>\n#endif\n#endif\n#endif\n\n#ifdef CONFIG_BR_EXT\n\n//#define BR_EXT_DEBUG\n\n#define NAT25_IPV4\t\t01\n#define NAT25_IPV6\t\t02\n#define NAT25_IPX\t\t03\n#define NAT25_APPLE\t\t04\n#define NAT25_PPPOE\t\t05\n\n#define RTL_RELAY_TAG_LEN (ETH_ALEN)\n#define TAG_HDR_LEN\t\t4\n\n#define MAGIC_CODE\t\t0x8186\n#define MAGIC_CODE_LEN\t2\n#define WAIT_TIME_PPPOE\t5\t// waiting time for pppoe server in sec\n\n/*-----------------------------------------------------------------\n  How database records network address:\n           0    1    2    3    4    5    6    7    8    9   10\n        |----|----|----|----|----|----|----|----|----|----|----|\n  IPv4  |type|                             |      IP addr      |\n  IPX   |type|      Net addr     |          Node addr          |\n  IPX   |type|      Net addr     |Sckt addr|\n  Apple |type| Network |node|\n  PPPoE |type|   SID   |           AC MAC            |\n-----------------------------------------------------------------*/\n\n\n//Find a tag in pppoe frame and return the pointer\nstatic __inline__ unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned short type)\n{\n\tunsigned char *cur_ptr, *start_ptr;\n\tunsigned short tagLen, tagType;\n\n\tstart_ptr = cur_ptr = (unsigned char *)ph->tag;\n\twhile((cur_ptr - start_ptr) < ntohs(ph->length)) {\n\t\t// prevent un-alignment access\n\t\ttagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]);\n\t\ttagLen  = (unsigned short)((cur_ptr[2] << 8) + cur_ptr[3]);\n\t\tif(tagType == type)\n\t\t\treturn cur_ptr;\n\t\tcur_ptr = cur_ptr + TAG_HDR_LEN + tagLen;\n\t}\n\treturn 0;\n}\n\n\nstatic __inline__ int __nat25_add_pppoe_tag(struct sk_buff *skb, struct pppoe_tag *tag)\n{\n\tstruct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN);\n\tint data_len;\n\n\tdata_len = tag->tag_len + TAG_HDR_LEN;\n\tif (skb_tailroom(skb) < data_len) {\n\t\t_DEBUG_ERR(\"skb_tailroom() failed in add SID tag!\\n\");\n\t\treturn -1;\n\t}\n\n\tskb_put(skb, data_len);\n\t// have a room for new tag\n\tmemmove(((unsigned char *)ph->tag + data_len), (unsigned char *)ph->tag, ntohs(ph->length));\n\tph->length = htons(ntohs(ph->length) + data_len);\n\tmemcpy((unsigned char *)ph->tag, tag, data_len);\n\treturn data_len;\n}\n\nstatic int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len)\n{\n\tint tail_len;\n\tunsigned long end, tail;\n\n\tif ((src+len) > skb_tail_pointer(skb) || skb->len < len)\n\t\treturn -1;\n\n\ttail = (unsigned long)skb_tail_pointer(skb);\n\tend = (unsigned long)src+len;\n\tif (tail < end)\n\t\treturn -1;\n\n\ttail_len = (int)(tail-end);\n\tif (tail_len > 0)\n\t\tmemmove(src, src+len, tail_len);\n\n\tskb_trim(skb, skb->len-len);\n\treturn 0;\n}\n\nstatic __inline__ unsigned long __nat25_timeout(_adapter *priv)\n{\n\tunsigned long timeout;\n\n\ttimeout = jiffies - NAT25_AGEING_TIME*HZ;\n\n\treturn timeout;\n}\n\n\nstatic __inline__ int  __nat25_has_expired(_adapter *priv,\n\t\t\t\tstruct nat25_network_db_entry *fdb)\n{\n\tif(time_before_eq(fdb->ageing_timer, __nat25_timeout(priv)))\n\t\treturn 1;\n\n\treturn 0;\n}\n\n\nstatic __inline__ void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr,\n\t\t\t\tunsigned int *ipAddr)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_IPV4;\n\tmemcpy(networkAddr+7, (unsigned char *)ipAddr, 4);\n}\n\n\nstatic __inline__ void __nat25_generate_ipx_network_addr_with_node(unsigned char *networkAddr,\n\t\t\t\tunsigned int *ipxNetAddr, unsigned char *ipxNodeAddr)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_IPX;\n\tmemcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4);\n\tmemcpy(networkAddr+5, ipxNodeAddr, 6);\n}\n\n\nstatic __inline__ void __nat25_generate_ipx_network_addr_with_socket(unsigned char *networkAddr,\n\t\t\t\tunsigned int *ipxNetAddr, unsigned short *ipxSocketAddr)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_IPX;\n\tmemcpy(networkAddr+1, (unsigned char *)ipxNetAddr, 4);\n\tmemcpy(networkAddr+5, (unsigned char *)ipxSocketAddr, 2);\n}\n\n\nstatic __inline__ void __nat25_generate_apple_network_addr(unsigned char *networkAddr,\n\t\t\t\tunsigned short *network, unsigned char *node)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_APPLE;\n\tmemcpy(networkAddr+1, (unsigned char *)network, 2);\n\tnetworkAddr[3] = *node;\n}\n\n\nstatic __inline__ void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr,\n\t\t\t\tunsigned char *ac_mac, unsigned short *sid)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_PPPOE;\n\tmemcpy(networkAddr+1, (unsigned char *)sid, 2);\n\tmemcpy(networkAddr+3, (unsigned char *)ac_mac, 6);\n}\n\n\n#ifdef CL_IPV6_PASS\nstatic  void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr,\n\t\t\t\tunsigned int *ipAddr)\n{\n\tmemset(networkAddr, 0, MAX_NETWORK_ADDR_LEN);\n\n\tnetworkAddr[0] = NAT25_IPV6;\n\tmemcpy(networkAddr+1, (unsigned char *)ipAddr, 16);\n}\n\n\nstatic unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b)\n{\n\twhile (len > 0) {\n\t\tif (*data == tag && *(data+1) == len8b && len >= len8b*8)\n\t\t\treturn data+2;\t\n\t\t\n\t\tlen -= (*(data+1))*8;\t\t\n\t\tdata += (*(data+1))*8;\t\t\n\t}\n\treturn NULL;\n}\n\n\nstatic int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char *replace_mac)\n{\n\tstruct icmp6hdr *icmphdr = (struct icmp6hdr *)data;\n\tunsigned char *mac;\n\t\n\tif (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) { \n\t\tif (len >= 8) {\n\t\t\tmac = scan_tlv(&data[8], len-8, 1, 1);\n\t\t\tif (mac) {\n\t\t\t\tDBG_871X(\"Router Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tmac[0],mac[1],mac[2],mac[3],mac[4],mac[5],\t\t\t\t\t\n\t\t\t\t\treplace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);\n\t\t\t\tmemcpy(mac, replace_mac, 6);\t\n\t\t\t\treturn 1;\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\telse if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) {\n\t\tif (len >= 16) {\n\t\t\tmac = scan_tlv(&data[16], len-16, 1, 1);\n\t\t\tif (mac) {\n\t\t\t\tDBG_871X(\"Router Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tmac[0],mac[1],mac[2],mac[3],mac[4],mac[5],\t\t\t\t\t\n\t\t\t\t\treplace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);\n\t\t\t\tmemcpy(mac, replace_mac, 6);\t\t\t\n\t\t\t\treturn 1;\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\t}\n\telse if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) {\n\t\tif (len >= 24) {\n\t\t\tmac = scan_tlv(&data[24], len-24, 1, 1);\n\t\t\tif (mac) {\t\t\n\t\t\t\tDBG_871X(\"Neighbor Solicitation, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tmac[0],mac[1],mac[2],mac[3],mac[4],mac[5],\t\t\t\t\t\n\t\t\t\t\treplace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);\n\t\t\t\tmemcpy(mac, replace_mac, 6);\t\n\t\t\t\treturn 1;\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\t}\n\telse if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) {\n\t\tif (len >= 24) {\n\t\t\tmac = scan_tlv(&data[24], len-24, 2, 1);\n\t\t\tif (mac) {\n\t\t\t\tDBG_871X(\"Neighbor Advertisement, replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tmac[0],mac[1],mac[2],mac[3],mac[4],mac[5],\t\t\t\t\t\n\t\t\t\t\treplace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);\n\t\t\t\tmemcpy(mac, replace_mac, 6);\t\t\n\t\t\t\treturn 1;\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\t}\n\telse if (icmphdr->icmp6_type == NDISC_REDIRECT) {\n\t\tif (len >= 40) {\n\t\t\tmac = scan_tlv(&data[40], len-40, 2, 1);\n\t\t\tif (mac) {\t\t\t\t\n\t\t\t\tDBG_871X(\"Redirect,  replace MAC From: %02x:%02x:%02x:%02x:%02x:%02x, To: %02x:%02x:%02x:%02x:%02x:%02x\\n\",\n\t\t\t\t\tmac[0],mac[1],mac[2],mac[3],mac[4],mac[5],\t\t\t\t\t\n\t\t\t\t\treplace_mac[0],replace_mac[1],replace_mac[2],replace_mac[3],replace_mac[4],replace_mac[5]);\n\t\t\t\tmemcpy(mac, replace_mac, 6);\t\n\t\t\t\treturn 1;\t\t\t\t\n\t\t\t}\n\t\t}\t\t\n\t}\t\n\treturn 0;\n}\n\n\nstatic void convert_ipv6_mac_to_mc(struct sk_buff *skb)\n{\t\n\tstruct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN);\n\tunsigned char *dst_mac = skb->data;\n\n\t//dst_mac[0] = 0xff;\n\t//dst_mac[1] = 0xff;\n\t/*modified by qinjunjie,ipv6 multicast address ix 0x33-33-xx-xx-xx-xx*/\n\tdst_mac[0] = 0x33;\n\tdst_mac[1] = 0x33;\n\tmemcpy(&dst_mac[2], &iph->daddr.s6_addr32[3], 4);\n\t#if defined(__LINUX_2_6__) \n\t/*modified by qinjunjie,warning:should not remove next line*/\n\tskb->pkt_type = PACKET_MULTICAST;\n\t#endif\n}\n#endif /* CL_IPV6_PASS */\n\n\nstatic __inline__ int __nat25_network_hash(unsigned char *networkAddr)\n{\n\tif(networkAddr[0] == NAT25_IPV4)\n\t{\n\t\tunsigned long x;\n\n\t\tx = networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10];\n\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n\telse if(networkAddr[0] == NAT25_IPX)\n\t{\n\t\tunsigned long x;\n\n\t\tx = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^\n\t\t\tnetworkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10];\n\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n\telse if(networkAddr[0] == NAT25_APPLE)\n\t{\n\t\tunsigned long x;\n\n\t\tx = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3];\n\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n\telse if(networkAddr[0] == NAT25_PPPOE)\n\t{\n\t\tunsigned long x;\n\n\t\tx = networkAddr[0] ^ networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^ networkAddr[6] ^ networkAddr[7] ^ networkAddr[8];\n\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n#ifdef CL_IPV6_PASS\n\telse if(networkAddr[0] == NAT25_IPV6)\n\t{\n\t\tunsigned long x;\n\n\t\tx = networkAddr[1] ^ networkAddr[2] ^ networkAddr[3] ^ networkAddr[4] ^ networkAddr[5] ^\n\t\t\tnetworkAddr[6] ^ networkAddr[7] ^ networkAddr[8] ^ networkAddr[9] ^ networkAddr[10] ^\n\t\t\tnetworkAddr[11] ^ networkAddr[12] ^ networkAddr[13] ^ networkAddr[14] ^ networkAddr[15] ^\n\t\t\tnetworkAddr[16];\n\t\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n#endif\t\n\telse\n\t{\n\t\tunsigned long x = 0;\n\t\tint i;\n\n\t\tfor (i=0; i<MAX_NETWORK_ADDR_LEN; i++)\n\t\t\tx ^= networkAddr[i];\n\n\t\treturn x & (NAT25_HASH_SIZE - 1);\n\t}\n}\n\n\nstatic __inline__ void __network_hash_link(_adapter *priv,\n\t\t\t\tstruct nat25_network_db_entry *ent, int hash)\n{\n\t// Caller must _enter_critical_bh already!\n\t//_irqL irqL;\n\t//_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n\tent->next_hash = priv->nethash[hash];\n\tif(ent->next_hash != NULL)\n\t\tent->next_hash->pprev_hash = &ent->next_hash;\n\tpriv->nethash[hash] = ent;\n\tent->pprev_hash = &priv->nethash[hash];\n\n\t//_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\nstatic __inline__ void __network_hash_unlink(struct nat25_network_db_entry *ent)\n{\n\t// Caller must _enter_critical_bh already!\n\t//_irqL irqL;\n\t//_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n\t*(ent->pprev_hash) = ent->next_hash;\n\tif(ent->next_hash != NULL)\n\t\tent->next_hash->pprev_hash = ent->pprev_hash;\n\tent->next_hash = NULL;\n\tent->pprev_hash = NULL;\n\n\t//_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\nstatic int __nat25_db_network_lookup_and_replace(_adapter *priv,\n\t\t\t\tstruct sk_buff *skb, unsigned char *networkAddr)\n{\n\tstruct nat25_network_db_entry *db;\n\t_irqL irqL;\n\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n\tdb = priv->nethash[__nat25_network_hash(networkAddr)];\n\twhile (db != NULL)\n\t{\n\t\tif(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN))\n\t\t{\n\t\t\tif(!__nat25_has_expired(priv, db))\n\t\t\t{\n\t\t\t\t// replace the destination mac address\n\t\t\t\tmemcpy(skb->data, db->macAddr, ETH_ALEN);\n\t\t\t\tatomic_inc(&db->use_count);\n\n#ifdef CL_IPV6_PASS\n\t\t\t\tDBG_871X(\"NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\"\t\n\t\t\t\t\t\t\t\"%02x%02x%02x%02x%02x%02x\\n\",\t\t\t\t\n\t\t\t\t\tdb->macAddr[0],\n\t\t\t\t\tdb->macAddr[1],\n\t\t\t\t\tdb->macAddr[2],\n\t\t\t\t\tdb->macAddr[3],\n\t\t\t\t\tdb->macAddr[4],\n\t\t\t\t\tdb->macAddr[5],\n\t\t\t\t\tdb->networkAddr[0],\n\t\t\t\t\tdb->networkAddr[1],\n\t\t\t\t\tdb->networkAddr[2],\n\t\t\t\t\tdb->networkAddr[3],\n\t\t\t\t\tdb->networkAddr[4],\n\t\t\t\t\tdb->networkAddr[5],\n\t\t\t\t\tdb->networkAddr[6],\n\t\t\t\t\tdb->networkAddr[7],\n\t\t\t\t\tdb->networkAddr[8],\n\t\t\t\t\tdb->networkAddr[9],\n\t\t\t\t\tdb->networkAddr[10],\n\t\t\t\t\tdb->networkAddr[11],\n\t\t\t\t\tdb->networkAddr[12],\n\t\t\t\t\tdb->networkAddr[13],\n\t\t\t\t\tdb->networkAddr[14],\n\t\t\t\t\tdb->networkAddr[15],\n\t\t\t\t\tdb->networkAddr[16]);\n#else\t\t\t\t\n\t\t\t\tDBG_871X(\"NAT25: Lookup M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\t\t\tdb->macAddr[0],\n\t\t\t\t\tdb->macAddr[1],\n\t\t\t\t\tdb->macAddr[2],\n\t\t\t\t\tdb->macAddr[3],\n\t\t\t\t\tdb->macAddr[4],\n\t\t\t\t\tdb->macAddr[5],\n\t\t\t\t\tdb->networkAddr[0],\n\t\t\t\t\tdb->networkAddr[1],\n\t\t\t\t\tdb->networkAddr[2],\n\t\t\t\t\tdb->networkAddr[3],\n\t\t\t\t\tdb->networkAddr[4],\n\t\t\t\t\tdb->networkAddr[5],\n\t\t\t\t\tdb->networkAddr[6],\n\t\t\t\t\tdb->networkAddr[7],\n\t\t\t\t\tdb->networkAddr[8],\n\t\t\t\t\tdb->networkAddr[9],\n\t\t\t\t\tdb->networkAddr[10]);\n#endif\n\t\t\t}\n\t\t\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\treturn 1;\n\t\t}\n\n\t\tdb = db->next_hash;\n\t}\n\n\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\treturn 0;\n}\n\n\nstatic void __nat25_db_network_insert(_adapter *priv,\n\t\t\t\tunsigned char *macAddr, unsigned char *networkAddr)\n{\n\tstruct nat25_network_db_entry *db;\n\tint hash;\n\t_irqL irqL;\n\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n\thash = __nat25_network_hash(networkAddr);\n\tdb = priv->nethash[hash];\n\twhile (db != NULL)\n\t{\n\t\tif(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN))\n\t\t{\n\t\t\tmemcpy(db->macAddr, macAddr, ETH_ALEN);\n\t\t\tdb->ageing_timer = jiffies;\n\t\t\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\treturn;\n\t\t}\n\n\t\tdb = db->next_hash;\n\t}\n\n\tdb = (struct nat25_network_db_entry *) rtw_malloc(sizeof(*db));\n\tif(db == NULL) {\n\t\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\treturn;\n\t}\n\n\tmemcpy(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN);\n\tmemcpy(db->macAddr, macAddr, ETH_ALEN);\n\tatomic_set(&db->use_count, 1);\n\tdb->ageing_timer = jiffies;\n\n\t__network_hash_link(priv, db, hash);\n\n\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\nstatic void __nat25_db_print(_adapter *priv)\n{\n\t_irqL irqL;\n\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n#ifdef BR_EXT_DEBUG\n\tstatic int counter = 0;\n\tint i, j;\n\tstruct nat25_network_db_entry *db;\n\n\tcounter++;\n\tif((counter % 16) != 0)\n\t\treturn;\n\n\tfor(i=0, j=0; i<NAT25_HASH_SIZE; i++)\n\t{\n\t\tdb = priv->nethash[i];\n\n\t\twhile (db != NULL)\n\t\t{\n#ifdef CL_IPV6_PASS\n\t\t\tpanic_printk(\"NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\"\n\t\t\t\t\t\"%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\t\tj,\n\t\t\t\ti,\n\t\t\t\tatomic_read(&db->use_count),\n\t\t\t\tdb->macAddr[0],\n\t\t\t\tdb->macAddr[1],\n\t\t\t\tdb->macAddr[2],\n\t\t\t\tdb->macAddr[3],\n\t\t\t\tdb->macAddr[4],\n\t\t\t\tdb->macAddr[5],\n\t\t\t\tdb->networkAddr[0],\n\t\t\t\tdb->networkAddr[1],\n\t\t\t\tdb->networkAddr[2],\n\t\t\t\tdb->networkAddr[3],\n\t\t\t\tdb->networkAddr[4],\n\t\t\t\tdb->networkAddr[5],\n\t\t\t\tdb->networkAddr[6],\n\t\t\t\tdb->networkAddr[7],\n\t\t\t\tdb->networkAddr[8],\n\t\t\t\tdb->networkAddr[9],\n\t\t\t\tdb->networkAddr[10],\n\t\t\t\tdb->networkAddr[11],\n\t\t\t\tdb->networkAddr[12],\n\t\t\t\tdb->networkAddr[13],\n\t\t\t\tdb->networkAddr[14],\n\t\t\t\tdb->networkAddr[15],\n\t\t\t\tdb->networkAddr[16]);\n#else\n\t\t\tpanic_printk(\"NAT25: DB(%d) H(%02d) C(%d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\t\tj,\n\t\t\t\ti,\n\t\t\t\tatomic_read(&db->use_count),\n\t\t\t\tdb->macAddr[0],\n\t\t\t\tdb->macAddr[1],\n\t\t\t\tdb->macAddr[2],\n\t\t\t\tdb->macAddr[3],\n\t\t\t\tdb->macAddr[4],\n\t\t\t\tdb->macAddr[5],\n\t\t\t\tdb->networkAddr[0],\n\t\t\t\tdb->networkAddr[1],\n\t\t\t\tdb->networkAddr[2],\n\t\t\t\tdb->networkAddr[3],\n\t\t\t\tdb->networkAddr[4],\n\t\t\t\tdb->networkAddr[5],\n\t\t\t\tdb->networkAddr[6],\n\t\t\t\tdb->networkAddr[7],\n\t\t\t\tdb->networkAddr[8],\n\t\t\t\tdb->networkAddr[9],\n\t\t\t\tdb->networkAddr[10]);\n#endif\n\t\t\tj++;\n\n\t\t\tdb = db->next_hash;\n\t\t}\n\t}\n#endif\n\n\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\n\n\n/*\n *\tNAT2.5 interface\n */\n\nvoid nat25_db_cleanup(_adapter *priv)\n{\n\tint i;\n\t_irqL irqL;\n\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\t\n\tfor(i=0; i<NAT25_HASH_SIZE; i++)\n\t{\n\t\tstruct nat25_network_db_entry *f;\n\t\tf = priv->nethash[i];\n\t\twhile (f != NULL) {\n\t\t\tstruct nat25_network_db_entry *g;\n\n\t\t\tg = f->next_hash;\n\t\t\tif(priv->scdb_entry == f)\n\t\t\t{\n\t\t\t\tmemset(priv->scdb_mac, 0, ETH_ALEN);\n\t\t\t\tmemset(priv->scdb_ip, 0, 4);\n\t\t\t\tpriv->scdb_entry = NULL;\n\t\t\t}\n\t\t\t__network_hash_unlink(f);\n\t\t\trtw_mfree((u8 *) f, sizeof(struct nat25_network_db_entry));\n\n\t\t\tf = g;\n\t\t}\n\t}\n\n\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\nvoid nat25_db_expire(_adapter *priv)\n{\n\tint i;\n\t_irqL irqL;\n\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\t\n\t//if(!priv->ethBrExtInfo.nat25_disable)\n\t{\n\t\tfor (i=0; i<NAT25_HASH_SIZE; i++)\n\t\t{\n\t\t\tstruct nat25_network_db_entry *f;\n\t\t\tf = priv->nethash[i];\n\n\t\t\twhile (f != NULL)\n\t\t\t{\n\t\t\t\tstruct nat25_network_db_entry *g;\n\t\t\t\tg = f->next_hash;\n\n\t\t\t\tif(__nat25_has_expired(priv, f))\n\t\t\t\t{\n\t\t\t\t\tif(atomic_dec_and_test(&f->use_count))\n\t\t\t\t\t{\n#ifdef BR_EXT_DEBUG\n#ifdef CL_IPV6_PASS\n\t\t\t\t\t\tpanic_printk(\"NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\"\n\t\t\t\t\t\t\t\t\"%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\tf->macAddr[0],\n\t\t\t\t\t\t\tf->macAddr[1],\n\t\t\t\t\t\t\tf->macAddr[2],\n\t\t\t\t\t\t\tf->macAddr[3],\n\t\t\t\t\t\t\tf->macAddr[4],\n\t\t\t\t\t\t\tf->macAddr[5],\n\t\t\t\t\t\t\tf->networkAddr[0],\n\t\t\t\t\t\t\tf->networkAddr[1],\n\t\t\t\t\t\t\tf->networkAddr[2],\n\t\t\t\t\t\t\tf->networkAddr[3],\n\t\t\t\t\t\t\tf->networkAddr[4],\n\t\t\t\t\t\t\tf->networkAddr[5],\n\t\t\t\t\t\t\tf->networkAddr[6],\n\t\t\t\t\t\t\tf->networkAddr[7],\n\t\t\t\t\t\t\tf->networkAddr[8],\n\t\t\t\t\t\t\tf->networkAddr[9],\n\t\t\t\t\t\t\tf->networkAddr[10],\n\t\t\t\t\t\t\tf->networkAddr[11],\n\t\t\t\t\t\t\tf->networkAddr[12],\n\t\t\t\t\t\t\tf->networkAddr[13],\n\t\t\t\t\t\t\tf->networkAddr[14],\n\t\t\t\t\t\t\tf->networkAddr[15],\n\t\t\t\t\t\t\tf->networkAddr[16]);\n#else\n\n\t\t\t\t\t\tpanic_printk(\"NAT25 Expire H(%02d) M:%02x%02x%02x%02x%02x%02x N:%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\tf->macAddr[0],\n\t\t\t\t\t\t\tf->macAddr[1],\n\t\t\t\t\t\t\tf->macAddr[2],\n\t\t\t\t\t\t\tf->macAddr[3],\n\t\t\t\t\t\t\tf->macAddr[4],\n\t\t\t\t\t\t\tf->macAddr[5],\n\t\t\t\t\t\t\tf->networkAddr[0],\n\t\t\t\t\t\t\tf->networkAddr[1],\n\t\t\t\t\t\t\tf->networkAddr[2],\n\t\t\t\t\t\t\tf->networkAddr[3],\n\t\t\t\t\t\t\tf->networkAddr[4],\n\t\t\t\t\t\t\tf->networkAddr[5],\n\t\t\t\t\t\t\tf->networkAddr[6],\n\t\t\t\t\t\t\tf->networkAddr[7],\n\t\t\t\t\t\t\tf->networkAddr[8],\n\t\t\t\t\t\t\tf->networkAddr[9],\n\t\t\t\t\t\t\tf->networkAddr[10]);\n#endif\n#endif\n\t\t\t\t\t\tif(priv->scdb_entry == f)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmemset(priv->scdb_mac, 0, ETH_ALEN);\n\t\t\t\t\t\t\tmemset(priv->scdb_ip, 0, 4);\n\t\t\t\t\t\t\tpriv->scdb_entry = NULL;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t__network_hash_unlink(f);\n\t\t\t\t\t\trtw_mfree((u8 *) f, sizeof(struct nat25_network_db_entry));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tf = g;\n\t\t\t}\n\t\t}\n\t}\n\n\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n}\n\n\n#ifdef SUPPORT_TX_MCAST2UNI\nstatic int checkIPMcAndReplace(_adapter *priv, struct sk_buff *skb, unsigned int *dst_ip)\n{\n\tstruct stat_info\t*pstat;\n\tstruct list_head\t*phead, *plist;\n\tint i;\n\n\tphead = &priv->asoc_list;\n\tplist = phead->next;\n\n\twhile (plist != phead) {\n\t\tpstat = list_entry(plist, struct stat_info, asoc_list);\n\t\tplist = plist->next;\n\n\t\tif (pstat->ipmc_num == 0)\n\t\t\tcontinue;\n\n\t\tfor (i=0; i<MAX_IP_MC_ENTRY; i++) {\n\t\t\tif (pstat->ipmc[i].used && !memcmp(&pstat->ipmc[i].mcmac[3], ((unsigned char *)dst_ip)+1, 3)) {\n\t\t\t\tmemcpy(skb->data, pstat->ipmc[i].mcmac, ETH_ALEN);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n#endif\n\nint nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method)\n{\n\tunsigned short protocol;\n\tunsigned char networkAddr[MAX_NETWORK_ADDR_LEN];\n\n\tif(skb == NULL)\n\t\treturn -1;\n\n\tif((method <= NAT25_MIN) || (method >= NAT25_MAX))\n\t\treturn -1;\n\n\tprotocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN));\n\n\t/*---------------------------------------------------*/\n\t/*                 Handle IP frame                   */\n\t/*---------------------------------------------------*/\n\tif(protocol == __constant_htons(ETH_P_IP))\n\t{\n\t\tstruct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN);\n\n\t\tif(((unsigned char*)(iph) + (iph->ihl<<2)) >= (skb->data + ETH_HLEN + skb->len))\n\t\t{\n\t\t\tDEBUG_WARN(\"NAT25: malformed IP packet !\\n\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\treturn -1;\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\t{\n\t\t\t\t\t//some muticast with source IP is all zero, maybe other case is illegal\n\t\t\t\t\t//in class A, B, C, host address is all zero or all one is illegal\n\t\t\t\t\tif (iph->saddr == 0)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tDBG_871X(\"NAT25: Insert IP, SA=%08x, DA=%08x\\n\", iph->saddr, iph->daddr);\n\t\t\t\t\t__nat25_generate_ipv4_network_addr(networkAddr, &iph->saddr);\n\t\t\t\t\t//record source IP address and , source mac address into db\n\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"NAT25: Lookup IP, SA=%08x, DA=%08x\\n\", iph->saddr, iph->daddr);\n#ifdef SUPPORT_TX_MCAST2UNI\n\t\t\t\t\tif (priv->pshare->rf_ft_var.mc2u_disable ||\n\t\t\t\t\t\t\t((((OPMODE & (WIFI_STATION_STATE|WIFI_ASOC_STATE))\n\t\t\t\t\t\t\t== (WIFI_STATION_STATE|WIFI_ASOC_STATE)) &&\n\t\t\t\t\t\t\t!checkIPMcAndReplace(priv, skb, &iph->daddr)) ||\n\t\t\t\t\t\t\t(OPMODE & WIFI_ADHOC_STATE)))\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\t__nat25_generate_ipv4_network_addr(networkAddr, &iph->daddr);\n\n\t\t\t\t\t\tif (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) {\n\t\t\t\t\t\t\tif (*((unsigned char *)&iph->daddr + 3) == 0xff) {\n\t\t\t\t\t\t\t\t// L2 is unicast but L3 is broadcast, make L2 bacome broadcast\n\t\t\t\t\t\t\t\tDBG_871X(\"NAT25: Set DA as boardcast\\n\");\n\t\t\t\t\t\t\t\tmemset(skb->data, 0xff, ETH_ALEN);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// forward unknow IP packet to upper TCP/IP\n\t\t\t\t\t\t\t\tDBG_871X(\"NAT25: Replace DA with BR's MAC\\n\");\n\t\t\t\t\t\t\t\tif ( (*(u32 *)priv->br_mac) == 0 && (*(u16 *)(priv->br_mac+4)) == 0 ) {\n\t\t\t\t\t\t\t\t\tvoid netdev_br_init(struct net_device *netdev);\n\t\t\t\t\t\t\t\t\tprintk(\"Re-init netdev_br_init() due to br_mac==0!\\n\");\n\t\t\t\t\t\t\t\t\tnetdev_br_init(priv->pnetdev);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tmemcpy(skb->data, priv->br_mac, ETH_ALEN);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*                 Handle ARP frame                  */\n\t/*---------------------------------------------------*/\n\telse if(protocol == __constant_htons(ETH_P_ARP))\n\t{\n\t\tstruct arphdr *arp = (struct arphdr *)(skb->data + ETH_HLEN);\n\t\tunsigned char *arp_ptr = (unsigned char *)(arp + 1);\n\t\tunsigned int *sender, *target;\n\n\t\tif(arp->ar_pro != __constant_htons(ETH_P_IP))\n\t\t{\n\t\t\tDEBUG_WARN(\"NAT25: arp protocol unknown (%4x)!\\n\", htons(arp->ar_pro));\n\t\t\treturn -1;\n\t\t}\n\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\treturn 0;\t// skb_copy for all ARP frame\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"NAT25: Insert ARP, MAC=%02x%02x%02x%02x%02x%02x\\n\", arp_ptr[0],\n\t\t\t\t\t\tarp_ptr[1], arp_ptr[2], arp_ptr[3], arp_ptr[4], arp_ptr[5]);\n\n\t\t\t\t\t// change to ARP sender mac address to wlan STA address\n                                        memcpy(arp_ptr, GET_MY_HWADDR(priv), ETH_ALEN);\n\n\t\t\t\t\tarp_ptr += arp->ar_hln;\n\t\t\t\t\tsender = (unsigned int *)arp_ptr;\n\n\t\t\t\t\t__nat25_generate_ipv4_network_addr(networkAddr, sender);\n\n\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"NAT25: Lookup ARP\\n\");\n\n\t\t\t\t\tarp_ptr += arp->ar_hln;\n\t\t\t\t\tsender = (unsigned int *)arp_ptr;\n\t\t\t\t\tarp_ptr += (arp->ar_hln + arp->ar_pln);\n\t\t\t\t\ttarget = (unsigned int *)arp_ptr;\n\n\t\t\t\t\t__nat25_generate_ipv4_network_addr(networkAddr, target);\n\n\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\n\t\t\t\t\t// change to ARP target mac address to Lookup result\n\t\t\t\t\tarp_ptr = (unsigned char *)(arp + 1);\n\t\t\t\t\tarp_ptr += (arp->ar_hln + arp->ar_pln);\n\t\t\t\t\tmemcpy(arp_ptr, skb->data, ETH_ALEN);\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*         Handle IPX and Apple Talk frame           */\n\t/*---------------------------------------------------*/\n\telse if((protocol == __constant_htons(ETH_P_IPX)) || \n\t\t(protocol == __constant_htons(ETH_P_ATALK)) ||\n\t\t(protocol == __constant_htons(ETH_P_AARP)))\n\t{\n\t\tunsigned char ipx_header[2] = {0xFF, 0xFF};\n\t\tstruct ipxhdr\t*ipx = NULL;\n\t\tstruct elapaarp\t*ea = NULL;\n\t\tstruct ddpehdr\t*ddp = NULL;\n\t\tunsigned char *framePtr = skb->data + ETH_HLEN;\n\n\t\tif(protocol == __constant_htons(ETH_P_IPX))\n\t\t{\n\t\t\tDBG_871X(\"NAT25: Protocol=IPX (Ethernet II)\\n\");\n\t\t\tipx = (struct ipxhdr *)framePtr;\n\t\t}\n\t\telse //if(protocol <= __constant_htons(ETH_FRAME_LEN))\n\t\t{\n\t\t\tif(!memcmp(ipx_header, framePtr, 2))\n\t\t\t{\n\t\t\t\tDBG_871X(\"NAT25: Protocol=IPX (Ethernet 802.3)\\n\");\n\t\t\t\tipx = (struct ipxhdr *)framePtr;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tunsigned char ipx_8022_type =  0xE0;\n\t\t\t\tunsigned char snap_8022_type = 0xAA;\n\n\t\t\t\tif(*framePtr == snap_8022_type)\n\t\t\t\t{\n\t\t\t\t\tunsigned char ipx_snap_id[5] = {0x0, 0x0, 0x0, 0x81, 0x37};\t\t// IPX SNAP ID\n\t\t\t\t\tunsigned char aarp_snap_id[5] = {0x00, 0x00, 0x00, 0x80, 0xF3};\t// Apple Talk AARP SNAP ID\n\t\t\t\t\tunsigned char ddp_snap_id[5] = {0x08, 0x00, 0x07, 0x80, 0x9B};\t// Apple Talk DDP SNAP ID\n\n\t\t\t\t\tframePtr += 3;\t// eliminate the 802.2 header\n\n\t\t\t\t\tif(!memcmp(ipx_snap_id, framePtr, 5))\n\t\t\t\t\t{\n\t\t\t\t\t\tframePtr += 5;\t// eliminate the SNAP header\n\n\t\t\t\t\t\tDBG_871X(\"NAT25: Protocol=IPX (Ethernet SNAP)\\n\");\n\t\t\t\t\t\tipx = (struct ipxhdr *)framePtr;\n\t\t\t\t\t}\n\t\t\t\t\telse if(!memcmp(aarp_snap_id, framePtr, 5))\n\t\t\t\t\t{\n\t\t\t\t\t\tframePtr += 5;\t// eliminate the SNAP header\n\n\t\t\t\t\t\tea = (struct elapaarp *)framePtr;\n\t\t\t\t\t}\n\t\t\t\t\telse if(!memcmp(ddp_snap_id, framePtr, 5))\n\t\t\t\t\t{\n\t\t\t\t\t\tframePtr += 5;\t// eliminate the SNAP header\n\n\t\t\t\t\t\tddp = (struct ddpehdr *)framePtr;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDEBUG_WARN(\"NAT25: Protocol=Ethernet SNAP %02x%02x%02x%02x%02x\\n\", framePtr[0],\n\t\t\t\t\t\t\tframePtr[1], framePtr[2], framePtr[3], framePtr[4]);\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(*framePtr == ipx_8022_type)\n\t\t\t\t{\n\t\t\t\t\tframePtr += 3;\t// eliminate the 802.2 header\n\n\t\t\t\t\tif(!memcmp(ipx_header, framePtr, 2))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Protocol=IPX (Ethernet 802.2)\\n\");\n\t\t\t\t\t\tipx = (struct ipxhdr *)framePtr;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*   IPX   */\n\t\tif(ipx != NULL)\n\t\t{\n\t\t\tswitch(method)\n\t\t\t{\n\t\t\t\tcase NAT25_CHECK:\n\t\t\t\t\tif(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Check IPX skb_copy\\n\");\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\treturn -1;\n\n\t\t\t\tcase NAT25_INSERT:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Insert IPX, Dest=%08x,%02x%02x%02x%02x%02x%02x,%04x Source=%08x,%02x%02x%02x%02x%02x%02x,%04x\\n\",\n\t\t\t\t\t\t\tipx->ipx_dest.net,\n\t\t\t\t\t\t\tipx->ipx_dest.node[0],\n\t\t\t\t\t\t\tipx->ipx_dest.node[1],\n\t\t\t\t\t\t\tipx->ipx_dest.node[2],\n\t\t\t\t\t\t\tipx->ipx_dest.node[3],\n\t\t\t\t\t\t\tipx->ipx_dest.node[4],\n\t\t\t\t\t\t\tipx->ipx_dest.node[5],\n\t\t\t\t\t\t\tipx->ipx_dest.sock,\n\t\t\t\t\t\t\tipx->ipx_source.net,\n\t\t\t\t\t\t\tipx->ipx_source.node[0],\n\t\t\t\t\t\t\tipx->ipx_source.node[1],\n\t\t\t\t\t\t\tipx->ipx_source.node[2],\n\t\t\t\t\t\t\tipx->ipx_source.node[3],\n\t\t\t\t\t\t\tipx->ipx_source.node[4],\n\t\t\t\t\t\t\tipx->ipx_source.node[5],\n\t\t\t\t\t\t\tipx->ipx_source.sock);\n\n\t\t\t\t\t\tif(!memcmp(skb->data+ETH_ALEN, ipx->ipx_source.node, ETH_ALEN))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(\"NAT25: Use IPX Net, and Socket as network addr\\n\");\n\n\t\t\t\t\t\t\t__nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_source.net, &ipx->ipx_source.sock);\n\n\t\t\t\t\t\t\t// change IPX source node addr to wlan STA address\n                                                        memcpy(ipx->ipx_source.node, GET_MY_HWADDR(priv), ETH_ALEN);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t__nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_source.net, ipx->ipx_source.node);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tcase NAT25_LOOKUP:\n\t\t\t\t\t{\n                                                if(!memcmp(GET_MY_HWADDR(priv), ipx->ipx_dest.node, ETH_ALEN))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(\"NAT25: Lookup IPX, Modify Destination IPX Node addr\\n\");\n\n\t\t\t\t\t\t\t__nat25_generate_ipx_network_addr_with_socket(networkAddr, &ipx->ipx_dest.net, &ipx->ipx_dest.sock);\n\n\t\t\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\n\t\t\t\t\t\t\t// replace IPX destination node addr with Lookup destination MAC addr\n\t\t\t\t\t\t\tmemcpy(ipx->ipx_dest.node, skb->data, ETH_ALEN);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t__nat25_generate_ipx_network_addr_with_node(networkAddr, &ipx->ipx_dest.net, ipx->ipx_dest.node);\n\n\t\t\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\n\t\t/*   AARP   */\n\t\telse if(ea != NULL)\n\t\t{\n\t\t\t/* Sanity check fields. */\n\t\t\tif(ea->hw_len != ETH_ALEN || ea->pa_len != AARP_PA_ALEN)\n\t\t\t{\n\t\t\t\tDEBUG_WARN(\"NAT25: Appletalk AARP Sanity check fail!\\n\");\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tswitch(method)\n\t\t\t{\n\t\t\t\tcase NAT25_CHECK:\n\t\t\t\t\treturn 0;\n\n\t\t\t\tcase NAT25_INSERT:\n\t\t\t\t\t{\n\t\t\t\t\t\t// change to AARP source mac address to wlan STA address\n                                                memcpy(ea->hw_src, GET_MY_HWADDR(priv), ETH_ALEN);\n\n\t\t\t\t\t\tDBG_871X(\"NAT25: Insert AARP, Source=%d,%d Destination=%d,%d\\n\",\n\t\t\t\t\t\t\tea->pa_src_net,\n\t\t\t\t\t\t\tea->pa_src_node,\n\t\t\t\t\t\t\tea->pa_dst_net,\n\t\t\t\t\t\t\tea->pa_dst_node);\n\n\t\t\t\t\t\t__nat25_generate_apple_network_addr(networkAddr, &ea->pa_src_net, &ea->pa_src_node);\n\n\t\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tcase NAT25_LOOKUP:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Lookup AARP, Source=%d,%d Destination=%d,%d\\n\",\n\t\t\t\t\t\t\tea->pa_src_net,\n\t\t\t\t\t\t\tea->pa_src_node,\n\t\t\t\t\t\t\tea->pa_dst_net,\n\t\t\t\t\t\t\tea->pa_dst_node);\n\n\t\t\t\t\t\t__nat25_generate_apple_network_addr(networkAddr, &ea->pa_dst_net, &ea->pa_dst_node);\n\n\t\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\n\t\t\t\t\t\t// change to AARP destination mac address to Lookup result\n\t\t\t\t\t\tmemcpy(ea->hw_dst, skb->data, ETH_ALEN);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\n\t\t/*   DDP   */\n\t\telse if(ddp != NULL)\n\t\t{\n\t\t\tswitch(method)\n\t\t\t{\n\t\t\t\tcase NAT25_CHECK:\n\t\t\t\t\treturn -1;\n\n\t\t\t\tcase NAT25_INSERT:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Insert DDP, Source=%d,%d Destination=%d,%d\\n\",\n\t\t\t\t\t\t\tddp->deh_snet,\n\t\t\t\t\t\t\tddp->deh_snode,\n\t\t\t\t\t\t\tddp->deh_dnet,\n\t\t\t\t\t\t\tddp->deh_dnode);\n\n\t\t\t\t\t\t__nat25_generate_apple_network_addr(networkAddr, &ddp->deh_snet, &ddp->deh_snode);\n\n\t\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tcase NAT25_LOOKUP:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Lookup DDP, Source=%d,%d Destination=%d,%d\\n\",\n\t\t\t\t\t\t\tddp->deh_snet,\n\t\t\t\t\t\t\tddp->deh_snode,\n\t\t\t\t\t\t\tddp->deh_dnet,\n\t\t\t\t\t\t\tddp->deh_dnode);\n\n\t\t\t\t\t\t__nat25_generate_apple_network_addr(networkAddr, &ddp->deh_dnet, &ddp->deh_dnode);\n\n\t\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*                Handle PPPoE frame                 */\n\t/*---------------------------------------------------*/\n\telse if((protocol == __constant_htons(ETH_P_PPP_DISC)) ||\n\t\t(protocol == __constant_htons(ETH_P_PPP_SES)))\n\t{\n\t\tstruct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN);\n\t\tunsigned short *pMagic;\n\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\tif (ph->sid == 0)\n\t\t\t\t\treturn 0;\n\t\t\t\treturn 1;\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\tif(ph->sid == 0)\t// Discovery phase according to tag\n\t\t\t\t{\n\t\t\t\t\tif(ph->code == PADI_CODE || ph->code == PADR_CODE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (priv->ethBrExtInfo.addPPPoETag) {\n\t\t\t\t\t\t\tstruct pppoe_tag *tag, *pOldTag;\n\t\t\t\t\t\t\tunsigned char tag_buf[40];\n\t\t\t\t\t\t\tint old_tag_len=0;\n\n\t\t\t\t\t\t\ttag = (struct pppoe_tag *)tag_buf;\n\t\t\t\t\t\t\tpOldTag = (struct pppoe_tag *)__nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID));\n\t\t\t\t\t\t\tif (pOldTag) { // if SID existed, copy old value and delete it\n\t\t\t\t\t\t\t\told_tag_len = ntohs(pOldTag->tag_len);\n\t\t\t\t\t\t\t\tif (old_tag_len+TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN > sizeof(tag_buf)) {\n\t\t\t\t\t\t\t\t\tDEBUG_ERR(\"SID tag length too long!\\n\");\n\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tmemcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN,\n\t\t\t\t\t\t\t\t\tpOldTag->tag_data, old_tag_len);\n\n\t\t\t\t\t\t\t\tif (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0) {\n\t\t\t\t\t\t\t\t\tDEBUG_ERR(\"call skb_pull_and_merge() failed in PADI/R packet!\\n\");\n\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttag->tag_type = PTT_RELAY_SID;\n\t\t\t\t\t\t\ttag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len);\n\n\t\t\t\t\t\t\t// insert the magic_code+client mac in relay tag\n\t\t\t\t\t\t\tpMagic = (unsigned short *)tag->tag_data;\n\t\t\t\t\t\t\t*pMagic = htons(MAGIC_CODE);\n\t\t\t\t\t\t\tmemcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN);\n\n\t\t\t\t\t\t\t//Add relay tag\n\t\t\t\t\t\t\tif(__nat25_add_pppoe_tag(skb, tag) < 0)\n\t\t\t\t\t\t\t\treturn -1;\n\n\t\t\t\t\t\t\tDBG_871X(\"NAT25: Insert PPPoE, forward %s packet\\n\",\n\t\t\t\t\t\t\t\t\t\t\t(ph->code == PADI_CODE ? \"PADI\" : \"PADR\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse { // not add relay tag\n\t\t\t\t\t\t\tif (priv->pppoe_connection_in_progress &&\n\t\t\t\t\t\t\t\t\tmemcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN))\t {\n\t\t\t\t\t\t\t\tDEBUG_ERR(\"Discard PPPoE packet due to another PPPoE connection is in progress!\\n\");\n\t\t\t\t\t\t\t\treturn -2;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (priv->pppoe_connection_in_progress == 0)\n\t\t\t\t\t\t\t\tmemcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN);\n\n\t\t\t\t\t\t\tpriv->pppoe_connection_in_progress = WAIT_TIME_PPPOE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\telse\t// session phase\n\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Insert PPPoE, insert session packet to %s\\n\", skb->dev->name);\n\n\t\t\t\t\t\t__nat25_generate_pppoe_network_addr(networkAddr, skb->data, &(ph->sid));\n\n\t\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\n\t\t\t\t\t\t__nat25_db_print(priv);\n\n\t\t\t\t\t\tif (!priv->ethBrExtInfo.addPPPoETag &&\n\t\t\t\t\t\t\t\tpriv->pppoe_connection_in_progress &&\n\t\t\t\t\t\t\t\t\t!memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN))\n\t\t\t\t\t\t\tpriv->pppoe_connection_in_progress = 0;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\tif(ph->code == PADO_CODE || ph->code == PADS_CODE)\n\t\t\t\t{\n\t\t\t\t\tif (priv->ethBrExtInfo.addPPPoETag) {\n\t\t\t\t\t\tstruct pppoe_tag *tag;\n\t\t\t\t\t\tunsigned char *ptr;\n\t\t\t\t\t\tunsigned short tagType, tagLen;\n\t\t\t\t\t\tint offset=0;\n\n\t\t\t\t\t\tif((ptr = __nat25_find_pppoe_tag(ph, ntohs(PTT_RELAY_SID))) == 0) {\n\t\t\t\t\t\t\tDEBUG_ERR(\"Fail to find PTT_RELAY_SID in FADO!\\n\");\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttag = (struct pppoe_tag *)ptr;\n\t\t\t\t\t\ttagType = (unsigned short)((ptr[0] << 8) + ptr[1]);\n\t\t\t\t\t\ttagLen = (unsigned short)((ptr[2] << 8) + ptr[3]);\n\n\t\t\t\t\t\tif((tagType != ntohs(PTT_RELAY_SID)) || (tagLen < (MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN))) {\n\t\t\t\t\t\t\tDEBUG_ERR(\"Invalid PTT_RELAY_SID tag length [%d]!\\n\", tagLen);\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpMagic = (unsigned short *)tag->tag_data;\n\t\t\t\t\t\tif (ntohs(*pMagic) != MAGIC_CODE) {\n\t\t\t\t\t\t\tDEBUG_ERR(\"Can't find MAGIC_CODE in %s packet!\\n\",\n\t\t\t\t\t\t\t\t(ph->code == PADO_CODE ? \"PADO\" : \"PADS\"));\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmemcpy(skb->data, tag->tag_data+MAGIC_CODE_LEN, ETH_ALEN);\n\n\t\t\t\t\t\tif (tagLen > MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN)\n\t\t\t\t\t\t\toffset = TAG_HDR_LEN;\n\n\t\t\t\t\t\tif (skb_pull_and_merge(skb, ptr+offset, TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset) < 0) {\n\t\t\t\t\t\t\tDEBUG_ERR(\"call skb_pull_and_merge() failed in PADO packet!\\n\");\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tph->length = htons(ntohs(ph->length)-(TAG_HDR_LEN+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN-offset));\n\t\t\t\t\t\tif (offset > 0)\n\t\t\t\t\t\t\ttag->tag_len = htons(tagLen-MAGIC_CODE_LEN-RTL_RELAY_TAG_LEN);\n\n\t\t\t\t\t\tDBG_871X(\"NAT25: Lookup PPPoE, forward %s Packet from %s\\n\",\n\t\t\t\t\t\t\t(ph->code == PADO_CODE ? \"PADO\" : \"PADS\"),\tskb->dev->name);\n\t\t\t\t\t}\n\t\t\t\t\telse { // not add relay tag\n\t\t\t\t\t\tif (!priv->pppoe_connection_in_progress) {\n\t\t\t\t\t\t\tDEBUG_ERR(\"Discard PPPoE packet due to no connection in progresss!\\n\");\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmemcpy(skb->data, priv->pppoe_addr, ETH_ALEN);\n\t\t\t\t\t\tpriv->pppoe_connection_in_progress = WAIT_TIME_PPPOE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(ph->sid != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"NAT25: Lookup PPPoE, lookup session packet from %s\\n\", skb->dev->name);\n\t\t\t\t\t\t__nat25_generate_pppoe_network_addr(networkAddr, skb->data+ETH_ALEN, &(ph->sid));\n\n\t\t\t\t\t\t__nat25_db_network_lookup_and_replace(priv, skb, networkAddr);\n\n\t\t\t\t\t\t__nat25_db_print(priv);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn -1;\n\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*                 Handle EAP frame                  */\n\t/*---------------------------------------------------*/\n\telse if(protocol == __constant_htons(0x888e))\n\t{\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\treturn -1;\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*         Handle C-Media proprietary frame          */\n\t/*---------------------------------------------------*/\n\telse if((protocol == __constant_htons(0xe2ae)) ||\n\t\t(protocol == __constant_htons(0xe2af)))\n\t{\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\treturn -1;\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/*---------------------------------------------------*/\n\t/*         Handle IPV6 frame      \t\t\t\t\t\t\t  */\n\t/*---------------------------------------------------*/\n#ifdef CL_IPV6_PASS\n\telse if(protocol == __constant_htons(ETH_P_IPV6))\n\t{\n\t\tstruct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + ETH_HLEN);\n\n\t\tif (sizeof(*iph) >= (skb->len - ETH_HLEN))\n\t\t{\n\t\t\tDEBUG_WARN(\"NAT25: malformed IPv6 packet !\\n\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tswitch(method)\n\t\t{\n\t\t\tcase NAT25_CHECK:\n\t\t\t\tif (skb->data[0] & 1)\n\t\t\t\t\treturn 0;\t\t\t\t\n\t\t\t\treturn -1;\n\n\t\t\tcase NAT25_INSERT:\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"NAT25: Insert IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,\"\n\t\t\t\t\t\t\t\t\t\" DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\\n\", \n\t\t\t\t\t\tiph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],\n\t\t\t\t\t\tiph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],\n\t\t\t\t\t\tiph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3],\n\t\t\t\t\t\tiph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]);\n\n\t\t\t\t\tif (memcmp(&iph->saddr, \"\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\\x0\", 16)) {\n\t\t\t\t\t\t__nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr);\n\t\t\t\t\t\t__nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr);\n\t\t\t\t\t\t__nat25_db_print(priv);\n\n\t\t\t\t\t\tif (iph->nexthdr == IPPROTO_ICMPV6 && \n\t\t\t\t\t\t\t\tskb->len > (ETH_HLEN +  sizeof(*iph) + 4)) {\n\t\t\t\t\t\t\tif (update_nd_link_layer_addr(skb->data + ETH_HLEN + sizeof(*iph), \n                                                                skb->len - ETH_HLEN - sizeof(*iph), GET_MY_HWADDR(priv))) {                                                   \n\t\t\t\t\t\t\t\tstruct icmp6hdr  *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph));\n\t\t\t\t\t\t\t\thdr->icmp6_cksum = 0;\n\t\t\t\t\t\t\t\thdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr,\n\t\t\t\t\t\t\t\t\t\t\t\tiph->payload_len,\n\t\t\t\t\t\t\t\t\t\t\t\tIPPROTO_ICMPV6,\n\t\t\t\t\t\t\t\t\t\t\t\tcsum_partial((__u8 *)hdr, iph->payload_len, 0));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tcase NAT25_LOOKUP:\n\t\t\t\tDBG_871X(\"NAT25: Lookup IP, SA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x,\"\n\t\t\t\t\t\t\t\t\" DA=%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x\\n\", \n\t\t\t\t\t\tiph->saddr.s6_addr16[0],iph->saddr.s6_addr16[1],iph->saddr.s6_addr16[2],iph->saddr.s6_addr16[3],\n\t\t\t\t\t\tiph->saddr.s6_addr16[4],iph->saddr.s6_addr16[5],iph->saddr.s6_addr16[6],iph->saddr.s6_addr16[7],\n\t\t\t\t\t\tiph->daddr.s6_addr16[0],iph->daddr.s6_addr16[1],iph->daddr.s6_addr16[2],iph->daddr.s6_addr16[3],\n\t\t\t\t\t\tiph->daddr.s6_addr16[4],iph->daddr.s6_addr16[5],iph->daddr.s6_addr16[6],iph->daddr.s6_addr16[7]);\n\t\t\t\n\n\t\t\t\t__nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->daddr);\n\t\t\t\tif (!__nat25_db_network_lookup_and_replace(priv, skb, networkAddr)) {\n#ifdef SUPPORT_RX_UNI2MCAST\t\t\t\t\t\t\t\n\t\t\t\t\tif (iph->daddr.s6_addr[0] == 0xff)\n\t\t\t\t\t\tconvert_ipv6_mac_to_mc(skb);\t\n#endif\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\treturn 0;\n\n\t\t\tdefault:\n\t\t\t\treturn -1;\n\t\t}\n\t}\n#endif\t// CL_IPV6_PASS\n\n\treturn -1;\n}\n\n\nint nat25_handle_frame(_adapter *priv, struct sk_buff *skb)\n{\n#ifdef BR_EXT_DEBUG\n\tif((!priv->ethBrExtInfo.nat25_disable) && (!(skb->data[0] & 1)))\n\t{\n\t\tpanic_printk(\"NAT25: Input Frame: DA=%02x%02x%02x%02x%02x%02x SA=%02x%02x%02x%02x%02x%02x\\n\",\n\t\t\tskb->data[0],\n\t\t\tskb->data[1],\n\t\t\tskb->data[2],\n\t\t\tskb->data[3],\n\t\t\tskb->data[4],\n\t\t\tskb->data[5],\n\t\t\tskb->data[6],\n\t\t\tskb->data[7],\n\t\t\tskb->data[8],\n\t\t\tskb->data[9],\n\t\t\tskb->data[10],\n\t\t\tskb->data[11]);\n\t}\n#endif\n\n\tif(!(skb->data[0] & 1))\n\t{\n\t\tint is_vlan_tag=0, i, retval=0;\n\t\tunsigned short vlan_hdr=0;\n\n\t\tif (*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_8021Q)) {\n\t\t\tis_vlan_tag = 1;\n\t\t\tvlan_hdr = *((unsigned short *)(skb->data+ETH_ALEN*2+2));\n\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t*((unsigned short *)(skb->data+ETH_ALEN*2+2-i*2)) = *((unsigned short *)(skb->data+ETH_ALEN*2-2-i*2));\n\t\t\tskb_pull(skb, 4);\n\t\t}\n\n\t\tif (!priv->ethBrExtInfo.nat25_disable)\n\t\t{\n\t\t\t_irqL irqL;\n\t\t\t_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\t/*\n\t\t\t *\tThis function look up the destination network address from\n\t\t\t *\tthe NAT2.5 database. Return value = -1 means that the\n\t\t\t *\tcorresponding network protocol is NOT support.\n\t\t\t */\n\t\t\tif (!priv->ethBrExtInfo.nat25sc_disable &&\n\t\t\t\t(*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) &&\n\t\t\t\t!memcmp(priv->scdb_ip, skb->data+ETH_HLEN+16, 4)) {\n\t\t\t\tmemcpy(skb->data, priv->scdb_mac, ETH_ALEN);\n\t\t\t\t\n\t\t\t\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\t\t\n\t\t\t\tretval = nat25_db_handle(priv, skb, NAT25_LOOKUP);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_IP)) &&\n\t\t\t\t\t!memcmp(priv->br_ip, skb->data+ETH_HLEN+16, 4)) ||\n\t\t\t\t((*((unsigned short *)(skb->data+ETH_ALEN*2)) == __constant_htons(ETH_P_ARP)) &&\n\t\t\t\t\t!memcmp(priv->br_ip, skb->data+ETH_HLEN+24, 4))) {\n\t\t\t\t// for traffic to upper TCP/IP\n\t\t\t\tretval = nat25_db_handle(priv, skb, NAT25_LOOKUP);\n\t\t\t}\n\t\t}\n\n\t\tif (is_vlan_tag) {\n\t\t\tskb_push(skb, 4);\n\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t*((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));\n\t\t\t*((unsigned short *)(skb->data+ETH_ALEN*2)) = __constant_htons(ETH_P_8021Q);\n\t\t\t*((unsigned short *)(skb->data+ETH_ALEN*2+2)) = vlan_hdr;\n\t\t}\n\n\t\tif(retval == -1) {\n\t\t\t//DEBUG_ERR(\"NAT25: Lookup fail!\\n\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n#if 0\nvoid mac_clone(_adapter *priv, unsigned char *addr)\n{\n\tstruct sockaddr sa;\n\n\tmemcpy(sa.sa_data, addr, ETH_ALEN);\n\tDBG_871X(\"MAC Clone: Addr=%02x%02x%02x%02x%02x%02x\\n\",\n\t\taddr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);\n\trtl8192cd_set_hwaddr(priv->dev, &sa);\n}\n\n\nint mac_clone_handle_frame(_adapter *priv, struct sk_buff *skb)\n{\n\tif(priv->ethBrExtInfo.macclone_enable && !priv->macclone_completed)\n\t{\n\t\tif(!(skb->data[ETH_ALEN] & 1))\t//// check any other particular MAC add\n\t\t{\n                        if(memcmp(skb->data+ETH_ALEN, GET_MY_HWADDR(priv), ETH_ALEN) &&\n\t\t\t\t((priv->dev->br_port) &&\n\t\t\t\t memcmp(skb->data+ETH_ALEN, priv->br_mac, ETH_ALEN)))\n\t\t\t{\n\t\t\t\tmac_clone(priv, skb->data+ETH_ALEN);\n\t\t\t\tpriv->macclone_completed = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn 0;\n}\n#endif // 0\n\n#define SERVER_PORT\t\t\t67\n#define CLIENT_PORT\t\t\t68\n#define DHCP_MAGIC\t\t\t0x63825363\n#define BROADCAST_FLAG\t\t0x8000\n\nstruct dhcpMessage {\n\tu_int8_t op;\n\tu_int8_t htype;\n\tu_int8_t hlen;\n\tu_int8_t hops;\n\tu_int32_t xid;\n\tu_int16_t secs;\n\tu_int16_t flags;\n\tu_int32_t ciaddr;\n\tu_int32_t yiaddr;\n\tu_int32_t siaddr;\n\tu_int32_t giaddr;\n\tu_int8_t chaddr[16];\n\tu_int8_t sname[64];\n\tu_int8_t file[128];\n\tu_int32_t cookie;\n\tu_int8_t options[308]; /* 312 - cookie */\n};\n\nvoid dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb)\n{\n\tif(skb == NULL)\n\t\treturn;\n\n\tif(!priv->ethBrExtInfo.dhcp_bcst_disable)\n\t{\n\t\tunsigned short protocol = *((unsigned short *)(skb->data + 2 * ETH_ALEN));\n\n\t\tif(protocol == __constant_htons(ETH_P_IP)) // IP\n\t\t{\n\t\t\tstruct iphdr* iph = (struct iphdr *)(skb->data + ETH_HLEN);\n\n\t\t\tif(iph->protocol == IPPROTO_UDP) // UDP\n\t\t\t{\n\t\t\t\tstruct udphdr *udph = (struct udphdr *)((SIZE_PTR)iph + (iph->ihl << 2));\n\n\t\t\t\tif((udph->source == __constant_htons(CLIENT_PORT))\n\t\t\t\t\t&& (udph->dest == __constant_htons(SERVER_PORT))) // DHCP request\n\t\t\t\t{\n\t\t\t\t\tstruct dhcpMessage *dhcph =\n\t\t\t\t\t\t(struct dhcpMessage *)((SIZE_PTR)udph + sizeof(struct udphdr));\n\n\t\t\t\t\tif(dhcph->cookie == __constant_htonl(DHCP_MAGIC)) // match magic word\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!(dhcph->flags & htons(BROADCAST_FLAG))) // if not broadcast\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tregister int sum = 0;\n\n\t\t\t\t\t\t\tDBG_871X(\"DHCP: change flag of DHCP request to broadcast.\\n\");\n\t\t\t\t\t\t\t// or BROADCAST flag\n\t\t\t\t\t\t\tdhcph->flags |= htons(BROADCAST_FLAG);\n\t\t\t\t\t\t\t// recalculate checksum\n\t\t\t\t\t\t\tsum = ~(udph->check) & 0xffff;\n\t\t\t\t\t\t\tsum += dhcph->flags;\n\t\t\t\t\t\t\twhile(sum >> 16)\n\t\t\t\t\t\t\t\tsum = (sum & 0xffff) + (sum >> 16);\n\t\t\t\t\t\t\tudph->check = ~sum;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nvoid *scdb_findEntry(_adapter *priv, unsigned char *macAddr,\n\t\t\t\tunsigned char *ipAddr)\n{\n\tunsigned char networkAddr[MAX_NETWORK_ADDR_LEN];\n\tstruct nat25_network_db_entry *db;\n\tint hash;\n\t//_irqL irqL;\n\t//_enter_critical_bh(&priv->br_ext_lock, &irqL);\n\n\t__nat25_generate_ipv4_network_addr(networkAddr, (unsigned int *)ipAddr);\n\thash = __nat25_network_hash(networkAddr);\n\tdb = priv->nethash[hash];\n\twhile (db != NULL)\n\t{\n\t\tif(!memcmp(db->networkAddr, networkAddr, MAX_NETWORK_ADDR_LEN)) {\n\t\t\t//_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\t\t\treturn (void *)db;\n\t\t}\n\n\t\tdb = db->next_hash;\n\t}\n\n\t//_exit_critical_bh(&priv->br_ext_lock, &irqL);\n\treturn NULL;\n}\n\n#endif\t// CONFIG_BR_EXT\n\n"
  },
  {
    "path": "core/rtw_bt_mp.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\t\t\t\t\t\t\t\t\t\t  \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#include <drv_types.h>\n#include <rtw_bt_mp.h>\n\n#if defined(CONFIG_RTL8723B)\n#include <rtl8723b_hal.h>\n#endif\n\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)\nvoid MPh2c_timeout_handle(void *FunctionContext)\n{\n\tPADAPTER pAdapter;\n\tPMPT_CONTEXT pMptCtx;\n\n\n\tDBG_8192C(\"[MPT], MPh2c_timeout_handle \\n\");\n\n\tpAdapter = (PADAPTER)FunctionContext;\n\tpMptCtx = &pAdapter->mppriv.MptCtx;\n\n\tpMptCtx->bMPh2c_timeout = _TRUE;\n\n\tif ((_FALSE == pMptCtx->MptH2cRspEvent)\n\t\t|| ((_TRUE == pMptCtx->MptH2cRspEvent)\n\t\t\t&& (_FALSE == pMptCtx->MptBtC2hEvent)))\n\t{\n\t\t_rtw_up_sema(&pMptCtx->MPh2c_Sema);\n\t}\n}\n\nu32 WaitC2Hevent(PADAPTER pAdapter, u8 *C2H_event, u32 delay_time)\n{\n\tPMPT_CONTEXT\t\tpMptCtx=&(pAdapter->mppriv.MptCtx);\n\tpMptCtx->bMPh2c_timeout=_FALSE;\n\t\n\tif( pAdapter->registrypriv.mp_mode == 0 )\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! WaitC2Hevent mp_mode == 0!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\t_set_timer( &pMptCtx->MPh2c_timeout_timer, delay_time );\n\t\n\t_rtw_down_sema(&pMptCtx->MPh2c_Sema);\n\n\tif (pMptCtx->bMPh2c_timeout == _TRUE)\n\t{\n\t\t*C2H_event = _FALSE;\n\t\t\n\t\treturn _FALSE;\n\t}\n\n\t// for safty, cancel timer here again\n\t_cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);\n\t\n\treturn _TRUE;\n}\n\nBT_CTRL_STATUS\nmptbt_CheckC2hFrame(\n\tPADAPTER\t\tAdapter,\n\tPBT_H2C\t\t\tpH2c,\n\tPBT_EXT_C2H\t\tpExtC2h\n\t)\n{\n\tBT_CTRL_STATUS\tc2hStatus = BT_STATUS_C2H_SUCCESS;\n\t\t\n\t//DBG_8192C(\"[MPT], MPT rsp C2H hex: %x %x %x  %x %x %x \\n\"), pExtC2h , pExtC2h+1 ,pExtC2h+2 ,pExtC2h+3 ,pExtC2h+4 ,pExtC2h+5);\n\n\tDBG_8192C(\"[MPT], statusCode = 0x%x\\n\", pExtC2h->statusCode);\n\tDBG_8192C(\"[MPT], retLen = %d\\n\", pExtC2h->retLen);\n\tDBG_8192C(\"[MPT], opCodeVer : req/rsp=%d/%d\\n\", pH2c->opCodeVer, pExtC2h->opCodeVer);\n\tDBG_8192C(\"[MPT], reqNum : req/rsp=%d/%d\\n\", pH2c->reqNum, pExtC2h->reqNum);\n\tif(pExtC2h->reqNum != pH2c->reqNum)\n\t{\n\t\tc2hStatus = BT_STATUS_C2H_REQNUM_MISMATCH;\n\t\tDBG_8192C(\"[MPT], Error!! C2H reqNum Mismatch!!\\n\");\n\t}\n\telse if(pExtC2h->opCodeVer != pH2c->opCodeVer)\n\t{\n\t\tc2hStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH;\n\t\tDBG_8192C(\"[MPT], Error!! OPCode version L mismatch!!\\n\");\n\t}\n\n\treturn c2hStatus;\n}\n\nBT_CTRL_STATUS\nmptbt_SendH2c(\n\tPADAPTER\tAdapter,\n\tPBT_H2C\tpH2c,\n\tu2Byte\t\th2cCmdLen\n\t)\n{\n\t//KIRQL\t\t\t\tOldIrql = KeGetCurrentIrql();\n\tBT_CTRL_STATUS\th2cStatus=BT_STATUS_H2C_SUCCESS;\n\tPMPT_CONTEXT\t\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tu1Byte\t\t\t\ti;\n\n\tDBG_8192C(\"[MPT], mptbt_SendH2c()=========>\\n\");\n\n\t//PlatformResetEvent(&pMptCtx->MptH2cRspEvent);\n\t//PlatformResetEvent(&pMptCtx->MptBtC2hEvent);\n\t\n//\tif(OldIrql == PASSIVE_LEVEL)\n//\t{\n\t\t//RTPRINT_DATA(FMPBT, FMPBT_H2C_CONTENT, (\"[MPT], MPT H2C hex: \\n\"), pH2c, h2cCmdLen);\n\n\t\tfor(i=0; i<BT_H2C_MAX_RETRY; i++)\n\t\t{\n\t\t\tDBG_8192C(\"[MPT], Send H2C command to wifi!!!\\n\");\n\n\t\t\tpMptCtx->MptH2cRspEvent = _FALSE;\n\t\t\tpMptCtx->MptBtC2hEvent = _FALSE;\n\n#if defined(CONFIG_RTL8723B)\n\t\t\trtl8723b_set_FwBtMpOper_cmd(Adapter, pH2c->opCode, pH2c->opCodeVer, pH2c->reqNum, pH2c->buf);\n#endif\n\t\t\tpMptCtx->h2cReqNum++;\n\t\t\tpMptCtx->h2cReqNum %= 16;\n\n\t\t\tif(WaitC2Hevent(Adapter, &pMptCtx->MptH2cRspEvent, 100))\n\t\t\t{\n\t\t\t\tDBG_8192C(\"[MPT], Received WiFi MptH2cRspEvent!!!\\n\");\n\t\t\t\tif(WaitC2Hevent(Adapter, &pMptCtx->MptBtC2hEvent, 400))\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], Received MptBtC2hEvent!!!\\n\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], Error!!BT MptBtC2hEvent timeout!!\\n\");\n\t\t\t\t\th2cStatus = BT_STATUS_H2C_BT_NO_RSP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_8192C(\"[MPT], Error!!WiFi  MptH2cRspEvent timeout!!\\n\");\n\t\t\t\th2cStatus = BT_STATUS_H2C_TIMTOUT;\n\t\t\t}\n\t\t}\n//\t}\n//\telse\n//\t{\n//\t\tRT_ASSERT(FALSE, (\"[MPT],  mptbt_SendH2c() can only run under PASSIVE_LEVEL!!\\n\"));\n//\t\th2cStatus = BT_STATUS_WRONG_LEVEL;\n//\t}\n\n\tDBG_8192C(\"[MPT], mptbt_SendH2c()<=========\\n\");\n\treturn h2cStatus;\n}\n\n\n\nBT_CTRL_STATUS\nmptbt_CheckBtRspStatus(\n\tPADAPTER\t\t\tAdapter,\n\tPBT_EXT_C2H\t\t\tpExtC2h\n\t)\n{\n\tBT_CTRL_STATUS\tretStatus=BT_OP_STATUS_SUCCESS;\n\n\tswitch(pExtC2h->statusCode)\n\t{\n\t\tcase BT_OP_STATUS_SUCCESS:\n\t\t\tretStatus = BT_STATUS_BT_OP_SUCCESS;\n\t\t\tDBG_8192C(\"[MPT], BT status : BT_STATUS_SUCCESS\\n\");\n\t\t\tbreak;\n\t\tcase BT_OP_STATUS_VERSION_MISMATCH:\n\t\t\tretStatus = BT_STATUS_OPCODE_L_VERSION_MISMATCH;\n\t\t\tDBG_8192C(\"[MPT], BT status : BT_STATUS_OPCODE_L_VERSION_MISMATCH\\n\");\n\t\t\tbreak;\n\t\tcase BT_OP_STATUS_UNKNOWN_OPCODE:\n\t\t\tretStatus = BT_STATUS_UNKNOWN_OPCODE_L;\n\t\t\tDBG_8192C(\"[MPT], BT status : BT_STATUS_UNKNOWN_OPCODE_L\\n\");\n\t\t\tbreak;\n\t\tcase BT_OP_STATUS_ERROR_PARAMETER:\n\t\t\tretStatus = BT_STATUS_PARAMETER_FORMAT_ERROR_L;\n\t\t\tDBG_8192C(\"[MPT], BT status : BT_STATUS_PARAMETER_FORMAT_ERROR_L\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tretStatus = BT_STATUS_UNKNOWN_STATUS_L;\n\t\t\tDBG_8192C(\"[MPT], BT status : BT_STATUS_UNKNOWN_STATUS_L\\n\");\n\t\t\tbreak;\n\t}\n\t\n\treturn retStatus;\n}\t\n\n\n\nBT_CTRL_STATUS\nmptbt_BtFwOpCodeProcess(\n\tPADAPTER\t\tAdapter,\n\tu1Byte\t\t\tbtFwOpCode,\n\tu1Byte\t\t\topCodeVer,\n\tpu1Byte\t\t\tpH2cPar,\n\tu1Byte\t\t\th2cParaLen\n\t)\n{\n\tu1Byte\t\t\t\tH2C_Parameter[6] ={0};\n\tPBT_H2C\t\t\t\tpH2c=(PBT_H2C)&H2C_Parameter[0];\n\tPMPT_CONTEXT\t\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tPBT_EXT_C2H\t\t\tpExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0];\n\tu2Byte\t\t\t\tparaLen=0,i;\n\tBT_CTRL_STATUS\th2cStatus=BT_STATUS_H2C_SUCCESS, c2hStatus=BT_STATUS_C2H_SUCCESS;\n\tBT_CTRL_STATUS\tretStatus=BT_STATUS_H2C_BT_NO_RSP;\n\n\tif( Adapter->registrypriv.mp_mode == 0 )\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! mptbt_BtFwOpCodeProces mp_mode == 0!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\tpH2c->opCode = btFwOpCode;\n\tpH2c->opCodeVer = opCodeVer;\n\tpH2c->reqNum = pMptCtx->h2cReqNum;\n\t//PlatformMoveMemory(&pH2c->buf[0], pH2cPar, h2cParaLen);\n\t//_rtw_memcpy(&pH2c->buf[0], pH2cPar, h2cParaLen);\n\t_rtw_memcpy(pH2c->buf, pH2cPar, h2cParaLen);\n\n\tDBG_8192C(\"[MPT], pH2c->opCode=%d\\n\", pH2c->opCode);\n\tDBG_8192C(\"[MPT], pH2c->opCodeVer=%d\\n\", pH2c->opCodeVer);\n\tDBG_8192C(\"[MPT], pH2c->reqNum=%d\\n\", pH2c->reqNum);\n\tDBG_8192C(\"[MPT], h2c parameter length=%d\\n\", h2cParaLen);\n\tfor (i=0; i<h2cParaLen; i++)\n\t{\n\t\tDBG_8192C(\"[MPT], parameter[%d]=0x%02x\\n\", i, pH2c->buf[i]);\n\t}\n\n\th2cStatus = mptbt_SendH2c(Adapter, pH2c, h2cParaLen+2);\n\tif(BT_STATUS_H2C_SUCCESS == h2cStatus)\n\t{\n\t\t// if reach here, it means H2C get the correct c2h response, \n\t\tc2hStatus = mptbt_CheckC2hFrame(Adapter, pH2c, pExtC2h);\n\t\tif(BT_STATUS_C2H_SUCCESS == c2hStatus)\n\t\t{\n\t\t\tretStatus = mptbt_CheckBtRspStatus(Adapter, pExtC2h);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_8192C(\"[MPT], Error!! C2H failed for pH2c->opCode=%d\\n\", pH2c->opCode);\n\t\t\t// check c2h status error, return error status code to upper layer.\n\t\t\tretStatus = c2hStatus;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! H2C failed for pH2c->opCode=%d\\n\", pH2c->opCode);\n\t\t// check h2c status error, return error status code to upper layer.\n\t\tretStatus = h2cStatus;\n\t}\n\n\treturn retStatus;\n}\n\n\n\n\nu2Byte\nmptbt_BtReady(\n\tPADAPTER\t\tAdapter,\n\tPBT_REQ_CMD \tpBtReq,\n\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tPMPT_CONTEXT\t\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tPBT_EXT_C2H\t\t\tpExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0];\n\tu1Byte\t\t\t\ti;\n\tu1Byte\t\t\t\tbtFwVer=0, bdAddr[6]={0};\n\tu2Byte\t\t\t\tbtRealFwVer=0;\n\tpu2Byte \t\t\tpu2Tmp=NULL;\n\n\t//\n\t// check upper layer parameters\n\t//\n\n\t// 1. check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\n\tpBtRsp->pParamStart[0] = MP_BT_NOT_READY;\n\tparaLen = 10;\n\t//\n\t// execute lower layer opcodes\n\t//\n\n\t// Get BT FW version\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_GET_BT_VERSION;\n\t// execute h2c and check respond c2h from bt fw is correct or not\n\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\tpu2Tmp = (pu2Byte)&pExtC2h->buf[0];\n\t\tbtRealFwVer = *pu2Tmp;\n\t\tbtFwVer = pExtC2h->buf[1];\n\t\tDBG_8192C(\"[MPT], btRealFwVer=0x%x, btFwVer=0x%x\\n\", btRealFwVer, btFwVer);\n\t}\n\n\t// Get BD Address\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_GET_BD_ADDR_L;\n\t// execute h2c and check respond c2h from bt fw is correct or not\n\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\tbdAddr[5] = pExtC2h->buf[0];\n\t\tbdAddr[4] = pExtC2h->buf[1];\n\t\tbdAddr[3] = pExtC2h->buf[2];\n\t}\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_GET_BD_ADDR_H;\n\t// execute h2c and check respond c2h from bt fw is correct or not\n\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\tbdAddr[2] = pExtC2h->buf[0];\n\t\tbdAddr[1] = pExtC2h->buf[1];\n\t\tbdAddr[0] = pExtC2h->buf[2];\n\t}\n\tDBG_8192C(\"[MPT], Local BDAddr:\");\n\tfor(i=0; i<6; i++)\n\t{\n\t\tDBG_8192C(\" 0x%x \", bdAddr[i]);\n\t}\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\tpBtRsp->pParamStart[0] = MP_BT_READY;\n\tpu2Tmp = (pu2Byte)&pBtRsp->pParamStart[1];\n\t*pu2Tmp = btRealFwVer;\n\tpBtRsp->pParamStart[3] = btFwVer;\n\tfor(i=0; i<6; i++)\n\t{\n\t\tpBtRsp->pParamStart[4+i] = bdAddr[5-i];\n\t}\n\n\treturn paraLen;\n}\n\nvoid mptbt_close_WiFiRF(PADAPTER Adapter)\n{\n\tPHY_SetBBReg(Adapter, 0x824, 0xF, 0x0);\n\tPHY_SetBBReg(Adapter, 0x824, 0x700000, 0x0);\n\tPHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x0);\n}\n\nvoid mptbt_open_WiFiRF(PADAPTER\tAdapter)\n{\n\tPHY_SetBBReg(Adapter, 0x824, 0x700000, 0x3);\n\tPHY_SetBBReg(Adapter, 0x824, 0xF, 0x2);\n\tPHY_SetRFReg(Adapter, RF_PATH_A, 0x0, 0xF0000, 0x3);\n}\n\nu4Byte mptbt_switch_RF(PADAPTER\tAdapter, u1Byte\tEnter)\n{\n\tu2Byte\ttmp_2byte = 0;\n\n\t//Enter test mode\n\tif (Enter) {\n\t\t////1>. close WiFi RF\n\t\tmptbt_close_WiFiRF(Adapter);\n\t\t\n\t\t////2>. change ant switch to BT\n\t\ttmp_2byte = rtw_read16(Adapter, 0x860);\n\t\ttmp_2byte = tmp_2byte | BIT(9);\n\t\ttmp_2byte = tmp_2byte & (~BIT(8));\n\t\trtw_write16(Adapter, 0x860, tmp_2byte);\n\t\trtw_write16(Adapter, 0x870, 0x300);\n\t} else {\n\t\t////1>. Open WiFi RF\n\t\tmptbt_open_WiFiRF(Adapter);\n\t\t\n\t\t////2>. change ant switch back\n\t\ttmp_2byte = rtw_read16(Adapter, 0x860);\n\t\ttmp_2byte = tmp_2byte | BIT(8);\n\t\ttmp_2byte = tmp_2byte & (~BIT(9));\n\t\trtw_write16(Adapter, 0x860, tmp_2byte);\n\t\trtw_write16(Adapter, 0x870, 0x300);\n\t}\n\n\treturn 0;\n}\n\nu2Byte\nmptbt_BtSetMode(\n\tPADAPTER\t\tAdapter,\n\tPBT_REQ_CMD \tpBtReq,\n\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tu1Byte\t\t\t\tbtModeToSet=0;\n\n\t//\n\t// check upper layer parameters\n\t//\n\t// 1. check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\t// 2. check upper layer parameter length\n\tif(1 == pBtReq->paraLength)\n\t{\n\t\tbtModeToSet = pBtReq->pParamStart[0];\n\t\tDBG_8192C(\"[MPT], BtTestMode=%d \\n\", btModeToSet);\n\t}\n\telse\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d (should be 1)\\n\", pBtReq->paraLength);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\t\n\t//\n\t// execute lower layer opcodes\n\t//\n\t\n\t// 1. fill h2c parameters\t\n\t// check bt mode\n\tbtOpcode = BT_LO_OP_SET_BT_MODE;\n\tif(btModeToSet >= MP_BT_MODE_MAX)\n\t{\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\tmptbt_switch_RF(Adapter, 1);\n\n\t\th2cParaBuf[0] = btModeToSet;\n\t\th2cParaLen = 1;\n\t\t// 2. execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// 3. construct respond status code and data.\n\tif(BT_STATUS_BT_OP_SUCCESS == retStatus)\n\t{\n\t\tpBtRsp->status = BT_STATUS_SUCCESS;\n\t}\n\telse\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t}\n\t\n\treturn paraLen;\n}\n\n\nVOID\nMPTBT_FwC2hBtMpCtrl(\n\tPADAPTER\tAdapter,\n\tpu1Byte \ttmpBuf,\n\tu1Byte\t\tlength\n\t)\n{\n\tu32 i;\n\tPMPT_CONTEXT\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tPBT_EXT_C2H pExtC2h=(PBT_EXT_C2H)tmpBuf;\n\t\n\tif(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 )\n\t{\t\n\t\t//DBG_8192C(\"Ignore C2H BT MP Info since not in MP mode \\n\");\n\t\treturn;\n\t}\n\tif( length > 32 || length < 3 )\n\t{\n\t\tDBG_8192C(\"\\n [MPT], pExtC2h->buf hex: length=%d > 32 || < 3\\n\",length);\n\t\treturn;\n\t}\n\n\t//cancel_timeout for h2c handle\n\t_cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);\n\n\tfor (i=0; i<length; i++)\n\t{\n\t\tDBG_8192C(\"[MPT], %s, buf[%d]=0x%02x \", __FUNCTION__, i, tmpBuf[i]);\n\t}\n\tDBG_8192C(\"[MPT], pExtC2h->extendId=0x%x\\n\", pExtC2h->extendId);\n\t\n\tswitch(pExtC2h->extendId)\n\t{\n\t\tcase EXT_C2H_WIFI_FW_ACTIVE_RSP:\n\t\t\tDBG_8192C(\"[MPT], EXT_C2H_WIFI_FW_ACTIVE_RSP\\n\");\n#if 0\n\t\t\tDBG_8192C(\"[MPT], pExtC2h->buf hex: \\n\");\n\t\t\tfor (i=0; i<(length-3); i++)\n\t\t\t{\n\t\t\t\tDBG_8192C(\" 0x%x \", pExtC2h->buf[i]);\n\t\t\t}\n#endif\n\t\t\tif ((_FALSE == pMptCtx->bMPh2c_timeout)\n\t\t\t\t&& (_FALSE == pMptCtx->MptH2cRspEvent))\n\t\t\t{\n\t\t\t\tpMptCtx->MptH2cRspEvent = _TRUE;\n\t\t\t\t_rtw_up_sema(&pMptCtx->MPh2c_Sema);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase EXT_C2H_TRIG_BY_BT_FW:\n\t\t\tDBG_8192C(\"[MPT], EXT_C2H_TRIG_BY_BT_FW\\n\");\n\t\t\t_rtw_memcpy(&pMptCtx->c2hBuf[0], tmpBuf, length);\n\t\t\tDBG_8192C(\"[MPT], pExtC2h->statusCode=0x%x\\n\", pExtC2h->statusCode);\n\t\t\tDBG_8192C(\"[MPT], pExtC2h->retLen=0x%x\\n\", pExtC2h->retLen);\n\t\t\tDBG_8192C(\"[MPT], pExtC2h->opCodeVer=0x%x\\n\", pExtC2h->opCodeVer);\n\t\t\tDBG_8192C(\"[MPT], pExtC2h->reqNum=0x%x\\n\", pExtC2h->reqNum);\n\t\t\tfor (i=0; i<(length-3); i++)\n\t\t\t{\n\t\t\t\tDBG_8192C(\"[MPT], pExtC2h->buf[%d]=0x%02x\\n\", i, pExtC2h->buf[i]);\n\t\t\t}\n\n\t\t\tif ((_FALSE == pMptCtx->bMPh2c_timeout)\n\t\t\t\t&& (_TRUE == pMptCtx->MptH2cRspEvent)\n\t\t\t\t&& (_FALSE == pMptCtx->MptBtC2hEvent))\n\t\t\t{\n\t\t\t\tpMptCtx->MptBtC2hEvent = _TRUE;\n\t\t\t\t_rtw_up_sema(&pMptCtx->MPh2c_Sema);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBG_8192C(\"[MPT], EXT_C2H Target not found,pExtC2h->extendId =%d ,pExtC2h->reqNum=%d\\n\",pExtC2h->extendId,pExtC2h->reqNum);\n\t\t\tbreak;\n\t}\n\t\n\n\t\n}\n\n\nu2Byte\nmptbt_BtGetGeneral(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPBT_REQ_CMD \tpBtReq,\n\tIN\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tPMPT_CONTEXT\t\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tPBT_EXT_C2H \t\tpExtC2h=(PBT_EXT_C2H)&pMptCtx->c2hBuf[0];\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode, bdAddr[6]={0};\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tu1Byte\t\t\t\tgetType=0, i;\n\tu2Byte\t\t\t\tgetParaLen=0, validParaLen=0;\n\tu1Byte\t\t\t\tregType=0, reportType=0;\n\tu4Byte\t\t\t\tregAddr=0, regValue=0;\n\tpu4Byte \t\t\tpu4Tmp;\n\tpu2Byte \t\t\tpu2Tmp;\n\tpu1Byte \t\t\tpu1Tmp;\n\n\t//\n\t// check upper layer parameters\n\t//\n\t\n\t// check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\t// check upper layer parameter length\n\tif(pBtReq->paraLength < 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d (should larger than 1)\\n\", pBtReq->paraLength);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\tgetParaLen = pBtReq->paraLength - 1;\n\tgetType = pBtReq->pParamStart[0];\n\t\n\tDBG_8192C(\"[MPT], getType=%d, getParaLen=%d\\n\", getType, getParaLen);\n\n\t// check parameter first\n\tswitch(getType)\n\t{\n\t\tcase BT_GGET_REG:\n\t\t\tDBG_8192C(\"[MPT], [BT_GGET_REG]\\n\");\n\t\t\tvalidParaLen = 5;\n\t\t\tif(getParaLen == validParaLen)\n\t\t\t{\n\t\t\t\tbtOpcode = BT_LO_OP_READ_REG;\n\t\t\t\tregType = pBtReq->pParamStart[1];\n\t\t\t\tpu4Tmp = (pu4Byte)&pBtReq->pParamStart[2];\n\t\t\t\tregAddr = *pu4Tmp;\n\t\t\t\tDBG_8192C(\"[MPT], BT_GGET_REG regType=0x%02x, regAddr=0x%08x!!\\n\",\n\t\t\t\t\tregType, regAddr);\n\t\t\t\tif(regType >= BT_REG_MAX)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( ((BT_REG_RF==regType)&&(regAddr>0x7f)) ||\n\t\t\t\t\t\t((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) ||\n\t\t\t\t\t\t((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) ||\n\t\t\t\t\t\t((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) ||\n\t\t\t\t\t\t((BT_REG_LE==regType)&&(regAddr>0xfff)) )\n\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\tpBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase BT_GGET_STATUS:\n\t\t\tDBG_8192C(\"[MPT], [BT_GGET_STATUS]\\n\");\n\t\t\tvalidParaLen = 0;\n\t\t\tbreak;\n\t\tcase BT_GGET_REPORT:\n\t\t\tDBG_8192C(\"[MPT], [BT_GGET_REPORT]\\n\");\n\t\t\tvalidParaLen = 1;\n\t\t\tif(getParaLen == validParaLen)\n\t\t\t{\n\t\t\t\treportType = pBtReq->pParamStart[1];\n\t\t\t\tDBG_8192C(\"[MPT], BT_GGET_REPORT reportType=0x%x!!\\n\", reportType);\n\t\t\t\tif(reportType >= BT_REPORT_MAX)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t{\n\t\t\t\tDBG_8192C(\"[MPT], Error!! getType=%d, out of range\\n\", getType);\n\t\t\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\treturn paraLen;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\tif(getParaLen != validParaLen)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d for BT_GET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\\n\",\n\t\t\tgetParaLen, getType, validParaLen);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\t\n\t//\n\t// execute lower layer opcodes\n\t//\n\tif(BT_GGET_REG == getType)\n\t{\n\t\t// fill h2c parameters\n\t\t// here we should write reg value first then write the address, adviced by Austin\n\t\tbtOpcode = BT_LO_OP_READ_REG;\n\t\th2cParaBuf[0] = regType;\n\t\th2cParaBuf[1] = pBtReq->pParamStart[2];\n\t\th2cParaBuf[2] = pBtReq->pParamStart[3];\n\t\th2cParaLen = 3;\n\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// construct respond status code and data.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\n\t\tpu2Tmp = (pu2Byte)&pExtC2h->buf[0];\n\t\tregValue = *pu2Tmp;\n\t\tDBG_8192C(\"[MPT], read reg regType=0x%02x, regAddr=0x%08x, regValue=0x%04x\\n\", \n\t\t\tregType, regAddr, regValue);\n\t\t\n\t\tpu4Tmp = (pu4Byte)&pBtRsp->pParamStart[0];\n\t\t*pu4Tmp = regValue;\n\t\tparaLen = 4;\n\t}\n\telse if(BT_GGET_STATUS == getType)\n\t{\n\t\tbtOpcode = BT_LO_OP_GET_BT_STATUS;\n\t\th2cParaLen = 0;\n\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// construct respond status code and data.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\n\t\tpBtRsp->pParamStart[0] = pExtC2h->buf[0];\n\t\tpBtRsp->pParamStart[1] = pExtC2h->buf[1];\n\t\tDBG_8192C(\"[MPT], read bt status, testMode=0x%x, testStatus=0x%x\\n\", \n\t\t\tpBtRsp->pParamStart[0], pBtRsp->pParamStart[1]);\t\t\n\t\tparaLen = 2;\n\t}\n\telse if(BT_GGET_REPORT == getType)\n\t{\n\t\tswitch(reportType)\n\t\t{\n\t\t\tcase BT_REPORT_RX_PACKET_CNT:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], [Rx Packet Counts]\\n\");\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_RX_PKT_CNT_L;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[0] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[1] = pExtC2h->buf[1];\n\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_RX_PKT_CNT_H;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[2] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[3] = pExtC2h->buf[1];\n\t\t\t\t\tparaLen = 4;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BT_REPORT_RX_ERROR_BITS:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], [Rx Error Bits]\\n\");\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_RX_ERROR_BITS_L;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[0] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[1] = pExtC2h->buf[1];\n\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_RX_ERROR_BITS_H;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[2] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[3] = pExtC2h->buf[1];\n\t\t\t\t\tparaLen = 4;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BT_REPORT_RSSI:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], [RSSI]\\n\");\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_RSSI;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[0] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[1] = pExtC2h->buf[1];\n\t\t\t\t\tparaLen = 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BT_REPORT_CFO_HDR_QUALITY:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], [CFO & Header Quality]\\n\");\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_L;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[0] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[1] = pExtC2h->buf[1];\n\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_CFO_HDR_QUALITY_H;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tpBtRsp->pParamStart[2] = pExtC2h->buf[0];\n\t\t\t\t\tpBtRsp->pParamStart[3] = pExtC2h->buf[1];\n\t\t\t\t\tparaLen = 4;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase BT_REPORT_CONNECT_TARGET_BD_ADDR:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], [Connected Target BD ADDR]\\n\");\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_L;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tbdAddr[5] = pExtC2h->buf[0];\n\t\t\t\t\tbdAddr[4] = pExtC2h->buf[1];\n\t\t\t\t\tbdAddr[3] = pExtC2h->buf[2];\n\n\t\t\t\t\tbtOpcode = BT_LO_OP_GET_TARGET_BD_ADDR_H;\n\t\t\t\t\th2cParaLen = 0;\n\t\t\t\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t\t\t\t// construct respond status code and data.\n\t\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t\tbdAddr[2] = pExtC2h->buf[0];\n\t\t\t\t\tbdAddr[1] = pExtC2h->buf[1];\n\t\t\t\t\tbdAddr[0] = pExtC2h->buf[2];\n\t\t\t\t\t\t\n\t\t\t\t\tDBG_8192C(\"[MPT], Connected Target BDAddr:%s\", bdAddr);\n\t\t\t\t\tfor(i=0; i<6; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tpBtRsp->pParamStart[i] = bdAddr[5-i];\n\t\t\t\t\t}\n\t\t\t\t\tparaLen = 6;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\treturn paraLen;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\treturn paraLen;\n}\n\n\n\nu2Byte\nmptbt_BtSetGeneral(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPBT_REQ_CMD \tpBtReq,\n\tIN\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tu1Byte\t\t\t\tsetType=0;\n\tu2Byte\t\t\t\tsetParaLen=0, validParaLen=0;\n\tu1Byte\t\t\t\tregType=0, bdAddr[6]={0}, calVal=0;\n\tu4Byte\t\t\t\tregAddr=0, regValue=0;\n\tpu4Byte \t\t\tpu4Tmp;\n\tpu2Byte \t\t\tpu2Tmp;\n\tpu1Byte \t\t\tpu1Tmp;\n\n\t//\n\t// check upper layer parameters\n\t//\n\t\n\t// check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\t// check upper layer parameter length\n\tif(pBtReq->paraLength < 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d (should larger than 1)\\n\", pBtReq->paraLength);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\tsetParaLen = pBtReq->paraLength - 1;\n\tsetType = pBtReq->pParamStart[0];\n\t\n\tDBG_8192C(\"[MPT], setType=%d, setParaLen=%d\\n\", setType, setParaLen);\n\n\t// check parameter first\n\tswitch(setType)\n\t{\n\t\tcase BT_GSET_REG:\n\t\t\tDBG_8192C (\"[MPT], [BT_GSET_REG]\\n\");\n\t\t\tvalidParaLen = 9;\n\t\t\tif(setParaLen == validParaLen)\n\t\t\t{\n\t\t\t\tbtOpcode = BT_LO_OP_WRITE_REG_VALUE;\n\t\t\t\tregType = pBtReq->pParamStart[1];\n\t\t\t\tpu4Tmp = (pu4Byte)&pBtReq->pParamStart[2];\n\t\t\t\tregAddr = *pu4Tmp;\n\t\t\t\tpu4Tmp = (pu4Byte)&pBtReq->pParamStart[6];\n\t\t\t\tregValue = *pu4Tmp;\n\t\t\t\tDBG_8192C(\"[MPT], BT_GSET_REG regType=0x%x, regAddr=0x%x, regValue=0x%x!!\\n\", \n\t\t\t\t\tregType, regAddr, regValue);\n\t\t\t\tif(regType >= BT_REG_MAX)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( ((BT_REG_RF==regType)&&(regAddr>0x7f)) ||\n\t\t\t\t\t\t((BT_REG_MODEM==regType)&&(regAddr>0x1ff)) ||\n\t\t\t\t\t\t((BT_REG_BLUEWIZE==regType)&&(regAddr>0xfff)) ||\n\t\t\t\t\t\t((BT_REG_VENDOR==regType)&&(regAddr>0xfff)) ||\n\t\t\t\t\t\t((BT_REG_LE==regType)&&(regAddr>0xfff)) )\n\t\t\t\t\t{\t\t\t\t\n\t\t\t\t\t\tpBtRsp->status = (btOpcode<<8)| BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\t\treturn paraLen;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase BT_GSET_RESET:\n\t\t\tDBG_8192C(\"[MPT], [BT_GSET_RESET]\\n\");\n\t\t\tvalidParaLen = 0;\n\t\t\tbreak;\n\t\tcase BT_GSET_TARGET_BD_ADDR:\n\t\t\tDBG_8192C(\"[MPT], [BT_GSET_TARGET_BD_ADDR]\\n\");\n\t\t\tvalidParaLen = 6;\n\t\t\tif(setParaLen == validParaLen)\n\t\t\t{\n\t\t\t\tbtOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H;\n\t\t\t\tif( (pBtReq->pParamStart[1]==0) &&\n\t\t\t\t\t(pBtReq->pParamStart[2]==0) &&\n\t\t\t\t\t(pBtReq->pParamStart[3]==0) &&\n\t\t\t\t\t(pBtReq->pParamStart[4]==0) &&\n\t\t\t\t\t(pBtReq->pParamStart[5]==0) &&\n\t\t\t\t\t(pBtReq->pParamStart[6]==0) )\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], Error!! targetBDAddr=all zero\\n\");\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\tif( (pBtReq->pParamStart[1]==0xff) &&\n\t\t\t\t\t(pBtReq->pParamStart[2]==0xff) &&\n\t\t\t\t\t(pBtReq->pParamStart[3]==0xff) &&\n\t\t\t\t\t(pBtReq->pParamStart[4]==0xff) &&\n\t\t\t\t\t(pBtReq->pParamStart[5]==0xff) &&\n\t\t\t\t\t(pBtReq->pParamStart[6]==0xff) )\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"[MPT], Error!! targetBDAddr=all 0xf\\n\");\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\tbdAddr[0] = pBtReq->pParamStart[6];\n\t\t\t\tbdAddr[1] = pBtReq->pParamStart[5];\n\t\t\t\tbdAddr[2] = pBtReq->pParamStart[4];\n\t\t\t\tbdAddr[3] = pBtReq->pParamStart[3];\n\t\t\t\tbdAddr[4] = pBtReq->pParamStart[2];\n\t\t\t\tbdAddr[5] = pBtReq->pParamStart[1];\n\t\t\t\tDBG_8192C (\"[MPT], target BDAddr:%x,%x,%x,%x,%x,%x\\n\", \n\t\t\t\t\t\t\tbdAddr[0],bdAddr[1],bdAddr[2],bdAddr[3],bdAddr[4],bdAddr[5]);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase BT_GSET_TX_PWR_FINETUNE:\n\t\t\tDBG_8192C(\"[MPT], [BT_GSET_TX_PWR_FINETUNE]\\n\");\n\t\t\tvalidParaLen = 1;\n\t\t\tif(setParaLen == validParaLen)\n\t\t\t{\n\t\t\t\tbtOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION;\n\t\t\t\tcalVal = pBtReq->pParamStart[1];\n\t\t\t\tif( (calVal<1) || (calVal>9) )\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\tDBG_8192C (\"[MPT], calVal=%d\\n\", calVal);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase BT_SET_TRACKING_INTERVAL:\n\t\t\tDBG_871X(\"[MPT], [BT_SET_TRACKING_INTERVAL] setParaLen =%d \\n\",setParaLen);\n\t\t\t\n\t\t\tvalidParaLen = 1;\t\n\t\t\tif(setParaLen == validParaLen)\t\n\t\t\t\tcalVal = pBtReq->pParamStart[1];\n\t\t\tbreak;\n\t\tcase BT_SET_THERMAL_METER:\n\t\t\tDBG_871X(\"[MPT], [BT_SET_THERMAL_METER] setParaLen =%d \\n\",setParaLen);\n\t\t\tvalidParaLen = 1;\t\n\t\t\tif(setParaLen == validParaLen)\t\n\t\t\t\tcalVal = pBtReq->pParamStart[1];\n\t\t\tbreak;\n\t\tcase BT_ENABLE_CFO_TRACKING:\n\t\t\tDBG_871X(\"[MPT], [BT_ENABLE_CFO_TRACKING] setParaLen =%d \\n\",setParaLen);\n\t\t\tvalidParaLen = 1;\t\n\t\t\tif(setParaLen == validParaLen)\t\n\t\t\t\tcalVal = pBtReq->pParamStart[1];\n\t\t\tbreak;\n\t\tcase BT_GSET_UPDATE_BT_PATCH:\n\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t{\n\t\t\t\tDBG_8192C (\"[MPT], Error!! setType=%d, out of range\\n\", setType);\n\t\t\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\treturn paraLen;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\tif(setParaLen != validParaLen)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d for BT_SET_GEN_CMD cmd id=0x%x, paraLen should=0x%x\\n\",\n\t\t\tsetParaLen, setType, validParaLen);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\t\n\t//\n\t// execute lower layer opcodes\n\t//\n\tif(BT_GSET_REG == setType)\n\t{\n\t\t// fill h2c parameters\n\t\t// here we should write reg value first then write the address, adviced by Austin\n\t\tbtOpcode = BT_LO_OP_WRITE_REG_VALUE;\n\t\th2cParaBuf[0] = pBtReq->pParamStart[6];\n\t\th2cParaBuf[1] = pBtReq->pParamStart[7];\n\t\th2cParaBuf[2] = pBtReq->pParamStart[8];\n\t\th2cParaLen = 3;\n\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// construct respond status code and data.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\t\t\n\t\t// write reg address\n\t\tbtOpcode = BT_LO_OP_WRITE_REG_ADDR;\n\t\th2cParaBuf[0] = regType;\n\t\th2cParaBuf[1] = pBtReq->pParamStart[2];\n\t\th2cParaBuf[2] = pBtReq->pParamStart[3];\n\t\th2cParaLen = 3;\n\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// construct respond status code and data.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\t\t\n\t}\n\telse if(BT_GSET_RESET == setType)\n\t{\n\t\tbtOpcode = BT_LO_OP_RESET;\n\t\th2cParaLen = 0;\n\t\t// execute h2c and check respond c2h from bt fw is correct or not\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// construct respond status code and data.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\t}\n\telse if(BT_GSET_TARGET_BD_ADDR == setType)\n\t{\n\t\t// fill h2c parameters\n\t\tbtOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_L;\n\t\th2cParaBuf[0] = pBtReq->pParamStart[1];\n\t\th2cParaBuf[1] = pBtReq->pParamStart[2];\n\t\th2cParaBuf[2] = pBtReq->pParamStart[3];\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\t\t\n\t\t// ckeck bt return status.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\n\t\tbtOpcode = BT_LO_OP_SET_TARGET_BD_ADDR_H;\n\t\th2cParaBuf[0] = pBtReq->pParamStart[4];\n\t\th2cParaBuf[1] = pBtReq->pParamStart[5];\n\t\th2cParaBuf[2] = pBtReq->pParamStart[6];\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\t\t\n\t\t// ckeck bt return status.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\t}\n\telse if(BT_GSET_TX_PWR_FINETUNE == setType)\n\t{\n\t\t// fill h2c parameters\n\t\tbtOpcode = BT_LO_OP_SET_TX_POWER_CALIBRATION;\n\t\th2cParaBuf[0] = calVal;\n\t\th2cParaLen = 1;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\t// ckeck bt return status.\n\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t{\n\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\t}\n\telse if(BT_SET_TRACKING_INTERVAL == setType)\n\t{\n\t\t//\tBT_LO_OP_SET_TRACKING_INTERVAL\t\t\t\t\t\t\t\t= 0x22,\n\t\t//\tBT_LO_OP_SET_THERMAL_METER\t\t\t\t\t\t\t\t\t= 0x23,\n\t\t//\tBT_LO_OP_ENABLE_CFO_TRACKING\t\t\t\t\t\t\t\t\t= 0x24,\n\t\t\t\tbtOpcode = BT_LO_OP_SET_TRACKING_INTERVAL;\n\t\t\t\th2cParaBuf[0] = calVal;\n\t\t\t\th2cParaLen = 1;\n\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\t\t\n\t\t\t\t// ckeck bt return status.\n\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t}\n\telse if(BT_SET_THERMAL_METER == setType)\n\t{\n\t\t\t\tbtOpcode = BT_LO_OP_SET_THERMAL_METER;\n\t\t\t\th2cParaBuf[0] = calVal;\n\t\t\t\th2cParaLen = 1;\n\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\t\t\n\t\t\t\t// ckeck bt return status.\n\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t}\n\telse if(BT_ENABLE_CFO_TRACKING == setType)\n\t{\n\t\t\t\tbtOpcode = BT_LO_OP_ENABLE_CFO_TRACKING;\n\t\t\t\th2cParaBuf[0] = calVal;\n\t\t\t\th2cParaLen = 1;\n\t\t\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\t\t\n\t\t\t\t// ckeck bt return status.\n\t\t\t\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t\t\t\t{\n\t\t\t\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\t\t\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\t\treturn paraLen;\n\t\t}\n\t}\n\t\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\treturn paraLen;\n}\n\n\n\nu2Byte\nmptbt_BtSetTxRxPars(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPBT_REQ_CMD \tpBtReq,\n\tIN\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tPBT_TXRX_PARAMETERS pTxRxPars=(PBT_TXRX_PARAMETERS)&pBtReq->pParamStart[0];\n\tu2Byte\t\t\t\tlenTxRx=sizeof(BT_TXRX_PARAMETERS);\n\tu1Byte\t\t\t\ti;\n\tu1Byte\t\t\t\tbdAddr[6]={0};\n\n\t//\n\t// check upper layer parameters\n\t//\n\t\n\t// 1. check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\t// 2. check upper layer parameter length\n\tif(pBtReq->paraLength == sizeof(BT_TXRX_PARAMETERS))\n\t{\t\n\t\tDBG_8192C (\"[MPT], pTxRxPars->txrxChannel=0x%x \\n\", pTxRxPars->txrxChannel);\n\t\tDBG_8192C (\"[MPT], pTxRxPars->txrxTxPktCnt=0x%8x \\n\", pTxRxPars->txrxTxPktCnt);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxTxPktInterval=0x%x \\n\", pTxRxPars->txrxTxPktInterval);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxPayloadType=0x%x \\n\", pTxRxPars->txrxPayloadType);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxPktType=0x%x \\n\", pTxRxPars->txrxPktType);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxPayloadLen=0x%x \\n\", pTxRxPars->txrxPayloadLen);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxPktHeader=0x%x \\n\", pTxRxPars->txrxPktHeader);\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxWhitenCoeff=0x%x \\n\", pTxRxPars->txrxWhitenCoeff); \t\n\t\tbdAddr[0] = pTxRxPars->txrxBdaddr[5];\n\t\tbdAddr[1] = pTxRxPars->txrxBdaddr[4];\n\t\tbdAddr[2] = pTxRxPars->txrxBdaddr[3];\n\t\tbdAddr[3] = pTxRxPars->txrxBdaddr[2];\n\t\tbdAddr[4] = pTxRxPars->txrxBdaddr[1];\n\t\tbdAddr[5] = pTxRxPars->txrxBdaddr[0];\n\t\tDBG_8192C  (\"[MPT], pTxRxPars->txrxBdaddr: %s\", &bdAddr[0]);\n\t\tDBG_8192C (\"[MPT], pTxRxPars->txrxTxGainIndex=0x%x \\n\", pTxRxPars->txrxTxGainIndex);\n\t}\n\telse\n\t{\n\t\tDBG_8192C  (\"[MPT], Error!! pBtReq->paraLength=%d, correct Len=%d\\n\", pBtReq->paraLength, lenTxRx);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\n\t//\n\t// execute lower layer opcodes\n\t//\n\t\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_PKT_HEADER;\n\tif(pTxRxPars->txrxPktHeader > 0x3ffff)\n\t{\n\t\tDBG_8192C  (\"[MPT], Error!! pTxRxPars->txrxPktHeader=0x%x is out of range, (should be between 0x0~0x3ffff)\\n\", pTxRxPars->txrxPktHeader);\n\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\th2cParaBuf[0] = (u1Byte)(pTxRxPars->txrxPktHeader&0xff);\n\t\th2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff00)>>8);\n\t\th2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPktHeader&0xff0000)>>16);\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C  (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\t\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_PKT_TYPE_LEN;\n\t{\n\t\tu2Byte\tpayloadLenLimit=0;\n\t\tswitch(pTxRxPars->txrxPktType)\n\t\t{\n\t\t\tcase MP_BT_PKT_DH1:\n\t\t\t\tpayloadLenLimit = 27*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_DH3:\n\t\t\t\tpayloadLenLimit = 183*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_DH5:\n\t\t\t\tpayloadLenLimit = 339*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_2DH1:\n\t\t\t\tpayloadLenLimit = 54*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_2DH3:\n\t\t\t\tpayloadLenLimit = 367*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_2DH5:\n\t\t\t\tpayloadLenLimit = 679*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_3DH1:\n\t\t\t\tpayloadLenLimit = 83*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_3DH3:\n\t\t\t\tpayloadLenLimit = 552*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_3DH5:\n\t\t\t\tpayloadLenLimit = 1021*8;\n\t\t\t\tbreak;\n\t\t\tcase MP_BT_PKT_LE:\n\t\t\t\tpayloadLenLimit = 39*8;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C  (\"[MPT], Error!! Unknown pTxRxPars->txrxPktType=0x%x\\n\", pTxRxPars->txrxPktType);\n\t\t\t\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\t\t\treturn paraLen;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(pTxRxPars->txrxPayloadLen > payloadLenLimit)\n\t\t{\n\t\t\tDBG_8192C (\"[MPT], Error!! pTxRxPars->txrxPayloadLen=0x%x, (should smaller than %d)\\n\", \n\t\t\t\tpTxRxPars->txrxPayloadLen, payloadLenLimit);\n\t\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\t\treturn paraLen;\n\t\t}\n\n\t\th2cParaBuf[0] = pTxRxPars->txrxPktType;\n\t\th2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff));\n\t\th2cParaBuf[2] = (u1Byte)((pTxRxPars->txrxPayloadLen&0xff00)>>8);\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_PKT_CNT_L_PL_TYPE;\n\tif(pTxRxPars->txrxPayloadType > MP_BT_PAYLOAD_MAX)\n\t{\n\t\tDBG_8192C  (\"[MPT], Error!! pTxRxPars->txrxPayloadType=0x%x, (should be between 0~4)\\n\", pTxRxPars->txrxPayloadType);\n\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\th2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff));\n\t\th2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff00)>>8);\n\t\th2cParaBuf[2] = pTxRxPars->txrxPayloadType;\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\t\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_PKT_CNT_H_PKT_INTV;\n\tif(pTxRxPars->txrxTxPktInterval > 15)\n\t{\n\tDBG_8192C  (\"[MPT], Error!! pTxRxPars->txrxTxPktInterval=0x%x, (should be between 0~15)\\n\", pTxRxPars->txrxTxPktInterval);\n\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\th2cParaBuf[0] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff0000)>>16);\n\t\th2cParaBuf[1] = (u1Byte)((pTxRxPars->txrxTxPktCnt&0xff000000)>>24);\n\t\th2cParaBuf[2] = pTxRxPars->txrxTxPktInterval;\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\t\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_WHITENCOEFF;\n\t{\n\t\th2cParaBuf[0] = pTxRxPars->txrxWhitenCoeff;\n\t\th2cParaLen = 1;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C  (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_CHNL_TX_GAIN;\n\tif( (pTxRxPars->txrxChannel > 78) ||\n\t\t(pTxRxPars->txrxTxGainIndex > 7) )\n\t{\n\t\tDBG_8192C (\"[MPT], Error!! pTxRxPars->txrxChannel=0x%x, (should be between 0~78)\\n\", pTxRxPars->txrxChannel);\n\t\tDBG_8192C (\"[MPT], Error!! pTxRxPars->txrxTxGainIndex=0x%x, (should be between 0~7)\\n\", pTxRxPars->txrxTxGainIndex);\n\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\th2cParaBuf[0] = pTxRxPars->txrxChannel;\n\t\th2cParaBuf[1] = pTxRxPars->txrxTxGainIndex;\n\t\th2cParaLen = 2;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\t// fill h2c parameters\n\tbtOpcode = BT_LO_OP_SET_BD_ADDR_L;\n\tif( (pTxRxPars->txrxBdaddr[0]==0) &&\n\t\t(pTxRxPars->txrxBdaddr[1]==0) &&\n\t\t(pTxRxPars->txrxBdaddr[2]==0) &&\n\t\t(pTxRxPars->txrxBdaddr[3]==0) &&\n\t\t(pTxRxPars->txrxBdaddr[4]==0) &&\n\t\t(pTxRxPars->txrxBdaddr[5]==0) )\n\t{\n\t\tDBG_8192C (\"[MPT], Error!! pTxRxPars->txrxBdaddr=all zero\\n\");\n\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\tif( (pTxRxPars->txrxBdaddr[0]==0xff) &&\n\t\t(pTxRxPars->txrxBdaddr[1]==0xff) &&\n\t\t(pTxRxPars->txrxBdaddr[2]==0xff) &&\n\t\t(pTxRxPars->txrxBdaddr[3]==0xff) &&\n\t\t(pTxRxPars->txrxBdaddr[4]==0xff) &&\n\t\t(pTxRxPars->txrxBdaddr[5]==0xff) )\n\t{\n\t\tDBG_8192C (\"[MPT], Error!! pTxRxPars->txrxBdaddr=all 0xf\\n\");\n\t\tpBtRsp->status = (btOpcode<<8)|BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\t\n\t{\n\t\th2cParaBuf[0] = pTxRxPars->txrxBdaddr[0];\n\t\th2cParaBuf[1] = pTxRxPars->txrxBdaddr[1];\n\t\th2cParaBuf[2] = pTxRxPars->txrxBdaddr[2];\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\t\n\n\tbtOpcode = BT_LO_OP_SET_BD_ADDR_H;\n\t{\n\t\th2cParaBuf[0] = pTxRxPars->txrxBdaddr[3];\n\t\th2cParaBuf[1] = pTxRxPars->txrxBdaddr[4];\n\t\th2cParaBuf[2] = pTxRxPars->txrxBdaddr[5];\n\t\th2cParaLen = 3;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t// ckeck bt return status.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C  (\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\treturn paraLen;\n}\n\n\n\nu2Byte\nmptbt_BtTestCtrl(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPBT_REQ_CMD \tpBtReq,\n\tIN\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tu1Byte\t\t\t\ttestCtrl=0;\n\n\t//\n\t// check upper layer parameters\n\t//\n\t\n\t// 1. check upper layer opcode version\n\tif(pBtReq->opCodeVer != 1)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! Upper OP code version not match!!!\\n\");\n\t\tpBtRsp->status = BT_STATUS_OPCODE_U_VERSION_MISMATCH;\n\t\treturn paraLen;\n\t}\n\t// 2. check upper layer parameter length\n\tif(1 == pBtReq->paraLength)\n\t{\n\t\ttestCtrl = pBtReq->pParamStart[0];\n\t\tDBG_8192C(\"[MPT], testCtrl=%d \\n\", testCtrl);\n\t}\n\telse\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! wrong parameter length=%d (should be 1)\\n\", pBtReq->paraLength);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_FORMAT_ERROR_U;\n\t\treturn paraLen;\n\t}\n\t\n\t//\n\t// execute lower layer opcodes\n\t//\n\t\n\t// 1. fill h2c parameters\t\n\t// check bt mode\n\tbtOpcode = BT_LO_OP_TEST_CTRL;\n\tif(testCtrl >= MP_BT_TEST_MAX)\n\t{\n\t\tDBG_8192C(\"[MPT], Error!! testCtrl=0x%x, (should be between smaller or equal to 0x%x)\\n\", \n\t\t\ttestCtrl, MP_BT_TEST_MAX-1);\n\t\tpBtRsp->status = BT_STATUS_PARAMETER_OUT_OF_RANGE_U;\n\t\treturn paraLen;\n\t}\n\telse\n\t{\n\t\th2cParaBuf[0] = testCtrl;\n\t\th2cParaLen = 1;\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t}\n\t\n\t// 3. construct respond status code and data.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\treturn paraLen;\n}\n\n\nu2Byte\nmptbt_TestBT(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPBT_REQ_CMD \tpBtReq,\n\tIN\tPBT_RSP_CMD \tpBtRsp\n\t)\n{\n\n\tu1Byte\t\t\t\th2cParaBuf[6] ={0};\n\tu1Byte\t\t\t\th2cParaLen=0;\n\tu2Byte\t\t\t\tparaLen=0;\n\tu1Byte\t\t\t\tretStatus=BT_STATUS_BT_OP_SUCCESS;\n\tu1Byte\t\t\t\tbtOpcode;\n\tu1Byte\t\t\t\tbtOpcodeVer=0;\n\tu1Byte\t\t\t\ttestCtrl=0;\n\n\t// 1. fill h2c parameters\t\n\t\tbtOpcode =  0x11;\n\t\th2cParaBuf[0] = 0x11;\n\t\th2cParaBuf[1] = 0x0;\n\t\th2cParaBuf[2] = 0x0;\n\t\th2cParaBuf[3] = 0x0;\n\t\th2cParaBuf[4] = 0x0;\n\t\th2cParaLen = 1;\n\t//\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, &h2cParaBuf[0], h2cParaLen);\n\t\tretStatus = mptbt_BtFwOpCodeProcess(Adapter, btOpcode, btOpcodeVer, h2cParaBuf, h2cParaLen);\n\t\n\t\n\t// 3. construct respond status code and data.\n\tif(BT_STATUS_BT_OP_SUCCESS != retStatus)\n\t{\n\t\tpBtRsp->status = ((btOpcode<<8)|retStatus);\n\t\tDBG_8192C(\"[MPT], Error!! status code=0x%x \\n\", pBtRsp->status);\n\t\treturn paraLen;\n\t}\n\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\treturn paraLen;\n}\n\nVOID\nmptbt_BtControlProcess(\n\tPADAPTER\tAdapter,\n\tPVOID\t\tpInBuf\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\tPBT_H2C \t\tpH2c=(PBT_H2C)&H2C_Parameter[0];\n\tPMPT_CONTEXT\tpMptCtx=&(Adapter->mppriv.MptCtx);\n\tPBT_REQ_CMD \tpBtReq=(PBT_REQ_CMD)pInBuf;\n\tPBT_RSP_CMD \tpBtRsp;\n\tu1Byte\t\t\ti;\n\n\n\tDBG_8192C(\"[MPT], mptbt_BtControlProcess()=========>\\n\");\n\n\tDBG_8192C(\"[MPT], input opCodeVer=%d\\n\", pBtReq->opCodeVer);\n\tDBG_8192C(\"[MPT], input OpCode=%d\\n\", pBtReq->OpCode);\n\tDBG_8192C(\"[MPT], paraLength=%d \\n\", pBtReq->paraLength);\n\tif(pBtReq->paraLength)\n\t{\n\t\t//DBG_8192C(\"[MPT], parameters(hex):0x%x %d \\n\",&pBtReq->pParamStart[0], pBtReq->paraLength);\n\t}\n\n\t_rtw_memset((void*)pMptCtx->mptOutBuf, 0, 100);\n\tpMptCtx->mptOutLen = 4; //length of (BT_RSP_CMD.status+BT_RSP_CMD.paraLength)\n\n\tpBtRsp = (PBT_RSP_CMD)pMptCtx->mptOutBuf;\n\tpBtRsp->status = BT_STATUS_SUCCESS;\n\tpBtRsp->paraLength = 0x0;\n\n\t// The following we should maintain the User OP codes sent by upper layer\n\tswitch(pBtReq->OpCode)\n\t{\n\t\tcase BT_UP_OP_BT_READY:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_READY]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtReady(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_BT_SET_MODE:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_SET_MODE]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtSetMode(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_BT_SET_TX_RX_PARAMETER:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_SET_TXRX_PARAMETER]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtSetTxRxPars(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_BT_SET_GENERAL:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_SET_GENERAL]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtSetGeneral(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_BT_GET_GENERAL:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_GET_GENERAL]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtGetGeneral(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_BT_TEST_CTRL:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [BT_TEST_CTRL]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_BtTestCtrl(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tcase BT_UP_OP_TEST_BT:\n\t\t\tDBG_8192C(\"[MPT], OPcode : [TEST_BT]\\n\");\n\t\t\tpBtRsp->paraLength = mptbt_TestBT(Adapter, pBtReq, pBtRsp);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_8192C(\"[MPT], Error!! OPcode : UNDEFINED!!!!\\n\");\n\t\t\tpBtRsp->status = BT_STATUS_UNKNOWN_OPCODE_U;\n\t\t\tpBtRsp->paraLength = 0x0;\n\t\t\tbreak;\n\t}\n\n\tpMptCtx->mptOutLen += pBtRsp->paraLength;\n\n\tDBG_8192C(\"[MPT], pMptCtx->mptOutLen=%d, pBtRsp->paraLength=%d\\n\", pMptCtx->mptOutLen, pBtRsp->paraLength);\n\tDBG_8192C(\"[MPT], mptbt_BtControlProcess()<=========\\n\");\n}\n\n#endif\n\n"
  },
  {
    "path": "core/rtw_btcoex.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifdef CONFIG_BT_COEXIST\n\n#include <drv_types.h>\n#include <hal_btcoex.h>\n#include <hal_data.h>\n\n\nvoid rtw_btcoex_Initialize(PADAPTER padapter)\n{\n\thal_btcoex_Initialize(padapter);\n}\n\nvoid rtw_btcoex_PowerOnSetting(PADAPTER padapter)\n{\n\thal_btcoex_PowerOnSetting(padapter);\n}\n\nvoid rtw_btcoex_PreLoadFirmware(PADAPTER padapter)\n{\n\thal_btcoex_PreLoadFirmware(padapter);\n}\n\nvoid rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly)\n{\n\thal_btcoex_InitHwConfig(padapter, bWifiOnly);\n}\n\nvoid rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_IpsNotify(padapter, type);\n}\n\nvoid rtw_btcoex_LpsNotify(PADAPTER padapter, u8 type)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_LpsNotify(padapter, type);\n}\n\nvoid rtw_btcoex_ScanNotify(PADAPTER padapter, u8 type)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tPBT_MGNT\tpBtMgnt=&pcoex_info->BtMgnt;\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ((_FALSE == type) && (padapter->pbuddy_adapter))\n\t{\n\t\tPADAPTER pbuddy = padapter->pbuddy_adapter;\n\t\tif (check_fwstate(&pbuddy->mlmepriv, WIFI_SITE_MONITOR) == _TRUE)\n\t\t\treturn;\n\t}\n#endif\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tif(pBtMgnt->ExtConfig.bEnableWifiScanNotify)\n\t\trtw_btcoex_SendScanNotify(padapter, type);\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\t\n\n\thal_btcoex_ScanNotify(padapter, type);\n}\n\nvoid rtw_btcoex_ConnectNotify(PADAPTER padapter, u8 action)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n#ifdef DBG_CONFIG_ERROR_RESET\n\tif (_TRUE == rtw_hal_sreset_inprogress(padapter))\n\t{\n\t\tDBG_8192C(FUNC_ADPT_FMT \": [BTCoex] under reset, skip notify!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter));\n\t\treturn;\n\t}\n#endif // DBG_CONFIG_ERROR_RESET\n\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ((_FALSE == action) && (padapter->pbuddy_adapter))\n\t{\n\t\tPADAPTER pbuddy = padapter->pbuddy_adapter;\n\t\tif (check_fwstate(&pbuddy->mlmepriv, WIFI_UNDER_LINKING) == _TRUE)\n\t\t\treturn;\n\t}\n#endif\n\n\thal_btcoex_ConnectNotify(padapter, action);\n}\n\nvoid rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n#ifdef DBG_CONFIG_ERROR_RESET\n\tif (_TRUE == rtw_hal_sreset_inprogress(padapter))\n\t{\n\t\tDBG_8192C(FUNC_ADPT_FMT \": [BTCoex] under reset, skip notify!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter));\n\t\treturn;\n\t}\n#endif // DBG_CONFIG_ERROR_RESET\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ((RT_MEDIA_DISCONNECT == mediaStatus) && (padapter->pbuddy_adapter))\n\t{\n\t\tPADAPTER pbuddy = padapter->pbuddy_adapter;\n\t\tif (check_fwstate(&pbuddy->mlmepriv, WIFI_ASOC_STATE) == _TRUE)\n\t\t\treturn;\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\tif ((RT_MEDIA_CONNECT == mediaStatus)\n\t\t&& (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE))\n\t{\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL);\n\t}\n\n\thal_btcoex_MediaStatusNotify(padapter, mediaStatus);\n}\n\nvoid rtw_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_SpecialPacketNotify(padapter, pktType);\n}\n\nvoid rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_IQKNotify(padapter, state);\n}\n\nvoid rtw_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_BtInfoNotify(padapter, length, tmpBuf);\n}\n\nvoid rtw_btcoex_SuspendNotify(PADAPTER padapter, u8 state)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\thal_btcoex_SuspendNotify(padapter, state);\n}\n\nvoid rtw_btcoex_HaltNotify(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n\tif (_FALSE == padapter->bup)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": bup=%d Skip!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), padapter->bup);\n\n\t\treturn;\n\t}\n\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tDBG_871X(FUNC_ADPT_FMT \": bSurpriseRemoved=%s Skip!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\n\t\treturn;\n\t}\n\n\thal_btcoex_HaltNotify(padapter);\n}\n\nvoid rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)\n{\n\thal_btcoex_SwitchBtTRxMask(padapter);\t\n}\n\nvoid rtw_btcoex_Switch(PADAPTER padapter, u8 enable)\n{\n\thal_btcoex_SetBTCoexist(padapter, enable);\n}\n\nu8 rtw_btcoex_IsBtDisabled(PADAPTER padapter)\n{\n\treturn hal_btcoex_IsBtDisabled(padapter);\n}\n\nvoid rtw_btcoex_Handler(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tif (_FALSE == pHalData->EEPROMBluetoothCoexist)\n\t\treturn;\n\n#if defined(CONFIG_CONCURRENT_MODE)\n\tif (padapter->adapter_type != PRIMARY_ADAPTER)\n\t\treturn;\n#endif\n\n\n\n\thal_btcoex_Hanlder(padapter);\n}\n\ns32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter)\n{\n\ts32 coexctrl;\n\n\tcoexctrl = hal_btcoex_IsBTCoexRejectAMPDU(padapter);\n\n\treturn coexctrl;\n}\n\ns32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter)\n{\n\ts32 coexctrl;\n\n\tcoexctrl = hal_btcoex_IsBTCoexCtrlAMPDUSize(padapter);\n\n\treturn coexctrl;\n}\n\nu32 rtw_btcoex_GetAMPDUSize(PADAPTER padapter)\n{\n\tu32 size;\n\n\tsize = hal_btcoex_GetAMPDUSize(padapter);\n\n\treturn size;\n}\n\nvoid rtw_btcoex_SetManualControl(PADAPTER padapter, u8 manual)\n{\n\tif (_TRUE == manual)\n\t{\n\t\thal_btcoex_SetManualControl(padapter, _TRUE);\n\t}\n\telse\n\t{\n\t\thal_btcoex_SetManualControl(padapter, _FALSE);\n\t}\n}\n\nu8 rtw_btcoex_1Ant(PADAPTER padapter)\n{\n\treturn hal_btcoex_1Ant(padapter);\n}\n\nu8 rtw_btcoex_IsBtControlLps(PADAPTER padapter)\n{\n\treturn hal_btcoex_IsBtControlLps(padapter);\n}\n\nu8 rtw_btcoex_IsLpsOn(PADAPTER padapter)\n{\n\treturn hal_btcoex_IsLpsOn(padapter);\n}\n\nu8 rtw_btcoex_RpwmVal(PADAPTER padapter)\n{\n\treturn hal_btcoex_RpwmVal(padapter);\n}\n\nu8 rtw_btcoex_LpsVal(PADAPTER padapter)\n{\n\treturn hal_btcoex_LpsVal(padapter);\n}\n\nvoid rtw_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)\n{\n\thal_btcoex_SetBTCoexist(padapter, bBtExist);\n}\n\nvoid rtw_btcoex_SetChipType(PADAPTER padapter, u8 chipType)\n{\n\thal_btcoex_SetChipType(padapter, chipType);\n}\n\nvoid rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum)\n{\n\thal_btcoex_SetPgAntNum(padapter, antNum);\n}\n\nu8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)\n{\n\treturn hal_btcoex_GetPgAntNum(padapter);\n}\n\nvoid rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)\n{\n\thal_btcoex_SetSingleAntPath(padapter, singleAntPath);\n}\n\nu32 rtw_btcoex_GetRaMask(PADAPTER padapter)\n{\n\treturn hal_btcoex_GetRaMask(padapter);\n}\n\nvoid rtw_btcoex_RecordPwrMode(PADAPTER padapter, u8 *pCmdBuf, u8 cmdLen)\n{\n\thal_btcoex_RecordPwrMode(padapter, pCmdBuf, cmdLen);\n}\n\nvoid rtw_btcoex_DisplayBtCoexInfo(PADAPTER padapter, u8 *pbuf, u32 bufsize)\n{\n\thal_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);\n}\n\nvoid rtw_btcoex_SetDBG(PADAPTER padapter, u32 *pDbgModule)\n{\n\thal_btcoex_SetDBG(padapter, pDbgModule);\n}\n\nu32 rtw_btcoex_GetDBG(PADAPTER padapter, u8 *pStrBuf, u32 bufSize)\n{\n\treturn hal_btcoex_GetDBG(padapter, pStrBuf, bufSize);\n}\n\nu8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER padapter)\n{\n\treturn hal_btcoex_IncreaseScanDeviceNum(padapter);\n}\n\nu8 rtw_btcoex_IsBtLinkExist(PADAPTER padapter)\n{\n\treturn hal_btcoex_IsBtLinkExist(padapter);\n}\n\nvoid rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer)\n{\n\thal_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer);\n}\n\nvoid rtw_btcoex_SetHciVersion(PADAPTER  padapter, u16 hciVersion)\n{\n\thal_btcoex_SetHciVersion(padapter, hciVersion);\n}\n\nvoid rtw_btcoex_StackUpdateProfileInfo(void) \n{\n\thal_btcoex_StackUpdateProfileInfo();\n}\n\nvoid rtw_btcoex_BTOffOnNotify(PADAPTER padapter, u8 bBTON)\n{\n\thal_btcoex_BTOffOnNotify(padapter, bBTON);\n}\n\n// ==================================================\n// Below Functions are called by BT-Coex\n// ==================================================\nvoid rtw_btcoex_rx_ampdu_apply(PADAPTER padapter)\n{\n\trtw_rx_ampdu_apply(padapter);\n}\n\nvoid rtw_btcoex_LPS_Enter(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\tu8 lpsVal;\n\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\tpwrpriv->bpower_saving = _TRUE;\n\tlpsVal = rtw_btcoex_LpsVal(padapter);\n\trtw_set_ps_mode(padapter, PS_MODE_MIN, 0, lpsVal, \"BTCOEX\");\n}\n\nvoid rtw_btcoex_LPS_Leave(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\tif (pwrpriv->pwr_mode != PS_MODE_ACTIVE)\n\t{\n\t\trtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, \"BTCOEX\");\n\t\tLPS_RF_ON_check(padapter, 100);\n\t\tpwrpriv->bpower_saving = _FALSE;\n\t}\n}\n\n\n// ==================================================\n// Below Functions are BT-Coex socket related function\n// ==================================================\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n_adapter *pbtcoexadapter = NULL;\nu8 rtw_btcoex_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm;\n\tu8 *btinfo;\n\tstruct cmd_priv *pcmdpriv = &adapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\tif (pdrvextra_cmd_parm == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tbtinfo = rtw_zmalloc(len);\n\tif (btinfo == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\trtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = len;\n\tpdrvextra_cmd_parm->pbuf = btinfo;\n\n\t_rtw_memcpy(btinfo, buf, len);\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\nexit:\n\treturn res;\n}\n\nu8 rtw_btcoex_send_event_to_BT(_adapter *padapter, u8 status,  u8 event_code, u8 opcode_low, u8 opcode_high,u8 *dbg_msg)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0,tx_event_length = 0;\n\trtw_HCI_event *pEvent;\n\t\n\tpEvent = (rtw_HCI_event*)(&localBuf[0]);\n\n\tpEvent->EventCode = event_code;\n\tpEvent->Data[0] = 0x1;\t//packet #\n\tpEvent->Data[1] = opcode_low;\n\tpEvent->Data[2] = opcode_high;\n\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\tpRetPar = &pEvent->Data[len];\t\t\n\tpRetPar[0] = status;\t\t//status\n\n\tlen++;\n\tpEvent->Length = len;\n\n\t//total tx event length + EventCode length + sizeof(length)\n\ttx_event_length = pEvent->Length + 2;\n#if 0\n\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, dbg_msg);\n#endif\t\t\n\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\t\n\treturn status;\n}\n\n/* \nRef: \nRealtek Wi-Fi Driver\nHost Controller Interface for\nBluetooth 3.0 + HS V1.4 2013/02/07\n\nWindow team code & BT team code\n */\n\n\nu8 rtw_btcoex_parse_BT_info_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\t#define BT_INFO_LENGTH 8\n\t\n\tu8 curPollEnable = pcmd[0];\n\tu8 curPollTime = pcmd[1];\n\tu8 btInfoReason = pcmd[2];\n\tu8 btInfoLen = pcmd[3];\n\tu8 btinfo[BT_INFO_LENGTH];\n\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0,tx_event_length = 0;\n\tRTW_HCI_STATUS status = HCI_STATUS_SUCCESS;\n\trtw_HCI_event *pEvent;\n\n\tDBG_871X(\"%s\\n\",__func__);\n\tDBG_871X(\"current Poll Enable: %d, currrent Poll Time: %d\\n\",curPollEnable,curPollTime);\n\tDBG_871X(\"BT Info reason: %d, BT Info length: %d\\n\",btInfoReason,btInfoLen);\n\t/*DBG_871X(\"%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\\n\"\n\t\t,pcmd[4],pcmd[5],pcmd[6],pcmd[7],pcmd[8],pcmd[9],pcmd[10],pcmd[11]);*/\n\n\t_rtw_memset(btinfo, 0, BT_INFO_LENGTH);\n\t\n#if 1\n\tif(BT_INFO_LENGTH != btInfoLen)\n\t{\n\t\tstatus = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;\n\t\tDBG_871X(\"Error BT Info Length: %d\\n\",btInfoLen);\n\t\t//return _FAIL;\n\t}\n\telse\n#endif\n\t{\n\t\tif(0x1 == btInfoReason || 0x2 == btInfoReason)\n\t\t{\n\t\t\t_rtw_memcpy(btinfo, &pcmd[4], btInfoLen);\n\t\t\tbtinfo[0] = btInfoReason;\n\t\t\trtw_btcoex_btinfo_cmd(padapter,btinfo,btInfoLen);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"Other BT info reason\\n\");\n\t\t}\n\t}\n\n\t//send complete event to BT\n\t{\n\n\t\tpEvent = (rtw_HCI_event*)(&localBuf[0]);\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_INFO_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_INFO_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n#if 0\n\t\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,\"BT_info_event\");\n#endif\t\t\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\t\n\t\treturn status;\n\t\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_BT_patch_ver_info_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tRTW_HCI_STATUS status=HCI_STATUS_SUCCESS;\n\tu16\t\tbtPatchVer=0x0, btHciVer=0x0;\n\t//u16\t\t*pU2tmp;\n\t\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\n\tbtHciVer = pcmd[0] | pcmd[1]<<8;\n\tbtPatchVer = pcmd[2] | pcmd[3]<<8;\n\n\n\tDBG_871X(\"%s, cmd:%02x %02x %02x %02x\\n\",__func__, pcmd[0] ,pcmd[1] ,pcmd[2] ,pcmd[3]);\n\tDBG_871X(\"%s, HCI Ver:%d, Patch Ver:%d\\n\",__func__, btHciVer,btPatchVer);\n\t\n\trtw_btcoex_SetBtPatchVersion(padapter,btHciVer,btPatchVer);\n\n\n\t//send complete event to BT\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_PATCH_VERSION_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n#if 0\n\t\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length,\"BT_patch_event\");\n#endif\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_HCI_Ver_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tRTW_HCI_STATUS status=HCI_STATUS_SUCCESS;\n\tu16 hciver = pcmd[0] | pcmd[1] <<8;\n\t\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\t\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tPBT_MGNT\tpBtMgnt=&pcoex_info->BtMgnt;\n\tpBtMgnt->ExtConfig.HCIExtensionVer = hciver;\n\tDBG_871X(\"%s, HCI Version: %d\\n\",__func__,pBtMgnt->ExtConfig.HCIExtensionVer);\n\tif(pBtMgnt->ExtConfig.HCIExtensionVer  < 4)\n\t{\n\t\tstatus = HCI_STATUS_INVALID_HCI_CMD_PARA_VALUE;\n\t\tDBG_871X(\"%s, Version = %d, HCI Version < 4\\n\",__func__,pBtMgnt->ExtConfig.HCIExtensionVer );\n\t}\n\telse\n\t{\n\t\trtw_btcoex_SetHciVersion(padapter,hciver);\n\t}\n\t//send complete event to BT\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_EXTENSION_VERSION_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n\t\n}\n\nu8 rtw_btcoex_parse_WIFI_scan_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tRTW_HCI_STATUS status=HCI_STATUS_SUCCESS;\n\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\t\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tPBT_MGNT\tpBtMgnt=&pcoex_info->BtMgnt;\n\tpBtMgnt->ExtConfig.bEnableWifiScanNotify= pcmd[0];\n\tDBG_871X(\"%s, bEnableWifiScanNotify: %d\\n\",__func__,pBtMgnt->ExtConfig.bEnableWifiScanNotify);\n\t\n\t//send complete event to BT\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_ENABLE_WIFI_SCAN_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_HCI_link_status_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\tstruct bt_coex_info\t*pcoex_info=&padapter->coex_info;\n\tPBT_MGNT\tpBtMgnt=&pcoex_info->BtMgnt;\n\t//PBT_DBG\t\tpBtDbg=&padapter->MgntInfo.BtInfo.BtDbg;\n\tu8\t\ti, numOfHandle=0, numOfAcl=0;\n\tu16\t\tconHandle;\n\tu8\t\tbtProfile, btCoreSpec, linkRole;\n\tu8\t\t*pTriple;\n\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\t\n\t//pBtDbg->dbgHciInfo.hciCmdCntLinkStatusNotify++;\n\t//RT_DISP_DATA(FIOCTL, IOCTL_BT_HCICMD_EXT, \"LinkStatusNotify, Hex Data :\\n\", \n\t//\t\t&pHciCmd->Data[0], pHciCmd->Length);\n\n\tDBG_871X(\"BTLinkStatusNotify\\n\");\n\n\t// Current only RTL8723 support this command.\n\t//pBtMgnt->bSupportProfile = TRUE;\n\tpBtMgnt->bSupportProfile = _FALSE;\n\n\tpBtMgnt->ExtConfig.NumberOfACL = 0;\n\tpBtMgnt->ExtConfig.NumberOfSCO = 0;\n\t\n\tnumOfHandle = pcmd[0];\n\t//RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, (\"numOfHandle = 0x%x\\n\", numOfHandle));\n\t//RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, (\"HCIExtensionVer = %d\\n\", pBtMgnt->ExtConfig.HCIExtensionVer));\n\tDBG_871X(\"numOfHandle = 0x%x\\n\", numOfHandle);\n\tDBG_871X(\"HCIExtensionVer = %d\\n\", pBtMgnt->ExtConfig.HCIExtensionVer);\n\t\n\tpTriple = &pcmd[1];\n\tfor(i=0; i<numOfHandle; i++)\n\t{\t\n\t\tif(pBtMgnt->ExtConfig.HCIExtensionVer < 1)\n\t\t{\n\t\t\tconHandle = *((u8 *)&pTriple[0]);\n\t\t\tbtProfile = pTriple[2];\n\t\t\tbtCoreSpec = pTriple[3];\n\t\t\tif(BT_PROFILE_SCO == btProfile)\n\t\t\t{\n\t\t\t\tpBtMgnt->ExtConfig.NumberOfSCO++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpBtMgnt->ExtConfig.NumberOfACL++;\t\t\t\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle;\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile;\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec;\n\t\t\t}\n\t\t\t//RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, \n\t\t\t//\t(\"Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\\n\",\n\t\t\t//\t\tconHandle, btProfile, btCoreSpec));\n\t\t\tDBG_871X(\"Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d\\n\", conHandle, btProfile, btCoreSpec);\n\t\t\tpTriple += 4;\n\t\t}\n\t\telse if(pBtMgnt->ExtConfig.HCIExtensionVer >= 1)\n\t\t{\n\t\t\tconHandle = *((pu2Byte)&pTriple[0]);\n\t\t\tbtProfile = pTriple[2];\n\t\t\tbtCoreSpec = pTriple[3];\n\t\t\tlinkRole = pTriple[4];\n\t\t\tif(BT_PROFILE_SCO == btProfile)\n\t\t\t{\n\t\t\t\tpBtMgnt->ExtConfig.NumberOfSCO++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpBtMgnt->ExtConfig.NumberOfACL++;\t\t\t\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].ConnectHandle = conHandle;\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].BTProfile = btProfile;\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].BTCoreSpec = btCoreSpec;\n\t\t\t\tpBtMgnt->ExtConfig.aclLink[i].linkRole = linkRole;\n\t\t\t}\n\t\t\t//RT_DISP(FIOCTL, IOCTL_BT_HCICMD_EXT, \n\t\t\tDBG_871X(\"Connection_Handle=0x%x, BTProfile=%d, BTSpec=%d, LinkRole=%d\\n\",\n\t\t\t\tconHandle, btProfile, btCoreSpec, linkRole);\n\t\t\tpTriple += 5;\n\t\t}\t\n\t}\n\trtw_btcoex_StackUpdateProfileInfo();\n\n\t\t//send complete event to BT\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_LINK_STATUS_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n\t\n\t\n}\n\nu8 rtw_btcoex_parse_HCI_BT_coex_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_COEX_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_COEX_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_HCI_BT_operation_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\tDBG_871X(\"%s, OP code: %d\\n\",__func__,pcmd[0]);\n\n\tswitch(pcmd[0])\n\t{\n\t\tcase HCI_BT_OP_NONE:\n\t\t\tDBG_871X(\"[bt operation] : Operation None!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_INQUIRY_START:\n\t\t\tDBG_871X(\"[bt operation] : Inquiry start!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_INQUIRY_FINISH:\n\t\t\tDBG_871X(\"[bt operation] : Inquiry finished!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_PAGING_START:\n\t\t\tDBG_871X(\"[bt operation] : Paging is started!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_PAGING_SUCCESS:\n\t\t\tDBG_871X(\"[bt operation] : Paging complete successfully!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_PAGING_UNSUCCESS:\n\t\t\tDBG_871X(\"[bt operation] : Paging complete unsuccessfully!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_PAIRING_START:\n\t\t\tDBG_871X(\"[bt operation] : Pairing start!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_PAIRING_FINISH:\n\t\t\tDBG_871X(\"[bt operation] : Pairing finished!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_BT_DEV_ENABLE:\n\t\t\tDBG_871X(\"[bt operation] : BT Device is enabled!!\\n\");\n\t\t\tbreak;\n\t\tcase HCI_BT_OP_BT_DEV_DISABLE:\n\t\t\tDBG_871X(\"[bt operation] : BT Device is disabled!!\\n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"[bt operation] : Unknown, error!!\\n\");\n\t\t\tbreak;\n\t}\n\n\t\t\t//send complete event to BT\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_OPERATION_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_BT_AFH_MAP_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_AFH_MAP_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_BT_register_val_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\t\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_REGISTER_VALUE_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_BT_ABNORMAL_NOTIFY, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\nu8 rtw_btcoex_parse_HCI_query_RF_status_cmd(_adapter *padapter, u8 *pcmd, u16 cmdlen)\n{\n\tu8 localBuf[6] = \"\";\n\tu8 *pRetPar;\n\tu8\tlen=0, tx_event_length =0;\n\trtw_HCI_event *pEvent;\n\tRTW_HCI_STATUS\tstatus=HCI_STATUS_SUCCESS;\n\n\t{\n\t\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\n\t\tpEvent->EventCode = HCI_EVENT_COMMAND_COMPLETE;\n\t\tpEvent->Data[0] = 0x1;\t//packet #\n\t\tpEvent->Data[1] = HCIOPCODELOW(HCI_QUERY_RF_STATUS, OGF_EXTENSION);\n\t\tpEvent->Data[2] = HCIOPCODEHIGHT(HCI_QUERY_RF_STATUS, OGF_EXTENSION);\n\t\tlen = len + 3;\n\n\t\t// Return parameters starts from here\n\t\tpRetPar = &pEvent->Data[len];\t\t\n\t\tpRetPar[0] = status;\t\t//status\n\n\t\tlen++;\n\t\tpEvent->Length = len;\n\n\t\t//total tx event length + EventCode length + sizeof(length)\n\t\ttx_event_length = pEvent->Length + 2;\n\n\t\tstatus = rtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\treturn status;\n\t\t//bthci_IndicateEvent(Adapter, PPacketIrpEvent, len+2);\n\t}\n}\n\n/*****************************************\n* HCI cmd format :\n*| 15 - 0\t\t\t\t\t\t|\t\n*| OPcode (OCF|OGF<<10)\t\t|\n*| 15 - 8\t\t|7 - 0\t\t\t|\n*|Cmd para \t|Cmd para Length\t|\n*|Cmd para......\t\t\t\t|\n******************************************/\n\n//bit 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15\n//\t |\tOCF\t\t\t             |\t   OGF       |\nvoid rtw_btcoex_parse_hci_extend_cmd(_adapter *padapter, u8 *pcmd, u16 len,const u16 hci_OCF)\n{\n\n\tDBG_871X(\"%s: OCF: %x\\n\",__func__,hci_OCF);\n\tswitch(hci_OCF)\n\t{\n\t\tcase HCI_EXTENSION_VERSION_NOTIFY:\n\t\t\tDBG_871X(\"HCI_EXTENSION_VERSION_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_HCI_Ver_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_LINK_STATUS_NOTIFY:\n\t\t\tDBG_871X(\"HCI_LINK_STATUS_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_HCI_link_status_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_OPERATION_NOTIFY:\n\t\t\t// only for 8723a 2ant\n\t\t\tDBG_871X(\"HCI_BT_OPERATION_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_HCI_BT_operation_notify_cmd(padapter,pcmd, len);\n\t\t\t//\n\t\t\tbreak;\n\t\tcase HCI_ENABLE_WIFI_SCAN_NOTIFY:\n\t\t\tDBG_871X(\"HCI_ENABLE_WIFI_SCAN_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_WIFI_scan_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_QUERY_RF_STATUS:\n\t\t\t// only for 8723b 2ant\n\t\t\tDBG_871X(\"HCI_QUERY_RF_STATUS\\n\");\n\t\t\trtw_btcoex_parse_HCI_query_RF_status_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_ABNORMAL_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_ABNORMAL_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_HCI_BT_abnormal_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_INFO_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_INFO_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_BT_info_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_COEX_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_COEX_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_HCI_BT_coex_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_PATCH_VERSION_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_PATCH_VERSION_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_BT_patch_ver_info_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_AFH_MAP_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_AFH_MAP_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_BT_AFH_MAP_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tcase HCI_BT_REGISTER_VALUE_NOTIFY:\n\t\t\tDBG_871X(\"HCI_BT_REGISTER_VALUE_NOTIFY\\n\");\n\t\t\trtw_btcoex_parse_BT_register_val_notify_cmd(padapter,pcmd, len);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"ERROR!!! Unknown OCF: %x\\n\",hci_OCF);\n\t\t\tbreak;\n\t\t\t\n\t}\n}\n\nvoid rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *pcmd, u16 len)\n{\n\tu16 opcode = pcmd[0] | pcmd[1]<<8;\n\tu16 hci_OGF = HCI_OGF(opcode);\n\tu16 hci_OCF = HCI_OCF(opcode);\n\tu8 cmdlen = len -3;\n\tu8 pare_len = pcmd[2];\n\n\tDBG_871X(\"%s\\n\",__func__);\n\tDBG_871X(\"OGF: %x,OCF: %x\\n\",hci_OGF,hci_OCF);\n\tswitch(hci_OGF)\n\t{\n\t\tcase OGF_EXTENSION:\n\t\t\tDBG_871X(\"HCI_EXTENSION_CMD_OGF\\n\");\n\t\t\trtw_btcoex_parse_hci_extend_cmd(padapter, &pcmd[3], cmdlen, hci_OCF);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"Other OGF: %x\\n\",hci_OGF);\n\t\t\tbreak;\n\t}\n}\n\nu16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size)\n{\n\tu8 cmp_msg1[32] = attend_ack;\n\tu8 cmp_msg2[32] = leave_ack;\n\tu8 cmp_msg3[32] = bt_leave;\n\tu8 cmp_msg4[32] = invite_req;\n\tu8 cmp_msg5[32] = attend_req;\n\tu8 cmp_msg6[32] = invite_rsp;\n\tu8 res = OTHER;\n\t\n\tif (_rtw_memcmp(cmp_msg1, msg, msg_size) == _TRUE) {\n\t\t/*DBG_871X(\"%s, msg:%s\\n\",__func__,msg);*/\n\t\tres = RX_ATTEND_ACK;\n\t} else if (_rtw_memcmp(cmp_msg2, msg, msg_size) == _TRUE) {\n\t\t/*DBG_871X(\"%s, msg:%s\\n\",__func__,msg);*/\n\t\tres = RX_LEAVE_ACK;\n\t} else if (_rtw_memcmp(cmp_msg3, msg, msg_size) == _TRUE) {\n\t\t/*DBG_871X(\"%s, msg:%s\\n\",__func__,msg);*/\n\t\tres = RX_BT_LEAVE;\n\t} else if (_rtw_memcmp(cmp_msg4, msg, msg_size) == _TRUE) {\n\t\t/*DBG_871X(\"%s, msg:%s\\n\",__func__,msg);*/\n\t\tres = RX_INVITE_REQ;\n\t} else if (_rtw_memcmp(cmp_msg5, msg, msg_size) == _TRUE) {\n\t\tres = RX_ATTEND_REQ;\n\t} else if (_rtw_memcmp(cmp_msg6, msg, msg_size) == _TRUE) {\n\t\tres = RX_INVITE_RSP;\n\t} else {\n\t\tDBG_871X(\"%s, %s\\n\", __func__, msg);\n\t\tres = OTHER;\n\t}\n\t\n\tDBG_871X(\"%s, res:%d\\n\", __func__, res);\n\t\n\treturn res;\n}\n\nvoid rtw_btcoex_recvmsgbysocket(void *data)\n{\n\tu8 recv_data[255];\n\tu8 tx_msg[255] = leave_ack;\n\tu32 len = 0;\n\tu16 recv_length = 0;\n\tu16 parse_res = 0;\n#if 0\n\tu8 para_len = 0, polling_enable = 0, poling_interval = 0, reason = 0, btinfo_len = 0;\n\tu8 btinfo[BT_INFO_LEN] = {0};\n#endif\n\n\tstruct bt_coex_info *pcoex_info = NULL;\n\tstruct sock *sk = NULL;\n\tstruct sk_buff *skb = NULL;\n\t\n\tDBG_871X(\"%s\\n\",__func__);\n\n\tif (pbtcoexadapter == NULL) {\n\t\tDBG_871X(\"%s: btcoexadapter NULL!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tpcoex_info = &pbtcoexadapter->coex_info;\n\tsk = pcoex_info->sk_store;\n\n\tif (sk == NULL) {\n\t\tDBG_871X(\"%s: critical error when receive socket data!\\n\", __func__);\n\t\treturn;\n\t}\n\t\n\tlen = skb_queue_len(&sk->sk_receive_queue);\n\twhile (len > 0) {\n\t\tskb = skb_dequeue(&sk->sk_receive_queue);\n\n\t\t/*important: cut the udp header from skb->data! header length is 8 byte*/\n\t\trecv_length = skb->len-8;\n\t\t_rtw_memset(recv_data, 0, sizeof(recv_data));\n\t\t_rtw_memcpy(recv_data, skb->data+8, recv_length);\n\t\t\n\t\tparse_res = rtw_btcoex_parse_recv_data(recv_data, recv_length);\n/*\n\t\tif (RX_ATTEND_ACK == parse_res) {\n\t\t\t//attend ack \n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t} else if (RX_ATTEND_REQ == parse_res) {\n\t\t\t//attend req from BT \n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE);\n\t\t} else if (RX_INVITE_REQ == parse_res) {\n\t\t\t//invite req from BT\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE);\n\t\t} else if (RX_INVITE_RSP == parse_res) {\n\t\t\t//invite rsp\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t} else if (RX_LEAVE_ACK == parse_res) {\n\t\t\t//mean BT know wifi  will leave\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tDBG_871X(\"RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\t\t\t\n\t\t} else if (RX_BT_LEAVE == parse_res) {\n\t\t\t//BT leave\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); // no ack\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tDBG_871X(\"RX_BT_LEAVE!sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\t\t\t\n\t\t} else {\n\t\t\t//todo: check if recv data are really hci cmds\n\t\t\tif (_TRUE == pcoex_info->BT_attend)\n\t\t\t\trtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length);\n\t\t}\n*/\n\t\tswitch (parse_res) {\n\t\tcase RX_ATTEND_ACK:\n\t\t\t/* attend ack */\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_ATTEND_ACK!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tcase RX_ATTEND_REQ:\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_BT_ATTEND_REQ!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, attend_ack, sizeof(attend_ack), _FALSE);\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tcase RX_INVITE_REQ:\n\t\t\t/* invite req from BT */\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_INVITE_REQ!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, invite_rsp, sizeof(invite_rsp), _FALSE);\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tcase RX_INVITE_RSP:\n\t\t\t /*invite rsp*/\n\t\t\tpcoex_info->BT_attend = _TRUE;\n\t\t\tDBG_871X(\"RX_INVITE_RSP!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tcase RX_LEAVE_ACK:\n\t\t\t/* mean BT know wifi  will leave */\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tDBG_871X(\"RX_LEAVE_ACK!,sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tcase RX_BT_LEAVE:\n\t\t\t/* BT leave */\n\t\t\trtw_btcoex_sendmsgbysocket(pbtcoexadapter, leave_ack, sizeof(leave_ack), _FALSE); /* no ack */\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tDBG_871X(\"RX_BT_LEAVE!sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\t\n\t\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, pcoex_info->BT_attend);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tif (_TRUE == pcoex_info->BT_attend)\n\t\t\t\trtw_btcoex_parse_hci_cmd(pbtcoexadapter, recv_data, recv_length);\n\t\t\telse\n\t\t\t\tDBG_871X(\"ERROR!! BT is UP\\n\");\n\t\t\tbreak;\n\n\t\t}\n\t\t\n\t\tlen--;\n\t\tkfree_skb(skb);\n\t}\n}\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0))\nvoid rtw_btcoex_recvmsg_init(struct sock *sk_in, s32 bytes)\n#else\nvoid rtw_btcoex_recvmsg_init(struct sock *sk_in)\n#endif\n{\n\tstruct bt_coex_info *pcoex_info = NULL;\n\t\n\tif (pbtcoexadapter == NULL) {\n\t\tDBG_871X(\"%s: btcoexadapter NULL\\n\", __func__);\n\t\treturn;\n\t}\n\tpcoex_info = &pbtcoexadapter->coex_info;\n\tpcoex_info->sk_store = sk_in;\n\tif (pcoex_info->btcoex_wq != NULL)\n\t\tqueue_delayed_work(pcoex_info->btcoex_wq, &pcoex_info->recvmsg_work, 0);\n\telse\n\t\tDBG_871X(\"%s: BTCOEX workqueue NULL\\n\", __func__);\n}\n\nu8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force)\n{\n\tu8 error; \n\tstruct msghdr\tudpmsg; \n\tmm_segment_t\toldfs; \n\tstruct iovec\tiov; \n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\n\tDBG_871X(\"%s: msg:%s, force:%s\\n\", __func__, msg, force == _TRUE?\"TRUE\":\"FALSE\");\n\tif (_FALSE == force) {\n\t\tif (_FALSE == pcoex_info->BT_attend) {\n\t\t\tDBG_871X(\"TX Blocked: WiFi-BT disconnected\\n\");\t\t\t\n\t\t\treturn _FAIL;\n\t\t}\n\t}\n\t\t\n\tiov.iov_base\t = (void *)msg; \n\tiov.iov_len\t = msg_size; \n\tudpmsg.msg_name\t = &pcoex_info->bt_sockaddr; \n\tudpmsg.msg_namelen\t= sizeof(struct sockaddr_in); \n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))\n    /* referece:sock_xmit in kernel code\n\t * WRITE for sock_sendmsg, READ for sock_recvmsg\n\t * third parameter for msg_iovlen\n\t * last parameter for iov_len\n\t */\n\tiov_iter_init(&udpmsg.msg_iter, WRITE, &iov, 1, msg_size);\n#else\n\tudpmsg.msg_iov\t = &iov;\n\tudpmsg.msg_iovlen\t= 1;\n#endif\n\tudpmsg.msg_control\t= NULL; \n\tudpmsg.msg_controllen = 0; \n\tudpmsg.msg_flags\t= MSG_DONTWAIT | MSG_NOSIGNAL; \n\toldfs = get_fs(); \n\tset_fs(KERNEL_DS);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))\n\terror = sock_sendmsg(pcoex_info->udpsock, &udpmsg);\n#else\n\terror = sock_sendmsg(pcoex_info->udpsock, &udpmsg, msg_size);\n#endif\n\tset_fs(oldfs); \n\tif (error < 0) {\n\t\tDBG_871X(\"Error when sendimg msg, error:%d\\n\", error); \n\t\treturn _FAIL;\n\t} else\n\t\treturn _SUCCESS;\n}\n\nu8 rtw_btcoex_create_kernel_socket(_adapter *padapter)\n{\n\ts8 kernel_socket_err; \n\tu8 tx_msg[255] = attend_req;\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\ts32 sock_reuse = 1;\n\tu8 status = _FAIL;\n\t\n\tDBG_871X(\"%s CONNECT_PORT %d\\n\", __func__, CONNECT_PORT);\n\n\tif (NULL == pcoex_info) {\n\t\tDBG_871X(\"coex_info: NULL\\n\"); \n\t\tstatus =  _FAIL;\n\t}\n\t\n\tkernel_socket_err = sock_create(PF_INET, SOCK_DGRAM, 0, &pcoex_info->udpsock); \n    \n\tif (kernel_socket_err < 0) { \n\t\tDBG_871X(\"Error during creation of socket error:%d\\n\", kernel_socket_err); \n\t\tstatus = _FAIL;\t\n\t} else {\n\t\t_rtw_memset(&(pcoex_info->wifi_sockaddr), 0, sizeof(pcoex_info->wifi_sockaddr)); \n\t\tpcoex_info->wifi_sockaddr.sin_family = AF_INET; \n\t\tpcoex_info->wifi_sockaddr.sin_port = htons(CONNECT_PORT); \n\t\tpcoex_info->wifi_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\n\n\t\t_rtw_memset(&(pcoex_info->bt_sockaddr), 0, sizeof(pcoex_info->bt_sockaddr)); \n\t\tpcoex_info->bt_sockaddr.sin_family = AF_INET; \n\t\tpcoex_info->bt_sockaddr.sin_port = htons(CONNECT_PORT_BT); \n\t\tpcoex_info->bt_sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\n\n\t\tpcoex_info->sk_store = NULL;\n\t\tkernel_socket_err = pcoex_info->udpsock->ops->bind(pcoex_info->udpsock, (struct sockaddr *)&pcoex_info->wifi_sockaddr, \n\t\t\tsizeof(pcoex_info->wifi_sockaddr)); \n\t\tif (kernel_socket_err == 0) {\t\n\t\t\tDBG_871X(\"binding socket success\\n\"); \n\t\t\tpcoex_info->udpsock->sk->sk_data_ready = rtw_btcoex_recvmsg_init;\n\t\t\tpcoex_info->sock_open |=  KERNEL_SOCKET_OK;\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tDBG_871X(\"WIFI sending attend_req\\n\"); \n\t\t\trtw_btcoex_sendmsgbysocket(padapter, attend_req, sizeof(attend_req), _TRUE);\n\t\t\tstatus = _SUCCESS;\n\t\t} else { \n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\tsock_release(pcoex_info->udpsock); /* bind fail release socket */\n\t\t\tDBG_871X(\"Error binding socket: %d\\n\", kernel_socket_err); \n\t\t\tstatus = _FAIL;\n\t\t} \n\t\t\t\n\t}\n\n\treturn status;\n}\n\nvoid rtw_btcoex_close_kernel_socket(_adapter *padapter)\n{\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tif (pcoex_info->sock_open & KERNEL_SOCKET_OK) {\n\t\tDBG_871X(\"release kernel socket\\n\");\n\t\tsock_release(pcoex_info->udpsock);\n\t\tpcoex_info->sock_open &= ~(KERNEL_SOCKET_OK);\t\n\t\tif (_TRUE == pcoex_info->BT_attend)\n\t\t\tpcoex_info->BT_attend = _FALSE;\n\t\t\n\t\tDBG_871X(\"sock_open:%d, BT_attend:%d\\n\", pcoex_info->sock_open, pcoex_info->BT_attend);\n\t}\n}\n\nvoid rtw_btcoex_init_socket(_adapter *padapter)\n{\n\t\t\n\tu8 is_invite = _FALSE;\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tDBG_871X(\"%s\\n\", __func__);\n\tif (_FALSE == pcoex_info->is_exist) {\n\t\t_rtw_memset(pcoex_info,0,sizeof(struct bt_coex_info));\n\t\tpcoex_info->btcoex_wq = create_workqueue(\"BTCOEX\");\n\t\tINIT_DELAYED_WORK(&pcoex_info->recvmsg_work,\n\t\t\t  (void *)rtw_btcoex_recvmsgbysocket);\n\t\tpbtcoexadapter = padapter;\n\t\t/* We expect BT is off if BT don't send ack to wifi */\n\t\tDBG_871X(\"We expect BT is off if BT send ack to wifi\\n\");\n\t\trtw_btcoex_BTOffOnNotify(pbtcoexadapter, _FALSE);\n\t\tif (rtw_btcoex_create_kernel_socket(padapter) == _SUCCESS) {\n\t\t\tpcoex_info->is_exist = _TRUE;\n\t\t} else {\n\t\t\tpcoex_info->is_exist = _FALSE;\n\t\t\tpbtcoexadapter = NULL;\n\t\t}\n\t\t\n\t\tDBG_871X(\"%s: pbtcoexadapter:%p, coex_info->is_exist: %s\\n\"\n\t\t\t, __func__, pbtcoexadapter, pcoex_info->is_exist == _TRUE?\"TRUE\":\"FALSE\");\n\t}\n}\n\nvoid rtw_btcoex_close_socket(_adapter *padapter)\n{\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\n\tDBG_871X(\"%s--coex_info->is_exist: %s, pcoex_info->BT_attend:%s\\n\"\n\t\t, __func__, pcoex_info->is_exist == _TRUE?\"TRUE\":\"FALSE\", pcoex_info->BT_attend == _TRUE?\"TRUE\":\"FALSE\");\n\t\n\tif (_TRUE == pcoex_info->is_exist) {\n\t\tif (_TRUE == pcoex_info->BT_attend) {\n\t\t\t/*inform BT wifi leave*/\n\t\t\trtw_btcoex_sendmsgbysocket(padapter, wifi_leave, sizeof(wifi_leave), _FALSE);\n\t\t\tmsleep(50);\n\t\t}\n\t\trtw_btcoex_close_kernel_socket(padapter);\n\t\tpbtcoexadapter = NULL;\n\t\tpcoex_info->is_exist = _FALSE;\n\t}\n\tif (pcoex_info->btcoex_wq != NULL) {\n\t\tflush_workqueue(pcoex_info->btcoex_wq);\n\t\tdestroy_workqueue(pcoex_info->btcoex_wq);\n\t}\n}\n\nvoid rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name)\n{\n\tu8 \ti = 0;\n\tDBG_871X(\"======> Msg name: %s\\n\", msg_name);\n\tfor(i=0;i<len;i++)\n\t{\n\t\tprintk(\"%02x \", tx_msg[i]);\n\t}\n\tprintk(\"\\n\");\n\tDBG_871X(\"Msg name: %s <======\\n\", msg_name);\n}\n\n/* Porting from Windows team */\nvoid rtw_btcoex_SendEventExtBtCoexControl(PADAPTER padapter, u8 bNeedDbgRsp, u8 dataLen, void *pData)\n{\n\tu8\t\t\tlen=0, tx_event_length = 0;\n\tu8 \t\t\tlocalBuf[32] = \"\";\n\tu8\t\t\t*pRetPar;\n\tu8\t\t\topCode=0;\n\tu8\t\t\t*pInBuf=(pu1Byte)pData;\n\tu8\t\t\t*pOpCodeContent;\n\trtw_HCI_event *pEvent;\n\n\topCode = pInBuf[0];\t\n\n\tDBG_871X(\"%s, OPCode:%02x\\n\",__func__,opCode);\n\n\tpEvent = (rtw_HCI_event*)(&localBuf[0]);\n\n\t//len += bthci_ExtensionEventHeaderRtk(&localBuf[0], \n\t//\tHCI_EVENT_EXT_BT_COEX_CONTROL);\n\tpEvent->EventCode = HCI_EVENT_EXTENSION_RTK;\n\tpEvent->Data[0] = HCI_EVENT_EXT_BT_COEX_CONTROL;\t//extension event code\n\tlen ++;\n\t\n\t// Return parameters starts from here\n\tpRetPar = &pEvent->Data[len];\n\t_rtw_memcpy(&pRetPar[0], pData, dataLen);\n\n\tlen += dataLen;\n\n\tpEvent->Length = len;\n\n\t//total tx event length + EventCode length + sizeof(length)\n\ttx_event_length = pEvent->Length + 2;\n#if 0\n\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, \"BT COEX CONTROL\", _FALSE);\n#endif\n\trtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\n}\n\n/* Porting from Windows team */\nvoid rtw_btcoex_SendEventExtBtInfoControl(PADAPTER padapter, u8 dataLen, void *pData)\n{\n\trtw_HCI_event *pEvent;\n\tu8\t\t\t*pRetPar;\n\tu8\t\t\tlen=0, tx_event_length = 0;\n\tu8 \t\t\tlocalBuf[32] = \"\";\n\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tPBT_MGNT\t\tpBtMgnt = &pcoex_info->BtMgnt;\n\t\n\tDBG_871X(\"%s\\n\",__func__);\n\tif(pBtMgnt->ExtConfig.HCIExtensionVer < 4) //not support\n\t{\n\t\tDBG_871X(\"ERROR: HCIExtensionVer = %d, HCIExtensionVer<4 !!!!\\n\",pBtMgnt->ExtConfig.HCIExtensionVer);\n\t\treturn;\n\t}\n\n\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n\t//len += bthci_ExtensionEventHeaderRtk(&localBuf[0], \n\t//\t\tHCI_EVENT_EXT_BT_INFO_CONTROL);\n\tpEvent->EventCode = HCI_EVENT_EXTENSION_RTK;\n\tpEvent->Data[0] = HCI_EVENT_EXT_BT_INFO_CONTROL;\t\t//extension event code\n\tlen ++;\n\n\t// Return parameters starts from here\n\tpRetPar = &pEvent->Data[len];\n\t_rtw_memcpy(&pRetPar[0], pData, dataLen);\n\n\tlen += dataLen;\n\n\tpEvent->Length = len;\n\n\t//total tx event length + EventCode length + sizeof(length)\n\ttx_event_length = pEvent->Length + 2;\n#if 0\n\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, \"BT INFO CONTROL\");\n#endif\n\trtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n\t\n}\n\nvoid rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType)\n{\n\tu8\tlen=0, tx_event_length=0;\n\tu8 \tlocalBuf[7] = \"\";\n\tu8\t*pRetPar;\n\tu8\t*pu1Temp;\n\trtw_HCI_event *pEvent;\n\tstruct bt_coex_info *pcoex_info = &padapter->coex_info;\n\tPBT_MGNT\t\tpBtMgnt = &pcoex_info->BtMgnt;\n\n//\tif(!pBtMgnt->BtOperationOn)\n//\t\treturn;\n\t\t\n\tpEvent = (rtw_HCI_event *)(&localBuf[0]);\n\n//\tlen += bthci_ExtensionEventHeaderRtk(&localBuf[0], \n//\t\t\tHCI_EVENT_EXT_WIFI_SCAN_NOTIFY);\n\n\tpEvent->EventCode = HCI_EVENT_EXTENSION_RTK;\n\tpEvent->Data[0] = HCI_EVENT_EXT_WIFI_SCAN_NOTIFY;\t\t//extension event code\n\tlen ++;\n\n\t// Return parameters starts from here\n\t//pRetPar = &PPacketIrpEvent->Data[len];\n\t//pu1Temp = (u8 *)&pRetPar[0];\n\t//*pu1Temp = scanType;\n\tpEvent->Data[len] = scanType;\n\tlen += 1;\n\n\tpEvent->Length = len;\n\n\t//total tx event length + EventCode length + sizeof(length)\n\ttx_event_length = pEvent->Length + 2;\n#if 0\n\trtw_btcoex_dump_tx_msg((u8 *)pEvent, tx_event_length, \"WIFI SCAN OPERATION\");\n#endif\t\n\trtw_btcoex_sendmsgbysocket(padapter, (u8 *)pEvent, tx_event_length, _FALSE);\n}\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n#endif // CONFIG_BT_COEXIST\n\n"
  },
  {
    "path": "core/rtw_cmd.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_CMD_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n/*\nCaller and the rtw_cmd_thread can protect cmd_q by spin_lock.\nNo irqsave is necessary.\n*/\n\nsint\t_rtw_init_cmd_priv (struct\tcmd_priv *pcmdpriv)\n{\n\tsint res=_SUCCESS;\n\t\n_func_enter_;\t\n\n\t_rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0);\n\t//_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0);\n\t_rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0);\n\t\n\t\n\t_rtw_init_queue(&(pcmdpriv->cmd_queue));\n\t\n\t//allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf\n\t\n\tpcmdpriv->cmd_seq = 1;\n\t\n\tpcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ);\n\t\n\tif (pcmdpriv->cmd_allocated_buf == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf  +  CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1));\n\t\t\n\tpcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4);\n\t\n\tif (pcmdpriv->rsp_allocated_buf == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf  +  4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3);\n\n\tpcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0;\n\n\t_rtw_mutex_init(&pcmdpriv->sctx_mutex);\nexit:\n\t\n_func_exit_;\t  \n\n\treturn res;\n\t\n}\t\n\n#ifdef CONFIG_C2H_WK\nstatic void c2h_wk_callback(_workitem *work);\n#endif\nsint _rtw_init_evt_priv(struct evt_priv *pevtpriv)\n{\n\tsint res=_SUCCESS;\n\n_func_enter_;\t\n\n#ifdef CONFIG_H2CLBK\n\t_rtw_init_sema(&(pevtpriv->lbkevt_done), 0);\n\tpevtpriv->lbkevt_limit = 0;\n\tpevtpriv->lbkevt_num = 0;\n\tpevtpriv->cmdevt_parm = NULL;\t\t\n#endif\t\t\n\t\n\t//allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf\n\tATOMIC_SET(&pevtpriv->event_seq, 0);\n\tpevtpriv->evt_done_cnt = 0;\n\n#ifdef CONFIG_EVENT_THREAD_MODE\n\n\t_rtw_init_sema(&(pevtpriv->evt_notify), 0);\n\t_rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0);\n\n\tpevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4);\t\n\tif (pevtpriv->evt_allocated_buf == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t\t}\n\tpevtpriv->evt_buf = pevtpriv->evt_allocated_buf  +  4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3);\n\t\n\t\t\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tpevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4); \n\t\n\tif (pevtpriv->allocated_c2h_mem == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem +  4\\\n\t- ( (u32)(pevtpriv->allocated_c2h_mem) & 3);\n#ifdef PLATFORM_OS_XP\n\tpevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL);\n\t\n\tif(pevtpriv->pc2h_mdl == NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tMmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl);\n#endif\n#endif //end of CONFIG_SDIO_HCI\n\n\t_rtw_init_queue(&(pevtpriv->evt_queue));\n\nexit:\t\n\n#endif //end of CONFIG_EVENT_THREAD_MODE\n\n#ifdef CONFIG_C2H_WK\n\t_init_workitem(&pevtpriv->c2h_wk, c2h_wk_callback, NULL);\n\tpevtpriv->c2h_wk_alive = _FALSE;\n\tpevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN+1);\n#endif\n\n_func_exit_;\t\t \n\n\treturn res;\n}\n\nvoid _rtw_free_evt_priv (struct\tevt_priv *pevtpriv)\n{\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"+_rtw_free_evt_priv \\n\"));\n\n#ifdef CONFIG_EVENT_THREAD_MODE\n\t_rtw_free_sema(&(pevtpriv->evt_notify));\n\t_rtw_free_sema(&(pevtpriv->terminate_evtthread_sema));\n\n\n\tif (pevtpriv->evt_allocated_buf)\n\t\trtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4);\n#endif\n\n#ifdef CONFIG_C2H_WK\n\t_cancel_workitem_sync(&pevtpriv->c2h_wk);\n\twhile(pevtpriv->c2h_wk_alive)\n\t\trtw_msleep_os(10);\n\n\twhile (!rtw_cbuf_empty(pevtpriv->c2h_queue)) {\n\t\tvoid *c2h;\n\t\tif ((c2h = rtw_cbuf_pop(pevtpriv->c2h_queue)) != NULL\n\t\t\t&& c2h != (void *)pevtpriv) {\n\t\t\trtw_mfree(c2h, 16);\n\t\t}\n\t}\n\trtw_cbuf_free(pevtpriv->c2h_queue);\n#endif\n\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"-_rtw_free_evt_priv \\n\"));\n\n_func_exit_;\t  \t\n\n}\n\nvoid _rtw_free_cmd_priv (struct\tcmd_priv *pcmdpriv)\n{\n_func_enter_;\n\n\tif(pcmdpriv){\n\t\t_rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock));\n\t\t_rtw_free_sema(&(pcmdpriv->cmd_queue_sema));\n\t\t//_rtw_free_sema(&(pcmdpriv->cmd_done_sema));\n\t\t_rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema));\n\n\t\tif (pcmdpriv->cmd_allocated_buf)\n\t\t\trtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ);\n\t\t\n\t\tif (pcmdpriv->rsp_allocated_buf)\n\t\t\trtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4);\n\n\t\t_rtw_mutex_free(&pcmdpriv->sctx_mutex);\n\t}\n_func_exit_;\t\t\n}\n\n/*\nCalling Context:\n\nrtw_enqueue_cmd can only be called between kernel thread, \nsince only spin_lock is used.\n\nISR/Call-Back functions can't call this sub-function.\n\n*/\n#ifdef DBG_CMD_QUEUE\nextern u8 dump_cmd_id;\n#endif\n\nsint\t_rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj)\n{\n\t_irqL irqL;\n\n_func_enter_;\n\n\tif (obj == NULL)\n\t\tgoto exit;\n\n\tif(obj->cmdsz > MAX_CMDSZ ){\n\t\tDBG_871X(\"%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d) \\n\",__FUNCTION__, obj->cmdsz,MAX_CMDSZ);\n\t\tgoto exit;\n\t}\n\t//_enter_critical_bh(&queue->lock, &irqL);\n\t_enter_critical(&queue->lock, &irqL);\t\n\n\trtw_list_insert_tail(&obj->list, &queue->queue);\n\n\t#ifdef DBG_CMD_QUEUE\n\tif(dump_cmd_id){\n\t\tprintk(\"%s===> cmdcode:0x%02x\\n\",__FUNCTION__,obj->cmdcode);\n\t\tif(obj->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){\n\t\t\tif(obj->parmbuf){\n\t\t\t\tstruct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)(obj->parmbuf);\n\t\t\t\tprintk(\"pc2h_evt_hdr->ID:0x%02x(%d)\\n\",pc2h_evt_hdr->ID,pc2h_evt_hdr->ID);\n\t\t\t}\n\t\t}\n\t\tif(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){\n\t\t\tif(obj->parmbuf){\n\t\t\t\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf);\n\t\t\t\tprintk(\"pdrvextra_cmd_parm->ec_id:0x%02x\\n\",pdrvextra_cmd_parm->ec_id);\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\tif (queue->queue.prev->next != &queue->queue)\n\t{\n\t\tDBG_871X(\"[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\\n\", __LINE__,\n            &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next);\n\t\t\n\t\tDBG_871X(\"==========%s============\\n\",__FUNCTION__);\n\t\tDBG_871X(\"head:%p,obj_addr:%p\\n\",&queue->queue,obj);\n\t\tDBG_871X(\"padapter: %p\\n\",obj->padapter);\n\t\tDBG_871X(\"cmdcode: 0x%02x\\n\",obj->cmdcode);\n\t\tDBG_871X(\"res: %d\\n\",obj->res);\n\t\tDBG_871X(\"parmbuf: %p\\n\",obj->parmbuf);\n\t\tDBG_871X(\"cmdsz: %d\\n\",obj->cmdsz);\n\t\tDBG_871X(\"rsp: %p\\n\",obj->rsp);\n\t\tDBG_871X(\"rspsz: %d\\n\",obj->rspsz);\n\t\tDBG_871X(\"sctx: %p\\n\",obj->sctx);\n\t\tDBG_871X(\"list->next: %p\\n\",obj->list.next);\n\t\tDBG_871X(\"list->prev: %p\\n\",obj->list.prev);\n\t}\n\t#endif //DBG_CMD_QUEUE\n\t\n\t//_exit_critical_bh(&queue->lock, &irqL);\t\n\t_exit_critical(&queue->lock, &irqL);\n\nexit:\t\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\nstruct\tcmd_obj\t*_rtw_dequeue_cmd(_queue *queue)\n{\n\t_irqL irqL;\n\tstruct cmd_obj *obj;\n\n_func_enter_;\n\n\t//_enter_critical_bh(&(queue->lock), &irqL);\n\t_enter_critical(&queue->lock, &irqL);\n\t\n\t#ifdef DBG_CMD_QUEUE\n\tif (queue->queue.prev->next != &queue->queue)\n\t{\n   \t\t DBG_871X(\"[%d] head %p, tail %p, tail->prev->next %p[tail], tail->next %p[head]\\n\", __LINE__,\n            &queue->queue, queue->queue.prev, queue->queue.prev->prev->next, queue->queue.prev->next);\n\t}\n\t#endif //DBG_CMD_QUEUE\n\n\n\tif (rtw_is_list_empty(&(queue->queue))){\n\t\tobj = NULL;\n\t}\n\telse\n\t{\n\t\tobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list);\n\n\t\t#ifdef DBG_CMD_QUEUE\n\t\tif (queue->queue.prev->next != &queue->queue){\n\t\t\t\tDBG_871X(\"==========%s============\\n\",__FUNCTION__);\n                          DBG_871X(\"head:%p,obj_addr:%p\\n\",&queue->queue,obj);\n\t\t\t\tDBG_871X(\"padapter: %p\\n\",obj->padapter);\n\t\t\t\tDBG_871X(\"cmdcode: 0x%02x\\n\",obj->cmdcode);\n\t\t\t\tDBG_871X(\"res: %d\\n\",obj->res);\n\t\t\t\tDBG_871X(\"parmbuf: %p\\n\",obj->parmbuf);\n\t\t\t\tDBG_871X(\"cmdsz: %d\\n\",obj->cmdsz);\n\t\t\t\tDBG_871X(\"rsp: %p\\n\",obj->rsp);\n\t\t\t\tDBG_871X(\"rspsz: %d\\n\",obj->rspsz);\n\t\t\t\tDBG_871X(\"sctx: %p\\n\",obj->sctx);                        \t\n\t\t\t\tDBG_871X(\"list->next: %p\\n\",obj->list.next);\n\t\t\t\tDBG_871X(\"list->prev: %p\\n\",obj->list.prev);\n\t\t}\n\t\t\n\t\tif(dump_cmd_id){\n\t\t\tDBG_871X(\"%s===> cmdcode:0x%02x\\n\",__FUNCTION__,obj->cmdcode);\n\t\t \tif(obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)){\n\t\t\t\tif(obj->parmbuf){\n                                struct drvextra_cmd_parm *pdrvextra_cmd_parm =(struct drvextra_cmd_parm*)(obj->parmbuf);\n                                printk(\"pdrvextra_cmd_parm->ec_id:0x%02x\\n\",pdrvextra_cmd_parm->ec_id);\n                        }\n                \t}\n\n\t\t}\t\n\t\t#endif //DBG_CMD_QUEUE\n\t\t\n\t\trtw_list_delete(&obj->list);\n\t}\n\n\t//_exit_critical_bh(&(queue->lock), &irqL);\n\t_exit_critical(&queue->lock, &irqL);\n\n_func_exit_;\t\n\n\treturn obj;\n}\n\nu32\trtw_init_cmd_priv(struct cmd_priv *pcmdpriv)\n{\n\tu32\tres;\n_func_enter_;\t\n\tres = _rtw_init_cmd_priv (pcmdpriv);\n_func_exit_;\t\n\treturn res;\t\n}\n\nu32\trtw_init_evt_priv (struct\tevt_priv *pevtpriv)\n{\n\tint\tres;\n_func_enter_;\t\t\n\tres = _rtw_init_evt_priv(pevtpriv);\n_func_exit_;\t\t\n\treturn res;\n}\n\nvoid rtw_free_evt_priv (struct\tevt_priv *pevtpriv)\n{\n_func_enter_;\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"rtw_free_evt_priv\\n\"));\n\t_rtw_free_evt_priv(pevtpriv);\n_func_exit_;\t\t\n}\t\n\nvoid rtw_free_cmd_priv (struct\tcmd_priv *pcmdpriv)\n{\n_func_enter_;\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"rtw_free_cmd_priv\\n\"));\n\t_rtw_free_cmd_priv(pcmdpriv);\n_func_exit_;\t\n}\t\n\nint rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj);\nint rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)\n{\n\tu8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE\n\t\n\t#ifdef SUPPORT_HW_RFOFF_DETECTED\n\t//To decide allow or not\n\tif( (adapter_to_pwrctl(pcmdpriv->padapter)->bHWPwrPindetect)\n\t\t&&(!pcmdpriv->padapter->registrypriv.usbss_enable)\n\t)\t\t\n\t{\n\t\tif(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) ) \n\t\t{\n\t\t\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; \n\t\t\tif(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID)\n\t\t\t{\t\n\t\t\t\t//DBG_871X(\"==>enqueue POWER_SAVING_CTRL_WK_CID\\n\");\n\t\t\t\tbAllow = _TRUE; \n\t\t\t}\n\t\t}\n\t}\n\t#endif\n\n#ifndef CONFIG_C2H_PACKET_EN\n\t/* C2H should be always allowed */\n\tif(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {\n\t\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf;\n\t\tif(pdrvextra_cmd_parm->ec_id == C2H_WK_CID) {\n\t\t\tbAllow = _TRUE;\n\t\t}\n\t}\n#endif\n\n\tif(cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan))\n\t\tbAllow = _TRUE;\n\n\tif ((!rtw_is_hw_init_completed(pcmdpriv->padapter) && (bAllow == _FALSE))\n\t\t|| ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE\t//com_thread not running\n\t) {\n\t\t/*DBG_871X(\"%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\\n\", caller_func, __FUNCTION__,\n\t\t\tcmd_obj->cmdcode,\n\t\t\trtw_get_hw_init_completed(cmd_obj->padapter),\n\t\t\tpcmdpriv->cmdthd_running\n\t\t);*/\n\n\t\treturn _FAIL;\n\t}\t\n\treturn _SUCCESS;\n}\n\n\n\nu32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)\n{\n\tint res = _FAIL;\n\tPADAPTER padapter = pcmdpriv->padapter;\n\t\n_func_enter_;\t\n\t\n\tif (cmd_obj == NULL) {\n\t\tgoto exit;\n\t}\n\n\tcmd_obj->padapter = padapter;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t//change pcmdpriv to primary's pcmdpriv\n\tif (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)\n\t\tpcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);\n#endif\t\n\n\tif( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) {\n\t\trtw_free_cmd_obj(cmd_obj);\n\t\tgoto exit;\n\t}\n\n\tres = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj);\n\n\tif(res == _SUCCESS)\n\t\t_rtw_up_sema(&pcmdpriv->cmd_queue_sema);\n\t\nexit:\t\n\t\n_func_exit_;\n\n\treturn res;\n}\n\nstruct\tcmd_obj\t*rtw_dequeue_cmd(struct cmd_priv *pcmdpriv)\n{\n\tstruct cmd_obj *cmd_obj;\n\t\n_func_enter_;\t\t\n\n\tcmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue);\n\t\t\n_func_exit_;\t\t\t\n\treturn cmd_obj;\n}\n\nvoid rtw_cmd_clr_isr(struct\tcmd_priv *pcmdpriv)\n{\n_func_enter_;\n\tpcmdpriv->cmd_done_cnt++;\n\t//_rtw_up_sema(&(pcmdpriv->cmd_done_sema));\n_func_exit_;\t\t\n}\n\nvoid rtw_free_cmd_obj(struct cmd_obj *pcmd)\n{\n\tstruct drvextra_cmd_parm *extra_parm = NULL;\n_func_enter_;\n\n\tif (pcmd->parmbuf != NULL) {\n\t\t/* free parmbuf in cmd_obj */\n\t\trtw_mfree((unsigned char *)pcmd->parmbuf, pcmd->cmdsz);\n\t}\n\tif(pcmd->rsp!=NULL)\n\t{\n\t\tif(pcmd->rspsz!= 0)\n\t\t{\n\t\t\t//free rsp in cmd_obj\n\t\t\trtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz);\n\t\t}\t\n\t}\t\n\n\t//free cmd_obj\n\trtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj));\n\t\n_func_exit_;\t\t\n}\n\n\nvoid rtw_stop_cmd_thread(_adapter *adapter)\n{\n\tif(adapter->cmdThread &&\n\t\tATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&\n\t\tadapter->cmdpriv.stop_req == 0)\n\t{\n\t\tadapter->cmdpriv.stop_req = 1;\n\t\t_rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);\n\t\t_rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema);\n\t}\n}\n\nthread_return rtw_cmd_thread(thread_context context)\n{\n\tu8 ret;\n\tstruct cmd_obj *pcmd;\n\tu8 *pcmdbuf, *prspbuf;\n\tu32 cmd_start_time;\n\tu32 cmd_process_time;\n\tu8 (*cmd_hdl)(_adapter *padapter, u8* pbuf);\n\tvoid (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd);\n\tPADAPTER padapter = (PADAPTER)context;\n\tstruct cmd_priv *pcmdpriv = &(padapter->cmdpriv);\n\tstruct drvextra_cmd_parm *extra_parm = NULL;\n\t_irqL irqL;\n_func_enter_;\n\n\tthread_enter(\"RTW_CMD_THREAD\");\n\n\tpcmdbuf = pcmdpriv->cmd_buf;\n\tprspbuf = pcmdpriv->rsp_buf;\n\n\tpcmdpriv->stop_req = 0;\n\tATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE);\n\t_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);\n\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"start r871x rtw_cmd_thread !!!!\\n\"));\n\n\twhile(1)\n\t{\n\t\tif (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tbreak;\n\t\t}\n\n\t\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\\n\",\n\t\t\t\t__func__\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t\t\t, __LINE__);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pcmdpriv->stop_req) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" stop_req:%u, break\\n\", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req);\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\t_enter_critical(&pcmdpriv->cmd_queue.lock, &irqL);\n\t\tif(rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue)))\n\t\t{\n\t\t\t//DBG_871X(\"%s: cmd queue is empty!\\n\", __func__);\n\t\t\t_exit_critical(&pcmdpriv->cmd_queue.lock, &irqL);\n\t\t\tcontinue;\n\t\t}\n\t\t_exit_critical(&pcmdpriv->cmd_queue.lock, &irqL);\n\n#ifdef CONFIG_LPS_LCLK\n\t\tif (rtw_register_cmd_alive(padapter) != _SUCCESS)\n\t\t{\n\t\t\tRT_TRACE(_module_hal_xmit_c_, _drv_notice_,\n\t\t\t\t\t (\"%s: wait to leave LPS_LCLK\\n\", __FUNCTION__));\n\t\t\tcontinue;\n\t\t}\n#endif\n\n_next:\n\t\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: DriverStopped(%s) SurpriseRemoved(%s) break at line %d\\n\",\n\t\t\t\t__func__\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t\t\t, __LINE__);\n\t\t\tbreak;\n\t\t}\n\n\t\tif(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) {\n#ifdef CONFIG_LPS_LCLK\n\t\t\trtw_unregister_cmd_alive(padapter);\n#endif\n\t\t\tcontinue;\n\t\t}\n\n\t\tcmd_start_time = rtw_get_current_time();\n\n\t\tif( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) )\n\t\t{\n\t\t\tpcmd->res = H2C_DROPPED;\n\t\t\tif (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {\n\t\t\t\textra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf;\n\t\t\t\tif (extra_parm && extra_parm->pbuf && extra_parm->size > 0)\n\t\t\t\t\trtw_mfree(extra_parm->pbuf, extra_parm->size);\n\t\t\t}\n\t\t\tgoto post_process;\n\t\t}\n\n\t\tpcmdpriv->cmd_issued_cnt++;\n\n\t\tif(pcmd->cmdsz > MAX_CMDSZ ){\n\t\t\tDBG_871X(\"%s cmdsz:%d > MAX_CMDSZ:%d\\n\",__FUNCTION__,pcmd->cmdsz,MAX_CMDSZ);\n\t\t}\n\n\t\t_rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);\n\n\t\tif(pcmd->cmdcode < (sizeof(wlancmds) /sizeof(struct cmd_hdl)))\n\t\t{\n\t\t\tcmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns;\n\n\t\t\tif (cmd_hdl)\n\t\t\t{\n\t\t\t\tret = cmd_hdl(pcmd->padapter, pcmdbuf);\n\t\t\t\tpcmd->res = ret;\n\t\t\t}\n\n\t\t\tpcmdpriv->cmd_seq++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpcmd->res = H2C_PARAMETERS_ERROR;\n\t\t}\n\n\t\tcmd_hdl = NULL;\n\npost_process:\n\n\t\t_enter_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);\n\t\tif (pcmd->sctx) {\n\t\t\tif (0)\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" pcmd->sctx\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(pcmd->padapter));\n\t\t\tif (pcmd->res == H2C_SUCCESS)\n\t\t\t\trtw_sctx_done(&pcmd->sctx);\n\t\t\telse\n\t\t\t\trtw_sctx_done_err(&pcmd->sctx, RTW_SCTX_DONE_CMD_ERROR);\n\t\t}\n\t\t_exit_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);\n\n\n\t\tif((cmd_process_time = rtw_get_passing_time_ms(cmd_start_time)) > 1000)\n\t\t{\n\t\t\tif (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {\n\t\t\t\tstruct drvextra_cmd_parm *drvextra_parm = (struct drvextra_cmd_parm *)pcmdbuf;\n\t\t\t\tDBG_871X(ADPT_FMT\" cmd=%d,%d,%d process_time=%d > 1 sec\\n\",\n\t\t\t\t\tADPT_ARG(pcmd->padapter), pcmd->cmdcode, drvextra_parm->ec_id, drvextra_parm->type, cmd_process_time);\n\t\t\t\t//rtw_warn_on(1);\n\t\t\t} else if(pcmd->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){\n\t\t\t\tstruct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)pcmdbuf;\n\t\t\t\tDBG_871X(ADPT_FMT\" cmd=%d,%d, process_time=%d > 1 sec\\n\",\n\t\t\t\t\tADPT_ARG(pcmd->padapter), pcmd->cmdcode, pc2h_evt_hdr->ID, cmd_process_time);\n\t\t\t\t//rtw_warn_on(1);\n\t\t\t} else {\n\t\t\t\tDBG_871X(ADPT_FMT\" cmd=%d, process_time=%d > 1 sec\\n\",\n\t\t\t\t\tADPT_ARG(pcmd->padapter), pcmd->cmdcode, cmd_process_time);\n\t\t\t\t//rtw_warn_on(1);\n\t\t\t}\n\t\t}\n\n\t\t//call callback function for post-processed\n\t\tif(pcmd->cmdcode < (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback)))\n\t\t{\n\t\t\tpcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback;\n\t\t\tif(pcmd_callback == NULL)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\\n\", pcmd_callback, pcmd->cmdcode));\n\t\t\t\trtw_free_cmd_obj(pcmd);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL)\n\t\t\t\tpcmd_callback(pcmd->padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"%s: cmdcode=0x%x callback not defined!\\n\", __FUNCTION__, pcmd->cmdcode));\n\t\t\trtw_free_cmd_obj(pcmd);\n\t\t}\n\n\t\tflush_signals_thread();\n\n\t\tgoto _next;\n\n\t}\n\n\t/* to avoid enqueue cmd after free all cmd_obj  */\n\tATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE);\n\n\t// free all cmd_obj resources\n\tdo{\n\t\tpcmd = rtw_dequeue_cmd(pcmdpriv);\n\t\tif(pcmd==NULL){\n#ifdef CONFIG_LPS_LCLK\n\t\t\trtw_unregister_cmd_alive(padapter);\n#endif\n\t\t\tbreak;\n\t\t}\n\t\t//DBG_871X(\"%s: leaving... drop cmdcode:%u size:%d\\n\", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz);\n\n\t\tif (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {\n\t\t\textra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf;\n\t\t\tif(extra_parm->pbuf && extra_parm->size > 0) {\n\t\t\t\trtw_mfree(extra_parm->pbuf, extra_parm->size);\n\t\t\t}\n\t\t}\n\n\t\trtw_free_cmd_obj(pcmd);\t\n\t}while(1);\n\n\t_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);\n\n_func_exit_;\n\n\tthread_exit();\n\n}\n\n\n#ifdef CONFIG_EVENT_THREAD_MODE\nu32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj)\n{\n\t_irqL irqL;\n\tint\tres;\n\t_queue *queue = &pevtpriv->evt_queue;\n\t\n_func_enter_;\t\n\n\tres = _SUCCESS; \t\t\n\n\tif (obj == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\t\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\trtw_list_insert_tail(&obj->list, &queue->queue);\n\t\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n\t//rtw_evt_notify_isr(pevtpriv);\n\nexit:\n\t\n_func_exit_;\t\t\n\n\treturn res;\t\n}\n\nstruct evt_obj *rtw_dequeue_evt(_queue *queue)\n{\n\t_irqL irqL;\n\tstruct\tevt_obj\t*pevtobj;\n\t\n_func_enter_;\t\t\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\tif (rtw_is_list_empty(&(queue->queue)))\n\t\tpevtobj = NULL;\n\telse\n\t{\n\t\tpevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list);\n\t\trtw_list_delete(&pevtobj->list);\n\t}\n\n\t_exit_critical_bh(&queue->lock, &irqL);\n\t\n_func_exit_;\t\t\t\n\n\treturn pevtobj;\t\n}\n\nvoid rtw_free_evt_obj(struct evt_obj *pevtobj)\n{\n_func_enter_;\n\n\tif(pevtobj->parmbuf)\n\t\trtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz);\n\t\n\trtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj));\n\t\n_func_exit_;\t\t\n}\n\nvoid rtw_evt_notify_isr(struct evt_priv *pevtpriv)\n{\n_func_enter_;\n\tpevtpriv->evt_done_cnt++;\n\t_rtw_up_sema(&(pevtpriv->evt_notify));\n_func_exit_;\t\n}\n#endif\n\n\n/*\nu8 rtw_setstandby_cmd(unsigned char  *adapter) \n*/\nu8 rtw_setstandby_cmd(_adapter *padapter, uint action)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct usb_suspend_parm*\tpsetusbsuspend;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\n\tu8 ret = _SUCCESS;\n\t\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpsetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm)); \n\tif (psetusbsuspend == NULL) {\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpsetusbsuspend->action = action;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend));\n\n\tret = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\t\nexit:\t\n\t\n_func_exit_;\t\t\n\n\treturn ret;\n}\n\n/*\nrtw_sitesurvey_cmd(~)\n\t### NOTE:#### (!!!!)\n\tMUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock\n*/\nu8 rtw_sitesurvey_cmd(_adapter  *padapter, NDIS_802_11_SSID *ssid, int ssid_num,\n\tstruct rtw_ieee80211_channel *ch, int ch_num)\n{\n\tu8 res = _FAIL;\n\tstruct cmd_obj\t\t*ph2c;\n\tstruct sitesurvey_parm\t*psurveyPara;\n\tstruct cmd_priv \t*pcmdpriv = &padapter->cmdpriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n_func_enter_;\n\n#ifdef CONFIG_LPS\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){\n\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1);\n\t}\n#endif\n\n#ifdef CONFIG_P2P_PS\n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\tp2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1);\n\t}\n#endif //CONFIG_P2P_PS\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL)\n\t\treturn _FAIL;\n\n\tpsurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm)); \n\tif (psurveyPara == NULL) {\n\t\trtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj));\n\t\treturn _FAIL;\n\t}\n\n\trtw_free_network_queue(padapter, _FALSE);\n\n\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, (\"%s: flush network queue\\n\", __FUNCTION__));\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey));\n\n\t/* psurveyPara->bsslimit = 48; */\n\tpsurveyPara->scan_mode = pmlmepriv->scan_mode;\n\n\t/* prepare ssid list */\n\tif (ssid) {\n\t\tint i;\n\t\tfor (i=0; i<ssid_num && i< RTW_SSID_SCAN_AMOUNT; i++) {\n\t\t\tif (ssid[i].SsidLength) {\n\t\t\t\t_rtw_memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(NDIS_802_11_SSID));\n\t\t\t\tpsurveyPara->ssid_num++;\n\t\t\t\tif (0)\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ssid:(%s, %d)\\n\", FUNC_ADPT_ARG(padapter),\n\t\t\t\t\t\tpsurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* prepare channel list */\n\tif (ch) {\n\t\tint i;\n\t\tfor (i=0; i<ch_num && i< RTW_CHANNEL_SCAN_AMOUNT; i++) {\n\t\t\tif (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) {\n\t\t\t\t_rtw_memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel));\n\t\t\t\tpsurveyPara->ch_num++;\n\t\t\t\tif (0)\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch:%u\\n\", FUNC_ADPT_ARG(padapter),\n\t\t\t\t\t\tpsurveyPara->ch[i].hw_value);\n\t\t\t}\n\t\t}\n\t}\n\n\tset_fwstate(pmlmepriv, _FW_UNDER_SURVEY);\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\n\tif(res == _SUCCESS) {\n\n\t\tpmlmepriv->scan_start_time = rtw_get_current_time();\n\n#ifdef CONFIG_SCAN_BACKOP\n\t\tif((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)\n\t\t{\n\t\t\tif(IsSupported5G(padapter->registrypriv.wireless_mode) \n\t\t\t\t&& IsSupported24G(padapter->registrypriv.wireless_mode)) //dual band\n\t\t\t\tmlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_DUAL_BAND);\n\t\t\telse //single band\n\t\t\t\tmlme_set_scan_to_timer(pmlmepriv, CONC_SCANNING_TIMEOUT_SINGLE_BAND);\n\t\t}\t\t\n\t\telse\n#endif /* CONFIG_SCAN_BACKOP */\n\t\t\tmlme_set_scan_to_timer(pmlmepriv, SCANNING_TIMEOUT);\n\n\t\trtw_led_control(padapter, LED_CTL_SITE_SURVEY);\n\t} else {\n\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);\n\t}\n\n_func_exit_;\t\t\n\n\treturn res;\n}\n\nu8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct setdatarate_parm*\tpbsetdataratepara;\n\tstruct cmd_priv*\t\tpcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm)); \n\tif (pbsetdataratepara == NULL) {\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate));\n#ifdef MP_FIRMWARE_OFFLOAD\n\tpbsetdataratepara->curr_rateidx = *(u32*)rateset;\n//\t_rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32));\n#else\n\tpbsetdataratepara->mac_id = 5;\n\t_rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates);\n#endif\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\nu8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct setbasicrate_parm*\tpssetbasicratepara;\n\tstruct cmd_priv*\t\tpcmdpriv=&padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n_func_enter_;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tpssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm)); \n\n\tif (pssetbasicratepara == NULL) {\n\t\trtw_mfree((u8*) ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_);\n\n\t_rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates);\t   \n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\t\n\n_func_exit_;\t\t\n\n\treturn res;\n}\n\n\n/*\nunsigned char rtw_setphy_cmd(unsigned char  *adapter) \n\n1.  be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program\n2.  for AdHoc/Ap mode or mp mode?\n\n*/\nu8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct setphy_parm*\t\tpsetphypara;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n//\tstruct mlme_priv\t\t\t*pmlmepriv = &padapter->mlmepriv;\n//\tstruct registry_priv*\t\tpregistry_priv = &padapter->registrypriv;\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t\t}\n\tpsetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm)); \n\n\tif(psetphypara==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_);\n\n\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"CH=%d, modem=%d\", ch, modem));\n\n\tpsetphypara->modem = modem;\n\tpsetphypara->rfchannel = ch;\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\t\n_func_exit_;\t\t\n\treturn res;\n}\n\nu8 rtw_getmacreg_cmd(_adapter *padapter, u8 len, u32 addr)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct readMAC_parm *preadmacparm;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n_func_enter_;\n\tph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\tpreadmacparm = (struct readMAC_parm *)rtw_zmalloc(sizeof(struct readMAC_parm));\n\n\tif (preadmacparm == NULL) {\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, preadmacparm, GEN_CMD_CODE(_GetMACReg));\n\n\tpreadmacparm->len = len;\n\tpreadmacparm->addr = addr;\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\nexit:\n_func_exit_;\n\treturn res;\n}\n\nvoid rtw_usb_catc_trigger_cmd(_adapter *padapter, const char *caller)\n{\n\tDBG_871X(\"%s caller:%s\\n\", __func__, caller);\n\trtw_getmacreg_cmd(padapter, 1, 0x1c4);\n}\n\nu8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val)\n{\t\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct writeBB_parm*\t\tpwritebbparm;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\t\n\tu8\tres=_SUCCESS;\n_func_enter_;\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t\t}\n\tpwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm)); \n\n\tif(pwritebbparm==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg));\t\n\n\tpwritebbparm->offset = offset;\n\tpwritebbparm->value = val;\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\t\n_func_exit_;\t\n\treturn res;\n}\n\nu8 rtw_getbbreg_cmd(_adapter  *padapter, u8 offset, u8 *pval)\n{\t\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct readBB_parm*\t\tprdbbparm;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n\t\n_func_enter_;\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t\t}\n\tprdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm)); \n\n\tif(prdbbparm ==NULL){\n\t\trtw_mfree((unsigned char *) ph2c, sizeof(struct\tcmd_obj));\n\t\treturn _FAIL;\n\t}\n\n\t_rtw_init_listhead(&ph2c->list);\n\tph2c->cmdcode =GEN_CMD_CODE(_GetBBReg);\n\tph2c->parmbuf = (unsigned char *)prdbbparm;\n\tph2c->cmdsz =  sizeof(struct readBB_parm);\n\tph2c->rsp = pval;\n\tph2c->rspsz = sizeof(struct readBB_rsp);\n\t\n\tprdbbparm ->offset = offset;\n\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\n_func_exit_;\t\n\treturn res;\n}\n\nu8 rtw_setrfreg_cmd(_adapter  *padapter, u8 offset, u32 val)\n{\t\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct writeRF_parm*\t\tpwriterfparm;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\t\n\tu8\tres=_SUCCESS;\n_func_enter_;\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\t\n\t\tgoto exit;\n\t}\n\tpwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm)); \n\n\tif(pwriterfparm==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg));\t\n\n\tpwriterfparm->offset = offset;\n\tpwriterfparm->value = val;\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\n_func_exit_;\t\n\treturn res;\n}\n\nu8 rtw_getrfreg_cmd(_adapter  *padapter, u8 offset, u8 *pval)\n{\t\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct readRF_parm*\t\tprdrfparm;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\t\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tprdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm)); \n\tif(prdrfparm ==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_init_listhead(&ph2c->list);\n\tph2c->cmdcode =GEN_CMD_CODE(_GetRFReg);\n\tph2c->parmbuf = (unsigned char *)prdrfparm;\n\tph2c->cmdsz =  sizeof(struct readRF_parm);\n\tph2c->rsp = pval;\n\tph2c->rspsz = sizeof(struct readRF_rsp);\n\t\n\tprdrfparm ->offset = offset;\n\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nvoid rtw_getbbrfreg_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{       \n _func_enter_;  \n\t\t\n\t//rtw_free_cmd_obj(pcmd);\n\trtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);\n\trtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));\n\t\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\tpadapter->mppriv.workparam.bcompleted= _TRUE;\n#endif\t\n_func_exit_;\t\t\n}\n\nvoid rtw_readtssi_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{\n _func_enter_;  \n\n\trtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);\n\trtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));\n\t\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\tpadapter->mppriv.workparam.bcompleted= _TRUE;\n#endif\n\n_func_exit_;\n}\n\nstatic u8 rtw_createbss_cmd(_adapter  *adapter, int flags, bool adhoc\n\t, s16 req_ch, u8 req_bw, u8 req_offset)\n{\n\tstruct cmd_obj *cmdobj;\n\tstruct createbss_parm *parm;\n\tstruct cmd_priv *pcmdpriv = &adapter->cmdpriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct submit_ctx sctx;\n\tu8 res = _SUCCESS;\n\n\t/* prepare cmd parameter */\n\tparm = (struct createbss_parm *)rtw_zmalloc(sizeof(*parm));\n\tif (parm == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (adhoc) {\n\t\t/* for now, adhoc doesn't support ch,bw,offset request */\n\t\tparm->adhoc = 1;\n\t} else {\n\t\tparm->adhoc = 0;\n\t\tparm->req_ch = req_ch;\n\t\tparm->req_bw = req_bw;\n\t\tparm->req_offset = req_offset;\n\t}\n\n\tif (flags & RTW_CMDF_DIRECTLY) {\n\t\t/* no need to enqueue, do the cmd hdl directly and free cmd parameter */\n\t\tif (H2C_SUCCESS != createbss_hdl(adapter, (u8 *)parm))\n\t\t\tres = _FAIL;\n\t\trtw_mfree((u8 *)parm, sizeof(*parm));\n\t} else {\n\t\t/* need enqueue, prepare cmd_obj and enqueue */\n\t\tcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));\n\t\tif (cmdobj == NULL) {\n\t\t\tres = _FAIL;\n\t\t\trtw_mfree((u8 *)parm, sizeof(*parm));\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(cmdobj, parm, GEN_CMD_CODE(_CreateBss));\n\n\t\tif (flags & RTW_CMDF_WAIT_ACK) {\n\t\t\tcmdobj->sctx = &sctx;\n\t\t\trtw_sctx_init(&sctx, 2000);\n\t\t}\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, cmdobj);\n\n\t\tif (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {\n\t\t\trtw_sctx_wait(&sctx, __func__);\n\t\t\t_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);\n\t\t\tif (sctx.status == RTW_SCTX_SUBMITTED)\n\t\t\t\tcmdobj->sctx = NULL;\n\t\t\t_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);\n\t\t}\n\t}\n\nexit:\n\treturn res;\n}\n\ninline u8 rtw_create_ibss_cmd(_adapter *adapter, int flags)\n{\n\treturn rtw_createbss_cmd(adapter, flags\n\t\t, 1\n\t\t, -1, 0, 0 /* for now, adhoc doesn't support ch,bw,offset request */\n\t);\n}\n\ninline u8 rtw_startbss_cmd(_adapter *adapter, int flags)\n{\n\treturn rtw_createbss_cmd(adapter, flags\n\t\t, 0\n\t\t, -1, 0, 0 /* doesn't request ch, bw, offset */\n\t);\n}\n\ninline u8 rtw_change_bss_chbw_cmd(_adapter *adapter, int flags, u8 req_ch, u8 req_bw, u8 req_offset)\n{\n\treturn rtw_createbss_cmd(adapter, flags\n\t\t, 0\n\t\t, req_ch, req_bw, req_offset\n\t);\n}\n\nu8 rtw_joinbss_cmd(_adapter  *padapter, struct wlan_network* pnetwork)\n{\n\tu8\t*auth, res = _SUCCESS;\n\tuint\tt_len = 0;\n\tWLAN_BSSID_EX\t\t*psecnetwork;\n\tstruct cmd_obj\t\t*pcmd;\n\tstruct cmd_priv\t\t*pcmdpriv=&padapter->cmdpriv;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct qos_priv\t\t*pqospriv= &pmlmepriv->qospriv;\n\tstruct security_priv\t*psecuritypriv=&padapter->securitypriv;\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n#ifdef CONFIG_80211N_HT\n\tstruct ht_priv\t\t\t*phtpriv = &pmlmepriv->htpriv;\n#endif //CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n#endif //CONFIG_80211AC_VHT\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu32 tmp_len;\n\tu8 *ptmp=NULL;\n_func_enter_;\n\n\trtw_led_control(padapter, LED_CTL_START_TO_LINK);\n\n\tif (pmlmepriv->assoc_ssid.SsidLength == 0){\n\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, (\"+Join cmd: Any SSid\\n\"));\n\t} else {\n\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, (\"+Join cmd: SSid=[%s]\\n\", pmlmepriv->assoc_ssid.Ssid));\n\t}\n\n\tpcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(pcmd==NULL){\n\t\tres=_FAIL;\n\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, (\"rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\\n\"));\n\t\tgoto exit;\n\t}\n\t/* // for IEs is pointer \n\tt_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + \n\t\t\tsizeof (NDIS_802_11_SSID) + sizeof (ULONG) + \n\t\t\tsizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + \n\t\t\tsizeof (NDIS_802_11_CONFIGURATION) +\t\n\t\t\tsizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) +   \n\t\t\tsizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ;\n\t*/\n\t//for IEs is fix buf size\n\tt_len = sizeof(WLAN_BSSID_EX);\n\n\n\t//for hidden ap to set fw_state here\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE)\n\t{\n\t\tswitch(ndis_network_mode)\n\t\t{\n\t\t\tcase Ndis802_11IBSS:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t\tbreak;\n\n\t\t\tcase Ndis802_11Infrastructure:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_STATION_STATE);\n\t\t\t\tbreak;\n\n\t\t\tcase Ndis802_11APMode:\n\t\t\tcase Ndis802_11AutoUnknown:\n\t\t\tcase Ndis802_11InfrastructureMax:\n\t\t\tcase Ndis802_11Monitor:\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\tpmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength);\n\n\t/* \n\t\tModified by Arvin 2015/05/13\n\t\tSolution for allocating a new WLAN_BSSID_EX to avoid race condition issue between disconnect and joinbss \n\t*/\n\tpsecnetwork = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));\n\tif(psecnetwork==NULL)\n\t{\n\t\tif(pcmd !=NULL)\n\t\t\trtw_mfree((unsigned char *)pcmd, sizeof(struct\tcmd_obj));\n\t\t\n\t\tres=_FAIL;\n\t\t\n\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, (\"rtw_joinbss_cmd :psecnetwork==NULL!!!\\n\"));\n\t\t\n\t\tgoto exit;\n\t}\n\n\t_rtw_memset(psecnetwork, 0, t_len);\n\n\t_rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network));\n\t\n\tauth=&psecuritypriv->authenticator_ie[0];\n\tpsecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength;\n\n\tif((psecnetwork->IELength-12) < (256-1)) {\n\t\t_rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12);\n\t} else {\n\t\t_rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1));\n\t}\n\t  \n\tpsecnetwork->IELength = 0;\n\t// Added by Albert 2009/02/18\n\t// If the the driver wants to use the bssid to create the connection.\n\t// If not,  we have to copy the connecting AP's MAC address to it so that\n\t// the driver just has the bssid information for PMKIDList searching.\n        \n\tif ( pmlmepriv->assoc_by_bssid == _FALSE )\n\t{\n\t\t_rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN );\n\t}\n\n\tpsecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength);\n\n\n\tpqospriv->qos_option = 0;\n\t\n\tif(pregistrypriv->wmm_enable)\t\n\t{\n\t\ttmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength);\t\n\n\t\tif (psecnetwork->IELength != tmp_len)\t\t\n\t\t{\n\t\t\tpsecnetwork->IELength = tmp_len;\n\t\t\tpqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon\n\t\t}\n\t\telse \n\t\t{\n\t\t\tpqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon\n\t\t}\t\t\n\t}\t\n\n#ifdef CONFIG_80211N_HT\n\tphtpriv->ht_option = _FALSE;\n\tptmp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &tmp_len, pnetwork->network.IELength-12);\n\tif(pregistrypriv->ht_enable && ptmp && tmp_len>0)\n\t{\n\t\t//\tAdded by Albert 2010/06/23\n\t\t//\tFor the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue.\n\t\t//\tEspecially for Realtek 8192u SoftAP.\n\t\tif (\t( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) &&\n\t\t\t( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) &&\n\t\t\t( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ ))\n\t\t{\n\t\t\trtw_ht_use_default_setting(padapter);\n\n\t\t\trtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength);\n\n\t\t\t//rtw_restructure_ht_ie\n\t\t\trtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0], \n\t\t\t\t\t\t\t\t\tpnetwork->network.IELength-12, &psecnetwork->IELength,\n\t\t\t\t\t\t\t\t\tpnetwork->network.Configuration.DSConfig);\n\t\t}\n\t}\n\n#ifdef CONFIG_80211AC_VHT\n\tpvhtpriv->vht_option = _FALSE;\n\tif (phtpriv->ht_option && pregistrypriv->vht_enable) {\n\t\trtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], \n\t\t\t\t\t\t\t\tpnetwork->network.IELength, &psecnetwork->IELength);\n\t}\n#endif\n\n\trtw_append_exented_cap(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength);\n\n#endif //CONFIG_80211N_HT\n\n\t#if 0\n\tpsecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength;\n\n\tif(psecnetwork->IELength < (256-1))\n\t{\n\t\t_rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength);\n\t}\n\telse\n\t{\n\t\t_rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1));\n\t}\n\t#endif\n\t\n\tpcmd->cmdsz = sizeof(WLAN_BSSID_EX);\n\n#ifdef CONFIG_RTL8712\n\t//wlan_network endian conversion\t\n\tpsecnetwork->Length = cpu_to_le32(psecnetwork->Length);\n\tpsecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength);\n\tpsecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy);\n\tpsecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi);\n\tpsecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse);\n\tpsecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow);\n\tpsecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod);\n\tpsecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig);\n\tpsecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime);\n\tpsecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern);\n\tpsecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet);\n\tpsecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length);\t\n\tpsecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length);\n\tpsecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode);\n\tpsecnetwork->IELength = cpu_to_le32(psecnetwork->IELength);      \n#endif\n\n\t_rtw_init_listhead(&pcmd->list);\n\tpcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss)\n\tpcmd->parmbuf = (unsigned char *)psecnetwork;\n\tpcmd->rsp = NULL;\n\tpcmd->rspsz = 0;\n\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmd);\n\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n}\n\nu8 rtw_disassoc_cmd(_adapter*padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */\n{\n\tstruct cmd_obj *cmdobj = NULL;\n\tstruct disconnect_parm *param = NULL;\n\tstruct cmd_priv *cmdpriv = &padapter->cmdpriv;\n\tu8 res = _SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, (\"+rtw_disassoc_cmd\\n\"));\n\n\t/* prepare cmd parameter */\n\tparam = (struct disconnect_parm *)rtw_zmalloc(sizeof(*param));\n\tif (param == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\tparam->deauth_timeout_ms = deauth_timeout_ms;\n\n\tif (enqueue) {\n\t\t/* need enqueue, prepare cmd_obj and enqueue */\n\t\tcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));\n\t\tif (cmdobj == NULL) {\n\t\t\tres = _FAIL;\n\t\t\trtw_mfree((u8 *)param, sizeof(*param));\n\t\t\tgoto exit;\n\t\t}\n\t\tinit_h2fwcmd_w_parm_no_rsp(cmdobj, param, _DisConnect_CMD_);\n\t\tres = rtw_enqueue_cmd(cmdpriv, cmdobj);\n\t} else {\n\t\t/* no need to enqueue, do the cmd hdl directly and free cmd parameter */\n\t\tif (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param))\n\t\t\tres = _FAIL;\n\t\trtw_mfree((u8 *)param, sizeof(*param));\n\t}\n\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_setopmode_cmd(_adapter  *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue)\n{\n\tstruct\tcmd_obj*\tph2c;\n\tstruct\tsetopmode_parm* psetop;\n\n\tstruct\tcmd_priv   *pcmdpriv= &padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\tpsetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm)); \n\n\tif(psetop==NULL){\t\t\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\tpsetop->mode = (u8)networktype;\n\t\n\tif(enqueue){\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\t\t\n\t\tif(ph2c==NULL){\t\t\n\t\t\trtw_mfree((u8 *)psetop, sizeof(*psetop));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\t\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_);\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\telse{\n\t\tsetopmode_hdl(padapter, (u8 *)psetop);\n\t\trtw_mfree((u8 *)psetop, sizeof(*psetop));\n\t}\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 key_type, bool enqueue)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct set_stakey_parm\t*psetstakey_para;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\tstruct set_stakey_rsp\t\t*psetstakey_rsp = NULL;\n\t\n\tstruct mlme_priv\t\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv \t\t*psecuritypriv = &padapter->securitypriv;\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n\tpsetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));\n\tif(psetstakey_para==NULL){\t\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\t_rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN);\n\t\t\n\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){\n\t\t\tpsetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm;\n\t}else{\n\t\tGET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE);\n\t}\n\n\tif (key_type == GROUP_KEY) {\n\t\t_rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16);\n\t}\n\telse if (key_type == UNICAST_KEY) {\n\t\t_rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16);\n\t}\n#ifdef CONFIG_TDLS\n\telse if(key_type == TDLS_KEY){\n\t\t\t_rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16);\n\t\tpsetstakey_para->algorithm=(u8)sta->dot118021XPrivacy;\n       }\n#endif /* CONFIG_TDLS */\n\n\t//jeff: set this becasue at least sw key is ready\n\tpadapter->securitypriv.busetkipkey=_TRUE;\n\n\tif(enqueue)\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\t\tif ( ph2c == NULL){\n\t\t\trtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\t\n\n\t\tpsetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); \n\t\tif(psetstakey_rsp == NULL){\n\t\t\trtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));\n\t\t\trtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));\n\t\t\tres=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);\n\t\tph2c->rsp = (u8 *) psetstakey_rsp;\n\t\tph2c->rspsz = sizeof(struct set_stakey_rsp);\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\t}\n\telse{\n\t\tset_stakey_hdl(padapter, (u8 *)psetstakey_para);\n\t\trtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));\n\t}\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct set_stakey_parm\t*psetstakey_para;\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\tstruct set_stakey_rsp\t\t*psetstakey_rsp = NULL;\t\n\tstruct mlme_priv\t\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv \t\t*psecuritypriv = &padapter->securitypriv;\n\ts16 cam_id = 0;\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n\tif(!enqueue)\n\t{\n\t\twhile ((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1, -1)) >= 0) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"clear key for addr:\"MAC_FMT\", camid:%d\\n\", MAC_ARG(sta->hwaddr), cam_id);\n\t\t\tclear_cam_entry(padapter, cam_id);\n\t\t\trtw_camid_free(padapter, cam_id);\n\t\t}\n\t}\n\telse\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\t\tif ( ph2c == NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpsetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));\n\t\tif(psetstakey_para==NULL){\n\t\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\t\tres=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpsetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp)); \n\t\tif(psetstakey_rsp == NULL){\n\t\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\t\trtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));\n\t\t\tres=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);\n\t\tph2c->rsp = (u8 *) psetstakey_rsp;\n\t\tph2c->rspsz = sizeof(struct set_stakey_rsp);\n\n\t\t_rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);\n\n\t\tpsetstakey_para->algorithm = _NO_PRIVACY_;\n\t\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\t\t\n\t}\n\t\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_setrttbl_cmd(_adapter  *padapter, struct setratable_parm *prate_table)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct setratable_parm *\tpsetrttblparm;\t\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t\t}\n\tpsetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm)); \n\n\tif(psetrttblparm==NULL){\n\t\trtw_mfree((unsigned char *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));\n\n\t_rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\n_func_exit_;\t\n\treturn res;\n\n}\n\nu8 rtw_getrttbl_cmd(_adapter  *padapter, struct getratable_rsp *pval)\n{\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct getratable_parm *\tpgetrttblparm;\t\n\tstruct cmd_priv \t\t\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tpgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm)); \n\n\tif(pgetrttblparm==NULL){\n\t\trtw_mfree((unsigned char *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n//\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));\n\n\t_rtw_init_listhead(&ph2c->list);\n\tph2c->cmdcode =GEN_CMD_CODE(_GetRaTable);\n\tph2c->parmbuf = (unsigned char *)pgetrttblparm;\n\tph2c->cmdsz =  sizeof(struct getratable_parm);\n\tph2c->rsp = (u8*)pval;\n\tph2c->rspsz = sizeof(struct getratable_rsp);\n\t\n\tpgetrttblparm ->rsvd = 0x0;\n\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\nexit:\n_func_exit_;\t\n\treturn res;\n\n}\n\nu8 rtw_setassocsta_cmd(_adapter  *padapter, u8 *mac_addr)\n{\n\tstruct cmd_priv \t\t*pcmdpriv = &padapter->cmdpriv;\n\tstruct cmd_obj*\t\t\tph2c;\n\tstruct set_assocsta_parm\t*psetassocsta_para;\t\n\tstruct set_stakey_rsp\t\t*psetassocsta_rsp = NULL;\n\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpsetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm));\n\tif(psetassocsta_para==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tpsetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp)); \n\tif(psetassocsta_rsp==NULL){\n\t\trtw_mfree((u8 *) ph2c, sizeof(struct\tcmd_obj));\n\t\trtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm));\n\t\treturn _FAIL;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_);\n\tph2c->rsp = (u8 *) psetassocsta_rsp;\n\tph2c->rspsz = sizeof(struct set_assocsta_rsp);\n\n\t_rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN);\n\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n }\n\nu8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr)\n{\n\tstruct cmd_priv\t\t*pcmdpriv = &padapter->cmdpriv;\n\tstruct cmd_obj*\t\tph2c;\n\tstruct addBaReq_parm\t*paddbareq_parm;\n\n\tu8\tres=_SUCCESS;\n\t\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpaddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm)); \n\tif(paddbareq_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpaddbareq_parm->tid = tid;\n\t_rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN);\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq));\n\n\t//DBG_871X(\"rtw_addbareq_cmd, tid=%d\\n\", tid);\n\n\t//rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n}\n//add for CONFIG_IEEE80211W, none 11w can use it\nu8 rtw_reset_securitypriv_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj*\t\tph2c;\n\tstruct drvextra_cmd_parm  *pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n\t\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = RESET_SECURITYPRIV;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\n\t//rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n\nu8 rtw_free_assoc_resources_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj*\t\tph2c;\n\tstruct drvextra_cmd_parm  *pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n\t\n_func_enter_;\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = FREE_ASSOC_RESOURCES;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\n\t//rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n\nu8 rtw_dynamic_chk_wk_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj*\t\tph2c;\n\tstruct drvextra_cmd_parm  *pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv=&padapter->cmdpriv;\n\tu8\tres=_SUCCESS;\n\t\n_func_enter_;\t\n\n\t//only  primary padapter does this cmd\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)\n\t\tpcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);\n#endif\n*/\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\n\t//rtw_enqueue_cmd(pcmdpriv, ph2c);\t\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n\nu8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)\n{\n\tstruct cmd_obj *pcmdobj;\n\tstruct set_ch_parm *set_ch_parm;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\n\tu8 res=_SUCCESS;\n\n_func_enter_;\n\n\tDBG_871X(FUNC_NDEV_FMT\" ch:%u, bw:%u, ch_offset:%u\\n\",\n\t\tFUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset);\n\n\t/* check input parameter */\n\n\t/* prepare cmd parameter */\n\tset_ch_parm = (struct set_ch_parm *)rtw_zmalloc(sizeof(*set_ch_parm));\n\tif (set_ch_parm == NULL) {\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tset_ch_parm->ch = ch;\n\tset_ch_parm->bw = bw;\n\tset_ch_parm->ch_offset = ch_offset;\n\n\tif (enqueue) {\n\t\t/* need enqueue, prepare cmd_obj and enqueue */\n\t\tpcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\t\tif(pcmdobj == NULL){\n\t\t\trtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));\n\t\t\tres=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(pcmdobj, set_ch_parm, GEN_CMD_CODE(_SetChannel));\n\t\tres = rtw_enqueue_cmd(pcmdpriv, pcmdobj);\n\t} else {\n\t\t/* no need to enqueue, do the cmd hdl directly and free cmd parameter */\n\t\tif( H2C_SUCCESS !=set_ch_hdl(padapter, (u8 *)set_ch_parm) )\n\t\t\tres = _FAIL;\n\t\t\n\t\trtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));\n\t}\n\n\t/* do something based on res... */\n\nexit:\n\n\tDBG_871X(FUNC_NDEV_FMT\" res:%u\\n\", FUNC_NDEV_ARG(padapter->pnetdev), res);\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig)\n{\n\tstruct cmd_obj *cmdobj;\n\tstruct\tSetChannelPlan_param *parm;\n\tstruct cmd_priv *pcmdpriv = &adapter->cmdpriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct submit_ctx sctx;\n\tu8 res = _SUCCESS;\n\n_func_enter_;\n\n\t/* check if allow software config */\n\tif (swconfig && rtw_hal_is_disable_sw_channel_plan(adapter) == _TRUE) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t/* check input parameter */\n\tif (!rtw_is_channel_plan_valid(chplan)) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (rtw_chplan_is_empty(chplan) == _TRUE) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t/* prepare cmd parameter */\n\tparm = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(*parm));\n\tif (parm == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\tparm->channel_plan = chplan;\n\n\tif (flags & RTW_CMDF_DIRECTLY) {\n\t\t/* no need to enqueue, do the cmd hdl directly and free cmd parameter */\n\t\tif (H2C_SUCCESS != set_chplan_hdl(adapter, (u8 *)parm))\n\t\t\tres = _FAIL;\n\t\trtw_mfree((u8 *)parm, sizeof(*parm));\n\t} else {\n\t\t/* need enqueue, prepare cmd_obj and enqueue */\n\t\tcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));\n\t\tif (cmdobj == NULL) {\n\t\t\tres = _FAIL;\n\t\t\trtw_mfree((u8 *)parm, sizeof(*parm));\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(cmdobj, parm, GEN_CMD_CODE(_SetChannelPlan));\n\n\t\tif (flags & RTW_CMDF_WAIT_ACK) {\n\t\t\tcmdobj->sctx = &sctx;\n\t\t\trtw_sctx_init(&sctx, 2000);\n\t\t}\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, cmdobj);\n\n\t\tif (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {\n\t\t\trtw_sctx_wait(&sctx, __func__);\n\t\t\t_enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);\n\t\t\tif (sctx.status == RTW_SCTX_SUBMITTED)\n\t\t\t\tcmdobj->sctx = NULL;\n\t\t\t_exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);\n\t\t}\n\t}\n\t\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed)\n{\n\tstruct\tcmd_obj*\tpcmdobj;\n\tstruct\tLedBlink_param *ledBlink_param;\n\tstruct\tcmd_priv   *pcmdpriv = &padapter->cmdpriv;\n\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, (\"+rtw_led_blink_cmd\\n\"));\n\t\n\tpcmdobj = (struct\tcmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\tif(pcmdobj == NULL){\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tledBlink_param = (struct\tLedBlink_param *)rtw_zmalloc(sizeof(struct\tLedBlink_param));\n\tif(ledBlink_param == NULL) {\n\t\trtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tledBlink_param->pLed=pLed;\n\t\n\tinit_h2fwcmd_w_parm_no_rsp(pcmdobj, ledBlink_param, GEN_CMD_CODE(_LedBlink));\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmdobj);\n\t\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no)\n{\n\tstruct\tcmd_obj*\tpcmdobj;\n\tstruct\tSetChannelSwitch_param*setChannelSwitch_param;\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct\tcmd_priv   *pcmdpriv = &padapter->cmdpriv;\n\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, (\"+rtw_set_csa_cmd\\n\"));\n\t\n\tpcmdobj = (struct\tcmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\tif(pcmdobj == NULL){\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tsetChannelSwitch_param = (struct SetChannelSwitch_param *)rtw_zmalloc(sizeof(struct\tSetChannelSwitch_param));\n\tif(setChannelSwitch_param == NULL) {\n\t\trtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tsetChannelSwitch_param->new_ch_no=new_ch_no;\n\t\n\tinit_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelSwitch_param, GEN_CMD_CODE(_SetChannelSwitch));\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmdobj);\n\t\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nu8 rtw_tdls_cmd(_adapter *padapter, u8 *addr, u8 option)\n{\n\tstruct\tcmd_obj*\tpcmdobj;\n\tstruct\tTDLSoption_param\t*TDLSoption;\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct\tcmd_priv   *pcmdpriv = &padapter->cmdpriv;\n\n\tu8\tres=_SUCCESS;\n\n_func_enter_;\n\n#ifdef CONFIG_TDLS\n\n\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, (\"+rtw_set_tdls_cmd\\n\"));\n\n\tpcmdobj = (struct\tcmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\tif(pcmdobj == NULL){\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tTDLSoption= (struct TDLSoption_param *)rtw_zmalloc(sizeof(struct TDLSoption_param));\n\tif(TDLSoption == NULL) {\n\t\trtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_spinlock(&(padapter->tdlsinfo.cmd_lock));\n\tif (addr != NULL)\n\t\t_rtw_memcpy(TDLSoption->addr, addr, 6);\n\tTDLSoption->option = option;\n\t_rtw_spinunlock(&(padapter->tdlsinfo.cmd_lock));\n\tinit_h2fwcmd_w_parm_no_rsp(pcmdobj, TDLSoption, GEN_CMD_CODE(_TDLS));\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmdobj);\n\n#endif\t//CONFIG_TDLS\n\t\nexit:\n\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nstatic void collect_traffic_statistics(_adapter *padapter)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->adapter_type != PRIMARY_ADAPTER)\n\t\treturn;\n#endif\n\n\t// Tx\n\tpdvobjpriv->traffic_stat.tx_bytes = padapter->xmitpriv.tx_bytes;\n\tpdvobjpriv->traffic_stat.tx_pkts = padapter->xmitpriv.tx_pkts;\n\tpdvobjpriv->traffic_stat.tx_drop = padapter->xmitpriv.tx_drop;\n\n\t// Rx\n\tpdvobjpriv->traffic_stat.rx_bytes = padapter->recvpriv.rx_bytes;\n\tpdvobjpriv->traffic_stat.rx_pkts = padapter->recvpriv.rx_pkts;\n\tpdvobjpriv->traffic_stat.rx_drop = padapter->recvpriv.rx_drop;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t// Add secondary adapter statistics\n\tif(rtw_buddy_adapter_up(padapter))\n\t{\n\t\t// Tx\n\t\tpdvobjpriv->traffic_stat.tx_bytes += padapter->pbuddy_adapter->xmitpriv.tx_bytes;\n\t\tpdvobjpriv->traffic_stat.tx_pkts += padapter->pbuddy_adapter->xmitpriv.tx_pkts;\n\t\tpdvobjpriv->traffic_stat.tx_drop += padapter->pbuddy_adapter->xmitpriv.tx_drop;\n\n\t\t// Rx\n\t\tpdvobjpriv->traffic_stat.rx_bytes += padapter->pbuddy_adapter->recvpriv.rx_bytes;\n\t\tpdvobjpriv->traffic_stat.rx_pkts += padapter->pbuddy_adapter->recvpriv.rx_pkts;\n\t\tpdvobjpriv->traffic_stat.rx_drop += padapter->pbuddy_adapter->recvpriv.rx_drop;\n\t}\n#endif\n\n\t// Calculate throughput in last interval\n\tpdvobjpriv->traffic_stat.cur_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes - pdvobjpriv->traffic_stat.last_tx_bytes;\n\tpdvobjpriv->traffic_stat.cur_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes - pdvobjpriv->traffic_stat.last_rx_bytes;\n\tpdvobjpriv->traffic_stat.last_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes;\n\tpdvobjpriv->traffic_stat.last_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes;\n\n\tpdvobjpriv->traffic_stat.cur_tx_tp = (u32)(pdvobjpriv->traffic_stat.cur_tx_bytes *8/2/1024/1024);\n\tpdvobjpriv->traffic_stat.cur_rx_tp = (u32)(pdvobjpriv->traffic_stat.cur_rx_bytes *8/2/1024/1024);\n}\n\n//from_timer == 1 means driver is in LPS\nu8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)\n{\n\tu8\tbEnterPS = _FALSE;\n\tu16 BusyThresholdHigh;\n\tu16\tBusyThresholdLow;\n\tu16\tBusyThreshold;\n\tu8\tbBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;\n\tu8\tbHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;\n\n\tstruct mlme_priv\t\t*pmlmepriv = &(padapter->mlmepriv);\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);\n\tstruct tdls_txmgmt txmgmt;\n\tu8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\n#endif //CONFIG_TDLS\n\n\tRT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo;\n\n#ifdef CONFIG_BT_COEXIST\n\tif (padapter->registrypriv.wifi_spec != 1) {\n\t\tBusyThresholdHigh = 25;\n\t\tBusyThresholdLow = 10;\n\t} else\n#endif /* CONFIG_BT_COEXIST */\n\t{\n\t\tBusyThresholdHigh = 100;\n\t\tBusyThresholdLow = 75;\n\t}\n\tBusyThreshold = BusyThresholdHigh;\n\n\tcollect_traffic_statistics(padapter);\n\n\t//\n\t// Determine if our traffic is busy now\n\t//\n\tif((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) \n\t\t/*&& !MgntInitAdapterInProgress(pMgntInfo)*/)\n\t{\n\t\t// if we raise bBusyTraffic in last watchdog, using lower threshold.\n\t\tif (pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\t\tBusyThreshold = BusyThresholdLow;\n\n\t\tif( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||\n\t\t\tpmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )\n\t\t{\n\t\t\tbBusyTraffic = _TRUE;\n\n\t\t\tif (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod)\n\t\t\t\tbRxBusyTraffic = _TRUE;\n\t\t\telse\n\t\t\t\tbTxBusyTraffic = _TRUE;\n\t\t}\n\n\t\t// Higher Tx/Rx data.\n\t\tif( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 ||\n\t\t\tpmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 )\n\t\t{\n\t\t\tbHigherBusyTraffic = _TRUE;\n\n\t\t\tif (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod)\n\t\t\t\tbHigherBusyRxTraffic = _TRUE;\n\t\t\telse\n\t\t\t\tbHigherBusyTxTraffic = _TRUE;\n\t\t}\n\n#ifdef CONFIG_TRAFFIC_PROTECT\n#define TX_ACTIVE_TH 10\n#define RX_ACTIVE_TH 20\n#define TRAFFIC_PROTECT_PERIOD_MS 4500\n\n\tif (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH\n\t\t|| link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) {\n\t\t\n\t\tDBG_871X_LEVEL(_drv_info_, FUNC_ADPT_FMT\" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter),\n\t\t\tTRAFFIC_PROTECT_PERIOD_MS,\n\t\t\tlink_detect->NumTxOkInPeriod,\n\t\t\tlink_detect->NumRxUnicastOkInPeriod);\n\n\t\trtw_lock_traffic_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS);\n\t}\n#endif\n\t\t\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_AUTOSETUP\n\t\t/* TDLS_WATCHDOG_PERIOD * 2sec, periodically send */\n\t\tif ((ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0) {\n\t\t\t_rtw_memcpy(txmgmt.peer, baddr, ETH_ALEN);\n\t\t\tissue_tdls_dis_req( padapter, &txmgmt );\n\t\t}\n\t\tptdlsinfo->watchdog_count++;\n#endif //CONFIG_TDLS_AUTOSETUP\n#endif //CONFIG_TDLS\n\n#ifdef CONFIG_LPS\n\t\t// check traffic for  powersaving.\n\t\tif( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||\n#ifdef CONFIG_LPS_SLOW_TRANSITION\t\t\t\n\t\t\t(pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) \n#else //CONFIG_LPS_SLOW_TRANSITION\n\t\t\t(pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4) \n#endif //CONFIG_LPS_SLOW_TRANSITION\n\t\t\t)\n\t\t{\n#ifdef DBG_RX_COUNTER_DUMP\n\t\t\tif( padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA)\n\t\t\t\tDBG_871X(\"(-)Tx = %d, Rx = %d \\n\",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);\n#endif\t\n\t\t\tbEnterPS= _FALSE;\n#ifdef CONFIG_LPS_SLOW_TRANSITION\n\t\t\tif(bBusyTraffic == _TRUE)\n\t\t\t{\n\t\t\t\tif(pmlmepriv->LinkDetectInfo.TrafficTransitionCount <= 4)\n\t\t\t\t\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 4;\n\n\t\t\t\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount++;\n\n\t\t\t\t//DBG_871X(\"Set TrafficTransitionCount to %d\\n\", pmlmepriv->LinkDetectInfo.TrafficTransitionCount);\n\t\t\t\n\t\t\t\tif(pmlmepriv->LinkDetectInfo.TrafficTransitionCount > 30/*TrafficTransitionLevel*/)\n\t\t\t\t{\n\t\t\t\t\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 30;\n\t\t\t\t}\t\n\t\t\t}\n#endif //CONFIG_LPS_SLOW_TRANSITION\n\t\n\t\t}\n\t\telse\n\t\t{\n#ifdef DBG_RX_COUNTER_DUMP\t\t\n\t\t\tif( padapter->dump_rx_cnt_mode & DUMP_DRV_TRX_COUNTER_DATA)\n\t\t\t\tDBG_871X(\"(+)Tx = %d, Rx = %d \\n\",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);\n#endif\t\t\t\n#ifdef CONFIG_LPS_SLOW_TRANSITION\n\t\t\tif(pmlmepriv->LinkDetectInfo.TrafficTransitionCount>=2)\n\t\t\t\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount -=2;\n\t\t\telse\n\t\t\t\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;\n\n\t\t\tif(pmlmepriv->LinkDetectInfo.TrafficTransitionCount == 0)\n\t\t\t\tbEnterPS= _TRUE;\n#else //CONFIG_LPS_SLOW_TRANSITION\n\t\t\t\tbEnterPS= _TRUE;\n#endif //CONFIG_LPS_SLOW_TRANSITION\n\t\t}\n\n#ifdef CONFIG_DYNAMIC_DTIM\n\t\tif(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount == 8)\n\t\t\tbEnterPS= _FALSE;\n\n\t\tDBG_871X(\"LowPowerTransitionCount=%d\\n\", pmlmepriv->LinkDetectInfo.LowPowerTransitionCount);\n#endif //CONFIG_DYNAMIC_DTIM\n\n\t\t// LeisurePS only work in infra mode.\n\t\tif(bEnterPS)\n\t\t{\n\t\t\tif(!from_timer)\n\t\t\t{\n#ifdef CONFIG_DYNAMIC_DTIM\n\t\t\t\tif(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount < 8)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tadapter_to_pwrctl(padapter)->dtim = 1;\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tadapter_to_pwrctl(padapter)->dtim = 3;\n\t\t\t\t}\n#endif //CONFIG_DYNAMIC_DTIM\n\t\t\t\tLPS_Enter(padapter, \"TRAFFIC_IDLE\");\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\t//do this at caller\n\t\t\t\t//rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1);\n\t\t\t\t//rtw_hal_dm_watchdog_in_lps(padapter);\n\t\t\t}\t\t\t\t\n#ifdef CONFIG_DYNAMIC_DTIM\n\t\t\tif (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE )\n\t\t\t\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount++;\n#endif //CONFIG_DYNAMIC_DTIM\n\t\t}\n\t\telse\n\t\t{\n#ifdef CONFIG_DYNAMIC_DTIM\n\t\t\tif(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount != 8)\n\t\t\t\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;\n\t\t\telse\n\t\t\t\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount++;\n#endif //CONFIG_DYNAMIC_DTIM\t\t\t\n\t\t\tif(!from_timer)\n\t\t\t{\n\t\t\t\tLPS_Leave(padapter, \"TRAFFIC_BUSY\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t \tif(padapter->iface_type == IFACE_PORT0) \n#endif\n\t\t\t\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_TRAFFIC_BUSY, 1);\n\t\t\t}\n\t\t}\n\t\n#endif // CONFIG_LPS\n\t}\n\telse\n\t{\n#ifdef CONFIG_LPS\n\t\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\t\tint n_assoc_iface = 0;\n\t\tint i;\n\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\tif (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))\n\t\t\t\tn_assoc_iface++;\n\t\t}\n\n\t\tif(!from_timer && n_assoc_iface == 0)\n\t\t\tLPS_Leave(padapter, \"NON_LINKED\");\n#endif\n\t}\n\n\tpmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0;\n\tpmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0;\n\tpmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic;\n\tpmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic;\n\tpmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic;\n\tpmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic;\n\tpmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;\n\tpmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic;\n\n\treturn bEnterPS;\n\t\n}\n\nvoid dynamic_chk_wk_hdl(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv;\n\tpmlmepriv = &(padapter->mlmepriv);\n\n#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n#ifdef CONFIG_AP_MODE\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\t\t\t\n\t\texpire_timeout_chk(padapter);\n\t}\n#endif\n#endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\n#ifdef DBG_CONFIG_ERROR_DETECT\t\n\trtw_hal_sreset_xmit_status_check(padapter);\t\t\n\trtw_hal_sreset_linked_status_check(padapter);\n#endif\t\n\n\t//for debug purpose\n\t_linked_info_dump(padapter);\n\n\n\t//if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE)\n\t{\n\t\tlinked_status_chk(padapter, 0);\n\t\ttraffic_status_watchdog(padapter, 0);\n\t\t#ifdef DBG_RX_COUNTER_DUMP\n\t\trtw_dump_rx_counters(padapter);\n\t\t#endif\n\t\tdm_DynamicUsbTxAgg(padapter, 0);\n\t}\n\n#ifdef CONFIG_BEAMFORMING\n#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/\n\tbeamforming_watchdog(padapter);\n#endif\n#endif\n\n\trtw_hal_dm_watchdog(padapter);\n\n\t//check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type);\n\n#ifdef CONFIG_BT_COEXIST\n\t//\n\t// BT-Coexist\n\t//\n\trtw_btcoex_Handler(padapter);\n#endif\n\n\t\n#ifdef CONFIG_IPS_CHECK_IN_WD\n\t//always call rtw_ps_processor() at last one.\n\tif (is_primary_adapter(padapter))\n\t\trtw_ps_processor(padapter);\n#endif\n}\n\n#ifdef CONFIG_LPS\n\nvoid lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type);\nvoid lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu8\tmstatus;\n\t\n_func_enter_;\n\n\tif((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)\n\t\t|| (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))\n\t{\n\t\treturn;\n\t}\n\n\tswitch(lps_ctrl_type)\n\t{\n\t\tcase LPS_CTRL_SCAN:\n\t\t\t//DBG_871X(\"LPS_CTRL_SCAN \\n\");\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_ScanNotify(padapter, _TRUE);\n#endif // CONFIG_BT_COEXIST\n\t\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t{\n\t\t\t\t// connect\n\t\t\t\tLPS_Leave(padapter, \"LPS_CTRL_SCAN\");\n\t\t\t}\n\t\t\tbreak;\n\t\tcase LPS_CTRL_JOINBSS:\n\t\t\t//DBG_871X(\"LPS_CTRL_JOINBSS \\n\");\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_JOINBSS\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_CONNECT:\n\t\t\t//DBG_871X(\"LPS_CTRL_CONNECT \\n\");\n\t\t\tmstatus = 1;//connect\n\t\t\t// Reset LPS Setting\n\t\t\tpwrpriv->LpsIdleCount = 0;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_MediaStatusNotify(padapter, mstatus);\n#endif // CONFIG_BT_COEXIST\n\t\t\tbreak;\n\t\tcase LPS_CTRL_DISCONNECT:\n\t\t\t//DBG_871X(\"LPS_CTRL_DISCONNECT \\n\");\n\t\t\tmstatus = 0;//disconnect\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_MediaStatusNotify(padapter, mstatus);\n#endif // CONFIG_BT_COEXIST\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_DISCONNECT\");\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));\n\t\t\tbreak;\n\t\tcase LPS_CTRL_SPECIAL_PACKET:\n\t\t\t//DBG_871X(\"LPS_CTRL_SPECIAL_PACKET \\n\");\n\t\t\tpwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time();\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_SpecialPacketNotify(padapter, PACKET_DHCP);\n#endif // CONFIG_BT_COEXIST\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_SPECIAL_PACKET\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_LEAVE:\n\t\t\t//DBG_871X(\"LPS_CTRL_LEAVE \\n\");\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_LEAVE\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_TRAFFIC_BUSY:\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_TRAFFIC_BUSY\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_TX_TRAFFIC_LEAVE:\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_TX_TRAFFIC_LEAVE\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_RX_TRAFFIC_LEAVE:\n\t\t\tLPS_Leave(padapter, \"LPS_CTRL_RX_TRAFFIC_LEAVE\");\n\t\t\tbreak;\n\t\tcase LPS_CTRL_ENTER:\n\t\t\tLPS_Enter(padapter, \"TRAFFIC_IDLE_1\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\nu8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\t//struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\tu8\tres = _SUCCESS;\n\t\n_func_enter_;\n\n\t//if(!pwrctrlpriv->bLeisurePs)\n\t//\treturn res;\n\n\tif(enqueue)\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif(ph2c==NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\t\tif(pdrvextra_cmd_parm==NULL){\n\t\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID;\n\t\tpdrvextra_cmd_parm->type = lps_ctrl_type;\n\t\tpdrvextra_cmd_parm->size = 0;\n\t\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\telse\n\t{\n\t\tlps_ctrl_wk_hdl(padapter, lps_ctrl_type);\n\t}\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n\nvoid rtw_dm_in_lps_hdl(_adapter*padapter)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_DM_IN_LPS, NULL);\n}\n\nu8 rtw_dm_in_lps_wk_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = DM_IN_LPS_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n\treturn res;\n\n}\n\nvoid rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\n\tif(dtim <=0 || dtim > 16)\n\t\treturn;\n\n#ifdef CONFIG_BT_COEXIST\n\tif (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\n\t\treturn;\n#endif\n\n#ifdef CONFIG_LPS_LCLK\n\t_enter_pwrlock(&pwrpriv->lock);\n#endif\n\n\tif(pwrpriv->dtim!=dtim)\n\t{\n\t\tDBG_871X(\"change DTIM from %d to %d, bFwCurrentInPSMode=%d, ps_mode=%d\\n\", pwrpriv->dtim, dtim, \n\t\t\tpwrpriv->bFwCurrentInPSMode, pwrpriv->pwr_mode);\n\t\t\n\t\tpwrpriv->dtim = dtim;\n\t}\t\n\n\tif((pwrpriv->bFwCurrentInPSMode ==_TRUE) && (pwrpriv->pwr_mode > PS_MODE_ACTIVE))\t\t \n\t{\n\t\tu8 ps_mode = pwrpriv->pwr_mode;\n\n\t\t//DBG_871X(\"change DTIM from %d to %d, ps_mode=%d\\n\", pwrpriv->dtim, dtim, ps_mode);\n\t\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));\n\t}\n\t\n#ifdef CONFIG_LPS_LCLK\n\t_exit_pwrlock(&pwrpriv->lock);\n#endif\n\n}\n\n#endif\n\nu8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->iface_type != IFACE_PORT0)\n\t\treturn res;\n#endif\n*/\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif(ph2c==NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\t\tif(pdrvextra_cmd_parm==NULL){\n\t\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = LPS_CHANGE_DTIM_CID;\n\t\tpdrvextra_cmd_parm->type = dtim;\n\t\tpdrvextra_cmd_parm->size = 0;\n\t\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\t\nexit:\n\t\n\treturn res;\n\n}\n\n#if (RATE_ADAPTIVE_SUPPORT==1)\nvoid rpt_timer_setting_wk_hdl(_adapter *padapter, u16 minRptTime)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&minRptTime));\n}\n\nu8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime)\n{\n\tstruct cmd_obj\t\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\n\tu8\tres = _SUCCESS;\n\n_func_enter_;\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = RTP_TIMER_CFG_WK_CID;\n\tpdrvextra_cmd_parm->type = minRptTime;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\nexit:\n\n_func_exit_;\n\n\treturn res;\n\n}\n\n#endif\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nvoid antenna_select_wk_hdl(_adapter *padapter, u8 antenna)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna));\n}\n\nu8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue)\n{\n\tstruct cmd_obj\t\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8 \tbSupportAntDiv = _FALSE;\n\tu8\tres = _SUCCESS;\n\n_func_enter_;\n\trtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv));\n\tif(_FALSE == bSupportAntDiv )\treturn res;\n\n\tif(_TRUE == enqueue)\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif(ph2c==NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\t\tif(pdrvextra_cmd_parm==NULL){\n\t\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID;\n\t\tpdrvextra_cmd_parm->type = antenna;\n\t\tpdrvextra_cmd_parm->size = 0;\n\t\tpdrvextra_cmd_parm->pbuf = NULL;\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\telse{\n\t\tantenna_select_wk_hdl(padapter,antenna );\n\t}\nexit:\n\n_func_exit_;\n\n\treturn res;\n\n}\n#endif\n\nvoid rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta)\n{\n\tif (psta) {\n\t\tset_sta_rate(padapter, psta);\n\t}\n}\n\nu8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = DM_RA_MSK_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = psta;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n\treturn res;\n\n}\n\nvoid power_saving_wk_hdl(_adapter *padapter)\n{\n\t rtw_ps_processor(padapter);\n}\n\n//add for CONFIG_IEEE80211W, none 11w can use it\nvoid reset_securitypriv_hdl(_adapter *padapter)\n{\n\t rtw_reset_securitypriv(padapter);\n}\n\nvoid free_assoc_resources_hdl(_adapter *padapter)\n{\n\t rtw_free_assoc_resources(padapter, 1);\n}\n\n#ifdef CONFIG_P2P\nu8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType )\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct wifidirect_info\t*pwdinfo= &(padapter->wdinfo);\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n_func_enter_;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\treturn res;\n\t}\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;\n\tpdrvextra_cmd_parm->type = intCmdType;\t//\tAs the command tppe.\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\t\t//\tMust be NULL here\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n#endif //CONFIG_P2P\n\nu8 rtw_ps_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj\t\t*ppscmd;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\t\n\tu8\tres = _SUCCESS;\n_func_enter_;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->adapter_type != PRIMARY_ADAPTER)\n\t\tgoto exit;\n#endif\n\t\n\tppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ppscmd==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\tinit_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ppscmd);\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n\n#ifdef CONFIG_AP_MODE\n\nstatic void rtw_chk_hi_queue_hdl(_adapter *padapter)\n{\n\tstruct sta_info *psta_bmc;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu32 start = rtw_get_current_time();\n\tu8 empty = _FALSE;\n\n\tpsta_bmc = rtw_get_bcmc_stainfo(padapter);\n\tif(!psta_bmc)\n\t\treturn;\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);\n\n\twhile(_FALSE == empty && rtw_get_passing_time_ms(start) < rtw_get_wait_hiq_empty_ms())\n\t{\n\t\trtw_msleep_os(100);\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);\n\t}\n\n\tif(psta_bmc->sleepq_len==0)\n\t{\n\t\tif(empty == _SUCCESS)\n\t\t{\n\t\t\tbool update_tim = _FALSE;\n\n\t\t\tif (pstapriv->tim_bitmap & BIT(0))\n\t\t\t\tupdate_tim = _TRUE;\n\n\t\t\tpstapriv->tim_bitmap &= ~BIT(0);\n\t\t\tpstapriv->sta_dz_bitmap &= ~BIT(0);\n\n\t\t\tif (update_tim == _TRUE)\n\t\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"bmc sleepq and HIQ empty\");\n\t\t}\n\t\telse //re check again\n\t\t{\n\t\t\trtw_chk_hi_queue_cmd(padapter);\n\t\t}\n\t\t\n\t}\t\n\t\n}\n\nu8 rtw_chk_hi_queue_cmd(_adapter*padapter)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\t\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\tif(ph2c==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\t\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\tif(pdrvextra_cmd_parm==NULL){\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = 0;\n\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n\treturn res;\n\n}\n\n#ifdef CONFIG_DFS_MASTER\nu8 rtw_dfs_master_hdl(_adapter *adapter)\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\n\tif (!rfctl->dfs_master_enabled)\n\t\tgoto exit;\n\n\tif (rtw_get_on_cur_ch_time(adapter) == 0\n\t\t|| rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 300\n\t) {\n\t\t/* offchannel , by pass radar detect */\n\t\tgoto cac_status_chk;\n\t}\n\n\tif (rfctl->dbg_dfs_master_fake_radar_detect_cnt\n\t\t|| rtw_odm_radar_detect(adapter) == _TRUE\n\t) {\n\t\tif (rfctl->dbg_dfs_master_fake_radar_detect_cnt != 0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fake radar detect, cnt:%d\\n\", FUNC_ADPT_ARG(adapter)\n\t\t\t\t, rfctl->dbg_dfs_master_fake_radar_detect_cnt);\n\t\t\trfctl->dbg_dfs_master_fake_radar_detect_cnt--;\n\t\t}\n\t\n\t\tif (rfctl->dbg_dfs_master_radar_detect_trigger_non) {\n\t\t\t/* radar detect debug mode, trigger no mlme flow */\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" radar detected, trigger no mlme flow for debug\\n\", FUNC_ADPT_ARG(adapter));\n\t\t} else {\n\t\t\t/* TODO: move timer to rfctl */\n\t\t\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\t\t\tint i;\n\n\t\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\t\tif (!dvobj->padapters[i])\n\t\t\t\t\tcontinue;\n\t\t\t\tif (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE)\n\t\t\t\t\t&& check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE))\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (i >= dvobj->iface_nums) {\n\t\t\t\t/* what? */\n\t\t\t\trtw_warn_on(1);\n\t\t\t} else {\n\t\t\t\trtw_chset_update_non_ocp(dvobj->padapters[i]->mlmeextpriv.channel_set\n\t\t\t\t\t, rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset);\n\n\t\t\t\t/* change op ch, inform ch switch */\n\t\t\t\trtw_change_bss_chbw_cmd(dvobj->padapters[i], RTW_CMDF_DIRECTLY, 0, 0, 0);\n\t\t\t}\n\n\t\t\tif (rfctl->dfs_master_enabled)\n\t\t\t\tgoto set_timer;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\ncac_status_chk:\n\n\tif (!IS_UNDER_CAC(rfctl) && !IS_CAC_STOPPED(rfctl)) {\n\t\tu8 pause = 0x00;\n\n\t\trtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause);\n\t\trfctl->cac_end_time = RTW_CAC_STOPPED;\n\t}\n\nset_timer:\n\t_set_timer(&mlme->dfs_master_timer, DFS_MASTER_TIMER_MS);\n\nexit:\n\treturn H2C_SUCCESS;\n}\n\nu8 rtw_dfs_master_cmd(_adapter *adapter, bool enqueue)\n{\n\tstruct cmd_obj *cmdobj;\n\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm;\n\tstruct cmd_priv *pcmdpriv = &adapter->cmdpriv;\n\tu8 res = _FAIL;\n\n\tif (enqueue) {\n\t\tcmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif (cmdobj == NULL)\n\t\t\tgoto exit;\n\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\t\tif (pdrvextra_cmd_parm == NULL) {\n\t\t\trtw_mfree((u8 *)cmdobj, sizeof(struct cmd_obj));\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = DFS_MASTER_WK_CID;\n\t\tpdrvextra_cmd_parm->type = 0;\n\t\tpdrvextra_cmd_parm->size = 0;\n\t\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(cmdobj, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\t\tres = rtw_enqueue_cmd(pcmdpriv, cmdobj);\n\t} else {\n\t\trtw_dfs_master_hdl(adapter);\n\t\tres = _SUCCESS;\n\t}\n\nexit:\n\treturn res;\n}\n\nvoid rtw_dfs_master_timer_hdl(RTW_TIMER_HDL_ARGS)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\n\trtw_dfs_master_cmd(adapter, _TRUE);\n}\n\nvoid rtw_dfs_master_enable(_adapter *adapter, u8 ch, u8 bw, u8 offset)\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\n\t/* TODO: move timer to rfctl */\n\tadapter = GET_PRIMARY_ADAPTER(adapter);\n\n\tDBG_871X(FUNC_ADPT_FMT\" on %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), ch, bw, offset);\n\n\trfctl->pre_radar_detect_by_sta_link = rfctl->radar_detect_by_sta_link;\n\trfctl->radar_detect_by_sta_link = _FALSE;\n\n\trfctl->pre_radar_detect_ch = rfctl->radar_detect_ch;\n\trfctl->pre_radar_detect_bw = rfctl->radar_detect_bw;\n\trfctl->pre_radar_detect_offset = rfctl->radar_detect_offset;\n\trfctl->radar_detect_ch = ch;\n\trfctl->radar_detect_bw = bw;\n\trfctl->radar_detect_offset = offset;\n\n\tif (rtw_is_cac_reset_needed(adapter) == _TRUE)\n\t\trtw_rfctl_reset_cac(adapter_to_rfctl(adapter));\n\n\tif (!rfctl->dfs_master_enabled) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" set dfs_master_enabled\\n\", FUNC_ADPT_ARG(adapter));\n\t\trfctl->dfs_master_enabled = 1;\n\t\t_set_timer(&adapter->mlmepriv.dfs_master_timer, DFS_MASTER_TIMER_MS);\n\n\t\tif (rtw_rfctl_overlap_radar_detect_ch(rfctl)) {\n\t\t\tif (IS_UNDER_CAC(rfctl)) {\n\t\t\t\tu8 pause = 0xFF;\n\n\t\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause);\n\t\t\t}\n\t\t\trtw_odm_radar_detect_enable(adapter);\n\t\t}\n\t}\n}\n\nvoid rtw_dfs_master_disable(_adapter *adapter, bool ld_sta_in_dfs)\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\t\n\t/* TODO: move timer to rfctl */\n\tadapter = GET_PRIMARY_ADAPTER(adapter);\n\n\trfctl->pre_radar_detect_by_sta_link = rfctl->radar_detect_by_sta_link;\n\trfctl->radar_detect_by_sta_link = ld_sta_in_dfs;\n\n\tif (rfctl->dfs_master_enabled) {\n\t\tbool overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl);\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" clear dfs_master_enabled\\n\", FUNC_ADPT_ARG(adapter));\n\n\t\trfctl->dfs_master_enabled = 0;\n\t\trfctl->radar_detect_ch = rfctl->pre_radar_detect_ch = 0;\n\t\trfctl->radar_detect_bw = rfctl->pre_radar_detect_bw = 0;\n\t\trfctl->radar_detect_offset = rfctl->pre_radar_detect_offset = 0;\n\t\trfctl->cac_end_time = RTW_CAC_STOPPED;\n\t\t_cancel_timer_ex(&adapter->mlmepriv.dfs_master_timer);\n\n\t\tif (overlap_radar_detect_ch) {\n\t\t\tu8 pause = 0x00;\n\n\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_TXPAUSE, &pause);\n\t\t\trtw_odm_radar_detect_disable(adapter);\n\t\t}\n\t}\n}\n\nvoid rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action)\n{\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tu8 ld_sta_num, lg_sta_num, ap_num;\n\tu8 u_ch, u_bw, u_offset;\n\tbool ld_sta_in_dfs = _FALSE;\n\tbool sync_ch = _FALSE; /* _FALSE: asign channel directly */\n\tbool needed = _FALSE;\n\n\trtw_dev_iface_status_no_self(adapter, NULL, &ld_sta_num, &lg_sta_num, &ap_num, NULL);\n\trtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset);\n\tif (u_ch != 0)\n\t\tsync_ch = _TRUE;\n\n\tswitch (self_action) {\n\tcase MLME_STA_CONNECTING:\n\t\tlg_sta_num++;\n\t\tbreak;\n\tcase MLME_STA_CONNECTED:\n\t\tld_sta_num++;\n\t\tbreak;\n\tcase MLME_AP_STARTED:\n\t\tap_num++;\n\t\tbreak;\n\tcase MLME_AP_STOPPED:\n\tcase MLME_STA_DISCONNECTED:\n\tdefault:\n\t\tbreak;\n\t}\n\n\tif (sync_ch == _TRUE) {\n\t\tif (!rtw_is_chbw_grouped(mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset, u_ch, u_bw, u_offset)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" can't sync %u,%u,%u with %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter)\n\t\t\t\t, mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset, u_ch, u_bw, u_offset);\n\t\t\tgoto apply;\n\t\t}\n\n\t\trtw_sync_chbw(&mlmeext->cur_channel, &mlmeext->cur_bwmode, &mlmeext->cur_ch_offset\n\t\t\t, &u_ch, &u_bw, &u_offset);\n\t} else {\n\t\tu_ch = mlmeext->cur_channel;\n\t\tu_bw = mlmeext->cur_bwmode;\n\t\tu_offset = mlmeext->cur_ch_offset;\n\t}\n\n\tif (ld_sta_num > 0) {\n\t\t/* rely on AP on which STA mode connects */\n\t\tif (rtw_is_dfs_ch(u_ch, u_bw, u_offset))\n\t\t\tld_sta_in_dfs = _TRUE;\n\t\tgoto apply;\n\t}\n\n\tif (lg_sta_num > 0) {\n\t\t/* STA mode is linking */\n\t\tgoto apply;\n\t}\n\n\tif (ap_num == 0) {\n\t\t/* No working AP mode */\n\t\tgoto apply;\n\t}\n\n\tif (rtw_is_dfs_ch(u_ch, u_bw, u_offset))\n\t\tneeded = _TRUE;\n\napply:\n\n\tDBG_871X(FUNC_ADPT_FMT\" needed:%d, self_action:%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), needed, self_action);\n\tDBG_871X(FUNC_ADPT_FMT\" ld_sta_num:%u, lg_sta_num:%u, ap_num:%u, %u,%u,%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), ld_sta_num, lg_sta_num, ap_num, u_ch, u_bw, u_offset);\n\n\tif (needed == _TRUE)\n\t\trtw_dfs_master_enable(adapter, u_ch, u_bw, u_offset);\n\telse\n\t\trtw_dfs_master_disable(adapter, ld_sta_in_dfs);\n}\n#endif /* CONFIG_DFS_MASTER */\n\n#endif /* CONFIG_AP_MODE */\n\n#ifdef CONFIG_BT_COEXIST\nstruct btinfo {\n\tu8 cid;\n\tu8 len;\n\n\tu8 bConnection:1;\n\tu8 bSCOeSCO:1;\n\tu8 bInQPage:1;\n\tu8 bACLBusy:1;\n\tu8 bSCOBusy:1;\n\tu8 bHID:1;\n\tu8 bA2DP:1;\n\tu8 bFTP:1;\n\n\tu8 retry_cnt:4;\n\tu8 rsvd_34:1;\n\tu8 rsvd_35:1;\n\tu8 rsvd_36:1;\n\tu8 rsvd_37:1;\n\n\tu8 rssi;\n\n\tu8 rsvd_50:1;\n\tu8 rsvd_51:1;\n\tu8 rsvd_52:1;\n\tu8 rsvd_53:1;\n\tu8 rsvd_54:1;\n\tu8 rsvd_55:1;\n\tu8 eSCO_SCO:1;\n\tu8 Master_Slave:1;\n\n\tu8 rsvd_6;\n\tu8 rsvd_7;\n};\n\nvoid btinfo_evt_dump(void *sel, void *buf)\n{\n\tstruct btinfo *info = (struct btinfo *)buf;\n\t\n\tDBG_871X_SEL_NL(sel, \"cid:0x%02x, len:%u\\n\", info->cid, info->len);\n\n\tif (info->len > 2)\n\t\tDBG_871X_SEL_NL(sel, \"byte2:%s%s%s%s%s%s%s%s\\n\"\n\t\t\t, info->bConnection?\"bConnection \":\"\"\n\t\t\t, info->bSCOeSCO?\"bSCOeSCO \":\"\"\n\t\t\t, info->bInQPage?\"bInQPage \":\"\"\n\t\t\t, info->bACLBusy?\"bACLBusy \":\"\"\n\t\t\t, info->bSCOBusy?\"bSCOBusy \":\"\"\n\t\t\t, info->bHID?\"bHID \":\"\"\n\t\t\t, info->bA2DP?\"bA2DP \":\"\"\n\t\t\t, info->bFTP?\"bFTP\":\"\"\n\t\t);\n\n\tif (info->len > 3)\n\t\tDBG_871X_SEL_NL(sel, \"retry_cnt:%u\\n\", info->retry_cnt);\n\n\tif (info->len > 4)\n\t\tDBG_871X_SEL_NL(sel, \"rssi:%u\\n\", info->rssi);\n\n\tif (info->len > 5)\n\t\tDBG_871X_SEL_NL(sel, \"byte5:%s%s\\n\"\n\t\t\t, info->eSCO_SCO?\"eSCO_SCO \":\"\"\n\t\t\t, info->Master_Slave?\"Master_Slave \":\"\"\n\t\t);\n}\n\nstatic void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len)\n{\n\t#define BTINFO_WIFI_FETCH 0x23\n\t#define BTINFO_BT_AUTO_RPT 0x27\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tstruct btinfo_8761ATV *info = (struct btinfo_8761ATV *)buf;\n#else //!CONFIG_BT_COEXIST_SOCKET_TRX\n\tstruct btinfo *info = (struct btinfo *)buf;\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\tu8 cmd_idx;\n\tu8 len;\n\n\tcmd_idx = info->cid;\n\n\tif (info->len > buf_len-2) {\n\t\trtw_warn_on(1);\n\t\tlen = buf_len-2;\n\t} else {\n\t\tlen = info->len;\n\t}\n\n//#define DBG_PROC_SET_BTINFO_EVT\n#ifdef DBG_PROC_SET_BTINFO_EVT\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tDBG_871X(\"%s: btinfo[0]=%x,btinfo[1]=%x,btinfo[2]=%x,btinfo[3]=%x btinfo[4]=%x,btinfo[5]=%x,btinfo[6]=%x,btinfo[7]=%x\\n\"\n\t\t\t\t, __func__, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);\n#else//!CONFIG_BT_COEXIST_SOCKET_TRX\n\tbtinfo_evt_dump(RTW_DBGDUMP, info);\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n#endif // DBG_PROC_SET_BTINFO_EVT\n\n\t/* transform BT-FW btinfo to WiFI-FW C2H format and notify */\n\tif (cmd_idx == BTINFO_WIFI_FETCH)\n\t\tbuf[1] = 0;\n\telse if (cmd_idx == BTINFO_BT_AUTO_RPT)\n\t\tbuf[1] = 2;\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\telse if(0x01 == cmd_idx || 0x02 == cmd_idx)\n\t\tbuf[1] = buf[0];\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\trtw_btcoex_BtInfoNotify(adapter ,len+1, &buf[1]);\n}\n\nu8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm;\n\tu8 *btinfo;\n\tstruct cmd_priv *pcmdpriv = &adapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\tif (pdrvextra_cmd_parm == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tbtinfo = rtw_zmalloc(len);\n\tif (btinfo == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\trtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = len;\n\tpdrvextra_cmd_parm->pbuf = btinfo;\n\n\t_rtw_memcpy(btinfo, buf, len);\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\nexit:\n\treturn res;\n}\n#endif //CONFIG_BT_COEXIST\n\n//#ifdef CONFIG_C2H_PACKET_EN\nu8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\tif (pdrvextra_cmd_parm == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = C2H_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size = length;\n\tpdrvextra_cmd_parm->pbuf = pbuf;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\nexit:\n\treturn res;\n}\n\n//#else //CONFIG_C2H_PACKET_EN\n/* dont call R/W in this function, beucase SDIO interrupt have claim host */\n/* or deadlock will happen and cause special-systemserver-died in android */\n\nu8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct drvextra_cmd_parm *pdrvextra_cmd_parm;\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (ph2c == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));\n\tif (pdrvextra_cmd_parm == NULL) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpdrvextra_cmd_parm->ec_id = C2H_WK_CID;\n\tpdrvextra_cmd_parm->type = 0;\n\tpdrvextra_cmd_parm->size =  c2h_evt?16:0;\n\tpdrvextra_cmd_parm->pbuf = c2h_evt;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t\nexit:\n\t\n\treturn res;\n}\n//#endif //CONFIG_C2H_PACKET_EN\n\nu8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void*), void* context)\n{\n\tstruct cmd_priv *pcmdpriv;\n\tstruct cmd_obj *ph2c;\n\tstruct RunInThread_param *parm;\n\ts32 res = _SUCCESS;\n\n_func_enter_;\n\n\tpcmdpriv = &padapter->cmdpriv;\n\n\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (NULL == ph2c) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tparm = (struct RunInThread_param*)rtw_zmalloc(sizeof(struct RunInThread_param));\n\tif (NULL == parm) {\n\t\trtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tparm->func = func;\n\tparm->context = context;\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, parm, GEN_CMD_CODE(_RunInThreadCMD));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\ns32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter)\n{\n\ts32 ret = _FAIL;\n\tu8 buf[16];\n\n\tif (!c2h_evt) {\n\t\t/* No c2h event in cmd_obj, read c2h event before handling*/\n\t\tif (rtw_hal_c2h_evt_read(adapter, buf) == _SUCCESS) {\n\t\t\tc2h_evt = buf;\n\t\t\t\n\t\t\tif (filter && filter(c2h_evt) == _FALSE)\n\t\t\t\tgoto exit;\n\n\t\t\tret = rtw_hal_c2h_handler(adapter, c2h_evt);\n\t\t}\n\t} else {\n\n\t\tif (filter && filter(c2h_evt) == _FALSE)\n\t\t\tgoto exit;\n\n\t\tret = rtw_hal_c2h_handler(adapter, c2h_evt);\n\t}\nexit:\n\treturn ret;\n}\n\n#ifdef CONFIG_C2H_WK\nstatic void c2h_wk_callback(_workitem *work)\n{\n\tstruct evt_priv *evtpriv = container_of(work, struct evt_priv, c2h_wk);\n\t_adapter *adapter = container_of(evtpriv, _adapter, evtpriv);\n\tu8 *c2h_evt;\n\tc2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(adapter);\n\n\tevtpriv->c2h_wk_alive = _TRUE;\n\n\twhile (!rtw_cbuf_empty(evtpriv->c2h_queue)) {\n\t\tif ((c2h_evt = (u8 *)rtw_cbuf_pop(evtpriv->c2h_queue)) != NULL) {\n\t\t\t/* This C2H event is read, clear it */\n\t\t\tc2h_evt_clear(adapter);\n\t\t} else if ((c2h_evt = (u8 *)rtw_malloc(16)) != NULL) {\n\t\t\t/* This C2H event is not read, read & clear now */\n\t\t\tif (rtw_hal_c2h_evt_read(adapter, c2h_evt) != _SUCCESS) {\n\t\t\t\trtw_mfree(c2h_evt, 16);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else {\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Special pointer to trigger c2h_evt_clear only */\n\t\tif ((void *)c2h_evt == (void *)evtpriv)\n\t\t\tcontinue;\n\n\t\tif (!rtw_hal_c2h_valid(adapter, c2h_evt)) {\n\t\t\trtw_mfree(c2h_evt, 16);\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (ccx_id_filter(c2h_evt) == _TRUE) {\n\t\t\t/* Handle CCX report here */\n\t\t\trtw_hal_c2h_handler(adapter, c2h_evt);\n\t\t\trtw_mfree(c2h_evt, 16);\n\t\t} else {\n\t\t\t/* Enqueue into cmd_thread for others */\n\t\t\trtw_c2h_wk_cmd(adapter, c2h_evt);\n\t\t}\n\t}\n\n\tevtpriv->c2h_wk_alive = _FALSE;\n}\n#endif\n\nu8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct drvextra_cmd_parm *pdrvextra_cmd;\n\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tpdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf;\n\t\n\tswitch(pdrvextra_cmd->ec_id)\n\t{\n\t\tcase DYNAMIC_CHK_WK_CID://only  primary padapter go to this cmd, but execute dynamic_chk_wk_hdl() for two interfaces\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\tdynamic_chk_wk_hdl(padapter->pbuddy_adapter);\n\t\t\t}\t\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\tdynamic_chk_wk_hdl(padapter);\n\t\t\tbreak;\n\t\tcase POWER_SAVING_CTRL_WK_CID:\n\t\t\tpower_saving_wk_hdl(padapter);\t\n\t\t\tbreak;\n#ifdef CONFIG_LPS\n\t\tcase LPS_CTRL_WK_CID:\n\t\t\tlps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type);\n\t\t\tbreak;\n\t\tcase DM_IN_LPS_WK_CID:\t\t\t\n\t\t\trtw_dm_in_lps_hdl(padapter);\t\n\t\t\tbreak;\n\t\tcase LPS_CHANGE_DTIM_CID:\n\t\t\trtw_lps_change_dtim_hdl(padapter, (u8)pdrvextra_cmd->type);\n\t\t\tbreak;\n#endif\n#if (RATE_ADAPTIVE_SUPPORT==1)\n\t\tcase RTP_TIMER_CFG_WK_CID:\n\t\t\trpt_timer_setting_wk_hdl(padapter, pdrvextra_cmd->type);\n\t\t\tbreak;\n#endif\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\tcase ANT_SELECT_WK_CID:\n\t\t\tantenna_select_wk_hdl(padapter, pdrvextra_cmd->type);\n\t\t\tbreak;\n#endif\n#ifdef CONFIG_P2P_PS\n\t\tcase P2P_PS_WK_CID:\n\t\t\tp2p_ps_wk_hdl(padapter, pdrvextra_cmd->type);\n\t\t\tbreak;\n#endif //CONFIG_P2P_PS\n#ifdef CONFIG_P2P\n\t\tcase P2P_PROTO_WK_CID:\n\t\t\t//\tCommented by Albert 2011/07/01\n\t\t\t//\tI used the type_size as the type command\n\t\t\tp2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type );\n\t\t\tbreak;\n#endif //CONFIG_P2P\n#ifdef CONFIG_AP_MODE\n\t\tcase CHECK_HIQ_WK_CID:\n\t\t\trtw_chk_hi_queue_hdl(padapter);\n\t\t\tbreak;\n#endif //CONFIG_AP_MODE\n#ifdef CONFIG_INTEL_WIDI\n\t\tcase INTEl_WIDI_WK_CID:\n\t\t\tintel_widi_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf);\n\t\t\tbreak;\n#endif //CONFIG_INTEL_WIDI\n\t\t//add for CONFIG_IEEE80211W, none 11w can use it\n\t\tcase RESET_SECURITYPRIV:\n\t\t\treset_securitypriv_hdl(padapter);\n\t\t\tbreak;\n\t\tcase FREE_ASSOC_RESOURCES:\n\t\t\tfree_assoc_resources_hdl(padapter);\n\t\t\tbreak;\n\t\tcase C2H_WK_CID:\n#ifdef CONFIG_C2H_PACKET_EN\n\t\t\trtw_hal_set_hwreg_with_buf(padapter, HW_VAR_C2H_HANDLE, pdrvextra_cmd->pbuf, pdrvextra_cmd->size);\n#else\t\t\n\t\t\tc2h_evt_hdl(padapter, pdrvextra_cmd->pbuf, NULL);\n#endif\n\t\t\tbreak;\n#ifdef CONFIG_BEAMFORMING\n\t\tcase BEAMFORMING_WK_CID:\n\t\t\tbeamforming_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf);\n\t\t\tbreak;\n#endif /*CONFIG_BEAMFORMING*/\n\t\tcase DM_RA_MSK_WK_CID:\n\t\t\trtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf);\n\t\t\tbreak;\n#ifdef CONFIG_BT_COEXIST\n\t\tcase BTINFO_WK_CID:\n\t\t\trtw_btinfo_hdl(padapter ,pdrvextra_cmd->pbuf, pdrvextra_cmd->size);\n\t\t\tbreak;\n#endif\n#ifdef CONFIG_DFS_MASTER\n\t\tcase DFS_MASTER_WK_CID:\n\t\t\trtw_dfs_master_hdl(padapter);\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tif (pdrvextra_cmd->pbuf && pdrvextra_cmd->size>0)\n\t{\n\t\trtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->size);\n\t}\n\n\treturn H2C_SUCCESS;\n}\n\nvoid rtw_survey_cmd_callback(_adapter*\tpadapter ,  struct cmd_obj *pcmd)\n{\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n_func_enter_;\n\n\tif(pcmd->res == H2C_DROPPED)\n\t{\n\t\t//TODO: cancel timer and do timeout handler directly...\n\t\t//need to make timeout handlerOS independent\n\t\tmlme_set_scan_to_timer(pmlmepriv, 1);\n\t}\n\telse if (pcmd->res != H2C_SUCCESS) {\n\t\tmlme_set_scan_to_timer(pmlmepriv, 1);\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\\n\\n.\"));\n\t} \n\n\t// free cmd\n\trtw_free_cmd_obj(pcmd);\n\n_func_exit_;\t\n}\nvoid rtw_disassoc_cmd_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{\n\t_irqL\tirqL;\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\n_func_enter_;\t\n\n\tif (pcmd->res != H2C_SUCCESS)\n\t{\n\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\tset_fwstate(pmlmepriv, _FW_LINKED);\n\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\t\t\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\n ***Error: disconnect_cmd_callback Fail ***\\n.\"));\n\n\t\tgoto exit;\n\t}\n#ifdef CONFIG_BR_EXT\n\telse //clear bridge database\n\t\tnat25_db_cleanup(padapter);\n#endif //CONFIG_BR_EXT\n\n\t// free cmd\n\trtw_free_cmd_obj(pcmd);\n\t\nexit:\n\t\n_func_exit_;\t\n}\n\n\nvoid rtw_getmacreg_cmdrsp_callback(_adapter *padapter,  struct cmd_obj *pcmd)\n{\n\n_func_enter_;\n\n\trtw_free_cmd_obj(pcmd);\n\n_func_exit_;\n}\n\nvoid rtw_joinbss_cmd_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n_func_enter_;\t\n\n\tif(pcmd->res == H2C_DROPPED)\n\t{\n\t\t//TODO: cancel timer and do timeout handler directly...\n\t\t//need to make timeout handlerOS independent\n\t\t_set_timer(&pmlmepriv->assoc_timer, 1);\n\t}\n\telse if(pcmd->res != H2C_SUCCESS)\n\t{\n\t\t_set_timer(&pmlmepriv->assoc_timer, 1);\n\t}\n\n\trtw_free_cmd_obj(pcmd);\n\t\n_func_exit_;\t\n}\n\nvoid rtw_create_ibss_post_hdl(_adapter *padapter, int status)\n{\t\n\t_irqL irqL;\n\tu8 timer_cancelled;\n\tstruct sta_info *psta = NULL;\n\tstruct wlan_network *pwlan = NULL;\t\t\n\tstruct \tmlme_priv *pmlmepriv = &padapter->mlmepriv;\t\n\tWLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network;\n\tstruct wlan_network *mlme_cur_network = &(pmlmepriv->cur_network);\n\n\tif (status != H2C_SUCCESS)\n\t\t_set_timer(&pmlmepriv->assoc_timer, 1);\n\n\t_cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t{\t\n\t\t_irqL irqL;\n\n\t\tpwlan = _rtw_alloc_network(pmlmepriv);\n\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\tif (pwlan == NULL) {\n\t\t\tpwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue);\n\t\t\tif (pwlan == NULL) {\n\t\t\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, (\"Error:  can't get pwlan in rtw_joinbss_event_callback\\n\"));\n\t\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t\tgoto createbss_cmd_fail;\n\t\t\t}\n\t\t\tpwlan->last_scanned = rtw_get_current_time();\n\t\t} else {\n\t\t\trtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);\n\t\t}\n\n\t\tpdev_network->Length = get_WLAN_BSSID_EX_sz(pdev_network);\n\t\t_rtw_memcpy(&(pwlan->network), pdev_network, pdev_network->Length);\n\t\t//pwlan->fixed = _TRUE;\n\n\t\t/* copy pdev_network information to pmlmepriv->cur_network */\n\t\t_rtw_memcpy(&mlme_cur_network->network, pdev_network, (get_WLAN_BSSID_EX_sz(pdev_network)));\n\n\t\t#if 0\n\t\t/* reset DSConfig */\n\t\tmlme_cur_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pdev_network->Configuration.DSConfig);\n\t\t#endif\n\n\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t/* we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback) */\n\t}\n\ncreatebss_cmd_fail:\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\nexit:\n\treturn;\n}\n\n\n\nvoid rtw_setstaKey_cmdrsp_callback(_adapter*\tpadapter ,  struct cmd_obj *pcmd)\n{\n\t\n\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\tstruct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp);\n\tstruct sta_info*\tpsta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr);\n\n_func_enter_;\t\n\n\tif(psta==NULL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \\n\\n\"));\n\t\tgoto exit;\n\t}\n\t\n\t//psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY)\n\t\nexit:\t\n\n\trtw_free_cmd_obj(pcmd);\n\t\n_func_exit_;\t\n\n}\nvoid rtw_setassocsta_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{\n\t_irqL\tirqL;\n\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\t\n\tstruct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf);\n\tstruct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp);\t\t\n\tstruct sta_info*\tpsta = rtw_get_stainfo(pstapriv, passocsta_parm->addr);\n\n_func_enter_;\t\n\t\n\tif(psta==NULL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \\n\\n\"));\n\t\tgoto exit;\n\t}\n\t\n\tpsta->aid = psta->mac_id = passocsta_rsp->cam_id;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tif ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE))           \t\n\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\n\tset_fwstate(pmlmepriv, _FW_LINKED);\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\nexit:\n\trtw_free_cmd_obj(pcmd);\n\n_func_exit_;\n}\n\nvoid rtw_getrttbl_cmd_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd);\nvoid rtw_getrttbl_cmd_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd)\n{\n_func_enter_;\n\n\trtw_free_cmd_obj(pcmd);\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\tpadapter->mppriv.workparam.bcompleted=_TRUE;\n#endif\n\n_func_exit_;\n\n}\n\n"
  },
  {
    "path": "core/rtw_debug.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_DEBUG_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\nu32 GlobalDebugLevel = _drv_err_;\n\n#ifdef CONFIG_DEBUG_RTL871X\n\n\tu64 GlobalDebugComponents = \\\n\t\t\t_module_rtl871x_xmit_c_ |\n\t\t\t_module_xmit_osdep_c_ |\n\t\t\t_module_rtl871x_recv_c_ |\n\t\t\t_module_recv_osdep_c_ |\n\t\t\t_module_rtl871x_mlme_c_ |\n\t\t\t_module_mlme_osdep_c_ |\n\t\t\t_module_rtl871x_sta_mgt_c_ |\n\t\t\t_module_rtl871x_cmd_c_ |\n\t\t\t_module_cmd_osdep_c_ |\n\t\t\t_module_rtl871x_io_c_ |\n\t\t\t_module_io_osdep_c_ |\n\t\t\t_module_os_intfs_c_|\n\t\t\t_module_rtl871x_security_c_|\n\t\t\t_module_rtl871x_eeprom_c_|\n\t\t\t_module_hal_init_c_|\n\t\t\t_module_hci_hal_init_c_|\n\t\t\t_module_rtl871x_ioctl_c_|\n\t\t\t_module_rtl871x_ioctl_set_c_|\n\t\t\t_module_rtl871x_ioctl_query_c_|\n\t\t\t_module_rtl871x_pwrctrl_c_|\n\t\t\t_module_hci_intfs_c_|\n\t\t\t_module_hci_ops_c_|\n\t\t\t_module_hci_ops_os_c_|\n\t\t\t_module_rtl871x_ioctl_os_c|\n\t\t\t_module_rtl8712_cmd_c_|\n\t\t\t_module_hal_xmit_c_|\n\t\t\t_module_rtl8712_recv_c_ |\n\t\t\t_module_mp_ |\n\t\t\t_module_efuse_;\n\n#endif /* CONFIG_DEBUG_RTL871X */\n\n#include <rtw_version.h>\n\n#ifdef CONFIG_TDLS\n#define TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE\t41\n#endif\n\nvoid dump_drv_version(void *sel)\n{\n\tDBG_871X_SEL_NL(sel, \"%s %s\\n\", DRV_NAME, DRIVERVERSION);\n\t//DBG_871X_SEL_NL(sel, \"build time: %s %s\\n\", __DATE__, __TIME__);\n}\n\nvoid dump_drv_cfg(void *sel)\n{\n\tchar *kernel_version = utsname()->release;\n\t\n\tDBG_871X_SEL_NL(sel, \"\\nKernel Version: %s\\n\", kernel_version);\n\tDBG_871X_SEL_NL(sel, \"Driver Version: %s\\n\", DRIVERVERSION);\n\tDBG_871X_SEL_NL(sel, \"------------------------------------------------\\n\");\n#ifdef CONFIG_IOCTL_CFG80211\n\tDBG_871X_SEL_NL(sel, \"CFG80211\\n\");\n\t#ifdef RTW_USE_CFG80211_STA_EVENT\n\tDBG_871X_SEL_NL(sel, \"RTW_USE_CFG80211_STA_EVENT\\n\");\n\t#endif\n#else\n\tDBG_871X_SEL_NL(sel, \"WEXT\\n\");\n#endif\n\n\tDBG_871X_SEL_NL(sel, \"DBG:%d\\n\", DBG);\n#ifdef CONFIG_DEBUG\n\tDBG_871X_SEL_NL(sel, \"CONFIG_DEBUG\\n\");\n#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tDBG_871X_SEL_NL(sel, \"CONFIG_CONCURRENT_MODE\\n\");\n#endif\n\n#ifdef CONFIG_POWER_SAVING\n\tDBG_871X_SEL_NL(sel, \"CONFIG_POWER_SAVING\\n\");\n#endif\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tDBG_871X_SEL_NL(sel, \"LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\\n\", REALTEK_CONFIG_PATH);\n\t#ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n\tDBG_871X_SEL_NL(sel, \"CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\\n\");\n\t#endif\n\t#ifdef CONFIG_CALIBRATE_TX_POWER_TO_MAX\n\tDBG_871X_SEL_NL(sel, \"CONFIG_CALIBRATE_TX_POWER_TO_MAX\\n\");\n\t#endif\n#endif\n\n#ifdef CONFIG_DISABLE_ODM\n\tDBG_871X_SEL_NL(sel, \"CONFIG_DISABLE_ODM\\n\");\n#endif\n\n#ifdef CONFIG_MINIMAL_MEMORY_USAGE\n\tDBG_871X_SEL_NL(sel, \"CONFIG_MINIMAL_MEMORY_USAGE\\n\");\n#endif\n\n\tDBG_871X_SEL_NL(sel, \"CONFIG_RTW_ADAPTIVITY_EN = %d\\n\", CONFIG_RTW_ADAPTIVITY_EN);\n#if (CONFIG_RTW_ADAPTIVITY_EN)\n\tDBG_871X_SEL_NL(sel, \"ADAPTIVITY_MODE = %s\\n\", (CONFIG_RTW_ADAPTIVITY_MODE) ? \"carrier_sense\" : \"normal\");\n#endif\n\n#ifdef CONFIG_WOWLAN\n\tDBG_871X_SEL_NL(sel, \"CONFIG_WOWLAN - \");\n\n\t#ifdef CONFIG_GPIO_WAKEUP\n\tDBG_871X_SEL_NL(sel, \"CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\\n\", WAKEUP_GPIO_IDX);\n\t#endif\n#endif\n\n#ifdef CONFIG_TDLS\n\tDBG_871X_SEL_NL(sel, \"CONFIG_TDLS\\n\");\n#endif\n\n#ifdef CONFIG_USB_HCI\n\t#ifdef CONFIG_SUPPORT_USB_INT\t\n\tDBG_871X_SEL_NL(sel, \"CONFIG_SUPPORT_USB_INT\\n\");\n\t#endif\n\t#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\t\t\n\tDBG_871X_SEL_NL(sel, \"CONFIG_USB_INTERRUPT_IN_PIPE\\n\");\n\t#endif\n\t#ifdef CONFIG_USB_TX_AGGREGATION\n\tDBG_871X_SEL_NL(sel, \"CONFIG_USB_TX_AGGREGATION\\n\");\n\t#endif\n\t#ifdef CONFIG_USB_RX_AGGREGATION\n\tDBG_871X_SEL_NL(sel, \"CONFIG_USB_RX_AGGREGATION\\n\");\n\t#endif\n\t#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\tDBG_871X_SEL_NL(sel, \"CONFIG_USE_USB_BUFFER_ALLOC_TX\\n\");\n\t#endif\n\t#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\tDBG_871X_SEL_NL(sel, \"CONFIG_USE_USB_BUFFER_ALLOC_RX\\n\");\n\t#endif\t\n\t#ifdef CONFIG_PREALLOC_RECV_SKB\n\tDBG_871X_SEL_NL(sel, \"CONFIG_PREALLOC_RECV_SKB\\n\");\n\t#endif\n\t#ifdef CONFIG_FIX_NR_BULKIN_BUFFER\n\tDBG_871X_SEL_NL(sel, \"CONFIG_FIX_NR_BULKIN_BUFFER\\n\");\n\t#endif\n#endif /*CONFIG_USB_HCI*/\n\t\n#ifdef CONFIG_SDIO_HCI\n\t#ifdef CONFIG_TX_AGGREGATION\n\tDBG_871X_SEL_NL(sel, \"CONFIG_TX_AGGREGATION\\n\");\n\t#endif\n\t#ifdef CONFIG_RX_AGGREGATION\n\tDBG_871X_SEL_NL(sel, \"CONFIG_RX_AGGREGATION\\n\");\n\t#endif\n#endif /*CONFIG_SDIO_HCI*/\n\n#ifdef CONFIG_PCI_HCI\n#endif\n\t\n\tDBG_871X_SEL_NL(sel, \"MAX_XMITBUF_SZ = %d\\n\", MAX_XMITBUF_SZ);\n\tDBG_871X_SEL_NL(sel, \"MAX_RECVBUF_SZ = %d\\n\", MAX_RECVBUF_SZ);\n\t\n}\n\nvoid dump_log_level(void *sel)\n{\n\tDBG_871X_SEL_NL(sel, \"log_level:%d\\n\", GlobalDebugLevel);\n}\n\n#ifdef CONFIG_SDIO_HCI\nvoid sd_f0_reg_dump(void *sel, _adapter *adapter)\n{\n\tint i;\n\n\tfor(i=0x0;i<=0xff;i++)\n\t{\t\n\t\tif(i%16==0)\n\t\t\tDBG_871X_SEL_NL(sel, \"0x%02x \",i);\n\n\t\tDBG_871X_SEL(sel, \"%02x \", rtw_sd_f0_read8(adapter, i));\n\n\t\tif(i%16==15)\n\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t\telse if(i%8==7)\n\t\t\tDBG_871X_SEL(sel, \"\\t\");\n\t}\n}\n\nvoid sdio_local_reg_dump(void *sel, _adapter *adapter)\n{\n\tint i, j = 1;\n\n\tfor (i = 0x0; i < 0x100; i += 4) {\n\t\tif (j % 4 == 1)\n\t\t\tDBG_871X_SEL_NL(sel, \"0x%02x\", i);\n\t\tDBG_871X_SEL(sel, \" 0x%08x \", rtw_read32(adapter, (0x1025 << 16) | i));\n\t\tif ((j++) % 4 == 0)\n\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t}\n}\n#endif /* CONFIG_SDIO_HCI */\n\nvoid mac_reg_dump(void *sel, _adapter *adapter)\n{\n\tint i, j = 1;\n\n\tDBG_871X_SEL_NL(sel, \"======= MAC REG =======\\n\");\n\n\tfor(i=0x0;i<0x800;i+=4)\n\t{\n\t\tif(j%4==1)\n\t\t\tDBG_871X_SEL_NL(sel, \"0x%03x\",i);\n\t\tDBG_871X_SEL(sel, \" 0x%08x \", rtw_read32(adapter,i));\n\t\tif((j++)%4 == 0)\n\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t}\n\t\n#ifdef CONFIG_RTL8814A\n\t{\n\t\tfor(i=0x1000;i<0x1650;i+=4)\n\t\t{\n\t\t\tif(j%4==1)\n\t\t\t\tDBG_871X_SEL_NL(sel, \"0x%03x\",i);\n\t\t\tDBG_871X_SEL(sel, \" 0x%08x \", rtw_read32(adapter,i));\n\t\t\tif((j++)%4 == 0)\n\t\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t\t}\n\t}\n#endif /* CONFIG_RTL8814A */\n}\n\nvoid bb_reg_dump(void *sel, _adapter *adapter)\n{\n\tint i, j = 1;\n\n\tDBG_871X_SEL_NL(sel, \"======= BB REG =======\\n\");\n\tfor(i=0x800;i<0x1000;i+=4)\n\t{\n\t\tif(j%4==1)\n\t\t\tDBG_871X_SEL_NL(sel, \"0x%03x\",i);\n\t\tDBG_871X_SEL(sel, \" 0x%08x \", rtw_read32(adapter,i));\n\t\tif((j++)%4 == 0)\n\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t}\n}\n\nvoid rf_reg_dump(void *sel, _adapter *adapter)\n{\n\tint i, j = 1, path;\n\tu32 value;\n\tu8 rf_type = 0;\n\tu8 path_nums = 0;\n\n\trtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\tif((RF_1T2R == rf_type) ||(RF_1T1R ==rf_type ))\n\t\tpath_nums = 1;\n\telse\n\t\tpath_nums = 2;\n\n\tDBG_871X_SEL_NL(sel, \"======= RF REG =======\\n\");\n\n\tfor (path=0;path<path_nums;path++) {\n\t\tDBG_871X_SEL_NL(sel, \"RF_Path(%x)\\n\",path);\n\t\tfor (i=0;i<0x100;i++) {\n\t\t\tvalue = rtw_hal_read_rfreg(adapter, path, i, 0xffffffff);\n\t\t\tif(j%4==1)\n\t\t\t\tDBG_871X_SEL_NL(sel, \"0x%02x \",i);\n\t\t\tDBG_871X_SEL(sel, \" 0x%08x \",value);\n\t\t\tif((j++)%4==0)\n\t\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t\t}\n\t}\n}\n\nstatic u8 fwdl_test_chksum_fail = 0;\nstatic u8 fwdl_test_wintint_rdy_fail = 0;\n\nbool rtw_fwdl_test_trigger_chksum_fail(void)\n{\n\tif (fwdl_test_chksum_fail) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"fwdl test case: trigger chksum_fail\\n\");\n\t\tfwdl_test_chksum_fail--;\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\nbool rtw_fwdl_test_trigger_wintint_rdy_fail(void)\n{\n\tif (fwdl_test_wintint_rdy_fail) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"fwdl test case: trigger wintint_rdy_fail\\n\");\n\t\tfwdl_test_wintint_rdy_fail--;\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\nstatic u32 g_wait_hiq_empty_ms = 0;\n\nu32 rtw_get_wait_hiq_empty_ms(void)\n{\n\treturn g_wait_hiq_empty_ms;\n}\n\nstatic u8 del_rx_ampdu_test_no_tx_fail = 0;\n\nbool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void)\n{\n\tif (del_rx_ampdu_test_no_tx_fail) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"del_rx_ampdu test case: trigger no_tx_fail\\n\");\n\t\tdel_rx_ampdu_test_no_tx_fail--;\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\nvoid rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt)\n{\n\tstruct recv_priv *precvpriv = &(adapter->recvpriv);\n\tif( precvpriv->sink_udpport > 0)\n\t{\n\t\tif(*((u16*)((pkt->data)+0x24)) == cpu_to_be16(precvpriv->sink_udpport))\n\t\t{\n\t\t\tprecvpriv->pre_rtp_rxseq= precvpriv->cur_rtp_rxseq;\n\t\t\tprecvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16*)((pkt->data)+0x2C)));\n\t\t\tif( precvpriv->pre_rtp_rxseq+1 != precvpriv->cur_rtp_rxseq)\n\t\t\t\tDBG_871X(\"%s : RTP Seq num from %d to %d\\n\",__FUNCTION__,precvpriv->pre_rtp_rxseq,precvpriv->cur_rtp_rxseq);\n\t\t}\n\t}\n}\n\nvoid sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta)\n{\n\tstruct recv_reorder_ctrl *reorder_ctl;\n\tint i;\n\n\tfor (i = 0; i < 16; i++) {\n\t\treorder_ctl = &sta->recvreorder_ctrl[i];\n\t\tif (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID || reorder_ctl->indicate_seq != 0xFFFF) {\n\t\t\tDBG_871X_SEL_NL(sel, \"tid=%d, enable=%d, ampdu_size=%u, indicate_seq=%u\\n\"\n\t\t\t\t, i, reorder_ctl->enable, reorder_ctl->ampdu_size, reorder_ctl->indicate_seq\n\t\t\t);\n\t\t}\n\t}\n}\n\nvoid dump_adapters_status(void *sel, struct dvobj_priv *dvobj)\n{\n\tstruct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);\n\tint i;\n\t_adapter *iface;\n\tu8 u_ch, u_bw, u_offset;\n\n\tDBG_871X_SEL_NL(sel, \"%-2s %-8s %-17s %-4s %-7s %s\\n\"\n\t\t, \"id\", \"ifname\", \"macaddr\", \"port\", \"ch\", \"status\");\n\n\tDBG_871X_SEL_NL(sel, \"------------------------------------------\\n\");\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tiface = dvobj->padapters[i];\n\t\tif (iface) {\n\t\t\tDBG_871X_SEL_NL(sel, \"%2d %-8s \"MAC_FMT\" %4hhu %3u,%u,%u \"MLME_STATE_FMT\" %s%s\\n\"\n\t\t\t\t, i, ADPT_ARG(iface)\n\t\t\t\t, MAC_ARG(adapter_mac_addr(iface))\n\t\t\t\t, get_iface_type(iface)\n\t\t\t\t, iface->mlmeextpriv.cur_channel\n\t\t\t\t, iface->mlmeextpriv.cur_bwmode\n\t\t\t\t, iface->mlmeextpriv.cur_ch_offset\n\t\t\t\t, ADPT_MLME_S_ARG(iface)\n\t\t\t\t, rtw_is_surprise_removed(iface)?\" SR\":\"\"\n\t\t\t\t, rtw_is_drv_stopped(iface)?\" DS\":\"\"\n\t\t\t);\n\t\t}\n\t}\n\n\tDBG_871X_SEL_NL(sel, \"------------------------------------------\\n\");\n\n\trtw_get_ch_setting_union(dvobj->padapters[IFACE_ID0], &u_ch, &u_bw, &u_offset);\n\tDBG_871X_SEL_NL(sel, \"%34s %3u,%u,%u\\n\"\n\t\t, \"union:\"\n\t\t, u_ch, u_bw, u_offset\n\t);\n\n\tDBG_871X_SEL_NL(sel, \"%34s %3u,%u,%u\\n\"\n\t\t, \"oper:\"\n\t\t, dvobj->oper_channel\n\t\t, dvobj->oper_bwmode\n\t\t, dvobj->oper_ch_offset\n\t);\n\n\t#ifdef CONFIG_DFS_MASTER\n\tif (rfctl->radar_detect_ch != 0) {\n\t\tDBG_871X_SEL_NL(sel, \"%34s %3u,%u,%u\"\n\t\t\t, \"radar_detect:\"\n\t\t\t, rfctl->radar_detect_ch\n\t\t\t, rfctl->radar_detect_bw\n\t\t\t, rfctl->radar_detect_offset\n\t\t);\n\n\t\tif (IS_UNDER_CAC(rfctl))\n\t\t\tDBG_871X_SEL(sel, \", cac:%d\\n\", rtw_systime_to_ms(rfctl->cac_end_time - rtw_get_current_time()));\n\t\telse\n\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\t}\n\t#endif\n}\n\n#define SEC_CAM_ENT_ID_TITLE_FMT \"%-2s\"\n#define SEC_CAM_ENT_ID_TITLE_ARG \"id\"\n#define SEC_CAM_ENT_ID_VALUE_FMT \"%2u\"\n#define SEC_CAM_ENT_ID_VALUE_ARG(id) (id)\n\n#define SEC_CAM_ENT_TITLE_FMT \"%-6s %-17s %-32s %-3s %-7s %-2s %-2s %-5s\"\n#define SEC_CAM_ENT_TITLE_ARG \"ctrl\", \"addr\", \"key\", \"kid\", \"type\", \"MK\", \"GK\", \"valid\"\n#define SEC_CAM_ENT_VALUE_FMT \"0x%04x \"MAC_FMT\" \"KEY_FMT\" %3u %-7s %2u %2u %5u\"\n#define SEC_CAM_ENT_VALUE_ARG(ent) \\\n\t(ent)->ctrl \\\n\t, MAC_ARG((ent)->mac) \\\n\t, KEY_ARG((ent)->key) \\\n\t, ((ent)->ctrl) & 0x03 \\\n\t, security_type_str((((ent)->ctrl) >> 2) & 0x07) \\\n\t, (((ent)->ctrl) >> 5) & 0x01 \\\n\t, (((ent)->ctrl) >> 6) & 0x01 \\\n\t, (((ent)->ctrl) >> 15) & 0x01\n\nvoid dump_sec_cam_ent(void *sel, struct sec_cam_ent *ent, int id)\n{\n\tif (id >= 0) {\n\t\tDBG_871X_SEL_NL(sel, SEC_CAM_ENT_ID_VALUE_FMT \" \" SEC_CAM_ENT_VALUE_FMT\"\\n\"\n\t\t\t, SEC_CAM_ENT_ID_VALUE_ARG(id), SEC_CAM_ENT_VALUE_ARG(ent));\n\t} else {\n\t\tDBG_871X_SEL_NL(sel, SEC_CAM_ENT_VALUE_FMT\"\\n\", SEC_CAM_ENT_VALUE_ARG(ent));\n\t}\n}\n\nvoid dump_sec_cam_ent_title(void *sel, u8 has_id)\n{\n\tif (has_id) {\n\t\tDBG_871X_SEL_NL(sel, SEC_CAM_ENT_ID_TITLE_FMT \" \" SEC_CAM_ENT_TITLE_FMT\"\\n\"\n\t\t\t, SEC_CAM_ENT_ID_TITLE_ARG, SEC_CAM_ENT_TITLE_ARG);\n\t} else {\n\t\tDBG_871X_SEL_NL(sel, SEC_CAM_ENT_TITLE_FMT\"\\n\", SEC_CAM_ENT_TITLE_ARG);\n\t}\n}\n\nvoid dump_sec_cam(void *sel, _adapter *adapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\tstruct sec_cam_ent ent;\n\tint i;\n\n\tDBG_871X_SEL_NL(sel, \"HW sec cam:\\n\");\n\tdump_sec_cam_ent_title(sel, 1);\n\tfor (i = 0; i < cam_ctl->num; i++) {\n\t\trtw_sec_read_cam_ent(adapter, i, (u8 *)(&ent.ctrl), ent.mac, ent.key);\n\t\tdump_sec_cam_ent(sel , &ent, i);\n\t}\n}\n\n#ifdef CONFIG_PROC_DEBUG\nssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 addr, val, len;\n\n\tif (count < 3)\n\t{\n\t\tDBG_871X(\"argument size is less than 3\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x %x %x\", &addr, &val, &len);\n\n\t\tif (num !=  3) {\n\t\t\tDBG_871X(\"invalid write_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\n\t\tswitch(len)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\trtw_write8(padapter, addr, (u8)val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\trtw_write16(padapter, addr, (u16)val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\trtw_write32(padapter, addr, val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"error write length=%d\", len);\n\t\t\t\tbreak;\n\t\t}\t\t\t\n\t\t\n\t}\n\t\n\treturn count;\n\t\n}\n\nstatic u32 proc_get_read_addr=0xeeeeeeee;\nstatic u32 proc_get_read_len=0x4;\n\nint proc_get_read_reg(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tif (proc_get_read_addr==0xeeeeeeee) {\n\t\tDBG_871X_SEL_NL(m, \"address not initialized\\n\");\n\t\treturn 0;\n\t}\t\n\n\tswitch(proc_get_read_len)\n\t{\n\t\tcase 1:\t\t\t\n\t\t\tDBG_871X_SEL_NL(m, \"rtw_read8(0x%x)=0x%x\\n\", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tDBG_871X_SEL_NL(m, \"rtw_read16(0x%x)=0x%x\\n\", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tDBG_871X_SEL_NL(m, \"rtw_read32(0x%x)=0x%x\\n\", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X_SEL_NL(m, \"error read length=%d\\n\", proc_get_read_len);\n\t\t\tbreak;\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\tchar tmp[16];\n\tu32 addr, len;\n\n\tif (count < 2)\n\t{\n\t\tDBG_871X(\"argument size is less than 2\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x %x\", &addr, &len);\n\n\t\tif (num !=  2) {\n\t\t\tDBG_871X(\"invalid read_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\n\t\tproc_get_read_addr = addr;\n\t\t\n\t\tproc_get_read_len = len;\n\t}\n\t\n\treturn count;\n\n}\n\nint proc_get_fwstate(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tDBG_871X_SEL_NL(m, \"fwstate=0x%x\\n\", get_fwstate(pmlmepriv));\n\n\treturn 0;\n}\n\nint proc_get_sec_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct security_priv *sec = &padapter->securitypriv;\n\n\tDBG_871X_SEL_NL(m, \"auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\\n\", \n\t\t\t\t\t\tsec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,\n\t\t\t\t\t\tsec->ndisauthtype, sec->ndisencryptstatus);\n\n\tDBG_871X_SEL_NL(m, \"hw_decrypted=%d\\n\", sec->hw_decrypted);\n\n#ifdef DBG_SW_SEC_CNT\n\tDBG_871X_SEL_NL(m, \"wep_sw_enc_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);\n\tDBG_871X_SEL_NL(m, \"wep_sw_dec_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);\n\n\tDBG_871X_SEL_NL(m, \"tkip_sw_enc_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);\t\n\tDBG_871X_SEL_NL(m, \"tkip_sw_dec_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);\n\n\tDBG_871X_SEL_NL(m, \"aes_sw_enc_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);\n\tDBG_871X_SEL_NL(m, \"aes_sw_dec_cnt=%llu, %llu, %llu\\n\"\n\t\t, sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);\n#endif /* DBG_SW_SEC_CNT */\n\n\treturn 0;\n}\n\nint proc_get_mlmext_state(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tDBG_871X_SEL_NL(m, \"pmlmeinfo->state=0x%x\\n\", pmlmeinfo->state);\n\n\treturn 0;\n}\n\n#ifdef CONFIG_LAYER2_ROAMING\nint proc_get_roam_flags(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X_SEL_NL(m, \"0x%02x\\n\", rtw_roam_flags(adapter));\n\n\treturn 0;\n}\n\nssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tchar tmp[32];\n\tu8 flags;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &flags);\n\n\t\tif (num == 1)\n\t\t\trtw_assign_roam_flags(adapter, flags);\n\t}\n\t\n\treturn count;\n\t\n}\n\nint proc_get_roam_param(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\n\tDBG_871X_SEL_NL(m, \"%12s %12s %11s\\n\", \"rssi_diff_th\", \"scanr_exp_ms\", \"scan_int_ms\");\n\tDBG_871X_SEL_NL(m, \"%-12u %-12u %-11u\\n\"\n\t\t, mlme->roam_rssi_diff_th\n\t\t, mlme->roam_scanr_exp_ms\n\t\t, mlme->roam_scan_int_ms\n\t);\n\n\treturn 0;\n}\n\nssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\n\tchar tmp[32];\n\tu8 rssi_diff_th;\n\tu32 scanr_exp_ms;\n\tu32 scan_int_ms;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu %u %u\", &rssi_diff_th, &scanr_exp_ms, &scan_int_ms);\n\n\t\tif (num >= 1)\n\t\t\tmlme->roam_rssi_diff_th = rssi_diff_th;\n\t\tif (num >= 2)\n\t\t\tmlme->roam_scanr_exp_ms = scanr_exp_ms;\n\t\tif (num >= 3)\n\t\t\tmlme->roam_scan_int_ms = scan_int_ms;\n\t}\n\t\n\treturn count;\n\t\n}\n\nssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tchar tmp[32];\n\tu8 addr[ETH_ALEN];\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\", addr, addr+1, addr+2, addr+3, addr+4, addr+5);\n\t\tif (num == 6)\n\t\t\t_rtw_memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN);\n\n\t\tDBG_871X(\"set roam_tgt_addr to \"MAC_FMT\"\\n\", MAC_ARG(adapter->mlmepriv.roam_tgt_addr));\n\t}\n\n\treturn count;\n}\n#endif /* CONFIG_LAYER2_ROAMING */\n\nint proc_get_qos_option(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tDBG_871X_SEL_NL(m, \"qos_option=%d\\n\", pmlmepriv->qospriv.qos_option);\n\n\treturn 0;\n}\n\nint proc_get_ht_option(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\n#ifdef CONFIG_80211N_HT\n\tDBG_871X_SEL_NL(m, \"ht_option=%d\\n\", pmlmepriv->htpriv.ht_option);\n#endif //CONFIG_80211N_HT\n\n\treturn 0;\n}\n\nint proc_get_rf_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\t\n\n\tDBG_871X_SEL_NL(m, \"cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\\n\", \n\t\t\t\t\tpmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);\n\t\n\tDBG_871X_SEL_NL(m, \"oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\\n\", \n\t\t\t\t\trtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter),  rtw_get_oper_choffset(padapter));\n\n\treturn 0;\n}\n\nint proc_get_scan_param(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tstruct ss_res *ss = &mlmeext->sitesurvey_res;\n\n#define SCAN_PARAM_TITLE_FMT \"%10s\"\n#define SCAN_PARAM_VALUE_FMT \"%-10u\"\n#define SCAN_PARAM_TITLE_ARG , \"scan_ch_ms\"\n#define SCAN_PARAM_VALUE_ARG , ss->scan_ch_ms\n#ifdef CONFIG_80211N_HT\n\t#define SCAN_PARAM_TITLE_FMT_HT \" %15s %13s\"\n\t#define SCAN_PARAM_VALUE_FMT_HT \" %-15u %-13u\"\n\t#define SCAN_PARAM_TITLE_ARG_HT , \"rx_ampdu_accept\", \"rx_ampdu_size\"\n\t#define SCAN_PARAM_VALUE_ARG_HT , ss->rx_ampdu_accept, ss->rx_ampdu_size\n#else\n\t#define SCAN_PARAM_TITLE_FMT_HT \"\"\n\t#define SCAN_PARAM_VALUE_FMT_HT \"\"\n\t#define SCAN_PARAM_TITLE_ARG_HT\n\t#define SCAN_PARAM_VALUE_ARG_HT\n#endif\n#ifdef CONFIG_SCAN_BACKOP\n\t#define SCAN_PARAM_TITLE_FMT_BACKOP \" %9s %12s\"\n\t#define SCAN_PARAM_VALUE_FMT_BACKOP \" %-9u %-12u\"\n\t#define SCAN_PARAM_TITLE_ARG_BACKOP , \"backop_ms\", \"scan_cnt_max\"\n\t#define SCAN_PARAM_VALUE_ARG_BACKOP , ss->backop_ms, ss->scan_cnt_max\n#else\n\t#define SCAN_PARAM_TITLE_FMT_BACKOP \"\"\n\t#define SCAN_PARAM_VALUE_FMT_BACKOP \"\"\n\t#define SCAN_PARAM_TITLE_ARG_BACKOP\n\t#define SCAN_PARAM_VALUE_ARG_BACKOP\n#endif\n\n\tDBG_871X_SEL_NL(m,\n\t\tSCAN_PARAM_TITLE_FMT\n\t\tSCAN_PARAM_TITLE_FMT_HT\n\t\tSCAN_PARAM_TITLE_FMT_BACKOP\n\t\t\"\\n\"\n\t\tSCAN_PARAM_TITLE_ARG\n\t\tSCAN_PARAM_TITLE_ARG_HT\n\t\tSCAN_PARAM_TITLE_ARG_BACKOP\n\t);\n\n\tDBG_871X_SEL_NL(m,\n\t\tSCAN_PARAM_VALUE_FMT\n\t\tSCAN_PARAM_VALUE_FMT_HT\n\t\tSCAN_PARAM_VALUE_FMT_BACKOP\n\t\t\"\\n\"\n\t\tSCAN_PARAM_VALUE_ARG\n\t\tSCAN_PARAM_VALUE_ARG_HT\n\t\tSCAN_PARAM_VALUE_ARG_BACKOP\n\t);\n\n\treturn 0;\n}\n\nssize_t proc_set_scan_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tstruct ss_res *ss = &mlmeext->sitesurvey_res;\n\n\tchar tmp[32] = {0};\n\nu16 scan_ch_ms;\n#define SCAN_PARAM_INPUT_FMT \"%hu\"\n#define SCAN_PARAM_INPUT_ARG , &scan_ch_ms\n#ifdef CONFIG_80211N_HT\n\tu8 rx_ampdu_accept;\n\tu8 rx_ampdu_size;\n\t#define SCAN_PARAM_INPUT_FMT_HT \" %hhu %hhu\"\n\t#define SCAN_PARAM_INPUT_ARG_HT , &rx_ampdu_accept, &rx_ampdu_size\n#else\n\t#define SCAN_PARAM_INPUT_FMT_HT \"\"\n\t#define SCAN_PARAM_INPUT_ARG_HT\n#endif\n#ifdef CONFIG_SCAN_BACKOP\n\tu16 backop_ms;\n\tu8 scan_cnt_max;\n\t#define SCAN_PARAM_INPUT_FMT_BACKOP \" %hu %hhu\"\n\t#define SCAN_PARAM_INPUT_ARG_BACKOP , &backop_ms, &scan_cnt_max\n#else\n\t#define SCAN_PARAM_INPUT_FMT_BACKOP \"\"\n\t#define SCAN_PARAM_INPUT_ARG_BACKOP\n#endif\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp,\n\t\t\tSCAN_PARAM_INPUT_FMT\n\t\t\tSCAN_PARAM_INPUT_FMT_HT\n\t\t\tSCAN_PARAM_INPUT_FMT_BACKOP\n\t\t\tSCAN_PARAM_INPUT_ARG\n\t\t\tSCAN_PARAM_INPUT_ARG_HT\n\t\t\tSCAN_PARAM_INPUT_ARG_BACKOP\n\t\t);\n\n\t\tif (num-- > 0)\n\t\t\tss->scan_ch_ms = scan_ch_ms;\n\t\t#ifdef CONFIG_80211N_HT\n\t\tif (num-- > 0)\n\t\t\tss->rx_ampdu_accept = rx_ampdu_accept;\n\t\tif (num-- > 0)\n\t\t\tss->rx_ampdu_size = rx_ampdu_size;\n\t\t#endif\n\t\t#ifdef CONFIG_SCAN_BACKOP\n\t\tif (num-- > 0)\n\t\t\tss->backop_ms = backop_ms;\n\t\tif (num-- > 0)\n\t\t\tss->scan_cnt_max = scan_cnt_max;\n\t\t#endif\n\t}\n\t\n\treturn count;\t\n}\n\nint proc_get_scan_abort(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tu32 pass_ms;\n\n\tpass_ms = rtw_scan_abort_timeout(adapter, 10000);\n\n\tDBG_871X_SEL_NL(m, \"%u\\n\", pass_ms);\n\n\treturn 0;\n}\n\n#ifdef CONFIG_SCAN_BACKOP\nint proc_get_backop_flags_sta(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\n\tDBG_871X_SEL_NL(m, \"0x%02x\\n\", mlmeext_scan_backop_flags_sta(mlmeext));\n\n\treturn 0;\n}\n\nssize_t proc_set_backop_flags_sta(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\n\tchar tmp[32];\n\tu8 flags;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &flags);\n\n\t\tif (num == 1)\n\t\t\tmlmeext_assign_scan_backop_flags_sta(mlmeext, flags);\n\t}\n\t\n\treturn count;\n}\n\nint proc_get_backop_flags_ap(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\n\tDBG_871X_SEL_NL(m, \"0x%02x\\n\", mlmeext_scan_backop_flags_ap(mlmeext));\n\n\treturn 0;\n}\n\nssize_t proc_set_backop_flags_ap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\n\tchar tmp[32];\n\tu8 flags;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &flags);\n\n\t\tif (num == 1)\n\t\t\tmlmeext_assign_scan_backop_flags_ap(mlmeext, flags);\n\t}\n\t\n\treturn count;\n}\n\n#endif /* CONFIG_SCAN_BACKOP */\n\nint proc_get_survey_info(struct seq_file *m, void *v)\n{\n\t_irqL irqL;\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct wlan_network\t*pnetwork = NULL;\n\t_list\t*plist, *phead;\n\ts32 notify_signal;\n\ts16 notify_noise = 0;\n\tu16  index = 0, ie_cap = 0;\n\tunsigned char *ie_wpa = NULL, *ie_wpa2 = NULL, *ie_wps = NULL;\n\tunsigned char *ie_p2p = NULL, *ssid = NULL;\n\tchar flag_str[64];\n\tint ielen = 0;\n\tu32 wpsielen = 0;\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\t\n\tphead = get_list_head(queue);\n\tif(!phead)\n\t\treturn 0;\n\tplist = get_next(phead);\n\tif (!plist)\n\t\treturn 0;\n\n\tDBG_871X_SEL_NL(m, \"%5s  %-17s  %3s  %-3s  %-4s  %-4s  %5s  %32s  %32s\\n\", \"index\", \"bssid\", \"ch\", \"RSSI\", \"SdBm\", \"Noise\", \"age\", \"flag\", \"ssid\");\n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n                if (!pnetwork)\n\t\t\tbreak;\n\t\n\t\tif ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&\n\t\t\tis_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {\n\t\t\tnotify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm\n\t\t} else {\n\t\t\tnotify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm\n\t\t}\n\n\t\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t\trtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));\n\t\t#endif\n\t\n\t\tie_wpa = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength-12);\t\n\t\tie_wpa2 = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength-12);\n\t\tie_cap = rtw_get_capability(&pnetwork->network);\n\t\tie_wps = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength-12, NULL, &wpsielen);\n\t\tie_p2p = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength-12, NULL, &ielen);\n\t\tssid = pnetwork->network.Ssid.Ssid;\n\t\tsprintf(flag_str, \"%s%s%s%s%s%s%s\",\n\t\t\t\t\t(ie_wpa) ? \"[WPA]\":\"\",\n\t\t\t\t\t(ie_wpa2) ? \"[WPA2]\":\"\",\n\t\t\t\t\t(!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? \"[WEP]\":\"\",\n\t\t\t\t\t(ie_wps) ? \"[WPS]\":\"\",\n\t\t\t\t\t(pnetwork->network.InfrastructureMode == Ndis802_11IBSS) ? \"[IBSS]\":\"\",\n\t\t\t\t\t(ie_cap & BIT(0)) ? \"[ESS]\":\"\",\n\t\t\t\t\t(ie_p2p) ? \"[P2P]\":\"\");\n\t\tDBG_871X_SEL_NL(m, \"%5d  \"MAC_FMT\"  %3d  %3d  %4d  %4d    %5d  %32s  %32s\\n\", \n\t\t\t++index,\n\t\t\tMAC_ARG(pnetwork->network.MacAddress), \n\t\t\tpnetwork->network.Configuration.DSConfig,\n\t\t\t(int)pnetwork->network.Rssi,\n\t\t\tnotify_signal,\n\t\t\tnotify_noise,\n\t\t\trtw_get_passing_time_ms((u32)pnetwork->last_scanned),\n\t\t\tflag_str,\n\t\t\tpnetwork->network.Ssid.Ssid);\n\t\tplist = get_next(plist);\n\t}\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\treturn 0;\n}\n\nssize_t proc_set_survey_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\t_irqL irqL;\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tbool need_indicate_scan_done = _FALSE;\n\tu8 _status = _FALSE;\n\tNDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n#ifdef CONFIG_MP_INCLUDED\n\t\tif ((padapter->registrypriv.mp_mode == 1)\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| ((padapter->pbuddy_adapter) && (padapter->pbuddy_adapter->registrypriv.mp_mode == 1))\n#endif\t\t\t\n\t\t){\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block Scan request\\n\", FUNC_ADPT_ARG(padapter));\t\n\t\t\tgoto exit;\n\t\t}\n#endif\n\trtw_ps_deny(padapter, PS_DENY_SCAN);\n\tif (_FAIL == rtw_pwr_wakeup(padapter))\n\t\tgoto exit;\n\n\tif (rtw_is_drv_stopped(padapter)) {\n\t\tDBG_871X(\"scan abort!! bDriverStopped=_TRUE\\n\");\n\t\tgoto exit;\n\t}\n\t\n\tif (!padapter->bup) {\n\t\tDBG_871X(\"scan abort!! bup=%d\\n\", padapter->bup);\n\t\tgoto exit;\n\t}\n\t\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tDBG_871X(\"scan abort!! hw_init_completed=FALSE\\n\");\n\t\tgoto exit;\n\t}\n\t\n\tif (rtw_is_scan_deny(padapter)) {\n\t\tDBG_871X(FUNC_ADPT_FMT  \": scan deny\\n\", FUNC_ADPT_ARG(padapter));\n\t\tgoto exit;\n\t}\n\t\n\tif ((pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)\n#ifdef CONFIG_CONCURRENT_MODE\n\t|| (rtw_get_buddy_bBusyTraffic(padapter) == _TRUE)\n#endif\n\t) {\n\t\tDBG_871X(\"scan abort!! BusyTraffic == _TRUE\\n\");\n\t\tgoto exit;\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) {\n\t\tDBG_8192C(\"scan abort!! fwstate=0x%x\\n\", pmlmepriv->fw_state);\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter,\n\t\t_FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) {\n\t\tDBG_871X(\"scan abort!! buddy_fwstate=0x%x\\n\",\n\t\t\t\tget_fwstate(&(padapter->pbuddy_adapter->mlmepriv)));\n\t\tgoto exit;\n\t}\n#endif\n\t_status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0);\n\nexit:\n\trtw_ps_deny_cancel(padapter, PS_DENY_SCAN);\n\treturn count;\n}\n\nint proc_get_ap_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tstruct sta_info *psta;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct wlan_network *cur_network = &(pmlmepriv->cur_network);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tpsta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);\n\tif(psta)\n\t{\n\t\tint i;\n\t\tstruct recv_reorder_ctrl *preorder_ctrl;\n\t\t\t\t\t\n\t\tDBG_871X_SEL_NL(m, \"SSID=%s\\n\", cur_network->network.Ssid.Ssid);\t\t\n\t\tDBG_871X_SEL_NL(m, \"sta's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(psta->hwaddr));\n\t\tDBG_871X_SEL_NL(m, \"cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\\n\", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);\t\t\n\t\tDBG_871X_SEL_NL(m, \"wireless_mode=0x%x, rtsen=%d, cts2slef=%d\\n\", psta->wireless_mode, psta->rtsen, psta->cts2self);\n\t\tDBG_871X_SEL_NL(m, \"state=0x%x, aid=%d, macid=%d, raid=%d\\n\", psta->state, psta->aid, psta->mac_id, psta->raid);\n#ifdef CONFIG_80211N_HT\n\t\tDBG_871X_SEL_NL(m, \"qos_en=%d, ht_en=%d, init_rate=%d\\n\", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);\t\t\n\t\tDBG_871X_SEL_NL(m, \"bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\\n\", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);\n\t\tDBG_871X_SEL_NL(m, \"ampdu_enable = %d\\n\", psta->htpriv.ampdu_enable);\t\n\t\tDBG_871X_SEL_NL(m, \"agg_enable_bitmap=%x, candidate_tid_bitmap=%x\\n\", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);\n\t\tDBG_871X_SEL_NL(m, \"ldpc_cap=0x%x, stbc_cap=0x%x, beamform_cap=0x%x\\n\", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap);\n#endif //CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\n\t\tDBG_871X_SEL_NL(m, \"vht_en=%d, vht_sgi_80m=%d\\n\", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m);\n\t\tDBG_871X_SEL_NL(m, \"vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\\n\", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap);\n\t\tDBG_871X_SEL_NL(m, \"vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\\n\", *(u16*)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len);\n#endif\n\n\t\tsta_rx_reorder_ctl_dump(m, psta);\n\t}\n\telse\n\t{\t\t\t\t\t\t\t\n\t\tDBG_871X_SEL_NL(m, \"can't get sta's macaddr, cur_network's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(cur_network->network.MacAddress));\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tchar cmd[32] = {0};\n\tu8 cnt = 0;\n\n\tif (count > sizeof(cmd)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(cmd, buffer, count)) {\n\t\tint num = sscanf(cmd, \"%hhx\", &cnt);\n\n\t\tif (0 == cnt) {\n\t\t\tpdbgpriv->dbg_rx_ampdu_drop_count = 0;\n\t\t\tpdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;\n\t\t\tpdbgpriv->dbg_rx_ampdu_loss_count = 0;\n\t\t\tpdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;\n\t\t\tpdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;\n\t\t\tpdbgpriv->dbg_rx_conflic_mac_addr_cnt = 0;\n\t\t}\n\t}\n\n\treturn count;\n}\n\t\nint proc_get_trx_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tint i;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct recv_priv  *precvpriv = &padapter->recvpriv;\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tstruct hw_xmit *phwxmit;\n\n\tdump_os_queue(m, padapter);\n\n\tDBG_871X_SEL_NL(m, \"free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\\n\"\n\t\t, pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);\n\tDBG_871X_SEL_NL(m, \"free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\\n\"\n\t\t, pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt);\n\tDBG_871X_SEL_NL(m, \"free_recvframe_cnt=%d\\n\"\n\t\t, precvpriv->free_recvframe_cnt);\n\n\tfor(i = 0; i < 4; i++) \n\t{\n\t\tphwxmit = pxmitpriv->hwxmits + i;\n\t\tDBG_871X_SEL_NL(m, \"%d, hwq.accnt=%d\\n\", i, phwxmit->accnt);\n\t}\n\n#ifdef CONFIG_USB_HCI\n\tDBG_871X_SEL_NL(m, \"rx_urb_pending_cn=%d\\n\", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));\n#endif\n\n\t//Folowing are RX info\n\t//Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on\n\tDBG_871X_SEL_NL(m,\"Rx: Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\\n\",(unsigned long long)pdbgpriv->dbg_rx_ampdu_drop_count);\n\t//How many times the Rx Reorder Timer is triggered.\n\tDBG_871X_SEL_NL(m,\"Rx: Reorder Time-out Trigger Counts: %llu\\n\",(unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count);\n\t//Total counts of packets loss\n\tDBG_871X_SEL_NL(m,\"Rx: Packet Loss Counts: %llu\\n\",(unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count);\n\tDBG_871X_SEL_NL(m,\"Rx: Duplicate Management Frame Drop Count: %llu\\n\",(unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count);\n\tDBG_871X_SEL_NL(m,\"Rx: AMPDU BA window shift Count: %llu\\n\",(unsigned long long)pdbgpriv->dbg_rx_ampdu_window_shift_cnt);\n\t/*The same mac addr counts*/\n\tDBG_871X_SEL_NL(m, \"Rx: Conflict MAC Address Frames Count: %llu\\n\", (unsigned long long)pdbgpriv->dbg_rx_conflic_mac_addr_cnt);\n\treturn 0;\n}\n\nint proc_get_dis_pwt(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 dis_pwt = 0;\n\trtw_hal_get_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));\n\tDBG_871X_SEL_NL(m, \" Tx Power training mode:%s \\n\",(dis_pwt==_TRUE)?\"Disable\":\"Enable\");\n\treturn 0;\n}\nssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[4]={0};\n\tu8 dis_pwt = 0;\n\t\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &dis_pwt);\n\t\tDBG_871X(\"Set Tx Power training mode:%s\\n\", (dis_pwt == _TRUE)?\"Disable\":\"Enable\");\n\t\t\n\t\tif (num >= 1)\n\t\t\trtw_hal_set_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));\n\t}\n\n\treturn count;\n\t\n}\n\nint proc_get_rate_ctl(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tint i;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 data_rate = 0, sgi=0, data_fb = 0;\n\t\t\n\tif (adapter->fix_rate != 0xff) {\n\t\tdata_rate = adapter->fix_rate & 0x7F;\n\t\tsgi = adapter->fix_rate >>7;\n\t\tdata_fb = adapter->data_fb?1:0;\n\t\tDBG_871X_SEL_NL(m, \"FIXED %s%s%s\\n\"\n\t\t\t, HDATA_RATE(data_rate)\n\t\t\t, data_rate>DESC_RATE54M?(sgi?\" SGI\":\" LGI\"):\"\"\n\t\t\t, data_fb?\" FB\":\"\"\n\t\t);\n\t\tDBG_871X_SEL_NL(m, \"0x%02x %u\\n\", adapter->fix_rate, adapter->data_fb);\n\t} else {\n\t\tDBG_871X_SEL_NL(m, \"RA\\n\");\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu8 fix_rate;\n\tu8 data_fb;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx %hhu\", &fix_rate, &data_fb);\n\n\t\tif (num >= 1)\n\t\t\tadapter->fix_rate = fix_rate;\n\t\tif (num >= 2)\n\t\t\tadapter->data_fb = data_fb?1:0;\n\t}\n\n\treturn count;\n}\n#ifdef DBG_RX_COUNTER_DUMP\nint proc_get_rx_cnt_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tint i;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X_SEL_NL(m, \"BIT0- Dump RX counters of DRV \\n\");\n\tDBG_871X_SEL_NL(m, \"BIT1- Dump RX counters of MAC \\n\");\n\tDBG_871X_SEL_NL(m, \"BIT2- Dump RX counters of PHY \\n\");\n\tDBG_871X_SEL_NL(m, \"BIT3- Dump TRX data frame of DRV \\n\");\n\tDBG_871X_SEL_NL(m, \"dump_rx_cnt_mode = 0x%02x \\n\", adapter->dump_rx_cnt_mode);\n\n\treturn 0;\n}\nssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu8 dump_rx_cnt_mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &dump_rx_cnt_mode);\n\n\t\trtw_dump_phy_rxcnts_preprocess(adapter,dump_rx_cnt_mode);\n\t\tadapter->dump_rx_cnt_mode = dump_rx_cnt_mode;\n\t\t\n\t}\n\n\treturn count;\n}\n#endif\nssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tint num;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count))\n\t\tnum = sscanf(tmp, \"%hhu %hhu\", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);\n\n\treturn count;\n}\n\nssize_t proc_set_del_rx_ampdu_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tint num;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count))\n\t\tnum = sscanf(tmp, \"%hhu\", &del_rx_ampdu_test_no_tx_fail);\n\n\treturn count;\n}\n\n#ifdef CONFIG_DFS_MASTER\nint proc_get_dfs_master_test_case(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\n\tDBG_871X_SEL_NL(m, \"%-24s %-19s\\n\", \"radar_detect_trigger_non\", \"choose_dfs_ch_first\");\n\tDBG_871X_SEL_NL(m, \"%24hhu %19hhu\\n\"\n\t\t, rfctl->dbg_dfs_master_radar_detect_trigger_non\n\t\t, rfctl->dbg_dfs_master_choose_dfs_ch_first\n\t);\n\n\treturn 0;\n}\n\nssize_t proc_set_dfs_master_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\tchar tmp[32];\n\tu8 radar_detect_trigger_non;\n\tu8 choose_dfs_ch_first;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tint num = sscanf(tmp, \"%hhu %hhu\", &radar_detect_trigger_non, &choose_dfs_ch_first);\n\n\t\tif (num >= 1)\n\t\t\trfctl->dbg_dfs_master_radar_detect_trigger_non = radar_detect_trigger_non;\n\t\tif (num >= 2)\n\t\t\trfctl->dbg_dfs_master_choose_dfs_ch_first = choose_dfs_ch_first;\n\t}\n\n\treturn count;\n}\n#endif /* CONFIG_DFS_MASTER */\n\nssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tint num;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count))\n\t\tnum = sscanf(tmp, \"%u\", &g_wait_hiq_empty_ms);\n\n\treturn count;\n}\n\nint proc_get_suspend_resume_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &dvobj->drv_dbg;\n\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_alloc_irq_cnt=%d\\n\", pdbgpriv->dbg_sdio_alloc_irq_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_free_irq_cnt=%d\\n\", pdbgpriv->dbg_sdio_free_irq_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_alloc_irq_error_cnt=%d\\n\",pdbgpriv->dbg_sdio_alloc_irq_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_free_irq_error_cnt=%d\\n\", pdbgpriv->dbg_sdio_free_irq_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_init_error_cnt=%d\\n\",pdbgpriv->dbg_sdio_init_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sdio_deinit_error_cnt=%d\\n\", pdbgpriv->dbg_sdio_deinit_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_suspend_error_cnt=%d\\n\", pdbgpriv->dbg_suspend_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_suspend_cnt=%d\\n\",pdbgpriv->dbg_suspend_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_resume_cnt=%d\\n\", pdbgpriv->dbg_resume_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_resume_error_cnt=%d\\n\", pdbgpriv->dbg_resume_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_deinit_fail_cnt=%d\\n\",pdbgpriv->dbg_deinit_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_carddisable_cnt=%d\\n\", pdbgpriv->dbg_carddisable_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_ps_insuspend_cnt=%d\\n\",pdbgpriv->dbg_ps_insuspend_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_dev_unload_inIPS_cnt=%d\\n\", pdbgpriv->dbg_dev_unload_inIPS_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_scan_pwr_state_cnt=%d\\n\", pdbgpriv->dbg_scan_pwr_state_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_downloadfw_pwr_state_cnt=%d\\n\", pdbgpriv->dbg_downloadfw_pwr_state_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_carddisable_error_cnt=%d\\n\", pdbgpriv->dbg_carddisable_error_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_fw_read_ps_state_fail_cnt=%d\\n\", pdbgpriv->dbg_fw_read_ps_state_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_leave_ips_fail_cnt=%d\\n\", pdbgpriv->dbg_leave_ips_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_leave_lps_fail_cnt=%d\\n\", pdbgpriv->dbg_leave_lps_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_h2c_leave32k_fail_cnt=%d\\n\", pdbgpriv->dbg_h2c_leave32k_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_diswow_dload_fw_fail_cnt=%d\\n\", pdbgpriv->dbg_diswow_dload_fw_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_enwow_dload_fw_fail_cnt=%d\\n\", pdbgpriv->dbg_enwow_dload_fw_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_ips_drvopen_fail_cnt=%d\\n\", pdbgpriv->dbg_ips_drvopen_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_poll_fail_cnt=%d\\n\", pdbgpriv->dbg_poll_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_rpwm_toogle_cnt=%d\\n\", pdbgpriv->dbg_rpwm_toogle_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_rpwm_timeout_fail_cnt=%d\\n\", pdbgpriv->dbg_rpwm_timeout_fail_cnt);\n\tDBG_871X_SEL_NL(m, \"dbg_sreset_cnt=%d\\n\", pdbgpriv->dbg_sreset_cnt);\n\n\treturn 0;\n}\n\n#ifdef CONFIG_DBG_COUNTER\n\nint proc_get_rx_logs(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct rx_logs *rx_logs = &padapter->rx_logs;\n\n\tDBG_871X_SEL_NL(m, \n\t\t\"intf_rx=%d\\n\"\n\t\t\"intf_rx_err_recvframe=%d\\n\"\n\t\t\"intf_rx_err_skb=%d\\n\"\n\t\t\"intf_rx_report=%d\\n\"\n\t\t\"core_rx=%d\\n\"\n\t\t\"core_rx_pre=%d\\n\"\n\t\t\"core_rx_pre_ver_err=%d\\n\"\n\t\t\"core_rx_pre_mgmt=%d\\n\"\n\t\t\"core_rx_pre_mgmt_err_80211w=%d\\n\"\n\t\t\"core_rx_pre_mgmt_err=%d\\n\"\n\t\t\"core_rx_pre_ctrl=%d\\n\"\n\t\t\"core_rx_pre_ctrl_err=%d\\n\"\n\t\t\"core_rx_pre_data=%d\\n\"\n\t\t\"core_rx_pre_data_wapi_seq_err=%d\\n\"\n\t\t\"core_rx_pre_data_wapi_key_err=%d\\n\"\n\t\t\"core_rx_pre_data_handled=%d\\n\"\n\t\t\"core_rx_pre_data_err=%d\\n\"\n\t\t\"core_rx_pre_data_unknown=%d\\n\"\n\t\t\"core_rx_pre_unknown=%d\\n\"\n\t\t\"core_rx_enqueue=%d\\n\"\n\t\t\"core_rx_dequeue=%d\\n\"\n\t\t\"core_rx_post=%d\\n\"\n\t\t\"core_rx_post_decrypt=%d\\n\"\n\t\t\"core_rx_post_decrypt_wep=%d\\n\"\n\t\t\"core_rx_post_decrypt_tkip=%d\\n\"\n\t\t\"core_rx_post_decrypt_aes=%d\\n\"\n\t\t\"core_rx_post_decrypt_wapi=%d\\n\"\n\t\t\"core_rx_post_decrypt_hw=%d\\n\"\n\t\t\"core_rx_post_decrypt_unknown=%d\\n\"\n\t\t\"core_rx_post_decrypt_err=%d\\n\"\n\t\t\"core_rx_post_defrag_err=%d\\n\"\n\t\t\"core_rx_post_portctrl_err=%d\\n\"\n\t\t\"core_rx_post_indicate=%d\\n\"\n\t\t\"core_rx_post_indicate_in_oder=%d\\n\"\n\t\t\"core_rx_post_indicate_reoder=%d\\n\"\n\t\t\"core_rx_post_indicate_err=%d\\n\"\n\t\t\"os_indicate=%d\\n\"\n\t\t\"os_indicate_ap_mcast=%d\\n\"\n\t\t\"os_indicate_ap_forward=%d\\n\"\n\t\t\"os_indicate_ap_self=%d\\n\"\n\t\t\"os_indicate_err=%d\\n\"\n\t\t\"os_netif_ok=%d\\n\"\n\t\t\"os_netif_err=%d\\n\",\n\t\trx_logs->intf_rx,\n\t\trx_logs->intf_rx_err_recvframe,\n\t\trx_logs->intf_rx_err_skb,\n\t\trx_logs->intf_rx_report,\n\t\trx_logs->core_rx,\n\t\trx_logs->core_rx_pre,\n\t\trx_logs->core_rx_pre_ver_err,\n\t\trx_logs->core_rx_pre_mgmt,\n\t\trx_logs->core_rx_pre_mgmt_err_80211w,\n\t\trx_logs->core_rx_pre_mgmt_err,\n\t\trx_logs->core_rx_pre_ctrl,\n\t\trx_logs->core_rx_pre_ctrl_err,\n\t\trx_logs->core_rx_pre_data,\n\t\trx_logs->core_rx_pre_data_wapi_seq_err,\n\t\trx_logs->core_rx_pre_data_wapi_key_err,\n\t\trx_logs->core_rx_pre_data_handled,\n\t\trx_logs->core_rx_pre_data_err,\n\t\trx_logs->core_rx_pre_data_unknown,\n\t\trx_logs->core_rx_pre_unknown,\n\t\trx_logs->core_rx_enqueue,\n\t\trx_logs->core_rx_dequeue,\n\t\trx_logs->core_rx_post,\n\t\trx_logs->core_rx_post_decrypt,\n\t\trx_logs->core_rx_post_decrypt_wep,\n\t\trx_logs->core_rx_post_decrypt_tkip,\n\t\trx_logs->core_rx_post_decrypt_aes,\n\t\trx_logs->core_rx_post_decrypt_wapi,\n\t\trx_logs->core_rx_post_decrypt_hw,\n\t\trx_logs->core_rx_post_decrypt_unknown,\n\t\trx_logs->core_rx_post_decrypt_err,\n\t\trx_logs->core_rx_post_defrag_err,\n\t\trx_logs->core_rx_post_portctrl_err,\n\t\trx_logs->core_rx_post_indicate,\n\t\trx_logs->core_rx_post_indicate_in_oder,\n\t\trx_logs->core_rx_post_indicate_reoder,\n\t\trx_logs->core_rx_post_indicate_err,\n\t\trx_logs->os_indicate,\n\t\trx_logs->os_indicate_ap_mcast,\n\t\trx_logs->os_indicate_ap_forward,\n\t\trx_logs->os_indicate_ap_self,\n\t\trx_logs->os_indicate_err,\n\t\trx_logs->os_netif_ok,\n\t\trx_logs->os_netif_err\n\t);\n\n\treturn 0;\n}\n\nint proc_get_tx_logs(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tx_logs *tx_logs = &padapter->tx_logs;\n\t\n\tDBG_871X_SEL_NL(m,\n\t\t\"os_tx=%d\\n\"\n\t\t\"os_tx_err_up=%d\\n\"\n\t\t\"os_tx_err_xmit=%d\\n\"\n\t\t\"os_tx_m2u=%d\\n\"\n\t\t\"os_tx_m2u_ignore_fw_linked=%d\\n\"\n\t\t\"os_tx_m2u_ignore_self=%d\\n\"\n\t\t\"os_tx_m2u_entry=%d\\n\"\n\t\t\"os_tx_m2u_entry_err_xmit=%d\\n\"\n\t\t\"os_tx_m2u_entry_err_skb=%d\\n\"\n\t\t\"os_tx_m2u_stop=%d\\n\"\n\t\t\"core_tx=%d\\n\"\n\t\t\"core_tx_err_pxmitframe=%d\\n\"\n\t\t\"core_tx_err_brtx=%d\\n\"\n\t\t\"core_tx_upd_attrib=%d\\n\"\n\t\t\"core_tx_upd_attrib_adhoc=%d\\n\"\n\t\t\"core_tx_upd_attrib_sta=%d\\n\"\n\t\t\"core_tx_upd_attrib_ap=%d\\n\"\n\t\t\"core_tx_upd_attrib_unknown=%d\\n\"\n\t\t\"core_tx_upd_attrib_dhcp=%d\\n\"\n\t\t\"core_tx_upd_attrib_icmp=%d\\n\"\n\t\t\"core_tx_upd_attrib_active=%d\\n\"\n\t\t\"core_tx_upd_attrib_err_ucast_sta=%d\\n\"\n\t\t\"core_tx_upd_attrib_err_ucast_ap_link=%d\\n\"\n\t\t\"core_tx_upd_attrib_err_sta=%d\\n\"\n\t\t\"core_tx_upd_attrib_err_link=%d\\n\"\n\t\t\"core_tx_upd_attrib_err_sec=%d\\n\"\n\t\t\"core_tx_ap_enqueue_warn_fwstate=%d\\n\"\n\t\t\"core_tx_ap_enqueue_warn_sta=%d\\n\"\n\t\t\"core_tx_ap_enqueue_warn_nosta=%d\\n\"\n\t\t\"core_tx_ap_enqueue_warn_link=%d\\n\"\n\t\t\"core_tx_ap_enqueue_warn_trigger=%d\\n\"\n\t\t\"core_tx_ap_enqueue_mcast=%d\\n\"\n\t\t\"core_tx_ap_enqueue_ucast=%d\\n\"\n\t\t\"core_tx_ap_enqueue=%d\\n\"\n\t\t\"intf_tx=%d\\n\"\n\t\t\"intf_tx_pending_ac=%d\\n\"\n\t\t\"intf_tx_pending_fw_under_survey=%d\\n\"\n\t\t\"intf_tx_pending_fw_under_linking=%d\\n\"\n\t\t\"intf_tx_pending_xmitbuf=%d\\n\"\n\t\t\"intf_tx_enqueue=%d\\n\"\n\t\t\"core_tx_enqueue=%d\\n\"\n\t\t\"core_tx_enqueue_class=%d\\n\"\n\t\t\"core_tx_enqueue_class_err_sta=%d\\n\"\n\t\t\"core_tx_enqueue_class_err_nosta=%d\\n\"\n\t\t\"core_tx_enqueue_class_err_fwlink=%d\\n\"\n\t\t\"intf_tx_direct=%d\\n\"\n\t\t\"intf_tx_direct_err_coalesce=%d\\n\"\n\t\t\"intf_tx_dequeue=%d\\n\"\n\t\t\"intf_tx_dequeue_err_coalesce=%d\\n\"\n\t\t\"intf_tx_dump_xframe=%d\\n\"\n\t\t\"intf_tx_dump_xframe_err_txdesc=%d\\n\"\n\t\t\"intf_tx_dump_xframe_err_port=%d\\n\",\n\t\ttx_logs->os_tx,\n\t\ttx_logs->os_tx_err_up,\n\t\ttx_logs->os_tx_err_xmit,\n\t\ttx_logs->os_tx_m2u,\n\t\ttx_logs->os_tx_m2u_ignore_fw_linked,\n\t\ttx_logs->os_tx_m2u_ignore_self,\n\t\ttx_logs->os_tx_m2u_entry,\n\t\ttx_logs->os_tx_m2u_entry_err_xmit,\n\t\ttx_logs->os_tx_m2u_entry_err_skb,\n\t\ttx_logs->os_tx_m2u_stop,\n\t\ttx_logs->core_tx,\n\t\ttx_logs->core_tx_err_pxmitframe,\n\t\ttx_logs->core_tx_err_brtx,\n\t\ttx_logs->core_tx_upd_attrib,\n\t\ttx_logs->core_tx_upd_attrib_adhoc,\n\t\ttx_logs->core_tx_upd_attrib_sta,\n\t\ttx_logs->core_tx_upd_attrib_ap,\n\t\ttx_logs->core_tx_upd_attrib_unknown,\n\t\ttx_logs->core_tx_upd_attrib_dhcp,\n\t\ttx_logs->core_tx_upd_attrib_icmp,\n\t\ttx_logs->core_tx_upd_attrib_active,\n\t\ttx_logs->core_tx_upd_attrib_err_ucast_sta,\n\t\ttx_logs->core_tx_upd_attrib_err_ucast_ap_link,\n\t\ttx_logs->core_tx_upd_attrib_err_sta,\n\t\ttx_logs->core_tx_upd_attrib_err_link,\n\t\ttx_logs->core_tx_upd_attrib_err_sec,\n\t\ttx_logs->core_tx_ap_enqueue_warn_fwstate,\n\t\ttx_logs->core_tx_ap_enqueue_warn_sta,\n\t\ttx_logs->core_tx_ap_enqueue_warn_nosta,\n\t\ttx_logs->core_tx_ap_enqueue_warn_link,\n\t\ttx_logs->core_tx_ap_enqueue_warn_trigger,\n\t\ttx_logs->core_tx_ap_enqueue_mcast,\n\t\ttx_logs->core_tx_ap_enqueue_ucast,\n\t\ttx_logs->core_tx_ap_enqueue,\n\t\ttx_logs->intf_tx,\n\t\ttx_logs->intf_tx_pending_ac,\n\t\ttx_logs->intf_tx_pending_fw_under_survey,\n\t\ttx_logs->intf_tx_pending_fw_under_linking,\n\t\ttx_logs->intf_tx_pending_xmitbuf,\n\t\ttx_logs->intf_tx_enqueue,\n\t\ttx_logs->core_tx_enqueue,\n\t\ttx_logs->core_tx_enqueue_class,\n\t\ttx_logs->core_tx_enqueue_class_err_sta,\n\t\ttx_logs->core_tx_enqueue_class_err_nosta,\n\t\ttx_logs->core_tx_enqueue_class_err_fwlink,\n\t\ttx_logs->intf_tx_direct,\n\t\ttx_logs->intf_tx_direct_err_coalesce,\n\t\ttx_logs->intf_tx_dequeue,\n\t\ttx_logs->intf_tx_dequeue_err_coalesce,\n\t\ttx_logs->intf_tx_dump_xframe,\n\t\ttx_logs->intf_tx_dump_xframe_err_txdesc,\n\t\ttx_logs->intf_tx_dump_xframe_err_port\n\t);\n\n\treturn 0;\n}\n\nint proc_get_int_logs(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X_SEL_NL(m,\n\t\t\"all=%d\\n\"\n\t\t\"err=%d\\n\"\n\t\t\"tbdok=%d\\n\"\n\t\t\"tbder=%d\\n\"\n\t\t\"bcnderr=%d\\n\"\n\t\t\"bcndma=%d\\n\"\n\t\t\"bcndma_e=%d\\n\"\n\t\t\"rx=%d\\n\"\n\t\t\"rx_rdu=%d\\n\"\n\t\t\"rx_fovw=%d\\n\"\n\t\t\"txfovw=%d\\n\"\n\t\t\"mgntok=%d\\n\"\n\t\t\"highdok=%d\\n\"\n\t\t\"bkdok=%d\\n\"\n\t\t\"bedok=%d\\n\"\n\t\t\"vidok=%d\\n\"\n\t\t\"vodok=%d\\n\",\n\t\tpadapter->int_logs.all,\n\t\tpadapter->int_logs.err,\n\t\tpadapter->int_logs.tbdok,\n\t\tpadapter->int_logs.tbder,\n\t\tpadapter->int_logs.bcnderr,\n\t\tpadapter->int_logs.bcndma,\n\t\tpadapter->int_logs.bcndma_e,\n\t\tpadapter->int_logs.rx,\n\t\tpadapter->int_logs.rx_rdu,\n\t\tpadapter->int_logs.rx_fovw,\n\t\tpadapter->int_logs.txfovw,\n\t\tpadapter->int_logs.mgntok,\n\t\tpadapter->int_logs.highdok,\n\t\tpadapter->int_logs.bkdok,\n\t\tpadapter->int_logs.bedok,\n\t\tpadapter->int_logs.vidok,\n\t\tpadapter->int_logs.vodok\n\t);\n\n\treturn 0;\n}\n\n#endif // CONFIG_DBG_COUNTER\n\nint proc_get_hw_status(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &dvobj->drv_dbg;\n\n\tif (pdbgpriv->dbg_rx_fifo_last_overflow == 1\n\t\t&& pdbgpriv->dbg_rx_fifo_curr_overflow == 1\n\t\t&& pdbgpriv->dbg_rx_fifo_diff_overflow == 1\n\t) {\n\t\tDBG_871X_SEL_NL(m, \"RX FIFO full count: no implementation\\n\");\n\t} else {\n\t\tDBG_871X_SEL_NL(m, \"RX FIFO full count: last_time=%llu, current_time=%llu, differential=%llu\\n\"\n\t\t\t, pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);\n\t}\n\n\treturn 0;\n}\n\nint proc_get_rx_signal(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tDBG_871X_SEL_NL(m, \"rssi:%d\\n\", padapter->recvpriv.rssi);\n\t//DBG_871X_SEL_NL(m, \"rxpwdb:%d\\n\", padapter->recvpriv.rxpwdb);\n\tDBG_871X_SEL_NL(m, \"signal_strength:%u\\n\", padapter->recvpriv.signal_strength);\n\tDBG_871X_SEL_NL(m, \"signal_qual:%u\\n\", padapter->recvpriv.signal_qual);\n\n\trtw_get_noise(padapter);\n\tDBG_871X_SEL_NL(m, \"noise:%d\\n\", padapter->recvpriv.noise);\n\t#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA\n\trtw_odm_get_perpkt_rssi(m,padapter);\n\trtw_get_raw_rssi_info(m,padapter);\n\t#endif\n\treturn 0;\n}\n\nssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 is_signal_dbg, signal_strength;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%u %u\", &is_signal_dbg, &signal_strength);\n\n\t\tis_signal_dbg = is_signal_dbg==0?0:1;\n\t\t\n\t\tif(is_signal_dbg && num!=2)\n\t\t\treturn count;\n\t\t\t\n\t\tsignal_strength = signal_strength>100?100:signal_strength;\n\n\t\tpadapter->recvpriv.is_signal_dbg = is_signal_dbg;\n\t\tpadapter->recvpriv.signal_strength_dbg=signal_strength;\n\n\t\tif(is_signal_dbg)\n\t\t\tDBG_871X(\"set %s %u\\n\", \"DBG_SIGNAL_STRENGTH\", signal_strength);\n\t\telse\n\t\t\tDBG_871X(\"set %s\\n\", \"HW_SIGNAL_STRENGTH\");\n\t\t\n\t}\n\t\n\treturn count;\n\t\n}\n#ifdef CONFIG_80211N_HT\n\nint proc_get_ht_enable(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\n\tif(pregpriv)\n\t\tDBG_871X_SEL_NL(m, \"%d\\n\", pregpriv->ht_enable);\n\n\treturn 0;\n}\n\nssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tchar tmp[32];\n\tu32 mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &mode);\n\n\t\tif( pregpriv && mode < 2 )\n\t\t{\n\t\t\tpregpriv->ht_enable= mode;\n\t\t\tDBG_871X(\"ht_enable=%d\\n\", pregpriv->ht_enable);\n\t\t}\n\t}\n\t\n\treturn count;\n\t\n}\n\nint proc_get_bw_mode(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\n\tif(pregpriv)\n\t\tDBG_871X_SEL_NL(m, \"0x%02x\\n\", pregpriv->bw_mode);\n\n\treturn 0;\n}\n\nssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tchar tmp[32];\n\tu32 mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &mode);\n\n\t\tif( pregpriv &&  mode < 2 )\n\t\t{\n\n\t\t\tpregpriv->bw_mode = mode;\n\t\t\tprintk(\"bw_mode=%d\\n\", mode);\n\n\t\t}\n\t}\n\t\n\treturn count;\n\t\n}\n\nint proc_get_ampdu_enable(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\n\tif(pregpriv)\n\t\tDBG_871X_SEL_NL(m, \"%d\\n\", pregpriv->ampdu_enable);\n\n\treturn 0;\n}\n\nssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tchar tmp[32];\n\tu32 mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &mode);\n\n\t\tif( pregpriv && mode < 3 )\n\t\t{\n\t\t\tpregpriv->ampdu_enable= mode;\n\t\t\tprintk(\"ampdu_enable=%d\\n\", mode);\n\t\t}\n\n\t}\n\t\n\treturn count;\n\t\n}\n\nint proc_get_mac_rptbuf(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu16 i;\n\tu16 mac_id;\n\tu32 shcut_addr = 0;\n\tu32 read_addr = 0;\n#ifdef CONFIG_RTL8814A\n\tDBG_871X_SEL_NL(m, \"TX ShortCut:\\n\");\n\tfor (mac_id = 0; mac_id < 64; mac_id++) {\n\t\trtw_write16(padapter, 0x140, 0x662 | ((mac_id & BIT5)>>5));\n\t\tshcut_addr = 0x8000;\n\t\tshcut_addr = shcut_addr | ((mac_id&0x1f) << 7);\n\t\tDBG_871X_SEL_NL(m, \"mac_id=%d, 0x140=%x =>\\n\", mac_id, 0x662 | ((mac_id & BIT5)>>5));\n\t\tfor (i = 0; i < 30; i++) {\n\t\t\tread_addr = 0;\n\t\t\tread_addr = shcut_addr | (i<<2);\n\t\t\tDBG_871X_SEL_NL(m, \"i=%02d: MAC_%04x= %08x \", i, read_addr, rtw_read32(padapter, read_addr));\n\t\t\tif (!((i+1) % 4))\n\t\t\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\t\t\tif (i == 29)\n\t\t\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\t\t}\n\t}\n#endif /* CONFIG_RTL8814A */\n\treturn 0;\n}\n\n\nint proc_get_rx_ampdu(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X_SEL(m, \"accept: \");\n\tif (padapter->fix_rx_ampdu_accept == RX_AMPDU_ACCEPT_INVALID)\n\t\tDBG_871X_SEL_NL(m, \"%u%s\\n\", rtw_rx_ampdu_is_accept(padapter), \"(auto)\");\n\telse\n\t\tDBG_871X_SEL_NL(m, \"%u%s\\n\", padapter->fix_rx_ampdu_accept, \"(fixed)\");\n\n\tDBG_871X_SEL(m, \"size: \");\n\tif (padapter->fix_rx_ampdu_size == RX_AMPDU_SIZE_INVALID)\n\t\tDBG_871X_SEL_NL(m, \"%u%s\\n\", rtw_rx_ampdu_size(padapter), \"(auto)\");\n\telse\n\t\tDBG_871X_SEL_NL(m, \"%u%s\\n\", padapter->fix_rx_ampdu_size, \"(fixed)\");\n\n\tDBG_871X_SEL_NL(m, \"%19s %17s\\n\", \"fix_rx_ampdu_accept\", \"fix_rx_ampdu_size\");\n\n\tDBG_871X_SEL(m, \"%-19d %-17u\\n\"\n\t\t, padapter->fix_rx_ampdu_accept\n\t\t, padapter->fix_rx_ampdu_size);\n\n\treturn 0;\n}\n\nssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tchar tmp[32];\n\tu8 accept;\n\tu8 size;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu %hhu\", &accept, &size);\n\n\t\tif (num >= 1)\n\t\t\trtw_rx_ampdu_set_accept(padapter, accept, RX_AMPDU_DRV_FIXED);\n\t\tif (num >= 2)\n\t\t\trtw_rx_ampdu_set_size(padapter, size, RX_AMPDU_DRV_FIXED);\n\n\t\trtw_rx_ampdu_apply(padapter);\n\t}\n\nexit:\n\treturn count;\n}\nint proc_get_rx_ampdu_factor(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\n\tif(padapter)\n\t{\n\t\tDBG_871X_SEL_NL(m,\"rx ampdu factor = %x\\n\",padapter->driver_rx_ampdu_factor);\n\t}\n\t\n\treturn 0;\n}\n\nssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer\n                                 , size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 factor;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &factor);\n\n\t\tif( padapter && (num == 1) )\n\t\t{\n\t\t\tDBG_871X(\"padapter->driver_rx_ampdu_factor = %x\\n\", factor);\n\n\t\t\tif(factor  > 0x03)\n\t\t\t\tpadapter->driver_rx_ampdu_factor = 0xFF;\n\t\t\telse\n\t\t\t\tpadapter->driver_rx_ampdu_factor = factor;\t\t\t\n\t\t}\n\t}\n\n\treturn count;\n}\n\nint proc_get_rx_ampdu_density(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\n\tif(padapter)\n\t{\n\t\tDBG_871X_SEL_NL(m,\"rx ampdu densityg = %x\\n\",padapter->driver_rx_ampdu_spacing);\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 density;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &density);\n\n\t\tif( padapter && (num == 1) )\n\t\t{\n\t\t\tDBG_871X(\"padapter->driver_rx_ampdu_spacing = %x\\n\", density);\n\n\t\t\tif(density > 0x07)\n\t\t\t\tpadapter->driver_rx_ampdu_spacing = 0xFF;\n\t\t\telse\n\t\t\t\tpadapter->driver_rx_ampdu_spacing = density;\n\t\t}\n\t}\n\n\treturn count;\n}\n\nint proc_get_tx_ampdu_density(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\n\tif(padapter)\n\t{\n\t\tDBG_871X_SEL_NL(m,\"tx ampdu density = %x\\n\",padapter->driver_ampdu_spacing);\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 density;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &density);\n\n\t\tif( padapter && (num == 1) )\n\t\t{\n\t\t\tDBG_871X(\"padapter->driver_ampdu_spacing = %x\\n\", density);\n\n\t\t\tif(density > 0x07)\n\t\t\t\tpadapter->driver_ampdu_spacing = 0xFF;\n\t\t\telse\n\t\t\t\tpadapter->driver_ampdu_spacing = density;\n\t\t}\n\t}\n\n\treturn count;\n}\n#endif //CONFIG_80211N_HT\n\nint proc_get_en_fwps(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(pregpriv)\n\t\tDBG_871X_SEL_NL(m, \"check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\\n\"\n\t\t\t, pregpriv->check_fw_ps);\n\n\treturn 0;\n}\n\nssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tchar tmp[32];\n\tu32 mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &mode);\n\n\t\tif( pregpriv &&  mode < 2 )\n\t\t{\n\t\t\tpregpriv->check_fw_ps = mode;\n\t\t\tDBG_871X(\"pregpriv->check_fw_ps=%d \\n\",pregpriv->check_fw_ps);\n\t\t}\n\n\t}\n\n\treturn count;\n}\n\n/*\nint proc_get_two_path_rssi(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tif(padapter)\n\t\tDBG_871X_SEL_NL(m, \"%d %d\\n\",\n\t\t\tpadapter->recvpriv.RxRssi[0], padapter->recvpriv.RxRssi[1]);\n\n\treturn 0;\n}\n*/\n#ifdef CONFIG_80211N_HT\nint proc_get_rx_stbc(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\n\tif(pregpriv)\n\t\tDBG_871X_SEL_NL(m, \"%d\\n\", pregpriv->rx_stbc);\n\n\treturn 0;\n}\n\nssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tchar tmp[32];\n\tu32 mode;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &mode);\n\n\t\tif( pregpriv && (mode == 0 || mode == 1|| mode == 2|| mode == 3))\n\t\t{\n\t\t\tpregpriv->rx_stbc= mode;\n\t\t\tprintk(\"rx_stbc=%d\\n\", mode);\n\t\t}\n\t}\n\t\n\treturn count;\n\t\n}\n#endif //CONFIG_80211N_HT\n\n/*int proc_get_rssi_disp(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\treturn 0;\n}\n*/\n\n/*ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 enable=0;\n\n\tif (count < 1)\n\t{\n\t\tDBG_8192C(\"argument size is less than 1\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x\", &enable);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_8192C(\"invalid set_rssi_disp parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\t\t\n\t\tif(enable)\n\t\t{\t\t\t\n\t\t\tDBG_8192C(\"Linked info Function Enable\\n\");\n\t\t\tpadapter->bLinkInfoDump = enable ;\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_8192C(\"Linked info Function Disable\\n\");\n\t\t\tpadapter->bLinkInfoDump = 0 ;\n\t\t}\n\t\n\t}\n\t\n\treturn count;\n\t\n}\t\n\n*/\t\t\n#ifdef CONFIG_AP_MODE\n\nint proc_get_all_sta_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_irqL irqL;\n\tstruct sta_info *psta;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tint i;\n\t_list\t*plist, *phead;\n\n\tDBG_871X_SEL_NL(m, \"sta_dz_bitmap=0x%x, tim_bitmap=0x%x\\n\", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);\n\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\tfor(i=0; i< NUM_STA; i++)\n\t{\n\t\tphead = &(pstapriv->sta_hash[i]);\n\t\tplist = get_next(phead);\n\t\t\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t{\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\n\t\t\tplist = get_next(plist);\n\n\t\t\t//if(extra_arg == psta->aid)\n\t\t\t{\n\t\t\t\tDBG_871X_SEL_NL(m, \"==============================\\n\");\n\t\t\t\tDBG_871X_SEL_NL(m, \"sta's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(psta->hwaddr));\n\t\t\t\tDBG_871X_SEL_NL(m, \"rtsen=%d, cts2slef=%d\\n\", psta->rtsen, psta->cts2self);\n\t\t\t\tDBG_871X_SEL_NL(m, \"state=0x%x, aid=%d, macid=%d, raid=%d\\n\", psta->state, psta->aid, psta->mac_id, psta->raid);\n#ifdef CONFIG_80211N_HT\n\t\t\t\tDBG_871X_SEL_NL(m, \"qos_en=%d, ht_en=%d, init_rate=%d\\n\", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);\t\n\t\t\t\tDBG_871X_SEL_NL(m, \"bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\\n\", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);\n\t\t\t\tDBG_871X_SEL_NL(m, \"ampdu_enable = %d\\n\", psta->htpriv.ampdu_enable);\t\t\t\t\t\t\t\t\t\n\t\t\t\tDBG_871X_SEL_NL(m, \"agg_enable_bitmap=%x, candidate_tid_bitmap=%x\\n\", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);\n#endif //CONFIG_80211N_HT\n\t\t\t\tDBG_871X_SEL_NL(m, \"sleepq_len=%d\\n\", psta->sleepq_len);\n\t\t\t\tDBG_871X_SEL_NL(m, \"sta_xmitpriv.vo_q_qcnt=%d\\n\", psta->sta_xmitpriv.vo_q.qcnt);\n\t\t\t\tDBG_871X_SEL_NL(m, \"sta_xmitpriv.vi_q_qcnt=%d\\n\", psta->sta_xmitpriv.vi_q.qcnt);\n\t\t\t\tDBG_871X_SEL_NL(m, \"sta_xmitpriv.be_q_qcnt=%d\\n\", psta->sta_xmitpriv.be_q.qcnt);\n\t\t\t\tDBG_871X_SEL_NL(m, \"sta_xmitpriv.bk_q_qcnt=%d\\n\", psta->sta_xmitpriv.bk_q.qcnt);\n\n\t\t\t\tDBG_871X_SEL_NL(m, \"capability=0x%x\\n\", psta->capability);\n\t\t\t\tDBG_871X_SEL_NL(m, \"flags=0x%x\\n\", psta->flags);\n\t\t\t\tDBG_871X_SEL_NL(m, \"wpa_psk=0x%x\\n\", psta->wpa_psk);\n\t\t\t\tDBG_871X_SEL_NL(m, \"wpa2_group_cipher=0x%x\\n\", psta->wpa2_group_cipher);\n\t\t\t\tDBG_871X_SEL_NL(m, \"wpa2_pairwise_cipher=0x%x\\n\", psta->wpa2_pairwise_cipher);\n\t\t\t\tDBG_871X_SEL_NL(m, \"qos_info=0x%x\\n\", psta->qos_info);\n\t\t\t\tDBG_871X_SEL_NL(m, \"dot118021XPrivacy=0x%x\\n\", psta->dot118021XPrivacy);\n\n\t\t\t\tsta_rx_reorder_ctl_dump(m, psta);\n\n#ifdef CONFIG_TDLS\n\t\t\t\tDBG_871X_SEL_NL(m, \"tdls_sta_state=0x%08x\\n\", psta->tdls_sta_state);\n\t\t\t\tDBG_871X_SEL_NL(m, \"PeerKey_Lifetime=%d\\n\", psta->TDLS_PeerKey_Lifetime);\n\t\t\t\tDBG_871X_SEL_NL(m, \"rx_data_pkts=%llu\\n\", psta->sta_stats.rx_data_pkts);\n\t\t\t\tDBG_871X_SEL_NL(m, \"rx_bytes=%llu\\n\", psta->sta_stats.rx_bytes);\n\t\t\t\tDBG_871X_SEL_NL(m, \"tx_data_pkts=%llu\\n\", psta->sta_stats.tx_pkts);\n\t\t\t\tDBG_871X_SEL_NL(m, \"tx_bytes=%llu\\n\", psta->sta_stats.tx_bytes);\n#endif //CONFIG_TDLS\n\t\t\t\tDBG_871X_SEL_NL(m, \"==============================\\n\");\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\treturn 0;\n}\n\n#endif\t\t\n\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\nint proc_get_rtkm_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\tstruct recv_buf *precvbuf;\n\t\n\tprecvbuf = (struct recv_buf *)precvpriv->precv_buf;\n\n\tDBG_871X_SEL_NL(m, \"============[RTKM Info]============\\n\");\n\tDBG_871X_SEL_NL(m, \"MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\\n\", rtw_rtkm_get_nr_recv_skb());\n\tDBG_871X_SEL_NL(m, \"MAX_RTKM_RECVBUF_SZ: %d\\n\", rtw_rtkm_get_buff_size());\n\n\tDBG_871X_SEL_NL(m, \"============[Driver Info]============\\n\");\n\tDBG_871X_SEL_NL(m, \"NR_PREALLOC_RECV_SKB: %d\\n\", NR_PREALLOC_RECV_SKB);\n\tDBG_871X_SEL_NL(m, \"MAX_RECVBUF_SZ: %d\\n\", precvbuf->alloc_sz);\n\n\treturn 0;\n}\n#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */\n\n#ifdef DBG_MEMORY_LEAK\n#include <asm/atomic.h>\nextern atomic_t _malloc_cnt;;\nextern atomic_t _malloc_size;;\n\nint proc_get_malloc_cnt(struct seq_file *m, void *v)\n{\n\tDBG_871X_SEL_NL(m, \"_malloc_cnt=%d\\n\", atomic_read(&_malloc_cnt));\n\tDBG_871X_SEL_NL(m, \"_malloc_size=%d\\n\", atomic_read(&_malloc_size));\n\n\treturn 0;\n}\n#endif /* DBG_MEMORY_LEAK */\n\n#ifdef CONFIG_FIND_BEST_CHANNEL\nint proc_get_best_channel(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tu32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;\n\n\tfor (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {\n\t\tif ( pmlmeext->channel_set[i].ChannelNum == 1)\n\t\t\tindex_24G = i;\n\t\tif ( pmlmeext->channel_set[i].ChannelNum == 36)\n\t\t\tindex_5G = i;\n\t}\t\n\t\n\tfor (i=0; (i < MAX_CHANNEL_NUM) && (pmlmeext->channel_set[i].ChannelNum !=0) ; i++) {\n\t\t// 2.4G\n\t\tif ( pmlmeext->channel_set[i].ChannelNum == 6 ) {\n\t\t\tif ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {\n\t\t\t\tindex_24G = i;\n\t\t\t\tbest_channel_24G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n\n\t\t// 5G\n\t\tif ( pmlmeext->channel_set[i].ChannelNum >= 36\n\t\t\t&& pmlmeext->channel_set[i].ChannelNum < 140 ) {\n\t\t\t // Find primary channel\n\t\t\tif ( (( pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)\n\t\t\t\t&& (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {\n\t\t\t\tindex_5G = i;\n\t\t\t\tbest_channel_5G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n\n\t\tif ( pmlmeext->channel_set[i].ChannelNum >= 149\n\t\t\t&& pmlmeext->channel_set[i].ChannelNum < 165) {\n\t\t\t // find primary channel\n\t\t\tif ( (( pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)\n\t\t\t\t&& (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count) ) {\n\t\t\t\tindex_5G = i;\n\t\t\t\tbest_channel_5G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n#if 1 // debug\n\t\tDBG_871X_SEL_NL(m, \"The rx cnt of channel %3d = %d\\n\", \n\t\t\t\t\tpmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);\n#endif\n\t}\n\t\n\tDBG_871X_SEL_NL(m, \"best_channel_5G = %d\\n\", best_channel_5G);\n\tDBG_871X_SEL_NL(m, \"best_channel_24G = %d\\n\", best_channel_24G);\n\n\treturn 0;\n}\n\nssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tchar tmp[32];\n\n\tif(count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tint i;\n\t\tfor(i = 0; pmlmeext->channel_set[i].ChannelNum != 0; i++)\n\t\t{\n\t\t\tpmlmeext->channel_set[i].rx_count = 0;\n\t\t}\n\n\t\tDBG_871X(\"set %s\\n\", \"Clean Best Channel Count\");\n\t}\n\n\treturn count;\n}\n#endif /* CONFIG_FIND_BEST_CHANNEL */\n\n#ifdef CONFIG_BT_COEXIST\nint proc_get_btcoex_dbg(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tPADAPTER padapter;\n\tchar buf[512] = {0};\n\tpadapter = (PADAPTER)rtw_netdev_priv(dev);\n\n\trtw_btcoex_GetDBG(padapter, buf, 512);\n\n\tDBG_871X_SEL(m, \"%s\", buf);\n\n\treturn 0;\n}\n\nssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\tPADAPTER padapter;\n\tu8 tmp[80] = {0};\n\tu32 module[2] = {0};\n\tu32 num;\n\n\tpadapter = (PADAPTER)rtw_netdev_priv(dev);\n\n//\tDBG_871X(\"+\" FUNC_ADPT_FMT \"\\n\", FUNC_ADPT_ARG(padapter));\n\n\tif (NULL == buffer)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": input buffer is NULL!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter));\n\t\t\n\t\treturn -EFAULT;\n\t}\n\n\tif (count < 1)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": input length is 0!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter));\n\n\t\treturn -EFAULT;\n\t}\n\n\tnum = count;\n\tif (num > (sizeof(tmp) - 1))\n\t\tnum = (sizeof(tmp) - 1);\n\n\tif (copy_from_user(tmp, buffer, num))\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": copy buffer from user space FAIL!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter));\n\n\t\treturn -EFAULT;\n\t}\n\n\tnum = sscanf(tmp, \"%x %x\", module, module+1);\n\tif (1 == num)\n\t{\n\t\tif (0 == module[0])\n\t\t\t_rtw_memset(module, 0, sizeof(module));\n\t\telse\n\t\t\t_rtw_memset(module, 0xFF, sizeof(module));\n\t}\n\telse if (2 != num)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": input(\\\"%s\\\") format incorrect!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), tmp);\n\n\t\tif (0 == num)\n\t\t\treturn -EFAULT;\n\t}\n\n\tDBG_871X(FUNC_ADPT_FMT \": input 0x%08X 0x%08X\\n\",\n\t\tFUNC_ADPT_ARG(padapter), module[0], module[1]);\n\trtw_btcoex_SetDBG(padapter, module);\n\n\treturn count;\n}\n\nint proc_get_btcoex_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\tPADAPTER padapter;\n\tconst u32 bufsize = 30*100;\n\tu8 *pbuf = NULL;\n\n\tpadapter = (PADAPTER)rtw_netdev_priv(dev);\n\n\tpbuf = rtw_zmalloc(bufsize);\n\tif (NULL == pbuf) {\n\t\treturn -ENOMEM;\n\t}\n\n\trtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);\n\n\tDBG_871X_SEL(m, \"%s\\n\", pbuf);\n\t\n\trtw_mfree(pbuf, bufsize);\n\n\treturn 0;\n}\n#endif /* CONFIG_BT_COEXIST */\n\n#if defined(DBG_CONFIG_ERROR_DETECT)\nint proc_get_sreset(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\treturn 0;\n}\n\nssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\ts32 trigger_point;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d\", &trigger_point);\n\n\t\tif (trigger_point == SRESET_TGP_NULL)\n\t\t\trtw_hal_sreset_reset(padapter);\n\t\telse\n\t\t\tsreset_set_trigger_point(padapter, trigger_point);\n\t}\n\t\n\treturn count;\n\t\n}\n#endif /* DBG_CONFIG_ERROR_DETECT */\n\n#ifdef CONFIG_PCI_HCI\n\nint proc_get_rx_ring(struct seq_file *m, void *v)\n{\n\t_irqL irqL;\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);\n\tstruct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\tstruct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];\n\tint i, j;\n\n\tDBG_871X_SEL_NL(m, \"rx ring (%p)\\n\", rx_ring);\n\tDBG_871X_SEL_NL(m, \"  dma: 0x%08x\\n\", (int) rx_ring->dma);\n\tDBG_871X_SEL_NL(m, \"  idx: %d\\n\", rx_ring->idx);\n\n\t_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);\n\tfor (i=0; i<precvpriv->rxringcount; i++)\n\t{\n\t\tstruct recv_stat *entry = &rx_ring->desc[i];\n\t\tstruct sk_buff *skb = rx_ring->rx_buf[i];\n\n\t\tDBG_871X_SEL_NL(m, \"  desc[%03d]: %p, rx_buf[%03d]: 0x%08x\\n\",\n\t\t\ti, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));\n\n\t\tfor (j=0; j<sizeof(*entry)/4; j++)\n\t\t{\n\t\t\tif ((j % 4) == 0)\n\t\t\t\tDBG_871X_SEL_NL(m, \"  0x%03x\", j);\n\n\t\t\tDBG_871X_SEL_NL(m, \" 0x%08x \", ((int *) entry)[j]);\n\n\t\t\tif ((j % 4) == 3)\n\t\t\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\t\t}\n\t}\n\t_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);\n\n\treturn 0;\n}\n\nint proc_get_tx_ring(struct seq_file *m, void *v)\n{\n\t_irqL irqL;\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);\n\tstruct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tint i, j, k;\n\n\t_enter_critical(&pdvobjpriv->irq_th_lock, &irqL);\n\tfor (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++)\n\t{\n\t\tstruct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];\n\n\t\tDBG_871X_SEL_NL(m, \"tx ring[%d] (%p)\\n\", i, tx_ring);\n\t\tDBG_871X_SEL_NL(m, \"  dma: 0x%08x\\n\", (int) tx_ring->dma);\n\t\tDBG_871X_SEL_NL(m, \"  idx: %d\\n\", tx_ring->idx);\n\t\tDBG_871X_SEL_NL(m, \"  entries: %d\\n\", tx_ring->entries);\n//\t\tDBG_871X_SEL_NL(m, \"  queue: %d\\n\", tx_ring->queue);\n\t\tDBG_871X_SEL_NL(m, \"  qlen: %d\\n\", tx_ring->qlen);\n\n\t\tfor (j=0; j < pxmitpriv->txringcount[i]; j++)\n\t\t{\n\t\t\tstruct tx_desc *entry = &tx_ring->desc[j];\n\n\t\t\tDBG_871X_SEL_NL(m, \"  desc[%03d]: %p\\n\", j, entry);\n\t\t\tfor (k=0; k < sizeof(*entry)/4; k++)\n\t\t\t{\n\t\t\t\tif ((k % 4) == 0)\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"  0x%03x\", k);\n\n\t\t\t\tDBG_871X_SEL_NL(m, \" 0x%08x \", ((int *) entry)[k]);\n\n\t\t\t\tif ((k % 4) == 3)\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\t\t\t}\n\t\t}\n\t}\n\t_exit_critical(&pdvobjpriv->irq_th_lock, &irqL);\n\n\treturn 0;\n}\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nint proc_get_wowlan_gpio_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tu8 val = pwrpriv->is_high_active;\n\n\tDBG_871X_SEL_NL(m, \"wakeup_gpio_idx: %d\\n\", WAKEUP_GPIO_IDX);\n\tDBG_871X_SEL_NL(m, \"high_active: %d\\n\", val);\n\n\treturn 0;\n}\n\nssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer,\n\t\tsize_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tchar tmp[32] = {0};\n\tint num = 0;\n\tu32 is_high_active = 0;\n\tu8 val8 = 0;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tnum = sscanf(tmp, \"%u\", &is_high_active);\n\n\t\tis_high_active = is_high_active == 0 ? 0 : 1;\n\n\t\tpwrpriv->is_high_active = is_high_active;\n\n\t\trtw_ps_deny(padapter, PS_DENY_IOCTL);\n\t\tLeaveAllPowerSaveModeDirect(padapter);\n\t\tval8 = (pwrpriv->is_high_active == 0) ? 1 : 0;\n\t\trtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8);\n\t\trtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);\n\n\t\tDBG_871X(\"set %s %d\\n\", \"gpio_high_active\",\n\t\t\t\tpwrpriv->is_high_active);\n\t\tDBG_871X(\"%s: set GPIO_%d %d as default.\\n\",\n\t\t\t __func__, WAKEUP_GPIO_IDX, val8);\n\t}\n\t\n\treturn count;\n}\n#endif /* CONFIG_GPIO_WAKEUP */\n\n#ifdef CONFIG_P2P_WOWLAN\nint proc_get_p2p_wowlan_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tstruct p2p_wowlan_info\t peerinfo = pwdinfo->p2p_wow_info;\n\tif(_TRUE == peerinfo.is_trigger)\n\t{\n\t\tDBG_871X_SEL_NL(m,\"is_trigger: TRUE\\n\");\n\t\tswitch(peerinfo.wowlan_recv_frame_type)\n\t\t{\n\t\t\tcase P2P_WOWLAN_RECV_NEGO_REQ:\n\t\t\t\tDBG_871X_SEL_NL(m,\"Frame Type: Nego Request\\n\");\n\t\t\t\tbreak;\n\t\t\tcase P2P_WOWLAN_RECV_INVITE_REQ:\n\t\t\t\tDBG_871X_SEL_NL(m,\"Frame Type: Invitation Request\\n\");\n\t\t\t\tbreak;\n\t\t\tcase P2P_WOWLAN_RECV_PROVISION_REQ:\n\t\t\t\tDBG_871X_SEL_NL(m,\"Frame Type: Provision Request\\n\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\tDBG_871X_SEL_NL(m,\"Peer Addr: \"MAC_FMT\"\\n\", MAC_ARG(peerinfo.wowlan_peer_addr));\n\t\tDBG_871X_SEL_NL(m,\"Peer WPS Config: %x\\n\", peerinfo.wowlan_peer_wpsconfig);\n\t\tDBG_871X_SEL_NL(m,\"Persistent Group: %d\\n\", peerinfo.wowlan_peer_is_persistent);\n\t\tDBG_871X_SEL_NL(m,\"Intivation Type: %d\\n\", peerinfo.wowlan_peer_invitation_type);\n\t}\n\telse\n\t{\n\t\tDBG_871X_SEL_NL(m,\"is_trigger: False\\n\");\n\t}\n\treturn 0;\n}\n#endif /* CONFIG_P2P_WOWLAN */\n\nint proc_get_new_bcn_max(struct seq_file *m, void *v)\n{\n\textern int new_bcn_max;\n\n\tDBG_871X_SEL_NL(m, \"%d\", new_bcn_max);\n\treturn 0;\n}\n\nssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tchar tmp[32];\n\textern int new_bcn_max;\n\n\tif(count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count))\n\t\tsscanf(tmp, \"%d \", &new_bcn_max);\n\n\treturn count;\n}\n\n#ifdef CONFIG_POWER_SAVING\nint proc_get_ps_info(struct seq_file *m, void *v)\n{\t\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tu8 ips_mode = pwrpriv->ips_mode;\n\tu8 lps_mode = pwrpriv->power_mgnt;\n\tchar *str = \"\";\n\n\tDBG_871X_SEL_NL(m, \"======Power Saving Info:======\\n\");\n\tDBG_871X_SEL_NL(m, \"*IPS:\\n\");\n\n\tif (ips_mode == IPS_NORMAL) {\n#ifdef CONFIG_FWLPS_IN_IPS\n\t\tstr = \"FW_LPS_IN_IPS\";\n#else\n\t\tstr = \"Card Disable\";\n#endif\n\t} else if (ips_mode == IPS_NONE) {\n\t\tstr = \"NO IPS\";\n\t} else if (ips_mode == IPS_LEVEL_2) {\n\t\tstr = \"IPS_LEVEL_2\";\n\t} else {\n\t\tstr = \"invalid ips_mode\";\n\t}\n\n\tDBG_871X_SEL_NL(m, \" IPS mode: %s\\n\", str);\n\tDBG_871X_SEL_NL(m, \" IPS enter count:%d, IPS leave count:%d\\n\",\n\t\t\tpwrpriv->ips_enter_cnts, pwrpriv->ips_leave_cnts);\n\tDBG_871X_SEL_NL(m, \"------------------------------\\n\");\n\tDBG_871X_SEL_NL(m, \"*LPS:\\n\");\n\n\tif (lps_mode == PS_MODE_ACTIVE) {\n\t\tstr = \"NO LPS\";\n\t} else if (lps_mode == PS_MODE_MIN) {\n\t\tstr = \"MIN\";\n\t} else if (lps_mode == PS_MODE_MAX) {\n\t\tstr = \"MAX\";\n\t} else if (lps_mode == PS_MODE_DTIM) {\n\t\tstr = \"DTIM\";\n\t} else {\n\t\tsprintf(str, \"%d\", lps_mode);\n\t}\n\n\tDBG_871X_SEL_NL(m, \" LPS mode: %s\\n\", str);\n\n\tif (pwrpriv->dtim != 0)\n\t\tDBG_871X_SEL_NL(m, \" DTIM: %d\\n\", pwrpriv->dtim);\n\tDBG_871X_SEL_NL(m, \" LPS enter count:%d, LPS leave count:%d\\n\",\n\t\t\tpwrpriv->lps_enter_cnts, pwrpriv->lps_leave_cnts);\n\tDBG_871X_SEL_NL(m, \"=============================\\n\");\n\treturn 0;\n}\n#endif //CONFIG_POWER_SAVING\n\n#ifdef CONFIG_TDLS\nstatic int proc_tdls_display_tdls_function_info(struct seq_file *m)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tu8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;\n\tu8 SpaceBtwnItemAndValueTmp = 0;\n\tBOOLEAN FirstMatchFound = _FALSE;\n\tint j= 0;\n\t\n\tDBG_871X_SEL_NL(m, \"============[TDLS Function Info]============\\n\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Prohibited\", (ptdlsinfo->ap_prohibited == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Channel Switch Prohibited\", (ptdlsinfo->ch_switch_prohibited == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Link Established\", (ptdlsinfo->link_established == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %d/%d\\n\", SpaceBtwnItemAndValue, \"TDLS STA Num (Linked/Allowed)\", ptdlsinfo->sta_cnt, MAX_ALLOWED_TDLS_STA_NUM);\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Allowed STA Num Reached\", (ptdlsinfo->sta_maximum == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\n#ifdef CONFIG_TDLS_CH_SW\n\tDBG_871X_SEL_NL(m, \"%-*s =\", SpaceBtwnItemAndValue, \"TDLS CH SW State\");\n\tif (ptdlsinfo->chsw_info.ch_sw_state == TDLS_STATE_NONE)\n\t{\n\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_STATE_NONE\");\n\t}\n\telse\n\t{\n\t\tfor (j = 0; j < 32; j++)\n\t\t{\n\t\t\tif (ptdlsinfo->chsw_info.ch_sw_state & BIT(j))\n\t\t\t{\n\t\t\t\tif (FirstMatchFound ==  _FALSE)\n\t\t\t\t{\n\t\t\t\t\tSpaceBtwnItemAndValueTmp = 1;\n\t\t\t\t\tFirstMatchFound = _TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;\n\t\t\t\t}\n\t\t\t\tswitch (BIT(j))\n\t\t\t\t{\n\t\t\t\t\tcase TDLS_INITIATOR_STATE:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_INITIATOR_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_RESPONDER_STATE:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_RESPONDER_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_LINKED_STATE:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_LINKED_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_WAIT_PTR_STATE:\t\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_WAIT_PTR_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_ALIVE_STATE:\t\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_ALIVE_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_CH_SWITCH_ON_STATE:\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_CH_SWITCH_ON_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_PEER_AT_OFF_STATE:\t\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_PEER_AT_OFF_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_CH_SW_INITIATOR_STATE:\t\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_CH_SW_INITIATOR_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase TDLS_WAIT_CH_RSP_STATE:\t\t\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValue, \" \", \"TDLS_WAIT_CH_RSP_STATE\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*sBIT(%d)\\n\", SpaceBtwnItemAndValueTmp, \" \", j);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW On\", (ATOMIC_READ(&ptdlsinfo->chsw_info.chsw_on) == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %d\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW Off-Channel Num\", ptdlsinfo->chsw_info.off_ch_num);\n\tDBG_871X_SEL_NL(m, \"%-*s = %d\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW Channel Offset\", ptdlsinfo->chsw_info.ch_offset);\n\tDBG_871X_SEL_NL(m, \"%-*s = %d\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW Current Time\", ptdlsinfo->chsw_info.cur_time);\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW Delay Switch Back\", (ptdlsinfo->chsw_info.delay_switch_back == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %d\\n\", SpaceBtwnItemAndValue, \"TDLS CH SW Dump Back\", ptdlsinfo->chsw_info.dump_stack);\n#endif\n\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Device Discovered\", (ptdlsinfo->dev_discovered == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Enable\", (ptdlsinfo->tdls_enable == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"TDLS Driver Setup\", (ptdlsinfo->driver_setup == _TRUE) ? \"_TRUE\" : \"_FALSE\");\n\t\n\treturn 0;\n}\n\nstatic int proc_tdls_display_network_info(struct seq_file *m)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct wlan_network *cur_network = &(pmlmepriv->cur_network);\n\tint i = 0;\n\tu8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;\n\n\t/* Display the linked AP/GO info */\n\tDBG_871X_SEL_NL(m, \"============[Associated AP/GO Info]============\\n\");\n\t\n\tif ((pmlmepriv->fw_state & WIFI_STATION_STATE) && (pmlmepriv->fw_state & _FW_LINKED))\n\t{\n\t\tDBG_871X_SEL_NL(m, \"%-*s = %s\\n\", SpaceBtwnItemAndValue, \"BSSID\", cur_network->network.Ssid.Ssid);\n\t\tDBG_871X_SEL_NL(m, \"%-*s = \"MAC_FMT\"\\n\", SpaceBtwnItemAndValue, \"Mac Address\", MAC_ARG(cur_network->network.MacAddress));\n\t\t\n\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Wireless Mode\");\n\t\tfor (i = 0; i < 8; i++)\n\t\t{\n\t\t\tif (pmlmeext->cur_wireless_mode & BIT(i))\n\t\t\t{\n\t\t\t\tswitch (BIT(i))\n\t\t\t\t{\n\t\t\t\t\tcase WIRELESS_11B: \n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11B \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_11G:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11G \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_11A:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11A \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_11_24N:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%7s\", \"11_24N \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_11_5N:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%6s\", \"11_5N \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_AUTO:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%5s\", \"AUTO \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WIRELESS_11AC:\n\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%5s\", \"11AC \");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Privacy\");\n\t\tswitch (padapter->securitypriv.dot11PrivacyAlgrthm)\n\t\t{\n\t\t\tcase _NO_PRIVACY_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"NO PRIVACY\");\n\t\t\t\tbreak;\n\t\t\tcase _WEP40_:\t\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP 40\");\n\t\t\t\tbreak;\n\t\t\tcase _TKIP_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"TKIP\");\n\t\t\t\tbreak;\n\t\t\tcase _TKIP_WTMIC_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"TKIP WTMIC\");\n\t\t\t\tbreak;\n\t\t\tcase _AES_:\t\t\t\t\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"AES\");\n\t\t\t\tbreak;\n\t\t\tcase _WEP104_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP 104\");\n\t\t\t\tbreak;\n\t\t\tcase _WEP_WPA_MIXED_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP/WPA Mixed\");\n\t\t\t\tbreak;\n\t\t\tcase _SMS4_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"SMS4\");\n\t\t\t\tbreak;\n#ifdef CONFIG_IEEE80211W\n\t\t\tcase _BIP_:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"BIP\");\n\t\t\t\tbreak;\t\n#endif //CONFIG_IEEE80211W\n\t\t}\n\t\t\n\t\tDBG_871X_SEL_NL(m, \"%-*s = %d\\n\", SpaceBtwnItemAndValue, \"Channel\", pmlmeext->cur_channel);\n\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Channel Offset\");\n\t\tswitch (pmlmeext->cur_ch_offset)\n\t\t{\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_DONT_CARE:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"N/A\");\n\t\t\t\tbreak;\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_LOWER:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"Lower\");\n\t\t\t\tbreak;\n\t\t\tcase HAL_PRIME_CHNL_OFFSET_UPPER:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"Upper\");\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Bandwidth Mode\");\n\t\tswitch (pmlmeext->cur_bwmode)\n\t\t{\n\t\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"20MHz\");\n\t\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"40MHz\");\n\t\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"80MHz\");\n\t\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_160:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"160MHz\");\n\t\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_80_80:\n\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"80MHz + 80MHz\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X_SEL_NL(m, \"No association with AP/GO exists!\\n\");\n\t}\n\n\treturn 0;\n}\n\nstatic int proc_tdls_display_tdls_sta_info(struct seq_file *m)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct sta_info *psta;\n\tint i = 0, j = 0;\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tu8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;\n\tu8 SpaceBtwnItemAndValueTmp = 0;\n\tu8 NumOfTdlsStaToShow = 0;\n\tBOOLEAN FirstMatchFound = _FALSE;\n\t\n\t/* Search for TDLS sta info to display */\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\tfor (i=0; i< NUM_STA; i++)\n\t{\n\t\tphead = &(pstapriv->sta_hash[i]);\n\t\tplist = get_next(phead);\t\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t{\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\t\tplist = get_next(plist);\n\t\t\t\tif (psta->tdls_sta_state != TDLS_STATE_NONE)\n\t\t\t\t{\n\t\t\t\t\t/* We got one TDLS sta info to show */\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"============[TDLS Peer STA Info: STA %d]============\\n\", ++NumOfTdlsStaToShow);\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = \"MAC_FMT\"\\n\", SpaceBtwnItemAndValue, \"Mac Address\", MAC_ARG(psta->hwaddr));\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s =\", SpaceBtwnItemAndValue, \"TDLS STA State\");\n\t\t\t\t\tSpaceBtwnItemAndValueTmp = 0;\n\t\t\t\t\tFirstMatchFound = _FALSE;\n\t\t\t\t\tfor (j = 0; j < 32; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (psta->tdls_sta_state & BIT(j))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (FirstMatchFound ==  _FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSpaceBtwnItemAndValueTmp = 1;\n\t\t\t\t\t\t\t\tFirstMatchFound = _TRUE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswitch (BIT(j))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase TDLS_INITIATOR_STATE:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_INITIATOR_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_RESPONDER_STATE:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_RESPONDER_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_LINKED_STATE:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_LINKED_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_WAIT_PTR_STATE:\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_WAIT_PTR_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_ALIVE_STATE:\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_ALIVE_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_CH_SWITCH_ON_STATE:\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_CH_SWITCH_ON_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_PEER_AT_OFF_STATE:\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_PEER_AT_OFF_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_CH_SW_INITIATOR_STATE:\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValueTmp, \" \", \"TDLS_CH_SW_INITIATOR_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase TDLS_WAIT_CH_RSP_STATE:\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s%s\\n\", SpaceBtwnItemAndValue, \" \", \"TDLS_WAIT_CH_RSP_STATE\");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*sBIT(%d)\\n\", SpaceBtwnItemAndValueTmp, \" \", j);\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Wireless Mode\");\n\t\t\t\t\tfor (j = 0; j < 8; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (psta->wireless_mode & BIT(j))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch (BIT(j))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase WIRELESS_11B: \n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11B \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_11G:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11G \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_11A:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%4s\", \"11A \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_11_24N:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%7s\", \"11_24N \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_11_5N:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%6s\", \"11_5N \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_AUTO:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%5s\", \"AUTO \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase WIRELESS_11AC:\n\t\t\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%5s\", \"11AC \");\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Bandwidth Mode\");\n\t\t\t\t\tswitch (psta->bw_mode)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"20MHz\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"40MHz\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"80MHz\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CHANNEL_WIDTH_160:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"160MHz\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CHANNEL_WIDTH_80_80:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"80MHz + 80MHz\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = \", SpaceBtwnItemAndValue, \"Privacy\");\n\t\t\t\t\tswitch (psta->dot118021XPrivacy)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase _NO_PRIVACY_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"NO PRIVACY\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _WEP40_:\t\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP 40\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _TKIP_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"TKIP\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _TKIP_WTMIC_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"TKIP WTMIC\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _AES_:\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"AES\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _WEP104_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP 104\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _WEP_WPA_MIXED_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"WEP/WPA Mixed\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase _SMS4_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"SMS4\");\n\t\t\t\t\t\t\tbreak;\n#ifdef CONFIG_IEEE80211W\n\t\t\t\t\t\tcase _BIP_:\n\t\t\t\t\t\t\tDBG_871X_SEL_NL(m, \"%s\\n\", \"BIP\");\n\t\t\t\t\t\t\tbreak;\n#endif //CONFIG_IEEE80211W\n\t\t\t\t\t}\n\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = %d sec/%d sec\\n\", SpaceBtwnItemAndValue, \"TPK Lifetime (Current/Expire)\", psta->TPK_count, psta->TDLS_PeerKey_Lifetime);\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = %llu\\n\", SpaceBtwnItemAndValue, \"Tx Packets Over Direct Link\", psta->sta_stats.tx_pkts);\n\t\t\t\t\tDBG_871X_SEL_NL(m, \"%-*s = %llu\\n\", SpaceBtwnItemAndValue, \"Rx Packets Over Direct Link\", psta->sta_stats.rx_data_pkts);\n\t\t\t\t}\n\t\t}\n\t}\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\tif (NumOfTdlsStaToShow == 0)\n\t{\n\t\tDBG_871X_SEL_NL(m, \"============[TDLS Peer STA Info]============\\n\");\n\t\tDBG_871X_SEL_NL(m, \"No TDLS direct link exists!\\n\");\n\t}\n\n\treturn 0;\n}\n\nint proc_get_tdls_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct wlan_network *cur_network = &(pmlmepriv->cur_network);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct sta_info *psta;\n\tint i = 0, j = 0;\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tu8 SpaceBtwnItemAndValue = 41;\n\tu8 SpaceBtwnItemAndValueTmp = 0;\n\tu8 NumOfTdlsStaToShow = 0;\n\tBOOLEAN FirstMatchFound = _FALSE;\n\n\tproc_tdls_display_tdls_function_info(m);\n\tproc_tdls_display_network_info(m);\n\tproc_tdls_display_tdls_sta_info(m);\t\n\n\treturn 0;\n}\n#endif\n\nint proc_get_monitor(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\tif (WIFI_MONITOR_STATE == get_fwstate(pmlmepriv)) {\n\t\tDBG_871X_SEL_NL(m, \"Monitor mode : Enable\\n\");\n\n\t\tDBG_871X_SEL_NL(m, \"ch=%d, ch_offset=%d, bw=%d\\n\",\n\t\t\t\t\t\trtw_get_oper_ch(padapter), rtw_get_oper_choffset(padapter), rtw_get_oper_bw(padapter));\n\t} else {\n\t\tDBG_871X_SEL_NL(m, \"Monitor mode : Disable\\n\");\n\t}\n\n\treturn 0;\n}\n\nssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tchar tmp[32];\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 target_chan, target_offset, target_bw;\n\n\tif (count < 3) {\n\t\tDBG_871X(\"argument size is less than 3\\n\");\n\t\treturn -EFAULT;\n\t}\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tint num = sscanf(tmp, \"%hhu %hhu %hhu\", &target_chan, &target_offset, &target_bw);\n\n\t\tif (num != 3) {\n\t\t\tDBG_871X(\"invalid write_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\n\t\tpadapter->mlmeextpriv.cur_channel  = target_chan;\n\t\tset_channel_bwmode(padapter, target_chan, target_offset, target_bw);\n\t}\n\n\treturn count;\n}\n\n#include <hal_data.h>\nint proc_get_efuse_map(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\tstruct pwrctrl_priv *pwrctrlpriv  = adapter_to_pwrctl(padapter);\n\tPEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;\n\tint i, j;\n\tu8 ips_mode = IPS_NUM; \n\tint mapLen = EFUSE_MAP_SIZE;\n\n\tips_mode = pwrctrlpriv->ips_mode;\n\trtw_pm_set_ips(padapter, IPS_NONE);\n\tif (rtw_efuse_map_read(padapter, EFUSE_WIFI, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL)\n\t\tDBG_871X_SEL_NL(m, \"WARN - Read Realmap Failed\\n\");\t\n\t\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\tfor (i = 0; i < EFUSE_MAP_SIZE; i += 16) {\n\t\tDBG_871X_SEL_NL(m, \"0x%02x\\t\", i);\n\t\tfor (j = 0; j < 8; j++) \n\t\t\tDBG_871X_SEL_NL(m, \"%02X \", pEfuseHal->fakeEfuseInitMap[i+j]);\n\t\t\n\t\tDBG_871X_SEL_NL(m, \"\\t\");\n\t\t\t\t\n\t\tfor (; j < 16; j++)\n\t\t\tDBG_871X_SEL_NL(m, \"%02X \", pEfuseHal->fakeEfuseInitMap[i+j]);\n\t\t\n\t\tDBG_871X_SEL_NL(m, \"\\n\");\n\t\t\t\t\n\t}\n\trtw_pm_set_ips(padapter, ips_mode);\n\treturn 0;\n}\n\nssize_t proc_set_efuse_map(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n#if 0\n\tchar tmp[256] = {0};\n\tu32 addr, cnts;\n\tu8 efuse_data;\n\t\n\tint jj, kk;\n\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrctrlpriv  = adapter_to_pwrctl(padapter);\n\tu8 ips_mode = IPS_NUM;\n\t\n\tif (count < 3) {\n\t\tDBG_871X(\"argument size is less than 3\\n\");\n\t\treturn -EFAULT;\n\t}\n\t\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\t\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x %d %x\", &addr, &cnts, &efuse_data);\n\t\n\t\tif (num != 3) {\n\t\t\tDBG_871X(\"invalid write_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\t}\n\tips_mode = pwrctrlpriv->ips_mode;\n\trtw_pm_set_ips(padapter, IPS_NONE);\n\tif (rtw_efuse_map_write(padapter, addr, cnts, &efuse_data) == _FAIL) \n\t\tDBG_871X(\"WARN - rtw_efuse_map_write error!!\\n\");\t\t\n\trtw_pm_set_ips(padapter, ips_mode);\n#endif\t\n\treturn count;\n}\n\n#ifdef CONFIG_IEEE80211W\nssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tstruct sta_info *psta;\n\t_list\t*plist, *phead;\n\t_irqL\t irqL;\n\tchar tmp[16];\n\tu8\tmac_addr[NUM_STA][ETH_ALEN];\n\tu32 key_type;\n\tu8 index;\n\n\tif (count > 2) {\n\t\tDBG_871X(\"argument size is more than 2\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {\t\t\n\n\t\tint num = sscanf(tmp, \"%x\", &key_type);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_871X(\"invalid read_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\t\tDBG_871X(\"0: set sa query request , key_type=%d\\n\", key_type);\n\t}\n\t\n\tif ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && padapter->securitypriv.binstallBIPkey == _TRUE) {\n\t\tDBG_871X(\"STA:\"MAC_FMT\"\\n\", MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));\n\t\t/* TX unicast sa_query to AP */\n\t\tissue_action_SA_Query(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, 0, (u8)key_type);\n\t} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) {\n\t\t/* TX unicast sa_query to every client STA */\n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\tfor (index = 0; index < NUM_STA; index++) {\n\t\t\tpsta = NULL;\n\t\t\t\n\t\t\tphead = &(pstapriv->sta_hash[index]);\n\t\t\tplist = get_next(phead);\n\t\t\t\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\t\tplist = get_next(plist);\n\t\t\t\t_rtw_memcpy(&mac_addr[psta->mac_id][0], psta->hwaddr, ETH_ALEN);\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\t\n\t\tfor (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {\n\t\t\tif (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {\n\t\t\t\tif (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN) \n\t\t\t\t\t&& !IS_MCAST(&mac_addr[index][0])) {\n\t\t\t\t\tissue_action_SA_Query(padapter, &mac_addr[index][0], 0, 0, (u8)key_type);\n\t\t\t\t\tDBG_871X(\"STA[%u]:\"MAC_FMT\"\\n\", index , MAC_ARG(&mac_addr[index][0]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn count;\n}\n\nint proc_get_tx_sa_query(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\tDBG_871X_SEL_NL(m, \"%s\\n\", __func__);\n\treturn 0;\n}\n\nssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tstruct sta_info *psta;\n\t_list\t*plist, *phead;\n\t_irqL\t irqL;\n\tchar tmp[16];\n\tu8\tmac_addr[NUM_STA][ETH_ALEN];\n\tu8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu32 key_type;\n\tu8 index;\n\t\n\n\tif (count > 2) {\n\t\tDBG_871X(\"argument size is more than 2\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {\t\t\n\n\t\tint num = sscanf(tmp, \"%x\", &key_type);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_871X(\"invalid read_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\t\tDBG_871X(\"key_type=%d\\n\", key_type);\n\t}\n\tif (key_type < 0 || key_type > 4)\n\t\treturn count;\n\t\n\tif ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {\n\t\tif (key_type == 3) /* key_type 3 only for AP mode */\n\t\t\treturn count;\n\t\t/* TX unicast deauth to AP */\n\t\tissue_deauth_11w(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, (u8)key_type);\n\t} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {\n\t\t\n\t\tif (key_type == 3)\n\t\t\tissue_deauth_11w(padapter, bc_addr, 0, IEEE80211W_RIGHT_KEY);\n\t\t\n\t\t/* TX unicast deauth to every client STA */\n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\tfor (index = 0; index < NUM_STA; index++) {\n\t\t\tpsta = NULL;\n\t\t\t\n\t\t\tphead = &(pstapriv->sta_hash[index]);\n\t\t\tplist = get_next(phead);\n\t\t\t\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\t\tplist = get_next(plist);\n\t\t\t\t_rtw_memcpy(&mac_addr[psta->mac_id][0], psta->hwaddr, ETH_ALEN);\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\t\n\t\tfor (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {\n\t\t\tif (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {\n\t\t\t\tif (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)) {\n\t\t\t\t\tif (key_type != 3)\n\t\t\t\t\t\tissue_deauth_11w(padapter, &mac_addr[index][0], 0, (u8)key_type);\n\t\t\t\t\t\n\t\t\t\t\tpsta = rtw_get_stainfo(pstapriv, &mac_addr[index][0]);\t\n\t\t\t\t\tif (psta && key_type != IEEE80211W_WRONG_KEY && key_type != IEEE80211W_NO_KEY) {\n\t\t\t\t\t\tu8 updated = _FALSE;\n\t\t\t\t\t\n\t\t\t\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\t\t\tif (rtw_is_list_empty(&psta->asoc_list) == _FALSE) {\t\t\t\n\t\t\t\t\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\t\t\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\t\t\t\t\tupdated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE);\n\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\n\t\t\t\t\t\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"STA[%u]:\"MAC_FMT\"\\n\", index , MAC_ARG(&mac_addr[index][0]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn count;\n}\n\nint proc_get_tx_deauth(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\tDBG_871X_SEL_NL(m, \"%s\\n\", __func__);\n\treturn 0;\n}\n\nssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tstruct sta_info *psta;\n\t_list\t*plist, *phead;\n\t_irqL\t irqL;\n\tchar tmp[16];\n\tu8\tmac_addr[NUM_STA][ETH_ALEN];\n\tu8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu32 tx_auth;\n\tu8 index;\n\t\n\n\tif (count > 2) {\n\t\tDBG_871X(\"argument size is more than 2\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {\t\t\n\n\t\tint num = sscanf(tmp, \"%x\", &tx_auth);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_871X(\"invalid read_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\t\tDBG_871X(\"1: setnd auth, 2: send assoc request. tx_auth=%d\\n\", tx_auth);\n\t}\n\t\n\tif ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {\n\t\tif (tx_auth == 1) {\n\t\t\t/* TX unicast auth to AP */\n\t\t\tissue_auth(padapter, NULL, 0);\n\t\t} else if (tx_auth == 2) {\n\t\t\t/* TX unicast auth to AP */\n\t\t\tissue_assocreq(padapter);\n\t\t}\n\t} \n\t\n\treturn count;\n}\n\nint proc_get_tx_auth(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\tDBG_871X_SEL_NL(m, \"%s\\n\", __func__);\n\treturn 0;\n}\n#endif /* CONFIG_IEEE80211W */\n\n#endif /* CONFIG_PROC_DEBUG */\n\n"
  },
  {
    "path": "core/rtw_eeprom.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_EEPROM_C_\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n\nvoid up_clk(_adapter*\tpadapter,\t u16 *x)\n{\n_func_enter_;\n\t*x = *x | _EESK;\n\trtw_write8(padapter, EE_9346CR, (u8)*x);\n\trtw_udelay_os(CLOCK_RATE);\n\n_func_exit_;\n\t\n}\n\nvoid down_clk(_adapter *\tpadapter, u16 *x\t)\n{\n_func_enter_;\n\t*x = *x & ~_EESK;\n\trtw_write8(padapter, EE_9346CR, (u8)*x);\n\trtw_udelay_os(CLOCK_RATE);\n_func_exit_;\t\n}\n\nvoid shift_out_bits(_adapter * padapter, u16 data, u16 count)\n{\n\tu16 x,mask;\n_func_enter_;\n\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tmask = 0x01 << (count - 1);\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tx &= ~(_EEDO | _EEDI);\n\n\tdo\n\t{\n\t\tx &= ~_EEDI;\n\t\tif(data & mask)\n\t\t\tx |= _EEDI;\n\t\tif (rtw_is_surprise_removed(padapter)) {\n\t\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\t\tgoto out;\n\t\t}\n\t\trtw_write8(padapter, EE_9346CR, (u8)x);\n\t\trtw_udelay_os(CLOCK_RATE);\n\t\tup_clk(padapter, &x);\n\t\tdown_clk(padapter, &x);\n\t\tmask = mask >> 1;\n\t} while(mask);\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tx &= ~_EEDI;\n\trtw_write8(padapter, EE_9346CR, (u8)x);\nout:\t\n_func_exit_;\t\t\n}\n\nu16 shift_in_bits (_adapter * padapter)\n{\n\tu16 x,d=0,i;\n_func_enter_;\t\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tx &= ~( _EEDO | _EEDI);\n\td = 0;\n\n\tfor(i=0; i<16; i++)\n\t{\n\t\td = d << 1;\n\t\tup_clk(padapter, &x);\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\t\tx = rtw_read8(padapter, EE_9346CR);\n\n\t\tx &= ~(_EEDI);\n\t\tif(x & _EEDO)\n\t\td |= 1;\n\n\t\tdown_clk(padapter, &x);\n\t}\nout:\t\n_func_exit_;\t\t\n\n\treturn d;\n}\n\nvoid standby(_adapter *\tpadapter\t)\n{\n\tu8   x;\n_func_enter_;\t\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tx &= ~(_EECS | _EESK);\n\trtw_write8(padapter, EE_9346CR,x);\n\n\trtw_udelay_os(CLOCK_RATE);\n\tx |= _EECS;\n\trtw_write8(padapter, EE_9346CR, x);\n\trtw_udelay_os(CLOCK_RATE);\n_func_exit_;\t\t\n}\n\nu16 wait_eeprom_cmd_done(_adapter* padapter)\n{\n\tu8 \tx;\n\tu16\ti,res=_FALSE;\n_func_enter_;\t\n\tstandby(padapter );\n\tfor (i=0; i<200; i++) \n\t{\n\t\tx = rtw_read8(padapter, EE_9346CR);\n\t\tif (x & _EEDO){\n\t\t\tres=_TRUE;\n\t\t\tgoto exit;\n\t\t\t}\n\t\trtw_udelay_os(CLOCK_RATE);\n\t}\nexit:\t\n_func_exit_;\t\t\t\n\treturn res;\n}\n\nvoid eeprom_clean(_adapter * padapter)\n{\n\tu16 x;\n_func_enter_;\t\t\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tx = rtw_read8(padapter, EE_9346CR);\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tx &= ~(_EECS | _EEDI);\n\trtw_write8(padapter, EE_9346CR, (u8)x);\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tup_clk(padapter, &x);\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\tdown_clk(padapter, &x);\nout:\t\n_func_exit_;\t\t\t\n}\n\nvoid eeprom_write16(_adapter * padapter, u16 reg, u16 data)\n{\n\tu8 x;\n#ifdef CONFIG_RTL8712\n\tu8\ttmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new;\n\ttmp8_ori=rtw_read8(padapter, 0x102502f1);\n\ttmp8_new=tmp8_ori & 0xf7;\n\tif(tmp8_ori != tmp8_new){\t\n\t\trtw_write8(padapter, 0x102502f1, tmp8_new);\n\t\tRT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,(\"====write 0x102502f1=====\\n\"));\n\t}\n\ttmp8_clk_ori=rtw_read8(padapter,0x10250003);\n\ttmp8_clk_new=tmp8_clk_ori|0x20;\n\tif(tmp8_clk_new!=tmp8_clk_ori){\n\t\tRT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,(\"====write 0x10250003=====\\n\"));\n\t\trtw_write8(padapter, 0x10250003, tmp8_clk_new);\n\t}\t\n#endif\n_func_enter_;\t\t\n\t\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tx &= ~(_EEDI | _EEDO | _EESK | _EEM0);\n\tx |= _EEM1 | _EECS;\n\trtw_write8(padapter, EE_9346CR, x);\n\n\tshift_out_bits(padapter, EEPROM_EWEN_OPCODE, 5);\n\t\n\tif(padapter->EepromAddressSize==8)\t//CF+ and SDIO\n\t\tshift_out_bits(padapter, 0, 6);\n\telse\t\t\t\t\t\t\t\t\t//USB\n\t\tshift_out_bits(padapter, 0, 4);\n\t\n\tstandby( padapter);\n\n// Commented out by rcnjko, 2004.0\n//\t// Erase this particular word.  Write the erase opcode and register\n//\t// number in that order. The opcode is 3bits in length; reg is 6 bits long.\n//\tshift_out_bits(Adapter, EEPROM_ERASE_OPCODE, 3);\n//\tshift_out_bits(Adapter, reg, Adapter->EepromAddressSize);\n//\n//\tif (wait_eeprom_cmd_done(Adapter ) == FALSE) \n//\t{\n//\t\treturn;\n//\t}\n\n\n\tstandby(padapter );\n\n\t// write the new word to the EEPROM\n\n\t// send the write opcode the EEPORM\n\tshift_out_bits(padapter, EEPROM_WRITE_OPCODE, 3);\n\n\t// select which word in the EEPROM that we are writing to.\n\tshift_out_bits(padapter, reg, padapter->EepromAddressSize);\n\n\t// write the data to the selected EEPROM word.\n\tshift_out_bits(padapter, data, 16);\n\n\tif (wait_eeprom_cmd_done(padapter ) == _FALSE) \n\t{\n\n\t\tgoto exit;\n\t}\n\n\tstandby(padapter );\n\n\tshift_out_bits(padapter, EEPROM_EWDS_OPCODE, 5);\n\tshift_out_bits(padapter, reg, 4);\n\n\teeprom_clean(padapter );\nexit:\t\n#ifdef CONFIG_RTL8712\n\tif(tmp8_clk_new!=tmp8_clk_ori)\n\t\trtw_write8(padapter, 0x10250003, tmp8_clk_ori);\n\tif(tmp8_new!=tmp8_ori)\n\t\trtw_write8(padapter, 0x102502f1, tmp8_ori);\n\n#endif\n_func_exit_;\t\n\treturn;\n}\n\nu16 eeprom_read16(_adapter * padapter, u16 reg) //ReadEEprom\n{\n\n\tu16 x;\n\tu16 data=0;\n#ifdef CONFIG_RTL8712\n\tu8\ttmp8_ori,tmp8_new,tmp8_clk_ori,tmp8_clk_new;\n\ttmp8_ori= rtw_read8(padapter, 0x102502f1);\n\ttmp8_new = tmp8_ori & 0xf7;\n\tif(tmp8_ori != tmp8_new){\t\n\t\trtw_write8(padapter, 0x102502f1, tmp8_new);\n\t\tRT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,(\"====write 0x102502f1=====\\n\"));\n\t}\n\ttmp8_clk_ori=rtw_read8(padapter,0x10250003);\n\ttmp8_clk_new=tmp8_clk_ori|0x20;\n\tif(tmp8_clk_new!=tmp8_clk_ori){\n\t\tRT_TRACE(_module_rtl871x_mp_ioctl_c_,_drv_err_,(\"====write 0x10250003=====\\n\"));\n\t\trtw_write8(padapter, 0x10250003, tmp8_clk_new);\n\t}\t\n#endif\n_func_enter_;\t\t\n\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\t// select EEPROM, reset bits, set _EECS\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\n\tx &= ~(_EEDI | _EEDO | _EESK | _EEM0);\n\tx |= _EEM1 | _EECS;\n\trtw_write8(padapter, EE_9346CR, (unsigned char)x);\n\n\t// write the read opcode and register number in that order\n\t// The opcode is 3bits in length, reg is 6 bits long\n\tshift_out_bits(padapter, EEPROM_READ_OPCODE, 3);\n\tshift_out_bits(padapter, reg, padapter->EepromAddressSize);\n\n\t// Now read the data (16 bits) in from the selected EEPROM word\n\tdata = shift_in_bits(padapter);\n\n\teeprom_clean(padapter);\nout:\t\n#ifdef CONFIG_RTL8712\n\tif(tmp8_clk_new!=tmp8_clk_ori)\n\t\trtw_write8(padapter, 0x10250003, tmp8_clk_ori);\n\tif(tmp8_new!=tmp8_ori)\n\t\trtw_write8(padapter, 0x102502f1, tmp8_ori);\n\n#endif\n_func_exit_;\t\t\n\treturn data;\n\n\n}\n\n\n\n\n//From even offset\nvoid eeprom_read_sz(_adapter * padapter, u16 reg, u8* data, u32 sz) \n{\n\n\tu16 x, data16;\n\tu32 i;\n_func_enter_;\t\t\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\t// select EEPROM, reset bits, set _EECS\n\tx = rtw_read8(padapter, EE_9346CR);\n\n\tif (rtw_is_surprise_removed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_err_, (\"padapter->bSurpriseRemoved==_TRUE\"));\n\t\tgoto out;\n\t}\n\n\tx &= ~(_EEDI | _EEDO | _EESK | _EEM0);\n\tx |= _EEM1 | _EECS;\n\trtw_write8(padapter, EE_9346CR, (unsigned char)x);\n\n\t// write the read opcode and register number in that order\n\t// The opcode is 3bits in length, reg is 6 bits long\n\tshift_out_bits(padapter, EEPROM_READ_OPCODE, 3);\n\tshift_out_bits(padapter, reg, padapter->EepromAddressSize);\n\n\n\tfor(i=0; i<sz; i+=2)\n\t{\n\t\tdata16 = shift_in_bits(padapter);\n\t\tdata[i] = data16 & 0xff;\n\t\tdata[i+1] = data16 >>8;\t\t\n\t}\n\n\teeprom_clean(padapter);\nout:\t\n_func_exit_;\t\t\n\n\n\n}\n\n\n//addr_off : address offset of the entry in eeprom (not the tuple number of eeprom (reg); that is addr_off !=reg)\nu8 eeprom_read(_adapter * padapter, u32 addr_off, u8 sz, u8* rbuf)\n{\n\tu8 quotient, remainder, addr_2align_odd;\n\tu16 reg, stmp , i=0, idx = 0;\n_func_enter_;\t\t\n\treg = (u16)(addr_off >> 1);\n\taddr_2align_odd = (u8)(addr_off & 0x1);\n\n\tif(addr_2align_odd) //read that start at high part: e.g  1,3,5,7,9,...\n\t{\n\t\tstmp = eeprom_read16(padapter, reg);\n\t\trbuf[idx++] = (u8) ((stmp>>8)&0xff); //return hogh-part of the short\n\t\treg++; sz--;\n\t}\n\t\n\tquotient = sz >> 1;\n\tremainder = sz & 0x1;\n\n\tfor( i=0 ; i < quotient; i++)\n\t{\n\t\tstmp = eeprom_read16(padapter, reg+i);\n\t\trbuf[idx++] = (u8) (stmp&0xff);\n\t\trbuf[idx++] = (u8) ((stmp>>8)&0xff);\n\t}\n\t\n\treg = reg+i;\n\tif(remainder){ //end of read at lower part of short : 0,2,4,6,...\n\t\tstmp = eeprom_read16(padapter, reg);\n\t\trbuf[idx] = (u8)(stmp & 0xff); \n\t}\n_func_exit_;\t\t\n\treturn _TRUE;\n}\n\n\n\nVOID read_eeprom_content(_adapter *\tpadapter)\n{\n\n_func_enter_;\t\t\n\n\n_func_exit_;\t\t\n}\n\n"
  },
  {
    "path": "core/rtw_ieee80211.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _IEEE80211_C\n\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n#include <linux/fs.h>\n#endif \n#include <drv_types.h>\n\n\nu8 RTW_WPA_OUI_TYPE[] = { 0x00, 0x50, 0xf2, 1 };\nu16 RTW_WPA_VERSION = 1;\nu8 WPA_AUTH_KEY_MGMT_NONE[] = { 0x00, 0x50, 0xf2, 0 };\nu8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x50, 0xf2, 1 };\nu8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x50, 0xf2, 2 };\nu8 WPA_CIPHER_SUITE_NONE[] = { 0x00, 0x50, 0xf2, 0 };\nu8 WPA_CIPHER_SUITE_WEP40[] = { 0x00, 0x50, 0xf2, 1 };\nu8 WPA_CIPHER_SUITE_TKIP[] = { 0x00, 0x50, 0xf2, 2 };\nu8 WPA_CIPHER_SUITE_WRAP[] = { 0x00, 0x50, 0xf2, 3 };\nu8 WPA_CIPHER_SUITE_CCMP[] = { 0x00, 0x50, 0xf2, 4 };\nu8 WPA_CIPHER_SUITE_WEP104[] = { 0x00, 0x50, 0xf2, 5 };\n\nu16 RSN_VERSION_BSD = 1;\nu8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[] = { 0x00, 0x0f, 0xac, 1 };\nu8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[] = { 0x00, 0x0f, 0xac, 2 };\nu8 RSN_CIPHER_SUITE_NONE[] = { 0x00, 0x0f, 0xac, 0 };\nu8 RSN_CIPHER_SUITE_WEP40[] = { 0x00, 0x0f, 0xac, 1 };\nu8 RSN_CIPHER_SUITE_TKIP[] = { 0x00, 0x0f, 0xac, 2 };\nu8 RSN_CIPHER_SUITE_WRAP[] = { 0x00, 0x0f, 0xac, 3 };\nu8 RSN_CIPHER_SUITE_CCMP[] = { 0x00, 0x0f, 0xac, 4 };\nu8 RSN_CIPHER_SUITE_WEP104[] = { 0x00, 0x0f, 0xac, 5 };\n//-----------------------------------------------------------\n// for adhoc-master to generate ie and provide supported-rate to fw \n//-----------------------------------------------------------\n\nstatic u8 \tWIFI_CCKRATES[] = \n{(IEEE80211_CCK_RATE_1MB | IEEE80211_BASIC_RATE_MASK),\n (IEEE80211_CCK_RATE_2MB | IEEE80211_BASIC_RATE_MASK),\n (IEEE80211_CCK_RATE_5MB | IEEE80211_BASIC_RATE_MASK),\n (IEEE80211_CCK_RATE_11MB | IEEE80211_BASIC_RATE_MASK)};\n\nstatic u8 \tWIFI_OFDMRATES[] = \n{(IEEE80211_OFDM_RATE_6MB),\n (IEEE80211_OFDM_RATE_9MB),\n (IEEE80211_OFDM_RATE_12MB),\n (IEEE80211_OFDM_RATE_18MB),\n (IEEE80211_OFDM_RATE_24MB),\n IEEE80211_OFDM_RATE_36MB,\n IEEE80211_OFDM_RATE_48MB,\n IEEE80211_OFDM_RATE_54MB};\n\nu8 mgn_rates_cck[4] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M};\nu8 mgn_rates_ofdm[8] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M};\nu8 mgn_rates_mcs0_7[8] = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7};\nu8 mgn_rates_mcs8_15[8] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15};\nu8 mgn_rates_mcs16_23[8] = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23};\nu8 mgn_rates_mcs24_31[8] = {MGN_MCS24, MGN_MCS25, MGN_MCS26, MGN_MCS27, MGN_MCS28, MGN_MCS29, MGN_MCS30, MGN_MCS31};\nu8 mgn_rates_vht1ss[10] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4\n\t, MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9};\nu8 mgn_rates_vht2ss[10] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4\n\t, MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9};\nu8 mgn_rates_vht3ss[10] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4\n\t, MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9};\nu8 mgn_rates_vht4ss[10] = {MGN_VHT4SS_MCS0, MGN_VHT4SS_MCS1, MGN_VHT4SS_MCS2, MGN_VHT4SS_MCS3, MGN_VHT4SS_MCS4\n\t, MGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9};\n\nstatic const char * const _rate_section_str[] = {\n\t\"CCK\",\n\t\"OFDM\",\n\t\"HT_1SS\",\n\t\"HT_2SS\",\n\t\"HT_3SS\",\n\t\"HT_4SS\",\n\t\"VHT_1SS\",\n\t\"VHT_2SS\",\n\t\"VHT_3SS\",\n\t\"VHT_4SS\",\n\t\"RATE_SECTION_UNKNOWN\",\n};\n\nconst char *rate_section_str(u8 section)\n{\n\tsection = (section >= RATE_SECTION_NUM) ? RATE_SECTION_NUM : section;\n\treturn _rate_section_str[section];\n}\n\nstruct rate_section_ent rates_by_sections[RATE_SECTION_NUM] = {\n\t{RF_1TX, 4, mgn_rates_cck},\n\t{RF_1TX, 8, mgn_rates_ofdm},\n\t{RF_1TX, 8, mgn_rates_mcs0_7},\n\t{RF_2TX, 8, mgn_rates_mcs8_15},\n\t{RF_3TX, 8, mgn_rates_mcs16_23},\n\t{RF_4TX, 8, mgn_rates_mcs24_31},\n\t{RF_1TX, 10, mgn_rates_vht1ss},\n\t{RF_2TX, 10, mgn_rates_vht2ss},\n\t{RF_3TX, 10, mgn_rates_vht3ss},\n\t{RF_4TX, 10, mgn_rates_vht4ss},\n};\n\nint rtw_get_bit_value_from_ieee_value(u8 val)\n{\n\tunsigned char dot11_rate_table[]={2,4,11,22,12,18,24,36,48,72,96,108,0}; // last element must be zero!!\n\n\tint i=0;\n\twhile(dot11_rate_table[i] != 0) {\n\t\tif (dot11_rate_table[i] == val)\n\t\t\treturn BIT(i);\n\t\ti++;\n\t}\n\treturn 0;\n}\n\nuint\trtw_is_cckrates_included(u8 *rate)\n{\t\n\t\tu32\ti = 0;\t\t\t\n\n\t\twhile(rate[i]!=0)\n\t\t{\t\t\n\t\t\tif  (  (((rate[i]) & 0x7f) == 2)\t|| (((rate[i]) & 0x7f) == 4) ||\t\t\n\t\t\t(((rate[i]) & 0x7f) == 11)  || (((rate[i]) & 0x7f) == 22) )\t\t\n\t\t\t\treturn _TRUE;\n\t\t\ti++;\n\t\t}\n\t\t\n\t\treturn _FALSE;\n}\n\nuint\trtw_is_cckratesonly_included(u8 *rate)\n{\n\tu32 i = 0;\n\n\n\twhile(rate[i]!=0)\n\t{\n\t\t\tif  (  (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&\n\t\t\t\t(((rate[i]) & 0x7f) != 11)  && (((rate[i]) & 0x7f) != 22) )\n\t\t\t\treturn _FALSE;\n\n\t\t\ti++;\n\t}\n\t\n\treturn _TRUE;\n\n}\n\nint rtw_check_network_type(unsigned char *rate, int ratelen, int channel)\n{\n\tif (channel > 14)\n\t{\n\t\tif ((rtw_is_cckrates_included(rate)) == _TRUE)\n\t\t\treturn WIRELESS_INVALID;\n\t\telse\n\t\t\treturn WIRELESS_11A;\n\t}\t\n\telse  // could be pure B, pure G, or B/G\n\t{\n\t\tif ((rtw_is_cckratesonly_included(rate)) == _TRUE)\t\n\t\t\treturn WIRELESS_11B;\n\t\telse if((rtw_is_cckrates_included(rate)) == _TRUE)\n\t\t\treturn \tWIRELESS_11BG;\n\t\telse\n\t\t\treturn WIRELESS_11G;\n\t}\n\t\n}\n\nu8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source,\n\t\t\t\tunsigned int *frlen)\n{\n\t_rtw_memcpy((void *)pbuf, (void *)source, len);\n\t*frlen = *frlen + len;\n\treturn (pbuf + len);\n}\n\n// rtw_set_ie will update frame length\nu8 *rtw_set_ie\n(\n\tu8 *pbuf, \n\tsint index, \n\tuint len,\n\tu8 *source, \n\tuint *frlen //frame length\n)\n{\n\t*pbuf = (u8)index;\n\n\t*(pbuf + 1) = (u8)len;\n\n\tif (len > 0)\n\t\t_rtw_memcpy((void *)(pbuf + 2), (void *)source, len);\n\t\n\t*frlen = *frlen + (len + 2);\n\t\n\treturn (pbuf + len + 2);\n}\n\ninline u8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode,\n\tu8 new_ch, u8 ch_switch_cnt)\n{\n\tu8 ie_data[3];\n\n\tie_data[0] = ch_switch_mode;\n\tie_data[1] = new_ch;\n\tie_data[2] = ch_switch_cnt;\n\treturn rtw_set_ie(buf, WLAN_EID_CHANNEL_SWITCH,  3, ie_data, buf_len);\n}\n\ninline u8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset)\n{\n\tif (ch_offset == SCN)\n\t\treturn HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\telse if(ch_offset == SCA)\n\t\treturn HAL_PRIME_CHNL_OFFSET_UPPER;\n\telse if(ch_offset == SCB)\n\t\treturn HAL_PRIME_CHNL_OFFSET_LOWER;\n\n\treturn HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n}\n\ninline u8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset)\n{\n\tif (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE)\n\t\treturn SCN;\n\telse if(ch_offset == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\treturn SCB;\n\telse if(ch_offset == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\treturn SCA;\n\n\treturn SCN;\n}\n\ninline u8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch_offset)\n{\n\treturn rtw_set_ie(buf, WLAN_EID_SECONDARY_CHANNEL_OFFSET,  1, &secondary_ch_offset, buf_len);\n}\n\ninline u8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl,\n\tu8 flags, u16 reason, u16 precedence)\n{\n\tu8 ie_data[6];\n\n\tie_data[0] = ttl;\n\tie_data[1] = flags;\n\tRTW_PUT_LE16((u8*)&ie_data[2], reason);\n\tRTW_PUT_LE16((u8*)&ie_data[4], precedence);\n\n\treturn rtw_set_ie(buf, 0x118,  6, ie_data, buf_len);\n}\n\n/*----------------------------------------------------------------------------\nindex: the information element id index, limit is the limit for search\n-----------------------------------------------------------------------------*/\nu8 *rtw_get_ie(u8 *pbuf, sint index, sint *len, sint limit)\n{\n\tsint tmp,i;\n\tu8 *p;\n_func_enter_;\n\tif (limit < 1){\n\t\t_func_exit_;\t\n\t\treturn NULL;\n\t}\n\n\tp = pbuf;\n\ti = 0;\n\t*len = 0;\n\twhile(1)\n\t{\n\t\tif (*p == index)\n\t\t{\n\t\t\t*len = *(p + 1);\n\t\t\treturn (p);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttmp = *(p + 1);\n\t\t\tp += (tmp + 2);\n\t\t\ti += (tmp + 2);\n\t\t}\n\t\tif (i >= limit)\n\t\t\tbreak;\n\t}\n_func_exit_;\t\t\n\treturn NULL;\n}\n\n/**\n * rtw_get_ie_ex - Search specific IE from a series of IEs\n * @in_ie: Address of IEs to search\n * @in_len: Length limit from in_ie\n * @eid: Element ID to match\n * @oui: OUI to match\n * @oui_len: OUI length\n * @ie: If not NULL and the specific IE is found, the IE will be copied to the buf starting from the specific IE\n * @ielen: If not NULL and the specific IE is found, will set to the length of the entire IE\n *\n * Returns: The address of the specific IE found, or NULL\n */\nu8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen)\n{\n\tuint cnt;\n\tu8 *target_ie = NULL;\n\n\n\tif(ielen)\n\t\t*ielen = 0;\n\n\tif(!in_ie || in_len<=0)\n\t\treturn target_ie;\n\n\tcnt = 0;\n\n\twhile(cnt<in_len)\n\t{\n\t\tif(eid == in_ie[cnt]\n\t\t\t&& ( !oui || _rtw_memcmp(&in_ie[cnt+2], oui, oui_len) == _TRUE))\n\t\t{\n\t\t\ttarget_ie = &in_ie[cnt];\n\n\t\t\tif(ie)\n\t\t\t\t_rtw_memcpy(ie, &in_ie[cnt], in_ie[cnt+1]+2);\n\t\t\t\n\t\t\tif(ielen)\n\t\t\t\t*ielen = in_ie[cnt+1]+2;\n\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcnt+=in_ie[cnt+1]+2; //goto next\t\n\t\t}\t\t\n\n\t}\t\n\n\treturn target_ie;\n}\n\n/**\n * rtw_ies_remove_ie - Find matching IEs and remove\n * @ies: Address of IEs to search\n * @ies_len: Pointer of length of ies, will update to new length\n * @offset: The offset to start scarch\n * @eid: Element ID to match\n * @oui: OUI to match\n * @oui_len: OUI length\n *\n * Returns: _SUCCESS: ies is updated, _FAIL: not updated\n */\nint rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len)\n{\n\tint ret = _FAIL;\n\tu8 *target_ie;\n\tu32 target_ielen;\n\tu8 *start;\n\tuint search_len;\n\t\n\tif(!ies || !ies_len || *ies_len <= offset)\n\t\tgoto exit;\n\n\tstart = ies + offset;\n\tsearch_len = *ies_len - offset;\n\n\twhile (1) {\n\t\ttarget_ie = rtw_get_ie_ex(start, search_len, eid, oui, oui_len, NULL, &target_ielen);\n\t\tif (target_ie && target_ielen) {\n\t\t\tu8 buf[MAX_IE_SZ] = {0};\n\t\t\tu8 *remain_ies = target_ie + target_ielen;\n\t\t\tuint remain_len = search_len - (remain_ies - start);\n\t\t\t\n\t\t\t_rtw_memcpy(buf, remain_ies, remain_len);\n\t\t\t_rtw_memcpy(target_ie, buf, remain_len);\n\t\t\t*ies_len = *ies_len - target_ielen;\n\t\t\tret = _SUCCESS;\n\n\t\t\tstart = target_ie;\n\t\t\tsearch_len = remain_len;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\nexit:\n\treturn ret;\n}\n\nvoid rtw_set_supported_rate(u8* SupportedRates, uint mode) \n{\n_func_enter_;\n\n\t_rtw_memset(SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);\n\t\n\tswitch (mode)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\t_rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN);\n\t\t\tbreak;\n\t\t\n\t\tcase WIRELESS_11G:\n\t\tcase WIRELESS_11A:\n\t\tcase WIRELESS_11_5N:\n\t\tcase WIRELESS_11A_5N://Todo: no basic rate for ofdm ?\n\t\tcase WIRELESS_11_5AC:\n\t\t\t_rtw_memcpy(SupportedRates, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN);\n\t\t\tbreak;\n\t\t\n\t\tcase WIRELESS_11BG:\n\t\tcase WIRELESS_11G_24N:\n\t\tcase WIRELESS_11_24N:\n\t\tcase WIRELESS_11BG_24N:\n\t\t\t_rtw_memcpy(SupportedRates, WIFI_CCKRATES, IEEE80211_CCK_RATE_LEN);\n\t\t\t_rtw_memcpy(SupportedRates + IEEE80211_CCK_RATE_LEN, WIFI_OFDMRATES, IEEE80211_NUM_OFDM_RATESLEN);\n\t\t\tbreak;\n\t\n\t}\n_func_exit_;\t\n}\n\nuint\trtw_get_rateset_len(u8\t*rateset)\n{\n\tuint i = 0;\n_func_enter_;\t\n\twhile(1)\n\t{\n\t\tif ((rateset[i]) == 0)\n\t\t\tbreak;\n\t\t\t\n\t\tif (i > 12)\n\t\t\tbreak;\n\t\t\t\n\t\ti++;\t\t\t\n\t}\n_func_exit_;\t\t\n\treturn i;\n}\n\nint rtw_generate_ie(struct registry_priv *pregistrypriv)\n{\n\tu8\twireless_mode;\n\tint \tsz = 0, rateLen;\n\tWLAN_BSSID_EX*\tpdev_network = &pregistrypriv->dev_network;\n\tu8*\tie = pdev_network->IEs;\n\t\n_func_enter_;\t\t\n\n\t//timestamp will be inserted by hardware\n\tsz += 8;\t\n\tie += sz;\n\t\n\t//beacon interval : 2bytes\n\t*(u16*)ie = cpu_to_le16((u16)pdev_network->Configuration.BeaconPeriod);//BCN_INTERVAL;\n\tsz += 2; \n\tie += 2;\n\t\n\t//capability info\n\t*(u16*)ie = 0;\n\t\n\t*(u16*)ie |= cpu_to_le16(cap_IBSS);\n\n\tif(pregistrypriv->preamble == PREAMBLE_SHORT)\n\t\t*(u16*)ie |= cpu_to_le16(cap_ShortPremble);\n\t\n\tif (pdev_network->Privacy)\n\t\t*(u16*)ie |= cpu_to_le16(cap_Privacy);\n\t\n\tsz += 2;\n\tie += 2;\n\t\n\t//SSID\n\tie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz);\n\t\n\t//supported rates\n\tif(pregistrypriv->wireless_mode == WIRELESS_11ABGN)\n\t{\n\t\tif(pdev_network->Configuration.DSConfig > 14)\n\t\t\twireless_mode = WIRELESS_11A_5N;\n\t\telse\n\t\t\twireless_mode = WIRELESS_11BG_24N;\n\t}\n\telse\n\t{\n\t\twireless_mode = pregistrypriv->wireless_mode;\n\t}\n\t\n\trtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ;\n\t\n\trateLen = rtw_get_rateset_len(pdev_network->SupportedRates);\n\n\tif (rateLen > 8)\n\t{\n\t\tie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, pdev_network->SupportedRates, &sz);\n\t\t//ie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz);\n\t}\n\telse\n\t{\n\t\tie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, pdev_network->SupportedRates, &sz);\n\t}\n\n\t//DS parameter set\n\tie = rtw_set_ie(ie, _DSSET_IE_, 1, (u8 *)&(pdev_network->Configuration.DSConfig), &sz);\n\n\n\t//IBSS Parameter Set\n\t\n\tie = rtw_set_ie(ie, _IBSS_PARA_IE_, 2, (u8 *)&(pdev_network->Configuration.ATIMWindow), &sz);\n\n\tif (rateLen > 8)\n\t{\t\t\n\t\tie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (pdev_network->SupportedRates + 8), &sz);\n\t}\n\t\n#ifdef CONFIG_80211N_HT\n\t//HT Cap.\n\tif(((pregistrypriv->wireless_mode&WIRELESS_11_5N)||(pregistrypriv->wireless_mode&WIRELESS_11_24N)) \n\t\t&& (pregistrypriv->ht_enable==_TRUE))\n\t{\n\t\t//todo:\n\t}\n#endif //CONFIG_80211N_HT\n\n\t//pdev_network->IELength =  sz; //update IELength\n\n_func_exit_;\n\n\t//return _SUCCESS;\n\n\treturn sz;\n\n}\n\nunsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit)\n{\n\tint len;\n\tu16 val16;\n\tunsigned char wpa_oui_type[] = {0x00, 0x50, 0xf2, 0x01};\n\tu8 *pbuf = pie;\n\tint limit_new = limit;\n\n\twhile(1) \n\t{\n\t\tpbuf = rtw_get_ie(pbuf, _WPA_IE_ID_, &len, limit_new);\n\n\t\tif (pbuf) {\n\n\t\t\t//check if oui matches...\n\t\t\tif (_rtw_memcmp((pbuf + 2), wpa_oui_type, sizeof (wpa_oui_type)) == _FALSE) {\n\n\t\t\t\tgoto check_next_ie;\n\t\t\t}\n\n\t\t\t//check version...\n\t\t\t_rtw_memcpy((u8 *)&val16, (pbuf + 6), sizeof(val16));\n\n\t\t\tval16 = le16_to_cpu(val16);\n\t\t\tif (val16 != 0x0001)\n\t\t\t\tgoto check_next_ie;\n\n\t\t\t*wpa_ie_len = *(pbuf + 1);\n\n\t\t\treturn pbuf;\n\n\t\t}\n\t\telse {\n\n\t\t\t*wpa_ie_len = 0;\n\t\t\treturn NULL;\n\t\t}\n\ncheck_next_ie:\n\n\t\tlimit_new = limit - (pbuf - pie) - 2 - len;\n\n\t\tif (limit_new <= 0)\n\t\t\tbreak;\n\n\t\tpbuf += (2 + len);\n\n\t}\n\n\t*wpa_ie_len = 0;\n\n\treturn NULL;\n\n}\n\nunsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit)\n{\t\n\n\treturn rtw_get_ie(pie, _WPA2_IE_ID_,rsn_ie_len, limit);\n\n}\n\nint rtw_get_wpa_cipher_suite(u8 *s)\n{\n\tif (_rtw_memcmp(s, WPA_CIPHER_SUITE_NONE, WPA_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_NONE;\n\tif (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP40, WPA_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_WEP40;\n\tif (_rtw_memcmp(s, WPA_CIPHER_SUITE_TKIP, WPA_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_TKIP;\n\tif (_rtw_memcmp(s, WPA_CIPHER_SUITE_CCMP, WPA_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_CCMP;\n\tif (_rtw_memcmp(s, WPA_CIPHER_SUITE_WEP104, WPA_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_WEP104;\n\n\treturn 0;\n}\n\nint rtw_get_wpa2_cipher_suite(u8 *s)\n{\n\tif (_rtw_memcmp(s, RSN_CIPHER_SUITE_NONE, RSN_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_NONE;\n\tif (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP40, RSN_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_WEP40;\n\tif (_rtw_memcmp(s, RSN_CIPHER_SUITE_TKIP, RSN_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_TKIP;\n\tif (_rtw_memcmp(s, RSN_CIPHER_SUITE_CCMP, RSN_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_CCMP;\n\tif (_rtw_memcmp(s, RSN_CIPHER_SUITE_WEP104, RSN_SELECTOR_LEN) == _TRUE)\n\t\treturn WPA_CIPHER_WEP104;\n\n\treturn 0;\n}\n\n\nint rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x)\n{\n\tint i, ret=_SUCCESS;\n\tint left, count;\n\tu8 *pos;\n\tu8 SUITE_1X[4] = {0x00, 0x50, 0xf2, 1};\n\n\tif (wpa_ie_len <= 0) {\n\t\t/* No WPA IE - fail silently */\n\t\treturn _FAIL;\n\t}\n\n\t\n\tif ((*wpa_ie != _WPA_IE_ID_) || (*(wpa_ie+1) != (u8)(wpa_ie_len - 2)) ||\n\t   (_rtw_memcmp(wpa_ie+2, RTW_WPA_OUI_TYPE, WPA_SELECTOR_LEN) != _TRUE) )\n\t{\t\t\n\t\treturn _FAIL;\n\t}\n\n\tpos = wpa_ie;\n\n\tpos += 8;\n\tleft = wpa_ie_len - 8;\t\n\n\n\t//group_cipher\n\tif (left >= WPA_SELECTOR_LEN) {\n\n\t\t*group_cipher = rtw_get_wpa_cipher_suite(pos);\n\t\t\n\t\tpos += WPA_SELECTOR_LEN;\n\t\tleft -= WPA_SELECTOR_LEN;\n\t\t\n\t} \n\telse if (left > 0)\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie length mismatch, %u too much\", __FUNCTION__, left));\n\t\t\n\t\treturn _FAIL;\n\t}\n\n\n\t//pairwise_cipher\n\tif (left >= 2)\n\t{\t\t\n                //count = le16_to_cpu(*(u16*)pos);\t\n\t\tcount = RTW_GET_LE16(pos);\n\t\tpos += 2;\n\t\tleft -= 2;\n\t\t\n\t\tif (count == 0 || left < count * WPA_SELECTOR_LEN) {\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie count botch (pairwise), \"\n\t\t\t\t   \t\t\"count %u left %u\", __FUNCTION__, count, left));\n\t\t\treturn _FAIL;\n\t\t}\n\t\t\n\t\tfor (i = 0; i < count; i++)\n\t\t{\n\t\t\t*pairwise_cipher |= rtw_get_wpa_cipher_suite(pos);\n\t\t\t\n\t\t\tpos += WPA_SELECTOR_LEN;\n\t\t\tleft -= WPA_SELECTOR_LEN;\n\t\t}\n\t\t\n\t} \n\telse if (left == 1)\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie too short (for key mgmt)\",   __FUNCTION__));\n\t\treturn _FAIL;\n\t}\n\n\tif (is_8021x) {\n\t\tif (left >= 6) {\n\t\t\tpos += 2;\n\t\t\tif (_rtw_memcmp(pos, SUITE_1X, 4) == 1) {\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"%s : there has 802.1x auth\\n\", __FUNCTION__));\n\t\t\t\t*is_8021x = 1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn ret;\n\t\n}\n\nint rtw_parse_wpa2_ie(u8* rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x)\n{\n\tint i, ret=_SUCCESS;\n\tint left, count;\n\tu8 *pos;\n\tu8 SUITE_1X[4] = {0x00,0x0f, 0xac, 0x01};\n\n\tif (rsn_ie_len <= 0) {\n\t\t/* No RSN IE - fail silently */\n\t\treturn _FAIL;\n\t}\n\n\n\tif ((*rsn_ie!= _WPA2_IE_ID_) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2)))\n\t{\t\t\n\t\treturn _FAIL;\n\t}\n\t\n\tpos = rsn_ie;\n\tpos += 4;\n\tleft = rsn_ie_len - 4;\t\n\n\t//group_cipher\n\tif (left >= RSN_SELECTOR_LEN) {\n\n\t\t*group_cipher = rtw_get_wpa2_cipher_suite(pos);\n\t\t\n\t\tpos += RSN_SELECTOR_LEN;\n\t\tleft -= RSN_SELECTOR_LEN;\n\t\t\n\t} else if (left > 0) {\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie length mismatch, %u too much\", __FUNCTION__, left));\n\t\treturn _FAIL;\n\t}\n\n\t//pairwise_cipher\n\tif (left >= 2)\n\t{\t\t\n\t        //count = le16_to_cpu(*(u16*)pos);\n\t\tcount = RTW_GET_LE16(pos);\n\t\tpos += 2;\n\t\tleft -= 2;\n\n\t\tif (count == 0 || left < count * RSN_SELECTOR_LEN) {\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie count botch (pairwise), \"\n\t\t\t\t  \t\t \"count %u left %u\", __FUNCTION__, count, left));\n\t\t\treturn _FAIL;\n\t\t}\n\t\t\n\t\tfor (i = 0; i < count; i++)\n\t\t{\t\t\t\n\t\t\t*pairwise_cipher |= rtw_get_wpa2_cipher_suite(pos);\n\t\t\t\n\t\t\tpos += RSN_SELECTOR_LEN;\n\t\t\tleft -= RSN_SELECTOR_LEN;\n\t\t}\n\n\t} \n\telse if (left == 1)\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s: ie too short (for key mgmt)\",  __FUNCTION__));\n\t\t\n\t\treturn _FAIL;\n\t}\n\n\tif (is_8021x) {\n\t\tif (left >= 6) {\n\t\t\tpos += 2;\n\t\t\tif (_rtw_memcmp(pos, SUITE_1X, 4) == 1) {\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"%s (): there has 802.1x auth\\n\", __FUNCTION__));\n\t\t\t\t*is_8021x = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret;\n\t\n}\n\n//#ifdef CONFIG_WAPI_SUPPORT\nint rtw_get_wapi_ie(u8 *in_ie,uint in_len,u8 *wapi_ie,u16 *wapi_len)\n{\n\tint len = 0;\n\tu8 authmode, i;\n\tuint \tcnt;\n\tu8 wapi_oui1[4]={0x0,0x14,0x72,0x01};\n\tu8 wapi_oui2[4]={0x0,0x14,0x72,0x02};\n\n_func_enter_;\n\n\tif(wapi_len)\n\t\t*wapi_len = 0;\n\n\tif(!in_ie || in_len<=0)\n\t\treturn len;\n\n\tcnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_);\n\t\n\twhile(cnt<in_len)\n\t{\n\t\tauthmode=in_ie[cnt];\n\n\t\t//if(authmode==_WAPI_IE_)\n\t\tif(authmode==_WAPI_IE_ && (_rtw_memcmp(&in_ie[cnt+6], wapi_oui1,4)==_TRUE ||\n\t\t\t\t       \t_rtw_memcmp(&in_ie[cnt+6], wapi_oui2,4)==_TRUE))\n\t\t{\n\t\t\tif (wapi_ie) {\n\t\t\t\t_rtw_memcpy(wapi_ie, &in_ie[cnt],in_ie[cnt+1]+2);\n\n\t\t\t\tfor(i=0;i<(in_ie[cnt+1]+2);i=i+8){\n\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n %2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x\\n\",\n\t\t\t\t\t\t\t\twapi_ie[i],wapi_ie[i+1],wapi_ie[i+2],wapi_ie[i+3],wapi_ie[i+4],\n\t\t\t\t\t\t\t\twapi_ie[i+5],wapi_ie[i+6],wapi_ie[i+7]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(wapi_len)\n\t\t\t\t*wapi_len=in_ie[cnt+1]+2;\n\t\t\t\n\t\t\tcnt+=in_ie[cnt+1]+2;  //get next\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcnt+=in_ie[cnt+1]+2;   //get next\n\t\t}\n\t}\n\n\tif(wapi_len)\n\t\tlen = *wapi_len;\n\n_func_exit_;\n\n\treturn len;\n\n}\n//#endif\n\nint rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len)\n{\n\tu8 authmode, sec_idx, i;\n\tu8 wpa_oui[4]={0x0,0x50,0xf2,0x01};\n\tuint \tcnt;\n\t\n_func_enter_;\n\n\t//Search required WPA or WPA2 IE and copy to sec_ie[ ]\n\t\n\tcnt = (_TIMESTAMP_ + _BEACON_ITERVAL_ + _CAPABILITY_);\n\t\n\tsec_idx=0;\n\t\t\n\twhile(cnt<in_len)\n\t{\n\t\tauthmode=in_ie[cnt];\n\t\t\n\t\tif((authmode==_WPA_IE_ID_)&&(_rtw_memcmp(&in_ie[cnt+2], &wpa_oui[0],4)==_TRUE))\n\t\t{\t\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n rtw_get_wpa_ie: sec_idx=%d in_ie[cnt+1]+2=%d\\n\",sec_idx,in_ie[cnt+1]+2));\t\t\n\n\t\t\t\tif (wpa_ie) {\n\t\t\t\t_rtw_memcpy(wpa_ie, &in_ie[cnt],in_ie[cnt+1]+2);\n\n\t\t\t\tfor(i=0;i<(in_ie[cnt+1]+2);i=i+8){\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n %2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x\\n\",\n\t\t\t\t\t\t\t\t\twpa_ie[i],wpa_ie[i+1],wpa_ie[i+2],wpa_ie[i+3],wpa_ie[i+4],\n\t\t\t\t\t\t\t\t\twpa_ie[i+5],wpa_ie[i+6],wpa_ie[i+7]));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t*wpa_len=in_ie[cnt+1]+2;\n\t\t\t\tcnt+=in_ie[cnt+1]+2;  //get next\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(authmode==_WPA2_IE_ID_)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n get_rsn_ie: sec_idx=%d in_ie[cnt+1]+2=%d\\n\",sec_idx,in_ie[cnt+1]+2));\t\t\n\n\t\t\t\tif (rsn_ie) {\n\t\t\t\t_rtw_memcpy(rsn_ie, &in_ie[cnt],in_ie[cnt+1]+2);\n\n\t\t\t\tfor(i=0;i<(in_ie[cnt+1]+2);i=i+8){\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n %2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x\\n\",\n\t\t\t\t\t\t\t\t\trsn_ie[i],rsn_ie[i+1],rsn_ie[i+2],rsn_ie[i+3],rsn_ie[i+4],\n\t\t\t\t\t\t\t\t\trsn_ie[i+5],rsn_ie[i+6],rsn_ie[i+7]));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t*rsn_len=in_ie[cnt+1]+2;\n\t\t\t\tcnt+=in_ie[cnt+1]+2;  //get next\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcnt+=in_ie[cnt+1]+2;   //get next\n\t\t\t}\t\n\t\t}\n\t\t\n\t}\n\t\n_func_exit_;\n\n\treturn (*rsn_len+*wpa_len);\n\t\n}\n\nu8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen)\n{\t\n\tu8 match = _FALSE;\n\tu8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};\n\t\n\tif(ie_ptr == NULL) return match;\n\t\n\teid = ie_ptr[0];\n\t\n\tif((eid==_WPA_IE_ID_)&&(_rtw_memcmp(&ie_ptr[2], wps_oui, 4)==_TRUE))\n\t{\t\t\t\n\t\t//DBG_8192C(\"==> found WPS_IE.....\\n\");\n\t\t*wps_ielen = ie_ptr[1]+2;\t\t\t\n\t\tmatch=_TRUE;\n\t}\t\n\treturn match;\n}\n\nu8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, u8 frame_type)\n{\n\tu8*\twps = NULL;\n\n\tDBG_871X( \"[%s] frame_type = %d\\n\", __FUNCTION__, frame_type );\n\tswitch( frame_type )\n\t{\n\t\tcase 1:\n\t\tcase 3:\n\t\t{\t//\tBeacon or Probe Response\n\t\t\twps = rtw_get_wps_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wps_ie, wps_ielen);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\t//\tProbe Request\n\t\t\twps = rtw_get_wps_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wps_ie, wps_ielen);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn wps;\n}\n\n/**\n * rtw_get_wps_ie - Search WPS IE from a series of IEs\n * @in_ie: Address of IEs to search\n * @in_len: Length limit from in_ie\n * @wps_ie: If not NULL and WPS IE is found, WPS IE will be copied to the buf starting from wps_ie\n * @wps_ielen: If not NULL and WPS IE is found, will set to the length of the entire WPS IE\n *\n * Returns: The address of the WPS IE found, or NULL\n */\nu8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)\n{\n\tuint cnt;\n\tu8 *wpsie_ptr = NULL;\n\tu8 eid, wps_oui[4] = {0x00, 0x50, 0xf2, 0x04};\n\n\tif (wps_ielen)\n\t\t*wps_ielen = 0;\n\n\tif (!in_ie) {\n\t\trtw_warn_on(1);\n\t\treturn wpsie_ptr;\n\t}\n\n\tif (in_len <= 0)\n\t\treturn wpsie_ptr;\n\n\tcnt = 0;\n\n\twhile (cnt + 1 + 4 < in_len) {\n\t\teid = in_ie[cnt];\n\n\t\tif (cnt + 1 + 4 >= MAX_IE_SZ) {\n\t\t\trtw_warn_on(1);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], wps_oui, 4) == _TRUE) {\n\t\t\twpsie_ptr = in_ie + cnt;\n\n\t\t\tif (wps_ie)\n\t\t\t\t_rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt + 1] + 2);\n\n\t\t\tif (wps_ielen)\n\t\t\t\t*wps_ielen = in_ie[cnt + 1] + 2;\n\n\t\t\tbreak;\n\t\t} else {\n\t\t\tcnt += in_ie[cnt + 1] + 2;\n\t\t}\n\n\t}\n\n\treturn wpsie_ptr;\n}\n\n/**\n * rtw_get_wps_attr - Search a specific WPS attribute from a given WPS IE\n * @wps_ie: Address of WPS IE to search\n * @wps_ielen: Length limit from wps_ie\n * @target_attr_id: The attribute ID of WPS attribute to search\n * @buf_attr: If not NULL and the WPS attribute is found, WPS attribute will be copied to the buf starting from buf_attr\n * @len_attr: If not NULL and the WPS attribute is found, will set to the length of the entire WPS attribute\n *\n * Returns: the address of the specific WPS attribute found, or NULL\n */\nu8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr)\n{\n\tu8 *attr_ptr = NULL;\n\tu8 * target_attr_ptr = NULL;\n\tu8 wps_oui[4]={0x00,0x50,0xF2,0x04};\n\n\tif(len_attr)\n\t\t*len_attr = 0;\n\n\tif ( ( wps_ie[0] != _VENDOR_SPECIFIC_IE_ ) ||\n\t\t( _rtw_memcmp( wps_ie + 2, wps_oui , 4 ) != _TRUE ) )\n\t{\n\t\treturn attr_ptr;\n\t}\n\n\t// 6 = 1(Element ID) + 1(Length) + 4(WPS OUI)\n\tattr_ptr = wps_ie + 6; //goto first attr\n\t\n\twhile(attr_ptr - wps_ie < wps_ielen)\n\t{\n\t\t// 4 = 2(Attribute ID) + 2(Length)\n\t\tu16 attr_id = RTW_GET_BE16(attr_ptr);\n\t\tu16 attr_data_len = RTW_GET_BE16(attr_ptr + 2);\n\t\tu16 attr_len = attr_data_len + 4;\n\t\t\n\t\t//DBG_871X(\"%s attr_ptr:%p, id:%u, length:%u\\n\", __FUNCTION__, attr_ptr, attr_id, attr_data_len);\n\t\tif( attr_id == target_attr_id )\n\t\t{\n\t\t\ttarget_attr_ptr = attr_ptr;\n\t\t\n\t\t\tif(buf_attr)\n\t\t\t\t_rtw_memcpy(buf_attr, attr_ptr, attr_len);\n\t\t\t\n\t\t\tif(len_attr)\n\t\t\t\t*len_attr = attr_len;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tattr_ptr += attr_len; //goto next\n\t\t}\t\t\n\t\t\n\t}\t\n\n\treturn target_attr_ptr;\n}\n\n/**\n * rtw_get_wps_attr_content - Search a specific WPS attribute content from a given WPS IE\n * @wps_ie: Address of WPS IE to search\n * @wps_ielen: Length limit from wps_ie\n * @target_attr_id: The attribute ID of WPS attribute to search\n * @buf_content: If not NULL and the WPS attribute is found, WPS attribute content will be copied to the buf starting from buf_content\n * @len_content: If not NULL and the WPS attribute is found, will set to the length of the WPS attribute content\n *\n * Returns: the address of the specific WPS attribute content found, or NULL\n */\nu8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content)\n{\n\tu8 *attr_ptr;\n\tu32 attr_len;\n\n\tif(len_content)\n\t\t*len_content = 0;\n\t\n\tattr_ptr = rtw_get_wps_attr(wps_ie, wps_ielen, target_attr_id, NULL, &attr_len);\n\n\tif(attr_ptr && attr_len)\n\t{\n\t\tif(buf_content)\n\t\t\t_rtw_memcpy(buf_content, attr_ptr+4, attr_len-4);\n\n\t\tif(len_content)\n\t\t\t*len_content = attr_len-4;\n\n\t\treturn attr_ptr+4;\n\t}\n\n\treturn NULL;\n}\n\nstatic int rtw_ieee802_11_parse_vendor_specific(u8 *pos, uint elen,\n\t\t\t\t\t    struct rtw_ieee802_11_elems *elems,\n\t\t\t\t\t    int show_errors)\n{\n\tunsigned int oui;\n\n\t/* first 3 bytes in vendor specific information element are the IEEE\n\t * OUI of the vendor. The following byte is used a vendor specific\n\t * sub-type. */\n\tif (elen < 4) {\n\t\tif (show_errors) {\n\t\t\tDBG_871X(\"short vendor specific \"\n\t\t\t\t   \"information element ignored (len=%lu)\\n\",\n\t\t\t\t   (unsigned long) elen);\n\t\t}\n\t\treturn -1;\n\t}\n\n\toui = RTW_GET_BE24(pos);\n\tswitch (oui) {\n\tcase OUI_MICROSOFT:\n\t\t/* Microsoft/Wi-Fi information elements are further typed and\n\t\t * subtyped */\n\t\tswitch (pos[3]) {\n\t\tcase 1:\n\t\t\t/* Microsoft OUI (00:50:F2) with OUI Type 1:\n\t\t\t * real WPA information element */\n\t\t\telems->wpa_ie = pos;\n\t\t\telems->wpa_ie_len = elen;\n\t\t\tbreak;\n\t\tcase WME_OUI_TYPE: /* this is a Wi-Fi WME info. element */\n\t\t\tif (elen < 5) {\n\t\t\t\tDBG_871X(\"short WME \"\n\t\t\t\t\t   \"information element ignored \"\n\t\t\t\t\t   \"(len=%lu)\\n\",\n\t\t\t\t\t   (unsigned long) elen);\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tswitch (pos[4]) {\n\t\t\tcase WME_OUI_SUBTYPE_INFORMATION_ELEMENT:\n\t\t\tcase WME_OUI_SUBTYPE_PARAMETER_ELEMENT:\n\t\t\t\telems->wme = pos;\n\t\t\t\telems->wme_len = elen;\n\t\t\t\tbreak;\n\t\t\tcase WME_OUI_SUBTYPE_TSPEC_ELEMENT:\n\t\t\t\telems->wme_tspec = pos;\n\t\t\t\telems->wme_tspec_len = elen;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X_LEVEL(_drv_warning_, \"unknown WME \"\n\t\t\t\t\t   \"information element ignored \"\n\t\t\t\t\t   \"(subtype=%d len=%lu)\\n\",\n\t\t\t\t\t   pos[4], (unsigned long) elen);\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\t/* Wi-Fi Protected Setup (WPS) IE */\n\t\t\telems->wps_ie = pos;\n\t\t\telems->wps_ie_len = elen;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X_LEVEL(_drv_warning_, \"Unknown Microsoft \"\n\t\t\t\t   \"information element ignored \"\n\t\t\t\t   \"(type=%d len=%lu)\\n\",\n\t\t\t\t   pos[3], (unsigned long) elen);\n\t\t\treturn -1;\n\t\t}\n\t\tbreak;\n\n\tcase OUI_BROADCOM:\n\t\tswitch (pos[3]) {\n\t\tcase VENDOR_HT_CAPAB_OUI_TYPE:\n\t\t\telems->vendor_ht_cap = pos;\n\t\t\telems->vendor_ht_cap_len = elen;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X_LEVEL(_drv_warning_, \"Unknown Broadcom \"\n\t\t\t\t   \"information element ignored \"\n\t\t\t\t   \"(type=%d len=%lu)\\n\",\n\t\t\t\t   pos[3], (unsigned long) elen);\n\t\t\treturn -1;\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tDBG_871X_LEVEL(_drv_warning_, \"unknown vendor specific information \"\n\t\t\t   \"element ignored (vendor OUI %02x:%02x:%02x \"\n\t\t\t   \"len=%lu)\\n\",\n\t\t\t   pos[0], pos[1], pos[2], (unsigned long) elen);\n\t\treturn -1;\n\t}\n\n\treturn 0;\n\t\n}\n\n/**\n * ieee802_11_parse_elems - Parse information elements in management frames\n * @start: Pointer to the start of IEs\n * @len: Length of IE buffer in octets\n * @elems: Data structure for parsed elements\n * @show_errors: Whether to show parsing errors in debug log\n * Returns: Parsing result\n */\nParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,\n\t\t\t\tstruct rtw_ieee802_11_elems *elems,\n\t\t\t\tint show_errors)\n{\n\tuint left = len;\n\tu8 *pos = start;\n\tint unknown = 0;\n\n\t_rtw_memset(elems, 0, sizeof(*elems));\n\n\twhile (left >= 2) {\n\t\tu8 id, elen;\n\n\t\tid = *pos++;\n\t\telen = *pos++;\n\t\tleft -= 2;\n\n\t\tif (elen > left) {\n\t\t\tif (show_errors) {\n\t\t\t\tDBG_871X(\"IEEE 802.11 element \"\n\t\t\t\t\t   \"parse failed (id=%d elen=%d \"\n\t\t\t\t\t   \"left=%lu)\\n\",\n\t\t\t\t\t   id, elen, (unsigned long) left);\t\t\t\t\n\t\t\t}\n\t\t\treturn ParseFailed;\n\t\t}\n\n\t\tswitch (id) {\n\t\tcase WLAN_EID_SSID:\n\t\t\telems->ssid = pos;\n\t\t\telems->ssid_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_SUPP_RATES:\n\t\t\telems->supp_rates = pos;\n\t\t\telems->supp_rates_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_FH_PARAMS:\n\t\t\telems->fh_params = pos;\n\t\t\telems->fh_params_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_DS_PARAMS:\n\t\t\telems->ds_params = pos;\n\t\t\telems->ds_params_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_CF_PARAMS:\n\t\t\telems->cf_params = pos;\n\t\t\telems->cf_params_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_TIM:\n\t\t\telems->tim = pos;\n\t\t\telems->tim_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_IBSS_PARAMS:\n\t\t\telems->ibss_params = pos;\n\t\t\telems->ibss_params_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_CHALLENGE:\n\t\t\telems->challenge = pos;\n\t\t\telems->challenge_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_ERP_INFO:\n\t\t\telems->erp_info = pos;\n\t\t\telems->erp_info_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_EXT_SUPP_RATES:\n\t\t\telems->ext_supp_rates = pos;\n\t\t\telems->ext_supp_rates_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_VENDOR_SPECIFIC:\n\t\t\tif (rtw_ieee802_11_parse_vendor_specific(pos, elen,\n\t\t\t\t\t\t\t     elems,\n\t\t\t\t\t\t\t     show_errors))\n\t\t\t\tunknown++;\n\t\t\tbreak;\n\t\tcase WLAN_EID_RSN:\n\t\t\telems->rsn_ie = pos;\n\t\t\telems->rsn_ie_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_PWR_CAPABILITY:\n\t\t\telems->power_cap = pos;\n\t\t\telems->power_cap_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_SUPPORTED_CHANNELS:\n\t\t\telems->supp_channels = pos;\n\t\t\telems->supp_channels_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_MOBILITY_DOMAIN:\n\t\t\telems->mdie = pos;\n\t\t\telems->mdie_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_FAST_BSS_TRANSITION:\n\t\t\telems->ftie = pos;\n\t\t\telems->ftie_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_TIMEOUT_INTERVAL:\n\t\t\telems->timeout_int = pos;\n\t\t\telems->timeout_int_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_HT_CAP:\n\t\t\telems->ht_capabilities = pos;\n\t\t\telems->ht_capabilities_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_HT_OPERATION:\n\t\t\telems->ht_operation = pos;\n\t\t\telems->ht_operation_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_VHT_CAPABILITY:\n\t\t\telems->vht_capabilities = pos;\n\t\t\telems->vht_capabilities_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_VHT_OPERATION:\n\t\t\telems->vht_operation = pos;\n\t\t\telems->vht_operation_len = elen;\n\t\t\tbreak;\n\t\tcase WLAN_EID_VHT_OP_MODE_NOTIFY:\n\t\t\telems->vht_op_mode_notify = pos;\n\t\t\telems->vht_op_mode_notify_len = elen;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tunknown++;\n\t\t\tif (!show_errors)\n\t\t\t\tbreak;\n\t\t\tDBG_871X_LEVEL(_drv_warning_,\n\t\t\t\t\"IEEE 802.11 element parse \"\n\t\t\t\t\"ignored unknown element (id=%d elen=%d)\\n\",\n\t\t\t\tid, elen);\n\t\t\tbreak;\n\t\t}\n\n\t\tleft -= elen;\n\t\tpos += elen;\n\t}\n\n\tif (left)\n\t\treturn ParseFailed;\n\n\treturn unknown ? ParseUnknown : ParseOK;\n\t\n}\n\nstatic u8 key_char2num(u8 ch);\nstatic u8 key_char2num(u8 ch)\n{\n    if((ch>='0')&&(ch<='9'))\n        return ch - '0';\n    else if ((ch>='a')&&(ch<='f'))\n        return ch - 'a' + 10;\n    else if ((ch>='A')&&(ch<='F'))\n        return ch - 'A' + 10;\n    else\n\t return 0xff;\n}\n\nu8 str_2char2num(u8 hch, u8 lch);\nu8 str_2char2num(u8 hch, u8 lch)\n{\n    return ((key_char2num(hch) * 10 ) + key_char2num(lch));\n}\n\nu8 key_2char2num(u8 hch, u8 lch);\nu8 key_2char2num(u8 hch, u8 lch)\n{\n    return ((key_char2num(hch) << 4) | key_char2num(lch));\n}\n\nvoid macstr2num(u8 *dst, u8 *src);\nvoid macstr2num(u8 *dst, u8 *src)\n{\n\tint\tjj, kk;\n\tfor (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)\n\t{\n\t\tdst[jj] = key_2char2num(src[kk], src[kk + 1]);\n\t}\n}\n\nu8 convert_ip_addr(u8 hch, u8 mch, u8 lch)\n{\n    return ((key_char2num(hch) * 100) + (key_char2num(mch) * 10 ) + key_char2num(lch));\n}\n\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n#define MAC_ADDRESS_LEN 12\n\nint rtw_get_mac_addr_intel(unsigned char *buf)\n{\n\tint ret = 0;\n\tint i;\n\tstruct file *fp = NULL;\n\tmm_segment_t oldfs;\n\tunsigned char c_mac[MAC_ADDRESS_LEN];\n\tchar fname[]=\"/config/wifi/mac.txt\";\n\tint jj,kk;\n\n\tDBG_871X(\"%s Enter\\n\", __FUNCTION__);\n\n\tret = rtw_retrieve_from_file(fname, c_mac, MAC_ADDRESS_LEN);\n\tif(ret < MAC_ADDRESS_LEN)\n\t{\n\t\treturn -1;\n\t}\n\n\tfor( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 2 )\n\t{\n\t\tbuf[jj] = key_2char2num(c_mac[kk], c_mac[kk+ 1]);\n\t}\n\n\tDBG_871X(\"%s: read from file mac address: \"MAC_FMT\"\\n\",\n\t\t __FUNCTION__, MAC_ARG(buf));\n\n\treturn 0;\n}\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\n/*\n * Description:\n * rtw_check_invalid_mac_address: \n * This is only used for checking mac address valid or not.\n *\n * Input:\n * adapter: mac_address pointer.\n * check_local_bit: check locally bit or not.\n *\n * Output:\n * _TRUE: The mac address is invalid.\n * _FALSE: The mac address is valid.\n *\n * Auther: Isaac.Li\n */\nu8 rtw_check_invalid_mac_address(u8 *mac_addr, u8 check_local_bit)\n{\n\tu8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};\n\tu8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu8 res = _FALSE;\n\n\tif (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) {\n\t\tres = _TRUE;\n\t\tgoto func_exit;\n\t}\n\n\tif (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) {\n\t\tres = _TRUE;\n\t\tgoto func_exit;\n\t}\n\n\tif (mac_addr[0] & BIT0) {\n\t\tres = _TRUE;\n\t\tgoto func_exit;\n\t}\n\n\tif (check_local_bit == _TRUE) {\n\t\tif (mac_addr[0] & BIT1) {\n\t\t\tres = _TRUE;\n\t\t\tgoto func_exit;\n\t\t}\n\t}\n\nfunc_exit:\n\treturn res;\n}\n\nextern char* rtw_initmac;\n/**\n * rtw_macaddr_cfg - Decide the mac address used\n * @out: buf to store mac address decided\n * @hw_mac_addr: mac address from efuse/epprom\n */\nvoid rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr)\n{\n#define DEFAULT_RANDOM_MACADDR 1\n\tu8 mac[ETH_ALEN];\n\n\tif (out == NULL) {\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\t/* Users specify the mac address */\n\tif (rtw_initmac) {\n\t\tint jj,kk;\n\n\t\tfor (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)\n\t\t\tmac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk + 1]);\n\n\t\tgoto err_chk;\n\t}\n\n\t/* platform specified */\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\tif (rtw_get_mac_addr_intel(mac) == 0)\n\t\tgoto err_chk;\n#endif\n\n\t/* Use the mac address stored in the Efuse */\n\tif (hw_mac_addr) {\n\t\t_rtw_memcpy(mac, hw_mac_addr, ETH_ALEN);\n\t\tgoto err_chk;\n\t}\n\nerr_chk:\n\tif (rtw_check_invalid_mac_address(mac, _TRUE) == _TRUE) {\n\t\t#if DEFAULT_RANDOM_MACADDR\n\t\tDBG_871X_LEVEL(_drv_err_, \"invalid mac addr:\"MAC_FMT\", assign random MAC\\n\", MAC_ARG(mac));\n\t\t*((u32 *)(&mac[2])) = rtw_random32();\n\t\tmac[0] = 0x00;\n\t\tmac[1] = 0xe0;\n\t\tmac[2] = 0x4c;\n\t\t#else\n\t\tDBG_871X_LEVEL(_drv_err_, \"invalid mac addr:\"MAC_FMT\", assign default one\\n\", MAC_ARG(mac));\n\t\tmac[0] = 0x00;\n\t\tmac[1] = 0xe0;\n\t\tmac[2] = 0x4c;\n\t\tmac[3] = 0x87;\n\t\tmac[4] = 0x00;\n\t\tmac[5] = 0x00;\n\t\t#endif\n\t}\n\n\t_rtw_memcpy(out, mac, ETH_ALEN);\n\tDBG_871X(\"%s mac addr:\"MAC_FMT\"\\n\", __func__, MAC_ARG(out));\n}\n\n#ifdef CONFIG_80211N_HT\nvoid dump_ht_cap_ie_content(void *sel, u8 *buf, u32 buf_len)\n{\n\tif (buf_len != 26) {\n\t\tDBG_871X_SEL_NL(sel, \"Invalid HT capability IE len:%d != %d\\n\", buf_len, 26);\n\t\treturn;\n\t}\n\n\tDBG_871X_SEL_NL(sel, \"HT Capabilities Info:%02x%02x\\n\", *(buf), *(buf+1));\n\tDBG_871X_SEL_NL(sel, \"A-MPDU Parameters:\"HT_AMPDU_PARA_FMT\"\\n\"\n\t\t, HT_AMPDU_PARA_ARG(HT_CAP_ELE_AMPDU_PARA(buf)));\n\tDBG_871X_SEL_NL(sel, \"Supported MCS Set:\"HT_SUP_MCS_SET_FMT\"\\n\"\n\t\t, HT_SUP_MCS_SET_ARG(HT_CAP_ELE_SUP_MCS_SET(buf)));\n}\n\nvoid dump_ht_cap_ie(void *sel, u8 *ie, u32 ie_len)\n{\n\tu8* pos = (u8*)ie;\n\tu16 id;\n\tu16 len;\n\n\tu8 *ht_cap_ie;\n\tsint ht_cap_ielen;\n\n\tht_cap_ie = rtw_get_ie(ie, _HT_CAPABILITY_IE_, &ht_cap_ielen, ie_len);\n\tif(!ie || ht_cap_ie != ie)\n\t\treturn;\n\n\tdump_ht_cap_ie_content(sel, ht_cap_ie+2, ht_cap_ielen);\n}\n#endif /* CONFIG_80211N_HT */\n\nvoid dump_ies(void *sel, u8 *buf, u32 buf_len)\n{\n\tu8* pos = (u8*)buf;\n\tu8 id, len;\n\n\twhile(pos-buf+1<buf_len){\n\t\tid = *pos;\n\t\tlen = *(pos+1);\n\n\t\tDBG_871X_SEL_NL(sel, \"%s ID:%u, LEN:%u\\n\", __FUNCTION__, id, len);\n\t\t#ifdef CONFIG_80211N_HT\n\t\tdump_ht_cap_ie(sel, pos, len);\n\t\t#endif\n\t\tdump_wps_ie(sel, pos, len);\n\t\t#ifdef CONFIG_P2P\n\t\tdump_p2p_ie(sel, pos, len);\n\t\t#ifdef CONFIG_WFD\n\t\tdump_wfd_ie(sel, pos, len);\n\t\t#endif\n\t\t#endif\n\n\t\tpos+=(2+len);\n\t}\n}\n\nvoid dump_wps_ie(void *sel, u8 *ie, u32 ie_len)\n{\n\tu8* pos = (u8*)ie;\n\tu16 id;\n\tu16 len;\n\n\tu8 *wps_ie;\n\tuint wps_ielen;\n\n\twps_ie = rtw_get_wps_ie(ie, ie_len, NULL, &wps_ielen);\n\tif(wps_ie != ie || wps_ielen == 0)\n\t\treturn;\n\n\tpos+=6;\n\twhile(pos-ie < ie_len){\n\t\tid = RTW_GET_BE16(pos);\n\t\tlen = RTW_GET_BE16(pos + 2);\n\n\t\tDBG_871X_SEL_NL(sel, \"%s ID:0x%04x, LEN:%u\\n\", __FUNCTION__, id, len);\n\n\t\tpos+=(4+len);\n\t}\n}\n\n/**\n * rtw_ies_get_chbw - get operation ch, bw, offset from IEs of BSS.\n * @ies: pointer of the first tlv IE\n * @ies_len: length of @ies\n * @ch: pointer of ch, used as output\n * @bw: pointer of bw, used as output\n * @offset: pointer of offset, used as output\n */\nvoid rtw_ies_get_chbw(u8 *ies, int ies_len, u8 *ch, u8 *bw, u8 *offset)\n{\n\tu8 *p;\n\tint\tie_len;\n\n\t*ch = 0;\n\t*bw = CHANNEL_WIDTH_20;\n\t*offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\tp = rtw_get_ie(ies, _DSSET_IE_, &ie_len, ies_len);\n\tif (p && ie_len > 0)\n\t\t*ch = *(p + 2);\n\n#ifdef CONFIG_80211N_HT\n{\n\tu8 *ht_cap_ie, *ht_op_ie;\n\tint ht_cap_ielen, ht_op_ielen;\n\n\tht_cap_ie = rtw_get_ie(ies, EID_HTCapability, &ht_cap_ielen, ies_len);\n\tif (ht_cap_ie && ht_cap_ielen) {\n\t\tif (GET_HT_CAP_ELE_CHL_WIDTH(ht_cap_ie + 2))\n\t\t\t*bw = CHANNEL_WIDTH_40;\n\t}\n\n\tht_op_ie = rtw_get_ie(ies, EID_HTInfo, &ht_op_ielen, ies_len);\n\tif (ht_op_ie && ht_op_ielen) {\n\t\tif (*ch == 0) {\n\t\t\t*ch = GET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2);\n\t\t} else if (*ch != 0 && *ch != GET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2)) {\n\t\t\tDBG_871X(\"%s ch inconsistent, DSSS:%u, HT primary:%u\\n\"\n\t\t\t\t, __func__, *ch, GET_HT_OP_ELE_PRI_CHL(ht_op_ie + 2));\n\t\t}\n\n\t\tif (!GET_HT_OP_ELE_STA_CHL_WIDTH(ht_op_ie + 2))\n\t\t\t*bw = CHANNEL_WIDTH_20;\n\n\t\tif (*bw == CHANNEL_WIDTH_40) {\n\t\t\tswitch (GET_HT_OP_ELE_2ND_CHL_OFFSET(ht_op_ie + 2)) {\n\t\t\tcase SCA:\n\t\t\t\t*offset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\t\t\tbreak;\n\t\t\tcase SCB:\n\t\t\t\t*offset = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* CONFIG_80211N_HT */\n#ifdef CONFIG_80211AC_VHT\n{\n\tu8 *vht_op_ie;\n\tint vht_op_ielen;\n\n\tvht_op_ie = rtw_get_ie(ies, EID_VHTOperation, &vht_op_ielen, ies_len);\n\tif (vht_op_ie && vht_op_ielen) {\n\t\tif (GET_VHT_OPERATION_ELE_CHL_WIDTH(vht_op_ie + 2) >= 1)\n\t\t\t*bw = CHANNEL_WIDTH_80;\n\t}\n}\n#endif\n}\n\nvoid rtw_bss_get_chbw(WLAN_BSSID_EX *bss, u8 *ch, u8 *bw, u8 *offset)\n{\n\trtw_ies_get_chbw(bss->IEs + sizeof(NDIS_802_11_FIXED_IEs)\n\t\t, bss->IELength - sizeof(NDIS_802_11_FIXED_IEs)\n\t\t, ch, bw, offset);\n\n\tif (*ch == 0) {\n\t\t*ch = bss->Configuration.DSConfig;\n\t} else if (*ch != bss->Configuration.DSConfig) {\n\t\tDBG_871X(\"inconsistent ch - ies:%u bss->Configuration.DSConfig:%u\\n\"\n\t\t\t, *ch, bss->Configuration.DSConfig);\n\t\t*ch = bss->Configuration.DSConfig;\n\t\trtw_warn_on(1);\n\t}\n}\n\n/**\n * rtw_is_chbw_grouped - test if the two ch settings can be grouped together\n * @ch_a: ch of set a\n * @bw_a: bw of set a\n * @offset_a: offset of set a\n * @ch_b: ch of set b\n * @bw_b: bw of set b\n * @offset_b: offset of set b\n */\nbool rtw_is_chbw_grouped(u8 ch_a, u8 bw_a, u8 offset_a\n\t, u8 ch_b, u8 bw_b, u8 offset_b)\n{\n\tbool is_grouped = _FALSE;\n\n\tif (ch_a != ch_b) {\n\t\t/* ch is different */\n\t\tgoto exit;\n\t} else if ((bw_a == CHANNEL_WIDTH_40 || bw_a == CHANNEL_WIDTH_80)\n\t\t\t&& (bw_b == CHANNEL_WIDTH_40 || bw_b == CHANNEL_WIDTH_80)\n\t) {\n\t\tif (offset_a != offset_b)\n\t\t\tgoto exit;\n\t}\n\n\tis_grouped = _TRUE;\n\nexit:\n\treturn is_grouped;\n}\n\n/**\n * rtw_sync_chbw - obey g_ch, adjust g_bw, g_offset, bw, offset\n * @req_ch: pointer of the request ch, may be modified further\n * @req_bw: pointer of the request bw, may be modified further\n * @req_offset: pointer of the request offset, may be modified further\n * @g_ch: pointer of the ongoing group ch\n * @g_bw: pointer of the ongoing group bw, may be modified further\n * @g_offset: pointer of the ongoing group offset, may be modified further\n */\nvoid rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset\n\t, u8 *g_ch, u8 *g_bw, u8 *g_offset)\n{\n\n\t*req_ch = *g_ch;\n\n\tif (*req_bw == CHANNEL_WIDTH_80 && *g_ch <= 14) {\n\t\t/*2.4G ch, downgrade to 40Mhz */\n\t\t*req_bw = CHANNEL_WIDTH_40;\n\t}\n\n\tswitch (*req_bw) {\n\tcase CHANNEL_WIDTH_80:\n\t\tif (*g_bw == CHANNEL_WIDTH_40 || *g_bw == CHANNEL_WIDTH_80)\n\t\t\t*req_offset = *g_offset;\n\t\telse if (*g_bw == CHANNEL_WIDTH_20)\n\t\t\t*req_offset = rtw_get_offset_by_ch(*req_ch);\n\n\t\tif (*req_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s req 80MHz BW without offset, down to 20MHz\\n\", __func__);\n\t\t\trtw_warn_on(1);\n\t\t\t*req_bw = CHANNEL_WIDTH_20;\n\t\t}\n\t\tbreak;\n\tcase CHANNEL_WIDTH_40:\n\t\tif (*g_bw == CHANNEL_WIDTH_40 || *g_bw == CHANNEL_WIDTH_80)\n\t\t\t*req_offset = *g_offset;\n\t\telse if (*g_bw == CHANNEL_WIDTH_20)\n\t\t\t*req_offset = rtw_get_offset_by_ch(*req_ch);\n\n\t\tif (*req_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s req 40MHz BW without offset, down to 20MHz\\n\", __func__);\n\t\t\trtw_warn_on(1);\n\t\t\t*req_bw = CHANNEL_WIDTH_20;\n\t\t}\n\t\tbreak;\n\tcase CHANNEL_WIDTH_20:\n\t\t*req_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\tbreak;\n\tdefault:\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s req unsupported BW:%u\\n\", __func__, *req_bw);\n\t\trtw_warn_on(1);\n\t}\n\n\tif (*req_bw > *g_bw) {\n\t\t*g_bw = *req_bw;\n\t\t*g_offset = *req_offset;\n\t}\n}\n\n#ifdef CONFIG_P2P\n/**\n * rtw_get_p2p_merged_len - Get merged ie length from muitiple p2p ies.\n * @in_ie: Pointer of the first p2p ie\n * @in_len: Total len of muiltiple p2p ies\n * Returns: Length of merged p2p ie length\n */\nu32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len)\n{\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 };\n\tint i=0;\n\tint j=0, len=0;\n\n\twhile( i < in_len)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i);\n\n\t\tif( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) )\n\t\t{\n\t\t\tlen += pIE->Length-4; // 4 is P2P OUI length, don't count it in this loop\n\t\t}\n\n\t\ti += (pIE->Length + 2);\n\t}\n\n\treturn len + 4;\t// Append P2P OUI length at last.\n}\n\n/**\n * rtw_p2p_merge_ies - Merge muitiple p2p ies into one\n * @in_ie: Pointer of the first p2p ie\n * @in_len: Total len of muiltiple p2p ies\n * @merge_ie: Pointer of merged ie\n * Returns: Length of merged p2p ie\n */\nint rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie)\n{\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 len = 0;\n\tu8 OUI[4] = { 0x50, 0x6f, 0x9a, 0x09 };\n\tu8 ELOUI[6] = { 0xDD, 0x00, 0x50, 0x6f, 0x9a, 0x09 };\t//EID;Len;OUI, Len would copy at the end of function\n\tint i=0;\n\n\tif( merge_ie != NULL)\n\t{\n\t\t//Set first P2P OUI\n\t\t_rtw_memcpy(merge_ie, ELOUI, 6);\n\t\tmerge_ie += 6;\n\n\t\twhile( i < in_len)\n\t\t{\n\t\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(in_ie+ i);\n\n\t\t\t// Take out the rest of P2P OUIs\n\t\t\tif( pIE->ElementID == _VENDOR_SPECIFIC_IE_ && _rtw_memcmp(pIE->data, OUI, 4) )\n\t\t\t{\n\t\t\t\t_rtw_memcpy( merge_ie, pIE->data +4, pIE->Length -4);\n\t\t\t\tlen += pIE->Length-4;\n\t\t\t\tmerge_ie += pIE->Length-4;\n\t\t\t}\n\n\t\t\ti += (pIE->Length + 2);\n\t\t}\n\n\t\treturn len + 4;\t// 4 is for P2P OUI\n\n\t}\n\n\treturn 0;\n}\n\nvoid dump_p2p_ie(void *sel, u8 *ie, u32 ie_len) {\n\tu8* pos = (u8*)ie;\n\tu8 id;\n\tu16 len;\n\n\tu8 *p2p_ie;\n\tuint p2p_ielen;\n\t\n\tp2p_ie = rtw_get_p2p_ie(ie, ie_len, NULL, &p2p_ielen);\n\tif(p2p_ie != ie || p2p_ielen == 0)\n\t\treturn;\n\n\tpos+=6;\n\twhile(pos-ie < ie_len){\n\t\tid = *pos;\n\t\tlen = RTW_GET_LE16(pos+1);\n\n\t\tDBG_871X_SEL_NL(sel, \"%s ID:%u, LEN:%u\\n\", __FUNCTION__, id, len);\n\n\t\tpos+=(3+len);\n\t}\t\n}\n\nu8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type)\n{\n\tu8*\tp2p = NULL;\n\n\tDBG_871X( \"[%s] frame_type = %d\\n\", __FUNCTION__, frame_type );\n\tswitch( frame_type )\n\t{\n\t\tcase 1:\n\t\tcase 3:\n\t\t{\t//\tBeacon or Probe Response\n\t\t\tp2p = rtw_get_p2p_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, p2p_ie, p2p_ielen);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\t//\tProbe Request\n\t\t\tp2p = rtw_get_p2p_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , p2p_ie, p2p_ielen);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn p2p;\n}\n\n/**\n * rtw_get_p2p_ie - Search P2P IE from a series of IEs\n * @in_ie: Address of IEs to search\n * @in_len: Length limit from in_ie\n * @p2p_ie: If not NULL and P2P IE is found, P2P IE will be copied to the buf starting from p2p_ie\n * @p2p_ielen: If not NULL and P2P IE is found, will set to the length of the entire P2P IE\n *\n * Returns: The address of the P2P IE found, or NULL\n */\nu8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)\n{\n\tuint cnt;\n\tu8 *p2p_ie_ptr = NULL;\n\tu8 eid, p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09};\n\n\tif (p2p_ielen)\n\t\t*p2p_ielen = 0;\n\n\tif (!in_ie || in_len < 0) {\n\t\trtw_warn_on(1);\n\t\treturn p2p_ie_ptr;\n\t}\n\n\tif (in_len <= 0)\n\t\treturn p2p_ie_ptr;\n\n\tcnt = 0;\n\n\twhile (cnt + 1 + 4 < in_len) {\n\t\teid = in_ie[cnt];\n\n\t\tif (cnt + 1 + 4 >= MAX_IE_SZ) {\n\t\t\trtw_warn_on(1);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], p2p_oui, 4) == _TRUE) {\n\t\t\tp2p_ie_ptr = in_ie + cnt;\n\n\t\t\tif (p2p_ie)\n\t\t\t\t_rtw_memcpy(p2p_ie, &in_ie[cnt], in_ie[cnt + 1] + 2);\n\n\t\t\tif (p2p_ielen)\n\t\t\t\t*p2p_ielen = in_ie[cnt + 1] + 2;\n\n\t\t\tbreak;\n\t\t} else {\n\t\t\tcnt += in_ie[cnt + 1] + 2;\n\t\t}\n\n\t}\n\n\treturn p2p_ie_ptr;\n}\n\n/**\n * rtw_get_p2p_attr - Search a specific P2P attribute from a given P2P IE\n * @p2p_ie: Address of P2P IE to search\n * @p2p_ielen: Length limit from p2p_ie\n * @target_attr_id: The attribute ID of P2P attribute to search\n * @buf_attr: If not NULL and the P2P attribute is found, P2P attribute will be copied to the buf starting from buf_attr\n * @len_attr: If not NULL and the P2P attribute is found, will set to the length of the entire P2P attribute\n *\n * Returns: the address of the specific WPS attribute found, or NULL\n */\nu8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr)\n{\n\tu8 *attr_ptr = NULL;\n\tu8 *target_attr_ptr = NULL;\n\tu8 p2p_oui[4]={0x50,0x6F,0x9A,0x09};\n\n\tif(len_attr)\n\t\t*len_attr = 0;\n\n\tif ( !p2p_ie || ( p2p_ie[0] != _VENDOR_SPECIFIC_IE_ ) ||\n\t\t( _rtw_memcmp( p2p_ie + 2, p2p_oui , 4 ) != _TRUE ) )\n\t{\n\t\treturn attr_ptr;\n\t}\n\n\t// 6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type)\n\tattr_ptr = p2p_ie + 6; //goto first attr\n\t\n\twhile(attr_ptr - p2p_ie < p2p_ielen)\n\t{\n\t\t// 3 = 1(Attribute ID) + 2(Length)\n\t\tu8 attr_id = *attr_ptr;\n\t\tu16 attr_data_len = RTW_GET_LE16(attr_ptr + 1);\n\t\tu16 attr_len = attr_data_len + 3;\n\t\t\n\t\t//DBG_871X(\"%s attr_ptr:%p, id:%u, length:%u\\n\", __FUNCTION__, attr_ptr, attr_id, attr_data_len);\n\t\tif( attr_id == target_attr_id )\n\t\t{\n\t\t\ttarget_attr_ptr = attr_ptr;\n\t\t\n\t\t\tif(buf_attr)\n\t\t\t\t_rtw_memcpy(buf_attr, attr_ptr, attr_len);\n\t\t\t\n\t\t\tif(len_attr)\n\t\t\t\t*len_attr = attr_len;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tattr_ptr += attr_len; //goto next\n\t\t}\t\t\n\t\t\n\t}\t\n\n\treturn target_attr_ptr;\n}\n\n/**\n * rtw_get_p2p_attr_content - Search a specific P2P attribute content from a given P2P IE\n * @p2p_ie: Address of P2P IE to search\n * @p2p_ielen: Length limit from p2p_ie\n * @target_attr_id: The attribute ID of P2P attribute to search\n * @buf_content: If not NULL and the P2P attribute is found, P2P attribute content will be copied to the buf starting from buf_content\n * @len_content: If not NULL and the P2P attribute is found, will set to the length of the P2P attribute content\n *\n * Returns: the address of the specific P2P attribute content found, or NULL\n */\nu8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content)\n{\n\tu8 *attr_ptr;\n\tu32 attr_len;\n\n\tif(len_content)\n\t\t*len_content = 0;\n\t\n\tattr_ptr = rtw_get_p2p_attr(p2p_ie, p2p_ielen, target_attr_id, NULL, &attr_len);\n\n\tif(attr_ptr && attr_len)\n\t{\n\t\tif(buf_content)\n\t\t\t_rtw_memcpy(buf_content, attr_ptr+3, attr_len-3);\n\n\t\tif(len_content)\n\t\t\t*len_content = attr_len-3;\n\n\t\treturn attr_ptr+3;\n\t}\n\n\treturn NULL;\n}\n\nu32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr)\n{\t\n\tu32 a_len;\n\n\t*pbuf = attr_id;\n\t\t\n\t//*(u16*)(pbuf + 1) = cpu_to_le16(attr_len);\n\tRTW_PUT_LE16(pbuf + 1, attr_len);\n\n\tif(pdata_attr)\n\t\t_rtw_memcpy(pbuf + 3, pdata_attr, attr_len);\t\t\n\t\t\n\ta_len = attr_len + 3;\n\t\t\n\treturn a_len;\n}\n\nstatic uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)\n{\n\tu8 *target_attr;\n\tu32 target_attr_len;\n\tuint ielen = ielen_ori;\n\tint index=0;\n\n\twhile(1) {\n\t\ttarget_attr=rtw_get_p2p_attr(ie, ielen, attr_id, NULL, &target_attr_len);\n\t\tif(target_attr && target_attr_len)\n\t\t{\n\t\t\tu8 *next_attr = target_attr+target_attr_len;\n\t\t\tuint remain_len = ielen-(next_attr-ie);\n\t\t\t//dump_ies(RTW_DBGDUMP, ie, ielen);\n\t\t\t#if 0\n\t\t\tDBG_871X(\"[%d] ie:%p, ielen:%u\\n\"\n\t\t\t\t\"target_attr:%p, target_attr_len:%u\\n\"\n\t\t\t\t\"next_attr:%p, remain_len:%u\\n\"\n\t\t\t\t, index++\n\t\t\t\t, ie, ielen\n\t\t\t\t, target_attr, target_attr_len\n\t\t\t\t, next_attr, remain_len\n\t\t\t);\n\t\t\t#endif\n\n\t\t\t_rtw_memset(target_attr, 0, target_attr_len);\n\t\t\t_rtw_memcpy(target_attr, next_attr, remain_len);\n\t\t\t_rtw_memset(target_attr+remain_len, 0, target_attr_len);\n\t\t\t*(ie+1) -= target_attr_len;\n\t\t\tielen-=target_attr_len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//if(index>0)\n\t\t\t//\tdump_ies(RTW_DBGDUMP, ie, ielen);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn ielen;\n}\n\nvoid rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id)\n{\n\tu8 *p2p_ie;\n\tuint p2p_ielen, p2p_ielen_ori;\n\tint cnt;\n\t\n\tif( (p2p_ie=rtw_get_p2p_ie(bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen_ori)) ) \n\t{\n\t\tif (0)\n\t\t\tif(rtw_get_p2p_attr(p2p_ie, p2p_ielen_ori, attr_id, NULL, NULL)) {\n\t\t\t\tDBG_871X(\"rtw_get_p2p_attr: GOT P2P_ATTR:%u!!!!!!!!\\n\", attr_id);\n\t\t\t\tdump_ies(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);\n\t\t\t}\n\n\t\tp2p_ielen=rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id);\n\t\tif(p2p_ielen != p2p_ielen_ori) {\n\t\t\t\n\t\t\tu8 *next_ie_ori = p2p_ie+p2p_ielen_ori;\n\t\t\tu8 *next_ie = p2p_ie+p2p_ielen;\n\t\t\tuint remain_len = bss_ex->IELength-(next_ie_ori-bss_ex->IEs);\n\n\t\t\t_rtw_memcpy(next_ie, next_ie_ori, remain_len);\n\t\t\t_rtw_memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen);\n\t\t\tbss_ex->IELength -= p2p_ielen_ori-p2p_ielen;\n\n\t\t\tif (0) {\n\t\t\t\tDBG_871X(\"remove P2P_ATTR:%u!\\n\", attr_id);\n\t\t\t\tdump_ies(RTW_DBGDUMP, bss_ex->IEs+_FIXED_IE_LENGTH_, bss_ex->IELength-_FIXED_IE_LENGTH_);\n\t\t\t}\n\t\t}\n\t}\n}\n\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_WFD\nvoid dump_wfd_ie(void *sel, u8 *ie, u32 ie_len)\n{\n\tu8* pos = (u8*)ie;\n\tu8 id;\n\tu16 len;\n\n\tu8 *wfd_ie;\n\tuint wfd_ielen;\n\n\tif(rtw_get_wfd_ie(ie, ie_len, NULL, &wfd_ielen) == _FALSE)\n\t\treturn;\n\n\tpos+=6;\n\twhile(pos-ie < ie_len){\n\t\tid = *pos;\n\t\tlen = RTW_GET_BE16(pos+1);\n\n\t\tDBG_871X_SEL_NL(sel, \"%s ID:%u, LEN:%u\\n\", __FUNCTION__, id, len);\n\n\t\tpos+=(3+len);\n\t}\n}\n\nint rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen)\n{\n\tint match;\n\tuint cnt = 0;\t\n\tu8 eid, wfd_oui[4]={0x50,0x6F,0x9A,0x0A};\n\n\n\tmatch=_FALSE;\n\n\tif ( in_len < 0 )\n\t{\n\t\treturn match;\n\t}\n\n\twhile(cnt<in_len)\n\t{\n\t\teid = in_ie[cnt];\n\t\t\n\t\tif( ( eid == _VENDOR_SPECIFIC_IE_ ) && ( _rtw_memcmp( &in_ie[cnt+2], wfd_oui, 4) == _TRUE ) )\n\t\t{\n\t\t\tif ( wfd_ie != NULL )\n\t\t\t{\n\t\t\t\t_rtw_memcpy( wfd_ie, &in_ie[ cnt ], in_ie[ cnt + 1 ] + 2 );\n\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( wfd_ielen != NULL )\n\t\t\t\t{\n\t\t\t\t\t*wfd_ielen = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( wfd_ielen != NULL )\n\t\t\t{\n\t\t\t\t*wfd_ielen = in_ie[ cnt + 1 ] + 2;\n\t\t\t}\n\t\t\t\n\t\t\tcnt += in_ie[ cnt + 1 ] + 2;\n\n\t\t\tmatch = _TRUE;\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcnt += in_ie[ cnt + 1 ] +2; //goto next\t\n\t\t}\t\t\n\t\t\n\t}\t\n\n\tif ( match == _TRUE )\n\t{\n\t\tmatch = cnt;\n\t}\n\t\n\treturn match;\n\n}\n\nint rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen, u8 frame_type)\n{\n\tint match;\n\n\tmatch=_FALSE;\n\n\tDBG_871X( \"[%s] frame_type = %d\\n\", __FUNCTION__, frame_type );\n\tswitch( frame_type )\n\t{\n\t\tcase 1:\n\t\tcase 3:\n\t\t{\t//\tBeacon or Probe Response\n\t\t\tmatch = rtw_get_wfd_ie(in_ie + _PROBERSP_IE_OFFSET_, in_len - _PROBERSP_IE_OFFSET_, wfd_ie, wfd_ielen);\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\t//\tProbe Request\n\t\t\tmatch = rtw_get_wfd_ie(in_ie + _PROBEREQ_IE_OFFSET_ , in_len - _PROBEREQ_IE_OFFSET_ , wfd_ie, wfd_ielen);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn match;\n}\n\n//\tattr_content: The output buffer, contains the \"body field\" of WFD attribute.\n//\tattr_contentlen: The data length of the \"body field\" of WFD attribute.\nint rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen)\n{\n\tint match;\n\tuint cnt = 0;\t\n\tu8 attr_id, wfd_oui[4]={0x50,0x6F,0x9A,0x0A};\n\n\n\tmatch=_FALSE;\n\n\tif ( ( wfd_ie[ 0 ] != _VENDOR_SPECIFIC_IE_ ) ||\n\t\t( _rtw_memcmp( wfd_ie + 2, wfd_oui , 4 ) != _TRUE ) )\n\t{\n\t\treturn( match );\n\t}\n\n\t//\t1 ( WFD IE ) + 1 ( Length ) + 3 ( OUI ) + 1 ( OUI Type )\n\tcnt = 6;\n\twhile( cnt < wfd_ielen )\n\t{\n\t\tu16 attrlen = RTW_GET_BE16(wfd_ie + cnt + 1);\n\t\t\n\t\tattr_id = wfd_ie[cnt];\n\t\tif( attr_id == target_attr_id )\n\t\t{\n\t\t\t//\t3 -> 1 byte for attribute ID field, 2 bytes for length field\n\t\t\tif(attr_content)\n\t\t\t\t_rtw_memcpy( attr_content, &wfd_ie[ cnt + 3 ], attrlen );\n\t\t\t\n\t\t\tif(attr_contentlen)\n\t\t\t\t*attr_contentlen = attrlen;\n\t\t\t\n\t\t\tcnt += attrlen + 3;\n\n\t\t\tmatch = _TRUE;\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcnt += attrlen + 3; //goto next\t\n\t\t}\t\t\n\t\t\n\t}\t\n\n\treturn match;\n\n}\n#endif // CONFIG_WFD\n\n//Baron adds to avoid FreeBSD warning\nint ieee80211_is_empty_essid(const char *essid, int essid_len)\n{\n\t/* Single white space is for Linksys APs */\n\tif (essid_len == 1 && essid[0] == ' ')\n\t\treturn 1;\n\n\t/* Otherwise, if the entire essid is 0, we assume it is hidden */\n\twhile (essid_len) {\n\t\tessid_len--;\n\t\tif (essid[essid_len] != '\\0')\n\t\t\treturn 0;\n\t}\n\n\treturn 1;\n}\n\nint ieee80211_get_hdrlen(u16 fc)\n{\n\tint hdrlen = 24;\n\n\tswitch (WLAN_FC_GET_TYPE(fc)) {\n\tcase RTW_IEEE80211_FTYPE_DATA:\n\t\tif (fc & RTW_IEEE80211_STYPE_QOS_DATA)\n\t\t\thdrlen += 2;\n\t\tif ((fc & RTW_IEEE80211_FCTL_FROMDS) && (fc & RTW_IEEE80211_FCTL_TODS))\n\t\t\thdrlen += 6; /* Addr4 */\n\t\tbreak;\n\tcase RTW_IEEE80211_FTYPE_CTL:\n\t\tswitch (WLAN_FC_GET_STYPE(fc)) {\n\t\tcase RTW_IEEE80211_STYPE_CTS:\n\t\tcase RTW_IEEE80211_STYPE_ACK:\n\t\t\thdrlen = 10;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\thdrlen = 16;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn hdrlen;\n}\n\nint rtw_get_cipher_info(struct wlan_network *pnetwork)\n{\n\tu32 wpa_ielen;\n\tunsigned char *pbuf;\n\tint group_cipher = 0, pairwise_cipher = 0, is8021x = 0;\n\tint ret = _FAIL;\n\tpbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);\n\n\tif(pbuf && (wpa_ielen>0)) {\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_cipher_info: wpa_ielen: %d\", wpa_ielen));\n\t\tif (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is8021x)) {\n\n\t\t\tpnetwork->BcnInfo.pairwise_cipher = pairwise_cipher;\n\t\t\tpnetwork->BcnInfo.group_cipher = group_cipher;\n\t\t\tpnetwork->BcnInfo.is_8021x = is8021x;\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"%s: pnetwork->pairwise_cipher: %d, is_8021x is %d\",\n\t\t\t\t\t\t__func__, pnetwork->BcnInfo.pairwise_cipher, pnetwork->BcnInfo.is_8021x));\n\t\t\tret = _SUCCESS;\n\t\t}\n\t} else {\n\n\t\tpbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);\n\n\t\tif(pbuf && (wpa_ielen>0)) {\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"get RSN IE\\n\"));\n\t\t\tif (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is8021x)) {\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"get RSN IE  OK!!!\\n\"));\n\t\t\t\tpnetwork->BcnInfo.pairwise_cipher = pairwise_cipher;\n\t\t\t\tpnetwork->BcnInfo.group_cipher = group_cipher;\n\t\t\t\tpnetwork->BcnInfo.is_8021x = is8021x;\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"%s: pnetwork->pairwise_cipher: %d,\"\n\t\t\t\t\t\t\t\"pnetwork->group_cipher is %d, is_8021x is %d\",\t__func__, pnetwork->BcnInfo.pairwise_cipher,\n\t\t\t\t\t\t\tpnetwork->BcnInfo.group_cipher,pnetwork->BcnInfo.is_8021x));\n\t\t\t\tret = _SUCCESS;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nvoid rtw_get_bcn_info(struct wlan_network *pnetwork)\n{\n\tunsigned short cap = 0;\n\tu8 bencrypt = 0;\n\t//u8 wpa_ie[255],rsn_ie[255];\n\tu16 wpa_len=0,rsn_len=0;\n\tstruct HT_info_element *pht_info = NULL;\n\tstruct rtw_ieee80211_ht_cap *pht_cap = NULL;\n\tunsigned int\t\tlen;\n\tunsigned char\t\t*p;\n\n\t_rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);\n\tcap = le16_to_cpu(cap);\n\tif (cap & WLAN_CAPABILITY_PRIVACY) {\n\t\tbencrypt = 1;\n\t\tpnetwork->network.Privacy = 1;\n\t} else {\n\t\tpnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_OPENSYS;\n\t}\n\trtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,NULL,&rsn_len,NULL,&wpa_len);\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: wpa_len=%d rsn_len=%d\\n\",wpa_len,rsn_len));\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: wpa_len=%d rsn_len=%d\\n\",wpa_len,rsn_len));\n\n\tif (rsn_len > 0) {\n\t\tpnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA2;\n\t} else if (wpa_len > 0) {\n\t\tpnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WPA;\n\t} else {\n\t\tif (bencrypt)\n\t\t\tpnetwork->BcnInfo.encryp_protocol = ENCRYP_PROTOCOL_WEP;\n\t}\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: pnetwork->encryp_protocol is %x\\n\",\n\t\t\t\tpnetwork->BcnInfo.encryp_protocol));\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_get_bcn_info: pnetwork->encryp_protocol is %x\\n\",\n\t\t\t\tpnetwork->BcnInfo.encryp_protocol));\n\trtw_get_cipher_info(pnetwork);\n\n\t/* get bwmode and ch_offset */\n\t/* parsing HT_CAP_IE */\n\tp = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_);\n\tif(p && len>0) {\n\t\t\tpht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2);\n\t\t\tpnetwork->BcnInfo.ht_cap_info = pht_cap->cap_info;\n\t} else {\n\t\t\tpnetwork->BcnInfo.ht_cap_info = 0;\n\t}\n\t/* parsing HT_INFO_IE */\n\tp = rtw_get_ie(pnetwork->network.IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, pnetwork->network.IELength - _FIXED_IE_LENGTH_);\n\tif(p && len>0) {\n\t\t\tpht_info = (struct HT_info_element *)(p + 2);\n\t\t\tpnetwork->BcnInfo.ht_info_infos_0 = pht_info->infos[0];\n\t} else {\n\t\t\tpnetwork->BcnInfo.ht_info_infos_0 = 0;\n\t}\n}\n\nu8\trtw_ht_mcsset_to_nss(u8 *supp_mcs_set)\n{\n\tu8 nss = 1;\n\t\n\tif (supp_mcs_set[3])\n\t\tnss = 4;\n\telse if (supp_mcs_set[2])\n\t\tnss = 3;\n\telse if (supp_mcs_set[1])\n\t\tnss = 2;\n\telse if (supp_mcs_set[0])\n\t\tnss = 1;\n\telse\n\t\tDBG_871X(\"%s,%d, warning! supp_mcs_set is zero\\n\", __func__, __LINE__);\n\t/* DBG_871X(\"%s HT: %dSS\\n\", __FUNCTION__, nss); */\n\treturn nss;\n}\n\n//show MCS rate, unit: 100Kbps\nu16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate)\n{\n\tu16 max_rate = 0;\n\n\t/*MCS_rate[2] = 3T3R , MCS_rate[1] = 2T2R , MCS_rate[0] = 1T1R*/\n\tif (MCS_rate[2]) {\n\t\tif (MCS_rate[2] & BIT(7))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?4500:4050):((short_GI)?2167:1950);\n\t\telse if (MCS_rate[2] & BIT(6))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?4050:3645):((short_GI)?1950:1750);\n\t\telse if (MCS_rate[2] & BIT(5))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?3600:3240):((short_GI)?1733:1560);\n\t\telse if (MCS_rate[2] & BIT(4))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?2700:2430):((short_GI)?1300:1170);\n\t\telse if (MCS_rate[2] & BIT(3))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1800:1620):((short_GI)?867:780);\n\t\telse if (MCS_rate[2] & BIT(2))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585);\n\t\telse if (MCS_rate[2] & BIT(1))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);\n\t\telse if (MCS_rate[2] & BIT(0))\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195);\n\t} else if (MCS_rate[1]) {\n\t\t\tif(MCS_rate[1] & BIT(7))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?3000:2700):((short_GI)?1444:1300);\n\t\t\telse if(MCS_rate[1] & BIT(6))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?2700:2430):((short_GI)?1300:1170);\n\t\t\telse if(MCS_rate[1] & BIT(5))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?2400:2160):((short_GI)?1156:1040);\n\t\t\telse if(MCS_rate[1] & BIT(4))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1800:1620):((short_GI)?867:780);\n\t\t\telse if(MCS_rate[1] & BIT(3))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520);\n\t\t\telse if(MCS_rate[1] & BIT(2))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);\n\t\t\telse if(MCS_rate[1] & BIT(1))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260);\n\t\t\telse if(MCS_rate[1] & BIT(0))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);\n\t} else {\n\t\t\tif(MCS_rate[0] & BIT(7))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1500:1350):((short_GI)?722:650);\n\t\t\telse if(MCS_rate[0] & BIT(6))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1350:1215):((short_GI)?650:585);\n\t\t\telse if(MCS_rate[0] & BIT(5))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?1200:1080):((short_GI)?578:520);\n\t\t\telse if(MCS_rate[0] & BIT(4))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?900:810):((short_GI)?433:390);\n\t\t\telse if(MCS_rate[0] & BIT(3))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?600:540):((short_GI)?289:260);\n\t\t\telse if(MCS_rate[0] & BIT(2))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?450:405):((short_GI)?217:195);\n\t\t\telse if(MCS_rate[0] & BIT(1))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);\n\t\t\telse if(MCS_rate[0] & BIT(0))\n\t\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);\n\t\t}\n\n\treturn max_rate;\n}\n\nint rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action)\n{\n\tconst u8 *frame_body = frame + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu16 fc;\n\tu8 c;\n\tu8 a = ACT_PUBLIC_MAX;\n\n\tfc = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)frame)->frame_ctl);\n\n\tif ((fc & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE))\n\t\t!= (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION)\n\t)\n\t{\n\t\treturn _FALSE;\n\t}\n\n\tc = frame_body[0];\n\n\tswitch(c) {\n\tcase RTW_WLAN_CATEGORY_P2P: /* vendor-specific */\n\t\tbreak;\n\tdefault:\n\t\ta = frame_body[1];\n\t}\n\n\tif (category)\n\t\t*category = c;\n\tif (action)\n\t\t*action = a;\n\n\treturn _TRUE;\n}\n\nstatic const char *_action_public_str[] = {\n\t\"ACT_PUB_BSSCOEXIST\",\n\t\"ACT_PUB_DSE_ENABLE\",\n\t\"ACT_PUB_DSE_DEENABLE\",\n\t\"ACT_PUB_DSE_REG_LOCATION\",\n\t\"ACT_PUB_EXT_CHL_SWITCH\",\n\t\"ACT_PUB_DSE_MSR_REQ\",\n\t\"ACT_PUB_DSE_MSR_RPRT\",\n\t\"ACT_PUB_MP\",\n\t\"ACT_PUB_DSE_PWR_CONSTRAINT\",\n\t\"ACT_PUB_VENDOR\",\n\t\"ACT_PUB_GAS_INITIAL_REQ\",\n\t\"ACT_PUB_GAS_INITIAL_RSP\",\n\t\"ACT_PUB_GAS_COMEBACK_REQ\",\n\t\"ACT_PUB_GAS_COMEBACK_RSP\",\n\t\"ACT_PUB_TDLS_DISCOVERY_RSP\",\n\t\"ACT_PUB_LOCATION_TRACK\",\n\t\"ACT_PUB_RSVD\",\n};\n\nconst char *action_public_str(u8 action)\n{\n\taction = (action >= ACT_PUBLIC_MAX) ? ACT_PUBLIC_MAX : action;\n\treturn _action_public_str[action];\n}\n\n"
  },
  {
    "path": "core/rtw_io.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*\n\nThe purpose of rtw_io.c\n\na. provides the API\n\nb. provides the protocol engine\n\nc. provides the software interface between caller and the hardware interface\n\n\nCompiler Flag Option:\n\n1. CONFIG_SDIO_HCI:\n    a. USE_SYNC_IRP:  Only sync operations are provided.\n    b. USE_ASYNC_IRP:Both sync/async operations are provided.\n\n2. CONFIG_USB_HCI:\n   a. USE_ASYNC_IRP: Both sync/async operations are provided.\n\n3. CONFIG_CFIO_HCI:\n   b. USE_SYNC_IRP: Only sync operations are provided.\n\n\nOnly sync read/rtw_write_mem operations are provided.\n\njackson@realtek.com.tw\n\n*/\n\n#define _RTW_IO_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n#error \"Shall be Linux or Windows, but not both!\\n\"\n#endif\n\n#ifdef CONFIG_SDIO_HCI\n#define rtw_le16_to_cpu(val) \t\tval\n#define rtw_le32_to_cpu(val)\t\tval\n#define rtw_cpu_to_le16(val)\t\tval\n#define rtw_cpu_to_le32(val)\t\tval\n#else\n#define rtw_le16_to_cpu(val) \t\tle16_to_cpu(val)\n#define rtw_le32_to_cpu(val)\t\tle32_to_cpu(val)\n#define rtw_cpu_to_le16(val)\t\tcpu_to_le16(val)\n#define rtw_cpu_to_le32(val)\t\tcpu_to_le32(val)\n#endif\n\n\nu8 _rtw_read8(_adapter *adapter, u32 addr)\n{\n\tu8 r_val;\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tu8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);\n\t_func_enter_;\n\t_read8 = pintfhdl->io_ops._read8;\n\n\tr_val = _read8(pintfhdl, addr);\n\t_func_exit_;\n\treturn r_val;\n}\n\nu16 _rtw_read16(_adapter *adapter, u32 addr)\n{\n\tu16 r_val;\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tu16 \t(*_read16)(struct intf_hdl *pintfhdl, u32 addr);\n\t_func_enter_;\n\t_read16 = pintfhdl->io_ops._read16;\n\n\tr_val = _read16(pintfhdl, addr);\n\t_func_exit_;\n\treturn rtw_le16_to_cpu(r_val);\n}\n\nu32 _rtw_read32(_adapter *adapter, u32 addr)\n{\n\tu32 r_val;\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tu32 \t(*_read32)(struct intf_hdl *pintfhdl, u32 addr);\n\t_func_enter_;\n\t_read32 = pintfhdl->io_ops._read32;\n\n\tr_val = _read32(pintfhdl, addr);\n\t_func_exit_;\n\treturn rtw_le32_to_cpu(r_val);\n\n}\n\nint _rtw_write8(_adapter *adapter, u32 addr, u8 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\tint ret;\n\t_func_enter_;\n\t_write8 = pintfhdl->io_ops._write8;\n\n\tret = _write8(pintfhdl, addr, val);\n\t_func_exit_;\n\t\n\treturn RTW_STATUS_CODE(ret);\n}\nint _rtw_write16(_adapter *adapter, u32 addr, u16 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\tint ret;\n\t_func_enter_;\n\t_write16 = pintfhdl->io_ops._write16;\n\n\tval = rtw_cpu_to_le16(val);\n\tret = _write16(pintfhdl, addr, val);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\nint _rtw_write32(_adapter *adapter, u32 addr, u32 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\tint ret;\n\t_func_enter_;\n\t_write32 = pintfhdl->io_ops._write32;\n\t\n\tval = rtw_cpu_to_le32(val);\n\tret = _write32(pintfhdl, addr, val);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\n\nint _rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *pdata)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n        struct\tintf_hdl\t*pintfhdl = (struct intf_hdl*)(&(pio_priv->intf));\n\tint (*_writeN)(struct intf_hdl *pintfhdl, u32 addr,u32 length, u8 *pdata);\n\tint ret;\n\t_func_enter_;\n\t_writeN = pintfhdl->io_ops._writeN;\n\n\tret = _writeN(pintfhdl, addr,length,pdata);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\n\n#ifdef CONFIG_SDIO_HCI\nu8 _rtw_sd_f0_read8(_adapter *adapter, u32 addr)\n{\n\tu8 r_val = 0x00;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tu8 (*_sd_f0_read8)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t_func_enter_;\n\t_sd_f0_read8 = pintfhdl->io_ops._sd_f0_read8;\n\n\tif (_sd_f0_read8)\n\t\tr_val = _sd_f0_read8(pintfhdl, addr);\n\telse\n\t\tDBG_871X_LEVEL(_drv_warning_, FUNC_ADPT_FMT\" _sd_f0_read8 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\t_func_exit_;\n\treturn r_val;\n}\n\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\nu8 _rtw_sd_iread8(_adapter *adapter, u32 addr)\n{\n\tu8 r_val = 0x00;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tu8 (*_sd_iread8)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t_sd_iread8 = pintfhdl->io_ops._sd_iread8;\n\n\tif (_sd_iread8)\n\t\tr_val = _sd_iread8(pintfhdl, addr);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iread8 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn r_val;\n}\n\nu16 _rtw_sd_iread16(_adapter *adapter, u32 addr)\n{\n\tu16 r_val = 0x00;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tu16 (*_sd_iread16)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t_sd_iread16 = pintfhdl->io_ops._sd_iread16;\n\n\tif (_sd_iread16)\n\t\tr_val = _sd_iread16(pintfhdl, addr);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iread16 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn r_val;\n}\n\nu32 _rtw_sd_iread32(_adapter *adapter, u32 addr)\n{\n\tu32 r_val = 0x00;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tu32 (*_sd_iread32)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t_sd_iread32 = pintfhdl->io_ops._sd_iread32;\n\n\tif (_sd_iread32)\n\t\tr_val = _sd_iread32(pintfhdl, addr);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iread32 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn r_val;\n}\n\nint _rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val)\n{\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tint (*_sd_iwrite8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\tint ret = -1;\n\n\t_sd_iwrite8 = pintfhdl->io_ops._sd_iwrite8;\n\n\tif (_sd_iwrite8)\n\t\tret = _sd_iwrite8(pintfhdl, addr, val);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iwrite8 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn RTW_STATUS_CODE(ret);\n}\n\nint _rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val)\n{\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tint (*_sd_iwrite16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\tint ret = -1;\n\n\t_sd_iwrite16 = pintfhdl->io_ops._sd_iwrite16;\n\n\tif (_sd_iwrite16)\n\t\tret = _sd_iwrite16(pintfhdl, addr, val);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iwrite16 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn RTW_STATUS_CODE(ret);\n}\nint _rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val)\n{\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\tint (*_sd_iwrite32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\tint ret = -1;\n\n\t_sd_iwrite32 = pintfhdl->io_ops._sd_iwrite32;\n\n\tif (_sd_iwrite32)\n\t\tret = _sd_iwrite32(pintfhdl, addr, val);\n\telse\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" _sd_iwrite32 callback is NULL\\n\", FUNC_ADPT_ARG(adapter));\n\n\treturn RTW_STATUS_CODE(ret);\n}\n\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n\n#endif /* CONFIG_SDIO_HCI */\n\nint _rtw_write8_async(_adapter *adapter, u32 addr, u8 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\tint ret;\n\t_func_enter_;\n\t_write8_async = pintfhdl->io_ops._write8_async;\n\n\tret = _write8_async(pintfhdl, addr, val);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\nint _rtw_write16_async(_adapter *adapter, u32 addr, u16 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\tint ret;\n\t_func_enter_;\n\t_write16_async = pintfhdl->io_ops._write16_async;\n\tval = rtw_cpu_to_le16(val);\n\tret = _write16_async(pintfhdl, addr, val);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\nint _rtw_write32_async(_adapter *adapter, u32 addr, u32 val)\n{\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tint (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\tint ret;\n\t_func_enter_;\n\t_write32_async = pintfhdl->io_ops._write32_async;\n\tval = rtw_cpu_to_le32(val);\n\tret = _write32_async(pintfhdl, addr, val);\n\t_func_exit_;\n\n\treturn RTW_STATUS_CODE(ret);\n}\n\nvoid _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)\n{\n\tvoid (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\n\t_func_enter_;\n\n\tif (RTW_CANNOT_RUN(adapter)) {\n\t\tRT_TRACE(_module_rtl871x_io_c_, _drv_info_, (\"rtw_read_mem:bDriverStopped(%s) OR bSurpriseRemoved(%s)\"\n\t\t\t, rtw_is_drv_stopped(adapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(adapter)?\"True\":\"False\"));\n\t\treturn;\n\t}\n\n\t_read_mem = pintfhdl->io_ops._read_mem;\n\n\t_read_mem(pintfhdl, addr, cnt, pmem);\n\n\t_func_exit_;\n\n}\n\nvoid _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)\n{\n\tvoid (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\n\t_func_enter_;\n\n\t_write_mem = pintfhdl->io_ops._write_mem;\n\n\t_write_mem(pintfhdl, addr, cnt, pmem);\n\n\t_func_exit_;\n\n}\n\nvoid _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)\n{\n\tu32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\n\t_func_enter_;\n\n\tif (RTW_CANNOT_RUN(adapter)) {\n\t\tRT_TRACE(_module_rtl871x_io_c_, _drv_info_, (\"rtw_read_port:bDriverStopped(%s) OR bSurpriseRemoved(%s)\"\n\t\t\t, rtw_is_drv_stopped(adapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(adapter)?\"True\":\"False\"));\t    \n\t     return;\n\t}\n\n\t_read_port = pintfhdl->io_ops._read_port;\n\n\t_read_port(pintfhdl, addr, cnt, pmem);\n\n\t_func_exit_;\n\n}\n\nvoid _rtw_read_port_cancel(_adapter *adapter)\n{\n\tvoid (*_read_port_cancel)(struct intf_hdl *pintfhdl);\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\n\t_read_port_cancel = pintfhdl->io_ops._read_port_cancel;\n\n\tRTW_DISABLE_FUNC(adapter, DF_RX_BIT);\n\n\tif(_read_port_cancel)\n\t\t_read_port_cancel(pintfhdl);\n}\n\nu32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem)\n{\n\tu32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t//struct\tio_queue  \t*pio_queue = (struct io_queue *)adapter->pio_queue;\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct\tintf_hdl\t\t*pintfhdl = &(pio_priv->intf);\n\tu32 ret = _SUCCESS;\n\n\t_func_enter_;\n\n\t_write_port = pintfhdl->io_ops._write_port;\n\t\n\tret = _write_port(pintfhdl, addr, cnt, pmem);\n\n\t _func_exit_;\n\n\treturn ret;\n}\n\nu32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms)\n{\n\tint ret = _SUCCESS;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)pmem;\n\tstruct submit_ctx sctx;\n\n\trtw_sctx_init(&sctx, timeout_ms);\n\tpxmitbuf->sctx = &sctx;\n\n\tret = _rtw_write_port(adapter, addr, cnt, pmem);\n\n\tif (ret == _SUCCESS)\n\t\tret = rtw_sctx_wait(&sctx, __func__);\n\n\t return ret;\n}\n\nvoid _rtw_write_port_cancel(_adapter *adapter)\n{\n\tvoid (*_write_port_cancel)(struct intf_hdl *pintfhdl);\n\tstruct io_priv *pio_priv = &adapter->iopriv;\n\tstruct intf_hdl *pintfhdl = &(pio_priv->intf);\n\n\t_write_port_cancel = pintfhdl->io_ops._write_port_cancel;\n\n\tRTW_DISABLE_FUNC(adapter, DF_TX_BIT);\n\n\tif(_write_port_cancel)\n\t\t_write_port_cancel(pintfhdl);\n}\nint rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter,struct _io_ops *pops))\n{\n\tstruct io_priv\t*piopriv = &padapter->iopriv;\n\tstruct intf_hdl *pintf = &piopriv->intf;\n\n\tif (set_intf_ops == NULL)\n\t\treturn _FAIL;\n\n\tpiopriv->padapter = padapter;\n\tpintf->padapter = padapter;\n\tpintf->pintf_dev = adapter_to_dvobj(padapter);\n\t\t\n\tset_intf_ops(padapter,&pintf->io_ops);\t\n\n\treturn _SUCCESS;\n}\n\n/*\n* Increase and check if the continual_io_error of this @param dvobjprive is larger than MAX_CONTINUAL_IO_ERR\n* @return _TRUE:\n* @return _FALSE:\n*/\nint rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj)\n{\n\tint ret = _FALSE;\n\tint value;\n\tif( (value=ATOMIC_INC_RETURN(&dvobj->continual_io_error)) > MAX_CONTINUAL_IO_ERR) {\n\t\tDBG_871X(\"[dvobj:%p][ERROR] continual_io_error:%d > %d\\n\", dvobj, value, MAX_CONTINUAL_IO_ERR);\n\t\tret = _TRUE;\n\t} else {\n\t\t//DBG_871X(\"[dvobj:%p] continual_io_error:%d\\n\", dvobj, value);\n\t}\n\treturn ret;\n}\n\n/*\n* Set the continual_io_error of this @param dvobjprive to 0\n*/\nvoid rtw_reset_continual_io_error(struct dvobj_priv *dvobj)\n{\n\tATOMIC_SET(&dvobj->continual_io_error, 0);\t\n}\n\n#ifdef DBG_IO\n\nu32 read_sniff_ranges[][2] = {\n\t//{0x520, 0x523},\n}; \n\nu32 write_sniff_ranges[][2] = {\n\t//{0x520, 0x523},\n\t//{0x4c, 0x4c},\n}; \n\nint read_sniff_num = sizeof(read_sniff_ranges)/sizeof(u32)/2;\nint write_sniff_num = sizeof(write_sniff_ranges)/sizeof(u32)/2;\n\nbool match_read_sniff_ranges(u32 addr, u16 len)\n{\n\tint i;\n\tfor (i = 0; i<read_sniff_num; i++) {\n\t\tif (addr + len > read_sniff_ranges[i][0] && addr <= read_sniff_ranges[i][1])\n\t\t\treturn _TRUE;\n\t}\n\t\n\treturn _FALSE;\n}\n\nbool match_write_sniff_ranges(u32 addr, u16 len)\n{\n\tint i;\n\tfor (i = 0; i<write_sniff_num; i++) {\n\t\tif (addr + len > write_sniff_ranges[i][0] && addr <= write_sniff_ranges[i][1])\n\t\t\treturn _TRUE;\n\t}\n\t\n\treturn _FALSE;\n}\n\nstruct rf_sniff_ent {\n\tu8 path;\n\tu16 reg;\n\tu32 mask;\n};\n\nstruct rf_sniff_ent rf_read_sniff_ranges[] = {\n\t/* example for all path addr 0x55 with all RF Reg mask */\n\t/* {MAX_RF_PATH, 0x55, bRFRegOffsetMask}, */\n};\n\nstruct rf_sniff_ent rf_write_sniff_ranges[] = {\n\t/* example for all path addr 0x55 with all RF Reg mask */\n\t/* {MAX_RF_PATH, 0x55, bRFRegOffsetMask}, */\n};\n\nint rf_read_sniff_num = sizeof(rf_read_sniff_ranges)/sizeof(struct rf_sniff_ent);\nint rf_write_sniff_num = sizeof(rf_write_sniff_ranges)/sizeof(struct rf_sniff_ent);\n\nbool match_rf_read_sniff_ranges(u8 path, u32 addr, u32 mask)\n{\n\tint i;\n\n\tfor (i = 0; i < rf_read_sniff_num; i++) {\n\t\tif (rf_read_sniff_ranges[i].path == MAX_RF_PATH || rf_read_sniff_ranges[i].path == path)\n\t\t\tif (addr == rf_read_sniff_ranges[i].reg && (mask & rf_read_sniff_ranges[i].mask))\n\t\t\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n}\n\nbool match_rf_write_sniff_ranges(u8 path, u32 addr, u32 mask)\n{\n\tint i;\n\n\tfor (i = 0; i < rf_write_sniff_num; i++) {\n\t\tif (rf_write_sniff_ranges[i].path == MAX_RF_PATH || rf_write_sniff_ranges[i].path == path)\n\t\t\tif (addr == rf_write_sniff_ranges[i].reg && (mask & rf_write_sniff_ranges[i].mask))\n\t\t\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n}\n\nu8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu8 val = _rtw_read8(adapter, addr);\n\n\tif (match_read_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_read8(0x%04x) return 0x%02x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nu16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu16 val = _rtw_read16(adapter, addr);\n\t\n\tif (match_read_sniff_ranges(addr, 2))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_read16(0x%04x) return 0x%04x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nu32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu32 val = _rtw_read32(adapter, addr);\n\t\n\tif (match_read_sniff_ranges(addr, 4))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_read32(0x%04x) return 0x%08x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nint dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_write8(0x%04x, 0x%02x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_write8(adapter, addr, val);\n}\nint dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 2))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_write16(0x%04x, 0x%04x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_write16(adapter, addr, val);\n}\nint dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 4))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_write32(0x%04x, 0x%08x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_write32(adapter, addr, val);\n}\nint dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, length))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_writeN(0x%04x, %u)\\n\", caller, line, addr, length);\n\n\treturn _rtw_writeN(adapter, addr, length, data);\n}\n\n#ifdef CONFIG_SDIO_HCI\nu8 dbg_rtw_sd_f0_read8(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu8 val = _rtw_sd_f0_read8(adapter, addr);\n\n\t#if 0\n\tif (match_read_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_f0_read8(0x%04x) return 0x%02x\\n\", caller, line, addr, val);\n\t#endif\n\n\treturn val;\n}\n\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\nu8 dbg_rtw_sd_iread8(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu8 val = rtw_sd_iread8(adapter, addr);\n\n\tif (match_read_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iread8(0x%04x) return 0x%02x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nu16 dbg_rtw_sd_iread16(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu16 val = _rtw_sd_iread16(adapter, addr);\n\t\n\tif (match_read_sniff_ranges(addr, 2))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iread16(0x%04x) return 0x%04x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nu32 dbg_rtw_sd_iread32(_adapter *adapter, u32 addr, const char *caller, const int line)\n{\n\tu32 val = _rtw_sd_iread32(adapter, addr);\n\t\n\tif (match_read_sniff_ranges(addr, 4))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iread32(0x%04x) return 0x%08x\\n\", caller, line, addr, val);\n\n\treturn val;\n}\n\nint dbg_rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iwrite8(0x%04x, 0x%02x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_sd_iwrite8(adapter, addr, val);\n}\nint dbg_rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 2))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iwrite16(0x%04x, 0x%04x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_sd_iwrite16(adapter, addr, val);\n}\nint dbg_rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 4))\n\t\tDBG_871X(\"DBG_IO %s:%d rtw_sd_iwrite32(0x%04x, 0x%08x)\\n\", caller, line, addr, val);\n\t\n\treturn _rtw_sd_iwrite32(adapter, addr, val);\n}\n\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n\n#endif /* CONFIG_SDIO_HCI */\n\n#endif\n\n\n"
  },
  {
    "path": "core/rtw_ioctl_query.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_IOCTL_QUERY_C_\n\n#include <drv_types.h>\n\n\n#ifdef PLATFORM_WINDOWS\n//\n// Added for WPA2-PSK, by Annie, 2005-09-20.\n//\nu8\nquery_802_11_capability(\n\t_adapter*\t\tAdapter,\n\tu8*\t\t\tpucBuf,\n\tu32 *\t\tpulOutLen\n)\n{\n\tstatic NDIS_802_11_AUTHENTICATION_ENCRYPTION szAuthEnc[] = \n\t{\n\t\t{Ndis802_11AuthModeOpen, Ndis802_11EncryptionDisabled}, \n\t\t{Ndis802_11AuthModeOpen, Ndis802_11Encryption1Enabled},\n\t\t{Ndis802_11AuthModeShared, Ndis802_11EncryptionDisabled}, \n\t\t{Ndis802_11AuthModeShared, Ndis802_11Encryption1Enabled},\n\t\t{Ndis802_11AuthModeWPA, Ndis802_11Encryption2Enabled}, \n\t\t{Ndis802_11AuthModeWPA, Ndis802_11Encryption3Enabled},\n\t\t{Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption2Enabled}, \n\t\t{Ndis802_11AuthModeWPAPSK, Ndis802_11Encryption3Enabled},\n\t\t{Ndis802_11AuthModeWPANone, Ndis802_11Encryption2Enabled}, \n\t\t{Ndis802_11AuthModeWPANone, Ndis802_11Encryption3Enabled},\n\t\t{Ndis802_11AuthModeWPA2, Ndis802_11Encryption2Enabled}, \n\t\t{Ndis802_11AuthModeWPA2, Ndis802_11Encryption3Enabled},\n\t\t{Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption2Enabled}, \n\t\t{Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled}\n\t};\t\n\tstatic ULONG\tulNumOfPairSupported = sizeof(szAuthEnc)/sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);\n\tNDIS_802_11_CAPABILITY * pCap = (NDIS_802_11_CAPABILITY *)pucBuf;\n\tu8*\tpucAuthEncryptionSupported = (u8*) pCap->AuthenticationEncryptionSupported;\n\n\n\tpCap->Length = sizeof(NDIS_802_11_CAPABILITY);\n\tif(ulNumOfPairSupported > 1 )\n\t\tpCap->Length += \t(ulNumOfPairSupported-1) * sizeof(NDIS_802_11_AUTHENTICATION_ENCRYPTION);\n\t\n\tpCap->Version = 2;\t\n\tpCap->NoOfPMKIDs = NUM_PMKID_CACHE;\t\n\tpCap->NoOfAuthEncryptPairsSupported = ulNumOfPairSupported;\n\n\tif( sizeof (szAuthEnc) <= 240 )\t\t// 240 = 256 - 4*4\t// SecurityInfo.szCapability: only 256 bytes in size.\n\t{\n\t\t_rtw_memcpy( pucAuthEncryptionSupported, (u8*)szAuthEnc,  sizeof (szAuthEnc) );\n\t\t*pulOutLen = pCap->Length;\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\t*pulOutLen = 0;\n\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"_query_802_11_capability(): szAuthEnc size is too large.\\n\"));\n\t\treturn _FALSE;\n\t}\n}\n\nu8 query_802_11_association_information(\t_adapter *padapter,PNDIS_802_11_ASSOCIATION_INFORMATION\tpAssocInfo)\n{\n\tstruct wlan_network *tgt_network;\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct\tsecurity_priv  *psecuritypriv=&(padapter->securitypriv);\n\tWLAN_BSSID_EX\t*psecnetwork = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\t\t\t\t\t\n\tu8 *\tpDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);\n\tunsigned char i,*auth_ie,*supp_ie;\n\n\t//NdisZeroMemory(pAssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));\n\t_rtw_memset(pAssocInfo, 0, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));\n\t//pAssocInfo->Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);\n\n\t//------------------------------------------------------\n\t// Association Request related information\n\t//------------------------------------------------------\n\t// Req_1. AvailableRequestFixedIEs\n\tif(psecnetwork!=NULL){\n\t\t\n\tpAssocInfo->AvailableRequestFixedIEs |= NDIS_802_11_AI_REQFI_CAPABILITIES|NDIS_802_11_AI_REQFI_CURRENTAPADDRESS;\n\tpAssocInfo->RequestFixedIEs.Capabilities = (unsigned short)* & psecnetwork->IEs[10];\n\t_rtw_memcpy(pAssocInfo->RequestFixedIEs.CurrentAPAddress,\n\t\t& psecnetwork->MacAddress, 6);\n\n\tpAssocInfo->OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);\n\n\tif(check_fwstate( pmlmepriv, _FW_UNDER_LINKING|_FW_LINKED)==_TRUE)\n\t{\n\t\t\n\t\tif(psecuritypriv->ndisauthtype>=Ndis802_11AuthModeWPA2)\n\t\t\tpDest[0] =48;\t\t//RSN Information Element\n\t\telse \n\t\t\tpDest[0] =221;\t//WPA(SSN) Information Element\n\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"\\n Adapter->ndisauthtype==Ndis802_11AuthModeWPA)?0xdd:0x30 [%d]\",pDest[0]));\n\t\tsupp_ie=&psecuritypriv->supplicant_ie[0];\n\t\tfor(i=0;i<supp_ie[0];i++)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"IEs [%d] = 0x%x \\n\\n\", i,supp_ie[i]));\n\t\t}\n\n\t\ti=13;\t//0~11 is fixed information element\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"i= %d tgt_network->network.IELength=%d\\n\\n\", i,(int)psecnetwork->IELength));\n\t\twhile((i<supp_ie[0]) && (i<256)){\n\t\t\tif((unsigned char)supp_ie[i]==pDest[0]){\n\t\t\t\t\t\t_rtw_memcpy((u8 *)(pDest),\n\t\t\t\t\t\t\t&supp_ie[i], \n\t\t\t\t\t\t\tsupp_ie[1+i]+2);\n\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\ti=i+supp_ie[i+1]+2;\n\t\t\tif(supp_ie[1+i]==0)\n\t\t\t\ti=i+1;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"iteration i=%d IEs [%d] = 0x%x \\n\\n\", i,i,supp_ie[i+1]));\n\t\t\t\n\t\t}\n\t\t\n\n\t\tpAssocInfo->RequestIELength += (2 + supp_ie[1+i]);// (2 + psecnetwork->IEs[1+i]+4);\n\n\t}\n\t\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"\\n psecnetwork != NULL,fwstate==_FW_UNDER_LINKING \\n\"));\n\n\t}\n\t\n\n\t//------------------------------------------------------\n\t// Association Response related information\n\t//------------------------------------------------------\n\n\tif(check_fwstate( pmlmepriv, _FW_LINKED)==_TRUE)\n\t{\n\t\ttgt_network =&(pmlmepriv->cur_network);\n\t\tif(tgt_network!=NULL){\n\t\tpAssocInfo->AvailableResponseFixedIEs =\n\t\t\t\tNDIS_802_11_AI_RESFI_CAPABILITIES\n\t\t\t\t|NDIS_802_11_AI_RESFI_ASSOCIATIONID\n\t\t\t\t;\n\n\t\tpAssocInfo->ResponseFixedIEs.Capabilities =(unsigned short)* & tgt_network->network.IEs[10];\n\t\tpAssocInfo->ResponseFixedIEs.StatusCode = 0;\n\t\tpAssocInfo->ResponseFixedIEs.AssociationId =(unsigned short) tgt_network->aid;\n\n\t\tpDest = (u8 *)pAssocInfo + sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)+pAssocInfo->RequestIELength;\n\t\tauth_ie=&psecuritypriv->authenticator_ie[0];\n\n\t\tfor(i=0;i<auth_ie[0];i++)\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"IEs [%d] = 0x%x \\n\\n\", i,auth_ie[i]));\n\n\t\ti=auth_ie[0]-12;\n\t\tif(i>0){\n\t\t\t_rtw_memcpy((u8 *)&pDest[0],&auth_ie[1],i);\n\t\t\tpAssocInfo->ResponseIELength =i; \n\t\t}\n\n\n\t\tpAssocInfo->OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAssocInfo->RequestIELength;  \n\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"\\n tgt_network != NULL,fwstate==_FW_LINKED \\n\"));\n\t\t}\n\t}\t\t\t\t\t\t\t\t\t\t\t\t  \t\n\tRT_TRACE(_module_rtl871x_ioctl_query_c_,_drv_info_,(\"\\n exit query_802_11_association_information \\n\"));\n_func_exit_;\n\n\treturn _TRUE;\n}\n#endif\n\n"
  },
  {
    "path": "core/rtw_ioctl_rtl.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define  _RTW_IOCTL_RTL_C_\n\n#include <drv_types.h>\n\n#ifdef CONFIG_MP_INCLUDED\n#include <rtw_mp_ioctl.h>\n#endif\n\nstruct oid_obj_priv oid_rtl_seg_01_01[] =\n{\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x80\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x81\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x82\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x83//OID_RT_SET_SNIFFER_MODE\n\t{1, &oid_rt_get_signal_quality_hdl},\t\t\t\t\t\t\t//0x84\n\t{1, &oid_rt_get_small_packet_crc_hdl},\t\t\t\t\t\t//0x85\n\t{1, &oid_rt_get_middle_packet_crc_hdl},\t\t\t\t\t\t//0x86\n\t{1, &oid_rt_get_large_packet_crc_hdl},\t\t\t\t\t\t//0x87\n\t{1, &oid_rt_get_tx_retry_hdl},\t\t\t\t\t\t\t\t//0x88\n\t{1, &oid_rt_get_rx_retry_hdl},\t\t\t\t\t\t\t\t//0x89\n\t{1, &oid_rt_pro_set_fw_dig_state_hdl},\t\t\t\t\t\t//0x8A\n\t{1, &oid_rt_pro_set_fw_ra_state_hdl}\t,\t\t\t\t\t\t//0x8B\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x8C\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x8D\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x8E\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x8F\n\t{1, &oid_rt_get_rx_total_packet_hdl},\t\t\t\t\t\t\t//0x90\n\t{1, &oid_rt_get_tx_beacon_ok_hdl},\t\t\t\t\t\t\t//0x91\n\t{1, &oid_rt_get_tx_beacon_err_hdl},\t\t\t\t\t\t\t//0x92\n\t{1, &oid_rt_get_rx_icv_err_hdl},\t\t\t\t\t\t\t\t//0x93\n\t{1, &oid_rt_set_encryption_algorithm_hdl},\t\t\t\t\t//0x94\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x95\n\t{1, &oid_rt_get_preamble_mode_hdl},\t\t\t\t\t\t\t//0x96\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x97\n\t{1, &oid_rt_get_ap_ip_hdl},\t\t\t\t\t\t\t\t\t//0x98\n\t{1, &oid_rt_get_channelplan_hdl},\t\t\t\t\t\t\t//0x99\t\n\t{1, &oid_rt_set_preamble_mode_hdl},\t \t\t\t\t\t\t//0x9A\n\t{1, &oid_rt_set_bcn_intvl_hdl},\t\t\t\t\t\t\t\t//0x9B\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x9C\n\t{1, &oid_rt_dedicate_probe_hdl},\t\t\t\t\t\t\t\t//0x9D\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x9E\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x9F\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA0\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA1\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA2\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA3\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA4\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA5\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xA6\n\t{1, &oid_rt_get_total_tx_bytes_hdl},\t\t\t\t\t\t\t//0xA7\n\t{1, &oid_rt_get_total_rx_bytes_hdl},\t\t\t\t\t\t\t//0xA8\n\t{1, &oid_rt_current_tx_power_level_hdl},\t\t\t\t\t\t//0xA9\t\n\t{1, &oid_rt_get_enc_key_mismatch_count_hdl},\t \t\t\t//0xAA\n\t{1, &oid_rt_get_enc_key_match_count_hdl},\t\t\t\t\t//0xAB\n\t{1, &oid_rt_get_channel_hdl},\t\t\t\t\t\t\t\t//0xAC\n\t{1, &oid_rt_set_channelplan_hdl},\t\t\t\t\t\t\t\t//0xAD\n\t{1, &oid_rt_get_hardware_radio_off_hdl},\t\t\t\t\t\t//0xAE\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xAF\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB0\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB1\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB2\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB3\n\t{1, &oid_rt_get_key_mismatch_hdl},\t\t\t\t\t\t\t//0xB4\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB5\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB6\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB7\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB8\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xB9\t\n\t{1, &oid_null_function},\t \t\t\t\t\t\t\t\t\t//0xBA\n\t{1, &oid_rt_supported_wireless_mode_hdl},\t\t\t\t\t//0xBB\n\t{1, &oid_rt_get_channel_list_hdl},\t\t\t\t\t\t\t//0xBC\n\t{1, &oid_rt_get_scan_in_progress_hdl},\t\t\t\t\t\t//0xBD\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xBE\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xBF\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC0\n\t{1, &oid_rt_forced_data_rate_hdl},\t\t\t\t\t\t\t//0xC1\n\t{1, &oid_rt_wireless_mode_for_scan_list_hdl},\t\t\t\t\t//0xC2\n\t{1, &oid_rt_get_bss_wireless_mode_hdl},\t\t\t\t\t\t//0xC3\n\t{1, &oid_rt_scan_with_magic_packet_hdl},\t\t\t\t\t//0xC4\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC5\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC6\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC7\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC8\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xC9\t\n\t{1, &oid_null_function},\t \t\t\t\t\t\t\t\t\t//0xCA\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xCB\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xCC\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xCD\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xCE\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0xCF\n\t\n};\n\nstruct oid_obj_priv oid_rtl_seg_01_03[] =\n{\n\t{1, &oid_rt_ap_get_associated_station_list_hdl},\t\t\t\t//0x00\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x01\n\t{1, &oid_rt_ap_switch_into_ap_mode_hdl},\t\t\t\t\t//0x02\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x03\n\t{1, &oid_rt_ap_supported_hdl},\t\t\t\t\t\t\t\t//0x04\n\t{1, &oid_rt_ap_set_passphrase_hdl},\t\t\t\t\t\t\t//0x05\n\n};\n\nstruct oid_obj_priv oid_rtl_seg_01_11[] =\n{\n\t{1, &oid_null_function},\t\t\t\t\t//0xC0\tOID_RT_PRO_RX_FILTER\t\n\t{1, &oid_null_function},\t\t\t\t\t//0xC1\tOID_CE_USB_WRITE_REGISTRY\n\t{1, &oid_null_function},\t\t\t\t\t//0xC2\tOID_CE_USB_READ_REGISTRY\n\t{1, &oid_null_function},\t\t\t\t\t//0xC3\tOID_RT_PRO_SET_INITIAL_GAIN\n\t{1, &oid_null_function},\t\t\t\t\t//0xC4\tOID_RT_PRO_SET_BB_RF_STANDBY_MODE\n\t{1, &oid_null_function},\t\t\t\t\t//0xC5\tOID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE\n\t{1, &oid_null_function},\t\t\t\t\t//0xC6\tOID_RT_PRO_SET_TX_CHARGE_PUMP\n\t{1, &oid_null_function},\t\t\t\t\t//0xC7\tOID_RT_PRO_SET_RX_CHARGE_PUMP\n\t{1, &oid_rt_pro_rf_write_registry_hdl},\t//0xC8\t\n\t{1, &oid_rt_pro_rf_read_registry_hdl},\t//0xC9\t\n\t{1, &oid_null_function}\t\t\t\t\t//0xCA\tOID_RT_PRO_QUERY_RF_TYPE\n\t\n};\n\nstruct oid_obj_priv oid_rtl_seg_03_00[] =\n{\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x00\n\t{1, &oid_rt_get_connect_state_hdl},\t\t\t\t\t\t\t//0x01\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x02\n\t{1, &oid_null_function},\t\t\t\t\t\t\t\t\t\t//0x03\n\t{1, &oid_rt_set_default_key_id_hdl},\t\t\t\t\t\t\t//0x04\n\n\t\n};\n\n\n//**************  oid_rtl_seg_01_01 section start ************** \n\nNDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n#if 0\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\t_irqL\t\t\toldirql;\n\t\n\t_func_enter_;\n\t\n\tif(poid_par_priv->type_of_oid != SET_OID) \n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\t\t\t\n\t_irqlevel_changed_(&oldirql,LOWER);\n\tif(poid_par_priv->information_buf_len >= sizeof(struct setdig_parm))\n\t{\n\t\t//DEBUG_ERR((\"===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\\n\",*((unsigned char*)poid_par_priv->information_buf )));\t\n\t\tif(!rtw_setfwdig_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))\t\t\t\n\t\t{\n\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t}\n\t\t                   \n\t}\n\telse{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t}  \n\t_irqlevel_changed_(&oldirql,RAISE);\n\t_func_exit_;\n#endif\n\treturn status;\n}\n//-----------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv)\n{\n\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n#if 0\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\t_irqL\t\t\toldirql;\n\t\n\t_func_enter_;\t\n\tif(poid_par_priv->type_of_oid != SET_OID) \n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\t\t\t\t\t\n\t_irqlevel_changed_(&oldirql,LOWER);\n\t\n\tif(poid_par_priv->information_buf_len >= sizeof(struct setra_parm))\n\t{\n\t\t//DEBUG_ERR((\"===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\\n\",*((unsigned char*)poid_par_priv->information_buf )));\t\n\t\tif(!rtw_setfwra_cmd(Adapter,*((unsigned char*)poid_par_priv->information_buf )))\t\t\t\n\t\t{\n\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t}\n\t\t                   \n\t}\n\telse{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t}  \n\t_irqlevel_changed_(&oldirql,RAISE);\n\t_func_exit_;\n#endif\n\treturn status;\n}\n//-----------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\t//DEBUG_ERR((\"<**********************oid_rt_get_signal_quality_hdl \\n\"));\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n#if 0\n\t\tif(pMgntInfo->mAssoc || pMgntInfo->mIbss)\n\t\t{\n\t\t\tulInfo = pAdapter->RxStats.SignalQuality;\n\t\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tulInfo = 0xffffffff; // It stands for -1 in 4-byte integer.\n\t\t}\n\t\tbreak;\n#endif\n\n\treturn status;\n}\n\n//------------------------------------------------------------------------------\n\nNDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\t\t\n\tif(poid_par_priv->information_buf_len >=  sizeof(ULONG) )\n\t{\t\t\n\t\t*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\t\t\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\tif(poid_par_priv->information_buf_len >=  sizeof(ULONG) )\n\t{\t\t\n\t\t*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\t\t\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\n\n\tif(poid_par_priv->information_buf_len >=  sizeof(ULONG) )\n\t{\t\t\n\t\t*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\t\t\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n\n\treturn status;\n}\n\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\n\tif(poid_par_priv->information_buf_len >=  sizeof(ULONG) )\n\t{\t\t\n\t\t*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\t\t\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\tif(poid_par_priv->information_buf_len>= sizeof(u32))\n\t{\n\t\t//_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));\n\t\t*(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH ;\n\t}\n\t\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tULONG\t\t\tpreamblemode = 0 ;\t\t\t\n\t\t\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\tif(poid_par_priv->information_buf_len>= sizeof(ULONG))\n\t{\t\t\n\t\tif(padapter->registrypriv.preamble == PREAMBLE_LONG)\n\t\t\tpreamblemode = 0;\n\t\telse if (padapter->registrypriv.preamble == PREAMBLE_AUTO)\n\t\t\tpreamblemode = 1;\n\t\telse if (padapter->registrypriv.preamble == PREAMBLE_SHORT)\n\t\t\tpreamblemode = 2;\n\t\t\n\t\t\t\n\t\t*(ULONG *)poid_par_priv->information_buf = preamblemode ;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH ;\n\t}\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t*(u16 *)poid_par_priv->information_buf = padapter->mlmepriv.ChannelPlan ;\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\t\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\t\n\tpadapter->mlmepriv.ChannelPlan  = *(u16 *)poid_par_priv->information_buf ;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tULONG\t\t\tpreamblemode = 0;\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\t \n\tif(poid_par_priv->information_buf_len>= sizeof(ULONG))\n\t{\t\t\n\t\tpreamblemode = *(ULONG *)poid_par_priv->information_buf ;\n\t\tif( preamblemode == 0)\n\t\t\tpadapter->registrypriv.preamble = PREAMBLE_LONG;\n\t\telse if (preamblemode==1 )\n\t\t\tpadapter->registrypriv.preamble = PREAMBLE_AUTO;\n\t\telse if ( preamblemode==2 )\n\t\t\tpadapter->registrypriv.preamble = PREAMBLE_SHORT;\t\t\n\t\t\t\n\t\t*(ULONG *)poid_par_priv->information_buf = preamblemode ;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH ;\n\t}\t\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\n\tif(poid_par_priv->information_buf_len>= sizeof(ULONG))\n\t{\t\t\n\t\t*(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH ;\n\t}\n\t\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\tif(poid_par_priv->information_buf_len>= sizeof(ULONG))\n\t{\n\t\t//_rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32));\n\t\t*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse\n\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH ;\n\t}\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tstruct\tmlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tNDIS_802_11_CONFIGURATION\t\t*pnic_Config;\n\n\tULONG   channelnum;\n\n\t_func_enter_;\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\tif ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||\n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))\n\t\tpnic_Config = &pmlmepriv->cur_network.network.Configuration;\n\telse\n\t\tpnic_Config = &padapter->registrypriv.dev_network.Configuration;\n\n\tchannelnum = pnic_Config->DSConfig;\n\t*(ULONG *)poid_par_priv->information_buf = channelnum;\n\t\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\t_func_exit_;\n\n\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tULONG \t\t\tulInfo = 0 ;\n\t//DEBUG_ERR((\"<**********************oid_rt_supported_wireless_mode_hdl \\n\"));\t\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\tif(poid_par_priv->information_buf_len >= sizeof(ULONG)){\n\t\tulInfo |= 0x0100; //WIRELESS_MODE_B\n\t\tulInfo |= 0x0200; //WIRELESS_MODE_G\n\t\tulInfo |= 0x0400; //WIRELESS_MODE_A\n\n\t\t*(ULONG *) poid_par_priv->information_buf = ulInfo;\t\t\n\t\t//DEBUG_ERR((\"<===oid_rt_supported_wireless_mode %x\\n\",ulInfo));\t\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t}\n\telse{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\n\n\nNDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\n//**************  oid_rtl_seg_01_01 section end ************** \n\n//**************  oid_rtl_seg_01_03 section start ************** \nNDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\treturn status;\n}\nNDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\treturn status;\n}\n\n//**************  oid_rtl_seg_01_03 section end ************** \n\n//****************  oid_rtl_seg_01_11   section start ****************\nNDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\t_irqL\t\t\toldirql;\n\t_func_enter_;\n\t//DEBUG_ERR((\"<**********************oid_rt_pro_rf_write_registry_hdl \\n\"));\n\tif(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\t\n\t_irqlevel_changed_(&oldirql,LOWER);\n\tif(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))\n\t{      \n\t\t//RegOffsetValue\t- The offset of RF register to write.\n\t\t//RegDataWidth\t- The data width of RF register to write.\n\t\t//RegDataValue\t- The value to write. \n\t\t//RegOffsetValue = *((unsigned long*)InformationBuffer);\n\t\t//RegDataWidth = *((unsigned long*)InformationBuffer+1);\t   \n\t\t//RegDataValue =  *((unsigned long*)InformationBuffer+2);\t\n\t\tif(!rtw_setrfreg_cmd(Adapter, \n\t\t\t\t\t\t*(unsigned char*)poid_par_priv->information_buf, \n\t\t\t\t\t\t(unsigned long)(*((unsigned long*)poid_par_priv->information_buf+2))))\n\t\t{\n\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t}\n\t                   \n\t}\n\telse{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}   \n\t_irqlevel_changed_(&oldirql,RAISE);\n\t_func_exit_;\n\n\treturn status;\n}\n\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n#if 0\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\t_irqL\toldirql;\n\t_func_enter_;\n\n\t//DEBUG_ERR((\"<**********************oid_rt_pro_rf_read_registry_hdl \\n\"));\n\tif(poid_par_priv->type_of_oid != SET_OID) //QUERY_OID\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\n\t\n\t_irqlevel_changed_(&oldirql,LOWER);\n\tif(poid_par_priv->information_buf_len== (sizeof(unsigned long)*3))\n\t{\n\t\tif(Adapter->mppriv.act_in_progress == _TRUE)\n\t\t{\n\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//init workparam\n\t\t\tAdapter->mppriv.act_in_progress = _TRUE;\n\t\t\tAdapter->mppriv.workparam.bcompleted= _FALSE;\n\t\t\tAdapter->mppriv.workparam.act_type = MPT_READ_RF;\n\t\t\tAdapter->mppriv.workparam.io_offset = *(unsigned long*)poid_par_priv->information_buf;\t\t\n\t\t\tAdapter->mppriv.workparam.io_value = 0xcccccccc;\n\t\t\t\t       \n\t\t\t//RegOffsetValue\t- The offset of RF register to read.\n\t\t\t//RegDataWidth\t- The data width of RF register to read.\n\t\t\t//RegDataValue\t- The value to read. \n\t\t\t//RegOffsetValue = *((unsigned long*)InformationBuffer);\n\t\t\t//RegDataWidth = *((unsigned long*)InformationBuffer+1);\t   \n\t\t\t//RegDataValue =  *((unsigned long*)InformationBuffer+2);\t   \t \t                   \n\t\t\tif(!rtw_getrfreg_cmd(Adapter, \n\t\t\t\t\t\t\t*(unsigned char*)poid_par_priv->information_buf, \n\t\t\t\t\t\t\t(unsigned char*)&Adapter->mppriv.workparam.io_value))\n\t\t\t{\n\t\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\t}\n\t\t}\n\t\t\t\t      \t\t   \n\t\t                   \n\t}\n\telse\t{\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\t_irqlevel_changed_(&oldirql,RAISE);\n\t_func_exit_;\n#endif\n\treturn status;\n}\n\n//****************  oid_rtl_seg_01_11   section end****************\t\n\n\n//**************  oid_rtl_seg_03_00 section start **************  \nenum _CONNECT_STATE_{\n\tCHECKINGSTATUS,\n\tASSOCIATED,\n\tADHOCMODE,\n\tNOTASSOCIATED\n};\n\nNDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\n\tULONG ulInfo;\n\t\t\n\tif(poid_par_priv->type_of_oid != QUERY_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\t\t\n\n\t// nStatus==0\tCheckingStatus\n\t// nStatus==1\tAssociated\n\t// nStatus==2\tAdHocMode\n\t// nStatus==3\tNotAssociated\n\t\n\tif(check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)\n\t\tulInfo = CHECKINGSTATUS;\n\telse if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\t\n\t\tulInfo = ASSOCIATED;\n\telse if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)== _TRUE)\n\t\tulInfo = ADHOCMODE;\n\telse\n\t\tulInfo = NOTASSOCIATED ;\n\n\t*(ULONG *)poid_par_priv->information_buf = ulInfo;\n\t*poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;\n\n#if 0\n\t// Rearrange the order to let the UI still shows connection when scan is in progress\n\tRT_TRACE(COMP_OID_QUERY, DBG_LOUD, (\"===> Query OID_RT_GET_CONNECT_STATE.\\n\"));\n\tif(pMgntInfo->mAssoc)\n\t\tulInfo = 1;\n\telse if(pMgntInfo->mIbss)\n\t\tulInfo = 2;\n\telse if(pMgntInfo->bScanInProgress)\n\t\tulInfo = 0;\n\telse\n\t\tulInfo = 3;\n\tulInfoLen = sizeof(ULONG);\n\tRT_TRACE(COMP_OID_QUERY, DBG_LOUD, (\"<=== Query OID_RT_GET_CONNECT_STATE: %d\\n\", ulInfo));\n#endif\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv)\n{\n\tNDIS_STATUS\t \tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\t\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tif(poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\t\n\treturn status;\n}\n//**************  oid_rtl_seg_03_00 section end **************  \n\n"
  },
  {
    "path": "core/rtw_ioctl_set.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_IOCTL_SET_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n\nextern void indicate_wx_scan_complete_event(_adapter *padapter);\n\n#define IS_MAC_ADDRESS_BROADCAST(addr) \\\n( \\\n\t( (addr[0] == 0xff) && (addr[1] == 0xff) && \\\n\t\t(addr[2] == 0xff) && (addr[3] == 0xff) && \\\n\t\t(addr[4] == 0xff) && (addr[5] == 0xff) )  ? _TRUE : _FALSE \\\n)\n\nu8 rtw_validate_bssid(u8 *bssid)\n{\n\tu8 ret = _TRUE;\n\n\tif (is_zero_mac_addr(bssid)\n\t\t|| is_broadcast_mac_addr(bssid)\n\t\t|| is_multicast_mac_addr(bssid)\n\t) { \n\t\tret = _FALSE;\n\t}\n\n\treturn ret;\n}\n\nu8 rtw_validate_ssid(NDIS_802_11_SSID *ssid)\n{\n\tu8\t i;\n\tu8\tret=_TRUE;\n\n_func_enter_;\t\n\n\tif (ssid->SsidLength > 32) {\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (\"ssid length >32\\n\"));\n\t\tret= _FALSE;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_VALIDATE_SSID\n\tfor(i = 0; i < ssid->SsidLength; i++)\n\t{\n\t\t//wifi, printable ascii code must be supported\n\t\tif(!( (ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e) )){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (\"ssid has nonprintabl ascii\\n\"));\n\t\t\tret= _FALSE;\n\t\t\tbreak;\n\t\t}\n\t}\n#endif /* CONFIG_VALIDATE_SSID */\n\nexit:\t\n\n_func_exit_;\n\n\treturn ret;\n}\n\nu8 rtw_do_join(_adapter * padapter);\nu8 rtw_do_join(_adapter * padapter)\n{\n\t_irqL\tirqL;\n\t_list\t*plist, *phead;\n\tu8* pibss = NULL;\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tu8 ret=_SUCCESS;\n\n_func_enter_;\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"\\n rtw_do_join: phead = %p; plist = %p \\n\\n\\n\", phead, plist));\n\n\tpmlmepriv->cur_network.join_res = -2;\n\t\t\n\tset_fwstate(pmlmepriv, _FW_UNDER_LINKING);\n\n\tpmlmepriv->pscanned = plist;\n\n\tpmlmepriv->to_join = _TRUE;\n\n\tif(_rtw_queue_empty(queue)== _TRUE)\n\t{\t\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n            \t\t\n\t\t//when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty\n\t\t//we try to issue sitesurvey firstly\t\n            \t\t\n\t\tif (pmlmepriv->LinkDetectInfo.bBusyTraffic ==_FALSE\n\t\t\t|| rtw_to_roam(padapter) > 0\n\t\t)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_do_join(): site survey if scanned_queue is empty\\n.\"));\n\t\t\t// submit site_survey_cmd\n\t\t\tif(_SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ) {\n\t\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_do_join(): site survey return error\\n.\"));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\tret = _FAIL;\n\t\t}\n\t\t\n\t\tgoto exit;\n\t}\t\n\telse \t\n\t{\n\t\tint select_ret;\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\tif((select_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS)\n\t\t{\n\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\t_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);\n\t\t}\n\t\telse\t\n\t\t{\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE)\n\t\t\t{\n\t\t\t\t// submit createbss_cmd to change to a ADHOC_MASTER\n\n \t\t\t\t//pmlmepriv->lock has been acquired by caller...\n\t\t\t\tWLAN_BSSID_EX    *pdev_network = &(padapter->registrypriv.dev_network);\n\n\t\t\t\tpmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;\n\t\t\t\t\n\t\t\t\tpibss = padapter->registrypriv.dev_network.MacAddress;\n\n\t\t\t\t_rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));\n\t\t\t\t_rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));\n\t\n\t\t\t\trtw_update_registrypriv_dev_network(padapter);\n\n\t\t\t\trtw_generate_random_ibss(pibss);\n\t\t\t\t\t\n\t\t\t\tif (rtw_create_ibss_cmd(padapter, 0) != _SUCCESS) {\n\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (\"***Error=>do_goin: rtw_create_ibss_cmd status FAIL***\\n\"));\t\t\t\t\t\t\n\t\t\t\t\tret =  _FALSE;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t     \tpmlmepriv->to_join = _FALSE;\n\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"***Error=> rtw_select_and_join_from_scanned_queue FAIL under STA_Mode*** \\n \"));\t\t\t\t\t\t\n\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{ \n\t\t\t\t// can't associate ; reset under-linking\t\t\t\n\t\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\n#if 0\t\n\t\t\t\tif((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE))\n\t\t\t\t{\n\t\t\t\t\tif(_rtw_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength))\n\t\t\t\t\t{ \n\t\t\t\t\t\t// for funk to do roaming\n\t\t\t\t\t\t// funk will reconnect, but funk will not sitesurvey before reconnect\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"for funk to do roaming\"));\n\t\t\t\t\t\tif(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE)\n\t\t\t\t\t\t\trtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\t\t\t\t\n#endif\n\n\t\t\t\t//when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue\n\t\t\t\t//we try to issue sitesurvey firstly\t\t\t\n\t\t\t\tif(pmlmepriv->LinkDetectInfo.bBusyTraffic==_FALSE\n\t\t\t\t\t|| rtw_to_roam(padapter) > 0\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"rtw_do_join() when   no desired bss in scanning queue \\n\");\n\t\t\t\t\tif( _SUCCESS!=(ret=rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) ){\n\t\t\t\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"do_join(): site survey return error\\n.\"));\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tret = _FAIL;\n\t\t\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t}\n\t\nexit:\n\t\n_func_exit_;\t\n\n\treturn ret;\t\n}\n\n#ifdef PLATFORM_WINDOWS\nu8 rtw_pnp_set_power_wakeup(_adapter* padapter)\n{\n\tu8 res=_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"==>rtw_pnp_set_power_wakeup!!!\\n\"));\n\t\n\tres = rtw_setstandby_cmd(padapter, 0);\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"<==rtw_pnp_set_power_wakeup!!!\\n\"));\n\n_func_exit_;\n\t\n\treturn res;\n}\n\nu8 rtw_pnp_set_power_sleep(_adapter* padapter)\n{\n\tu8 res=_SUCCESS;\t\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"==>rtw_pnp_set_power_sleep!!!\\n\"));\n\t//DbgPrint(\"+rtw_pnp_set_power_sleep\\n\");\n\n\tres = rtw_setstandby_cmd(padapter, 1);\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"<==rtw_pnp_set_power_sleep!!!\\n\"));\n\n_func_exit_;\n\n\treturn res;\n}\n\nu8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults)\n{\n_func_enter_;\n\n\tswitch( reloadDefaults)\n\t{\n\t\tcase Ndis802_11ReloadWEPKeys:\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"SetInfo OID_802_11_RELOAD_DEFAULTS : Ndis802_11ReloadWEPKeys\\n\"));\n\t\t\tbreak;\n\t}\n\n\t// SecClearAllKeys(Adapter);\n\t// 8711 CAM was not for En/Decrypt only\n\t// so, we can't clear all keys.\n\t// should we disable WPAcfg (ox0088) bit 1-2, instead of clear all CAM\n\t\n\t//TO DO...\n\n_func_exit_;\n\t\n\treturn _TRUE;\n}\n\nu8 set_802_11_test(_adapter* padapter, NDIS_802_11_TEST *test)\n{\n\tu8 ret=_TRUE;\n\t\n_func_enter_;\n\n\tswitch(test->Type)\n\t{\n\t\tcase 1:\n\t\t\tNdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->AuthenticationEvent, test->Length - 8);\n\t\t\tNdisMIndicateStatusComplete(padapter->hndis_adapter);\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tNdisMIndicateStatus(padapter->hndis_adapter, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, (PVOID)&test->RssiTrigger, sizeof(NDIS_802_11_RSSI));\n\t\t\tNdisMIndicateStatusComplete(padapter->hndis_adapter);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tret=_FALSE;\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n\n\treturn ret;\t\n}\n\nu8\trtw_set_802_11_pmkid(_adapter*\tpadapter, NDIS_802_11_PMKID *pmkid)\n{\n\tu8\tret=_SUCCESS;\n\n\treturn ret;\n}\n\n#endif\n\nu8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid)\n{\t\n\t_irqL irqL;\t\n\tu8 status=_SUCCESS;\n\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\n_func_enter_;\n\t\n\tDBG_871X_LEVEL(_drv_always_, \"set bssid:%pM\\n\", bssid);\n\n\tif ((bssid[0]==0x00 && bssid[1]==0x00 && bssid[2]==0x00 && bssid[3]==0x00 && bssid[4]==0x00 &&bssid[5]==0x00) ||\n\t    (bssid[0]==0xFF && bssid[1]==0xFF && bssid[2]==0xFF && bssid[3]==0xFF && bssid[4]==0xFF &&bssid[5]==0xFF))\n\t{\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\n\tDBG_871X(\"Set BSSID under fw_state=0x%08x\\n\", get_fwstate(pmlmepriv));\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tgoto handle_tkip_countermeasure;\n\t} else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tgoto release_mlme_lock;\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, (\"set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\\n\"));\n\n\t\tif (_rtw_memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN) == _TRUE)\n\t\t{\t\t\n\t\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE)\n\t\t\t\tgoto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.\n\t\t} else {\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"Set BSSID not the same bssid\\n\"));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"set_bssid=\"MAC_FMT\"\\n\", MAC_ARG(bssid) ));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"cur_bssid=\"MAC_FMT\"\\n\", MAC_ARG(pmlmepriv->cur_network.network.MacAddress) ));\n\n\t\t\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\n\t\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t\trtw_indicate_disconnect(padapter);\n\n\t\t\trtw_free_assoc_resources(padapter, 1);\n\n\t\t\tif ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {\n\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t}\t\t\n\t\t}\n\t}\n\nhandle_tkip_countermeasure:\n\tif (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {\n\t\tstatus = _FAIL;\n\t\tgoto release_mlme_lock;\n\t}\n\n\t_rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));\n\t_rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);\n\tpmlmepriv->assoc_by_bssid=_TRUE;\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tpmlmepriv->to_join = _TRUE;\t\n\t}\n\telse {\n\t\tstatus = rtw_do_join(padapter);\n\t}\n\nrelease_mlme_lock:\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\nexit:\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,\n\t\t(\"rtw_set_802_11_bssid: status=%d\\n\", status));\n\t\n_func_exit_;\n\n\treturn status;\n}\n\nu8 rtw_set_802_11_ssid(_adapter* padapter, NDIS_802_11_SSID *ssid)\n{\t\n\t_irqL irqL;\n\tu8 status = _SUCCESS;\n\tu32 cur_time = 0;\n\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network *pnetwork = &pmlmepriv->cur_network;\n\t\n_func_enter_;\n\t\n\tDBG_871X_LEVEL(_drv_always_, \"set ssid [%s] fw_state=0x%08x\\n\",\n\t\t       \tssid->Ssid, get_fwstate(pmlmepriv));\n\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,\n\t\t\t (\"set_ssid: hw_init_completed==_FALSE=>exit!!!\\n\"));\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n\t\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tDBG_871X(\"Set SSID under fw_state=0x%08x\\n\", get_fwstate(pmlmepriv));\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\t\n\t\tgoto handle_tkip_countermeasure;\n\t} else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tgoto release_mlme_lock;\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,\n\t\t\t (\"set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\\n\"));\n\n\t\tif ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&\n\t\t    (_rtw_memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength) == _TRUE))\n\t\t{\t\t\t\n\t\t\tif((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _FALSE))\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,\n\t\t\t\t\t (\"Set SSID is the same ssid, fw_state=0x%08x\\n\",\n\t\t\t\t\t  get_fwstate(pmlmepriv)));\n\n\t\t\t\tif(rtw_is_same_ibss(padapter, pnetwork) == _FALSE)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\t//if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again\n\t\t\t\t\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\n\t\t\t\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t\t\t\trtw_indicate_disconnect(padapter);\n\t\t\t\t\t\t\n\t\t\t\t\trtw_free_assoc_resources(padapter, 1);\n\n\t\t\t\t\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {\n\t\t\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\n\t\t\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tgoto release_mlme_lock;//it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again.\n\t\t\t\t}\n\t\t\t}\n#ifdef CONFIG_LPS\n\t\t\telse {\n\t\t\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1);\n\t\t\t}\n#endif\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"Set SSID not the same ssid\\n\"));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"set_ssid=[%s] len=0x%x\\n\", ssid->Ssid, (unsigned int)ssid->SsidLength));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"assoc_ssid=[%s] len=0x%x\\n\", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength));\n\n\t\t\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\n\t\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t\trtw_indicate_disconnect(padapter);\n\t\t\t\n\t\t\trtw_free_assoc_resources(padapter, 1);\n\n\t\t\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) {\n\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t}\n\t\t}\t\t\n\t}\n\nhandle_tkip_countermeasure:\n\tif (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {\n\t\tstatus = _FAIL;\n\t\tgoto release_mlme_lock;\n\t}\n\n\tif (rtw_validate_ssid(ssid) == _FALSE) {\n\t\tstatus = _FAIL;\n\t\tgoto release_mlme_lock;\n\t}\n\n\t_rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));\n\tpmlmepriv->assoc_by_bssid=_FALSE;\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tpmlmepriv->to_join = _TRUE;\t\n\t}\n\telse {\n\t\tstatus = rtw_do_join(padapter);\n\t}\n\nrelease_mlme_lock:\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\nexit:\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,\n\t\t(\"-rtw_set_802_11_ssid: status=%d\\n\", status));\n\t\n_func_exit_;\n\n\treturn status;\n\t\n}\n\nu8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid)\n{\n\t_irqL irqL;\n\tu8 status = _SUCCESS;\n\tu32 cur_time = 0;\n\tbool bssid_valid = _TRUE;\n\tbool ssid_valid = _TRUE;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n_func_enter_;\n\n\tif (!ssid || rtw_validate_ssid(ssid) == _FALSE)\n\t\tssid_valid = _FALSE;\n\n\tif (!bssid || rtw_validate_bssid(bssid) == _FALSE)\n\t\tbssid_valid = _FALSE;\n\n\tif (ssid_valid == _FALSE && bssid_valid == _FALSE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid);\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,\n\t\t\t (\"set_ssid: hw_init_completed==_FALSE=>exit!!!\\n\"));\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\"  fw_state=0x%08x\\n\",\n\t\tFUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tgoto handle_tkip_countermeasure;\n\t} else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tgoto release_mlme_lock;\n\t}\n\nhandle_tkip_countermeasure:\n\tif (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {\n\t\tstatus = _FAIL;\n\t\tgoto release_mlme_lock;\n\t}\n\n\tif (ssid && ssid_valid)\n\t\t_rtw_memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(NDIS_802_11_SSID));\n\telse\n\t\t_rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(NDIS_802_11_SSID));\n\n\tif (bssid && bssid_valid) {\n\t\t_rtw_memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);\n\t\tpmlmepriv->assoc_by_bssid = _TRUE;\n\t} else {\n\t\tpmlmepriv->assoc_by_bssid = _FALSE;\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tpmlmepriv->to_join = _TRUE;\t\n\t}\n\telse {\n\t\tstatus = rtw_do_join(padapter);\n\t}\n\nrelease_mlme_lock:\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\nexit:\n\t\n_func_exit_;\n\n\treturn status;\n}\n\nu8 rtw_set_802_11_infrastructure_mode(_adapter* padapter, \n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networktype)\n{\n\t_irqL irqL;\n\tstruct\tmlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct\twlan_network\t*cur_network = &pmlmepriv->cur_network;\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE* pold_state = &(cur_network->network.InfrastructureMode);\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_notice_,\n\t\t (\"+rtw_set_802_11_infrastructure_mode: old=%d new=%d fw_state=0x%08x\\n\",\n\t\t  *pold_state, networktype, get_fwstate(pmlmepriv)));\n\t\n\tif(*pold_state != networktype)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\" change mode!\"));\n\t\t//DBG_871X(\"change mode, old_mode=%d, new_mode=%d, fw_state=0x%x\\n\", *pold_state, networktype, get_fwstate(pmlmepriv));\n\n\t\tif(*pold_state==Ndis802_11APMode)\n\t\t{\t\t\n\t\t\t//change to other mode from Ndis802_11APMode\t\t\t\n\t\t\tcur_network->join_res = -1;\n\t\t\t\n#ifdef CONFIG_NATIVEAP_MLME\n\t\t\tstop_ap_mode(padapter);\n#endif\n\t\t}\n\n\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\n\t\tif((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||(*pold_state==Ndis802_11IBSS))\n\t\t\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\n\t\tif((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) ||\n\t\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)== _TRUE) )\n\t\t\trtw_free_assoc_resources(padapter, 1);\n\n\t\tif((*pold_state == Ndis802_11Infrastructure) ||(*pold_state == Ndis802_11IBSS))\n\t       {\n\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t{\t\t\n\t\t\t\trtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether  issue dis-assoc_cmd or not\n\t\t\t}\n\t       }\n\t\t\n\t\t*pold_state = networktype;\n\n\t\t_clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);\n\t\t\t\t\n\t\tswitch(networktype)\n\t\t{\n\t\t\tcase Ndis802_11IBSS:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase Ndis802_11Infrastructure:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_STATION_STATE);\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase Ndis802_11APMode:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_AP_STATE);\n#ifdef CONFIG_NATIVEAP_MLME\n\t\t\t\tstart_ap_mode(padapter);\n\t\t\t\t//rtw_indicate_connect(padapter);\n#endif\t\t\t\t\n\t\t\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase Ndis802_11AutoUnknown:\n\t\t\tcase Ndis802_11InfrastructureMax:\n\t\t\t\tbreak;\n\t\t\tcase Ndis802_11Monitor:\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_MONITOR_STATE);\n\t\t\t\tbreak;\n\t\t}\n\n\t\t//SecClearAllKeys(adapter);\n\t\t\n\t\t//RT_TRACE(COMP_OID_SET, DBG_LOUD, (\"set_infrastructure: fw_state:%x after changing mode\\n\",\n\t\t//\t\t\t\t\t\t\t\t\tget_fwstate(pmlmepriv) ));\n\n\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t}\n\n_func_exit_;\n\n\treturn _TRUE;\n}\n\n\nu8 rtw_set_802_11_disassociate(_adapter *padapter)\n{\n\t_irqL irqL;\n\tstruct mlme_priv * pmlmepriv = &padapter->mlmepriv;\n\n_func_enter_;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\\n\"));\n\n\t\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\t\trtw_indicate_disconnect(padapter);\n\t\t//modify for CONFIG_IEEE80211W, none 11w can use it\n\t\trtw_free_assoc_resources_cmd(padapter);\n\t\tif (_FAIL == rtw_pwr_wakeup(padapter))\n\t\t\tDBG_871X(\"%s(): rtw_pwr_wakeup fail !!!\\n\",__FUNCTION__);\n\t}\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\n_func_exit_;\n\n\treturn _TRUE;\t\n}\n\nu8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num)\n{\t\n\t_irqL\tirqL;\n\tstruct\tmlme_priv\t\t*pmlmepriv= &padapter->mlmepriv;\n\tu8\tres=_TRUE;\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"+rtw_set_802_11_bssid_list_scan(), fw_state=%x\\n\", get_fwstate(pmlmepriv)));\n\n\tif (padapter == NULL) {\n\t\tres=_FALSE;\n\t\tgoto exit;\n\t}\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tres = _FALSE;\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n===rtw_set_802_11_bssid_list_scan:hw_init_completed==_FALSE===\\n\"));\n\t\tgoto exit;\n\t}\n\t\n\tif ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE) ||\n\t\t(pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE))\n\t{\n\t\t// Scan or linking is in progress, do nothing.\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_set_802_11_bssid_list_scan fail since fw_state = %x\\n\", get_fwstate(pmlmepriv)));\n\t\tres = _TRUE;\n\n\t\tif(check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\\n\\n\"));\n\t\t} else {\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n###pmlmepriv->sitesurveyctrl.traffic_busy==_TRUE\\n\\n\"));\n\t\t}\n\t} else {\t\t\n\t\tif (rtw_is_scan_deny(padapter)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\": scan deny\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tindicate_wx_scan_complete_event(padapter);\n\t\t\treturn _SUCCESS;\n\t\t}\n\t\t\n\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\t\t\n\t\t\n\t\tres = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0);\n\t\t\n\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t}\nexit:\n\t\n_func_exit_;\n\n\treturn res;\t\n}\n\nu8 rtw_set_802_11_authentication_mode(_adapter* padapter, NDIS_802_11_AUTHENTICATION_MODE authmode) \n{\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tint res;\n\tu8 ret;\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"set_802_11_auth.mode(): mode=%x\\n\", authmode));\n\n\tpsecuritypriv->ndisauthtype=authmode;\n\t\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d\", psecuritypriv->ndisauthtype));\n\t\n\tif(psecuritypriv->ndisauthtype>3)\n\t\tpsecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_8021X;\n\t\n#ifdef CONFIG_WAPI_SUPPORT\n\tif(psecuritypriv->ndisauthtype == 6)\n\t\tpsecuritypriv->dot11AuthAlgrthm=dot11AuthAlgrthm_WAPI;\n#endif\n\n\tres=rtw_set_auth(padapter,psecuritypriv);\n\t\n\tif(res==_SUCCESS)\n\t\tret=_TRUE;\n\telse\n\t\tret=_FALSE;\n\t\n_func_exit_;\n\n\treturn ret;\n}\n\nu8 rtw_set_802_11_add_wep(_adapter* padapter, NDIS_802_11_WEP *wep){\n\n\tu8\t\tbdefaultkey;\n\tu8\t\tbtransmitkey;\n\tsint\t\tkeyid,res;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tu8\t\tret=_SUCCESS;\n\n_func_enter_;\n\n\tbdefaultkey=(wep->KeyIndex & 0x40000000) > 0 ? _FALSE : _TRUE;   //for ???\n\tbtransmitkey= (wep->KeyIndex & 0x80000000) > 0 ? _TRUE  : _FALSE;\t//for ???\n\tkeyid=wep->KeyIndex & 0x3fffffff;\n\n\tif(keyid>=4)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"MgntActrtw_set_802_11_add_wep:keyid>4=>fail\\n\"));\n\t\tret=_FALSE;\n\t\tgoto exit;\n\t}\n\t\n\tswitch(wep->KeyLength)\n\t{\n\t\tcase 5:\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP40_;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"MgntActrtw_set_802_11_add_wep:wep->KeyLength=5\\n\"));\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP104_;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"MgntActrtw_set_802_11_add_wep:wep->KeyLength=13\\n\"));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\\n\"));\n\t\t\tbreak;\n\t}\n\t\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength=0x%x wep->KeyIndex=0x%x  keyid =%x\\n\",wep->KeyLength,wep->KeyIndex,keyid));\n\n\t_rtw_memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial),wep->KeyLength);\n\n\tpsecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength;\n\n\tpsecuritypriv->dot11PrivacyKeyIndex=keyid;\n\n\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x \\n\",\n\t\tpsecuritypriv->dot11DefKey[keyid].skey[0],psecuritypriv->dot11DefKey[keyid].skey[1],psecuritypriv->dot11DefKey[keyid].skey[2],\n\t\tpsecuritypriv->dot11DefKey[keyid].skey[3],psecuritypriv->dot11DefKey[keyid].skey[4],psecuritypriv->dot11DefKey[keyid].skey[5],\n\t\tpsecuritypriv->dot11DefKey[keyid].skey[6],psecuritypriv->dot11DefKey[keyid].skey[7],psecuritypriv->dot11DefKey[keyid].skey[8],\n\t\tpsecuritypriv->dot11DefKey[keyid].skey[9],psecuritypriv->dot11DefKey[keyid].skey[10],psecuritypriv->dot11DefKey[keyid].skey[11],\n\t\tpsecuritypriv->dot11DefKey[keyid].skey[12]));\n\n\tres=rtw_set_key(padapter,psecuritypriv, keyid, 1, _TRUE);\n\t\n\tif(res==_FAIL)\n\t\tret= _FALSE;\nexit:\n\t\n_func_exit_;\n\n\treturn ret;\n\t\n}\n\nu8 rtw_set_802_11_remove_wep(_adapter* padapter, u32 keyindex){\n\t\n\tu8 ret=_SUCCESS;\n\t\n_func_enter_;\n\n\tif (keyindex >= 0x80000000 || padapter == NULL){\n\t\t\n\t\tret=_FALSE;\n\t\tgoto exit;\n\n\t}\n\telse \n\t{\n\t\tint res;\n\t\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\t\tif( keyindex < 4 ){\n\t\t\t\n\t\t\t_rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16);\n\t\t\t\n\t\t\tres=rtw_set_key(padapter,psecuritypriv,keyindex, 0, _TRUE);\n\t\t\t\n\t\t\tpsecuritypriv->dot11DefKeylen[keyindex]=0;\n\t\t\t\n\t\t\tif(res==_FAIL)\n\t\t\t\tret=_FAIL;\n\t\t\t\n\t\t}\n\t\telse\n\t\t{\t\t\t\n\t\t\tret=_FAIL;\n\t\t}\n\t\t\n\t}\n\t\nexit:\t\n\t\n_func_exit_;\n\n\treturn ret;\n\t\n}\n\nu8 rtw_set_802_11_add_key(_adapter* padapter, NDIS_802_11_KEY *key){\n\n\tuint\tencryptionalgo;\n\tu8 * pbssid;\n\tstruct sta_info *stainfo;\n\tu8\tbgroup = _FALSE;\n\tu8\tbgrouptkey = _FALSE;//can be remove later\n\tu8\tret=_SUCCESS;\n\t\n_func_enter_;\n\n\tif (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)){\n\n\t\t// It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, \n\t\t// it must fail the request and return NDIS_STATUS_INVALID_DATA.\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000) == 0)[=%d] \",(int)(key->KeyIndex & 0x80000000) == 0));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000) > 0)[=%d]\" , (int)(key->KeyIndex & 0x40000000) > 0));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,(\"rtw_set_802_11_add_key: key->KeyIndex=%d \\n\" ,(int)key->KeyIndex));\n\t\tret= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif(key->KeyIndex & 0x40000000)\n\t{ \n\t\t// Pairwise key\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY: +++++ Pairwise key +++++\\n\"));\n\t\n\t\tpbssid=get_bssid(&padapter->mlmepriv);\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv, pbssid);\n\n\t\tif((stainfo!=NULL)&&(padapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY:( stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\\n\"));\n\t\t\tencryptionalgo=stainfo->dot118021XPrivacy;\n\t\t}\n\t\telse{\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY: stainfo==NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!=dot11AuthAlgrthm_8021X)\\n\"));\n\t\t\tencryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_set_802_11_add_key: (encryptionalgo ==%d)!\\n\",encryptionalgo ));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm ==%d)!\\n\",padapter->securitypriv.dot11PrivacyAlgrthm));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm ==%d)!\\n\",padapter->securitypriv.dot11AuthAlgrthm));\n\n\t\tif((stainfo!=NULL)){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy ==%d)!\\n\", stainfo->dot118021XPrivacy));\n\t\t}\n\t\t\n\t\tif(key->KeyIndex & 0x000000FF){\n\t\t\t// The key index is specified in the lower 8 bits by values of zero to 255.\n\t\t\t// The key index should be set to zero for a Pairwise key, and the driver should fail with\n\t\t\t// NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\" key->KeyIndex & 0x000000FF.\\n\"));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// check BSSID\n\t\tif (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _TRUE){\n\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"MacAddr_isBcst(key->BSSID)\\n\"));\n\t\t\tret= _FALSE;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// Check key length for TKIP.\n\t\t//if(encryptionAlgorithm == RT_ENC_TKIP_ENCRYPTION && key->KeyLength != 32)\n\t\tif((encryptionalgo== _TKIP_)&& (key->KeyLength != 32)){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"TKIP KeyLength:0x%x != 32\\n\", key->KeyLength));\n\t\t\tret=_FAIL;\n\t\t\tgoto exit;\n\n\t\t}\n\n\t\t// Check key length for AES.\n\t\tif((encryptionalgo== _AES_)&& (key->KeyLength != 16)) {\n\t\t\t// For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case.\n\t\t\tif(key->KeyLength == 32) {\n\t\t\t\tkey->KeyLength = 16; \n\t\t\t} else {\n\t\t\t\tret= _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\n\t\t/* Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. -> modify checking condition*/\n\t\tif (((encryptionalgo == _WEP40_) && (key->KeyLength != 5)) || ((encryptionalgo == _WEP104_) && (key->KeyLength != 13))) {\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"WEP KeyLength:0x%x != 5 or 13\\n\", key->KeyLength));\n\t\t\tret=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tbgroup = _FALSE;\n\n\t\t// Check the pairwise key. Added by Annie, 2005-07-06.\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\"));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"[Pairwise Key set]\\n\"));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\"));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"key index: 0x%8x(0x%8x)\\n\", key->KeyIndex,(key->KeyIndex&0x3)));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"key Length: %d\\n\", key->KeyLength));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\"));\n\t\n\t}\n\telse \n\t{\t\n\t\t// Group key - KeyIndex(BIT30==0)\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY: +++++ Group key +++++\\n\"));\n\n\n\t\t// when add wep key through add key and didn't assigned encryption type before\n\t\tif((padapter->securitypriv.ndisauthtype<=3)&&(padapter->securitypriv.dot118021XGrpPrivacy==0))\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"keylen=%d( Adapter->securitypriv.dot11PrivacyAlgrthm=%x  )padapter->securitypriv.dot118021XGrpPrivacy(%x)\\n\", key->KeyLength,padapter->securitypriv.dot11PrivacyAlgrthm,padapter->securitypriv.dot118021XGrpPrivacy));\n\n\t\t\tswitch(key->KeyLength)\n\t\t\t{\n\t\t\t\tcase 5:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\\n\", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u\\n\", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"Adapter->securitypriv.dot11PrivacyAlgrthm= %x key->KeyLength=%u \\n\", padapter->securitypriv.dot11PrivacyAlgrthm,key->KeyLength));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tencryptionalgo=padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\\n\", padapter->securitypriv.dot11PrivacyAlgrthm));\n\t\t\t\n\t\t}\n\t\telse \n\t\t{\n\t\t\tencryptionalgo=padapter->securitypriv.dot118021XGrpPrivacy;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"( Adapter->securitypriv.dot11PrivacyAlgrthm=%x  )encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\\n\", padapter->securitypriv.dot11PrivacyAlgrthm,encryptionalgo,padapter->securitypriv.dot118021XGrpPrivacy,key->KeyLength));\n\n\t\t}\n\t\t\n\t\tif((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == _FALSE)) {\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\" IBSS but BSSID is not Broadcast Address.\\n\"));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// Check key length for TKIP\n\t\tif((encryptionalgo== _TKIP_) && (key->KeyLength != 32)) {\n\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\" TKIP GTK KeyLength:%u != 32\\n\", key->KeyLength));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\n\t\t} else if(encryptionalgo== _AES_ && (key->KeyLength != 16 && key->KeyLength != 32) ) {\n\t\t\t\n\t\t\t// Check key length for AES\n\t\t\t// For NDTEST, we allow keylen=32 in this case. 2005.01.27, by rcnjko.\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\\n\", key->KeyLength));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03.\n\t\tif((encryptionalgo==  _AES_) && (key->KeyLength == 32) ) {\n\t\t\tkey->KeyLength = 16; \n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"AES key length changed: %u\\n\", key->KeyLength) );\n\t\t}\n\n\t\tif(key->KeyIndex & 0x8000000) {//error ??? 0x8000_0000\n\t\t\tbgrouptkey = _TRUE;\n\t\t}\n\n\t\tif((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)==_TRUE)&&(check_fwstate(&padapter->mlmepriv, _FW_LINKED)==_TRUE))\n\t\t{\n\t\t\tbgrouptkey = _TRUE;\n\t\t}\n\n\t\tbgroup = _TRUE;\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\") );\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"[Group Key set]\\n\") );\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\")) ;\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"key index: 0x%8x(0x%8x)\\n\", key->KeyIndex,(key->KeyIndex&0x3)));\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"key Length: %d\\n\", key->KeyLength)) ;\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"------------------------------------------\\n\"));\n\t\t\n\t}\t\n\n\t// If WEP encryption algorithm, just call rtw_set_802_11_add_wep().\n\tif((padapter->securitypriv.dot11AuthAlgrthm !=dot11AuthAlgrthm_8021X)&&(encryptionalgo== _WEP40_  || encryptionalgo== _WEP104_))\n\t{\n\t\tu8 ret;\t\t\n\t\tu32 keyindex;\t\t\n\t\tu32 len = FIELD_OFFSET(NDIS_802_11_KEY, KeyMaterial) + key->KeyLength;\n\t\tNDIS_802_11_WEP *wep = &padapter->securitypriv.ndiswep;\n\t\t\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY: +++++ WEP key +++++\\n\"));\n\n\t\twep->Length = len;\n\t\tkeyindex = key->KeyIndex&0x7fffffff;\n\t\twep->KeyIndex = keyindex ;\n\t\twep->KeyLength = key->KeyLength;\n\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY:Before memcpy \\n\"));\n\n\t\t_rtw_memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength);\t\n\t\t_rtw_memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength);\n\n\t\tpadapter->securitypriv.dot11DefKeylen[keyindex]=key->KeyLength;\t\t\n\t\tpadapter->securitypriv.dot11PrivacyKeyIndex=keyindex;\n\t\t\n\t\tret = rtw_set_802_11_add_wep(padapter, wep);\n\t\n\t\tgoto exit;\n\t\t\n\t}\n\n\tif(key->KeyIndex & 0x20000000){\n\t\t// SetRSC\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"OID_802_11_ADD_KEY: +++++ SetRSC+++++\\n\"));\n\t\tif(bgroup == _TRUE)\n\t\t{\n\t\t\tNDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL;\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8);\t\t\t\n\t\t} \n\t\telse \n\t\t{\t\t\n\t\t\tNDIS_802_11_KEY_RSC keysrc=key->KeyRSC & 0x00FFFFFFFFFFFFULL;\t\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8);\t\t\t\n\t\t}\n\t\t\t\n\t}\n\n\t// Indicate this key idx is used for TX\n\t// Save the key in KeyMaterial\n\tif(bgroup == _TRUE) // Group transmit key\n\t{\n\t\tint res;\n\t\t\n\t\tif(bgrouptkey == _TRUE)\n\t\t{\t\t\n\t\t\tpadapter->securitypriv.dot118021XGrpKeyid=(u8)key->KeyIndex;\n\t\t}\n\t\t\n\t\tif((key->KeyIndex&0x3) == 0){\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\t\t\n\t\t\n\t\t_rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16);\n\t\t_rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);\n\t\t_rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);\n\t\t\n\t\tif((key->KeyIndex & 0x10000000))\n\t\t{\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);\n\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\\n\",\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\\n\"));\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);\n\t\t\t_rtw_memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);\n\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\\n\",\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],\n\t\t\t\tpadapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\\n\"));\n\t\t\n\t\t}\n\n\t\t//set group key by index\n\t\t_rtw_memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength);\n\t\t\n\t\tkey->KeyIndex=key->KeyIndex & 0x03;\n\t\t\n\t\tpadapter->securitypriv.binstallGrpkey=_TRUE;\n\t\t\n\t\tpadapter->securitypriv.bcheck_grpkey=_FALSE;\n\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"reset group key\"));\n\t\t\n\t\tres=rtw_set_key(padapter,&padapter->securitypriv, key->KeyIndex, 1, _TRUE);\n\n\t\tif(res==_FAIL)\n\t\t\tret= _FAIL;\n\n\t\tgoto exit;\n\t\t\t\n\t}\n\telse // Pairwise Key\n\t{\n\t\tu8 res;\n\t\t\n\t\tpbssid=get_bssid(&padapter->mlmepriv);\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv , pbssid );\n\t\t\n\t\tif(stainfo!=NULL)\n\t\t{\t\t\t\n\t\t\t_rtw_memset( &stainfo->dot118021x_UncstKey, 0, 16);// clear keybuffer\n\t\t\t\n\t\t\t_rtw_memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16);\n\t\t\t\n\t\t\tif(encryptionalgo== _TKIP_)\n\t\t\t{\n\t\t\t\tpadapter->securitypriv.busetkipkey=_FALSE;\n\t\t\t\t\n\t\t\t\t//_set_timer(&padapter->securitypriv.tkip_timer, 50);\n\t\t\t\t\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n ==========_set_timer\\n\"));\n\t\t\t\t\n\t\t\t\t// if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255]\n\t\t\t\tif((key->KeyIndex & 0x10000000)){\n\t\t\t\t\t_rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8);\n\t\t\t\t\t_rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8);\n\n\t\t\t\t} else {\n\t\t\t\t\t_rtw_memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8);\n\t\t\t\t\t_rtw_memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8);\n\n\t\t\t\t}\n\t\t\n\t\t\t}\n\t\t\telse if(encryptionalgo == _AES_)\n\t\t\t{\t\t\n\t\n\t\t\t}\n\n\t\t\n\t\t\t//Set key to CAM through H2C command\n\t\t\t#if 0\n\t\t\tif(bgrouptkey)//never go to here\n\t\t\t{\n\t\t\t\tres=rtw_setstakey_cmd(padapter, stainfo, GROUP_KEY, _TRUE);\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\\n\"));\n\t\t\t}\n\t\t\telse{\n\t\t\t\tres=rtw_setstakey_cmd(padapter, stainfo, UNICAST_KEY, _TRUE);\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,(\"\\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\\n\"));\n\t\t\t}\n\t\t\t#else\n\t\t\t\n\t\t\tres = rtw_setstakey_cmd(padapter, stainfo, UNICAST_KEY, _TRUE);\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (\"\\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\\n\"));\n\t\t\t#endif\n\n\t\t\tif(res ==_FALSE)\n\t\t\t\tret= _FAIL;\n\t\t\t\n\t\t}\n\n\t}\n\nexit:\n\t\n_func_exit_;\n\n\treturn ret;\t\n}\n\nu8 rtw_set_802_11_remove_key(_adapter*\tpadapter, NDIS_802_11_REMOVE_KEY *key){\n\t\n\tuint\t\t\t\tencryptionalgo;\n\tu8 * pbssid;\n\tstruct sta_info *stainfo;\n\tu8\tbgroup = (key->KeyIndex & 0x4000000) > 0 ? _FALSE: _TRUE;\n\tu8\tkeyIndex = (u8)key->KeyIndex & 0x03;\n\tu8\tret=_SUCCESS;\n\t\n_func_enter_;\n\n\tif ((key->KeyIndex & 0xbffffffc) > 0) {\n\t\tret=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (bgroup == _TRUE) {\n\t\tencryptionalgo= padapter->securitypriv.dot118021XGrpPrivacy;\n\t\t// clear group key by index\n\t\t//NdisZeroMemory(Adapter->MgntInfo.SecurityInfo.KeyBuf[keyIndex], MAX_WEP_KEY_LEN);\n\t\t//Adapter->MgntInfo.SecurityInfo.KeyLen[keyIndex] = 0;\n\t\t\n\t\t_rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16);\n\t\t\n\t\t//! \\todo Send a H2C Command to Firmware for removing this Key in CAM Entry.\n\t\n\t} else {\n\t\n\t\tpbssid=get_bssid(&padapter->mlmepriv);\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv , pbssid );\n\t\tif(stainfo !=NULL){\n\t\t\tencryptionalgo=stainfo->dot118021XPrivacy;\n\n\t\t// clear key by BSSID\n\t\t_rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16);\n\t\t\n\t\t//! \\todo Send a H2C Command to Firmware for disable this Key in CAM Entry.\n\n\t\t}\n\t\telse{\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\nexit:\n\t\n_func_exit_;\n\n\treturn _TRUE;\n\t\n}\n\n/*\n* rtw_get_cur_max_rate - \n* @adapter: pointer to _adapter structure\n* \n* Return 0 or 100Kbps\n*/\nu16 rtw_get_cur_max_rate(_adapter *adapter)\n{\n\tint\ti = 0;\n\tu16\trate = 0, max_rate = 0;\n\tstruct mlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tWLAN_BSSID_EX\t*pcur_bss = &pmlmepriv->cur_network.network;\n\tstruct sta_info *psta = NULL;\n\tu8\tshort_GI=0;\n#ifdef CONFIG_80211N_HT\n\tu8\trf_type = 0;\n#endif\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (adapter->registrypriv.mp_mode == 1)\n\t{\t\n\t\tif (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)\n\t\t\treturn 0;\n\t}\n#endif\n\n\tif((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) \n\t\t&& (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE))\n\t\treturn 0;\n\n\tpsta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));\n\tif (psta == NULL)\n\t\treturn 0;\n\n\tshort_GI = query_ra_short_GI(psta);\n\n#ifdef CONFIG_80211N_HT\n\tif (IsSupportedHT(psta->wireless_mode)) {\n\t\trtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\t\tmax_rate = rtw_mcs_rate(\n\t\t\trf_type,\n\t\t\t((psta->bw_mode == CHANNEL_WIDTH_40)?1:0),\n\t\t\tshort_GI,\n\t\t\tpsta->htpriv.ht_cap.supp_mcs_set\n\t\t);\n\t}\n#ifdef CONFIG_80211AC_VHT\n\telse if (IsSupportedVHT(psta->wireless_mode)) {\n\t\tmax_rate = ((rtw_vht_mcs_to_data_rate(psta->bw_mode, short_GI, pmlmepriv->vhtpriv.vht_highest_rate) + 1) >> 1) * 10;\n\t}\n#endif //CONFIG_80211AC_VHT\n\telse \n#endif //CONFIG_80211N_HT\n\t{\n\t\twhile( (pcur_bss->SupportedRates[i]!=0) && (pcur_bss->SupportedRates[i]!=0xFF))\n\t\t{\n\t\t\trate = pcur_bss->SupportedRates[i]&0x7F;\n\t\t\tif(rate>max_rate)\n\t\t\t\tmax_rate = rate;\n\t\t\ti++;\n\t\t}\n\t\n\t\tmax_rate = max_rate*10/2;\n\t}\n\n\treturn max_rate;\n}\n\n/*\n* rtw_set_scan_mode - \n* @adapter: pointer to _adapter structure\n* @scan_mode: \n* \n* Return _SUCCESS or _FAIL\n*/\nint rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode)\n{\n\tif(scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE)\n\t\treturn _FAIL;\n\t\n\tadapter->mlmepriv.scan_mode = scan_mode;\n\n\treturn _SUCCESS;\n}\n\n/*\n* rtw_set_channel_plan - \n* @adapter: pointer to _adapter structure\n* @channel_plan: \n* \n* Return _SUCCESS or _FAIL\n*/\nint rtw_set_channel_plan(_adapter *adapter, u8 channel_plan)\n{\n\tstruct registry_priv *pregistrypriv = &adapter->registrypriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\n\t//handle by cmd_thread to sync with scan operation\n\treturn rtw_set_chplan_cmd(adapter, RTW_CMDF_WAIT_ACK, channel_plan, 1);\n}\n\n/*\n* rtw_set_country - \n* @adapter: pointer to _adapter structure\n* @country_code: string of country code\n* \n* Return _SUCCESS or _FAIL\n*/\nint rtw_set_country(_adapter *adapter, const char *country_code)\n{\n\tint channel_plan;\n\n\tchannel_plan = rtw_get_chplan_from_country(country_code);\n\n\tif (channel_plan == -1) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s unsupported country_code:%s\\n\", __func__, country_code);\n\t\treturn _FAIL;\n\t}\n\n\tDBG_871X_LEVEL(_drv_always_, \"%s country_code:%s mapping to chplan:0x%02x\\n\", __func__, country_code, channel_plan);\n\treturn rtw_set_channel_plan(adapter, channel_plan);\n}\n\n/*\n* rtw_set_band - \n* @adapter: pointer to _adapter structure\n* @band: band to set\n* \n* Return _SUCCESS or _FAIL\n*/\nint rtw_set_band(_adapter *adapter, u8 band)\n{\n\tif (rtw_band_valid(band)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" band:%d\\n\", FUNC_ADPT_ARG(adapter), band);\n\t\tadapter->setband = band;\n\t\treturn _SUCCESS;\n\t}\n\n\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" band:%d fail\\n\", FUNC_ADPT_ARG(adapter), band);\n\treturn _FAIL;\n}\n\n"
  },
  {
    "path": "core/rtw_iol.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n\n#ifdef CONFIG_IOL\nstruct xmit_frame\t*rtw_IOL_accquire_xmit_frame(ADAPTER *adapter)\n{\n\tstruct xmit_frame\t*xmit_frame;\n\tstruct xmit_buf\t*xmitbuf;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct xmit_priv\t*pxmitpriv = &(adapter->xmitpriv);\n\n#if 1\n\tif ((xmit_frame = rtw_alloc_xmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s rtw_alloc_xmitframe return null\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\t\n\tif ((xmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s rtw_alloc_xmitbuf return null\\n\", __FUNCTION__);\n\t\trtw_free_xmitframe(pxmitpriv, xmit_frame);\n\t\txmit_frame=NULL;\n\t\tgoto exit;\n\t}\n\t\n\txmit_frame->frame_tag = MGNT_FRAMETAG;\n\txmit_frame->pxmitbuf = xmitbuf;\n\txmit_frame->buf_addr = xmitbuf->pbuf;\n\txmitbuf->priv_data = xmit_frame;\n\n\tpattrib = &xmit_frame->attrib;\n\tupdate_mgntframe_attrib(adapter, pattrib);\n\tpattrib->qsel = QSLT_BEACON;//Beacon\t\n\tpattrib->subtype = WIFI_BEACON;\t\n\tpattrib->pktlen = pattrib->last_txcmdsz = 0;\n\n#else\n\tif ((xmit_frame = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s alloc_mgtxmitframe return null\\n\", __FUNCTION__);\n\t}\n\telse {\n\t\tpattrib = &xmit_frame->attrib;\n\t\tupdate_mgntframe_attrib(adapter, pattrib);\n\t\tpattrib->qsel = QSLT_BEACON;\n\t\tpattrib->pktlen = pattrib->last_txcmdsz = 0;\n\t}\n#endif\n\nexit:\n\treturn xmit_frame;\n}\n\n\nint rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len)\n{\n\tstruct pkt_attrib\t*pattrib = &xmit_frame->attrib;\n\tu16 buf_offset;\n\tu32 ori_len;\n\n\tbuf_offset = TXDESC_OFFSET;\n\tori_len = buf_offset+pattrib->pktlen;\n\n\t//check if the io_buf can accommodate new cmds\n\tif(ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) {\n\t\tDBG_871X(\"%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\\n\", __FUNCTION__\n\t\t\t, ori_len + cmd_len + 8, MAX_XMITBUF_SZ);\n\t\treturn _FAIL;\n\t}\n\n\t_rtw_memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, IOL_cmds, cmd_len);\n\tpattrib->pktlen += cmd_len;\n\tpattrib->last_txcmdsz += cmd_len;\n\n\t//DBG_871X(\"%s ori:%u + cmd_len:%u = %u\\n\", __FUNCTION__, ori_len, cmd_len, buf_offset+pattrib->pktlen);\n\t\n\treturn _SUCCESS;\n}\n\nbool rtw_IOL_applied(ADAPTER *adapter)\n{\t\n\tif(1 == adapter->registrypriv.fw_iol)\n\t\treturn _TRUE;\n\n#ifdef CONFIG_USB_HCI\n\tif((2 == adapter->registrypriv.fw_iol) && (IS_FULL_SPEED_USB(adapter)))\n\t\treturn _TRUE;\n#endif\n\n\treturn _FALSE;\n}\n\nint rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt)\n{\n\treturn rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms,bndy_cnt);\n}\n\n#ifdef CONFIG_IOL_NEW_GENERATION\nint rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary)\n{\n\treturn _SUCCESS;\n}\nint _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask)\n{\n\tstruct ioreg_cfg cmd = {8,IOREG_CMD_WB_REG,0x0, 0x0,0x0};\n\n\t//RTW_PUT_LE16((u8*)&cmd.address, addr);\t\n\t//RTW_PUT_LE32((u8*)&cmd.value, (u32)value);\t\n\tcmd.address = cpu_to_le16(addr);\t\n\tcmd.data = cpu_to_le32(value);\n\t\n\tif(mask!=0xFF)\n\t{\n\t\tcmd.length = 12;\n\t\t//RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);\t\n\t\tcmd.mask = cpu_to_le32(mask);\n\t}\t\n\t\t\n\t//DBG_871X(\"%s addr:0x%04x,value:0x%08x,mask:0x%08x\\n\", __FUNCTION__, addr,value,mask);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);\n\n}\nint _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask)\n{\n\tstruct ioreg_cfg cmd = {8,IOREG_CMD_WW_REG,0x0, 0x0,0x0};\n\n\t//RTW_PUT_LE16((u8*)&cmd.address, addr);\t\n\t//RTW_PUT_LE32((u8*)&cmd.value, (u32)value);\t\n\tcmd.address = cpu_to_le16(addr);\t\n\tcmd.data = cpu_to_le32(value);\n\t\n\tif(mask!=0xFFFF)\n\t{\n\t\tcmd.length = 12;\n\t\t//RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);\t\n\t\tcmd.mask =  cpu_to_le32(mask);\n\t}\t\n\t\t\n\t//DBG_871X(\"%s addr:0x%04x,value:0x%08x,mask:0x%08x\\n\", __FUNCTION__, addr,value,mask);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);\n\t\n}\nint _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask)\n{\n\tstruct ioreg_cfg cmd = {8,IOREG_CMD_WD_REG,0x0, 0x0,0x0};\n\n\t//RTW_PUT_LE16((u8*)&cmd.address, addr);\t\n\t//RTW_PUT_LE32((u8*)&cmd.value, (u32)value);\t\n\tcmd.address = cpu_to_le16(addr);\t\n\tcmd.data = cpu_to_le32(value);\n\t\n\tif(mask!=0xFFFFFFFF)\n\t{\n\t\tcmd.length = 12;\n\t\t//RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);\t\n\t\tcmd.mask =  cpu_to_le32(mask);\n\t}\t\n\t\t\n\t//DBG_871X(\"%s addr:0x%04x,value:0x%08x,mask:0x%08x\\n\", __FU2NCTION__, addr,value,mask);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);\n\t\n}\n\nint _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask)\n{\n\tstruct ioreg_cfg cmd = {8,IOREG_CMD_W_RF,0x0, 0x0,0x0};\n\n\t//RTW_PUT_LE16((u8*)&cmd.address, addr);\t\n\t//RTW_PUT_LE32((u8*)&cmd.value, (u32)value);\t\n\tcmd.address = (rf_path<<8) |((addr) &0xFF);\t\n\tcmd.data = cpu_to_le32(value);\n\t\n\tif(mask!=0x000FFFFF)\n\t{\n\t\tcmd.length = 12;\n\t\t//RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);\t\n\t\tcmd.mask =  cpu_to_le32(mask);\n\t}\t\n\t\t\n\t//DBG_871X(\"%s rf_path:0x%02x addr:0x%04x,value:0x%08x,mask:0x%08x\\n\", __FU2NCTION__,rf_path, addr,value,mask);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);\n\t\n}\n\n\n\nint rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)\n{\n\tstruct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0};\n\t//RTW_PUT_LE16((u8*)&cmd.address, us);\t\n\tcmd.address = cpu_to_le16(us);\t\n\n\t//DBG_871X(\"%s %u\\n\", __FUNCTION__, us);\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);\n}\n\nint rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)\n{\n\tstruct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0};\n\n\t//RTW_PUT_LE16((u8*)&cmd.address, ms);\t\n\tcmd.address = cpu_to_le16(ms);\t\n\n\t//DBG_871X(\"%s %u\\n\", __FUNCTION__, ms);\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);\n}\nint rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)\n{\t\n\tstruct ioreg_cfg cmd = {4,IOREG_CMD_END,0xFFFF, 0xFF,0x0};\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);\n\n}\n\nu8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame)\n{\t\n\tu8 is_cmd_bndy = _FALSE;\n\tif(((pxmit_frame->attrib.pktlen+32)%256) + 8 >= 256){\n\t\trtw_IOL_append_END_cmd(pxmit_frame);\n\t\tpxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen+32)/256)+1)*256 );\n\t\t\n\t\t//printk(\"==> %s, pktlen(%d)\\n\",__FUNCTION__,pxmit_frame->attrib.pktlen);\n\t\tpxmit_frame->attrib.last_txcmdsz = pxmit_frame->attrib.pktlen;\n\t\tis_cmd_bndy = _TRUE;\t\n\t}\n\treturn is_cmd_bndy;\n}\n\nvoid rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf)\n{\n\tint i;\n\tint j=1;\n\t\n\tprintk(\"###### %s ######\\n\",__FUNCTION__);\n\tfor(i=0;i< buf_len;i++){\n\t\tprintk(\"%02x-\",*(pbuf+i));\n\t\t\t\n\t\tif(j%32 ==0) printk(\"\\n\");j++;\t\t\t\t\n\t}\n\tprintk(\"\\n\");\n\tprintk(\"============= ioreg_cmd len = %d =============== \\n\",buf_len);\t\n}\n\n\n#else //CONFIG_IOL_NEW_GENERATION\nint rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary)\n{\t\n\tIOL_CMD cmd = {0x0, IOL_CMD_LLT, 0x0, 0x0};\n\t\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)page_boundary);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\nint _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value)\n{\n\tIOL_CMD cmd = {0x0, IOL_CMD_WB_REG, 0x0, 0x0};\n\t\n\tRTW_PUT_BE16((u8*)&cmd.address, (u16)addr);\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)value);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\nint _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value)\n{\n\tIOL_CMD cmd = {0x0, IOL_CMD_WW_REG, 0x0, 0x0};\n\t\n\tRTW_PUT_BE16((u8*)&cmd.address, (u16)addr);\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)value);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\nint _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value)\n{\n\tIOL_CMD cmd = {0x0, IOL_CMD_WD_REG, 0x0, 0x0};\n\tu8* pos = (u8 *)&cmd;\n\t\n\tRTW_PUT_BE16((u8*)&cmd.address, (u16)addr);\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)value);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\n#ifdef DBG_IO\nint dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 1))\n\t\tDBG_871X(\"DBG_IO %s:%d IOL_WB(0x%04x, 0x%02x)\\n\", caller, line, addr, value);\n\n\treturn _rtw_IOL_append_WB_cmd(xmit_frame, addr, value);\n}\n\nint dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 2))\n\t\tDBG_871X(\"DBG_IO %s:%d IOL_WW(0x%04x, 0x%04x)\\n\", caller, line, addr, value);\n\n\treturn _rtw_IOL_append_WW_cmd(xmit_frame, addr, value);\n}\n\nint dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line)\n{\n\tif (match_write_sniff_ranges(addr, 4))\n\t\tDBG_871X(\"DBG_IO %s:%d IOL_WD(0x%04x, 0x%08x)\\n\", caller, line, addr, value);\n\n\treturn _rtw_IOL_append_WD_cmd(xmit_frame, addr, value);\n}\n#endif\n\nint rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)\n{\n\tIOL_CMD cmd = {0x0, IOL_CMD_DELAY_US, 0x0, 0x0};\n\t\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)us);\n\n\t//DBG_871X(\"%s %u\\n\", __FUNCTION__, us);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\nint rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)\n{\n\tIOL_CMD cmd = {0x0, IOL_CMD_DELAY_MS, 0x0, 0x0};\n\t\n\tRTW_PUT_BE32((u8*)&cmd.value, (u32)ms);\n\n\t//DBG_871X(\"%s %u\\n\", __FUNCTION__, ms);\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);\n}\n\nint rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)\n{\t\n\tIOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};\n\n\n\treturn rtw_IOL_append_cmds(xmit_frame, (u8*)&end_cmd, 8);\n\n}\n\nint rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms)\n{\n\tstruct xmit_frame\t*xmit_frame;\n\n\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(adapter)) == NULL)\n\t\treturn _FAIL;\n\n\tif(rtw_IOL_append_cmds(xmit_frame, IOL_cmds, cmd_num<<3) == _FAIL)\n\t\treturn _FAIL;\n\n\treturn rtw_IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms,0);\n}\n\nint rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms)\n{\n\tIOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};\n\treturn rtw_IOL_exec_cmd_array_sync(adapter, (u8*)&end_cmd, 1, max_wating_ms);\n}\n#endif //CONFIG_IOL_NEW_GENERATION\n\n\n\n\n#endif //CONFIG_IOL\n\n"
  },
  {
    "path": "core/rtw_mem.c",
    "content": "\n#include <drv_types.h>\n#include <rtw_mem.h>\n\nMODULE_LICENSE(\"GPL\");\nMODULE_DESCRIPTION(\"Realtek Wireless Lan Driver\");\nMODULE_AUTHOR(\"Realtek Semiconductor Corp.\");\nMODULE_VERSION(\"DRIVERVERSION\");\n\nstruct sk_buff_head rtk_skb_mem_q;\nstruct u8* rtk_buf_mem[NR_RECVBUFF];\n\nstruct u8\t* rtw_get_buf_premem(int index)\n{\n\tprintk(\"%s, rtk_buf_mem index : %d\\n\", __func__, index);\n\treturn rtk_buf_mem[index];\n}\n\nu16 rtw_rtkm_get_buff_size(void)\n{\n\treturn MAX_RTKM_RECVBUF_SZ;\n}\nEXPORT_SYMBOL(rtw_rtkm_get_buff_size);\n\nu8 rtw_rtkm_get_nr_recv_skb(void)\n{\n\treturn MAX_RTKM_NR_PREALLOC_RECV_SKB;\n}\nEXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);\n\nstruct sk_buff *rtw_alloc_skb_premem(u16 in_size)\n{\n\tstruct sk_buff *skb = NULL;\n\n\tif (in_size > MAX_RTKM_RECVBUF_SZ) {\n\t\tpr_info(\"warning %s: driver buffer size(%d) > rtkm buffer size(%d)\\n\", __func__, in_size, MAX_RTKM_RECVBUF_SZ);\n\t\tWARN_ON(1);\n\t\treturn skb;\n\t}\n\n\tskb = skb_dequeue(&rtk_skb_mem_q);\n\n\tprintk(\"%s, rtk_skb_mem_q len : %d\\n\", __func__, skb_queue_len(&rtk_skb_mem_q));\n\n\treturn skb;\t\n}\nEXPORT_SYMBOL(rtw_alloc_skb_premem);\n\nint rtw_free_skb_premem(struct sk_buff *pskb)\n{\n\tif(!pskb)\n\t\treturn -1;\n\n\tif (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)\t\n\t\treturn -1;\n\t\n\tskb_queue_tail(&rtk_skb_mem_q, pskb);\n\t\n\tprintk(\"%s, rtk_skb_mem_q len : %d\\n\", __func__, skb_queue_len(&rtk_skb_mem_q));\n\n\treturn 0;\n}\nEXPORT_SYMBOL(rtw_free_skb_premem);\n\nstatic int __init rtw_mem_init(void)\n{\n\tint i;\n\tSIZE_PTR tmpaddr=0;\n\tSIZE_PTR alignment=0;\n\tstruct sk_buff *pskb=NULL;\n\n\tprintk(\"%s\\n\", __func__);\n\tpr_info(\"MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\\n\", MAX_RTKM_NR_PREALLOC_RECV_SKB);\n\tpr_info(\"MAX_RTKM_RECVBUF_SZ: %d\\n\", MAX_RTKM_RECVBUF_SZ);\n\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\tfor(i=0; i<NR_RECVBUFF; i++)\n\t{\n\t\trtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\n\t}\n#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n\tskb_queue_head_init(&rtk_skb_mem_q);\n\n\tfor(i=0; i<MAX_RTKM_NR_PREALLOC_RECV_SKB; i++)\n\t{\n\t\tpskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\n\t\tif(pskb)\n\t\t{\t\t\n\t\t\ttmpaddr = (SIZE_PTR)pskb->data;\n\t\t\talignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\n\t\t\tskb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\n\n\t\t\tskb_queue_tail(&rtk_skb_mem_q, pskb);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tprintk(\"%s, alloc skb memory fail!\\n\", __func__);\n\t\t}\n\n\t\tpskb=NULL;\n\t}\n\n\tprintk(\"%s, rtk_skb_mem_q len : %d\\n\", __func__, skb_queue_len(&rtk_skb_mem_q));\n\n\treturn 0;\n\t\n}\n\nstatic void __exit rtw_mem_exit(void)\n{\n\tif (skb_queue_len(&rtk_skb_mem_q)) {\n\t\tprintk(\"%s, rtk_skb_mem_q len : %d\\n\", __func__, skb_queue_len(&rtk_skb_mem_q));\n\t}\n\n\tskb_queue_purge(&rtk_skb_mem_q);\n\n\tprintk(\"%s\\n\", __func__);\n}\n\nmodule_init(rtw_mem_init);\nmodule_exit(rtw_mem_exit);\n"
  },
  {
    "path": "core/rtw_mlme.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_MLME_C_\n\n#include <hal_data.h>\n\nextern void indicate_wx_scan_complete_event(_adapter *padapter);\nextern u8 rtw_do_join(_adapter * padapter);\n\n\nsint\t_rtw_init_mlme_priv (_adapter* padapter)\n{\n\tsint\ti;\n\tu8\t*pbuf;\n\tstruct wlan_network\t*pnetwork;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tsint\tres = _SUCCESS;\n\n_func_enter_;\n\n\t// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().\n\t//_rtw_memset((u8 *)pmlmepriv, 0, sizeof(struct mlme_priv));\n\n\tpmlmepriv->nic_hdl = (u8 *)padapter;\n\n\tpmlmepriv->pscanned = NULL;\n\tpmlmepriv->fw_state = WIFI_STATION_STATE; // Must sync with rtw_wdev_alloc() \n\t                                          // wdev->iftype = NL80211_IFTYPE_STATION\n\tpmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown;\n\tpmlmepriv->scan_mode=SCAN_ACTIVE;// 1: active, 0: pasive. Maybe someday we should rename this varable to \"active_mode\" (Jeff)\n\n\t_rtw_spinlock_init(&(pmlmepriv->lock));\t\n\t_rtw_init_queue(&(pmlmepriv->free_bss_pool));\n\t_rtw_init_queue(&(pmlmepriv->scanned_queue));\n\n\tset_scanned_network_val(pmlmepriv, 0);\n\t\n\t_rtw_memset(&pmlmepriv->assoc_ssid,0,sizeof(NDIS_802_11_SSID));\n\n\tpbuf = rtw_zvmalloc(MAX_BSS_CNT * (sizeof(struct wlan_network)));\n\t\n\tif (pbuf == NULL){\n\t\tres=_FAIL;\n\t\tgoto exit;\n\t}\n\tpmlmepriv->free_bss_buf = pbuf;\n\t\t\n\tpnetwork = (struct wlan_network *)pbuf;\n\t\n\tfor(i = 0; i < MAX_BSS_CNT; i++)\n\t{\t\t\n\t\t_rtw_init_listhead(&(pnetwork->list));\n\n\t\trtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue));\n\n\t\tpnetwork++;\n\t}\n\n\t//allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf\n\n\trtw_clear_scan_deny(padapter);\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\tpmlmepriv->bGetGateway = 0;\n#endif\n\n#ifdef CONFIG_LAYER2_ROAMING\n\t#define RTW_ROAM_SCAN_RESULT_EXP_MS 5*1000\n\t#define RTW_ROAM_RSSI_DIFF_TH 10\n\t#define RTW_ROAM_SCAN_INTERVAL_MS 10*1000\n\n\tpmlmepriv->roam_flags = 0\n\t\t| RTW_ROAM_ON_EXPIRED\n\t\t#ifdef CONFIG_LAYER2_ROAMING_RESUME\n\t\t| RTW_ROAM_ON_RESUME\n\t\t#endif\n\t\t#ifdef CONFIG_LAYER2_ROAMING_ACTIVE\n\t\t| RTW_ROAM_ACTIVE\n\t\t#endif\n\t\t;\n\n\tpmlmepriv->roam_scanr_exp_ms = RTW_ROAM_SCAN_RESULT_EXP_MS;\n\tpmlmepriv->roam_rssi_diff_th = RTW_ROAM_RSSI_DIFF_TH;\n\tpmlmepriv->roam_scan_int_ms = RTW_ROAM_SCAN_INTERVAL_MS;\n#endif /* CONFIG_LAYER2_ROAMING */\n\n\trtw_init_mlme_timer(padapter);\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\t\n\nvoid rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv);\nvoid rtw_mfree_mlme_priv_lock (struct mlme_priv *pmlmepriv)\n{\n\t_rtw_spinlock_free(&pmlmepriv->lock);\n\t_rtw_spinlock_free(&(pmlmepriv->free_bss_pool.lock));\n\t_rtw_spinlock_free(&(pmlmepriv->scanned_queue.lock));\n}\n\nstatic void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)\n{\n\tif(*ppie)\n\t{\t\t\n\t\trtw_mfree(*ppie, *plen);\n\t\t*plen = 0;\n\t\t*ppie=NULL;\n\t}\t\n}\n\nvoid rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv)\n{\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\trtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len);\n\trtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wps_assoc_resp_ie, &pmlmepriv->wps_assoc_resp_ie_len);\n\t\n\trtw_free_mlme_ie_data(&pmlmepriv->p2p_beacon_ie, &pmlmepriv->p2p_beacon_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_req_ie, &pmlmepriv->p2p_probe_req_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->p2p_probe_resp_ie, &pmlmepriv->p2p_probe_resp_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->p2p_go_probe_resp_ie, &pmlmepriv->p2p_go_probe_resp_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len);\n#endif\n\n#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)\t\n\trtw_free_mlme_ie_data(&pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wfd_go_probe_resp_ie, &pmlmepriv->wfd_go_probe_resp_ie_len);\n\trtw_free_mlme_ie_data(&pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len);\n#endif\n\n}\n\nvoid _rtw_free_mlme_priv (struct mlme_priv *pmlmepriv)\n{\n_func_enter_;\n\tif (NULL == pmlmepriv){\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\trtw_free_mlme_priv_ie_data(pmlmepriv);\n\n\tif(pmlmepriv){\n\t\trtw_mfree_mlme_priv_lock (pmlmepriv);\n\n\t\tif (pmlmepriv->free_bss_buf) {\n\t\t\trtw_vmfree(pmlmepriv->free_bss_buf, MAX_BSS_CNT * sizeof(struct wlan_network));\n\t\t}\n\t}\nexit:\n_func_exit_;\t\n}\n\nsint\t_rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork)\n{\n\t_irqL irqL;\n\n_func_enter_;\t\n\n\tif (pnetwork == NULL)\n\t\tgoto exit;\n\t\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\trtw_list_insert_tail(&pnetwork->list, &queue->queue);\n\n\t_exit_critical_bh(&queue->lock, &irqL);\n\nexit:\t\n\n_func_exit_;\t\t\n\n\treturn _SUCCESS;\n}\n\n/*\nstruct\twlan_network *_rtw_dequeue_network(_queue *queue)\n{\n\t_irqL irqL;\n\n\tstruct wlan_network *pnetwork;\n\n_func_enter_;\t\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\tif (_rtw_queue_empty(queue) == _TRUE)\n\n\t\tpnetwork = NULL;\n\t\n\telse\n\t{\n\t\tpnetwork = LIST_CONTAINOR(get_next(&queue->queue), struct wlan_network, list);\n\t\t\n\t\trtw_list_delete(&(pnetwork->list));\n\t}\n\t\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n_func_exit_;\t\t\n\n\treturn pnetwork;\n}\n*/\n\nstruct\twlan_network *_rtw_alloc_network(struct\tmlme_priv *pmlmepriv )//(_queue *free_queue)\n{\n\t_irqL\tirqL;\n\tstruct\twlan_network\t*pnetwork;\t\n\t_queue *free_queue = &pmlmepriv->free_bss_pool;\n\t_list* plist = NULL;\n\t\n_func_enter_;\t\n\n\t_enter_critical_bh(&free_queue->lock, &irqL);\n\t\n\tif (_rtw_queue_empty(free_queue) == _TRUE) {\n\t\tpnetwork=NULL;\n\t\tgoto exit;\n\t}\n\tplist = get_next(&(free_queue->queue));\n\t\n\tpnetwork = LIST_CONTAINOR(plist , struct wlan_network, list);\n\t\n\trtw_list_delete(&pnetwork->list);\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, (\"_rtw_alloc_network: ptr=%p\\n\", plist));\n\tpnetwork->network_type = 0;\n\tpnetwork->fixed = _FALSE;\n\tpnetwork->last_scanned = rtw_get_current_time();\n\tpnetwork->aid=0;\t\n\tpnetwork->join_res=0;\n\n\tpmlmepriv->num_of_scanned ++;\n\t\nexit:\n\t_exit_critical_bh(&free_queue->lock, &irqL);\n\n_func_exit_;\t\t\n\n\treturn pnetwork;\t\n}\n\nvoid _rtw_free_network(struct\tmlme_priv *pmlmepriv ,struct wlan_network *pnetwork, u8 isfreeall)\n{\n\tu32 delta_time;\n\tu32 lifetime = SCANQUEUE_LIFETIME;\n\t_irqL irqL;\t\n\t_queue *free_queue = &(pmlmepriv->free_bss_pool);\n\t\n_func_enter_;\t\t\n\n\tif (pnetwork == NULL)\n\t\tgoto exit;\n\n\tif (pnetwork->fixed == _TRUE)\n\t\tgoto exit;\n\n\tif ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || \n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )\n\t\tlifetime = 1;\n\n\tif(!isfreeall)\n\t{\n\t\tdelta_time = (u32) rtw_get_passing_time_ms(pnetwork->last_scanned);\n\t\tif(delta_time < lifetime)// unit:msec\n\t\t\tgoto exit;\n\t}\n\n\t_enter_critical_bh(&free_queue->lock, &irqL);\n\t\n\trtw_list_delete(&(pnetwork->list));\n\n\trtw_list_insert_tail(&(pnetwork->list),&(free_queue->queue));\n\t\t\n\tpmlmepriv->num_of_scanned --;\n\t\n\n\t//DBG_871X(\"_rtw_free_network:SSID=%s\\n\", pnetwork->network.Ssid.Ssid);\n\t\n\t_exit_critical_bh(&free_queue->lock, &irqL);\n\t\nexit:\t\t\n\t\n_func_exit_;\t\t\t\n\n}\n\nvoid _rtw_free_network_nolock(struct\tmlme_priv *pmlmepriv, struct wlan_network *pnetwork)\n{\n\n\t_queue *free_queue = &(pmlmepriv->free_bss_pool);\n\n_func_enter_;\t\t\n\n\tif (pnetwork == NULL)\n\t\tgoto exit;\n\n\tif (pnetwork->fixed == _TRUE)\n\t\tgoto exit;\n\n\t//_enter_critical(&free_queue->lock, &irqL);\n\t\n\trtw_list_delete(&(pnetwork->list));\n\n\trtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue));\n\t\t\n\tpmlmepriv->num_of_scanned --;\n\t\n\t//_exit_critical(&free_queue->lock, &irqL);\n\t\nexit:\t\t\n\n_func_exit_;\t\t\t\n\n}\n\n\n/*\n\treturn the wlan_network with the matching addr\n\n\tShall be calle under atomic context... to avoid possible racing condition...\n*/\nstruct wlan_network *_rtw_find_network(_queue *scanned_queue, u8 *addr)\n{\n\n\t//_irqL irqL;\n\t_list\t*phead, *plist;\n\tstruct\twlan_network *pnetwork = NULL;\n\tu8 zero_addr[ETH_ALEN] = {0,0,0,0,0,0};\n\t\n_func_enter_;\t\n\n\tif(_rtw_memcmp(zero_addr, addr, ETH_ALEN)){\n\t\tpnetwork=NULL;\n\t\tgoto exit;\n\t}\n\t\n\t//_enter_critical_bh(&scanned_queue->lock, &irqL);\n\t\n\tphead = get_list_head(scanned_queue);\n\tplist = get_next(phead);\n\t \n\twhile (plist != phead)\n       {\n                pnetwork = LIST_CONTAINOR(plist, struct wlan_network ,list);\n\n\t\tif (_rtw_memcmp(addr, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE)\n                        break;\n\t\t\n\t\tplist = get_next(plist);\n        }\n\n\tif(plist == phead)\n\t\tpnetwork = NULL;\n\n\t//_exit_critical_bh(&scanned_queue->lock, &irqL);\n\t\nexit:\t\t\n\t\n_func_exit_;\t\t\n\n\treturn pnetwork;\n\t\n}\n\n\nvoid _rtw_free_network_queue(_adapter *padapter, u8 isfreeall)\n{\n\t_irqL irqL;\n\t_list *phead, *plist;\n\tstruct wlan_network *pnetwork;\n\tstruct mlme_priv* pmlmepriv = &padapter->mlmepriv;\n\t_queue *scanned_queue = &pmlmepriv->scanned_queue;\n\n_func_enter_;\t\n\t\n\n\t_enter_critical_bh(&scanned_queue->lock, &irqL);\n\n\tphead = get_list_head(scanned_queue);\n\tplist = get_next(phead);\n\n\twhile (rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\tplist = get_next(plist);\n\n\t\t_rtw_free_network(pmlmepriv,pnetwork, isfreeall);\n\t\t\n\t}\n\n\t_exit_critical_bh(&scanned_queue->lock, &irqL);\n\t\n_func_exit_;\t\t\n\n}\n\n\n\n\nsint rtw_if_up(_adapter *padapter)\t{\n\n\tsint res;\n_func_enter_;\t\t\n\n\tif (RTW_CANNOT_RUN(padapter) ||\n\t\t(check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _FALSE)) {\n\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, (\"rtw_if_up:bDriverStopped(%s) OR bSurpriseRemoved(%s)\"\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"));\n\t\tres=_FALSE;\n\t}\n\telse\n\t\tres=  _TRUE;\n\t\n_func_exit_;\n\treturn res;\n}\n\n\nvoid rtw_generate_random_ibss(u8* pibss)\n{\n\tu32\tcurtime = rtw_get_current_time();\n\n_func_enter_;\n\tpibss[0] = 0x02;  //in ad-hoc mode bit1 must set to 1\n\tpibss[1] = 0x11;\n\tpibss[2] = 0x87;\n\tpibss[3] = (u8)(curtime & 0xff) ;//p[0];\n\tpibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1];\n\tpibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2];\n_func_exit_;\n\treturn;\n}\n\nu8 *rtw_get_capability_from_ie(u8 *ie)\n{\n\treturn (ie + 8 + 2);\n}\n\n\nu16 rtw_get_capability(WLAN_BSSID_EX *bss)\n{\n\tu16\tval;\n_func_enter_;\t\n\n\t_rtw_memcpy((u8 *)&val, rtw_get_capability_from_ie(bss->IEs), 2); \n\n_func_exit_;\t\t\n\treturn le16_to_cpu(val);\n}\n\nu8 *rtw_get_timestampe_from_ie(u8 *ie)\n{\n\treturn (ie + 0);\t\n}\n\nu8 *rtw_get_beacon_interval_from_ie(u8 *ie)\n{\n\treturn (ie + 8);\t\n}\n\n\nint\trtw_init_mlme_priv (_adapter *padapter)//(struct\tmlme_priv *pmlmepriv)\n{\n\tint\tres;\n_func_enter_;\t\n\tres = _rtw_init_mlme_priv(padapter);// (pmlmepriv);\n_func_exit_;\t\n\treturn res;\n}\n\nvoid rtw_free_mlme_priv (struct mlme_priv *pmlmepriv)\n{\n_func_enter_;\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_free_mlme_priv\\n\"));\n\t_rtw_free_mlme_priv (pmlmepriv);\n_func_exit_;\t\n}\n\nint\trtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork);\nint\trtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork)\n{\n\tint\tres;\n_func_enter_;\t\t\n\tres = _rtw_enqueue_network(queue, pnetwork);\n_func_exit_;\t\t\n\treturn res;\n}\n\n/*\nstatic struct\twlan_network *rtw_dequeue_network(_queue *queue)\n{\n\tstruct wlan_network *pnetwork;\n_func_enter_;\t\t\n\tpnetwork = _rtw_dequeue_network(queue);\n_func_exit_;\t\t\n\treturn pnetwork;\n}\n*/\n\nstruct\twlan_network *rtw_alloc_network(struct\tmlme_priv *pmlmepriv );\nstruct\twlan_network *rtw_alloc_network(struct\tmlme_priv *pmlmepriv )//(_queue\t*free_queue)\n{\n\tstruct\twlan_network\t*pnetwork;\n_func_enter_;\t\t\t\n\tpnetwork = _rtw_alloc_network(pmlmepriv);\n_func_exit_;\t\t\t\n\treturn pnetwork;\n}\n\nvoid rtw_free_network(struct mlme_priv *pmlmepriv, struct\twlan_network *pnetwork, u8 is_freeall);\nvoid rtw_free_network(struct mlme_priv *pmlmepriv, struct\twlan_network *pnetwork, u8 is_freeall)//(struct\twlan_network *pnetwork, _queue\t*free_queue)\n{\n_func_enter_;\t\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_free_network==> ssid = %s \\n\\n\" , pnetwork->network.Ssid.Ssid));\n\t_rtw_free_network(pmlmepriv, pnetwork, is_freeall);\n_func_exit_;\n}\n\nvoid rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork );\nvoid rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork )\n{\n_func_enter_;\t\t\n\t//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_free_network==> ssid = %s \\n\\n\" , pnetwork->network.Ssid.Ssid));\n\t_rtw_free_network_nolock(&(padapter->mlmepriv), pnetwork);\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_unlink_bss(padapter, pnetwork);\n#endif //CONFIG_IOCTL_CFG80211\n_func_exit_;\t\t\n}\n\n\nvoid rtw_free_network_queue(_adapter* dev, u8 isfreeall)\n{\n_func_enter_;\t\t\n\t_rtw_free_network_queue(dev, isfreeall);\n_func_exit_;\t\t\t\n}\n\n/*\n\treturn the wlan_network with the matching addr\n\n\tShall be calle under atomic context... to avoid possible racing condition...\n*/\nstruct\twlan_network *rtw_find_network(_queue *scanned_queue, u8 *addr)\n{\n\tstruct\twlan_network *pnetwork = _rtw_find_network(scanned_queue, addr);\n\n\treturn pnetwork;\n}\n\nint rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork)\n{\n\tint ret=_TRUE;\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\n\tif ( (psecuritypriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ ) &&\n\t\t    ( pnetwork->network.Privacy == 0 ) )\n\t{\n\t\tret=_FALSE;\n\t}\n\telse if((psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_ ) &&\n\t\t ( pnetwork->network.Privacy == 1 ) )\n\t{\n\t\tret=_FALSE;\n\t}\n\telse\n\t{\n\t\tret=_TRUE;\n\t}\n\t\n\treturn ret;\n\t\n}\n\ninline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b)\n{\n\t//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"(%s,%d)(%s,%d)\\n\",\n\t//\t\ta->Ssid.Ssid,a->Ssid.SsidLength,b->Ssid.Ssid,b->Ssid.SsidLength));\n\treturn (a->Ssid.SsidLength == b->Ssid.SsidLength) \n\t\t&&  _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE;\n}\n\nint is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature)\n{\n\t u16 s_cap, d_cap;\n\t \n_func_enter_;\t\n\n\tif(rtw_bug_check(dst, src, &s_cap, &d_cap)==_FALSE)\n\t\t\treturn _FALSE;\n\n\t_rtw_memcpy((u8 *)&s_cap, rtw_get_capability_from_ie(src->IEs), 2);\n\t_rtw_memcpy((u8 *)&d_cap, rtw_get_capability_from_ie(dst->IEs), 2);\n\n\t\n\ts_cap = le16_to_cpu(s_cap);\n\td_cap = le16_to_cpu(d_cap);\n\t\n_func_exit_;\t\t\t\n\n#ifdef CONFIG_P2P\n\tif ((feature == 1) && // 1: P2P supported\n\t\t(_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE)\n\t\t) {\n\t\treturn _TRUE;\n\t}\n#endif\n\n\treturn ((src->Ssid.SsidLength == dst->Ssid.SsidLength) &&\n\t\t//\t(src->Configuration.DSConfig == dst->Configuration.DSConfig) &&\n\t\t\t( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) &&\n\t\t\t( (_rtw_memcmp(src->Ssid.Ssid, dst->Ssid.Ssid, src->Ssid.SsidLength)) == _TRUE) &&\n\t\t\t((s_cap & WLAN_CAPABILITY_IBSS) == \n\t\t\t(d_cap & WLAN_CAPABILITY_IBSS)) &&\n\t\t\t((s_cap & WLAN_CAPABILITY_BSS) == \n\t\t\t(d_cap & WLAN_CAPABILITY_BSS)));\n\t\n}\n\nstruct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network)\n{\n\t_list *phead, *plist;\n\tstruct wlan_network *found = NULL;\n\n\tphead = get_list_head(scanned_queue);\n\tplist = get_next(phead);\n\n\twhile (plist != phead) {\n\t\tfound = LIST_CONTAINOR(plist, struct wlan_network ,list);\n\n\t\tif (is_same_network(&network->network, &found->network,0))\n\t\t\tbreak;\n\n\t\tplist = get_next(plist);\n\t}\n\n\tif(plist == phead)\n\t\tfound = NULL;\nexit:\t\t\n\treturn found;\n}\n\nstruct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network)\n{\n\t_irqL irqL;\n\tstruct wlan_network *found = NULL;\n\n\tif (scanned_queue == NULL || network == NULL)\n\t\tgoto exit;\t\n\n\t_enter_critical_bh(&scanned_queue->lock, &irqL);\n\tfound = _rtw_find_same_network(scanned_queue, network);\n\t_exit_critical_bh(&scanned_queue->lock, &irqL);\n\nexit:\n\treturn found;\n}\n\nstruct\twlan_network\t* rtw_get_oldest_wlan_network(_queue *scanned_queue)\n{\n\t_list\t*plist, *phead;\n\n\t\n\tstruct\twlan_network\t*pwlan = NULL;\n\tstruct\twlan_network\t*oldest = NULL;\n_func_enter_;\t\t\n\tphead = get_list_head(scanned_queue);\n\t\n\tplist = get_next(phead);\n\n\twhile(1)\n\t{\n\t\t\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\t\t\n\t\tpwlan= LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\tif(pwlan->fixed!=_TRUE)\n\t\t{\t\t\n\t\t\tif (oldest == NULL ||time_after(oldest->last_scanned, pwlan->last_scanned))\n\t\t\t\toldest = pwlan;\n\t\t}\n\t\t\n\t\tplist = get_next(plist);\n\t}\n_func_exit_;\t\t\n\treturn oldest;\n\t\n}\n\nvoid update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src,\n\t_adapter * padapter, bool update_ie)\n{\n\tu8 ss_ori = dst->PhyInfo.SignalStrength;\n\tu8 sq_ori = dst->PhyInfo.SignalQuality;\n\tlong rssi_ori = dst->Rssi;\n\n\tu8 ss_smp = src->PhyInfo.SignalStrength;\n\tu8 sq_smp = src->PhyInfo.SignalQuality;\n\tlong rssi_smp = src->Rssi;\n\n\tu8 ss_final;\n\tu8 sq_final;\n\tlong rssi_final;\n\n_func_enter_;\t\t\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\trtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again\n#endif\n\n\t#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1\n\tif(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" %s(\"MAC_FMT\", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t, src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig\n\t\t\t,ss_ori, sq_ori, rssi_ori\n\t\t\t,ss_smp, sq_smp, rssi_smp\n\t\t);\n\t}\n\t#endif\n\n\t/* The rule below is 1/5 for sample value, 4/5 for history value */\n\tif (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) {\n\t\t/* Take the recvpriv's value for the connected AP*/\n\t\tss_final = padapter->recvpriv.signal_strength;\n\t\tsq_final = padapter->recvpriv.signal_qual;\n\t\t/* the rssi value here is undecorated, and will be used for antenna diversity */\n\t\tif(sq_smp != 101) /* from the right channel */\n\t\t\trssi_final = (src->Rssi+dst->Rssi*4)/5;\n\t\telse\n\t\t\trssi_final = rssi_ori;\n\t}\n\telse {\n\t\tif(sq_smp != 101) { /* from the right channel */\n\t\t\tss_final = ((u32)(src->PhyInfo.SignalStrength)+(u32)(dst->PhyInfo.SignalStrength)*4)/5;\n\t\t\tsq_final = ((u32)(src->PhyInfo.SignalQuality)+(u32)(dst->PhyInfo.SignalQuality)*4)/5;\n\t\t\trssi_final = (src->Rssi+dst->Rssi*4)/5;\n\t\t} else {\n\t\t\t/* bss info not receving from the right channel, use the original RX signal infos */\n\t\t\tss_final = dst->PhyInfo.SignalStrength;\n\t\t\tsq_final = dst->PhyInfo.SignalQuality;\n\t\t\trssi_final = dst->Rssi;\n\t\t}\n\t\t\n\t}\n\n\tif (update_ie) {\n\t\tdst->Reserved[0] = src->Reserved[0];\n\t\tdst->Reserved[1] = src->Reserved[1];\n\t\t_rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src));\n\t}\n\n\tdst->PhyInfo.SignalStrength = ss_final;\n\tdst->PhyInfo.SignalQuality = sq_final;\n\tdst->Rssi = rssi_final;\n\n\t#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1\n\tif(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" %s(\"MAC_FMT\"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t, dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi);\n\t}\n\t#endif\n\n#if 0 // old codes, may be useful one day...\n//\tDBG_871X(\"update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx\",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi);\n\tif (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src))\n\t{\n\t\n\t\t//DBG_871X(\"b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\\n\",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal);\n\t\tif(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX)\n\t        {\n\t              padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;\n\t              last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];\n\t              padapter->recvpriv.signal_qual_data.total_val -= last_evm;\n\t        }\n               \tpadapter->recvpriv.signal_qual_data.total_val += query_rx_pwr_percentage(src->Rssi);\n\n              \tpadapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = query_rx_pwr_percentage(src->Rssi);\n                if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)\n                       padapter->recvpriv.signal_qual_data.index = 0;\n\n\t\t//DBG_871X(\"Total SQ=%d  pattrib->signal_qual= %d\\n\", padapter->recvpriv.signal_qual_data.total_val, src->Rssi);\n\n\t\t// <1> Showed on UI for user,in percentage.\n\t\ttmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num;\n                padapter->recvpriv.signal=(u8)tmpVal;//Link quality\n\n\t\tsrc->Rssi= translate_percentage_to_dbm(padapter->recvpriv.signal) ;\n\t}\n\telse{\n//\tDBG_871X(\"ELSE:ssid=%s update_network: src->rssi=0x%d dst->rssi=%d\\n\",src->Ssid.Ssid,src->Rssi,dst->Rssi);\n\t\tsrc->Rssi=(src->Rssi +dst->Rssi)/2;//dBM\n\t}\t\n\n//\tDBG_871X(\"a:update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\\n\",src->Rssi,padapter->recvpriv.signal);\n\n#endif\n\n_func_exit_;\t\t\n}\n\nstatic void update_current_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork)\n{\n\tstruct\tmlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\t\n_func_enter_;\t\t\n\n\trtw_bug_check(&(pmlmepriv->cur_network.network), \n\t\t&(pmlmepriv->cur_network.network), \n\t\t&(pmlmepriv->cur_network.network), \n\t\t&(pmlmepriv->cur_network.network));\n\n\tif ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0)))\n\t{\n\t\t//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,\"Same Network\\n\");\n\n\t\t//if(pmlmepriv->cur_network.network.IELength<= pnetwork->IELength)\n\t\t{\n\t\t\tupdate_network(&(pmlmepriv->cur_network.network), pnetwork,adapter, _TRUE);\n\t\t\trtw_update_protection(adapter, (pmlmepriv->cur_network.network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), \n\t\t\t\t\t\t\t\t\tpmlmepriv->cur_network.network.IELength);\n\t\t}\n\t}\n\n_func_exit_;\t\t\t\n\n}\n\n\n/*\n\nCaller must hold pmlmepriv->lock first.\n\n\n*/\nvoid rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target)\n{\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tULONG\tbssid_ex_sz;\n\tstruct mlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(adapter->mlmeextpriv);\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(adapter->wdinfo);\n#endif // CONFIG_P2P\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct wlan_network\t*pnetwork = NULL;\n\tstruct wlan_network\t*oldest = NULL;\n\tint target_find = 0;\n\tu8 feature = 0;    \n\n_func_enter_;\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n#ifdef CONFIG_P2P\n\tif (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\tfeature = 1; // p2p enable\n#endif\n\n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\trtw_bug_check(pnetwork, pnetwork, pnetwork, pnetwork);\n\n#ifdef CONFIG_P2P\n\t\tif (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&\n\t\t\t(_rtw_memcmp(pnetwork->network.MacAddress, target->MacAddress, ETH_ALEN) == _TRUE))\n\t\t{\n\t\t\ttarget_find = 1;\n\t\t\tbreak;\n\t\t}\n#endif\n\n\t\tif (is_same_network(&(pnetwork->network), target, feature))\n\t\t{\n\t\t\ttarget_find = 1;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (rtw_roam_flags(adapter)) {\n\t\t\t/* TODO: don't  select netowrk in the same ess as oldest if it's new enough*/\n\t\t}\n\n\t\tif (oldest == NULL || time_after(oldest->last_scanned, pnetwork->last_scanned))\n\t\t\toldest = pnetwork;\n\n\t\tplist = get_next(plist);\n\n\t}\n\t\n\t\n\t/* If we didn't find a match, then get a new network slot to initialize\n\t * with this beacon's information */\n\t//if (rtw_end_of_queue_search(phead,plist)== _TRUE) {\n\tif (!target_find) {\t\t\n\t\tif (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) {\n\t\t\t/* If there are no more slots, expire the oldest */\n\t\t\t//list_del_init(&oldest->list);\n\t\t\tpnetwork = oldest;\n\t\t\tif(pnetwork==NULL){ \n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n\\n\\nsomething wrong here\\n\\n\\n\"));\n\t\t\t\tgoto exit;\n\t\t\t}\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\t\t//target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity\n\t\t\trtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna));\n#endif\n\t\t\t_rtw_memcpy(&(pnetwork->network), target,  get_WLAN_BSSID_EX_sz(target));\n\t\t\t//pnetwork->last_scanned = rtw_get_current_time();\n\t\t\t// variable initialize\n\t\t\tpnetwork->fixed = _FALSE;\n\t\t\tpnetwork->last_scanned = rtw_get_current_time();\n\n\t\t\tpnetwork->network_type = 0;\t\n\t\t\tpnetwork->aid=0;\t\t\n\t\t\tpnetwork->join_res=0;\n\n\t\t\t/* bss info not receving from the right channel */\n\t\t\tif (pnetwork->network.PhyInfo.SignalQuality == 101)\n\t\t\t\tpnetwork->network.PhyInfo.SignalQuality = 0;\n\t\t}\n\t\telse {\n\t\t\t/* Otherwise just pull from the free list */\n\n\t\t\tpnetwork = rtw_alloc_network(pmlmepriv); // will update scan_time\n\n\t\t\tif(pnetwork==NULL){ \n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n\\n\\nsomething wrong here\\n\\n\\n\"));\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\tbssid_ex_sz = get_WLAN_BSSID_EX_sz(target);\n\t\t\ttarget->Length = bssid_ex_sz;\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\t\t//target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;\n\t\t\trtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna));\n#endif\n\t\t\t_rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz );\n\n\t\t\tpnetwork->last_scanned = rtw_get_current_time();\n\n\t\t\t/* bss info not receving from the right channel */\n\t\t\tif (pnetwork->network.PhyInfo.SignalQuality == 101)\n\t\t\t\tpnetwork->network.PhyInfo.SignalQuality = 0;\n\n\t\t\trtw_list_insert_tail(&(pnetwork->list),&(queue->queue)); \n\n\t\t}\n\t}\n\telse {\n\t\t/* we have an entry and we are going to update it. But this entry may\n\t\t * be already expired. In this case we do the same as we found a new \n\t\t * net and call the new_net handler\n\t\t */\n\t\tbool update_ie = _TRUE;\n\n\t\tpnetwork->last_scanned = rtw_get_current_time();\n\n\t\t//target.Reserved[0]==1, means that scaned network is a bcn frame.\n\t\tif((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1))\n\t\t\tupdate_ie = _FALSE;\n\n\t\t// probe resp(3) > beacon(1) > probe req(2)\n\t\tif ((target->Reserved[0] != 2) &&\n\t\t\t(target->Reserved[0] >= pnetwork->network.Reserved[0])\n\t\t\t) {\n\t\t\tupdate_ie = _TRUE;\n\t\t}\n\t\telse {\n\t\t\tupdate_ie = _FALSE;\n\t\t}\n\n\t\tupdate_network(&(pnetwork->network), target,adapter, update_ie);\n\t}\n\nexit:\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n_func_exit_;\n}\n\nvoid rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork);\nvoid rtw_add_network(_adapter *adapter, WLAN_BSSID_EX *pnetwork)\n{\n\t_irqL irqL;\n\tstruct\tmlme_priv\t*pmlmepriv = &(((_adapter *)adapter)->mlmepriv);\n\t//_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\n_func_enter_;\t\t\n\n\t//_enter_critical_bh(&queue->lock, &irqL);\n\n\t#if defined(CONFIG_P2P) && defined(CONFIG_P2P_REMOVE_GROUP_INFO)\n\tif (adapter->registrypriv.wifi_spec == 0)\n\t\trtw_WLAN_BSSID_EX_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO);\n\t#endif\n\t\n\tupdate_current_network(adapter, pnetwork);\n\t\n\trtw_update_scanned_network(adapter, pnetwork);\n\n\t//_exit_critical_bh(&queue->lock, &irqL);\n\t\n_func_exit_;\t\t\n}\n\n//select the desired network based on the capability of the (i)bss.\n// check items: (1) security\n//\t\t\t   (2) network_type\n//\t\t\t   (3) WMM\n//\t\t\t   (4) HT\n//                     (5) others\nint rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork);\nint rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork)\n{\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tu32 desired_encmode;\n\tu32 privacy;\n\n\t//u8 wps_ie[512];\n\tuint wps_ielen;\n\n\tint bselected = _TRUE;\n\t\n\tdesired_encmode = psecuritypriv->ndisencryptstatus;\n\tprivacy = pnetwork->network.Privacy;\n\n\tif(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))\n\t{\n\t\tif(rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen)!=NULL)\n\t\t{\n\t\t\treturn _TRUE;\n\t\t}\n\t\telse\n\t\t{\t\n\t\t\treturn _FALSE;\n\t\t}\t\n\t}\n\tif (adapter->registrypriv.wifi_spec == 1) //for  correct flow of 8021X  to do....\n\t{\n\t\tu8 *p=NULL;\n\t\tuint ie_len=0;\n\n\t\tif ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0))\n\t            bselected = _FALSE;\n\n\t\tif ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) {\n\t\t\tp = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_));\n\t\t\tif (p && ie_len>0) {\n\t\t\t\tbselected = _TRUE;\n\t\t\t} else {\n\t\t\t\tbselected = _FALSE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\n \tif ((desired_encmode != Ndis802_11EncryptionDisabled) && (privacy == 0)) {\n\t\tDBG_871X(\"desired_encmode: %d, privacy: %d\\n\", desired_encmode, privacy);\n\t\tbselected = _FALSE;\n \t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)\n\t{\n\t\tif(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode)\n\t\t\tbselected = _FALSE;\n\t}\t\n\t\t\n\n\treturn bselected;\n}\n\n/* TODO: Perry : For Power Management */\nvoid rtw_atimdone_event_callback(_adapter\t*adapter , u8 *pbuf)\n{\n\n_func_enter_;\t\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"receive atimdone_evet\\n\"));\t\n_func_exit_;\t\t\t\n\treturn;\t\n}\n\n\nvoid rtw_survey_event_callback(_adapter\t*adapter, u8 *pbuf)\n{\n\t_irqL  irqL;\n\tu32 len;\n\tWLAN_BSSID_EX *pnetwork;\n\tstruct\tmlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\n_func_enter_;\t\t\n\n\tpnetwork = (WLAN_BSSID_EX *)pbuf;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_survey_event_callback, ssid=%s\\n\",  pnetwork->Ssid.Ssid));\n\n#ifdef CONFIG_RTL8712\n        //endian_convert\n \tpnetwork->Length = le32_to_cpu(pnetwork->Length);\n  \tpnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);\t\n\tpnetwork->Privacy =le32_to_cpu( pnetwork->Privacy);\n\tpnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);\n\tpnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse);\t\n\tpnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow);\n\tpnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod);\n\tpnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig);\n\tpnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);\n\tpnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);\n\tpnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);\n\tpnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length);\t\n\tpnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length);\n\tpnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode);\n\tpnetwork->IELength = le32_to_cpu(pnetwork->IELength);\n#endif\t\n\n\tlen = get_WLAN_BSSID_EX_sz(pnetwork);\n\tif(len > (sizeof(WLAN_BSSID_EX)))\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n ****rtw_survey_event_callback: return a wrong bss ***\\n\"));\n\t\treturn;\n\t}\n\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t// update IBSS_network 's timestamp\n\tif ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE)\n\t{\n\t\t//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,\"rtw_survey_event_callback : WIFI_ADHOC_MASTER_STATE \\n\\n\");\n\t\tif(_rtw_memcmp(&(pmlmepriv->cur_network.network.MacAddress), pnetwork->MacAddress, ETH_ALEN))\n\t\t{\n\t\t\tstruct wlan_network* ibss_wlan = NULL;\n\t\t\t_irqL\tirqL;\n\t\t\t\n\t\t\t_rtw_memcpy(pmlmepriv->cur_network.network.IEs, pnetwork->IEs, 8);\n\t\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\tibss_wlan = rtw_find_network(&pmlmepriv->scanned_queue,  pnetwork->MacAddress);\n\t\t\tif(ibss_wlan)\n\t\t\t{\n\t\t\t\t_rtw_memcpy(ibss_wlan->network.IEs , pnetwork->IEs, 8);\t\t\t\n\t\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\t\t\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t}\n\t}\n\n\t// lock pmlmepriv->lock when you accessing network_q\n\tif ((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _FALSE)\n\t{\t\t\n   \t        if( pnetwork->Ssid.Ssid[0] == 0 )\n\t\t{\n\t\t\tpnetwork->Ssid.SsidLength = 0;\n\t\t}\t\n\t\trtw_add_network(adapter, pnetwork);\n\t}\t\n\nexit:\t\n\t\t\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n_func_exit_;\t\t\n\n\treturn;\t\n}\n\nvoid rtw_surveydone_event_callback(_adapter\t*adapter, u8 *pbuf)\n{\n\t_irqL  irqL;\n\tu8 timer_cancelled;\n\tstruct\tmlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\n#ifdef CONFIG_MLME_EXT\n\tmlmeext_surveydone_event_callback(adapter);\n#endif\n\n_func_enter_;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tif (pmlmepriv->wps_probe_req_ie) {\n\t\tu32 free_len = pmlmepriv->wps_probe_req_ie_len;\n\t\tpmlmepriv->wps_probe_req_ie_len = 0;\n\t\trtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);\n\t\tpmlmepriv->wps_probe_req_ie = NULL;\n\t}\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_surveydone_event_callback: fw_state:%x\\n\\n\", get_fwstate(pmlmepriv)));\n\n\tif (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY) == _FALSE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fw_state:0x%x\\n\", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv));\n\t\t//rtw_warn_on(1);\n\t}\n\n\t_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\trtw_set_signal_stat_timer(&adapter->recvpriv);\n\t#endif\n\n\tif(pmlmepriv->to_join == _TRUE)\n\t{\n\t\tif((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE) )\n\t\t{\n\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED)==_FALSE)\n\t\t\t{\n\t\t\t\tset_fwstate(pmlmepriv, _FW_UNDER_LINKING);\t\n\t\t\t\t\n\t\t\t\tif(rtw_select_and_join_from_scanned_queue(pmlmepriv)==_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\t_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tWLAN_BSSID_EX    *pdev_network = &(adapter->registrypriv.dev_network); \t\t\t\n\t\t\t\t\tu8 *pibss = adapter->registrypriv.dev_network.MacAddress;\n\n\t\t\t\t\t//pmlmepriv->fw_state ^= _FW_UNDER_SURVEY;//because don't set assoc_timer\n\t\t\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);\n\n\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"switching to adhoc master\\n\"));\n\t\t\t\t\n\t\t\t\t\t_rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));\n\t\t\t\t\t_rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));\n\t\n\t\t\t\t\trtw_update_registrypriv_dev_network(adapter);\n\t\t\t\t\trtw_generate_random_ibss(pibss);\n\n\t\n\t\t\t\t\tpmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;\n\t\t\t\n\t\t\t\t\tif (rtw_create_ibss_cmd(adapter, 0) != _SUCCESS)\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, (\"Error=>rtw_create_ibss_cmd status FAIL\\n\"));\n\n\t\t\t     \t\tpmlmepriv->to_join = _FALSE;\n\t\t   \t\t}\n\t\t \t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint s_ret;\n\t\t\tset_fwstate(pmlmepriv, _FW_UNDER_LINKING);\n\t\t\tpmlmepriv->to_join = _FALSE;\n\t\t\tif(_SUCCESS == (s_ret=rtw_select_and_join_from_scanned_queue(pmlmepriv)))\n\t\t\t{\n\t     \t\t     _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);\t \n\t\t\t}\n\t\t\telse if(s_ret == 2)//there is no need to wait for join\n\t\t\t{\n\t\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\t\t\t\trtw_indicate_connect(adapter);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"try_to_join, but select scanning queue fail, to_roam:%d\\n\", rtw_to_roam(adapter));\n\n\t\t\t\tif (rtw_to_roam(adapter) != 0) {\n\t\t\t\t\tif(rtw_dec_to_roam(adapter) == 0\n\t\t\t\t\t\t|| _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)\n\t\t\t\t\t) {\n\t\t\t\t\t\trtw_set_to_roam(adapter, 0);\n#ifdef CONFIG_INTEL_WIDI\n\t\t\t\t\t\tif(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);\n\t\t\t\t\t\t\tintel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL, 0);\n\t\t\t\t\t\t\tDBG_871X(\"change to widi listen\\n\");\n\t\t\t\t\t\t}\n#endif // CONFIG_INTEL_WIDI\n\t\t\t\t\t\trtw_free_assoc_resources(adapter, 1);\n\t\t\t\t\t\trtw_indicate_disconnect(adapter);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmlmepriv->to_join = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trtw_indicate_disconnect(adapter);\n\t\t\t\t}\n\t\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {\n\t\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE)\n\t\t\t\t&& check_fwstate(pmlmepriv, _FW_LINKED))\n\t\t\t{\n\t\t\t\tif (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) {\n\t\t\t\t\treceive_disconnect(adapter, pmlmepriv->cur_network.network.MacAddress\n\t\t\t\t\t\t, WLAN_REASON_ACTIVE_ROAM);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t//DBG_871X(\"scan complete in %dms\\n\",rtw_get_passing_time_ms(pmlmepriv->scan_start_time));\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n#ifdef CONFIG_P2P_PS\n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\tp2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0);\n\t}\n#endif // CONFIG_P2P_PS\n\n\trtw_os_xmit_schedule(adapter);\n#ifdef CONFIG_CONCURRENT_MODE\t\n\trtw_os_xmit_schedule(adapter->pbuddy_adapter);\n#endif\n\n#ifdef CONFIG_DRVEXT_MODULE_WSC\n\tdrvext_surveydone_callback(&adapter->drvextpriv);\n#endif\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\t{\n\t\tstruct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\t\t\n\t\tif(pmlmeext->sitesurvey_res.bss_cnt == 0){\n\t\t\t//rtw_hal_sreset_reset(adapter);\n\t\t}\n\t}\n#endif\n\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_surveydone_event_callback(adapter);\n#endif //CONFIG_IOCTL_CFG80211\n\n\trtw_indicate_scan_done(adapter, _FALSE);\n\n#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211)\n\tif (adapter->pbuddy_adapter) {\n\t\t_adapter *buddy_adapter = adapter->pbuddy_adapter;\n\t\tstruct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv);\n\t\tstruct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter);\n\t\tbool indicate_buddy_scan = _FALSE;\n\n\t\t_enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\t\tif (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) {\n\t\t\tbuddy_mlme->scanning_via_buddy_intf = _FALSE;\n\t\t\tclr_fwstate(buddy_mlme, _FW_UNDER_SURVEY);\n\t\t\tindicate_buddy_scan = _TRUE;\n\t\t}\n\t\t_exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\n\t\tif (indicate_buddy_scan == _TRUE) {\n\t\t\t#ifdef CONFIG_IOCTL_CFG80211\n\t\t\trtw_cfg80211_surveydone_event_callback(buddy_adapter);\n\t\t\t#endif\n\t\t\trtw_indicate_scan_done(buddy_adapter, _FALSE);\n\t\t}\n\t}\n#endif /* CONFIG_CONCURRENT_MODE */\n\n_func_exit_;\t\n\n}\n\nvoid rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf)\n{\n\n}\n\nvoid rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf)\n{\n\n}\n\nstatic void free_scanqueue(struct\tmlme_priv *pmlmepriv)\n{\n\t_irqL irqL, irqL0;\n\t_queue *free_queue = &pmlmepriv->free_bss_pool;\n\t_queue *scan_queue = &pmlmepriv->scanned_queue;\n\t_list\t*plist, *phead, *ptemp;\n\t\n_func_enter_;\t\t\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, (\"+free_scanqueue\\n\"));\n\t_enter_critical_bh(&scan_queue->lock, &irqL0);\n\t_enter_critical_bh(&free_queue->lock, &irqL);\n\n\tphead = get_list_head(scan_queue);\n\tplist = get_next(phead);\n\n\twhile (plist != phead)\n       {\n\t\tptemp = get_next(plist);\n\t\trtw_list_delete(plist);\n\t\trtw_list_insert_tail(plist, &free_queue->queue);\n\t\tplist =ptemp;\n\t\tpmlmepriv->num_of_scanned --;\n        }\n\t\n\t_exit_critical_bh(&free_queue->lock, &irqL);\n\t_exit_critical_bh(&scan_queue->lock, &irqL0);\n\t\n_func_exit_;\n}\n\nvoid rtw_reset_rx_info(struct debug_priv *pdbgpriv){\n\tpdbgpriv->dbg_rx_ampdu_drop_count = 0;\n\tpdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;\n\tpdbgpriv->dbg_rx_ampdu_loss_count = 0;\n\tpdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;\n\tpdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;\n}\n\t\n/*\n*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock\n*/\nvoid rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue)\n{\n\t_irqL irqL;\n\tstruct wlan_network* pwlan = NULL;\n\tstruct\tmlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct\tsta_priv *pstapriv = &adapter->stapriv;\n\tstruct wlan_network *tgt_network = &pmlmepriv->cur_network;\n\tstruct dvobj_priv *psdpriv = adapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\t\n\n\t\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\n#endif //CONFIG_TDLS\n_func_enter_;\t\t\t\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, (\"+rtw_free_assoc_resources\\n\"));\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, (\"tgt_network->network.MacAddress=\"MAC_FMT\" ssid=%s\\n\",\n\t\tMAC_ARG(tgt_network->network.MacAddress), tgt_network->network.Ssid.Ssid));\n\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n\t\tstruct sta_info* psta;\n\t\t\n\t\tpsta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress);\n\n#ifdef CONFIG_TDLS\n\t\tif (ptdlsinfo->link_established == _TRUE) {\n\t\t\trtw_tdls_cmd(adapter, NULL, TDLS_RS_RCR);\n\t\t\trtw_reset_tdls_info(adapter);\n\t\t\trtw_free_all_stainfo(adapter);\n\t\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\t}\n\t\telse\n#endif //CONFIG_TDLS\n\t\t{\n\t\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\t\trtw_free_stainfo(adapter,  psta);\n\t\t}\n\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\t\n\t}\n\n\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) {\n\t\tstruct sta_info* psta;\n\t\n\t\trtw_free_all_stainfo(adapter);\n\n\t\tpsta = rtw_get_bcmc_stainfo(adapter);\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\t\trtw_free_stainfo(adapter, psta);\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\n\t\trtw_init_bcmc_stainfo(adapter);\t\n\t}\n\n\tif(lock_scanned_queue)\n\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\n\tpwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network);\n\tif(pwlan)\t\t\n\t{\n\t\tpwlan->fixed = _FALSE;\n\n                DBG_871X(\"free disconnecting network\\n\");\n\t\trtw_free_network_nolock(adapter, pwlan);\n#ifdef CONFIG_P2P\n\t\tif(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\trtw_set_scan_deny(adapter, 2000);\n\t\t\t//rtw_clear_scan_deny(adapter);\t\t\t\n\t\t}\n#endif //CONFIG_P2P\n\t}\t\n\telse\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_free_assoc_resources : pwlan== NULL \\n\\n\"));\n\t}\n\n\n\tif((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1))\n\t\t/*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/)\n\t{\n\t\tif (pwlan)\n\t\t\trtw_free_network_nolock(adapter, pwlan);\n\t}\n\n\tif(lock_scanned_queue)\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\n\tadapter->securitypriv.key_mask = 0;\n\n\trtw_reset_rx_info(pdbgpriv);\n\n_func_exit_;\t\n\t\n}\n\n/*\n*rtw_indicate_connect: the caller has to lock pmlmepriv->lock\n*/\nvoid rtw_indicate_connect(_adapter *padapter)\n{\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, (\"+rtw_indicate_connect\\n\"));\n \n\tpmlmepriv->to_join = _FALSE;\n\n\tif(!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) \n\t{\n\n#ifdef CONFIG_SW_ANTENNA_DIVERSITY\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_LINK, 0);\n#endif\n\n\t\tset_fwstate(pmlmepriv, _FW_LINKED);\n\n\t\trtw_led_control(padapter, LED_CTL_LINK);\n\n\t\n#ifdef CONFIG_DRVEXT_MODULE\n\t\tif(padapter->drvextpriv.enable_wpa)\n\t\t{\n\t\t\tindicate_l2_connect(padapter);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\trtw_os_indicate_connect(padapter);\n\t\t}\n\n\t}\n\n\trtw_set_to_roam(padapter, 0);\n#ifdef CONFIG_INTEL_WIDI\n\tif(padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)\n\t{\n\t\t_rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);\n\t\tintel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_WK, NULL, 0);\n\t\tDBG_871X(\"change to widi listen\\n\");\n\t}\n#endif // CONFIG_INTEL_WIDI\n\n\trtw_set_scan_deny(padapter, 3000);\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, (\"-rtw_indicate_connect: fw_state=0x%08x\\n\", get_fwstate(pmlmepriv)));\n \n_func_exit_;\n\n}\n\n\n/*\n*rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock\n*/\nvoid rtw_indicate_disconnect( _adapter *padapter )\n{\n\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\t\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t*cur_network = &(pmlmeinfo->network);\n\tstruct sta_info *psta;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *wps_ie=NULL;\n\tuint wpsie_len=0;\n\n_func_enter_;\t\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, (\"+rtw_indicate_disconnect\\n\"));\n\n\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS);\n\n\t// force to clear cur_network_scanned's SELECTED REGISTRAR\n\tif (pmlmepriv->cur_network_scanned) {\n\t\tWLAN_BSSID_EX\t*current_joined_bss = &(pmlmepriv->cur_network_scanned->network);\n\t\tif (current_joined_bss) {\n\t\t\twps_ie=rtw_get_wps_ie(current_joined_bss->IEs +_FIXED_IE_LENGTH_,\n\t\t\t\tcurrent_joined_bss->IELength-_FIXED_IE_LENGTH_, NULL, &wpsie_len);\n\t\t\tif (wps_ie && wpsie_len>0) {\n\t\t\t\tu8 *attr = NULL;\n\t\t\t\tu32 attr_len;\n\t\t\t\tattr=rtw_get_wps_attr(wps_ie, wpsie_len, WPS_ATTR_SELECTED_REGISTRAR,\n\t\t\t\t\t\t       NULL, &attr_len);\n\t\t\t\tif (attr)\n\t\t\t\t\t*(attr + 4) = 0;\n\t\t\t}\n\t\t}\n\t}\n        //DBG_871X(\"clear wps when %s\\n\", __func__);\n\n\tif(rtw_to_roam(padapter) > 0)\n\t\t_clr_fwstate_(pmlmepriv, _FW_LINKED);\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tpsta = rtw_get_stainfo(pstapriv,cur_network->MacAddress);\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE))\n\t{\n\t\trtw_wapi_return_one_sta_info(padapter, psta->hwaddr);\n\t}\n\telse if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||\n\t\tcheck_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))\n\t{\n\t\trtw_wapi_return_all_sta_info(padapter);\n\t}\n#endif\n\n\tif(check_fwstate(&padapter->mlmepriv, _FW_LINKED) \n\t\t|| (rtw_to_roam(padapter) <= 0)\n\t)\n\t{\n\t\trtw_os_indicate_disconnect(padapter);\n\n\t\t//set ips_deny_time to avoid enter IPS before LPS leave\n\t\trtw_set_ips_deny(padapter, 3000);\n\n\t      _clr_fwstate_(pmlmepriv, _FW_LINKED);\n\n\t\trtw_led_control(padapter, LED_CTL_NO_LINK);\n\n\t\trtw_clear_scan_deny(padapter);\n\t}\n\n#ifdef CONFIG_P2P_PS\n\tp2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);\n#endif // CONFIG_P2P_PS\n\n#ifdef CONFIG_LPS\n\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1);\n#endif\n\n#ifdef CONFIG_BEAMFORMING\n\tbeamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, cur_network->MacAddress, ETH_ALEN, 1);\n#endif /*CONFIG_BEAMFORMING*/\n\n_func_exit_;\t\n}\n\ninline void rtw_indicate_scan_done( _adapter *padapter, bool aborted)\n{\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n\trtw_os_indicate_scan_done(padapter, aborted);\n\n#ifdef CONFIG_IPS\n\tif (is_primary_adapter(padapter)\n\t\t&& (_FALSE == adapter_to_pwrctl(padapter)->bInSuspend)\n\t\t&& (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_UNDER_LINKING) == _FALSE))\n\t{\n\t\tstruct pwrctrl_priv *pwrpriv;\n\n\t\tpwrpriv = adapter_to_pwrctl(padapter);\n\t\trtw_set_ips_deny(padapter, 0);\n#ifdef CONFIG_IPS_CHECK_IN_WD\n\t\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 1);\n#else // !CONFIG_IPS_CHECK_IN_WD\n\t\t_rtw_set_pwr_state_check_timer(pwrpriv, 1);\n#endif // !CONFIG_IPS_CHECK_IN_WD\n\t}\n#endif // CONFIG_IPS\n}\n\nstatic u32 _rtw_wait_scan_done(_adapter *adapter, u8 abort, u32 timeout_ms)\n{\n\tu32 start;\n\tu32 pass_ms;\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);\n\n\tstart = rtw_get_current_time();\n\t\n\tpmlmeext->scan_abort = abort;\n\t\n\twhile (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)\n\t\t&& rtw_get_passing_time_ms(start) <= timeout_ms) {\n\n\t\tif (RTW_CANNOT_RUN(adapter))\n\t\t\tbreak;\n\n\t\tDBG_871X(FUNC_NDEV_FMT\"fw_state=_FW_UNDER_SURVEY!\\n\", FUNC_NDEV_ARG(adapter->pnetdev));\n\t\trtw_msleep_os(20);\n\t}\n\n\tif (_TRUE == abort) {\n\t\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {\n\t\t\tif (!RTW_CANNOT_RUN(adapter))\n\t\t\t\tDBG_871X(FUNC_NDEV_FMT\"waiting for scan_abort time out!\\n\", FUNC_NDEV_ARG(adapter->pnetdev));\n\t\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t/*_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);*/\n\t\t\tset_survey_timer(pmlmeext, 0);\n\t\t\tmlme_set_scan_to_timer(pmlmepriv, 50);\n\t\t\t#endif\n\t\t\trtw_indicate_scan_done(adapter, _TRUE);\n\t\t}\n\t}\n\t\n\tpmlmeext->scan_abort = _FALSE;\n\tpass_ms = rtw_get_passing_time_ms(start);\n\n\treturn pass_ms;\n\n}\n\nvoid rtw_scan_wait_completed(_adapter *adapter)\n{\n\tu32 scan_to = SCANNING_TIMEOUT;\n\n#ifdef CONFIG_SCAN_BACKOP\n\tif (IsSupported5G(adapter->registrypriv.wireless_mode) \n\t\t&& IsSupported24G(adapter->registrypriv.wireless_mode)) /*dual band*/\n\t\tscan_to = CONC_SCANNING_TIMEOUT_DUAL_BAND;\n\telse /*single band*/\n\t\tscan_to = CONC_SCANNING_TIMEOUT_SINGLE_BAND;\n#endif /* CONFIG_SCAN_BACKOP */\n\n\t_rtw_wait_scan_done(adapter, _FALSE, scan_to);\n}\n\nu32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms)\n{\n\treturn _rtw_wait_scan_done(adapter, _TRUE, timeout_ms);\n}\n\nvoid rtw_scan_abort_no_wait(_adapter *adapter)\n{\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))\n\t\tpmlmeext->scan_abort = _TRUE;\n}\n\nvoid rtw_scan_abort(_adapter *adapter)\n{\n\trtw_scan_abort_timeout(adapter, 200);\n}\n\nstatic struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wlan_network *pnetwork)\n{\n\tint i;\n\tstruct sta_info *bmc_sta, *psta=NULL;\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tpsta = rtw_get_stainfo(pstapriv, pnetwork->network.MacAddress);\n\tif(psta==NULL) {\n\t\tpsta = rtw_alloc_stainfo(pstapriv, pnetwork->network.MacAddress);\n\t}\n\n\tif(psta) //update ptarget_sta\n\t{\n\t\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\t\tpsta->aid  = pnetwork->join_res;\n\n#if 0 //alloc macid when call rtw_alloc_stainfo(), and release macid when call rtw_free_stainfo()\n#ifdef CONFIG_CONCURRENT_MODE\t\n\n\t\tif(PRIMARY_ADAPTER == padapter->adapter_type)\n\t\t\tpsta->mac_id=0;\n\t\telse\n\t\t\tpsta->mac_id=2;\n#else\n\t\tpsta->mac_id=0;\n#endif\n#endif //removed\n\n\t\tupdate_sta_info(padapter, psta);\n\n\t\t//update station supportRate\n\t\tpsta->bssratelen = rtw_get_rateset_len(pnetwork->network.SupportedRates);\n\t\t_rtw_memcpy(psta->bssrateset, pnetwork->network.SupportedRates, psta->bssratelen);\n\t\trtw_hal_update_sta_rate_mask(padapter, psta);\n\n\t\tpsta->wireless_mode = pmlmeext->cur_wireless_mode;\n\t\tpsta->raid = rtw_hal_networktype_to_raid(padapter,psta);\n\n\n\t\t//sta mode\n\t\trtw_hal_set_odm_var(padapter,HAL_ODM_STA_INFO,psta,_TRUE);\n\n\t\t//security related\n\t\tif(padapter->securitypriv.dot11AuthAlgrthm== dot11AuthAlgrthm_8021X)\n\t\t{\t\t\t\t\t\t\n\t\t\tpadapter->securitypriv.binstallGrpkey=_FALSE;\n\t\t\tpadapter->securitypriv.busetkipkey=_FALSE;\t\t\t\t\t\t\n\t\t\tpadapter->securitypriv.bgrpkey_handshake=_FALSE;\n\n\t\t\tpsta->ieee8021x_blocked=_TRUE;\n\t\t\tpsta->dot118021XPrivacy=padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\t\t\t\n\t\t\t_rtw_memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof (union Keytype));\n\t\t\t\t\t\t\n\t\t\t_rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype));\n\t\t\t_rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));\n\t\t\t\t\t\t\n\t\t\t_rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));\n\t\t\tpsta->dot11txpn.val = psta->dot11txpn.val + 1;\n#ifdef CONFIG_IEEE80211W\n\t\t\t_rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));\n#endif //CONFIG_IEEE80211W\n\t\t\t_rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48));\t\n\t\t}\n\n\t\t//\tCommented by Albert 2012/07/21\n\t\t//\tWhen doing the WPS, the wps_ie_len won't equal to 0\n\t\t//\tAnd the Wi-Fi driver shouldn't allow the data packet to be tramsmitted.\n\t\tif ( padapter->securitypriv.wps_ie_len != 0 )\n\t\t{\n\t\t\tpsta->ieee8021x_blocked=_TRUE;\n\t\t\tpadapter->securitypriv.wps_ie_len = 0;\n\t\t}\n\n\n\t\t//for A-MPDU Rx reordering buffer control for bmc_sta & sta_info\n\t\t//if A-MPDU Rx is enabled, reseting  rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff\n\t\t//todo: check if AP can send A-MPDU packets\n\t\tfor(i=0; i < 16 ; i++)\n\t\t{\n\t\t\t//preorder_ctrl = &precvpriv->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl = &psta->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\tpreorder_ctrl->indicate_seq = 0xffff;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d indicate_seq:%u \\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq);\n\t\t\t#endif\n\t\t\tpreorder_ctrl->wend_b= 0xffff;\n\t\t\tpreorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32\n\t\t\tpreorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID;\n\t\t}\n\n\t\t\n\t\tbmc_sta = rtw_get_bcmc_stainfo(padapter);\n\t\tif(bmc_sta)\n\t\t{\n\t\t\tfor(i=0; i < 16 ; i++)\n\t\t\t{\n\t\t\t\t//preorder_ctrl = &precvpriv->recvreorder_ctrl[i];\n\t\t\t\tpreorder_ctrl = &bmc_sta->recvreorder_ctrl[i];\n\t\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\t\tpreorder_ctrl->indicate_seq = 0xffff;\n\t\t\t\t#ifdef DBG_RX_SEQ\n\t\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d indicate_seq:%u \\n\", __FUNCTION__, __LINE__,\n\t\t\t\t\tpreorder_ctrl->indicate_seq);\n\t\t\t\t#endif\n\t\t\t\tpreorder_ctrl->wend_b= 0xffff;\n\t\t\t\tpreorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32\n\t\t\t\tpreorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID;\n\t\t\t}\n\t\t}\n\t}\n\t\t\t\t\t\n\treturn psta;\n\t\n}\n\n//pnetwork : returns from rtw_joinbss_event_callback\n//ptarget_wlan: found from scanned_queue\nstatic void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network *ptarget_wlan, struct wlan_network  *pnetwork)\n{\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct wlan_network  *cur_network = &(pmlmepriv->cur_network);\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\nfw_state:%x, BSSID:\"MAC_FMT\"\\n\"\n\t\t,get_fwstate(pmlmepriv), MAC_ARG(pnetwork->network.MacAddress)));\n\n\t\t\t\t\n\t// why not use ptarget_wlan??\n\t_rtw_memcpy(&cur_network->network, &pnetwork->network, pnetwork->network.Length);\n\t// some IEs in pnetwork is wrong, so we should use ptarget_wlan IEs\n\tcur_network->network.IELength = ptarget_wlan->network.IELength;\n\t_rtw_memcpy(&cur_network->network.IEs[0], &ptarget_wlan->network.IEs[0], MAX_IE_SZ);\n\n\tcur_network->aid = pnetwork->join_res;\n\n\t\t\t\t\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\trtw_set_signal_stat_timer(&padapter->recvpriv);\n#endif\n\tpadapter->recvpriv.signal_strength = ptarget_wlan->network.PhyInfo.SignalStrength;\n\tpadapter->recvpriv.signal_qual = ptarget_wlan->network.PhyInfo.SignalQuality;\n\t//the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled)\n\tpadapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);\n\t#if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1\n\t\tDBG_871X(FUNC_ADPT_FMT\" signal_strength:%3u, rssi:%3d, signal_qual:%3u\"\n\t\t\t\"\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t, padapter->recvpriv.signal_strength\n\t\t\t, padapter->recvpriv.rssi\n\t\t\t, padapter->recvpriv.signal_qual\n\t);\n\t#endif\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\trtw_set_signal_stat_timer(&padapter->recvpriv);\n#endif\n\t\t\t\t\n\t//update fw_state //will clr _FW_UNDER_LINKING here indirectly\n\tswitch(pnetwork->network.InfrastructureMode)\n\t{\t\n\t\tcase Ndis802_11Infrastructure:\t\t\t\t\t\t\n\t\t\t\n\t\t\t\tif(pmlmepriv->fw_state&WIFI_UNDER_WPS)\n\t\t\t\t\tpmlmepriv->fw_state = WIFI_STATION_STATE|WIFI_UNDER_WPS;\n\t\t\t\telse\n\t\t\t\t\tpmlmepriv->fw_state = WIFI_STATION_STATE;\n\t\t\t\t\n\t\t\t\tbreak;\n\t\tcase Ndis802_11IBSS:\t\t\n\t\t\t\tpmlmepriv->fw_state = WIFI_ADHOC_STATE;\n\t\t\t\tbreak;\n\t\tdefault:\n\t\t\t\tpmlmepriv->fw_state = WIFI_NULL_STATE;\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Invalid network_mode\\n\"));\n\t\t\t\tbreak;\n\t}\n\n\trtw_update_protection(padapter, (cur_network->network.IEs) + sizeof (NDIS_802_11_FIXED_IEs), \n\t\t\t\t\t\t\t\t\t(cur_network->network.IELength));\n\n#ifdef CONFIG_80211N_HT\t\t\t\n\trtw_update_ht_cap(padapter, cur_network->network.IEs, cur_network->network.IELength, (u8) cur_network->network.Configuration.DSConfig);\n#endif\n}\n\n//Notes: the fucntion could be > passive_level (the same context as Rx tasklet)\n//pnetwork : returns from rtw_joinbss_event_callback\n//ptarget_wlan: found from scanned_queue\n//if join_res > 0, for (fw_state==WIFI_STATION_STATE), we check if  \"ptarget_sta\" & \"ptarget_wlan\" exist.\t\n//if join_res > 0, for (fw_state==WIFI_ADHOC_STATE), we only check if \"ptarget_wlan\" exist.\n//if join_res > 0, update \"cur_network->network\" from \"pnetwork->network\" if (ptarget_wlan !=NULL).\n//\n//#define REJOIN\nvoid rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf)\n{\n\t_irqL irqL,irqL2;\n\tstatic u8 retry=0;\n\tu8 timer_cancelled;\n\tstruct sta_info *ptarget_sta= NULL, *pcur_sta = NULL;\n   \tstruct\tsta_priv *pstapriv = &adapter->stapriv;\n\tstruct\tmlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct wlan_network \t*pnetwork\t= (struct wlan_network *)pbuf;\n\tstruct wlan_network \t*cur_network = &(pmlmepriv->cur_network);\n\tstruct wlan_network\t*pcur_wlan = NULL, *ptarget_wlan = NULL;\n\tunsigned int \t\tthe_same_macaddr = _FALSE;\t\n\n_func_enter_;\t\n\n#ifdef CONFIG_RTL8712\n       //endian_convert\n\tpnetwork->join_res = le32_to_cpu(pnetwork->join_res);\n\tpnetwork->network_type = le32_to_cpu(pnetwork->network_type);\n\tpnetwork->network.Length = le32_to_cpu(pnetwork->network.Length);\n\tpnetwork->network.Ssid.SsidLength = le32_to_cpu(pnetwork->network.Ssid.SsidLength);\n\tpnetwork->network.Privacy =le32_to_cpu( pnetwork->network.Privacy);\n\tpnetwork->network.Rssi = le32_to_cpu(pnetwork->network.Rssi);\n\tpnetwork->network.NetworkTypeInUse =le32_to_cpu(pnetwork->network.NetworkTypeInUse) ;\t\n\tpnetwork->network.Configuration.ATIMWindow = le32_to_cpu(pnetwork->network.Configuration.ATIMWindow);\n\tpnetwork->network.Configuration.BeaconPeriod = le32_to_cpu(pnetwork->network.Configuration.BeaconPeriod);\n\tpnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig);\n\tpnetwork->network.Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime);\n\tpnetwork->network.Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern);\n\tpnetwork->network.Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet);\n\tpnetwork->network.Configuration.FHConfig.Length=le32_to_cpu(pnetwork->network.Configuration.FHConfig.Length);\t\n\tpnetwork->network.Configuration.Length = le32_to_cpu(pnetwork->network.Configuration.Length);\n\tpnetwork->network.InfrastructureMode = le32_to_cpu(pnetwork->network.InfrastructureMode);\n\tpnetwork->network.IELength = le32_to_cpu(pnetwork->network.IELength );\n#endif\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"joinbss event call back received with res=%d\\n\", pnetwork->join_res));\n\n\trtw_get_encrypt_decrypt_from_registrypriv(adapter);\n\t\n\n\tif (pmlmepriv->assoc_ssid.SsidLength == 0)\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"@@@@@   joinbss event call back  for Any SSid\\n\"));\t\t\n\t}\n\telse\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"@@@@@   rtw_joinbss_event_callback for SSid:%s\\n\", pmlmepriv->assoc_ssid.Ssid));\n\t}\n\t\n\tthe_same_macaddr = _rtw_memcmp(pnetwork->network.MacAddress, cur_network->network.MacAddress, ETH_ALEN);\n\n\tpnetwork->network.Length = get_WLAN_BSSID_EX_sz(&pnetwork->network);\n\tif(pnetwork->network.Length > sizeof(WLAN_BSSID_EX))\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n\\n ***joinbss_evt_callback return a wrong bss ***\\n\\n\"));\n\t\tgoto ignore_joinbss_callback;\n\t}\n\t\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\n\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;\n\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"\\n rtw_joinbss_event_callback !! _enter_critical \\n\"));\n\n\tif(pnetwork->join_res > 0)\n\t{\n\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\tretry = 0;\n\t\tif (check_fwstate(pmlmepriv,_FW_UNDER_LINKING) )\n\t\t{\n\t\t\t//s1. find ptarget_wlan\n\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED) )\n\t\t\t{\n\t\t\t\tif(the_same_macaddr == _TRUE)\n\t\t\t\t{\n\t\t\t\t\tptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpcur_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);\n\t\t\t\t\tif(pcur_wlan)\tpcur_wlan->fixed = _FALSE;\n\n\t\t\t\t\tpcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);\n\t\t\t\t\tif(pcur_sta){\n\t\t\t\t\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\t\t\t\t\t\trtw_free_stainfo(adapter,  pcur_sta);\n\t\t\t\t\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\t\t\t\t\t}\n\n\t\t\t\t\tptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);\n\t\t\t\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){\n\t\t\t\t\t\tif(ptarget_wlan)\tptarget_wlan->fixed = _TRUE;\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tptarget_wlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, pnetwork);\n\t\t\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE){\n\t\t\t\t\tif(ptarget_wlan)\tptarget_wlan->fixed = _TRUE;\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t//s2. update cur_network \n\t\t\tif(ptarget_wlan)\n\t\t\t{\t\t\t\n\t\t\t\trtw_joinbss_update_network(adapter, ptarget_wlan, pnetwork);\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\t\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"Can't find ptarget_wlan when joinbss_event callback\\n\");\n\t\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t\tgoto ignore_joinbss_callback;\n\t\t\t}\n\t\t\t\t\t\n\t\t\t\n\t\t\t//s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode \n\t\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t\t{ \n\t\t\t\tptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork);\n\t\t\t\tif(ptarget_sta==NULL)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Can't update stainfo when joinbss_event callback\\n\"));\n\t\t\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t\t\tgoto ignore_joinbss_callback;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//s4. indicate connect\t\t\t\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t\t{\n\t\t\t\tpmlmepriv->cur_network_scanned = ptarget_wlan;\n\t\t\t\trtw_indicate_connect(adapter);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"adhoc mode, fw_state:%x\", get_fwstate(pmlmepriv)));\n\t\t\t}\n\n\t\t\t\t\n\t\t\t//s5. Cancle assoc_timer\t\t\t\t\t\n\t\t\t_cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);\n\t\t\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"Cancle assoc_timer \\n\"));\t\t\n\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_joinbss_event_callback err: fw_state:%x\", get_fwstate(pmlmepriv)));\t\n\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\tgoto ignore_joinbss_callback;\n\t\t}\n\t\t\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\t\n\t\t\t\t\n\t}\n\telse if(pnetwork->join_res == -4) \n\t{\n\t\trtw_reset_securitypriv(adapter);\n\t\t_set_timer(&pmlmepriv->assoc_timer, 1);\t\t\t\t\t\n\n\t\t//rtw_free_assoc_resources(adapter, 1);\n\n\t\tif((check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) == _TRUE)\n\t\t{\t\t\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"fail! clear _FW_UNDER_LINKING ^^^fw_state=%x\\n\", get_fwstate(pmlmepriv)));\n\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\t\t}\t\n\t\t\n\t}\n\telse //if join_res < 0 (join fails), then try again\n\t{\n\t\n\t\t#ifdef REJOIN\n\t\tres = _FAIL;\n\t\tif(retry < 2) {\n\t\t\tres = rtw_select_and_join_from_scanned_queue(pmlmepriv);\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"rtw_select_and_join_from_scanned_queue again! res:%d\\n\",res));\n\t\t}\n\n\t\t if(res == _SUCCESS)\n\t\t{\n\t\t\t//extend time of assoc_timer\n\t\t\t_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);\n\t\t\tretry++;\n\t\t}\n\t\telse if(res == 2)//there is no need to wait for join\n\t\t{\n\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\t\t\trtw_indicate_connect(adapter);\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Set Assoc_Timer = 1; can't find match ssid in scanned_q \\n\"));\n\t\t#endif\n\t\t\t\n\t\t\t_set_timer(&pmlmepriv->assoc_timer, 1);\n\t\t\t//rtw_free_assoc_resources(adapter, 1);\n\t\t\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\t\t\t\n\t\t#ifdef REJOIN\n\t\t\tretry = 0;\t\n\t\t}\n\t\t#endif\n\t}\n\nignore_joinbss_callback:\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t_func_exit_;\t\n}\n\nvoid rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf)\n{\n\tstruct wlan_network \t*pnetwork\t= (struct wlan_network *)pbuf;\n\n_func_enter_;\n\n\tmlmeext_joinbss_event_callback(adapter, pnetwork->join_res);\n\n\trtw_os_xmit_schedule(adapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\t\n\trtw_os_xmit_schedule(adapter->pbuddy_adapter);\n#endif\t\n\n_func_exit_;\n}\n\n#if 0\n//#if (RATE_ADAPTIVE_SUPPORT==1)\t//for 88E RA\t\t\nu8 search_max_mac_id(_adapter *padapter)\n{\n\tu8 mac_id, aid;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE)){\t\t\n\t\t\n#if 1\n\t\t_irqL irqL;\n\t\tstruct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);\n\n\t\t_enter_critical_bh(&pdvobj->lock, &irqL);\n\t\tfor(mac_id=(NUM_STA-1); mac_id>0; mac_id--)\n\t\t\tif(pdvobj->macid[mac_id] == _TRUE)\n\t\t\t\tbreak;\n\t\t_exit_critical_bh(&pdvobj->lock, &irqL);\n\n#else\n\t\tfor (aid = (pstapriv->max_num_sta); aid > 0; aid--)\n\t\t{\n\t\t\tif (pstapriv->sta_aid[aid-1] != NULL)\n\t\t\t{\n\t\t\t\tpsta = pstapriv->sta_aid[aid-1];\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n/*\n\t\tfor (mac_id = (pstapriv->max_num_sta-1); mac_id >= 0; mac_id--)\n\t\t{\n\t\t\tif (pstapriv->sta_aid[mac_id] != NULL)\n\t\t\t\tbreak;\n\t\t}\t\n*/\n\t\tmac_id = aid + 1;\n#endif\n\t}\n\telse\n#endif\n\t{//adhoc  id =  31~2\n\t\tfor (mac_id = (NUM_STA-1); mac_id >= IBSS_START_MAC_ID ; mac_id--)\n\t\t{\n\t\t\tif (pmlmeinfo->FW_sta_info[mac_id].status == 1)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tDBG_871X(\"max mac_id=%d\\n\", mac_id);\n\n\treturn mac_id;\n\n}\t\t\n#endif\t\n\n//FOR STA, AP ,AD-HOC mode\nvoid rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus)\n{\n\tu16 media_status_rpt;\n\n\tif(psta==NULL)\treturn;\n\n\t#if (RATE_ADAPTIVE_SUPPORT==1)\t//for 88E RA\t\n\t{\n\t\tu8 macid = rtw_search_max_mac_id(adapter);\t\t\t\t\n\t\trtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid);\n\t}\n\t#endif\n\tmedia_status_rpt = (u16)((psta->mac_id<<8)|mstatus); //  MACID|OPMODE:1 connect\t\t\t\t\n\trtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status_rpt);\t\t\t\n}\n\nvoid rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf)\n{\n\t_irqL irqL;\t\n\tstruct sta_info *psta;\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\tstruct stassoc_event\t*pstassoc\t= (struct stassoc_event*)pbuf;\n\tstruct wlan_network \t*cur_network = &(pmlmepriv->cur_network);\n\tstruct wlan_network\t*ptarget_wlan = NULL;\n\t\n_func_enter_;\t\n\t\n\tif(rtw_access_ctrl(adapter, pstassoc->macaddr) == _FALSE)\n\t\treturn;\n\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t{\n\t\tpsta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);\t\n\t\tif(psta)\n\t\t{\t\t\n\t\t\tu8 *passoc_req = NULL;\n\t\t\tu32 assoc_req_len = 0;\n\t\t\n\t\t\trtw_sta_media_status_rpt(adapter, psta, 1);\n\t\t\n#ifndef CONFIG_AUTO_AP_MODE\n\n\t\t\tap_sta_info_defer_update(adapter, psta);\n\n\t\t\t//report to upper layer \n\t\t\tDBG_871X(\"indicate_sta_assoc_event to upper layer - hostapd\\n\");\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\t_enter_critical_bh(&psta->lock, &irqL);\n\t\t\tif(psta->passoc_req && psta->assoc_req_len>0)\n\t\t\t{\t\t\t\t\n\t\t\t\tpassoc_req = rtw_zmalloc(psta->assoc_req_len);\n\t\t\t\tif(passoc_req)\n\t\t\t\t{\n\t\t\t\t\tassoc_req_len = psta->assoc_req_len;\n\t\t\t\t\t_rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len);\n\t\t\t\t\t\n\t\t\t\t\trtw_mfree(psta->passoc_req , psta->assoc_req_len);\n\t\t\t\t\tpsta->passoc_req = NULL;\n\t\t\t\t\tpsta->assoc_req_len = 0;\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\t_exit_critical_bh(&psta->lock, &irqL);\n\n\t\t\tif(passoc_req && assoc_req_len>0)\n\t\t\t{\n\t\t\t\trtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len);\n\n\t\t\t\trtw_mfree(passoc_req, assoc_req_len);\n\t\t\t}\t\t\t\n#else //!CONFIG_IOCTL_CFG80211\t\n\t\t\trtw_indicate_sta_assoc_event(adapter, psta);\n#endif //!CONFIG_IOCTL_CFG80211\n#endif //!CONFIG_AUTO_AP_MODE\n\n#ifdef CONFIG_BEAMFORMING\n\t\t\tbeamforming_wk_cmd(adapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);\n#endif/*CONFIG_BEAMFORMING*/\n\t\t}\t\t\n\t\tgoto exit;\n\t}\t\n#endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\n\t//for AD-HOC mode\n\tpsta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);\t\n\tif( psta != NULL)\n\t{\n\t\t//the sta have been in sta_info_queue => do nothing \n\t\t\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \\n\"));\n\t\t\n\t\tgoto exit; //(between drv has received this event before and  fw have not yet to set key to CAM_ENTRY)\n\t}\n\n\tpsta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr);\t\n\tif (psta == NULL) {\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Can't alloc sta_info when rtw_stassoc_event_callback\\n\"));\n\t\tgoto exit;\n\t}\t\n\t\n\t//to do : init sta_info variable\n\tpsta->qos_option = 0;\n\tpsta->mac_id = (uint)pstassoc->cam_id;\n\t//psta->aid = (uint)pstassoc->cam_id;\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\t//for ad-hoc mode\n\trtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE);\n\n\trtw_sta_media_status_rpt(adapter, psta, 1);\n\t\n\tif(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n\t\tpsta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm;\n\t\n\n\tpsta->ieee8021x_blocked = _FALSE;\t\t\n\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tif ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || \n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )\n\t{\n\t\tif(adapter->stapriv.asoc_sta_count== 2)\n\t\t{\n\t\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\tptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);\n\t\t\tpmlmepriv->cur_network_scanned = ptarget_wlan;\n\t\t\tif(ptarget_wlan)\tptarget_wlan->fixed = _TRUE;\n\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t// a sta + bc/mc_stainfo (not Ibss_stainfo)\n\t\t\trtw_indicate_connect(adapter);\n\t\t}\n\t}\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\n\tmlmeext_sta_add_event_callback(adapter, psta);\n\t\n#ifdef CONFIG_RTL8711\n\t//submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta\t\n\trtw_setstakey_cmd(adapter, psta, GROUP_KEY, _TRUE);\n#endif\n\t\t\nexit:\n\t\n_func_exit_;\t\n\n}\n\n#ifdef CONFIG_IEEE80211W\nvoid rtw_sta_timeout_event_callback(_adapter *adapter, u8 *pbuf)\n{\n\t_irqL irqL;\n\tstruct sta_info *psta;\n\tstruct stadel_event *pstadel = (struct stadel_event *)pbuf;\n\tstruct sta_priv *pstapriv = &adapter->stapriv;\n\t\n_func_enter_;\n\t\n\tpsta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr);\n\n\tif (psta) {\n\t\tu8 updated = _FALSE;\n\t\t\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\tif (rtw_is_list_empty(&psta->asoc_list) == _FALSE) {\n\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\tupdated = ap_free_sta(adapter, psta, _TRUE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE);\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\tassociated_clients_update(adapter, updated, STA_INFO_UPDATE_ALL);\n\t}\n\n\t\n_func_exit_;\t\n\n}\n#endif /* CONFIG_IEEE80211W */\n\nvoid rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf)\n{\n\t_irqL irqL,irqL2;\n\tint mac_id = (-1);\n\tstruct sta_info *psta;\n\tstruct wlan_network* pwlan = NULL;\n\tWLAN_BSSID_EX    *pdev_network=NULL;\n\tu8* pibss = NULL;\n\tstruct\tmlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\tstruct \tstadel_event *pstadel\t= (struct stadel_event*)pbuf;\n   \tstruct\tsta_priv *pstapriv = &adapter->stapriv;\n\tstruct wlan_network *tgt_network = &(pmlmepriv->cur_network);\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n_func_enter_;\t\n\t\n\tpsta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr);\n\tif(psta)\n\t\tmac_id = psta->mac_id;\n\telse\n\t\tmac_id = pstadel->mac_id;\n\n\tDBG_871X(\"%s(mac_id=%d)=\" MAC_FMT \"\\n\", __func__, mac_id, MAC_ARG(pstadel->macaddr));\n\n\tif(mac_id>=0){\n\t\tu16 media_status;\n\t\tmedia_status = (mac_id<<8)|0; //  MACID|OPMODE:0 means disconnect\n\t\t//for STA,AP,ADHOC mode, report disconnect stauts to FW\n\t\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status);\n\t}\t\n\n\t//if(check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t#ifdef COMPAT_KERNEL_RELEASE\n\n\t\t#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\t\trtw_cfg80211_indicate_sta_disassoc(adapter, pstadel->macaddr, *(u16*)pstadel->rsvd);\n\t\t#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n#endif //CONFIG_IOCTL_CFG80211\n\n\t\treturn;\n\t}\n\n\n\tmlmeext_sta_del_event_callback(adapter);\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL2);\n\n\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) )\n\t{\n\t\tu16 reason = *((unsigned short *)(pstadel->rsvd));\n\t\tbool roam = _FALSE;\n\t\tstruct wlan_network *roam_target = NULL;\n\n\t\t#ifdef CONFIG_LAYER2_ROAMING\n\t\tif(adapter->registrypriv.wifi_spec==1) {\n\t\t\troam = _FALSE;\n\t\t} else if (reason == WLAN_REASON_EXPIRATION_CHK && rtw_chk_roam_flags(adapter, RTW_ROAM_ON_EXPIRED)) {\n\t\t\troam = _TRUE;\n\t\t} else if (reason == WLAN_REASON_ACTIVE_ROAM && rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {\n\t\t\troam = _TRUE;\n\t\t\troam_target = pmlmepriv->roam_network;\n\t\t}\n#ifdef CONFIG_INTEL_WIDI\n\t\telse if (adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_CONNECTED) {\n\t\t\troam = _TRUE;\n\t\t}\n#endif // CONFIG_INTEL_WIDI\n\n\t\tif (roam == _TRUE) {\n\t\t\tif (rtw_to_roam(adapter) > 0)\n\t\t\t\trtw_dec_to_roam(adapter); /* this stadel_event is caused by roaming, decrease to_roam */\n\t\t\telse if (rtw_to_roam(adapter) == 0)\n\t\t\t\trtw_set_to_roam(adapter, adapter->registrypriv.max_roaming_times);\n\t\t} else {\n\t\t\trtw_set_to_roam(adapter, 0);\n\t\t}\n\t\t#endif /* CONFIG_LAYER2_ROAMING */\n\n\t\trtw_free_uc_swdec_pending_queue(adapter);\n\n\t\trtw_free_assoc_resources(adapter, 1);\n\t\trtw_indicate_disconnect(adapter);\n\t\trtw_free_mlme_priv_ie_data(pmlmepriv);\n\n\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t// remove the network entry in scanned_queue\n\t\tpwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);\t\n\t\tif (pwlan) {\t\t\t\n\t\t\tpwlan->fixed = _FALSE;\n\t\t\trtw_free_network_nolock(adapter, pwlan);\n\t\t}\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n#ifdef CONFIG_INTEL_WIDI\n\t\tif (!rtw_to_roam(adapter))\n\t\t\tprocess_intel_widi_disconnect(adapter, 1);\n#endif // CONFIG_INTEL_WIDI\n\n\t\t_rtw_roaming(adapter, roam_target);\n\t}\n\n\tif ( check_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE) || \n\t      check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))\n\t{\n\t\t\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\trtw_free_stainfo(adapter,  psta);\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t\t\n\t\tif(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo)\n\t\t{ \n\t\t\t//rtw_indicate_disconnect(adapter);//removed@20091105\n\t\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t//free old ibss network\n\t\t\t//pwlan = rtw_find_network(&pmlmepriv->scanned_queue, pstadel->macaddr);\n\t\t\tpwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);\n\t\t\tif(pwlan)\t\n\t\t\t{\n\t\t\t\tpwlan->fixed = _FALSE;\n\t\t\t\trtw_free_network_nolock(adapter, pwlan); \n\t\t\t}\n\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\t//re-create ibss\n\t\t\tpdev_network = &(adapter->registrypriv.dev_network);\t\t\t\n\t\t\tpibss = adapter->registrypriv.dev_network.MacAddress;\n\n\t\t\t_rtw_memcpy(pdev_network, &tgt_network->network, get_WLAN_BSSID_EX_sz(&tgt_network->network));\n\t\t\t\n\t\t\t_rtw_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));\n\t\t\t_rtw_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));\n\t\n\t\t\trtw_update_registrypriv_dev_network(adapter);\t\t\t\n\n\t\t\trtw_generate_random_ibss(pibss);\n\t\t\t\n\t\t\tif(check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))\n\t\t\t{\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\n\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_ADHOC_STATE);\n\t\t\t}\n\n\t\t\tif (rtw_create_ibss_cmd(adapter, 0) != _SUCCESS)\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (\"***Error=>stadel_event_callback: rtw_create_ibss_cmd status FAIL***\\n\"));\n\n\t\t}\n\t\t\n\t}\n\t\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL2);\n\t\n_func_exit_;\t\n\n}\n\n\nvoid rtw_cpwm_event_callback(PADAPTER padapter, u8 *pbuf)\n{\n#ifdef CONFIG_LPS_LCLK\n\tstruct reportpwrstate_parm *preportpwrstate;\n#endif\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"+rtw_cpwm_event_callback !!!\\n\"));\n#ifdef CONFIG_LPS_LCLK\n\tpreportpwrstate = (struct reportpwrstate_parm*)pbuf;\n\tpreportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80);\n\tcpwm_int_hdl(padapter, preportpwrstate);\n#endif\n\n_func_exit_;\n\n}\n\n\nvoid rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf)\n{\n_func_enter_;\n\n\tWMMOnAssocRsp(padapter);\n\n_func_exit_;\n\n}\n\n/*\n* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss\n* @adapter: pointer to _adapter structure\n*/\nvoid _rtw_join_timeout_handler (_adapter *adapter)\n{\n\t_irqL irqL;\n\tstruct\tmlme_priv *pmlmepriv = &adapter->mlmepriv;\n\n#if 0\n\tif (rtw_is_drv_stopped(adapter)) {\n\t\t_rtw_up_sema(&pmlmepriv->assoc_terminate);\n\t\treturn;\n\t}\n#endif\t\n\n_func_enter_;\t\t\n\n\n\tDBG_871X(\"%s, fw_state=%x\\n\", __FUNCTION__, get_fwstate(pmlmepriv));\n\t\n\tif (RTW_CANNOT_RUN(adapter))\n\t\treturn;\n\n\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t#ifdef CONFIG_LAYER2_ROAMING\n\tif (rtw_to_roam(adapter) > 0) { /* join timeout caused by roaming */\n\t\twhile(1) {\n\t\t\trtw_dec_to_roam(adapter);\n\t\t\tif (rtw_to_roam(adapter) != 0) { /* try another */\n\t\t\t\tint do_join_r;\n\t\t\t\tDBG_871X(\"%s try another roaming\\n\", __FUNCTION__);\n\t\t\t\tif( _SUCCESS!=(do_join_r=rtw_do_join(adapter)) ) {\n\t\t\t\t\tDBG_871X(\"%s roaming do_join return %d\\n\", __FUNCTION__ ,do_join_r);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n#ifdef CONFIG_INTEL_WIDI\n\t\t\t\tif(adapter->mlmepriv.widi_state == INTEL_WIDI_STATE_ROAMING)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memset(pmlmepriv->sa_ext, 0x00, L2SDTA_SERVICE_VE_LEN);\n\t\t\t\t\tintel_widi_wk_cmd(adapter, INTEL_WIDI_LISTEN_WK, NULL, 0);\n\t\t\t\t\tDBG_871X(\"change to widi listen\\n\");\n\t\t\t\t}\n#endif // CONFIG_INTEL_WIDI\n\t\t\t\tDBG_871X(\"%s We've try roaming but fail\\n\", __FUNCTION__);\n\t\t\t\trtw_indicate_disconnect(adapter);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t} else \n\t#endif\n\t{\n\t\trtw_indicate_disconnect(adapter);\n\t\tfree_scanqueue(pmlmepriv);//???\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t//indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED\n\t\trtw_cfg80211_indicate_disconnect(adapter);\n#endif //CONFIG_IOCTL_CFG80211\n\n \t}\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\n\n#ifdef CONFIG_DRVEXT_MODULE_WSC\t\n\tdrvext_assoc_fail_indicate(&adapter->drvextpriv);\t\n#endif\t\n\n\t\n_func_exit_;\n\n}\n\n/*\n* rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey\n* @adapter: pointer to _adapter structure\n*/\nvoid rtw_scan_timeout_handler (_adapter *adapter)\n{\t\n\t_irqL irqL;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tDBG_871X(FUNC_ADPT_FMT\" fw_state=%x\\n\", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv));\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\n\t_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);\n\t\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_surveydone_event_callback(adapter);\n#endif //CONFIG_IOCTL_CFG80211\n\t\n\trtw_indicate_scan_done(adapter, _TRUE);\n\n#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_IOCTL_CFG80211)\n\tif (adapter->pbuddy_adapter) {\n\t\t_adapter *buddy_adapter = adapter->pbuddy_adapter;\n\t\tstruct mlme_priv *buddy_mlme = &(buddy_adapter->mlmepriv);\n\t\tstruct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(buddy_adapter);\n\t\tbool indicate_buddy_scan = _FALSE;\n\n\t\t_enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\t\tif (buddy_wdev_priv->scan_request && buddy_mlme->scanning_via_buddy_intf == _TRUE) {\n\t\t\tbuddy_mlme->scanning_via_buddy_intf = _FALSE;\n\t\t\tclr_fwstate(buddy_mlme, _FW_UNDER_SURVEY);\n\t\t\tindicate_buddy_scan = _TRUE;\n\t\t}\n\t\t_exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\n\t\tif (indicate_buddy_scan == _TRUE) {\n\t\t\trtw_indicate_scan_done(buddy_adapter, _TRUE);\n\t\t}\n\t}\n#endif /* CONFIG_CONCURRENT_MODE */\n}\n\nvoid rtw_mlme_reset_auto_scan_int(_adapter *adapter)\n{\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n#ifdef CONFIG_P2P\n\tif(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {\n\t\tmlme->auto_scan_int_ms = 0; /* disabled */\n\t\tgoto exit;\n\t}\n#endif\t\n\tif(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP\n\t{\n\t\tmlme->auto_scan_int_ms = 0;\n\t}\n\telse if(adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == _TRUE) {\n\t\tmlme->auto_scan_int_ms = 60*1000;\n#ifdef CONFIG_LAYER2_ROAMING\n\t} else if(rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {\n\t\tif (check_fwstate(mlme, WIFI_STATION_STATE) && check_fwstate(mlme, _FW_LINKED))\n\t\t\tmlme->auto_scan_int_ms = mlme->roam_scan_int_ms;\n#endif\n\t} else {\n\t\tmlme->auto_scan_int_ms = 0; /* disabled */\n\t}\nexit:\n\treturn;\n}\n\nvoid rtw_drv_scan_by_self(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\tif (!padapter->registrypriv.wifi_spec) {\n\t\tif (check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)) == _TRUE) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" _FW_UNDER_SURVEY|_FW_UNDER_LINKING\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tgoto exit;\n\t\t}\n\t\t\t\n\t\tif (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" exit BusyTraffic\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) {\n\t\tif ((check_buddy_fwstate(padapter, (_FW_UNDER_SURVEY | _FW_UNDER_LINKING)) == _TRUE) ||\n\t\t\t(padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)) {\t\t\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\", but buddy_intf is under scanning or linking or BusyTraffic\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\tgoto exit;\n\t\t}\n\t}\n#endif\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n\trtw_set_802_11_bssid_list_scan(padapter, NULL, 0);\n\nexit:\n\treturn;\t\n}\n\nstatic void rtw_auto_scan_handler(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\trtw_mlme_reset_auto_scan_int(padapter);\n\n\tif (pmlmepriv->auto_scan_int_ms != 0\n\t\t&& rtw_get_passing_time_ms(pmlmepriv->scan_start_time) > pmlmepriv->auto_scan_int_ms) \n\t\trtw_drv_scan_by_self(padapter);\n\t\n}\n\nvoid rtw_dynamic_check_timer_handlder(_adapter *adapter)\n{\n#ifdef CONFIG_AP_MODE\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n#endif //CONFIG_AP_MODE\n\tstruct registry_priv *pregistrypriv = &adapter->registrypriv;\n#ifdef CONFIG_CONCURRENT_MODE\t\n\tPADAPTER pbuddy_adapter = adapter->pbuddy_adapter;\n#endif\n\n\tif(!adapter)\n\t\treturn;\t\n\n\tif (!rtw_is_hw_init_completed(adapter))\n\t\treturn;\n\n\tif (RTW_CANNOT_RUN(adapter))\n\t\treturn;\n\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(pbuddy_adapter)\n\t{\n\t\tif(adapter->net_closed == _TRUE && pbuddy_adapter->net_closed == _TRUE)\n\t\t{\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\telse\n#endif //CONFIG_CONCURRENT_MODE\n\tif(adapter->net_closed == _TRUE)\n\t{\n\t\treturn;\n\t}\t\n\n#ifdef CONFIG_BT_COEXIST\n\tif (is_primary_adapter(adapter)) {\n\t\tif (GET_HAL_DATA(adapter)->EEPROMBluetoothCoexist == 1)\n\t\t\tDBG_871X(\"IsBtDisabled=%d, IsBtControlLps=%d\\n\" , rtw_btcoex_IsBtDisabled(adapter) , rtw_btcoex_IsBtControlLps(adapter));\n\t}\n#endif\n\n#ifdef CONFIG_LPS_LCLK_WD_TIMER /* to avoid leaving lps 32k frequently*/\n\tif ((adapter_to_pwrctl(adapter)->bFwCurrentInPSMode ==_TRUE )\n#ifdef CONFIG_BT_COEXIST\n\t\t&& (rtw_btcoex_IsBtControlLps(adapter) == _FALSE)\n#endif\t\t\n\t\t) \n\t{\n\t\tu8 bEnterPS;\t\n\t\t\n\t\tlinked_status_chk(adapter, 1);\t\n\t\t\t\n\t\tbEnterPS = traffic_status_watchdog(adapter, 1);\n\t\tif(bEnterPS)\n\t\t{\n\t\t\t//rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1);\n\t\t\trtw_hal_dm_watchdog_in_lps(adapter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//call rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1) in traffic_status_watchdog()\n\t\t}\n\t\t\t\n\t}\n\telse\n#endif //CONFIG_LPS_LCLK_WD_TIMER\t\n\t{\n\t\tif(is_primary_adapter(adapter))\n\t\t{\t\n\t\t\trtw_dynamic_chk_wk_cmd(adapter);\t\t\n\t\t}\t\n\t}\t\n\n\t/* auto site survey */\n\trtw_auto_scan_handler(adapter);\n\n#ifndef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n#ifdef CONFIG_AP_MODE\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\texpire_timeout_chk(adapter);\n\t}\t\n#endif\n#endif //!CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\n#ifdef CONFIG_BR_EXT\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\trcu_read_lock();\n#endif\t// (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) \n\tif( adapter->pnetdev->br_port \n#else\t// (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\tif( rcu_dereference(adapter->pnetdev->rx_handler_data)\n#endif\t// (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\t&& (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )\n\t{\n\t\t// expire NAT2.5 entry\n\t\tvoid nat25_db_expire(_adapter *priv);\n\t\tnat25_db_expire(adapter);\n\n\t\tif (adapter->pppoe_connection_in_progress > 0) {\n\t\t\tadapter->pppoe_connection_in_progress--;\n\t\t}\n\t\t\n\t\t// due to rtw_dynamic_check_timer_handlder() is called every 2 seconds\n\t\tif (adapter->pppoe_connection_in_progress > 0) {\n\t\t\tadapter->pppoe_connection_in_progress--;\n\t\t}\n\t}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\trcu_read_unlock();\n#endif\t// (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\n#endif\t// CONFIG_BR_EXT\n\t\n}\n\n\n#ifdef CONFIG_SET_SCAN_DENY_TIMER\ninline bool rtw_is_scan_deny(_adapter *adapter)\n{\n\tstruct mlme_priv *mlmepriv = &adapter->mlmepriv;\n\treturn (ATOMIC_READ(&mlmepriv->set_scan_deny) != 0) ? _TRUE : _FALSE;\n}\n\ninline void rtw_clear_scan_deny(_adapter *adapter)\n{\n\tstruct mlme_priv *mlmepriv = &adapter->mlmepriv;\n\tATOMIC_SET(&mlmepriv->set_scan_deny, 0);\n\tif (0)\n\t\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(adapter));\n}\n\nvoid rtw_set_scan_deny_timer_hdl(_adapter *adapter)\n{\n\trtw_clear_scan_deny(adapter);\n}\n\nvoid rtw_set_scan_deny(_adapter *adapter, u32 ms)\n{\n\tstruct mlme_priv *mlmepriv = &adapter->mlmepriv;\n#ifdef CONFIG_CONCURRENT_MODE\n\tstruct mlme_priv *b_mlmepriv;\n#endif\n\n\tif (0)\n\t\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(adapter));\n\tATOMIC_SET(&mlmepriv->set_scan_deny, 1);\n\t_set_timer(&mlmepriv->set_scan_deny_timer, ms);\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (!adapter->pbuddy_adapter)\n\t\treturn;\n\n\tif (0)\n\t\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(adapter->pbuddy_adapter));\n \tb_mlmepriv = &adapter->pbuddy_adapter->mlmepriv;\n\tATOMIC_SET(&b_mlmepriv->set_scan_deny, 1);\n\t_set_timer(&b_mlmepriv->set_scan_deny_timer, ms);\t\n#endif\n\t\n}\n#endif\n\n#ifdef CONFIG_LAYER2_ROAMING\n/*\n* Select a new roaming candidate from the original @param candidate and @param competitor\n* @return _TRUE: candidate is updated\n* @return _FALSE: candidate is not updated\n*/\nstatic int rtw_check_roaming_candidate(struct mlme_priv *mlme\n\t, struct wlan_network **candidate, struct wlan_network *competitor)\n{\n\tint updated = _FALSE;\n\t_adapter *adapter = container_of(mlme, _adapter, mlmepriv);\n\n\tif(is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE)\n\t\tgoto exit;\n\n\tif(rtw_is_desired_network(adapter, competitor) == _FALSE)\n\t\tgoto exit;\n\n\tDBG_871X(\"roam candidate:%s %s(\"MAC_FMT\", ch%3u) rssi:%d, age:%5d\\n\",\n\t\t(competitor == mlme->cur_network_scanned)?\"*\":\" \" ,\n\t\tcompetitor->network.Ssid.Ssid,\n\t\tMAC_ARG(competitor->network.MacAddress),\n\t\tcompetitor->network.Configuration.DSConfig,\n\t\t(int)competitor->network.Rssi,\n\t\trtw_get_passing_time_ms(competitor->last_scanned)\n\t);\n\n\t/* got specific addr to roam */\n\tif (!is_zero_mac_addr(mlme->roam_tgt_addr)) {\n\t\tif(_rtw_memcmp(mlme->roam_tgt_addr, competitor->network.MacAddress, ETH_ALEN) == _TRUE)\n\t\t\tgoto update;\n\t\telse\n\t\t\tgoto exit;\n\t}\n\t#if 1\n\tif(rtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms)\n\t\tgoto exit;\n\n\tif (competitor->network.Rssi - mlme->cur_network_scanned->network.Rssi < mlme->roam_rssi_diff_th)\n\t\tgoto exit;\n\n\tif(*candidate != NULL && (*candidate)->network.Rssi>=competitor->network.Rssi)\n\t\tgoto exit;\n\t#else\n\tgoto exit;\n\t#endif\n\nupdate:\n\t*candidate = competitor;\n\tupdated = _TRUE;\n\nexit:\n\treturn updated;\n}\n\nint rtw_select_roaming_candidate(struct mlme_priv *mlme)\n{\n\t_irqL\tirqL;\n\tint ret = _FAIL;\n\t_list\t*phead;\n\t_adapter *adapter;\t\n\t_queue\t*queue\t= &(mlme->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tstruct\twlan_network\t*candidate = NULL;\n\tu8 \t\tbSupportAntDiv = _FALSE;\n\n_func_enter_;\n\n\tif (mlme->cur_network_scanned == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\t_enter_critical_bh(&(mlme->scanned_queue.lock), &irqL);\n\tphead = get_list_head(queue);\t\t\n\tadapter = (_adapter *)mlme->nic_hdl;\n\n\tmlme->pscanned = get_next(phead);\n\n\twhile (!rtw_end_of_queue_search(phead, mlme->pscanned)) {\n\n\t\tpnetwork = LIST_CONTAINOR(mlme->pscanned, struct wlan_network, list);\n\t\tif(pnetwork==NULL){\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s return _FAIL:(pnetwork==NULL)\\n\", __FUNCTION__));\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tmlme->pscanned = get_next(mlme->pscanned);\n\n\t\tif (0)\n\t\t\tDBG_871X(\"%s(\"MAC_FMT\", ch%u) rssi:%d\\n\"\n\t\t\t\t, pnetwork->network.Ssid.Ssid\n\t\t\t\t, MAC_ARG(pnetwork->network.MacAddress)\n\t\t\t\t, pnetwork->network.Configuration.DSConfig\n\t\t\t\t, (int)pnetwork->network.Rssi);\n\n\t\trtw_check_roaming_candidate(mlme, &candidate, pnetwork);\n \n \t}\n\n\tif(candidate == NULL) {\n\t\tDBG_871X(\"%s: return _FAIL(candidate == NULL)\\n\", __FUNCTION__);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t} else {\n\t\tDBG_871X(\"%s: candidate: %s(\"MAC_FMT\", ch:%u)\\n\", __FUNCTION__,\n\t\t\tcandidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress),\n\t\t\tcandidate->network.Configuration.DSConfig);\n\n\t\tmlme->roam_network = candidate;\n\n\t\tif (_rtw_memcmp(candidate->network.MacAddress, mlme->roam_tgt_addr, ETH_ALEN) == _TRUE)\n\t\t\t_rtw_memset(mlme->roam_tgt_addr,0, ETH_ALEN);\n\t}\n\n\tret = _SUCCESS;\nexit:\n\t_exit_critical_bh(&(mlme->scanned_queue.lock), &irqL);\n\n\treturn ret;\n}\n#endif /* CONFIG_LAYER2_ROAMING */\n\n/*\n* Select a new join candidate from the original @param candidate and @param competitor\n* @return _TRUE: candidate is updated\n* @return _FALSE: candidate is not updated\n*/\nstatic int rtw_check_join_candidate(struct mlme_priv *mlme\n\t, struct wlan_network **candidate, struct wlan_network *competitor)\n{\n\tint updated = _FALSE;\n\t_adapter *adapter = container_of(mlme, _adapter, mlmepriv);\n\n\n\t//check bssid, if needed\n\tif(mlme->assoc_by_bssid==_TRUE) {\n\t\tif(_rtw_memcmp(competitor->network.MacAddress, mlme->assoc_bssid, ETH_ALEN) ==_FALSE)\n\t\t\tgoto exit;\n\t}\n\n\t//check ssid, if needed\n\tif(mlme->assoc_ssid.Ssid[0] && mlme->assoc_ssid.SsidLength) {\n\t\tif(\tcompetitor->network.Ssid.SsidLength != mlme->assoc_ssid.SsidLength\n\t\t\t|| _rtw_memcmp(competitor->network.Ssid.Ssid, mlme->assoc_ssid.Ssid, mlme->assoc_ssid.SsidLength) == _FALSE\n\t\t)\n\t\t\tgoto exit;\n\t}\n\n\tif(rtw_is_desired_network(adapter, competitor)  == _FALSE)\n\t\tgoto exit;\n\n#ifdef  CONFIG_LAYER2_ROAMING\n\tif(rtw_to_roam(adapter) > 0) {\n\t\tif(\trtw_get_passing_time_ms((u32)competitor->last_scanned) >= mlme->roam_scanr_exp_ms\n\t\t\t|| is_same_ess(&competitor->network, &mlme->cur_network.network) == _FALSE\n\t\t)\n\t\t\tgoto exit;\n\t}\n#endif\n\t\n\tif(*candidate == NULL ||(*candidate)->network.Rssi<competitor->network.Rssi )\n\t{\n\t\t*candidate = competitor;\n\t\tupdated = _TRUE;\n\t}\n\n\tif(updated){\n\t\tDBG_871X(\"[by_bssid:%u][assoc_ssid:%s][to_roam:%u] \"\n\t\t\t\"new candidate: %s(\"MAC_FMT\", ch%u) rssi:%d\\n\",\n\t\t\tmlme->assoc_by_bssid,\n\t\t\tmlme->assoc_ssid.Ssid,\n\t\t\trtw_to_roam(adapter),\n\t\t\t(*candidate)->network.Ssid.Ssid,\n\t\t\tMAC_ARG((*candidate)->network.MacAddress),\n\t\t\t(*candidate)->network.Configuration.DSConfig,\n\t\t\t(int)(*candidate)->network.Rssi\n\t\t);\n\t}\n\nexit:\n\treturn updated;\n}\n\n/*\nCalling context:\nThe caller of the sub-routine will be in critical section...\n\nThe caller must hold the following spinlock\n\npmlmepriv->lock\n\n\n*/\n\nint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv )\n{\n\t_irqL\tirqL;\n\tint ret;\n\t_list\t*phead;\n\t_adapter *adapter;\t\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tstruct\twlan_network\t*candidate = NULL;\n\tu8 \t\tbSupportAntDiv = _FALSE;\n\n_func_enter_;\n\n\tadapter = (_adapter *)pmlmepriv->nic_hdl;\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\t#ifdef CONFIG_LAYER2_ROAMING\n\tif (pmlmepriv->roam_network) {\n\t\tcandidate = pmlmepriv->roam_network;\n\t\tpmlmepriv->roam_network = NULL;\n\t\tgoto candidate_exist;\n\t}\n\t#endif\n\n\tphead = get_list_head(queue);\n\tpmlmepriv->pscanned = get_next(phead);\n\n\twhile (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) {\n\n\t\tpnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);\n\t\tif(pnetwork==NULL){\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"%s return _FAIL:(pnetwork==NULL)\\n\", __FUNCTION__));\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpmlmepriv->pscanned = get_next(pmlmepriv->pscanned);\n\n\t\tif (0)\n\t\t\tDBG_871X(\"%s(\"MAC_FMT\", ch%u) rssi:%d\\n\"\n\t\t\t\t, pnetwork->network.Ssid.Ssid\n\t\t\t\t, MAC_ARG(pnetwork->network.MacAddress)\n\t\t\t\t, pnetwork->network.Configuration.DSConfig\n\t\t\t\t, (int)pnetwork->network.Rssi);\n\n\t\trtw_check_join_candidate(pmlmepriv, &candidate, pnetwork);\n \n \t}\n\n\tif(candidate == NULL) {\n\t\tDBG_871X(\"%s: return _FAIL(candidate == NULL)\\n\", __FUNCTION__);\n#ifdef CONFIG_WOWLAN\n\t\t_clr_fwstate_(pmlmepriv, _FW_LINKED|_FW_UNDER_LINKING);\n#endif\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t} else {\n\t\tDBG_871X(\"%s: candidate: %s(\"MAC_FMT\", ch:%u)\\n\", __FUNCTION__,\n\t\t\tcandidate->network.Ssid.Ssid, MAC_ARG(candidate->network.MacAddress),\n\t\t\tcandidate->network.Configuration.DSConfig);\n\t\tgoto candidate_exist;\n\t}\n\t\ncandidate_exist:\n\n\t// check for situation of  _FW_LINKED \n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t{\n\t\tDBG_871X(\"%s: _FW_LINKED while ask_for_joinbss!!!\\n\", __FUNCTION__);\n\n\t\t#if 0 // for WPA/WPA2 authentication, wpa_supplicant will expect authentication from AP, it is needed to reconnect AP...\n\t\tif(is_same_network(&pmlmepriv->cur_network.network, &candidate->network))\n\t\t{\n\t\t\tDBG_871X(\"%s: _FW_LINKED and is same network, it needn't join again\\n\", __FUNCTION__);\n\n\t\t\trtw_indicate_connect(adapter);//rtw_indicate_connect again\n\t\t\t\t\n\t\t\tret = 2;\n\t\t\tgoto exit;\n\t\t}\n\t\telse\n\t\t#endif\n\t\t{\n\t\t\trtw_disassoc_cmd(adapter, 0, _TRUE);\n\t\t\trtw_indicate_disconnect(adapter);\n\t\t\trtw_free_assoc_resources(adapter, 0);\n\t\t}\n\t}\n\t\n\t#ifdef CONFIG_ANTENNA_DIVERSITY\n\trtw_hal_get_def_var(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv));\n\tif(_TRUE == bSupportAntDiv)\t\n\t{\n\t\tu8 CurrentAntenna;\n\t\trtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna));\t\t\t\n\t\tDBG_871X(\"#### Opt_Ant_(%s) , cur_Ant(%s)\\n\",\n\t\t\t(2==candidate->network.PhyInfo.Optimum_antenna)?\"A\":\"B\",\n\t\t\t(2==CurrentAntenna)?\"A\":\"B\"\n\t\t);\n\t}\n\t#endif\n\tset_fwstate(pmlmepriv, _FW_UNDER_LINKING);\n\tret = rtw_joinbss_cmd(adapter, candidate);\n\t\nexit:\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n_func_exit_;\n\n\treturn ret;\n}\n\nsint rtw_set_auth(_adapter * adapter,struct security_priv *psecuritypriv)\n{\n\tstruct\tcmd_obj* pcmd;\n\tstruct \tsetauth_parm *psetauthparm;\n\tstruct\tcmd_priv\t*pcmdpriv=&(adapter->cmdpriv);\n\tsint\t\tres=_SUCCESS;\n\t\n_func_enter_;\t\n\n\tpcmd = (struct\tcmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\tif(pcmd==NULL){\n\t\tres= _FAIL;  //try again\n\t\tgoto exit;\n\t}\n\t\n\tpsetauthparm=(struct setauth_parm*)rtw_zmalloc(sizeof(struct setauth_parm));\n\tif(psetauthparm==NULL){\n\t\trtw_mfree((unsigned char *)pcmd, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm));\n\tpsetauthparm->mode=(unsigned char)psecuritypriv->dot11AuthAlgrthm;\n\t\n\tpcmd->cmdcode = _SetAuth_CMD_;\n\tpcmd->parmbuf = (unsigned char *)psetauthparm;   \n\tpcmd->cmdsz =  (sizeof(struct setauth_parm));  \n\tpcmd->rsp = NULL;\n\tpcmd->rspsz = 0;\n\n\n\t_rtw_init_listhead(&pcmd->list);\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"after enqueue set_auth_cmd, auth_mode=%x\\n\", psecuritypriv->dot11AuthAlgrthm));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, pcmd);\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n\n}\n\n\nsint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue)\n{\n\tu8\tkeylen;\n\tstruct cmd_obj\t\t*pcmd;\n\tstruct setkey_parm\t*psetkeyparm;\n\tstruct cmd_priv\t\t*pcmdpriv = &(adapter->cmdpriv);\n\tstruct mlme_priv\t\t*pmlmepriv = &(adapter->mlmepriv);\n\tsint\tres=_SUCCESS;\n\t\n_func_enter_;\n\n\tpsetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));\n\tif(psetkeyparm==NULL){\t\t\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t_rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));\n\n\tif(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){\t\t\n\t\tpsetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy;\t\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n rtw_set_key: psetkeyparm->algorithm=(unsigned char)psecuritypriv->dot118021XGrpPrivacy=%d \\n\", psetkeyparm->algorithm));\n\t}\t\n\telse{\n\t\tpsetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm;\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n rtw_set_key: psetkeyparm->algorithm=(u8)psecuritypriv->dot11PrivacyAlgrthm=%d \\n\", psetkeyparm->algorithm));\n\n\t}\n\tpsetkeyparm->keyid = (u8)keyid;//0~3\n\tpsetkeyparm->set_tx = set_tx;\n\tif (is_wep_enc(psetkeyparm->algorithm))\n\t\tadapter->securitypriv.key_mask |= BIT(psetkeyparm->keyid);\n\n\tDBG_871X(\"==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\\n\",psetkeyparm->algorithm,psetkeyparm->keyid, adapter->securitypriv.key_mask);\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \\n\",psetkeyparm->algorithm, keyid));\n\n\tswitch(psetkeyparm->algorithm){\n\t\t\t\n\t\tcase _WEP40_:\n\t\t\tkeylen=5;\n\t\t\t_rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);\n\t\t\tbreak;\n\t\tcase _WEP104_:\n\t\t\tkeylen=13;\n\t\t\t_rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\tkeylen=16;\t\t\t\n\t\t\t_rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen);\n\t\t\tpsetkeyparm->grpkey=1;\n\t\t\tbreak;\n\t\tcase _AES_:\n\t\t\tkeylen=16;\t\t\t\n\t\t\t_rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen);\n\t\t\tpsetkeyparm->grpkey=1;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"\\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\\n\",psecuritypriv->dot11PrivacyAlgrthm));\n\t\t\tres= _FAIL;\n\t\t\trtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm));\n\t\t\tgoto exit;\n\t}\n\t\t\n\t\t\n\tif(enqueue){\n\t\tpcmd = (struct\tcmd_obj*)rtw_zmalloc(sizeof(struct\tcmd_obj));\n\t\tif(pcmd==NULL){\n\t\t\trtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm));\n\t\t\tres= _FAIL;  //try again\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpcmd->cmdcode = _SetKey_CMD_;\n\t\tpcmd->parmbuf = (u8 *)psetkeyparm;   \n\t\tpcmd->cmdsz =  (sizeof(struct setkey_parm));  \n\t\tpcmd->rsp = NULL;\n\t\tpcmd->rspsz = 0;\n\n\t\t_rtw_init_listhead(&pcmd->list);\n\n\t\t//_rtw_init_sema(&(pcmd->cmd_sem), 0);\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, pcmd);\n\t}\n\telse{\n\t\tsetkey_hdl(adapter, (u8 *)psetkeyparm);\n\t\trtw_mfree((u8 *) psetkeyparm, sizeof(struct setkey_parm));\n\t}\nexit:\n_func_exit_;\n\treturn res;\n\n}\n\n\n//adjust IEs for rtw_joinbss_cmd in WMM\nint rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len)\n{\n\tunsigned\tint ielength=0;\n\tunsigned int i, j;\n\n\ti = 12; //after the fixed IE\n\twhile(i<in_len)\n\t{\n\t\tielength = initial_out_len;\t\t\n\t\t\n\t\tif(in_ie[i] == 0xDD && in_ie[i+2] == 0x00 && in_ie[i+3] == 0x50  && in_ie[i+4] == 0xF2 && in_ie[i+5] == 0x02 && i+5 < in_len) //WMM element ID and OUI\n\t\t{\n\n\t\t\t//Append WMM IE to the last index of out_ie\n\t\t\t/*\n\t\t\tfor(j=i; j< i+(in_ie[i+1]+2); j++)\n\t\t\t{\n\t\t\t\tout_ie[ielength] = in_ie[j];\t\t\t\t\n\t\t\t\tielength++;\n\t\t\t}\n\t\t\tout_ie[initial_out_len+8] = 0x00; //force the QoS Info Field to be zero\n\t                */\n                       \n                        for ( j = i; j < i + 9; j++ )\n                        {\n                            out_ie[ ielength] = in_ie[ j ];\n                            ielength++;\n                        } \n                        out_ie[ initial_out_len + 1 ] = 0x07;\n                        out_ie[ initial_out_len + 6 ] = 0x00;\n                        out_ie[ initial_out_len + 8 ] = 0x00;\n\t\n\t\t\tbreak;\n\t\t}\n\n\t\ti+=(in_ie[i+1]+2); // to the next IE element\n\t}\n\t\n\treturn ielength;\n\t\n}\n\n\n//\n// Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.)\n// Added by Annie, 2006-05-07.\n//\n// Search by BSSID,\n// Return Value:\n//\t\t-1 \t\t:if there is no pre-auth key in the  table\n//\t\t>=0\t\t:if there is pre-auth key, and   return the entry id\n//\n//\n\nstatic int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid)\n{\n\tstruct security_priv *psecuritypriv=&Adapter->securitypriv;\n\tint i=0;\n\n\tdo\n\t{\n\t\tif( ( psecuritypriv->PMKIDList[i].bUsed ) && \n                    (  _rtw_memcmp( psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN ) == _TRUE ) )\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\t\n\t\t\ti++;\n\t\t\t//continue;\n\t\t}\n\t\t\n\t}while(i<NUM_PMKID_CACHE);\n\n\tif( i == NUM_PMKID_CACHE )\n\t{ \n\t\ti = -1;// Could not find.\n\t}\n\telse\n\t{ \n\t\t// There is one Pre-Authentication Key for the specific BSSID.\n\t}\n\n\treturn (i);\n\t\n}\n\n//\n// Check the RSN IE length\n// If the RSN IE length <= 20, the RSN IE didn't include the PMKID information\n// 0-11th element in the array are the fixed IE\n// 12th element in the array is the IE\n// 13th element in the array is the IE length  \n//\n\nstatic int rtw_append_pmkid(_adapter *adapter,int iEntry, u8 *ie, uint ie_len)\n{\n\tstruct security_priv *sec=&adapter->securitypriv;\n\n\tif (ie[13] > 20) {\n\t\tint i;\n\t\tu16 pmkid_cnt = RTW_GET_LE16(ie+14+20);\n\t\tif (pmkid_cnt == 1 && _rtw_memcmp(ie+14+20+2, &sec->PMKIDList[iEntry].PMKID, 16)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" has carried the same PMKID:\"KEY_FMT\"\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" remove original PMKID, count:%u\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), pmkid_cnt);\n\n\t\tfor (i=0;i<pmkid_cnt;i++)\n\t\t\tDBG_871X(\"    \"KEY_FMT\"\\n\", KEY_ARG(ie+14+20+2+i*16));\n\n\t\tie_len -= 2+pmkid_cnt*16;\n\t\tie[13] = 20;\n\t}\n\n\tif (ie[13] <= 20) {\t\n\t\t/* The RSN IE didn't include the PMK ID, append the PMK information */\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" append PMKID:\"KEY_FMT\"\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));\n\n\t\tRTW_PUT_LE16(&ie[ie_len], 1);\n\t\tie_len += 2;\n\n\t\t_rtw_memcpy(&ie[ie_len], &sec->PMKIDList[iEntry].PMKID, 16);\n\t\tie_len += 16;\n\n\t\tie[13] += 18;//PMKID length = 2+16\n\t}\n\nexit:\n\treturn (ie_len);\n}\n\nstatic int rtw_remove_pmkid(_adapter *adapter, u8 *ie, uint ie_len)\n{\n\tstruct security_priv *sec=&adapter->securitypriv;\n\tint i;\n\tu16 pmkid_cnt = RTW_GET_LE16(ie+14+20);\n\n\tif (ie[13] <= 20)\n\t\tgoto exit;\n\n\tDBG_871X(FUNC_ADPT_FMT\" remove original PMKID, count:%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), pmkid_cnt);\n\n\tfor (i=0;i<pmkid_cnt;i++)\n\t\tDBG_871X(\"    \"KEY_FMT\"\\n\", KEY_ARG(ie+14+20+2+i*16));\n\n\tie_len -= 2+pmkid_cnt*16;\n\tie[13] = 20;\n\nexit:\n\treturn (ie_len);\n}\n\nsint rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie, u8 *out_ie, uint in_len)\n{\n\tu8 authmode=0x0, securitytype, match;\n\tu8 sec_ie[255], uncst_oui[4], bkup_ie[255];\n\tu8 wpa_oui[4]={0x0, 0x50, 0xf2, 0x01};\n\tuint \tielength, cnt, remove_cnt;\n\tint iEntry;\n\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct security_priv *psecuritypriv=&adapter->securitypriv;\n\tuint \tndisauthmode=psecuritypriv->ndisauthtype;\n\tuint ndissecuritytype = psecuritypriv->ndisencryptstatus;\n\t\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,\n\t\t (\"+rtw_restruct_sec_ie: ndisauthmode=%d ndissecuritytype=%d\\n\",\n\t\t  ndisauthmode, ndissecuritytype));\n\t\n\t//copy fixed ie only\n\t_rtw_memcpy(out_ie, in_ie,12);\n\tielength=12;\n\tif((ndisauthmode==Ndis802_11AuthModeWPA)||(ndisauthmode==Ndis802_11AuthModeWPAPSK))\n\t\t\tauthmode=_WPA_IE_ID_;\n\tif((ndisauthmode==Ndis802_11AuthModeWPA2)||(ndisauthmode==Ndis802_11AuthModeWPA2PSK))\n\t\t\tauthmode=_WPA2_IE_ID_;\n\n\tif(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))\n\t{\n\t\t_rtw_memcpy(out_ie+ielength, psecuritypriv->wps_ie, psecuritypriv->wps_ie_len);\n\t\t\n\t\tielength += psecuritypriv->wps_ie_len;\n\t}\n\telse if((authmode==_WPA_IE_ID_)||(authmode==_WPA2_IE_ID_))\n\t{\t\t\n\t\t//copy RSN or SSN\t\t\n\t\t_rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2);\n\t\t/* debug for CONFIG_IEEE80211W\n\t\t{\n\t\t\tint jj;\n\t\t\tprintk(\"supplicant_ie_length=%d &&&&&&&&&&&&&&&&&&&\\n\", psecuritypriv->supplicant_ie[1]+2);\n\t\t\tfor(jj=0; jj < psecuritypriv->supplicant_ie[1]+2; jj++)\n\t\t\t\tprintk(\" %02x \", psecuritypriv->supplicant_ie[jj]);\n\t\t\tprintk(\"\\n\");\n\t\t}*/\n\t\tielength+=psecuritypriv->supplicant_ie[1]+2;\n\t\trtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie);\n\t\n#ifdef CONFIG_DRVEXT_MODULE\n\t\tdrvext_report_sec_ie(&adapter->drvextpriv, authmode, sec_ie);\t\n#endif\n\t}\n\n\tiEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);\n\tif(iEntry<0)\n\t{\n\t\tif(authmode == _WPA2_IE_ID_)\n\t\t\tielength = rtw_remove_pmkid(adapter, out_ie, ielength);\n\t}\n\telse\n\t{\n\t\tif(authmode == _WPA2_IE_ID_)\n\t\t\tielength=rtw_append_pmkid(adapter, iEntry, out_ie, ielength);\n\t}\n\n_func_exit_;\n\t\n\treturn ielength;\t\n}\n\nvoid rtw_init_registrypriv_dev_network(\t_adapter* adapter)\n{\n\tstruct registry_priv* pregistrypriv = &adapter->registrypriv;\n\tWLAN_BSSID_EX    *pdev_network = &pregistrypriv->dev_network;\n\tu8 *myhwaddr = adapter_mac_addr(adapter);\n\t\n_func_enter_;\n\n\t_rtw_memcpy(pdev_network->MacAddress, myhwaddr, ETH_ALEN);\n\n\t_rtw_memcpy(&pdev_network->Ssid, &pregistrypriv->ssid, sizeof(NDIS_802_11_SSID));\n\t\n\tpdev_network->Configuration.Length=sizeof(NDIS_802_11_CONFIGURATION);\n\tpdev_network->Configuration.BeaconPeriod = 100;\t\n\tpdev_network->Configuration.FHConfig.Length = 0;\n\tpdev_network->Configuration.FHConfig.HopPattern = 0;\n\tpdev_network->Configuration.FHConfig.HopSet = 0;\n\tpdev_network->Configuration.FHConfig.DwellTime = 0;\n\t\n\t\n_func_exit_;\t\n\t\n}\n\nvoid rtw_update_registrypriv_dev_network(_adapter* adapter) \n{\n\tint sz=0;\n\tstruct registry_priv* pregistrypriv = &adapter->registrypriv;\t\n\tWLAN_BSSID_EX    *pdev_network = &pregistrypriv->dev_network;\n\tstruct\tsecurity_priv*\tpsecuritypriv = &adapter->securitypriv;\n\tstruct\twlan_network\t*cur_network = &adapter->mlmepriv.cur_network;\n\t//struct\txmit_priv\t*pxmitpriv = &adapter->xmitpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\n_func_enter_;\n\n#if 0\n\tpxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;\n\tpxmitpriv->vcs = pregistrypriv->vcs_type;\n\tpxmitpriv->vcs_type = pregistrypriv->vcs_type;\n\t//pxmitpriv->rts_thresh = pregistrypriv->rts_thresh;\n\tpxmitpriv->frag_len = pregistrypriv->frag_thresh;\n\t\n\tadapter->qospriv.qos_option = pregistrypriv->wmm_enable;\n#endif\t\n\n\tpdev_network->Privacy = (psecuritypriv->dot11PrivacyAlgrthm > 0 ? 1 : 0) ; // adhoc no 802.1x\n\n\tpdev_network->Rssi = 0;\n\n\tswitch(pregistrypriv->wireless_mode)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\tpdev_network->NetworkTypeInUse = (Ndis802_11DS);\n\t\t\tbreak;\t\n\t\tcase WIRELESS_11G:\n\t\tcase WIRELESS_11BG:\n\t\tcase WIRELESS_11_24N:\n\t\tcase WIRELESS_11G_24N:\n\t\tcase WIRELESS_11BG_24N:\n\t\t\tpdev_network->NetworkTypeInUse = (Ndis802_11OFDM24);\n\t\t\tbreak;\n\t\tcase WIRELESS_11A:\n\t\tcase WIRELESS_11A_5N:\n\t\t\tpdev_network->NetworkTypeInUse = (Ndis802_11OFDM5);\n\t\t\tbreak;\n\t\tcase WIRELESS_11ABGN:\n\t\t\tif(pregistrypriv->channel > 14)\n\t\t\t\tpdev_network->NetworkTypeInUse = (Ndis802_11OFDM5);\n\t\t\telse\n\t\t\t\tpdev_network->NetworkTypeInUse = (Ndis802_11OFDM24);\n\t\t\tbreak;\n\t\tdefault :\n\t\t\t// TODO\n\t\t\tbreak;\n\t}\n\t\n\tpdev_network->Configuration.DSConfig = (pregistrypriv->channel);\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"pregistrypriv->channel=%d, pdev_network->Configuration.DSConfig=0x%x\\n\", pregistrypriv->channel, pdev_network->Configuration.DSConfig));\t\n\n\tif (cur_network->network.InfrastructureMode == Ndis802_11IBSS) {\n\t\tpdev_network->Configuration.ATIMWindow = (0);\n\n\t\tif (pmlmeext->cur_channel != 0)\n\t\t\tpdev_network->Configuration.DSConfig = pmlmeext->cur_channel;\n\t\telse \n\t\t\tpdev_network->Configuration.DSConfig = 1;\n\t}\n\n\tpdev_network->InfrastructureMode = (cur_network->network.InfrastructureMode);\n\n\t// 1. Supported rates\n\t// 2. IE\n\n\t//rtw_set_supported_rate(pdev_network->SupportedRates, pregistrypriv->wireless_mode) ; // will be called in rtw_generate_ie\n\tsz = rtw_generate_ie(pregistrypriv);\n\n\tpdev_network->IELength = sz;\n\n\tpdev_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX  *)pdev_network);\n\n\t//notes: translate IELength & Length after assign the Length to cmdsz in createbss_cmd();\n\t//pdev_network->IELength = cpu_to_le32(sz);\n\t\t\n_func_exit_;\t\n\n}\n\nvoid rtw_get_encrypt_decrypt_from_registrypriv(_adapter* adapter)\n{\n_func_enter_;\n\n\n_func_exit_;\t\n\t\n}\n\n//the fucntion is at passive_level \nvoid rtw_joinbss_reset(_adapter *padapter)\n{\n\tu8\tthreshold;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\t//todo: if you want to do something io/reg/hw setting before join_bss, please add code here\n\t\n#ifdef CONFIG_80211N_HT\t\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\t\n\n\tpmlmepriv->num_FortyMHzIntolerant = 0;\n\n\tpmlmepriv->num_sta_no_ht = 0;\n\n\tphtpriv->ampdu_enable = _FALSE;//reset to disabled\n\n#if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI)\n\t// TH=1 => means that invalidate usb rx aggregation\n\t// TH=0 => means that validate usb rx aggregation, use init value.\n\tif(phtpriv->ht_option)\n\t{\n\t\tif(padapter->registrypriv.wifi_spec==1)\t\t\n\t\t\tthreshold = 1;\n\t\telse\n\t\t\tthreshold = 0;\t\t\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));\n\t}\n\telse\n\t{\n\t\tthreshold = 1;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));\n\t}\n#endif//#if defined( CONFIG_USB_HCI) || defined (CONFIG_SDIO_HCI)\n\n#endif//#ifdef CONFIG_80211N_HT\n\n}\n\n\n#ifdef CONFIG_80211N_HT\nvoid\trtw_ht_use_default_setting(_adapter *padapter)\n{\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tBOOLEAN\t\tbHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE;\n\tBOOLEAN\t\tbHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE;\n\n\tif (pregistrypriv->wifi_spec)\n\t\tphtpriv->bss_coexist = 1;\n\telse\n\t\tphtpriv->bss_coexist = 0;\n\n\tphtpriv->sgi_40m = TEST_FLAG(pregistrypriv->short_gi, BIT1) ? _TRUE : _FALSE;\n\tphtpriv->sgi_20m = TEST_FLAG(pregistrypriv->short_gi, BIT0) ? _TRUE : _FALSE;\n\n\t// LDPC support\n\trtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport);\n\tCLEAR_FLAGS(phtpriv->ldpc_cap);\n\tif(bHwLDPCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->ldpc_cap, BIT4))\n\t\t\tSET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX);\n\t}\n\trtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport);\n\tif(bHwLDPCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->ldpc_cap, BIT5))\n\t\t\tSET_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX);\n\t}\n\tif (phtpriv->ldpc_cap)\n\t\tDBG_871X(\"[HT] HAL Support LDPC = 0x%02X\\n\", phtpriv->ldpc_cap);\n\n\t// STBC\n\trtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport);\n\tCLEAR_FLAGS(phtpriv->stbc_cap);\n\tif(bHwSTBCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->stbc_cap, BIT5))\n\t\t\tSET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX);\n\t}\n\trtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport);\n\tif(bHwSTBCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->stbc_cap, BIT4))\n\t\t\tSET_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX);\n\t}\n\tif (phtpriv->stbc_cap)\n\t\tDBG_871X(\"[HT] HAL Support STBC = 0x%02X\\n\", phtpriv->stbc_cap);\n\n\t// Beamforming setting\n\trtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer);\n\trtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee);\n\tCLEAR_FLAGS(phtpriv->beamform_cap);\n\tif(TEST_FLAG(pregistrypriv->beamform_cap, BIT4) && bHwSupportBeamformer)\n\t{\n\t\tSET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\n\t\tDBG_871X(\"[HT] HAL Support Beamformer\\n\");\n\t}\n\tif(TEST_FLAG(pregistrypriv->beamform_cap, BIT5) && bHwSupportBeamformee)\n\t{\n\t\tSET_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\n\t\tDBG_871X(\"[HT] HAL Support Beamformee\\n\");\n\t}\n}\nvoid rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len)\n{\n\tunsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};\n\tint out_len;\n\tu8 *pframe;\n\n\tif(padapter->mlmepriv.qospriv.qos_option == 0)\n\t{\n\t\tout_len = *pout_len;\n\t\tpframe = rtw_set_ie(out_ie+out_len, _VENDOR_SPECIFIC_IE_, \n\t\t\t\t\t\t\t_WMM_IE_Length_, WMM_IE, pout_len);\n\n\t\tpadapter->mlmepriv.qospriv.qos_option = 1;\n\t}\n}\n\n/* the fucntion is >= passive_level */\nunsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel)\n{\n\tu32 ielen, out_len;\n\tHT_CAP_AMPDU_FACTOR max_rx_ampdu_factor;\n\tHT_CAP_AMPDU_DENSITY best_ampdu_density;\n\tunsigned char *p, *pframe;\n\tstruct rtw_ieee80211_ht_cap ht_capie;\n\tu8\tcbw40_enable = 0, rf_type = 0, operation_bw = 0, rf_num = 0, rx_stbc_nss = 0;\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tphtpriv->ht_option = _FALSE;\n\n\tout_len = *pout_len;\n\n\t_rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap));\n\n\tht_capie.cap_info = IEEE80211_HT_CAP_DSSSCCK40;\n\n\tif (phtpriv->sgi_20m)\n\t\tht_capie.cap_info |= IEEE80211_HT_CAP_SGI_20;\n\n\t/* Get HT BW */\n\tif (in_ie == NULL) {\n\t\t/* TDLS: TODO 20/40 issue */\n\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n\t\t\toperation_bw = padapter->mlmeextpriv.cur_bwmode;\n\t\t\tif (operation_bw > CHANNEL_WIDTH_40)\n\t\t\t\toperation_bw = CHANNEL_WIDTH_40;\n\t\t} else\n\t\t\t/* TDLS: TODO 40? */\n\t\t\toperation_bw = CHANNEL_WIDTH_40;\n\t} else {\n\t\tp = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len);\n\t\tif (p && (ielen == sizeof(struct ieee80211_ht_addt_info))) {\n\t\t\tstruct HT_info_element *pht_info = (struct HT_info_element *)(p+2);\n\t\t\tif (pht_info->infos[0] & BIT(2)) {\n\t\t\t\tswitch (pht_info->infos[0] & 0x3) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 3:\n\t\t\t\t\toperation_bw = CHANNEL_WIDTH_40;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\toperation_bw = CHANNEL_WIDTH_20;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toperation_bw = CHANNEL_WIDTH_20;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* to disable 40M Hz support while gd_bw_40MHz_en = 0 */\n\tif (hal_chk_bw_cap(padapter, BW_CAP_40M)) {\n\t\tif (channel > 14) {\n\t\t\tif (REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t} else {\n\t\t\tif (REGSTY_IS_BW_2G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t}\n\t}\n\n\tif ((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) {\n\t\tht_capie.cap_info |= IEEE80211_HT_CAP_SUP_WIDTH;\n\t\tif (phtpriv->sgi_40m)\n\t\t\tht_capie.cap_info |= IEEE80211_HT_CAP_SGI_40;\n\t}\n\n\t/* todo: disable SM power save mode */\n\tht_capie.cap_info |= IEEE80211_HT_CAP_SM_PS;\n\n\t/* RX LDPC */\n\tif (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) {\n\t\tht_capie.cap_info |= IEEE80211_HT_CAP_LDPC_CODING;\n\t\tDBG_871X(\"[HT] Declare supporting RX LDPC\\n\");\n\t}\n\n\t/* TX STBC */\n\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) {\n\t\tht_capie.cap_info |= IEEE80211_HT_CAP_TX_STBC;\n\t\tDBG_871X(\"[HT] Declare supporting TX STBC\\n\");\n\t}\n\n\t/* RX STBC */\n\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) {\n\t\tif((pregistrypriv->rx_stbc == 0x3) ||\t\t\t\t\t\t\t/* enable for 2.4/5 GHz */\n\t\t\t((channel <= 14) && (pregistrypriv->rx_stbc == 0x1)) ||\t\t/* enable for 2.4GHz */\n\t\t\t((channel > 14) && (pregistrypriv->rx_stbc == 0x2)) ||\t\t/* enable for 5GHz */\n\t\t\t(pregistrypriv->wifi_spec == 1)) {\n\t\t\t/* HAL_DEF_RX_STBC means STBC RX spatial stream, todo: VHT 4 streams */\n\t\t\trtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss));\n\t\t\tSET_HT_CAP_ELE_RX_STBC(&ht_capie, rx_stbc_nss);\n\t\t\tDBG_871X(\"[HT] Declare supporting RX STBC = %d\\n\", rx_stbc_nss);\n\t\t}\n\t}\n\n\t//fill default supported_mcs_set\n\t_rtw_memcpy(ht_capie.supp_mcs_set, pmlmeext->default_supported_mcs_set, 16);\n\n\t//update default supported_mcs_set\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\tswitch(rf_type)\n\t{\n\tcase RF_1T1R:\n\t\tset_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R);\t\t\t\n\t\t\tbreak;\n\n\tcase RF_2T2R:\n\tcase RF_1T2R:\n\t\t#ifdef CONFIG_DISABLE_MCS13TO15\n\t\tif(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1))\n\t\t\t\tset_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF);\t\n\t\telse\n\t\t\t\tset_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);\t\n\t\t#else //CONFIG_DISABLE_MCS13TO15\n\t\t\tset_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);\n\t\t#endif //CONFIG_DISABLE_MCS13TO15\n\t\tbreak;\n\tcase RF_3T3R:\n\t\tset_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_3R);\n\t\tbreak;\n\tdefault:\n\t\tDBG_871X(\"[warning] rf_type %d is not expected\\n\", rf_type);\n\t}\n\n\t{\n\t\tu32 rx_packet_offset, max_recvbuf_sz;\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset);\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz);\n\t\t//if(max_recvbuf_sz-rx_packet_offset>(8191-256)) {\n\t\t//\tDBG_871X(\"%s IEEE80211_HT_CAP_MAX_AMSDU is set\\n\", __FUNCTION__);\n\t\t//\tht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU;\n\t\t//}\n\t}\n\t/* \t\n\tAMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k\n\tAMPDU_para [4:2]:Min MPDU Start Spacing\t\n\t*/\n\n\t/*\n\t#if defined(CONFIG_RTL8188E )&& defined (CONFIG_SDIO_HCI)\n\tht_capie.ampdu_params_info = 2;\n\t#else\n\tht_capie.ampdu_params_info = (IEEE80211_HT_CAP_AMPDU_FACTOR&0x03);\n\t#endif\n\t*/\n\n\tif(padapter->driver_rx_ampdu_factor != 0xFF)\n\t\tmax_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;\n\telse\n\t\trtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\n\t\t\t\t\n\t//rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\n\tht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03);\n\n\tif(padapter->driver_rx_ampdu_spacing != 0xFF) \n\t{\n\t\tht_capie.ampdu_params_info |= (( padapter->driver_rx_ampdu_spacing&0x07) <<2);\t\n\t}\n\telse\n\t{\n\t\tif (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) {\n\t\t\t/*\n\t\t\t*\tTodo : Each chip must to ask DD , this chip best ampdu_density setting\n\t\t\t*\tBy yiwei.sun\n\t\t\t*/\n\t\t\trtw_hal_get_def_var(padapter, HW_VAR_BEST_AMPDU_DENSITY, &best_ampdu_density);\n\n\t\t\tht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & (best_ampdu_density << 2));\n\n\t\t } else\n\t\t\tht_capie.ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY&0x00);\n\t}\n#ifdef CONFIG_BEAMFORMING\n\tht_capie.tx_BF_cap_info = 0;\n\n\t/* HT Beamformer*/\n\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) {\n\t\t/* Transmit NDP Capable */\n\t\tSET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(&ht_capie, 1);\n\t\t/* Explicit Compressed Steering Capable */\n\t\tSET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(&ht_capie, 1);\n\t\t/* Compressed Steering Number Antennas */\n\t\tSET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(&ht_capie, 1);\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num);\n\t\tSET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(&ht_capie, rf_num);\n\t}\n\n\t/* HT Beamformee */\n\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) {\n\t\t/* Receive NDP Capable */\n\t\tSET_HT_CAP_TXBF_RECEIVE_NDP_CAP(&ht_capie, 1);\n\t\t/* Explicit Compressed Beamforming Feedback Capable */\n\t\tSET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(&ht_capie, 2);\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num);\n\t\tSET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(&ht_capie, rf_num);\n\t}\n#endif/*CONFIG_BEAMFORMING*/\n\n\tpframe = rtw_set_ie(out_ie+out_len, _HT_CAPABILITY_IE_, \n\t\t\t\t\t\tsizeof(struct rtw_ieee80211_ht_cap), (unsigned char*)&ht_capie, pout_len);\n\n\tphtpriv->ht_option = _TRUE;\n\n\tif(in_ie!=NULL)\n\t{\n\t\tp = rtw_get_ie(in_ie, _HT_ADD_INFO_IE_, &ielen, in_len);\n\t\tif(p && (ielen==sizeof(struct ieee80211_ht_addt_info)))\n\t\t{\n\t\t\tout_len = *pout_len;\t\t\n\t\t\tpframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len);\n\t\t}\n\t}\n\n\treturn (phtpriv->ht_option);\n\t\n}\n\n//the fucntion is > passive_level (in critical_section)\nvoid rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)\n{\t\n\tu8 *p, max_ampdu_sz;\n\tint len;\t\t\n\t//struct sta_info *bmc_sta, *psta;\n\tstruct rtw_ieee80211_ht_cap *pht_capie;\n\tstruct ieee80211_ht_addt_info *pht_addtinfo;\n\t//struct recv_reorder_ctrl *preorder_ctrl;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\n\t//struct recv_priv *precvpriv = &padapter->recvpriv;\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\t//struct wlan_network *pcur_network = &(pmlmepriv->cur_network);;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 cbw40_enable=0;\n\t\n\n\tif(!phtpriv->ht_option)\n\t\treturn;\n\n\tif ((!pmlmeinfo->HT_info_enable) || (!pmlmeinfo->HT_caps_enable))\n\t\treturn;\n\n\tDBG_871X(\"+rtw_update_ht_cap()\\n\");\n\n\t//maybe needs check if ap supports rx ampdu.\n\tif((phtpriv->ampdu_enable==_FALSE) &&(pregistrypriv->ampdu_enable==1))\n\t{\n\t\tif(pregistrypriv->wifi_spec==1)\n\t\t{\n\t\t\t//remove this part because testbed AP should disable RX AMPDU\n\t\t\t//phtpriv->ampdu_enable = _FALSE;\n\t\t\tphtpriv->ampdu_enable = _TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tphtpriv->ampdu_enable = _TRUE;\n\t\t}\n\t}\n\telse if(pregistrypriv->ampdu_enable==2)\n\t{\n\t\t//remove this part because testbed AP should disable RX AMPDU\n\t\t//phtpriv->ampdu_enable = _TRUE;\n\t}\n\n\t\n\t//check Max Rx A-MPDU Size \n\tlen = 0;\n\tp = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs));\n\tif(p && len>0)\t\n\t{\n\t\tpht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);\n\t\tmax_ampdu_sz = (pht_capie->ampdu_params_info & IEEE80211_HT_CAP_AMPDU_FACTOR);\n\t\tmax_ampdu_sz = 1 << (max_ampdu_sz+3); // max_ampdu_sz (kbytes);\n\t\t\n\t\t//DBG_871X(\"rtw_update_ht_cap(): max_ampdu_sz=%d\\n\", max_ampdu_sz);\n\t\tphtpriv->rx_ampdu_maxlen = max_ampdu_sz;\n\t\t\n\t}\n\n\n\tlen=0;\n\tp = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_ADD_INFO_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs));\n\tif(p && len>0)\t\n\t{\n\t\tpht_addtinfo = (struct ieee80211_ht_addt_info *)(p+2);\n\t\t//todo:\n\t}\n\n\tif (hal_chk_bw_cap(padapter, BW_CAP_40M)) {\n\t\tif (channel > 14) {\n\t\t\tif (REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t} else {\n\t\t\tif (REGSTY_IS_BW_2G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t}\n\t}\n\n\t//update cur_bwmode & cur_ch_offset\n\tif ((cbw40_enable) &&\n\t\t(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && \n\t\t(pmlmeinfo->HT_info.infos[0] & BIT(2)))\n\t{\n\t\tint i;\n\t\tu8\trf_type = RF_1T1R;\n\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\t\t//update the MCS set\n\t\tfor (i = 0; i < 16; i++)\n\t\t\tpmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];\n\n\t\t//update the MCS rates\n\t\tswitch(rf_type)\n\t\t{\n\t\t\tcase RF_1T1R:\n\t\t\tcase RF_1T2R:\n\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase RF_2T2R:\n\t\t\t\t#ifdef CONFIG_DISABLE_MCS13TO15\n\t\t\t\tif(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )\t\t\t\t\n\t\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);\t\t\t\t\n\t\t\t\telse\n\t\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);\n#else //CONFIG_DISABLE_MCS13TO15\n\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);\n#endif //CONFIG_DISABLE_MCS13TO15\n\t\t\t\tbreak;\n\t\t\tcase RF_3T3R:\n\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_3R);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"[warning] rf_type %d is not expected\\n\", rf_type);\n\t\t}\n\n\t\t//switch to the 40M Hz mode accoring to the AP\n\t\t//pmlmeext->cur_bwmode = CHANNEL_WIDTH_40;\n\t\tswitch ((pmlmeinfo->HT_info.infos[0] & 0x3))\n\t\t{\n\t\t\tcase EXTCHNL_OFFSET_UPPER:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase EXTCHNL_OFFSET_LOWER:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t\tbreak;\n\t\t}\t\t\n\t}\n\n\t//\n\t// Config SM Power Save setting\n\t//\n\tpmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;\n\tif(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)\n\t{\n\t\t/*u8 i;\n\t\t//update the MCS rates\n\t\tfor (i = 0; i < 16; i++)\n\t\t{\n\t\t\tpmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];\n\t\t}*/\n\t\tDBG_871X(\"%s(): WLAN_HT_CAP_SM_PS_STATIC\\n\",__FUNCTION__);\n\t}\n\n\t//\n\t// Config current HT Protection mode.\n\t//\n\tpmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;\n\n\t\n\t\n#if 0 //move to rtw_update_sta_info_client()\n\t//for A-MPDU Rx reordering buffer control for bmc_sta & sta_info\n\t//if A-MPDU Rx is enabled, reseting  rx_ordering_ctrl wstart_b(indicate_seq) to default value=0xffff\n\t//todo: check if AP can send A-MPDU packets\n\tbmc_sta = rtw_get_bcmc_stainfo(padapter);\n\tif(bmc_sta)\n\t{\n\t\tfor(i=0; i < 16 ; i++)\n\t\t{\n\t\t\t//preorder_ctrl = &precvpriv->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl = &bmc_sta->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\tpreorder_ctrl->indicate_seq = 0xffff;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d indicate_seq:%u \\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq);\n\t\t\t#endif\n\t\t\tpreorder_ctrl->wend_b= 0xffff;\n\t\t\tpreorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32\n\t\t}\n\t}\n\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress);\n\tif(psta)\n\t{\n\t\tfor(i=0; i < 16 ; i++)\n\t\t{\n\t\t\t//preorder_ctrl = &precvpriv->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl = &psta->recvreorder_ctrl[i];\n\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\tpreorder_ctrl->indicate_seq = 0xffff;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d indicate_seq:%u \\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq);\n\t\t\t#endif\n\t\t\tpreorder_ctrl->wend_b= 0xffff;\n\t\t\tpreorder_ctrl->wsize_b = 64;//max_ampdu_sz;//ex. 32(kbytes) -> wsize_b=32\n\t\t}\n\t}\n#endif\t\n\n}\n\n#ifdef CONFIG_TDLS\nvoid rtw_issue_addbareq_cmd_tdls(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tstruct pkt_attrib *pattrib =&pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta = NULL;\n\tu8 issued;\n\tint priority;\n\tstruct ht_priv\t*phtpriv;\n\n\tpriority = pattrib->priority;\n\n\tif (pattrib->direct_link == _TRUE) {\n\t\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\n\t\tif ((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)) {\n\t\t\tphtpriv = &ptdls_sta->htpriv;\n\n\t\t\tif ((phtpriv->ht_option == _TRUE) && (phtpriv->ampdu_enable == _TRUE)) {\n\t\t\t\tissued = (phtpriv->agg_enable_bitmap>>priority)&0x1;\n\t\t\t\tissued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1;\n\n\t\t\t\tif (0 == issued) {\n\t\t\t\t\tDBG_871X(\"[%s], p=%d\\n\", __FUNCTION__, priority);\n\t\t\t\t\tptdls_sta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);\n\t\t\t\t\trtw_addbareq_cmd(padapter,(u8)priority, pattrib->dst);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n#endif //CONFIG_TDLS\n\nvoid rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tu8 issued;\n\tint priority;\n\tstruct sta_info *psta=NULL;\n\tstruct ht_priv\t*phtpriv;\n\tstruct pkt_attrib *pattrib =&pxmitframe->attrib;\n\ts32 bmcst = IS_MCAST(pattrib->ra);\n\n\t//if(bmcst || (padapter->mlmepriv.LinkDetectInfo.bTxBusyTraffic == _FALSE))\n\tif(bmcst || (padapter->mlmepriv.LinkDetectInfo.NumTxOkInPeriod<100))\t\n\t\treturn;\n\t\n\tpriority = pattrib->priority;\n\n#ifdef CONFIG_TDLS\n\trtw_issue_addbareq_cmd_tdls(padapter, pxmitframe);\n#endif //CONFIG_TDLS\n\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\tif(pattrib->psta != psta)\n\t{\n\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\treturn;\n\t}\n\t\n\tif(psta==NULL)\n\t{\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn;\n\t}\t\n\n\n\tphtpriv = &psta->htpriv;\n\n\tif((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) \n\t{\n\t\tissued = (phtpriv->agg_enable_bitmap>>priority)&0x1;\n\t\tissued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1;\n\n\t\tif(0==issued)\n\t\t{\n\t\t\tDBG_871X(\"rtw_issue_addbareq_cmd, p=%d\\n\", priority);\n\t\t\tpsta->htpriv.candidate_tid_bitmap |= BIT((u8)priority);\n\t\t\trtw_addbareq_cmd(padapter,(u8) priority, pattrib->ra);\n\t\t}\n\t}\n\n}\n\nvoid rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len)\n{\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\n#ifdef CONFIG_80211AC_VHT\n\tstruct vht_priv\t*pvhtpriv = &pmlmepriv->vhtpriv;\n#endif //CONFIG_80211AC_VHT\n\tu8\tcap_content[8] = { 0 };\n\tu8\t*pframe;\n\tu8   null_content[8] = {0};\n\n\tif (phtpriv->bss_coexist) {\n\t\tSET_EXT_CAPABILITY_ELE_BSS_COEXIST(cap_content, 1);\n\t}\n\n#ifdef CONFIG_80211AC_VHT\n\tif (pvhtpriv->vht_option) {\n\t\tSET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(cap_content, 1);\n\t}\n#endif //CONFIG_80211AC_VHT\n\t/*\n\t\tFrom 802.11 specification,if a STA does not support any of capabilities defined\n\t\tin the Extended Capabilities element, then the STA is not required to \n\t\ttransmit the Extended Capabilities element. \n\t*/\n\tif (_FALSE == _rtw_memcmp(cap_content, null_content, 8))\n\t\tpframe = rtw_set_ie(out_ie + *pout_len, EID_EXTCapability, 8, cap_content , pout_len);\n}\n#endif\n\n#ifdef CONFIG_LAYER2_ROAMING\ninline void rtw_set_to_roam(_adapter *adapter, u8 to_roam)\n{\n\tif (to_roam == 0)\n\t\tadapter->mlmepriv.to_join = _FALSE;\n\tadapter->mlmepriv.to_roam = to_roam;\n}\n\ninline u8 rtw_dec_to_roam(_adapter *adapter)\n{\n\tadapter->mlmepriv.to_roam--;\n\treturn adapter->mlmepriv.to_roam;\n}\n\ninline u8 rtw_to_roam(_adapter *adapter)\n{\n\treturn adapter->mlmepriv.to_roam;\n}\n\nvoid rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network)\n{\n\t_irqL irqL;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t_rtw_roaming(padapter, tgt_network);\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\nvoid _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network)\n{\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network *cur_network = &pmlmepriv->cur_network;\n\tint do_join_r;\n\t\n\tif(0 < rtw_to_roam(padapter)) {\n\t\tDBG_871X(\"roaming from %s(\"MAC_FMT\"), length:%d\\n\",\n\t\t\t\tcur_network->network.Ssid.Ssid, MAC_ARG(cur_network->network.MacAddress),\n\t\t\t\tcur_network->network.Ssid.SsidLength);\n\t\t_rtw_memcpy(&pmlmepriv->assoc_ssid, &cur_network->network.Ssid, sizeof(NDIS_802_11_SSID));\n\n\t\tpmlmepriv->assoc_by_bssid = _FALSE;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t\trtw_wapi_return_all_sta_info(padapter);\n#endif\n\n\t\twhile(1) {\n\t\t\tif( _SUCCESS==(do_join_r=rtw_do_join(padapter)) ) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tDBG_871X(\"roaming do_join return %d\\n\", do_join_r);\n\t\t\t\trtw_dec_to_roam(padapter);\n\t\t\t\t\n\t\t\t\tif(rtw_to_roam(padapter) > 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tDBG_871X(\"%s(%d) -to roaming fail, indicate_disconnect\\n\", __FUNCTION__,__LINE__);\n\t\t\t\t\trtw_indicate_disconnect(padapter);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n}\n#endif /* CONFIG_LAYER2_ROAMING */\n\nbool rtw_adjust_chbw(_adapter *adapter, u8 req_ch, u8 *req_bw, u8 *req_offset)\n{\n\tstruct registry_priv *regsty = adapter_to_regsty(adapter);\n\tu8 allowed_bw;\n\n\tif (req_ch <= 14)\n\t\tallowed_bw = REGSTY_BW_2G(regsty);\n\telse\n\t\tallowed_bw = REGSTY_BW_5G(regsty);\n\n\tallowed_bw = hal_largest_bw(adapter, allowed_bw);\n\n\tif (allowed_bw == CHANNEL_WIDTH_80 && *req_bw > CHANNEL_WIDTH_80)\n\t\t*req_bw = CHANNEL_WIDTH_80;\n\telse if (allowed_bw == CHANNEL_WIDTH_40 && *req_bw > CHANNEL_WIDTH_40)\n\t\t*req_bw = CHANNEL_WIDTH_40;\n\telse if (allowed_bw == CHANNEL_WIDTH_20 && *req_bw > CHANNEL_WIDTH_20) {\n\t\t*req_bw = CHANNEL_WIDTH_20;\n\t\t*req_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t} else\n\t\treturn _FALSE;\n\n\treturn _TRUE;\n}\n\nsint rtw_linked_check(_adapter *padapter)\n{\n\tif(\t(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) ||\n\t\t\t(check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE))\n\t{\n\t\tif(padapter->stapriv.asoc_sta_count > 2)\n\t\t\treturn _TRUE;\n\t}\n\telse\n\t{\t//Station mode\n\t\tif(check_fwstate(&padapter->mlmepriv, _FW_LINKED)== _TRUE)\n\t\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\nsint rtw_buddy_adapter_up(_adapter *padapter)\n{\t\n\tsint res = _FALSE;\n\t\n\tif(padapter == NULL)\n\t\treturn res;\n\n\n\tif(padapter->pbuddy_adapter == NULL)\n\t\tres = _FALSE;\n\telse if (RTW_CANNOT_RUN(padapter) ||\n\t\t(padapter->pbuddy_adapter->bup == _FALSE) || (!rtw_is_hw_init_completed(padapter)))\n\t\tres = _FALSE;\n\telse\n\t\tres = _TRUE;\n\n\treturn res;\t\n\n}\n\nsint check_buddy_fwstate(_adapter *padapter, sint state)\n{\n\tif(padapter == NULL)\n\t\treturn _FALSE;\t\n\t\n\tif(padapter->pbuddy_adapter == NULL)\n\t\treturn _FALSE;\t\n\t\t\n\tif ((state == WIFI_FW_NULL_STATE) && \n\t\t(padapter->pbuddy_adapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE))\n\t\treturn _TRUE;\t\t\n\t\n\tif (padapter->pbuddy_adapter->mlmepriv.fw_state & state)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nu8 rtw_get_buddy_bBusyTraffic(_adapter *padapter)\n{\n\tif(padapter == NULL)\n\t\treturn _FALSE;\t\n\t\n\tif(padapter->pbuddy_adapter == NULL)\n\t\treturn _FALSE;\t\n\t\n\treturn padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic;\n}\n\n#endif //CONFIG_CONCURRENT_MODE\n\nstatic const char *miracast_mode_str[] = {\n\t\"DISABLED\",\n\t\"SOURCE\",\n\t\"SINK\",\n\t\"INVALID\",\n};\n\nconst char *get_miracast_mode_str(int mode)\n{\n\tif (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)\n\t\tmode = MIRACAST_INVALID;\n\n\treturn miracast_mode_str[mode];\n}\n\n"
  },
  {
    "path": "core/rtw_mlme_ext.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_MLME_EXT_C_\n\n#include <drv_types.h>\n#ifdef CONFIG_IOCTL_CFG80211\n#include <rtw_wifi_regd.h>\n#endif //CONFIG_IOCTL_CFG80211\n#include <hal_data.h>\n\n\nstruct mlme_handler mlme_sta_tbl[]={\n\t{WIFI_ASSOCREQ,\t\t\"OnAssocReq\",\t&OnAssocReq},\n\t{WIFI_ASSOCRSP,\t\t\"OnAssocRsp\",\t&OnAssocRsp},\n\t{WIFI_REASSOCREQ,\t\"OnReAssocReq\",\t&OnAssocReq},\n\t{WIFI_REASSOCRSP,\t\"OnReAssocRsp\",\t&OnAssocRsp},\n\t{WIFI_PROBEREQ,\t\t\"OnProbeReq\",\t&OnProbeReq},\n\t{WIFI_PROBERSP,\t\t\"OnProbeRsp\",\t\t&OnProbeRsp},\n\n\t/*----------------------------------------------------------\n\t\t\t\t\tbelow 2 are reserved\n\t-----------------------------------------------------------*/\n\t{0,\t\t\t\t\t\"DoReserved\",\t\t&DoReserved},\n\t{0,\t\t\t\t\t\"DoReserved\",\t\t&DoReserved},\n\t{WIFI_BEACON,\t\t\"OnBeacon\",\t\t&OnBeacon},\n\t{WIFI_ATIM,\t\t\t\"OnATIM\",\t\t&OnAtim},\n\t{WIFI_DISASSOC,\t\t\"OnDisassoc\",\t\t&OnDisassoc},\n\t{WIFI_AUTH,\t\t\t\"OnAuth\",\t\t&OnAuthClient},\n\t{WIFI_DEAUTH,\t\t\"OnDeAuth\",\t\t&OnDeAuth},\n\t{WIFI_ACTION,\t\t\"OnAction\",\t\t&OnAction},\n\t{WIFI_ACTION_NOACK,\"OnActionNoAck\",\t&OnAction},\n};\n\n#ifdef _CONFIG_NATIVEAP_MLME_\nstruct mlme_handler mlme_ap_tbl[]={\n\t{WIFI_ASSOCREQ,\t\t\"OnAssocReq\",\t&OnAssocReq},\n\t{WIFI_ASSOCRSP,\t\t\"OnAssocRsp\",\t&OnAssocRsp},\n\t{WIFI_REASSOCREQ,\t\"OnReAssocReq\",\t&OnAssocReq},\n\t{WIFI_REASSOCRSP,\t\"OnReAssocRsp\",\t&OnAssocRsp},\n\t{WIFI_PROBEREQ,\t\t\"OnProbeReq\",\t&OnProbeReq},\n\t{WIFI_PROBERSP,\t\t\"OnProbeRsp\",\t\t&OnProbeRsp},\n\n\t/*----------------------------------------------------------\n\t\t\t\t\tbelow 2 are reserved\n\t-----------------------------------------------------------*/\n\t{0,\t\t\t\t\t\"DoReserved\",\t\t&DoReserved},\n\t{0,\t\t\t\t\t\"DoReserved\",\t\t&DoReserved},\n\t{WIFI_BEACON,\t\t\"OnBeacon\",\t\t&OnBeacon},\n\t{WIFI_ATIM,\t\t\t\"OnATIM\",\t\t&OnAtim},\n\t{WIFI_DISASSOC,\t\t\"OnDisassoc\",\t\t&OnDisassoc},\n\t{WIFI_AUTH,\t\t\t\"OnAuth\",\t\t&OnAuth},\n\t{WIFI_DEAUTH,\t\t\"OnDeAuth\",\t\t&OnDeAuth},\n\t{WIFI_ACTION,\t\t\"OnAction\",\t\t&OnAction},\n\t{WIFI_ACTION_NOACK,\"OnActionNoAck\",\t&OnAction},\n};\n#endif\n\nstruct action_handler OnAction_tbl[]={\n\t{RTW_WLAN_CATEGORY_SPECTRUM_MGMT,\t \"ACTION_SPECTRUM_MGMT\", on_action_spct},\n\t{RTW_WLAN_CATEGORY_QOS, \"ACTION_QOS\", &OnAction_qos},\n\t{RTW_WLAN_CATEGORY_DLS, \"ACTION_DLS\", &OnAction_dls},\n\t{RTW_WLAN_CATEGORY_BACK, \"ACTION_BACK\", &OnAction_back},\n\t{RTW_WLAN_CATEGORY_PUBLIC, \"ACTION_PUBLIC\", on_action_public},\n\t{RTW_WLAN_CATEGORY_RADIO_MEASUREMENT, \"ACTION_RADIO_MEASUREMENT\", &DoReserved},\n\t{RTW_WLAN_CATEGORY_FT, \"ACTION_FT\",\t&DoReserved},\n\t{RTW_WLAN_CATEGORY_HT,\t\"ACTION_HT\",\t&OnAction_ht},\n#ifdef CONFIG_IEEE80211W\n\t{RTW_WLAN_CATEGORY_SA_QUERY, \"ACTION_SA_QUERY\", &OnAction_sa_query},\n#else\n\t{RTW_WLAN_CATEGORY_SA_QUERY, \"ACTION_SA_QUERY\", &DoReserved},\n#endif //CONFIG_IEEE80211W\n\t//add for CONFIG_IEEE80211W\n\t{RTW_WLAN_CATEGORY_UNPROTECTED_WNM, \"ACTION_UNPROTECTED_WNM\", &DoReserved},\n\t{RTW_WLAN_CATEGORY_SELF_PROTECTED, \"ACTION_SELF_PROTECTED\", &DoReserved},\n\t{RTW_WLAN_CATEGORY_WMM, \"ACTION_WMM\", &OnAction_wmm},\n\t{RTW_WLAN_CATEGORY_VHT, \"ACTION_VHT\", &OnAction_vht},\n\t{RTW_WLAN_CATEGORY_P2P, \"ACTION_P2P\", &OnAction_p2p},\t\n};\n\n\nu8\tnull_addr[ETH_ALEN]= {0,0,0,0,0,0};\n\n/**************************************************\nOUI definitions for the vendor specific IE\n***************************************************/\nunsigned char\tRTW_WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};\nunsigned char WMM_OUI[] = {0x00, 0x50, 0xf2, 0x02};\nunsigned char\tWPS_OUI[] = {0x00, 0x50, 0xf2, 0x04};\nunsigned char\tP2P_OUI[] = {0x50,0x6F,0x9A,0x09};\nunsigned char\tWFD_OUI[] = {0x50,0x6F,0x9A,0x0A};\n\nunsigned char\tWMM_INFO_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};\nunsigned char\tWMM_PARA_OUI[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};\n\nunsigned char WPA_TKIP_CIPHER[4] = {0x00, 0x50, 0xf2, 0x02};\nunsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02};\n\nextern unsigned char REALTEK_96B_IE[];\n\n#ifdef LEGACY_CHANNEL_PLAN_REF\n/********************************************************\nChannelPlan definitions\n*********************************************************/\nstatic RT_CHANNEL_PLAN legacy_channel_plan[] = {\n\t/* 0x00, RTW_CHPLAN_FCC */\t\t\t\t\t\t{{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},\n\t/* 0x01, RTW_CHPLAN_IC */\t\t\t\t\t\t{{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},\n\t/* 0x02, RTW_CHPLAN_ETSI */\t\t\t\t\t\t{{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},\n\t/* 0x03, RTW_CHPLAN_SPAIN */\t\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 0x04, RTW_CHPLAN_FRANCE */\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 0x05, RTW_CHPLAN_MKK */\t\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 0x06, RTW_CHPLAN_MKK1 */\t\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 0x07, RTW_CHPLAN_ISRAEL */\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64}, 21},\n\t/* 0x08, RTW_CHPLAN_TELEC */\t\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, 56, 60, 64}, 22},\n\t/* 0x09, RTW_CHPLAN_GLOBAL_DOAMIN */\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14},\n\t/* 0x0A, RTW_CHPLAN_WORLD_WIDE_13 */\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 0x0B, RTW_CHPLAN_TAIWAN */\t\t\t\t\t{{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},\n\t/* 0x0C, RTW_CHPLAN_CHINA */\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 149, 153, 157, 161, 165}, 18},\n\t/* 0x0D, RTW_CHPLAN_SINGAPORE_INDIA_MEXICO */\t{{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},\n\t/* 0x0E, RTW_CHPLAN_KOREA */\t\t\t\t\t{{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},\n\t/* 0x0F, RTW_CHPLAN_TURKEY */\t\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64}, 19},\n\t/* 0x10, RTW_CHPLAN_JAPAN */\t\t\t\t\t\t{{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},\n\t/* 0x11, RTW_CHPLAN_FCC_NO_DFS */\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 149, 153, 157, 161, 165}, 20},\n\t/* 0x12, RTW_CHPLAN_JAPAN_NO_DFS */\t\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48}, 17},\n\t/* 0x13, RTW_CHPLAN_WORLD_WIDE_5G */\t\t\t{{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},\n\t/* 0x14, RTW_CHPLAN_TAIWAN_NO_DFS */\t\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 56, 60, 64, 149, 153, 157, 161, 165}, 19},\n};\n#endif\n\nstatic RT_CHANNEL_PLAN_2G RTW_ChannelPlan2G[] = {\n\t/* 0, RTW_RD_2G_NULL */\t\t{{}, 0},\n\t/* 1, RTW_RD_2G_WORLD */\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 2, RTW_RD_2G_ETSI1 */\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 3, RTW_RD_2G_FCC1 */\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 11},\n\t/* 4, RTW_RD_2G_MKK1 */\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14},\n\t/* 5, RTW_RD_2G_ETSI2 */\t\t{{10, 11, 12, 13}, 4},\n\t/* 6, RTW_RD_2G_GLOBAL */\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14},\n\t/* 7, RTW_RD_2G_MKK2 */\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n\t/* 8, RTW_RD_2G_FCC2 */\t\t{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},\n};\n\nstatic RT_CHANNEL_PLAN_5G RTW_ChannelPlan5G[] = {\n\t/* 0, RTW_RD_5G_NULL */\t\t{{}, 0},\n\t/* 1, RTW_RD_5G_ETSI1 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 19},\n\t/* 2, RTW_RD_5G_ETSI2 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165}, 24},\n\t/* 3, RTW_RD_5G_ETSI3 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 149, 153, 157, 161, 165}, 22},\n\t/* 4, RTW_RD_5G_FCC1 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165}, 24},\n\t/* 5, RTW_RD_5G_FCC2 */\t\t{{36, 40, 44, 48, 149, 153, 157, 161, 165}, 9},\n\t/* 6, RTW_RD_5G_FCC3 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165}, 13},\n\t/* 7, RTW_RD_5G_FCC4 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161}, 12},\n\t/* 8, RTW_RD_5G_FCC5 */\t\t{{149, 153, 157, 161, 165}, 5},\n\t/* 9, RTW_RD_5G_FCC6 */\t\t{{36, 40, 44, 48, 52, 56, 60, 64}, 8},\n\t/* 10, RTW_RD_5G_FCC7 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 21},\n\t/* 11, RTW_RD_5G_KCC1 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 149, 153, 157, 161}, 19},\n\t/* 12, RTW_RD_5G_MKK1 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 19},\n\t/* 13, RTW_RD_5G_MKK2 */\t{{36, 40, 44, 48, 52, 56, 60, 64}, 8},\n\t/* 14, RTW_RD_5G_MKK3 */\t{{100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 11},\n\t/* 15, RTW_RD_5G_NCC1 */\t{{56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 16},\n\t/* 16, RTW_RD_5G_NCC2 */\t{{56, 60, 64, 149, 153, 157, 161, 165}, 8},\n\t/* 17, RTW_RD_5G_NCC3 */\t{{149, 153, 157, 161, 165}, 5},\n\t/* 18, RTW_RD_5G_ETSI4 */\t{{36, 40, 44, 48}, 4},\n\t/* 19, RTW_RD_5G_ETSI5 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 21},\n\t/* 20, RTW_RD_5G_FCC8 */\t{{149, 153, 157, 161}, 4},\n\t/* 21, RTW_RD_5G_ETSI6 */\t{{36, 40, 44, 48, 52, 56, 60, 64}, 8},\n\t/* 22, RTW_RD_5G_ETSI7 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165}, 13},\n\t/* 23, RTW_RD_5G_ETSI8 */\t{{36, 40, 44, 48, 149, 153, 157, 161, 165}, 9},\n\t/* 24, RTW_RD_5G_ETSI9 */\t{{100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 11},\n\t/* 25, RTW_RD_5G_ETSI10 */\t{{149, 153, 157, 161, 165}, 5},\n\t/* 26, RTW_RD_5G_ETSI11 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 132, 136, 140, 149, 153, 157, 161, 165}, 16},\n\t/* 27, RTW_RD_5G_NCC4 */\t{{52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 17},\n\t/* 28, RTW_RD_5G_ETSI12 */\t{{149, 153, 157, 161}, 4},\n\t/* 29, RTW_RD_5G_FCC9 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 21},\n\t/* 30, RTW_RD_5G_ETSI13 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140}, 16},\n\t/* 31, RTW_RD_5G_FCC10 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161}, 20},\n\t/* 32, RTW_RD_5G_MKK4 */\t{{36, 40, 44, 48}, 4},\n\t/* 33, RTW_RD_5G_ETSI14 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 132, 136, 140}, 11},\n\n\t/* === Below are driver defined for legacy channel plan compatible, NO static index assigned ==== */\n\t/* RTW_RD_5G_OLD_FCC1 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165}, 20},\n\t/* RTW_RD_5G_OLD_NCC1 */\t{{56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165}, 15},\n\t/* RTW_RD_5G_OLD_KCC1 */\t{{36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 149, 153, 157, 161, 165}, 20},\n};\n\nstatic RT_CHANNEL_PLAN_MAP\tRTW_ChannelPlanMap[] = {\n\t/* ===== 0x00 ~ 0x1F, legacy channel plan ===== */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_KCC1,\t\tTXPWR_LMT_FCC},\t\t/* 0x00, RTW_CHPLAN_FCC */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_OLD_FCC1,\tTXPWR_LMT_FCC},\t\t/* 0x01, RTW_CHPLAN_IC */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_ETSI1,\tTXPWR_LMT_ETSI},\t/* 0x02, RTW_CHPLAN_ETSI */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_ETSI},\t/* 0x03, RTW_CHPLAN_SPAIN */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_ETSI},\t/* 0x04, RTW_CHPLAN_FRANCE */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_MKK},\t\t/* 0x05, RTW_CHPLAN_MKK */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_MKK},\t\t/* 0x06, RTW_CHPLAN_MKK1 */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_FCC6,\t\tTXPWR_LMT_ETSI},\t/* 0x07, RTW_CHPLAN_ISRAEL */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_FCC6,\t\tTXPWR_LMT_MKK},\t\t/* 0x08, RTW_CHPLAN_TELEC */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x09, RTW_CHPLAN_GLOBAL_DOAMIN */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x0A, RTW_CHPLAN_WORLD_WIDE_13 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_OLD_NCC1,\tTXPWR_LMT_FCC},\t\t/* 0x0B, RTW_CHPLAN_TAIWAN */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_FCC5,\t\tTXPWR_LMT_ETSI},\t/* 0x0C, RTW_CHPLAN_CHINA */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC3,\t\tTXPWR_LMT_WW},\t\t/* 0x0D, RTW_CHPLAN_SINGAPORE_INDIA_MEXICO */ /* ETSI:Singapore, India. FCC:Mexico => WW */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_OLD_KCC1,\tTXPWR_LMT_ETSI},\t/* 0x0E, RTW_CHPLAN_KOREA */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC6,\t\tTXPWR_LMT_ETSI},\t/* 0x0F, RTW_CHPLAN_TURKEY */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_ETSI1,\tTXPWR_LMT_MKK},\t\t/* 0x10, RTW_CHPLAN_JAPAN */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC2,\t\tTXPWR_LMT_FCC},\t\t/* 0x11, RTW_CHPLAN_FCC_NO_DFS */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_FCC7,\t\tTXPWR_LMT_MKK},\t\t/* 0x12, RTW_CHPLAN_JAPAN_NO_DFS */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC1,\t\tTXPWR_LMT_WW},\t\t/* 0x13, RTW_CHPLAN_WORLD_WIDE_5G */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NCC2,\t\tTXPWR_LMT_FCC},\t\t/* 0x14, RTW_CHPLAN_TAIWAN_NO_DFS */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC7,\t\tTXPWR_LMT_ETSI},\t/* 0x15, RTW_CHPLAN_ETSI_NO_DFS */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_NCC1,\t\tTXPWR_LMT_ETSI},\t/* 0x16, RTW_CHPLAN_KOREA_NO_DFS */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_FCC7,\t\tTXPWR_LMT_MKK},\t\t/* 0x17, RTW_CHPLAN_JAPAN_NO_DFS */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_FCC5,\t\tTXPWR_LMT_ETSI},\t/* 0x18, RTW_CHPLAN_PAKISTAN_NO_DFS */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC5,\t\tTXPWR_LMT_FCC},\t\t/* 0x19, RTW_CHPLAN_TAIWAN2_NO_DFS */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x1A, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x1B, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x1C, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x1D, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x1E, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_FCC1,\t\tTXPWR_LMT_WW},\t\t/* 0x1F, RTW_CHPLAN_WORLD_WIDE_ONLY_5G */\n\n\t/* ===== 0x20 ~ 0x7F, new channel plan ===== */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x20, RTW_CHPLAN_WORLD_NULL */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_ETSI},\t/* 0x21, RTW_CHPLAN_ETSI1_NULL */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_FCC},\t\t/* 0x22, RTW_CHPLAN_FCC1_NULL */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_MKK},\t\t/* 0x23, RTW_CHPLAN_MKK1_NULL */\n\t{RTW_RD_2G_ETSI2,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_ETSI},\t/* 0x24, RTW_CHPLAN_ETSI2_NULL */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC1,\t\tTXPWR_LMT_FCC},\t\t/* 0x25, RTW_CHPLAN_FCC1_FCC1 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI1,\tTXPWR_LMT_ETSI},\t/* 0x26, RTW_CHPLAN_WORLD_ETSI1 */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_MKK1,\t\tTXPWR_LMT_MKK},\t\t/* 0x27, RTW_CHPLAN_MKK1_MKK1 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_KCC1,\t\tTXPWR_LMT_ETSI},\t/* 0x28, RTW_CHPLAN_WORLD_KCC1 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC2,\t\tTXPWR_LMT_FCC},\t\t/* 0x29, RTW_CHPLAN_WORLD_FCC2 */\n\t{RTW_RD_2G_FCC2,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_FCC},\t\t/* 0x2A, RTW_CHPLAN_FCC2_NULL */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x2B, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x2C, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x2D, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x2E, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x2F, */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC3,\t\tTXPWR_LMT_FCC},\t\t/* 0x30, RTW_CHPLAN_WORLD_FCC3 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC4,\t\tTXPWR_LMT_FCC},\t\t/* 0x31, RTW_CHPLAN_WORLD_FCC4 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC5,\t\tTXPWR_LMT_FCC},\t\t/* 0x32, RTW_CHPLAN_WORLD_FCC5 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_FCC6,\t\tTXPWR_LMT_FCC},\t\t/* 0x33, RTW_CHPLAN_WORLD_FCC6 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC7,\t\tTXPWR_LMT_FCC},\t\t/* 0x34, RTW_CHPLAN_FCC1_FCC7 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI2,\tTXPWR_LMT_ETSI},\t/* 0x35, RTW_CHPLAN_WORLD_ETSI2 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI3,\tTXPWR_LMT_ETSI},\t/* 0x36, RTW_CHPLAN_WORLD_ETSI3 */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_MKK2,\t\tTXPWR_LMT_MKK},\t\t/* 0x37, RTW_CHPLAN_MKK1_MKK2 */\n\t{RTW_RD_2G_MKK1,\tRTW_RD_5G_MKK3,\t\tTXPWR_LMT_MKK},\t\t/* 0x38, RTW_CHPLAN_MKK1_MKK3 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NCC1,\t\tTXPWR_LMT_FCC},\t\t/* 0x39, RTW_CHPLAN_FCC1_NCC1 */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3A, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3B, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3C, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3D, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3E, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x3F, */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NCC2,\t\tTXPWR_LMT_FCC},\t\t/* 0x40, RTW_CHPLAN_FCC1_NCC2 */\n\t{RTW_RD_2G_GLOBAL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x41, RTW_CHPLAN_GLOBAL_NULL */\n\t{RTW_RD_2G_ETSI1,\tRTW_RD_5G_ETSI4,\tTXPWR_LMT_ETSI},\t/* 0x42, RTW_CHPLAN_ETSI1_ETSI4 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC2,\t\tTXPWR_LMT_FCC},\t\t/* 0x43, RTW_CHPLAN_FCC1_FCC2 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NCC3,\t\tTXPWR_LMT_FCC},\t\t/* 0x44, RTW_CHPLAN_FCC1_NCC3 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI5,\tTXPWR_LMT_ETSI},\t/* 0x45, RTW_CHPLAN_WORLD_ETSI5 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC8,\t\tTXPWR_LMT_FCC},\t\t/* 0x46, RTW_CHPLAN_FCC1_FCC8 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI6,\tTXPWR_LMT_ETSI},\t/* 0x47, RTW_CHPLAN_WORLD_ETSI6 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI7,\tTXPWR_LMT_ETSI},\t/* 0x48, RTW_CHPLAN_WORLD_ETSI7 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI8,\tTXPWR_LMT_ETSI},\t/* 0x49, RTW_CHPLAN_WORLD_ETSI8 */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4A, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4B, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4C, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4D, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4E, */\n\t{RTW_RD_2G_NULL,\tRTW_RD_5G_NULL,\t\tTXPWR_LMT_WW},\t\t/* 0x4F, */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI9,\tTXPWR_LMT_ETSI},\t/* 0x50, RTW_CHPLAN_WORLD_ETSI9 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI10,\tTXPWR_LMT_ETSI},\t/* 0x51, RTW_CHPLAN_WORLD_ETSI10 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI11,\tTXPWR_LMT_ETSI},\t/* 0x52, RTW_CHPLAN_WORLD_ETSI11 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_NCC4,\t\tTXPWR_LMT_FCC},\t\t/* 0x53, RTW_CHPLAN_FCC1_NCC4 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI12,\tTXPWR_LMT_ETSI},\t/* 0x54, RTW_CHPLAN_WORLD_ETSI12 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC9,\t\tTXPWR_LMT_FCC},\t\t/* 0x55, RTW_CHPLAN_FCC1_FCC9 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI13,\tTXPWR_LMT_ETSI},\t/* 0x56, RTW_CHPLAN_WORLD_ETSI13 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC10,\tTXPWR_LMT_FCC},\t\t/* 0x57, RTW_CHPLAN_FCC1_FCC10 */\n\t{RTW_RD_2G_MKK2,\tRTW_RD_5G_MKK4,\t\tTXPWR_LMT_MKK},\t\t/* 0x58, RTW_CHPLAN_MKK2_MKK4 */\n\t{RTW_RD_2G_WORLD,\tRTW_RD_5G_ETSI14,\tTXPWR_LMT_ETSI},\t/* 0x59, RTW_CHPLAN_WORLD_ETSI14 */\n\t{RTW_RD_2G_FCC1,\tRTW_RD_5G_FCC5,\t\tTXPWR_LMT_FCC},\t\t/* 0x60, RTW_CHPLAN_FCC1_FCC5 */\n};\n\nstatic RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = {\n\tRTW_RD_2G_WORLD,\tRTW_RD_5G_FCC1,\t\tTXPWR_LMT_FCC\t\t/* 0x7F, Realtek Define */\n};\n\nbool rtw_chplan_is_empty(u8 id)\n{\n\tRT_CHANNEL_PLAN_MAP *chplan_map;\n\n\tif (!rtw_is_channel_plan_valid(id)) {\n\t\trtw_warn_on(1);\n\t\treturn _FALSE;\n\t}\n\n\tif (id == RTW_CHPLAN_REALTEK_DEFINE)\n\t\tchplan_map = &RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE;\n\telse\n\t\tchplan_map = &RTW_ChannelPlanMap[id];\n\n\tif (chplan_map->Index2G == RTW_RD_2G_NULL\n\t\t&& chplan_map->Index5G == RTW_RD_5G_NULL)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\n#ifdef CONFIG_DFS_MASTER\nvoid rtw_rfctl_reset_cac(struct rf_ctl_t *rfctl)\n{\n\tif (rtw_is_long_cac_ch(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset))\n\t\trfctl->cac_end_time = rtw_get_current_time() + rtw_ms_to_systime(CAC_TIME_CE_MS);\n\telse\n\t\trfctl->cac_end_time = rtw_get_current_time() + rtw_ms_to_systime(CAC_TIME_MS);\n}\n\n/*\n* check if channel coverage includes new range and the new range is in DFS range\n* called after radar_detect_ch,bw,offset is updated\n*/\nbool rtw_is_cac_reset_needed(_adapter *adapter)\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\tbool needed = _FALSE;\n\tu32 pre_hi, pre_lo, hi, lo;\n\n\tif (0)\n\t\tDBG_871X(\"pre_radar_detect_ch:%d, pre_radar_detect_by_sta_link:%d\\n\"\n\t\t\t, rfctl->pre_radar_detect_ch, rfctl->pre_radar_detect_by_sta_link);\n\n\tif (rfctl->pre_radar_detect_by_sta_link == _TRUE)\n\t\tgoto exit;\n\n\tif (rfctl->pre_radar_detect_ch == 0) {\n\t\tneeded = _TRUE;\n\t\tgoto exit;\n\t}\n\n\tif (rtw_chbw_to_freq_range(rfctl->radar_detect_ch, rfctl->radar_detect_bw, rfctl->radar_detect_offset, &hi, &lo) == _FALSE)\n\t\trtw_warn_on(1);\n\tif (rtw_chbw_to_freq_range(rfctl->pre_radar_detect_ch, rfctl->pre_radar_detect_bw, rfctl->pre_radar_detect_offset, &pre_hi, &pre_lo) == _FALSE)\n\t\trtw_warn_on(1);\n\n\tif (!rtw_is_range_a_in_b(hi, lo, pre_hi, pre_lo)) {\n\t\tif (rtw_is_range_a_in_b(pre_hi, pre_lo, hi, lo)) {\n\t\t\t/* currrent is supper set of previous */\n\t\t\tif (rtw_is_dfs_range(hi, lo))\n\t\t\t\tneeded = _TRUE;\n\t\t} else if (rtw_is_range_overlap(hi, lo, pre_hi, pre_lo)) {\n\t\t\t/* currrent is not supper set of previous, but has overlap */\n\t\t\tu32 new_hi, new_lo;\n\n\t\t\tif (lo < pre_lo) {\n\t\t\t\tnew_hi = pre_lo;\n\t\t\t\tnew_lo = lo;\n\t\t\t\tif (hi <= pre_lo || hi >= pre_hi) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\\n\"\n\t\t\t\t\t\t, hi, lo, pre_hi, pre_lo);\n\t\t\t\t\trtw_warn_on(1);\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t} else if (hi > pre_hi) {\n\t\t\t\tnew_hi = hi;\n\t\t\t\tnew_lo = pre_hi;\n\t\t\t\tif (lo >= pre_hi && lo <= pre_lo) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\\n\"\n\t\t\t\t\t\t, hi, lo, pre_hi, pre_lo);\n\t\t\t\t\trtw_warn_on(1);\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"hi:%u, lo:%u, pre_hi:%u, pre_lo:%u\\n\"\n\t\t\t\t\t, hi, lo, pre_hi, pre_lo);\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\tif (rtw_is_dfs_range(new_hi, new_lo))\n\t\t\t\tneeded = _TRUE;\n\t\t\t\n\t\t} else {\n\t\t\t/* no overlap */\n\t\t\tif (rtw_is_dfs_range(hi, lo))\n\t\t\t\tneeded = _TRUE;\n\t\t}\n\t}\n\nexit:\n\treturn needed;\n}\n\nbool _rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset)\n{\n\tbool ret = _FALSE;\n\tu32 hi = 0, lo = 0;\n\tu32 r_hi = 0, r_lo = 0;\n\tint i;\n\n\tif (rfctl->radar_detect_ch == 0)\n\t\tgoto exit;\n\n\tif (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (rtw_chbw_to_freq_range(rfctl->radar_detect_ch\n\t\t\t, rfctl->radar_detect_bw, rfctl->radar_detect_offset\n\t\t\t, &r_hi, &r_lo) == _FALSE) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (rtw_is_range_overlap(hi, lo, r_hi, r_lo))\n\t\tret = _TRUE;\n\nexit:\n\treturn ret;\n}\n\nbool rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl)\n{\n\treturn _rtw_rfctl_overlap_radar_detect_ch(rfctl\n\t\t\t\t, rfctl_to_dvobj(rfctl)->oper_channel\n\t\t\t\t, rfctl_to_dvobj(rfctl)->oper_bwmode\n\t\t\t\t, rfctl_to_dvobj(rfctl)->oper_ch_offset);\n}\n\nbool rtw_rfctl_is_tx_blocked_by_cac(struct rf_ctl_t *rfctl)\n{\n\treturn (rtw_rfctl_overlap_radar_detect_ch(rfctl) && IS_UNDER_CAC(rfctl));\n}\n\nbool rtw_chset_is_ch_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset)\n{\n\tbool ret = _FALSE;\n\tu32 hi = 0, lo = 0;\n\tint i;\n\n\tif (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE)\n\t\tgoto exit;\n\n\tfor (i = 0; ch_set[i].ChannelNum != 0; i++) {\n\t\tif (!rtw_ch2freq(ch_set[i].ChannelNum)) {\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!CH_IS_NON_OCP(&ch_set[i]))\n\t\t\tcontinue;\n\n\t\tif (lo <= rtw_ch2freq(ch_set[i].ChannelNum)\n\t\t\t&& rtw_ch2freq(ch_set[i].ChannelNum) <= hi\n\t\t) {\n\t\t\tret = _TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\nexit:\n\treturn ret;\n}\n\n/**\n * rtw_chset_update_non_ocp - update non_ocp_end_time according to the given @ch, @bw, @offset into @ch_set\n * @ch_set: the given channel set\n * @ch: channel number on which radar is detected\n * @bw: bandwidth on which radar is detected\n * @offset: bandwidth offset on which radar is detected\n * @ms: ms to add from now to update non_ocp_end_time, ms < 0 means use NON_OCP_TIME_MS\n */\nstatic void _rtw_chset_update_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset, int ms)\n{\n\tu32 hi = 0, lo = 0;\n\tint i;\n\n\tif (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE)\n\t\tgoto exit;\n\n\tfor (i = 0; ch_set[i].ChannelNum != 0; i++) {\n\t\tif (!rtw_ch2freq(ch_set[i].ChannelNum)) {\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (lo <= rtw_ch2freq(ch_set[i].ChannelNum)\n\t\t\t&& rtw_ch2freq(ch_set[i].ChannelNum) <= hi\n\t\t) {\n\t\t\tif (ms >= 0)\n\t\t\t\tch_set[i].non_ocp_end_time = rtw_get_current_time() + rtw_ms_to_systime(ms);\n\t\t\telse\n\t\t\t\tch_set[i].non_ocp_end_time = rtw_get_current_time() + rtw_ms_to_systime(NON_OCP_TIME_MS);\n\t\t}\n\t}\t\n\nexit:\n\treturn;\n}\n\ninline void rtw_chset_update_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset)\n{\n\t_rtw_chset_update_non_ocp(ch_set, ch, bw, offset, -1);\n}\n\ninline void rtw_chset_update_non_ocp_ms(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset, int ms)\n{\n\t_rtw_chset_update_non_ocp(ch_set, ch, bw, offset, ms);\n}\n#endif /* CONFIG_DFS_MASTER */\n\nbool rtw_choose_available_chbw(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec_bw, u8 *dec_offset, u8 d_flags)\n{\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tint i;\n\n\tif (!dec_ch || !dec_bw || !dec_offset) {\n\t\trtw_warn_on(1);\n\t\treturn _FAIL;\n\t}\n\n\tfor (i = 0; i < mlmeext->max_chan_nums; i++) {\n\n\t\t*dec_ch = mlmeext->channel_set[i].ChannelNum;\n\t\t*dec_bw = req_bw;\n\t\tif (*dec_bw == CHANNEL_WIDTH_20)\n\t\t\t*dec_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\telse\n\t\t\t*dec_offset = rtw_get_offset_by_ch(*dec_ch);\n\n\t\tif ((d_flags & RTW_CHF_2G) && *dec_ch <= 14)\n\t\t\tcontinue;\n\n\t\tif ((d_flags & RTW_CHF_5G)  && *dec_ch > 14)\n\t\t\tcontinue;\n\n\t\trtw_adjust_chbw(adapter, *dec_ch, dec_bw, dec_offset);\n\n\t\tif ((d_flags & RTW_CHF_DFS) && rtw_is_dfs_ch(*dec_ch, *dec_bw, *dec_offset))\n\t\t\tcontinue;\n\n\t\tif ((d_flags & RTW_CHF_LONG_CAC) && rtw_is_long_cac_ch(*dec_ch, *dec_bw, *dec_offset))\n\t\t\tcontinue;\n\n\t\tif ((d_flags & RTW_CHF_NON_DFS) && !rtw_is_dfs_ch(*dec_ch, *dec_bw, *dec_offset))\n\t\t\tcontinue;\n\n\t\tif ((d_flags & RTW_CHF_NON_LONG_CAC) && !rtw_is_long_cac_ch(*dec_ch, *dec_bw, *dec_offset))\n\t\t\tcontinue;\n\n\t\tif (!rtw_chset_is_ch_non_ocp(mlmeext->channel_set, *dec_ch, *dec_bw, *dec_offset))\n\t\t\tbreak;\n\t}\n\n\treturn (i < mlmeext->max_chan_nums)?_TRUE:_FALSE;\n}\n\nvoid dump_chplan_id_list(void *sel)\n{\n\tint i;\n\n\tfor (i = 0; i < RTW_CHPLAN_MAX; i++) {\n\t\tif (rtw_chplan_is_empty(i))\n\t\t\tcontinue;\n\n\t\tDBG_871X_SEL(sel, \"0x%02X \", i);\n\t}\n\n\tDBG_871X_SEL_NL(sel, \"0x7F\\n\");\n}\n\nvoid dump_chplan_test(void *sel)\n{\n\tint i, j;\n\n\t/* check invalid channel */\n\tfor (i = 0; i < RTW_RD_2G_MAX; i++) {\n\t\tfor (j = 0; j < RTW_ChannelPlan2G[i].Len; j++) {\n\t\t\tif (rtw_ch2freq(RTW_ChannelPlan2G[i].Channel[j]) == 0)\n\t\t\t\tDBG_871X_SEL_NL(sel, \"invalid ch:%u at (%d,%d)\\n\", RTW_ChannelPlan2G[i].Channel[j], i, j);\n\t\t}\n\t}\n\n\tfor (i = 0; i < RTW_RD_5G_MAX; i++) {\n\t\tfor (j = 0; j < RTW_ChannelPlan5G[i].Len; j++) {\n\t\t\tif (rtw_ch2freq(RTW_ChannelPlan5G[i].Channel[j]) == 0)\n\t\t\t\tDBG_871X_SEL_NL(sel, \"invalid ch:%u at (%d,%d)\\n\", RTW_ChannelPlan5G[i].Channel[j], i, j);\n\t\t}\n\t}\n}\n\nvoid dump_chset(void *sel, RT_CHANNEL_INFO *ch_set)\n{\n\tu8\ti;\n\n\tfor (i = 0; ch_set[i].ChannelNum != 0; i++) {\n\t\tDBG_871X_SEL_NL(sel, \"ch:%3u, freq:%u, scan_type:%d\"\n\t\t\t, ch_set[i].ChannelNum, rtw_ch2freq(ch_set[i].ChannelNum), ch_set[i].ScanType);\n\t\n\t\t#ifdef CONFIG_FIND_BEST_CHANNEL\n\t\tDBG_871X_SEL(sel, \", rx_count:%u\", ch_set[i].rx_count);\n\t\t#endif\n\t\t\n\t\t#ifdef CONFIG_DFS_MASTER\n\t\tif (rtw_is_dfs_ch(ch_set[i].ChannelNum, CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE)) {\n\t\t\tif (CH_IS_NON_OCP(&ch_set[i]))\n\t\t\t\tDBG_871X_SEL(sel, \", non_ocp:%d\"\n\t\t\t\t\t, rtw_systime_to_ms(ch_set[i].non_ocp_end_time - rtw_get_current_time()));\n\t\t\telse\n\t\t\t\tDBG_871X_SEL(sel, \", non_ocp:N/A\");\n\t\t}\n\t\t#endif\n\n\t\tDBG_871X_SEL(sel, \"\\n\");\n\t}\n\n\tDBG_871X_SEL_NL(sel, \"total ch number:%d\\n\", i);\n}\n\nvoid dump_cur_chset(void *sel, _adapter *adapter)\n{\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\n\tDBG_871X_SEL_NL(sel, \"Channel plan ID:0x%02X, 2G_PLS:%u, 5G_PLS:%u\\n\"\n\t\t\t, mlme->ChannelPlan, hal_data->Regulation2_4G, hal_data->Regulation5G);\n\tdump_chset(sel, mlmeext->channel_set);\n}\n\n/*\n * Search the @param ch in given @param ch_set\n * @ch_set: the given channel set\n * @ch: the given channel number\n * \n * return the index of channel_num in channel_set, -1 if not found\n */\nint rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch)\n{\n\tint i;\n\tfor(i=0;ch_set[i].ChannelNum!=0;i++){\n\t\tif(ch == ch_set[i].ChannelNum)\n\t\t\tbreak;\n\t}\n\t\n\tif(i >= ch_set[i].ChannelNum)\n\t\treturn -1;\n\treturn i;\n}\n\n/*\n * Check the @param ch is fit with setband setting of @param adapter\n * @adapter: the given adapter\n * @ch: the given channel number\n * \n * return _TRUE when check valid, _FALSE not valid\n */\nbool rtw_mlme_band_check(_adapter *adapter, const u32 ch)\n{\n\tif (adapter->setband == WIFI_FREQUENCY_BAND_AUTO /* 2.4G and 5G */\n\t\t|| (adapter->setband == WIFI_FREQUENCY_BAND_2GHZ && ch < 35) /* 2.4G only */\n\t\t|| (adapter->setband == WIFI_FREQUENCY_BAND_5GHZ && ch > 35) /* 5G only */\n\t) {\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\n/****************************************************************************\n\nFollowing are the initialization functions for WiFi MLME\n\n*****************************************************************************/\n\nint init_hw_mlme_ext(_adapter *padapter)\n{\n\tstruct\tmlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\t//set_opmode_cmd(padapter, infra_client_with_mlme);//removed\n\n\tset_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n\treturn _SUCCESS;\n}\n\nvoid init_mlme_default_rate_set(_adapter* padapter)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\tunsigned char\tmixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff};\n\tunsigned char\tmixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,};\n\tunsigned char\tsupported_mcs_set[16] = {0xff, 0xff, 0xff, 0x00, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\n\t_rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);\n\t_rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);\n\n\t_rtw_memcpy(pmlmeext->default_supported_mcs_set, supported_mcs_set, sizeof(pmlmeext->default_supported_mcs_set));\n}\n\nstatic void init_mlme_ext_priv_value(_adapter* padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tATOMIC_SET(&pmlmeext->event_seq, 0);\n\tpmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode\n#ifdef CONFIG_IEEE80211W\n\tpmlmeext->sa_query_seq = 0;\n\tpmlmeext->mgnt_80211w_IPN=0;\n\tpmlmeext->mgnt_80211w_IPN_rx=0;\n#endif //CONFIG_IEEE80211W\n\tpmlmeext->cur_channel = padapter->registrypriv.channel;\n\tpmlmeext->cur_bwmode = CHANNEL_WIDTH_20;\n\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\n\tpmlmeext->retry = 0;\n\n\tpmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode;\n\n\tinit_mlme_default_rate_set(padapter);\n\n\tif(pmlmeext->cur_channel > 14)\n\t\tpmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB;\n\telse\n\t\tpmlmeext->tx_rate = IEEE80211_CCK_RATE_1MB;\n\n\tmlmeext_set_scan_state(pmlmeext, SCAN_DISABLE);\n\tpmlmeext->sitesurvey_res.channel_idx = 0;\n\tpmlmeext->sitesurvey_res.bss_cnt = 0;\n\tpmlmeext->sitesurvey_res.scan_ch_ms = SURVEY_TO;\n\tpmlmeext->sitesurvey_res.rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;\n\tpmlmeext->sitesurvey_res.rx_ampdu_size = RX_AMPDU_SIZE_INVALID;\n\t#ifdef CONFIG_SCAN_BACKOP\n\tmlmeext_assign_scan_backop_flags_sta(pmlmeext, /*SS_BACKOP_EN|*/SS_BACKOP_PS_ANNC|SS_BACKOP_TX_RESUME);\n\tmlmeext_assign_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN|SS_BACKOP_PS_ANNC|SS_BACKOP_TX_RESUME);\n\tpmlmeext->sitesurvey_res.scan_cnt = 0;\n\tpmlmeext->sitesurvey_res.scan_cnt_max = RTW_SCAN_NUM_OF_CH;\n\tpmlmeext->sitesurvey_res.backop_ms = RTW_BACK_OP_CH_MS;\n\t#endif\n\t#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)\n\tpmlmeext->sitesurvey_res.is_sw_antdiv_bl_scan = 0;\n\t#endif\n\tpmlmeext->scan_abort = _FALSE;\n\n\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\tpmlmeinfo->reauth_count = 0;\n\tpmlmeinfo->reassoc_count = 0;\n\tpmlmeinfo->link_count = 0;\n\tpmlmeinfo->auth_seq = 0;\n\tpmlmeinfo->auth_algo = dot11AuthAlgrthm_Open;\n\tpmlmeinfo->key_index = 0;\n\tpmlmeinfo->iv = 0;\n\n\tpmlmeinfo->enc_algo = _NO_PRIVACY_;\n\tpmlmeinfo->authModeToggle = 0;\n\n\t_rtw_memset(pmlmeinfo->chg_txt, 0, 128);\n\n\tpmlmeinfo->slotTime = SHORT_SLOT_TIME;\n\tpmlmeinfo->preamble_mode = PREAMBLE_AUTO;\n\n\tpmlmeinfo->dialogToken = 0;\n\n\tpmlmeext->action_public_rxseq = 0xffff;\n\tpmlmeext->action_public_dialog_token = 0xff;\n}\n\nstatic int has_channel(RT_CHANNEL_INFO *channel_set,\n\t\t\t\t\t   u8 chanset_size,\n\t\t\t\t\t   u8 chan) {\n\tint i;\n\n\tfor (i = 0; i < chanset_size; i++) {\n\t\tif (channel_set[i].ChannelNum == chan) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic void init_channel_list(_adapter *padapter, RT_CHANNEL_INFO *channel_set,\n\t\t\t\t\t\t\t  u8 chanset_size,\n\t\t\t\t\t\t\t  struct p2p_channels *channel_list) {\n\tstruct registry_priv *regsty = adapter_to_regsty(padapter);\n\n\tstruct p2p_oper_class_map op_class[] = {\n\t\t{ IEEE80211G,  81,   1,  13,  1, BW20 },\n\t\t{ IEEE80211G,  82,  14,  14,  1, BW20 },\n#if 0 /* Do not enable HT40 on 2 GHz */\n\t\t{ IEEE80211G,  83,   1,   9,  1, BW40PLUS },\n\t\t{ IEEE80211G,  84,   5,  13,  1, BW40MINUS },\n#endif\n\t\t{ IEEE80211A, 115,  36,  48,  4, BW20 },\n\t\t{ IEEE80211A, 116,  36,  44,  8, BW40PLUS },\n\t\t{ IEEE80211A, 117,  40,  48,  8, BW40MINUS },\n\t\t{ IEEE80211A, 124, 149, 161,  4, BW20 },\n\t\t{ IEEE80211A, 125, 149, 169,  4, BW20 },\n\t\t{ IEEE80211A, 126, 149, 157,  8, BW40PLUS },\n\t\t{ IEEE80211A, 127, 153, 161,  8, BW40MINUS },\n\t\t{ -1, 0, 0, 0, 0, BW20 }\n\t};\n\n\tint cla, op;\n\n\tcla = 0;\n\n\tfor (op = 0; op_class[op].op_class; op++) {\n\t\tu8 ch;\n\t\tstruct p2p_oper_class_map *o = &op_class[op];\n\t\tstruct p2p_reg_class *reg = NULL;\n\n\t\tfor (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {\n\t\t\tif (!has_channel(channel_set, chanset_size, ch)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc))\n\t\t\t\tcontinue;\n\n\t\t\tif ((REGSTY_IS_BW_5G_SUPPORT(regsty, CHANNEL_WIDTH_40)) &&\n\t\t\t\t((BW40MINUS == o->bw) || (BW40PLUS == o->bw)))\n\t\t\t\tcontinue;\n\n\t\t\tif (reg == NULL) {\n\t\t\t\treg = &channel_list->reg_class[cla];\n\t\t\t\tcla++;\n\t\t\t\treg->reg_class = o->op_class;\n\t\t\t\treg->channels = 0;\n\t\t\t}\n\t\t\treg->channel[reg->channels] = ch;\n\t\t\treg->channels++;\n\t\t}\n\t}\n\tchannel_list->reg_classes = cla;\n\n}\n\nstatic u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set)\n{\n\tu8\tindex,chanset_size = 0;\n\tu8\tb5GBand = _FALSE, b2_4GBand = _FALSE;\n\tu8\tIndex2G = 0, Index5G=0;\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);\n\n\tif (!rtw_is_channel_plan_valid(ChannelPlan)) {\n\t\tDBG_871X(\"ChannelPlan ID %x error !!!!!\\n\",ChannelPlan);\n\t\treturn chanset_size;\n\t}\n\n\t_rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO)*MAX_CHANNEL_NUM);\n\n\tif (IsSupported24G(padapter->registrypriv.wireless_mode))\n\t\tb2_4GBand = _TRUE;\n\n\tif (IsSupported5G(padapter->registrypriv.wireless_mode))\n\t\tb5GBand = _TRUE;\n\n\tif (b2_4GBand) {\n\t\tif (RTW_CHPLAN_REALTEK_DEFINE == ChannelPlan)\n\t\t\tIndex2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G;\n\t\telse\n\t\t\tIndex2G = RTW_ChannelPlanMap[ChannelPlan].Index2G;\n\n\t\tfor (index = 0; index < RTW_ChannelPlan2G[Index2G].Len; index++) {\n\t\t\tchannel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index];\n\n\t\t\tif (RTW_CHPLAN_GLOBAL_DOAMIN == ChannelPlan\n\t\t\t\t|| RTW_CHPLAN_GLOBAL_NULL == ChannelPlan\n\t\t\t) {\n\t\t\t\t/* Channel 1~11 is active, and 12~14 is passive */\n\t\t\t\tif(channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11)\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_ACTIVE;\n\t\t\t\telse if((channel_set[chanset_size].ChannelNum  >= 12 && channel_set[chanset_size].ChannelNum  <= 14))\n\t\t\t\t\tchannel_set[chanset_size].ScanType  = SCAN_PASSIVE;\t\t\t\n\t\t\t} else if (RTW_CHPLAN_WORLD_WIDE_13 == ChannelPlan\n\t\t\t\t|| RTW_CHPLAN_WORLD_WIDE_5G == ChannelPlan\n\t\t\t\t|| RTW_RD_2G_WORLD == Index2G\n\t\t\t) {\n\t\t\t\t/* channel 12~13, passive scan */\n\t\t\t\tif(channel_set[chanset_size].ChannelNum <= 11)\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_ACTIVE;\n\t\t\t\telse\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_PASSIVE;\n\t\t\t} else {\n\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_ACTIVE;\n\t\t\t}\n\n\t\t\tchanset_size++;\n\t\t}\n\t}\n\n\tif (b5GBand) {\n\t\tif (RTW_CHPLAN_REALTEK_DEFINE == ChannelPlan)\n\t\t\tIndex5G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index5G;\n\t\telse\n\t\t\tIndex5G = RTW_ChannelPlanMap[ChannelPlan].Index5G;\n\n\t\tfor (index = 0; index < RTW_ChannelPlan5G[Index5G].Len; index++) {\n#ifdef CONFIG_DFS\n\t\t\tchannel_set[chanset_size].ChannelNum = RTW_ChannelPlan5G[Index5G].Channel[index];\n\t\t\tif ( channel_set[chanset_size].ChannelNum <= 48 \n\t\t\t\t|| channel_set[chanset_size].ChannelNum >= 149 )\n\t\t\t{\n\t\t\t\tif (RTW_CHPLAN_WORLD_WIDE_5G == ChannelPlan) /* passive scan for all 5G channels */\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_PASSIVE;\n\t\t\t\telse\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_ACTIVE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_PASSIVE;\n\t\t\t}\n\t\t\tchanset_size++;\n#else /* CONFIG_DFS */\n\t\t\tif (RTW_ChannelPlan5G[Index5G].Channel[index] <= 48\n\t\t\t\t|| RTW_ChannelPlan5G[Index5G].Channel[index] >= 149\n\t\t\t) {\n\t\t\t\tchannel_set[chanset_size].ChannelNum = RTW_ChannelPlan5G[Index5G].Channel[index];\n\t\t\t\tif (RTW_CHPLAN_WORLD_WIDE_5G == ChannelPlan) /* passive scan for all 5G channels */\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_PASSIVE;\n\t\t\t\telse\n\t\t\t\t\tchannel_set[chanset_size].ScanType = SCAN_ACTIVE;\n\t\t\t\tDBG_871X(\"%s(): channel_set[%d].ChannelNum = %d\\n\", __FUNCTION__, chanset_size, channel_set[chanset_size].ChannelNum);\n\t\t\t\tchanset_size++;\n\t\t\t}\n#endif /* CONFIG_DFS */\n\t\t}\n\t}\n\n\tif (RTW_CHPLAN_REALTEK_DEFINE == ChannelPlan) {\n\t\thal_data->Regulation2_4G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.regd;\n\t\thal_data->Regulation5G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.regd;\n\t} else {\n\t\thal_data->Regulation2_4G = RTW_ChannelPlanMap[ChannelPlan].regd;\n\t\thal_data->Regulation5G = RTW_ChannelPlanMap[ChannelPlan].regd;\n\t}\n\n\tDBG_871X(FUNC_ADPT_FMT\" ChannelPlan ID:0x%02x, ch num:%d\\n\"\n\t\t, FUNC_ADPT_ARG(padapter), ChannelPlan, chanset_size);\n\n\treturn chanset_size;\n}\n\nint\tinit_mlme_ext_priv(_adapter* padapter)\n{\n\tint\tres = _SUCCESS;\n\tstruct registry_priv* pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().\n\t//_rtw_memset((u8 *)pmlmeext, 0, sizeof(struct mlme_ext_priv));\n\n\tpmlmeext->padapter = padapter;\n\n\t//fill_fwpriv(padapter, &(pmlmeext->fwpriv));\n\n\tinit_mlme_ext_priv_value(padapter);\n\tpmlmeinfo->bAcceptAddbaReq = pregistrypriv->bAcceptAddbaReq;\n\t\n\tinit_mlme_ext_timer(padapter);\n\n#ifdef CONFIG_AP_MODE\n\tinit_mlme_ap_info(padapter);\t\n#endif\n\n\tpmlmeext->max_chan_nums = init_channel_set(padapter, pmlmepriv->ChannelPlan,pmlmeext->channel_set);\n\tinit_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list);\n\tpmlmeext->last_scan_time = 0;\n\tpmlmeext->mlmeext_init = _TRUE;\n\n\n#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\t\n\tpmlmeext->active_keep_alive_check = _TRUE;\n#else\n\tpmlmeext->active_keep_alive_check = _FALSE;\n#endif\n\n#ifdef DBG_FIXED_CHAN\t\t\n\tpmlmeext->fixed_chan = 0xFF;\t\n#endif\n\n\treturn res;\n\n}\n\nvoid free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext)\n{\n\t_adapter *padapter = pmlmeext->padapter;\n\n\tif (!padapter)\n\t\treturn;\n\n\tif (rtw_is_drv_stopped(padapter)) {\n\t\t_cancel_timer_ex(&pmlmeext->survey_timer);\n\t\t_cancel_timer_ex(&pmlmeext->link_timer);\n\t\t//_cancel_timer_ex(&pmlmeext->ADDBA_timer);\n\t}\n}\n\nstatic u8 cmp_pkt_chnl_diff(_adapter *padapter,u8* pframe,uint packet_len)\n{\t// if the channel is same, return 0. else return channel differential\t\n\tuint len;\n\tu8 channel;\t\n\tu8 *p;\t\t\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, _DSSET_IE_, &len, packet_len - _BEACON_IE_OFFSET_);\t\n\tif (p)\t\n\t{\t\n\t\tchannel = *(p + 2);\t\t\n\t\tif(padapter->mlmeextpriv.cur_channel >= channel)\t\t\n\t\t{\t\t\t\n\t\t\treturn (padapter->mlmeextpriv.cur_channel - channel);\t\t\n\t\t}\t\t\n\t\telse\t\t\n\t\t{\t\t\t\n\t\t\treturn (channel-padapter->mlmeextpriv.cur_channel);\t\t\n\t\t}\t\n\t}\t\n\telse\n\t{\t\t\n\t\treturn 0;\t\n\t}\n}\n\nstatic void _mgt_dispatcher(_adapter *padapter, struct mlme_handler *ptable, union recv_frame *precv_frame)\n{\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\tu8 *pframe = precv_frame->u.hdr.rx_data; \n\n\t  if(ptable->func)\n        {\n       \t //receive the frames that ra(a1) is my address or ra(a1) is bc address.\n\t\tif (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) &&\n\t\t\t!_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN)) \n\t\t{\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tptable->func(padapter, precv_frame);\n        }\n\t\n}\n\nvoid mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tint index;\n\tstruct mlme_handler *ptable;\n#ifdef CONFIG_AP_MODE\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n#endif //CONFIG_AP_MODE\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tstruct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe));\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,\n\t\t (\"+mgt_dispatcher: type(0x%x) subtype(0x%x)\\n\",\n\t\t  GetFrameType(pframe), GetFrameSubType(pframe)));\n\n#if 0\n\t{\n\t\tu8 *pbuf;\n\t\tpbuf = GetAddr1Ptr(pframe);\n\t\tDBG_871X(\"A1-%x:%x:%x:%x:%x:%x\\n\", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));\n\t\tpbuf = GetAddr2Ptr(pframe);\n\t\tDBG_871X(\"A2-%x:%x:%x:%x:%x:%x\\n\", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));\n\t\tpbuf = GetAddr3Ptr(pframe);\n\t\tDBG_871X(\"A3-%x:%x:%x:%x:%x:%x\\n\", *pbuf, *(pbuf+1), *(pbuf+2), *(pbuf+3), *(pbuf+4), *(pbuf+5));\n\t}\n#endif\n\n\tif (GetFrameType(pframe) != WIFI_MGT_TYPE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, (\"mgt_dispatcher: type(0x%x) error!\\n\", GetFrameType(pframe)));\n\t\treturn;\n\t}\n\n\t//receive the frames that ra(a1) is my address or ra(a1) is bc address.\n\tif (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN) &&\n\t\t!_rtw_memcmp(GetAddr1Ptr(pframe), bc_addr, ETH_ALEN))\n\t{\n\t\treturn;\n\t}\n\n\tptable = mlme_sta_tbl;\n\n\tindex = GetFrameSubType(pframe) >> 4;\n\n#ifdef CONFIG_TDLS\n\tif((index << 4)==WIFI_ACTION){\n\t\t/* category==public (4), action==TDLS_DISCOVERY_RESPONSE */\n\t\tif (*(pframe+24) == RTW_WLAN_CATEGORY_PUBLIC && *(pframe+25) == TDLS_DISCOVERY_RESPONSE) {\n\t\t\tDBG_871X(\"[TDLS] Recv %s from \"MAC_FMT\"\\n\", rtw_tdls_action_txt(TDLS_DISCOVERY_RESPONSE), MAC_ARG(GetAddr2Ptr(pframe)));\n\t\t\tOn_TDLS_Dis_Rsp(padapter, precv_frame);\n\t\t}\n\t}\n#endif //CONFIG_TDLS\n\n\tif (index >= (sizeof(mlme_sta_tbl) /sizeof(struct mlme_handler)))\n\t{\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"Currently we do not support reserved sub-fr-type=%d\\n\", index));\n\t\treturn;\n\t}\n\tptable += index;\n\n#if 1\n\tif (psta != NULL)\n\t{\n\t\tif (GetRetry(pframe))\n\t\t{\n\t\t\tif (precv_frame->u.hdr.attrib.seq_num == psta->RxMgmtFrameSeqNum)\n\t\t\t{\n\t\t\t\t/* drop the duplicate management frame */\n\t\t\t\tpdbgpriv->dbg_rx_dup_mgt_frame_drop_count++;\n\t\t\t\tDBG_871X(\"Drop duplicate management frame with seq_num = %d.\\n\", precv_frame->u.hdr.attrib.seq_num);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tpsta->RxMgmtFrameSeqNum = precv_frame->u.hdr.attrib.seq_num;\n\t}\n#else\n\n\tif(GetRetry(pframe))\n\t{\n\t\t//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"drop due to decache!\\n\"));\n\t\t//return;\n\t}\n#endif\n\n#ifdef CONFIG_AP_MODE\n\tswitch (GetFrameSubType(pframe)) \n\t{\n\t\tcase WIFI_AUTH:\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t\tptable->func = &OnAuth;\n\t\t\telse\n\t\t\t\tptable->func = &OnAuthClient;\n\t\t\t//pass through\n\t\tcase WIFI_ASSOCREQ:\n\t\tcase WIFI_REASSOCREQ:\n\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\t\n#ifdef CONFIG_HOSTAPD_MLME\t\t\t\t\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t\trtw_hostapd_mlme_rx(padapter, precv_frame);\n#endif\t\t\t\n\t\t\tbreak;\n\t\tcase WIFI_PROBEREQ:\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t{\n#ifdef CONFIG_HOSTAPD_MLME\t\t\n\t\t\t\trtw_hostapd_mlme_rx(padapter, precv_frame);\t\t\n#else\n\t\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\n#endif\n\t\t\t}\n\t\t\telse\n\t\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\n\t\t\tbreak;\n\t\tcase WIFI_BEACON:\t\t\t\n\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\n\t\t\tbreak;\n\t\tcase WIFI_ACTION:\n\t\t\t//if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t_mgt_dispatcher(padapter, ptable, precv_frame);\t\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t\trtw_hostapd_mlme_rx(padapter, precv_frame);\t\t\t\n\t\t\tbreak;\n\t}\n#else\n\n\t_mgt_dispatcher(padapter, ptable, precv_frame);\t\n\t\n#endif\n\n}\n\n#ifdef CONFIG_P2P\nu32 p2p_listen_state_process(_adapter *padapter, unsigned char *da)\n{\n\tbool response = _TRUE;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif(padapter->cfg80211_wdinfo.is_ro_ch == _FALSE\n\t\t\t|| rtw_get_oper_ch(padapter) != padapter->wdinfo.listen_channel\n\t\t\t|| adapter_wdev_data(padapter)->p2p_enabled == _FALSE\n\t\t\t|| padapter->mlmepriv.wps_probe_resp_ie == NULL\n\t\t\t|| padapter->mlmepriv.p2p_probe_resp_ie == NULL\n\t\t)\n\t\t{\n#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_871X(\"DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p, \",\n\t\t\t\tadapter_wdev_data(padapter)->p2p_enabled,\n\t\t\t\tpadapter->mlmepriv.wps_probe_resp_ie,\n\t\t\t\tpadapter->mlmepriv.p2p_probe_resp_ie);\n\t\t\tDBG_871X(\"is_ro_ch:%d, op_ch:%d, p2p_listen_channel:%d\\n\", \n\t\t\t\tpadapter->cfg80211_wdinfo.is_ro_ch,\n\t\t\t\trtw_get_oper_ch(padapter),\n\t\t\t\tpadapter->wdinfo.listen_channel);\n#endif\n\t\t\tresponse = _FALSE;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\n\tif( padapter->wdinfo.driver_interface == DRIVER_WEXT )\n\t{\n\t\t//\tdo nothing if the device name is empty\n\t\tif ( !padapter->wdinfo.device_name_len )\n\t\t{\n\t\t\tresponse\t= _FALSE;\n\t\t}\n\t}\n\n\tif (response == _TRUE)\n\t\tissue_probersp_p2p( padapter, da);\n\t\n\treturn _SUCCESS;\n}\n#endif //CONFIG_P2P\n\n\n/****************************************************************************\n\nFollowing are the callback functions for each subtype of the management frames\n\n*****************************************************************************/\n\nunsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned int\tielen;\n\tunsigned char\t*p;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t*cur = &(pmlmeinfo->network);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint len = precv_frame->u.hdr.len;\n\tu8 is_valid_p2p_probereq = _FALSE;\n\n#ifdef CONFIG_ATMEL_RC_PATCH\n\tu8 *target_ie=NULL, *wps_ie=NULL;\n\tu8 *start;\n\tuint search_len = 0, wps_ielen = 0, target_ielen = 0;\n\tstruct sta_info\t*psta;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n#endif\n\n\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\tstruct rx_pkt_attrib\t*pattrib = &precv_frame->u.hdr.attrib;\n\tu8 wifi_test_chk_rate = 1;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ((pwdinfo->driver_interface == DRIVER_CFG80211)\n\t\t&& !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)\n\t\t&& (GET_CFG80211_REPORT_MGMT(adapter_wdev_data(padapter), IEEE80211_STYPE_PROBE_REQ) == _TRUE)\n\t\t ) {\n\t\trtw_cfg80211_rx_probe_request(padapter, pframe, len);\n\t\treturn _SUCCESS;\n\t}\n#endif /* CONFIG_IOCTL_CFG80211 */\n\n\tif (\t!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && \n\t\t!rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) && \n\t\t!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) &&\n\t\t!rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) &&\n\t\t!rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)\n\t   )\n\t{\n\t\t//\tCommented by Albert 2011/03/17\n\t\t//\tmcs_rate = 0 -> CCK 1M rate\n\t\t//\tmcs_rate = 1 -> CCK 2M rate\n\t\t//\tmcs_rate = 2 -> CCK 5.5M rate\n\t\t//\tmcs_rate = 3 -> CCK 11M rate\n\t\t//\tIn the P2P mode, the driver should not support the CCK rate\n\n\t\t//\tCommented by Kurt 2012/10/16\n\t\t//\tIOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client\n        if (padapter->registrypriv.wifi_spec == 1)\n        {\n            if ( pattrib->data_rate <= 3 )\n            {\n                wifi_test_chk_rate = 0;\n            }\n        }\n\n\t\tif( wifi_test_chk_rate == 1 )\n\t\t{\n\t\t\tif((is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len)) == _TRUE)\n\t\t\t{\n\t\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))\n\t\t\t\t{\n\t\t\t\t\t// FIXME\n\t\t\t\t\tif( padapter->wdinfo.driver_interface == DRIVER_WEXT )\n\t\t\t\t\t\treport_survey_event(padapter, precv_frame);\n\n\t\t\t\t\tp2p_listen_state_process( padapter,  get_sa(pframe));\n\n\t\t\t\t\treturn _SUCCESS;\t\n\t\t\t\t}\n\n\t\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t\t{\n\t\t\t\t\tgoto _continue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n_continue:\n#endif //CONFIG_P2P\n\n\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE))\n\t{\n\t\treturn _SUCCESS;\n\t}\n\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE && \n\t\tcheck_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE)==_FALSE)\n\t{\n\t\treturn _SUCCESS;\n\t}\n\n\n\t//DBG_871X(\"+OnProbeReq\\n\");\n\n\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t\tif ((wps_ie = rtw_get_wps_ie(\n\t\t\tpframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_,\n\t\t\tlen - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_,\n\t\t\t NULL, &wps_ielen))) {\n\t\t\n\t\t\ttarget_ie = rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_MANUFACTURER, NULL, &target_ielen);\n\t\t}\n\t\tif ((target_ie && (target_ielen == 4)) && (_TRUE ==_rtw_memcmp((void *)target_ie, \"Ozmo\",4 ))) {\n\t\t\t//psta->flag_atmel_rc = 1;\n\t\t\tunsigned char *sa_addr = get_sa(pframe);\n\t\t\tprintk(\"%s: Find Ozmo RC -- %02x:%02x:%02x:%02x:%02x:%02x  \\n\\n\",\n\t\t\t\t__func__, *sa_addr, *(sa_addr+1), *(sa_addr+2), *(sa_addr+3), *(sa_addr+4), *(sa_addr+5));\n\t\t\t_rtw_memcpy(  pstapriv->atmel_rc_pattern, get_sa(pframe), ETH_ALEN);\n\t\t}\n#endif\n\n\n#ifdef CONFIG_AUTO_AP_MODE\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE &&\n\t\t\tpmlmepriv->cur_network.join_res == _TRUE)\n\t{\n\t\t_irqL\tirqL;\n\t\tstruct sta_info\t*psta;\n\t\tu8 *mac_addr, *peer_addr;\n\t\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\tu8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A};\n\t\t//EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2]\n\n\t\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, (int *)&ielen,\n\t\t\tlen - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);\n\n\t\tif(!p || ielen !=14)\n\t\t\tgoto _non_rc_device;\n\n\t\tif(!_rtw_memcmp(p+2, RC_OUI, sizeof(RC_OUI)))\n\t\t\tgoto _non_rc_device;\n\n\t\tif(!_rtw_memcmp(p+6, get_sa(pframe), ETH_ALEN))\n\t\t{\n\t\t\tDBG_871X(\"%s, do rc pairing (\"MAC_FMT\"), but mac addr mismatch!(\"MAC_FMT\")\\n\", __FUNCTION__,\n\t\t\t\tMAC_ARG(get_sa(pframe)), MAC_ARG(p+6));\n\n\t\t\tgoto _non_rc_device;\n\t\t}\n\n\t\tDBG_871X(\"%s, got the pairing device(\"MAC_FMT\")\\n\", __FUNCTION__,  MAC_ARG(get_sa(pframe)));\n\n\t\t//new a station\n\t\tpsta = rtw_get_stainfo(pstapriv, get_sa(pframe));\n\t\tif (psta == NULL)\n\t\t{\n\t\t\t// allocate a new one\n\t\t\tDBG_871X(\"going to alloc stainfo for rc=\"MAC_FMT\"\\n\",  MAC_ARG(get_sa(pframe)));\n\t\t\tpsta = rtw_alloc_stainfo(pstapriv, get_sa(pframe));\n\t\t\tif (psta == NULL)\n\t\t\t{\n\t\t\t\t//TODO:\n\t\t\t\tDBG_871X(\" Exceed the upper limit of supported clients...\\n\");\n\t\t\t\treturn _SUCCESS;\n\t\t\t}\n\n\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\tif (rtw_is_list_empty(&psta->asoc_list))\n\t\t\t{\n\t\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\t\trtw_list_insert_tail(&psta->asoc_list, &pstapriv->asoc_list);\n\t\t\t\tpstapriv->asoc_list_cnt++;\n\t\t\t}\n\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\t\t//generate pairing ID\n\t\t\tmac_addr = adapter_mac_addr(padapter);\n\t\t\tpeer_addr = psta->hwaddr;\n\t\t\tpsta->pid = (u16)(((mac_addr[4]<<8) + mac_addr[5]) + ((peer_addr[4]<<8) + peer_addr[5]));\n\n\t\t\t//update peer stainfo\n\t\t\tpsta->isrc = _TRUE;\n\t\t\t//psta->aid = 0;\n\t\t\t//psta->mac_id = 2;\n\n\t\t\t/* get a unique AID */\n\t\t\tif (psta->aid > 0) {\n\t\t\t\tDBG_871X(\"old AID %d\\n\", psta->aid);\n\t\t\t} else {\n\t\t\t\tfor (psta->aid = 1; psta->aid <= NUM_STA; psta->aid++)\n\t\t\t\t\tif (pstapriv->sta_aid[psta->aid - 1] == NULL)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\tif (psta->aid > pstapriv->max_num_sta) {\n\t\t\t\t\tpsta->aid = 0;\n\t\t\t\t\tDBG_871X(\"no room for more AIDs\\n\");\n\t\t\t\t\treturn _SUCCESS;\n\t\t\t\t} else {\n\t\t\t\t\tpstapriv->sta_aid[psta->aid - 1] = psta;\n\t\t\t\t\tDBG_871X(\"allocate new AID = (%d)\\n\", psta->aid);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tpsta->qos_option = 1;\n\t\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\t\tpsta->ieee8021x_blocked = _FALSE;\n#ifdef CONFIG_80211N_HT\n\t\t\tpsta->htpriv.ht_option = _TRUE;\n\t\t\tpsta->htpriv.ampdu_enable = _FALSE;\n\t\t\tpsta->htpriv.sgi_20m = _FALSE;\n\t\t\tpsta->htpriv.sgi_40m = _FALSE;\n\t\t\tpsta->htpriv.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\tpsta->htpriv.agg_enable_bitmap = 0x0;//reset\n\t\t\tpsta->htpriv.candidate_tid_bitmap = 0x0;//reset\n#endif\n\n\t\t\trtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE);\n\n\t\t\t_rtw_memset((void*)&psta->sta_stats, 0, sizeof(struct stainfo_stats));\n\n\t\t\t_enter_critical_bh(&psta->lock, &irqL);\n\t\t\tpsta->state |= _FW_LINKED;\n\t\t\t_exit_critical_bh(&psta->lock, &irqL);\n\n\t\t\treport_add_sta_event(padapter, psta->hwaddr, psta->aid);\n\n\t\t}\n\n\t\tissue_probersp(padapter, get_sa(pframe), _FALSE);\n\n\t\treturn _SUCCESS;\n\n\t}\n\n_non_rc_device:\n\n\treturn _SUCCESS;\n\n#endif //CONFIG_AUTO_AP_MODE\n\t\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&\n\t\tcheck_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))\n\t{\n\t\t//don't process probe req\n\t\treturn _SUCCESS;\n\t}\n#endif\t\n\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ielen,\n\t\t\tlen - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);\n\n\n\t//check (wildcard) SSID \n\tif (p != NULL)\n\t{\n\t\tif(is_valid_p2p_probereq == _TRUE)\n\t\t{\n\t\t\tgoto _issue_probersp;\n\t\t}\n\n\t\tif ( (ielen != 0 && _FALSE ==_rtw_memcmp((void *)(p+2), (void *)cur->Ssid.Ssid, cur->Ssid.SsidLength))\n\t\t\t|| (ielen == 0 && pmlmeinfo->hidden_ssid_mode)\n\t\t)\n\t\t{\n\t\t\treturn _SUCCESS;\n\t\t}\n\n_issue_probersp:\n\t\tif(((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && \n\t\t\tpmlmepriv->cur_network.join_res == _TRUE)) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))\n\t\t{\n\t\t\t//DBG_871X(\"+issue_probersp during ap mode\\n\");\n\t\t\tissue_probersp(padapter, get_sa(pframe), is_valid_p2p_probereq);\t\t\n\t\t}\n\n\t}\n\n\treturn _SUCCESS;\n\n}\n\nunsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct sta_info\t\t*psta;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tu8\t*pframe = precv_frame->u.hdr.rx_data;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &padapter->wdinfo;\n#endif\n\n\n#ifdef CONFIG_P2P\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))\n\t{\n\t\tif ( _TRUE == pwdinfo->tx_prov_disc_info.benable )\n\t\t{\n\t\t\tif( _rtw_memcmp( pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr2Ptr(pframe), ETH_ALEN ) )\n\t\t\t{\n\t\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))\n\t\t\t\t{\n\t\t\t\t\tpwdinfo->tx_prov_disc_info.benable = _FALSE;\n\t\t\t\t\tissue_p2p_provision_request( padapter,\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->tx_prov_disc_info.ssid.Ssid, \n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->tx_prov_disc_info.ssid.SsidLength,\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->tx_prov_disc_info.peerDevAddr );\n\t\t\t\t}\n\t\t\t\telse if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )\n\t\t\t\t{\n\t\t\t\t\tpwdinfo->tx_prov_disc_info.benable = _FALSE;\n\t\t\t\t\tissue_p2p_provision_request( padapter,\n\t\t\t\t\t\t\t\t\t\t\t\tNULL, \n\t\t\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->tx_prov_disc_info.peerDevAddr );\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t}\n\t\treturn _SUCCESS;\n\t}\n\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))\n\t{\n\t\tif ( _TRUE == pwdinfo->nego_req_info.benable )\n\t\t{\n\t\t\tDBG_871X( \"[%s] P2P State is GONEGO ING!\\n\", __FUNCTION__ );\n\t\t\tif( _rtw_memcmp( pwdinfo->nego_req_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN ) )\n\t\t\t{\n\t\t\t\tpwdinfo->nego_req_info.benable = _FALSE;\n\t\t\t\tissue_p2p_GO_request( padapter, pwdinfo->nego_req_info.peerDevAddr);\n\t\t\t}\n\t\t}\n\t}\n\telse if( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) )\n\t{\n\t\tif ( _TRUE == pwdinfo->invitereq_info.benable )\n\t\t{\n\t\t\tDBG_871X( \"[%s] P2P_STATE_TX_INVITE_REQ!\\n\", __FUNCTION__ );\n\t\t\tif( _rtw_memcmp( pwdinfo->invitereq_info.peer_macaddr, GetAddr2Ptr(pframe), ETH_ALEN ) )\n\t\t\t{\n\t\t\t\tpwdinfo->invitereq_info.benable = _FALSE;\n\t\t\t\tissue_p2p_invitation_request( padapter, pwdinfo->invitereq_info.peer_macaddr );\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n\n\tif (mlmeext_chk_scan_state(pmlmeext, SCAN_PROCESS)) {\n\t\treport_survey_event(padapter, precv_frame);\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\treport_survey_event(padapter->pbuddy_adapter, precv_frame);\t\n#endif\n\t\treturn _SUCCESS;\n\t}\n\n\t#if 0 //move to validate_recv_mgnt_frame\n\tif (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))\n\t{\n\t\tif (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\t{\n\t\t\tif ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)\n\t\t\t{\n\t\t\t\tpsta->sta_stats.rx_mgnt_pkts++;\n\t\t\t}\n\t\t}\n\t}\n\t#endif\n\t\n\treturn _SUCCESS;\n\t\n}\n\nunsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tint cam_idx;\n\tstruct sta_info\t*psta;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_priv\t*pstapriv = &padapter->stapriv;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint len = precv_frame->u.hdr.len;\n\tWLAN_BSSID_EX *pbss;\n\tint ret = _SUCCESS;\n\tu8 *p = NULL;\n\tu32 ielen = 0;\n#ifdef CONFIG_TDLS\n\tstruct sta_info *ptdls_sta;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n#endif /* CONFIG_TDLS */\n\n#ifdef CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR\n\tp = rtw_get_ie(pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ielen, precv_frame->u.hdr.len -sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_);\n\tif ((p != NULL) && (ielen > 0))\n\t{\n\t\tif ((*(p + 1 + ielen) == 0x2D) && (*(p + 2 + ielen) != 0x2D))\n\t\t{\n\t\t\t/* Invalid value 0x2D is detected in Extended Supported Rates (ESR) IE. Try to fix the IE length to avoid failed Beacon parsing. */\t\n\t\t       \tDBG_871X(\"[WIFIDBG] Error in ESR IE is detected in Beacon of BSSID:\"MAC_FMT\". Fix the length of ESR IE to avoid failed Beacon parsing.\\n\", MAC_ARG(GetAddr3Ptr(pframe)));\n\t\t       \t*(p + 1) = ielen - 1;\n\t\t}\n\t}\n#endif\n\n\tif (mlmeext_chk_scan_state(pmlmeext, SCAN_PROCESS)) {\n\t\treport_survey_event(padapter, precv_frame);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\treport_survey_event(padapter->pbuddy_adapter, precv_frame);\t\n#endif\n\t\treturn _SUCCESS;\n\t}\n\n\tif (_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))\n\t{\n\t\tif (pmlmeinfo->state & WIFI_FW_AUTH_NULL)\n\t\t{\n\t\t\t//we should update current network before auth, or some IE is wrong\n\t\t\tpbss = (WLAN_BSSID_EX*)rtw_malloc(sizeof(WLAN_BSSID_EX));\n\t\t\tif (pbss) {\n\t\t\t\tif (collect_bss_info(padapter, precv_frame, pbss) == _SUCCESS) {\n\t\t\t\t\tstruct beacon_keys recv_beacon;\n\n\t\t\t\t\tupdate_network(&(pmlmepriv->cur_network.network), pbss, padapter, _TRUE);\n\t\t\t\t\trtw_get_bcn_info(&(pmlmepriv->cur_network));\n\n\t\t\t\t\t// update bcn keys\n\t\t\t\t\tif (rtw_get_bcn_keys(padapter, pframe, len, &recv_beacon) == _TRUE) {\n\t\t\t\t\t\tDBG_871X(\"%s: beacon keys ready\\n\", __func__);\n\t\t\t\t\t\t_rtw_memcpy(&pmlmepriv->cur_beacon_keys,\n\t\t\t\t\t\t\t&recv_beacon, sizeof(recv_beacon));\n\t\t\t\t\t\tpmlmepriv->new_beacon_cnts = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s: get beacon keys failed\\n\", __func__);\n\t\t\t\t\t\t_rtw_memset(&pmlmepriv->cur_beacon_keys, 0, sizeof(recv_beacon));\n\t\t\t\t\t\tpmlmepriv->new_beacon_cnts = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trtw_mfree((u8*)pbss, sizeof(WLAN_BSSID_EX));\n\t\t\t}\n\n\t\t\t//check the vendor of the assoc AP\n\t\t\tpmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe+sizeof(struct rtw_ieee80211_hdr_3addr), len-sizeof(struct rtw_ieee80211_hdr_3addr));\t\t\t\t\n\n\t\t\t//update TSF Value\n\t\t\tupdate_TSF(pmlmeext, pframe, len);\n\n\t\t\t//reset for adaptive_early_32k\n\t\t\tpmlmeext->adaptive_tsf_done = _FALSE;\n\t\t\tpmlmeext->DrvBcnEarly = 0xff;\n\t\t\tpmlmeext->DrvBcnTimeOut = 0xff;\n\t\t\tpmlmeext->bcn_cnt = 0;\n\t\t\t_rtw_memset(pmlmeext->bcn_delay_cnt, 0, sizeof(pmlmeext->bcn_delay_cnt));\n\t\t\t_rtw_memset(pmlmeext->bcn_delay_ratio, 0, sizeof(pmlmeext->bcn_delay_ratio));\n\n#ifdef CONFIG_P2P_PS\n\t\t\tprocess_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));\n#endif //CONFIG_P2P_PS\n\n#if defined(CONFIG_P2P)&&defined(CONFIG_CONCURRENT_MODE)\n\t\t\tif (padapter->registrypriv.wifi_spec) {\n\t\t\t\tif (process_p2p_cross_connect_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN)) == _FALSE) {\n\t\t\t\t\tif((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) {\n\t\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"no issue auth, P2P cross-connect does not permit\\n \");\n\t\t\t\t\t\treturn _SUCCESS;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif // CONFIG_P2P CONFIG_P2P and CONFIG_CONCURRENT_MODE\n\n\t\t\t//start auth\n\t\t\tstart_clnt_auth(padapter);\n\n\t\t\treturn _SUCCESS;\n\t\t}\n\n\t\tif(((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) && (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))\n\t\t{\n\t\t\tif ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)\n\t\t\t{\n\t\t\t\t#ifdef CONFIG_PATCH_JOIN_WRONG_CHANNEL        \n\t\t\t\t//Merge from 8712 FW code\n\t\t\t\tif (cmp_pkt_chnl_diff(padapter,pframe,len) != 0)        \n\t\t\t\t{            // join wrong channel, deauth and reconnect           \n\t\t\t\t\tissue_deauth(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_DEAUTH_LEAVING);\n\n\t\t\t\t\treport_del_sta_event(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL, _TRUE);\n\t\t\t\t\tpmlmeinfo->state &= (~WIFI_FW_ASSOC_SUCCESS);    \t\t\n\t\t\t\t\treturn _SUCCESS;\n\t\t\t\t}        \n\t\t\t\t#endif //CONFIG_PATCH_JOIN_WRONG_CHANNEL\n\n\t\t\t\tret = rtw_check_bcn_info(padapter, pframe, len);\n\t\t\t\tif (!ret) {\n\t\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"ap has changed, disconnect now\\n \");\n\t\t\t\t\t\treceive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0);\n\t\t\t\t\t\treturn _SUCCESS;\n\t\t\t\t}\n\t\t\t\t//update WMM, ERP in the beacon\n\t\t\t\t//todo: the timer is used instead of the number of the beacon received\n\t\t\t\tif ((sta_rx_pkts(psta) & 0xf) == 0)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"update_bcn_info\\n\");\n\t\t\t\t\tupdate_beacon_info(padapter, pframe, len, psta);\n\t\t\t\t}\n\n\t\t\t\tadaptive_early_32k(pmlmeext, pframe, len);\t\t\t \t\n\t\t\t\t\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\n\t\t\t\tif (padapter->tdlsinfo.ch_switch_prohibited == _FALSE)\n\t\t\t\t{\n\t\t\t\t\t/* Send TDLS Channel Switch Request when receiving Beacon */\n\t\t\t\t\tif ((padapter->tdlsinfo.chsw_info.ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) && (pmlmeext->cur_channel == rtw_get_oper_ch(padapter))) {\n\t\t\t\t\t\tptdlsinfo->chsw_info.ch_sw_state |= TDLS_WAIT_CH_RSP_STATE;\n\t\t\t\t\t\t/* DBG_871X(\"[%s] issue_tdls_ch_switch_req to \"MAC_FMT\"\\n\", __FUNCTION__, MAC_ARG(padapter->tdlsinfo.chsw_info.addr)); */\n\t\t\t\t\t\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, padapter->tdlsinfo.chsw_info.addr);\n\t\t\t\t\t\tif (ptdls_sta != NULL) {\n\t\t\t\t\t\t\tif (ptdls_sta->tdls_sta_state | TDLS_LINKED_STATE)\n\t\t\t\t\t\t\t\tissue_tdls_ch_switch_req(padapter, ptdls_sta);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\t\t\t\t\n#endif /* CONFIG_TDLS */\n\n#ifdef CONFIG_DFS\n\t\t\t\tprocess_csa_ie(padapter, pframe, len);\t//channel switch announcement\n#endif //CONFIG_DFS\n\n#ifdef CONFIG_P2P_PS\n\t\t\t\tprocess_p2p_ps_ie(padapter, (pframe + WLAN_HDR_A3_LEN), (len - WLAN_HDR_A3_LEN));\n#endif //CONFIG_P2P_PS\n\n\t\t\t\t#if 0 //move to validate_recv_mgnt_frame\n\t\t\t\tpsta->sta_stats.rx_mgnt_pkts++;\n\t\t\t\t#endif\n\t\t\t}\n\t\t}\n\t\telse if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t\t{\n\t\t\tif ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL)\n\t\t\t{\n\t\t\t\t//update WMM, ERP in the beacon\n\t\t\t\t//todo: the timer is used instead of the number of the beacon received\n\t\t\t\tif ((sta_rx_pkts(psta) & 0xf) == 0)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"update_bcn_info\\n\");\n\t\t\t\t\tupdate_beacon_info(padapter, pframe, len, psta);\n\t\t\t\t}\n\n\t\t\t\t#if 0 //move to validate_recv_mgnt_frame\n\t\t\t\tpsta->sta_stats.rx_mgnt_pkts++;\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//allocate a new CAM entry for IBSS station\n\t\t\t\tif ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA)\n\t\t\t\t{\n\t\t\t\t\tgoto _END_ONBEACON_;\n\t\t\t\t}\n\n\t\t\t\t//get supported rate\n\t\t\t\tif (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tpmlmeinfo->FW_sta_info[cam_idx].status = 0;\n\t\t\t\t\tgoto _END_ONBEACON_;\n\t\t\t\t}\n\n\t\t\t\t//update TSF Value\n\t\t\t\tupdate_TSF(pmlmeext, pframe, len);\t\t\t\n\n\t\t\t\t//report sta add event\n\t\t\t\treport_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx);\n\t\t\t}\n\t\t}\n\t}\n\n_END_ONBEACON_:\n\n\treturn _SUCCESS;\n\n}\n\nunsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_AP_MODE\n\t_irqL irqL;\n\tunsigned int\tauth_mode, seq, ie_len;\n\tunsigned char\t*sa, *p;\t\n\tu16\talgorithm;\n\tint\tstatus;\n\tstatic struct sta_info stat;\t\n\tstruct\tsta_info\t*pstat=NULL;\t\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 *pframe = precv_frame->u.hdr.rx_data; \n\tuint len = precv_frame->u.hdr.len;\n\tu8\toffset = 0;\n\n\t\n#ifdef CONFIG_CONCURRENT_MODE\t\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&\n\t\tcheck_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))\n\t{\n\t\t//don't process auth request;\n\t\treturn _SUCCESS;\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n\tif((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\n\t\treturn _FAIL;\n\n\tDBG_871X(\"+OnAuth\\n\");\n\n\tsa = GetAddr2Ptr(pframe);\n\n\tauth_mode = psecuritypriv->dot11AuthAlgrthm;\n\n\tif (GetPrivacy(pframe))\n\t{\n\t\tu8\t*iv;\n\t\tstruct rx_pkt_attrib\t *prxattrib = &(precv_frame->u.hdr.attrib);\n\n\t\tprxattrib->hdrlen = WLAN_HDR_A3_LEN;\n\t\tprxattrib->encrypt = _WEP40_;\n\n\t\tiv = pframe+prxattrib->hdrlen;\n\t\tprxattrib->key_index = ((iv[3]>>6)&0x3);\n\n\t\tprxattrib->iv_len = 4;\n\t\tprxattrib->icv_len = 4;\n\n\t\trtw_wep_decrypt(padapter, (u8 *)precv_frame);\n\n\t\toffset = 4;\n\t}\n\n\talgorithm = le16_to_cpu(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset));\n\tseq \t= le16_to_cpu(*(u16*)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2));\n\n\tDBG_871X(\"auth alg=%x, seq=%X\\n\", algorithm, seq);\n\n\tif (auth_mode == 2 &&\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm != _WEP40_ &&\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm != _WEP104_)\n\t\tauth_mode = 0;\n\n\tif ((algorithm > 0 && auth_mode == 0) ||\t// rx a shared-key auth but shared not enabled\n\t\t(algorithm == 0 && auth_mode == 1) )\t// rx a open-system auth but shared-key is enabled\n\t{\t\t\n\t\tDBG_871X(\"auth rejected due to bad alg [alg=%d, auth_mib=%d] %02X%02X%02X%02X%02X%02X\\n\",\n\t\t\talgorithm, auth_mode, sa[0], sa[1], sa[2], sa[3], sa[4], sa[5]);\n\t\t\n\t\tstatus = _STATS_NO_SUPP_ALG_;\n\t\t\n\t\tgoto auth_fail;\n\t}\n\t\n#if 0 //ACL control\t\n\tphead = &priv->wlan_acl_list;\n\tplist = phead->next;\n\t//check sa\n\tif (acl_mode == 1)\t\t// 1: positive check, only those on acl_list can be connected.\n\t\tres = FAIL;\n\telse\n\t\tres = SUCCESS;\n\n\twhile(plist != phead)\n\t{\n\t\tpaclnode = list_entry(plist, struct rtw_wlan_acl_node, list);\n\t\tplist = plist->next;\n\t\tif (!memcmp((void *)sa, paclnode->addr, 6)) {\n\t\t\tif (paclnode->mode & 2) { // deny\n\t\t\t\tres = FAIL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tres = SUCCESS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (res != SUCCESS) {\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,\"auth abort because ACL!\\n\");\n\t\treturn FAIL;\n\t}\n#else\n\tif(rtw_access_ctrl(padapter, sa) == _FALSE)\n\t{\n\t\tstatus = _STATS_UNABLE_HANDLE_STA_;\n\t\tgoto auth_fail;\n\t}\t\n#endif\n\n\tpstat = rtw_get_stainfo(pstapriv, sa);\n\tif (pstat == NULL)\n\t{\n\n\t\t// allocate a new one\n\t\tDBG_871X(\"going to alloc stainfo for sa=\"MAC_FMT\"\\n\",  MAC_ARG(sa));\n\t\tpstat = rtw_alloc_stainfo(pstapriv, sa);\n\t\tif (pstat == NULL)\n\t\t{\n\t\t\tDBG_871X(\" Exceed the upper limit of supported clients...\\n\");\n\t\t\tstatus = _STATS_UNABLE_HANDLE_STA_;\n\t\t\tgoto auth_fail;\n\t\t}\n\t\t\n\t\tpstat->state = WIFI_FW_AUTH_NULL;\n\t\tpstat->auth_seq = 0;\n\t\t\n\t\t//pstat->flags = 0;\n\t\t//pstat->capability = 0;\n\t} else {\n#ifdef CONFIG_IEEE80211W\n\t\tif (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS))\n#endif /* CONFIG_IEEE80211W */\n\t\t{\n\n\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\tif (rtw_is_list_empty(&pstat->asoc_list) == _FALSE) {\t\t\t\n\t\t\t\trtw_list_delete(&pstat->asoc_list);\n\t\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\t\tif (pstat->expire_to > 0)\n\t\t\t\t\t;/* TODO: STA re_auth within expire_to */\n\t\t\t}\n\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\t\tif (seq == 1)\n\t\t\t\t; /* TODO: STA re_auth and auth timeout */\n\n\t\t}\n\t}\n\n#ifdef CONFIG_IEEE80211W\n\tif (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) \n#endif /* CONFIG_IEEE80211W */\n\t{\n\t\t_enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\tif (rtw_is_list_empty(&pstat->auth_list)) {\t\t\n\t\n\t\t\trtw_list_insert_tail(&pstat->auth_list, &pstapriv->auth_list);\n\t\t\tpstapriv->auth_list_cnt++;\n\t\t}\t\n\t\t_exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t}\n\n\tif (pstat->auth_seq == 0)\n\t\tpstat->expire_to = pstapriv->auth_to;\n\n\n\tif ((pstat->auth_seq + 1) != seq)\n\t{\n\t\tDBG_871X(\"(1)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\\n\",\n\t\t\tseq, pstat->auth_seq+1);\n\t\tstatus = _STATS_OUT_OF_AUTH_SEQ_;\n\t\tgoto auth_fail;\n\t}\n\n\tif (algorithm==0 && (auth_mode == 0 || auth_mode == 2 || auth_mode == 3))\n\t{\n\t\tif (seq == 1)\n\t\t{\n#ifdef CONFIG_IEEE80211W\n\t\t\tif (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) \n#endif /* CONFIG_IEEE80211W */\n\t\t\t{\n\t\t\t\tpstat->state &= ~WIFI_FW_AUTH_NULL;\n\t\t\t\tpstat->state |= WIFI_FW_AUTH_SUCCESS;\n\t\t\t\tpstat->expire_to = pstapriv->assoc_to;\n\t\t\t}\n\t\t\tpstat->authalg = algorithm;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"(2)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\\n\",\n\t\t\t\tseq, pstat->auth_seq+1);\n\t\t\tstatus = _STATS_OUT_OF_AUTH_SEQ_;\n\t\t\tgoto auth_fail;\n\t\t}\n\t}\n\telse // shared system or auto authentication\n\t{\n\t\tif (seq == 1)\n\t\t{\n\t\t\t//prepare for the challenging txt...\n\n\t\t\t//get_random_bytes((void *)pstat->chg_txt, 128);//TODO:\n\t\t\t_rtw_memset((void *)pstat->chg_txt, 78, 128);\n#ifdef CONFIG_IEEE80211W\n\t\t\tif (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) \n#endif /* CONFIG_IEEE80211W */\n\t\t\t{\n\t\t\t\tpstat->state &= ~WIFI_FW_AUTH_NULL;\n\t\t\t\tpstat->state |= WIFI_FW_AUTH_STATE;\n\t\t\t}\n\t\t\tpstat->authalg = algorithm;\n\t\t\tpstat->auth_seq = 2;\n\t\t}\n\t\telse if (seq == 3)\n\t\t{\n\t\t\t//checking for challenging txt...\n\t\t\tDBG_871X(\"checking for challenging txt...\\n\");\n\t\t\t\n\t\t\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + 4 + _AUTH_IE_OFFSET_ , _CHLGETXT_IE_, (int *)&ie_len,\n\t\t\t\t\tlen - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_ - 4);\n\n\t\t\tif((p==NULL) || (ie_len<=0))\n\t\t\t{\n\t\t\t\tDBG_871X(\"auth rejected because challenge failure!(1)\\n\");\n\t\t\t\tstatus = _STATS_CHALLENGE_FAIL_;\n\t\t\t\tgoto auth_fail;\n\t\t\t}\n\t\t\t\n\t\t\tif (_rtw_memcmp((void *)(p + 2), pstat->chg_txt, 128))\n\t\t\t{\n#ifdef CONFIG_IEEE80211W\n\t\t\t\tif (pstat->bpairwise_key_installed != _TRUE && !(pstat->state & WIFI_FW_ASSOC_SUCCESS)) \n#endif /* CONFIG_IEEE80211W */\n\t\t\t\t{\n\t\t\t\t\tpstat->state &= (~WIFI_FW_AUTH_STATE);\n\t\t\t\t\tpstat->state |= WIFI_FW_AUTH_SUCCESS;\n\t\t\t\t\t/* challenging txt is correct... */\n\t\t\t\t\tpstat->expire_to =  pstapriv->assoc_to;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"auth rejected because challenge failure!\\n\");\n\t\t\t\tstatus = _STATS_CHALLENGE_FAIL_;\n\t\t\t\tgoto auth_fail;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"(3)auth rejected because out of seq [rx_seq=%d, exp_seq=%d]!\\n\",\n\t\t\t\tseq, pstat->auth_seq+1);\n\t\t\tstatus = _STATS_OUT_OF_AUTH_SEQ_;\n\t\t\tgoto auth_fail;\n\t\t}\n\t}\n\n\n\t// Now, we are going to issue_auth...\n\tpstat->auth_seq = seq + 1;\t\n\t\n#ifdef CONFIG_NATIVEAP_MLME\n\tissue_auth(padapter, pstat, (unsigned short)(_STATS_SUCCESSFUL_));\n#endif\n\n\tif ((pstat->state & WIFI_FW_AUTH_SUCCESS) || (pstat->state & WIFI_FW_ASSOC_SUCCESS))\n\t\tpstat->auth_seq = 0;\n\n\t\t\n\treturn _SUCCESS;\n\nauth_fail:\n\n\tif(pstat)\n\t\trtw_free_stainfo(padapter , pstat);\n\t\n\tpstat = &stat;\n\t_rtw_memset((char *)pstat, '\\0', sizeof(stat));\n\tpstat->auth_seq = 2;\n\t_rtw_memcpy(pstat->hwaddr, sa, 6);\t\n\t\n#ifdef CONFIG_NATIVEAP_MLME\n\tissue_auth(padapter, pstat, (unsigned short)status);\t\n#endif\n\n#endif\n\treturn _FAIL;\n\n}\n\nunsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned int\tseq, len, status, algthm, offset;\n\tunsigned char\t*p;\n\tunsigned int\tgo2asoc = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint pkt_len = precv_frame->u.hdr.len;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t//check A1 matches or not\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN))\n\t\treturn _SUCCESS;\n\n\tif (!(pmlmeinfo->state & WIFI_FW_AUTH_STATE))\n\t\treturn _SUCCESS;\n\n\toffset = (GetPrivacy(pframe))? 4: 0;\n\n\talgthm \t= le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset));\n\tseq \t= le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 2));\n\tstatus \t= le16_to_cpu(*(unsigned short *)((SIZE_PTR)pframe + WLAN_HDR_A3_LEN + offset + 4));\n\n\tif (status != 0)\n\t{\n\t\tDBG_871X(\"clnt auth fail, status: %d\\n\", status);\n\t\tif(status == 13)//&& pmlmeinfo->auth_algo == dot11AuthAlgrthm_Auto)\n\t\t{\n\t\t\tif(pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)\n\t\t\t\tpmlmeinfo->auth_algo = dot11AuthAlgrthm_Open;\n\t\t\telse\n\t\t\t\tpmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared;\n\t\t\t//pmlmeinfo->reauth_count = 0;\n\t\t}\n\t\t\n\t\tset_link_timer(pmlmeext, 1);\n\t\tgoto authclnt_fail;\n\t}\n\n\tif (seq == 2)\n\t{\n\t\tif (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)\n\t\t{\n\t\t\t // legendary shared system\n\t\t\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _AUTH_IE_OFFSET_, _CHLGETXT_IE_, (int *)&len,\n\t\t\t\tpkt_len - WLAN_HDR_A3_LEN - _AUTH_IE_OFFSET_);\n\n\t\t\tif (p == NULL)\n\t\t\t{\n\t\t\t\t//DBG_871X(\"marc: no challenge text?\\n\");\n\t\t\t\tgoto authclnt_fail;\n\t\t\t}\n\n\t\t\t_rtw_memcpy((void *)(pmlmeinfo->chg_txt), (void *)(p + 2), len);\n\t\t\tpmlmeinfo->auth_seq = 3;\n\t\t\tissue_auth(padapter, NULL, 0);\n\t\t\tset_link_timer(pmlmeext, REAUTH_TO);\n\n\t\t\treturn _SUCCESS;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// open system\n\t\t\tgo2asoc = 1;\n\t\t}\n\t}\n\telse if (seq == 4)\n\t{\n\t\tif (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)\n\t\t{\n\t\t\tgo2asoc = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tgoto authclnt_fail;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// this is also illegal\n\t\t//DBG_871X(\"marc: clnt auth failed due to illegal seq=%x\\n\", seq);\n\t\tgoto authclnt_fail;\n\t}\n\n\tif (go2asoc)\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"auth success, start assoc\\n\");\n\t\tstart_clnt_assoc(padapter);\n\t\treturn _SUCCESS;\n\t}\n\nauthclnt_fail:\n\n\t//pmlmeinfo->state &= ~(WIFI_FW_AUTH_STATE);\n\n\treturn _FAIL;\n\n}\n\nunsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_AP_MODE\n\t_irqL irqL;\n\tu16 capab_info, listen_interval;\n\tstruct rtw_ieee802_11_elems elems;\t\n\tstruct sta_info\t*pstat;\n\tunsigned char\t\treassoc, *p, *pos, *wpa_ie;\n\tunsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};\n\tint\t\ti, ie_len, wpa_ie_len, left;\n\tunsigned char\t\tsupportRate[16];\n\tint\t\t\t\t\tsupportRateNum;\n\tunsigned short\t\tstatus = _STATS_SUCCESSFUL_;\n\tunsigned short\t\tframe_type, ie_offset=0;\t\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\t\n\tWLAN_BSSID_EX \t*cur = &(pmlmeinfo->network);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint pkt_len = precv_frame->u.hdr.len;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\tu8 p2p_status_code = P2P_STATUS_SUCCESS;\n\tu8 *p2pie;\n\tu32 p2pielen = 0;\n#ifdef CONFIG_WFD\n\tu8\twfd_ie[ 128 ] = { 0x00 };\n\tu32\twfd_ielen = 0;\n#endif // CONFIG_WFD\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&\n\t\tcheck_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))\n\t{\n\t\t//don't process assoc request;\n\t\treturn _SUCCESS;\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n\tif((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\n\t\treturn _FAIL;\n\t\n\tframe_type = GetFrameSubType(pframe);\n\tif (frame_type == WIFI_ASSOCREQ)\n\t{\n\t\treassoc = 0;\n\t\tie_offset = _ASOCREQ_IE_OFFSET_;\n\t}\t\n\telse // WIFI_REASSOCREQ\n\t{\n\t\treassoc = 1;\n\t\tie_offset = _REASOCREQ_IE_OFFSET_;\n\t}\n\t\n\n\tif (pkt_len < IEEE80211_3ADDR_LEN + ie_offset) {\n\t\tDBG_871X(\"handle_assoc(reassoc=%d) - too short payload (len=%lu)\"\n\t\t       \"\\n\", reassoc, (unsigned long)pkt_len);\n\t\treturn _FAIL;\n\t}\n\t\n\tpstat = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\n\tif (pstat == (struct sta_info *)NULL)\n\t{\n\t\tstatus = _RSON_CLS2_;\n\t\tgoto asoc_class2_error;\n\t}\n\n\tcapab_info = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN);\n\t//capab_info = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));\t\n\t//listen_interval = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN+2));\n\tlisten_interval = RTW_GET_LE16(pframe + WLAN_HDR_A3_LEN+2);\n\n\tleft = pkt_len - (IEEE80211_3ADDR_LEN + ie_offset);\n\tpos = pframe + (IEEE80211_3ADDR_LEN + ie_offset);\n\t\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t// check if this stat has been successfully authenticated/assocated\n\tif (!((pstat->state) & WIFI_FW_AUTH_SUCCESS))\n\t{\n\t\tif (!((pstat->state) & WIFI_FW_ASSOC_SUCCESS))\n\t\t{\n\t\t\tstatus = _RSON_CLS2_;\n\t\t\tgoto asoc_class2_error;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpstat->state &= (~WIFI_FW_ASSOC_SUCCESS);\n\t\t\tpstat->state |= WIFI_FW_ASSOC_STATE;\t\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tpstat->state &= (~WIFI_FW_AUTH_SUCCESS);\n\t\tpstat->state |= WIFI_FW_ASSOC_STATE;\n\t}\n\n\n#if 0// todo:tkip_countermeasures\n\tif (hapd->tkip_countermeasures) {\n\t\tresp = WLAN_REASON_MICHAEL_MIC_FAILURE;\n\t\tgoto fail;\n\t}\n#endif\n\n\tpstat->capability = capab_info;\n\n#if 0//todo:\n\t//check listen_interval\n\tif (listen_interval > hapd->conf->max_listen_interval) {\n\t\thostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,\n\t\t\t       HOSTAPD_LEVEL_DEBUG,\n\t\t\t       \"Too large Listen Interval (%d)\",\n\t\t\t       listen_interval);\n\t\tresp = WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE;\n\t\tgoto fail;\n\t}\n\t\n\tpstat->listen_interval = listen_interval;\n#endif\n\n\t//now parse all ieee802_11 ie to point to elems\n\tif (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed ||\n\t    !elems.ssid) {\n\t\tDBG_871X(\"STA \" MAC_FMT \" sent invalid association request\\n\",\n\t\t       MAC_ARG(pstat->hwaddr));\n\t\tstatus = _STATS_FAILURE_;\t\t\n\t\tgoto OnAssocReqFail;\n\t}\n\n\n\t// now we should check all the fields...\n\t// checking SSID\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SSID_IE_, &ie_len,\n\t\tpkt_len - WLAN_HDR_A3_LEN - ie_offset);\n\tif (p == NULL)\n\t{\n\t\tstatus = _STATS_FAILURE_;\t\t\n\t}\n\n\tif (ie_len == 0) // broadcast ssid, however it is not allowed in assocreq\n\t\tstatus = _STATS_FAILURE_;\n\telse\n\t{\n\t\t// check if ssid match\n\t\tif (!_rtw_memcmp((void *)(p+2), cur->Ssid.Ssid, cur->Ssid.SsidLength))\n\t\t\tstatus = _STATS_FAILURE_;\n\n\t\tif (ie_len != cur->Ssid.SsidLength)\n\t\t\tstatus = _STATS_FAILURE_;\n\t}\n\n\tif(_STATS_SUCCESSFUL_ != status)\n\t\tgoto OnAssocReqFail;\n\n\t// check if the supported rate is ok\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);\n\tif (p == NULL) {\n\t\tDBG_871X(\"Rx a sta assoc-req which supported rate is empty!\\n\");\n\t\t// use our own rate set as statoin used\n\t\t//_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN);\n\t\t//supportRateNum = AP_BSSRATE_LEN;\n\t\t\n\t\tstatus = _STATS_FAILURE_;\n\t\tgoto OnAssocReqFail;\n\t}\n\telse {\n\t\t_rtw_memcpy(supportRate, p+2, ie_len);\n\t\tsupportRateNum = ie_len;\n\n\t\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len,\n\t\t\t\tpkt_len - WLAN_HDR_A3_LEN - ie_offset);\n\t\tif (p !=  NULL) {\n\t\t\t\n\t\t\tif(supportRateNum<=sizeof(supportRate))\n\t\t\t{\n\t\t\t\t_rtw_memcpy(supportRate+supportRateNum, p+2, ie_len);\n\t\t\t\tsupportRateNum += ie_len;\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\n\t//todo: mask supportRate between AP & STA -> move to update raid\n\t//get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0);\n\n\t//update station supportRate\t\n\tpstat->bssratelen = supportRateNum;\n\t_rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum);\n\tUpdateBrateTblForSoftAP(pstat->bssrateset, pstat->bssratelen);\n\n\t//check RSN/WPA/WPS\n\tpstat->dot8021xalg = 0;\n      \tpstat->wpa_psk = 0;\n\tpstat->wpa_group_cipher = 0;\n\tpstat->wpa2_group_cipher = 0;\n\tpstat->wpa_pairwise_cipher = 0;\n\tpstat->wpa2_pairwise_cipher = 0;\n\t_rtw_memset(pstat->wpa_ie, 0, sizeof(pstat->wpa_ie));\n\tif((psecuritypriv->wpa_psk & BIT(1)) && elems.rsn_ie) {\n\n\t\tint group_cipher=0, pairwise_cipher=0;\t\n\t\t\n\t\twpa_ie = elems.rsn_ie;\n\t\twpa_ie_len = elems.rsn_ie_len;\n\n\t\tif(rtw_parse_wpa2_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpstat->dot8021xalg = 1;//psk,  todo:802.1x\t\t\t\t\t\t\n\t\t\tpstat->wpa_psk |= BIT(1);\n\n\t\t\tpstat->wpa2_group_cipher = group_cipher&psecuritypriv->wpa2_group_cipher;\t\t\t\t\n\t\t\tpstat->wpa2_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa2_pairwise_cipher;\n\t\t\t\n\t\t\tif(!pstat->wpa2_group_cipher)\n\t\t\t\tstatus = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;\n\n\t\t\tif(!pstat->wpa2_pairwise_cipher)\n\t\t\t\tstatus = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatus = WLAN_STATUS_INVALID_IE;\n\t\t}\t\n\t\t\t\n\t} else if ((psecuritypriv->wpa_psk & BIT(0)) && elems.wpa_ie) {\n\n\t\tint group_cipher=0, pairwise_cipher=0;\t\n\t\t\n\t\twpa_ie = elems.wpa_ie;\n\t\twpa_ie_len = elems.wpa_ie_len;\n\n\t\tif(rtw_parse_wpa_ie(wpa_ie-2, wpa_ie_len+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpstat->dot8021xalg = 1;//psk,  todo:802.1x\t\t\t\t\t\t\n\t\t\tpstat->wpa_psk |= BIT(0);\n\n\t\t\tpstat->wpa_group_cipher = group_cipher&psecuritypriv->wpa_group_cipher;\t\t\t\t\n\t\t\tpstat->wpa_pairwise_cipher = pairwise_cipher&psecuritypriv->wpa_pairwise_cipher;\n\t\t\t\n\t\t\tif(!pstat->wpa_group_cipher)\n\t\t\t\tstatus = WLAN_STATUS_GROUP_CIPHER_NOT_VALID;\n\n\t\t\tif(!pstat->wpa_pairwise_cipher)\n\t\t\t\tstatus = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID;\n\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstatus = WLAN_STATUS_INVALID_IE;\n\t\t}\n\t\t\n\t} else {\n\t\twpa_ie = NULL;\n\t\twpa_ie_len = 0;\n\t}\n\n\tif(_STATS_SUCCESSFUL_ != status)\n\t\tgoto OnAssocReqFail;\n\n\tpstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS);\n\t//if (hapd->conf->wps_state && wpa_ie == NULL) { //todo: to check ap if supporting WPS\n\tif(wpa_ie == NULL) {\n\t\tif (elems.wps_ie) {\n\t\t\tDBG_871X(\"STA included WPS IE in \"\n\t\t\t\t   \"(Re)Association Request - assume WPS is \"\n\t\t\t\t   \"used\\n\");\n\t\t\tpstat->flags |= WLAN_STA_WPS;\n\t\t\t//wpabuf_free(sta->wps_ie);\n\t\t\t//sta->wps_ie = wpabuf_alloc_copy(elems.wps_ie + 4,\n\t\t\t//\t\t\t\telems.wps_ie_len - 4);\n\t\t} else {\n\t\t\tDBG_871X(\"STA did not include WPA/RSN IE \"\n\t\t\t\t   \"in (Re)Association Request - possible WPS \"\n\t\t\t\t   \"use\\n\");\n\t\t\tpstat->flags |= WLAN_STA_MAYBE_WPS;\n\t\t}\n\n\n\t\t// AP support WPA/RSN, and sta is going to do WPS, but AP is not ready\n\t\t// that the selected registrar of AP is _FLASE\n\t\tif((psecuritypriv->wpa_psk >0)  \n\t\t\t&& (pstat->flags & (WLAN_STA_WPS|WLAN_STA_MAYBE_WPS)))\n\t\t{\n\t\t\tif(pmlmepriv->wps_beacon_ie)\n\t\t\t{\t\n\t\t\t\tu8 selected_registrar = 0;\n\t\t\t\t\n\t\t\t\trtw_get_wps_attr_content(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len, WPS_ATTR_SELECTED_REGISTRAR , &selected_registrar, NULL);\n\n\t\t\t\tif(!selected_registrar)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"selected_registrar is _FALSE , or AP is not ready to do WPS\\n\");\n\t\t\t\t\t\t\n\t\t\t\t\tstatus = _STATS_UNABLE_HANDLE_STA_;\n\t\t\t\n\t\t\t\t\tgoto OnAssocReqFail;\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t}\n\t\t\t\n\t}\n\telse\n\t{\n\t\tint copy_len;\n\n\t\tif(psecuritypriv->wpa_psk == 0)\n\t\t{\n\t\t\tDBG_871X(\"STA \" MAC_FMT \": WPA/RSN IE in association \"\n\t\t       \t\"request, but AP don't support WPA/RSN\\n\", MAC_ARG(pstat->hwaddr));\n\t\t\t\n\t\t\tstatus = WLAN_STATUS_INVALID_IE;\n\t\t\t\n\t\t\tgoto OnAssocReqFail;\n\n\t\t}\n\n\t\tif (elems.wps_ie) {\n\t\t\tDBG_871X(\"STA included WPS IE in \"\n\t\t\t\t   \"(Re)Association Request - WPS is \"\n\t\t\t\t   \"used\\n\");\n\t\t\tpstat->flags |= WLAN_STA_WPS;\n\t\t\tcopy_len=0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcopy_len = ((wpa_ie_len+2) > sizeof(pstat->wpa_ie)) ? (sizeof(pstat->wpa_ie)):(wpa_ie_len+2);\n\t\t}\n\n\t\t\n\t\tif(copy_len>0)\n\t\t\t_rtw_memcpy(pstat->wpa_ie, wpa_ie-2, copy_len);\n\t\t\n\t}\n\n\n\t// check if there is WMM IE & support WWM-PS\n\tpstat->flags &= ~WLAN_STA_WME;\n\tpstat->qos_option = 0;\n\tpstat->qos_info = 0;\n\tpstat->has_legacy_ac = _TRUE;\n\tpstat->uapsd_vo = 0;\n\tpstat->uapsd_vi = 0;\n\tpstat->uapsd_be = 0;\n\tpstat->uapsd_bk = 0;\n\tif (pmlmepriv->qospriv.qos_option) \n\t{\n\t\tp = pframe + WLAN_HDR_A3_LEN + ie_offset; ie_len = 0;\n\t\tfor (;;) \n\t\t{\n\t\t\tp = rtw_get_ie(p, _VENDOR_SPECIFIC_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset);\n\t\t\tif (p != NULL) {\n\t\t\t\tif (_rtw_memcmp(p+2, WMM_IE, 6)) {\n\n\t\t\t\t\tpstat->flags |= WLAN_STA_WME;\n\t\t\t\t\t\n\t\t\t\t\tpstat->qos_option = 1;\t\t\t\t\n\t\t\t\t\tpstat->qos_info = *(p+8);\n\t\t\t\t\t\n\t\t\t\t\tpstat->max_sp_len = (pstat->qos_info>>5)&0x3;\n\n\t\t\t\t\tif((pstat->qos_info&0xf) !=0xf)\n\t\t\t\t\t\tpstat->has_legacy_ac = _TRUE;\n\t\t\t\t\telse\n\t\t\t\t\t\tpstat->has_legacy_ac = _FALSE;\n\t\t\t\t\t\n\t\t\t\t\tif(pstat->qos_info&0xf)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pstat->qos_info&BIT(0))\n\t\t\t\t\t\t\tpstat->uapsd_vo = BIT(0)|BIT(1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpstat->uapsd_vo = 0;\n\t\t\n\t\t\t\t\t\tif(pstat->qos_info&BIT(1))\n\t\t\t\t\t\t\tpstat->uapsd_vi = BIT(0)|BIT(1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpstat->uapsd_vi = 0;\n\t\t\t\n\t\t\t\t\t\tif(pstat->qos_info&BIT(2))\n\t\t\t\t\t\t\tpstat->uapsd_bk = BIT(0)|BIT(1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpstat->uapsd_bk = 0;\n\t\t\t\n\t\t\t\t\t\tif(pstat->qos_info&BIT(3))\t\t\t\n\t\t\t\t\t\t\tpstat->uapsd_be = BIT(0)|BIT(1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpstat->uapsd_be = 0;\n\t\t\n\t\t\t\t\t}\n\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tp = p + ie_len + 2;\n\t\t}\n\t}\n\n\n#ifdef CONFIG_80211N_HT\n\t/* save HT capabilities in the sta object */\n\t_rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));\n\tif (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct rtw_ieee80211_ht_cap)) \n\t{\n\t\tpstat->flags |= WLAN_STA_HT;\n\t\t\n\t\tpstat->flags |= WLAN_STA_WME;\n\t\t\n\t\t_rtw_memcpy(&pstat->htpriv.ht_cap, elems.ht_capabilities, sizeof(struct rtw_ieee80211_ht_cap));\t\t\t\n\t\t\n\t} else\n\t\tpstat->flags &= ~WLAN_STA_HT;\n\n\t\n\tif((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT))\n\t{\n\t\tstatus = _STATS_FAILURE_;\n\t\tgoto OnAssocReqFail;\n\t}\n\t\t\n#endif /* CONFIG_80211N_HT */\n\n#ifdef CONFIG_80211AC_VHT\n\t_rtw_memset(&pstat->vhtpriv, 0, sizeof(struct vht_priv));\n\tif (elems.vht_capabilities && elems.vht_capabilities_len == 12) {\n\t\tpstat->flags |= WLAN_STA_VHT;\n\n\t\t_rtw_memcpy(pstat->vhtpriv.vht_cap, elems.vht_capabilities, 12);\n\n\t\tif (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) {\n\t\t\t_rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);\n\t\t}\n\t\telse // for Frame without Operating Mode notify ie; default: 80M\n\t\t{\n\t\t\tpstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;\n\t\t}\n\t}\n\telse {\n\t\tpstat->flags &= ~WLAN_STA_VHT;\n\t}\n\n\tif((pmlmepriv->vhtpriv.vht_option == _FALSE) && (pstat->flags&WLAN_STA_VHT))\n\t{\n\t\tstatus = _STATS_FAILURE_;\n\t\tgoto OnAssocReqFail;\n\t}\n#endif /* CONFIG_80211AC_VHT */\n\n\tif (((pstat->flags & WLAN_STA_HT) || (pstat->flags & WLAN_STA_VHT)) && \n\t\t((pstat->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || \n\t\t(pstat->wpa_pairwise_cipher & WPA_CIPHER_TKIP))) {\n\n\t\tDBG_871X(\"(V)HT: \" MAC_FMT \" tried to use TKIP with (V)HT association\\n\", MAC_ARG(pstat->hwaddr));\n\n\t\tpstat->flags &= ~WLAN_STA_HT;\n\t\tpstat->flags &= ~WLAN_STA_VHT;\n\t\t/*status = WLAN_STATUS_CIPHER_REJECTED_PER_POLICY;\n\t\t  * goto OnAssocReqFail;\n\t\t*/\n\t}\n\n\n       //\n       //if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G)//?\n\tpstat->flags |= WLAN_STA_NONERP;\t\n\tfor (i = 0; i < pstat->bssratelen; i++) {\n\t\tif ((pstat->bssrateset[i] & 0x7f) > 22) {\n\t\t\tpstat->flags &= ~WLAN_STA_NONERP;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (pstat->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)\n\t\tpstat->flags |= WLAN_STA_SHORT_PREAMBLE;\n\telse\n\t\tpstat->flags &= ~WLAN_STA_SHORT_PREAMBLE;\n\n\t\n\t\n\tif (status != _STATS_SUCCESSFUL_)\n\t\tgoto OnAssocReqFail;\n\n#ifdef CONFIG_P2P\n\tpstat->is_p2p_device = _FALSE;\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\t\t\n\t\tif( (p2pie=rtw_get_p2p_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , NULL, &p2pielen)))\n\t\t{\n\t\t\tpstat->is_p2p_device = _TRUE;\n\t\t\tif((p2p_status_code=(u8)process_assoc_req_p2p_ie(pwdinfo, pframe, pkt_len, pstat))>0)\n\t\t\t{\n\t\t\t\tpstat->p2p_status_code = p2p_status_code;\n\t\t\t\tstatus = _STATS_CAP_FAIL_;\n\t\t\t\tgoto OnAssocReqFail;\n\t\t\t}\n\t\t}\n#ifdef CONFIG_WFD\n\t\tif(rtw_get_wfd_ie(pframe + WLAN_HDR_A3_LEN + ie_offset , pkt_len - WLAN_HDR_A3_LEN - ie_offset , wfd_ie, &wfd_ielen ))\n\t\t{\n\t\t\tu8\tattr_content[ 10 ] = { 0x00 };\n\t\t\tu32\tattr_contentlen = 0;\n\n\t\t\tDBG_8192C( \"[%s] WFD IE Found!!\\n\", __FUNCTION__ );\n\t\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);\n\t\t\tif ( attr_contentlen )\n\t\t\t{\n\t\t\t\tpwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );\n\t\t\t\tDBG_8192C( \"[%s] Peer PORT NUM = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\t\t\t}\n\t\t}\n#endif\n\t}\n\tpstat->p2p_status_code = p2p_status_code;\n#endif //CONFIG_P2P\n\n\t//TODO: identify_proprietary_vendor_ie();\n\t// Realtek proprietary IE\n\t// identify if this is Broadcom sta\n\t// identify if this is ralink sta\n\t// Customer proprietary IE\n\n\t\n\n\t/* get a unique AID */\n\tif (pstat->aid > 0) {\n\t\tDBG_871X(\"  old AID %d\\n\", pstat->aid);\n\t} else {\n\t\tfor (pstat->aid = 1; pstat->aid <= NUM_STA; pstat->aid++) {\n\t\t\tif (pstapriv->sta_aid[pstat->aid - 1] == NULL) {\n\t\t\t\tif (pstat->aid > pstapriv->max_num_sta) {\n\t\t\t\t\tpstat->aid = 0;\n\t\t\t\t\n\t\t\t\t\tDBG_871X(\"  no room for more AIDs\\n\");\n\n\t\t\t\t\tstatus = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA;\n\t\t\t\t\n\t\t\t\t\tgoto OnAssocReqFail;\n\t\t\t\t\n\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tpstapriv->sta_aid[pstat->aid - 1] = pstat;\n\t\t\t\t\tDBG_871X(\"allocate new AID = (%d)\\n\", pstat->aid);\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\t\n\t}\n\n\n\tpstat->state &= (~WIFI_FW_ASSOC_STATE);\t\n\tpstat->state |= WIFI_FW_ASSOC_SUCCESS;\n\t/* DBG_871X(\"==================%s, %d,  (%x), bpairwise_key_installed=%d, MAC:\"MAC_FMT\"\\n\"\n\t, __func__, __LINE__, pstat->state, pstat->bpairwise_key_installed, MAC_ARG(pstat->hwaddr)); */\n#ifdef CONFIG_IEEE80211W\n\tif (pstat->bpairwise_key_installed != _TRUE)\n#endif /* CONFIG_IEEE80211W */\n\t{\n\t\t_enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\tif (!rtw_is_list_empty(&pstat->auth_list)) {\n\t\t\trtw_list_delete(&pstat->auth_list);\n\t\t\tpstapriv->auth_list_cnt--;\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\n\t\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\t\n\t\tif (rtw_is_list_empty(&pstat->asoc_list)) {\n\t\t\tpstat->expire_to = pstapriv->expire_to;\n\t\t\trtw_list_insert_tail(&pstat->asoc_list, &pstapriv->asoc_list);\n\t\t\tpstapriv->asoc_list_cnt++;\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t}\n\n\t// now the station is qualified to join our BSS...\t\n\tif(pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_==status))\n\t{\n#ifdef CONFIG_NATIVEAP_MLME\n#ifdef CONFIG_IEEE80211W\n\t\tif (pstat->bpairwise_key_installed != _TRUE)\n#endif /* CONFIG_IEEE80211W */\n\t\t{\n\t\t\t/* .1 bss_cap_update & sta_info_update */\n\t\t\tbss_cap_update_on_sta_join(padapter, pstat);\n\t\t\tsta_info_update(padapter, pstat);\n\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\tif (pstat->bpairwise_key_installed == _TRUE)\n\t\t\tstatus = _STATS_REFUSED_TEMPORARILY_;\n#endif /* CONFIG_IEEE80211W */\n\t\t//.2 issue assoc rsp before notify station join event.\n\t\tif (frame_type == WIFI_ASSOCREQ)\n\t\t\tissue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP);\n\t\telse\n\t\t\tissue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP);\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t_enter_critical_bh(&pstat->lock, &irqL);\n\t\tif(pstat->passoc_req)\n\t\t{\n\t\t\trtw_mfree(pstat->passoc_req, pstat->assoc_req_len);\n\t\t\tpstat->passoc_req = NULL;\n\t\t\tpstat->assoc_req_len = 0;\n\t\t}\n\n\t\tpstat->passoc_req =  rtw_zmalloc(pkt_len);\n\t\tif(pstat->passoc_req)\n\t\t{\n\t\t\t_rtw_memcpy(pstat->passoc_req, pframe, pkt_len);\n\t\t\tpstat->assoc_req_len = pkt_len;\n\t\t}\n\t\t_exit_critical_bh(&pstat->lock, &irqL);\n#endif //CONFIG_IOCTL_CFG80211\n#ifdef CONFIG_IEEE80211W\n\t\tif (pstat->bpairwise_key_installed != _TRUE)\n#endif /* CONFIG_IEEE80211W */\n\t\t{\n\t\t\t/* .3-(1) report sta add event */\n\t\t\treport_add_sta_event(padapter, pstat->hwaddr, pstat->aid);\n\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\tif (pstat->bpairwise_key_installed == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) {\n\t\t\tDBG_871X(MAC_FMT\"\\n\", MAC_ARG(pstat->hwaddr));\n\t\t\tissue_action_SA_Query(padapter, pstat->hwaddr, 0, 0, IEEE80211W_RIGHT_KEY);\n\t\t}\n#endif /* CONFIG_IEEE80211W */\n#endif //CONFIG_NATIVEAP_MLME\n\t}\n\n\treturn _SUCCESS;\n\nasoc_class2_error:\n\n#ifdef CONFIG_NATIVEAP_MLME\n\tissue_deauth(padapter, (void *)GetAddr2Ptr(pframe), status);\n#endif\n\n\treturn _FAIL;\t\t\n\nOnAssocReqFail:\n\n\n#ifdef CONFIG_NATIVEAP_MLME\n\tpstat->aid = 0;\n\tif (frame_type == WIFI_ASSOCREQ)\n\t\tissue_asocrsp(padapter, status, pstat, WIFI_ASSOCRSP);\n\telse\n\t\tissue_asocrsp(padapter, status, pstat, WIFI_REASSOCRSP);\n#endif\n\n\n#endif /* CONFIG_AP_MODE */\n\n\treturn _FAIL;\t\t\n\n}\n\nunsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tuint i;\n\tint res;\n\tunsigned short\tstatus;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t//WLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint pkt_len = precv_frame->u.hdr.len;\n\tPNDIS_802_11_VARIABLE_IEs\tpWapiIE = NULL;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\t//check A1 matches or not\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN))\n\t\treturn _SUCCESS;\n\n\tif (!(pmlmeinfo->state & (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE)))\n\t\treturn _SUCCESS;\n\n\tif (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\treturn _SUCCESS;\n\n\t_cancel_timer_ex(&pmlmeext->link_timer);\n\n\t//status\n\tif ((status = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 2))) > 0)\n\t{\n\t\tDBG_871X(\"assoc reject, status code: %d\\n\", status);\n\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\tres = -4;\n\t\tgoto report_assoc_result;\n\t}\n\n\t//get capabilities\n\tpmlmeinfo->capability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));\n\n\t//set slot time\n\tpmlmeinfo->slotTime = (pmlmeinfo->capability & BIT(10))? 9: 20;\n\n\t//AID\n\tres = pmlmeinfo->aid = (int)(le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 4))&0x3fff);\n\n\t//following are moved to join event callback function\n\t//to handle HT, WMM, rate adaptive, update MAC reg\n\t//for not to handle the synchronous IO in the tasklet\n\tfor (i = (6 + WLAN_HDR_A3_LEN); i < pkt_len;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i);\n\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\tif (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6))\t//WMM\n\t\t\t\t{\n\t\t\t\t\tWMM_param_handler(padapter, pIE);\n\t\t\t\t}\n#if defined(CONFIG_P2P) && defined(CONFIG_WFD)\n\t\t\t\telse if ( _rtw_memcmp(pIE->data, WFD_OUI, 4))\t\t//WFD\n\t\t\t\t{\n\t\t\t\t\tDBG_871X( \"[%s] Found WFD IE\\n\", __FUNCTION__ );\n\t\t\t\t\tWFD_info_handler( padapter, pIE );\n\t\t\t\t}\n#endif\t\t\t\t\n\t\t\t\tbreak;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t\t\tcase _WAPI_IE_:\n\t\t\t\tpWapiIE = pIE;\n\t\t\t\tbreak;\n#endif\n\n\t\t\tcase _HT_CAPABILITY_IE_:\t//HT caps\n\t\t\t\tHT_caps_handler(padapter, pIE);\n\t\t\t\tbreak;\n\n\t\t\tcase _HT_EXTRA_INFO_IE_:\t//HT info\n\t\t\t\tHT_info_handler(padapter, pIE);\n\t\t\t\tbreak;\n\n#ifdef CONFIG_80211AC_VHT\n\t\t\tcase EID_VHTCapability:\n\t\t\t\tVHT_caps_handler(padapter, pIE);\n\t\t\t\tbreak;\n\n\t\t\tcase EID_VHTOperation:\n\t\t\t\tVHT_operation_handler(padapter, pIE);\n\t\t\t\tbreak;\n#endif\n\n\t\t\tcase _ERPINFO_IE_:\n\t\t\t\tERP_IE_handler(padapter, pIE);\n\t\t\t\tbreak;\n#ifdef CONFIG_TDLS\n\t\t\tcase _EXT_CAP_IE_:\n\t\t\t\tif (check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE)\n\t\t\t\t\tpadapter->tdlsinfo.ap_prohibited = _TRUE;\n\t\t\t\tif (check_ap_tdls_ch_switching_prohibited(pIE->data, pIE->Length) == _TRUE)\n\t\t\t\t\tpadapter->tdlsinfo.ch_switch_prohibited = _TRUE;\n\t\t\t\tbreak;\n#endif /* CONFIG_TDLS */\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\ti += (pIE->Length + 2);\n\t}\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_wapi_on_assoc_ok(padapter, pIE);\n#endif\n\n\tpmlmeinfo->state &= (~WIFI_FW_ASSOC_STATE);\n\tpmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;\n\n\t//Update Basic Rate Table for spec, 2010-12-28 , by thomas\n\tUpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates);\n\nreport_assoc_result:\n\tif (res > 0) {\n\t\trtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len);\n\t} else {\n\t\trtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len);\n\t}\n\n\treport_join_res(padapter, res);\n\n\treturn _SUCCESS;\n}\n\nunsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned short\treason;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n\t//check A3\n\tif (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))\n\t\treturn _SUCCESS;\n\n\tDBG_871X(FUNC_ADPT_FMT\" - Start to Disconnect\\n\", FUNC_ADPT_ARG(padapter));\n\n#ifdef CONFIG_P2P\n\tif ( pwdinfo->rx_invitereq_info.scan_op_ch_only )\n\t{\n\t\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );\n\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );\n\t}\n#endif //CONFIG_P2P\n\n\treason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));\n\n\trtw_lock_rx_suspend_timeout(8000);\n\n#ifdef CONFIG_AP_MODE\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\t\t\n\t\t_irqL irqL;\n\t\tstruct sta_info *psta;\n\t\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\t\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\t\t//rtw_free_stainfo(padapter, psta);\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" reason=%u, ta=%pM\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));\n\n\t\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\t\n\t\tif(psta)\n\t\t{\n\t\t\tu8 updated = _FALSE;\n\t\t\n\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\tif(rtw_is_list_empty(&psta->asoc_list)==_FALSE)\n\t\t\t{\t\t\t\n\t\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\t\tupdated = ap_free_sta(padapter, psta, _FALSE, reason, _TRUE);\n\n\t\t\t}\n\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\t\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n\t\t}\n\t\t\n\n\t\treturn _SUCCESS;\n\t}\n\telse\n#endif\n\t{\n\t\tint\tignore_received_deauth = 0;\n\n\t\t//\tCommented by Albert 20130604\n\t\t//\tBefore sending the auth frame to start the STA/GC mode connection with AP/GO, \n\t\t//\twe will send the deauth first.\n\t\t//\tHowever, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth.\n\t\t//\tAdded the following code to avoid this case.\n\t\tif ( ( pmlmeinfo->state & WIFI_FW_AUTH_STATE ) ||\n\t\t\t( pmlmeinfo->state & WIFI_FW_ASSOC_STATE ) )\n\t\t{\n\t\t\tif ( reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA )\n\t\t\t{\n\t\t\t\tignore_received_deauth = 1;\n\t\t\t} else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) {\n\t\t\t\t// TODO: 802.11r\n\t\t\t\tignore_received_deauth = 1;\n\t\t\t}\n\t\t}\n\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" reason=%u, ta=%pM, ignore=%d\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe), ignore_received_deauth);\n\n\t\tif ( 0 == ignore_received_deauth )\n\t\t{\n\t\t\treceive_disconnect(padapter, GetAddr2Ptr(pframe), reason);\n\t\t}\n\t}\t\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;\n\treturn _SUCCESS;\n\n}\n\nunsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned short\treason;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n\t//check A3\n\tif (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))\n\t\treturn _SUCCESS;\n\n\tDBG_871X(FUNC_ADPT_FMT\" - Start to Disconnect\\n\", FUNC_ADPT_ARG(padapter));\n\n#ifdef CONFIG_P2P\n\tif ( pwdinfo->rx_invitereq_info.scan_op_ch_only )\n\t{\n\t\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );\n\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );\n\t}\n#endif //CONFIG_P2P\n\n\treason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));\n\n\trtw_lock_rx_suspend_timeout(8000);\n\t\n#ifdef CONFIG_AP_MODE\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\t\n\t\t_irqL irqL;\n\t\tstruct sta_info *psta;\n\t\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\t\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\n\t\t//rtw_free_stainfo(padapter, psta);\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" reason=%u, ta=%pM\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));\n\n\t\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\t\n\t\tif(psta)\n\t\t{\n\t\t\tu8 updated = _FALSE;\n\t\t\t\n\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\tif(rtw_is_list_empty(&psta->asoc_list)==_FALSE)\n\t\t\t{\n\t\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\t\tupdated = ap_free_sta(padapter, psta, _FALSE, reason, _TRUE);\n\t\t\t\n\t\t\t}\n\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\t\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n\t\t}\n\n\t\treturn _SUCCESS;\n\t}\n\telse\n#endif\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" reason=%u, ta=%pM\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));\n\n\t\treceive_disconnect(padapter, GetAddr2Ptr(pframe), reason);\n\t}\t\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;\n\treturn _SUCCESS;\n\n}\n\nunsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\treturn _SUCCESS;\n}\n\nunsigned int on_action_spct_ch_switch(_adapter *padapter, struct sta_info *psta, u8 *ies, uint ies_len)\n{\n\tunsigned int ret = _FAIL;\n\tstruct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(mlmeext->mlmext_info);\n\n\tif (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {\n\t\tret = _SUCCESS;\t\n\t\tgoto exit;\n\t}\n\n\tif ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) {\n\t\t\n\t\tint ch_switch_mode = -1, ch = -1, ch_switch_cnt = -1;\n\t\tint ch_offset = -1;\n\t\tu8 bwmode;\n\t\tstruct ieee80211_info_element *ie;\n\n\t\tDBG_871X(FUNC_NDEV_FMT\" from \"MAC_FMT\"\\n\",\n\t\t\tFUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(psta->hwaddr));\n\n\t\tfor_each_ie(ie, ies, ies_len) {\n\t\t\tif (ie->id == WLAN_EID_CHANNEL_SWITCH) {\n\t\t\t\tch_switch_mode = ie->data[0];\n\t\t\t\tch = ie->data[1];\n\t\t\t\tch_switch_cnt = ie->data[2];\n\t\t\t\tDBG_871X(\"ch_switch_mode:%d, ch:%d, ch_switch_cnt:%d\\n\",\n\t\t\t\t\tch_switch_mode, ch, ch_switch_cnt);\n\t\t\t}\n\t\t\telse if (ie->id == WLAN_EID_SECONDARY_CHANNEL_OFFSET) {\n\t\t\t\tch_offset = secondary_ch_offset_to_hal_ch_offset(ie->data[0]);\n\t\t\t\tDBG_871X(\"ch_offset:%d\\n\", ch_offset);\n\t\t\t}\n\t\t}\n\n\t\tif (ch == -1)\n\t\t\treturn _SUCCESS;\n\n\t\tif (ch_offset == -1)\n\t\t\tbwmode = mlmeext->cur_bwmode;\n\t\telse\n\t\t\tbwmode = (ch_offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) ?\n\t\t\t\tCHANNEL_WIDTH_20 : CHANNEL_WIDTH_40;\n\n\t\tch_offset = (ch_offset == -1) ? mlmeext->cur_ch_offset : ch_offset;\n\n\t\t/* todo:\n\t\t * 1. the decision of channel switching\n\t\t * 2. things after channel switching\n\t\t */\n\n\t\tret = rtw_set_ch_cmd(padapter, ch, bwmode, ch_offset, _TRUE);\n\t}\n\nexit:\n\treturn ret;\n}\n\nunsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned int ret = _FAIL;\n\tstruct sta_info *psta = NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tu8 *frame_body = (u8 *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\tu8 category;\n\tu8 action;\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(padapter->pnetdev));\n\n\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\n\n\tif (!psta)\n\t\tgoto exit;\n\n\tcategory = frame_body[0];\n\tif(category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT)\n\t\tgoto exit;\n\n\taction = frame_body[1];\n\tswitch (action) {\n\tcase RTW_WLAN_ACTION_SPCT_MSR_REQ:\n\tcase RTW_WLAN_ACTION_SPCT_MSR_RPRT:\n\tcase RTW_WLAN_ACTION_SPCT_TPC_REQ:\n\tcase RTW_WLAN_ACTION_SPCT_TPC_RPRT:\n\t\tbreak;\n\tcase RTW_WLAN_ACTION_SPCT_CHL_SWITCH:\n\t\t#ifdef CONFIG_SPCT_CH_SWITCH\n\t\tret = on_action_spct_ch_switch(padapter, psta, &frame_body[2],\n\t\t\tframe_len-(frame_body-pframe)-2);\n\t\t#endif\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\nexit:\n\treturn ret;\n}\n\nunsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame)\n{\n\treturn _SUCCESS;\n}\n\nunsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame)\n{\n\treturn _SUCCESS;\n}\n\n/**\n * rtw_rx_ampdu_size - Get the target RX AMPDU buffer size for the specific @adapter\n * @adapter: the adapter to get target RX AMPDU buffer size\n *\n * Returns: the target RX AMPDU buffer size\n */\nu8 rtw_rx_ampdu_size(_adapter *adapter)\n{\n\tu8 size;\n\tHT_CAP_AMPDU_FACTOR max_rx_ampdu_factor;\n\n\tif (adapter->fix_rx_ampdu_size != RX_AMPDU_SIZE_INVALID) {\n\t\tsize = adapter->fix_rx_ampdu_size;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_BT_COEXIST\n\tif (rtw_btcoex_IsBTCoexCtrlAMPDUSize(adapter) == _TRUE) {\n\t\tsize = rtw_btcoex_GetAMPDUSize(adapter);\n\t\tgoto exit;\n\t}\n#endif\n\n\t/* for scan */\n\tif (!mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_DISABLE)\n\t\t&& !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE)\n\t\t&& adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_size != RX_AMPDU_SIZE_INVALID\n\t) {\n\t\tsize = adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_size;\n\t\tgoto exit;\n\t}\n\n\t/* default value based on max_rx_ampdu_factor */\n\tif (adapter->driver_rx_ampdu_factor != 0xFF)\n\t\tmax_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)adapter->driver_rx_ampdu_factor;\n\telse\n\t\trtw_hal_get_def_var(adapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);\n\n\tif (MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor)\n\t\tsize = 64;\n\telse if (MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor)\n\t\tsize = 32;\n\telse if (MAX_AMPDU_FACTOR_16K == max_rx_ampdu_factor)\n\t\tsize = 16;\n\telse if (MAX_AMPDU_FACTOR_8K == max_rx_ampdu_factor)\n\t\tsize = 8;\n\telse\n\t\tsize = 64;\n\nexit:\n\n\tif (size > 127)\n\t\tsize = 127;\n\n\treturn size;\n}\n\n/**\n * rtw_rx_ampdu_is_accept - Get the permission if RX AMPDU should be set up for the specific @adapter\n * @adapter: the adapter to get the permission if RX AMPDU should be set up\n *\n * Returns: accept or not\n */\nbool rtw_rx_ampdu_is_accept(_adapter *adapter)\n{\n\tbool accept;\n\n\tif (adapter->fix_rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID) {\n\t\taccept = adapter->fix_rx_ampdu_accept;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_BT_COEXIST\n\tif (rtw_btcoex_IsBTCoexRejectAMPDU(adapter) == _TRUE) {\n\t\taccept = _FALSE;\n\t\tgoto exit;\n\t}\n#endif\n\n\t/* for scan */\n\tif (!mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_DISABLE)\n\t\t&& !mlmeext_chk_scan_state(&adapter->mlmeextpriv, SCAN_COMPLETE)\n\t\t&& adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID\n\t) {\n\t\taccept = adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept;\n\t\tgoto exit;\n\t}\n\n\t/* default value for other cases */\n\taccept = adapter->mlmeextpriv.mlmext_info.bAcceptAddbaReq;\n\nexit:\n\treturn accept;\n}\n\n/**\n * rtw_rx_ampdu_set_size - Set the target RX AMPDU buffer size for the specific @adapter and specific @reason\n * @adapter: the adapter to set target RX AMPDU buffer size\n * @size: the target RX AMPDU buffer size to set\n * @reason: reason for the target RX AMPDU buffer size setting\n *\n * Returns: whether the target RX AMPDU buffer size is changed\n */\nbool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason)\n{\n\tbool is_adj = _FALSE;\n\tstruct mlme_ext_priv *mlmeext;\n\tstruct mlme_ext_info *mlmeinfo;\n\n\tmlmeext = &adapter->mlmeextpriv;\n\tmlmeinfo = &mlmeext->mlmext_info;\n\n\tif (reason == RX_AMPDU_DRV_FIXED) {\n\t\tif (adapter->fix_rx_ampdu_size != size) {\n\t\t\tadapter->fix_rx_ampdu_size = size;\n\t\t\tis_adj = _TRUE;\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fix_rx_ampdu_size:%u\\n\", FUNC_ADPT_ARG(adapter), size);\n\t\t}\n\t} else if (reason == RX_AMPDU_DRV_SCAN) {\n\t\tstruct ss_res *ss = &adapter->mlmeextpriv.sitesurvey_res;\n\n\t\tif (ss->rx_ampdu_size != size) {\n\t\t\tss->rx_ampdu_size = size;\n\t\t\tis_adj = _TRUE;\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" ss.rx_ampdu_size:%u\\n\", FUNC_ADPT_ARG(adapter), size);\n\t\t}\n\t}\n\n\treturn is_adj;\n}\n\n/**\n * rtw_rx_ampdu_set_accept - Set the permission if RX AMPDU should be set up for the specific @adapter and specific @reason\n * @adapter: the adapter to set if RX AMPDU should be set up\n * @accept: if RX AMPDU should be set up\n * @reason: reason for the permission if RX AMPDU should be set up\n *\n * Returns: whether the permission if RX AMPDU should be set up is changed\n */\nbool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason)\n{\n\tbool is_adj = _FALSE;\n\tstruct mlme_ext_priv *mlmeext;\n\tstruct mlme_ext_info *mlmeinfo;\n\n\tmlmeext = &adapter->mlmeextpriv;\n\tmlmeinfo = &mlmeext->mlmext_info;\n\n\tif (reason == RX_AMPDU_DRV_FIXED) {\n\t\tif (adapter->fix_rx_ampdu_accept != accept) {\n\t\t\tadapter->fix_rx_ampdu_accept = accept;\n\t\t\tis_adj = _TRUE;\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fix_rx_ampdu_accept:%u\\n\", FUNC_ADPT_ARG(adapter), accept);\n\t\t}\n\t} else if (reason == RX_AMPDU_DRV_SCAN) {\n\t\tif (adapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept != accept) {\n\t\t\tadapter->mlmeextpriv.sitesurvey_res.rx_ampdu_accept = accept;\n\t\t\tis_adj = _TRUE;\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" ss.rx_ampdu_accept:%u\\n\", FUNC_ADPT_ARG(adapter), accept);\n\t\t}\n\t}\n\n\treturn is_adj;\n}\n\n/**\n * rx_ampdu_apply_sta_tid - Apply RX AMPDU setting to the specific @sta and @tid\n * @adapter: the adapter to which @sta belongs\n * @sta: the sta to be checked\n * @tid: the tid to be checked\n * @accept: the target permission if RX AMPDU should be set up\n * @size: the target RX AMPDU buffer size\n *\n * Returns:\n * 0: no canceled\n * 1: canceled by no permission\n * 2: canceled by different buffer size\n * 3: canceled by potential mismatched status\n *\n * Blocking function, may sleep\n */\nu8 rx_ampdu_apply_sta_tid(_adapter *adapter, struct sta_info *sta, u8 tid, u8 accept, u8 size)\n{\n\tu8 ret = 0;\n\tstruct recv_reorder_ctrl *reorder_ctl = &sta->recvreorder_ctrl[tid];\n\n\tif (reorder_ctl->enable == _FALSE) {\n\t\tif (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID) {\n\t\t\tsend_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 1);\n\t\t\tret = 3;\n\t\t}\n\t\tgoto exit;\n\t}\n\n\tif (accept == _FALSE) {\n\t\tsend_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 0);\n\t\tret = 1;\n\t} else if (reorder_ctl->ampdu_size != size) {\n\t\tsend_delba_sta_tid_wait_ack(adapter, 0, sta, tid, 0);\n\t\tret = 2;\n\t}\n\nexit:\n\treturn ret;\n}\n\n/**\n * rx_ampdu_apply_sta - Apply RX AMPDU setting to the specific @sta\n * @adapter: the adapter to which @sta belongs\n * @sta: the sta to be checked\n * @accept: the target permission if RX AMPDU should be set up\n * @size: the target RX AMPDU buffer size\n *\n * Returns: number of the RX AMPDU assciation canceled for applying current target setting\n *\n * Blocking function, may sleep\n */\nu8 rx_ampdu_apply_sta(_adapter *adapter, struct sta_info *sta, u8 accept, u8 size)\n{\n\tu8 change_cnt = 0;\n\tint i;\n\n\tfor (i = 0; i < TID_NUM; i++) {\n\t\tif (rx_ampdu_apply_sta_tid(adapter, sta, i, accept, size) != 0)\n\t\t\tchange_cnt++;\n\t}\n\n\treturn change_cnt;\n}\n\n/**\n * rtw_rx_ampdu_apply - Apply the current target RX AMPDU setting for the specific @adapter\n * @adapter: the adapter to be applied\n *\n * Returns: number of the RX AMPDU assciation canceled for applying current target setting\n */\nu16 rtw_rx_ampdu_apply(_adapter *adapter)\n{\n\tu16 adj_cnt = 0;\n\tstruct mlme_ext_priv *mlmeext;\n\tstruct sta_info *sta;\n\tu8 accept = rtw_rx_ampdu_is_accept(adapter);\n\tu8 size = rtw_rx_ampdu_size(adapter);\n\n\tmlmeext = &adapter->mlmeextpriv;\n\n\tif (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) {\n\t\tsta = rtw_get_stainfo(&adapter->stapriv, get_bssid(&adapter->mlmepriv));\n\t\tif (sta)\n\t\t\tadj_cnt += rx_ampdu_apply_sta(adapter, sta, accept, size);\n\n\t} else if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE) {\n\t\t_irqL irqL;\n\t\t_list *phead, *plist;\n\t\tu8 peer_num = 0;\n\t\tchar peers[NUM_STA];\n\t\tstruct sta_priv *pstapriv = &adapter->stapriv;\n\t\tint i;\n\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\tphead = &pstapriv->asoc_list;\n\t\tplist = get_next(phead);\n\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\t\tint stainfo_offset;\n\n\t\t\tsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\tplist = get_next(plist);\n\n\t\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, sta);\n\t\t\tif (stainfo_offset_valid(stainfo_offset))\n\t\t\t\tpeers[peer_num++] = stainfo_offset;\n\t\t}\n\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\tfor (i = 0; i < peer_num; i++) {\n\t\t\tsta = rtw_get_stainfo_by_offset(pstapriv, peers[i]);\n\t\t\tif (sta)\n\t\t\t\tadj_cnt += rx_ampdu_apply_sta(adapter, sta, accept, size);\n\t\t}\n\t}\n\n\treturn adj_cnt;\n}\n\nunsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tu8 *addr;\n\tstruct sta_info *psta=NULL;\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tunsigned char\t\t*frame_body;\n\tunsigned char\t\tcategory, action;\n\tunsigned short\ttid, status, reason_code = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n#ifdef CONFIG_80211N_HT\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t//check RA matches or not\t\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN))\n\t\treturn _SUCCESS;\n\n/*\n\t//check A1 matches or not\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), get_da(pframe), ETH_ALEN))\n\t\treturn _SUCCESS;\n*/\n\n\tif((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\t\n\t\tif (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))\n\t\t\treturn _SUCCESS;\n\n\taddr = GetAddr2Ptr(pframe);\n\tpsta = rtw_get_stainfo(pstapriv, addr);\n\n\tif(psta==NULL)\n\t\treturn _SUCCESS;\n\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tcategory = frame_body[0];\n\tif (category == RTW_WLAN_CATEGORY_BACK)// representing Block Ack\n\t{\n#ifdef CONFIG_TDLS\n\t\tif((psta->tdls_sta_state & TDLS_LINKED_STATE) && \n\t\t\t(psta->htpriv.ht_option==_TRUE) &&\n\t\t\t(psta->htpriv.ampdu_enable==_TRUE))\n\t\t{\n\t\t\tDBG_871X(\"Recv [%s] from direc link\\n\", __FUNCTION__);\n\t\t}\n\t\telse\n#endif //CONFIG_TDLS\n\t\tif (!pmlmeinfo->HT_enable)\n\t\t{\n\t\t\treturn _SUCCESS;\n\t\t}\n\n\t\taction = frame_body[1];\n\t\tDBG_871X(\"%s, action=%d\\n\", __FUNCTION__, action);\n\t\tswitch (action)\n\t\t{\n\t\t\tcase RTW_WLAN_ACTION_ADDBA_REQ: //ADDBA request\n\n\t\t\t\t_rtw_memcpy(&(pmlmeinfo->ADDBA_req), &(frame_body[2]), sizeof(struct ADDBA_request));\n\t\t\t\t//process_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe));\n\t\t\t\tprocess_addba_req(padapter, (u8*)&(pmlmeinfo->ADDBA_req), addr);\n\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase RTW_WLAN_ACTION_ADDBA_RESP: //ADDBA response\n\n\t\t\t\t//status = frame_body[3] | (frame_body[4] << 8); //endian issue\n\t\t\t\tstatus = RTW_GET_LE16(&frame_body[3]);\n\t\t\t\ttid = ((frame_body[5] >> 2) & 0x7);\n\n\t\t\t\tif (status == 0)\n\t\t\t\t{\t//successful\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"agg_enable for TID=%d\\n\", tid);\n\t\t\t\t\tpsta->htpriv.agg_enable_bitmap |= 1 << tid;\t\t\t\t\t\n\t\t\t\t\tpsta->htpriv.candidate_tid_bitmap &= ~BIT(tid);\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tpsta->htpriv.agg_enable_bitmap &= ~BIT(tid);\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tif(psta->state & WIFI_STA_ALIVE_CHK_STATE)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s alive check - rx ADDBA response\\n\", __func__);\n\t\t\t\t\tpsta->htpriv.agg_enable_bitmap &= ~BIT(tid);\n\t\t\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\t\t\tpsta->state ^= WIFI_STA_ALIVE_CHK_STATE;\n\t\t\t\t}\n\n\t\t\t\t//DBG_871X(\"marc: ADDBA RSP: %x\\n\", pmlmeinfo->agg_enable_bitmap);\n\t\t\t\tbreak;\n\n\t\t\tcase RTW_WLAN_ACTION_DELBA: //DELBA\n\t\t\t\tif ((frame_body[3] & BIT(3)) == 0)\n\t\t\t\t{\n\t\t\t\t\tpsta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));\n\t\t\t\t\tpsta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf));\n\t\t\t\t\t\n\t\t\t\t\t//reason_code = frame_body[4] | (frame_body[5] << 8);\n\t\t\t\t\treason_code = RTW_GET_LE16(&frame_body[4]);\n\t\t\t\t}\n\t\t\t\telse if((frame_body[3] & BIT(3)) == BIT(3))\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\ttid = (frame_body[3] >> 4) & 0x0F;\n\t\t\t\t\n\t\t\t\t\tpreorder_ctrl = &psta->recvreorder_ctrl[tid];\n\t\t\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\t\t\tpreorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tDBG_871X(\"%s(): DELBA: %x(%x)\\n\", __FUNCTION__,pmlmeinfo->agg_enable_bitmap, reason_code);\n\t\t\t\t//todo: how to notify the host while receiving DELETE BA\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n#endif //CONFIG_80211N_HT\n\treturn _SUCCESS;\n}\n\n#ifdef CONFIG_P2P\n\nstatic int get_reg_classes_full_count(struct p2p_channels channel_list) {\n\tint cnt = 0;\n\tint i;\n\n\tfor (i = 0; i < channel_list.reg_classes; i++) {\n\t\tcnt += channel_list.reg_class[i].channels;\n\t}\n\n\treturn cnt;\n}\n\nstatic void get_channel_cnt_24g_5gl_5gh(  struct mlme_ext_priv *pmlmeext, u8* p24g_cnt, u8* p5gl_cnt, u8* p5gh_cnt )\n{\n\tint\ti = 0;\n\n\t*p24g_cnt = 0;\n\t*p5gl_cnt = 0;\n\t*p5gh_cnt = 0;\t\n\t\n\tfor( i = 0; i < pmlmeext->max_chan_nums; i++ )\n\t{\n\t\tif ( pmlmeext->channel_set[ i ].ChannelNum <= 14 )\n\t\t{\n\t\t\t(*p24g_cnt)++;\n\t\t}\n\t\telse if ( ( pmlmeext->channel_set[ i ].ChannelNum > 14 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 48 ) )\n\t\t{\n\t\t\t//\tJust include the channel 36, 40, 44, 48 channels for 5G low\n\t\t\t(*p5gl_cnt)++;\n\t\t}\n\t\telse if ( ( pmlmeext->channel_set[ i ].ChannelNum >= 149 ) && ( pmlmeext->channel_set[ i ].ChannelNum <= 161 ) )\n\t\t{\n\t\t\t//\tJust include the channel 149, 153, 157, 161 channels for 5G high\n\t\t\t(*p5gh_cnt)++;\n\t\t}\n\t}\n}\n\nvoid issue_p2p_GO_request(_adapter *padapter, u8* raddr)\n{\n\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_GO_NEGO_REQ;\n\tu8\t\t\twpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };\n\tu8\t\t\twpsielen = 0, p2pielen = 0, i;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;\n\tu16\t\t\tlen_channellist_attr = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\t\t\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpwdinfo->negotiation_dialog_token = 1;\t//\tInitialize the dialog value\n\tpframe = rtw_set_fixed_ie(pframe, 1, &pwdinfo->negotiation_dialog_token, &(pattrib->pktlen));\n\n\t\n\n\t//\tWPS Section\n\twpsielen = 0;\n\t//\tWPS OUI\n\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\twpsielen += 4;\n\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t//\tDevice Password ID\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\twpsielen += 2;\n\n\t//\tValue:\n\n\tif ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );\n\t}\n\telse if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );\n\t}\n\telse if ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );\n\t}\n\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20110306\n\t//\tAccording to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes\n\t//\t1. P2P Capability\n\t//\t2. Group Owner Intent\n\t//\t3. Configuration Timeout\n\t//\t4. Listen Channel\n\t//\t5. Extended Listen Timing\n\t//\t6. Intended P2P Interface Address\n\t//\t7. Channel List\n\t//\t8. P2P Device Info\n\t//\t9. Operating Channel\n\n\n\t//\tP2P Capability\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\n\t//\tGroup Capability Bitmap, 1 byte\n\tif ( pwdinfo->persistent_supported )\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;\n\t}\n\telse\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;\n\t}\n\n\n\t//\tGroup Owner Intent\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tTodo the tie breaker bit.\n\tp2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) &  0xFE );\n\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\n\t//\tListen Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tOperating Class\n\tp2pie[ p2pielen++ ] = 0x51;\t//\tCopy from SD7\n\t\n\t//\tChannel Number\n\tp2pie[ p2pielen++ ] = pwdinfo->listen_channel;\t//\tlistening channel number\n\t\n\n\t//\tExtended Listen Timing ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tAvailability Period\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\tp2pielen += 2;\n\n\t//\tAvailability Interval\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\tp2pielen += 2;\n\n\n\t//\tIntended P2P Interface Address\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\n\t//\tChannel List\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t// Length:\n\t// Country String(3)\n\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t// + number of channels in all classes\n\tlen_channellist_attr = 3\n\t   + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes)\n\t   + get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t}\n#else\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n#endif\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tChannel Entry List\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t//\tOperating Class\n\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t{\n\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\n\t\t//\tNumber of Channels\n\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t//\tChannel List\n\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n\t{\n\t\tint i,j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#else // CONFIG_CONCURRENT_MODE\n\t{\n\t\tint i,j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t//\tDevice Info\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\n\tp2pielen += 2;\n\n\t//\tPrimary Device Type\n\t//\tCategory ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\tp2pielen += 2;\n\n\t//\tOUI\n\t*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\tp2pielen += 4;\n\n\t//\tSub Category ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\tp2pielen += 2;\n\n\t//\tNumber of Secondary Device Types\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tp2pielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\t\n\t\n\n\t//\tOperating Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tOperating Class\n\tif ( pwdinfo->operating_channel <= 14 )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x51;\n\t}\n\telse if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x73;\n\t}\n\telse\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t}\n\n\t//\tChannel Number\n\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\t\t\n\n#ifdef CONFIG_WFD\n\twfdielen = build_nego_req_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\n\nvoid issue_p2p_GO_response(_adapter *padapter, u8* raddr, u8* frame_body,uint len, u8 result)\n{\n\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_GO_NEGO_RESP;\n\tu8\t\t\twpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };\n\tu8\t\t\tp2pielen = 0, i;\n\tuint\t\t\twpsielen = 0;\n\tu16\t\t\twps_devicepassword_id = 0x0000;\n\tuint\t\t\twps_devicepassword_id_len = 0;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh;\n\tu16\t\t\tlen_channellist_attr = 0;\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tDBG_871X( \"[%s] In, result = %d\\n\", __FUNCTION__,  result );\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpwdinfo->negotiation_dialog_token = frame_body[7];\t//\tThe Dialog Token of provisioning discovery request frame.\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));\n\n\t//\tCommented by Albert 20110328\n\t//\tTry to get the device password ID from the WPS IE of group negotiation request frame\n\t//\tWiFi Direct test plan 5.1.15\n\trtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);\n\trtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);\n\twps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );\n\n\t_rtw_memset( wpsie, 0x00, 255 );\n\twpsielen = 0;\n\n\t//\tWPS Section\n\twpsielen = 0;\n\t//\tWPS OUI\n\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\twpsielen += 4;\n\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t//\tDevice Password ID\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\twpsielen += 2;\n\n\t//\tValue:\n\tif ( wps_devicepassword_id == WPS_DPID_USER_SPEC )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );\n\t}\n\telse if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );\n\t}\n\twpsielen += 2;\n\n\t//\tCommented by Kurt 20120113\n\t//\tIf some device wants to do p2p handshake without sending prov_disc_req\n\t//\tWe have to get peer_req_cm from here.\n\tif(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"000\", 3) )\n\t{\n\t\tif ( wps_devicepassword_id == WPS_DPID_USER_SPEC )\n\t\t{\n\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"dis\", 3 );\n\t\t}\n\t\telse if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )\n\t\t{\n\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pad\", 3 );\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pbc\", 3 );\t\n\t\t}\n\t}\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20100908\n\t//\tAccording to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes\n\t//\t1. Status\n\t//\t2. P2P Capability\n\t//\t3. Group Owner Intent\n\t//\t4. Configuration Timeout\n\t//\t5. Operating Channel\n\t//\t6. Intended P2P Interface Address\n\t//\t7. Channel List\n\t//\t8. Device Info\n\t//\t9. Group ID\t( Only GO )\n\n\n\t//\tToDo:\n\n\t//\tP2P Status\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_STATUS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = result;\n\t\n\t//\tP2P Capability\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )\n\t{\n\t\t//\tCommented by Albert 2011/03/08\n\t\t//\tAccording to the P2P specification\n\t\t//\tif the sending device will be client, the P2P Capability should be reserved of group negotation response frame\n\t\tp2pie[ p2pielen++ ] = 0;\n\t}\n\telse\n\t{\n\t\t//\tBe group owner or meet the error case\n\t\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t}\n\t\n\t//\tGroup Capability Bitmap, 1 byte\n\tif ( pwdinfo->persistent_supported )\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;\n\t}\n\telse\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;\n\t}\n\n\t//\tGroup Owner Intent\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tif ( pwdinfo->peer_intent & 0x01 )\n\t{\n\t\t//\tPeer's tie breaker bit is 1, our tie breaker bit should be 0\n\t\tp2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 );\n\t}\n\telse\n\t{\n\t\t//\tPeer's tie breaker bit is 0, our tie breaker bit should be 1\n\t\tp2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );\n\t}\n\n\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\t//\tOperating Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tOperating Class\n\tif ( pwdinfo->operating_channel <= 14 )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x51;\n\t}\n\telse if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x73;\n\t}\n\telse\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t}\n\t\n\t//\tChannel Number\n\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\n\t//\tIntended P2P Interface Address\t\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tChannel List\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t// Country String(3)\n\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t// + number of channels in all classes\n\tlen_channellist_attr = 3\n\t   + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes\n\t   + get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t}\n#else\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n #endif\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tChannel Entry List\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t//\tOperating Class\n\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t{\n\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\n\t\t//\tNumber of Channels\n\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t//\tChannel List\n\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#else // CONFIG_CONCURRENT_MODE\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\n\t//\tDevice Info\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\n\tp2pielen += 2;\n\n\t//\tPrimary Device Type\n\t//\tCategory ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\tp2pielen += 2;\n\n\t//\tOUI\n\t*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\tp2pielen += 4;\n\n\t//\tSub Category ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\tp2pielen += 2;\n\n\t//\tNumber of Secondary Device Types\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tp2pielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\t\n\t\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )\n\t{\n\t\t//\tGroup ID Attribute\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tp2P Device Address\n\t\t_rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );\n\t\tp2pielen += ETH_ALEN;\n\n\t\t//\tSSID\n\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );\n\t\tp2pielen += pwdinfo->nego_ssidlen;\n\t\t\n\t}\n\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\t\n\t\n#ifdef CONFIG_WFD\n\twfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\nvoid issue_p2p_GO_confirm(_adapter *padapter, u8* raddr, u8 result)\n{\n\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_GO_NEGO_CONF;\n\tu8\t\t\twpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };\n\tu8\t\t\twpsielen = 0, p2pielen = 0;\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(pwdinfo->negotiation_dialog_token), &(pattrib->pktlen));\n\n\t\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20110306\n\t//\tAccording to the P2P Specification, the group negoitation request frame should contain 5 P2P attributes\n\t//\t1. Status\n\t//\t2. P2P Capability\n\t//\t3. Operating Channel\n\t//\t4. Channel List\n\t//\t5. Group ID\t( if this WiFi is GO )\n\n\t//\tP2P Status\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_STATUS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = result;\n\n\t//\tP2P Capability\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t\n\t//\tGroup Capability Bitmap, 1 byte\n\tif ( pwdinfo->persistent_supported )\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;\n\t}\n\telse\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;\n\t}\n\n\n\t//\tOperating Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )\n\t{\n\t\tif ( pwdinfo->peer_operating_ch <= 14 )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\t\telse if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t}\n\t\t\n\t\tp2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch;\n\t}\n\telse\n\t{\n\t\tif ( pwdinfo->operating_channel <= 14 )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\t\telse if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t}\n\t\t\n\t\t//\tChannel Number\n\t\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t\t//\tUse the listen channel as the operating channel\n\t}\n\n\n\t//\tChannel List\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t*(u16*) ( p2pie + p2pielen ) = 6;\n\tp2pielen += 2;\n\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tValue:\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )\n\t{\n\t\tif ( pwdinfo->peer_operating_ch <= 14 )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\t\telse if ( ( pwdinfo->peer_operating_ch >= 36 ) && ( pwdinfo->peer_operating_ch <= 48 ) )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t}\n\t\tp2pie[ p2pielen++ ] = 1;\n\t\tp2pie[ p2pielen++ ] = pwdinfo->peer_operating_ch;\n\t}\n\telse\n\t{\n\t\tif ( pwdinfo->operating_channel <= 14 )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\t\telse if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t}\n\t\t\n\t\t//\tChannel Number\n\t\tp2pie[ p2pielen++ ] = 1;\n\t\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t\t//\tUse the listen channel as the operating channel\n\t}\n\n\tif (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )\n\t{\n\t\t//\tGroup ID Attribute\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tp2P Device Address\n\t\t_rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );\n\t\tp2pielen += ETH_ALEN;\n\n\t\t//\tSSID\n\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );\n\t\tp2pielen += pwdinfo->nego_ssidlen;\n\t}\n\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\n\t\n#ifdef CONFIG_WFD\n\twfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\nvoid issue_p2p_invitation_request(_adapter *padapter, u8* raddr )\n{\n\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_INVIT_REQ;\n\tu8\t\t\tp2pie[ 255 ] = { 0x00 };\n\tu8\t\t\tp2pielen = 0, i;\n\tu8\t\t\tdialogToken = 3;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;\n\tu16\t\t\tlen_channellist_attr = 0;\t\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif\n\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, raddr,  ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20101011\n\t//\tAccording to the P2P Specification, the P2P Invitation request frame should contain 7 P2P attributes\n\t//\t1. Configuration Timeout\n\t//\t2. Invitation Flags\n\t//\t3. Operating Channel\t( Only GO )\n\t//\t4. P2P Group BSSID\t( Should be included if I am the GO )\n\t//\t5. Channel List\n\t//\t6. P2P Group ID\n\t//\t7. P2P Device Info\n\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\t//\tInvitation Flags\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_INVITATION_FLAGS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = P2P_INVITATION_FLAGS_PERSISTENT;\n\n\n\t//\tOperating Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tOperating Class\n\tif ( pwdinfo->invitereq_info.operating_ch <= 14 )\n\t\tp2pie[ p2pielen++ ] = 0x51;\n\telse if ( ( pwdinfo->invitereq_info.operating_ch >= 36 ) && ( pwdinfo->invitereq_info.operating_ch <= 48 ) )\n\t\tp2pie[ p2pielen++ ] = 0x73;\n\telse\n\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\n\t//\tChannel Number\n\tp2pie[ p2pielen++ ] = pwdinfo->invitereq_info.operating_ch;\t//\toperating channel number\n\n\tif (_rtw_memcmp(adapter_mac_addr(padapter), pwdinfo->invitereq_info.go_bssid, ETH_ALEN))\n\t{\n\t\t//\tP2P Group BSSID\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tP2P Device Address for GO\n\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN );\n\t\tp2pielen += ETH_ALEN;\n\t}\n\n\t//\tChannel List\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t\n\t//\tLength:\n\t// Country String(3)\n\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t// + number of channels in all classes\n\tlen_channellist_attr = 3\n\t   + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes\n\t   + get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t}\n#else\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n #endif\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tChannel Entry List\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t//\tOperating Class\n\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t{\n\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\n\t\t//\tNumber of Channels\n\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t//\tChannel List\n\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#else // CONFIG_CONCURRENT_MODE\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\n\t//\tP2P Group ID\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 6 + pwdinfo->invitereq_info.ssidlen );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address for GO\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN );\n\tp2pielen += ETH_ALEN;\n\n\t//\tSSID\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid, pwdinfo->invitereq_info.ssidlen );\n\tp2pielen += pwdinfo->invitereq_info.ssidlen;\n\t\n\n\t//\tDevice Info\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tp2pielen += 2;\n\t\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );\n\tp2pielen += 2;\n\n\t//\tPrimary Device Type\n\t//\tCategory ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\tp2pielen += 2;\n\n\t//\tOUI\n\t*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\tp2pielen += 4;\n\n\t//\tSub Category ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\tp2pielen += 2;\n\n\t//\tNumber of Secondary Device Types\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tp2pielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\n\t\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\t\n\n#ifdef CONFIG_WFD\n\twfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\t\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\nvoid issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 status_code)\n{\n\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_INVIT_RESP;\n\tu8\t\t\tp2pie[ 255 ] = { 0x00 };\n\tu8\t\t\tp2pielen = 0, i;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;\n\tu16\t\t\tlen_channellist_attr = 0;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif\t\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, raddr,  ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20101005\n\t//\tAccording to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes\n\t//\t1. Status\n\t//\t2. Configuration Timeout\n\t//\t3. Operating Channel\t( Only GO )\n\t//\t4. P2P Group BSSID\t( Only GO )\n\t//\t5. Channel List\n\n\t//\tP2P Status\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_STATUS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tWhen status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE.\n\t//\tSent the event receiving the P2P Invitation Req frame to DMP UI.\n\t//\tDMP had to compare the MAC address to find out the profile.\n\t//\tSo, the WiFi driver will send the P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB.\n\t//\tIf the UI found the corresponding profile, the WiFi driver sends the P2P Invitation Req\n\t//\tto NB to rebuild the persistent group.\n\tp2pie[ p2pielen++ ] = status_code;\n\t\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\tif( status_code == P2P_STATUS_SUCCESS )\n\t{\n\t\tif( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) )\n\t\t{\n\t\t\t//\tThe P2P Invitation request frame asks this Wi-Fi device to be the P2P GO\n\t\t\t//\tIn this case, the P2P Invitation response frame should carry the two more P2P attributes.\n\t\t\t//\tFirst one is operating channel attribute.\n\t\t\t//\tSecond one is P2P Group BSSID attribute.\n\n\t\t\t//\tOperating Channel\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tCountry String\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\n\t\t\t//\tThe third byte should be set to 0x04.\n\t\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\t//\tCopy from SD7\n\t\t\n\t\t\t//\tChannel Number\n\t\t\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\t\t\t\n\n\t\t\t//\tP2P Group BSSID\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tP2P Device Address for GO\n\t\t\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\tp2pielen += ETH_ALEN;\n\n\t\t}\n\n\t\t//\tChannel List\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t\t//\tLength:\n\t\t// Country String(3)\n\t\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t\t// + number of channels in all classes\n\t\tlen_channellist_attr = 3\n\t\t\t+ (1 + 1) * (u16)pmlmeext->channel_list.reg_classes\n\t\t\t+ get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t{\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t\t}\n#else\n\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n#endif\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCountry String\n\t\tp2pie[ p2pielen++ ] = 'X';\n\t\tp2pie[ p2pielen++ ] = 'X';\n\n\t\t//\tThe third byte should be set to 0x04.\n\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t//\tChannel Entry List\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t{\n\t\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t\t//\tOperating Class\n\t\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t\t{\n\t\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t\t{\n\t\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t\t}\n\n\t\t\t//\tNumber of Channels\n\t\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t\t//\tChannel List\n\t\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint i, j;\n\t\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t\t//\tOperating Class\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t\t//\tNumber of Channels\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t\t//\tChannel List\n\t\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#else // CONFIG_CONCURRENT_MODE\n\t\t{\n\t\t\tint i, j;\n\t\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t\t//\tOperating Class\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t\t//\tNumber of Channels\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t\t//\tChannel List\n\t\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t}\n\t\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\t\n\t\n#ifdef CONFIG_WFD\n\twfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\nvoid issue_p2p_provision_request(_adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr )\n{\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu8\t\t\tdialogToken = 1;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_PROVISION_DISC_REQ;\n\tu8\t\t\twpsie[ 100 ] = { 0x00 };\n\tu8\t\t\twpsielen = 0;\n\tu32\t\t\tp2pielen = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\t\t\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pdev_raddr, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\t\n\n\tp2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, pssid, ussidlen, pdev_raddr );\n\n\tpframe += p2pielen;\n\tpattrib->pktlen += p2pielen;\n\n\twpsielen = 0;\n\t//\tWPS OUI\n\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\twpsielen += 4;\n\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t//\tConfig Method\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\twpsielen += 2;\n\n\t//\tValue:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request );\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\n\n#ifdef CONFIG_WFD\n\twfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\n\nu8 is_matched_in_profilelist( u8* peermacaddr, struct profile_info* profileinfo )\n{\n\tu8 i, match_result = 0;\n\n\tDBG_871X( \"[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\\n\", __FUNCTION__,\n\t  \t    peermacaddr[0], peermacaddr[1],peermacaddr[2],peermacaddr[3],peermacaddr[4],peermacaddr[5]);\n\t\n\tfor( i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++ )\n\t{\n\t       DBG_871X( \"[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X %.2X\\n\", __FUNCTION__,\n\t\t   \t    profileinfo->peermac[0], profileinfo->peermac[1],profileinfo->peermac[2],profileinfo->peermac[3],profileinfo->peermac[4],profileinfo->peermac[5]);\t\t   \n\t\tif ( _rtw_memcmp( peermacaddr, profileinfo->peermac, ETH_ALEN ) )\n\t\t{\n\t\t\tmatch_result = 1;\n\t\t\tDBG_871X( \"[%s] Match!\\n\", __FUNCTION__ );\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn (match_result );\n}\n\nvoid issue_probersp_p2p(_adapter *padapter, unsigned char *da)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\t\n\tunsigned char\t\t\t\t\t*mac;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t//WLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu16\t\t\t\t\tbeacon_interval = 100;\n\tu16\t\t\t\t\tcapInfo = 0;\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\tu8\t\t\t\t\twpsie[255] = { 0x00 };\n\tu32\t\t\t\t\twpsielen = 0, p2pielen = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n#ifdef CONFIG_INTEL_WIDI\n\tu8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };\n#endif //CONFIG_INTEL_WIDI\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\t\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\t\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\t\n\t\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\t\t\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\tmac = adapter_mac_addr(padapter);\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\t\n\t//\tUse the device address for BSSID field.\t\n\t_rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(fctrl, WIFI_PROBERSP);\n\t\n\tpattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = pattrib->hdrlen;\n\tpframe += pattrib->hdrlen;\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpattrib->pktlen += 8;\n\n\t// beacon interval: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); \n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\t//\tcapability info: 2 bytes\n\t//\tESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec)\n\tcapInfo |= cap_ShortPremble;\n\tcapInfo |= cap_ShortSlot;\n\t\n\t_rtw_memcpy(pframe, (unsigned char *) &capInfo, 2);\n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen);\n\n\t// supported rates...\n\t//\tUse the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pattrib->pktlen);\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL )\n\t\t{\n\t\t\t//WPS IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);\n\t\t\tpattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len;\n\t\t\tpframe += pmlmepriv->wps_probe_resp_ie_len;\n\n\t\t\t//P2P IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len);\n\t\t\tpattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len;\n\t\t\tpframe += pmlmepriv->p2p_probe_resp_ie_len;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\t\t\n\t{\n\n\t\t//\tTodo: WPS IE\n\t\t//\tNoted by Albert 20100907\n\t\t//\tAccording to the WPS specification, all the WPS attribute is presented by Big Endian.\n\n\t\twpsielen = 0;\n\t\t//\tWPS OUI\n\t\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tWPS version\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n#ifdef CONFIG_INTEL_WIDI\n\t\t//\tCommented by Kurt\n\t\t//\tAppended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext.\n\t\tif(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE \n\t\t\t|| pmlmepriv->num_p2p_sdt != 0 )\n\t\t{\n\t\t\t//Sec dev type\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tCategory ID\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tOUI\n\t\t\t*(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI );\n\t\t\twpsielen += 4;\n\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK );\n\t\t\twpsielen += 2;\n\n\t\t\tif(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE )\n\t\t\t{\n\t\t\t\t//\tVendor Extension\n\t\t\t\t_rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN );\n\t\t\t\twpsielen += L2SDTA_SERVICE_VE_LEN;\n\t\t\t}\n\t\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t\t//\tWiFi Simple Config State\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG;\t//\tNot Configured.\n\n\t\t//\tResponse Type\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;\n\n\t\t//\tUUID-E\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\tif (pwdinfo->external_uuid == 0) {\n\t\t\t_rtw_memset( wpsie + wpsielen, 0x0, 16 );\n\t\t\t_rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN);\n\t\t} else {\n\t\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );\n\t\t}\n\t\twpsielen += 0x10;\n\n\t\t//\tManufacturer\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"Realtek\", 7 );\n\t\twpsielen += 7;\n\n\t\t//\tModel Name\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 );\n\t\twpsielen += 2;\t\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"8192CU\", 6 );\n\t\twpsielen += 6;\n\n\t\t//\tModel Number\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[ wpsielen++ ] = 0x31;\t\t//\tcharacter 1\n\n\t\t//\tSerial Number\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"123456\" , ETH_ALEN );\n\t\twpsielen += ETH_ALEN;\n\n\t\t//\tPrimary Device Type\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCategory ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\twpsielen += 2;\n\n\t\t//\tOUI\n\t\t*(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tSub Category ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\twpsielen += 2;\n\n\t\t//\tDevice Name\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\twpsielen += pwdinfo->device_name_len;\n\n\t\t//\tConfig Method\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\t\twpsielen += 2;\n\t\t\n\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\t\t\n\n\t\tp2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);\n\t\tpframe += p2pielen;\n\t\tpattrib->pktlen += p2pielen;\n\t}\n\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( _TRUE == pwdinfo->wfd_info->wfd_enable )\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\twfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\telse if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0)\n\t{\n\t\t//WFD IE\n\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len);\n\t\tpattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len;\n\t\tpframe += pmlmepriv->wfd_probe_resp_ie_len;\t\t\n\t}\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_WFD\t\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\n\tdump_mgntframe(padapter, pmgntframe);\n\t\n\treturn;\n\n}\n\nint _issue_probereq_p2p(_adapter *padapter, u8 *da, int wait_ack)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tunsigned char\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t*fctrl;\n\tunsigned char\t\t\t*mac;\n\tunsigned char\t\t\tbssrate[NumRates];\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint\tbssrate_len = 0;\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\t\n\tu8\t\t\t\t\twpsie[255] = { 0x00 }, p2pie[ 255 ] = { 0x00 };\n\tu16\t\t\t\t\twpsielen = 0, p2pielen = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tmac = adapter_mac_addr(padapter);\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif (da) {\n\t\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN);\n\t} else {\n\t\tif ( ( pwdinfo->p2p_info.scan_op_ch_only ) || ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) )\n\t\t{\n\t\t\t//\tThis two flags will be set when this is only the P2P client mode.\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, pwdinfo->p2p_peer_interface_addr, ETH_ALEN);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tbroadcast probe request frame\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);\n\t\t}\n\t}\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_PROBEREQ);\n\n\tpframe += sizeof (struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &(pattrib->pktlen));\n\t}\n\telse\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, P2P_WILDCARD_SSID_LEN, pwdinfo->p2p_wildcard_ssid, &(pattrib->pktlen));\n\t}\n\t//\tUse the OFDM rate in the P2P probe request frame. ( 6(B), 9(B), 12(B), 24(B), 36, 48, 54 )\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pattrib->pktlen);\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif( pmlmepriv->wps_probe_req_ie != NULL && pmlmepriv->p2p_probe_req_ie != NULL )\n\t\t{\n\t\t\t//WPS IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);\n\t\t\tpattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;\n\t\t\tpframe += pmlmepriv->wps_probe_req_ie_len;\n\n\t\t\t//P2P IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_probe_req_ie, pmlmepriv->p2p_probe_req_ie_len);\n\t\t\tpattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len;\n\t\t\tpframe += pmlmepriv->p2p_probe_req_ie_len;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\n\t\t//\tWPS IE\n\t\t//\tNoted by Albert 20110221\n\t\t//\tAccording to the WPS specification, all the WPS attribute is presented by Big Endian.\n\n\t\twpsielen = 0;\n\t\t//\tWPS OUI\n\t\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tWPS version\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t\tif( pmlmepriv->wps_probe_req_ie == NULL )\n\t\t{\n\t\t\t//\tUUID-E\n\t\t\t//\tType:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tValue:\n\t\t\tif (pwdinfo->external_uuid == 0) {\n\t\t\t\t_rtw_memset( wpsie + wpsielen, 0x0, 16 );\n\t\t\t\t_rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN);\n\t\t\t} else {\n\t\t\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );\n\t\t\t}\n\t\t\twpsielen += 0x10;\n\n\t\t\t//\tConfig Method\n\t\t\t//\tType:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\t\t\twpsielen += 2;\n\t\t}\n\n\t\t//\tDevice Name\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\twpsielen += pwdinfo->device_name_len;\n\n\t\t//\tPrimary Device Type\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCategory ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_RTK_WIDI );\n\t\twpsielen += 2;\n\n\t\t//\tOUI\n\t\t*(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tSub Category ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_RTK_DMP );\n\t\twpsielen += 2;\n\n\t\t//\tDevice Password ID\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );\t//\tRegistrar-specified\n\t\twpsielen += 2;\t\n\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\t\t\n\t\t//\tP2P OUI\n\t\tp2pielen = 0;\n\t\tp2pie[ p2pielen++ ] = 0x50;\n\t\tp2pie[ p2pielen++ ] = 0x6F;\n\t\tp2pie[ p2pielen++ ] = 0x9A;\n\t\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t\t//\tCommented by Albert 20110221\n\t\t//\tAccording to the P2P Specification, the probe request frame should contain 5 P2P attributes\n\t\t//\t1. P2P Capability\n\t\t//\t2. P2P Device ID if this probe request wants to find the specific P2P device\n\t\t//\t3. Listen Channel\n\t\t//\t4. Extended Listen Timing\n\t\t//\t5. Operating Channel if this WiFi is working as the group owner now\n\n\t\t//\tP2P Capability\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tDevice Capability Bitmap, 1 byte\n\t\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t\t\n\t\t//\tGroup Capability Bitmap, 1 byte\n\t\tif ( pwdinfo->persistent_supported )\n\t\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;\n\t\telse\n\t\t\tp2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;\n\n\t\t//\tListen Channel\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_LISTEN_CH;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCountry String\n\t\tp2pie[ p2pielen++ ] = 'X';\n\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\n\t\t//\tThe third byte should be set to 0x04.\n\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x51;\t//\tCopy from SD7\n\t\t\n\t\t//\tChannel Number\n\t\tp2pie[ p2pielen++ ] = pwdinfo->listen_channel;\t//\tlisten channel\n\t\t\n\n\t\t//\tExtended Listen Timing\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tAvailability Period\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\t\tp2pielen += 2;\n\n\t\t//\tAvailability Interval\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\t\tp2pielen += 2;\n\n\t\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )\n\t\t{\n\t\t\t//\tOperating Channel (if this WiFi is working as the group owner now)\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tCountry String\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\n\t\t\t//\tThe third byte should be set to 0x04.\n\t\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\t//\tCopy from SD7\n\t\t\n\t\t\t//\tChannel Number\n\t\t\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\t\t\t\n\t\t}\n\t\t\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\t\n\n\t}\n\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( _TRUE == pwdinfo->wfd_info->wfd_enable )\n#endif\n\t{\n\t\twfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\telse if (pmlmepriv->wfd_probe_req_ie != NULL && pmlmepriv->wfd_probe_req_ie_len>0)\t\t\n\t{\n\t\t//WFD IE\n\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_probe_req_ie, pmlmepriv->wfd_probe_req_ie_len);\n\t\tpattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len;\n\t\tpframe += pmlmepriv->wfd_probe_req_ie_len;\t\t\n\t}\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_WFD\t\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"issuing probe_req, tx_len=%d\\n\", pattrib->last_txcmdsz));\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n}\n\ninline void issue_probereq_p2p(_adapter *adapter, u8 *da)\n{\n\t_issue_probereq_p2p(adapter, da, _FALSE);\n}\n\n/*\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n */\nint issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms)\n{\n\tint ret;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\n\tdo\n\t{\n\t\tret = _issue_probereq_p2p(adapter, da, wait_ms>0?_TRUE:_FALSE);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(adapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(adapter), MAC_ARG(da), rtw_get_oper_ch(adapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(adapter), rtw_get_oper_ch(adapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\n#endif //CONFIG_P2P\n\ns32 rtw_action_public_decache(union recv_frame *recv_frame, s32 token)\n{\n\t_adapter *adapter = recv_frame->u.hdr.adapter;\n\tstruct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);\n\tu8 *frame = recv_frame->u.hdr.rx_data;\n\tu16 seq_ctrl = ( (recv_frame->u.hdr.attrib.seq_num&0xffff) << 4) |\n\t\t(recv_frame->u.hdr.attrib.frag_num & 0xf);\n\t\n\tif (GetRetry(frame)) {\n\t\tif (token >= 0) {\n\t\t\tif ((seq_ctrl == mlmeext->action_public_rxseq)\n\t\t\t\t&& (token == mlmeext->action_public_dialog_token))\n\t\t\t{\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" seq_ctrl=0x%x, rxseq=0x%x, token:%d\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq, token);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\t\t} else {\n\t\t\tif (seq_ctrl == mlmeext->action_public_rxseq) {\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" seq_ctrl=0x%x, rxseq=0x%x\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(adapter), seq_ctrl, mlmeext->action_public_rxseq);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tmlmeext->action_public_rxseq = seq_ctrl;\n\t\n\tif (token >= 0)\n\t\tmlmeext->action_public_dialog_token = token;\n\n\treturn _SUCCESS;\n}\n\nunsigned int on_action_public_p2p(union recv_frame *precv_frame)\n{\n\t_adapter *padapter = precv_frame->u.hdr.adapter;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint len = precv_frame->u.hdr.len;\n\tu8 *frame_body;\n\tu8 dialogToken=0;\n#ifdef CONFIG_P2P\n\tu8 *p2p_ie;\n\tu32\tp2p_ielen, wps_ielen;\n\tstruct\twifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\tresult = P2P_STATUS_SUCCESS;\n\tu8\tempty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n\tu8 *merged_p2pie = NULL;\n\tu32 merged_p2p_ielen= 0;\n#endif //CONFIG_P2P\n\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tdialogToken = frame_body[7];\n\n\tif (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)\n\t\treturn _FAIL;\n\t\n#ifdef CONFIG_P2P\n\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );\n#ifdef CONFIG_IOCTL_CFG80211\n\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211)\n\t{\n\t\trtw_cfg80211_rx_p2p_action_public(padapter, pframe, len);\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\t//\tDo nothing if the driver doesn't enable the P2P function.\n\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t\t\treturn _SUCCESS;\n\n\t\tlen -= sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t\tswitch( frame_body[ 6 ] )//OUI Subtype\n\t\t{\n\t\t\tcase P2P_GO_NEGO_REQ:\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] Got GO Nego Req Frame\\n\", __FUNCTION__);\n\t\t\t\t_rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );\n\n\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\t\t\t}\n\n\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))\n\t\t\t\t{\n\t\t\t\t\t//\tCommented by Albert 20110526\n\t\t\t\t\t//\tIn this case, this means the previous nego fail doesn't be reset yet.\n\t\t\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t\t\t//\tRestore the previous p2p state\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\t\t\t\tDBG_871X( \"[%s] Restore the previous p2p state to %d\\n\", __FUNCTION__, rtw_p2p_state(pwdinfo) );\t\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );\n\t\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\t\t\t//\tCommented by Kurt 20110902\n\t\t\t\t//Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered.\n\t\t\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))\n\t\t\t\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\n\t\t\t\t//\tCommented by Kurt 20120113\n\t\t\t\t//\tGet peer_dev_addr here if peer doesn't issue prov_disc frame.\n\t\t\t\tif( _rtw_memcmp(pwdinfo->rx_prov_disc_info.peerDevAddr, empty_addr, ETH_ALEN) )\n\t\t\t\t\t_rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);\n\n\t\t\t\tresult = process_p2p_group_negotation_req( pwdinfo, frame_body, len );\n\t\t\t\tissue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );\n#ifdef CONFIG_INTEL_WIDI\n\t\t\t\tif (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {\n\t\t\t\t\tpadapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;\n\t\t\t\t\t_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));\n\t\t\t\t\tintel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);\n\t\t\t\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t\t\t\t//\tCommented by Albert 20110718\n\t\t\t\t//\tNo matter negotiating or negotiation failure, the driver should set up the restore P2P state timer.\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\t//\tCommented by Albert 20120107\n\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );\n#else // CONFIG_CONCURRENT_MODE\n\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t}\n\t\t\tcase P2P_GO_NEGO_RESP:\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] Got GO Nego Resp Frame\\n\", __FUNCTION__);\n\n\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))\n\t\t\t\t{\n\t\t\t\t\t//\tCommented by Albert 20110425\n\t\t\t\t\t//\tThe restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function.\n\t\t\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t\t\tpwdinfo->nego_req_info.benable = _FALSE;\n\t\t\t\t\tresult = process_p2p_group_negotation_resp( pwdinfo, frame_body, len);\n\t\t\t\t\tissue_p2p_GO_confirm( pwdinfo->padapter, GetAddr2Ptr(pframe), result);\n\t\t\t\t\tif ( P2P_STATUS_SUCCESS == result )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;\n\t\t\t\t\t\t\t#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 1 ] = 1;\t//Check whether GO is operating in channel 1;\n\t\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 2 ] = 6;\t//Check whether GO is operating in channel 6;\n\t\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 3 ] = 11;\t//Check whether GO is operating in channel 11;\n\t\t\t\t\t\t\t#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\t\tpwdinfo->p2p_info.scan_op_ch_only = 1;\n\t\t\t\t\t\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//\tReset the dialog token for group negotiation frames.\n\t\t\t\t\tpwdinfo->negotiation_dialog_token = 1;\n\n\t\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))\n\t\t\t\t\t{\n\t\t\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_871X( \"[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\\n\", __FUNCTION__);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase P2P_GO_NEGO_CONF:\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] Got GO Nego Confirm Frame\\n\", __FUNCTION__);\n\t\t\t\tresult = process_p2p_group_negotation_confirm( pwdinfo, frame_body, len);\n\t\t\t\tif ( P2P_STATUS_SUCCESS == result )\n\t\t\t\t{\n\t\t\t\t\tif ( rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT )\n\t\t\t\t\t{\n\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;\n\t\t\t\t\t\t#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 1 ] = 1;\t//Check whether GO is operating in channel 1;\n\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 2 ] = 6;\t//Check whether GO is operating in channel 6;\n\t\t\t\t\t\tpwdinfo->p2p_info.operation_ch[ 3 ] = 11;\t//Check whether GO is operating in channel 11;\n\t\t\t\t\t\t#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\tpwdinfo->p2p_info.scan_op_ch_only = 1;\n\t\t\t\t\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey2, P2P_RESET_SCAN_CH );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase P2P_INVIT_REQ:\n\t\t\t{\n\t\t\t\t//\tAdded by Albert 2010/10/05\n\t\t\t\t//\tReceived the P2P Invite Request frame.\n\t\t\t\t\n\t\t\t\tDBG_871X( \"[%s] Got invite request frame!\\n\", __FUNCTION__ );\n\t\t\t\tif ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )\n\t\t\t\t{\n\t\t\t\t\t//\tParse the necessary information from the P2P Invitation Request frame.\n\t\t\t\t\t//\tFor example: The MAC address of sending this P2P Invitation Request frame.\n\t\t\t\t\tu32\tattr_contentlen = 0;\n\t\t\t\t\tu8\tstatus_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\tstruct group_id_info group_id;\n\t\t\t\t\tu8\tinvitation_flag = 0;\n\t\t\t\t\tint j=0;\n\n\t\t\t\t\tmerged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_);\n\n\t\t\t\t\tmerged_p2pie = rtw_zmalloc(merged_p2p_ielen + 2);\t// 2 is for EID and Length\n\t\t\t\t\tif (merged_p2pie == NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X( \"[%s] Malloc p2p ie fail\\n\", __FUNCTION__);\n\t\t\t\t\t\tgoto exit;\n\t\t\t\t\t}\n\t\t\t\t\t_rtw_memset(merged_p2pie, 0x00, merged_p2p_ielen);\t\t\t\t\t\n\n\t\t\t\t\tmerged_p2p_ielen = rtw_p2p_merge_ies(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, merged_p2pie);\n\n\t\t\t\t\trtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen);\n\t\t\t\t\tif ( attr_contentlen )\n\t\t\t\t\t{\n\n\t\t\t\t\t\trtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen);\n\t\t\t\t\t\t//\tCommented by Albert 20120510\n\t\t\t\t\t\t//\tCopy to the pwdinfo->p2p_peer_interface_addr.\n\t\t\t\t\t\t//\tSo that the WFD UI ( or Sigma ) can get the peer interface address by using the following command.\n\t\t\t\t\t\t//\t#> iwpriv wlan0 p2p_get peer_ifa\n\t\t\t\t\t\t//\tAfter having the peer interface address, the sigma can find the correct conf file for wpa_supplicant.\n\n\t\t\t\t\t\tif ( attr_contentlen )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X( \"[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\\n\", __FUNCTION__,\n\t\t\t\t\t\t\t\t\tpwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1],\n\t\t\t\t\t\t\t\t\tpwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3],\n\t\t\t\t\t\t\t\t\tpwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5] );\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\tif ( invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//\tRe-invoke the persistent group.\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t_rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) );\n\t\t\t\t\t\t\trtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen);\n\t\t\t\t\t\t\tif ( attr_contentlen )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (_rtw_memcmp(group_id.go_device_addr, adapter_mac_addr(padapter), ETH_ALEN))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//\tThe p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO.\n\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO );\n\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_GO );\n\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_SUCCESS;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//\tThe p2p device sending this p2p invitation request wants to be the persistent GO.\n\t\t\t\t\t\t\t\t\tif ( is_matched_in_profilelist( pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ] ) )\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tu8 operatingch_info[5] = { 0x00 };\n\t\t\t\t\t\t\t\t\t\tif ( rtw_get_p2p_attr_content(merged_p2pie, merged_p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif( rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4] ) >= 0 )\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t//\tThe operating channel is acceptable for this device.\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4];\n\t\t\t\t\t\t\t\t\t\t\t\t#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->rx_invitereq_info.operation_ch[1]= 1;\t\t//Check whether GO is operating in channel 1;\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->rx_invitereq_info.operation_ch[2]= 6;\t\t//Check whether GO is operating in channel 6;\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->rx_invitereq_info.operation_ch[3]= 11;\t\t//Check whether GO is operating in channel 11;\n\t\t\t\t\t\t\t\t\t\t\t\t#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t\t\t\t\t\t\t\t\t\t\t\tpwdinfo->rx_invitereq_info.scan_op_ch_only = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey, P2P_RESET_SCAN_CH );\n\t\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH );\n\t\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );\n\t\t\t\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_SUCCESS;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t//\tThe operating channel isn't supported by this device.\n\t\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );\n\t\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_DEVICE );\n\t\t\t\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_NO_COMMON_CH;\n\t\t\t\t\t\t\t\t\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t//\tCommented by Albert 20121130\n\t\t\t\t\t\t\t\t\t\t\t//\tIntel will use the different P2P IE to store the operating channel information\n\t\t\t\t\t\t\t\t\t\t\t//\tWorkaround for Intel WiDi 3.5\n\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH );\n\t\t\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );\n\t\t\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_SUCCESS;\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );\n\t\t\t\t\t\t\t\t\t\t#ifdef CONFIG_INTEL_WIDI\n\t\t\t\t\t\t\t\t\t\t_rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN );\n\t\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );\n\t\t\t\t\t\t\t\t\t\t#endif //CONFIG_INTEL_WIDI\n\n\t\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBG_871X( \"[%s] P2P Group ID Attribute NOT FOUND!\\n\", __FUNCTION__ );\n\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//\tReceived the invitation to join a P2P group.\n\n\t\t\t\t\t\t\t_rtw_memset( &group_id, 0x00, sizeof( struct group_id_info ) );\n\t\t\t\t\t\t\trtw_get_p2p_attr_content( merged_p2pie, merged_p2p_ielen, P2P_ATTR_GROUP_ID, ( u8* ) &group_id, &attr_contentlen);\n\t\t\t\t\t\t\tif ( attr_contentlen )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (_rtw_memcmp(group_id.go_device_addr, adapter_mac_addr(padapter), ETH_ALEN))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//\tIn this case, the GO can't be myself.\n\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH );\n\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//\tThe p2p device sending this p2p invitation request wants to join an existing P2P group\n\t\t\t\t\t\t\t\t\t//\tCommented by Albert 2012/06/28\n\t\t\t\t\t\t\t\t\t//\tIn this case, this Wi-Fi device should use the iwpriv command to get the peer device address.\n\t\t\t\t\t\t\t\t\t//\tThe peer device address should be the destination address for the provisioning discovery request.\n\t\t\t\t\t\t\t\t\t//\tThen, this Wi-Fi device should use the iwpriv command to get the peer interface address.\n\t\t\t\t\t\t\t\t\t//\tThe peer interface address should be the address for WPS mac address\n\t\t\t\t\t\t\t\t\t_rtw_memcpy( pwdinfo->p2p_peer_device_addr, group_id.go_device_addr , ETH_ALEN );\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\trtw_p2p_set_role( pwdinfo, P2P_ROLE_CLIENT );\n\t\t\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN );\n\t\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_SUCCESS;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDBG_871X( \"[%s] P2P Group ID Attribute NOT FOUND!\\n\", __FUNCTION__ );\n\t\t\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X( \"[%s] P2P Invitation Flags Attribute NOT FOUND!\\n\", __FUNCTION__ );\n\t\t\t\t\t\tstatus_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\t}\t\t\t\t\t\t\t\n\n\t\t\t\t\tDBG_871X( \"[%s] status_code = %d\\n\", __FUNCTION__, status_code );\n\n\t\t\t\t\tpwdinfo->inviteresp_info.token = frame_body[ 7 ];\n\t\t\t\t\tissue_p2p_invitation_response( padapter, GetAddr2Ptr(pframe), pwdinfo->inviteresp_info.token, status_code );\n\t\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );\n\t\t\t\t}\n#ifdef CONFIG_INTEL_WIDI\n\t\t\t\tif (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {\n\t\t\t\t\tpadapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;\n\t\t\t\t\t_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));\n\t\t\t\t\tintel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);\n\t\t\t\t}\n#endif //CONFIG_INTEL_WIDI\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase P2P_INVIT_RESP:\n\t\t\t{\n\t\t\t\tu8\tattr_content = 0x00;\n\t\t\t\tu32\tattr_contentlen = 0;\n\t\t\t\t\n\t\t\t\tDBG_871X( \"[%s] Got invite response frame!\\n\", __FUNCTION__ );\n\t\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t\tif ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )\n\t\t\t\t{\n\t\t\t\t\trtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tif ( attr_contentlen == 1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X( \"[%s] Status = %d\\n\", __FUNCTION__, attr_content );\n\t\t\t\t\t\tpwdinfo->invitereq_info.benable = _FALSE;\n\n\t\t\t\t\t\tif ( attr_content == P2P_STATUS_SUCCESS )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (_rtw_memcmp(pwdinfo->invitereq_info.go_bssid, adapter_mac_addr(padapter), ETH_ALEN))\n\t\t\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO );\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\n\t\t\t\t\t\t\trtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_OK );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\t\t\trtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\t\trtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\trtw_p2p_set_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL );\n\t\t\t\t}\n\n\t\t\t\tif ( rtw_p2p_chk_state( pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL ) )\n\t\t\t\t{\n\t\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, 5000 );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase P2P_DEVDISC_REQ:\n\n\t\t\t\tprocess_p2p_devdisc_req(pwdinfo, pframe, len);\n\n\t\t\t\tbreak;\n\n\t\t\tcase P2P_DEVDISC_RESP:\n\n\t\t\t\tprocess_p2p_devdisc_resp(pwdinfo, pframe, len);\n\n\t\t\t\tbreak;\n\n\t\t\tcase P2P_PROVISION_DISC_REQ:\n\t\t\t\tDBG_871X( \"[%s] Got Provisioning Discovery Request Frame\\n\", __FUNCTION__ );\n\t\t\t\tprocess_p2p_provdisc_req(pwdinfo, pframe, len);\n\t\t\t\t_rtw_memcpy(pwdinfo->rx_prov_disc_info.peerDevAddr, GetAddr2Ptr(pframe), ETH_ALEN);\n\n\t\t\t\t//20110902 Kurt\n\t\t\t\t//Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered.\n\t\t\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))\n\t\t\t\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\t\t\t\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);\n\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );\n#ifdef CONFIG_INTEL_WIDI\n\t\t\t\tif (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {\n\t\t\t\t\tpadapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;\n\t\t\t\t\t_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));\n\t\t\t\t\tintel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);\n\t\t\t\t}\n#endif //CONFIG_INTEL_WIDI\n\t\t\t\tbreak;\n\n\t\t\tcase P2P_PROVISION_DISC_RESP:\n\t\t\t\t//\tCommented by Albert 20110707\n\t\t\t\t//\tShould we check the pwdinfo->tx_prov_disc_info.bsent flag here??\n\t\t\t\tDBG_871X( \"[%s] Got Provisioning Discovery Response Frame\\n\", __FUNCTION__ );\n\t\t\t\t//\tCommented by Albert 20110426\n\t\t\t\t//\tThe restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function.\n\t\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP);\n\t\t\t\tprocess_p2p_provdisc_resp(pwdinfo, pframe);\n\t\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\nexit:\n\n\tif(merged_p2pie)\n\t{\n\t\trtw_mfree(merged_p2pie, merged_p2p_ielen + 2);\n\t}\n#endif //CONFIG_P2P\n\treturn _SUCCESS;\n}\n\nunsigned int on_action_public_vendor(union recv_frame *precv_frame)\n{\n\tunsigned int ret = _FAIL;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tif (_rtw_memcmp(frame_body + 2, P2P_OUI, 4) == _TRUE) {\n\t\tret = on_action_public_p2p(precv_frame);\n\t}\n\n\treturn ret;\n}\n\nunsigned int on_action_public_default(union recv_frame *precv_frame, u8 action)\n{\n\tunsigned int ret = _FAIL;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu8 token;\n\t_adapter *adapter = precv_frame->u.hdr.adapter;\n\tint cnt = 0;\n\tchar msg[64];\n\n\ttoken = frame_body[2];\n\n\tif (rtw_action_public_decache(precv_frame, token) == _FAIL)\n\t\tgoto exit;\n\n\t#ifdef CONFIG_IOCTL_CFG80211\n\tcnt += sprintf((msg+cnt), \"%s(token:%u)\", action_public_str(action), token);\n\trtw_cfg80211_rx_action(adapter, pframe, frame_len, msg);\n\t#endif\n\n\tret = _SUCCESS;\n\t\nexit:\n\treturn ret;\n}\n\nunsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tunsigned int ret = _FAIL;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu8 category, action;\n\n\t/* check RA matches or not */\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN))\n\t\tgoto exit;\n\n\tcategory = frame_body[0];\n\tif (category != RTW_WLAN_CATEGORY_PUBLIC)\n\t\tgoto exit;\n\n\taction = frame_body[1];\n\tswitch (action) {\n\tcase ACT_PUBLIC_BSSCOEXIST:\n#ifdef CONFIG_80211N_HT\n#ifdef CONFIG_AP_MODE\n\t\t/*20/40 BSS Coexistence Management frame is a Public Action frame*/\n\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\trtw_process_public_act_bsscoex(padapter, pframe, frame_len);\n#endif /*CONFIG_AP_MODE*/\n#endif /*CONFIG_80211N_HT*/\n\t\tbreak;\n\tcase ACT_PUBLIC_VENDOR:\n\t\tret = on_action_public_vendor(precv_frame);\n\t\tbreak;\n\tdefault:\n\t\tret = on_action_public_default(precv_frame, action);\n\t\tbreak;\n\t}\n\nexit:\n\treturn ret;\n}\n\nunsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu8 category, action;\n\n\t/* check RA matches or not */\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN))\n\t\tgoto exit;\n\n\tcategory = frame_body[0];\n\tif (category != RTW_WLAN_CATEGORY_HT)\n\t\tgoto exit;\n\n\taction = frame_body[1];\n\tswitch (action) {\n\tcase RTW_WLAN_ACTION_HT_SM_PS:\n#ifdef CONFIG_80211N_HT\n#ifdef CONFIG_AP_MODE\n\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\trtw_process_ht_action_smps(padapter, GetAddr2Ptr(pframe), frame_body[2]);\n#endif /*CONFIG_AP_MODE*/\n#endif /*CONFIG_80211N_HT*/\t\t\n\t\t\tbreak;\n\tcase RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING:\n#ifdef CONFIG_BEAMFORMING\n\t\t/*DBG_871X(\"RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING\\n\");*/\n\t\tbeamforming_get_report_frame(padapter, precv_frame);\n#endif /*CONFIG_BEAMFORMING*/\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\nexit:\n\n\treturn _SUCCESS;\n}\n\n#ifdef CONFIG_IEEE80211W\nunsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct sta_info\t\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu16 tid;\n\t//Baron\n\t\n\tDBG_871X(\"OnAction_sa_query\\n\");\n\t\n\tswitch (pframe[WLAN_HDR_A3_LEN+1])\n\t{\n\t\tcase 0: //SA Query req\n\t\t\t_rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(u16));\n\t\t\tDBG_871X(\"OnAction_sa_query request,action=%d, tid=%04x, pframe=%02x-%02x\\n\"\n\t\t\t, pframe[WLAN_HDR_A3_LEN+1], tid, pframe[WLAN_HDR_A3_LEN+2], pframe[WLAN_HDR_A3_LEN+3]);\n\t\t\tissue_action_SA_Query(padapter, GetAddr2Ptr(pframe), 1, tid, IEEE80211W_RIGHT_KEY);\n\t\t\tbreak;\n\n\t\tcase 1: //SA Query rsp\n\t\t\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\n\t\t\tif (psta != NULL)\n\t\t\t\t_cancel_timer_ex(&psta->dot11w_expire_timer);\n\t\t\t\n\t\t\t_rtw_memcpy(&tid, &pframe[WLAN_HDR_A3_LEN+2], sizeof(u16));\n\t\t\tDBG_871X(\"OnAction_sa_query response,action=%d, tid=%04x, cancel timer\\n\", pframe[WLAN_HDR_A3_LEN+1], tid);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tif(0)\n\t{\n\t\tint pp;\n\t\tprintk(\"pattrib->pktlen = %d =>\", pattrib->pkt_len);\n\t\tfor(pp=0;pp< pattrib->pkt_len; pp++)\n\t\t\tprintk(\" %02x \", pframe[pp]);\n\t\tprintk(\"\\n\");\n\t}\t\n\t\n\treturn _SUCCESS;\n}\n#endif //CONFIG_IEEE80211W\n\nunsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame)\n{\n\treturn _SUCCESS;\n}\n\nunsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_80211AC_VHT\n\tstruct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint frame_len = precv_frame->u.hdr.len;\n\tstruct rtw_ieee80211_hdr_3addr *whdr = (struct rtw_ieee80211_hdr_3addr *)pframe;\n\tu8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tu8 category, action;\n\tstruct sta_info *psta = NULL;\n\n\t/* check RA matches or not */\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN))\n\t\tgoto exit;\n\n\tcategory = frame_body[0];\n\tif(category != RTW_WLAN_CATEGORY_VHT)\n\t\tgoto exit;\n\n\taction = frame_body[1];\n\tswitch (action) {\n\tcase RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING:\n#ifdef CONFIG_BEAMFORMING\n\t\t/*DBG_871X(\"RTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING\\n\");*/\n\t\tbeamforming_get_report_frame(padapter, precv_frame);\n#endif /*CONFIG_BEAMFORMING*/\n\t\tbreak;\n\tcase RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION:\n\t\t// CategoryCode(1) + ActionCode(1) + OpModeNotification(1)\n\t\t//DBG_871X(\"RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION\\n\");\n\t\tpsta = rtw_get_stainfo(&padapter->stapriv, whdr->addr2);\n\t\tif (psta)\n\t\t\trtw_process_vht_op_mode_notify(padapter, &frame_body[2], psta);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\nexit:\n#endif //CONFIG_80211AC_VHT\n\n\treturn _SUCCESS;\n}\n\nunsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_P2P\n\tu8 *frame_body;\n\tu8 category, OUI_Subtype, dialogToken=0;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tuint len = precv_frame->u.hdr.len;\n\tstruct\twifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\t//check RA matches or not\n\tif (!_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(pframe), ETH_ALEN))\n\t\treturn _SUCCESS;\n\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tcategory = frame_body[0];\n\tif(category != RTW_WLAN_CATEGORY_P2P)\n\t\treturn _SUCCESS;\n\n\tif ( cpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ) != P2POUI )\n\t\treturn _SUCCESS;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif (adapter_wdev_data(padapter)->p2p_enabled\n\t\t&& pwdinfo->driver_interface == DRIVER_CFG80211\n\t\t) {\n\t\trtw_cfg80211_rx_action_p2p(padapter, pframe, len);\n\t\treturn _SUCCESS;\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\tlen -= sizeof(struct rtw_ieee80211_hdr_3addr);\n\t\tOUI_Subtype = frame_body[5];\n\t\tdialogToken = frame_body[6];\n\n\t\tswitch(OUI_Subtype)\n\t\t{\n\t\t\tcase P2P_NOTICE_OF_ABSENCE:\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase P2P_PRESENCE_REQUEST:\n\n\t\t\t\tprocess_p2p_presence_req(pwdinfo, pframe, len);\t\t\t\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase P2P_PRESENCE_RESPONSE:\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase P2P_GO_DISC_REQUEST:\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t}\n\t}\n#endif //CONFIG_P2P\n\n\treturn _SUCCESS;\n\n}\n\nunsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tint i;\n\tunsigned char\tcategory;\n\tstruct action_handler *ptable;\n\tunsigned char\t*frame_body;\n\tu8 *pframe = precv_frame->u.hdr.rx_data; \n\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\n\tcategory = frame_body[0];\n\t\n\tfor(i = 0; i < sizeof(OnAction_tbl)/sizeof(struct action_handler); i++)\t\n\t{\n\t\tptable = &OnAction_tbl[i];\n\t\t\n\t\tif(category == ptable->num)\n\t\t\tptable->func(padapter, precv_frame);\n\t\n\t}\n\n\treturn _SUCCESS;\n\n}\n\nunsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame)\n{\n\n\t//DBG_871X(\"rcvd mgt frame(%x, %x)\\n\", (GetFrameSubType(pframe) >> 4), *(unsigned int *)GetAddr1Ptr(pframe));\n\treturn _SUCCESS;\n}\n\nstruct xmit_frame *_alloc_mgtxmitframe(struct xmit_priv *pxmitpriv, bool once)\n{\n\tstruct xmit_frame *pmgntframe;\n\tstruct xmit_buf *pxmitbuf;\n\n\tif (once)\n\t\tpmgntframe = rtw_alloc_xmitframe_once(pxmitpriv);\n\telse\n\t\tpmgntframe = rtw_alloc_xmitframe_ext(pxmitpriv);\n\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" alloc xmitframe fail, once:%d\\n\", FUNC_ADPT_ARG(pxmitpriv->adapter), once);\n\t\tgoto exit;\n\t}\n\n\tif ((pxmitbuf = rtw_alloc_xmitbuf_ext(pxmitpriv)) == NULL) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" alloc xmitbuf fail\\n\", FUNC_ADPT_ARG(pxmitpriv->adapter));\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tpmgntframe = NULL;\n\t\tgoto exit;\n\t}\n\n\tpmgntframe->frame_tag = MGNT_FRAMETAG;\n\tpmgntframe->pxmitbuf = pxmitbuf;\n\tpmgntframe->buf_addr = pxmitbuf->pbuf;\n\tpxmitbuf->priv_data = pmgntframe;\n\nexit:\n\treturn pmgntframe;\n\n}\n\ninline struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv)\n{\n\treturn _alloc_mgtxmitframe(pxmitpriv, _FALSE);\n}\n\ninline struct xmit_frame *alloc_mgtxmitframe_once(struct xmit_priv *pxmitpriv)\n{\n\treturn _alloc_mgtxmitframe(pxmitpriv, _TRUE);\n}\n\n\n/****************************************************************************\n\nFollowing are some TX fuctions for WiFi MLME\n\n*****************************************************************************/\n\nvoid update_mgnt_tx_rate(_adapter *padapter, u8 rate)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\n\tpmlmeext->tx_rate = rate;\n\t//DBG_871X(\"%s(): rate = %x\\n\",__FUNCTION__, rate);\n}\n\nvoid update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib)\n{\n\tu8\twireless_mode;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct xmit_priv \t\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct sta_info\t\t*psta = NULL;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct sta_info *pbcmc_sta = NULL;\n\t//_rtw_memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib));\n\n\tpbcmc_sta = rtw_get_bcmc_stainfo(padapter);\n\n\tpattrib->hdrlen = 24;\n\tpattrib->nr_frags = 1;\n\tpattrib->priority = 7;\n\n\tif (pbcmc_sta)\n\t\tpattrib->mac_id = pbcmc_sta->mac_id;\n\telse {\n\t\tpattrib->mac_id = 0;\n\t\tDBG_871X(\"mgmt use mac_id 0 will affect RA\\n\");\n\t}\n\tpattrib->qsel = QSLT_MGNT;\n\n\tpattrib->pktlen = 0;\n\n\tif (pmlmeext->tx_rate == IEEE80211_CCK_RATE_1MB)\n\t\twireless_mode = WIRELESS_11B;\n\telse\n\t\twireless_mode = WIRELESS_11G;\n\tpattrib->raid =  rtw_get_mgntframe_raid(padapter, wireless_mode);\n\tpattrib->rate = pmlmeext->tx_rate;\n\n\tpattrib->encrypt = _NO_PRIVACY_;\n\tpattrib->bswenc = _FALSE;\t\n\n\tpattrib->qos_en = _FALSE;\n\tpattrib->ht_en = _FALSE;\n\tpattrib->bwmode = CHANNEL_WIDTH_20;\n\tpattrib->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tpattrib->sgi = _FALSE;\n\n\tpattrib->seqnum = pmlmeext->mgnt_seq;\n\n\tpattrib->retry_ctrl = _TRUE;\n\n\tpattrib->mbssid = 0;\n\tpattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;\n\n\t#ifdef CONFIG_BEAMFORMING\n\tpsta = rtw_get_stainfo(pstapriv, pattrib->ra);\n\tif (psta)\n\t\tupdate_attrib_txbf_info(padapter, pattrib, psta);\n\t#endif\n\n}\n\nvoid update_mgntframe_attrib_addr(_adapter *padapter, struct xmit_frame *pmgntframe)\n{\n\tu8\t*pframe;\n\tstruct pkt_attrib\t*pattrib = &pmgntframe->attrib;\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\t_rtw_memcpy(pattrib->ra, GetAddr1Ptr(pframe), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, GetAddr2Ptr(pframe), ETH_ALEN);\n}\n\nvoid dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe)\n{\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\trtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);\n\t\treturn;\n\t}\n\n\trtw_hal_mgnt_xmit(padapter, pmgntframe);\n}\n\ns32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms)\n{\n\ts32 ret = _FAIL;\n\t_irqL irqL;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\t\n\tstruct xmit_buf *pxmitbuf = pmgntframe->pxmitbuf;\n\tstruct submit_ctx sctx;\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\trtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);\n\t\treturn ret;\n\t}\n\n\trtw_sctx_init(&sctx, timeout_ms);\n\tpxmitbuf->sctx = &sctx;\n\n\tret = rtw_hal_mgnt_xmit(padapter, pmgntframe);\n\n\tif (ret == _SUCCESS)\n\t\tret = rtw_sctx_wait(&sctx, __func__);\n\n\t_enter_critical(&pxmitpriv->lock_sctx, &irqL);\n\tpxmitbuf->sctx = NULL;\n\t_exit_critical(&pxmitpriv->lock_sctx, &irqL);\n\n\t return ret;\n}\n\ns32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe)\n{\n#ifdef CONFIG_XMIT_ACK\n\tstatic u8 seq_no = 0;\n\ts32 ret = _FAIL;\n\tu32 timeout_ms = 500;//  500ms\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter && !padapter->isprimary)\n\t\tpxmitpriv = &(padapter->pbuddy_adapter->xmitpriv);\n\t#endif\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\trtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(&padapter->xmitpriv, pmgntframe);\n\t\treturn -1;\n\t}\n\n\t_enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL);\n\tpxmitpriv->ack_tx = _TRUE;\n\tpxmitpriv->seq_no = seq_no++;\n\tpmgntframe->ack_report = 1;\n\trtw_sctx_init(&(pxmitpriv->ack_tx_ops), timeout_ms);\n\tif (rtw_hal_mgnt_xmit(padapter, pmgntframe) == _SUCCESS) {\n#ifdef CONFIG_XMIT_ACK_POLLING\n\t\tret = rtw_ack_tx_polling(pxmitpriv, timeout_ms);\n#else\n\t\tret = rtw_sctx_wait(&(pxmitpriv->ack_tx_ops), __func__);\n#endif\n\t}\n\n\tpxmitpriv->ack_tx = _FALSE;\n\t_exit_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL);\n\n\t return ret;\n#else //!CONFIG_XMIT_ACK\n\tdump_mgntframe(padapter, pmgntframe);\n\trtw_msleep_os(50);\n\treturn _SUCCESS;\n#endif //!CONFIG_XMIT_ACK\t \n}\n\nint update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)\n{\n\tu8 *ssid_ie;\n\tsint ssid_len_ori;\n\tint len_diff = 0;\n\t\n\tssid_ie = rtw_get_ie(ies,  WLAN_EID_SSID, &ssid_len_ori, ies_len);\n\n\t//DBG_871X(\"%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\\n\", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori);\n\t\n\tif(ssid_ie && ssid_len_ori>0)\n\t{\n\t\tswitch(hidden_ssid_mode)\n\t\t{\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\tu8 *next_ie = ssid_ie + 2 + ssid_len_ori;\n\t\t\t\tu32 remain_len = 0;\n\t\t\t\t\n\t\t\t\tremain_len = ies_len -(next_ie-ies);\n\t\t\t\t\n\t\t\t\tssid_ie[1] = 0;\t\t\t\t\n\t\t\t\t_rtw_memcpy(ssid_ie+2, next_ie, remain_len);\n\t\t\t\tlen_diff -= ssid_len_ori;\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\t\t\n\t\t\tcase 2:\n\t\t\t\t_rtw_memset(&ssid_ie[2], 0, ssid_len_ori);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn len_diff;\n}\n\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\nu32 rtw_build_vendor_ie(_adapter *padapter , unsigned char *pframe , u8 mgmt_frame_tyte)\n{\n\tint vendor_ie_num = 0;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu32 len = 0;\n\n\tfor (vendor_ie_num = 0 ; vendor_ie_num < WLAN_MAX_VENDOR_IE_NUM ; vendor_ie_num++) {\n\t\tif (pmlmepriv->vendor_ielen[vendor_ie_num] > 0 && pmlmepriv->vendor_ie_mask[vendor_ie_num] & mgmt_frame_tyte) {\n\t\t\t_rtw_memcpy(pframe , pmlmepriv->vendor_ie[vendor_ie_num] , pmlmepriv->vendor_ielen[vendor_ie_num]);\n\t\t\tpframe +=  pmlmepriv->vendor_ielen[vendor_ie_num];\n\t\t\tlen += pmlmepriv->vendor_ielen[vendor_ie_num];\n\t\t}\n\t}\n\n\treturn len;\n}\n#endif\n\nvoid issue_beacon(_adapter *padapter, int timeout_ms)\n{\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tunsigned char\t*pframe;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tunsigned short *fctrl;\n\tunsigned int\trate_len;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\t_irqL irqL;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n#ifdef CONFIG_BCN_ICF\n\tif ((pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv)) == NULL)\n#else\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n#endif\n\t{\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\t_enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\n#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\tpattrib->qsel = QSLT_BEACON;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type == IFACE_PORT1)\t\n\t\tpattrib->mbssid = 1;\n\t#endif\t\n\t\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\t\t\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\n\t//pmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_BEACON);\n\t\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\t\n\tpattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\t\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\t//DBG_871X(\"ie len=%d\\n\", cur_network->IELength);\n#ifdef CONFIG_P2P\n\t\t// for P2P : Primary Device Type & Device Name\n\t\tu32 wpsielen=0, insert_len=0;\n\t\tu8 *wpsie=NULL;\t\t\n\t\twpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);\n\t\t\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0)\n\t\t{\n\t\t\tuint wps_offset, remainder_ielen;\n\t\t\tu8 *premainder_ie, *pframe_wscie;\n\t\n\t\t\twps_offset = (uint)(wpsie - cur_network->IEs);\n\n\t\t\tpremainder_ie = wpsie + wpsielen;\n\n\t\t\tremainder_ielen = cur_network->IELength - wps_offset - wpsielen;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t\t{\n\t\t\t\tif(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, wps_offset);\n\t\t\t\t\tpframe += wps_offset;\n\t\t\t\t\tpattrib->pktlen += wps_offset;\n\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);\n\t\t\t\t\tpframe += pmlmepriv->wps_beacon_ie_len;\n\t\t\t\t\tpattrib->pktlen += pmlmepriv->wps_beacon_ie_len;\n\n\t\t\t\t\t//copy remainder_ie to pframe\n\t\t\t\t\t_rtw_memcpy(pframe, premainder_ie, remainder_ielen);\n\t\t\t\t\tpframe += remainder_ielen;\t\t\n\t\t\t\t\tpattrib->pktlen += remainder_ielen;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\t\t\t\t\tpframe += cur_network->IELength;\n\t\t\t\t\tpattrib->pktlen += cur_network->IELength;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\t\tpframe_wscie = pframe + wps_offset;\n\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);\t\t\t\n\t\t\t\tpframe += (wps_offset + wpsielen);\t\t\n\t\t\t\tpattrib->pktlen += (wps_offset + wpsielen);\n\n\t\t\t\t//now pframe is end of wsc ie, insert Primary Device Type & Device Name\n\t\t\t\t//\tPrimary Device Type\n\t\t\t\t//\tType:\n\t\t\t\t*(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );\n\t\t\t\tinsert_len += 2;\n\t\t\t\t\n\t\t\t\t//\tLength:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 );\n\t\t\t\tinsert_len += 2;\n\t\t\t\t\n\t\t\t\t//\tValue:\n\t\t\t\t//\tCategory ID\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tOUI\n\t\t\t\t*(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI );\n\t\t\t\tinsert_len += 4;\n\n\t\t\t\t//\tSub Category ID\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\t\t\tinsert_len += 2;\n\n\n\t\t\t\t//\tDevice Name\n\t\t\t\t//\tType:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tLength:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tValue:\n\t\t\t\t_rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\t\t\tinsert_len += pwdinfo->device_name_len;\n\n\n\t\t\t\t//update wsc ie length\n\t\t\t\t*(pframe_wscie+1) = (wpsielen -2) + insert_len;\n\n\t\t\t\t//pframe move to end\n\t\t\t\tpframe+=insert_len;\n\t\t\t\tpattrib->pktlen += insert_len;\n\n\t\t\t\t//copy remainder_ie to pframe\n\t\t\t\t_rtw_memcpy(pframe, premainder_ie, remainder_ielen);\n\t\t\t\tpframe += remainder_ielen;\t\t\n\t\t\t\tpattrib->pktlen += remainder_ielen;\n\t\t\t}\n\t\t}\n\t\telse\n#endif //CONFIG_P2P\n\t\t{\n\t\t\tint len_diff;\n\t\t\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\t\t\tlen_diff = update_hidden_ssid(\n\t\t\t\tpframe+_BEACON_IE_OFFSET_\n\t\t\t\t, cur_network->IELength-_BEACON_IE_OFFSET_\n\t\t\t\t, pmlmeinfo->hidden_ssid_mode\n\t\t\t);\n\t\t\tpframe += (cur_network->IELength+len_diff);\n\t\t\tpattrib->pktlen += (cur_network->IELength+len_diff);\n\t\t}\n\n\t\t{\n\t\t\tu8 *wps_ie;\n\t\t\tuint wps_ielen;\n\t\t\tu8 sr = 0;\n\t\t\twps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,\n\t\t\t\tpattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);\n\t\t\tif (wps_ie && wps_ielen>0) {\n\t\t\t\trtw_get_wps_attr_content(wps_ie,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\n\t\t\t}\n\t\t\tif (sr != 0)\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_UNDER_WPS);\n\t\t\telse\n\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);\n\t\t}\n\n#ifdef CONFIG_P2P\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t{\n\t\t\tu32 len;\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t\t{\n\t\t\t\tlen = pmlmepriv->p2p_beacon_ie_len;\n\t\t\t\tif(pmlmepriv->p2p_beacon_ie && len>0)\t\t\t\t\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len);\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\t\tlen = build_beacon_p2p_ie(pwdinfo, pframe);\n\t\t\t}\n\n\t\t\tpframe += len;\n\t\t\tpattrib->pktlen += len;\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(_TRUE == pwdinfo->wfd_info->wfd_enable)\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\tlen = build_beacon_wfd_ie( pwdinfo, pframe );\n\t\t\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\telse\n\t\t\t{\t\n\t\t\t\tlen = 0;\n\t\t\t\tif(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0)\n\t\t\t\t{\n\t\t\t\t\tlen = pmlmepriv->wfd_beacon_ie_len;\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len);\t\n\t\t\t\t}\n\t\t\t}\t\t\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\tpframe += len;\n\t\t\tpattrib->pktlen += len;\n#endif //CONFIG_WFD\n\t\t}\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\t\tpattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_BEACON_VENDOR_IE_BIT);\n#endif\n\t\tgoto _issue_bcn;\n\n\t}\n\n\t//below for ad-hoc mode\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpattrib->pktlen += 8;\n\n\t// beacon interval: 2 bytes\n\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); \n\n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\t// capability info: 2 bytes\n\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen);\n\n\t// supported rates...\n\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen);\n\n\t//if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\tu8 erpinfo=0;\n\t\tu32 ATIMWindow;\n\t\t// IBSS Parameter Set...\n\t\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\t\tATIMWindow = 0;\n\t\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen);\n\n\t\t//ERP IE\n\t\tpframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen);\n\t}\t\n\n\n\t// EXTERNDED SUPPORTED RATE\n\tif (rate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen);\n\t}\n\n\n\t//todo:HT for adhoc\n\n_issue_bcn:\n\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tpmlmepriv->update_bcn = _FALSE;\n\t\n\t_exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\t\n#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\n\tif ((pattrib->pktlen + TXDESC_SIZE) > 512)\n\t{\n\t\tDBG_871X(\"beacon frame too large\\n\");\n\t\treturn;\n\t}\n\t\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\t//DBG_871X(\"issue bcn_sz=%d\\n\", pattrib->last_txcmdsz);\n\tif(timeout_ms > 0)\n\t\tdump_mgntframe_and_wait(padapter, pmgntframe, timeout_ms);\n\telse\n\t\tdump_mgntframe(padapter, pmgntframe);\n\n}\n\nvoid issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\t\n\tunsigned char\t\t\t\t\t*mac, *bssid;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tu8 *pwps_ie;\n\tuint wps_ielen;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tunsigned int\trate_len;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n#endif //CONFIG_P2P\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif(da == NULL)\n\t\treturn;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\t\n\t\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\t\t\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\tmac = adapter_mac_addr(padapter);\n\tbssid = cur_network->MacAddress;\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(fctrl, WIFI_PROBERSP);\n\t\n\tpattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = pattrib->hdrlen;\n\tpframe += pattrib->hdrlen;\n\n\n\tif(cur_network->IELength>MAX_IE_SZ)\n\t\treturn;\n\t\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\tpwps_ie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wps_ielen);\n\t\n\t\t//inerset & update wps_probe_resp_ie\n\t\tif((pmlmepriv->wps_probe_resp_ie!=NULL) && pwps_ie && (wps_ielen>0))\n\t\t{\n\t\t\tuint wps_offset, remainder_ielen;\n\t\t\tu8 *premainder_ie;\t\t\n\t\n\t\t\twps_offset = (uint)(pwps_ie - cur_network->IEs);\n\n\t\t\tpremainder_ie = pwps_ie + wps_ielen;\n\n\t\t\tremainder_ielen = cur_network->IELength - wps_offset - wps_ielen;\n\n\t\t\t_rtw_memcpy(pframe, cur_network->IEs, wps_offset);\t\t\n\t\t\tpframe += wps_offset;\t\t\n\t\t\tpattrib->pktlen += wps_offset;\t\t\n\n\t\t\twps_ielen = (uint)pmlmepriv->wps_probe_resp_ie[1];//to get ie data len\n\t\t\tif((wps_offset+wps_ielen+2)<=MAX_IE_SZ)\n\t\t\t{\n\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, wps_ielen+2);\n\t\t\t\tpframe += wps_ielen+2;\t\t\n\t\t\t\tpattrib->pktlen += wps_ielen+2;\t\n\t\t\t}\n\n\t\t\tif((wps_offset+wps_ielen+2+remainder_ielen)<=MAX_IE_SZ)\n\t\t\t{\n\t\t\t\t_rtw_memcpy(pframe, premainder_ie, remainder_ielen);\n\t\t\t\tpframe += remainder_ielen;\t\t\n\t\t\t\tpattrib->pktlen += remainder_ielen;\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\t\t\tpframe += cur_network->IELength;\n\t\t\tpattrib->pktlen += cur_network->IELength;\n\t\t}\n\n\t\t/* retrieve SSID IE from cur_network->Ssid */\n\t\t{\n\t\t\tu8 *ssid_ie;\n\t\t\tsint ssid_ielen;\n\t\t\tsint ssid_ielen_diff;\n\t\t\tu8 buf[MAX_IE_SZ];\n\t\t\tu8 *ies = pmgntframe->buf_addr+TXDESC_OFFSET+sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t\t\tssid_ie = rtw_get_ie(ies+_FIXED_IE_LENGTH_, _SSID_IE_, &ssid_ielen,\n\t\t\t\t(pframe-ies)-_FIXED_IE_LENGTH_);\n\n\t\t\tssid_ielen_diff = cur_network->Ssid.SsidLength - ssid_ielen;\n\n\t\t\tif (ssid_ie &&  cur_network->Ssid.SsidLength) {\n\t\t\t\tuint remainder_ielen;\n\t\t\t\tu8 *remainder_ie;\n\t\t\t\tremainder_ie = ssid_ie+2;\n\t\t\t\tremainder_ielen = (pframe-remainder_ie);\n\n\t\t\t\tif (remainder_ielen > MAX_IE_SZ) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_warning_, FUNC_ADPT_FMT\" remainder_ielen > MAX_IE_SZ\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t\tremainder_ielen = MAX_IE_SZ;\n\t\t\t\t}\n\n\t\t\t\t_rtw_memcpy(buf, remainder_ie, remainder_ielen);\n\t\t\t\t_rtw_memcpy(remainder_ie+ssid_ielen_diff, buf, remainder_ielen);\n\t\t\t\t*(ssid_ie+1) = cur_network->Ssid.SsidLength;\n\t\t\t\t_rtw_memcpy(ssid_ie+2, cur_network->Ssid.Ssid, cur_network->Ssid.SsidLength);\n\n\t\t\t\tpframe += ssid_ielen_diff;\n\t\t\t\tpattrib->pktlen += ssid_ielen_diff;\n\t\t\t}\n\t\t}\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\t\tpattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_PROBERESP_VENDOR_IE_BIT);\n#endif\n\t} else\n#endif\t\t\n\t{\n\t\n\t\t//timestamp will be inserted by hardware\n\t\tpframe += 8;\n\t\tpattrib->pktlen += 8;\n\n\t\t// beacon interval: 2 bytes\n\n\t\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); \n\n\t\tpframe += 2;\n\t\tpattrib->pktlen += 2;\n\n\t\t// capability info: 2 bytes\n\n\t\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\t\tpframe += 2;\n\t\tpattrib->pktlen += 2;\n\n\t\t//below for ad-hoc mode\n\n\t\t// SSID\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pattrib->pktlen);\n\n\t\t// supported rates...\n\t\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pattrib->pktlen);\n\n\t\t// DS parameter set\n\t\tpframe =rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pattrib->pktlen);\n\n\t\tif( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t\t{\n\t\t\tu8 erpinfo=0;\n\t\t\tu32 ATIMWindow;\n\t\t\t// IBSS Parameter Set...\n\t\t\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\t\t\tATIMWindow = 0;\n\t\t\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pattrib->pktlen);\n\n\t\t\t//ERP IE\n\t\t\tpframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pattrib->pktlen);\n\t\t}\n\n\t\t\n\t\t// EXTERNDED SUPPORTED RATE\n\t\tif (rate_len > 8)\n\t\t{\n\t\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pattrib->pktlen);\n\t\t}\n\n\n\t\t//todo:HT for adhoc\n\n\t}\t\n\n#ifdef CONFIG_P2P\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)\n\t\t/* IOT issue, When wifi_spec is not set, send probe_resp with P2P IE even if probe_req has no P2P IE */\n\t\t&& (is_valid_p2p_probereq || !padapter->registrypriv.wifi_spec))\n\t{\n\t\tu32 len;\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\t//if pwdinfo->role == P2P_ROLE_DEVICE will call issue_probersp_p2p()\n\t\t\tlen = pmlmepriv->p2p_go_probe_resp_ie_len;\n\t\t\tif(pmlmepriv->p2p_go_probe_resp_ie && len>0)\n\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie, len);\n\t\t}\n\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t\t{\n\t\t\tlen = build_probe_resp_p2p_ie(pwdinfo, pframe);\n\t\t}\n\n\t\tpframe += len;\n\t\tpattrib->pktlen += len;\n\t\t\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tif(_TRUE == pwdinfo->wfd_info->wfd_enable)\n#endif //CONFIG_IOCTL_CFG80211\n\t\t{\n\t\t\tlen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);\n\t\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\t\telse\n\t\t{\t\n\t\t\tlen = 0;\n\t\t\tif(pmlmepriv->wfd_probe_resp_ie && pmlmepriv->wfd_probe_resp_ie_len>0)\n\t\t\t{\n\t\t\t\tlen = pmlmepriv->wfd_probe_resp_ie_len;\n\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, len);\t\n\t\t\t}\t\n\t\t}\n#endif //CONFIG_IOCTL_CFG80211\t\t\n\t\tpframe += len;\n\t\tpattrib->pktlen += len;\n#endif //CONFIG_WFD\n\n\t}\n#endif //CONFIG_P2P\n\n\n#ifdef CONFIG_AUTO_AP_MODE\n{\n\tstruct sta_info\t*psta;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"(%s)\\n\", __FUNCTION__);\n\n\t//check rc station\n\tpsta = rtw_get_stainfo(pstapriv, da);\n\tif (psta && psta->isrc && psta->pid>0)\n\t{\n\t\tu8 RC_OUI[4]={0x00,0xE0,0x4C,0x0A};\n\t\tu8 RC_INFO[14] = {0};\n\t\t//EID[1] + EID_LEN[1] + RC_OUI[4] + MAC[6] + PairingID[2] + ChannelNum[2]\n\t\tu16 cu_ch = (u16)cur_network->Configuration.DSConfig;\n\n\t\tDBG_871X(\"%s, reply rc(pid=0x%x) device \"MAC_FMT\" in ch=%d\\n\", __FUNCTION__,\n\t\t\tpsta->pid, MAC_ARG(psta->hwaddr), cu_ch);\n\n\t\t//append vendor specific ie\n\t\t_rtw_memcpy(RC_INFO, RC_OUI, sizeof(RC_OUI));\n\t\t_rtw_memcpy(&RC_INFO[4], mac, ETH_ALEN);\n\t\t_rtw_memcpy(&RC_INFO[10], (u8*)&psta->pid, 2);\n\t\t_rtw_memcpy(&RC_INFO[12], (u8*)&cu_ch, 2);\n\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(RC_INFO), RC_INFO, &pattrib->pktlen);\n\t}\n}\n#endif //CONFIG_AUTO_AP_MODE\n\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\n\tdump_mgntframe(padapter, pmgntframe);\n\t\n\treturn;\n\n}\n\nint _issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, bool append_wps, int wait_ack)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tunsigned char\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t*fctrl;\n\tunsigned char\t\t\t*mac;\n\tunsigned char\t\t\tbssrate[NumRates];\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint\tbssrate_len = 0;\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tmac = adapter_mac_addr(padapter);\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif (da)\n\t{\n\t\t//\tunicast probe request frame\n\t\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr3, da, ETH_ALEN);\n\t}\n\telse\n\t{\n\t\t//\tbroadcast probe request frame\n\t\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);\n\t}\n\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_PROBEREQ);\n\n\tpframe += sizeof (struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\n\tif(pssid)\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, pssid->SsidLength, pssid->Ssid, &(pattrib->pktlen));\n\telse\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &(pattrib->pktlen));\n\n\tget_rate_set(padapter, bssrate, &bssrate_len);\n\n\tif (bssrate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));\n\t}\n\telse\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));\n\t}\n\n\tif (ch)\n\t\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, &ch, &pattrib->pktlen);\n\n\tif (append_wps) {\n\t\t//add wps_ie for wps2.0\n\t\tif(pmlmepriv->wps_probe_req_ie_len>0 && pmlmepriv->wps_probe_req_ie)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_probe_req_ie, pmlmepriv->wps_probe_req_ie_len);\n\t\t\tpframe += pmlmepriv->wps_probe_req_ie_len;\n\t\t\tpattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;\n\t\t\t//pmlmepriv->wps_probe_req_ie_len = 0 ;//reset to zero\n\t\t}\n\t}\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tpattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_PROBEREQ_VENDOR_IE_BIT);\n#endif\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_notice_,(\"issuing probe_req, tx_len=%d\\n\", pattrib->last_txcmdsz));\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n}\n\ninline void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da)\n{\n\t_issue_probereq(padapter, pssid, da, 0, 1, _FALSE);\n}\n\n/*\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n */\nint issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da, u8 ch, bool append_wps,\n\tint try_cnt, int wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tdo\n\t{\n\t\tret = _issue_probereq(padapter, pssid, da, ch, append_wps, wait_ms>0?_TRUE:_FALSE);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\n// if psta == NULL, indiate we are station(client) now...\nvoid issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tunsigned int\t\t\t\t\tval32;\n\tunsigned short\t\t\t\tval16;\n\tint use_shared_key = 0;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_AUTH);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\n\tif(psta)// for AP mode\n\t{\n#ifdef CONFIG_NATIVEAP_MLME\n\n\t\t_rtw_memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN);\t\t\n\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\t\n\t\t// setting auth algo number\n\t\tval16 = (u16)psta->authalg;\n\n\t\tif(status != _STATS_SUCCESSFUL_)\n\t\t\tval16 = 0;\n\n\t\tif (val16)\t{\n\t\t\tval16 = cpu_to_le16(val16);\t\n\t\t\tuse_shared_key = 1;\n\t\t}\n\n\t\tpframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));\n\n\t\t// setting auth seq number\n\t\tval16 =(u16)psta->auth_seq;\n\t\tval16 = cpu_to_le16(val16);\t\n\t\tpframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));\n\n\t\t// setting status code...\n\t\tval16 = status;\n\t\tval16 = cpu_to_le16(val16);\t\n\t\tpframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen));\n\n\t\t// added challenging text...\n\t\tif ((psta->auth_seq == 2) && (psta->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))\n\t\t{\n\t\t\tpframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, psta->chg_txt, &(pattrib->pktlen));\n\t\t}\n#endif\n\t}\n\telse\n\t{\t\t\n\t\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN);\n\t\n\t\t// setting auth algo number\t\t\n\t\tval16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared)? 1: 0;// 0:OPEN System, 1:Shared key\n\t\tif (val16)\t{\n\t\t\tval16 = cpu_to_le16(val16);\t\n\t\t\tuse_shared_key = 1;\n\t\t}\t\n\t\t//DBG_871X(\"%s auth_algo= %s auth_seq=%d\\n\",__FUNCTION__,(pmlmeinfo->auth_algo==0)?\"OPEN\":\"SHARED\",pmlmeinfo->auth_seq);\n\t\t\n\t\t//setting IV for auth seq #3\n\t\tif ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))\n\t\t{\n\t\t\t//DBG_871X(\"==> iv(%d),key_index(%d)\\n\",pmlmeinfo->iv,pmlmeinfo->key_index);\n\t\t\tval32 = ((pmlmeinfo->iv++) | (pmlmeinfo->key_index << 30));\n\t\t\tval32 = cpu_to_le32(val32);\n\t\t\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *)&val32, &(pattrib->pktlen));\n\n\t\t\tpattrib->iv_len = 4;\n\t\t}\n\n\t\tpframe = rtw_set_fixed_ie(pframe, _AUTH_ALGM_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));\n\t\t\n\t\t// setting auth seq number\n\t\tval16 = pmlmeinfo->auth_seq;\n\t\tval16 = cpu_to_le16(val16);\t\n\t\tpframe = rtw_set_fixed_ie(pframe, _AUTH_SEQ_NUM_, (unsigned char *)&val16, &(pattrib->pktlen));\n\n\t\t\n\t\t// setting status code...\n\t\tval16 = status;\n\t\tval16 = cpu_to_le16(val16);\t\n\t\tpframe = rtw_set_fixed_ie(pframe, _STATUS_CODE_, (unsigned char *)&val16, &(pattrib->pktlen));\n\n\t\t// then checking to see if sending challenging text...\n\t\tif ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key==1))\n\t\t{\n\t\t\tpframe = rtw_set_ie(pframe, _CHLGETXT_IE_, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen));\n\n\t\t\tSetPrivacy(fctrl);\n\t\t\t\n\t\t\tpattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);\t\t\t\n\t\t\t\n\t\t\tpattrib->encrypt = _WEP40_;\n\n\t\t\tpattrib->icv_len = 4;\n\t\t\t\n\t\t\tpattrib->pktlen += pattrib->icv_len;\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\trtw_wep_encrypt(padapter, (u8 *)pmgntframe);\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n}\n\n\nvoid issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type)\n{\n#ifdef CONFIG_AP_MODE\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct pkt_attrib *pattrib;\n\tunsigned char\t*pbuf, *pframe;\n\tunsigned short val, ie_status;\t\t\n\tunsigned short *fctrl;\n\tstruct xmit_priv *pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\t\n\tWLAN_BSSID_EX *pnetwork = &(pmlmeinfo->network);\n\tu8 *ie = pnetwork->IEs; \n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\n#endif //CONFIG_P2P\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN);\n\t_rtw_memcpy((void *)GetAddr2Ptr(pwlanhdr), adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy((void *)GetAddr3Ptr(pwlanhdr), get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tif ((pkt_type == WIFI_ASSOCRSP) || (pkt_type == WIFI_REASSOCRSP))\n\t\tSetFrameSubType(pwlanhdr, pkt_type);\t\t\n\telse\n\t\treturn;\n\n\tpattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen += pattrib->hdrlen;\n\tpframe += pattrib->hdrlen;\n\n\t//capability\n\tval = *(unsigned short *)rtw_get_capability_from_ie(ie);\n\n\tpframe = rtw_set_fixed_ie(pframe, _CAPABILITY_ , (unsigned char *)&val, &(pattrib->pktlen));\n\n\tie_status = cpu_to_le16(status);\n\tpframe = rtw_set_fixed_ie(pframe , _STATUS_CODE_ , (unsigned char *)&ie_status, &(pattrib->pktlen));\n\t\n\tval = cpu_to_le16(pstat->aid | BIT(14) | BIT(15));\n\tpframe = rtw_set_fixed_ie(pframe, _ASOC_ID_ , (unsigned char *)&val, &(pattrib->pktlen));\n\n\tif (pstat->bssratelen <= 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, pstat->bssratelen, pstat->bssrateset, &(pattrib->pktlen));\n\t}\t\n\telse \n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pstat->bssrateset, &(pattrib->pktlen));\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (pstat->bssratelen-8), pstat->bssrateset+8, &(pattrib->pktlen));\n\t}\n\n#ifdef CONFIG_IEEE80211W\t\n\tif (status == _STATS_REFUSED_TEMPORARILY_) {\n\t\tu8 timeout_itvl[5];\n\t\tu32 timeout_interval = 3000;\n\t\t/* Association Comeback time */\n\t\ttimeout_itvl[0] = 0x03;\n\t\ttimeout_interval = cpu_to_le32(timeout_interval);\n\t\t_rtw_memcpy(timeout_itvl+1, &timeout_interval, 4);\n\t\tpframe = rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));\n\t}\n#endif /* CONFIG_IEEE80211W */\n\n#ifdef CONFIG_80211N_HT\n\tif ((pstat->flags & WLAN_STA_HT) && (pmlmepriv->htpriv.ht_option))\n\t{\n\t\tuint ie_len=0;\n\t\t\n\t\t//FILL HT CAP INFO IE\n\t\t//p = hostapd_eid_ht_capabilities_info(hapd, p);\n\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_CAPABILITY_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\t\tif(pbuf && ie_len>0)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\tpframe += (ie_len+2);\n\t\t\tpattrib->pktlen +=(ie_len+2);\n\t\t}\n\n\t\t//FILL HT ADD INFO IE\n\t\t//p = hostapd_eid_ht_operation(hapd, p);\n\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _HT_ADD_INFO_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\t\tif(pbuf && ie_len>0)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\tpframe += (ie_len+2);\n\t\t\tpattrib->pktlen +=(ie_len+2);\n\t\t}\n\t\t\n\t}\t\n#endif\n\n\t/*adding EXT_CAPAB_IE */\n\tif (pmlmepriv->ext_capab_ie_len > 0) {\n\t\tuint ie_len = 0;\n\t\t\n\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_CAP_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\t\tif (pbuf && ie_len > 0) {\n\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\tpframe += (ie_len+2);\n\t\t\tpattrib->pktlen += (ie_len+2);\n\t\t}\n\t}\t\n\t\n#ifdef CONFIG_80211AC_VHT\n\tif ((pstat->flags & WLAN_STA_VHT) && (pmlmepriv->vhtpriv.vht_option)\n\t\t&& (pstat->wpa_pairwise_cipher != WPA_CIPHER_TKIP)\n\t\t&& (pstat->wpa2_pairwise_cipher != WPA_CIPHER_TKIP))\n\t{\n\t\tu32 ie_len=0;\n\n\t\t//FILL VHT CAP IE\n\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTCapability, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\t\tif(pbuf && ie_len>0)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\tpframe += (ie_len+2);\n\t\t\tpattrib->pktlen +=(ie_len+2);\n\t\t}\n\n\t\t//FILL VHT OPERATION IE\n\t\tpbuf = rtw_get_ie(ie + _BEACON_IE_OFFSET_, EID_VHTOperation, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_));\n\t\tif(pbuf && ie_len>0)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\tpframe += (ie_len+2);\n\t\t\tpattrib->pktlen +=(ie_len+2);\n\t\t}\n\t}\n#endif //CONFIG_80211AC_VHT\n\n\t//FILL WMM IE\n\tif ((pstat->flags & WLAN_STA_WME) && (pmlmepriv->qospriv.qos_option))\n\t{\n\t\tuint ie_len=0;\n\t\tunsigned char WMM_PARA_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};\t\n\t\t\n\t\tfor (pbuf = ie + _BEACON_IE_OFFSET_; ;pbuf+= (ie_len + 2))\n\t\t{\t\t\t\n\t\t\tpbuf = rtw_get_ie(pbuf, _VENDOR_SPECIFIC_IE_, &ie_len, (pnetwork->IELength - _BEACON_IE_OFFSET_ - (ie_len + 2)));\t\n\t\t\tif(pbuf && _rtw_memcmp(pbuf+2, WMM_PARA_IE, 6)) \n\t\t\t{\t\t\t\t\n\t\t\t\t_rtw_memcpy(pframe, pbuf, ie_len+2);\n\t\t\t\tpframe += (ie_len+2);\n\t\t\t\tpattrib->pktlen +=(ie_len+2);\n\t\t\t\t\n\t\t\t\tbreak;\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif ((pbuf == NULL) || (ie_len == 0))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t}\n\n\n\tif (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen));\n\t}\n\n\t//add WPS IE ie for wps 2.0\n\tif(pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len>0)\n\t{\n\t\t_rtw_memcpy(pframe, pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len);\n\t\t\n\t\tpframe += pmlmepriv->wps_assoc_resp_ie_len;\n\t\tpattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len;\n\t}\n\n#ifdef CONFIG_P2P\n\tif( padapter->wdinfo.driver_interface == DRIVER_WEXT )\n\t{\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && (pstat->is_p2p_device == _TRUE))\n\t\t{\n\t\t\tu32 len;\n\n\t\t\tlen = build_assoc_resp_p2p_ie(pwdinfo, pframe, pstat->p2p_status_code);\n\n\t\t\tpframe += len;\n\t\t\tpattrib->pktlen += len;\n\t\t}\n\t}\n#ifdef CONFIG_WFD\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)\n#ifdef CONFIG_IOCTL_CFG80211\t\t\n\t\t&& (_TRUE == pwdinfo->wfd_info->wfd_enable)\n#endif //CONFIG_IOCTL_CFG80211\t\n\t)\n\t{\n\t\twfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n#endif //CONFIG_WFD\n#endif //CONFIG_P2P\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tpattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_ASSOCRESP_VENDOR_IE_BIT);\n#endif\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\tdump_mgntframe(padapter, pmgntframe);\n\t\n#endif\n}\n\nvoid issue_assocreq(_adapter *padapter)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe, *p;\n\tstruct rtw_ieee80211_hdr\t\t\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tunsigned short\t\t\t\tval16;\n\tunsigned int\t\t\t\t\ti, j, ie_len, index=0;\n\tunsigned char\t\t\t\t\trf_type, bssrate[NumRates], sta_bssrate[NumRates];\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint\tbssrate_len = 0, sta_bssrate_len = 0;\n\tu8\tvs_ie_length = 0;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\tu8\t\t\t\t\tp2pie[ 255 ] = { 0x00 };\n\tu16\t\t\t\t\tp2pielen = 0;\t\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_DFS\n\tu16\tcap;\n\n\t/* Dot H */\n\tu8 pow_cap_ele[2] = { 0x00 };\n\tu8 sup_ch[ 30 * 2 ] = {0x00 }, sup_ch_idx = 0, idx_5g = 2;\t//For supported channel\n#endif //CONFIG_DFS\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ASSOCREQ);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t//caps\n\n#ifdef CONFIG_DFS\n\t_rtw_memcpy(&cap, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\n\tcap |= cap_SpecMgmt;\n\t_rtw_memcpy(pframe, &cap, 2);\n#else\n\t_rtw_memcpy(pframe, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\n#endif //CONFIG_DFS\n\n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\t//listen interval\n\t//todo: listen interval for power saving\n\tval16 = cpu_to_le16(3);\n\t_rtw_memcpy(pframe ,(unsigned char *)&val16, 2);\n\tpframe += 2;\n\tpattrib->pktlen += 2;\n\n\t//SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_,  pmlmeinfo->network.Ssid.SsidLength, pmlmeinfo->network.Ssid.Ssid, &(pattrib->pktlen));\n\n#ifdef CONFIG_DFS\n\t/* Dot H */\n\tif(pmlmeext->cur_channel > 14)\n\t{\n\t\tpow_cap_ele[0] = 13;\t// Minimum transmit power capability\n\t\tpow_cap_ele[1] = 21;\t// Maximum transmit power capability\n\t\tpframe = rtw_set_ie(pframe, EID_PowerCap, 2, pow_cap_ele, &(pattrib->pktlen));\n\n\t\t//supported channels\n\t\tdo{\n\t\t\tif( pmlmeext->channel_set[sup_ch_idx].ChannelNum <= 14 )\n\t\t\t{\n\t\t\t\tsup_ch[0] = 1;\t//First channel number\n\t\t\t\tsup_ch[1] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;\t//Number of channel\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsup_ch[idx_5g++] = pmlmeext->channel_set[sup_ch_idx].ChannelNum;\n\t\t\t\tsup_ch[idx_5g++] = 1;\n\t\t\t}\n\t\t\tsup_ch_idx++;\n\t\t}\n\t\twhile( pmlmeext->channel_set[sup_ch_idx].ChannelNum != 0 );\n\t\tpframe = rtw_set_ie(pframe, EID_SupportedChannels, idx_5g, sup_ch, &(pattrib->pktlen));\n\t}\n#endif //CONFIG_DFS\n\n\t//supported rate & extended supported rate\n\n#if 1\t// Check if the AP's supported rates are also supported by STA.\n\tget_rate_set(padapter, sta_bssrate, &sta_bssrate_len);\n\t//DBG_871X(\"sta_bssrate_len=%d\\n\", sta_bssrate_len);\n\t\n\tif(pmlmeext->cur_channel == 14)// for JAPAN, channel 14 can only uses B Mode(CCK) \n\t{\n\t\tsta_bssrate_len = 4;\n\t}\n\n\t\n\t//for (i = 0; i < sta_bssrate_len; i++) {\n\t//\tDBG_871X(\"sta_bssrate[%d]=%02X\\n\", i, sta_bssrate[i]);\n\t//}\n\n\tfor (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {\n\t\tif (pmlmeinfo->network.SupportedRates[i] == 0) break;\n\t\tDBG_871X(\"network.SupportedRates[%d]=%02X\\n\", i, pmlmeinfo->network.SupportedRates[i]);\n\t}\n\t\n\n\tfor (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {\n\t\tif (pmlmeinfo->network.SupportedRates[i] == 0) break;\n\n\t\t\n\t\t// Check if the AP's supported rates are also supported by STA.\n\t\tfor (j=0; j < sta_bssrate_len; j++) {\n\t\t\t // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP\n\t\t\tif ( (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK) \n\t\t\t\t\t== (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK)) {\n\t\t\t\t//DBG_871X(\"match i = %d, j=%d\\n\", i, j);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t//DBG_871X(\"not match: %02X != %02X\\n\", (pmlmeinfo->network.SupportedRates[i]|IEEE80211_BASIC_RATE_MASK), (sta_bssrate[j]|IEEE80211_BASIC_RATE_MASK));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (j == sta_bssrate_len) {\n\t\t\t// the rate is not supported by STA\n\t\t\tDBG_871X(\"%s(): the rate[%d]=%02X is not supported by STA!\\n\",__FUNCTION__, i, pmlmeinfo->network.SupportedRates[i]);\n\t\t} else {\n\t\t\t// the rate is supported by STA\n\t\t\tbssrate[index++] = pmlmeinfo->network.SupportedRates[i];\n\t\t}\n\t}\n\t\n\tbssrate_len = index;\n\tDBG_871X(\"bssrate_len = %d\\n\", bssrate_len);\n\n#else\t// Check if the AP's supported rates are also supported by STA.\n#if 0\n\tget_rate_set(padapter, bssrate, &bssrate_len);\n#else\n\tfor (bssrate_len = 0; bssrate_len < NumRates; bssrate_len++) {\n\t\tif (pmlmeinfo->network.SupportedRates[bssrate_len] == 0) break;\n\n\t\tif (pmlmeinfo->network.SupportedRates[bssrate_len] == 0x2C) // Avoid the proprietary data rate (22Mbps) of Handlink WSG-4000 AP\n\t\t\tbreak;\n\n\t\tbssrate[bssrate_len] = pmlmeinfo->network.SupportedRates[bssrate_len];\n\t}\n#endif\n#endif\t// Check if the AP's supported rates are also supported by STA.\n\n\tif ((bssrate_len == 0) && (pmlmeinfo->network.SupportedRates[0] != 0)) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit; //don't connect to AP if no joint supported rate\n\t}\n\n\n\tif (bssrate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));\n\t}\n\telse if (bssrate_len > 0)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));\n\t} else {\n\t\tDBG_871X(\"%s: Connect to AP without 11b and 11g data rate!\\n\",__FUNCTION__);\n\t}\n\n\t//vendor specific IE, such as WPA, WMM, WPS\n\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);\n\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\tif ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) ||\n\t\t\t\t\t\t(_rtw_memcmp(pIE->data, WMM_OUI, 4)) ||\n\t\t\t\t\t\t(_rtw_memcmp(pIE->data, WPS_OUI, 4)))\n\t\t\t\t{\t\n\t\t\t\t\tvs_ie_length = pIE->Length;\n\t\t\t\t\tif((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4)))\n\t\t\t\t\t{\n\t\t\t\t\t\t//Commented by Kurt 20110629\n\t\t\t\t\t\t//In some older APs, WPS handshake\n\t\t\t\t\t\t//would be fail if we append vender extensions informations to AP\n\n\t\t\t\t\t\tvs_ie_length = 14;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase EID_WPA2:\n\t\t\t\tpframe = rtw_set_ie(pframe, EID_WPA2, pIE->Length, pIE->data, &(pattrib->pktlen));\n\t\t\t\tbreak;\n#ifdef CONFIG_80211N_HT\n\t\t\tcase EID_HTCapability:\n\t\t\t\tif(padapter->mlmepriv.htpriv.ht_option==_TRUE) {\n\t\t\t\t\tif (!(is_ap_in_tkip(padapter)))\n\t\t\t\t\t{\n\t\t\t\t\t\t_rtw_memcpy(&(pmlmeinfo->HT_caps), pIE->data, sizeof(struct HT_caps_element));\n\n\t\t\t\t\t\tpmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = cpu_to_le16(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info);\n\n\t\t\t\t\t\tpframe = rtw_set_ie(pframe, EID_HTCapability, pIE->Length , (u8 *)(&(pmlmeinfo->HT_caps)), &(pattrib->pktlen));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase EID_EXTCapability:\n\t\t\t\tif(padapter->mlmepriv.htpriv.ht_option==_TRUE) {\n\t\t\t\t\tpframe = rtw_set_ie(pframe, EID_EXTCapability, pIE->Length, pIE->data, &(pattrib->pktlen));\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif //CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\n\t\t\tcase EID_VHTCapability:\n\t\t\t\tif (padapter->mlmepriv.vhtpriv.vht_option ==_TRUE) {\n\t\t\t\t\tpframe = rtw_set_ie(pframe, EID_VHTCapability, pIE->Length, pIE->data, &(pattrib->pktlen));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase EID_OpModeNotification:\n\t\t\t\tif (padapter->mlmepriv.vhtpriv.vht_option ==_TRUE) {\n\t\t\t\t\tpframe = rtw_set_ie(pframe, EID_OpModeNotification, pIE->Length, pIE->data, &(pattrib->pktlen));\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif // CONFIG_80211AC_VHT\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\ti += (pIE->Length + 2);\n\t}\n\n\tif (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, 6 , REALTEK_96B_IE, &(pattrib->pktlen));\n\t}\n\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_build_assoc_req_wapi_ie(padapter, pframe, pattrib);\n#endif\n\n\n#ifdef CONFIG_P2P\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif(adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif(pmlmepriv->p2p_assoc_req_ie && pmlmepriv->p2p_assoc_req_ie_len>0)\n\t\t{\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_assoc_req_ie, pmlmepriv->p2p_assoc_req_ie_len);\n\t\t\tpframe += pmlmepriv->p2p_assoc_req_ie_len;\n\t\t\tpattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t\t{\n\t\t\t//\tShould add the P2P IE in the association request frame.\t\n\t\t\t//\tP2P OUI\n\t\t\t\n\t\t\tp2pielen = 0;\n\t\t\tp2pie[ p2pielen++ ] = 0x50;\n\t\t\tp2pie[ p2pielen++ ] = 0x6F;\n\t\t\tp2pie[ p2pielen++ ] = 0x9A;\n\t\t\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t\t\t//\tCommented by Albert 20101109\n\t\t\t//\tAccording to the P2P Specification, the association request frame should contain 3 P2P attributes\n\t\t\t//\t1. P2P Capability\n\t\t\t//\t2. Extended Listen Timing\n\t\t\t//\t3. Device Info\n\t\t\t//\tCommented by Albert 20110516\n\t\t\t//\t4. P2P Interface\n\n\t\t\t//\tP2P Capability\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tDevice Capability Bitmap, 1 byte\n\t\t\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\n\t\t\t//\tGroup Capability Bitmap, 1 byte\n\t\t\tif ( pwdinfo->persistent_supported )\n\t\t\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;\n\t\t\telse\n\t\t\t\tp2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;\n\n\t\t\t//\tExtended Listen Timing\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tAvailability Period\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tAvailability Interval\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tDevice Info\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t\t\t//\tLength:\n\t\t\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t\t\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tP2P Device Address\n\t\t\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\tp2pielen += ETH_ALEN;\n\n\t\t\t//\tConfig Method\n\t\t\t//\tThis field should be big endian. Noted by P2P specification.\n\t\t\tif ( ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN ) ||\n\t\t\t\t( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN ) )\n\t\t\t{\n\t\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC );\n\t\t\t}\n\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tPrimary Device Type\n\t\t\t//\tCategory ID\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tOUI\n\t\t\t*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\t\t\tp2pielen += 4;\n\n\t\t\t//\tSub Category ID\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tNumber of Secondary Device Types\n\t\t\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t\t\t//\tDevice Name\n\t\t\t//\tType:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\t\tp2pielen += pwdinfo->device_name_len;\n\t\t\n\t\t\t//\tP2P Interface\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_INTERFACE;\n\t\t\t\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x000D );\n\t\t\tp2pielen += 2;\n\t\t\t\n\t\t\t//\tValue:\n\t\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );\t//\tP2P Device Address\n\t\t\tp2pielen += ETH_ALEN;\n\n\t\t\tp2pie[ p2pielen++ ] = 1;\t//\tP2P Interface Address Count\n\t\t\t\n\t\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );\t//\tP2P Interface Address List\n\t\t\tp2pielen += ETH_ALEN;\n\t\t\n\t\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pattrib->pktlen );\n\n#ifdef CONFIG_WFD\n\t\t\t//wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);\n\t\t\t//pframe += wfdielen;\n\t\t\t//pattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\t\t}\n\t}\n\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( _TRUE == pwdinfo->wfd_info->wfd_enable )\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\twfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\telse if (pmlmepriv->wfd_assoc_req_ie != NULL && pmlmepriv->wfd_assoc_req_ie_len>0)\t\t\n\t{\n\t\t//WFD IE\n\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_assoc_req_ie, pmlmepriv->wfd_assoc_req_ie_len);\n\t\tpattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len;\n\t\tpframe += pmlmepriv->wfd_assoc_req_ie_len;\t\t\n\t}\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_WFD\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tpattrib->pktlen += rtw_build_vendor_ie(padapter , pframe , WIFI_ASSOCREQ_VENDOR_IE_BIT);\n#endif\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\tdump_mgntframe(padapter, pmgntframe);\n\n\tret = _SUCCESS;\n\nexit:\n\tif (ret == _SUCCESS)\n\t\trtw_buf_update(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len, (u8 *)pwlanhdr, pattrib->pktlen);\n\telse\n\t\trtw_buf_free(&pmlmepriv->assoc_req, &pmlmepriv->assoc_req_len);\n\n\treturn;\n}\n\n//when wait_ack is ture, this function shoule be called at process context\nstatic int _issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t*pxmitpriv;\n\tstruct mlme_ext_priv\t*pmlmeext;\n\tstruct mlme_ext_info\t*pmlmeinfo;\n\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, power_mode);\n\n\tif(!padapter)\n\t\tgoto exit;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tpxmitpriv = &(padapter->xmitpriv);\n\tpmlmeext = &(padapter->mlmeextpriv);\n\tpmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\tpattrib->retry_ctrl = _FALSE;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\tSetFrDs(fctrl);\n\t}\n\telse if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)\n\t{\n\t\tSetToDs(fctrl);\n\t}\n\t\n\tif (power_mode)\n\t{\n\t\tSetPwrMgt(fctrl);\n\t}\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_DATA_NULL);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tif(wait_ack)\n\t{\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t}\n\telse\n\t{\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n}\n\n/*\n * [IMPORTANT] Don't call this function in interrupt context\n *\n * When wait_ms > 0, this function should be called at process context\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n * da == NULL for station mode\n */\nint issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_info *psta;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\t/* da == NULL, assum it's null data for sta to ap*/\n\tif (da == NULL)\n\t\tda = get_my_bssid(&(pmlmeinfo->network));\n\n\tpsta = rtw_get_stainfo(&padapter->stapriv, da);\n\tif (psta) {\n\t\tif (power_mode)\n\t\t\trtw_hal_macid_sleep(padapter, psta->mac_id);\n\t\telse\n\t\t\trtw_hal_macid_wakeup(padapter, psta->mac_id);\n\t} else {\n\t\tDBG_871X(FUNC_ADPT_FMT \": Can't find sta info for \" MAC_FMT \", skip macid %s!!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?\"sleep\":\"wakeup\");\n\t\trtw_warn_on(1);\n\t}\n\n\tdo {\n\t\tret = _issue_nulldata(padapter, da, power_mode, wait_ms>0?_TRUE:_FALSE);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\n/*\n * [IMPORTANT] This function run in interrupt context\n *\n * The null data packet would be sent without power bit,\n * and not guarantee success.\n */\ns32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da, unsigned int power_mode)\n{\n\tint ret;\n\tstruct mlme_ext_priv *pmlmeext;\n\tstruct mlme_ext_info *pmlmeinfo;\n\n\n\tpmlmeext = &padapter->mlmeextpriv;\n\tpmlmeinfo = &pmlmeext->mlmext_info;\n\n\t/* da == NULL, assum it's null data for sta to ap*/\n\tif (da == NULL)\n\t\tda = get_my_bssid(&(pmlmeinfo->network));\n\n\tret = _issue_nulldata(padapter, da, power_mode, _FALSE);\n\n\treturn ret;\n}\n\n//when wait_ack is ture, this function shoule be called at process context\nstatic int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int wait_ack)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl, *qc;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\tpattrib->hdrlen +=2;\n\tpattrib->qos_en = _TRUE;\n\tpattrib->eosp = 1;\n\tpattrib->ack_policy = 0;\n\tpattrib->mdata = 0;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\tSetFrDs(fctrl);\n\t}\n\telse if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)\n\t{\n\t\tSetToDs(fctrl);\n\t}\n\n\tif(pattrib->mdata)\n\t\tSetMData(fctrl);\n\n\tqc = (unsigned short *)(pframe + pattrib->hdrlen - 2);\n\t\n\tSetPriority(qc, tid);\n\n\tSetEOSP(qc, pattrib->eosp);\n\n\tSetAckpolicy(qc, pattrib->ack_policy);\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\tif(wait_ack)\n\t{\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t}\n\telse\n\t{\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n}\n\n/*\n * when wait_ms >0 , this function should be called at process context\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n * da == NULL for station mode\n */\nint issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\t/* da == NULL, assum it's null data for sta to ap*/\n\tif (da == NULL)\n\t\tda = get_my_bssid(&(pmlmeinfo->network));\n\t\n\tdo\n\t{\n\t\tret = _issue_qos_nulldata(padapter, da, tid, wait_ms>0?_TRUE:_FALSE);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\nstatic int _issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason, u8 wait_ack, u8 key_type)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint ret = _FAIL;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif //CONFIG_P2P\t\n\n\t//DBG_871X(\"%s to \"MAC_FMT\"\\n\", __func__, MAC_ARG(da));\n\n#ifdef CONFIG_P2P\n\tif ( !( rtw_p2p_chk_state( pwdinfo, P2P_STATE_NONE ) ) && ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) )\n\t{\n\t\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey );\n\t\t_set_timer( &pwdinfo->reset_ch_sitesurvey, 10 );\n\t}\n#endif //CONFIG_P2P\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\tpattrib->retry_ctrl = _FALSE;\n\tpattrib->key_type = key_type;\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_DEAUTH);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\treason = cpu_to_le16(reason);\n\tpframe = rtw_set_fixed_ie(pframe, _RSON_CODE_ , (unsigned char *)&reason, &(pattrib->pktlen));\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\n\tif(wait_ack)\n\t{\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t}\n\telse\n\t{\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n}\n\nint issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason)\n{\n\tDBG_871X(\"%s to \"MAC_FMT\"\\n\", __func__, MAC_ARG(da));\n\treturn _issue_deauth(padapter, da, reason, _FALSE, IEEE80211W_RIGHT_KEY);\n}\n\n#ifdef CONFIG_IEEE80211W\nint issue_deauth_11w(_adapter *padapter, unsigned char *da, unsigned short reason, u8 key_type)\n{\n\tDBG_871X(\"%s to \"MAC_FMT\"\\n\", __func__, MAC_ARG(da));\n\treturn _issue_deauth(padapter, da, reason, _FALSE, key_type);\n}\n#endif /* CONFIG_IEEE80211W */\n\n/*\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n */\nint issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt,\n\tint wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tdo\n\t{\n\t\tret = _issue_deauth(padapter, da, reason, wait_ms > 0 ? _TRUE:_FALSE, IEEE80211W_RIGHT_KEY);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\nvoid issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset)\n{\t\n\t_irqL\tirqL;\n\t_list\t\t*plist, *phead;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\n\n\tDBG_871X(FUNC_NDEV_FMT\" ra=\"MAC_FMT\", ch:%u, offset:%u\\n\",\n\t\tFUNC_NDEV_ARG(padapter->pnetdev), MAC_ARG(ra), new_ch, ch_offset);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\treturn;\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, ra, ETH_ALEN); /* RA */\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); /* TA */\n\t_rtw_memcpy(pwlanhdr->addr3, ra, ETH_ALEN); /* DA = RA */\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t/* category, action */\n\t{\n\t\tu8 category, action;\n\t\tcategory = RTW_WLAN_CATEGORY_SPECTRUM_MGMT;\n\t\taction = RTW_WLAN_ACTION_SPCT_CHL_SWITCH;\n\n\t\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\t\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\t}\n\n\tpframe = rtw_set_ie_ch_switch(pframe, &(pattrib->pktlen), 0, new_ch, 0);\n\tpframe = rtw_set_ie_secondary_ch_offset(pframe, &(pattrib->pktlen),\n\t\thal_ch_offset_to_secondary_ch_offset(ch_offset));\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n}\n\n#ifdef CONFIG_IEEE80211W\nvoid issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid, u8 key_type)\n{\n\tu8\tcategory = RTW_WLAN_CATEGORY_SA_QUERY;\n\tu16\treason_code;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tu8\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_info\t\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct registry_priv\t \t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\n\n\tDBG_871X(\"%s, %04x\\n\", __FUNCTION__, tid);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s: alloc_mgtxmitframe fail\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\tpattrib->key_type = key_type;\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif(raddr)\n\t\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\telse\n\t\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen);\n\tpframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen);\n\n\tswitch (action)\n\t{\n\t\tcase 0: //SA Query req\n\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeext->sa_query_seq, &pattrib->pktlen);\n\t\t\tpmlmeext->sa_query_seq++;\n\t\t\t/* send sa query request to AP, AP should reply sa query response in 1 second */\n\t\t\tif (pattrib->key_type == IEEE80211W_RIGHT_KEY) {\n\t\t\t\tpsta = rtw_get_stainfo(pstapriv, raddr);\n\t\t\t\tif (psta != NULL) {\n\t\t\t\t\t/* DBG_871X(\"%s, %d, set dot11w_expire_timer\\n\", __func__, __LINE__); */\n\t\t\t\t\t_set_timer(&psta->dot11w_expire_timer, 1000);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 1: //SA Query rsp\n\t\t\ttid = cpu_to_le16(tid);\n\t\t\t/* DBG_871X(\"rtw_set_fixed_ie, %04x\\n\", tid); */\n\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&tid, &pattrib->pktlen);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n}\n#endif //CONFIG_IEEE80211W\n\n/**\n * issue_action_ba - internal function to TX Block Ack action frame\n * @padapter: the adapter to TX\n * @raddr: receiver address\n * @action: Block Ack Action\n * @tid: tid\n * @size: the announced AMPDU buffer size. used by ADDBA_RESP\n * @status: status/reason code. used by ADDBA_RESP, DELBA\n * @initiator: if we are the initiator of AMPDU association. used by DELBA\n * @wait_ack: used xmit ack\n *\n * Returns:\n * _SUCCESS: No xmit ack is used or acked\n * _FAIL: not acked when using xmit ack\n */\nstatic int issue_action_ba(_adapter *padapter, unsigned char *raddr, unsigned char action\n\t, u8 tid, u8 size, u16 status, u8 initiator, int wait_ack)\n{\n\tint ret = _FAIL;\n\tu8\tcategory = RTW_WLAN_CATEGORY_BACK;\n\tu16\tstart_seq;\n\tu16\tBA_para_set;\n\tu16\tBA_timeout_value;\n\tu16\tBA_starting_seqctrl;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tu8\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_info\t\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct registry_priv\t \t*pregpriv = &padapter->registrypriv;\n\n#ifdef CONFIG_80211N_HT\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t//_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\n\tif (category == 3)\n\t{\n\t\tswitch (action)\n\t\t{\n\t\t\tcase RTW_WLAN_ACTION_ADDBA_REQ:\n\t\t\t\tdo {\n\t\t\t\t\tpmlmeinfo->dialogToken++;\n\t\t\t\t} while (pmlmeinfo->dialogToken == 0);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->dialogToken), &(pattrib->pktlen));\n\n\t\t\t\t#if defined(CONFIG_RTL8188E) && defined(CONFIG_SDIO_HCI)\n\t\t\t\tBA_para_set = (0x0802 | ((tid & 0xf) << 2)); /* immediate ack & 16 buffer size */\n\t\t\t\t#else\n\t\t\t\tBA_para_set = (0x1002 | ((tid & 0xf) << 2)); /* immediate ack & 64 buffer size */\n\t\t\t\t#endif\n\n\t\t\t\tBA_para_set = cpu_to_le16(BA_para_set);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));\n\n\t\t\t\t//BA_timeout_value = 0xffff;//max: 65535 TUs(~ 65 ms)\n\t\t\t\tBA_timeout_value = 5000;//~ 5ms\n\t\t\t\tBA_timeout_value = cpu_to_le16(BA_timeout_value);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_timeout_value)), &(pattrib->pktlen));\n\n\t\t\t\t//if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)\n\t\t\t\tif ((psta = rtw_get_stainfo(pstapriv, raddr)) != NULL)\n\t\t\t\t{\n\t\t\t\t\tstart_seq = (psta->sta_xmitpriv.txseq_tid[tid & 0x07]&0xfff) + 1;\n\n\t\t\t\t\tDBG_871X(\"BA_starting_seqctrl = %d for TID=%d\\n\", start_seq, tid & 0x07);\n\t\t\t\t\t\n\t\t\t\t\tpsta->BA_starting_seqctrl[tid & 0x07] = start_seq;\n\t\t\t\t\t\n\t\t\t\t\tBA_starting_seqctrl = start_seq << 4;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tBA_starting_seqctrl = cpu_to_le16(BA_starting_seqctrl);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_starting_seqctrl)), &(pattrib->pktlen));\n\t\t\t\tbreak;\n\n\t\t\tcase RTW_WLAN_ACTION_ADDBA_RESP:\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 1, &(pmlmeinfo->ADDBA_req.dialog_token), &(pattrib->pktlen));\n\t\t\t\tstatus = cpu_to_le16(status);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&status), &(pattrib->pktlen));\n\n\t\t\t\tBA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set);\n\n\t\t\t\tBA_para_set &= ~IEEE80211_ADDBA_PARAM_TID_MASK;\n\t\t\t\tBA_para_set |= (tid << 2) & IEEE80211_ADDBA_PARAM_TID_MASK;\n\n\t\t\t\tBA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;\n\t\t\t\tBA_para_set |= (size << 6) & RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;\n\n\t\t\t\tif (!padapter->registrypriv.wifi_spec) {\n\t\t\t\t\tif(pregpriv->ampdu_amsdu==0)//disabled\n\t\t\t\t\t\tBA_para_set &= ~BIT(0);\n\t\t\t\t\telse if(pregpriv->ampdu_amsdu==1)//enabled\n\t\t\t\t\t\tBA_para_set |= BIT(0);\n\t\t\t\t}\n\n\t\t\t\tBA_para_set = cpu_to_le16(BA_para_set);\n\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen));\n\t\t\t\tbreak;\n\n\t\t\tcase RTW_WLAN_ACTION_DELBA:\n\t\t\t\tBA_para_set = 0;\n\t\t\t\tBA_para_set |= (tid << 12) & IEEE80211_DELBA_PARAM_TID_MASK;\n\t\t\t\tBA_para_set |= (initiator << 11) & IEEE80211_DELBA_PARAM_INITIATOR_MASK;\n\n\t\t\t\tBA_para_set = cpu_to_le16(BA_para_set);\t\t\t\t\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));\n\t\t\t\tstatus = cpu_to_le16(status);\n\t\t\t\tpframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(status)), &(pattrib->pktlen));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n#endif //CONFIG_80211N_HT\n\treturn ret;\n}\n\n/**\n * issue_addba_req - TX ADDBA_REQ\n * @adapter: the adapter to TX\n * @ra: receiver address\n * @tid: tid\n */\ninline void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid)\n{\n\tissue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_REQ\n\t\t, tid\n\t\t, 0 /* unused */\n\t\t, 0 /* unused */\n\t\t, 0 /* unused */\n\t\t, _FALSE\n\t);\n\tDBG_871X(FUNC_ADPT_FMT\" ra=\"MAC_FMT\" tid=%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(ra), tid);\n\n}\n\n/**\n * issue_addba_rsp - TX ADDBA_RESP\n * @adapter: the adapter to TX\n * @ra: receiver address\n * @tid: tid\n * @status: status code\n * @size: the announced AMPDU buffer size\n */\ninline void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size)\n{\n\tissue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_RESP\n\t\t, tid\n\t\t, size\n\t\t, status\n\t\t, 0 /* unused */\n\t\t, _FALSE\n\t);\n\tDBG_871X(FUNC_ADPT_FMT\" ra=\"MAC_FMT\" status=%u, tid=%u, size=%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(ra), status, tid, size);\n}\n\n/**\n * issue_del_ba - TX DELBA\n * @adapter: the adapter to TX\n * @ra: receiver address\n * @tid: tid\n * @reason: reason code\n * @initiator: if we are the initiator of AMPDU association. used by DELBA\n */\ninline void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator)\n{\n\tissue_action_ba(adapter, ra, RTW_WLAN_ACTION_DELBA\n\t\t, tid\n\t\t, 0 /* unused */\n\t\t, reason\n\t\t, initiator\n\t\t, _FALSE\n\t);\n\tDBG_871X(FUNC_ADPT_FMT\" ra=\"MAC_FMT\" reason=%u, tid=%u, initiator=%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(ra), reason, tid, initiator);\n}\n\n/**\n * issue_del_ba_ex - TX DELBA with xmit ack options\n * @adapter: the adapter to TX\n * @ra: receiver address\n * @tid: tid\n * @reason: reason code\n * @initiator: if we are the initiator of AMPDU association. used by DELBA\n * @try_cnt: the maximal TX count to try\n * @wait_ms: == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n *           > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n */\nint issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator\n\t, int try_cnt, int wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(adapter)))\n\t\tgoto exit;\n\n\tdo {\n\t\tret = issue_action_ba(adapter, ra, RTW_WLAN_ACTION_DELBA\n\t\t\t, tid\n\t\t\t, 0 /* unused */\n\t\t\t, reason\n\t\t\t, initiator\n\t\t\t, wait_ms > 0?_TRUE:_FALSE\n\t\t);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(adapter))\n\t\t\tbreak;\n\n\t\tif (i < try_cnt && wait_ms > 0 && ret == _FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t} while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t#ifndef DBG_XMIT_ACK\n\t\t/* goto exit; */\n\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" ra=\"MAC_FMT\" reason=%u, tid=%u, initiator=%u%s, %d/%d in %u ms\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(ra), reason, tid, initiator\n\t\t\t, ret == _SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\nstatic void issue_action_BSSCoexistPacket(_adapter *padapter)\n{\t\n\t_irqL\tirqL;\n\t_list\t\t*plist, *phead;\n\tunsigned char category, action;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t*fctrl;\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t_queue\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tu8 InfoContent[16] = {0};\n\tu8 ICS[8][15];\n#ifdef CONFIG_80211N_HT\t\n\tif((pmlmepriv->num_FortyMHzIntolerant==0) || (pmlmepriv->num_sta_no_ht==0))\n\t\treturn;\n\n\tif(_TRUE == pmlmeinfo->bwmode_updated)\n\t\treturn;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn;\t\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\n\tcategory = RTW_WLAN_CATEGORY_PUBLIC;\n\taction = ACT_PUBLIC_BSSCOEXIST;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\n\n\t//\n\tif(pmlmepriv->num_FortyMHzIntolerant>0)\n\t{\n\t\tu8 iedata=0;\n\t\t\n\t\tiedata |= BIT(2);//20 MHz BSS Width Request\n\n\t\tpframe = rtw_set_ie(pframe, EID_BSSCoexistence,  1, &iedata, &(pattrib->pktlen));\n\t\t\n\t}\n\t\n\n\t//\n\t_rtw_memset(ICS, 0, sizeof(ICS));\n\tif(pmlmepriv->num_sta_no_ht>0)\n\t{\t\n\t\tint i;\n\t\n\t\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\t\tphead = get_list_head(queue);\n\t\tplist = get_next(phead);\n       \n\t\twhile(1)\n\t\t{\n\t\t\tint len;\n\t\t\tu8 *p;\n\t\t\tWLAN_BSSID_EX *pbss_network;\n\t\n\t\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\t\tbreak;\t\t\n\n\t\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);      \n\t\t\n\t\t\tplist = get_next(plist);\n\n\t\t\tpbss_network = (WLAN_BSSID_EX *)&pnetwork->network;\n\n\t\t\tp = rtw_get_ie(pbss_network->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, pbss_network->IELength - _FIXED_IE_LENGTH_);\n\t\t\tif((p==NULL) || (len==0))//non-HT\n\t\t\t{\n\t\t\t\tif((pbss_network->Configuration.DSConfig<=0) || (pbss_network->Configuration.DSConfig>14))\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tICS[0][pbss_network->Configuration.DSConfig]=1;\n\t\t\t\t\n\t\t\t\tif(ICS[0][0] == 0)\n\t\t\t\t\tICS[0][0] = 1;\t\t\n\t\t\t}\t\t\n\t\n\t\t}        \n\n\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\n\t\tfor(i= 0;i<8;i++)\n\t\t{\n\t\t\tif(ICS[i][0] == 1)\n\t\t\t{\n\t\t\t\tint j, k = 0;\n\t\t\t\t\n\t\t\t\tInfoContent[k] = i;\t\t\t\t\n\t\t\t\t//SET_BSS_INTOLERANT_ELE_REG_CLASS(InfoContent,i);\n\t\t\t\tk++;\n\t\t\t\t\n\t\t\t\tfor(j=1;j<=14;j++)\n\t\t\t\t{\n\t\t\t\t\tif(ICS[i][j]==1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(k<16)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tInfoContent[k] = j; //channel number\n\t\t\t\t\t\t\t//SET_BSS_INTOLERANT_ELE_CHANNEL(InfoContent+k, j);\n\t\t\t\t\t\t\tk++;\n\t\t\t\t\t\t}\t\n\t\t\t\t\t}\t\n\t\t\t\t}\t\n\n\t\t\t\tpframe = rtw_set_ie(pframe, EID_BSSIntolerantChlReport, k, InfoContent, &(pattrib->pktlen));\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\n\t}\n\t\t\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n#endif //CONFIG_80211N_HT\n}\n\n// Spatial Multiplexing Powersave (SMPS) action frame\nint _issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode ,  u8 wait_ack)\n{\n\n\tint ret = _FAIL;\n\tunsigned char category = RTW_WLAN_CATEGORY_HT;\n\tu8 action = RTW_WLAN_ACTION_HT_SM_PS; \t\n\tu8 sm_power_control=0;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\n\tif(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DISABLED)\n\t{\n\t\tsm_power_control = sm_power_control  & ~(BIT(0)); // SM Power Save Enable = 0 SM Power Save Disable \n\t}\n        else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_STATIC)\n        {\n                sm_power_control = sm_power_control | BIT(0);    // SM Power Save Enable = 1 SM Power Save Enable  \n                sm_power_control = sm_power_control & ~(BIT(1)); // SM Mode = 0 Static Mode\n        }\n        else if(NewMimoPsMode==WLAN_HT_CAP_SM_PS_DYNAMIC)\n        {\n                sm_power_control = sm_power_control | BIT(0); // SM Power Save Enable = 1 SM Power Save Enable  \n                sm_power_control = sm_power_control | BIT(1); // SM Mode = 1 Dynamic Mode\n        }\n        else \n\t\treturn ret;\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\treturn ret;\n\n        DBG_871X(\"%s, sm_power_control=%u, NewMimoPsMode=%u\\n\", __FUNCTION__ , sm_power_control , NewMimoPsMode );\n    \n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\treturn ret;\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); /* RA */\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); /* TA */\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); /* DA = RA */\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t/* category, action */\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(sm_power_control), &(pattrib->pktlen));\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tif(wait_ack)\n\t{\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t}\n\telse\n\t{\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\n        if (ret != _SUCCESS)\n            DBG_8192C(\"%s, ack to\\n\", __func__);\n\n\treturn ret;\n}\n\n/*\n * wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n * wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n * try_cnt means the maximal TX count to try\n */\nint issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 NewMimoPsMode, int try_cnt, int wait_ms)\n{\n\tint ret = _FAIL;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\n\tif (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(padapter)))\n\t\tgoto exit;\n\n\tdo {\n\t\tret = _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , wait_ms>0?_TRUE:_FALSE );\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif(i < try_cnt && wait_ms > 0 && ret==_FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t}while((i<try_cnt) && ((ret==_FAIL)||(wait_ms==0)));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (raddr)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", %s , %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(raddr),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", %s , %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\n\treturn ret;\n}\n\nint issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode )\n{\n\tDBG_871X(\"%s to \"MAC_FMT\"\\n\", __func__, MAC_ARG(raddr));\n\treturn _issue_action_SM_PS(padapter, raddr, NewMimoPsMode , _FALSE );\n}\n\n/**\n * _send_delba_sta_tid - Cancel the AMPDU association for the specific @sta, @tid\n * @adapter: the adapter to which @sta belongs\n * @initiator: if we are the initiator of AMPDU association\n * @sta: the sta to be checked\n * @tid: the tid to be checked\n * @force: cancel and send DELBA even when no AMPDU association is setup\n * @wait_ack: send delba with xmit ack (valid when initiator == 0)\n *\n * Returns:\n * _FAIL if sta is NULL\n * when initiator is 1, always _SUCCESS\n * when initiator is 0, _SUCCESS if DELBA is acked\n */\nstatic unsigned int _send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid\n\t, u8 force, int wait_ack)\n{\n\tint ret = _SUCCESS;\n\n\tif (sta == NULL) {\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (initiator == 0) {\n\t\t/* recipient */\n\t\tif (force || sta->recvreorder_ctrl[tid].enable == _TRUE) {\n\t\t\tu8 ampdu_size_bak = sta->recvreorder_ctrl[tid].ampdu_size;\n\n\t\t\tsta->recvreorder_ctrl[tid].enable = _FALSE;\n\t\t\tsta->recvreorder_ctrl[tid].ampdu_size = RX_AMPDU_SIZE_INVALID;\n\n\t\t\tif (rtw_del_rx_ampdu_test_trigger_no_tx_fail())\n\t\t\t\tret = _FAIL;\n\t\t\telse if (wait_ack)\n\t\t\t\tret = issue_del_ba_ex(adapter, sta->hwaddr, tid, 37, initiator, 3, 1);\n\t\t\telse\n\t\t\t\tissue_del_ba(adapter, sta->hwaddr, tid, 37, initiator);\n\n\t\t\tif (ret == _FAIL && sta->recvreorder_ctrl[tid].enable == _FALSE)\n\t\t\t\tsta->recvreorder_ctrl[tid].ampdu_size = ampdu_size_bak;\n\t\t}\n\t} else if (initiator == 1) {\n\t\t/* originator */\n#ifdef CONFIG_80211N_HT\n\t\tif (force || sta->htpriv.agg_enable_bitmap & BIT(tid)) {\n\t\t\tsta->htpriv.agg_enable_bitmap &= ~BIT(tid);\n\t\t\tsta->htpriv.candidate_tid_bitmap &= ~BIT(tid);\n\t\t\tissue_del_ba(adapter, sta->hwaddr, tid, 37, initiator);\n\t\t}\n#endif\n\t}\n\nexit:\n\treturn ret;\n}\n\ninline unsigned int send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid\n\t, u8 force)\n{\n\treturn _send_delba_sta_tid(adapter, initiator, sta, tid, force, 0);\n}\n\ninline unsigned int send_delba_sta_tid_wait_ack(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid\n\t, u8 force)\n{\n\treturn _send_delba_sta_tid(adapter, initiator, sta, tid, force, 1);\n}\n\nunsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr)\n{\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta = NULL;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu16 tid;\n\n\tif ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)\n\t\tif (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS))\n\t\t\treturn _SUCCESS;\n\n\tpsta = rtw_get_stainfo(pstapriv, addr);\n\tif(psta==NULL)\n\t\treturn _SUCCESS;\n\n\t#if 0\n\tDBG_871X(\"%s:%s\\n\", __func__, (initiator == 0)?\"RX_DIR\":\"TX_DIR\");\n\tif (initiator == 1) /* originator */\n\t\tDBG_871X(\"tx agg_enable_bitmap(0x%08x)\\n\", psta->htpriv.agg_enable_bitmap);\n\t#endif\n\n\tfor (tid = 0; tid < TID_NUM; tid++)\n\t\tsend_delba_sta_tid(padapter, initiator, psta, tid, 0);\n\n\treturn _SUCCESS;\n}\n\nunsigned int send_beacon(_adapter *padapter)\n{\n\tu8\tbxmitok = _FALSE;\n\tint\tissue=0;\n\tint poll = 0;\n#if defined(CONFIG_PCI_HCI) && defined(RTL8814AE_SW_BCN)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n#endif\n//#ifdef CONFIG_CONCURRENT_MODE\n\t//struct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\t//struct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t//_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\n\t//struct mlme_priv *pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);\n//#endif\t\t\n\n#ifdef CONFIG_PCI_HCI\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\n\t/* 8192EE Port select for Beacon DL */\n\trtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);\n\n\tissue_beacon(padapter, 0);\n\n#ifdef RTL8814AE_SW_BCN\n\tif (pHalData->bCorrectBCN != 0)\n\t\tDBG_871X(\"%s, line%d, Warnning, pHalData->bCorrectBCN != 0\\n\", __func__, __LINE__);\n\tpHalData->bCorrectBCN = 1;\n#endif\n\n\treturn _SUCCESS;\n#endif\n\n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tu32 start = rtw_get_current_time();\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\trtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);\n\tdo{\n\t\tissue_beacon(padapter, 100);\n\t\tissue++;\n\t\tdo {\n\t\t\trtw_yield_os();\n\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok));\n\t\t\tpoll++;\n\t\t} while ((poll%10) != 0 && _FALSE == bxmitok && !RTW_CANNOT_RUN(padapter));\n\n\t} while (_FALSE == bxmitok && issue < 100 && !RTW_CANNOT_RUN(padapter));\n\n\tif (RTW_CANNOT_RUN(padapter))\n\t\treturn _FAIL;\n\n\t\n\tif(_FALSE == bxmitok)\n\t{\n\t\tDBG_871X(\"%s fail! %u ms\\n\", __FUNCTION__, rtw_get_passing_time_ms(start));\n\t\treturn _FAIL;\n\t}\n\telse\n\t{\n\t\tu32 passing_time = rtw_get_passing_time_ms(start);\n\n\t\tif(passing_time > 100 || issue > 3)\n\t\t\tDBG_871X(\"%s success, issue:%d, poll:%d, %u ms\\n\", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start));\n\t\t//else\n\t\t//\tDBG_871X(\"%s success, issue:%d, poll:%d, %u ms\\n\", __FUNCTION__, issue, poll, rtw_get_passing_time_ms(start));\n\t\t\n\t\trtw_hal_fw_correct_bcn(padapter);\n\n\t\treturn _SUCCESS;\n\t}\n\n#endif\n\n}\n\n/****************************************************************************\n\nFollowing are some utitity fuctions for WiFi MLME\n\n*****************************************************************************/\n\nBOOLEAN IsLegal5GChannel(\n\tIN PADAPTER\t\t\tAdapter,\n\tIN u8\t\t\tchannel)\n{\n\t\n\tint i=0;\n\tu8 Channel_5G[45] = {36,38,40,42,44,46,48,50,52,54,56,58,\n\t\t60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,\n\t\t124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,\n\t\t161,163,165};\n\tfor(i=0;i<sizeof(Channel_5G);i++)\n\t\tif(channel == Channel_5G[i])\n\t\t\treturn _TRUE;\n\treturn _FALSE;\n}\n\n//collect bss info from Beacon and Probe request/response frames.\nu8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid)\n{\n\tint\ti;\n\tu32\tlen;\n\tu8\t*p;\n\tu16\tval16, subtype;\n\tu8\t*pframe = precv_frame->u.hdr.rx_data;\n\tu32\tpacket_len = precv_frame->u.hdr.len;\n\tu8 ie_offset;\n\tstruct registry_priv \t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tlen = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tif (len > MAX_IE_SZ)\n\t{\n\t\t//DBG_871X(\"IE too long for survey event\\n\");\n\t\treturn _FAIL;\n\t}\n\n\t_rtw_memset(bssid, 0, sizeof(WLAN_BSSID_EX));\n\n\tsubtype = GetFrameSubType(pframe);\n\n\tif(subtype==WIFI_BEACON) {\n\t\tbssid->Reserved[0] = 1;\n\t\tie_offset = _BEACON_IE_OFFSET_;\n\t} else {\n\t\t// FIXME : more type\n\t\tif (subtype == WIFI_PROBERSP) {\n\t\t\tie_offset = _PROBERSP_IE_OFFSET_;\n\t\t\tbssid->Reserved[0] = 3;\n\t\t}\n\t\telse if (subtype == WIFI_PROBEREQ) {\n\t\t\tie_offset = _PROBEREQ_IE_OFFSET_;\n\t\t\tbssid->Reserved[0] = 2;\n\t\t}\n\t\telse {\n\t\t\tbssid->Reserved[0] = 0;\n\t\t\tie_offset = _FIXED_IE_LENGTH_;\n\t\t}\n\t}\n\t\t\n\tbssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len;\n\n\t//below is to copy the information element\n\tbssid->IELength = len;\n\t_rtw_memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength);\n\n\t//get the signal strength\n\t//bssid->Rssi = precv_frame->u.hdr.attrib.SignalStrength; // 0-100 index.\n\tbssid->Rssi = precv_frame->u.hdr.attrib.phy_info.RecvSignalPower; // in dBM.raw data\t\n\tbssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.phy_info.SignalQuality;//in percentage \n\tbssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.phy_info.SignalStrength;//in percentage\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t//rtw_hal_get_hwreg(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna));\n\trtw_hal_get_def_var(padapter, HAL_DEF_CURRENT_ANTENNA,  &bssid->PhyInfo.Optimum_antenna);\n#endif\n\n\t// checking SSID\n\tif ((p = rtw_get_ie(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset)) == NULL)\n\t{\n\t\tDBG_871X(\"marc: cannot find SSID for survey event\\n\");\n\t\treturn _FAIL;\n\t}\n\n\tif (*(p + 1))\n\t{\n\t\tif (len > NDIS_802_11_LENGTH_SSID)\n\t\t{\n\t\t\tDBG_871X(\"%s()-%d: IE too long (%d) for survey event\\n\", __FUNCTION__, __LINE__, len);\n\t\t\treturn _FAIL;\n\t\t}\n\t\t_rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1));\n\t\tbssid->Ssid.SsidLength = *(p + 1);\n\t}\n\telse\n\t{\n\t\tbssid->Ssid.SsidLength = 0;\n\t}\n\n\t_rtw_memset(bssid->SupportedRates, 0, NDIS_802_11_LENGTH_RATES_EX);\n\n\t//checking rate info...\n\ti = 0;\n\tp = rtw_get_ie(bssid->IEs + ie_offset, _SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset);\n\tif (p != NULL)\n\t{\n\t\tif (len > NDIS_802_11_LENGTH_RATES_EX)\n\t\t{\n\t\t\tDBG_871X(\"%s()-%d: IE too long (%d) for survey event\\n\", __FUNCTION__, __LINE__, len);\n\t\t\treturn _FAIL;\n\t\t}\n\t\t_rtw_memcpy(bssid->SupportedRates, (p + 2), len);\n\t\ti = len;\n\t}\n\n\tp = rtw_get_ie(bssid->IEs + ie_offset, _EXT_SUPPORTEDRATES_IE_, &len, bssid->IELength - ie_offset);\n\tif (p != NULL)\n\t{\n\t\tif (len > (NDIS_802_11_LENGTH_RATES_EX-i))\n\t\t{\n\t\t\tDBG_871X(\"%s()-%d: IE too long (%d) for survey event\\n\", __FUNCTION__, __LINE__, len);\n\t\t\treturn _FAIL;\n\t\t}\n\t\t_rtw_memcpy(bssid->SupportedRates + i, (p + 2), len);\n\t}\n\n\t//todo:\n#if 0\n\tif (judge_network_type(bssid->SupportedRates, (len + i)) == WIRELESS_11B)\n\t{\n\t\tbssid->NetworkTypeInUse = Ndis802_11DS;\n\t}\n\telse\n#endif\n\t{\n\t\tbssid->NetworkTypeInUse = Ndis802_11OFDM24;\n\t}\n\n#ifdef CONFIG_P2P\n\tif (subtype == WIFI_PROBEREQ)\n\t{\n\t\tu8 *p2p_ie;\n\t\tu32\tp2p_ielen;\n\t\t// Set Listion Channel\n\t\tif ((p2p_ie = rtw_get_p2p_ie(bssid->IEs, bssid->IELength, NULL, &p2p_ielen)))\n\t\t{\n\t\t\tu32\tattr_contentlen = 0;\n\t\t\tu8 listen_ch[5] = { 0x00 };\n\n\t\t\trtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, listen_ch, &attr_contentlen);\n\t\t\tbssid->Configuration.DSConfig = listen_ch[4];\n\t\t} else\n\t\t{ // use current channel\n\t\t\tbssid->Configuration.DSConfig = padapter->mlmeextpriv.cur_channel;\n\t\t\tDBG_871X(\"%s()-%d: Cannot get p2p_ie. set DSconfig to op_ch(%d)\\n\", __FUNCTION__, __LINE__, bssid->Configuration.DSConfig);\n\t\t}\n\n\t\t// FIXME\n\t\tbssid->InfrastructureMode = Ndis802_11Infrastructure;\n\t\t_rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN);\n\t\tbssid->Privacy = 1;\n\t\treturn _SUCCESS;\n\t}\n#endif //CONFIG_P2P\n\n\tif (bssid->IELength < 12)\n\t\treturn _FAIL;\n\n\t// Checking for DSConfig\n\tp = rtw_get_ie(bssid->IEs + ie_offset, _DSSET_IE_, &len, bssid->IELength - ie_offset);\n\n\tbssid->Configuration.DSConfig = 0;\n\tbssid->Configuration.Length = 0;\n\n\tif (p)\n\t{\n\t\tbssid->Configuration.DSConfig = *(p + 2);\n\t}\n\telse\n\t{// In 5G, some ap do not have DSSET IE\n\t\t// checking HT info for channel\n\t\tp = rtw_get_ie(bssid->IEs + ie_offset, _HT_ADD_INFO_IE_, &len, bssid->IELength - ie_offset);\n\t\tif(p)\n\t\t{\n\t\t\tstruct HT_info_element *HT_info = (struct HT_info_element *)(p + 2);\n\t\t\tbssid->Configuration.DSConfig = HT_info->primary_channel;\n\t\t}\n\t\telse\n\t\t{ // use current channel\n\t\t\tbssid->Configuration.DSConfig = rtw_get_oper_ch(padapter);\n\t\t}\n\t}\n\n\t_rtw_memcpy(&bssid->Configuration.BeaconPeriod, rtw_get_beacon_interval_from_ie(bssid->IEs), 2);\n\tbssid->Configuration.BeaconPeriod = le32_to_cpu(bssid->Configuration.BeaconPeriod);\n\n\tval16 = rtw_get_capability((WLAN_BSSID_EX *)bssid);\n\n\tif (val16 & BIT(0))\n\t{\n\t\tbssid->InfrastructureMode = Ndis802_11Infrastructure;\n\t\t_rtw_memcpy(bssid->MacAddress, GetAddr2Ptr(pframe), ETH_ALEN);\n\t}\n\telse\n\t{\n\t\tbssid->InfrastructureMode = Ndis802_11IBSS;\n\t\t_rtw_memcpy(bssid->MacAddress, GetAddr3Ptr(pframe), ETH_ALEN);\n\t}\n\n\tif (val16 & BIT(4))\n\t\tbssid->Privacy = 1;\n\telse\n\t\tbssid->Privacy = 0;\n\n\tbssid->Configuration.ATIMWindow = 0;\n\n\t//20/40 BSS Coexistence check\n\tif((pregistrypriv->wifi_spec==1) && (_FALSE == pmlmeinfo->bwmode_updated))\n\t{\t\n\t\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n#ifdef CONFIG_80211N_HT\n\t\tp = rtw_get_ie(bssid->IEs + ie_offset, _HT_CAPABILITY_IE_, &len, bssid->IELength - ie_offset);\n\t\tif(p && len>0)\n\t\t{\n\t\t\tstruct HT_caps_element\t*pHT_caps;\n\t\t\tpHT_caps = (struct HT_caps_element\t*)(p + 2);\n\t\t\t\n\t\t\tif(pHT_caps->u.HT_cap_element.HT_caps_info&BIT(14))\n\t\t\t{\t\t\t\t\n\t\t\t\tpmlmepriv->num_FortyMHzIntolerant++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpmlmepriv->num_sta_no_ht++;\n\t\t}\n#endif //CONFIG_80211N_HT\n\t\t\n\t}\n\n#ifdef CONFIG_INTEL_WIDI\n\t//process_intel_widi_query_or_tigger(padapter, bssid);\n\tif(process_intel_widi_query_or_tigger(padapter, bssid))\n\t{\n\t\treturn _FAIL;\n\t}\n#endif // CONFIG_INTEL_WIDI\n\n\t#if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) & 1\n\tif(strcmp(bssid->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {\n\t\tDBG_871X(\"Receiving %s(\"MAC_FMT\", DSConfig:%u) from ch%u with ss:%3u, sq:%3u, RawRSSI:%3ld\\n\"\n\t\t\t, bssid->Ssid.Ssid, MAC_ARG(bssid->MacAddress), bssid->Configuration.DSConfig\n\t\t\t, rtw_get_oper_ch(padapter)\n\t\t\t, bssid->PhyInfo.SignalStrength, bssid->PhyInfo.SignalQuality, bssid->Rssi\n\t\t);\n\t}\n\t#endif\n\n\t// mark bss info receving from nearby channel as SignalQuality 101\n\tif(bssid->Configuration.DSConfig != rtw_get_oper_ch(padapter))\n\t{\n\t\tbssid->PhyInfo.SignalQuality= 101;\n\t}\n\n\treturn _SUCCESS;\n}\n\nvoid start_create_ibss(_adapter* padapter)\n{\n\tunsigned short\tcaps;\n\tu8\tval8;\n\tu8\tjoin_type;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\tpmlmeext->cur_channel = (u8)pnetwork->Configuration.DSConfig;\n\tpmlmeinfo->bcn_interval = get_beacon_interval(pnetwork);\n\n\t//update wireless mode\n\tupdate_wireless_mode(padapter);\n\n\t//udpate capability\n\tcaps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork);\n\tupdate_capinfo(padapter, caps);\n\tif(caps&cap_IBSS)//adhoc master\n\t{\n\t\t//set_opmode_cmd(padapter, adhoc);//removed\n\n\t\tval8 = 0xcf;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL);\n\n\t\t//switch channel\n\t\t//SelectChannel(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE);\n\t\tset_channel_bwmode(padapter, pmlmeext->cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\n\t\tbeacon_timing_control(padapter);\n\n\t\t//set msr to WIFI_FW_ADHOC_STATE\n\t\tpmlmeinfo->state = WIFI_FW_ADHOC_STATE;\n\t\tSet_MSR(padapter, (pmlmeinfo->state & 0x3));\n\n\t\t//issue beacon\n\t\tif(send_beacon(padapter)==_FAIL)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,(\"issuing beacon frame fail....\\n\"));\n\n\t\t\treport_join_res(padapter, -1);\n\t\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);\n\t\t\tjoin_type = 0;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\n\t\t\treport_join_res(padapter, 1);\n\t\t\tpmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;\n\t\t\trtw_indicate_connect(padapter);\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"start_create_ibss, invalid cap:%x\\n\", caps);\n\t\treturn;\n\t}\n\t//update bc/mc sta_info\n\tupdate_bmc_sta(padapter);\n\n}\n\nvoid start_clnt_join(_adapter* padapter)\n{\n\tunsigned short\tcaps;\n\tu8\tval8;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\tint beacon_timeout;\n\tu8 ASIX_ID[]= {0x00, 0x0E, 0xC6};\n\n\t//update wireless mode\n\tupdate_wireless_mode(padapter);\n\n\t//udpate capability\n\tcaps = rtw_get_capability((WLAN_BSSID_EX *)pnetwork);\n\tupdate_capinfo(padapter, caps);\n\t\n\t//check if sta is ASIX peer and fix IOT issue if it is.\n\tif (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) {\n\t\tu8 iot_flag = _TRUE;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag));\n\t}\n\t\n\tif (caps&cap_ESS)\n\t{\n\t\tSet_MSR(padapter, WIFI_FW_STATION_STATE);\n\n\t\tval8 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI)\n\t\t{\n\t\t\t//Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey.\n\t\t\tval8 = 0x4c;\n\t\t}\n#endif\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));\n\n\t\t#ifdef CONFIG_DEAUTH_BEFORE_CONNECT\n\t\t// Because of AP's not receiving deauth before\n\t\t// AP may: 1)not response auth or 2)deauth us after link is complete\n\t\t// issue deauth before issuing auth to deal with the situation\n\n\t\t//\tCommented by Albert 2012/07/21\n\t\t//\tFor the Win8 P2P connection, it will be hard to have a successful connection if this Wi-Fi doesn't connect to it.\n\t\t{\n\t\t\t#ifdef CONFIG_P2P\n\t\t\t_queue *queue = &(padapter->mlmepriv.scanned_queue);\n\t\t\t_list\t*head = get_list_head(queue);\n\t\t\t_list *pos = get_next(head);\n\t\t\tstruct wlan_network *scanned = NULL;\n\t\t\tu8 ie_offset = 0;\n\t\t\t_irqL irqL;\n\t\t\tbool has_p2p_ie = _FALSE;\n\n\t\t\t_enter_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL);\n\n\t\t\tfor (pos = get_next(head);!rtw_end_of_queue_search(head, pos); pos = get_next(pos)) {\n\t\t\t\t\n\t\t\t\tscanned = LIST_CONTAINOR(pos, struct wlan_network, list);\n\n\t\t\t\tif (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE\n\t\t\t\t\t&& _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE\n\t\t\t\t) {\n\t\t\t\t\tie_offset = (scanned->network.Reserved[0] == 2? 0:12);\n\t\t\t\t\tif (rtw_get_p2p_ie(scanned->network.IEs+ie_offset, scanned->network.IELength-ie_offset, NULL, NULL))\n\t\t\t\t\t\thas_p2p_ie = _TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t_exit_critical_bh(&(padapter->mlmepriv.scanned_queue.lock), &irqL);\n\n\t\t\tif (scanned == NULL || rtw_end_of_queue_search(head, pos) || has_p2p_ie == _FALSE)\n\t\t\t#endif /* CONFIG_P2P */\n\t\t\t\t//To avoid connecting to AP fail during resume process, change retry count from 5 to 1\n\t\t\t\tissue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100);\n\t\t}\n\t\t#endif /* CONFIG_DEAUTH_BEFORE_CONNECT */\n\n\t\t//here wait for receiving the beacon to start auth\n\t\t//and enable a timer\n\t\tbeacon_timeout = decide_wait_for_beacon_timeout(pmlmeinfo->bcn_interval);\n\t\tset_link_timer(pmlmeext, beacon_timeout);\t\n\t\t_set_timer( &padapter->mlmepriv.assoc_timer, \n\t\t\t(REAUTH_TO * REAUTH_LIMIT) + (REASSOC_TO*REASSOC_LIMIT) +beacon_timeout);\n\t\t\n\t\tpmlmeinfo->state = WIFI_FW_AUTH_NULL | WIFI_FW_STATION_STATE;\n\t}\n\telse if (caps&cap_IBSS) //adhoc client\n\t{\n\t\tSet_MSR(padapter, WIFI_FW_ADHOC_STATE);\n\n\t\tval8 = 0xcf;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));\n\n\t\tbeacon_timing_control(padapter);\n\n\t\tpmlmeinfo->state = WIFI_FW_ADHOC_STATE;\n\n\t\treport_join_res(padapter, 1);\n\t}\n\telse\n\t{\n\t\t//DBG_871X(\"marc: invalid cap:%x\\n\", caps);\n\t\treturn;\n\t}\n\n}\n\nvoid start_clnt_auth(_adapter* padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t_cancel_timer_ex(&pmlmeext->link_timer);\n\n\tpmlmeinfo->state &= (~WIFI_FW_AUTH_NULL);\n\tpmlmeinfo->state |= WIFI_FW_AUTH_STATE;\n\n\tpmlmeinfo->auth_seq = 1;\n\tpmlmeinfo->reauth_count = 0;\n\tpmlmeinfo->reassoc_count = 0;\n\tpmlmeinfo->link_count = 0;\n\tpmlmeext->retry = 0;\n\n\n\tDBG_871X_LEVEL(_drv_always_, \"start auth\\n\");\n\tissue_auth(padapter, NULL, 0);\n\n\tset_link_timer(pmlmeext, REAUTH_TO);\n\n}\n\n\nvoid start_clnt_assoc(_adapter* padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t_cancel_timer_ex(&pmlmeext->link_timer);\n\n\tpmlmeinfo->state &= (~(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE));\n\tpmlmeinfo->state |= (WIFI_FW_AUTH_SUCCESS | WIFI_FW_ASSOC_STATE);\n\n\tissue_assocreq(padapter);\n\n\tset_link_timer(pmlmeext, REASSOC_TO);\n}\n\nunsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))\n\t\treturn _SUCCESS;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)\n\t{\n\t\tif (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\t{\n\t\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\t\treport_del_sta_event(padapter, MacAddr, reason, _TRUE);\n\n\t\t}\n\t\telse if (pmlmeinfo->state & WIFI_FW_LINKING_STATE)\n\t\t{\n\t\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\t\treport_join_res(padapter, -2);\n\t\t} else\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" - End to Disconnect\\n\", FUNC_ADPT_ARG(padapter));\n\t}\n\n\treturn _SUCCESS;\n}\n\n#ifdef CONFIG_80211D\nstatic void process_80211d(PADAPTER padapter, WLAN_BSSID_EX *bssid)\n{\n\tstruct registry_priv *pregistrypriv;\n\tstruct mlme_ext_priv *pmlmeext;\n\tRT_CHANNEL_INFO *chplan_new;\n\tu8 channel;\n\tu8 i;\n\n\n\tpregistrypriv = &padapter->registrypriv;\n\tpmlmeext = &padapter->mlmeextpriv;\n\n\t// Adjust channel plan by AP Country IE\n\tif (pregistrypriv->enable80211d &&\n\t\t(!pmlmeext->update_channel_plan_by_ap_done))\n\t{\n\t\tu8 *ie, *p;\n\t\tu32 len;\n\t\tRT_CHANNEL_PLAN chplan_ap;\n\t\tRT_CHANNEL_INFO chplan_sta[MAX_CHANNEL_NUM];\n\t\tu8 country[4];\n\t\tu8 fcn; // first channel number\n\t\tu8 noc; // number of channel\n\t\tu8 j, k;\n\n\t\tie = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _COUNTRY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);\n\t\tif (!ie) return;\n\t\tif (len < 6) return;\n\n\t\tie += 2;\n\t\tp = ie;\n\t\tie += len;\n\n\t\t_rtw_memset(country, 0, 4);\n\t\t_rtw_memcpy(country, p, 3);\n\t\tp += 3;\n\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,\n\t\t\t\t(\"%s: 802.11d country=%s\\n\", __FUNCTION__, country));\n\n\t\ti = 0;\n\t\twhile ((ie - p) >= 3)\n\t\t{\n\t\t\tfcn = *(p++);\n\t\t\tnoc = *(p++);\n\t\t\tp++;\n\n\t\t\tfor (j = 0; j < noc; j++)\n\t\t\t{\n\t\t\t\tif (fcn <= 14) channel = fcn + j; // 2.4 GHz\n\t\t\t\telse channel = fcn + j*4; // 5 GHz\n\n\t\t\t\tchplan_ap.Channel[i++] = channel;\n\t\t\t}\n\t\t}\n\t\tchplan_ap.Len = i;\n\n#ifdef CONFIG_DEBUG_RTL871X\n\t\ti = 0;\n\t\tDBG_871X(\"%s: AP[%s] channel plan {\", __FUNCTION__, bssid->Ssid.Ssid);\n\t\twhile ((i < chplan_ap.Len) && (chplan_ap.Channel[i] != 0))\n\t\t{\n\t\t\tDBG_8192C(\"%02d,\", chplan_ap.Channel[i]);\n\t\t\ti++;\n\t\t}\n\t\tDBG_871X(\"}\\n\");\n#endif\n\n\t\t_rtw_memcpy(chplan_sta, pmlmeext->channel_set, sizeof(chplan_sta));\n#ifdef CONFIG_DEBUG_RTL871X\n\t\ti = 0;\n\t\tDBG_871X(\"%s: STA channel plan {\", __FUNCTION__);\n\t\twhile ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))\n\t\t{\n\t\t\tDBG_871X(\"%02d(%c),\", chplan_sta[i].ChannelNum, chplan_sta[i].ScanType==SCAN_PASSIVE?'p':'a');\n\t\t\ti++;\n\t\t}\n\t\tDBG_871X(\"}\\n\");\n#endif\n\n\t\t_rtw_memset(pmlmeext->channel_set, 0, sizeof(pmlmeext->channel_set));\n\t\tchplan_new = pmlmeext->channel_set;\n\n\t\ti = j = k = 0;\n\t\tif (pregistrypriv->wireless_mode & WIRELESS_11G)\n\t\t{\n\t\t\tdo {\n\t\t\t\tif ((i == MAX_CHANNEL_NUM) ||\n\t\t\t\t\t(chplan_sta[i].ChannelNum == 0) ||\n\t\t\t\t\t(chplan_sta[i].ChannelNum > 14))\n\t\t\t\t\tbreak;\n\n\t\t\t\tif ((j == chplan_ap.Len) || (chplan_ap.Channel[j] > 14))\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (chplan_sta[i].ChannelNum == chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\t\ti++;\n\t\t\t\t\tj++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t\telse if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n//\t\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_PASSIVE;\n\t\t\t\t\ti++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t\telse if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\t\tj++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t} while (1);\n\n\t\t\t// change AP not support channel to Passive scan\n\t\t\twhile ((i < MAX_CHANNEL_NUM) &&\n\t\t\t\t(chplan_sta[i].ChannelNum != 0) &&\n\t\t\t\t(chplan_sta[i].ChannelNum <= 14))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n//\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\tchplan_new[k].ScanType = SCAN_PASSIVE;\n\t\t\t\ti++;\n\t\t\t\tk++;\n\t\t\t}\n\n\t\t\t// add channel AP supported\n\t\t\twhile ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\tj++;\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep original STA 2.4G channel plan\n\t\t\twhile ((i < MAX_CHANNEL_NUM) &&\n\t\t\t\t(chplan_sta[i].ChannelNum != 0) &&\n\t\t\t\t(chplan_sta[i].ChannelNum <= 14))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\ti++;\n\t\t\t\tk++;\n\t\t\t}\n\n\t\t\t// skip AP 2.4G channel plan\n\t\t\twhile ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14))\n\t\t\t{\n\t\t\t\tj++;\n\t\t\t}\n\t\t}\n\n\t\tif (pregistrypriv->wireless_mode & WIRELESS_11A)\n\t\t{\n\t\t\tdo {\n\t\t\t\tif ((i >= MAX_CHANNEL_NUM) ||\n\t\t\t\t\t(chplan_sta[i].ChannelNum == 0))\n\t\t\t\t\tbreak;\n\n\t\t\t\tif ((j == chplan_ap.Len) || (chplan_ap.Channel[j] == 0))\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (chplan_sta[i].ChannelNum == chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\t\ti++;\n\t\t\t\t\tj++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t\telse if (chplan_sta[i].ChannelNum < chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n//\t\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_PASSIVE;\n\t\t\t\t\ti++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t\telse if (chplan_sta[i].ChannelNum > chplan_ap.Channel[j])\n\t\t\t\t{\n\t\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\t\tj++;\n\t\t\t\t\tk++;\n\t\t\t\t}\n\t\t\t} while (1);\n\n\t\t\t// change AP not support channel to Passive scan\n\t\t\twhile ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n//\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\tchplan_new[k].ScanType = SCAN_PASSIVE;\n\t\t\t\ti++;\n\t\t\t\tk++;\n\t\t\t}\n\n\t\t\t// add channel AP supported\n\t\t\twhile ((j < chplan_ap.Len) && (chplan_ap.Channel[j] != 0))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_ap.Channel[j];\n\t\t\t\tchplan_new[k].ScanType = SCAN_ACTIVE;\n\t\t\t\tj++;\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep original STA 5G channel plan\n\t\t\twhile ((i < MAX_CHANNEL_NUM) && (chplan_sta[i].ChannelNum != 0))\n\t\t\t{\n\t\t\t\tchplan_new[k].ChannelNum = chplan_sta[i].ChannelNum;\n\t\t\t\tchplan_new[k].ScanType = chplan_sta[i].ScanType;\n\t\t\t\ti++;\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\n\t\tpmlmeext->update_channel_plan_by_ap_done = 1;\n\n#ifdef CONFIG_DEBUG_RTL871X\n\t\tk = 0;\n\t\tDBG_871X(\"%s: new STA channel plan {\", __FUNCTION__);\n\t\twhile ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0))\n\t\t{\n\t\t\tDBG_871X(\"%02d(%c),\", chplan_new[k].ChannelNum, chplan_new[k].ScanType==SCAN_PASSIVE?'p':'c');\n\t\t\tk++;\n\t\t}\n\t\tDBG_871X(\"}\\n\");\n#endif\n\n#if 0\n\t\t// recover the right channel index\n\t\tchannel = chplan_sta[pmlmeext->sitesurvey_res.channel_idx].ChannelNum;\n\t\tk = 0;\n\t\twhile ((k < MAX_CHANNEL_NUM) && (chplan_new[k].ChannelNum != 0))\n\t\t{\n\t\t\tif (chplan_new[k].ChannelNum == channel) {\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,\n\t\t\t\t\t\t (\"%s: change mlme_ext sitesurvey channel index from %d to %d\\n\",\n\t\t\t\t\t\t  __FUNCTION__, pmlmeext->sitesurvey_res.channel_idx, k));\n\t\t\t\tpmlmeext->sitesurvey_res.channel_idx = k;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tk++;\n\t\t}\n#endif\n\t}\n\n\t// If channel is used by AP, set channel scan type to active\n\tchannel = bssid->Configuration.DSConfig;\n\tchplan_new = pmlmeext->channel_set;\n\ti = 0;\n\twhile ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0))\n\t{\n\t\tif (chplan_new[i].ChannelNum == channel)\n\t\t{\n\t\t\tif (chplan_new[i].ScanType == SCAN_PASSIVE)\n\t\t\t{\n\t\t\t\t//5G Bnad 2, 3 (DFS) doesn't change to active scan\n\t\t\t\tif(channel >= 52 && channel <= 144)\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tchplan_new[i].ScanType = SCAN_ACTIVE;\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_,\n\t\t\t\t\t\t (\"%s: change channel %d scan type from passive to active\\n\",\n\t\t\t\t\t\t  __FUNCTION__, channel));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\ti++;\n\t}\n}\n#endif\n\n/****************************************************************************\n\nFollowing are the functions to report events\n\n*****************************************************************************/\n\nvoid report_survey_event(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct survey_event\t*psurvey_evt;\n\tstruct C2HEvent_Header *pc2h_evt_hdr;\n\tstruct mlme_ext_priv *pmlmeext;\n\tstruct cmd_priv *pcmdpriv;\n\t//u8 *pframe = precv_frame->u.hdr.rx_data;\n\t//uint len = precv_frame->u.hdr.len;\n\n\tif(!padapter)\n\t\treturn;\n\n\tpmlmeext = &padapter->mlmeextpriv;\n\tpcmdpriv = &padapter->cmdpriv;\n\t\n\n\tif ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tcmdsz = (sizeof(struct survey_event) + sizeof(struct C2HEvent_Header));\n\tif ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct survey_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_Survey);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpsurvey_evt = (struct survey_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\n\tif (collect_bss_info(padapter, precv_frame, (WLAN_BSSID_EX *)&psurvey_evt->bss) == _FAIL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\trtw_mfree((u8 *)pevtcmd, cmdsz);\n\t\treturn;\n\t}\n\n#ifdef CONFIG_80211D\n\tprocess_80211d(padapter, &psurvey_evt->bss);\n#endif\n\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\tpmlmeext->sitesurvey_res.bss_cnt++;\n\n\treturn;\n\n}\n\nvoid report_surveydone_event(_adapter *padapter)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct surveydone_event *psurveydone_evt;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\n\tif ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tcmdsz = (sizeof(struct surveydone_event) + sizeof(struct C2HEvent_Header));\n\tif ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct surveydone_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_SurveyDone);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpsurveydone_evt = (struct surveydone_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\tpsurveydone_evt->bss_cnt = pmlmeext->sitesurvey_res.bss_cnt;\n\n\tDBG_871X(\"survey done event(%x) band:%d for \"ADPT_FMT\"\\n\", psurveydone_evt->bss_cnt, padapter->setband, ADPT_ARG(padapter));\n\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\treturn;\n\n}\n\nvoid report_join_res(_adapter *padapter, int res)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct joinbss_event\t\t*pjoinbss_evt;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\n\tif ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tcmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header));\n\tif ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct joinbss_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_JoinBss);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpjoinbss_evt = (struct joinbss_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\t_rtw_memcpy((unsigned char *)(&(pjoinbss_evt->network.network)), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));\n\tpjoinbss_evt->network.join_res \t= pjoinbss_evt->network.aid = res;\n\n\tDBG_871X(\"report_join_res(%d)\\n\", res);\n\t\n\t\n\trtw_joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network);\n\t\n\t\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\treturn;\n\n}\n\nvoid report_wmm_edca_update(_adapter *padapter)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct wmm_event\t\t*pwmm_event;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\n\tif ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tcmdsz = (sizeof(struct wmm_event) + sizeof(struct C2HEvent_Header));\n\tif ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct wmm_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_WMM);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpwmm_event = (struct wmm_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\tpwmm_event->wmm =0;\n\t\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\treturn;\n\n}\n\nvoid report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct sta_info *psta;\n\tint\tmac_id = -1;\n\tstruct stadel_event\t\t\t*pdel_sta_evt;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\tu8 res = _SUCCESS;\n\n\t/* prepare cmd parameter */\n\tcmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header));\n\tpevtcmd = (u8 *)rtw_zmalloc(cmdsz);\n\tif (pevtcmd == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct stadel_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_DelSTA);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpdel_sta_evt = (struct stadel_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\t_rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN);\n\t_rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd),(unsigned char *)(&reason),2);\n\tpsta = rtw_get_stainfo(&padapter->stapriv, MacAddr);\n\tif(psta)\n\t\tmac_id = (int)psta->mac_id;\t\n\telse\n\t\tmac_id = (-1);\n\tpdel_sta_evt->mac_id = mac_id;\n\n\tif (!enqueue) {\n\t\t/* do directly */\n\t\trtw_stadel_event_callback(padapter, (u8 *)pdel_sta_evt);\n\t\trtw_mfree(pevtcmd, cmdsz);\n\t} else {\n\t\tpcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));\n\t\tif (pcmd_obj == NULL) {\n\t\t\trtw_mfree(pevtcmd, cmdsz);\n\t\t\tres = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t_rtw_init_listhead(&pcmd_obj->list);\n\t\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\t\tpcmd_obj->cmdsz = cmdsz;\n\t\tpcmd_obj->parmbuf = pevtcmd;\n\n\t\tpcmd_obj->rsp = NULL;\n\t\tpcmd_obj->rspsz  = 0;\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\t}\n\nexit:\n\n\tDBG_871X(FUNC_ADPT_FMT\" \"MAC_FMT\" mac_id=%d, enqueue:%d, res:%u\\n\"\n\t\t, FUNC_ADPT_ARG(padapter), MAC_ARG(MacAddr), mac_id, enqueue, res);\n\n\treturn;\n}\n\nvoid report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct stassoc_event\t\t*padd_sta_evt;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\n\tif ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tcmdsz = (sizeof(struct stassoc_event) + sizeof(struct C2HEvent_Header));\n\tif ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)\n\t{\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct stassoc_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_AddSTA);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpadd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header));\n\t_rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN);\n\tpadd_sta_evt->cam_id = cam_idx;\n\n\tDBG_871X(\"report_add_sta_event: add STA\\n\");\n\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\treturn;\n}\n\n\nbool rtw_port_switch_chk(_adapter *adapter)\n{\n\tbool switch_needed = _FALSE;\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_RUNTIME_PORT_SWITCH\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(dvobj);\n\t_adapter *if_port0 = NULL;\n\t_adapter *if_port1 = NULL;\n\tstruct mlme_ext_info *if_port0_mlmeinfo = NULL;\n\tstruct mlme_ext_info *if_port1_mlmeinfo = NULL;\n\tint i;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tif (get_iface_type(dvobj->padapters[i]) == IFACE_PORT0) {\n\t\t\tif_port0 = dvobj->padapters[i];\n\t\t\tif_port0_mlmeinfo = &(if_port0->mlmeextpriv.mlmext_info);\n\t\t}\n\t\telse if (get_iface_type(dvobj->padapters[i]) == IFACE_PORT1) {\n\t\t\tif_port1 = dvobj->padapters[i];\n\t\t\tif_port1_mlmeinfo = &(if_port1->mlmeextpriv.mlmext_info);\n\t\t}\n\t}\n\n\tif (if_port0 == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (if_port1 == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n#ifdef DBG_RUNTIME_PORT_SWITCH\n\tDBG_871X(FUNC_ADPT_FMT\" wowlan_mode:%u\\n\"\n\t\tADPT_FMT\", port0, mlmeinfo->state:0x%08x, p2p_state:%d, %d\\n\"\n\t\tADPT_FMT\", port1, mlmeinfo->state:0x%08x, p2p_state:%d, %d\\n\",\n\t\tFUNC_ADPT_ARG(adapter), pwrctl->wowlan_mode,\n\t\tADPT_ARG(if_port0), if_port0_mlmeinfo->state, rtw_p2p_state(&if_port0->wdinfo), rtw_p2p_chk_state(&if_port0->wdinfo, P2P_STATE_NONE),\n\t\tADPT_ARG(if_port1), if_port1_mlmeinfo->state, rtw_p2p_state(&if_port1->wdinfo), rtw_p2p_chk_state(&if_port1->wdinfo, P2P_STATE_NONE));\n#endif /* DBG_RUNTIME_PORT_SWITCH */\n\n#ifdef CONFIG_WOWLAN\n\t/* WOWLAN interface(primary, for now) should be port0 */\n\tif (pwrctl->wowlan_mode == _TRUE) {\n\t\tif(!is_primary_adapter(if_port0)) {\n\t\t\tDBG_871X(\"%s \"ADPT_FMT\" enable WOWLAN\\n\", __func__, ADPT_ARG(if_port1));\n\t\t\tswitch_needed = _TRUE;\n\t\t}\n\t\tgoto exit;\n\t}\n#endif /* CONFIG_WOWLAN */\n\n\t/* AP should use port0 for ctl frame's ack */\n\tif ((if_port1_mlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) {\n\t\tDBG_871X(\"%s \"ADPT_FMT\" is AP/GO\\n\", __func__, ADPT_ARG(if_port1));\n\t\tswitch_needed = _TRUE;\n\t\tgoto exit;\n\t}\n\n\t/* GC should use port0 for p2p ps */\t\n\tif (((if_port1_mlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE)\n\t\t&& (if_port1_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\t&& !rtw_p2p_chk_state(&if_port1->wdinfo, P2P_STATE_NONE)\n\t\t&& !check_fwstate(&if_port1->mlmepriv, WIFI_UNDER_WPS)\n\t) {\n\t\tDBG_871X(\"%s \"ADPT_FMT\" is GC\\n\", __func__, ADPT_ARG(if_port1));\n\t\tswitch_needed = _TRUE;\n\t\tgoto exit;\n\t}\n\n\t/* port1 linked, but port0 not linked */\n\tif ((if_port1_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\t&& !(if_port0_mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t\t&& ((if_port0_mlmeinfo->state & 0x03) != WIFI_FW_AP_STATE)\n\t) {\n\t\tDBG_871X(\"%s \"ADPT_FMT\" is SINGLE_LINK\\n\", __func__, ADPT_ARG(if_port1));\n\t\tswitch_needed = _TRUE;\n\t\tgoto exit;\n\t}\n\nexit:\n#ifdef DBG_RUNTIME_PORT_SWITCH\n\tDBG_871X(FUNC_ADPT_FMT\" ret:%d\\n\", FUNC_ADPT_ARG(adapter), switch_needed);\n#endif /* DBG_RUNTIME_PORT_SWITCH */\n#endif /* CONFIG_RUNTIME_PORT_SWITCH */\n#endif /* CONFIG_CONCURRENT_MODE */\n\treturn switch_needed;\n}\n\n/****************************************************************************\n\nFollowing are the event callback functions\n\n*****************************************************************************/\n\n//for sta/adhoc mode\nvoid update_sta_info(_adapter *padapter, struct sta_info *psta)\n{\n\t_irqL\tirqL;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//ERP\n\tVCS_update(padapter, psta);\n\n#ifdef CONFIG_80211N_HT\n\t//HT\n\tif(pmlmepriv->htpriv.ht_option)\n\t{\n\t\tpsta->htpriv.ht_option = _TRUE;\n\n\t\tpsta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable;\n\n\t\tpsta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;\n\n\t\tif (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_20))\n\t\t\tpsta->htpriv.sgi_20m = _TRUE;\n\n\t\tif (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_40))\n\t\t\tpsta->htpriv.sgi_40m = _TRUE;\n\n\t\tpsta->qos_option = _TRUE;\n\n\t\tpsta->htpriv.ldpc_cap = pmlmepriv->htpriv.ldpc_cap;\n\t\tpsta->htpriv.stbc_cap = pmlmepriv->htpriv.stbc_cap;\n\t\tpsta->htpriv.beamform_cap = pmlmepriv->htpriv.beamform_cap;\n\n\t\t_rtw_memcpy(&psta->htpriv.ht_cap, &pmlmeinfo->HT_caps, sizeof(struct rtw_ieee80211_ht_cap));\n\t}\n\telse\n#endif //CONFIG_80211N_HT\n\t{\n#ifdef CONFIG_80211N_HT\n\t\tpsta->htpriv.ht_option = _FALSE;\n\n\t\tpsta->htpriv.ampdu_enable = _FALSE;\n\t\t\n\t\tpsta->htpriv.sgi_20m = _FALSE;\n\t\tpsta->htpriv.sgi_40m = _FALSE;\n#endif //CONFIG_80211N_HT\n\t\tpsta->qos_option = _FALSE;\n\n\t}\n\n#ifdef CONFIG_80211N_HT\n\tpsta->htpriv.ch_offset = pmlmeext->cur_ch_offset;\n\t\n\tpsta->htpriv.agg_enable_bitmap = 0x0;//reset\n\tpsta->htpriv.candidate_tid_bitmap = 0x0;//reset\n#endif //CONFIG_80211N_HT\n\n\tpsta->bw_mode = pmlmeext->cur_bwmode;\n\n\t//QoS\n\tif(pmlmepriv->qospriv.qos_option)\n\t\tpsta->qos_option = _TRUE;\n\n#ifdef CONFIG_80211AC_VHT\n\t_rtw_memcpy(&psta->vhtpriv, &pmlmepriv->vhtpriv, sizeof(struct vht_priv));\n#endif //CONFIG_80211AC_VHT\n\n\tupdate_ldpc_stbc_cap(psta);\n\n\t_enter_critical_bh(&psta->lock, &irqL);\n\tpsta->state = _FW_LINKED;\n\t_exit_critical_bh(&psta->lock, &irqL);\n\n}\n\nstatic void rtw_mlmeext_disconnect(_adapter *padapter)\n{\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\tu8 state_backup = (pmlmeinfo->state&0x03);\n\tu8 ASIX_ID[]= {0x00, 0x0E, 0xC6};\n\n\t//set_opmode_cmd(padapter, infra_client_with_mlme);\n\n#if 1\n\t/*\n\t * For safety, prevent from keeping macid sleep.\n\t * If we can sure all power mode enter/leave are paired,\n\t * this check can be removed.\n\t * Lucas@20131113\n\t */\n\t/* wakeup macid after disconnect. */\n\t{\n\t\tstruct sta_info *psta;\n\t\tpsta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));\n\t\tif (psta)\n\t\t\trtw_hal_macid_wakeup(padapter, psta->mac_id);\n\t}\n#endif\t\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);\n\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);\n\n\t//set MSR to no link state -> infra. mode\n\tSet_MSR(padapter, _HW_STATE_STATION_);\n\n\t//check if sta is ASIX peer and fix IOT issue if it is.\n\tif (_rtw_memcmp(get_my_bssid(&pmlmeinfo->network) ,ASIX_ID ,3)) {\n\t\tu8 iot_flag = _FALSE;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_ASIX_IOT, (u8 *)(&iot_flag));\n\t}\n\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\n\tif(state_backup == WIFI_FW_STATION_STATE)\n\t{\n\t\tif (rtw_port_switch_chk(padapter) == _TRUE) {\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);\n\t\t\t#ifdef CONFIG_LPS\n\t\t\t{\n\t\t\t\t_adapter *port0_iface = dvobj_get_port0_adapter(adapter_to_dvobj(padapter));\n\t\t\t\tif (port0_iface)\n\t\t\t\t\trtw_lps_ctrl_wk_cmd(port0_iface, LPS_CTRL_CONNECT, 0);\n\t\t\t}\n\t\t\t#endif\n\t\t}\n\t}\n\n\t/* switch to the 20M Hz mode after disconnect */\n\tpmlmeext->cur_bwmode = CHANNEL_WIDTH_20;\n\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n#ifdef CONFIG_FCS_MODE\n\tif (EN_FCS(padapter))\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_STOP_FCS_MODE, NULL);\n#endif\n\n#ifdef CONFIG_DFS_MASTER\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\trtw_dfs_master_status_apply(padapter, MLME_AP_STOPPED);\n\telse if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))\n\t\trtw_dfs_master_status_apply(padapter, MLME_STA_DISCONNECTED);\n#endif\n\n\t{\n\t\tu8 ch, bw, offset;\n\n\t\tif (rtw_get_ch_setting_union_no_self(padapter, &ch, &bw, &offset) != 0)\n\t\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t}\n\n\tflush_all_cam_entry(padapter);\n\n\t_cancel_timer_ex(&pmlmeext->link_timer);\n\n\t//pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE;\n\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;\n\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;\n\n#ifdef CONFIG_TDLS\n\tpadapter->tdlsinfo.ap_prohibited = _FALSE;\n\n\t/* For TDLS channel switch, currently we only allow it to work in wifi logo test mode */\n\tif (padapter->registrypriv.wifi_spec == 1)\n\t{\n\t\tpadapter->tdlsinfo.ch_switch_prohibited = _FALSE;\n\t}\n#endif /* CONFIG_TDLS */\n\n}\n\nvoid mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)\n{\n\tstruct sta_info\t\t*psta, *psta_bmc;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tu8\tjoin_type;\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n#endif\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\n\tif(join_res < 0)\n\t{\n\t\tjoin_type = 1;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);\n\n\t\tgoto exit_mlmeext_joinbss_event_callback;\n\t}\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\tpmlmepriv->bGetGateway = 1;\n#endif\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\t//update bc/mc sta_info\n\t\tupdate_bmc_sta(padapter);\n\t}\n\n\n\t//turn on dynamic functions\n\t/* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, _TRUE); */\n\n\t// update IOT-releated issue\n\tupdate_IOT_info(padapter);\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates);\n\n\t//BCN interval\n\trtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&pmlmeinfo->bcn_interval));\n\n\t//udpate capability\n\tupdate_capinfo(padapter, pmlmeinfo->capability);\n\n\t//WMM, Update EDCA param\n\tWMMOnAssocRsp(padapter);\n\n\t//HT\n\tHTOnAssocRsp(padapter);\n\n#ifdef CONFIG_80211AC_VHT\n\t//VHT\n\tVHTOnAssocRsp(padapter);\n#endif\n\n\tpsta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);\n\tif (psta) //only for infra. mode\n\t{\n\t\tpmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;\n\n\t\t//DBG_871X(\"set_sta_rate\\n\");\n\n\t\tpsta->wireless_mode = pmlmeext->cur_wireless_mode;\n\t\n\t\t//set per sta rate after updating HT cap.\n\t\tset_sta_rate(padapter, psta);\n\t\t\n\t\trtw_sta_media_status_rpt(padapter, psta, 1);\n\n\t\t/* wakeup macid after join bss successfully to ensure \n\t\t\tthe subsequent data frames can be sent out normally */\n\t\trtw_hal_macid_wakeup(padapter, psta->mac_id);\n\t}\n\n#ifndef CONFIG_IOCTL_CFG80211\n\tif (is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm))\n\t\trtw_sec_restore_wep_key(padapter);\n#endif /* CONFIG_IOCTL_CFG80211 */\n\n\tif (rtw_port_switch_chk(padapter) == _TRUE)\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);\n\n\tjoin_type = 2;\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)\n\t{\n\t\t// correcting TSF\n\t\tcorrect_TSF(padapter, pmlmeext);\n\t\n\t\t//set_link_timer(pmlmeext, DISCONNECT_TO);\n\t}\n\n#ifdef CONFIG_LPS\n\tif(get_iface_type(padapter) == IFACE_PORT0)\n\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0);\n#endif\n\n#ifdef CONFIG_BEAMFORMING\n\tif (psta)\n\t\tbeamforming_wk_cmd(padapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);\n#endif/*CONFIG_BEAMFORMING*/\n\nexit_mlmeext_joinbss_event_callback:\n\n\trtw_join_done_chk_ch(padapter, join_res);\n\n\tDBG_871X(\"=>%s - End to Connection without 4-way\\n\", __FUNCTION__);\n}\n\n//currently only adhoc mode will go here\nvoid mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tjoin_type;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\tif(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)//adhoc master or sta_count>1\n\t\t{\n\t\t\t//nothing to do\n\t\t}\n\t\telse//adhoc client\n\t\t{\n\t\t\t//update TSF Value\n\t\t\t//update_TSF(pmlmeext, pframe, len);\t\t\t\n\n\t\t\t// correcting TSF\n\t\t\tcorrect_TSF(padapter, pmlmeext);\n\n\t\t\t//start beacon\n\t\t\tif(send_beacon(padapter)==_FAIL)\n\t\t\t{\n\t\t\t\tpmlmeinfo->FW_sta_info[psta->mac_id].status = 0;\n\n\t\t\t\tpmlmeinfo->state ^= WIFI_FW_ADHOC_STATE;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tpmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;\n\t\t\t\t\n\t\t}\n\n\t\tjoin_type = 2;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\t}\n\n\tpmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;\n\n\tpsta->bssratelen = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates);\n\t_rtw_memcpy(psta->bssrateset, pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates, psta->bssratelen);\n\n\t//update adhoc sta_info\n\tupdate_sta_info(padapter, psta);\n\n\trtw_hal_update_sta_rate_mask(padapter, psta);\n\n\t// ToDo: HT for Ad-hoc \n\tpsta->wireless_mode = rtw_check_network_type(psta->bssrateset, psta->bssratelen, pmlmeext->cur_channel);\n\tpsta->raid = rtw_hal_networktype_to_raid(padapter, psta);\n\n\t//rate radaptive\n\tUpdate_RA_Entry(padapter, psta);\n}\n\nvoid mlmeext_sta_del_event_callback(_adapter *padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter))\n\t{\n\t\trtw_mlmeext_disconnect(padapter);\n\t}\n\n}\n\n/****************************************************************************\n\nFollowing are the functions for the timer handlers\n\n*****************************************************************************/\nvoid _linked_info_dump(_adapter *padapter)\n{\n\tint i;\n\tstruct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint UndecoratedSmoothedPWDB = 0;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\t\n\tif(padapter->bLinkInfoDump){\n\n\t\tDBG_871X(\"\\n============[\"ADPT_FMT\"] linked status check ===================\\n\",ADPT_ARG(padapter));\t\n\n\t\tif((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE)\n\t\t{\n\t\t\trtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);\t\n\t\t\n\t\t\tDBG_871X(\"AP[\" MAC_FMT \"] - UndecoratedSmoothedPWDB:%d\\n\",\n\t\t\t\tMAC_ARG(padapter->mlmepriv.cur_network.network.MacAddress),UndecoratedSmoothedPWDB);\n\t\t}\n\t\telse if((pmlmeinfo->state&0x03) == _HW_STATE_AP_)\n\t\t{\n\t\t\t_irqL irqL;\n\t\t\t_list\t*phead, *plist;\n\t\n\t\t\tstruct sta_info *psta=NULL;\t\n\t\t\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\t\t\n\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\t\n\t\t\tphead = &pstapriv->asoc_list;\n\t\t\tplist = get_next(phead);\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t{\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\t\tplist = get_next(plist);\t\t\t\n\t\t\t\t\n\t\t\t\tDBG_871X(\"STA[\" MAC_FMT \"]:UndecoratedSmoothedPWDB:%d\\n\", \n\t\t\t\t\tMAC_ARG(psta->hwaddr),psta->rssi_stat.UndecoratedSmoothedPWDB);\n\t\t\t}\n\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\t\t\n\t\t\t\n\t\t}\n\t\tfor(i=0; i<macid_ctl->num; i++)\n\t\t{\n\t\t\tif(rtw_macid_is_used(macid_ctl, i) \n\t\t\t\t&& !rtw_macid_is_bmc(macid_ctl, i) /* skip bc/mc sta */\n\t\t\t) {\n\t\t\t\t//============  tx info ============\t\n\t\t\t\trtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i);\t\t\t\n\t\t\t}\n\t\t}\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, NULL, _FALSE);\n\t\t\n\t}\n\t      \n\n}\nvoid rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer)\n{\n\tint\ti = 0;\n\tint ret = _SUCCESS;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t/*\n\t\tIOT issue,occur Broadcom ap(Buffalo WZR-D1800H,Netgear R6300).\n\t\tAP is originator.AP does not transmit unicast packets when STA response its BAR.\n\t\tThis case probably occur ap issue BAR after AP builds BA. \n\t\t\t\t\n\t\tFollow 802.11 spec, STA shall maintain an inactivity timer for every negotiated Block Ack setup.\n\t\tThe inactivity timer is not reset when MPDUs corresponding to other TIDs are received.\n\t*/\n\tif (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM) {\n\t\tfor (i = 0; i < TID_NUM ; i++) {\t\t\t\t\n\t\t\tif (sta_rx_data_qos_pkts(psta, i) == sta_last_rx_data_qos_pkts(psta, i)) {\t\t\t\n\t\t\t\tif (_TRUE == rtw_inc_and_chk_continual_no_rx_packet(psta, i)) {\n\t\t\t\t\tif (psta->recvreorder_ctrl[i].enable) {\t\t\t\t\t\t\n\t\t\t\t\t\t/* send a DELBA frame to the peer STA with the Reason Code field set to TIMEOUT */\t\t\n\t\t\t\t\t\tif (!from_timer)\n\t\t\t\t\t\t\tret = issue_del_ba_ex(padapter, psta->hwaddr, i, 39, 0, 3, 1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tissue_del_ba(padapter,  psta->hwaddr, i, 39, 0);\t\t\t\t\t\t\t\n\t\t\t\t\t\tpsta->recvreorder_ctrl[i].enable = _FALSE;\n\t\t\t\t\t\tif (ret != _FAIL)\n\t\t\t\t\t\t\tpsta->recvreorder_ctrl[i].ampdu_size = RX_AMPDU_SIZE_INVALID;\n\t\t\t\t\t\trtw_reset_continual_no_rx_packet(psta, i);\n\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse{   \n\t\t\t\t/* The inactivity timer is reset when MPDUs to the TID is received. */\n\t\t\t\trtw_reset_continual_no_rx_packet(psta, i);\t\n\t\t\t}\n\t\t}\n\t}\n}\n\nu8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta)\n{\n\tu8 ret = _FALSE;\n\tint i = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t#ifdef DBG_EXPIRATION_CHK\n\tDBG_871X(FUNC_ADPT_FMT\" rx:\"STA_PKTS_FMT\", beacon:%llu, probersp_to_self:%llu\"\n\t\t\t\t/*\", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u\"*/\n\t\t\t\t\", retry:%u\\n\"\n\t\t, FUNC_ADPT_ARG(padapter)\n\t\t, STA_RX_PKTS_DIFF_ARG(psta)\n\t\t, psta->sta_stats.rx_beacon_pkts - psta->sta_stats.last_rx_beacon_pkts\n\t\t, psta->sta_stats.rx_probersp_pkts - psta->sta_stats.last_rx_probersp_pkts\n\t\t/*, psta->sta_stats.rx_probersp_bm_pkts - psta->sta_stats.last_rx_probersp_bm_pkts\n\t\t, psta->sta_stats.rx_probersp_uo_pkts - psta->sta_stats.last_rx_probersp_uo_pkts\n\t\t, psta->sta_stats.rx_probereq_pkts - psta->sta_stats.last_rx_probereq_pkts\n\t\t, pmlmeinfo->bcn_interval*/\n\t\t, pmlmeext->retry\n\t);\n\n\tDBG_871X(FUNC_ADPT_FMT\" tx_pkts:%llu, link_count:%u\\n\", FUNC_ADPT_ARG(padapter)\n\t\t, padapter->xmitpriv.tx_pkts\n\t\t, pmlmeinfo->link_count\n\t);\n\t#endif\n\n\tif((sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta))\n\t\t&& sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta)\n\t\t&& sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta)\n\t)\n\t{\n\t\tret = _FALSE;\n\t}\n\telse\n\t{\n\t\tret = _TRUE;\n\t}\n\n\tsta_update_last_rx_pkts(psta);\n\n\t/*\n\t\trecord last rx data packets for every tid.\n\t*/\n\tfor (i = 0; i < TID_NUM; i++)\t\n\t\tpsta->sta_stats.last_rx_data_qos_pkts[i] = psta->sta_stats.rx_data_qos_pkts[i];\n\n\treturn ret;\n}\n\n#ifdef CONFIG_TDLS\nu8 chk_tdls_peer_sta_is_alive(_adapter *padapter, struct sta_info *psta)\n{\n\tif ((psta->sta_stats.rx_data_pkts == psta->sta_stats.last_rx_data_pkts)\n\t\t&& (psta->sta_stats.rx_tdls_disc_rsp_pkts == psta->sta_stats.last_rx_tdls_disc_rsp_pkts))\n\t\treturn _FALSE;\n\n\treturn _TRUE;\n}\n\nvoid linked_status_chk_tdls(_adapter *padapter)\n{\nstruct candidate_pool{\n\tstruct sta_info *psta;\n\tu8 addr[ETH_ALEN];\n};\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t_irqL irqL;\n\tu8 ack_chk;\n\tstruct sta_info *psta;\n\tint i, num_teardown=0, num_checkalive=0;\n\t_list\t*plist, *phead;\n\tstruct tdls_txmgmt txmgmt;\n\tstruct candidate_pool checkalive[NUM_STA];\n\tstruct candidate_pool teardown[NUM_STA];\n#define ALIVE_MIN 2\n#define ALIVE_MAX 5\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t_rtw_memset(checkalive, 0x00, sizeof(checkalive));\n\t_rtw_memset(teardown, 0x00, sizeof(teardown));\n\n\tif((padapter->tdlsinfo.link_established == _TRUE)){\n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\tfor(i=0; i< NUM_STA; i++)\n\t\t{\n\t\t\tphead = &(pstapriv->sta_hash[i]);\n\t\t\tplist = get_next(phead);\n\t\t\t\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t{\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\t\tplist = get_next(plist);\n\n\t\t\t\tif(psta->tdls_sta_state & TDLS_LINKED_STATE)\n\t\t\t\t{\n\t\t\t\t\tpsta->alive_count++;\n\t\t\t\t\tif(psta->alive_count >= ALIVE_MIN)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (chk_tdls_peer_sta_is_alive(padapter, psta) == _FALSE) {\n\t\t\t\t\t\t\tif (psta->alive_count < ALIVE_MAX) {\n\t\t\t\t\t\t\t\t_rtw_memcpy(checkalive[num_checkalive].addr, psta->hwaddr, ETH_ALEN);\n\t\t\t\t\t\t\t\tcheckalive[num_checkalive].psta = psta;\n\t\t\t\t\t\t\t\tnum_checkalive++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_rtw_memcpy(teardown[num_teardown].addr, psta->hwaddr, ETH_ALEN);\n\t\t\t\t\t\t\t\tteardown[num_teardown].psta = psta;\n\t\t\t\t\t\t\t\tnum_teardown++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpsta->alive_count = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpsta->sta_stats.last_rx_data_pkts = psta->sta_stats.rx_data_pkts;\n\t\t\t\t\tpsta->sta_stats.last_rx_tdls_disc_rsp_pkts = psta->sta_stats.rx_tdls_disc_rsp_pkts;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\tif (num_checkalive > 0) {\n\t\t\tfor (i = 0; i < num_checkalive; i++) {\n\t\t\t\t_rtw_memcpy(txmgmt.peer, checkalive[i].addr, ETH_ALEN);\n\t\t\t\tissue_tdls_dis_req(padapter, &txmgmt);\n\t\t\t\tissue_tdls_dis_req(padapter, &txmgmt);\n\t\t\t\tissue_tdls_dis_req(padapter, &txmgmt);\n\t\t\t}\n\t\t}\n\n\t\tif(num_teardown > 0)\n\t\t{\n\t\t\tfor(i=0; i< num_teardown; i++)\n\t\t\t{\n\t\t\t\tDBG_871X(\"[%s %d] Send teardown to \"MAC_FMT\" \\n\", __FUNCTION__, __LINE__, MAC_ARG(teardown[i].addr));\n\t\t\t\ttxmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_;\n\t\t\t\t_rtw_memcpy(txmgmt.peer, teardown[i].addr, ETH_ALEN);\n\t\t\t\tissue_tdls_teardown(padapter, &txmgmt, _FALSE);\n\t\t\t}\n\t\t}\n\t}\n\n}\n#endif //CONFIG_TDLS\n\n//from_timer == 1 means driver is in LPS\nvoid linked_status_chk(_adapter *padapter, u8 from_timer)\n{\n\tu32\ti;\n\tstruct sta_info\t\t*psta;\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n#endif\n\t\n\n\tif (is_client_associated_to_ap(padapter))\n\t{\n\t\t//linked infrastructure client mode\n\n\t\tint tx_chk = _SUCCESS, rx_chk = _SUCCESS;\n\t\tint rx_chk_limit;\n\t\tint link_count_limit;\n\n\t\t#if defined(DBG_ROAMING_TEST)\n\t\trx_chk_limit = 1;\n\t\t#elif defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER)\n\t\trx_chk_limit = 4;\n\t\t#else\n\t\trx_chk_limit = 8;\n\t\t#endif\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\t\tif (!from_timer && pmlmepriv->bGetGateway == 1) {\n\t\t\tDBG_871X(\"do rtw_gw_addr_query()\");\n\t\t\tif (rtw_gw_addr_query(padapter) == 0) {\n\t\t\t\tpmlmepriv->bGetGateway = 0;\n\t\t\t} else {\n\t\t\t\t_rtw_memset(pmlmepriv->gw_ip, 0, 4);\n\t\t\t\t_rtw_memset(pmlmepriv->gw_mac_addr, 0, 6);\n\t\t\t}\n\t\t}\n#endif\n#ifdef CONFIG_P2P\n\t\tif (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\tif(!from_timer)\n\t\t\t\tlink_count_limit = 3; // 8 sec\n\t\t\telse\n\t\t\t\tlink_count_limit = 15; // 32 sec\n\t\t}\n\t\telse\n#endif // CONFIG_P2P\n\t\t{\n\t\t\tif(!from_timer)\n\t\t\t\tlink_count_limit = 7; // 16 sec\n\t\t\telse\n\t\t\t\tlink_count_limit = 29; // 60 sec\n\t\t}\t\t\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\n\t\tif (ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on) == _TRUE)\n\t\t\treturn;\n#endif /* CONFIG_TDLS_CH_SW */\n\n#ifdef CONFIG_TDLS_AUTOCHECKALIVE\n\t\tlinked_status_chk_tdls(padapter);\n#endif /* CONFIG_TDLS_AUTOCHECKALIVE */\n#endif /* CONFIG_TDLS */\n\n\t\tif ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)\n\t\t{\n\t\t\tbool is_p2p_enable = _FALSE;\n\t\t\t#ifdef CONFIG_P2P\n\t\t\tis_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE);\n\t\t\t#endif\n\n\t\t\t/*issue delba when ap does not tx data packet that is Broadcom ap */\n\t\t\trtw_delba_check(padapter, psta, from_timer);\n\n\t\t\tif (chk_ap_is_alive(padapter, psta) == _FALSE)\n\t\t\t\trx_chk = _FAIL;\n\n\t\t\tif (pxmitpriv->last_tx_pkts == pxmitpriv->tx_pkts)\n\t\t\t\ttx_chk = _FAIL;\n\n\t\t\t#if defined(CONFIG_ACTIVE_KEEP_ALIVE_CHECK) && !defined(CONFIG_LPS_LCLK_WD_TIMER)\n\t\t\tif (pmlmeext->active_keep_alive_check && (rx_chk == _FAIL || tx_chk == _FAIL)) {\n\t\t\t\tu8 backup_oper_channel=0;\n\n\t\t\t\t/* switch to correct channel of current network  before issue keep-alive frames */\n\t\t\t\tif (rtw_get_oper_ch(padapter) != pmlmeext->cur_channel) {\n\t\t\t\t\tbackup_oper_channel = rtw_get_oper_ch(padapter);\n\t\t\t\t\tSelectChannel(padapter, pmlmeext->cur_channel);\n\t\t\t\t}\n\n\t\t\t\tif (rx_chk != _SUCCESS)\n\t\t\t\t\tissue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, psta->hwaddr, 0, 0, 3, 1);\n\n\t\t\t\tif ((tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit) || rx_chk != _SUCCESS) {\n\t\t\t\t\ttx_chk = issue_nulldata(padapter, psta->hwaddr, 0, 3, 1);\n\t\t\t\t\t/* if tx acked and p2p disabled, set rx_chk _SUCCESS to reset retry count */\n\t\t\t\t\tif (tx_chk == _SUCCESS && !is_p2p_enable)\n\t\t\t\t\t\trx_chk = _SUCCESS;\n\t\t\t\t}\n\n\t\t\t\t/* back to the original operation channel */\n\t\t\t\tif(backup_oper_channel>0)\n\t\t\t\t\tSelectChannel(padapter, backup_oper_channel);\n\n\t\t\t}\n\t\t\telse\n\t\t\t#endif /* CONFIG_ACTIVE_KEEP_ALIVE_CHECK */\n\t\t\t{\n\t\t\t\tif (rx_chk != _SUCCESS) {\n\t\t\t\t\tif (pmlmeext->retry == 0) {\n\t\t\t\t\t\t#ifdef DBG_EXPIRATION_CHK\n\t\t\t\t\t\tDBG_871X(\"issue_probereq to trigger probersp, retry=%d\\n\", pmlmeext->retry);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\tissue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);\n\t\t\t\t\t\tissue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);\n\t\t\t\t\t\tissue_probereq_ex(padapter, &pmlmeinfo->network.Ssid, pmlmeinfo->network.MacAddress, 0, 0, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (tx_chk != _SUCCESS && pmlmeinfo->link_count++ == link_count_limit) {\n\t\t\t\t\t#ifdef DBG_EXPIRATION_CHK\n\t\t\t\t\tDBG_871X(\"%s issue_nulldata(%d)\\n\", __FUNCTION__, from_timer?1:0);\n\t\t\t\t\t#endif\n\t\t\t\t\ttx_chk = issue_nulldata_in_interrupt(padapter, NULL, from_timer?1:0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rx_chk == _FAIL) {\n\t\t\t\tpmlmeext->retry++;\n\t\t\t\tif (pmlmeext->retry > rx_chk_limit) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" disconnect or roaming\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter));\n\t\t\t\t\treceive_disconnect(padapter, pmlmeinfo->network.MacAddress\n\t\t\t\t\t\t, WLAN_REASON_EXPIRATION_CHK);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpmlmeext->retry = 0;\n\t\t\t}\n\n\t\t\tif (tx_chk == _FAIL) {\n\t\t\t\tpmlmeinfo->link_count %= (link_count_limit+1);\n\t\t\t} else {\n\t\t\t\tpxmitpriv->last_tx_pkts = pxmitpriv->tx_pkts;\n\t\t\t\tpmlmeinfo->link_count = 0;\n\t\t\t}\n\n\t\t} //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL)\n\n\t}\n\telse if (is_client_associated_to_ibss(padapter))\n\t{\n\t\t//linked IBSS mode\n\t\t//for each assoc list entry to check the rx pkt counter\n\t\tfor (i = IBSS_START_MAC_ID; i < NUM_STA; i++)\n\t\t{\n\t\t\tif (pmlmeinfo->FW_sta_info[i].status == 1)\n\t\t\t{\n\t\t\t\tpsta = pmlmeinfo->FW_sta_info[i].psta;\n\n\t\t\t\tif(NULL==psta) continue;\n\n\t\t\t\tif (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta))\n\t\t\t\t{\n\n\t\t\t\t\tif(pmlmeinfo->FW_sta_info[i].retry<3)\n\t\t\t\t\t{\n\t\t\t\t\t\tpmlmeinfo->FW_sta_info[i].retry++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpmlmeinfo->FW_sta_info[i].retry = 0;\n\t\t\t\t\t\tpmlmeinfo->FW_sta_info[i].status = 0;\n\t\t\t\t\t\treport_del_sta_event(padapter, psta->hwaddr, WLAN_REASON_EXPIRATION_CHK, _TRUE);\n\t\t\t\t\t}\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpmlmeinfo->FW_sta_info[i].retry = 0;\n\t\t\t\t\tpmlmeinfo->FW_sta_info[i].rx_pkt = (u32)sta_rx_pkts(psta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//set_link_timer(pmlmeext, DISCONNECT_TO);\n\n\t}\n\n}\n\nvoid survey_timer_hdl(_adapter *padapter)\n{\n\tstruct cmd_obj *cmd;\n\tstruct sitesurvey_parm *psurveyPara;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif\n\n\tif (mlmeext_scan_state(pmlmeext) > SCAN_DISABLE) {\n\t\tcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));\n\t\tif (cmd == NULL) {\n\t\t\trtw_warn_on(1);\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpsurveyPara = (struct sitesurvey_parm *)rtw_zmalloc(sizeof(struct sitesurvey_parm));\n\t\tif (psurveyPara == NULL) {\n\t\t\trtw_warn_on(1);\n\t\t\trtw_mfree((unsigned char *)cmd, sizeof(struct cmd_obj));\n\t\t\tgoto exit;\n\t\t}\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(cmd, psurveyPara, GEN_CMD_CODE(_SiteSurvey));\n\t\trtw_enqueue_cmd(pcmdpriv, cmd);\n\t}\n\nexit:\n\treturn;\n}\n\nvoid link_timer_hdl(_adapter *padapter)\n{\n\t//static unsigned int\t\trx_pkt = 0;\n\t//static u64\t\t\t\ttx_cnt = 0;\n\t//struct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t//struct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\n\n\tif (pmlmeinfo->state & WIFI_FW_AUTH_NULL)\n\t{\n\t\tDBG_871X(\"link_timer_hdl:no beacon while connecting\\n\");\n\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\treport_join_res(padapter, -3);\n\t}\n\telse if (pmlmeinfo->state & WIFI_FW_AUTH_STATE)\n\t{\n\t\t//re-auth timer\n\t\tif (++pmlmeinfo->reauth_count > REAUTH_LIMIT)\n\t\t{\n\t\t\t//if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto)\n\t\t\t//{\n\t\t\t\tpmlmeinfo->state = 0;\n\t\t\t\treport_join_res(padapter, -1);\n\t\t\t\treturn;\n\t\t\t//}\n\t\t\t//else\n\t\t\t//{\n\t\t\t//\tpmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared;\n\t\t\t//\tpmlmeinfo->reauth_count = 0;\n\t\t\t//}\n\t\t}\n\t\t\n\t\tDBG_871X(\"link_timer_hdl: auth timeout and try again\\n\");\n\t\tpmlmeinfo->auth_seq = 1;\n\t\tissue_auth(padapter, NULL, 0);\n\t\tset_link_timer(pmlmeext, REAUTH_TO);\n\t}\n\telse if (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)\n\t{\n\t\t//re-assoc timer\n\t\tif (++pmlmeinfo->reassoc_count > REASSOC_LIMIT)\n\t\t{\n\t\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\t\treport_join_res(padapter, -2);\n\t\t\treturn;\n\t\t}\n\n\t\tDBG_871X(\"link_timer_hdl: assoc timeout and try again\\n\");\n\t\tissue_assocreq(padapter);\n\t\tset_link_timer(pmlmeext, REASSOC_TO);\n\t}\n#if 0\n\telse if (is_client_associated_to_ap(padapter))\n\t{\n\t\t//linked infrastructure client mode\n\t\tif ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)\n\t\t{\n\t\t\t/*to monitor whether the AP is alive or not*/\n\t\t\tif (rx_pkt == psta->sta_stats.rx_pkts)\n\t\t\t{\n\t\t\t\treceive_disconnect(padapter, pmlmeinfo->network.MacAddress);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trx_pkt = psta->sta_stats.rx_pkts;\n\t\t\t\tset_link_timer(pmlmeext, DISCONNECT_TO);\n\t\t\t}\n\n\t\t\t//update the EDCA paramter according to the Tx/RX mode\n\t\t\tupdate_EDCA_param(padapter);\n\n\t\t\t/*to send the AP a nulldata if no frame is xmitted in order to keep alive*/\n\t\t\tif (pmlmeinfo->link_count++ == 0)\n\t\t\t{\n\t\t\t\ttx_cnt = pxmitpriv->tx_pkts;\n\t\t\t}\n\t\t\telse if ((pmlmeinfo->link_count & 0xf) == 0)\n\t\t\t{\n\t\t\t\tif (tx_cnt == pxmitpriv->tx_pkts)\n\t\t\t\t{\n\t\t\t\t\tissue_nulldata_in_interrupt(padapter, NULL, 0);\n\t\t\t\t}\n\n\t\t\t\ttx_cnt = pxmitpriv->tx_pkts;\n\t\t\t}\n\t\t} //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL)\n\t}\n\telse if (is_client_associated_to_ibss(padapter))\n\t{\n\t\t//linked IBSS mode\n\t\t//for each assoc list entry to check the rx pkt counter\n\t\tfor (i = IBSS_START_MAC_ID; i < NUM_STA; i++)\n\t\t{\n\t\t\tif (pmlmeinfo->FW_sta_info[i].status == 1)\n\t\t\t{\n\t\t\t\tpsta = pmlmeinfo->FW_sta_info[i].psta;\n\n\t\t\t\tif (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts)\n\t\t\t\t{\n\t\t\t\t\tpmlmeinfo->FW_sta_info[i].status = 0;\n\t\t\t\t\treport_del_sta_event(padapter, psta->hwaddr);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tset_link_timer(pmlmeext, DISCONNECT_TO);\n\t}\n#endif\n\n\treturn;\n}\n\nvoid addba_timer_hdl(struct sta_info *psta)\n{\n#ifdef CONFIG_80211N_HT\n\tstruct ht_priv\t*phtpriv;\n\n\tif(!psta)\n\t\treturn;\n\t\n\tphtpriv = &psta->htpriv;\n\n\tif((phtpriv->ht_option==_TRUE) && (phtpriv->ampdu_enable==_TRUE)) \n\t{\n\t\tif(phtpriv->candidate_tid_bitmap)\n\t\t\tphtpriv->candidate_tid_bitmap=0x0;\n\t\t\n\t}\n#endif //CONFIG_80211N_HT\n}\n\n#ifdef CONFIG_IEEE80211W\nvoid report_sta_timeout_event(_adapter *padapter, u8 *MacAddr, unsigned short reason)\n{\n\tstruct cmd_obj *pcmd_obj;\n\tu8\t*pevtcmd;\n\tu32 cmdsz;\n\tstruct sta_info *psta;\n\tint\tmac_id;\n\tstruct stadel_event\t\t\t*pdel_sta_evt;\n\tstruct C2HEvent_Header\t*pc2h_evt_hdr;\n\tstruct mlme_ext_priv\t\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\t\n\tpcmd_obj = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj));\n\tif (pcmd_obj == NULL)\n\t\treturn;\n\n\tcmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header));\n\tpevtcmd = (u8 *)rtw_zmalloc(cmdsz);\n\tif (pevtcmd == NULL) {\n\t\trtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\n\t_rtw_init_listhead(&pcmd_obj->list);\n\n\tpcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);\n\tpcmd_obj->cmdsz = cmdsz;\n\tpcmd_obj->parmbuf = pevtcmd;\n\n\tpcmd_obj->rsp = NULL;\n\tpcmd_obj->rspsz  = 0;\n\n\tpc2h_evt_hdr = (struct C2HEvent_Header *)(pevtcmd);\n\tpc2h_evt_hdr->len = sizeof(struct stadel_event);\n\tpc2h_evt_hdr->ID = GEN_EVT_CODE(_TimeoutSTA);\n\tpc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);\n\n\tpdel_sta_evt = (struct stadel_event *)(pevtcmd + sizeof(struct C2HEvent_Header));\n\t_rtw_memcpy((unsigned char *)(&(pdel_sta_evt->macaddr)), MacAddr, ETH_ALEN);\n\t_rtw_memcpy((unsigned char *)(pdel_sta_evt->rsvd), (unsigned char *)(&reason), 2);\n\n\n\tpsta = rtw_get_stainfo(&padapter->stapriv, MacAddr);\n\tif (psta)\n\t\tmac_id = (int)psta->mac_id;\t\n\telse\n\t\tmac_id = (-1);\n\n\tpdel_sta_evt->mac_id = mac_id;\n\n\tDBG_871X(\"report_del_sta_event: delete STA, mac_id=%d\\n\", mac_id);\n\n\trtw_enqueue_cmd(pcmdpriv, pcmd_obj);\n\n\treturn;\n}\n\nvoid clnt_sa_query_timeout(_adapter *padapter)\n{\n\n\trtw_disassoc_cmd(padapter, 0, _TRUE);\n\trtw_indicate_disconnect(padapter);\n\trtw_free_assoc_resources(padapter, 1);\t\n\n\tDBG_871X(\"SA query timeout client disconnect\\n\");\n}\n\nvoid sa_query_timer_hdl(struct sta_info *psta)\n{\n\t_adapter *padapter = psta->padapter;\n\t_irqL irqL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE &&\n\t\t\t\t\tcheck_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\tclnt_sa_query_timeout(padapter);\n\telse if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\treport_sta_timeout_event(padapter, psta->hwaddr, WLAN_REASON_PREV_AUTH_NOT_VALID);\n}\n\n#endif //CONFIG_IEEE80211W\n\nu8 NULL_hdl(_adapter *padapter, u8 *pbuf)\n{\n\treturn H2C_SUCCESS;\n}\n\n#ifdef CONFIG_AUTO_AP_MODE\nvoid rtw_start_auto_ap(_adapter *adapter)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\trtw_set_802_11_infrastructure_mode(adapter, Ndis802_11APMode);\n\n\trtw_setopmode_cmd(adapter, Ndis802_11APMode,_TRUE);\n}\n\nstatic int rtw_auto_ap_start_beacon(_adapter *adapter)\n{\n\tint ret=0;\n\tu8 *pbuf = NULL;\n\tuint len;\n\tu8\tsupportRate[16];\n\tint \tsz = 0, rateLen;\n\tu8 *\tie;\n\tu8\twireless_mode, oper_channel;\n\tu8 ssid[3] = {0}; //hidden ssid\n\tu32 ssid_len = sizeof(ssid);\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\n\tlen = 128;\n\tpbuf = rtw_zmalloc(len);\n\tif(!pbuf)\n\t\treturn -ENOMEM;\n\n\n\t//generate beacon\n\tie = pbuf;\n\n\t//timestamp will be inserted by hardware\n\tsz += 8;\n\tie += sz;\n\n\t//beacon interval : 2bytes\n\t*(u16*)ie = cpu_to_le16((u16)100);//BCN_INTERVAL=100;\n\tsz += 2;\n\tie += 2;\n\n\t//capability info\n\t*(u16*)ie = 0;\n\t*(u16*)ie |= cpu_to_le16(cap_ESS);\n\t*(u16*)ie |= cpu_to_le16(cap_ShortPremble);\n\t//*(u16*)ie |= cpu_to_le16(cap_Privacy);\n\tsz += 2;\n\tie += 2;\n\n\t//SSID\n\tie = rtw_set_ie(ie, _SSID_IE_, ssid_len, ssid, &sz);\n\n\t//supported rates\n\twireless_mode = WIRELESS_11BG_24N;\n\trtw_set_supported_rate(supportRate, wireless_mode) ;\n\trateLen = rtw_get_rateset_len(supportRate);\n\tif (rateLen > 8)\n\t{\n\t\tie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, 8, supportRate, &sz);\n\t}\n\telse\n\t{\n\t\tie = rtw_set_ie(ie, _SUPPORTEDRATES_IE_, rateLen, supportRate, &sz);\n\t}\n\n\n\t//DS parameter set\n\tif(check_buddy_fwstate(adapter, _FW_LINKED) &&\n\t\tcheck_buddy_fwstate(adapter, WIFI_STATION_STATE))\n\t{\n\t\tPADAPTER pbuddy_adapter = adapter->pbuddy_adapter;\n\t\tstruct mlme_ext_priv *pbuddy_mlmeext  = &pbuddy_adapter->mlmeextpriv;\n\n\t\toper_channel = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n\t{\n\t\toper_channel = adapter_to_dvobj(adapter)->oper_channel;\n\t}\n\tie = rtw_set_ie(ie, _DSSET_IE_, 1, &oper_channel, &sz);\n\n\t//ext supported rates\n\tif (rateLen > 8)\n\t{\n\t\tie = rtw_set_ie(ie, _EXT_SUPPORTEDRATES_IE_, (rateLen - 8), (supportRate + 8), &sz);\n\t}\n\n\tDBG_871X(\"%s, start auto ap beacon sz=%d\\n\", __FUNCTION__, sz);\n\n\t//lunch ap mode & start to issue beacon\n\tif(rtw_check_beacon_data(adapter, pbuf,  sz) == _SUCCESS)\n\t{\n\n\t}\n\telse\n\t{\n\t\tret = -EINVAL;\n\t}\n\n\n\trtw_mfree(pbuf, len);\n\n\treturn ret;\n\n}\n#endif//CONFIG_AUTO_AP_MODE\n\nu8 setopmode_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tu8\ttype;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct setopmode_parm *psetop = (struct setopmode_parm *)pbuf;\n\n\tif(psetop->mode == Ndis802_11APMode)\n\t{\n\t\tpmlmeinfo->state = WIFI_FW_AP_STATE;\n\t\ttype = _HW_STATE_AP_;\n#ifdef CONFIG_NATIVEAP_MLME\n\t\t//start_ap_mode(padapter);\n#endif\n\t}\n\telse if(psetop->mode == Ndis802_11Infrastructure)\n\t{\n\t\tpmlmeinfo->state &= ~(BIT(0)|BIT(1));// clear state\n\t\tpmlmeinfo->state |= WIFI_FW_STATION_STATE;//set to \tSTATION_STATE\n\t\ttype = _HW_STATE_STATION_;\n\t}\n\telse if(psetop->mode == Ndis802_11IBSS)\n\t{\n\t\ttype = _HW_STATE_ADHOC_;\n\t} else if (psetop->mode == Ndis802_11Monitor) {\n\t\ttype = _HW_STATE_MONITOR_;\n\t}\n\telse\n\t{\n\t\ttype = _HW_STATE_NOLINK_;\n\t}\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type));\n\t//Set_NETYPE0_MSR(padapter, type);\n\n\n#ifdef CONFIG_AUTO_AP_MODE\n\tif(psetop->mode == Ndis802_11APMode)\n\t\trtw_auto_ap_start_beacon(padapter);\n#endif\n\n\tif (rtw_port_switch_chk(padapter) == _TRUE)\n\t{\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);\n\n\t\tif(psetop->mode == Ndis802_11APMode)\n\t\t\tadapter_to_pwrctl(padapter)->fw_psmode_iface_id = 0xff; //ap mode won't dowload rsvd pages\n\t\telse if (psetop->mode == Ndis802_11Infrastructure) {\n\t\t\t#ifdef CONFIG_LPS\n\t\t\t_adapter *port0_iface = dvobj_get_port0_adapter(adapter_to_dvobj(padapter));\n\t\t\tif (port0_iface)\n\t\t\t\trtw_lps_ctrl_wk_cmd(port0_iface, LPS_CTRL_CONNECT, 0);\n\t\t\t#endif\t\n\t\t}\n\t}\t\n\n#ifdef CONFIG_BT_COEXIST\n\tif (psetop->mode == Ndis802_11APMode)\n\t{\n\t\t// Do this after port switch to\n\t\t// prevent from downloading rsvd page to wrong port\n\t\trtw_btcoex_MediaStatusNotify(padapter, 1); //connect \n\t}\n#endif // CONFIG_BT_COEXIST\n\n\treturn H2C_SUCCESS;\n\t\n}\n\nu8 createbss_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\tWLAN_BSSID_EX\t*pdev_network = &padapter->registrypriv.dev_network;\n\tstruct createbss_parm *parm = (struct createbss_parm *)pbuf;\n\tu8 ret = H2C_SUCCESS;\n\t//u8\tinitialgain;\n\t\n#ifdef CONFIG_AP_MODE\n\tif (pmlmeinfo->state == WIFI_FW_AP_STATE) {\n\t\tstart_bss_network(padapter, parm);\n\t\tgoto exit;\n\t}\n#endif\n\n\t/* below is for ad-hoc master */\n\tif (parm->adhoc) {\n\t\trtw_warn_on(pdev_network->InfrastructureMode != Ndis802_11IBSS);\n\t\trtw_joinbss_reset(padapter);\n\t\n\t\tpmlmeext->cur_bwmode = CHANNEL_WIDTH_20;\n\t\tpmlmeext->cur_ch_offset= HAL_PRIME_CHNL_OFFSET_DONT_CARE;\t\n\t\tpmlmeinfo->ERP_enable = 0;\n\t\tpmlmeinfo->WMM_enable = 0;\n\t\tpmlmeinfo->HT_enable = 0;\n\t\tpmlmeinfo->HT_caps_enable = 0;\n\t\tpmlmeinfo->HT_info_enable = 0;\n\t\tpmlmeinfo->agg_enable_bitmap = 0;\n\t\tpmlmeinfo->candidate_tid_bitmap = 0;\n\n\t\t//config the initial gain under linking, need to write the BB registers\n\t\t//initialgain = 0x1E;\n\t\t/*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/\n\n\t\t//disable dynamic functions, such as high power, DIG\n\t\trtw_phydm_ability_backup(padapter);\n\t\trtw_phydm_func_disable_all(padapter);\n\t\t\n\t\t//cancel link timer \n\t\t_cancel_timer_ex(&pmlmeext->link_timer);\n\n\t\t//clear CAM\n\t\tflush_all_cam_entry(padapter);\t\n\n\t\tpdev_network->Length = get_WLAN_BSSID_EX_sz(pdev_network);\n\t\t_rtw_memcpy(pnetwork, pdev_network, FIELD_OFFSET(WLAN_BSSID_EX, IELength));\n\t\tpnetwork->IELength = pdev_network->IELength;\n\n\t\tif (pnetwork->IELength > MAX_IE_SZ) {\n\t\t\tret = H2C_PARAMETERS_ERROR;\n\t\t\tgoto ibss_post_hdl;\n\t\t}\n\n\t\t_rtw_memcpy(pnetwork->IEs, pdev_network->IEs, pnetwork->IELength);\n\t\tstart_create_ibss(padapter);\n\t} else {\n\t\trtw_warn_on(1);\n\t\tret = H2C_PARAMETERS_ERROR;\n\t}\n\nibss_post_hdl:\n\trtw_create_ibss_post_hdl(padapter, ret);\n\nexit:\n\treturn ret;\n}\n\nu8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tu8\tjoin_type;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\tstruct joinbss_parm\t*pparm = (struct joinbss_parm *)pbuf;\n#endif //CONFIG_ANTENNA_DIVERSITY\n\tu32 i;\n\t//u8\tinitialgain;\n\t//u32\tacparm;\n\tu8 u_ch, u_bw, u_offset;\n\n\t//check already connecting to AP or not\n\tif (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)\n\t{\n\t\tif (pmlmeinfo->state & WIFI_FW_STATION_STATE)\n\t\t{\n\t\t\tissue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100);\n\t\t}\n\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\t\t\n\t\t//clear CAM\n\t\tflush_all_cam_entry(padapter);\t\t\n\t\t\n\t\t_cancel_timer_ex(&pmlmeext->link_timer);\n\t\t\n\t\t//set MSR to nolink -> infra. mode\t\t\n\t\t//Set_MSR(padapter, _HW_STATE_NOLINK_);\n\t\tSet_MSR(padapter, _HW_STATE_STATION_);\t\n\t\t\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);\n\t}\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\trtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, _FALSE);\n#endif\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_wapi_clear_all_cam_entry(padapter);\n#endif\n\n\trtw_joinbss_reset(padapter);\n\n\tpmlmeinfo->ERP_enable = 0;\n\tpmlmeinfo->WMM_enable = 0;\n\tpmlmeinfo->HT_enable = 0;\n\tpmlmeinfo->HT_caps_enable = 0;\n\tpmlmeinfo->HT_info_enable = 0;\n\tpmlmeinfo->agg_enable_bitmap = 0;\n\tpmlmeinfo->candidate_tid_bitmap = 0;\n\tpmlmeinfo->bwmode_updated = _FALSE;\n\t//pmlmeinfo->assoc_AP_vendor = HT_IOT_PEER_MAX;\n\tpmlmeinfo->VHT_enable = 0;\n\n\t_rtw_memcpy(pnetwork, pbuf, FIELD_OFFSET(WLAN_BSSID_EX, IELength)); \n\tpnetwork->IELength = ((WLAN_BSSID_EX *)pbuf)->IELength;\n\t\n\tif(pnetwork->IELength>MAX_IE_SZ)//Check pbuf->IELength\n\t\treturn H2C_PARAMETERS_ERROR;\t\n\t\n\tif (pnetwork->IELength < 2) {\n\t\treport_join_res(padapter, (-4));\n\t\treturn H2C_SUCCESS;\n\t}\n\t_rtw_memcpy(pnetwork->IEs, ((WLAN_BSSID_EX *)pbuf)->IEs, pnetwork->IELength); \n\n\tpmlmeinfo->bcn_interval = get_beacon_interval(pnetwork);\n\n\t//Check AP vendor to move rtw_joinbss_cmd()\n\t//pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->IEs, pnetwork->IELength);\n\n\t//sizeof(NDIS_802_11_FIXED_IEs)\t\n\tfor (i = _FIXED_IE_LENGTH_ ; i < pnetwork->IELength - 2 ;) {\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pnetwork->IEs + i);\n\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _VENDOR_SPECIFIC_IE_://Get WMM IE.\n\t\t\t\tif ( _rtw_memcmp(pIE->data, WMM_OUI, 4) )\n\t\t\t\t{\n\t\t\t\t\tWMM_param_handler(padapter, pIE);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n#ifdef CONFIG_80211N_HT\n\t\t\tcase _HT_CAPABILITY_IE_:\t//Get HT Cap IE.\n\t\t\t\tpmlmeinfo->HT_caps_enable = 1;\n\t\t\t\tbreak;\n\n\t\t\tcase _HT_EXTRA_INFO_IE_:\t//Get HT Info IE.\n\t\t\t\tpmlmeinfo->HT_info_enable = 1;\n\t\t\t\tbreak;\n#endif /* CONFIG_80211N_HT */\n\n#ifdef CONFIG_80211AC_VHT\n\t\t\tcase EID_VHTCapability://Get VHT Cap IE.\n\t\t\t\tpmlmeinfo->VHT_enable = 1;\n\t\t\t\tbreak;\n\n\t\t\tcase EID_VHTOperation://Get VHT Operation IE.\n\t\t\t\tbreak;\n#endif /* CONFIG_80211AC_VHT */\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\ti += (pIE->Length + 2);\n\t}\n\n\trtw_bss_get_chbw(pnetwork\n\t\t, &pmlmeext->cur_channel, &pmlmeext->cur_bwmode, &pmlmeext->cur_ch_offset);\n\n\trtw_adjust_chbw(padapter, pmlmeext->cur_channel, &pmlmeext->cur_bwmode, &pmlmeext->cur_ch_offset);\n\n#if 0\n\tif (padapter->registrypriv.wifi_spec) {\n\t\t// for WiFi test, follow WMM test plan spec\n\t\tacparm = 0x002F431C; // VO\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));\n\t\tacparm = 0x005E541C; // VI\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));\n\t\tacparm = 0x0000A525; // BE\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));\n\t\tacparm = 0x0000A549; // BK\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));\n\t\n\t\t// for WiFi test, mixed mode with intel STA under bg mode throughput issue\n\t\tif (padapter->mlmepriv.htpriv.ht_option == _FALSE){\n\t\t\tacparm = 0x00004320;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));\n\t\t}\n\t}\n\telse {\n\t\tacparm = 0x002F3217; // VO\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm));\n\t\tacparm = 0x005E4317; // VI\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm));\n\t\tacparm = 0x00105320; // BE\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm));\n\t\tacparm = 0x0000A444; // BK\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));\n\t}\n#endif\n\n\t/* check channel, bandwidth, offset and switch */\n\tif (rtw_chk_start_clnt_join(padapter, &u_ch, &u_bw, &u_offset) == _FAIL) {\n\t\treport_join_res(padapter, (-4));\n\t\treturn H2C_SUCCESS;\n\t}\n\n\t//disable dynamic functions, such as high power, DIG\n\t/*rtw_phydm_func_disable_all(padapter);*/\n\n\t//config the initial gain under linking, need to write the BB registers\n\t//initialgain = 0x1E;\n\t/*rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);*/\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);\n\tjoin_type = 0;\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\trtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL);\n\n\tset_channel_bwmode(padapter, u_ch, u_offset, u_bw);\n\n\t//cancel link timer \n\t_cancel_timer_ex(&pmlmeext->link_timer);\n\t\n\tstart_clnt_join(padapter);\n\t\n\treturn H2C_SUCCESS;\n\t\n}\n\nu8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct disconnect_parm *param = (struct disconnect_parm *)pbuf;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\tu8 val8;\n\n\tif (is_client_associated_to_ap(padapter))\n\t{\n#ifdef CONFIG_DFS\n\t\tif(padapter->mlmepriv.handle_dfs == _FALSE)\n#endif //CONFIG_DFS\n#ifdef CONFIG_PLATFORM_ROCKCHIPS\n\t\t\t//To avoid connecting to AP fail during resume process, change retry count from 5 to 1\n\t\t\tissue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, 1, 100);\n#else\n\t\t\tissue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms/100, 100);\n#endif //CONFIG_PLATFORM_ROCKCHIPS\n\t}\n\n#ifdef CONFIG_DFS\n\tif( padapter->mlmepriv.handle_dfs == _TRUE )\n\t\tpadapter->mlmepriv.handle_dfs = _FALSE;\n#endif //CONFIG_DFS\n\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t{\n\t\t//Stop BCN\n\t\tval8 = 0;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_FUNC, (u8 *)(&val8));\n\t}\n\n\trtw_mlmeext_disconnect(padapter);\n\n\trtw_free_uc_swdec_pending_queue(padapter);\n\n\treturn \tH2C_SUCCESS;\n}\n\nstatic const char * const _scan_state_str[] = {\n\t\"SCAN_DISABLE\",\n\t\"SCAN_START\",\n\t\"SCAN_PS_ANNC_WAIT\",\n\t\"SCAN_ENTER\",\n\t\"SCAN_PROCESS\",\n\t\"SCAN_BACKING_OP\",\n\t\"SCAN_BACK_OP\",\n\t\"SCAN_LEAVING_OP\",\n\t\"SCAN_LEAVE_OP\",\n\t\"SCAN_SW_ANTDIV_BL\",\n\t\"SCAN_TO_P2P_LISTEN\",\n\t\"SCAN_P2P_LISTEN\",\n\t\"SCAN_COMPLETE\",\n\t\"SCAN_STATE_MAX\",\n};\n\nconst char *scan_state_str(u8 state)\n{\n\tstate = (state >= SCAN_STATE_MAX) ? SCAN_STATE_MAX : state;\n\treturn _scan_state_str[state];\n}\n\nstatic bool scan_abort_hdl(_adapter *adapter)\n{\n\tstruct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct ss_res *ss = &pmlmeext->sitesurvey_res;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &adapter->wdinfo;\n#endif\n\tbool ret = _FALSE;\n\n\tif (pmlmeext->scan_abort == _TRUE) {\n\t\t#ifdef CONFIG_P2P\n\t\tif (!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {\n\t\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);\n\t\t\tss->channel_idx = 3;\n\t\t\tDBG_871X(\"%s idx:%d, cnt:%u\\n\", __FUNCTION__\n\t\t\t\t, ss->channel_idx\n\t\t\t\t, pwdinfo->find_phase_state_exchange_cnt\n\t\t\t);\n\t\t} else\n\t\t#endif\n\t\t{\n\t\t\tss->channel_idx = ss->ch_num;\n\t\t\tDBG_871X(\"%s idx:%d\\n\", __FUNCTION__\n\t\t\t\t, ss->channel_idx\n\t\t\t);\n\t\t}\n\t\tpmlmeext->scan_abort = _FALSE;\n\t\tret = _TRUE;\n\t}\n\n\treturn ret;\n}\n\nu8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num)\n{\n/* interval larger than this is treated as backgroud scan */\n#ifndef RTW_SCAN_SPARSE_BG_INTERVAL_MS\n#define RTW_SCAN_SPARSE_BG_INTERVAL_MS 12000\n#endif\n\n#ifndef RTW_SCAN_SPARSE_CH_NUM_MIRACAST\n#define RTW_SCAN_SPARSE_CH_NUM_MIRACAST 1\n#endif\n#ifndef RTW_SCAN_SPARSE_CH_NUM_BG\n#define RTW_SCAN_SPARSE_CH_NUM_BG 4\n#endif\n\n#define SCAN_SPARSE_CH_NUM_INVALID 255\n\n\tstatic u8 token = 255;\n\tu32 interval;\n\tbool busy_traffic = _FALSE;\n\tbool miracast_enabled = _FALSE;\n\tbool bg_scan = _FALSE;\n\tu8 max_allow_ch = SCAN_SPARSE_CH_NUM_INVALID;\n\tu8 scan_division_num;\n\tu8 ret_num = ch_num;\n\tstruct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\n\tif (regsty->wifi_spec)\n\t\tgoto exit;\n\n\t/* assume ch_num > 6 is normal scan */\n\tif (ch_num <= 6)\n\t\tgoto exit;\n\n\tif (mlmeext->last_scan_time == 0)\n\t\tmlmeext->last_scan_time = rtw_get_current_time();\n\n\tinterval = rtw_get_passing_time_ms(mlmeext->last_scan_time);\n\n\tif (adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (adapter->pbuddy_adapter && adapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)\n\t\t#endif\n\t)\n\t\t\tbusy_traffic = _TRUE;\n\n\t#ifdef CONFIG_WFD\n\tif (is_miracast_enabled(adapter->wfd_info.stack_wfd_mode)\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (adapter->pbuddy_adapter && is_miracast_enabled(adapter->pbuddy_adapter->wfd_info.stack_wfd_mode))\n\t\t#endif\n\t)\n\t\tmiracast_enabled = _TRUE;\n\t#endif\n\n\tif (interval > RTW_SCAN_SPARSE_BG_INTERVAL_MS)\n\t\tbg_scan = _TRUE;\n\n\t/* max_allow_ch by conditions*/\n\n\t#if RTW_SCAN_SPARSE_MIRACAST\n\tif (miracast_enabled == _TRUE && busy_traffic == _TRUE)\n\t\tmax_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_MIRACAST);\n\t#endif\n\n\t#if RTW_SCAN_SPARSE_BG\n\tif (bg_scan == _TRUE)\n\t\tmax_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_BG);\n\t#endif\n\n\n\tif (max_allow_ch != SCAN_SPARSE_CH_NUM_INVALID) {\n\t\tint i;\n\t\tint k = 0;\n\n\t\tscan_division_num = (ch_num / max_allow_ch) + ((ch_num % max_allow_ch)?1:0);\n\t\ttoken = (token + 1) % scan_division_num;\n\t\t\n\t\tif (0)\n\t\t\tDBG_871X(\"scan_division_num:%u, token:%u\\n\", scan_division_num, token);\n\t\t\n\t\tfor (i = 0; i < ch_num; i++) {\n\t\t\tif (ch[i].hw_value && (i % scan_division_num) == token\n\t\t\t) {\n\t\t\t\tif (i != k)\n\t\t\t\t\t_rtw_memcpy(&ch[k], &ch[i], sizeof(struct rtw_ieee80211_channel));\n\t\t\t\tk++;\n\t\t\t}\n\t\t}\n\n\t\t_rtw_memset(&ch[k], 0, sizeof(struct rtw_ieee80211_channel));\n\n\t\tret_num = k;\n\t\tmlmeext->last_scan_time = rtw_get_current_time();\n\t}\n\nexit:\n\treturn ret_num;\n}\n\nstatic int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,\n\tu32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)\n{\n\tint i, j;\n\tint scan_ch_num = 0;\n\tint set_idx;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\t/* clear first */\n\t_rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel)*out_num);\n\n\t/* acquire channels from in */\n\tj = 0;\n\tfor (i=0;i<in_num;i++) {\n\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" \"CHAN_FMT\"\\n\", FUNC_ADPT_ARG(padapter), CHAN_ARG(&in[i]));\n\n\t\tif(in[i].hw_value && !(in[i].flags & RTW_IEEE80211_CHAN_DISABLED)\n\t\t\t&& (set_idx=rtw_ch_set_search_ch(pmlmeext->channel_set, in[i].hw_value)) >=0\n\t\t\t&& rtw_mlme_band_check(padapter, in[i].hw_value) == _TRUE\n\t\t)\n\t\t{\n\t\t\tif (j >= out_num) {\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" out_num:%u not enough\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(padapter), out_num);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t_rtw_memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel));\n\t\t\t\n\t\t\tif(pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE)\n\t\t\t\tout[j].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN;\n\t\t\t\t\n\t\t\tj++;\n\t\t}\n\t\tif(j>=out_num)\n\t\t\tbreak;\n\t}\n\t\n\t/* if out is empty, use channel_set as default */\n\tif(j == 0) {\n\t\tfor (i=0;i<pmlmeext->max_chan_nums;i++) {\n\n\t\t\tif (0)\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch:%u\\n\", FUNC_ADPT_ARG(padapter), pmlmeext->channel_set[i].ChannelNum);\n\n\t\t\tif (rtw_mlme_band_check(padapter, pmlmeext->channel_set[i].ChannelNum) == _TRUE) {\n\n\t\t\t\tif (j >= out_num) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" out_num:%u not enough\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), out_num);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tout[j].hw_value = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t\n\t\t\t\tif(pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE)\n\t\t\t\t\tout[j].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN;\n\n\t\t\t\tj++;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* scan_sparse */\n\tj = rtw_scan_sparse(padapter, out, j);\n\n\treturn j;\n}\n\nstatic void sitesurvey_res_reset(_adapter *adapter, struct sitesurvey_parm *parm)\n{\n\tstruct ss_res *ss = &adapter->mlmeextpriv.sitesurvey_res;\n\tint i;\n\n\tss->bss_cnt = 0;\n\tss->channel_idx = 0;\n#ifdef CONFIG_SCAN_BACKOP\n\tss->scan_cnt = 0;\n#endif\n#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)\n\tss->is_sw_antdiv_bl_scan = 0;\n#endif\n\t\n\tfor (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) {\n\t\tif (parm->ssid[i].SsidLength) {\n\t\t\t_rtw_memcpy(ss->ssid[i].Ssid, parm->ssid[i].Ssid, IW_ESSID_MAX_SIZE);\n\t\t\tss->ssid[i].SsidLength = parm->ssid[i].SsidLength;\n\t\t} else {\n\t\t\tss->ssid[i].SsidLength = 0;\n\t\t}\n\t}\n\n\tss->ch_num = rtw_scan_ch_decision(adapter\n\t\t, ss->ch, RTW_CHANNEL_SCAN_AMOUNT\n\t\t, parm->ch, parm->ch_num\n\t);\n\n\tss->scan_mode = parm->scan_mode;\n}\n\nstatic u8 sitesurvey_pick_ch_behavior(_adapter *padapter, u8 *ch, RT_SCAN_TYPE *type)\n{\n\tu8 next_state;\n\tu8 scan_ch = 0;\n\tRT_SCAN_TYPE scan_type = SCAN_PASSIVE;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;\n\tstruct ss_res *ss = &pmlmeext->sitesurvey_res;\n\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n#endif\n\n\t/* handle scan abort request */\n\tscan_abort_hdl(padapter);\n\n#ifdef CONFIG_P2P\n\tif (pwdinfo->rx_invitereq_info.scan_op_ch_only || pwdinfo->p2p_info.scan_op_ch_only) {\n\t\tif (pwdinfo->rx_invitereq_info.scan_op_ch_only)\n\t\t\tscan_ch = pwdinfo->rx_invitereq_info.operation_ch[ss->channel_idx];\n\t\telse\n\t\t\tscan_ch = pwdinfo->p2p_info.operation_ch[ss->channel_idx];\n\t\tscan_type = SCAN_ACTIVE;\n\t} else if (rtw_p2p_findphase_ex_is_social(pwdinfo)) {\n\t\t/*\n\t\t* Commented by Albert 2011/06/03\n\t\t* The driver is in the find phase, it should go through the social channel.\n\t\t*/\n\t\tint ch_set_idx;\n\n\t\tscan_ch = pwdinfo->social_chan[ss->channel_idx];\n\t\tch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, scan_ch);\n\t\tif (ch_set_idx >= 0)\n\t\t\tscan_type = pmlmeext->channel_set[ch_set_idx].ScanType;\n\t\telse\n\t\t\tscan_type = SCAN_ACTIVE;\n\t} else\n#endif /* CONFIG_P2P */\n\t{\n\t\tstruct rtw_ieee80211_channel *ch;\n\n\t\tif (ss->channel_idx < ss->ch_num) {\n\t\t\tch = &ss->ch[ss->channel_idx];\n\t\t\tscan_ch = ch->hw_value;\n\t\t\tscan_type = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE;\n\t\t}\n\t}\n\n\tif (scan_ch != 0) {\n\t\tnext_state = SCAN_PROCESS;\n\t\t#ifdef CONFIG_SCAN_BACKOP\n\t\t{\n\t\t\tu8 sta_num;\n\t\t\tu8 ld_sta_num;\n\t\t\tu8 ap_num;\n\t\t\tu8 ld_ap_num;\n\t\t\tu8 backop_flags = 0;\n\n\t\t\trtw_dev_iface_status(padapter, &sta_num, &ld_sta_num, NULL, &ap_num, &ld_ap_num);\n\n\t\t\tif ((ld_sta_num > 0 && mlmeext_chk_scan_backop_flags_sta(pmlmeext, SS_BACKOP_EN))\n\t\t\t\t\t|| (sta_num > 0 && mlmeext_chk_scan_backop_flags_sta(pmlmeext, SS_BACKOP_EN_NL))\n\t\t\t) {\n\t\t\t\tbackop_flags |= mlmeext_scan_backop_flags_sta(pmlmeext);\n\t\t\t}\n\n\t\t\tif ((ld_ap_num > 0 && mlmeext_chk_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN))\n\t\t\t\t\t|| (ap_num > 0 && mlmeext_chk_scan_backop_flags_ap(pmlmeext, SS_BACKOP_EN_NL))\n\t\t\t) {\n\t\t\t\tbackop_flags |= mlmeext_scan_backop_flags_ap(pmlmeext);\n\t\t\t}\n\n\t\t\tif (backop_flags) {\n\t\t\t\tif (ss->scan_cnt < ss->scan_cnt_max) {\n\t\t\t\t\tss->scan_cnt++;\n\t\t\t\t} else {\n\t\t\t\t\tmlmeext_assign_scan_backop_flags(pmlmeext, backop_flags);\n\t\t\t\t\tnext_state = SCAN_BACKING_OP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#endif /* CONFIG_SCAN_BACKOP */\n\t} else if (rtw_p2p_findphase_ex_is_needed(pwdinfo)) {\n\t\t/* go p2p listen */\n\t\tnext_state = SCAN_TO_P2P_LISTEN;\n\n\t#ifdef CONFIG_ANTENNA_DIVERSITY\n\t} else if (rtw_hal_antdiv_before_linked(padapter)) {\n\t\t/* go sw antdiv before link */\n\t\tnext_state = SCAN_SW_ANTDIV_BL;\n\t#endif\n\t} else {\n\t\tnext_state = SCAN_COMPLETE;\n\n\t\t#if defined(DBG_SCAN_SW_ANTDIV_BL)\n\t\t{\n\t\t\t/* for SCAN_SW_ANTDIV_BL state testing */\n\t\t\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\t\t\tint i;\n\t\t\tbool is_linked = _FALSE;\n\n\t\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\t\tif (rtw_linked_check(dvobj->padapters[i]))\n\t\t\t\t\tis_linked = _TRUE;\n\t\t\t}\n\n\t\t\tif (!is_linked) {\n\t\t\t\tstatic bool fake_sw_antdiv_bl_state = 0;\n\n\t\t\t\tif (fake_sw_antdiv_bl_state == 0) {\n\t\t\t\t\tnext_state = SCAN_SW_ANTDIV_BL;\n\t\t\t\t\tfake_sw_antdiv_bl_state = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfake_sw_antdiv_bl_state = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#endif /* defined(DBG_SCAN_SW_ANTDIV_BL) */\n\t}\n\n\t#ifdef CONFIG_SCAN_BACKOP\n\tif (next_state != SCAN_PROCESS)\n\t\tss->scan_cnt = 0;\n\t#endif\n\n\n#ifdef DBG_FIXED_CHAN\n\tif (pmlmeext->fixed_chan != 0xff && next_state == SCAN_PROCESS)\n\t\tscan_ch = pmlmeext->fixed_chan;\n#endif\n\n\tif (ch)\n\t\t*ch = scan_ch;\n\tif (type)\n\t\t*type = scan_type;\n\n\treturn next_state;\n}\n\nvoid site_survey(_adapter *padapter, u8 survey_channel, RT_SCAN_TYPE ScanType)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &(padapter->wdinfo);\n#endif\n\n\tif (survey_channel != 0) {\n\t\tset_channel_bwmode(padapter, survey_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\n\t\t#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\t\tif (ACS_ENABLE == GET_ACS_STATE(padapter)) {\n\t\t\tACS_OP acs_op = ACS_RESET;\n\n\t\t\trtw_hal_set_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &acs_op, _TRUE);\n\t\t\trtw_set_acs_channel(padapter, survey_channel);\n\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"]-set ch:%u\\n\",\n\t\t\t\tADPT_ARG(padapter), rtw_get_acs_channel(padapter));\n\t\t\t#endif\n\t\t}\n\t\t#endif\n\n\t\tif (ScanType == SCAN_ACTIVE) {\n\t\t\t#ifdef CONFIG_P2P\n\t\t\tif (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || \n\t\t\t\trtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)\n\t\t\t) {\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t} else\n\t\t\t#endif /* CONFIG_P2P */\n\t\t\t{\n\t\t\t\tint i;\n\n\t\t\t\tfor (i = 0; i < RTW_SSID_SCAN_AMOUNT; i++) {\n\t\t\t\t\tif (pmlmeext->sitesurvey_res.ssid[i].SsidLength) {\n\t\t\t\t\t\t/* IOT issue, When wifi_spec is not set, send one probe req without WPS IE. */\n\t\t\t\t\t\tif (padapter->registrypriv.wifi_spec)\n\t\t\t\t\t\t\tissue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tissue_probereq_ex(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL, 0, 0, 0, 0);\n\t\t\t\t\t\tissue_probereq(padapter, &(pmlmeext->sitesurvey_res.ssid[i]), NULL);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {\n\t\t\t\t\t/* IOT issue, When wifi_spec is not set, send one probe req without WPS IE. */\n\t\t\t\t\tif (padapter->registrypriv.wifi_spec)\n\t\t\t\t\t\tissue_probereq(padapter, NULL, NULL);\n\t\t\t\t\telse\n\t\t\t\t\t\tissue_probereq_ex(padapter, NULL, NULL, 0, 0, 0, 0);\n\t\t\t\t\tissue_probereq(padapter, NULL, NULL);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/* channel number is 0 or this channel is not valid. */\n\t\trtw_warn_on(1);\n\t}\n\n\treturn;\n}\n\nvoid survey_done_set_ch_bw(_adapter *padapter)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tu8 cur_channel = 0;\n\tu8 cur_bwmode;\n\tu8 cur_ch_offset;\n\t\n\tif (rtw_get_ch_setting_union(padapter, &cur_channel, &cur_bwmode, &cur_ch_offset) != 0) {\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);\n\t} else {\n\t\t#ifdef CONFIG_P2P\n\t\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\t\t_adapter *iface;\n\t\tint i;\n\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\tiface = dvobj->padapters[i];\n\t\t\tif (!iface)\n\t\t\t\tcontinue;\n\n\t\t\t#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif (iface->wdinfo.driver_interface == DRIVER_CFG80211 && !adapter_wdev_data(iface)->p2p_enabled)\n\t\t\t\tcontinue;\n\t\t\t#endif\n\n\t\t\tif (rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_LISTEN)) {\n\t\t\t\tcur_channel = iface->wdinfo.listen_channel;\n\t\t\t\tcur_bwmode = CHANNEL_WIDTH_20;\n\t\t\t\tcur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t\tif (0)\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to \"ADPT_FMT\"'s listen ch - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), ADPT_ARG(iface), cur_channel, cur_bwmode, cur_ch_offset);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t#endif /* CONFIG_P2P */\n\n\t\tif (cur_channel == 0) {\n\t\t\tcur_channel = pmlmeext->cur_channel;\n\t\t\tcur_bwmode = pmlmeext->cur_bwmode;\n\t\t\tcur_ch_offset = pmlmeext->cur_ch_offset;\n\t\t\tif (0)\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(padapter), cur_channel, cur_bwmode, cur_ch_offset);\n\t\t}\n\t}\n\n\tset_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode);\n}\n\n/**\n * sitesurvey_ps_annc - check and doing ps announcement for all the adapters of given @dvobj\n * @dvobj: the dvobj to check\n * @ps: power saving or not\n *\n * Returns: 0: no ps announcement is doing. 1: ps announcement is doing\n */\nu8 sitesurvey_ps_annc(struct dvobj_priv *dvobj, bool ps)\n{\n\t_adapter *adapter;\n\tint i;\n\tu8 ps_anc = 0;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tadapter = dvobj->padapters[i];\n\t\tif (!adapter)\n\t\t\tcontinue;\n\n\t\tif (ps) {\n\t\t\tif (is_client_associated_to_ap(adapter) == _TRUE) {\n\t\t\t\t/* TODO: TDLS peers */\n\t\t\t\tissue_nulldata(adapter, NULL, 1, 3, 500);\n\t\t\t\tps_anc = 1;\n\t\t\t}\n\t\t} else {\n\t\t\tif (is_client_associated_to_ap(adapter) == _TRUE) {\n\t\t\t\t/* TODO: TDLS peers */\n\t\t\t\tissue_nulldata(adapter, NULL, 0, 3, 500);\n\t\t\t\tps_anc = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ps_anc;\n}\n\nvoid sitesurvey_set_igi(_adapter *adapter, bool enter)\n{\n\tu8 igi;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &adapter->wdinfo;\n#endif\n\n\tif (enter) {\n#ifdef CONFIG_P2P\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tif (adapter_wdev_data(adapter)->p2p_enabled == _TRUE && pwdinfo->driver_interface == DRIVER_CFG80211)\n\t\t\tigi = 0x30;\n\t\telse\n#endif /* CONFIG_IOCTL_CFG80211 */\n\t\tif (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t\tigi = 0x28;\n\t\telse\n#endif /* CONFIG_P2P */\n\t\t\tigi = 0x1e;\n\t} else {\n\t\t\tigi = 0xff; /* restore RX GAIN */\n\t}\n\n\trtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE);\n}\n\nu8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tstruct sitesurvey_parm\t*pparm = (struct sitesurvey_parm *)pbuf;\n\tstruct dvobj_priv *dvobj = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &dvobj->drv_dbg;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct ss_res *ss = &pmlmeext->sitesurvey_res;\n\tu8 val8;\n\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n#endif\n\n#ifdef DBG_CHECK_FW_PS_STATE\n\tif (rtw_fw_ps_state(padapter) == _FAIL) {\n\t\tDBG_871X(\"scan without leave 32k\\n\");\n\t\tpdbgpriv->dbg_scan_pwr_state_cnt++;\n\t}\n#endif /* DBG_CHECK_FW_PS_STATE */\n\n\t/* increase channel idx */\n\tif (mlmeext_chk_scan_state(pmlmeext, SCAN_PROCESS))\n\t\tss->channel_idx++;\n\n\t/* update scan state to next state (assigned by previous cmd hdl) */\n\tif (mlmeext_scan_state(pmlmeext) != mlmeext_scan_next_state(pmlmeext))\n\t\tmlmeext_set_scan_state(pmlmeext, mlmeext_scan_next_state(pmlmeext));\n\noperation_by_state:\n\tswitch (mlmeext_scan_state(pmlmeext)) {\n\n\tcase SCAN_DISABLE:\n\t\t/* \n\t\t* SW parameter initialization\n\t\t*/\n\n\t\tsitesurvey_res_reset(padapter, pparm);\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_START);\n\t\tgoto operation_by_state;\n\n\tcase SCAN_START:\n\t\t/*\n\t\t* prepare to leave operating channel\n\t\t*/\n\n\t\t/* apply rx ampdu setting */\n\t\tif (ss->rx_ampdu_accept != RX_AMPDU_ACCEPT_INVALID\n\t\t\t|| ss->rx_ampdu_size != RX_AMPDU_SIZE_INVALID\n\t\t) {\n\t\t\trtw_rx_ampdu_apply(padapter);\n\t\t}\n\n\t\t/* clear HW TX queue before scan */\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0);\n\n\t\t/* power save state announcement */\n\t\tif (sitesurvey_ps_annc(adapter_to_dvobj(padapter), 1)) {\n\t\t\tmlmeext_set_scan_state(pmlmeext, SCAN_PS_ANNC_WAIT);\n\t\t\tmlmeext_set_scan_next_state(pmlmeext, SCAN_ENTER);\n\t\t\tset_survey_timer(pmlmeext, 50); /* delay 50ms to protect nulldata(1) */\n\t\t} else {\n\t\t\tmlmeext_set_scan_state(pmlmeext, SCAN_ENTER);\n\t\t\tgoto operation_by_state;\n\t\t}\n\n\t\tbreak;\n\n\tcase SCAN_ENTER:\n\t\t/*\n\t\t* HW register and DM setting for enter scan\n\t\t*/\n\n\t\t/* config the initial gain under scanning */\n\t\tsitesurvey_set_igi(padapter, 1);\n\t\t\n\t\t/* disable dynamic functions, such as high power, DIG */\n\t\trtw_phydm_ability_backup(padapter);\n\t\trtw_phydm_func_for_offchannel(padapter);\n\t\t\n\t\t/* set MSR to no link state */\n\t\tSet_MSR(padapter, _HW_STATE_NOLINK_);\n\t\tval8 = 1; /* under site survey */\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_PROCESS);\n\t\tgoto operation_by_state;\n\n\tcase SCAN_PROCESS:\n\t{\n\t\tu8 scan_ch;\n\t\tRT_SCAN_TYPE scan_type;\n\t\tu8 next_state;\n\t\tu32 scan_ms;\n\n\t\t#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\t\tif ((ACS_ENABLE == GET_ACS_STATE(padapter)) && (0 != rtw_get_acs_channel(padapter))) {\n\t\t\tACS_OP acs_op = ACS_SELECT;\n\n\t\t\trtw_hal_set_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &acs_op, _TRUE);\n\t\t}\n\t\t#endif\n\n\t\tnext_state = sitesurvey_pick_ch_behavior(padapter, &scan_ch, &scan_type);\n\t\tif (next_state != SCAN_PROCESS) {\n\t\t\t#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\t\t\tif (ACS_ENABLE == GET_ACS_STATE(padapter)) {\n\t\t\t\trtw_set_acs_channel(padapter, 0);\n\t\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"]-set ch:%u\\n\", ADPT_ARG(padapter), rtw_get_acs_channel(padapter));\n\t\t\t\t#endif\n\t\t\t}\n\t\t\t#endif\n\n\t\t\tmlmeext_set_scan_state(pmlmeext, next_state);\n\t\t\tgoto operation_by_state;\n\t\t}\n\n\t\t/* still SCAN_PROCESS state */\n\t\tif (0)\n\t\t\t#ifdef CONFIG_P2P\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" %s ch:%u (cnt:%u,idx:%d) at %dms, %c%c%c\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t\t, mlmeext_scan_state_str(pmlmeext)\n\t\t\t\t, scan_ch\n\t\t\t\t, pwdinfo->find_phase_state_exchange_cnt, ss->channel_idx\n\t\t\t\t, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time)\n\t\t\t\t, scan_type?'A':'P', ss->scan_mode?'A':'P'\n\t\t\t\t, ss->ssid[0].SsidLength?'S':' ' \n\t\t\t);\n\t\t\t#else\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" %s ch:%u (idx:%d) at %dms, %c%c%c\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t\t, mlmeext_scan_state_str(pmlmeext)\n\t\t\t\t, scan_ch\n\t\t\t\t, ss->channel_idx\n\t\t\t\t, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time)\n\t\t\t\t, scan_type?'A':'P', ss->scan_mode?'A':'P'\n\t\t\t\t, ss->ssid[0].SsidLength?'S':' '\n\t\t\t);\n\t\t\t#endif /* CONFIG_P2P */\n\n\t\t#ifdef DBG_FIXED_CHAN\n\t\tif (pmlmeext->fixed_chan != 0xff)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fixed_chan:%u\\n\", pmlmeext->fixed_chan);\n\t\t#endif\n\n\t\tsite_survey(padapter, scan_ch, scan_type);\n\n\t\t#if defined(CONFIG_ATMEL_RC_PATCH)\n\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\tscan_ms = 20;\n\t\telse\n\t\t\tscan_ms = 40;\n\t\t#else\n\t\tscan_ms = ss->scan_ch_ms;\n\t\t#endif\n\n\t\t#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)\n\t\tif (ss->is_sw_antdiv_bl_scan)\n\t\t\tscan_ms = scan_ms/2;\n\t\t#endif\n\n\t\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t\t{\n\t\t\tstruct noise_info info;\n\n\t\t\tinfo.bPauseDIG = _FALSE;\n\t\t\tinfo.IGIValue = 0;\n\t\t\tinfo.max_time = scan_ms/2;\n\t\t\tinfo.chan = scan_ch;\n\t\t\trtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &info, _FALSE); \n\t\t}\n\t\t#endif\n\n\t\tset_survey_timer(pmlmeext, scan_ms);\n\t\tbreak;\n\t}\n\n\t#ifdef CONFIG_SCAN_BACKOP\n\tcase SCAN_BACKING_OP:\n\t{\n\t\tu8 back_ch, back_bw, back_ch_offset;\n\n\t\tif (rtw_get_ch_setting_union(padapter, &back_ch, &back_bw, &back_ch_offset) == 0)\n\t\t\trtw_warn_on(1);\n\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" %s ch:%u, bw:%u, offset:%u at %dms\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(padapter)\n\t\t\t\t, mlmeext_scan_state_str(pmlmeext)\n\t\t\t\t, back_ch, back_bw, back_ch_offset\n\t\t\t\t, rtw_get_passing_time_ms(padapter->mlmepriv.scan_start_time)\n\t\t\t);\n\n\t\tset_channel_bwmode(padapter, back_ch, back_ch_offset, back_bw);\n\n\t\tSet_MSR(padapter, (pmlmeinfo->state & 0x3));\t\t\n\t\tval8 = 0; /* survey done */\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\n\t\tif (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) {\n\t\t\tsitesurvey_set_igi(padapter, 0);\n\t\t\tsitesurvey_ps_annc(adapter_to_dvobj(padapter), 0);\n\t\t}\n\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_BACK_OP);\n\t\tss->backop_time = rtw_get_current_time();\n\n\t\tif (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_TX_RESUME)) {\n\t\t\tint\ti;\n\n\t\t\t/* resume TX */\n\t\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\t\tif (!dvobj->padapters[i])\n\t\t\t\t\tcontinue;\n\n\t\t\t\trtw_os_xmit_schedule(dvobj->padapters[i]);\n\t\t\t}\n\t\t}\n\n\t\tgoto operation_by_state;\n\t}\n\t\n\tcase SCAN_BACK_OP:\n\t\tif (rtw_get_passing_time_ms(ss->backop_time) >= ss->backop_ms\n\t\t\t|| pmlmeext->scan_abort\n\t\t) {\n\t\t\tmlmeext_set_scan_state(pmlmeext, SCAN_LEAVING_OP);\n\t\t\tgoto operation_by_state;\n\t\t}\n\t\tset_survey_timer(pmlmeext, 50);\n\t\tbreak;\n\n\tcase SCAN_LEAVING_OP:\n\t\t/*\n\t\t* prepare to leave operating channel\n\t\t*/\n\n\t\t/* clear HW TX queue before scan */\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_CHECK_TXBUF, 0);\n\n\t\tif (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)\n\t\t\t&& sitesurvey_ps_annc(adapter_to_dvobj(padapter), 1)\n\t\t) {\n\t\t\tmlmeext_set_scan_state(pmlmeext, SCAN_PS_ANNC_WAIT);\n\t\t\tmlmeext_set_scan_next_state(pmlmeext, SCAN_LEAVE_OP);\n\t\t\tset_survey_timer(pmlmeext, 50); /* delay 50ms to protect nulldata(1) */\n\t\t} else {\n\t\t\tmlmeext_set_scan_state(pmlmeext, SCAN_LEAVE_OP);\n\t\t\tgoto operation_by_state;\n\t\t}\n\n\t\tbreak;\n\n\tcase SCAN_LEAVE_OP:\n\t\t/*\n\t\t* HW register and DM setting for enter scan\n\t\t*/\n\n\t\tif (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) {\n\t\t\t/* config the initial gain under scanning */\n\t\t\tsitesurvey_set_igi(padapter, 1);\n\t\t}\n\n\t\t/* set MSR to no link state */\n\t\tSet_MSR(padapter, _HW_STATE_NOLINK_);\n\t\tval8 = 1; //under site survey\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_PROCESS);\n\t\tgoto operation_by_state;\n\n\t#endif /* CONFIG_SCAN_BACKOP */\n\n\t#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)\n\tcase SCAN_SW_ANTDIV_BL:\n\t\t/*\n\t\t* 20100721\n\t\t* For SW antenna diversity before link, it needs to switch to another antenna and scan again.\n\t\t* It compares the scan result and select better one to do connection.\n\t\t*/\n\t\tss->bss_cnt = 0;\n\t\tss->channel_idx = 0;\n\t\tss->is_sw_antdiv_bl_scan = 1;\n\n\t\tmlmeext_set_scan_next_state(pmlmeext, SCAN_PROCESS);\n\t\tset_survey_timer(pmlmeext, ss->scan_ch_ms);\n\t\tbreak;\n\t#endif\n\n\t#ifdef CONFIG_P2P\n\tcase SCAN_TO_P2P_LISTEN:\n\t\t/*\n\t\t* Set the P2P State to the listen state of find phase\n\t\t* and set the current channel to the listen channel\n\t\t*/\n\t\tset_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);\n\t\n\t\t/* turn on phy-dynamic functions */\n\t\trtw_phydm_ability_restore(padapter);\n\n\t\tsitesurvey_set_igi(padapter, 0);\n\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_P2P_LISTEN);\n\t\t_set_timer(&pwdinfo->find_phase_timer, (u32)((u32)pwdinfo->listen_dwell * 100));\n\t\tbreak;\n\n\tcase SCAN_P2P_LISTEN:\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_PROCESS);\n\t\tss->channel_idx = 0;\n\t\tgoto operation_by_state;\n\t#endif /* CONFIG_P2P */\n\n\tcase SCAN_COMPLETE:\t\t\n\t\t#ifdef CONFIG_P2P\n\t\tif (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)\n\t\t\t|| rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)\n\t\t) {\n\t\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif (pwdinfo->driver_interface == DRIVER_WEXT) {\n\t\t\t\tif (check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t_set_timer(&pwdinfo->ap_p2p_switch_timer, 500);\n\t\t\t}\n\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\t\t#else\n\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\t\t#endif\n\t\t}\n\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\n\t\t#endif /* CONFIG_P2P */\n\n\t\t/* switch channel */\n\t\tsurvey_done_set_ch_bw(padapter);\n\n\t\t/* config MSR */\n\t\tSet_MSR(padapter, (pmlmeinfo->state & 0x3));\n\t\tval8 = 0; /* survey done */\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\n\t\t/* turn on phy-dynamic functions */\n\t\trtw_phydm_ability_restore(padapter);\n\n\t\tsitesurvey_set_igi(padapter, 0);\n\n\t\tsitesurvey_ps_annc(adapter_to_dvobj(padapter), 0);\n\n\t\t/* apply rx ampdu setting */\n\t\trtw_rx_ampdu_apply(padapter);\n\n\t\tmlmeext_set_scan_state(pmlmeext, SCAN_DISABLE);\n\n\t\treport_surveydone_event(padapter);\n\n\t\tissue_action_BSSCoexistPacket(padapter);\n\t\tissue_action_BSSCoexistPacket(padapter);\n\t\tissue_action_BSSCoexistPacket(padapter);\n\t}\n\n\treturn H2C_SUCCESS;\n}\n\nu8 setauth_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct setauth_parm\t\t*pparm = (struct setauth_parm *)pbuf;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tif (pparm->mode < 4)\n\t{\n\t\tpmlmeinfo->auth_algo = pparm->mode;\n\t}\n\n\treturn \tH2C_SUCCESS;\n}\n\nu8 setkey_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tu16\tctrl = 0;\n\ts16 cam_id = 0;\n\tstruct setkey_parm\t\t*pparm = (struct setkey_parm *)pbuf;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tunsigned char null_addr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\tstruct set_stakey_parm\tsta_pparm;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tu8 *addr;\n\tbool used;\n\n\t//main tx key for wep.\n\tif(pparm->set_tx)\n\t\tpmlmeinfo->key_index = pparm->keyid;\n\n\tcam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid, &used);\n\n\tif (cam_id < 0)\n\t\tgoto enable_mc;\n\n\tif (cam_id > 3) /* not default key, searched by A2 */\n\t\taddr = get_bssid(&padapter->mlmepriv);\n\telse\n\t\taddr = null_addr;\n\n\t#ifdef DYNAMIC_CAMID_ALLOC\n\t/* cam entry searched is pairwise key */\n\tif (used == _TRUE && rtw_camid_is_gk(padapter, cam_id) == _FALSE) {\n\t\ts16 camid_clr;\n\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" group key with \"MAC_FMT\" id:%u the same key id as pairwise key\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), MAC_ARG(addr), pparm->keyid);\n\n\t\t/* HW has problem to distinguish this group key with existing pairwise key, stop HW enc and dec for BMC */\n\t\trtw_camctl_set_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, NULL);\n\n\t\t/* clear group key */\n\t\twhile ((camid_clr = rtw_camid_search(padapter, addr, -1, 1)) >= 0) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"clear group key for addr:\"MAC_FMT\", camid:%d\\n\", MAC_ARG(addr), camid_clr);\n\t\t\tclear_cam_entry(padapter, camid_clr);\n\t\t\trtw_camid_free(padapter, camid_clr);\n\t\t}\n\n\t\tgoto enable_mc;\n\t}\n\t#endif\n\n\tctrl = BIT(15) | BIT6 | ((pparm->algorithm) << 2) | pparm->keyid;\n\tDBG_871X_LEVEL(_drv_always_, \"set group key camid:%d, addr:\"MAC_FMT\", kid:%d, type:%s\\n\"\n\t\t, cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm));\n\twrite_cam(padapter, cam_id, ctrl, addr, pparm->key);\n\n\t#ifdef DYNAMIC_CAMID_ALLOC\n\tif (cam_id >=0 && cam_id <=3)\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE);\n\t#endif\n\t/* 8814au should set both broadcast and unicast CAM entry for WEP key in STA mode */\n\tif (_rtw_camctl_chk_cap(padapter, SEC_CAP_CHK_BMC) && is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm)) {\n\t\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\n\t\tsta_pparm.algorithm = pparm->algorithm;\n\t\tsta_pparm.keyid = pparm->keyid;\n\t\t_rtw_memcpy(sta_pparm.key, pparm->key, 16);\n\t\t_rtw_memcpy(sta_pparm.addr, get_bssid(pmlmepriv), ETH_ALEN);\n\t\tset_stakey_hdl(padapter, (u8 *) &sta_pparm);\n\t}\n\nenable_mc:\n\t//allow multicast packets to driver\n\trtw_hal_set_hwreg(padapter, HW_VAR_ON_RCR_AM, null_addr);\n\n\treturn H2C_SUCCESS;\n}\n\nu8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tu16 ctrl = 0;\n\ts16 cam_id = 0;\n\tbool used;\n\tu8 ret = H2C_SUCCESS;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct set_stakey_parm\t*pparm = (struct set_stakey_parm *)pbuf;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta;\n\n\tif(pparm->algorithm == _NO_PRIVACY_)\n\t\tgoto write_to_cam;\n\n\tpsta = rtw_get_stainfo(pstapriv, pparm->addr);\n\tif (!psta) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s sta:\"MAC_FMT\" not found\\n\", __func__, MAC_ARG(pparm->addr));\n\t\tret = H2C_REJECTED;\n\t\tgoto exit;\n\t}\n\n\tpmlmeinfo->enc_algo = pparm->algorithm;\n\tcam_id = rtw_camid_alloc(padapter, psta, 0, &used);\n\tif (cam_id < 0)\n\t\tgoto exit;\n\n\t#ifdef DYNAMIC_CAMID_ALLOC\n\t/* cam entry searched is group key */\n\tif (used == _TRUE && rtw_camid_is_gk(padapter, cam_id) == _TRUE) {\n\t\ts16 camid_clr;\n\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" pairwise key with \"MAC_FMT\" id:%u the same key id as group key\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), MAC_ARG(pparm->addr), pparm->keyid);\n\n\t\t/* HW has problem to distinguish this pairwise key with existing group key, stop HW enc and dec for BMC */\n\t\trtw_camctl_set_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, NULL);\n\n\t\t/* clear group key */\n\t\twhile ((camid_clr = rtw_camid_search(padapter, pparm->addr, -1, 1)) >= 0) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"clear group key for addr:\"MAC_FMT\", camid:%d\\n\", MAC_ARG(pparm->addr), camid_clr);\n\t\t\tclear_cam_entry(padapter, camid_clr);\n\t\t\trtw_camid_free(padapter, camid_clr);\n\t\t}\n\t}\n\t#endif\n\nwrite_to_cam:\n\tif(pparm->algorithm == _NO_PRIVACY_) {\n\t\twhile ((cam_id = rtw_camid_search(padapter, pparm->addr, -1, -1)) >= 0) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"clear key for addr:\"MAC_FMT\", camid:%d\\n\", MAC_ARG(pparm->addr), cam_id);\n\t\t\tclear_cam_entry(padapter, cam_id);\n\t\t\trtw_camid_free(padapter,cam_id);\n\t\t}\n\t} else {\n\t\tDBG_871X_LEVEL(_drv_always_, \"set pairwise key camid:%d, addr:\"MAC_FMT\", kid:%d, type:%s\\n\",\n\t\t\tcam_id, MAC_ARG(pparm->addr), pparm->keyid, security_type_str(pparm->algorithm));\n\t\tctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;\n\t\twrite_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);\n\t}\n\tret = H2C_SUCCESS_RSP;\n\nexit:\n\treturn ret;\n}\n\nu8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct addBaReq_parm \t*pparm = (struct addBaReq_parm *)pbuf;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tstruct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, pparm->addr);\n\t\n\tif(!psta)\n\t\treturn \tH2C_SUCCESS;\n\t\t\n#ifdef CONFIG_80211N_HT\n\tif (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) ||\n\t\t((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t{\n\t\t//pmlmeinfo->ADDBA_retry_count = 0;\n\t\t//pmlmeinfo->candidate_tid_bitmap |= (0x1 << pparm->tid);\t\t\n\t\t//psta->htpriv.candidate_tid_bitmap |= BIT(pparm->tid);\n\t\tissue_addba_req(padapter, pparm->addr, (u8)pparm->tid);\n\t\t//_set_timer(&pmlmeext->ADDBA_timer, ADDBA_TO);\n\t\t_set_timer(&psta->addba_retry_timer, ADDBA_TO);\n\t}\n#ifdef CONFIG_TDLS\n\telse if((psta->tdls_sta_state & TDLS_LINKED_STATE)&& \n\t\t(psta->htpriv.ht_option==_TRUE) && \n\t\t(psta->htpriv.ampdu_enable==_TRUE) )\n\t{\n\t\tissue_addba_req(padapter, pparm->addr, (u8)pparm->tid);\n\t\t_set_timer(&psta->addba_retry_timer, ADDBA_TO);\n\t}\n#endif //CONFIG\n\telse\n\t{\t\t\n\t\tpsta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid);\t\t\n\t}\n#endif //CONFIG_80211N_HT\n\treturn \tH2C_SUCCESS;\n}\n\n\nu8 chk_bmc_sleepq_cmd(_adapter* padapter)\n{\n\tstruct cmd_obj *ph2c;\n\tstruct cmd_priv *pcmdpriv = &(padapter->cmdpriv);\n\tu8 res = _SUCCESS;\n\n_func_enter_;\n\n\tif ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tinit_h2fwcmd_w_parm_no_parm_rsp(ph2c, GEN_CMD_CODE(_ChkBMCSleepq));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\nu8 set_tx_beacon_cmd(_adapter* padapter)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct Tx_Beacon_param \t*ptxBeacon_parm;\t\n\tstruct cmd_priv\t*pcmdpriv = &(padapter->cmdpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tres = _SUCCESS;\n\tint len_diff = 0;\n\t\n_func_enter_;\t\n\n\tif ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL)\n\t{\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct\tcmd_obj));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));\n\n\tlen_diff = update_hidden_ssid(\n\t\tptxBeacon_parm->network.IEs+_BEACON_IE_OFFSET_\n\t\t, ptxBeacon_parm->network.IELength-_BEACON_IE_OFFSET_\n\t\t, pmlmeinfo->hidden_ssid_mode\n\t);\n\tptxBeacon_parm->network.IELength += len_diff;\n\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon));\n\n\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n}\n\n\nu8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tu8 evt_code, evt_seq;\n\tu16 evt_sz;\n\tuint \t*peventbuf;\n\tvoid (*event_callback)(_adapter *dev, u8 *pbuf);\n\tstruct evt_priv *pevt_priv = &(padapter->evtpriv);\n\n\tif (pbuf == NULL)\n\t\tgoto _abort_event_;\n\n\tpeventbuf = (uint*)pbuf;\n\tevt_sz = (u16)(*peventbuf&0xffff);\n\tevt_seq = (u8)((*peventbuf>>24)&0x7f);\n\tevt_code = (u8)((*peventbuf>>16)&0xff);\n\t\n\t\t\n\t#ifdef CHECK_EVENT_SEQ\n\t// checking event sequence...\t\t\n\tif (evt_seq != (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f) )\n\t{\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(\"Evetn Seq Error! %d vs %d\\n\", (evt_seq & 0x7f), (ATOMIC_READ(&pevt_priv->event_seq) & 0x7f)));\n\t\n\t\tpevt_priv->event_seq = (evt_seq+1)&0x7f;\n\n\t\tgoto _abort_event_;\n\t}\n\t#endif\n\n\t// checking if event code is valid\n\tif (evt_code >= MAX_C2HEVT)\n\t{\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\nEvent Code(%d) mismatch!\\n\", evt_code));\n\t\tgoto _abort_event_;\n\t}\n\n\t// checking if event size match the event parm size\t\n\tif ((wlanevents[evt_code].parmsize != 0) && \n\t\t\t(wlanevents[evt_code].parmsize != evt_sz))\n\t{\n\t\t\t\n\t\tRT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,(\"\\nEvent(%d) Parm Size mismatch (%d vs %d)!\\n\", \n\t\t\tevt_code, wlanevents[evt_code].parmsize, evt_sz));\n\t\tgoto _abort_event_;\t\n\t\t\t\n\t}\n\n\tATOMIC_INC(&pevt_priv->event_seq);\n\n\tpeventbuf += 2;\n\t\t\t\t\n\tif(peventbuf)\n\t{\n\t\tevent_callback = wlanevents[evt_code].event_callback;\n\t\tevent_callback(padapter, (u8*)peventbuf);\n\n\t\tpevt_priv->evt_done_cnt++;\n\t}\n\n\n_abort_event_:\n\n\n\treturn H2C_SUCCESS;\n\t\t\n}\n\nu8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\treturn H2C_SUCCESS;\n}\n\nu8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n#ifdef CONFIG_AP_MODE\n\t_irqL irqL;\n\tstruct sta_info *psta_bmc;\n\t_list\t*xmitframe_plist, *xmitframe_phead;\n\tstruct xmit_frame *pxmitframe=NULL;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct sta_priv  *pstapriv = &padapter->stapriv;\n\n\t//for BC/MC Frames\n\tpsta_bmc = rtw_get_bcmc_stainfo(padapter);\n\tif(!psta_bmc)\n\t\treturn H2C_SUCCESS;\n\n\tif((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))\n\t{\n#ifndef CONFIG_PCI_HCI\n\t\trtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows\n#endif\n\t\t//_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\t\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\t\txmitframe_phead = get_list_head(&psta_bmc->sleep_q);\n\t\txmitframe_plist = get_next(xmitframe_phead);\n\n\t\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t\t{\n\t\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\t\trtw_list_delete(&pxmitframe->list);\n\n\t\t\tpsta_bmc->sleepq_len--;\n\t\t\tif(psta_bmc->sleepq_len>0)\n\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\telse\n\t\t\t\tpxmitframe->attrib.mdata = 0;\n\n\t\t\tpxmitframe->attrib.triggered=1;\n\n\t\t\tif (xmitframe_hiq_filter(pxmitframe) == _TRUE)\n\t\t\t\tpxmitframe->attrib.qsel = QSLT_HIGH;//HIQ\n\n\t\t\t#if 0\n\t\t\t_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\t\t\tif(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)\n\t\t\t{\n\t\t\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\t\t\t}\n\t\t\t_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\t\t\t#endif\n\t\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\t\t}\n\n\t\t//_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n\t\tif (rtw_get_intf_type(padapter) != RTW_PCIE) {\n\t\t\t/* check hi queue and bmc_sleepq */\n\t\t\trtw_chk_hi_queue_cmd(padapter);\n\t\t}\n\t}\n#endif\n\n\treturn H2C_SUCCESS;\n}\n\nu8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tif(send_beacon(padapter)==_FAIL)\n\t{\n\t\tDBG_871X(\"issue_beacon, fail!\\n\");\n\t\treturn H2C_PARAMETERS_ERROR;\n\t}\n\n\n\tif (padapter->registrypriv.wifi_spec == 1)\n\t\treturn H2C_SUCCESS;\n\t\n\t/* tx bc/mc frames after update TIM */\n\tchk_bmc_sleepq_hdl(padapter, NULL);\n\n\treturn H2C_SUCCESS;\n}\n\n/*\n* according to channel\n* add/remove WLAN_BSSID_EX.IEs's ERP ie\n* set WLAN_BSSID_EX.SupportedRates\n* update WLAN_BSSID_EX.IEs's Supported Rate and Extended Supported Rate ie\n*/\nvoid change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch)\n{\n\tu8\tnetwork_type,rate_len, total_rate_len,remainder_rate_len;\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\terpinfo=0x4;\n\n\tif (ch >= 36) {\n\t\tnetwork_type = WIRELESS_11A;\n\t\ttotal_rate_len = IEEE80211_NUM_OFDM_RATESLEN;\n\t\trtw_remove_bcn_ie(padapter, pnetwork, _ERPINFO_IE_);\n\t} else {\n\t\tnetwork_type = WIRELESS_11BG;\n\t\ttotal_rate_len = IEEE80211_CCK_RATE_LEN+IEEE80211_NUM_OFDM_RATESLEN;\n\t\trtw_add_bcn_ie(padapter, pnetwork, _ERPINFO_IE_, &erpinfo, 1);\n\t}\n\n\trtw_set_supported_rate(pnetwork->SupportedRates, network_type);\n\n\tUpdateBrateTbl(padapter, pnetwork->SupportedRates);\n\n\tif(total_rate_len > 8)\n\t{\n\t\trate_len = 8;\n\t\tremainder_rate_len = total_rate_len - 8;\n\t}\n\telse\n\t{\n\t\trate_len = total_rate_len;\n\t\tremainder_rate_len = 0;\n\t}\n\n\trtw_add_bcn_ie(padapter, pnetwork, _SUPPORTEDRATES_IE_, pnetwork->SupportedRates, rate_len);\n\n\tif(remainder_rate_len)\n\t{\n\t\trtw_add_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_, (pnetwork->SupportedRates+8), remainder_rate_len);\n\t}\n\telse\n\t{\n\t\trtw_remove_bcn_ie(padapter, pnetwork, _EXT_SUPPORTEDRATES_IE_);\n\t}\n\n\tpnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork);\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\nsint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state)\n{\n\tPADAPTER pbuddy_adapter;\n\tstruct mlme_ext_priv *pbuddy_mlmeext;\n\tstruct mlme_ext_info *pbuddy_mlmeinfo;\n\n\tif(padapter == NULL)\n\t\treturn _FALSE;\t\n\t\n\tpbuddy_adapter = padapter->pbuddy_adapter;\n\n\tif(pbuddy_adapter == NULL)\n\t\treturn _FALSE;\t\n\n\n\tpbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\tpbuddy_mlmeinfo = &(pbuddy_mlmeext->mlmext_info);\n\t\t\n\tif((pbuddy_mlmeinfo->state&0x03) == state)\n\t\treturn _TRUE;\t\t\n\n\treturn _FALSE;\n\t\n}\n#endif /* CONFIG_CONCURRENT_MODE */\n\nvoid rtw_join_done_chk_ch(_adapter *adapter, int join_res)\n{\n#define DUMP_ADAPTERS_STATUS 0\n\n\tstruct dvobj_priv *dvobj;\n\t_adapter *iface;\n\tstruct mlme_priv *mlme;\n\tstruct mlme_ext_priv *mlmeext;\n\tu8 u_ch, u_offset, u_bw;\n\tint i;\n\n\tdvobj = adapter_to_dvobj(adapter);\n\n\tif (DUMP_ADAPTERS_STATUS) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" enter\\n\", FUNC_ADPT_ARG(adapter));\n\t\tdump_adapters_status(RTW_DBGDUMP , dvobj);\n\t}\n\n\tif (join_res >= 0) {\n\t\tif (rtw_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset) <= 0) {\n\t\t\tdump_adapters_status(RTW_DBGDUMP , dvobj);\n\t\t\trtw_warn_on(1);\n\t\t}\n\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\tiface = dvobj->padapters[i];\n\t\t\tmlme = &iface->mlmepriv;\n\t\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\t\tif (!iface || iface == adapter)\n\t\t\t\tcontinue;\n\n\t\t\tif (check_fwstate(mlme, WIFI_AP_STATE)\n\t\t\t\t&& check_fwstate(mlme, WIFI_ASOC_STATE)\n\t\t\t) {\n\t\t\t\tbool is_grouped = rtw_is_chbw_grouped(u_ch, u_bw, u_offset\n\t\t\t\t\t, mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset);\n\n\t\t\t\tif (is_grouped == _FALSE) {\n\t\t\t\t\t/* handle AP which need to switch ch setting */\n\n\t\t\t\t\t/* restore original bw, adjust bw by registry setting on target ch */\n\t\t\t\t\tmlmeext->cur_bwmode = mlme->ori_bw;\n\t\t\t\t\tmlmeext->cur_channel = u_ch;\n\t\t\t\t\trtw_adjust_chbw(iface\n\t\t\t\t\t\t, mlmeext->cur_channel, &mlmeext->cur_bwmode, &mlmeext->cur_ch_offset);\n\t\t\t\t\t\n\t\t\t\t\trtw_sync_chbw(&mlmeext->cur_channel, &mlmeext->cur_bwmode, &mlmeext->cur_ch_offset\n\t\t\t\t\t\t, &u_ch, &u_bw, &u_offset);\n\n\t\t\t\t\trtw_ap_update_bss_chbw(iface, &(mlmeext->mlmext_info.network)\n\t\t\t\t\t\t, mlmeext->cur_channel, mlmeext->cur_bwmode, mlmeext->cur_ch_offset);\n\n\t\t\t\t\t_rtw_memcpy(&(mlme->cur_network.network), &(mlmeext->mlmext_info.network), sizeof(WLAN_BSSID_EX));\n\n\t\t\t\t\trtw_start_bss_hdl_after_chbw_decided(iface);\n\t\t\t\t}\n\n\t\t\t\tupdate_beacon(iface, 0, NULL, _TRUE);\n\t\t\t}\n\n\t\t\tclr_fwstate(mlme, WIFI_OP_CH_SWITCHING);\n\t\t}\n\n\t\t#ifdef CONFIG_DFS_MASTER\n\t\trtw_dfs_master_status_apply(adapter, MLME_STA_CONNECTED);\n\t\t#endif\n\t} else {\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\tiface = dvobj->padapters[i];\n\t\t\tmlme = &iface->mlmepriv;\n\t\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\t\tif (!iface || iface == adapter)\n\t\t\t\tcontinue;\n\n\t\t\tif (check_fwstate(mlme, WIFI_AP_STATE)\n\t\t\t\t&& check_fwstate(mlme, WIFI_ASOC_STATE))\n\t\t\t\tupdate_beacon(iface, 0, NULL, _TRUE);\n\n\t\t\tclr_fwstate(mlme, WIFI_OP_CH_SWITCHING);\n\t\t}\n\t\t#ifdef CONFIG_DFS_MASTER\n\t\trtw_dfs_master_status_apply(adapter, MLME_STA_DISCONNECTED);\n\t\t#endif\n\t}\n\n\tif (rtw_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset))\n\t\tset_channel_bwmode(adapter, u_ch, u_offset, u_bw);\n\n\tif (DUMP_ADAPTERS_STATUS) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" exit\\n\", FUNC_ADPT_ARG(adapter));\n\t\tdump_adapters_status(RTW_DBGDUMP , dvobj);\n\t}\n}\n\nint rtw_chk_start_clnt_join(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)\n{\n\tbool chbw_allow = _TRUE;\n\tbool connect_allow = _TRUE;\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tu8 cur_ch, cur_bw, cur_ch_offset;\n\tu8 u_ch, u_offset, u_bw;\n\n\tu_ch = cur_ch = pmlmeext->cur_channel;\n\tu_bw = cur_bw = pmlmeext->cur_bwmode;\n\tu_offset = cur_ch_offset = pmlmeext->cur_ch_offset;\n\n\tif (!ch || !bw || !offset) {\n\t\tconnect_allow = _FALSE;\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (cur_ch == 0) {\n\t\tconnect_allow = _FALSE;\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" cur_ch:%u\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), cur_ch);\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\tDBG_871X(FUNC_ADPT_FMT\" req: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\n#ifdef CONFIG_CONCURRENT_MODE\n{\n\tstruct dvobj_priv *dvobj;\n\t_adapter *iface;\n\tstruct mlme_priv *mlme;\n\tstruct mlme_ext_priv *mlmeext;\n\tu8 sta_num;\n\tu8 ld_sta_num;\n\tu8 lg_sta_num;\n\tu8 ap_num;\n\tu8 ld_ap_num;\n\tint i;\n\n\tdvobj = adapter_to_dvobj(adapter);\n\n\trtw_dev_iface_status_no_self(adapter, &sta_num, &ld_sta_num, &lg_sta_num, &ap_num, &ld_ap_num);\n\tDBG_871X(FUNC_ADPT_FMT\" ld_sta_num:%u, ap_num:%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), ld_sta_num, ap_num);\n\n\tif (!ld_sta_num && !ap_num) {\n\t\t/* consider linking STA? */\n\t\tgoto connect_allow_hdl;\n\t}\n\n\tif (rtw_get_ch_setting_union_no_self(adapter, &u_ch, &u_bw, &u_offset) <= 0) {\n\t\tdump_adapters_status(RTW_DBGDUMP , dvobj);\n\t\trtw_warn_on(1);\n\t}\n\tDBG_871X(FUNC_ADPT_FMT\" union no self: %u,%u,%u\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\n\t/* chbw_allow? */\n\tchbw_allow = rtw_is_chbw_grouped(pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset\n\t\t, u_ch, u_bw, u_offset);\n\n\tDBG_871X(FUNC_ADPT_FMT\" chbw_allow:%d\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), chbw_allow);\n\n\tif (chbw_allow == _TRUE) {\n\t\trtw_sync_chbw(&cur_ch, &cur_bw, &cur_ch_offset, &u_ch, &u_bw, &u_offset);\n\t\trtw_warn_on(cur_ch != pmlmeext->cur_channel);\n\t\trtw_warn_on(cur_bw != pmlmeext->cur_bwmode);\n\t\trtw_warn_on(cur_ch_offset != pmlmeext->cur_ch_offset);\n\t\tgoto connect_allow_hdl;\n\t}\n\n\t/* chbw_allow is _FALSE, connect allow? */\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tiface = dvobj->padapters[i];\n\t\tmlme = &iface->mlmepriv;\n\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\t#ifdef CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT\n\t\tif (check_fwstate(mlme, WIFI_STATION_STATE)\n\t\t\t&& check_fwstate(mlme, WIFI_ASOC_STATE)\n\t\t\t#if defined(CONFIG_P2P)\n\t\t\t&& rtw_p2p_chk_state(&(iface->wdinfo), P2P_STATE_NONE)\n\t\t\t#endif\n\t\t) {\n\t\t\tconnect_allow = _FALSE;\n\t\t\tbreak;\n\t\t}\n\t\t#endif /* CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT */\n\t}\n\tDBG_871X(FUNC_ADPT_FMT\" connect_allow:%d\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), connect_allow);\n\n\tif (connect_allow == _FALSE)\n\t\tgoto exit;\n\nconnect_allow_hdl:\n\t/* connect_allow == _TRUE */\n\n\t#ifdef CONFIG_DFS_MASTER\n\trtw_dfs_master_status_apply(adapter, MLME_STA_CONNECTING);\n\t#endif\n\n\tif (chbw_allow == _FALSE) {\n\t\tu_ch = cur_ch;\n\t\tu_bw = cur_bw;\n\t\tu_offset = cur_ch_offset;\n\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\tiface = dvobj->padapters[i];\n\t\t\tmlme = &iface->mlmepriv;\n\t\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\t\tif (!iface || iface == adapter)\n\t\t\t\tcontinue;\n\n\t\t\tif (check_fwstate(mlme, WIFI_AP_STATE)\n\t\t\t\t&& check_fwstate(mlme, WIFI_ASOC_STATE)\n\t\t\t) {\n\t\t\t\t#ifdef CONFIG_SPCT_CH_SWITCH\n\t\t\t\tif (1)\n\t\t\t\t\trtw_ap_inform_ch_switch(iface, pmlmeext->cur_channel , pmlmeext->cur_ch_offset);\n\t\t\t\telse\n\t\t\t\t#endif\n\t\t\t\t\trtw_sta_flush(iface, _FALSE);\n\n\t\t\t\trtw_hal_set_hwreg(iface, HW_VAR_CHECK_TXBUF, 0);\n\t\t\t\tset_fwstate(mlme, WIFI_OP_CH_SWITCHING);\n\t\t\t} else if (check_fwstate(mlme, WIFI_STATION_STATE)\n\t\t\t\t&& check_fwstate(mlme, WIFI_ASOC_STATE)\n\t\t\t) {\n\t\t\t\trtw_disassoc_cmd(iface, 500, _FALSE);\n\t\t\t\trtw_indicate_disconnect(iface);\n\t\t\t\trtw_free_assoc_resources(iface, 1);\n\t\t\t}\n\t\t}\n\t}\n}\n#endif /* CONFIG_CONCURRENT_MODE */\n\nexit:\n\n\tif (connect_allow == _TRUE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" union: %u,%u,%u\\n\", FUNC_ADPT_ARG(adapter), u_ch, u_bw, u_offset);\n\t\t*ch = u_ch;\n\t\t*bw = u_bw;\n\t\t*offset = u_offset;\n\t}\n\n\treturn connect_allow == _TRUE ? _SUCCESS : _FAIL;\n}\n\n/* Find union about ch, bw, ch_offset of all linked/linking interfaces */\nint _rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset, bool include_self)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\t_adapter *iface;\n\tstruct mlme_ext_priv *mlmeext;\n\tint i;\n\tu8 ch_ret = 0;\n\tu8 bw_ret = CHANNEL_WIDTH_20;\n\tu8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tint num = 0;\n\n\tif (ch) *ch = 0;\n\tif (bw) *bw = CHANNEL_WIDTH_20;\n\tif (offset) *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\tfor (i = 0; i<dvobj->iface_nums; i++) {\n\t\tiface = dvobj->padapters[i];\n\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\tif (!check_fwstate(&iface->mlmepriv, _FW_LINKED|_FW_UNDER_LINKING))\n\t\t\tcontinue;\n\n\t\tif (check_fwstate(&iface->mlmepriv, WIFI_OP_CH_SWITCHING))\n\t\t\tcontinue;\n\n\t\tif (include_self == _FALSE && adapter == iface)\n\t\t\tcontinue;\n\n\t\tif (num == 0) {\n\t\t\tch_ret = mlmeext->cur_channel;\n\t\t\tbw_ret = mlmeext->cur_bwmode;\n\t\t\toffset_ret = mlmeext->cur_ch_offset;\n\t\t\tnum++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch_ret != mlmeext->cur_channel) {\n\t\t\tnum = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (bw_ret < mlmeext->cur_bwmode) {\n\t\t\tbw_ret = mlmeext->cur_bwmode;\n\t\t\toffset_ret = mlmeext->cur_ch_offset;\n\t\t} else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) {\n\t\t\tnum = 0;\n\t\t\tbreak;\n\t\t}\n\n\t\tnum++;\n\t}\n\n\tif (num) {\n\t\tif (ch) *ch = ch_ret;\n\t\tif (bw) *bw = bw_ret;\n\t\tif (offset) *offset = offset_ret;\n\t}\n\n\treturn num;\n}\n\ninline int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)\n{\n\treturn _rtw_get_ch_setting_union(adapter, ch, bw, offset, 1);\n}\n\ninline int rtw_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)\n{\n\treturn _rtw_get_ch_setting_union(adapter, ch, bw, offset, 0);\n}\n\nvoid _rtw_dev_iface_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num\n\t, u8 *ap_num, u8 *ld_ap_num, bool include_self)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\t_adapter *iface;\n\tstruct mlme_ext_priv *mlmeext;\n\tstruct mlme_ext_info *mlmeextinfo;\n\tint i;\n\tu8 sta_num_ret = 0;\n\tu8 ld_sta_num_ret = 0;\n\tu8 lg_sta_num_ret = 0;\n\tu8 ap_num_ret = 0;\n\tu8 ld_ap_num_ret = 0;\n\n\tif (sta_num)\n\t\t*sta_num = 0;\n\tif (ld_sta_num)\n\t\t*ld_sta_num = 0;\n\tif (lg_sta_num)\n\t\t*lg_sta_num = 0;\n\tif (ap_num)\n\t\t*ap_num = 0;\n\tif (ld_ap_num)\n\t\t*ld_ap_num = 0;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tiface = dvobj->padapters[i];\n\n\t\tif (include_self == _FALSE && iface == adapter)\n\t\t\tcontinue;\n\n\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\tif (mlmeext_msr(mlmeext) == WIFI_FW_STATION_STATE) {\n\t\t\tsta_num_ret++;\n\t\t\tif (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t\tld_sta_num_ret++;\n\t\t\tif (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE)\n\t\t\t\tlg_sta_num_ret++;\n\t\t}\n\n\t\tif (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE\n\t\t\t&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE\n\t\t) {\n\t\t\tap_num_ret++;\n\t\t\tif (iface->stapriv.asoc_sta_count > 2)\n\t\t\t\tld_ap_num_ret++;\n\t\t}\n\t}\n\n\tif (sta_num)\n\t\t*sta_num = sta_num_ret;\n\tif (ld_sta_num)\n\t\t*ld_sta_num = ld_sta_num_ret;\n\tif (lg_sta_num)\n\t\t*lg_sta_num = lg_sta_num_ret;\n\tif (ap_num)\n\t\t*ap_num = ap_num_ret;\n\tif (ld_ap_num)\n\t\t*ld_ap_num = ld_ap_num_ret;\n}\n\ninline void rtw_dev_iface_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num\n\t, u8 *ap_num, u8 *ld_ap_num)\n{\n\treturn _rtw_dev_iface_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, 1);\n}\n\ninline void rtw_dev_iface_status_no_self(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num\n\t, u8 *ap_num, u8 *ld_ap_num)\n{\n\treturn _rtw_dev_iface_status(adapter, sta_num, ld_sta_num, lg_sta_num, ap_num, ld_ap_num, 0);\n}\n\nu8 set_ch_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tstruct set_ch_parm *set_ch_parm;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tset_ch_parm = (struct set_ch_parm *)pbuf;\n\n\tDBG_871X(FUNC_NDEV_FMT\" ch:%u, bw:%u, ch_offset:%u\\n\",\n\t\tFUNC_NDEV_ARG(padapter->pnetdev),\n\t\tset_ch_parm->ch, set_ch_parm->bw, set_ch_parm->ch_offset);\n\n\tpmlmeext->cur_channel = set_ch_parm->ch;\n\tpmlmeext->cur_ch_offset = set_ch_parm->ch_offset;\n\tpmlmeext->cur_bwmode = set_ch_parm->bw;\n\n\tset_channel_bwmode(padapter, set_ch_parm->ch, set_ch_parm->ch_offset, set_ch_parm->bw);\n\n\treturn \tH2C_SUCCESS;\n}\n\nu8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct SetChannelPlan_param *setChannelPlan_param;\n\tstruct mlme_priv *mlme = &padapter->mlmepriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tsetChannelPlan_param = (struct SetChannelPlan_param *)pbuf;\n\n\tif(!rtw_is_channel_plan_valid(setChannelPlan_param->channel_plan)) {\n\t\treturn H2C_PARAMETERS_ERROR;\n\t}\n\n\tmlme->ChannelPlan = setChannelPlan_param->channel_plan;\n\n\tpmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set);\n\tinit_channel_list(padapter, pmlmeext->channel_set, pmlmeext->max_chan_nums, &pmlmeext->channel_list);\t\n\n\trtw_hal_set_odm_var(padapter,HAL_ODM_REGULATION,NULL,_TRUE);\n\t\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_reg_notify_by_driver(padapter);\n#endif //CONFIG_IOCTL_CFG80211\n\n\treturn \tH2C_SUCCESS;\n}\n\nu8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n\tstruct LedBlink_param *ledBlink_param;\n\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tledBlink_param = (struct LedBlink_param *)pbuf;\n\n\t#ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD\n\tBlinkHandler((PLED_DATA)ledBlink_param->pLed);\n\t#endif\n\n\treturn \tH2C_SUCCESS;\n}\n\nu8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n#ifdef CONFIG_DFS\n\tstruct SetChannelSwitch_param *setChannelSwitch_param;\n\tu8 new_ch_no;\n\tu8 gval8 = 0x00, sval8 = 0xff;\n\n\tif(!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tsetChannelSwitch_param = (struct SetChannelSwitch_param *)pbuf;\n\tnew_ch_no = setChannelSwitch_param->new_ch_no;\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_TXPAUSE, &gval8);\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &sval8);\n\n\tDBG_871X(\"DFS detected! Swiching channel to %d!\\n\", new_ch_no);\n\tSelectChannel(padapter, new_ch_no);\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &gval8);\n\n\trtw_disassoc_cmd(padapter, 0, _FALSE);\n\trtw_indicate_disconnect(padapter);\n\trtw_free_assoc_resources(padapter, 1);\n\trtw_free_network_queue(padapter, _TRUE);\n\n\tif ( ((new_ch_no >= 52) && (new_ch_no <= 64)) ||((new_ch_no >= 100) && (new_ch_no <= 140)) ) {\n\t\tDBG_871X(\"Switched to DFS band (ch %02x) again!!\\n\", new_ch_no);\n\t}\n\n\treturn \tH2C_SUCCESS;\n#else\n\treturn\tH2C_REJECTED;\n#endif //CONFIG_DFS\n\n}\n\nu8 tdls_hdl(_adapter *padapter, unsigned char *pbuf)\n{\n#ifdef CONFIG_TDLS\n\t_irqL irqL;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n#ifdef CONFIG_TDLS_CH_SW\t\n\tstruct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info;\n#endif\n\tstruct TDLSoption_param *TDLSoption;\n\tstruct sta_info *ptdls_sta = NULL;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;\n\tu8 survey_channel, i, min, option;\n\tstruct tdls_txmgmt txmgmt;\n\tu32 setchtime, resp_sleep = 0, wait_time;\n\tu8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\n\tif (!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tTDLSoption = (struct TDLSoption_param *)pbuf;\n\toption = TDLSoption->option;\n\n\tif (!_rtw_memcmp(TDLSoption->addr, zaddr, ETH_ALEN)) {\n\t\tptdls_sta = rtw_get_stainfo( &(padapter->stapriv), TDLSoption->addr );\n\t\tif (ptdls_sta == NULL) {\n\t\t\treturn H2C_REJECTED;\n\t\t}\n\t} else {\n\t\tif (!(option == TDLS_RS_RCR || option == TDLS_CH_SW_BACK))\n\t\t\treturn H2C_REJECTED;\n\t}\n\n\t//_enter_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);\n\t//DBG_871X(\"[%s] option:%d\\n\", __FUNCTION__, option);\n\t\t\n\tswitch (option) {\n\tcase TDLS_ESTABLISHED:\n\t{\n\t\t/* As long as TDLS handshake success, we should set RCR_CBSSID_DATA bit to 0 */\n\t\t/* So we can receive all kinds of data frames. */\n\t\tu8 sta_band = 0;\n\n\t\t//leave ALL PS when TDLS is established\n\t\t\trtw_pwr_wakeup(padapter);\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0);\n\t\tDBG_871X(\"Created Direct Link with \"MAC_FMT\"\\n\", MAC_ARG(ptdls_sta->hwaddr));\n\n\t\tpmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta;\n\t\t/* Set TDLS sta rate. */\n\t\t/* Update station supportRate */\n\t\trtw_hal_update_sta_rate_mask(padapter, ptdls_sta);\n\t\tif (pmlmeext->cur_channel > 14) {\n\t\t\tif (ptdls_sta->ra_mask & 0xffff000)\n\t\t\t\tsta_band |= WIRELESS_11_5N ;\n\n\t\t\tif (ptdls_sta->ra_mask & 0xff0)\n\t\t\t\tsta_band |= WIRELESS_11A;\n\n\t\t\t/* 5G band */\n\t\t\t#ifdef CONFIG_80211AC_VHT\n\t\t\tif (ptdls_sta->vhtpriv.vht_option)\n\t\t\t\tsta_band = WIRELESS_11_5AC;\n\t\t\t#endif\n\t\t\t\n\t\t} else {\n\t\t\tif (ptdls_sta->ra_mask & 0xffff000)\n\t\t\t\tsta_band |= WIRELESS_11_24N;\n\n\t\t\tif (ptdls_sta->ra_mask & 0xff0)\n\t\t\t\tsta_band |= WIRELESS_11G;\n\n\t\t\tif (ptdls_sta->ra_mask & 0x0f)\n\t\t\t\tsta_band |= WIRELESS_11B;\n\t\t}\n\t\tptdls_sta->wireless_mode = sta_band;\n\t\tptdls_sta->raid = rtw_hal_networktype_to_raid(padapter,ptdls_sta);\n\t\tset_sta_rate(padapter, ptdls_sta);\n\t\trtw_sta_media_status_rpt(padapter, ptdls_sta, 1);\n\t\t/* Sta mode */\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, ptdls_sta,_TRUE);\n\t\tbreak;\n\t}\n\tcase TDLS_ISSUE_PTI:\n\t\tptdls_sta->tdls_sta_state |= TDLS_WAIT_PTR_STATE;\n\t\tissue_tdls_peer_traffic_indication(padapter, ptdls_sta);\n\t\t_set_timer(&ptdls_sta->pti_timer, TDLS_PTI_TIME);\n\t\tbreak;\n#ifdef CONFIG_TDLS_CH_SW\t\t\n\tcase TDLS_CH_SW_RESP:\n\t\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t\ttxmgmt.status_code = 0;\n\t\t_rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\n\n\t\tissue_nulldata(padapter, NULL, 1, 0, 0);\n\n\t\tDBG_871X(\"issue tdls channel switch response\\n\");\n\t\tissue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE);\n\t\tresp_sleep = 5;\n\t\trtw_msleep_os(resp_sleep);\n\n\t\t/* If we receive TDLS_CH_SW_REQ at off channel which it's target is AP's channel */\n\t\t/* then we just SelectChannel to AP's channel*/\n\t\tif (padapter->mlmeextpriv.cur_channel == pchsw_info->off_ch_num) {\n\t\t\tSelectChannel(padapter, padapter->mlmeextpriv.cur_channel);\n\t\t\tissue_nulldata(padapter, NULL, 0, 0, 0);\n\t\t\tpchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE);\n\t\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\t\tbreak;\n\t\t}\n\n\t\t_set_timer(&ptdls_sta->delay_timer, pmlmeinfo->bcn_interval - 40);\n\n\t\t/* Continue following actions */\n\n\tcase TDLS_CH_SW:\n\t\tissue_nulldata(padapter, NULL, 1, 0, 0);\n\t\t_set_timer(&ptdls_sta->ch_sw_timer, (u32)(ptdls_sta->ch_switch_timeout)/1000);\n\n\t\tsetchtime = rtw_systime_to_ms(rtw_get_current_time());\n\t\tSelectChannel(padapter, pchsw_info->off_ch_num);\n\t\tsetchtime = rtw_systime_to_ms(rtw_get_current_time()) - setchtime;\n\t\tsetchtime += resp_sleep;\n\n\t\tif (pmlmeext->cur_channel != rtw_get_oper_ch(padapter))\n\t\t\tissue_nulldata(padapter, NULL, 0, 0, 0);\n\t\tpchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE);\n\n\t\tif ((u32)ptdls_sta->ch_switch_time/1000 > setchtime)\n\t\t\twait_time = (u32)ptdls_sta->ch_switch_time/1000 - setchtime;\n\t\telse\n\t\t\twait_time = 0;\n\n\t\tif (wait_time > 0)\n\t\t\trtw_msleep_os(wait_time);\n\n\t\tissue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0);\n\t\tissue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0);\n\n\t\tbreak;\n\tcase TDLS_CH_SW_BACK:\n\t\tpchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE | TDLS_WAIT_CH_RSP_STATE);\n\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\tSelectChannel(padapter, padapter->mlmeextpriv.cur_channel);\n\t\tissue_nulldata(padapter, NULL, 0, 0, 0);\n\t\tbreak;\n#endif\t\t\n\tcase TDLS_RS_RCR:\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0);\n\t\tDBG_871X(\"wirte REG_RCR, set bit6 on\\n\");\n\t\tbreak;\n\tcase TDLS_TEAR_STA:\n#ifdef CONFIG_TDLS_CH_SW\t\n\t\tif (_rtw_memcmp(TDLSoption->addr, pchsw_info->addr, ETH_ALEN) == _TRUE) {\n\t\t\tpchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE |\n\t\t\t\t\t\t\t\t\t\tTDLS_CH_SWITCH_ON_STATE |\n\t\t\t\t\t\t\t\t\t\tTDLS_PEER_AT_OFF_STATE);\n\t\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\t\t_rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN);\n\t\t}\n#endif\t\t\n\t\trtw_sta_media_status_rpt(padapter, ptdls_sta, 0);\n\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\tbreak;\t\t\t\n\t}\n\n\t//_exit_critical_bh(&(ptdlsinfo->hdl_lock), &irqL);\n\n\treturn H2C_SUCCESS;\n#else\n\treturn H2C_REJECTED;\n#endif /* CONFIG_TDLS */\n\n}\n\nu8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf)\n{\n\tstruct RunInThread_param *p;\n\n\n\tif (NULL == pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\tp = (struct RunInThread_param*)pbuf;\n\n\tif (p->func)\n\t\tp->func(p->context);\n\n\treturn H2C_SUCCESS;\n}\n\nu8 rtw_getmacreg_hdl(_adapter *padapter, u8 *pbuf)\n{\n\n\tstruct readMAC_parm *preadmacparm = NULL;\n\tu8 sz = 0;\n\tu32\taddr = 0;\n\tu32\tvalue = 0;\n\n\tif (!pbuf)\n\t\treturn H2C_PARAMETERS_ERROR;\n\n\tpreadmacparm = (struct readMAC_parm *) pbuf;\n\tsz = preadmacparm->len;\n\taddr = preadmacparm->addr;\n\tvalue = 0;\n\n\tswitch (sz) {\n\tcase 1:\n\t\tvalue = rtw_read8(padapter, addr);\n\t\tbreak;\n\tcase 2:\n\t\tvalue = rtw_read16(padapter, addr);\n\t\tbreak;\n\tcase 4:\n\t\tvalue = rtw_read32(padapter, addr);\n\t\tbreak;\n\tdefault:\n\t\tDBG_871X(\"%s: Unknown size\\n\", __func__);\n\t\tbreak;\n\t}\n\tDBG_871X(\"%s: addr:0x%02x valeu:0x%02x\\n\", __func__, addr, value);\n\n\treturn H2C_SUCCESS;\n}\n\n"
  },
  {
    "path": "core/rtw_mp.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_MP_C_\n#include <drv_types.h>\n#ifdef PLATFORM_FREEBSD\n#include <sys/unistd.h>\t\t/* for RFHIGHPID */\n#endif\n\n#include \"../hal/phydm/phydm_precomp.h\"\t\t\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)\n#include <rtw_bt_mp.h>\n#endif\n\n#ifdef CONFIG_MP_VHT_HW_TX_MODE\n#define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X))\n#define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X))\n#define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X))\n\nint rtfloor(float x)\n{\nint i = x - 2;\nwhile\n(++i <= x - 1);\nreturn i;\n}\n#endif\n\n#ifdef CONFIG_MP_INCLUDED\n\nu32 read_macreg(_adapter *padapter, u32 addr, u32 sz)\n{\n\tu32 val = 0;\n\n\tswitch(sz)\n\t{\n\t\tcase 1:\n\t\t\tval = rtw_read8(padapter, addr);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tval = rtw_read16(padapter, addr);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tval = rtw_read32(padapter, addr);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = 0xffffffff;\n\t\t\tbreak;\n\t}\n\n\treturn val;\n\t\n}\n\nvoid write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz)\n{\n\tswitch(sz)\n\t{\n\t\tcase 1:\n\t\t\trtw_write8(padapter, addr, (u8)val);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\trtw_write16(padapter, addr, (u16)val);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\trtw_write32(padapter, addr, val);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\n\nu32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask)\n{\n\treturn rtw_hal_read_bbreg(padapter, addr, bitmask);\n}\n\nvoid write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val)\n{\n\trtw_hal_write_bbreg(padapter, addr, bitmask, val);\n}\n\nu32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask)\n{\n\treturn rtw_hal_read_rfreg(padapter, rfpath, addr, bitmask);\n}\n\nvoid _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val)\n{\n\trtw_hal_write_rfreg(padapter, rfpath, addr, bitmask, val);\n}\n\nu32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr)\n{\n\treturn _read_rfreg(padapter, rfpath, addr, bRFRegOffsetMask);\n}\n\nvoid write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val)\n{\n\t_write_rfreg(padapter, rfpath, addr, bRFRegOffsetMask, val);\n}\n\nstatic void _init_mp_priv_(struct mp_priv *pmp_priv)\n{\n\tWLAN_BSSID_EX *pnetwork;\n\n\t_rtw_memset(pmp_priv, 0, sizeof(struct mp_priv));\n\n\tpmp_priv->mode = MP_OFF;\n\n\tpmp_priv->channel = 1;\n\tpmp_priv->bandwidth = CHANNEL_WIDTH_20;\n\tpmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tpmp_priv->rateidx = RATE_1M;\n\tpmp_priv->txpoweridx = 0x2A;\n\n\tpmp_priv->antenna_tx = ANTENNA_A;\n\tpmp_priv->antenna_rx = ANTENNA_AB;\n\n\tpmp_priv->check_mp_pkt = 0;\n\n\tpmp_priv->tx_pktcount = 0;\n\n\tpmp_priv->rx_bssidpktcount=0;\n\tpmp_priv->rx_pktcount = 0;\n\tpmp_priv->rx_crcerrpktcount = 0;\n\n\tpmp_priv->network_macaddr[0] = 0x00;\n\tpmp_priv->network_macaddr[1] = 0xE0;\n\tpmp_priv->network_macaddr[2] = 0x4C;\n\tpmp_priv->network_macaddr[3] = 0x87;\n\tpmp_priv->network_macaddr[4] = 0x66;\n\tpmp_priv->network_macaddr[5] = 0x55;\n\n\tpmp_priv->bSetRxBssid = _FALSE;\n\tpmp_priv->bRTWSmbCfg = _FALSE;\n\n\tpnetwork = &pmp_priv->mp_network.network;\n\t_rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN);\n\n\tpnetwork->Ssid.SsidLength = 8;\n\t_rtw_memcpy(pnetwork->Ssid.Ssid, \"mp_871x\", pnetwork->Ssid.SsidLength);\n\n\tpmp_priv->tx.payload = 2;\n#ifdef CONFIG_80211N_HT\n\tpmp_priv->tx.attrib.ht_en = 1;\n#endif\n\n}\n\n#ifdef PLATFORM_WINDOWS\n/*\nvoid mp_wi_callback(\n\tIN NDIS_WORK_ITEM*\tpwk_item,\n\tIN PVOID\t\t\tcntx\n\t)\n{\n\t_adapter* padapter =(_adapter *)cntx;\n\tstruct mp_priv *pmppriv=&padapter->mppriv;\n\tstruct mp_wi_cntx\t*pmp_wi_cntx=&pmppriv->wi_cntx;\n\n\t// Execute specified action.\n\tif(pmp_wi_cntx->curractfunc != NULL)\n\t{\n\t\tLARGE_INTEGER\tcur_time;\n\t\tULONGLONG start_time, end_time;\n\t\tNdisGetCurrentSystemTime(&cur_time);\t// driver version\n\t\tstart_time = cur_time.QuadPart/10; // The return value is in microsecond\n\n\t\tpmp_wi_cntx->curractfunc(padapter);\n\n\t\tNdisGetCurrentSystemTime(&cur_time);\t// driver version\n\t\tend_time = cur_time.QuadPart/10; // The return value is in microsecond\n\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t (\"WorkItemActType: %d, time spent: %I64d us\\n\",\n\t\t\t  pmp_wi_cntx->param.act_type, (end_time-start_time)));\n\t}\n\n\tNdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock));\n\tpmp_wi_cntx->bmp_wi_progress= _FALSE;\n\tNdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock));\n\n\tif (pmp_wi_cntx->bmpdrv_unload)\n\t{\n\t\tNdisSetEvent(&(pmp_wi_cntx->mp_wi_evt));\n\t}\n\n}\n*/\n\nstatic int init_mp_priv_by_os(struct mp_priv *pmp_priv)\n{\n\tstruct mp_wi_cntx *pmp_wi_cntx;\n\n\tif (pmp_priv == NULL) return _FAIL;\n\n\tpmp_priv->rx_testcnt = 0;\n\tpmp_priv->rx_testcnt1 = 0;\n\tpmp_priv->rx_testcnt2 = 0;\n\n\tpmp_priv->tx_testcnt = 0;\n\tpmp_priv->tx_testcnt1 = 0;\n\n\tpmp_wi_cntx = &pmp_priv->wi_cntx\n\tpmp_wi_cntx->bmpdrv_unload = _FALSE;\n\tpmp_wi_cntx->bmp_wi_progress = _FALSE;\n\tpmp_wi_cntx->curractfunc = NULL;\n\n\treturn _SUCCESS;\n}\n#endif\n\n#ifdef PLATFORM_LINUX\nstatic int init_mp_priv_by_os(struct mp_priv *pmp_priv)\n{\n\tint i, res;\n\tstruct mp_xmit_frame *pmp_xmitframe;\n\n\tif (pmp_priv == NULL) return _FAIL;\n\n\t_rtw_init_queue(&pmp_priv->free_mp_xmitqueue);\n\n\tpmp_priv->pallocated_mp_xmitframe_buf = NULL;\n\tpmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4);\n\tif (pmp_priv->pallocated_mp_xmitframe_buf == NULL) {\n\t\tres = _FAIL;\n\t\tgoto _exit_init_mp_priv;\n\t}\n\n\tpmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((SIZE_PTR) (pmp_priv->pallocated_mp_xmitframe_buf) & 3);\n\n\tpmp_xmitframe = (struct mp_xmit_frame*)pmp_priv->pmp_xmtframe_buf;\n\n\tfor (i = 0; i < NR_MP_XMITFRAME; i++)\n\t{\n\t\t_rtw_init_listhead(&pmp_xmitframe->list);\n\t\trtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue);\n\n\t\tpmp_xmitframe->pkt = NULL;\n\t\tpmp_xmitframe->frame_tag = MP_FRAMETAG;\n\t\tpmp_xmitframe->padapter = pmp_priv->papdater;\n\n\t\tpmp_xmitframe++;\n\t}\n\n\tpmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME;\n\n\tres = _SUCCESS;\n\n_exit_init_mp_priv:\n\n\treturn res;\n}\n#endif\n\nstatic void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tstruct pkt_attrib *pattrib;\n\n\t// init xmitframe attribute\n\tpattrib = &pmptx->attrib;\n\t_rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));\n\t_rtw_memset(pmptx->desc, 0, TXDESC_SIZE);\n\n\tpattrib->ether_type = 0x8712;\n\t#if 0\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\t#endif\n\t_rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);\n\n//\tpattrib->dhcp_pkt = 0;\n//\tpattrib->pktlen = 0;\n\tpattrib->ack_policy = 0;\n//\tpattrib->pkt_hdrlen = ETH_HLEN;\n\tpattrib->hdrlen = WLAN_HDR_A3_LEN;\n\tpattrib->subtype = WIFI_DATA;\n\tpattrib->priority = 0;\n\tpattrib->qsel = pattrib->priority;\n//\tdo_queue_select(padapter, pattrib);\n\tpattrib->nr_frags = 1;\n\tpattrib->encrypt = 0;\n\tpattrib->bswenc = _FALSE;\n\tpattrib->qos_en = _FALSE;\n\n\tpattrib->pktlen = 1500;\n\t\n#ifdef CONFIG_80211AC_VHT\n\t\tif (pHalData->rf_type == RF_1T1R)\n\t\t\tpattrib->raid = RATEID_IDX_VHT_1SS;\n\t\telse if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R)\n\t\t\tpattrib->raid = RATEID_IDX_VHT_2SS;\n\t\telse if (pHalData->rf_type == RF_3T3R)\n\t\t\tpattrib->raid = RATEID_IDX_VHT_3SS;\n\t\telse\n\t\t\tpattrib->raid = RATEID_IDX_BGN_40M_1SS;\n#endif\t\t\n}\n\ns32 init_mp_priv(PADAPTER padapter)\n{\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n\tPHAL_DATA_TYPE pHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\t\n\t_init_mp_priv_(pmppriv);\n\tpmppriv->papdater = padapter;\n\tpmppriv->mp_dm =0;\n\tpmppriv->tx.stop = 1;\n\tpmppriv->bSetTxPower = 0;\t\t/*for  manually set tx power*/\n\tpmppriv->bTxBufCkFail = _FALSE;\n\tpmppriv->pktInterval = 0;\n\tpmppriv->pktLength = 1000;\n\n\tmp_init_xmit_attrib(&pmppriv->tx, padapter);\n\n\tswitch (padapter->registrypriv.rf_config) {\n\t\tcase RF_1T1R:\n\t\t\tpmppriv->antenna_tx = ANTENNA_A;\n\t\t\tpmppriv->antenna_rx = ANTENNA_A;\n\t\t\tbreak;\n\t\tcase RF_1T2R:\n\t\tdefault:\n\t\t\tpmppriv->antenna_tx = ANTENNA_A;\n\t\t\tpmppriv->antenna_rx = ANTENNA_AB;\n\t\t\tbreak;\n\t\tcase RF_2T2R:\n\t\tcase RF_2T2R_GREEN:\n\t\t\tpmppriv->antenna_tx = ANTENNA_AB;\n\t\t\tpmppriv->antenna_rx = ANTENNA_AB;\n\t\t\tbreak;\n\t\tcase RF_2T4R:\n\t\t\tpmppriv->antenna_tx = ANTENNA_BC;\n\t\t\tpmppriv->antenna_rx = ANTENNA_ABCD;\n\t\t\tbreak;\n\t}\n\t\n\tpHalData->AntennaRxPath = pmppriv->antenna_rx;\n\tpHalData->AntennaTxPath = pmppriv->antenna_tx;\n\t\n\treturn _SUCCESS;\n}\n\nvoid free_mp_priv(struct mp_priv *pmp_priv)\n{\n\tif (pmp_priv->pallocated_mp_xmitframe_buf) {\n\t\trtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0);\n\t\tpmp_priv->pallocated_mp_xmitframe_buf = NULL;\n\t}\n\tpmp_priv->pmp_xmtframe_buf = NULL;\n}\n\n\nstatic VOID PHY_IQCalibrate_default(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN \tbReCovery\n\t)\n{\t\n\tDBG_871X(\"%s\\n\", __func__);\n}\n\nstatic VOID PHY_LCCalibrate_default(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tDBG_871X(\"%s\\n\", __func__);\n}\n\nstatic VOID PHY_SetRFPathSwitch_default(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tbMain\n\t)\n{\n\tDBG_871X(\"%s\\n\", __func__);\n}\n\n\nvoid mpt_InitHWConfig(PADAPTER Adapter)\n{\n\tif (IS_HARDWARE_TYPE_8723B(Adapter)) {\n\t\t// TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type.\n\t\t// TODO:  A better solution is configure it according EFUSE during the run-time. \n\n\t\tPHY_SetMacReg(Adapter, 0x64, BIT20, 0x0);\t\t   //0x66[4]=0\t\t\n\t\tPHY_SetMacReg(Adapter, 0x64, BIT24, 0x0);\t\t   //0x66[8]=0\n\t\tPHY_SetMacReg(Adapter, 0x40, BIT4, 0x0);\t\t   //0x40[4]=0\t\t\n\t\tPHY_SetMacReg(Adapter, 0x40, BIT3, 0x1);\t\t   //0x40[3]=1\t\t\n\t\tPHY_SetMacReg(Adapter, 0x4C, BIT24, 0x1);\t\t   //0x4C[24:23]=10\n\t\tPHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0);\t\t   //0x4C[24:23]=10\n\t\tPHY_SetBBReg(Adapter, 0x944, BIT1|BIT0, 0x3);\t  //0x944[1:0]=11\t\n\t\tPHY_SetBBReg(Adapter, 0x930, bMaskByte0, 0x77);   //0x930[7:0]=77\t  \n\t\tPHY_SetMacReg(Adapter, 0x38, BIT11, 0x1);\t\t   //0x38[11]=1\n\n\t\t// TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. \n\t\tPHY_SetMacReg(Adapter, 0x778, 0x3, 0x3);\t\t\t\t\t// Turn off hardware PTA control (Asked by Scott)\n\t\tPHY_SetMacReg(Adapter, 0x64, bMaskDWord, 0x36000000);\t //Fix BT S0/S1\n\t\tPHY_SetMacReg(Adapter, 0x948, bMaskDWord, 0x0); \t\t   //Fix BT can't Tx\n\n\t\t/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) */\n\t\tPHY_SetBBReg(Adapter, 0xA00, BIT8, 0x0);\t\t\t/*0xA01[0] = 0*/\n\t } else if (IS_HARDWARE_TYPE_8821(Adapter)) {\n\t\t/* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock)\n\t\t<20131122, VincentL> Enable for all 8821A/8811AU  (Asked by Alex)*/\n\t\tPHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0);\t\t   /*0x4C[23:22]=01*/\n\t\tPHY_SetMacReg(Adapter, 0x4C, BIT22, 0x1);\t\t   /*0x4C[23:22]=01*/\n\t} else if (IS_HARDWARE_TYPE_8188ES(Adapter))\n\t\tPHY_SetMacReg(Adapter, 0x4C , BIT23, 0);\t\t/*select DPDT_P and DPDT_N as output pin*/\n#ifdef CONFIG_RTL8814A\t\n\t  else if (IS_HARDWARE_TYPE_8814A(Adapter))\n\t\tPlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000);\n#endif\t\t\n\t/*\n\telse if(IS_HARDWARE_TYPE_8822B(Adapter))\n\t{\n\t\tPlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000);\n\t}*/\n}\n\n#ifdef CONFIG_RTL8188E\n#define PHY_IQCalibrate(a,b)\tPHY_IQCalibrate_8188E(a,b)\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8188E(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8188E(a,b)\n#endif\n\n#ifdef CONFIG_RTL8814A\n#define PHY_IQCalibrate(a,b)\tPHY_IQCalibrate_8814A(&(GET_HAL_DATA(a)->odmpriv), b)\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8814A(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8814A(a,b)\n#endif /* CONFIG_RTL8814A */\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n/*\n#define PHY_IQCalibrate(a,b)\tPHY_IQCalibrate_8812A(a,b)\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8812A(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8812A(a,b)\n*/\n\n#ifndef CONFIG_RTL8812A\n#define\tPHY_IQCalibrate_8812A \n#define\tPHY_LCCalibrate_8812A \n#define\tPHY_SetRFPathSwitch_8812A \n#endif\n\n#ifndef CONFIG_RTL8821A\n#define\tPHY_IQCalibrate_8821A \n#define\tPHY_LCCalibrate_8821A \n#define\tPHY_SetRFPathSwitch_8812A \n#endif\n\n#define PHY_IQCalibrate(_Adapter, b)\t\\\n\t\tIS_HARDWARE_TYPE_8812(_Adapter) ? PHY_IQCalibrate_8812A(_Adapter, b) : \\\n\t\tIS_HARDWARE_TYPE_8821(_Adapter) ? PHY_IQCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv), b) : \\\n\t\tPHY_IQCalibrate_default(_Adapter, b)\n\n#define PHY_LCCalibrate(_Adapter)\t\\\n\t\tIS_HARDWARE_TYPE_8812(_Adapter) ? PHY_LCCalibrate_8812A(&(GET_HAL_DATA(_Adapter)->odmpriv)) : \\\n\t\tIS_HARDWARE_TYPE_8821(_Adapter) ? PHY_LCCalibrate_8821A(&(GET_HAL_DATA(_Adapter)->odmpriv)) : \\\n\t\tPHY_LCCalibrate_default(_Adapter)\n\n#define PHY_SetRFPathSwitch(_Adapter, b)\t\\\n\t\t(IS_HARDWARE_TYPE_JAGUAR(_Adapter)) ? PHY_SetRFPathSwitch_8812A(_Adapter, b) : \\\n\t\tPHY_SetRFPathSwitch_default(_Adapter, b)\n\n#endif //#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n#ifdef CONFIG_RTL8192E\n#define PHY_IQCalibrate(a,b)\tPHY_IQCalibrate_8192E(a,b)\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8192E(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a,b) PHY_SetRFPathSwitch_8192E(a,b)\n#endif //CONFIG_RTL8812A_8821A\n\n#ifdef CONFIG_RTL8723B\nstatic void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tu8 b2ant;\t//false:1ant, true:2-ant\n\tu8 RF_Path;\t//0:S1, 1:S0\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tb2ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;\n\n\tPHY_IQCalibrate_8723B(padapter, bReCovery, _FALSE, b2ant, pHalData->ant_path);\n}\n\n\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8723B(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a,b)\tPHY_SetRFPathSwitch_8723B(a,b)\n#endif\n\n#ifdef CONFIG_RTL8703B\nstatic void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery) \n{\n\tPHY_IQCalibrate_8703B(padapter, bReCovery);\n}\n\n\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8703B(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a, b)\t\n#endif\n\n#ifdef CONFIG_RTL8188F\nstatic void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)\n{\n\tPHY_IQCalibrate_8188F(padapter, bReCovery, _FALSE);\n}\n\n\n#define PHY_LCCalibrate(a)\tPHY_LCCalibrate_8188F(&(GET_HAL_DATA(a)->odmpriv))\n#define PHY_SetRFPathSwitch(a, b)\tPHY_SetRFPathSwitch_8188F(a, b)\n#endif\n\ns32\nMPT_InitializeAdapter(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\tChannel\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\ts32\t\trtStatus = _SUCCESS;\n\tPMPT_CONTEXT\tpMptCtx = &pAdapter->mppriv.MptCtx;\n\tu32\t\tledsetting;\n\tstruct mlme_priv *pmlmepriv = &pAdapter->mlmepriv;\n\n\tpMptCtx->bMptDrvUnload = _FALSE;\n\tpMptCtx->bMassProdTest = _FALSE;\n\tpMptCtx->bMptIndexEven = _TRUE;\t//default gain index is -6.0db\n\tpMptCtx->h2cReqNum = 0x0;\n\t//init for BT MP\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)\n\tpMptCtx->bMPh2c_timeout = _FALSE;\n\tpMptCtx->MptH2cRspEvent = _FALSE;\n\tpMptCtx->MptBtC2hEvent = _FALSE;\n\t_rtw_init_sema(&pMptCtx->MPh2c_Sema, 0);\n\t_init_timer( &pMptCtx->MPh2c_timeout_timer, pAdapter->pnetdev, MPh2c_timeout_handle, pAdapter );\n#endif\n\n\tmpt_InitHWConfig(pAdapter);\n\n#ifdef CONFIG_RTL8723B\n\trtl8723b_InitAntenna_Selection(pAdapter);\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter))\n\t{\n\n\t\t/* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou)*/\n\t\tPHY_SetBBReg(pAdapter, 0xA00, BIT8, 0x0);\n\t\tPHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/\n\t\t/*<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten. */\n\t\tif ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))\n\t\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);\n\t\telse\n\t\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);\n\t}\t\n\t/*set ant to wifi side in mp mode*/\n\trtw_write16(pAdapter, 0x870, 0x300);\n\trtw_write16(pAdapter, 0x860, 0x110);\n#endif\n\n\tpMptCtx->bMptWorkItemInProgress = _FALSE;\n\tpMptCtx->CurrMptAct = NULL;\n\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\n\t//-------------------------------------------------------------------------\n\t// Don't accept any packets\n\trtw_write32(pAdapter, REG_RCR, 0);\n\n\t//ledsetting = rtw_read32(pAdapter, REG_LEDCFG0);\n\t//rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS);\n\t\n\t//rtw_write32(pAdapter, REG_LEDCFG0, 0x08080);\n\tledsetting = rtw_read32(pAdapter, REG_LEDCFG0);\n\t\n\t\n\tPHY_LCCalibrate(pAdapter);\n\tPHY_IQCalibrate(pAdapter, _FALSE);\n\t//dm_CheckTXPowerTracking(&pHalData->odmpriv);\t//trigger thermal meter\n\t\n\tPHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main\n\t\n\tpMptCtx->backup0xc50 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);\n\tpMptCtx->backup0xc58 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);\n\tpMptCtx->backup0xc30 = (u1Byte)PHY_QueryBBReg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);\n\tpMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);\n\tpMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);\n#ifdef CONFIG_RTL8188E\n\trtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);\n\trtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);\n#endif\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter)) {\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u1Byte)PHY_QueryBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0);\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u1Byte)PHY_QueryBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0);\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u1Byte)PHY_QueryBBReg(pAdapter, rC_IGI_Jaguar2, bMaskByte0);\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u1Byte)PHY_QueryBBReg(pAdapter, rD_IGI_Jaguar2, bMaskByte0);\n\t}\n\n\treturn\trtStatus;\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tMPT_DeInitAdapter()\n *\n * Overview:\tExtra DeInitialization for Mass Production Test.\n *\n * Input:\t\tPADAPTER\tpAdapter\n *\n * Output:\t\tNONE\n *\n * Return:\t\tNONE\n *\n * Revised History:\n *\tWhen\t\tWho\t\tRemark\n *\t05/08/2007\tMHC\t\tCreate Version 0.\n *\t05/18/2007\tMHC\t\tAdd normal driver MPHalt code.\n *\n *---------------------------------------------------------------------------*/\nVOID\nMPT_DeInitAdapter(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tPMPT_CONTEXT\t\tpMptCtx = &pAdapter->mppriv.MptCtx;\n\n\tpMptCtx->bMptDrvUnload = _TRUE;\n\t#if defined(CONFIG_RTL8723B)\n\t_rtw_free_sema(&(pMptCtx->MPh2c_Sema));\n\t_cancel_timer_ex( &pMptCtx->MPh2c_timeout_timer);\n\t#endif\n\t#if\tdefined(CONFIG_RTL8723B)\n\tPHY_SetBBReg(pAdapter,0xA01, BIT0, 1); ///suggestion  by jerry for MP Rx.\n\t#endif\n#if 0 // for Windows\n\tPlatformFreeWorkItem( &(pMptCtx->MptWorkItem) );\n\n\twhile(pMptCtx->bMptWorkItemInProgress)\n\t{\n\t\tif(NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tNdisFreeSpinLock( &(pMptCtx->MptWorkItemSpinLock) );\n#endif\n}\n\nstatic u8 mpt_ProStartTest(PADAPTER padapter)\n{\n\tPMPT_CONTEXT pMptCtx = &padapter->mppriv.MptCtx;\n\n\tpMptCtx->bMassProdTest = _TRUE;\n\tpMptCtx->bStartContTx = _FALSE;\n\tpMptCtx->bCckContTx = _FALSE;\n\tpMptCtx->bOfdmContTx = _FALSE;\n\tpMptCtx->bSingleCarrier = _FALSE;\n\tpMptCtx->bCarrierSuppression = _FALSE;\n\tpMptCtx->bSingleTone = _FALSE;\n\tpMptCtx->HWTxmode = PACKETS_TX;\n\n\treturn _SUCCESS;\n}\n\n/*\n * General use\n */\ns32 SetPowerTracking(PADAPTER padapter, u8 enable)\n{\n\n\thal_mpt_SetPowerTracking(padapter, enable);\n\treturn 0;\n}\n\nvoid GetPowerTracking(PADAPTER padapter, u8 *enable)\n{\n\thal_mpt_GetPowerTracking(padapter, enable);\n}\n\nstatic void disable_dm(PADAPTER padapter)\n{\n\tu8 v8;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\n\t//3 1. disable firmware dynamic mechanism\n\t// disable Power Training, Rate Adaptive\n\tv8 = rtw_read8(padapter, REG_BCN_CTRL);\n\tv8 &= ~EN_BCN_FUNCTION;\n\trtw_write8(padapter, REG_BCN_CTRL, v8);\n\n\t//3 2. disable driver dynamic mechanism\n\trtw_phydm_func_disable_all(padapter);\n\n\t// enable APK, LCK and IQK but disable power tracking\n\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;\n\trtw_phydm_func_set(padapter, ODM_RF_CALIBRATION);\n\n//#ifdef CONFIG_BT_COEXIST\n//\trtw_btcoex_Switch(padapter, 0); //remove for BT MP Down.\n//#endif\n}\n\n\nvoid MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\n\tif (bstart==1){\n\t\tDBG_871X(\"in MPT_PwrCtlDM start\\n\");\n\t\trtw_phydm_func_set(padapter, ODM_RF_TX_PWR_TRACK | ODM_RF_CALIBRATION);\n\n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;\n\t\tpadapter->mppriv.mp_dm =1;\n\t\t\n\t}else{\n\t\tDBG_871X(\"in MPT_PwrCtlDM stop \\n\");\n\t\tdisable_dm(padapter);\n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;\n\t\tpadapter->mppriv.mp_dm = 0;\n\t\t{\n\t\t\tTXPWRTRACK_CFG\tc;\n\t\t\tu1Byte\tchnl =0 ;\n\t\t\t_rtw_memset(&c, 0, sizeof(TXPWRTRACK_CFG));\n\t\t\tConfigureTxpowerTrack(pDM_Odm, &c);\n\t\t\tODM_ClearTxPowerTrackingState(pDM_Odm);\n\t\t\tif (*c.ODM_TxPwrTrackSetPwr) {\n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl);\n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl);\n\t\t\t}\n\t\t}\n\t}\n\t\t\n}\n\n\nu32 mp_join(PADAPTER padapter,u8 mode)\n{\n\tWLAN_BSSID_EX bssid;\n\tstruct sta_info *psta;\n\tu32 length;\n\tu8 val8;\n\t_irqL irqL;\n\ts32 res = _SUCCESS;\n\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network *tgt_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\t\n#ifdef CONFIG_IOCTL_CFG80211\t\t\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n\tpwdev->iftype = NL80211_IFTYPE_ADHOC;\n#endif //#ifdef CONFIG_IOCTL_CFG80211\n\t// 1. initialize a new WLAN_BSSID_EX\n\t_rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));\n\tDBG_8192C(\"%s ,pmppriv->network_macaddr=%x %x %x %x %x %x \\n\",__func__,\n\t\t\t\tpmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);\n\t_rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);\n\t\n\tif( mode==WIFI_FW_ADHOC_STATE ){\n\t\tbssid.Ssid.SsidLength = strlen(\"mp_pseudo_adhoc\");\n\t\t_rtw_memcpy(bssid.Ssid.Ssid, (u8*)\"mp_pseudo_adhoc\", bssid.Ssid.SsidLength);\n\t\tbssid.InfrastructureMode = Ndis802_11IBSS;\n\t\tbssid.NetworkTypeInUse = Ndis802_11DS;\n\t\tbssid.IELength = 0;\n\t\tbssid.Configuration.DSConfig=pmppriv->channel;\n\n\t}else if(mode==WIFI_FW_STATION_STATE){\n\t\tbssid.Ssid.SsidLength = strlen(\"mp_pseudo_STATION\");\n\t\t_rtw_memcpy(bssid.Ssid.Ssid, (u8*)\"mp_pseudo_STATION\", bssid.Ssid.SsidLength);\n\t\tbssid.InfrastructureMode = Ndis802_11Infrastructure;\n\t\tbssid.NetworkTypeInUse = Ndis802_11DS;\n\t\tbssid.IELength = 0;\n\t}\n\t\n\tlength = get_WLAN_BSSID_EX_sz(&bssid);\n\tif (length % 4)\n\t\tbssid.Length = ((length >> 2) + 1) << 2; //round up to multiple of 4 bytes.\n\telse\n\t\tbssid.Length = length;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tif (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)\n\t\tgoto end_of_mp_start_test;\n\n\t//init mp_start_test status\n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\trtw_disassoc_cmd(padapter, 500, _TRUE);\n\t\trtw_indicate_disconnect(padapter);\n\t\trtw_free_assoc_resources(padapter, 1);\n\t}\n\tpmppriv->prev_fw_state = get_fwstate(pmlmepriv);\n\tpmlmepriv->fw_state = WIFI_MP_STATE;\n\n\tset_fwstate(pmlmepriv, _FW_UNDER_LINKING);\n\n\t//3 2. create a new psta for mp driver\n\t//clear psta in the cur_network, if any\n\tpsta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);\n\tif (psta) rtw_free_stainfo(padapter, psta);\n\n\tpsta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);\n\tif (psta == NULL) {\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"mp_start_test: Can't alloc sta_info!\\n\"));\n\t\tpmlmepriv->fw_state = pmppriv->prev_fw_state;\n\t\tres = _FAIL;\n\t\tgoto end_of_mp_start_test;\n\t}\n\tset_fwstate(pmlmepriv,WIFI_ADHOC_MASTER_STATE);\n\t//3 3. join psudo AdHoc\n\ttgt_network->join_res = 1;\n\ttgt_network->aid = psta->aid = 1;\n\n\t_rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);\n\trtw_update_registrypriv_dev_network(padapter);\n\t_rtw_memcpy(&tgt_network->network,&padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);\n\t_rtw_memcpy(pnetwork,&padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);\n\n\trtw_indicate_connect(padapter);\n\t_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);\n\tset_fwstate(pmlmepriv,_FW_LINKED);\n\nend_of_mp_start_test:\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\tif(1) //(res == _SUCCESS)\n\t{\n\t\t// set MSR to WIFI_FW_ADHOC_STATE\n\t\tif( mode==WIFI_FW_ADHOC_STATE ){\n\n\t\t\tval8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102\n\t\t\tval8 |= WIFI_FW_ADHOC_STATE;\n\t\t\trtw_write8(padapter, MSR, val8); // Link in ad hoc network\n\t\t} \n\t\telse {\n\t\t\tSet_MSR(padapter, WIFI_FW_STATION_STATE);\n\n\t\t\tDBG_8192C(\"%s , pmppriv->network_macaddr =%x %x %x %x %x %x\\n\",__func__,\n\t\t\t\t\t\tpmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);\n\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);\n\t\t}\n\t}\n\n\treturn res;\n}\n//This function initializes the DUT to the MP test mode\ns32 mp_start_test(PADAPTER padapter)\n{\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n\ts32 res = _SUCCESS;\n\n\tpadapter->registrypriv.mp_mode = 1;\n\n\t//3 disable dynamic mechanism\n\tdisable_dm(padapter);\n\t#ifdef CONFIG_RTL8814A\n\trtl8814_InitHalDm(padapter);\n\t#endif /* CONFIG_RTL8814A */\n\t#ifdef CONFIG_RTL8812A\n\trtl8812_InitHalDm(padapter);\n\t#endif /* CONFIG_RTL8812A */\n\t#ifdef CONFIG_RTL8723B\n\trtl8723b_InitHalDm(padapter);\n\t#endif /* CONFIG_RTL8723B */\n\t#ifdef CONFIG_RTL8703B\n\trtl8703b_InitHalDm(padapter);\n\t#endif /* CONFIG_RTL8703B */\n\t#ifdef CONFIG_RTL8192E\n\trtl8192e_InitHalDm(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8188F\n\trtl8188f_InitHalDm(padapter);\n\t#endif\n\n\t//3 0. update mp_priv\n\n\tif (padapter->registrypriv.rf_config == RF_MAX_TYPE) {\n//\t\tswitch (phal->rf_type) {\n\t\tswitch (GET_RF_TYPE(padapter)) {\n\t\t\tcase RF_1T1R:\n\t\t\t\tpmppriv->antenna_tx = ANTENNA_A;\n\t\t\t\tpmppriv->antenna_rx = ANTENNA_A;\n\t\t\t\tbreak;\n\t\t\tcase RF_1T2R:\n\t\t\tdefault:\n\t\t\t\tpmppriv->antenna_tx = ANTENNA_A;\n\t\t\t\tpmppriv->antenna_rx = ANTENNA_AB;\n\t\t\t\tbreak;\n\t\t\tcase RF_2T2R:\n\t\t\tcase RF_2T2R_GREEN:\n\t\t\t\tpmppriv->antenna_tx = ANTENNA_AB;\n\t\t\t\tpmppriv->antenna_rx = ANTENNA_AB;\n\t\t\t\tbreak;\n\t\t\tcase RF_2T4R:\n\t\t\t\tpmppriv->antenna_tx = ANTENNA_AB;\n\t\t\t\tpmppriv->antenna_rx = ANTENNA_ABCD;\n\t\t\t\tbreak;\n\t}\n\t}\n\n\tmpt_ProStartTest(padapter);\n\n\tmp_join(padapter,WIFI_FW_ADHOC_STATE);\n\n\treturn res;\n}\n//------------------------------------------------------------------------------\n//This function change the DUT from the MP test mode into normal mode\nvoid mp_stop_test(PADAPTER padapter)\n{\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network *tgt_network = &pmlmepriv->cur_network;\n\tstruct sta_info *psta;\n\n\t_irqL irqL;\n\t\n\tif(pmppriv->mode==MP_ON)\n\t{\n\tpmppriv->bSetTxPower=0;\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\t\n\tif (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)\n\t\tgoto end_of_mp_stop_test;\n\n\t//3 1. disconnect psudo AdHoc\n\trtw_indicate_disconnect(padapter);\n\n\t//3 2. clear psta used in mp test mode.\n//\trtw_free_assoc_resources(padapter, 1);\n\tpsta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);\n\tif (psta) rtw_free_stainfo(padapter, psta);\n\n\t//3 3. return to normal state (default:station mode)\n\tpmlmepriv->fw_state = pmppriv->prev_fw_state; // WIFI_STATION_STATE;\n\n\t//flush the cur_network\n\t_rtw_memset(tgt_network, 0, sizeof(struct wlan_network));\n\t\n\t_clr_fwstate_(pmlmepriv, WIFI_MP_STATE);\n\nend_of_mp_stop_test:\n\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\t#ifdef CONFIG_RTL8812A\n\trtl8812_InitHalDm(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8723B\n\trtl8723b_InitHalDm(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8703B\n\trtl8703b_InitHalDm(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8192E\n\trtl8192e_InitHalDm(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8188F\n\trtl8188f_InitHalDm(padapter);\n\t#endif\n\t}\n}\n/*---------------------------hal\\rtl8192c\\MPT_Phy.c---------------------------*/\n#if 0\n//#ifdef CONFIG_USB_HCI\nstatic VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID)\n{\n\tu8\t\teRFPath;\n\tu32\t\trfReg0x26;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\n\tif (RateIdx < MPT_RATE_6M) {\t// CCK rate,for 88cu\n\t\trfReg0x26 = 0xf400;\n\t}\n\telse if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {// OFDM rate,for 88cu\n\t\tif ((4 == Channel) || (8 == Channel) || (12 == Channel))\n\t\t\trfReg0x26 = 0xf000;\n\t\telse if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))\n\t\t\trfReg0x26 = 0xf400;\n\t\telse\n\t\t\trfReg0x26 = 0x4f200;\n\t}\n\telse if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {// MCS 20M ,for 88cu // MCS40M rate,for 88cu\n\n\t\tif (CHANNEL_WIDTH_20 == BandWidthID) {\n\t\t\tif ((4 == Channel) || (8 == Channel))\n\t\t\t\trfReg0x26 = 0xf000;\n\t\t\telse if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))\n\t\t\t\trfReg0x26 = 0xf400;\n\t\t\telse\n\t\t\t\trfReg0x26 = 0x4f200;\n\t\t}\n\t\telse{\n\t\t\tif ((4 == Channel) || (8 == Channel))\n\t\t\t\trfReg0x26 = 0xf000;\n\t\t\telse if ((5 == Channel) || (7 == Channel))\n\t\t\t\trfReg0x26 = 0xf400;\n\t\t\telse\n\t\t\t\trfReg0x26 = 0x4f200;\n\t\t}\n\t}\n\n//\tRT_TRACE(COMP_CMD, DBG_LOUD, (\"\\n mpt_AdjustRFRegByRateByChan92CU():Chan:%d Rate=%d rfReg0x26:0x%08x\\n\",Channel, RateIdx,rfReg0x26));\n\tfor (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) {\n\t\twrite_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26);\n\t}\n}\n#endif\n/*-----------------------------------------------------------------------------\n * Function:\tmpt_SwitchRfSetting\n *\n * Overview:\tChange RF Setting when we siwthc channel/rate/BW for MP.\n *\n * Input:       IN\tPADAPTER\t\t\t\tpAdapter\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 01/08/2009\tMHC\t\tSuggestion from SD3 Willis for 92S series.\n * 01/09/2009\tMHC\t\tAdd CCK modification for 40MHZ. Suggestion from SD3.\n *\n *---------------------------------------------------------------------------*/\nstatic void mpt_SwitchRfSetting(PADAPTER pAdapter)\n{\n\thal_mpt_SwitchRfSetting(pAdapter);\n    }\n\n/*---------------------------hal\\rtl8192c\\MPT_Phy.c---------------------------*/\n/*---------------------------hal\\rtl8192c\\MPT_HelperFunc.c---------------------------*/\nstatic void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)\n{\n\thal_mpt_CCKTxPowerAdjust(Adapter, bInCH14);\n}\n\nstatic void MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven)\n{\n\thal_mpt_CCKTxPowerAdjustbyIndex(pAdapter, beven);\n\t}\n\n/*---------------------------hal\\rtl8192c\\MPT_HelperFunc.c---------------------------*/\n\n/*\n * SetChannel\n * Description\n *\tUse H2C command to change channel,\n *\tnot only modify rf register, but also other setting need to be done.\n */\nvoid SetChannel(PADAPTER pAdapter)\n{\n\thal_mpt_SetChannel(pAdapter);\n}\n\n/*\n * Notice\n *\tSwitch bandwitdth may change center frequency(channel)\n */\nvoid SetBandwidth(PADAPTER pAdapter)\n{\n\thal_mpt_SetBandwidth(pAdapter);\n\n}\n\nvoid SetAntenna(PADAPTER pAdapter)\n{\n\thal_mpt_SetAntenna(pAdapter);\n}\n\nint SetTxPower(PADAPTER pAdapter)\n{\n\n\thal_mpt_SetTxPower(pAdapter);\n\treturn _TRUE;\n}\n\nvoid SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)\n{\n\tu32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;\n\n\tTxAGCOffset_B = (ulTxAGCOffset&0x000000ff);\n\tTxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);\n\tTxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);\n\n\ttmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);\n\twrite_bbreg(pAdapter, rFPGA0_TxGainStage,\n\t\t\t(bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);\n}\n\nvoid SetDataRate(PADAPTER pAdapter)\n{\n\thal_mpt_SetDataRate(pAdapter);\n}\n\nvoid MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,BOOLEAN bMain)\n{\n\n\tPHY_SetRFPathSwitch(pAdapter, bMain);\n\n}\n\n\ns32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)\n{\n\treturn hal_mpt_SetThermalMeter(pAdapter, target_ther);\n}\n\nstatic void TriggerRFThermalMeter(PADAPTER pAdapter)\n{\n\thal_mpt_TriggerRFThermalMeter(pAdapter);\n}\n\nstatic u8 ReadRFThermalMeter(PADAPTER pAdapter)\n{\n\treturn hal_mpt_ReadRFThermalMeter(pAdapter);\n}\n\nvoid GetThermalMeter(PADAPTER pAdapter, u8 *value)\n{\n\thal_mpt_GetThermalMeter(pAdapter, value);\n}\n\nvoid SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetSingleCarrierTx(pAdapter, bStart);\n}\n\nvoid SetSingleToneTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetSingleToneTx(pAdapter, bStart);\n}\n\nvoid SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetCarrierSuppressionTx(pAdapter, bStart);\n}\n\nvoid SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetCCKContinuousTx(pAdapter, bStart);\n}\n\nvoid SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetOFDMContinuousTx(pAdapter, bStart);\n}/* mpt_StartOfdmContTx */\n\nvoid SetContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tPhySetTxPowerLevel(pAdapter);\n\thal_mpt_SetContinuousTx(pAdapter, bStart);\n}\n\n\nvoid PhySetTxPowerLevel(PADAPTER pAdapter)\n{\n\tstruct mp_priv *pmp_priv = &pAdapter->mppriv;\n\t\t\n\tif (pmp_priv->bSetTxPower==0) // for NO manually set power index\n\t{\n#ifdef CONFIG_RTL8188E\t\n\t\tPHY_SetTxPowerLevel8188E(pAdapter,pmp_priv->channel);\n#endif\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\t\tPHY_SetTxPowerLevel8812(pAdapter,pmp_priv->channel);\n#endif\n#if defined(CONFIG_RTL8192E)\n\t\tPHY_SetTxPowerLevel8192E(pAdapter,pmp_priv->channel);\n#endif\n#if defined(CONFIG_RTL8723B)\n\t\tPHY_SetTxPowerLevel8723B(pAdapter,pmp_priv->channel);\n#endif\n#if defined(CONFIG_RTL8188F)\n\t\tPHY_SetTxPowerLevel8188F(pAdapter, pmp_priv->channel);\n#endif\n\tmpt_ProQueryCalTxPower(pAdapter,pmp_priv->antenna_tx);\n\n\t}\n}\n\n//------------------------------------------------------------------------------\nstatic void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe)\n{\n\trtw_hal_mgnt_xmit(padapter, pmpframe);\n}\n\nstatic struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)\n{\n\tstruct xmit_frame\t*pmpframe;\n\tstruct xmit_buf\t*pxmitbuf;\n\n\tif ((pmpframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn NULL;\n\t}\n\n\tif ((pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL)\n\t{\n\t\trtw_free_xmitframe(pxmitpriv, pmpframe);\n\t\treturn NULL;\n\t}\n\n\tpmpframe->frame_tag = MP_FRAMETAG;\n\n\tpmpframe->pxmitbuf = pxmitbuf;\n\n\tpmpframe->buf_addr = pxmitbuf->pbuf;\n\n\tpxmitbuf->priv_data = pmpframe;\n\n\treturn pmpframe;\n\n}\n\nstatic thread_return mp_xmit_packet_thread(thread_context context)\n{\n\tstruct xmit_frame\t*pxmitframe;\n\tstruct mp_tx\t\t*pmptx;\n\tstruct mp_priv\t*pmp_priv;\n\tstruct xmit_priv\t*pxmitpriv;\n\tPADAPTER padapter;\n\n\tpmp_priv = (struct mp_priv *)context;\n\tpmptx = &pmp_priv->tx;\n\tpadapter = pmp_priv->papdater;\n\tpxmitpriv = &(padapter->xmitpriv);\n\t\n\tthread_enter(\"RTW_MP_THREAD\");\n\n\tDBG_871X(\"%s:pkTx Start\\n\", __func__);\n\twhile (1) {\n\t\tpxmitframe = alloc_mp_xmitframe(pxmitpriv);\n\t\tif (pxmitframe == NULL) {\n\t\t\tif (pmptx->stop ||\n\t\t\t\tRTW_CANNOT_RUN(padapter)) {\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trtw_usleep_os(10);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t_rtw_memcpy((u8 *)(pxmitframe->buf_addr+TXDESC_OFFSET), pmptx->buf, pmptx->write_size);\n\t\t_rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));\n\n\t\t\n\t\trtw_usleep_os(padapter->mppriv.pktInterval);\n\t\tdump_mpframe(padapter, pxmitframe);\n\t\t\n\t\tpmptx->sended++;\n\t\tpmp_priv->tx_pktcount++;\n\n\t\tif (pmptx->stop ||\n\t\t\tRTW_CANNOT_RUN(padapter))\n\t\t\tgoto exit;\n\t\tif ((pmptx->count != 0) &&\n\t\t    (pmptx->count == pmptx->sended))\n\t\t\tgoto exit;\n\n\t\tflush_signals_thread();\n\t}\n\nexit:\n\t//DBG_871X(\"%s:pkTx Exit\\n\", __func__);\n\trtw_mfree(pmptx->pallocated_buf, pmptx->buf_size);\n\tpmptx->pallocated_buf = NULL;\n\tpmptx->stop = 1;\n\n\tthread_exit();\n}\n\nvoid fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc)\n{\t\t\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\t_rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE);\n}\n\n#if defined(CONFIG_RTL8188E) \nvoid fill_tx_desc_8188e(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tstruct tx_desc *desc   = (struct tx_desc *)&(pmp_priv->tx.desc);\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\tu32\tpkt_size = pattrib->last_txcmdsz;\n\ts32 bmcast = IS_MCAST(pattrib->ra);\n// offset 0\n#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)\n\tdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);\n\tdesc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size\n\tdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc\n\tif (bmcast) desc->txdw0 |= cpu_to_le32(BMC); // broadcast packet\n\n\tdesc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000);\n#endif\n\n\tdesc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); //CAM_ID(MAC_ID)\n\tdesc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); // Queue Select, TID\n\tdesc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); // Rate Adaptive ID\n\t// offset 8\n\t//\tdesc->txdw2 |= cpu_to_le32(AGG_BK);//AGG BK\n\n\tdesc->txdw3 |= cpu_to_le32((pattrib->seqnum<<16)&0x0fff0000);\n\tdesc->txdw4 |= cpu_to_le32(HW_SSN);\n\t\t\n\tdesc->txdw4 |= cpu_to_le32(USERATE);\n\tdesc->txdw4 |= cpu_to_le32(DISDATAFB);\n\n\tif( pmp_priv->preamble ){\n\t\tif (HwRateToMPTRate(pmp_priv->rateidx) <=  MPT_RATE_54M)\n\t\t\tdesc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble\n\t}\n\n\tif (pmp_priv->bandwidth == CHANNEL_WIDTH_40)\n\t\tdesc->txdw4 |= cpu_to_le32(DATA_BW);\n\n\t// offset 20\n\tdesc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F);\n\n\tif( pmp_priv->preamble ){\n\t\tif (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M)\n\t\t\tdesc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval\n\t}\n\n\tdesc->txdw5 |= cpu_to_le32(RTY_LMT_EN); // retry limit enable\n\tdesc->txdw5 |= cpu_to_le32(0x00180000); // DATA/RTS Rate Fallback Limit\t\n\t\t\n\t\n}\n#endif\n\n#if defined(CONFIG_RTL8814A)\nvoid fill_tx_desc_8814a(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tu8 *pDesc   = (u8 *)&(pmp_priv->tx.desc);\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\t\n\tu32\tpkt_size = pattrib->last_txcmdsz;\n\ts32 bmcast = IS_MCAST(pattrib->ra);\n\tu8 data_rate,pwr_status,offset;\n\n\t//SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1);\n\tSET_TX_DESC_LAST_SEG_8814A(pDesc, 1);\n\t//SET_TX_DESC_OWN_(pDesc, 1);\n\t\n\tSET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size);\n\t\n\toffset = TXDESC_SIZE + OFFSET_SZ;\t\t\n\n\tSET_TX_DESC_OFFSET_8814A(pDesc, offset);\n#if defined(CONFIG_PCI_HCI)\n\tSET_TX_DESC_PKT_OFFSET_8814A(pDesc, 0); /* 8814AE pkt_offset is 0 */\n#else\n\tSET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1);\n#endif\n\t\n\tif (bmcast) {\n\t\tSET_TX_DESC_BMC_8814A(pDesc, 1);\n\t}\n\n\tSET_TX_DESC_MACID_8814A(pDesc, pattrib->mac_id);\n\tSET_TX_DESC_RATE_ID_8814A(pDesc, pattrib->raid);\n\t\n\t//SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G);\n\tSET_TX_DESC_QUEUE_SEL_8814A(pDesc,  pattrib->qsel);\n\t//SET_TX_DESC_QUEUE_SEL_8812(pDesc,  QSLT_MGNT);\n\n\tif ( pmp_priv->preamble ){\n\t\tSET_TX_DESC_DATA_SHORT_8814A(pDesc, 1);\n\t}\n\t\n\tif (!pattrib->qos_en) {\n\t\tSET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); // Hw set sequence number\n\t} else {\n\t\tSET_TX_DESC_SEQ_8814A(pDesc, pattrib->seqnum);\n\t}\n\t\n\tif (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) {\n\t\tSET_TX_DESC_DATA_BW_8814A(pDesc, pmp_priv->bandwidth);\n\t} else {\n\t\tDBG_871X(\"%s:Err: unknown bandwidth %d, use 20M\\n\", __func__,pmp_priv->bandwidth);\n\t\tSET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20);\n\t}\n\n\tSET_TX_DESC_DISABLE_FB_8814A(pDesc, 1);\n\tSET_TX_DESC_USE_RATE_8814A(pDesc, 1);\n\tSET_TX_DESC_TX_RATE_8814A(pDesc, pmp_priv->rateidx);\n\n}\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nvoid fill_tx_desc_8812a(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tu8 *pDesc   = (u8 *)&(pmp_priv->tx.desc);\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\t\n\tu32\tpkt_size = pattrib->last_txcmdsz;\n\ts32 bmcast = IS_MCAST(pattrib->ra);\n\tu8 data_rate,pwr_status,offset;\n\n\tSET_TX_DESC_FIRST_SEG_8812(pDesc, 1);\n\tSET_TX_DESC_LAST_SEG_8812(pDesc, 1);\n\tSET_TX_DESC_OWN_8812(pDesc, 1);\n\t\n\tSET_TX_DESC_PKT_SIZE_8812(pDesc, pkt_size);\n\t\n\toffset = TXDESC_SIZE + OFFSET_SZ;\t\t\n\n\tSET_TX_DESC_OFFSET_8812(pDesc, offset);\n\n#if defined(CONFIG_PCI_HCI)\n\tSET_TX_DESC_PKT_OFFSET_8812(pDesc, 0);\n#else\n\tSET_TX_DESC_PKT_OFFSET_8812(pDesc, 1);\n#endif\n\tif (bmcast) {\n\t\tSET_TX_DESC_BMC_8812(pDesc, 1);\n\t}\n\n\tSET_TX_DESC_MACID_8812(pDesc, pattrib->mac_id);\n\tSET_TX_DESC_RATE_ID_8812(pDesc, pattrib->raid);\n\n\t//SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G);\n\tSET_TX_DESC_QUEUE_SEL_8812(pDesc,  pattrib->qsel);\n\t//SET_TX_DESC_QUEUE_SEL_8812(pDesc,  QSLT_MGNT);\n\t\n\tif (!pattrib->qos_en) {\n\t\tSET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); // Hw set sequence number\n\t} else {\n\t\tSET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum);\n\t}\n\t\n\tif (pmp_priv->bandwidth <= CHANNEL_WIDTH_160) {\n\t\tSET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth);\n\t} else {\n\t\tDBG_871X(\"%s:Err: unknown bandwidth %d, use 20M\\n\", __func__,pmp_priv->bandwidth);\n\t\tSET_TX_DESC_DATA_BW_8812(pDesc, CHANNEL_WIDTH_20);\n\t}\n\n\tSET_TX_DESC_DISABLE_FB_8812(pDesc, 1);\n\tSET_TX_DESC_USE_RATE_8812(pDesc, 1);\n\tSET_TX_DESC_TX_RATE_8812(pDesc, pmp_priv->rateidx);\n\n}\n#endif\n#if defined(CONFIG_RTL8192E)\nvoid fill_tx_desc_8192e(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tu8 *pDesc\t= (u8 *)&(pmp_priv->tx.desc);\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\t\t\n\tu32 pkt_size = pattrib->last_txcmdsz;\n\ts32 bmcast = IS_MCAST(pattrib->ra);\n\tu8 data_rate,pwr_status,offset;\n\t\n\n\tSET_TX_DESC_PKT_SIZE_92E(pDesc, pkt_size);\n\t\t\n\toffset = TXDESC_SIZE + OFFSET_SZ;\t\t\n\t\n\tSET_TX_DESC_OFFSET_92E(pDesc, offset);\n\t#if defined(CONFIG_PCI_HCI) /* 8192EE */\n\n\tSET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */\n\t#else /* 8192EU 8192ES */\n\tSET_TX_DESC_PKT_OFFSET_92E(pDesc, 1);\n\t#endif\n\t\t\n\tif (bmcast) {\n\t\tSET_TX_DESC_BMC_92E(pDesc, 1);\n\t}\n\t\n\tSET_TX_DESC_MACID_92E(pDesc, pattrib->mac_id);\n\tSET_TX_DESC_RATE_ID_92E(pDesc, pattrib->raid);\n\t\n\t\n\tSET_TX_DESC_QUEUE_SEL_92E(pDesc,  pattrib->qsel);\n\t//SET_TX_DESC_QUEUE_SEL_8812(pDesc,  QSLT_MGNT);\n\t\t\n\tif (!pattrib->qos_en) {\n\t\tSET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);// Hw set sequence number\n\t\tSET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel);\n\t} else {\n\t\tSET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);\n\t}\n\t\t\n\tif ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40)) {\n\t\tSET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth);\n\t} else {\n\t\tDBG_871X(\"%s:Err: unknown bandwidth %d, use 20M\\n\", __func__,pmp_priv->bandwidth);\n\t\tSET_TX_DESC_DATA_BW_92E(pDesc, CHANNEL_WIDTH_20);\n\t}\n\t\n\t//SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib));\n\t\n\tSET_TX_DESC_DISABLE_FB_92E(pDesc, 1);\n\tSET_TX_DESC_USE_RATE_92E(pDesc, 1);\n\tSET_TX_DESC_TX_RATE_92E(pDesc, pmp_priv->rateidx);\n\n}\n#endif\n\n#if defined(CONFIG_RTL8723B)\nvoid fill_tx_desc_8723b(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\tu8 *ptxdesc = pmp_priv->tx.desc;\n\n\tSET_TX_DESC_AGG_BREAK_8723B(ptxdesc, 1);\n\tSET_TX_DESC_MACID_8723B(ptxdesc, pattrib->mac_id);\n\tSET_TX_DESC_QUEUE_SEL_8723B(ptxdesc, pattrib->qsel);\n\n\tSET_TX_DESC_RATE_ID_8723B(ptxdesc, pattrib->raid);\n\tSET_TX_DESC_SEQ_8723B(ptxdesc, pattrib->seqnum);\n\tSET_TX_DESC_HWSEQ_EN_8723B(ptxdesc, 1);\n\tSET_TX_DESC_USE_RATE_8723B(ptxdesc, 1);\n\tSET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1);\n\n\tif (pmp_priv->preamble) {\n\t\tif (HwRateToMPTRate(pmp_priv->rateidx) <=  MPT_RATE_54M)\n\t\t\tSET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1);\n\t}\n\n\tif (pmp_priv->bandwidth == CHANNEL_WIDTH_40) {\n\t\tSET_TX_DESC_DATA_BW_8723B(ptxdesc, 1);\n\t}\n\n\tSET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx);\n\n\tSET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F);\n\tSET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(ptxdesc, 0xF);\n}\n#endif\n\n#if defined(CONFIG_RTL8703B)\nvoid fill_tx_desc_8703b(PADAPTER padapter) \n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\tu8 *ptxdesc = pmp_priv->tx.desc;\n\n\tSET_TX_DESC_AGG_BREAK_8703B(ptxdesc, 1);\n\tSET_TX_DESC_MACID_8703B(ptxdesc, pattrib->mac_id);\n\tSET_TX_DESC_QUEUE_SEL_8703B(ptxdesc, pattrib->qsel);\n\n\tSET_TX_DESC_RATE_ID_8703B(ptxdesc, pattrib->raid);\n\tSET_TX_DESC_SEQ_8703B(ptxdesc, pattrib->seqnum);\n\tSET_TX_DESC_HWSEQ_EN_8703B(ptxdesc, 1);\n\tSET_TX_DESC_USE_RATE_8703B(ptxdesc, 1);\n\tSET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1);\n\n\tif (pmp_priv->preamble) {\n\t\tif (HwRateToMPTRate(pmp_priv->rateidx) <=  MPT_RATE_54M)\n\t\t\tSET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1);\n\t}\n\n\tif (pmp_priv->bandwidth == CHANNEL_WIDTH_40)\n\t\tSET_TX_DESC_DATA_BW_8703B(ptxdesc, 1);\n\n\tSET_TX_DESC_TX_RATE_8703B(ptxdesc, pmp_priv->rateidx);\n\n\tSET_TX_DESC_DATA_RATE_FB_LIMIT_8703B(ptxdesc, 0x1F);\n\tSET_TX_DESC_RTS_RATE_FB_LIMIT_8703B(ptxdesc, 0xF);\n}\n#endif\n\n#if defined(CONFIG_RTL8188F)\nvoid fill_tx_desc_8188f(PADAPTER padapter)\n{\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tstruct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);\n\tu8 *ptxdesc = pmp_priv->tx.desc;\n\n\tSET_TX_DESC_AGG_BREAK_8188F(ptxdesc, 1);\n\tSET_TX_DESC_MACID_8188F(ptxdesc, pattrib->mac_id);\n\tSET_TX_DESC_QUEUE_SEL_8188F(ptxdesc, pattrib->qsel);\n\n\tSET_TX_DESC_RATE_ID_8188F(ptxdesc, pattrib->raid);\n\tSET_TX_DESC_SEQ_8188F(ptxdesc, pattrib->seqnum);\n\tSET_TX_DESC_HWSEQ_EN_8188F(ptxdesc, 1);\n\tSET_TX_DESC_USE_RATE_8188F(ptxdesc, 1);\n\tSET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1);\n\n\tif (pmp_priv->preamble)\n\t\tif (HwRateToMPTRate(pmp_priv->rateidx) <=  MPT_RATE_54M)\n\t\t\tSET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1);\n\n\tif (pmp_priv->bandwidth == CHANNEL_WIDTH_40) \n\t\tSET_TX_DESC_DATA_BW_8188F(ptxdesc, 1);\n\n\tSET_TX_DESC_TX_RATE_8188F(ptxdesc, pmp_priv->rateidx);\n\n\tSET_TX_DESC_DATA_RATE_FB_LIMIT_8188F(ptxdesc, 0x1F);\n\tSET_TX_DESC_RTS_RATE_FB_LIMIT_8188F(ptxdesc, 0xF);\n}\n#endif\n\nstatic void Rtw_MPSetMacTxEDCA(PADAPTER padapter)\n{\n\n\trtw_write32(padapter, 0x508 , 0x00a422); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval\n\t//DBG_871X(\"%s:write 0x508~~~~~~ 0x%x\\n\", __func__,rtw_read32(padapter, 0x508));\n\tPHY_SetMacReg(padapter, 0x458 ,bMaskDWord , 0x0);\n\t//DBG_8192C(\"%s()!!!!! 0x460 = 0x%x\\n\" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));\n\tPHY_SetMacReg(padapter, 0x460 ,bMaskLWord , 0x0);//fast EDCA queue packet interval & time out vaule\n\t//PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);\n\t//PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);\n\t//PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);\n\tDBG_8192C(\"%s()!!!!! 0x460 = 0x%x\\n\" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));\n\n}\n\nvoid SetPacketTx(PADAPTER padapter)\n{\n\tu8 *ptr, *pkt_start, *pkt_end,*fctrl;\n\tu32 pkt_size,offset,startPlace,i;\n\tstruct rtw_ieee80211_hdr *hdr;\n\tu8 payload;\n\ts32 bmcast;\n\tstruct pkt_attrib *pattrib;\n\tstruct mp_priv *pmp_priv;\n\n\tpmp_priv = &padapter->mppriv;\n\t\n\tif (pmp_priv->tx.stop) return;\n\tpmp_priv->tx.sended = 0;\n\tpmp_priv->tx.stop = 0;\n\tpmp_priv->tx_pktcount = 0;\n\n\t//3 1. update_attrib()\n\tpattrib = &pmp_priv->tx.attrib;\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\tbmcast = IS_MCAST(pattrib->ra);\n\tif (bmcast) {\n\t\tpattrib->mac_id = 1;\n\t\tpattrib->psta = rtw_get_bcmc_stainfo(padapter);\n\t} else {\n\t\tpattrib->mac_id = 0;\n\t\tpattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));\n\t}\n\tpattrib->mbssid = 0;\n\t\n\tpattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;\n\n\t//3 2. allocate xmit buffer\n\tpkt_size = pattrib->last_txcmdsz;\n\n\tif (pmp_priv->tx.pallocated_buf)\n\t\trtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size);\n\tpmp_priv->tx.write_size = pkt_size;\n\tpmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ;\n\tpmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size);\n\tif (pmp_priv->tx.pallocated_buf == NULL) {\n\t\tDBG_871X(\"%s: malloc(%d) fail!!\\n\", __func__, pmp_priv->tx.buf_size);\n\t\treturn;\n\t}\n\tpmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ);\n\tptr = pmp_priv->tx.buf;\n\n\t_rtw_memset(pmp_priv->tx.desc, 0, TXDESC_SIZE);\n\tpkt_start = ptr;\n\tpkt_end = pkt_start + pkt_size;\n\n\t//3 3. init TX descriptor\n#if defined(CONFIG_RTL8188E)\n\tif(IS_HARDWARE_TYPE_8188E(padapter))\n\t\tfill_tx_desc_8188e(padapter);\n#endif\n\n#if defined(CONFIG_RTL8814A)\n\tif(IS_HARDWARE_TYPE_8814A(padapter)) \n\t\tfill_tx_desc_8814a(padapter);\n#endif /* defined(CONFIG_RTL8814A) */\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif(IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) \n\t\tfill_tx_desc_8812a(padapter);\n#endif\n\n#if defined(CONFIG_RTL8192E)\n\tif(IS_HARDWARE_TYPE_8192E(padapter))\n\t\tfill_tx_desc_8192e(padapter);\n#endif\n#if defined(CONFIG_RTL8723B)\n\tif(IS_HARDWARE_TYPE_8723B(padapter))\n\t\tfill_tx_desc_8723b(padapter);\n#endif\n#if defined(CONFIG_RTL8703B)\n\tif (IS_HARDWARE_TYPE_8703B(padapter))\n\t\tfill_tx_desc_8703b(padapter);\n#endif\n\t\n#if defined(CONFIG_RTL8188F)\n\tif (IS_HARDWARE_TYPE_8188F(padapter))\n\t\tfill_tx_desc_8188f(padapter);\n#endif\n\n\t//3 4. make wlan header, make_wlanhdr()\n\thdr = (struct rtw_ieee80211_hdr *)pkt_start;\n\tSetFrameSubType(&hdr->frame_ctl, pattrib->subtype);\n\t//\n\tSetFrDs(&hdr->frame_ctl);\n\t_rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA\n\t_rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA\n\t_rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID\n\n\t//3 5. make payload\n\tptr = pkt_start + pattrib->hdrlen;\n\n\tswitch (pmp_priv->tx.payload) {\n\t\tcase 0:\n\t\t\tpayload = 0x00;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tpayload = 0x5a;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tpayload = 0xa5;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tpayload = 0xff;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpayload = 0x00;\n\t\t\tbreak;\n\t}\n\tpmp_priv->TXradomBuffer = rtw_zmalloc(4096);\n\tif(pmp_priv->TXradomBuffer == NULL)\n\t{\n\t\tDBG_871X(\"mp create random buffer fail!\\n\");\n\t\tgoto exit;\n\t}\n\t\n\t\n\tfor(i=0;i<4096;i++)\n\t\tpmp_priv->TXradomBuffer[i] = rtw_random32() %0xFF;\n\t\n\t//startPlace = (u32)(rtw_random32() % 3450);\n\t_rtw_memcpy(ptr, pmp_priv->TXradomBuffer,pkt_end - ptr);\n\t//_rtw_memset(ptr, payload, pkt_end - ptr);\n\trtw_mfree(pmp_priv->TXradomBuffer,4096);\n\t\n\t//3 6. start thread\n#ifdef PLATFORM_LINUX\n\tpmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, \"RTW_MP_THREAD\");\n\tif (IS_ERR(pmp_priv->tx.PktTxThread))\n\t\tDBG_871X(\"Create PktTx Thread Fail !!!!!\\n\");\n#endif\n#ifdef PLATFORM_FREEBSD\n{\n\tstruct proc *p;\n\tstruct thread *td;\n\tpmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv,\n\t\t\t\t\t&p, &td, RFHIGHPID, 0, \"MPXmitThread\", \"MPXmitThread\");\n\n\tif (pmp_priv->tx.PktTxThread < 0)\n\t\tDBG_871X(\"Create PktTx Thread Fail !!!!!\\n\");\n}\n#endif\n\n\tRtw_MPSetMacTxEDCA(padapter);\nexit:\n\treturn;\n}\n\nvoid SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tstruct mp_priv *pmppriv = &pAdapter->mppriv;\n\tu8\ttype;\n\ttype = _HW_STATE_AP_;\n\tif(bStartRx)\n\t{\n#ifdef CONFIG_RTL8723B\n\t\tPHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x3);// Power on adc  (in RX_WAIT_CCA state)\n\t\twrite_bbreg(pAdapter, 0xa01, BIT0, bDisable);// improve Rx performance by jerry\t\n#endif\n\t\tif(\tpmppriv->bSetRxBssid == _TRUE ){\n\t\t\t//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;\t \n\t\t\tpHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_AMF | RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF  ;\n\t\t\tpHalData->ReceiveConfig |= ACRC32; \n\t\t\t\n\t\t\tDBG_8192C(\"%s , pmppriv->network_macaddr =%x %x %x %x %x %x\\n\",__func__,\n\t\t\t\t\t\t\t\tpmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);\n\t\t\t//Set_MSR(pAdapter, WIFI_FW_AP_STATE);\n\t\t\t//rtw_hal_set_hwreg(pAdapter, HW_VAR_BSSID, pmppriv->network_macaddr);\n\t\t\t//rtw_hal_set_hwreg(pAdapter, HW_VAR_SET_OPMODE, (u8 *)(&type));\n\t\t}\n\t\telse\n\t\t{\n\t\tpHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS;\n\t\tpHalData->ReceiveConfig |= ACRC32;\n\t\trtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);\n\t\t// Accept all data frames\n\t\trtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF);\n\t\t// Accept CRC error and destination address\n\t\t}\n\t}\n\telse\n\t{\n#ifdef CONFIG_RTL8723B\n\t\tPHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x00);// Power off adc  (in RX_WAIT_CCA state)\n\t\twrite_bbreg(pAdapter, 0xa01, BIT0, bEnable);// improve Rx performance by jerry\t\n#endif\n\t\trtw_write32(pAdapter, REG_RCR, 0);\n\t}\n\n\tif (bAB)\n\t\trtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)|RCR_AB);\n\telse\n\t\trtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)&(~RCR_AB));\n}\n\nvoid ResetPhyRxPktCount(PADAPTER pAdapter)\n{\n\tu32 i, phyrx_set = 0;\n\n\tfor (i = 0; i <= 0xF; i++) {\n\t\tphyrx_set = 0;\n\t\tphyrx_set |= _RXERR_RPT_SEL(i);\t//select\n\t\tphyrx_set |= RXERR_RPT_RST;\t// set counter to zero\n\t\trtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);\n\t}\n}\n\nstatic u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit)\n{\n\t//selection\n\tu32 phyrx_set = 0, count = 0;\n\n\tphyrx_set = _RXERR_RPT_SEL(selbit & 0xF);\n\trtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);\n\n\t//Read packet count\n\tcount = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK;\n\n\treturn count;\n}\n\nu32 GetPhyRxPktReceived(PADAPTER pAdapter)\n{\n\tu32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;\n\n\tOFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK);\n\tCCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK);\n\tHT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK);\n\n\treturn OFDM_cnt + CCK_cnt + HT_cnt;\n}\n\nu32 GetPhyRxPktCRC32Error(PADAPTER pAdapter)\n{\n\tu32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;\n\n\tOFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL);\n\tCCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL);\n\tHT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL);\n\n\treturn OFDM_cnt + CCK_cnt + HT_cnt;\n}\n\n//reg 0x808[9:0]: FFT data x\n//reg 0x808[22]:  0  -->  1  to get 1 FFT data y\n//reg 0x8B4[15:0]: FFT data y report\nstatic u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point)\n{\n\tu32 psd_val=0;\n\t\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)\n\tu16 psd_reg = 0x910;\n\tu16 psd_regL= 0xF44;\n#else\t\n\tu16 psd_reg = 0x808;\n\tu16 psd_regL= 0x8B4;\n#endif\n\n\tpsd_val = rtw_read32(pAdapter, psd_reg);\n\n\tpsd_val &= 0xFFBFFC00;\n\tpsd_val |= point;\n\n\trtw_write32(pAdapter, psd_reg, psd_val);\n\trtw_mdelay_os(1);\n\tpsd_val |= 0x00400000;\n\n\trtw_write32(pAdapter, psd_reg, psd_val);\n\trtw_mdelay_os(1);\n\n\tpsd_val = rtw_read32(pAdapter, psd_regL);\n\tpsd_val &= 0x0000FFFF;\n\n\treturn psd_val;\n}\n\n/*\n * pts\tstart_point_min\t\tstop_point_max\n * 128\t64\t\t\t64 + 128 = 192\n * 256\t128\t\t\t128 + 256 = 384\n * 512\t256\t\t\t256 + 512 = 768\n * 1024\t512\t\t\t512 + 1024 = 1536\n *\n */\nu32 mp_query_psd(PADAPTER pAdapter, u8 *data)\n{\n\tu32 i, psd_pts=0, psd_start=0, psd_stop=0;\n\tu32 psd_data=0;\n\n\n#ifdef PLATFORM_LINUX\n\tif (!netif_running(pAdapter->pnetdev)) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"mp_query_psd: Fail! interface not opened!\\n\"));\n\t\treturn 0;\n\t}\n#endif\n\n\tif (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"mp_query_psd: Fail! not in MP mode!\\n\"));\n\t\treturn 0;\n\t}\n\n\tif (strlen(data) == 0) { //default value\n\t\tpsd_pts = 128;\n\t\tpsd_start = 64;\n\t\tpsd_stop = 128;   \n\t} else {\n\t\tsscanf(data, \"pts=%d,start=%d,stop=%d\", &psd_pts, &psd_start, &psd_stop);\n\t}\n\t\n\tdata[0]='\\0';\n\n\ti = psd_start;\n\twhile (i < psd_stop)\n\t{\n\t\tif (i >= psd_pts) {\n\t\t\tpsd_data = rtw_GetPSDData(pAdapter, i-psd_pts);\n\t\t} else {\n\t\t\tpsd_data = rtw_GetPSDData(pAdapter, i);\n\t\t}\n\t\tsprintf(data, \"%s%x \", data, psd_data);\n\t\ti++;\n\t}\n\n\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\trtw_msleep_os(100);\n\t#else\n\trtw_mdelay_os(100);\n\t#endif\n\n\treturn strlen(data)+1;\n}\n\n\n#if 0\nvoid _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)\n{\n\t   int i,res;\n\t  _adapter *padapter = pxmitpriv->adapter;\n\tstruct xmit_frame\t*pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;\n\t\n\tu32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;\n\tu32 num_xmit_extbuf = NR_XMIT_EXTBUFF;\n\tif(padapter->registrypriv.mp_mode ==0)\n\t{\n\t\tmax_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;\n\t\tnum_xmit_extbuf = NR_XMIT_EXTBUFF;\n\t}\n\telse\n\t{\n\t\t\tmax_xmit_extbuf_size = 6000;\n\t\t\tnum_xmit_extbuf = 8;\n\t}\n\n\tpxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;\n\tfor(i=0; i<num_xmit_extbuf; i++)\n\t{\n\t\trtw_os_xmit_resource_free(padapter, pxmitbuf,(max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _FALSE);\n\t\t\n\t\tpxmitbuf++;\n\t}\n\n\tif(pxmitpriv->pallocated_xmit_extbuf) {\n\t\trtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);\n\t}\n\n\tif(padapter->registrypriv.mp_mode ==0)\n\t{\n\t\t\tmax_xmit_extbuf_size = 6000;\n\t\t\tnum_xmit_extbuf = 8;\n\t}\n\telse\n\t{\n\t\tmax_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;\n\t\tnum_xmit_extbuf = NR_XMIT_EXTBUFF;\n\t}\n\t\n\t// Init xmit extension buff\n\t_rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);\n\n\tpxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);\n\t\n\tif (pxmitpriv->pallocated_xmit_extbuf  == NULL){\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"alloc xmit_extbuf fail!\\n\"));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);\n\n\tpxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;\n\n\tfor (i = 0; i < num_xmit_extbuf; i++)\n\t{\n\t\t_rtw_init_listhead(&pxmitbuf->list);\n\n\t\tpxmitbuf->priv_data = NULL;\n\t\tpxmitbuf->padapter = padapter;\n\t\tpxmitbuf->buf_tag = XMITBUF_MGNT;\n\n\t\tif((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->phead = pxmitbuf->pbuf;\n\t\tpxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n#endif\n\n\t\trtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));\n\t\t#ifdef DBG_XMIT_BUF_EXT\n\t\tpxmitbuf->no=i;\n\t\t#endif\n\t\tpxmitbuf++;\n\t\t\n\t}\n\n\tpxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;\n\nexit:\n\t;\n}\n#endif\n\n\nULONG getPowerDiffByRate8188E(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu1Byte\t\tCurrChannel,\n\tIN\tULONG\t\tRfPath\n\t)\n{\n\tPMPT_CONTEXT\t\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tULONG\tPwrGroup=0;\n\tULONG\tTxPower=0, Limit=0;\n\tULONG\tPathmapping = (RfPath == ODM_RF_PATH_A?0:8);\n\n\tswitch(pHalData->EEPROMRegulatory)\n\t{\n\t\tcase 0: // driver-defined maximum power offset for longer communication range\n\t\t\t\t// refer to power by rate table\n\t\t\tPwrGroup = 0;\n\t\t\tLimit = 0xff;\n\t\t\tbreak;\n\t\tcase 1: // Power-limit table-defined maximum power offset range \n\t\t\t\t// choosed by min(power by rate, power limit).\n\t\t\t{\n\t\t\t\tif(pHalData->pwrGroupCnt == 1)\n\t\t\t\t\tPwrGroup = 0;\n\t\t\t\tif(pHalData->pwrGroupCnt >= 3)\n\t\t\t\t{\n\t\t\t\t\tif(CurrChannel <= 3)\n\t\t\t\t\t\tPwrGroup = 0;\n\t\t\t\t\telse if(CurrChannel >= 4 && CurrChannel <= 9)\n\t\t\t\t\t\tPwrGroup = 1;\n\t\t\t\t\telse if(CurrChannel > 9)\n\t\t\t\t\t\tPwrGroup = 2;\n\t\t\t\t\t\t\n\t\t\t\t\tif(pHalData->CurrentChannelBW == CHANNEL_WIDTH_20)\n\t\t\t\t\t\tPwrGroup++;\n\t\t\t\t\telse\n\t\t\t\t\t\tPwrGroup+=4;\n\t\t\t\t}\n\t\t\t\tLimit = 0xff;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 2: // not support power offset by rate.\n\t\t\t\t// don't increase any power diff\n\t\t\tPwrGroup = 0;\n\t\t\tLimit = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tPwrGroup = 0;\n\t\t\tLimit = 0xff;\n\t\t\tbreak;\n\t}\n\n\n\t{\n\t\tswitch(pMptCtx->MptRateIndex)\n\t\t{\n\t\t\tcase MPT_RATE_1M:\n\t\t\tcase MPT_RATE_2M:\n\t\t\tcase MPT_RATE_55M:\n\t\t\tcase MPT_RATE_11M:\n\t\t\t\t//CCK rates, don't add any tx power index.\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"CCK rates!\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_6M:\t//0xe00 [31:0] = 18M,12M,09M,06M\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 6M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_9M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 9M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_12M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 12M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_18M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x, OFDM 24M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][0], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_24M:\t//0xe04[31:0] = 54M,48M,36M,24M\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 24M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_36M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 36M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_48M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 48M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_54M:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x, OFDM 54M, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][1], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS0: //0xe10[31:0]= MCS=03,02,01,00\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS0, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS1:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS1, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS2:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS2, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS3:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x, MCS3, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][2], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS4: //0xe14[31:0]= MCS=07,06,05,04\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS4, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS5:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS5, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS6:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS6, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS7:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x, MCS7, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][3], TxPower));\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase MPT_RATE_MCS8: //0xe18[31:0]= MCS=11,10,09,08\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS8, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS9:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS9, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS10:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS10, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS11:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x, MCS11, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][4], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS12:\t//0xe1c[31:0]= MCS=15,14,13,12\n\t\t\t\tTxPower += ((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS12, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS13:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff00)>>8);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS13, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS14:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff0000)>>16);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS14, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower));\n\t\t\t\tbreak;\n\t\t\tcase MPT_RATE_MCS15:\n\t\t\t\tTxPower += (((pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5+Pathmapping])&0xff000000)>>24);\n\t\t\t\t//RT_DISP(FPHY, PHY_TXPWR,(\"MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x, MCS15, TxPower = %d\\n\", \n\t\t\t\t//\tPwrGroup, pHalData->MCSTxPowerLevelOriginalOffset[PwrGroup][5], TxPower));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(TxPower > Limit)\n\t\tTxPower = Limit;\n\n\treturn TxPower;\n}\n\n\n\nstatic\tULONG\nmpt_ProQueryCalTxPower_8188E(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu1Byte\t\t\tRfPath\t\n\t)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu1Byte\t\t\t\tTxCount=TX_1S, i = 0;\t//default set to 1S\n\t//PMGNT_INFO\t\t\tpMgntInfo = &(pAdapter->MgntInfo); \n\tULONG\t\t\t\tTxPower = 1, PwrGroup=0, PowerDiffByRate=0;\n\tULONG\t\t\t\tTxPowerCCK = 1, TxPowerOFDM = 1, TxPowerBW20 = 1, TxPowerBW40 = 1 ; \n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu1Byte\t\t\t\tCurrChannel = pHalData->CurrentChannel;\n\tu1Byte\t\t\t\tindex = (CurrChannel -1);\t\n\tu1Byte\t\t\t\trf_path=(RfPath), rfPath;\n\tu1Byte\t\t\t\tlimit = 0, rate = 0;\n\n\tif(HAL_IsLegalChannel(pAdapter, CurrChannel) == FALSE)\n\t{\n\t\tCurrChannel = 1;\n\t}\t\n\t\n\tif(pMptCtx->MptRateIndex <= MPT_RATE_11M )\n\t{\n\t\tTxPower = pHalData->Index24G_CCK_Base[rf_path][index];\t\n\t}\n\telse if(pMptCtx->MptRateIndex >= MPT_RATE_6M &&\n\t\tpMptCtx->MptRateIndex <= MPT_RATE_54M )\n\t{\t\t\t\t\n\t\tTxPower = pHalData->Index24G_BW40_Base[rf_path][index];\n\t}\n\telse if(pMptCtx->MptRateIndex >= MPT_RATE_MCS0 &&\n\t\tpMptCtx->MptRateIndex <= MPT_RATE_MCS7 )\n\t{\n\t\tTxPower = pHalData->Index24G_BW40_Base[rf_path][index];\n\t}\n\t\n\t//RT_DISP(FPHY, PHY_TXPWR, (\"HT40 rate(%d) Tx power(RF-%c) = 0x%x\\n\", pMptCtx->MptRateIndex, ((rf_path==0)?'A':'B'), TxPower));\n\n\n\tif(pMptCtx->MptRateIndex >= MPT_RATE_6M &&\n\t\tpMptCtx->MptRateIndex <= MPT_RATE_54M )\n\t{\n\t\tTxPower += pHalData->OFDM_24G_Diff[rf_path][TxCount];\n\t\t///RT_DISP(FPHY, PHY_TXPWR, (\"+OFDM_PowerDiff(RF-%c) = 0x%x\\n\", ((rf_path==0)?'A':'B'), \n\t\t//\tpHalData->OFDM_24G_Diff[rf_path][TxCount]));\n\t}\n\n\tif(pMptCtx->MptRateIndex >= MPT_RATE_MCS0)\n\t{\n\t\tif (pHalData->CurrentChannelBW == CHANNEL_WIDTH_20)\n\t\t{\n\t\t\tTxPower += pHalData->BW20_24G_Diff[rf_path][TxCount];\n\t\t//\tRT_DISP(FPHY, PHY_TXPWR, (\"+HT20_PowerDiff(RF-%c) = 0x%x\\n\", ((rf_path==0)?'A':'B'), \n\t\t//\t\tpHalData->BW20_24G_Diff[rf_path][TxCount]));\n\t\t}\n\t}\n\n\n#ifdef ENABLE_POWER_BY_RATE\n\tPowerDiffByRate = getPowerDiffByRate8188E(pAdapter, CurrChannel, RfPath);\n#else\t\n\tPowerDiffByRate = 0;\n#endif\n\n\t// 2012/11/02 Awk: add power limit mechansim\n\tif( pMptCtx->MptRateIndex <= MPT_RATE_11M )\n\t{\n\t\trate = MGN_1M;\n\t}\n\telse if(pMptCtx->MptRateIndex >= MPT_RATE_6M &&\n\t\tpMptCtx->MptRateIndex <= MPT_RATE_54M )\n\t{\t\t\t\t\n\t\trate = MGN_54M;\n\t}\n\telse if(pMptCtx->MptRateIndex >= MPT_RATE_MCS0 &&\n\t\tpMptCtx->MptRateIndex <= MPT_RATE_MCS7 )\n\t{\n\t\trate = MGN_MCS7;\n\t}\n\n\tlimit = (u8)PHY_GetTxPowerLimit(pAdapter, pMptCtx->RegTxPwrLimit, \n\t\t\t\t\t\t\t\t   pHalData->CurrentBandType, \n\t\t\t\t\t\t\t\t   pHalData->CurrentChannelBW,RfPath, \n\t\t\t\t\t\t\t\t   rate, CurrChannel);\n\n\t//RT_DISP(FPHY, PHY_TXPWR, (\"+PowerDiffByRate(RF-%c) = 0x%x\\n\", ((rf_path==0)?'A':'B'), \n\t//\tPowerDiffByRate));\n\tTxPower += PowerDiffByRate;\n\t//RT_DISP(FPHY, PHY_TXPWR, (\"PowerDiffByRate limit value(RF-%c) = %d\\n\", ((rf_path==0)?'A':'B'), \n\t//\tlimit));\n\n\tTxPower +=  limit > (s8) PowerDiffByRate ? PowerDiffByRate : limit;\n\n\treturn TxPower; \n}\n\n\nu8 \nMptToMgntRate(\n\tIN\tULONG\tMptRateIdx\n\t)\n{\n// Mapped to MGN_XXX defined in MgntGen.h\n\tswitch (MptRateIdx) \n\t{\n\t\t/* CCK rate. */\n\t\tcase\tMPT_RATE_1M:\t\t\treturn MGN_1M;\t\t\n\t\tcase\tMPT_RATE_2M:\t\t\treturn MGN_2M;\t\t\n\t\tcase\tMPT_RATE_55M:\t\t\treturn MGN_5_5M;\t\n\t\tcase\tMPT_RATE_11M:\t\t\treturn MGN_11M; \t\n\t\t\t\t\t\t\t\t\t\t\t   \n\t\t/* OFDM rate. */\t\t\t\t\t   \n\t\tcase\tMPT_RATE_6M:\t\t\treturn MGN_6M; \n\t\tcase\tMPT_RATE_9M:\t\t\treturn MGN_9M; \n\t\tcase\tMPT_RATE_12M:\t\t\treturn MGN_12M;\n\t\tcase\tMPT_RATE_18M:\t\t\treturn MGN_18M;\n\t\tcase\tMPT_RATE_24M:\t\t\treturn MGN_24M; \t\n\t\tcase\tMPT_RATE_36M:\t\t\treturn MGN_36M;\n\t\tcase\tMPT_RATE_48M:\t\t\treturn MGN_48M;\n\t\tcase\tMPT_RATE_54M:\t\t\treturn MGN_54M;\n\t\t\t\t\t\t\t\t\t\t\t   \n\t\t/* HT rate. */\t\t\t\t\t\t   \n\t\tcase\tMPT_RATE_MCS0:\t\t\treturn MGN_MCS0; \n\t\tcase\tMPT_RATE_MCS1:\t\t\treturn MGN_MCS1; \n\t\tcase\tMPT_RATE_MCS2:\t\t\treturn MGN_MCS2; \n\t\tcase\tMPT_RATE_MCS3:\t\t\treturn MGN_MCS3; \n\t\tcase\tMPT_RATE_MCS4:\t\t\treturn MGN_MCS4;\t\n\t\tcase\tMPT_RATE_MCS5:\t\t\treturn MGN_MCS5;\t\n\t\tcase\tMPT_RATE_MCS6:\t\t\treturn MGN_MCS6;\t\n\t\tcase\tMPT_RATE_MCS7:\t\t\treturn MGN_MCS7;\t\n\t\tcase\tMPT_RATE_MCS8:\t\t\treturn MGN_MCS8;\t\n\t\tcase\tMPT_RATE_MCS9:\t\t\treturn MGN_MCS9;\t\n\t\tcase\tMPT_RATE_MCS10: \t\treturn MGN_MCS10;\t\n\t\tcase\tMPT_RATE_MCS11: \t\treturn MGN_MCS11;\t\n\t\tcase\tMPT_RATE_MCS12: \t\treturn MGN_MCS12;\t\n\t\tcase\tMPT_RATE_MCS13: \t\treturn MGN_MCS13;\t\n\t\tcase\tMPT_RATE_MCS14: \t\treturn MGN_MCS14;\t\n\t\tcase\tMPT_RATE_MCS15: \t\treturn MGN_MCS15;\t\n\t\tcase\tMPT_RATE_MCS16: \t\treturn MGN_MCS16;\n\t\tcase\tMPT_RATE_MCS17: \t\treturn MGN_MCS17;\n\t\tcase\tMPT_RATE_MCS18: \t\treturn MGN_MCS18;\n\t\tcase\tMPT_RATE_MCS19: \t\treturn MGN_MCS19;\n\t\tcase\tMPT_RATE_MCS20: \t\treturn MGN_MCS20;\n\t\tcase\tMPT_RATE_MCS21: \t\treturn MGN_MCS21;\n\t\tcase\tMPT_RATE_MCS22: \t\treturn MGN_MCS22;\n\t\tcase\tMPT_RATE_MCS23: \t\treturn MGN_MCS23;\n\t\tcase\tMPT_RATE_MCS24: \t\treturn MGN_MCS24;\n\t\tcase\tMPT_RATE_MCS25: \t\treturn MGN_MCS25;\n\t\tcase\tMPT_RATE_MCS26: \t\treturn MGN_MCS26;\n\t\tcase\tMPT_RATE_MCS27: \t\treturn MGN_MCS27;\n\t\tcase\tMPT_RATE_MCS28: \t\treturn MGN_MCS28;\n\t\tcase\tMPT_RATE_MCS29: \t\treturn MGN_MCS29;\n\t\tcase\tMPT_RATE_MCS30: \t\treturn MGN_MCS30;\n\t\tcase\tMPT_RATE_MCS31: \t\treturn MGN_MCS31;\n\t\t\t\t\t\t\t\t\t\t\t   \n\t\t/* VHT rate. */ \t\t\t\t\t   \n\t\tcase\tMPT_RATE_VHT1SS_MCS0:\treturn MGN_VHT1SS_MCS0;\n\t\tcase\tMPT_RATE_VHT1SS_MCS1:\treturn MGN_VHT1SS_MCS1;\n\t\tcase\tMPT_RATE_VHT1SS_MCS2:\treturn MGN_VHT1SS_MCS2;\n\t\tcase\tMPT_RATE_VHT1SS_MCS3:\treturn MGN_VHT1SS_MCS3;\n\t\tcase\tMPT_RATE_VHT1SS_MCS4:\treturn MGN_VHT1SS_MCS4;\n\t\tcase\tMPT_RATE_VHT1SS_MCS5:\treturn MGN_VHT1SS_MCS5;\n\t\tcase\tMPT_RATE_VHT1SS_MCS6:\treturn MGN_VHT1SS_MCS6;\n\t\tcase\tMPT_RATE_VHT1SS_MCS7:\treturn MGN_VHT1SS_MCS7;\n\t\tcase\tMPT_RATE_VHT1SS_MCS8:\treturn MGN_VHT1SS_MCS8;\n\t\tcase\tMPT_RATE_VHT1SS_MCS9:\treturn MGN_VHT1SS_MCS9;\n\t\tcase\tMPT_RATE_VHT2SS_MCS0:\treturn MGN_VHT2SS_MCS0; \n\t\tcase\tMPT_RATE_VHT2SS_MCS1:\treturn MGN_VHT2SS_MCS1; \n\t\tcase\tMPT_RATE_VHT2SS_MCS2:\treturn MGN_VHT2SS_MCS2; \n\t\tcase\tMPT_RATE_VHT2SS_MCS3:\treturn MGN_VHT2SS_MCS3; \n\t\tcase\tMPT_RATE_VHT2SS_MCS4:\treturn MGN_VHT2SS_MCS4; \n\t\tcase\tMPT_RATE_VHT2SS_MCS5:\treturn MGN_VHT2SS_MCS5; \n\t\tcase\tMPT_RATE_VHT2SS_MCS6:\treturn MGN_VHT2SS_MCS6; \n\t\tcase\tMPT_RATE_VHT2SS_MCS7:\treturn MGN_VHT2SS_MCS7; \n\t\tcase\tMPT_RATE_VHT2SS_MCS8:\treturn MGN_VHT2SS_MCS8; \n\t\tcase\tMPT_RATE_VHT2SS_MCS9:\treturn MGN_VHT2SS_MCS9; \n\t\tcase\tMPT_RATE_VHT3SS_MCS0:\treturn MGN_VHT3SS_MCS0; \n\t\tcase\tMPT_RATE_VHT3SS_MCS1:\treturn MGN_VHT3SS_MCS1; \n\t\tcase\tMPT_RATE_VHT3SS_MCS2:\treturn MGN_VHT3SS_MCS2; \n\t\tcase\tMPT_RATE_VHT3SS_MCS3:\treturn MGN_VHT3SS_MCS3; \n\t\tcase\tMPT_RATE_VHT3SS_MCS4:\treturn MGN_VHT3SS_MCS4; \n\t\tcase\tMPT_RATE_VHT3SS_MCS5:\treturn MGN_VHT3SS_MCS5; \n\t\tcase\tMPT_RATE_VHT3SS_MCS6:\treturn MGN_VHT3SS_MCS6; \n\t\tcase\tMPT_RATE_VHT3SS_MCS7:\treturn MGN_VHT3SS_MCS7; \n\t\tcase\tMPT_RATE_VHT3SS_MCS8:\treturn MGN_VHT3SS_MCS8; \n\t\tcase\tMPT_RATE_VHT3SS_MCS9:\treturn MGN_VHT3SS_MCS9; \n\t\tcase\tMPT_RATE_VHT4SS_MCS0:\treturn MGN_VHT4SS_MCS0; \n\t\tcase\tMPT_RATE_VHT4SS_MCS1:\treturn MGN_VHT4SS_MCS1; \n\t\tcase\tMPT_RATE_VHT4SS_MCS2:\treturn MGN_VHT4SS_MCS2; \n\t\tcase\tMPT_RATE_VHT4SS_MCS3:\treturn MGN_VHT4SS_MCS3; \n\t\tcase\tMPT_RATE_VHT4SS_MCS4:\treturn MGN_VHT4SS_MCS4; \n\t\tcase\tMPT_RATE_VHT4SS_MCS5:\treturn MGN_VHT4SS_MCS5; \n\t\tcase\tMPT_RATE_VHT4SS_MCS6:\treturn MGN_VHT4SS_MCS6; \n\t\tcase\tMPT_RATE_VHT4SS_MCS7:\treturn MGN_VHT4SS_MCS7; \n\t\tcase\tMPT_RATE_VHT4SS_MCS8:\treturn MGN_VHT4SS_MCS8; \n\t\tcase\tMPT_RATE_VHT4SS_MCS9:\treturn MGN_VHT4SS_MCS9; \n\t\t\n\t\tcase\tMPT_RATE_LAST:\t// fully automatiMGN_VHT2SS_MCS1;\t\n\t\tdefault:\t\t\t\t\t  \n\t\t\tDBG_871X(\"<===MptToMgntRate(), Invalid Rate: %d!!\\n\", MptRateIdx);\n\t\t\treturn 0x0; \t\t\t\t\t   \n\t}\t\t\t\t\t\t\t\t\t\t   \n}\t\t\t\t\t\t\t\t\t\t\t   \n\n\nu8 HwRateToMPTRate(u8 rate)\n{\n\tu8\tret_rate = MGN_1M;\n\n\t\tswitch (rate) {\n\t\tcase DESC_RATE1M:\n\t\t\tret_rate = MPT_RATE_1M;\t\tbreak;\n\t\tcase DESC_RATE2M:\n\t\t\tret_rate = MPT_RATE_2M;\t\tbreak;\n\t\tcase DESC_RATE5_5M:\n\t\t\tret_rate = MPT_RATE_55M;\tbreak;\n\t\tcase DESC_RATE11M:\n\t\t\tret_rate = MPT_RATE_11M;\tbreak;\n\t\tcase DESC_RATE6M:\n\t\t\tret_rate = MPT_RATE_6M;\t\tbreak;\n\t\tcase DESC_RATE9M:\n\t\t\tret_rate = MPT_RATE_9M;\t\tbreak;\n\t\tcase DESC_RATE12M:\n\t\t\tret_rate = MPT_RATE_12M;\tbreak;\n\t\tcase DESC_RATE18M:\n\t\t\tret_rate = MPT_RATE_18M;\tbreak;\n\t\tcase DESC_RATE24M:\n\t\t\tret_rate = MPT_RATE_24M;\tbreak;\n\t\tcase DESC_RATE36M:\n\t\t\tret_rate = MPT_RATE_36M;\tbreak;\n\t\tcase DESC_RATE48M:\n\t\t\tret_rate = MPT_RATE_48M;\tbreak;\n\t\tcase DESC_RATE54M:\n\t\t\tret_rate = MPT_RATE_54M;\tbreak;\n\t\tcase DESC_RATEMCS0:\n\t\t\tret_rate = MPT_RATE_MCS0;\tbreak;\n\t\tcase DESC_RATEMCS1:\n\t\t\tret_rate = MPT_RATE_MCS1;\tbreak;\n\t\tcase DESC_RATEMCS2:\n\t\t\tret_rate = MPT_RATE_MCS2;\tbreak;\n\t\tcase DESC_RATEMCS3:\n\t\t\tret_rate = MPT_RATE_MCS3;\tbreak;\n\t\tcase DESC_RATEMCS4:\n\t\t\tret_rate = MPT_RATE_MCS4;\tbreak;\n\t\tcase DESC_RATEMCS5:\n\t\t\tret_rate = MPT_RATE_MCS5;\tbreak;\n\t\tcase DESC_RATEMCS6:\n\t\t\tret_rate = MPT_RATE_MCS6;\tbreak;\n\t\tcase DESC_RATEMCS7:\n\t\t\tret_rate = MPT_RATE_MCS7;\tbreak;\n\t\tcase DESC_RATEMCS8:\n\t\t\tret_rate = MPT_RATE_MCS8;\tbreak;\n\t\tcase DESC_RATEMCS9:\n\t\t\tret_rate = MPT_RATE_MCS9;\tbreak;\n\t\tcase DESC_RATEMCS10:\n\t\t\tret_rate = MPT_RATE_MCS10;\tbreak;\n\t\tcase DESC_RATEMCS11:\n\t\t\tret_rate = MPT_RATE_MCS11;\tbreak;\n\t\tcase DESC_RATEMCS12:\n\t\t\tret_rate = MPT_RATE_MCS12;\tbreak;\n\t\tcase DESC_RATEMCS13:\n\t\t\tret_rate = MPT_RATE_MCS13;\tbreak;\n\t\tcase DESC_RATEMCS14:\n\t\t\tret_rate = MPT_RATE_MCS14;\tbreak;\n\t\tcase DESC_RATEMCS15:\n\t\t\tret_rate = MPT_RATE_MCS15;\tbreak;\n\t\tcase DESC_RATEMCS16:\n\t\t\tret_rate = MPT_RATE_MCS16;\tbreak;\n\t\tcase DESC_RATEMCS17:\n\t\t\tret_rate = MPT_RATE_MCS17;\tbreak;\n\t\tcase DESC_RATEMCS18:\n\t\t\tret_rate = MPT_RATE_MCS18;\tbreak;\n\t\tcase DESC_RATEMCS19:\n\t\t\tret_rate = MPT_RATE_MCS19;\tbreak;\n\t\tcase DESC_RATEMCS20:\n\t\t\tret_rate = MPT_RATE_MCS20;\tbreak;\n\t\tcase DESC_RATEMCS21:\n\t\t\tret_rate = MPT_RATE_MCS21;\tbreak;\n\t\tcase DESC_RATEMCS22:\n\t\t\tret_rate = MPT_RATE_MCS22;\tbreak;\n\t\tcase DESC_RATEMCS23:\n\t\t\tret_rate = MPT_RATE_MCS23;\tbreak;\n\t\tcase DESC_RATEMCS24:\n\t\t\tret_rate = MPT_RATE_MCS24;\tbreak;\n\t\tcase DESC_RATEMCS25:\n\t\t\tret_rate = MPT_RATE_MCS25;\tbreak;\n\t\tcase DESC_RATEMCS26:\n\t\t\tret_rate = MPT_RATE_MCS26;\tbreak;\n\t\tcase DESC_RATEMCS27:\n\t\t\tret_rate = MPT_RATE_MCS27;\tbreak;\n\t\tcase DESC_RATEMCS28:\n\t\t\tret_rate = MPT_RATE_MCS28;\tbreak;\n\t\tcase DESC_RATEMCS29:\n\t\t\tret_rate = MPT_RATE_MCS29;\tbreak;\n\t\tcase DESC_RATEMCS30:\n\t\t\tret_rate = MPT_RATE_MCS30;\tbreak;\n\t\tcase DESC_RATEMCS31:\n\t\t\tret_rate = MPT_RATE_MCS31;\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS0:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS1:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS2:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS3:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS4:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS5:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS6:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS7:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS8:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS9:\n\t\t\tret_rate = MPT_RATE_VHT1SS_MCS9;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS0:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS1:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS2:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS3:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS4:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS5:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS6:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS7:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS8:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS9:\n\t\t\tret_rate = MPT_RATE_VHT2SS_MCS9;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS0:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS1:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS2:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS3:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS4:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS5:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS6:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS7:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS8:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS9:\n\t\t\tret_rate = MPT_RATE_VHT3SS_MCS9;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS0:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS1:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS2:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS3:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS4:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS5:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS6:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS7:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS8:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS9:\n\t\t\tret_rate = MPT_RATE_VHT4SS_MCS9;\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBG_871X(\"HwRateToMRate(): Non supported Rate [%x]!!!\\n\", rate);\n\t\t\tbreak;\n\t}\n\treturn ret_rate;\n}\n\nu8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)\n{\n\tu16 i=0;\n \tu8* rateindex_Array[] = { \"1M\",\"2M\",\"5.5M\",\"11M\",\"6M\",\"9M\",\"12M\",\"18M\",\"24M\",\"36M\",\"48M\",\"54M\",\n \t\t\t\t\t\t\t\t\"HTMCS0\",\"HTMCS1\",\"HTMCS2\",\"HTMCS3\",\"HTMCS4\",\"HTMCS5\",\"HTMCS6\",\"HTMCS7\",\n \t\t\t\t\t\t\t\t\"HTMCS8\",\"HTMCS9\",\"HTMCS10\",\"HTMCS11\",\"HTMCS12\",\"HTMCS13\",\"HTMCS14\",\"HTMCS15\",\n \t\t\t\t\t\t\t\t\"HTMCS16\",\"HTMCS17\",\"HTMCS18\",\"HTMCS19\",\"HTMCS20\",\"HTMCS21\",\"HTMCS22\",\"HTMCS23\",\n \t\t\t\t\t\t\t\t\"HTMCS24\",\"HTMCS25\",\"HTMCS26\",\"HTMCS27\",\"HTMCS28\",\"HTMCS29\",\"HTMCS30\",\"HTMCS31\",\n \t\t\t\t\t\t\t\t\"VHT1MCS0\",\"VHT1MCS1\",\"VHT1MCS2\",\"VHT1MCS3\",\"VHT1MCS4\",\"VHT1MCS5\",\"VHT1MCS6\",\"VHT1MCS7\",\"VHT1MCS8\",\"VHT1MCS9\",\n \t\t\t\t\t\t\t\t\"VHT2MCS0\",\"VHT2MCS1\",\"VHT2MCS2\",\"VHT2MCS3\",\"VHT2MCS4\",\"VHT2MCS5\",\"VHT2MCS6\",\"VHT2MCS7\",\"VHT2MCS8\",\"VHT2MCS9\",\n \t\t\t\t\t\t\t\t\"VHT3MCS0\",\"VHT3MCS1\",\"VHT3MCS2\",\"VHT3MCS3\",\"VHT3MCS4\",\"VHT3MCS5\",\"VHT3MCS6\",\"VHT3MCS7\",\"VHT3MCS8\",\"VHT3MCS9\",\n \t\t\t\t\t\t\t\t\"VHT4MCS0\",\"VHT4MCS1\",\"VHT4MCS2\",\"VHT4MCS3\",\"VHT4MCS4\",\"VHT4MCS5\",\"VHT4MCS6\",\"VHT4MCS7\",\"VHT4MCS8\",\"VHT4MCS9\"};\n\n\tfor(i=0;i<=83;i++){\t\n\t\tif(strcmp(targetStr, rateindex_Array[i]) == 0){\n\t\t\tDBG_871X(\"%s , index = %d \\n\",__func__ ,i);\n\t\t\treturn i;\n\t\t}\n\t}\n\t\n\tprintk(\"%s ,please input a Data RATE String as:\",__func__);\n\tfor(i=0;i<=83;i++){\t\n\t\tprintk(\"%s \",rateindex_Array[i]);\n\t\tif(i%10==0)\n\t\t\tprintk(\"\\n\");\n\t}\t\n\treturn _FAIL;\n}\n\nULONG mpt_ProQueryCalTxPower(\n\tPADAPTER\tpAdapter,\n\t\tu8\t\tRfPath\n\t)\n{\n\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\n\tULONG\t\t\tTxPower = 1, PwrGroup=0, PowerDiffByRate=0;\t\n\tu1Byte\t\t\tlimit = 0, rate = 0;\n\tu8 mgn_rate = MptToMgntRate(pMptCtx->MptRateIndex);\n\n\t#if defined(CONFIG_RTL8188E)\n\tif (IS_HARDWARE_TYPE_8188E(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8188E(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\t#if defined(CONFIG_RTL8723B)\t\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8723B(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\t#if defined(CONFIG_RTL8192E)\n\tif (IS_HARDWARE_TYPE_8192E(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8192E(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8812A(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\t#if defined(CONFIG_RTL8814A)\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8814A(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\t#if defined(CONFIG_RTL8703B)\n\tif (IS_HARDWARE_TYPE_8703B(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8703B(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\t#if defined(CONFIG_RTL8188F)\n\tif (IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\tTxPower = PHY_GetTxPowerIndex_8188F(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel);\n\t#endif\n\n\tDBG_8192C(\"txPower=%d ,CurrentChannelBW=%d ,CurrentChannel=%d ,rate =%d\\n\",\n\t\t\t  TxPower, pHalData->CurrentChannelBW, pHalData->CurrentChannel, mgn_rate);\n\n\tpAdapter->mppriv.txpoweridx = (u8)TxPower;\n\tpMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)TxPower;\n\tpMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)TxPower;\n\tpMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)TxPower;\n\tpMptCtx->TxPwrLevel[ODM_RF_PATH_D]  = (u8)TxPower;\n\thal_mpt_SetTxPower(pAdapter);\n\n\treturn TxPower;\n}\n\n#ifdef CONFIG_MP_VHT_HW_TX_MODE\nstatic inline void dump_buf(u8 *buf, u32 len)\n{\n\tu32 i;\n\n\tDBG_871X(\"-----------------Len %d----------------\\n\", len);\n\tfor (i = 0; i < len; i++)\n\t\tDBG_871X(\"%2.2x-\", *(buf + i));\n\tDBG_871X(\"\\n\");\n}\n\nvoid ByteToBit(\n\tUCHAR\t*out,\n\tbool\t*in,\n\tUCHAR\tin_size)\n{\n\tUCHAR i = 0, j = 0;\n\n\tfor (i = 0; i < in_size; i++) {\n\t\tfor (j = 0; j < 8; j++) {\n\t\t\tif (in[8*i+j])\n\t\t\t\tout[i] |= (1 << j);\n\t\t}\n\t}\n}\n\n\nvoid CRC16_generator(\n\tbool *out,\n\tbool *in,\n\tUCHAR in_size\n)\n{\n\tUCHAR i = 0;\n\tbool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};\n\n\tfor (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/\n\t\ttemp = in[i]^reg[15];\n\t\treg[15]\t= reg[14];\n\t\treg[14]\t= reg[13];\n\t\treg[13]\t= reg[12];\n\t\treg[12]\t= reg[11];\n\t\treg[11]\t= reg[10];\n\t\treg[10]\t= reg[9];\n\t\treg[9]\t= reg[8];\n\t\treg[8]\t= reg[7];\n\n\t\treg[7]\t= reg[6];\n\t\treg[6]\t= reg[5];\n\t\treg[5]\t= reg[4];\n\t\treg[4]\t= reg[3];\n\t\treg[3]\t= reg[2];\n\t\treg[2]\t= reg[1];\n\t\treg[1]\t= reg[0];\n\t\treg[12]\t= reg[12] ^ temp;\n\t\treg[5]\t= reg[5] ^ temp;\n\t\treg[0]\t= temp;\n\t}\n\tfor (i = 0; i < 16; i++)\t/* take one's complement and bit reverse*/\n\t\tout[i] = 1-reg[15-i];\n}\n\n\n\n/*========================================\n\tSFD\t\tSIGNAL\tSERVICE\tLENGTH\tCRC\n\t16 bit\t8 bit\t8 bit\t16 bit\t16 bit\n========================================*/\nvoid CCK_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t)\n{\n\tdouble\tratio = 0;\n\tbool\tcrc16_in[32] = {0}, crc16_out[16] = {0};\n\tbool LengthExtBit;\n\tdouble LengthExact;\n\tdouble LengthPSDU;\n\tUCHAR i;\n\tUINT PacketLength = pPMacTxInfo->PacketLength;\n\n\tif (pPMacTxInfo->bSPreamble)\n\t\tpPMacTxInfo->SFD = 0x05CF;\n\telse\n\t\tpPMacTxInfo->SFD = 0xF3A0;\n\n\tswitch (pPMacPktInfo->MCS) {\n\tcase 0:\n\t\tpPMacTxInfo->SignalField = 0xA;\n\t\tratio = 8;\n\t\t/*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/\n\t\tcrc16_in[1] = crc16_in[3] = 1;\n\t\tbreak;\n\tcase 1:\n\t\tpPMacTxInfo->SignalField = 0x14;\n\t\tratio = 4;\n\t\t/*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/\n\t\tcrc16_in[2] = crc16_in[4] = 1;\n\t\tbreak;\n\tcase 2:\n\t\tpPMacTxInfo->SignalField = 0x37;\n\t\tratio = 8.0/5.5;\n\t\t/*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/\n\t\tcrc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1;\n\t\tbreak;\n\tcase 3:\n\t\tpPMacTxInfo->SignalField = 0x6E;\n\t\tratio = 8.0/11.0;\n\t\t/*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/\n\t\tcrc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1;\n\t\tbreak;\n\t}\n\n\tLengthExact = PacketLength*ratio;\n\tLengthPSDU = ceil(LengthExact);\n\n\tif ((pPMacPktInfo->MCS == 3) &&\n\t\t((LengthPSDU-LengthExact) >= 0.727 || (LengthPSDU-LengthExact) <= -0.727))\n\t\tLengthExtBit = 1;\n\telse\n\t\tLengthExtBit = 0;\n\n\n\tpPMacTxInfo->LENGTH = (UINT)LengthPSDU;\n\t/* CRC16_in(1,16:31) = LengthPSDU[0:15]*/\n\tfor (i = 0; i < 16; i++)\n\t\tcrc16_in[i+16] = (pPMacTxInfo->LENGTH >> i) & 0x1;\n\n\tif (LengthExtBit == 0) {\n\t\tpPMacTxInfo->ServiceField = 0x0;\n\t\t/* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/\n\t} else {\n\t\tpPMacTxInfo->ServiceField = 0x80;\n\t\t/*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/\n\t\tcrc16_in[15] = 1;\n\t}\n\n\tCRC16_generator(crc16_out, crc16_in, 32);\n\n\t_rtw_memset(pPMacTxInfo->CRC16, 0, 2);\n\tByteToBit(pPMacTxInfo->CRC16, crc16_out, 2);\n\n}\n\n\nvoid PMAC_Get_Pkt_Param(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo)\n{\n\n\tUCHAR\t\tTX_RATE_HEX = 0, MCS = 0;\n\tUCHAR\t\tTX_RATE = pPMacTxInfo->TX_RATE;\n\n\t/*\tTX_RATE & Nss\t*/\n\tif (MPT_IS_2SS_RATE(TX_RATE))\n\t\tpPMacPktInfo->Nss = 2;\n\telse if (MPT_IS_3SS_RATE(TX_RATE))\n\t\tpPMacPktInfo->Nss = 3;\n\telse if (MPT_IS_4SS_RATE(TX_RATE))\n\t\tpPMacPktInfo->Nss = 4;\n\telse\n\t\tpPMacPktInfo->Nss = 1;\n\n\tDBG_871X(\"PMacTxInfo.Nss =%d\\n\", pPMacPktInfo->Nss);\n\n\t/*\tMCS & TX_RATE_HEX*/\n\tif (MPT_IS_CCK_RATE(TX_RATE)) {\n\t\tswitch (TX_RATE) {\n\t\tcase MPT_RATE_1M:\n\t\t\tTX_RATE_HEX = MCS = 0; break;\n\t\tcase MPT_RATE_2M:\n\t\t\tTX_RATE_HEX = MCS = 1; break;\n\t\tcase MPT_RATE_55M:\n\t\t\tTX_RATE_HEX = MCS = 2; break;\n\t\tcase MPT_RATE_11M:\n\t\t\tTX_RATE_HEX = MCS = 3; break;\n\t\t}\n\t} else if (MPT_IS_OFDM_RATE(TX_RATE)) {\n\t\tMCS = TX_RATE - MPT_RATE_6M;\n\t\tTX_RATE_HEX = MCS + 4;\n\t} else if (MPT_IS_HT_RATE(TX_RATE)) {\n\t\tMCS = TX_RATE - MPT_RATE_MCS0;\n\t\tTX_RATE_HEX = MCS + 12;\n\t} else if (MPT_IS_VHT_RATE(TX_RATE)) {\n\t\tTX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44;\n\n\t\tif (MPT_IS_VHT_2S_RATE(TX_RATE))\n\t\t\tMCS = TX_RATE - MPT_RATE_VHT2SS_MCS0;\n\t\telse if (MPT_IS_VHT_3S_RATE(TX_RATE))\n\t\t\tMCS = TX_RATE - MPT_RATE_VHT3SS_MCS0;\n\t\telse if (MPT_IS_VHT_4S_RATE(TX_RATE))\n\t\t\tMCS = TX_RATE - MPT_RATE_VHT4SS_MCS0;\n\t\telse\n\t\t\tMCS = TX_RATE - MPT_RATE_VHT1SS_MCS0;\n\t}\n\n\tpPMacPktInfo->MCS = MCS;\n\tpPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX;\n\n\tDBG_871X(\" MCS=%d, TX_RATE_HEX =0x%x\\n\", MCS, pPMacTxInfo->TX_RATE_HEX);\n\t/*\tmSTBC & Nsts*/\n\tpPMacPktInfo->Nsts = pPMacPktInfo->Nss;\n\tif (pPMacTxInfo->bSTBC) {\n\t\tif (pPMacPktInfo->Nss == 1) {\n\t\t\tpPMacTxInfo->m_STBC = 2;\n\t\t\tpPMacPktInfo->Nsts = pPMacPktInfo->Nss*2;\n\t\t} else\n\t\t\tpPMacTxInfo->m_STBC = 1;\n\t} else\n\t\tpPMacTxInfo->m_STBC = 1;\n}\n\n\nUINT LDPC_parameter_generator(\n\tUINT N_pld_int,\n\tUINT N_CBPSS,\n\tUINT N_SS,\n\tUINT R,\n\tUINT m_STBC,\n\tUINT N_TCB_int\n)\n{\n\tdouble\tCR = 0.;\n\tdouble\tN_pld = (double)N_pld_int;\n\tdouble\tN_TCB = (double)N_TCB_int;\n\tdouble\tN_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.;\n\tdouble\tL_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.;\n\tdouble\tN_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.;\n\tdouble\tR_eff = 0.;\n\tUINT\tVHTSIGA2B3  = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/\n\n\tif (R == 0)\n\t\tCR\t= 0.5;\n\telse if (R == 1)\n\t\tCR = 2./3.;\n\telse if (R == 2)\n\t\tCR = 3./4.;\n\telse if (R == 3)\n\t\tCR = 5./6.;\n\n\tif (N_TCB <= 648.) {\n\t\tN_CW\t= 1.;\n\t\tif (N_TCB >= N_pld+912.*(1.-CR))\n\t\t\tL_LDPC\t= 1296.;\n\t\telse\n\t\t\tL_LDPC\t= 648.;\n\t} else if (N_TCB <= 1296.) {\n\t\tN_CW\t= 1.;\n\t\tif (N_TCB >= (double)N_pld + 1464.*(1.-CR))\n\t\t\tL_LDPC\t= 1944.;\n\t\telse\n\t\t\tL_LDPC\t= 1296.;\n\t} else if\t(N_TCB <= 1944.) {\n\t\tN_CW\t= 1.;\n\t\tL_LDPC\t= 1944.;\n\t} else if (N_TCB <= 2592.) {\n\t\tN_CW\t= 2.;\n\t\tif (N_TCB >= N_pld+2916.*(1.-CR))\n\t\t\tL_LDPC\t= 1944.;\n\t\telse\n\t\t\tL_LDPC\t= 1296.;\n\t} else {\n\t\tN_CW = ceil(N_pld/1944./CR);\n\t\tL_LDPC\t= 1944.;\n\t}\n\t/*\tNumber of information bits per CW*/\n\tK_LDPC = L_LDPC*CR;\n\t/*\tNumber of shortening bits\t\t\t\t\tmax(0, (N_CW * L_LDPC * R) - N_pld)*/\n\tN_shrt = (N_CW*K_LDPC-N_pld) > 0. ? (N_CW*K_LDPC-N_pld) : 0.;\n\t/*\tNumber of shortening bits per CW\t\t\tN_spcw = rtfloor(N_shrt/N_CW)*/\n\tN_spcw = rtfloor(N_shrt/N_CW);\n\t/*\tThe first N_fshrt CWs shorten 1 bit more*/\n\tN_fshrt = (double)((int)N_shrt % (int)N_CW);\n\t/*\tNumber of data bits for the last N_CW-N_fshrt CWs*/\n\tL_LDPC_info = K_LDPC-N_spcw;\n\t/*\tNumber of puncturing bits*/\n\tN_punc = (N_CW*L_LDPC-N_TCB-N_shrt) > 0. ? (N_CW*L_LDPC-N_TCB-N_shrt) : 0.;\n\tif (((N_punc > .1 * N_CW * L_LDPC * (1.-CR)) && (N_shrt < 1.2 * N_punc * CR/(1.-CR))) ||\n\t\t\t\t(N_punc > 0.3*N_CW*L_LDPC*(1.-CR))) {\n\t\t/*cout << \"*** N_TCB and N_punc are Recomputed ***\" << endl;*/\n\t\tVHTSIGA2B3 = 1;\n\t\tN_TCB += (double)N_CBPSS*N_SS*m_STBC;\n\t\tN_punc = (N_CW*L_LDPC-N_TCB-N_shrt) > 0. ? (N_CW*L_LDPC-N_TCB-N_shrt) : 0.;\n\t} else\n\t\tVHTSIGA2B3 = 0;\n\n\treturn VHTSIGA2B3;\n}\t/* function end of LDPC_parameter_generator */\n\n/*========================================\n\tData field of PPDU\n\tGet N_sym and SIGA2BB3\n========================================*/\nvoid PMAC_Nsym_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo)\n{\n\tUINT\tSIGA2B3 = 0;\n\tUCHAR\tTX_RATE = pPMacTxInfo->TX_RATE;\n\n\tUINT R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3};\n\tdouble CR = 0;\n\tUINT N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8};\n\tUINT N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0;\n\tint D_R = 0;\n\n\tDBG_871X(\"TX_RATE = %d\\n\", TX_RATE);\n\t/*\tN_SD*/\n\tif (pPMacTxInfo->BandWidth == 0)\n\t\tN_SD = 52;\n\telse if (pPMacTxInfo->BandWidth == 1)\n\t\tN_SD = 108;\n\telse\n\t\tN_SD = 234;\n\n\tif (MPT_IS_HT_RATE(TX_RATE)) {\n\t\tUCHAR MCS_temp;\n\n\t\tif (pPMacPktInfo->MCS > 23)\n\t\t\tMCS_temp = pPMacPktInfo->MCS - 24;\n\t\telse if (pPMacPktInfo->MCS > 15)\n\t\t\tMCS_temp = pPMacPktInfo->MCS - 16;\n\t\telse if (pPMacPktInfo->MCS > 7)\n\t\t\tMCS_temp = pPMacPktInfo->MCS - 8;\n\t\telse\n\t\t\tMCS_temp = pPMacPktInfo->MCS;\n\n\t\tR = R_list[MCS_temp];\n\n\t\tswitch (R) {\n\t\tcase 0:\n\t\t\tCR = .5;\tbreak;\n\t\tcase 1:\n\t\t\tCR = 2./3.;\tbreak;\n\t\tcase 2:\n\t\t\tCR = 3./4.;\tbreak;\n\t\tcase 3:\n\t\t\tCR = 5./6.;\tbreak;\n\t\t}\n\n\t\tN_BPSC = N_BPSC_list[MCS_temp];\n\t\tN_CBPS = N_BPSC*N_SD*pPMacPktInfo->Nss;\n\t\tN_DBPS = (UINT)((double)N_CBPS*CR);\n\n\t\tif (pPMacTxInfo->bLDPC == FALSE) {\n\t\t\tN_ES = (UINT)ceil((double)(N_DBPS * pPMacPktInfo->Nss)/4./300.);\n\t\t\tDBG_871X(\"N_ES = %d\\n\", N_ES);\n\n\t\t\t/*\tN_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/\n\t\t\tN_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16+N_ES*6)/\n\t\t\t\t\t(double)(N_DBPS*pPMacTxInfo->m_STBC));\n\n\t\t} else {\n\t\t\tN_ES = 1;\n\t\t\t/*\tN_pld = length * 8 + 16*/\n\t\t\tN_pld = pPMacTxInfo->PacketLength*8+16;\n\t\t\tDBG_871X(\"N_pld = %d\\n\", N_pld);\n\t\t\tN_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(N_pld)/\n\t\t\t\t\t(double)(N_DBPS*pPMacTxInfo->m_STBC));\n\t\t\tDBG_871X(\"N_SYM = %d\\n\", N_SYM);\n\t\t\t/*\tN_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/\n\t\t\tN_TCB = N_CBPS*N_SYM;\n\t\t\tDBG_871X(\"N_TCB = %d\\n\", N_TCB);\n\t\t\tSIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);\n\t\t\tDBG_871X(\"SIGA2B3 = %d\\n\", SIGA2B3);\n\t\t\tN_SYM = N_SYM + SIGA2B3*pPMacTxInfo->m_STBC;\n\t\t\tDBG_871X(\"N_SYM = %d\\n\", N_SYM);\n\t\t}\n\t} else if (MPT_IS_VHT_RATE(TX_RATE)) {\n\t\tR = R_list[pPMacPktInfo->MCS];\n\n\t\tswitch (R) {\n\t\tcase 0:\n\t\t\tCR = .5;\tbreak;\n\t\tcase 1:\n\t\t\tCR = 2./3.;\tbreak;\n\t\tcase 2:\n\t\t\tCR = 3./4.;\tbreak;\n\t\tcase 3:\n\t\t\tCR = 5./6.;\tbreak;\n\t\t}\n\t\tN_BPSC = N_BPSC_list[pPMacPktInfo->MCS];\n\t\tN_CBPS = N_BPSC*N_SD*pPMacPktInfo->Nss;\n\t\tN_DBPS = (UINT)((double)N_CBPS*CR);\n\t\tif (pPMacTxInfo->bLDPC == FALSE) {\n\t\t\tif (pPMacTxInfo->bSGI)\n\t\t\t\tN_ES = (UINT)ceil((double)(N_DBPS)/3.6/600.);\n\t\t\telse\n\t\t\t\tN_ES = (UINT)ceil((double)(N_DBPS)/4./600.);\n\t\t\t/*\tN_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/\n\t\t\tN_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16+N_ES*6)/(double)(N_DBPS*pPMacTxInfo->m_STBC));\n\t\t\tSIGA2B3 = 0;\n\t\t} else {\n\t\t\tN_ES = 1;\n\t\t\t/*\tN_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/\n\t\t\tN_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16)/(double)(N_DBPS*pPMacTxInfo->m_STBC));\n\t\t\t/*\tN_avbits = N_sys_init * N_CBPS*/\n\t\t\tN_TCB = N_CBPS * N_SYM;\n\t\t\t/*\tN_pld = N_sys_init * N_DBPS*/\n\t\t\tN_pld = N_SYM * N_DBPS;\n\t\t\tSIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);\n\t\t\tN_SYM = N_SYM + SIGA2B3*pPMacTxInfo->m_STBC;\n\t\t}\n\n\t\tswitch (R) {\n\t\tcase 0:\n\t\t\tD_R = 2;\tbreak;\n\t\tcase 1:\n\t\t\tD_R = 3;\tbreak;\n\t\tcase 2:\n\t\t\tD_R = 4;\tbreak;\n\t\tcase 3:\n\t\t\tD_R = 6;\tbreak;\n\t\t}\n\n\t\tif (((N_CBPS/N_ES)%D_R) != 0) {\n\t\t\tDBG_871X(\"MCS= %d is not supported when Nss=%d and BW= %d !!\\n\",  pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);\n\t\t\treturn;\n\t\t}\n\n\t\tDBG_871X(\"MCS= %d Nss=%d and BW= %d !!\\n\",  pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);\n\t}\n\n\tpPMacPktInfo->N_sym = N_SYM;\n\tpPMacPktInfo->SIGA2B3 = SIGA2B3;\n}\n\n/*========================================\n\tL-SIG\tRate\tR\tLength\tP\tTail\n\t\t\t4b\t\t1b\t12b\t\t1b\t6b\n========================================*/\n\nvoid L_SIG_generator(\n\tUINT\tN_SYM,\t\t/* Max: 750*/\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo)\n{\n\tu8\tsig_bi[24] = {0};\t/* 24 BIT*/\n\tUINT\tmode, LENGTH;\n\tint i;\n\n\tif (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) {\n\t\tmode = pPMacPktInfo->MCS;\n\t\tLENGTH = pPMacTxInfo->PacketLength;\n\t} else {\n\t\tUCHAR\tN_LTF;\n\t\tdouble\tT_data;\n\t\tUINT\tOFDM_symbol;\n\n\t\tmode = 0;\n\n\t\t/*\tTable 20-13 Num of HT-DLTFs request*/\n\t\tif (pPMacPktInfo->Nsts <= 2)\n\t\t\tN_LTF = pPMacPktInfo->Nsts;\n\t\telse\n\t\t\tN_LTF = 4;\n\n\t\tif (pPMacTxInfo->bSGI)\n\t\t\tT_data = 3.6;\n\t\telse\n\t\t\tT_data = 4.0;\n\n\t\t/*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/\n\t\tif (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE))\n\t\t\tOFDM_symbol = (UINT)ceil((double)(8+4+N_LTF*4+N_SYM*T_data+4)/4.);\n\t\telse\n\t\t\tOFDM_symbol = (UINT)ceil((double)(8+4+N_LTF*4+N_SYM*T_data)/4.);\n\n\t\tDBG_871X(\"%s , OFDM_symbol =%d\\n\", __func__, OFDM_symbol);\n\t\tLENGTH = OFDM_symbol*3-3;\n\t\tDBG_871X(\"%s , LENGTH =%d\\n\", __func__, LENGTH);\n\n\t}\n\t/*\tRate Field*/\n\t\tswitch (mode) {\n\t\tcase\t0:\n\t\t\tsig_bi[0] = 1; sig_bi[1] = 1; sig_bi[2] = 0; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t1:\n\t\t\tsig_bi[0] = 1; sig_bi[1] = 1; sig_bi[2] = 1; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t2:\n\t\t\tsig_bi[0] = 0; sig_bi[1] = 1; sig_bi[2] = 0; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t3:\n\t\t\tsig_bi[0] = 0; sig_bi[1] = 1; sig_bi[2] = 1; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t4:\n\t\t\tsig_bi[0] = 1; sig_bi[1] = 0; sig_bi[2] = 0; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t5:\n\t\t\tsig_bi[0] = 1; sig_bi[1] = 0; sig_bi[2] = 1; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t6:\n\t\t\tsig_bi[0] = 0; sig_bi[1] = 0; sig_bi[2] = 0; sig_bi[3] = 1;\n\t\t\tbreak;\n\t\tcase\t7:\n\t\t\tsig_bi[0] = 0; sig_bi[1] = 0; sig_bi[2] = 1; sig_bi[3] = 1;\n\t\t\tbreak;\n\t}\n\t/*Reserved bit*/\n\tsig_bi[4] = 0;\n\n\t/*\tLength Field*/\n\tfor (i = 0; i < 12; i++)\n\t\tsig_bi[i+5] = (LENGTH>>i) & 1;\n\n\t/* Parity Bit*/\n\tsig_bi[17] = 0;\n\tfor (i = 0; i < 17; i++)\n\t\tsig_bi[17] = sig_bi[17] + sig_bi[i];\n\n\tsig_bi[17] %= 2;\n\n\t/*\tTail Field*/\n\tfor (i = 18; i < 24; i++)\n\t\tsig_bi[i] = 0;\n\n\t/* dump_buf(sig_bi,24);*/\n\t_rtw_memset(pPMacTxInfo->LSIG, 0, 3);\n\tByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3);\n}\n\n\nvoid CRC8_generator(\n\tbool\t*out,\n\tbool\t*in,\n\tUCHAR\tin_size\n\t)\n{\n\tUCHAR i = 0;\n\tbool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1};\n\n\tfor (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/\n\t\ttemp = in[i]^reg[7];\n\t\treg[7]\t= reg[6];\n\t\treg[6]\t= reg[5];\n\t\treg[5]\t= reg[4];\n\t\treg[4]\t= reg[3];\n\t\treg[3]\t= reg[2];\n\t\treg[2]\t= reg[1] ^ temp;\n\t\treg[1]\t= reg[0] ^ temp;\n\t\treg[0]\t= temp;\n\t}\n\t\tfor (i = 0; i < 8; i++)/* take one's complement and bit reverse*/\n\t\t\tout[i] = reg[7-i]^1;\n\t}\n\n/*/================================================================================\n\tHT-SIG1\tMCS\tCW\tLength\t\t24BIT + 24BIT\n\t\t\t7b\t1b\t16b\n\tHT-SIG2\tSmoothing\tNot sounding\tRsvd\t\tAGG\tSTBC\tFEC\tSGI\tN_ELTF\tCRC\tTail\n\t\t\t1b\t\t\t1b\t\t\t1b\t\t1b\t2b\t\t1b\t1b\t2b\t\t8b\t6b\n================================================================================*/\nvoid HT_SIG_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t)\n{\n\tUINT i;\n\tbool sig_bi[48] = {0}, crc8[8] = {0};\n\t/*\tMCS Field*/\n\tfor (i = 0; i < 7; i++)\n\t\tsig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1;\n\t/*\tPacket BW Setting*/\n\tsig_bi[7] = pPMacTxInfo->BandWidth;\n\t/*\tHT-Length Field*/\n\tfor (i = 0; i < 16; i++)\n\t\tsig_bi[i+8] = (pPMacTxInfo->PacketLength >> i) & 0x1;\n\t/*\tSmoothing;\t1->allow smoothing*/\n\tsig_bi[24] = 1;\n\t/*Not Sounding*/\n\tsig_bi[25] = 1-pPMacTxInfo->NDP_sound;\n\t/*Reserved bit*/\n\tsig_bi[26] = 1;\n\t/*/Aggregate*/\n\tsig_bi[27] = 0;\n\t/*STBC Field*/\n\tif (pPMacTxInfo->bSTBC) {\n\t\tsig_bi[28] = 1;\n\t\tsig_bi[29] = 0;\n\t} else {\n\t\tsig_bi[28] = 0;\n\t\tsig_bi[29] = 0;\n\t}\n\t/*Advance Coding,\t0: BCC, 1: LDPC*/\n\tsig_bi[30] = pPMacTxInfo->bLDPC;\n\t/* Short GI*/\n\tsig_bi[31] = pPMacTxInfo->bSGI;\n\t/* N_ELTFs*/\n\tif (pPMacTxInfo->NDP_sound == FALSE) {\n\t\tsig_bi[32]\t= 0;\n\t\tsig_bi[33]\t= 0;\n\t} else {\n\t\tint\tN_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss;\n\n\t\tfor (i = 0; i < 2; i++)\n\t\t\tsig_bi[32+i] = (N_ELTF>>i)%2;\n\t}\n\t/*\tCRC-8*/\n\tCRC8_generator(crc8, sig_bi, 34);\n\n\tfor (i = 0; i < 8; i++)\n\t\tsig_bi[34+i] = crc8[i];\n\n\t/*Tail*/\n\tfor (i = 42; i < 48; i++)\n\t\tsig_bi[i] = 0;\n\n\t_rtw_memset(pPMacTxInfo->HT_SIG, 0, 6);\n\tByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6);\n}\n\n\n/*======================================================================================\n\tVHT-SIG-A1\n\tBW\tReserved\tSTBC\tG_ID\tSU_Nsts\tP_AID\tTXOP_PS_NOT_ALLOW\tReserved\n\t2b\t1b\t\t\t1b\t\t6b\t3b\t9b\t\t1b\t\t2b\t\t\t\t\t1b\n\tVHT-SIG-A2\n\tSGI\tSGI_Nsym\tSU/MU coding\tLDPC_Extra\tSU_NCS\tBeamformed\tReserved\tCRC\tTail\n\t1b\t1b\t\t\t1b\t\t\t\t1b\t\t\t4b\t\t1b\t\t\t1b\t\t\t8b\t6b\n======================================================================================*/\nvoid VHT_SIG_A_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo)\n{\n\tUINT i;\n\tbool sig_bi[48], crc8[8];\n\n\t_rtw_memset(sig_bi, 0, 48);\n\t_rtw_memset(crc8, 0, 8);\n\n\t/*\tBW Setting*/\n\tfor (i = 0; i < 2; i++)\n\t\tsig_bi[i] = (pPMacTxInfo->BandWidth>>i) & 0x1;\n\t/* Reserved Bit*/\n\tsig_bi[2] = 1;\n\t/*STBC Field*/\n\tsig_bi[3] = pPMacTxInfo->bSTBC;\n\t/*Group ID: Single User -> A value of 0 or 63 indicates an SU PPDU. */\n\tfor (i = 0; i < 6; i++)\n\t\tsig_bi[4+i] = 0;\n\t/*\tN_STS/Partial AID*/\n\tfor (i = 0; i < 12; i++) {\n\t\tif (i < 3)\n\t\t\tsig_bi[10+i] = ((pPMacPktInfo->Nsts - 1)>>i) & 0x1;\n\t\telse\n\t\t\tsig_bi[10+i] = 0;\n\t}\n\t/*TXOP_PS_NOT_ALLPWED*/\n\tsig_bi[22]\t= 0;\n\t/*Reserved Bits*/\n\tsig_bi[23]\t= 1;\n\t/*Short GI*/\n\tsig_bi[24] = pPMacTxInfo->bSGI;\n\tif (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym%10) == 9)\n\t\tsig_bi[25] = 1;\n\telse\n\t\tsig_bi[25] = 0;\n\t/* SU/MU[0] Coding*/\n\tsig_bi[26] = pPMacTxInfo->bLDPC;\t/*\t0:BCC, 1:LDPC\t\t*/\n\tsig_bi[27] = pPMacPktInfo->SIGA2B3;\t/*/\tRecord Extra OFDM Symols is added or not when LDPC is used*/\n\t/*SU MCS/MU[1-3] Coding*/\n\tfor (i = 0; i < 4; i++)\n\t\tsig_bi[28+i] = (pPMacPktInfo->MCS>>i) & 0x1;\n\t/*SU Beamform */\n\tsig_bi[32] = 0;\t/*packet.TXBF_en;*/\n\t/*Reserved Bit*/\n\tsig_bi[33] = 1;\n\t/*CRC-8*/\n\tCRC8_generator(crc8, sig_bi, 34);\n\tfor (i = 0; i < 8; i++)\n\t\tsig_bi[34+i]\t= crc8[i];\n\t/*Tail*/\n\tfor (i = 42; i < 48; i++)\n\t\tsig_bi[i] = 0;\n\n\t_rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6);\n\tByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6);\n}\n\n/*======================================================================================\n\tVHT-SIG-B\n\tLength\t\t\t\tResesrved\tTrail\n\t17/19/21 BIT\t\t3/2/2 BIT\t6b\n======================================================================================*/\nvoid VHT_SIG_B_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo)\n{\n\tbool sig_bi[32], crc8_bi[8];\n\tUINT i, len, res, tail = 6, total_len, crc8_in_len;\n\tUINT sigb_len;\n\n\t_rtw_memset(sig_bi, 0, 32);\n\t_rtw_memset(crc8_bi, 0, 8);\n\n\t/*Sounding Packet*/\n\tif (pPMacTxInfo->NDP_sound == 1) {\n\t\tif (pPMacTxInfo->BandWidth == 0) {\n\t\t\tbool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};\n\n\t\t\t_rtw_memcpy(sig_bi, sigb_temp, 26);\n\t\t} else if (pPMacTxInfo->BandWidth == 1) {\n\t\t\tbool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0};\n\n\t\t\t_rtw_memcpy(sig_bi, sigb_temp, 27);\n\t\t} else if (pPMacTxInfo->BandWidth == 2) {\n\t\t\tbool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};\n\n\t\t\t_rtw_memcpy(sig_bi, sigb_temp, 29);\n\t\t}\n\t} else {\t/* Not NDP Sounding*/\n\t\tbool *sigb_temp[29] = {0};\n\n\t\tif (pPMacTxInfo->BandWidth == 0) {\n\t\t\tlen = 17;\tres = 3;\n\t\t} else if (pPMacTxInfo->BandWidth == 1) {\n\t\t\tlen = 19;\tres = 2;\n\t\t} else if (pPMacTxInfo->BandWidth == 2) {\n\t\t\tlen\t= 21;\tres\t= 2;\n\t\t} else {\n\t\t\tlen\t= 21;\tres\t= 2;\n\t\t}\n\t\ttotal_len = len+res+tail;\n\t\tcrc8_in_len = len+res;\n\n\t\t/*Length Field*/\n\t\tsigb_len = (pPMacTxInfo->PacketLength + 3) >> 2;\n\n\t\tfor (i = 0; i < len; i++)\n\t\t\tsig_bi[i] = (sigb_len>>i) & 0x1;\n\t\t/*Reserved Field*/\n\t\tfor (i = 0; i < res; i++)\n\t\t\tsig_bi[len+i] = 1;\n\t\t/* CRC-8*/\n\t\tCRC8_generator(crc8_bi, sig_bi, crc8_in_len);\n\n\t\t/* Tail */\n\t\tfor (i = 0; i < tail; i++)\n\t\t\tsig_bi[len+res+i] = 0;\n\t}\n\n\t_rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4);\n\tByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4);\n\n\tpPMacTxInfo->VHT_SIG_B_CRC = 0;\n\tByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1);\n}\n\n/*=======================\n VHT Delimiter\n=======================*/\nvoid VHT_Delimiter_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo\n\t)\n{\n\tbool sig_bi[32] = {0}, crc8[8] = {0};\n\tUINT crc8_in_len = 16;\n\tUINT PacketLength = pPMacTxInfo->PacketLength;\n\tint j;\n\n\t/* Delimiter[0]: EOF*/\n\tsig_bi[0] = 1;\n\t/* Delimiter[1]: Reserved*/\n\tsig_bi[1] = 0;\n\t/* Delimiter[3:2]: MPDU Length High*/\n\tsig_bi[2] = ((PacketLength - 4) >> 12) % 2;\n\tsig_bi[3] = ((PacketLength - 4) >> 13) % 2;\n\t/* Delimiter[15:4]: MPDU Length Low*/\n\tfor (j = 4; j < 16; j++)\n\t\tsig_bi[j] = ((PacketLength - 4) >> (j-4)) % 2;\n\tCRC8_generator(crc8, sig_bi, crc8_in_len);\n\tfor (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/\n\t\tsig_bi[j] = crc8[j-16];\n\tfor (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/\n\t\tsig_bi[j]\t= (78 >> (j-24)) % 2;\n\n\t_rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4);\n\tByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4);\n}\n\n#endif\n#endif\n\n"
  },
  {
    "path": "core/rtw_mp_ioctl.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_MP_IOCTL_C_\n\n#include <drv_types.h>\n#include <rtw_mp_ioctl.h>\n#include \"../hal/phydm/phydm_precomp.h\"\n\n//****************  oid_rtl_seg_81_85   section start ****************\nNDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u8))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tif (poid_par_priv->type_of_oid == SET_OID) {\n\t\tAdapter->registrypriv.wireless_mode = *(u8*)poid_par_priv->information_buf;\n\t} else if (poid_par_priv->type_of_oid == QUERY_OID) {\n\t\t*(u8*)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\t RT_TRACE(_module_mp_, _drv_info_, (\"-query Wireless Mode=%d\\n\", Adapter->registrypriv.wireless_mode));\n\t} else {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n//****************  oid_rtl_seg_81_87_80   section start ****************\nNDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tstruct bb_reg_param *pbbreg;\n\tu16 offset;\n\tu32 value;\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_write_bb_reg_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);\n\n\toffset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff\n\tif (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR;\n\n\tvalue = pbbreg->value;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"oid_rt_pro_write_bb_reg_hdl: offset=0x%03X value=0x%08X\\n\",\n\t\t  offset, value));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\twrite_bbreg(Adapter, offset, 0xFFFFFFFF, value);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tstruct bb_reg_param *pbbreg;\n\tu16 offset;\n\tu32 value;\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_read_bb_reg_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf);\n\n\toffset = (u16)(pbbreg->offset) & 0xFFF; //0ffset :0x800~0xfff\n\tif (offset < BB_REG_BASE_ADDR) offset |= BB_REG_BASE_ADDR;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tvalue = read_bbreg(Adapter, offset, 0xFFFFFFFF);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tpbbreg->value = value;\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-oid_rt_pro_read_bb_reg_hdl: offset=0x%03X value:0x%08X\\n\",\n\t\t  offset, value));\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tstruct rf_reg_param *pbbreg;\n\tu8 path;\n\tu8 offset;\n\tu32 value;\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_write_rf_reg_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);\n\n\tif (pbbreg->path >= MAX_RF_PATH_NUMS)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\tif (pbbreg->offset > 0xFF)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\tif (pbbreg->value > 0xFFFFF)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpath = (u8)pbbreg->path;\n\toffset = (u8)pbbreg->offset;\n\tvalue = pbbreg->value;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"oid_rt_pro_write_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\\n\",\n\t\t  path, offset, value));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n \twrite_rfreg(Adapter, path, offset, value);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tstruct rf_reg_param *pbbreg;\n\tu8 path;\n\tu8 offset;\n\tu32 value;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_read_rf_reg_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf);\n\n\tif (pbbreg->path >= MAX_RF_PATH_NUMS)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\tif (pbbreg->offset > 0xFF)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpath = (u8)pbbreg->path;\n\toffset = (u8)pbbreg->offset;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tvalue = read_rfreg(Adapter, path, offset);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tpbbreg->value = value;\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-oid_rt_pro_read_rf_reg_hdl: path=%d offset=0x%02X value=0x%05X\\n\",\n\t\t  path, offset, value));\n\n_func_exit_;\n\n\treturn status;\n}\n//****************  oid_rtl_seg_81_87_00   section end****************\n//------------------------------------------------------------------------------\n\n//****************  oid_rtl_seg_81_80_00   section start ****************\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tratevalue;//4\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"+oid_rt_pro_set_data_rate_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len != sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tratevalue = *((u32*)poid_par_priv->information_buf);//4\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"oid_rt_pro_set_data_rate_hdl: data rate idx=%d\\n\", ratevalue));\n\tif (ratevalue >= MPT_RATE_LAST)\n\t\treturn NDIS_STATUS_INVALID_DATA;\n\n\tAdapter->mppriv.rateidx = ratevalue;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetDataRate(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tmode;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_start_test_hdl\\n\"));\n\n\tif (Adapter->registrypriv.mp_mode == 0)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\t//IQCalibrateBcut(Adapter);\n\n\tmode = *((u32*)poid_par_priv->information_buf);\n\tAdapter->mppriv.mode = mode;// 1 for loopback\n\n\tif (mp_start_test(Adapter) == _FAIL) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\tgoto exit;\n\t}\n\nexit:\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-oid_rt_pro_start_test_hdl: mp_mode=%d\\n\", Adapter->mppriv.mode));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+Set OID_RT_PRO_STOP_TEST\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tmp_stop_test(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-Set OID_RT_PRO_STOP_TEST\\n\"));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tChannel;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_set_channel_direct_call_hdl\\n\"));\n\n\tif (poid_par_priv->information_buf_len != sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tif (poid_par_priv->type_of_oid == QUERY_OID) {\n\t\t*((u32*)poid_par_priv->information_buf) = Adapter->mppriv.channel;\n\t\treturn NDIS_STATUS_SUCCESS;\n\t}\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tChannel = *((u32*)poid_par_priv->information_buf);\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"oid_rt_pro_set_channel_direct_call_hdl: Channel=%d\\n\", Channel));\n\tif (Channel > 14)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\tAdapter->mppriv.channel = Channel;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetChannel(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu16\t\tbandwidth;\n\tu16\t\tchannel_offset;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"+oid_rt_set_bandwidth_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tbandwidth = *((u32*)poid_par_priv->information_buf);//4\n\tchannel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\tif (bandwidth != CHANNEL_WIDTH_40)\n\t\tbandwidth = CHANNEL_WIDTH_20;\n\tpadapter->mppriv.bandwidth = (u8)bandwidth;\n\tpadapter->mppriv.prime_channel_offset = (u8)channel_offset;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetBandwidth(padapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-oid_rt_set_bandwidth_hdl: bandwidth=%d channel_offset=%d\\n\",\n\t\t  bandwidth, channel_offset));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tantenna;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_set_antenna_bb_hdl\\n\"));\n\n\tif (poid_par_priv->information_buf_len != sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tif (poid_par_priv->type_of_oid == SET_OID)\n\t{\n\t\tantenna = *(u32*)poid_par_priv->information_buf;\n\n\t\tAdapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16);\n\t\tAdapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF);\n\t\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t\t (\"oid_rt_pro_set_antenna_bb_hdl: tx_ant=0x%04x rx_ant=0x%04x\\n\",\n\t\t\t  Adapter->mppriv.antenna_tx, Adapter->mppriv.antenna_rx));\n\n\t\t_irqlevel_changed_(&oldirql, LOWER);\n\t\tSetAntenna(Adapter);\n\t\t_irqlevel_changed_(&oldirql, RAISE);\n\t} else {\n\t\tantenna = (Adapter->mppriv.antenna_tx << 16)|Adapter->mppriv.antenna_rx;\n\t\t*(u32*)poid_par_priv->information_buf = antenna;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\ttx_pwr_idx;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+oid_rt_pro_set_tx_power_control_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len != sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\ttx_pwr_idx = *((u32*)poid_par_priv->information_buf);\n\tif (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tAdapter->mppriv.txpoweridx = (u8)tx_pwr_idx;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"oid_rt_pro_set_tx_power_control_hdl: idx=0x%2x\\n\",\n\t\t  Adapter->mppriv.txpoweridx));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetTxPower(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n\n//------------------------------------------------------------------------------\n//****************  oid_rtl_seg_81_80_20   section start ****************\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid !=QUERY_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\tif (poid_par_priv->information_buf_len == sizeof(ULONG)) {\n\t\t*(ULONG*)poid_par_priv->information_buf =  Adapter->mppriv.tx_pktcount;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t} else {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\tRT_TRACE(_module_mp_, _drv_alert_, (\"===> oid_rt_pro_query_rx_packet_received_hdl.\\n\"));\n\tif (poid_par_priv->information_buf_len == sizeof(ULONG)) {\n\t\t*(ULONG*)poid_par_priv->information_buf =  Adapter->mppriv.rx_pktcount;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\tRT_TRACE(_module_mp_, _drv_alert_, (\"recv_ok:%d \\n\",Adapter->mppriv.rx_pktcount));\n\t} else {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\tRT_TRACE(_module_mp_, _drv_alert_, (\"===> oid_rt_pro_query_rx_packet_crc32_error_hdl.\\n\"));\n\tif (poid_par_priv->information_buf_len == sizeof(ULONG)) {\n\t\t*(ULONG*)poid_par_priv->information_buf =  Adapter->mppriv.rx_crcerrpktcount;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\tRT_TRACE(_module_mp_, _drv_alert_, (\"recv_err:%d \\n\",Adapter->mppriv.rx_crcerrpktcount));\n\t} else {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\n\nNDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\tRT_TRACE(_module_mp_, _drv_alert_, (\"===> oid_rt_pro_reset_tx_packet_sent_hdl.\\n\"));\n\tAdapter->mppriv.tx_pktcount = 0;\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t{\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\tif (poid_par_priv->information_buf_len == sizeof(ULONG)) {\n\t\tAdapter->mppriv.rx_pktcount = 0;\n\t\tAdapter->mppriv.rx_crcerrpktcount = 0;\n\t} else {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tResetPhyRxPktCount(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+oid_rt_get_phy_rx_packet_received_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len != sizeof(ULONG))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\t*(ULONG*)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-oid_rt_get_phy_rx_packet_received_hdl: recv_ok=%d\\n\", *(ULONG*)poid_par_priv->information_buf));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+oid_rt_get_phy_rx_packet_crc32_error_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\n\tif (poid_par_priv->information_buf_len != sizeof(ULONG))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\t*(ULONG*)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"-oid_rt_get_phy_rx_packet_crc32_error_hdl: recv_err=%d\\n\", *(ULONG*)poid_par_priv->information_buf));\n\n_func_exit_;\n\n\treturn status;\n}\n//****************  oid_rtl_seg_81_80_20   section end ****************\nNDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tbStartTest;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_set_continuous_tx_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tbStartTest = *((u32*)poid_par_priv->information_buf);\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetContinuousTx(Adapter,(u8)bStartTest);\n\tif (bStartTest) {\n\t\tstruct mp_priv *pmp_priv = &Adapter->mppriv;\n\t\tif (pmp_priv->tx.stop == 0) {\n\t\t\tpmp_priv->tx.stop = 1;\n\t\t\tDBG_871X(\"%s: pkt tx is running...\\n\", __func__);\n\t\t\trtw_msleep_os(5);\n\t\t}\n\t\tpmp_priv->tx.stop = 0;\n\t\tpmp_priv->tx.count = 1;\n\t\tSetPacketTx(Adapter);\n\t}\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tbStartTest;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_alert_, (\"+oid_rt_pro_set_single_carrier_tx_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tbStartTest = *((u32*)poid_par_priv->information_buf);\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetSingleCarrierTx(Adapter, (u8)bStartTest);\n\tif (bStartTest) {\n\t\tstruct mp_priv *pmp_priv = &Adapter->mppriv;\n\t\tif (pmp_priv->tx.stop == 0) {\n\t\t\tpmp_priv->tx.stop = 1;\n\t\t\tDBG_871X(\"%s: pkt tx is running...\\n\", __func__);\n\t\t\trtw_msleep_os(5);\n\t\t}\n\t\tpmp_priv->tx.stop = 0;\n\t\tpmp_priv->tx.count = 1;\n\t\tSetPacketTx(Adapter);\n\t}\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32\t\tbStartTest;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_set_carrier_suppression_tx_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tbStartTest = *((u32*)poid_par_priv->information_buf);\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetCarrierSuppressionTx(Adapter, (u8)bStartTest);\n\tif (bStartTest) {\n\t\tstruct mp_priv *pmp_priv = &Adapter->mppriv;\n\t\tif (pmp_priv->tx.stop == 0) {\n\t\t\tpmp_priv->tx.stop = 1;\n\t\t\tDBG_871X(\"%s: pkt tx is running...\\n\", __func__);\n\t\t\trtw_msleep_os(5);\n\t\t}\n\t\tpmp_priv->tx.stop = 0;\n\t\tpmp_priv->tx.count = 1;\n\t\tSetPacketTx(Adapter);\n\t}\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32 \t\tbStartTest;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_alert_, (\"+oid_rt_pro_set_single_tone_tx_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tbStartTest = *((u32*)poid_par_priv->information_buf);\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetSingleToneTx(Adapter,(u8)bStartTest);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv)\n{\n\treturn 0;\n}\n\nNDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\trtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, 0);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//****************  oid_rtl_seg_81_80_00   section end ****************\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tPNDIS_802_11_SSID pssid;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID);\n\t*poid_par_priv->bytes_rw = 0;\n\tif (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (mp_start_joinbss(Adapter, pssid) == _FAIL)\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID);\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpRW_Reg \tRegRWStruct;\n\tu32\t\toffset, width;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"+oid_rt_pro_read_register_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tRegRWStruct = (pRW_Reg)poid_par_priv->information_buf;\n\toffset = RegRWStruct->offset;\n\twidth = RegRWStruct->width;\n\n\tif (offset > 0xFFF)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tswitch (width) {\n\t\tcase 1:\n\t\t\tRegRWStruct->value = rtw_read8(Adapter, offset);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tRegRWStruct->value = rtw_read16(Adapter, offset);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\twidth = 4;\n\t\t\tRegRWStruct->value = rtw_read32(Adapter, offset);\n\t\t\tbreak;\n\t}\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"oid_rt_pro_read_register_hdl: offset:0x%04X value:0x%X\\n\",\n\t\t  offset, RegRWStruct->value));\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = width;\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpRW_Reg \tRegRWStruct;\n\tu32\t\toffset, width, value;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"+oid_rt_pro_write_register_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tRegRWStruct = (pRW_Reg)poid_par_priv->information_buf;\n\toffset = RegRWStruct->offset;\n\twidth = RegRWStruct->width;\n\tvalue = RegRWStruct->value;\n\n\tif (offset > 0xFFF)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tswitch (RegRWStruct->width)\n\t{\n\t\tcase 1:\n\t\t\tif (value > 0xFF) {\n\t\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trtw_write8(padapter, offset, (u8)value);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trtw_write16(padapter, offset, (u16)value);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\trtw_write32(padapter, offset, value);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\tbreak;\n\t}\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"-oid_rt_pro_write_register_hdl: offset=0x%08X width=%d value=0x%X\\n\",\n\t\t  offset, width, value));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpBurst_RW_Reg\tpBstRwReg;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_burst_read_register_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\trtw_read_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"-oid_rt_pro_burst_read_register_hdl\\n\"));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpBurst_RW_Reg\tpBstRwReg;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_burst_write_register_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\trtw_write_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"-oid_rt_pro_burst_write_register_hdl\\n\"));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tPADAPTER\tAdapter = (PADAPTER)( poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\n\tTX_CMD_Desc\t*TxCmd_Info;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+Set OID_RT_PRO_WRITE_TXCMD\\n\"));\n\n\tTxCmd_Info=(TX_CMD_Desc*)poid_par_priv->information_buf;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"WRITE_TXCMD:Addr=%.8X\\n\", TxCmd_Info->offset));\n  \tRT_TRACE(_module_mp_, _drv_info_, (\"WRITE_TXCMD:1.)%.8X\\n\", (ULONG)TxCmd_Info->TxCMD.value[0]));\n\tRT_TRACE(_module_mp_, _drv_info_, (\"WRITE_TXCMD:2.)%.8X\\n\", (ULONG)TxCmd_Info->TxCMD.value[1]));\n\tRT_TRACE(_module_mp_, _drv_info_, ((\"WRITE_TXCMD:3.)%.8X\\n\", (ULONG)TxCmd_Info->TxCMD.value[2]));\n\tRT_TRACE(_module_mp_, _drv_info_, (\"WRITE_TXCMD:4.)%.8X\\n\", (ULONG)TxCmd_Info->TxCMD.value[3]));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\trtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]);\n\trtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]);\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-Set OID_RT_PRO_WRITE_TXCMD: status=0x%08X\\n\", status));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpEEPROM_RWParam pEEPROM;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+Query OID_RT_PRO_READ16_EEPROM\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tpEEPROM->value = eeprom_read16(padapter, (u16)(pEEPROM->offset >> 1));\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_,  _drv_notice_,\n\t\t (\"-Query OID_RT_PRO_READ16_EEPROM: offset=0x%x value=0x%x\\n\",\n\t\t  pEEPROM->offset, pEEPROM->value));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv *poid_par_priv)\n{\n#if 0\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tpEEPROM_RWParam pEEPROM;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+Set OID_RT_PRO_WRITE16_EEPROM\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\teeprom_write16(padapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)( poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tstruct mp_wiparam *pwi_param;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tif (Adapter->mppriv.workparam.bcompleted == _FALSE)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpwi_param = (struct mp_wiparam *)poid_par_priv->information_buf;\n\n\t_rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam));\n\tAdapter->mppriv.act_in_progress = _FALSE;\n//\tRT_TRACE(_module_mp_, _drv_info_, (\"rf:%x\\n\", pwiparam->IoValue));\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)( poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro8711_pkt_loss_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(uint)*2) {\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"-oid_rt_pro8711_pkt_loss_hdl: buf_len=%d\\n\", (int)poid_par_priv->information_buf_len));\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\t}\n\n\tif (*(uint*)poid_par_priv->information_buf == 1)//init==1\n\t\tAdapter->mppriv.rx_pktloss = 0;\n\n\t*((uint*)poid_par_priv->information_buf+1) = Adapter->mppriv.rx_pktloss;\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)( poid_par_priv->adapter_context);\n\tstruct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;\n\tstruct intf_hdl\t*pintfhdl = &pio_queue->intf;\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n#ifdef CONFIG_SDIO_HCI\n\tvoid (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n#endif\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+Query OID_RT_RD_ATTRIB_MEM\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n#ifdef CONFIG_SDIO_HCI\n\t_irqlevel_changed_(&oldirql, LOWER);\n{\n\tu32 *plmem = (u32*)poid_par_priv->information_buf+2;\n\t_attrib_read = pintfhdl->io_ops._attrib_read;\n\t_attrib_read(pintfhdl, *((u32*)poid_par_priv->information_buf),\n\t\t\t\t*((u32*)poid_par_priv->information_buf+1), (u8*)plmem);\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n}\n\t_irqlevel_changed_(&oldirql, RAISE);\n#endif\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tstruct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue;\n\tstruct intf_hdl\t*pintfhdl = &pio_queue->intf;\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n#ifdef CONFIG_SDIO_HCI\n\tvoid (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n#endif\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n#ifdef CONFIG_SDIO_HCI\n\t_irqlevel_changed_(&oldirql, LOWER);\n{\n\tu32 *plmem = (u32*)poid_par_priv->information_buf + 2;\n\t_attrib_write = pintfhdl->io_ops._attrib_write;\n\t_attrib_write(pintfhdl, *(u32*)poid_par_priv->information_buf,\n\t\t\t\t*((u32*)poid_par_priv->information_buf+1), (u8*)plmem);\n}\n\t_irqlevel_changed_(&oldirql, RAISE);\n#endif\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS  oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+OID_RT_PRO_SET_RF_INTFS\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (rtw_setrfintfs_cmd(Adapter, *(unsigned char*)poid_par_priv->information_buf) == _FAIL)\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_rtw_memcpy(poid_par_priv->information_buf, (unsigned char*)&Adapter->mppriv.rxstat, sizeof(struct recv_stat));\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tPCFG_DBG_MSG_STRUCT pdbg_msg;\n\n_func_enter_;\n\n//\tRT_TRACE(0xffffffffff,_drv_alert_,(\"===> oid_rt_pro_cfg_debug_message_hdl.\\n\"));\n\n#if 0//#ifdef CONFIG_DEBUG_RTL871X\n\n\tpdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf);\n\n\tif (poid_par_priv->type_of_oid == SET_OID) {\n\t\tRT_TRACE(0xffffffffff, _drv_alert_,\n\t\t\t (\"===>Set level :0x%08x, H32:0x%08x L32:0x%08x\\n\",\n\t\t\t  pdbg_msg->DebugLevel, pdbg_msg->DebugComponent_H32, pdbg_msg->DebugComponent_L32));\n\n\t\tGlobalDebugLevel = pdbg_msg->DebugLevel;\n\t\tGlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32;\n\t\tRT_TRACE(0xffffffffff, _drv_alert_,\n\t\t\t (\"===> Set level :0x%08x, component:0x%016x\\n\",\n\t\t\t  GlobalDebugLevel, (u32)GlobalDebugComponents));\n\t} else {\n\t\tpdbg_msg->DebugLevel = GlobalDebugLevel;\n\t\tpdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32);\n\t\tpdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\t\tRT_TRACE(0xffffffffff, _drv_alert_,\n\t\t\t (\"===>Query level:0x%08x H32:0x%08x L32:0x%08x\\n\",\n\t\t\t  (u32)pdbg_msg->DebugLevel, (u32)pdbg_msg->DebugComponent_H32, (u32)pdbg_msg->DebugComponent_L32));\n\t}\n\n#endif\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+OID_RT_PRO_SET_DATA_RATE_EX\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) !=_SUCCESS)\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//-----------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tu8 thermal = 0;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_get_thermal_meter_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tGetThermalMeter(Adapter, &thermal);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*(u32*)poid_par_priv->information_buf = (u32)thermal;\n\t*poid_par_priv->bytes_rw = sizeof(u32);\n\n_func_exit_;\n\n\treturn status;\n}\n//-----------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_read_tssi_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (Adapter->mppriv.act_in_progress == _TRUE)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u8))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t//init workparam\n\tAdapter->mppriv.act_in_progress = _TRUE;\n\tAdapter->mppriv.workparam.bcompleted = _FALSE;\n\tAdapter->mppriv.workparam.act_type = MPT_READ_TSSI;\n\tAdapter->mppriv.workparam.io_offset = 0;\n\tAdapter->mppriv.workparam.io_value = 0xFFFFFFFF;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (!rtw_gettssi_cmd(Adapter,0, (u8*)&Adapter->mppriv.workparam.io_value))\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\n_func_enter_;\n\n//\tif (poid_par_priv->type_of_oid != SET_OID)\n//\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u8))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tif (poid_par_priv->type_of_oid == SET_OID) {\n\t\tu8 enable;\n\n\t\tenable = *(u8*)poid_par_priv->information_buf;\n\t\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t\t (\"+oid_rt_pro_set_power_tracking_hdl: enable=%d\\n\", enable));\n\n\t\tSetPowerTracking(Adapter, enable);\n\t} else {\n\t\tGetPowerTracking(Adapter, (u8*)poid_par_priv->information_buf);\n\t}\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//-----------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu32 ratevalue;\n\tu8 datarates[NumRates];\n\tint i;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+OID_RT_PRO_SET_BASIC_RATE\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n#if 0\n\tratevalue = *((u32*)poid_par_priv->information_buf);\n\n\tfor (i = 0; i < NumRates; i++) {\n\t\tif (ratevalue == mpdatarate[i])\n\t\t\tdatarates[i] = mpdatarate[i];\n\t\telse\n\t\t\tdatarates[i] = 0xff;\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_, _drv_info_, (\"basicrate_inx=%d\\n\", datarates[i]));\n\t}\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (rtw_setbasicrate_cmd(padapter, datarates) != _SUCCESS)\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n#endif\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-OID_RT_PRO_SET_BASIC_RATE: status=0x%08X\\n\", status));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < 8)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t*poid_par_priv->bytes_rw = 8;\n\t_rtw_memcpy(poid_par_priv->information_buf, &(adapter_to_pwrctl(Adapter)->pwr_mode), 8);\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-oid_rt_pro_qry_pwrstate_hdl: pwr_mode=%d smart_ps=%d\\n\",\n\t\t  adapter_to_pwrctl(Adapter)->pwr_mode, adapter_to_pwrctl(Adapter)->smart_ps));\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tuint pwr_mode, smart_ps;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+Set OID_RT_PRO_SET_PWRSTATE\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_rw = 0;\n\t*poid_par_priv->bytes_needed = 8;\n\n\tif (poid_par_priv->information_buf_len < 8)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpwr_mode = *(uint *)(poid_par_priv->information_buf);\n\tsmart_ps = *(uint *)((int)poid_par_priv->information_buf + 4);\n\n\t*poid_par_priv->bytes_rw = 8;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tstruct setratable_parm *prate_table;\n\tu8\t\tres;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_needed  = sizeof(struct setratable_parm);\n\tif (poid_par_priv->information_buf_len < sizeof(struct setratable_parm))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tprate_table = (struct setratable_parm*)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tres = rtw_setrttbl_cmd(Adapter, prate_table);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tif (res == _FAIL)\n\t\tstatus = NDIS_STATUS_FAILURE;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t#if 0\n\t\t\tstruct mp_wi_cntx *pmp_wi_cntx=&(Adapter->mppriv.wi_cntx);\n\t\t\tu8 res=_SUCCESS;\n\t\t\tDEBUG_INFO((\"===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\\n\"));\n\n\t\t\tif(pmp_wi_cntx->bmp_wi_progress ==_TRUE){\n\t\t\t\tDEBUG_ERR((\"\\n mp workitem is progressing, not allow to set another workitem right now!!!\\n\"));\n\t\t\t\tStatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tpmp_wi_cntx->bmp_wi_progress=_TRUE;\n\t\t\t\tpmp_wi_cntx->param.bcompleted=_FALSE;\n\t\t\t\tpmp_wi_cntx->param.act_type=MPT_GET_RATE_TABLE;\n\t\t\t\tpmp_wi_cntx->param.io_offset=0x0;\n\t\t\t\tpmp_wi_cntx->param.bytes_cnt=sizeof(struct getratable_rsp);\n\t\t\t\tpmp_wi_cntx->param.io_value=0xffffffff;\n\n\t\t\t\tres=rtw_getrttbl_cmd(Adapter,(struct getratable_rsp *)pmp_wi_cntx->param.data);\n\t\t\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\t\t\tif(res != _SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tStatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\t\t\t}\n\t\t\t}\n\t\t\tDEBUG_INFO((\"\\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\\n\"));\n\t#endif\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\n//****************  oid_rtl_seg_87_12_00   section start ****************\nNDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tstruct security_priv *psecuritypriv = &Adapter->securitypriv;\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tENCRY_CTRL_STATE encry_mode;\n\n\n\t*poid_par_priv->bytes_needed = sizeof(u8);\n\tif (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tif (poid_par_priv->type_of_oid == SET_OID)\n\t{\n\t\tencry_mode = *((u8*)poid_par_priv->information_buf);\n\t\tswitch (encry_mode)\n\t\t{\n\t\t\tcase HW_CONTROL:\n\t\t\t\t#if 0\n\t\t\t\tAdapter->registrypriv.software_decrypt=_FALSE;\n\t\t\t\tAdapter->registrypriv.software_encrypt=_FALSE;\n\t\t\t\t#else\n\t\t\t\tpsecuritypriv->sw_decrypt = _FALSE;\n\t\t\t\tpsecuritypriv->sw_encrypt = _FALSE;\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t\tcase SW_CONTROL:\n\t\t\t\t#if 0\n\t\t\t\tAdapter->registrypriv.software_decrypt=_TRUE;\n\t\t\t\tAdapter->registrypriv.software_encrypt=_TRUE;\n\t\t\t\t#else\n\t\t\t\tpsecuritypriv->sw_decrypt = _TRUE;\n\t\t\t\tpsecuritypriv->sw_encrypt = _TRUE;\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t\tcase HW_ENCRY_SW_DECRY:\n\t\t\t\t#if 0\n\t\t\t\tAdapter->registrypriv.software_decrypt=_TRUE;\n\t\t\t\tAdapter->registrypriv.software_encrypt=_FALSE;\n\t\t\t\t#else\n\t\t\t\tpsecuritypriv->sw_decrypt = _TRUE;\n\t\t\t\tpsecuritypriv->sw_encrypt = _FALSE;\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t\tcase SW_ENCRY_HW_DECRY:\n\t\t\t\t#if 0\n\t\t\t\tAdapter->registrypriv.software_decrypt=_FALSE;\n\t\t\t\tAdapter->registrypriv.software_encrypt=_TRUE;\n\t\t\t\t#else\n\t\t\t\tpsecuritypriv->sw_decrypt = _FALSE;\n\t\t\t\tpsecuritypriv->sw_encrypt = _TRUE;\n\t\t\t\t#endif\n\t\t\t\tbreak;\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_, _drv_notice_,\n\t\t\t (\"-oid_rt_pro_encryption_ctrl_hdl: SET encry_mode=0x%x sw_encrypt=0x%x sw_decrypt=0x%x\\n\",\n\t\t\t  encry_mode, psecuritypriv->sw_encrypt, psecuritypriv->sw_decrypt));\n\t}\n\telse {\n\t\t#if 0\n\t\tif (Adapter->registrypriv.software_encrypt == _FALSE) {\n\t\t\tif (Adapter->registrypriv.software_decrypt == _FALSE)\n\t\t\t\tencry_mode = HW_CONTROL;\n\t\t\telse\n\t\t\t\tencry_mode = HW_ENCRY_SW_DECRY;\n\t\t}\n\t\telse {\n\t\t\tif (Adapter->registrypriv.software_decrypt == _FALSE)\n\t\t\t\tencry_mode = SW_ENCRY_HW_DECRY;\n\t\t\telse\n\t\t\t\tencry_mode = SW_CONTROL;\n\t\t}\n\t\t#else\n\n\t\tif ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE))\n\t\t\tencry_mode = HW_CONTROL;\n\t\telse if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE))\n\t\t\tencry_mode = HW_ENCRY_SW_DECRY;\n\t\telse if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE))\n\t\t\tencry_mode = SW_ENCRY_HW_DECRY;\n\t\telse if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE))\n\t\t\tencry_mode = SW_CONTROL;\n\n\t\t#endif\n\n\t\t*(u8*)poid_par_priv->information_buf =  encry_mode;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\t\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t\t (\"-oid_rt_pro_encryption_ctrl_hdl: QUERY encry_mode=0x%x\\n\",\n\t\t\t  encry_mode));\n\t}\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tstruct sta_info *psta = NULL;\n\tUCHAR \t\t*macaddr;\n\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_needed = ETH_ALEN;\n\tif (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tmacaddr = (UCHAR *) poid_par_priv->information_buf ;\n\n\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_,\n\t\t (\"OID_RT_PRO_ADD_STA_INFO: addr=\"MAC_FMT\"\\n\", MAC_ARG(macaddr) ));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tpsta = rtw_get_stainfo(&Adapter->stapriv, macaddr);\n\n\tif (psta == NULL) { // the sta have been in sta_info_queue => do nothing\n\t\tpsta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr);\n\n\t\tif (psta == NULL) {\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,(\"Can't alloc sta_info when OID_RT_PRO_ADD_STA_INFO\\n\"));\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t} else { //(between drv has received this event before and  fw have not yet to set key to CAM_ENTRY)\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_, _drv_err_,\n\t\t\t(\"Error: OID_RT_PRO_ADD_STA_INFO: sta has been in sta_hash_queue \\n\"));\n\t}\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tstruct sta_info *psta = NULL;\n\tUCHAR\t\t*macaddr;\n\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_needed = ETH_ALEN;\n\tif (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tmacaddr = (UCHAR *) poid_par_priv->information_buf ;\n\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_notice_,\n\t\t (\"+OID_RT_PRO_ADD_STA_INFO: addr=\"MAC_FMT\"\\n\", MAC_ARG(macaddr) ));\n\n\tpsta = rtw_get_stainfo(&Adapter->stapriv, macaddr);\n\tif (psta != NULL) {\n\t\t//_enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);\n\t\trtw_free_stainfo(Adapter, psta);\n\t\t//_exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);\n\t}\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\n#if 0\nstatic u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var)\n{\n#ifdef CONFIG_SDIO_HCI\n\n\tif (offset == 1) {\n\t\tu16 tmp_blk_num;\n\t\ttmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM);\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"Query Information, mp_query_drv_var  SDIO_RX0_RDYBLK_NUM=0x%x   dvobj.rxblknum=0x%x\\n\", tmp_blk_num, adapter_to_dvobj(padapter)->rxblknum));\n\t\tif (adapter_to_dvobj(padapter)->rxblknum != tmp_blk_num) {\n\t\t\tRT_TRACE(_module_mp_,_drv_err_, (\"Query Information, mp_query_drv_var  call recv rx\\n\"));\n\t\t//\tsd_recv_rxfifo(padapter);\n\t\t}\n\t}\n\n#if 0\n\tif(offset <=100){  //For setting data rate and query data rate\n\t\tif(offset==100){ //For query data rate\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\"\\n mp_query_drv_var: offset(%d): query rate=0x%.2x \\n\",offset,padapter->registrypriv.tx_rate));\n\t\t\tvar=padapter->registrypriv.tx_rate;\n\n\t\t}\n\t\telse if(offset<0x1d){  //For setting data rate\n\t\t\tpadapter->registrypriv.tx_rate=offset;\n\t\t\tvar=padapter->registrypriv.tx_rate;\n\t\t\tpadapter->registrypriv.use_rate=_TRUE;\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\"\\n mp_query_drv_var: offset(%d): set rate=0x%.2x \\n\",offset,padapter->registrypriv.tx_rate));\n\t\t}\n\t\telse{ //not use the data rate\n\t\t\tpadapter->registrypriv.use_rate=_FALSE;\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\"\\n mp_query_drv_var: offset(%d) out of rate range\\n\",offset));\n\t\t}\n\t}\n\telse if (offset<=110){  //for setting debug level\n\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" mp_query_drv_var: offset(%d) for set debug level\\n\",offset));\n\t\tif(offset==110){ //For query data rate\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" mp_query_drv_var: offset(%d): query dbg level=0x%.2x \\n\",offset,padapter->registrypriv.dbg_level));\n\t\t\tpadapter->registrypriv.dbg_level=GlobalDebugLevel;\n\t\t\tvar=padapter->registrypriv.dbg_level;\n\t\t}\n\t\telse if(offset<110 && offset>100){\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" mp_query_drv_var: offset(%d): set dbg level=0x%.2x \\n\",offset,offset-100));\n\t\t\tpadapter->registrypriv.dbg_level=GlobalDebugLevel=offset-100;\n\t\t\tvar=padapter->registrypriv.dbg_level;\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" mp_query_drv_var(_drv_emerg_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_alert_, (\" mp_query_drv_var(_drv_alert_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_crit_, (\" mp_query_drv_var(_drv_crit_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_err_, (\" mp_query_drv_var(_drv_err_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_warning_, (\" mp_query_drv_var(_drv_warning_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_notice_, (\" mp_query_drv_var(_drv_notice_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_info_, (\" mp_query_drv_var(_drv_info_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\t\t\tRT_TRACE(_module_mp_, _drv_debug_, (\" mp_query_drv_var(_drv_debug_): offset(%d): set dbg level=0x%.2x \\n\",offset,GlobalDebugLevel));\n\n\t\t}\n\t}\n\telse if(offset >110 &&offset <116){\n\t\tif(115==offset){\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" mp_query_drv_var(_drv_emerg_): offset(%d): query TRX access type: [tx_block_mode=%x,rx_block_mode=%x]\\n\",\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toffset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));\n\t\t}\n\t\telse {\n\t\t\tswitch(offset){\n\t\t\t\tcase 111:\n\t\t\t\t\tadapter_to_dvobj(padapter)->tx_block_mode=1;\n\t\t\t\t\tadapter_to_dvobj(padapter)->rx_block_mode=1;\n\t\t\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, \\\n\t\t\t\t\t\t(\" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX block) [tx_block_mode=%x,rx_block_mode=%x]\\n\",\\\n\t\t\t\t\t\toffset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 112:\n\t\t\t\t\tadapter_to_dvobj(padapter)->tx_block_mode=1;\n\t\t\t\t\tadapter_to_dvobj(padapter)->rx_block_mode=0;\n\t\t\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, \\\n\t\t\t\t\t\t(\" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX block/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\\n\",\\\n\t\t\t\t\t\toffset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 113:\n\t\t\t\t\tadapter_to_dvobj(padapter)->tx_block_mode=0;\n\t\t\t\t\tadapter_to_dvobj(padapter)->rx_block_mode=1;\n\t\t\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, \\\n\t\t\t\t\t\t(\" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX block) [tx_block_mode=%x,rx_block_mode=%x]\\n\",\\\n\t\t\t\t\t\toffset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 114:\n\t\t\t\t\tadapter_to_dvobj(padapter)->tx_block_mode=0;\n\t\t\t\t\tadapter_to_dvobj(padapter)->rx_block_mode=0;\n\t\t\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, \\\n\t\t\t\t\t\t(\" mp_query_drv_var(_drv_emerg_): offset(%d): SET TRX access type:(TX byte/RX byte) [tx_block_mode=%x,rx_block_mode=%x]\\n\",\\\n\t\t\t\t\t\toffset, adapter_to_dvobj(padapter)->tx_block_mode, adapter_to_dvobj(padapter)->rx_block_mode));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\telse if(offset>=127){\n\t\tu64\tprnt_dbg_comp;\n\t\tu8   chg_idx;\n\t\tu64\ttmp_dbg_comp;\n\t\tchg_idx=offset-0x80;\n\t\ttmp_dbg_comp=BIT(chg_idx);\n\t\tprnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents;\n\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\" 1: mp_query_drv_var: offset(%d;0x%x):for dbg conpoment prnt_dbg_comp=0x%.16x GlobalDebugComponents=0x%.16x padapter->registrypriv.dbg_component=0x%.16x\\n\",offset,offset,prnt_dbg_comp,GlobalDebugComponents,padapter->registrypriv.dbg_component));\n\t\tif(offset==127){\n\t//\t\tprnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents;\n\t\t\tvar=(u32)(padapter->registrypriv.dbg_component);\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h)  GlobalDebugComponents=0x%x(l) 0x%x(h) \\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));\n\t\t\tprnt_dbg_comp=GlobalDebugComponents;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"2-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h)  GlobalDebugComponents=0x%x(l) 0x%x(h)\\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));\n\t\t\tprnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"2-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h)  GlobalDebugComponents=0x%x(l) 0x%x(h)\\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));\n\n\t\t}\n\t\telse{\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"3: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h) GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));\n\t\t\tprnt_dbg_comp=GlobalDebugComponents;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_,(\"3-1: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h)  GlobalDebugComponents=0x%x(l) 0x%x(h) chg_idx=%d\\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp,chg_idx));// (\"3-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment=0x%x chg_idx=%d or0x%x BIT(chg_idx[%d]=0x%x)\\n\",offset,offset,prnt_dbg_comp,chg_idx,chg_idx,(chg_idx),tmp_dbg_comp)\n\t\t\tprnt_dbg_comp=GlobalDebugComponents=padapter->registrypriv.dbg_component;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"3-2: mp_query_drv_var: offset(%d;0x%x):for query dbg conpoment=0x%x(l) 0x%x(h)  GlobalDebugComponents=0x%x(l) 0x%x(h)\\n\",offset,offset,padapter->registrypriv.dbg_component,prnt_dbg_comp));\n\n\t\t\tif(GlobalDebugComponents&tmp_dbg_comp){\n\t\t\t\t//this bit is already set, now clear it\n\t\t\t\tGlobalDebugComponents=GlobalDebugComponents&(~tmp_dbg_comp);\n\t\t\t}\n\t\t\telse{\n\t\t\t\t//this bit is not set, now set it.\n\t\t\t\tGlobalDebugComponents =GlobalDebugComponents|tmp_dbg_comp;\n\t\t\t}\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"4: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)\",offset,offset,tmp_dbg_comp,prnt_dbg_comp));\n\t\t\tprnt_dbg_comp=GlobalDebugComponents;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\"4-1: mp_query_drv_var: offset(%d;0x%x):before set dbg conpoment tmp_dbg_comp=0x%x GlobalDebugComponents=0x%x(l) 0x%x(h)\",offset,offset,tmp_dbg_comp,prnt_dbg_comp));\n\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_emerg_, (\"0: mp_query_drv_var(_module_rtl871x_xmit_c_:0): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,prnt_dbg_comp));\n\t\t\tRT_TRACE(_module_xmit_osdep_c_, _drv_emerg_, (\"1: mp_query_drv_var(_module_xmit_osdep_c_:1): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_emerg_, (\"2: mp_query_drv_var(_module_rtl871x_recv_c_:2): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_recv_osdep_c_, _drv_emerg_, (\"3: mp_query_drv_var(_module_recv_osdep_c_:3): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_emerg_, (\"4: mp_query_drv_var(_module_rtl871x_mlme_c_:4): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_mlme_osdep_c_, _drv_emerg_, (\" 5:mp_query_drv_var(_module_mlme_osdep_c_:5): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_emerg_, (\"6: mp_query_drv_var(_module_rtl871x_sta_mgt_c_:6): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_cmd_c_, _drv_emerg_, (\"7: mp_query_drv_var(_module_rtl871x_cmd_c_:7): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_cmd_osdep_c_, _drv_emerg_, (\"8: mp_query_drv_var(_module_cmd_osdep_c_:8): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_io_c_, _drv_emerg_, (\"9: mp_query_drv_var(_module_rtl871x_io_c_:9): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_io_osdep_c_, _drv_emerg_, (\"10: mp_query_drv_var(_module_io_osdep_c_:10): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_os_intfs_c_, _drv_emerg_, (\"11: mp_query_drv_var(_module_os_intfs_c_:11): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_security_c_, _drv_emerg_, (\"12: mp_query_drv_var(_module_rtl871x_security_c_:12): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_eeprom_c_, _drv_emerg_, (\"13: mp_query_drv_var(_module_rtl871x_eeprom_c_:13): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_hal_init_c_, _drv_emerg_, (\"14: mp_query_drv_var(_module_hal_init_c_:14): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_hci_hal_init_c_, _drv_emerg_, (\"15: mp_query_drv_var(_module_hci_hal_init_c_:15): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_c_, _drv_emerg_, (\"16: mp_query_drv_var(_module_rtl871x_ioctl_c_:16): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_emerg_, (\"17: mp_query_drv_var(_module_rtl871x_ioctl_set_c_:17): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_query_c_, _drv_emerg_, (\"18: mp_query_drv_var(_module_rtl871x_ioctl_query_c_:18): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_emerg_, (\"19: mp_query_drv_var(_module_rtl871x_pwrctrl_c_:19): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_hci_intfs_c_, _drv_emerg_, (\"20: mp_query_drv_var(_module_hci_intfs_c_:20): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_hci_ops_c_, _drv_emerg_, (\"21: mp_query_drv_var(_module_hci_ops_c_:21): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_osdep_service_c_, _drv_emerg_, (\"22: mp_query_drv_var(_module_osdep_service_c_:22): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\"23: mp_query_drv_var(_module_mp_:23): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tRT_TRACE(_module_hci_ops_os_c_, _drv_emerg_, (\"24: mp_query_drv_var(_module_hci_ops_os_c_:24): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\t\t\tvar=(u32)(GlobalDebugComponents);\n\t\t\t//GlobalDebugComponents=padapter->registrypriv.dbg_component;\n\t\t\tRT_TRACE(0xffffffff, _drv_emerg_, (\" ==mp_query_drv_var(_module_mp_): offset(%d;0x%x):before set dbg conpoment=0x%x(l) 0x%x(h)\\n\",offset,offset,GlobalDebugComponents));\n\n\t\t}\n\t}\n\telse{\n\t\tRT_TRACE(_module_mp_, _drv_emerg_, (\"\\n mp_query_drv_var: offset(%d) >110\\n\",offset));\n\t}\n#endif\n#endif\n\n\treturn var;\n}\n#endif\n\nNDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\t\toldirql;\n#endif\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\n\tDR_VARIABLE_STRUCT\t*pdrv_var;\n\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\t*poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT);\n\tif (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+Query Information, OID_RT_PRO_QUERY_DR_VARIABLE\\n\"));\n\n\tpdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tpdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"-oid_rt_pro_query_dr_variable_hdl: offset=0x%x valule=0x%x\\n\",\n\t\t  pdrv_var->offset, pdrv_var->variable));\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tRT_TRACE(_module_mp_, _drv_err_, (\"oid_rt_pro_rx_packet_type_hdl...................\\n\"));\n\n\tif (poid_par_priv->information_buf_len < sizeof (UCHAR)) {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t\t*poid_par_priv->bytes_needed = sizeof(UCHAR);\n\t\treturn status;\n\t}\n\n\tif (poid_par_priv->type_of_oid == SET_OID) {\n\t\tAdapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf;\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, (\"Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \\n\",\\\n\t\t\t\t\t\t\t\t\t\t\t\tAdapter->mppriv.rx_with_status));\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,(\"MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x  \\n\",\n\t\t\tAdapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\\\n\t\t\tAdapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5]));\n\n\t}\n\telse {\n\t\t*(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_, (\"Query Information, OID_RT_PRO_RX_PACKET_TYPE:%d \\n\", \\\n\t\t\t\t\t\t\t\t\t\t\t\tAdapter->mppriv.rx_with_status));\n\n\t\t//*(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050);\n\t\t//*(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054);\n\t\tRT_TRACE(_module_rtl871x_ioctl_c_,_drv_err_,(\"MAC addr=0x%x:0x%x:0x%x:0x%x:0x%x:0x%x  \\n\",\n\t\t\tAdapter->eeprompriv.mac_addr[0],Adapter->eeprompriv.mac_addr[1],Adapter->eeprompriv.mac_addr[2],\\\n\t\t\tAdapter->eeprompriv.mac_addr[3],Adapter->eeprompriv.mac_addr[4],Adapter->eeprompriv.mac_addr[5]));\n\t}\n#endif\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tPEFUSE_ACCESS_STRUCT pefuse;\n\tu8 *data;\n\tu16 addr = 0, cnts = 0, max_available_size = 0;\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tpefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;\n\taddr = pefuse->start_addr;\n\tcnts = pefuse->cnts;\n\tdata = pefuse->data;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t(\"+oid_rt_pro_read_efuse_hd: buf_len=%d addr=%d cnts=%d\\n\",\n\t\t poid_par_priv->information_buf_len, addr, cnts));\n\n\tEFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\n\tif ((addr + cnts) > max_available_size) {\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"!oid_rt_pro_read_efuse_hdl: parameter error!\\n\"));\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\t}\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tif (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) {\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"!oid_rt_pro_read_efuse_hdl: rtw_efuse_access FAIL!\\n\"));\n\t\tstatus = NDIS_STATUS_FAILURE;\n\t} else\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL oldirql;\n#endif\n\tPEFUSE_ACCESS_STRUCT pefuse;\n\tu8 *data;\n\tu16 addr = 0, cnts = 0, max_available_size = 0;\n\tNDIS_STATUS status = NDIS_STATUS_SUCCESS;\n\tPADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tpefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf;\n\taddr = pefuse->start_addr;\n\tcnts = pefuse->cnts;\n\tdata = pefuse->data;\n\n\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t (\"+oid_rt_pro_write_efuse_hdl: buf_len=%d addr=0x%04x cnts=%d\\n\",\n\t\t  poid_par_priv->information_buf_len, addr, cnts));\n\n\tEFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\n\tif ((addr + cnts) > max_available_size) {\n\t\tRT_TRACE(_module_mp_, _drv_err_, (\"!oid_rt_pro_write_efuse_hdl: parameter error\"));\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\t}\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tif (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL)\n\t\tstatus = NDIS_STATUS_FAILURE;\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tPPGPKT_STRUCT\tppgpkt;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n//\tRT_TRACE(_module_mp_, _drv_info_, (\"+oid_rt_pro_rw_efuse_pgpkt_hdl\\n\"));\n\n\t*poid_par_priv->bytes_rw = 0;\n\n\tif (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (poid_par_priv->type_of_oid == QUERY_OID)\n\t{\n\t\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t\t(\"oid_rt_pro_rw_efuse_pgpkt_hdl: Read offset=0x%x\\n\",\\\n\t\t\tppgpkt->offset));\n\n\t\tEfuse_PowerSwitch(Adapter, _FALSE, _TRUE);\n\t\tif (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE)\n\t\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\telse\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\tEfuse_PowerSwitch(Adapter, _FALSE, _FALSE);\n\t} else {\n\t\tRT_TRACE(_module_mp_, _drv_notice_,\n\t\t\t(\"oid_rt_pro_rw_efuse_pgpkt_hdl: Write offset=0x%x word_en=0x%x\\n\",\\\n\t\t\tppgpkt->offset, ppgpkt->word_en));\n\n\t\tEfuse_PowerSwitch(Adapter, _TRUE, _TRUE);\n\t\tif (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE)\n\t\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t\telse\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\tEfuse_PowerSwitch(Adapter, _TRUE, _FALSE);\n\t}\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"-oid_rt_pro_rw_efuse_pgpkt_hdl: status=0x%08X\\n\", status));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu16 size;\n\tu8 ret;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len <sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tret = efuse_GetCurrentSize(Adapter, &size);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\tif (ret == _SUCCESS) {\n\t\t*(u32*)poid_par_priv->information_buf = size;\n\t\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\t} else\n\t\tstatus = NDIS_STATUS_FAILURE;\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\t*(u32*)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter);\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"-oid_rt_get_efuse_max_size_hdl: size=%d status=0x%08X\\n\",\n\t\t  *(int*)poid_par_priv->information_buf, status));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"+oid_rt_pro_efuse_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid == QUERY_OID)\n\t\tstatus = oid_rt_pro_read_efuse_hdl(poid_par_priv);\n\telse\n\t\tstatus = oid_rt_pro_write_efuse_hdl(poid_par_priv);\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"-oid_rt_pro_efuse_hdl: status=0x%08X\\n\", status));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu8\t\t*data;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\tu16\tmapLen=0;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_pro_efuse_map_hdl\\n\"));\n\n\tEFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE);\n\n\t*poid_par_priv->bytes_rw = 0;\n\n\tif (poid_par_priv->information_buf_len < mapLen)\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tdata = (u8*)poid_par_priv->information_buf;\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tif (poid_par_priv->type_of_oid == QUERY_OID)\n\t{\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t(\"oid_rt_pro_efuse_map_hdl: READ\\n\"));\n\n\t\tif (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS)\n\t\t\t*poid_par_priv->bytes_rw = mapLen;\n\t\telse {\n\t\t\tRT_TRACE(_module_mp_, _drv_err_,\n\t\t\t\t(\"oid_rt_pro_efuse_map_hdl: READ fail\\n\"));\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t} else {\n\t\t// SET_OID\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t(\"oid_rt_pro_efuse_map_hdl: WRITE\\n\"));\n\n\t\tif (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS)\n\t\t\t*poid_par_priv->bytes_rw = mapLen;\n\t\telse {\n\t\t\tRT_TRACE(_module_mp_, _drv_err_,\n\t\t\t\t(\"oid_rt_pro_efuse_map_hdl: WRITE fail\\n\"));\n\t\t\tstatus = NDIS_STATUS_FAILURE;\n\t\t}\n\t}\n\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"-oid_rt_pro_efuse_map_hdl: status=0x%08X\\n\", status));\n\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\n\tu32\t\tcrystal_cap = 0;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len <sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\tcrystal_cap = *((u32*)poid_par_priv->information_buf);//4\n\tif (crystal_cap > 0xf)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tAdapter->mppriv.curr_crystalcap = crystal_cap;\n\n\t_irqlevel_changed_(&oldirql,LOWER);\n\tSetCrystalCap(Adapter);\n\t_irqlevel_changed_(&oldirql,RAISE);\n\n_func_exit_;\n\n#endif\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu8\t\trx_pkt_type;\n//\tu32\t\trcr_val32;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n//\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+oid_rt_set_rx_packet_type_hdl\\n\"));\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u8))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\trx_pkt_type = *((u8*)poid_par_priv->information_buf);//4\n\n\tRT_TRACE(_module_mp_, _drv_info_, (\"rx_pkt_type: %x\\n\",rx_pkt_type ));\n#if 0\n\t_irqlevel_changed_(&oldirql, LOWER);\n#if 0\n\trcr_val8 = rtw_read8(Adapter, 0x10250048);//RCR\n\trcr_val8 &= ~(RCR_AB|RCR_AM|RCR_APM|RCR_AAP);\n\n\tif(rx_pkt_type == RX_PKT_BROADCAST){\n\t\trcr_val8 |= (RCR_AB | RCR_ACRC32 );\n\t}\n\telse if(rx_pkt_type == RX_PKT_DEST_ADDR){\n\t\trcr_val8 |= (RCR_AAP| RCR_AM |RCR_ACRC32);\n\t}\n\telse if(rx_pkt_type == RX_PKT_PHY_MATCH){\n\t\trcr_val8 |= (RCR_APM|RCR_ACRC32);\n\t}\n\telse{\n\t\trcr_val8 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);\n\t}\n\trtw_write8(padapter, 0x10250048,rcr_val8);\n#else\n\trcr_val32 = rtw_read32(padapter, RCR);//RCR = 0x10250048\n\trcr_val32 &= ~(RCR_CBSSID|RCR_AB|RCR_AM|RCR_APM|RCR_AAP);\n#if 0\n\tif(rx_pkt_type == RX_PKT_BROADCAST){\n\t\trcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);\n\t}\n\telse if(rx_pkt_type == RX_PKT_DEST_ADDR){\n\t\t//rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32);\n\t\trcr_val32 |= (RCR_CBSSID|RCR_APM|RCR_ACRC32);\n\t}\n\telse if(rx_pkt_type == RX_PKT_PHY_MATCH){\n\t\trcr_val32 |= (RCR_APM|RCR_ACRC32);\n\t\t//rcr_val32 |= (RCR_AAP|RCR_ACRC32);\n\t}\n\telse{\n\t\trcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);\n\t}\n#else\n\tswitch (rx_pkt_type)\n\t{\n\t\tcase RX_PKT_BROADCAST :\n\t\t\trcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);\n\t\t\tbreak;\n\t\tcase RX_PKT_DEST_ADDR :\n\t\t\trcr_val32 |= (RCR_AB|RCR_AM|RCR_APM|RCR_AAP|RCR_ACRC32);\n\t\t\tbreak;\n\t\tcase RX_PKT_PHY_MATCH:\n\t\t\trcr_val32 |= (RCR_APM|RCR_ACRC32);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\trcr_val32 &= ~(RCR_AAP|RCR_APM|RCR_AM|RCR_AB|RCR_ACRC32);\n\t\t\tbreak;\n\t}\n\n\tif (rx_pkt_type == RX_PKT_DEST_ADDR) {\n\t\tpadapter->mppriv.check_mp_pkt = 1;\n\t} else {\n\t\tpadapter->mppriv.check_mp_pkt = 0;\n\t}\n#endif\n\trtw_write32(padapter, RCR, rcr_val32);\n\n#endif\n\t_irqlevel_changed_(&oldirql, RAISE);\n#endif\n_func_exit_;\n\n\treturn status;\n}\n\nNDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\n\tu32 \t\ttxagc;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len < sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\ttxagc = *(u32*)poid_par_priv->information_buf;\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"oid_rt_pro_set_tx_agc_offset_hdl: 0x%08x\\n\", txagc));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\tSetTxAGCOffset(Adapter, txagc);\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\nNDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tPADAPTER\t\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n\n\tNDIS_STATUS\t\tstatus = NDIS_STATUS_SUCCESS;\n\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tstruct mp_priv\t\t*pmppriv = &Adapter->mppriv;\n\tu32 \t\t\ttype;\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID)\n\t\treturn NDIS_STATUS_NOT_ACCEPTED;\n\n\tif (poid_par_priv->information_buf_len <sizeof(u32))\n\t\treturn NDIS_STATUS_INVALID_LENGTH;\n\n\ttype = *(u32*)poid_par_priv->information_buf;\n\n\tif (_LOOPBOOK_MODE_ == type) {\n\t\tpmppriv->mode = type;\n\t\tset_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc\n\t\tRT_TRACE(_module_mp_, _drv_info_, (\"test mode change to loopback mode:0x%08x.\\n\", get_fwstate(pmlmepriv)));\n\t} else if (_2MAC_MODE_ == type){\n\t\tpmppriv->mode = type;\n\t\t_clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE);\n\t\tRT_TRACE(_module_mp_, _drv_info_, (\"test mode change to 2mac mode:0x%08x.\\n\", get_fwstate(pmlmepriv)));\n\t} else\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\nunsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tPMP_XMIT_PARM pparm;\n\tPADAPTER padapter;\n\tstruct mp_priv *pmp_priv;\n\tstruct pkt_attrib *pattrib;\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"+%s\\n\", __func__));\n\n\tpparm = (PMP_XMIT_PARM)poid_par_priv->information_buf;\n\tpadapter = (PADAPTER)poid_par_priv->adapter_context;\n\tpmp_priv = &padapter->mppriv;\n\n\tif (poid_par_priv->type_of_oid == QUERY_OID) {\n\t\tpparm->enable = !pmp_priv->tx.stop;\n\t\tpparm->count = pmp_priv->tx.sended;\n\t} else {\n\t\tif (pparm->enable == 0) {\n\t\t\tpmp_priv->tx.stop = 1;\n\t\t} else if (pmp_priv->tx.stop == 1) {\n\t\t\tpmp_priv->tx.stop = 0;\n\t\t\tpmp_priv->tx.count = pparm->count;\n\t\t\tpmp_priv->tx.payload = pparm->payload_type;\n\t\t\tpattrib = &pmp_priv->tx.attrib;\n\t\t\tpattrib->pktlen = pparm->length;\n\t\t\t_rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN);\n\t\t\tSetPacketTx(padapter);\n\t\t} else\n\t\t\treturn NDIS_STATUS_FAILURE;\n\t}\n\n\treturn NDIS_STATUS_SUCCESS;\n}\n\n#if 0\nunsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv)\n{\n\tunsigned char *pframe, *pmp_pkt;\n\tstruct ethhdr *pethhdr;\n\tstruct pkt_attrib *pattrib;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tunsigned short *fctrl;\n\tint llc_sz, payload_len;\n\tstruct mp_xmit_frame *pxframe=  NULL;\n\tstruct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet*)param;\n\tu8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55};\n\n//\tDBG_871X(\"+mp_ioctl_xmit_packet_hdl\\n\");\n\n\tpxframe = alloc_mp_xmitframe(&padapter->mppriv);\n\tif (pxframe == NULL)\n\t{\n\t\tDEBUG_ERR((\"Can't alloc pmpframe %d:%s\\n\", __LINE__, __FILE__));\n\t\treturn -1;\n\t}\n\n\t//mp_xmit_pkt\n\tpayload_len = pmp_xmitpkt->len - 14;\n\tpmp_pkt = (unsigned char*)pmp_xmitpkt->mem;\n\tpethhdr = (struct ethhdr *)pmp_pkt;\n\n\t//DBG_871X(\"payload_len=%d, pkt_mem=0x%x\\n\", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem);\n\n\t//DBG_871X(\"pxframe=0x%x\\n\", (void*)pxframe);\n\t//DBG_871X(\"pxframe->mem=0x%x\\n\", (void*)pxframe->mem);\n\n\t//update attribute\n\tpattrib = &pxframe->attrib;\n\tmemset((u8 *)(pattrib), 0, sizeof (struct pkt_attrib));\n\tpattrib->pktlen = pmp_xmitpkt->len;\n\tpattrib->ether_type = ntohs(pethhdr->h_proto);\n\tpattrib->hdrlen = 24;\n\tpattrib->nr_frags = 1;\n\tpattrib->priority = 0;\n#ifndef CONFIG_MP_LINUX\n\tif(IS_MCAST(pethhdr->h_dest))\n\t\tpattrib->mac_id = 4;\n\telse\n\t\tpattrib->mac_id = 5;\n#else\n\tpattrib->mac_id = 5;\n#endif\n\n\t//\n\tmemset(pxframe->mem, 0 , WLANHDR_OFFSET);\n\tpframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\tSetFrameSubType(pframe, WIFI_DATA);\n\n\t_rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN);\n\n\t_rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN);\n\n\tpwlanhdr->seq_ctl = 0;\n\tpframe += pattrib->hdrlen;\n\n\tllc_sz= rtw_put_snap(pframe, pattrib->ether_type);\n\tpframe += llc_sz;\n\n\t_rtw_memcpy(pframe, (void*)(pmp_pkt+14),  payload_len);\n\n\tpattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len;\n\n\tDEBUG_INFO((\"issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\\n\", pattrib->last_txcmdsz, pattrib->ether_type));\n\txmit_mp_frame(padapter, pxframe);\n\n\treturn _SUCCESS;\n}\n#endif\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv)\n{\n#ifdef PLATFORM_OS_XP\n\t_irqL\t\toldirql;\n#endif\n\tu8\t\tbpwrup;\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n#ifdef PLATFORM_LINUX\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tPADAPTER\tpadapter = (PADAPTER)(poid_par_priv->adapter_context);\n#endif\n#endif\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != SET_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"\\n ===> Setoid_rt_set_power_down_hdl.\\n\"));\n\n\t_irqlevel_changed_(&oldirql, LOWER);\n\n\tbpwrup = *(u8 *)poid_par_priv->information_buf;\n\t//CALL  the power_down function\n#ifdef PLATFORM_LINUX\n#if defined(CONFIG_RTL8712) //Linux MP insmod unknown symbol\n\tdev_power_down(padapter,bpwrup); \n#endif\n#endif\n\t_irqlevel_changed_(&oldirql, RAISE);\n\n\t//DEBUG_ERR((\"\\n <=== Query OID_RT_PRO_READ_REGISTER.\n\t//\tAdd:0x%08x Width:%d Value:0x%08x\\n\",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value));\n\n_func_exit_;\n\n\treturn status;\n}\n//------------------------------------------------------------------------------\nNDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv)\n{\n#if 0\n\tNDIS_STATUS\tstatus = NDIS_STATUS_SUCCESS;\n\tPADAPTER\tAdapter = (PADAPTER)(poid_par_priv->adapter_context);\n//#ifdef PLATFORM_OS_XP\n//\t_irqL\t\toldirql;\n//#endif\n\n_func_enter_;\n\n\tif (poid_par_priv->type_of_oid != QUERY_OID) {\n\t\tstatus = NDIS_STATUS_NOT_ACCEPTED;\n\t\treturn status;\n\t}\n\tif (poid_par_priv->information_buf_len < sizeof(u32)) {\n\t\tstatus = NDIS_STATUS_INVALID_LENGTH;\n\t\treturn status;\n\t}\n\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"\\n ===> oid_rt_get_power_mode_hdl.\\n\"));\n\n//\t_irqlevel_changed_(&oldirql, LOWER);\n\t*(int*)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL;\n\t*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;\n//\t_irqlevel_changed_(&oldirql, RAISE);\n\n_func_exit_;\n\n\treturn status;\n#else\n\treturn 0;\n#endif\n}\n\n"
  },
  {
    "path": "core/rtw_odm.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <rtw_odm.h>\n#include <hal_data.h>\n\nconst char *odm_comp_str[] = {\n\t/* BIT0 */\"ODM_COMP_DIG\",\n\t/* BIT1 */\"ODM_COMP_RA_MASK\",\n\t/* BIT2 */\"ODM_COMP_DYNAMIC_TXPWR\",\n\t/* BIT3 */\"ODM_COMP_FA_CNT\",\n\t/* BIT4 */\"ODM_COMP_RSSI_MONITOR\",\n\t/* BIT5 */\"ODM_COMP_CCK_PD\",\n\t/* BIT6 */\"ODM_COMP_ANT_DIV\",\n\t/* BIT7 */\"ODM_COMP_PWR_SAVE\",\n\t/* BIT8 */\"ODM_COMP_PWR_TRAIN\",\n\t/* BIT9 */\"ODM_COMP_RATE_ADAPTIVE\",\n\t/* BIT10 */\"ODM_COMP_PATH_DIV\",\n\t/* BIT11 */\"ODM_COMP_PSD\",\n\t/* BIT12 */\"ODM_COMP_DYNAMIC_PRICCA\",\n\t/* BIT13 */\"ODM_COMP_RXHP\",\n\t/* BIT14 */\"ODM_COMP_MP\",\n\t/* BIT15 */\"ODM_COMP_CFO_TRACKING\",\n\t/* BIT16 */\"ODM_COMP_ACS\",\n\t/* BIT17 */\"PHYDM_COMP_ADAPTIVITY\",\n\t/* BIT18 */\"PHYDM_COMP_RA_DBG\",\n\t/* BIT19 */\"PHYDM_COMP_TXBF\",\n\t/* BIT20 */\"ODM_COMP_EDCA_TURBO\",\n\t/* BIT21 */\"ODM_COMP_EARLY_MODE\",\n\t/* BIT22 */\"ODM_FW_DEBUG_TRACE\",\n\t/* BIT23 */NULL,\n\t/* BIT24 */\"ODM_COMP_TX_PWR_TRACK\",\n\t/* BIT25 */\"ODM_COMP_RX_GAIN_TRACK\",\n\t/* BIT26 */\"ODM_COMP_CALIBRATION\",\n\t/* BIT27 */NULL,\n\t/* BIT28 */\"ODM_PHY_CONFIG\",\n\t/* BIT29 */\"BEAMFORMING_DEBUG\",\n\t/* BIT30 */\"ODM_COMP_COMMON\",\n\t/* BIT31 */\"ODM_COMP_INIT\",\n\t/* BIT32 */\"ODM_COMP_NOISY_DETECT\",\n};\n\n#define RTW_ODM_COMP_MAX 33\n\nconst char *odm_ability_str[] = {\n\t/* BIT0 */\"ODM_BB_DIG\",\n\t/* BIT1 */\"ODM_BB_RA_MASK\",\n\t/* BIT2 */\"ODM_BB_DYNAMIC_TXPWR\",\n\t/* BIT3 */\"ODM_BB_FA_CNT\",\n\t/* BIT4 */\"ODM_BB_RSSI_MONITOR\",\n\t/* BIT5 */\"ODM_BB_CCK_PD\",\n\t/* BIT6 */\"ODM_BB_ANT_DIV\",\n\t/* BIT7 */\"ODM_BB_PWR_SAVE\",\n\t/* BIT8 */\"ODM_BB_PWR_TRAIN\",\n\t/* BIT9 */\"ODM_BB_RATE_ADAPTIVE\",\n\t/* BIT10 */\"ODM_BB_PATH_DIV\",\n\t/* BIT11 */\"ODM_BB_PSD\",\n\t/* BIT12 */\"ODM_BB_RXHP\",\n\t/* BIT13 */\"ODM_BB_ADAPTIVITY\",\n\t/* BIT14 */\"ODM_BB_CFO_TRACKING\",\n\t/* BIT15 */\"ODM_BB_NHM_CNT\",\n\t/* BIT16 */\"ODM_BB_PRIMARY_CCA\",\n\t/* BIT17 */\"ODM_BB_TXBF\",\n\t/* BIT18 */NULL,\n\t/* BIT19 */NULL,\n\t/* BIT20 */\"ODM_MAC_EDCA_TURBO\",\n\t/* BIT21 */\"ODM_MAC_EARLY_MODE\",\n\t/* BIT22 */NULL,\n\t/* BIT23 */NULL,\n\t/* BIT24 */\"ODM_RF_TX_PWR_TRACK\",\n\t/* BIT25 */\"ODM_RF_RX_GAIN_TRACK\",\n\t/* BIT26 */\"ODM_RF_CALIBRATION\",\n};\n\n#define RTW_ODM_ABILITY_MAX 27\n\nconst char *odm_dbg_level_str[] = {\n\tNULL,\n\t\"ODM_DBG_OFF\",\n\t\"ODM_DBG_SERIOUS\",\n\t\"ODM_DBG_WARNING\",\n\t\"ODM_DBG_LOUD\",\n\t\"ODM_DBG_TRACE\",\n};\n\n#define RTW_ODM_DBG_LEVEL_NUM 6\n\nvoid rtw_odm_dbg_comp_msg(void *sel, _adapter *adapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &pHalData->odmpriv;\n\tint cnt = 0;\n\tu64 dbg_comp = 0;\n\tint i;\n\n\trtw_hal_get_odm_var(adapter, HAL_ODM_DBG_FLAG, &dbg_comp, NULL);\n\n\tDBG_871X_SEL_NL(sel, \"odm.DebugComponents = 0x%016llx\\n\", dbg_comp);\n\tfor (i=0;i<RTW_ODM_COMP_MAX;i++) {\n\t\tif (odm_comp_str[i])\n\t\t\tDBG_871X_SEL_NL(sel, \"%cBIT%-2d %s\\n\",\n\t\t\t\t(BIT0 << i) & dbg_comp ? '+' : ' ', i, odm_comp_str[i]);\n\t}\n}\n\ninline void rtw_odm_dbg_comp_set(_adapter *adapter, u64 comps)\n{\n\trtw_hal_set_odm_var(adapter, HAL_ODM_DBG_FLAG, &comps, _FALSE);\n}\n\nvoid rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &pHalData->odmpriv;\n\tint cnt = 0;\n\tu32 dbg_level = 0;\n\tint i;\n\n\trtw_hal_get_odm_var(adapter, HAL_ODM_DBG_LEVEL, &dbg_level, NULL);\n\tDBG_871X_SEL_NL(sel, \"odm.DebugLevel = %u\\n\", dbg_level);\n\tfor (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {\n\t\tif (odm_dbg_level_str[i])\n\t\t\tDBG_871X_SEL_NL(sel, \"%u %s\\n\", i, odm_dbg_level_str[i]);\n\t}\n}\n\ninline void rtw_odm_dbg_level_set(_adapter *adapter, u32 level)\n{\n\trtw_hal_set_odm_var(adapter, HAL_ODM_DBG_LEVEL, &level, _FALSE);\n}\n\nvoid rtw_odm_ability_msg(void *sel, _adapter *adapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &pHalData->odmpriv;\n\tint cnt = 0;\n\tu32 ability = 0;\n\tint i;\n\n\tability = rtw_phydm_ability_get(adapter);\n\tDBG_871X_SEL_NL(sel, \"odm.SupportAbility = 0x%08x\\n\", ability);\n\tfor (i=0;i<RTW_ODM_ABILITY_MAX;i++) {\n\t\tif (odm_ability_str[i])\n\t\t\tDBG_871X_SEL_NL(sel, \"%cBIT%-2d %s\\n\",\n\t\t\t\t(BIT0 << i) & ability ? '+' : ' ', i, odm_ability_str[i]);\n\t}\n}\n\ninline void rtw_odm_ability_set(_adapter *adapter, u32 ability)\n{\n\trtw_phydm_ability_set(adapter, ability);\n}\n\nvoid rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)\n{\n\tDBG_871X_SEL_NL(sel, \"ADAPTIVITY_VERSION \"ADAPTIVITY_VERSION\"\\n\");\n}\n\n#define RTW_ADAPTIVITY_EN_DISABLE 0\n#define RTW_ADAPTIVITY_EN_ENABLE 1\n\nvoid rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)\n{\n\tstruct registry_priv *regsty = &adapter->registrypriv;\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &hal_data->odmpriv;\n\n\tDBG_871X_SEL_NL(sel, \"RTW_ADAPTIVITY_EN_\");\n\n\tif (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) {\n\t\tDBG_871X_SEL(sel, \"DISABLE\\n\");\n\t} else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) {\n\t\tDBG_871X_SEL(sel, \"ENABLE\\n\");\n\t} else {\n\t\tDBG_871X_SEL(sel, \"INVALID\\n\");\n\t}\n}\n\n#define RTW_ADAPTIVITY_MODE_NORMAL 0\n#define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1\n\nvoid rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)\n{\n\tstruct registry_priv *regsty = &adapter->registrypriv;\n\n\tDBG_871X_SEL_NL(sel, \"RTW_ADAPTIVITY_MODE_\");\n\n\tif (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) {\n\t\tDBG_871X_SEL(sel, \"NORMAL\\n\");\n\t} else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) {\n\t\tDBG_871X_SEL(sel, \"CARRIER_SENSE\\n\");\n\t} else {\n\t\tDBG_871X_SEL(sel, \"INVALID\\n\");\n\t}\n}\n\n#define RTW_ADAPTIVITY_DML_DISABLE 0\n#define RTW_ADAPTIVITY_DML_ENABLE 1\n\nvoid rtw_odm_adaptivity_dml_msg(void *sel, _adapter *adapter)\n{\n\tstruct registry_priv *regsty = &adapter->registrypriv;\n\n\tDBG_871X_SEL_NL(sel, \"RTW_ADAPTIVITY_DML_\");\n\n\tif (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE) {\n\t\tDBG_871X_SEL(sel, \"DISABLE\\n\");\n\t} else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE) {\n\t\tDBG_871X_SEL(sel, \"ENABLE\\n\");\n\t} else {\n\t\tDBG_871X_SEL(sel, \"INVALID\\n\");\n\t}\n}\n\nvoid rtw_odm_adaptivity_dc_backoff_msg(void *sel, _adapter *adapter)\n{\n\tstruct registry_priv *regsty = &adapter->registrypriv;\n\n\tDBG_871X_SEL_NL(sel, \"RTW_ADAPTIVITY_DC_BACKOFF:%u\\n\", regsty->adaptivity_dc_backoff);\n}\n\nvoid rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter)\n{\n\trtw_odm_adaptivity_ver_msg(sel, adapter);\n\trtw_odm_adaptivity_en_msg(sel, adapter);\n\trtw_odm_adaptivity_mode_msg(sel, adapter);\n\trtw_odm_adaptivity_dml_msg(sel, adapter);\n\trtw_odm_adaptivity_dc_backoff_msg(sel, adapter);\n}\n\nbool rtw_odm_adaptivity_needed(_adapter *adapter)\n{\n\tstruct registry_priv *regsty = &adapter->registrypriv;\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\tbool ret = _FALSE;\n\n\tif (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)\n\t\tret = _TRUE;\n\n\treturn ret;\n}\n\nvoid rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &pHalData->odmpriv;\n\n\trtw_odm_adaptivity_config_msg(sel, adapter);\n\n\tDBG_871X_SEL_NL(sel, \"%10s %16s %16s %22s %12s\\n\"\n\t\t, \"TH_L2H_ini\", \"TH_EDCCA_HL_diff\", \"TH_L2H_ini_mode2\", \"TH_EDCCA_HL_diff_mode2\", \"EDCCA_enable\");\n\tDBG_871X_SEL_NL(sel, \"0x%-8x %-16d 0x%-14x %-22d %-12d\\n\"\n\t\t, (u8)odm->TH_L2H_ini\n\t\t, odm->TH_EDCCA_HL_diff\n\t\t, (u8)odm->TH_L2H_ini_mode2\n\t\t, odm->TH_EDCCA_HL_diff_mode2\n\t\t, odm->EDCCA_enable\n\t);\n\n\tDBG_871X_SEL_NL(sel, \"%15s %9s\\n\", \"AdapEnableState\", \"Adap_Flag\");\n\tDBG_871X_SEL_NL(sel, \"%-15x %-9x\\n\"\n\t\t, odm->Adaptivity_enable\n\t\t, odm->adaptivity_flag\n\t);\n}\n\nvoid rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff, s8 TH_L2H_ini_mode2, s8 TH_EDCCA_HL_diff_mode2, u8 EDCCA_enable)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &pHalData->odmpriv;\n\n\todm->TH_L2H_ini = TH_L2H_ini;\n\todm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;\n\todm->TH_L2H_ini_mode2 = TH_L2H_ini_mode2;\n\todm->TH_EDCCA_HL_diff_mode2 = TH_EDCCA_HL_diff_mode2;\n\todm->EDCCA_enable = EDCCA_enable;\n}\n\nvoid rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tDM_ODM_T *odm = &(hal_data->odmpriv);\t\n\t\n\tDBG_871X_SEL_NL(sel,\"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\\n\", \n\tHDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);\t\n}\n\n\nvoid rtw_odm_acquirespinlock(_adapter *adapter,\tRT_SPINLOCK_TYPE type)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(adapter);\n\t_irqL irqL;\n\n\tswitch(type)\n\t{\n\t\tcase RT_IQK_SPINLOCK:\n\t\t\t_enter_critical_bh(&pHalData->IQKSpinLock, &irqL);\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid rtw_odm_releasespinlock(_adapter *adapter,\tRT_SPINLOCK_TYPE type)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(adapter);\n\t_irqL irqL;\n\n\tswitch(type)\n\t{\n\t\tcase RT_IQK_SPINLOCK:\n\t\t\t_exit_critical_bh(&pHalData->IQKSpinLock, &irqL);\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n#ifdef CONFIG_DFS_MASTER\nVOID rtw_odm_radar_detect_reset(_adapter *adapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tPDM_ODM_T pDM_Odm = &(hal_data->odmpriv);\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8192D) {\n\t\tODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 0);\n\t\tODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 1);\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8821) {\n\t\tODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 0);\n\t\tODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 1);\n\t} else {\n\t\t/* not supported yet */\n\t\trtw_warn_on(1);\n\t}\n}\n\nVOID rtw_odm_radar_detect_disable(_adapter *adapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tPDM_ODM_T pDM_Odm = &(hal_data->odmpriv);\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8192D)\n\t\tODM_SetBBReg(pDM_Odm, 0xc84 , BIT25, 0);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8821)\n\t\tODM_SetBBReg(pDM_Odm, 0x924 , BIT15, 0);\n\telse\n\t\trtw_warn_on(1);\n}\n\n/* called after ch, bw is set, chance to adjust parameter for different ch conditions */\nVOID rtw_odm_radar_detect_enable(_adapter *adapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tPDM_ODM_T pDM_Odm = &(hal_data->odmpriv);\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8192D) {\n\t\tODM_SetBBReg(pDM_Odm, 0xc38, BIT23 | BIT22, 2);\n\t\tODM_SetBBReg(pDM_Odm, 0x814, bMaskDWord, 0x04cc4d10);\n\t\tODM_SetBBReg(pDM_Odm, 0xc8c, BIT23 | BIT22, 3);\n\t\tODM_SetBBReg(pDM_Odm, 0xc30, 0xf, 0xa);\n\t\tODM_SetBBReg(pDM_Odm, 0xcdc, 0xf0000, 4);\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8821) {\n\t\tODM_SetBBReg(pDM_Odm, 0x814, 0x3fffffff, 0x04cc4d10);\n\t\tODM_SetBBReg(pDM_Odm, 0x834, bMaskByte0, 0x06);\n\t\tODM_SetBBReg(pDM_Odm, 0x918, bMaskDWord, 0x1c16ecdf);\n\t\tODM_SetBBReg(pDM_Odm, 0x924, bMaskDWord, 0x0152a400);\n\t\tODM_SetBBReg(pDM_Odm, 0x91c, bMaskDWord, 0x0fa21a20);\n\t\tODM_SetBBReg(pDM_Odm, 0x920, bMaskDWord, 0xe0f57204);\n\t} else {\n\t\t/* not supported yet */\n\t\trtw_warn_on(1);\n\t}\n\n\trtw_odm_radar_detect_reset(adapter);\n}\n\nBOOLEAN rtw_odm_radar_detect(_adapter *adapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tPDM_ODM_T pDM_Odm = &(hal_data->odmpriv);\n\tBOOLEAN enable_DFS = FALSE;\n\tBOOLEAN bypass = FALSE;\n\tBOOLEAN radar_detected = FALSE;\n\n\tstatic u8Byte last_tx_unicast = 0;\n\tstatic u8Byte last_rx_unicast = 0;\n\tstatic u8Byte throughput = 0;\n\tint tp_th = ((*pDM_Odm->pBandWidth == ODM_BW40M) ? 45 : 20); /*refer AP team's testing number*/\n\n\tthroughput = (*(pDM_Odm->pNumTxBytesUnicast) - last_tx_unicast) + (*(pDM_Odm->pNumRxBytesUnicast) - last_rx_unicast);\n\tlast_tx_unicast = *(pDM_Odm->pNumTxBytesUnicast);\n\tlast_rx_unicast = *(pDM_Odm->pNumRxBytesUnicast);\n\n\tif (throughput>>18 > tp_th) {\n\t\tif (pDM_Odm->SupportICType & ODM_RTL8192D)\n\t\t\tODM_SetBBReg(pDM_Odm, 0xcdc, BIT8|BIT9, 0);\n\t\tbypass = TRUE;\n\t} else {\n\t\tif (pDM_Odm->SupportICType & ODM_RTL8192D)\n\t\t\tODM_SetBBReg(pDM_Odm, 0xcdc, BIT8|BIT9, 1);\n\t}\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8192D) {\n\t\tif (ODM_GetBBReg(pDM_Odm , 0xc84, BIT25))\n\t\t\tenable_DFS = TRUE;\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8821) {\n\t\tif (ODM_GetBBReg(pDM_Odm , 0x924, BIT15))\n\t\t\tenable_DFS = TRUE;\n\t}\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8192D) {\n\t\tif (ODM_GetBBReg(pDM_Odm , 0xcf8, BIT23))\n\t\t\tradar_detected = TRUE;\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8821) {\n\t\tif (ODM_GetBBReg(pDM_Odm , 0xf98, BIT17))\n\t\t\tradar_detected = TRUE;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD\n\t\t, (\"Radar detect: enable_DFS:%d, radar_detected:%d, bypass:%d\\n\"\n\t\t\t, enable_DFS, radar_detected, bypass));\n\tif (0)\n\t\tDBG_871X(\"Radar detect: enable_DFS:%d, radar_detected:%d, bypass:%d(throughput:%llu, tp_th:%d)\\n\"\n\t\t\t, enable_DFS, radar_detected, bypass, throughput, tp_th);\n\n\tif (enable_DFS && radar_detected)\n\t\trtw_odm_radar_detect_reset(adapter);\n\nexit:\n\treturn (enable_DFS && radar_detected && !bypass);\n}\n#endif /* CONFIG_DFS_MASTER */\n\n"
  },
  {
    "path": "core/rtw_p2p.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_P2P_C_\n\n#include <drv_types.h>\n\n#ifdef CONFIG_P2P\n\nint rtw_p2p_is_channel_list_ok( u8 desired_ch, u8* ch_list, u8 ch_cnt )\n{\n\tint found = 0, i = 0;\n\n\tfor( i = 0; i < ch_cnt; i++ )\n\t{\n\t\tif ( ch_list[ i ] == desired_ch )\n\t\t{\n\t\t\tfound = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn( found );\n}\n\nint is_any_client_associated(_adapter *padapter)\n{\n\treturn padapter->stapriv.asoc_list_cnt ? _TRUE : _FALSE;\n}\n\nstatic u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tu32 len=0;\n\tu16 attr_len = 0;\n\tu8 tmplen, *pdata_attr, *pstart, *pcur;\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpdata_attr = rtw_zmalloc(MAX_P2P_IE_LEN);\n\n\tif(NULL == pdata_attr){\n\t\tDBG_871X(\"%s pdata_attr malloc failed \\n\", __FUNCTION__);\n\t\tgoto _exit;\n\t}\n\t\n\tpstart = pdata_attr;\n\tpcur = pdata_attr;\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\n\t//look up sta asoc_queue\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t{\t\t\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\n\t\tplist = get_next(plist);\n\t\t\n\n\t\tif(psta->is_p2p_device)\n\t\t{\n\t\t\ttmplen = 0;\n\t\t\t\n\t\t\tpcur++;\n\t\t\n\t\t\t//P2P device address\n\t\t\t_rtw_memcpy(pcur, psta->dev_addr, ETH_ALEN);\n\t\t\tpcur += ETH_ALEN;\n\n\t\t\t//P2P interface address\n\t\t\t_rtw_memcpy(pcur, psta->hwaddr, ETH_ALEN);\n\t\t\tpcur += ETH_ALEN;\n\n\t\t\t*pcur = psta->dev_cap;\n\t\t\tpcur++;\n\n\t\t\t//*(u16*)(pcur) = cpu_to_be16(psta->config_methods);\n\t\t\tRTW_PUT_BE16(pcur, psta->config_methods);\n\t\t\tpcur += 2;\n\n\t\t\t_rtw_memcpy(pcur, psta->primary_dev_type, 8);\n\t\t\tpcur += 8;\n\n\t\t\t*pcur = psta->num_of_secdev_type;\n\t\t\tpcur++;\n\n\t\t\t_rtw_memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8);\n\t\t\tpcur += psta->num_of_secdev_type*8;\n\t\t\t\n\t\t\tif(psta->dev_name_len>0)\n\t\t\t{\n\t\t\t\t//*(u16*)(pcur) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\t\t\tRTW_PUT_BE16(pcur, WPS_ATTR_DEVICE_NAME);\n\t\t\t\tpcur += 2;\n\n\t\t\t\t//*(u16*)(pcur) = cpu_to_be16( psta->dev_name_len );\n\t\t\t\tRTW_PUT_BE16(pcur, psta->dev_name_len);\n\t\t\t\tpcur += 2;\n\n\t\t\t\t_rtw_memcpy(pcur, psta->dev_name, psta->dev_name_len);\n\t\t\t\tpcur += psta->dev_name_len;\n\t\t\t}\n\n\n\t\t\ttmplen = (u8)(pcur-pstart);\n\t\t\t\n\t\t\t*pstart = (tmplen-1);\n\n\t\t\tattr_len += tmplen;\n\n\t\t\t//pstart += tmplen;\n\t\t\tpstart = pcur;\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t}\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\tif(attr_len>0)\n\t{\n\t\tlen = rtw_set_p2p_attr_content(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr);\n\t}\n\n\trtw_mfree(pdata_attr, MAX_P2P_IE_LEN);\n\t\n_exit:\n\treturn len;\n\n}\n\nstatic void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tunsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame\t\n\tu32\tp2poui = cpu_to_be32(P2POUI);\n\tu8\toui_subtype = P2P_GO_DISC_REQUEST;\n\tu8\tdialogToken=0;\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t//Build P2P action frame header\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\t\n\n\t//there is no IE in this P2P action frame\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n}\n\nstatic void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)\n{\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_DEVDISC_RESP;\n\tu8 p2pie[8] = { 0x00 };\n\tu32 p2pielen = 0;\t\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\t\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pwdinfo->device_addr, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t//Build P2P public action frame header\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\t\n\n\n\t//Build P2P IE\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t// P2P_ATTR_STATUS\n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);\n\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &pattrib->pktlen);\t\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n}\n\nstatic void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method)\n{\n\t_adapter *padapter = pwdinfo->padapter;\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu8\t\t\tdialogToken = frame_body[7];\t//\tThe Dialog Token of provisioning discovery request frame.\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_PROVISION_DISC_RESP;\n\tu8\t\t\twpsie[ 100 ] = { 0x00 };\n\tu8\t\t\twpsielen = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\t\t\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\t\n\n\twpsielen = 0;\n\t//\tWPS OUI\n\t//*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\tRTW_PUT_BE32(wpsie, WPSOUI);\n\twpsielen += 4;\n\n#if 0\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n#endif\n\n\t//\tConfig Method\n\t//\tType:\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\tRTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD);\n\twpsielen += 2;\n\n\t//\tLength:\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\tRTW_PUT_BE16(wpsie + wpsielen, 0x0002);\n\twpsielen += 2;\n\n\t//\tValue:\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method );\n\tRTW_PUT_BE16(wpsie + wpsielen, config_method);\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\t\n\n#ifdef CONFIG_WFD\n\twfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\treturn;\n\n}\n\nstatic void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tunsigned char category = RTW_WLAN_CATEGORY_P2P;//P2P action frame\t\n\tu32\tp2poui = cpu_to_be32(P2POUI);\n\tu8\toui_subtype = P2P_PRESENCE_RESPONSE;\t\n\tu8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };\n\tu8 noa_attr_content[32] = { 0x00 };\n\tu32 p2pielen = 0;\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t//Build P2P action frame header\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\n\n\n\t//Add P2P IE header\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//Add Status attribute in P2P IE \n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);\n\n\t//Add NoA attribute in P2P IE\n\tnoa_attr_content[0] = 0x1;//index\n\tnoa_attr_content[1] = 0x0;//CTWindow and OppPS Parameters\n\t\n\t//todo: Notice of Absence Descriptor(s)\n\t\n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content);\n\n\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, p2pie, &(pattrib->pktlen));\n\n\t\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n}\n\nu32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };\n\tu16 capability=0;\n\tu32 len=0, p2pielen = 0;\n\t\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\n\t//\tAccording to the P2P Specification, the beacon frame should contain 3 P2P attributes\n\t//\t1. P2P Capability\n\t//\t2. P2P Device ID\n\t//\t3. Notice of Absence ( NOA )\t\n\n\t//\tP2P Capability ATTR\n\t//\tType:\n\t//\tLength:\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\t//\tBe able to participate in additional P2P Groups and\n\t//\tsupport the P2P Invitation Procedure\t\n\t//\tGroup Capability Bitmap, 1 byte\t\n\tcapability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY;\n\tcapability |=  ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8);\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))\n\t\tcapability |= (P2P_GRPCAP_GROUP_FORMATION<<8);\n\n\tcapability = cpu_to_le16(capability);\n\n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability);\n\n\t\n\t// P2P Device ID ATTR\n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr);\n\n\t\n\t// Notice of Absence ATTR\n\t//\tType: \n\t//\tLength:\n\t//\tValue:\n\t\n\t//go_add_noa_attr(pwdinfo);\n\t\n\t\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);\n\t\n\t\n\treturn len;\n\t\n}\n\n#ifdef CONFIG_WFD\nu32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu16 val16=0;\n\tu32 len=0, wfdielen = 0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110812\n\t//\tAccording to the WFD Specification, the beacon frame should contain 4 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID\n\t//\t3. Coupled Sink Information\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\n\tif ( P2P_ROLE_GO == pwdinfo->role )\n\t{\n\t\tif ( is_any_client_associated( pwdinfo->padapter ) )\n\t\t{\n\t\t\t//\tWFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery)\n\t\t\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD;\n\t\t\tRTW_PUT_BE16(wfdie + wfdielen, val16);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery)\n\t\t\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\t\t\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\t\t}\n\n\t}\n\telse\n\t{\n\t\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\t\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\t\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\t}\n\t\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu16 val16=0;\n\tu32 len=0, wfdielen = 0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110812\n\t//\tAccording to the WFD Specification, the probe request frame should contain 4 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID\n\t//\t3. Coupled Sink Information\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\n\tif ( 1 == pwdinfo->wfd_tdls_enable )\n\t{\n\t\t//\tWFD primary sink + available for WFD session + WiFi TDLS mode + WSC ( WFD Service Discovery )\t\n\t\tval16 = pwfd_info->wfd_device_type | \n\t\t\t\t\t\tWFD_DEVINFO_SESSION_AVAIL | \n\t\t\t\t\t\tWFD_DEVINFO_WSD |\n\t\t\t\t\t\tWFD_DEVINFO_PC_TDLS;\n\t\tRTW_PUT_BE16(wfdie + wfdielen, val16 );\n\t}\n\telse\n\t{\n\t\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSC ( WFD Service Discovery )\t\n\t\tval16 = pwfd_info->wfd_device_type |\n\t\t\t\t\t\tWFD_DEVINFO_SESSION_AVAIL | \n\t\t\t\t\t\tWFD_DEVINFO_WSD;\n\t\tRTW_PUT_BE16(wfdie + wfdielen, val16 );\n\t}\n\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110812\n\t//\tAccording to the WFD Specification, the probe response frame should contain 4 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID\n\t//\t3. Coupled Sink Information\n\t//\t4. WFD Session Information\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode\n\t\n\tif (  _TRUE == pwdinfo->session_available )\n\t{\n\t\tif ( P2P_ROLE_GO == pwdinfo->role )\n\t\t{\n\t\t\tif ( is_any_client_associated( pwdinfo->padapter ) )\n\t\t\t{\n\t\t\t\tif ( pwdinfo->wfd_tdls_enable )\n\t\t\t\t{\n\t\t\t\t\t//\tTDLS mode + WSD ( WFD Service Discovery )\n\t\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//\tWiFi Direct mode + WSD ( WFD Service Discovery )\n\t\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ( pwdinfo->wfd_tdls_enable )\n\t\t\t\t{\n\t\t\t\t\t//\tavailable for WFD session + TDLS mode + WSD ( WFD Service Discovery )\n\t\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//\tavailable for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\t\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ( pwdinfo->wfd_tdls_enable )\n\t\t\t{\n\t\t\t\t//\tavailable for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\n\t\t\t\t//\tavailable for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\t\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ( pwdinfo->wfd_tdls_enable )\n\t\t{\n\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD |WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT);\n\t\t}\n\n\t}\n\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\t//\tWFD Session Information ATTR\n\t\t//\tType:\n\t\twfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;\n\n\t\t//\tLength:\n\t\t//\tNote: In the WFD specification, the size of length field is 2.\n\t\tRTW_PUT_BE16(wfdie + wfdielen, 0x0000);\n\t\twfdielen += 2;\n\n\t\t//\tTodo: to add the list of WFD device info descriptor in WFD group.\n\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_TDLS\n\tif ( ( tunneled == 0 ) && ( padapter->pbuddy_adapter->wdinfo.wfd_tdls_enable == 1 ) )\n\t{\n\t\t//\tAlternative MAC Address ATTR\n\t\t//\tType:\n\t\twfdie[ wfdielen++ ] = WFD_ATTR_ALTER_MAC;\n\n\t\t//\tLength:\n\t\t//\tNote: In the WFD specification, the size of length field is 2.\n\t\tRTW_PUT_BE16(wfdie + wfdielen,  ETH_ALEN );\n\t\twfdielen += 2;\n\n\t\t//\tValue:\n\t\t//\tAlternative MAC Address\n\t\t_rtw_memcpy(wfdie + wfdielen, adapter_mac_addr(padapter->pbuddy_adapter), ETH_ALEN);\n\t\t//\tThis mac address is used to make the WFD session when TDLS is enable.\n\n\t\twfdielen += ETH_ALEN;\n\t}\n#endif // CONFIG_TDLS\n#endif // CONFIG_CONCURRENT_MODE\n\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu16 val16=0;\n\tu32 len=0, wfdielen = 0;\n\t_adapter \t\t\t\t\t*padapter = NULL;\n\tstruct mlme_priv\t\t\t*pmlmepriv = NULL;\n\tstruct wifi_display_info\t\t*pwfd_info = NULL;\n\n\t//\tWFD OUI\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t{\n\t\treturn 0;\n\t}\n\n\tpadapter = pwdinfo->padapter;\n\tpmlmepriv = &padapter->mlmepriv;\n\tpwfd_info = padapter->wdinfo.wfd_info;\n\t\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110812\n\t//\tAccording to the WFD Specification, the probe request frame should contain 4 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID\n\t//\t3. Coupled Sink Information\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110812\n\t//\tAccording to the WFD Specification, the probe request frame should contain 4 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID\n\t//\t3. Coupled Sink Information\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the negotiation request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the negotiation request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the negotiation request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + WiFi Direct mode + WSD ( WFD Service Discovery ) + WFD Session Available\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\tif ( P2P_ROLE_GO == pwdinfo->role )\n\t{\n\t\t//\tWFD Session Information ATTR\n\t\t//\tType:\n\t\twfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;\n\n\t\t//\tLength:\n\t\t//\tNote: In the WFD specification, the size of length field is 2.\n\t\tRTW_PUT_BE16(wfdie + wfdielen, 0x0000);\n\t\twfdielen += 2;\n\n\t\t//\tTodo: to add the list of WFD device info descriptor in WFD group.\n\n\t}\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu16 val16=0;\n\tu32 len=0, wfdielen = 0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\tif ( P2P_ROLE_GO == pwdinfo->role )\n\t{\n\t\t//\tWFD Session Information ATTR\n\t\t//\tType:\n\t\twfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;\n\n\t\t//\tLength:\n\t\t//\tNote: In the WFD specification, the size of length field is 2.\n\t\tRTW_PUT_BE16(wfdie + wfdielen, 0x0000);\n\t\twfdielen += 2;\n\n\t\t//\tTodo: to add the list of WFD device info descriptor in WFD group.\n\n\t}\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\nu32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 len=0, wfdielen = 0;\n\tu16 val16=0;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info*\tpwfd_info = padapter->wdinfo.wfd_info;\n\n\t//\tWFD OUI\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t//\tWFA WFD v1.0\n\n\t//\tCommented by Albert 20110825\n\t//\tAccording to the WFD Specification, the provision discovery response frame should contain 3 WFD attributes\n\t//\t1. WFD Device Information\n\t//\t2. Associated BSSID ( Optional )\n\t//\t3. Local IP Adress ( Optional )\n\n\n\t//\tWFD Device Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue1:\n\t//\tWFD device information\n\t//\tWFD primary sink + available for WFD session + WiFi Direct mode + WSD ( WFD Service Discovery )\n\tval16 = pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD;\n\tRTW_PUT_BE16(wfdie + wfdielen, val16);\n\twfdielen += 2;\n\n\t//\tValue2:\n\t//\tSession Management Control Port\n\t//\tDefault TCP port for RTSP messages is 554\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t//\tValue3:\n\t//\tWFD Device Maximum Throughput\n\t//\t300Mbps is the maximum throughput\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t//\tAssociated BSSID ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tAssociated BSSID\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE )\n\t{\n\t\t_rtw_memcpy( wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );\n\t}\n\telse\n\t{\n\t\t_rtw_memset( wfdie + wfdielen, 0x00, ETH_ALEN );\n\t}\n\n\twfdielen += ETH_ALEN;\n\n\t//\tCoupled Sink Information ATTR\n\t//\tType:\n\twfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;\n\n\t//\tLength:\n\t//\tNote: In the WFD specification, the size of length field is 2.\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0007);\n\twfdielen += 2;\n\n\t//\tValue:\n\t//\tCoupled Sink Status bitmap\n\t//\tNot coupled/available for Coupling\n\twfdie[ wfdielen++ ] = 0;\n\t//  MAC Addr.\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\twfdie[ wfdielen++ ] = 0;\n\n\trtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, &len);\n\n\treturn len;\n\t\n}\n\n\n#endif //CONFIG_WFD\n\nu32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };\n\tu32 len=0, p2pielen = 0;\t\n#ifdef CONFIG_INTEL_WIDI\n\tstruct mlme_priv *pmlmepriv = &(pwdinfo->padapter->mlmepriv);\n\tu8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };\n\tu8 widi_version = 0, i = 0;\n\n\tif( _rtw_memcmp( pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN ) == _FALSE )\n\t{\n\t\twidi_version = 35;\n\t}\n\telse if( pmlmepriv->num_p2p_sdt != 0 )\n\t{\n\t\twidi_version = 40;\n\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20100907\n\t//\tAccording to the P2P Specification, the probe response frame should contain 5 P2P attributes\n\t//\t1. P2P Capability\n\t//\t2. Extended Listen Timing\n\t//\t3. Notice of Absence ( NOA )\t( Only GO needs this )\n\t//\t4. Device Info\n\t//\t5. Group Info\t( Only GO need this )\n\n\t//\tP2P Capability ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tRTW_PUT_LE16(p2pie + p2pielen, 0x0002);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t\n\t//\tGroup Capability Bitmap, 1 byte\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\tp2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS);\n\n\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))\n\t\t\tp2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION;\n\n\t\tp2pielen++;\n\t}\n\telse if ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) )\n\t{\n\t\t//\tGroup Capability Bitmap, 1 byte\n\t\tif ( pwdinfo->persistent_supported )\n\t\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;\n\t\telse\n\t\t\tp2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;\n\t}\n\n\t//\tExtended Listen Timing ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0004 );\n\tRTW_PUT_LE16(p2pie + p2pielen, 0x0004);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tAvailability Period\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\tRTW_PUT_LE16(p2pie + p2pielen, 0xFFFF);\n\tp2pielen += 2;\n\n\t//\tAvailability Interval\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0xFFFF );\n\tRTW_PUT_LE16(p2pie + p2pielen, 0xFFFF);\n\tp2pielen += 2;\n\n\n\t// Notice of Absence ATTR\n\t//\tType: \n\t//\tLength:\n\t//\tValue:\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\t//go_add_noa_attr(pwdinfo);\n\t}\t\n\n\t//\tDevice Info ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n#ifdef CONFIG_INTEL_WIDI\n\tif( widi_version == 35 )\n\t{\n\t\tRTW_PUT_LE16(p2pie + p2pielen, 21 + 8 + pwdinfo->device_name_len);\n\t}\n\telse if( widi_version == 40 )\n\t{\n\t\tRTW_PUT_LE16(p2pie + p2pielen, 21 + 8 * pmlmepriv->num_p2p_sdt + pwdinfo->device_name_len);\n\t}\n\telse\n#endif //CONFIG_INTEL_WIDI\n\tRTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\tRTW_PUT_BE16(p2pie + p2pielen, pwdinfo->supported_wps_cm);\n\tp2pielen += 2;\n\n#ifdef CONFIG_INTEL_WIDI\n\tif( widi_version == 40 )\n\t{\n\t\t//\tPrimary Device Type\n\t\t//\tCategory ID\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_cid );\n\t\tp2pielen += 2;\n\n\t\t//\tOUI\n\t\t//*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\t\tRTW_PUT_BE32(p2pie + p2pielen, WPSOUI);\n\t\tp2pielen += 4;\n\n\t\t//\tSub Category ID\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_pdt_scid);\n\t\tp2pielen += 2;\n\t}\n\telse\n#endif //CONFIG_INTEL_WIDI\n\t{\n\t\t//\tPrimary Device Type\n\t\t//\tCategory ID\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA);\n\t\tp2pielen += 2;\n\n\t\t//\tOUI\n\t\t//*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\t\tRTW_PUT_BE32(p2pie + p2pielen, WPSOUI);\n\t\tp2pielen += 4;\n\n\t\t//\tSub Category ID\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER);\n\t\tp2pielen += 2;\n\t}\n\n\t//\tNumber of Secondary Device Types\n#ifdef CONFIG_INTEL_WIDI\n\tif( widi_version == 35 )\n\t{\n\t\tp2pie[ p2pielen++ ] = 0x01;\n\t\t\n\t\tRTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_DISPLAYS);\n\t\tp2pielen += 2;\n\n\t\tRTW_PUT_BE32(p2pie + p2pielen, INTEL_DEV_TYPE_OUI);\n\t\tp2pielen += 4;\n\n\t\tRTW_PUT_BE16(p2pie + p2pielen, P2P_SCID_WIDI_CONSUMER_SINK);\n\t\tp2pielen += 2;\n\t}\n\telse if( widi_version == 40 )\n\t{\n\t\tp2pie[ p2pielen++ ] = pmlmepriv->num_p2p_sdt;\n\t\tfor( ; i < pmlmepriv->num_p2p_sdt; i++ )\n\t\t{\n\t\t\tRTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_cid[i]);\n\t\t\tp2pielen += 2;\n\n\t\t\tRTW_PUT_BE32(p2pie + p2pielen, INTEL_DEV_TYPE_OUI);\n\t\t\tp2pielen += 4;\n\n\t\t\tRTW_PUT_BE16(p2pie + p2pielen, pmlmepriv->p2p_sdt_scid[i]);\n\t\t\tp2pielen += 2;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_INTEL_WIDI\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tRTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME);\n\tp2pielen += 2;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tRTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\n\n\t// Group Info ATTR\n\t//\tType:\n\t//\tLength:\n\t//\tValue:\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\tp2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen);\n\t}\n\n\t\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);\n\t\n\n\treturn len;\n\t\n}\n\nu32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr )\n{\n\tu8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };\n\tu32 len=0, p2pielen = 0;\t\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20110301\n\t//\tAccording to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes\n\t//\t1. P2P Capability\n\t//\t2. Device Info\n\t//\t3. Group ID ( When joining an operating P2P Group )\n\n\t//\tP2P Capability ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tRTW_PUT_LE16(p2pie + p2pielen, 0x0002);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t\n\t//\tGroup Capability Bitmap, 1 byte\n\tif ( pwdinfo->persistent_supported )\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;\n\telse\n\t\tp2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;\n\n\n\t//\tDevice Info ATTR\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tRTW_PUT_LE16(p2pie + p2pielen, 21 + pwdinfo->device_name_len);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN );\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\tif ( pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC )\n\t{\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_PBC );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_PBC);\n\t}\n\telse\n\t{\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_CONFIG_METHOD_DISPLAY );\n\t\tRTW_PUT_BE16(p2pie + p2pielen, WPS_CONFIG_METHOD_DISPLAY);\n\t}\n\n\tp2pielen += 2;\n\n\t//\tPrimary Device Type\n\t//\tCategory ID\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\tRTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_CID_MULIT_MEDIA);\n\tp2pielen += 2;\n\n\t//\tOUI\n\t//*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\tRTW_PUT_BE32(p2pie + p2pielen, WPSOUI);\n\tp2pielen += 4;\n\n\t//\tSub Category ID\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\tRTW_PUT_BE16(p2pie + p2pielen, WPS_PDT_SCID_MEDIA_SERVER);\n\tp2pielen += 2;\n\n\t//\tNumber of Secondary Device Types\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tRTW_PUT_BE16(p2pie + p2pielen, WPS_ATTR_DEVICE_NAME);\n\tp2pielen += 2;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tRTW_PUT_BE16(p2pie + p2pielen, pwdinfo->device_name_len);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\n\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )\n\t{\n\t\t//\tAdded by Albert 2011/05/19\n\t\t//\tIn this case, the pdev_raddr is the device address of the group owner.\n\t\t\n\t\t//\tP2P Group ID ATTR\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;\n\n\t\t//\tLength:\n\t\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + ussidlen );\n\t\tRTW_PUT_LE16(p2pie + p2pielen, ETH_ALEN + ussidlen);\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( p2pie + p2pielen, pdev_raddr, ETH_ALEN );\n\t\tp2pielen += ETH_ALEN;\n\n\t\t_rtw_memcpy( p2pie + p2pielen, pssid, ussidlen );\n\t\tp2pielen += ussidlen;\n\t\t\n\t}\n\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);\n\t\n\n\treturn len;\n\t\n}\n\n\nu32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code)\n{\n\tu8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };\n\tu32 len=0, p2pielen = 0;\t\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t// According to the P2P Specification, the Association response frame should contain 2 P2P attributes\n\t//\t1. Status\n\t//\t2. Extended Listen Timing (optional)\n\n\n\t//\tStatus ATTR\n\tp2pielen += rtw_set_p2p_attr_content(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code);\n\n\n\t// Extended Listen Timing ATTR\n\t//\tType:\n\t//\tLength:\n\t//\tValue:\n\n\n\tpbuf = rtw_set_ie(pbuf, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &len);\n\t\n\treturn len;\n\t\n}\n\nu32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)\n{\n\tu32 len=0;\n\t\n\treturn len;\n}\n\nu32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)\n{\t\n\tu8 *p;\n\tu32 ret=_FALSE;\n\tu8 *p2pie;\n\tu32\tp2pielen = 0;\n\tint ssid_len=0, rate_cnt = 0;\n\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SUPPORTEDRATES_IE_, (int *)&rate_cnt,\n\t\t\tlen - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);\n\n\tif ( rate_cnt <= 4 )\n\t{\n\t\tint i, g_rate =0;\n\n\t\tfor( i = 0; i < rate_cnt; i++ )\n\t\t{\n\t\t\tif ( ( ( *( p + 2 + i ) & 0xff ) != 0x02 ) &&\n\t\t\t\t( ( *( p + 2 + i ) & 0xff ) != 0x04 ) &&\n\t\t\t\t( ( *( p + 2 + i ) & 0xff ) != 0x0B ) &&\n\t\t\t\t( ( *( p + 2 + i ) & 0xff ) != 0x16 ) )\n\t\t\t{\n\t\t\t\tg_rate = 1;\n\t\t\t}\n\t\t}\n\n\t\tif ( g_rate == 0 )\n\t\t{\n\t\t\t//\tThere is no OFDM rate included in SupportedRates IE of this probe request frame\n\t\t\t//\tThe driver should response this probe request.\n\t\t\treturn ret;\n\t\t}\n\t}\n\telse\n\t{\n\t\t//\trate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4.\n\t\t//\tWe should proceed the following check for this probe request.\n\t}\n\n\t//\tAdded comments by Albert 20100906\n\t//\tThere are several items we should check here.\n\t//\t1. This probe request frame must contain the P2P IE. (Done)\n\t//\t2. This probe request frame must contain the wildcard SSID. (Done)\n\t//\t3. Wildcard BSSID. (Todo)\n\t//\t4. Destination Address. ( Done in mgt_dispatcher function )\n\t//\t5. Requested Device Type in WSC IE. (Todo)\n\t//\t6. Device ID attribute in P2P IE. (Todo)\n\n\tp = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_, _SSID_IE_, (int *)&ssid_len,\n\t\t\tlen - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_);\t\n\n\tssid_len &= 0xff;\t//\tJust last 1 byte is valid for ssid len of the probe request\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\tif((p2pie=rtw_get_p2p_ie( pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_ , len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_ , NULL, &p2pielen)))\n\t\t{\n\t\t\tif ( (p != NULL) && _rtw_memcmp( ( void * ) ( p+2 ), ( void * ) pwdinfo->p2p_wildcard_ssid , 7 ))\n\t\t\t{\n\t\t\t\t//todo:\n\t\t\t\t//Check Requested Device Type attributes in WSC IE.\n\t\t\t\t//Check Device ID attribute in P2P IE\n\n\t\t\t\tret = _TRUE;\t\t\t\n\t\t\t}\n\t\t\telse if ( (p != NULL) && ( ssid_len == 0 ) )\n\t\t\t{\n\t\t\t\tret = _TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//non -p2p device\n\t\t}\n\t\t\n\t}\t\n\n\t\n\treturn ret;\n\t\n}\n\nu32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta)\n{\n\tu8 status_code = P2P_STATUS_SUCCESS;\n\tu8 *pbuf, *pattr_content=NULL;\n\tu32 attr_contentlen = 0;\n\tu16 cap_attr=0;\n\tunsigned short\tframe_type, ie_offset=0;\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 * p2p_ie;\n\tu32\tp2p_ielen = 0;\n\n\tif(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\treturn P2P_STATUS_FAIL_REQUEST_UNABLE;\n\n\tframe_type = GetFrameSubType(pframe);\n\tif (frame_type == WIFI_ASSOCREQ)\n\t{\n\t\tie_offset = _ASOCREQ_IE_OFFSET_;\n\t}\t\n\telse // WIFI_REASSOCREQ\n\t{\n\t\tie_offset = _REASOCREQ_IE_OFFSET_;\n\t}\n\t\n\ties = pframe + WLAN_HDR_A3_LEN + ie_offset;\n\ties_len = len - WLAN_HDR_A3_LEN - ie_offset;\n\n\tp2p_ie = rtw_get_p2p_ie(ies , ies_len , NULL, &p2p_ielen);\n\n\tif ( !p2p_ie )\n\t{\n\t\tDBG_8192C( \"[%s] P2P IE not Found!!\\n\", __FUNCTION__ );\n\t\tstatus_code =  P2P_STATUS_FAIL_INVALID_PARAM;\n\t}\n\telse\n\t{\n\t\tDBG_8192C( \"[%s] P2P IE Found!!\\n\", __FUNCTION__ );\n\t}\n\t\n\twhile ( p2p_ie )\n\t{\n\t\t//Check P2P Capability ATTR\n\t\tif( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) )\n\t\t{\n\t\t\tDBG_8192C( \"[%s] Got P2P Capability Attr!!\\n\", __FUNCTION__ );\n\t\t\tcap_attr = le16_to_cpu(cap_attr);\n\t\t\tpsta->dev_cap = cap_attr&0xff;\n\t\t}\n\n\t\t//Check Extended Listen Timing ATTR\n\t\n\n\t\t//Check P2P Device Info ATTR\n\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen))\n\t\t{\n\t\t\tDBG_8192C( \"[%s] Got P2P DEVICE INFO Attr!!\\n\", __FUNCTION__ );\t\t\n\t\t\tpattr_content = pbuf = rtw_zmalloc(attr_contentlen);\n\t\t\tif(pattr_content)\n\t\t\t{\n\t\t\t\tu8 num_of_secdev_type;\n\t\t\t\tu16 dev_name_len;\n\t\t\t\n\t\t\n\t\t\t\trtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO , pattr_content, (uint*)&attr_contentlen);\n\n\t\t\t\t_rtw_memcpy(psta->dev_addr, \tpattr_content, ETH_ALEN);//P2P Device Address\n\n\t\t\t\tpattr_content += ETH_ALEN;\n\n\t\t\t\t_rtw_memcpy(&psta->config_methods, pattr_content, 2);//Config Methods\n\t\t\t\tpsta->config_methods = be16_to_cpu(psta->config_methods);\n\n\t\t\t\tpattr_content += 2;\n\n\t\t\t\t_rtw_memcpy(psta->primary_dev_type, pattr_content, 8);\n\n\t\t\t\tpattr_content += 8;\n\n\t\t\t\tnum_of_secdev_type = *pattr_content;\n\t\t\t\tpattr_content += 1;\n\n\t\t\t\tif(num_of_secdev_type==0)\n\t\t\t\t{\n\t\t\t\t\tpsta->num_of_secdev_type = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tu32 len;\n\n\t\t\t\t\tpsta->num_of_secdev_type = num_of_secdev_type;\n\n\t\t\t\t\tlen = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8);\n\n\t\t\t\t\t_rtw_memcpy(psta->secdev_types_list, pattr_content, len);\n\t\n\t\t\t\t\tpattr_content += (num_of_secdev_type*8);\n\t\t\t\t}\n\n\n\t\t\t\t//dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8);\n\t\t\t\tpsta->dev_name_len=0;\n\t\t\t\tif(WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content))\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tdev_name_len = be16_to_cpu(*(u16*)(pattr_content+2));\n\n\t\t\t\t\tpsta->dev_name_len = (sizeof(psta->dev_name)<dev_name_len) ? sizeof(psta->dev_name):dev_name_len;\n\n\t\t\t\t\t_rtw_memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len);\n\t\t\t\t}\n\n\t\t\t\trtw_mfree(pbuf, attr_contentlen);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t\t\n\t}\n\n\treturn status_code;\n\n}\n\nu32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)\n{\n\tu8 *frame_body;\n\tu8 status, dialogToken;\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = pwdinfo->padapter;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *p2p_ie;\n\tu32\tp2p_ielen = 0;\t\n\t\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tdialogToken = frame_body[7];\n\tstatus = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;\n\t\t\n\tif ( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)) )\n\t{\n\t\tu8 groupid[ 38 ] = { 0x00 };\n\t\tu8 dev_addr[ETH_ALEN] = { 0x00 };\t\t\n\t\tu32\tattr_contentlen = 0;\n\n\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))\n\t\t{\n\t\t\tif(_rtw_memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) && \n\t\t\t\t_rtw_memcmp(pwdinfo->p2p_group_ssid, groupid+ETH_ALEN, pwdinfo->p2p_group_ssid_len))\n\t\t\t{\n\t\t\t\tattr_contentlen=0;\n\t\t\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_ID, dev_addr, &attr_contentlen))\n\t\t\t\t{\n\t\t\t\t\t_irqL irqL;\n\t\t\t\t\t_list\t*phead, *plist;\t\t\t\t\t\n\n\t\t\t\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\t\tphead = &pstapriv->asoc_list;\n\t\t\t\t\tplist = get_next(phead);\n\n\t\t\t\t\t//look up sta asoc_queue\n\t\t\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t\t\t\t\t{\t\t\n\t\t\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\n\t\t\t\t\t\tplist = get_next(plist);\n\n\t\t\t\t\t\tif(psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) &&\n\t\t\t\t\t\t\t_rtw_memcmp(psta->dev_addr, dev_addr, ETH_ALEN))\n\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t//_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\t\t\t\t//issue GO Discoverability Request\n\t\t\t\t\t\t\tissue_group_disc_req(pwdinfo, psta->hwaddr);\n\t\t\t\t\t\t\t//_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tstatus = P2P_STATUS_SUCCESS;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstatus = P2P_STATUS_FAIL_INVALID_PARAM;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstatus = P2P_STATUS_FAIL_INVALID_PARAM;\n\t\t\t}\n\t\t\t\n\t\t}\t\n\t\t\n\t}\n\n\t\n\t//issue Device Discoverability Response\n\tissue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);\n\t\n\t\n\treturn (status==P2P_STATUS_SUCCESS) ? _TRUE:_FALSE;\n\t\n}\n\nu32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)\n{\n\treturn _TRUE;\n}\n\nu8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo,  u8 *pframe, uint len )\n{\n\tu8 *frame_body;\n\tu8 *wpsie;\n\tuint\twps_ielen = 0, attr_contentlen = 0;\n\tu16\tuconfig_method = 0;\n\t\n\n\tframe_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tif ( (wpsie=rtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) )\n\t{\n\t\tif ( rtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_CONF_METHOD , ( u8* ) &uconfig_method, &attr_contentlen) )\n\t\t{\n\t\t\tuconfig_method = be16_to_cpu( uconfig_method );\n\t\t\tswitch( uconfig_method )\n\t\t\t{\n\t\t\t\tcase WPS_CM_DISPLYA:\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"dis\", 3 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WPS_CM_LABEL:\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"lab\", 3 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WPS_CM_PUSH_BUTTON:\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pbc\", 3 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase WPS_CM_KEYPAD:\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pad\", 3 );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tissue_p2p_provision_resp( pwdinfo, GetAddr2Ptr(pframe), frame_body, uconfig_method);\n\t\t}\n\t}\n\tDBG_871X( \"[%s] config method = %s\\n\", __FUNCTION__, pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req );\n\treturn _TRUE;\n\t\n}\n\t\nu8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo,  u8 *pframe)\n{\n\n\treturn _TRUE;\n}\n\nu8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list)\n{\n\tu8 i = 0, j = 0;\n\tu8 temp = 0;\n\tu8 ch_no = 0;\n\tch_content += 3;\n\tch_cnt -= 3;\n\n\twhile( ch_cnt > 0)\n\t{\n\t\tch_content += 1;\n\t\tch_cnt -= 1;\n\t\ttemp = *ch_content;\n\t\tfor( i = 0 ; i < temp ; i++, j++ )\n\t\t{\n\t\t\tpeer_ch_list[j] = *( ch_content + 1 + i );\n\t\t}\n\t\tch_content += (temp + 1);\n\t\tch_cnt -= (temp + 1);\n\t\tch_no += temp ;\n\t}\n\n\treturn ch_no;\n}\n\nu8 rtw_p2p_check_peer_oper_ch(struct mlme_ext_priv *pmlmeext, u8 ch)\n{\n\tu8 i = 0;\n\n\tfor( i = 0; i < pmlmeext->max_chan_nums; i++ )\n\t{\n\t\tif ( pmlmeext->channel_set[ i ].ChannelNum == ch )\n\t\t{\n\t\t\treturn _SUCCESS;\n\t\t}\n\t}\n\n\treturn _FAIL;\n}\n\nu8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)\n{\n\tint\ti = 0, j = 0, temp = 0;\n\tu8 ch_no = 0;\n\n\tfor( i = 0; i < peer_ch_num; i++ )\n\t{\n\t\tfor( j = temp; j < pmlmeext->max_chan_nums; j++ )\n\t\t{\n\t\t\tif( *( peer_ch_list + i ) == pmlmeext->channel_set[ j ].ChannelNum )\n\t\t\t{\n\t\t\t\tch_list_inclusioned[ ch_no++ ] = *( peer_ch_list + i );\n\t\t\t\ttemp = j;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ch_no;\n}\n\nu8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )\n{\n\t_adapter *padapter = pwdinfo->padapter;\n\tu8\tresult = P2P_STATUS_SUCCESS;\n\tu32\tp2p_ielen = 0, wps_ielen = 0;\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 *p2p_ie;\n\tu8 *wpsie;\n\tu16\t\twps_devicepassword_id = 0x0000;\n\tuint\twps_devicepassword_id_len = 0;\n#ifdef CONFIG_WFD\n\tu8\twfd_ie[ 128 ] = { 0x00 };\n\tu32\twfd_ielen = 0;\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n#endif // CONFIG_TDLS\t\n#endif // CONFIG_WFD\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = pwdinfo->padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif\n\n\tif ( (wpsie=rtw_get_wps_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)) )\n\t{\n\t\t//\tCommented by Kurt 20120113\n\t\t//\tIf some device wants to do p2p handshake without sending prov_disc_req\n\t\t//\tWe have to get peer_req_cm from here.\n\t\tif(_rtw_memcmp( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"000\", 3) )\n\t\t{\n\t\t\trtw_get_wps_attr_content( wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);\n\t\t\twps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );\n\n\t\t\tif ( wps_devicepassword_id == WPS_DPID_USER_SPEC )\n\t\t\t{\n\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"dis\", 3 );\n\t\t\t}\n\t\t\telse if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )\n\t\t\t{\n\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pad\", 3 );\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_rtw_memcpy( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, \"pbc\", 3 );\t\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] WPS IE not Found!!\\n\", __FUNCTION__ );\n\t\tresult = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\treturn( result );\n\t}\n\n\ties = pframe + _PUBLIC_ACTION_IE_OFFSET_;\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\t\t\t\t\t\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\tif ( !p2p_ie )\n\t{\n\t\tDBG_871X( \"[%s] P2P IE not Found!!\\n\", __FUNCTION__ );\n\t\tresult = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t}\n\t\n\twhile ( p2p_ie )\n\t{\n\t\tu8\tattr_content = 0x00;\n\t\tu32\tattr_contentlen = 0;\n\t\tu8\tch_content[100] = { 0x00 };\n\t\tuint\tch_cnt = 0;\n\t\tu8\tpeer_ch_list[100] = { 0x00 };\n\t\tu8\tpeer_ch_num = 0;\n\t\tu8\tch_list_inclusioned[100] = { 0x00 };\n\t\tu8\tch_num_inclusioned = 0;\n\t\tu16\tcap_attr;\n\t\tu8 listen_ch_attr[5] = { 0x00 };\n\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);\n\n\t\t//Check P2P Capability ATTR\n\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) )\n\t\t{\n\t\t\tcap_attr = le16_to_cpu(cap_attr);\n\t\n#if defined(CONFIG_WFD) && defined(CONFIG_TDLS)\n\t\t\tif(!(cap_attr & P2P_GRPCAP_INTRABSS) )\n\t\t\t\tptdlsinfo->ap_prohibited = _TRUE;\n#endif //defined(CONFIG_WFD) && defined(CONFIG_TDLS)\n\t\t}\n\n\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) )\n\t\t{\n\t\t\tDBG_871X( \"[%s] GO Intent = %d, tie = %d\\n\", __FUNCTION__, attr_content >> 1, attr_content & 0x01 );\n\t\t\tpwdinfo->peer_intent = attr_content;\t//\tinclude both intent and tie breaker values.\n\n\t\t\tif ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t{\n\t\t\t\t//\tTry to match the tie breaker value\n\t\t\t\tif ( pwdinfo->intent == P2P_MAX_INTENT )\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\tresult = P2P_STATUS_FAIL_BOTH_GOINTENT_15;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ( attr_content & 0x01 )\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t{\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t}\n\n\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t{\n\t\t\t\t//\tStore the group id information.\n\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN );\n\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );\t\t\n\t\t\t}\n\t\t}\n\n\t\tif (rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8 *)listen_ch_attr, (uint *) &attr_contentlen) && attr_contentlen == 5)\n\t\t\tpwdinfo->nego_req_info.peer_ch = listen_ch_attr[4];\n\t\t\n\t\tDBG_871X(FUNC_ADPT_FMT\" listen channel :%u\\n\", FUNC_ADPT_ARG(padapter), pwdinfo->nego_req_info.peer_ch);\n\n\t\tattr_contentlen = 0;\n\t\tif ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) )\n\t\t{\n\t\t\tif ( attr_contentlen != ETH_ALEN )\n\t\t\t{\n\t\t\t\t_rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );\n\t\t\t}\n\t\t}\n\n\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt) )\n\t\t{\n\t\t\tpeer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list);\n\t\t\tch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);\n\n\t\t\tif( ch_num_inclusioned == 0)\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] No common channel in channel list!\\n\", __FUNCTION__ );\n\t\t\t\tresult = P2P_STATUS_FAIL_NO_COMMON_CH;\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t{\n\t\t\t\tif ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel, \n\t\t\t\t\t\t\t\t\t\t\t\tch_list_inclusioned, ch_num_inclusioned) )\n\t\t\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X( \"[%s] desired channel NOT Found!\\n\", __FUNCTION__ );\n\t\t\t\t\t\tresult = P2P_STATUS_FAIL_NO_COMMON_CH;\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\t\t\t{\n\t\t\t\t\t\tu8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;\n\t\t\t\t\t\tattr_contentlen = 0;\n\n\t\t\t\t\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )\n\t\t\t\t\t\t{\t\t\n\t\t\t\t\t\t\tpeer_operating_ch = operatingch_info[4];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( rtw_p2p_is_channel_list_ok( peer_operating_ch, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\tch_list_inclusioned, ch_num_inclusioned) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t *\tChange our operating channel as peer's for compatibility.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tpwdinfo->operating_channel = peer_operating_ch;\n\t\t\t\t\t\t\tDBG_871X( \"[%s] Change op ch to %02x as peer's\\n\", __FUNCTION__, pwdinfo->operating_channel);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Take first channel of ch_list_inclusioned as operating channel\n\t\t\t\t\t\t\tpwdinfo->operating_channel = ch_list_inclusioned[0];\n\t\t\t\t\t\t\tDBG_871X( \"[%s] Change op ch to %02x\\n\", __FUNCTION__, pwdinfo->operating_channel);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n\n\tif (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO) {\n\t\tresult = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INFOR_NOREADY);\n\t\treturn result;\n\t}\n\n#ifdef CONFIG_WFD\n\t//\tAdded by Albert 20110823\n\t//\tTry to get the TCP port information when receiving the negotiation request.\n\tif ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) )\n\t{\n\t\tu8\tattr_content[ 10 ] = { 0x00 };\n\t\tu32\tattr_contentlen = 0;\n\n\t\tDBG_871X( \"[%s] WFD IE Found!!\\n\", __FUNCTION__ );\n\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);\n\t\tif ( attr_contentlen )\n\t\t{\n\t\t\tpwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );\n\t\t\tDBG_871X( \"[%s] Peer PORT NUM = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\t\t}\n\t}\n#endif // CONFIG_WFD\n\n\treturn( result );\n}\n\nu8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )\n{\n\t_adapter *padapter = pwdinfo->padapter;\n\tu8\tresult = P2P_STATUS_SUCCESS;\n\tu32\tp2p_ielen, wps_ielen;\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 * p2p_ie;\n#ifdef CONFIG_WFD\n\tu8\twfd_ie[ 128 ] = { 0x00 };\n\tu32\twfd_ielen = 0;\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n#endif // CONFIG_TDLS\t\n#endif // CONFIG_WFD\n\n\ties = pframe + _PUBLIC_ACTION_IE_OFFSET_;\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\t//\tBe able to know which one is the P2P GO and which one is P2P client.\n\t\t\t\t\t\n\tif ( rtw_get_wps_ie( ies, ies_len, NULL, &wps_ielen) )\n\t{\n\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] WPS IE not Found!!\\n\", __FUNCTION__ );\n\t\tresult = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t}\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\tif ( !p2p_ie )\n\t{\n\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\tresult = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;\n\t}\n\telse\n\t{\n\n\t\tu8\tattr_content = 0x00;\n\t\tu32\tattr_contentlen = 0;\n\t\tu8\toperatingch_info[5] = { 0x00 };\n\t\tuint\tch_cnt = 0;\n\t\tu8\tch_content[100] = { 0x00 };\n\t\tu8\tgroupid[ 38 ];\n\t\tu16\tcap_attr;\n\t\tu8\tpeer_ch_list[100] = { 0x00 };\n\t\tu8\tpeer_ch_num = 0;\n\t\tu8\tch_list_inclusioned[100] = { 0x00 };\n\t\tu8\tch_num_inclusioned = 0;\n\n\t\twhile ( p2p_ie )\t//\tFound the P2P IE.\n\t\t{\n\n\t\t\t//Check P2P Capability ATTR\n\t\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen) )\n\t\t\t{\n\t\t\t\tcap_attr = le16_to_cpu(cap_attr);\n#ifdef CONFIG_TDLS\n\t\t\t\tif(!(cap_attr & P2P_GRPCAP_INTRABSS) )\n\t\t\t\t\tptdlsinfo->ap_prohibited = _TRUE;\n#endif // CONFIG_TDLS\n\t\t\t}\n\n\t\t\trtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);\n\t\t\tif ( attr_contentlen == 1 )\n\t\t\t{\t\t\t\n\t\t\t\tDBG_871X( \"[%s] Status = %d\\n\", __FUNCTION__, attr_content );\n\t\t\t\tif ( attr_content == P2P_STATUS_SUCCESS )\n\t\t\t\t{\n\t\t\t\t\t//\tDo nothing.\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ( P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content ) {\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\t\t}\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\tresult = attr_content;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//\tTry to get the peer's interface address\n\t\t\tattr_contentlen = 0;\n\t\t\tif ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen ) )\n\t\t\t{\n\t\t\t\tif ( attr_contentlen != ETH_ALEN )\n\t\t\t\t{\n\t\t\t\t\t_rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//\tTry to get the peer's intent and tie breaker value.\n\t\t\tattr_content = 0x00;\n\t\t\tattr_contentlen = 0;\n\t\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT , &attr_content, &attr_contentlen) )\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] GO Intent = %d, tie = %d\\n\", __FUNCTION__, attr_content >> 1, attr_content & 0x01 );\n\t\t\t\tpwdinfo->peer_intent = attr_content;\t//\tinclude both intent and tie breaker values.\n\n\t\t\t\tif ( pwdinfo->intent == ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t\t{\n\t\t\t\t\t//\tTry to match the tie breaker value\n\t\t\t\t\tif ( pwdinfo->intent == P2P_MAX_INTENT )\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\t\t\tresult = P2P_STATUS_FAIL_BOTH_GOINTENT_15;\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\t\tif ( attr_content & 0x01 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if ( pwdinfo->intent > ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t\t}\n\n\t\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t\t{\n\t\t\t\t\t//\tStore the group id information.\n\t\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN );\n\t\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );\n\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//\tTry to get the operation channel information\n\t\t\t\t\t\n\t\t\tattr_contentlen = 0;\n\t\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] Peer's operating channel = %d\\n\", __FUNCTION__, operatingch_info[4] );\n\t\t\t\tpwdinfo->peer_operating_ch = operatingch_info[4];\n\t\t\t}\n\t\t\t\n\t\t\t//\tTry to get the channel list information\n\t\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len ) )\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] channel list attribute found, len = %d\\n\", __FUNCTION__,  pwdinfo->channel_list_attr_len );\n\n\t\t\t\tpeer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list);\n\t\t\t\tch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);\n\n\t\t\t\tif( ch_num_inclusioned == 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X( \"[%s] No common channel in channel list!\\n\", __FUNCTION__ );\n\t\t\t\t\tresult = P2P_STATUS_FAIL_NO_COMMON_CH;\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t\t{\n\t\t\t\t\tif ( !rtw_p2p_is_channel_list_ok( pwdinfo->operating_channel, \n\t\t\t\t\t\t\t\t\t\t\t\t\tch_list_inclusioned, ch_num_inclusioned) )\n\t\t\t\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X( \"[%s] desired channel NOT Found!\\n\", __FUNCTION__ );\n\t\t\t\t\t\t\tresult = P2P_STATUS_FAIL_NO_COMMON_CH;\n\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tu8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;\n\t\t\t\t\t\t\tattr_contentlen = 0;\n\n\t\t\t\t\t\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )\n\t\t\t\t\t\t\t{\t\t\n\t\t\t\t\t\t\t\tpeer_operating_ch = operatingch_info[4];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( rtw_p2p_is_channel_list_ok( peer_operating_ch, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tch_list_inclusioned, ch_num_inclusioned) )\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t *\tChange our operating channel as peer's for compatibility.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tpwdinfo->operating_channel = peer_operating_ch;\n\t\t\t\t\t\t\t\tDBG_871X( \"[%s] Change op ch to %02x as peer's\\n\", __FUNCTION__, pwdinfo->operating_channel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// Take first channel of ch_list_inclusioned as operating channel\n\t\t\t\t\t\t\t\tpwdinfo->operating_channel = ch_list_inclusioned[0];\n\t\t\t\t\t\t\t\tDBG_871X( \"[%s] Change op ch to %02x\\n\", __FUNCTION__, pwdinfo->operating_channel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] channel list attribute not found!\\n\", __FUNCTION__);\n\t\t\t}\n\n\t\t\t//\tTry to get the group id information if peer is GO\n\t\t\tattr_contentlen = 0;\n\t\t\t_rtw_memset( groupid, 0x00, 38 );\n\t\t\tif ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) )\n\t\t\t{\n\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN );\n\t\t\t\t_rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN );\n\t\t\t}\n\t\t\t\n\t\t\t//Get the next P2P IE\n\t\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t\t}\n\t\t\n\t}\n\n#ifdef CONFIG_WFD\n\t//\tAdded by Albert 20111122\n\t//\tTry to get the TCP port information when receiving the negotiation response.\n\tif ( rtw_get_wfd_ie( pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen ) )\n\t{\n\t\tu8\tattr_content[ 10 ] = { 0x00 };\n\t\tu32\tattr_contentlen = 0;\n\n\t\tDBG_8192C( \"[%s] WFD IE Found!!\\n\", __FUNCTION__ );\n\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);\n\t\tif ( attr_contentlen )\n\t\t{\n\t\t\tpwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );\n\t\t\tDBG_8192C( \"[%s] Peer PORT NUM = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\t\t}\n\t}\n#endif // CONFIG_WFD\n\n\treturn( result );\n\n}\n\nu8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len )\n{\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 * p2p_ie;\n\tu32\tp2p_ielen = 0;\n\tu8\tresult = P2P_STATUS_SUCCESS;\n\ties = pframe + _PUBLIC_ACTION_IE_OFFSET_;\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\twhile ( p2p_ie )\t//\tFound the P2P IE.\n\t{\n\t\tu8\tattr_content = 0x00, operatingch_info[5] = { 0x00 };\n\t\tu8\tgroupid[ 38 ] = { 0x00 };\n\t\tu32\tattr_contentlen = 0;\n\n\t\tpwdinfo->negotiation_dialog_token = 1;\n\t\trtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);\n\t\tif ( attr_contentlen == 1 )\n\t\t{\n\t\t\tDBG_871X( \"[%s] Status = %d\\n\", __FUNCTION__, attr_content );\n\t\t\tresult = attr_content;\n\n\t\t\tif ( attr_content == P2P_STATUS_SUCCESS )\n\t\t\t{\n\t\t\t\tu8\tbcancelled = 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t_cancel_timer( &pwdinfo->restore_p2p_state_timer, &bcancelled );\n\n\t\t\t\t//\tCommented by Albert 20100911\n\t\t\t\t//\tTodo: Need to handle the case which both Intents are the same.\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\tif ( ( pwdinfo->intent ) > ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\t}\n\t\t\t\telse if ( ( pwdinfo->intent ) < ( pwdinfo->peer_intent >> 1 ) )\n\t\t\t\t{\n\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//\tHave to compare the Tie Breaker\n\t\t\t\t\tif ( pwdinfo->peer_intent & 0x01 )\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\t\t\t\t\n\t\t\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\tif ( check_buddy_fwstate(pwdinfo->padapter , _FW_LINKED ) )\n\t\t\t\t{\n\t\t\t\t\t//\tSwitch back to the AP channel soon.\n\t\t\t\t\t_set_timer( &pwdinfo->ap_p2p_switch_timer, 100 );\n\t\t\t\t}\n#endif\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//\tTry to get the group id information\n\t\tattr_contentlen = 0;\n\t\t_rtw_memset( groupid, 0x00, 38 );\n\t\tif ( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen) )\n\t\t{\n\t\t\tDBG_871X( \"[%s] Ssid = %s, ssidlen = %zu\\n\", __FUNCTION__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]) );\n\t\t\t_rtw_memcpy( pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN );\n\t\t\t_rtw_memcpy( pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN );\t\t\t\n\t\t}\n\n\t\tattr_contentlen = 0;\n\t\tif ( rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen) )\n\t\t{\t\t\n\t\t\tDBG_871X( \"[%s] Peer's operating channel = %d\\n\", __FUNCTION__, operatingch_info[4] );\n\t\t\tpwdinfo->peer_operating_ch = operatingch_info[4];\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t\t\n\t}\n\n\treturn( result );\n}\n\nu8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)\n{\n\tu8 *frame_body;\t\n\tu8 dialogToken=0;\n\tu8 status = P2P_STATUS_SUCCESS;\n\t\n\tframe_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr));\n\n\tdialogToken = frame_body[6];\n\n\t//todo: check NoA attribute\n\n\tissue_p2p_presence_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken);\n\n\treturn _TRUE;\n}\n\nvoid find_phase_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info  *pwdinfo = &padapter->wdinfo;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tNDIS_802_11_SSID \tssid;\n\t_irqL\t\t\t\tirqL;\n\tu8\t\t\t\t\t_status = 0;\n\n_func_enter_;\n\n\t_rtw_memset((unsigned char*)&ssid, 0, sizeof(NDIS_802_11_SSID));\n\t_rtw_memcpy(ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN );\n\tssid.SsidLength = P2P_WILDCARD_SSID_LEN;\n\n\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\n\t\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t_status = rtw_sitesurvey_cmd(padapter, &ssid, 1, NULL, 0);\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\n_func_exit_;\n}\n\nvoid p2p_concurrent_handler(  _adapter* padapter );\n\nvoid restore_p2p_state_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info  *pwdinfo = &padapter->wdinfo;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\n_func_enter_;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))\n\t{\n\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\t\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\t\n\t\n\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP))\n\t\t{\n\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\n\t\t\tissue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);\n\t\t}\n\t}\n#endif\n\n\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\n\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))\n\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tp2p_concurrent_handler( padapter );\n#else\n\t\t//\tIn the P2P client mode, the driver should not switch back to its listen channel\n\t\t//\tbecause this P2P client should stay at the operating channel of P2P GO.\n\t\tset_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n#endif\n\t}\n_func_exit_;\n}\n\nvoid pre_tx_invitereq_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info  *pwdinfo = &padapter->wdinfo;\n\tu8\tval8 = 1;\n_func_enter_;\n\n\tset_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\t\n\tissue_probereq_p2p(padapter, NULL);\n\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\n_func_exit_;\n}\n\nvoid pre_tx_provdisc_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info  *pwdinfo = &padapter->wdinfo;\n\tu8\tval8 = 1;\n_func_enter_;\n\n\tset_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\tissue_probereq_p2p(padapter, NULL);\n\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\n_func_exit_;\n}\n\nvoid pre_tx_negoreq_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info  *pwdinfo = &padapter->wdinfo;\n\tu8\tval8 = 1;\n_func_enter_;\n\n\tset_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\t\n\tissue_probereq_p2p(padapter, NULL);\n\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\n_func_exit_;\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\nvoid p2p_concurrent_handler( _adapter*\tpadapter )\n{\n\tstruct wifidirect_info\t*pwdinfo = &padapter->wdinfo;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t//_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\t//struct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\t//struct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\t//struct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\tu8\t\t\t\t\tval8;\n_func_enter_;\n\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\t\t\t\n\t\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\tpwdinfo->operating_channel = pbuddy_mlmeext->cur_channel;\n\n\t\tif( pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\tDBG_871X(\"%s, switch ch back to buddy's cur_channel=%d\\n\", __func__, pbuddy_mlmeext->cur_channel);\n\n\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\n\t\t\tif (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE))\n\t\t\t\tissue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);\n\t\t}\n\t\telse if( pwdinfo->driver_interface == DRIVER_WEXT )\n\t\t{\n\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t\t\t{\n\t\t\t\t//\tNow, the driver stays on the AP's channel.\n\t\t\t\t//\tIf the pwdinfo->ext_listen_period = 0, that means the P2P listen state is not available on listen channel.\n\t\t\t\tif ( pwdinfo->ext_listen_period > 0 )\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C( \"[%s] P2P_STATE_IDLE, ext_listen_period = %d\\n\", __FUNCTION__, pwdinfo->ext_listen_period );\n\n\t\t\t\t\tif ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tWill switch to listen channel so that need to send the NULL data with PW bit to AP.\n\t\t\t\t\t\tissue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);\n\t\t\t\t\t\tset_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t\t\t\t}\n\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\n\t\t\t\t\tif(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&\n\t\t\t\t\t((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE))\n\t\t\t\t\t{\n\t\t\t\t\t\tval8 = 1;\n\t\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\t\t}\n\t\t\t\t\t//\tTodo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not.\n\t\t\t\t\t_set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) || \n\t\t\t\t\trtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL) ||\n\t\t\t\t\t( rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _FALSE ) ||\n\t\t\t\t\trtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ) )\n\t\t\t{\n\t\t\t\t//\tNow, the driver is in the listen state of P2P mode.\n\t\t\t\tDBG_8192C( \"[%s] P2P_STATE_IDLE, ext_listen_interval = %d\\n\", __FUNCTION__, pwdinfo->ext_listen_interval );\n\n\t\t\t\t//\tCommented by Albert 2012/11/01\n\t\t\t\t//\tIf the AP's channel is the same as the listen channel, we should still be in the listen state\n\t\t\t\t//\tOther P2P device is still able to find this device out even this device is in the AP's channel.\n\t\t\t\t//\tSo, configure this device to be able to receive the probe request frame and set it to listen state.\n\t\t\t\tif ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )\n\t\t\t\t{\n\t\t\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\t\tif (!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) && ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE))\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tval8 = 0;\n\t\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\t\t}\n\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);\n\t\t\t\t\tissue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);\n\t\t\t\t}\n\n\t\t\t\t//\tTodo: To check the value of pwdinfo->ext_listen_interval is equal to 0 or not.\n\t\t\t\t_set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval );\n\t\t\t}\n\t\t\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK))\n\t\t\t{\n\t\t\t\t//\tThe driver had finished the P2P handshake successfully.\n\t\t\t\tval8 = 0;\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\tissue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);\n\t\t\t}\n\t\t\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))\n\t\t\t{\n\t\t\t\tval8 = 1;\n\t\t\t\tset_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t\t}\n\t\t\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) && pwdinfo->nego_req_info.benable == _TRUE)\n\t\t\t{\n\t\t\t\tval8 = 1;\n\t\t\t\tset_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t\t}\t\t\n\t\t\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) && pwdinfo->invitereq_info.benable == _TRUE)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tval8 = 1;\n\t\t\tset_channel_bwmode(padapter, , HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));\n\t\t\t\tissue_probereq_p2p(padapter, NULL);\n\t\t\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t\t\t*/\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tset_channel_bwmode( padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\t\n\t}\n\n_func_exit_;\n}\n#endif\n\n#ifdef CONFIG_IOCTL_CFG80211\nstatic void ro_ch_handler(_adapter *padapter)\n{\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tu8 ch, bw, offset;\n_func_enter_;\n\n\tif (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t}\n\telse if (adapter_wdev_data(padapter)->p2p_enabled && pwdinfo->listen_channel) {\n\t\tch = pwdinfo->listen_channel;\n\t\tbw = CHANNEL_WIDTH_20;\n\t\toffset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to listen ch - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t}\n\telse {\n\t\tch = pcfg80211_wdinfo->restore_channel;\n\t\tbw = CHANNEL_WIDTH_20;\n\t\toffset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\tif (0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to restore ch - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t}\n\n\tset_channel_bwmode(padapter, ch, offset, bw);\n\n\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_871X(\"%s, role=%d, p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));\n#endif\n\n\tpcfg80211_wdinfo->is_ro_ch = _FALSE;\n\tpcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();\n\n\tDBG_871X(\"cfg80211_remain_on_channel_expired cookie:0x%llx, ch=%d, bw=%d, offset=%d\\n\"\n\t\t, pcfg80211_wdinfo->remain_on_ch_cookie\n\t\t, rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));\n\n\trtw_cfg80211_remain_on_channel_expired(padapter, \n\t\tpcfg80211_wdinfo->remain_on_ch_cookie, \n\t\t&pcfg80211_wdinfo->remain_on_ch_channel,\n\t\tpcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL);\n\n_func_exit_;\n}\n\nstatic void ro_ch_timer_process (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);\n\n\t//printk(\"%s \\n\", __FUNCTION__);\n\t\n#ifdef\tCONFIG_CONCURRENT_MODE\n\tATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\n#endif\n\n\tp2p_protocol_wk_cmd( adapter, P2P_RO_CH_WK);\n}\n\nstatic void rtw_change_p2pie_op_ch(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch)\n{\n\tu8 *ies, *p2p_ie;\n\tu32 ies_len, p2p_ielen;\n\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\ties = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\twhile ( p2p_ie ) {\n\t\tu32\tattr_contentlen = 0;\n\t\tu8 *pattr = NULL;\n\n\t\t//Check P2P_ATTR_OPERATING_CH\n\t\tattr_contentlen = 0;\n\t\tpattr = NULL;\n\t\tif((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL)\n\t\t{\n\t\t\t*(pattr+4) = ch;\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n}\n\nstatic void rtw_change_p2pie_ch_list(_adapter *padapter, const u8 *frame_body, u32 len, u8 ch)\n{\n\tu8 *ies, *p2p_ie;\n\tu32 ies_len, p2p_ielen;\n\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\ties = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\twhile (p2p_ie) {\n\t\tu32\tattr_contentlen = 0;\n\t\tu8 *pattr = NULL;\n\n\t\t//Check P2P_ATTR_CH_LIST\n\t\tif ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) {\n\t\t\tint i;\n\t\t\tu32 num_of_ch;\n\t\t\tu8 *pattr_temp = pattr + 3 ;\n\n\t\t\tattr_contentlen -= 3;\n\t\t\t\n\t\t\twhile (attr_contentlen>0) {\n\t\t\t\tnum_of_ch = *(pattr_temp+1);\n\n\t\t\t\tfor(i=0; i<num_of_ch; i++)\n\t\t\t\t\t*(pattr_temp+2+i) = ch;\n\n\t\t\t\tpattr_temp += (2+num_of_ch);\n\t\t\t\tattr_contentlen -= (2+num_of_ch);\n\t\t\t}\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n}\n\nstatic bool rtw_chk_p2pie_ch_list_with_buddy(_adapter *padapter, const u8 *frame_body, u32 len)\n{\n\tbool fit = _FALSE;\n#ifdef CONFIG_CONCURRENT_MODE\n\tu8 *ies, *p2p_ie;\n\tu32 ies_len, p2p_ielen;\n\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\tu8 buddy_ch = pbuddy_mlmeext->cur_channel;\n\n\ties = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\twhile (p2p_ie) {\n\t\tu32\tattr_contentlen = 0;\n\t\tu8 *pattr = NULL;\n\n\t\t//Check P2P_ATTR_CH_LIST\n\t\tif ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL) {\n\t\t\tint i;\n\t\t\tu32 num_of_ch;\n\t\t\tu8 *pattr_temp = pattr + 3 ;\n\n\t\t\tattr_contentlen -= 3;\n\n\t\t\twhile (attr_contentlen>0) {\n\t\t\t\tnum_of_ch = *(pattr_temp+1);\n\n\t\t\t\tfor(i=0; i<num_of_ch; i++) {\n\t\t\t\t\tif (*(pattr_temp+2+i) == buddy_ch) {\n\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch_list fit buddy_ch:%u\\n\", FUNC_ADPT_ARG(padapter), buddy_ch);\n\t\t\t\t\t\tfit = _TRUE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpattr_temp += (2+num_of_ch);\n\t\t\t\tattr_contentlen -= (2+num_of_ch);\n\t\t\t}\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n#endif\n\treturn fit;\n}\n\nstatic bool rtw_chk_p2pie_op_ch_with_buddy(_adapter *padapter, const u8 *frame_body, u32 len)\n{\n\tbool fit = _FALSE;\n#ifdef CONFIG_CONCURRENT_MODE\n\tu8 *ies, *p2p_ie;\n\tu32 ies_len, p2p_ielen;\n\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\tu8 buddy_ch = pbuddy_mlmeext->cur_channel;\n\n\ties = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\twhile (p2p_ie) {\n\t\tu32\tattr_contentlen = 0;\n\t\tu8 *pattr = NULL;\n\n\t\t//Check P2P_ATTR_OPERATING_CH\n\t\tattr_contentlen = 0;\n\t\tpattr = NULL;\n\t\tif((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL) {\n\t\t\tif (*(pattr+4) == buddy_ch) {\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" op_ch fit buddy_ch:%u\\n\", FUNC_ADPT_ARG(padapter), buddy_ch);\n\t\t\t\tfit = _TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n#endif\n\treturn fit;\n}\n\nstatic void rtw_cfg80211_adjust_p2pie_channel(_adapter *padapter, const u8 *frame_body, u32 len)\n{\n#ifdef CONFIG_CONCURRENT_MODE\n\tu8 *ies, *p2p_ie;\n\tu32 ies_len, p2p_ielen;\n\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\t\t\t\n\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\ties = (u8*)(frame_body + _PUBLIC_ACTION_IE_OFFSET_);\n\ties_len = len - _PUBLIC_ACTION_IE_OFFSET_;\n\t\t\t\t\t\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen );\n\n\twhile ( p2p_ie )\n\t{\t\n\t\tu32\tattr_contentlen = 0;\n\t\tu8 *pattr = NULL;\n\t\t\t\t\n\t\t//Check P2P_ATTR_CH_LIST\n\t\tif((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, (uint*)&attr_contentlen))!=NULL)\n\t\t{\n\t\t\tint i;\n\t\t\tu32 num_of_ch;\n\t\t\tu8 *pattr_temp = pattr + 3 ;\n\n\t\t\tattr_contentlen -= 3;\n\t\t\t\n\t\t\twhile(attr_contentlen>0)\n\t\t\t{\t\t\t\t\n\t\t\t\tnum_of_ch = *(pattr_temp+1);\n\t\t\t\t\t\t\t\t\n\t\t\t\tfor(i=0; i<num_of_ch; i++)\n\t\t\t\t\t*(pattr_temp+2+i) = pbuddy_mlmeext->cur_channel;//forcing to the same channel\n\n\t\t\t\tpattr_temp += (2+num_of_ch);\n\t\t\t\tattr_contentlen -= (2+num_of_ch);\n\t\t\t}\t\n\t\t}\n\n\t\t//Check P2P_ATTR_OPERATING_CH\n\t\tattr_contentlen = 0;\n\t\tpattr = NULL;\n\t\tif((pattr = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, (uint*)&attr_contentlen))!=NULL)\n\t\t{\n\t\t\t*(pattr+4) = pbuddy_mlmeext->cur_channel;//forcing to the same channel\t\t\t\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t\t\n\t}\n\n#endif\n}\n\n#ifdef CONFIG_WFD\nvoid rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32* len)\n{\n\tunsigned char\t*frame_body;\n\tu8 category, action, OUI_Subtype, dialogToken=0;\n\tu32\twfdielen = 0;\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);\n\t\n\tframe_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));\t\n\tcategory = frame_body[0];\n\n\tif(category == RTW_WLAN_CATEGORY_PUBLIC)\n\t{\n\t\taction = frame_body[1];\n\t\tif (action == ACT_PUBLIC_VENDOR\n\t\t\t&& _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE\n\t\t)\n\t\t{\n\t\t\tOUI_Subtype = frame_body[6];\n\t\t\tdialogToken = frame_body[7];\n\t\t\tswitch( OUI_Subtype )//OUI Subtype\n\t\t\t{\n\t\t\t\tcase P2P_GO_NEGO_REQ:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_nego_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_GO_NEGO_RESP:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_nego_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_GO_NEGO_CONF:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_nego_confirm_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_INVIT_REQ:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_invitation_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_INVIT_RESP:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_invitation_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_DEVDISC_REQ:\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_DEVDISC_RESP:\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_PROVISION_DISC_REQ:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_provdisc_req_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_PROVISION_DISC_RESP:\n\t\t\t\t{\n\t\t\t\t\twfdielen = build_provdisc_resp_wfd_ie( &padapter->wdinfo, buf + ( *len ) );\n\t\t\t\t\t(*len) += wfdielen;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\t\n\telse if(category == RTW_WLAN_CATEGORY_P2P)\n\t{\n\t\tOUI_Subtype = frame_body[5];\n\t\tdialogToken = frame_body[6];\n\n#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(\"ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\\n\",\n\t\t\t\t\tcpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken);\n#endif\n\n\t\tswitch(OUI_Subtype)\n\t\t{\n\t\t\tcase P2P_NOTICE_OF_ABSENCE:\n\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_PRESENCE_REQUEST:\n\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_PRESENCE_RESPONSE:\n\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_GO_DISC_REQUEST:\n\n\t\t\t\tbreak;\t\t\t\n\t\t\tdefault:\n\n\t\t\t\tbreak;\t\t\t\n\t\t}\t\n\n\t}\t\n\telse \n\t{\n\t\tDBG_871X(\"%s, action frame category=%d\\n\", __func__, category);\n\t\t//is_p2p_frame = (-1);\t\t\n\t}\n\n\treturn;\n}\n#endif\n\nu8 *dump_p2p_attr_ch_list(u8 *p2p_ie, uint p2p_ielen, u8 *buf, u32 buf_len)\n{\n\tuint attr_contentlen = 0;\n\tu8 *pattr = NULL;\n\tint w_sz = 0;\n\tu8 ch_cnt = 0;\n\tu8 ch_list[40];\n\tbool continuous = _FALSE;\n\n\tif ((pattr=rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, NULL, &attr_contentlen))!=NULL) {\n\t\tint i, j;\n\t\tu32 num_of_ch;\n\t\tu8 *pattr_temp = pattr + 3 ;\n\n\t\tattr_contentlen -= 3;\n\n\t\t_rtw_memset(ch_list, 0, 40);\n\n\t\twhile (attr_contentlen>0) {\n\t\t\tnum_of_ch = *(pattr_temp+1);\n\n\t\t\tfor(i=0; i<num_of_ch; i++) {\n\t\t\t\tfor (j=0;j<ch_cnt;j++) {\n\t\t\t\t\tif (ch_list[j] == *(pattr_temp+2+i))\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (j>=ch_cnt)\n\t\t\t\t\tch_list[ch_cnt++] = *(pattr_temp+2+i);\n\n\t\t\t}\n\n\t\t\tpattr_temp += (2+num_of_ch);\n\t\t\tattr_contentlen -= (2+num_of_ch);\n\t\t}\n\n\t\tfor (j=0;j<ch_cnt;j++) {\n\t\t\tif (j == 0) {\n\t\t\t\tw_sz += snprintf(buf+w_sz, buf_len-w_sz, \"%u\", ch_list[j]);\n\t\t\t} else if (ch_list[j] - ch_list[j-1] != 1) {\n\t\t\t\tw_sz += snprintf(buf+w_sz, buf_len-w_sz, \", %u\", ch_list[j]);\n\t\t\t} else if (j != ch_cnt-1 && ch_list[j+1] - ch_list[j] == 1) {\n\t\t\t\t/* empty */\n\t\t\t} else {\n\t\t\t\tw_sz += snprintf(buf+w_sz, buf_len-w_sz, \"-%u\", ch_list[j]);\n\t\t\t}\n\t\t}\n\t}\n\treturn buf;\n}\n\n/*\n * return _TRUE if requester is GO, _FALSE if responder is GO\n */\nbool rtw_p2p_nego_intent_compare(u8 req, u8 resp)\n{\n\tif (req>>1 == resp >>1)\n\t\treturn  req&0x01 ? _TRUE : _FALSE;\n\telse if (req>>1 > resp>>1)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n}\n\nint rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)\n{\n\tint is_p2p_frame = (-1);\n\tunsigned char\t*frame_body;\n\tu8 category, action, OUI_Subtype, dialogToken=0;\n\tu8 *p2p_ie = NULL;\n\tuint p2p_ielen = 0;\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);\n\tint status = -1;\n\tu8 ch_list_buf[128] = {'\\0'};\n\tint op_ch = -1;\n\tint listen_ch = -1;\n\tu8 intent = 0;\n\t\n\tframe_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));\t\n\tcategory = frame_body[0];\n\t//just for check\n\tif(category == RTW_WLAN_CATEGORY_PUBLIC)\n\t{\n\t\taction = frame_body[1];\n\t\tif (action == ACT_PUBLIC_VENDOR\n\t\t\t&& _rtw_memcmp(frame_body+2, P2P_OUI, 4) == _TRUE\n\t\t)\n\t\t{\n\t\t\tOUI_Subtype = frame_body[6];\n\t\t\tdialogToken = frame_body[7];\n\t\t\tis_p2p_frame = OUI_Subtype;\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_871X(\"ACTION_CATEGORY_PUBLIC: ACT_PUBLIC_VENDOR, OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\\n\",\n\t\t\t\tcpu_to_be32( *( ( u32* ) ( frame_body + 2 ) ) ), OUI_Subtype, dialogToken);\n\t\t\t#endif\n\n\t\t\tp2p_ie = rtw_get_p2p_ie(\n\t\t\t\t(u8 *)buf+sizeof(struct rtw_ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_,\n\t\t\t\tlen-sizeof(struct rtw_ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_,\n\t\t\t\tNULL, &p2p_ielen);\n\n\t\t\tswitch( OUI_Subtype )//OUI Subtype\n\t\t\t{\n\t\t\t\tu8 *cont;\n\t\t\t\tuint cont_len;\n\t\t\t\tcase P2P_GO_NEGO_REQ:\n\t\t\t\t{\n\t\t\t\t\tstruct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;\n\n\t\t\t\t\tif (tx) {\n\t\t\t\t\t\t#ifdef CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2\n\t\t\t\t\t\tif(pwdev_priv->provdisc_req_issued == _FALSE)\n\t\t\t\t\t\t\trtw_cfg80211_issue_p2p_provision_request(padapter, buf, len);\n\t\t\t\t\t\t#endif //CONFIG_DRV_ISSUE_PROV_REQ\n\n\t\t\t\t\t\t//pwdev_priv->provdisc_req_issued = _FALSE;\n\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t\t\trtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))\n\t\t\t\t\t\top_ch = *(cont+4);\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, NULL, &cont_len)))\n\t\t\t\t\t\tlisten_ch = *(cont+4);\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len)))\n\t\t\t\t\t\tintent = *cont;\n\n\t\t\t\t\tif (nego_info->token != dialogToken)\n\t\t\t\t\t\trtw_wdev_nego_info_init(nego_info);\n\n\t\t\t\t\t_rtw_memcpy(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN);\n\t\t\t\t\tnego_info->active = tx ? 1 : 0;\n\t\t\t\t\tnego_info->token = dialogToken;\n\t\t\t\t\tnego_info->req_op_ch = op_ch;\n\t\t\t\t\tnego_info->req_listen_ch = listen_ch;\n\t\t\t\t\tnego_info->req_intent = intent;\n\t\t\t\t\tnego_info->state = 0;\n\n\t\t\t\t\tdump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_GO_NEGO_REQ, dialogToken=%d, intent:%u%s, listen_ch:%d, op_ch:%d, ch_list:%s\\n\",\n\t\t\t\t\t\t\t(tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, (intent>>1), intent&0x1 ? \"+\" : \"-\", listen_ch, op_ch, ch_list_buf);\n\n\t\t\t\t\tif (!tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED)\n\t\t\t\t\t\t\t&& rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch_list has no intersect with buddy\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t\t\t\trtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_GO_NEGO_RESP:\n\t\t\t\t{\n\t\t\t\t\tstruct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;\n\n\t\t\t\t\tif (tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t\t\trtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))\n\t\t\t\t\t\top_ch = *(cont+4);\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, NULL, &cont_len)))\n\t\t\t\t\t\tintent = *cont;\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))\n\t\t\t\t\t\tstatus = *cont;\n\n\t\t\t\t\tif (nego_info->token == dialogToken && nego_info->state == 0\n\t\t\t\t\t\t&& _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE\n\t\t\t\t\t) {\n\t\t\t\t\t\tnego_info->status = (status==-1) ? 0xff : status;\n\t\t\t\t\t\tnego_info->rsp_op_ch= op_ch;\n\t\t\t\t\t\tnego_info->rsp_intent = intent;\n\t\t\t\t\t\tnego_info->state = 1;\n\t\t\t\t\t\tif (status != 0)\n\t\t\t\t\t\t\tnego_info->token = 0; /* init */\n\t\t\t\t\t}\n\n\t\t\t\t\tdump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_GO_NEGO_RESP, dialogToken=%d, intent:%u%s, status:%d, op_ch:%d, ch_list:%s\\n\",\n\t\t\t\t\t\t\t(tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, (intent>>1), intent&0x1 ? \"+\" : \"-\", status, op_ch, ch_list_buf);\n\n\t\t\t\t\tif (!tx) {\n\t\t\t\t\t\tpwdev_priv->provdisc_req_issued = _FALSE;\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED)\n\t\t\t\t\t\t\t&& rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch_list has no intersect with buddy\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t\t\t\trtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_GO_NEGO_CONF:\n\t\t\t\t{\n\t\t\t\t\tstruct rtw_wdev_nego_info* nego_info = &pwdev_priv->nego_info;\n\t\t\t\t\tbool is_go = _FALSE;\n\n\t\t\t\t\tif (tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t\t\trtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))\n\t\t\t\t\t\top_ch = *(cont+4);\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))\n\t\t\t\t\t\tstatus = *cont;\n\n\t\t\t\t\tif (nego_info->token == dialogToken && nego_info->state == 1\n\t\t\t\t\t\t&& _rtw_memcmp(nego_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE\n\t\t\t\t\t) {\n\t\t\t\t\t\tnego_info->status = (status==-1) ? 0xff : status;\n\t\t\t\t\t\tnego_info->conf_op_ch = (op_ch==-1) ? 0 : op_ch;\n\t\t\t\t\t\tnego_info->state = 2;\n\n\t\t\t\t\t\tif (status == 0) {\n\t\t\t\t\t\t\tif (rtw_p2p_nego_intent_compare(nego_info->req_intent, nego_info->rsp_intent) ^ !tx)\n\t\t\t\t\t\t\t\tis_go = _TRUE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnego_info->token = 0; /* init */\n\t\t\t\t\t}\n\n\t\t\t\t\tdump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_GO_NEGO_CONF, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\\n\",\n\t\t\t\t\t\t(tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, status, op_ch, ch_list_buf);\n\n\t\t\t\t\tif (!tx) {\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_INVIT_REQ:\n\t\t\t\t{\n\t\t\t\t\tstruct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;\n\t\t\t\t\tint flags = -1;\n\n\t\t\t\t\tif (tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t\t\trtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len)))\n\t\t\t\t\t\tflags = *cont;\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))\n\t\t\t\t\t\top_ch = *(cont+4);\n\n\t\t\t\t\tif (invit_info->token != dialogToken)\n\t\t\t\t\t\trtw_wdev_invit_info_init(invit_info);\n\n\t\t\t\t\t_rtw_memcpy(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN);\n\t\t\t\t\tinvit_info->active = tx ? 1 : 0;\n\t\t\t\t\tinvit_info->token = dialogToken;\n\t\t\t\t\tinvit_info->flags = (flags==-1) ? 0x0 : flags;\n\t\t\t\t\tinvit_info->req_op_ch= op_ch;\n\t\t\t\t\tinvit_info->state = 0;\n\n\t\t\t\t\tdump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_INVIT_REQ, dialogToken=%d, flags:0x%02x, op_ch:%d, ch_list:%s\\n\",\n\t\t\t\t\t\t\t(tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, flags, op_ch, ch_list_buf);\n\n\t\t\t\t\tif (!tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED)) {\n\t\t\t\t\t\t\tif (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) {\n\t\t\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" op_ch:%u has no intersect with buddy\\n\", FUNC_ADPT_ARG(padapter), op_ch);\n\t\t\t\t\t\t\t\trtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);\n\t\t\t\t\t\t\t} else if (rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) {\n\t\t\t\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ch_list has no intersect with buddy\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t\t\t\t\trtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_INVIT_RESP:\n\t\t\t\t{\n\t\t\t\t\tstruct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;\n\n\t\t\t\t\tif (tx) {\n\t\t\t\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT)\n\t\t\t\t\t\tif(check_buddy_fwstate(padapter, _FW_LINKED))\n\t\t\t\t\t\t\trtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))\n\t\t\t\t\t{\n#ifdef CONFIG_P2P_INVITE_IOT\n\t\t\t\t\t\tif(tx && *cont==7)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(\"TX_P2P_INVITE_RESP, status is no common channel, change to unknown group\\n\");\n\t\t\t\t\t\t\t*cont = 8; //unknow group status\n\t\t\t\t\t\t}\n#endif //CONFIG_P2P_INVITE_IOT\n\t\t\t\t\t\tstatus = *cont;\n\t\t\t\t\t}\t\n\t\t\t\t\tif ((cont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))\n\t\t\t\t\t\top_ch = *(cont+4);\n\n\t\t\t\t\tif (invit_info->token == dialogToken && invit_info->state == 0\n\t\t\t\t\t\t&& _rtw_memcmp(invit_info->peer_mac, tx ? GetAddr1Ptr(buf) : GetAddr2Ptr(buf), ETH_ALEN) == _TRUE\n\t\t\t\t\t) {\n\t\t\t\t\t\tinvit_info->status = (status==-1) ? 0xff : status;\n\t\t\t\t\t\tinvit_info->rsp_op_ch= op_ch;\n\t\t\t\t\t\tinvit_info->state = 1;\n\t\t\t\t\t\tinvit_info->token = 0; /* init */\n\t\t\t\t\t}\n\n\t\t\t\t\tdump_p2p_attr_ch_list(p2p_ie, p2p_ielen, ch_list_buf, 128);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_INVIT_RESP, dialogToken=%d, status:%d, op_ch:%d, ch_list:%s\\n\",\n\t\t\t\t\t\t\t(tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, status, op_ch, ch_list_buf);\n\n\t\t\t\t\tif (!tx) {\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase P2P_DEVDISC_REQ:\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_DEVDISC_REQ, dialogToken=%d\\n\", (tx==_TRUE)?\"Tx\":\"Rx\", dialogToken);\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_DEVDISC_RESP:\n\t\t\t\t\tcont = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_DEVDISC_RESP, dialogToken=%d, status:%d\\n\", (tx==_TRUE)?\"Tx\":\"Rx\", dialogToken, cont?*cont:-1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_PROVISION_DISC_REQ:\n\t\t\t\t{\n\t\t\t\t\tsize_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr);\n\t\t\t\t\tu8 *p2p_ie;\n\t\t\t\t\tuint p2p_ielen = 0;\n\t\t\t\t\tuint contentlen = 0;\n\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken=%d\\n\", (tx==_TRUE)?\"Tx\":\"Rx\", dialogToken);\n\n\t\t\t\t\t//if(tx)\n\t\t\t\t\t{\n\t\t\t\t\t\tpwdev_priv->provdisc_req_issued = _FALSE;\n\t\t\t\t\t\n\t\t\t\t\t\tif( (p2p_ie=rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))\n\t\t\t\t\t\t{\t\n\n\t\t\t\t\t\t\tif(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpwdev_priv->provdisc_req_issued = _FALSE;//case: p2p_client join p2p GO\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\t\t\t\t\t\tDBG_871X(\"provdisc_req_issued is _TRUE\\n\");\n\t\t\t\t\t\t\t\t#endif //CONFIG_DEBUG_CFG80211\n\t\t\t\t\t\t\t\tpwdev_priv->provdisc_req_issued = _TRUE;//case: p2p_devices connection before Nego req.\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase P2P_PROVISION_DISC_RESP:\n\t\t\t\t\tDBG_871X(\"RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken=%d\\n\", (tx==_TRUE)?\"Tx\":\"Rx\", dialogToken);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tDBG_871X(\"RTW_%s:OUI_Subtype=%d, dialogToken=%d\\n\", (tx==_TRUE)?\"Tx\":\"Rx\", OUI_Subtype, dialogToken);\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\t\n\telse if(category == RTW_WLAN_CATEGORY_P2P)\n\t{\n\t\tOUI_Subtype = frame_body[5];\n\t\tdialogToken = frame_body[6];\n\n\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(\"ACTION_CATEGORY_P2P: OUI=0x%x, OUI_Subtype=%d, dialogToken=%d\\n\",\n\t\t\tcpu_to_be32( *( ( u32* ) ( frame_body + 1 ) ) ), OUI_Subtype, dialogToken);\n\t\t#endif\n\n\t\tis_p2p_frame = OUI_Subtype;\n\n\t\tswitch(OUI_Subtype)\n\t\t{\n\t\t\tcase P2P_NOTICE_OF_ABSENCE:\n\t\t\t\tDBG_871X(\"RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", dialogToken);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_PRESENCE_REQUEST:\n\t\t\t\tDBG_871X(\"RTW_%s:P2P_PRESENCE_REQUEST, dialogToken=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", dialogToken);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_PRESENCE_RESPONSE:\n\t\t\t\tDBG_871X(\"RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", dialogToken);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase P2P_GO_DISC_REQUEST:\n\t\t\t\tDBG_871X(\"RTW_%s:P2P_GO_DISC_REQUEST, dialogToken=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", dialogToken);\n\t\t\t\tbreak;\t\t\t\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"RTW_%s:OUI_Subtype=%d, dialogToken=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", OUI_Subtype, dialogToken);\n\t\t\t\tbreak;\t\t\t\n\t\t}\t\n\n\t}\t\n\telse\n\t{\n\t\tDBG_871X(\"RTW_%s:action frame category=%d\\n\", (tx==_TRUE)?\"TX\":\"RX\", category);\n\t}\n\n\treturn is_p2p_frame;\n}\n\nvoid rtw_init_cfg80211_wifidirect_info( _adapter*\tpadapter)\n{\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n\n\t_rtw_memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info) );\n    \n\t_init_timer( &pcfg80211_wdinfo->remain_on_ch_timer, padapter->pnetdev, ro_ch_timer_process, padapter );\n}\n#endif //CONFIG_IOCTL_CFG80211\t\n\nvoid p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType)\n{\n\tstruct wifidirect_info\t*pwdinfo= &(padapter->wdinfo);\n\t\n_func_enter_;\n\n\tswitch(intCmdType)\n\t{\n\t\tcase P2P_FIND_PHASE_WK:\n\t\t{\n\t\t\tfind_phase_handler( padapter );\n\t\t\tbreak;\n\t\t}\n\t\tcase P2P_RESTORE_STATE_WK:\n\t\t{\n\t\t\trestore_p2p_state_handler( padapter );\n\t\t\tbreak;\n\t\t}\n\t\tcase P2P_PRE_TX_PROVDISC_PROCESS_WK:\n\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t{\n\t\t\t\tp2p_concurrent_handler( padapter );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpre_tx_provdisc_handler( padapter );\n\t\t\t}\n#else\n\t\t\tpre_tx_provdisc_handler( padapter );\n#endif\n\t\t\tbreak;\n\t\t}\n\t\tcase P2P_PRE_TX_INVITEREQ_PROCESS_WK:\n\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t{\n\t\t\t\tp2p_concurrent_handler( padapter );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpre_tx_invitereq_handler( padapter );\n\t\t\t}\n#else\t\t\t\n\t\t\tpre_tx_invitereq_handler( padapter );\n#endif\n\t\t\tbreak;\n\t\t}\n\t\tcase P2P_PRE_TX_NEGOREQ_PROCESS_WK:\n\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t\t{\n\t\t\t\tp2p_concurrent_handler( padapter );\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpre_tx_negoreq_handler( padapter );\n\t\t\t}\n#else\t\t\t\n\t\t\tpre_tx_negoreq_handler( padapter );\n#endif\n\t\t\tbreak;\n\t\t}\n#ifdef CONFIG_P2P\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tcase P2P_AP_P2P_CH_SWITCH_PROCESS_WK:\n\t\t{\n\t\t\tp2p_concurrent_handler( padapter );\n\t\t\tbreak;\n\t\t}\t\t\n#endif\n#endif\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tcase P2P_RO_CH_WK:\n\t\t{\n\t\t\tro_ch_handler( padapter );\n\t\t\tbreak;\n\t\t}\t\t\n#endif //CONFIG_IOCTL_CFG80211\t\t\n\n\t}\n\t\n_func_exit_;\n}\n\nint process_p2p_cross_connect_ie(PADAPTER padapter, u8 *IEs, u32 IELength)\n{\n\tint ret = _TRUE;\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 * p2p_ie;\n\tu32\tp2p_ielen = 0;\n\tu8\tp2p_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2\n\tu32\tattr_contentlen = 0;\n\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n_func_enter_;\n\n\tif(IELength <= _BEACON_IE_OFFSET_)\n\t\treturn ret;\n\t\n\ties = IEs + _BEACON_IE_OFFSET_;\n\ties_len = IELength - _BEACON_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen);\n\t\n\twhile(p2p_ie)\n\t{\n\t\t// Get P2P Manageability IE.\n\t\tif(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_MANAGEABILITY, p2p_attr, &attr_contentlen))\n\t\t{\n\t\t\tif ((p2p_attr[0]&(BIT(0)|BIT(1))) == 0x01) {\n\t\t\t\tret = _FALSE; \n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\t}\n\n_func_exit_;\n\treturn ret;\n}\n\n#ifdef CONFIG_P2P_PS\nvoid process_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength)\n{\n\tu8 * ies;\n\tu32 ies_len;\n\tu8 * p2p_ie;\n\tu32\tp2p_ielen = 0;\n\tu8\tnoa_attr[MAX_P2P_IE_LEN] = { 0x00 };// NoA length should be n*(13) + 2\n\tu32\tattr_contentlen = 0;\n\t\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\tfind_p2p = _FALSE, find_p2p_ps = _FALSE;\n\tu8\tnoa_offset, noa_num, noa_index;\n\n_func_enter_;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\treturn;\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type != IFACE_PORT0) \n\t\treturn;\n#endif\n\tif(IELength <= _BEACON_IE_OFFSET_)\n\t\treturn;\n\t\n\ties = IEs + _BEACON_IE_OFFSET_;\n\ties_len = IELength - _BEACON_IE_OFFSET_;\n\n\tp2p_ie = rtw_get_p2p_ie( ies, ies_len, NULL, &p2p_ielen);\n\t\n\twhile(p2p_ie)\n\t{\n\t\tfind_p2p = _TRUE;\n\t\t// Get Notice of Absence IE.\n\t\tif(rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen))\n\t\t{\n\t\t\tfind_p2p_ps = _TRUE;\n\t\t\tnoa_index = noa_attr[0];\n\n\t\t\tif( (pwdinfo->p2p_ps_mode == P2P_PS_NONE) ||\n\t\t\t\t(noa_index != pwdinfo->noa_index) )// if index change, driver should reconfigure related setting.\n\t\t\t{\n\t\t\t\tpwdinfo->noa_index = noa_index;\n\t\t\t\tpwdinfo->opp_ps = noa_attr[1] >> 7;\n\t\t\t\tpwdinfo->ctwindow = noa_attr[1] & 0x7F;\n\n\t\t\t\tnoa_offset = 2;\n\t\t\t\tnoa_num = 0;\n\t\t\t\t// NoA length should be n*(13) + 2\n\t\t\t\tif(attr_contentlen > 2)\n\t\t\t\t{\n\t\t\t\t\twhile(noa_offset < attr_contentlen)\n\t\t\t\t\t{\n\t\t\t\t\t\t//_rtw_memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1);\n\t\t\t\t\t\tpwdinfo->noa_count[noa_num] = noa_attr[noa_offset];\n\t\t\t\t\t\tnoa_offset += 1;\n\n\t\t\t\t\t\t_rtw_memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4);\n\t\t\t\t\t\tnoa_offset += 4;\n\n\t\t\t\t\t\t_rtw_memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4);\n\t\t\t\t\t\tnoa_offset += 4;\n\n\t\t\t\t\t\t_rtw_memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4);\n\t\t\t\t\t\tnoa_offset += 4;\n\n\t\t\t\t\t\tnoa_num++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpwdinfo->noa_num = noa_num;\n\n\t\t\t\tif( pwdinfo->opp_ps == 1 )\n\t\t\t\t{\n\t\t\t\t\tpwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW;\n\t\t\t\t\t// driver should wait LPS for entering CTWindow\n\t\t\t\t\tif(adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tp2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( pwdinfo->noa_num > 0 )\n\t\t\t\t{\n\t\t\t\t\tpwdinfo->p2p_ps_mode = P2P_PS_NOA;\n\t\t\t\t\tp2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 1);\n\t\t\t\t}\n\t\t\t\telse if( pwdinfo->p2p_ps_mode > P2P_PS_NONE)\n\t\t\t\t{\n\t\t\t\t\tp2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak; // find target, just break.\n\t\t}\n\n\t\t//Get the next P2P IE\n\t\tp2p_ie = rtw_get_p2p_ie(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);\n\n\t}\n\n\tif(find_p2p == _TRUE)\n\t{\n\t\tif( (pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == _FALSE) )\n\t\t{\n\t\t\tp2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1);\n\t\t}\n\t}\n\n_func_exit_;\n}\n\nvoid p2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state)\n{\n\tstruct pwrctrl_priv\t\t*pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct wifidirect_info\t*pwdinfo= &(padapter->wdinfo);\n\t\n_func_enter_;\n\n\t// Pre action for p2p state\n\tswitch(p2p_ps_state)\n\t{\n\t\tcase P2P_PS_DISABLE:\n\t\t\tpwdinfo->p2p_ps_state = p2p_ps_state;\n\t\t\t\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));\n\n\t\t\tpwdinfo->noa_index = 0;\n\t\t\tpwdinfo->ctwindow = 0;\n\t\t\tpwdinfo->opp_ps = 0;\n\t\t\tpwdinfo->noa_num = 0;\n\t\t\tpwdinfo->p2p_ps_mode = P2P_PS_NONE;\n\t\t\tif(pwrpriv->bFwCurrentInPSMode == _TRUE)\n\t\t\t{\n\t\t\t\tif(pwrpriv->smart_ps == 0)\n\t\t\t\t{\n\t\t\t\t\tpwrpriv->smart_ps = 2;\n\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase P2P_PS_ENABLE:\n\t\t\tif (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {\n\t\t\t\tpwdinfo->p2p_ps_state = p2p_ps_state;\n\t\t\t\t\n\t\t\t\tif( pwdinfo->ctwindow > 0 )\n\t\t\t\t{\n\t\t\t\t\tif(pwrpriv->smart_ps != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpwrpriv->smart_ps = 0;\n\t\t\t\t\t\tDBG_871X(\"%s(): Enter CTW, change SmartPS\\n\", __FUNCTION__);\n\t\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&(pwrpriv->pwr_mode)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase P2P_PS_SCAN:\n\t\tcase P2P_PS_SCAN_DONE:\n\t\tcase P2P_PS_ALLSTASLEEP:\n\t\t\tif (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {\n\t\t\t\tpwdinfo->p2p_ps_state = p2p_ps_state;\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state));\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\nu8 p2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue)\n{\n\tstruct cmd_obj\t*ph2c;\n\tstruct drvextra_cmd_parm\t*pdrvextra_cmd_parm;\n\tstruct wifidirect_info\t*pwdinfo= &(padapter->wdinfo);\n\tstruct cmd_priv\t*pcmdpriv = &padapter->cmdpriv;\n\tu8\tres = _SUCCESS;\n\t\n_func_enter_;\n\n\tif ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) \n#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (padapter->iface_type != IFACE_PORT0) \n#endif\n\t\t)\n\t{\n\t\treturn res;\n\t}\n\n\tif(enqueue)\n\t{\n\t\tph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));\t\n\t\tif(ph2c==NULL){\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tpdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); \n\t\tif(pdrvextra_cmd_parm==NULL){\n\t\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID;\n\t\tpdrvextra_cmd_parm->type = p2p_ps_state;\n\t\tpdrvextra_cmd_parm->size = 0;\n\t\tpdrvextra_cmd_parm->pbuf = NULL;\n\n\t\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));\n\n\t\tres = rtw_enqueue_cmd(pcmdpriv, ph2c);\n\t}\n\telse\n\t{\n\t\tp2p_ps_wk_hdl(padapter, p2p_ps_state);\n\t}\n\t\nexit:\n\t\n_func_exit_;\n\n\treturn res;\n\n}\n#endif // CONFIG_P2P_PS\n\nstatic void reset_ch_sitesurvey_timer_process (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct\twifidirect_info\t\t*pwdinfo = &adapter->wdinfo;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\t//\tReset the operation channel information\n\tpwdinfo->rx_invitereq_info.operation_ch[0] = 0;\n#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->rx_invitereq_info.operation_ch[1] = 0;\n\tpwdinfo->rx_invitereq_info.operation_ch[2] = 0;\n\tpwdinfo->rx_invitereq_info.operation_ch[3] = 0;\n#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH \n\tpwdinfo->rx_invitereq_info.scan_op_ch_only = 0;\n}\n\nstatic void reset_ch_sitesurvey_timer_process2 (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct\twifidirect_info\t\t*pwdinfo = &adapter->wdinfo;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\t//\tReset the operation channel information\n\tpwdinfo->p2p_info.operation_ch[0] = 0;\n#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->p2p_info.operation_ch[1] = 0;\n\tpwdinfo->p2p_info.operation_ch[2] = 0;\n\tpwdinfo->p2p_info.operation_ch[3] = 0;\n#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->p2p_info.scan_op_ch_only = 0;\n}\n\nstatic void restore_p2p_state_timer_process (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct\twifidirect_info\t\t*pwdinfo = &adapter->wdinfo;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn; \n\t\n\tp2p_protocol_wk_cmd( adapter, P2P_RESTORE_STATE_WK );\n}\n\nstatic void pre_tx_scan_timer_process (void *FunctionContext)\n{\n\t_adapter \t\t\t\t\t\t\t*adapter = (_adapter *) FunctionContext;\n\tstruct\twifidirect_info\t\t\t\t*pwdinfo = &adapter->wdinfo;\n\t_irqL\t\t\t\t\t\t\tirqL;\n\tstruct mlme_priv\t\t\t\t\t*pmlmepriv = &adapter->mlmepriv;\n\tu8\t\t\t\t\t\t\t\t_status = 0;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n\t\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))\n\t{\n\t\tif ( _TRUE == pwdinfo->tx_prov_disc_info.benable )\t//\tthe provision discovery request frame is trigger to send or not\n\t\t{\n\t\t\tp2p_protocol_wk_cmd( adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK );\t\t\t\n\t\t\t//issue_probereq_p2p(adapter, NULL);\n\t\t\t//_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t}\n\t}\n\telse if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))\n\t{\n\t\tif ( _TRUE == pwdinfo->nego_req_info.benable )\n\t\t{\n\t\t\tp2p_protocol_wk_cmd( adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK );\n\t\t}\n\t}\n\telse if ( rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ ) )\n\t{\n\t\tif ( _TRUE == pwdinfo->invitereq_info.benable )\n\t\t{\n\t\t\tp2p_protocol_wk_cmd( adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK );\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_8192C( \"[%s] p2p_state is %d, ignore!!\\n\", __FUNCTION__, rtw_p2p_state(pwdinfo) );\n\t}\n\t\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\n\nstatic void find_phase_timer_process (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct\twifidirect_info\t\t*pwdinfo = &adapter->wdinfo;\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n\n\tadapter->wdinfo.find_phase_state_exchange_cnt++;\n\n\tp2p_protocol_wk_cmd( adapter, P2P_FIND_PHASE_WK );\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\nvoid ap_p2p_switch_timer_process (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct\twifidirect_info\t\t*pwdinfo = &adapter->wdinfo;\n#ifdef CONFIG_IOCTL_CFG80211\t\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);\n#endif\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tATOMIC_SET(&pwdev_priv->switch_ch_to, 1);\n#endif\n\n\tp2p_protocol_wk_cmd( adapter, P2P_AP_P2P_CH_SWITCH_PROCESS_WK );\n}\n#endif\n\nvoid reset_global_wifidirect_info( _adapter* padapter )\n{\n\tstruct wifidirect_info\t*pwdinfo;\n\n\tpwdinfo = &padapter->wdinfo;\n\tpwdinfo->persistent_supported = 0;\n\tpwdinfo->session_available = _TRUE;\n\tpwdinfo->wfd_tdls_enable = 0;\n\tpwdinfo->wfd_tdls_weaksec = _TRUE;\n}\n\n#ifdef CONFIG_WFD\nint rtw_init_wifi_display_info(_adapter* padapter)\n{\n\tint\tres = _SUCCESS;\n\tstruct wifi_display_info *pwfd_info = &padapter->wfd_info;\n\n\t// Used in P2P and TDLS\n\tpwfd_info->rtsp_ctrlport = 554;\n\tpwfd_info->peer_rtsp_ctrlport = 0;\t//\tReset to 0\n\tpwfd_info->wfd_enable = _FALSE;\n\tpwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;\n\tpwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;\n\n\t// Used in P2P\n\tpwfd_info->peer_session_avail = _TRUE;\n\tpwfd_info->wfd_pc = _FALSE;\n\n\t// Used in TDLS\n\t_rtw_memset( pwfd_info->ip_address, 0x00, 4 );\n\t_rtw_memset( pwfd_info->peer_ip_address, 0x00, 4 );\n\treturn res;\n\n}\n#endif //CONFIG_WFD\n\nvoid rtw_init_wifidirect_timers(_adapter* padapter)\n{\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\n\t_init_timer( &pwdinfo->find_phase_timer, padapter->pnetdev, find_phase_timer_process, padapter );\n\t_init_timer( &pwdinfo->restore_p2p_state_timer, padapter->pnetdev, restore_p2p_state_timer_process, padapter );\n\t_init_timer( &pwdinfo->pre_tx_scan_timer, padapter->pnetdev, pre_tx_scan_timer_process, padapter );\n\t_init_timer( &pwdinfo->reset_ch_sitesurvey, padapter->pnetdev, reset_ch_sitesurvey_timer_process, padapter );\n\t_init_timer( &pwdinfo->reset_ch_sitesurvey2, padapter->pnetdev, reset_ch_sitesurvey_timer_process2, padapter );\n#ifdef CONFIG_CONCURRENT_MODE\n\t_init_timer( &pwdinfo->ap_p2p_switch_timer, padapter->pnetdev, ap_p2p_switch_timer_process, padapter );\n#endif\n}\n\nvoid rtw_init_wifidirect_addrs(_adapter* padapter, u8 *dev_addr, u8 *iface_addr)\n{\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\n\t/*init device&interface address */\n\tif (dev_addr) {\n\t\t_rtw_memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN);\n\t}\n\tif (iface_addr) {\n\t\t_rtw_memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN);\n\t}\n#endif\n}\n\nvoid init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role)\n{\n\tstruct wifidirect_info\t*pwdinfo;\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info\t*pwfd_info = &padapter->wfd_info;\n#endif\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = NULL;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = NULL;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = NULL;\n#endif\n\n\tpwdinfo = &padapter->wdinfo;\n\n\tpwdinfo->padapter = padapter;\n\t\n\t//\t1, 6, 11 are the social channel defined in the WiFi Direct specification.\n\tpwdinfo->social_chan[0] = 1;\n\tpwdinfo->social_chan[1] = 6;\n\tpwdinfo->social_chan[2] = 11;\n\tpwdinfo->social_chan[3] = 0;\t//\tchannel 0 for scanning ending in site survey function.\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (pbuddy_adapter) {\n\t\tpbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\t\tpbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\t\tpbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\t}\n\n\tif ( ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE ) && \n\t      ( ( pbuddy_mlmeext->cur_channel == 1) || ( pbuddy_mlmeext->cur_channel == 6 ) || ( pbuddy_mlmeext->cur_channel == 11 ) )\n\t   )\n\t{\n\t\t//\tUse the AP's channel as the listen channel\n\t\t//\tThis will avoid the channel switch between AP's channel and listen channel.\n\t\tpwdinfo->listen_channel = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t{\n\t\t//\tUse the channel 11 as the listen channel\n\t\tpwdinfo->listen_channel = 11;\n\t}\n\n\tif (role == P2P_ROLE_DEVICE)\n\t{\n\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) == _TRUE )\n\t\t{\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);\n\t\t}\n\t\telse\n\t\t#endif\n\t\t{\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\n\t\t}\n\t\tpwdinfo->intent = 1;\n\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN);\n\t}\n\telse if (role == P2P_ROLE_CLIENT)\n\t{\n\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\tpwdinfo->intent = 1;\n\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t}\t\n\telse if (role == P2P_ROLE_GO)\n\t{\n\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\tpwdinfo->intent = 15;\n\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t}\n\n//\tUse the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )\t\n\tpwdinfo->support_rate[0] = 0x8c;\t//\t6(B)\n\tpwdinfo->support_rate[1] = 0x92;\t//\t9(B)\n\tpwdinfo->support_rate[2] = 0x18;\t//\t12\n\tpwdinfo->support_rate[3] = 0x24;\t//\t18\n\tpwdinfo->support_rate[4] = 0x30;\t//\t24\n\tpwdinfo->support_rate[5] = 0x48;\t//\t36\n\tpwdinfo->support_rate[6] = 0x60;\t//\t48\n\tpwdinfo->support_rate[7] = 0x6c;\t//\t54\n\n\t_rtw_memcpy( ( void* ) pwdinfo->p2p_wildcard_ssid, \"DIRECT-\", 7 );\n\n\t_rtw_memset( pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN );\n\tpwdinfo->device_name_len = 0;\n\n\t_rtw_memset( &pwdinfo->invitereq_info, 0x00, sizeof( struct tx_invite_req_info ) );\n\tpwdinfo->invitereq_info.token = 3;\t//\tToken used for P2P invitation request frame.\n\t\n\t_rtw_memset( &pwdinfo->inviteresp_info, 0x00, sizeof( struct tx_invite_resp_info ) );\n\tpwdinfo->inviteresp_info.token = 0;\n\n\tpwdinfo->profileindex = 0;\n\t_rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );\n\n\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\n\n\tpwdinfo->listen_dwell = ( u8 ) (( rtw_get_current_time() % 3 ) + 1);\n\t//DBG_8192C( \"[%s] listen_dwell time is %d00ms\\n\", __FUNCTION__, pwdinfo->listen_dwell );\n\n\t_rtw_memset( &pwdinfo->tx_prov_disc_info, 0x00, sizeof( struct tx_provdisc_req_info ) );\n\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE;\n\n\t_rtw_memset( &pwdinfo->nego_req_info, 0x00, sizeof( struct tx_nego_req_info ) );\n\n\tpwdinfo->device_password_id_for_nego = WPS_DPID_PBC;\n\tpwdinfo->negotiation_dialog_token = 1;\n\n\t_rtw_memset( pwdinfo->nego_ssid, 0x00, WLAN_SSID_MAXLEN );\n\tpwdinfo->nego_ssidlen = 0;\n\n\tpwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;\n#ifdef CONFIG_WFD\n\tpwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY  | WPS_CONFIG_METHOD_PBC;\n\tpwdinfo->wfd_info = pwfd_info;\n#else\n\tpwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD;\n#endif //CONFIG_WFD\n\tpwdinfo->channel_list_attr_len = 0;\n\t_rtw_memset( pwdinfo->channel_list_attr, 0x00, 100 );\n\n\t_rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4 );\n\t_rtw_memset( pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3 );\n\t_rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_IOCTL_CFG80211\n\tpwdinfo->ext_listen_interval = 1000; //The interval to be available with legacy AP during p2p0-find/scan\n\tpwdinfo->ext_listen_period = 3000; //The time period to be available for P2P during nego\n#else //!CONFIG_IOCTL_CFG80211\n\t//pwdinfo->ext_listen_interval = 3000;\n\t//pwdinfo->ext_listen_period = 400;\n\tpwdinfo->ext_listen_interval = 1000;\n\tpwdinfo->ext_listen_period = 1000;\n#endif //!CONFIG_IOCTL_CFG80211\n#endif\n\n// Commented by Kurt 20130319\n// For WiDi purpose: Use CFG80211 interface but controled WFD/RDS frame by driver itself.\n#ifdef CONFIG_IOCTL_CFG80211\n\tpwdinfo->driver_interface = DRIVER_CFG80211;\n#else\n\tpwdinfo->driver_interface = DRIVER_WEXT;\n#endif //CONFIG_IOCTL_CFG80211\n\n\tpwdinfo->wfd_tdls_enable = 0;\n\t_rtw_memset( pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN );\n\t_rtw_memset( pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN );\n\n\tpwdinfo->rx_invitereq_info.operation_ch[0] = 0;\n\tpwdinfo->rx_invitereq_info.operation_ch[1] = 0;\t//\tUsed to indicate the scan end in site survey function\n#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->rx_invitereq_info.operation_ch[2] = 0;\n\tpwdinfo->rx_invitereq_info.operation_ch[3] = 0;\n\tpwdinfo->rx_invitereq_info.operation_ch[4] = 0;\n#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->rx_invitereq_info.scan_op_ch_only = 0;\n\tpwdinfo->p2p_info.operation_ch[0] = 0;\n\tpwdinfo->p2p_info.operation_ch[1] = 0;\t\t\t//\tUsed to indicate the scan end in site survey function\n#ifdef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->p2p_info.operation_ch[2] = 0;\n\tpwdinfo->p2p_info.operation_ch[3] = 0;\n\tpwdinfo->p2p_info.operation_ch[4] = 0;\n#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tpwdinfo->p2p_info.scan_op_ch_only = 0;\n}\n\n#ifdef CONFIG_DBG_P2P\n\n/**\n * rtw_p2p_role_txt - Get the p2p role name as a text string\n * @role: P2P role\n * Returns: The state name as a printable text string\n */\nconst char * rtw_p2p_role_txt(enum P2P_ROLE role)\n{\n\tswitch (role) {\n\tcase P2P_ROLE_DISABLE:\n\t\treturn \"P2P_ROLE_DISABLE\";\n\tcase P2P_ROLE_DEVICE:\n\t\treturn \"P2P_ROLE_DEVICE\";\n\tcase P2P_ROLE_CLIENT:\n\t\treturn \"P2P_ROLE_CLIENT\";\n\tcase P2P_ROLE_GO:\n\t\treturn \"P2P_ROLE_GO\";\n\tdefault:\n\t\treturn \"UNKNOWN\";\n\t}\n}\n\n/**\n * rtw_p2p_state_txt - Get the p2p state name as a text string\n * @state: P2P state\n * Returns: The state name as a printable text string\n */\nconst char * rtw_p2p_state_txt(enum P2P_STATE state)\n{\n\tswitch (state) {\n\tcase P2P_STATE_NONE:\n\t\treturn \"P2P_STATE_NONE\";\n\tcase P2P_STATE_IDLE:\n\t\treturn \"P2P_STATE_IDLE\";\n\tcase P2P_STATE_LISTEN:\n\t\treturn \"P2P_STATE_LISTEN\";\n\tcase P2P_STATE_SCAN:\n\t\treturn \"P2P_STATE_SCAN\";\n\tcase P2P_STATE_FIND_PHASE_LISTEN:\n\t\treturn \"P2P_STATE_FIND_PHASE_LISTEN\";\n\tcase P2P_STATE_FIND_PHASE_SEARCH:\n\t\treturn \"P2P_STATE_FIND_PHASE_SEARCH\";\n\tcase P2P_STATE_TX_PROVISION_DIS_REQ:\n\t\treturn \"P2P_STATE_TX_PROVISION_DIS_REQ\";\n\tcase P2P_STATE_RX_PROVISION_DIS_RSP:\n\t\treturn \"P2P_STATE_RX_PROVISION_DIS_RSP\";\n\tcase P2P_STATE_RX_PROVISION_DIS_REQ:\n\t\treturn \"P2P_STATE_RX_PROVISION_DIS_REQ\";\n\tcase P2P_STATE_GONEGO_ING:\n\t\treturn \"P2P_STATE_GONEGO_ING\";\n\tcase P2P_STATE_GONEGO_OK:\n\t\treturn \"P2P_STATE_GONEGO_OK\";\n\tcase P2P_STATE_GONEGO_FAIL:\n\t\treturn \"P2P_STATE_GONEGO_FAIL\";\n\tcase P2P_STATE_RECV_INVITE_REQ_MATCH:\n\t\treturn \"P2P_STATE_RECV_INVITE_REQ_MATCH\";\n\tcase P2P_STATE_PROVISIONING_ING:\n\t\treturn \"P2P_STATE_PROVISIONING_ING\";\n\tcase P2P_STATE_PROVISIONING_DONE:\n\t\treturn \"P2P_STATE_PROVISIONING_DONE\";\n\tcase P2P_STATE_TX_INVITE_REQ:\n\t\treturn \"P2P_STATE_TX_INVITE_REQ\";\n\tcase P2P_STATE_RX_INVITE_RESP_OK:\n\t\treturn \"P2P_STATE_RX_INVITE_RESP_OK\";\n\tcase P2P_STATE_RECV_INVITE_REQ_DISMATCH:\n\t\treturn \"P2P_STATE_RECV_INVITE_REQ_DISMATCH\";\n\tcase P2P_STATE_RECV_INVITE_REQ_GO:\n\t\treturn \"P2P_STATE_RECV_INVITE_REQ_GO\";\n\tcase P2P_STATE_RECV_INVITE_REQ_JOIN:\n\t\treturn \"P2P_STATE_RECV_INVITE_REQ_JOIN\";\n\tcase P2P_STATE_RX_INVITE_RESP_FAIL:\n\t\treturn \"P2P_STATE_RX_INVITE_RESP_FAIL\";\n\tcase P2P_STATE_RX_INFOR_NOREADY:\n\t\treturn \"P2P_STATE_RX_INFOR_NOREADY\";\n\tcase P2P_STATE_TX_INFOR_NOREADY:\n\t\treturn \"P2P_STATE_TX_INFOR_NOREADY\";\n\tdefault:\n\t\treturn \"UNKNOWN\";\n\t}\n}\n\nvoid dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line)\n{\n\tif(!_rtw_p2p_chk_state(wdinfo, state)) {\n\t\tenum P2P_STATE old_state = _rtw_p2p_state(wdinfo);\n\t\t_rtw_p2p_set_state(wdinfo, state);\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_state from %s to %s\\n\", caller, line\n\t\t\t, rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_state(wdinfo))\n\t\t);\n\t} else {\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_state to same state %s\\n\", caller, line\n\t\t\t, rtw_p2p_state_txt(_rtw_p2p_state(wdinfo))\n\t\t);\n\t}\n}\nvoid dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line)\n{\n\tif(_rtw_p2p_pre_state(wdinfo) != state) {\n\t\tenum P2P_STATE old_state = _rtw_p2p_pre_state(wdinfo); \n\t\t_rtw_p2p_set_pre_state(wdinfo, state);\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_pre_state from %s to %s\\n\", caller, line\n\t\t\t, rtw_p2p_state_txt(old_state), rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo))\n\t\t);\n\t} else {\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_pre_state to same state %s\\n\", caller, line\n\t\t\t, rtw_p2p_state_txt(_rtw_p2p_pre_state(wdinfo))\n\t\t);\n\t}\n}\n#if 0\nvoid dbg_rtw_p2p_restore_state(struct wifidirect_info *wdinfo, const char *caller, int line)\n{\n\tif(wdinfo->pre_p2p_state != -1) {\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d restore from %s to %s\\n\", caller, line\n\t\t\t, p2p_state_str[wdinfo->p2p_state], p2p_state_str[wdinfo->pre_p2p_state]\n\t\t);\n\t\t_rtw_p2p_restore_state(wdinfo);\n\t} else {\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d restore no pre state, cur state %s\\n\", caller, line\n\t\t\t, p2p_state_str[wdinfo->p2p_state]\n\t\t);\t\t\n\t}\n}\n#endif\nvoid dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, const char *caller, int line)\n{\n\tif(wdinfo->role != role) {\n\t\tenum P2P_ROLE old_role = wdinfo->role;\n\t\t_rtw_p2p_set_role(wdinfo, role);\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_role from %s to %s\\n\", caller, line\n\t\t\t, rtw_p2p_role_txt(old_role), rtw_p2p_role_txt(wdinfo->role)\n\t\t);\n\t} else {\n\t\tDBG_871X(\"[CONFIG_DBG_P2P]%s:%d set_role to same role %s\\n\", caller, line\n\t\t\t, rtw_p2p_role_txt(wdinfo->role)\n\t\t);\n\t}\n}\n#endif //CONFIG_DBG_P2P\n\n\nint rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)\n{\n\tint ret = _SUCCESS;\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\tif (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT|| role == P2P_ROLE_GO)\n\t{\n\t\tu8 channel, ch_offset;\n\t\tu16 bwmode;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\t\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\t\t//\tCommented by Albert 2011/12/30\n\t\t//\tThe driver just supports 1 P2P group operation.\n\t\t//\tSo, this function will do nothing if the buddy adapter had enabled the P2P function.\n\t\tif(!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\t//\tThe buddy adapter had enabled the P2P function.\n\t\t\treturn ret;\n\t\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n\t\t//leave IPS/Autosuspend\n\t\tif (_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t//\tAdded by Albert 2011/03/22\n\t\t//\tIn the P2P mode, the driver should not support the b mode.\n\t\t//\tSo, the Tx packet shouldn't use the CCK rate\n\t\tupdate_tx_basic_rate(padapter, WIRELESS_11AGN);\n\n\t\t//Enable P2P function\n\t\tinit_wifidirect_info(padapter, role);\n\t\t\t\t\n\t\trtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_TRUE);\n\t\t#ifdef CONFIG_WFD\n\t\trtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_TRUE);\n\t\t#endif\n\t\t\n\t}\n\telse if (role == P2P_ROLE_DISABLE)\n\t{\n#ifdef CONFIG_INTEL_WIDI\n\t\tif( padapter->mlmepriv.p2p_reject_disable == _TRUE )\n\t\t\treturn ret;\n#endif //CONFIG_INTEL_WIDI\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t\t\tadapter_wdev_data(padapter)->p2p_enabled = _FALSE;\n#endif //CONFIG_IOCTL_CFG80211\n\n\n\t\t//Disable P2P function\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\t_cancel_timer_ex( &pwdinfo->find_phase_timer );\n\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t_cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);\n\t\t\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey);\n\t\t\t_cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey2);\n\t\t\treset_ch_sitesurvey_timer_process( padapter );\n\t\t\treset_ch_sitesurvey_timer_process2( padapter );\n\t\t\t#ifdef CONFIG_CONCURRENT_MODE\t\t\t\n\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer);\n\t\t\t#endif\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);\n\t\t\trtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);\n\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);\n\t\t\t_rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));\n\n\t\t\t/* Remove profiles in wifidirect_info structure. */\n\t\t\t_rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );\n\t\t\tpwdinfo->profileindex = 0;\n\t\t}\n\n\t\trtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE);\n\t\t#ifdef CONFIG_WFD\n\t\trtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_FALSE);\n\t\t#endif\n\n\t\tif (_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t//Restore to initial setting.\n\t\tupdate_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);\n\n#ifdef CONFIG_INTEL_WIDI\n\t\trtw_reset_widi_info(padapter);\n#endif //CONFIG_INTEL_WIDI\n\n\t\t//For WiDi purpose.\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tpwdinfo->driver_interface = DRIVER_CFG80211;\n#else\n\t\tpwdinfo->driver_interface = DRIVER_WEXT;\n#endif //CONFIG_IOCTL_CFG80211\n\n\t}\n\t\nexit:\t\n\treturn ret;\n}\n\n#endif //CONFIG_P2P\n\n"
  },
  {
    "path": "core/rtw_pwrctrl.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_PWRCTRL_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n#include <hal_com_h2c.h>\n\nint rtw_fw_ps_state(PADAPTER padapter)\n{\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tint ret=_FAIL, dont_care=0;\n\tu16 fw_ps_state=0;\n\tu32 start_time;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct registry_priv  *registry_par = &padapter->registrypriv;\n\t\n\tif(registry_par->check_fw_ps != 1)\n\t\treturn _SUCCESS;\n\t\n\t_enter_pwrlock(&pwrpriv->check_32k_lock);\n\t\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"%s: bSurpriseRemoved=%s , hw_init_completed=%d, bDriverStopped=%s\\n\", __func__\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t\t, rtw_get_hw_init_completed(padapter)\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\");\n\t\tgoto exit_fw_ps_state;\n\t}\n\trtw_hal_set_hwreg(padapter, HW_VAR_SET_REQ_FW_PS, (u8 *)&dont_care);\n\t{\n\t\t//4. if 0x88[7]=1, driver set cmd to leave LPS/IPS. \n\t\t//Else, hw will keep in active mode.\n\t\t//debug info:\n\t\t//0x88[7] = 32kpermission, \n\t\t//0x88[6:0] = current_ps_state\n\t\t//0x89[7:0] = last_rpwm\n\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_FW_PS_STATE, (u8 *)&fw_ps_state);\n\t\t\n\t\tif((fw_ps_state & 0x80) == 0)\n\t\t\tret=_SUCCESS;\n\t\telse\n\t\t{\n\t\t\tpdbgpriv->dbg_poll_fail_cnt++;\n\t\t\tDBG_871X(\"%s: fw_ps_state=%04x \\n\", __FUNCTION__, fw_ps_state);\n\t\t}\n\t}\n\n\nexit_fw_ps_state:\n\t_exit_pwrlock(&pwrpriv->check_32k_lock);\n\treturn ret;\n}\n\n#ifdef CONFIG_IPS\nvoid _ips_enter(_adapter * padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\n\tpwrpriv->bips_processing = _TRUE;\t\n\n\t// syn ips_mode with request\n\tpwrpriv->ips_mode = pwrpriv->ips_mode_req;\n\t\n\tpwrpriv->ips_enter_cnts++;\t\n\tDBG_871X(\"==>ips_enter cnts:%d\\n\",pwrpriv->ips_enter_cnts);\n\n\tif(rf_off == pwrpriv->change_rfpwrstate )\n\t{\t\n\t\tpwrpriv->bpower_saving = _TRUE;\n\t\tDBG_871X_LEVEL(_drv_always_, \"nolinked power save enter\\n\");\n\n\t\tif(pwrpriv->ips_mode == IPS_LEVEL_2)\n\t\t\tpwrpriv->bkeepfwalive = _TRUE;\n\t\t\n\t\trtw_ips_pwr_down(padapter);\n\t\tpwrpriv->rf_pwrstate = rf_off;\n\t}\t\n\tpwrpriv->bips_processing = _FALSE;\t\n\t\n}\n\nvoid ips_enter(_adapter * padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\n\n#ifdef CONFIG_BT_COEXIST\n\trtw_btcoex_IpsNotify(padapter, pwrpriv->ips_mode_req);\n#endif // CONFIG_BT_COEXIST\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\t_ips_enter(padapter);\n\t_exit_pwrlock(&pwrpriv->lock);\n}\n\nint _ips_leave(_adapter * padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tint result = _SUCCESS;\n\n\tif((pwrpriv->rf_pwrstate == rf_off) &&(!pwrpriv->bips_processing))\n\t{\n\t\tpwrpriv->bips_processing = _TRUE;\n\t\tpwrpriv->change_rfpwrstate = rf_on;\n\t\tpwrpriv->ips_leave_cnts++;\n\t\tDBG_871X(\"==>ips_leave cnts:%d\\n\",pwrpriv->ips_leave_cnts);\n\n\t\tif ((result = rtw_ips_pwr_up(padapter)) == _SUCCESS) {\n\t\t\tpwrpriv->rf_pwrstate = rf_on;\n\t\t}\n\t\tDBG_871X_LEVEL(_drv_always_, \"nolinked power save leave\\n\");\n\t\t\n\t\tDBG_871X(\"==> ips_leave.....LED(0x%08x)...\\n\",rtw_read32(padapter,0x4c));\n\t\tpwrpriv->bips_processing = _FALSE;\n\n\t\tpwrpriv->bkeepfwalive = _FALSE;\n\t\tpwrpriv->bpower_saving = _FALSE;\n\t}\n\n\treturn result;\n}\n\nint ips_leave(_adapter * padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tint ret;\n\n\tif(!is_primary_adapter(padapter))\n\t\treturn _SUCCESS;\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\tret = _ips_leave(padapter);\n#ifdef DBG_CHECK_FW_PS_STATE\n\tif(rtw_fw_ps_state(padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"ips leave doesn't leave 32k\\n\");\n\t\tpdbgpriv->dbg_leave_ips_fail_cnt++;\n\t}\n#endif //DBG_CHECK_FW_PS_STATE\n\t_exit_pwrlock(&pwrpriv->lock);\n\n\tif (_SUCCESS == ret)\n\t\tODM_DMReset(&GET_HAL_DATA(padapter)->odmpriv);\n\n#ifdef CONFIG_BT_COEXIST\n\tif (_SUCCESS == ret)\n\t\trtw_btcoex_IpsNotify(padapter, IPS_NONE);\n#endif // CONFIG_BT_COEXIST\n\n\treturn ret;\n}\n#endif /* CONFIG_IPS */\n\n#ifdef CONFIG_AUTOSUSPEND\nextern void autosuspend_enter(_adapter* padapter);\t\nextern int autoresume_enter(_adapter* padapter);\n#endif\n\n#ifdef SUPPORT_HW_RFOFF_DETECTED\nint rtw_hw_suspend(_adapter *padapter );\nint rtw_hw_resume(_adapter *padapter);\n#endif\n\nbool rtw_pwr_unassociated_idle(_adapter *adapter)\n{\n\t_adapter *buddy = adapter->pbuddy_adapter;\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\tstruct xmit_priv *pxmit_priv = &adapter->xmitpriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(adapter->wdinfo);\n#ifdef CONFIG_IOCTL_CFG80211\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo = &adapter->cfg80211_wdinfo;\n#endif\n#endif\n\n\tbool ret = _FALSE;\n\n\tif (adapter_to_pwrctl(adapter)->bpower_saving ==_TRUE ) {\n\t\t//DBG_871X(\"%s: already in LPS or IPS mode\\n\", __func__);\n\t\tgoto exit;\n\t}\n\n\tif (adapter_to_pwrctl(adapter)->ips_deny_time >= rtw_get_current_time()) {\n\t\t//DBG_871X(\"%s ips_deny_time\\n\", __func__);\n\t\tgoto exit;\n\t}\n\n\tif (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)\n\t\t|| check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)\n\t\t|| check_fwstate(pmlmepriv, WIFI_AP_STATE)\n\t\t|| check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)\n\t\t#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)\n\t\t|| pcfg80211_wdinfo->is_ro_ch\n\t\t#elif defined(CONFIG_P2P)\n\t\t|| !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)\n\t\t#endif\n\t\t#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)\n\t\t|| rtw_get_passing_time_ms(pcfg80211_wdinfo->last_ro_ch_time) < 3000\n\t\t#endif\n\t) {\n\t\tgoto exit;\n\t}\n\n\t/* consider buddy, if exist */\n\tif (buddy) {\n\t\tstruct mlme_priv *b_pmlmepriv = &(buddy->mlmepriv);\n\t\t#ifdef CONFIG_P2P\n\t\tstruct wifidirect_info *b_pwdinfo = &(buddy->wdinfo);\n\t\t#ifdef CONFIG_IOCTL_CFG80211\n\t\tstruct cfg80211_wifidirect_info *b_pcfg80211_wdinfo = &buddy->cfg80211_wdinfo;\n\t\t#endif\n\t\t#endif\n\n\t\tif (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)\n\t\t\t|| check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)\n\t\t\t|| check_fwstate(b_pmlmepriv, WIFI_AP_STATE)\n\t\t\t|| check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)\n\t\t\t#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)\n\t\t\t|| b_pcfg80211_wdinfo->is_ro_ch\n\t\t\t#elif defined(CONFIG_P2P)\n\t\t\t|| !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)\n\t\t\t#endif\n\t\t\t#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)\n\t\t\t|| rtw_get_passing_time_ms(b_pcfg80211_wdinfo->last_ro_ch_time) < 3000\n\t\t\t#endif\n\t\t) {\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n#if (MP_DRIVER == 1)\n\tif (adapter->registrypriv.mp_mode == 1)\n\t\tgoto exit;\n#endif\n\n#ifdef CONFIG_INTEL_PROXIM\n\tif(adapter->proximity.proxim_on==_TRUE){\n\t\treturn;\n\t}\n#endif\n\n\tif (pxmit_priv->free_xmitbuf_cnt != NR_XMITBUFF ||\n\t\tpxmit_priv->free_xmit_extbuf_cnt != NR_XMIT_EXTBUFF) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"There are some pkts to transmit\\n\");\n\t\tDBG_871X_LEVEL(_drv_always_, \"free_xmitbuf_cnt: %d, free_xmit_extbuf_cnt: %d\\n\", \n\t\t\tpxmit_priv->free_xmitbuf_cnt, pxmit_priv->free_xmit_extbuf_cnt);\t\n\t\tgoto exit;\n\t}\n\n\tret = _TRUE;\n\nexit:\n\treturn ret;\n}\n\n\n/*\n * ATTENTION:\n *\trtw_ps_processor() doesn't handle LPS.\n */\nvoid rtw_ps_processor(_adapter*padapter)\n{\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n#endif //CONFIG_P2P\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n#ifdef SUPPORT_HW_RFOFF_DETECTED\n\trt_rf_power_state rfpwrstate;\n#endif //SUPPORT_HW_RFOFF_DETECTED\n\tu32 ps_deny = 0;\n\n\t_enter_pwrlock(&adapter_to_pwrctl(padapter)->lock);\n\tps_deny = rtw_ps_deny_get(padapter);\n\t_exit_pwrlock(&adapter_to_pwrctl(padapter)->lock);\n\tif (ps_deny != 0)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": ps_deny=0x%08X, skip power save!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), ps_deny);\n\t\tgoto exit;\n\t}\n\n\tif(pwrpriv->bInSuspend == _TRUE){//system suspend or autosuspend\n\t\tpdbgpriv->dbg_ps_insuspend_cnt++;\n\t\tDBG_871X(\"%s, pwrpriv->bInSuspend == _TRUE ignore this process\\n\",__FUNCTION__);\n\t\treturn;\n\t}\t\n\n\tpwrpriv->ps_processing = _TRUE;\n\n#ifdef SUPPORT_HW_RFOFF_DETECTED\n\tif(pwrpriv->bips_processing == _TRUE)\n\t\tgoto exit;\n\t\n\t//DBG_871X(\"==> fw report state(0x%x)\\n\",rtw_read8(padapter,0x1ca));\t\n\tif(pwrpriv->bHWPwrPindetect) \n\t{\n\t#ifdef CONFIG_AUTOSUSPEND\n\t\tif(padapter->registrypriv.usbss_enable)\n\t\t{\n\t\t\tif(pwrpriv->rf_pwrstate == rf_on)\n\t\t\t{\n\t\t\t\tif(padapter->net_closed == _TRUE)\n\t\t\t\t\tpwrpriv->ps_flag = _TRUE;\n\n\t\t\t\trfpwrstate = RfOnOffDetect(padapter);\n\t\t\t\tDBG_871X(\"@@@@- #1  %s==> rfstate:%s \\n\",__FUNCTION__,(rfpwrstate==rf_on)?\"rf_on\":\"rf_off\");\n\t\t\t\tif(rfpwrstate!= pwrpriv->rf_pwrstate)\n\t\t\t\t{\n\t\t\t\t\tif(rfpwrstate == rf_off)\n\t\t\t\t\t{\n\t\t\t\t\t\tpwrpriv->change_rfpwrstate = rf_off;\n\t\t\t\t\t\t\n\t\t\t\t\t\tpwrpriv->bkeepfwalive = _TRUE;\t\n\t\t\t\t\t\tpwrpriv->brfoffbyhw = _TRUE;\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tautosuspend_enter(padapter);\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t\telse\n\t#endif //CONFIG_AUTOSUSPEND\n\t\t{\n\t\t\trfpwrstate = RfOnOffDetect(padapter);\n\t\t\tDBG_871X(\"@@@@- #2  %s==> rfstate:%s \\n\",__FUNCTION__,(rfpwrstate==rf_on)?\"rf_on\":\"rf_off\");\n\n\t\t\tif(rfpwrstate!= pwrpriv->rf_pwrstate)\n\t\t\t{\n\t\t\t\tif(rfpwrstate == rf_off)\n\t\t\t\t{\t\n\t\t\t\t\tpwrpriv->change_rfpwrstate = rf_off;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tpwrpriv->brfoffbyhw = _TRUE;\n\t\t\t\t\trtw_hw_suspend(padapter );\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpwrpriv->change_rfpwrstate = rf_on;\n\t\t\t\t\trtw_hw_resume(padapter );\t\t\t\n\t\t\t\t}\n\t\t\t\tDBG_871X(\"current rf_pwrstate(%s)\\n\",(pwrpriv->rf_pwrstate == rf_off)?\"rf_off\":\"rf_on\");\n\t\t\t}\n\t\t}\n\t\tpwrpriv->pwr_state_check_cnts ++;\t\n\t}\n#endif //SUPPORT_HW_RFOFF_DETECTED\n\n\tif (pwrpriv->ips_mode_req == IPS_NONE)\n\t\tgoto exit;\n\n\tif (rtw_pwr_unassociated_idle(padapter) == _FALSE)\n\t\tgoto exit;\n\n\tif((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts%4)==0))\n\t{\n\t\tDBG_871X(\"==>%s .fw_state(%x)\\n\",__FUNCTION__,get_fwstate(pmlmepriv));\n\t\t#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\t#else\n\t\tpwrpriv->change_rfpwrstate = rf_off;\n\t\t#endif\n\t\t#ifdef CONFIG_AUTOSUSPEND\n\t\tif(padapter->registrypriv.usbss_enable)\n\t\t{\n\t\t\tif(pwrpriv->bHWPwrPindetect) \n\t\t\t\tpwrpriv->bkeepfwalive = _TRUE;\n\t\t\t\n\t\t\tif(padapter->net_closed == _TRUE)\n\t\t\t\tpwrpriv->ps_flag = _TRUE;\n\n\t\t\t#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\t\tif (_TRUE==pwrpriv->bInternalAutoSuspend) {\n\t\t\t\tDBG_871X(\"<==%s .pwrpriv->bInternalAutoSuspend)(%x)\\n\",__FUNCTION__,pwrpriv->bInternalAutoSuspend);\n\t\t\t} else {\n\t\t\t\tpwrpriv->change_rfpwrstate = rf_off;\n\t\t\t\tDBG_871X(\"<==%s .pwrpriv->bInternalAutoSuspend)(%x) call autosuspend_enter\\n\",__FUNCTION__,pwrpriv->bInternalAutoSuspend);\n\t\t\t\tautosuspend_enter(padapter);\n\t\t\t}\t\t\n\t\t\t#else\n\t\t\tautosuspend_enter(padapter);\n\t\t\t#endif\t//if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\t}\t\t\n\t\telse if(pwrpriv->bHWPwrPindetect)\n\t\t{\n\t\t}\n\t\telse\n\t\t#endif //CONFIG_AUTOSUSPEND\n\t\t{\n\t\t\t#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\t\tpwrpriv->change_rfpwrstate = rf_off;\n\t\t\t#endif\t//defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\n\t\t\t#ifdef CONFIG_IPS\n\t\t\tips_enter(padapter);\t\t\t\n\t\t\t#endif\n\t\t}\n\t}\nexit:\n#ifndef CONFIG_IPS_CHECK_IN_WD\n\trtw_set_pwr_state_check_timer(pwrpriv);\n#endif\n\tpwrpriv->ps_processing = _FALSE;\n\treturn;\n}\n\nvoid pwr_state_check_handler(RTW_TIMER_HDL_ARGS);\nvoid pwr_state_check_handler(RTW_TIMER_HDL_ARGS)\n{\n\t_adapter *padapter = (_adapter *)FunctionContext;\n\trtw_ps_cmd(padapter);\n}\n\n#ifdef CONFIG_LPS\nvoid\ttraffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets)\n{\n#ifdef CONFIG_CHECK_LEAVE_LPS\n\tstatic u32 start_time = 0;\n\tstatic u32 xmit_cnt = 0;\n\tu8\tbLeaveLPS = _FALSE;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\n\t\n\n\tif(tx) //from tx\n\t{\n\t\txmit_cnt += tx_packets;\n\n\t\tif (start_time== 0)\n\t\t\tstart_time= rtw_get_current_time();\n\n\t\tif (rtw_get_passing_time_ms(start_time) > 2000) // 2 sec == watch dog timer\n\t\t{\t\t\n\t\t\tif(xmit_cnt > 8)\n\t\t\t{\n\t\t\t\tif ((adapter_to_pwrctl(padapter)->bLeisurePs) \n\t\t\t\t\t&& (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE)\n#ifdef CONFIG_BT_COEXIST\n\t\t\t\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _FALSE)\n#endif\n\t\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"leave lps via Tx = %d\\n\", xmit_cnt);\t\t\t\n\t\t\t\t\tbLeaveLPS = _TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstart_time= rtw_get_current_time();\n\t\t\txmit_cnt = 0;\n\t\t}\n\n\t}\n\telse // from rx path\n\t{\n\t\tif(pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 4/*2*/)\n\t\t{\n\t\t\tif ((adapter_to_pwrctl(padapter)->bLeisurePs)\n\t\t\t\t&& (adapter_to_pwrctl(padapter)->pwr_mode != PS_MODE_ACTIVE)\n#ifdef CONFIG_BT_COEXIST\t\t\n\t\t\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _FALSE)\n#endif\n\t\t\t\t)\n\t\t\t{\t\n\t\t\t\t//DBG_871X(\"leave lps via Rx = %d\\n\", pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);\t\n\t\t\t\tbLeaveLPS = _TRUE;\n\t\t\t}\n\t\t}\t\n\t}\t\n\n\tif(bLeaveLPS)\n\t{\n\t\t//DBG_871X(\"leave lps via %s, Tx = %d, Rx = %d \\n\", tx?\"Tx\":\"Rx\", pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);\t\n\t\t//rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);\n\t\trtw_lps_ctrl_wk_cmd(padapter, tx?LPS_CTRL_TX_TRAFFIC_LEAVE:LPS_CTRL_RX_TRAFFIC_LEAVE, tx?0:1);\n\t}\n#endif //CONFIG_CHECK_LEAVE_LPS\n}\t\t\n\n/*\n * Description:\n *\tThis function MUST be called under power lock protect\n *\n * Parameters\n *\tpadapter\n *\tpslv\t\t\tpower state level, only could be PS_STATE_S0 ~ PS_STATE_S4\n *\n */\nvoid rtw_set_rpwm(PADAPTER padapter, u8 pslv)\n{\n\tu8\trpwm;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\tu8 cpwm_orig;\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n_func_enter_;\n\n\tpslv = PS_STATE(pslv);\n\n#ifdef CONFIG_LPS_RPWM_TIMER\n\tif (pwrpriv->brpwmtimeout == _TRUE)\n\t{\n\t\tDBG_871X(\"%s: RPWM timeout, force to set RPWM(0x%02X) again!\\n\", __FUNCTION__, pslv);\n\t}\n\telse\n#endif // CONFIG_LPS_RPWM_TIMER\n\t{\n\t\tif ( (pwrpriv->rpwm == pslv)\n#ifdef CONFIG_LPS_LCLK\n\t\t\t|| ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2))\n#endif\n\t\t\t)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,\n\t\t\t\t(\"%s: Already set rpwm[0x%02X], new=0x%02X!\\n\", __FUNCTION__, pwrpriv->rpwm, pslv));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (rtw_is_surprise_removed(padapter) ||\n\t\t(!rtw_is_hw_init_completed(padapter)))\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,\n\t\t\t\t(\"%s: SurpriseRemoved(%s) hw_init_completed(%s)\\n\"\n\t\t\t\t, __func__\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_hw_init_completed(padapter)?\"True\":\"False\"));\n\n\t\tpwrpriv->cpwm = PS_STATE_S4;\n\n\t\treturn;\n\t}\n\n\tif (rtw_is_drv_stopped(padapter)) {\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,\n\t\t\t\t (\"%s: change power state(0x%02X) when DriverStopped\\n\", __FUNCTION__, pslv));\n\n\t\tif (pslv < PS_STATE_S2) {\n\t\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,\n\t\t\t\t\t (\"%s: Reject to enter PS_STATE(0x%02X) lower than S2 when DriverStopped!!\\n\", __FUNCTION__, pslv));\n\t\t\treturn;\n\t\t}\n\t}\n\n\trpwm = pslv | pwrpriv->tog;\n#ifdef CONFIG_LPS_LCLK\n\t// only when from PS_STATE S0/S1 to S2 and higher needs ACK\n\tif ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2))\n\t\trpwm |= PS_ACK;\n#endif\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\\n\", rpwm, pwrpriv->cpwm));\n\n\tpwrpriv->rpwm = pslv;\n\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\tcpwm_orig = 0;\n\tif (rpwm & PS_ACK)\n\t{\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);\n\t}\n#endif\n\n#if defined(CONFIG_LPS_RPWM_TIMER) && !defined(CONFIG_DETECT_CPWM_BY_POLLING)\n\tif (rpwm & PS_ACK)\n\t\t_set_timer(&pwrpriv->pwr_rpwm_timer, LPS_RPWM_WAIT_MS);\n#endif // CONFIG_LPS_RPWM_TIMER & !CONFIG_DETECT_CPWM_BY_POLLING\n\trtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm));\n\n\tpwrpriv->tog += 0x80;\n\n#ifdef CONFIG_LPS_LCLK\n\t// No LPS 32K, No Ack\n\tif (rpwm & PS_ACK)\n\t{\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\t\tu32 start_time;\n\t\tu8 cpwm_now;\n\t\tu8 poll_cnt=0;\n\n\t\tstart_time = rtw_get_current_time();\n\n\t\t// polling cpwm\n\t\tdo {\n\t\t\trtw_msleep_os(1);\n\t\t\tpoll_cnt++;\n\t\t\tcpwm_now = 0;\n\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now);\n\t\t\tif ((cpwm_orig ^ cpwm_now) & 0x80)\n\t\t\t{\n\t\t\t\tpwrpriv->cpwm = PS_STATE_S4;\n\t\t\t\tpwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE;\n#ifdef DBG_CHECK_FW_PS_STATE\n\t\t\t\tDBG_871X(\"%s: polling cpwm OK! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x , 0x100=0x%x\\n\"\n\t\t\t\t, __FUNCTION__,poll_cnt, cpwm_orig, cpwm_now, rtw_read8(padapter, REG_CR));\n\t\t\t\tif(rtw_fw_ps_state(padapter) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"leave 32k but fw state in 32k\\n\");\n\t\t\t\t\tpdbgpriv->dbg_rpwm_toogle_cnt++;\n\t\t\t\t}\n#endif //DBG_CHECK_FW_PS_STATE\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s: polling cpwm timeout! poll_cnt=%d, cpwm_orig=%02x, cpwm_now=%02x \\n\", __FUNCTION__,poll_cnt, cpwm_orig, cpwm_now);\n#ifdef DBG_CHECK_FW_PS_STATE\n\t\t\t\tif(rtw_fw_ps_state(padapter) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"rpwm timeout and fw ps state in 32k\\n\");\n\t\t\t\t\tpdbgpriv->dbg_rpwm_timeout_fail_cnt++;\n\t\t\t\t}\n#endif //DBG_CHECK_FW_PS_STATE\n#ifdef CONFIG_LPS_RPWM_TIMER\n\t\t\t\t_set_timer(&pwrpriv->pwr_rpwm_timer, 1);\n#endif // CONFIG_LPS_RPWM_TIMER\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (1);\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\t}\n\telse\n#endif // CONFIG_LPS_LCLK\n\t{\n\t\tpwrpriv->cpwm = pslv;\n\t}\n\n_func_exit_;\n}\n\nu8 PS_RDY_CHECK(_adapter * padapter)\n{\n\tu32 curr_time, delta_time;\n\tstruct pwrctrl_priv\t*pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &(padapter->wdinfo);\n#ifdef CONFIG_IOCTL_CFG80211\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n#endif /* CONFIG_IOCTL_CFG80211 */\n#endif /* CONFIG_P2P */\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\tif(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_mode)\n\t\treturn _TRUE;\n\telse if(_TRUE == pwrpriv->bInSuspend && pwrpriv->wowlan_ap_mode)\n\t\treturn _TRUE;\n\telse if (_TRUE == pwrpriv->bInSuspend)\n\t\treturn _FALSE;\n#else\n\tif(_TRUE == pwrpriv->bInSuspend )\n\t\treturn _FALSE;\n#endif\n\n\tcurr_time = rtw_get_current_time();\t\n\n\tdelta_time = curr_time -pwrpriv->DelayLPSLastTimeStamp;\n\n\tif(delta_time < LPS_DELAY_TIME)\n\t{\t\t\n\t\treturn _FALSE;\n\t}\n\n\tif (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR)\n\t\t|| check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)\n\t\t|| check_fwstate(pmlmepriv, WIFI_AP_STATE)\n\t\t|| check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)\n\t\t#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS)\n\t\t|| pcfg80211_wdinfo->is_ro_ch\n\t\t#elif defined(CONFIG_P2P)\n\t\t|| !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)\n\t\t#endif\n\t\t|| rtw_is_scan_deny(padapter)\n#ifdef CONFIG_TDLS\n\t\t// TDLS link is established.\n\t\t|| ( padapter->tdlsinfo.link_established == _TRUE )\n#endif // CONFIG_TDLS\t\t\n\t)\n\t\treturn _FALSE;\n\n\tif( (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) && (padapter->securitypriv.binstallGrpkey == _FALSE) )\n\t{\n\t\tDBG_871X(\"Group handshake still in progress !!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif (!rtw_cfg80211_pwr_mgmt(padapter))\n\t\treturn _FALSE;\n#endif\t\n\n\treturn _TRUE;\n}\n\n#if defined(CONFIG_FWLPS_IN_IPS)\nvoid rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tint cnt=0;\n\tu32 start_time;\n\tu8 val8 = 0;\n\tu8 cpwm_orig = 0, cpwm_now = 0;\n\tu8 parm[H2C_INACTIVE_PS_LEN]={0};\n\n\tif (padapter->netif_up == _FALSE) {\n\t\tDBG_871X(\"%s: ERROR, netif is down\\n\", __func__);\n\t\treturn;\n\t}\n\n\t//u8 cmd_param; //BIT0:enable, BIT1:NoConnect32k\n\tif (enable) {\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_IpsNotify(padapter, pwrpriv->ips_mode_req);\n#endif\n\t\t//Enter IPS\n\t\tDBG_871X(\"%s: issue H2C to FW when entering IPS\\n\", __func__);\n\n#ifdef CONFIG_PNO_SUPPORT\n\t\tparm[0] = 0x03;\n\t\tparm[1] = pwrpriv->pnlo_info->fast_scan_iterations;\n\t\tparm[2] = pwrpriv->pnlo_info->slow_scan_period;\n#else\n\t\tparm[0] = 0x03;\n\t\tparm[1] = 0x0;\n\t\tparm[2] = 0x0;\n#endif//CONFIG_PNO_SUPPORT\n\n\t\trtw_hal_fill_h2c_cmd(padapter, //H2C_FWLPS_IN_IPS_,\n\t\t\t\t\tH2C_INACTIVE_PS_,\n\t\t\t\t\tH2C_INACTIVE_PS_LEN, parm);\n\t\t//poll 0x1cc to make sure H2C command already finished by FW; MAC_0x1cc=0 means H2C done by FW.\n\t\tdo{\n\t\t\tval8 = rtw_read8(padapter, REG_HMETFR);\n\t\t\tcnt++;\n\t\t\tDBG_871X(\"%s  polling REG_HMETFR=0x%x, cnt=%d \\n\",\n\t\t\t\t\t__func__, val8, cnt);\n\t\t\trtw_mdelay_os(10);\n\t\t}while(cnt<100 && (val8!=0));\n\n\t\t//H2C done, enter 32k\n\t\tif (val8 == 0) {\n\t\t\t//ser rpwm to enter 32k\n\t\t\tval8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);\n\t\t\tDBG_871X(\"%s: read rpwm=%02x\\n\", __FUNCTION__, val8);\n\t\t\tval8 += 0x80;\n\t\t\tval8 |= BIT(0);\n\t\t\trtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);\n\t\t\tDBG_871X(\"%s: write rpwm=%02x\\n\", __FUNCTION__, val8);\n\t\t\tadapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;\n\t\t\tcnt = val8 = 0;\n\t\t\tif (parm[1] == 0 || parm[2] == 0) {\n\t\t\t\tdo {\n\t\t\t\t\tval8 = rtw_read8(padapter, REG_CR);\n\t\t\t\t\tcnt++;\n\t\t\t\t\tDBG_871X(\"%s  polling 0x100=0x%x, cnt=%d \\n\",\n\t\t\t\t\t\t\t__func__, val8, cnt);\n\t\t\t\t\tDBG_871X(\"%s 0x08:%02x, 0x03:%02x\\n\",\n\t\t\t\t\t\t\t__func__,\n\t\t\t\t\t\t\trtw_read8(padapter, 0x08),\n\t\t\t\t\t\t\trtw_read8(padapter, 0x03));\n\t\t\t\t\trtw_mdelay_os(10);\n\t\t\t\t} while(cnt<20 && (val8!=0xEA));\n\t\t\t}\n\t\t}\n\t} else {\n\t\t//Leave IPS\n\t\tDBG_871X(\"%s: Leaving IPS in FWLPS state\\n\", __func__);\n\n\t\t//for polling cpwm\n\t\tcpwm_orig = 0;\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig);\n\n\t\t//ser rpwm\n\t\tval8 = rtw_read8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1);\n\t\tval8 &= 0x80;\n\t\tval8 += 0x80;\n\t\tval8 |= BIT(6);\n\t\trtw_write8(padapter, SDIO_LOCAL_BASE|SDIO_REG_HRPWM1, val8);\n\t\tDBG_871X(\"%s: write rpwm=%02x\\n\", __FUNCTION__, val8);\n\t\tadapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80;\n\n\t\t//do polling cpwm\n\t\tstart_time = rtw_get_current_time();\n\t\tdo {\n\n\t\t\trtw_mdelay_os(1);\n\n\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now);\n\t\t\tif ((cpwm_orig ^ cpwm_now) & 0x80) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (rtw_get_passing_time_ms(start_time) > 100)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s: polling cpwm timeout when leaving IPS in FWLPS state\\n\", __FUNCTION__);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (1);\n\n\t\tparm[0] = 0x0;\n\t\tparm[1] = 0x0;\n\t\tparm[2] = 0x0;\n\t\trtw_hal_fill_h2c_cmd(padapter, H2C_INACTIVE_PS_,\n\t\t\t\t\tH2C_INACTIVE_PS_LEN, parm);\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_IpsNotify(padapter, IPS_NONE);\n#endif\n\t}\n}\n#endif //CONFIG_PNO_SUPPORT\n\nvoid rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n#endif //CONFIG_P2P\n#ifdef CONFIG_TDLS\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t_irqL irqL;\n\tint i, j;\n\t_list\t*plist, *phead;\n\tstruct sta_info *ptdls_sta;\n#endif //CONFIG_TDLS\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"%s: PowerMode=%d Smart_PS=%d\\n\",\n\t\t\t  __FUNCTION__, ps_mode, smart_ps));\n\n\tif(ps_mode > PM_Card_Disable) {\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,(\"ps_mode:%d error\\n\", ps_mode));\n\t\treturn;\n\t}\n\n\tif (pwrpriv->pwr_mode == ps_mode)\n\t{\n\t\tif (PS_MODE_ACTIVE == ps_mode) return;\n\n#ifndef CONFIG_BT_COEXIST\n\t\tif ((pwrpriv->smart_ps == smart_ps) &&\n\t\t\t(pwrpriv->bcn_ant_mode == bcn_ant_mode))\n\t\t{\n\t\t\treturn;\n\t\t}\n#endif // !CONFIG_BT_COEXIST\n\t}\n\n#ifdef CONFIG_LPS_LCLK\n\t_enter_pwrlock(&pwrpriv->lock);\n#endif\n\n\t//if(pwrpriv->pwr_mode == PS_MODE_ACTIVE)\n\tif(ps_mode == PS_MODE_ACTIVE)\n\t{\n\t\tif (1\n#ifdef CONFIG_BT_COEXIST\n\t\t\t&& (((rtw_btcoex_IsBtControlLps(padapter) == _FALSE)\n#ifdef CONFIG_P2P_PS\n\t\t\t\t\t&& (pwdinfo->opp_ps == 0)\n#endif // CONFIG_P2P_PS\n\t\t\t\t\t)\n\t\t\t\t|| ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\n\t\t\t\t\t&& (rtw_btcoex_IsLpsOn(padapter) == _FALSE))\n\t\t\t\t)\n#else // !CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P_PS\n\t\t\t&& (pwdinfo->opp_ps == 0)\n#endif // CONFIG_P2P_PS\n#endif // !CONFIG_BT_COEXIST\n\t\t\t)\n\t\t{\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" Leave 802.11 power save - %s\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), msg);\n\n\t\t\tif (pwrpriv->lps_leave_cnts < UINT_MAX)\n\t\t\t\tpwrpriv->lps_leave_cnts++;\n\t\t\telse\n\t\t\t\tpwrpriv->lps_leave_cnts = 0;\n#ifdef CONFIG_TDLS\n\t\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\t\tfor(i=0; i< NUM_STA; i++)\n\t\t\t{\n\t\t\t\tphead = &(pstapriv->sta_hash[i]);\n\t\t\t\tplist = get_next(phead);\n\n\t\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t\t{\n\t\t\t\t\tptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\n\t\t\t\t\tif( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )\n\t\t\t\t\t\tissue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0);\n\t\t\t\t\tplist = get_next(plist);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n#endif //CONFIG_TDLS\n\n\t\t\tpwrpriv->pwr_mode = ps_mode;\n\t\t\trtw_set_rpwm(padapter, PS_STATE_S4);\n\t\t\t\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) || defined(CONFIG_P2P_WOWLAN)\n\t\t\tif (pwrpriv->wowlan_mode == _TRUE ||\n\t\t\t\t\tpwrpriv->wowlan_ap_mode == _TRUE ||\n\t\t\t\t\tpwrpriv->wowlan_p2p_mode == _TRUE)\n\t\t\t{\n\t\t\t\tu32 start_time, delay_ms;\n\t\t\t\tu8 val8;\n\t\t\t\tdelay_ms = 20;\n\t\t\t\tstart_time = rtw_get_current_time();\n\t\t\t\tdo { \n\t\t\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_SYS_CLKR, &val8);\n\t\t\t\t\tif (!(val8 & BIT(4))){ //0x08 bit4 =1 --> in 32k, bit4 = 0 --> leave 32k\n\t\t\t\t\t\tpwrpriv->cpwm = PS_STATE_S4;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (rtw_get_passing_time_ms(start_time) > delay_ms)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"%s: Wait for FW 32K leave more than %u ms!!!\\n\", \n\t\t\t\t\t\t\t\t__FUNCTION__, delay_ms);\n\t\t\t\t\t\tpdbgpriv->dbg_wow_leave_ps_fail_cnt++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\trtw_usleep_os(100);\n\t\t\t\t} while (1); \n\t\t\t}\n#endif\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));\n\t\t\tpwrpriv->bFwCurrentInPSMode = _FALSE;\n\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_LpsNotify(padapter, ps_mode);\n#endif // CONFIG_BT_COEXIST\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((PS_RDY_CHECK(padapter) && check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE))\n#ifdef CONFIG_BT_COEXIST\n\t\t\t|| ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\n\t\t\t\t&& (rtw_btcoex_IsLpsOn(padapter) == _TRUE))\n#endif\n#ifdef CONFIG_P2P_WOWLAN\n\t\t\t||( _TRUE == pwrpriv->wowlan_p2p_mode)\n#endif //CONFIG_P2P_WOWLAN\n\t\t\t)\n\t\t{\n\t\t\tu8 pslv;\n\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" Enter 802.11 power save - %s\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), msg);\n\n\t\t\tif (pwrpriv->lps_enter_cnts < UINT_MAX)\n\t\t\t\tpwrpriv->lps_enter_cnts++;\n\t\t\telse\n\t\t\t\tpwrpriv->lps_enter_cnts = 0;\n#ifdef CONFIG_TDLS\n\t\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\t\tfor(i=0; i< NUM_STA; i++)\n\t\t\t{\n\t\t\t\tphead = &(pstapriv->sta_hash[i]);\n\t\t\t\tplist = get_next(phead);\n\n\t\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t\t{\n\t\t\t\t\tptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\n\t\t\t\t\tif( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE )\n\t\t\t\t\t\tissue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 0, 0);\n\t\t\t\t\tplist = get_next(plist);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n#endif //CONFIG_TDLS\n\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_LpsNotify(padapter, ps_mode);\n#endif // CONFIG_BT_COEXIST\n\n\t\t\tpwrpriv->bFwCurrentInPSMode = _TRUE;\n\t\t\tpwrpriv->pwr_mode = ps_mode;\n\t\t\tpwrpriv->smart_ps = smart_ps;\n\t\t\tpwrpriv->bcn_ant_mode = bcn_ant_mode;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));\n\n#ifdef CONFIG_P2P_PS\n\t\t\t// Set CTWindow after LPS\n\t\t\tif(pwdinfo->opp_ps == 1)\n\t\t\t\tp2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0);\n#endif //CONFIG_P2P_PS\n\n\t\t\tpslv = PS_STATE_S2;\n#ifdef CONFIG_LPS_LCLK\n\t\t\tif (pwrpriv->alives == 0)\n\t\t\t\tpslv = PS_STATE_S0;\n#endif // CONFIG_LPS_LCLK\n\n#ifdef CONFIG_BT_COEXIST\n\t\t\tif ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE)\n\t\t\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _TRUE))\n\t\t\t{\n\t\t\t\tu8 val8;\n\n\t\t\t\tval8 = rtw_btcoex_LpsVal(padapter);\n\t\t\t\tif (val8 & BIT(4))\n\t\t\t\t\tpslv = PS_STATE_S2;\n\n\t\t\t}\n#endif // CONFIG_BT_COEXIST\n\n\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n#ifdef CONFIG_LPS_LCLK\n\t_exit_pwrlock(&pwrpriv->lock);\n#endif\n\n_func_exit_;\n}\n\n/*\n * Return:\n *\t0:\tLeave OK\n *\t-1:\tTimeout\n *\t-2:\tOther error\n */\ns32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms)\n{\n\tu32 start_time;\n\tu8 bAwake = _FALSE;\n\ts32 err = 0;\n\n\n\tstart_time = rtw_get_current_time();\n\twhile (1)\n\t{\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_FWLPS_RF_ON, &bAwake);\n\t\tif (_TRUE == bAwake)\n\t\t\tbreak;\n\n\t\tif (rtw_is_surprise_removed(padapter)) {\n\t\t\terr = -2;\n\t\t\tDBG_871X(\"%s: device surprise removed!!\\n\", __FUNCTION__);\n\t\t\tbreak;\n\t\t}\n\n\t\tif (rtw_get_passing_time_ms(start_time) > delay_ms)\n\t\t{\n\t\t\terr = -1;\n\t\t\tDBG_871X(\"%s: Wait for FW LPS leave more than %u ms!!!\\n\", __FUNCTION__, delay_ms);\n\t\t\tbreak;\n\t\t}\n\t\trtw_usleep_os(100);\n\t}\n\n\treturn err;\n}\n\n//\n//\tDescription:\n//\t\tEnter the leisure power save mode.\n//\nvoid LPS_Enter(PADAPTER padapter, const char *msg)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv\t*pwrpriv = dvobj_to_pwrctl(dvobj);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t_adapter *buddy = padapter->pbuddy_adapter;\n\tint n_assoc_iface = 0;\n\tint i;\n\tchar buf[32] = {0};\n\n_func_enter_;\n\n//\tDBG_871X(\"+LeisurePSEnter\\n\");\n\n#ifdef CONFIG_BT_COEXIST\n\tif (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\n\t\treturn;\n#endif\n\n\t/* Skip lps enter request if number of assocated adapters is not 1 */\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tif (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))\n\t\t\tn_assoc_iface++;\n\t}\n\tif (n_assoc_iface != 1)\n\t\treturn;\n\n\t/* Skip lps enter request for adapter not port0 */\n\tif (get_iface_type(padapter) != IFACE_PORT0)\n\t\treturn;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tif (PS_RDY_CHECK(dvobj->padapters[i]) == _FALSE)\n\t\t\treturn;\n\t}\n\n#ifdef CONFIG_P2P_PS\n\tif(padapter->wdinfo.p2p_ps_mode == P2P_PS_NOA)\n\t{\n\t\treturn;//supporting p2p client ps NOA via H2C_8723B_P2P_PS_OFFLOAD \n\t}\n#endif //CONFIG_P2P_PS\n\n\tif (pwrpriv->bLeisurePs)\n\t{\n\t\t// Idle for a while if we connect to AP a while ago.\n\t\tif (pwrpriv->LpsIdleCount >= 2) //  4 Sec\n\t\t{\n\t\t\tif(pwrpriv->pwr_mode == PS_MODE_ACTIVE)\n\t\t\t{\n\t\t\t\tsprintf(buf, \"WIFI-%s\", msg);\n\t\t\t\tpwrpriv->bpower_saving = _TRUE;\n\t\t\t\trtw_set_ps_mode(padapter, pwrpriv->power_mgnt, padapter->registrypriv.smart_ps, 0, buf);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpwrpriv->LpsIdleCount++;\n\t}\n\n//\tDBG_871X(\"-LeisurePSEnter\\n\");\n\n_func_exit_;\n}\n\n//\n//\tDescription:\n//\t\tLeave the leisure power save mode.\n//\nvoid LPS_Leave(PADAPTER padapter, const char *msg)\n{\n#define LPS_LEAVE_TIMEOUT_MS 100\n\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv\t*pwrpriv = dvobj_to_pwrctl(dvobj);\n\tu32 start_time;\n\tu8 bAwake = _FALSE;\n\tchar buf[32] = {0};\n\tstruct debug_priv *pdbgpriv = &dvobj->drv_dbg;\n\n_func_enter_;\n\n//\tDBG_871X(\"+LeisurePSLeave\\n\");\n\n#ifdef CONFIG_BT_COEXIST\n\tif (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)\n\t\treturn;\n#endif\n\n\tif (pwrpriv->bLeisurePs)\n\t{\n\t\tif(pwrpriv->pwr_mode != PS_MODE_ACTIVE)\n\t\t{\n\t\t\tsprintf(buf, \"WIFI-%s\", msg);\n\t\t\trtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, buf);\n\n\t\t\tif(pwrpriv->pwr_mode == PS_MODE_ACTIVE)\n\t\t\t\tLPS_RF_ON_check(padapter, LPS_LEAVE_TIMEOUT_MS);\n\t\t}\n\t}\n\n\tpwrpriv->bpower_saving = _FALSE;\n#ifdef DBG_CHECK_FW_PS_STATE\n\tif(rtw_fw_ps_state(padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"leave lps, fw in 32k\\n\");\n\t\tpdbgpriv->dbg_leave_lps_fail_cnt++;\n\t}\n#endif //DBG_CHECK_FW_PS_STATE\n//\tDBG_871X(\"-LeisurePSLeave\\n\");\n\n_func_exit_;\n}\n#endif\n\nvoid LeaveAllPowerSaveModeDirect(PADAPTER Adapter)\n{\n\tPADAPTER pri_padapter = GET_PRIMARY_ADAPTER(Adapter);\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter);\n\tstruct dvobj_priv *psdpriv = Adapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n#ifndef CONFIG_DETECT_CPWM_BY_POLLING\n\tu8 cpwm_orig, cpwm_now;\n\tu32 start_time;\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\n_func_enter_;\n\n\tDBG_871X(\"%s.....\\n\",__FUNCTION__);\n\n\tif (rtw_is_surprise_removed(Adapter)) {\n\t\tDBG_871X(FUNC_ADPT_FMT \": bSurpriseRemoved=_TRUE Skip!\\n\", FUNC_ADPT_ARG(Adapter));\n\t\treturn;\n\t}\n\n\tif ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (check_buddy_fwstate(Adapter,_FW_LINKED) == _TRUE)\n#endif\n\t\t)\n\t{ //connect\n\n\t\tif(pwrpriv->pwr_mode == PS_MODE_ACTIVE) {\n\t\t\tDBG_871X(\"%s: Driver Already Leave LPS\\n\",__FUNCTION__);\n\t\t\treturn;\n\t\t}\n\n#ifdef CONFIG_LPS_LCLK\n\t\t_enter_pwrlock(&pwrpriv->lock);\n\n#ifndef CONFIG_DETECT_CPWM_BY_POLLING\n\t\tcpwm_orig = 0;\n\t\trtw_hal_get_hwreg(Adapter, HW_VAR_CPWM, &cpwm_orig);\n#endif //CONFIG_DETECT_CPWM_BY_POLLING\n\t\trtw_set_rpwm(Adapter, PS_STATE_S4);\n\n#ifndef CONFIG_DETECT_CPWM_BY_POLLING\n\n\t\tstart_time = rtw_get_current_time();\n\n\t\t// polling cpwm\n\t\tdo {\n\t\t\trtw_mdelay_os(1);\n\n\t\t\trtw_hal_get_hwreg(Adapter, HW_VAR_CPWM, &cpwm_now);\n\t\t\tif ((cpwm_orig ^ cpwm_now) & 0x80)\n\t\t\t{\n\t\t\t\tpwrpriv->cpwm = PS_STATE_S4;\n\t\t\t\tpwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE;\n#ifdef DBG_CHECK_FW_PS_STATE\n\t\t\t\tDBG_871X(\"%s: polling cpwm OK! cpwm_orig=%02x, cpwm_now=%02x, 0x100=0x%x \\n\"\n\t\t\t\t, __FUNCTION__, cpwm_orig, cpwm_now, rtw_read8(Adapter, REG_CR));\n\t\t\t\tif(rtw_fw_ps_state(Adapter) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: leave 32k but fw state in 32k\\n\", __FUNCTION__);\n\t\t\t\t\tpdbgpriv->dbg_rpwm_toogle_cnt++;\n\t\t\t\t}\n#endif //DBG_CHECK_FW_PS_STATE\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (rtw_get_passing_time_ms(start_time) > LPS_RPWM_WAIT_MS)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s: polling cpwm timeout! cpwm_orig=%02x, cpwm_now=%02x \\n\", __FUNCTION__, cpwm_orig, cpwm_now);\n#ifdef DBG_CHECK_FW_PS_STATE\n\t\t\t\tif(rtw_fw_ps_state(Adapter) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"rpwm timeout and fw ps state in 32k\\n\");\n\t\t\t\t\tpdbgpriv->dbg_rpwm_timeout_fail_cnt++;\n\t\t\t\t}\n#endif //DBG_CHECK_FW_PS_STATE\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (1);\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\n\t_exit_pwrlock(&pwrpriv->lock);\n#endif\n\n#ifdef CONFIG_P2P_PS\n\t\tp2p_ps_wk_cmd(pri_padapter, P2P_PS_DISABLE, 0);\n#endif //CONFIG_P2P_PS\n\n#ifdef CONFIG_LPS\n\t\trtw_lps_ctrl_wk_cmd(pri_padapter, LPS_CTRL_LEAVE, 0);\n#endif\n\t}\n\telse\n\t{\n\t\tif(pwrpriv->rf_pwrstate== rf_off)\n\t\t{\n\t\t\t#ifdef CONFIG_AUTOSUSPEND\n\t\t\tif(Adapter->registrypriv.usbss_enable)\n\t\t\t{\n\t\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\t\t\tusb_disable_autosuspend(adapter_to_dvobj(Adapter)->pusbdev);\n\t\t\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))\n\t\t\t\tadapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse\n\t\t\t#endif\n\t\t\t{\n#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_RTL8188E)\n\t\t\t\t#ifdef CONFIG_IPS\n\t\t\t\tif(_FALSE == ips_leave(pri_padapter))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"======> ips_leave fail.............\\n\");\t\t\t\n\t\t\t\t}\n\t\t\t\t#endif\n#endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E)\n\t\t\t}\n\t\t}\n\t}\n\n_func_exit_;\n}\n\n//\n// Description: Leave all power save mode: LPS, FwLPS, IPS if needed.\n// Move code to function by tynli. 2010.03.26. \n//\nvoid LeaveAllPowerSaveMode(IN PADAPTER Adapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tu8\tenqueue = 0;\n\tint n_assoc_iface = 0;\n\tint i;\n\n_func_enter_;\n\n\t//DBG_871X(\"%s.....\\n\",__FUNCTION__);\n\n\tif (_FALSE == Adapter->bup)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": bup=%d Skip!\\n\",\n\t\t\tFUNC_ADPT_ARG(Adapter), Adapter->bup);\n\t\treturn;\n\t}\n\n\tif (rtw_is_surprise_removed(Adapter)) {\n\t\tDBG_871X(FUNC_ADPT_FMT \": bSurpriseRemoved=_TRUE Skip!\\n\", FUNC_ADPT_ARG(Adapter));\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tif (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))\n\t\t\tn_assoc_iface++;\n\t}\n\n\tif (n_assoc_iface)\n\t{ //connect\n#ifdef CONFIG_LPS_LCLK\n\t\tenqueue = 1;\n#endif\n\n#ifdef CONFIG_P2P_PS\n\t\tp2p_ps_wk_cmd(Adapter, P2P_PS_DISABLE, enqueue);\n#endif //CONFIG_P2P_PS\n\n#ifdef CONFIG_LPS\n\t\trtw_lps_ctrl_wk_cmd(Adapter, LPS_CTRL_LEAVE, enqueue);\n#endif\n\n#ifdef CONFIG_LPS_LCLK\n\t\tLPS_Leave_check(Adapter);\n#endif\t\n\t}\n\telse\n\t{\n\t\tif(adapter_to_pwrctl(Adapter)->rf_pwrstate== rf_off)\n\t\t{\n\t\t\t#ifdef CONFIG_AUTOSUSPEND\n\t\t\tif(Adapter->registrypriv.usbss_enable)\n\t\t\t{\n\t\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\t\t\tusb_disable_autosuspend(adapter_to_dvobj(Adapter)->pusbdev);\n\t\t\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))\n\t\t\t\tadapter_to_dvobj(Adapter)->pusbdev->autosuspend_disabled = Adapter->bDisableAutosuspend;//autosuspend disabled by the user\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse\n\t\t\t#endif\n\t\t\t{\n#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || (defined(CONFIG_PLATFORM_SPRD) && defined(CONFIG_RTL8188E))\n\t\t\t\t#ifdef CONFIG_IPS\n\t\t\t\tif(_FALSE == ips_leave(Adapter))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"======> ips_leave fail.............\\n\");\t\t\t\n\t\t\t\t}\n\t\t\t\t#endif\n#endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E)\n\t\t\t}\t\t\t\t\n\t\t}\t\n\t}\n\n_func_exit_;\n}\n\n#ifdef CONFIG_LPS_LCLK\nvoid LPS_Leave_check(\n\tPADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\tu32\tstart_time;\n\tu8\tbReady;\n\n_func_enter_;\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\tbReady = _FALSE;\n\tstart_time = rtw_get_current_time();\n\n\trtw_yield_os();\n\t\n\twhile(1)\n\t{\n\t\t_enter_pwrlock(&pwrpriv->lock);\n\n\t\tif (rtw_is_surprise_removed(padapter)\n\t\t\t|| (!rtw_is_hw_init_completed(padapter))\n#ifdef CONFIG_USB_HCI\n\t\t\t|| rtw_is_drv_stopped(padapter)\n#endif\n\t\t\t|| (pwrpriv->pwr_mode == PS_MODE_ACTIVE)\n\t\t\t)\n\t\t{\n\t\t\tbReady = _TRUE;\n\t\t}\n\n\t\t_exit_pwrlock(&pwrpriv->lock);\n\n\t\tif(_TRUE == bReady)\n\t\t\tbreak;\n\n\t\tif(rtw_get_passing_time_ms(start_time)>100)\n\t\t{\n\t\t\tDBG_871X(\"Wait for cpwm event  than 100 ms!!!\\n\");\n\t\t\tbreak;\n\t\t}\n\t\trtw_msleep_os(1);\n\t}\n\n_func_exit_;\n}\n\n/*\n * Caller:ISR handler...\n *\n * This will be called when CPWM interrupt is up.\n *\n * using to update cpwn of drv; and drv willl make a decision to up or down pwr level\n */\nvoid cpwm_int_hdl(\n\tPADAPTER padapter,\n\tstruct reportpwrstate_parm *preportpwrstate)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\n_func_enter_;\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n#if 0\n\tif (pwrpriv->cpwm_tog == (preportpwrstate->state & PS_TOGGLE)) {\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_,\n\t\t\t\t (\"cpwm_int_hdl: tog(old)=0x%02x cpwm(new)=0x%02x toggle bit didn't change!?\\n\",\n\t\t\t\t  pwrpriv->cpwm_tog, preportpwrstate->state));\n\t\tgoto exit;\n\t}\n#endif\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\n#ifdef CONFIG_LPS_RPWM_TIMER\n\tif (pwrpriv->rpwm < PS_STATE_S2)\n\t{\n\t\tDBG_871X(\"%s: Redundant CPWM Int. RPWM=0x%02X CPWM=0x%02x\\n\", __func__, pwrpriv->rpwm, pwrpriv->cpwm);\n\t\t_exit_pwrlock(&pwrpriv->lock);\n\t\tgoto exit;\n\t}\n#endif // CONFIG_LPS_RPWM_TIMER\n\n\tpwrpriv->cpwm = PS_STATE(preportpwrstate->state);\n\tpwrpriv->cpwm_tog = preportpwrstate->state & PS_TOGGLE;\n\n\tif (pwrpriv->cpwm >= PS_STATE_S2)\n\t{\n\t\tif (pwrpriv->alives & CMD_ALIVE)\n\t\t\t_rtw_up_sema(&padapter->cmdpriv.cmd_queue_sema);\n\n\t\tif (pwrpriv->alives & XMIT_ALIVE)\n\t\t\t_rtw_up_sema(&padapter->xmitpriv.xmit_sema);\n\t}\n\n\t_exit_pwrlock(&pwrpriv->lock);\n\nexit:\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"cpwm_int_hdl: cpwm=0x%02x\\n\", pwrpriv->cpwm));\n\n_func_exit_;\n}\n\nstatic void cpwm_event_callback(struct work_struct *work)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, cpwm_event);\n\tstruct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv);\n\t_adapter *adapter = dvobj->padapters[IFACE_ID0];\n\tstruct reportpwrstate_parm report;\n\n\t//DBG_871X(\"%s\\n\",__FUNCTION__);\n\n\treport.state = PS_STATE_S2;\n\tcpwm_int_hdl(adapter, &report);\n}\n\n#ifdef CONFIG_LPS_RPWM_TIMER\nstatic void rpwmtimeout_workitem_callback(struct work_struct *work)\n{\n\tPADAPTER padapter;\n\tstruct dvobj_priv *dvobj;\n\tstruct pwrctrl_priv *pwrpriv;\n\n\n\tpwrpriv = container_of(work, struct pwrctrl_priv, rpwmtimeoutwi);\n\tdvobj = pwrctl_to_dvobj(pwrpriv);\n\tpadapter = dvobj->padapters[IFACE_ID0];\n//\tDBG_871X(\"+%s: rpwm=0x%02X cpwm=0x%02X\\n\", __func__, pwrpriv->rpwm, pwrpriv->cpwm);\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\tif ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2))\n\t{\n\t\tDBG_871X(\"%s: rpwm=0x%02X cpwm=0x%02X CPWM done!\\n\", __func__, pwrpriv->rpwm, pwrpriv->cpwm);\n\t\tgoto exit;\n\t}\n\t_exit_pwrlock(&pwrpriv->lock);\n\n\tif (rtw_read8(padapter, 0x100) != 0xEA)\n\t{\n#if 1\n\t\tstruct reportpwrstate_parm report;\n\n\t\treport.state = PS_STATE_S2;\n\t\tDBG_871X(\"\\n%s: FW already leave 32K!\\n\\n\", __func__);\n\t\tcpwm_int_hdl(padapter, &report);\n#else\n\t\tDBG_871X(\"\\n%s: FW already leave 32K!\\n\\n\", __func__);\n\t\tcpwm_event_callback(&pwrpriv->cpwm_event);\n#endif\n\t\treturn;\n\t}\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\n\tif ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2))\n\t{\n\t\tDBG_871X(\"%s: cpwm=%d, nothing to do!\\n\", __func__, pwrpriv->cpwm);\n\t\tgoto exit;\n\t}\n\tpwrpriv->brpwmtimeout = _TRUE;\n\trtw_set_rpwm(padapter, pwrpriv->rpwm);\n\tpwrpriv->brpwmtimeout = _FALSE;\n\nexit:\n\t_exit_pwrlock(&pwrpriv->lock);\n}\n\n/*\n * This function is a timer handler, can't do any IO in it.\n */\nstatic void pwr_rpwm_timeout_handler(void *FunctionContext)\n{\n\tPADAPTER padapter;\n\tstruct pwrctrl_priv *pwrpriv;\n\n\n\tpadapter = (PADAPTER)FunctionContext;\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\tDBG_871X(\"+%s: rpwm=0x%02X cpwm=0x%02X\\n\", __func__, pwrpriv->rpwm, pwrpriv->cpwm);\n\n\tif ((pwrpriv->rpwm == pwrpriv->cpwm) || (pwrpriv->cpwm >= PS_STATE_S2))\n\t{\n\t\tDBG_871X(\"+%s: cpwm=%d, nothing to do!\\n\", __func__, pwrpriv->cpwm);\n\t\treturn;\n\t}\n\n\t_set_workitem(&pwrpriv->rpwmtimeoutwi);\n}\n#endif // CONFIG_LPS_RPWM_TIMER\n\n__inline static void register_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag)\n{\n\tpwrctrl->alives |= tag;\n}\n\n__inline static void unregister_task_alive(struct pwrctrl_priv *pwrctrl, u32 tag)\n{\n\tpwrctrl->alives &= ~tag;\n}\n\n\n/*\n * Description:\n *\tCheck if the fw_pwrstate is okay for I/O.\n *\tIf not (cpwm is less than S2), then the sub-routine\n *\twill raise the cpwm to be greater than or equal to S2.\n *\n *\tCalling Context: Passive\n *\n *\tConstraint:\n *\t\t1. this function will request pwrctrl->lock\n * \n * Return Value:\n *\t_SUCCESS\thardware is ready for I/O\n *\t_FAIL\t\tcan't I/O right now\n */\ns32 rtw_register_task_alive(PADAPTER padapter, u32 task)\n{\n\ts32 res;\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tres = _SUCCESS;\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S2;\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tregister_task_alive(pwrctrl, task);\n\n\tif (pwrctrl->bFwCurrentInPSMode == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t\t (\"%s: task=0x%x cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  __FUNCTION__, task, pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm < pslv)\n\t\t{\n\t\t\tif (pwrctrl->cpwm < PS_STATE_S2)\n\t\t\t\tres = _FAIL;\n\t\t\tif (pwrctrl->rpwm < pslv)\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\tif (_FAIL == res)\n\t{\n\t\tif (pwrctrl->cpwm >= PS_STATE_S2)\n\t\t\tres = _SUCCESS;\n\t}\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\n_func_exit_;\n\n\treturn res;\t\n}\n\n/*\n * Description:\n *\tIf task is done, call this func. to power down firmware again.\n *\n *\tConstraint:\n *\t\t1. this function will request pwrctrl->lock\n *\n * Return Value:\n *\tnone\n */\nvoid rtw_unregister_task_alive(PADAPTER padapter, u32 task)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S0;\n\n#ifdef CONFIG_BT_COEXIST\n\tif ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE)\n\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _TRUE))\n\t{\n\t\tu8 val8;\n\n\t\tval8 = rtw_btcoex_LpsVal(padapter);\n\t\tif (val8 & BIT(4))\n\t\t\tpslv = PS_STATE_S2;\n\n\t}\n#endif // CONFIG_BT_COEXIST\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tunregister_task_alive(pwrctrl, task);\n\n\tif ((pwrctrl->pwr_mode != PS_MODE_ACTIVE)\n\t\t&& (pwrctrl->bFwCurrentInPSMode == _TRUE))\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t\t (\"%s: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm > pslv)\n\t\t{\n\t\t\tif ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0))\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n}\n\n/*\n * Caller: rtw_xmit_thread\n * \n * Check if the fw_pwrstate is okay for xmit.\n * If not (cpwm is less than S3), then the sub-routine\n * will raise the cpwm to be greater than or equal to S3. \n *\n * Calling Context: Passive\n * \n * Return Value:\n *\t _SUCCESS\trtw_xmit_thread can write fifo/txcmd afterwards.\n *\t _FAIL\t\trtw_xmit_thread can not do anything.\n */\ns32 rtw_register_tx_alive(PADAPTER padapter)\n{\n\ts32 res;\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tres = _SUCCESS;\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S2;\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tregister_task_alive(pwrctrl, XMIT_ALIVE);\n\n\tif (pwrctrl->bFwCurrentInPSMode == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t\t (\"rtw_register_tx_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm < pslv)\n\t\t{\n\t\t\tif (pwrctrl->cpwm < PS_STATE_S2)\n\t\t\t\tres = _FAIL;\n\t\t\tif (pwrctrl->rpwm < pslv)\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\tif (_FAIL == res)\n\t{\n\t\tif (pwrctrl->cpwm >= PS_STATE_S2)\n\t\t\tres = _SUCCESS;\n\t}\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\n_func_exit_;\n\n\treturn res;\t\n}\n\n/*\n * Caller: rtw_cmd_thread\n *\n * Check if the fw_pwrstate is okay for issuing cmd.\n * If not (cpwm should be is less than S2), then the sub-routine\n * will raise the cpwm to be greater than or equal to S2.\n *\n * Calling Context: Passive\n *\n * Return Value:\n *\t_SUCCESS\trtw_cmd_thread can issue cmds to firmware afterwards.\n *\t_FAIL\t\trtw_cmd_thread can not do anything.\n */\ns32 rtw_register_cmd_alive(PADAPTER padapter)\n{\n\ts32 res;\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tres = _SUCCESS;\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S2;\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tregister_task_alive(pwrctrl, CMD_ALIVE);\n\n\tif (pwrctrl->bFwCurrentInPSMode == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_info_,\n\t\t\t\t (\"rtw_register_cmd_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm < pslv)\n\t\t{\n\t\t\tif (pwrctrl->cpwm < PS_STATE_S2)\n\t\t\t\tres = _FAIL;\n\t\t\tif (pwrctrl->rpwm < pslv)\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n#ifdef CONFIG_DETECT_CPWM_BY_POLLING\n\tif (_FAIL == res)\n\t{\n\t\tif (pwrctrl->cpwm >= PS_STATE_S2)\n\t\t\tres = _SUCCESS;\n\t}\n#endif // CONFIG_DETECT_CPWM_BY_POLLING\n\n_func_exit_;\n\n\treturn res;\n}\n\n/*\n * Caller: rx_isr\n *\n * Calling Context: Dispatch/ISR\n *\n * Return Value:\n *\t_SUCCESS\n *\t_FAIL\n */\ns32 rtw_register_rx_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tregister_task_alive(pwrctrl, RECV_ALIVE);\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"rtw_register_rx_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\n/*\n * Caller: evt_isr or evt_thread\n *\n * Calling Context: Dispatch/ISR or Passive\n *\n * Return Value:\n *\t_SUCCESS\n *\t_FAIL\n */\ns32 rtw_register_evt_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tregister_task_alive(pwrctrl, EVT_ALIVE);\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"rtw_register_evt_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\n/*\n * Caller: ISR\n *\n * If ISR's txdone,\n * No more pkts for TX,\n * Then driver shall call this fun. to power down firmware again.\n */\nvoid rtw_unregister_tx_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S0;\n\n#ifdef CONFIG_BT_COEXIST\n\tif ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE)\n\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _TRUE))\n\t{\n\t\tu8 val8;\n\n\t\tval8 = rtw_btcoex_LpsVal(padapter);\n\t\tif (val8 & BIT(4))\n\t\t\tpslv = PS_STATE_S2;\n\n\t}\n#endif // CONFIG_BT_COEXIST\n\n#ifdef CONFIG_P2P_PS\n\tif(padapter->wdinfo.p2p_ps_mode > P2P_PS_NONE)\n\t{\n\t\tpslv = PS_STATE_S2;\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\telse if(rtw_buddy_adapter_up(padapter))\n\t{\n\t\tif(padapter->pbuddy_adapter->wdinfo.p2p_ps_mode > P2P_PS_NONE)\n\t\t\tpslv = PS_STATE_S2;\n\t}\n#endif\n#endif\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tunregister_task_alive(pwrctrl, XMIT_ALIVE);\n\n\tif ((pwrctrl->pwr_mode != PS_MODE_ACTIVE)\n\t\t&& (pwrctrl->bFwCurrentInPSMode == _TRUE))\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t\t (\"%s: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm > pslv)\n\t\t{\n\t\t\tif ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0))\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n}\n\n/*\n * Caller: ISR\n *\n * If all commands have been done,\n * and no more command to do,\n * then driver shall call this fun. to power down firmware again.\n */\nvoid rtw_unregister_cmd_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\tu8 pslv;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tpslv = PS_STATE_S0;\n\n#ifdef CONFIG_BT_COEXIST\n\tif ((rtw_btcoex_IsBtDisabled(padapter) == _FALSE)\n\t\t&& (rtw_btcoex_IsBtControlLps(padapter) == _TRUE))\n\t{\n\t\tu8 val8;\n\n\t\tval8 = rtw_btcoex_LpsVal(padapter);\n\t\tif (val8 & BIT(4))\n\t\t\tpslv = PS_STATE_S2;\n\n\t}\n#endif // CONFIG_BT_COEXIST\n\n#ifdef CONFIG_P2P_PS\n\tif(padapter->wdinfo.p2p_ps_mode > P2P_PS_NONE)\n\t{\n\t\tpslv = PS_STATE_S2;\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\telse if(rtw_buddy_adapter_up(padapter))\n\t{\n\t\tif(padapter->pbuddy_adapter->wdinfo.p2p_ps_mode > P2P_PS_NONE)\n\t\t\tpslv = PS_STATE_S2;\n\t}\n#endif\n#endif\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tunregister_task_alive(pwrctrl, CMD_ALIVE);\n\n\tif ((pwrctrl->pwr_mode != PS_MODE_ACTIVE)\n\t\t&& (pwrctrl->bFwCurrentInPSMode == _TRUE))\n\t{\n\t\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_info_,\n\t\t\t\t (\"%s: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t\t  __FUNCTION__, pwrctrl->cpwm, pwrctrl->alives));\n\n\t\tif (pwrctrl->cpwm > pslv)\n\t\t{\n\t\t\tif ((pslv >= PS_STATE_S2) || (pwrctrl->alives == 0))\n\t\t\t\trtw_set_rpwm(padapter, pslv);\n\t\t}\n\t}\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n}\n\n/*\n * Caller: ISR\n */\nvoid rtw_unregister_rx_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\n\t_enter_pwrlock(&pwrctrl->lock);\n\n\tunregister_task_alive(pwrctrl, RECV_ALIVE);\n\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"rtw_unregister_rx_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n}\n\nvoid rtw_unregister_evt_alive(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrl;\n\n_func_enter_;\n\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\n\tunregister_task_alive(pwrctrl, EVT_ALIVE);\n\n\tRT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,\n\t\t\t (\"rtw_unregister_evt_alive: cpwm=0x%02x alives=0x%08x\\n\",\n\t\t\t  pwrctrl->cpwm, pwrctrl->alives));\n\n\t_exit_pwrlock(&pwrctrl->lock);\n\n_func_exit_;\n}\n#endif\t/* CONFIG_LPS_LCLK */\n\n#ifdef CONFIG_RESUME_IN_WORKQUEUE\nstatic void resume_workitem_callback(struct work_struct *work);\n#endif //CONFIG_RESUME_IN_WORKQUEUE\n\nvoid rtw_init_pwrctrl_priv(PADAPTER padapter)\n{\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\tint i = 0;\n\tu8 val8 = 0;\n\n#if defined(CONFIG_CONCURRENT_MODE)\n\tif (padapter->adapter_type != PRIMARY_ADAPTER)\n\t\treturn;\n#endif\n\n_func_enter_;\n\n#ifdef PLATFORM_WINDOWS\n\tpwrctrlpriv->pnp_current_pwr_state=NdisDeviceStateD0;\n#endif\n\n\t_init_pwrlock(&pwrctrlpriv->lock);\n\t_init_pwrlock(&pwrctrlpriv->check_32k_lock);\n\tpwrctrlpriv->rf_pwrstate = rf_on;\n\tpwrctrlpriv->ips_enter_cnts=0;\n\tpwrctrlpriv->ips_leave_cnts=0;\n\tpwrctrlpriv->lps_enter_cnts=0;\n\tpwrctrlpriv->lps_leave_cnts=0;\n\tpwrctrlpriv->bips_processing = _FALSE;\n\n\tpwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode;\n\tpwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode;\n\n\tpwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL;\n\tpwrctrlpriv->pwr_state_check_cnts = 0;\n\tpwrctrlpriv->bInternalAutoSuspend = _FALSE;\n\tpwrctrlpriv->bInSuspend = _FALSE;\n\tpwrctrlpriv->bkeepfwalive = _FALSE;\n\n#ifdef CONFIG_AUTOSUSPEND\n#ifdef SUPPORT_HW_RFOFF_DETECTED\n\tpwrctrlpriv->pwr_state_check_interval = (pwrctrlpriv->bHWPwrPindetect) ?1000:2000;\t\t\n#endif\n#endif\n\n\tpwrctrlpriv->LpsIdleCount = 0;\n\t//pwrctrlpriv->FWCtrlPSMode =padapter->registrypriv.power_mgnt;// PS_MODE_MIN;\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\tpwrctrlpriv->power_mgnt =PS_MODE_ACTIVE ;\n\telse\t\n\t\tpwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;// PS_MODE_MIN;\n\tpwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE;\n\n\tpwrctrlpriv->bFwCurrentInPSMode = _FALSE;\n\n\tpwrctrlpriv->rpwm = 0;\n\tpwrctrlpriv->cpwm = PS_STATE_S4;\n\n\tpwrctrlpriv->pwr_mode = PS_MODE_ACTIVE;\n\tpwrctrlpriv->smart_ps = padapter->registrypriv.smart_ps;\n\tpwrctrlpriv->bcn_ant_mode = 0;\n\tpwrctrlpriv->dtim = 0;\n\n\tpwrctrlpriv->tog = 0x80;\n\n#ifdef CONFIG_LPS_LCLK\n\trtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&pwrctrlpriv->rpwm));\n\n\t_init_workitem(&pwrctrlpriv->cpwm_event, cpwm_event_callback, NULL);\n\n#ifdef CONFIG_LPS_RPWM_TIMER\n\tpwrctrlpriv->brpwmtimeout = _FALSE;\n\t_init_workitem(&pwrctrlpriv->rpwmtimeoutwi, rpwmtimeout_workitem_callback, NULL);\n\t_init_timer(&pwrctrlpriv->pwr_rpwm_timer, padapter->pnetdev, pwr_rpwm_timeout_handler, padapter);\n#endif // CONFIG_LPS_RPWM_TIMER\n#endif // CONFIG_LPS_LCLK\n\n\trtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler);\n\n\tpwrctrlpriv->wowlan_mode = _FALSE;\n\tpwrctrlpriv->wowlan_ap_mode = _FALSE;\n\tpwrctrlpriv->wowlan_p2p_mode = _FALSE;\n\n\t#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\t_init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL);\n\tpwrctrlpriv->rtw_workqueue = create_singlethread_workqueue(\"rtw_workqueue\");\n\t#endif //CONFIG_RESUME_IN_WORKQUEUE\n\n\t#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)\n\tpwrctrlpriv->early_suspend.suspend = NULL;\n\trtw_register_early_suspend(pwrctrlpriv);\n\t#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER\n\n#ifdef CONFIG_GPIO_WAKEUP\n\t/*default low active*/\n\tpwrctrlpriv->is_high_active = HIGH_ACTIVE;\n\tval8 = (pwrctrlpriv->is_high_active == 0) ? 1 : 0;\n\trtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8);\n\tDBG_871X(\"%s: set GPIO_%d %d as default.\\n\",\n\t\t __func__, WAKEUP_GPIO_IDX, val8);\n#endif /* CONFIG_GPIO_WAKEUP */\n\n#ifdef CONFIG_WOWLAN\n\tpwrctrlpriv->wowlan_pattern_idx = 0;\n\tfor (i = 0 ; i < MAX_WKFM_NUM; i++) {\n\t\t_rtw_memset(pwrctrlpriv->patterns[i].content, '\\0',\n\t\t\t\tsizeof(pwrctrlpriv->patterns[i].content));\n\t\t_rtw_memset(pwrctrlpriv->patterns[i].mask, '\\0',\n\t\t\t\tsizeof(pwrctrlpriv->patterns[i].mask));\n\t\tpwrctrlpriv->patterns[i].len = 0;\n\t}\n\n#ifdef CONFIG_PNO_SUPPORT\n\tpwrctrlpriv->pno_inited = _FALSE;\n\tpwrctrlpriv->pnlo_info = NULL;\n\tpwrctrlpriv->pscan_info = NULL;\n\tpwrctrlpriv->pno_ssid_list = NULL;\n\tpwrctrlpriv->pno_in_resume = _TRUE;\n#endif /* CONFIG_PNO_SUPPORT */\n#endif /* CONFIG_WOWLAN */\n\n_func_exit_;\n\n}\n\n\nvoid rtw_free_pwrctrl_priv(PADAPTER adapter)\n{\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(adapter);\n\n#if defined(CONFIG_CONCURRENT_MODE)\n\tif (adapter->adapter_type != PRIMARY_ADAPTER)\n\t\treturn;\n#endif\t\n\n_func_enter_;\n\n\t//_rtw_memset((unsigned char *)pwrctrlpriv, 0, sizeof(struct pwrctrl_priv));\n\n\n\t#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\tif (pwrctrlpriv->rtw_workqueue) { \n\t\tflush_workqueue(pwrctrlpriv->rtw_workqueue);\n\t\tdestroy_workqueue(pwrctrlpriv->rtw_workqueue);\n\t}\n\t#endif\n\n#ifdef CONFIG_WOWLAN\n#ifdef CONFIG_PNO_SUPPORT\n\tif (pwrctrlpriv->pnlo_info != NULL)\n\t\tprintk(\"****** pnlo_info memory leak********\\n\");\n\n\tif (pwrctrlpriv->pscan_info != NULL)\n\t\tprintk(\"****** pscan_info memory leak********\\n\");\n\n\tif (pwrctrlpriv->pno_ssid_list != NULL)\n\t\tprintk(\"****** pno_ssid_list memory leak********\\n\");\n#endif\n#endif /* CONFIG_WOWLAN */\n\n\t#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)\n\trtw_unregister_early_suspend(pwrctrlpriv);\n\t#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER\n\n\t_free_pwrlock(&pwrctrlpriv->lock);\n\t_free_pwrlock(&pwrctrlpriv->check_32k_lock);\n\n_func_exit_;\n}\n\n#ifdef CONFIG_RESUME_IN_WORKQUEUE\nextern int rtw_resume_process(_adapter *padapter);\n\nstatic void resume_workitem_callback(struct work_struct *work)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(work, struct pwrctrl_priv, resume_work);\n\tstruct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv);\n\t_adapter *adapter = dvobj->padapters[IFACE_ID0];\n\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\n\trtw_resume_process(adapter);\n\n\trtw_resume_unlock_suspend();\n}\n\nvoid rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv)\n{\n\t// accquire system's suspend lock preventing from falliing asleep while resume in workqueue\n\t//rtw_lock_suspend();\n\n\trtw_resume_lock_suspend();\n\t\n\t#if 1\n\tqueue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work);\t\n\t#else\n\t_set_workitem(&pwrpriv->resume_work);\n\t#endif\n}\n#endif //CONFIG_RESUME_IN_WORKQUEUE\n\n#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)\ninline bool rtw_is_earlysuspend_registered(struct pwrctrl_priv *pwrpriv)\n{\n\treturn (pwrpriv->early_suspend.suspend) ? _TRUE : _FALSE;\n}\n\ninline bool rtw_is_do_late_resume(struct pwrctrl_priv *pwrpriv)\n{\n\treturn (pwrpriv->do_late_resume) ? _TRUE : _FALSE;\n}\n\ninline void rtw_set_do_late_resume(struct pwrctrl_priv *pwrpriv, bool enable)\n{\n\tpwrpriv->do_late_resume = enable;\n}\n#endif\n\n#ifdef CONFIG_HAS_EARLYSUSPEND\nextern int rtw_resume_process(_adapter *padapter);\nstatic void rtw_early_suspend(struct early_suspend *h)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\n\trtw_set_do_late_resume(pwrpriv, _FALSE);\n}\n\nstatic void rtw_late_resume(struct early_suspend *h)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);\n\tstruct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv);\n\t_adapter *adapter = dvobj->padapters[IFACE_ID0];\n\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\n\tif(pwrpriv->do_late_resume) {\n\t\trtw_set_do_late_resume(pwrpriv, _FALSE);\n\t\trtw_resume_process(adapter);\n\t}\n}\n\nvoid rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t//jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit\n\tpwrpriv->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20;\n\tpwrpriv->early_suspend.suspend = rtw_early_suspend;\n\tpwrpriv->early_suspend.resume = rtw_late_resume;\n\tregister_early_suspend(&pwrpriv->early_suspend);\t\n\n\t\n}\n\nvoid rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\trtw_set_do_late_resume(pwrpriv, _FALSE);\n\n\tif (pwrpriv->early_suspend.suspend) \n\t\tunregister_early_suspend(&pwrpriv->early_suspend);\n\n\tpwrpriv->early_suspend.suspend = NULL;\n\tpwrpriv->early_suspend.resume = NULL;\n}\n#endif //CONFIG_HAS_EARLYSUSPEND\n\n#ifdef CONFIG_ANDROID_POWER\n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\nextern int rtw_resume_process(PADAPTER padapter);\n#endif\nstatic void rtw_early_suspend(android_early_suspend_t *h)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\n\trtw_set_do_late_resume(pwrpriv, _FALSE);\n}\n\nstatic void rtw_late_resume(android_early_suspend_t *h)\n{\n\tstruct pwrctrl_priv *pwrpriv = container_of(h, struct pwrctrl_priv, early_suspend);\n\tstruct dvobj_priv *dvobj = pwrctl_to_dvobj(pwrpriv);\n\t_adapter *adapter = dvobj->padapters[IFACE_ID0];\n\n\tDBG_871X(\"%s\\n\",__FUNCTION__);\n\tif(pwrpriv->do_late_resume) {\n\t\t#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\trtw_set_do_late_resume(pwrpriv, _FALSE);\n\t\trtw_resume_process(adapter);\n\t\t#endif\n\t}\n}\n\nvoid rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t//jeff: set the early suspend level before blank screen, so we wll do late resume after scree is lit\n\tpwrpriv->early_suspend.level = ANDROID_EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 20;\n\tpwrpriv->early_suspend.suspend = rtw_early_suspend;\n\tpwrpriv->early_suspend.resume = rtw_late_resume;\n\tandroid_register_early_suspend(&pwrpriv->early_suspend);\t\n}\n\nvoid rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\trtw_set_do_late_resume(pwrpriv, _FALSE);\n\n\tif (pwrpriv->early_suspend.suspend) \n\t\tandroid_unregister_early_suspend(&pwrpriv->early_suspend);\n\n\tpwrpriv->early_suspend.suspend = NULL;\n\tpwrpriv->early_suspend.resume = NULL;\n}\n#endif //CONFIG_ANDROID_POWER\n\nu8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val)\n{\n\tu8 bResult = _TRUE;\n\trtw_hal_intf_ps_func(padapter,efunc_id,val);\n\t\n\treturn bResult;\n}\n\n\ninline void rtw_set_ips_deny(_adapter *padapter, u32 ms)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tpwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ms);\n}\n\n/*\n* rtw_pwr_wakeup - Wake the NIC up from: 1)IPS. 2)USB autosuspend\n* @adapter: pointer to _adapter structure\n* @ips_deffer_ms: the ms wiil prevent from falling into IPS after wakeup\n* Return _SUCCESS or _FAIL\n*/\n\nint _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);\n\tstruct mlme_priv *pmlmepriv;\n\tint ret = _SUCCESS;\n\tint i;\n\tu32 start = rtw_get_current_time();\n\n\t/* for LPS */\n\tLeaveAllPowerSaveMode(padapter);\n\n\t/* IPS still bound with primary adapter */\n\tpadapter = GET_PRIMARY_ADAPTER(padapter);\n\tpmlmepriv = &padapter->mlmepriv;\n\n\tif (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))\n\t\tpwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);\n\n\n\tif (pwrpriv->ps_processing) {\n\t\tDBG_871X(\"%s wait ps_processing...\\n\", __func__);\n\t\twhile (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000)\n\t\t\trtw_msleep_os(10);\n\t\tif (pwrpriv->ps_processing)\n\t\t\tDBG_871X(\"%s wait ps_processing timeout\\n\", __func__);\n\t\telse\n\t\t\tDBG_871X(\"%s wait ps_processing done\\n\", __func__);\n\t}\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tif (rtw_hal_sreset_inprogress(padapter)) {\n\t\tDBG_871X(\"%s wait sreset_inprogress...\\n\", __func__);\n\t\twhile (rtw_hal_sreset_inprogress(padapter) && rtw_get_passing_time_ms(start) <= 4000)\n\t\t\trtw_msleep_os(10);\n\t\tif (rtw_hal_sreset_inprogress(padapter))\n\t\t\tDBG_871X(\"%s wait sreset_inprogress timeout\\n\", __func__);\n\t\telse\n\t\t\tDBG_871X(\"%s wait sreset_inprogress done\\n\", __func__);\n\t}\n#endif\n\n\tif (pwrpriv->bInternalAutoSuspend == _FALSE && pwrpriv->bInSuspend) {\n\t\tDBG_871X(\"%s wait bInSuspend...\\n\", __func__);\n\t\twhile (pwrpriv->bInSuspend \n\t\t\t&& ((rtw_get_passing_time_ms(start) <= 3000 && !rtw_is_do_late_resume(pwrpriv))\n\t\t\t\t|| (rtw_get_passing_time_ms(start) <= 500 && rtw_is_do_late_resume(pwrpriv)))\n\t\t) {\n\t\t\trtw_msleep_os(10);\n\t\t}\n\t\tif (pwrpriv->bInSuspend)\n\t\t\tDBG_871X(\"%s wait bInSuspend timeout\\n\", __func__);\n\t\telse\n\t\t\tDBG_871X(\"%s wait bInSuspend done\\n\", __func__);\n\t}\n\n\t//System suspend is not allowed to wakeup\n\tif((pwrpriv->bInternalAutoSuspend == _FALSE) && (_TRUE == pwrpriv->bInSuspend )){\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t//block???\n\tif((pwrpriv->bInternalAutoSuspend == _TRUE)  && (padapter->net_closed == _TRUE)) {\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t//I think this should be check in IPS, LPS, autosuspend functions...\n\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t{\n#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\tif(_TRUE==pwrpriv->bInternalAutoSuspend){\n\t\t\tif(0==pwrpriv->autopm_cnt){\n\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\t\t\t\t\n\t\t\t\tif (usb_autopm_get_interface(adapter_to_dvobj(padapter)->pusbintf) < 0) \n\t\t\t\t{\n\t\t\t\t\tDBG_871X( \"can't get autopm: \\n\");\n\t\t\t\t}\t\t\t\n\t\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\t\t\t\t\n\t\t\t\tusb_autopm_disable(adapter_to_dvobj(padapter)->pusbintf);\n\t\t\t#else\n\t\t\t\tusb_autoresume_device(adapter_to_dvobj(padapter)->pusbdev, 1);\n\t\t\t#endif\n\t\t\tpwrpriv->autopm_cnt++;\n\t\t\t}\n#endif\t//#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\tret = _SUCCESS;\n\t\tgoto exit;\n#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t\t}\n#endif\t//#if defined (CONFIG_BT_COEXIST)&& defined (CONFIG_AUTOSUSPEND)\n\t}\t\n\n\tif(rf_off == pwrpriv->rf_pwrstate )\n\t{\t\t\n#ifdef CONFIG_USB_HCI\n#ifdef CONFIG_AUTOSUSPEND\n\t\t if(pwrpriv->brfoffbyhw==_TRUE)\n\t\t{\n\t\t\tDBG_8192C(\"hw still in rf_off state ...........\\n\");\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\telse if(padapter->registrypriv.usbss_enable)\n\t\t{\n\t\t\tDBG_8192C(\"%s call autoresume_enter....\\n\",__FUNCTION__);\n\t\t\tif(_FAIL ==  autoresume_enter(padapter))\n\t\t\t{\n\t\t\t\tDBG_8192C(\"======> autoresume fail.............\\n\");\n\t\t\t\tret = _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\t\n\t\t}\n\t\telse\n#endif\n#endif\n\t\t{\n#ifdef CONFIG_IPS\n\t\t\tDBG_8192C(\"%s call ips_leave....\\n\",__FUNCTION__);\n\t\t\tif(_FAIL ==  ips_leave(padapter))\n\t\t\t{\n\t\t\t\tDBG_8192C(\"======> ips_leave fail.............\\n\");\n\t\t\t\tret = _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n#endif\n\t\t}\n\t}\n\n\t//TODO: the following checking need to be merged...\n\tif (rtw_is_drv_stopped(padapter)\n\t\t|| !padapter->bup\n\t\t|| !rtw_is_hw_init_completed(padapter)\n\t) {\n\t\tDBG_8192C(\"%s: bDriverStopped=%s, bup=%d, hw_init_completed=%u\\n\"\n\t\t\t, caller\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, padapter->bup\n\t\t\t, rtw_get_hw_init_completed(padapter));\n\t\tret= _FALSE;\n\t\tgoto exit;\n\t}\n\nexit:\n\tif (pwrpriv->ips_deny_time < rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms))\n\t\tpwrpriv->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(ips_deffer_ms);\n\treturn ret;\n\n}\n\nint rtw_pm_set_lps(_adapter *padapter, u8 mode)\n{\n\tint\tret = 0;\t\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\t\n\tif ( mode < PS_MODE_NUM )\n\t{\n\t\tif(pwrctrlpriv->power_mgnt !=mode)\n\t\t{\n\t\t\tif(PS_MODE_ACTIVE == mode)\n\t\t\t{\n\t\t\t\tLeaveAllPowerSaveMode(padapter);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpwrctrlpriv->LpsIdleCount = 2;\n\t\t\t}\n\t\t\tpwrctrlpriv->power_mgnt = mode;\n\t\t\tpwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?_TRUE:_FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tret = -EINVAL;\n\t}\n\n\treturn ret;\n}\n\nint rtw_pm_set_ips(_adapter *padapter, u8 mode)\n{\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\tif( mode == IPS_NORMAL || mode == IPS_LEVEL_2 ) {\n\t\trtw_ips_mode_req(pwrctrlpriv, mode);\n\t\tDBG_871X(\"%s %s\\n\", __FUNCTION__, mode == IPS_NORMAL?\"IPS_NORMAL\":\"IPS_LEVEL_2\");\n\t\treturn 0;\n\t} \n\telse if(mode ==IPS_NONE){\n\t\trtw_ips_mode_req(pwrctrlpriv, mode);\n\t\tDBG_871X(\"%s %s\\n\", __FUNCTION__, \"IPS_NONE\");\n\t\tif (!rtw_is_surprise_removed(padapter) && (_FAIL == rtw_pwr_wakeup(padapter)))\n\t\t\treturn -EFAULT;\n\t}\n\telse {\n\t\treturn -EINVAL;\n\t}\n\treturn 0;\n}\n\n/*\n * ATTENTION:\n *\tThis function will request pwrctrl LOCK!\n */\nvoid rtw_ps_deny(PADAPTER padapter, PS_DENY_REASON reason)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\ts32 ret;\n\n\n//\tDBG_871X(\"+\" FUNC_ADPT_FMT \": Request PS deny for %d (0x%08X)\\n\",\n//\t\tFUNC_ADPT_ARG(padapter), reason, BIT(reason));\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\tif (pwrpriv->ps_deny & BIT(reason))\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": [WARNING] Reason %d had been set before!!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), reason);\n\t}\n\tpwrpriv->ps_deny |= BIT(reason);\n\t_exit_pwrlock(&pwrpriv->lock);\n\n//\tDBG_871X(\"-\" FUNC_ADPT_FMT \": Now PS deny for 0x%08X\\n\",\n//\t\tFUNC_ADPT_ARG(padapter), pwrpriv->ps_deny);\n}\n\n/*\n * ATTENTION:\n *\tThis function will request pwrctrl LOCK!\n */\nvoid rtw_ps_deny_cancel(PADAPTER padapter, PS_DENY_REASON reason)\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\n\n//\tDBG_871X(\"+\" FUNC_ADPT_FMT \": Cancel PS deny for %d(0x%08X)\\n\",\n//\t\tFUNC_ADPT_ARG(padapter), reason, BIT(reason));\n\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\t_enter_pwrlock(&pwrpriv->lock);\n\tif ((pwrpriv->ps_deny & BIT(reason)) == 0)\n\t{\n\t\tDBG_871X(FUNC_ADPT_FMT \": [ERROR] Reason %d had been canceled before!!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), reason);\n\t}\n\tpwrpriv->ps_deny &= ~BIT(reason);\n\t_exit_pwrlock(&pwrpriv->lock);\n\n//\tDBG_871X(\"-\" FUNC_ADPT_FMT \": Now PS deny for 0x%08X\\n\",\n//\t\tFUNC_ADPT_ARG(padapter), pwrpriv->ps_deny);\n}\n\n/*\n * ATTENTION:\n *\tBefore calling this function pwrctrl lock should be occupied already,\n *\totherwise it may return incorrect value.\n */\nu32 rtw_ps_deny_get(PADAPTER padapter)\n{\n\tu32 deny;\n\n\n\tdeny = adapter_to_pwrctl(padapter)->ps_deny;\n\n\treturn deny;\n}\n\n"
  },
  {
    "path": "core/rtw_recv.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_RECV_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n\n#error \"Shall be Linux or Windows, but not both!\\n\"\n\n#endif\n\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\nvoid rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS);\n\nenum {\n\tSIGNAL_STAT_CALC_PROFILE_0 = 0,\n\tSIGNAL_STAT_CALC_PROFILE_1,\n\tSIGNAL_STAT_CALC_PROFILE_MAX\n};\n\nu8 signal_stat_calc_profile[SIGNAL_STAT_CALC_PROFILE_MAX][2] = {\n\t{4, 1},\t/* Profile 0 => pre_stat : curr_stat = 4 : 1 */\n\t{3, 7}\t/* Profile 1 => pre_stat : curr_stat = 3 : 7 */\n};\n\n#ifndef RTW_SIGNAL_STATE_CALC_PROFILE\t\n#define RTW_SIGNAL_STATE_CALC_PROFILE SIGNAL_STAT_CALC_PROFILE_1\n#endif\n\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\nvoid _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv)\n{\n\n\n_func_enter_;\n\n\t_rtw_memset((u8 *)psta_recvpriv, 0, sizeof (struct sta_recv_priv));\n\n\t_rtw_spinlock_init(&psta_recvpriv->lock);\n\n\t//for(i=0; i<MAX_RX_NUMBLKS; i++)\n\t//\t_rtw_init_queue(&psta_recvpriv->blk_strms[i]);\n\n\t_rtw_init_queue(&psta_recvpriv->defrag_q);\n\n_func_exit_;\n\n}\n\nsint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter)\n{\n\tsint i;\n\n\tunion recv_frame *precvframe;\n\n\tsint\tres=_SUCCESS;\n\n_func_enter_;\n\n\t// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().\n\t//_rtw_memset((unsigned char *)precvpriv, 0, sizeof (struct  recv_priv));\n\n\t_rtw_spinlock_init(&precvpriv->lock);\n\n\t_rtw_init_queue(&precvpriv->free_recv_queue);\n\t_rtw_init_queue(&precvpriv->recv_pending_queue);\n\t_rtw_init_queue(&precvpriv->uc_swdec_pending_queue);\n\n\tprecvpriv->adapter = padapter;\n\n\tprecvpriv->free_recvframe_cnt = NR_RECVFRAME;\n\n\tprecvpriv->sink_udpport = 0;\n\tprecvpriv->pre_rtp_rxseq = 0;\n\tprecvpriv->cur_rtp_rxseq = 0;\n\n#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA\n\tprecvpriv->store_law_data_flag = 1;\n#else\n\tprecvpriv->store_law_data_flag = 0;\n#endif\n\n\trtw_os_recv_resource_init(precvpriv, padapter);\n\n\tprecvpriv->pallocated_frame_buf = rtw_zvmalloc(NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);\n\t\n\tif(precvpriv->pallocated_frame_buf==NULL){\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\t//_rtw_memset(precvpriv->pallocated_frame_buf, 0, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);\n\n\tprecvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ);\n\t//precvpriv->precv_frame_buf = precvpriv->pallocated_frame_buf + RXFRAME_ALIGN_SZ -\n\t//\t\t\t\t\t\t((SIZE_PTR) (precvpriv->pallocated_frame_buf) &(RXFRAME_ALIGN_SZ-1));\n\n\tprecvframe = (union recv_frame*) precvpriv->precv_frame_buf;\n\n\n\tfor(i=0; i < NR_RECVFRAME ; i++)\n\t{\n\t\t_rtw_init_listhead(&(precvframe->u.list));\n\n\t\trtw_list_insert_tail(&(precvframe->u.list), &(precvpriv->free_recv_queue.queue));\n\n\t\tres = rtw_os_recv_resource_alloc(padapter, precvframe);\n\n\t\tprecvframe->u.hdr.len = 0;\n\n\t\tprecvframe->u.hdr.adapter =padapter;\n\t\tprecvframe++;\n\n\t}\n\n#ifdef CONFIG_USB_HCI\n\n\tATOMIC_SET(&(precvpriv->rx_pending_cnt), 1);\n\n\t_rtw_init_sema(&precvpriv->allrxreturnevt, 0);\n\n#endif\n\n\tres = rtw_hal_init_recv_priv(padapter);\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\trtw_init_timer(&precvpriv->signal_stat_timer, padapter, RTW_TIMER_HDL_NAME(signal_stat));\n\n\tprecvpriv->signal_stat_sampling_interval = 2000; //ms\n\t//precvpriv->signal_stat_converging_constant = 5000; //ms\n\n\trtw_set_signal_stat_timer(precvpriv);\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n\n}\n\nvoid rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv);\nvoid rtw_mfree_recv_priv_lock(struct recv_priv *precvpriv)\n{\n\t_rtw_spinlock_free(&precvpriv->lock);\n#ifdef CONFIG_RECV_THREAD_MODE\t\n\t_rtw_free_sema(&precvpriv->recv_sema);\n\t_rtw_free_sema(&precvpriv->terminate_recvthread_sema);\n#endif\n\n\t_rtw_spinlock_free(&precvpriv->free_recv_queue.lock);\n\t_rtw_spinlock_free(&precvpriv->recv_pending_queue.lock);\n\n\t_rtw_spinlock_free(&precvpriv->free_recv_buf_queue.lock);\n\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t_rtw_spinlock_free(&precvpriv->recv_buf_pending_queue.lock);\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_RX\n}\n\nvoid _rtw_free_recv_priv (struct recv_priv *precvpriv)\n{\n\t_adapter\t*padapter = precvpriv->adapter;\n\n_func_enter_;\n\n\trtw_free_uc_swdec_pending_queue(padapter);\n\n\trtw_mfree_recv_priv_lock(precvpriv);\n\n\trtw_os_recv_resource_free(precvpriv);\n\n\tif(precvpriv->pallocated_frame_buf) {\n\t\trtw_vmfree(precvpriv->pallocated_frame_buf, NR_RECVFRAME * sizeof(union recv_frame) + RXFRAME_ALIGN_SZ);\n\t}\n\n\trtw_hal_free_recv_priv(padapter);\n\n_func_exit_;\n\n}\n\nunion recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue)\n{\n\n\tunion recv_frame  *precvframe;\n\t_list\t*plist, *phead;\n\t_adapter *padapter;\n\tstruct recv_priv *precvpriv;\n_func_enter_;\n\n\tif(_rtw_queue_empty(pfree_recv_queue) == _TRUE)\n\t{\n\t\tprecvframe = NULL;\n\t}\n\telse\n\t{\n\t\tphead = get_list_head(pfree_recv_queue);\n\n\t\tplist = get_next(phead);\n\n\t\tprecvframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\n\t\trtw_list_delete(&precvframe->u.hdr.list);\n\t\tpadapter=precvframe->u.hdr.adapter;\n\t\tif(padapter !=NULL){\n\t\t\tprecvpriv=&padapter->recvpriv;\n\t\t\tif(pfree_recv_queue == &precvpriv->free_recv_queue)\n\t\t\t\tprecvpriv->free_recvframe_cnt--;\n\t\t}\n\t}\n\n_func_exit_;\n\n\treturn precvframe;\n\n}\n\nunion recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue)\n{\n\t_irqL irqL;\n\tunion recv_frame  *precvframe;\n\t\n\t_enter_critical_bh(&pfree_recv_queue->lock, &irqL);\n\n\tprecvframe = _rtw_alloc_recvframe(pfree_recv_queue);\n\n\t_exit_critical_bh(&pfree_recv_queue->lock, &irqL);\n\n\treturn precvframe;\n}\n\nvoid rtw_init_recvframe(union recv_frame *precvframe, struct recv_priv *precvpriv)\n{\n\t/* Perry: This can be removed */\n\t_rtw_init_listhead(&precvframe->u.hdr.list);\n\n\tprecvframe->u.hdr.len=0;\n}\n\nint rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue)\n{\n\t_irqL irqL;\n\t_adapter *padapter=precvframe->u.hdr.adapter;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\n_func_enter_;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->adapter_type > PRIMARY_ADAPTER)\n\t{\n\t\tpadapter = padapter->pbuddy_adapter;//get primary_padapter\n\t\tprecvpriv = &padapter->recvpriv;\n\t\tpfree_recv_queue = &precvpriv->free_recv_queue;\n\t\tprecvframe->u.hdr.adapter = padapter;\t\t\n\t}\t\n#endif\n\n\trtw_os_free_recvframe(precvframe);\n\n\n\t_enter_critical_bh(&pfree_recv_queue->lock, &irqL);\n\n\trtw_list_delete(&(precvframe->u.hdr.list));\n\n\tprecvframe->u.hdr.len = 0;\n\n\trtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(pfree_recv_queue));\n\n\tif(padapter !=NULL){\n\t\tif(pfree_recv_queue == &precvpriv->free_recv_queue)\n\t\t\t\tprecvpriv->free_recvframe_cnt++;\n\t}\n\n      _exit_critical_bh(&pfree_recv_queue->lock, &irqL);\n\n_func_exit_;\n\n\treturn _SUCCESS;\n\n}\n\n\n\n\nsint _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)\n{\n\n\t_adapter *padapter=precvframe->u.hdr.adapter;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\n_func_enter_;\n\n\t//_rtw_init_listhead(&(precvframe->u.hdr.list));\n\trtw_list_delete(&(precvframe->u.hdr.list));\n\n\n\trtw_list_insert_tail(&(precvframe->u.hdr.list), get_list_head(queue));\n\n\tif (padapter != NULL) {\n\t\tif (queue == &precvpriv->free_recv_queue)\n\t\t\tprecvpriv->free_recvframe_cnt++;\n\t}\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\nsint rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)\n{\n\tsint ret;\n\t_irqL irqL;\n\t\n\t//_spinlock(&pfree_recv_queue->lock);\n\t_enter_critical_bh(&queue->lock, &irqL);\n\tret = _rtw_enqueue_recvframe(precvframe, queue);\n\t//_rtw_spinunlock(&pfree_recv_queue->lock);\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n\treturn ret;\n}\n\n/*\nsint\trtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue)\n{\n\treturn rtw_free_recvframe(precvframe, queue);\n}\n*/\n\n\n\n\n/*\ncaller : defrag ; recvframe_chk_defrag in recv_thread  (passive)\npframequeue: defrag_queue : will be accessed in recv_thread  (passive)\n\nusing spinlock to protect\n\n*/\n\nvoid rtw_free_recvframe_queue(_queue *pframequeue,  _queue *pfree_recv_queue)\n{\n\tunion\trecv_frame \t*precvframe;\n\t_list\t*plist, *phead;\n\n_func_enter_;\n\t_rtw_spinlock(&pframequeue->lock);\n\n\tphead = get_list_head(pframequeue);\n\tplist = get_next(phead);\n\n\twhile(rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\n\t\tprecvframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\n\t\tplist = get_next(plist);\n\n\t\t//rtw_list_delete(&precvframe->u.hdr.list); // will do this in rtw_free_recvframe()\n\n\t\trtw_free_recvframe(precvframe, pfree_recv_queue);\n\t}\n\n\t_rtw_spinunlock(&pframequeue->lock);\n\n_func_exit_;\n\n}\n\nu32 rtw_free_uc_swdec_pending_queue(_adapter *adapter)\n{\n\tu32 cnt = 0;\n\tunion recv_frame *pending_frame;\n\twhile((pending_frame=rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) {\n\t\trtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue);\n\t\tcnt++;\n\t}\n\n\tif (cnt)\n\t\tDBG_871X(FUNC_ADPT_FMT\" dequeue %d\\n\", FUNC_ADPT_ARG(adapter), cnt);\n\n\treturn cnt;\n}\n\n\nsint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue)\n{\n\t_irqL irqL;\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\trtw_list_delete(&precvbuf->list);\n\trtw_list_insert_head(&precvbuf->list, get_list_head(queue));\n\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n\treturn _SUCCESS;\n}\n\nsint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue)\n{\n\t_irqL irqL;\t\n#ifdef CONFIG_SDIO_HCI\n\t_enter_critical_bh(&queue->lock, &irqL);\n#else\n\t_enter_critical_ex(&queue->lock, &irqL);\n#endif/*#ifdef  CONFIG_SDIO_HCI*/\n\n\trtw_list_delete(&precvbuf->list);\n\n\trtw_list_insert_tail(&precvbuf->list, get_list_head(queue));\n#ifdef CONFIG_SDIO_HCI\t\n\t_exit_critical_bh(&queue->lock, &irqL);\n#else\n\t_exit_critical_ex(&queue->lock, &irqL);\n#endif/*#ifdef  CONFIG_SDIO_HCI*/\n\treturn _SUCCESS;\n\t\n}\n\nstruct recv_buf *rtw_dequeue_recvbuf (_queue *queue)\n{\n\t_irqL irqL;\n\tstruct recv_buf *precvbuf;\n\t_list\t*plist, *phead;\t\n\n#ifdef CONFIG_SDIO_HCI\n\t_enter_critical_bh(&queue->lock, &irqL);\n#else\n\t_enter_critical_ex(&queue->lock, &irqL);\n#endif/*#ifdef  CONFIG_SDIO_HCI*/\n\t\n\tif(_rtw_queue_empty(queue) == _TRUE)\n\t{\n\t\tprecvbuf = NULL;\n\t}\n\telse\n\t{\n\t\tphead = get_list_head(queue);\n\n\t\tplist = get_next(phead);\n\n\t\tprecvbuf = LIST_CONTAINOR(plist, struct recv_buf, list);\n\n\t\trtw_list_delete(&precvbuf->list);\n\t\t\n\t}\n\n#ifdef CONFIG_SDIO_HCI\n\t_exit_critical_bh(&queue->lock, &irqL);\n#else\n\t_exit_critical_ex(&queue->lock, &irqL);\n#endif/*#ifdef  CONFIG_SDIO_HCI*/\n\n\treturn precvbuf;\n\n}\n\nsint recvframe_chkmic(_adapter *adapter,  union recv_frame *precvframe);\nsint recvframe_chkmic(_adapter *adapter,  union recv_frame *precvframe){\n\n\tsint\ti,res=_SUCCESS;\n\tu32\tdatalen;\n\tu8\tmiccode[8];\n\tu8\tbmic_err=_FALSE,brpt_micerror = _TRUE;\n\tu8\t*pframe, *payload,*pframemic;\n\tu8\t*mickey;\n\t//u8\t*iv,rxdata_key_idx=0;\n\tstruct\tsta_info\t\t*stainfo;\n\tstruct\trx_pkt_attrib\t*prxattrib=&precvframe->u.hdr.attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&adapter->securitypriv;\n\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n_func_enter_;\n\n\tstainfo=rtw_get_stainfo(&adapter->stapriv ,&prxattrib->ta[0]);\n\n\tif(prxattrib->encrypt ==_TKIP_)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n recvframe_chkmic:prxattrib->encrypt ==_TKIP_\\n\"));\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n recvframe_chkmic:da=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\\n\",\n\t\t\tprxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],prxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5]));\n\n\t\t//calculate mic code\n\t\tif(stainfo!= NULL)\n\t\t{\n\t\t\tif(IS_MCAST(prxattrib->ra))\n\t\t\t{\n\t\t\t\t//mickey=&psecuritypriv->dot118021XGrprxmickey.skey[0];\n\t\t\t\t//iv = precvframe->u.hdr.rx_data+prxattrib->hdrlen;\n\t\t\t\t//rxdata_key_idx =( ((iv[3])>>6)&0x3) ;\n\t\t\t\tmickey=&psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];\n\t\t\t\t\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n recvframe_chkmic: bcmc key \\n\"));\n\t\t\t\t//DBG_871X(\"\\n recvframe_chkmic: bcmc key psecuritypriv->dot118021XGrpKeyid(%d),pmlmeinfo->key_index(%d) ,recv key_id(%d)\\n\",\n\t\t\t\t//\t\t\t\t\t\t\t\tpsecuritypriv->dot118021XGrpKeyid,pmlmeinfo->key_index,rxdata_key_idx);\n\t\t\t\t\n\t\t\t\tif(psecuritypriv->binstallGrpkey==_FALSE)\n\t\t\t\t{\n\t\t\t\t\tres=_FAIL;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n recvframe_chkmic:didn't install group key!!!!!!!!!!\\n\"));\n\t\t\t\t\tDBG_871X(\"\\n recvframe_chkmic:didn't install group key!!!!!!!!!!\\n\");\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse{\n\t\t\t\tmickey=&stainfo->dot11tkiprxmickey.skey[0];\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n recvframe_chkmic: unicast key \\n\"));\n\t\t\t}\n\n\t\t\tdatalen=precvframe->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len-prxattrib->icv_len-8;//icv_len included the mic code\n\t\t\tpframe=precvframe->u.hdr.rx_data;\n\t\t\tpayload=pframe+prxattrib->hdrlen+prxattrib->iv_len;\n\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n prxattrib->iv_len=%d prxattrib->icv_len=%d\\n\",prxattrib->iv_len,prxattrib->icv_len));\n\n\t\t\t//rtw_seccalctkipmic(&stainfo->dot11tkiprxmickey.skey[0],pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data\n\n\t\t\trtw_seccalctkipmic(mickey,pframe,payload, datalen ,&miccode[0],(unsigned char)prxattrib->priority); //care the length of the data\n\n\t\t\tpframemic=payload+datalen;\n\n\t\t\tbmic_err=_FALSE;\n\n\t\t\tfor(i=0;i<8;i++){\n\t\t\t\tif(miccode[i] != *(pframemic+i)){\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x) \",i,miccode[i],i,*(pframemic+i)));\n\t\t\t\t\tbmic_err=_TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tif(bmic_err==_TRUE){\n\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n *(pframemic-8)-*(pframemic-1)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\\n\",\n\t\t\t\t\t*(pframemic-8),*(pframemic-7),*(pframemic-6),*(pframemic-5),*(pframemic-4),*(pframemic-3),*(pframemic-2),*(pframemic-1)));\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n *(pframemic-16)-*(pframemic-9)=0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\\n\",\n\t\t\t\t\t*(pframemic-16),*(pframemic-15),*(pframemic-14),*(pframemic-13),*(pframemic-12),*(pframemic-11),*(pframemic-10),*(pframemic-9)));\n\n\t\t\t\t{\n\t\t\t\t\tuint i;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n ======demp packet (len=%d)======\\n\",precvframe->u.hdr.len));\n\t\t\t\t\tfor(i=0;i<precvframe->u.hdr.len;i=i+8){\n\t\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\",\n\t\t\t\t\t\t\t*(precvframe->u.hdr.rx_data+i),*(precvframe->u.hdr.rx_data+i+1),\n\t\t\t\t\t\t\t*(precvframe->u.hdr.rx_data+i+2),*(precvframe->u.hdr.rx_data+i+3),\n\t\t\t\t\t\t\t*(precvframe->u.hdr.rx_data+i+4),*(precvframe->u.hdr.rx_data+i+5),\n\t\t\t\t\t\t\t*(precvframe->u.hdr.rx_data+i+6),*(precvframe->u.hdr.rx_data+i+7)));\n\t\t\t\t\t}\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n ======demp packet end [len=%d]======\\n\",precvframe->u.hdr.len));\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"\\n hrdlen=%d, \\n\",prxattrib->hdrlen));\n\t\t\t\t}\n\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"ra=0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x psecuritypriv->binstallGrpkey=%d \",\n\t\t\t\t\tprxattrib->ra[0],prxattrib->ra[1],prxattrib->ra[2],\n\t\t\t\t\tprxattrib->ra[3],prxattrib->ra[4],prxattrib->ra[5],psecuritypriv->binstallGrpkey));\n\n\t\t\t\t// double check key_index for some timing issue ,\n\t\t\t\t// cannot compare with psecuritypriv->dot118021XGrpKeyid also cause timing issue\n\t\t\t\tif((IS_MCAST(prxattrib->ra)==_TRUE)  && (prxattrib->key_index != pmlmeinfo->key_index ))\n\t\t\t\t\tbrpt_micerror = _FALSE;\n\t\t\t\t\n\t\t\t\tif((prxattrib->bdecrypted ==_TRUE)&& (brpt_micerror == _TRUE))\n\t\t\t\t{\n\t\t\t\t\trtw_handle_tkip_mic_err(adapter, stainfo, (u8)IS_MCAST(prxattrib->ra));\t\t\t\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" mic error :prxattrib->bdecrypted=%d \",prxattrib->bdecrypted));\n\t\t\t\t\tDBG_871X(\" mic error :prxattrib->bdecrypted=%d\\n\",prxattrib->bdecrypted);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" mic error :prxattrib->bdecrypted=%d \",prxattrib->bdecrypted));\n\t\t\t\t\tDBG_871X(\" mic error :prxattrib->bdecrypted=%d\\n\",prxattrib->bdecrypted);\n\t\t\t\t}\n\n\t\t\t\tres=_FAIL;\n\n\t\t\t}\n\t\t\telse{\n\t\t\t\t//mic checked ok\n\t\t\t\tif((psecuritypriv->bcheck_grpkey ==_FALSE)&&(IS_MCAST(prxattrib->ra)==_TRUE)){\n\t\t\t\t\tpsecuritypriv->bcheck_grpkey =_TRUE;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"psecuritypriv->bcheck_grpkey =_TRUE\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recvframe_chkmic: rtw_get_stainfo==NULL!!!\\n\"));\n\t\t}\n\n\t\trecvframe_pull_tail(precvframe, 8);\n\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n\n}\n\n//decrypt and set the ivlen,icvlen of the recv_frame\nunion recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame);\nunion recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame)\n{\n\n\tstruct rx_pkt_attrib *prxattrib = &precv_frame->u.hdr.attrib;\n\tstruct security_priv *psecuritypriv=&padapter->securitypriv;\n\tunion recv_frame *return_packet=precv_frame;\n\tu32\t res=_SUCCESS;\n\n_func_enter_;\n\n\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt);\n\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\\n\",prxattrib->bdecrypted,prxattrib->encrypt));\n\n\tif(prxattrib->encrypt>0)\n\t{\n\t\tu8 *iv = precv_frame->u.hdr.rx_data+prxattrib->hdrlen;\n\t\tprxattrib->key_index = ( ((iv[3])>>6)&0x3) ;\n\n\t\tif(prxattrib->key_index > WEP_KEYS)\n\t\t{\n\t\t\tDBG_871X(\"prxattrib->key_index(%d) > WEP_KEYS \\n\", prxattrib->key_index);\n\n\t\t\tswitch(prxattrib->encrypt){\n\t\t\t\tcase _WEP40_:\n\t\t\t\tcase _WEP104_:\n\t\t\t\t\tprxattrib->key_index = psecuritypriv->dot11PrivacyKeyIndex;\n\t\t\t\t\tbreak;\n\t\t\t\tcase _TKIP_:\t\t\t\n\t\t\t\tcase _AES_:\t\t\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tprxattrib->key_index = psecuritypriv->dot118021XGrpKeyid;\n\t\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\t\t\t\n\t}\n\n\tif((prxattrib->encrypt>0) && ((prxattrib->bdecrypted==0) ||(psecuritypriv->sw_decrypt==_TRUE)))\n\t{\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(!IS_MCAST(prxattrib->ra))//bc/mc packets use sw decryption for concurrent mode\n#endif\t\t\t\n\t\t\tpsecuritypriv->hw_decrypted=_FALSE;\n\n\t\t#ifdef DBG_RX_DECRYPTOR\n\t\tDBG_871X(\"[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\\n\",\n\t\t\t__FUNCTION__,\n\t\t\t__LINE__,\n\t\t\tprxattrib->bdecrypted,\n\t\t\tprxattrib->encrypt,\n\t\t\tpsecuritypriv->hw_decrypted);\n\t\t#endif\n\n\t\tswitch(prxattrib->encrypt){\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep);\n\t\t\trtw_wep_decrypt(padapter, (u8 *)precv_frame);\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_tkip);\n\t\t\tres = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);\n\t\t\tbreak;\n\t\tcase _AES_:\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes);\n\t\t\tres = rtw_aes_decrypt(padapter, (u8 * )precv_frame);\n\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi);\n\t\t\trtw_sms4_decrypt(padapter, (u8 * )precv_frame);\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse if(prxattrib->bdecrypted==1\n\t\t&& prxattrib->encrypt >0\n\t\t&& (psecuritypriv->busetkipkey==1 || prxattrib->encrypt !=_TKIP_ )\n\t\t)\n\t{\n#if 0\n\t\tif((prxstat->icv==1)&&(prxattrib->encrypt!=_AES_))\n\t\t{\n\t\t\tpsecuritypriv->hw_decrypted=_FALSE;\n\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"psecuritypriv->hw_decrypted=_FALSE\"));\n\n\t\t\trtw_free_recvframe(precv_frame, &padapter->recvpriv.free_recv_queue);\n\n\t\t\treturn_packet=NULL;\n\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw);\n\n\t\t\tpsecuritypriv->hw_decrypted=_TRUE;\n\t\t\t#ifdef DBG_RX_DECRYPTOR\n\t\t\tDBG_871X(\"[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\\n\",\n\t\t\t\t__FUNCTION__,\n\t\t\t\t__LINE__,\n\t\t\t\tprxattrib->bdecrypted,\n\t\t\t\tprxattrib->encrypt,\n\t\t\t\tpsecuritypriv->hw_decrypted);\n\n\t\t\t#endif\n\t\t}\n\t}\n\telse {\n\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown);\n\t\t#ifdef DBG_RX_DECRYPTOR\n\t\tDBG_871X(\"[%s] %d:prxstat->bdecrypted:%d,  prxattrib->encrypt:%d,  Setting psecuritypriv->hw_decrypted = %d\\n\",\n\t\t\t__FUNCTION__,\n\t\t\t__LINE__,\n\t\t\tprxattrib->bdecrypted,\n\t\t\tprxattrib->encrypt,\n\t\t\tpsecuritypriv->hw_decrypted);\n\t\t#endif\n\t}\n\t\n\tif(res == _FAIL)\n\t{\n\t\trtw_free_recvframe(return_packet,&padapter->recvpriv.free_recv_queue);\t\t\t\n\t\treturn_packet = NULL;\n\t}\n\telse\n\t{\n\t\tprxattrib->bdecrypted = _TRUE;\n\t}\n\t//recvframe_chkmic(adapter, precv_frame);   //move to recvframme_defrag function\n\n_func_exit_;\n\n\treturn return_packet;\n\n}\n//###set the security information in the recv_frame\nunion recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame);\nunion recv_frame * portctrl(_adapter *adapter,union recv_frame * precv_frame)\n{\n\tu8 *psta_addr = NULL;\n\tu8 *ptr;\n\tuint  auth_alg;\n\tstruct recv_frame_hdr *pfhdr;\n\tstruct sta_info *psta;\n\tstruct sta_priv *pstapriv ;\n\tunion recv_frame *prtnframe;\n\tu16\tether_type=0;\n\tu16  eapol_type = 0x888e;//for Funia BD's WPA issue  \n\tstruct rx_pkt_attrib *pattrib;\n\n_func_enter_;\n\n\tpstapriv = &adapter->stapriv;\n\n\tauth_alg = adapter->securitypriv.dot11AuthAlgrthm;\n\n\tptr = get_recvframe_data(precv_frame);\n\tpfhdr = &precv_frame->u.hdr;\n\tpattrib = &pfhdr->attrib;\n\tpsta_addr = pattrib->ta;\n\n\tprtnframe = NULL;\n\n\tpsta = rtw_get_stainfo(pstapriv, psta_addr);\n\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"########portctrl:adapter->securitypriv.dot11AuthAlgrthm=%d\\n\",adapter->securitypriv.dot11AuthAlgrthm));\n\n\tif(auth_alg==2)\n\t{\n\t\tif ((psta!=NULL) && (psta->ieee8021x_blocked))\n\t\t{\n\t\t\t//blocked\n\t\t\t//only accept EAPOL frame\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"########portctrl:psta->ieee8021x_blocked==1\\n\"));\n\n\t\t\tprtnframe=precv_frame;\n\n\t\t\t//get ether_type\n\t\t\tptr=ptr+pfhdr->attrib.hdrlen+pfhdr->attrib.iv_len+LLC_HEADER_SIZE;\n\t\t\t_rtw_memcpy(&ether_type,ptr, 2);\n\t\t\tether_type= ntohs((unsigned short )ether_type);\n\n\t\t        if (ether_type == eapol_type) {\n\t\t\t\tprtnframe=precv_frame;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//free this frame\n\t\t\t\trtw_free_recvframe(precv_frame, &adapter->recvpriv.free_recv_queue);\n\t\t\t\tprtnframe=NULL;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//allowed\n\t\t\t//check decryption status, and decrypt the frame if needed\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"########portctrl:psta->ieee8021x_blocked==0\\n\"));\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"portctrl:precv_frame->hdr.attrib.privacy=%x\\n\",precv_frame->u.hdr.attrib.privacy));\n\n\t\t\tif (pattrib->bdecrypted == 0)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"portctrl:prxstat->decrypted=%x\\n\", pattrib->bdecrypted));\n\t\t\t}\n\n\t\t\tprtnframe=precv_frame;\n\t\t\t//check is the EAPOL frame or not (Rekey)\n\t\t\t//if(ether_type == eapol_type){\n\t\t\t//\tRT_TRACE(_module_rtl871x_recv_c_,_drv_notice_,(\"########portctrl:ether_type == 0x888e\\n\"));\n\t\t\t\t//check Rekey\n\n\t\t\t//\tprtnframe=precv_frame;\n\t\t\t//}\n\t\t\t//else{\n\t\t\t//\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"########portctrl:ether_type=0x%04x\\n\", ether_type));\n\t\t\t//}\n\t\t}\n\t}\n\telse\n\t{\n\t\tprtnframe=precv_frame;\n\t}\n\n_func_exit_;\n\n\t\treturn prtnframe;\n\n}\n\nsint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache);\nsint recv_decache(union recv_frame *precv_frame, u8 bretry, struct stainfo_rxcache *prxcache)\n{\n\tsint tid = precv_frame->u.hdr.attrib.priority;\n\n\tu16 seq_ctrl = ( (precv_frame->u.hdr.attrib.seq_num&0xffff) << 4) |\n\t\t(precv_frame->u.hdr.attrib.frag_num & 0xf);\n\n_func_enter_;\n\n\tif(tid>15)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"recv_decache, (tid>15)! seq_ctrl=0x%x, tid=0x%x\\n\", seq_ctrl, tid));\n\n\t\treturn _FAIL;\n\t}\n\n\tif(1)//if(bretry)\n\t{\n\t\tif(seq_ctrl == prxcache->tid_rxseq[tid])\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"recv_decache, seq_ctrl=0x%x, tid=0x%x, tid_rxseq=0x%x\\n\", seq_ctrl, tid, prxcache->tid_rxseq[tid]));\n\n\t\t\treturn _FAIL;\n\t\t}\n\t}\n\n\tprxcache->tid_rxseq[tid] = seq_ctrl;\n\n_func_exit_;\n\n\treturn _SUCCESS;\n\n}\n\nvoid process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame);\nvoid process_pwrbit_data(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_AP_MODE\n\tunsigned char pwrbit;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta=NULL;\n\n\tpsta = rtw_get_stainfo(pstapriv, pattrib->src);\n\n\tpwrbit = GetPwrMgt(ptr);\n\n\tif(psta)\n\t{\n\t\tif(pwrbit)\n\t\t{\n\t\t\tif(!(psta->state & WIFI_SLEEP_STATE))\n\t\t\t{\n\t\t\t\t//psta->state |= WIFI_SLEEP_STATE;\n\t\t\t\t//pstapriv->sta_dz_bitmap |= BIT(psta->aid);\n\n\t\t\t\tstop_sta_xmit(padapter, psta);\n\n\t\t\t\t//DBG_871X(\"to sleep, sta_dz_bitmap=%x\\n\", pstapriv->sta_dz_bitmap);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(psta->state & WIFI_SLEEP_STATE)\n\t\t\t{\n\t\t\t\t//psta->state ^= WIFI_SLEEP_STATE;\n\t\t\t\t//pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);\n\n\t\t\t\twakeup_sta_to_xmit(padapter, psta);\n\n\t\t\t\t//DBG_871X(\"to wakeup, sta_dz_bitmap=%x\\n\", pstapriv->sta_dz_bitmap);\n\t\t\t}\n\t\t}\n\n\t}\n\n#endif\n}\n\nvoid process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);\nvoid process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_AP_MODE\t\t\n\tstruct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta=NULL;\n\n\tpsta = rtw_get_stainfo(pstapriv, pattrib->src);\n\t\n\tif(!psta) return;\n\n#ifdef CONFIG_TDLS\n\tif( !(psta->tdls_sta_state & TDLS_LINKED_STATE ) )\n\t{\n#endif //CONFIG_TDLS\n\n\tif(!psta->qos_option)\n\t\treturn;\n\n\tif(!(psta->qos_info&0xf))\n\t\treturn;\n\t\t\n#ifdef CONFIG_TDLS\n\t}\n#endif //CONFIG_TDLS\t\t\n\n\tif(psta->state&WIFI_SLEEP_STATE)\n\t{\n\t\tu8 wmmps_ac=0;\t\n\t\t\n\t\tswitch(pattrib->priority)\n\t\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\twmmps_ac = psta->uapsd_bk&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\twmmps_ac = psta->uapsd_vi&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\twmmps_ac = psta->uapsd_vo&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\twmmps_ac = psta->uapsd_be&BIT(1);\n\t\t\t\tbreak;\t\n\t\t}\n\n\t\tif(wmmps_ac)\n\t\t{\n\t\t\tif(psta->sleepq_ac_len>0)\n\t\t\t{\n\t\t\t\t//process received triggered frame\n\t\t\t\txmit_delivery_enabled_frames(padapter, psta);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//issue one qos null frame with More data bit = 0 and the EOSP bit set (=1)\n\t\t\t\tissue_qos_nulldata(padapter, psta->hwaddr, (u16)pattrib->priority, 0, 0);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t}\n\n\t\n#endif\t\n\n}\n\n#ifdef CONFIG_TDLS\nsint OnTDLS(_adapter *adapter, union recv_frame *precv_frame)\n{\n\tstruct rx_pkt_attrib\t*pattrib = & precv_frame->u.hdr.attrib;\n\tsint ret = _SUCCESS;\n\tu8 *paction = get_recvframe_data(precv_frame);\n\tu8 category_field = 1;\n#ifdef CONFIG_WFD\n\tu8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a };\n#endif /* CONFIG_WFD */\n\tstruct tdls_info *ptdlsinfo = &(adapter->tdlsinfo);\n\n\t/* point to action field */\n\tpaction+=pattrib->hdrlen \n\t\t\t+ pattrib->iv_len \n\t\t\t+ SNAP_SIZE \n\t\t\t+ ETH_TYPE_LEN \n\t\t\t+ PAYLOAD_TYPE_LEN \n\t\t\t+ category_field;\n\n\tif (ptdlsinfo->tdls_enable == _FALSE) {\n\t\tDBG_871X(\"recv tdls frame, \"\n\t\t\t\t\"but tdls haven't enabled\\n\");\n\t\tret = _FAIL;\n\t\treturn ret;\n\t}\n\n\tDBG_871X(\"[TDLS] Recv %s from \"MAC_FMT\"\\n\", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src));\n\t\n\tswitch(*paction){\n\tcase TDLS_SETUP_REQUEST:\n\t\tret=On_TDLS_Setup_Req(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_SETUP_RESPONSE:\n\t\tret=On_TDLS_Setup_Rsp(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_SETUP_CONFIRM:\n\t\tret=On_TDLS_Setup_Cfm(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_TEARDOWN:\n\t\tret=On_TDLS_Teardown(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_DISCOVERY_REQUEST:\n\t\tret=On_TDLS_Dis_Req(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_PEER_TRAFFIC_INDICATION:\n\t\tret=On_TDLS_Peer_Traffic_Indication(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_PEER_TRAFFIC_RESPONSE:\n\t\tret=On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame);\n\t\tbreak;\n#ifdef CONFIG_TDLS_CH_SW\t\t\n\tcase TDLS_CHANNEL_SWITCH_REQUEST:\n\t\tret=On_TDLS_Ch_Switch_Req(adapter, precv_frame);\n\t\tbreak;\n\tcase TDLS_CHANNEL_SWITCH_RESPONSE:\n\t\tret=On_TDLS_Ch_Switch_Rsp(adapter, precv_frame);\n\t\tbreak;\n#endif\t\t\n#ifdef CONFIG_WFD\t\t\t\n\t/* First byte of WFA OUI */\n\tcase 0x50:\n\t\tif (_rtw_memcmp(WFA_OUI, paction, 3)) {\n\t\t\t/* Probe request frame */\n\t\t\tif (*(paction + 3) == 0x04) {\n\t\t\t\t/* WFDTDLS: for sigma test, do not setup direct link automatically */\n\t\t\t\tptdlsinfo->dev_discovered = _TRUE;\n\t\t\t\tDBG_871X(\"recv tunneled probe request frame\\n\");\n\t\t\t\tissue_tunneled_probe_rsp(adapter, precv_frame);\n\t\t\t}\n\t\t\t/* Probe response frame */ \n\t\t\tif (*(paction + 3) == 0x05) {\n\t\t\t\t/* WFDTDLS: for sigma test, do not setup direct link automatically */\n\t\t\t\tptdlsinfo->dev_discovered = _TRUE;\n\t\t\t\tDBG_871X(\"recv tunneled probe response frame\\n\");\n\t\t\t}\n\t\t}\n\t\tbreak;\n#endif /* CONFIG_WFD */\n\tdefault:\n\t\tDBG_871X(\"receive TDLS frame %d but not support\\n\", *paction);\n\t\tret=_FAIL;\n\t\tbreak;\n\t}\n\nexit:\n\treturn ret;\n\t\n}\n#endif /* CONFIG_TDLS */\n\nvoid count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta);\nvoid count_rx_stats(_adapter *padapter, union recv_frame *prframe, struct sta_info*sta)\n{\n\tint\tsz;\n\tstruct sta_info\t\t*psta = NULL;\n\tstruct stainfo_stats\t*pstats = NULL;\n\tstruct rx_pkt_attrib\t*pattrib = & prframe->u.hdr.attrib;\n\tstruct recv_priv\t\t*precvpriv = &padapter->recvpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tsz = get_recvframe_len(prframe);\n\tprecvpriv->rx_bytes += sz;\n\n\tpadapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;\n\n\tif( (!MacAddr_isBcst(pattrib->dst)) && (!IS_MCAST(pattrib->dst))){\n\t\tpadapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;\n\t}\n\n\tif(sta)\n\t\tpsta = sta;\n\telse\n\t\tpsta = prframe->u.hdr.psta;\n\n\tif(psta)\n\t{\n\t\tpstats = &psta->sta_stats;\n\n\t\tpstats->rx_data_pkts++;\n\t\tpstats->rx_bytes += sz;\n\t\t\n\t\t/*record rx packets for every tid*/\t\n\t\tpstats->rx_data_qos_pkts[pattrib->priority]++;\n\n#ifdef CONFIG_TDLS\n\t\tif(psta->tdls_sta_state & TDLS_LINKED_STATE)\n\t\t{\n\t\t\tstruct sta_info *pap_sta = NULL;\n\t\t\tpap_sta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));\n\t\t\tif(pap_sta)\n\t\t\t{\n\t\t\t\tpstats = &pap_sta->sta_stats;\n\t\t\t\tpstats->rx_data_pkts++;\n\t\t\t\tpstats->rx_bytes += sz;\n\t\t\t}\n\t\t}\n#endif //CONFIG_TDLS\n\t}\n\n#ifdef CONFIG_CHECK_LEAVE_LPS\n\ttraffic_check_for_leave_lps(padapter, _FALSE, 0);\n#endif //CONFIG_LPS\n\n}\n\nsint sta2sta_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta\n);\nsint sta2sta_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta\n)\n{\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tsint ret = _SUCCESS;\n\tstruct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;\n\tstruct\tsta_priv \t\t*pstapriv = &adapter->stapriv;\n\tstruct\tmlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tu8 *mybssid  = get_bssid(pmlmepriv);\n\tu8 *myhwaddr = adapter_mac_addr(adapter);\n\tu8 * sta_addr = NULL;\n\tsint bmcast = IS_MCAST(pattrib->dst);\n\n#ifdef CONFIG_TDLS\t\n\tstruct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\n#ifdef CONFIG_TDLS_CH_SW\n\tstruct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info;\n#endif\n\tstruct sta_info *ptdls_sta=NULL;\n\tu8 *psnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;\n\t//frame body located after [+2]: ether-type, [+1]: payload type\n\tu8 *pframe_body = psnap_type+2+1;\n#endif\n\n_func_enter_;\n\n\t//DBG_871X(\"[%s] %d, seqnum:%d\\n\", __FUNCTION__, __LINE__, pattrib->seq_num);\n\n\tif ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||\n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))\n\t{\n\n\t\t// filter packets that SA is myself or multicast or broadcast\n\t\tif (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" SA==myself \\n\"));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif( (!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))\t&& (!bmcast) ){\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif( _rtw_memcmp(pattrib->bssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t   _rtw_memcmp(mybssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t   (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) ) {\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tsta_addr = pattrib->src;\n\n\t}\n\telse if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t{\n#ifdef CONFIG_TDLS\n\n\t\t/* direct link data transfer */\n\t\tif (ptdlsinfo->link_established == _TRUE) {\n\t\t\tptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);\n\t\t\tif (ptdls_sta == NULL) {\n\t\t\t\tret=_FAIL;\n\t\t\t\tgoto exit;\n\t\t\t} else if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {\n\t\t\t\t/* filter packets that SA is myself or multicast or broadcast */\n\t\t\t\tif (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)) {\n\t\t\t\t\tret= _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\t/* da should be for me */\n\t\t\t\tif ((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)) && (!bmcast)) {\n\t\t\t\t\tret= _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\t/* check BSSID */\n\t\t\t\tif (_rtw_memcmp(pattrib->bssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t\t\t     _rtw_memcmp(mybssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t\t\t     (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))) {\n\t\t\t\t\tret= _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n#ifdef CONFIG_TDLS_CH_SW\n\t\t\t\tpchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE;\n\n\t\t\t\tif(ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) {\n\t\t\t\t\tif (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) {\n\t\t\t\t\t\tDBG_871X(\"%s %d\\n\", __FUNCTION__, __LINE__);\n\t\t\t\t\t\tissue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta->hwaddr, 0, 0, 0);\n\t\t\t\t\t\tpchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE;\n\t\t\t\t\t\t/* On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); */\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\n\t\t\t\t/* process UAPSD tdls sta */\n\t\t\t\tprocess_pwrbit_data(adapter, precv_frame);\n\n\t\t\t\t/* if NULL-frame, check pwrbit */\n\t\t\t\tif ((GetFrameSubType(ptr) & WIFI_DATA_NULL) == WIFI_DATA_NULL) {\n\t\t\t\t\t/* NULL-frame with pwrbit=1, buffer_STA should buffer frames for sleep_STA */\n\t\t\t\t\tif (GetPwrMgt(ptr)) {\n\t\t\t\t\t\t/* it would be triggered when we are off channel and receiving NULL DATA */\n\t\t\t\t\t\t/* we can confirm that peer STA is at off channel */\n\t\t\t\t\t\tDBG_871X(\"TDLS: recv peer null frame with pwr bit 1\\n\");\n\t\t\t\t\t\t//ptdls_sta->tdls_sta_state|=TDLS_PEER_SLEEP_STATE;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* TODO: Updated BSSID's seq. */\n\t\t\t\t\t//DBG_871X(\"drop Null Data\\n\");\n\t\t\t\t\tptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);\n\t\t\t\t\tret= _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t\t/* receive some of all TDLS management frames, process it at ON_TDLS */\n\t\t\t\tif (_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, 2)) {\n\t\t\t\t\tret= OnTDLS(adapter, precv_frame);\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t\tif ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {\n\t\t\t\t\tprocess_wmmps_data(adapter, precv_frame);\n\t\t\t\t}\n\n\t\t\t\tptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);\n\n\t\t\t}\n\n\t\t\tsta_addr = pattrib->src;\n\t\t\t\n\t\t}\t\t\n\t\telse\n#endif /* CONFIG_TDLS */\n\t\t{\n\t\t\t// For Station mode, sa and bssid should always be BSSID, and DA is my mac-address\n\t\t\tif(!_rtw_memcmp(pattrib->bssid, pattrib->src, ETH_ALEN) )\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"bssid != TA under STATION_MODE; drop pkt\\n\"));\n\t\t\t\tret= _FAIL;\n\t\t\t\tgoto exit;\n\t\t}\n\n\t\tsta_addr = pattrib->bssid;\n\t\t}\n\n\t}\n\telse if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\tif (bmcast)\n\t\t{\n\t\t\t// For AP mode, if DA == MCAST, then BSSID should be also MCAST\n\t\t\tif (!IS_MCAST(pattrib->bssid)){\n\t\t\t\t\tret= _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\t\telse // not mc-frame\n\t\t{\n\t\t\t// For AP mode, if DA is non-MCAST, then it must be BSSID, and bssid == BSSID\n\t\t\tif(!_rtw_memcmp(pattrib->bssid, pattrib->dst, ETH_ALEN)) {\n\t\t\t\tret= _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\tsta_addr = pattrib->src;\n\t\t}\n\n\t}\n\telse if(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)\n\t{\n\t\t_rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\t\tsta_addr = mybssid;\n\t}\n\telse\n\t{\n\t\tret  = _FAIL;\n\t}\n\n\n\n\tif(bmcast)\n\t\t*psta = rtw_get_bcmc_stainfo(adapter);\n\telse\n\t\t*psta = rtw_get_stainfo(pstapriv, sta_addr); // get ap_info\n\n#ifdef CONFIG_TDLS\n\tif(ptdls_sta != NULL)\n\t{\n\t\t*psta = ptdls_sta;\n\t}\n#endif //CONFIG_TDLS\n\n\tif (*psta == NULL) {\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"can't get psta under sta2sta_data_frame ; drop pkt\\n\"));\n#ifdef CONFIG_MP_INCLUDED\n\t\tif (adapter->registrypriv.mp_mode == 1)\n\t\t{\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)\n\t\t\t\tadapter->mppriv.rx_pktloss++;\n\t\t}\n#endif\n\t\tret= _FAIL;\n\t\tgoto exit;\n\t}\n\nexit:\n_func_exit_;\n\treturn ret;\n\n}\n\nsint ap2sta_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta );\nsint ap2sta_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta )\n{\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;\n\tsint ret = _SUCCESS;\n\tstruct\tsta_priv \t\t*pstapriv = &adapter->stapriv;\n\tstruct\tmlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tu8 *mybssid  = get_bssid(pmlmepriv);\n\tu8 *myhwaddr = adapter_mac_addr(adapter);\n\tsint bmcast = IS_MCAST(pattrib->dst);\n\n_func_enter_;\n\n\tif ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t&& (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE \n\t\t\t|| check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE\t)\n\t\t)\n\t{\n\n\t\t// filter packets that SA is myself or multicast or broadcast\n\t\tif (_rtw_memcmp(myhwaddr, pattrib->src, ETH_ALEN)){\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" SA==myself \\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s SA=\"MAC_FMT\", myhwaddr=\"MAC_FMT\"\\n\",\n\t\t\t\t__FUNCTION__, MAC_ARG(pattrib->src), MAC_ARG(myhwaddr));\n\t\t\t#endif\t\t\t\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// da should be for me\n\t\tif((!_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN))&& (!bmcast))\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,\n\t\t\t\t(\" ap2sta_data_frame:  compare DA fail; DA=\"MAC_FMT\"\\n\", MAC_ARG(pattrib->dst)));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s DA=\"MAC_FMT\"\\n\", __func__, MAC_ARG(pattrib->dst));\n\t\t\t#endif\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\n\t\t// check BSSID\n\t\tif( _rtw_memcmp(pattrib->bssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t     _rtw_memcmp(mybssid, \"\\x0\\x0\\x0\\x0\\x0\\x0\", ETH_ALEN) ||\n\t\t     (!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN)) )\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,\n\t\t\t\t(\" ap2sta_data_frame:  compare BSSID fail ; BSSID=\"MAC_FMT\"\\n\", MAC_ARG(pattrib->bssid)));\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"mybssid=\"MAC_FMT\"\\n\", MAC_ARG(mybssid)));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s BSSID=\"MAC_FMT\", mybssid=\"MAC_FMT\"\\n\",\n\t\t\t\t__FUNCTION__, MAC_ARG(pattrib->bssid), MAC_ARG(mybssid));\n\t\t\tDBG_871X( \"this adapter = %d, buddy adapter = %d\\n\", adapter->adapter_type, adapter->pbuddy_adapter->adapter_type );\n\t\t\t#endif\n\n\t\t\tif(!bmcast)\n\t\t\t{\n\t\t\t\tDBG_871X(\"issue_deauth to the nonassociated ap=\" MAC_FMT \" for the reason(7)\\n\", MAC_ARG(pattrib->bssid));\n\t\t\t\tissue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);\n\t\t\t}\n\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif(bmcast)\n\t\t\t*psta = rtw_get_bcmc_stainfo(adapter);\n\t\telse\n\t\t\t*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get ap_info\n\n\t\tif (*psta == NULL) {\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"ap2sta: can't get psta under STATION_MODE ; drop pkt\\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s can't get psta under STATION_MODE ; drop pkt\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {\n\t\t}\n\n\t\tif (GetFrameSubType(ptr) & BIT(6)) {\n\t\t\t/* No data, will not indicate to upper layer, temporily count it here */\n\t\t\tcount_rx_stats(adapter, precv_frame, *psta);\n\t\t\tret = RTW_RX_HANDLED;\n\t\t\tgoto exit;\n\t\t}\n\n\t}\n\telse if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&\n\t\t     (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )\n\t{\n\t\t_rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\t\t//\n\t\tif(adapter->mppriv.bRTWSmbCfg==_FALSE)\n\t\t\t_rtw_memcpy(pattrib->bssid,  mybssid, ETH_ALEN);\n\n\n\t\t*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info\n\t\tif (*psta == NULL) {\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"can't get psta under MP_MODE ; drop pkt\\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\n\t}\n\telse if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\t/* Special case */\n\t\tret = RTW_RX_HANDLED;\n\t\tgoto exit;\n\t}\n\telse\n\t{\n\t\tif(_rtw_memcmp(myhwaddr, pattrib->dst, ETH_ALEN)&& (!bmcast))\n\t\t{\n\t\t\t*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info\n\t\t\tif (*psta == NULL)\n\t\t\t{\n\t\n\t\t\t\t//for AP multicast issue , modify by yiwei \n\t\t\t\tstatic u32 send_issue_deauth_time=0;\n\t\t\t\n\t\t\t\t//DBG_871X(\"After send deauth , %u ms has elapsed.\\n\", rtw_get_passing_time_ms(send_issue_deauth_time));\n\t\t\t\t\n\t\t\t\tif(rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0 )\n\t\t\t\t{\n\t\t\t\t\tsend_issue_deauth_time = rtw_get_current_time(); \n\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"issue_deauth to the ap=\" MAC_FMT \" for the reason(7)\\n\", MAC_ARG(pattrib->bssid));\n\t\t\t\t\t\n\t\t\t\t\tissue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\t\n\t\tret = _FAIL;\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s fw_state:0x%x\\n\", __FUNCTION__, get_fwstate(pmlmepriv));\n\t\t#endif\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn ret;\n\n}\n\nsint sta2ap_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta );\nsint sta2ap_data_frame(\n\t_adapter *adapter,\n\tunion recv_frame *precv_frame,\n\tstruct sta_info**psta )\n{\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;\n\tstruct\tsta_priv \t\t*pstapriv = &adapter->stapriv;\n\tstruct\tmlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tunsigned char *mybssid  = get_bssid(pmlmepriv);\t\n\tsint ret=_SUCCESS;\n\n_func_enter_;\n\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\t//For AP mode, RA=BSSID, TX=STA(SRC_ADDR), A3=DST_ADDR\n\t\tif(!_rtw_memcmp(pattrib->bssid, mybssid, ETH_ALEN))\n\t\t{\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t*psta = rtw_get_stainfo(pstapriv, pattrib->src);\n\t\tif (*psta == NULL)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"can't get psta under AP_MODE; drop pkt\\n\"));\n\t\t\tDBG_871X(\"issue_deauth to sta=\" MAC_FMT \" for the reason(7)\\n\", MAC_ARG(pattrib->src));\n\n\t\t\tissue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);\n\n\t\t\tret = RTW_RX_HANDLED;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tprocess_pwrbit_data(adapter, precv_frame);\n\n\t\tif ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) {\n\t\t\tprocess_wmmps_data(adapter, precv_frame);\n\t\t}\n\n\t\tif (GetFrameSubType(ptr) & BIT(6)) {\n\t\t\t/* No data, will not indicate to upper layer, temporily count it here */\n\t\t\tcount_rx_stats(adapter, precv_frame, *psta);\n\t\t\tret = RTW_RX_HANDLED;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\telse if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) &&\n\t\t     (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )\n\t{\n\t\t//DBG_871X(\"%s ,in WIFI_MP_STATE \\n\",__func__);\n\t\t_rtw_memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\t\t//\n\t\tif(adapter->mppriv.bRTWSmbCfg == _FALSE)\n\t\t\t_rtw_memcpy(pattrib->bssid,  mybssid, ETH_ALEN);\n\n\t\t*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info\n\t\tif (*psta == NULL) {\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"can't get psta under MP_MODE ; drop pkt\\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s can't get psta under WIFI_MP_STATE ; drop pkt\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t}\n\telse {\n\t\tu8 *myhwaddr = adapter_mac_addr(adapter);\n\t\tif (!_rtw_memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) {\n\t\t\tret = RTW_RX_HANDLED;\n\t\t\tgoto exit;\n\t\t}\n\t\tDBG_871X(\"issue_deauth to sta=\" MAC_FMT \" for the reason(7)\\n\", MAC_ARG(pattrib->src));\n\t\tissue_deauth(adapter, pattrib->src, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);\n\t\tret = RTW_RX_HANDLED;\n\t\tgoto exit;\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn ret;\n\n}\n\nsint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame);\nsint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *pframe = precv_frame->u.hdr.rx_data;\n\tstruct sta_info *psta=NULL;\n\t//uint len = precv_frame->u.hdr.len;\n\t\t\n\t//DBG_871X(\"+validate_recv_ctrl_frame\\n\");\n\n\tif (GetFrameType(pframe) != WIFI_CTRL_TYPE)\n\t{\t\t\n\t\treturn _FAIL;\n\t}\n\n\t//receive the frames that ra(a1) is my address\n\tif (!_rtw_memcmp(GetAddr1Ptr(pframe), adapter_mac_addr(padapter), ETH_ALEN))\n\t\treturn _FAIL;\n\n\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));\n\tif (psta==NULL)\n\t{\n\t\treturn _FAIL;\n\t}\n\n\t//for rx pkt statistics\n\tpsta->sta_stats.rx_ctrl_pkts++;\n\n\t//only handle ps-poll\n\tif(GetFrameSubType(pframe) == WIFI_PSPOLL)\n\t{\n#ifdef CONFIG_AP_MODE\n\t\tu16 aid;\n\t\tu8 wmmps_ac=0;\t\n\t\n\t\taid = GetAid(pframe);\n\t\tif(psta->aid!=aid)\n\t\t{\n\t\t\treturn _FAIL;\n\t\t}\n\n\t\tswitch(pattrib->priority)\n\t\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\twmmps_ac = psta->uapsd_bk&BIT(0);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\twmmps_ac = psta->uapsd_vi&BIT(0);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\twmmps_ac = psta->uapsd_vo&BIT(0);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\twmmps_ac = psta->uapsd_be&BIT(0);\n\t\t\t\tbreak;\t\n\t\t}\n\n\t\tif(wmmps_ac)\n\t\t\treturn _FAIL;\n\n\t\tif(psta->state & WIFI_STA_ALIVE_CHK_STATE)\n\t\t{\t\t\t\t\t\n\t\t\tDBG_871X(\"%s alive check-rx ps-poll\\n\", __func__);\n\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\tpsta->state ^= WIFI_STA_ALIVE_CHK_STATE;\n\t\t}\t\n\n\t\tif((psta->state&WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap&BIT(psta->aid)))\n\t\t{\n\t\t\t_irqL irqL;\t \n\t\t\t_list\t*xmitframe_plist, *xmitframe_phead;\n\t\t\tstruct xmit_frame *pxmitframe=NULL;\n\t\t\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\t\t\n\t\t\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\t\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\t\t\txmitframe_phead = get_list_head(&psta->sleep_q);\n\t\t\txmitframe_plist = get_next(xmitframe_phead);\n\n\t\t\tif ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t\t\t{\t\t\t\n\t\t\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\t\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\t\t\trtw_list_delete(&pxmitframe->list);\n\n\t\t\t\tpsta->sleepq_len--;\n\n\t\t\t\tif(psta->sleepq_len>0)\n\t\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\t\telse\n\t\t\t\t\tpxmitframe->attrib.mdata = 0;\n\n\t\t\t\tpxmitframe->attrib.triggered = 1;\n\n\t\t\t\t//DBG_871X(\"handling ps-poll, q_len=%d, tim=%x\\n\", psta->sleepq_len, pstapriv->tim_bitmap);\n\n#if 0\n\t\t\t\t_exit_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\t\t\tif(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)\n\t\t\t\t{\n\t\t\t\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\t\t\t\t}\n\t\t\t\t_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n#endif\n\t\t\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\n\t\t\t\tif(psta->sleepq_len==0)\n\t\t\t\t{\n\t\t\t\t\tpstapriv->tim_bitmap &= ~BIT(psta->aid);\n\n\t\t\t\t\t//DBG_871X(\"after handling ps-poll, tim=%x\\n\", pstapriv->tim_bitmap);\n\n\t\t\t\t\t//upate BCN for TIM IE\n\t\t\t\t\t//update_BCNTIM(padapter);\t\t\n\t\t\t\t\tupdate_beacon(padapter, _TIM_IE_, NULL, _TRUE);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\t\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\t\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\t\t\t\n\t\t\t\t//DBG_871X(\"no buffered packets to xmit\\n\");\n\t\t\t\tif(pstapriv->tim_bitmap&BIT(psta->aid))\n\t\t\t\t{\n\t\t\t\t\tif(psta->sleepq_len==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"no buffered packets to xmit\\n\");\n\n\t\t\t\t\t\t//issue nulldata with More data bit = 0 to indicate we have no buffered packets\n\t\t\t\t\t\tissue_nulldata_in_interrupt(padapter, psta->hwaddr, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"error!psta->sleepq_len=%d\\n\", psta->sleepq_len);\n\t\t\t\t\t\tpsta->sleepq_len=0;\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tpstapriv->tim_bitmap &= ~BIT(psta->aid);\t\t\t\t\t\n\n\t\t\t\t\t//upate BCN for TIM IE\n\t\t\t\t\t//update_BCNTIM(padapter);\n\t\t\t\t\tupdate_beacon(padapter, _TIM_IE_, NULL, _TRUE);\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t}\n#endif //CONFIG_AP_MODE\n\t}\n\telse if(GetFrameSubType(pframe) == WIFI_NDPA) {\n#ifdef CONFIG_BEAMFORMING\n\t\tbeamforming_get_ndpa_frame(padapter, precv_frame);\n#endif/*CONFIG_BEAMFORMING*/\n\t}\n\n\treturn _FAIL;\n\n}\n\nunion recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame);\nsint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame);\nsint validate_recv_mgnt_frame(PADAPTER padapter, union recv_frame *precv_frame)\n{\n\t//struct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\n\tRT_TRACE(_module_rtl871x_recv_c_, _drv_info_, (\"+validate_recv_mgnt_frame\\n\"));\n\n#if 0\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n#ifdef CONFIG_NATIVEAP_MLME\n\t\tmgt_dispatcher(padapter, precv_frame);\n#else\n\t\trtw_hostapd_mlme_rx(padapter, precv_frame);\n#endif\n\t}\n\telse\n\t{\n\t\tmgt_dispatcher(padapter, precv_frame);\n\t}\n#endif\n\n\tprecv_frame = recvframe_chk_defrag(padapter, precv_frame);\n\tif (precv_frame == NULL) {\n\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,(\"%s: fragment packet\\n\",__FUNCTION__));\n\t\treturn _SUCCESS;\n\t}\n\n\t{\n\t\t//for rx pkt statistics\n\t\tstruct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->u.hdr.rx_data));\n\t\tif (psta) {\n\t\t\tpsta->sta_stats.rx_mgnt_pkts++;\n\t\t\tif (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_BEACON)\n\t\t\t\tpsta->sta_stats.rx_beacon_pkts++;\n\t\t\telse if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBEREQ)\n\t\t\t\tpsta->sta_stats.rx_probereq_pkts++;\n\t\t\telse if (GetFrameSubType(precv_frame->u.hdr.rx_data) == WIFI_PROBERSP) {\n\t\t\t\tif (_rtw_memcmp(adapter_mac_addr(padapter), GetAddr1Ptr(precv_frame->u.hdr.rx_data), ETH_ALEN) == _TRUE)\n\t\t\t\t\tpsta->sta_stats.rx_probersp_pkts++;\n\t\t\t\telse if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data))\n\t\t\t\t\t|| is_multicast_mac_addr(GetAddr1Ptr(precv_frame->u.hdr.rx_data)))\n\t\t\t\t\tpsta->sta_stats.rx_probersp_bm_pkts++;\n\t\t\t\telse \n\t\t\t\t\tpsta->sta_stats.rx_probersp_uo_pkts++;\n\t\t\t}\n\t\t}\n\t}\n\n#ifdef CONFIG_INTEL_PROXIM\n\tif(padapter->proximity.proxim_on==_TRUE)\n\t{\n\t\tstruct rx_pkt_attrib * pattrib=&precv_frame->u.hdr.attrib;\n\t\t struct recv_stat* prxstat=( struct recv_stat * )  precv_frame->u.hdr.rx_head ;\n\t\t u8 * pda,*psa,*pbssid,*ptr;\n\t\t ptr=precv_frame->u.hdr.rx_data; \n\t\tpda = get_da(ptr);\n\t\tpsa = get_sa(ptr);\n\t\tpbssid = get_hdr_bssid(ptr);\n\n\n\t\t_rtw_memcpy(pattrib->dst, pda, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->src, psa, ETH_ALEN);\n\n\t\t_rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);\n\n\tswitch(pattrib->to_fr_ds)\n\t{\n\t\tcase 0:\n\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\t_rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\t_rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" case 3\\n\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t\t}\t\n\t\t\tpattrib->priority=0;\n\t\t\tpattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24;\n\n\t\t padapter->proximity.proxim_rx(padapter,precv_frame);\n\t}\n#endif\n\tmgt_dispatcher(padapter, precv_frame);\n\n\treturn _SUCCESS;\n\n}\n\nsint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame);\nsint validate_recv_data_frame(_adapter *adapter, union recv_frame *precv_frame)\n{\n\tu8 bretry;\n\tu8 *psa, *pda, *pbssid;\n\tstruct sta_info *psta = NULL;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib\t*pattrib = & precv_frame->u.hdr.attrib;\n\tstruct sta_priv \t*pstapriv = &adapter->stapriv;\n\tstruct security_priv\t*psecuritypriv = &adapter->securitypriv;\t\n\tsint ret = _SUCCESS;\n\n_func_enter_;\n\n\tbretry = GetRetry(ptr);\n\tpda = get_da(ptr);\n\tpsa = get_sa(ptr);\n\tpbssid = get_hdr_bssid(ptr);\n\n\tif(pbssid == NULL){\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s pbssid == NULL\\n\", __func__);\n\t\t#endif\n\t\tret= _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memcpy(pattrib->dst, pda, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, psa, ETH_ALEN);\n\n\t_rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);\n\n\tswitch(pattrib->to_fr_ds)\n\t{\n\t\tcase 0:\n\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\tret = sta2sta_data_frame(adapter, precv_frame, &psta);\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);\n\t\t\tret = ap2sta_data_frame(adapter, precv_frame, &psta);\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\t_rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\tret = sta2ap_data_frame(adapter, precv_frame, &psta);\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\t_rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t\tret =_FAIL;\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" case 3\\n\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tret =_FAIL;\n\t\t\tbreak;\n\n\t}\n\n\tif(ret ==_FAIL){\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s case:%d, res:%d\\n\", __FUNCTION__, pattrib->to_fr_ds, ret);\n\t\t#endif\n\t\tgoto exit;\n\t} else if (ret == RTW_RX_HANDLED) {\n\t\tgoto exit;\n\t}\n\n\n\tif(psta==NULL){\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" after to_fr_ds_chk; psta==NULL \\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s psta == NULL\\n\", __func__);\n\t\t#endif\n\t\tret= _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\t//psta->rssi = prxcmd->rssi;\n\t//psta->signal_quality= prxcmd->sq;\n\tprecv_frame->u.hdr.psta = psta;\n\t\t\n\n\tpattrib->amsdu=0;\n\tpattrib->ack_policy = 0;\n\t//parsing QC field\n\tif(pattrib->qos == 1)\n\t{\n\t\tpattrib->priority = GetPriority((ptr + 24));\n\t\tpattrib->ack_policy = GetAckpolicy((ptr + 24));\n\t\tpattrib->amsdu = GetAMsdu((ptr + 24));\n\t\tpattrib->hdrlen = pattrib->to_fr_ds==3 ? 32 : 26;\n\n\t\tif(pattrib->priority!=0 && pattrib->priority!=3)\n\t\t\tadapter->recvpriv.bIsAnyNonBEPkts = _TRUE;\n\t\telse\n\t\t\tadapter->recvpriv.bIsAnyNonBEPkts = _FALSE;\n\t}\n\telse\n\t{\n\t\tpattrib->priority=0;\n\t\tpattrib->hdrlen = pattrib->to_fr_ds==3 ? 30 : 24;\n\t}\n\n\n\tif(pattrib->order)//HT-CTRL 11n\n\t{\n\t\tpattrib->hdrlen += 4;\n\t}\n\n\tprecv_frame->u.hdr.preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];\n\n\t// decache, drop duplicate recv packets\n\tif(recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"decache : drop pkt\\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s recv_decache return _FAIL\\n\", __func__);\n\t\t#endif\n\t\tret= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif(pattrib->privacy){\n\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"validate_recv_data_frame:pattrib->privacy=%x\\n\", pattrib->privacy));\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\\n\", pattrib->ra[0],IS_MCAST(pattrib->ra)));\n\n#ifdef CONFIG_TDLS\n\t\tif((psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta->dot118021XPrivacy==_AES_))\n\t\t{\n\t\t\tpattrib->encrypt=psta->dot118021XPrivacy;\n\t\t}\n\t\telse\n#endif //CONFIG_TDLS\n\t\tGET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, IS_MCAST(pattrib->ra));\n\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n pattrib->encrypt=%d\\n\",pattrib->encrypt));\n\n\t\tSET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);\n\t}\n\telse\n\t{\n\t\tpattrib->encrypt = 0;\n\t\tpattrib->iv_len = pattrib->icv_len = 0;\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn ret;\n}\n\n#ifdef CONFIG_IEEE80211W\nstatic sint validate_80211w_mgmt(_adapter *adapter, union recv_frame *precv_frame)\n{\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct sta_info\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &adapter->stapriv;\n\tu8 type;\n\tu8 subtype;\n\t\t\t\n\ttype =  GetFrameType(ptr);\n\tsubtype = GetFrameSubType(ptr); //bit(7)~bit(2)\n\t\t\t\n\tif (adapter->securitypriv.binstallBIPkey == _TRUE)\n\t{\n\t\t//unicast management frame decrypt\n\t\tif(pattrib->privacy && !(IS_MCAST(GetAddr1Ptr(ptr))) && \n\t\t\t(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC || subtype == WIFI_ACTION))\n\t\t{\n\t\t\tu8 *ppp, *mgmt_DATA;\n\t\t\tu32 data_len=0;\n\t\t\tppp = GetAddr2Ptr(ptr);\n\t\t\t\n\t\t\tpattrib->bdecrypted = 0;\n\t\t\tpattrib->encrypt = _AES_;\n\t\t\tpattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\t\t\t//set iv and icv length\n\t\t\tSET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);\n\t\t\t_rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t\t_rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t\t//actual management data frame body\n\t\t\tdata_len = pattrib->pkt_len - pattrib->hdrlen - pattrib->iv_len - pattrib->icv_len;\n\t\t\tmgmt_DATA = rtw_zmalloc(data_len);\n\t\t\tif(mgmt_DATA == NULL)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s mgmt allocate fail  !!!!!!!!!\\n\", __FUNCTION__);\n\t\t\t\tgoto validate_80211w_fail;\n\t\t\t}\n\t\t\t/* //dump the packet content before decrypt\n\t\t\t{\n\t\t\t\tint pp;\n\t\t\t\tprintk(\"pattrib->pktlen = %d =>\", pattrib->pkt_len);\n\t\t\t\tfor(pp=0;pp< pattrib->pkt_len; pp++)\n\t\t\t\t\tprintk(\" %02x \", ptr[pp]);\n\t\t\t\tprintk(\"\\n\");\n\t\t\t}*/\n\t\t\t\n\t\t\tprecv_frame = decryptor(adapter, precv_frame);\n\t\t\t//save actual management data frame body\n\t\t\t_rtw_memcpy(mgmt_DATA, ptr+pattrib->hdrlen+pattrib->iv_len, data_len);\n\t\t\t//overwrite the iv field\n\t\t\t_rtw_memcpy(ptr+pattrib->hdrlen, mgmt_DATA, data_len);\n\t\t\t//remove the iv and icv length\n\t\t\tpattrib->pkt_len = pattrib->pkt_len - pattrib->iv_len - pattrib->icv_len;\n\t\t\trtw_mfree(mgmt_DATA, data_len);\n\t\t\t/* //print packet content after decryption\n\t\t\t{\n\t\t\t\tint pp;\n\t\t\t\tprintk(\"after decryption pattrib->pktlen = %d @@=>\", pattrib->pkt_len);\n\t\t\t\tfor(pp=0;pp< pattrib->pkt_len; pp++)\n\t\t\t\t\tprintk(\" %02x \", ptr[pp]);\n\t\t\t\tprintk(\"\\n\");\n\t\t\t}*/\n\t\t\tif(!precv_frame)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s mgmt descrypt fail  !!!!!!!!!\\n\", __FUNCTION__);\n\t\t\t\tgoto validate_80211w_fail;\n\t\t\t}\n\t\t}\n\t\telse if(IS_MCAST(GetAddr1Ptr(ptr)) &&\n\t\t\t(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC))\n\t\t{\n\t\t\tsint BIP_ret = _SUCCESS;\n\t\t\t//verify BIP MME IE of broadcast/multicast de-auth/disassoc packet\n\t\t\tBIP_ret = rtw_BIP_verify(adapter, (u8 * )precv_frame);\n\t\t\tif(BIP_ret == _FAIL)\n\t\t\t{\n\t\t\t\t//DBG_871X(\"802.11w BIP verify fail\\n\");\n\t\t\t\tgoto validate_80211w_fail;\n\t\t\t}\n\t\t\telse if(BIP_ret == RTW_RX_HANDLED)\n\t\t\t{\n\t\t\t\tDBG_871X(\"802.11w recv none protected packet\\n\");\n\t\t\t\t//drop pkt, don't issue sa query request\n\t\t\t\t/* issue_action_SA_Query(adapter, NULL, 0, 0, 0); */\n\t\t\t\tgoto validate_80211w_fail;\n\t\t\t}\n\t\t}//802.11w protect\n\t\telse\n\t\t{\n\t\t\tpsta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(ptr));\n\t\t\t\n\t\t\tif (subtype == WIFI_ACTION && psta && psta->bpairwise_key_installed == _TRUE) {\n\t\t\t\t//according 802.11-2012 standard, these five types are not robust types\n\t\t\t\tif( ptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_PUBLIC          &&\n\t\t\t\t\tptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_HT              &&\n\t\t\t\t\tptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_UNPROTECTED_WNM &&\n\t\t\t\t\tptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_SELF_PROTECTED  &&\n\t\t\t\t\tptr[WLAN_HDR_A3_LEN] != RTW_WLAN_CATEGORY_P2P)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"action frame category=%d should robust\\n\", ptr[WLAN_HDR_A3_LEN]);\n\t\t\t\t\tgoto validate_80211w_fail;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC)\n\t\t\t{\n\t\t\t\tunsigned short\treason;\n\t\t\t\treason = le16_to_cpu(*(unsigned short *)(ptr + WLAN_HDR_A3_LEN));\n\t\t\t\tDBG_871X(\"802.11w recv none protected packet, reason=%d\\n\", reason);\n\t\t\t\tif(reason == 6 || reason == 7)\n\t\t\t\t{\n\t\t\t\t\t//issue sa query request\n\t\t\t\t\tissue_action_SA_Query(adapter, NULL, 0, 0, IEEE80211W_RIGHT_KEY);\n\t\t\t\t}\n\t\t\t\tgoto validate_80211w_fail;\n\t\t\t}\n\t\t}\n\t}\n\treturn _SUCCESS;\n\t\t\t\nvalidate_80211w_fail:\n\treturn _FAIL;\n\t\n}\n#endif //CONFIG_IEEE80211W\n\nstatic inline void dump_rx_packet(u8 *ptr)\n{\n\tint i;\n\n\tDBG_871X(\"############################# \\n\");\n\tfor(i=0; i<64;i=i+8)\n\t\tDBG_871X(\"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\\n\", *(ptr+i),\n\t\t*(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));\n\tDBG_871X(\"############################# \\n\");\n}\n\nsint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);\nsint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)\n{\n\t//shall check frame subtype, to / from ds, da, bssid\n\n\t//then call check if rx seq/frag. duplicated.\n\n\tu8 type;\n\tu8 subtype;\n\tsint retval = _SUCCESS;\n\n\tstruct rx_pkt_attrib *pattrib = & precv_frame->u.hdr.attrib;\n\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tu8  ver =(unsigned char) (*ptr)&0x3 ;\n#ifdef CONFIG_FIND_BEST_CHANNEL\n\tstruct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\n#endif\n\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &adapter->tdlsinfo;\n#endif //CONFIG_TDLS\n#ifdef CONFIG_WAPI_SUPPORT\n\tPRT_WAPI_T\tpWapiInfo = &adapter->wapiInfo;\n\tstruct recv_frame_hdr *phdr = &precv_frame->u.hdr;\n\tu8 wai_pkt = 0;\n\tu16 sc;\n\tu8\texternal_len = 0;\n#endif\n\n_func_enter_;\n\n#ifdef CONFIG_FIND_BEST_CHANNEL\n\tif (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {\n\t\tint ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));\n\t\tif (ch_set_idx >= 0)\n\t\t\tpmlmeext->channel_set[ch_set_idx].rx_count++;\n\t}\n#endif\n\n#ifdef CONFIG_TDLS\n\tif(ptdlsinfo->ch_sensing==1 && ptdlsinfo->cur_channel !=0){\n\t\tptdlsinfo->collect_pkt_num[ptdlsinfo->cur_channel-1]++;\n\t}\n#endif //CONFIG_TDLS\n\n#ifdef RTK_DMP_PLATFORM\n\tif ( 0 )\n\t{\n\t\tDBG_871X(\"++\\n\");\n\t\t{\n\t\t\tint i;\n\t\t\tfor(i=0; i<64;i=i+8)\n\t\t\t\tDBG_871X(\"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\", *(ptr+i),\n\t\t\t\t*(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));\n\n\t\t}\n\t\tDBG_871X(\"--\\n\");\n\t}\n#endif //RTK_DMP_PLATFORM\n\n\t//add version chk\n\tif(ver!=0){\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"validate_recv_data_frame fail! (ver!=0)\\n\"));\n\t\tretval= _FAIL;\n\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err);\n\t\tgoto exit;\n\t}\n\n\ttype =  GetFrameType(ptr);\n\tsubtype = GetFrameSubType(ptr); //bit(7)~bit(2)\n\n\tpattrib->to_fr_ds = get_tofr_ds(ptr);\n\n\tpattrib->frag_num = GetFragNum(ptr);\n\tpattrib->seq_num = GetSequence(ptr);\n\n\tpattrib->pw_save = GetPwrMgt(ptr);\n\tpattrib->mfrag = GetMFrag(ptr);\n\tpattrib->mdata = GetMData(ptr);\n\tpattrib->privacy = GetPrivacy(ptr);\n\tpattrib->order = GetOrder(ptr);\n#ifdef CONFIG_WAPI_SUPPORT\n\tsc = (pattrib->seq_num<<4) | pattrib->frag_num;\n#endif\n\n#if 1 //Dump rx packets\n{\n\tu8 bDumpRxPkt;\n\trtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));\n\tif (bDumpRxPkt == 1) //dump all rx packets\n\t\tdump_rx_packet(ptr);\n\telse if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE))\n\t\tdump_rx_packet(ptr);\n\telse if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE))\n\t\tdump_rx_packet(ptr);\n}\n#endif\n\tswitch (type)\n\t{\n\t\tcase WIFI_MGT_TYPE: //mgnt\n\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt);\n#ifdef CONFIG_IEEE80211W\n\t\t\tif(validate_80211w_mgmt(adapter, precv_frame) == _FAIL)\n\t\t\t{\n\t\t\t\tretval = _FAIL;\n\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err_80211w);\n\t\t\t\tbreak;\n\t\t\t}\n#endif //CONFIG_IEEE80211W\n\t\t\t\n\t\t\tretval = validate_recv_mgnt_frame(adapter, precv_frame);\n\t\t\tif (retval == _FAIL)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"validate_recv_mgnt_frame fail\\n\"));\n\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err);\n\t\t\t}\n\t\t\tretval = _FAIL; // only data frame return _SUCCESS\n\t\t\tbreak;\n\t\tcase WIFI_CTRL_TYPE: //ctrl\n\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl);\n\t\t\tretval = validate_recv_ctrl_frame(adapter, precv_frame);\n\t\t\tif (retval == _FAIL)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"validate_recv_ctrl_frame fail\\n\"));\n\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err);\n\t\t\t}\n\t\t\tretval = _FAIL; // only data frame return _SUCCESS\n\t\t\tbreak;\n\t\tcase WIFI_DATA_TYPE: //data\n\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_data);\n#ifdef CONFIG_WAPI_SUPPORT\n\t\t\tif(pattrib->qos)\n\t\t\t\texternal_len = 2;\n\t\t\telse\n\t\t\t\texternal_len= 0;\n\t\t\t\n\t\t\twai_pkt = rtw_wapi_is_wai_packet(adapter,ptr);\n\n\t\t\tphdr->bIsWaiPacket = wai_pkt;\n\n\t\t\tif(wai_pkt !=0){\n\t\t\t\tif(sc != adapter->wapiInfo.wapiSeqnumAndFragNum)\n\t\t\t\t{\n\t\t\t\t\tadapter->wapiInfo.wapiSeqnumAndFragNum = sc;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tretval = _FAIL;\n\t\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse{\n\n\t\t\t\t\tif(rtw_wapi_drop_for_key_absent(adapter,GetAddr2Ptr(ptr))){\n\t\t\t\t\t\tretval=_FAIL;\n\t\t\t\t\t\tWAPI_TRACE(WAPI_RX,\"drop for key absent for rx \\n\");\n\t\t\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t}\n\n#endif\n\n\t\t\tpattrib->qos = (subtype & BIT(7))? 1:0;\n\t\t\tretval = validate_recv_data_frame(adapter, precv_frame);\n\t\t\tif (retval == _FAIL)\n\t\t\t{\n\t\t\t\tstruct recv_priv *precvpriv = &adapter->recvpriv;\n\t\t\t\t//RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"validate_recv_data_frame fail\\n\"));\n\t\t\t\tprecvpriv->rx_drop++;\n\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err);\n\t\t\t}\n\t\t\telse if (retval == _SUCCESS)\n\t\t\t{\n#ifdef DBG_RX_DUMP_EAP\n\t\t\t\tu8 bDumpRxPkt;\n\t\t\t\tu16 eth_type;\n\n\t\t\t\t// dump eapol\n\t\t\t\trtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));\n\t\t\t\t// get ether_type\n\t\t\t\t_rtw_memcpy(&eth_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2);\n\t\t\t\teth_type = ntohs((unsigned short) eth_type);\n\t\t\t\tif ((bDumpRxPkt == 4) && (eth_type == 0x888e))\n\t\t\t\t\tdump_rx_packet(ptr);\n#endif\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown);\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"validate_recv_data_frame fail! type=0x%x\\n\", type));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\\n\", type);\n\t\t\t#endif\n\t\t\tretval = _FAIL;\n\t\t\tbreak;\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn retval;\n}\n\n\n//remove the wlanhdr and add the eth_hdr\n#if 1\n\nsint wlanhdr_to_ethhdr ( union recv_frame *precvframe);\nsint wlanhdr_to_ethhdr ( union recv_frame *precvframe)\n{\n\tsint\trmv_len;\n\tu16\teth_type, len;\n\tu8\tbsnaphdr;\n\tu8\t*psnap_type;\n\tstruct ieee80211_snap_hdr\t*psnap;\n\t\n\tsint ret=_SUCCESS;\n\t_adapter\t\t\t*adapter =precvframe->u.hdr.adapter;\n\tstruct mlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\n\tu8\t*ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field\n\tstruct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;\n\n_func_enter_;\n\n\tif(pattrib->encrypt){\n\t\trecvframe_pull_tail(precvframe, pattrib->icv_len);\t\n\t}\n\n\tpsnap=(struct ieee80211_snap_hdr\t*)(ptr+pattrib->hdrlen + pattrib->iv_len);\n\tpsnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;\n\t/* convert hdr + possible LLC headers into Ethernet header */\n\t//eth_type = (psnap_type[0] << 8) | psnap_type[1];\n\tif((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&\n\t\t(_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && \n\t\t(_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )||\n\t\t//eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||\n\t\t _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){\n\t\t/* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */\n\t\tbsnaphdr = _TRUE;\n\t}\n\telse {\n\t\t/* Leave Ethernet header part of hdr and full payload */\n\t\tbsnaphdr = _FALSE;\n\t}\n\n\trmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);\n\tlen = precvframe->u.hdr.len - rmv_len;\n\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n===pattrib->hdrlen: %x,  pattrib->iv_len:%x ===\\n\\n\", pattrib->hdrlen,  pattrib->iv_len));\n\n\t_rtw_memcpy(&eth_type, ptr+rmv_len, 2);\n\teth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type\n\tpattrib->eth_type = eth_type;\n\n#ifdef CONFIG_AUTO_AP_MODE\n\tif (0x8899 == pattrib->eth_type)\n\t{\n\t\tstruct sta_info *psta = precvframe->u.hdr.psta;\n\t\t\n\t\tDBG_871X(\"wlan rx: got eth_type=0x%x\\n\", pattrib->eth_type);\t\t\t\t\t\n\t\t\n\t\tif (psta && psta->isrc && psta->pid>0)\n\t\t{\n\t\t\tu16 rx_pid;\n\n\t\t\trx_pid = *(u16*)(ptr+rmv_len+2);\n\t\t\t\n\t\t\tDBG_871X(\"wlan rx(pid=0x%x): sta(\"MAC_FMT\") pid=0x%x\\n\", \n\t\t\t\trx_pid, MAC_ARG(psta->hwaddr), psta->pid);\n\n\t\t\tif(rx_pid == psta->pid)\n\t\t\t{\n\t\t\t\tint i;\n\t\t\t\tu16 len = *(u16*)(ptr+rmv_len+4);\n\t\t\t\t//u16 ctrl_type = *(u16*)(ptr+rmv_len+6);\n\n\t\t\t\t//DBG_871X(\"RC: len=0x%x, ctrl_type=0x%x\\n\", len, ctrl_type); \n\t\t\t\tDBG_871X(\"RC: len=0x%x\\n\", len); \n\n\t\t\t\tfor(i=0;i<len;i++)\n\t\t\t\t\tDBG_871X(\"0x%x\\n\", *(ptr+rmv_len+6+i));\n\t\t\t\t\t//DBG_871X(\"0x%x\\n\", *(ptr+rmv_len+8+i));\n\n\t\t\t\tDBG_871X(\"RC-end\\n\"); \n\t\t\t}\t\t\t\n\t\t}\t\t\n\t}\n#endif //CONFIG_AUTO_AP_MODE\n\n\tif ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))\t   \t\n\t{\n\t\tptr += rmv_len ;\t\n\t\t*ptr = 0x87;\n\t\t*(ptr+1) = 0x12;\n\n\t\teth_type = 0x8712;\n\t\t// append rx status for mp test packets\n\t\tptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24);\n\t\tif (!ptr) {\n\t\t\tret = _FAIL;\n\t\t\tgoto exiting;\n\t\t}\n\t\t_rtw_memcpy(ptr, get_rxmem(precvframe), 24);\n\t\tptr+=24;\n\t}\n\telse {\n\t\tptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0)));\n\t\tif (!ptr) {\n\t\t\tret = _FAIL;\n\t\t\tgoto exiting;\n\t\t}\n\t}\n\n\tif (ptr) {\n\t\t_rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);\n\n\t\tif(!bsnaphdr) {\n\t\t\tlen = htons(len);\n\t\t\t_rtw_memcpy(ptr+12, &len, 2);\n\t\t}\n\t}\n\nexiting:\n_func_exit_;\t\n\treturn ret;\n\n}\n\n#else\n\nsint wlanhdr_to_ethhdr ( union recv_frame *precvframe)\n{\n\tsint rmv_len;\n\tu16 eth_type;\n\tu8\tbsnaphdr;\n\tu8\t*psnap_type;\n\tstruct ieee80211_snap_hdr\t*psnap;\n\n\tsint ret=_SUCCESS;\n\t_adapter\t*adapter =precvframe->u.hdr.adapter;\n\tstruct\tmlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\n\tu8* ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field\n\tstruct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;\n\tstruct _vlan *pvlan = NULL;\n\n_func_enter_;\n\n\tpsnap=(struct ieee80211_snap_hdr\t*)(ptr+pattrib->hdrlen + pattrib->iv_len);\n\tpsnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;\n\tif (psnap->dsap==0xaa && psnap->ssap==0xaa && psnap->ctrl==0x03)\n\t{\n\t\tif (_rtw_memcmp(psnap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN))\n\t\t\tbsnaphdr=_TRUE;//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_RFC1042;\t\n\t\telse if (_rtw_memcmp(psnap->oui, SNAP_HDR_APPLETALK_DDP, WLAN_IEEE_OUI_LEN) &&\n\t\t\t_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_DDP, 2) )\n\t\t\tbsnaphdr=_TRUE;\t//wlan_pkt_format = WLAN_PKT_FORMAT_APPLETALK;\n\t\telse if (_rtw_memcmp( psnap->oui, oui_8021h, WLAN_IEEE_OUI_LEN))\n\t\t\tbsnaphdr=_TRUE;\t//wlan_pkt_format = WLAN_PKT_FORMAT_SNAP_TUNNEL;\n\t\telse {\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"drop pkt due to invalid frame format!\\n\"));\n\t\t\tret= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t} else\n\t\tbsnaphdr=_FALSE;//wlan_pkt_format = WLAN_PKT_FORMAT_OTHERS;\n\n\trmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"===pattrib->hdrlen: %x,  pattrib->iv_len:%x ===\\n\", pattrib->hdrlen,  pattrib->iv_len));\n\n\tif (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)\n\t{\n\t\tptr += rmv_len ;\n\t\t*ptr = 0x87;\n\t\t*(ptr+1) = 0x12;\n\n\t\t//back to original pointer\n\t\tptr -= rmv_len;\n\t}\n\n\tptr += rmv_len ;\n\n\t_rtw_memcpy(&eth_type, ptr, 2);\n\teth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type\n\tptr +=2;\n\n\tif(pattrib->encrypt){\n\t\trecvframe_pull_tail(precvframe, pattrib->icv_len);\n\t}\n\n\tif(eth_type == 0x8100) //vlan\n\t{\n\t\tpvlan = (struct _vlan *) ptr;\n\n\t\t//eth_type = get_vlan_encap_proto(pvlan);\n\t\t//eth_type = pvlan->h_vlan_encapsulated_proto;//?\n\t\trmv_len += 4;\n\t\tptr+=4;\n\t}\n\n\tif(eth_type==0x0800)//ip\n\t{\n\t\t//struct iphdr*  piphdr = (struct iphdr*) ptr;\n\t\t//__u8 tos = (unsigned char)(pattrib->priority & 0xff);\n\n\t\t//piphdr->tos = tos;\n\n\t\t//if (piphdr->protocol == 0x06)\n\t\t//{\n\t\t//\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"@@@===recv tcp len:%d @@@===\\n\", precvframe->u.hdr.len));\n\t\t//}\n\t}\n\telse if(eth_type==0x8712)// append rx status for mp test packets\n\t{\n\t\t//ptr -= 16;\n\t\t//_rtw_memcpy(ptr, get_rxmem(precvframe), 16);\n\t}\n\telse\n\t{\n#ifdef PLATFORM_OS_XP\n\t\tNDIS_PACKET_8021Q_INFO VlanPriInfo;\n\t\tUINT32 UserPriority = precvframe->u.hdr.attrib.priority;\n\t\tUINT32 VlanID = (pvlan!=NULL ? get_vlan_id(pvlan) : 0 );\n\n\t\tVlanPriInfo.Value =          // Get current value.\n\t\t\t\tNDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo);\n\n\t\tVlanPriInfo.TagHeader.UserPriority = UserPriority;\n\t\tVlanPriInfo.TagHeader.VlanId =  VlanID ;\n\n\t\tVlanPriInfo.TagHeader.CanonicalFormatId = 0; // Should be zero.\n\t\tVlanPriInfo.TagHeader.Reserved = 0; // Should be zero.\n\t\tNDIS_PER_PACKET_INFO_FROM_PACKET(precvframe->u.hdr.pkt, Ieee8021QInfo) = VlanPriInfo.Value;\n#endif\n\t}\n\n\tif(eth_type==0x8712)// append rx status for mp test packets\n\t{\n\t\tptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2)-24);\n\t\t_rtw_memcpy(ptr, get_rxmem(precvframe), 24);\n\t\tptr+=24;\n\t}\n\telse\n\t\tptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+2));\n\n\t_rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);\n\t_rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);\n\n\teth_type = htons((unsigned short)eth_type) ;\n\t_rtw_memcpy(ptr+12, &eth_type, 2);\n\nexit:\n\n_func_exit_;\n\n\treturn ret;\n}\n#endif\n\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n#ifdef PLATFORM_LINUX\nstatic void recvframe_expand_pkt(\n\tPADAPTER padapter,\n\tunion recv_frame *prframe)\n{\n\tstruct recv_frame_hdr *pfhdr;\n\t_pkt *ppkt;\n\tu8 shift_sz;\n\tu32 alloc_sz;\n\tu8 *ptr;\n\n\n\tpfhdr = &prframe->u.hdr;\n\n\t//\t6 is for IP header 8 bytes alignment in QoS packet case.\n\tif (pfhdr->attrib.qos)\n\t\tshift_sz = 6;\n\telse\n\t\tshift_sz = 0;\n\n\t// for first fragment packet, need to allocate\n\t// (1536 + RXDESC_SIZE + drvinfo_sz) to reassemble packet\n\t//\t8 is for skb->data 8 bytes alignment.\n//\talloc_sz = _RND(1536 + RXDESC_SIZE + pfhdr->attrib.drvinfosize + shift_sz + 8, 128);\n\talloc_sz = 1664; // round (1536 + 24 + 32 + shift_sz + 8) to 128 bytes alignment\n\n\t//3 1. alloc new skb\n\t// prepare extra space for 4 bytes alignment\n\tppkt = rtw_skb_alloc(alloc_sz);\n\n\tif (!ppkt) return; // no way to expand\n\n\t//3 2. Prepare new skb to replace & release old skb\n\t// force ppkt->data at 8-byte alignment address\n\tskb_reserve(ppkt, 8 - ((SIZE_PTR)ppkt->data & 7));\n\t// force ip_hdr at 8-byte alignment address according to shift_sz\n\tskb_reserve(ppkt, shift_sz);\n\n\t// copy data to new pkt\n\tptr = skb_put(ppkt, pfhdr->len);\n\tif (ptr)\n\t\t_rtw_memcpy(ptr, pfhdr->rx_data, pfhdr->len);\n\n\trtw_skb_free(pfhdr->pkt);\n\n\t// attach new pkt to recvframe\n\tpfhdr->pkt = ppkt;\n\tpfhdr->rx_head = ppkt->head;\n\tpfhdr->rx_data = ppkt->data;\n\tpfhdr->rx_tail = skb_tail_pointer(ppkt);\n\tpfhdr->rx_end = skb_end_pointer(ppkt);\n}\n#else\n#warning \"recvframe_expand_pkt not implement, defrag may crash system\"\n#endif\n#endif\n\n//perform defrag\nunion recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q);\nunion recv_frame * recvframe_defrag(_adapter *adapter,_queue *defrag_q)\n{\n\t_list\t *plist, *phead;\n\tu8\t*data,wlanhdr_offset;\n\tu8\tcurfragnum;\n\tstruct recv_frame_hdr *pfhdr,*pnfhdr;\n\tunion recv_frame* prframe, *pnextrframe;\n\t_queue\t*pfree_recv_queue;\n\n_func_enter_;\n\n\tcurfragnum=0;\n\tpfree_recv_queue=&adapter->recvpriv.free_recv_queue;\n\n\tphead = get_list_head(defrag_q);\n\tplist = get_next(phead);\n\tprframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\tpfhdr=&prframe->u.hdr;\n\trtw_list_delete(&(prframe->u.list));\n\n\tif(curfragnum!=pfhdr->attrib.frag_num)\n\t{\n\t\t//the first fragment number must be 0\n\t\t//free the whole queue\n\t\trtw_free_recvframe(prframe, pfree_recv_queue);\n\t\trtw_free_recvframe_queue(defrag_q, pfree_recv_queue);\n\n\t\treturn NULL;\n\t}\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n#ifndef CONFIG_SDIO_RX_COPY\n\trecvframe_expand_pkt(adapter, prframe);\n#endif\n#endif\n\n\tcurfragnum++;\n\n\tplist= get_list_head(defrag_q);\n\n\tplist = get_next(plist);\n\n\tdata=get_recvframe_data(prframe);\n\n\twhile(rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\n\t\tpnextrframe = LIST_CONTAINOR(plist, union recv_frame , u);\n\t\tpnfhdr=&pnextrframe->u.hdr;\n\n\n\t\t//check the fragment sequence  (2nd ~n fragment frame)\n\n\t\tif(curfragnum!=pnfhdr->attrib.frag_num)\n\t\t{\n\t\t\t//the fragment number must be increasing  (after decache)\n\t\t\t//release the defrag_q & prframe\n\t\t\trtw_free_recvframe(prframe, pfree_recv_queue);\n\t\t\trtw_free_recvframe_queue(defrag_q, pfree_recv_queue);\n\t\t\treturn NULL;\n\t\t}\n\n\t\tcurfragnum++;\n\n\t\t//copy the 2nd~n fragment frame's payload to the first fragment\n\t\t//get the 2nd~last fragment frame's payload\n\n\t\twlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;\n\n\t\trecvframe_pull(pnextrframe, wlanhdr_offset);\n\n\t\t//append  to first fragment frame's tail (if privacy frame, pull the ICV)\n\t\trecvframe_pull_tail(prframe, pfhdr->attrib.icv_len);\n\n\t\t//memcpy\n\t\t_rtw_memcpy(pfhdr->rx_tail, pnfhdr->rx_data, pnfhdr->len);\n\n\t\trecvframe_put(prframe, pnfhdr->len);\n\n\t\tpfhdr->attrib.icv_len=pnfhdr->attrib.icv_len;\n\t\tplist = get_next(plist);\n\n\t};\n\n\t//free the defrag_q queue and return the prframe\n\trtw_free_recvframe_queue(defrag_q, pfree_recv_queue);\n\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"Performance defrag!!!!!\\n\"));\n\n_func_exit_;\n\n\treturn prframe;\n}\n\n//check if need to defrag, if needed queue the frame to defrag_q\nunion recv_frame* recvframe_chk_defrag(PADAPTER padapter, union recv_frame *precv_frame)\n{\n\tu8\tismfrag;\n\tu8\tfragnum;\n\tu8\t*psta_addr;\n\tstruct recv_frame_hdr *pfhdr;\n\tstruct sta_info *psta;\n\tstruct sta_priv *pstapriv;\n\t_list *phead;\n\tunion recv_frame *prtnframe = NULL;\n\t_queue *pfree_recv_queue, *pdefrag_q;\n\n_func_enter_;\n\n\tpstapriv = &padapter->stapriv;\n\n\tpfhdr = &precv_frame->u.hdr;\n\n\tpfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n\n\t//need to define struct of wlan header frame ctrl\n\tismfrag = pfhdr->attrib.mfrag;\n\tfragnum = pfhdr->attrib.frag_num;\n\n\tpsta_addr = pfhdr->attrib.ta;\n\tpsta = rtw_get_stainfo(pstapriv, psta_addr);\n\tif (psta == NULL)\n\t{\n\t\tu8 type = GetFrameType(pfhdr->rx_data);\n\t\tif (type != WIFI_DATA_TYPE) {\n\t\t\tpsta = rtw_get_bcmc_stainfo(padapter);\n\t\t\tpdefrag_q = &psta->sta_recvpriv.defrag_q;\n\t\t} else\n\t\t\tpdefrag_q = NULL;\n\t}\n\telse\n\t\tpdefrag_q = &psta->sta_recvpriv.defrag_q;\n\n\tif ((ismfrag==0) && (fragnum==0))\n\t{\n\t\tprtnframe = precv_frame;//isn't a fragment frame\n\t}\n\n\tif (ismfrag==1)\n\t{\n\t\t//0~(n-1) fragment frame\n\t\t//enqueue to defraf_g\n\t\tif(pdefrag_q != NULL)\n\t\t{\n\t\t\tif(fragnum==0)\n\t\t\t{\n\t\t\t\t//the first fragment\n\t\t\t\tif(_rtw_queue_empty(pdefrag_q) == _FALSE)\n\t\t\t\t{\n\t\t\t\t\t//free current defrag_q\n\t\t\t\t\trtw_free_recvframe_queue(pdefrag_q, pfree_recv_queue);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t//Then enqueue the 0~(n-1) fragment into the defrag_q\n\n\t\t\t//_rtw_spinlock(&pdefrag_q->lock);\n\t\t\tphead = get_list_head(pdefrag_q);\n\t\t\trtw_list_insert_tail(&pfhdr->list, phead);\n\t\t\t//_rtw_spinunlock(&pdefrag_q->lock);\n\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"Enqueuq: ismfrag = %d, fragnum= %d\\n\", ismfrag,fragnum));\n\n\t\t\tprtnframe=NULL;\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//can't find this ta's defrag_queue, so free this recv_frame\n\t\t\trtw_free_recvframe(precv_frame, pfree_recv_queue);\n\t\t\tprtnframe=NULL;\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\\n\", ismfrag, fragnum));\n\t\t}\n\n\t}\n\n\tif((ismfrag==0)&&(fragnum!=0))\n\t{\n\t\t//the last fragment frame\n\t\t//enqueue the last fragment\n\t\tif(pdefrag_q != NULL)\n\t\t{\n\t\t\t//_rtw_spinlock(&pdefrag_q->lock);\n\t\t\tphead = get_list_head(pdefrag_q);\n\t\t\trtw_list_insert_tail(&pfhdr->list,phead);\n\t\t\t//_rtw_spinunlock(&pdefrag_q->lock);\n\n\t\t\t//call recvframe_defrag to defrag\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"defrag: ismfrag = %d, fragnum= %d\\n\", ismfrag, fragnum));\n\t\t\tprecv_frame = recvframe_defrag(padapter, pdefrag_q);\n\t\t\tprtnframe=precv_frame;\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//can't find this ta's defrag_queue, so free this recv_frame\n\t\t\trtw_free_recvframe(precv_frame, pfree_recv_queue);\n\t\t\tprtnframe=NULL;\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"Free because pdefrag_q ==NULL: ismfrag = %d, fragnum= %d\\n\", ismfrag,fragnum));\n\t\t}\n\n\t}\n\n\n\tif((prtnframe!=NULL)&&(prtnframe->u.hdr.attrib.privacy))\n\t{\n\t\t//after defrag we must check tkip mic code\n\t\tif(recvframe_chkmic(padapter,  prtnframe)==_FAIL)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recvframe_chkmic(padapter,  prtnframe)==_FAIL\\n\"));\n\t\t\trtw_free_recvframe(prtnframe,pfree_recv_queue);\n\t\t\tprtnframe=NULL;\n\t\t}\n\t}\n\n_func_exit_;\n\n\treturn prtnframe;\n\n}\n\nint amsdu_to_msdu(_adapter *padapter, union recv_frame *prframe)\n{\n\tint\ta_len, padding_len;\n\tu16\tnSubframe_Length;\t\n\tu8\tnr_subframes, i;\n\tu8\t*pdata;\n\t_pkt *sub_pkt,*subframes[MAX_SUBFRAME_COUNT];\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *pfree_recv_queue = &(precvpriv->free_recv_queue);\n\tint\tret = _SUCCESS;\n\n\tnr_subframes = 0;\n\n\trecvframe_pull(prframe, prframe->u.hdr.attrib.hdrlen);\n\t\n\tif(prframe->u.hdr.attrib.iv_len >0)\n\t{\n\t\trecvframe_pull(prframe, prframe->u.hdr.attrib.iv_len);\n\t}\n\n\ta_len = prframe->u.hdr.len;\n\n\tpdata = prframe->u.hdr.rx_data;\n\n\twhile(a_len > ETH_HLEN) {\n\n\t\t/* Offset 12 denote 2 mac address */\n\t\tnSubframe_Length = RTW_GET_BE16(pdata + 12);\n\n\t\tif( a_len < (ETHERNET_HEADER_SIZE + nSubframe_Length) ) {\n\t\t\tDBG_871X(\"nRemain_Length is %d and nSubframe_Length is : %d\\n\",a_len,nSubframe_Length);\n\t\t\tbreak;\n\t\t}\n\n\t\tsub_pkt = rtw_os_alloc_msdu_pkt(prframe, nSubframe_Length, pdata);\n\t\tif (sub_pkt == NULL) {\n\t\t\tDBG_871X(\"%s(): allocate sub packet fail !!!\\n\",__FUNCTION__);\n\t\t\tbreak;\n\t\t}\n\n\t\t/* move the data point to data content */\n\t\tpdata += ETH_HLEN;\n\t\ta_len -= ETH_HLEN;\n\n\t\tsubframes[nr_subframes++] = sub_pkt;\n\n\t\tif(nr_subframes >= MAX_SUBFRAME_COUNT) {\n\t\t\tDBG_871X(\"ParseSubframe(): Too many Subframes! Packets dropped!\\n\");\n\t\t\tbreak;\n\t\t}\n\n\t\tpdata += nSubframe_Length;\n\t\ta_len -= nSubframe_Length;\n\t\tif(a_len != 0) {\n\t\t\tpadding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4-1));\n\t\t\tif(padding_len == 4) {\n\t\t\t\tpadding_len = 0;\n\t\t\t}\n\n\t\t\tif(a_len < padding_len) {\n\t\t\t\tDBG_871X(\"ParseSubframe(): a_len < padding_len !\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpdata += padding_len;\n\t\t\ta_len -= padding_len;\n\t\t}\n\t}\n\n\tfor(i=0; i<nr_subframes; i++){\n\t\tsub_pkt = subframes[i];\n\n\t\t/* Indicat the packets to upper layer */\n\t\tif (sub_pkt) {\n\t\t\trtw_os_recv_indicate_pkt(padapter, sub_pkt, &prframe->u.hdr.attrib);\n\t\t}\n\t}\n\n\tprframe->u.hdr.len = 0;\n\trtw_free_recvframe(prframe, pfree_recv_queue);//free this recv_frame\n\t\n\treturn ret;\n}\n\nint check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);\nint check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)\n{\n\tPADAPTER padapter = preorder_ctrl->padapter;\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tu8\twsize = preorder_ctrl->wsize_b;\n\tu16\twend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;//% 4096;\n\n\t// Rx Reorder initialize condition.\n\tif (preorder_ctrl->indicate_seq == 0xFFFF)\n\t{\n\t\tpreorder_ctrl->indicate_seq = seq_num;\n\t\t#ifdef DBG_RX_SEQ\n\t\tDBG_871X(\"DBG_RX_SEQ %s:%d init IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\tpreorder_ctrl->indicate_seq, seq_num);\n\t\t#endif\n\n\t\t//DbgPrint(\"check_indicate_seq, 1st->indicate_seq=%d\\n\", precvpriv->indicate_seq);\n\t}\n\n\t//DbgPrint(\"enter->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\\n\", precvpriv->indicate_seq, seq_num);\n\n\t// Drop out the packet which SeqNum is smaller than WinStart\n\tif( SN_LESS(seq_num, preorder_ctrl->indicate_seq) )\n\t{\n\t\t//RT_TRACE(COMP_RX_REORDER, DBG_LOUD, (\"CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\\n\", pTS->RxIndicateSeq, NewSeqNum));\n\t\t//DbgPrint(\"CheckRxTsIndicateSeq(): Packet Drop! IndicateSeq: %d, NewSeq: %d\\n\", precvpriv->indicate_seq, seq_num);\n\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"%s IndicateSeq: %d > NewSeq: %d\\n\", __FUNCTION__, \n\t\t\tpreorder_ctrl->indicate_seq, seq_num);\n\t\t#endif\n\n\n\t\treturn _FALSE;\n\t}\n\n\t//\n\t// Sliding window manipulation. Conditions includes:\n\t// 1. Incoming SeqNum is equal to WinStart =>Window shift 1\n\t// 2. Incoming SeqNum is larger than the WinEnd => Window shift N\n\t//\n\tif( SN_EQUAL(seq_num, preorder_ctrl->indicate_seq) )\n\t{\n\t\tpreorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;\n\n\t\t#ifdef DBG_RX_SEQ\n\t\tDBG_871X(\"DBG_RX_SEQ %s:%d SN_EQUAL IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\tpreorder_ctrl->indicate_seq, seq_num);\n\t\t#endif\n\t}\n\telse if(SN_LESS(wend, seq_num))\n\t{\n\t\t//RT_TRACE(COMP_RX_REORDER, DBG_LOUD, (\"CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\\n\", pTS->RxIndicateSeq, NewSeqNum));\n\t\t//DbgPrint(\"CheckRxTsIndicateSeq(): Window Shift! IndicateSeq: %d, NewSeq: %d\\n\", precvpriv->indicate_seq, seq_num);\n\n\t\t// boundary situation, when seq_num cross 0xFFF\n\t\tif(seq_num >= (wsize - 1))\n\t\t\tpreorder_ctrl->indicate_seq = seq_num + 1 -wsize;\n\t\telse\n\t\t\tpreorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;\n\t\tpdbgpriv->dbg_rx_ampdu_window_shift_cnt++;\n\t\t#ifdef DBG_RX_SEQ\n\t\tDBG_871X(\"DBG_RX_SEQ %s:%d SN_LESS(wend, seq_num) IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\tpreorder_ctrl->indicate_seq, seq_num);\n\t\t#endif\n\t}\n\n\t//DbgPrint(\"exit->check_indicate_seq(): IndicateSeq: %d, NewSeq: %d\\n\", precvpriv->indicate_seq, seq_num);\n\n\treturn _TRUE;\n}\n\nint enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe);\nint enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union recv_frame *prframe)\n{\n\tstruct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n\t_queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;\n\t_list\t*phead, *plist;\n\tunion recv_frame *pnextrframe;\n\tstruct rx_pkt_attrib *pnextattrib;\n\n\t//DbgPrint(\"+enqueue_reorder_recvframe()\\n\");\n\n\t//_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t//_rtw_spinlock_ex(&ppending_recvframe_queue->lock);\n\n\n\tphead = get_list_head(ppending_recvframe_queue);\n\tplist = get_next(phead);\n\n\twhile(rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\n\t\tpnextrframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\t\tpnextattrib = &pnextrframe->u.hdr.attrib;\n\n\t\tif(SN_LESS(pnextattrib->seq_num, pattrib->seq_num))\n\t\t{\n\t\t\tplist = get_next(plist);\n\t\t}\n\t\telse if( SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num))\n\t\t{\n\t\t\t//Duplicate entry is found!! Do not insert current entry.\n\t\t\t//RT_TRACE(COMP_RX_REORDER, DBG_TRACE, (\"InsertRxReorderList(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\\n\", pTS->RxIndicateSeq, SeqNum));\n\n\t\t\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\n\t\t\treturn _FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\n\t\t//DbgPrint(\"enqueue_reorder_recvframe():while\\n\");\n\n\t}\n\n\n\t//_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t//_rtw_spinlock_ex(&ppending_recvframe_queue->lock);\n\n\trtw_list_delete(&(prframe->u.hdr.list));\n\n\trtw_list_insert_tail(&(prframe->u.hdr.list), plist);\n\n\t//_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);\n\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\n\n\t//RT_TRACE(COMP_RX_REORDER, DBG_TRACE, (\"InsertRxReorderList(): Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\\n\", pTS->RxIndicateSeq, SeqNum));\n\treturn _TRUE;\n\n}\n\nvoid recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq);\nvoid recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq)\n{\n\tif(current_seq < prev_seq)\n\t{\n\t\tpdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);\n\n\t}\n\telse\n\t{\n\t\tpdbgpriv->dbg_rx_ampdu_loss_count+= (current_seq - prev_seq);\n\t}\n}\nint recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced);\nint recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *preorder_ctrl, int bforced)\n{\n\t//_irqL irql;\n\t//u8 bcancelled;\n\t_list\t*phead, *plist;\n\tunion recv_frame *prframe;\n\tstruct rx_pkt_attrib *pattrib;\n\t//u8 index = 0;\n\tint bPktInBuf = _FALSE;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\n\tDBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder);\n\n\t//DbgPrint(\"+recv_indicatepkts_in_order\\n\");\n\n\t//_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t//_rtw_spinlock_ex(&ppending_recvframe_queue->lock);\n\n\tphead = \tget_list_head(ppending_recvframe_queue);\n\tplist = get_next(phead);\n\n#if 0\n\t// Check if there is any other indication thread running.\n\tif(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING)\n\t\treturn;\n#endif\n\n\t// Handling some condition for forced indicate case.\n\tif(bforced==_TRUE)\n\t{\n\t\tpdbgpriv->dbg_rx_ampdu_forced_indicate_count++;\n\t\tif(rtw_is_list_empty(phead))\n\t\t{\n\t\t\t// _exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t\t\t//_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);\n\t\t\treturn _TRUE;\n\t\t}\n\t\n\t\tprframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\t\tpattrib = &prframe->u.hdr.attrib;\t\n\n\t\t#ifdef DBG_RX_SEQ\n\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t#endif\n\t\trecv_indicatepkts_pkt_loss_cnt(pdbgpriv,preorder_ctrl->indicate_seq,pattrib->seq_num);\n\t\tpreorder_ctrl->indicate_seq = pattrib->seq_num;\t\t\n\t\t\n\t}\n\n\t// Prepare indication list and indication.\n\t// Check if there is any packet need indicate.\n\twhile(!rtw_is_list_empty(phead))\n\t{\n\t\n\t\tprframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\t\tpattrib = &prframe->u.hdr.attrib;\n\n\t\tif(!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num))\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,\n\t\t\t\t (\"recv_indicatepkts_in_order: indicate=%d seq=%d amsdu=%d\\n\",\n\t\t\t\t  preorder_ctrl->indicate_seq, pattrib->seq_num, pattrib->amsdu));\n\n#if 0\n\t\t\t// This protect buffer from overflow.\n\t\t\tif(index >= REORDER_WIN_SIZE)\n\t\t\t{\n\t\t\t\tRT_ASSERT(FALSE, (\"IndicateRxReorderList(): Buffer overflow!! \\n\"));\n\t\t\t\tbPktInBuf = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\n\t\t\tplist = get_next(plist);\n\t\t\trtw_list_delete(&(prframe->u.hdr.list));\n\n\t\t\tif(SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num))\n\t\t\t{\n\t\t\t\tpreorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1) & 0xFFF;\n\t\t\t\t#ifdef DBG_RX_SEQ\n\t\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t\t\t#endif\n\t\t\t}\n\n#if 0\n\t\t\tindex++;\n\t\t\tif(index==1)\n\t\t\t{\n\t\t\t\t//Cancel previous pending timer.\n\t\t\t\t//PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer);\n\t\t\t\tif(bforced!=_TRUE)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\\n\");\n\t\t\t\t\t_cancel_timer(&preorder_ctrl->reordering_ctrl_timer, &bcancelled);\n\t\t\t\t}\n\t\t\t}\n#endif\n\n\t\t\t//Set this as a lock to make sure that only one thread is indicating packet.\n\t\t\t//pTS->RxIndicateState = RXTS_INDICATE_PROCESSING;\n\n\t\t\t// Indicate packets\n\t\t\t//RT_ASSERT((index<=REORDER_WIN_SIZE), (\"RxReorderIndicatePacket(): Rx Reorder buffer full!! \\n\"));\n\n\n\t\t\t//indicate this recv_frame\n\t\t\t//DbgPrint(\"recv_indicatepkts_in_order, indicate_seq=%d, seq_num=%d\\n\", precvpriv->indicate_seq, pattrib->seq_num);\n\t\t\tif(!pattrib->amsdu)\n\t\t\t{\n\t\t\t\t//DBG_871X(\"recv_indicatepkts_in_order, amsdu!=1, indicate_seq=%d, seq_num=%d\\n\", preorder_ctrl->indicate_seq, pattrib->seq_num);\n\n\t\t\t\tif (!RTW_CANNOT_RUN(padapter))\n\t\t\t\t\trtw_recv_indicatepkt(padapter, prframe);/*indicate this recv_frame*/\n\n\t\t\t}\n\t\t\telse if(pattrib->amsdu==1)\n\t\t\t{\n\t\t\t\tif(amsdu_to_msdu(padapter, prframe)!=_SUCCESS)\n\t\t\t\t{\n\t\t\t\t\trtw_free_recvframe(prframe, &precvpriv->free_recv_queue);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//error condition;\n\t\t\t}\n\n\n\t\t\t//Update local variables.\n\t\t\tbPktInBuf = _FALSE;\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbPktInBuf = _TRUE;\n\t\t\tbreak;\n\t\t}\n\n\t\t//DbgPrint(\"recv_indicatepkts_in_order():while\\n\");\n\n\t}\n\n\t//_rtw_spinunlock_ex(&ppending_recvframe_queue->lock);\n\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\n/*\n\t//Release the indication lock and set to new indication step.\n\tif(bPktInBuf)\n\t{\n\t\t// Set new pending timer.\n\t\t//pTS->RxIndicateState = RXTS_INDICATE_REORDER;\n\t\t//PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime);\n\t\t//DBG_871X(\"_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME)\\n\");\n\t\t_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);\n\t}\n\telse\n\t{\n\t\t//pTS->RxIndicateState = RXTS_INDICATE_IDLE;\n\t}\n*/\n\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\n\t//return _TRUE;\n\treturn bPktInBuf;\n\n}\n\nint recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe);\nint recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)\n{\n\t_irqL irql;\n\tint retval = _SUCCESS;\n\tstruct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n\tstruct recv_reorder_ctrl *preorder_ctrl = prframe->u.hdr.preorder_ctrl;\n\t_queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\n\tDBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder);\n\n\tif(!pattrib->amsdu)\n\t{\n\t\t//s1.\n                retval = wlanhdr_to_ethhdr(prframe);\n                if (retval != _SUCCESS)\n                {\n                        RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"wlanhdr_to_ethhdr: drop pkt \\n\"));\n                        #ifdef DBG_RX_DROP_FRAME\n                        DBG_871X(\"DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\\n\", __FUNCTION__);\n                        #endif\n                        return retval;\n                }\n\n\t\t//if ((pattrib->qos!=1) /*|| pattrib->priority!=0 || IS_MCAST(pattrib->ra)*/\n\t\t//\t|| (pattrib->eth_type==0x0806) || (pattrib->ack_policy!=0))\n\t\tif (pattrib->qos!=1)\n\t\t{\n\t\t\tif (!RTW_CANNOT_RUN(padapter)) {\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"@@@@  recv_indicatepkt_reorder -recv_func recv_indicatepkt\\n\" ));\n\n\t\t\t\trtw_recv_indicatepkt(padapter, prframe);\n\t\t\t\treturn _SUCCESS;\n\n\t\t\t}\n\t\t\t\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s pattrib->qos !=1\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\t\n\t\t\treturn _FAIL;\n\t\t\n\t\t}\n\n\t\tif (preorder_ctrl->enable == _FALSE)\n\t\t{\n\t\t\t//indicate this recv_frame\t\t\t\n\t\t\tpreorder_ctrl->indicate_seq = pattrib->seq_num;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t\t#endif\n\t\t\t\n\t\t\trtw_recv_indicatepkt(padapter, prframe);\t\t\n\t\t\t\n\t\t\tpreorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t\t#endif\n\t\t\t\n\t\t\treturn _SUCCESS;\t\n\t\t}\t\t\t\n\n#ifndef CONFIG_RECV_REORDERING_CTRL\n\t\t//indicate this recv_frame\n\t\trtw_recv_indicatepkt(padapter, prframe);\n\t\treturn _SUCCESS;\n#endif\n\n\t}\n\telse if(pattrib->amsdu==1) //temp filter -> means didn't support A-MSDUs in a A-MPDU\n\t{\n\t\tif (preorder_ctrl->enable == _FALSE)\n\t\t{\n\t\t\tpreorder_ctrl->indicate_seq = pattrib->seq_num;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t\t#endif\n\n\t\t\tretval = amsdu_to_msdu(padapter, prframe);\n\n\t\t\tpreorder_ctrl->indicate_seq = (preorder_ctrl->indicate_seq + 1)%4096;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, NewSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq, pattrib->seq_num);\n\t\t\t#endif\n\n\t\t\tif(retval != _SUCCESS){\n\t\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\\n\", __FUNCTION__);\n\t\t\t\t#endif\n\t\t\t}\n\n\t\t\treturn retval;\n\t\t}\n\t}\n\telse\n\t{\n\n\t}\n\n\t_enter_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\n\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,\n\t\t (\"recv_indicatepkt_reorder: indicate=%d seq=%d\\n\",\n\t\t  preorder_ctrl->indicate_seq, pattrib->seq_num));\n\n\t//s2. check if winstart_b(indicate_seq) needs to been updated\n\tif(!check_indicate_seq(preorder_ctrl, pattrib->seq_num))\n\t{\n\t\tpdbgpriv->dbg_rx_ampdu_drop_count++;\n\t\t//pHTInfo->RxReorderDropCounter++;\n\t\t//ReturnRFDList(Adapter, pRfd);\n\t\t//RT_TRACE(COMP_RX_REORDER, DBG_TRACE, (\"RxReorderIndicatePacket() ==> Packet Drop!!\\n\"));\n\t\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t\t//return _FAIL;\n\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s check_indicate_seq fail\\n\", __FUNCTION__);\n\t\t#endif\n#if 0\t\t\n\t\trtw_recv_indicatepkt(padapter, prframe);\n\n\t\t_exit_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\t\t\n\t\tgoto _success_exit;\n#else\n\t\tgoto _err_exit;\n#endif\n\t}\n\n\n\t//s3. Insert all packet into Reorder Queue to maintain its ordering.\n\tif(!enqueue_reorder_recvframe(preorder_ctrl, prframe))\n\t{\n\t\t//DbgPrint(\"recv_indicatepkt_reorder, enqueue_reorder_recvframe fail!\\n\");\n\t\t//_exit_critical_ex(&ppending_recvframe_queue->lock, &irql);\n\t\t//return _FAIL;\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s enqueue_reorder_recvframe fail\\n\", __FUNCTION__);\n\t\t#endif\n\t\tgoto _err_exit;\n\t}\n\n\n\t//s4.\n\t// Indication process.\n\t// After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets\n\t// with the SeqNum smaller than latest WinStart and buffer other packets.\n\t//\n\t// For Rx Reorder condition:\n\t// 1. All packets with SeqNum smaller than WinStart => Indicate\n\t// 2. All packets with SeqNum larger than or equal to WinStart => Buffer it.\n\t//\n\n\t//recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE);\n\tif(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE)\n\t{\n\t\t_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);\n\t\t_exit_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\t}\n\telse\n\t{\n\t\t_exit_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\t\t_cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);\n\t}\n\n\n_success_exit:\n\n\treturn _SUCCESS;\n\n_err_exit:\n\n        _exit_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\n\treturn _FAIL;\n}\n\n\nvoid rtw_reordering_ctrl_timeout_handler(void *pcontext)\n{\n\t_irqL irql;\n\tstruct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)pcontext;\n\t_adapter *padapter = preorder_ctrl->padapter;\n\t_queue *ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;\n\n\n\tif (RTW_CANNOT_RUN(padapter))\n\t\treturn;\n\n\t//DBG_871X(\"+rtw_reordering_ctrl_timeout_handler()=>\\n\");\n\n\t_enter_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\n\tif(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE)\n\t{\n\t\t_set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME);\t\t\n\t}\n\n\t_exit_critical_bh(&ppending_recvframe_queue->lock, &irql);\n\n}\n\nint process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe);\nint process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)\n{\n\tint retval = _SUCCESS;\n\t//struct recv_priv *precvpriv = &padapter->recvpriv;\n\t//struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n#ifdef CONFIG_TDLS\n\tstruct sta_info *psta = prframe->u.hdr.psta;\n#endif //CONFIG_TDLS\n\n#ifdef CONFIG_80211N_HT\n\n\tstruct ht_priv\t*phtpriv = &pmlmepriv->htpriv;\n\t\n\tDBG_COUNTER(padapter->rx_logs.core_rx_post_indicate);\n\n#ifdef CONFIG_TDLS\n\tif( (phtpriv->ht_option==_TRUE) ||\n\t\t((psta->tdls_sta_state & TDLS_LINKED_STATE) && \n\t\t (psta->htpriv.ht_option==_TRUE) &&\n\t\t (psta->htpriv.ampdu_enable==_TRUE))) //B/G/N Mode\n#else\n\tif(phtpriv->ht_option==_TRUE)  //B/G/N Mode\n#endif //CONFIG_TDLS\n\t{\n\t\t//prframe->u.hdr.preorder_ctrl = &precvpriv->recvreorder_ctrl[pattrib->priority];\n\n\t\tif(recv_indicatepkt_reorder(padapter, prframe)!=_SUCCESS)// including perform A-MPDU Rx Ordering Buffer Control\n\t\t{\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s recv_indicatepkt_reorder error!\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\n\t\t\tif (!RTW_CANNOT_RUN(padapter))\t{\n\t\t\t\tretval = _FAIL;\n\t\t\t\treturn retval;\n\t\t\t}\n\t\t}\n\t}\n\telse //B/G mode\n#endif\n\t{\n\t\tretval=wlanhdr_to_ethhdr (prframe);\n\t\tif(retval != _SUCCESS)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"wlanhdr_to_ethhdr: drop pkt \\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr error!\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\treturn retval;\n\t\t}\n\n\t\tif (!RTW_CANNOT_RUN(padapter)) {\n\t\t\t//indicate this recv_frame\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\\n\" ));\n\t\t\trtw_recv_indicatepkt(padapter, prframe);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\\n\" ));\n\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_notice_, (\"recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\"\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"));\n\t\t\tretval = _FAIL;\n\t\t\treturn retval;\n\t\t}\n\n\t}\n\n\treturn retval;\n\n}\n\n#ifdef CONFIG_MP_INCLUDED\nint validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame)\n{\n\tint ret = _SUCCESS;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\t\n\tu8 type,subtype;\n\n\tif(!adapter->mppriv.bmac_filter)\t\n\t\treturn ret;\n#if 0\t\n\tif (1){\n\t\tu8 bDumpRxPkt;\n\t\ttype =  GetFrameType(ptr);\n\t\tsubtype = GetFrameSubType(ptr); //bit(7)~bit(2)\t\n\t\t\n\t\trtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));\n\t\tif(bDumpRxPkt ==1){//dump all rx packets\n\t\t\tint i;\n\t\t\tDBG_871X(\"############ type:0x%02x subtype:0x%02x ################# \\n\",type,subtype);\n\t\t\t\n\t\t\tfor(i=0; i<64;i=i+8)\n\t\t\t\tDBG_871X(\"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\\n\", *(ptr+i),\n\t\t\t\t*(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));\n\t\t\tDBG_871X(\"############################# \\n\");\n\t\t}\n\t}\n#endif\t\t\n\n\tif(_rtw_memcmp( GetAddr2Ptr(ptr), adapter->mppriv.mac_filter, ETH_ALEN) == _FALSE )\n\t\tret = _FAIL;\n\n\treturn ret;\n}\n#endif\n\nstatic sint MPwlanhdr_to_ethhdr ( union recv_frame *precvframe)\n{\n\tsint\trmv_len;\n\tu16 eth_type, len;\n\tu8\tbsnaphdr;\n\tu8\t*psnap_type;\n\tu8 mcastheadermac[]={0x01,0x00,0x5e};\n\t\n\tstruct ieee80211_snap_hdr\t*psnap;\n\t\n\tsint ret=_SUCCESS;\n\t_adapter\t\t\t*adapter =precvframe->u.hdr.adapter;\n\tstruct mlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\n\tu8\t*ptr = get_recvframe_data(precvframe) ; // point to frame_ctrl field\n\tstruct rx_pkt_attrib *pattrib = & precvframe->u.hdr.attrib;\n\n_func_enter_;\n\n\tif(pattrib->encrypt){\n\t\trecvframe_pull_tail(precvframe, pattrib->icv_len);\t\n\t}\n\n\tpsnap=(struct ieee80211_snap_hdr\t*)(ptr+pattrib->hdrlen + pattrib->iv_len);\n\tpsnap_type=ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;\n\t/* convert hdr + possible LLC headers into Ethernet header */\n\t//eth_type = (psnap_type[0] << 8) | psnap_type[1];\n\tif((_rtw_memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&\n\t\t(_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == _FALSE) && \n\t\t(_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_APPLETALK_AARP, 2)==_FALSE) )||\n\t\t//eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||\n\t\t _rtw_memcmp(psnap, rtw_bridge_tunnel_header, SNAP_SIZE)){\n\t\t/* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */\n\t\tbsnaphdr = _TRUE;\n\t}\n\telse {\n\t\t/* Leave Ethernet header part of hdr and full payload */\n\t\tbsnaphdr = _FALSE;\n\t}\n\n\trmv_len = pattrib->hdrlen + pattrib->iv_len +(bsnaphdr?SNAP_SIZE:0);\n\tlen = precvframe->u.hdr.len - rmv_len;\n\n\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"\\n===pattrib->hdrlen: %x,  pattrib->iv_len:%x ===\\n\\n\", pattrib->hdrlen,\tpattrib->iv_len));\n\n\t_rtw_memcpy(&eth_type, ptr+rmv_len, 2);\n\teth_type= ntohs((unsigned short )eth_type); //pattrib->ether_type\n\tpattrib->eth_type = eth_type;\n\n\t{\n\t\tptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr)+ (bsnaphdr?2:0)));\n\t}\n\n\t_rtw_memcpy(ptr, pattrib->dst, ETH_ALEN);\n\t_rtw_memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);\n\n\tif(!bsnaphdr) {\n\t\tlen = htons(len);\n\t\t_rtw_memcpy(ptr+12, &len, 2);\n\t}\n\t\n\n\t\tlen = htons(pattrib->seq_num);\n\t\t//DBG_871X(\"wlan seq = %d ,seq_num =%x\\n\",len,pattrib->seq_num);\n\t\t_rtw_memcpy(ptr+12,&len, 2);\n\tif(adapter->mppriv.bRTWSmbCfg==_TRUE)\n\t{\n//\t\tif(_rtw_memcmp(mcastheadermac, pattrib->dst, 3) == _TRUE)//SimpleConfig Dest.\n//\t\t\t_rtw_memcpy(ptr+ETH_ALEN, pattrib->bssid, ETH_ALEN);\n\n\t\tif(_rtw_memcmp(mcastheadermac, pattrib->bssid, 3) == _TRUE) //SimpleConfig Dest.\n\t\t\t_rtw_memcpy(ptr, pattrib->bssid, ETH_ALEN);\n\n\t}\n\n\t\n_func_exit_;\t\n\treturn ret;\n\n}\n\n\nint mp_recv_frame(_adapter *padapter, union recv_frame *rframe)\n{\n\tint ret = _SUCCESS;\n\tstruct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n#ifdef CONFIG_MP_INCLUDED\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n#endif //CONFIG_MP_INCLUDED\n\tu8 type;\n\tu8 *ptr = rframe->u.hdr.rx_data;\n\tu8 *psa, *pda, *pbssid;\n\tstruct sta_info *psta = NULL;\n    \tDBG_COUNTER(padapter->rx_logs.core_rx_pre);\n    \t\n\tif ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) )//&&(padapter->mppriv.check_mp_pkt == 0))\n\t{\n\t\tif (pattrib->crc_err == 1){\n\t\t\tpadapter->mppriv.rx_crcerrpktcount++;\n\t\t}\n\t\telse{\n\t\t\tif(_SUCCESS == validate_mp_recv_frame(padapter, rframe))\n\t\t\t\tpadapter->mppriv.rx_pktcount++;\n\t\t\telse\n\t\t\t\tpadapter->mppriv.rx_pktcount_filter_out++;\n\t\t}\n\n\t\tif(pmppriv->rx_bindicatePkt == _FALSE)\n\t\t{\n\t\t\t//RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, (\"MP - Not in loopback mode , drop pkt \\n\"));\n\t\t\tret = _FAIL;\n\t\t\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\t\t\tgoto exit;\n\t\t}\n\t\telse \n\t\t{\t\t\t\t\n\t\t\ttype =\tGetFrameType(ptr);\n\t\t\tpattrib->to_fr_ds = get_tofr_ds(ptr);\n\t\t\tpattrib->frag_num = GetFragNum(ptr);\n\t\t\tpattrib->seq_num = GetSequence(ptr);\n\t\t\tpattrib->pw_save = GetPwrMgt(ptr);\n\t\t\tpattrib->mfrag = GetMFrag(ptr);\n\t\t\tpattrib->mdata = GetMData(ptr);\n\t\t\tpattrib->privacy = GetPrivacy(ptr);\n\t\t\tpattrib->order = GetOrder(ptr);\n\t\n\t\t\tif(type ==WIFI_DATA_TYPE)\n\t\t\t{\n\t\t\t\tpda = get_da(ptr);\n\t\t\t\tpsa = get_sa(ptr);\n\t\t\t\tpbssid = get_hdr_bssid(ptr);\n\t\t\t\t\n\t\t\t\t_rtw_memcpy(pattrib->dst, pda, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->src, psa, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->bssid, pbssid, ETH_ALEN);\n\t\t\t\n\t\t\tswitch(pattrib->to_fr_ds)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\t\tret = sta2sta_data_frame(padapter, rframe, &psta);\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\n\t\t\t\t_rtw_memcpy(pattrib->ra, pda, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->ta, pbssid, ETH_ALEN);\n\t\t\t\tret = ap2sta_data_frame(padapter, rframe, &psta);\n\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_rtw_memcpy(pattrib->ra, pbssid, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->ta, psa, ETH_ALEN);\n\t\t\t\tret = sta2ap_data_frame(padapter, rframe, &psta);\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_rtw_memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN);\n\t\t\t\tret =_FAIL;\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" case 3\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tret =_FAIL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\tret = MPwlanhdr_to_ethhdr (rframe);\n\t\t\t\t\n\t\t\tif (ret != _SUCCESS)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"wlanhdr_to_ethhdr: drop pkt \\n\"));\n\t\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\\n\", __FUNCTION__);\n\t\t\t\t#endif\n\t\t\t\t\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\t\t\t\t\tret = _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\tif (!RTW_CANNOT_RUN(padapter)) {\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, (\"@@@@ recv_func: recv_func rtw_recv_indicatepkt\\n\" ));\n\t\t\t\t\t\t\t//indicate this recv_frame\n\t\t\t\t\tret = rtw_recv_indicatepkt(padapter, rframe);\n\t\t\t\t\tif (ret != _SUCCESS)\n\t\t\t\t\t{\t\n\t\t\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\t\t\t\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\\n\", __FUNCTION__);\n\t\t\t\t\t#endif\n\t\t\t\t\t\t\t\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\t\t\t\t\t\t\t\tret = _FAIL;\n\n\t\t\t\t\t\t\t\tgoto exit;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, (\"@@@@  recv_func: rtw_free_recvframe\\n\" ));\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, (\"recv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\"\n\t\t\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"));\n\t\t\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\t\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\\n\", __func__,\n\t\t\t\t\t\t\t\t\trtw_is_drv_stopped(padapter)?\"True\":\"False\",\n\t\t\t\t\t\t\t\t\trtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\t\t\t\t#endif\n\t\t\t\t\tret = _FAIL;\n\t\t\t\t\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\t\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t}\n\n\tRT_TRACE(_module_rtl871x_recv_c_, _drv_info_, (\"recv_func: validate_recv_frame fail! drop pkt\\n\"));\n\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\tret = _FAIL;\n\nexit:\n\t\treturn ret;\n\n}\n\nstatic sint fill_radiotap_hdr(_adapter *padapter, union recv_frame *precvframe, u8 *buf)\n{\n#define CHAN2FREQ(a) ((a < 14)?(2407+5*a):(5000+5*a))\n\n#if 0\n#define RTW_RX_RADIOTAP_PRESENT (                 \\\n\t\t(1 << IEEE80211_RADIOTAP_TSFT)              | \\\n\t\t(1 << IEEE80211_RADIOTAP_FLAGS)             | \\\n\t\t(1 << IEEE80211_RADIOTAP_RATE)              | \\\n\t\t(1 << IEEE80211_RADIOTAP_CHANNEL)           | \\\n\t\t(0 << IEEE80211_RADIOTAP_FHSS)              | \\\n\t\t(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)     | \\\n\t\t(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)      | \\\n\t\t(0 << IEEE80211_RADIOTAP_LOCK_QUALITY)      | \\\n\t\t(0 << IEEE80211_RADIOTAP_TX_ATTENUATION)    | \\\n\t\t(0 << IEEE80211_RADIOTAP_DB_TX_ATTENUATION) | \\\n\t\t(0 << IEEE80211_RADIOTAP_DBM_TX_POWER)      | \\\n\t\t(1 << IEEE80211_RADIOTAP_ANTENNA)           | \\\n\t\t(1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)      | \\\n\t\t(0 << IEEE80211_RADIOTAP_DB_ANTNOISE)       | \\\n\t\t(0 << IEEE80211_RADIOTAP_RX_FLAGS)          | \\\n\t\t(0 << IEEE80211_RADIOTAP_TX_FLAGS)          | \\\n\t\t(0 << IEEE80211_RADIOTAP_RTS_RETRIES)       | \\\n\t\t(0 << IEEE80211_RADIOTAP_DATA_RETRIES)      | \\\n\t\t(0 << IEEE80211_RADIOTAP_MCS)               | \\\n\t\t(0 << IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE)| \\\n\t\t(0 << IEEE80211_RADIOTAP_VENDOR_NAMESPACE)  | \\\n\t\t(0 << IEEE80211_RADIOTAP_EXT)               | \\\n\t\t0)\n\n\t/* (0 << IEEE80211_RADIOTAP_AMPDU_STATUS)      | \\ */\n\t/* (0 << IEEE80211_RADIOTAP_VHT)               | \\ */\n#endif\n#ifndef IEEE80211_RADIOTAP_MCS\n#define IEEE80211_RADIOTAP_MCS 19\n#endif\n#ifndef IEEE80211_RADIOTAP_VHT\n#define IEEE80211_RADIOTAP_VHT 21\n#endif\n\n#ifndef IEEE80211_RADIOTAP_F_BADFCS\n#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* bad FCS */\n#endif\n\n\tsint ret = _SUCCESS;\n\t_adapter\t\t\t*adapter = precvframe->u.hdr.adapter;\n\tstruct mlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tstruct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;\n\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);\n\n\tu16 tmp_16bit = 0;\n\n\tu8 data_rate[] = {\n\t\t2, 4, 11, 22, /* CCK */\n\t\t12, 18, 24, 36, 48, 72, 93, 108, /* OFDM */\n\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* HT MCS index */\n\t\t16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 1 */\n\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 2 */\n\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 3 */\n\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* VHT Nss 4 */\n\t};\n\n\t_pkt *pskb = NULL;\n\n\tstruct ieee80211_radiotap_header *rtap_hdr = NULL;\n\tu8 *ptr = NULL;\n\n\tu8 hdr_buf[64] = {0};\n\tu16 rt_len = 8;\n\n\t/* create header */\n\trtap_hdr = (struct ieee80211_radiotap_header *)&hdr_buf[0];\n\trtap_hdr->it_version = PKTHDR_RADIOTAP_VERSION;\n\n\t/* tsft */\n\tif (pattrib->tsfl) {\n\t\tu64 tmp_64bit;\n\n\t\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_TSFT);\n\t\ttmp_64bit = cpu_to_le64(pattrib->tsfl);\n\t\tmemcpy(&hdr_buf[rt_len], &tmp_64bit, 8);\n\t\trt_len += 8;\n\t}\n\n\t/* flags */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_FLAGS);\n\tif (0)\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_CFP;\n\n\tif (0)\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_SHORTPRE;\n\n\tif ((pattrib->encrypt == 1) || (pattrib->encrypt == 5))\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_WEP;\n\n\tif (pattrib->mfrag)\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FRAG;\n\n#ifndef CONFIG_RX_PACKET_APPEND_FCS\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_FCS;\n#endif\n\n\tif (0)\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_DATAPAD;\n\n\tif (pattrib->crc_err)\n\t\thdr_buf[rt_len] |= IEEE80211_RADIOTAP_F_BADFCS;\n\n\tif (pattrib->sgi) {\n\t\t/* Currently unspecified but used */\n\t\thdr_buf[rt_len] |= 0x80;\n\t}\n\trt_len += 1;\n\n\t/* rate */\n\tif (pattrib->data_rate < 12) {\n\t\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RATE);\n\t\tif (pattrib->data_rate < 4) {\n\t\t\t/* CCK */\n\t\t\thdr_buf[rt_len] = data_rate[pattrib->data_rate];\n\t\t} else {\n\t\t\t/* OFDM */\n\t\t\thdr_buf[rt_len] = data_rate[pattrib->data_rate];\n\t\t}\n\t}\n\trt_len += 1; /* force padding 1 byte for aligned */\n\n\t/* channel */\n\ttmp_16bit = 0;\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_CHANNEL);\n\ttmp_16bit = CHAN2FREQ(rtw_get_oper_ch(padapter));\n\t/*tmp_16bit = CHAN2FREQ(pHalData->CurrentChannel);*/\n\tmemcpy(&hdr_buf[rt_len], &tmp_16bit, 2);\n\trt_len += 2;\n\n\t/* channel flags */\n\ttmp_16bit = 0;\n\tif (pHalData->CurrentBandType == 0) \n\t\ttmp_16bit |= cpu_to_le16(IEEE80211_CHAN_2GHZ);\n\telse \n\t\ttmp_16bit |= cpu_to_le16(IEEE80211_CHAN_5GHZ);\n\n\tif (pattrib->data_rate < 12) {\n\t\tif (pattrib->data_rate < 4) {\n\t\t\t/* CCK */\n\t\t\ttmp_16bit |= cpu_to_le16(IEEE80211_CHAN_CCK);\n\t\t} else {\n\t\t\t/* OFDM */\n\t\t\ttmp_16bit |= cpu_to_le16(IEEE80211_CHAN_OFDM);\n\t\t}\n\t} else {\n\t\ttmp_16bit |= cpu_to_le16(IEEE80211_CHAN_DYN);\n\t}\n\tmemcpy(&hdr_buf[rt_len], &tmp_16bit, 2);\n\trt_len += 2;\n\n\t/* dBm Antenna Signal */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);\n\thdr_buf[rt_len] = pattrib->phy_info.RecvSignalPower;\n\trt_len += 1;\n\n#if 0\n\t/* dBm Antenna Noise */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE);\n\thdr_buf[rt_len] = 0;\n\trt_len += 1;\n\n\t/* Signal Quality */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_LOCK_QUALITY);\n\thdr_buf[rt_len] = pattrib->phy_info.SignalQuality;\n\trt_len += 1;\n#endif\n\n\t/* Antenna */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_ANTENNA);\n\thdr_buf[rt_len] = 0; /* pHalData->rf_type; */\n\trt_len += 1;\n\n\t/* RX flags */\n\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_RX_FLAGS);\n#if 0\n\ttmp_16bit = cpu_to_le16(0);\n\tmemcpy(ptr, &tmp_16bit, 1);\n#endif\n\trt_len += 2;\n\n\t/* MCS information */\n\tif (pattrib->data_rate >= 12 && pattrib->data_rate < 44) {\n\t\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_MCS);\n\t\t/* known, flag */\n\t\thdr_buf[rt_len] |= BIT1; /* MCS index known */\n\n\t\t/* bandwidth */\n\t\thdr_buf[rt_len] |= BIT0;\n\t\thdr_buf[rt_len+1] |= (pattrib->bw & 0x03);\n\n\t\t/* guard interval */\n\t\thdr_buf[rt_len] |= BIT2;\n\t\thdr_buf[rt_len+1] |= (pattrib->sgi & 0x01) << 2;\n\n\t\t/* STBC */\n\t\thdr_buf[rt_len] |= BIT5;\n\t\thdr_buf[rt_len+1] |= (pattrib->stbc & 0x03) << 5;\n\n\t\trt_len += 2;\n\n\t\t/* MCS rate index */\n\t\thdr_buf[rt_len] = data_rate[pattrib->data_rate];\n\t\trt_len += 1;\n\t}\n\n\t/* VHT */\n\tif (pattrib->data_rate >= 44 && pattrib->data_rate < 84) {\n\t\trtap_hdr->it_present |= (1 << IEEE80211_RADIOTAP_VHT);\n\n\t\t/* known 16 bit, flag 8 bit */\n\t\ttmp_16bit = 0;\n\n\t\t/* Bandwidth */\n\t\ttmp_16bit |= BIT6;\n\n\t\t/* Group ID */\n\t\ttmp_16bit |= BIT7;\n\n\t\t/* Partial AID */\n\t\ttmp_16bit |= BIT8;\n\n\t\t/* STBC */\n\t\ttmp_16bit |= BIT0;\n\t\thdr_buf[rt_len+2] |= (pattrib->stbc & 0x01);\n\n\t\t/* Guard interval */\n\t\ttmp_16bit |= BIT2;\n\t\thdr_buf[rt_len+2] |= (pattrib->sgi & 0x01) << 2;\n\n\t\t/* LDPC extra OFDM symbol */\n\t\ttmp_16bit |= BIT4;\n\t\thdr_buf[rt_len+2] |= (pattrib->ldpc & 0x01) << 4;\n\n\t\tmemcpy(&hdr_buf[rt_len], &tmp_16bit, 2);\n\t\trt_len += 3;\n\n\t\t/* bandwidth */\n\t\tif (pattrib->bw == 0) \n\t\t\thdr_buf[rt_len] |= 0;\n\t\telse if (pattrib->bw == 1) \n\t\t\thdr_buf[rt_len] |= 1;\n\t\telse if (pattrib->bw == 2) \n\t\t\thdr_buf[rt_len] |= 4;\n\t\telse if (pattrib->bw == 3) \n\t\t\thdr_buf[rt_len] |= 11;\n\t\trt_len += 1;\n\n\t\t/* mcs_nss */\n\t\tif (pattrib->data_rate >= 44 && pattrib->data_rate < 54) {\n\t\t\thdr_buf[rt_len] |= 1;\n\t\t\thdr_buf[rt_len] |= data_rate[pattrib->data_rate] << 4;\n\t\t} else if (pattrib->data_rate >= 54 && pattrib->data_rate < 64) {\n\t\t\thdr_buf[rt_len + 1] |= 2;\n\t\t\thdr_buf[rt_len + 1] |= data_rate[pattrib->data_rate] << 4;\n\t\t} else if (pattrib->data_rate >= 64 && pattrib->data_rate < 74) {\n\t\t\thdr_buf[rt_len + 2] |= 3;\n\t\t\thdr_buf[rt_len + 2] |= data_rate[pattrib->data_rate] << 4;\n\t\t} else if (pattrib->data_rate >= 74 && pattrib->data_rate < 84) {\n\t\t\thdr_buf[rt_len + 3] |= 4;\n\t\t\thdr_buf[rt_len + 3] |= data_rate[pattrib->data_rate] << 4;\n\t\t}\n\t\trt_len += 4;\n\n\t\t/* coding */\n\t\thdr_buf[rt_len] = 0;\n\t\trt_len += 1;\n\n\t\t/* group_id */\n\t\thdr_buf[rt_len] = 0;\n\t\trt_len += 1;\n\n\t\t/* partial_aid */\n\t\ttmp_16bit = 0;\n\t\tmemcpy(&hdr_buf[rt_len], &tmp_16bit, 2);\n\t\trt_len += 2;\n\t}\n\n\t/* push to skb */\n\tpskb = (_pkt *)buf;\n\tif (skb_headroom(pskb) < rt_len) {\n\t\tDBG_871X(\"%s:%d %s headroom is too small.\\n\", __FILE__, __LINE__, __func__);\n\t\tret = _FAIL;\n\t\treturn ret;\n\t}\n\n\tptr = skb_push(pskb, rt_len);\n\tif (ptr) {\n\t\trtap_hdr->it_len = cpu_to_le16(rt_len);\n\t\tmemcpy(ptr, rtap_hdr, rt_len);\n\t} else {\n\t\tret = _FAIL;\n\t}\n\n\treturn ret;\n\n}\n\nint recv_frame_monitor(_adapter *padapter, union recv_frame *rframe)\n{\n\tint ret = _SUCCESS;\n\tstruct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n\t_pkt *pskb = NULL;\n\n\t/* read skb information from recv frame */\n\tpskb = rframe->u.hdr.pkt;\n\tpskb->len = rframe->u.hdr.len;\n\tpskb->data = rframe->u.hdr.rx_data;\n\tskb_set_tail_pointer(pskb, rframe->u.hdr.len);\n\n\t/* fill radiotap header */\n\tif (fill_radiotap_hdr(padapter, rframe, (u8 *)pskb) == _FAIL) {\n\t\tret = _FAIL;\n\t\trtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */\n\t\tgoto exit;\n\t}\n\n\t/* write skb information to recv frame */\n\tskb_reset_mac_header(pskb);\n\trframe->u.hdr.len = pskb->len;\n\trframe->u.hdr.rx_data = pskb->data;\n\trframe->u.hdr.rx_head = pskb->head;\n\trframe->u.hdr.rx_tail = skb_tail_pointer(pskb);\n\trframe->u.hdr.rx_end = skb_end_pointer(pskb);\n\n\tif (!RTW_CANNOT_RUN(padapter)) {\n\t\t/* indicate this recv_frame */\n\t\tret = rtw_recv_monitor(padapter, rframe);\n\t\tif (ret != _SUCCESS) {\n\t\t\tret = _FAIL;\n\t\t\trtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */\n\t\t\tgoto exit;\n\t\t}\n\t} else {\n\t\tret = _FAIL;\n\t\trtw_free_recvframe(rframe, pfree_recv_queue); /* free this recv_frame */\n\t\tgoto exit;\n\t}\n\nexit:\n\treturn ret;\n}\n\nint recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)\n{\n\tint ret = _SUCCESS;\n\tstruct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n\n#ifdef DBG_RX_COUNTER_DUMP\n\tif( padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER )\n\t{\n\t\tif (pattrib->crc_err == 1)\n\t\t\tpadapter->drv_rx_cnt_crcerror++;\n\t\telse\n\t\t\tpadapter->drv_rx_cnt_ok++;\n\t}\n#endif\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1 || padapter->mppriv.bRTWSmbCfg ==_TRUE)\n\t{\n\t\tmp_recv_frame(padapter,rframe);\n\t\tret = _FAIL;\n\t\tgoto exit;\n        }\n\telse\n#endif\n\t{\n\t//check the frame crtl field and decache\n\tret = validate_recv_frame(padapter, rframe);\n\tif (ret != _SUCCESS)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_info_, (\"recv_func: validate_recv_frame fail! drop pkt\\n\"));\n\t\trtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame\n\t\tgoto exit;\n\t}\n\t}\nexit:\n\treturn ret;\n}\n\nint recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)\n{\n\tint ret = _SUCCESS;\n\tunion recv_frame *orig_prframe = prframe;\n\tstruct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\t_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n#ifdef CONFIG_TDLS\n\tu8 *psnap_type, *pcategory;\n#endif //CONFIG_TDLS\n\n\tDBG_COUNTER(padapter->rx_logs.core_rx_post);\n\n\t// DATA FRAME\n\trtw_led_control(padapter, LED_CTL_RX);\n\n\tprframe = decryptor(padapter, prframe);\n\tif (prframe == NULL) {\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"decryptor: drop pkt\\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s decryptor: drop pkt\\n\", __FUNCTION__);\n\t\t#endif\n\t\tret = _FAIL;\n\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err);\n\t\tgoto _recv_data_drop;\n\t}\n\n#if 0\n\tif ( padapter->adapter_type == PRIMARY_ADAPTER )\n\t{\n\t\tDBG_871X(\"+++\\n\");\n\t\t{\n\t\t\tint i;\n\t\t\tu8\t*ptr = get_recvframe_data(prframe);\n\t\t\tfor(i=0; i<140;i=i+8)\n\t\t\t\tDBG_871X(\"%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\", *(ptr+i),\n\t\t\t\t*(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));\n\n\t\t}\n\t\tDBG_871X(\"---\\n\");\n\t}\n#endif\n\n#ifdef CONFIG_TDLS\n\t//check TDLS frame\n\tpsnap_type = get_recvframe_data(orig_prframe) + pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;\n\tpcategory = psnap_type + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN;\n\n\tif((_rtw_memcmp(psnap_type, SNAP_ETH_TYPE_TDLS, ETH_TYPE_LEN)) &&\n\t\t((*pcategory==RTW_WLAN_CATEGORY_TDLS) || (*pcategory==RTW_WLAN_CATEGORY_P2P))){\n\t\tret = OnTDLS(padapter, prframe);\n\t\tif(ret == _FAIL)\n\t\t\tgoto _exit_recv_func;\n\t}\n#endif //CONFIG_TDLS\n\n\tprframe = recvframe_chk_defrag(padapter, prframe);\n\tif(prframe==NULL)\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recvframe_chk_defrag: drop pkt\\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\\n\", __FUNCTION__);\n\t\t#endif\n\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err);\n\t\tgoto _recv_data_drop;\t\t\n\t}\n\n\tprframe=portctrl(padapter, prframe);\n\tif (prframe == NULL) {\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"portctrl: drop pkt \\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s portctrl: drop pkt\\n\", __FUNCTION__);\n\t\t#endif\n\t\tret = _FAIL;\n\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err);\n\t\tgoto _recv_data_drop;\n\t}\n\n\tcount_rx_stats(padapter, prframe, NULL);\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_wapi_update_info(padapter, prframe);\n#endif\n\n#ifdef CONFIG_80211N_HT\n\tret = process_recv_indicatepkts(padapter, prframe);\n\tif (ret != _SUCCESS)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recv_func: process_recv_indicatepkts fail! \\n\"));\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\\n\", __FUNCTION__);\n\t\t#endif\n\t\trtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame\n\t\tDBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err);\n\t\tgoto _recv_data_drop;\n\t}\n#else // CONFIG_80211N_HT\n\tif (!pattrib->amsdu)\n\t{\n\t\tret = wlanhdr_to_ethhdr (prframe);\n\t\tif (ret != _SUCCESS)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"wlanhdr_to_ethhdr: drop pkt \\n\"));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s wlanhdr_to_ethhdr: drop pkt\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\trtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame\n\t\t\tgoto _recv_data_drop;\n\t\t}\n\n\t\tif (!RTW_CANNOT_RUN(padapter)) {\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, (\"@@@@ recv_func: recv_func rtw_recv_indicatepkt\\n\" ));\n\t\t\t//indicate this recv_frame\n\t\t\tret = rtw_recv_indicatepkt(padapter, prframe);\n\t\t\tif (ret != _SUCCESS)\n\t\t\t{\t\n\t\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s rtw_recv_indicatepkt fail!\\n\", __FUNCTION__);\n\t\t\t\t#endif\n\t\t\t\tgoto _recv_data_drop;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, (\"@@@@  recv_func: rtw_free_recvframe\\n\" ));\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_, _drv_debug_, (\"recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\", padapter->bDriverStopped, padapter->bSurpriseRemoved));\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s ecv_func:bDriverStopped(%s) OR bSurpriseRemoved(%s)\\n\", __func__\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\t\t#endif\n\t\t\tret = _FAIL;\n\t\t\trtw_free_recvframe(orig_prframe, pfree_recv_queue); //free this recv_frame\n\t\t}\n\n\t}\n\telse if(pattrib->amsdu==1)\n\t{\n\n\t\tret = amsdu_to_msdu(padapter, prframe);\n\t\tif(ret != _SUCCESS)\n\t\t{\n\t\t\t#ifdef DBG_RX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s amsdu_to_msdu fail\\n\", __FUNCTION__);\n\t\t\t#endif\n\t\t\trtw_free_recvframe(orig_prframe, pfree_recv_queue);\n\t\t\tgoto _recv_data_drop;\n\t\t}\n\t}\n\telse\n\t{\n\t\t#ifdef DBG_RX_DROP_FRAME\n\t\tDBG_871X(\"DBG_RX_DROP_FRAME %s what is this condition??\\n\", __FUNCTION__);\n\t\t#endif\n\t\tgoto _recv_data_drop;\n\t}\n#endif // CONFIG_80211N_HT\n\n_exit_recv_func:\n\treturn ret;\n\n_recv_data_drop:\n\tprecvpriv->rx_drop++;\n\treturn ret;\n}\n\n\nint recv_func(_adapter *padapter, union recv_frame *rframe);\nint recv_func(_adapter *padapter, union recv_frame *rframe)\n{\n\tint ret;\n\tstruct rx_pkt_attrib *prxattrib = &rframe->u.hdr.attrib;\n\tstruct recv_priv *recvpriv = &padapter->recvpriv;\n\tstruct security_priv *psecuritypriv=&padapter->securitypriv;\n\tstruct mlme_priv *mlmepriv = &padapter->mlmepriv;\n\n\tif (check_fwstate(mlmepriv, WIFI_MONITOR_STATE)) {\n\t\t/* monitor mode */\n\t\trecv_frame_monitor(padapter, rframe);\n\t\tret = _SUCCESS;\n\t\tgoto exit;\n\t} else\n\n\t/* check if need to handle uc_swdec_pending_queue*/\n\tif (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey)\n\t{\n\t\tunion recv_frame *pending_frame;\n\t\tint cnt = 0;\n\n\t\twhile((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {\n\t\t\tcnt++;\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_dequeue);\n\t\t\trecv_func_posthandle(padapter, pending_frame);\n\t\t}\n\n\t\tif (cnt)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" dequeue %d from uc_swdec_pending_queue\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), cnt);\n\t}\n\n\tDBG_COUNTER(padapter->rx_logs.core_rx);\n\tret = recv_func_prehandle(padapter, rframe);\n\n\tif(ret == _SUCCESS) {\n\t\t\n\t\t/* check if need to enqueue into uc_swdec_pending_queue*/\n\t\tif (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&\n\t\t\t!IS_MCAST(prxattrib->ra) && prxattrib->encrypt>0 &&\n\t\t\t(prxattrib->bdecrypted == 0 ||psecuritypriv->sw_decrypt == _TRUE) &&\n\t\t\tpsecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&\n\t\t\t!psecuritypriv->busetkipkey)\n\t\t{\n\t\t\tDBG_COUNTER(padapter->rx_logs.core_rx_enqueue);\n\t\t\trtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);\n\t\t\t//DBG_871X(\"%s: no key, enqueue uc_swdec_pending_queue\\n\", __func__);\n\n\t\t\tif (recvpriv->free_recvframe_cnt < NR_RECVFRAME/4) {\n\t\t\t\t/* to prevent from recvframe starvation, get recvframe from uc_swdec_pending_queue to free_recvframe_cnt  */\n\t\t\t\trframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue);\n\t\t\t\tif (rframe)\n\t\t\t\t\tgoto do_posthandle;\n\t\t\t}\n\t\t\tgoto exit;\n\t\t}\n\ndo_posthandle:\n\t\tret = recv_func_posthandle(padapter, rframe);\n\t}\n\nexit:\n\treturn ret;\n}\n\n\ns32 rtw_recv_entry(union recv_frame *precvframe)\n{\n\t_adapter *padapter;\n\tstruct recv_priv *precvpriv;\n\ts32 ret=_SUCCESS;\n\n_func_enter_;\n\n//\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"+rtw_recv_entry\\n\"));\n\n\tpadapter = precvframe->u.hdr.adapter;\n\n\tprecvpriv = &padapter->recvpriv;\n\n\n\tif ((ret = recv_func(padapter, precvframe)) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"rtw_recv_entry: recv_func return fail!!!\\n\"));\n\t\tgoto _recv_entry_drop;\n\t}\n\n\n\tprecvpriv->rx_pkts++;\n\n_func_exit_;\n\n\treturn ret;\n\n_recv_entry_drop:\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\tpadapter->mppriv.rx_pktloss = precvpriv->rx_drop;\n#endif\n\n\t//RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"_recv_entry_drop\\n\"));\n\n_func_exit_;\n\n\treturn ret;\n}\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\nvoid rtw_signal_stat_timer_hdl(RTW_TIMER_HDL_ARGS){\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\tstruct recv_priv *recvpriv = &adapter->recvpriv;\n\t\n\tu32 tmp_s, tmp_q;\n\tu8 avg_signal_strength = 0;\n\tu8 avg_signal_qual = 0;\n\tu32 num_signal_strength = 0;\n\tu32 num_signal_qual = 0;\n\tu8 ratio_pre_stat = 0, ratio_curr_stat = 0, ratio_total = 0, ratio_profile = SIGNAL_STAT_CALC_PROFILE_0;\n\n\tif(adapter->recvpriv.is_signal_dbg) {\n\t\t//update the user specific value, signal_strength_dbg, to signal_strength, rssi\n\t\tadapter->recvpriv.signal_strength= adapter->recvpriv.signal_strength_dbg;\n\t\tadapter->recvpriv.rssi=(s8)translate_percentage_to_dbm((u8)adapter->recvpriv.signal_strength_dbg);\n\t} else {\n\n\t\tif(recvpriv->signal_strength_data.update_req == 0) {// update_req is clear, means we got rx\n\t\t\tavg_signal_strength = recvpriv->signal_strength_data.avg_val;\n\t\t\tnum_signal_strength = recvpriv->signal_strength_data.total_num;\n\t\t\t// after avg_vals are accquired, we can re-stat the signal values\n\t\t\trecvpriv->signal_strength_data.update_req = 1;\n\t\t}\n\t\t\n\t\tif(recvpriv->signal_qual_data.update_req == 0) {// update_req is clear, means we got rx\n\t\t\tavg_signal_qual = recvpriv->signal_qual_data.avg_val;\n\t\t\tnum_signal_qual = recvpriv->signal_qual_data.total_num;\n\t\t\t// after avg_vals are accquired, we can re-stat the signal values\n\t\t\trecvpriv->signal_qual_data.update_req = 1;\n\t\t}\n\n\t\tif (num_signal_strength == 0) {\n\t\t\tif (rtw_get_on_cur_ch_time(adapter) == 0\n\t\t\t\t|| rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) < 2 * adapter->mlmeextpriv.mlmext_info.bcn_interval\n\t\t\t) {\n\t\t\t\tgoto set_timer;\n\t\t\t}\n\t\t}\n\n\t\tif(check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY) == _TRUE\n\t\t\t|| check_fwstate(&adapter->mlmepriv, _FW_LINKED) == _FALSE\n\t\t) { \n\t\t\tgoto set_timer;\n\t\t}\n\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (check_buddy_fwstate(adapter, _FW_UNDER_SURVEY) == _TRUE)\n\t\t\tgoto set_timer;\n\t\t#endif\n\n\t\tif (RTW_SIGNAL_STATE_CALC_PROFILE < SIGNAL_STAT_CALC_PROFILE_MAX)\n\t\t\tratio_profile = RTW_SIGNAL_STATE_CALC_PROFILE;\n\n\t\tratio_pre_stat = signal_stat_calc_profile[ratio_profile][0];\n\t\tratio_curr_stat = signal_stat_calc_profile[ratio_profile][1];\n\t\tratio_total = ratio_pre_stat + ratio_curr_stat;\n\n\t\t//update value of signal_strength, rssi, signal_qual\n\t\ttmp_s = (ratio_curr_stat * avg_signal_strength + ratio_pre_stat * recvpriv->signal_strength);\n\t\tif (tmp_s % ratio_total)\n\t\t\ttmp_s = tmp_s / ratio_total + 1;\n\t\telse\n\t\t\ttmp_s = tmp_s / ratio_total;\n\t\tif (tmp_s > 100)\n\t\t\ttmp_s = 100;\n\n\t\ttmp_q = (ratio_curr_stat * avg_signal_qual + ratio_pre_stat * recvpriv->signal_qual);\n\t\tif (tmp_q % ratio_total)\n\t\t\ttmp_q = tmp_q / ratio_total + 1;\n\t\telse\n\t\t\ttmp_q = tmp_q / ratio_total;\n\t\tif (tmp_q > 100)\n\t\t\ttmp_q = 100;\n\n\t\trecvpriv->signal_strength = tmp_s;\n\t\trecvpriv->rssi = (s8)translate_percentage_to_dbm(tmp_s);\n\t\trecvpriv->signal_qual = tmp_q;\n\n\t\t#if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1\n\t\tDBG_871X(FUNC_ADPT_FMT\" signal_strength:%3u, rssi:%3d, signal_qual:%3u\"\n\t\t\t\", num_signal_strength:%u, num_signal_qual:%u\"\n\t\t\t\", on_cur_ch_ms:%d\"\n\t\t\t\"\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter)\n\t\t\t, recvpriv->signal_strength\n\t\t\t, recvpriv->rssi\n\t\t\t, recvpriv->signal_qual\n\t\t\t, num_signal_strength, num_signal_qual\n\t\t\t, rtw_get_on_cur_ch_time(adapter) ? rtw_get_passing_time_ms(rtw_get_on_cur_ch_time(adapter)) : 0\n\t\t);\n\t\t#endif\n\t}\n\nset_timer:\n\trtw_set_signal_stat_timer(recvpriv);\n\t\n}\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\nstatic void rx_process_rssi(_adapter *padapter,union recv_frame *prframe)\n{\n\tu32\tlast_rssi, tmp_val;\n\tstruct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tstruct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data;\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\n\t//DBG_8192C(\"process_rssi=> pattrib->rssil(%d) signal_strength(%d)\\n \",pattrib->RecvSignalPower,pattrib->signal_strength);\n\t//if(pRfd->Status.bPacketToSelf || pRfd->Status.bPacketBeacon)\n\t{\n\t#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\t\tif(signal_stat->update_req) {\n\t\t\tsignal_stat->total_num = 0;\n\t\t\tsignal_stat->total_val = 0;\n\t\t\tsignal_stat->update_req = 0;\n\t\t}\n\n\t\tsignal_stat->total_num++;\n\t\tsignal_stat->total_val  += pattrib->phy_info.SignalStrength;\n\t\tsignal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;\t\t\n\t#else //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\t\n\t\t//Adapter->RxStats.RssiCalculateCnt++;\t//For antenna Test\n\t\tif(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX)\n\t\t{\n\t\t\tpadapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX;\n\t\t\tlast_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index];\n\t\t\tpadapter->recvpriv.signal_strength_data.total_val -= last_rssi;\n\t\t}\n\t\tpadapter->recvpriv.signal_strength_data.total_val  +=pattrib->phy_info.SignalStrength;\n\n\t\tpadapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->phy_info.SignalStrength;\n\t\tif(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX)\n\t\t\tpadapter->recvpriv.signal_strength_data.index = 0;\n\n\n\t\ttmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num;\n\t\t\n\t\tif(padapter->recvpriv.is_signal_dbg) {\n\t\t\tpadapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;\n\t\t\tpadapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);\n\t\t} else {\n\t\t\tpadapter->recvpriv.signal_strength= tmp_val;\n\t\t\tpadapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(tmp_val);\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\\n\", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));\n\t#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\t}\n}\n\nstatic void rx_process_link_qual(_adapter *padapter,union recv_frame *prframe)\n{\n\tu32\tlast_evm=0, tmpVal;\n \tstruct rx_pkt_attrib *pattrib;\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tstruct signal_stat * signal_stat;\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\n\tif(prframe == NULL || padapter==NULL){\n\t\treturn;\n\t}\n\n\tpattrib = &prframe->u.hdr.attrib;\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tsignal_stat = &padapter->recvpriv.signal_qual_data;\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\n\t//DBG_8192C(\"process_link_qual=> pattrib->signal_qual(%d)\\n \",pattrib->signal_qual);\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tif(signal_stat->update_req) {\n\t\tsignal_stat->total_num = 0;\n\t\tsignal_stat->total_val = 0;\n\t\tsignal_stat->update_req = 0;\n\t}\n\n\tsignal_stat->total_num++;\n\tsignal_stat->total_val  += pattrib->phy_info.SignalQuality;\n\tsignal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;\n\t\n#else //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tif(pattrib->phy_info.SignalQuality != 0)\n\t{\n\t\t\t//\n\t\t\t// 1. Record the general EVM to the sliding window.\n\t\t\t//\n\t\t\tif(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX)\n\t\t\t{\n\t\t\t\tpadapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;\n\t\t\t\tlast_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];\n\t\t\t\tpadapter->recvpriv.signal_qual_data.total_val -= last_evm;\n\t\t\t}\n\t\t\tpadapter->recvpriv.signal_qual_data.total_val += pattrib->phy_info.SignalQuality;\n\n\t\t\tpadapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->phy_info.SignalQuality;\n\t\t\tif(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)\n\t\t\t\tpadapter->recvpriv.signal_qual_data.index = 0;\n\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"Total SQ=%d  pattrib->signal_qual= %d\\n\", padapter->recvpriv.signal_qual_data.total_val, pattrib->phy_info.SignalQuality));\n\n\t\t\t// <1> Showed on UI for user, in percentage.\n\t\t\ttmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num;\n\t\t\tpadapter->recvpriv.signal_qual=(u8)tmpVal;\n\n\t}\n\telse\n\t{\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\" pattrib->signal_qual =%d\\n\", pattrib->phy_info.SignalQuality));\n\t}\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n}\n\nvoid rx_process_phy_info(_adapter *padapter, union recv_frame *rframe)\n{\n\t/* Check RSSI */\n\trx_process_rssi(padapter, rframe);\n\n\t/* Check PWDB */\n\t//process_PWDB(padapter, rframe); \n\n\t//UpdateRxSignalStatistics8192C(Adapter, pRfd);\n\t\n\t/* Check EVM */\n\trx_process_link_qual(padapter, rframe);\n\trtw_store_phy_info( padapter, rframe);\n}\n\nvoid rx_query_phy_status(\n\tunion recv_frame\t*precvframe,\n\tu8 *pphy_status)\n{\n\tPADAPTER \t\t\tpadapter = precvframe->u.hdr.adapter;\n\tstruct rx_pkt_attrib\t*pattrib = &precvframe->u.hdr.attrib;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(padapter);\t\n\tPODM_PHY_INFO_T \tpPHYInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);\n\tu8\t\t\t\t\t*wlanhdr;\n\tODM_PACKET_INFO_T\tpkt_info;\n\tu8 *sa;\n\tstruct sta_priv *pstapriv;\n\tstruct sta_info *psta = NULL;\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\t//_irqL\t\tirqL;\n\t\n\tpkt_info.bPacketMatchBSSID =_FALSE;\n\tpkt_info.bPacketToSelf = _FALSE;\n\tpkt_info.bPacketBeacon = _FALSE;\n\n\twlanhdr = get_recvframe_data(precvframe);\n\n\tpkt_info.bPacketMatchBSSID = (!IsFrameTypeCtrl(wlanhdr))\n\t\t&& (!pattrib->icv_err) && (!pattrib->crc_err)\n\t\t&& _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN);\n\n\tpkt_info.bToSelf = (!pattrib->icv_err) && (!pattrib->crc_err)\n\t\t&& _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN);\n\n\tpkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID\n\t\t&& _rtw_memcmp(get_ra(wlanhdr), adapter_mac_addr(padapter), ETH_ALEN);\n\n\tpkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID\n\t\t&& (GetFrameSubType(wlanhdr) == WIFI_BEACON);\n\n\tsa = get_ta(wlanhdr);\n\n\tpkt_info.StationID = 0xFF;\n\n\tif (_rtw_memcmp(adapter_mac_addr(padapter), sa, ETH_ALEN) == _TRUE) {\n\t\tstatic u32 start_time = 0;\n\n#if 0 /*For debug */\n\t\tif (IsFrameTypeCtrl(wlanhdr)) {\n\t\t\t\tDBG_871X(\"-->Control frame: Y\\n\");\n\t\t\t\tDBG_871X(\"-->pkt_len: %d\\n\", pattrib->pkt_len);\n\t\t\t\tDBG_871X(\"-->Sub Type = 0x%X\\n\", GetFrameSubType(wlanhdr));\n\t\t}\n\n\t\t/* Dump first 40 bytes of header */\n\t\tint i = 0;\n\n\t\tfor (i = 0; i < 40; i++)\n\t\t\tDBG_871X(\"%d: %X\\n\", i, *((u8 *)wlanhdr + i));\n\n\t\tDBG_871X(\"\\n\");\n#endif\n\n\t\tif ((start_time == 0) || (rtw_get_passing_time_ms(start_time) > 5000)) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"Warning!!! %s: Confilc mac addr!!\\n\", __func__);\n\t\t\tstart_time = rtw_get_current_time();\n\t\t}\n\t\tpdbgpriv->dbg_rx_conflic_mac_addr_cnt++;\n\t} else{\n\t\tpstapriv = &padapter->stapriv;\n\t\tpsta = rtw_get_stainfo(pstapriv, sa);\n\t\tif (psta)\n\t\t\tpkt_info.StationID = psta->mac_id;\n\t}\n\n\tpkt_info.DataRate = pattrib->data_rate;\n\n\t//_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);\n\tODM_PhyStatusQuery(&pHalData->odmpriv, pPHYInfo, pphy_status, &pkt_info);\n\tif (psta)\n\t\tpsta->rssi = pattrib->phy_info.RecvSignalPower;\n\t//_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);\n\n#ifdef CONFIG_SW_ANTENNA_DIVERSITY\n\tif (GET_HAL_DATA(padapter)->odmpriv.RSSI_test == _FALSE)\n#endif\n\t{\n\t\tprecvframe->u.hdr.psta = NULL;\n\t\tif (pkt_info.bPacketMatchBSSID\n\t\t\t&& (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t) {\n\t\t\tif (psta) {\n\t\t\t\tprecvframe->u.hdr.psta = psta;\n\t\t\t\trx_process_phy_info(padapter, precvframe);\n\t\t\t}\n\t\t} else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon) {\n\t\t\t\tif (psta)\n\t\t\t\t\tprecvframe->u.hdr.psta = psta;\n\t\t\trx_process_phy_info(padapter, precvframe);\n\t\t}\n\t}\n}\n/*\n* Increase and check if the continual_no_rx_packet of this @param pmlmepriv is larger than MAX_CONTINUAL_NORXPACKET_COUNT\n* @return _TRUE:\n* @return _FALSE:\n*/\nint rtw_inc_and_chk_continual_no_rx_packet(struct sta_info *sta, int tid_index)\n{\n\t\n\tint ret = _FALSE;\n\tint value = ATOMIC_INC_RETURN(&sta->continual_no_rx_packet[tid_index]);\n\n\tif (value >= MAX_CONTINUAL_NORXPACKET_COUNT) \n\t\tret = _TRUE;\n\t\n\treturn ret;\n}\n\n/*\n* Set the continual_no_rx_packet of this @param pmlmepriv to 0\n*/\nvoid rtw_reset_continual_no_rx_packet(struct sta_info *sta, int tid_index)\n{\t\n\tATOMIC_SET(&sta->continual_no_rx_packet[tid_index], 0);\t\n}\n"
  },
  {
    "path": "core/rtw_rf.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_RF_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\nu8 center_ch_5g_all[CENTER_CH_5G_ALL_NUM] = {\n\t\t36, 38, 40, 42, 44, 46, 48,\t\t\t/* Band 1 */\n\t\t52, 54, 56, 58, 60, 62, 64,\t\t\t/* Band 2 */\n\t\t100, 102, 104, 106, 108, 110, 112,\t/* Band 3 */\n\t\t116, 118, 120, 122, 124, 126, 128,\t/* Band 3 */\n\t\t132, 134, 136, 138, 140, 142, 144,\t/* Band 3 */\n\t\t149, 151, 153, 155, 157, 159, 161,\t/* Band 4 */\n\t\t165, 167, 169, 171, 173, 175, 177};\t/* Band 4 */\n\nu8 center_ch_5g_20m[CENTER_CH_5G_20M_NUM] = {\n\t36, 40, 44, 48,\n\t52, 56, 60, 64,\n\t100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,\n\t149, 153, 157, 161, 165, 169, 173, 177\n};\n\nu8 center_ch_5g_40m[CENTER_CH_5G_40M_NUM] = {38, 46, 54, 62, 102, 110, 118, 126, 134, 142, 151, 159, 167, 175};\n\nu8 center_ch_5g_80m[CENTER_CH_5G_80M_NUM] = {42, 58, 106, 122, 138, 155, 171};\n\nstruct center_chs_ent {\n\tu8 ch_num;\n\tu8 *chs;\n};\n\nstruct center_chs_ent center_chs_5g_by_bw[] = {\n\t{CENTER_CH_5G_20M_NUM, center_ch_5g_20m},\n\t{CENTER_CH_5G_40M_NUM, center_ch_5g_40m},\n\t{CENTER_CH_5G_80M_NUM, center_ch_5g_80m},\n};\n\ninline u8 center_chs_5g_num(u8 bw)\n{\n\tif (bw >= CHANNEL_WIDTH_160)\n\t\treturn 0;\n\t\n\treturn center_chs_5g_by_bw[bw].ch_num;\n}\n\ninline u8 center_chs_5g(u8 bw, u8 id)\n{\n\tif (bw >= CHANNEL_WIDTH_160)\n\t\treturn 0;\n\n\tif (id >= center_chs_5g_num(bw))\n\t\treturn 0;\n\t\t\n\treturn center_chs_5g_by_bw[bw].chs[id];\n}\n\nint rtw_ch2freq(int chan)\n{\n\t/* see 802.11 17.3.8.3.2 and Annex J\n\t* there are overlapping channel numbers in 5GHz and 2GHz bands */\n\n\t/*\n\t* RTK: don't consider the overlapping channel numbers: 5G channel <= 14,\n\t* because we don't support it. simply judge from channel number\n\t*/\n\n\tif (chan >= 1 && chan <= 14) {\n\t\tif (chan == 14)\n\t\t\treturn 2484;\n\t\telse if (chan < 14)\n\t\t\treturn 2407 + chan * 5;\n\t} else if (chan >= 36 && chan <= 177) {\n\t\treturn 5000 + chan * 5;\n\t}\n\n\treturn 0; /* not supported */\n}\n\nint rtw_freq2ch(int freq)\n{\n\t/* see 802.11 17.3.8.3.2 and Annex J */\n\tif (freq == 2484)\n\t\treturn 14;\n\telse if (freq < 2484)\n\t\treturn (freq - 2407) / 5;\n\telse if (freq >= 4910 && freq <= 4980)\n\t\treturn (freq - 4000) / 5;\n\telse if (freq <= 45000) /* DMG band lower limit */\n\t\treturn (freq - 5000) / 5;\n\telse if (freq >= 58320 && freq <= 64800)\n\t\treturn (freq - 56160) / 2160;\n\telse\n\t\treturn 0;\n}\n\nbool rtw_chbw_to_freq_range(u8 ch, u8 bw, u8 offset, u32 *hi, u32 *lo)\n{\n\tu8 c_ch;\n\tu32 freq;\n\tu32 hi_ret = 0, lo_ret = 0;\n\tint i;\n\tbool valid = _FALSE;\n\n\tif (hi)\n\t\t*hi = 0;\n\tif (lo)\n\t\t*lo = 0;\n\n\tc_ch = rtw_get_center_ch(ch, bw, offset);\n\tfreq = rtw_ch2freq(c_ch);\n\n\tif (!freq) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (bw == CHANNEL_WIDTH_80) {\n\t\thi_ret = freq + 40;\n\t\tlo_ret = freq - 40;\n\t} else if (bw == CHANNEL_WIDTH_40) {\n\t\thi_ret = freq + 20;\n\t\tlo_ret = freq - 20;\n\t} else if (bw == CHANNEL_WIDTH_20) {\n\t\thi_ret = freq + 10;\n\t\tlo_ret = freq - 10;\n\t} else {\n\t\trtw_warn_on(1);\n\t}\n\n\tif (hi)\n\t\t*hi = hi_ret;\n\tif (lo)\n\t\t*lo = lo_ret;\n\n\tvalid = _TRUE;\n\nexit:\n\treturn valid;\n}\n\nconst char * const _ch_width_str[] = {\n\t\"20MHz\",\n\t\"40MHz\",\n\t\"80MHz\",\n\t\"160MHz\",\n\t\"80_80MHz\",\n\t\"CHANNEL_WIDTH_MAX\",\n};\n\nconst u8 _ch_width_to_bw_cap[] = {\n\tBW_CAP_20M,\n\tBW_CAP_40M,\n\tBW_CAP_80M,\n\tBW_CAP_160M,\n\tBW_CAP_80_80M,\n\t0,\n};\n\nconst char * const _band_str[] = {\n\t\"2.4G\",\n\t\"5G\",\n\t\"BOTH\",\n\t\"BAND_MAX\",\n};\n\nconst u8 _band_to_band_cap[] = {\n\tBAND_CAP_2G,\n\tBAND_CAP_5G,\n\t0,\n\t0,\n};\n\nstruct country_chplan {\n\tchar alpha2[2];\n\tu8 chplan;\n};\n\nstatic const struct country_chplan country_chplan_map[] = {\n\t{\"AD\", 0x26}, /* Andorra */\n\t{\"AE\", 0x26}, /* United Arab Emirates */\n\t{\"AG\", 0x30}, /* Antigua & Barbuda */\n\t{\"AI\", 0x26}, /* Anguilla(UK) */\n\t{\"AL\", 0x26}, /* Albania */\n\t{\"AM\", 0x34}, /* Armenia */\n\t{\"AO\", 0x26}, /* Angola */\n\t{\"AQ\", 0x26}, /* Antarctica */\n\t{\"AR\", 0x57}, /* Argentina */\n\t{\"AS\", 0x34}, /* American Samoa */\n\t{\"AT\", 0x26}, /* Austria */\n\t{\"AU\", 0x45}, /* Australia */\n\t{\"AW\", 0x34}, /* Aruba */\n\t{\"AZ\", 0x26}, /* Azerbaijan */\n\t{\"BA\", 0x26}, /* Bosnia & Herzegovina */\n\t{\"BD\", 0x26}, /* Bangladesh */\n\t{\"BE\", 0x26}, /* Belgium */\n\t{\"BG\", 0x26}, /* Bulgaria */\n\t{\"BH\", 0x47}, /* Bahrain */\n\t{\"BO\", 0x30}, /* Bolivia */\n\t{\"BR\", 0x34}, /* Brazil */\n\t{\"CA\", 0x34}, /* Canada */\n\t{\"CH\", 0x26}, /* Switzerland */\n\t{\"CL\", 0x30}, /* Chile */\n\t{\"CN\", 0x48}, /* China */\n\t{\"CO\", 0x34}, /* Colombia */\n\t{\"CR\", 0x34}, /* Costa Rica */\n\t{\"CY\", 0x26}, /* Cyprus */\n\t{\"CZ\", 0x26}, /* Czech Republic */\n\t{\"DE\", 0x26}, /* Germany */\n\t{\"DK\", 0x26}, /* Denmark */\n\t{\"DO\", 0x34}, /* Dominican Republic */\n\t{\"EC\", 0x34}, /* Ecuador */\n\t{\"EE\", 0x26}, /* Estonia */\n\t{\"EG\", 0x47}, /* Egypt */\n\t{\"ES\", 0x26}, /* Spain */\n\t{\"FI\", 0x26}, /* Finland */\n\t{\"FR\", 0x26}, /* France */\n\t{\"GB\", 0x26}, /* Great Britain (United Kingdom; England) */\n\t{\"GH\", 0x26}, /* Ghana */\n\t{\"GR\", 0x26}, /* Greece */\n\t{\"GT\", 0x34}, /* Guatemala */\n\t{\"HK\", 0x26}, /* Hong Kong */\n\t{\"HN\", 0x32}, /* Honduras */\n\t{\"HR\", 0x26}, /* Croatia */\n\t{\"HU\", 0x26}, /* Hungary */\n\t{\"ID\", 0x54}, /* Indonesia */\n\t{\"IE\", 0x26}, /* Ireland */\n\t{\"IL\", 0x47}, /* Israel */\n\t{\"IN\", 0x47}, /* India */\n\t{\"IQ\", 0x26}, /* Iraq */\n\t{\"IS\", 0x26}, /* Iceland */\n\t{\"IT\", 0x26}, /* Italy */\n\t{\"JM\", 0x51}, /* Jamaica */\n\t{\"JO\", 0x49}, /* Jordan */\n\t{\"JP\", 0x27}, /* Japan- Telec */\n\t{\"KE\", 0x47}, /* Kenya */\n\t{\"KG\", 0x26}, /* Kyrgyzstan */\n\t{\"KH\", 0x26}, /* Cambodia */\n\t{\"KR\", 0x28}, /* South Korea */\n\t{\"KW\", 0x47}, /* Kuwait */\n\t{\"KZ\", 0x26}, /* Kazakhstan */\n\t{\"LB\", 0x26}, /* Lebanon */\n\t{\"LI\", 0x26}, /* Liechtenstein */\n\t{\"LK\", 0x26}, /* Sri Lanka */\n\t{\"LS\", 0x26}, /* Lesotho */\n\t{\"LT\", 0x26}, /* Lithuania */\n\t{\"LU\", 0x26}, /* Luxembourg */\n\t{\"LV\", 0x26}, /* Latvia */\n\t{\"MA\", 0x47}, /* Morocco */\n\t{\"MC\", 0x26}, /* Monaco */\n\t{\"ME\", 0x26}, /* Montenegro */\n\t{\"MK\", 0x26}, /* Republic of Macedonia (FYROM) */\n\t{\"MT\", 0x26}, /* Malta */\n\t{\"MX\", 0x34}, /* Mexico */\n\t{\"MY\", 0x47}, /* Malaysia */\n\t{\"MZ\", 0x26}, /* Mozambique */\n\t{\"NA\", 0x26}, /* Namibia */\n\t{\"NG\", 0x50}, /* Nigeria */\n\t{\"NI\", 0x34}, /* Nicaragua */\n\t{\"NL\", 0x26}, /* Netherlands */\n\t{\"NO\", 0x26}, /* Norway */\n\t{\"NZ\", 0x45}, /* New Zealand */\n\t{\"OM\", 0x26}, /* Oman */\n\t{\"PA\", 0x34}, /* Panama */\n\t{\"PE\", 0x34}, /* Peru */\n\t{\"PG\", 0x26}, /* Papua New Guinea */\n\t{\"PH\", 0x26}, /* Philippines */\n\t{\"PK\", 0x51}, /* Pakistan */\n\t{\"PL\", 0x26}, /* Poland */\n\t{\"PR\", 0x34}, /* Puerto Rico */\n\t{\"PT\", 0x26}, /* Portugal */\n\t{\"PY\", 0x34}, /* Paraguay */\n\t{\"QA\", 0x51}, /* Qatar */\n\t{\"RO\", 0x26}, /* Romania */\n\t{\"RS\", 0x26}, /* Serbia */\n\t{\"RU\", 0x59}, /* Russia, fac/gost */\n\t{\"SA\", 0x26}, /* Saudi Arabia */\n\t{\"SE\", 0x26}, /* Sweden */\n\t{\"SG\", 0x47}, /* Singapore */\n\t{\"SI\", 0x26}, /* Slovenia */\n\t{\"SK\", 0x26}, /* Slovakia */\n\t{\"SN\", 0x26}, /* Senegal */\n\t{\"SV\", 0x30}, /* El Salvador */\n\t{\"TH\", 0x26}, /* Thailand */\n\t{\"TN\", 0x47}, /* Tunisia */\n\t{\"TR\", 0x26}, /* Turkey */\n\t{\"TT\", 0x42}, /* Trinidad & Tobago */\n\t{\"TW\", 0x39}, /* Taiwan */\n\t{\"UA\", 0x26}, /* Ukraine */\n\t{\"US\", 0x34}, /* United States of America (USA) */\n\t{\"UY\", 0x34}, /* Uruguay */\n\t{\"VE\", 0x30}, /* Venezuela */\n\t{\"VN\", 0x26}, /* Vietnam */\n\t{\"YE\", 0x26}, /* Yemen */\n\t{\"ZA\", 0x26}, /* South Africa */\n\t{\"ZW\", 0x26}, /* Zimbabwe */\n};\n\nu16 country_chplan_map_sz = sizeof(country_chplan_map)/sizeof(struct country_chplan);\n\n/*\n* rtw_get_chplan_from_country -\n* @country_code: string of country code\n*\n* Return channel_plan index or -1 when unsupported country_code is given\n*/\nint rtw_get_chplan_from_country(const char *country_code)\n{\n\tint channel_plan = -1;\n\tint i;\n\n\t/* TODO: should consider 3-character country code? */\n\n\tfor (i = 0; i < country_chplan_map_sz; i++) {\n\t\tif (strncmp(country_code, country_chplan_map[i].alpha2, 2) == 0) {\n\t\t\tchannel_plan = country_chplan_map[i].chplan;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn channel_plan;\n}\n\nint rtw_ch_to_bb_gain_sel(int ch)\n{\n\tint sel = -1;\n\n\tif (ch >= 1 && ch <= 14)\n\t\tsel = BB_GAIN_2G;\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n\telse if (ch >= 36 && ch < 48)\n\t\tsel = BB_GAIN_5GLB1;\n\telse if (ch >= 52 && ch <= 64)\n\t\tsel = BB_GAIN_5GLB2;\n\telse if (ch >= 100 && ch <= 120)\n\t\tsel = BB_GAIN_5GMB1;\n\telse if (ch >= 124 && ch <= 144)\n\t\tsel = BB_GAIN_5GMB2;\n\telse if (ch >= 149 && ch <= 177)\n\t\tsel = BB_GAIN_5GHB;\n#endif\n\n\treturn sel;\n}\n\ns8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch)\n{\n\ts8 kfree_offset = 0;\n\n#ifdef CONFIG_RF_GAIN_OFFSET\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(padapter);\n\ts8 bb_gain_sel = rtw_ch_to_bb_gain_sel(ch);\n\n\tif (bb_gain_sel < BB_GAIN_2G || bb_gain_sel >= BB_GAIN_NUM) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (kfree_data->flag & KFREE_FLAG_ON) {\n\t\tkfree_offset = kfree_data->bb_gain[bb_gain_sel][path];\n\t\tif (1)\n\t\t\tDBG_871X(\"%s path:%u, ch:%u, bb_gain_sel:%d, kfree_offset:%d\\n\"\n\t\t\t\t, __func__, path, ch, bb_gain_sel, kfree_offset);\n\t}\nexit:\n#endif /* CONFIG_RF_GAIN_OFFSET */\n\treturn kfree_offset;\n}\n\nvoid rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset)\n{\n\tu8 write_value;\n\n\tDBG_871X(\"kfree gain_offset 0x55:0x%x \", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff));\n\tswitch (rtw_get_chip_type(adapter)) {\n#ifdef CONFIG_RTL8703B\n\tcase RTL8703B:\n\t\twrite_value = RF_TX_GAIN_OFFSET_8703B(offset);\n\t\trtw_hal_write_rfreg(adapter, path, 0x55, 0x0fc000, write_value);\n\t\tbreak;\n#endif /* CONFIG_RTL8703B */\n#ifdef CONFIG_RTL8188F\n\tcase RTL8188F:\n\t\twrite_value = RF_TX_GAIN_OFFSET_8188F(offset);\n\t\trtw_hal_write_rfreg(adapter, path, 0x55, 0x0fc000, write_value);\n\t\tbreak;\n#endif /* CONFIG_RTL8188F */\n#ifdef CONFIG_RTL8192E\n\tcase RTL8192E:\n\t\twrite_value = RF_TX_GAIN_OFFSET_8192E(offset);\n\t\trtw_hal_write_rfreg(adapter, path, 0x55, 0x0f8000, write_value);\n\t\tbreak;\n#endif /* CONFIG_RTL8188F */\n\n#ifdef CONFIG_RTL8821A\n\tcase RTL8821:\n\t\twrite_value = RF_TX_GAIN_OFFSET_8821A(offset);\n\t\trtw_hal_write_rfreg(adapter, path, 0x55, 0x0f8000, write_value);\n\t\tbreak;\n#endif /* CONFIG_RTL8821A */\n#ifdef CONFIG_RTL8814A\n\t\tcase RTL8814A:\n\t\tDBG_871X(\"\\nkfree by PhyDM on the sw CH. path %d\\n\", path);\n\t\tbreak;\n#endif /* CONFIG_RTL8821A */\n\n\tdefault:\n\t\trtw_warn_on(1);\n\t\tbreak;\n\t}\n\n\tDBG_871X(\" after :0x%x\\n\", rtw_hal_read_rfreg(adapter, path, 0x55, 0xffffffff));\n}\n\nvoid rtw_rf_apply_tx_gain_offset(_adapter *adapter, u8 ch)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\ts8 kfree_offset = 0;\n\ts8 tx_pwr_track_offset = 0; /* TODO: 8814A should consider tx pwr track when setting tx gain offset */\n\ts8 total_offset;\n\tint i;\n\n\tfor (i = 0; i < hal_data->NumTotalRFPath; i++) {\n\t\tkfree_offset = rtw_rf_get_kfree_tx_gain_offset(adapter, i, ch);\n\t\ttotal_offset = kfree_offset + tx_pwr_track_offset;\n\t\trtw_rf_set_tx_gain_offset(adapter, i, total_offset);\n\t}\n}\n\nbool rtw_is_dfs_range(u32 hi, u32 lo)\n{\n\treturn rtw_is_range_overlap(hi, lo, 5720 + 10, 5260 - 10)?_TRUE:_FALSE;\n}\n\nbool rtw_is_dfs_ch(u8 ch, u8 bw, u8 offset)\n{\n\tu32 hi, lo;\n\n\tif (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE)\n\t\treturn _FALSE;\n\n\treturn rtw_is_dfs_range(hi, lo)?_TRUE:_FALSE;\n}\n\nbool rtw_is_long_cac_range(u32 hi, u32 lo)\n{\n\treturn rtw_is_range_overlap(hi, lo, 5660 + 10, 5600 - 10)?_TRUE:_FALSE;\n}\n\nbool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset)\n{\n\tu32 hi, lo;\n\n\tif (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE)\n\t\treturn _FALSE;\n\n\treturn rtw_is_long_cac_range(hi, lo)?_TRUE:_FALSE;\n}\n\n"
  },
  {
    "path": "core/rtw_security.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define  _RTW_SECURITY_C_\n\n#include <drv_types.h>\n\nstatic const char *_security_type_str[] = {\n\t\"N/A\",\n\t\"WEP40\",\n\t\"TKIP\",\n\t\"TKIP_WM\",\n\t\"AES\",\n\t\"WEP104\",\n\t\"SMS4\",\n\t\"WEP_WPA\",\n\t\"BIP\",\n};\n\nconst char *security_type_str(u8 value)\n{\n#ifdef CONFIG_IEEE80211W\n\tif (value <= _BIP_)\n#else\n\tif (value <= _WEP_WPA_MIXED_)\n#endif\n\t\treturn _security_type_str[value];\n\treturn NULL;\n}\n\n#ifdef DBG_SW_SEC_CNT\n#define WEP_SW_ENC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->wep_sw_enc_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->wep_sw_enc_cnt_mc++; \\\n\telse \\\n\t\tsec->wep_sw_enc_cnt_uc++;\n\n#define WEP_SW_DEC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->wep_sw_dec_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->wep_sw_dec_cnt_mc++; \\\n\telse \\\n\t\tsec->wep_sw_dec_cnt_uc++;\n\n#define TKIP_SW_ENC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->tkip_sw_enc_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->tkip_sw_enc_cnt_mc++; \\\n\telse \\\n\t\tsec->tkip_sw_enc_cnt_uc++;\n\n#define TKIP_SW_DEC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->tkip_sw_dec_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->tkip_sw_dec_cnt_mc++; \\\n\telse \\\n\t\tsec->tkip_sw_dec_cnt_uc++;\n\n#define AES_SW_ENC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->aes_sw_enc_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->aes_sw_enc_cnt_mc++; \\\n\telse \\\n\t\tsec->aes_sw_enc_cnt_uc++;\n\n#define AES_SW_DEC_CNT_INC(sec, ra) \\\n\tif (is_broadcast_mac_addr(ra)) \\\n\t\tsec->aes_sw_dec_cnt_bc++; \\\n\telse if (is_multicast_mac_addr(ra)) \\\n\t\tsec->aes_sw_dec_cnt_mc++; \\\n\telse \\\n\t\tsec->aes_sw_dec_cnt_uc++;\n#else\n#define WEP_SW_ENC_CNT_INC(sec, ra)\n#define WEP_SW_DEC_CNT_INC(sec, ra)\n#define TKIP_SW_ENC_CNT_INC(sec, ra)\n#define TKIP_SW_DEC_CNT_INC(sec, ra)\n#define AES_SW_ENC_CNT_INC(sec, ra)\n#define AES_SW_DEC_CNT_INC(sec, ra)\n#endif /* DBG_SW_SEC_CNT */\n\n//=====WEP related===== \n\n#define CRC32_POLY 0x04c11db7\n\nstruct arc4context\n{\n\tu32 x;\n\tu32 y;\n\tu8 state[256];\n};\n\n\nstatic void arcfour_init(struct arc4context \t*parc4ctx, u8 * key,u32\tkey_len)\n{\n\tu32\tt, u;\n\tu32\tkeyindex;\n\tu32\tstateindex;\n\tu8 * state;\n\tu32\tcounter;\n_func_enter_;\n\tstate = parc4ctx->state;\n\tparc4ctx->x = 0;\n\tparc4ctx->y = 0;\n\tfor (counter = 0; counter < 256; counter++)\n\t\tstate[counter] = (u8)counter;\n\tkeyindex = 0;\n\tstateindex = 0;\n\tfor (counter = 0; counter < 256; counter++)\n\t{\n\t\tt = state[counter];\n\t\tstateindex = (stateindex + key[keyindex] + t) & 0xff;\n\t\tu = state[stateindex];\n\t\tstate[stateindex] = (u8)t;\n\t\tstate[counter] = (u8)u;\n\t\tif (++keyindex >= key_len)\n\t\t\tkeyindex = 0;\n\t}\n_func_exit_;\t\n}\nstatic u32 arcfour_byte(\tstruct arc4context\t*parc4ctx)\n{\n\tu32 x;\n\tu32 y;\n\tu32 sx, sy;\n\tu8 * state;\n_func_enter_;\n\tstate = parc4ctx->state;\n\tx = (parc4ctx->x + 1) & 0xff;\n\tsx = state[x];\n\ty = (sx + parc4ctx->y) & 0xff;\n\tsy = state[y];\n\tparc4ctx->x = x;\n\tparc4ctx->y = y;\n\tstate[y] = (u8)sx;\n\tstate[x] = (u8)sy;\n_func_exit_;\t\n\treturn state[(sx + sy) & 0xff];\n}\n              \n           \nstatic void arcfour_encrypt(\tstruct arc4context\t*parc4ctx, \n\tu8 * dest,\n\tu8 * src, \n\tu32 len)\n{\n\tu32\ti;\n_func_enter_;\t\n\tfor (i = 0; i < len; i++)\n\t\tdest[i] = src[i] ^ (unsigned char)arcfour_byte(parc4ctx);\n_func_exit_;\t\t\n}\n\nstatic sint bcrc32initialized = 0;\nstatic u32 crc32_table[256];\n\n\nstatic u8 crc32_reverseBit( u8 data)\n{\n\treturn( (u8)((data<<7)&0x80) | ((data<<5)&0x40) | ((data<<3)&0x20) | ((data<<1)&0x10) | ((data>>1)&0x08) | ((data>>3)&0x04) | ((data>>5)&0x02) | ((data>>7)&0x01) );\n}\n\nstatic void crc32_init(void)\n{\n_func_enter_;\t\n\tif (bcrc32initialized == 1) \n\t\tgoto exit;\n\telse{\n\t\tsint i, j;\n\t\tu32 c;\n\t\tu8 *p=(u8 *)&c, *p1;\n\t\tu8 k;\n\n\t\tc = 0x12340000;\n\n\t\tfor (i = 0; i < 256; ++i) \n\t\t{\n\t\t\tk = crc32_reverseBit((u8)i);\n\t\t\tfor (c = ((u32)k) << 24, j = 8; j > 0; --j){\n\t\t\t\tc = c & 0x80000000 ? (c << 1) ^ CRC32_POLY : (c << 1);\n\t\t\t}\n\t\t\tp1 = (u8 *)&crc32_table[i];\n\n\t\t\tp1[0] = crc32_reverseBit(p[3]);\n\t\t\tp1[1] = crc32_reverseBit(p[2]);\n\t\t\tp1[2] = crc32_reverseBit(p[1]);\n\t\t\tp1[3] = crc32_reverseBit(p[0]);\n\t\t}\n\t\tbcrc32initialized= 1;\n\t}\nexit:\t\n_func_exit_;\t\t\t\n}\n\nstatic u32 getcrc32(u8 *buf, sint len)\n{\n\tu8 *p;\n\tu32  crc;\n_func_enter_;\t\n\tif (bcrc32initialized == 0) crc32_init();\n\n\tcrc = 0xffffffff;       /* preload shift register, per CRC-32 spec */\n\n\tfor (p = buf; len > 0; ++p, --len) \n\t{\n\t\tcrc = crc32_table[ (crc ^ *p) & 0xff] ^ (crc >> 8);\n\t}\n_func_exit_;\t\t\t\t\n\treturn ~crc;    /* transmit complement, per CRC-32 spec */\n}\n\n\n/*\n\tNeed to consider the fragment  situation\n*/\nvoid rtw_wep_encrypt(_adapter *padapter, u8 *pxmitframe)\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// exclude ICV\n\t\n\tunsigned char\tcrc[4];\n\tstruct arc4context\t mycontext;\n\n\tsint\tcurfragnum,length;\n\tu32\tkeylength;\n\n\tu8\t*pframe, *payload,*iv;    //,*wepkey\n\tu8\twepkey[16];\n\tu8   hw_hdr_offset=0;\n\tstruct\tpkt_attrib\t *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\tstruct\txmit_priv\t\t*pxmitpriv=&padapter->xmitpriv;\n\t\n_func_enter_;\t\n\n\t\n\tif(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)\n\t\treturn;\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\thw_hdr_offset = TXDESC_SIZE +\n\t\t (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);\t\n#else\n\t#ifdef CONFIG_TX_EARLY_MODE\n\thw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE;\n\t#else\n\thw_hdr_offset = TXDESC_OFFSET;\n\t#endif\n#endif\n\n\tpframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset;\n\t\n\t//start to encrypt each fragment\n\tif((pattrib->encrypt==_WEP40_)||(pattrib->encrypt==_WEP104_))\n\t{\n\t\tkeylength=psecuritypriv->dot11DefKeylen[psecuritypriv->dot11PrivacyKeyIndex];\n\n\t\tfor(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++)\n\t\t{\n\t\t\tiv=pframe+pattrib->hdrlen;\n\t\t\t_rtw_memcpy(&wepkey[0], iv, 3);\n\t\t\t_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength);\n\t\t\tpayload=pframe+pattrib->iv_len+pattrib->hdrlen;\n\n\t\t\tif((curfragnum+1)==pattrib->nr_frags)\n\t\t\t{\t//the last fragment\n\t\t\t\n\t\t\t\tlength=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;\n\t\t\t\n\t\t\t\t*((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));\n\n\t\t\t\tarcfour_init(&mycontext, wepkey,3+keylength);\n\t\t\t\tarcfour_encrypt(&mycontext, payload, payload, length);\n\t\t\t\tarcfour_encrypt(&mycontext, payload+length, crc, 4);\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tlength=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;\n\t\t\t\t*((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));\n\t\t\t\tarcfour_init(&mycontext, wepkey,3+keylength);\n\t\t\t\tarcfour_encrypt(&mycontext, payload, payload, length);\n\t\t\t\tarcfour_encrypt(&mycontext, payload+length, crc, 4);\n\t\n\t\t\tpframe+=pxmitpriv->frag_len;\n\t\t\tpframe=(u8 *)RND4((SIZE_PTR)(pframe));\n\n\t\t\t}\n\t\t\t\n\t\t}\t\t\n\n\t\tWEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);\n\t}\n\t\n_func_exit_;\t\t\t\t\t\t\n\n}\n\nvoid rtw_wep_decrypt(_adapter  *padapter, u8 *precvframe)\n{\t\t\t\t\t\t\t\t\n\t// exclude ICV\n\tu8\tcrc[4];\n\tstruct arc4context\t mycontext;\n\tsint \tlength;\n\tu32\tkeylength;\n\tu8\t*pframe, *payload,*iv,wepkey[16];\n\tu8\t keyindex;\n\tstruct\trx_pkt_attrib\t *prxattrib = &(((union recv_frame*)precvframe)->u.hdr.attrib);\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\n_func_enter_;\t\n\n\tpframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\n\t\n\t//start to decrypt recvframe\n\tif((prxattrib->encrypt==_WEP40_)||(prxattrib->encrypt==_WEP104_))\n\t{\n\t\tiv=pframe+prxattrib->hdrlen;\n\t\t//keyindex=(iv[3]&0x3);\n\t\tkeyindex = prxattrib->key_index;\n\t\tkeylength=psecuritypriv->dot11DefKeylen[keyindex];\n\t\t_rtw_memcpy(&wepkey[0], iv, 3);\n\t\t//_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[psecuritypriv->dot11PrivacyKeyIndex].skey[0],keylength);\n\t\t_rtw_memcpy(&wepkey[3], &psecuritypriv->dot11DefKey[keyindex].skey[0],keylength);\n\t\tlength= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;\n\n\t\tpayload=pframe+prxattrib->iv_len+prxattrib->hdrlen;\n\t\t\n\t\t//decrypt payload include icv\n\t\tarcfour_init(&mycontext, wepkey,3+keylength);\n\t\tarcfour_encrypt(&mycontext, payload, payload,  length);\n\t\t\t\t\n\t\t//calculate icv and compare the icv\n\t\t*((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4));\n\t\t\n\t\tif(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4])\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\\n\",\n\t\t\t\t\t\tcrc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));\n\t\t}\n\n\t\tWEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);\n\t}\n\t\n_func_exit_;\t\t\n\n\treturn;\n\t\n}\n\n//3 \t\t=====TKIP related=====\n\nstatic u32 secmicgetuint32( u8 * p )\n// Convert from Byte[] to Us4Byte32 in a portable way\n{\n\ts32 i;\n\tu32 res = 0;\n_func_enter_;\t\t\n\tfor( i=0; i<4; i++ )\n\t{\n\t\tres |= ((u32)(*p++)) << (8*i);\n\t}\n_func_exit_;\t\t\n\treturn res;\n}\n\nstatic void secmicputuint32( u8 * p, u32 val )\n// Convert from Us4Byte32 to Byte[] in a portable way\n{\n\tlong i;\n_func_enter_;\t\t\t\n\tfor( i=0; i<4; i++ )\n\t{\n\t\t*p++ = (u8) (val & 0xff);\n\t\tval >>= 8;\n\t}\n_func_exit_;\t\t\n}\n\nstatic void secmicclear(struct mic_data *pmicdata)\n{\n// Reset the state to the empty message.\n_func_enter_;\t\n\tpmicdata->L = pmicdata->K0;\n\tpmicdata->R = pmicdata->K1;\n\tpmicdata->nBytesInM = 0;\n\tpmicdata->M = 0;\n_func_exit_;\t\n}\n\nvoid rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key )\n{\n\t// Set the key\n_func_enter_;\t\t\n\tpmicdata->K0 = secmicgetuint32( key );\n\tpmicdata->K1 = secmicgetuint32( key + 4 );\n\t// and reset the message\n\tsecmicclear(pmicdata);\n_func_exit_;\t\t\n}\n\nvoid rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b )\n{\n_func_enter_;\t\n\t// Append the byte to our word-sized buffer\n\tpmicdata->M |= ((unsigned long)b) << (8*pmicdata->nBytesInM);\n\tpmicdata->nBytesInM++;\n\t// Process the word if it is full.\n\tif( pmicdata->nBytesInM >= 4 )\n\t{\n\t\tpmicdata->L ^= pmicdata->M;\n\t\tpmicdata->R ^= ROL32( pmicdata->L, 17 );\n\t\tpmicdata->L += pmicdata->R;\n\t\tpmicdata->R ^= ((pmicdata->L & 0xff00ff00) >> 8) | ((pmicdata->L & 0x00ff00ff) << 8);\n\t\tpmicdata->L += pmicdata->R;\n\t\tpmicdata->R ^= ROL32( pmicdata->L, 3 );\n\t\tpmicdata->L += pmicdata->R;\n\t\tpmicdata->R ^= ROR32( pmicdata->L, 2 );\n\t\tpmicdata->L += pmicdata->R;\n\t\t// Clear the buffer\n\t\tpmicdata->M = 0;\n\t\tpmicdata->nBytesInM = 0;\n\t}\n_func_exit_;\t\t\t\n}\n\nvoid rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nbytes )\n{\n_func_enter_;\t\n\t// This is simple\n\twhile( nbytes > 0 )\n\t{\n\t\trtw_secmicappendbyte(pmicdata, *src++ );\n\t\tnbytes--;\n\t}\n_func_exit_;\t\t\t\n}\n\nvoid rtw_secgetmic(struct mic_data *pmicdata, u8 * dst )\n{\n_func_enter_;\t\n\t// Append the minimum padding\n\trtw_secmicappendbyte(pmicdata, 0x5a );\n\trtw_secmicappendbyte(pmicdata, 0 );\n\trtw_secmicappendbyte(pmicdata, 0 );\n\trtw_secmicappendbyte(pmicdata, 0 );\n\trtw_secmicappendbyte(pmicdata, 0 );\n\t// and then zeroes until the length is a multiple of 4\n\twhile( pmicdata->nBytesInM != 0 )\n\t{\n\t\trtw_secmicappendbyte(pmicdata, 0 );\n\t}\n\t// The appendByte function has already computed the result.\n\tsecmicputuint32( dst, pmicdata->L );\n\tsecmicputuint32( dst+4, pmicdata->R );\n\t// Reset to the empty message.\n\tsecmicclear(pmicdata);\n_func_exit_;\t\t\n}\n\n\nvoid rtw_seccalctkipmic(u8 * key,u8 *header,u8 *data,u32 data_len,u8 *mic_code, u8 pri)\n{\n\n\tstruct mic_data\tmicdata;\n\tu8 priority[4]={0x0,0x0,0x0,0x0};\n_func_enter_;\t\t\n\trtw_secmicsetkey(&micdata, key);\n\tpriority[0]=pri;\n\t\n\t/* Michael MIC pseudo header: DA, SA, 3 x 0, Priority */\n\tif(header[1]&1){   //ToDS==1\n\t\t\trtw_secmicappend(&micdata, &header[16], 6);  //DA\n\t\tif(header[1]&2)  //From Ds==1\n\t\t\trtw_secmicappend(&micdata, &header[24], 6);\n\t\telse\n\t\t\trtw_secmicappend(&micdata, &header[10], 6);\t\t\n\t}\t\n\telse{\t//ToDS==0\n\t\trtw_secmicappend(&micdata, &header[4], 6);   //DA\n\t\tif(header[1]&2)  //From Ds==1\n\t\t\trtw_secmicappend(&micdata, &header[16], 6);\n\t\telse\n\t\t\trtw_secmicappend(&micdata, &header[10], 6);\n\n\t}\n\trtw_secmicappend(&micdata, &priority[0], 4);\n\n\t\n\trtw_secmicappend(&micdata, data, data_len);\n\n\trtw_secgetmic(&micdata,mic_code);\n_func_exit_;\t\n}\n\n\n\n\n/* macros for extraction/creation of unsigned char/unsigned short values  */\n#define RotR1(v16)   ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15))\n#define   Lo8(v16)   ((u8)( (v16)       & 0x00FF))\n#define   Hi8(v16)   ((u8)(((v16) >> 8) & 0x00FF))\n#define  Lo16(v32)   ((u16)( (v32)       & 0xFFFF))\n#define  Hi16(v32)   ((u16)(((v32) >>16) & 0xFFFF))\n#define  Mk16(hi,lo) ((lo) ^ (((u16)(hi)) << 8))\n\n/* select the Nth 16-bit word of the temporal key unsigned char array TK[]   */\n#define  TK16(N)     Mk16(tk[2*(N)+1],tk[2*(N)])\n\n/* S-box lookup: 16 bits --> 16 bits */\n#define _S_(v16)     (Sbox1[0][Lo8(v16)] ^ Sbox1[1][Hi8(v16)])\n\n/* fixed algorithm \"parameters\" */\n#define PHASE1_LOOP_CNT   8    /* this needs to be \"big enough\"     */\n#define TA_SIZE           6    /*  48-bit transmitter address       */\n#define TK_SIZE          16    /* 128-bit temporal key              */\n#define P1K_SIZE         10    /*  80-bit Phase1 key                */\n#define RC4_KEY_SIZE     16    /* 128-bit RC4KEY (104 bits unknown) */\n\n\n/* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */\nstatic const unsigned short Sbox1[2][256]=       /* Sbox for hash (can be in ROM)     */\n{ {\n   0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154,\n   0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A,\n   0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B,\n   0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B,\n   0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F,\n   0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F,\n   0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5,\n   0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F,\n   0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB,\n   0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397,\n   0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED,\n   0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A,\n   0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194,\n   0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3,\n   0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104,\n   0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D,\n   0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39,\n   0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695,\n   0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83,\n   0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76,\n   0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4,\n   0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B,\n   0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0,\n   0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018,\n   0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751,\n   0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85,\n   0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12,\n   0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9,\n   0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7,\n   0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A,\n   0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8,\n   0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A,\n  },\n \n\n  {  /* second half of table is unsigned char-reversed version of first! */\n   0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491,\n   0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC,\n   0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB,\n   0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B,\n   0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83,\n   0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A,\n   0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F,\n   0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA,\n   0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B,\n   0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713,\n   0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6,\n   0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85,\n   0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411,\n   0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B,\n   0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1,\n   0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF,\n   0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E,\n   0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6,\n   0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B,\n   0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD,\n   0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8,\n   0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2,\n   0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049,\n   0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810,\n   0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197,\n   0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F,\n   0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C,\n   0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927,\n   0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733,\n   0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5,\n   0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0,\n   0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C,\n  }\n};\n \n /*\n**********************************************************************\n* Routine: Phase 1 -- generate P1K, given TA, TK, IV32\n*\n* Inputs:\n*     tk[]      = temporal key                         [128 bits]\n*     ta[]      = transmitter's MAC address            [ 48 bits]\n*     iv32      = upper 32 bits of IV                  [ 32 bits]\n* Output:\n*     p1k[]     = Phase 1 key                          [ 80 bits]\n*\n* Note:\n*     This function only needs to be called every 2**16 packets,\n*     although in theory it could be called every packet.\n*\n**********************************************************************\n*/\nstatic void phase1(u16 *p1k,const u8 *tk,const u8 *ta,u32 iv32)\n{\n\tsint  i;\n_func_enter_;\n\t/* Initialize the 80 bits of P1K[] from IV32 and TA[0..5]     */\n\tp1k[0]      = Lo16(iv32);\n\tp1k[1]      = Hi16(iv32);\n\tp1k[2]      = Mk16(ta[1],ta[0]); /* use TA[] as little-endian */\n\tp1k[3]      = Mk16(ta[3],ta[2]);\n\tp1k[4]      = Mk16(ta[5],ta[4]);\n\n\t/* Now compute an unbalanced Feistel cipher with 80-bit block */\n\t/* size on the 80-bit block P1K[], using the 128-bit key TK[] */\n\tfor (i=0; i < PHASE1_LOOP_CNT ;i++)\n\t{                 /* Each add operation here is mod 2**16 */\n      \t\tp1k[0] += _S_(p1k[4] ^ TK16((i&1)+0));\n\t\tp1k[1] += _S_(p1k[0] ^ TK16((i&1)+2));\n\t\tp1k[2] += _S_(p1k[1] ^ TK16((i&1)+4));\n\t\tp1k[3] += _S_(p1k[2] ^ TK16((i&1)+6));\n\t\tp1k[4] += _S_(p1k[3] ^ TK16((i&1)+0));\n\t\tp1k[4] +=  (unsigned short)i;                    /* avoid \"slide attacks\" */\n        }\n_func_exit_;\n}\n \n\n/*\n**********************************************************************\n* Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16\n*\n* Inputs:\n*     tk[]      = Temporal key                         [128 bits]\n*     p1k[]     = Phase 1 output key                   [ 80 bits]\n*     iv16      = low 16 bits of IV counter            [ 16 bits]\n* Output:\n*     rc4key[]  = the key used to encrypt the packet   [128 bits]\n*\n* Note:\n*     The value {TA,IV32,IV16} for Phase1/Phase2 must be unique\n*     across all packets using the same key TK value. Then, for a\n*     given value of TK[], this TKIP48 construction guarantees that\n*     the final RC4KEY value is unique across all packets.\n*\n* Suggested implementation optimization: if PPK[] is \"overlaid\"\n*     appropriately on RC4KEY[], there is no need for the final\n*     for loop below that copies the PPK[] result into RC4KEY[].\n*\n**********************************************************************\n*/\nstatic void phase2(u8 *rc4key,const u8 *tk,const u16 *p1k,u16 iv16)\n{\n\tsint  i;\n\tu16 PPK[6];                          /* temporary key for mixing    */\n_func_enter_;\n\t/* Note: all adds in the PPK[] equations below are mod 2**16         */\n\tfor (i=0;i<5;i++) PPK[i]=p1k[i];      /* first, copy P1K to PPK      */\n\t\tPPK[5]  =  p1k[4] +iv16;             /* next,  add in IV16          */\n\n\t/* Bijective non-linear mixing of the 96 bits of PPK[0..5]           */\n\tPPK[0] +=    _S_(PPK[5] ^ TK16(0));   /* Mix key in each \"round\"     */\n\tPPK[1] +=    _S_(PPK[0] ^ TK16(1));\n\tPPK[2] +=    _S_(PPK[1] ^ TK16(2));\n\tPPK[3] +=    _S_(PPK[2] ^ TK16(3));\n\tPPK[4] +=    _S_(PPK[3] ^ TK16(4));\n\tPPK[5] +=    _S_(PPK[4] ^ TK16(5));   /* Total # S-box lookups == 6  */\n\n\t/* Final sweep: bijective, \"linear\". Rotates kill LSB correlations   */\n\tPPK[0] +=  RotR1(PPK[5] ^ TK16(6));\n\tPPK[1] +=  RotR1(PPK[0] ^ TK16(7));   /* Use all of TK[] in Phase2   */\n\tPPK[2] +=  RotR1(PPK[1]);\n\tPPK[3] +=  RotR1(PPK[2]);\n\tPPK[4] +=  RotR1(PPK[3]);\n\tPPK[5] +=  RotR1(PPK[4]);\n\t/* Note: At this point, for a given key TK[0..15], the 96-bit output */\n\t/*       value PPK[0..5] is guaranteed to be unique, as a function   */\n\t/*       of the 96-bit \"input\" value   {TA,IV32,IV16}. That is, P1K  */\n\t/*       is now a keyed permutation of {TA,IV32,IV16}.               */\n\n\t/* Set RC4KEY[0..3], which includes \"cleartext\" portion of RC4 key   */\n\trc4key[0] = Hi8(iv16);                /* RC4KEY[0..2] is the WEP IV  */\n\trc4key[1] =(Hi8(iv16) | 0x20) & 0x7F; /* Help avoid weak (FMS) keys  */\n\trc4key[2] = Lo8(iv16);\n\trc4key[3] = Lo8((PPK[5] ^ TK16(0)) >> 1);\n\t \n\n\t/* Copy 96 bits of PPK[0..5] to RC4KEY[4..15]  (little-endian)       */\n\tfor (i=0;i<6;i++)\n\t{\n\t\trc4key[4+2*i] = Lo8(PPK[i]);\n\t\trc4key[5+2*i] = Hi8(PPK[i]);\n\t}\n_func_exit_;\t\n}\n\n\n//The hlen isn't include the IV\nu32\trtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe)\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// exclude ICV\n\tu16\tpnl;\n\tu32\tpnh;\n\tu8\trc4key[16];\n\tu8   ttkey[16];\n\tu8\tcrc[4];\n\tu8   hw_hdr_offset = 0;\n\tstruct arc4context mycontext;\n\tsint \t\t\tcurfragnum,length;\n\tu32\tprwskeylen;\n\n\tu8\t*pframe, *payload,*iv,*prwskey;\n\tunion pn48 dot11txpn;\n\t//struct\tsta_info\t\t*stainfo;\n\tstruct\tpkt_attrib\t *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\tstruct\txmit_priv\t\t*pxmitpriv=&padapter->xmitpriv;\n\tu32\tres=_SUCCESS;\n_func_enter_;\n\n\tif(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)\n\t\treturn _FAIL;\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\thw_hdr_offset = TXDESC_SIZE +\n\t\t (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);\t\n#else\n\t#ifdef CONFIG_TX_EARLY_MODE\n\thw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE;\n\t#else\n\thw_hdr_offset = TXDESC_OFFSET;\n\t#endif\n#endif\n\n\tpframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset;\n\t//4 start to encrypt each fragment\n\tif(pattrib->encrypt==_TKIP_){\n\n/*\n\t\tif(pattrib->psta)\n\t\t{\n\t\t\tstainfo = pattrib->psta;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\t\tstainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );\n\t\t}\t\n*/\t\n\t\t//if (stainfo!=NULL)\n\t\t{\n/*\n\t\t\tif(!(stainfo->state &_FW_LINKED))\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, stainfo->state);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n*/\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_tkip_encrypt: stainfo!=NULL!!!\\n\"));\n\n\t\t\tif(IS_MCAST(pattrib->ra))\n\t\t\t{\n\t\t\t\tprwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//prwskey=&stainfo->dot118021x_UncstKey.skey[0];\n\t\t\t\tprwskey=pattrib->dot118021x_UncstKey.skey;\n\t\t\t}\n\n\t\t\tprwskeylen=16;\n\n\t\t\tfor(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){\n\t\t\t\tiv=pframe+pattrib->hdrlen;\n\t\t\t\tpayload=pframe+pattrib->iv_len+pattrib->hdrlen;\n\t\t\t\t\n\t\t\t\tGET_TKIP_PN(iv, dot11txpn);\n\n\t\t\t\tpnl=(u16)(dot11txpn.val);\n\t\t\t\tpnh=(u32)(dot11txpn.val>>16);\n\n\t\t\t\tphase1((u16 *)&ttkey[0],prwskey,&pattrib->ta[0],pnh);\n\n\t\t\t\tphase2(&rc4key[0],prwskey,(u16 *)&ttkey[0],pnl);\t\n\n\t\t\t\tif((curfragnum+1)==pattrib->nr_frags){\t//4 the last fragment\n\t\t\t\t\tlength=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_info_,(\"pattrib->iv_len =%x, pattrib->icv_len =%x\\n\", pattrib->iv_len,pattrib->icv_len));\n\t\t\t\t\t*((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/\n\n\t\t\t\t\tarcfour_init(&mycontext, rc4key,16);\n\t\t\t\t\tarcfour_encrypt(&mycontext, payload, payload, length);\n\t\t\t\t\tarcfour_encrypt(&mycontext, payload+length, crc, 4);\n\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tlength=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;\n\t\t\t\t\t*((u32 *)crc)=cpu_to_le32(getcrc32(payload,length));/* modified by Amy*/\n\t\t\t\t\tarcfour_init(&mycontext,rc4key,16);\n\t\t\t\t\tarcfour_encrypt(&mycontext, payload, payload, length);\n\t\t\t\t\tarcfour_encrypt(&mycontext, payload+length, crc, 4);\n\t\n\t\t\t\tpframe+=pxmitpriv->frag_len;\n\t\t\t\tpframe=(u8 *)RND4((SIZE_PTR)(pframe));\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tTKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra);\n\t\t}\n/*\n\t\telse{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_tkip_encrypt: stainfo==NULL!!!\\n\"));\n                        DBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\t\tres=_FAIL;\n\t\t}\n*/\t\t\n\t\t\t\t\t\t\n\t}\n_func_exit_;\t\n\treturn res;\n\t\t\t\t\n}\n\n\n//The hlen isn't include the IV\nu32 rtw_tkip_decrypt(_adapter *padapter, u8 *precvframe)\n{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// exclude ICV\n\tu16 pnl;\n\tu32 pnh;\n\tu8   rc4key[16];\n\tu8   ttkey[16];\n\tu8\tcrc[4];\n\tstruct arc4context mycontext;\n\tsint \t\t\tlength;\n\tu32\tprwskeylen;\n\n\tu8\t*pframe, *payload,*iv,*prwskey;\n\tunion pn48 dot11txpn;\n\tstruct\tsta_info\t\t*stainfo;\n\tstruct\trx_pkt_attrib\t *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n//\tstruct\trecv_priv\t\t*precvpriv=&padapter->recvpriv;\n\tu32\t\tres=_SUCCESS;\n\n_func_enter_;\n\n\tpframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\n\t\n\t//4 start to decrypt recvframe\n\tif(prxattrib->encrypt==_TKIP_){\n\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] );\n\t\tif (stainfo!=NULL){\n\n\t\t\tif(IS_MCAST(prxattrib->ra))\n\t\t\t{\n\t\t\t\tstatic u32 start = 0;\n\t\t\t\tstatic u32 no_gkey_bc_cnt = 0;\n\t\t\t\tstatic u32 no_gkey_mc_cnt = 0;\n\n\t\t\t\tif(psecuritypriv->binstallGrpkey==_FALSE)\n\t\t\t\t{\n\t\t\t\t\tres=_FAIL;\n\n\t\t\t\t\tif (start == 0)\n\t\t\t\t\t\tstart = rtw_get_current_time();\n\n\t\t\t\t\tif (is_broadcast_mac_addr(prxattrib->ra))\n\t\t\t\t\t\tno_gkey_bc_cnt++;\n\t\t\t\t\telse\n\t\t\t\t\t\tno_gkey_mc_cnt++;\n\n\t\t\t\t\tif (rtw_get_passing_time_ms(start) > 1000) {\n\t\t\t\t\t\tif (no_gkey_bc_cnt || no_gkey_mc_cnt) {\n\t\t\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\\n\",\n\t\t\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstart = rtw_get_current_time();\n\t\t\t\t\t\tno_gkey_bc_cnt = 0;\n\t\t\t\t\t\tno_gkey_mc_cnt = 0;\n\t\t\t\t\t}\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t\tif (no_gkey_bc_cnt || no_gkey_mc_cnt) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);\n\t\t\t\t}\n\t\t\t\tstart = 0;\n\t\t\t\tno_gkey_bc_cnt = 0;\n\t\t\t\tno_gkey_mc_cnt = 0;\n\n\t\t\t\t//DBG_871X(\"rx bc/mc packets, to perform sw rtw_tkip_decrypt\\n\");\n\t\t\t\t//prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;\n\t\t\t\tprwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;\n\t\t\t\tprwskeylen=16;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprwskey=&stainfo->dot118021x_UncstKey.skey[0];\n\t\t\t\tprwskeylen=16;\n\t\t\t}\n\t\t\t\n\t\t\tiv=pframe+prxattrib->hdrlen;\n\t\t\tpayload=pframe+prxattrib->iv_len+prxattrib->hdrlen;\n\t\t\tlength= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;\n\t\t\t\t\n\t\t\tGET_TKIP_PN(iv, dot11txpn);\n\n\t\t\tpnl=(u16)(dot11txpn.val);\n\t\t\tpnh=(u32)(dot11txpn.val>>16);\n\n\t\t\tphase1((u16 *)&ttkey[0],prwskey,&prxattrib->ta[0],pnh);\n\t\t\tphase2(&rc4key[0],prwskey,(unsigned short *)&ttkey[0],pnl);\t\n\n\t\t\t//4 decrypt payload include icv\n\t\t\t\t\t\n\t\t\tarcfour_init(&mycontext, rc4key,16);\n\t\t\tarcfour_encrypt(&mycontext, payload, payload, length);\n\n\t\t\t*((u32 *)crc)=le32_to_cpu(getcrc32(payload,length-4));\n\n\t\t\tif(crc[3]!=payload[length-1] || crc[2]!=payload[length-2] || crc[1]!=payload[length-3] || crc[0]!=payload[length-4])\n\t\t\t{\n\t\t\t    RT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\\n\",\n\t\t\t\t\t\tcrc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));\n\t\t\t\tres=_FAIL;\n\t\t\t}\n\n\t\t\tTKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);\n\t\t}\n\t\telse{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_tkip_decrypt: stainfo==NULL!!!\\n\"));\n\t\t\tres=_FAIL;\n\t\t}\n\t\t\t\t\t\t\n\t}\n_func_exit_;\t\nexit:\n\treturn res;\n\t\t\t\t\n}\n\n\n//3\t\t\t=====AES related=====\n\n\n\n#define MAX_MSG_SIZE\t2048\n/*****************************/\n/******** SBOX Table *********/\n/*****************************/\n\n  static  u8 sbox_table[256] =\n    {\n        0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n        0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n        0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n        0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n        0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,\n        0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n        0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,\n        0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n        0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n        0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n        0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,\n        0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n        0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,\n        0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n        0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n        0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n        0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,\n        0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n        0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\n        0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n        0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n        0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n        0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,\n        0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n        0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,\n        0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n        0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n        0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n        0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,\n        0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n        0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,\n        0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16\n    };\n\n/*****************************/\n/**** Function Prototypes ****/\n/*****************************/\n\nstatic void bitwise_xor(u8 *ina, u8 *inb, u8 *out);\nstatic void construct_mic_iv(\n                        u8 *mic_header1,\n                        sint qc_exists,\n                        sint a4_exists,\n                        u8 *mpdu,\n                        uint payload_length,\n                        u8 * pn_vector,\n                        uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use\nstatic void construct_mic_header1(\n                        u8 *mic_header1,\n                        sint header_length,\n                        u8 *mpdu,\n                        uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use\nstatic void construct_mic_header2(\n                    u8 *mic_header2,\n                    u8 *mpdu,\n                    sint a4_exists,\n                    sint qc_exists);\nstatic void construct_ctr_preload(\n                        u8 *ctr_preload,\n                        sint a4_exists,\n                        sint qc_exists,\n                        u8 *mpdu,\n                        u8 *pn_vector,\n                        sint c,\n                        uint frtype);// add for CONFIG_IEEE80211W, none 11w also can use\nstatic void xor_128(u8 *a, u8 *b, u8 *out);\nstatic void xor_32(u8 *a, u8 *b, u8 *out);\nstatic u8 sbox(u8 a);\nstatic void next_key(u8 *key, sint round);\nstatic void byte_sub(u8 *in, u8 *out);\nstatic void shift_row(u8 *in, u8 *out);\nstatic void mix_column(u8 *in, u8 *out);\n#ifndef PLATFORM_FREEBSD \nstatic void add_round_key( u8 *shiftrow_in,\n                    u8 *mcol_in,\n                    u8 *block_in,\n                    sint round,\n                    u8 *out);\n#endif //PLATFORM_FREEBSD\nstatic void aes128k128d(u8 *key, u8 *data, u8 *ciphertext);\n\n\n/****************************************/\n/* aes128k128d()                        */\n/* Performs a 128 bit AES encrypt with  */\n/* 128 bit data.                        */\n/****************************************/\nstatic void xor_128(u8 *a, u8 *b, u8 *out)\n{\n    sint i;\n_func_enter_;\t\n    for (i=0;i<16; i++)\n    {\n        out[i] = a[i] ^ b[i];\n    }\n_func_exit_;\t\t\n}\n\n\nstatic void xor_32(u8 *a, u8 *b, u8 *out)\n{\n    sint i;\n_func_enter_;\t\t\n    for (i=0;i<4; i++)\n    {\n        out[i] = a[i] ^ b[i];\n    }\n_func_exit_;\t\t\n}\n\n\nstatic u8 sbox(u8 a)\n{\n    return sbox_table[(sint)a];\n}\n\n\nstatic void next_key(u8 *key, sint round)\n{\n    u8 rcon;\n    u8 sbox_key[4];\n    u8 rcon_table[12] =\n    {\n        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n        0x1b, 0x36, 0x36, 0x36\n    };\n_func_enter_;\t\t\n    sbox_key[0] = sbox(key[13]);\n    sbox_key[1] = sbox(key[14]);\n    sbox_key[2] = sbox(key[15]);\n    sbox_key[3] = sbox(key[12]);\n\n    rcon = rcon_table[round];\n\n    xor_32(&key[0], sbox_key, &key[0]);\n    key[0] = key[0] ^ rcon;\n\n    xor_32(&key[4], &key[0], &key[4]);\n    xor_32(&key[8], &key[4], &key[8]);\n    xor_32(&key[12], &key[8], &key[12]);\n_func_exit_;\t\t\n}\n\n\nstatic void byte_sub(u8 *in, u8 *out)\n{\n    sint i;\n_func_enter_;\t\t\t\n    for (i=0; i< 16; i++)\n    {\n        out[i] = sbox(in[i]);\n    }\n_func_exit_;\t\n}\n\n\nstatic void shift_row(u8 *in, u8 *out)\n{\n_func_enter_;\t\n    out[0] =  in[0];\n    out[1] =  in[5];\n    out[2] =  in[10];\n    out[3] =  in[15];\n    out[4] =  in[4];\n    out[5] =  in[9];\n    out[6] =  in[14];\n    out[7] =  in[3];\n    out[8] =  in[8];\n    out[9] =  in[13];\n    out[10] = in[2];\n    out[11] = in[7];\n    out[12] = in[12];\n    out[13] = in[1];\n    out[14] = in[6];\n    out[15] = in[11];\n_func_exit_;\t\t\n}\n\n\nstatic void mix_column(u8 *in, u8 *out)\n{\n    sint i;\n    u8 add1b[4];\n    u8 add1bf7[4];\n    u8 rotl[4];\n    u8 swap_halfs[4];\n    u8 andf7[4];\n    u8 rotr[4];\n    u8 temp[4];\n    u8 tempb[4];\n_func_enter_;\t\n    for (i=0 ; i<4; i++)\n    {\n        if ((in[i] & 0x80)== 0x80)\n            add1b[i] = 0x1b;\n        else\n            add1b[i] = 0x00;\n    }\n\n    swap_halfs[0] = in[2];    /* Swap halfs */\n    swap_halfs[1] = in[3];\n    swap_halfs[2] = in[0];\n    swap_halfs[3] = in[1];\n\n    rotl[0] = in[3];        /* Rotate left 8 bits */\n    rotl[1] = in[0];\n    rotl[2] = in[1];\n    rotl[3] = in[2];\n\n    andf7[0] = in[0] & 0x7f;\n    andf7[1] = in[1] & 0x7f;\n    andf7[2] = in[2] & 0x7f;\n    andf7[3] = in[3] & 0x7f;\n\n    for (i = 3; i>0; i--)    /* logical shift left 1 bit */\n    {\n        andf7[i] = andf7[i] << 1;\n        if ((andf7[i-1] & 0x80) == 0x80)\n        {\n            andf7[i] = (andf7[i] | 0x01);\n        }\n    }\n    andf7[0] = andf7[0] << 1;\n    andf7[0] = andf7[0] & 0xfe;\n\n    xor_32(add1b, andf7, add1bf7);\n\n    xor_32(in, add1bf7, rotr);\n\n    temp[0] = rotr[0];         /* Rotate right 8 bits */\n    rotr[0] = rotr[1];\n    rotr[1] = rotr[2];\n    rotr[2] = rotr[3];\n    rotr[3] = temp[0];\n\n    xor_32(add1bf7, rotr, temp);\n    xor_32(swap_halfs, rotl,tempb);\n    xor_32(temp, tempb, out);\n_func_exit_;\t\t\n}\n\n\nstatic void aes128k128d(u8 *key, u8 *data, u8 *ciphertext)\n{\n    sint round;\n    sint i;\n    u8 intermediatea[16];\n    u8 intermediateb[16];\n    u8 round_key[16];\n_func_enter_;\t\n    for(i=0; i<16; i++) round_key[i] = key[i];\n\n    for (round = 0; round < 11; round++)\n    {\n        if (round == 0)\n        {\n            xor_128(round_key, data, ciphertext);\n            next_key(round_key, round);\n        }\n        else if (round == 10)\n        {\n            byte_sub(ciphertext, intermediatea);\n            shift_row(intermediatea, intermediateb);\n            xor_128(intermediateb, round_key, ciphertext);\n        }\n        else    /* 1 - 9 */\n        {\n            byte_sub(ciphertext, intermediatea);\n            shift_row(intermediatea, intermediateb);\n            mix_column(&intermediateb[0], &intermediatea[0]);\n            mix_column(&intermediateb[4], &intermediatea[4]);\n            mix_column(&intermediateb[8], &intermediatea[8]);\n            mix_column(&intermediateb[12], &intermediatea[12]);\n            xor_128(intermediatea, round_key, ciphertext);\n            next_key(round_key, round);\n        }\n    }\n_func_exit_;\t\n}\n\n\n/************************************************/\n/* construct_mic_iv()                           */\n/* Builds the MIC IV from header fields and PN  */\n/* Baron think the function is construct CCM    */\n/* nonce                                        */\n/************************************************/\nstatic void construct_mic_iv(\n                        u8 *mic_iv,\n                        sint qc_exists,\n                        sint a4_exists,\n                        u8 *mpdu,\n                        uint payload_length,\n                        u8 *pn_vector,\n                        uint frtype// add for CONFIG_IEEE80211W, none 11w also can use\n                        )\n{\n    sint i;\n_func_enter_;\t\n    mic_iv[0] = 0x59;\n    if (qc_exists && a4_exists) mic_iv[1] = mpdu[30] & 0x0f;    /* QoS_TC           */\n    if (qc_exists && !a4_exists) mic_iv[1] = mpdu[24] & 0x0f;   /* mute bits 7-4    */\n    if (!qc_exists) mic_iv[1] = 0x00;\n#ifdef CONFIG_IEEE80211W\n\t//802.11w management frame should set management bit(4)\n    if(frtype == WIFI_MGT_TYPE)\n\t\tmic_iv[1] |= BIT(4);\n#endif //CONFIG_IEEE80211W\n    for (i = 2; i < 8; i++)\n        mic_iv[i] = mpdu[i + 8];                    /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */\n    #ifdef CONSISTENT_PN_ORDER\n        for (i = 8; i < 14; i++)\n            mic_iv[i] = pn_vector[i - 8];           /* mic_iv[8:13] = PN[0:5] */\n    #else\n        for (i = 8; i < 14; i++)\n            mic_iv[i] = pn_vector[13 - i];          /* mic_iv[8:13] = PN[5:0] */\n    #endif\n    mic_iv[14] = (unsigned char) (payload_length / 256);\n    mic_iv[15] = (unsigned char) (payload_length % 256);\n_func_exit_;\t\t\n}\n\n\n/************************************************/\n/* construct_mic_header1()                      */\n/* Builds the first MIC header block from       */\n/* header fields.                               */\n/* Build AAD SC,A1,A2                           */\n/************************************************/\nstatic void construct_mic_header1(\n                        u8 *mic_header1,\n                        sint header_length,\n                        u8 *mpdu,\n                        uint frtype// add for CONFIG_IEEE80211W, none 11w also can use\n                        )\n{\n_func_enter_;\t\n    mic_header1[0] = (u8)((header_length - 2) / 256);\n    mic_header1[1] = (u8)((header_length - 2) % 256);\n#ifdef CONFIG_IEEE80211W\n    //802.11w management frame don't AND subtype bits 4,5,6 of frame control field\n    if(frtype == WIFI_MGT_TYPE)\n\t\tmic_header1[2] = mpdu[0];\n\telse\n#endif //CONFIG_IEEE80211W\n\t\tmic_header1[2] = mpdu[0] & 0xcf;    /* Mute CF poll & CF ack bits */\n    \n    mic_header1[3] = mpdu[1] & 0xc7;    /* Mute retry, more data and pwr mgt bits */\n    mic_header1[4] = mpdu[4];       /* A1 */\n    mic_header1[5] = mpdu[5];\n    mic_header1[6] = mpdu[6];\n    mic_header1[7] = mpdu[7];\n    mic_header1[8] = mpdu[8];\n    mic_header1[9] = mpdu[9];\n    mic_header1[10] = mpdu[10];     /* A2 */\n    mic_header1[11] = mpdu[11];\n    mic_header1[12] = mpdu[12];\n    mic_header1[13] = mpdu[13];\n    mic_header1[14] = mpdu[14];\n    mic_header1[15] = mpdu[15];\n_func_exit_;\t\n}\n\n\n/************************************************/\n/* construct_mic_header2()                      */\n/* Builds the last MIC header block from        */\n/* header fields.                               */\n/************************************************/\nstatic void construct_mic_header2(\n                u8 *mic_header2,\n                u8 *mpdu,\n                sint a4_exists,\n                sint qc_exists\n                )\n{\n    sint i;\n_func_enter_;\t\n    for (i = 0; i<16; i++) mic_header2[i]=0x00;\n\n    mic_header2[0] = mpdu[16];    /* A3 */\n    mic_header2[1] = mpdu[17];\n    mic_header2[2] = mpdu[18];\n    mic_header2[3] = mpdu[19];\n    mic_header2[4] = mpdu[20];\n    mic_header2[5] = mpdu[21];\n\n    //mic_header2[6] = mpdu[22] & 0xf0;   /* SC */\n    mic_header2[6] = 0x00;\n    mic_header2[7] = 0x00; /* mpdu[23]; */\n\n\n    if (!qc_exists && a4_exists)\n    {\n        for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i];   /* A4 */\n\n    }\n\n    if (qc_exists && !a4_exists)\n    {\n        mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */\n        mic_header2[9] = mpdu[25] & 0x00;\n    }\n\n    if (qc_exists && a4_exists)\n    {\n        for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i];   /* A4 */\n\n        mic_header2[14] = mpdu[30] & 0x0f;\n        mic_header2[15] = mpdu[31] & 0x00;\n    }\n\n_func_exit_;\t\n}\n\n\n/************************************************/\n/* construct_mic_header2()                      */\n/* Builds the last MIC header block from        */\n/* header fields.                               */\n/* Baron think the function is construct CCM    */\n/* nonce                                        */\n/************************************************/\nstatic void construct_ctr_preload(\n                        u8 *ctr_preload,\n                        sint a4_exists,\n                        sint qc_exists,\n                        u8 *mpdu,\n                        u8 *pn_vector,\n                        sint c,\n                        uint frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                        )\n{\n    sint i = 0;\n_func_enter_;\t\t\n    for (i=0; i<16; i++) ctr_preload[i] = 0x00;\n    i = 0;\n\t\n    ctr_preload[0] = 0x01;                                  /* flag */\n    if (qc_exists && a4_exists) \n\t\tctr_preload[1] = mpdu[30] & 0x0f;   /* QoC_Control */\n    if (qc_exists && !a4_exists) \n\t\tctr_preload[1] = mpdu[24] & 0x0f;\n#ifdef CONFIG_IEEE80211W\n\t//802.11w management frame should set management bit(4)\n\tif(frtype == WIFI_MGT_TYPE)\n\t\tctr_preload[1] |= BIT(4);\n#endif //CONFIG_IEEE80211W\n    for (i = 2; i < 8; i++)\n        ctr_preload[i] = mpdu[i + 8];                       /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */\n    #ifdef CONSISTENT_PN_ORDER\n      for (i = 8; i < 14; i++)\n            ctr_preload[i] =    pn_vector[i - 8];           /* ctr_preload[8:13] = PN[0:5] */\n    #else\n      for (i = 8; i < 14; i++)\n            ctr_preload[i] =    pn_vector[13 - i];          /* ctr_preload[8:13] = PN[5:0] */\n    #endif\n    ctr_preload[14] =  (unsigned char) (c / 256); /* Ctr */\n    ctr_preload[15] =  (unsigned char) (c % 256);\n_func_exit_;\t\t\n}\n\n\n/************************************/\n/* bitwise_xor()                    */\n/* A 128 bit, bitwise exclusive or  */\n/************************************/\nstatic void bitwise_xor(u8 *ina, u8 *inb, u8 *out)\n{\n    sint i;\n_func_enter_;\t\t\n    for (i=0; i<16; i++)\n    {\n        out[i] = ina[i] ^ inb[i];\n    }\n_func_exit_;\t\t\n}\n\n\nstatic sint aes_cipher(u8 *key, uint\thdrlen,\n\t\t\tu8 *pframe, uint plen)\n{\n//\t/*static*/ unsigned char\tmessage[MAX_MSG_SIZE];\n\tuint\tqc_exists, a4_exists, i, j, payload_remainder,\n\t\tnum_blocks, payload_index;\n\n\tu8 pn_vector[6];\n\tu8 mic_iv[16];\n\tu8 mic_header1[16];\n\tu8 mic_header2[16];\n\tu8 ctr_preload[16];\n\n\t/* Intermediate Buffers */\n\tu8 chain_buffer[16];\n\tu8 aes_out[16];\n\tu8 padded_buffer[16];\n\tu8 mic[8];\n//\tuint\toffset = 0;\n\tuint\tfrtype  = GetFrameType(pframe);\n\tuint\tfrsubtype  = GetFrameSubType(pframe);\n\t\n_func_enter_;\t\t\n\tfrsubtype=frsubtype>>4;\n\n\n\t_rtw_memset((void *)mic_iv, 0, 16);\n\t_rtw_memset((void *)mic_header1, 0, 16);\n\t_rtw_memset((void *)mic_header2, 0, 16);\n\t_rtw_memset((void *)ctr_preload, 0, 16);\n\t_rtw_memset((void *)chain_buffer, 0, 16);\n\t_rtw_memset((void *)aes_out, 0, 16);\n\t_rtw_memset((void *)padded_buffer, 0, 16);\n\n\tif ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen ==  WLAN_HDR_A3_QOS_LEN))\n\t\ta4_exists = 0;\n\telse\n\t\ta4_exists = 1;\n\n\tif (\n\t\t((frtype|frsubtype) == WIFI_DATA_CFACK) ||\n\t\t((frtype|frsubtype) == WIFI_DATA_CFPOLL)||\n\t\t((frtype|frsubtype) == WIFI_DATA_CFACKPOLL))\n\t\t{\n\t\t\tqc_exists = 1;\n\t\t\t\t\tif(hdrlen !=  WLAN_HDR_A3_QOS_LEN){\n\t\t\t\t \n\t\t\t\t\thdrlen += 2;\n\t\t\t}\n\t\t}\n\t// add for CONFIG_IEEE80211W, none 11w also can use\n\telse if ((frtype == WIFI_DATA) &&\n\t\t((frsubtype == 0x08) ||\n\t\t(frsubtype == 0x09)||\n\t\t(frsubtype == 0x0a)||\n\t\t(frsubtype == 0x0b)))\n\t\t{\n\t\t\tif(hdrlen !=  WLAN_HDR_A3_QOS_LEN){\n\t\t\t\t \n\t\t\t\t\thdrlen += 2;\n\t\t\t}\n\t\t\tqc_exists = 1;\n\t\t}\n\telse\n\t\tqc_exists = 0;\n\n\tpn_vector[0]=pframe[hdrlen];\n\tpn_vector[1]=pframe[hdrlen+1];\n\tpn_vector[2]=pframe[hdrlen+4];\n\tpn_vector[3]=pframe[hdrlen+5];\n\tpn_vector[4]=pframe[hdrlen+6];\n\tpn_vector[5]=pframe[hdrlen+7];\n\t\n\tconstruct_mic_iv(\n                        mic_iv,\n                        qc_exists,\n                        a4_exists,\n                        pframe,\t //message,\n                        plen,\n                        pn_vector,\n                        frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                        );\n\n    construct_mic_header1(\n                            mic_header1,\n                            hdrlen,\n                            pframe,\t//message\n                            frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                            );\n    construct_mic_header2(\n                            mic_header2,\n                            pframe,\t//message,\n                            a4_exists,\n                            qc_exists\n                            );\n\n\n\tpayload_remainder = plen % 16;\n    num_blocks = plen / 16;\n\n    /* Find start of payload */\n    payload_index = (hdrlen + 8);\n\n    /* Calculate MIC */\n    aes128k128d(key, mic_iv, aes_out);\n    bitwise_xor(aes_out, mic_header1, chain_buffer);\n    aes128k128d(key, chain_buffer, aes_out);\n    bitwise_xor(aes_out, mic_header2, chain_buffer);\n    aes128k128d(key, chain_buffer, aes_out);\n\n\tfor (i = 0; i < num_blocks; i++)\n    {\n        bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer);\n\n        payload_index += 16;\n        aes128k128d(key, chain_buffer, aes_out);\n    }\n\n    /* Add on the final payload block if it needs padding */\n    if (payload_remainder > 0)\n    {\n        for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n        for (j = 0; j < payload_remainder; j++)\n        {\n            padded_buffer[j] = pframe[payload_index++];//padded_buffer[j] = message[payload_index++];\n        }\n        bitwise_xor(aes_out, padded_buffer, chain_buffer);\n        aes128k128d(key, chain_buffer, aes_out);\n\n    }\n\n    for (j = 0 ; j < 8; j++) mic[j] = aes_out[j];\n\n    /* Insert MIC into payload */\n    for (j = 0; j < 8; j++)\n    \tpframe[payload_index+j] = mic[j];\t//message[payload_index+j] = mic[j];\n\n    payload_index = hdrlen + 8;\n    for (i=0; i< num_blocks; i++)\n    {\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                pframe,\t//message,\n                                pn_vector,\n                                i+1,\n                                frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);//bitwise_xor(aes_out, &message[payload_index], chain_buffer);\n        for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j];\n    }\n\n    if (payload_remainder > 0)          /* If there is a short final block, then pad it,*/\n    {                                   /* encrypt it and copy the unpadded part back   */\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                pframe,\t//message,\n                                pn_vector,\n                                num_blocks+1,\n                                frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n\n        for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n        for (j = 0; j < payload_remainder; j++)\n        {\n            padded_buffer[j] = pframe[payload_index+j];//padded_buffer[j] = message[payload_index+j];\n        }\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, padded_buffer, chain_buffer);\n        for (j=0; j<payload_remainder;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j];\n    }\n\n    /* Encrypt the MIC */\n    construct_ctr_preload(\n                        ctr_preload,\n                        a4_exists,\n                        qc_exists,\n                        pframe,\t//message,\n                        pn_vector,\n                        0,\n                        frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n\n    for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n    for (j = 0; j < 8; j++)\n    {\n        padded_buffer[j] = pframe[j+hdrlen+8+plen];//padded_buffer[j] = message[j+hdrlen+8+plen];\n    }\n\n    aes128k128d(key, ctr_preload, aes_out);\n    bitwise_xor(aes_out, padded_buffer, chain_buffer);\n    for (j=0; j<8;j++) pframe[payload_index++] = chain_buffer[j];//for (j=0; j<8;j++) message[payload_index++] = chain_buffer[j];\n_func_exit_;\t\t\n\treturn _SUCCESS;\n}\n\n\n\n\n\nu32\trtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe)\n{\t// exclude ICV\n\n\n\t/*static*/ \n//\tunsigned char\tmessage[MAX_MSG_SIZE];\n\n    \t/* Intermediate Buffers */\n\tsint \tcurfragnum,length;\n\tu32\tprwskeylen;\n\tu8\t*pframe,*prwskey;\t//, *payload,*iv\n\tu8   hw_hdr_offset = 0;\n\t//struct\tsta_info\t\t*stainfo=NULL;\n\tstruct\tpkt_attrib\t *pattrib = &((struct xmit_frame *)pxmitframe)->attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\tstruct\txmit_priv\t\t*pxmitpriv=&padapter->xmitpriv;\n\n//\tuint\toffset = 0;\n\tu32 res=_SUCCESS;\n_func_enter_;\t\t\n\n\tif(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)\n\t\treturn _FAIL;\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\thw_hdr_offset = TXDESC_SIZE +\n\t\t (((struct xmit_frame*)pxmitframe)->pkt_offset * PACKET_OFFSET_SZ);\n#else\n\t#ifdef CONFIG_TX_EARLY_MODE\n\thw_hdr_offset = TXDESC_OFFSET+EARLY_MODE_INFO_SIZE;\n\t#else\n\thw_hdr_offset = TXDESC_OFFSET;\n\t#endif\t\n#endif\n\n\tpframe = ((struct xmit_frame*)pxmitframe)->buf_addr + hw_hdr_offset;\n\n\t//4 start to encrypt each fragment\n\tif((pattrib->encrypt==_AES_)){\n/*\n\t\tif(pattrib->psta)\n\t\t{\n\t\t\tstainfo = pattrib->psta;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\t\tstainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );\n\t\t}\n*/\t\t\n\t\t//if (stainfo!=NULL)\n\t\t{\n/*\n\t\t\tif(!(stainfo->state &_FW_LINKED))\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, stainfo->state);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n*/\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_aes_encrypt: stainfo!=NULL!!!\\n\"));\n\n\t\t\tif(IS_MCAST(pattrib->ra))\n\t\t\t{\n\t\t\t\tprwskey=psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//prwskey=&stainfo->dot118021x_UncstKey.skey[0];\n\t\t\t\tprwskey=pattrib->dot118021x_UncstKey.skey;\n\t\t\t}\n\n#ifdef CONFIG_TDLS\n\t\t\t{\n\t\t\t\t/* Swencryption */\n\t\t\t\tstruct\tsta_info\t\t*ptdls_sta;\n\t\t\t\tptdls_sta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->dst[0] );\n\t\t\t\tif((ptdls_sta != NULL) && (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) )\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"[%s] for tdls link\\n\", __FUNCTION__);\n\t\t\t\t\tprwskey=&ptdls_sta->tpk.tk[0];\n\t\t\t\t}\n\t\t\t}\n#endif //CONFIG_TDLS\n\n\t\t\tprwskeylen=16;\n\t\n\t\t\tfor(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){\n\t\t\t\n\t\t\t\tif((curfragnum+1)==pattrib->nr_frags){\t//4 the last fragment\n\t\t\t\t\tlength=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len- pattrib->icv_len;\n\t\t\t\t\n\t\t\t\t\taes_cipher(prwskey,pattrib->hdrlen,pframe, length);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tlength=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-pattrib->icv_len ;\n\t\t\t\t\n\t\t\t\t\taes_cipher(prwskey,pattrib->hdrlen,pframe, length);\n\t\t\t\tpframe+=pxmitpriv->frag_len;\n\t\t\t\tpframe=(u8*)RND4((SIZE_PTR)(pframe));\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tAES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);\n\t\t}\n/*\n\t\telse{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_aes_encrypt: stainfo==NULL!!!\\n\"));\n\t\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\t\tres=_FAIL;\n\t\t}\n*/\n\t}\n\n\n\n_func_exit_;\n\t\treturn res;\n}\n\nstatic sint aes_decipher(u8 *key, uint\thdrlen,\n\t\t\tu8 *pframe, uint plen)\n{\n\tstatic u8\tmessage[MAX_MSG_SIZE];\n\tuint\tqc_exists, a4_exists, i, j, payload_remainder,\n\t\t\tnum_blocks, payload_index;\n\tsint res = _SUCCESS;\n\tu8 pn_vector[6];\n\tu8 mic_iv[16];\n\tu8 mic_header1[16];\n\tu8 mic_header2[16];\n\tu8 ctr_preload[16];\n\n    /* Intermediate Buffers */\n\tu8 chain_buffer[16];\n\tu8 aes_out[16];\n\tu8 padded_buffer[16];\n\tu8 mic[8];\n\n\n//\tuint\toffset = 0;\n\tuint\tfrtype  = GetFrameType(pframe);\n\tuint\tfrsubtype  = GetFrameSubType(pframe);\n_func_enter_;\t\t\t\n\tfrsubtype=frsubtype>>4;\n\n\n\t_rtw_memset((void *)mic_iv, 0, 16);\n\t_rtw_memset((void *)mic_header1, 0, 16);\n\t_rtw_memset((void *)mic_header2, 0, 16);\n\t_rtw_memset((void *)ctr_preload, 0, 16);\n\t_rtw_memset((void *)chain_buffer, 0, 16);\n\t_rtw_memset((void *)aes_out, 0, 16);\n\t_rtw_memset((void *)padded_buffer, 0, 16);\n\n\t//start to decrypt the payload\n\n\tnum_blocks = (plen-8) / 16; //(plen including LLC, payload_length and mic )\n\n\tpayload_remainder = (plen-8) % 16;\n\n\tpn_vector[0]  = pframe[hdrlen];\n\tpn_vector[1]  = pframe[hdrlen+1];\n\tpn_vector[2]  = pframe[hdrlen+4];\n\tpn_vector[3]  = pframe[hdrlen+5];\n\tpn_vector[4]  = pframe[hdrlen+6];\n\tpn_vector[5]  = pframe[hdrlen+7];\n\n\tif ((hdrlen == WLAN_HDR_A3_LEN )||(hdrlen ==  WLAN_HDR_A3_QOS_LEN))\n\t\ta4_exists = 0;\n\telse\n\t\ta4_exists = 1;\n\n\tif (\n\t\t((frtype|frsubtype) == WIFI_DATA_CFACK) ||\n\t\t((frtype|frsubtype) == WIFI_DATA_CFPOLL)||\n\t\t((frtype|frsubtype) == WIFI_DATA_CFACKPOLL))\n\t\t{\n\t\t\tqc_exists = 1;\n\t\t\t\t\tif(hdrlen !=  WLAN_HDR_A3_QOS_LEN){\n\t\t\t\t \n\t\t\t\t\thdrlen += 2;\n\t\t\t}\n\t\t}//only for data packet . add for CONFIG_IEEE80211W, none 11w also can use\n\telse if ((frtype == WIFI_DATA) &&\n\t\t((frsubtype == 0x08) ||\n\t\t(frsubtype == 0x09)||\n\t\t(frsubtype == 0x0a)||\n\t\t(frsubtype == 0x0b)))\n\t\t{\n\t\t\tif(hdrlen !=  WLAN_HDR_A3_QOS_LEN){\n\t\t\t\t \n\t\t\t\t\thdrlen += 2;\n\t\t\t}\n\t\t\tqc_exists = 1;\n\t\t}\n\telse\n\t\tqc_exists = 0;\n\n\n\t// now, decrypt pframe with hdrlen offset and plen long\n\n\tpayload_index = hdrlen + 8; // 8 is for extiv\n\t\n\tfor (i=0; i< num_blocks; i++)\n    {\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                pframe,\n                                pn_vector,\n                                i+1,\n                                frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                            );\n\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, &pframe[payload_index], chain_buffer);\n\n        for (j=0; j<16;j++) pframe[payload_index++] = chain_buffer[j];\n    }\n\n    if (payload_remainder > 0)          /* If there is a short final block, then pad it,*/\n    {                                   /* encrypt it and copy the unpadded part back   */\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                pframe,\n                                pn_vector,\n                                num_blocks+1,\n                                frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                            );\n\n        for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n        for (j = 0; j < payload_remainder; j++)\n        {\n            padded_buffer[j] = pframe[payload_index+j];\n        }\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, padded_buffer, chain_buffer);\n        for (j=0; j<payload_remainder;j++) pframe[payload_index++] = chain_buffer[j];\n    }\n\n\t//start to calculate the mic\t\n\tif((hdrlen +plen+8) <= MAX_MSG_SIZE)\n\t\t_rtw_memcpy((void *)message, pframe, (hdrlen +plen+8)); //8 is for ext iv len\n\n\n\tpn_vector[0]=pframe[hdrlen];\n\tpn_vector[1]=pframe[hdrlen+1];\n\tpn_vector[2]=pframe[hdrlen+4];\n\tpn_vector[3]=pframe[hdrlen+5];\n\tpn_vector[4]=pframe[hdrlen+6];\n\tpn_vector[5]=pframe[hdrlen+7];\n\n\n\t\n\tconstruct_mic_iv(\n                        mic_iv,\n                        qc_exists,\n                        a4_exists,\n                        message,\n                        plen-8,\n                        pn_vector,\n                        frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                        );\n\n    construct_mic_header1(\n                            mic_header1,\n                            hdrlen,\n                            message,\n                            frtype // add for CONFIG_IEEE80211W, none 11w also can use\n                            );\n    construct_mic_header2(\n                            mic_header2,\n                            message,\n                            a4_exists,\n                            qc_exists\n                            );\n\n\n\tpayload_remainder = (plen-8) % 16;\n    num_blocks = (plen-8) / 16;\n\n    /* Find start of payload */\n    payload_index = (hdrlen + 8);\n\n    /* Calculate MIC */\n    aes128k128d(key, mic_iv, aes_out);\n    bitwise_xor(aes_out, mic_header1, chain_buffer);\n    aes128k128d(key, chain_buffer, aes_out);\n    bitwise_xor(aes_out, mic_header2, chain_buffer);\n    aes128k128d(key, chain_buffer, aes_out);\n\n\tfor (i = 0; i < num_blocks; i++)\n    {\n        bitwise_xor(aes_out, &message[payload_index], chain_buffer);\n\n        payload_index += 16;\n        aes128k128d(key, chain_buffer, aes_out);\n    }\n\n    /* Add on the final payload block if it needs padding */\n    if (payload_remainder > 0)\n    {\n        for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n        for (j = 0; j < payload_remainder; j++)\n        {\n            padded_buffer[j] = message[payload_index++];\n        }\n        bitwise_xor(aes_out, padded_buffer, chain_buffer);\n        aes128k128d(key, chain_buffer, aes_out);\n\n    }\n\n    for (j = 0 ; j < 8; j++)\n\tmic[j] = aes_out[j];\n\n    /* Insert MIC into payload */\n    for (j = 0; j < 8; j++)\n\tmessage[payload_index+j] = mic[j];\n\n    payload_index = hdrlen + 8;\n    for (i=0; i< num_blocks; i++)\n    {\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                message,\n                                pn_vector,\n                                i+1,\n                                frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, &message[payload_index], chain_buffer);\n        for (j=0; j<16;j++) message[payload_index++] = chain_buffer[j];\n    }\n\n    if (payload_remainder > 0)          /* If there is a short final block, then pad it,*/\n    {                                   /* encrypt it and copy the unpadded part back   */\n        construct_ctr_preload(\n                                ctr_preload,\n                                a4_exists,\n                                qc_exists,\n                                message,\n                                pn_vector,\n                                num_blocks+1,\n                                frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n\n        for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n        for (j = 0; j < payload_remainder; j++)\n        {\n            padded_buffer[j] = message[payload_index+j];\n        }\n        aes128k128d(key, ctr_preload, aes_out);\n        bitwise_xor(aes_out, padded_buffer, chain_buffer);\n        for (j=0; j<payload_remainder;j++) message[payload_index++] = chain_buffer[j];\n    }\n\n    /* Encrypt the MIC */\n    construct_ctr_preload(\n                        ctr_preload,\n                        a4_exists,\n                        qc_exists,\n                        message,\n                        pn_vector,\n                        0,\n                        frtype); // add for CONFIG_IEEE80211W, none 11w also can use\n\n    for (j = 0; j < 16; j++) padded_buffer[j] = 0x00;\n    for (j = 0; j < 8; j++)\n    {\n        padded_buffer[j] = message[j+hdrlen+8+plen-8];\n    }\n\n    aes128k128d(key, ctr_preload, aes_out);\n    bitwise_xor(aes_out, padded_buffer, chain_buffer);\n    for (j=0; j<8;j++) message[payload_index++] = chain_buffer[j];\n\n\t//compare the mic\n\tfor(i=0;i<8;i++){\n\t\tif(pframe[hdrlen+8+plen-8+i] != message[hdrlen+8+plen-8+i])\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x) \\n\",\n\t\t\t\t\t\ti,pframe[hdrlen+8+plen-8+i],message[hdrlen+8+plen-8+i]));\n\t\t\tDBG_871X(\"aes_decipher:mic check error mic[%d]: pframe(%x) != message(%x) \\n\",\n\t\t\t\t\t\ti,pframe[hdrlen+8+plen-8+i],message[hdrlen+8+plen-8+i]);\n\t\t\tres = _FAIL;\n\t\t}\n\t}\n_func_exit_;\t\n\treturn res;\n}\n\nu32\trtw_aes_decrypt(_adapter *padapter, u8 *precvframe)\n{\t// exclude ICV\n\n\n\t/*static*/ \n//\tunsigned char\tmessage[MAX_MSG_SIZE];\n\n\n    \t/* Intermediate Buffers */\n\n\n\tsint \t\tlength;\n\tu32\tprwskeylen;\n\tu8\t*pframe,*prwskey;\t//, *payload,*iv\n\tstruct\tsta_info\t\t*stainfo;\n\tstruct\trx_pkt_attrib\t *prxattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n//\tstruct\trecv_priv\t\t*precvpriv=&padapter->recvpriv;\n\tu32\tres=_SUCCESS;\n_func_enter_;\t \n\tpframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\n\t//4 start to encrypt each fragment\n\tif((prxattrib->encrypt==_AES_)){\n\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv ,&prxattrib->ta[0] );\n\t\tif (stainfo!=NULL){\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_aes_decrypt: stainfo!=NULL!!!\\n\"));\n\n\t\t\tif(IS_MCAST(prxattrib->ra))\n\t\t\t{\n\t\t\t\tstatic u32 start = 0;\n\t\t\t\tstatic u32 no_gkey_bc_cnt = 0;\n\t\t\t\tstatic u32 no_gkey_mc_cnt = 0;\n\n\t\t\t\t//DBG_871X(\"rx bc/mc packets, to perform sw rtw_aes_decrypt\\n\");\n\t\t\t\t//prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;\n\t\t\t\tif(psecuritypriv->binstallGrpkey==_FALSE)\n\t\t\t\t{\n\t\t\t\t\tres=_FAIL;\n\n\t\t\t\t\tif (start == 0)\n\t\t\t\t\t\tstart = rtw_get_current_time();\n\n\t\t\t\t\tif (is_broadcast_mac_addr(prxattrib->ra))\n\t\t\t\t\t\tno_gkey_bc_cnt++;\n\t\t\t\t\telse\n\t\t\t\t\t\tno_gkey_mc_cnt++;\n\n\t\t\t\t\tif (rtw_get_passing_time_ms(start) > 1000) {\n\t\t\t\t\t\tif (no_gkey_bc_cnt || no_gkey_mc_cnt) {\n\t\t\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\\n\",\n\t\t\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstart = rtw_get_current_time();\n\t\t\t\t\t\tno_gkey_bc_cnt = 0;\n\t\t\t\t\t\tno_gkey_mc_cnt = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t\tif (no_gkey_bc_cnt || no_gkey_mc_cnt) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);\n\t\t\t\t}\n\t\t\t\tstart = 0;\n\t\t\t\tno_gkey_bc_cnt = 0;\n\t\t\t\tno_gkey_mc_cnt = 0;\n\n\t\t\t\tprwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;\n\t\t\t\tif(psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"not match packet_index=%d, install_index=%d \\n\"\n\t\t\t\t\t, prxattrib->key_index, psecuritypriv->dot118021XGrpKeyid);\n\t\t\t\t\tres=_FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprwskey=&stainfo->dot118021x_UncstKey.skey[0];\n\t\t\t}\n\t\t\t\n\t\t\tlength= ((union recv_frame *)precvframe)->u.hdr.len-prxattrib->hdrlen-prxattrib->iv_len;\n\t\t\t/*// add for CONFIG_IEEE80211W, debug\n\t\t\tif(0)\n\t\t\tprintk(\"@@@@@@@@@@@@@@@@@@ length=%d, prxattrib->hdrlen=%d, prxattrib->pkt_len=%d \\n\"\n\t\t\t, length, prxattrib->hdrlen, prxattrib->pkt_len);\n\t\t\tif(0)\n\t\t\t{\n\t\t\t\tint no;\n\t\t\t\t//test print PSK\n\t\t\t\tprintk(\"PSK key below:\\n\");\n\t\t\t\tfor(no=0;no<16;no++)\n\t\t\t\t\tprintk(\" %02x \", prwskey[no]);\n\t\t\t\tprintk(\"\\n\");\n\t\t\t}\n\t\t\tif(0)\n\t\t\t{\n\t\t\t\tint no;\n\t\t\t\t//test print PSK\n\t\t\t\tprintk(\"frame:\\n\");\n\t\t\t\tfor(no=0;no<prxattrib->pkt_len;no++)\n\t\t\t\t\tprintk(\" %02x \", pframe[no]);\n\t\t\t\tprintk(\"\\n\");\n\t\t\t}*/\n\n\t\t\tres= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);\n\n\t\t\tAES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);\n\t\t}\n\t\telse{\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"rtw_aes_decrypt: stainfo==NULL!!!\\n\"));\n\t\t\tres=_FAIL;\n\t\t}\n\t\t\t\t\t\t\n\t}\n_func_exit_;\t\nexit:\n\treturn res;\n}\n\n#ifdef CONFIG_IEEE80211W\nu32\trtw_BIP_verify(_adapter *padapter, u8 *precvframe)\n{\n\tstruct rx_pkt_attrib *pattrib = &((union recv_frame *)precvframe)->u.hdr.attrib;\n\tu8 *pframe;\n\tu8 *BIP_AAD, *p;\n\tu32\tres=_FAIL;\n\tuint len, ori_len;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tu8 mic[16];\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tori_len = pattrib->pkt_len-WLAN_HDR_A3_LEN+BIP_AAD_SIZE;\n\tBIP_AAD = rtw_zmalloc(ori_len);\n\t\n\tif(BIP_AAD == NULL)\n\t{\n\t\tDBG_871X(\"BIP AAD allocate fail\\n\");\n\t\treturn _FAIL;\n\t}\n\t//PKT start\n\tpframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\n\t//mapping to wlan header\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\t//save the frame body + MME\n\t_rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, pframe+WLAN_HDR_A3_LEN, pattrib->pkt_len-WLAN_HDR_A3_LEN);\n\t//find MME IE pointer\n\tp = rtw_get_ie(BIP_AAD+BIP_AAD_SIZE, _MME_IE_, &len, pattrib->pkt_len-WLAN_HDR_A3_LEN);\n\t//Baron\n\tif(p)\n\t{\n\t\tu16 keyid=0;\n\t\tu64 temp_ipn=0;\n\t\t//save packet number\n\t\t_rtw_memcpy(&temp_ipn, p+4, 6);\n\t\ttemp_ipn = le64_to_cpu(temp_ipn);\n\t\t//BIP packet number should bigger than previous BIP packet\n\t\tif (temp_ipn < pmlmeext->mgnt_80211w_IPN_rx) {\n\t\t\tDBG_871X(\"replay BIP packet\\n\");\n\t\t\tgoto BIP_exit;\n\t\t}\n\t\t//copy key index\n\t\t_rtw_memcpy(&keyid, p+2, 2);\n\t\tkeyid = le16_to_cpu(keyid);\n\t\tif(keyid != padapter->securitypriv.dot11wBIPKeyid)\n\t\t{\n\t\t\tDBG_871X(\"BIP key index error!\\n\");\n\t\t\tgoto BIP_exit;\n\t\t}\n\t\t//clear the MIC field of MME to zero\n\t\t_rtw_memset(p+2+len-8, 0, 8);\n\t\t\n\t\t//conscruct AAD, copy frame control field\n\t\t_rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);\n\t\tClearRetry(BIP_AAD);\n\t\tClearPwrMgt(BIP_AAD);\n\t\tClearMData(BIP_AAD);\n\t\t//conscruct AAD, copy address 1 to address 3\n\t\t_rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);\n\t\t\n\t\tif(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey\n\t\t\t, BIP_AAD, ori_len, mic))\n\t\t\tgoto BIP_exit;\n\t\t\n\t\t/*//management packet content\n\t\t{\n\t\t\tint pp;\n\t\t\tDBG_871X(\"pkt: \");\n\t\t\tfor(pp=0;pp< pattrib->pkt_len; pp++)\n\t\t\t\tprintk(\" %02x \", pframe[pp]);\n\t\t\tDBG_871X(\"\\n\");\n\t\t\t//BIP AAD + management frame body + MME(MIC is zero)\n\t\t\tDBG_871X(\"AAD+PKT: \");\n\t\t\tfor(pp=0;pp< ori_len; pp++)\n\t\t\t\tDBG_871X(\" %02x \", BIP_AAD[pp]);\n\t\t\tDBG_871X(\"\\n\");\n\t\t\t//show the MIC result\n\t\t\tDBG_871X(\"mic: \");\n\t\t\tfor(pp=0;pp<16; pp++)\n\t\t\t\tDBG_871X(\" %02x \", mic[pp]);\n\t\t\tDBG_871X(\"\\n\");\n\t\t}\n\t\t*/\n\t\t//MIC field should be last 8 bytes of packet (packet without FCS)\n\t\tif(_rtw_memcmp(mic, pframe+pattrib->pkt_len-8, 8))\n\t\t{\n\t\t\tpmlmeext->mgnt_80211w_IPN_rx = temp_ipn;\n\t\t\tres=_SUCCESS;\n\t\t}\n\t\telse\n\t\t\tDBG_871X(\"BIP MIC error!\\n\");\n\t\t\n\t}\n\telse\n\t\tres = RTW_RX_HANDLED;\nBIP_exit:\n\n\trtw_mfree(BIP_AAD, ori_len);\n\treturn res;\n}\n#endif //CONFIG_IEEE80211W\n\n#ifndef PLATFORM_FREEBSD\n/* compress 512-bits */\nstatic int sha256_compress(struct sha256_state *md, unsigned char *buf)\n{\n\tu32 S[8], W[64], t0, t1;\n\tu32 t;\n\tint i;\n\n\t/* copy state into S */\n\tfor (i = 0; i < 8; i++) {\n\t\tS[i] = md->state[i];\n\t}\n\n\t/* copy the state into 512-bits into W[0..15] */\n\tfor (i = 0; i < 16; i++)\n\t\tW[i] = WPA_GET_BE32(buf + (4 * i));\n\n\t/* fill W[16..63] */\n\tfor (i = 16; i < 64; i++) {\n\t\tW[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) +\n\t\t\tW[i - 16];\n\t}        \n\n\t/* Compress */\n#define RND(a,b,c,d,e,f,g,h,i)                          \\\n\tt0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i];\t\\\n\tt1 = Sigma0(a) + Maj(a, b, c);\t\t\t\\\n\td += t0;\t\t\t\t\t\\\n\th  = t0 + t1;\n\n\tfor (i = 0; i < 64; ++i) {\n\t\tRND(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i);\n\t\tt = S[7]; S[7] = S[6]; S[6] = S[5]; S[5] = S[4]; \n\t\tS[4] = S[3]; S[3] = S[2]; S[2] = S[1]; S[1] = S[0]; S[0] = t;\n\t}\n\n\t/* feedback */\n\tfor (i = 0; i < 8; i++) {\n\t\tmd->state[i] = md->state[i] + S[i];\n\t}\n\treturn 0;\n}\n\n/* Initialize the hash state */\nstatic void sha256_init(struct sha256_state *md)\n{\n\tmd->curlen = 0;\n\tmd->length = 0;\n\tmd->state[0] = 0x6A09E667UL;\n\tmd->state[1] = 0xBB67AE85UL;\n\tmd->state[2] = 0x3C6EF372UL;\n\tmd->state[3] = 0xA54FF53AUL;\n\tmd->state[4] = 0x510E527FUL;\n\tmd->state[5] = 0x9B05688CUL;\n\tmd->state[6] = 0x1F83D9ABUL;\n\tmd->state[7] = 0x5BE0CD19UL;\n}\n\n/**\n   Process a block of memory though the hash\n   @param md     The hash state\n   @param in     The data to hash\n   @param inlen  The length of the data (octets)\n   @return CRYPT_OK if successful\n*/\nstatic int sha256_process(struct sha256_state *md, unsigned char *in,\n\t\t\t  unsigned long inlen)\n{\n\tunsigned long n;\n#define block_size 64\n\n\tif (md->curlen > sizeof(md->buf))\n\t\treturn -1;\n\n\twhile (inlen > 0) {\n\t\tif (md->curlen == 0 && inlen >= block_size) {\n\t\t\tif (sha256_compress(md, (unsigned char *) in) < 0)\n\t\t\t\treturn -1;\n\t\t\tmd->length += block_size * 8;\n\t\t\tin += block_size;\n\t\t\tinlen -= block_size;\n\t\t} else {\n\t\t\tn = MIN(inlen, (block_size - md->curlen));\n\t\t\t_rtw_memcpy(md->buf + md->curlen, in, n);\n\t\t\tmd->curlen += n;\n\t\t\tin += n;\n\t\t\tinlen -= n;\n\t\t\tif (md->curlen == block_size) {\n\t\t\t\tif (sha256_compress(md, md->buf) < 0)\n\t\t\t\t\treturn -1;\n\t\t\t\tmd->length += 8 * block_size;\n\t\t\t\tmd->curlen = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n\n/**\n   Terminate the hash to get the digest\n   @param md  The hash state\n   @param out [out] The destination of the hash (32 bytes)\n   @return CRYPT_OK if successful\n*/\nstatic int sha256_done(struct sha256_state *md, unsigned char *out)\n{\n\tint i;\n\n\tif (md->curlen >= sizeof(md->buf))\n\t\treturn -1;\n\n\t/* increase the length of the message */\n\tmd->length += md->curlen * 8;\n\n\t/* append the '1' bit */\n\tmd->buf[md->curlen++] = (unsigned char) 0x80;\n\n\t/* if the length is currently above 56 bytes we append zeros\n\t * then compress.  Then we can fall back to padding zeros and length\n\t * encoding like normal.\n\t */\n\tif (md->curlen > 56) {\n\t\twhile (md->curlen < 64) {\n\t\t\tmd->buf[md->curlen++] = (unsigned char) 0;\n\t\t}\n\t\tsha256_compress(md, md->buf);\n\t\tmd->curlen = 0;\n\t}\n\n\t/* pad upto 56 bytes of zeroes */\n\twhile (md->curlen < 56) {\n\t\tmd->buf[md->curlen++] = (unsigned char) 0;\n\t}\n\n\t/* store length */\n\tWPA_PUT_BE64(md->buf + 56, md->length);\n\tsha256_compress(md, md->buf);\n\n\t/* copy output */\n\tfor (i = 0; i < 8; i++)\n\t\tWPA_PUT_BE32(out + (4 * i), md->state[i]);\n\n\treturn 0;\n}\n\n/**\n * sha256_vector - SHA256 hash for data vector\n * @num_elem: Number of elements in the data vector\n * @addr: Pointers to the data areas\n * @len: Lengths of the data blocks\n * @mac: Buffer for the hash\n * Returns: 0 on success, -1 of failure\n */\nstatic int sha256_vector(size_t num_elem, u8 *addr[], size_t *len,\n\t\t  u8 *mac)\n{\n\tstruct sha256_state ctx;\n\tsize_t i;\n\n\tsha256_init(&ctx);\n\tfor (i = 0; i < num_elem; i++)\n\t\tif (sha256_process(&ctx, addr[i], len[i]))\n\t\t\treturn -1;\n\tif (sha256_done(&ctx, mac))\n\t\treturn -1;\n\treturn 0;\n}\n\nstatic u8 os_strlen(const char *s)\n{\n\tconst char *p = s;\n\twhile (*p)\n\t\tp++;\n\treturn p - s;\n}\n\nstatic int os_memcmp(void *s1, void *s2, u8 n)\n{\n\tunsigned char *p1 = s1, *p2 = s2;\n\n\tif (n == 0)\n\t\treturn 0;\n\n\twhile (*p1 == *p2) {\n\t\tp1++;\n\t\tp2++;\n\t\tn--;\n\t\tif (n == 0)\n\t\t\treturn 0;\n\t}\n\n\treturn *p1 - *p2;\n}\n\n/**\n * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104)\n * @key: Key for HMAC operations\n * @key_len: Length of the key in bytes\n * @num_elem: Number of elements in the data vector\n * @addr: Pointers to the data areas\n * @len: Lengths of the data blocks\n * @mac: Buffer for the hash (32 bytes)\n */\nstatic void hmac_sha256_vector(u8 *key, size_t key_len, size_t num_elem,\n\t\t\tu8 *addr[], size_t *len, u8 *mac)\n{\n\tunsigned char k_pad[64]; /* padding - key XORd with ipad/opad */\n\tunsigned char tk[32];\n\tu8 *_addr[6];\n\tsize_t _len[6], i;\n\n\tif (num_elem > 5) {\n\t\t/*\n\t\t * Fixed limit on the number of fragments to avoid having to\n\t\t * allocate memory (which could fail).\n\t\t */\n\t\treturn;\n\t}\n\n        /* if key is longer than 64 bytes reset it to key = SHA256(key) */\n        if (key_len > 64) {\n\t\tsha256_vector(1, &key, &key_len, tk);\n\t\tkey = tk;\n\t\tkey_len = 32;\n        }\n\n\t/* the HMAC_SHA256 transform looks like:\n\t *\n\t * SHA256(K XOR opad, SHA256(K XOR ipad, text))\n\t *\n\t * where K is an n byte key\n\t * ipad is the byte 0x36 repeated 64 times\n\t * opad is the byte 0x5c repeated 64 times\n\t * and text is the data being protected */\n\n\t/* start out by storing key in ipad */\n\t_rtw_memset(k_pad, 0, sizeof(k_pad));\n\t_rtw_memcpy(k_pad, key, key_len);\n\t/* XOR key with ipad values */\n\tfor (i = 0; i < 64; i++)\n\t\tk_pad[i] ^= 0x36;\n\n\t/* perform inner SHA256 */\n\t_addr[0] = k_pad;\n\t_len[0] = 64;\n\tfor (i = 0; i < num_elem; i++) {\n\t\t_addr[i + 1] = addr[i];\n\t\t_len[i + 1] = len[i];\n\t}\n\tsha256_vector(1 + num_elem, _addr, _len, mac);\n\n\t_rtw_memset(k_pad, 0, sizeof(k_pad));\n\t_rtw_memcpy(k_pad, key, key_len);\n\t/* XOR key with opad values */\n\tfor (i = 0; i < 64; i++)\n\t\tk_pad[i] ^= 0x5c;\n\n\t/* perform outer SHA256 */\n\t_addr[0] = k_pad;\n\t_len[0] = 64;\n\t_addr[1] = mac;\n\t_len[1] = 32;\n\tsha256_vector(2, _addr, _len, mac);\n}\n#endif //PLATFORM_FREEBSD\n/**\n * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5.1.5.2)\n * @key: Key for PRF\n * @key_len: Length of the key in bytes\n * @label: A unique label for each purpose of the PRF\n * @data: Extra data to bind into the key\n * @data_len: Length of the data\n * @buf: Buffer for the generated pseudo-random key\n * @buf_len: Number of bytes of key to generate\n *\n * This function is used to derive new, cryptographically separate keys from a\n * given key.\n */\n#ifndef PLATFORM_FREEBSD //Baron\nstatic void sha256_prf(u8 *key, size_t key_len, char *label,\n\t\tu8 *data, size_t data_len, u8 *buf, size_t buf_len)\n{\n\tu16 counter = 1;\n\tsize_t pos, plen;\n\tu8 hash[SHA256_MAC_LEN];\n\tu8 *addr[4];\n\tsize_t len[4];\n\tu8 counter_le[2], length_le[2];\n\n\taddr[0] = counter_le;\n\tlen[0] = 2;\n\taddr[1] = (u8 *) label;\n\tlen[1] = os_strlen(label);\n\taddr[2] = data;\n\tlen[2] = data_len;\n\taddr[3] = length_le;\n\tlen[3] = sizeof(length_le);\n\n\tWPA_PUT_LE16(length_le, buf_len * 8);\n\tpos = 0;\n\twhile (pos < buf_len) {\n\t\tplen = buf_len - pos;\n\t\tWPA_PUT_LE16(counter_le, counter);\n\t\tif (plen >= SHA256_MAC_LEN) {\n\t\t\thmac_sha256_vector(key, key_len, 4, addr, len,\n\t\t\t\t\t   &buf[pos]);\n\t\t\tpos += SHA256_MAC_LEN;\n\t\t} else {\n\t\t\thmac_sha256_vector(key, key_len, 4, addr, len, hash);\n\t\t\t_rtw_memcpy(&buf[pos], hash, plen);\n\t\t\tbreak;\n\t\t}\n\t\tcounter++;\n\t}\n}\n#endif //PLATFORM_FREEBSD Baron\n\n/* AES tables*/\nconst u32 Te0[256] = {\n    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,\n    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,\n    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,\n    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,\n    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,\n    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,\n    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,\n    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,\n    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,\n    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,\n    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,\n    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,\n    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,\n    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,\n    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,\n    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,\n    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,\n    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,\n    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,\n    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,\n    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,\n    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,\n    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,\n    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,\n    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,\n    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,\n    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,\n    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,\n    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,\n    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,\n    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,\n    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,\n    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,\n    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,\n    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,\n    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,\n    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,\n    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,\n    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,\n    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,\n    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,\n    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,\n    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,\n    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,\n    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,\n    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,\n    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,\n    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,\n    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,\n    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,\n    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,\n    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,\n    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,\n    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,\n    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,\n    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,\n    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,\n    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,\n    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,\n    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,\n    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,\n    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,\n    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,\n    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,\n};\nconst u32 Td0[256] = {\n    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,\n    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,\n    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,\n    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,\n    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,\n    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,\n    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,\n    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,\n    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,\n    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,\n    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,\n    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,\n    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,\n    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,\n    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,\n    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,\n    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,\n    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,\n    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,\n    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,\n    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,\n    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,\n    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,\n    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,\n    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,\n    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,\n    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,\n    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,\n    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,\n    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,\n    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,\n    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,\n    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,\n    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,\n    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,\n    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,\n    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,\n    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,\n    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,\n    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,\n    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,\n    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,\n    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,\n    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,\n    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,\n    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,\n    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,\n    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,\n    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,\n    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,\n    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,\n    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,\n    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,\n    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,\n    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,\n    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,\n    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,\n    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,\n    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,\n    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,\n    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,\n    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,\n    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,\n    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,\n};\nconst u8 Td4s[256] = {\n    0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,\n    0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,\n    0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,\n    0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,\n    0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,\n    0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,\n    0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,\n    0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,\n    0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,\n    0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,\n    0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,\n    0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,\n    0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,\n    0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,\n    0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,\n    0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,\n    0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,\n    0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,\n    0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,\n    0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,\n    0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,\n    0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,\n    0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,\n    0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,\n    0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,\n    0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,\n    0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,\n    0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,\n    0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,\n    0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,\n    0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,\n    0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,\n};\nconst u8 rcons[] = {\n\t0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36\n\t/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */\n};\n\n/**\n * Expand the cipher key into the encryption key schedule.\n *\n * @return\tthe number of rounds for the given cipher key size.\n */\n#ifndef PLATFORM_FREEBSD //Baron\nstatic void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[])\n{\n\tint i;\n\tu32 temp;\n\n\trk[0] = GETU32(cipherKey     );\n\trk[1] = GETU32(cipherKey +  4);\n\trk[2] = GETU32(cipherKey +  8);\n\trk[3] = GETU32(cipherKey + 12);\n\tfor (i = 0; i < 10; i++) {\n\t\ttemp  = rk[3];\n\t\trk[4] = rk[0] ^\n\t\t\tTE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^\n\t\t\tRCON(i);\n\t\trk[5] = rk[1] ^ rk[4];\n\t\trk[6] = rk[2] ^ rk[5];\n\t\trk[7] = rk[3] ^ rk[6];\n\t\trk += 4;\n\t}\n}\n\nstatic void rijndaelEncrypt(u32 rk[/*44*/], u8 pt[16], u8 ct[16])\n{\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n\tint Nr = 10;\n#ifndef FULL_UNROLL\n\tint r;\n#endif /* ?FULL_UNROLL */\n\n\t/*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n\ts0 = GETU32(pt     ) ^ rk[0];\n\ts1 = GETU32(pt +  4) ^ rk[1];\n\ts2 = GETU32(pt +  8) ^ rk[2];\n\ts3 = GETU32(pt + 12) ^ rk[3];\n\n#define ROUND(i,d,s) \\\nd##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \\\nd##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \\\nd##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \\\nd##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]\n\n#ifdef FULL_UNROLL\n\n\tROUND(1,t,s);\n\tROUND(2,s,t);\n\tROUND(3,t,s);\n\tROUND(4,s,t);\n\tROUND(5,t,s);\n\tROUND(6,s,t);\n\tROUND(7,t,s);\n\tROUND(8,s,t);\n\tROUND(9,t,s);\n\n\trk += Nr << 2;\n\n#else  /* !FULL_UNROLL */\n\n\t/* Nr - 1 full rounds: */\n\tr = Nr >> 1;\n\tfor (;;) {\n\t\tROUND(1,t,s);\n\t\trk += 8;\n\t\tif (--r == 0)\n\t\t\tbreak;\n\t\tROUND(0,s,t);\n\t}\n\n#endif /* ?FULL_UNROLL */\n\n#undef ROUND\n\n\t/*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n\ts0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];\n\tPUTU32(ct     , s0);\n\ts1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];\n\tPUTU32(ct +  4, s1);\n\ts2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];\n\tPUTU32(ct +  8, s2);\n\ts3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];\n\tPUTU32(ct + 12, s3);\n}\n\nstatic void * aes_encrypt_init(u8 *key, size_t len)\n{\n\tu32 *rk;\n\tif (len != 16)\n\t\treturn NULL;\n\trk = (u32*)rtw_malloc(AES_PRIV_SIZE);\n\tif (rk == NULL)\n\t\treturn NULL;\n\trijndaelKeySetupEnc(rk, key);\n\treturn rk;\n}\n\nstatic void aes_128_encrypt(void *ctx, u8 *plain, u8 *crypt)\n{\n\trijndaelEncrypt(ctx, plain, crypt);\n}\n\n\nstatic void gf_mulx(u8 *pad)\n{\n\tint i, carry;\n\n\tcarry = pad[0] & 0x80;\n\tfor (i = 0; i < AES_BLOCK_SIZE - 1; i++)\n\t\tpad[i] = (pad[i] << 1) | (pad[i + 1] >> 7);\n\tpad[AES_BLOCK_SIZE - 1] <<= 1;\n\tif (carry)\n\t\tpad[AES_BLOCK_SIZE - 1] ^= 0x87;\n}\n\nstatic void aes_encrypt_deinit(void *ctx)\n{\n\t_rtw_memset(ctx, 0, AES_PRIV_SIZE);\n\trtw_mfree(ctx, AES_PRIV_SIZE);\n}\n\n\n/**\n * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128\n * @key: 128-bit key for the hash operation\n * @num_elem: Number of elements in the data vector\n * @addr: Pointers to the data areas\n * @len: Lengths of the data blocks\n * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)\n * Returns: 0 on success, -1 on failure\n *\n * This is a mode for using block cipher (AES in this case) for authentication.\n * OMAC1 was standardized with the name CMAC by NIST in a Special Publication\n * (SP) 800-38B.\n */\nstatic int omac1_aes_128_vector(u8 *key, size_t num_elem,\n\t\t\t\t\t\t\t u8 *addr[], size_t *len, u8 *mac)\n{\n\tvoid *ctx;\n\tu8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];\n\tu8 *pos, *end;\n\tsize_t i, e, left, total_len;\n\n\tctx = aes_encrypt_init(key, 16);\n\tif (ctx == NULL)\n\t\treturn -1;\n\t_rtw_memset(cbc, 0, AES_BLOCK_SIZE);\n\n\ttotal_len = 0;\n\tfor (e = 0; e < num_elem; e++)\n\t\ttotal_len += len[e];\n\tleft = total_len;\n\n\te = 0;\n\tpos = addr[0];\n\tend = pos + len[0];\n\n\twhile (left >= AES_BLOCK_SIZE) {\n\t\tfor (i = 0; i < AES_BLOCK_SIZE; i++) {\n\t\t\tcbc[i] ^= *pos++;\n\t\t\tif (pos >= end) {\n\t\t\t\te++;\n\t\t\t\tpos = addr[e];\n\t\t\t\tend = pos + len[e];\n\t\t\t}\n\t\t}\n\t\tif (left > AES_BLOCK_SIZE)\n\t\t\taes_128_encrypt(ctx, cbc, cbc);\n\t\tleft -= AES_BLOCK_SIZE;\n\t}\n\n\t_rtw_memset(pad, 0, AES_BLOCK_SIZE);\n\taes_128_encrypt(ctx, pad, pad);\n\tgf_mulx(pad);\n\n\tif (left || total_len == 0) {\n\t\tfor (i = 0; i < left; i++) {\n\t\t\tcbc[i] ^= *pos++;\n\t\t\tif (pos >= end) {\n\t\t\t\te++;\n\t\t\t\tpos = addr[e];\n\t\t\t\tend = pos + len[e];\n\t\t\t}\n\t\t}\n\t\tcbc[left] ^= 0x80;\n\t\tgf_mulx(pad);\n\t}\n\n\tfor (i = 0; i < AES_BLOCK_SIZE; i++)\n\t\tpad[i] ^= cbc[i];\n\taes_128_encrypt(ctx, pad, mac);\n\taes_encrypt_deinit(ctx);\n\treturn 0;\n}\n\n\n/**\n * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC)\n * @key: 128-bit key for the hash operation\n * @data: Data buffer for which a MAC is determined\n * @data_len: Length of data buffer in bytes\n * @mac: Buffer for MAC (128 bits, i.e., 16 bytes)\n * Returns: 0 on success, -1 on failure\n *\n * This is a mode for using block cipher (AES in this case) for authentication.\n * OMAC1 was standardized with the name CMAC by NIST in a Special Publication\n * (SP) 800-38B.\n */ //modify for CONFIG_IEEE80211W\nint omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac)\n{\n\treturn omac1_aes_128_vector(key, 1, &data, &data_len, mac);\n}\n#endif //PLATFORM_FREEBSD Baron\n\n#ifdef CONFIG_TDLS\nvoid wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta)\n{\n\tstruct sta_info *psta = (struct sta_info *)sta;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tu8 *SNonce = psta->SNonce;\n\tu8 *ANonce = psta->ANonce;\n\n\tu8 key_input[SHA256_MAC_LEN];\n\tu8 *nonce[2];\n\tsize_t len[2];\n\tu8 data[3 * ETH_ALEN];\n\n\t/* IEEE Std 802.11z-2010 8.5.9.1:\n\t * TPK-Key-Input = SHA-256(min(SNonce, ANonce) || max(SNonce, ANonce))\n\t */\n\tlen[0] = 32;\n\tlen[1] = 32;\n\tif (os_memcmp(SNonce, ANonce, 32) < 0) {\n\t\tnonce[0] = SNonce;\n\t\tnonce[1] = ANonce;\n\t} else {\n\t\tnonce[0] = ANonce;\n\t\tnonce[1] = SNonce;\n\t}\n\n\tsha256_vector(2, nonce, len, key_input);\n\n\t/*\n\t * TPK-Key-Data = KDF-N_KEY(TPK-Key-Input, \"TDLS PMK\",\n\t *\tmin(MAC_I, MAC_R) || max(MAC_I, MAC_R) || BSSID || N_KEY)\n\t * TODO: is N_KEY really included in KDF Context and if so, in which\n\t * presentation format (little endian 16-bit?) is it used? It gets\n\t * added by the KDF anyway..\n\t */\n\n\tif (os_memcmp(adapter_mac_addr(padapter), psta->hwaddr, ETH_ALEN) < 0) {\n\t\t_rtw_memcpy(data, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t_rtw_memcpy(data + ETH_ALEN, psta->hwaddr, ETH_ALEN);\n\t} else {\n\t\t_rtw_memcpy(data, psta->hwaddr, ETH_ALEN);\n\t\t_rtw_memcpy(data + ETH_ALEN, adapter_mac_addr(padapter), ETH_ALEN);\n\t}\n\t_rtw_memcpy(data + 2 * ETH_ALEN, get_bssid(pmlmepriv), ETH_ALEN);\n\n\tsha256_prf(key_input, SHA256_MAC_LEN, \"TDLS PMK\", data, sizeof(data), (u8 *) &psta->tpk, sizeof(psta->tpk));\t\n\n\n}\n\n/**\n * wpa_tdls_ftie_mic - Calculate TDLS FTIE MIC\n * @kck: TPK-KCK\n * @lnkid: Pointer to the beginning of Link Identifier IE\n * @rsnie: Pointer to the beginning of RSN IE used for handshake\n * @timeoutie: Pointer to the beginning of Timeout IE used for handshake\n * @ftie: Pointer to the beginning of FT IE\n * @mic: Pointer for writing MIC\n *\n * Calculate MIC for TDLS frame.\n */\nint wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, \n\t\t\t\t\t\t\tu8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,\n\t\t\t\t\t\t\tu8 *mic)\n{\n\tu8 *buf, *pos;\n\tstruct wpa_tdls_ftie *_ftie;\n\tstruct wpa_tdls_lnkid *_lnkid;\n\tint ret;\n\tint len = 2 * ETH_ALEN + 1 + 2 + lnkid[1] + 2 + rsnie[1] +\n\t\t2 + timeoutie[1] + 2 + ftie[1];\n\tbuf = rtw_zmalloc(len);\n\tif (!buf) {\n\t\tDBG_871X(\"TDLS: No memory for MIC calculation\\n\");\n\t\treturn -1;\n\t}\n\n\tpos = buf;\n\t_lnkid = (struct wpa_tdls_lnkid *) lnkid;\n\t/* 1) TDLS initiator STA MAC address */\n\t_rtw_memcpy(pos, _lnkid->init_sta, ETH_ALEN);\n\tpos += ETH_ALEN;\n\t/* 2) TDLS responder STA MAC address */\n\t_rtw_memcpy(pos, _lnkid->resp_sta, ETH_ALEN);\n\tpos += ETH_ALEN;\n\t/* 3) Transaction Sequence number */\n\t*pos++ = trans_seq;\n\t/* 4) Link Identifier IE */\n\t_rtw_memcpy(pos, lnkid, 2 + lnkid[1]);\n\tpos += 2 + lnkid[1];\n\t/* 5) RSN IE */\n\t_rtw_memcpy(pos, rsnie, 2 + rsnie[1]);\n\tpos += 2 + rsnie[1];\n\t/* 6) Timeout Interval IE */\n\t_rtw_memcpy(pos, timeoutie, 2 + timeoutie[1]);\n\tpos += 2 + timeoutie[1];\n\t/* 7) FTIE, with the MIC field of the FTIE set to 0 */\n\t_rtw_memcpy(pos, ftie, 2 + ftie[1]);\n\t_ftie = (struct wpa_tdls_ftie *) pos;\n\t_rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN);\n\tpos += 2 + ftie[1];\n \n\tret = omac1_aes_128(kck, buf, pos - buf, mic);\n\trtw_mfree(buf, len);\n\treturn ret;\n\n}\n\n/**\n * wpa_tdls_teardown_ftie_mic - Calculate TDLS TEARDOWN FTIE MIC\n * @kck: TPK-KCK\n * @lnkid: Pointer to the beginning of Link Identifier IE\n * @reason: Reason code of TDLS Teardown\n * @dialog_token: Dialog token that was used in the MIC calculation for TPK Handshake Message 3\n * @trans_seq: Transaction Sequence number (1 octet) which shall be set to the value 4\n * @ftie: Pointer to the beginning of FT IE\n * @mic: Pointer for writing MIC\n *\n * Calculate MIC for TDLS TEARDOWN frame according to Section 10.22.5 in IEEE 802.11 - 2012.\n */\nint wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason, \n\tu8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic)\n{\n\tu8 *buf, *pos;\n\tstruct wpa_tdls_ftie *_ftie;\n\tint ret;\n\tint len = 2 + lnkid[1] + 2 + 1 + 1 + 2 + ftie[1];\n\t\n\tbuf = rtw_zmalloc(len);\n\tif (!buf) {\n\t\tDBG_871X(\"TDLS: No memory for MIC calculation\\n\");\n\t\treturn -1;\n\t}\n\n\tpos = buf;\n\t/* 1) Link Identifier IE */\n\t_rtw_memcpy(pos, lnkid, 2 + lnkid[1]);\n\tpos += 2 + lnkid[1];\n\t/* 2) Reason Code */\n\t_rtw_memcpy(pos, (u8 *)&reason, 2);\n\tpos += 2;\n\t/* 3) Dialog Token */\n\t*pos++ = dialog_token;\n\t/* 4) Transaction Sequence number */\n\t*pos++ = trans_seq;\n\t/* 5) FTIE, with the MIC field of the FTIE set to 0 */\n\t_rtw_memcpy(pos, ftie, 2 + ftie[1]);\n\t_ftie = (struct wpa_tdls_ftie *) pos;\n\t_rtw_memset(_ftie->mic, 0, TDLS_MIC_LEN);\n\tpos += 2 + ftie[1];\n\n\tret = omac1_aes_128(kck, buf, pos - buf, mic);\n\trtw_mfree(buf, len);\n\treturn ret;\n\n}\n\nint tdls_verify_mic(u8 *kck, u8 trans_seq,\n\t\t\t\t\t\t\tu8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie)\n{\n\tu8 *buf, *pos;\n\tint len;\n\tu8 mic[16];\n\tint ret;\n\tu8 *rx_ftie, *tmp_ftie;\n\n\tif (lnkid == NULL || rsnie == NULL ||\n\t    timeoutie == NULL || ftie == NULL){\n\t\treturn _FAIL;\n\t}\n\t\n\tlen = 2 * ETH_ALEN + 1 + 2 + 18 + 2 + *(rsnie+1) + 2 + *(timeoutie+1) + 2 + *(ftie+1);\n\n\tbuf = rtw_zmalloc(len);\n\tif (buf == NULL)\n\t\treturn _FAIL;\n\n\tpos = buf;\n\t/* 1) TDLS initiator STA MAC address */\n\t_rtw_memcpy(pos, lnkid + ETH_ALEN + 2, ETH_ALEN);\n\tpos += ETH_ALEN;\n\t/* 2) TDLS responder STA MAC address */\n\t_rtw_memcpy(pos, lnkid + 2 * ETH_ALEN + 2, ETH_ALEN);\n\tpos += ETH_ALEN;\n\t/* 3) Transaction Sequence number */\n\t*pos++ = trans_seq;\n\t/* 4) Link Identifier IE */\n\t_rtw_memcpy(pos, lnkid, 2 + 18);\n\tpos += 2 + 18;\n\t/* 5) RSN IE */\n\t_rtw_memcpy(pos, rsnie, 2 + *(rsnie+1));\n\tpos += 2 + *(rsnie+1);\n\t/* 6) Timeout Interval IE */\n\t_rtw_memcpy(pos, timeoutie, 2 + *(timeoutie+1));\n\tpos += 2 + *(timeoutie+1);\n\t/* 7) FTIE, with the MIC field of the FTIE set to 0 */\n\t_rtw_memcpy(pos, ftie, 2 + *(ftie+1));\n\tpos += 2;\n\ttmp_ftie = (u8 *) (pos+2);\n\t_rtw_memset(tmp_ftie, 0, 16);\n\tpos += *(ftie+1);\n\n\tret = omac1_aes_128(kck, buf, pos - buf, mic);\n\trtw_mfree(buf, len);\n\tif (ret)\n\t\treturn _FAIL;\n\trx_ftie = ftie+4;\n\n\tif (os_memcmp(mic, rx_ftie, 16) == 0) {\n\t\t//Valid MIC\n\t\treturn _SUCCESS;\n\t}\n\n\t//Invalid MIC\n\tDBG_871X( \"[%s] Invalid MIC\\n\", __FUNCTION__);\n\treturn _FAIL;\n\n}\n#endif //CONFIG_TDLS\n\nvoid rtw_use_tkipkey_handler(RTW_TIMER_HDL_ARGS)\n{\n        _adapter *padapter = (_adapter *)FunctionContext;\n\n_func_enter_;\t\t\t\n\n\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"^^^rtw_use_tkipkey_handler ^^^\\n\"));\n\t\n/*\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"^^^rtw_use_tkipkey_handler (padapter->bDriverStopped %s)(padapter->bSurpriseRemoved %s)^^^\\n\"\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"));\n\n\t\treturn;\n\t}\n\t*/\n\t\n\tpadapter->securitypriv.busetkipkey=_TRUE;\n\n\tRT_TRACE(_module_rtl871x_security_c_,_drv_err_,(\"^^^rtw_use_tkipkey_handler padapter->securitypriv.busetkipkey=%d^^^\\n\",padapter->securitypriv.busetkipkey));\n\n_func_exit_;\t\n\n}\n\n/* Restore HW wep key setting according to key_mask */\nvoid rtw_sec_restore_wep_key(_adapter *adapter)\n{\n\tstruct security_priv* securitypriv=&(adapter->securitypriv);\n\tsint keyid;\n\n\tif((_WEP40_ == securitypriv->dot11PrivacyAlgrthm) ||(_WEP104_ == securitypriv->dot11PrivacyAlgrthm)) {\n\t\tfor(keyid=0;keyid<4;keyid++){\n\t\t\tif(securitypriv->key_mask & BIT(keyid)){\n\t\t\t\tif(keyid == securitypriv->dot11PrivacyKeyIndex)\n\t\t\t\t\trtw_set_key(adapter,securitypriv, keyid, 1, _FALSE);\n\t\t\t\telse\n\t\t\t\t\trtw_set_key(adapter,securitypriv, keyid, 0, _FALSE);\n\t\t\t}\n\t\t}\n\t}\n}\n\nu8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller)\n{\n\tstruct security_priv* securitypriv=&(adapter->securitypriv);\n\tu8 status = _SUCCESS;\n\n\tif (securitypriv->btkip_countermeasure == _TRUE) {\n\t\tu32 passing_ms = rtw_get_passing_time_ms(securitypriv->btkip_countermeasure_time);\n\t\tif (passing_ms > 60*1000) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s(\"ADPT_FMT\") countermeasure time:%ds > 60s \\n\",\n\t\t\t\tcaller, ADPT_ARG(adapter), passing_ms/1000);\n\t\t\tsecuritypriv->btkip_countermeasure = _FALSE;\n\t\t\tsecuritypriv->btkip_countermeasure_time = 0;\n\t\t} else {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s(\"ADPT_FMT\") countermeasure time:%ds < 60s \\n\",\n\t\t\t\tcaller, ADPT_ARG(adapter), passing_ms/1000);\n\t\t\tstatus = _FAIL;\n\t\t}\n\t}\n\n\treturn status;\n}\n\n#ifdef CONFIG_WOWLAN\nu16 rtw_cal_crc16(u8 data, u16 crc)\n{\n\tu8 shift_in, data_bit;\n\tu8 crc_bit4, crc_bit11, crc_bit15;\n\tu16 crc_result;\n\tint index;\n\n\tfor (index = 0; index < 8; index++) {\n\t\tcrc_bit15 = ((crc & BIT15) ? 1 : 0);\n\t\tdata_bit = (data & (BIT0 << index) ? 1 : 0);\n\t\tshift_in = crc_bit15 ^ data_bit;\n\t\t/*printf(\"crc_bit15=%d, DataBit=%d, shift_in=%d\\n\",\n\t\t * crc_bit15, data_bit, shift_in);*/\n\n\t\tcrc_result = crc << 1;\n\n\t\tif (shift_in == 0)\n\t\t\tcrc_result &= (~BIT0);\n\t\telse\n\t\t\tcrc_result |= BIT0;\n\t\t/*printf(\"CRC =%x\\n\",CRC_Result);*/\n\n\t\tcrc_bit11 = ((crc & BIT11) ? 1 : 0) ^ shift_in;\n\n\t\tif (crc_bit11 == 0)\n\t\t\tcrc_result &= (~BIT12); \n\t\telse\n\t\t\tcrc_result |= BIT12;\n\n\t\t/*printf(\"bit12 CRC =%x\\n\",CRC_Result);*/\n\n\t\tcrc_bit4 = ((crc & BIT4) ? 1 : 0) ^ shift_in;\n\n\t\tif (crc_bit4 == 0)\n\t\t\tcrc_result &= (~BIT5);\n\t\telse\n\t\t\tcrc_result |= BIT5;\n\n\t\t/* printf(\"bit5 CRC =%x\\n\",CRC_Result); */\n\t\t/* repeat using the last result*/\n\t\tcrc = crc_result;\n\t}\n\treturn crc;\n}\n\n/*\n * function name :rtw_calc_crc\n *\n * input: char* pattern , pattern size\n *\n */\nu16 rtw_calc_crc(u8  *pdata, int length)\n{\n\tu16 crc = 0xffff;\n\tint i;\n\t\n\tfor (i = 0; i < length; i++)\n\t\tcrc = rtw_cal_crc16(pdata[i], crc);\n\t/* get 1' complement */\n\tcrc = ~crc;\n\n\treturn crc;\n}\n#endif /*CONFIG_WOWLAN*/\n"
  },
  {
    "path": "core/rtw_sreset.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n#include <hal_data.h>\n#include <rtw_sreset.h>\n\nvoid sreset_init_value(_adapter *padapter)\n{\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\n\t_rtw_mutex_init(&psrtpriv->silentreset_mutex);\n\tpsrtpriv->silent_reset_inprogress = _FALSE;\n\tpsrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\n\tpsrtpriv->last_tx_time =0;\n\tpsrtpriv->last_tx_complete_time =0;\n#endif\n}\nvoid sreset_reset_value(_adapter *padapter)\n{\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\n\tpsrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\n\tpsrtpriv->last_tx_time =0;\n\tpsrtpriv->last_tx_complete_time =0;\n#endif\n}\n\nu8 sreset_get_wifi_status(_adapter *padapter)\n{\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\n\tu8 status = WIFI_STATUS_SUCCESS;\n\tu32 val32 = 0;\n\t_irqL irqL;\n\tif(psrtpriv->silent_reset_inprogress == _TRUE)\n        {\n\t\treturn status;\n\t}\n\tval32 =rtw_read32(padapter,REG_TXDMA_STATUS);\n\tif(val32==0xeaeaeaea){\n\t\tpsrtpriv->Wifi_Error_Status = WIFI_IF_NOT_EXIST;\n\t}\n\telse if(val32!=0){\n\t\tDBG_8192C(\"txdmastatu(%x)\\n\",val32);\n\t\tpsrtpriv->Wifi_Error_Status = WIFI_MAC_TXDMA_ERROR;\n\t}\n\n\tif(WIFI_STATUS_SUCCESS !=psrtpriv->Wifi_Error_Status)\n\t{\n\t\tDBG_8192C(\"==>%s error_status(0x%x) \\n\",__FUNCTION__,psrtpriv->Wifi_Error_Status);\n\t\tstatus = (psrtpriv->Wifi_Error_Status &( ~(USB_READ_PORT_FAIL|USB_WRITE_PORT_FAIL)));\n\t}\n\tDBG_8192C(\"==> %s wifi_status(0x%x)\\n\",__FUNCTION__,status);\n\n\t//status restore\n\tpsrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\n\n\treturn status;\n#else\n\treturn WIFI_STATUS_SUCCESS;\n#endif\n}\n\nvoid sreset_set_wifi_error_status(_adapter *padapter, u32 status)\n{\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tpHalData->srestpriv.Wifi_Error_Status = status;\n#endif\n}\n\nvoid sreset_set_trigger_point(_adapter *padapter, s32 tgp)\n{\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tpHalData->srestpriv.dbg_trigger_point = tgp;\n#endif\n}\n\nbool sreset_inprogress(_adapter *padapter)\n{\n#if defined(DBG_CONFIG_ERROR_RESET)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\treturn pHalData->srestpriv.silent_reset_inprogress;\n#else\n\treturn _FALSE;\n#endif\n}\n\nvoid sreset_restore_security_station(_adapter *padapter)\n{\n\tu8 EntryId = 0;\n\tstruct mlme_priv *mlmepriv = &padapter->mlmepriv;\n\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &padapter->mlmeextpriv.mlmext_info;\n\n\t{\n\t\tu8 val8;\n\n\t\tif (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) {\n\t\t\tval8 = 0xcc;\n\t\t#ifdef CONFIG_WAPI_SUPPORT\n\t\t} else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) {\n\t\t\t//Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey.\n\t\t\tval8 = 0x4c;\n\t\t#endif\n\t\t} else {\n\t\t\tval8 = 0xcf;\n\t\t}\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8));\n\t}\n\n\t#if 0\n\tif (\t( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) ||\n\t\t( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ ))\n\t{\n\n\t\tfor(EntryId=0; EntryId<4; EntryId++)\n\t\t{\n\t\t\tif(EntryId == psecuritypriv->dot11PrivacyKeyIndex)\n\t\t\t\trtw_set_key(padapter,&padapter->securitypriv, EntryId, 1,_FALSE);\n\t\t\telse\n\t\t\t\trtw_set_key(padapter,&padapter->securitypriv, EntryId, 0,_FALSE);\n\t\t}\n\n\t}\n\telse\n\t#endif\n\tif((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||\n\t\t(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))\n\t{\n\t\tpsta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv));\n\t\tif (psta == NULL) {\n\t\t\t//DEBUG_ERR( (\"Set wpa_set_encryption: Obtain Sta_info fail \\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//pairwise key\n\t\t\trtw_setstakey_cmd(padapter, psta, UNICAST_KEY,_FALSE);\n\t\t\t//group key\n\t\t\trtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE);\n\t\t}\n\t}\n}\n\nvoid sreset_restore_network_station(_adapter *padapter)\n{\n\tstruct mlme_priv *mlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t#if 0\n\t{\n\t//=======================================================\n\t// reset related register of Beacon control\n\n\t//set MSR to nolink\n\tSet_MSR(padapter, _HW_STATE_NOLINK_);\t\t\n\t// reject all data frame\n\trtw_write16(padapter, REG_RXFLTMAP2,0x00);\n\t//reset TSF\n\trtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1)));\n\n\t// disable update TSF\n\tSetBcnCtrlReg(padapter, BIT(4), 0);\n\n\t//=======================================================\n\t}\n\t#endif\n\t\n\trtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_FALSE);\n\n\t{\n\t\tu8 threshold;\n\t\t#ifdef CONFIG_USB_HCI\n\t\t// TH=1 => means that invalidate usb rx aggregation\n\t\t// TH=0 => means that validate usb rx aggregation, use init value.\n\t\tif(mlmepriv->htpriv.ht_option) {\n\t\t\tif(padapter->registrypriv.wifi_spec==1)\t\t\n\t\t\t\tthreshold = 1;\n\t\t\telse\n\t\t\t\tthreshold = 0;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));\n\t\t} else {\n\t\t\tthreshold = 1;\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold));\n\t\t}\n\t\t#endif\n\t}\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, NULL);\n\n\tset_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n\t//disable dynamic functions, such as high power, DIG\n\t/*rtw_phydm_func_disable_all(padapter);*/\n\t\n\trtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);\n\n\t{\n\t\tu8\tjoin_type = 0;\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));\n\t}\n\n\tSet_MSR(padapter, (pmlmeinfo->state & 0x3));\n\n\tmlmeext_joinbss_event_callback(padapter, 1);\n\t//restore Sequence No.\n\trtw_hal_set_hwreg(padapter, HW_VAR_RESTORE_HW_SEQ, 0);\n\n\tsreset_restore_security_station(padapter);\n}\n\n\nvoid sreset_restore_network_status(_adapter *padapter)\n{\n\tstruct mlme_priv *mlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_STATION_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));\n\t\tsreset_restore_network_station(padapter);\n\t} else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_AP_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));\n\t\trtw_ap_restore_network(padapter);\n\t} else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_ADHOC_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));\n\t} else {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - ???\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));\n\t}\n}\n\nvoid sreset_stop_adapter(_adapter *padapter)\n{\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\n\tif (padapter == NULL)\n\t\treturn;\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n\trtw_netif_stop_queue(padapter->pnetdev);\n\n\trtw_cancel_all_timer(padapter);\n\n\t/* TODO: OS and HCI independent */\n\t#if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)\n\ttasklet_kill(&pxmitpriv->xmit_tasklet);\n\t#endif\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))\n\t\trtw_scan_abort(padapter);\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))\n\t{\n\t\trtw_set_to_roam(padapter, 0);\n\t\t_rtw_join_timeout_handler(padapter);\n\t}\n\n}\n\nvoid sreset_start_adapter(_adapter *padapter)\n{\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\n\tif (padapter == NULL)\n\t\treturn;\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED)) {\n\t\tsreset_restore_network_status(padapter);\n\t}\n\n\t/* TODO: OS and HCI independent */\n\t#if defined(PLATFORM_LINUX) && defined(CONFIG_USB_HCI)\n\ttasklet_hi_schedule(&pxmitpriv->xmit_tasklet);\n\t#endif\n\n\tif (is_primary_adapter(padapter))\n\t\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n\n\trtw_netif_wake_queue(padapter->pnetdev);\n}\n\nvoid sreset_reset(_adapter *padapter)\n{\n#ifdef DBG_CONFIG_ERROR_RESET\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\t_irqL irqL;\n\tu32 start = rtw_get_current_time();\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpsrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;\n\n\n#ifdef CONFIG_LPS\n\trtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, \"SRESET\");\n#endif//#ifdef CONFIG_LPS\n\t\n\t_enter_pwrlock(&pwrpriv->lock);\n\n\tpsrtpriv->silent_reset_inprogress = _TRUE;\n\tpwrpriv->change_rfpwrstate = rf_off;\n\n\tsreset_stop_adapter(padapter);\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tsreset_stop_adapter(padapter->pbuddy_adapter);\n\t#endif\n\n\t#ifdef CONFIG_IPS\n\t_ips_enter(padapter);\n\t_ips_leave(padapter);\n\t#endif\n\n\tsreset_start_adapter(padapter);\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tsreset_start_adapter(padapter->pbuddy_adapter);\n\t#endif\n\n\tpsrtpriv->silent_reset_inprogress = _FALSE;\n\n\t_exit_pwrlock(&pwrpriv->lock);\n\n\tDBG_871X(\"%s done in %d ms\\n\", __FUNCTION__, rtw_get_passing_time_ms(start));\n\tpdbgpriv->dbg_sreset_cnt++;\n#endif\n}\n\n"
  },
  {
    "path": "core/rtw_sta_mgt.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_STA_MGT_C_\n\n#include <drv_types.h>\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n\n#error \"Shall be Linux or Windows, but not both!\\n\"\n\n#endif\n\n\nvoid _rtw_init_stainfo(struct sta_info *psta);\nvoid _rtw_init_stainfo(struct sta_info *psta)\n{\n\n_func_enter_;\n\n\t_rtw_memset((u8 *)psta, 0, sizeof (struct sta_info));\n\n\t _rtw_spinlock_init(&psta->lock);\n\t_rtw_init_listhead(&psta->list);\n\t_rtw_init_listhead(&psta->hash_list);\n\t//_rtw_init_listhead(&psta->asoc_list);\n\t//_rtw_init_listhead(&psta->sleep_list);\n\t//_rtw_init_listhead(&psta->wakeup_list);\t\n\n\t_rtw_init_queue(&psta->sleep_q);\n\tpsta->sleepq_len = 0;\n\n\t_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);\n\t_rtw_init_sta_recv_priv(&psta->sta_recvpriv);\n\t\n#ifdef CONFIG_AP_MODE\n\n\t_rtw_init_listhead(&psta->asoc_list);\n\n\t_rtw_init_listhead(&psta->auth_list);\n\t\n\tpsta->expire_to = 0;\n\t\n\tpsta->flags = 0;\n\t\n\tpsta->capability = 0;\n\n\tpsta->bpairwise_key_installed = _FALSE;\n\n\n#ifdef CONFIG_NATIVEAP_MLME\n\tpsta->nonerp_set = 0;\n\tpsta->no_short_slot_time_set = 0;\n\tpsta->no_short_preamble_set = 0;\n\tpsta->no_ht_gf_set = 0;\n\tpsta->no_ht_set = 0;\n\tpsta->ht_20mhz_set = 0;\n\tpsta->ht_40mhz_intolerant = 0;\n#endif\t\n\n#ifdef CONFIG_TX_MCAST2UNI\n\tpsta->under_exist_checking = 0;\n#endif\t// CONFIG_TX_MCAST2UNI\n\t\n\tpsta->keep_alive_trycnt = 0;\n\n#endif\t// CONFIG_AP_MODE\t\n\t\n_func_exit_;\t\n\n}\n\nu32\t_rtw_init_sta_priv(struct\tsta_priv *pstapriv)\n{\n\tstruct sta_info *psta;\n\ts32 i;\n\n_func_enter_;\t\n\n\tpstapriv->pallocated_stainfo_buf = rtw_zvmalloc (sizeof(struct sta_info) * NUM_STA+ 4);\n\t\n\tif(!pstapriv->pallocated_stainfo_buf)\n\t\treturn _FAIL;\n\n\tpstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - \n\t\t((SIZE_PTR)(pstapriv->pallocated_stainfo_buf ) & 3);\n\n\t_rtw_init_queue(&pstapriv->free_sta_queue);\n\n\t_rtw_spinlock_init(&pstapriv->sta_hash_lock);\n\t\n\t//_rtw_init_queue(&pstapriv->asoc_q);\n\tpstapriv->asoc_sta_count = 0;\n\t_rtw_init_queue(&pstapriv->sleep_q);\n\t_rtw_init_queue(&pstapriv->wakeup_q);\n\n\tpsta = (struct sta_info *)(pstapriv->pstainfo_buf);\n\n\t\t\n\tfor(i = 0; i < NUM_STA; i++)\n\t{\n\t\t_rtw_init_stainfo(psta);\n\n\t\t_rtw_init_listhead(&(pstapriv->sta_hash[i]));\n\n\t\trtw_list_insert_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue));\n\n\t\tpsta++;\n\t}\n\n\t\n\n#ifdef CONFIG_AP_MODE\n\n\tpstapriv->sta_dz_bitmap = 0;\n\tpstapriv->tim_bitmap = 0;\n\n\t_rtw_init_listhead(&pstapriv->asoc_list);\n\t_rtw_init_listhead(&pstapriv->auth_list);\n\t_rtw_spinlock_init(&pstapriv->asoc_list_lock);\n\t_rtw_spinlock_init(&pstapriv->auth_list_lock);\n\tpstapriv->asoc_list_cnt = 0;\n\tpstapriv->auth_list_cnt = 0;\n\n\tpstapriv->auth_to = 3; // 3*2 = 6 sec \n\tpstapriv->assoc_to = 3;\n\t//pstapriv->expire_to = 900;// 900*2 = 1800 sec = 30 min, expire after no any traffic.\n\t//pstapriv->expire_to = 30;// 30*2 = 60 sec = 1 min, expire after no any traffic.\n#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\tpstapriv->expire_to = 3; // 3*2 = 6 sec\n#else\n\tpstapriv->expire_to = 60;// 60*2 = 120 sec = 2 min, expire after no any traffic.\n#endif\t\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t_rtw_memset(  pstapriv->atmel_rc_pattern, 0, ETH_ALEN);\n#endif\t\n\tpstapriv->max_num_sta = NUM_STA;\n\t\t\n#endif\n\t\n_func_exit_;\t\t\n\n\treturn _SUCCESS;\n\t\n}\n\ninline int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta)\n{\n\tint offset = (((u8 *)sta) - stapriv->pstainfo_buf)/sizeof(struct sta_info);\n\n\tif (!stainfo_offset_valid(offset))\n\t\tDBG_871X(\"%s invalid offset(%d), out of range!!!\", __func__, offset);\n\n\treturn offset;\n}\n\ninline struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset)\n{\n\tif (!stainfo_offset_valid(offset))\n\t\tDBG_871X(\"%s invalid offset(%d), out of range!!!\", __func__, offset);\n\n\treturn (struct sta_info *)(stapriv->pstainfo_buf + offset * sizeof(struct sta_info));\n}\n\nvoid\t_rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv);\nvoid\t_rtw_free_sta_xmit_priv_lock(struct sta_xmit_priv *psta_xmitpriv)\n{\n_func_enter_;\n\n\t_rtw_spinlock_free(&psta_xmitpriv->lock);\n\n\t_rtw_spinlock_free(&(psta_xmitpriv->be_q.sta_pending.lock));\n\t_rtw_spinlock_free(&(psta_xmitpriv->bk_q.sta_pending.lock));\n\t_rtw_spinlock_free(&(psta_xmitpriv->vi_q.sta_pending.lock));\n\t_rtw_spinlock_free(&(psta_xmitpriv->vo_q.sta_pending.lock));\n_func_exit_;\t\n}\n\nstatic void\t_rtw_free_sta_recv_priv_lock(struct sta_recv_priv *psta_recvpriv)\n{\n_func_enter_;\t\n\n\t_rtw_spinlock_free(&psta_recvpriv->lock);\n\n\t_rtw_spinlock_free(&(psta_recvpriv->defrag_q.lock));\n\n_func_exit_;\n\n}\n\nvoid rtw_mfree_stainfo(struct sta_info *psta);\nvoid rtw_mfree_stainfo(struct sta_info *psta)\n{\n_func_enter_;\n\n\tif(&psta->lock != NULL)\n\t\t _rtw_spinlock_free(&psta->lock);\n\n\t_rtw_free_sta_xmit_priv_lock(&psta->sta_xmitpriv);\n\t_rtw_free_sta_recv_priv_lock(&psta->sta_recvpriv);\n\t\n_func_exit_;\t\n}\n\n\n// this function is used to free the memory of lock || sema for all stainfos\nvoid rtw_mfree_all_stainfo(struct sta_priv *pstapriv );\nvoid rtw_mfree_all_stainfo(struct sta_priv *pstapriv )\n{\n\t_irqL\t irqL;\n\t_list\t*plist, *phead;\n\tstruct sta_info *psta = NULL;\n\t\n_func_enter_;\t\n\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\tphead = get_list_head(&pstapriv->free_sta_queue);\n\tplist = get_next(phead);\n\t\t\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info ,list);\n\t\tplist = get_next(plist);\n\n\t\trtw_mfree_stainfo(psta);\n\t}\n\t\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n_func_exit_;\t\n\n}\n\nvoid rtw_mfree_sta_priv_lock(struct\tsta_priv *pstapriv);\nvoid rtw_mfree_sta_priv_lock(struct\tsta_priv *pstapriv)\n{\n#ifdef CONFIG_AP_MODE\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n#endif\n\n\t rtw_mfree_all_stainfo(pstapriv); //be done before free sta_hash_lock\n\n\t_rtw_spinlock_free(&pstapriv->free_sta_queue.lock);\n\n\t_rtw_spinlock_free(&pstapriv->sta_hash_lock);\n\t_rtw_spinlock_free(&pstapriv->wakeup_q.lock);\n\t_rtw_spinlock_free(&pstapriv->sleep_q.lock);\n\n#ifdef CONFIG_AP_MODE\n\t_rtw_spinlock_free(&pstapriv->asoc_list_lock);\n\t_rtw_spinlock_free(&pstapriv->auth_list_lock);\n\t_rtw_spinlock_free(&pacl_list->acl_node_q.lock);\n#endif\n\n}\n\nu32\t_rtw_free_sta_priv(struct\tsta_priv *pstapriv)\n{\n\t_irqL \tirqL;\n\t_list\t*phead, *plist;\n\tstruct sta_info *psta = NULL;\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tint \tindex;\n\n_func_enter_;\n\tif(pstapriv){\n\n\t\t/*\tdelete all reordering_ctrl_timer\t\t*/ \n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\tfor(index = 0; index < NUM_STA; index++)\n\t\t{\n\t\t\tphead = &(pstapriv->sta_hash[index]);\n\t\t\tplist = get_next(phead);\n\t\t\t\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t{\n\t\t\t\tint i;\t\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);\n\t\t\t\tplist = get_next(plist);\n\n\t\t\t\tfor(i=0; i < 16 ; i++)\n\t\t\t\t{\n\t\t\t\t\tpreorder_ctrl = &psta->recvreorder_ctrl[i];\n\t\t\t\t\t_cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\t/*===============================*/\n\t\t\n\t\trtw_mfree_sta_priv_lock(pstapriv);\n\n\t\tif(pstapriv->pallocated_stainfo_buf) {\n\t\t\trtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4);\n\t\t}\n\t}\n\t\n_func_exit_;\n\treturn _SUCCESS;\n}\n\n\n//struct\tsta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr)\nstruct\tsta_info *rtw_alloc_stainfo(struct\tsta_priv *pstapriv, u8 *hwaddr) \n{\t\n\t_irqL irqL, irqL2;\n\tuint tmp_aid;\n\ts32\tindex;\n\t_list\t*phash_list;\n\tstruct sta_info\t*psta;\n\t_queue *pfree_sta_queue;\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tint i = 0;\n\tu16  wRxSeqInitialValue = 0xffff;\n\t\n_func_enter_;\t\n\n\tpfree_sta_queue = &pstapriv->free_sta_queue;\n\n\t//_enter_critical_bh(&(pfree_sta_queue->lock), &irqL);\n\t_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\tif (_rtw_queue_empty(pfree_sta_queue) == _TRUE)\n\t{\n\t\t//_exit_critical_bh(&(pfree_sta_queue->lock), &irqL);\n\t\t_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\t\tpsta = NULL;\n\t}\n\telse\n\t{\n\t\tpsta = LIST_CONTAINOR(get_next(&pfree_sta_queue->queue), struct sta_info, list);\n\t\t\n\t\trtw_list_delete(&(psta->list));\n\n\t\t//_exit_critical_bh(&(pfree_sta_queue->lock), &irqL);\n\t\t\n\t\ttmp_aid = psta->aid;\t\n\t\n\t\t_rtw_init_stainfo(psta);\n\n\t\tpsta->padapter = pstapriv->padapter;\n\n\t\t_rtw_memcpy(psta->hwaddr, hwaddr, ETH_ALEN);\n\n\t\tindex = wifi_mac_hash(hwaddr);\n\n\t\tRT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,(\"rtw_alloc_stainfo: index  = %x\", index));\n\n\t\tif(index >= NUM_STA){\n\t\t\tRT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,(\"ERROR=> rtw_alloc_stainfo: index >= NUM_STA\"));\n\t\t\tpsta= NULL;\t\n\t\t\tgoto exit;\n\t\t}\n\t\tphash_list = &(pstapriv->sta_hash[index]);\n\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\n\t\trtw_list_insert_tail(&psta->hash_list, phash_list);\n\n\t\tpstapriv->asoc_sta_count ++ ;\n\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\n// Commented by Albert 2009/08/13\n// For the SMC router, the sequence number of first packet of WPS handshake will be 0.\n// In this case, this packet will be dropped by recv_decache function if we use the 0x00 as the default value for tid_rxseq variable.\n// So, we initialize the tid_rxseq variable as the 0xffff.\n\n\t\tfor( i = 0; i < 16; i++ )\n\t\t{\n                     _rtw_memcpy( &psta->sta_recvpriv.rxcache.tid_rxseq[ i ], &wRxSeqInitialValue, 2 );\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_info_,(\"alloc number_%d stainfo  with hwaddr = %x %x %x %x %x %x  \\n\", \n\t\tpstapriv->asoc_sta_count , hwaddr[0], hwaddr[1], hwaddr[2],hwaddr[3],hwaddr[4],hwaddr[5]));\n\n\t\tinit_addba_retry_timer(pstapriv->padapter, psta);\n#ifdef CONFIG_IEEE80211W\n\t\tinit_dot11w_expire_timer(pstapriv->padapter, psta);\n#endif /* CONFIG_IEEE80211W */\n#ifdef CONFIG_TDLS\n\t\trtw_init_tdls_timer(pstapriv->padapter, psta);\n#endif //CONFIG_TDLS\n\n\t\t//for A-MPDU Rx reordering buffer control\n\t\tfor(i=0; i < 16 ; i++)\n\t\t{\n\t\t\tpreorder_ctrl = &psta->recvreorder_ctrl[i];\n\n\t\t\tpreorder_ctrl->padapter = pstapriv->padapter;\n\t\t\n\t\t\tpreorder_ctrl->enable = _FALSE;\n\t\t\n\t\t\tpreorder_ctrl->indicate_seq = 0xffff;\n\t\t\t#ifdef DBG_RX_SEQ\n\t\t\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d\\n\", __FUNCTION__, __LINE__,\n\t\t\t\tpreorder_ctrl->indicate_seq);\n\t\t\t#endif\n\t\t\tpreorder_ctrl->wend_b= 0xffff;       \n\t\t\t//preorder_ctrl->wsize_b = (NR_RECVBUFF-2);\n\t\t\tpreorder_ctrl->wsize_b = 64;//64;\n\t\t\tpreorder_ctrl->ampdu_size = RX_AMPDU_SIZE_INVALID;\n\n\t\t\t_rtw_init_queue(&preorder_ctrl->pending_recvframe_queue);\n\n\t\t\trtw_init_recv_timer(preorder_ctrl);\n\t\t}\n\n\n\t\t//init for DM\n\t\tpsta->rssi_stat.UndecoratedSmoothedPWDB = (-1);\n\t\tpsta->rssi_stat.UndecoratedSmoothedCCK = (-1);\n#ifdef CONFIG_ATMEL_RC_PATCH\n\t\tpsta->flag_atmel_rc = 0;\n#endif\n\t\t/* init for the sequence number of received management frame */\n\t\tpsta->RxMgmtFrameSeqNum = 0xffff;\n\t\tpsta->ra_rpt_linked = _FALSE;\n\n\t\t//alloc mac id for non-bc/mc station,\n\t\trtw_alloc_macid(pstapriv->padapter, psta);\n\n\t}\n\t\nexit:\n\n\t_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);\n\n_func_exit_;\n\n\treturn psta;\n\n\n}\n\n\n// using pstapriv->sta_hash_lock to protect\nu32\trtw_free_stainfo(_adapter *padapter , struct sta_info *psta)\n{\t\n\tint i;\n\t_irqL irqL0;\n\t_queue *pfree_sta_queue;\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tstruct\tsta_xmit_priv\t*pstaxmitpriv;\n\tstruct\txmit_priv\t*pxmitpriv= &padapter->xmitpriv;\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct hw_xmit *phwxmit;\n\tint pending_qcnt[4];\n\n_func_enter_;\t\n\t\n\tif (psta == NULL)\n\t\tgoto exit;\n\n\t_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);\n\trtw_list_delete(&psta->hash_list);\n\tRT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,(\"\\n free number_%d stainfo  with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x  \\n\",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));\n\tpstapriv->asoc_sta_count --;\n\t_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);\n\n\n\t_enter_critical_bh(&psta->lock, &irqL0);\n\tpsta->state &= ~_FW_LINKED;\n\t_exit_critical_bh(&psta->lock, &irqL0);\n\n\tpfree_sta_queue = &pstapriv->free_sta_queue;\n\n\n\tpstaxmitpriv = &psta->sta_xmitpriv;\n\t\n\t//rtw_list_delete(&psta->sleep_list);\n\t\n\t//rtw_list_delete(&psta->wakeup_list);\n\t\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL0);\n\t\n\trtw_free_xmitframe_queue(pxmitpriv, &psta->sleep_q);\n\tpsta->sleepq_len = 0;\n\t\n\t//vo\n\t//_enter_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0);\n\trtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vo_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));\n\tphwxmit = pxmitpriv->hwxmits;\n\tphwxmit->accnt -= pstaxmitpriv->vo_q.qcnt;\n\tpending_qcnt[0] = pstaxmitpriv->vo_q.qcnt;\n\tpstaxmitpriv->vo_q.qcnt = 0;\n\t//_exit_critical_bh(&(pxmitpriv->vo_pending.lock), &irqL0);\n\n\t//vi\n\t//_enter_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0);\n\trtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->vi_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));\n\tphwxmit = pxmitpriv->hwxmits+1;\n\tphwxmit->accnt -= pstaxmitpriv->vi_q.qcnt;\n\tpending_qcnt[1] = pstaxmitpriv->vi_q.qcnt;\n\tpstaxmitpriv->vi_q.qcnt = 0;\n\t//_exit_critical_bh(&(pxmitpriv->vi_pending.lock), &irqL0);\n\n\t//be\n\t//_enter_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0);\n\trtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->be_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));\n\tphwxmit = pxmitpriv->hwxmits+2;\n\tphwxmit->accnt -= pstaxmitpriv->be_q.qcnt;\n\tpending_qcnt[2] = pstaxmitpriv->be_q.qcnt;\n\tpstaxmitpriv->be_q.qcnt = 0;\n\t//_exit_critical_bh(&(pxmitpriv->be_pending.lock), &irqL0);\n\t\n\t//bk\n\t//_enter_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0);\n\trtw_free_xmitframe_queue( pxmitpriv, &pstaxmitpriv->bk_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));\n\tphwxmit = pxmitpriv->hwxmits+3;\n\tphwxmit->accnt -= pstaxmitpriv->bk_q.qcnt;\n\tpending_qcnt[3] = pstaxmitpriv->bk_q.qcnt;\n\tpstaxmitpriv->bk_q.qcnt = 0;\n\t//_exit_critical_bh(&(pxmitpriv->bk_pending.lock), &irqL0);\n\n\trtw_os_wake_queue_at_free_stainfo(padapter, pending_qcnt);\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL0);\n\t\n\t\n\t// re-init sta_info; 20061114 // will be init in alloc_stainfo\n\t//_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);\n\t//_rtw_init_sta_recv_priv(&psta->sta_recvpriv);\n#ifdef CONFIG_IEEE80211W\n\t_cancel_timer_ex(&psta->dot11w_expire_timer);\n#endif /* CONFIG_IEEE80211W */\n\t_cancel_timer_ex(&psta->addba_retry_timer);\n\n#ifdef CONFIG_TDLS\n\tpsta->tdls_sta_state = TDLS_STATE_NONE;\n\trtw_free_tdls_timer(psta);\n#endif //CONFIG_TDLS\n\n\t//for A-MPDU Rx reordering buffer control, cancel reordering_ctrl_timer\n\tfor(i=0; i < 16 ; i++)\n\t{\n\t\t_irqL irqL;\n\t\t_list\t*phead, *plist;\n\t\tunion recv_frame *prframe;\n\t\t_queue *ppending_recvframe_queue;\n\t\t_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;\n\t\n\t\tpreorder_ctrl = &psta->recvreorder_ctrl[i];\n\t\t\n\t\t_cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer);\t\t\n\n\t\t\n\t\tppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;\n\n\t\t_enter_critical_bh(&ppending_recvframe_queue->lock, &irqL);\n\n\t\tphead = \tget_list_head(ppending_recvframe_queue);\n\t\tplist = get_next(phead);\n\t\t\n\t\twhile(!rtw_is_list_empty(phead))\n\t\t{\t\n\t\t\tprframe = LIST_CONTAINOR(plist, union recv_frame, u);\n\t\t\t\n\t\t\tplist = get_next(plist);\n\t\t\t\n\t\t\trtw_list_delete(&(prframe->u.hdr.list));\n\n\t\t\trtw_free_recvframe(prframe, pfree_recv_queue);\n\t\t}\n\n\t\t_exit_critical_bh(&ppending_recvframe_queue->lock, &irqL);\n\t\t\n\t}\n\n\tif (!(psta->state & WIFI_AP_STATE))\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _FALSE);\n\t\t\t\n\n\t//release mac id for non-bc/mc station,\n\trtw_release_macid(pstapriv->padapter, psta);\n\n#ifdef CONFIG_AP_MODE\n\n/*\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL0);\n\trtw_list_delete(&psta->asoc_list);\t\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL0);\n*/\n\t_enter_critical_bh(&pstapriv->auth_list_lock, &irqL0);\n\tif (!rtw_is_list_empty(&psta->auth_list)) {\n\t\trtw_list_delete(&psta->auth_list);\n\t\tpstapriv->auth_list_cnt--;\n\t}\n\t_exit_critical_bh(&pstapriv->auth_list_lock, &irqL0);\n\t\n\tpsta->expire_to = 0;\n#ifdef CONFIG_ATMEL_RC_PATCH\n\tpsta->flag_atmel_rc = 0;\n#endif\n\tpsta->sleepq_ac_len = 0;\n\tpsta->qos_info = 0;\n\n\tpsta->max_sp_len = 0;\n\tpsta->uapsd_bk = 0;\n\tpsta->uapsd_be = 0;\n\tpsta->uapsd_vi = 0;\n\tpsta->uapsd_vo = 0;\n\n\tpsta->has_legacy_ac = 0;\n\n#ifdef CONFIG_NATIVEAP_MLME\n\t\n\tpstapriv->sta_dz_bitmap &=~BIT(psta->aid);\n\tpstapriv->tim_bitmap &=~BIT(psta->aid);\t\n\n\t//rtw_indicate_sta_disassoc_event(padapter, psta);\n\n\tif ((psta->aid >0)&&(pstapriv->sta_aid[psta->aid - 1] == psta))\n\t{\n\t\tpstapriv->sta_aid[psta->aid - 1] = NULL;\n\t\tpsta->aid = 0;\n\t}\t\n\t\n#endif\t// CONFIG_NATIVEAP_MLME\t\n\n#ifdef CONFIG_TX_MCAST2UNI\n\tpsta->under_exist_checking = 0;\n#endif\t// CONFIG_TX_MCAST2UNI\n\n#endif\t// CONFIG_AP_MODE\t\n\n\t _rtw_spinlock_free(&psta->lock);\n\n\t//_enter_critical_bh(&(pfree_sta_queue->lock), &irqL0);\n\t_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);\t\n\trtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue));\n\t_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);\n\t//_exit_critical_bh(&(pfree_sta_queue->lock), &irqL0);\n\nexit:\n\t\n_func_exit_;\t\n\n\treturn _SUCCESS;\n\t\n}\n\n// free all stainfo which in sta_hash[all]\nvoid rtw_free_all_stainfo(_adapter *padapter)\n{\n\t_irqL\t irqL;\n\t_list\t*plist, *phead;\n\ts32\tindex;\n\tstruct sta_info *psta = NULL;\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter);\n\tu8 free_sta_num = 0;\n\tchar free_sta_list[NUM_STA];\n\tint stainfo_offset;\n\t\n_func_enter_;\t\n\n\tif(pstapriv->asoc_sta_count==1)\n\t\tgoto exit;\n\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\tfor(index=0; index< NUM_STA; index++)\n\t{\n\t\tphead = &(pstapriv->sta_hash[index]);\n\t\tplist = get_next(phead);\n\t\t\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t{\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);\n\n\t\t\tplist = get_next(plist);\n\n\t\t\tif(pbcmc_stainfo!=psta)\n\t\t\t{\n\t\t\t\trtw_list_delete(&psta->hash_list);\n\t\t\t\t//rtw_free_stainfo(padapter , psta);\n\t\t\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, psta);\n\t\t\t\tif (stainfo_offset_valid(stainfo_offset)) {\n\t\t\t\t\tfree_sta_list[free_sta_num++] = stainfo_offset;\n\t\t\t\t}\n\t\t\t}\t\n\t\t\t\n\t\t}\n\t}\n\t\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\n\tfor (index = 0; index < free_sta_num; index++) \n\t{\n\t\tpsta = rtw_get_stainfo_by_offset(pstapriv, free_sta_list[index]);\n\t\trtw_free_stainfo(padapter , psta);\n\t}\n\t\nexit:\t\n\t\n_func_exit_;\t\n\n}\n\n/* any station allocated can be searched by hash list */\nstruct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr)\n{\n\n\t_irqL\t irqL;\n\n\t_list\t*plist, *phead;\n\n\tstruct sta_info *psta = NULL;\n\t\n\tu32\tindex;\n\n\tu8 *addr;\n\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\n_func_enter_;\n\n\tif(hwaddr==NULL)\n\t\treturn NULL;\n\t\t\n\tif(IS_MCAST(hwaddr))\n\t{\n\t\taddr = bc_addr;\n\t}\n\telse\n\t{\n\t\taddr = hwaddr;\n\t}\n\n\tindex = wifi_mac_hash(addr);\n\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\n\tphead = &(pstapriv->sta_hash[index]);\n\tplist = get_next(phead);\n\n\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\n\t\tif ((_rtw_memcmp(psta->hwaddr, addr, ETH_ALEN))== _TRUE) \n\t\t{ // if found the matched address\n\t\t\tbreak;\n\t\t}\n\t\tpsta=NULL;\n\t\tplist = get_next(plist);\n\t}\n\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n_func_exit_;\t\n\treturn psta;\n\t\n}\n\nu32 rtw_init_bcmc_stainfo(_adapter* padapter)\n{\n\n\tstruct sta_info \t*psta;\n\tstruct tx_servq\t*ptxservq;\n\tu32 res=_SUCCESS;\n\tNDIS_802_11_MAC_ADDRESS\tbcast_addr= {0xff,0xff,0xff,0xff,0xff,0xff};\n\t\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\t//_queue\t*pstapending = &padapter->xmitpriv.bm_pending; \n\t\n_func_enter_;\n\n\tpsta = rtw_alloc_stainfo(pstapriv, bcast_addr);\n\t\n\tif(psta==NULL){\n\t\tres=_FAIL;\n\t\tRT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,(\"rtw_alloc_stainfo fail\"));\n\t\tgoto exit;\n\t}\n#ifdef CONFIG_BEAMFORMING\n\tpsta->txbf_gid = 63;\n\tpsta->txbf_paid = 0;\n#endif\n\tptxservq= &(psta->sta_xmitpriv.be_q);\n\n/*\n\t_enter_critical(&pstapending->lock, &irqL0);\n\n\tif (rtw_is_list_empty(&ptxservq->tx_pending))\n\t\trtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(pstapending));\n\n\t_exit_critical(&pstapending->lock, &irqL0);\n*/\n\t\nexit:\n_func_exit_;\t\t\n\treturn _SUCCESS;\n\n}\n\n\nstruct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter)\n{\n\tstruct sta_info \t*psta;\n\tstruct sta_priv \t*pstapriv = &padapter->stapriv;\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n_func_enter_;\n\t psta = rtw_get_stainfo(pstapriv, bc_addr);\n_func_exit_;\t\t \n\treturn psta;\n\n}\n\nu8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr)\n{\n\tu8 res = _TRUE;\n#ifdef  CONFIG_AP_MODE\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tstruct rtw_wlan_acl_node *paclnode;\n\tu8 match = _FALSE;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct wlan_acl_pool *pacl_list = &pstapriv->acl_list;\n\t_queue\t*pacl_node_q =&pacl_list->acl_node_q;\n\t\n\t_enter_critical_bh(&(pacl_node_q->lock), &irqL);\n\tphead = get_list_head(pacl_node_q);\n\tplist = get_next(phead);\t\t\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t{\n\t\tpaclnode = LIST_CONTAINOR(plist, struct rtw_wlan_acl_node, list);\n\t\tplist = get_next(plist);\n\n\t\tif(_rtw_memcmp(paclnode->addr, mac_addr, ETH_ALEN))\n\t\t{\n\t\t\tif(paclnode->valid == _TRUE)\n\t\t\t{\n\t\t\t\tmatch = _TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\t\n\t}\t\n\t_exit_critical_bh(&(pacl_node_q->lock), &irqL);\n\t\n\n\tif(pacl_list->mode == 1)//accept unless in deny list\n\t{\n\t\tres = (match == _TRUE) ?  _FALSE:_TRUE;\n\t}\t\n\telse if(pacl_list->mode == 2)//deny unless in accept list\n\t{\n\t\tres = (match == _TRUE) ?  _TRUE:_FALSE;\n\t}\n\telse\n\t{\n\t\t res = _TRUE;\n\t}\t\t\n\t\n#endif\n\n\treturn res;\n\n}\n\n"
  },
  {
    "path": "core/rtw_tdls.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_TDLS_C_\n\n#include <drv_types.h>\n\n#ifdef CONFIG_TDLS\n#define ONE_SEC \t1000 /* 1000 ms */\n\nextern unsigned char MCS_rate_2R[16];\nextern unsigned char MCS_rate_1R[16];\nextern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);\n\nvoid rtw_reset_tdls_info(_adapter* padapter)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tptdlsinfo->ap_prohibited = _FALSE;\n\t\n\t/* For TDLS channel switch, currently we only allow it to work in wifi logo test mode */\n\tif (padapter->registrypriv.wifi_spec == 1)\n\t{\n\t\tptdlsinfo->ch_switch_prohibited = _FALSE;\n\t}\n\telse\n\t{\n\t\tptdlsinfo->ch_switch_prohibited = _TRUE;\n\t}\n\n\tptdlsinfo->link_established = _FALSE;\n\tptdlsinfo->sta_cnt = 0;\n\tptdlsinfo->sta_maximum = _FALSE;\n\n#ifdef CONFIG_TDLS_CH_SW\n\tptdlsinfo->chsw_info.ch_sw_state = TDLS_STATE_NONE;\n\tATOMIC_SET(&ptdlsinfo->chsw_info.chsw_on, _FALSE);\n\tptdlsinfo->chsw_info.off_ch_num = 0;\n\tptdlsinfo->chsw_info.ch_offset = 0;\n\tptdlsinfo->chsw_info.cur_time = 0;\n\tptdlsinfo->chsw_info.delay_switch_back = _FALSE;\n\tptdlsinfo->chsw_info.dump_stack = _FALSE;\n#endif\n\t\n\tptdlsinfo->ch_sensing = 0;\n\tptdlsinfo->watchdog_count = 0;\n\tptdlsinfo->dev_discovered = _FALSE;\n\n#ifdef CONFIG_WFD\n\tptdlsinfo->wfd_info = &padapter->wfd_info;\n#endif /* ONFIG_WFD */\n}\n\nint rtw_init_tdls_info(_adapter* padapter)\n{\n\tint\tres = _SUCCESS;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\trtw_reset_tdls_info(padapter);\n\n\tptdlsinfo->tdls_enable = _TRUE;\n#ifdef CONFIG_TDLS_DRIVER_SETUP\n\tptdlsinfo->driver_setup = _TRUE;\n#else\n\tptdlsinfo->driver_setup = _FALSE;\n#endif /* CONFIG_TDLS_DRIVER_SETUP */\n\n\t_rtw_spinlock_init(&ptdlsinfo->cmd_lock);\n\t_rtw_spinlock_init(&ptdlsinfo->hdl_lock);\n\n\treturn res;\n\n}\n\nvoid rtw_free_tdls_info(struct tdls_info *ptdlsinfo)\n{\n\t_rtw_spinlock_free(&ptdlsinfo->cmd_lock);\n\t_rtw_spinlock_free(&ptdlsinfo->hdl_lock);\n\n\t_rtw_memset(ptdlsinfo, 0, sizeof(struct tdls_info) );\n\n}\n\nint check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len)\n{\n\tu8 tdls_prohibited_bit = 0x40; /* bit(38); TDLS_prohibited */\n\n\tif (pkt_len < 5) {\n\t\treturn _FALSE;\n\t}\n\n\tpframe += 4;\n\tif ((*pframe) & tdls_prohibited_bit)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nint check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len)\n{\n\tu8 tdls_ch_swithcing_prohibited_bit = 0x80; /* bit(39); TDLS_channel_switching prohibited */\n\n\tif (pkt_len < 5) {\n\t\treturn _FALSE;\n\t}\n\n\tpframe += 4;\n\tif ((*pframe) & tdls_ch_swithcing_prohibited_bit)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nint _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack)\n{\n\tint ret = _FAIL;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl, *qc;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\tpattrib->hdrlen +=2;\n\tpattrib->qos_en = _TRUE;\n\tpattrib->eosp = 1;\n\tpattrib->ack_policy = 0;\n\tpattrib->mdata = 0;\t\n\tpattrib->retry_ctrl = _FALSE;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\tif (power_mode)\n\t\tSetPwrMgt(fctrl);\n\n\tqc = (unsigned short *)(pframe + pattrib->hdrlen - 2);\n\t\n\tSetPriority(qc, 7);\t/* Set priority to VO */\n\n\tSetEOSP(qc, pattrib->eosp);\n\n\tSetAckpolicy(qc, pattrib->ack_policy);\n\n\t_rtw_memcpy(pwlanhdr->addr1, da, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tif (wait_ack)\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\telse {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\treturn ret;\n\n}\n\n/*\n *wait_ms == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT\n *wait_ms > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX\n *try_cnt means the maximal TX count to try\n */\nint issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)\n{\n\tint ret;\n\tint i = 0;\n\tu32 start = rtw_get_current_time();\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t#if 0\n\tpsta = rtw_get_stainfo(&padapter->stapriv, da);\n\tif (psta) {\n\t\tif (power_mode)\n\t\t\trtw_hal_macid_sleep(padapter, psta->mac_id);\n\t\telse\n\t\t\trtw_hal_macid_wakeup(padapter, psta->mac_id);\n\t} else {\n\t\tDBG_871X(FUNC_ADPT_FMT \": Can't find sta info for \" MAC_FMT \", skip macid %s!!\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?\"sleep\":\"wakeup\");\n\t\trtw_warn_on(1);\n\t}\n\t#endif\n\n\tdo {\n\t\tret = _issue_nulldata_to_TDLS_peer_STA(padapter, da, power_mode, wait_ms>0 ? _TRUE : _FALSE);\n\n\t\ti++;\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\tbreak;\n\n\t\tif (i < try_cnt && wait_ms > 0 && ret == _FAIL)\n\t\t\trtw_msleep_os(wait_ms);\n\n\t} while ((i < try_cnt) && (ret==_FAIL || wait_ms==0));\n\n\tif (ret != _FAIL) {\n\t\tret = _SUCCESS;\n\t\t#ifndef DBG_XMIT_ACK\n\t\tgoto exit;\n\t\t#endif\n\t}\n\n\tif (try_cnt && wait_ms) {\n\t\tif (da)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" to \"MAC_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), MAC_ARG(da), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\", ch:%u%s, %d/%d in %u ms\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), rtw_get_oper_ch(padapter),\n\t\t\t\tret==_SUCCESS?\", acked\":\"\", i, try_cnt, rtw_get_passing_time_ms(start));\n\t}\nexit:\n\treturn ret;\n}\n\nvoid free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t_irqL irqL;\n\t\n\t/* free peer sta_info */\n\t_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\tif (ptdlsinfo->sta_cnt != 0)\n\t\tptdlsinfo->sta_cnt--;\n\t_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\t/* -2: AP + BC/MC sta, -4: default key */\n\tif (ptdlsinfo->sta_cnt < MAX_ALLOWED_TDLS_STA_NUM) {\n\t\tptdlsinfo->sta_maximum = _FALSE;\n\t\t_rtw_memset( &ptdlsinfo->ss_record, 0x00, sizeof(struct tdls_ss_record) );\n\t}\n\n\t/* clear cam */\n\trtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE);\n\n\tif (ptdlsinfo->sta_cnt == 0) {\n\t\trtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR);\n\t\tptdlsinfo->link_established = _FALSE;\n\t}\n\telse\n\t\tDBG_871X(\"Remain tdls sta:%02x\\n\", ptdlsinfo->sta_cnt);\n\n\trtw_free_stainfo(padapter,  ptdls_sta);\n\t\n}\n\n\n/* TDLS encryption(if needed) will always be CCMP */\nvoid rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta)\n{\n\tptdls_sta->dot118021XPrivacy=_AES_;\n\trtw_setstakey_cmd(padapter, ptdls_sta, TDLS_KEY, _TRUE);\n}\n\n#ifdef CONFIG_80211N_HT\nvoid rtw_tdls_process_ht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t\t*phtpriv = &pmlmepriv->htpriv;\n\tu8\tmax_AMPDU_len, min_MPDU_spacing;\n\tu8\tcur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0;\n\t\n\t/* Save HT capabilities in the sta object */\n\t_rtw_memset(&ptdls_sta->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap));\n\tif (data && Length >= sizeof(struct rtw_ieee80211_ht_cap)) {\n\t\tptdls_sta->flags |= WLAN_STA_HT;\n\t\tptdls_sta->flags |= WLAN_STA_WME;\n\n\t\t_rtw_memcpy(&ptdls_sta->htpriv.ht_cap, data, sizeof(struct rtw_ieee80211_ht_cap));\t\t\t\n\t} else\n\t\tptdls_sta->flags &= ~WLAN_STA_HT;\n\n\tif (ptdls_sta->flags & WLAN_STA_HT) {\n\t\tif (padapter->registrypriv.ht_enable == _TRUE) {\n\t\t\tptdls_sta->htpriv.ht_option = _TRUE;\n\t\t\tptdls_sta->qos_option = _TRUE;\n\t\t} else {\n\t\t\tptdls_sta->htpriv.ht_option = _FALSE;\n\t\t\tptdls_sta->qos_option = _FALSE;\n\t\t}\n\t}\n\n\t/* HT related cap */\n\tif (ptdls_sta->htpriv.ht_option) {\n\t\t/* Check if sta supports rx ampdu */\n\t\tif (padapter->registrypriv.ampdu_enable == 1)\n\t\t\tptdls_sta->htpriv.ampdu_enable = _TRUE;\n\n\t\t/* AMPDU Parameters field */\n\t\t/* Get MIN of MAX AMPDU Length Exp */\n\t\tif ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (data[2] & 0x3))\n\t\t\tmax_AMPDU_len = (data[2] & 0x3);\n\t\telse\n\t\t\tmax_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);\n\t\t/* Get MAX of MIN MPDU Start Spacing */\n\t\tif ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (data[2] & 0x1c))\n\t\t\tmin_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);\n\t\telse\n\t\t\tmin_MPDU_spacing = (data[2] & 0x1c);\n\t\tptdls_sta->htpriv.rx_ampdu_min_spacing = max_AMPDU_len | min_MPDU_spacing;\n\n\t\t/* Check if sta support s Short GI 20M */\n\t\tif (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))\n\t\t\tptdls_sta->htpriv.sgi_20m = _TRUE;\n\n\t\t/* Check if sta support s Short GI 40M */\n\t\tif (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))\n\t\t\tptdls_sta->htpriv.sgi_40m = _TRUE;\n\n\t\t/* Bwmode would still followed AP's setting */\n\t\tif (ptdls_sta->htpriv.ht_cap.cap_info & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH)) {\n\t\t\tif (padapter->mlmeextpriv.cur_bwmode >= CHANNEL_WIDTH_40)\n\t\t\t\tptdls_sta->bw_mode = CHANNEL_WIDTH_40;\n\t\t\tptdls_sta->htpriv.ch_offset = padapter->mlmeextpriv.cur_ch_offset;\n\t\t}\n\n\t\t/* Config LDPC Coding Capability */\n\t\tif (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(data)) {\n\t\t\tSET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));\n\t\t\tDBG_871X(\"Enable HT Tx LDPC!\\n\");\n\t\t}\n\t\tptdls_sta->htpriv.ldpc_cap = cur_ldpc_cap;\n\n\t\t/* Config STBC setting */\n\t\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(data)) {\n\t\t\tSET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX));\n\t\t\tDBG_871X(\"Enable HT Tx STBC!\\n\");\n\t\t}\n\t\tptdls_sta->htpriv.stbc_cap = cur_stbc_cap;\n\n#ifdef CONFIG_BEAMFORMING\n\t\t/* Config Tx beamforming setting */\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && \n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(data)) {\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\n\t\t}\n\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&\n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(data)) {\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\n\t\t}\n\t\tptdls_sta->htpriv.beamform_cap = cur_beamform_cap;\n\t\tif (cur_beamform_cap)\n\t\t\tDBG_871X(\"Client HT Beamforming Cap = 0x%02X\\n\", cur_beamform_cap);\n#endif /* CONFIG_BEAMFORMING */\n\t}\n\n}\n\nu8 *rtw_tdls_set_ht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\trtw_ht_use_default_setting(padapter);\n\n\trtw_restructure_ht_ie(padapter, NULL, pframe, 0, &(pattrib->pktlen), padapter->mlmeextpriv.cur_channel);\n\n\treturn pframe + pattrib->pktlen;\n}\n#endif\n\n#ifdef CONFIG_80211AC_VHT\nvoid rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 *data, u8 Length)\n{\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tu8\tcur_ldpc_cap = 0, cur_stbc_cap = 0, cur_beamform_cap = 0, rf_type = RF_1T1R;\n\tu8\t*pcap_mcs;\n\tu8\tvht_mcs[2];\n\t\n\t_rtw_memset(&ptdls_sta->vhtpriv, 0, sizeof(struct vht_priv));\n\tif (data && Length == 12) {\n\t\tptdls_sta->flags |= WLAN_STA_VHT;\n\n\t\t_rtw_memcpy(ptdls_sta->vhtpriv.vht_cap, data, 12);\n\n#if 0\n\t\tif (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) {\n\t\t\t_rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);\n\t\t} else /* for Frame without Operating Mode notify ie; default: 80M */ {\n\t\t\tpstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;\n\t\t}\n#else\n\t\tptdls_sta->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;\n#endif\n\t} else\n\t\tptdls_sta->flags &= ~WLAN_STA_VHT;\n\n\tif (ptdls_sta->flags & WLAN_STA_VHT) {\n\t\tif (padapter->registrypriv.vht_enable == _TRUE)\n\t\t\tptdls_sta->vhtpriv.vht_option = _TRUE;\n\t\telse \n\t\t\tptdls_sta->vhtpriv.vht_option = _FALSE;\n\t}\n\n\t/* B4 Rx LDPC */\n\tif (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_LDPC(data)) {\n\t\tSET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));\n\t\tDBG_871X(\"Current VHT LDPC Setting = %02X\\n\", cur_ldpc_cap);\n\t}\n\tptdls_sta->vhtpriv.ldpc_cap = cur_ldpc_cap;\n\n\t/* B5 Short GI for 80 MHz */\n\tptdls_sta->vhtpriv.sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE;\n\n\t/* B8 B9 B10 Rx STBC */\n\tif (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_STBC(data)) {\n\t\tSET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX));\t\n\t\tDBG_871X(\"Current VHT STBC Setting = %02X\\n\", cur_stbc_cap);\n\t}\n\tptdls_sta->vhtpriv.stbc_cap = cur_stbc_cap;\n\n\t/* B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee */\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && \n\t\tGET_VHT_CAPABILITY_ELE_SU_BFEE(data)) {\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE);\n\t}\n\n\t/* B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer */\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) &&\n\t\tGET_VHT_CAPABILITY_ELE_SU_BFER(data)) {\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);\n\t}\n\tptdls_sta->vhtpriv.beamform_cap = cur_beamform_cap;\n\tif (cur_beamform_cap)\n\t\tDBG_871X(\"Current VHT Beamforming Setting = %02X\\n\", cur_beamform_cap);\n\n\t/* B23 B24 B25 Maximum A-MPDU Length Exponent */\n\tptdls_sta->vhtpriv.ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(data);\n\n\tpcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(data);\n\t_rtw_memcpy(vht_mcs, pcap_mcs, 2);\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\tif ((rf_type == RF_1T1R) || (rf_type == RF_1T2R))\n\t\tvht_mcs[0] |= 0xfc;\n\telse if (rf_type == RF_2T2R)\n\t\tvht_mcs[0] |= 0xf0;\n\telse if (rf_type == RF_3T3R)\n\t\tvht_mcs[0] |= 0xc0;\n\n\t_rtw_memcpy(ptdls_sta->vhtpriv.vht_mcs_map, vht_mcs, 2);\n\n\tptdls_sta->vhtpriv.vht_highest_rate = rtw_get_vht_highest_rate(ptdls_sta->vhtpriv.vht_mcs_map);\n}\n\nu8 *rtw_tdls_set_aid(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\treturn rtw_set_ie(pframe, EID_AID, 2, (u8 *)&(padapter->mlmepriv.cur_network.aid), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_vht_cap(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu32 ie_len = 0;\n\t\n\trtw_vht_use_default_setting(padapter);\n\n\tie_len = rtw_build_vht_cap_ie(padapter, pframe);\n\tpattrib->pktlen += ie_len;\n\t\n\treturn pframe + ie_len;\n}\n\nu8 *rtw_tdls_set_vht_operation(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 channel)\n{\n\tu32 ie_len = 0;\n\n\tie_len = rtw_build_vht_operation_ie(padapter, pframe, channel);\n\tpattrib->pktlen += ie_len;\n\t\n\treturn pframe + ie_len;\n}\n\nu8 *rtw_tdls_set_vht_op_mode_notify(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib, u8 bw)\n{\n\tu32 ie_len = 0;\n\t\n\tie_len = rtw_build_vht_op_mode_notify_ie(padapter, pframe, bw);\n\tpattrib->pktlen += ie_len;\n\n\treturn pframe + ie_len;\n}\n#endif\n\n\nu8 *rtw_tdls_set_sup_ch(struct mlme_ext_priv *pmlmeext, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu8 sup_ch[30 * 2] = {0x00}, ch_set_idx = 0, sup_ch_idx = 2;\t\n\n\tdo {\n\t\tif (pmlmeext->channel_set[ch_set_idx].ChannelNum <= 14) {\n\t\t\tsup_ch[0] = 1;\t/* First channel number */\n\t\t\tsup_ch[1] = pmlmeext->channel_set[ch_set_idx].ChannelNum;\t/* Number of channel */\n\t\t} else {\n\t\t\tsup_ch[sup_ch_idx++] = pmlmeext->channel_set[ch_set_idx].ChannelNum;\n\t\t\tsup_ch[sup_ch_idx++] = 1;\n\t\t}\n\t\tch_set_idx++;\n\t} while (pmlmeext->channel_set[ch_set_idx].ChannelNum != 0 && ch_set_idx < MAX_CHANNEL_NUM);\n\n\treturn rtw_set_ie(pframe, _SUPPORTED_CH_IE_, sup_ch_idx, sup_ch, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_rsnie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib,  int init, struct sta_info *ptdls_sta)\n{\n\tu8 *p = NULL;\n\tint len = 0;\n\n\tif (ptxmgmt->len > 0)\n\t\tp = rtw_get_ie(ptxmgmt->buf, _RSN_IE_2_, &len, ptxmgmt->len);\n\n\tif (p != NULL)\n\t\treturn rtw_set_ie(pframe, _RSN_IE_2_, len, p+2, &(pattrib->pktlen));\n\telse\n\t\tif (init == _TRUE)\n\t\t\treturn rtw_set_ie(pframe, _RSN_IE_2_, sizeof(TDLS_RSNIE), TDLS_RSNIE, &(pattrib->pktlen));\n\t\telse\n\t\t\treturn rtw_set_ie(pframe, _RSN_IE_2_, sizeof(ptdls_sta->TDLS_RSNIE), ptdls_sta->TDLS_RSNIE, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_ext_cap(u8 *pframe, struct pkt_attrib *pattrib)\n{\n\treturn rtw_set_ie(pframe, _EXT_CAP_IE_ , sizeof(TDLS_EXT_CAPIE), TDLS_EXT_CAPIE, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_qos_cap(u8 *pframe, struct pkt_attrib *pattrib)\n{\n\treturn rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, sizeof(TDLS_WMMIE), TDLS_WMMIE,  &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_ftie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, u8 *ANonce, u8 *SNonce)\n{\n\tstruct wpa_tdls_ftie FTIE = {0};\n\tu8 *p = NULL;\n\tint len = 0;\n\n\tif (ptxmgmt->len > 0)\n\t\tp = rtw_get_ie(ptxmgmt->buf, _FTIE_, &len, ptxmgmt->len);\n\n\tif (p != NULL)\n\t\treturn rtw_set_ie(pframe, _FTIE_, len, p+2, &(pattrib->pktlen));\n\telse {\n\t\tif (ANonce != NULL)\n\t\t\t_rtw_memcpy(FTIE.Anonce, ANonce, WPA_NONCE_LEN);\n\t\tif (SNonce != NULL)\n\t\t\t_rtw_memcpy(FTIE.Snonce, SNonce, WPA_NONCE_LEN);\n\t\treturn rtw_set_ie(pframe, _FTIE_ , 82, (u8 *)FTIE.mic_ctrl, &(pattrib->pktlen));\n\t}\n}\n\nu8 *rtw_tdls_set_timeout_interval(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta)\n{\n\tu8 timeout_itvl[5];\t/* set timeout interval to maximum value */\n\tu32 timeout_interval= TPK_RESEND_COUNT;\n\tu8 *p = NULL;\n\tint len = 0;\n\n\tif (ptxmgmt->len > 0)\n\t\tp = rtw_get_ie(ptxmgmt->buf, _TIMEOUT_ITVL_IE_, &len, ptxmgmt->len);\n\n\tif (p != NULL)\n\t\treturn rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, len, p+2, &(pattrib->pktlen));\n\telse {\n\t\t/* Timeout interval */\n\t\ttimeout_itvl[0]=0x02;\n\t\tif (init == _TRUE)\n\t\t\t_rtw_memcpy(timeout_itvl+1, &timeout_interval, 4);\n\t\telse\n\t\t\t_rtw_memcpy(timeout_itvl+1, (u8 *)(&ptdls_sta->TDLS_PeerKey_Lifetime), 4);\n\n\t\treturn rtw_set_ie(pframe, _TIMEOUT_ITVL_IE_, 5, timeout_itvl, &(pattrib->pktlen));\n\t}\n}\n\nu8 *rtw_tdls_set_bss_coexist(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu8 iedata=0;\n\n\tif (padapter->mlmepriv.num_FortyMHzIntolerant > 0)\n\t\tiedata |= BIT(2);\t/* 20 MHz BSS Width Request */\n\n\t/* Information Bit should be set by TDLS test plan 5.9 */\n\tiedata |= BIT(0);\n\treturn rtw_set_ie(pframe, EID_BSSCoexistence, 1, &iedata, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_payload_type(u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu8 payload_type = 0x02;\n\treturn rtw_set_fixed_ie(pframe, 1, &(payload_type), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_category(u8 *pframe, struct pkt_attrib *pattrib, u8 category)\n{\n\treturn rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_action(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)\n{\n\treturn rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->action_code), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_status_code(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)\n{\n\treturn rtw_set_fixed_ie(pframe, 2, (u8 *)&(ptxmgmt->status_code), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_dialog(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)\n{\n\tu8 dialogtoken = 1;\n\tif (ptxmgmt->dialog_token)\n\t\treturn rtw_set_fixed_ie(pframe, 1, &(ptxmgmt->dialog_token), &(pattrib->pktlen));\n\telse\n\t\treturn rtw_set_fixed_ie(pframe, 1, &(dialogtoken), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_reg_class(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)\n{\n\tu8 reg_class = 1;\n\treturn rtw_set_fixed_ie(pframe, 1, &(reg_class), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_capability(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &pmlmeext->mlmext_info;\n\tu8 cap_from_ie[2] = {0};\n\n\t_rtw_memcpy(cap_from_ie, rtw_get_capability_from_ie(pmlmeinfo->network.IEs), 2);\n\n\treturn rtw_set_fixed_ie(pframe, 2, cap_from_ie, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_supported_rate(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu8 bssrate[NDIS_802_11_LENGTH_RATES_EX];\n \tint bssrate_len = 0;\n\tu8 more_supportedrates = 0;\n\n\trtw_set_supported_rate(bssrate, (padapter->registrypriv.wireless_mode == WIRELESS_MODE_MAX) ? padapter->mlmeextpriv.cur_wireless_mode : padapter->registrypriv.wireless_mode); \n\tbssrate_len = rtw_get_rateset_len(bssrate);\n\n\tif (bssrate_len > 8) {\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &(pattrib->pktlen));\n\t\tmore_supportedrates = 1;\n\t} else {\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &(pattrib->pktlen));\n\t}\n\n\t/* extended supported rates */\n\tif (more_supportedrates == 1) {\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &(pattrib->pktlen));\n\t}\n\n\treturn pframe;\n}\n\nu8 *rtw_tdls_set_sup_reg_class(u8 *pframe, struct pkt_attrib *pattrib)\n{\n\treturn rtw_set_ie(pframe, _SRC_IE_ , sizeof(TDLS_SRC), TDLS_SRC, &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_linkid(u8 *pframe, struct pkt_attrib *pattrib, u8 init)\n{\n\tu8 link_id_addr[18] = {0};\n\tif (init == _TRUE) {\n\t\t_rtw_memcpy(link_id_addr, pattrib->ra, 6);\n\t\t_rtw_memcpy((link_id_addr+6), pattrib->src, 6);\n\t\t_rtw_memcpy((link_id_addr+12), pattrib->dst, 6);\n\t} else {\n\t\t_rtw_memcpy(link_id_addr, pattrib->ra, 6);\n\t\t_rtw_memcpy((link_id_addr+6), pattrib->dst, 6);\n\t\t_rtw_memcpy((link_id_addr+12), pattrib->src, 6);\n\t}\n\treturn rtw_set_ie(pframe, _LINK_ID_IE_, 18, link_id_addr, &(pattrib->pktlen));\n}\n\n#ifdef CONFIG_TDLS_CH_SW\nu8 *rtw_tdls_set_target_ch(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tu8 target_ch = 1;\n\tif (padapter->tdlsinfo.chsw_info.off_ch_num)\n\t\treturn rtw_set_fixed_ie(pframe, 1, &(padapter->tdlsinfo.chsw_info.off_ch_num), &(pattrib->pktlen));\n\telse\n\t\treturn rtw_set_fixed_ie(pframe, 1, &(target_ch), &(pattrib->pktlen));\n}\n\nu8 *rtw_tdls_set_ch_sw(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)\n{\n\tu8 ch_switch_timing[4] = {0};\n\tu16 switch_time = (ptdls_sta->ch_switch_time >= CH_SWITCH_TIME * 1000) ? \n\t\tptdls_sta->ch_switch_time : CH_SWITCH_TIME;\n\tu16 switch_timeout = (ptdls_sta->ch_switch_timeout >= CH_SWITCH_TIMEOUT * 1000) ? \n\t\tptdls_sta->ch_switch_timeout : CH_SWITCH_TIMEOUT;\n\n\t_rtw_memcpy(ch_switch_timing, &switch_time, 2);\n\t_rtw_memcpy(ch_switch_timing + 2, &switch_timeout, 2);\n\n\treturn rtw_set_ie(pframe, _CH_SWITCH_TIMING_,  4, ch_switch_timing, &(pattrib->pktlen));\n}\n#endif\n\nu8 *rtw_tdls_set_wmm_params(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 wmm_param_ele[24] = {0};\n\n\tif (&pmlmeinfo->WMM_param) {\n\t\t_rtw_memcpy(wmm_param_ele, WMM_PARA_OUI, 6);\n\t\tif (_rtw_memcmp(&pmlmeinfo->WMM_param, &wmm_param_ele[6], 18) == _TRUE)\n\t\t\t/* Use default WMM Param */\n\t\t\t_rtw_memcpy(wmm_param_ele + 6, (u8 *)&TDLS_WMM_PARAM_IE, sizeof(TDLS_WMM_PARAM_IE));\n\t\telse\t\n\t\t\t_rtw_memcpy(wmm_param_ele + 6, (u8 *)&pmlmeinfo->WMM_param, sizeof(pmlmeinfo->WMM_param));\n\t\treturn rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_,  24, wmm_param_ele, &(pattrib->pktlen));\t\t\n\t}\n\telse\n\t\treturn pframe;\n}\n\n#ifdef CONFIG_WFD\nvoid rtw_tdls_process_wfd_ie(struct tdls_info *ptdlsinfo, u8 *ptr, u8 length)\n{\n\tu8\twfd_ie[ 128 ] = { 0x00 };\n\tu32\twfd_ielen = 0;\n\tu32\twfd_offset = 0;\n\t/* Try to get the TCP port information when receiving the negotiation response. */\n\n\twfd_offset = 0;\n\twfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen );\n\twhile (wfd_offset) {\n\t\tu8\tattr_content[ 10 ] = { 0x00 };\n\t\tu32\tattr_contentlen = 0;\n\t\tint\ti;\n\n\t\tDBG_871X( \"[%s] WFD IE Found!!\\n\", __FUNCTION__ );\n\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);\n\t\tif (attr_contentlen) {\n\t\t\tptdlsinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );\n\t\t\tDBG_871X( \"[%s] Peer PORT NUM = %d\\n\", __FUNCTION__, ptdlsinfo->wfd_info->peer_rtsp_ctrlport );\n\t\t}\n\n\t\t_rtw_memset( attr_content, 0x00, 10);\n\t\tattr_contentlen = 0;\n\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_LOCAL_IP_ADDR, attr_content, &attr_contentlen);\n\t\tif (attr_contentlen) {\n\t\t\t_rtw_memcpy(ptdlsinfo->wfd_info->peer_ip_address, ( attr_content + 1 ), 4);\n\t\t\tDBG_871X( \"[%s] Peer IP = %02u.%02u.%02u.%02u \\n\", __FUNCTION__, \n\t\t\t\tptdlsinfo->wfd_info->peer_ip_address[0], ptdlsinfo->wfd_info->peer_ip_address[1],\n\t\t\t\tptdlsinfo->wfd_info->peer_ip_address[2], ptdlsinfo->wfd_info->peer_ip_address[3]);\n\t\t}\n\t\twfd_offset = rtw_get_wfd_ie( ptr + wfd_offset, length - wfd_offset, wfd_ie, &wfd_ielen );\n\t}\n}\n\nint issue_tunneled_probe_req(_adapter *padapter)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tu8 baddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; \n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\ttxmgmt.action_code = TUNNELED_PROBE_REQ;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, baddr, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n}\n\nint issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\ttxmgmt.action_code = TUNNELED_PROBE_RSP;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, precv_frame->u.hdr.attrib.src, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n}\n#endif /* CONFIG_WFD */\n\nint issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack)\n{\n\tstruct tdls_info\t*ptdlsinfo = &padapter->tdlsinfo;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *ptdls_sta= NULL;\n\t_irqL irqL;\n\tint ret = _FAIL;\n\t/* Retry timer should be set at least 301 sec, using TPK_count counting 301 times. */\n\tu32 timeout_interval= TPK_RESEND_COUNT;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tptxmgmt->action_code = TDLS_SETUP_REQUEST;\n\tif (ptdlsinfo->ap_prohibited == _TRUE)\n\t\tgoto exit;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\n\t/* init peer sta_info */\n\tptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer);\n\tif (ptdls_sta == NULL) {\n\t\tptdls_sta = rtw_alloc_stainfo(pstapriv, ptxmgmt->peer);\n\t\tif (ptdls_sta == NULL) {\n\t\t\tDBG_871X(\"[%s] rtw_alloc_stainfo fail\\n\", __FUNCTION__);\t\n\t\t\trtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\n\t\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\t\tgoto exit;\n\t\t}\n\t}\n\t\n\tif(!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))\n\t\tptdlsinfo->sta_cnt++;\n\n\tif (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM)\n\t\tptdlsinfo->sta_maximum  = _TRUE;\n\n\tptdls_sta->tdls_sta_state |= TDLS_RESPONDER_STATE;\n\n\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE) {\n\t\tptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;\n\t\t_set_timer(&ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME);\n\t}\n\n\tpattrib->qsel = pattrib->priority;\n\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\nexit:\n\n\treturn ret;\n}\n\nint _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info\t*ptdls_sta=NULL;\n\t_irqL irqL;\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tptxmgmt->action_code = TDLS_TEARDOWN;\n\tptdls_sta = rtw_get_stainfo(pstapriv, ptxmgmt->peer);\n\tif (ptdls_sta == NULL) {\n\t\tDBG_871X(\"Np tdls_sta for tearing down\\n\");\n\t\tgoto exit;\n\t}\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\trtw_set_scan_deny(padapter, 550);\n\n\trtw_scan_abort(padapter);\n#ifdef CONFIG_CONCURRENT_MODE\t\t\n\tif (rtw_buddy_adapter_up(padapter))\t\n\t\trtw_scan_abort(padapter->pbuddy_adapter);\n#endif /* CONFIG_CONCURRENT_MODE */\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE) \n\t\tif(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)\n\t\t\tif (pattrib->encrypt) \n\t\t\t\t_cancel_timer_ex(&ptdls_sta->TPK_timer);\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\n\tif (ret == _SUCCESS && rtw_tdls_is_driver_setup(padapter))\n\t\trtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEAR_STA);\n\nexit:\n\n\treturn ret;\n}\n\nint issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack)\n{\n\tint ret = _FAIL;\n\t\n\tret = _issue_tdls_teardown(padapter, ptxmgmt, wait_ack);\n\tif ((ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) && (ret == _FAIL)) {\n\t\t/* Change status code and send teardown again via AP */\n\t\tptxmgmt->status_code = _RSON_TDLS_TEAR_TOOFAR_;\n\t\tret = _issue_tdls_teardown(padapter, ptxmgmt, wait_ack);\n\t}\n\n\treturn ret;\n}\n\nint issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tint ret = _FAIL;\n\t\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\t\n\tptxmgmt->action_code = TDLS_DISCOVERY_REQUEST;\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\tdump_mgntframe(padapter, pmgntframe);\n\tDBG_871X(\"issue tdls dis req\\n\");\n\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n}\n\nint issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tptxmgmt->action_code = TDLS_SETUP_RESPONSE;\t\t\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(&(padapter->mlmepriv)), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n\n}\n\nint issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tint ret = _FAIL;\n\t\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\t\n\tptxmgmt->action_code = TDLS_SETUP_CONFIRM;\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(&padapter->mlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\t\t\n\t}\n\n\tdump_mgntframe(padapter, pmgntframe);\n\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n\n}\n\n/* TDLS Discovery Response frame is a management action frame */\nint issue_tdls_dis_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy)\n{\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tunsigned char\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t*fctrl;\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t/* unicast probe request frame */\n\t_rtw_memcpy(pwlanhdr->addr1, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->dst, pwlanhdr->addr1, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, pwlanhdr->addr2, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, pwlanhdr->addr3, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof (struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\n\trtw_build_tdls_dis_rsp_ies(padapter, pmgntframe, pframe, ptxmgmt, privacy);\n\n\tpattrib->nr_frags = 1;\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nint issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *ptdls_sta, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tptxmgmt->action_code = TDLS_PEER_TRAFFIC_RESPONSE;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\t\n\t}\n\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\n\nexit:\n\n\treturn ret;\n}\n\nint issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *ptdls_sta)\n{\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\ttxmgmt.action_code = TDLS_PEER_TRAFFIC_INDICATION;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\t/* PTI frame's priority should be AC_VO */\n\tpattrib->priority = 7; \n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\n\t\nexit:\n\n\treturn ret;\n}\n\nint issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta)\n{\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\tDBG_871X(\"[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\ttxmgmt.action_code = TDLS_CHANNEL_SWITCH_REQUEST;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptdls_sta->hwaddr, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, &txmgmt) !=_SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tdump_mgntframe(padapter, pmgntframe);\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n}\n\nint issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack)\n{\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tint ret = _FAIL;\n\n\tDBG_871X(\"[TDLS] %s\\n\", __FUNCTION__);\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\tDBG_871X(\"[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\n\tptxmgmt->action_code = TDLS_CHANNEL_SWITCH_RESPONSE;\n\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\tgoto exit;\n\n\tpattrib = &pmgntframe->attrib;\n\n\tpmgntframe->frame_tag = DATA_FRAMETAG;\n\tpattrib->ether_type = 0x890d;\n\n\t_rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\n\tupdate_tdls_attrib(padapter, pattrib);\n\tpattrib->qsel = pattrib->priority;\n/*\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\tif(xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pmgntframe)==_TRUE){\n\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\t\treturn _FALSE;\n\t}\n*/\n\tif (rtw_xmit_tdls_coalesce(padapter, pmgntframe, ptxmgmt) !=_SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv,pmgntframe->pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pmgntframe);\n\t\tgoto exit;\n\t}\n\n\tif (wait_ack) {\n\t\tret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\n\tret = _SUCCESS;\nexit:\n\n\treturn ret;\n}\n\nint On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct sta_info *ptdls_sta = NULL, *psta = rtw_get_stainfo(&(padapter->stapriv), get_bssid(&(padapter->mlmepriv)));\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\tu8 *ptr = precv_frame->u.hdr.rx_data, *psa;\n\tstruct rx_pkt_attrib *pattrib = &(precv_frame->u.hdr.attrib);\n\tstruct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);\n\tu8 empty_addr[ETH_ALEN] = { 0x00 };\n\tint UndecoratedSmoothedPWDB;\n\tstruct tdls_txmgmt txmgmt;\t\n\tint ret = _SUCCESS;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t/* WFDTDLS: for sigma test, not to setup direct link automatically */\n\tptdlsinfo->dev_discovered = _TRUE;\n\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(&(padapter->stapriv), psa);\n\tif (ptdls_sta != NULL)\n\t\tptdls_sta->sta_stats.rx_tdls_disc_rsp_pkts++;\n\n#ifdef CONFIG_TDLS_AUTOSETUP\n\tif (ptdls_sta != NULL) {\n\t\t/* Record the tdls sta with lowest signal strength */\n\t\tif (ptdlsinfo->sta_maximum == _TRUE && ptdls_sta->alive_count >= 1 ) {\n\t\t\tif (_rtw_memcmp(ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) {\n\t\t\t\t_rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);\n\t\t\t\tptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.RxPWDBAll;\n\t\t\t} else {\n\t\t\t\tif (ptdlsinfo->ss_record.RxPWDBAll < pattrib->phy_info.RxPWDBAll) {\n\t\t\t\t\t_rtw_memcpy(ptdlsinfo->ss_record.macaddr, psa, ETH_ALEN);\n\t\t\t\t\tptdlsinfo->ss_record.RxPWDBAll = pattrib->phy_info.RxPWDBAll;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (ptdlsinfo->sta_maximum == _TRUE) {\n\t\t\tif (_rtw_memcmp( ptdlsinfo->ss_record.macaddr, empty_addr, ETH_ALEN)) {\n\t\t\t\t/* All traffics are busy, do not set up another direct link. */\n\t\t\t\tret = _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t} else {\n\t\t\t\tif (pattrib->phy_info.RxPWDBAll > ptdlsinfo->ss_record.RxPWDBAll) {\n\t\t\t\t\t_rtw_memcpy(txmgmt.peer, ptdlsinfo->ss_record.macaddr, ETH_ALEN);\n\t\t\t\t\t/* issue_tdls_teardown(padapter, ptdlsinfo->ss_record.macaddr, _FALSE); */\n\t\t\t\t} else {\n\t\t\t\t\tret = _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, &UndecoratedSmoothedPWDB);\n\n\t\tif (pattrib->phy_info.RxPWDBAll + TDLS_SIGNAL_THRESH >= UndecoratedSmoothedPWDB) {\n\t\t\tDBG_871X(\"pattrib->RxPWDBAll=%d, pdmpriv->UndecoratedSmoothedPWDB=%d\\n\", pattrib->phy_info.RxPWDBAll, UndecoratedSmoothedPWDB);\n\t\t\t_rtw_memcpy(txmgmt.peer, psa, ETH_ALEN);\n\t\t\tissue_tdls_setup_req(padapter, &txmgmt, _FALSE);\n\t\t}\n\t}\n#endif /* CONFIG_TDLS_AUTOSETUP */\n\nexit:\n\treturn ret;\n\n}\n\nsint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tu8 *psa, *pmyid;\n\tstruct sta_info *ptdls_sta= NULL;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\t_irqL irqL;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tu8 *prsnie, *ppairwise_cipher;\n\tu8 i, k;\n\tu8 ccmp_included=0, rsnie_included=0;\n\tu16 j, pairwise_count;\n\tu8 SNonce[32];\n\tu32 timeout_interval = TPK_RESEND_COUNT;\n\tsint parsing_length;\t/* Frame body length, without icv_len */\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE = 5;\n\tunsigned char\t\tsupportRate[16];\n\tint\t\t\t\tsupportRateNum = 0;\n\tstruct tdls_txmgmt txmgmt;\n\n\tif (ptdlsinfo->ap_prohibited == _TRUE)\n\t\tgoto exit;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\n\tpmyid = adapter_mac_addr(padapter);\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\tparsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\tif (ptdls_sta == NULL) {\n\t\tptdls_sta = rtw_alloc_stainfo(pstapriv, psa);\n\t} else {\n\t\tif (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {\n\t\t\t/* If the direct link is already set up */\n\t\t\t/* Process as re-setup after tear down */\n\t\t\tDBG_871X(\"re-setup a direct link\\n\");\n\t\t}\n\t\t/* Already receiving TDLS setup request */\n\t\telse if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) {\n\t\t\tDBG_871X(\"receive duplicated TDLS setup request frame in handshaking\\n\");\n\t\t\tgoto exit;\n\t\t}\n\t\t/* When receiving and sending setup_req to the same link at the same time */\n\t\t/* STA with higher MAC_addr would be initiator */\n\t\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) {\n\t\t\tDBG_871X(\"receive setup_req after sending setup_req\\n\");\n\t\t\tfor (i=0;i<6;i++){\n\t\t\t\tif(*(pmyid+i)==*(psa+i)){\n\t\t\t\t}\n\t\t\t\telse if(*(pmyid+i)>*(psa+i)){\n\t\t\t\t\tptdls_sta->tdls_sta_state = TDLS_INITIATOR_STATE;\n\t\t\t\t\tbreak;\n\t\t\t\t}else if(*(pmyid+i)<*(psa+i)){\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (ptdls_sta) {\n\t\ttxmgmt.dialog_token = *(ptr+2);\t/* Copy dialog token */\n\t\ttxmgmt.status_code = _STATS_SUCCESSFUL_;\n\n\t\t/* Parsing information element */\n\t\tfor (j=FIXED_IE; j<parsing_length;) {\n\n\t\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);\n\n\t\t\tswitch (pIE->ElementID) {\n\t\t\tcase _SUPPORTEDRATES_IE_:\n\t\t\t\t_rtw_memcpy(supportRate, pIE->data, pIE->Length);\n\t\t\t\tsupportRateNum = pIE->Length;\n\t\t\t\tbreak;\n\t\t\tcase _COUNTRY_IE_:\n\t\t\t\tbreak;\n\t\t\tcase _EXT_SUPPORTEDRATES_IE_:\n\t\t\t\tif (supportRateNum<=sizeof(supportRate)) {\n\t\t\t\t\t_rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length);\n\t\t\t\t\tsupportRateNum += pIE->Length;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase _SUPPORTED_CH_IE_:\n\t\t\t\tbreak;\n\t\t\tcase _RSN_IE_2_:\n\t\t\t\trsnie_included=1;\n\t\t\t\tif (prx_pkt_attrib->encrypt) {\n\t\t\t\t\tprsnie=(u8*)pIE;\n\t\t\t\t\t/* Check CCMP pairwise_cipher presence. */\n\t\t\t\t\tppairwise_cipher=prsnie+10;\n\t\t\t\t\t_rtw_memcpy(ptdls_sta->TDLS_RSNIE, pIE->data, pIE->Length);\n\t\t\t\t\tpairwise_count = *(u16*)(ppairwise_cipher-2);\n\t\t\t\t\tfor (k=0; k<pairwise_count; k++) {\n\t\t\t\t\t\tif (_rtw_memcmp( ppairwise_cipher+4*k, RSN_CIPHER_SUITE_CCMP, 4)==_TRUE)\n\t\t\t\t\t\t\tccmp_included=1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ccmp_included == 0)\n\t\t\t\t\t\ttxmgmt.status_code=_STATS_INVALID_RSNIE_;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase _EXT_CAP_IE_:\n\t\t\t\tbreak;\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\tbreak;\n\t\t\tcase _FTIE_:\n\t\t\t\tif (prx_pkt_attrib->encrypt)\n\t\t\t\t\t_rtw_memcpy(SNonce, (ptr+j+52), 32);\n\t\t\t\tbreak;\n\t\t\tcase _TIMEOUT_ITVL_IE_:\n\t\t\t\tif (prx_pkt_attrib->encrypt)\n\t\t\t\t\ttimeout_interval = cpu_to_le32(*(u32*)(ptr+j+3));\n\t\t\t\tbreak;\n\t\t\tcase _RIC_Descriptor_IE_:\n\t\t\t\tbreak;\n#ifdef CONFIG_80211N_HT\t\t\t\t\n\t\t\tcase _HT_CAPABILITY_IE_:\n\t\t\t\trtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\n\t\t\t\tbreak;\n#endif\t\n#ifdef CONFIG_80211AC_VHT\t\t\t\t\n\t\t\tcase EID_AID:\n\t\t\t\tbreak;\n\t\t\tcase EID_VHTCapability:\n\t\t\t\trtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\n\t\t\t\tbreak;\n#endif\n\t\t\tcase EID_BSSCoexistence:\n\t\t\t\tbreak;\n\t\t\tcase _LINK_ID_IE_:\n\t\t\t\tif (_rtw_memcmp(get_bssid(pmlmepriv), pIE->data, 6) == _FALSE)\n\t\t\t\t\ttxmgmt.status_code=_STATS_NOT_IN_SAME_BSS_;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tj += (pIE->Length + 2);\n\t\t\t\n\t\t}\n\n\t\t/* Check status code */\n\t\t/* If responder STA has/hasn't security on AP, but request hasn't/has RSNIE, it should reject */\n\t\tif (txmgmt.status_code == _STATS_SUCCESSFUL_) {\n\t\t\tif (rsnie_included && prx_pkt_attrib->encrypt == 0)\n\t\t\t\ttxmgmt.status_code = _STATS_SEC_DISABLED_;\n\t\t\telse if (rsnie_included==0 && prx_pkt_attrib->encrypt)\n\t\t\t\ttxmgmt.status_code = _STATS_INVALID_PARAMETERS_;\n\n#ifdef CONFIG_WFD\n\t\t\t/* WFD test plan version 0.18.2 test item 5.1.5 */\n\t\t\t/* SoUT does not use TDLS if AP uses weak security */\n\t\t\tif (padapter->wdinfo.wfd_tdls_enable && (rsnie_included && prx_pkt_attrib->encrypt != _AES_))\n\t\t\t\t\ttxmgmt.status_code = _STATS_SEC_DISABLED_;\n#endif /* CONFIG_WFD */\n\t\t}\n\n\t\tptdls_sta->tdls_sta_state|= TDLS_INITIATOR_STATE;\n\t\tif (prx_pkt_attrib->encrypt) {\n\t\t\t_rtw_memcpy(ptdls_sta->SNonce, SNonce, 32);\n\n\t\t\tif (timeout_interval <= 300) \n\t\t\t\tptdls_sta->TDLS_PeerKey_Lifetime = TPK_RESEND_COUNT;\n\t\t\telse\n\t\t\t\tptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;\n\t\t}\n\n\t\t/* Update station supportRate */\n\t\tptdls_sta->bssratelen = supportRateNum;\n\t\t_rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);\n\n\t\tif (!(ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE))\n\t\t\tptdlsinfo->sta_cnt++;\n\t\t/* -2: AP + BC/MC sta, -4: default key */\n\t\tif (ptdlsinfo->sta_cnt == MAX_ALLOWED_TDLS_STA_NUM)\n\t\t\tptdlsinfo->sta_maximum = _TRUE;\n\n#ifdef CONFIG_WFD\n\t\trtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);\n#endif /* CONFIG_WFD */\n\n\t}else {\n\t\tgoto exit;\n\t}\n\n\t_rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);\n\n\tif (rtw_tdls_is_driver_setup(padapter)) {\n\t\tissue_tdls_setup_rsp(padapter, &txmgmt);\n\n\t\tif (txmgmt.status_code==_STATS_SUCCESSFUL_) {\n\t\t\t_set_timer( &ptdls_sta->handshake_timer, TDLS_HANDSHAKE_TIME);\n\t\t}else {\n\t\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\t}\n\t}\n\t\t\nexit:\n\t\n\treturn _SUCCESS;\n}\n\nint On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct sta_info *ptdls_sta= NULL;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\t_irqL irqL;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tu8 *psa;\n\tu16 status_code=0;\n\tsint parsing_length;\t/* Frame body length, without icv_len */\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE =7;\n\tu8 ANonce[32];\n\tu8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL;\n\tu16 pairwise_count, j, k;\n\tu8 verify_ccmp=0;\n\tunsigned char\t\tsupportRate[16];\n\tint\t\t\t\tsupportRateNum = 0;\n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _SUCCESS;\n\tu32 timeout_interval = TPK_RESEND_COUNT;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\n\tif (NULL == ptdls_sta) {\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\tparsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\t_rtw_memcpy(&status_code, ptr+2, 2);\n\t\n\tif (status_code != 0) {\n\t\tDBG_871X( \"[TDLS] %s status_code = %d, free_tdls_sta\\n\", __FUNCTION__, status_code );\n\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tstatus_code = 0;\n\n\t/* parsing information element */\n\tfor (j = FIXED_IE; j<parsing_length;) {\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);\n\n\t\tswitch (pIE->ElementID) {\n\t\tcase _SUPPORTEDRATES_IE_:\n\t\t\t_rtw_memcpy(supportRate, pIE->data, pIE->Length);\n\t\t\tsupportRateNum = pIE->Length;\n\t\t\tbreak;\n\t\tcase _COUNTRY_IE_:\n\t\t\tbreak;\n\t\tcase _EXT_SUPPORTEDRATES_IE_:\n\t\t\tif (supportRateNum<=sizeof(supportRate)) {\n\t\t\t\t_rtw_memcpy(supportRate+supportRateNum, pIE->data, pIE->Length);\n\t\t\t\tsupportRateNum += pIE->Length;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase _SUPPORTED_CH_IE_:\n\t\t\tbreak;\n\t\tcase _RSN_IE_2_:\n\t\t\tprsnie=(u8*)pIE;\n\t\t\t/* Check CCMP pairwise_cipher presence. */\n\t\t\tppairwise_cipher=prsnie+10;\n\t\t\t_rtw_memcpy(&pairwise_count, (u16*)(ppairwise_cipher-2), 2);\n\t\t\tfor (k=0;k<pairwise_count;k++) {\n\t\t\t\tif (_rtw_memcmp( ppairwise_cipher+4*k, RSN_CIPHER_SUITE_CCMP, 4) == _TRUE)\n\t\t\t\t\tverify_ccmp=1;\n\t\t\t}\n\t\tcase _EXT_CAP_IE_:\n\t\t\tbreak;\n\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\tif (_rtw_memcmp((u8 *)pIE + 2, WMM_INFO_OUI, 6) == _TRUE) {\t\n\t\t\t\t/* WMM Info ID and OUI */\n\t\t\t\tif ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))\n\t\t\t\t\tptdls_sta->qos_option = _TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase _FTIE_:\n\t\t\tpftie=(u8*)pIE;\n\t\t\t_rtw_memcpy(ANonce, (ptr+j+20), 32);\n\t\t\tbreak;\n\t\tcase _TIMEOUT_ITVL_IE_:\n\t\t\tptimeout_ie=(u8*)pIE;\n\t\t\ttimeout_interval = cpu_to_le32(*(u32*)(ptimeout_ie+3));\n\t\t\tbreak;\n\t\tcase _RIC_Descriptor_IE_:\n\t\t\tbreak;\n#ifdef CONFIG_80211N_HT\t\t\t\n\t\tcase _HT_CAPABILITY_IE_:\n\t\t\trtw_tdls_process_ht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\n\t\t\tbreak;\n#endif\t\t\t\n#ifdef CONFIG_80211AC_VHT\n\t\tcase EID_AID:\n\t\t\t/* todo in the future if necessary */\n\t\t\tbreak;\n\t\tcase EID_VHTCapability:\n\t\t\trtw_tdls_process_vht_cap(padapter, ptdls_sta, pIE->data, pIE->Length);\n\t\t\tbreak;\n\t\tcase EID_OpModeNotification:\n\t\t\trtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta);\n\t\t\tbreak;\t\n#endif\n\t\tcase EID_BSSCoexistence:\n\t\t\tbreak;\n\t\tcase _LINK_ID_IE_:\n\t\t\tplinkid_ie=(u8*)pIE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tj += (pIE->Length + 2);\n\n\t}\n\n\tptdls_sta->bssratelen = supportRateNum;\n\t_rtw_memcpy(ptdls_sta->bssrateset, supportRate, supportRateNum);\n\t_rtw_memcpy(ptdls_sta->ANonce, ANonce, 32);\n\n#ifdef CONFIG_WFD\n\trtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);\n#endif /* CONFIG_WFD */\n\n\tif (status_code != _STATS_SUCCESSFUL_) {\n\t\ttxmgmt.status_code = status_code;\n\t} else {\n\t\tif (prx_pkt_attrib->encrypt) {\n\t\t\tif (verify_ccmp == 1) {\n\t\t\t\ttxmgmt.status_code = _STATS_SUCCESSFUL_;\n\t\t\t\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE) {\n\t\t\t\t\twpa_tdls_generate_tpk(padapter, ptdls_sta);\n\t\t\t\t\tif (tdls_verify_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL) {\n\t\t\t\t\t\tDBG_871X( \"[TDLS] %s tdls_verify_mic fail, free_tdls_sta\\n\", __FUNCTION__);\n\t\t\t\t\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\t\t\t\t\tret = _FAIL;\n\t\t\t\t\t\tgoto exit;\n\t\t\t\t\t}\n\t\t\t\t\tptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ttxmgmt.status_code = _STATS_INVALID_RSNIE_;\n\t\t\t}\n\n\t\t}else{\n\t\t\ttxmgmt.status_code = _STATS_SUCCESSFUL_;\n\t\t}\n\t}\n\n\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE) {\n\t\t_rtw_memcpy(txmgmt.peer, prx_pkt_attrib->src, ETH_ALEN);\n\t\tissue_tdls_setup_cfm(padapter, &txmgmt);\n\n\t\tif (txmgmt.status_code == _STATS_SUCCESSFUL_) {\n\t\t\tptdlsinfo->link_established = _TRUE;\n\n\t\t\tif (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE) {\n\t\t\t\tptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;\n\t\t\t\tptdls_sta->state |= _FW_LINKED;\n\t\t\t\t_cancel_timer_ex( &ptdls_sta->handshake_timer);\n\t\t\t}\n\n\t\t\tif (prx_pkt_attrib->encrypt)\n\t\t\t\trtw_tdls_set_key(padapter, ptdls_sta);\n\n\t\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED);\n\n\t\t}\n\t}\n\nexit:\n\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE)\n\t\treturn ret;\n\telse\n\t\treturn _SUCCESS;\n\n}\n\nint On_TDLS_Setup_Cfm(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct sta_info *ptdls_sta= NULL;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\t_irqL irqL;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tu8 *psa; \n\tu16 status_code=0;\n\tsint parsing_length;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE =5;\n\tu8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL, *ppairwise_cipher=NULL;\n\tu16 j, pairwise_count;\n\tint ret = _SUCCESS;\n\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\n\tif (ptdls_sta == NULL) {\n\t\tDBG_871X(\"[%s] Direct Link Peer = \"MAC_FMT\" not found\\n\", __FUNCTION__, MAC_ARG(psa));\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\tparsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\t_rtw_memcpy(&status_code, ptr+2, 2);\n\n\tif (status_code!= 0) {\n\t\tDBG_871X(\"[%s] status_code = %d\\n, free_tdls_sta\", __FUNCTION__, status_code);\n\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t/* Parsing information element */\n\tfor (j = FIXED_IE; j < parsing_length;) {\n\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr + j);\n\n\t\tswitch (pIE->ElementID) {\n\t\t\tcase _RSN_IE_2_:\n\t\t\t\tprsnie = (u8 *)pIE;\n\t\t\t\tbreak;\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\tif (_rtw_memcmp((u8 *)pIE + 2, WMM_PARA_OUI, 6) == _TRUE) {\t\n\t\t\t\t\t/* WMM Parameter ID and OUI */\n\t\t\t\t\tptdls_sta->qos_option = _TRUE;\n\t\t\t\t}\n\t\t\t\tbreak;\t\t\t\t\n\t\t\tcase _FTIE_:\n\t\t\t\tpftie = (u8 *)pIE;\n\t\t\t\tbreak;\n\t\t\tcase _TIMEOUT_ITVL_IE_:\n\t\t\t\tptimeout_ie = (u8 *)pIE;\n\t\t\t\tbreak;\n#ifdef CONFIG_80211N_HT\t\t\t\t\n\t\t\tcase _HT_EXTRA_INFO_IE_:\n\t\t\t\tbreak;\n#endif\n#ifdef CONFIG_80211AC_VHT\n\t\t\tcase EID_VHTOperation:\n\t\t\t\tbreak;\n\t\t\tcase EID_OpModeNotification:\n\t\t\t\trtw_process_vht_op_mode_notify(padapter, pIE->data, ptdls_sta);\n\t\t\t\tbreak;\t\n#endif\n\t\t\tcase _LINK_ID_IE_:\n\t\t\t\tplinkid_ie = (u8 *)pIE;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tj += (pIE->Length + 2);\n\t\t\n\t}\n\n\tif (prx_pkt_attrib->encrypt) {\n\t\t/* Verify mic in FTIE MIC field */\n\t\tif (rtw_tdls_is_driver_setup(padapter) &&\n\t\t\t(tdls_verify_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie) == _FAIL)) {\n\t\t\tfree_tdls_sta(padapter, ptdls_sta);\n\t\t\tret = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tif (rtw_tdls_is_driver_setup(padapter)) {\n\t\tptdlsinfo->link_established = _TRUE;\n\n\t\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE) {\n\t\t\tptdls_sta->tdls_sta_state|=TDLS_LINKED_STATE;\n\t\t\tptdls_sta->state |= _FW_LINKED;\n\t\t\t_cancel_timer_ex(&ptdls_sta->handshake_timer);\n\t\t}\n\n\t\tif (prx_pkt_attrib->encrypt) {\n\t\t\trtw_tdls_set_key(padapter, ptdls_sta);\n\n\t\t\t/* Start  TPK timer */\n\t\t\tptdls_sta->TPK_count = 0;\n\t\t\t_set_timer(&ptdls_sta->TPK_timer, ONE_SEC);\n\t\t}\n\n\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ESTABLISHED);\n\t}\n\nexit:\n\treturn ret;\n\n}\n\nint On_TDLS_Dis_Req(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta_ap;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tsint parsing_length;\t/* Frame body length, without icv_len */\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE = 3, *dst;\n\tu16 j;\n\tstruct tdls_txmgmt txmgmt;\n\tint ret = _SUCCESS;\n\n\tif (rtw_tdls_is_driver_setup(padapter) == _FALSE)\n\t\tgoto exit;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\ttxmgmt.dialog_token = *(ptr+2);\n\t_rtw_memcpy(&txmgmt.peer, precv_frame->u.hdr.attrib.src, ETH_ALEN);\n\ttxmgmt.action_code = TDLS_DISCOVERY_RESPONSE;\n\tparsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\t/* Parsing information element */\n\tfor (j=FIXED_IE; j<parsing_length;) {\n\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);\n\n\t\tswitch (pIE->ElementID) {\n\t\tcase _LINK_ID_IE_:\n\t\t\tpsta_ap = rtw_get_stainfo(pstapriv, pIE->data);\n\t\t\tif (psta_ap == NULL)\n\t\t\t\tgoto exit;\n\t\t\tdst = pIE->data + 12;\n\t\t\tif (MacAddr_isBcst(dst) == _FALSE && (_rtw_memcmp(adapter_mac_addr(padapter), dst, 6) == _FALSE))\n\t\t\t\tgoto exit;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tj += (pIE->Length + 2);\n\t\t\n\t}\n\n\tissue_tdls_dis_rsp(padapter, &txmgmt, prx_pkt_attrib->privacy);\n\t\t\nexit:\n\treturn ret;\n\t\n}\n\nint On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tu8 *psa;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_priv \t*pstapriv = &padapter->stapriv;\n\tstruct sta_info *ptdls_sta= NULL;\n\t_irqL irqL;\n\tu8 reason;\n\n\treason = *(ptr + prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE + ETH_TYPE_LEN + PAYLOAD_TYPE_LEN + 2);\n\tDBG_871X(\"[TDLS] %s Reason code(%d)\\n\", __FUNCTION__,reason);\n\n\tpsa = get_sa(ptr);\n\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\tif (ptdls_sta != NULL) {\n\t\tif (rtw_tdls_is_driver_setup(padapter))\n\t\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA);\n\t}\n\n\treturn _SUCCESS;\n\t\n}\n\n#if 0\nu8 TDLS_check_ch_state(uint state){\n\tif (state & TDLS_CH_SWITCH_ON_STATE &&\n\t\tstate & TDLS_PEER_AT_OFF_STATE) {\n\t\tif (state & TDLS_PEER_SLEEP_STATE)\n\t\t\treturn 2;\t/* U-APSD + ch. switch */\n\t\telse\n\t\t\treturn 1;\t/* ch. switch */\n\t}else\n\t\treturn 0;\n}\n#endif\n\nint On_TDLS_Peer_Traffic_Indication(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct rx_pkt_attrib\t*pattrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->src);\t\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct tdls_txmgmt txmgmt;\n\n\tptr +=pattrib->hdrlen + pattrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\n\tif (ptdls_sta != NULL) {\n\t\ttxmgmt.dialog_token = *(ptr+2);\n\t\tissue_tdls_peer_traffic_rsp(padapter, ptdls_sta, &txmgmt);\n\t\t//issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 0, 0);\n\t} else {\n\t\tDBG_871X(\"from unknown sta:\"MAC_FMT\"\\n\", MAC_ARG(pattrib->src));\n\t\treturn _FAIL;\n\t}\n\n\treturn _SUCCESS;\n}\n\n/* We process buffered data for 1. U-APSD, 2. ch. switch, 3. U-APSD + ch. switch here */\nint On_TDLS_Peer_Traffic_Rsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct rx_pkt_attrib\t*pattrib = & precv_frame->u.hdr.attrib;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->src);\n\tu8 wmmps_ac=0;\n\t/* u8 state=TDLS_check_ch_state(ptdls_sta->tdls_sta_state); */\n\tint i;\n\t\n\tptdls_sta->sta_stats.rx_data_pkts++;\n\n\tptdls_sta->tdls_sta_state &= ~(TDLS_WAIT_PTR_STATE);\n\n\t/* Check 4-AC queue bit */\n\tif (ptdls_sta->uapsd_vo || ptdls_sta->uapsd_vi || ptdls_sta->uapsd_be || ptdls_sta->uapsd_bk)\n\t\twmmps_ac=1;\n\n\t/* If it's a direct link and have buffered frame */\n\tif (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {\n\t\tif (wmmps_ac) {\n\t\t\t_irqL irqL;\t \n\t\t\t_list\t*xmitframe_plist, *xmitframe_phead;\n\t\t\tstruct xmit_frame *pxmitframe=NULL;\n\t\t\n\t\t\t_enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);\t\n\n\t\t\txmitframe_phead = get_list_head(&ptdls_sta->sleep_q);\n\t\t\txmitframe_plist = get_next(xmitframe_phead);\n\n\t\t\t/* transmit buffered frames */\n\t\t\twhile (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) {\n\t\t\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\t\t\t\txmitframe_plist = get_next(xmitframe_plist);\n\t\t\t\trtw_list_delete(&pxmitframe->list);\n\n\t\t\t\tptdls_sta->sleepq_len--;\n\t\t\t\tptdls_sta->sleepq_ac_len--;\n\t\t\t\tif (ptdls_sta->sleepq_len>0) {\n\t\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\t\t\tpxmitframe->attrib.eosp = 0;\n\t\t\t\t} else {\n\t\t\t\t\tpxmitframe->attrib.mdata = 0;\n\t\t\t\t\tpxmitframe->attrib.eosp = 1;\n\t\t\t\t}\n\t\t\t\tpxmitframe->attrib.triggered = 1;\n\n\t\t\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\t\t\t}\n\n\t\t\tif (ptdls_sta->sleepq_len==0)\n\t\t\t\tDBG_871X(\"no buffered packets for tdls to xmit\\n\");\n\t\t\telse {\n\t\t\t\tDBG_871X(\"error!psta->sleepq_len=%d\\n\", ptdls_sta->sleepq_len);\n\t\t\t\tptdls_sta->sleepq_len=0;\n\t\t\t}\n\n\t\t\t_exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);\t\t\t\n\t\t\n\t\t}\n\n\t}\n\n\treturn _SUCCESS;\n}\n\n#ifdef CONFIG_TDLS_CH_SW\nsint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\tstruct sta_info *ptdls_sta= NULL;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tu8 *psa; \n\tsint parsing_length;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE = 4;\n\tu16 j;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct tdls_txmgmt txmgmt;\n\tu16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000;\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\tDBG_871X(\"[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\\n\", __FUNCTION__);\n\t\treturn _SUCCESS;\n\t}\n\t\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\n\tptdls_sta->ch_switch_time=switch_time;\n\tptdls_sta->ch_switch_timeout=switch_timeout;\n\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len+LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\tparsing_length= ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\tpchsw_info->off_ch_num = *(ptr + 2);\n\n\tif (*(ptr + 2) == 2) {\n\t\tpchsw_info->off_ch_num = 11;\n\t}\n\n\tif (pchsw_info->off_ch_num != pmlmeext->cur_channel) {\n\t\tpchsw_info->delay_switch_back = _FALSE;\n\t}\n\n\t/* Parsing information element */\n\tfor (j=FIXED_IE; j<parsing_length;) {\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);\n\n\t\tswitch (pIE->ElementID) {\n\t\tcase EID_SecondaryChnlOffset:\n\t\t\tpadapter->tdlsinfo.chsw_info.ch_offset = *(pIE->data);\n\t\t\tbreak;\n\t\tcase _LINK_ID_IE_:\n\t\t\tbreak;\n\t\tcase _CH_SWITCH_TIMING_:\n\t\t\tptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= CH_SWITCH_TIME * 1000) ?\n\t\t\t\tRTW_GET_LE16(pIE->data) : CH_SWITCH_TIME * 1000;\n\t\t\tptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= CH_SWITCH_TIMEOUT * 1000) ?\n\t\t\t\tRTW_GET_LE16(pIE->data + 2) : CH_SWITCH_TIMEOUT * 1000;\n\t\t\tDBG_871X(\"%s ch_switch_time:%d, ch_switch_timeout:%d\\n\"\n\t\t\t\t, __FUNCTION__, RTW_GET_LE16(pIE->data), RTW_GET_LE16(pIE->data + 2));\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tj += (pIE->Length + 2);\n\t}\n\n\t/* Todo: check status */\n\ttxmgmt.status_code = 0;\n\t_rtw_memcpy(txmgmt.peer, psa, ETH_ALEN);\n\t\n\tATOMIC_SET(&pchsw_info->chsw_on, _TRUE);\n\n\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_RESP);\n\n\treturn _SUCCESS;\n}\n\nsint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\tstruct sta_info *ptdls_sta= NULL;\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tu8 *ptr = precv_frame->u.hdr.rx_data;\n\tstruct rx_pkt_attrib\t*prx_pkt_attrib = &precv_frame->u.hdr.attrib;\n\tu8 *psa; \n\tsint parsing_length;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 FIXED_IE = 4;\n\tu16 status_code, j, switch_time, switch_timeout;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tint ret = _SUCCESS;\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\tDBG_871X(\"[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\\n\", __FUNCTION__);\n\t\treturn _SUCCESS;\n\t}\n\n\tpsa = get_sa(ptr);\n\tptdls_sta = rtw_get_stainfo(pstapriv, psa);\n\n\t/* If we receive Unsolicited TDLS Channel Switch Response when channel switch is running, */\n\t/* we will go back to base channel and terminate this channel switch procedure */\n\tif (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) {\n\t\tif (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) {\n\t\t\tDBG_871X(\"receive unsolicited channel switch response \\n\");\n\t\t\trtw_tdls_cmd(padapter, NULL, TDLS_CH_SW_BACK);\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tptr +=prx_pkt_attrib->hdrlen + prx_pkt_attrib->iv_len + LLC_HEADER_SIZE+ETH_TYPE_LEN+PAYLOAD_TYPE_LEN;\n\tparsing_length = ((union recv_frame *)precv_frame)->u.hdr.len\n\t\t\t-prx_pkt_attrib->hdrlen\n\t\t\t-prx_pkt_attrib->iv_len\n\t\t\t-prx_pkt_attrib->icv_len\n\t\t\t-LLC_HEADER_SIZE\n\t\t\t-ETH_TYPE_LEN\n\t\t\t-PAYLOAD_TYPE_LEN\n\t\t\t-FIXED_IE;\n\n\t_rtw_memcpy(&status_code, ptr+2, 2);\n\n\tif (status_code != 0) {\n\t\tDBG_871X(\"[%s] status_code:%d\\n\", __FUNCTION__, status_code);\n\t\tpchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE);\n\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\t\n\t/* Parsing information element */\n\tfor (j = FIXED_IE; j < parsing_length;) {\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(ptr+ j);\n\n\t\tswitch (pIE->ElementID) {\n\t\tcase _LINK_ID_IE_:\n\t\t\tbreak;\n\t\tcase _CH_SWITCH_TIMING_:\n\t\t\t_rtw_memcpy(&switch_time, pIE->data, 2);\n\t\t\tif (switch_time > ptdls_sta->ch_switch_time)\n\t\t\t\t_rtw_memcpy(&ptdls_sta->ch_switch_time, &switch_time, 2);\n\n\t\t\t_rtw_memcpy(&switch_timeout, pIE->data + 2, 2);\n\t\t\tif (switch_timeout > ptdls_sta->ch_switch_timeout)\n\t\t\t\t_rtw_memcpy(&ptdls_sta->ch_switch_timeout, &switch_timeout, 2);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tj += (pIE->Length + 2);\n\t}\n\n\tif ((pmlmeext->cur_channel == rtw_get_oper_ch(padapter)) &&\n\t\t(pchsw_info->ch_sw_state & TDLS_WAIT_CH_RSP_STATE)) {\n\t\tATOMIC_SET(&pchsw_info->chsw_on, _TRUE);\n\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW);\n\t}\n\nexit:\n\treturn ret;\n}\n#endif /* CONFIG_TDLS_CH_SW */\n\n#ifdef CONFIG_WFD\nvoid wfd_ie_tdls(_adapter * padapter, u8 *pframe, u32 *pktlen )\n{\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wifi_display_info\t*pwfd_info = padapter->tdlsinfo.wfd_info;\n\tu8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };\n\tu32 wfdielen = 0;\n\n\t/* WFD OUI */\n\twfdielen = 0;\n\twfdie[ wfdielen++ ] = 0x50;\n\twfdie[ wfdielen++ ] = 0x6F;\n\twfdie[ wfdielen++ ] = 0x9A;\n\twfdie[ wfdielen++ ] = 0x0A;\t/* WFA WFD v1.0 */\n\n\t/*\n\t *\tCommented by Albert 20110825\n\t *\tAccording to the WFD Specification, the negotiation request frame should contain 3 WFD attributes\n\t *\t1. WFD Device Information\n\t *\t2. Associated BSSID ( Optional )\n\t *\t3. Local IP Adress ( Optional )\n\t */\n\n\t/* WFD Device Information ATTR */\n\t/* Type: */\n\twfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;\n\n\t/* Length: */\n\t/* Note: In the WFD specification, the size of length field is 2. */\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t/* Value1: */\n\t/* WFD device information */\n\t/* available for WFD session + Preferred TDLS + WSD ( WFD Service Discovery ) */\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL \n\t\t\t\t\t\t\t\t| WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_WSD);\n\twfdielen += 2;\n\n\t/* Value2: */\n\t/* Session Management Control Port */\n\t/* Default TCP port for RTSP messages is 554 */\n\tRTW_PUT_BE16(wfdie + wfdielen, pwfd_info->rtsp_ctrlport );\n\twfdielen += 2;\n\n\t/* Value3: */\n\t/* WFD Device Maximum Throughput */\n\t/* 300Mbps is the maximum throughput */\n\tRTW_PUT_BE16(wfdie + wfdielen, 300);\n\twfdielen += 2;\n\n\t/* Associated BSSID ATTR */\n\t/* Type: */\n\twfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;\n\n\t/* Length: */\n\t/* Note: In the WFD specification, the size of length field is 2. */\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0006);\n\twfdielen += 2;\n\n\t/* Value: */\n\t/* Associated BSSID */\n\tif (check_fwstate( pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t_rtw_memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);\n\telse\n\t\t_rtw_memset(wfdie + wfdielen, 0x00, ETH_ALEN);\n\n\t/* Local IP Address ATTR */\n\twfdie[ wfdielen++ ] = WFD_ATTR_LOCAL_IP_ADDR;\n\n\t/* Length: */\n\t/* Note: In the WFD specification, the size of length field is 2. */\n\tRTW_PUT_BE16(wfdie + wfdielen, 0x0005);\n\twfdielen += 2;\n\n\t/* Version: */\n\t/* 0x01: Version1;IPv4 */\n\twfdie[ wfdielen++ ] = 0x01;\t\n\n\t/* IPv4 Address */\n\t_rtw_memcpy( wfdie + wfdielen, pwfd_info->ip_address, 4 );\n\twfdielen += 4;\n\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wfdielen, (unsigned char *) wfdie, pktlen);\n\t\n}\n#endif /* CONFIG_WFD */\n\nvoid rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst);\n\n \tint i = 0 ;\n\tu32 time;\n\tu8 *pframe_head;\n\n\t/* SNonce */\n\tif (pattrib->encrypt) {\n\t\tfor (i=0;i<8;i++) {\n\t\t\ttime=rtw_get_current_time();\n\t\t\t_rtw_memcpy(&ptdls_sta->SNonce[4*i], (u8 *)&time, 4);\n\t\t}\n\t}\n\n\tpframe_head = pframe;\t/* For rtw_tdls_set_ht_cap() */\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\n\tpframe = rtw_tdls_set_capability(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_sup_ch(&(padapter->mlmeextpriv), pframe, pattrib);\n\tpframe = rtw_tdls_set_sup_reg_class(pframe, pattrib);\n\n\tif (pattrib->encrypt)\n\t\tpframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib,  _TRUE, ptdls_sta);\n\n\tpframe = rtw_tdls_set_ext_cap(pframe, pattrib);\n\n\tif (pattrib->encrypt) {\n\t\tpframe = rtw_tdls_set_ftie(ptxmgmt\n\t\t\t\t\t\t\t\t\t, pframe\n\t\t\t\t\t\t\t\t\t, pattrib\n\t\t\t\t\t\t\t\t\t, NULL\n\t\t\t\t\t\t\t\t\t, ptdls_sta->SNonce);\n\n\t\tpframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);\n\t}\n\n#ifdef CONFIG_80211N_HT\n\t/* Sup_reg_classes(optional) */\n\tif (pregistrypriv->ht_enable == _TRUE)\n\t\tpframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);\n#endif\n\n\tpframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);\n\n\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\tif ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))\n\t\tpframe = rtw_tdls_set_qos_cap(pframe, pattrib);\n\n#ifdef CONFIG_80211AC_VHT\n\tif ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) {\n\t\tpframe = rtw_tdls_set_aid(padapter, pframe, pattrib);\n\t\tpframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);\n\t}\n#endif\n\n#ifdef CONFIG_WFD\n\twfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) );\n#endif /* CONFIG_WFD */\n\n}\n\nvoid rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta;\n\tu8 k; /* for random ANonce */\n\tu8  *pftie=NULL, *ptimeout_ie = NULL, *plinkid_ie = NULL, *prsnie = NULL, *pftie_mic = NULL;\n\tu32 time;\n\tu8 *pframe_head;\n\n\tptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);\n\n\tif (ptdls_sta == NULL)\n\t\tDBG_871X(\"[%s] %d ptdls_sta is NULL\\n\", __FUNCTION__, __LINE__);\n\n\tif (pattrib->encrypt && ptdls_sta != NULL) {\n\t\tfor (k=0;k<8;k++) {\n\t\t\ttime = rtw_get_current_time();\n\t\t\t_rtw_memcpy(&ptdls_sta->ANonce[4*k], (u8*)&time, 4);\n\t\t}\n\t}\n\n\tpframe_head = pframe;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);\n\n\tif (ptxmgmt->status_code != 0) {\n\t\tDBG_871X(\"[%s] status_code:%04x \\n\", __FUNCTION__, ptxmgmt->status_code);\n\t\treturn;\n\t}\n\t\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_capability(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_sup_ch(&(padapter->mlmeextpriv), pframe, pattrib);\n\tpframe = rtw_tdls_set_sup_reg_class(pframe, pattrib);\n\n\tif (pattrib->encrypt) {\n\t\tprsnie = pframe;\n\t\tpframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib,  _FALSE, ptdls_sta);\n\t}\n\n\tpframe = rtw_tdls_set_ext_cap(pframe, pattrib);\n\n\tif (pattrib->encrypt) {\n\t\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE)\n\t\t\twpa_tdls_generate_tpk(padapter, ptdls_sta);\n\n\t\tpftie = pframe;\n\t\tpftie_mic = pframe+4;\n\t\tpframe = rtw_tdls_set_ftie(ptxmgmt\n\t\t\t\t\t\t\t\t\t, pframe\n\t\t\t\t\t\t\t\t\t, pattrib\n\t\t\t\t\t\t\t\t\t, ptdls_sta->ANonce\n\t\t\t\t\t\t\t\t\t, ptdls_sta->SNonce);\n\n\t\tptimeout_ie = pframe;\n\t\tpframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _FALSE, ptdls_sta);\n\t}\n\n#ifdef CONFIG_80211N_HT\n\t/* Sup_reg_classes(optional) */\n\tif (pregistrypriv->ht_enable == _TRUE)\n\t\tpframe = rtw_tdls_set_ht_cap(padapter, pframe_head, pattrib);\n#endif\n\n\tpframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);\n\n\tplinkid_ie = pframe;\n\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\n\t/* Fill FTIE mic */\n\tif (pattrib->encrypt && rtw_tdls_is_driver_setup(padapter) == _TRUE)\n\t\twpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 2, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);\n\n\tif ((pregistrypriv->wmm_enable == _TRUE) || (padapter->mlmepriv.htpriv.ht_option == _TRUE))\n\t\tpframe = rtw_tdls_set_qos_cap(pframe, pattrib);\n\n#ifdef CONFIG_80211AC_VHT\n\tif ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) {\n\t\tpframe = rtw_tdls_set_aid(padapter, pframe, pattrib);\n\t\tpframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);\n\t\tpframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);\n\t}\n#endif\n\n#ifdef CONFIG_WFD\n\twfd_ie_tdls( padapter, pframe, &(pattrib->pktlen) );\n#endif /* CONFIG_WFD */\n\n}\n\nvoid rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta=rtw_get_stainfo( (&padapter->stapriv) , pattrib->dst);\n\n\tunsigned int ie_len;\n\tunsigned char *p;\n\tu8 wmm_param_ele[24] = {0};\n\tu8  *pftie=NULL, *ptimeout_ie=NULL, *plinkid_ie=NULL, *prsnie=NULL, *pftie_mic=NULL;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\n\tif (ptxmgmt->status_code!=0)\n\t\treturn;\n\t\n\tif (pattrib->encrypt) {\n\t\tprsnie = pframe;\n\t\tpframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);\n\t}\n\t\n\tif (pattrib->encrypt) {\n\t\tpftie = pframe;\n\t\tpftie_mic = pframe+4;\n\t\tpframe = rtw_tdls_set_ftie(ptxmgmt\n\t\t\t\t\t\t\t\t\t, pframe\n\t\t\t\t\t\t\t\t\t, pattrib\n\t\t\t\t\t\t\t\t\t, ptdls_sta->ANonce\n\t\t\t\t\t\t\t\t\t, ptdls_sta->SNonce);\n\n\t\tptimeout_ie = pframe;\n\t\tpframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib, _TRUE, ptdls_sta);\n\n\t\tif (rtw_tdls_is_driver_setup(padapter) == _TRUE) {\n\t\t\t/* Start TPK timer */\n\t\t\tptdls_sta->TPK_count=0;\n\t\t\t_set_timer(&ptdls_sta->TPK_timer, ONE_SEC);\n\t\t}\n\t}\n\n\t/* HT operation; todo */\n\t\n\tplinkid_ie = pframe;\n\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\tif (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE))\n\t\twpa_tdls_ftie_mic(ptdls_sta->tpk.kck, 3, plinkid_ie, prsnie, ptimeout_ie, pftie, pftie_mic);\n\n\tif (ptdls_sta->qos_option == _TRUE)\n\t\tpframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib);\n\n#ifdef CONFIG_80211AC_VHT\n\tif ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) \n\t\t&& (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14)) {\n\t\tpframe = rtw_tdls_set_vht_operation(padapter, pframe, pattrib, pmlmeext->cur_channel);\n\t\tpframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);\n\t}\n#endif\n}\n\nvoid rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo( &(padapter->stapriv) , pattrib->dst);\n\tu8  *pftie = NULL, *pftie_mic = NULL, *plinkid_ie = NULL;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);\n\n\tif (pattrib->encrypt) {\n\t\tpftie = pframe;\n\t\tpftie_mic = pframe + 4;\n\t\tpframe = rtw_tdls_set_ftie(ptxmgmt\n\t\t\t\t\t\t\t\t\t, pframe\n\t\t\t\t\t\t\t\t\t, pattrib\n\t\t\t\t\t\t\t\t\t, ptdls_sta->ANonce\n\t\t\t\t\t\t\t\t\t, ptdls_sta->SNonce);\n\t}\n\n\tplinkid_ie = pframe;\n\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\tif (pattrib->encrypt && (rtw_tdls_is_driver_setup(padapter) == _TRUE))\n\t\twpa_tdls_teardown_ftie_mic(ptdls_sta->tpk.kck, plinkid_ie, ptxmgmt->status_code, 1, 4, pftie, pftie_mic);\n}\n\nvoid rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n}\n\nvoid rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tu8 *pframe_head, pktlen_index;\n\n\tpktlen_index = pattrib->pktlen;\n\tpframe_head = pframe;\n\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_PUBLIC);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_capability(padapter, pframe, pattrib);\n\n\tpframe = rtw_tdls_set_supported_rate(padapter, pframe, pattrib);\n\n\tpframe = rtw_tdls_set_sup_ch(pmlmeext, pframe, pattrib);\n\n\tif (privacy)\n\t\tpframe = rtw_tdls_set_rsnie(ptxmgmt, pframe, pattrib, _TRUE, NULL);\n\n\tpframe = rtw_tdls_set_ext_cap(pframe, pattrib);\n\n\tif (privacy) {\n\t\tpframe = rtw_tdls_set_ftie(ptxmgmt, pframe, pattrib, NULL, NULL);\n\t\tpframe = rtw_tdls_set_timeout_interval(ptxmgmt, pframe, pattrib,  _TRUE, NULL);\n\t}\n\n#ifdef CONFIG_80211N_HT\n\tif (pregistrypriv->ht_enable == _TRUE)\n\t\tpframe = rtw_tdls_set_ht_cap(padapter, pframe_head - pktlen_index, pattrib);\n#endif\n\n\tpframe = rtw_tdls_set_bss_coexist(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\n}\n\n\nvoid rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tu8 AC_queue=0;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\n\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\t/* PTI control */\n\t/* PU buffer status */\n\tif (ptdls_sta->uapsd_bk & BIT(1))\n\t\tAC_queue=BIT(0);\n\tif (ptdls_sta->uapsd_be & BIT(1))\n\t\tAC_queue=BIT(1);\n\tif (ptdls_sta->uapsd_vi & BIT(1))\n\t\tAC_queue=BIT(2);\n\tif (ptdls_sta->uapsd_vo & BIT(1))\n\t\tAC_queue=BIT(3);\n\tpframe = rtw_set_ie(pframe, _PTI_BUFFER_STATUS_, 1, &AC_queue, &(pattrib->pktlen));\n\t\n}\n\nvoid rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_dialog(pframe, pattrib, ptxmgmt);\n\n\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n}\n\n#ifdef CONFIG_TDLS_CH_SW\nvoid rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_priv \t*pstapriv = &padapter->stapriv;\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);\n\tu16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000;\n\n\tptdls_sta->ch_switch_time=switch_time;\n\tptdls_sta->ch_switch_timeout=switch_timeout;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_target_ch(padapter, pframe, pattrib);\n\tpframe = rtw_tdls_set_reg_class(pframe, pattrib, ptdls_sta);\n\n\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\tpframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta);\n\n}\n\nvoid rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_priv \t*pstapriv = &padapter->stapriv;\t\n\tstruct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_tdls_set_category(pframe, pattrib, RTW_WLAN_CATEGORY_TDLS);\n\tpframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);\n\tpframe = rtw_tdls_set_status_code(pframe, pattrib, ptxmgmt);\n\n\tif (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);\n\telse if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)\n\t\tpframe = rtw_tdls_set_linkid(pframe, pattrib, _TRUE);\n\n\tpframe = rtw_tdls_set_ch_sw(pframe, pattrib, ptdls_sta);\n}\n#endif\n\n#ifdef CONFIG_WFD\nvoid rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\tstruct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo;\n\tu8 category = RTW_WLAN_CATEGORY_P2P;\n\tu8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};\n\tu8 probe_req = 4;\n\tu8 wfdielen = 0;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(probe_req), &(pattrib->pktlen));\n\n\tif (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {\n\t\twfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t} else if (!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) {\n\t\twfdielen = build_probe_req_wfd_ie(pbuddy_wdinfo, pframe);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n\t\n}\n\nvoid rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe)\n{\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\tstruct wifidirect_info *pbuddy_wdinfo = &padapter->pbuddy_adapter->wdinfo;\n\tu8 category = RTW_WLAN_CATEGORY_P2P;\n\tu8 WFA_OUI[3] = { 0x50, 0x6f, 0x9a};\n\tu8 probe_rsp = 5;\n\tu8 wfdielen = 0;\n\n\tpframe = rtw_tdls_set_payload_type(pframe, pattrib);\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 3, WFA_OUI, &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(probe_rsp), &(pattrib->pktlen));\n\n\tif (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {\n\t\twfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 1);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t} else if (!rtw_p2p_chk_state(pbuddy_wdinfo, P2P_STATE_NONE)) {\n\t\twfdielen = build_probe_resp_wfd_ie(pbuddy_wdinfo, pframe, 1);\n\t\tpframe += wfdielen;\n\t\tpattrib->pktlen += wfdielen;\n\t}\n\n}\n#endif /* CONFIG_WFD */\n\nvoid _tdls_tpk_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\n\tstruct tdls_txmgmt txmgmt;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tptdls_sta->TPK_count++;\n\t/* TPK_timer expired in a second */\n\t/* Retry timer should set at least 301 sec. */\n\tif (ptdls_sta->TPK_count >= ptdls_sta->TDLS_PeerKey_Lifetime) {\n\t\tDBG_871X(\"[TDLS] %s, Re-Setup TDLS link with \"MAC_FMT\" since TPK lifetime expires!\\n\", __FUNCTION__, MAC_ARG(ptdls_sta->hwaddr));\n\t\tptdls_sta->TPK_count=0;\n\t\t_rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\n\t\tissue_tdls_setup_req(ptdls_sta->padapter, &txmgmt, _FALSE);\n\t}\n\n\t_set_timer(&ptdls_sta->TPK_timer, ONE_SEC);\n}\n\n#ifdef CONFIG_TDLS_CH_SW\nvoid _tdls_ch_switch_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\n\t_adapter *padapter = ptdls_sta->padapter;\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\n\t//DBG_871X(\"%s %d, tdls_sta_state:0x%08x\\n\", __FUNCTION__, __LINE__, ptdls_sta->tdls_sta_state);\n\n\tif (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) {\n\t\tif (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) {\n\t\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_BACK);\n\t\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\t\tDBG_871X(\"[TDLS] %s, can't get traffic from op_ch:%d\\n\", __FUNCTION__, rtw_get_oper_ch(padapter));\n\t\t} else {\n\t\t\t//DBG_871X(\"%s %d\\n\", __FUNCTION__, __LINE__);\n\t\t\t//_set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000);\n\t\t}\n\t} else {\n\t\t//DBG_871X(\"%s %d, op_ch:%d, tdls_state:0x%08x\\n\", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);\n\t}\n\n#if 0\n\tif (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) {\n\t\t//SelectChannel(padapter, padapter->mlmeextpriv.cur_channel);\n\t\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t\tDBG_871X(\"%s %d, op_ch:%d, tdls_state:0x%08x\\n\", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);\n\t}\n\n\tif (pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) {\n\t\tif (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) {\n\t\t\tDBG_871X(\"%s %d\\n\", __FUNCTION__, __LINE__);\n\t\t\t_set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000);\n\t\t\t//_set_timer(&ptdls_sta->delay_timer, 1000);\n\t\t} else {\n\t\t\tDBG_871X(\"%s %d\\n\", __FUNCTION__, __LINE__);\n\t\t\tissue_tdls_ch_switch_req(padapter, ptdls_sta);\n\t\t\t//_set_timer(&ptdls_sta->delay_timer, 500);\n\t\t}\n\t}\n#endif\n}\n\nvoid _tdls_delay_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\n\t_adapter *padapter = ptdls_sta->padapter;\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\n\tDBG_871X(\"[TDLS] %s, op_ch:%d, tdls_state:0x%08x\\n\", __FUNCTION__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);\n\tpchsw_info->delay_switch_back = _TRUE;\n}\n#endif\n\nvoid _tdls_handshake_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\n\t_adapter *padapter = ptdls_sta->padapter;\n\tstruct tdls_txmgmt txmgmt;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t_rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\n\ttxmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;\n\n\tif (ptdls_sta != NULL) {\n\t\tDBG_871X(\"[TDLS] Handshake time out\\n\");\n\t\tif (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) \n\t\t{\n\t\t\tissue_tdls_teardown(padapter, &txmgmt, _TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA);\n\t\t}\n\t}\n}\n\nvoid _tdls_pti_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;\n\t_adapter *padapter = ptdls_sta->padapter;\n\tstruct tdls_txmgmt txmgmt;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t_rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);\n\ttxmgmt.status_code = _RSON_TDLS_TEAR_TOOFAR_;\n\n\tif (ptdls_sta != NULL) {\n\t\tif (ptdls_sta->tdls_sta_state & TDLS_WAIT_PTR_STATE) {\n\t\t\tDBG_871X(\"[TDLS] Doesn't receive PTR from peer dev:\"MAC_FMT\"; \"\n\t\t\t\t\"Send TDLS Tear Down\\n\", MAC_ARG(ptdls_sta->hwaddr));\n\t\t\tissue_tdls_teardown(padapter, &txmgmt, _FALSE);\n\t\t}\n\t}\n}\n\nvoid rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta)\n{\n\tpsta->padapter=padapter;\n\t_init_timer(&psta->TPK_timer, padapter->pnetdev, _tdls_tpk_timer_hdl, psta);\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_init_timer(&psta->ch_sw_timer, padapter->pnetdev, _tdls_ch_switch_timer_hdl, psta);\n\t_init_timer(&psta->delay_timer, padapter->pnetdev, _tdls_delay_timer_hdl, psta);\n#endif\n\t_init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta);\n\t_init_timer(&psta->pti_timer, padapter->pnetdev, _tdls_pti_timer_hdl, psta);\n}\n\nvoid rtw_free_tdls_timer(struct sta_info *psta)\n{\n\t_cancel_timer_ex(&psta->TPK_timer);\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_cancel_timer_ex(&psta->ch_sw_timer);\n\t_cancel_timer_ex(&psta->delay_timer);\n#endif\n\t_cancel_timer_ex(&psta->handshake_timer);\n\t_cancel_timer_ex(&psta->pti_timer);\n}\n\nu8\tupdate_sgi_tdls(_adapter *padapter, struct sta_info *psta)\n{\n\treturn query_ra_short_GI(psta);\n}\n\nu32 update_mask_tdls(_adapter *padapter, struct sta_info *psta)\n{\n\tunsigned char sta_band = 0;\n\tunsigned int tx_ra_bitmap=0;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;\n\n\trtw_hal_update_sta_rate_mask(padapter, psta);\n\ttx_ra_bitmap = psta->ra_mask;\n\n\tif (pcur_network->Configuration.DSConfig > 14) {\n\t\tif (tx_ra_bitmap & 0xffff000)\n\t\t\tsta_band |= WIRELESS_11_5N | WIRELESS_11A;\n\t\telse\n\t\t\tsta_band |= WIRELESS_11A;\n\t} else {\n\t\tif (tx_ra_bitmap & 0xffff000)\n\t\t\tsta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B;\n\t\telse if (tx_ra_bitmap & 0xff0)\n\t\t\tsta_band |= WIRELESS_11G |WIRELESS_11B;\n\t\telse\n\t\t\tsta_band |= WIRELESS_11B;\n\t}\n\n\tpsta->wireless_mode = sta_band;\n\n\tpsta->raid = rtw_hal_networktype_to_raid(padapter,psta);\n\ttx_ra_bitmap |= ((psta->raid<<28)&0xf0000000);\n\treturn tx_ra_bitmap;\n}\n\nint rtw_tdls_is_driver_setup(_adapter *padapter)\n{\n\treturn padapter->tdlsinfo.driver_setup;\n}\n\nconst char * rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action)\n{\n\tswitch (action) {\n\tcase TDLS_SETUP_REQUEST:\n\t\treturn \"TDLS_SETUP_REQUEST\";\n\tcase TDLS_SETUP_RESPONSE:\n\t\treturn \"TDLS_SETUP_RESPONSE\";\n\tcase TDLS_SETUP_CONFIRM:\n\t\treturn \"TDLS_SETUP_CONFIRM\";\n\tcase TDLS_TEARDOWN:\n\t\treturn \"TDLS_TEARDOWN\";\n\tcase TDLS_PEER_TRAFFIC_INDICATION:\n\t\treturn \"TDLS_PEER_TRAFFIC_INDICATION\";\n\tcase TDLS_CHANNEL_SWITCH_REQUEST:\n\t\treturn \"TDLS_CHANNEL_SWITCH_REQUEST\";\n\tcase TDLS_CHANNEL_SWITCH_RESPONSE:\n\t\treturn \"TDLS_CHANNEL_SWITCH_RESPONSE\";\n\tcase TDLS_PEER_PSM_REQUEST:\n\t\treturn \"TDLS_PEER_PSM_REQUEST\";\n\tcase TDLS_PEER_PSM_RESPONSE:\n\t\treturn \"TDLS_PEER_PSM_RESPONSE\";\n\tcase TDLS_PEER_TRAFFIC_RESPONSE:\n\t\treturn \"TDLS_PEER_TRAFFIC_RESPONSE\";\n\tcase TDLS_DISCOVERY_REQUEST:\n\t\treturn \"TDLS_DISCOVERY_REQUEST\";\n\tcase TDLS_DISCOVERY_RESPONSE:\n\t\treturn \"TDLS_DISCOVERY_RESPONSE\";\n\tdefault:\n\t\treturn \"UNKNOWN\";\n\t}\n}\n\n#endif /* CONFIG_TDLS */\n"
  },
  {
    "path": "core/rtw_vht.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_VHT_C\n\n#include <drv_types.h>\n\n#ifdef CONFIG_80211AC_VHT\n// \t\t\t\t20/40/80,\tShortGI,\tMCS Rate \nconst u16 VHT_MCS_DATA_RATE[3][2][30] = \n\t{\t{\t{13, 26, 39, 52, 78, 104, 117, 130, 156, 156,\n\t\t\t 26, 52, 78, 104, 156, 208, 234, 260, 312, 312,\n\t\t\t 39, 78, 117, 156, 234, 312, 351, 390, 468, 520},\t\t\t// Long GI, 20MHz\n\t\t\t{14, 29, 43, 58, 87, 116, 130, 144, 173, 173,\n\t\t\t29, 58, 87, 116, 173, 231, 260, 289, 347, 347,\n\t\t\t43,\t87, 130, 173, 260, 347,390,\t433,\t520, 578}\t},\t\t// Short GI, 20MHz\n\t\t{\t{27, 54, 81, 108, 162, 216, 243, 270, 324, 360, \n\t\t\t54, 108, 162, 216, 324, 432, 486, 540, 648, 720,\n\t\t\t81, 162, 243, 324, 486, 648, 729, 810, 972, 1080}, \t\t// Long GI, 40MHz\n\t\t\t{30, 60, 90, 120, 180, 240, 270, 300,360, 400, \n\t\t\t60, 120, 180, 240, 360, 480, 540, 600, 720, 800,\n\t\t\t90, 180, 270, 360, 540, 720, 810, 900, 1080, 1200}},\t\t// Short GI, 40MHz\n\t\t{\t{59, 117,  176, 234, 351, 468, 527, 585, 702, 780,\n\t\t\t117, 234, 351, 468, 702, 936, 1053, 1170, 1404, 1560,\n\t\t\t176, 351, 527, 702, 1053, 1404, 1580, 1755, 2106, 2340},\t/* Long GI, 80MHz */\n\t\t\t{65, 130, 195, 260, 390, 520, 585, 650, 780, 867, \n\t\t\t130, 260, 390, 520, 780, 1040, 1170, 1300, 1560,1734,\n\t\t\t195, 390, 585, 780, 1170, 1560, 1755, 1950, 2340, 2600}\t}\t/* Short GI, 80MHz */\n\t};\n\nu8\trtw_get_vht_highest_rate(u8 *pvht_mcs_map)\n{\n\tu8\ti, j;\n\tu8\tbit_map;\n\tu8\tvht_mcs_rate = 0;\n\t\n\tfor(i = 0; i < 2; i++)\n\t{\n\t\tif(pvht_mcs_map[i] != 0xff)\n\t\t{\n\t\t\tfor(j = 0; j < 8; j += 2)\n\t\t\t{\n\t\t\t\tbit_map = (pvht_mcs_map[i] >> j) & 3;\n\t\t\t\t\n\t\t\t\tif(bit_map != 3)\n\t\t\t\t\tvht_mcs_rate = MGN_VHT1SS_MCS7 + 10*j/2 + i*40 + bit_map;  //VHT rate indications begin from 0x90\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* DBG_871X(\"HighestVHTMCSRate is %x\\n\", vht_mcs_rate); */\n\treturn vht_mcs_rate;\n}\n\nu8\trtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map)\n{\n\tu8\ti, j;\n\tu8\tbit_map;\n\tu8\tnss = 0;\n\t\n\tfor(i = 0; i < 2; i++)\n\t{\n\t\tif(pvht_mcs_map[i] != 0xff)\n\t\t{\n\t\t\tfor(j = 0; j < 8; j += 2)\n\t\t\t{\n\t\t\t\tbit_map = (pvht_mcs_map[i] >> j) & 3;\n\t\t\t\t\n\t\t\t\tif(bit_map != 3)\n\t\t\t\t\tnss++;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/* DBG_871X(\"%s : %dSS\\n\", __FUNCTION__, nss); */\n\treturn nss;\n}\n\nvoid\trtw_vht_nss_to_mcsmap(u8 nss, u8 *target_mcs_map, u8 *cur_mcs_map)\n{\n\tu8\ti, j;\n\tu8\tcur_rate, target_rate;\n\t\n\tfor(i = 0; i < 2; i++)\n\t{\n\t\ttarget_mcs_map[i] = 0;\n\t\tfor(j = 0; j < 8; j+=2)\n\t\t{\n\t\t\tcur_rate = (cur_mcs_map[i] >> j) & 3;\n\t\t\tif(cur_rate == 3)  //0x3 indicates not supported that num of SS\n\t\t\t\ttarget_rate = 3;\n\t\t\telse if(nss <= ((j/2)+i*4))\n\t\t\t\ttarget_rate = 3;\n\t\t\telse\t\n\t\t\t\ttarget_rate = cur_rate;\n\n\t\t\ttarget_mcs_map[i] |= (target_rate << j);\n\t\t}\n\t}\n\t\n\t//DBG_871X(\"%s : %dSS\\n\", __FUNCTION__, nss);\n}\n\nu16\trtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate)\n{\n\tif(vht_mcs_rate > MGN_VHT3SS_MCS9)\n\t\tvht_mcs_rate = MGN_VHT3SS_MCS9;\n\t/* DBG_871X(\"bw=%d, short_GI=%d, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)=%d\\n\", bw, short_GI, ((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)); */\n\treturn VHT_MCS_DATA_RATE[bw][short_GI][((vht_mcs_rate - MGN_VHT1SS_MCS0)&0x3f)];\n}\n\nvoid\trtw_vht_use_default_setting(_adapter *padapter)\n{\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tBOOLEAN\t\tbHwLDPCSupport = _FALSE, bHwSTBCSupport = _FALSE;\n\tBOOLEAN\t\tbHwSupportBeamformer = _FALSE, bHwSupportBeamformee = _FALSE;\n\tu8\trf_type = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tpvhtpriv->sgi_80m = TEST_FLAG(pregistrypriv->short_gi, BIT2) ? _TRUE : _FALSE;\n\n\t// LDPC support\n\trtw_hal_get_def_var(padapter, HAL_DEF_RX_LDPC, (u8 *)&bHwLDPCSupport);\n\tCLEAR_FLAGS(pvhtpriv->ldpc_cap);\n\tif(bHwLDPCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->ldpc_cap, BIT0))\n\t\t\tSET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX);\n\t}\n\trtw_hal_get_def_var(padapter, HAL_DEF_TX_LDPC, (u8 *)&bHwLDPCSupport);\n\tif(bHwLDPCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->ldpc_cap, BIT1))\n\t\t\tSET_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX);\n\t}\n\tif (pvhtpriv->ldpc_cap)\n\t\tDBG_871X(\"[VHT] Support LDPC = 0x%02X\\n\", pvhtpriv->ldpc_cap);\n\n\t// STBC\n\trtw_hal_get_def_var(padapter, HAL_DEF_TX_STBC, (u8 *)&bHwSTBCSupport);\n\tCLEAR_FLAGS(pvhtpriv->stbc_cap);\n\tif(bHwSTBCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->stbc_cap, BIT1))\n\t\t\tSET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX);\n\t}\n\trtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)&bHwSTBCSupport);\n\tif(bHwSTBCSupport)\n\t{\n\t\tif(TEST_FLAG(pregistrypriv->stbc_cap, BIT0))\n\t\t\tSET_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX);\n\t}\n\tif (pvhtpriv->stbc_cap)\n\t\tDBG_871X(\"[VHT] Support STBC = 0x%02X\\n\", pvhtpriv->stbc_cap);\n\n\t// Beamforming setting\n\trtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMER, (u8 *)&bHwSupportBeamformer);\n\trtw_hal_get_def_var(padapter, HAL_DEF_EXPLICIT_BEAMFORMEE, (u8 *)&bHwSupportBeamformee);\n\tCLEAR_FLAGS(pvhtpriv->beamform_cap);\n\tif (TEST_FLAG(pregistrypriv->beamform_cap, BIT0) && bHwSupportBeamformer) {\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {\n\t\t\t\tSET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);\n\t\t\t\tDBG_871X(\"[VHT] CONCURRENT AP Support Beamformer\\n\");\n\t\t\t} else\n\t\t\tDBG_871X(\"[VHT] CONCURRENT not AP ;not allow  Support Beamformer\\n\");\n\t\t#else\n\t\t\tSET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);\n\t\t\tDBG_871X(\"[VHT] Support Beamformer\\n\");\n\t\t#endif\n\t}\n\tif(TEST_FLAG(pregistrypriv->beamform_cap, BIT1) && bHwSupportBeamformee)\n\t{\n\t\tSET_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE);\n\t\tDBG_871X(\"[VHT] Support Beamformee\\n\");\n\t}\n\n\tpvhtpriv->ampdu_len = pregistrypriv->ampdu_factor;\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\tif (rf_type == RF_3T3R)\n\t\tpvhtpriv->vht_mcs_map[0] = 0xea;\t/* support 1SS MCS 0~9 2SS MCS 0~9 3SS MCS 0~9 */\n\telse if(rf_type == RF_2T2R)\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfa;\t/* support 1SS MCS 0~9 2SS MCS 0~9 */\n\telse\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfe;\t/* Only support 1SS MCS 0~9; */\n\tpvhtpriv->vht_mcs_map[1] = 0xff;\n\n\tif(pregistrypriv->vht_rate_sel == 1)\n\t{\t\t\t\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfc;\t// support 1SS MCS 0~7\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 2)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfd;\t// Support 1SS MCS 0~8\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 3)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfe;\t// Support 1SS MCS 0~9\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 4)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xf0;\t// support 1SS MCS 0~7 2SS MCS 0~7\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 5)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xf5;\t// support 1SS MCS 0~8 2SS MCS 0~8\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 6)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xfa;\t// support 1SS MCS 0~9 2SS MCS 0~9\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 7)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xf8;\t// support 1SS MCS 0-7 2SS MCS 0~9\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 8)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xf9;\t// support 1SS MCS 0-8 2SS MCS 0~9\n\t}\n\telse if(pregistrypriv->vht_rate_sel == 9)\n\t{\n\t\tpvhtpriv->vht_mcs_map[0] = 0xf4;\t// support 1SS MCS 0-7 2SS MCS 0~8\n\t}\n\n\tpvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);\n}\n\nu64\trtw_vht_rate_to_bitmap(u8 *pVHTRate)\n{\n\n\tu8\ti,j , tmpRate;\n\tu64\tRateBitmap = 0;\n\tu8 Bits_3ss = 6;\n\t\t\n\tfor(i = j= 0; i < Bits_3ss; i+=2, j+=10)\n\t{\n\t\t/* every two bits means single sptial stream */\n\t\ttmpRate = (pVHTRate[0] >> i) & 3;\n\n\t\tswitch(tmpRate){\n\t\tcase 2:\n\t\t\tRateBitmap = RateBitmap | (0x03ff << j);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tRateBitmap = RateBitmap | (0x01ff << j);\n\t\tbreak;\n\n\t\tcase 0:\n\t\t\tRateBitmap = RateBitmap | (0x00ff << j);\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\tDBG_871X(\"RateBitmap=%016llx , pVHTRate[0]=%02x, pVHTRate[1]=%02x\\n\", RateBitmap, pVHTRate[0], pVHTRate[1]);\n\treturn RateBitmap;\n}\n\nvoid\tupdate_sta_vht_info_apmode(_adapter *padapter, PVOID sta)\n{\n\tstruct sta_info\t*psta = (struct sta_info *)sta;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct vht_priv\t*pvhtpriv_ap = &pmlmepriv->vhtpriv;\n\tstruct vht_priv\t*pvhtpriv_sta = &psta->vhtpriv;\n\tstruct ht_priv\t\t*phtpriv_sta = &psta->htpriv;\n\tu8\tcur_ldpc_cap = 0, cur_stbc_cap = 0, bw_mode = 0;\n\tu16\tcur_beamform_cap = 0;\n\tu8\t*pcap_mcs;\n\n\tif (pvhtpriv_sta->vht_option == _FALSE) {\n\t\treturn;\n\t}\n\n\tbw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify);\n\t\n\t//if (bw_mode > psta->bw_mode)\n\tpsta->bw_mode = bw_mode;\n\n\t// B4 Rx LDPC\n\tif (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_LDPC(pvhtpriv_sta->vht_cap))\n\t{\n\t\tSET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));\n\t\tDBG_871X(\"Current STA(%d) VHT LDPC = %02X\\n\", psta->aid, cur_ldpc_cap);\n\t}\n\tpvhtpriv_sta->ldpc_cap = cur_ldpc_cap;\n\n\tif (psta->bw_mode > pmlmeext->cur_bwmode)\n\t\tpsta->bw_mode = pmlmeext->cur_bwmode;\n\n\tif (psta->bw_mode == CHANNEL_WIDTH_80) {\n\t\t// B5 Short GI for 80 MHz\n\t\tpvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE;\n\t\t//DBG_871X(\"Current STA ShortGI80MHz = %d\\n\", pvhtpriv_sta->sgi_80m);\n\t} else if (psta->bw_mode >= CHANNEL_WIDTH_160) {\n\t\t// B5 Short GI for 80 MHz\n\t\tpvhtpriv_sta->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI160M(pvhtpriv_sta->vht_cap) & pvhtpriv_ap->sgi_80m) ? _TRUE : _FALSE;\n\t\t//DBG_871X(\"Current STA ShortGI160MHz = %d\\n\", pvhtpriv_sta->sgi_80m);\n\t}\n\n\t// B8 B9 B10 Rx STBC\n\tif (TEST_FLAG(pvhtpriv_ap->stbc_cap, STBC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_STBC(pvhtpriv_sta->vht_cap))\n\t{\n\t\tSET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX));\t\n\t\tDBG_871X(\"Current STA(%d) VHT STBC = %02X\\n\", psta->aid, cur_stbc_cap);\n\t}\n\tpvhtpriv_sta->stbc_cap = cur_stbc_cap;\n\n\t// B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee\n\tif (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && \n\t\tGET_VHT_CAPABILITY_ELE_SU_BFEE(pvhtpriv_sta->vht_cap))\n\t{\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE);\n\t\t/*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/\n\t\tSET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pvhtpriv_sta->vht_cap)<<8);\n\t}\n\n\t// B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer\n\tif (TEST_FLAG(pvhtpriv_ap->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) &&\n\t\tGET_VHT_CAPABILITY_ELE_SU_BFER(pvhtpriv_sta->vht_cap))\n\t{\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);\n\t\t/*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/\n\t\tSET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pvhtpriv_sta->vht_cap)<<12);\n\t}\n\tpvhtpriv_sta->beamform_cap = cur_beamform_cap;\n\tif (cur_beamform_cap) {\n\t\tDBG_871X(\"Current STA(%d) VHT Beamforming Setting = %02X\\n\", psta->aid, cur_beamform_cap);\n\t}\n\n\t// B23 B24 B25 Maximum A-MPDU Length Exponent\n\tpvhtpriv_sta->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pvhtpriv_sta->vht_cap);\n\n\tpcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pvhtpriv_sta->vht_cap);\n\t_rtw_memcpy(pvhtpriv_sta->vht_mcs_map, pcap_mcs, 2);\n\n\tpvhtpriv_sta->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv_sta->vht_mcs_map);\n\n}\n\nvoid\tupdate_hw_vht_param(_adapter *padapter)\n{\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tht_AMPDU_len;\n\n\tht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;\n\n\tif(pvhtpriv->ampdu_len > ht_AMPDU_len)\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len));\n}\n\nvoid VHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tcur_ldpc_cap = 0, cur_stbc_cap = 0, rf_type = RF_1T1R;\n\tu16\tcur_beamform_cap = 0;\n\tu8\t*pcap_mcs;\n\tu8\tvht_mcs[2];\n\n\tif(pIE==NULL) return;\n\n\tif(pvhtpriv->vht_option == _FALSE)\treturn;\n\n\tpmlmeinfo->VHT_enable = 1;\n\n\t// B4 Rx LDPC\n\tif (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_LDPC(pIE->data))\n\t{\n\t\tSET_FLAG(cur_ldpc_cap, (LDPC_VHT_ENABLE_TX | LDPC_VHT_CAP_TX));\n\t\tDBG_871X(\"Current VHT LDPC Setting = %02X\\n\", cur_ldpc_cap);\n\t}\n\tpvhtpriv->ldpc_cap = cur_ldpc_cap;\n\n\t// B5 Short GI for 80 MHz\n\tpvhtpriv->sgi_80m = (GET_VHT_CAPABILITY_ELE_SHORT_GI80M(pIE->data) & pvhtpriv->sgi_80m) ? _TRUE : _FALSE;\n\t//DBG_871X(\"Current ShortGI80MHz = %d\\n\", pvhtpriv->sgi_80m);\n\n\t// B8 B9 B10 Rx STBC\n\tif (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX) && \n\t\tGET_VHT_CAPABILITY_ELE_RX_STBC(pIE->data))\n\t{\n\t\tSET_FLAG(cur_stbc_cap, (STBC_VHT_ENABLE_TX | STBC_VHT_CAP_TX));\t\n\t\tDBG_871X(\"Current VHT STBC Setting = %02X\\n\", cur_stbc_cap);\n\t}\n\tpvhtpriv->stbc_cap = cur_stbc_cap;\n\n\t// B11 SU Beamformer Capable, the target supports Beamformer and we are Beamformee\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE) && \n\t\tGET_VHT_CAPABILITY_ELE_SU_BFEE(pIE->data))\n\t{\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE);\n\t\t/*Shift to BEAMFORMING_VHT_BEAMFORMER_STS_CAP*/\n\t\tSET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(pIE->data)<<8);\n\t}\n\n\t// B12 SU Beamformee Capable, the target supports Beamformee and we are Beamformer\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) &&\n\t\tGET_VHT_CAPABILITY_ELE_SU_BFER(pIE->data))\n\t{\n\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE);\n\t\t/*Shit to BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM*/\n\t\tSET_FLAG(cur_beamform_cap, GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(pIE->data)<<12);\n\t\t\n\t}\n\tpvhtpriv->beamform_cap = cur_beamform_cap;\n\tif (cur_beamform_cap) {\n\t\tDBG_871X(\"Current VHT Beamforming Setting = %02X\\n\", cur_beamform_cap);\n\t}\n\n\t// B23 B24 B25 Maximum A-MPDU Length Exponent\n\tpvhtpriv->ampdu_len = GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pIE->data);\n\n\tpcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pIE->data);\n\t_rtw_memcpy(vht_mcs, pcap_mcs, 2);\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\tif ((rf_type == RF_1T1R) || (rf_type == RF_1T2R))\n\t\tvht_mcs[0] |= 0xfc;\n\telse if (rf_type == RF_2T2R)\n\t\tvht_mcs[0] |= 0xf0;\n\telse if (rf_type == RF_3T3R)\n\t\tvht_mcs[0] |= 0xc0;\n\n\t_rtw_memcpy(pvhtpriv->vht_mcs_map, vht_mcs, 2);\n\n\tpvhtpriv->vht_highest_rate = rtw_get_vht_highest_rate(pvhtpriv->vht_mcs_map);\n}\n\nvoid VHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\n\tif(pIE==NULL) return;\n\n\tif(pvhtpriv->vht_option == _FALSE)\treturn;\n}\n\nvoid rtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta)\n{\n\tstruct sta_info\t\t*psta = (struct sta_info *)sta;\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct registry_priv *regsty = adapter_to_regsty(padapter);\n\tu8\ttarget_bw;\n\tu8\ttarget_rxss, current_rxss;\n\tu8\tupdate_ra = _FALSE;\n\tu8\tvht_mcs_map[2] = {};\n\n\tif(pvhtpriv->vht_option == _FALSE)\n\t\treturn;\n\n\ttarget_bw = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(pframe);\n\ttarget_rxss = (GET_VHT_OPERATING_MODE_FIELD_RX_NSS(pframe)+1);\n\n\tif (target_bw != psta->bw_mode) {\n\t\tif (hal_is_bw_support(padapter, target_bw)\n\t\t\t&& REGSTY_IS_BW_5G_SUPPORT(regsty, target_bw)\n\t\t) {\n\t\t\tupdate_ra = _TRUE;\n\t\t\tpsta->bw_mode = target_bw;\n\t\t}\n\t}\n\n\tcurrent_rxss = rtw_vht_mcsmap_to_nss(psta->vhtpriv.vht_mcs_map);\n\tif (target_rxss != current_rxss) {\n\t\tupdate_ra = _TRUE;\n\n\t\trtw_vht_nss_to_mcsmap(target_rxss, vht_mcs_map, psta->vhtpriv.vht_mcs_map);\n\t\t_rtw_memcpy(psta->vhtpriv.vht_mcs_map, vht_mcs_map, 2);\n\t\t\n\t\trtw_hal_update_sta_rate_mask(padapter, psta);\n\t}\n\n\tif (update_ra) {\n\t\trtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta);\n\t}\n}\n\nu32\trtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel)\n{\n\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\t//struct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tu8\tChnlWidth, center_freq, bw_mode, rf_type = 0;\n\tu32\tlen = 0;\n\tu8\toperation[5];\n\t\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\t\n\t_rtw_memset(operation, 0, 5);\n\n\tbw_mode = REGSTY_BW_5G(pregistrypriv); /* TODO: control op bw with other info */\n\n\tif (hal_chk_bw_cap(padapter, BW_CAP_80M | BW_CAP_160M)\n\t\t&& REGSTY_BW_5G(pregistrypriv) >= CHANNEL_WIDTH_80\n\t) {\n\t\tcenter_freq = rtw_get_center_ch(channel, bw_mode, HAL_PRIME_CHNL_OFFSET_LOWER);\n\t\tChnlWidth = 1;\n\t} else {\n\t\tcenter_freq = 0;\n\t\tChnlWidth = 0;\n\t}\n\n\t\n\tSET_VHT_OPERATION_ELE_CHL_WIDTH(operation, ChnlWidth);\n\t//center frequency\n\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(operation, center_freq);//Todo: need to set correct center channel\n\tSET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(operation,0);\n\t\n\tif (padapter->registrypriv.rf_config != RF_MAX_TYPE)\n\t\trf_type = padapter->registrypriv.rf_config;\n\t\n\tswitch (rf_type) {\n\tcase RF_1T1R:\n\toperation[3] = 0xfe;\n\toperation[4] = 0xff;\n\tbreak;\n\tcase RF_1T2R:\n\tcase RF_2T2R:\n\tcase RF_2T2R_GREEN:\n\toperation[3] = 0xfa;\n\toperation[4] = 0xff;\n\tbreak;\n\tcase RF_2T3R:\n\tcase RF_2T4R:\n\tcase RF_3T3R:\n\tcase RF_3T4R:\n\toperation[3] = 0xea;\n\toperation[4] = 0xff;\n\tbreak;\n\tcase RF_4T4R:\n\toperation[3] = 0xaa;\n\toperation[4] = 0xff;\n\tbreak;\n\tdefault:\n\tDBG_871X(\"%s, %d, unknown rf type\\n\", __func__, __LINE__);\n\t}\n\n\trtw_set_ie(pbuf, EID_VHTOperation, 5, operation, &len);\n\n\treturn len;\n}\n\nu32\trtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw)\n{\n\t//struct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tu32\tlen = 0;\n\tu8\topmode = 0, rf_type = 0;\n\tu8\tchnl_width, rx_nss;\n\n\tchnl_width = bw;\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\tif(rf_type == RF_3T3R)\n\t\trx_nss = 3;\n\telse if(rf_type == RF_2T2R)\n\t\trx_nss = 2;\n\telse\n\t\trx_nss = 1;\n\n\tSET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, chnl_width);\n\tSET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (rx_nss-1));\n\tSET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, 0); //Todo\n\n\tpvhtpriv->vht_op_mode_notify = opmode;\n\n\tpbuf = rtw_set_ie(pbuf, EID_OpModeNotification, 1, &opmode, &len);\n\n\treturn len;\n}\n\nu32\trtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf)\n{\n\tu8\tbw, rf_type, rf_num, rx_stbc_nss = 0;\n\tu16\tHighestRate;\n\tu8\t*pcap, *pcap_mcs;\n\tu32\tlen = 0;\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\n\tpcap = pvhtpriv->vht_cap;\n\t_rtw_memset(pcap, 0, 32);\n\t\n\t/* B0 B1 Maximum MPDU Length */\n\tSET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); \n\t\n\t/* B2 B3 Supported Channel Width Set */\n\tif (hal_chk_bw_cap(padapter, BW_CAP_160M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_160)) {\n\t\tif (hal_chk_bw_cap(padapter, BW_CAP_80_80M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_80_80))\n\t\t\tSET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 2);\n\t\telse\n\t\t\tSET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 1);\n\t} else {\n\t\tSET_VHT_CAPABILITY_ELE_CHL_WIDTH(pcap, 0);\n\t}\n\n\t// B4 Rx LDPC\n\tif(TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX))\n\t{\n\t\tSET_VHT_CAPABILITY_ELE_RX_LDPC(pcap, 1);\n\t}\n\n\t// B5 ShortGI for 80MHz\n\tSET_VHT_CAPABILITY_ELE_SHORT_GI80M(pcap, pvhtpriv->sgi_80m? 1 : 0); // We can receive Short GI of 80M\n\n\t// B6 ShortGI for 160MHz\n\t//SET_VHT_CAPABILITY_ELE_SHORT_GI160M(pcap, pvhtpriv->sgi_80m? 1 : 0);\n\n\t// B7 Tx STBC\n\tif(TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX))\n\t{\n\t\tSET_VHT_CAPABILITY_ELE_TX_STBC(pcap, 1);\n\t}\n\n\t// B8 B9 B10 Rx STBC\n\tif(TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX))\n\t{\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_RX_STBC, (u8 *)(&rx_stbc_nss));\n\t\t\n\t\tSET_VHT_CAPABILITY_ELE_RX_STBC(pcap, rx_stbc_nss);\n\t}\n\n\t// B11 SU Beamformer Capable\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) {\t\t\n\t\tSET_VHT_CAPABILITY_ELE_SU_BFER(pcap, 1);\n\t\t// B16 17 18 Number of Sounding Dimensions\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMER_CAP, (u8 *)&rf_num);\n\t\tSET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(pcap, rf_num);\n\t}\n\n\t// B12 SU Beamformee Capable\n\tif (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) {\n\t\tSET_VHT_CAPABILITY_ELE_SU_BFEE(pcap, 1);\n\t\t// B13 14 15 Compressed Steering Number of Beamformer Antennas Supported\n\t\trtw_hal_get_def_var(padapter, HAL_DEF_BEAMFORMEE_CAP, (u8 *)&rf_num);\n\t\tSET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(pcap, rf_num);\n\t}\n\n\t// B19 MU Beamformer Capable\n\tSET_VHT_CAPABILITY_ELE_MU_BFER(pcap, 0);  //HW don't support mu bfee/bfer\n\t// B20 MU Beamformee Capable\n\tSET_VHT_CAPABILITY_ELE_MU_BFEE(pcap, 0);\n\t// B21 VHT TXOP PS\n\tSET_VHT_CAPABILITY_ELE_TXOP_PS(pcap, 0);\n\t// B22 +HTC-VHT Capable\n\tSET_VHT_CAPABILITY_ELE_HTC_VHT(pcap, 1);\n\t// B23 24 25 Maximum A-MPDU Length Exponent\n\tif (pregistrypriv->ampdu_factor != 0xFE)\n\t{\n\t\tSET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, pregistrypriv->ampdu_factor);\n\t}\n\telse\n\t{\n\t\tSET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(pcap, 7);\n\t}\n\t// B26 27 VHT Link Adaptation Capable\n\tSET_VHT_CAPABILITY_ELE_LINK_ADAPTION(pcap, 0);\n\n\tpcap_mcs = GET_VHT_CAPABILITY_ELE_RX_MCS(pcap);\n\t_rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2);\n\n\tpcap_mcs = GET_VHT_CAPABILITY_ELE_TX_MCS(pcap);\n\t_rtw_memcpy(pcap_mcs, pvhtpriv->vht_mcs_map, 2);\n\n\t/* find the largest bw supported by both registry and hal */\n\tbw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv));\n\n\tHighestRate = VHT_MCS_DATA_RATE[bw][pvhtpriv->sgi_80m][((pvhtpriv->vht_highest_rate - MGN_VHT1SS_MCS0)&0x3f)];\n\tHighestRate = (HighestRate+1) >> 1;\n\n\tSET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(pcap, HighestRate); //indicate we support highest rx rate is 600Mbps.\n\tSET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(pcap, HighestRate); //indicate we support highest tx rate is 600Mbps.\n\n\tpbuf = rtw_set_ie(pbuf, EID_VHTCapability, 12, pcap, &len);\n\n\treturn len;\n}\n\nu32 rtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len)\n{\n\tu32\tielen=0, out_len=0;\n\tu8\tcap_len=0, notify_len=0, notify_bw=0, operation_bw=0, supported_chnl_width=0;\n\tu8\t*p, *pframe;\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\n\trtw_vht_use_default_setting(padapter);\n\n\tp = rtw_get_ie(in_ie+12, EID_VHTCapability, &ielen, in_len-12);\n\tif (p && ielen>0) {\n\t\tsupported_chnl_width = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p+2);\n\t\t\n\t\t// VHT Capabilities element\n\t\tcap_len = rtw_build_vht_cap_ie(padapter, out_ie+*pout_len);\n\t\t*pout_len += cap_len;\n\n\t\t// Get HT BW\n\t\tp = rtw_get_ie(in_ie+12, _HT_EXTRA_INFO_IE_, &ielen, in_len-12);\n\t\tif (p && ielen>0) {\n\t\t\tstruct HT_info_element *pht_info = (struct HT_info_element *)(p+2);\n\t\t\tif (pht_info->infos[0] & BIT(2))\n\t\t\t\toperation_bw = CHANNEL_WIDTH_40;\n\t\t\telse\n\t\t\t\toperation_bw = CHANNEL_WIDTH_20;\n\t\t}\n\n\t\t// VHT Operation element\n\t\tp = rtw_get_ie(in_ie+12, EID_VHTOperation, &ielen, in_len-12);\n\t\tif (p && ielen>0) {\n\t\t\tout_len = *pout_len;\n\t\t\tif (GET_VHT_OPERATION_ELE_CHL_WIDTH(p+2) >= 1) {\n\t\t\t\tif (supported_chnl_width == 2)\n\t\t\t\t\toperation_bw = CHANNEL_WIDTH_80_80;\n\t\t\t\telse if (supported_chnl_width == 1)\n\t\t\t\t\toperation_bw = CHANNEL_WIDTH_160;\n\t\t\t\telse\n\t\t\t\t\toperation_bw = CHANNEL_WIDTH_80;\n\t\t\t}\n\t\t\tpframe = rtw_set_ie(out_ie+out_len, EID_VHTOperation, ielen, p+2 , pout_len);\n\t\t}\n\n\t\t/* find the largest bw supported by both registry and hal */\n\t\tnotify_bw = hal_largest_bw(padapter, REGSTY_BW_5G(pregistrypriv));\n\n\t\tif (notify_bw > operation_bw)\n\t\t\tnotify_bw = operation_bw;\n\n\t\t// Operating Mode Notification element\n\t\tnotify_len = rtw_build_vht_op_mode_notify_ie(padapter, out_ie+*pout_len, notify_bw);\n\t\t*pout_len += notify_len;\n\n\t\tpvhtpriv->vht_option = _TRUE;\n\t}\n\t\n\treturn (pvhtpriv->vht_option);\n\t\n}\n\nvoid VHTOnAssocRsp(_adapter *padapter)\n{\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct vht_priv\t\t*pvhtpriv = &pmlmepriv->vhtpriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8\tht_AMPDU_len;\n\t\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif (!pmlmeinfo->HT_enable)\n\t\treturn;\n\n\tif (!pmlmeinfo->VHT_enable)\n\t\treturn;\n\n\tht_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;\n\n\tif(pvhtpriv->ampdu_len > ht_AMPDU_len)\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&pvhtpriv->ampdu_len));\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MAX_TIME, (u8 *)(&pvhtpriv->vht_highest_rate));\n}\n\n#endif //CONFIG_80211AC_VHT\n\n"
  },
  {
    "path": "core/rtw_wapi.c",
    "content": "#ifdef CONFIG_WAPI_SUPPORT\n\n#include <linux/unistd.h>\n#include <linux/etherdevice.h>\n#include <drv_types.h>\n#include <rtw_wapi.h>\n\n\nu32 wapi_debug_component =\n//\t\t\t\tWAPI_INIT\t|\n//\t\t\t\tWAPI_API    \t|\n//\t\t\t\tWAPI_TX    \t|\n//\t\t\t\tWAPI_RX    \t|\n\t\t\t\tWAPI_ERR ; //always open err flags on\n\nvoid WapiFreeAllStaInfo(_adapter *padapter)\n{\n\tPRT_WAPI_T\t\t\t\tpWapiInfo;\n\tPRT_WAPI_STA_INFO\t\tpWapiStaInfo;\n\tPRT_WAPI_BKID\t\t\tpWapiBkid;\n\n\tWAPI_TRACE(WAPI_INIT, \"===========> %s\\n\", __FUNCTION__);\n\tpWapiInfo = &padapter->wapiInfo;\n\n\t//Pust to Idle List\n\trtw_wapi_return_all_sta_info(padapter);\n\n\t//Sta Info List\n\twhile(!list_empty(&(pWapiInfo->wapiSTAIdleList)))\n\t{\n\t\tpWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);\n\t\tlist_del_init(&pWapiStaInfo->list);\n\t}\n\n\t//BKID List\n\twhile(!list_empty(&(pWapiInfo->wapiBKIDIdleList)))\n\t{\n\t\tpWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);\n\t\tlist_del_init(&pWapiBkid->list);\n\t}\n\tWAPI_TRACE(WAPI_INIT, \"<=========== %s\\n\", __FUNCTION__);\n\treturn;\n}\n\nvoid WapiSetIE(_adapter *padapter)\n{\n\tPRT_WAPI_T\t\tpWapiInfo = &(padapter->wapiInfo);\n\t//PRT_WAPI_BKID\tpWapiBkid;\n\tu16\t\tprotocolVer = 1;\n\tu16\t\takmCnt = 1;\n\tu16\t\tsuiteCnt = 1;\n\tu16\t\tcapability = 0;\n\tu8\t\tOUI[3];\n\n\tOUI[0] = 0x00;\n\tOUI[1] = 0x14;\n\tOUI[2] = 0x72;\n\n\tpWapiInfo->wapiIELength = 0;\n//protocol version\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &protocolVer, 2);\n\tpWapiInfo->wapiIELength +=2;\n//akm\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &akmCnt, 2);\n\tpWapiInfo->wapiIELength +=2;\n\n\tif(pWapiInfo->bWapiPSK){\n\t\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3);\n\t\tpWapiInfo->wapiIELength +=3;\n\t\tpWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2;\n\t\tpWapiInfo->wapiIELength +=1;\n\t}else{\n\t\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3);\n\t\tpWapiInfo->wapiIELength +=3;\n\t\tpWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;\n\t\tpWapiInfo->wapiIELength +=1;\n\t}\n\n//usk\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &suiteCnt, 2);\n\tpWapiInfo->wapiIELength +=2;\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3);\n\tpWapiInfo->wapiIELength +=3;\n\tpWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;\n\tpWapiInfo->wapiIELength +=1;\n\n//msk\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength,OUI, 3);\n\tpWapiInfo->wapiIELength +=3;\n\tpWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;\n\tpWapiInfo->wapiIELength +=1;\n\n//Capbility\n\tmemcpy(pWapiInfo->wapiIE+pWapiInfo->wapiIELength, &capability, 2);\n\tpWapiInfo->wapiIELength +=2;\n}\n\n\n/*  PN1 > PN2, return 1,\n *  else return 0.\n */\nu32 WapiComparePN(u8 *PN1, u8 *PN2)\n{\n\tchar i;\n\n\tif ((NULL == PN1) || (NULL == PN2))\n\t\treturn 1;\n\n\t// overflow case\n\tif ((PN2[15] - PN1[15]) & 0x80)\n\t\treturn 1;\n\n\tfor (i=16; i>0; i--)\n\t{\n\t\tif(PN1[i-1] == PN2[i-1])\n\t\t    \tcontinue;\n\t\telse if(PN1[i-1] > PN2[i-1])\n\t\t\treturn 1;\n\t\telse\n\t\t\treturn 0;\n\t}\n\n\treturn 0;\n}\n\nu8\nWapiGetEntryForCamWrite(_adapter *padapter,u8 *pMacAddr,u8 KID,BOOLEAN IsMsk)\n{\n\tPRT_WAPI_T\t\tpWapiInfo=NULL;\n\t//PRT_WAPI_CAM_ENTRY\tpEntry=NULL;\n\tu8 i=0;\n\tu8 ret = 0xff;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tpWapiInfo =  &padapter->wapiInfo;\n\n\t//exist?\n\tfor(i=0;i<WAPI_CAM_ENTRY_NUM;i++)\n\t{\n\t\tif(pWapiInfo->wapiCamEntry[i].IsUsed\n\t\t\t&& (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)\n\t\t\t&& pWapiInfo->wapiCamEntry[i].keyidx == KID\n\t\t\t&& pWapiInfo->wapiCamEntry[i].type == IsMsk)\n\t\t{\n\t\t\tret = pWapiInfo->wapiCamEntry[i].entry_idx; //cover it\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(i == WAPI_CAM_ENTRY_NUM) //not found\n\t{\n\t\tfor(i=0;i<WAPI_CAM_ENTRY_NUM;i++)\n\t\t{\n\t\t\tif(pWapiInfo->wapiCamEntry[i].IsUsed == 0)\n\t\t\t{\n\t\t\t\tpWapiInfo->wapiCamEntry[i].IsUsed = 1;\n\t\t\t\tpWapiInfo->wapiCamEntry[i].type = IsMsk;\n\t\t\t\tpWapiInfo->wapiCamEntry[i].keyidx = KID;\n\t\t\t\t_rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr,ETH_ALEN);\n\t\t\t\tret = pWapiInfo->wapiCamEntry[i].entry_idx;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tWAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n\treturn ret;\n\n/*\n\tif(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)){\n\t\tRT_TRACE(COMP_SEC,DBG_LOUD,(\"No Entry for wapi!!!\\n\"));\n\t\treturn 0;\n\t}\n\n\tpEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList);\n\tRTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list);\n\n\tRT_TRACE(COMP_SEC,DBG_LOUD,(\"<====WapiGetCamEntry(),Get Entry Idx:%d.but we just return 4 for test\\n\",pEntry->entry_idx));\n\n\treturn pEntry->entry_idx;*/\n}\n\nu8 WapiGetEntryForCamClear(_adapter *padapter,u8 *pPeerMac,u8 keyid,u8 IsMsk)\n{\n\tPRT_WAPI_T\t\tpWapiInfo=NULL;\n\tu8\t\ti=0;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tpWapiInfo =  &padapter->wapiInfo;\n\n\tfor(i=0;i<WAPI_CAM_ENTRY_NUM;i++)\n\t{\n\t\tif(pWapiInfo->wapiCamEntry[i].IsUsed\n\t\t\t&& (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)\n\t\t\t&& pWapiInfo->wapiCamEntry[i].keyidx == keyid\n\t\t\t&& pWapiInfo->wapiCamEntry[i].type == IsMsk)\n\t\t{\n\t\t\t\tpWapiInfo->wapiCamEntry[i].IsUsed = 0;\n\t\t\t\tpWapiInfo->wapiCamEntry[i].keyidx = 2;\n\t\t\t\t_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr,0,ETH_ALEN);\n\n\t\t\t\tWAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n\t\t\t\treturn pWapiInfo->wapiCamEntry[i].entry_idx;\n\t\t}\n\t}\n\n\tWAPI_TRACE(WAPI_API,\"<====WapiGetReturnCamEntry(), No this cam entry.\\n\");\n\treturn 0xff;\n/*\n\tif(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)){\n\t\tRT_TRACE(COMP_SEC,DBG_LOUD,(\"No Entry for wapi!!!\\n\"));\n\t\treturn FALSE;\n\t}\n\n\tpList = &pWapiInfo->wapiCamUsedList;\n\twhile(pList->Flink != &pWapiInfo->wapiCamUsedList)\n\t{\n\t\tpEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink;\n\t\tif(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0\n\t\t\t&& keyid == pEntry->keyidx)\n\t\t{\n\t\t\tRTRemoveEntryList(pList);\n\t\t\tRTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList);\n\t\t\treturn pEntry->entry_idx;\n\t\t}\n\t\tpList = pList->Flink;\n\t}\n\n\treturn 0;\n*/\n}\n\nvoid\nWapiResetAllCamEntry(_adapter *padapter)\n{\n\tPRT_WAPI_T\t\tpWapiInfo;\n\tint\t\t\t\ti;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tpWapiInfo =  &padapter->wapiInfo;\n\n\tfor (i=0;i<WAPI_CAM_ENTRY_NUM;i++)\n\t{\n\t\t_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);\n\t\tpWapiInfo->wapiCamEntry[i].IsUsed = 0;\n\t \tpWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid\n\t \tpWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2;\n \t}\n\n\tWAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n\n\treturn;\n}\n\nu8 WapiWriteOneCamEntry(\n\t_adapter \t*padapter,\n\tu8 \t\t\t*pMacAddr,\n\tu8 \t\t\tKeyId,\n\tu8\t\t\tEntryId,\n\tu8 \t\t\tEncAlg,\n\tu8 \t\t\tbGroupKey,\n\tu8 \t\t\t*pKey\n)\n{\n\tu8 retVal = 0;\n\tu16 usConfig = 0;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tif(EntryId >= 32)\n\t{\n\t\tWAPI_TRACE(WAPI_ERR, \"<=== CamAddOneEntry(): ulKeyId exceed!\\n\");\n\t\treturn retVal;\n\t}\n\n\tusConfig=usConfig|(0x01<<15)|((u16)(EncAlg)<<2)|(KeyId);\n\n\tif(EncAlg == _SMS4_ )\n\t{\n\t\tif(bGroupKey == 1)\n\t\t\tusConfig |= (0x01<<6);\n\t\tif((EntryId % 2)==1)  // ==0 sec key; == 1mic key\n\t\t\tusConfig |= (0x01<<5);\n\t}\n\n\twrite_cam(padapter, EntryId, usConfig, pMacAddr, pKey);\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n    \treturn 1;\n}\n\nvoid rtw_wapi_init(_adapter *padapter)\n{\n\tPRT_WAPI_T\t\tpWapiInfo;\n\tint\t\t\t\ti;\n\n\tWAPI_TRACE(WAPI_INIT, \"===========> %s\\n\", __FUNCTION__);\n\tRT_ASSERT_RET(padapter);\n\n\tif (!padapter->WapiSupport)\n\t{\n\t\tWAPI_TRACE(WAPI_INIT, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tpWapiInfo =  &padapter->wapiInfo;\n\tpWapiInfo->bWapiEnable = false;\n\n\t//Init BKID List\n\tINIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList);\n\tINIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList);\n\tfor(i=0;i<WAPI_MAX_BKID_NUM;i++)\n\t{\n\t\tlist_add_tail(&pWapiInfo->wapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList);\n\t}\n\n\t//Init STA List\n\tINIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList);\n\tINIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList);\n\tfor(i=0;i<WAPI_MAX_STAINFO_NUM;i++)\n\t{\n\t\tlist_add_tail(&pWapiInfo->wapiSta[i].list, &pWapiInfo->wapiSTAIdleList);\n\t}\n\n\t for (i=0;i<WAPI_CAM_ENTRY_NUM;i++)\n\t {\n\t\tpWapiInfo->wapiCamEntry[i].IsUsed = 0;\n\t \tpWapiInfo->wapiCamEntry[i].keyidx = 2; //invalid\n\t \tpWapiInfo->wapiCamEntry[i].entry_idx = 4+i*2;\n \t}\n\n\tWAPI_TRACE(WAPI_INIT, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_free(_adapter *padapter)\n{\n\tWAPI_TRACE(WAPI_INIT, \"===========> %s\\n\", __FUNCTION__);\n\tRT_ASSERT_RET(padapter);\n\n\tif (!padapter->WapiSupport)\n\t{\n\t\tWAPI_TRACE(WAPI_INIT, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tWapiFreeAllStaInfo(padapter);\n\n\tWAPI_TRACE(WAPI_INIT, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_disable_tx(_adapter *padapter)\n{\n\tWAPI_TRACE(WAPI_INIT, \"===========> %s\\n\", __FUNCTION__);\n\tRT_ASSERT_RET(padapter);\n\n\tif (!padapter->WapiSupport)\n\t{\n\t\tWAPI_TRACE(WAPI_INIT, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tpadapter->wapiInfo.wapiTxMsk.bTxEnable = false;\n\tpadapter->wapiInfo.wapiTxMsk.bSet = false;\n\n\tWAPI_TRACE(WAPI_INIT, \"<========== %s\\n\", __FUNCTION__);\n}\n\nu8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data)\n{\n\tPRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv   *psecuritypriv = &padapter->securitypriv;\n\tPRT_WAPI_STA_INFO pWapiSta = NULL;\n\tu8 WaiPkt = 0, *pTaddr, bFind = false;\n\tu8 Offset_TypeWAI = 0 ;\t// (mac header len + llc length)\n\t\n\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn 0;\n\t}\n\n\t Offset_TypeWAI = 24 + 6 ;\n\n\t//YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4.\n\tif ((pkt_data[1]&0x40) !=0)\n\t{\n\t\t//DBG_871X(\"data is privacy \\n\");\n\t    \treturn 0;\n\t}\n\t\n\tpTaddr = GetAddr2Ptr(pkt_data);\n\tif(list_empty(&pWapiInfo->wapiSTAUsedList)){\n\t\tbFind = false;\n\t}else{\n\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){\n\t\t\tif (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) {\n\t\t\t\tbFind = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"%s: bFind=%d pTaddr=\"MAC_FMT\"\\n\", __FUNCTION__, bFind, MAC_ARG(pTaddr));\n\n\tif (pkt_data[0] == WIFI_QOS_DATA_TYPE)\n\t{\n\t\tOffset_TypeWAI += 2;\n\t}\n\n\t// 88b4?\n\tif( (pkt_data[Offset_TypeWAI]==0x88) && (pkt_data[Offset_TypeWAI+1]==0xb4) ){\n\t\tWaiPkt = pkt_data[Offset_TypeWAI+5];\n\n\t\tpsecuritypriv->hw_decrypted = _TRUE;\n\t}else{\n\t\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"%s(): non wai packet\\n\",__FUNCTION__);\n\t}\n\n\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"%s(): Recvd WAI frame. IsWAIPkt(%d)\\n\",__FUNCTION__, WaiPkt);\n\n\treturn\tWaiPkt;\n}\n\n\nvoid rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tPRT_WAPI_T     pWapiInfo = &(padapter->wapiInfo);\n\tstruct recv_frame_hdr *precv_hdr;\n\tu8 \t*ptr;\n\tu8 \t*pTA;\n\tu8 \t*pRecvPN;\n\n\n\tWAPI_TRACE(WAPI_RX, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_RX, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tprecv_hdr = &precv_frame->u.hdr;\n\tptr = precv_hdr->rx_data;\n\n\tif (precv_hdr->attrib.qos == 1)\n\t{\n\t\tprecv_hdr->UserPriority = GetTid(ptr);\n\t}\n\telse\n\t{\n\t\tprecv_hdr->UserPriority = 0;\n\t}\n\n\tpTA = GetAddr2Ptr(ptr);\n\t_rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6);\n\tpRecvPN = ptr + precv_hdr->attrib.hdrlen + 2;\n\t_rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16);\n\n\tWAPI_TRACE(WAPI_RX, \"<========== %s\\n\", __FUNCTION__);\n}\n\n/****************************************************************************\nTRUE-----------------Drop\nFALSE---------------- handle\nadd to support WAPI to N-mode\n*****************************************************************************/\nu8 rtw_wapi_check_for_drop(\n\t_adapter *padapter,\n\tunion recv_frame *precv_frame\n)\n{\n\tPRT_WAPI_T     pWapiInfo = &(padapter->wapiInfo);\n\tu8\t\t\t*pLastRecvPN = NULL;\n\tu8\t\t\tbFind = false;\n\tPRT_WAPI_STA_INFO\tpWapiSta = NULL;\n\tu8 \t\t\tbDrop = false;\n\tstruct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr;\n\tu8\t\t\t\t\tWapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\tu8 \t\t\t\t\tWapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\tu8 \t\t\t\t\t*ptr = precv_frame->u.hdr.rx_data;\n\tint\t\t\t\t\ti;\n\n\tWAPI_TRACE(WAPI_RX, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_RX, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn false;\n\t}\n\n\tif(precv_hdr->bIsWaiPacket !=0)\n\t{\n\t\tif(precv_hdr->bIsWaiPacket== 0x8)\n\t\t{\n\n\t\t\tDBG_871X(\"rtw_wapi_check_for_drop: dump packet \\n\");\n\t\t\tfor(i=0;i<50;i++)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%02X  \",ptr[i]);\n\t\t\t\tif((i+1) %8 ==0)\n\t\t\t\t\tDBG_871X(\"\\n\");\n\t\t\t}\n\t\t\tDBG_871X(\"\\n rtw_wapi_check_for_drop: dump packet \\n\");\n\n\t\t\tfor(i=0;i<16;i++)\n\t\t\t{\n\t\t\t\tif(ptr[i+27] !=0)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(i== 16)\n\t\t\t{\n\t\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_check_for_drop: drop with zero BKID \\n\");\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n\t}\n\n\tif(list_empty(&pWapiInfo->wapiSTAUsedList)){\n\t\tbFind = false;\n\t}else{\n\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\tif (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) {\n\t\t\t\tbFind = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tWAPI_TRACE(WAPI_RX, \"%s: bFind=%d prxb->WapiSrcAddr=\"MAC_FMT\"\\n\", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr));\n\n\tif(bFind)\n\t{\n\t\tif(IS_MCAST(precv_hdr->attrib.ra))\n\t\t{\n\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_check_for_drop: multicast case \\n\");\n\t\t\tpLastRecvPN = pWapiSta->lastRxMulticastPN;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_check_for_drop: unicast case \\n\");\n\t\t\tswitch(precv_hdr->UserPriority)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\tcase 3:\n\t\t\t\t\tpLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tpLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\tpLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\tcase 7:\n\t\t\t\t\tpLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: Unknown TID \\n\",__FUNCTION__);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!WapiComparePN(precv_hdr->WapiTempPN,pLastRecvPN))\n\t\t{\n\t\t\tWAPI_TRACE(WAPI_RX,\"%s: Equal PN!!\\n\",__FUNCTION__);\n\t\t\tif(IS_MCAST(precv_hdr->attrib.ra))\n\t\t\t\t_rtw_memcpy(pLastRecvPN,WapiAEMultiCastPNInitialValueSrc,16);\n\t\t\telse\n\t\t\t\t_rtw_memcpy(pLastRecvPN,WapiAEPNInitialValueSrc,16);\n\t\t\tbDrop = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_rtw_memcpy(pLastRecvPN,precv_hdr->WapiTempPN,16);\n\t\t}\n\t}\n\n\tWAPI_TRACE(WAPI_RX, \"<========== %s\\n\", __FUNCTION__);\n\treturn bDrop;\n}\n\nvoid rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)\n{\n\tPRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);\n\tu8 WapiIELength = 0;\n\n\tWAPI_TRACE(WAPI_MLME, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport)  || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tWapiSetIE(padapter);\n\tWapiIELength = pWapiInfo->wapiIELength;\n\tpframe[0] = _WAPI_IE_;\n\tpframe[1] = WapiIELength;\n\t_rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength);\n\tpframe += WapiIELength+2;\n\tpattrib->pktlen += WapiIELength+2;\n\n\tWAPI_TRACE(WAPI_MLME, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)\n{\n\tPRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);\n\tu8 WapiIELength = 0;\n\tWAPI_TRACE(WAPI_MLME, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport)  || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tWapiSetIE(padapter);\n\tWapiIELength = pWapiInfo->wapiIELength;\n\tpframe[0] = _WAPI_IE_;\n\tpframe[1] = WapiIELength;\n\t_rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength);\n\tpframe += WapiIELength+2;\n\tpattrib->pktlen += WapiIELength+2;\n\n\tWAPI_TRACE(WAPI_MLME, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)\n{\n\tPRT_WAPI_BKID\t\tpWapiBKID;\n\tu16\t\t\t\t\tbkidNum;\n\tPRT_WAPI_T\t\t\tpWapiInfo = &(padapter->wapiInfo);\n\tu8\t\t\t\t\tWapiIELength = 0;\n\n\tWAPI_TRACE(WAPI_MLME, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tWapiSetIE(padapter);\n\tWapiIELength = pWapiInfo->wapiIELength;\n\tbkidNum = 0;\n\tif(!list_empty(&(pWapiInfo->wapiBKIDStoreList))){\n\t\tlist_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) {\n\t\t\tbkidNum ++;\n\t\t\t_rtw_memcpy(pWapiInfo->wapiIE+WapiIELength+2, pWapiBKID->bkid,16);\n\t\t\tWapiIELength += 16;\n\t\t}\n\t}\n\t_rtw_memcpy(pWapiInfo->wapiIE+WapiIELength, &bkidNum, 2);\n\tWapiIELength += 2;\n\n\t pframe[0] = _WAPI_IE_;\n\t pframe[1] = WapiIELength;\n\t_rtw_memcpy(pframe+2, pWapiInfo->wapiIE, WapiIELength);\n\tpframe += WapiIELength+2;\n\tpattrib->pktlen += WapiIELength+2;\n\tWAPI_TRACE(WAPI_MLME, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n\tPRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);\n\tPRT_WAPI_STA_INFO pWapiSta;\n\tu8 WapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\t//u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\tu8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\n\tWAPI_TRACE(WAPI_MLME, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tpWapiSta =(PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);\n\tlist_del_init(&pWapiSta->list);\n\tlist_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList);\n\t_rtw_memcpy(pWapiSta->PeerMacAddr,padapter->mlmeextpriv.mlmext_info.network.MacAddress,6);\n\t_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);\n\t_rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);\n\n\t//For chenk PN error with Qos Data after s3: add by ylb 20111114\n\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16);\n\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16);\n\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16);\n\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16);\n\n\tWAPI_TRACE(WAPI_MLME, \"<========== %s\\n\", __FUNCTION__);\n}\n\n\nvoid rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr)\n{\n\tPRT_WAPI_T\t\t\t\tpWapiInfo;\n\tPRT_WAPI_STA_INFO\t\tpWapiStaInfo = NULL;\n\tPRT_WAPI_BKID\t\t\tpWapiBkid = NULL;\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\n\tpWapiInfo = &padapter->wapiInfo;\n\n\tWAPI_TRACE(WAPI_API, \"==========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n       if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))\n       {\n             while(!list_empty(&(pWapiInfo->wapiBKIDStoreList)))\n                 {\n                        pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);\n                           list_del_init(&pWapiBkid->list);\n                           _rtw_memset(pWapiBkid->bkid,0,16);\n                        list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);\n                 }\n        }\n\n\n\tWAPI_TRACE(WAPI_API, \" %s: after clear bkid \\n\", __FUNCTION__);\n\n\n\t//Remove STA info\n\tif(list_empty(&(pWapiInfo->wapiSTAUsedList))){\n\t\tWAPI_TRACE(WAPI_API, \" %s: wapiSTAUsedList is null \\n\", __FUNCTION__);\n\t\treturn;\n\t}else{\n\n\t\tWAPI_TRACE(WAPI_API, \" %s: wapiSTAUsedList is not null \\n\", __FUNCTION__);\n#if 0\n\t\tpWapiStaInfo=(PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next),RT_WAPI_STA_INFO,list);\n\n\t\tlist_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) {\n\n\t\t\tDBG_871X(\"MAC Addr %02x-%02x-%02x-%02x-%02x-%02x \\n\",MacAddr[0],MacAddr[1],MacAddr[2],MacAddr[3],MacAddr[4],MacAddr[5]);\n\n\n\t\t\tDBG_871X(\"peer Addr %02x-%02x-%02x-%02x-%02x-%02x \\n\",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]);\n\n\t\t\tif(pWapiStaInfo == NULL)\n\t\t\t{\n\t\t\t\tWAPI_TRACE(WAPI_API, \" %s: pWapiStaInfo == NULL Case \\n\", __FUNCTION__);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(pWapiStaInfo->PeerMacAddr == NULL)\n\t\t\t{\n\t\t\t\tWAPI_TRACE(WAPI_API, \" %s: pWapiStaInfo->PeerMacAddr == NULL Case \\n\", __FUNCTION__);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(MacAddr == NULL)\n\t\t\t{\n\t\t\t\tWAPI_TRACE(WAPI_API, \" %s: MacAddr == NULL Case \\n\", __FUNCTION__);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) {\n\t\t\t\tpWapiStaInfo->bAuthenticateInProgress = false;\n\t\t\t\tpWapiStaInfo->bSetkeyOk = false;\n\t\t\t\t_rtw_memset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN);\n\t\t\t\tlist_del_init(&pWapiStaInfo->list);\n\t\t\t\tlist_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n#endif\n\n\t\twhile(!list_empty(&(pWapiInfo->wapiSTAUsedList)))\n\t\t{\n\t\t\tpWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);\n\n\t\t\tDBG_871X(\"peer Addr %02x-%02x-%02x-%02x-%02x-%02x \\n\",pWapiStaInfo->PeerMacAddr[0],pWapiStaInfo->PeerMacAddr[1],pWapiStaInfo->PeerMacAddr[2],pWapiStaInfo->PeerMacAddr[3],pWapiStaInfo->PeerMacAddr[4],pWapiStaInfo->PeerMacAddr[5]);\n\n\t\t\tlist_del_init(&pWapiStaInfo->list);\n\t\t\tmemset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN);\n\t\t\tpWapiStaInfo->bSetkeyOk = 0;\n\t\t\tlist_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);\n\t\t}\n\n\t}\n\n        WAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n\treturn;\n}\n\nvoid rtw_wapi_return_all_sta_info(_adapter *padapter)\n{\n\tPRT_WAPI_T\t\t\t\tpWapiInfo;\n\tPRT_WAPI_STA_INFO\t\tpWapiStaInfo;\n\tPRT_WAPI_BKID\t\t\tpWapiBkid;\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tpWapiInfo = &padapter->wapiInfo;\n\n\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\t//Sta Info List\n\twhile(!list_empty(&(pWapiInfo->wapiSTAUsedList)))\n\t{\n\t\tpWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);\n\t\tlist_del_init(&pWapiStaInfo->list);\n\t\tmemset(pWapiStaInfo->PeerMacAddr,0,ETH_ALEN);\n\t\tpWapiStaInfo->bSetkeyOk = 0;\n\t\tlist_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);\n\t}\n\n\t//BKID List\n\twhile(!list_empty(&(pWapiInfo->wapiBKIDStoreList)))\n\t{\n\t\tpWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);\n\t\tlist_del_init(&pWapiBkid->list);\n\t\tmemset(pWapiBkid->bkid,0,16);\n\t\tlist_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);\n\t}\n\tWAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr)\n{\n\tu8 UcIndex = 0;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tUcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0);\n\tif(UcIndex != 0xff){\n\t\t//CAM_mark_invalid(Adapter, UcIndex);\n\t\tCAM_empty_entry(padapter, UcIndex);\n\t}\n\n\tUcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0);\n\tif(UcIndex != 0xff){\n\t\t//CAM_mark_invalid(Adapter, UcIndex);\n\t\tCAM_empty_entry(padapter, UcIndex);\n\t}\n\n\tUcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1);\n\tif(UcIndex != 0xff){\n\t\t//CAM_mark_invalid(Adapter, UcIndex);\n\t\tCAM_empty_entry(padapter, UcIndex);\n\t}\n\n\tUcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1);\n\tif(UcIndex != 0xff){\n\t\t//CAM_mark_invalid(padapter, UcIndex);\n\t\tCAM_empty_entry(padapter, UcIndex);\n\t}\n\n\tWAPI_TRACE(WAPI_API, \"<========== %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_clear_all_cam_entry(_adapter *padapter)\n{\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_MLME, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tinvalidate_cam_all(padapter); // is this ok?\n\tWapiResetAllCamEntry(padapter);\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n}\n\nvoid rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey)\n{\n\tPRT_WAPI_T\t\tpWapiInfo =  &padapter->wapiInfo;\n\tu8\t\t\t\t*pMacAddr = pWapiSta->PeerMacAddr;\n\tu32 EntryId = 0;\n\tBOOLEAN IsPairWise = false ;\n\tu8 EncAlgo;\n\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_API, \"<========== %s, WAPI not supported or not enabled!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tEncAlgo = _SMS4_;\n\n\t//For Tx bc/mc pkt,use defualt key entry\n\tif(bUseDefaultKey)\n\t{\n\t\t// when WAPI update key, keyid will be 0 or 1 by turns.\n\t\tif (pWapiKey->keyId == 0)\n\t\t\tEntryId = 0;\n\t\telse\n\t\t\tEntryId = 2;\n\t}\n\telse\n\t{\n\t\t// tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr\n\t\tEntryId = WapiGetEntryForCamWrite(padapter,pMacAddr,pWapiKey->keyId,bGroupKey);\n\t}\n\n\tif(EntryId == 0xff){\n\t\tWAPI_TRACE(WAPI_API, \"===>No entry for WAPI setkey! !!\\n\");\n\t\treturn;\n\t}\n\n\t//EntryId is also used to diff Sec key and Mic key\n\t//Sec Key\n\tWapiWriteOneCamEntry(padapter,\n\t\t\t\t\tpMacAddr,\n\t\t\t\t\tpWapiKey->keyId, //keyid\n\t\t\t\t\tEntryId,\t//entry\n\t\t\t\t\tEncAlgo, //type\n\t\t\t\t\tbGroupKey, //pairwise or group key\n\t\t\t\t\tpWapiKey->dataKey);\n\t//MIC key\n\tWapiWriteOneCamEntry(padapter,\n\t\t\t\t\tpMacAddr,\n\t\t\t\t\tpWapiKey->keyId, //keyid\n\t\t\t\t\tEntryId+1,\t//entry\n\t\t\t\t\tEncAlgo, //type\n\t\t\t\t\tbGroupKey, //pairwise or group key\n\t\t\t\t\tpWapiKey->micKey);\n\n\tWAPI_TRACE(WAPI_API, \"Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\\n\",pWapiKey->keyId,EntryId,!bGroupKey);\n\tWAPI_TRACE(WAPI_API, \"===========> %s\\n\", __FUNCTION__);\n\n}\n\n#if 0\n//YJ,test,091013\nvoid wapi_test_set_key(struct _adapter *padapter, u8* buf)\n{ /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/\n\tPRT_WAPI_T\t\t\tpWapiInfo = &padapter->wapiInfo;\n\tPRT_WAPI_BKID\t\tpWapiBkid;\n\tPRT_WAPI_STA_INFO\tpWapiSta;\n\tu8\t\t\t\t\tdata[43];\n\tbool\t\t\t\t\tbTxEnable;\n\tbool\t\t\t\t\tbUpdate;\n\tbool\t\t\t\t\tbAuthenticator;\n\tu8\t\t\t\t\tPeerAddr[6];\n\tu8\t\t\t\t\tWapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\tu8\t\t\t\t\tWapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\tu8\t\t\t\t\tWapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\n\tWAPI_TRACE(WAPI_INIT, \"===========>%s\\n\", __FUNCTION__);\n\n\tif (!padapter->WapiSupport){\n\t    return;\n\t}\n\n\tcopy_from_user(data, buf, 43);\n\tbTxEnable = data[1];\n\tbAuthenticator = data[2];\n\tbUpdate = data[3];\n \tmemcpy(PeerAddr,data+4,6);\n\n\tif(data[0] == 0x3){\n\t\tif(!list_empty(&(pWapiInfo->wapiBKIDIdleList))){\n\t\t\tpWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);\n\t\t\tlist_del_init(&pWapiBkid->list);\n\t\t\tmemcpy(pWapiBkid->bkid, data+10, 16);\n\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - BKID\", pWapiBkid->bkid, 16);\n\t\t\tlist_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList);\n\t\t}\n\t}else{\n\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\tif(!memcmp(pWapiSta->PeerMacAddr,PeerAddr,6)){\n\t\t\t\tpWapiSta->bAuthenticatorInUpdata = false;\n\t\t\t\tswitch(data[0]){\n\t\t\t\tcase 1:              //usk\n\t\t\t\t\tif(bAuthenticator){         //authenticator\n\t\t\t\t\t\tmemcpy(pWapiSta->lastTxUnicastPN,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t\tif(!bUpdate) {     //first\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"AE fisrt set usk \\n\");\n\t\t\t\t\t\t\tpWapiSta->wapiUsk.bSet = true;\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.dataKey,data+10,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.micKey,data+26,16);\n\t\t\t\t\t\t\tpWapiSta->wapiUsk.keyId = *(data+42);\n\t\t\t\t\t\t\tpWapiSta->wapiUsk.bTxEnable = true;\n\t\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - AE USK Data Key\", pWapiSta->wapiUsk.dataKey, 16);\n\t\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - AE USK Mic Key\", pWapiSta->wapiUsk.micKey, 16);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse               //update\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT, \"AE update usk \\n\");\n\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bSet = true;\n\t\t\t\t\t\t\tpWapiSta->bAuthenticatorInUpdata = true;\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.keyId = *(data+42);\n\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tif(!bUpdate){\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"ASUE fisrt set usk \\n\");\n\t\t\t\t\t\t\tif(bTxEnable){\n\t\t\t\t\t\t\t\tpWapiSta->wapiUsk.bTxEnable = true;\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tpWapiSta->wapiUsk.bSet = true;\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.dataKey,data+10,16);\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.micKey,data+26,16);\n\t\t\t\t\t\t\t\tpWapiSta->wapiUsk.keyId = *(data+42);\n\t\t\t\t\t\t\t\tpWapiSta->wapiUsk.bTxEnable = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"ASUE update usk \\n\");\n\t\t\t\t\t\t\tif(bTxEnable){\n\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = true;\n\t\t\t\t\t\t\t\tif(pWapiSta->wapiUskUpdate.bSet){\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.dataKey,pWapiSta->wapiUskUpdate.dataKey,16);\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUsk.micKey,pWapiSta->wapiUskUpdate.micKey,16);\n\t\t\t\t\t\t\t\t\tpWapiSta->wapiUsk.keyId=pWapiSta->wapiUskUpdate.keyId;\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = false;\n\t\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bSet = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bSet = true;\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUskUpdate.dataKey,data+10,16);\n\t\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiUskUpdate.micKey,data+26,16);\n\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.keyId = *(data+42);\n\t\t\t\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\t\t//msk\n\t\t\t\t\tif(bAuthenticator){          //authenticator\n\t\t\t\t\t\tpWapiInfo->wapiTxMsk.bSet = true;\n\t\t\t\t\t\tmemcpy(pWapiInfo->wapiTxMsk.dataKey,data+10,16);\n\t\t\t\t\t\tmemcpy(pWapiInfo->wapiTxMsk.micKey,data+26,16);\n\t\t\t\t\t\tpWapiInfo->wapiTxMsk.keyId = *(data+42);\n\t\t\t\t\t\tpWapiInfo->wapiTxMsk.bTxEnable = true;\n\t\t\t\t\t\tmemcpy(pWapiInfo->lastTxMulticastPN,WapiAEMultiCastPNInitialValueSrc,16);\n\n\t\t\t\t\t\tif(!bUpdate){      //first\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT, \"AE fisrt set msk \\n\");\n\t\t\t\t\t\t\tif(!pWapiSta->bSetkeyOk)\n\t\t\t\t\t\t\t\tpWapiSta->bSetkeyOk = true;\n\t\t\t\t\t\t\tpWapiInfo->bFirstAuthentiateInProgress= false;\n\t\t\t\t\t\t}else{               //update\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"AE update msk \\n\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - AE MSK Data Key\", pWapiInfo->wapiTxMsk.dataKey, 16);\n\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - AE MSK Mic Key\", pWapiInfo->wapiTxMsk.micKey, 16);\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tif(!bUpdate){\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"ASUE fisrt set msk \\n\");\n\t\t\t\t\t\t\tpWapiSta->wapiMsk.bSet = true;\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiMsk.dataKey,data+10,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiMsk.micKey,data+26,16);\n\t\t\t\t\t\t\tpWapiSta->wapiMsk.keyId = *(data+42);\n\t\t\t\t\t\t\tpWapiSta->wapiMsk.bTxEnable = false;\n\t\t\t\t\t\t\tif(!pWapiSta->bSetkeyOk)\n\t\t\t\t\t\t\t\tpWapiSta->bSetkeyOk = true;\n\t\t\t\t\t\t\tpWapiInfo->bFirstAuthentiateInProgress= false;\n\t\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - ASUE MSK Data Key\", pWapiSta->wapiMsk.dataKey, 16);\n\t\t\t\t\t\t\tWAPI_DATA(WAPI_INIT, \"SetKey - ASUE MSK Mic Key\", pWapiSta->wapiMsk.micKey, 16);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_INIT,\"ASUE update msk \\n\");\n\t\t\t\t\t\t\tpWapiSta->wapiMskUpdate.bSet = true;\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiMskUpdate.dataKey,data+10,16);\n\t\t\t\t\t\t\tmemcpy(pWapiSta->wapiMskUpdate.micKey,data+26,16);\n\t\t\t\t\t\t\tpWapiSta->wapiMskUpdate.keyId = *(data+42);\n\t\t\t\t\t\t\tpWapiSta->wapiMskUpdate.bTxEnable = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tWAPI_TRACE(WAPI_ERR,\"Unknown Flag \\n\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tWAPI_TRACE(WAPI_INIT, \"<===========%s\\n\", __FUNCTION__);\n}\n\n\nvoid wapi_test_init(struct _adapter *padapter)\n{\n\tu8 keybuf[100];\n\tu8 mac_addr[6]={0x00,0xe0,0x4c,0x72,0x04,0x70};\n\tu8 UskDataKey[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};\n\tu8 UskMicKey[16]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};\n\tu8 UskId = 0;\n\tu8 MskDataKey[16]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f};\n\tu8 MskMicKey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f};\n\tu8 MskId = 0;\n\n\tWAPI_TRACE(WAPI_INIT, \"===========>%s\\n\", __FUNCTION__);\n\n\t//Enable Wapi\n\tWAPI_TRACE(WAPI_INIT, \"%s: Enable wapi!!!!\\n\", __FUNCTION__);\n\tpadapter->wapiInfo.bWapiEnable = true;\n\tpadapter->pairwise_key_type = KEY_TYPE_SMS4;\n\tieee->group_key_type = KEY_TYPE_SMS4;\n\tpadapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;\n\tpadapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;\n\n\t//set usk\n\tWAPI_TRACE(WAPI_INIT, \"%s: Set USK!!!!\\n\", __FUNCTION__);\n\tmemset(keybuf,0,100);\n\tkeybuf[0] = 1;                           //set usk\n\tkeybuf[1] = 1; \t\t\t\t//enable tx\n\tkeybuf[2] = 1; \t\t\t\t//AE\n\tkeybuf[3] = 0; \t\t\t\t//not update\n\n\tmemcpy(keybuf+4,mac_addr,6);\n\tmemcpy(keybuf+10,UskDataKey,16);\n\tmemcpy(keybuf+26,UskMicKey,16);\n\tkeybuf[42]=UskId;\n\twapi_test_set_key(padapter, keybuf);\n\n\tmemset(keybuf,0,100);\n\tkeybuf[0] = 1;                           //set usk\n\tkeybuf[1] = 1; \t\t\t\t//enable tx\n\tkeybuf[2] = 0; \t\t\t\t//AE\n\tkeybuf[3] = 0; \t\t\t\t//not update\n\n\tmemcpy(keybuf+4,mac_addr,6);\n\tmemcpy(keybuf+10,UskDataKey,16);\n\tmemcpy(keybuf+26,UskMicKey,16);\n\tkeybuf[42]=UskId;\n\twapi_test_set_key(padapter, keybuf);\n\n\t//set msk\n\tWAPI_TRACE(WAPI_INIT, \"%s: Set MSK!!!!\\n\", __FUNCTION__);\n\tmemset(keybuf,0,100);\n\tkeybuf[0] = 2;                                //set msk\n\tkeybuf[1] = 1;                               //Enable TX\n\tkeybuf[2] = 1; \t\t\t\t//AE\n\tkeybuf[3] = 0;                              //not update\n\tmemcpy(keybuf+4,mac_addr,6);\n\tmemcpy(keybuf+10,MskDataKey,16);\n\tmemcpy(keybuf+26,MskMicKey,16);\n\tkeybuf[42] = MskId;\n\twapi_test_set_key(padapter, keybuf);\n\n\tmemset(keybuf,0,100);\n\tkeybuf[0] = 2;                                //set msk\n\tkeybuf[1] = 1;                               //Enable TX\n\tkeybuf[2] = 0; \t\t\t\t//AE\n\tkeybuf[3] = 0;                              //not update\n\tmemcpy(keybuf+4,mac_addr,6);\n\tmemcpy(keybuf+10,MskDataKey,16);\n\tmemcpy(keybuf+26,MskMicKey,16);\n\tkeybuf[42] = MskId;\n\twapi_test_set_key(padapter, keybuf);\n\tWAPI_TRACE(WAPI_INIT, \"<===========%s\\n\", __FUNCTION__);\n}\n#endif\n\nvoid rtw_wapi_get_iv(_adapter *padapter,u8 *pRA, u8*IV)\n{\n\tPWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;\n       PRT_WAPI_T         pWapiInfo = &padapter->wapiInfo;\n\tbool\tbPNOverflow = false;\n\tbool\tbFindMatchPeer = false;\n\tPRT_WAPI_STA_INFO  pWapiSta = NULL;\n\n\tpWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV;\n\n\tWAPI_DATA(WAPI_RX,\"wapi_get_iv: pra\",pRA,6);\n\n\tif(IS_MCAST(pRA)){\n\t\tif(!pWapiInfo->wapiTxMsk.bTxEnable){\n\t\t\t WAPI_TRACE(WAPI_ERR,\"%s: bTxEnable = 0!!\\n\",__FUNCTION__);\n\t\t\t return;\n\t\t}\n\n\t\tif(pWapiInfo->wapiTxMsk.keyId <= 1){\n\t\t\t pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;\n\t\t\t pWapiExt->Reserved = 0;\n\t\t\t bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);\n\t\t\t memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(list_empty(&pWapiInfo->wapiSTAUsedList)){\n\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_get_iv: list is empty \\n\");\n\t\t\t_rtw_memset(IV,10,18);\n\t\t\treturn;\n\t\t}\n\t\telse{\n\t\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){\n\t\t\t\t\tWAPI_DATA(WAPI_RX,\"rtw_wapi_get_iv: peermacaddr \",pWapiSta->PeerMacAddr,6);\n\t\t\t\t\tif (_rtw_memcmp((u8*)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) {\n\t\t\t\t\t\tbFindMatchPeer = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tWAPI_TRACE(WAPI_RX,\"bFindMatchPeer: %d \\n\",bFindMatchPeer);\n\t\t\t\tWAPI_DATA(WAPI_RX,\"Addr\",pRA,6);\n\n\t\t\t\tif (bFindMatchPeer){\n\t\t\t\t\tif((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable))\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (pWapiSta->wapiUsk.keyId <= 1){\n\t\t\t\t\t\tif(pWapiSta->wapiUskUpdate.bTxEnable)\n\t\t\t\t\t\t\tpWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;\n\n\t\t\t\t\t\tpWapiExt->Reserved = 0;\n\t\t\t\t\t\tbPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);\n\t\t\t\t\t\t_rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\n\t}\n\n}\n\nbool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA)\n{\n\tPRT_WAPI_T         pWapiInfo = &padapter->wapiInfo;\n\tbool\t\t\t\tbFindMatchPeer = false;\n\tbool\t\t\t\tbDrop = false;\n\tPRT_WAPI_STA_INFO  pWapiSta = NULL;\n\tstruct security_priv \t\t*psecuritypriv = &padapter->securitypriv;\n\n\tWAPI_DATA(WAPI_RX,\"rtw_wapi_drop_for_key_absent: ra \",pRA,6);\n\n\tif(psecuritypriv->dot11PrivacyAlgrthm == _SMS4_)\n\t{\n\t\tif ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))\n\t\t\treturn true;\n\n\t\tif(IS_MCAST(pRA)){\n\t\t\tif(!pWapiInfo->wapiTxMsk.bTxEnable){\n\t\t\t\tbDrop = true;\n\t\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_drop_for_key_absent: multicast key is absent \\n\");\n\t\t\t\treturn bDrop;\n\t\t\t}\n\t\t}\n\t\telse{\n\t\t\t\tif(!list_empty(&pWapiInfo->wapiSTAUsedList)){\n\t\t\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list){\n\t\t\t\t\t\tWAPI_DATA(WAPI_RX,\"rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr \",pWapiSta->PeerMacAddr,6);\n\t\t\t\t\t\tif (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE){\n\t\t\t\t\t\t\tbFindMatchPeer = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (bFindMatchPeer)\t{\n\t\t\t\t\t\tif (!pWapiSta->wapiUsk.bTxEnable){\n\t\t\t\t\t\t\tbDrop = true;\n\t\t\t\t\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_drop_for_key_absent: unicast key is absent \\n\");\n\t\t\t\t\t\t\treturn bDrop;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tbDrop = true;\n\t\t\t\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_drop_for_key_absent: no peer find \\n\");\n\t\t\t\t\t\treturn bDrop;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t\tbDrop = true;\n\t\t\t\t\t\tWAPI_TRACE(WAPI_RX,\"rtw_wapi_drop_for_key_absent: no sta  exist \\n\");\n\t\t\t\t\t\treturn bDrop;\n\t\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn bDrop;\n\t}\n\n\treturn bDrop;\n}\n\n#endif\n"
  },
  {
    "path": "core/rtw_wapi_sms4.c",
    "content": "#ifdef CONFIG_WAPI_SUPPORT\n\n#include <linux/unistd.h>\n#include <linux/etherdevice.h>\n#include <drv_types.h>\n#include <rtw_wapi.h>\n\n\n#ifdef CONFIG_WAPI_SW_SMS4\n\n#define WAPI_LITTLE_ENDIAN\n//#define BIG_ENDIAN\n#define ENCRYPT  0\n#define DECRYPT  1\n\n\n/**********************************************************\n **********************************************************/\nconst u8 Sbox[256] = {\n0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,\n0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,\n0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,\n0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,\n0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,\n0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,\n0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,\n0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,\n0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,\n0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,\n0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,\n0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,\n0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,\n0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,\n0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,\n0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48\n};\n\nconst u32 CK[32] = {\n\t0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,\n\t0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,\n\t0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,\n\t0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,\n\t0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,\n\t0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,\n\t0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,\n\t0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };\n\n#define Rotl(_x, _y) (((_x) << (_y)) | ((_x) >> (32 - (_y))))\n\n#define ByteSub(_A) (Sbox[(_A) >> 24 & 0xFF] << 24 | \\\n                     Sbox[(_A) >> 16 & 0xFF] << 16 | \\\n                     Sbox[(_A) >>  8 & 0xFF] <<  8 | \\\n                     Sbox[(_A) & 0xFF])\n\n#define L1(_B) ((_B) ^ Rotl(_B, 2) ^ Rotl(_B, 10) ^ Rotl(_B, 18) ^ Rotl(_B, 24))\n#define L2(_B) ((_B) ^ Rotl(_B, 13) ^ Rotl(_B, 23))\n\nstatic void\nxor_block(void *dst, void *src1, void *src2)\n/* 128-bit xor: *dst = *src1 xor *src2. Pointers must be 32-bit aligned  */\n{\n    ((u32 *)dst)[0] = ((u32 *)src1)[0] ^ ((u32 *)src2)[0];\n    ((u32 *)dst)[1] = ((u32 *)src1)[1] ^ ((u32 *)src2)[1];\n    ((u32 *)dst)[2] = ((u32 *)src1)[2] ^ ((u32 *)src2)[2];\n    ((u32 *)dst)[3] = ((u32 *)src1)[3] ^ ((u32 *)src2)[3];\n}\n\n\nvoid SMS4Crypt(u8 *Input, u8 *Output, u32 *rk)\n{\n\t u32 r, mid, x0, x1, x2, x3, *p;\n\t p = (u32 *)Input;\n\t x0 = p[0];\n\t x1 = p[1];\n\t x2 = p[2];\n\t x3 = p[3];\n#ifdef WAPI_LITTLE_ENDIAN\n\t x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\n\t x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\n\t x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\n\t x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\n#endif\n\t for (r = 0; r < 32; r += 4)\n\t {\n\t\t  mid = x1 ^ x2 ^ x3 ^ rk[r + 0];\n\t\t  mid = ByteSub(mid);\n\t\t  x0 ^= L1(mid);\n\t\t  mid = x2 ^ x3 ^ x0 ^ rk[r + 1];\n\t\t  mid = ByteSub(mid);\n\t\t  x1 ^= L1(mid);\n\t\t  mid = x3 ^ x0 ^ x1 ^ rk[r + 2];\n\t\t  mid = ByteSub(mid);\n\t\t  x2 ^= L1(mid);\n\t\t  mid = x0 ^ x1 ^ x2 ^ rk[r + 3];\n\t\t  mid = ByteSub(mid);\n\t\t  x3 ^= L1(mid);\n\t }\n#ifdef WAPI_LITTLE_ENDIAN\n\t x0 = Rotl(x0, 16); x0 = ((x0 & 0x00FF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\n\t x1 = Rotl(x1, 16); x1 = ((x1 & 0x00FF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\n\t x2 = Rotl(x2, 16); x2 = ((x2 & 0x00FF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\n\t x3 = Rotl(x3, 16); x3 = ((x3 & 0x00FF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\n#endif\n\t p = (u32 *)Output;\n\t p[0] = x3;\n\t p[1] = x2;\n\t p[2] = x1;\n\t p[3] = x0;\n}\n\n\n\nvoid SMS4KeyExt(u8 *Key, u32 *rk, u32 CryptFlag)\n{\n\t u32 r, mid, x0, x1, x2, x3, *p;\n\n\t p = (u32 *)Key;\n\t x0 = p[0];\n\t x1 = p[1];\n\t x2 = p[2];\n\t x3 = p[3];\n#ifdef WAPI_LITTLE_ENDIAN\n\t x0 = Rotl(x0, 16); x0 = ((x0 & 0xFF00FF) << 8) | ((x0 & 0xFF00FF00) >> 8);\n\t x1 = Rotl(x1, 16); x1 = ((x1 & 0xFF00FF) << 8) | ((x1 & 0xFF00FF00) >> 8);\n\t x2 = Rotl(x2, 16); x2 = ((x2 & 0xFF00FF) << 8) | ((x2 & 0xFF00FF00) >> 8);\n\t x3 = Rotl(x3, 16); x3 = ((x3 & 0xFF00FF) << 8) | ((x3 & 0xFF00FF00) >> 8);\n#endif\n\n\t x0 ^= 0xa3b1bac6;\n\t x1 ^= 0x56aa3350;\n\t x2 ^= 0x677d9197;\n\t x3 ^= 0xb27022dc;\n\t for (r = 0; r < 32; r += 4)\n\t {\n\t\t  mid = x1 ^ x2 ^ x3 ^ CK[r + 0];\n\t\t  mid = ByteSub(mid);\n\t\t  rk[r + 0] = x0 ^= L2(mid);\n\t\t  mid = x2 ^ x3 ^ x0 ^ CK[r + 1];\n\t\t  mid = ByteSub(mid);\n\t\t  rk[r + 1] = x1 ^= L2(mid);\n\t\t  mid = x3 ^ x0 ^ x1 ^ CK[r + 2];\n\t\t  mid = ByteSub(mid);\n\t\t  rk[r + 2] = x2 ^= L2(mid);\n\t\t  mid = x0 ^ x1 ^ x2 ^ CK[r + 3];\n\t\t  mid = ByteSub(mid);\n\t\t  rk[r + 3] = x3 ^= L2(mid);\n\t }\n\t if (CryptFlag == DECRYPT)\n\t {\n\t \t  for (r = 0; r < 16; r++)\n\t \t  \t mid = rk[r], rk[r] = rk[31 - r], rk[31 - r] = mid;\n\t }\n}\n\n\nvoid WapiSMS4Cryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\n                                                u8 *Output, u16 *OutputLength, u32 CryptFlag)\n{\n\tu32 blockNum,i,j, rk[32];\n\tu16 remainder;\n\tu8 blockIn[16],blockOut[16], tempIV[16], k;\n\n\t*OutputLength = 0;\n\tremainder = InputLength & 0x0F;\n\tblockNum = InputLength >> 4;\n\tif(remainder !=0)\n\t\tblockNum++;\n\telse\n\t\tremainder = 16;\n\n\tfor(k=0;k<16;k++)\n\t\ttempIV[k] = IV[15-k];\n\n\tmemcpy(blockIn, tempIV, 16);\n\n      SMS4KeyExt((u8 *)Key, rk,CryptFlag);\n\n\tfor(i=0; i<blockNum-1; i++)\n\t{\n\t\tSMS4Crypt((u8 *)blockIn, blockOut, rk);\n             xor_block(&Output[i*16], &Input[i*16], blockOut);\n\t\tmemcpy(blockIn,blockOut,16);\n\t}\n\n\t*OutputLength = i*16;\n\n\tSMS4Crypt((u8 *)blockIn, blockOut, rk);\n\n\tfor(j=0; j<remainder; j++)\n\t{\n\t\tOutput[i*16+j] = Input[i*16+j] ^ blockOut[j];\n\t}\n      *OutputLength += remainder;\n\n}\n\nvoid WapiSMS4Encryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\n                                                    u8 *Output, u16 *OutputLength)\n{\n\n\tWapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT);\n}\n\nvoid WapiSMS4Decryption(u8 *Key, u8 *IV, u8 *Input, u16 InputLength,\n                                                    u8 *Output, u16 *OutputLength)\n{\n\t// OFB mode: is also ENCRYPT flag\n\tWapiSMS4Cryption(Key, IV, Input, InputLength, Output, OutputLength, ENCRYPT);\n}\n\nvoid WapiSMS4CalculateMic(u8 *Key, u8 *IV, u8 *Input1, u8 Input1Length,\n                                                 u8 *Input2, u16 Input2Length, u8 *Output, u8 *OutputLength)\n{\n\tu32 blockNum, i, remainder, rk[32];\n\tu8 BlockIn[16], BlockOut[16], TempBlock[16], tempIV[16], k;\n\n\t*OutputLength = 0;\n\tremainder = Input1Length & 0x0F;\n\tblockNum = Input1Length >> 4;\n\n\tfor(k=0;k<16;k++)\n\t\ttempIV[k] = IV[15-k];\n\n\tmemcpy(BlockIn, tempIV, 16);\n\n\tSMS4KeyExt((u8 *)Key, rk, ENCRYPT);\n\n\tSMS4Crypt((u8 *)BlockIn, BlockOut, rk);\n\n\tfor(i=0; i<blockNum; i++){\n\t\txor_block(BlockIn, (Input1+i*16), BlockOut);\n\t\tSMS4Crypt((u8 *)BlockIn, BlockOut, rk);\n\t}\n\n\tif(remainder !=0){\n\t\tmemset(TempBlock, 0, 16);\n\t\tmemcpy(TempBlock, (Input1+blockNum*16), remainder);\n\n\t\txor_block(BlockIn, TempBlock, BlockOut);\n\t\tSMS4Crypt((u8 *)BlockIn, BlockOut, rk);\n      }\n\n\tremainder = Input2Length & 0x0F;\n\tblockNum = Input2Length >> 4;\n\n  \tfor(i=0; i<blockNum; i++){\n\t\txor_block(BlockIn, (Input2+i*16), BlockOut);\n\t\tSMS4Crypt((u8 *)BlockIn, BlockOut, rk);\n\t}\n\n\tif(remainder !=0){\n\t\tmemset(TempBlock, 0, 16);\n\t\tmemcpy(TempBlock, (Input2+blockNum*16), remainder);\n\n\t\txor_block(BlockIn, TempBlock, BlockOut);\n\t\tSMS4Crypt((u8 *)BlockIn, BlockOut, rk);\n\t}\n\n\tmemcpy(Output, BlockOut, 16);\n\t*OutputLength = 16;\n}\n\nvoid SecCalculateMicSMS4(\n\tu8\t\tKeyIdx,\n\tu8        *MicKey,\n\tu8        *pHeader,\n\tu8        *pData,\n\tu16       DataLen,\n\tu8        *MicBuffer\n\t)\n{\n#if 0\n\tstruct ieee80211_hdr_3addr_qos *header;\n\tu8 TempBuf[34], TempLen = 32, MicLen, QosOffset, *IV;\n\tu16 *pTemp, fc;\n\n\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"=========>%s\\n\", __FUNCTION__);\n\n\theader = (struct ieee80211_hdr_3addr_qos *)pHeader;\n\tmemset(TempBuf, 0, 34);\n\tmemcpy(TempBuf, pHeader, 2); //FrameCtrl\n\tpTemp = (u16*)TempBuf;\n\t*pTemp &= 0xc78f;       //bit4,5,6,11,12,13\n\n\tmemcpy((TempBuf+2), (pHeader+4), 12); //Addr1, Addr2\n\tmemcpy((TempBuf+14), (pHeader+22), 2); // SeqCtrl\n\tpTemp = (u16*)(TempBuf + 14);\n\t*pTemp &= 0x000f;\n\n\tmemcpy((TempBuf+16), (pHeader+16), 6); //Addr3\n\n\tfc = le16_to_cpu(header->frame_ctl);\n\n\n\n\tif (GetFrDs((u16*)&fc) && GetToDs((u16 *)&fc))\n\t{\n\t\tmemcpy((TempBuf+22), (pHeader+24), 6);\n\t\tQosOffset = 30;\n\t}else{\n\t\tmemset((TempBuf+22), 0, 6);\n\t\tQosOffset = 24;\n\t}\n\n\tif((fc & 0x0088) == 0x0088){\n\t\tmemcpy((TempBuf+28), (pHeader+QosOffset), 2);\n\t\tTempLen += 2;\n\t\t//IV = pHeader + QosOffset + 2 + SNAP_SIZE + sizeof(u16) + 2;\n\t\tIV = pHeader + QosOffset + 2 + 2;\n\t}else{\n\t\tIV = pHeader + QosOffset + 2;\n\t\t//IV = pHeader + QosOffset + SNAP_SIZE + sizeof(u16) + 2;\n\t}\n\n\tTempBuf[TempLen-1] = (u8)(DataLen & 0xff);\n\tTempBuf[TempLen-2] = (u8)((DataLen & 0xff00)>>8);\n\tTempBuf[TempLen-4] = KeyIdx;\n\n\tWAPI_DATA(WAPI_TX, \"CalculateMic - KEY\", MicKey, 16);\n\tWAPI_DATA(WAPI_TX, \"CalculateMic - IV\", IV, 16);\n\tWAPI_DATA(WAPI_TX, \"CalculateMic - TempBuf\", TempBuf, TempLen);\n\tWAPI_DATA(WAPI_TX, \"CalculateMic - pData\", pData, DataLen);\n\n\tWapiSMS4CalculateMic(MicKey, IV, TempBuf, TempLen,\n\t                                             pData, DataLen, MicBuffer, &MicLen);\n\n\tif (MicLen != 16)\n\t\tWAPI_TRACE(WAPI_ERR,\"%s: MIC Length Error!!\\n\",__FUNCTION__);\n\n\tWAPI_TRACE(WAPI_TX|WAPI_RX, \"<=========%s\\n\", __FUNCTION__);\n#endif\n}\n\n/* AddCount: 1 or 2.\n *  If overflow, return 1,\n *  else return 0.\n */\nu8 WapiIncreasePN(u8 *PN, u8 AddCount)\n{\n\tu8  i;\n\n\tif (NULL == PN)\n\t\treturn 1;\n\t//YJ,test,091102\n\t/*\n\tif(AddCount == 2){\n\t\tDBG_8192C(\"############################%s(): PN[0]=0x%x\\n\", __FUNCTION__, PN[0]);\n\t\tif(PN[0] == 0x48){\n\t\t\tPN[0] += AddCount;\n\t\t\treturn 1;\n\t\t}else{\n\t\t\tPN[0] += AddCount;\n\t\t\treturn 0;\n\t\t}\n\t}\n\t*/\n\t//YJ,test,091102,end\n\n\tfor (i=0; i<16; i++)\n\t{\n\t\tif (PN[i] + AddCount <= 0xff)\n\t\t{\n\t\t\tPN[i] += AddCount;\n\t\t\treturn 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPN[i] += AddCount;\n\t\t\tAddCount = 1;\n\t\t}\n\t}\n\treturn 1;\n}\n\n\nvoid WapiGetLastRxUnicastPNForQoSData(\n\tu8 \t\t\tUserPriority,\n\tPRT_WAPI_STA_INFO    pWapiStaInfo,\n\tu8 *PNOut\n)\n{\n\tWAPI_TRACE(WAPI_RX, \"===========> %s\\n\", __FUNCTION__);\n\tswitch(UserPriority)\n\t{\n\t\tcase 0:\n\t\tcase 3:\n\t\t\t      memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBEQueue,16);\n\t\t\t      break;\n\t\tcase 1:\n\t\tcase 2:\n\t\t\t      memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNBKQueue,16);\n\t\t\t      break;\n\t\tcase 4:\n\t\tcase 5:\n\t\t\t      memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVIQueue,16);\n\t\t\t      break;\n\t\tcase 6:\n\t\tcase 7:\n\t\t\t      memcpy(PNOut,pWapiStaInfo->lastRxUnicastPNVOQueue,16);\n\t\t\t      break;\n\t\tdefault:\n\t\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: Unknown TID \\n\", __FUNCTION__);\n\t\t\t\tbreak;\n\t}\n\tWAPI_TRACE(WAPI_RX, \"<=========== %s\\n\", __FUNCTION__);\n}\n\n\nvoid WapiSetLastRxUnicastPNForQoSData(\n\tu8 \t\tUserPriority,\n\tu8           *PNIn,\n\tPRT_WAPI_STA_INFO    pWapiStaInfo\n)\n{\n\tWAPI_TRACE(WAPI_RX, \"===========> %s\\n\", __FUNCTION__);\n\tswitch(UserPriority)\n\t{\n\t\tcase 0:\n\t\tcase 3:\n\t\t\t      memcpy(pWapiStaInfo->lastRxUnicastPNBEQueue,PNIn,16);\n\t\t\t      break;\n\t\tcase 1:\n\t\tcase 2:\n\t\t\t      memcpy(pWapiStaInfo->lastRxUnicastPNBKQueue,PNIn,16);\n\t\t\t      break;\n\t\tcase 4:\n\t\tcase 5:\n\t\t\t      memcpy(pWapiStaInfo->lastRxUnicastPNVIQueue,PNIn,16);\n\t\t\t      break;\n\t\tcase 6:\n\t\tcase 7:\n\t\t\t      memcpy(pWapiStaInfo->lastRxUnicastPNVOQueue,PNIn,16);\n\t\t\t      break;\n\t\tdefault:\n\t\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: Unknown TID \\n\", __FUNCTION__);\n\t\t\t\tbreak;\n\t}\n\tWAPI_TRACE(WAPI_RX, \"<=========== %s\\n\", __FUNCTION__);\n}\n\n\n/****************************************************************************\n FALSE not RX-Reorder\n TRUE do RX Reorder\nadd to support WAPI to N-mode\n*****************************************************************************/\nu8 WapiCheckPnInSwDecrypt(\n\t_adapter *padapter,\n\tstruct sk_buff *pskb\n)\n{\n\tu8 \t\t\t\tret = false;\n\n#if 0\n\tstruct ieee80211_hdr_3addr_qos *header;\n\tu16 \t\t\t\tfc;\n\tu8\t\t\t\t*pDaddr, *pTaddr, *pRaddr;\n\n\theader = (struct ieee80211_hdr_3addr_qos *)pskb->data;\n\tpTaddr = header->addr2;\n\tpRaddr = header->addr1;\n\tfc = le16_to_cpu(header->frame_ctl);\n\n\tif(GetToDs(&fc))\n\t\tpDaddr = header->addr3;\n\telse\n\t\tpDaddr = header->addr1;\n\n\tif ((_rtw_memcmp(pRaddr, padapter->pnetdev->dev_addr, ETH_ALEN) == 0)\n\t\t&&\t! (pDaddr)\n\t\t&& (GetFrameType(&fc) == WIFI_QOS_DATA_TYPE))\n\t\t//&& ieee->pHTInfo->bCurrentHTSupport &&\n\t\t//ieee->pHTInfo->bCurRxReorderEnable)\n\t\tret = false;\n\telse\n\t\tret = true;\n#endif\n\tWAPI_TRACE(WAPI_RX, \"%s: return %d\\n\", __FUNCTION__, ret);\n\treturn ret;\n}\n\nint SecSMS4HeaderFillIV(_adapter *padapter, u8 *pxmitframe)\n{\n\tstruct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;\n\tu8 * frame = ((struct xmit_frame *)pxmitframe)->buf_addr + TXDESC_OFFSET;\n\tu8 *pSecHeader = NULL, *pos = NULL, *pRA = NULL;\n\tu8 bPNOverflow = false, bFindMatchPeer = false, hdr_len = 0;\n\tPWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;\n\tPRT_WAPI_T         pWapiInfo = &padapter->wapiInfo;\n\tPRT_WAPI_STA_INFO  pWapiSta = NULL;\n\tint ret = 0;\n\n\tWAPI_TRACE(WAPI_TX, \"=========>%s\\n\", __FUNCTION__);\n\n\treturn ret;\n#if 0\n\thdr_len = sMacHdrLng;\n\tif (GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE)\n\t{\n\t\thdr_len += 2;\n\t}\n\t//hdr_len += SNAP_SIZE + sizeof(u16);\n\n\tpos = skb_push(pskb, padapter->wapiInfo.extra_prefix_len);\n\tmemmove(pos, pos+padapter->wapiInfo.extra_prefix_len, hdr_len);\n\n\tpSecHeader = pskb->data + hdr_len;\n\tpWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)pSecHeader;\n\tpRA = pskb->data + 4;\n\n\tWAPI_DATA(WAPI_TX, \"FillIV - Before Fill IV\", pskb->data, pskb->len);\n\n\t//Address 1 is always receiver's address\n\tif( IS_MCAST(pRA) ){\n\t\tif(!pWapiInfo->wapiTxMsk.bTxEnable){\n\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: bTxEnable = 0!!\\n\",__FUNCTION__);\n\t\t\treturn -2;\n\t\t}\n\t\tif(pWapiInfo->wapiTxMsk.keyId <= 1){\n\t\t\tpWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;\n\t\t\tpWapiExt->Reserved = 0;\n\t\t\tbPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);\n\t\t\tmemcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);\n\t\t\tif (bPNOverflow){\n\t\t\t\t// Update MSK Notification.\n\t\t\t\tWAPI_TRACE(WAPI_ERR,\"===============>%s():multicast PN overflow\\n\",__FUNCTION__);\n\t\t\t\trtw_wapi_app_event_handler(padapter,NULL,0,pRA, false, false, true, 0, false);\n\t\t\t}\n\t\t}else{\n\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: Invalid Wapi Multicast KeyIdx!!\\n\",__FUNCTION__);\n\t\t\tret = -3;\n\t\t}\n\t}\n    \telse{\n\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\tif(!memcmp(pWapiSta->PeerMacAddr,pRA,6)){\n    \t\t\t\tbFindMatchPeer = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (bFindMatchPeer){\n\t\t\tif((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable)){\n\t\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: bTxEnable = 0!!\\n\",__FUNCTION__);\n\t\t\t\treturn -4;\n\t\t\t}\n\t\t\tif (pWapiSta->wapiUsk.keyId <= 1){\n\t\t\t\tif(pWapiSta->wapiUskUpdate.bTxEnable)\n\t\t\t\t\tpWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;\n\t\t\t\telse\n\t\t\t\t\tpWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;\n\n\t\t\t\tpWapiExt->Reserved = 0;\n\t\t\t\tbPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);\n\t\t\t\tmemcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);\n\t\t\t\tif (bPNOverflow){\n\t\t\t\t\t// Update USK Notification.\n\t\t\t\t\tWAPI_TRACE(WAPI_ERR,\"===============>%s():unicast PN overflow\\n\",__FUNCTION__);\n\t\t\t\t\trtw_wapi_app_event_handler(padapter,NULL,0,pWapiSta->PeerMacAddr, false, true, false, 0, false);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: Invalid Wapi Unicast KeyIdx!!\\n\",__FUNCTION__);\n\t\t\t\tret = -5;\n\t\t\t}\n\t\t}\n\t\telse{\n\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: Can not find Peer Sta \"MAC_FMT\"!!\\n\",__FUNCTION__, MAC_ARG(pRA));\n\t\t\tret = -6;\n\t\t}\n    \t}\n\n\tWAPI_DATA(WAPI_TX, \"FillIV - After Fill IV\", pskb->data, pskb->len);\n\tWAPI_TRACE(WAPI_TX, \"<=========%s\\n\", __FUNCTION__);\n\treturn ret;\n#endif\n}\n\n// WAPI SW Enc: must have done Coalesce!\nvoid SecSWSMS4Encryption(\n\t_adapter *padapter,\n\tu8 * pxmitframe\n\t)\n{\n\tPRT_WAPI_T\t\tpWapiInfo = &padapter->wapiInfo;\n\tPRT_WAPI_STA_INFO   pWapiSta = NULL;\n\tu8 *pframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_SIZE;\n\tstruct pkt_attrib *pattrib = &((struct xmit_frame*)pxmitframe)->attrib;\n\n\tu8 *SecPtr = NULL, *pRA, *pMicKey = NULL, *pDataKey = NULL, *pIV = NULL;\n\tu8 IVOffset, DataOffset, bFindMatchPeer = false, KeyIdx = 0, MicBuffer[16];\n\tu16 OutputLength;\n\n\tWAPI_TRACE(WAPI_TX, \"=========>%s\\n\", __FUNCTION__);\n\n\tWAPI_TRACE(WAPI_TX,\"hdrlen: %d \\n\",pattrib->hdrlen);\n\n\treturn;\n\n\tDataOffset = pattrib->hdrlen + pattrib->iv_len;\n\n\tpRA = pframe + 4;\n\n\n\tif( IS_MCAST(pRA) ){\n\t\tKeyIdx = pWapiInfo->wapiTxMsk.keyId;\n\t\tpIV = pWapiInfo->lastTxMulticastPN;\n\t\tpMicKey = pWapiInfo->wapiTxMsk.micKey;\n\t\tpDataKey = pWapiInfo->wapiTxMsk.dataKey;\n\t}else{\n\t\tif (!list_empty(&(pWapiInfo->wapiSTAUsedList))){\n\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\t\tif (0 == memcmp(pWapiSta->PeerMacAddr, pRA, 6)){\n\t\t\t\t\tbFindMatchPeer = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bFindMatchPeer){\n\t\t\t\tif (pWapiSta->wapiUskUpdate.bTxEnable){\n\t\t\t\t\tKeyIdx = pWapiSta->wapiUskUpdate.keyId;\n\t\t\t\t\tWAPI_TRACE(WAPI_TX, \"%s(): Use update USK!! KeyIdx=%d\\n\", __FUNCTION__, KeyIdx);\n\t\t\t\t\tpIV = pWapiSta->lastTxUnicastPN;\n\t\t\t\t\tpMicKey = pWapiSta->wapiUskUpdate.micKey;\n\t\t\t\t\tpDataKey = pWapiSta->wapiUskUpdate.dataKey;\n\t\t\t\t}else{\n\t\t\t\t\tKeyIdx = pWapiSta->wapiUsk.keyId;\n\t\t\t\t\tWAPI_TRACE(WAPI_TX, \"%s(): Use USK!! KeyIdx=%d\\n\", __FUNCTION__, KeyIdx);\n\t\t\t\t\tpIV = pWapiSta->lastTxUnicastPN;\n\t\t\t\t\tpMicKey = pWapiSta->wapiUsk.micKey;\n\t\t\t\t\tpDataKey = pWapiSta->wapiUsk.dataKey;\n\t\t\t\t}\n  \t\t\t}else{\n\t\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: Can not find Peer Sta!!\\n\",__FUNCTION__);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\tWAPI_TRACE(WAPI_ERR,\"%s: wapiSTAUsedList is empty!!\\n\",__FUNCTION__);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tSecPtr = pframe;\n\tSecCalculateMicSMS4(KeyIdx, pMicKey, SecPtr, (SecPtr+DataOffset), pattrib->pktlen, MicBuffer);\n\n\tWAPI_DATA(WAPI_TX, \"Encryption - MIC\", MicBuffer, padapter->wapiInfo.extra_postfix_len);\n\n\tmemcpy(pframe+pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen-pattrib->icv_len,\n\t\t\t(u8 *)MicBuffer,\n\t\t\tpadapter->wapiInfo.extra_postfix_len\n\t\t\t);\n\n\n\tWapiSMS4Encryption(pDataKey, pIV, (SecPtr+DataOffset),pattrib->pktlen+pattrib->icv_len, (SecPtr+DataOffset), &OutputLength);\n\n\tWAPI_DATA(WAPI_TX, \"Encryption - After SMS4 encryption\",pframe,pattrib->hdrlen+pattrib->iv_len+pattrib->pktlen);\n\n\tWAPI_TRACE(WAPI_TX, \"<=========%s\\n\", __FUNCTION__);\n}\n\nu8 SecSWSMS4Decryption(\n\t_adapter *padapter,\n\tu8 \t\t*precv_frame,\n\tstruct recv_priv *precv_priv\n\t)\n{\n\tPRT_WAPI_T pWapiInfo = &padapter->wapiInfo;\n\tstruct recv_frame_hdr *precv_hdr;\n\tPRT_WAPI_STA_INFO   pWapiSta = NULL;\n\tu8 IVOffset, DataOffset, bFindMatchPeer = false, bUseUpdatedKey = false;\n\tu8 KeyIdx, MicBuffer[16], lastRxPNforQoS[16];\n\tu8 *pRA, *pTA, *pMicKey, *pDataKey, *pLastRxPN, *pRecvPN, *pSecData, *pRecvMic, *pos;\n\tu8 TID = 0;\n\tu16 OutputLength, DataLen;\n\tu8   bQosData;\n\tstruct sk_buff * \tpskb;\n\n\tWAPI_TRACE(WAPI_RX, \"=========>%s\\n\", __FUNCTION__);\n\n\treturn 0;\n\n\tprecv_hdr = &((union recv_frame*)precv_frame)->u.hdr;\n\tpskb = (struct sk_buff *)(precv_hdr->rx_data);\n\tprecv_hdr->bWapiCheckPNInDecrypt = WapiCheckPnInSwDecrypt(padapter, pskb);\n\tWAPI_TRACE(WAPI_RX, \"=========>%s: check PN  %d\\n\", __FUNCTION__,precv_hdr->bWapiCheckPNInDecrypt);\n\tWAPI_DATA(WAPI_RX, \"Decryption - Before decryption\", pskb->data, pskb->len);\n\n\tIVOffset = sMacHdrLng;\n\tbQosData = GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE;\n\tif (bQosData){\n\t\tIVOffset += 2;\n\t}\n\n\t//if(GetHTC())\n\t//\tIVOffset += 4;\n\n\t//IVOffset += SNAP_SIZE + sizeof(u16);\n\n\tDataOffset = IVOffset + padapter->wapiInfo.extra_prefix_len;\n\n\tpRA = pskb->data + 4;\n\tpTA = pskb->data + 10;\n\tKeyIdx = *(pskb->data + IVOffset);\n\tpRecvPN = pskb->data + IVOffset + 2;\n\tpSecData = pskb->data + DataOffset;\n\tDataLen = pskb->len - DataOffset;\n\tpRecvMic = pskb->data + pskb->len - padapter->wapiInfo.extra_postfix_len;\n\tTID = GetTid(pskb->data);\n\n\tif (!list_empty(&(pWapiInfo->wapiSTAUsedList))){\n\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\tif (0 == memcmp(pWapiSta->PeerMacAddr, pTA, 6)){\n\t\t\t\tbFindMatchPeer = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!bFindMatchPeer){\n\t\tWAPI_TRACE(WAPI_ERR, \"%s: Can not find Peer Sta \"MAC_FMT\" for Key Info!!!\\n\", __FUNCTION__, MAC_ARG(pTA));\n\t\treturn false;\n\t}\n\n\tif( IS_MCAST(pRA) ){\n\t\tWAPI_TRACE(WAPI_RX, \"%s: Multicast decryption !!!\\n\", __FUNCTION__);\n\t\tif (pWapiSta->wapiMsk.keyId == KeyIdx && pWapiSta->wapiMsk.bSet){\n\t\t\tpLastRxPN = pWapiSta->lastRxMulticastPN;\n\t\t\tif (!WapiComparePN(pRecvPN, pLastRxPN)){\n\t\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: MSK PN is not larger than last, Dropped!!!\\n\", __FUNCTION__);\n\t\t\t\tWAPI_DATA(WAPI_ERR, \"pRecvPN:\", pRecvPN, 16);\n\t\t\t\tWAPI_DATA(WAPI_ERR, \"pLastRxPN:\", pLastRxPN, 16);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tmemcpy(pLastRxPN, pRecvPN, 16);\n\t\t\tpMicKey = pWapiSta->wapiMsk.micKey;\n\t\t\tpDataKey = pWapiSta->wapiMsk.dataKey;\n\t\t}else if (pWapiSta->wapiMskUpdate.keyId == KeyIdx && pWapiSta->wapiMskUpdate.bSet){\n\t\t\tWAPI_TRACE(WAPI_RX, \"%s: Use Updated MSK for Decryption !!!\\n\", __FUNCTION__);\n\t\t\tbUseUpdatedKey = true;\n\t\t\tmemcpy(pWapiSta->lastRxMulticastPN, pRecvPN, 16);\n\t\t\tpMicKey = pWapiSta->wapiMskUpdate.micKey;\n\t\t\tpDataKey = pWapiSta->wapiMskUpdate.dataKey;\n\t\t}else{\n\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: Can not find MSK with matched KeyIdx(%d), Dropped !!!\\n\", __FUNCTION__,KeyIdx);\n\t\t\treturn false;\n\t\t}\n\t}\n\telse{\n\t\tWAPI_TRACE(WAPI_RX, \"%s: Unicast decryption !!!\\n\", __FUNCTION__);\n\t\tif (pWapiSta->wapiUsk.keyId == KeyIdx && pWapiSta->wapiUsk.bSet){\n\t\t\tWAPI_TRACE(WAPI_RX, \"%s: Use USK for Decryption!!!\\n\", __FUNCTION__);\n\t\t\tif(precv_hdr->bWapiCheckPNInDecrypt){\n\t\t\t\tif(GetFrameType(pskb->data) == WIFI_QOS_DATA_TYPE){\n\t\t\t\t\tWapiGetLastRxUnicastPNForQoSData(TID, pWapiSta, lastRxPNforQoS);\n\t\t\t\t\tpLastRxPN = lastRxPNforQoS;\n\t\t\t\t}else{\n\t\t\t\t\tpLastRxPN = pWapiSta->lastRxUnicastPN;\n\t\t\t\t}\n\t\t\t\tif (!WapiComparePN(pRecvPN, pLastRxPN)){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif(bQosData){\n\t\t\t\t\tWapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta);\n\t\t\t\t}else{\n\t\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tmemcpy(precv_hdr->WapiTempPN,pRecvPN,16);\n\t\t\t}\n\n\t\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE))\n\t\t\t{\n\t\t\t\tif ((pRecvPN[0] & 0x1) == 0){\n\t\t\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: Rx USK PN is not odd when Infra STA mode, Dropped !!!\\n\", __FUNCTION__);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpMicKey = pWapiSta->wapiUsk.micKey;\n\t\t\tpDataKey = pWapiSta->wapiUsk.dataKey;\n\t\t}\n\t\telse if (pWapiSta->wapiUskUpdate.keyId == KeyIdx && pWapiSta->wapiUskUpdate.bSet ){\n\t\t\tWAPI_TRACE(WAPI_RX, \"%s: Use Updated USK for Decryption!!!\\n\", __FUNCTION__);\n\t\t\tif(pWapiSta->bAuthenticatorInUpdata)\n\t\t\t\tbUseUpdatedKey = true;\n\t\t\telse\n\t\t\t\tbUseUpdatedKey = false;\n\n\t\t\tif(bQosData){\n\t\t\t\tWapiSetLastRxUnicastPNForQoSData(TID, pRecvPN, pWapiSta);\n\t\t\t}else{\n\t\t\t\tmemcpy(pWapiSta->lastRxUnicastPN, pRecvPN, 16);\n\t\t\t}\n\t\t\tpMicKey = pWapiSta->wapiUskUpdate.micKey;\n\t\t\tpDataKey = pWapiSta->wapiUskUpdate.dataKey;\n\t\t}else{\n\t\t\tWAPI_TRACE(WAPI_ERR, \"%s: No valid USK!!!KeyIdx=%d pWapiSta->wapiUsk.keyId=%d pWapiSta->wapiUskUpdate.keyId=%d\\n\", __FUNCTION__, KeyIdx, pWapiSta->wapiUsk.keyId, pWapiSta->wapiUskUpdate.keyId);\n\t\t\t//dump_buf(pskb->data,pskb->len);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tWAPI_DATA(WAPI_RX, \"Decryption - DataKey\", pDataKey, 16);\n\tWAPI_DATA(WAPI_RX, \"Decryption - IV\", pRecvPN, 16);\n\tWapiSMS4Decryption(pDataKey, pRecvPN, pSecData, DataLen, pSecData, &OutputLength);\n\n\tif (OutputLength != DataLen)\n\t\tWAPI_TRACE(WAPI_ERR, \"%s:  Output Length Error!!!!\\n\", __FUNCTION__);\n\n\tWAPI_DATA(WAPI_RX, \"Decryption - After decryption\", pskb->data, pskb->len);\n\n\tDataLen -= padapter->wapiInfo.extra_postfix_len;\n\n\tSecCalculateMicSMS4(KeyIdx, pMicKey, pskb->data, pSecData, DataLen, MicBuffer);\n\n\tWAPI_DATA(WAPI_RX, \"Decryption - MIC received\", pRecvMic, SMS4_MIC_LEN);\n\tWAPI_DATA(WAPI_RX, \"Decryption - MIC calculated\", MicBuffer, SMS4_MIC_LEN);\n\n\tif (0 == memcmp(MicBuffer, pRecvMic, padapter->wapiInfo.extra_postfix_len)){\n\t\tWAPI_TRACE(WAPI_RX, \"%s: Check MIC OK!!\\n\", __FUNCTION__);\n\t\tif (bUseUpdatedKey){\n\t\t\t// delete the old key\n\t\t\tif ( IS_MCAST(pRA) ){\n\t\t\t\tWAPI_TRACE(WAPI_API, \"%s(): AE use new update MSK!!\\n\", __FUNCTION__);\n\t\t\t\tpWapiSta->wapiMsk.keyId = pWapiSta->wapiMskUpdate.keyId;\n\t\t\t\tmemcpy(pWapiSta->wapiMsk.dataKey, pWapiSta->wapiMskUpdate.dataKey, 16);\n\t\t\t\tmemcpy(pWapiSta->wapiMsk.micKey, pWapiSta->wapiMskUpdate.micKey, 16);\n\t\t\t\tpWapiSta->wapiMskUpdate.bTxEnable = pWapiSta->wapiMskUpdate.bSet = false;\n\t\t\t}else{\n\t\t\t\tWAPI_TRACE(WAPI_API, \"%s(): AE use new update USK!!\\n\", __FUNCTION__);\n\t\t\t\tpWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId;\n\t\t\t\tmemcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16);\n\t\t\t\tmemcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16);\n\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = pWapiSta->wapiUskUpdate.bSet = false;\n\t\t\t}\n\t\t}\n\t}else{\n\t\tWAPI_TRACE(WAPI_ERR, \"%s:  Check MIC Error, Dropped !!!!\\n\", __FUNCTION__);\n\t\treturn false;\n\t}\n\n\tpos = pskb->data;\n\tmemmove(pos+padapter->wapiInfo.extra_prefix_len, pos, IVOffset);\n\tskb_pull(pskb, padapter->wapiInfo.extra_prefix_len);\n\n\tWAPI_TRACE(WAPI_RX, \"<=========%s\\n\", __FUNCTION__);\n\n\treturn true;\n}\n\nu32\trtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe)\n{\n\n\tu8\t*pframe;\n\tu32 res = _SUCCESS;\n\n\tWAPI_TRACE(WAPI_TX, \"=========>%s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_TX, \"<========== %s, WAPI not supported or enabled!\\n\", __FUNCTION__);\n\t\treturn _FAIL;\n\t}\n\n\tif(((struct xmit_frame*)pxmitframe)->buf_addr==NULL)\n\t\treturn _FAIL;\n\n\tpframe = ((struct xmit_frame*)pxmitframe)->buf_addr + TXDESC_OFFSET;\n\n\tSecSWSMS4Encryption(padapter, pxmitframe);\n\n\tWAPI_TRACE(WAPI_TX, \"<=========%s\\n\", __FUNCTION__);\n\treturn res;\n}\n\nu32\trtw_sms4_decrypt(_adapter *padapter, u8 *precvframe)\n{\n\tu8\t*pframe;\n\tu32 res = _SUCCESS;\n\n\tWAPI_TRACE(WAPI_RX, \"=========>%s\\n\", __FUNCTION__);\n\n\tif ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable))\n\t{\n\t\tWAPI_TRACE(WAPI_RX, \"<========== %s, WAPI not supported or enabled!\\n\", __FUNCTION__);\n\t\treturn _FAIL;\n\t}\n\n\n\t//drop packet when hw decrypt fail\n       //return tempraily\n\treturn _FAIL;\n\n\t//pframe=(unsigned char *)((union recv_frame*)precvframe)->u.hdr.rx_data;\n\n\tif (false == SecSWSMS4Decryption(padapter, precvframe, &padapter->recvpriv))\n\t{\n\t\tWAPI_TRACE(WAPI_ERR, \"%s():SMS4 decrypt frame error\\n\",__FUNCTION__);\n\t\treturn _FAIL;\n\t}\n\n\tWAPI_TRACE(WAPI_RX, \"<=========%s\\n\", __FUNCTION__);\n\treturn res;\n}\n\n#else\n\nu32\trtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe)\n{\n\tWAPI_TRACE(WAPI_TX, \"=========>Dummy %s\\n\", __FUNCTION__);\n\tWAPI_TRACE(WAPI_TX, \"<=========Dummy %s\\n\", __FUNCTION__);\n\treturn _SUCCESS;\n}\n\nu32\trtw_sms4_decrypt(_adapter *padapter, u8 *precvframe)\n{\n\tWAPI_TRACE(WAPI_RX, \"=========>Dummy %s\\n\", __FUNCTION__);\n\tWAPI_TRACE(WAPI_RX, \"<=========Dummy %s\\n\", __FUNCTION__);\n\treturn _SUCCESS;\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "core/rtw_wlan_util.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_WLAN_UTIL_C_\n\n#include <drv_types.h>\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n#include <linux/inetdevice.h>\n#endif\n\nunsigned char ARTHEROS_OUI1[] = {0x00, 0x03, 0x7f};\nunsigned char ARTHEROS_OUI2[] = {0x00, 0x13, 0x74};\n\nunsigned char BROADCOM_OUI1[] = {0x00, 0x10, 0x18};\nunsigned char BROADCOM_OUI2[] = {0x00, 0x0a, 0xf7};\nunsigned char BROADCOM_OUI3[] = {0x00, 0x05, 0xb5};\n\n\nunsigned char CISCO_OUI[] = {0x00, 0x40, 0x96};\nunsigned char MARVELL_OUI[] = {0x00, 0x50, 0x43};\nunsigned char RALINK_OUI[] = {0x00, 0x0c, 0x43};\nunsigned char REALTEK_OUI[] = {0x00, 0xe0, 0x4c};\nunsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5};\n\nunsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};\n\nextern unsigned char RTW_WPA_OUI[];\nextern unsigned char WPA_TKIP_CIPHER[4];\nextern unsigned char RSN_TKIP_CIPHER[4];\n\n#define R2T_PHY_DELAY\t(0)\n\n//#define WAIT_FOR_BCN_TO_MIN\t(3000)\n#define WAIT_FOR_BCN_TO_MIN\t(6000)\n#define WAIT_FOR_BCN_TO_MAX\t(20000)\n\n#define DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS 1000\n#define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3\n\nstatic u8 rtw_basic_rate_cck[4] = {\n\tIEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,\n\tIEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK\n};\n\nstatic u8 rtw_basic_rate_ofdm[3] = {\n\tIEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,\n\tIEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK\n};\n\nstatic u8 rtw_basic_rate_mix[7] = {\n\tIEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,\n\tIEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK,\n\tIEEE80211_OFDM_RATE_6MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_OFDM_RATE_12MB|IEEE80211_BASIC_RATE_MASK,\n\tIEEE80211_OFDM_RATE_24MB|IEEE80211_BASIC_RATE_MASK\n};\n\nint new_bcn_max = 3;\n\nint cckrates_included(unsigned char *rate, int ratelen)\n{\n\tint\ti;\n\t\n\tfor(i = 0; i < ratelen; i++)\n\t{\n\t\tif  (  (((rate[i]) & 0x7f) == 2)\t|| (((rate[i]) & 0x7f) == 4) ||\n\t\t\t   (((rate[i]) & 0x7f) == 11)  || (((rate[i]) & 0x7f) == 22) )\n\t\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n\n}\n\nint cckratesonly_included(unsigned char *rate, int ratelen)\n{\n\tint\ti;\n\t\n\tfor(i = 0; i < ratelen; i++)\n\t{\n\t\tif  ( (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&\n\t\t\t   (((rate[i]) & 0x7f) != 11)  && (((rate[i]) & 0x7f) != 22) )\n\t\t\treturn _FALSE;\n\t}\n\t\n\treturn _TRUE;\n}\n\ns8 rtw_get_tx_nss(_adapter *adapter, struct sta_info *psta)\n{\n\tu8 rf_type = RF_1T1R, custom_rf_type, vht_mcs[2];\n\ts8 nss = 1;\n\n\tcustom_rf_type = adapter->registrypriv.rf_config;\n\trtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\t\n\tif (!psta)\n\t\treturn nss;\n\t\n\t/* rf_config is dependent on efuse or sw config */\n\tif (custom_rf_type != RF_MAX_TYPE)\n\t\trf_type = custom_rf_type;\n\t\n#ifdef CONFIG_80211AC_VHT\n\tif (psta->vhtpriv.vht_option) {\n\t\tu8 vht_mcs[2];\n\t\tstruct mlme_priv\t*pmlmepriv = &(adapter->mlmepriv);\n\t\tstruct vht_priv\t*pvhtpriv_ap = &pmlmepriv->vhtpriv;\n\t\t\n\t\t_rtw_memcpy(vht_mcs, psta->vhtpriv.vht_mcs_map, 2);\n\t\t/* doesn't support 5~8 SS so far */\n\t\tvht_mcs[1] = 0xff;\n\t\tswitch (rf_type) {\n\t\tcase RF_1T1R:\n\t\tcase RF_1T2R:\n\t\t\tvht_mcs[0] |= 0xfc;\n\t\t\tbreak;\n\t\tcase RF_2T2R:\n\t\tcase RF_2T4R:\n\t\tcase RF_2T2R_GREEN:\n\t\tcase RF_2T3R:\n\t\t\tvht_mcs[0] |= 0xf0;\n\t\t\tbreak;\n\t\tcase RF_3T3R:\n\t\tcase RF_3T4R:\n\t\t\tvht_mcs[0] |= 0xc0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"%s,%d, unknown rf type\\n\", __func__, __LINE__);\n\t\t\tbreak;\n\t\t}\n\t\tnss = rtw_vht_mcsmap_to_nss(vht_mcs);\n\t} else\n#endif /* CONFIG_80211AC_VHT */\n\tif (psta->htpriv.ht_option) {\n\t\tu8 supp_mcs_set[4];\n\n\t\t_rtw_memcpy(supp_mcs_set, psta->htpriv.ht_cap.supp_mcs_set, 4);\n\t\t\n\t\tswitch (rf_type) {\n\t\tcase RF_1T1R:\n\t\tcase RF_1T2R:\n\t\t\tsupp_mcs_set[1] = supp_mcs_set[2] = supp_mcs_set[3] = 0;\n\t\t\tbreak;\n\t\tcase RF_2T2R:\n\t\tcase RF_2T4R:\n\t\tcase RF_2T2R_GREEN:\n\t\tcase RF_2T3R:\n\t\t\tsupp_mcs_set[2] = supp_mcs_set[3] = 0;\n\t\t\tbreak;\n\t\tcase RF_3T3R:\n\t\tcase RF_3T4R:\n\t\t\tsupp_mcs_set[3] = 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"%s,%d, unknown rf type\\n\", __func__, __LINE__);\n\t\t\tbreak;\n\t\t}\n\t\tnss = rtw_ht_mcsset_to_nss(supp_mcs_set);\n\t}\n\t\n\tDBG_871X(\"%s: %d SS, rf_type=%d\\n\", __func__, nss, rf_type);\n\treturn nss;\n}\n\nu8 networktype_to_raid(_adapter *adapter,struct sta_info *psta)\n{\n\tunsigned char raid;\n\tswitch(psta->wireless_mode)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\traid = RATR_INX_WIRELESS_B;\n\t\t\tbreak;\n\t\tcase WIRELESS_11A:\n\t\tcase WIRELESS_11G:\n\t\t\traid = RATR_INX_WIRELESS_G;\n\t\t\tbreak;\n\t\tcase WIRELESS_11BG:\n\t\t\traid = RATR_INX_WIRELESS_GB;\n\t\t\tbreak;\n\t\tcase WIRELESS_11_24N:\n\t\tcase WIRELESS_11_5N:\n\t\t\traid = RATR_INX_WIRELESS_N;\n\t\t\tbreak;\n\t\tcase WIRELESS_11A_5N:\n\t\tcase WIRELESS_11G_24N:\n\t\t\traid = RATR_INX_WIRELESS_NG;\n\t\t\tbreak;\n\t\tcase WIRELESS_11BG_24N:\n\t\t\traid = RATR_INX_WIRELESS_NGB;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\traid = RATR_INX_WIRELESS_GB;\n\t\t\tbreak;\t\n\n\t}\n\treturn raid;\n\t\n}\n\nu8 networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tu8 raid = RATEID_IDX_BGN_40M_1SS, cur_rf_type, rf_type, custom_rf_type;\n\ts8 tx_nss;\n\n\ttx_nss = rtw_get_tx_nss(adapter, psta);\n\n\tswitch(psta->wireless_mode)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\traid = RATEID_IDX_B;\n\t\t\tbreak;\n\t\tcase WIRELESS_11A:\n\t\tcase WIRELESS_11G:\n\t\t\traid = RATEID_IDX_G;\n\t\t\tbreak;\n\t\tcase WIRELESS_11BG:\n\t\t\traid = RATEID_IDX_BG;\n\t\t\tbreak;\n\t\tcase WIRELESS_11_24N:\n\t\tcase WIRELESS_11_5N:\n\t\tcase WIRELESS_11A_5N:\n\t\tcase WIRELESS_11G_24N:\n\t\t\tif (tx_nss == 1)\n\t\t\t\traid = RATEID_IDX_GN_N1SS;\n\t\t\telse if (tx_nss == 2)\n\t\t\t\traid = RATEID_IDX_GN_N2SS;\n\t\t\telse if (tx_nss == 3)\n\t\t\t\traid = RATEID_IDX_BGN_3SS;\n\t\t\telse\n\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\tbreak;\n\t\tcase WIRELESS_11B_24N:\n\t\tcase WIRELESS_11BG_24N:\n\t\t\tif (psta->bw_mode == CHANNEL_WIDTH_20) {\n\t\t\t\tif (tx_nss == 1)\n\t\t\t\t\traid = RATEID_IDX_BGN_20M_1SS_BN;\n\t\t\t\telse if (tx_nss == 2)\n\t\t\t\t\traid = RATEID_IDX_BGN_20M_2SS_BN;\n\t\t\t\telse if (tx_nss == 3)\n\t\t\t\t\traid = RATEID_IDX_BGN_3SS;\n\t\t\t\telse\n\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\t} else {\n\t\t\t\tif (tx_nss == 1)\n\t\t\t\t\traid = RATEID_IDX_BGN_40M_1SS;\n\t\t\t\telse if (tx_nss == 2)\n\t\t\t\t\traid = RATEID_IDX_BGN_40M_2SS;\n\t\t\t\telse if (tx_nss == 3)\n\t\t\t\t\traid = RATEID_IDX_BGN_3SS;\n\t\t\t\telse\n\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\t}\n\t\t\tbreak;\n#ifdef CONFIG_80211AC_VHT\n\t\tcase WIRELESS_11_5AC:\n\t\t\tif (tx_nss == 1)\n\t\t\t\traid = RATEID_IDX_VHT_1SS;\n\t\t\telse if (tx_nss == 2)\n\t\t\t\traid = RATEID_IDX_VHT_2SS;\n\t\t\telse if (tx_nss == 3)\n\t\t\t\traid = RATEID_IDX_VHT_3SS;\n\t\t\telse\n\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\tbreak;\n\t\tcase WIRELESS_11_24AC:\n\t\t\tif (psta->bw_mode >= CHANNEL_WIDTH_80)\n\t\t\t{\n\t\t\t\tif (tx_nss == 1)\n\t\t\t\t\traid = RATEID_IDX_VHT_1SS;\n\t\t\t\telse if (tx_nss == 2)\n\t\t\t\t\traid = RATEID_IDX_VHT_2SS;\n\t\t\t\telse if (tx_nss == 3)\n\t\t\t\t\traid = RATEID_IDX_VHT_3SS;\n\t\t\t\telse\n\t\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (tx_nss == 1)\n\t\t\t\t\traid = RATEID_IDX_MIX1;\n\t\t\t\telse if (tx_nss == 2)\n\t\t\t\t\traid = RATEID_IDX_MIX2;\n\t\t\t\telse if (tx_nss == 3)\n\t\t\t\t\traid = RATEID_IDX_VHT_3SS;\n\t\t\t\telse\n\t\t\t\t\tDBG_871X(\"tx_nss error!(tx_nss=%d)\\n\", tx_nss);\n\t\t\t}\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tDBG_871X(\"unexpected wireless mode!(psta->wireless_mode=%x)\\n\", psta->wireless_mode);\n\t\t\tbreak;\t\n\n\t}\n\t\n\t/* DBG_871X(\"psta->wireless_mode=%x,  tx_nss=%d\\n\", psta->wireless_mode, tx_nss); */\n\t\n\treturn raid;\n\t\n}\n\nu8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen)\n{\n\tu8 network_type = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\n\tif(pmlmeext->cur_channel > 14)\n\t{\n\t\tif (pmlmeinfo->VHT_enable)\n\t\t\tnetwork_type = WIRELESS_11AC;\n\t\telse if (pmlmeinfo->HT_enable)\n\t\t\tnetwork_type = WIRELESS_11_5N;\n\n\t\tnetwork_type |= WIRELESS_11A;\n\t}\n\telse\n\t{\n\t\tif (pmlmeinfo->HT_enable)\n\t\t{\n\t\t\tnetwork_type = WIRELESS_11_24N;\n\t\t}\n\n\t\tif ((cckratesonly_included(rate, ratelen)) == _TRUE)\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11B;\n\t\t}\n\t\telse if((cckrates_included(rate, ratelen)) == _TRUE)\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11BG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11G;\n\t\t}\n\t}\n\t\t\n\treturn \tnetwork_type;\n}\n\nunsigned char ratetbl_val_2wifirate(unsigned char rate);\nunsigned char ratetbl_val_2wifirate(unsigned char rate)\n{\n\tunsigned char val = 0;\n\n\tswitch (rate & 0x7f) \n\t{\n\t\tcase 0:\n\t\t\tval = IEEE80211_CCK_RATE_1MB;\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\tval = IEEE80211_CCK_RATE_2MB;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tval = IEEE80211_CCK_RATE_5MB;\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tval = IEEE80211_CCK_RATE_11MB;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 4:\n\t\t\tval = IEEE80211_OFDM_RATE_6MB;\n\t\t\tbreak;\n\n\t\tcase 5:\n\t\t\tval = IEEE80211_OFDM_RATE_9MB;\n\t\t\tbreak;\n\n\t\tcase 6:\n\t\t\tval = IEEE80211_OFDM_RATE_12MB;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 7:\n\t\t\tval = IEEE80211_OFDM_RATE_18MB;\n\t\t\tbreak;\n\n\t\tcase 8:\n\t\t\tval = IEEE80211_OFDM_RATE_24MB;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 9:\n\t\t\tval = IEEE80211_OFDM_RATE_36MB;\n\t\t\tbreak;\n\n\t\tcase 10:\n\t\t\tval = IEEE80211_OFDM_RATE_48MB;\n\t\t\tbreak;\n\t\t\n\t\tcase 11:\n\t\t\tval = IEEE80211_OFDM_RATE_54MB;\n\t\t\tbreak;\n\n\t}\n\n\treturn val;\n\n}\n\nint is_basicrate(_adapter *padapter, unsigned char rate);\nint is_basicrate(_adapter *padapter, unsigned char rate)\n{\n\tint i;\n\tunsigned char val;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\t\n\tfor(i = 0; i < NumRates; i++)\n\t{\n\t\tval = pmlmeext->basicrate[i];\n\n\t\tif ((val != 0xff) && (val != 0xfe))\n\t\t{\n\t\t\tif (rate == ratetbl_val_2wifirate(val))\n\t\t\t{\n\t\t\t\treturn _TRUE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn _FALSE;\n}\n\nunsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset);\nunsigned int ratetbl2rateset(_adapter *padapter, unsigned char *rateset)\n{\n\tint i;\n\tunsigned char rate;\n\tunsigned int\tlen = 0;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\tfor (i = 0; i < NumRates; i++)\n\t{\n\t\trate = pmlmeext->datarate[i];\n\n\t\tswitch (rate)\n\t\t{\n\t\t\tcase 0xff:\n\t\t\t\treturn len;\n\t\t\t\t\n\t\t\tcase 0xfe:\n\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\trate = ratetbl_val_2wifirate(rate);\n\n\t\t\t\tif (is_basicrate(padapter, rate) == _TRUE)\n\t\t\t\t{\n\t\t\t\t\trate |= IEEE80211_BASIC_RATE_MASK;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\trateset[len] = rate;\n\t\t\t\tlen++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn len;\n}\n\nvoid get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)\n{\n\tunsigned char supportedrates[NumRates];\n\n\t_rtw_memset(supportedrates, 0, NumRates);\n\t*bssrate_len = ratetbl2rateset(padapter, supportedrates);\n\t_rtw_memcpy(pbssrate, supportedrates, *bssrate_len);\n}\n\nvoid set_mcs_rate_by_mask(u8 *mcs_set, u32 mask)\n{\n\tu8 mcs_rate_1r = (u8)(mask&0xff);\n\tu8 mcs_rate_2r = (u8)((mask>>8)&0xff);\n\tu8 mcs_rate_3r = (u8)((mask>>16)&0xff);\n\tu8 mcs_rate_4r = (u8)((mask>>24)&0xff);\n\n\tmcs_set[0] &= mcs_rate_1r;\n\tmcs_set[1] &= mcs_rate_2r;\n\tmcs_set[2] &= mcs_rate_3r;\n\tmcs_set[3] &= mcs_rate_4r;\n}\n\nvoid UpdateBrateTbl(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\t\t*mBratesOS\n)\n{\n\tu8\ti;\n\tu8\trate;\n\n\t// 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory.\n\tfor(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)\n\t{\n\t\trate = mBratesOS[i] & 0x7f;\n\t\tswitch(rate)\n\t\t{\n\t\t\tcase IEEE80211_CCK_RATE_1MB:\n\t\t\tcase IEEE80211_CCK_RATE_2MB:\n\t\t\tcase IEEE80211_CCK_RATE_5MB:\n\t\t\tcase IEEE80211_CCK_RATE_11MB:\n\t\t\tcase IEEE80211_OFDM_RATE_6MB:\n\t\t\tcase IEEE80211_OFDM_RATE_12MB:\n\t\t\tcase IEEE80211_OFDM_RATE_24MB:\n\t\t\t\tmBratesOS[i] |= IEEE80211_BASIC_RATE_MASK;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n}\n\nvoid UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen)\n{\n\tu8\ti;\n\tu8\trate;\n\n\tfor(i=0;i<bssratelen;i++)\n\t{\n\t\trate = bssrateset[i] & 0x7f;\n\t\tswitch(rate)\n\t\t{\n\t\t\tcase IEEE80211_CCK_RATE_1MB:\n\t\t\tcase IEEE80211_CCK_RATE_2MB:\n\t\t\tcase IEEE80211_CCK_RATE_5MB:\n\t\t\tcase IEEE80211_CCK_RATE_11MB:\n\t\t\t\tbssrateset[i] |= IEEE80211_BASIC_RATE_MASK;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n}\nstatic void Set_NETYPE1_MSR(_adapter *padapter, u8 type)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS1, (u8 *)(&type));\n}\n\nstatic void Set_NETYPE0_MSR(_adapter *padapter, u8 type)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_MEDIA_STATUS, (u8 *)(&type));\n}\n\nvoid Set_MSR(_adapter *padapter, u8 type)\n{\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type == IFACE_PORT1)\n\t{\n\t\tSet_NETYPE1_MSR(padapter, type);\n\t}\n\telse\n#endif\n\t{\n\t\tSet_NETYPE0_MSR(padapter, type);\n\t}\n}\n\ninline u8 rtw_get_oper_ch(_adapter *adapter)\n{\n\treturn adapter_to_dvobj(adapter)->oper_channel;\n}\n\ninline void rtw_set_oper_ch(_adapter *adapter, u8 ch)\n{\n#ifdef DBG_CH_SWITCH\n\tconst int len = 128;\n\tchar msg[128] = {0};\n\tint cnt = 0;\n\tint i = 0;\n#endif  /* DBG_CH_SWITCH */\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\t\n\tif (dvobj->oper_channel != ch) {\n\t\tdvobj->on_oper_ch_time = rtw_get_current_time();\n\n#ifdef DBG_CH_SWITCH\n\t\tcnt += snprintf(msg+cnt, len-cnt, \"switch to ch %3u\", ch);\n\n\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\t_adapter *iface = dvobj->padapters[i];\n\t\t\tcnt += snprintf(msg+cnt, len-cnt, \" [\"ADPT_FMT\":\", ADPT_ARG(iface));\n\t\t\tif (iface->mlmeextpriv.cur_channel == ch)\n\t\t\t\tcnt += snprintf(msg+cnt, len-cnt, \"C\");\n\t\t\telse\n\t\t\t\tcnt += snprintf(msg+cnt, len-cnt, \"_\");\n\t\t\tif (iface->wdinfo.listen_channel == ch && !rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_NONE))\n\t\t\t\tcnt += snprintf(msg+cnt, len-cnt, \"L\");\n\t\t\telse\n\t\t\t\tcnt += snprintf(msg+cnt, len-cnt, \"_\");\n\t\t\tcnt += snprintf(msg+cnt, len-cnt, \"]\");\n\t\t}\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" %s\\n\", FUNC_ADPT_ARG(adapter), msg);\n#endif /* DBG_CH_SWITCH */\n\t}\n\n\tdvobj->oper_channel = ch;\n}\n\ninline u8 rtw_get_oper_bw(_adapter *adapter)\n{\n\treturn adapter_to_dvobj(adapter)->oper_bwmode;\n}\n\ninline void rtw_set_oper_bw(_adapter *adapter, u8 bw)\n{\n\tadapter_to_dvobj(adapter)->oper_bwmode = bw;\n}\n\ninline u8 rtw_get_oper_choffset(_adapter *adapter)\n{\n\treturn adapter_to_dvobj(adapter)->oper_ch_offset;\n}\n\ninline void rtw_set_oper_choffset(_adapter *adapter, u8 offset)\n{\n\tadapter_to_dvobj(adapter)->oper_ch_offset = offset;\n}\n\nu8 rtw_get_offset_by_ch(u8 channel)\n{\n\tu8 offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\tif(channel>=1 && channel<=4)\n\t{\n\t\toffset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t}\n\telse if(channel>=5 && channel<=14)\n\t{\n\t\toffset = HAL_PRIME_CHNL_OFFSET_UPPER;\t\t\t\t\t\t\n\t}\n\telse\n\t{\n\t\tswitch(channel)\n\t\t{\n\t\t\tcase 36:\n\t\t\tcase 44:\n\t\t\tcase 52:\n\t\t\tcase 60:\n\t\t\tcase 100:\n\t\t\tcase 108:\n\t\t\tcase 116:\n\t\t\tcase 124:\n\t\t\tcase 132:\n\t\t\tcase 149:\n\t\t\tcase 157:\n\t\t\t\toffset = HAL_PRIME_CHNL_OFFSET_LOWER;\t\t\t\t\n\t\t\t\tbreak;\t\t\n\t\t\tcase 40:\n\t\t\tcase 48:\n\t\t\tcase 56:\n\t\t\tcase 64:\n\t\t\tcase 104:\n\t\t\tcase 112:\n\t\t\tcase 120:\n\t\t\tcase 128:\n\t\t\tcase 136:\n\t\t\tcase 153:\n\t\t\tcase 161:\t\t\t\t\n\t\t\t\toffset = HAL_PRIME_CHNL_OFFSET_UPPER;\t\t\t\t\n\t\t\t\tbreak;\t\t\t\t\n\t\t\tdefault:\n\t\t\t\toffset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t\tbreak;\n\t\t}\n\n\t}\n\n\treturn offset;\n\t\t\n}\n\nu8\trtw_get_center_ch(u8 channel, u8 chnl_bw, u8 chnl_offset)\n{\n\tu8\tcenter_ch = channel;\n\n\tif(chnl_bw == CHANNEL_WIDTH_80)\n\t{\n\t\tif((channel == 36) || (channel == 40) || (channel == 44) || (channel == 48) )\n\t\t\tcenter_ch = 42;\n\t\tif((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64) )\n\t\t\tcenter_ch = 58;\n\t\tif((channel == 100) || (channel == 104) || (channel == 108) || (channel == 112) )\n\t\t\tcenter_ch = 106;\n\t\tif((channel == 116) || (channel == 120) || (channel == 124) || (channel == 128) )\n\t\t\tcenter_ch = 122;\n\t\tif((channel == 132) || (channel == 136) || (channel == 140) || (channel == 144) )\n\t\t\tcenter_ch = 138;\n\t\tif((channel == 149) || (channel == 153) || (channel == 157) || (channel == 161) )\n\t\t\tcenter_ch = 155;\n\t\telse if(channel <= 14)\n\t\t\tcenter_ch = 7;\n\t}\n\telse if(chnl_bw == CHANNEL_WIDTH_40)\n\t{\n\t\tif (chnl_offset == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\tcenter_ch = channel + 2;\n\t\telse\n\t\t\tcenter_ch = channel - 2;\n\t}\n\n\treturn center_ch;\n}\n\ninline u32 rtw_get_on_oper_ch_time(_adapter *adapter)\n{\n\treturn adapter_to_dvobj(adapter)->on_oper_ch_time;\n}\n\ninline u32 rtw_get_on_cur_ch_time(_adapter *adapter)\n{\n\tif (adapter->mlmeextpriv.cur_channel == adapter_to_dvobj(adapter)->oper_channel)\n\t\treturn adapter_to_dvobj(adapter)->on_oper_ch_time;\n\telse\n\t\treturn 0;\n}\n\nvoid SelectChannel(_adapter *padapter, unsigned char channel)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\t\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);\n\n#ifdef CONFIG_DFS_MASTER\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);\n\tbool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl);\n\tbool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl, channel\n\t\t, adapter_to_dvobj(padapter)->oper_bwmode, adapter_to_dvobj(padapter)->oper_ch_offset);\n\n\tif (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch)\n\t\trtw_odm_radar_detect_enable(padapter);\n\n\tif (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) {\n\t\tu8 pause = 0xFF;\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n#endif /* CONFIG_DFS_MASTER */\n\n\t//saved channel info\n\trtw_set_oper_ch(padapter, channel);\n\n\trtw_hal_set_chan(padapter, channel);\n\n#ifdef CONFIG_DFS_MASTER\n\tif (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) {\n\t\tu8 pause = 0x00;\n\n\t\trtw_odm_radar_detect_disable(padapter);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n}\n#endif /* CONFIG_DFS_MASTER */\n\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);\n\t\t\n}\n\nvoid SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);\n\n#ifdef CONFIG_DFS_MASTER\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);\n\tbool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl);\n\tbool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl\n\t\t, adapter_to_dvobj(padapter)->oper_channel, bwmode, channel_offset);\n\n\tif (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch)\n\t\trtw_odm_radar_detect_enable(padapter);\n\n\tif (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) {\n\t\tu8 pause = 0xFF;\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n#endif /* CONFIG_DFS_MASTER */\n\n\t//saved bw info\n\trtw_set_oper_bw(padapter, bwmode);\n\trtw_set_oper_choffset(padapter, channel_offset);\n\n\trtw_hal_set_bwmode(padapter, (CHANNEL_WIDTH)bwmode, channel_offset);\n\n#ifdef CONFIG_DFS_MASTER\n\tif (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) {\n\t\tu8 pause = 0x00;\n\n\t\trtw_odm_radar_detect_disable(padapter);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n}\n#endif /* CONFIG_DFS_MASTER */\n\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->setbw_mutex), NULL);\n}\n\nvoid set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode)\n{\n\tu8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\tif ( padapter->bNotifyChannelChange )\n\t{\n\t\tDBG_871X( \"[%s] ch = %d, offset = %d, bwmode = %d\\n\", __FUNCTION__, channel, channel_offset, bwmode );\n\t}\n\n\tcenter_ch = rtw_get_center_ch(channel, bwmode, channel_offset);\n\n\tif(bwmode == CHANNEL_WIDTH_80)\n\t{\n\t\tif(center_ch > channel)\n\t\t\tchnl_offset80 = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\telse if(center_ch < channel)\n\t\t\tchnl_offset80 = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\telse\n\t\t\tchnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t}\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);\n\n#ifdef CONFIG_DFS_MASTER\n{\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);\n\tbool ori_overlap_radar_detect_ch = rtw_rfctl_overlap_radar_detect_ch(rfctl);\n\tbool new_overlap_radar_detect_ch = _rtw_rfctl_overlap_radar_detect_ch(rfctl, channel, bwmode, channel_offset);\n\n\tif (!ori_overlap_radar_detect_ch && new_overlap_radar_detect_ch)\n\t\trtw_odm_radar_detect_enable(padapter);\n\n\tif (new_overlap_radar_detect_ch && IS_UNDER_CAC(rfctl)) {\n\t\tu8 pause = 0xFF;\n\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n#endif /* CONFIG_DFS_MASTER */\n\n\t//set Channel\n\t//saved channel/bw info\n\trtw_set_oper_ch(padapter, channel);\n\trtw_set_oper_bw(padapter, bwmode);\n\trtw_set_oper_choffset(padapter, channel_offset);\n\n\trtw_hal_set_chnl_bw(padapter, center_ch, bwmode, channel_offset, chnl_offset80); // set center channel\n\n#ifdef CONFIG_DFS_MASTER\n\tif (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) {\n\t\tu8 pause = 0x00;\n\n\t\trtw_odm_radar_detect_disable(padapter);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &pause);\n\t}\n}\n#endif /* CONFIG_DFS_MASTER */\n\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);\n}\n\nint get_bsstype(unsigned short capability)\n{\n\tif (capability & BIT(0))\n\t{\n\t\treturn WIFI_FW_AP_STATE;\n\t}\n\telse if (capability & BIT(1))\n\t{\n\t\treturn WIFI_FW_ADHOC_STATE;\n\t}\n\telse\n\t{\n\t\treturn 0;\t\t\n\t}\n}\n\n__inline u8 *get_my_bssid(WLAN_BSSID_EX *pnetwork)\n{\t\n\treturn (pnetwork->MacAddress); \n}\n\nu16 get_beacon_interval(WLAN_BSSID_EX *bss)\n{\n\tunsigned short val;\n\t_rtw_memcpy((unsigned char *)&val, rtw_get_beacon_interval_from_ie(bss->IEs), 2);\n\n\treturn le16_to_cpu(val);\t\n\n}\n\nint is_client_associated_to_ap(_adapter *padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext;\n\tstruct mlme_ext_info\t*pmlmeinfo;\n\n\tif(!padapter)\n\t\treturn _FAIL;\n\n\tpmlmeext = &padapter->mlmeextpriv;\n\tpmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tif ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE))\n\t{\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FAIL;\n\t}\n}\n\nint is_client_associated_to_ibss(_adapter *padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tif ((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))\n\t{\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FAIL;\n\t}\n}\n\nint is_IBSS_empty(_adapter *padapter)\n{\n\tunsigned int i;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tfor (i = IBSS_START_MAC_ID; i < NUM_STA; i++)\n\t{\n\t\tif (pmlmeinfo->FW_sta_info[i].status == 1)\n\t\t{\n\t\t\treturn _FAIL;\n\t\t}\n\t}\n\t\n\treturn _TRUE;\n\t\n}\n\nunsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval)\n{\n\tif ((bcn_interval << 2) < WAIT_FOR_BCN_TO_MIN)\n\t{\n\t\treturn WAIT_FOR_BCN_TO_MIN;\n\t} \n\telse if ((bcn_interval << 2) > WAIT_FOR_BCN_TO_MAX)\n\t{\n\t\treturn WAIT_FOR_BCN_TO_MAX;\n\t}\t\n\telse\n\t{\n\t\treturn ((bcn_interval << 2));\n\t}\n}\n\nvoid CAM_empty_entry(\n\tPADAPTER     \tAdapter,\t\n\tu8 \t\t\tucIndex\n)\n{\n\trtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));\n}\n\nvoid invalidate_cam_all(_adapter *padapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\tu8 val8 = 0;\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, &val8);\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\trtw_sec_cam_map_clr_all(&cam_ctl->used);\n\t_rtw_memset(dvobj->cam_cache, 0, sizeof(struct sec_cam_ent) * SEC_CAM_ENT_NUM_SW_LIMIT);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\nvoid _clear_cam_entry(_adapter *padapter, u8 entry)\n{\n\tunsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\tunsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};\n\n\trtw_sec_write_cam_ent(padapter, entry, 0, null_sta, null_key);\n}\n\ninline void write_cam(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)\n{\n#ifdef CONFIG_WRITE_CACHE_ONLY\n\twrite_cam_cache(adapter, id ,ctrl, mac, key);\n#else\n\trtw_sec_write_cam_ent(adapter, id, ctrl, mac, key);\n\twrite_cam_cache(adapter, id ,ctrl, mac, key);\n#endif\n}\n\ninline void clear_cam_entry(_adapter *adapter, u8 id)\n{\n\t_clear_cam_entry(adapter, id);\n\tclear_cam_cache(adapter, id);\n}\n\ninline void write_cam_from_cache(_adapter *adapter, u8 id)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\tstruct sec_cam_ent cache;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\t_rtw_memcpy(&cache, &dvobj->cam_cache[id], sizeof(struct sec_cam_ent));\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n\n\trtw_sec_write_cam_ent(adapter, id, cache.ctrl, cache.mac, cache.key);\n}\n\nvoid write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\n\tdvobj->cam_cache[id].ctrl = ctrl;\n\t_rtw_memcpy(dvobj->cam_cache[id].mac, mac, ETH_ALEN);\n\t_rtw_memcpy(dvobj->cam_cache[id].key, key, 16);\n\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\nvoid clear_cam_cache(_adapter *adapter, u8 id)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\n\t_rtw_memset(&(dvobj->cam_cache[id]), 0, sizeof(struct sec_cam_ent));\n\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\ns16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, s16 kid)\n{\n\tu8 macid;\n\ts16 camid;\n\n\t//cam_entry:\n\t//0~3 for default key\n\n\t//for concurrent mode (ap+sta, sta+sta):\n\t//default key is disable, using sw encrypt/decrypt\n\t//camid 0, 1, 2, 3 is default entry for default key/group key\n\t//macid = 1 is for bc/mc stainfo, no mapping to camid\n\t//macid = 0 mapping to camid 4\n\t//for macid >=2, camid = macid+3;\n\n\tif (sta) {\n\t\tstruct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;\n\t\tmacid = sta->mac_id;\n\n\t\tif((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {\n\t\t\tif((macid == 1) || (macid>(NUM_STA-4))){\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" failed, mac_id=%d\\n\", FUNC_ADPT_ARG(adapter), macid);\n\t\t\t\tcamid = -1;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\n\t\tif(macid==0)\n\t\t\tcamid = 4;\n\t\telse if(macid >=2)\n\t\t\tcamid = macid + 3;\n\t\telse\n\t\t\tcamid = 4;\n\t}\n\telse {\n\t\t/* default key is disabled */\n\t\tcamid = -1;\n\t}\n\nexit:\n\treturn (s16)camid;\n}\n\ninline bool _rtw_camctl_chk_cap(_adapter *adapter, u8 cap)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\n\tif (cam_ctl->sec_cap & cap)\n\t\treturn _TRUE;\n\treturn _FALSE;\n}\n\ninline void _rtw_camctl_set_flags(_adapter *adapter, u32 flags)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\n\tcam_ctl->flags |= flags;\n}\n\ninline void rtw_camctl_set_flags(_adapter *adapter, u32 flags)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\t_rtw_camctl_set_flags(adapter, flags);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\ninline void _rtw_camctl_clr_flags(_adapter *adapter, u32 flags)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\n\tcam_ctl->flags &= ~flags;\n}\n\ninline void rtw_camctl_clr_flags(_adapter *adapter, u32 flags)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\t_rtw_camctl_clr_flags(adapter, flags);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\ninline bool _rtw_camctl_chk_flags(_adapter *adapter, u32 flags)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\n\tif (cam_ctl->flags & flags)\n\t\treturn _TRUE;\n\treturn _FALSE;\n}\n\nvoid dump_sec_cam_map(void *sel, struct sec_cam_bmp *map, u8 max_num)\n{\n\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m0);\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\tif (max_num && max_num > 32)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m1);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\tif (max_num && max_num > 64)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m2);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\tif (max_num && max_num > 96)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m3);\n#endif\n}\n\ninline bool rtw_sec_camid_is_set(struct sec_cam_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\treturn (map->m0 & BIT(id));\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\treturn (map->m1 & BIT(id - 32));\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\treturn (map->m2 & BIT(id - 64));\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\treturn (map->m3 & BIT(id - 96));\n#endif\n\telse\n\t\trtw_warn_on(1);\n\n\treturn 0;\n}\n\ninline void rtw_sec_cam_map_set(struct sec_cam_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\tmap->m0 |= BIT(id);\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\tmap->m1 |= BIT(id - 32);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\tmap->m2 |= BIT(id - 64);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\tmap->m3 |= BIT(id - 96);\n#endif\n\telse\n\t\trtw_warn_on(1);\n}\n\ninline void rtw_sec_cam_map_clr(struct sec_cam_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\tmap->m0 &= ~BIT(id);\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\tmap->m1 &= ~BIT(id-32);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\tmap->m2 &= ~BIT(id-64);\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\tmap->m3 &= ~BIT(id-96);\n#endif\n\telse\n\t\trtw_warn_on(1);\n}\n\ninline void rtw_sec_cam_map_clr_all(struct sec_cam_bmp *map)\n{\n\tmap->m0 = 0;\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\tmap->m1 = 0;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\tmap->m2 = 0;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\tmap->m3 = 0;\n#endif\n}\n\ninline bool rtw_sec_camid_is_drv_forbid(struct cam_ctl_t *cam_ctl, u8 id)\n{\n\tstruct sec_cam_bmp forbid_map;\n\n\tforbid_map.m0 = 0x00000ff0;\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\tforbid_map.m1 = 0x00000000;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\tforbid_map.m2 = 0x00000000;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\tforbid_map.m3 = 0x00000000;\n#endif\n\n\tif (id < 32)\n\t\treturn (forbid_map.m0 & BIT(id));\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\treturn (forbid_map.m1 & BIT(id - 32));\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\treturn (forbid_map.m2 & BIT(id - 64));\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\treturn (forbid_map.m3 & BIT(id - 96));\n#endif\n\telse\n\t\trtw_warn_on(1);\n\n\treturn 1;\n}\n\nbool _rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id)\n{\n\tbool ret = _FALSE;\n\n\tif (id >= cam_ctl->num) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\t#if 0 /* for testing */\n\tif (rtw_sec_camid_is_drv_forbid(cam_ctl, id)) {\n\t\tret = _TRUE;\n\t\tgoto exit;\n\t}\n\t#endif\n\n\tret = rtw_sec_camid_is_set(&cam_ctl->used, id);\n\nexit:\n\treturn ret;\n}\n\ninline bool rtw_sec_camid_is_used(struct cam_ctl_t *cam_ctl, u8 id)\n{\n\t_irqL irqL;\n\tbool ret;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\tret = _rtw_sec_camid_is_used(cam_ctl, id);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n\n\treturn ret;\n}\n\ninline bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\tbool ret = _FALSE;\n\n\tif (cam_id >= cam_ctl->num) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (_rtw_sec_camid_is_used(cam_ctl, cam_id) == _FALSE)\n\t\tgoto exit;\n\t\n\tret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE;\n\nexit:\n\treturn ret;\n}\n\ninline bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\tbool ret;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\tret = _rtw_camid_is_gk(adapter, cam_id);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n\n\treturn ret;\n}\n\nbool cam_cache_chk(_adapter *adapter, u8 id, u8 *addr, s16 kid, s8 gk)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tbool ret = _FALSE;\n\n\tif (addr && _rtw_memcmp(dvobj->cam_cache[id].mac, addr, ETH_ALEN) == _FALSE)\n\t\tgoto exit;\n\tif (kid >= 0 && kid != (dvobj->cam_cache[id].ctrl&0x03))\n\t\tgoto exit;\n\tif (gk != -1 && (gk?_TRUE:_FALSE) != _rtw_camid_is_gk(adapter, id))\n\t\tgoto exit;\n\n\tret = _TRUE;\n\nexit:\n\treturn ret;\n}\n\ns16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\tint i;\n\ts16 cam_id = -1;\n\n\tfor (i = 0; i < cam_ctl->num; i++) {\n\t\tif (cam_cache_chk(adapter, i, addr, kid, gk)) {\n\t\t\tcam_id = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (0) {\n\t\tif (addr)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" addr:\"MAC_FMT\" kid:%d, gk:%d, return cam_id:%d\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid, gk, cam_id);\n\t\telse\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" addr:%p kid:%d, gk:%d, return cam_id:%d\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(adapter), addr, kid, gk, cam_id);\n\t}\n\n\treturn cam_id;\n}\n\ns16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\ts16 cam_id = -1;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\tcam_id = _rtw_camid_search(adapter, addr, kid, gk);\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n\n\treturn cam_id;\n}\n\ns16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, bool *used)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\ts16 cam_id = -1;\n\n\t*used = _FALSE;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\n#ifdef DYNAMIC_CAMID_ALLOC\n\t{\n\t\tstruct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;\n\n\t\tif((((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))\n\t\t\t&& !sta) {\n\t\t\t/* AP/Ad-hoc mode group key: static alloction to default key by key ID */\n\t\t\tif (kid > 3) {\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" group key with invalid key id:%u\\n\"\n\t\t\t\t\t, FUNC_ADPT_ARG(adapter), kid);\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tgoto bitmap_handle;\n\t\t\t}\n\t\t\tcam_id = kid;\n\t\t}\n\t\telse {\n\t\t\tint i;\n\t\t\tu8 *addr = sta?sta->hwaddr:NULL;\n\t\t\t#if 0 /* for testing */\n\t\t\tstatic u8 start_id = 0;\n\t\t\t#else\n\t\t\tu8 start_id = 0;\n\t\t\t#endif\n\n\t\t\tif(!sta) {\n\t\t\t\tif (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {\n\t\t\t\t\t/* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */\n\t\t\t\t\tgoto bitmap_handle;\n\t\t\t\t}\n\n\t\t\t\taddr = get_bssid(&adapter->mlmepriv);\n\t\t\t}\n\n\t\t\t/* find cam entry which has the same addr, kid (, gk bit) */\n\t\t\tif (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC) == _TRUE)\n\t\t\t\ti = _rtw_camid_search(adapter, addr, kid, sta?_FALSE:_TRUE);\n\t\t\telse\n\t\t\t\ti = _rtw_camid_search(adapter, addr, kid, -1);\n\n\t\t\tif (i >= 0) {\n\t\t\t\tcam_id = i;\n\t\t\t\tgoto bitmap_handle;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < cam_ctl->num; i++) {\n\t\t\t\t/* bypass default key which is allocated statically */\n\t\t\t\tif (((i + start_id) % cam_ctl->num) < 4)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (_rtw_sec_camid_is_used(cam_ctl, ((i + start_id) % cam_ctl->num)) == _FALSE)\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (i == cam_ctl->num) {\n\t\t\t\tif (sta)\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" pairwise key with \"MAC_FMT\" id:%u no room\\n\"\n\t\t\t\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid);\n\t\t\t\telse\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" group key with \"MAC_FMT\" id:%u no room\\n\"\n\t\t\t\t\t, FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid);\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tgoto bitmap_handle;\n\t\t\t}\n\n\t\t\tcam_id = ((i + start_id) % cam_ctl->num);\n\t\t\tstart_id = ((i + start_id + 1) % cam_ctl->num);\n\t\t}\n\t}\n#else\n\tcam_id = rtw_get_camid(adapter, sta, kid);\n#endif /* DYNAMIC_CAMID_ALLOC */\n\nbitmap_handle:\n\tif (cam_id >= 0) {\n\t\t*used = _rtw_sec_camid_is_used(cam_ctl, cam_id);\n\t\trtw_sec_cam_map_set(&cam_ctl->used, cam_id);\n\t}\n\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n\n\treturn cam_id;\n}\n\nvoid rtw_camid_free(_adapter *adapter, u8 cam_id)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&cam_ctl->lock, &irqL);\n\n\tif (cam_id < cam_ctl->num)\n\t\trtw_sec_cam_map_clr(&cam_ctl->used, cam_id);\n\n\t_exit_critical_bh(&cam_ctl->lock, &irqL);\n}\n\nint allocate_fw_sta_entry(_adapter *padapter)\n{\n\tunsigned int mac_id;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tfor (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++)\n\t{\n\t\tif (pmlmeinfo->FW_sta_info[mac_id].status == 0)\n\t\t{\n\t\t\tpmlmeinfo->FW_sta_info[mac_id].status = 1;\n\t\t\tpmlmeinfo->FW_sta_info[mac_id].retry = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn mac_id;\n}\n\nvoid flush_all_cam_entry(_adapter *padapter)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)\n\t{\n\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE))\n\t\t{\n\t\t\tstruct sta_priv\t*pstapriv = &padapter->stapriv;\n\t\t\tstruct sta_info\t*psta;\n\n\t\t\tpsta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);\n\t\t\tif(psta) {\n\t\t\t\tif(psta->state & WIFI_AP_STATE)\n\t\t\t\t{}   //clear cam when ap free per sta_info        \n\t\t\t\telse {\n\t\t\t\t\trtw_clearstakey_cmd(padapter, psta, _FALSE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t{\n\t\t\t/* clear default key */\n\t\t\tint i, cam_id;\n\t\t\tu8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};\n\n\t\t\tfor (i=0;i<4;i++) {\n\t\t\t\tcam_id = rtw_camid_search(padapter, null_addr, i, -1);\n\t\t\t\tif (cam_id >= 0) {\n\t\t\t\t\tclear_cam_entry(padapter, cam_id);\n\t\t\t\t\trtw_camid_free(padapter, cam_id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* clear default key related key search setting */\n\t\t\t#ifdef DYNAMIC_CAMID_ALLOC\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);\n\t\t\t#endif\n\n\t\t\t/* leave pairwise key when ap free per sta_info */\n\t\t}\n\t}\n\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t{\n\t\tinvalidate_cam_all(padapter);\n\t\t/* clear default key related key search setting */\n\t\t#ifdef DYNAMIC_CAMID_ALLOC\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);\n\t\t#endif\n\t}\n\n\t_rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));\n\t\n}\n\n#if defined(CONFIG_P2P) && defined(CONFIG_WFD)\nint WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs\tpIE)\n{\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo;\t\n\tu8\twfd_ie[ 128 ] = { 0x00 };\n\tu32\twfd_ielen = 0;\n\n\n\tpwdinfo = &padapter->wdinfo;\n\tif ( rtw_get_wfd_ie( ( u8* ) pIE, pIE->Length, wfd_ie, &wfd_ielen ) )\n\t{\n\t\tu8\tattr_content[ 10 ] = { 0x00 };\n\t\tu32\tattr_contentlen = 0;\n\t\t\t\n\t\tDBG_871X( \"[%s] Found WFD IE\\n\", __FUNCTION__ );\n\t\trtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);\n\t\tif ( attr_contentlen )\n\t\t{\n\t\t\tpwdinfo->wfd_info->peer_rtsp_ctrlport = RTW_GET_BE16( attr_content + 2 );\n\t\t\tDBG_8192C( \"[%s] Peer PORT NUM = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\t\t\treturn( _TRUE );\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] NO WFD IE\\n\", __FUNCTION__ );\n\n\t}\n\treturn( _FAIL );\n}\n#endif\n\nint WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs\tpIE)\n{\n\t//struct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\t\n\t\n\tif(pmlmepriv->qospriv.qos_option==0)\n\t{\n\t\tpmlmeinfo->WMM_enable = 0;\n\t\treturn _FALSE;\n\t}\t\n\t\n\tif(_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)))\n\t{\n\t\treturn _FALSE;\n\t}\n\telse\n\t{\n\t\t_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));\n\t}\n\tpmlmeinfo->WMM_enable = 1;\n\treturn _TRUE;\n\n\t/*if (pregpriv->wifi_spec == 1)\n\t{\n\t\tif (pmlmeinfo->WMM_enable == 1)\n\t\t{\n\t\t\t//todo: compare the parameter set count & decide wheher to update or not\n\t\t\treturn _FAIL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpmlmeinfo->WMM_enable = 1;\n\t\t\t_rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));\n\t\t\treturn _TRUE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tpmlmeinfo->WMM_enable = 0;\n\t\treturn _FAIL;\n\t}*/\n\t\n}\n\nvoid WMMOnAssocRsp(_adapter *padapter)\n{\n\tu8\tACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime;\n\tu8\tacm_mask;\n\tu16\tTXOP;\n\tu32\tacParm, i;\n\tu32\tedca[4], inx[4];\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct xmit_priv\t\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\n\tacm_mask = 0;\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || \n\t\t(pmlmeext->cur_wireless_mode & WIRELESS_11_24N) )\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tif (pmlmeinfo->WMM_enable == 0)\n\t{\n\t\tpadapter->mlmepriv.acm_mask = 0;\n\n\t\tAIFS = aSifsTime + (2 * pmlmeinfo->slotTime);\n\n\t\tif (pmlmeext->cur_wireless_mode & (WIRELESS_11G |WIRELESS_11A)) {\n\t\t\tECWMin = 4;\n\t\t\tECWMax = 10;\n\t\t} else if (pmlmeext->cur_wireless_mode & WIRELESS_11B) {\n\t\t\tECWMin = 5;\n\t\t\tECWMax = 10;\n\t\t} else {\n\t\t\tECWMin = 4;\n\t\t\tECWMax = 10;\n\t\t}\n\n\t\tTXOP = 0;\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));\n\n\t\tECWMin = 2;\n\t\tECWMax = 3;\n\t\tTXOP = 0x2f;\n\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));\n\t}\n\telse\n\t{\n\t\tedca[0] = edca[1] = edca[2] = edca[3] = 0;\n\n\t\tfor (i = 0; i < 4; i++)  \n\t\t{\n\t\t\tACI = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 5) & 0x03;\n\t\t\tACM = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN >> 4) & 0x01;\n\n\t\t\t//AIFS = AIFSN * slot time + SIFS - r2t phy delay\n\t\t\tAIFS = (pmlmeinfo->WMM_param.ac_param[i].ACI_AIFSN & 0x0f) * pmlmeinfo->slotTime + aSifsTime;\n\n\t\t\tECWMin = (pmlmeinfo->WMM_param.ac_param[i].CW & 0x0f);\n\t\t\tECWMax = (pmlmeinfo->WMM_param.ac_param[i].CW & 0xf0) >> 4;\n\t\t\tTXOP = le16_to_cpu(pmlmeinfo->WMM_param.ac_param[i].TXOP_limit);\n\n\t\t\tacParm = AIFS | (ECWMin << 8) | (ECWMax << 12) | (TXOP << 16);\n\n\t\t\tswitch (ACI)\n\t\t\t{\n\t\t\t\tcase 0x0:\n\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm));\n\t\t\t\t\tacm_mask |= (ACM? BIT(1):0);\n\t\t\t\t\tedca[XMIT_BE_QUEUE] = acParm;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 0x1:\n\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acParm));\n\t\t\t\t\t//acm_mask |= (ACM? BIT(0):0);\n\t\t\t\t\tedca[XMIT_BK_QUEUE] = acParm;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 0x2:\n\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acParm));\n\t\t\t\t\tacm_mask |= (ACM? BIT(2):0);\n\t\t\t\t\tedca[XMIT_VI_QUEUE] = acParm;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 0x3:\n\t\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acParm));\n\t\t\t\t\tacm_mask |= (ACM? BIT(3):0);\n\t\t\t\t\tedca[XMIT_VO_QUEUE] = acParm;\n\t\t\t\t\tbreak;\t\t\t\t\t\t\t\n\t\t\t}\n\n\t\t\tDBG_871X(\"WMM(%x): %x, %x\\n\", ACI, ACM, acParm);\n\t\t}\n\n\t\tif(padapter->registrypriv.acm_method == 1)\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask));\n\t\telse\n\t\t\tpadapter->mlmepriv.acm_mask = acm_mask;\n\n\t\tinx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;\n\n\t\tif(pregpriv->wifi_spec==1)\n\t\t{\n\t\t\tu32\tj, tmp, change_inx=_FALSE;\n\n\t\t\t//entry indx: 0->vo, 1->vi, 2->be, 3->bk.\n\t\t\tfor(i=0; i<4; i++)\n\t\t\t{\n\t\t\t\tfor(j=i+1; j<4; j++)\n\t\t\t\t{\n\t\t\t\t\t//compare CW and AIFS\n\t\t\t\t\tif((edca[j] & 0xFFFF) < (edca[i] & 0xFFFF))\n\t\t\t\t\t{\n\t\t\t\t\t\tchange_inx = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse if((edca[j] & 0xFFFF) == (edca[i] & 0xFFFF))\n\t\t\t\t\t{\n\t\t\t\t\t\t//compare TXOP\n\t\t\t\t\t\tif((edca[j] >> 16) > (edca[i] >> 16))\n\t\t\t\t\t\t\tchange_inx = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tif(change_inx)\n\t\t\t\t\t{\n\t\t\t\t\t\ttmp = edca[i];\n\t\t\t\t\t\tedca[i] = edca[j];\n\t\t\t\t\t\tedca[j] = tmp;\n\n\t\t\t\t\t\ttmp = inx[i];\n\t\t\t\t\t\tinx[i] = inx[j];\n\t\t\t\t\t\tinx[j] = tmp;\n\n\t\t\t\t\t\tchange_inx = _FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor(i=0; i<4; i++) {\n\t\t\tpxmitpriv->wmm_para_seq[i] = inx[i];\n\t\t\tDBG_871X(\"wmm_para_seq(%d): %d\\n\", i, pxmitpriv->wmm_para_seq[i]);\n\t\t}\n\t}\n}\n\nstatic void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n#ifdef CONFIG_80211N_HT\n\tunsigned char\t new_bwmode;\n\tunsigned char  new_ch_offset;\n\tstruct HT_info_element\t *pHT_info;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct ht_priv\t\t\t*phtpriv = &pmlmepriv->htpriv;\n\tu8\tcbw40_enable=0;\n\n\tif(!pIE)\n\t\treturn;\n\n\tif(phtpriv->ht_option == _FALSE)\treturn;\n\n\tif(pmlmeext->cur_bwmode >= CHANNEL_WIDTH_80)\treturn;\n\n\tif(pIE->Length > sizeof(struct HT_info_element))\n\t\treturn;\n\t\n\tpHT_info = (struct HT_info_element *)pIE->data;\n\n\tif (hal_chk_bw_cap(padapter, BW_CAP_40M)) {\n\t\tif (pmlmeext->cur_channel > 14) {\n\t\t\tif (REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t} else {\n\t\t\tif (REGSTY_IS_BW_2G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_40))\n\t\t\t\tcbw40_enable = 1;\n\t\t}\n\t}\n\n\tif((pHT_info->infos[0] & BIT(2)) && cbw40_enable)\n\t{\n\t\tnew_bwmode = CHANNEL_WIDTH_40;\n\n\t\tswitch (pHT_info->infos[0] & 0x3)\n\t\t{\n\t\t\tcase 1:\n\t\t\t\tnew_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 3:\n\t\t\t\tnew_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tnew_bwmode = CHANNEL_WIDTH_20;\n\t\t\t\tnew_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tnew_bwmode = CHANNEL_WIDTH_20;\n\t\tnew_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t}\t\n\n\t\n\tif((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset))\n\t{\n\t\tpmlmeinfo->bwmode_updated = _TRUE;\n\t\t\n\t\tpmlmeext->cur_bwmode = new_bwmode;\n\t\tpmlmeext->cur_ch_offset = new_ch_offset;\n\n\t\t//update HT info also\n\t\tHT_info_handler(padapter, pIE);\n\t}\n\telse\n\t{\n\t\tpmlmeinfo->bwmode_updated = _FALSE;\n\t}\n\t\t\n\n\tif(_TRUE == pmlmeinfo->bwmode_updated)\n\t{\n\t\tstruct sta_info *psta;\n\t\tWLAN_BSSID_EX \t*cur_network = &(pmlmeinfo->network);\n\t\tstruct sta_priv\t*pstapriv = &padapter->stapriv;\n\t\n\t\t//set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n\t\t\n\t\t//update ap's stainfo\n\t\tpsta = rtw_get_stainfo(pstapriv, cur_network->MacAddress);\n\t\tif(psta)\n\t\t{\n\t\t\tstruct ht_priv\t*phtpriv_sta = &psta->htpriv;\n\t\t\t\n\t\t\tif(phtpriv_sta->ht_option)\n\t\t\t{\t\t\t\t\n\t\t\t\t// bwmode\t\t\t\t\n\t\t\t\tpsta->bw_mode = pmlmeext->cur_bwmode;\n\t\t\t\tphtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpsta->bw_mode = CHANNEL_WIDTH_20;\n\t\t\t\tphtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t}\n\n\t\t\trtw_dm_ra_mask_wk_cmd(padapter, (u8 *)psta);\n\t\t}\n\n\t\t//pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it!\n\t}\t\n#endif //CONFIG_80211N_HT\n}\n\nvoid HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n#ifdef CONFIG_80211N_HT\n\tunsigned int\ti;\n\tu8\trf_type = RF_1T1R;\n\tu8\tmax_AMPDU_len, min_MPDU_spacing;\n\tu8\tcur_ldpc_cap=0, cur_stbc_cap=0, cur_beamform_cap=0;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\t\n\tstruct ht_priv\t\t\t*phtpriv = &pmlmepriv->htpriv;\n\tstruct registry_priv \t*pregistrypriv = &padapter->registrypriv;\n\t\n\tif(pIE==NULL) return;\n\t\n\tif(phtpriv->ht_option == _FALSE)\treturn;\n\n\tpmlmeinfo->HT_caps_enable = 1;\n\t\n\tfor (i = 0; i < (pIE->Length); i++)\n\t{\n\t\tif (i != 2)\n\t\t{\n\t\t\t//\tCommented by Albert 2010/07/12\n\t\t\t//\tGot the endian issue here.\n\t\t\tpmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* AMPDU Parameters field */\n\n\t\t\t/* Get MIN of MAX AMPDU Length Exp */\n\t\t\tif ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3))\n\t\t\t{\n\t\t\t\tmax_AMPDU_len = (pIE->data[i] & 0x3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmax_AMPDU_len = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3);\n\t\t\t}\n\n\t\t\t/* Get MAX of MIN MPDU Start Spacing */\n\t\t\tif ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c))\n\t\t\t{\n\t\t\t\tmin_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmin_MPDU_spacing = (pIE->data[i] & 0x1c);\n\t\t\t}\n\n\t\t\tpmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing;\n\t\t}\n\t}\n\n\t//\tCommented by Albert 2010/07/12\n\t//\tHave to handle the endian issue after copying.\n\t//\tHT_ext_caps didn't be used yet.\t\n\tpmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info );\n\tpmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps = le16_to_cpu( pmlmeinfo->HT_caps.u.HT_cap_element.HT_ext_caps );\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\n\t//update the MCS set\n\tfor (i = 0; i < 16; i++)\n\t\tpmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];\n\t\t\t\n\t//update the MCS rates\n\tswitch(rf_type)\n\t{\n\t\tcase RF_1T1R:\n\t\tcase RF_1T2R:\n\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);\t\t\t\t\t\t\t\n\t\t\tbreak;\n\t\tcase RF_2T2R:\n\t\t\t#ifdef CONFIG_DISABLE_MCS13TO15\n\t\t\tif(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )\t\t\t\t\n\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);\t\t\t\t\n\t\t\telse\n\t\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);\n#else //CONFIG_DISABLE_MCS13TO15\n\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);\n#endif //CONFIG_DISABLE_MCS13TO15\n\t\t\tbreak;\n\t\tcase RF_3T3R:\n\t\t\tset_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_3R);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"[warning] rf_type %d is not expected\\n\", rf_type);\n\t}\n\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\t// Config STBC setting\n\t\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_TX_STBC(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_stbc_cap, STBC_HT_ENABLE_TX);\n\t\t\tDBG_871X(\"Enable HT Tx STBC !\\n\");\n\t\t}\n\t\tphtpriv->stbc_cap = cur_stbc_cap;\n\n#ifdef CONFIG_BEAMFORMING\n\t\t// Config Tx beamforming setting\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) && \n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\n\t\t\t/* Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pIE->data) << 6);\n\t\t}\n\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) &&\n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\n\t\t\t/* Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pIE->data) << 4);\n\t\t}\n\t\tphtpriv->beamform_cap = cur_beamform_cap;\n\t\tif (cur_beamform_cap) {\n\t\t\tDBG_871X(\"AP HT Beamforming Cap = 0x%02X\\n\", cur_beamform_cap);\n\t\t}\n#endif /*CONFIG_BEAMFORMING*/\n\t} else {\n\t\t/*WIFI_STATION_STATEorI_ADHOC_STATE or WIFI_ADHOC_MASTER_STATE*/\n\t\t// Config LDPC Coding Capability\n\t\tif (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX) && GET_HT_CAP_ELE_LDPC_CAP(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX));\n\t\t\tDBG_871X(\"Enable HT Tx LDPC!\\n\");\n\t\t}\n\t\tphtpriv->ldpc_cap = cur_ldpc_cap;\n\n\t\t// Config STBC setting\n\t\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX) && GET_HT_CAP_ELE_RX_STBC(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX) );\n\t\t\tDBG_871X(\"Enable HT Tx STBC!\\n\");\n\t\t}\n\t\tphtpriv->stbc_cap = cur_stbc_cap;\n\n#ifdef CONFIG_BEAMFORMING\n\t\t// Config Tx beamforming setting\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE) && \n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE);\n\t\t\t/* Shift to BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(pIE->data) << 6);\n\t\t}\n\n\t\tif (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE) &&\n\t\t\tGET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(pIE->data))\n\t\t{\n\t\t\tSET_FLAG(cur_beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE);\n\t\t\t/* Shift to BEAMFORMING_HT_BEAMFORMER_STEER_NUM*/\n\t\t\tSET_FLAG(cur_beamform_cap, GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(pIE->data) << 4);\n\t\t}\n\t\tphtpriv->beamform_cap = cur_beamform_cap;\n\t\tif (cur_beamform_cap) {\n\t\t\tDBG_871X(\"Client HT Beamforming Cap = 0x%02X\\n\", cur_beamform_cap);\n\t\t}\n#endif /*CONFIG_BEAMFORMING*/\n\t}\n\n#endif //CONFIG_80211N_HT\n}\n\nvoid HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n#ifdef CONFIG_80211N_HT\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv \t\t*pmlmepriv = &padapter->mlmepriv;\t\n\tstruct ht_priv\t\t\t*phtpriv = &pmlmepriv->htpriv;\n\n\tif(pIE==NULL) return;\n\n\tif(phtpriv->ht_option == _FALSE)\treturn;\n\n\n\tif(pIE->Length > sizeof(struct HT_info_element))\n\t\treturn;\n\t\n\tpmlmeinfo->HT_info_enable = 1;\n\t_rtw_memcpy(&(pmlmeinfo->HT_info), pIE->data, pIE->Length);\n#endif //CONFIG_80211N_HT\n\treturn;\n}\n\nvoid HTOnAssocRsp(_adapter *padapter)\n{\n\tunsigned char\t\tmax_AMPDU_len;\n\tunsigned char\t\tmin_MPDU_spacing;\n\t//struct registry_priv\t *pregpriv = &padapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))\n\t{\n\t\tpmlmeinfo->HT_enable = 1;\n\t}\n\telse\n\t{\n\t\tpmlmeinfo->HT_enable = 0;\n\t\t//set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\t\treturn;\n\t}\n\t\n\t//handle A-MPDU parameter field\n\t/* \t\n\t\tAMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k\n\t\tAMPDU_para [4:2]:Min MPDU Start Spacing\t\n\t*/\n\tmax_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x03;\t\n\t\n\tmin_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2;\t\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing));\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len));\n\n#if 0 //move to rtw_update_ht_cap()\n\tif ((pregpriv->bw_mode > 0) &&\n\t\t(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & BIT(1)) && \n\t\t(pmlmeinfo->HT_info.infos[0] & BIT(2)))\n\t{\n\t\t//switch to the 40M Hz mode accoring to the AP\n\t\tpmlmeext->cur_bwmode = CHANNEL_WIDTH_40;\n\t\tswitch ((pmlmeinfo->HT_info.infos[0] & 0x3))\n\t\t{\n\t\t\tcase EXTCHNL_OFFSET_UPPER:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase EXTCHNL_OFFSET_LOWER:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tpmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\t//SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);\n\t}\n#endif\n\n\t//set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n#if 0 //move to rtw_update_ht_cap()\n\t//\n\t// Config SM Power Save setting\n\t//\n\tpmlmeinfo->SM_PS = (pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info & 0x0C) >> 2;\n\tif(pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC)\n\t{\n\t\t/*u8 i;\n\t\t//update the MCS rates\n\t\tfor (i = 0; i < 16; i++)\n\t\t{\n\t\t\tpmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];\n\t\t}*/\n\t\tDBG_871X(\"%s(): WLAN_HT_CAP_SM_PS_STATIC\\n\",__FUNCTION__);\n\t}\n\n\t//\n\t// Config current HT Protection mode.\n\t//\n\tpmlmeinfo->HT_protection = pmlmeinfo->HT_info.infos[1] & 0x3;\n#endif\n\t\n}\n\nvoid ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(pIE->Length>1)\n\t\treturn;\n\t\n\tpmlmeinfo->ERP_enable = 1;\n\t_rtw_memcpy(&(pmlmeinfo->ERP_IE), pIE->data, pIE->Length);\n}\n\nvoid VCS_update(_adapter *padapter, struct sta_info *psta)\n{\n\tstruct registry_priv\t *pregpriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tswitch (pregpriv->vrtl_carrier_sense)/* 0:off 1:on 2:auto */\n\t{\n\t\tcase 0: //off\n\t\t\tpsta->rtsen = 0;\n\t\t\tpsta->cts2self = 0;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 1: //on\n\t\t\tif (pregpriv->vcs_type == 1) /* 1:RTS/CTS 2:CTS to self */\n\t\t\t{\n\t\t\t\tpsta->rtsen = 1;\n\t\t\t\tpsta->cts2self = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpsta->rtsen = 0;\n\t\t\t\tpsta->cts2self = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase 2: //auto\n\t\tdefault:\n\t\t\tif (((pmlmeinfo->ERP_enable) && (pmlmeinfo->ERP_IE & BIT(1)))\n\t\t\t\t/*||(pmlmepriv->ht_op_mode & HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT)*/\n\t\t\t\t) {\n\t\t\t\tif (pregpriv->vcs_type == 1) {\n\t\t\t\t\tpsta->rtsen = 1;\n\t\t\t\t\tpsta->cts2self = 0;\n\t\t\t\t} else {\n\t\t\t\t\tpsta->rtsen = 0;\n\t\t\t\t\tpsta->cts2self = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpsta->rtsen = 0;\n\t\t\t\tpsta->cts2self = 0;\n\t\t\t}\t\n\t\t\tbreak;\n\t}\n}\n\nvoid\tupdate_ldpc_stbc_cap(struct sta_info *psta)\n{\n#ifdef CONFIG_80211N_HT\n\n#ifdef CONFIG_80211AC_VHT\n\tif (psta->vhtpriv.vht_option) {\n\t\tif(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX))\n\t\t\tpsta->ldpc = 1;\n\n\t\tif(TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX))\n\t\t\tpsta->stbc = 1;\n\t}\n\telse\n#endif //CONFIG_80211AC_VHT\n\tif (psta->htpriv.ht_option) {\n\t\tif(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX))\n\t\t\tpsta->ldpc = 1;\n\n\t\tif(TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX))\n\t\t\tpsta->stbc = 1;\n\t} else {\n\t\tpsta->ldpc = 0;\n\t\tpsta->stbc = 0;\n\t}\n\n#endif //CONFIG_80211N_HT\n}\n\n\n/*\n * rtw_get_bcn_keys: get beacon keys from recv frame\n *\n * TODO:\n *\tWLAN_EID_COUNTRY\n *\tWLAN_EID_ERP_INFO\n *\tWLAN_EID_CHANNEL_SWITCH\n *\tWLAN_EID_PWR_CONSTRAINT\n */\nint rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len,\n\t\tstruct beacon_keys *recv_beacon)\n{\n\tint left;\n\tu16 capability;\n\tunsigned char *pos;\n\tstruct rtw_ieee802_11_elems elems;\n\tstruct rtw_ieee80211_ht_cap *pht_cap = NULL;\n\tstruct HT_info_element *pht_info = NULL;\n\n\t_rtw_memset(recv_beacon, 0, sizeof(*recv_beacon));\n\n\t/* checking capabilities */\n\tcapability = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN + 10));\n\n\t/* checking IEs */\n\tleft = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_;\n\tpos = pframe + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_;\n\tif (rtw_ieee802_11_parse_elems(pos, left, &elems, 1) == ParseFailed)\n\t\treturn _FALSE;\n\n\t/* check bw and channel offset */\n\tif (elems.ht_capabilities) {\n\t\tif (elems.ht_capabilities_len != sizeof(*pht_cap))\n\t\t\treturn _FALSE;\n\n\t\tpht_cap = (struct rtw_ieee80211_ht_cap *) elems.ht_capabilities;\n\t\trecv_beacon->ht_cap_info = pht_cap->cap_info;\n\t}\n\n\tif (elems.ht_operation) {\n\t\tif (elems.ht_operation_len != sizeof(*pht_info))\n\t\t\treturn _FALSE;\n\n\t\tpht_info = (struct HT_info_element *) elems.ht_operation;\n\t\trecv_beacon->ht_info_infos_0_sco = pht_info->infos[0] & 0x03;\n\t}\n\n\t/* Checking for channel */\n\tif (elems.ds_params && elems.ds_params_len == sizeof(recv_beacon->bcn_channel))\n\t\t_rtw_memcpy(&recv_beacon->bcn_channel, elems.ds_params,\n\t\t\t\tsizeof(recv_beacon->bcn_channel));\n\telse if (pht_info)\n\t\t/* In 5G, some ap do not have DSSET IE checking HT info for channel */\n\t\trecv_beacon->bcn_channel = pht_info->primary_channel;\n\telse {\n\t\t/* we don't find channel IE, so don't check it */\n\t\t//DBG_871X(\"Oops: %s we don't find channel IE, so don't check it \\n\", __func__);\n\t\trecv_beacon->bcn_channel = Adapter->mlmeextpriv.cur_channel;\n\t}\n\n\t/* checking SSID */\n\tif (elems.ssid) {\n\t       if (elems.ssid_len > sizeof(recv_beacon->ssid))\n\t\t\treturn _FALSE;\n\n\t       _rtw_memcpy(recv_beacon->ssid, elems.ssid, elems.ssid_len);\n\t       recv_beacon->ssid_len = elems.ssid_len;\n\t} else; // means hidden ssid\n\n\t/* checking RSN first */\n\tif (elems.rsn_ie && elems.rsn_ie_len) {\n\t\trecv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA2;\n\t\trtw_parse_wpa2_ie(elems.rsn_ie - 2, elems.rsn_ie_len + 2,\n\t\t\t&recv_beacon->group_cipher, &recv_beacon->pairwise_cipher,\n\t\t\t&recv_beacon->is_8021x);\n\t}\n\t/* checking WPA secon */\n\telse if (elems.wpa_ie && elems.wpa_ie_len) {\n\t\trecv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WPA;\n\t\trtw_parse_wpa_ie(elems.wpa_ie - 2, elems.wpa_ie_len + 2,\n\t\t\t&recv_beacon->group_cipher, &recv_beacon->pairwise_cipher,\n\t\t\t&recv_beacon->is_8021x);\n\t}\n\telse if (capability & BIT(4)) {\n\t\trecv_beacon->encryp_protocol = ENCRYP_PROTOCOL_WEP;\n\t}\n\n\treturn _TRUE;\n}\n\nvoid rtw_dump_bcn_keys(struct beacon_keys *recv_beacon)\n{\n\tint i;\n\tchar *p;\n\tu8 ssid[IW_ESSID_MAX_SIZE + 1];\n\n\t_rtw_memcpy(ssid, recv_beacon->ssid, recv_beacon->ssid_len);\n\tssid[recv_beacon->ssid_len] = '\\0';\n\n\tDBG_871X(\"%s: ssid = %s\\n\", __func__, ssid);\n\tDBG_871X(\"%s: channel = %x\\n\", __func__, recv_beacon->bcn_channel);\n\tDBG_871X(\"%s: ht_cap = %x\\n\", __func__,\trecv_beacon->ht_cap_info);\n\tDBG_871X(\"%s: ht_info_infos_0_sco = %x\\n\", __func__, recv_beacon->ht_info_infos_0_sco);\n\tDBG_871X(\"%s: sec=%d, group = %x, pair = %x, 8021X = %x\\n\", __func__,\n\t\trecv_beacon->encryp_protocol, recv_beacon->group_cipher,\n\t\trecv_beacon->pairwise_cipher, recv_beacon->is_8021x);\n}\n\nint rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)\n{\n#if 0\n\tunsigned int\t\tlen;\n\tunsigned char\t\t*p;\n\tunsigned short\tval16, subtype;\n\tstruct wlan_network *cur_network = &(Adapter->mlmepriv.cur_network);\n\t//u8 wpa_ie[255],rsn_ie[255];\n\tu16 wpa_len=0,rsn_len=0;\n\tu8 encryp_protocol = 0;\n\tWLAN_BSSID_EX *bssid;\n\tint group_cipher = 0, pairwise_cipher = 0, is_8021x = 0;\n\tunsigned char *pbuf;\n\tu32 wpa_ielen = 0;\n\tu8 *pbssid = GetAddr3Ptr(pframe);\n\tu32 hidden_ssid = 0;\n\tu8 cur_network_type, network_type=0;\n\tstruct HT_info_element *pht_info = NULL;\n\tstruct rtw_ieee80211_ht_cap *pht_cap = NULL;\n\tu32 bcn_channel;\n\tunsigned short \tht_cap_info;\n\tunsigned char\tht_info_infos_0;\n#endif\n\tunsigned int len;\n\tu8 *pbssid = GetAddr3Ptr(pframe);\n\tstruct mlme_priv *pmlmepriv = &Adapter->mlmepriv;\n\tstruct wlan_network *cur_network = &(Adapter->mlmepriv.cur_network);\n\tstruct beacon_keys recv_beacon;\n\n\tif (is_client_associated_to_ap(Adapter) == _FALSE)\n\t\treturn _TRUE;\n\n\tlen = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tif (len > MAX_IE_SZ) {\n\t\tDBG_871X(\"%s IE too long for survey event\\n\", __func__);\n\t\treturn _FAIL;\n\t}\n\n\tif (_rtw_memcmp(cur_network->network.MacAddress, pbssid, 6) == _FALSE) {\n\t\tDBG_871X(\"Oops: rtw_check_network_encrypt linked but recv other bssid bcn\\n\" MAC_FMT MAC_FMT,\n\t\t\t\tMAC_ARG(pbssid), MAC_ARG(cur_network->network.MacAddress));\n\t\treturn _TRUE;\n\t}\n\n\tif (rtw_get_bcn_keys(Adapter, pframe, packet_len, &recv_beacon) == _FALSE)\n\t\treturn _TRUE; // parsing failed => broken IE\n\n\t// don't care hidden ssid, use current beacon ssid directly\n\tif (recv_beacon.ssid_len == 0) {\n\t       _rtw_memcpy(recv_beacon.ssid, pmlmepriv->cur_beacon_keys.ssid,\n\t\t\t       pmlmepriv->cur_beacon_keys.ssid_len);\n\t       recv_beacon.ssid_len = pmlmepriv->cur_beacon_keys.ssid_len;\n\t}\n\n\tif (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys, sizeof(recv_beacon)) == _TRUE)\n\t{\n\t\tpmlmepriv->new_beacon_cnts = 0;\n\t}\n\telse if ((pmlmepriv->new_beacon_cnts == 0) ||\n\t\t_rtw_memcmp(&recv_beacon, &pmlmepriv->new_beacon_keys, sizeof(recv_beacon)) == _FALSE)\n\t{\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s: start new beacon (seq=%d)\\n\", __func__, GetSequence(pframe));\n\n\t\tif (pmlmepriv->new_beacon_cnts == 0) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s: cur beacon key\\n\", __func__);\n\t\t\tDBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&pmlmepriv->cur_beacon_keys));\n\t\t}\n\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s: new beacon key\\n\", __func__);\n\t\tDBG_871X_EXP(_drv_err_, rtw_dump_bcn_keys(&recv_beacon));\n\n\t\tmemcpy(&pmlmepriv->new_beacon_keys, &recv_beacon, sizeof(recv_beacon));\n\t\tpmlmepriv->new_beacon_cnts = 1;\n\t}\n\telse\n\t{\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s: new beacon again (seq=%d)\\n\", __func__, GetSequence(pframe));\n\t\tpmlmepriv->new_beacon_cnts++;\n\t}\n\n\t// if counter >= max, it means beacon is changed really\n\tif (pmlmepriv->new_beacon_cnts >= new_bcn_max)\n\t{\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s: new beacon occur!!\\n\", __func__);\n\n\t\t// check bw mode change only?\n\t\tpmlmepriv->cur_beacon_keys.ht_cap_info = recv_beacon.ht_cap_info;\n\t\tpmlmepriv->cur_beacon_keys.ht_info_infos_0_sco = recv_beacon.ht_info_infos_0_sco;\n\n\t\tif (_rtw_memcmp(&recv_beacon, &pmlmepriv->cur_beacon_keys,\n\t\t\t\t\tsizeof(recv_beacon)) == _FALSE) {\n\t\t\t// beacon is changed, have to do disconnect/connect\n\t\t\treturn _FAIL;\n\t\t}\n\n\t\tDBG_871X(\"%s bw mode change\\n\", __func__);\n\t\tDBG_871X(\"%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\\n\", __func__,\n\t\t\t\tcur_network->BcnInfo.ht_cap_info,\n\t\t\t\tcur_network->BcnInfo.ht_info_infos_0);\n\n\t\tcur_network->BcnInfo.ht_cap_info = recv_beacon.ht_cap_info;\n\t\tcur_network->BcnInfo.ht_info_infos_0 =\n\t\t\t(cur_network->BcnInfo.ht_info_infos_0 & (~0x03)) |\n\t\t\trecv_beacon.ht_info_infos_0_sco;\n\n\t\tDBG_871X(\"%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\\n\", __func__,\n\t\t\t\tcur_network->BcnInfo.ht_cap_info,\n\t\t\t\tcur_network->BcnInfo.ht_info_infos_0);\n\n\t\tmemcpy(&pmlmepriv->cur_beacon_keys, &recv_beacon, sizeof(recv_beacon));\n\t\tpmlmepriv->new_beacon_cnts = 0;\n\t}\n\n\treturn _SUCCESS;\n\n#if 0\n\tbssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));\n\tif (bssid == NULL) {\n\t\tDBG_871X(\"%s rtw_zmalloc fail !!!\\n\", __func__);\n\t\treturn _TRUE;\n\t}\n\n\tif ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS))\n\t{\n\t\tpmlmepriv->timeBcnInfoChkStart = 0;\n\t\tpmlmepriv->NumOfBcnInfoChkFail = 0;\n\t}\n\n\tsubtype = GetFrameSubType(pframe) >> 4;\n\n\tif(subtype==WIFI_BEACON)\n\t\tbssid->Reserved[0] = 1;\n\n\tbssid->Length = sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + len;\n\n\t/* below is to copy the information element */\n\tbssid->IELength = len;\n\t_rtw_memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength);\n\n\t/* check bw and channel offset */\n\t/* parsing HT_CAP_IE */\n\tp = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_CAPABILITY_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);\n\tif(p && len>0) {\n\t\t\tpht_cap = (struct rtw_ieee80211_ht_cap *)(p + 2);\n\t\t\tht_cap_info = pht_cap->cap_info;\n\t} else {\n\t\t\tht_cap_info = 0;\n\t}\n\t/* parsing HT_INFO_IE */\n\tp = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);\n\tif(p && len>0) {\n\t\t\tpht_info = (struct HT_info_element *)(p + 2);\n\t\t\tht_info_infos_0 = pht_info->infos[0];\n\t} else {\n\t\t\tht_info_infos_0 = 0;\n\t}\n\tif (ht_cap_info != cur_network->BcnInfo.ht_cap_info ||\n\t\t((ht_info_infos_0&0x03) != (cur_network->BcnInfo.ht_info_infos_0&0x03))) {\n\t\t\tDBG_871X(\"%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\\n\", __func__,\n\t\t\t\t\t\t   \tht_cap_info, ht_info_infos_0);\n\t\t\tDBG_871X(\"%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\\n\", __func__,\n\t\t\t\t\t\t   \tcur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);\n\t\t\tDBG_871X(\"%s bw mode change\\n\", __func__);\n\t\t\t{\t\n\t\t\t\t//bcn_info_update\n\t\t\t\tcur_network->BcnInfo.ht_cap_info = ht_cap_info;\n\t\t\t\tcur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0;\n\t\t\t\t//to do : need to check that whether modify related register of BB or not \n\t\t\t}\n\t\t\t//goto _mismatch;\n\t}\n\n\t/* Checking for channel */\n\tp = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _DSSET_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);\n\tif (p) {\n\t\t\tbcn_channel = *(p + 2);\n\t} else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */\n\t\t\trtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _HT_ADD_INFO_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_);\n\t\t\tif(pht_info) {\n\t\t\t\t\tbcn_channel = pht_info->primary_channel;\n\t\t\t} else { /* we don't find channel IE, so don't check it */\n\t\t\t\t\t//DBG_871X(\"Oops: %s we don't find channel IE, so don't check it \\n\", __func__);\n\t\t\t\t\tbcn_channel = Adapter->mlmeextpriv.cur_channel;\n\t\t\t}\n\t}\n\tif (bcn_channel != Adapter->mlmeextpriv.cur_channel) {\n\t\t\tDBG_871X(\"%s beacon channel:%d cur channel:%d disconnect\\n\", __func__,\n\t\t\t\t\t\t   bcn_channel, Adapter->mlmeextpriv.cur_channel);\n\t\t\tgoto _mismatch;\n\t}\n\n\t/* checking SSID */\n\tif ((p = rtw_get_ie(bssid->IEs + _FIXED_IE_LENGTH_, _SSID_IE_, &len, bssid->IELength - _FIXED_IE_LENGTH_)) == NULL) {\n\t\tDBG_871X(\"%s marc: cannot find SSID for survey event\\n\", __func__);\n\t\thidden_ssid = _TRUE;\n\t} else {\n\t\thidden_ssid = _FALSE;\n\t}\n\n\tif((NULL != p) && (_FALSE == hidden_ssid && (*(p + 1)))) {\n\t\t_rtw_memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1));\n\t\tbssid->Ssid.SsidLength = *(p + 1);\n\t} else {\n\t\tbssid->Ssid.SsidLength = 0;\n\t\tbssid->Ssid.Ssid[0] = '\\0';\n\t}\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"%s bssid.Ssid.Ssid:%s bssid.Ssid.SsidLength:%d \"\n\t\t\t\t\"cur_network->network.Ssid.Ssid:%s len:%d\\n\", __func__, bssid->Ssid.Ssid,\n\t\t\t\tbssid->Ssid.SsidLength, cur_network->network.Ssid.Ssid,\n\t\t\t\tcur_network->network.Ssid.SsidLength));\n\n\tif (_rtw_memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) == _FALSE ||\n\t\t\tbssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) {\n\t\tif (bssid->Ssid.Ssid[0] != '\\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */\n\t\t\tDBG_871X(\"%s(), SSID is not match\\n\", __func__);\n\t\t\tgoto _mismatch;\n\t\t}\n\t}\n\n\t/* check encryption info */\n\tval16 = rtw_get_capability((WLAN_BSSID_EX *)bssid);\n\n\tif (val16 & BIT(4))\n\t\tbssid->Privacy = 1;\n\telse\n\t\tbssid->Privacy = 0;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,\n\t\t\t(\"%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\\n\",\n\t\t\t __func__, cur_network->network.Privacy,bssid->Privacy));\n\tif (cur_network->network.Privacy != bssid->Privacy) {\n\t\tDBG_871X(\"%s(), privacy is not match\\n\",__func__);\n\t\tgoto _mismatch;\n\t}\n\n\trtw_get_sec_ie(bssid->IEs, bssid->IELength, NULL,&rsn_len,NULL,&wpa_len);\n\n\tif (rsn_len > 0) {\n\t\tencryp_protocol = ENCRYP_PROTOCOL_WPA2;\n\t} else if (wpa_len > 0) {\n\t\tencryp_protocol = ENCRYP_PROTOCOL_WPA;\n\t} else {\n\t\tif (bssid->Privacy)\n\t\t\tencryp_protocol = ENCRYP_PROTOCOL_WEP;\n\t}\n\n\tif (cur_network->BcnInfo.encryp_protocol != encryp_protocol) {\n\t\tDBG_871X(\"%s(): enctyp is not match\\n\",__func__);\n\t\tgoto _mismatch;\n\t}\n\n\tif (encryp_protocol == ENCRYP_PROTOCOL_WPA || encryp_protocol == ENCRYP_PROTOCOL_WPA2) {\n\t\tpbuf = rtw_get_wpa_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12);\n\t\tif(pbuf && (wpa_ielen>0)) {\n\t\t\tif (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) {\n\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,\n\t\t\t\t\t\t(\"%s pnetwork->pairwise_cipher: %d, group_cipher is %d, is_8021x is %d\\n\", __func__,\n\t\t\t\t\t\t pairwise_cipher, group_cipher, is_8021x));\n\t\t\t}\n\t\t} else {\n\t\t\tpbuf = rtw_get_wpa2_ie(&bssid->IEs[12], &wpa_ielen, bssid->IELength-12);\n\n\t\t\tif(pbuf && (wpa_ielen>0)) {\n\t\t\t\tif (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen+2, &group_cipher, &pairwise_cipher, &is_8021x)) {\n\t\t\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,\n\t\t\t\t\t\t\t(\"%s pnetwork->pairwise_cipher: %d, pnetwork->group_cipher is %d, is_802x is %d\\n\",\n\t\t\t\t\t\t\t __func__, pairwise_cipher, group_cipher, is_8021x));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,\n\t\t\t\t(\"%s cur_network->group_cipher is %d: %d\\n\",__func__, cur_network->BcnInfo.group_cipher, group_cipher));\n\t\tif (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {\n\t\t\tDBG_871X(\"%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\\n\",__func__,\n\t\t\t\t\tpairwise_cipher, cur_network->BcnInfo.pairwise_cipher,\n\t\t\t\t\tgroup_cipher, cur_network->BcnInfo.group_cipher);\n\t\t\tgoto _mismatch;\n\t\t}\n\n\t\tif (is_8021x != cur_network->BcnInfo.is_8021x) {\n\t\t\tDBG_871X(\"%s authentication is not match\\n\", __func__);\n\t\t\tgoto _mismatch;\n\t\t}\n\t}\n\n\trtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));\n\treturn _SUCCESS;\n\n_mismatch:\n\trtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));\n\n\tif (pmlmepriv->NumOfBcnInfoChkFail == 0)\n\t{\n\t\tpmlmepriv->timeBcnInfoChkStart = rtw_get_current_time();\n\t}\n\n\tpmlmepriv->NumOfBcnInfoChkFail++;\n\tDBG_871X(\"%s by \"ADPT_FMT\" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\\n\", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));\n\n\tif ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS) \n\t\t&& (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD))\n\t{\n\t\tDBG_871X(\"%s by \"ADPT_FMT\" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\\n\", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, \n\t\t\tDISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));\n\t\tpmlmepriv->timeBcnInfoChkStart = 0;\n\t\tpmlmepriv->NumOfBcnInfoChkFail = 0;\n\t\treturn _FAIL;\n\t}\n\n\treturn _SUCCESS;\n#endif\n}\n\nvoid update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)\n{\n\tunsigned int i;\n\tunsigned int len;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\t\t\n#ifdef CONFIG_TDLS\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tu8 tdls_prohibited[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; //bit(38): TDLS_prohibited\n#endif //CONFIG_TDLS\n\t\t\n\tlen = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);\n\n\tfor (i = 0; i < len;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);\n\t\t\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\t\t\n\t\t\t\t//to update WMM paramter set while receiving beacon\n\t\t\t\tif (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN)\t//WMM\n\t\t\t\t{\n\t\t\t\t\t(WMM_param_handler(padapter, pIE))? report_wmm_edca_update(padapter): 0;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase _HT_EXTRA_INFO_IE_:\t//HT info\t\t\t\t\n\t\t\t\t//HT_info_handler(padapter, pIE);\n\t\t\t\tbwmode_update_check(padapter, pIE);\n\t\t\t\tbreak;\n#ifdef CONFIG_80211AC_VHT\n\t\t\tcase EID_OpModeNotification:\n\t\t\t\trtw_process_vht_op_mode_notify(padapter, pIE->data, psta);\n\t\t\t\tbreak;\n#endif //CONFIG_80211AC_VHT\n\t\t\tcase _ERPINFO_IE_:\n\t\t\t\tERP_IE_handler(padapter, pIE);\n\t\t\t\tVCS_update(padapter, psta);\n\t\t\t\tbreak;\n\n#ifdef CONFIG_TDLS\n\t\t\tcase _EXT_CAP_IE_:\n\t\t\t\tif( check_ap_tdls_prohibited(pIE->data, pIE->Length) == _TRUE )\n\t\t\t\t\tptdlsinfo->ap_prohibited = _TRUE;\n\t\t\t\tif (check_ap_tdls_ch_switching_prohibited(pIE->data, pIE->Length) == _TRUE)\n\t\t\t\t\tptdlsinfo->ch_switch_prohibited = _TRUE;\n\t\t\t\tbreak;\n#endif //CONFIG_TDLS\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\ti += (pIE->Length + 2);\n\t}\n}\n\n#ifdef CONFIG_DFS\nvoid process_csa_ie(_adapter *padapter, u8 *pframe, uint pkt_len)\n{\n\tunsigned int i;\n\tunsigned int len;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tu8 new_ch_no = 0; \n\n\tif(padapter->mlmepriv.handle_dfs == _TRUE )\n\t\treturn;\n\t\n\tlen = pkt_len - (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN);\n\n\tfor (i = 0; i < len;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + (_BEACON_IE_OFFSET_ + WLAN_HDR_A3_LEN) + i);\n\t\t\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _CH_SWTICH_ANNOUNCE_:\n\t\t\t\tpadapter->mlmepriv.handle_dfs = _TRUE;\n\t\t\t\t_rtw_memcpy(&new_ch_no, pIE->data+1, 1);\n\t\t\t\trtw_set_csa_cmd(padapter, new_ch_no);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\ti += (pIE->Length + 2);\n\t}\n}\n#endif //CONFIG_DFS\n\nunsigned int is_ap_in_tkip(_adapter *padapter)\n{\n\tu32 i;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\n\tif (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY)\n\t{\n\t\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)\n\t\t{\n\t\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);\n\t\t\n\t\t\tswitch (pIE->ElementID)\n\t\t\t{\n\t\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\t\tif ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) && (_rtw_memcmp((pIE->data + 12), WPA_TKIP_CIPHER, 4))) \n\t\t\t\t\t{\n\t\t\t\t\t\treturn _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase _RSN_IE_2_:\n\t\t\t\t\tif (_rtw_memcmp((pIE->data + 8), RSN_TKIP_CIPHER, 4)) \n\t\t\t\t\t{\n\t\t\t\t\t\treturn _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\ti += (pIE->Length + 2);\n\t\t}\n\t\t\n\t\treturn _FALSE;\n\t}\n\telse\n\t{\n\t\treturn _FALSE;\n\t}\n\t\n}\n\nunsigned int should_forbid_n_rate(_adapter * padapter)\n{\n\tu32 i;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tWLAN_BSSID_EX  *cur_network = &pmlmepriv->cur_network.network;\n\n\tif (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY)\n\t{\n\t\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < cur_network->IELength;)\n\t\t{\n\t\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(cur_network->IEs + i);\n\n\t\t\tswitch (pIE->ElementID)\n\t\t\t{\n\t\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\t\tif (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4) &&\n\t\t\t\t\t\t((_rtw_memcmp((pIE->data + 12), WPA_CIPHER_SUITE_CCMP, 4)) ||\n\t\t\t\t\t\t  (_rtw_memcmp((pIE->data + 16), WPA_CIPHER_SUITE_CCMP, 4))))\n\t\t\t\t\t\treturn _FALSE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase _RSN_IE_2_:\n\t\t\t\t\tif  ((_rtw_memcmp((pIE->data + 8), RSN_CIPHER_SUITE_CCMP, 4))  ||\n\t\t\t\t\t       (_rtw_memcmp((pIE->data + 12), RSN_CIPHER_SUITE_CCMP, 4)))\n\t\t\t\t\t\treturn _FALSE;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ti += (pIE->Length + 2);\n\t\t}\n\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FALSE;\n\t}\n\n}\n\n\nunsigned int is_ap_in_wep(_adapter *padapter)\n{\n\tu32 i;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\n\tif (rtw_get_capability((WLAN_BSSID_EX *)cur_network) & WLAN_CAPABILITY_PRIVACY)\n\t{\n\t\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < pmlmeinfo->network.IELength;)\n\t\t{\n\t\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pmlmeinfo->network.IEs + i);\n\n\t\t\tswitch (pIE->ElementID)\n\t\t\t{\n\t\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\t\tif (_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4))\n\t\t\t\t\t\treturn _FALSE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase _RSN_IE_2_:\n\t\t\t\t\treturn _FALSE;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ti += (pIE->Length + 2);\n\t\t}\n\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FALSE;\n\t}\n\n}\n\nint wifirate2_ratetbl_inx(unsigned char rate);\nint wifirate2_ratetbl_inx(unsigned char rate)\n{\n\tint\tinx = 0;\n\trate = rate & 0x7f;\n\n\tswitch (rate) \n\t{\n\t\tcase 54*2:\n\t\t\tinx = 11;\n\t\t\tbreak;\n\n\t\tcase 48*2:\n\t\t\tinx = 10;\n\t\t\tbreak;\n\n\t\tcase 36*2:\n\t\t\tinx = 9;\n\t\t\tbreak;\n\n\t\tcase 24*2:\n\t\t\tinx = 8;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 18*2:\n\t\t\tinx = 7;\n\t\t\tbreak;\n\n\t\tcase 12*2:\n\t\t\tinx = 6;\n\t\t\tbreak;\n\n\t\tcase 9*2:\n\t\t\tinx = 5;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 6*2:\n\t\t\tinx = 4;\n\t\t\tbreak;\n\n\t\tcase 11*2:\n\t\t\tinx = 3;\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\tinx = 2;\n\t\t\tbreak;\n\n\t\tcase 2*2:\n\t\t\tinx = 1;\n\t\t\tbreak;\n\t\t\n\t\tcase 1*2:\n\t\t\tinx = 0;\n\t\t\tbreak;\n\n\t}\n\treturn inx;\t\n}\n\nunsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz)\n{\n\tunsigned int i, num_of_rate;\n\tunsigned int mask = 0;\n\t\n\tnum_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;\n\t\t\n\tfor (i = 0; i < num_of_rate; i++)\n\t{\n\t\tif ((*(ptn + i)) & 0x80)\n\t\t{\n\t\t\tmask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));\n\t\t}\n\t}\n\treturn mask;\n}\n\nunsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz)\n{\n\tunsigned int i, num_of_rate;\n\tunsigned int mask = 0;\n\t\n\tnum_of_rate = (ptn_sz > NumRates)? NumRates: ptn_sz;\n\t\t\n\tfor (i = 0; i < num_of_rate; i++)\n\t{\n\t\tmask |= 0x1 << wifirate2_ratetbl_inx(*(ptn + i));\n\t}\n\n\treturn mask;\n}\n\nunsigned int update_MCS_rate(struct HT_caps_element *pHT_caps)\n{\n\tunsigned int mask = 0;\n\t\n\tmask = ((pHT_caps->u.HT_cap_element.MCS_rate[0] << 12) | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 20));\n\t\t\t\t\t\t\n\treturn mask;\n}\n\nint support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps, u8 bwmode)\n{\n\tunsigned char\t\t\t\t\tbit_offset;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tif (!(pmlmeinfo->HT_enable))\n\t\treturn _FAIL; \n\n\tbit_offset = (bwmode & CHANNEL_WIDTH_40)? 6: 5;\n\t\n\tif (pHT_caps->u.HT_cap_element.HT_caps_info & (0x1 << bit_offset))\n\t{\n\t\treturn _SUCCESS;\n\t}\n\telse\n\t{\n\t\treturn _FAIL;\n\t}\t\t\n}\n\nunsigned char get_highest_rate_idx(u32 mask)\n{\n\tint i;\n\tunsigned char rate_idx=0;\n\n\tfor(i=31; i>=0; i--)\n\t{\n\t\tif(mask & BIT(i))\n\t\t{\n\t\t\trate_idx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn rate_idx;\n}\n\nunsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps);\nunsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps)\n{\n\tint i, mcs_rate;\n\t\n\tmcs_rate = (pHT_caps->u.HT_cap_element.MCS_rate[0] | (pHT_caps->u.HT_cap_element.MCS_rate[1] << 8));\n\t\n\tfor (i = 15; i >= 0; i--)\n\t{\n\t\tif (mcs_rate & (0x1 << i))\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\treturn i;\n}\n\nvoid Update_RA_Entry(_adapter *padapter, struct sta_info *psta)\n{\n\trtw_hal_update_ra_mask(psta, 0);\n}\n\nvoid enable_rate_adaptive(_adapter *padapter, struct sta_info *psta);\nvoid enable_rate_adaptive(_adapter *padapter, struct sta_info *psta)\n{\n\tUpdate_RA_Entry(padapter, psta);\n}\n\nvoid set_sta_rate(_adapter *padapter, struct sta_info *psta)\n{\n\t//rate adaptive\t\n\tenable_rate_adaptive(padapter, psta);\n}\n\n// Update RRSR and Rate for USERATE\nvoid update_tx_basic_rate(_adapter *padapter, u8 wirelessmode)\n{\n\tNDIS_802_11_RATES_EX\tsupported_rates;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info*\tpwdinfo = &padapter->wdinfo;\n\n\t//\tAdded by Albert 2011/03/22\n\t//\tIn the P2P mode, the driver should not support the b mode.\n\t//\tSo, the Tx packet shouldn't use the CCK rate\n\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\treturn;\n#endif //CONFIG_P2P\n#ifdef CONFIG_INTEL_WIDI\n\tif (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_NONE)\n\t\treturn;\n#endif //CONFIG_INTEL_WIDI\n\n\t_rtw_memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);\n\n\t//clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band.\n\tif(pmlmeext->cur_channel > 14)\n\t\twirelessmode &= ~(WIRELESS_11B);\n\n\tif ((wirelessmode & WIRELESS_11B) && (wirelessmode == WIRELESS_11B)) {\n\t\t_rtw_memcpy(supported_rates, rtw_basic_rate_cck, 4);\n\t} else if (wirelessmode & WIRELESS_11B) {\n\t\t_rtw_memcpy(supported_rates, rtw_basic_rate_mix, 7);\n\t} else {\n\t\t_rtw_memcpy(supported_rates, rtw_basic_rate_ofdm, 3);\n\t}\n\n\tif (wirelessmode & WIRELESS_11B)\n\t\tupdate_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);\n\telse\n\t\tupdate_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, supported_rates);\n}\n\nunsigned char check_assoc_AP(u8 *pframe, uint len)\n{\n\tunsigned int\ti;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\n\tfor (i = sizeof(NDIS_802_11_FIXED_IEs); i < len;)\n\t{\n\t\tpIE = (PNDIS_802_11_VARIABLE_IEs)(pframe + i);\n\t\t\n\t\tswitch (pIE->ElementID)\n\t\t{\n\t\t\tcase _VENDOR_SPECIFIC_IE_:\n\t\t\t\tif ((_rtw_memcmp(pIE->data, ARTHEROS_OUI1, 3)) || (_rtw_memcmp(pIE->data, ARTHEROS_OUI2, 3)))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Artheros AP\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_ATHEROS;\n\t\t\t\t}\n\t\t\t\telse if (\t(_rtw_memcmp(pIE->data, BROADCOM_OUI1, 3))\n\t\t\t\t\t\t|| (_rtw_memcmp(pIE->data, BROADCOM_OUI2, 3))\n\t\t\t\t\t\t|| (_rtw_memcmp(pIE->data, BROADCOM_OUI3, 3)))\t\t\t\t\t\t\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Broadcom AP\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_BROADCOM;\n\t\t\t\t}\n\t\t\t\telse if (_rtw_memcmp(pIE->data, MARVELL_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Marvell AP\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_MARVELL;\n\t\t\t\t}\n\t\t\t\telse if (_rtw_memcmp(pIE->data, RALINK_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Ralink AP\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_RALINK;\n\t\t\t\t}\n\t\t\t\telse if (_rtw_memcmp(pIE->data, CISCO_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Cisco AP\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_CISCO;\n\t\t\t\t}\n\t\t\t\telse if (_rtw_memcmp(pIE->data, REALTEK_OUI, 3))\n\t\t\t\t{\n\t\t\t\t\tu32\tVender = HT_IOT_PEER_REALTEK;\n\n\t\t\t\t\tif(pIE->Length >= 5) {\n\t\t\t\t\t\tif(pIE->data[4]==1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//if(pIE->data[5] & RT_HT_CAP_USE_LONG_PREAMBLE)\n\t\t\t\t\t\t\t//\tbssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_LONG_PREAMBLE;\n\n\t\t\t\t\t\t\tif(pIE->data[5] & RT_HT_CAP_USE_92SE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t//bssDesc->BssHT.RT2RT_HT_Mode |= RT_HT_CAP_USE_92SE;\n\t\t\t\t\t\t\t\tVender = HT_IOT_PEER_REALTEK_92SE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(pIE->data[5] & RT_HT_CAP_USE_SOFTAP)\n\t\t\t\t\t\t\tVender = HT_IOT_PEER_REALTEK_SOFTAP;\n\n\t\t\t\t\t\tif(pIE->data[4] == 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(pIE->data[6] & RT_HT_CAP_USE_JAGUAR_BCUT) {\n\t\t\t\t\t\t\t\tVender = HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP;\n\t\t\t\t\t\t\t\tDBG_871X(\"link to Realtek JAGUAR_BCUTAP\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(pIE->data[6] & RT_HT_CAP_USE_JAGUAR_CCUT) {\n\t\t\t\t\t\t\t\tVender = HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP;\n\t\t\t\t\t\t\t\tDBG_871X(\"link to Realtek JAGUAR_CCUTAP\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tDBG_871X(\"link to Realtek AP\\n\");\n\t\t\t\t\treturn Vender;\n\t\t\t\t}\n\t\t\t\telse if (_rtw_memcmp(pIE->data, AIRGOCAP_OUI,3))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"link to Airgo Cap\\n\");\n\t\t\t\t\treturn HT_IOT_PEER_AIRGO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t\t\t\n\t\ti += (pIE->Length + 2);\n\t}\n\t\n\tDBG_871X(\"link to new AP\\n\");\n\treturn HT_IOT_PEER_UNKNOWN;\n}\n\nvoid update_capinfo(PADAPTER Adapter, u16 updateCap)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tBOOLEAN\t\tShortPreamble;\n\n\t// Check preamble mode, 2005.01.06, by rcnjko.\n\t// Mark to update preamble value forever, 2008.03.18 by lanhsin\n\t//if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO )\n\t{\n\t\t\t\n\t\tif(updateCap & cShortPreamble)\n\t\t{ // Short Preamble\n\t\t\tif(pmlmeinfo->preamble_mode != PREAMBLE_SHORT) // PREAMBLE_LONG or PREAMBLE_AUTO\n\t\t\t{\n\t\t\t\tShortPreamble = _TRUE;\n\t\t\t\tpmlmeinfo->preamble_mode = PREAMBLE_SHORT;\n\t\t\t\trtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{ // Long Preamble\n\t\t\tif(pmlmeinfo->preamble_mode != PREAMBLE_LONG)  // PREAMBLE_SHORT or PREAMBLE_AUTO\n\t\t\t{\n\t\t\t\tShortPreamble = _FALSE;\n\t\t\t\tpmlmeinfo->preamble_mode = PREAMBLE_LONG;\n\t\t\t\trtw_hal_set_hwreg( Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( updateCap & cIBSS ) {\n\t\t//Filen: See 802.11-2007 p.91\n\t\tpmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;\n\t}\n\telse\n\t{\n\t\t//Filen: See 802.11-2007 p.90\n\t\tif( pmlmeext->cur_wireless_mode & (WIRELESS_11_24N | WIRELESS_11A | WIRELESS_11_5N | WIRELESS_11AC))\n\t\t{\n\t\t\tpmlmeinfo->slotTime = SHORT_SLOT_TIME;\n\t\t}\n\t\telse if( pmlmeext->cur_wireless_mode & (WIRELESS_11G))\n\t\t{\n\t\t\tif( (updateCap & cShortSlotTime) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */)\n\t\t\t{ // Short Slot Time\n\t\t\t\tpmlmeinfo->slotTime = SHORT_SLOT_TIME;\n\t\t\t}\n\t\t\telse\n\t\t\t{ // Long Slot Time\n\t\t\t\tpmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//B Mode\n\t\t\tpmlmeinfo->slotTime = NON_SHORT_SLOT_TIME;\n\t\t}\n \t}\n \n\trtw_hal_set_hwreg( Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime );\n\n}\n\n/*\n* set adapter.mlmeextpriv.mlmext_info.HT_enable\n* set adapter.mlmeextpriv.cur_wireless_mode\n* set SIFS register\n* set mgmt tx rate\n*/\nvoid update_wireless_mode(_adapter *padapter)\n{\n\tint ratelen, network_type = 0;\n\tu32 SIFS_Timer;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tunsigned char\t\t\t*rate = cur_network->SupportedRates;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo= &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n\tratelen = rtw_get_rateset_len(cur_network->SupportedRates);\n\n\tif ((pmlmeinfo->HT_info_enable) && (pmlmeinfo->HT_caps_enable))\n\t{\n\t\tpmlmeinfo->HT_enable = 1;\n\t}\n\n\tif(pmlmeext->cur_channel > 14)\n\t{\n\t\tif (pmlmeinfo->VHT_enable)\n\t\t\tnetwork_type = WIRELESS_11AC;\n\t\telse if (pmlmeinfo->HT_enable)\n\t\t\tnetwork_type = WIRELESS_11_5N;\n\n\t\tnetwork_type |= WIRELESS_11A;\n\t}\n\telse\n\t{\n\t\tif (pmlmeinfo->VHT_enable)\n\t\t\tnetwork_type = WIRELESS_11AC;\n\t\telse if (pmlmeinfo->HT_enable)\n\t\t\tnetwork_type = WIRELESS_11_24N;\n\t\n\t\tif ((cckratesonly_included(rate, ratelen)) == _TRUE)\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11B;\n\t\t}\n\t\telse if((cckrates_included(rate, ratelen)) == _TRUE)\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11BG;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnetwork_type |= WIRELESS_11G;\n\t\t}\n\t}\n\n\tpmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode;\n\t/* DBG_871X(\"network_type=%02x, padapter->registrypriv.wireless_mode=%02x\\n\", network_type, padapter->registrypriv.wireless_mode); */\n/*\n\tif((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||\n\t\t(pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G)\n\t\tSIFS_Timer = 0x0a0a;//CCK\n\telse\n\t\tSIFS_Timer = 0x0e0e;//pHalData->SifsTime; //OFDM\n*/\n\t\n\tSIFS_Timer = 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM\n                             //change this value if having IOT issues.\n\t\t\n\trtw_hal_set_hwreg( padapter, HW_VAR_RESP_SIFS,  (u8 *)&SIFS_Timer);\n\n\trtw_hal_set_hwreg( padapter, HW_VAR_WIRELESS_MODE,  (u8 *)&(pmlmeext->cur_wireless_mode));\n\n\tif ((pmlmeext->cur_wireless_mode & WIRELESS_11B)\n\t\t&& rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\tupdate_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB);\n\telse\n\t\tupdate_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB);\n}\n\nvoid fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value);\nvoid fire_write_MAC_cmd(_adapter *padapter, unsigned int addr, unsigned int value)\n{\n#if 0\n\tstruct cmd_obj\t\t\t\t\t*ph2c;\n\tstruct reg_rw_parm\t\t\t*pwriteMacPara;\n\tstruct cmd_priv\t\t\t\t\t*pcmdpriv = &(padapter->cmdpriv);\n\n\tif ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)\n\t{\n\t\treturn;\n\t}\t\n\n\tif ((pwriteMacPara = (struct reg_rw_parm*)rtw_malloc(sizeof(struct reg_rw_parm))) == NULL) \n\t{\t\t\n\t\trtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));\n\t\treturn;\n\t}\n\t\n\tpwriteMacPara->rw = 1;\n\tpwriteMacPara->addr = addr;\n\tpwriteMacPara->value = value;\n\t\n\tinit_h2fwcmd_w_parm_no_rsp(ph2c, pwriteMacPara, GEN_CMD_CODE(_Write_MACREG));\n\trtw_enqueue_cmd(pcmdpriv, ph2c);\n#endif\t\n}\n\nvoid update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode)\n{\n\tif(IsSupportedTxCCK(wireless_mode))\n\t{\n\t\t// Only B, B/G, and B/G/N AP could use CCK rate\n\t\t_rtw_memcpy(psta->bssrateset, rtw_basic_rate_cck, 4);\n\t\tpsta->bssratelen = 4;\n\t}\n\telse\n\t{\n\t\t_rtw_memcpy(psta->bssrateset, rtw_basic_rate_ofdm, 3);\n\t\tpsta->bssratelen = 3;\n\t}\n}\n\nint update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx)\n{\n\tunsigned int\tie_len;\n\tPNDIS_802_11_VARIABLE_IEs\tpIE;\n\tint\tsupportRateNum = 0;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tpIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len);\n\tif (pIE == NULL)\n\t{\n\t\treturn _FAIL;\n\t}\n\t\n\t_rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len);\n\tsupportRateNum = ie_len;\n\t\t\t\t\n\tpIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len);\n\tif (pIE)\n\t{\n\t\t_rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len);\n\t}\n\n\treturn _SUCCESS;\n\t\n}\n\nvoid process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr)\n{\n\tstruct sta_info *psta;\n\tu16 tid, start_seq, param;\t\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\t\n\tstruct ADDBA_request\t*preq = (struct ADDBA_request*)paddba_req;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 size;\n\n\tpsta = rtw_get_stainfo(pstapriv, addr);\n\tif (!psta)\n\t\tgoto exit;\n\n\tstart_seq = le16_to_cpu(preq->BA_starting_seqctrl) >> 4;\n\n\tparam = le16_to_cpu(preq->BA_para_set);\n\ttid = (param>>2)&0x0f;\n\n\tpreorder_ctrl = &psta->recvreorder_ctrl[tid];\n\n\t#ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ\n\tpreorder_ctrl->indicate_seq = start_seq;\n\t#ifdef DBG_RX_SEQ\n\tDBG_871X(\"DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\\n\", __func__, __LINE__,\n\t\tpreorder_ctrl->indicate_seq, start_seq);\n\t#endif\n\t#else\n\tpreorder_ctrl->indicate_seq = 0xffff;\n\t#endif\n\n\tpreorder_ctrl->enable = rtw_rx_ampdu_is_accept(padapter);\n\tsize = rtw_rx_ampdu_size(padapter);\n\n\tif (preorder_ctrl->enable == _TRUE) {\n\t\tpreorder_ctrl->ampdu_size = size;\n\t\tissue_addba_rsp(padapter, addr, tid, 0, size);\n\t} else {\n\t\tissue_addba_rsp(padapter, addr, tid, 37, size); /* reject ADDBA Req */\n\t}\n\nexit:\n\treturn;\n}\n\nvoid update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)\n{\t\n\tu8* pIE;\n\tu32 *pbuf;\n\t\t\n\tpIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpbuf = (u32*)pIE;\n\n\tpmlmeext->TSFValue = le32_to_cpu(*(pbuf+1));\n\t\n\tpmlmeext->TSFValue = pmlmeext->TSFValue << 32;\n\n\tpmlmeext->TSFValue |= le32_to_cpu(*pbuf);\n}\n\nvoid correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext)\n{\n\trtw_hal_set_hwreg(padapter, HW_VAR_CORRECT_TSF, 0);\n}\n\nvoid adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len)\n{\t\n\tint i;\n\tu8* pIE;\n\tu32 *pbuf;\n\tu64 tsf=0;\n\tu32 delay_ms;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\n\tpmlmeext->bcn_cnt++;\n\n\tpIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpbuf = (u32*)pIE;\n\n\ttsf = le32_to_cpu(*(pbuf+1));\t\n\ttsf = tsf << 32;\n\ttsf |= le32_to_cpu(*pbuf);\n\n\t//DBG_871X(\"%s(): tsf_upper= 0x%08x, tsf_lower=0x%08x\\n\", __func__, (u32)(tsf>>32), (u32)tsf);\n\n\t//delay = (timestamp mod 1024*100)/1000 (unit: ms)\n\t//delay_ms = do_div(tsf, (pmlmeinfo->bcn_interval*1024))/1000;\n\tdelay_ms = rtw_modular64(tsf, (pmlmeinfo->bcn_interval*1024));\n\tdelay_ms = delay_ms/1000;\n\n\tif(delay_ms >= 8)\n\t{\n\t\tpmlmeext->bcn_delay_cnt[8]++;\n\t\t//pmlmeext->bcn_delay_ratio[8] = (pmlmeext->bcn_delay_cnt[8] * 100) /pmlmeext->bcn_cnt;\n\t}\n\telse\n\t{\n\t\tpmlmeext->bcn_delay_cnt[delay_ms]++;\n\t\t//pmlmeext->bcn_delay_ratio[delay_ms] = (pmlmeext->bcn_delay_cnt[delay_ms] * 100) /pmlmeext->bcn_cnt;\n\t}\n\n/*\n\tDBG_871X(\"%s(): (a)bcn_cnt = %d\\n\", __func__, pmlmeext->bcn_cnt);\n\n\n\tfor(i=0; i<9; i++)\n\t{\n\t\tDBG_871X(\"%s():bcn_delay_cnt[%d]=%d,  bcn_delay_ratio[%d]=%d\\n\", __func__, i, \n\t\t\tpmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]);\t\t\t\n\t}\t\n*/\n\n\t//dump for  adaptive_early_32k\n\tif(pmlmeext->bcn_cnt > 100 && (pmlmeext->adaptive_tsf_done==_TRUE))\n\t{\t\n\t\tu8 ratio_20_delay, ratio_80_delay;\n\t\tu8 DrvBcnEarly, DrvBcnTimeOut;\n\n\t\tratio_20_delay = 0;\n\t\tratio_80_delay = 0;\n\t\tDrvBcnEarly = 0xff;\n\t\tDrvBcnTimeOut = 0xff;\n\t\n\t\tDBG_871X(\"%s(): bcn_cnt = %d\\n\", __func__, pmlmeext->bcn_cnt);\n\n\t\tfor(i=0; i<9; i++)\n\t\t{\n\t\t\tpmlmeext->bcn_delay_ratio[i] = (pmlmeext->bcn_delay_cnt[i] * 100) /pmlmeext->bcn_cnt;\n\t\t\t\n\t\t\n\t\t\t//DBG_871X(\"%s():bcn_delay_cnt[%d]=%d,  bcn_delay_ratio[%d]=%d\\n\", __func__, i, \n\t\t\t//\tpmlmeext->bcn_delay_cnt[i] , i, pmlmeext->bcn_delay_ratio[i]);\n\n\t\t\tratio_20_delay += pmlmeext->bcn_delay_ratio[i];\n\t\t\tratio_80_delay += pmlmeext->bcn_delay_ratio[i];\n\t\t\n\t\t\tif(ratio_20_delay > 20 && DrvBcnEarly == 0xff)\n\t\t\t{\t\t\t\n\t\t\t\tDrvBcnEarly = i;\n\t\t\t\t//DBG_871X(\"%s(): DrvBcnEarly = %d\\n\", __func__, DrvBcnEarly);\n\t\t\t}\t\n\n\t\t\tif(ratio_80_delay > 80 && DrvBcnTimeOut == 0xff)\n\t\t\t{\n\t\t\t\tDrvBcnTimeOut = i;\n\t\t\t\t//DBG_871X(\"%s(): DrvBcnTimeOut = %d\\n\", __func__, DrvBcnTimeOut);\n\t\t\t}\n\t\t\t\n\t\t\t//reset adaptive_early_32k cnt\n\t\t\tpmlmeext->bcn_delay_cnt[i] = 0;\n\t\t\tpmlmeext->bcn_delay_ratio[i] = 0;\t\t\t\n\t\t}\t\n\n\t\tpmlmeext->DrvBcnEarly = DrvBcnEarly;\n\t\tpmlmeext->DrvBcnTimeOut = DrvBcnTimeOut;\n\n\t\tpmlmeext->bcn_cnt = 0;\t\t\n\t}\t\n\t\n}\n\n\nvoid beacon_timing_control(_adapter *padapter)\n{\n\trtw_hal_bcn_related_reg_setting(padapter);\n}\n\n#define CONFIG_SHARED_BMC_MACID\n\nvoid dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num)\n{\n\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m0);\n#if (MACID_NUM_SW_LIMIT > 32)\n\tif (max_num && max_num > 32)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m1);\n#endif\n#if (MACID_NUM_SW_LIMIT > 64)\n\tif (max_num && max_num > 64)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m2);\n#endif\n#if (MACID_NUM_SW_LIMIT > 96)\n\tif (max_num && max_num > 96)\n\t\tDBG_871X_SEL_NL(sel, \"0x%08x\\n\", map->m3);\n#endif\n}\n\ninline bool rtw_macid_is_set(struct macid_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\treturn (map->m0 & BIT(id));\n#if (MACID_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\treturn (map->m1 & BIT(id-32));\n#endif\n#if (MACID_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\treturn (map->m2 & BIT(id-64));\n#endif\n#if (MACID_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\treturn (map->m3 & BIT(id-96));\n#endif\n\telse\n\t\trtw_warn_on(1);\n\n\treturn 0;\n}\n\ninline void rtw_macid_map_set(struct macid_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\tmap->m0 |= BIT(id);\n#if (MACID_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\tmap->m1 |= BIT(id-32);\n#endif\n#if (MACID_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\tmap->m2 |= BIT(id-64);\n#endif\n#if (MACID_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\tmap->m3 |= BIT(id-96);\n#endif\n\telse\n\t\trtw_warn_on(1);\n}\n\ninline void rtw_macid_map_clr(struct macid_bmp *map, u8 id)\n{\n\tif (id < 32)\n\t\tmap->m0 &= ~BIT(id);\n#if (MACID_NUM_SW_LIMIT > 32)\n\telse if (id < 64)\n\t\tmap->m1 &= ~BIT(id-32);\n#endif\n#if (MACID_NUM_SW_LIMIT > 64)\n\telse if (id < 96)\n\t\tmap->m2 &= ~BIT(id-64);\n#endif\n#if (MACID_NUM_SW_LIMIT > 96)\n\telse if (id < 128)\n\t\tmap->m3 &= ~BIT(id-96);\n#endif\n\telse\n\t\trtw_warn_on(1);\n}\n\ninline bool rtw_macid_is_used(struct macid_ctl_t *macid_ctl, u8 id)\n{\n\treturn rtw_macid_is_set(&macid_ctl->used, id);\n}\n\ninline bool rtw_macid_is_bmc(struct macid_ctl_t *macid_ctl, u8 id)\n{\n\treturn rtw_macid_is_set(&macid_ctl->bmc, id);\n}\n\ninline s8 rtw_macid_get_if_g(struct macid_ctl_t *macid_ctl, u8 id)\n{\n\tint i;\n\n#ifdef CONFIG_SHARED_BMC_MACID\n\tif (rtw_macid_is_bmc(macid_ctl,id))\n\t\treturn -1;\n#endif\n\n\tfor (i=0;i<IFACE_ID_MAX;i++) {\n\t\tif (rtw_macid_is_set(&macid_ctl->if_g[i], id))\n\t\t\treturn i;\n\t}\n\treturn -1;\n}\n\ninline s8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id)\n{\n\tint i;\n\n\tfor (i=0;i<2;i++) {\n\t\tif (rtw_macid_is_set(&macid_ctl->ch_g[i], id))\n\t\t\treturn i;\n\t}\n\treturn -1;\n}\n\nvoid rtw_alloc_macid(_adapter *padapter, struct sta_info *psta)\n{\n\tint i;\n\t_irqL irqL;\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tstruct macid_bmp *used_map = &macid_ctl->used;\n\t//static u8 last_id = 0; /* for testing */\n\tu8 last_id = 0;\n\n\tif (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN)) {\n\t\tpsta->mac_id = macid_ctl->num;\n\t\treturn;\n\t}\n\n#ifdef CONFIG_SHARED_BMC_MACID\n\tif(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)) {\n\t\t/* use shared broadcast & multicast macid 1 */\n\t\t_enter_critical_bh(&macid_ctl->lock, &irqL);\n\t\trtw_macid_map_set(used_map, 1);\n\t\trtw_macid_map_set(&macid_ctl->bmc, 1);\n\t\tfor (i=0;i<IFACE_ID_MAX;i++)\n\t\t\trtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], 1);\n\t\t/* TODO ch_g? */\n\t\t_exit_critical_bh(&macid_ctl->lock, &irqL);\n\t\ti = 1;\n\t\tgoto assigned;\n\t}\n#endif\n\n\t_enter_critical_bh(&macid_ctl->lock, &irqL);\n\n\tfor (i=last_id;i<macid_ctl->num;i++) {\n\t\t#ifdef CONFIG_SHARED_BMC_MACID\n\t\tif (i == 1)\n\t\t\tcontinue;\n\t\t#endif\n\t\tif (!rtw_macid_is_used(macid_ctl, i))\n\t\t\tbreak;\n\t}\n\n\tif (i < macid_ctl->num) {\n\n\t\trtw_macid_map_set(used_map, i);\n\n\t\tif(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN))\n\t\t\trtw_macid_map_set(&macid_ctl->bmc, i);\n\n\t\trtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], i);\n\n\t\t/* TODO ch_g? */\n\n\t\tlast_id++;\n\t\tlast_id %= macid_ctl->num;\n\t}\n\n\t_exit_critical_bh(&macid_ctl->lock, &irqL);\n\n\tif (i >= macid_ctl->num) {\n\t\tpsta->mac_id = macid_ctl->num;\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" if%u, hwaddr:\"MAC_FMT\" no available macid\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr));\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t} else {\n\t\tgoto assigned;\n\t}\n\nassigned:\n\tpsta->mac_id = i;\n\tDBG_871X(FUNC_ADPT_FMT\" if%u, hwaddr:\"MAC_FMT\" macid:%u\\n\"\n\t\t, FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);\n\nexit:\n\treturn;\n}\n\nvoid rtw_release_macid(_adapter *padapter, struct sta_info *psta)\n{\n\t_irqL irqL;\n\tu8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff};\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\n\tif (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), ETH_ALEN))\n\t\treturn;\n\n#ifdef CONFIG_SHARED_BMC_MACID\n\tif(_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN))\n\t\treturn;\n\n\tif (psta->mac_id == 1) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" if%u, hwaddr:\"MAC_FMT\" with macid:%u\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n#endif\n\n\t_enter_critical_bh(&macid_ctl->lock, &irqL);\n\n\tif (psta->mac_id < macid_ctl->num) {\n\t\tint i;\n\n\t\tif (!rtw_macid_is_used(macid_ctl, psta->mac_id)) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" if%u, hwaddr:\"MAC_FMT\" macid:%u not used\\n\"\n\t\t\t\t, FUNC_ADPT_ARG(padapter), padapter->iface_id+1, MAC_ARG(psta->hwaddr), psta->mac_id);\n\t\t\trtw_warn_on(1);\n\t\t}\n\n\t\trtw_macid_map_clr(&macid_ctl->used, psta->mac_id);\n\t\trtw_macid_map_clr(&macid_ctl->bmc, psta->mac_id);\n\t\tfor (i=0;i<IFACE_ID_MAX;i++)\n\t\t\trtw_macid_map_clr(&macid_ctl->if_g[i], psta->mac_id);\n\t\tfor (i=0;i<2;i++)\n\t\t\trtw_macid_map_clr(&macid_ctl->ch_g[i], psta->mac_id);\n\t}\n\n\t_exit_critical_bh(&macid_ctl->lock, &irqL);\n\n\tpsta->mac_id = macid_ctl->num;\n}\n\n//For 8188E RA\nu8 rtw_search_max_mac_id(_adapter *padapter)\n{\n\tu8 max_mac_id=0;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tint i;\n\t_irqL irqL;\n\n\t_enter_critical_bh(&macid_ctl->lock, &irqL);\n\tfor(i=(macid_ctl->num-1); i>0 ; i--) {\n\t\tif (!rtw_macid_is_used(macid_ctl, i))\n\t\t\tbreak;\n\t}\n\t_exit_critical_bh(&macid_ctl->lock, &irqL);\n\tmax_mac_id = i;\n\n\treturn max_mac_id;\n}\t\t\n\ninline void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl)\n{\n\t_rtw_spinlock_init(&macid_ctl->lock);\n}\n\ninline void rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl)\n{\n\t_rtw_spinlock_free(&macid_ctl->lock);\n}\n\n#if 0\nunsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame)\n{\n\tunsigned short\t\t\t\tATIMWindow;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct tx_desc \t\t\t\t*ptxdesc;\n\tstruct rtw_ieee80211_hdr \t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tunsigned int\t\t\t\t\trate_len, len = 0;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\t\n\t_rtw_memset(beacon_frame, 0, 256);\n\t\n\tpframe = beacon_frame + TXDESC_SIZE;\n\t\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\n\t\n\tSetFrameSubType(pframe, WIFI_BEACON);\n\t\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\t\n\tlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tlen += 8;\n\n\t// beacon interval: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); \n\n\tpframe += 2;\n\tlen += 2;\n\n\t// capability info: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tlen += 2;\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &len);\n\n\t// supported rates...\n\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &len);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &len);\n\n\t// IBSS Parameter Set...\n\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\tATIMWindow = 0;\n\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &len);\n\n\t//todo: ERP IE\n\t\n\t// EXTERNDED SUPPORTED RATE\n\tif (rate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &len);\n\t}\n\n\tif ((len + TXDESC_SIZE) > 256)\n\t{\n\t\t//DBG_871X(\"marc: beacon frame too large\\n\");\n\t\treturn 0;\n\t}\n\n\t//fill the tx descriptor\n\tptxdesc = (struct tx_desc *)beacon_frame;\n\t\n\t//offset 0\t\n\tptxdesc->txdw0 |= cpu_to_le32(len & 0x0000ffff); \n\tptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00ff0000); //default = 32 bytes for TX Desc\n\t\n\t//offset 4\t\n\tptxdesc->txdw1 |= cpu_to_le32((0x10 << QSEL_SHT) & 0x00001f00);\n\t\n\t//offset 8\t\t\n\tptxdesc->txdw2 |= cpu_to_le32(BMC);\n\tptxdesc->txdw2 |= cpu_to_le32(BK);\n\n\t//offset 16\t\t\n\tptxdesc->txdw4 = 0x80000000;\n\t\n\t//offset 20\n\tptxdesc->txdw5 = 0x00000000; //1M\t\n\t\n\treturn (len + TXDESC_SIZE);\n}\n#endif\n\n_adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj)\n{\n\t_adapter *port0_iface = NULL;\n\tint i;\n\tfor (i=0;i<dvobj->iface_nums;i++) {\n\t\tif (get_iface_type(dvobj->padapters[i]) == IFACE_PORT0)\n\t\t\tbreak;\n\t}\n\n\tif (i<0 || i>=dvobj->iface_nums)\n\t\trtw_warn_on(1);\n\telse\n\t\tport0_iface = dvobj->padapters[i];\n\n\treturn port0_iface;\n}\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)\n{\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct in_device *my_ip_ptr = padapter->pnetdev->ip_ptr;\n\tu8 ipaddress[4];\n\t\n\tif ( (pmlmeinfo->state & WIFI_FW_LINKING_STATE) ||\n\t\t\tpmlmeinfo->state & WIFI_FW_AP_STATE) {\n\t\tif ( my_ip_ptr != NULL ) {\n\t\t\tstruct in_ifaddr *my_ifa_list  = my_ip_ptr->ifa_list ;\n\t\t\tif ( my_ifa_list != NULL ) {\n\t\t\t\tipaddress[0] = my_ifa_list->ifa_address & 0xFF;\n\t\t\t\tipaddress[1] = (my_ifa_list->ifa_address >> 8) & 0xFF;\n\t\t\t\tipaddress[2] = (my_ifa_list->ifa_address >> 16) & 0xFF;\n\t\t\t\tipaddress[3] = my_ifa_list->ifa_address >> 24;\n\t\t\t\tDBG_871X(\"%s: %d.%d.%d.%d ==========\\n\", __func__, \n\t\t\t\t\t\tipaddress[0], ipaddress[1], ipaddress[2], ipaddress[3]);\n\t\t\t\t_rtw_memcpy(pcurrentip, ipaddress, 4);\n\t\t\t}\n\t\t}\n\t}\n}\n#endif\n#ifdef CONFIG_WOWLAN\nbool rtw_check_pattern_valid(u8 *input, u8 len)\n{\n\tint i = 0;\n\tbool res = _FALSE;\n\t\n\tfor (i = 0 ; i < len ; i++) {\n\t\tif ((input[i] <= '9' && input[i] >= '0') ||\n\t\t    (input[i] <= 'F' && input[i] >= 'A') ||\n\t\t    (input[i] <= 'f' && input[i] >= 'a'))\n\t\t\tres = _TRUE;\n\t\telse\n\t\t\tres = _FALSE;\n\t}\n\treturn res;\n}\n\nbool rtw_read_from_frame_mask(_adapter *adapter, u8 idx)\n{\n\tu32 data_l = 0, data_h = 0, rx_dma_buff_sz = 0, page_sz = 0;\n\tu16 offset, rx_buf_ptr = 0;\n\tu16 cam_start_offset = 0;\n\tu16 ctrl_l = 0, ctrl_h = 0;\n\tu8 count = 0, tmp = 0;\n\tint i = 0;\n\tbool res = _TRUE;\n\n\tif (idx > MAX_WKFM_NUM) {\n\t\tDBG_871X(\"[Error]: %s, pattern index is out of range\\n\",\n\t\t\t __func__);\n\t\treturn _FALSE;\n\t}\n\n\trtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ_WOW,\n\t\t\t    (u8 *)&rx_dma_buff_sz);\n\t\n\tif (rx_dma_buff_sz == 0) {\n\t\tDBG_871X(\"[Error]: %s, rx_dma_buff_sz is 0!!\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\trtw_hal_get_def_var(adapter, HAL_DEF_RX_PAGE_SIZE, (u8 *)&page_sz);\n\t\n\tif (page_sz == 0) {\n\t\tDBG_871X(\"[Error]: %s, page_sz is 0!!\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\toffset = (u16)PageNum(rx_dma_buff_sz, page_sz);\n\tcam_start_offset = offset * page_sz;\n\n\tctrl_l = 0x0;\n\tctrl_h = 0x0;\n\n\t/* Enable RX packet buffer access */\n\trtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);\n\n\t/* Read the WKFM CAM */\n\tfor (i = 0; i < (WKFMCAM_ADDR_NUM / 2); i++) {\n\t\t/*\n\t\t * Set Rx packet buffer offset.\n\t\t * RxBufer pointer increases 1, we can access 8 bytes in Rx packet buffer.\n\t\t * CAM start offset (unit: 1 byte) =  Index*WKFMCAM_SIZE\n\t\t * RxBufer pointer addr = (CAM start offset + per entry offset of a WKFMCAM)/8\n\t\t * * Index: The index of the wake up frame mask\n\t\t * * WKFMCAM_SIZE: the total size of one WKFM CAM\n\t\t * * per entry offset of a WKFM CAM: Addr i * 4 bytes\n\t\t */\n\t\trx_buf_ptr =\n\t\t\t(cam_start_offset + idx*WKFMCAM_SIZE + i*8) >> 3;\n\t\trtw_write16(adapter, REG_PKTBUF_DBG_CTRL, rx_buf_ptr);\n\n\t\trtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l);\n\t\tdata_l = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L);\n\t\tdata_h = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H);\n\n\t\tDBG_871X(\"[%d]: %08x %08x\\n\", i, data_h, data_l);\n\n\t\tcount = 0;\n\n\t\tdo {\n\t\t\ttmp = rtw_read8(adapter, REG_RXPKTBUF_CTRL);\n\t\t\trtw_udelay_os(2);\n\t\t\tcount++;\n\t\t} while (!tmp && count < 100);\n\n\t\tif (count >= 100) {\n\t\t\tDBG_871X(\"%s count:%d\\n\", __func__, count);\n\t\t\tres = _FALSE;\n\t\t}\n\t}\n\n\t/* Disable RX packet buffer access */\n\trtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL,\n\t\t   DISABLE_TRXPKT_BUF_ACCESS);\n\treturn res;\n}\n\nbool rtw_write_to_frame_mask(_adapter *adapter, u8 idx,\n\t\t\t\t struct  rtl_wow_pattern *context)\n{\n\tu32 data = 0, rx_dma_buff_sz = 0, page_sz = 0;\n\tu16 offset, rx_buf_ptr = 0;\n\tu16 cam_start_offset = 0;\n\tu16 ctrl_l = 0, ctrl_h = 0;\n\tu8 count = 0, tmp = 0;\n\tint res = 0, i = 0;\n\n\tif (idx > MAX_WKFM_NUM) {\n\t\tDBG_871X(\"[Error]: %s, pattern index is out of range\\n\",\n\t\t\t __func__);\n\t\treturn _FALSE;\n\t}\n\n\trtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ_WOW,\n\t\t\t    (u8 *)&rx_dma_buff_sz);\n\t\n\tif (rx_dma_buff_sz == 0) {\n\t\tDBG_871X(\"[Error]: %s, rx_dma_buff_sz is 0!!\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\trtw_hal_get_def_var(adapter, HAL_DEF_RX_PAGE_SIZE, (u8 *)&page_sz);\n\t\n\tif (page_sz == 0) {\n\t\tDBG_871X(\"[Error]: %s, page_sz is 0!!\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\toffset = (u16)PageNum(rx_dma_buff_sz, page_sz);\n\n\tcam_start_offset = offset * page_sz;\n\n\tif (IS_HARDWARE_TYPE_8188E(adapter)) {\n\t\tctrl_l = 0x0001;\n\t\tctrl_h = 0x0001;\n\t} else {\n\t\tctrl_l = 0x0f01;\n\t\tctrl_h = 0xf001;\n\t}\n\n\t/* Enable RX packet buffer access */\n\trtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);\n\n\t/* Write the WKFM CAM */\n\tfor (i = 0; i < WKFMCAM_ADDR_NUM; i++) {\n\t\t/*\n\t\t * Set Rx packet buffer offset.\n\t\t * RxBufer pointer increases 1, we can access 8 bytes in Rx packet buffer.\n\t\t * CAM start offset (unit: 1 byte) =  Index*WKFMCAM_SIZE\n\t\t * RxBufer pointer addr = (CAM start offset + per entry offset of a WKFMCAM)/8\n\t\t * * Index: The index of the wake up frame mask\n\t\t * * WKFMCAM_SIZE: the total size of one WKFM CAM\n\t\t * * per entry offset of a WKFM CAM: Addr i * 4 bytes\n\t\t */\n\t\trx_buf_ptr =\n\t\t\t(cam_start_offset + idx*WKFMCAM_SIZE + i*4) >> 3;\n\t\trtw_write16(adapter, REG_PKTBUF_DBG_CTRL, rx_buf_ptr);\n\n\t\tif (i == 0) {\n\t\t\tif (context->type == PATTERN_VALID)\n\t\t\t\tdata = BIT(31) | context->crc;\n\t\t\telse if (context->type == PATTERN_BROADCAST)\n\t\t\t\tdata |= BIT(26);\n\t\t\telse if (context->type == PATTERN_MULTICAST)\n\t\t\t\tdata |= BIT(25);\n\t\t\telse if (context->type == PATTERN_UNICAST)\n\t\t\t\tdata |= BIT(24);\n\t\t\trtw_write32(adapter, REG_PKTBUF_DBG_DATA_L, data);\n\t\t\trtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l);\n\t\t} else if (i == 1) {\n\t\t\tdata = 0;\n\t\t\trtw_write32(adapter, REG_PKTBUF_DBG_DATA_H, data);\n\t\t\trtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_h);\n\t\t} else if (i == 2 || i == 4) {\n\t\t\tdata = context->mask[i - 2];\n\t\t\trtw_write32(adapter, REG_PKTBUF_DBG_DATA_L, data);\n\t\t\t/* write to RX packet buffer*/\n\t\t\trtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_l);\n\t\t} else if (i == 3 || i == 5) {\n\t\t\tdata = context->mask[i - 2];\n\t\t\trtw_write32(adapter, REG_PKTBUF_DBG_DATA_H, data);\n\t\t\t/* write to RX packet buffer*/\n\t\t\trtw_write16(adapter, REG_RXPKTBUF_CTRL, ctrl_h);\n\t\t}\n\n\t\tcount = 0;\n\t\tdo {\n\t\t\ttmp = rtw_read8(adapter, REG_RXPKTBUF_CTRL);\n\t\t\trtw_udelay_os(2);\n\t\t\tcount++;\n\t\t} while (tmp && count < 100);\n\n\t\tif (count >= 100)\n\t\t\tres = _FALSE;\n\t\telse\n\t\t\tres = _TRUE;\n\t}\n\n\t/* Disable RX packet buffer access */\n\trtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL,\n\t\t   DISABLE_TRXPKT_BUF_ACCESS);\n\n\treturn res;\n}\n\n\nvoid rtw_dump_priv_pattern(_adapter *adapter, u8 idx)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tchar str_1[128];\n\tchar *p_str;\n\tu8 val8 = 0;\n\tint i = 0, j = 0, len = 0, max_len = 0;\n\n\tDBG_871X(\"=========[%d]========\\n\", idx);\n\n\tDBG_871X(\">>>priv_pattern_content:\\n\");\n\tp_str = str_1;\n\tmax_len = sizeof(str_1);\n\tfor (i = 0 ; i < MAX_WKFM_PATTERN_SIZE/8 ; i++) {\n\t\t_rtw_memset(p_str, 0, max_len);\n\t\tlen = 0;\n\t\tfor (j = 0 ; j < 8 ; j++) {\n\t\t\tval8 = pwrctl->patterns[idx].content[i*8 + j];\n\t\t\tlen += snprintf(p_str + len, max_len - len,\n\t\t\t\t\t\"%02x \", val8);\n\t\t}\n\t\tDBG_871X(\"%s\\n\", p_str);\n\t}\n\n\tDBG_871X(\">>>priv_pattern_mask:\\n\");\n\tfor (i = 0 ; i < MAX_WKFM_SIZE/8 ; i++) {\n\t\t_rtw_memset(p_str, 0, max_len);\n\t\tlen = 0;\n\t\tfor (j = 0 ; j < 8 ; j++) {\n\t\t\tval8 = pwrctl->patterns[idx].mask[i*8 + j];\n\t\t\tlen += snprintf(p_str + len, max_len - len,\n\t\t\t\t\t\"%02x \", val8);\n\t\t}\n\t\tDBG_871X(\"%s\\n\", p_str);\n\t}\n}\n\nvoid rtw_clean_pattern(_adapter *adapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tstruct rtl_wow_pattern zero_pattern;\n\tint i = 0;\n\n\t_rtw_memset(&zero_pattern, 0, sizeof(struct rtl_wow_pattern));\n\n\tzero_pattern.type = PATTERN_INVALID;\n\n\tfor (i = 0; i < MAX_WKFM_NUM; i++)\n\t\trtw_write_to_frame_mask(adapter, i, &zero_pattern);\n\n\tpwrctl->wowlan_pattern_idx = 0;\n\trtw_write8(adapter, REG_WKFMCAM_NUM, pwrctl->wowlan_pattern_idx);\n}\n\nvoid rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr)\n{\n\tstruct sta_info\t\t*psta;\n\tstruct security_priv *psecpriv = &padapter->securitypriv;\n\n\t_rtw_memset(pcur_dot11txpn, 0, 8);\n\tif(NULL == StaAddr)\n\t\treturn; \n\tpsta = rtw_get_stainfo(&padapter->stapriv, StaAddr);\n\tDBG_871X(\"%s(): StaAddr: %02x %02x %02x %02x %02x %02x\\n\", \n\t\t__func__, StaAddr[0], StaAddr[1], StaAddr[2],\n\t\tStaAddr[3], StaAddr[4], StaAddr[5]);\n\n\tif(psta)\n\t{\n\t\tif (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_ && psta->dot11txpn.val > 0)\n\t\t\tpsta->dot11txpn.val--;\n\t\tAES_IV(pcur_dot11txpn, psta->dot11txpn, 0);\n\n\t\tDBG_871X(\"%s(): CurrentIV: %02x %02x %02x %02x %02x %02x %02x %02x \\n\"\n\t\t, __func__, pcur_dot11txpn[0],pcur_dot11txpn[1],\n\t\tpcur_dot11txpn[2],pcur_dot11txpn[3], pcur_dot11txpn[4],\n\t\tpcur_dot11txpn[5],pcur_dot11txpn[6],pcur_dot11txpn[7]);\n\t}\n}\nvoid rtw_set_sec_pn(PADAPTER padapter)\n{\n        struct sta_info         *psta;\n        struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);\n        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);\n        struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\t\tstruct security_priv *psecpriv = &padapter->securitypriv;\n\n        psta = rtw_get_stainfo(&padapter->stapriv,\n\t\t\tget_my_bssid(&pmlmeinfo->network));\n\n        if(psta)\n        {\n\t\tif (pwrpriv->wowlan_fw_iv > psta->dot11txpn.val)\n\t\t{\n\t\t\tif (psecpriv->dot11PrivacyAlgrthm != _NO_PRIVACY_)\n\t\t\t\tpsta->dot11txpn.val = pwrpriv->wowlan_fw_iv + 2;\n\t\t} else {\n\t\t\tDBG_871X(\"%s(): FW IV is smaller than driver\\n\", __func__);\n\t\t\tpsta->dot11txpn.val += 2;\n\t\t}\n\t\tDBG_871X(\"%s: dot11txpn: 0x%016llx\\n\", __func__ ,psta->dot11txpn.val);\n        }\n}\n#endif //CONFIG_WOWLAN\n\n#ifdef CONFIG_PNO_SUPPORT\n#define\tCSCAN_TLV_TYPE_SSID_IE\t'S'\n#define CIPHER_IE \"key_mgmt=\"\n#define CIPHER_NONE \"NONE\"\n#define CIPHER_WPA_PSK \"WPA-PSK\"\n#define CIPHER_WPA_EAP \"WPA-EAP IEEE8021X\"\n/*\n *  SSIDs list parsing from cscan tlv list\n */\nint rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid,\n\tint max, int *bytes_left) {\n\tchar* str;\n\n\tint idx = 0;\n\n\tif ((list_str == NULL) || (*list_str == NULL) || (*bytes_left < 0)) {\n\t\tDBG_871X(\"%s error paramters\\n\", __func__);\n\t\treturn -1;\n\t}\n\n\tstr = *list_str;\n\twhile (*bytes_left > 0) {\n\n\t\tif (str[0] != CSCAN_TLV_TYPE_SSID_IE) {\n\t\t\t*list_str = str;\n\t\t\tDBG_871X(\"nssid=%d left_parse=%d %d\\n\", idx, *bytes_left, str[0]);\n\t\t\treturn idx;\n\t\t}\n\n\t\t/* Get proper CSCAN_TLV_TYPE_SSID_IE */\n\t\t*bytes_left -= 1;\n\t\tstr += 1;\n\n\t\tif (str[0] == 0) {\n\t\t\t/* Broadcast SSID */\n\t\t\tssid[idx].SSID_len = 0;\n\t\t\tmemset((char*)ssid[idx].SSID, 0x0, WLAN_SSID_MAXLEN);\n\t\t\t*bytes_left -= 1;\n\t\t\tstr += 1;\n\n\t\t\tDBG_871X(\"BROADCAST SCAN  left=%d\\n\", *bytes_left);\n\t\t}\n\t\telse if (str[0] <= WLAN_SSID_MAXLEN) {\n\t\t\t /* Get proper SSID size */\n\t\t\tssid[idx].SSID_len = str[0];\n\t\t\t*bytes_left -= 1;\n\t\t\tstr += 1;\n\n\t\t\t/* Get SSID */\n\t\t\tif (ssid[idx].SSID_len > *bytes_left) {\n\t\t\t\tDBG_871X(\"%s out of memory range len=%d but left=%d\\n\",\n\t\t\t\t__func__, ssid[idx].SSID_len, *bytes_left);\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tmemcpy((char*)ssid[idx].SSID, str, ssid[idx].SSID_len);\n\n\t\t\t*bytes_left -= ssid[idx].SSID_len;\n\t\t\tstr += ssid[idx].SSID_len;\n\n\t\t\tDBG_871X(\"%s :size=%d left=%d\\n\",\n\t\t\t\t(char*)ssid[idx].SSID, ssid[idx].SSID_len, *bytes_left);\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"### SSID size more that %d\\n\", str[0]);\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (idx++ >  max) {\n\t\t\tDBG_871X(\"%s number of SSIDs more that %d\\n\", __func__, idx);\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\t*list_str = str;\n\treturn idx;\n}\n\nint rtw_parse_cipher_list(struct pno_nlo_info *nlo_info, char* list_str) {\n\n\tchar *pch, *pnext, *pend;\n\tu8 key_len = 0, index = 0;\n\n\tpch = list_str;\n\n\tif (nlo_info == NULL || list_str == NULL) {\n\t\tDBG_871X(\"%s error paramters\\n\", __func__);\n\t\treturn -1;\n\t}\n\n\twhile (strlen(pch) != 0) {\n\t\tpnext = strstr(pch, \"key_mgmt=\");\n\t\tif (pnext != NULL) {\n\t\t\tpch = pnext + strlen(CIPHER_IE);\n\t\t\tpend = strstr(pch, \"}\");\n\t\t\tif (strncmp(pch, CIPHER_NONE,\n\t\t\t\t\t\tstrlen(CIPHER_NONE)) == 0) {\n\t\t\t\tnlo_info->ssid_cipher_info[index] = 0x00;\n\t\t\t} else if (strncmp(pch, CIPHER_WPA_PSK,\n\t\t\t\t\t\tstrlen(CIPHER_WPA_PSK)) == 0) {\n\t\t\t\tnlo_info->ssid_cipher_info[index] = 0x66;\n\t\t\t} else if (strncmp(pch, CIPHER_WPA_EAP,\n\t\t\t\t\t\tstrlen(CIPHER_WPA_EAP)) == 0) {\n\t\t\t\tnlo_info->ssid_cipher_info[index] = 0x01;\n\t\t\t}\n\t\t\tindex ++;\n\t\t\tpch = pend + 1;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn 0;\n}\n\nint rtw_dev_nlo_info_set(struct pno_nlo_info *nlo_info, pno_ssid_t* ssid,\n\tint num, int pno_time, int pno_repeat, int pno_freq_expo_max) {\n\n\tint i = 0;\n\tstruct file *fp;\n\tmm_segment_t fs;\n\tloff_t pos = 0;\n\tu8 *source = NULL;\n\tlong len = 0;\n\n\tDBG_871X(\"+%s+\\n\", __func__);\n\n\tnlo_info->fast_scan_period = pno_time;\n\tnlo_info->ssid_num = num & BIT_LEN_MASK_32(8);\n\tnlo_info->hidden_ssid_num = num & BIT_LEN_MASK_32(8);\n\tnlo_info->slow_scan_period = (pno_time * 2);\n\tnlo_info->fast_scan_iterations = 5;\n\n\tif (nlo_info->hidden_ssid_num > 8)\n\t\tnlo_info->hidden_ssid_num = 8;\n\n\t//TODO: channel list and probe index is all empty.\n\tfor (i = 0 ; i < num ; i++) {\n\t\tnlo_info->ssid_length[i]\n\t\t\t= ssid[i].SSID_len;\n\t}\n\n\t/* cipher array */\n\tfp = filp_open(\"/data/misc/wifi/wpa_supplicant.conf\", O_RDONLY,  0644);\n\tif (IS_ERR(fp)) {\n\t\tDBG_871X(\"Error, wpa_supplicant.conf doesn't exist.\\n\");\n\t\tDBG_871X(\"Error, cipher array using default value.\\n\");\n\t\treturn 0;\n\t}\n\n\tlen = i_size_read(fp->f_path.dentry->d_inode);\n\tif (len < 0 || len > 2048) {\n\t\tDBG_871X(\"Error, file size is bigger than 2048.\\n\");\n\t\tDBG_871X(\"Error, cipher array using default value.\\n\");\n\t\treturn 0;\n\t}\n\n\tfs = get_fs();\n\tset_fs(KERNEL_DS);\n\n\tsource = rtw_zmalloc(2048);\n\n\tif (source != NULL) {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0))\n\t\tlen = kernel_read(fp, source, len, &pos);\n#else\n\t\tlen = vfs_read(fp, source, len, &pos);\n#endif\n\t\trtw_parse_cipher_list(nlo_info, source);\n\t\trtw_mfree(source, 2048);\n\t}\n\n\tset_fs(fs);\n\tfilp_close(fp, NULL);\n\n\tDBG_871X(\"-%s-\\n\", __func__);\n\treturn 0;\n}\n\nint rtw_dev_ssid_list_set(struct pno_ssid_list *pno_ssid_list,\n\tpno_ssid_t* ssid, u8 num) {\n\n\tint i = 0;\n\tif(num > MAX_PNO_LIST_COUNT)\n\t\tnum = MAX_PNO_LIST_COUNT;\n\n\tfor (i = 0 ; i < num ; i++) {\n\t\t_rtw_memcpy(&pno_ssid_list->node[i].SSID,\n\t\t\tssid[i].SSID, ssid[i].SSID_len);\n\t\tpno_ssid_list->node[i].SSID_len = ssid[i].SSID_len;\n\t}\n\treturn 0;\n}\n\nint rtw_dev_scan_info_set(_adapter *padapter, pno_ssid_t* ssid,\n\tunsigned char ch, unsigned char ch_offset, unsigned short bw_mode) {\n\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct pno_scan_info *scan_info = pwrctl->pscan_info;\n\tint i;\n\n\tscan_info->channel_num = MAX_SCAN_LIST_COUNT;\n\tscan_info->orig_ch = ch;\n\tscan_info->orig_bw = bw_mode;\n\tscan_info->orig_40_offset = ch_offset;\n\n\tfor(i = 0 ; i < scan_info->channel_num ; i++) {\n\t\tif (i < 11)\n\t\t\tscan_info->ssid_channel_info[i].active = 1;\n\t\telse\n\t\t\tscan_info->ssid_channel_info[i].active = 0;\n\n\t\tscan_info->ssid_channel_info[i].timeout = 100;\n\n\t\tscan_info->ssid_channel_info[i].tx_power =\n\t\t\tPHY_GetTxPowerIndex(padapter, 0, 0x02, bw_mode, i+1);\n\n\t\tscan_info->ssid_channel_info[i].channel = i+1;\n\t}\n\n\tDBG_871X(\"%s, channel_num: %d, orig_ch: %d, orig_bw: %d orig_40_offset: %d\\n\",\n\t\t__func__, scan_info->channel_num, scan_info->orig_ch,\n\t\tscan_info->orig_bw, scan_info->orig_40_offset);\n\treturn 0;\n}\n\nint rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,\n\tint pno_time, int pno_repeat, int pno_freq_expo_max) {\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tint ret = -1;\n\n\tif (num == 0) {\n\t\tDBG_871X(\"%s, nssid is zero, no need to setup pno ssid list\\n\", __func__);\n\t\treturn 0;\n\t}\n\n\tif (pwrctl == NULL) {\n\t\tDBG_871X(\"%s, ERROR: pwrctl is NULL\\n\", __func__);\n\t\treturn -1;\n\t} else {\n\t\tpwrctl->pnlo_info =\n\t\t\t(pno_nlo_info_t*)rtw_zmalloc(sizeof(pno_nlo_info_t));\n\t\tpwrctl->pno_ssid_list =\n\t\t\t(pno_ssid_list_t*)rtw_zmalloc(sizeof(pno_ssid_list_t));\n\t\tpwrctl->pscan_info =\n\t\t\t(pno_scan_info_t*)rtw_zmalloc(sizeof(pno_scan_info_t));\n\t}\n\n\tif (pwrctl->pnlo_info == NULL ||\n\t\tpwrctl->pscan_info == NULL ||\n\t\tpwrctl->pno_ssid_list == NULL){\n\t\tDBG_871X(\"%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\\n\", __func__);\n\t\tgoto failing;\n\t}\n\n\tpwrctl->pno_in_resume = _FALSE;\n\n\tpwrctl->pno_inited = _TRUE;\n\t/* NLO Info */\n\tret = rtw_dev_nlo_info_set(pwrctl->pnlo_info, ssid, num,\n\t\t\tpno_time, pno_repeat, pno_freq_expo_max);\n\n\t/* SSID Info */\n\tret = rtw_dev_ssid_list_set(pwrctl->pno_ssid_list, ssid, num);\n\n\t/* SCAN Info */\n\tret = rtw_dev_scan_info_set(padapter, ssid, pmlmeext->cur_channel,\n\t\t\tpmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);\n\n\tDBG_871X(\"+%s num: %d, pno_time: %d, pno_repeat:%d, pno_freq_expo_max:%d+\\n\",\n\t\t __func__, num, pno_time, pno_repeat, pno_freq_expo_max);\n\n\treturn 0;\n\nfailing:\n\tif (pwrctl->pnlo_info) {\n\t\trtw_mfree((u8 *)pwrctl->pnlo_info, sizeof(pno_nlo_info_t));\n\t\tpwrctl->pnlo_info = NULL;\n\t}\n\tif (pwrctl->pno_ssid_list) {\n\t\trtw_mfree((u8 *)pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));\n\t\tpwrctl->pno_ssid_list = NULL;\n\t}\n\tif (pwrctl->pscan_info) {\n\t\trtw_mfree((u8 *)pwrctl->pscan_info, sizeof(pno_scan_info_t));\n\t\tpwrctl->pscan_info = NULL;\n\t}\n\n\treturn -1;\n}\n\n#ifdef CONFIG_PNO_SET_DEBUG\nvoid rtw_dev_pno_debug(struct net_device *net) {\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tint i = 0, j = 0;\n\n\tDBG_871X(\"*******NLO_INFO********\\n\");\n\tDBG_871X(\"ssid_num: %d\\n\", pwrctl->pnlo_info->ssid_num);\n\tDBG_871X(\"fast_scan_iterations: %d\\n\",\n\t\t\tpwrctl->pnlo_info->fast_scan_iterations);\n\tDBG_871X(\"fast_scan_period: %d\\n\", pwrctl->pnlo_info->fast_scan_period);\n\tDBG_871X(\"slow_scan_period: %d\\n\", pwrctl->pnlo_info->slow_scan_period);\n\tDBG_871X(\"ssid_length: \");\n\tfor (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) {\n\t\tprintk(\"%d, \", pwrctl->pnlo_info->ssid_length[i]);\n\t}\n\tDBG_871X(\"\\n\");\n\n\tDBG_871X(\"cipher_info: \");\n\tfor (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) {\n\t\tDBG_871X(\"%d, \", pwrctl->pnlo_info->ssid_cipher_info[i]);\n\t}\n\tDBG_871X(\"\\n\");\n\n\tDBG_871X(\"channel_info: \");\n\tfor (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) {\n\t\tDBG_871X(\"%d, \", pwrctl->pnlo_info->ssid_channel_info[i]);\n\t}\n\tDBG_871X(\"\\n\");\n\n\tDBG_871X(\"******SSID_LISD******\\n\");\n\tfor (i = 0 ; i < MAX_PNO_LIST_COUNT ; i++) {\n\t\tDBG_871X(\"[%d]SSID: %s \\n\", i,\n\t\t\tpwrctl->pno_ssid_list->node[i].SSID);\n\t}\n\n\tDBG_871X(\"******SCAN_INFO******\\n\");\n\tDBG_871X(\"ch_num: %d\\n\", pwrctl->pscan_info->channel_num);\n\tDBG_871X(\"orig_ch: %d\\n\", pwrctl->pscan_info->orig_ch);\n\tDBG_871X(\"orig bw: %d\\n\", pwrctl->pscan_info->orig_bw);\n\tDBG_871X(\"orig 40 offset: %d\\n\", pwrctl->pscan_info->orig_40_offset);\n\tfor(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i++) {\n\t\tDBG_871X(\"[%02d] avtive:%d, timeout:%d, tx_power:%d, ch:%02d\\n\",\n\t\t\ti, pwrctl->pscan_info->ssid_channel_info[i].active,\n\t\t\tpwrctl->pscan_info->ssid_channel_info[i].timeout,\n\t\t\tpwrctl->pscan_info->ssid_channel_info[i].tx_power,\n\t\t\tpwrctl->pscan_info->ssid_channel_info[i].channel);\n\t}\n\tDBG_871X(\"*****************\\n\");\n}\n#endif //CONFIG_PNO_SET_DEBUG\n#endif //CONFIG_PNO_SUPPORT\n"
  },
  {
    "path": "core/rtw_xmit.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTW_XMIT_C_\n\n#include <drv_types.h>\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n#error \"Shall be Linux or Windows, but not both!\\n\"\n#endif\n\n\nstatic u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };\nstatic u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };\n\nstatic void _init_txservq(struct tx_servq *ptxservq)\n{\n_func_enter_;\n\t_rtw_init_listhead(&ptxservq->tx_pending);\n\t_rtw_init_queue(&ptxservq->sta_pending);\n\tptxservq->qcnt = 0;\n_func_exit_;\t\t\n}\n\n\nvoid\t_rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)\n{\t\n\t\n_func_enter_;\n\n\t_rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv));\n\n\t_rtw_spinlock_init(&psta_xmitpriv->lock);\n\t\n\t//for(i = 0 ; i < MAX_NUMBLKS; i++)\n\t//\t_init_txservq(&(psta_xmitpriv->blk_q[i]));\n\n\t_init_txservq(&psta_xmitpriv->be_q);\n\t_init_txservq(&psta_xmitpriv->bk_q);\n\t_init_txservq(&psta_xmitpriv->vi_q);\n\t_init_txservq(&psta_xmitpriv->vo_q);\n\t_rtw_init_listhead(&psta_xmitpriv->legacy_dz);\n\t_rtw_init_listhead(&psta_xmitpriv->apsd);\n\t\n_func_exit_;\t\n\n}\n\ns32\t_rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)\n{\n\tint i;\n\tstruct xmit_buf *pxmitbuf;\n\tstruct xmit_frame *pxframe;\n\tsint\tres=_SUCCESS;   \n\t\n_func_enter_;   \t\n\n\t// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().\n\t//_rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));\n\t\n\t_rtw_spinlock_init(&pxmitpriv->lock);\n\t_rtw_spinlock_init(&pxmitpriv->lock_sctx);\n\t_rtw_init_sema(&pxmitpriv->xmit_sema, 0);\n\t_rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0);\n\n\t/* \n\tPlease insert all the queue initializaiton using _rtw_init_queue below\n\t*/\n\n\tpxmitpriv->adapter = padapter;\n\t\n\t//for(i = 0 ; i < MAX_NUMBLKS; i++)\n\t//\t_rtw_init_queue(&pxmitpriv->blk_strms[i]);\n\t\n\t_rtw_init_queue(&pxmitpriv->be_pending);\n\t_rtw_init_queue(&pxmitpriv->bk_pending);\n\t_rtw_init_queue(&pxmitpriv->vi_pending);\n\t_rtw_init_queue(&pxmitpriv->vo_pending);\n\t_rtw_init_queue(&pxmitpriv->bm_pending);\n\n\t//_rtw_init_queue(&pxmitpriv->legacy_dz_queue);\n\t//_rtw_init_queue(&pxmitpriv->apsd_queue);\n\n\t_rtw_init_queue(&pxmitpriv->free_xmit_queue);\n\n\t/*\t\n\tPlease allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, \n\tand initialize free_xmit_frame below.\n\tPlease also apply  free_txobj to link_up all the xmit_frames...\n\t*/\n\n\tpxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);\n\t\n\tif (pxmitpriv->pallocated_frame_buf  == NULL){\n\t\tpxmitpriv->pxmit_frame_buf =NULL;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"alloc xmit_frame fail!\\n\"));\t\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tpxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4);\n\t//pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -\n\t//\t\t\t\t\t\t((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3);\n\n\tpxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;\n\n\tfor (i = 0; i < NR_XMITFRAME; i++)\n\t{\n\t\t_rtw_init_listhead(&(pxframe->list));\n\n\t\tpxframe->padapter = padapter;\n\t\tpxframe->frame_tag = NULL_FRAMETAG;\n\n\t\tpxframe->pkt = NULL;\t\t\n\n\t\tpxframe->buf_addr = NULL;\n\t\tpxframe->pxmitbuf = NULL;\n \n\t\trtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));\n\n\t\tpxframe++;\n\t}\n\n\tpxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;\n\n\tpxmitpriv->frag_len = MAX_FRAG_THRESHOLD;\n\n\n\t//init xmit_buf\n\t_rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);\n\t_rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);\n\n\tpxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);\n\t\n\tif (pxmitpriv->pallocated_xmitbuf  == NULL){\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"alloc xmit_buf fail!\\n\"));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4);\n\t//pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -\n\t//\t\t\t\t\t\t((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3);\n\n\tpxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf;\n\n\tfor (i = 0; i < NR_XMITBUFF; i++)\n\t{\n\t\t_rtw_init_listhead(&pxmitbuf->list);\n\n\t\tpxmitbuf->priv_data = NULL;\n\t\tpxmitbuf->padapter = padapter;\n\t\tpxmitbuf->buf_tag = XMITBUF_DATA;\n\n\t\t/* Tx buf allocation may fail sometimes, so sleep and retry. */\n\t\tif((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE)) == _FAIL) {\n\t\t\trtw_msleep_os(10);\n\t\t\tres = rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);\n\t\t\tif (res == _FAIL) {\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->phead = pxmitbuf->pbuf;\n\t\tpxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ;\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n#endif\n\n\t\tpxmitbuf->flags = XMIT_VO_QUEUE;\n\n\t\trtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));\n\t\t#ifdef DBG_XMIT_BUF\n\t\tpxmitbuf->no=i;\n\t\t#endif\n\n\t\tpxmitbuf++;\n\t\t\n\t}\n\n\tpxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;\n\n\t/* init xframe_ext queue,  the same count as extbuf  */\n\t_rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);\n\t\n\tpxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);\n\t\n\tif (pxmitpriv->xframe_ext_alloc_addr  == NULL){\n\t\tpxmitpriv->xframe_ext = NULL;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"alloc xframe_ext fail!\\n\"));\t\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\tpxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);\n\tpxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;\n\n\tfor (i = 0; i < NR_XMIT_EXTBUFF; i++) {\n\t\t_rtw_init_listhead(&(pxframe->list));\n\n\t\tpxframe->padapter = padapter;\n\t\tpxframe->frame_tag = NULL_FRAMETAG;\n\n\t\tpxframe->pkt = NULL;\t\t\n\n\t\tpxframe->buf_addr = NULL;\n\t\tpxframe->pxmitbuf = NULL;\n\t\t\n\t\tpxframe->ext_tag = 1;\n \n\t\trtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue));\n\n\t\tpxframe++;\n\t}\n\tpxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;\n\n\t// Init xmit extension buff\n\t_rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);\n\n\tpxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);\n\t\n\tif (pxmitpriv->pallocated_xmit_extbuf  == NULL){\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"alloc xmit_extbuf fail!\\n\"));\n\t\tres= _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);\n\n\tpxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;\n\n\tfor (i = 0; i < NR_XMIT_EXTBUFF; i++)\n\t{\n\t\t_rtw_init_listhead(&pxmitbuf->list);\n\n\t\tpxmitbuf->priv_data = NULL;\n\t\tpxmitbuf->padapter = padapter;\n\t\tpxmitbuf->buf_tag = XMITBUF_MGNT;\n\n\t\tif((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {\n\t\t\tres= _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->phead = pxmitbuf->pbuf;\n\t\tpxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n#endif\n\n\t\trtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));\n\t\t#ifdef DBG_XMIT_BUF_EXT\n\t\tpxmitbuf->no=i;\n\t\t#endif\n\t\tpxmitbuf++;\n\t\t\n\t}\n\n\tpxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;\n\n\tfor (i = 0; i<CMDBUF_MAX; i++) {\n\t\tpxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];\n\t\tif (pxmitbuf) {\n\t\t\t_rtw_init_listhead(&pxmitbuf->list);\n\n\t\t\tpxmitbuf->priv_data = NULL;\n\t\t\tpxmitbuf->padapter = padapter;\n\t\t\tpxmitbuf->buf_tag = XMITBUF_CMD;\n\n\t\t\tif((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {\n\t\t\t\tres= _FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\t\tpxmitbuf->phead = pxmitbuf->pbuf;\n\t\t\tpxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;\n\t\t\tpxmitbuf->len = 0;\n\t\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n#endif\n\t\t\tpxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;\n\t\t}\n\t}\n\n\trtw_alloc_hwxmits(padapter);\n\trtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);\n\n        for (i = 0; i < 4; i ++)\n\t{\n\t\tpxmitpriv->wmm_para_seq[i] = i;\n\t}\n\n#ifdef CONFIG_USB_HCI\n\tpxmitpriv->txirp_cnt=1;\n\n\t_rtw_init_sema(&(pxmitpriv->tx_retevt), 0);\n\n\t//per AC pending irp\n\tpxmitpriv->beq_cnt = 0;\n\tpxmitpriv->bkq_cnt = 0;\n\tpxmitpriv->viq_cnt = 0;\n\tpxmitpriv->voq_cnt = 0;\n#endif\n\n\n#ifdef CONFIG_XMIT_ACK\n\tpxmitpriv->ack_tx = _FALSE;\n\t_rtw_mutex_init(&pxmitpriv->ack_tx_mutex);\n\trtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);\t\n#endif\n\n\trtw_hal_init_xmit_priv(padapter);\n\nexit:\n\n_func_exit_;\t\n\n\treturn res;\n}\n\nvoid  rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv);\nvoid  rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv)\n{\n\t_rtw_spinlock_free(&pxmitpriv->lock);\n\t_rtw_free_sema(&pxmitpriv->xmit_sema);\n\t_rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema);\n\n\t_rtw_spinlock_free(&pxmitpriv->be_pending.lock);\n\t_rtw_spinlock_free(&pxmitpriv->bk_pending.lock);\n\t_rtw_spinlock_free(&pxmitpriv->vi_pending.lock);\n\t_rtw_spinlock_free(&pxmitpriv->vo_pending.lock);\n\t_rtw_spinlock_free(&pxmitpriv->bm_pending.lock);\n\n\t//_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock);\n\t//_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock);\n\n\t_rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock);\n\t_rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock);\n\t_rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock);\n}\n\n\nvoid _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)\n{\n       int i;\n      _adapter *padapter = pxmitpriv->adapter;\n\tstruct xmit_frame\t*pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;\n\t\n _func_enter_;   \n\n\trtw_hal_free_xmit_priv(padapter);\n \n\trtw_mfree_xmit_priv_lock(pxmitpriv);\n \n \tif(pxmitpriv->pxmit_frame_buf==NULL)\n\t\tgoto out;\n\t\n\tfor(i=0; i<NR_XMITFRAME; i++)\n\t{\t\n\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\n\t\tpxmitframe++;\n\t}\t\t\n\t\n\tfor(i=0; i<NR_XMITBUFF; i++)\n\t{\n\t\trtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);\n\t\t\n\t\tpxmitbuf++;\n\t}\n\n\tif(pxmitpriv->pallocated_frame_buf) {\n\t\trtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);\n\t}\n\t\n\n\tif(pxmitpriv->pallocated_xmitbuf) {\n\t\trtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4);\n\t}\n\n\t/* free xframe_ext queue,  the same count as extbuf  */\n\tif ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {\n\t\tfor (i=0; i<NR_XMIT_EXTBUFF; i++) {\n\t\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\t\t\tpxmitframe++;\n\t\t}\n\t}\n\tif (pxmitpriv->xframe_ext_alloc_addr)\n\t\trtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);\n\t_rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);\n\n\t// free xmit extension buff\n\t_rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);\n\n\tpxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;\n\tfor(i=0; i<NR_XMIT_EXTBUFF; i++)\n\t{\n\t\trtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);\n\t\t\n\t\tpxmitbuf++;\n\t}\n\n\tif(pxmitpriv->pallocated_xmit_extbuf) {\n\t\trtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);\n\t}\n\n\tfor (i=0; i<CMDBUF_MAX; i++) {\n\t\tpxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];\n\t\tif(pxmitbuf!=NULL)\n\t\t\trtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);\n\t}\n\n\trtw_free_hwxmits(padapter);\n\n#ifdef CONFIG_XMIT_ACK\t\n\t_rtw_mutex_free(&pxmitpriv->ack_tx_mutex);\t\n#endif\t\n\nout:\t\n\n_func_exit_;\t\t\n\n}\n\nu8\tquery_ra_short_GI(struct sta_info *psta)\n{\n\tu8\tsgi = _FALSE, sgi_20m = _FALSE, sgi_40m = _FALSE, sgi_80m = _FALSE;\n\n#ifdef CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\n\tif (psta->vhtpriv.vht_option) {\n\t\tsgi_80m= psta->vhtpriv.sgi_80m;\n\t}\n#endif //CONFIG_80211AC_VHT\n\t{\n\t\tsgi_20m = psta->htpriv.sgi_20m;\n\t\tsgi_40m = psta->htpriv.sgi_40m;\n\t}\n#endif\n\n\tswitch(psta->bw_mode){\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\tsgi = sgi_80m;\n\t\t\tbreak;\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\tsgi = sgi_40m;\n\t\t\tbreak;\n\t\tcase CHANNEL_WIDTH_20:\n\t\tdefault:\n\t\t\tsgi = sgi_20m;\n\t\t\tbreak;\n\t}\n\n\treturn sgi;\n}\n\nstatic void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tu32\tsz;\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\t//struct sta_info\t*psta = pattrib->psta;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n/*\n        if(pattrib->psta)\n\t{\n\t\tpsta = pattrib->psta;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tpsta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );\n\t}\n\n        if(psta==NULL)\n\t{\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn;\n\t}\n*/\n\n\tif (pattrib->nr_frags != 1)\n\t{\n\t\tsz = padapter->xmitpriv.frag_len;\n\t}\n\telse //no frag\n\t{\n\t\tsz = pattrib->last_txcmdsz;\n\t}\n\n\t// (1) RTS_Threshold is compared to the MPDU, not MSDU.\n\t// (2) If there are more than one frag in  this MSDU, only the first frag uses protection frame.\n\t//\t\tOther fragments are protected by previous fragment.\n\t//\t\tSo we only need to check the length of first fragment.\n\tif(pmlmeext->cur_wireless_mode < WIRELESS_11_24N  || padapter->registrypriv.wifi_spec)\n\t{\n\t\tif(sz > padapter->registrypriv.rts_thresh)\n\t\t{\n\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pattrib->rtsen)\n\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\telse if(pattrib->cts2self)\n\t\t\t\tpattrib->vcs_mode = CTS_TO_SELF;\n\t\t\telse\n\t\t\t\tpattrib->vcs_mode = NONE_VCS;\n\t\t}\n\t}\n\telse\n\t{\n\t\twhile (_TRUE)\n\t\t{\n#if 0 //Todo\n\t\t\t//check IOT action\n\t\t\tif(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)\n\t\t\t{\n\t\t\t\tpattrib->vcs_mode = CTS_TO_SELF;\n\t\t\t\tpattrib->rts_rate = MGN_24M;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))\n\t\t\t{\n\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\t\tpattrib->rts_rate = MGN_24M;\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\n\t\t\t//IOT action\n\t\t\tif((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en==_TRUE) &&\n\t\t\t\t(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))\n\t\t\t{\n\t\t\t\tpattrib->vcs_mode = CTS_TO_SELF;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t\t\n\n\t\t\t//check ERP protection\n\t\t\tif(pattrib->rtsen || pattrib->cts2self)\n\t\t\t{\n\t\t\t\tif(pattrib->rtsen)\n\t\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\t\telse if(pattrib->cts2self)\n\t\t\t\t\tpattrib->vcs_mode = CTS_TO_SELF;\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t//check HT op mode\n\t\t\tif(pattrib->ht_en)\n\t\t\t{\n\t\t\t\tu8 HTOpMode = pmlmeinfo->HT_protection;\n\t\t\t\tif((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||\n\t\t\t\t\t(!pmlmeext->cur_bwmode && HTOpMode == 3) )\n\t\t\t\t{\n\t\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//check rts\n\t\t\tif(sz > padapter->registrypriv.rts_thresh)\n\t\t\t{\n\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t//to do list: check MIMO power save condition.\n\n\t\t\t//check AMPDU aggregation for TXOP\n\t\t\tif((pattrib->ampdu_en==_TRUE) && (!IS_HARDWARE_TYPE_8812(padapter)))\n\t\t\t{\n\t\t\t\tpattrib->vcs_mode = RTS_CTS;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpattrib->vcs_mode = NONE_VCS;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t//for debug : force driver control vrtl_carrier_sense.\n\tif(padapter->driver_vcs_en==1)\n\t{\n\t\t//u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.\n\t\t//u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.\n\t\tpattrib->vcs_mode = padapter->driver_vcs_type;\n\t}\t\n\t\n}\n\nstatic void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)\n{\n\tstruct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;\n\n\tpattrib->rtsen = psta->rtsen;\n\tpattrib->cts2self = psta->cts2self;\n\t\n\tpattrib->mdata = 0;\n\tpattrib->eosp = 0;\n\tpattrib->triggered=0;\n\tpattrib->ampdu_spacing = 0;\n\t\n\t//qos_en, ht_en, init rate, ,bw, ch_offset, sgi\n\tpattrib->qos_en = psta->qos_option;\n\t\n\tpattrib->raid = psta->raid;\n\n\tif (mlmeext->cur_bwmode < psta->bw_mode)\n\t\tpattrib->bwmode = mlmeext->cur_bwmode;\n\telse\n\t\tpattrib->bwmode = psta->bw_mode;\n\n\tpattrib->sgi = query_ra_short_GI(psta);\n\n\tpattrib->ldpc = psta->ldpc;\n\tpattrib->stbc = psta->stbc;\n\n#ifdef CONFIG_80211N_HT\n\tpattrib->ht_en = psta->htpriv.ht_option;\n\tpattrib->ch_offset = psta->htpriv.ch_offset;\n\tpattrib->ampdu_en = _FALSE;\n\n\tif(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx\n\t\tpattrib->ampdu_spacing = padapter->driver_ampdu_spacing;\n\telse\n\t\tpattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;\n#endif //CONFIG_80211N_HT\n\t//if(pattrib->ht_en && psta->htpriv.ampdu_enable)\n\t//{\n\t//\tif(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))\n\t//\t\tpattrib->ampdu_en = _TRUE;\n\t//}\t\n\n#ifdef CONFIG_TDLS\n\tif (pattrib->direct_link==_TRUE) {\n\t\tpsta = pattrib->ptdls_sta;\n\n\t\tpattrib->raid = psta->raid;\n#ifdef CONFIG_80211N_HT\n\t\tpattrib->bwmode = psta->bw_mode;\n\t\tpattrib->ht_en = psta->htpriv.ht_option;\n\t\tpattrib->ch_offset = psta->htpriv.ch_offset;\n\t\tpattrib->sgi= query_ra_short_GI(psta);\n#endif /* CONFIG_80211N_HT */\n\t}\n#endif /* CONFIG_TDLS */\n\n\tpattrib->retry_ctrl = _FALSE;\n\n#ifdef CONFIG_AUTO_AP_MODE\n\tif(psta->isrc && psta->pid>0)\n\t\tpattrib->pctrl = _TRUE;\n#endif\n\n}\n\nstatic s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)\n{\n\tsint res = _SUCCESS;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tsint bmcast = IS_MCAST(pattrib->ra);\n\n\t_rtw_memset(pattrib->dot118021x_UncstKey.skey,  0, 16);\t\t\n\t_rtw_memset(pattrib->dot11tkiptxmickey.skey,  0, 16);\n\tpattrib->mac_id = psta->mac_id;\n\n\tif (psta->ieee8021x_blocked == _TRUE)\n\t{\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"\\n psta->ieee8021x_blocked == _TRUE \\n\"));\n\n\t\tpattrib->encrypt = 0;\n\n\t\tif((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE))\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"\\npsta->ieee8021x_blocked == _TRUE,  pattrib->ether_type(%.4x) != 0x888e\\n\",pattrib->ether_type));\n\t\t\t#ifdef DBG_TX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE,  pattrib->ether_type(%04x) != 0x888e\\n\", __FUNCTION__,pattrib->ether_type);\n\t\t\t#endif\n\t\t\tres = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\telse\n\t{\n\t\tGET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);\n\t\t\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif(pattrib->ether_type == 0x88B4)\n\t\t\tpattrib->encrypt=_NO_PRIVACY_;\n#endif\n\n\t\tswitch(psecuritypriv->dot11AuthAlgrthm)\n\t\t{\n\t\t\tcase dot11AuthAlgrthm_Open:\n\t\t\tcase dot11AuthAlgrthm_Shared:\n\t\t\tcase dot11AuthAlgrthm_Auto:\n\t\t\t\tpattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;\n\t\t\t\tbreak;\n\t\t\tcase dot11AuthAlgrthm_8021X:\n\t\t\t\tif(bmcast)\n\t\t\t\t\tpattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;\n\t\t\t\telse\n\t\t\t\t\tpattrib->key_idx = 0;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tpattrib->key_idx = 0;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t//For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake.\n\t\tif (((pattrib->encrypt ==_WEP40_)||(pattrib->encrypt ==_WEP104_)) && (pattrib->ether_type == 0x888e))\n\t\t\tpattrib->encrypt=_NO_PRIVACY_;\n\t\t\n\t}\n\n#ifdef CONFIG_TDLS\n\tif (pattrib->direct_link == _TRUE) {\n\t\tif (pattrib->encrypt > 0)\n\t\t\tpattrib->encrypt = _AES_;\n\t}\n#endif \n\t\n\tswitch (pattrib->encrypt)\n\t{\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\tpattrib->iv_len = 4;\n\t\t\tpattrib->icv_len = 4;\n\t\t\tWEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\tbreak;\n\n\t\tcase _TKIP_:\n\t\t\tpattrib->iv_len = 8;\n\t\t\tpattrib->icv_len = 4;\n\n\t\t\tif(psecuritypriv->busetkipkey==_FAIL)\n\t\t\t{\t\t\t\t\n\t\t\t\t#ifdef DBG_TX_DROP_FRAME\n\t\t\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\\n\", __FUNCTION__, psecuritypriv->busetkipkey);\n\t\t\t\t#endif\n\t\t\t\tres =_FAIL;\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\tif(bmcast)\n\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\telse\n\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, 0);\n\n\n\t\t\t_rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16);\n\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase _AES_:\n\t\t\t\n\t\t\tpattrib->iv_len = 8;\n\t\t\tpattrib->icv_len = 8;\n\t\t\t\n\t\t\tif(bmcast)\n\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\telse\n\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, 0);\n\t\t\t\n\t\t\tbreak;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\tpattrib->iv_len = 18;\n\t\t\tpattrib->icv_len = 16;\n\t\t\trtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);\t\t\t\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tpattrib->iv_len = 0;\n\t\t\tpattrib->icv_len = 0;\n\t\t\tbreak;\n\t}\n\n\tif(pattrib->encrypt>0)\n\t\t_rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);\t\t\n\n\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,\n\t\t(\"update_attrib: encrypt=%d  securitypriv.sw_encrypt=%d\\n\",\n\t\tpattrib->encrypt, padapter->securitypriv.sw_encrypt));\n\n\tif (pattrib->encrypt &&\n\t\t((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))\n\t{\n\t\tpattrib->bswenc = _TRUE;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,\n\t\t\t(\"update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\\n\",\n\t\t\tpattrib->encrypt, padapter->securitypriv.sw_encrypt));\n\t} else {\n\t\tpattrib->bswenc = _FALSE;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"update_attrib: bswenc=_FALSE\\n\"));\n\t}\n\n#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)\n\tif((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))\n\t{\n\t\tpattrib->bswenc = _TRUE;//force using sw enc.\n\t}\n#endif\n#ifdef DYNAMIC_CAMID_ALLOC\n\tif (pattrib->encrypt && bmcast && _rtw_camctl_chk_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))\n\t\tpattrib->bswenc = _TRUE;\n#endif\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif(pattrib->encrypt == _SMS4_)\n\t\tpattrib->bswenc = _FALSE;\n#endif\n\nexit:\n\n\treturn res;\n\t\n}\n\nu8\tqos_acm(u8 acm_mask, u8 priority)\n{\n\tu8\tchange_priority = priority;\n\n\tswitch (priority)\n\t{\n\t\tcase 0:\n\t\tcase 3:\n\t\t\tif(acm_mask & BIT(1))\n\t\t\t\tchange_priority = 1;\n\t\t\tbreak;\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tbreak;\n\t\tcase 4:\n\t\tcase 5:\n\t\t\tif(acm_mask & BIT(2))\n\t\t\t\tchange_priority = 0;\n\t\t\tbreak;\n\t\tcase 6:\n\t\tcase 7:\n\t\t\tif(acm_mask & BIT(3))\n\t\t\t\tchange_priority = 5;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"qos_acm(): invalid pattrib->priority: %d!!!\\n\", priority);\n\t\t\tbreak;\n\t}\n\n\treturn change_priority;\n}\n\nstatic void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)\n{\n\tstruct ethhdr etherhdr;\n\tstruct iphdr ip_hdr;\n\ts32 UserPriority = 0;\n\n\n\t_rtw_open_pktfile(ppktfile->pkt, ppktfile);\n\t_rtw_pktfile_read(ppktfile, (unsigned char*)&etherhdr, ETH_HLEN);\n\n\t// get UserPriority from IP hdr\n\tif (pattrib->ether_type == 0x0800) {\n\t\t_rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));\n//\t\tUserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3;\n\t\tUserPriority = ip_hdr.tos >> 5;\n\t}\n/* \n\telse if (pattrib->ether_type == 0x888e) {\n\t\t// \"When priority processing of data frames is supported,\n\t\t// a STA's SME should send EAPOL-Key frames at the highest priority.\"\n\t\tUserPriority = 7;\n\t}\n*/\n\tpattrib->priority = UserPriority;\n\tpattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;\n\tpattrib->subtype = WIFI_QOS_DATA_TYPE;\n}\n\n#ifdef CONFIG_TDLS\nu8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)\n{\n\tpattrib->ptdls_sta = NULL;\n\n\tpattrib->direct_link = _FALSE;\n\tif (padapter->tdlsinfo.link_established == _TRUE) {\n\t\tpattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);\n#if 1\n\t\tif((pattrib->ptdls_sta!=NULL)&&\n\t\t\t(pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&\n\t\t\t(pattrib->ether_type!=0x0806)){\n\t\t\t\tpattrib->direct_link = _TRUE;\n\t\t\t\t//DBG_871X(\"send ptk to \"MAC_FMT\" using direct link\\n\", MAC_ARG(pattrib->dst));\n\t\t}\n#else\n\t\tif (pattrib->ptdls_sta != NULL &&\n\t\t\tpattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {\n\t\t\t\tpattrib->direct_link = _TRUE;\n\t\t\t\t#if 0\n\t\t\t\tDBG_871X(\"send ptk to \"MAC_FMT\" using direct link\\n\", MAC_ARG(pattrib->dst));\n\t\t\t\t#endif\n\t\t}\n\n\t\t/* ARP frame may be helped by AP*/\n\t\tif (pattrib->ether_type != 0x0806) {\n\t\t\t\tpattrib->direct_link = _FALSE;\n\t\t}\t\n#endif\n\t}\n\n\treturn pattrib->direct_link;\n}\n\ns32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)\n{\n\n\tstruct sta_info *psta = NULL;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct qos_priv\t\t*pqospriv= &pmlmepriv->qospriv;\n\n\ts32 res=_SUCCESS;\n\t\n\tpsta = rtw_get_stainfo(pstapriv, pattrib->ra);\n\tif (psta == NULL)\t{ \n\t\tres =_FAIL;\n\t\tgoto exit;\n\t}\n\n\tpattrib->mac_id = psta->mac_id;\n\tpattrib->psta = psta;\n\tpattrib->ack_policy = 0;\n\t// get ether_hdr_len\n\tpattrib->pkt_hdrlen = ETH_HLEN;\n\n\t// [TDLS] TODO: setup req/rsp should be AC_BK\n\tif (pqospriv->qos_option &&  psta->qos_option) {\n\t\tpattrib->priority = 4;\t//tdls management frame should be AC_VI\n\t\tpattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;\n\t\tpattrib->subtype = WIFI_QOS_DATA_TYPE;\n\t} else {\n\t\tpattrib->priority = 0;\n\t\tpattrib->hdrlen = WLAN_HDR_A3_LEN;\n\t\tpattrib->subtype = WIFI_DATA_TYPE;\t\n\t}\n\n\t//TODO:_lock\n\tif(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)\n\t{\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tupdate_attrib_phy_info(padapter, pattrib, psta);\n\n\nexit:\n\n\treturn res;\n}\n\n#endif //CONFIG_TDLS\n\n//get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3\ninline u8 rtw_get_hwseq_no(_adapter *padapter)\n{\n\tu8 hwseq_num = 0;\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->adapter_type == SECONDARY_ADAPTER)\n\t\thwseq_num = 1;\n\t//else\n\t//\thwseq_num = 2;\n#endif //CONFIG_CONCURRENT_MODE\n\treturn hwseq_num;\n}\nstatic s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)\n{\n\tuint i;\n\tstruct pkt_file pktfile;\n\tstruct sta_info *psta = NULL;\n\tstruct ethhdr etherhdr;\n\n\tsint bmcast;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct qos_priv\t\t*pqospriv= &pmlmepriv->qospriv;\n\tstruct xmit_priv \t\t*pxmitpriv = &padapter->xmitpriv;\n\tsint res = _SUCCESS;\n\n _func_enter_;\n\n\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);\n\n\t_rtw_open_pktfile(pkt, &pktfile);\n\ti = _rtw_pktfile_read(&pktfile, (u8*)&etherhdr, ETH_HLEN);\n\n\tpattrib->ether_type = ntohs(etherhdr.h_proto);\n\n\n\t_rtw_memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);\n\t_rtw_memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);\n\n\n\tif ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||\n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {\n\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);\n\t}\n\telse if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n#ifdef CONFIG_TDLS\n\t\tif (rtw_check_tdls_established(padapter, pattrib) == _TRUE)\n\t\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\t/* For TDLS direct link Tx, set ra to be same to dst */\n\t\telse\n#endif\n\t\t_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);\n\t}\n\telse if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\t\t_rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);\n\t} \n\telse\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);\n\n\tpattrib->pktlen = pktfile.pkt_len;\n\n\tif (ETH_P_IP == pattrib->ether_type)\n\t{\n\t\t// The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time \n\t\t// to prevent DHCP protocol fail\n\n\t\tu8 tmp[24];\n\t\t\n\t\t_rtw_pktfile_read(&pktfile, &tmp[0], 24);\n\n\t\tpattrib->dhcp_pkt = 0;\n\t\tif (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) {\n\t\t\tif (ETH_P_IP == pattrib->ether_type) {// IP header\n\t\t\t\tif (((tmp[21] == 68) && (tmp[23] == 67)) ||\n\t\t\t\t\t((tmp[21] == 67) && (tmp[23] == 68))) {\n\t\t\t\t\t// 68 : UDP BOOTP client\n\t\t\t\t\t// 67 : UDP BOOTP server\n\t\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"======================update_attrib: get DHCP Packet \\n\"));\n\t\t\t\t\t// Use low rate to send DHCP packet.\n\t\t\t\t\t//if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) \n\t\t\t\t\t//{\n\t\t\t\t\t//\ttcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m\n\t\t\t\t\t//\ttcb_desc->bTxDisableRateFallBack = false;\n\t\t\t\t\t//}\n\t\t\t\t\t//else\n\t\t\t\t\t//\tpTcb->DataRate = Adapter->MgntInfo.LowestBasicRate; \n\t\t\t\t\t//RTPRINT(FDM, WA_IOT, (\"DHCP TranslateHeader(), pTcb->DataRate = 0x%x\\n\", pTcb->DataRate)); \n\t\t\t\t\tpattrib->dhcp_pkt = 1;\n\t\t\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//for parsing ICMP pakcets\n\t\t{\n\t\t\tstruct iphdr *piphdr = (struct iphdr *)tmp;\n\n\t\t\tpattrib->icmp_pkt = 0;\t\n\t\t\tif(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP\t\t\t\n\t\t\t{\n\t\t\t\tpattrib->icmp_pkt = 1;\n\t\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);\n\t\t\t}\n\t\t}\t\n\n\t\t\n\t} else if (0x888e == pattrib->ether_type) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"send eapol packet\\n\");\n\t}\n\n\tif ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )\n\t{\n\t\trtw_set_scan_deny(padapter, 3000);\n\t}\n\n#ifdef CONFIG_LPS\n\t// If EAPOL , ARP , OR DHCP packet, driver must be in active mode.\n#ifdef CONFIG_WAPI_SUPPORT\n\tif ( (pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )\n#else //!CONFIG_WAPI_SUPPORT\n#if 0\n\tif ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )\n#else // only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets.\n\t//if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )\n\tif (pattrib->icmp_pkt==1)\n\t{\n\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);\n\t}\n\telse if(pattrib->dhcp_pkt==1)\n#endif \n#endif\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);\n\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);\n\t}\n#endif //CONFIG_LPS\n\n\tbmcast = IS_MCAST(pattrib->ra);\n\t\n\t// get sta_info\n\tif (bmcast) {\n\t\tpsta = rtw_get_bcmc_stainfo(padapter);\n\t} else {\n\t\tpsta = rtw_get_stainfo(pstapriv, pattrib->ra);\n\t\tif (psta == NULL)\t{ // if we cannot get psta => drop the pkt\n\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, (\"\\nupdate_attrib => get sta_info fail, ra:\" MAC_FMT\"\\n\", MAC_ARG(pattrib->ra)));\n\t\t\t#ifdef DBG_TX_DROP_FRAME\n\t\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s get sta_info fail, ra:\" MAC_FMT\"\\n\", __FUNCTION__, MAC_ARG(pattrib->ra));\n\t\t\t#endif\n\t\t\tres =_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\telse if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))\n\t\t{\n\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);\n\t\t\tres =_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tif(psta == NULL)\n\t{\t\t// if we cannot get psta => drop the pkt\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, (\"\\nupdate_attrib => get sta_info fail, ra:\" MAC_FMT \"\\n\", MAC_ARG(pattrib->ra)));\n\t\t#ifdef DBG_TX_DROP_FRAME\n\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s get sta_info fail, ra:\" MAC_FMT\"\\n\", __FUNCTION__, MAC_ARG(pattrib->ra));\n\t\t#endif\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);\n\t\tDBG_871X(\"%s, psta(\"MAC_FMT\")->state(0x%x) != _FW_LINKED\\n\", __func__, MAC_ARG(psta->hwaddr), psta->state);\n\t\treturn _FAIL;\n\t}\n#ifdef CONFIG_BEAMFORMING\n\tupdate_attrib_txbf_info(padapter, pattrib, psta);\n#endif\n\n\t//TODO:_lock\n\tif(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tupdate_attrib_phy_info(padapter, pattrib, psta);\n\n\t//DBG_8192C(\"%s ==> mac_id(%d)\\n\",__FUNCTION__,pattrib->mac_id );\n\t\n\tpattrib->psta = psta;\n\t//TODO:_unlock\n\t\n\tpattrib->pctrl = 0;\t\n\t\t\n\tpattrib->ack_policy = 0;\n\t// get ether_hdr_len\n\tpattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag\n\n\tpattrib->hdrlen = WLAN_HDR_A3_LEN;\n\tpattrib->subtype = WIFI_DATA_TYPE;\t\n\tpattrib->priority = 0;\n\t\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))\n\t{\n\t\tif(pattrib->qos_en)\n\t\t\tset_qos(&pktfile, pattrib);\n\t}\n\telse\n\t{\n#ifdef CONFIG_TDLS\n\t\tif (pattrib->direct_link == _TRUE) {\n\t\t\tif (pattrib->qos_en)\n\t\t\t\tset_qos(&pktfile, pattrib);\n\t\t} else \n#endif\n\t\t{\n\t\t\tif (pqospriv->qos_option) {\n\t\t\t\tset_qos(&pktfile, pattrib);\n\n\t\t\t\tif (pmlmepriv->acm_mask != 0)\n\t\t\t\t\tpattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);\n\t\t\t}\n\t\t}\n\t}\n\n\t//pattrib->priority = 5; //force to used VI queue, for testing\n\tpattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;\n\trtw_set_tx_chksum_offload(pkt, pattrib);\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\nstatic s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){\n\tsint \t\t\tcurfragnum,length;\n\tu8\t*pframe, *payload,mic[8];\n\tstruct\tmic_data\t\tmicdata;\n\t//struct\tsta_info\t\t*stainfo;\n\tstruct\tqos_priv   *pqospriv= &(padapter->mlmepriv.qospriv);\t\n\tstruct\tpkt_attrib\t *pattrib = &pxmitframe->attrib;\n\tstruct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\tstruct\txmit_priv\t\t*pxmitpriv=&padapter->xmitpriv;\n\tu8 priority[4]={0x0,0x0,0x0,0x0};\n\tu8 hw_hdr_offset = 0;\n\tsint bmcst = IS_MCAST(pattrib->ra);\n\n/*\n\tif(pattrib->psta)\n\t{\n\t\tstainfo = pattrib->psta;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tstainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);\n\t}\t\n\t\n\tif(stainfo==NULL)\n\t{\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn _FAIL;\n\t}\n\n\tif(!(stainfo->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, stainfo->state);\n\t\treturn _FAIL;\n\t}\n*/\n\n_func_enter_;\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\thw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;\t\n#else\n\t#ifdef CONFIG_TX_EARLY_MODE\n\thw_hdr_offset = TXDESC_OFFSET+ EARLY_MODE_INFO_SIZE;\n\t#else\n\thw_hdr_offset = TXDESC_OFFSET;\n\t#endif\n#endif\t\n\t\n\tif(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) \n\t{\n\t\t//encode mic code\n\t\t//if(stainfo!= NULL)\n\t\t{\n\t\t\tu8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};\n\n\t\t\tpframe = pxmitframe->buf_addr + hw_hdr_offset;\n\t\t\t\n\t\t\tif(bmcst)\n\t\t\t{\n\t\t\t\tif(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){\n\t\t\t\t\t//DbgPrint(\"\\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\\n\");\n\t\t\t\t\t//rtw_msleep_os(10);\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\t\t\t\t\n\t\t\t\t//start to calculate the mic code\n\t\t\t\trtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){\n\t\t\t\t\t//DbgPrint(\"\\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\\n\");\n\t\t\t\t\t//rtw_msleep_os(10);\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\n\t\t\t\t//start to calculate the mic code\n\t\t\t\trtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]);\n\t\t\t}\n\t\t\t\n\t\t\tif(pframe[1]&1){   //ToDS==1\n\t\t\t\trtw_secmicappend(&micdata, &pframe[16], 6);  //DA\n\t\t\t\tif(pframe[1]&2)  //From Ds==1\n\t\t\t\t\trtw_secmicappend(&micdata, &pframe[24], 6);\n\t\t\t\telse\n\t\t\t\trtw_secmicappend(&micdata, &pframe[10], 6);\t\t\n\t\t\t}\t\n\t\t\telse{\t//ToDS==0\n\t\t\t\trtw_secmicappend(&micdata, &pframe[4], 6);   //DA\n\t\t\t\tif(pframe[1]&2)  //From Ds==1\n\t\t\t\t\trtw_secmicappend(&micdata, &pframe[16], 6);\n\t\t\t\telse\n\t\t\t\t\trtw_secmicappend(&micdata, &pframe[10], 6);\n\n\t\t\t}\n\n                    //if(pqospriv->qos_option==1)\n                    if(pattrib->qos_en)\n\t\t\t\tpriority[0]=(u8)pxmitframe->attrib.priority;\n\n\t\t\t\n\t\t\trtw_secmicappend(&micdata, &priority[0], 4);\n\t\n\t\t\tpayload=pframe;\n\n\t\t\tfor(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){\n\t\t\t\tpayload=(u8 *)RND4((SIZE_PTR)(payload));\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\\n\",\n\t\t\t\t\tcurfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7)));\n\n\t\t\t\tpayload=payload+pattrib->hdrlen+pattrib->iv_len;\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d\",curfragnum,pattrib->hdrlen,pattrib->iv_len));\n\t\t\t\tif((curfragnum+1)==pattrib->nr_frags){\n\t\t\t\t\tlength=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);\n\t\t\t\t\trtw_secmicappend(&micdata, payload,length);\n\t\t\t\t\tpayload=payload+length;\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tlength=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);\n\t\t\t\t\trtw_secmicappend(&micdata, payload, length);\n\t\t\t\t\tpayload=payload+length+pattrib->icv_len;\n\t\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"curfragnum=%d length=%d pattrib->icv_len=%d\",curfragnum,length,pattrib->icv_len));\n\t\t\t\t}\n\t\t\t}\n\t\t\trtw_secgetmic(&micdata,&(mic[0]));\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"xmitframe_addmic: before add mic code!!!\\n\"));\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\\n\",pattrib->last_txcmdsz));\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \\n\\\n  mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\\n\",\n\t\t\t\tmic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7]));\n\t\t\t//add mic code  and add the mic code length in last_txcmdsz\n\n\t\t\t_rtw_memcpy(payload, &(mic[0]),8);\n\t\t\tpattrib->last_txcmdsz+=8;\n\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"\\n ========last pkt========\\n\"));\n\t\t\tpayload=payload-pattrib->last_txcmdsz+8;\n\t\t\tfor(curfragnum=0;curfragnum<pattrib->last_txcmdsz;curfragnum=curfragnum+8)\n\t\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\" %.2x,  %.2x,  %.2x,  %.2x,  %.2x,  %.2x,  %.2x,  %.2x \",\n\t\t\t\t\t*(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3),\n\t\t\t\t\t*(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7)));\n\t\t\t}\n/*\n\t\t\telse{\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"xmitframe_addmic: rtw_get_stainfo==NULL!!!\\n\"));\n\t\t\t}\n*/\t\t\n\t}\n\t\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\nstatic s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){\n\n\tstruct\tpkt_attrib\t *pattrib = &pxmitframe->attrib;\n\t//struct \tsecurity_priv\t*psecuritypriv=&padapter->securitypriv;\n\t\n_func_enter_;\n\n\t//if((psecuritypriv->sw_encrypt)||(pattrib->bswenc))\t\n\tif(pattrib->bswenc)\n\t{\n\t\t//DBG_871X(\"start xmitframe_swencrypt\\n\");\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,(\"### xmitframe_swencrypt\\n\"));\n\t\tswitch(pattrib->encrypt){\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\trtw_wep_encrypt(padapter, (u8 *)pxmitframe);\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\trtw_tkip_encrypt(padapter, (u8 *)pxmitframe);\n\t\t\tbreak;\n\t\tcase _AES_:\n\t\t\trtw_aes_encrypt(padapter, (u8 * )pxmitframe);\n\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\trtw_sms4_encrypt(padapter, (u8 * )pxmitframe);\n#endif\n\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t} else {\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,(\"### xmitframe_hwencrypt\\n\"));\n\t}\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\ns32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)\n{\n\tu16 *qc;\n\n\tstruct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct qos_priv *pqospriv = &pmlmepriv->qospriv;\n\tu8 qos_option = _FALSE;\n\tsint res = _SUCCESS;\n\tu16 *fctrl = &pwlanhdr->frame_ctl;\n\n\t//struct sta_info *psta;\n\n\t//sint bmcst = IS_MCAST(pattrib->ra);\n\n_func_enter_;\n\n/*\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\tif(pattrib->psta != psta)\n\t{\n\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\treturn;\n\t}\n\n\tif(psta==NULL)\n\t{\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn _FAIL;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn _FAIL;\n\t}\n*/\n\n\t_rtw_memset(hdr, 0, WLANHDR_OFFSET);\n\n\tSetFrameSubType(fctrl, pattrib->subtype);\n\n\tif (pattrib->subtype & WIFI_DATA_TYPE)\n\t{\n\t\tif ((check_fwstate(pmlmepriv,  WIFI_STATION_STATE) == _TRUE)) {\n#ifdef CONFIG_TDLS\n\t\t\tif(pattrib->direct_link == _TRUE){\n\t\t\t\t//TDLS data transfer, ToDS=0, FrDs=0\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);\n\n\t\t\t\tif (pattrib->qos_en)\n\t\t\t\t\tqos_option = _TRUE;\n\t\t\t} \n\t\t\telse\n#endif //CONFIG_TDLS\n\t\t\t{\n\t\t\t\t//to_ds = 1, fr_ds = 0;\n\t\t\t\t// 1.Data transfer to AP\n\t\t\t\t// 2.Arp pkt will relayed by AP\n\t\t\t\tSetToDs(fctrl);\t\t\t\t\t\t\t\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);\n\n\t\t\t\tif (pqospriv->qos_option)\n\t\t\t\t\tqos_option = _TRUE;\n\t\t\t} \n\t\t}\n\t\telse if ((check_fwstate(pmlmepriv,  WIFI_AP_STATE) == _TRUE) ) {\n\t\t\t//to_ds = 0, fr_ds = 1;\n\t\t\tSetFrDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);\n\n\t\t\tif(pattrib->qos_en)\n\t\t\t\tqos_option = _TRUE;\n\t\t}\n\t\telse if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||\n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);\n\n\t\t\tif(pattrib->qos_en)\n\t\t\t\tqos_option = _TRUE;\n\t\t}\n\t\telse {\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"fw_state:%x is not allowed to xmit frame\\n\", get_fwstate(pmlmepriv)));\n\t\t\tres = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif(pattrib->mdata)\n\t\t\tSetMData(fctrl);\n\n\t\tif (pattrib->encrypt)\n\t\t\tSetPrivacy(fctrl);\n\n\t\tif (qos_option)\n\t\t{\n\t\t\tqc = (unsigned short *)(hdr + pattrib->hdrlen - 2);\n\n\t\t\tif (pattrib->priority)\n\t\t\t\tSetPriority(qc, pattrib->priority);\n\n\t\t\tSetEOSP(qc, pattrib->eosp);\n\n\t\t\tSetAckpolicy(qc, pattrib->ack_policy);\n\t\t}\n\n\t\t//TODO: fill HT Control Field\n\n\t\t//Update Seq Num will be handled by f/w\n\t\t{\n\t\t\tstruct sta_info *psta;\n\t\t\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\t\t\tif(pattrib->psta != psta)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tif(psta==NULL)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tif(!(psta->state &_FW_LINKED))\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\n\t\t\tif(psta)\n\t\t\t{\n\t\t\t\tpsta->sta_xmitpriv.txseq_tid[pattrib->priority]++;\n\t\t\t\tpsta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;\n\t\t\t\tpattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];\n\n\t\t\t\tSetSeqNum(hdr, pattrib->seqnum);\n\n#ifdef CONFIG_80211N_HT\n\t\t\t\t//check if enable ampdu\n\t\t\t\tif(pattrib->ht_en && psta->htpriv.ampdu_enable)\n\t\t\t\t{\n\t\t\t\t\tif(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))\n\t\t\t\t\t\tpattrib->ampdu_en = _TRUE;\n\t\t\t\t}\n\n\t\t\t\t//re-check if enable ampdu by BA_starting_seqctrl\n\t\t\t\tif(pattrib->ampdu_en == _TRUE)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tu16 tx_seq;\n\n\t\t\t\t\ttx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];\n\t\t\n\t\t\t\t\t//check BA_starting_seqctrl\n\t\t\t\t\tif(SN_LESS(pattrib->seqnum, tx_seq))\n\t\t\t\t\t{\n\t\t\t\t\t\t//DBG_871X(\"tx ampdu seqnum(%d) < tx_seq(%d)\\n\", pattrib->seqnum, tx_seq);\n\t\t\t\t\t\tpattrib->ampdu_en = _FALSE;//AGG BK\n\t\t\t\t\t}\n\t\t\t\t\telse if(SN_EQUAL(pattrib->seqnum, tx_seq))\n\t\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t\tpsta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;\n\t\t\t\t\t\n\t\t\t\t\t\tpattrib->ampdu_en = _TRUE;//AGG EN\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t//DBG_871X(\"tx ampdu over run\\n\");\n\t\t\t\t\t\tpsta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;\n\t\t\t\t\t\tpattrib->ampdu_en = _TRUE;//AGG EN\n\t\t\t\t\t}\n\n\t\t\t\t}\n#endif //CONFIG_80211N_HT\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\telse\n\t{\n\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\ns32 rtw_txframes_pending(_adapter *padapter)\n{\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\treturn ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) || \n\t\t\t (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) || \n\t\t\t (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||\n\t\t\t (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));\n}\n\ns32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)\n{\t\n\tstruct sta_info *psta;\n\tstruct tx_servq *ptxservq;\n\tint priority = pattrib->priority;\n/*\n\tif(pattrib->psta)\n\t{\n\t\tpsta = pattrib->psta;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tpsta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);\n\t}\t\n*/\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\tif(pattrib->psta != psta)\n\t{\n\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\treturn 0;\n\t}\n\n\tif(psta==NULL)\n\t{\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn 0;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn 0;\n\t}\n\t\n\tswitch(priority) \n\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.bk_q);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.vi_q);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.vo_q);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.be_q);\t\t\t\t\t\t\t\n\t\t\tbreak;\n\t\n\t}\t\n\n\treturn ptxservq->qcnt;\t\n}\n\n#ifdef CONFIG_TDLS\n\nint rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)\n{\n\tint res=_SUCCESS;\n\n\tswitch(ptxmgmt->action_code){\n\t\tcase TDLS_SETUP_REQUEST:\n\t\t\trtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n\t\tcase TDLS_SETUP_RESPONSE:\n\t\t\trtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n\t\tcase TDLS_SETUP_CONFIRM:\n\t\t\trtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n\t\tcase TDLS_TEARDOWN:\n\t\t\trtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n\t\tcase TDLS_DISCOVERY_REQUEST:\n\t\t\trtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\t\t\t\n\t\tcase TDLS_PEER_TRAFFIC_INDICATION:\n\t\t\trtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n#ifdef CONFIG_TDLS_CH_SW\t\t\t\n\t\tcase TDLS_CHANNEL_SWITCH_REQUEST:\n\t\t\trtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n\t\tcase TDLS_CHANNEL_SWITCH_RESPONSE:\n\t\t\trtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n#endif\t\t\t\n\t\tcase TDLS_PEER_TRAFFIC_RESPONSE:\n\t\t\trtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\t\t\tbreak;\n#ifdef CONFIG_WFD\t\t\t\n\t\tcase TUNNELED_PROBE_REQ:\n\t\t\trtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);\n\t\t\tbreak;\n\t\tcase TUNNELED_PROBE_RSP:\n\t\t\trtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);\n\t\t\tbreak;\n#endif //CONFIG_WFD\n\t\tdefault:\n\t\t\tres=_FAIL;\n\t\t\tbreak;\n\t}\n\n\treturn res;\n}\n\ns32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)\n{\n\tu16 *qc;\n\tstruct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct qos_priv *pqospriv = &pmlmepriv->qospriv;\n\tstruct sta_priv \t*pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta=NULL, *ptdls_sta=NULL;\n\tu8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\n\n\tsint res = _SUCCESS;\n\tu16 *fctrl = &pwlanhdr->frame_ctl;\n\n_func_enter_;\n\n\t_rtw_memset(hdr, 0, WLANHDR_OFFSET);\n\n\tSetFrameSubType(fctrl, pattrib->subtype);\n\n\tswitch(ptxmgmt->action_code){\n\t\tcase TDLS_SETUP_REQUEST:\n\t\tcase TDLS_SETUP_RESPONSE:\n\t\tcase TDLS_SETUP_CONFIRM:\n\t\tcase TDLS_PEER_TRAFFIC_INDICATION:\n\tcase TDLS_PEER_PSM_REQUEST:\n\t\tcase TUNNELED_PROBE_REQ:\n\t\tcase TUNNELED_PROBE_RSP:\n\t\tcase TDLS_DISCOVERY_REQUEST:\n\t\t\tSetToDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);\n\t\t\tbreak;\n\t\tcase TDLS_CHANNEL_SWITCH_REQUEST:\n\t\tcase TDLS_CHANNEL_SWITCH_RESPONSE:\n\t\tcase TDLS_PEER_PSM_RESPONSE:\n\t\tcase TDLS_PEER_TRAFFIC_RESPONSE:\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\ttdls_seq=1;\n\t\t\tbreak;\n\t\tcase TDLS_TEARDOWN:\n\t\t\tif(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)\n\t\t\t{\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\t\ttdls_seq=1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSetToDs(fctrl);\t\t\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);\n\t\t\t\t_rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tif (pattrib->encrypt)\n\t\tSetPrivacy(fctrl);\n\n\tif(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)\n\t{\n\t\tSetPwrMgt(fctrl);\n\t}\n\n\tif (pqospriv->qos_option)\n\t{\n\t\tqc = (unsigned short *)(hdr + pattrib->hdrlen - 2);\n\t\tif (pattrib->priority)\n\t\t\tSetPriority(qc, pattrib->priority);\n\t\tSetAckpolicy(qc, pattrib->ack_policy);\n\t}\n\n\tpsta = pattrib->psta;\n \n\t//  1. update seq_num per link by sta_info\n\t//  2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len\n\tif(tdls_seq==1){\n\t\tptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);\n\t\tif(ptdls_sta){\n\t\t\tptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;\n\t\t\tptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;\n\t\t\tpattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];\n\t\t\tSetSeqNum(hdr, pattrib->seqnum);\n\n\t\t\tif (pattrib->encrypt){\n\t\t\t\tpattrib->encrypt= _AES_;\n\t\t\t\tpattrib->iv_len=8;\n\t\t\t\tpattrib->icv_len=8;\n\t\t\t\tpattrib->bswenc = _FALSE;\n\t\t\t}\n\t\t\tpattrib->mac_id = ptdls_sta->mac_id;\n\t\t}else{\n\t\t\tres=_FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t}else if(psta){\n\t\tpsta->sta_xmitpriv.txseq_tid[pattrib->priority]++;\n\t\tpsta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;\n\t\tpattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];\n\t\tSetSeqNum(hdr, pattrib->seqnum);\n\t}\n\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\ns32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt)\n{\n\ts32 llc_sz;\n\n\tu8 *pframe, *mem_start;\n\n\tstruct sta_info\t\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tu8 *pbuf_start;\n\ts32 bmcst = IS_MCAST(pattrib->ra);\n\ts32 res = _SUCCESS;\n\t\n_func_enter_;\n\n\tif (pattrib->psta) {\n\t\tpsta = pattrib->psta;\n\t} else {\t\n\t\tif(bmcst) {\n\t\t\tpsta = rtw_get_bcmc_stainfo(padapter);\n\t\t} else {\n\t\t\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\t        }\n\t}\n\n\tif (psta==NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif (pxmitframe->buf_addr == NULL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpbuf_start = pxmitframe->buf_addr;\n\tmem_start = pbuf_start + TXDESC_OFFSET;\n\n\tif (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tpframe = mem_start;\n\tpframe += pattrib->hdrlen;\n\n\t//adding icv, if necessary...\n\tif (pattrib->iv_len)\n\t{\n\t\tif (psta != NULL)\n\t\t{\n\t\t\tswitch(pattrib->encrypt)\n\t\t\t{\n\t\t\t\tcase _WEP40_:\n\t\t\t\tcase _WEP104_:\n\t\t\t\t\t\tWEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase _TKIP_:\t\t\t\n\t\t\t\t\tif(bmcst)\n\t\t\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\t\t\telse\n\t\t\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, 0);\n\t\t\t\t\tbreak;\t\t\t\n\t\t\t\tcase _AES_:\n\t\t\t\t\tif(bmcst)\n\t\t\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\t\t\telse\n\t\t\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, 0);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t_rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);\n\t\tpframe += pattrib->iv_len;\n\n\t}\n\n\tllc_sz = rtw_put_snap(pframe, pattrib->ether_type);\n\tpframe += llc_sz;\n\n\t//pattrib->pktlen will be counted in rtw_build_tdls_ies\n\tpattrib->pktlen = 0;\n\n\trtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);\n\n\tif ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {\n\t\tpframe += pattrib->pktlen;\n\t\t_rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); \n\t\tpframe += pattrib->icv_len;\n\t}\n\n\tpattrib->nr_frags = 1;\n\tpattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz + \n\t\t\t((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;\n\t\n\tif (xmitframe_addmic(padapter, pxmitframe) == _FAIL)\n\t{\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\txmitframe_swencrypt(padapter, pxmitframe);\n\t\n\tupdate_attrib_vcs_info(padapter, pxmitframe);\n\t\nexit:\t\n\t\n_func_exit_;\t\n\n\treturn res;\n}\n#endif //CONFIG_TDLS\n\n/*\n * Calculate wlan 802.11 packet MAX size from pkt_attrib\n * This function doesn't consider fragment case\n */\nu32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)\n{\n\tu32\tlen = 0;\n\n\tlen = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV\n\tlen += SNAP_SIZE + sizeof(u16); // LLC\n\tlen += pattrib->pktlen;\n\tif (pattrib->encrypt == _TKIP_) len += 8; // MIC\n\tlen += ((pattrib->bswenc) ? pattrib->icv_len : 0); // ICV\n\n\treturn len;\n}\n\n/*\n\nThis sub-routine will perform all the following:\n\n1. remove 802.3 header.\n2. create wlan_header, based on the info in pxmitframe\n3. append sta's iv/ext-iv\n4. append LLC\n5. move frag chunk from pframe to pxmitframe->mem\n6. apply sw-encrypt, if necessary. \n\n*/\ns32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)\n{\n\tstruct pkt_file pktfile;\n\n\ts32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;\n\n\tSIZE_PTR addr;\n\n\tu8 *pframe, *mem_start;\n\tu8 hw_hdr_offset;\n\n\t//struct sta_info\t\t*psta;\n\t//struct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\t//struct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\n\tu8 *pbuf_start;\n\n\ts32 bmcst = IS_MCAST(pattrib->ra);\n\ts32 res = _SUCCESS;\n\n_func_enter_;\n\n/*\n\tif (pattrib->psta)\n\t{\n\t\tpsta = pattrib->psta;\n\t} else\n\t{\t\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\t}\n\n\tif(psta==NULL)\n        {\n\t\t\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn _FAIL;\n\t}\n\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn _FAIL;\n\t}\n*/\n\tif (pxmitframe->buf_addr == NULL){\n\t\tDBG_8192C(\"==> %s buf_addr==NULL \\n\",__FUNCTION__);\n\t\treturn _FAIL;\n\t}\n\n\tpbuf_start = pxmitframe->buf_addr;\n\t\n#ifdef CONFIG_USB_TX_AGGREGATION\n\thw_hdr_offset =  TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);\n#else\n\t#ifdef CONFIG_TX_EARLY_MODE //for SDIO && Tx Agg\n\thw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;\n\t#else\n\thw_hdr_offset = TXDESC_OFFSET;\n\t#endif\n#endif\n\n\tmem_start = pbuf_start +\thw_hdr_offset;\n\n\tif (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, (\"rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\\n\"));\n\t\tDBG_8192C(\"rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\\n\");\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t_rtw_open_pktfile(pkt, &pktfile);\n\t_rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);\n\n\tfrg_inx = 0;\n\tfrg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342\n\n\twhile (1)\n\t{\n\t\tllc_sz = 0;\n\n\t\tmpdu_len = frg_len;\n\n\t\tpframe = mem_start;\n\n\t\tSetMFrag(mem_start);\n\n\t\tpframe += pattrib->hdrlen;\n\t\tmpdu_len -= pattrib->hdrlen;\n\n\t\t//adding icv, if necessary...\n\t\tif (pattrib->iv_len)\n\t\t{\n/*\t\t\n\t\t\t//if (check_fwstate(pmlmepriv, WIFI_MP_STATE))\n\t\t\t//\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\n\t\t\t//else\n\t\t\t//\tpsta = rtw_get_stainfo(pstapriv, pattrib->ra);\n\n\t\t\tif (psta != NULL)\n\t\t\t{\n\t\t\t\tswitch(pattrib->encrypt)\n\t\t\t\t{\n\t\t\t\t\tcase _WEP40_:\n\t\t\t\t\tcase _WEP104_:\n\t\t\t\t\t\t\tWEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase _TKIP_:\t\t\t\n\t\t\t\t\t\tif(bmcst)\n\t\t\t\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tTKIP_IV(pattrib->iv, psta->dot11txpn, 0);\n\t\t\t\t\t\tbreak;\t\t\t\n\t\t\t\t\tcase _AES_:\n\t\t\t\t\t\tif(bmcst)\n\t\t\t\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tAES_IV(pattrib->iv, psta->dot11txpn, 0);\n\t\t\t\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\t\t\t\tcase _SMS4_:\n\t\t\t\t\t\trtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);\n\t\t\t\t\t\tbreak;\n#endif\n\t\t\t\t}\n\t\t\t}\n*/\n\t\t\t_rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);\n\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,\n\t\t\t\t (\"rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\\n\",\n\t\t\t\t  padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3)));\n\n\t\t\tpframe += pattrib->iv_len;\n\n\t\t\tmpdu_len -= pattrib->iv_len;\n\t\t}\n\n\t\tif (frg_inx == 0) {\n\t\t\tllc_sz = rtw_put_snap(pframe, pattrib->ether_type);\n\t\t\tpframe += llc_sz;\n\t\t\tmpdu_len -= llc_sz;\n\t\t}\n\n\t\tif ((pattrib->icv_len >0) && (pattrib->bswenc)) {\n\t\t\tmpdu_len -= pattrib->icv_len;\n\t\t}\n\n\n\t\tif (bmcst) {\n\t\t\t// don't do fragment to broadcat/multicast packets\n\t\t\tmem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);\n\t\t} else {\n\t\t\tmem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);\n\t\t}\n\n\t\tpframe += mem_sz;\n\n\t\tif ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {\n\t\t\t_rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); \n\t\t\tpframe += pattrib->icv_len;\n\t\t}\n\n\t\tfrg_inx++;\n\n\t\tif (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE))\n\t\t{\n\t\t\tpattrib->nr_frags = frg_inx;\n\n\t\t\tpattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) + \n\t\t\t\t\t((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;\n\t\t\t\n\t\t\tClearMFrag(mem_start);\n\n\t\t\tbreak;\n\t\t} else {\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, (\"%s: There're still something in packet!\\n\", __FUNCTION__));\n\t\t}\n\n\t\taddr = (SIZE_PTR)(pframe);\n\n\t\tmem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;\n\t\t_rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);\t\n\t\t\n\t}\n\n\tif (xmitframe_addmic(padapter, pxmitframe) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, (\"xmitframe_addmic(padapter, pxmitframe)==_FAIL\\n\"));\n\t\tDBG_8192C(\"xmitframe_addmic(padapter, pxmitframe)==_FAIL\\n\");\n\t\tres = _FAIL;\n\t\tgoto exit;\n\t}\n\n\txmitframe_swencrypt(padapter, pxmitframe);\n\n\tif(bmcst == _FALSE)\n\t\tupdate_attrib_vcs_info(padapter, pxmitframe);\n\telse\n\t\tpattrib->vcs_mode = NONE_VCS;\n\nexit:\t\n\t\n_func_exit_;\t\n\n\treturn res;\n}\n\n#ifdef CONFIG_IEEE80211W\n//broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption\ns32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)\n{\n\tstruct pkt_file pktfile;\n\ts32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;\n\tSIZE_PTR addr;\n\tu8 *pframe, *mem_start = NULL, *tmp_buf=NULL;\n\tu8 hw_hdr_offset, subtype ;\n\tstruct sta_info\t\t*psta = NULL;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tu8 *pbuf_start;\n\ts32 bmcst = IS_MCAST(pattrib->ra);\n\ts32 res = _FAIL;\n\tu8 *BIP_AAD=NULL;\n\tu8 *MGMT_body=NULL;\n\t\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu8 MME[_MME_IE_LENGTH_];\n\t\n\t_irqL irqL;\n\tu32\tori_len;\n\tmem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\t\n_func_enter_;\n\tori_len = BIP_AAD_SIZE+pattrib->pktlen;\n\ttmp_buf = BIP_AAD = rtw_zmalloc(ori_len);\n\tsubtype = GetFrameSubType(pframe); //bit(7)~bit(2)\n\t\n\tif(BIP_AAD == NULL)\n\t\treturn _FAIL;\n\t\t\t\n\t_enter_critical_bh(&padapter->security_key_mutex, &irqL);\n\t\n\t\n\t//IGTK key is not install, it may not support 802.11w\n\tif(padapter->securitypriv.binstallBIPkey != _TRUE)\n\t{\n\t\tDBG_871X(\"no instll BIP key\\n\");\n\t\tgoto xmitframe_coalesce_success;\n\t}\n\t//station mode doesn't need TX BIP, just ready the code\n\tif(bmcst)\n\t{\n\t\tint frame_body_len;\n\t\tu8 mic[16];\n\t\t\n\t\t_rtw_memset(MME, 0, _MME_IE_LENGTH_);\n\t\t\t\t\n\t\t//other types doesn't need the BIP\n\t\tif(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)\n\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\n\t\tMGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);\n\t\tpframe += pattrib->pktlen;\n\t\t\n\t\t//octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0\n\t\tMME[0]=padapter->securitypriv.dot11wBIPKeyid;\n\t\t//copy packet number\n\t\t_rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);\n\t\t//increase the packet number\n\t\tpmlmeext->mgnt_80211w_IPN++;\n\t\t\n\t\t//add MME IE with MIC all zero, MME string doesn't include element id and length\n\t\tpframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));\n\t\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\t// total frame length - header length\n\t\tframe_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);\n\t\t\n\t\t//conscruct AAD, copy frame control field\n\t\t_rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);\n\t\tClearRetry(BIP_AAD);\n\t\tClearPwrMgt(BIP_AAD);\n\t\tClearMData(BIP_AAD);\n\t\t//conscruct AAD, copy address 1 to address 3\n\t\t_rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);\n\t\t//copy management fram body\n\t\t_rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len);\n\t\t/*//dump total packet include MME with zero MIC\n\t\t{\n\t\t\tint i;\n\t\t\tprintk(\"Total packet: \");\n\t\t\tfor(i=0; i < BIP_AAD_SIZE+frame_body_len; i++)\n\t\t\t\tprintk(\" %02x \", BIP_AAD[i]);\n\t\t\tprintk(\"\\n\");\n\t\t}*/\n\t\t//calculate mic\n\t\tif(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey\n\t\t\t, BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic))\n\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\n\t\t/*//dump calculated mic result\n\t\t{\n\t\t\tint i;\n\t\t\tprintk(\"Calculated mic result: \");\n\t\t\tfor(i=0; i<16; i++)\n\t\t\t\tprintk(\" %02x \", mic[i]);\n\t\t\tprintk(\"\\n\");\n\t\t}*/\n\t\t//copy right BIP mic value, total is 128bits, we use the 0~63 bits\n\t\t_rtw_memcpy(pframe-8, mic, 8);\n\t\t/*/dump all packet after mic ok\n\t\t{\n\t\t\tint pp;\n\t\t\tprintk(\"pattrib->pktlen = %d \\n\", pattrib->pktlen);\n\t\t\tfor(pp=0;pp< pattrib->pktlen; pp++)\n\t\t\t\tprintk(\" %02x \", mem_start[pp]);\n\t\t\tprintk(\"\\n\");\n\t\t}*/\n\t}\n\telse //unicast mgmt frame TX\n\t{\n\t\t//start to encrypt mgmt frame\n\t\tif(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||\n\t\t\tsubtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION)\n\t\t{\n\t\t\tif (pattrib->psta)\n\t\t\t\tpsta = pattrib->psta;\n\t\t\telse\n\t\t\t{\n\t\t\t\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\t\t\t}\n\t\t\n\t\t\tif(psta==NULL)\n\t\t\t{\n\t\t\t\t\n\t\t\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\t}\n\t\t\n\t\t\tif (pxmitframe->buf_addr == NULL) {\n\t\t\t\tDBG_871X(\"%s, pxmitframe->buf_addr\\n\", __func__);\n\t\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\t}\n\t\t\t\n\t\t\t//DBG_871X(\"%s, action frame category=%d \\n\", __func__, pframe[WLAN_HDR_A3_LEN]);\n\t\t\t//according 802.11-2012 standard, these five types are not robust types\n\t\t\tif(subtype == WIFI_ACTION && \n\t\t\t(pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||\n\t\t\tpframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||\n\t\t\tpframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||\n\t\t\tpframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED  ||\n\t\t\tpframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))\n\t\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\t//before encrypt dump the management packet content\n\t\t\t/*{\n\t\t\t\tint i;\n\t\t\t\tprintk(\"Management pkt: \");\n\t\t\t\tfor(i=0; i<pattrib->pktlen; i++)\n\t\t\t\tprintk(\" %02x \", pframe[i]);\n\t\t\t\tprintk(\"=======\\n\");\n\t\t\t}*/\n\t\t\tif(pattrib->encrypt>0)\n\t\t\t\t_rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);\n\t\t\t\n\t\t\t/* To use wrong key */\n\t\t\tif (pattrib->key_type == IEEE80211W_WRONG_KEY) {\n\t\t\t\tDBG_871X(\"use wrong key\\n\");\n\t\t\t\tpattrib->dot118021x_UncstKey.skey[0] = 0xff;\n\t\t\t}\n\t\t\t\n\t\t\t//bakeup original management packet\n\t\t\t_rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);\n\t\t\t//move to data portion\n\t\t\tpframe += pattrib->hdrlen;\n\t\t\t\n\t\t\t//802.11w unicast management packet must be _AES_\n\t\t\tpattrib->iv_len = 8;\n\t\t\t//it's MIC of AES\n\t\t\tpattrib->icv_len = 8;\n\t\t\t\n\t\t\tswitch(pattrib->encrypt)\n\t\t\t{\n\t\t\t\tcase _AES_:\n\t\t\t\t\t\t//set AES IV header\n\t\t\t\t\t\tAES_IV(pattrib->iv, psta->dot11wtxpn, 0);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tgoto xmitframe_coalesce_fail;\n\t\t\t}\n\t\t\t//insert iv header into management frame\n\t\t\t_rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);\n\t\t\tpframe += pattrib->iv_len;\n\t\t\t//copy mgmt data portion after CCMP header\n\t\t\t_rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen);\n\t\t\t//move pframe to end of mgmt pkt\n\t\t\tpframe += pattrib->pktlen-pattrib->hdrlen;\n\t\t\t//add 8 bytes CCMP IV header to length\n\t\t\tpattrib->pktlen += pattrib->iv_len;\n\t\t\t/*//dump management packet include AES IV header\n\t\t\t{\n\t\t\t\tint i;\n\t\t\t\tprintk(\"Management pkt + IV: \");\n\t\t\t\t//for(i=0; i<pattrib->pktlen; i++)\n\t\t\t\t//printk(\" %02x \", mem_start[i]);\n\t\t\t\tprintk(\"@@@@@@@@@@@@@\\n\");\n\t\t\t}*/\n\t\t\t\n\t\t\tif ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {\n\t\t\t\t_rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len); \n\t\t\t\tpframe += pattrib->icv_len;\n\t\t\t}\n\t\t\t//add 8 bytes MIC\n\t\t\tpattrib->pktlen += pattrib->icv_len;\n\t\t\t//set final tx command size\n\t\t\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\t\t\t//set protected bit must be beofre SW encrypt\n\t\t\tSetPrivacy(mem_start);\n\t\t\t/*//dump management packet include AES header\n\t\t\t{\n\t\t\t\tint i;\n\t\t\t\tprintk(\"prepare to enc Management pkt + IV: \");\n\t\t\t\tfor(i=0; i<pattrib->pktlen; i++)\n\t\t\t\tprintk(\" %02x \", mem_start[i]);\n\t\t\t\tprintk(\"@@@@@@@@@@@@@\\n\");\n\t\t\t}*/\n\t\t\t//software encrypt\n\t\t\txmitframe_swencrypt(padapter, pxmitframe);\n\t\t}\n\t}\n\nxmitframe_coalesce_success:\n\t_exit_critical_bh(&padapter->security_key_mutex, &irqL);\n\trtw_mfree(BIP_AAD, ori_len);\n_func_exit_;\n\treturn _SUCCESS;\n\t\nxmitframe_coalesce_fail:\n\t_exit_critical_bh(&padapter->security_key_mutex, &irqL);\n\trtw_mfree(BIP_AAD, ori_len);\n_func_exit_;\n\n\treturn _FAIL;\n}\n#endif //CONFIG_IEEE80211W\n\n/* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header\n * IEEE LLC/SNAP header contains 8 octets\n * First 3 octets comprise the LLC portion\n * SNAP portion, 5 octets, is divided into two fields:\n *\tOrganizationally Unique Identifier(OUI), 3 octets,\n *\ttype, defined by that organization, 2 octets.\n */\ns32 rtw_put_snap(u8 *data, u16 h_proto)\n{\n\tstruct ieee80211_snap_hdr *snap;\n\tu8 *oui;\n\n_func_enter_;\n\n\tsnap = (struct ieee80211_snap_hdr *)data;\n\tsnap->dsap = 0xaa;\n\tsnap->ssap = 0xaa;\n\tsnap->ctrl = 0x03;\n\n\tif (h_proto == 0x8137 || h_proto == 0x80f3)\n\t\toui = P802_1H_OUI;\n\telse\n\t\toui = RFC1042_OUI;\n\t\n\tsnap->oui[0] = oui[0];\n\tsnap->oui[1] = oui[1];\n\tsnap->oui[2] = oui[2];\n\n\t*(u16 *)(data + SNAP_SIZE) = htons(h_proto);\n\n_func_exit_;\n\n\treturn SNAP_SIZE + sizeof(u16);\n}\n\nvoid rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)\n{\n\n\tuint\tprotection;\n\tu8\t*perp;\n\tsint\t erp_len;\n\tstruct\txmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct\tregistry_priv *pregistrypriv = &padapter->registrypriv;\n\t\n_func_enter_;\n\t\n\tswitch(pxmitpriv->vcs_setting)\n\t{\n\t\tcase DISABLE_VCS:\n\t\t\tpxmitpriv->vcs = NONE_VCS;\n\t\t\tbreak;\n\t\n\t\tcase ENABLE_VCS:\n\t\t\tbreak;\n\t\n\t\tcase AUTO_VCS:\n\t\tdefault:\n\t\t\tperp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);\n\t\t\tif(perp == NULL)\n\t\t\t{\n\t\t\t\tpxmitpriv->vcs = NONE_VCS;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tprotection = (*(perp + 2)) & BIT(1);\n\t\t\t\tif (protection)\n\t\t\t\t{\n\t\t\t\t\tif(pregistrypriv->vcs_type == RTS_CTS)\n\t\t\t\t\t\tpxmitpriv->vcs = RTS_CTS;\n\t\t\t\t\telse\n\t\t\t\t\t\tpxmitpriv->vcs = CTS_TO_SELF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tpxmitpriv->vcs = NONE_VCS;\n\t\t\t}\n\n\t\t\tbreak;\t\t\t\n\t\n\t}\n\n_func_exit_;\n\n}\n\nvoid rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz)\n{\n\tstruct sta_info *psta = NULL;\n\tstruct stainfo_stats *pstats = NULL;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tu8\tpkt_num = 1;\n\n\tif ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)\n\t{\n#if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpkt_num = pxmitframe->agg_num;\n#endif\n\t\tpmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pkt_num;\n\n\t\tpxmitpriv->tx_pkts += pkt_num;\n\n\t\tpxmitpriv->tx_bytes += sz;\n\n\t\tpsta = pxmitframe->attrib.psta;\n\t\tif (psta)\n\t\t{\n\t\t\tpstats = &psta->sta_stats;\n\n\t\t\tpstats->tx_pkts += pkt_num;\n\n\t\t\tpstats->tx_bytes += sz;\n#ifdef CONFIG_TDLS\n\t\t\tif(pxmitframe->attrib.ptdls_sta != NULL)\n\t\t\t{\n\t\t\t\tpstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);\n\t\t\t\tpstats->tx_pkts += pkt_num;\n\t\t\t\tpstats->tx_bytes += sz;\n\t\t\t}\n#endif //CONFIG_TDLS\n\t\t}\n\t\t\n#ifdef CONFIG_CHECK_LEAVE_LPS\n\t\t//traffic_check_for_leave_lps(padapter, _TRUE);\n#endif //CONFIG_LPS\n\t\t\n\t}\n}\n\nstatic struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,\n\t\tenum cmdbuf_type buf_type)\n{\n\tstruct xmit_buf *pxmitbuf =  NULL;\n\n_func_enter_;\n\n\tpxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];\n\tif (pxmitbuf !=  NULL) {\n\t\tpxmitbuf->priv_data = NULL;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n\t\tpxmitbuf->agg_num = 0;\n\t\tpxmitbuf->pg_num = 0;\n#endif\n#ifdef CONFIG_PCI_HCI\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->desc = NULL;\n#endif\n\n\t\tif (pxmitbuf->sctx) {\n\t\t\tDBG_871X(\"%s pxmitbuf->sctx is not NULL\\n\", __func__);\n\t\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);\n\t\t}\n\t} else {\n\t\tDBG_871X(\"%s fail, no xmitbuf available !!!\\n\", __func__);\n\t}\n\nexit:\n\n_func_exit_;\n\n\treturn pxmitbuf;\n}\n\nstruct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,\n\t\tenum cmdbuf_type buf_type)\n{\n\tstruct xmit_frame\t\t*pcmdframe;\n\tstruct xmit_buf\t\t*pxmitbuf;\n\n\tif ((pcmdframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)\n\t{\n\t\tDBG_871X(\"%s, alloc xmitframe fail\\n\", __FUNCTION__);\n\t\treturn NULL;\n\t}\n\n\tif ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {\n\t\tDBG_871X(\"%s, alloc xmitbuf fail\\n\", __FUNCTION__);\n\t\trtw_free_xmitframe(pxmitpriv, pcmdframe);\n\t\treturn NULL;\n\t}\n\n\tpcmdframe->frame_tag = MGNT_FRAMETAG;\n\n\tpcmdframe->pxmitbuf = pxmitbuf;\n\n\tpcmdframe->buf_addr = pxmitbuf->pbuf;\n\n\tpxmitbuf->priv_data = pcmdframe;\n\n\treturn pcmdframe;\n\n}\n\nstruct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)\n{\n\t_irqL irqL;\n\tstruct xmit_buf *pxmitbuf =  NULL;\n\t_list *plist, *phead;\n\t_queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;\n\n_func_enter_;\n\n\t_enter_critical(&pfree_queue->lock, &irqL);\n\n\tif(_rtw_queue_empty(pfree_queue) == _TRUE) {\n\t\tpxmitbuf = NULL;\n\t} else {\n\n\t\tphead = get_list_head(pfree_queue);\n\n\t\tplist = get_next(phead);\n\n\t\tpxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);\n\n\t\trtw_list_delete(&(pxmitbuf->list));\n\t}\n\n\tif (pxmitbuf !=  NULL)\n\t{\n\t\tpxmitpriv->free_xmit_extbuf_cnt--;\n\t\t#ifdef DBG_XMIT_BUF_EXT\n\t\tDBG_871X(\"DBG_XMIT_BUF_EXT ALLOC no=%d,  free_xmit_extbuf_cnt=%d\\n\",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);\n\t\t#endif\n\t\t\n\t\n\t\tpxmitbuf->priv_data = NULL;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n\t\tpxmitbuf->agg_num = 1;\n#endif\n#ifdef CONFIG_PCI_HCI\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->desc = NULL;\n#endif\n\n\t\tif (pxmitbuf->sctx) {\n\t\t\tDBG_871X(\"%s pxmitbuf->sctx is not NULL\\n\", __func__);\n\t\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);\n\t\t}\n\n\t}\n\n\t_exit_critical(&pfree_queue->lock, &irqL);\n\n_func_exit_;\n\n\treturn pxmitbuf;\n}\n\ns32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)\n{\n\t_irqL irqL;\n\t_queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;\n\n_func_enter_;\n\n\tif(pxmitbuf==NULL)\n\t{\n\t\treturn _FAIL;\n\t}\n\n\t_enter_critical(&pfree_queue->lock, &irqL);\n\n\trtw_list_delete(&pxmitbuf->list);\n\n\trtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));\n\tpxmitpriv->free_xmit_extbuf_cnt++;\n\t#ifdef DBG_XMIT_BUF_EXT\n\tDBG_871X(\"DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\\n\",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt);\n\t#endif\n\n\t_exit_critical(&pfree_queue->lock, &irqL);\n\n_func_exit_;\n\n\treturn _SUCCESS;\n} \n\nstruct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)\n{\n\t_irqL irqL;\n\tstruct xmit_buf *pxmitbuf =  NULL;\n\t_list *plist, *phead;\n\t_queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;\n\n_func_enter_;\n\n\t//DBG_871X(\"+rtw_alloc_xmitbuf\\n\");\n\n\t_enter_critical(&pfree_xmitbuf_queue->lock, &irqL);\n\n\tif(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) {\n\t\tpxmitbuf = NULL;\n\t} else {\n\n\t\tphead = get_list_head(pfree_xmitbuf_queue);\n\n\t\tplist = get_next(phead);\n\n\t\tpxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);\n\n\t\trtw_list_delete(&(pxmitbuf->list));\n\t}\n\n\tif (pxmitbuf !=  NULL)\n\t{\n\t\tpxmitpriv->free_xmitbuf_cnt--;\n\t\t#ifdef DBG_XMIT_BUF\n\t\tDBG_871X(\"DBG_XMIT_BUF ALLOC no=%d,  free_xmitbuf_cnt=%d\\n\",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);\n\t\t#endif\n\t\t//DBG_871X(\"alloc, free_xmitbuf_cnt=%d\\n\", pxmitpriv->free_xmitbuf_cnt);\n\n\t\tpxmitbuf->priv_data = NULL;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;\n\t\tpxmitbuf->agg_num = 0;\n\t\tpxmitbuf->pg_num = 0;\n#endif\n#ifdef CONFIG_PCI_HCI\n\t\tpxmitbuf->len = 0;\n\t\tpxmitbuf->desc = NULL;\n#endif\n\n\t\tif (pxmitbuf->sctx) {\n\t\t\tDBG_871X(\"%s pxmitbuf->sctx is not NULL\\n\", __func__);\n\t\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);\n\t\t}\n\t}\n\t#ifdef DBG_XMIT_BUF\n\telse\n\t{\n\t\tDBG_871X(\"DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\\n\");\n\t}\n\t#endif\n\n\t_exit_critical(&pfree_xmitbuf_queue->lock, &irqL);\n\n_func_exit_;\n\n\treturn pxmitbuf;\n}\n\ns32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)\n{\n\t_irqL irqL;\n\t_queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;\n\n_func_enter_;\n\n\t//DBG_871X(\"+rtw_free_xmitbuf\\n\");\n\n\tif(pxmitbuf==NULL)\n\t{\n\t\treturn _FAIL;\n\t}\n\n\tif (pxmitbuf->sctx) {\n\t\tDBG_871X(\"%s pxmitbuf->sctx is not NULL\\n\", __func__);\n\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);\n\t}\n\n\tif(pxmitbuf->buf_tag == XMITBUF_CMD) {\n\t}\n\telse if(pxmitbuf->buf_tag == XMITBUF_MGNT) {\n\t\trtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);\n\t}\n\telse\n\t{\n\t\t_enter_critical(&pfree_xmitbuf_queue->lock, &irqL);\n\n\t\trtw_list_delete(&pxmitbuf->list);\t\n\n\t\trtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));\n\n\t\tpxmitpriv->free_xmitbuf_cnt++;\n\t\t//DBG_871X(\"FREE, free_xmitbuf_cnt=%d\\n\", pxmitpriv->free_xmitbuf_cnt);\n\t\t#ifdef DBG_XMIT_BUF\n\t\tDBG_871X(\"DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\\n\",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt);\n\t\t#endif\n\t\t_exit_critical(&pfree_xmitbuf_queue->lock, &irqL);\n\t}\n\n_func_exit_;\t \n\n\treturn _SUCCESS;\t\n} \n\nvoid rtw_init_xmitframe(struct xmit_frame *pxframe)\n{\n\tif (pxframe !=  NULL)//default value setting\n\t{\n\t\tpxframe->buf_addr = NULL;\n\t\tpxframe->pxmitbuf = NULL;\n\n\t\t_rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));\n\t\t//pxframe->attrib.psta = NULL;\n\n\t\tpxframe->frame_tag = DATA_FRAMETAG;\n\n#ifdef CONFIG_USB_HCI\n\t\tpxframe->pkt = NULL;\n#ifdef USB_PACKET_OFFSET_SZ\n\t\tpxframe->pkt_offset = (PACKET_OFFSET_SZ/8);\n#else\n\t\tpxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc\n#endif\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\t\tpxframe->agg_num = 1;\n#endif\n\n#endif //#ifdef CONFIG_USB_HCI\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tpxframe->pg_num = 1;\n\t\tpxframe->agg_num = 1;\n#endif\n\n#ifdef CONFIG_XMIT_ACK\n\t\tpxframe->ack_report = 0;\n#endif\n\n\t}\n}\n\n/*\nCalling context:\n1. OS_TXENTRY\n2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)\n\nIf we turn on USE_RXTHREAD, then, no need for critical section.\nOtherwise, we must use _enter/_exit critical to protect free_xmit_queue...\n\nMust be very very cautious...\n\n*/\nstruct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue)\n{\n\t/*\n\t\tPlease remember to use all the osdep_service api,\n\t\tand lock/unlock or _enter/_exit critical to protect \n\t\tpfree_xmit_queue\n\t*/\n\n\t_irqL irqL;\n\tstruct xmit_frame *pxframe = NULL;\n\t_list *plist, *phead;\n\t_queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;\n\n_func_enter_;\n\n\t_enter_critical_bh(&pfree_xmit_queue->lock, &irqL);\n\n\tif (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_alloc_xmitframe:%d\\n\", pxmitpriv->free_xmitframe_cnt));\n\t\tpxframe =  NULL;\n\t} else {\n\t\tphead = get_list_head(pfree_xmit_queue);\n\n\t\tplist = get_next(phead);\n\n\t\tpxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);\n\n\t\trtw_list_delete(&(pxframe->list));\n\t\tpxmitpriv->free_xmitframe_cnt--;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, (\"rtw_alloc_xmitframe():free_xmitframe_cnt=%d\\n\", pxmitpriv->free_xmitframe_cnt));\n\t}\n\n\t_exit_critical_bh(&pfree_xmit_queue->lock, &irqL);\n\n\trtw_init_xmitframe(pxframe);\n\n_func_exit_;\n\n\treturn pxframe;\n}\n\nstruct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)\n{\n\t_irqL irqL;\n\tstruct xmit_frame *pxframe = NULL;\n\t_list *plist, *phead;\n\t_queue *queue = &pxmitpriv->free_xframe_ext_queue;\n\n_func_enter_;\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\tif (_rtw_queue_empty(queue) == _TRUE) {\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_alloc_xmitframe_ext:%d\\n\", pxmitpriv->free_xframe_ext_cnt));\n\t\tpxframe =  NULL;\n\t} else {\n\t\tphead = get_list_head(queue);\n\t\tplist = get_next(phead);\n\t\tpxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);\n\n\t\trtw_list_delete(&(pxframe->list));\n\t\tpxmitpriv->free_xframe_ext_cnt--;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, (\"rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\\n\", pxmitpriv->free_xframe_ext_cnt));\n\t}\n\n\t_exit_critical_bh(&queue->lock, &irqL);\n\n\trtw_init_xmitframe(pxframe);\n\n_func_exit_;\n\n\treturn pxframe;\n}\n\nstruct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)\n{\n\tstruct xmit_frame *pxframe = NULL;\n\tu8 *alloc_addr;\n\n\talloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);\n\t\n\tif (alloc_addr == NULL)\n\t\tgoto exit;\n\t\t\n\tpxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);\n\tpxframe->alloc_addr = alloc_addr;\n\n\tpxframe->padapter = pxmitpriv->adapter;\n\tpxframe->frame_tag = NULL_FRAMETAG;\n\n\tpxframe->pkt = NULL;\n\n\tpxframe->buf_addr = NULL;\n\tpxframe->pxmitbuf = NULL;\n\n\trtw_init_xmitframe(pxframe);\n\n\tDBG_871X(\"################## %s ##################\\n\", __func__);\n\nexit:\n\treturn pxframe;\n}\n\ns32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)\n{\t\n\t_irqL irqL;\n\t_queue *queue = NULL;\n\t_adapter *padapter = pxmitpriv->adapter;\n\t_pkt *pndis_pkt = NULL;\n\n_func_enter_;\t\n\n\tif (pxmitframe == NULL) {\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, (\"======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\\n\"));\n\t\tgoto exit;\n\t}\n\n\tif (pxmitframe->pkt){\n\t\tpndis_pkt = pxmitframe->pkt;\n\t\tpxmitframe->pkt = NULL;\n\t}\n\n\tif (pxmitframe->alloc_addr) {\n\t\tDBG_871X(\"################## %s with alloc_addr ##################\\n\", __func__);\n\t\trtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);\n\t\tgoto check_pkt_complete;\n\t}\n\n\tif (pxmitframe->ext_tag == 0)\n\t\tqueue = &pxmitpriv->free_xmit_queue;\n\telse if(pxmitframe->ext_tag == 1)\n\t\tqueue = &pxmitpriv->free_xframe_ext_queue;\n\telse\n\t\trtw_warn_on(1);\n\n\t_enter_critical_bh(&queue->lock, &irqL);\n\n\trtw_list_delete(&pxmitframe->list);\t\n\trtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));\n\tif (pxmitframe->ext_tag == 0) {\n\t\tpxmitpriv->free_xmitframe_cnt++;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, (\"rtw_free_xmitframe():free_xmitframe_cnt=%d\\n\", pxmitpriv->free_xmitframe_cnt));\n\t} else if(pxmitframe->ext_tag == 1) {\n\t\tpxmitpriv->free_xframe_ext_cnt++;\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, (\"rtw_free_xmitframe():free_xframe_ext_cnt=%d\\n\", pxmitpriv->free_xframe_ext_cnt));\n\t} else {\n\t}\n\n\t_exit_critical_bh(&queue->lock, &irqL);\n\ncheck_pkt_complete:\n\n\tif(pndis_pkt)\n\t\trtw_os_pkt_complete(padapter, pndis_pkt);\n\nexit:\n\n_func_exit_;\n\n\treturn _SUCCESS;\n}\n\nvoid rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)\n{\n\t_irqL irqL;\n\t_list\t*plist, *phead;\n\tstruct\txmit_frame \t*pxmitframe;\n\n_func_enter_;\t\n\n\t_enter_critical_bh(&(pframequeue->lock), &irqL);\n\n\tphead = get_list_head(pframequeue);\n\tplist = get_next(phead);\n\t\n\twhile (rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\n\t\t\t\n\t\tpxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);\n\n\t\tplist = get_next(plist); \n\t\t\n\t\trtw_free_xmitframe(pxmitpriv,pxmitframe);\n\t\t\t\n\t}\n\t_exit_critical_bh(&(pframequeue->lock), &irqL);\n\n_func_exit_;\n}\n\ns32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tDBG_COUNTER(padapter->tx_logs.core_tx_enqueue);\n\tif (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,\n\t\t\t (\"rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\\n\"));\n//\t\tpxmitframe->pkt = NULL;\n\t\treturn _FAIL;\n\t}\n\n\treturn _SUCCESS;\n}\n\nstatic struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)\n{\n\t_list\t*xmitframe_plist, *xmitframe_phead;\n\tstruct\txmit_frame\t*pxmitframe=NULL;\n\n\txmitframe_phead = get_list_head(pframe_queue);\n\txmitframe_plist = get_next(xmitframe_phead);\n\n\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t{\n\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\t/* xmitframe_plist = get_next(xmitframe_plist); */\n\n/*#ifdef RTK_DMP_PLATFORM\n#ifdef CONFIG_USB_TX_AGGREGATION\n\t\tif((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))\n\t\t{\n\t\t\tpxmitframe = NULL;\n\n\t\t\ttasklet_schedule(&pxmitpriv->xmit_tasklet);\n\n\t\t\tbreak;\n\t\t}\n#endif\n#endif*/\n\t\trtw_list_delete(&pxmitframe->list);\n\n\t\tptxservq->qcnt--;\n\n\t\t//rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending);\n\n\t\t//ptxservq->qcnt--;\n\n\t\tbreak;\t\t\n\n\t\t//pxmitframe = NULL;\n\n\t}\n\n\treturn pxmitframe;\n}\n\nstruct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)\n{\n\t_irqL irqL0;\n\t_list *sta_plist, *sta_phead;\n\tstruct hw_xmit *phwxmit;\n\tstruct tx_servq *ptxservq = NULL;\n\t_queue *pframe_queue = NULL;\n\tstruct xmit_frame *pxmitframe = NULL;\n\t_adapter *padapter = pxmitpriv->adapter;\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\tint i, inx[4];\n#ifdef CONFIG_USB_HCI\n//\tint j, tmp, acirp_cnt[4];\n#endif\n\n_func_enter_;\n\n\tinx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;\n\n\tif(pregpriv->wifi_spec==1)\n\t{\n\t\tint j, tmp, acirp_cnt[4];\n#if 0\n\t\tif(flags<XMIT_QUEUE_ENTRY)\n\t\t{\n\t\t\t//priority exchange according to the completed xmitbuf flags.\n\t\t\tinx[flags] = 0;\n\t\t\tinx[0] = flags;\n\t\t}\n#endif\t\n\t\n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)\n\t\tfor(j=0; j<4; j++)\n\t\t\tinx[j] = pxmitpriv->wmm_para_seq[j];\n#endif\n\t}\n\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL0);\n\n\tfor(i = 0; i < entry; i++) \n\t{\n\t\tphwxmit = phwxmit_i + inx[i];\n\n\t\t//_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0);\n\n\t\tsta_phead = get_list_head(phwxmit->sta_queue);\n\t\tsta_plist = get_next(sta_phead);\n\n\t\twhile ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE)\n\t\t{\n\n\t\t\tptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);\n\n\t\t\tpframe_queue = &ptxservq->sta_pending;\n\n\t\t\tpxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);\n\n\t\t\tif(pxmitframe)\n\t\t\t{\n\t\t\t\tphwxmit->accnt--;\n\n\t\t\t\t//Remove sta node when there is no pending packets.\n\t\t\t\tif(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break\n\t\t\t\t\trtw_list_delete(&ptxservq->tx_pending);\n\n\t\t\t\t//_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);\n\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\tsta_plist = get_next(sta_plist);\n\n\t\t}\n\n\t\t//_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);\n\n\t}\n\nexit:\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL0);\n\n_func_exit_;\n\n\treturn pxmitframe;\n}\n\n#if 1\nstruct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)\n{\n\tstruct tx_servq *ptxservq=NULL;\n\t\n_func_enter_;\t\n\n\tswitch (up) \n\t{\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tptxservq = &(psta->sta_xmitpriv.bk_q);\n\t\t\t*(ac) = 3;\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : BK \\n\"));\n\t\t\tbreak;\n\n\t\tcase 4:\n\t\tcase 5:\n\t\t\tptxservq = &(psta->sta_xmitpriv.vi_q);\n\t\t\t*(ac) = 1;\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : VI\\n\"));\n\t\t\tbreak;\n\n\t\tcase 6:\n\t\tcase 7:\n\t\t\tptxservq = &(psta->sta_xmitpriv.vo_q);\n\t\t\t*(ac) = 0;\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : VO \\n\"));\t\t\t\n\t\t\tbreak;\n\n\t\tcase 0:\n\t\tcase 3:\n\t\tdefault:\n\t\t\tptxservq = &(psta->sta_xmitpriv.be_q);\n\t\t\t*(ac) = 2;\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : BE \\n\"));\t\t\t\t\n\t\tbreak;\n\t\t\n\t}\n\n_func_exit_;\n\n\treturn ptxservq;\t\t\t\n}\n#else\n__inline static struct tx_servq *rtw_get_sta_pending\n\t(_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)\n{\n\tstruct tx_servq *ptxservq;\n\tstruct hw_xmit *phwxmits =  padapter->xmitpriv.hwxmits;\n\t\n_func_enter_;\t\n\n#ifdef CONFIG_RTL8711\n\n\tif(IS_MCAST(psta->hwaddr))\n\t{\n\t\tptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo\n\t\t*ppstapending = &padapter->xmitpriv.bm_pending; \n\t}\n\telse\n#endif\t\t\n\t{\n\t\tswitch (up) \n\t\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.bk_q);\n\t\t\t\t*ppstapending = &padapter->xmitpriv.bk_pending;\n\t\t\t\t(phwxmits+3)->accnt++;\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : BK \\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.vi_q);\n\t\t\t\t*ppstapending = &padapter->xmitpriv.vi_pending;\n\t\t\t\t(phwxmits+1)->accnt++;\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : VI\\n\"));\n\t\t\t\tbreak;\n\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.vo_q);\n\t\t\t\t*ppstapending = &padapter->xmitpriv.vo_pending;\n\t\t\t\t(phwxmits+0)->accnt++;\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : VO \\n\"));\t\t\t\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\tptxservq = &(psta->sta_xmitpriv.be_q);\n\t\t\t\t*ppstapending = &padapter->xmitpriv.be_pending;\n\t\t\t\t(phwxmits+2)->accnt++;\n\t\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"rtw_get_sta_pending : BE \\n\"));\t\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\t}\n\n\t}\n\n_func_exit_;\n\n\treturn ptxservq;\t\t\t\n}\n#endif\n\n/*\n * Will enqueue pxmitframe to the proper queue,\n * and indicate it to xx_pending list.....\n */\ns32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\t//_irqL irqL0;\n\tu8\tac_index;\n\tstruct sta_info\t*psta;\n\tstruct tx_servq\t*ptxservq;\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tstruct sta_priv\t*pstapriv = &padapter->stapriv;\n\tstruct hw_xmit\t*phwxmits =  padapter->xmitpriv.hwxmits;\n\tsint res = _SUCCESS;\n\n_func_enter_;\n\n\tDBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);\n\n/*\n\tif (pattrib->psta) {\n\t\tpsta = pattrib->psta;\t\t\n\t} else {\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tpsta = rtw_get_stainfo(pstapriv, pattrib->ra);\n\t}\n*/\t\n\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\tif(pattrib->psta != psta)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);\n\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\treturn _FAIL;\n\t}\n\n\tif (psta == NULL) {\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);\n\t\tres = _FAIL;\n\t\tDBG_8192C(\"rtw_xmit_classifier: psta == NULL\\n\");\n\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"rtw_xmit_classifier: psta == NULL\\n\"));\n\t\tgoto exit;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn _FAIL;\n\t}\n\n\tptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));\n\n\t//_enter_critical(&pstapending->lock, &irqL0);\n\n\tif (rtw_is_list_empty(&ptxservq->tx_pending)) {\n\t\trtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));\n\t}\n\n\t//_enter_critical(&ptxservq->sta_pending.lock, &irqL1);\n\n\trtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));\n\tptxservq->qcnt++;\n\tphwxmits[ac_index].accnt++;\n\n\t//_exit_critical(&ptxservq->sta_pending.lock, &irqL1);\n\n\t//_exit_critical(&pstapending->lock, &irqL0);\n\nexit:\n\n_func_exit_;\n\n\treturn res;\n}\n\nvoid rtw_alloc_hwxmits(_adapter *padapter)\n{\n\tstruct hw_xmit *hwxmits;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\tpxmitpriv->hwxmit_entry = HWXMIT_ENTRY;\n\n\tpxmitpriv->hwxmits = NULL;\n\n\tpxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);\t\n\n\tif(pxmitpriv->hwxmits == NULL)\n\t{\n\t\tDBG_871X(\"alloc hwxmits fail!...\\n\");\n\t\treturn;\n\t}\n\t\n\thwxmits = pxmitpriv->hwxmits;\n\n\tif(pxmitpriv->hwxmit_entry == 5)\n\t{\n\t\t//pxmitpriv->bmc_txqueue.head = 0;\n\t\t//hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;\n\t\thwxmits[0] .sta_queue = &pxmitpriv->bm_pending;\n\t\n\t\t//pxmitpriv->vo_txqueue.head = 0;\n\t\t//hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;\n\t\thwxmits[1] .sta_queue = &pxmitpriv->vo_pending;\n\n\t\t//pxmitpriv->vi_txqueue.head = 0;\n\t\t//hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;\n\t\thwxmits[2] .sta_queue = &pxmitpriv->vi_pending;\n\t\n\t\t//pxmitpriv->bk_txqueue.head = 0;\n\t\t//hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;\n\t\thwxmits[3] .sta_queue = &pxmitpriv->bk_pending;\n\n      \t\t//pxmitpriv->be_txqueue.head = 0;\n\t\t//hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;\n\t\thwxmits[4] .sta_queue = &pxmitpriv->be_pending;\n\t\t\n\t}\t\n\telse if(pxmitpriv->hwxmit_entry == 4)\n\t{\n\n\t\t//pxmitpriv->vo_txqueue.head = 0;\n\t\t//hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;\n\t\thwxmits[0] .sta_queue = &pxmitpriv->vo_pending;\n\n\t\t//pxmitpriv->vi_txqueue.head = 0;\n\t\t//hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;\n\t\thwxmits[1] .sta_queue = &pxmitpriv->vi_pending;\n\n\t\t//pxmitpriv->be_txqueue.head = 0;\n\t\t//hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;\n\t\thwxmits[2] .sta_queue = &pxmitpriv->be_pending;\n\t\n\t\t//pxmitpriv->bk_txqueue.head = 0;\n\t\t//hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;\n\t\thwxmits[3] .sta_queue = &pxmitpriv->bk_pending;\n\t}\n\telse\n\t{\n\t\t\n\n\t}\n\t\n\n}\n\nvoid rtw_free_hwxmits(_adapter *padapter)\n{\n\tstruct hw_xmit *hwxmits;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\thwxmits = pxmitpriv->hwxmits;\n\tif(hwxmits)\n\t\trtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry));\n}\n\nvoid rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)\n{\n\tsint i;\n_func_enter_;\t\n\tfor(i = 0; i < entry; i++, phwxmit++)\n\t{\n\t\t//_rtw_spinlock_init(&phwxmit->xmit_lock);\n\t\t//_rtw_init_listhead(&phwxmit->pending);\t\t\n\t\t//phwxmit->txcmdcnt = 0;\n\t\tphwxmit->accnt = 0;\n\t}\n_func_exit_;\t\n}\n\n#ifdef CONFIG_BR_EXT\nint rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)\n{\n\tstruct sk_buff *skb = *pskb;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\t_irqL irqL;\n\t//if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)\n\t{\n\t\tvoid dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);\n\t\tint res, is_vlan_tag=0, i, do_nat25=1;\n\t\tunsigned short vlan_hdr=0;\n\t\tvoid *br_port = NULL;\n\n\t\t//mac_clone_handle_frame(priv, skb);\n\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\tbr_port = padapter->pnetdev->br_port;\n#else   // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\trcu_read_lock();\n\t\tbr_port = rcu_dereference(padapter->pnetdev->rx_handler_data);\n\t\trcu_read_unlock();\n#endif  // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\t_enter_critical_bh(&padapter->br_ext_lock, &irqL);\n\t\tif (\t!(skb->data[0] & 1) &&\n\t\t\t\tbr_port &&\n\t\t\t\tmemcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&\n\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&\n\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&\n\t\t\t\t!memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {\n\t\t\tmemcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);\n\t\t\tpadapter->scdb_entry->ageing_timer = jiffies;\n\t\t\t_exit_critical_bh(&padapter->br_ext_lock, &irqL);\n\t\t}\n\t\telse\n\t\t//if (!priv->pmib->ethBrExtInfo.nat25_disable) \t\t\n\t\t{\n//\t\t\tif (priv->dev->br_port &&\n//\t\t\t\t !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) {\n#if 1\n\t\t\tif (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {\n\t\t\t\tis_vlan_tag = 1;\n\t\t\t\tvlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));\n\t\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));\n\t\t\t\tskb_pull(skb, 4);\n\t\t\t}\n\t\t\t//if SA == br_mac && skb== IP  => copy SIP to br_ip ?? why\n\t\t\tif (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&\n\t\t\t\t(*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))\n\t\t\t\tmemcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);\n\n\t\t\tif (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {\n\t\t\t\tif (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {\n\t\t\t\t\tvoid *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);\n\t\t\t\t\t\n\t\t\t\t\tif ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,\n\t\t\t\t\t\t\t\tskb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) {\n\t\t\t\t\t\tmemcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);\n\t\t\t\t\t\tmemcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);\n\t\t\t\t\t\tpadapter->scdb_entry->ageing_timer = jiffies;\n\t\t\t\t\t\tdo_nat25 = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (padapter->scdb_entry) {\n\t\t\t\t\t\tpadapter->scdb_entry->ageing_timer = jiffies;\n\t\t\t\t\t\tdo_nat25 = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tmemset(padapter->scdb_mac, 0, MACADDRLEN);\n\t\t\t\t\t\tmemset(padapter->scdb_ip, 0, 4);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t_exit_critical_bh(&padapter->br_ext_lock, &irqL);\n#endif // 1\n\t\t\tif (do_nat25)\n\t\t\t{\n\t\t\t\tint nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);\n\t\t\t\tif (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {\n\t\t\t\t\tstruct sk_buff *newskb;\n\n\t\t\t\t\tif (is_vlan_tag) {\n\t\t\t\t\t\tskb_push(skb, 4);\n\t\t\t\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t\t\t\t*((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));\n\t\t\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);\n\t\t\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewskb = rtw_skb_copy(skb);\n\t\t\t\t\tif (newskb == NULL) {\n\t\t\t\t\t\t//priv->ext_stats.tx_drops++;\n\t\t\t\t\t\tDEBUG_ERR(\"TX DROP: rtw_skb_copy fail!\\n\");\n\t\t\t\t\t\t//goto stop_proc;\n\t\t\t\t\t\treturn -1;\n\t\t\t\t\t}\n\t\t\t\t\trtw_skb_free(skb);\n\n\t\t\t\t\t*pskb = skb = newskb;\n\t\t\t\t\tif (is_vlan_tag) {\n\t\t\t\t\t\tvlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));\n\t\t\t\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));\n\t\t\t\t\t\tskb_pull(skb, 4);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (skb_is_nonlinear(skb))\n\t\t\t\t\tDEBUG_ERR(\"%s(): skb_is_nonlinear!!\\n\", __FUNCTION__);\n\t\t\t\t\t\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))\n\t\t\t\tres = skb_linearize(skb, GFP_ATOMIC);\n#else\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))\n\t\t\t\tres = skb_linearize(skb);\n#endif\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))\n\t\t\t\tif (res < 0) {\t\t\t\t\n\t\t\t\t\t\tDEBUG_ERR(\"TX DROP: skb_linearize fail!\\n\");\n\t\t\t\t\t\t//goto free_and_stop;\n\t\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tres = nat25_db_handle(padapter, skb, NAT25_INSERT);\n\t\t\t\tif (res < 0) {\n\t\t\t\t\tif (res == -2) {\n\t\t\t\t\t\t//priv->ext_stats.tx_drops++;\n\t\t\t\t\t\tDEBUG_ERR(\"TX DROP: nat25_db_handle fail!\\n\");\n\t\t\t\t\t\t//goto free_and_stop;\n\t\t\t\t\t\treturn -1;\n\n\t\t\t\t\t}\n\t\t\t\t\t// we just print warning message and let it go\n\t\t\t\t\t//DEBUG_WARN(\"%s()-%d: nat25_db_handle INSERT Warning!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\t\t//return -1; // return -1 will cause system crash on 2011/08/30!\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmemcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);\n\n\t\t\tdhcp_flag_bcast(padapter, skb);\n\n\t\t\tif (is_vlan_tag) {\n\t\t\t\tskb_push(skb, 4);\n\t\t\t\tfor (i=0; i<6; i++)\n\t\t\t\t\t*((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));\n\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);\n\t\t\t\t*((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;\n\t\t\t}\n\t\t}\n#if 0\t\t\n\t\telse{\n\t\t\tif (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {\n\t\t\t\tis_vlan_tag = 1;\n\t\t\t}\n\t\t\t\t\n\t\t\tif(is_vlan_tag){\n\t\t\t\tif(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){\n                                        memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\tif(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){\n                                        memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);\n\t\t\t\t}\n\t\t\t}\t\n\t\t}\n#endif\t// 0\n\n\t\t// check if SA is equal to our MAC\n\t\tif (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {\n\t\t\t//priv->ext_stats.tx_drops++;\n\t\t\tDEBUG_ERR(\"TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\\n\",\n\t\t\t\tskb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]);\n\t\t\t//goto free_and_stop;\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn 0;\n}\n#endif\t// CONFIG_BR_EXT\n\nu32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)\n{\n\tu32 addr;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\t\n\t\n\tswitch(pattrib->qsel)\n\t{\n\t\tcase 0:\n\t\tcase 3:\n\t\t\taddr = BE_QUEUE_INX;\n\t\t \tbreak;\n\t\tcase 1:\n\t\tcase 2:\n\t\t\taddr = BK_QUEUE_INX;\n\t\t\tbreak;\t\t\t\t\n\t\tcase 4:\n\t\tcase 5:\n\t\t\taddr = VI_QUEUE_INX;\n\t\t\tbreak;\t\t\n\t\tcase 6:\n\t\tcase 7:\n\t\t\taddr = VO_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase 0x10:\n\t\t\taddr = BCN_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase 0x11://BC/MC in PS (HIQ)\n\t\t\taddr = HIGH_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase 0x12:\n\t\tdefault:\n\t\t\taddr = MGT_QUEUE_INX;\n\t\t\tbreak;\t\t\n\t\t\t\n\t}\n\n\treturn addr;\n\n}\n\nstatic void do_queue_select(_adapter\t*padapter, struct pkt_attrib *pattrib)\n{\n\tu8 qsel;\n\t\t\n\tqsel = pattrib->priority;\n\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"### do_queue_select priority=%d ,qsel = %d\\n\",pattrib->priority ,qsel));\n\n#ifdef CONFIG_CONCURRENT_MODE\t\n//\tif (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)\n//\t\tqsel = 7;//\n#endif\n\t\n\tpattrib->qsel = qsel;\n}\n\n/*\n * The main transmit(tx) entry\n *\n * Return\n *\t1\tenqueue\n *\t0\tsuccess, hardware will handle this xmit frame(packet)\n *\t<0\tfail\n */\ns32 rtw_xmit(_adapter *padapter, _pkt **ppkt)\n{\n\tstatic u32 start = 0;\n\tstatic u32 drop_cnt = 0;\n#ifdef CONFIG_AP_MODE\n\t_irqL irqL0;\n#endif\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct xmit_frame *pxmitframe = NULL;\n#ifdef CONFIG_BR_EXT\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tvoid *br_port = NULL;\n#endif\t// CONFIG_BR_EXT\n\n\ts32 res;\n\n\tDBG_COUNTER(padapter->tx_logs.core_tx);\n\n\tif (start == 0)\n\t\tstart = rtw_get_current_time();\n\n\tpxmitframe = rtw_alloc_xmitframe(pxmitpriv);\n\n\tif (rtw_get_passing_time_ms(start) > 2000) {\n\t\tif (drop_cnt)\n\t\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\\n\", __FUNCTION__, drop_cnt);\n\t\tstart = rtw_get_current_time();\n\t\tdrop_cnt = 0;\n\t}\n\n\tif (pxmitframe == NULL) {\n\t\tdrop_cnt ++;\n\t\tRT_TRACE(_module_xmit_osdep_c_, _drv_err_, (\"rtw_xmit: no more pxmitframe\\n\"));\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);\n\t\treturn -1;\n\t}\n\n#ifdef CONFIG_BR_EXT\n\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\tbr_port = padapter->pnetdev->br_port;\n#else   // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\trcu_read_lock();\n\tbr_port = rcu_dereference(padapter->pnetdev->rx_handler_data);\n\trcu_read_unlock();\n#endif  // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\n\tif( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)\n\t{\n\t\tres = rtw_br_client_tx(padapter, ppkt);\n\t\tif (res == -1)\n\t\t{\n\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);\n\t\t\treturn -1;\n\t\t}\n\t}\t\n\n#endif\t// CONFIG_BR_EXT\n\n\tres = update_attrib(padapter, *ppkt, &pxmitframe->attrib);\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif(pxmitframe->attrib.ether_type != 0x88B4)\n\t{\n\t\tif(rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra))\n\t\t{\n\t\t\tWAPI_TRACE(WAPI_RX,\"drop for key absend when tx \\n\");\n\t\t\tres = _FAIL;\n\t\t}\n\t}\n#endif\n\tif (res == _FAIL) {\n\t\tRT_TRACE(_module_xmit_osdep_c_, _drv_err_, (\"rtw_xmit: update attrib fail\\n\"));\n\t\t#ifdef DBG_TX_DROP_FRAME\n\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s update attrib fail\\n\", __FUNCTION__);\n\t\t#endif\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\treturn -1;\n\t}\n\tpxmitframe->pkt = *ppkt;\n\n\trtw_led_control(padapter, LED_CTL_TX);\n\n\tdo_queue_select(padapter, &pxmitframe->attrib);\n\n#ifdef CONFIG_AP_MODE\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL0);\n\tif(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)\n\t{\n\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL0);\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);\n\t\treturn 1;\t\t\n\t}\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL0);\n#endif\n\n\t//pre_xmitframe\n\tif (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)\n\t\treturn 1;\n\n\treturn 0;\n}\n\n#ifdef CONFIG_TDLS\nsint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tsint ret=_FALSE;\n\n\t_irqL irqL;\n\tstruct sta_info *ptdls_sta=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tint i;\n\t\n\tptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);\n\tif(ptdls_sta==NULL){\n\t\treturn ret;\n\t}else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){\n\n\t\tif(pattrib->triggered==1)\n\t\t{\n\t\t\tret = _TRUE;\n\t\t\treturn ret;\n\t\t}\n\n\t\t_enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);\t\n\t\t\n\t\tif(ptdls_sta->state&WIFI_SLEEP_STATE)\n\t\t{\n\t\t\trtw_list_delete(&pxmitframe->list);\n\t\t\n\t\t\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\t\t\n\t\t\trtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));\n\t\t\t\n\t\t\tptdls_sta->sleepq_len++;\n\t\t\tptdls_sta->sleepq_ac_len++;\n\n\t\t\t//indicate 4-AC queue bit in TDLS peer traffic indication\n\t\t\tswitch(pattrib->priority)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tptdls_sta->uapsd_bk |= BIT(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\tptdls_sta->uapsd_vi |= BIT(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\tcase 7:\n\t\t\t\t\tptdls_sta->uapsd_vo |= BIT(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\tcase 3:\n\t\t\t\tdefault:\n\t\t\t\t\tptdls_sta->uapsd_be |= BIT(1);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* Transmit TDLS PTI via AP */\n\t\t\tif(ptdls_sta->sleepq_len==1)\n\t\t\t\trtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI);\n\n\t\t\tret = _TRUE;\n\t\t}\n\n\t\t_exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);\t\n\t}\n\n\treturn ret;\n\t\n}\n#endif //CONFIG_TDLS\n\n#define RTW_HIQ_FILTER_ALLOW_ALL 0\n#define RTW_HIQ_FILTER_ALLOW_SPECIAL 1\n#define RTW_HIQ_FILTER_DENY_ALL 2\n\ninline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)\n{\n\tbool allow = _FALSE;\n\t_adapter *adapter = xmitframe->padapter;\n\tstruct registry_priv *registry = &adapter->registrypriv;\n\nif (rtw_get_intf_type(adapter) != RTW_PCIE) {\n\n\tif (adapter->registrypriv.wifi_spec == 1) {\n\t\tallow = _TRUE;\n\t} else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {\n\t\n\t\tstruct pkt_attrib *attrib = &xmitframe->attrib;\n\n\t\tif (attrib->ether_type == 0x0806\n\t\t\t|| attrib->ether_type == 0x888e\n\t\t\t#ifdef CONFIG_WAPI_SUPPORT\n\t\t\t|| attrib->ether_type == 0x88B4\n\t\t\t#endif\n\t\t\t|| attrib->dhcp_pkt\n\t\t) {\n\t\t\tif (0)\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" ether_type:0x%04x%s\\n\", FUNC_ADPT_ARG(xmitframe->padapter)\n\t\t\t\t\t, attrib->ether_type, attrib->dhcp_pkt?\" DHCP\":\"\");\n\t\t\tallow = _TRUE;\n\t\t}\n\t}\n\telse if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {\n\t\tallow = _TRUE;\n\t}\n\telse if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {\n\t}\n\telse {\n\t\trtw_warn_on(1);\n\t}\n}\n\treturn allow;\n}\n\n#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)\n\nsint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\t_irqL irqL;\n\tsint ret=_FALSE;\n\tstruct sta_info *psta=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tsint bmcst = IS_MCAST(pattrib->ra);\n\tbool update_tim = _FALSE;\n#ifdef CONFIG_TDLS\n\n\tif( padapter->tdlsinfo.link_established == _TRUE )\n\t{\n\t\tret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);\n\t}\n#endif //CONFIG_TDLS\n\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);\n\t    return ret;\n\t}\n/*\n\tif(pattrib->psta)\n\t{\n\t\tpsta = pattrib->psta;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s, call rtw_get_stainfo()\\n\", __func__);\n\t\tpsta=rtw_get_stainfo(pstapriv, pattrib->ra);\n\t}\n*/\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);\n\tif(pattrib->psta != psta)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);\n\t\tDBG_871X(\"%s, pattrib->psta(%p) != psta(%p)\\n\", __func__, pattrib->psta, psta);\n\t\treturn _FALSE;\n\t}\n\n\tif(psta==NULL)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);\n\t\tDBG_871X(\"%s, psta==NUL\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\tif(!(psta->state &_FW_LINKED))\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);\n\t\tDBG_871X(\"%s, psta->state(0x%x) != _FW_LINKED\\n\", __func__, psta->state);\n\t\treturn _FALSE;\n\t}\n\n\tif(pattrib->triggered==1)\n\t{\n\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);\n\t\t//DBG_871X(\"directly xmit pspoll_triggered packet\\n\");\n\n\t\t//pattrib->triggered=0;\n\t\tif (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)\n\t\t\tpattrib->qsel = QSLT_HIGH;//HIQ\n\n\t\treturn ret;\n\t}\n\n\n\tif(bmcst)\n\t{\n\t\t_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\n\t\tif(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode\n\t\t{\n\t\t\t//pattrib->qsel = QSLT_HIGH;//HIQ\n\t\t\t\n\t\t\trtw_list_delete(&pxmitframe->list);\n\t\t\t\n\t\t\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\t\t\n\t\t\trtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));\n\t\t\t\n\t\t\tpsta->sleepq_len++;\n\n\t\t\tif (!(pstapriv->tim_bitmap & BIT(0)))\n\t\t\t\tupdate_tim = _TRUE;\n\n\t\t\tpstapriv->tim_bitmap |= BIT(0);//\n\t\t\tpstapriv->sta_dz_bitmap |= BIT(0);\n\n\t\t\t//DBG_871X(\"enqueue, sq_len=%d, tim=%x\\n\", psta->sleepq_len, pstapriv->tim_bitmap);\n\t\t\tif (padapter->registrypriv.wifi_spec == 1) {\n\t\t\t\t/*\n\t\t\t\t*if (update_tim == _TRUE)\n\t\t\t\t*\trtw_chk_hi_queue_cmd(padapter);\n\t\t\t\t*/\n\t\t\t} else {\n\n\t\t\t\tif (update_tim == _TRUE) {\n\t\t\t\t\tif (is_broadcast_mac_addr(pattrib->ra))\n\t\t\t\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"buffer BC\");\n\t\t\t\t\telse\n\t\t\t\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"buffer MC\");\n\t\t\t\t} else {\n\t\t\t\t\tchk_bmc_sleepq_cmd(padapter);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\t\t\t\t\n\t\t\t\n\t\t\tret = _TRUE;\t\t\t\n\n\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);\n\t\t\t\n\t\t}\n\t\t\n\t\t_exit_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\t\n\t\treturn ret;\n\t\t\n\t}\n\t\n\n\t_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\n\tif(psta->state&WIFI_SLEEP_STATE)\n\t{\n\t\tu8 wmmps_ac=0;\n\t\n\t\tif(pstapriv->sta_dz_bitmap&BIT(psta->aid))\t\n\t\t{\t\t\t\n\t\t\trtw_list_delete(&pxmitframe->list);\n\t\t\n\t\t\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t\t\t\n\t\t\trtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));\n\t\t\t\n\t\t\tpsta->sleepq_len++;\n\n\t\t\tswitch(pattrib->priority)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\twmmps_ac = psta->uapsd_bk&BIT(0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\twmmps_ac = psta->uapsd_vi&BIT(0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\tcase 7:\n\t\t\t\t\twmmps_ac = psta->uapsd_vo&BIT(0);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\tcase 3:\n\t\t\t\tdefault:\n\t\t\t\t\twmmps_ac = psta->uapsd_be&BIT(0);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(wmmps_ac)\n\t\t\t\tpsta->sleepq_ac_len++;\n\n\t\t\tif(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))\n\t\t\t{\n\t\t\t\tif (!(pstapriv->tim_bitmap & BIT(psta->aid)))\n\t\t\t\t\tupdate_tim = _TRUE;\n\n\t\t\t\tpstapriv->tim_bitmap |= BIT(psta->aid);\n\n\t\t\t\t//DBG_871X(\"enqueue, sq_len=%d, tim=%x\\n\", psta->sleepq_len, pstapriv->tim_bitmap);\n\n\t\t\t\tif(update_tim == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t//DBG_871X(\"sleepq_len==1, update BCNTIM\\n\");\n\t\t\t\t\t//upate BCN for TIM IE\n\t\t\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"buffer UC\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\t\t\t\n\n\t\t\t//if(psta->sleepq_len > (NR_XMITFRAME>>3))\n\t\t\t//{\n\t\t\t//\twakeup_sta_to_xmit(padapter, psta);\n\t\t\t//}\t\n\n\t\t\tret = _TRUE;\n\n\t\t\tDBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);\n\t\t}\n\n\t}\n\n\t_exit_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\n\treturn ret;\n\t\n}\n\nstatic void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)\n{\n\tsint ret;\n\t_list\t*plist, *phead;\n\tu8\tac_index;\n\tstruct tx_servq\t*ptxservq;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct xmit_frame \t*pxmitframe;\n\tstruct hw_xmit *phwxmits =  padapter->xmitpriv.hwxmits;\n\t\n\tphead = get_list_head(pframequeue);\n\tplist = get_next(phead);\n\t\n\twhile (rtw_end_of_queue_search(phead, plist) == _FALSE)\n\t{\t\t\t\n\t\tpxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);\n\n\t\tplist = get_next(plist);\n\t\t\n\t\tpattrib = &pxmitframe->attrib;\n\n\t\tpattrib->triggered = 0;\n  \t\t\n\t\tret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);\t\n\n\t\tif(_TRUE == ret)\n\t\t{\n\t\t\tptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));\n\n\t\t\tptxservq->qcnt--;\n\t\t\tphwxmits[ac_index].accnt--;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//DBG_871X(\"xmitframe_enqueue_for_sleeping_sta return _FALSE\\n\");\n\t\t}\n\t\t\n\t}\n\t\n}\n\nvoid stop_sta_xmit(_adapter *padapter, struct sta_info *psta)\n{\t\n\t_irqL irqL0;\t\n\tstruct sta_info *psta_bmc;\n\tstruct sta_xmit_priv *pstaxmitpriv;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\t\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\t\n\t\n\tpstaxmitpriv = &psta->sta_xmitpriv;\n\n\t//for BC/MC Frames\n\tpsta_bmc = rtw_get_bcmc_stainfo(padapter);\n\t\n\t\t\t\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL0);\n\n\tpsta->state |= WIFI_SLEEP_STATE;\n\t\n#ifdef CONFIG_TDLS\n\tif( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )\n#endif //CONFIG_TDLS\n\tpstapriv->sta_dz_bitmap |= BIT(psta->aid);\n\t\n\t\n\n\tdequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));\n\n\n\tdequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));\n\n\n\tdequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));\n\t\n\n\tdequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));\n\n#ifdef CONFIG_TDLS\n\tif (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) {\n#endif //CONFIG_TDLS\n\n\n\t//for BC/MC Frames\n\tpstaxmitpriv = &psta_bmc->sta_xmitpriv;\n\tdequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);\n\trtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));\n\t\n\n#ifdef CONFIG_TDLS\t\n\t\t}\n#endif //CONFIG_TDLS\t\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL0);\n\t\n\n}\t\n\nvoid wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)\n{\t \n\t_irqL irqL;\t \n\tu8 update_mask=0, wmmps_ac=0;\n\tstruct sta_info *psta_bmc;\n\t_list\t*xmitframe_plist, *xmitframe_phead;\n\tstruct xmit_frame *pxmitframe=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\tpsta_bmc = rtw_get_bcmc_stainfo(padapter);\n\t\n\n\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\txmitframe_phead = get_list_head(&psta->sleep_q);\n\txmitframe_plist = get_next(xmitframe_phead);\n\n\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t{\n\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\trtw_list_delete(&pxmitframe->list);\n\n\t\tswitch(pxmitframe->attrib.priority)\n\t\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\twmmps_ac = psta->uapsd_bk&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\twmmps_ac = psta->uapsd_vi&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\twmmps_ac = psta->uapsd_vo&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\twmmps_ac = psta->uapsd_be&BIT(1);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tpsta->sleepq_len--;\n\t\tif(psta->sleepq_len>0)\n\t\t\tpxmitframe->attrib.mdata = 1;\n\t\telse\n\t\t\tpxmitframe->attrib.mdata = 0;\n\n\t\tif(wmmps_ac)\n\t\t{\n\t\t\tpsta->sleepq_ac_len--;\n\t\t\tif(psta->sleepq_ac_len>0)\n\t\t\t{\n\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\t\tpxmitframe->attrib.eosp = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpxmitframe->attrib.mdata = 0;\n\t\t\t\tpxmitframe->attrib.eosp = 1;\n\t\t\t}\n\t\t}\n\n\t\tpxmitframe->attrib.triggered = 1;\n\n/*\n\t\t_exit_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\tif(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)\n\t\t{\n\t\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\t\t}\n\t\t_enter_critical_bh(&psta->sleep_q.lock, &irqL);\n*/\n\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\n\n\t}\n\n\tif(psta->sleepq_len==0)\n\t{\n#ifdef CONFIG_TDLS\n\t\tif( psta->tdls_sta_state & TDLS_LINKED_STATE )\n\t\t{\n\t\t\tif(psta->state&WIFI_SLEEP_STATE)\n\t\t\t\tpsta->state ^= WIFI_SLEEP_STATE;\n\n\t\t\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\t\t\treturn;\n\t\t}\n#endif //CONFIG_TDLS\n\n\t\tif (pstapriv->tim_bitmap & BIT(psta->aid)) {\n\t\t\t//DBG_871X(\"wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\\n\", pstapriv->tim_bitmap);\n\t\t\t//upate BCN for TIM IE\n\t\t\t//update_BCNTIM(padapter);\n\t\t\tupdate_mask = BIT(0);\n\t\t}\n\n\t\tpstapriv->tim_bitmap &= ~BIT(psta->aid);\n\n\t\tif(psta->state&WIFI_SLEEP_STATE)\n\t\t\tpsta->state ^= WIFI_SLEEP_STATE;\n\n\t\tif(psta->state & WIFI_STA_ALIVE_CHK_STATE)\n\t\t{\n\t\t\tDBG_871X(\"%s alive check\\n\", __func__);\n\t\t\tpsta->expire_to = pstapriv->expire_to;\n\t\t\tpsta->state ^= WIFI_STA_ALIVE_CHK_STATE;\n\t\t}\n\n\t\tpstapriv->sta_dz_bitmap &= ~BIT(psta->aid);\n\t}\n\n\t//for BC/MC Frames\n\tif(!psta_bmc)\n\t\tgoto _exit;\n\n\tif((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode\n\t{\n\t\txmitframe_phead = get_list_head(&psta_bmc->sleep_q);\n\t\txmitframe_plist = get_next(xmitframe_phead);\n\n\t\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t\t{\n\t\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\t\trtw_list_delete(&pxmitframe->list);\n\n\t\t\tpsta_bmc->sleepq_len--;\n\t\t\tif(psta_bmc->sleepq_len>0)\n\t\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\telse\n\t\t\t\tpxmitframe->attrib.mdata = 0;\n\n\n\t\t\tpxmitframe->attrib.triggered = 1;\n/*\n\t\t\t_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\t\t\tif(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)\n\t\t\t{\n\t\t\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\t\t\t}\n\t\t\t_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\n\n*/\n\t\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\n\t\t}\n\n\t\tif(psta_bmc->sleepq_len==0)\n\t\t{\n\t\t\tif (pstapriv->tim_bitmap & BIT(0)) {\n\t\t\t\t//DBG_871X(\"wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\\n\", pstapriv->tim_bitmap);\n\t\t\t\t//upate BCN for TIM IE\n\t\t\t\t//update_BCNTIM(padapter);\n\t\t\t\tupdate_mask |= BIT(1);\n\t\t\t}\n\t\t\tpstapriv->tim_bitmap &= ~BIT(0);\n\t\t\tpstapriv->sta_dz_bitmap &= ~BIT(0);\n\t\t}\n\n\t}\t\n\n_exit:\n\n\t//_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);\t\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tif(update_mask)\n\t{\n\t\t//update_BCNTIM(padapter);\n\t\tif ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))\n\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"clear UC&BMC\");\n\t\telse if ((update_mask & BIT(1)) == BIT(1))\n\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"clear BMC\");\n\t\telse\n\t\t\t_update_beacon(padapter, _TIM_IE_, NULL, _TRUE, \"clear UC\");\n\t}\n\t\n}\n\nvoid xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)\n{\n\t_irqL irqL;\n\tu8 wmmps_ac=0;\n\t_list\t*xmitframe_plist, *xmitframe_phead;\n\tstruct xmit_frame *pxmitframe=NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\n\t//_enter_critical_bh(&psta->sleep_q.lock, &irqL);\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\txmitframe_phead = get_list_head(&psta->sleep_q);\n\txmitframe_plist = get_next(xmitframe_phead);\n\n\twhile ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)\n\t{\t\t\t\n\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\n\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\tswitch(pxmitframe->attrib.priority)\n\t\t{\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\twmmps_ac = psta->uapsd_bk&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\twmmps_ac = psta->uapsd_vi&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\twmmps_ac = psta->uapsd_vo&BIT(1);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tcase 3:\n\t\t\tdefault:\n\t\t\t\twmmps_ac = psta->uapsd_be&BIT(1);\n\t\t\t\tbreak;\t\n\t\t}\n\t\t\n\t\tif(!wmmps_ac)\n\t\t\tcontinue;\n\n\t\trtw_list_delete(&pxmitframe->list);\n\n\t\tpsta->sleepq_len--;\n\t\tpsta->sleepq_ac_len--;\n\n\t\tif(psta->sleepq_ac_len>0)\n\t\t{\n\t\t\tpxmitframe->attrib.mdata = 1;\n\t\t\tpxmitframe->attrib.eosp = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpxmitframe->attrib.mdata = 0;\n\t\t\tpxmitframe->attrib.eosp = 1;\n\t\t}\n\n\t\tpxmitframe->attrib.triggered = 1;\n\t\trtw_hal_xmitframe_enqueue(padapter, pxmitframe);\n\n\t\tif((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))\n\t\t{\n#ifdef CONFIG_TDLS\n\t\t\tif(psta->tdls_sta_state & TDLS_LINKED_STATE )\n\t\t\t{\n\t\t\t\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\n\t\t\t\tgoto exit;\n\t\t\t}\n#endif //CONFIG_TDLS\n\t\t\tpstapriv->tim_bitmap &= ~BIT(psta->aid);\n\n\t\t\t//DBG_871X(\"wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\\n\", pstapriv->tim_bitmap);\n\t\t\t//upate BCN for TIM IE\n\t\t\t//update_BCNTIM(padapter);\n\t\t\tupdate_beacon(padapter, _TIM_IE_, NULL, _TRUE);\n\t\t\t//update_mask = BIT(0);\n\t\t}\n\t\n\t}\t\n\nexit:\n\t//_exit_critical_bh(&psta->sleep_q.lock, &irqL);\t\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n\treturn;\n}\n\n#endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */\n\n#ifdef CONFIG_XMIT_THREAD_MODE\nvoid enqueue_pending_xmitbuf(\n\tstruct xmit_priv *pxmitpriv,\n\tstruct xmit_buf *pxmitbuf)\n{\n\t_irqL irql;\n\t_queue *pqueue;\n\t_adapter *pri_adapter = pxmitpriv->adapter;\n\n\tpqueue = &pxmitpriv->pending_xmitbuf_queue;\n\n\t_enter_critical_bh(&pqueue->lock, &irql);\n\trtw_list_delete(&pxmitbuf->list);\n\trtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue));\n\t_exit_critical_bh(&pqueue->lock, &irql);\n\n\n\n#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE)\n\tif (pri_adapter->adapter_type > PRIMARY_ADAPTER)\n\t\tpri_adapter = pri_adapter->pbuddy_adapter;\n#endif  //SDIO_HCI + CONCURRENT\n\t_rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema));\n\n}\n\nvoid enqueue_pending_xmitbuf_to_head(\n\tstruct xmit_priv *pxmitpriv,\n\tstruct xmit_buf *pxmitbuf)\n{\n\t_irqL irql;\n\t_queue *pqueue;\n\t_adapter *pri_adapter = pxmitpriv->adapter;\n\n\tpqueue = &pxmitpriv->pending_xmitbuf_queue;\n\n\t_enter_critical_bh(&pqueue->lock, &irql);\n\trtw_list_delete(&pxmitbuf->list);\n\trtw_list_insert_head(&pxmitbuf->list, get_list_head(pqueue));\n\t_exit_critical_bh(&pqueue->lock, &irql);\n}\n\nstruct xmit_buf* dequeue_pending_xmitbuf(\n\tstruct xmit_priv *pxmitpriv)\n{\n\t_irqL irql;\n\tstruct xmit_buf *pxmitbuf;\n\t_queue *pqueue;\n\n\n\tpxmitbuf = NULL;\n\tpqueue = &pxmitpriv->pending_xmitbuf_queue;\n\n\t_enter_critical_bh(&pqueue->lock, &irql);\n\n\tif (_rtw_queue_empty(pqueue) == _FALSE)\n\t{\n\t\t_list *plist, *phead;\n\n\t\tphead = get_list_head(pqueue);\n\t\tplist = get_next(phead);\n\t\tpxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);\n\t\trtw_list_delete(&pxmitbuf->list);\n\t}\n\n\t_exit_critical_bh(&pqueue->lock, &irql);\n\n\treturn pxmitbuf;\n}\n\nstruct xmit_buf* dequeue_pending_xmitbuf_under_survey(\n\tstruct xmit_priv *pxmitpriv)\n{\n\t_irqL irql;\n\tstruct xmit_buf *pxmitbuf;\n#ifdef CONFIG_USB_HCI\t\n\tstruct xmit_frame *pxmitframe;\n#endif \n\t_queue *pqueue;\n\n\n\tpxmitbuf = NULL;\n\tpqueue = &pxmitpriv->pending_xmitbuf_queue;\n\n\t_enter_critical_bh(&pqueue->lock, &irql);\n\n\tif (_rtw_queue_empty(pqueue) == _FALSE)\n\t{\n\t\t_list *plist, *phead;\n\t\tu8 type;\n\n\t\tphead = get_list_head(pqueue);\n\t\tplist = phead;\n\t\tdo {\n\t\t\tplist = get_next(plist);\n\t\t\t\tif (plist == phead) break;\n\t\t\t\n\t\t\tpxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);\n\n#ifdef CONFIG_USB_HCI\n\t\t\tpxmitframe = (struct xmit_frame*)pxmitbuf->priv_data;\n\t\t\tif(pxmitframe)\n\t\t\t{\n\t\t\t\ttype = GetFrameSubType(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, !!!ERROR!!! For USB, TODO ITEM \\n\", __FUNCTION__);\n\t\t\t}\n#else\n\t\t\ttype = GetFrameSubType(pxmitbuf->pbuf + TXDESC_OFFSET);\n#endif\n\n\t\t\tif ((type == WIFI_PROBEREQ) ||\n\t\t\t\t(type == WIFI_DATA_NULL) ||\n\t\t\t\t(type == WIFI_QOS_DATA_NULL))\n\t\t\t{\n\t\t\t\trtw_list_delete(&pxmitbuf->list);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpxmitbuf = NULL;\n\t\t} while (1);\n\t}\n\n\t_exit_critical_bh(&pqueue->lock, &irql);\n\n\treturn pxmitbuf;\n}\n\nsint check_pending_xmitbuf(\n\tstruct xmit_priv *pxmitpriv)\n{\n\t_irqL irql;\n\t_queue *pqueue;\n\tsint\tret = _FALSE;\n\n\tpqueue = &pxmitpriv->pending_xmitbuf_queue;\n\n\t_enter_critical_bh(&pqueue->lock, &irql);\n\n\tif(_rtw_queue_empty(pqueue) == _FALSE)\n\t\tret = _TRUE;\n\n\t_exit_critical_bh(&pqueue->lock, &irql);\n\n\treturn ret;\n}\n\nthread_return rtw_xmit_thread(thread_context context)\n{\n\ts32 err;\n\tPADAPTER padapter;\n\n\n\terr = _SUCCESS;\n\tpadapter = (PADAPTER)context;\n\n\tthread_enter(\"RTW_XMIT_THREAD\");\n\n\tdo {\n\t\terr = rtw_hal_xmit_thread_handler(padapter);\n\t\tflush_signals_thread();\n\t} while (_SUCCESS == err);\n\n\t_rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);\n\n\tthread_exit();\n}\n#endif\n\nbool rtw_xmit_ac_blocked(_adapter *adapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\t_adapter *iface;\n\tstruct mlme_ext_priv *mlmeext;\n\tstruct mlme_ext_info *mlmeextinfo;\n\tbool blocked = _FALSE;\n\tint i;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tiface = dvobj->padapters[i];\n\t\tmlmeext = &iface->mlmeextpriv;\n\n\t\t/* check scan state */\n\t\tif (mlmeext_scan_state(mlmeext) != SCAN_DISABLE\n\t\t\t&& mlmeext_scan_state(mlmeext) != SCAN_BACK_OP\n\t\t) {\n\t\t\tblocked = _TRUE;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (mlmeext_scan_state(mlmeext) == SCAN_BACK_OP\n\t\t\t&& !mlmeext_chk_scan_backop_flags(mlmeext, SS_BACKOP_TX_RESUME)\n\t\t) {\n\t\t\tblocked = _TRUE;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\nexit:\n\treturn blocked;\n}\n\nvoid rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)\n{\n\tsctx->timeout_ms = timeout_ms;\n\tsctx->submit_time= rtw_get_current_time();\n#ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */\n\tinit_completion(&sctx->done);\n#endif\n\tsctx->status = RTW_SCTX_SUBMITTED;\n}\n\nint rtw_sctx_wait(struct submit_ctx *sctx, const char *msg)\n{\n\tint ret = _FAIL;\n\tunsigned long expire; \n\tint status = 0;\n\n#ifdef PLATFORM_LINUX\n\texpire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;\n\tif (!wait_for_completion_timeout(&sctx->done, expire)) {\n\t\t/* timeout, do something?? */\n\t\tstatus = RTW_SCTX_DONE_TIMEOUT;\n\t\tDBG_871X(\"%s timeout: %s\\n\", __func__, msg);\n\t} else {\n\t\tstatus = sctx->status;\n\t}\n#endif\n\n\tif (status == RTW_SCTX_DONE_SUCCESS) {\n\t\tret = _SUCCESS;\n\t}\n\n\treturn ret;\n}\n\nbool rtw_sctx_chk_waring_status(int status)\n{\n\tswitch(status) {\n\tcase RTW_SCTX_DONE_UNKNOWN:\n\tcase RTW_SCTX_DONE_BUF_ALLOC:\n\tcase RTW_SCTX_DONE_BUF_FREE:\n\n\tcase RTW_SCTX_DONE_DRV_STOP:\n\tcase RTW_SCTX_DONE_DEV_REMOVE:\n\t\treturn _TRUE;\n\tdefault:\n\t\treturn _FALSE;\n\t}\n}\n\nvoid rtw_sctx_done_err(struct submit_ctx **sctx, int status)\n{\n\tif (*sctx) {\n\t\tif (rtw_sctx_chk_waring_status(status))\n\t\t\tDBG_871X(\"%s status:%d\\n\", __func__, status);\n\t\t(*sctx)->status = status;\n\t\t#ifdef PLATFORM_LINUX\n\t\tcomplete(&((*sctx)->done));\n\t\t#endif\n\t\t*sctx = NULL;\n\t}\n}\n\nvoid rtw_sctx_done(struct submit_ctx **sctx)\n{\n\trtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);\n}\n\n#ifdef CONFIG_XMIT_ACK\n\n#ifdef CONFIG_XMIT_ACK_POLLING\ns32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter);\n\n/**\n * rtw_ack_tx_polling -\n * @pxmitpriv: xmit_priv to address ack_tx_ops\n * @timeout_ms: timeout msec\n *\n * Init ack_tx_ops and then do c2h_evt_hdl() and polling ack_tx_ops repeatedly\n * till tx report or timeout\n * Returns: _SUCCESS if TX report ok, _FAIL for others\n */\nint rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms)\n{\n\tint ret = _FAIL;\n\tstruct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;\n\t_adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv);\n\n\tpack_tx_ops->submit_time = rtw_get_current_time();\n\tpack_tx_ops->timeout_ms = timeout_ms;\n\tpack_tx_ops->status = RTW_SCTX_SUBMITTED;\n\n\tdo {\n\t\tc2h_evt_hdl(adapter, NULL, rtw_hal_c2h_id_filter_ccx(adapter));\n\t\tif (pack_tx_ops->status != RTW_SCTX_SUBMITTED)\n\t\t\tbreak;\n\n\t\tif (rtw_is_drv_stopped(adapter)) {\n\t\t\tpack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP;\n\t\t\tbreak;\n\t\t}\n\t\tif (rtw_is_surprise_removed(adapter)) {\n\t\t\tpack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE;\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\trtw_msleep_os(10);\n\t} while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms);\n\n\tif (pack_tx_ops->status == RTW_SCTX_SUBMITTED) {\n\t\tpack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT;\n\t\tDBG_871X(\"%s timeout\\n\", __func__);\n\t}\n\n\tif (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS)\n\t\tret = _SUCCESS;\n\n\treturn ret;\n}\n#endif\n\nint rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)\n{\n#ifdef CONFIG_XMIT_ACK_POLLING\n\treturn rtw_ack_tx_polling(pxmitpriv, timeout_ms);\n#else\n\tstruct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;\n\n\tpack_tx_ops->submit_time = rtw_get_current_time();\n\tpack_tx_ops->timeout_ms = timeout_ms;\n\tpack_tx_ops->status = RTW_SCTX_SUBMITTED;\n\n\treturn rtw_sctx_wait(pack_tx_ops, __func__);\n#endif\n}\n\nvoid rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)\n{\n\tstruct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;\n\t\n\tif (pxmitpriv->ack_tx) {\n\t\trtw_sctx_done_err(&pack_tx_ops, status);\n\t} else {\n\t\tDBG_871X(\"%s ack_tx not set\\n\", __func__);\n\t}\n}\n#endif //CONFIG_XMIT_ACK\n\n"
  },
  {
    "path": "dkms.conf",
    "content": "MAKE=\"'make' all KVER=${kernelver}\"\nCLEAN=\"'make' clean\"\nBUILT_MODULE_NAME=\"8814au\"\nBUILT_MODULE_LOCATION=.\nPACKAGE_NAME=rtl8814au\nPACKAGE_VERSION=4.3.21\nREMAKE_INITRD=yes\nDEST_MODULE_LOCATION=\"/updates/dkms\"\nAUTOINSTALL=yes\n"
  },
  {
    "path": "hal/HalPwrSeqCmd.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*++\nCopyright (c) Realtek Semiconductor Corp. All rights reserved.\n\nModule Name:\n\tHalPwrSeqCmd.c\n\nAbstract:\n\tImplement HW Power sequence configuration CMD handling routine for Realtek devices.\n\nMajor Change History:\n\tWhen       Who               What\n\t---------- ---------------   -------------------------------\n\t2011-10-26 Lucas            Modify to be compatible with SD4-CE driver.\n\t2011-07-07 Roger            Create.\n\n--*/\n#include <HalPwrSeqCmd.h>\n\n\n//\n//\tDescription:\n//\t\tThis routine deal with the Power Configuration CMDs parsing for RTL8723/RTL8188E Series IC.\n//\n//\tAssumption:\n//\t\tWe should follow specific format which was released from HW SD.\n//\n//\t2011.07.07, added by Roger.\n//\nu8 HalPwrSeqCmdParsing(\n\tPADAPTER\t\tpadapter,\n\tu8\t\t\t\tCutVersion,\n\tu8\t\t\t\tFabVersion,\n\tu8\t\t\t\tInterfaceType,\n\tWLAN_PWR_CFG\tPwrSeqCmd[])\n{\n\tWLAN_PWR_CFG \tPwrCfgCmd = {0};\n\tu8\t\t\t\tbPollingBit = _FALSE;\n\tu32\t\t\t\tAryIdx = 0;\n\tu8\t\t\t\tvalue = 0;\n\tu32\t\t\t\toffset = 0;\n\tu32\t\t\t\tpollingCount = 0; // polling autoload done.\n\tu32\t\t\t\tmaxPollingCnt = 5000;\n\n\tdo {\n\t\tPwrCfgCmd = PwrSeqCmd[AryIdx];\n\n\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_,\n\t\t\t\t (\"HalPwrSeqCmdParsing: offset(%#x) cut_msk(%#x) fab_msk(%#x) interface_msk(%#x) base(%#x) cmd(%#x) msk(%#x) value(%#x)\\n\",\n\t\t\t\t\tGET_PWR_CFG_OFFSET(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_CUT_MASK(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_FAB_MASK(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_INTF_MASK(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_BASE(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_CMD(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_MASK(PwrCfgCmd),\n\t\t\t\t\tGET_PWR_CFG_VALUE(PwrCfgCmd)));\n\n\t\t//2 Only Handle the command whose FAB, CUT, and Interface are matched\n\t\tif ((GET_PWR_CFG_FAB_MASK(PwrCfgCmd) & FabVersion) &&\n\t\t\t(GET_PWR_CFG_CUT_MASK(PwrCfgCmd) & CutVersion) &&\n\t\t\t(GET_PWR_CFG_INTF_MASK(PwrCfgCmd) & InterfaceType))\n\t\t{\n\t\t\tswitch (GET_PWR_CFG_CMD(PwrCfgCmd))\n\t\t\t{\n\t\t\t\tcase PWR_CMD_READ:\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_, (\"HalPwrSeqCmdParsing: PWR_CMD_READ\\n\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PWR_CMD_WRITE:\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_, (\"HalPwrSeqCmdParsing: PWR_CMD_WRITE\\n\"));\n\t\t\t\t\toffset = GET_PWR_CFG_OFFSET(PwrCfgCmd);\n\n#ifdef CONFIG_SDIO_HCI\n\t\t\t\t\t//\n\t\t\t\t\t// <Roger_Notes> We should deal with interface specific address mapping for some interfaces, e.g., SDIO interface\n\t\t\t\t\t// 2011.07.07.\n\t\t\t\t\t//\n\t\t\t\t\tif (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Read Back SDIO Local value\n\t\t\t\t\t\tvalue = SdioLocalCmd52Read1Byte(padapter, offset);\n\n\t\t\t\t\t\tvalue &= ~(GET_PWR_CFG_MASK(PwrCfgCmd));\n\t\t\t\t\t\tvalue |= (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd));\n\n\t\t\t\t\t\t// Write Back SDIO Local value\n\t\t\t\t\t\tSdioLocalCmd52Write1Byte(padapter, offset, value);\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif\n\t\t\t\t\t{\n#ifdef CONFIG_GSPI_HCI\n\t\t\t\t\t\tif (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)\n\t\t\t\t\t\t\toffset = SPI_LOCAL_OFFSET | offset;\n#endif\n\t\t\t\t\t\t// Read the value from system register\n\t\t\t\t\t\tvalue = rtw_read8(padapter, offset);\n\n\t\t\t\t\t\tvalue=value&(~(GET_PWR_CFG_MASK(PwrCfgCmd)));\n\t\t\t\t\t\tvalue=value|(GET_PWR_CFG_VALUE(PwrCfgCmd)&GET_PWR_CFG_MASK(PwrCfgCmd));\n\n\t\t\t\t\t\t// Write the value back to sytem register\n\t\t\t\t\t\trtw_write8(padapter, offset, value);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PWR_CMD_POLLING:\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_, (\"HalPwrSeqCmdParsing: PWR_CMD_POLLING\\n\"));\n\n\t\t\t\t\tbPollingBit = _FALSE;\n\t\t\t\t\toffset = GET_PWR_CFG_OFFSET(PwrCfgCmd);\n#ifdef CONFIG_GSPI_HCI\n\t\t\t\t\tif (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)\n\t\t\t\t\t\toffset = SPI_LOCAL_OFFSET | offset;\n#endif\n\t\t\t\t\tdo {\n#ifdef CONFIG_SDIO_HCI\n\t\t\t\t\t\tif (GET_PWR_CFG_BASE(PwrCfgCmd) == PWR_BASEADDR_SDIO)\n\t\t\t\t\t\t\tvalue = SdioLocalCmd52Read1Byte(padapter, offset);\n\t\t\t\t\t\telse\n#endif\n\t\t\t\t\t\t\tvalue = rtw_read8(padapter, offset);\n\n\t\t\t\t\t\tvalue=value&GET_PWR_CFG_MASK(PwrCfgCmd);\n\t\t\t\t\t\tif (value == (GET_PWR_CFG_VALUE(PwrCfgCmd) & GET_PWR_CFG_MASK(PwrCfgCmd)))\n\t\t\t\t\t\t\tbPollingBit = _TRUE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\trtw_udelay_os(10);\n\n\t\t\t\t\t\tif (pollingCount++ > maxPollingCnt) {\n\t\t\t\t\t\t\tDBG_871X_LEVEL(_drv_err_, \"HalPwrSeqCmdParsing: Fail to polling Offset[%#x]=%02x\\n\", offset, value);\n\t\t\t\t\t\t\treturn _FALSE;\n\t\t\t\t\t\t}\n\t\t\t\t\t} while (!bPollingBit);\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PWR_CMD_DELAY:\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_, (\"HalPwrSeqCmdParsing: PWR_CMD_DELAY\\n\"));\n\t\t\t\t\tif (GET_PWR_CFG_VALUE(PwrCfgCmd) == PWRSEQ_DELAY_US)\n\t\t\t\t\t\trtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd));\n\t\t\t\t\telse\n\t\t\t\t\t\trtw_udelay_os(GET_PWR_CFG_OFFSET(PwrCfgCmd)*1000);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase PWR_CMD_END:\n\t\t\t\t\t// When this command is parsed, end the process\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_info_, (\"HalPwrSeqCmdParsing: PWR_CMD_END\\n\"));\n\t\t\t\t\treturn _TRUE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tRT_TRACE(_module_hal_init_c_ , _drv_err_, (\"HalPwrSeqCmdParsing: Unknown CMD!!\\n\"));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tAryIdx++;//Add Array Index\n\t}while(1);\n\n\treturn _TRUE;\n}\n\n\n"
  },
  {
    "path": "hal/btc/HalBtc8188c2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 92CE/92CU BT 1 Antenna Co-exist mechanism\n//\n// By cosa 02/11/2011\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8188c2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8188C_2ANT\tGLCoexDm8188c2Ant;\nstatic PCOEX_DM_8188C_2ANT \tpCoexDm=&GLCoexDm8188c2Ant;\nstatic COEX_STA_8188C_2ANT\tGLCoexSta8188c2Ant;\nstatic PCOEX_STA_8188C_2ANT\tpCoexSta=&GLCoexSta8188c2Ant;\n\n//============================================================\n// local function start with btdm_\n//============================================================\nu1Byte\nhalbtc8188c2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8188C_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nu1Byte\nhalbtc8188c2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tu1Byte\t\t\t\talgorithm=BT_8188C_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\t\n\tif(!pStackInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No profile exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pStackInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\n\tif(pStackInfo->bScoExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO algorithm\\n\"));\n\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_SCO;\n\t}\n\telse\n\t{\n\t\tif(numOfDiffProfile == 1)\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN only\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_PAN;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_HID_PAN;\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8188C_2ANT_COEX_ALGO_PAN_A2DP;\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn algorithm;\n}\n\nVOID\nhalbtc8188c2ant_SetFwBalance(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbBalanceOn,\n\tIN\tu1Byte\t\t\tms0,\n\tIN\tu1Byte\t\t\tms1\n\t)\n{\n\tu1Byte\tH2C_Parameter[3] ={0};\n\n\tif(bBalanceOn)\n\t{\n\t\tH2C_Parameter[2] = 1;\n\t\tH2C_Parameter[1] = ms1;\n\t\tH2C_Parameter[0] = ms0;\n\t}\n\telse\n\t{\n\t\tH2C_Parameter[2] = 0;\n\t\tH2C_Parameter[1] = 0;\n\t\tH2C_Parameter[0] = 0;\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\\n\", \n\t\tbBalanceOn?\"ON\":\"OFF\", ms0, ms1,\n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0xc, 3, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8188c2ant_Balance(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbBalanceOn,\n\tIN\tu1Byte\t\t\tms0,\n\tIN\tu1Byte\t\t\tms1\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Balance %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bBalanceOn? \"ON\":\"OFF\")));\n\tpCoexDm->bCurBalanceOn = bBalanceOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBalanceOn == pCoexDm->bCurBalanceOn)\n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetFwBalance(pBtCoexist, bBalanceOn, ms0, ms1);\n\n\tpCoexDm->bPreBalanceOn = pCoexDm->bCurBalanceOn;\n}\n\nVOID\nhalbtc8188c2ant_SetFwDiminishWifi(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN \t\tbDacOn,\n\tIN\tBOOLEAN \t\tbInterruptOn,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl,\n\tIN\tBOOLEAN \t\tbNavOn\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\n\tif((pBtCoexist->stackInfo.minBtRssi <= -5) && (fwDacSwingLvl == 0x20))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\\n\"));\n\t\tfwDacSwingLvl = 0x18;\n\t}\n\n\tH2C_Parameter[2] = 0;\n\tH2C_Parameter[1] = fwDacSwingLvl;\n\tH2C_Parameter[0] = 0;\n\tif(bDacOn)\n\t{\n\t\tH2C_Parameter[2] |= 0x01;\t//BIT0\n\t\tif(bInterruptOn)\n\t\t{\n\t\t\tH2C_Parameter[2] |= 0x02;\t//BIT1\n\t\t}\n\t}\n\tif(bNavOn)\n\t{\n\t\tH2C_Parameter[2] |= 0x08;\t//BIT3\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0xe=0x%x\\n\", \n\t\t(bDacOn?\"ON\":\"OFF\"), (bInterruptOn?\"ON\":\"OFF\"), (bNavOn?\"ON\":\"OFF\"),\n\t\t(H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])));\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0xe, 3, H2C_Parameter);\n}\n\nVOID\nhalbtc8188c2ant_DiminishWifi(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacOn,\n\tIN\tBOOLEAN\t\t\tbInterruptOn,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl,\n\tIN\tBOOLEAN\t\t\tbNavOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bDacOn? \"ON\":\"OFF\"), (bInterruptOn? \"ON\":\"OFF\"), fwDacSwingLvl, (bNavOn? \"ON\":\"OFF\")));\n\n\tpCoexDm->bCurDacOn = bDacOn;\n\tpCoexDm->bCurInterruptOn = bInterruptOn;\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\tpCoexDm->bCurNavOn = bNavOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacOn==pCoexDm->bCurDacOn) &&\n\t\t\t(pCoexDm->bPreInterruptOn==pCoexDm->bCurInterruptOn) &&\n\t\t\t(pCoexDm->preFwDacSwingLvl==pCoexDm->curFwDacSwingLvl) &&\n\t\t\t(pCoexDm->bPreNavOn==pCoexDm->bCurNavOn) )\n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetFwDiminishWifi(pBtCoexist, bDacOn, bInterruptOn, fwDacSwingLvl, bNavOn);\n\n\tpCoexDm->bPreDacOn = pCoexDm->bCurDacOn;\n\tpCoexDm->bPreInterruptOn = pCoexDm->bCurInterruptOn;\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n\tpCoexDm->bPreNavOn = pCoexDm->bCurNavOn;\n}\n\nVOID\nhalbtc8188c2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xf0, 0xf);\t\t\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xf0, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8188c2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8188c2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8188c2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8188c2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tu4Byte\tdacSwingLvl;\n\n\tif(bSwDacSwingOn)\n\t{\t\t\n\t\tif((pBtCoexist->stackInfo.minBtRssi <= -5) && (swDacSwingLvl == 0x20))\n\t\t{\n\t\t\tdacSwingLvl = 0x18;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdacSwingLvl = swDacSwingLvl;\n\t\t}\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xfc000000, dacSwingLvl);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xfc000000, 0x30);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8188c2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8188c2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8188c2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4e1c0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4d1d0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4c1e0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4b1f0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4a200001);\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xdc000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x90000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x51000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x12000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x00255);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x641c0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x631d0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x621e0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x611f0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x60200001);\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x32000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x71000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xb0000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xfc000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x10255);\n\t}\n\n\t// set rssiAdjustVal for wifi module.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\n\nVOID\nhalbtc8188c2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8188c2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu4Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8188c2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu4Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8188c2ant_SetCoexTable(pBtCoexist, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8188c2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw mechanism\n\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t// sw mechanism\n\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\nVOID\nhalbtc8188c2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\n\nVOID\nhalbtc8188c2ant_MonitorBtState(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tstateChange=FALSE;\n\tu4Byte \t\t\tBT_Polling, Ratio_Act, Ratio_STA;\n\tu4Byte \t\t\tBT_Active, BT_State;\n\tu4Byte\t\t\tregBTActive=0, regBTState=0, regBTPolling=0;\n\tu4Byte\t\t\tbtBusyThresh=0;\n\tu4Byte\t\t\tfwVer=0;\n\tstatic BOOLEAN\tbBtBusyTraffic=FALSE;\n\tBOOLEAN\t\t\tbRejApAggPkt=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FirmwareVersion = 0x%x(%d)\\n\", fwVer, fwVer));\n\tif(fwVer < 62)\n\t{\n\t\tregBTActive = 0x488;\n\t\tregBTState = 0x48c;\n\t\tregBTPolling = 0x490;\n\t}\n\telse\n\t{\n\t\tregBTActive = 0x444;\n\t\tregBTState = 0x448;\n\t\tif(fwVer >= 74)\n\t\t\tregBTPolling = 0x44c;\n\t\telse\n\t\t\tregBTPolling = 0x700;\n\t}\n\tbtBusyThresh = 60;\n\t\n\tBT_Active = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTActive);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_Active(0x%x)=0x%x\\n\", regBTActive, BT_Active));\n\tBT_Active = BT_Active & 0x00ffffff;\n\n\tBT_State = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTState);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_State(0x%x)=0x%x\\n\", regBTState, BT_State));\n\tBT_State = BT_State & 0x00ffffff;\n\n\tBT_Polling = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTPolling);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_Polling(0x%x)=0x%x\\n\", regBTPolling, BT_Polling));\n\n\tif(BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )\n\t\treturn;\n\n\t// 2011/05/04 MH For Slim combo test meet a problem. Surprise remove and WLAN is running\n\t// DHCP process. At the same time, the register read value might be zero. And cause BSOD 0x7f\n\t// EXCEPTION_DIVIDED_BY_ZERO. In This case, the stack content may always be wrong due to \n\t// HW divide trap.\n\tif (BT_Polling==0)\n\t\treturn;\n\t\n\tRatio_Act = BT_Active*1000/BT_Polling;\n\tRatio_STA = BT_State*1000/BT_Polling;\n\t\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ratio_Act=%d\\n\", Ratio_Act));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ratio_STA=%d\\n\", Ratio_STA));\n\n\tif(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\tif(Ratio_STA < 60)\t// BT PAN idle\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Check if BT PAN (under BT 2.1) is uplink or downlink\n\t\t\tif((Ratio_Act/Ratio_STA) < 2)\n\t\t\t{\t// BT PAN Uplink\n\t\t\t\tpCoexSta->bBtUplink = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\t// BT PAN downlink\n\t\t\t\tpCoexSta->bBtUplink = FALSE;\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\t// Check BT is idle or not\n\tif(!pBtCoexist->stackInfo.bBtLinkExist)\n\t{\n\t\tpCoexSta->bBtBusy = FALSE;\n\t}\n\telse\n\t{\n\t\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t\t{\n\t\t\tif(Ratio_Act<20)\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = TRUE;\n\t\t\t}\n\t\t}\n\t\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t\t{\n\t\t\tif(Ratio_STA < btBusyThresh)\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = TRUE;\n\t\t\t}\n\n\t\t\tif( (Ratio_STA < btBusyThresh) ||\n\t\t\t\t(Ratio_Act<180 && Ratio_STA<130) )\n\t\t\t{\n\t\t\t\tpCoexSta->bA2dpBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bA2dpBusy = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &pCoexSta->bBtBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &pCoexSta->bBtBusy);\n\t\n\tif(bBtBusyTraffic != pCoexSta->bBtBusy)\n\t{\t// BT idle or BT non-idle\n\t\tbBtBusyTraffic = pCoexSta->bBtBusy;\n\t\tstateChange = TRUE;\n\t}\n\n\tif(stateChange)\n\t{\n\t\tif(!pCoexSta->bBtBusy)\n\t\t{\n\t\t\thalbtc8188c2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t}\n\n\tif(stateChange)\n\t{\n\t\tbRejApAggPkt = pCoexSta->bBtBusy;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejApAggPkt);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionA2dpBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\twifiRssiState;\n\tu4Byte\t\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\n\tif(pCoexSta->bBtBusy)\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0xc, 0x18);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x20, FALSE);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t}\n\n\t\t\t// sw mechanism \n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0xc, 0x18);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x20, FALSE);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t}\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionA2dpBc8(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\twifiRssiState;\n\tu4Byte\t\t\twifiBw, wifiTrafficDir;\n\tBOOLEAN\t\t\tbWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tif(pCoexSta->bA2dpBusy && bWifiBusy)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\n\t\t// fw mechanism first\n\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0xc, 0x18);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x18);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\n\t\t// sw mechanism \n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t}\n\telse if(pCoexSta->bA2dpBusy)\n\t{\n\t\t// fw mechanism first\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, TRUE, 0x18, FALSE);\n\n\t\t// sw mechanism \n\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n\telse\n\t{\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionA2dpBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionA2dpBc8(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionPanBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\tif(bBtHsOn)\n\t{\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t}\n\telse\n\t{\n\t\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x10);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t}\n\t}\n\t// sw mechanism\n\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\n\nVOID\nhalbtc8188c2ant_ActionPanBc8(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\ts4Byte\t\twifiRssi;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(bBtHsOn)\n\t{\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 3, 25, 50);\n\n\t\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t\t{\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( (wifiRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_MEDIUM) )\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\n\t\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);//BT_FW_NAV_ON);\n\t\t\t\t\telse\n\t\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\t\t\t\t\n\t\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);//BT_FW_NAV_ON);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse if(pCoexSta->bBtBusy && !bWifiBusy && (wifiRssi < 30))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x0a, 0x20);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t// sw mechanism \n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionPan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionPanBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionPanBc8(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\tBOOLEAN \tbWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t{\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t}\n\telse if(!bWifiBusy)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t}\n\telse if(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t{\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t}\n\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t}\n\t// sw mechanism\n\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\n\n\nVOID\nhalbtc8188c2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState;\n\tu4Byte\twifiBw;\n\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t\n\t\t// fw mechanism\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\t// sw mechanism\n\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\t\t\t// fw mechanism first\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\t\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\t\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionHidA2dpBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\n\tif(pCoexSta->bBtBusy)\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x7, 0x20);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x20, FALSE);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t}\n\n\t\t\t// sw mechanism \n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\t\t\t// fw mechanism first\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x7, 0x20);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x20, FALSE);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t}\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n}\nVOID\nhalbtc8188c2ant_ActionHidA2dpBc8(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw;\n\t\n\tif(pCoexSta->bBtBusy)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\t\t\t// fw mechanism\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionHidA2dpBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionHidA2dpBc8(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionHidPanBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\n\tif(bBtHsOn)\n\t{\t\n\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t\t\n\t\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x10);\t\t\t\t\t\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse if(!bWifiBusy)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t}\t\t\t\n\t}\n\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\nVOID\nhalbtc8188c2ant_ActionHidPanBc8(\t\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!bBtHsOn)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 25, 0);\n\t\tif((pCoexSta->bBtBusy && bWifiBusy))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x15, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x20);\n\t\t\t}\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_INTF_USB == pBtCoexist->chipInterface)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\t\t\thalbtc8188c2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\tif(pCoexSta->bBtBusy)\n\t\t\t{\n\t\t\t\t// fw mechanism\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t\t// sw mechanism\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionHidPan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionHidPanBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionHidPanBc8(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionPanA2dpBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\tif(bBtHsOn)\n\t{\n\t\tif(pCoexSta->bBtBusy)\n\t\t{\n\t\t\t// fw mechanism\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism\n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x10);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t}\t\t\t\n\t\t// sw mechanism\n\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n}\nVOID\nhalbtc8188c2ant_ActionPanA2dpBc8(\t\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!bBtHsOn)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\twifiRssiState = halbtc8188c2ant_WifiRssiState(pBtCoexist, 0, 2, 25, 0);\n\t\tif((pCoexSta->bBtBusy && bWifiBusy))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x15, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x20);\n\t\t\t}\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\t\n\t\t\t\t{\n\t\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(pCoexSta->bBtBusy)\n\t\t{\n\t\t\t// fw mechanism\n\t\t\thalbtc8188c2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8188c2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism\t\t\t\n\t\t\thalbtc8188c2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8188c2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8188c2ant_ActionPanA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionPanA2dpBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8188c2ant_ActionPanA2dpBc8(pBtCoexist);\n\t}\n}\n\n//============================================================\n// extern function start with EXhalbtc8188c2ant_\n//============================================================\nVOID\nEXhalbtc8188c2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8188c2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xf0);\n\n\tif( (BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType) ||\n\t\t(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType) )\n\t{\n\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd) & BIT0;\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, u1Tmp);\n\t\t\n\t\thalbtc8188c2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0xaaaa9aaa, 0xffbd0040, 0x40000010);\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8188c2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8188c2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"[Action Manual control]!!\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tif(pStackInfo->bProfileNotified)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\t\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x40\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8188c2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\t//halbtc8188c2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\thalbtc8188c2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\thalbtc8188c2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\t\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\t\n}\n\nVOID\nEXhalbtc8188c2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8188c2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n}\n\nVOID\nEXhalbtc8188c2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\tEXhalbtc8188c2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8188c2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu1Byte\talgorithm;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Periodical!!\\n\"));\n\n\t// NOTE:\n\t// sw mechanism must be done after fw mechanism\n\t// \n\n\tif((BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType) ||\n\t\t(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType) )\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_GET_BT_RSSI, NULL);\n\n\t\thalbtc8188c2ant_MonitorBtState(pBtCoexist);\n\t\talgorithm = halbtc8188c2ant_ActionAlgorithm(pBtCoexist);\t\n\t\tpCoexDm->curAlgorithm = algorithm;\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_PAN:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionPan(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_HID_PAN:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+HID\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionHidPan(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8188C_2ANT_COEX_ALGO_PAN_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\\n\"));\n\t\t\t\thalbtc8188c2ant_ActionPanA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8188c2Ant.h",
    "content": "//===========================================\n// The following is for 8188C 2Ant BT Co-exist definition\n//===========================================\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8188C_2ANT\t\t6\n\ntypedef enum _BT_INFO_SRC_8188C_2ANT{\n\tBT_INFO_SRC_8188C_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8188C_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8188C_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8188C_2ANT_MAX\n}BT_INFO_SRC_8188C_2ANT,*PBT_INFO_SRC_8188C_2ANT;\n\ntypedef enum _BT_8188C_2ANT_BT_STATUS{\n\tBT_8188C_2ANT_BT_STATUS_IDLE\t\t\t\t= 0x0,\n\tBT_8188C_2ANT_BT_STATUS_CONNECTED_IDLE\t= 0x1,\n\tBT_8188C_2ANT_BT_STATUS_NON_IDLE\t\t\t= 0x2,\n\tBT_8188C_2ANT_BT_STATUS_MAX\n}BT_8188C_2ANT_BT_STATUS,*PBT_8188C_2ANT_BT_STATUS;\n\ntypedef enum _BT_8188C_2ANT_COEX_ALGO{\n\tBT_8188C_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8188C_2ANT_COEX_ALGO_SCO\t\t\t\t\t= 0x1,\n\tBT_8188C_2ANT_COEX_ALGO_HID\t\t\t\t\t= 0x2,\n\tBT_8188C_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8188C_2ANT_COEX_ALGO_PAN\t\t\t\t\t= 0x4,\n\tBT_8188C_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0x5,\n\tBT_8188C_2ANT_COEX_ALGO_HID_PAN\t\t\t\t= 0x6,\n\tBT_8188C_2ANT_COEX_ALGO_PAN_A2DP\t\t\t= 0x7,\n\tBT_8188C_2ANT_COEX_ALGO_MAX\n}BT_8188C_2ANT_COEX_ALGO,*PBT_8188C_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8188C_2ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbPreBalanceOn;\n\tBOOLEAN\t\tbCurBalanceOn;\n\n\t// diminishWifi\n\tBOOLEAN\t\tbPreDacOn;\n\tBOOLEAN\t\tbCurDacOn;\n\tBOOLEAN \tbPreInterruptOn;\n\tBOOLEAN\t\tbCurInterruptOn;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN \tbPreNavOn;\n\tBOOLEAN\t\tbCurNavOn;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\t//u4Byte\t\tpreVal0x6c0;\n\t//u4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu4Byte\t\tpreVal0x6cc;\n\tu4Byte\t\tcurVal0x6cc;\n\t//BOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\t//u1Byte\t\tbtStatus;\n\t//u1Byte\t\twifiChnlInfo[3];\n} COEX_DM_8188C_2ANT, *PCOEX_DM_8188C_2ANT;\n\ntypedef struct _COEX_STA_8188C_2ANT{\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbBtBusy;\n\tBOOLEAN\t\t\t\t\tbBtUplink;\n\tBOOLEAN\t\t\t\t\tbBtDownLink;\n\tBOOLEAN\t\t\t\t\tbA2dpBusy;\n}COEX_STA_8188C_2ANT, *PCOEX_STA_8188C_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8188c2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8188c2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8188c2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8188c2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8188c2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8188c2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8188c2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8188c2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n"
  },
  {
    "path": "hal/btc/HalBtc8192d2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 92D BT 2 Antenna Co-exist mechanism\n//\n// By cosa 02/11/2011\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8192d2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8192D_2ANT\tGLCoexDm8192d2Ant;\nstatic PCOEX_DM_8192D_2ANT \tpCoexDm=&GLCoexDm8192d2Ant;\nstatic COEX_STA_8192D_2ANT\tGLCoexSta8192d2Ant;\nstatic PCOEX_STA_8192D_2ANT\tpCoexSta=&GLCoexSta8192d2Ant;\n\n//============================================================\n// local function start with btdm_\n//============================================================\nu1Byte\nhalbtc8192d2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192D_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nu1Byte\nhalbtc8192d2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8192D_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\n\tif(!pStackInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No profile exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pStackInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\n\tif(pStackInfo->bScoExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO algorithm\\n\"));\n\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_SCO;\n\t}\n\telse\n\t{\n\t\tif(numOfDiffProfile == 1)\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN only\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_PAN;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_HID_PAN;\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8192D_2ANT_COEX_ALGO_PAN_A2DP;\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn algorithm;\n}\n\nVOID\nhalbtc8192d2ant_SetFwBalance(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbBalanceOn,\n\tIN\tu1Byte\t\t\tms0,\n\tIN\tu1Byte\t\t\tms1\n\t)\n{\n\tu1Byte\tH2C_Parameter[3] ={0};\n\n\tif(bBalanceOn)\n\t{\n\t\tH2C_Parameter[2] = 1;\n\t\tH2C_Parameter[1] = ms1;\n\t\tH2C_Parameter[0] = ms0;\n\t}\n\telse\n\t{\n\t\tH2C_Parameter[2] = 0;\n\t\tH2C_Parameter[1] = 0;\n\t\tH2C_Parameter[0] = 0;\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Balance=[%s:%dms:%dms], write 0xc=0x%x\\n\", \n\t\tbBalanceOn?\"ON\":\"OFF\", ms0, ms1,\n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0xc, 3, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8192d2ant_Balance(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbBalanceOn,\n\tIN\tu1Byte\t\t\tms0,\n\tIN\tu1Byte\t\t\tms1\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Balance %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bBalanceOn? \"ON\":\"OFF\")));\n\tpCoexDm->bCurBalanceOn = bBalanceOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBalanceOn == pCoexDm->bCurBalanceOn)\n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetFwBalance(pBtCoexist, bBalanceOn, ms0, ms1);\n\n\tpCoexDm->bPreBalanceOn = pCoexDm->bCurBalanceOn;\n}\n\nVOID\nhalbtc8192d2ant_SetFwDiminishWifi(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN \t\tbDacOn,\n\tIN\tBOOLEAN \t\tbInterruptOn,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl,\n\tIN\tBOOLEAN \t\tbNavOn\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\n\tif((pBtCoexist->stackInfo.minBtRssi <= -5) && (fwDacSwingLvl == 0x20))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], DiminishWiFi 0x20 original, but set 0x18 for Low RSSI!\\n\"));\n\t\tfwDacSwingLvl = 0x18;\n\t}\n\n\tH2C_Parameter[2] = 0;\n\tH2C_Parameter[1] = fwDacSwingLvl;\n\tH2C_Parameter[0] = 0;\n\tif(bDacOn)\n\t{\n\t\tH2C_Parameter[2] |= 0x01;\t//BIT0\n\t\tif(bInterruptOn)\n\t\t{\n\t\t\tH2C_Parameter[2] |= 0x02;\t//BIT1\n\t\t}\n\t}\n\tif(bNavOn)\n\t{\n\t\tH2C_Parameter[2] |= 0x08;\t//BIT3\n\t}\n\t\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bDacOn=%s, bInterruptOn=%s, bNavOn=%s, write 0x12=0x%x\\n\", \n\t\t(bDacOn?\"ON\":\"OFF\"), (bInterruptOn?\"ON\":\"OFF\"), (bNavOn?\"ON\":\"OFF\"),\n\t\t(H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])));\t\t\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x12, 3, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8192d2ant_DiminishWifi(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacOn,\n\tIN\tBOOLEAN\t\t\tbInterruptOn,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl,\n\tIN\tBOOLEAN\t\t\tbNavOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set Diminish Wifi, bDacOn=%s, bInterruptOn=%s, fwDacSwingLvl=%d, bNavOn=%s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bDacOn? \"ON\":\"OFF\"), (bInterruptOn? \"ON\":\"OFF\"), fwDacSwingLvl, (bNavOn? \"ON\":\"OFF\")));\n\n\tpCoexDm->bCurDacOn = bDacOn;\n\tpCoexDm->bCurInterruptOn = bInterruptOn;\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\tpCoexDm->bCurNavOn = bNavOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacOn==pCoexDm->bCurDacOn) &&\n\t\t\t(pCoexDm->bPreInterruptOn==pCoexDm->bCurInterruptOn) &&\n\t\t\t(pCoexDm->preFwDacSwingLvl==pCoexDm->curFwDacSwingLvl) &&\n\t\t\t(pCoexDm->bPreNavOn==pCoexDm->bCurNavOn) )\n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetFwDiminishWifi(pBtCoexist, bDacOn, bInterruptOn, fwDacSwingLvl, bNavOn);\n\n\tpCoexDm->bPreDacOn = pCoexDm->bCurDacOn;\n\tpCoexDm->bPreInterruptOn = pCoexDm->bCurInterruptOn;\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n\tpCoexDm->bPreNavOn = pCoexDm->bCurNavOn;\n}\n\nVOID\nhalbtc8192d2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf2ff7);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\n\nVOID\nhalbtc8192d2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8192d2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8192d2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8192d2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tu4Byte\tdacSwingLvl;\n\n\tif(bSwDacSwingOn)\n\t{\t\t\n\t\tif((pBtCoexist->stackInfo.minBtRssi <= -5) && (swDacSwingLvl == 0x20))\n\t\t{\n\t\t\tdacSwingLvl = 0x18;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdacSwingLvl = swDacSwingLvl;\n\t\t}\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xfc000000, dacSwingLvl);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xfc000000, 0x30);\n\t}\n}\n\nVOID\nhalbtc8192d2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8192d2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8192d2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611);\n\t}\n}\n\nVOID\nhalbtc8192d2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8192d2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0xa99);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xd4000);\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b000001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b010001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b020001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b030001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b040001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b050001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b060001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b070001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b080001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b090001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b0A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7b0B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7a0C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x790D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x780E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x770F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x76100001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x75110001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x74120001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x73130001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x72140001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x71150001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x70160001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6f170001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e180001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d190001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4f1E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4e1F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4d200001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4c210001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4b220001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x4a230001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x49240001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x48250001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x47260001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x46270001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x45280001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x44290001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x432A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x422B0001);\n\n\t\trssiAdjustVal = 12;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x30a99);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xdc000);\n\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B000001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B010001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B020001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B030001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B040001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B050001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7B060001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x7A070001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x79080001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x78090001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x770A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x760B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x750C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x740D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x730E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x720F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x71100001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x70110001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6F120001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6E130001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6D140001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6C150001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6B160001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6A170001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x69180001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68190001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x671A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x661B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x651C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x641D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x631E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x621F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x61200001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x60210001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x49220001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x48230001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x47240001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x46250001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x45260001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x44270001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x43280001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x42290001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x412A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x402B0001);\n\t}\n\n\t// set rssiAdjustVal for wifi module.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\n\n\nVOID\nhalbtc8192d2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8192d2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu4Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8192d2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu4Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8192d2ant_SetCoexTable(pBtCoexist, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8192d2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw mechanism\n\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t// sw mechanism\n\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\nVOID\nhalbtc8192d2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nhalbtc8192d2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tbtActive\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtDisabled=FALSE, bForceToRoam=FALSE;\n\tu4Byte\t\t\tu4Tmp=0;\n\n\t// This function check if bt is disabled\n\tif(btActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\n\t\tbForceToRoam = TRUE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_FORCE_TO_ROAM, &bForceToRoam);\n\n\t\tbPreBtDisabled = bBtDisabled;\n\t}\n}\n\nVOID\nhalbtc8192d2ant_MonitorBtState(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \t\tstateChange=FALSE;\n\tu4Byte\t\t\tBT_Polling, Ratio_Act, Ratio_STA;\n\tu4Byte\t\t\tBT_Active, BT_State;\n\tu4Byte\t\t\tregBTActive=0, regBTState=0, regBTPolling=0;\n\tu4Byte\t\t\tbtBusyThresh=0;\n\tu4Byte\t\t\tfwVer=0;\n\tstatic BOOLEAN\tbBtBusyTraffic=FALSE;\n\tBOOLEAN \t\tbRejApAggPkt=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FirmwareVersion = 0x%x(%d)\\n\", fwVer, fwVer));\n\t\n\tregBTActive = 0x444;\n\tregBTState = 0x448;\n\tregBTPolling = 0x44c;\t\n\t\n\tbtBusyThresh = 40;\n\t\n\tBT_Active = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTActive);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_Active(0x%x)=0x%x\\n\", regBTActive, BT_Active));\n\tBT_Active = BT_Active & 0x00ffffff;\n\n\tBT_State = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTState);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_State(0x%x)=0x%x\\n\", regBTState, BT_State));\n\tBT_State = BT_State & 0x00ffffff;\n\n\tBT_Polling = pBtCoexist->fBtcRead4Byte(pBtCoexist, regBTPolling);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT_Polling(0x%x)=0x%x\\n\", regBTPolling, BT_Polling));\n\n\tif(BT_Active==0xffffffff && BT_State==0xffffffff && BT_Polling==0xffffffff )\n\t\treturn;\n\n\t// 2011/05/04 MH For Slim combo test meet a problem. Surprise remove and WLAN is running\n\t// DHCP process. At the same time, the register read value might be zero. And cause BSOD 0x7f\n\t// EXCEPTION_DIVIDED_BY_ZERO. In This case, the stack content may always be wrong due to \n\t// HW divide trap.\n\tif (BT_Polling==0)\n\t\treturn;\n\n\thalbtc8192d2ant_MonitorBtEnableDisable(pBtCoexist, BT_Active);\n\t\n\tRatio_Act = BT_Active*1000/BT_Polling;\n\tRatio_STA = BT_State*1000/BT_Polling;\n\t\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ratio_Act=%d\\n\", Ratio_Act));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ratio_STA=%d\\n\", Ratio_STA));\n\n\tif(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\tif(Ratio_STA < 60)\t// BT PAN idle\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Check if BT PAN (under BT 2.1) is uplink or downlink\n\t\t\tif((Ratio_Act/Ratio_STA) < 2)\n\t\t\t{\t// BT PAN Uplink\n\t\t\t\tpCoexSta->bBtUplink = TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\t// BT PAN downlink\n\t\t\t\tpCoexSta->bBtUplink = FALSE;\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\t// Check BT is idle or not\n\tif(!pBtCoexist->stackInfo.bBtLinkExist)\n\t{\n\t\tpCoexSta->bBtBusy = FALSE;\n\t}\n\telse\n\t{\n\t\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t\t{\n\t\t\tif(Ratio_Act<20)\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = TRUE;\n\t\t\t}\n\t\t}\n\t\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t\t{\n\t\t\tif(Ratio_STA < btBusyThresh)\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bBtBusy = TRUE;\n\t\t\t}\n\n\t\t\tif( (Ratio_STA < btBusyThresh) ||\n\t\t\t\t(Ratio_Act<180 && Ratio_STA<130) )\n\t\t\t{\n\t\t\t\tpCoexSta->bA2dpBusy = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bA2dpBusy = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &pCoexSta->bBtBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &pCoexSta->bBtBusy);\n\t\n\tif(bBtBusyTraffic != pCoexSta->bBtBusy)\n\t{\t// BT idle or BT non-idle\n\t\tbBtBusyTraffic = pCoexSta->bBtBusy;\n\t\tstateChange = TRUE;\n\t}\n\n\tif(stateChange)\n\t{\n\t\tif(!pCoexSta->bBtBusy)\n\t\t{\n\t\t\thalbtc8192d2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8192d2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t}\n\n\tif(stateChange)\n\t{\n\t\tbRejApAggPkt = pCoexSta->bBtBusy;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejApAggPkt);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\twifiRssiState, wifiRssiState1=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\t\twifiBw, wifiTrafficDir;\n\tBOOLEAN \t\tbWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\n\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\tif(pCoexSta->bA2dpBusy && bWifiBusy)\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 25, 0);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 40, 0);\n\t\t\t}\n\t\t}\n\n\t\t// fw mechanism first\n\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0xc, 0x18);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x18);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\n\t\t// sw mechanism \n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t}\n\t\t\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t}\n\telse if(pCoexSta->bA2dpBusy)\n\t{\n\t\t// fw mechanism first\n\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, TRUE, 0x18, FALSE);\n\n\t\t// sw mechanism \n\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n\telse\n\t{\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionPan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState, wifiRssiState1;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\ts4Byte\t\twifiRssi;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\n\tif(bBtHsOn)\n\t{\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 3, 25, 50);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t}\n\t\telse\n\t\t{\t\t\t\n\t\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 25, 0);\n\t\t}\n\n\t\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t\t{\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( (wifiRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_MEDIUM) )\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\n\t\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);//BT_FW_NAV_ON);\n\t\t\t\t\telse\n\t\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// fw mechanism first\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x20);\n\t\t\t\t\n\t\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t}\n\t\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);//BT_FW_NAV_ON);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sw mechanism \n\t\t\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse if(pCoexSta->bBtBusy && \n\t\t\t\t!bWifiBusy &&\n\t\t\t\t(wifiRssi < 30))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x0a, 0x20);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t\t// sw mechanism \n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n}\n\n\nVOID\nhalbtc8192d2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiTrafficDir;\n\tBOOLEAN \tbWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t{\n\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 45, 0);\n\t}\n\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t{\n\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 20, 0);\n\t}\n\t\t\n\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\t\n\t\t\t// sw mechanism \t\t\t\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, TRUE, 0x18, FALSE);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x15, 0x15);\n\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x30, FALSE);\n\t\t\t}\t\t\t\n\t\t\t// sw mechanism \n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\n\n\nVOID\nhalbtc8192d2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState;\n\tu4Byte\twifiBw;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism first\n\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t// sw mechanism \t\t\n\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n\telse\n\t{\n\t\t// fw mechanism first\n\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1;\n\tu4Byte\t\twifiBw;\n\n\tif(pCoexSta->bBtBusy)\n\t{\n\t\twifiRssiState1 = halbtc8192d2ant_WifiRssiState(pBtCoexist, 1, 2, 35, 0);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t}\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\t\t\t// fw mechanism\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t}\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n}\n\n\nVOID\nhalbtc8192d2ant_ActionHidPanBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\n\tif(bBtHsOn)\n\t{\n\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\thalbtc8192d2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\t\thalbtc8192d2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t\t\n\t\t\thalbtc8192d2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t}\n\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x10);\t\t\t\t\t\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse if(!bWifiBusy)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t}\t\t\t\n\t}\n\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n}\nVOID\nhalbtc8192d2ant_ActionHidPanBc8(\t\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw, wifiTrafficDir;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!bBtHsOn)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 25, 0);\n\t\tif((pCoexSta->bBtBusy && bWifiBusy))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x15, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x20);\n\t\t\t}\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_INTF_USB == pBtCoexist->chipInterface)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\t\t\tif(BTC_WIFI_TRAFFIC_TX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\n\t\t\t\thalbtc8192d2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x000000f0, 0x40000010);\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0xa0);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t\telse if(BTC_WIFI_TRAFFIC_RX == wifiTrafficDir)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\tif(pCoexSta->bBtBusy)\n\t\t\t{\n\t\t\t\t// fw mechanism\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t\t// sw mechanism\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionHidPan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8192d2ant_ActionHidPanBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8192d2ant_ActionHidPanBc8(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionPanA2dpBc4(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x0);\n\tif(bBtHsOn)\n\t{\n\t\tif(pCoexSta->bBtBusy)\n\t\t{\n\t\t\t// fw mechanism\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\tif(pCoexSta->bBtBusy && bWifiBusy)\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x20, 0x10);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x0, FALSE);\n\t\t}\t\t\t\n\t\t// sw mechanism\n\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t}\n}\nVOID\nhalbtc8192d2ant_ActionPanA2dpBc8(\t\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!bBtHsOn)\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\twifiRssiState = halbtc8192d2ant_WifiRssiState(pBtCoexist, 0, 2, 25, 0);\n\t\tif((pCoexSta->bBtBusy && bWifiBusy))\n\t\t{\n\t\t\t// fw mechanism first\n\t\t\tif(pCoexSta->bBtUplink)\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x15, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, TRUE, 0x10, 0x20);\n\t\t\t}\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x20, FALSE);\n\n\t\t\t// sw mechanism \n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\t\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t\telse\t\n\t\t\t\t{\n\t\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(pCoexSta->bBtBusy)\n\t\t{\n\t\t\t// fw mechanism\n\t\t\thalbtc8192d2ant_Balance(pBtCoexist, NORMAL_EXEC, FALSE, 0, 0);\n\t\t\thalbtc8192d2ant_DiminishWifi(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0, FALSE);\n\n\t\t\t// sw mechanism\t\t\t\n\t\t\thalbtc8192d2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x20);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192d2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0x30);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192d2ant_ActionPanA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tif(BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8192d2ant_ActionPanA2dpBc4(pBtCoexist);\n\t}\n\telse if(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\thalbtc8192d2ant_ActionPanA2dpBc8(pBtCoexist);\n\t}\n}\n\nBOOLEAN\nhalbtc8192d2ant_IsBtCoexistEnter(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tmacPhyMode;\n\tBOOLEAN\t\t\tbRet=TRUE;\n\tBOOLEAN\t\t\tbWifiUnder5G=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_MAC_PHY_MODE, &macPhyMode);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\t\n\tif(BTC_SMSP != macPhyMode)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Only support single mac single phy!!\\n\"));\n\t\tbRet = FALSE;\n\t}\n\n\tif(bWifiUnder5G)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under 5G or A band\\n\"));\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t\tbRet = FALSE;\n\t}\n\n\treturn bRet;\n}\n\n//============================================================\n// extern function start with EXhalbtc8192d2ant_\n//============================================================\nVOID\nEXhalbtc8192d2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8192d2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\n\tif( (BTC_CHIP_CSR_BC4 == pBtCoexist->boardInfo.btChipType) ||\n\t\t(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType) )\n\t{\n\t\tu1Tmp =  pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd) & BIT0;\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, u1Tmp);\n\t\t\n\t\thalbtc8192d2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0xaaaa9aaa, 0xffbd0040, 0x40000010);\n\n\t\t// switch control, here we set pathA to control\n\t\t// 0x878[13] = 1, 0:pathB, 1:pathA(default)\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x878, BIT13, 0x1);\n\t\t\n\t\t// antsel control, here we use phy0 and enable antsel.\n\t\t// 0x87c[16:15] = b'11, enable antsel, antsel output pin\n\t\t// 0x87c[30] = 0, 0: phy0, 1:phy 1\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x87c, bMaskDWord, 0x1fff8);\n\t\t\n\t\t// antsel to Bt or Wifi, it depends Bt on/off.\n\t\t// 0x860[9:8] = 'b10, b10:Bt On, WL2G off(default), b01:Bt off, WL2G on.\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x860, BIT9|BIT8, 0x2);\n\t\t\n\t\t// sw/hw control switch, here we set sw control\n\t\t// 0x870[9:8] = 'b11 sw control, 'b00 hw control\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x870, BIT9|BIT8, 0x3);\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8192d2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192d2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"[Action Manual control]!!\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tif(pStackInfo->bProfileNotified)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\t\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x40\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8192d2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\t//halbtc8192d2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\thalbtc8192d2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\thalbtc8192d2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\t\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\t\n}\n\nVOID\nEXhalbtc8192d2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8192d2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n}\n\nVOID\nEXhalbtc8192d2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\tEXhalbtc8192d2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8192d2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu1Byte\talgorithm;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Periodical!!\\n\"));\n\n\t// NOTE:\n\t// sw mechanism must be done after fw mechanism\n\t// \n\tif(!halbtc8192d2ant_IsBtCoexistEnter(pBtCoexist))\n\t\treturn;\n\n\tif(BTC_CHIP_CSR_BC8 == pBtCoexist->boardInfo.btChipType)\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_GET_BT_RSSI, NULL);\n\n\t\thalbtc8192d2ant_MonitorBtState(pBtCoexist);\n\t\talgorithm = halbtc8192d2ant_ActionAlgorithm(pBtCoexist);\t\n\t\tpCoexDm->curAlgorithm = algorithm;\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_PAN:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionPan(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_HID_PAN:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+HID\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionHidPan(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192D_2ANT_COEX_ALGO_PAN_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\\n\"));\n\t\t\t\thalbtc8192d2ant_ActionPanA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8192d2Ant.h",
    "content": "//===========================================\n// The following is for 8192D 2Ant BT Co-exist definition\n//===========================================\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8192D_2ANT\t\t6\n\ntypedef enum _BT_INFO_SRC_8192D_2ANT{\n\tBT_INFO_SRC_8192D_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8192D_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8192D_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8192D_2ANT_MAX\n}BT_INFO_SRC_8192D_2ANT,*PBT_INFO_SRC_8192D_2ANT;\n\ntypedef enum _BT_8192D_2ANT_BT_STATUS{\n\tBT_8192D_2ANT_BT_STATUS_IDLE\t\t\t\t= 0x0,\n\tBT_8192D_2ANT_BT_STATUS_CONNECTED_IDLE\t= 0x1,\n\tBT_8192D_2ANT_BT_STATUS_NON_IDLE\t\t\t= 0x2,\n\tBT_8192D_2ANT_BT_STATUS_MAX\n}BT_8192D_2ANT_BT_STATUS,*PBT_8192D_2ANT_BT_STATUS;\n\ntypedef enum _BT_8192D_2ANT_COEX_ALGO{\n\tBT_8192D_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8192D_2ANT_COEX_ALGO_SCO\t\t\t\t\t= 0x1,\n\tBT_8192D_2ANT_COEX_ALGO_HID\t\t\t\t\t= 0x2,\n\tBT_8192D_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8192D_2ANT_COEX_ALGO_PAN\t\t\t\t\t= 0x4,\n\tBT_8192D_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0x5,\n\tBT_8192D_2ANT_COEX_ALGO_HID_PAN\t\t\t\t= 0x6,\n\tBT_8192D_2ANT_COEX_ALGO_PAN_A2DP\t\t\t= 0x7,\n\tBT_8192D_2ANT_COEX_ALGO_MAX\n}BT_8192D_2ANT_COEX_ALGO,*PBT_8192D_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8192D_2ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbPreBalanceOn;\n\tBOOLEAN\t\tbCurBalanceOn;\n\n\t// diminishWifi\n\tBOOLEAN\t\tbPreDacOn;\n\tBOOLEAN\t\tbCurDacOn;\n\tBOOLEAN \tbPreInterruptOn;\n\tBOOLEAN\t\tbCurInterruptOn;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN \tbPreNavOn;\n\tBOOLEAN\t\tbCurNavOn;\n\n\n\t\n\n\t\n\t//BOOLEAN\t\tbPreDecBtPwr;\n\t//BOOLEAN\t\tbCurDecBtPwr;\n\n\t//u1Byte\t\tpreFwDacSwingLvl;\n\t//u1Byte\t\tcurFwDacSwingLvl;\n\t//BOOLEAN\t\tbCurIgnoreWlanAct;\n\t//BOOLEAN\t\tbPreIgnoreWlanAct;\n\t//u1Byte\t\tprePsTdma;\n\t//u1Byte\t\tcurPsTdma;\n\t//u1Byte\t\tpsTdmaPara[5];\n\t//u1Byte\t\tpsTdmaDuAdjType;\n\t//BOOLEAN\t\tbResetTdmaAdjust;\n\t//BOOLEAN\t\tbPrePsTdmaOn;\n\t//BOOLEAN\t\tbCurPsTdmaOn;\n\t//BOOLEAN\t\tbPreBtAutoReport;\n\t//BOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\t//u4Byte\t\tpreVal0x6c0;\n\t//u4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu4Byte\t\tpreVal0x6cc;\n\tu4Byte\t\tcurVal0x6cc;\n\t//BOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\t//u1Byte\t\tbtStatus;\n\t//u1Byte\t\twifiChnlInfo[3];\n} COEX_DM_8192D_2ANT, *PCOEX_DM_8192D_2ANT;\n\ntypedef struct _COEX_STA_8192D_2ANT{\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbBtBusy;\n\tBOOLEAN\t\t\t\t\tbBtUplink;\n\tBOOLEAN\t\t\t\t\tbBtDownLink;\n\tBOOLEAN\t\t\t\t\tbA2dpBusy;\n}COEX_STA_8192D_2ANT, *PCOEX_STA_8192D_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8192d2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192d2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8192d2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192d2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192d2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192d2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192d2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8192d2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n"
  },
  {
    "path": "hal/btc/HalBtc8192e1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8192E Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8192e1Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8192E_1ANT\t\tGLCoexDm8192e1Ant;\nstatic PCOEX_DM_8192E_1ANT \tpCoexDm=&GLCoexDm8192e1Ant;\nstatic COEX_STA_8192E_1ANT\t\tGLCoexSta8192e1Ant;\nstatic PCOEX_STA_8192E_1ANT\tpCoexSta=&GLCoexSta8192e1Ant;\n\nconst char *const GLBtInfoSrc8192e1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8192e1Ant=20140527;\nu4Byte\tGLCoexVer8192e1Ant=0x4f;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8192e1ant_\n//============================================================\nu1Byte\nhalbtc8192e1ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8192e1ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8192e1ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8192e1ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8192e1ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8192e1ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8192e1ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8192e1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8192e1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8192e1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8192e1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8192e1ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8192e1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8192e1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp, u4Tmp1;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp, u1Tmp1;\n\ts4Byte\t\t\twifiRssi;\n\tstatic u1Byte\t\tNumOfBtCounterChk = 0;\n\n       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\n\t//if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->highPriorityTx = 65535;\n\t\tpCoexSta->highPriorityRx = 65535;\n\t\tpCoexSta->lowPriorityTx = 65535;\n\t\tpCoexSta->lowPriorityRx = 65535;\n\t\treturn;\n\t}\n\t\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif( (pCoexSta->lowPriorityTx >= 1050)  && (!pCoexSta->bC2hBtInquiryPage))\n\t\tpCoexSta->popEventCnt++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\\n\",\n\t\tregHPRx, regHPTx, regLPRx, regLPTx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n\n\tif ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\n\t{\n\t\tNumOfBtCounterChk++;\n\t\tif (NumOfBtCounterChk >= 3)\n\t\t{\n\t\t\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n\t\t\tNumOfBtCounterChk = 0;\n\t\t}\n\t}\n}\n\n\nVOID\nhalbtc8192e1ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n\n\tif ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\n\t{\n\t\tif ( (pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_ACL_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8192E_1ANT_BT_STATUS_SCO_BUSY) )\n\t\t{\n\t\t\tif (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \n\t\t\t\tpCoexSta->nCRCOK_11nAgg) )\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter < 5)\n\t\t\t\t nCCKLockCounter++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter > 0)\n\t\t\t\t nCCKLockCounter--;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (nCCKLockCounter > 0)\n\t\t\t  nCCKLockCounter--;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter > 0)\n\t\t\tnCCKLockCounter--;\n\t}\n\n\tif (!pCoexSta->bPreCCKLock)\n\t{\n\n\t\tif (nCCKLockCounter >= 5)\n\t\t pCoexSta->bCCKLock = TRUE;\n\t\telse\n\t\t pCoexSta->bCCKLock = FALSE;\t\t\t\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter == 0)\n\t\t pCoexSta->bCCKLock = FALSE;\n\t\telse\n\t\t pCoexSta->bCCKLock = TRUE;\t\t\n\t}\n\n\tpCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;\t\n\t\t\n\n}\n\nBOOLEAN\nhalbtc8192e1ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN bWifiConnected=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8192e1ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8192e1ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8192E_1ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO only\\n\"));\n\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID only\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8192e1ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8192e1ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8192e1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8192e1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\") ));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8192e1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8192e1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8192e1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8192e1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8192e1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8192e1ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** CoexTable(%d) **********\\n\", type));\n\t\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8192e1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8192e1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8192e1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8192e1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8192e1ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8192e1ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8192e1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8192e1ant_SwMechanism(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN \t\tbLowPenaltyRA\n\t) \n{\n\thalbtc8192e1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8192e1ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tu4Byte\t\t\tu4Tmp=0;\n\t\n\tif(bInitHwCfg)\n\t{\t\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x944, 0x24);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x930, 0x700700);\t\t\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004);\n\t\telse\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004);\n\n\t\t// 0x4c[27][24]='00', Set Antenna to BB\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &= ~BIT24;\n\t\tu4Tmp &= ~BIT27;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t}\n\telse if(bWifiOff)\n\t{\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004);\n\t\telse\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004);\n\n\t\t// 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp |= BIT24;\n\t\tu4Tmp |= BIT27;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4);\n\t\t\tbreak;\n\t\tcase BTC_ANT_PATH_BT:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x20);\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase BTC_ANT_PATH_PTA:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4);\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8192e1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8192e1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0, rssiAdjustVal=0;\n\tu1Byte\t\t\tpsTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\t\n\n\tif (pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(off, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\t\t\t\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\n\n\tif (pCoexSta->nScanAPNum <= 5)\n\t \tnWiFiDurationAdjust = 5;\n\telse if  (pCoexSta->nScanAPNum >= 40)\n\t \tnWiFiDurationAdjust = -15;\t\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t \tnWiFiDurationAdjust = -10;\t\n\t\n\tif (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\n\t}\n\t\n\tif (  (type == 3) || (type == 13) || (type == 14) )\n\t\tpsTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\n\t\n\tif (pBtLinkInfo->bSlaveRole == TRUE)\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\t\n\tif(bTurnOn)\n\t{\t \n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 20:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 30:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 31:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\n\t\t\t\tbreak;\n\t\t\tcase 32:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 33:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 34:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 35:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 36:\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\n\t\t\t\t/* here softap mode screen off will cost 70-80mA for phone */\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\n\t\t\t\tbreak;\t\n\t\t}\n\t}\n\telse\n\t{\t\t\n\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 8: //PTA Control\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:  //Software control, Antenna at BT side\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 9:   //Software control, Antenna at WiFi side\n\t\t\t\thalbtc8192e1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\n\t\t\t\tbreak;\t\t\t\n\t\t}\n\t}\n\trssiAdjustVal =0;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\n\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\tpBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948),   pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67)));\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8192e1ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// sw all off\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t// hw all off\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nBOOLEAN\nhalbtc8192e1ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\\n\"));\n\t\t\n \t\t//halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t//halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT Busy!!\\n\"));\n\n\t\t//halbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif (bWifiBusy)\t\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t}\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8192e1ant_TdmaDurationAdjustForAcl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbWifiBusy = FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjustForAcl()\\n\"));\n\n\tif(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) \n\t\tbWifiBusy = TRUE;\n\telse\n\t\tbWifiBusy = FALSE;\t \t\n\n\tif( (BT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 3 &&\n\t\t\tpCoexDm->curPsTdma != 9 )\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n\t\t\tif( (BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n\t\t\tif( (BT_INFO_8192E_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t}\n\t\t}\n\t\telse\t  //no change\n\t\t{\n\t\t\t/* Bryant Modify\t\n\t\t\tif(bWifiBusy != bPreWifiBusy)  //if busy / idle change\n\t\t\t{\n\t\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma);\n\t\t\t}\n\t\t\t*/\n\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 9 &&\n\t\t\tpCoexDm->curPsTdma != 11 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e1ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e1ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8192e1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8192e1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8192e1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiOnly(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\t\n}\n\nVOID\nhalbtc8192e1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t\thalbtc8192e1ant_ActionWifiOnly(pBtCoexist);\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n//=============================================\n//\n//\tSoftware Coex Mechanism start\n//\n//=============================================\n\n// SCO only or SCO+PAN(HS)\n\n/*\nVOID\nhalbtc8192e1ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n\nVOID\nhalbtc8192e1ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8192e1ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8192e1ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8192e1ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8192e1ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8192e1ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8192e1ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8192e1ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8192e1ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n*/\n\n//=============================================\n//\n//\tNon-Software Coex Mechanism start\n//\n//=============================================\nVOID\nhalbtc8192e1ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8192e1ant_ActionHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8192e1ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))\n\t{\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\n\t \thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\t\n\t}\n\telse if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\t// SCO/HID/A2DP  busy\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if ((pBtLinkInfo->bPanExist) || (bWifiBusy))\n\t{\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\t\t\n\t\t\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse\n\t{\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionBtScoHidOnlyBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// tdma and coex table\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n\telse //HID\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiConnectedBtAclBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tu1Byte\t\tbtRssiState;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tbtRssiState = halbtc8192e1ant_BtRssiState(2, 28, 0);\t\n\n\tif ( (pCoexSta->lowPriorityRx >= 1000)  && (pCoexSta->lowPriorityRx != 65535) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tif(pBtLinkInfo->bHidOnly)  //HID\n\t{\n\t\thalbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\treturn;\n\t}\n\telse if(pBtLinkInfo->bA2dpOnly)  //A2DP\t\t\n\t{\n\t\tif(BT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\n#if 0\n\t\t\tif (pCoexSta->bCCKLock)\n\t\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t\t\telse\n#endif\t\t\t\t\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\t}\n\t}\n\telse if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\n\t\t       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t}\n\telse if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)\t\t\t\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\t//BT no-profile busy (0x9)\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\t\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\t\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiNotConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\thalbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiNotConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t        halbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t}\n\telse if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiNotConnectedAssoAuth(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if (pBtLinkInfo->bPanExist)   \t\t\t\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t \t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t}\n\telse if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiConnectedSpecialPacket(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if(pBtLinkInfo->bPanExist) \n\t{\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_ActionWifiConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbWifiBusy=FALSE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tBOOLEAN\t\tbUnder4way=FALSE, bApEnable=FALSE;\n\tu4Byte\t\twifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect()===>\\n\"));\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\tif(bUnder4way)\n\t{\n\t\thalbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\\n\"));\n\t\treturn;\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tif(bScan)\t\n\t\t\thalbtc8192e1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\telse\n\t\t\thalbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\n\t// power save state\n\tif(!bApEnable && BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\n\t{\n\t\tif(pBtCoexist->btLinkInfo.bA2dpOnly)\t//A2DP\n\t\t\t{\t\t\t\n\t\t\tif(!bWifiBusy)\n\t\t     \t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\n\t\t\telse //busy\n\t\t\t{\n\t\t\t\tif  (pCoexSta->nScanAPNum >= BT_8192E_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\n\t\t\t\t{\n \t\t\t\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\n \t\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\telse\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(!bWifiBusy)\n\t{\n\t\tif(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, \n\t\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\t\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiConnectedBtAclBusy(pBtCoexist,\n\t\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse if( (BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8192e1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse \n\t\t{\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\t\t\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e1ant_RunSwCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\t\talgorithm=0;\n\n\talgorithm = halbtc8192e1ant_ActionAlgorithm(pBtCoexist);\n\tpCoexDm->curAlgorithm = algorithm;\n\n\tif(halbtc8192e1ant_IsCommonAction(pBtCoexist))\n\t{\n\n\t}\n\telse\n\t{\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = SCO.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR).\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HS mode.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_1ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP.\\n\"));\n\t\t\t\t//halbtc8192e1ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = coexist All Off!!\\n\"));\n\t\t\t\t//halbtc8192e1ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8192e1ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbIncreaseScanDevNum=FALSE;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tBOOLEAN\tbMiracastPlusBt=FALSE;\n\tu1Byte\taggBufSize=5;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif( (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbIncreaseScanDevNum = TRUE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\n\t\tif ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\n\t\t\thalbtc8192e1ant_ActionBtInquiry(pBtCoexist);\n\t\t}\n\t\telse\n\t\t\thalbtc8192e1ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tif ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\n\t{\n\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \n\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\n\t\telse\n\t\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\t\thalbtc8192e1ant_SwMechanism(pBtCoexist, TRUE);\n\t\thalbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\n\t}\n\telse\n\t{\n\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); \n\n\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\n\t\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\t\thalbtc8192e1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\t\n\t\thalbtc8192e1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8192e1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\t\n\tif(!bWifiConnected)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is non connected-idle !!!\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif(bScan || bLink || bRoam)\n\t\t{\n\t\t\t if (bScan)\t\n\t\t   \t\thalbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist);\t\n\t\t\t else\n\t\t    \t\thalbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\t\n\t\t}\n\t\telse\n\t\t\thalbtc8192e1ant_ActionWifiNotConnected(pBtCoexist);\n\t}\n\telse\t// wifi LPS/Busy\n\t{\n\t\thalbtc8192e1ant_ActionWifiConnected(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8192e1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\n\t// sw all off\n\thalbtc8192e1ant_SwMechanism(pBtCoexist, FALSE);\n\t\n\t//halbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\tpCoexSta->popEventCnt = 0;\n}\n\nVOID\nhalbtc8192e1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\n\t// antenna sw ctrl to bt\n\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\n\t\n\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\t// antenna switch control parameter\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x858, 0x55555555);\n\n\t// coex parameters\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t// enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\t// enable PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\t// enable mailbox interface\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x40);\n\tu2Tmp |= BIT9;\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x40, u2Tmp);\n\n\t// enable PTA I2C mailbox \n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x101);\n\tu1Tmp |= BIT4;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x101, u1Tmp);\n\n\t// enable bt clock when wifi is disabled.\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x93);\n\tu1Tmp |= BIT0;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x93, u1Tmp);\n\t// enable bt clock when suspend.\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7);\n\tu1Tmp |= BIT0;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp);\n}\n\n\n/*\nVOID\nhalbtc8192e1ant_WifiOffHwCfg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// set wlan_act to low\n\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n}\n*/\n\n//============================================================\n// work around function start with wa_halbtc8192e1ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8192e1ant_\n//============================================================\nVOID\nEXhalbtc8192e1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n#if 0\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x0;\n\tu2Byte u2Tmp=0x0;\n\n\tpBtCoexist->bStopCoexDm = TRUE;\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\n\n\t// enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\n\n\t// set GRAN_BT = 1\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t// set WLAN_ACT = 0\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\t\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\n\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t\t// set to S1\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t\t}\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\n\t}\n#endif\n}\n\nVOID\nEXhalbtc8192e1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8192e1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\tpBtCoexist->bStopCoexDm = FALSE;\n}\n\nVOID\nEXhalbtc8192e1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\n\tpBtCoexist->bStopCoexDm = FALSE;\n\t\n\thalbtc8192e1ant_InitCoexDm(pBtCoexist);\n\n\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192e1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\t\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Coex is STOPPED]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\t\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8192E_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8192e1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t\t// Sw mechanism\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %d \", \"DelBA/ BtCtrlAgg/ AggSize\", \\\n\t\t\t(pBtCoexist->btInfo.bRejectAggPkt? \"Yes\":\"No\"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? \"Yes\":\"No\"),\n\t\t\t\tpBtCoexist->btInfo.aggBufSize);\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\t\tpBtCoexist->btInfo.raMask);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\t// Fw mechanism\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Latest error condition(should be 0)\", \\\n\t\t\tpCoexDm->errorCondition);\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d \", \"IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc04);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xd04);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x90c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0xc04/ 0xd04/ 0x90c\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x778\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x92c);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x92c/ 0x930\", \\\n\t\t(u1Tmp[0]), u4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4f);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x40/ 0x4f\", \\\n\t\tu1Tmp[0], u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(hp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(lp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 1)\n\thalbtc8192e1ant_MonitorBtCtr(pBtCoexist);\n#endif\n\t\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\nVOID\nEXhalbtc8192e1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\n\tif(pBtCoexist->bManualControl ||\tpBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\t\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\t\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\n\t\thalbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8192e1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tu1Byte u1Tmpa, u1Tmpb;\n\tu4Byte u4Tmp;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm )\n\t\treturn;\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\t\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\t\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\t\t  \n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\t\t\n\t}\t\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\treturn;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8192e1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\t\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8192e1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8192e1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_SCAN_START == type)\n\t{\t\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiNotConnectedScan(pBtCoexist);\n\t\t}\n\t\telse\t// wifi is connected\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\t}\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t pCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\n\t\t pCoexDm->nArpCnt = 0;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\t\n\t\t//pCoexDm->nArpCnt = 0;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8192e1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8192e1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8192e1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\t\n\t\thalbtc8192e1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(!bWifiConnected) // non-connected scan\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tBOOLEAN\t\t\tbWifiUnderBMode = FALSE;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\t\t//Set CCK Tx/Rx high Pri except 11b mode\n\t\tif (bWifiUnderBMode)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\n\t\t}\n\t\t\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t\tpCoexDm->nArpCnt = 0;\n\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\t//H2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[0] = 0x0;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n}\n\nVOID\nEXhalbtc8192e1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif( BTC_PACKET_DHCP == type || \n\t\tBTC_PACKET_EAPOL == type ||\n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\tif(BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet ARP notify\\n\"));\t\t \n\n\t\t\tpCoexDm->nArpCnt++;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ARP Packet Count = %d\\n\", pCoexDm->nArpCnt));\n\t\t\t\n\t\t\tif(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet DHCP or EAPOL notify\\n\"));\t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet [Type = %d] notify\\n\", type));\n\t}\n\n\tpCoexSta->specialPktPeriodCnt = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8192e1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8192e1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8192e1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8192e1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8192e1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( BTC_PACKET_DHCP == type ||\n\t\tBTC_PACKET_EAPOL == type || \n\t\t( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\n\t{\n\t\thalbtc8192e1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\t\tbtInfo=0;\n\tu1Byte\t\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\t\tbWifiConnected=FALSE;\n\tBOOLEAN\t\t\t\tbBtBusy=FALSE;\n\t\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8192E_1ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8192E_1ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8192E_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btRetryCnt >= 1)\n\t\t\tpCoexSta->popEventCnt++;\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtPage = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtPage = FALSE;\t\t\t\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2-90;\n\t\t\t//pCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif(!pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\n\t\t}\n\t\t\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif(pCoexSta->btInfoExt & BIT1)\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tif(pCoexSta->btInfoExt & BIT3)\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8192E_1ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8192E_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8192E_1ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_1ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_1ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_1ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\n\thalbtc8192e1ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tbtInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\n\t\n\tif(!(btInfo&BT_INFO_8192E_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8192E_1ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8192E_1ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8192E_1ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8192E_1ANT_B_ACL_BUSY)\n\t{\n\t\tif(BT_8192E_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus)\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_1ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8192E_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\tbBtBusy = TRUE;\n\telse\n\t\tbBtBusy = FALSE;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\thalbtc8192e1ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192e1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp;\n\tu1Byte\tu1Tmpa,u1Tmpb, u1Tmpc;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF Status notify\\n\"));\n\n\tif(BTC_RF_ON == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned ON!!\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t}\n\telse if(BTC_RF_OFF == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned OFF!!\\n\"));\n\t\t\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\t\t\n\t\thalbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\t\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n \t\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\t\tu1Tmpc = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\\n\",\n\t\t\tu4Tmp,  u1Tmpa, u1Tmpb, u1Tmpc));\n\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu4Byte\tu4Tmp;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8192e1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\n\thalbtc8192e1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\n\tEXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\tpBtCoexist->bStopCoexDm = TRUE;\t\n}\n\nVOID\nEXhalbtc8192e1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\n\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8192e1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\thalbtc8192e1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\thalbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8192e1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8192e1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], *****************Coex DM Reset*****************\\n\"));\n\n\thalbtc8192e1ant_InitHwConfig(pBtCoexist, FALSE);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\n\thalbtc8192e1ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192e1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8192e1Ant, GLCoexVer8192e1Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8192E_1ANT == 0)\n\thalbtc8192e1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8192e1ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8192e1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8192e1ant_MonitorWiFiCtr(pBtCoexist);\n\n\tif( halbtc8192e1ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust )\n\t{\n\n\t\t\thalbtc8192e1ant_RunCoexistMechanism(pBtCoexist);\t\n\t}\n\n\tpCoexSta->specialPktPeriodCnt++;\n#endif\n}\n\n\nVOID\nEXhalbtc8192e1ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte\t\t\t\tpData\n\t)\n{\n\tswitch(opCode)\n\t{\n\t\tcase BTC_DBG_SET_COEX_NORMAL:\n\t\t\tpBtCoexist->bManualControl = FALSE;\n\t\t\thalbtc8192e1ant_InitCoexDm(pBtCoexist);\n\t\t\tbreak;\n\t\tcase BTC_DBG_SET_COEX_WIFI_ONLY:\n\t\t\tpBtCoexist->bManualControl = TRUE;\n\t\t\thalbtc8192e1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\t\n\t\t\tbreak;\n\t\tcase BTC_DBG_SET_COEX_BT_ONLY:\n\t\t\t// todo\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8192e1Ant.h",
    "content": "//===========================================\n// The following is for 8192E 1ANT BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8192E_1ANT\t\t\t\t1\n\n#define\tBT_INFO_8192E_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8192E_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8192E_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8192E_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8192E_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8192E_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8192E_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8192E_1ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8192E_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\tBTC_RSSI_COEX_THRESH_TOL_8192E_1ANT\t\t2\n\n#define  BT_8192E_1ANT_WIFI_NOISY_THRESH\t\t\t\t\t\t\t\t30   //max: 255\n\ntypedef enum _BT_INFO_SRC_8192E_1ANT{\n\tBT_INFO_SRC_8192E_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8192E_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8192E_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8192E_1ANT_MAX\n}BT_INFO_SRC_8192E_1ANT,*PBT_INFO_SRC_8192E_1ANT;\n\ntypedef enum _BT_8192E_1ANT_BT_STATUS{\n\tBT_8192E_1ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8192E_1ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8192E_1ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8192E_1ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8192E_1ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8192E_1ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8192E_1ANT_BT_STATUS_MAX\n}BT_8192E_1ANT_BT_STATUS,*PBT_8192E_1ANT_BT_STATUS;\n\ntypedef enum _BT_8192E_1ANT_WIFI_STATUS{\n\tBT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE\t\t\t\t= 0x0,\n\tBT_8192E_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN\t\t= 0x1,\n\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_SCAN\t\t\t\t\t= 0x2,\n\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT\t\t\t\t= 0x3,\n\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_IDLE\t\t\t\t\t= 0x4,\n\tBT_8192E_1ANT_WIFI_STATUS_CONNECTED_BUSY\t\t\t\t\t= 0x5,\n\tBT_8192E_1ANT_WIFI_STATUS_MAX\n}BT_8192E_1ANT_WIFI_STATUS,*PBT_8192E_1ANT_WIFI_STATUS;\n\ntypedef enum _BT_8192E_1ANT_COEX_ALGO{\n\tBT_8192E_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8192E_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8192E_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8192E_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8192E_1ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8192E_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8192E_1ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8192E_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8192E_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8192E_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8192E_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8192E_1ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8192E_1ANT_COEX_ALGO,*PBT_8192E_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8192E_1ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n\tu4Byte\t\tnArpCnt;\n\n\tu1Byte\t\terrorCondition;\n} COEX_DM_8192E_1ANT, *PCOEX_DM_8192E_1ANT;\n\ntypedef struct _COEX_STA_8192E_1ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\tspecialPktPeriodCnt;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\ts1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8192E_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8192E_1ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtPage;\t\t\t\t//Add for win8.1 page out issue\n\tBOOLEAN\t\t\t\t\tbWiFiIsHighPriTask;\t\t//Add for win8.1 page out issue\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu4Byte\t\t\t\t\tpopEventCnt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\t\n\n\tBOOLEAN\t\t\t\t\tbCCKLock;\n\tBOOLEAN\t\t\t\t\tbPreCCKLock;\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n}COEX_STA_8192E_1ANT, *PCOEX_STA_8192E_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8192e1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8192e1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8192e1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8192e1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e1ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte \t\t\tpData\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8192e2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8192E Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8192E_2ANT\t\tGLCoexDm8192e2Ant;\nstatic PCOEX_DM_8192E_2ANT \tpCoexDm=&GLCoexDm8192e2Ant;\nstatic COEX_STA_8192E_2ANT\t\tGLCoexSta8192e2Ant;\nstatic PCOEX_STA_8192E_2ANT\tpCoexSta=&GLCoexSta8192e2Ant;\n\nconst char *const GLBtInfoSrc8192e2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8192e2Ant=20150615;\nu4Byte\tGLCoexVer8192e2Ant=0x41;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8192e2ant_\n//============================================================\nu1Byte\nhalbtc8192e2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8192e2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8192e2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t}\n\t}\n}\n\nu4Byte\nhalbtc8192e2ant_DecideRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tssType,\n\tIN\tu4Byte\t\t\t\traMaskType\n\t)\n{\n\tu4Byte\tdisRaMask=0x0;\n\t\n\tswitch(raMaskType)\n\t{\n\t\tcase 0: // normal mode\n\t\t\tif(ssType == 2)\n\t\t\t\tdisRaMask = 0x0;\t\t\t// enable 2ss\n\t\t\telse\n\t\t\t\tdisRaMask = 0xfff00000;\t\t// disable 2ss\n\t\t\tbreak;\n\t\tcase 1: // disable cck 1/2\n\t\t\tif(ssType == 2)\n\t\t\t\tdisRaMask = 0x00000003;\t\t// enable 2ss\n\t\t\telse\n\t\t\t\tdisRaMask = 0xfff00003;\t\t// disable 2ss\n\t\t\tbreak;\n\t\tcase 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\tif(ssType == 2)\n\t\t\t\tdisRaMask = 0x0001f1f7;\t\t// enable 2ss\n\t\t\telse\n\t\t\t\tdisRaMask = 0xfff1f1f7;\t\t// disable 2ss\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn disRaMask;\n}\n\nVOID\nhalbtc8192e2ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8192e2ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8192e2ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8192e2ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8192e2ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tu4Byte\tdisRaMask=0x0;\n\n\tpCoexDm->curRaMaskType = raMaskType;\n\tdisRaMask = halbtc8192e2ant_DecideRaMask(pBtCoexist, pCoexDm->curSsType, raMaskType);\n\thalbtc8192e2ant_UpdateRaMask(pBtCoexist, bForceExec, disRaMask);\n\n\thalbtc8192e2ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8192e2ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8192e2ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8192e2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8192e2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8192e2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nBOOLEAN\nhalbtc8192e2ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN\tbWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\t\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\t\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\n\n\t\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist,3, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\n\t\tif ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) ||  (BTC_RSSI_STATE_LOW ==wifiRssiState ))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8192e2ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8192e2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8192E_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\t\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\n\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO_PAN;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8192e2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8192e2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = decBtPwrLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\\n\", \n\t\tdecBtPwrLvl, H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8192e2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), decBtPwrLvl));\n\tpCoexDm->curBtDecPwrLvl = decBtPwrLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\\n\", \n\t\t\tpCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl));\n#if 0\t// work around, avoid h2c command fail.\n\t\tif(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) \n\t\t\treturn;\n#endif\n\t}\n\thalbtc8192e2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\n\n\tpCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\n}\n\nVOID\nhalbtc8192e2ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8192e2ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\\n\", \n\t\t\tpCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport));\n\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8192e2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\\n\", \n\t\t\tpCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl));\n\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8192e2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8192e2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\\n\", \n\t\t\tpCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink));\n\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8192e2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\")) );\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8192e2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\t//return;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\\n\", \n\t\t\tpCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa));\n\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8192e2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val);\n}\n\nVOID\nhalbtc8192e2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8192e2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8192e2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8192e2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\\n\", \n\t\t\tpCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl,\n\t\t\tpCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl));\n\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8192e2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8192e2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1);\n\t}\n}\n\nVOID\nhalbtc8192e2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\\n\", \n\t\t\tpCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff));\n\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8192e2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\t//=================BB AGC Gain Table\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x0a1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x091B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x081C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x071D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x061E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x051F0001);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table Off!\\n\"));\n\t \tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);\n\t}\n\t\n#if 0\t\n\t//=================RF Gain\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tif(bAgcTableEn)\n\t{\n\t\trssiAdjustVal = 8;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n#endif\n\n}\n\nVOID\nhalbtc8192e2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\\n\", \n\t\t\tpCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn));\n\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8192e2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8192e2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\\n\", \n\t\t\tpCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\\n\", \n\t\t\tpCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc));\n\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8192e2ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5ffb5ffb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xdfffdfff, 0x5ffb5ffb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5ddd5ddd, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tif(pCoexSta->nScanAPNum <= NOISY_AP_NUM_THRESH)\n\t\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xfafafafa, 0xffffff, 0x3);\n\t\t\telse\n\t\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8192e2ant_CoexTable(pBtCoexist, bForceExec, 0x5f5f5f5f, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8192e2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8192e2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\\n\", \n\t\t\tpCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));\n\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\n\nVOID\nhalbtc8192e2ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\n\nVOID\nhalbtc8192e2ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], preLps/curLps=0x%x/0x%x, preRpwm/curRpwm=0x%x/0x%x!!\\n\", \n\t\t\tpCoexDm->preLps, pCoexDm->curLps, pCoexDm->preRpwm, pCoexDm->curRpwm));\n\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], LPS-RPWM_Last=0x%x , LPS-RPWM_Now=0x%x!!\\n\", \n\t\t\t\t pCoexDm->preRpwm, pCoexDm->curRpwm));\n\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8192e2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\n\n\nVOID\nhalbtc8192e2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8192e2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\t/*\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t*/\n\t\n\thalbtc8192e2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\t//halbtc8192e2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8192e2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\thalbtc8192e2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\t//halbtc8192e2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\thalbtc8192e2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8192e2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tu4Byte\t\t\tu4Tmp=0;\n\t\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x944, 0x24);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x930, 0x700700);\t\t\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004);\n\t\telse\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004);\n\n\t\t// 0x4c[27][24]='00', Set Antenna to BB\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &= ~BIT24;\n\t\tu4Tmp &= ~BIT27;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t}\n\telse if(bWifiOff)\n\t{\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30430004);\n\t\telse\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x64, 0x30030004);\n\n\t\t// 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp |= BIT24;\n\t\tu4Tmp |= BIT27;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4);\n\t\t\tbreak;\n\t\tcase BTC_ANT_PATH_BT:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x20);\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase BTC_ANT_PATH_PTA:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x92c, 0x4);\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8192e2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\\n\", \n\t\t\tpCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], prePsTdma = %d, curPsTdma = %d!!\\n\", \n\t\t\tpCoexDm->prePsTdma, pCoexDm->curPsTdma));\n\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\n\tif  (pCoexSta->nScanAPNum >= 40)\n\t \tnWiFiDurationAdjust = -15;\t\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t \tnWiFiDurationAdjust = -10;\t\n\n/*\t\n\tif (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\n\t}\n\n\t\n\tif (  (type == 3) || (type == 13) || (type == 14) )\n\t{\n\t\tpsTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\n\t\n\t\tif (!bWifiBusy)\n\t\t psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t}\n\t\n\tif (pBtLinkInfo->bSlaveRole == TRUE)\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\n*/\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\t//d1,wb\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 5:\t\t//d1,pb,TXpause\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x3c, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x32, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x28, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 8: \n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x63, 0x1e, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\t//d1,bb\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 13:\t//d1,bb,TXpause\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x03, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\t\n\t\t\tcase 71:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\tbreak;\n\n\t\t\t// following cases is for wifi rssi low // bad antenna isolation, started from 81\n\t\t\tcase 80:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3c, 0x3, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 81:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3a+nWiFiDurationAdjust, 0x3, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 82:\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x30+nWiFiDurationAdjust, 0x03, 0x90, 0x50);\n\t\t\t\tbreak;\n\t   \t\tcase 83:\n\t   \t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x21, 0x03, 0x90, 0x50);\n\t   \t\t\tbreak;\n\t   \t\tcase 84:\n\t   \t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x15, 0x3, 0x90, 0x50);\n\t   \t\t\tbreak;\n\t   \t\tcase 85:\n\t   \t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3a, 0x03, 0x90, 0x50);\n\t   \t\t\tbreak;\n\t   \t\tcase 86:\n\t   \t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x53, 0x21, 0x03, 0x90, 0x50);\n\t   \t\t\tbreak;\n\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\tcase 0:  //ANT2PTA, 0x778=1\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 1:  //ANT2BT, 0x778=3\n\t\t\t\thalbtc8192e2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0);\n\t\t\t\tdelay_ms(5);\n\t\t\t\thalbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8192e2ant_SetSwitchSsType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tssType\n\t)\n{\n\tu1Byte\tmimoPs=BTC_MIMO_PS_DYNAMIC;\n\tu4Byte\tdisRaMask=0x0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], REAL set SS Type = %d\\n\", ssType));\n\t\n\tdisRaMask = halbtc8192e2ant_DecideRaMask(pBtCoexist, ssType, pCoexDm->curRaMaskType);\n\thalbtc8192e2ant_UpdateRaMask(pBtCoexist, FORCE_EXEC, disRaMask);\n\t\n\tif(ssType == 1)\n\t{\t\t\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t// switch ofdm path\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x11);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x1);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81111111);\n\t\t// switch cck patch\n\t\t//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x1);\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x81);\n\t\tmimoPs=BTC_MIMO_PS_STATIC;\n\t}\n\telse if(ssType == 2)\n\t{\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xc04, 0x33);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xd04, 0x3);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x90c, 0x81121313);\n\t\t// remove, if 0xe77[2]=0x0 then CCK will fail, advised by Jenyu\n\t\t//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xe77, 0x4, 0x0);\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xa07, 0x41);\n\t\tmimoPs=BTC_MIMO_PS_DYNAMIC;\n\t}\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimoPs);\t// set rx 1ss or 2ss\n}\n\nVOID\nhalbtc8192e2ant_SwitchSsType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\tnewSsType\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], %s Switch SS Type = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), newSsType));\n\tpCoexDm->curSsType = newSsType;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preSsType == pCoexDm->curSsType) \n\t\t\treturn;\n\t}\n\thalbtc8192e2ant_SetSwitchSsType(pBtCoexist, pCoexDm->curSsType);\n\n\tpCoexDm->preSsType = pCoexDm->curSsType;\n}\n\nVOID\nhalbtc8192e2ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e2ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\tBOOLEAN \tbApEnable=FALSE;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tpsType = BTC_PS_WIFI_NATIVE;\n\t\tlpsVal = 0x0;\n\t\trpwmVal = 0x0;\t\t\n\t}\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8192e2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8192e2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8192e2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\nVOID\nhalbtc8192e2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n    halbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8192e2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\t\n\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8192e2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\thalbtc8192e2ant_SwitchSsType(pBtCoexist, FORCE_EXEC, 2);\n\t\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n//\tBOOLEAN\tbLowPwrDisable=TRUE;\n\t\n//\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n//\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1);\n\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionWiFiLinkProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\n}\n\nBOOLEAN\nhalbtc8192e2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbBtHsOn=FALSE, bLowPwrDisable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist)\n\t{\n\t\thalbtc8192e2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 0, 0, 0);\n\t}\n\telse\n\t{\n\t\thalbtc8192e2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t}\n\n\tif(!bWifiConnected)\n\t{\n//\t\tbLowPwrDisable = FALSE;\n//\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\t\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-connected idle!!\\n\"));\n\n\t\tif( (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ||\n\t\t\t(BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t\t{\n//\t\t\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\t\t\t\n//\t\t\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\t\n\t\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n \t\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif(BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n//\t\t\tbLowPwrDisable = FALSE;\n//\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n//\t\t\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\t\t\n\t\t\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse if(BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n//\t\t\tbLowPwrDisable = TRUE;\n//\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bBtHsOn)\n\t\t\t\treturn FALSE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n//\t\t\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8192e2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse\n\t\t{\n//\t\t\tbLowPwrDisable = TRUE;\n//\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bWifiBusy)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t\t\tbCommon = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\n\t\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n//\t\t\t\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\n\t\t\t\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\t\n\t\t\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\t\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t\t\tbCommon = TRUE;\n\t\t\t}\n\t\t}\t\n\t}\n\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8192e2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist//,\n\t//IN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], halbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow()\\n\"));\n#if 0\n\tif( (BT_8192E_2ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8192E_2ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8192E_2ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 81 &&\n\t\t\tpCoexDm->curPsTdma != 82 &&\n\t\t\tpCoexDm->curPsTdma != 83 &&\n\t\t\tpCoexDm->curPsTdma != 84 )\n\t\t{\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n#endif\n\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\tretryCount = pCoexSta->btRetryCnt;\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(!pCoexDm->bAutoTdmaAdjustLowRssi)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\\n\"));\n\n/*\n\t\tif(BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt))\n\t\t{\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t}\n\t\telse\n*/\n\t\t{\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81);\n\t\tpCoexDm->psTdmaDuAdjType = 81;\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n//\t\tretryCount = pCoexSta->btRetryCnt;\n//\t\tbtInfoExt = pCoexSta->btInfoExt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\t\t\n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n/*\n\t\t\tif( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) )\n\t\t\t\tif( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t\t((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) )\n\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 84;\n\t\t\t}\n*/\n\t\t\tif(pCoexDm->curPsTdma == 80)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 81;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 81)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 82)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 83)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 84;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n/*\n\t\t\tif( (BT_INFO_8192E_2ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) )\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n*/\n\t\t\tif(pCoexDm->curPsTdma == 84)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 83)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 82)\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 81;\n\t\t\t}\n\t\t\telse if((pCoexDm->curPsTdma == 81)&&((pCoexSta->nScanAPNum <= NOISY_AP_NUM_THRESH)))\n\t\t\t{\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 80);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 80;\n\t\t\t}\n\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 80 &&\n\t\t\tpCoexDm->curPsTdma != 81 &&\n\t\t\tpCoexDm->curPsTdma != 82 &&\n\t\t\tpCoexDm->curPsTdma != 83 &&\n\t\t\tpCoexDm->curPsTdma != 84 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8192e2ant_GetBtRssiThreshold(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\t\tpThres0,\n\tIN\tpu1Byte\t\t\t\tpThres1\n\t)\n{\n\tu1Byte antType, btThreshold=0;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &antType);\n\n\tswitch(antType)\n\t{\n\t\tcase BTC_ANT_TYPE_0:\t// 92E with SPDT\n\t\t\t*pThres0 = 100;\n\t\t\t*pThres1 = 100;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_1:\t//92E without SPDT, poor antenna isolation\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_2:\t//92E without SPDT, normal antenna isolation\n\t\t\t*pThres0 = 34;\t\t//92E with coupler, goodl antenna isolation\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_3:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_4:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n//undefined\nVOID\nhalbtc8192e2ant_ActionUndefined(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\t// coex table\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\t// pstdma\n\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\n\t// decrease BT power\n\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8192e2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\t\tu4Byte\t\twifiBw;\n\t\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\t\tBOOLEAN \tbApEnable=FALSE;\n\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\t\n\t\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\t\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\t\n\t\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\t\n\t\t// power save state\n\t\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t//\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, TRUE, 0x50, 0x4);\n\t\n\t\t// coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\telse\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\t\t// pstdma\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)))\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\telse\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\n\t\t// decrease BT power\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionScoPan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\tBOOLEAN \t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\telse\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\n\t// pstdm\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\t//shielding room\n\telse if (BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 10);\t//open space\t//antenna at BT\n\telse\t//low RSSI\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n\n\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tanttype=0;\n\tBOOLEAN \tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype);\n\n//\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\tif(anttype == 0)//ANTTYPE = 0   92E 2ant with SPDT\n\t{\n\t\t// power save state & pstdma & coex table\n       \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n       \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n\t// power save state\n\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t// decrease BT power\n\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8192e2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tanttype=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype);\n\n//\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n//\tanttype = 4;\n\n\tif(anttype == 0)//ANTTYPE = 0   92E 2ant with SPDT\n\t{\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\t//shielding room\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x06);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n//\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1);\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\n\tif( (btRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_LOW) )\n\t{\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if( (btRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) )\n\t{\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2);\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2);\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\t//shielding room\n\telse if (BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\t//open space\t//antenna at BT\n\telse\t//low RSSI\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85);\n\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8192e2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n//\thalbtc8192e2ant_SwitchSsType(pBtCoexist, NORMAL_EXEC, 1);\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\n\tif( (btRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_LOW) )\n\t{\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if( (btRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_MEDIUM) )\n\t{\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8192e2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\t//shielding room\n\telse if (BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\t//open space\t//antenna at BT\n\telse\t//low RSSI\n{\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;   \n                pCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n}\n\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\telse\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdm\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t    halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\t//shielding room\n\telse if (BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t    halbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\t//open space\t//antenna at BT\n\telse\t//low RSSI\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8192e2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\telse\n\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); //6\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\t//shielding room\n\telse if (BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\t//open space\t//antenna at BT\n\telse\t//low RSSI\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;   \n                pCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t\thalbtc8192e2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n         }\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0, anttype=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &anttype);\n\t\n\t//\thalbtc8192e2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\t//\tbtRssiState = halbtc8192e2ant_BtRssiState(3, btThresh0, btThresh1);\n\t\n\twifiRssiState = halbtc8192e2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8192e2ant_BtRssiState(3, 34, 42);\n\t\n\tif(anttype == 0)//ANTTYPE = 0\t92E 2ant with SPDT\n\t{\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8192e2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8192e2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8192e2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH)  // BT HIGH RSSI & shielding room\n\t\thalbtc8192e2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t\t\n\t// limited Rx\n\thalbtc8192e2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\t\n\t// fw dac swing level\n\thalbtc8192e2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t// sw mechanism\n\thalbtc8192e2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t//shielding room\n\telse if(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH))\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x06); \t//open space \n\telse\t//low RSSI\n\t\thalbtc8192e2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8192e2ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\n}\n\nVOID\nhalbtc8192e2ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\n}\n\nVOID\nhalbtc8192e2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\talgorithm = halbtc8192e2ant_ActionAlgorithm(pBtCoexist);\n\tif(pCoexSta->bC2hBtInquiryPage && (BT_8192E_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8192e2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpCoexDm->curAlgorithm = algorithm;\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\tif(halbtc8192e2ant_IsCommonAction(pBtCoexist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t}\n\telse\n\t{\n\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t\t}\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_SCO_PAN:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO+PAN(EDR).\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionScoPan(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8192E_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = undefined!!\\n\"));\n\t\t\t\thalbtc8192e2ant_ActionUndefined(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8192e2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\tif(bBackUp)\n\t{\n\t\t// backup rf 0x1e value\n\t\tpCoexDm->btRf0x1eBackup = \n\t\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\n\t// antenna sw ctrl to bt\n\thalbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\n\n\thalbtc8192e2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\t// antenna switch control parameter\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x858, 0x55555555);\n\n\t// coex parameters\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t// enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\t// enable PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\t// enable mailbox interface\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x40);\n\tu2Tmp |= BIT9;\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x40, u2Tmp);\n\n\t// enable PTA I2C mailbox \n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x101);\n\tu1Tmp |= BIT4;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x101, u1Tmp);\n\n\t// enable bt clock when wifi is disabled.\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x93);\n\tu1Tmp |= BIT0;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x93, u1Tmp);\n\t// enable bt clock when suspend.\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7);\n\tu1Tmp |= BIT0;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp);\n}\n\n//============================================================\n// work around function start with wa_halbtc8192e2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8192e2ant_\n//============================================================\nVOID\nEXhalbtc8192e2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8192e2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8192e2ant_InitHwConfig(pBtCoexist, TRUE);\n}\n\nVOID\nEXhalbtc8192e2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8192e2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192e2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu2Byte\t\t\t\tu2Tmp[4];\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Antenna type:\", \\\n\t\tpBoardInfo->antType);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8192E_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8192e2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n/*\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"SS Type\", \\\n\t\tpCoexDm->curSsType);\n\tCL_PRINTF(cliBuf);\n*/\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\tpBtCoexist->btInfo.raMask);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tpsTdmaCase = pCoexDm->curPsTdma;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)\", \"PS TDMA\", \\\n\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\tpCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\tpCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"backup ARFR1/ARFR2/RL/AMaxTime\", \\\n\t\tpCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\tu2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"0x430/0x434/0x42a/0x456\", \\\n\t\tu4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc04);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xd04);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x90c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0xc04/ 0xd04/ 0x90c\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x778\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x92c);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x92c/ 0x930\", \\\n\t\t(u1Tmp[0]), u4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4f);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x40/ 0x4f\", \\\n\t\tu1Tmp[0], u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(hp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(lp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 1)\n\thalbtc8192e2ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8192e2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8192e2ant_CoexAllOff(pBtCoexist);\n\t\thalbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8192e2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8192e2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\n\n\t}\n}\n\nVOID\nEXhalbtc8192e2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8192e2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\t\n}\n\nVOID\nEXhalbtc8192e2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8192e2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8192E_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8192E_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8192E_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\t\t\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif( (pCoexSta->btInfoExt & BIT3) )\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8192e2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n\n#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8192e2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8192E_2ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8192E_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8192E_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8192E_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\n\thalbtc8192e2ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tif(!(btInfo&BT_INFO_8192E_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8192E_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8192E_2ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8192E_2ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8192E_2ANT_B_ACL_BUSY)\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8192E_2ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\t\n\tif( (BT_8192E_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbBtBusy = TRUE;\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8192e2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8192e2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8192e2ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\thalbtc8192e2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\tEXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8192e2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\", \n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\", \n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\", \n\t\t\tGLCoexVerDate8192e2Ant, GLCoexVer8192e2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)\n\thalbtc8192e2ant_QueryBtInfo(pBtCoexist);\n\thalbtc8192e2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8192e2ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\tif( halbtc8192e2ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust)\n\t{\n\t\thalbtc8192e2ant_RunCoexistMechanism(pBtCoexist);\n\t}\n#endif\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8192e2Ant.h",
    "content": "//===========================================\n// The following is for 8192E 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8192E_2ANT\t\t\t\t0\n\n#define\tBT_INFO_8192E_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8192E_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8192E_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8192E_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8192E_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8192E_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8192E_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8192E_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8192E_2ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8192E_2ANT\t\t2\n#define \tNOISY_AP_NUM_THRESH\t\t\t\t\t\t5\n\ntypedef enum _BT_INFO_SRC_8192E_2ANT{\n\tBT_INFO_SRC_8192E_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8192E_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8192E_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8192E_2ANT_MAX\n}BT_INFO_SRC_8192E_2ANT,*PBT_INFO_SRC_8192E_2ANT;\n\ntypedef enum _BT_8192E_2ANT_BT_STATUS{\n\tBT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8192E_2ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8192E_2ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8192E_2ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8192E_2ANT_BT_STATUS_MAX\n}BT_8192E_2ANT_BT_STATUS,*PBT_8192E_2ANT_BT_STATUS;\n\ntypedef enum _BT_8192E_2ANT_COEX_ALGO{\n\tBT_8192E_2ANT_COEX_ALGO_UNDEFINED\t\t= 0x0,\n\tBT_8192E_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8192E_2ANT_COEX_ALGO_SCO_PAN\t\t\t= 0x2,\n\tBT_8192E_2ANT_COEX_ALGO_HID\t\t\t\t= 0x3,\n\tBT_8192E_2ANT_COEX_ALGO_A2DP\t\t\t= 0x4,\n\tBT_8192E_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x5,\n\tBT_8192E_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x6,\n\tBT_8192E_2ANT_COEX_ALGO_PANHS\t\t\t= 0x7,\n\tBT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x8,\n\tBT_8192E_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x9,\n\tBT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0xa,\n\tBT_8192E_2ANT_COEX_ALGO_HID_A2DP\t\t= 0xb,\n\tBT_8192E_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xc\n}BT_8192E_2ANT_COEX_ALGO,*PBT_8192E_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8192E_2ANT{\n\t// fw mechanism\n\tu1Byte\t\tpreBtDecPwrLvl;\n\tu1Byte\t\tcurBtDecPwrLvl;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjustLowRssi;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu1Byte\t\tpreSsType;\n\tu1Byte\t\tcurSsType;\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tcurRaMaskType;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n} COEX_DM_8192E_2ANT, *PCOEX_DM_8192E_2ANT;\n\ntypedef struct _COEX_STA_8192E_2ANT{\t\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8192E_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8192E_2ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\n\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\n\tu1Byte\t\t\t\t\tdisVerInfoCnt;\n}COEX_STA_8192E_2ANT, *PCOEX_STA_8192E_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8192e2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8192e2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8192e2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8192e2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8192e2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8703b1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8703B Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8703b1Ant.tmh\"\n#endif\n\n//#include <Math.h>\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8703B_1ANT\t\tGLCoexDm8703b1Ant;\nstatic PCOEX_DM_8703B_1ANT \tpCoexDm=&GLCoexDm8703b1Ant;\nstatic COEX_STA_8703B_1ANT\t\tGLCoexSta8703b1Ant;\nstatic PCOEX_STA_8703B_1ANT\tpCoexSta=&GLCoexSta8703b1Ant;\nstatic PSDSCAN_STA_8703B_1ANT\tGLPsdScan8703b1Ant;\nstatic PPSDSCAN_STA_8703B_1ANT pPsdScan = &GLPsdScan8703b1Ant;\n\n\nconst char *const GLBtInfoSrc8703b1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8703b1Ant=20150413;\nu4Byte\tGLCoexVer8703b1Ant=0x01;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8703b1ant_\n//============================================================\nu1Byte\nhalbtc8703b1ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8703b1ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8703b1ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8703b1ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8703b1ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8703b1ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8703b1ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8703b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8703b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8703b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8703b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8703b1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8703b1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8703b1ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8703b1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp, u4Tmp1;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp, u1Tmp1;\n\ts4Byte\t\t\twifiRssi;\n\tstatic u1Byte\t\tNumOfBtCounterChk = 0;\n\t\n       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\n\t//if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\t//pCoexSta->highPriorityTx = 65535;\n\t\t//pCoexSta->highPriorityRx = 65535;\n\t\t//pCoexSta->lowPriorityTx = 65535;\n\t\t//pCoexSta->lowPriorityRx = 65535;\n\t\t//return;\n\t}\n\t\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif( (pCoexSta->lowPriorityTx > 1150)  && (!pCoexSta->bC2hBtInquiryPage))\n\t\tpCoexSta->popEventCnt++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\\n\",\n\t\tregHPRx, regHPTx, regLPRx, regLPTx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n\n\tif ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\n\t{\n\t\tNumOfBtCounterChk++;\n\t\tif (NumOfBtCounterChk >= 3)\n\t\t{\n\t\t\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n\t\t\tNumOfBtCounterChk = 0;\n\t\t}\n\t}\n}\n\n\nVOID\nhalbtc8703b1ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\tu4Byte\tTotalCnt;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n\n\tif ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\n\t{\n\t\tTotalCnt = pCoexSta->nCRCOK_CCK + pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \n\t\t\t\tpCoexSta->nCRCOK_11nAgg;\n\t\n\t\tif ( (pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_ACL_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8703B_1ANT_BT_STATUS_SCO_BUSY) )\n\t\t{\n\t\t\tif (pCoexSta->nCRCOK_CCK >(TotalCnt -pCoexSta->nCRCOK_CCK)) \n\t\t\t{\n\t\t\t\tif (nCCKLockCounter < 3)\n\t\t\t\t nCCKLockCounter++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter > 0)\n\t\t\t\t nCCKLockCounter--;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (nCCKLockCounter > 0)\n\t\t\t  nCCKLockCounter--;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter > 0)\n\t\t\tnCCKLockCounter--;\n\t}\n\n\tif (!pCoexSta->bPreCCKLock)\n\t{\n\n\t\tif (nCCKLockCounter >= 3)\n\t\t pCoexSta->bCCKLock = TRUE;\n\t\telse\n\t\t pCoexSta->bCCKLock = FALSE;\t\t\t\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter == 0)\n\t\t pCoexSta->bCCKLock = FALSE;\n\t\telse\n\t\t pCoexSta->bCCKLock = TRUE;\t\t\n\t}\n\n\tif  (pCoexSta->bCCKLock)\n\t\tpCoexSta->bCCKEverLock = TRUE;\n\t\n\tpCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;\t\n\t\t\n\n}\n\nBOOLEAN\nhalbtc8703b1ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN bWifiConnected=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8703b1ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\tpBtLinkInfo->bBtHiPriLinkExist = pCoexSta->bBtHiPriLinkExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nVOID\nhalbtc8703b1ant_UpdateWifiChannelInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tBOOLEAN\t\t\tbWifiUnderBMode = FALSE;\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;  //enable BT AFH skip WL channel for 8703b because BT Rx LO interference\n\t\t//H2C_Parameter[0] = 0x0;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n\n}\n\nu1Byte\nhalbtc8703b1ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8703B_1ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO only\\n\"));\n\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID only\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8703b1ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8703b1ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8703b1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8703b1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\") ));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8703b1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nu4Byte\nhalbtc8703b1ant_LTECoex_InDirectReadReg(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN \tu2Byte\t\t\t\tRegAddr\n)\t\n{\n\tu4Byte j =0;\n\n\t\n\t//wait for ready bit before access 0x7c0\t\t\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c0, 0x800F0000|RegAddr);\n\n\tdo\n\t{\n\t\tj++;\n\t}while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j <BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT) );\n\n\n\treturn(pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x7c8));   //get read data\n\n}\n\nVOID\nhalbtc8703b1ant_LTECoex_InDirectWriteReg(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN \tu2Byte\t\t\t\tRegAddr,\nIN \tu4Byte\t\t\t\tBitMask,\nIN\tu4Byte\t\t\t\tRegValue\n)\n{\n\tu4Byte val, i=0, j=0, bitpos = 0;\n\t\n\n\tif (BitMask == 0x0)\n\t return;\t\n\tif (BitMask == 0xffffffff)\n\t{\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c4, RegValue); //put write data\n\n\t\t//wait for ready bit before access 0x7c0\n\t\tdo\n\t\t{\n\t\t\tj++;\n\t\t}while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j <BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT) );\n\t\t\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c0, 0xc00F0000|RegAddr);\n\t}\n\telse\n\t{\n            for(i=0; i<=31; i++)\n            \t{\n\t\t\tif ( ((BitMask >> i) & 0x1) == 0x1)\n\t\t\t{\n\t\t\t\tbitpos = i;\n\t\t\t\tbreak;\n\t\t\t}\n            \t}\n\n\t\t//read back register value before write \n\t\tval = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, RegAddr);\n\t\tval = (val & (~BitMask)) | (RegValue << bitpos);\n\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c4, val); //put write data\n\n\t\t//wait for ready bit before access 0x7c0\t\t\n\t\tdo\n\t\t{\n\t\t\tj++;\n\t\t}while( ((pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7c3) & BIT5) ==0) && (j <BT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT) );\n\t\t\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x7c0, 0xc00F0000|RegAddr);\n\t\t\n\t}\n\n}\n\nvoid\nhalbtc8703b1ant_LTECoex_Enable(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tBOOLEAN\t\t\t\tbEnable\n)\n{\n\tu1Byte val;\n\t\n\tval =  (bEnable)? 1 : 0; \n\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, 0x80, val);  //0x38[7]\n\n}\n\nvoid\nhalbtc8703b1ant_LTECoex_PathControlOwner(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tBOOLEAN\t\t\t\tbWiFiControl\n)\n{\n\tu1Byte val;\n\t\n\tval =  (bWiFiControl)? 1 : 0; \n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x73, 0x4, val); //0x70[26]\n\n}\n\nvoid\nhalbtc8703b1ant_LTECoex_Set_GNT_BT(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tu1Byte\t\t\t\tnControlBlock,\nIN\tBOOLEAN\t\t\t\tbSWControl,\nIN\tu1Byte\t\t\t\tnState\n)\n{\n\tu4Byte val=0, BitMask;\n\t\n\tnState = nState & 0x1;\t\n\tval =  (bSWControl)? ((nState<<1) | 0x1) : 0; \n\n\tswitch(nControlBlock)\n\t{\n\t\tcase RFC_AND_BB:\t\n\t\tdefault:\n\t\t\tBitMask = 0xc000;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[15:14]\n\t\t\tBitMask = 0x0c00;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[11:10]\t\t\t\t\t\t\n\t\t\tbreak;\n\t\tcase RFC_ONLY:\n\t\t\tBitMask = 0xc000;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[15:14]\n\t\t\tbreak;\n\t\tcase BB_ONLY:\n\t\t\tBitMask = 0x0c00;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[11:10]\n\t\t\tbreak;\n\n\t}\n\t\n}\n\nvoid\nhalbtc8703b1ant_LTECoex_Set_GNT_WL(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tu1Byte\t\t\t\tnControlBlock,\nIN\tBOOLEAN\t\t\t\tbSWControl,\nIN\tu1Byte\t\t\t\tnState\n)\n{\n\tu4Byte val=0, BitMask;\n\t\n\tnState = nState & 0x1;\t\n\tval =  (bSWControl)? ((nState<<1) | 0x1) : 0; \n\n\tswitch(nControlBlock)\n\t{\n\t\tcase RFC_AND_BB:\t\n\t\tdefault:\n\t\t\tBitMask = 0x3000;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[13:12]\n\t\t\tBitMask = 0x0300;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[9:8]\t\t\t\t\t\t\n\t\t\tbreak;\n\t\tcase RFC_ONLY:\n\t\t\tBitMask = 0x3000;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[13:12]\n\t\t\tbreak;\n\t\tcase BB_ONLY:\n\t\t\tBitMask = 0x0300;\n\t\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, 0x38, BitMask, val); // 0x38[9:8]\n\t\t\tbreak;\n\n\t}\n\n}\n\nvoid\nhalbtc8703b1ant_LTECoex_Set_CoexTable(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tu1Byte\t\t\t\tnTableType,\nIN\tu2Byte\t\t\t\tnTableContent\n)\n{\n \tu2Byte RegAddr = 0x0000;\n\n\tswitch(nTableType)\n\t{\n\t\tcase WL_VS_LTE:\n\t\t\tRegAddr = 0xa0;\n\t\t\tbreak;\n\t\tcase BT_VS_LTE:\n\t\t\tRegAddr = 0xa4;\n\t\t\tbreak;\n\t}\n\n\tif (RegAddr != 0x0000)\n\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, RegAddr, 0xffff, nTableContent); // 0xa0[15:0] or 0xa4[15:0]\n\n\n}\n\n\nvoid\nhalbtc8703b1ant_LTECoex_Set_BreakTable(\nIN\tPBTC_COEXIST\t\tpBtCoexist,\nIN\tu1Byte\t\t\t\tnTableType,\nIN\tu1Byte\t\t\t\tnTableContent\n)\n{\n\tu2Byte RegAddr = 0x0000;\n\n\tswitch(nTableType)\n\t{\n\t\tcase WL_BREAK_LTE:\n\t\t\tRegAddr = 0xa8;\n\t\t\tbreak;\n\t\tcase BT_BREAK_LTE:\n\t\t\tRegAddr = 0xac;\n\t\t\tbreak;\n\t\tcase LTE_BREAK_WL:\n\t\t\tRegAddr = 0xb0;\n\t\t\tbreak;\n\t\tcase LTE_BREAK_BT:\n\t\t\tRegAddr = 0xb4;\n\t\t\tbreak;\t\n\t}\n\n\tif (RegAddr != 0x0000)\n\t\thalbtc8703b1ant_LTECoex_InDirectWriteReg(pBtCoexist, RegAddr, 0xff, nTableContent); // 0xa8[15:0] or 0xb4[15:0]\n\n\n}\n\nVOID\nhalbtc8703b1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8703b1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8703b1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8703b1ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\n\tu4Byte\tnBreakTable;\n\tu1Byte\tnSelectTable;\t\n\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], ********** CoexTable(%d) **********\\n\", type));\n\t\n\tpCoexSta->nCoexTableType = type;\n\n\tif (pCoexSta->bConCurrentRxModeOn == true)\n\t{\n\t\tnBreakTable = 0xf0ffffff;  //set WL hi-pri can break BT\n\t\tnSelectTable = 0xb; \t\t//set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS)\n\t}\n\telse\n\t{\n\t\tnBreakTable = 0xffffff;\n\t\tnSelectTable = 0x3;\n\t}\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa5a5a5a, 0xaa5a5a5a, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaa5a5a5a, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tif (  (pCoexSta->bCCKEverLock)  &&  (pCoexSta->nScanAPNum <= 5) )\n\t\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaaaa5a5a, nBreakTable, nSelectTable);\n\t\t\telse\n\t\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaa5a5a5a, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tif (  (pCoexSta->bCCKEverLock)  &&  (pCoexSta->nScanAPNum <= 5) )\n\t\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa555555, 0xaaaa5a5a, nBreakTable, nSelectTable);\n\t\t\telse\n\t\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaa5a5a5a, 0xaa5a5a5a, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, nBreakTable, nSelectTable);\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\thalbtc8703b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, nBreakTable, nSelectTable);\n\t\t\tbreak;\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8703b1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8703b1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8703b1ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8703b1ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8703b1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8703b1ant_SwMechanism(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN \t\tbLowPenaltyRA\n\t) \n{\n\thalbtc8703b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8703b1ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\tfwVer=0, u4Tmp=0, cntBtCalChk=0;\n\tBOOLEAN\t\t\tbPgExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbUseExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbIsInMpMode = FALSE;\n\tu1Byte\t\t\tH2C_Parameter[2] ={0}, u1Tmp = 0;\n\tu4Byte\t\t\tu4Tmp1=0, u4Tmp2=0;\n\n\tpCoexDm->curAntPosType = antPosType;\t\n\n#if 1\t\n\t\tu4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38);\n\t\tu4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54);\n\t\tu1Tmp  = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** (Before Setup) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\\n\", u1Tmp, u4Tmp1, u4Tmp2));\n#endif\n\n\tif(bInitHwCfg)\n\t{\t\n\t\t//Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required)\n\t\thalbtc8703b1ant_LTECoex_Enable(pBtCoexist, 0x0);\n\n\t\t//GNT_WL_LTE always = 1 (this should be config if LTE coex is required)\n\t\thalbtc8703b1ant_LTECoex_Set_CoexTable(pBtCoexist, WL_VS_LTE, 0xffff);\n\n\t\t//GNT_BT_LTE always = 1 (this should be config if LTE coex is required)\n\t\thalbtc8703b1ant_LTECoex_Set_CoexTable(pBtCoexist, BT_VS_LTE, 0xffff);\n\n\t\t// Wait If BT IQK running, because Path control owner is at BT during BT IQK (setup by WiFi firmware)  \n\t\twhile(cntBtCalChk <= 20)\n\t\t{\n\t\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);\n\t\t\t\tcntBtCalChk++;\n\t\t\t\tif(u1Tmp & BIT0)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\\n\", cntBtCalChk));\n\t\t\t\t\tdelay_ms(50);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\\n\", cntBtCalChk));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t}\n\t\t\n\t\t//set Path control owner to WL at initial step\n\t\thalbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL);\t\t\t\n\t}\n\telse if(bWifiOff)\n\t{\t\t\n\t\t//Disable LTE Coex Function in WiFi side \n\t\thalbtc8703b1ant_LTECoex_Enable(pBtCoexist, 0x0);\n\n\t\t//if MP mode\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\n\t\tif(bIsInMpMode)\t\n\t\t\thalbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL); //set Path control owner to BT\n\t\telse\n\t\t\thalbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, BTSIDE_CONTROL);//set Path control owner to WiFi\t\t\t\n\t}\n\telse\n\t{\t\t\t\n\t\t\t//\n\t}\n\t\n\t\n\tif(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType) || bInitHwCfg || bWifiOff)\n\t{\n\t\t// internal switch setting\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\t\t// set GNT_BT to low\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW);\n\t\t\t\t//Set GNT_WL to high\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH);\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_PATH_BT:\n\t\t\t\t// set GNT_BT to high\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH);\n\t\t\t\t//Set GNT_WL to low\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tcase BTC_ANT_PATH_PTA:\n\t\t\t\t// set GNT_BT to PTA\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_PTA, SET_BY_HW);\n\t\t\t\t//Set GNT_WL to PTA\n\t\t\t\thalbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_PTA, SET_BY_HW);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n#if 1\n\tu4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38);\n\tu4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54);\n\tu1Tmp  = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73);\n\n\tif(bInitHwCfg)\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** (After Init) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\\n\", u1Tmp, u4Tmp1, u4Tmp2));\n\telse if (bWifiOff)\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** (After WiFi off) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\\n\", u1Tmp, u4Tmp1, u4Tmp2));\n\telse\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** (After Run time) 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\\n\", u1Tmp, u4Tmp1, u4Tmp2));\n#endif\t\n\t\n\tpCoexDm->preAntPosType = pCoexDm->curAntPosType;\n}\n\n\nVOID\nhalbtc8703b1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8703b1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0, rssiAdjustVal=0;\n\tu1Byte\t\t\tpsTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\tstatic BOOLEAN\t bPreWifiBusy=FALSE;\n\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\t\n\n\tif (bWifiBusy != bPreWifiBusy)\n\t{\n\t\tbForceExec = TRUE;\t\n\t\tbPreWifiBusy = bWifiBusy;\n\t}\n\n\tif (pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(off, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t}\n\t\t\t\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\n\n\tif (pCoexSta->nScanAPNum <= 5)\n\t\tnWiFiDurationAdjust = 5;\n\t\t//nWiFiDurationAdjust = 2;\n\telse if  (pCoexSta->nScanAPNum >= 40)\n\t\tnWiFiDurationAdjust = -15;\t\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t\tnWiFiDurationAdjust = -10;\t\n\t\n\tif ((type == 1) || (type == 2) || (type == 9) || (type == 11) || (type == 101)\n\t\t|| (type == 102) || (type == 109) || (type == 101))\n\t{\n\t\tif (!pCoexSta->bForceLpsOn)  //Native power save TDMA, only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot\n\t}\n\t\telse\n\t\t{\n\t\t\tpsTdmaByte0Val = 0x51;  //null-pkt\n\t\t\tpsTdmaByte3Val = 0x10; //tx-pause at BT-slot\n\t\t\tpsTdmaByte4Val = 0x50; // 0x778 = d/1 toggle, dynamic slot\n\t\t}\n\t}\n\telse if ((type == 3) || (type == 13) || (type == 14) || (type == 103) || (type == 113) || (type == 114))\n\t{\n\t\tpsTdmaByte0Val = 0x51;  //null-pkt\n\t\tpsTdmaByte3Val = 0x10; //tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot\n#if 0\t\n\t\tif (!bWifiBusy)\n\t\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n#endif\t\t\n\t}\n\telse  //native power save case\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x11; // 0x778 = d/1 toggle, no dynamic slot\n\t\t//psTdmaByte4Va is not defne for 0x778 = d/1, 1/1 case \n\t\t}\n\t\t \n\t//if (pBtLinkInfo->bSlaveRole == TRUE)\n\tif ((pBtLinkInfo->bSlaveRole == TRUE)\t&& (pBtLinkInfo->bA2dpExist))\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\t\n\tif (type > 100)\n\t{\n\t\tpsTdmaByte0Val = psTdmaByte0Val | 0x82; //set antenna control by SW\t\n\t\tpsTdmaByte3Val = psTdmaByte3Val | 0x60;  //set antenna no toggle, control by antenna diversity\n\t}\n\n\t\t\n\tif(bTurnOn)\n\t{\t \n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\t if (pCoexSta->nScanAPNum <= 3) // for Lenovo CPT test A2DP + OPP\n\t\t\t\t \thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\t else\t\n\t\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 20:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 30:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 31:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\n\t\t\t\tbreak;\n\t\t\tcase 32:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 33:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 34:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 35:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 36:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\n\t\t\t\t/* here softap mode screen off will cost 70-80mA for phone */\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\n\t\t\t\tbreak;\t\n\t\t\t\t\n\t\t\t//for 1-Ant translate to 2-Ant\t\n\t\t\tcase 101:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 102:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 103:\n\t\t\t\t//halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val);\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 105:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 106:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\t\n\t\t\tcase 109:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 111:\t\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\t\n\t\t\tcase 113:\n\t\t\t\t//halbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val);\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 114:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\t\n\t\t\tcase 120:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 122:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 132:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\t\n\t\t\tcase 133:\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\t\t\n\t\t\t\t\n\t\t}\n\t}\n\telse\n\t{\t\t\n\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 8: //PTA Control\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:  //Software control, Antenna at BT side\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1: // 2-Ant, 0x778=3, antenna control by antenna diversity\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n#if 0\n\t\t\tcase 9:   //Software control, Antenna at WiFi side\n\t\t\t\thalbtc8703b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\t\t\t\t\n\t\t\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\n\t\t\t\tbreak;\t\t\t\n#endif\n\t\t}\n\t}\n\trssiAdjustVal =0;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\n\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\tpBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948),   pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67)));\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nBOOLEAN\nhalbtc8703b1ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\\n\"));\n\t\t\n \t\t//halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t//halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT Busy!!\\n\"));\n\n\t\t//halbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif (bWifiBusy)\t\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t}\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8703b1ant_TdmaDurationAdjustForAcl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbWifiBusy = FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjustForAcl()\\n\"));\n\n\tif(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) \n\t\tbWifiBusy = TRUE;\n\telse\n\t\tbWifiBusy = FALSE;\t \t\n\n\tif( (BT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 3 &&\n\t\t\tpCoexDm->curPsTdma != 9 )\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n/*\t\t\tif( (BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse */ if(pCoexDm->curPsTdma == 1)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n/*\t\t\tif( (BT_INFO_8703B_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse */ if(pCoexDm->curPsTdma == 11)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t}\n\t\t}\n\t\telse\t  //no change\n\t\t{\n\t\t\t/* Bryant Modify\t\n\t\t\tif(bWifiBusy != bPreWifiBusy)  //if busy / idle change\n\t\t\t{\n\t\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma);\n\t\t\t}\n\t\t\t*/\n\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 9 &&\n\t\t\tpCoexDm->curPsTdma != 11 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b1ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b1ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8703b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8703b1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8703b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiOnly(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n}\n\nVOID\nhalbtc8703b1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t\thalbtc8703b1ant_ActionWifiOnly(pBtCoexist);\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n//=============================================\n//\n//\tSoftware Coex Mechanism start\n//\n//=============================================\n\n// SCO only or SCO+PAN(HS)\n\n/*\nVOID\nhalbtc8703b1ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n\nVOID\nhalbtc8703b1ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8703b1ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8703b1ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8703b1ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8703b1ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8703b1ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8703b1ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8703b1ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8703b1ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n*/\n\n//=============================================\n//\n//\tNon-Software Coex Mechanism start\n//\n//=============================================\nVOID\nhalbtc8703b1ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8703b1ant_ActionHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8703b1ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif ( (!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask) )\n\t{\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t \thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\t\n\t}\n\telse if( (pBtLinkInfo->bScoExist) || \t(pBtLinkInfo->bHidExist) || \t(pBtLinkInfo->bA2dpExist)  )\n\t{\n\t\t// SCO/HID/A2DP busy\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )\n\t{\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\n\t\t//for BT inquiry/page fail after S4 resume\n\t\t//halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\t\t\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse\n\t{\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t \thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\t\t\n\t\t\n\n\t\t//halbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t//halbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\t\t\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionBtScoHidOnlyBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// tdma and coex table\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n\telse //HID\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiConnectedBtAclBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tu1Byte\t\tbtRssiState;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tbtRssiState = halbtc8703b1ant_BtRssiState(2, 28, 0);\t\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tif(pBtLinkInfo->bHidOnly)  //HID\n\t{\n\t\thalbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\treturn;\n\t}\n\telse if(pBtLinkInfo->bA2dpOnly)  //A2DP\t\t\n\t{\n\t\tif(BT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\t}\n\t}\n\telse if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\n\t\t       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)\t\t\t\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\t//BT no-profile busy (0x9)\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33);\t\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\t\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiNotConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiNotConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t \telse\n\t \t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\t\n\t\t}\n\t}\n\telse if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiNotConnectedAssoAuth(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse if (pBtLinkInfo->bPanExist)   \t\t\t\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t \telse\n\t \t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\t}\n\telse if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiConnectedSpecialPacket(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN bWifiBusy = FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\t//no special packet process for both WiFi and BT very busy\n\tif ((bWifiBusy) && ((pBtLinkInfo->bPanExist) || (pCoexSta->nNumOfProfile >= 2)))\n\t return;\t\n\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist))\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\t\t\n\t}\n\telse if  (pBtLinkInfo->bA2dpExist)\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if(pBtLinkInfo->bPanExist)\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8703b1ant_ActionWifiConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbWifiBusy=FALSE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tBOOLEAN\t\tbUnder4way=FALSE, bApEnable=FALSE;\n\tu4Byte\t\twifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect()===>\\n\"));\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\tif(bUnder4way)\n\t{\n\t\thalbtc8703b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\\n\"));\n\t\treturn;\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tif(bScan)\t\n\t\t\thalbtc8703b1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\telse\n\t\t\thalbtc8703b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\n\t// power save state\n\tif(!bApEnable && BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\n\t{\n\t\tif(pBtCoexist->btLinkInfo.bA2dpOnly)\t//A2DP\n\t\t\t{\t\t\t\n\t\t\tif(!bWifiBusy)\n\t\t\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\n\t\t\telse //busy\n\t\t\t{\n\t\t\t\tif  (pCoexSta->nScanAPNum >= BT_8703B_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\n\t\t\t\t{\n\t\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\n \t\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\telse\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(!bWifiBusy)\n\t{\n\t\tif(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, \n\t\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist,\n\t\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse if( (BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8703b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse \n\t\t{\n\t\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\t\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b1ant_RunSwCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\t\talgorithm=0;\n\n\talgorithm = halbtc8703b1ant_ActionAlgorithm(pBtCoexist);\n\tpCoexDm->curAlgorithm = algorithm;\n\n\tif(halbtc8703b1ant_IsCommonAction(pBtCoexist))\n\t{\n\n\t}\n\telse\n\t{\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = SCO.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR).\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HS mode.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_1ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP.\\n\"));\n\t\t\t\t//halbtc8703b1ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = coexist All Off!!\\n\"));\n\t\t\t\t//halbtc8703b1ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8703b1ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbIncreaseScanDevNum=FALSE;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tBOOLEAN\tbMiracastPlusBt=FALSE;\n\tu1Byte\taggBufSize=5;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0, wifiBw;\n\tu1Byte\tiotPeer=BTC_IOT_PEER_UNKNOWN;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bBtWhckTest)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under WHCK TEST!!!\\n\"));\n\t\thalbtc8703b1ant_ActionBtWhckTest(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbIncreaseScanDevNum = TRUE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\n\t\tif ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\n\t\t\thalbtc8703b1ant_ActionBtInquiry(pBtCoexist);\n\t\t}\n\t\telse\n\t\thalbtc8703b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\n\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_IOT_PEER, &iotPeer);\n\n\t\tif(BTC_IOT_PEER_CISCO != iotPeer)\n\t\t{\n\t\t\tif(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist)\n\t\t\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\t\n\t\t\telse\n\t\t\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bScoExist)\n\t\t\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (BTC_WIFI_BW_HT40==wifiBw)\n\t\t\t\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10);\t\n\t\t\t\telse\n\t\t\t\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\t\t\t}\n\t\t}\n\n\t\thalbtc8703b1ant_SwMechanism(pBtCoexist, TRUE);\n\t\thalbtc8703b1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\n\t}\n\telse\n\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\n\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\n\t\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\thalbtc8703b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\t\n\t\thalbtc8703b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8703b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\t\n\tif(!bWifiConnected)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is non connected-idle !!!\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif(bScan || bLink || bRoam)\n\t\t{\n\t\t\t if (bScan)\t\n\t\t   \t\thalbtc8703b1ant_ActionWifiNotConnectedScan(pBtCoexist);\t\n\t\t\t else\n\t\t    \t\thalbtc8703b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\t\n\t\t}\n\t\telse\n\t\t\thalbtc8703b1ant_ActionWifiNotConnected(pBtCoexist);\n\t}\n\telse\t// wifi LPS/Busy\n\t{\n\t\thalbtc8703b1ant_ActionWifiConnected(pBtCoexist);\n\t}\n}\n\nu4Byte\nhalbtc8703b1ant_PSD_Log2Base(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tval\n\t\n\t)\n{\n\tu1Byte \ti,j;\n\tu4Byte\ttmp, tmp2, val_integerdB=0, tindex, shiftcount=0;\n\tu4Byte \tresult,val_fractiondB=0,Table_fraction[21]= {0,432, 332, 274, 232, 200,\n\t\t\t\t\t\t\t\t   174, 151,132,115,100,86,74,62,51,42,\n\t\t\t\t\t\t\t\t   32,23,15,7,0};\n\n\tif (val == 0)\n\t return 0;\n\n\ttmp = val;\n\n\twhile(1)\n\t{\n\t\tif (tmp == 1)\n\t\t\tbreak;\t\n\t\telse\n\t\t{\n\t\t\ttmp = (tmp >> 1);\n\t\t\tshiftcount++;\t\t\t\t\n\t\t}\n\t}\n\t\n\n\tval_integerdB = shiftcount+1;\n\n\ttmp2=1;\n\tfor (j=1; j<= val_integerdB;j++)\n\t  tmp2 = tmp2*2; \t\t\n\t\n\ttmp = (val*100) /tmp2;\n\ttindex = tmp/5;\n\n\tif (tindex > 20)\n\t tindex = 20;\n\n\tval_fractiondB = Table_fraction[tindex];\n\n\tresult = val_integerdB*100 - val_fractiondB;\t\t\t\n\n\treturn (result);\n\n\n}\n\nVOID\nhalbtc8703b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\n\t// sw all off\n\thalbtc8703b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\n\t//halbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t//halbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\tpCoexSta->popEventCnt = 0;\n}\n\nVOID\nhalbtc8703b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\t\tu4Tmp=0;//, fwVer;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\t\t\t\tu1Tmp=0, u1Tmpa=0, u1Tmpb=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\n\tu4Byte\t\t\t\tu4Tmp1=0, u4Tmp2=0;\n\n\t\t\t\n\tu4Tmp1 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38);\n\tu4Tmp2 = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** (Before Init HW config) 0x38= 0x%x, 0x54= 0x%x**********\\n\", u4Tmp1, u4Tmp2));\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\n\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1);  //enable TBTT nterrupt\n\n\t//BT report packet sample rate\t\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);\n\t\n\t// Enable BT counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\t\t\n\n\t//Enable PTA (3-wire function form BT side)\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n\n\t//Enable PTA (tx/rx signal form WiFi side)\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x4c6, 0x10, 0x1);\n\n\t//enable GNT_WL/GNT_BT debug signal to GPIO14/15\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x73, 0x8, 0x1);\n\n\t//enable GNT_WL\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x4e, 0x40, 0x0);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x1, 0x0);\n\n\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t\n\t//Antenna config\n\tif(bWifiOnly)\n\t{\n\t\tpCoexSta->bConCurrentRxModeOn = false;\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, FALSE, FALSE);\n\t}\n\telse\n\t{\n\t\tpCoexSta->bConCurrentRxModeOn = true;\t\t\n\t   \tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x953, 0x2, 0x1);\n\t\t//RF 0x1[0] = 0 -> Set GNT_WL_RF_Rx always = 1 for con-current Rx\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0x1, 0x0);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE);\n\t}\n\n\t// PTA parameter\n\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n}\n\n\n\nVOID\nhalbtc8703b1ant_PSD_ShowData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tpu1Byte\t\tcliBuf=pBtCoexist->cliBuf;\n\tu4Byte\t\tnDeltaFreqPerPoint;\n\tu4Byte\t\tfreq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2;\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n\\n============[PSD info]  (%d)============\\n\",\n\t\t \tpPsdScan->nPSDGenCount);\n\tCL_PRINTF(cliBuf);\n\n\tif (pPsdScan->nPSDGenCount == 0)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n No Data !!\\n\");\n\t\tCL_PRINTF(cliBuf);\n\t\treturn;\n\t}\n\n\tif (pPsdScan->nPSDPoint == 0)\n\t\tnDeltaFreqPerPoint = 0;\n\telse\t\t\t\n\t\tnDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\t\t\n\n\t//if (pPsdScan->bIsPSDShowMaxOnly)\n\tif (0)\n\t{\t\n\t\tPsdRep1 = pPsdScan->nPSDMaxValue/100;\n\t\tPsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100;\n\t\t\t\t\n\t\tfreq = ((pPsdScan->nRealCentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint);\n\t\tfreq1 = freq/1000000;\n\t\tfreq2 = freq/1000 - freq1 * 1000;\n\n\t\tif (freq2 < 100)\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq = %d.0%d MHz\",  \n\t\t\t  freq1, freq2);\n\t\telse\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq = %d.%d MHz\",  \n\t\t\t  freq1, freq2);\n\n\t\tif (PsdRep2 < 10)\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \", Value = %d.0%d dB, (%d) \\n\",  \n\t\t\t  PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue);\n\t\telse\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \", Value = %d.%d dB, (%d)\\n\",  \n\t\t\t  PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue);\n\t\t\n\t\tCL_PRINTF(cliBuf);\n\t}\n\telse\n\t{\n\t\tm = pPsdScan->nPSDStartPoint;\n\t\tn = pPsdScan->nPSDStartPoint;\n\t\ti = 1;\n\t\tj = 1;\t\t\t\t\n\n\t while(1)\n\t {\n\t\tdo\n\t\t{\n\t\t\tfreq = ((pPsdScan->nRealCentFreq-20) * 1000000 + m * nDeltaFreqPerPoint);\n\t\t\tfreq1 = freq/1000000;\n\t\t\tfreq2 = freq/1000 - freq1 * 1000;\n\t\t\t\n\t\t\tif (i ==1)\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.000\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.0%2d\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.%3d\", freq1,freq2);\n\t\t\t}\n\t\t\telse if  ( (i%8 == 0) || (m == pPsdScan->nPSDStopPoint) )\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.000\\n\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.0%2d\\n\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.%3d\\n\", freq1,freq2);\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.000\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.0%2d\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.%3d\", freq1,freq2);\n\t\t\t}\n\n\t\t\ti++;\t\t\t\t\t\n\t\t\tm++;\n\t\t\tCL_PRINTF(cliBuf);\n\n\t\t}while(  (i <= 8) && (m <= pPsdScan->nPSDStopPoint));\t\n\t\t\n\t\t\n\t\tdo\n\t\t{\n\t\t\tPsdRep1 = pPsdScan->nPSDReport_MaxHold[n]/100;\n\t\t\tPsdRep2 = pPsdScan->nPSDReport_MaxHold[n] - PsdRep1 * 100;\n\t\t\t\t\n\t\t\tif (j ==1)\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Val %7d.0%d\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Val %7d.%d\", PsdRep1,PsdRep2);\n\t\t\t}\n\t\t\telse if ( (j%8 == 0)  || (n == pPsdScan->nPSDStopPoint) )\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.0%d\\n\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.%d\\n\", PsdRep1,PsdRep2);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.0%d\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.%d\", PsdRep1,PsdRep2);\n\t\t\t}\n\n\t\t\tj++;\n\t\t\tn++;\n\t\t\tCL_PRINTF(cliBuf);\n\t\t\t\n\t\t} while(  (j <= 8) && (n <= pPsdScan->nPSDStopPoint));\t\t\n\n\t\tif  ( (m > pPsdScan->nPSDStopPoint) || (n > pPsdScan->nPSDStopPoint) )\n\t\t break;\n\t\telse\n\t\t{\n\t\t\ti = 1;\n\t\t\tj = 1;\n\t\t}\n\t\t\n\t }\t\n\t}\n\n\n}\n\nVOID\nhalbtc8703b1ant_PSD_MaxHoldData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tGenCount\n\t)\n{\n\t\t u4Byte\ti=0, i_max=0, val_max=0, j;\n\t\t \n\t\tif (GenCount== 1)\n\t\t{\n\t\t\tmemcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8703B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte));\n\n\t\t\tfor (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\n\t\t\t{\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\\n\", i,  pPsdScan->nPSDReport_MaxHold[i]));\n\t\t\t}\n\n\t\t\tpPsdScan->nPSDMaxValuePoint = 0;\n\t\t\tpPsdScan->nPSDMaxValue = 0;\n\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\tfor (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\n\t\t\t{\n\t\t\t\tif (pPsdScan->nPSDReport[i] > pPsdScan->nPSDReport_MaxHold[i])\n\t\t\t\t \tpPsdScan->nPSDReport_MaxHold[i] = pPsdScan->nPSDReport[i];\t\n\n\t\t\t\t//search Max Value\n\t\t\t\tif (i ==pPsdScan->nPSDStartPoint )\n\t\t\t\t{\n\t\t\t\t\ti_max = i;\n\t\t\t\t\tval_max = pPsdScan->nPSDReport_MaxHold[i];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pPsdScan->nPSDReport_MaxHold[i] > val_max)\n\t\t\t\t\t{\n\t\t\t\t\t\ti_max = i;\n\t\t\t\t\t\tval_max = pPsdScan->nPSDReport_MaxHold[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\\n\", i,  pPsdScan->nPSDReport_MaxHold[i]));\n\n\t\t\t}\n\t\n\t\t\tpPsdScan->nPSDMaxValuePoint = i_max;\n\t\t\tpPsdScan->nPSDMaxValue = val_max;\n\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i_Max = %d, PSDReport_Max = %d dB\\n\", pPsdScan->nPSDMaxValuePoint\n\t\t\t//\t\t,pPsdScan->nPSDMaxValue));\n\t\t}\n\n\n}\n\nu4Byte\nhalbtc8703b1ant_PSD_GetData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tnPoint\n\t)\n{\n\t//reg 0x808[9:0]: FFT data x\n\t//reg 0x808[22]: 0-->1 to get 1 FFT data y\n\t//reg 0x8b4[15:0]: FFT data y report\n\n\tu4Byte val = 0, psd_report =0;\n\t\n\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\n\tval &= 0xffbffc00;\n\tval |= nPoint;\n\t\n\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\tval |= 0x00400000;\n\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\n\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4);\n\n\tpsd_report = val & 0x0000ffff;\n\t \n\treturn psd_report;\n}\n\n\nVOID\nhalbtc8703b1ant_PSD_SweepPoint(\nIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tcentFreq,\n\tIN\ts4Byte\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\tpoints,\n\tIN\tu4Byte\t\t\t\tavgnum\n\t)\n{\n\tu4Byte\t i,val,n,k=0;\n\tu4Byte\tnPoints=0, psd_report=0;\n\tu4Byte\tnStartP=0, nStopP=0, nDeltaFreqPerPoint=156250;\n\tu4Byte    nPSDCenterFreq=20*10^6, freq,freq1,freq2;\t\n\tBOOLEAN outloop = FALSE;\n\tu1Byte\t flag = 0;\t\n\tu4Byte \ttmp, PsdRep1, PsdRep2;\n\tu4Byte\tWiFi_OriginalChannel = 1;\n\n\tpPsdScan->bIsPSDRunning = TRUE;\n\t\n\tdo\n\t{\n\t\tswitch(flag)\n\t\t{\n\t\t   case 0:  //Get PSD parameters\n\t\t   default:\t\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\\n\", \n\t\t       //     centFreq, offset, span));\n\n\t\t\tpPsdScan->nPSDBandWidth = 40*1000000;\n\t\t\tpPsdScan->nPSDPoint = points;\n\t\t\tpPsdScan->nPSDStartBase = points/2; \n\t\t\tpPsdScan->nPSDAvgNum = avgnum;\n\t\t\tpPsdScan->nRealCentFreq = centFreq;\n\t\t\tpPsdScan->nRealOffset = offset;\n\t\t\tpPsdScan->nRealSpan = span;\n\t\t\n\t\t\t\n\t\t\tnPoints = pPsdScan->nPSDPoint;\n\t\t\tnDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\n\n\t\t\t//PSD point setup\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\t\t\tval &= 0xffff0fff;\t\t\t\t\n\t\t\t\n\t\t\tswitch(pPsdScan->nPSDPoint)\n\t\t\t{\n\t\t\t\tcase 128:\n\t\t\t\t\tval |= 0x0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 256:\n\t\t\t\tdefault:\t\n\t\t\t\t\tval |=0x00004000;\n\t\t\t\t \tbreak;\n\t\t\t\tcase 512:\t\n\t\t\t\t\tval |= 0x00008000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1024:\t\n\t\t\t\t\tval |= 0x0000c000;\n\t\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\t\t\t\n\t\t\tswitch(pPsdScan->nPSDAvgNum)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tval |= 0x0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\t\t\t\t\n\t\t\t\t\tval |=0x00001000;\n\t\t\t\t \tbreak;\n\t\t\t\tcase 16:\t\n\t\t\t\t\tval |= 0x00002000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32:\n\t\t\t\tdefault:\t\n\t\t\t\t\tval |= 0x00003000;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\\n\"\n\t\t \t//\t, pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint));\n\t\t\tflag = 1;\n\t\t\tbreak;\n\t\t  case 1:\t  //calculate the PSD point index from freq/offset/span\n\t\t  \tnPSDCenterFreq = pPsdScan->nPSDBandWidth /2 +offset*(1000000);\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD Center Freq = %d\\n\", (centFreq + offset)));\n\t\t\t\n\t\t\tnStartP = pPsdScan->nPSDStartBase + (nPSDCenterFreq - span *(1000000)/2) /nDeltaFreqPerPoint;\n\t\t\tpPsdScan->nPSDStartPoint = nStartP - pPsdScan->nPSDStartBase;\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\\n\", pPsdScan->nPSDStartPoint));\n\n\t\t\tnStopP = pPsdScan->nPSDStartBase + (nPSDCenterFreq + span *(1000000)/2) /nDeltaFreqPerPoint;\n\t\t\tpPsdScan->nPSDStopPoint = nStopP - pPsdScan->nPSDStartBase-1;\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\\n\",pPsdScan->nPSDStopPoint));\n\n\t\t\tflag = 2;\n\t\t\tbreak;\n\t\t  case 2:  //set RF channel/BW/Mode\n\n\t\t  \t//set 3-wire off\n\t\t  \tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\n\t\t\tval |= 0x00300000;\n\t\t\t pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\n\n\t\t\t//CCK off\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\n\t\t\tval &= 0xfeffffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);\t\t\n\n\t\t\t//store WiFi original channel\n\t\t\tWiFi_OriginalChannel = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff);\n\n\t\t\t//Set RF channel\n\t\t       if (centFreq == 2484)\n\t\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); \n\t\t\telse\n\t\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, (centFreq-2412)/5 + 1); //WiFi TRx Mask on\n\n\t\t\t//Set  RF mode = Rx, RF Gain = 0x8a0\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x0, 0xfffff, 0x308a0);\n\n\t\t\t//Set RF Rx filter corner\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x3e4);\n\n\t\t\t//Set TRx mask off\n\t\t\t//un-lock TRx Mask setup\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1);\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\t\t\tflag = 3;\n\t\t\tbreak;\n\t\t  case 3:\n\t\t  \tmemset(pPsdScan->nPSDReport,0, pPsdScan->nPSDPoint*sizeof(u4Byte));\n\t\t\tnStartP = pPsdScan->nPSDStartPoint + pPsdScan->nPSDStartBase;\n\t\t\tnStopP = pPsdScan->nPSDStopPoint +  pPsdScan->nPSDStartBase + 1;\n\t\t\t\t\n\t\t\ti = nStartP;\n\n\t\t\twhile (i < nStopP)\n\t\t\t{\n\t\t\t\tif (i >= nPoints)\n\t\t\t\t{\n\t\t\t\t\tpsd_report = halbtc8703b1ant_PSD_GetData(pBtCoexist,i-nPoints);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpsd_report = halbtc8703b1ant_PSD_GetData(pBtCoexist,i);\n\t\t\t\t}\n\n\t\t\t\tif (psd_report == 0)\n\t\t\t\t\ttmp = 0;\n\t\t\t\telse\n\t\t\t\t\t//tmp =  20*log10((double)psd_report);\n\t\t\t\t\t//20*log2(x)/log2(10), log2Base return theresult of the psd_report*100\n\t\t\t\t\ttmp = 6 * halbtc8703b1ant_PSD_Log2Base(pBtCoexist, psd_report);\t\t\t\t\n\n\t\t\t\tn = i-pPsdScan->nPSDStartBase;\n\t\t\t\tpPsdScan->nPSDReport[n] =  tmp;\n\t\t\t\tPsdRep1 = pPsdScan->nPSDReport[n] /100;\n\t\t\t\tPsdRep2 = pPsdScan->nPSDReport[n] - PsdRep1 * 100;\n\t\t\t\t\n\t\t\t\tfreq =  ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint);\n\t\t\t\tfreq1 = freq/1000000;\n\t\t\t\tfreq2 = freq/1000 - freq1 * 1000;\n/*\n\t\t\t\tif (freq2 < 100)\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)\", n, freq1, freq2));\n\t\t\t\telse\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)\", n, freq1, freq2));\n\n\t\t\t\tif (PsdRep2 < 10)\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", PSDReport = %d (%d.0%d dB)\\n\",psd_report, PsdRep1, PsdRep2));\n\t\t\t\telse\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", PSDReport = %d (%d.%d dB)\\n\",psd_report, PsdRep1,PsdRep2));\t\n*/\n\t\t\t\ti++;\n\n\t\t\t\tk=0;\n\n\t\t\t\t//Add Delay between PSD point\n\t\t\t\twhile(1)\n\t\t\t\t{\n\t\t\t\t\tif (k++ > 20000)\n\t\t\t\t\t break;\n\t\t\t\t}\n\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint()==============\\n\"));\n\t\t\t}\t\n\n\t\t\tflag = 100;\n\t\t\tbreak;\n\t\t  case 99:\t//error\n\n\t\t\toutloop = TRUE;\n\t\t\tbreak;\n\t\t  case 100: //recovery \n\n\t\t  \t//set 3-wire on\n\t\t  \tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\n\t\t\tval &=0xffcfffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\n\n\t\t\t//CCK on\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\n\t\t\tval |= 0x01000000;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);\t\n\n\t\t\t//PSD off\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\t\t\tval &=0xffbfffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x808,val);\n\t\t\t\n\t\t  \t//TRx Mask on\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\n\n\t\t\t//lock TRx Mask setup\n\t\t  \tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0);\n\n\t\t\t//Set RF Rx filter corner\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x0);\n\n\t\t\t//restore WiFi original channel\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, WiFi_OriginalChannel); \n\t\t\t\n\t\t\toutloop = TRUE;\n\t\t\tbreak;\n\n\t\t}\t\t\n\t\t\t\n\t}while (!outloop);\n\n\n\n\tpPsdScan->bIsPSDRunning = FALSE;\n\n\n}\n\n//============================================================\n// work around function start with wa_halbtc8703b1ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8703b1ant_\n//============================================================\nVOID\nEXhalbtc8703b1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x0;\n\tu2Byte u2Tmp=0x0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx Execute 8703b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\\n\"));\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"Ant Det Finish = %s, Ant Det Number  = %d\\n\",  \n\t\t (pBoardInfo->btdmAntDetFinish? \"Yes\":\"No\"), pBoardInfo->btdmAntNumByAntDet));\n\n\tpBtCoexist->bStopCoexDm = TRUE;\n\n\t// enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\n\n\t//set Path control owner to WiFi\n\thalbtc8703b1ant_LTECoex_PathControlOwner(pBtCoexist, WLSIDE_CONTROL);\n\n\t// set GNT_BT to high\n\thalbtc8703b1ant_LTECoex_Set_GNT_BT(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_HIGH);\n\t//Set GNT_WL to low\n\thalbtc8703b1ant_LTECoex_Set_GNT_WL(pBtCoexist, RFC_AND_BB, CONTROL_BY_SW, SET_TO_LOW);\n\n\t// set WLAN_ACT = 0\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\t\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\n\tu1Tmp = 0;\n\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\t\t\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\t}\n\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t{\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], **********  LTE coex Reg 0x38 (Power-On) = 0x%x**********\\n\", halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38)));\n\t\t\n\n#if 0\t\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\n\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t}\n\telse\n\t{\n\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t\t// set to S1\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t\t}\n\n\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\t\n\t}\n\n#endif\t\n}\n\nVOID\nEXhalbtc8703b1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8703b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8703b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\n\tpBtCoexist->bStopCoexDm = FALSE;\n}\n\nVOID\nEXhalbtc8703b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\n\tpBtCoexist->bStopCoexDm = FALSE;\n\t\n\thalbtc8703b1ant_InitCoexDm(pBtCoexist);\n\n\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n}\n\nVOID\nEXhalbtc8703b1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu2Byte\t\t\t\tu2Tmp[4];\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tstatic u1Byte\t\t\tPopReportIn10s = 0;\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Coex is STOPPED]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tif (pPsdScan->bAntDet_TryCount == 0)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"Ant PG Num/ Mech/ Pos\",\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\n\tCL_PRINTF(cliBuf);\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d  (%d/%d/%d)\", \"Ant PG Num/ Mech(Ant_Det)/ Pos\", \n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNumByAntDet, pBoardInfo->btdmAntPos, \n\t\tpPsdScan->bAntDet_TryCount, pPsdScan->bAntDet_FailCount, pPsdScan->nAntDet_Result);\t\t\n\t\tCL_PRINTF(cliBuf);\n\n\t\tif (pBoardInfo->btdmAntDetFinish)\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"Ant Det PSD Value\",  pPsdScan->nAntDet_PeakVal);\t\t\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8703b1Ant, GLCoexVer8703b1Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %s\", \"WifibHiPri/ Ccklock/ CckEverLock\", \\\n\t\t(pCoexSta->bWiFiIsHighPriTask? \"Yes\":\"No\"),\n\t\t(pCoexSta->bCCKLock? \"Yes\":\"No\"),\n\t\t(pCoexSta->bCCKEverLock? \"Yes\":\"No\"));\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tPopReportIn10s++;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d/ %d] \", \"BT [status/ rssi/ retryCnt/ popCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tif (PopReportIn10s >= 5)\n\t{\n\t\tpCoexSta->popEventCnt = 0;\t\n\t\tPopReportIn10s = 0;\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP/Hi-Pri\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pBtLinkInfo->bBtHiPriLinkExist);\n\tCL_PRINTF(cliBuf);\n\n\tif (pStackInfo->bProfileNotified)\n\t{\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\t\n\t}\n\telse\n\t{\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s\", \"BT Role/A2DP rate\", \\\n\t\t(pBtLinkInfo->bSlaveRole )? \"Slave\":\"Master\", (btInfoExt&BIT0)? \"BR\":\"EDR\");\n\t\tCL_PRINTF(cliBuf);\t\n\t}\t\n\n\n\tfor(i=0; i<BT_INFO_SRC_8703B_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8703b1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism] (before Manual)============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t}\t\n\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ 0x%x\", \"SM[LowPenaltyRA]/RA Mask\", \\\n\t\t\tpCoexDm->bCurLowPenaltyRa, pBtCoexist->btInfo.raMask);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %d \", \"NoAggr/ CtrlAggr/ AggrSize\", \\\n\t\t\t(pBtCoexist->btInfo.bRejectAggPkt? \"Yes\":\"No\"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? \"Yes\":\"No\"),\n\t\t\t\tpBtCoexist->btInfo.aggBufSize);\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\t// Fw mechanism\t\t\n\t\tif(pBtCoexist->bManualControl)\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism] (before Manual) ============\");\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t\t}\n\t\t\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, \n\t\t\t(pCoexDm->bCurPsTdmaOn? \"On\":\"Off\"),\n\t\t\t(pCoexDm->bAutoTdmaAdjust? \"Adj\":\"Fix\") );\n\t\t\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"WL/BT Coex Table Type\", \\\n\t\t\tpCoexSta->nCoexTableType);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\t\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\t\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8(coexTable)\", \\\n\t\t\t\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\t\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x778/0x6cc/IgnWlanAct\", \\\n\t\tu1Tmp[0], u4Tmp[0],  pCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tu4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa0);\n\t\tu4Tmp[1] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa4);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"LTE Coex Table W_L/B_L\", \\\n\t\t\tu4Tmp[0]&0xffff, u4Tmp[1]&0xffff);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tu4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xa8);\n\t\tu4Tmp[1] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xac);\n\t\tu4Tmp[2] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xb0);\n\t\tu4Tmp[3] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0xb4);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"LTE Break Table W_L/B_L/L_W/L_B\", \\\n\t\t\tu4Tmp[0]&0xffff, u4Tmp[1]&0xffff, u4Tmp[2]&0xffff, u4Tmp[3]&0xffff);\n\t\tCL_PRINTF(cliBuf);\n\t\t\t\t\n\t\t// Hw setting\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\tu2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"0x430/0x434/0x42a/0x456\", \\\n\t\tu4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\n\tu4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x38);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x73);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %s\", \"LTE CoexOn/Path Ctrl Owner\", \\\n\t ((u4Tmp[0]&BIT7)>> 7), ((u1Tmp[0]&BIT2)? \"WL\":\"BT\"));\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"LTE 3Wire/OPMode/UART/UARTMode\", \\\n\t ((u4Tmp[0]&BIT6)>> 6), ((u4Tmp[0]&(BIT5|BIT4))>> 4),((u4Tmp[0]&BIT3)>> 3), (u4Tmp[0]&(BIT2|BIT1|BIT0)));\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %s\", \"GNT_WL_SWCtrl/GNT_BT_SWCtrl/Dbg\", \\\n\t ((u4Tmp[0]&BIT12)>> 12), ((u4Tmp[0]&BIT14)>> 14), ((u1Tmp[0]&BIT3)? \"On\":\"Off\"));\n\tCL_PRINTF(cliBuf);\n\t\n\tu4Tmp[0] = halbtc8703b1ant_LTECoex_InDirectReadReg(pBtCoexist, 0x54);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"GNT_WL/GNT_BT/LTE_Busy/UART_Busy\", \\\n\t\t((u4Tmp[0]&BIT2)>> 2), ((u4Tmp[0]&BIT3)>> 3),  ((u4Tmp[0]&BIT1)>> 1),  (u4Tmp[0]&BIT0));\n\tCL_PRINTF(cliBuf);\n\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4c6);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x4c6[4]/0x40[5] (WL/BT PTA)\", \\\n\t\t((u1Tmp[0] & BIT4)>>4), ((u1Tmp[1] & BIT5)>>5));\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x953);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ %s\", \"0x550(bcn ctrl)/0x522/4-RxAGC\", \\\n\t\tu4Tmp[0], u1Tmp[0], (u1Tmp[1]&0x2)? \"On\": \"Off\");\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\n\tfaOfdm = ((u4Tmp[0]&0xffff0000) >> 16) +  ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \\\n\t\t             ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ;\n\tfaCck = (u1Tmp[0] << 8) + u1Tmp[1];\n\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0xc50/OFDM-CCA/OFDM-FA/CCK-FA\", \\\n\t\tu4Tmp[1]&0xff, u4Tmp[0]&0xffff, faOfdm, faCck);\n\tCL_PRINTF(cliBuf);\n\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_OK CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_Err CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 1)\n\t//halbtc8703b1ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8703b1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\n\tif(pBtCoexist->bManualControl ||\tpBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\t\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\n\t\thalbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8703b1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n\n\t\tpCoexSta->bUnderIps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tu1Byte u1Tmpa, u1Tmpb;\n\tu4Byte u4Tmp;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm )\n\t\treturn;\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\t\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\t\t\n\t}\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\treturn;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8703b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\t\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8703b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8703b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_SCAN_START == type)\n\t{\t\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiNotConnectedScan(pBtCoexist);\n\t\t}\n\t\telse\t// wifi is connected\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\t}\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\n\t\t pCoexDm->nArpCnt = 0;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\t\n\t\t//pCoexDm->nArpCnt = 0;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8703b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8703b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8703b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\t\n\t\thalbtc8703b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(!bWifiConnected) // non-connected scan\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tBOOLEAN\t\t\tbWifiUnderBMode = FALSE;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\t\t//Set CCK Tx/Rx high Pri except 11b mode\n\t\tif (bWifiUnderBMode)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\n\t\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\n\t\t}\n\t\t\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t\tpCoexDm->nArpCnt = 0;\n\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\n\n\t\tpCoexSta->bCCKEverLock = FALSE;\n\t}\n\n\thalbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, type);\t\n\t\n}\n\nVOID\nEXhalbtc8703b1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE, bUnder4way=FALSE;\n\tu1Byte\taggBufSize=5;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif( BTC_PACKET_DHCP == type || \n\t\tBTC_PACKET_EAPOL == type ||\n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\tif (BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet ARP notify\\n\"));\t\t \n\n\t\t\tpCoexDm->nArpCnt++;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ARP Packet Count = %d\\n\", pCoexDm->nArpCnt));\n\t\t\t\n\t\t\tif((pCoexDm->nArpCnt >= 10) && (!bUnder4way)) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet DHCP or EAPOL notify\\n\"));\t\t \n\t\t}\n\t} \n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet [Type = %d] notify\\n\", type));\n\t}\n\n\tpCoexSta->specialPktPeriodCnt = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8703b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8703b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8703b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8703b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8703b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( BTC_PACKET_DHCP == type ||\n\t\tBTC_PACKET_EAPOL == type || \n\t\t( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\n\t\t{\n\t\thalbtc8703b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\t\tbtInfo=0;\n\tu1Byte\t\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\t\tbWifiConnected=FALSE;\n\tBOOLEAN\t\t\t\tbBtBusy=FALSE;\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\t\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8703B_1ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8703B_1ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\t// if 0xff, it means BT is under WHCK test\n\tif (btInfo == 0xff)\n\t\tpCoexSta->bBtWhckTest = TRUE;\n\telse\n\t\tpCoexSta->bBtWhckTest = FALSE;\n\n\tif(BT_INFO_SRC_8703B_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btRetryCnt >= 1)\n\t\t\tpCoexSta->popEventCnt++;\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtPage = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtPage = FALSE;\t\t\t\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2-90;\n\t\t\t//pCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\t\t\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\n\t\t\t\t\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif(pCoexSta->btInfoExt & BIT1)\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, BTC_MEDIA_CONNECT);\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8703b1ant_UpdateWifiChannelInfo(pBtCoexist, BTC_MEDIA_DISCONNECT);\t\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tif(pCoexSta->btInfoExt & BIT3)\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8703B_1ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\tpCoexSta->nNumOfProfile = 0;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8703B_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tpCoexSta->bBtHiPriLinkExist = FALSE;\t\t\n\t}\n\telse\t// connection exists\n\t{\t\t\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8703B_1ANT_B_FTP)\n\t\t{\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_1ANT_B_A2DP)\n\t\t{\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_1ANT_B_HID)\n\t\t{\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_1ANT_B_SCO_ESCO)\n\t\t{\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tif ((pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) &&( pCoexSta->bScoExist == FALSE))\n\t\t{\n\t\t\tif (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160) \t\t\n\t\t\t{\n\t\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\t\tpCoexSta->wrongProfileNotification++;\n\t\t\t\tpCoexSta->nNumOfProfile++;\n\t\t\t\tbtInfo = btInfo | 0x28;\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT HID = true (Hi-Pri > 160)!\\n\"));\n\t\t\t}\n\t\t}\n\n\t\t//Add Hi-Pri Tx/Rx counter to avoid false detection\n\t\tif (((pCoexSta->bHidExist) || (pCoexSta->bScoExist)) && (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160)\n\t\t\t && (!pCoexSta->bC2hBtInquiryPage))\n\t\t\tpCoexSta->bBtHiPriLinkExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bBtHiPriLinkExist = FALSE;\n\t\t\t\n\t\tif((btInfo&BT_INFO_8703B_1ANT_B_ACL_BUSY) && (pCoexSta->nNumOfProfile == 0))\n\t\t{\n\t\t\tif (pCoexSta->lowPriorityTx + pCoexSta->lowPriorityRx >= 160)\n\t\t\t{\n\t\t\t\tpCoexSta->bPanExist = TRUE;\n\t\t\t\tpCoexSta->nNumOfProfile++;\n\t\t\t\tpCoexSta->wrongProfileNotification++;\n\t\t\t\tbtInfo = btInfo | 0x88;\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\thalbtc8703b1ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tbtInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\n\t\n\tif(!(btInfo&BT_INFO_8703B_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8703B_1ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8703B_1ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8703B_1ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8703B_1ANT_B_ACL_BUSY)\n\t{\n\t\tif(BT_8703B_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus)\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_1ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8703B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\tbBtBusy = TRUE;\n\telse\n\t\tbBtBusy = FALSE;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\thalbtc8703b1ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8703b1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp;\n\tu1Byte\tu1Tmpa,u1Tmpb, u1Tmpc;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF Status notify\\n\"));\n\n\tif(BTC_RF_ON == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned ON!!\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t}\n\telse if(BTC_RF_OFF == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned OFF!!\\n\"));\n\t\t\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\t\t\n\t\thalbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu4Byte\tu4Tmp;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8703b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\t\n\n\thalbtc8703b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\n\tEXhalbtc8703b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\tpBtCoexist->bStopCoexDm = TRUE;\t\n}\n\nVOID\nEXhalbtc8703b1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\n\t\thalbtc8703b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8703b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8703b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8703b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\t\t\n\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\thalbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8703b1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8703b1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], *****************Coex DM Reset*****************\\n\"));\n\n\thalbtc8703b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\n\thalbtc8703b1ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8703b1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\", \n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\", \n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8703b1Ant, GLCoexVer8703b1Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8703B_1ANT == 0)\n\thalbtc8703b1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8703b1ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8703b1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8703b1ant_MonitorWiFiCtr(pBtCoexist);\n#if BT_8703B_1ANT_ANTDET_ENABLE\n\thalbtc8703b1ant_MonitorBtEnableDisable(pBtCoexist);\n#endif\n\n\tif( halbtc8703b1ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust )\n\t{\n\n\t\thalbtc8703b1ant_RunCoexistMechanism(pBtCoexist);\t\n\t}\n\n\tpCoexSta->specialPktPeriodCnt++;\n\n\t// sample to set bt to execute Ant detection\n\t//pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, 20, 14);\n/*\n\tif (pPsdScan->bIsAntDetEnable)\n\t{\n\t\t if (pPsdScan->nPSDGenCount > pPsdScan->realseconds)\n\t\t\tpPsdScan->nPSDGenCount = 0;\n\t\t \n\t\thalbtc8703b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq,  pPsdScan->realoffset, pPsdScan->realspan,  pPsdScan->realseconds);\t\n\t\tpPsdScan->nPSDGenTotalCount +=2;\n\t\tpPsdScan->nPSDGenCount += 2;\n\t}\n*/\t \t\n#endif\n}\n\nVOID\nEXhalbtc8703b1ant_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\t  //No Antenna Detection required because 8730b is only 1-Ant\n}\n\nVOID\nEXhalbtc8703b1ant_AntennaIsolation(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\n\n}\n\nVOID\nEXhalbtc8703b1ant_PSDScan(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\n\n}\n\nVOID\nEXhalbtc8703b1ant_DisplayAntDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8703b1Ant.h",
    "content": "//===========================================\n// The following is for 8703B 1ANT BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8703B_1ANT\t\t\t\t1\n\n#define\tBT_INFO_8703B_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8703B_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8703B_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8703B_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8703B_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8703B_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8703B_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8703B_1ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8703B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\tBTC_RSSI_COEX_THRESH_TOL_8703B_1ANT\t\t2\n\n#define  BT_8703B_1ANT_WIFI_NOISY_THRESH\t\t\t\t\t\t\t30   //max: 255\n\n//for Antenna detection\n#define\tBT_8703B_1ANT_ANTDET_PSDTHRES_BACKGROUND\t\t\t\t\t50\n#define\tBT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION\t\t\t\t70\n#define\tBT_8703B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION\t\t\t55\n#define\tBT_8703B_1ANT_ANTDET_PSDTHRES_1ANT\t\t\t\t\t\t\t35\n#define\tBT_8703B_1ANT_ANTDET_RETRY_INTERVAL\t\t\t\t\t\t\t10\t//retry timer if ant det is fail, unit: second\n#define\tBT_8703B_1ANT_ANTDET_ENABLE\t\t\t\t\t\t\t\t\t0\n#define\tBT_8703B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\t\t\t\t0\n\n#define\tBT_8703B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT\t\t30000\n\nenum _SIGNAL_STATE{\n\tSET_TO_LOW=0,\n\tSET_TO_HIGH=1,\n\tSET_BY_HW=0\n};\n\nenum _PATH_CONTRL_OWNER{\n\tBTSIDE_CONTROL=0,\n\tWLSIDE_CONTROL=1\n};\n\nenum _GNT_CONTROL_TYPE{\n\tCONTROL_BY_PTA=0,\n\tCONTROL_BY_SW=1\t\n};\n\nenum _GNT_CONTROL_BLOCK{\n\tRFC_AND_BB=0,\n\tRFC_ONLY=1,\n\tBB_ONLY=2\n};\n\nenum _LTE_COEXTABLE_TYPE{\n\tWL_VS_LTE=0,\n\tBT_VS_LTE=1\n};\n\nenum _LTE_BREAKTABLE_TYPE{\n\tWL_BREAK_LTE=0,\n\tBT_BREAK_LTE=1,\n\tLTE_BREAK_WL=2,\n\tLTE_BREAK_BT=3\n};\n\n\ntypedef enum _BT_INFO_SRC_8703B_1ANT{\n\tBT_INFO_SRC_8703B_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8703B_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8703B_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8703B_1ANT_MAX\n}BT_INFO_SRC_8703B_1ANT,*PBT_INFO_SRC_8703B_1ANT;\n\ntypedef enum _BT_8703B_1ANT_BT_STATUS{\n\tBT_8703B_1ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8703B_1ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8703B_1ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8703B_1ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8703B_1ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8703B_1ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8703B_1ANT_BT_STATUS_MAX\n}BT_8703B_1ANT_BT_STATUS,*PBT_8703B_1ANT_BT_STATUS;\n\ntypedef enum _BT_8703B_1ANT_WIFI_STATUS{\n\tBT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE\t\t\t\t= 0x0,\n\tBT_8703B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN\t\t= 0x1,\n\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_SCAN\t\t\t\t\t= 0x2,\n\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT\t\t\t\t= 0x3,\n\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_IDLE\t\t\t\t\t= 0x4,\n\tBT_8703B_1ANT_WIFI_STATUS_CONNECTED_BUSY\t\t\t\t\t= 0x5,\n\tBT_8703B_1ANT_WIFI_STATUS_MAX\n}BT_8703B_1ANT_WIFI_STATUS,*PBT_8703B_1ANT_WIFI_STATUS;\n\ntypedef enum _BT_8703B_1ANT_COEX_ALGO{\n\tBT_8703B_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8703B_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8703B_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8703B_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8703B_1ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8703B_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8703B_1ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8703B_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8703B_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8703B_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8703B_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8703B_1ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8703B_1ANT_COEX_ALGO,*PBT_8703B_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8703B_1ANT{\n\t// hw setting\n\tu1Byte\t\tpreAntPosType;\n\tu1Byte\t\tcurAntPosType;\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n\tu4Byte\t\tnArpCnt;\n\n\tu1Byte\t\terrorCondition;\n} COEX_DM_8703B_1ANT, *PCOEX_DM_8703B_1ANT;\n\ntypedef struct _COEX_STA_8703B_1ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\tBOOLEAN\t\t\t\t\tbBtHiPriLinkExist;\n\tu1Byte\t\t\t\t\tnNumOfProfile;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\tspecialPktPeriodCnt;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\ts1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8703B_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8703B_1ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbBtWhckTest;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtPage;\t\t\t\t//Add for win8.1 page out issue\n\tBOOLEAN\t\t\t\t\tbWiFiIsHighPriTask;\t\t//Add for win8.1 page out issue\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu4Byte\t\t\t\t\tpopEventCnt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\t\n\n\tBOOLEAN\t\t\t\t\tbCCKLock;\n\tBOOLEAN\t\t\t\t\tbPreCCKLock;\n\tBOOLEAN\t\t\t\t\tbCCKEverLock;\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\tu4Byte\t\t\t\t\twrongProfileNotification;\n\n\tBOOLEAN\t\t\t\t\tbConCurrentRxModeOn;\n}COEX_STA_8703B_1ANT, *PCOEX_STA_8703B_1ANT;\n\n#define  BT_8703B_1ANT_ANTDET_PSD_POINTS\t\t\t256\t//MAX:1024\n#define  BT_8703B_1ANT_ANTDET_PSD_AVGNUM\t\t\t1\t//MAX:3\n#define\tBT_8703B_1ANT_ANTDET_BUF_LEN\t\t\t\t16\n\ntypedef struct _PSDSCAN_STA_8703B_1ANT{\n\nu4Byte\t\t \tnAntDet_BTLEChannel;  //BT LE Channel ex:2412\nu4Byte\t\t\tnAntDet_BTTxTime;\nu4Byte\t\t\tnAntDet_PrePSDScanPeakVal;\nBOOLEAN\t\t\tnAntDet_IsAntDetAvailable;\nu4Byte\t\t\tnAntDet_PSDScanPeakVal;\nBOOLEAN\t\t\tnAntDet_IsBTReplyAvailable;\nu4Byte\t\t\tnAntDet_PSDScanPeakFreq;\n\nu1Byte\t\t\tnAntDet_Result;\nu1Byte\t\t\tnAntDet_PeakVal[BT_8703B_1ANT_ANTDET_BUF_LEN];\nu1Byte\t\t\tnAntDet_PeakFreq[BT_8703B_1ANT_ANTDET_BUF_LEN];\nu4Byte\t\t\tbAntDet_TryCount;\nu4Byte\t\t\tbAntDet_FailCount;\nu4Byte\t\t\tnAntDet_IntevalCount;\nu4Byte\t\t\tnAntDet_ThresOffset;\n\nu4Byte\t\t\tnRealCentFreq;\ns4Byte\t\t\tnRealOffset;\nu4Byte\t\t\tnRealSpan;\n\t\nu4Byte\t\t\tnPSDBandWidth;  //unit: Hz\nu4Byte\t\t\tnPSDPoint;\t\t//128/256/512/1024\nu4Byte\t\t\tnPSDReport[1024];  //unit:dB (20logx), 0~255\nu4Byte\t\t\tnPSDReport_MaxHold[1024];  //unit:dB (20logx), 0~255\nu4Byte\t\t\tnPSDStartPoint;\nu4Byte\t\t\tnPSDStopPoint;\nu4Byte\t\t\tnPSDMaxValuePoint;\nu4Byte\t\t\tnPSDMaxValue;\nu4Byte\t\t\tnPSDStartBase;\nu4Byte\t\t\tnPSDAvgNum;\t// 1/8/16/32\nu4Byte\t\t\tnPSDGenCount;\nBOOLEAN\t\t\tbIsPSDRunning;\nBOOLEAN\t\t\tbIsPSDShowMaxOnly;\n} PSDSCAN_STA_8703B_1ANT, *PPSDSCAN_STA_8703B_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8703b1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8703b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8703b1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8703b1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b1ant_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\nVOID\nEXhalbtc8703b1ant_AntennaIsolation(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\n\nVOID\nEXhalbtc8703b1ant_PSDScan(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\nVOID\nEXhalbtc8703b1ant_DisplayAntDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8703b2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8703B Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8703b2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8703B_2ANT\t\tGLCoexDm8703b2Ant;\nstatic PCOEX_DM_8703B_2ANT \tpCoexDm=&GLCoexDm8703b2Ant;\nstatic COEX_STA_8703B_2ANT\t\tGLCoexSta8703b2Ant;\nstatic PCOEX_STA_8703B_2ANT\tpCoexSta=&GLCoexSta8703b2Ant;\n\nconst char *const GLBtInfoSrc8703b2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8703b2Ant=20140903;\nu4Byte\tGLCoexVer8703b2Ant=0x43;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8703b2ant_\n//============================================================\nu1Byte\nhalbtc8703b2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8703b2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8703B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8703b2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n}\n\nVOID\nhalbtc8703b2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  &&  (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8703b2ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n}\n\nVOID\nhalbtc8703b2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nBOOLEAN\nhalbtc8703b2ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN\tbWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\t\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\t\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\n\n\t\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist,3, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\n\t\tif ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) ||  (BTC_RSSI_STATE_LOW ==wifiRssiState ))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8703b2ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n#if(BT_AUTO_REPORT_ONLY_8703B_2ANT == 1)\t// profile from bt patch\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n#else\t// profile from bt stack\n\tpBtLinkInfo->bBtLinkExist = pStackInfo->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pStackInfo->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pStackInfo->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pStackInfo->bPanExist;\n\tpBtLinkInfo->bHidExist = pStackInfo->bHidExist;\n\n\t//for win-8 stack HID report error\n\tif(!pStackInfo->bHidExist)\n\t\tpStackInfo->bHidExist = pCoexSta->bHidExist;  //sync  BTInfo with BT firmware and stack\n\t// when stack HID report error, here we use the info from bt fw.\n\tif(!pStackInfo->bBtLinkExist)\n\t\tpStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\t\n#endif\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8703b2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8703B_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\t\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n#if 0\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8703B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8703b2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = decBtPwrLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\\n\", \n\t\tdecBtPwrLvl, H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8703b2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), decBtPwrLvl));\n\tpCoexDm->curBtDecPwrLvl = decBtPwrLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\n\n\tpCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\n}\n\nVOID\nhalbtc8703b2ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8703b2ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8703b2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8703b2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8703b2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8703b2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\")) );\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\t//return;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8703b2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val);\n}\n\nVOID\nhalbtc8703b2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8703b2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8703b2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8703b2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8703b2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1);\n\t}\n}\n\nVOID\nhalbtc8703b2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8703b2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\t//=================BB AGC Gain Table\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table Off!\\n\"));\n\t \tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001);\n\t}\n\t\n\t\n\t//=================RF Gain\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tif(bAgcTableEn)\n\t{\n\t\trssiAdjustVal = 8;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\nVOID\nhalbtc8703b2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8703b2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8703b2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8703b2ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\thalbtc8703b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8703b2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b2ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8703b2ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8703b2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8703b2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8703b2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8703b2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\n\n\t if ( (pCoexSta->bA2dpExist) && (pCoexSta->bHidExist) )\n\t {\n\t\tbyte5 = byte5 | 0x1;\n\t }\n\t \n\tH2C_Parameter[0] = byte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = byte5;\n\n\tpCoexDm->psTdmaPara[0] = byte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = byte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x60(5bytes)=0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8703b2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\t/*\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t*/\n\t\n\t//halbtc8703b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\thalbtc8703b2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8703b2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\t//halbtc8703b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\t//halbtc8703b2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\t//halbtc8703b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8703b2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\tfwVer=0, u4Tmp=0;\n\tBOOLEAN\t\t\tbPgExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbUseExtSwitch=FALSE;\n\tu1Byte\t\t\tH2C_Parameter[2] ={0};\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\t// [31:16]=fw ver, [15:0]=fw sub ver\n\n\tif((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\n\t\tbUseExtSwitch = TRUE;\n\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);\n\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t\t/* Use H2C to set GNT_BT to High to avoid A2DP click */\n\t\t\tH2C_Parameter[0] = 1;\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi TRx Mask off\n\t\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off\n\n\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t{\n\t\t\t//tell firmware \"no antenna inverse\"\n\t\t\tH2C_Parameter[0] = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//tell firmware \"antenna inverse\"\n\t\t\tH2C_Parameter[0] = 1;\n\t\t}\n\n\t\tif (bUseExtSwitch)\n\t\t{\n\t\t\t//ext switch type\n\t\t\tH2C_Parameter[1] = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//int switch type\n\t\t\tH2C_Parameter[1] = 0;\n\t\t}\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t}\n\telse\n\t{\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t\t/* Use H2C to set GNT_BT to \"Control by PTA\"*/\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\n\t\t}\n\t}\n\n\t// ext switch setting\n\tif(bUseExtSwitch)\n\t{\n\t\tif (bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp &=~BIT23;\n\t\t\tu4Tmp |= BIT24;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\t// ext switch main at wifi\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\t// ext switch aux at wifi\n\t\t\t\tbreak;\n\t\t}\t\n\t}\n\telse\t// internal switch\n\t{\n\t\tif (bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp |= BIT23;\n\t\t\tu4Tmp &=~BIT24;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //fixed external switch S1->Main, S0->Aux\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\tu1Byte\t\t\twifiRssiState1, btRssiState;\n\n\t\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn)\n\t{\n\t\ttype = type +100;  //for WiFi RSSI low or BT RSSI low\n\t\tpCoexDm->bIsSwitchTo1dot5Ant = TRUE;\n\t}\n\telse\n\t{\n\t\tpCoexDm->bIsSwitchTo1dot5Ant = FALSE;\n\t}\n\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\t\n\t\t\tcase 71:\n\t\t\t\t//halbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 101:\n\t\t\tcase 105:\n\t\t\tcase 171:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 102:\n\t\t\tcase 106:\n\t\t\tcase 110:\n\t\t\tcase 114:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\n\t\t\tcase 103:\n\t\t\tcase 107:\n\t\t\tcase 111:\n\t\t\tcase 115:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\t\n\t\t\tcase 104:\n\t\t\tcase 108:\n\t\t\tcase 112:\n\t\t\tcase 116:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\n\t\t\tcase 109:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 113:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 121:\t\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\t\n\t\t\tcase 22:\n\t\t\tcase 122:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x03, 0x71, 0x11);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8703b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8703b2ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8703b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8703b2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8703b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\nVOID\nhalbtc8703b2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8703b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8703b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8703b2ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tBOOLEAN\tbLowPwrDisable=TRUE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi link process + BT Inq/Page!!\\n\"));\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse if(bWifiConnected)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT Inq/Page!!\\n\"));\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi no-link + BT Inq/Page!!\\n\"));\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t}\t\n\t\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n/*\n\tpCoexDm->bNeedRecover0x948 = TRUE;\n\tpCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\n\thalbtc8703b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, FALSE, FALSE);\n*/\t\n}\n\n\nVOID\nhalbtc8703b2ant_ActionWiFiLinkProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu1Byte \tu1Tmpa, u1Tmpb;\n\t\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\n\t u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n        u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\t u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\n\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\\n\",\n\t   \t      u4Tmp,  u1Tmpa, u1Tmpb));\n}\n\nBOOLEAN\nhalbtc8703b2ant_ActionWifiIdleProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//wifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES-20, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif(BTC_RSSI_HIGH(wifiRssiState1) && \n\t\t\t(pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE))\n\t{\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\\n\"));\n\t\t\n\t\thalbtc8703b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6);\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t// sw all off\n\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t  \treturn TRUE;\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\treturn FALSE;\t\n\t}\n\t\n\t\n}\n\n\n\nBOOLEAN\nhalbtc8703b2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tbtRssiState=BTC_RSSI_STATE_HIGH;\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbBtHsOn=FALSE, bLowPwrDisable=FALSE;\n\tBOOLEAN\t\t\tbAsus8703b=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected)\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-connected idle!!\\n\"));\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n \t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif(BT_8703B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\t\t\n\t\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t      \thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse if(BT_8703B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bBtHsOn)\n\t\t\t\treturn FALSE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\t\t\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bWifiBusy)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n#if 0\t\t\t\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_IS_ASUS_8703B, &bAsus8703b);\n\t\t\t\tif(!bAsus8703b)\n\t\t\t\t\tbCommon = FALSE;\n\t\t\t\telse\n\t\t\t\t\tbCommon = halbtc8703b2ant_ActionWifiIdleProcess(pBtCoexist);\t\n#else\n\t\t\t\tbCommon = FALSE;\n#endif\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t\t\t//bCommon = FALSE;\t\n\t\t\t\tbCommon = halbtc8703b2ant_ActionWifiIdleProcess(pBtCoexist);\t\t\t\n\t\t\t}\n\t\t}\t\n\t}\n\n\treturn bCommon;\n}\nVOID\nhalbtc8703b2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8703b2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse  //for SCO quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t}\n\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x4);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x4);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x4);\n\t\t}\t\t\n\t}\n}\n\n\nVOID\nhalbtc8703b2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\t\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);\n\t}\n\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t}\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8703b2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif( (apNum >= 10) && BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\t//DbgPrint(\" AP#>10(%d)\\n\", apNum);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\t\n\t\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\t\t\t\n\t\t\t\t\t\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t\t// sw mechanism\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\t\t\n\t\t}\n\t\treturn;\n\t\t\n\t}\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\t\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t}\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8703b2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8703b2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t}\n\t\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n\n//PAN(HS) only\nVOID\nhalbtc8703b2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8703b2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\t\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\telse\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);\n\t\t\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t}\n\t\n\t// sw mechanism\t\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\n\t\t\t//halbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\t//halbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t}\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t//halbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8703b2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1,  btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(2, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t}\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8703b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//btRssiState = halbtc8703b2ant_BtRssiState(2, 29, 0);\n\twifiRssiState1 = halbtc8703b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8703b2ant_BtRssiState(3, BT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8703b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\n\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse\t\n\t{\t// only 802.11N mode we have to dec bt power to 4 degree\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\t// need to check ap Number of Not\n\t\t\tif(apNum < 10)\n\t\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\telse\n\t\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\t}\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse\t\n\t\t\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8703b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8703b2ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8703b2ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\thalbtc8703b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8703b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8703b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8703b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8703b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8703b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n}\n\nVOID\nhalbtc8703b2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE, bBtHsOn=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\tu4Byte\t\t\t\tnumOfWifiLink=0;\n\tu4Byte\t\t\t\twifiLinkStatus=0;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbMiracastPlusBt=FALSE;\n\tBOOLEAN\t\t\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bBtWhckTest)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under WHCK TEST!!!\\n\"));\n\t\thalbtc8703b2ant_ActionBtWhckTest(pBtCoexist);\n\t\treturn;\n\t}\n\n\talgorithm = halbtc8703b2ant_ActionAlgorithm(pBtCoexist);\n\tif(pCoexSta->bC2hBtInquiryPage && (BT_8703B_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8703b2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse\n\t{\n\t\t/*\n\t\tif(pCoexDm->bNeedRecover0x948)\n\t\t{\n\t\t\tpCoexDm->bNeedRecover0x948 = FALSE;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);\n\t\t}\n\t\t*/\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], WiFi is under Link Process !!\\n\"));\n\t\thalbtc8703b2ant_ActionWiFiLinkProcess(pBtCoexist);\n\t\treturn;\n\t}\n\n\t//for P2P\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8703b2ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpCoexDm->curAlgorithm = algorithm;\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\tif(halbtc8703b2ant_IsCommonAction(pBtCoexist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\n\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8703B_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8703b2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\thalbtc8703b2ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8703b2ant_WifiOffHwCfg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\tbIsInMpMode = FALSE;\n\tu1Byte H2C_Parameter[2] ={0};\n\tu4Byte fwVer=0;\n\n\t// set wlan_act to low\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tif(fwVer >= 0x180000)\n\t{\n\t/* Use H2C to set GNT_BT to HIGH */\n\tH2C_Parameter[0] = 1;\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\n\tif(!bIsInMpMode)\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\n\telse\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\n}\n\nVOID\nhalbtc8703b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\tu4Tmp=0, fwVer;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\t\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\t\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t//Antenna config\t\n\thalbtc8703b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\n\tpCoexSta->disVerInfoCnt = 0;\n\n\t// PTA parameter\n\thalbtc8703b2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\t\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n}\n\n//============================================================\n// work around function start with wa_halbtc8703b2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8703b2ant_\n//============================================================\nVOID\nEXhalbtc8703b2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu2Byte u2Tmp=0x0;\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\n\n\t// enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\n\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t\t// set to S1\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t}\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\t\t\t\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8703b2ant_InitHwConfig(pBtCoexist, TRUE);\n}\n\nVOID\nEXhalbtc8703b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8703b2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8703b2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8703b2Ant, GLCoexVer8703b2Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %ddBm/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8703B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8703B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi-100, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\n\n\tif (pStackInfo->bProfileNotified)\n\t{\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Role\", \\\n\t\t(pBtLinkInfo->bSlaveRole )? \"Slave\":\"Master\");\n\t\tCL_PRINTF(cliBuf);\t\n\t}\t\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8703B_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8703b2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t// Sw mechanism\t\n\tif(pBtCoexist->bManualControl)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism] (before Manual)============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism] (before Manual) ============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t}\n\n\tpsTdmaCase = pCoexDm->curPsTdma;\n\n\tif (pCoexDm->bIsSwitchTo1dot5Ant)\n\t\tpsTdmaCase = psTdmaCase + 100;\n\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)\", \"PS TDMA\", \\\n\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, \n\t\t\t(pCoexDm->bCurPsTdmaOn? \"On\":\"Off\"),\n\t\t\t(pCoexDm->bAutoTdmaAdjust? \"Adj\":\"Fix\") );\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Coex Table Type\", \\\n\t\t\tpCoexSta->nCoexTableType);\n\t\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\tpCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x778/0x880[29:25]\", \\\n\t\tu1Tmp[0], (u4Tmp[0]&0x3e000000) >> 25);\n\tCL_PRINTF(cliBuf);\n\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x948/ 0x67[5] / 0x765\", \\\n\t\tu4Tmp[0], ((u1Tmp[0]&0x20)>> 5), u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944);\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x92c[1:0]/ 0x930[7:0]/0x944[1:0]\", \\\n\t\tu4Tmp[0]&0x3, u4Tmp[1]&0xff, u4Tmp[2]&0x3);\n\tCL_PRINTF(cliBuf);\n\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x38[11]/0x40/0x4c[24:23]/0x64[0]\", \\\n\t\t((u1Tmp[0] & 0x8)>>3), u1Tmp[1], ((u4Tmp[0]&0x01800000)>>23), u1Tmp[2]&0x1);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(dig)/0x49c(null-drop)\", \\\n\t\tu4Tmp[0]&0xff, u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\n\tfaOfdm = ((u4Tmp[0]&0xffff0000) >> 16) +  ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \\\n\t\t             ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ;\n\tfaCck = (u1Tmp[0] << 8) + u1Tmp[1];\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"OFDM-CCA/OFDM-FA/CCK-FA\", \\\n\t\tu4Tmp[0]&0xffff, faOfdm, faCck);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_OK CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_Err CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\n\tCL_PRINTF(cliBuf);\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8703B_2ANT == 1)\n\t//halbtc8703b2ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8703b2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8703b2ant_WifiOffHwCfg(pBtCoexist);\n\t\thalbtc8703b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\thalbtc8703b2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\t\thalbtc8703b2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8703b2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8703b2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu1Byte \tu1Tmpa, u1Tmpb;\t\n\t\n\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\t\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\\n\",\n\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n}\n\nVOID\nEXhalbtc8703b2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tu1Byte\t\t\tapNum=0;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\tif(apNum < 10)\n\t\t\t\tH2C_Parameter[2] = 0x30;\n\t\t\telse\n\t\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t}\n\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\t\n}\n\nVOID\nEXhalbtc8703b2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE;\n\tstatic BOOLEAN\t\tbPreScoExist=FALSE;\n\tu4Byte\t\t\t\traMask=0x0;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8703B_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8703B_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), return for Manual CTRL<===\\n\"));\n\t\treturn;\n\t}\n\n\t// if 0xff, it means BT is under WHCK test\n\tif (btInfo == 0xff)\n\t\tpCoexSta->bBtWhckTest = TRUE;\n\telse\n\t\tpCoexSta->bBtWhckTest = FALSE;\n\n\tif(BT_INFO_SRC_8703B_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif (pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);\n\t\t}\n\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8703b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8703b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif( (pCoexSta->btInfoExt & BIT3) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\thalbtc8703b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8703B_2ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8703b2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8703B_2ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8703B_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8703B_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8703B_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tif ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) && (pCoexSta->bScoExist == FALSE))\n\t\t{\n\t\t\tif (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160) \t\t\n\t\t\t{\n\t\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\t\tbtInfo = btInfo | 0x20;\n\t\t\t}\n\t\t}\n\t}\n\n\thalbtc8703b2ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tif(!(btInfo&BT_INFO_8703B_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8703B_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8703B_2ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8703B_2ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_2ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8703B_2ANT_B_ACL_BUSY)\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_2ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8703B_2ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\t\n\tif( (BT_8703B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8703B_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbBtBusy = TRUE;\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8703b2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8703b2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8703b2ant_WifiOffHwCfg(pBtCoexist);\n\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\n\thalbtc8703b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\n\tEXhalbtc8703b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8703b2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\thalbtc8703b2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8703b2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8703b2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8703b2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\t//static u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(pCoexSta->disVerInfoCnt <= 5)\n\t{\n\t\tpCoexSta->disVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8703b2Ant, GLCoexVer8703b2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\n\t\tif (pCoexSta->disVerInfoCnt == 3)\n\t\t{\n\t\t\t//Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial \n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set GNT_BT control by PTA\\n\"));\n\t\t\thalbtc8703b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE);\n\t\t}\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8703B_2ANT == 0)\n\thalbtc8703b2ant_QueryBtInfo(pBtCoexist);\n\thalbtc8703b2ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8703b2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8703b2ant_MonitorWiFiCtr(pBtCoexist);\n\t\n\tif( halbtc8703b2ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust)\n\t{\n\t\thalbtc8703b2ant_RunCoexistMechanism(pBtCoexist);\n\t}\n#endif\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8703b2Ant.h",
    "content": "//===========================================\n// The following is for 8703B 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8703B_2ANT\t\t\t\t1\n\n\n#define\tBT_INFO_8703B_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8703B_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8703B_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8703B_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8703B_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8703B_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8703B_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8703B_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8703B_2ANT\t\t2\n\n\n#define\tBT_8703B_2ANT_WIFI_RSSI_COEXSWITCH_THRES\t\t\t\t42  //WiFi RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n#define\tBT_8703B_2ANT_BT_RSSI_COEXSWITCH_THRES\t\t\t\t46 //BT RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n\ntypedef enum _BT_INFO_SRC_8703B_2ANT{\n\tBT_INFO_SRC_8703B_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8703B_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8703B_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8703B_2ANT_MAX\n}BT_INFO_SRC_8703B_2ANT,*PBT_INFO_SRC_8703B_2ANT;\n\ntypedef enum _BT_8703B_2ANT_BT_STATUS{\n\tBT_8703B_2ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8703B_2ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8703B_2ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8703B_2ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8703B_2ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8703B_2ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8703B_2ANT_BT_STATUS_MAX\n}BT_8703B_2ANT_BT_STATUS,*PBT_8703B_2ANT_BT_STATUS;\n\ntypedef enum _BT_8703B_2ANT_COEX_ALGO{\n\tBT_8703B_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8703B_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8703B_2ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8703B_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8703B_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8703B_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8703B_2ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8703B_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8703B_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8703B_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8703B_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8703B_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8703B_2ANT_COEX_ALGO,*PBT_8703B_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8703B_2ANT{\n\t// fw mechanism\n\tu1Byte\t\tpreBtDecPwrLvl;\n\tu1Byte\t\tcurBtDecPwrLvl;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tBOOLEAN\t\tbNeedRecover0x948;\n\tu4Byte\t\tbackup0x948;\n\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\tBOOLEAN\t\tbIsSwitchTo1dot5Ant;\n} COEX_DM_8703B_2ANT, *PCOEX_DM_8703B_2ANT;\n\ntypedef struct _COEX_STA_8703B_2ANT{\t\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8703B_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8703B_2ANT_MAX];\n\tBOOLEAN \t\t\t\tbBtWhckTest;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\n\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\n\tu1Byte\t\t\t\t\tdisVerInfoCnt;\n}COEX_STA_8703B_2ANT, *PCOEX_STA_8703B_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8703b2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8703b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8703b2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8703b2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8703b2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8703b2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723a1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8723A Co-exist mechanism\n//\n// History\n// 2012/08/22 Cosa first check in.\n// 2012/11/14 Cosa Revise for 8723A 1Ant out sourcing.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8723a1Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8723A_1ANT\tGLCoexDm8723a1Ant;\nstatic PCOEX_DM_8723A_1ANT \tpCoexDm=&GLCoexDm8723a1Ant;\nstatic COEX_STA_8723A_1ANT\tGLCoexSta8723a1Ant;\nstatic PCOEX_STA_8723A_1ANT\tpCoexSta=&GLCoexSta8723a1Ant;\n\nconst char *const GLBtInfoSrc8723a1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8723a1ant_\n//============================================================\nVOID\nhalbtc8723a1ant_Reg0x550Bit3(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSet\n\t)\n{\n\tu1Byte\tu1tmp=0;\n\t\n\tu1tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x550);\n\tif(bSet)\n\t{\n\t\tu1tmp |= BIT3;\n\t}\n\telse\n\t{\n\t\tu1tmp &= ~BIT3;\n\t}\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x550, u1tmp);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], set 0x550[3]=%d\\n\", (bSet? 1:0)));\n}\n\nVOID\nhalbtc8723a1ant_NotifyFwScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tscanType\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tif(BTC_SCAN_START == scanType)\n\t\tH2C_Parameter[0] = 0x1;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Notify FW for wifi scan, write 0x3b=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x3b, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x38=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x38, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a1ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf0ff7);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a1ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8723a1ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8723a1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\ttmpU1 |= BIT0;\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8723a1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\treturn;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8723a1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8723a1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8723a1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8723a1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8723a1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x25, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723a1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8723a1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8723a1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\t// byte1[1:0] != 0 means enable pstdma\n\t// for 2Ant bt coexist, if byte1 != 0 means enable pstdma\n\tif(byte1)\n\t{\n\t\tif(bApEnable)\n\t\t{\n\t\t\tif(type != 5 && type != 12)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\t\trealByte1 &= ~BIT4;\n\t\t\t\trealByte1 |= BIT5;\n\n\t\t\t\trealByte5 |= BIT5;\n\t\t\t\trealByte5 &= ~BIT6;\n\t\t\t}\n\t\t}\n\t}\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x3a, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\t\t\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\tif(pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tswitch(pCoexDm->curPsTdma)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x1a, 0x1a, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x12, 0x12, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x3f, 0x3, 0x10, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0xa9, 0x15, 0x3, 0x35, 0xc0);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 8: \n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9: \n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x5, 0x5, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0xa9, 0xa, 0x3, 0x15, 0xc0);\n\t\t\t\tbreak;\n\t\n\t\t\tcase 18:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\t\t\t\n\n\t\t\tcase 20:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x2a, 0x2a, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x20, 0x3, 0x10, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x1a, 0x1a, 0x2, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x12, 0x12, 0x2, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0xa, 0xa, 0x2, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x5, 0x5, 0x2, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x13, 0x5, 0x5, 0x2, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x3, 0x2f, 0x2f, 0x0, 0x0);\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(pCoexDm->curPsTdma)\n\t\t{\n\t\t\tcase 8:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x8, 0x0, 0x0, 0x0, 0x0);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x860, 0x210);\n\t\t\t\tbreak;\n\t\t\tcase 9:\n\t\t\t\thalbtc8723a1ant_SetFwPstdma(pBtCoexist, type, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x860, 0x110);\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\n\nVOID\nhalbtc8723a1ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8723a1ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t// sw all off\n\thalbtc8723a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a1ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t// hw all off\n\thalbtc8723a1ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n}\n\nVOID\nhalbtc8723a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// force to reset coex mechanism\n\thalbtc8723a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n}\n\nVOID\nhalbtc8723a1ant_BtEnableAction(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n}\n\nVOID\nhalbtc8723a1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8723a1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\t\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t\thalbtc8723a1ant_BtEnableAction(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a1ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\tu1Byte\t\t\tbtState;\n\tBOOLEAN\t\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tu4Byte\t\t\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tbtState = pCoexDm->btStatus;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\tif(pCoexDm->psTdmaGlobalCnt != pCoexDm->psTdmaMonitorCnt)\n\t{\n\t\tpCoexDm->psTdmaMonitorCnt = 0;\n\t\tpCoexDm->psTdmaGlobalCnt = 0;\n\t}\n\tif(pCoexDm->psTdmaMonitorCnt == 0)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], first run BT A2DP + WiFi busy state!!\\n\"));\n\t\tif(btState == BT_STATE_8723A_1ANT_ACL_ONLY_BUSY)\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\tpCoexDm->psTdmaDuAdjType = 22;\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0; \t\t\t \n\n\t\t\tif(up >= n) // if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\t\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT TxRx counter H+L <= 1200\\n\"));\n\t\t\tif(btState != BT_STATE_8723A_1ANT_ACL_ONLY_BUSY)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], NOT ACL only busy!\\n\"));\n\t\t\t\tif(BTC_WIFI_BW_HT40 != wifiBw)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 20MHz\\n\"));\n\t\t\t\t\tif(result == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pCoexDm->curPsTdma == 22)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 23;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 23)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 24;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 24)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 25);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 25;\n\t\t\t\t\t\t}\n\t\t\t\t\t} \n\t\t\t\t\telse if (result == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pCoexDm->curPsTdma == 25)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 24;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 24)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 23;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 23)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 22;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// error handle, if not in the following state,\n\t\t\t\t\t// set psTdma again.\n\t\t\t\t\tif( (pCoexDm->psTdmaDuAdjType != 22) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 23) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 24) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 25) )\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], duration case out of handle!!\\n\"));\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 23;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 40MHz\\n\"));\n\t\t\t\t\tif(result == -1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pCoexDm->curPsTdma == 23)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 24;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 24)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 25);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 25;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 25)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 27);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 27;\n\t\t\t\t\t\t}\n\t\t\t\t\t} \n\t\t\t\t\telse if (result == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pCoexDm->curPsTdma == 27)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 25);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 25;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 25)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 24;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(pCoexDm->curPsTdma == 24)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 23;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// error handle, if not in the following state,\n\t\t\t\t\t// set psTdma again.\n\t\t\t\t\tif( (pCoexDm->psTdmaDuAdjType != 23) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 24) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 25) &&\n\t\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 27) )\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], duration case out of handle!!\\n\"));\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 24;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ACL only busy\\n\"));\n\t\t\t\tif (result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// error handle, if not in the following state,\n\t\t\t\t// set psTdma again.\n\t\t\t\tif( (pCoexDm->psTdmaDuAdjType != 1) &&\n\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 2) &&\n\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 9) &&\n\t\t\t\t\t(pCoexDm->psTdmaDuAdjType != 11) )\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], duration case out of handle!!\\n\"));\n\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif( !bScan && !bLink &&\t!bRoam)\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n\tpCoexDm->psTdmaMonitorCnt++;\n}\n\n\nVOID\nhalbtc8723a1ant_CoexForWifiConnect(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE, bWifiBusy=FALSE;\n\tu1Byte\t\tbtState, btInfoOriginal=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tbtState = pCoexDm->btStatus;\n\tbtInfoOriginal = pCoexSta->btInfoC2h[BT_INFO_SRC_8723A_1ANT_BT_RSP][0];\n\n\tif(bWifiConnected)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi connected!!\\n\"));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\t\n\t\tif( !bWifiBusy &&\n\t\t\t((BT_STATE_8723A_1ANT_NO_CONNECTION == btState) ||\n\t\t\t(BT_STATE_8723A_1ANT_CONNECT_IDLE == btState)) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], [Wifi is idle] or [Bt is non connected idle or Bt is connected idle]!!\\n\"));\n\n\t\t\tif(BT_STATE_8723A_1ANT_NO_CONNECTION == btState)\n\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\n\t\t\telse if(BT_STATE_8723A_1ANT_CONNECT_IDLE == btState)\n\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xff000000, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( (BT_STATE_8723A_1ANT_SCO_ONLY_BUSY == btState) ||\n\t\t\t\t(BT_STATE_8723A_1ANT_ACL_SCO_BUSY == btState) ||\n\t\t\t\t(BT_STATE_8723A_1ANT_HID_BUSY == btState) ||\n\t\t\t\t(BT_STATE_8723A_1ANT_HID_SCO_BUSY == btState) )\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xff000000, 0x60);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xff000000, 0xc0);\n\t\t\t}\n\t\t\tswitch(btState)\n\t\t\t{\n\t\t\t\tcase BT_STATE_8723A_1ANT_NO_CONNECTION:\n\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_STATE_8723A_1ANT_CONNECT_IDLE:\n\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_STATE_8723A_1ANT_INQ_OR_PAG:\n\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_STATE_8723A_1ANT_SCO_ONLY_BUSY:\n\t\t\t\tcase BT_STATE_8723A_1ANT_ACL_SCO_BUSY:\n\t\t\t\tcase BT_STATE_8723A_1ANT_HID_BUSY:\n\t\t\t\tcase BT_STATE_8723A_1ANT_HID_SCO_BUSY:\n\t\t\t\t\thalbtc8723a1ant_TdmaDurationAdjust(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_STATE_8723A_1ANT_ACL_ONLY_BUSY:\n\t\t\t\t\tif (btInfoOriginal&BT_INFO_8723A_1ANT_B_A2DP)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_TdmaDurationAdjust(pBtCoexist);\n\t\t\t\t\t}\n\t\t\t\t\telse if(btInfoOriginal&BT_INFO_8723A_1ANT_B_FTP)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t}\n\t\t\t\t\telse if( (btInfoOriginal&BT_INFO_8723A_1ANT_B_A2DP) &&\n\t\t\t\t\t\t\t(btInfoOriginal&BT_INFO_8723A_1ANT_B_FTP) )\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], error!!!, undefined case in halbtc8723a1ant_CoexForWifiConnect()!!\\n\"));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is disconnected!!\\n\"));\n\t}\n\n\tpCoexDm->psTdmaGlobalCnt++;\n}\n\n//============================================================\n// work around function start with wa_halbtc8723a1ant_\n//============================================================\nVOID\nwa_halbtc8723a1ant_MonitorC2h(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu1Byte\ttmp1b=0x0;\n\tu4Byte\tcurC2hTotalCnt=0x0;\n\tstatic u4Byte\tpreC2hTotalCnt=0x0, sameCntPollingTime=0x0;\n\n\tcurC2hTotalCnt+=pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8723A_1ANT_BT_RSP];\n\n\tif(curC2hTotalCnt == preC2hTotalCnt)\n\t{\n\t\tsameCntPollingTime++;\n\t}\n\telse\n\t{\n\t\tpreC2hTotalCnt = curC2hTotalCnt;\n\t\tsameCntPollingTime = 0;\n\t}\n\n\tif(sameCntPollingTime >= 2)\n\t{\n\t\ttmp1b = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x1af);\n\t\tif(tmp1b != 0x0)\n\t\t{\n\t\t\tpCoexSta->c2hHangDetectCnt++;\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x1af, 0x0);\n\t\t}\n\t}\n}\n\n//============================================================\n// extern function start with EXhalbtc8723a1ant_\n//============================================================\nVOID\nEXhalbtc8723a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\n\t// enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\t\n\t// coex table\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0);\t\t\t// 1-Ant coex\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffff);\t\t// wifi break table\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555);\t//coex table\n\n\t// antenna switch control parameter\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x858, 0xaaaaaaaa);\n\t\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x860, 0x210);\t//set antenna at wifi side if ANTSW is software control\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x870, 0x300);\t//SPDT(connected with TRSW) control by hardware PTA\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x874, 0x22804000);\t//ANTSW keep by GNT_BT\n\n\t// coexistence parameters\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\t// enable RTK mode PTA\n}\n\nVOID\nEXhalbtc8723a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8723a1ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"[Action Manual control]!!\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8723A_1ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? \"idle\":(  (BT_8723A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\"))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tif(pStackInfo->bProfileNotified)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8723A_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8723a1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"write 0x1af=0x0 num\", \\\n\t\tpCoexSta->c2hHangDetectCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d \", \"IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x783);\n\tu1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x796);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x778/ 0x783/ 0x796\", \\\n\t\tu1Tmp[0], u1Tmp[1], u1Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x880\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x40\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x484);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x484(rate adaptive)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xdac);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0xda0/0xda4/0xda8/0xdac(FA cnt)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u4Tmp[3]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770 (hp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(lp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8723a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\thalbtc8723a1ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\t//halbtc8723a1ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE;\n\t\n\thalbtc8723a1ant_NotifyFwScan(pBtCoexist, type);\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t{\n\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); \n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(BTC_SCAN_START == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t\t{\n\t\t\t\t//set 0x550[3]=1 before PsTdma\n\t\t\t\thalbtc8723a1ant_Reg0x550Bit3(pBtCoexist, TRUE);\n\t\t\t}\n\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t}\n\t\telse if(BTC_SCAN_FINISH == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t\t{\n\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a1ant_CoexForWifiConnect(pBtCoexist);\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE;\n\t\t\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t{\n\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9); \n\t}\n\telse\n\t{\n\t\tif(BTC_ASSOCIATE_START == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t\t\t//set 0x550[3]=1 before PsTdma\n\t\t\thalbtc8723a1ant_Reg0x550Bit3(pBtCoexist, TRUE);\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\t// extend wifi slot\t\n\t\t}\n\t\telse if(BTC_ASSOCIATE_FINISH == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t\t{\n\t\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a1ant_CoexForWifiConnect(pBtCoexist);\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtHsOn=FALSE, bBtBusy=FALSE, bForceLps=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\t\n\trspSource = BT_INFO_SRC_8723A_1ANT_BT_RSP;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 0)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8723A_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\n\t\t\tpCoexSta->btInfoC2h[rspSource][1];\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][3];\n\t}\n\t\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8723A_1ANT_B_INQ_PAGE)\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\t}\n\tbtInfo &= ~BIT2;\n\tif(!(btInfo & BIT0))\n\t{\n\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_NO_CONNECTION;\n\t\tbForceLps = FALSE;\n\t}\n\telse\n\t{\n\t\tbForceLps = TRUE;\n\t\tif(btInfo == 0x1)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_CONNECT_IDLE;\n\t\t}\n\t\telse if(btInfo == 0x9)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_ACL_ONLY_BUSY;\n\t\t\tbBtBusy = TRUE;\n\t\t}\n\t\telse if(btInfo == 0x13)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_SCO_ONLY_BUSY;\n\t\t\tbBtBusy = TRUE;\n\t\t}\n\t\telse if(btInfo == 0x1b)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_ACL_SCO_BUSY;\n\t\t\tbBtBusy = TRUE;\n\t\t}\n\t\telse if(btInfo == 0x29)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_HID_BUSY;\n\t\t\tbBtBusy = TRUE;\n\t\t}\n\t\telse if(btInfo == 0x3b)\n\t\t{\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_HID_SCO_BUSY;\n\t\t\tbBtBusy = TRUE;\n\t\t}\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bBtBusy);\n\tif(bForceLps)\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\telse\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\n\tif( (BT_STATE_8723A_1ANT_NO_CONNECTION == pCoexDm->btStatus) ||\n\t\t(BT_STATE_8723A_1ANT_CONNECT_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tif(pCoexSta->bC2hBtInquiryPage)\n\t\t\tpCoexDm->btStatus = BT_STATE_8723A_1ANT_INQ_OR_PAG;\n\t}\n}\n\nVOID\nEXhalbtc8723a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\thalbtc8723a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\n\thalbtc8723a1ant_LowPenaltyRa(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a1ant_RfShrink(pBtCoexist, FORCE_EXEC, FALSE);\n\n\thalbtc8723a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\tEXhalbtc8723a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8723a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiConnected=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Periodical!!\\n\"));\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// work around for c2h hang\n\twa_halbtc8723a1ant_MonitorC2h(pBtCoexist);\t\n\n\thalbtc8723a1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8723a1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8723a1ant_MonitorBtEnableDisable(pBtCoexist);\n\n\t\n\tif(bScan)\n\t\treturn;\n\tif(bLink)\n\t\treturn;\n\n\tif(bWifiConnected)\n\t{\n\t\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\t{\n\t\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\n\t\t\t\n\t\t\thalbtc8723a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a1ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a1ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a1ant_CoexForWifiConnect(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8723a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t\thalbtc8723a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a1ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t}\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723a1Ant.h",
    "content": "//===========================================\n// The following is for 8723A 1Ant BT Co-exist definition\n//===========================================\n#define\tBT_INFO_8723A_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8723A_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8723A_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8723A_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8723A_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8723A_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8723A_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8723A_1ANT_B_CONNECTION\t\t\t\tBIT0\n\ntypedef enum _BT_STATE_8723A_1ANT{\n\tBT_STATE_8723A_1ANT_DISABLED\t\t\t\t= 0,\n\tBT_STATE_8723A_1ANT_NO_CONNECTION\t\t= 1,\n\tBT_STATE_8723A_1ANT_CONNECT_IDLE\t\t= 2,\n\tBT_STATE_8723A_1ANT_INQ_OR_PAG\t\t\t= 3,\n\tBT_STATE_8723A_1ANT_ACL_ONLY_BUSY\t\t= 4,\n\tBT_STATE_8723A_1ANT_SCO_ONLY_BUSY\t\t= 5,\n\tBT_STATE_8723A_1ANT_ACL_SCO_BUSY\t\t\t= 6,\n\tBT_STATE_8723A_1ANT_HID_BUSY\t\t\t\t= 7,\n\tBT_STATE_8723A_1ANT_HID_SCO_BUSY\t\t\t= 8,\n\tBT_STATE_8723A_1ANT_MAX\n}BT_STATE_8723A_1ANT, *PBT_STATE_8723A_1ANT;\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8723A_1ANT\t\t2\n\ntypedef enum _BT_INFO_SRC_8723A_1ANT{\n\tBT_INFO_SRC_8723A_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8723A_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8723A_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8723A_1ANT_MAX\n}BT_INFO_SRC_8723A_1ANT,*PBT_INFO_SRC_8723A_1ANT;\n\ntypedef enum _BT_8723A_1ANT_BT_STATUS{\n\tBT_8723A_1ANT_BT_STATUS_IDLE\t\t\t\t= 0x0,\n\tBT_8723A_1ANT_BT_STATUS_CONNECTED_IDLE\t= 0x1,\n\tBT_8723A_1ANT_BT_STATUS_NON_IDLE\t\t\t= 0x2,\n\tBT_8723A_1ANT_BT_STATUS_MAX\n}BT_8723A_1ANT_BT_STATUS,*PBT_8723A_1ANT_BT_STATUS;\n\ntypedef enum _BT_8723A_1ANT_COEX_ALGO{\n\tBT_8723A_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8723A_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8723A_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8723A_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8723A_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x4,\n\tBT_8723A_1ANT_COEX_ALGO_PANHS\t\t\t= 0x5,\n\tBT_8723A_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x6,\n\tBT_8723A_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x7,\n\tBT_8723A_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x8,\n\tBT_8723A_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0x9,\n\tBT_8723A_1ANT_COEX_ALGO_MAX\n}BT_8723A_1ANT_COEX_ALGO,*PBT_8723A_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8723A_1ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tu4Byte\t\tpsTdmaMonitorCnt;\n\tu4Byte\t\tpsTdmaGlobalCnt;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n} COEX_DM_8723A_1ANT, *PCOEX_DM_8723A_1ANT;\n\ntypedef struct _COEX_STA_8723A_1ANT{\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreBtRssiState1;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8723A_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8723A_1ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\t//BOOLEAN\t\t\t\t\tbHoldForStackOperation;\n\t//u1Byte\t\t\t\t\tbHoldPeriodCnt;\n\t// this is for c2h hang work-around\n\tu4Byte\t\t\t\t\tc2hHangDetectCnt;\n}COEX_STA_8723A_1ANT, *PCOEX_STA_8723A_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8723a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8723a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723a2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8723A Co-exist mechanism\n//\n// History\n// 2012/08/22 Cosa first check in.\n// 2012/11/14 Cosa Revise for 8723A 2Ant out sourcing.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8723a2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8723A_2ANT\tGLCoexDm8723a2Ant;\nstatic PCOEX_DM_8723A_2ANT \tpCoexDm=&GLCoexDm8723a2Ant;\nstatic COEX_STA_8723A_2ANT\tGLCoexSta8723a2Ant;\nstatic PCOEX_STA_8723A_2ANT\tpCoexSta=&GLCoexSta8723a2Ant;\n\nconst char *const GLBtInfoSrc8723a2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8723a2ant_\n//============================================================\nBOOLEAN\nhalbtc8723a2ant_IsWifiIdle(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE, bScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\tif(bWifiConnected)\n\t\treturn FALSE;\n\tif(bScan)\n\t\treturn FALSE;\n\tif(bLink)\n\t\treturn FALSE;\n\tif(bRoam)\n\t\treturn FALSE;\n\n\treturn TRUE;\n}\n\nBOOLEAN\nhalbtc8723a2ant_IsWifiConnectedIdle(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE, bScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(bScan)\n\t\treturn FALSE;\n\tif(bLink)\n\t\treturn FALSE;\n\tif(bRoam)\n\t\treturn FALSE;\n\tif(bWifiConnected && !bWifiBusy)\n\t\treturn TRUE;\n\telse \n\t\treturn FALSE;\n}\n\nu1Byte\nhalbtc8723a2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8723a2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8723a2ant_IndicateWifiChnlBwInfo(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\t\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x19=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x19, 3, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x38=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x38, 1, H2C_Parameter);\n}\nu1Byte\nhalbtc8723a2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE, bBtBusy=FALSE, bLimitedDig=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8723A_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\t//======================\n\t// here we get BT status first\n\t//======================\n\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_IDLE;\n\t\n\tif((pStackInfo->bScoExist) ||(bBtHsOn) ||(pStackInfo->bHidExist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO or HID or HS exists, set BT non-idle !!!\\n\"));\n\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE;\n\t}\n\telse\n\t{\n\t\t// A2dp profile\n\t\tif( (pBtCoexist->stackInfo.numOfLink == 1) &&\n\t\t\t(pStackInfo->bA2dpExist) )\n\t\t{\t\t\n\t\t\tif( (pCoexSta->lowPriorityTx+\tpCoexSta->lowPriorityRx) < 100)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP, low priority tx+rx < 100, set BT connected-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP, low priority tx+rx >= 100, set BT non-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE;\n\t\t\t}\n\t\t}\n\t\t// Pan profile\n\t\tif( (pBtCoexist->stackInfo.numOfLink == 1) &&\n\t\t\t(pStackInfo->bPanExist) )\n\t\t{\t\t\n\t\t\tif((pCoexSta->lowPriorityTx+\tpCoexSta->lowPriorityRx) < 600)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN, low priority tx+rx < 600, set BT connected-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pCoexSta->lowPriorityTx)\n\t\t\t\t{\n\t\t\t\t\tif((pCoexSta->lowPriorityRx /pCoexSta->lowPriorityTx)>9 )\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN, low priority rx/tx > 9, set BT connected-idle!!!\\n\"));\n\t\t\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN, set BT non-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE;\n\t\t\t}\n\t\t}\n\t\t// Pan+A2dp profile\n\t\tif( (pBtCoexist->stackInfo.numOfLink == 2) &&\n\t\t\t(pStackInfo->bA2dpExist) &&\n\t\t\t(pStackInfo->bPanExist) )\n\t\t{\n\t\t\tif((pCoexSta->lowPriorityTx+\tpCoexSta->lowPriorityRx) < 600)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN+A2DP, low priority tx+rx < 600, set BT connected-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pCoexSta->lowPriorityTx)\n\t\t\t\t{\n\t\t\t\t\tif((pCoexSta->lowPriorityRx /pCoexSta->lowPriorityTx)>9 )\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN+A2DP, low priority rx/tx > 9, set BT connected-idle!!!\\n\"));\n\t\t\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN+A2DP, set BT non-idle!!!\\n\"));\n\t\t\t\tpCoexDm->btStatus = BT_8723A_2ANT_BT_STATUS_NON_IDLE;\n\t\t\t}\n\t\t}\n\t}\n\tif(BT_8723A_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus)\n\t{\n\t\tbBtBusy = TRUE;\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\t//======================\n\n\tif(!pStackInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No profile exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pStackInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nBOOLEAN\nhalbtc8723a2ant_NeedToDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbRet=FALSE;\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiConnected=FALSE;\n\ts4Byte\t\tbtHsRssi=0;\n\tu1Byte\t\tbtRssiState=BTC_RSSI_STATE_HIGH;\n\n\tbtRssiState = halbtc8723a2ant_BtRssiState(2, 42, 0);\n\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\n\t\treturn FALSE;\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\n\t\treturn FALSE;\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\n\t\treturn FALSE;\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\treturn FALSE;\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bBtHsOn)\n\t\t{\n\t\t\tif(btHsRssi > 37)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Need to decrease bt power for HS mode!!\\n\"));\n\t\t\t\tbRet = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Need to decrease bt power for Wifi is connected!!\\n\"));\n\t\t\tbRet = TRUE;\n\t\t}\n\t}\n\t\n\treturn bRet;\n}\n\nVOID\nhalbtc8723a2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x29=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x29, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbDecBtPwr\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bDecBtPwr)\n\t{\n\t\tH2C_Parameter[0] |= BIT1;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power : %s, FW write 0x21=0x%x\\n\", \n\t\t(bDecBtPwr? \"Yes!!\":\"No!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x21, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723a2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDecBtPwr\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDecBtPwr)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurDecBtPwr = bDecBtPwr;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) \n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\n\n\tpCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\n}\n\nVOID\nhalbtc8723a2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8723a2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8723a2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf0ff7);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8723a2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\ttmpU1 |= BIT0;\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8723a2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\treturn;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8723a2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xff000000, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcSetBbReg(pBtCoexist, 0x880, 0xff000000, 0xc0);\n\t}\n}\n\n\nVOID\nhalbtc8723a2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8723a2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8723a2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a07611);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc04,0x3a05611);\n\t}\n}\n\nVOID\nhalbtc8723a2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8723a2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4e1c0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4d1d0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4c1e0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4b1f0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x4a200001);\n\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xdc000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x90000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x51000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x12000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x00355);\n\t\t\n\t\trssiAdjustVal = 6;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x641c0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x631d0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x621e0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x611f0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78,0x60200001);\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x32000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0x71000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xb0000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x12, 0xfffff, 0xfc000);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1a, 0xfffff, 0x30355);\n\t}\n\n\t// set rssiAdjustVal for wifi module.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\n\nVOID\nhalbtc8723a2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8723a2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8723a2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8723a2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x25=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x25, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723a2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8723a2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8723a2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\n\tH2C_Parameter[0] = byte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = byte5;\n\n\tpCoexDm->psTdmaPara[0] = byte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = byte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x3a(5bytes)=0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x3a, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8723a2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tbtTxRxCnt=0;\n\n\tbtTxRxCnt = pCoexSta->highPriorityTx+pCoexSta->highPriorityRx+\n\t\t\t\tpCoexSta->lowPriorityTx+pCoexSta->lowPriorityRx;\n\n\tif(btTxRxCnt > 3000)\n\t{\t\t\n\t\tpCoexDm->bCurPsTdmaOn = TRUE;\n\t\tpCoexDm->curPsTdma = 8;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], turn ON PS TDMA, type=%d for BT tx/rx counters=%d(>3000)\\n\", \n\t\t\tpCoexDm->curPsTdma, btTxRxCnt));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\t\t\n\t\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\t\tpCoexDm->curPsTdma = type;\n\t}\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\tif(pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tswitch(pCoexDm->curPsTdma)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x5, 0x5, 0xe1, 0x80);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 8: \n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x5, 0x5, 0x60, 0x80);\n\t\t\t\tbreak;\n\t\t\tcase 9: \n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x80);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x98);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x98);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(pCoexDm->curPsTdma)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8723a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\n\nVOID\nhalbtc8723a2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t// sw all off\n\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\n\t// hw all off\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n}\n\nVOID\nhalbtc8723a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// force to reset coex mechanism\n\thalbtc8723a2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0xffff, 0x3);\n\thalbtc8723a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 0x20);\n\thalbtc8723a2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\n\thalbtc8723a2ant_AgcTable(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a2ant_AdcBackOff(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a2ant_RfShrink(pBtCoexist, FORCE_EXEC, FALSE);\n\thalbtc8723a2ant_DacSwing(pBtCoexist, FORCE_EXEC, FALSE, 0xc0);\n}\n\nVOID\nhalbtc8723a2ant_BtInquiryPage(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\tbLowPwrDisable=TRUE;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n}\n\nVOID\nhalbtc8723a2ant_BtEnableAction(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbWifiConnected=FALSE;\n\t\n\t// Here we need to resend some wifi info to BT\n\t// because bt is reset and loss of the info.\t\t\t\t\t\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tif(bWifiConnected)\n\t{\n\t\thalbtc8723a2ant_IndicateWifiChnlBwInfo(pBtCoexist, BTC_MEDIA_CONNECT);\n\t}\n\telse\n\t{\n\t\thalbtc8723a2ant_IndicateWifiChnlBwInfo(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t}\n\n\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n}\n\nVOID\nhalbtc8723a2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8723a2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t\thalbtc8723a2ant_BtEnableAction(pBtCoexist);\n\t\t}\n\t}\n}\n\nBOOLEAN\nhalbtc8723a2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE;\n\tBOOLEAN\t\t\tbLowPwrDisable=FALSE;\n\n\tif(!pStackInfo->bBtLinkExist)\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t}\n\telse\n\t{\n\t\tbLowPwrDisable = TRUE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tif(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && \n\t\tBT_8723A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi idle + Bt idle!!\\n\"));\n\t\t\t\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!halbtc8723a2ant_IsWifiIdle(pBtCoexist) && \n\t\t\t(BT_8723A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-idle + BT idle!!\\n\"));\n\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && \n\t\t(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi idle + Bt connected idle!!\\n\"));\n\t\t\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!halbtc8723a2ant_IsWifiIdle(pBtCoexist) && \n\t\t(BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-idle + Bt connected idle!!\\n\"));\n\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(halbtc8723a2ant_IsWifiIdle(pBtCoexist) && \n\t\t\t(BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi idle + BT non-idle!!\\n\"));\n\t\t\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse if(halbtc8723a2ant_IsWifiConnectedIdle(pBtCoexist) && \n\t\t\t(BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected-idle + BT non-idle!!\\n\"));\n\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-idle + BT non-idle!!\\n\"));\n\t\thalbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\nVOID\nhalbtc8723a2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(pCoexDm->bResetTdmaAdjust)\n\t{\n\t\tpCoexDm->bResetTdmaAdjust = FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8723a2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, wifiRssiState1;\n\tu4Byte\twifiBw;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t}\n\n\t\t// sw mechanism\t\t\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\t\t\n\t}\n}\n\n\nVOID\nhalbtc8723a2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, wifiRssiState1;\n\tu4Byte\twifiBw;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t}\n\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8723a2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp rate, 1:basic /0:edr\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp rate, 1:basic /0:edr\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\t\t\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp rate, 1:basic /0:edr\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp rate, 1:basic /0:edr\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8723a2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btInfoExt;\n\tu4Byte\t\twifiBw;\n\t\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\t\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t}\n\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\n\n//PAN(HS) only\nVOID\nhalbtc8723a2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState;\n\tu4Byte\t\twifiBw;\n\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t}\n\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t\t// sw mechanism\t\t\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8723a2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1;\n\tu4Byte\t\twifiBw;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); \n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); \n\t\t}\n\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8723a2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\t\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(halbtc8723a2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\thalbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 37, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 1);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t}\n\telse\n\t{\n\t\twifiRssiState = halbtc8723a2ant_WifiRssiState(pBtCoexist, 0, 2, 27, 0);\n\t\twifiRssiState1 = halbtc8723a2ant_WifiRssiState(pBtCoexist, 1, 2, 47, 0);\n\t\t\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8723a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 1);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState1 == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState1 == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\thalbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723a2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Manual control!!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pStackInfo->bProfileNotified)\n\t{\n\t\tif(pCoexSta->bHoldForStackOperation)\n\t\t{\n\t\t\t// if bt inquiry/page/pair, do not execute.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\talgorithm = halbtc8723a2ant_ActionAlgorithm(pBtCoexist);\n\t\tif(pCoexSta->bHoldPeriodCnt && (BT_8723A_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex],Hold BT inquiry/page scan setting (cnt = %d)!!\\n\", \n\t\t\t\tpCoexSta->bHoldPeriodCnt));\n\t\t\tif(pCoexSta->bHoldPeriodCnt >= 6)\n\t\t\t{\n\t\t\t\tpCoexSta->bHoldPeriodCnt = 0;\n\t\t\t\t// next time the coexist parameters should be reset again.\n\t\t\t}\n\t\t\telse\n\t\t\t\tpCoexSta->bHoldPeriodCnt++;\n\t\t\treturn;\n\t\t}\n\n\t\tpCoexDm->curAlgorithm = algorithm;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\t\tif(halbtc8723a2ant_IsCommonAction(pBtCoexist))\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\t\tpCoexDm->bResetTdmaAdjust = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\t\tpCoexDm->bResetTdmaAdjust = TRUE;\n\t\t\t}\n\t\t\tswitch(pCoexDm->curAlgorithm)\n\t\t\t{\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_SCO:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionSco(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_HID:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionHid(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_PANHS:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionPanHs(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8723A_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\t\thalbtc8723a2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\t\thalbtc8723a2ant_CoexAllOff(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t\t}\n\t}\n}\n\n//============================================================\n// work around function start with wa_halbtc8723a2ant_\n//============================================================\nVOID\nwa_halbtc8723a2ant_MonitorC2h(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu1Byte\ttmp1b=0x0;\n\tu4Byte\tcurC2hTotalCnt=0x0;\n\tstatic u4Byte\tpreC2hTotalCnt=0x0, sameCntPollingTime=0x0;\n\n\tcurC2hTotalCnt+=pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8723A_2ANT_BT_RSP];\n\n\tif(curC2hTotalCnt == preC2hTotalCnt)\n\t{\n\t\tsameCntPollingTime++;\n\t}\n\telse\n\t{\n\t\tpreC2hTotalCnt = curC2hTotalCnt;\n\t\tsameCntPollingTime = 0;\n\t}\n\n\tif(sameCntPollingTime >= 2)\n\t{\n\t\ttmp1b = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x1af);\n\t\tif(tmp1b != 0x0)\n\t\t{\n\t\t\tpCoexSta->c2hHangDetectCnt++;\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x1af, 0x0);\n\t\t}\n\t}\n}\n\n//============================================================\n// extern function start with EXhalbtc8723a2ant_\n//============================================================\nVOID\nEXhalbtc8723a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8723a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n}\n\nVOID\nEXhalbtc8723a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8723a2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"[Action Manual control]!!\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8723A_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? \"idle\":(  (BT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\"))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tif(pStackInfo->bProfileNotified)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8723A_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8723a2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"write 0x1af=0x0 num\", \\\n\t\tpCoexSta->c2hHangDetectCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x783);\n\tu1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x796);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x778/ 0x783/ 0x796\", \\\n\t\tu1Tmp[0], u1Tmp[1], u1Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x880\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x40\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x484);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x484(rate adaptive)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xdac);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0xda0/0xda4/0xda8/0xdac(FA cnt)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u4Tmp[3]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770 (hp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(lp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8723a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\thalbtc8723a2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\t//halbtc8723a2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\thalbtc8723a2ant_IndicateWifiChnlBwInfo(pBtCoexist, type);\n}\n\nVOID\nEXhalbtc8723a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bBtHsOn=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\t\n\trspSource = BT_INFO_SRC_8723A_2ANT_BT_RSP;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 0)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8723A_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\n\t\t\tpCoexSta->btInfoC2h[rspSource][1];\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][3];\n\t}\n\t\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8723A_2ANT_B_INQ_PAGE)\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_StackOperationNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(BTC_STACK_OP_INQ_PAGE_PAIR_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], StackOP Inquiry/page/pair start notify\\n\"));\n\t\tpCoexSta->bHoldForStackOperation = TRUE;\n\t\tpCoexSta->bHoldPeriodCnt = 1;\n\t\thalbtc8723a2ant_BtInquiryPage(pBtCoexist);\n\t}\n\telse if(BTC_STACK_OP_INQ_PAGE_PAIR_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], StackOP Inquiry/page/pair finish notify\\n\"));\n\t\tpCoexSta->bHoldForStackOperation = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8723a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8723a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\tEXhalbtc8723a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8723a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Periodical!!\\n\"));\n\n\t// work around for c2h hang\n\twa_halbtc8723a2ant_MonitorC2h(pBtCoexist);\n\t\n\thalbtc8723a2ant_QueryBtInfo(pBtCoexist);\n\thalbtc8723a2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8723a2ant_MonitorBtEnableDisable(pBtCoexist);\n\n\thalbtc8723a2ant_RunCoexistMechanism(pBtCoexist);\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723a2Ant.h",
    "content": "//===========================================\n// The following is for 8723A 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_INFO_8723A_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8723A_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8723A_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8723A_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8723A_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8723A_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8723A_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8723A_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8723A_2ANT\t\t2\n\ntypedef enum _BT_INFO_SRC_8723A_2ANT{\n\tBT_INFO_SRC_8723A_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8723A_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8723A_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8723A_2ANT_MAX\n}BT_INFO_SRC_8723A_2ANT,*PBT_INFO_SRC_8723A_2ANT;\n\ntypedef enum _BT_8723A_2ANT_BT_STATUS{\n\tBT_8723A_2ANT_BT_STATUS_IDLE\t\t\t\t= 0x0,\n\tBT_8723A_2ANT_BT_STATUS_CONNECTED_IDLE\t= 0x1,\n\tBT_8723A_2ANT_BT_STATUS_NON_IDLE\t\t\t= 0x2,\n\tBT_8723A_2ANT_BT_STATUS_MAX\n}BT_8723A_2ANT_BT_STATUS,*PBT_8723A_2ANT_BT_STATUS;\n\ntypedef enum _BT_8723A_2ANT_COEX_ALGO{\n\tBT_8723A_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8723A_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8723A_2ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8723A_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8723A_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x4,\n\tBT_8723A_2ANT_COEX_ALGO_PANHS\t\t\t= 0x5,\n\tBT_8723A_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x6,\n\tBT_8723A_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x7,\n\tBT_8723A_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x8,\n\tBT_8723A_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0x9,\n\tBT_8723A_2ANT_COEX_ALGO_MAX\n}BT_8723A_2ANT_COEX_ALGO,*PBT_8723A_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8723A_2ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbPreDecBtPwr;\n\tBOOLEAN\t\tbCurDecBtPwr;\n\t//BOOLEAN\t\tbPreBtLnaConstrain;\n\t//BOOLEAN\t\tbCurBtLnaConstrain;\n\t//u1Byte\t\tbPreBtPsdMode;\n\t//u1Byte\t\tbCurBtPsdMode;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\t//BOOLEAN\t\tbPreBtAutoReport;\n\t//BOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n} COEX_DM_8723A_2ANT, *PCOEX_DM_8723A_2ANT;\n\ntypedef struct _COEX_STA_8723A_2ANT{\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreBtRssiState1;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8723A_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8723A_2ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tBOOLEAN\t\t\t\t\tbHoldForStackOperation;\n\tu1Byte\t\t\t\t\tbHoldPeriodCnt;\n\t// this is for c2h hang work-around\n\tu4Byte\t\t\t\t\tc2hHangDetectCnt;\n}COEX_STA_8723A_2ANT, *PCOEX_STA_8723A_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8723a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8723a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8723a2ant_StackOperationNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723b1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8723B Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8723b1Ant.tmh\"\n#endif\n\n//#include <Math.h>\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8723B_1ANT\t\tGLCoexDm8723b1Ant;\nstatic PCOEX_DM_8723B_1ANT \tpCoexDm=&GLCoexDm8723b1Ant;\nstatic COEX_STA_8723B_1ANT\t\tGLCoexSta8723b1Ant;\nstatic PCOEX_STA_8723B_1ANT\tpCoexSta=&GLCoexSta8723b1Ant;\nstatic PSDSCAN_STA_8723B_1ANT\tGLPsdScan8723b1Ant;\nstatic PPSDSCAN_STA_8723B_1ANT pPsdScan = &GLPsdScan8723b1Ant;\n\n\nconst char *const GLBtInfoSrc8723b1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8723b1Ant=20150119;\nu4Byte\tGLCoexVer8723b1Ant=0x58;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8723b1ant_\n//============================================================\nu1Byte\nhalbtc8723b1ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8723b1ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8723b1ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8723b1ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8723b1ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8723b1ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8723b1ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8723b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8723b1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8723b1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8723b1ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8723b1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp, u4Tmp1;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp, u1Tmp1;\n\ts4Byte\t\t\twifiRssi;\n\tstatic u4Byte\t\tNumOfBtCounterChk = 0;\n\t\n       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\n\t//if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\t//pCoexSta->highPriorityTx = 65535;\n\t\t//pCoexSta->highPriorityRx = 65535;\n\t\t//pCoexSta->lowPriorityTx = 65535;\n\t\t//pCoexSta->lowPriorityRx = 65535;\n\t\t//return;\n\t}\n\t\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif( (pCoexSta->lowPriorityTx > 1050)  && (!pCoexSta->bC2hBtInquiryPage))\n\t\tpCoexSta->popEventCnt++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\\n\",\n\t\tregHPRx, regHPTx, regLPRx, regLPTx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n\n\t// This part is for wifi FW and driver to update BT's status as disabled.\n\t// The flow is as the following \n\t// 1. disable BT\n\t// 2. if all BT Tx/Rx counter=0, after 6 sec we query bt info\n\t// 3. Because BT will not rsp from mailbox, so wifi fw will know BT is disabled\n\t// 4. FW will rsp c2h for BT that driver will know BT is disabled.\n\tif ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\n\t{\n\t\tNumOfBtCounterChk++;\n\t\tif (NumOfBtCounterChk == 3)\n{\n\t\t\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n\t\t}\n\t}\n\telse\n\t{\n\t\t\tNumOfBtCounterChk = 0;\n\t\t}\n\t}\n\n\nVOID\nhalbtc8723b1ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\tu4Byte\tTotalCnt;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n\n\tif ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\n\t{\n\t\tTotalCnt = pCoexSta->nCRCOK_CCK + pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \n\t\t\t\tpCoexSta->nCRCOK_11nAgg;\n\t\n\t\tif ( (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) )\n\t\t{\n\t\t\tif (pCoexSta->nCRCOK_CCK >(TotalCnt -pCoexSta->nCRCOK_CCK)) \n\t\t\t{\n\t\t\t\tif (nCCKLockCounter < 3)\n\t\t\t\t nCCKLockCounter++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter > 0)\n\t\t\t\t nCCKLockCounter--;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (nCCKLockCounter > 0)\n\t\t\t  nCCKLockCounter--;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter > 0)\n\t\t\tnCCKLockCounter--;\n\t}\n\n\tif (!pCoexSta->bPreCCKLock)\n\t{\n\n\t\tif (nCCKLockCounter >= 3)\n\t\t pCoexSta->bCCKLock = TRUE;\n\t\telse\n\t\t pCoexSta->bCCKLock = FALSE;\t\t\t\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter == 0)\n\t\t pCoexSta->bCCKLock = FALSE;\n\t\telse\n\t\t pCoexSta->bCCKLock = TRUE;\t\t\n\t}\n\n\tif  (pCoexSta->bCCKLock)\n\t\tpCoexSta->bCCKEverLock = TRUE;\n\t\n\tpCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;\t\n\t\t\n\n}\n\nBOOLEAN\nhalbtc8723b1ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN bWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\n\t     \n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8723b1ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\tpBtLinkInfo->bBtHiPriLinkExist = pCoexSta->bBtHiPriLinkExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8723b1ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8723B_1ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO only\\n\"));\n\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID only\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8723b1ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723b1ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8723b1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8723b1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\") ));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8723b1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8723b1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8723b1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8723b1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8723b1ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\n#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\t\n\tif (pBoardInfo->btdmAntNumByAntDet == 2)\n\t{\n\t\tif (type == 3)\n\t\t\ttype = 14;\n\t\telse if (type == 4)\n\t\t\ttype  = 13;\n\t\telse if (type == 5)\n\t\t\ttype = 8;\n\t}\n#endif\n#endif\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], ********** CoexTable(%d) **********\\n\", type));\n\t\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tif  ( pCoexSta->bCCKEverLock) \n\t\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\telse\n\t\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tif  ( pCoexSta->bCCKEverLock) \n\t\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaa5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\telse\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\thalbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8723b1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8723b1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8723b1ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8723b1ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8723b1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8723b1ant_SwMechanism(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN \t\tbLowPenaltyRA\n\t) \n{\n\thalbtc8723b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8723b1ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\tfwVer=0, u4Tmp=0, cntBtCalChk=0;\n\tBOOLEAN\t\t\tbPgExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbUseExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbIsInMpMode = FALSE;\n\tu1Byte\t\t\tH2C_Parameter[2] ={0}, u1Tmp = 0;\n\n\tpCoexDm->curAntPosType = antPosType;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\t// [31:16]=fw ver, [15:0]=fw sub ver\n\n\tif((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\n\t\tbUseExtSwitch = TRUE;\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\n#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\n\t\tif (antPosType == BTC_ANT_PATH_PTA)\n\t\t{\n\t\t\tif ((pBoardInfo->btdmAntDetFinish) && (pBoardInfo->btdmAntNumByAntDet == 2))\n\t\t\t{\n\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\tantPosType = BTC_ANT_PATH_WIFI;\n\t\t\t\telse\n\t\t\t\t\tantPosType = BTC_ANT_PATH_BT;\n\t\t\t}\n\t\t}\n#endif\t\t\n#endif\n\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on\n\t\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on\n\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t/* Use H2C to set GNT_BT to HIGH */\n\t\tH2C_Parameter[0] = 1;\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// set grant_bt to high\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \n\t\t}\n\t\t//set wlan_act control by PTA\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); \n\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\n\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\n\t}\n\telse if(bWifiOff)\n\t{\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t/* Use H2C to set GNT_BT to HIGH */\n\t\tH2C_Parameter[0] = 1;\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// set grant_bt to high\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18); \n\t\t}\n\t\t//set wlan_act to always low\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\n\t\tif(!bIsInMpMode)\t\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\n\t\telse\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\n\t\n\t\t// 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL\tBT Vendor 0xac=0xf002\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &= ~BIT23;\n\t\tu4Tmp &= ~BIT24;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t}\n\telse\n\t{\t\t\t\n\t\t/* Use H2C to set GNT_BT to LOW */\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\tif (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0)\n\t\t{\t\t\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT calibration check\n\t\t\twhile(cntBtCalChk <= 20)\n\t\t\t{\n\t\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);\n\t\t\t\tcntBtCalChk++;\n\t\t\t\tif(u1Tmp & BIT0)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\\n\", cntBtCalChk));\n\t\t\t\t\tdelay_ms(50);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\\n\", cntBtCalChk));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// set grant_bt to PTA\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\n\t\t}\n\n\t\tif (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc)\n\t\t{\n\t\t\t//set wlan_act control by PTA\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); \n\t\t}\n\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\n\t}\n\t\n\tif(bUseExtSwitch)\n\t{\n\t\tif(bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp &=~BIT23;\n\t\t\tu4Tmp |= BIT24;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\n\n\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t{\n\t\t\t\t//tell firmware \"no antenna inverse\"\n\t\t\t\tH2C_Parameter[0] = 0;\n\t\t\t\tH2C_Parameter[1] = 1;  //ext switch type\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//tell firmware \"antenna inverse\"\n\t\t\t\tH2C_Parameter[0] = 1;\n\t\t\t\tH2C_Parameter[1] = 1;  //ext switch type\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType))\n\t\t{\n\t\t\t// ext switch setting\n\t\t\tswitch(antPosType)\n\t\t\t{\n\t\t\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\n\t\t\t\t\telse\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BTC_ANT_PATH_BT:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\n\t\t\t\t\telse\t\t\t\t\t\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tcase BTC_ANT_PATH_PTA:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\n\t\t\t\t\telse\n\t\t\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=1, 0x4c[24]=0  Antenna control by 0x64\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp |= BIT23;\n\t\t\tu4Tmp &=~BIT24;\t      \n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\t\t//Fix Ext switch Main->S1, Aux->S0\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); \n\n\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t{\n\t\n\t\t\t\t//tell firmware \"no antenna inverse\"\n\t\t\t\tH2C_Parameter[0] = 0;\n\t\t\t\tH2C_Parameter[1] = 0;  //internal switch type\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\n\t\t\t\t//tell firmware \"antenna inverse\"\n\t\t\t\tH2C_Parameter[0] = 1;\n\t\t\t\tH2C_Parameter[1] = 0;  //internal switch type\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\t\n\t\t\t}\n\t\t}\n\t\n\t\tif(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType))\n\t\t{\n\t\t\t// internal switch setting\n\t\t\tswitch(antPosType)\n\t\t\t{\n\t\t\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\t\t\telse\n\t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BTC_ANT_PATH_BT:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n \t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\n\t\t\t\t\telse\n\t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tcase BTC_ANT_PATH_PTA:\n\t\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200);\t\t\t\t\t\n\t\t\t\t\telse\n\t\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpCoexDm->preAntPosType = pCoexDm->curAntPosType;\n}\n\nVOID\nhalbtc8723b1ant_SetAntPathDCut(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbAntennaAux,\t//For 1-Ant--> 1: Antenna at S0, 0: Antenna at S1. Set 0 for 2-Ant\n\tIN\tBOOLEAN\t\t\t\tbExtSwitch,\t\t// 1: Ext Switch (SPDT) exist on module, 0: no Ext Switch (SPDT) exist on module\n\tIN\tBOOLEAN\t\t\t\tbTwoAntenna,\t// 1: 2-Antenna, 0:1-Antenna\n\tIN\tu1Byte\t\t\t\tantennaPos,\t\t//Set Antenna Pos, For 1-Ant: BTC_ANT_PATH_WIFI, BTC_ANT_PATH_BT, BTC_ANT_PATH_PTA, For 2-Ant:BTC_ANT_WIFI_AT_MAIN, BTC_ANT_WIFI_AT_Aux\n\tIN\tu1Byte\t\t\t\twifiState\t\t//BTC_WIFI_STAT_INIT, BTC_WIFI_STAT_IQK, BTC_WIFI_STAT_NORMAL_OFF, BTC_WIFI_STAT_MP_OFF, BTC_WIFI_STAT_NORMAL, BTC_WIFI_STAT_ANT_DIV\n\t)\n{\n\tu1Byte\tdataLen=5;\n\tu1Byte\tbuf[6] = {0};\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\\n\",\n\t\tbAntennaAux, bExtSwitch, bTwoAntenna, antennaPos, wifiState));\n\n\tbuf[0] = dataLen; \n\t\n\tif(bAntennaAux)\n\t\tbuf[1] = 0x1;\n\t\n\tif(bExtSwitch)\n\t\tbuf[2] = 0x1;\t\t\t\n\t\n\tif(bTwoAntenna)\n\t\tbuf[3] = 0x1;\n\n\tbuf[4] = antennaPos;\n\n\tbuf[5] = wifiState;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_8723B_ANT, (PVOID)&buf[0]);\t\n}\n\nVOID\nhalbtc8723b1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8723b1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0, rssiAdjustVal=0;\n\tu1Byte\t\t\tpsTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\tstatic BOOLEAN\t bPreWifiBusy=FALSE;\n\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\n#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\n\tif (pBoardInfo->btdmAntNumByAntDet == 2)\n\t{\n\t\tif (bTurnOn)\n\t\t\ttype = type +100;  //for WiFi RSSI low or BT RSSI low\n\t\telse\n\t\t\ttype = 1; //always translate to TDMA(off,1) for TDMA-off case\n\t}\n\t\n#endif\t\n#endif\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\t\n\n\tif (bWifiBusy != bPreWifiBusy)\n\t{\n\t\tbForceExec = TRUE;\t\n\t\tbPreWifiBusy = bWifiBusy;\n\t}\n\n\tif (pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(off, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t}\n\t\t\t\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\n\n\tif (pCoexSta->nScanAPNum <= 5)\n\t{\n\t\tnWiFiDurationAdjust = 5;\n\t\t\n\t\tif (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\n\t\telse if (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\t\n\t}\n\telse if  (pCoexSta->nScanAPNum >= 40)\n\t{\n\t\tnWiFiDurationAdjust = -15;\t\n\n\t\tif (pCoexSta->nA2DPBitPool < 35)\n\t\t  nWiFiDurationAdjust = -5;\n\t\telse if (pCoexSta->nA2DPBitPool < 45)\n\t\t  nWiFiDurationAdjust = -10; \n\t}\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t{\n\t\tnWiFiDurationAdjust = -10;\t\n\t\n\t\tif (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\n\t}\t\n\telse\n\t{\n\t\tnWiFiDurationAdjust = 0;\t       \n\t\t\n\t\tif (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\n\t\telse if (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\t\n\t}\n\t\n\tif ((type == 1) || (type == 2) || (type == 9) || (type == 11) || (type == 101)\n\t\t|| (type == 102) || (type == 109) || (type == 101))\n\t{\n\t\tif (!pCoexSta->bForceLpsOn)  //Native power save TDMA, only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot\n\t}\n\t\telse\n\t\t{\n\t\t\tpsTdmaByte0Val = 0x51;  //null-pkt\n\t\t\tpsTdmaByte3Val = 0x10; //tx-pause at BT-slot\n\t\t\tpsTdmaByte4Val = 0x50; // 0x778 = d/1 toggle, dynamic slot\n\t\t}\n\t}\n\telse if ((type == 3) || (type == 13) || (type == 14) || (type == 103) || (type == 113) || (type == 114))\n\t{\n\t\tpsTdmaByte0Val = 0x51;  //null-pkt\n\t\tpsTdmaByte3Val = 0x10; //tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle, no dynamic slot\n#if 0\t\n\t\tif (!bWifiBusy)\n\t\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n#endif\t\t\n\t}\n\telse  //native power save case\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x11; // 0x778 = d/1 toggle, no dynamic slot\n\t\t//psTdmaByte4Va is not defne for 0x778 = d/1, 1/1 case \n\t\t}\n\t\t \n\t//if (pBtLinkInfo->bSlaveRole == TRUE)\n\tif ((pBtLinkInfo->bSlaveRole == TRUE)\t&& (pBtLinkInfo->bA2dpExist))\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\t\n\tif (type > 100)\n\t{\n\t\tpsTdmaByte0Val = psTdmaByte0Val | 0x82; //set antenna control by SW\t\n\t\tpsTdmaByte3Val = psTdmaByte3Val | 0x60;  //set antenna no toggle, control by antenna diversity\n\t}\n\n\t\t\n\tif(bTurnOn)\n\t{\t \n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 20:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 30:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 31:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\n\t\t\t\tbreak;\n\t\t\tcase 32:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 33:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x35, 0x3, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 34:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 35:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 36:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\n\t\t\t\t/* here softap mode screen off will cost 70-80mA for phone */\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\n\t\t\t\tbreak;\t\n\t\t\t\t\n\t\t\t//for 1-Ant translate to 2-Ant\t\n\t\t\tcase 101:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 102:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 103:\n\t\t\t\t//halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val);\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 105:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x15, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 106:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x20, 0x3, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\t\n\t\t\tcase 109:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 111:\t\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\t\n\t\t\tcase 113:\n\t\t\t\t//halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val);\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 114:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\t\n\t\t\tcase 120:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3f, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 122:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 132:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, psTdmaByte4Val);\n\t\t\t\tbreak;\t\n\t\t\tcase 133:\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x25, 0x03, psTdmaByte3Val, 0x11);\n\t\t\t\tbreak;\t\t\n\t\t\t\t\n\t\t}\n\t}\n\telse\n\t{\t\t\n\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 8: //PTA Control\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:  //Software control, Antenna at BT side\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1: // 2-Ant, 0x778=3, antenna control by antenna diversity\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n#if 0\n\t\t\tcase 9:   //Software control, Antenna at WiFi side\n\t\t\t\thalbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\t//halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_NORMAL);\n\t\t\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\n\t\t\t\tbreak;\t\t\t\n#endif\n\t\t}\n\t}\n\trssiAdjustVal =0;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\n\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\tpBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948),   pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765), pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67)));\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nBOOLEAN\nhalbtc8723b1ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\\n\"));\n\t\t\n \t\t//halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t//halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT Busy!!\\n\"));\n\n\t\t//halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif (bWifiBusy)\t\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t}\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8723b1ant_TdmaDurationAdjustForAcl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbWifiBusy = FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjustForAcl()\\n\"));\n\n\tif(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) \n\t\tbWifiBusy = TRUE;\n\telse\n\t\tbWifiBusy = FALSE;\t \t\n\n\tif( (BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 3 &&\n\t\t\tpCoexDm->curPsTdma != 9 )\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n/*\t\t\tif( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse */ if(pCoexDm->curPsTdma == 1)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n/*\t\t\tif( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse */ if(pCoexDm->curPsTdma == 11)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t}\n\t\t}\n\t\telse\t  //no change\n\t\t{\n\t\t\t/* Bryant Modify\t\n\t\t\tif(bWifiBusy != bPreWifiBusy)  //if busy / idle change\n\t\t\t{\n\t\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma);\n\t\t\t}\n\t\t\t*/\n\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 9 &&\n\t\t\tpCoexDm->curPsTdma != 11 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b1ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b1ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8723b1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiOnly(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n}\n\nVOID\nhalbtc8723b1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\",  btDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\",  (bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tif(bBtDisabled)\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiOnly(pBtCoexist);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n//=============================================\n//\n//\tSoftware Coex Mechanism start\n//\n//=============================================\n\n// SCO only or SCO+PAN(HS)\n\n/*\nVOID\nhalbtc8723b1ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n\nVOID\nhalbtc8723b1ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8723b1ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8723b1ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8723b1ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8723b1ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8723b1ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8723b1ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8723b1ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8723b1ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n*/\n\n//=============================================\n//\n//\tNon-Software Coex Mechanism start\n//\n//=============================================\nVOID\nhalbtc8723b1ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8723b1ant_ActionHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8723b1ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif ( (!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask) )\n\t{\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t \thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\t\n\t}\n\telse if( (pBtLinkInfo->bScoExist) || \t(pBtLinkInfo->bHidExist) || \t(pBtLinkInfo->bA2dpExist)  )\n\t{\n\t\t// SCO/HID/A2DP busy\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t\tif (pCoexSta->bC2hBtRemoteNameReq)\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33);\n\t\telse \n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )\n\t{\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\n\t\tif (pCoexSta->bC2hBtRemoteNameReq)\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33);\n\t\telse\t \t\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse\n\t{\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t \thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\t\t\n\t\t\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionBtScoHidOnlyBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// tdma and coex table\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n\telse //HID\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiConnectedBtAclBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tu1Byte\t\tbtRssiState;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tbtRssiState = halbtc8723b1ant_BtRssiState(2, 28, 0);\t\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tif(pBtLinkInfo->bHidOnly)  //HID\n\t{\n\t\thalbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\treturn;\n\t}\n\telse if(pBtLinkInfo->bA2dpOnly)  //A2DP\t\t\n\t{\n\t\tif(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\t}\n\t}\n\telse if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\n\t\t       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t}\n\telse if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)\t\t\t\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\t//BT no-profile busy (0x9)\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 33);\t\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\t\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiNotConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiNotConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t \telse\n\t \t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\t\n\t\t}\n\t}\n\telse if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiNotConnectedAssoAuth(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse if (pBtLinkInfo->bPanExist)   \t\t\t\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t \telse\n\t \t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\t}\n\telse if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiConnectedSpecialPacket(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN bWifiBusy = FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\t//no special packet process for both WiFi and BT very busy\n\tif ((bWifiBusy) && ((pBtLinkInfo->bPanExist) || (pCoexSta->nNumOfProfile >= 2)))\n\t return;\t\n\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist))\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\t\t\n\t}\n\telse if  (pBtLinkInfo->bA2dpExist)\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if(pBtLinkInfo->bPanExist)\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8723b1ant_ActionWifiConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbWifiBusy=FALSE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tBOOLEAN\t\tbUnder4way=FALSE, bApEnable=FALSE;\n\tu4Byte\t\twifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect()===>\\n\"));\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\tif(bUnder4way)\n\t{\n\t\thalbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\\n\"));\n\t\treturn;\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tif(bScan)\t\n\t\t\thalbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\telse\n\t\t\thalbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\n\t// power save state\n\tif(!bApEnable && BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\n\t{\n\t\tif(pBtCoexist->btLinkInfo.bA2dpOnly)\t//A2DP\n\t\t\t{\t\t\t\n\t\t\tif(!bWifiBusy)\n\t\t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\n\t\t\telse //busy\n\t\t\t{\n\t\t\t\tif  (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\n\t\t\t\t{\n\t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\n \t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\telse\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(!bWifiBusy)\n\t{\n\t\tif(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, \n\t\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiConnectedBtAclBusy(pBtCoexist,\n\t\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse \n\t\t{\n\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\t\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b1ant_RunSwCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\t\talgorithm=0;\n\n\talgorithm = halbtc8723b1ant_ActionAlgorithm(pBtCoexist);\n\tpCoexDm->curAlgorithm = algorithm;\n\n\tif(halbtc8723b1ant_IsCommonAction(pBtCoexist))\n\t{\n\n\t}\n\telse\n\t{\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = SCO.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR).\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HS mode.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_1ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP.\\n\"));\n\t\t\t\t//halbtc8723b1ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = coexist All Off!!\\n\"));\n\t\t\t\t//halbtc8723b1ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8723b1ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE, bWifiBusy = FALSE;\n\tBOOLEAN\tbIncreaseScanDevNum=FALSE;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tBOOLEAN\tbMiracastPlusBt=FALSE;\n\tu1Byte\taggBufSize=5;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0, wifiBw;\n\tu1Byte\tiotPeer=BTC_IOT_PEER_UNKNOWN;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bBtWhckTest)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under WHCK TEST!!!\\n\"));\n\t\thalbtc8723b1ant_ActionBtWhckTest(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbIncreaseScanDevNum = TRUE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\n\t\tif ((  (pBtLinkInfo->bA2dpExist) || (bWifiBusy) ) && (pCoexSta->bC2hBtInquiryPage) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\n\t\t\thalbtc8723b1ant_ActionBtInquiry(pBtCoexist);\n\t\t}\n\t\telse\n\t\thalbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\n\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_IOT_PEER, &iotPeer);\n\n\t\tif(BTC_IOT_PEER_CISCO != iotPeer)\n\t\t{\n\t\t\tif(pBtLinkInfo->bScoExist)//if (pBtLinkInfo->bBtHiPriLinkExist)\n\t\t\t\t//halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\t\t\t\t\n\t\t\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\t\t\telse\n\t\t\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\t\t\t\t//halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bScoExist)\n\t\t\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (BTC_WIFI_BW_HT40==wifiBw)\n\t\t\t\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10);\t\n\t\t\t\telse\n\t\t\t\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\t\t\t}\n\t\t}\n\n\t\thalbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);\n\t\thalbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\n\t}\n\telse\n\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\n\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\n\t\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\thalbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\t\n\t\thalbtc8723b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8723b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\t\n\tif(!bWifiConnected)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is non connected-idle !!!\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif(bScan || bLink || bRoam)\n\t\t{\n\t\t\t if (bScan)\t\n\t\t   \t\thalbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist);\t\n\t\t\t else\n\t\t    \t\thalbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\t\n\t\t}\n\t\telse\n\t\t\thalbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);\n\t}\n\telse\t// wifi LPS/Busy\n\t{\n\t\thalbtc8723b1ant_ActionWifiConnected(pBtCoexist);\n\t}\n}\n\nu4Byte\nhalbtc8723b1ant_PSD_Log2Base(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tval\n\t\n\t)\n{\n\tu1Byte \ti,j;\n\tu4Byte\ttmp, tmp2, val_integerdB=0, tindex, shiftcount=0;\n\tu4Byte \tresult,val_fractiondB=0,Table_fraction[21]= {0,432, 332, 274, 232, 200,\n\t\t\t\t\t\t\t\t   174, 151,132,115,100,86,74,62,51,42,\n\t\t\t\t\t\t\t\t   32,23,15,7,0};\n\n\tif (val == 0)\n\t return 0;\n\n\ttmp = val;\n\n\twhile(1)\n\t{\n\t\tif (tmp == 1)\n\t\t\tbreak;\t\n\t\telse\n\t\t{\n\t\t\ttmp = (tmp >> 1);\n\t\t\tshiftcount++;\t\t\t\t\n\t\t}\n\t}\n\t\n\n\tval_integerdB = shiftcount+1;\n\n\ttmp2=1;\n\tfor (j=1; j<= val_integerdB;j++)\n\t  tmp2 = tmp2*2; \t\t\n\t\n\ttmp = (val*100) /tmp2;\n\ttindex = tmp/5;\n\n\tif (tindex > 20)\n\t tindex = 20;\n\n\tval_fractiondB = Table_fraction[tindex];\n\n\tresult = val_integerdB*100 - val_fractiondB;\t\t\t\n\n\treturn (result);\n\n\n}\n\nVOID\nhalbtc8723b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\n\t// sw all off\n\thalbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);\n\t\n\t//halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t//halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\tpCoexSta->popEventCnt = 0;\n}\n\nVOID\nhalbtc8723b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\t\tu4Tmp=0;//, fwVer;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\t\t\t\tu1Tmp=0, u1Tmpa=0, u1Tmpb=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\n\tpPsdScan->nAntDet_IsAntDetAvailable = FALSE;\n\n\t//0xf0[15:12] --> Chip Cut information \n\tpCoexSta->nCutVersion = (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xf1) & 0xf0) >> 4;\n\t\n#if 0//move to BTC_MEDIA_CONNECT\n\tif(bBackUp)\n\t{\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n#endif\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1);  //enable TBTT nterrupt\n\n\t// 0x790[5:0]=0x5\t\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);\n\t\n\t// Enable counter statistics\n\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n\n\n\t//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\n\n\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t\n\t//Antenna config\n\tif(bWifiOnly)\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FORCE_EXEC, TRUE, FALSE);\n\telse\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE);\n\n#if 0\n\tif(bWifiOnly)\n\t{\n\t\thalbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT);\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t}\n\telse\n\t\thalbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_INIT);\t\t\n#endif\n\n\n\n\t// PTA parameter\n\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\n\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n}\n\n\n\n\n\nVOID\nhalbtc8723b1ant_MechanismSwitch(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbSwitchTo2Antenna\n\t)\n{\n\n\tif (bSwitchTo2Antenna)  // 1-Ant -> 2-Ant\n\t{\n\t\t//un-lock TRx Mask setup for 8723b f-cut\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1);\n\t\t//WiFi TRx Mask on\t\t\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); \n\n\t\t//BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1\n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c45); \n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c45); \n\t\n\t\t//BT TRx Mask on\n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x1); \n\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, FALSE);\n\t}\n\telse\n\t{\n\t\t//WiFi TRx Mask on\t\t\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); \n\n\t\t//lock TRx Mask setup for 8723b f-cut\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0);\n\n\t\t//BT TRx Mask on\n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); \n\n\t\t//BT TRx Mask ock 0x2c[0], 0x30[0]  = 0\n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c44); \n\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c44); \n\t\t\n\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t}\n\n}\n\n\n\n\nVOID\nhalbtc8723b1ant_PSD_ShowAntennaDetectResult(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tpu1Byte\t\tcliBuf=pBtCoexist->cliBuf;\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n============[Antenna Detection info]  ============\\n\");\n\tCL_PRINTF(cliBuf);\n\n\tif (pPsdScan->nAntDet_Result == 1) \n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s (>%d)\", \"Ant Det Result\", \"2-Antenna (Bad-Isolation)\", \n\t\t\t\tBT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION);\n\telse if (pPsdScan->nAntDet_Result == 2)\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s (%d~%d)\", \"Ant Det Result\", \"2-Antenna (Good-Isolation)\", \n\t\t\t\tBT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset, BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION);\n\telse\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s (%d~%d)\", \"Ant Det Result\", \"1-Antenna\",\n\t\t\t\tBT_8723B_1ANT_ANTDET_PSDTHRES_1ANT, BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset);\n\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s \", \"Antenna Detection Finish\",\n\t\t\t\t\t\t\t(pBoardInfo->btdmAntDetFinish? \"Yes\":\"No\"));\t\n\tCL_PRINTF(cliBuf);\n\n\tswitch(pPsdScan->nAntDet_Result)\n\t{\n\t\tcase 0:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is not available)\");\n\t\t\tbreak;\n\t\tcase 1:  // 2-Ant bad-isolation\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is available)\");\n\t\t\tbreak;\n\t\tcase 2:  // 2-Ant good-isolation\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is available)\");\n\t\t\tbreak;\n\t\tcase 3:  // 1-Ant \n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is available)\");\n\t\t\tbreak;\n\t\tcase 4:  \n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(Uncertainty result)\");\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(Pre-Scan fai)\");\n\t\t\tbreak;\t\n\t\tcase 6:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(WiFi is Scanning)\");\n\t\t\tbreak;\t\n\t\tcase 7:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is not idle)\");\n\t\t\tbreak;\t\n\t\tcase 8:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(Abort by WiFi Scanning)\");\n\t\t\tbreak;\t\t\n\t\tcase 9:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(Antenna Init is not ready)\");\n\t\t\tbreak;\t\n\t\tcase 10:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is Inquiry or page)\");\n\t\t\tbreak;\t\n\t\tcase 11:\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"(BT is Disabled)\");\n\t\t\tbreak;\t\t\n}\n\tCL_PRINTF(cliBuf);\t\n\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Ant Detect Total Count\",pPsdScan->bAntDet_TryCount);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Ant Detect Fail Count\",pPsdScan->bAntDet_FailCount);\n\tCL_PRINTF(cliBuf);\n\n\tif ( (!pBoardInfo->btdmAntDetFinish) && (pPsdScan->nAntDet_Result != 5) )\n\t return;\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Response\",(pPsdScan->nAntDet_Result? \"ok\":\"fail\"));\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d ms\", \"BT Tx Time\", pPsdScan->nAntDet_BTTxTime);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"BT Tx Ch\", pPsdScan->nAntDet_BTLEChannel);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"WiFi PSD Cent-Ch/Offset/Span\", \n\t\t\t\tpPsdScan->nRealCentFreq, pPsdScan->nRealOffset, pPsdScan->nRealSpan);\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d dB\", \"PSD Pre-Scan Peak Value\", pPsdScan->nAntDet_PrePSDScanPeakVal/100);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s (<= %d)\", \"PSD Pre-Scan result\", \n\t\t\t\t(pPsdScan->nAntDet_Result != 5? \"ok\":\"fail\"), BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset);\t\n\tCL_PRINTF(cliBuf);\n\t\n\tif (pPsdScan->nAntDet_Result == 5)\n\t\treturn;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s dB\", \"PSD Scan Peak Value\", pPsdScan->nAntDet_PeakVal);\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s MHz\", \"PSD Scan Peak Freq\", pPsdScan->nAntDet_PeakFreq);\n\tCL_PRINTF(cliBuf);\n\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"TFBGA Package\", \n\t\t\t(pBoardInfo->bTfbgaPackage)?  \"Yes\":\"No\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"PSD Threshold Offset\", pPsdScan->nAntDet_ThresOffset);\n\tCL_PRINTF(cliBuf);\n\n}\n\nVOID\nhalbtc8723b1ant_PSD_ShowData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tpu1Byte\t\tcliBuf=pBtCoexist->cliBuf;\n\tu4Byte\t\tnDeltaFreqPerPoint;\n\tu4Byte\t\tfreq,freq1,freq2,n=0,i=0, j=0, m=0, PsdRep1, PsdRep2;\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n\\n============[PSD info]  (%d)============\\n\",\n\t\t \tpPsdScan->nPSDGenCount);\n\tCL_PRINTF(cliBuf);\n\n\tif (pPsdScan->nPSDGenCount == 0)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n No Data !!\\n\");\n\t\tCL_PRINTF(cliBuf);\n\t\treturn;\n\t}\n\n\tif (pPsdScan->nPSDPoint == 0)\n\t\tnDeltaFreqPerPoint = 0;\n\telse\t\t\t\n\t\tnDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\t\t\n\n\t//if (pPsdScan->bIsPSDShowMaxOnly)\n\tif (0)\n\t{\t\n\t\tPsdRep1 = pPsdScan->nPSDMaxValue/100;\n\t\tPsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100;\n\t\t\t\t\n\t\tfreq = ((pPsdScan->nRealCentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint);\n\t\tfreq1 = freq/1000000;\n\t\tfreq2 = freq/1000 - freq1 * 1000;\n\n\t\tif (freq2 < 100)\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq = %d.0%d MHz\",  \n\t\t\t  freq1, freq2);\n\t\telse\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq = %d.%d MHz\",  \n\t\t\t  freq1, freq2);\n\n\t\tif (PsdRep2 < 10)\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \", Value = %d.0%d dB, (%d) \\n\",  \n\t\t\t  PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue);\n\t\telse\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \", Value = %d.%d dB, (%d)\\n\",  \n\t\t\t  PsdRep1, PsdRep2, pPsdScan->nPSDMaxValue);\n\t\t\n\t\tCL_PRINTF(cliBuf);\n\t}\n\telse\n\t{\n\t\tm = pPsdScan->nPSDStartPoint;\n\t\tn = pPsdScan->nPSDStartPoint;\n\t\ti = 1;\n\t\tj = 1;\t\t\t\t\n\n\t while(1)\n\t {\n\t\tdo\n\t\t{\n\t\t\tfreq = ((pPsdScan->nRealCentFreq-20) * 1000000 + m * nDeltaFreqPerPoint);\n\t\t\tfreq1 = freq/1000000;\n\t\t\tfreq2 = freq/1000 - freq1 * 1000;\n\t\t\t\n\t\t\tif (i ==1)\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.000\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.0%2d\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Freq%6d.%3d\", freq1,freq2);\n\t\t\t}\n\t\t\telse if  ( (i%8 == 0) || (m == pPsdScan->nPSDStopPoint) )\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.000\\n\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.0%2d\\n\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.%3d\\n\", freq1,freq2);\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (freq2 == 0)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.000\", freq1);\n\t\t\t\telse if (freq2 < 100)\t\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.0%2d\", freq1,freq2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%6d.%3d\", freq1,freq2);\n\t\t\t}\n\n\t\t\ti++;\t\t\t\t\t\n\t\t\tm++;\n\t\t\tCL_PRINTF(cliBuf);\n\n\t\t}while(  (i <= 8) && (m <= pPsdScan->nPSDStopPoint));\t\n\t\t\n\t\t\n\t\tdo\n\t\t{\n\t\t\tPsdRep1 = pPsdScan->nPSDReport_MaxHold[n]/100;\n\t\t\tPsdRep2 = pPsdScan->nPSDReport_MaxHold[n] - PsdRep1 * 100;\n\t\t\t\t\n\t\t\tif (j ==1)\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Val %7d.0%d\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n Val %7d.%d\", PsdRep1,PsdRep2);\n\t\t\t}\n\t\t\telse if ( (j%8 == 0)  || (n == pPsdScan->nPSDStopPoint) )\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.0%d\\n\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.%d\\n\", PsdRep1,PsdRep2);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (PsdRep2 <10)\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.0%d\", PsdRep1,PsdRep2);\n\t\t\t\telse\n\t\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"%7d.%d\", PsdRep1,PsdRep2);\n\t\t\t}\n\n\t\t\tj++;\n\t\t\tn++;\n\t\t\tCL_PRINTF(cliBuf);\n\t\t\t\n\t\t} while(  (j <= 8) && (n <= pPsdScan->nPSDStopPoint));\t\t\n\n\t\tif  ( (m > pPsdScan->nPSDStopPoint) || (n > pPsdScan->nPSDStopPoint) )\n\t\t break;\n\t\telse\n\t\t{\n\t\t\ti = 1;\n\t\t\tj = 1;\n\t\t}\n\t\t\n\t }\t\n\t}\n\n\n}\n\nVOID\nhalbtc8723b1ant_PSD_MaxHoldData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tGenCount\n\t)\n{\n\t\t u4Byte\ti=0, i_max=0, val_max=0, j;\n\t\t \n\t\tif (GenCount== 1)\n\t\t{\n\t\t\tmemcpy(pPsdScan->nPSDReport_MaxHold, pPsdScan->nPSDReport, BT_8723B_1ANT_ANTDET_PSD_POINTS*sizeof(u4Byte));\n\n\t\t\tfor (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\n\t\t\t{\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\\n\", i,  pPsdScan->nPSDReport_MaxHold[i]));\n\t\t\t}\n\n\t\t\tpPsdScan->nPSDMaxValuePoint = 0;\n\t\t\tpPsdScan->nPSDMaxValue = 0;\n\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\tfor (i= pPsdScan->nPSDStartPoint; i<=pPsdScan->nPSDStopPoint; i++)\n\t\t\t{\n\t\t\t\tif (pPsdScan->nPSDReport[i] > pPsdScan->nPSDReport_MaxHold[i])\n\t\t\t\t\tpPsdScan->nPSDReport_MaxHold[i] = pPsdScan->nPSDReport[i];\n\n\t\t\t\t//search Max Value\n\t\t\t\tif (i ==pPsdScan->nPSDStartPoint )\n\t\t\t\t{\n\t\t\t\t\ti_max = i;\n\t\t\t\t\tval_max = pPsdScan->nPSDReport_MaxHold[i];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (pPsdScan->nPSDReport_MaxHold[i] > val_max)\n\t\t\t\t\t{\n\t\t\t\t\t\ti_max = i;\n\t\t\t\t\t\tval_max = pPsdScan->nPSDReport_MaxHold[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i = %d, PSDReport = %d dB\\n\", i,  pPsdScan->nPSDReport_MaxHold[i]));\n\n\t\t\t}\n\t\n\t\t\tpPsdScan->nPSDMaxValuePoint = i_max;\n\t\t\tpPsdScan->nPSDMaxValue = val_max;\n\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Max_Hold i_Max = %d, PSDReport_Max = %d dB\\n\", pPsdScan->nPSDMaxValuePoint\n\t\t\t//\t\t,pPsdScan->nPSDMaxValue));\n\t\t}\n\n\n}\n\nu4Byte\nhalbtc8723b1ant_PSD_GetData(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tnPoint\n\t)\n{\n\t//reg 0x808[9:0]: FFT data x\n\t//reg 0x808[22]: 0-->1 to get 1 FFT data y\n\t//reg 0x8b4[15:0]: FFT data y report\n\n\tu4Byte val = 0, psd_report =0;\n\t\n\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\n\tval &= 0xffbffc00;\n\tval |= nPoint;\n\t\n\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\tval |= 0x00400000;\n\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\n\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x8b4);\n\n\tpsd_report = val & 0x0000ffff;\n\t \n\treturn psd_report;\n}\n\n\nVOID\nhalbtc8723b1ant_PSD_SweepPoint(\nIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\tcentFreq,\n\tIN\ts4Byte\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\tpoints,\n\tIN\tu4Byte\t\t\t\tavgnum\n\t)\n{\n\tu4Byte\t i,val,n,k=0;\n\tu4Byte\tnPoints=0, psd_report=0;\n\tu4Byte\tnStartP=0, nStopP=0, nDeltaFreqPerPoint=156250;\n\tu4Byte    nPSDCenterFreq=20*10^6, freq,freq1,freq2;\t\n\tBOOLEAN outloop = FALSE;\n\tu1Byte\t flag = 0;\t\n\tu4Byte \ttmp, PsdRep1, PsdRep2;\n\tu4Byte\tWiFi_OriginalChannel = 1;\n\n\tpPsdScan->bIsPSDRunning = TRUE;\n\t\n\tdo\n\t{\n\t\tswitch(flag)\n\t\t{\n\t\t   case 0:  //Get PSD parameters\n\t\t   default:\t\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), centFreq=0x%x, offset=0x%x, span=0x%x\\n\", \n\t\t       //     centFreq, offset, span));\n\n\t\t\tpPsdScan->nPSDBandWidth = 40*1000000;\n\t\t\tpPsdScan->nPSDPoint = points;\n\t\t\tpPsdScan->nPSDStartBase = points/2; \n\t\t\tpPsdScan->nPSDAvgNum = avgnum;\n\t\t\tpPsdScan->nRealCentFreq = centFreq;\n\t\t\tpPsdScan->nRealOffset = offset;\n\t\t\tpPsdScan->nRealSpan = span;\n\t\t\n\t\t\t\n\t\t\tnPoints = pPsdScan->nPSDPoint;\n\t\t\tnDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\n\n\t\t\t//PSD point setup\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\t\t\tval &= 0xffff0fff;\t\t\t\t\n\t\t\t\n\t\t\tswitch(pPsdScan->nPSDPoint)\n\t\t\t{\n\t\t\t\tcase 128:\n\t\t\t\t\tval |= 0x0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 256:\n\t\t\t\tdefault:\t\n\t\t\t\t\tval |=0x00004000;\n\t\t\t\t \tbreak;\n\t\t\t\tcase 512:\t\n\t\t\t\t\tval |= 0x00008000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1024:\t\n\t\t\t\t\tval |= 0x0000c000;\n\t\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\t\t\t\n\t\t\tswitch(pPsdScan->nPSDAvgNum)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tval |= 0x0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\t\t\t\t\n\t\t\t\t\tval |=0x00001000;\n\t\t\t\t \tbreak;\n\t\t\t\tcase 16:\t\n\t\t\t\t\tval |= 0x00002000;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32:\n\t\t\t\tdefault:\t\n\t\t\t\t\tval |= 0x00003000;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x808, val);\n\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD BW= %d, DeltaFreq=%d\\n\"\n\t\t \t//\t, pPsdScan->nPSDBandWidth, nDeltaFreqPerPoint));\n\t\t\tflag = 1;\n\t\t\tbreak;\n\t\t  case 1:\t  //calculate the PSD point index from freq/offset/span\n\t\t  \tnPSDCenterFreq = pPsdScan->nPSDBandWidth /2 +offset*(1000000);\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), PSD Center Freq = %d\\n\", (centFreq + offset)));\n\t\t\t\n\t\t\tnStartP = pPsdScan->nPSDStartBase + (nPSDCenterFreq - span *(1000000)/2) /nDeltaFreqPerPoint;\n\t\t\tpPsdScan->nPSDStartPoint = nStartP - pPsdScan->nPSDStartBase;\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Start PSD Poin Matrix Index = %d\\n\", pPsdScan->nPSDStartPoint));\n\n\t\t\tnStopP = pPsdScan->nPSDStartBase + (nPSDCenterFreq + span *(1000000)/2) /nDeltaFreqPerPoint;\n\t\t\tpPsdScan->nPSDStopPoint = nStopP - pPsdScan->nPSDStartBase-1;\n\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), Stop PSD Poin Matrix Index = %d\\n\",pPsdScan->nPSDStopPoint));\n\n\t\t\tflag = 2;\n\t\t\tbreak;\n\t\t  case 2:  //set RF channel/BW/Mode\n\n\t\t  \t//set 3-wire off\n\t\t  \tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\n\t\t\tval |= 0x00300000;\n\t\t\t pBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\n\n\t\t\t//CCK off\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\n\t\t\tval &= 0xfeffffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);\t\t\n\n\t\t\t//store WiFi original channel\n\t\t\tWiFi_OriginalChannel = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff);\n\n\t\t\t//Set RF channel\n\t\t       if (centFreq == 2484)\n\t\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, 0xe); \n\t\t\telse\n\t\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, (centFreq-2412)/5 + 1); //WiFi TRx Mask on\n\n\t\t\t//Set  RF mode = Rx, RF Gain = 0x8a0\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x0, 0xfffff, 0x308a0);\n\n\t\t\t//Set RF Rx filter corner\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x3e4);\n\n\t\t\t//Set TRx mask off\n\t\t\t//un-lock TRx Mask setup\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x1);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x1);\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\t\t\tflag = 3;\n\t\t\tbreak;\n\t\t  case 3:\n\t\t  \tmemset(pPsdScan->nPSDReport,0, pPsdScan->nPSDPoint*sizeof(u4Byte));\n\t\t\tnStartP = pPsdScan->nPSDStartPoint + pPsdScan->nPSDStartBase;\n\t\t\tnStopP = pPsdScan->nPSDStopPoint +  pPsdScan->nPSDStartBase + 1;\n\t\t\t\t\n\t\t\ti = nStartP;\n\n\t\t\twhile (i < nStopP)\n\t\t\t{\n\t\t\t\tif (i >= nPoints)\n\t\t\t\t{\n\t\t\t\t\tpsd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i-nPoints);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpsd_report = halbtc8723b1ant_PSD_GetData(pBtCoexist,i);\n\t\t\t\t}\n\n\t\t\t\tif (psd_report == 0)\n\t\t\t\t\ttmp = 0;\n\t\t\t\telse\n\t\t\t\t\t//tmp =  20*log10((double)psd_report);\n\t\t\t\t\t//20*log2(x)/log2(10), log2Base return theresult of the psd_report*100\n\t\t\t\t\ttmp = 6 * halbtc8723b1ant_PSD_Log2Base(pBtCoexist, psd_report);\t\t\t\t\n\n\t\t\t\tn = i-pPsdScan->nPSDStartBase;\n\t\t\t\tpPsdScan->nPSDReport[n] =  tmp;\n\t\t\t\tPsdRep1 = pPsdScan->nPSDReport[n] /100;\n\t\t\t\tPsdRep2 = pPsdScan->nPSDReport[n] - PsdRep1 * 100;\n\t\t\t\t\n\t\t\t\tfreq =  ((centFreq-20) * 1000000 + n * nDeltaFreqPerPoint);\n\t\t\t\tfreq1 = freq/1000000;\n\t\t\t\tfreq2 = freq/1000 - freq1 * 1000;\n/*\n\t\t\t\tif (freq2 < 100)\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.0%d MHz)\", n, freq1, freq2));\n\t\t\t\telse\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint(), i = %d (%d.%d MHz)\", n, freq1, freq2));\n\n\t\t\t\tif (PsdRep2 < 10)\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", PSDReport = %d (%d.0%d dB)\\n\",psd_report, PsdRep1, PsdRep2));\n\t\t\t\telse\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", PSDReport = %d (%d.%d dB)\\n\",psd_report, PsdRep1,PsdRep2));\t\n*/\n\t\t\t\ti++;\n\n\t\t\t\tk=0;\n\n\t\t\t\t//Add Delay between PSD point\n\t\t\t\twhile(1)\n\t\t\t\t{\n\t\t\t\t\tif (k++ > 20000)\n\t\t\t\t\t break;\n\t\t\t\t}\n\n\t\t\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx SweepPSDPoint()==============\\n\"));\n\t\t\t}\t\n\n\t\t\tflag = 100;\n\t\t\tbreak;\n\t\t  case 99:\t//error\n\n\t\t\toutloop = TRUE;\n\t\t\tbreak;\n\t\t  case 100: //recovery \n\n\t\t  \t//set 3-wire on\n\t\t  \tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x88c);\n\t\t\tval &=0xffcfffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x88c,val);\n\n\t\t\t//CCK on\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x800);\n\t\t\tval |= 0x01000000;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x800,val);\t\n\n\t\t\t//PSD off\n\t\t\tval = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x808);\n\t\t\tval &=0xffbfffff;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist,0x808,val);\n\t\t\t\n\t\t  \t//TRx Mask on\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\n\n\t\t\t//lock TRx Mask setup\n\t\t  \tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdd, 0x80, 0x0);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xdf, 0x1, 0x0);\n\n\t\t\t//Set RF Rx filter corner\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0x0);\n\n\t\t\t//restore WiFi original channel\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x18, 0x3ff, WiFi_OriginalChannel); \n\t\t\t\n\t\t\toutloop = TRUE;\n\t\t\tbreak;\n\n\t\t}\t\t\n\t\t\t\n\t}while (!outloop);\n\n\n\n\tpPsdScan->bIsPSDRunning = FALSE;\n\n\n}\n\nVOID\nhalbtc8723b1ant_PSD_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tBTTxTime,\n\tIN\tu4Byte\t\t\t\t\tBTLEChannel\n\t)\n{\n\tu4Byte \trealseconds = 0, i=0, j=0;\n\tu4Byte\tWLPSD_CentFreq = 2484, WLPSD_Span = 2, WLPSD_SweepCount = 50; \n\ts4Byte \tWLPSD_Offset = -4;\n\tu1Byte \tBTLECh[13] = {3,6,8,11,13,16,18,21,23,26,28,31,33};\n\n\tu1Byte\tH2C_Parameter[3] ={0},u1Tmpa,u1Tmpb;\n\t\n\tu1Byte\tstate=0;\n\tBOOLEAN\t\toutloop = FALSE, BTResp = FALSE, bScan ,bRoam;\n\tu4Byte\t\tfreq,freq1,freq2,PsdRep1, PsdRep2, nDeltaFreqPerPoint,u4Tmp;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\n\tpBoardInfo->btdmAntDetFinish = FALSE;\t\n\tmemset(pPsdScan->nAntDet_PeakVal, 0, 16*sizeof(UCHAR));\n\tmemset(pPsdScan->nAntDet_PeakFreq, 0, 16*sizeof(UCHAR));\n\n\tif (pBoardInfo->bTfbgaPackage) //for TFBGA\n\t\tpPsdScan->nAntDet_ThresOffset = 5;\n\telse\n\t\tpPsdScan->nAntDet_ThresOffset = 0;\n\n\tdo\n\t{\n\t\tswitch(state)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tif (BTLEChannel == 39)\n\t\t\t\t WLPSD_CentFreq = 2484;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (i=1; i<=13; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (BTLECh[i-1] == BTLEChannel)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t WLPSD_CentFreq = 2412 + (i-1) * 5;\n\t\t\t\t\t\t\t break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == 14)\n\t\t\t\t\t{\n\n\t\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Abort!!, Invalid LE channel = %d\\n \",  BTLEChannel));\n\t\t\t\t\t\toutloop = TRUE;\n\t\t\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tWLPSD_SweepCount = BTTxTime * 238 /100;  //BTTxTime/0.42\t\t\t\t\t\t\t\t\n\n\t\t\t\tif (WLPSD_SweepCount % 5 != 0)\n\t\t\t\t\tWLPSD_SweepCount = (WLPSD_SweepCount/5 + 1) * 5;\n\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), BT_LETxTime=%d,  BT_LECh = %d\\n\", BTTxTime, BTLEChannel));\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), WLPSD_CentFreq=%d,  WLPSD_Offset = %d, WLPSD_Span = %d, WLPSD_SweepCount = %d\\n\",\n\t\t\t\t\t\t\t\t\tWLPSD_CentFreq, WLPSD_Offset, WLPSD_Span,WLPSD_SweepCount));\n\t\t\t\t\n\t\t\t\tstate = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1: //stop coex DM & set antenna path\n\t//Stop Coex DM\n\tpBtCoexist->bStopCoexDm = TRUE;\n\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Stop Coex DM!!\\n\"));\n\n\t\t\t\t//set native power save\n\t\t\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t\t\t\t//Set TDMA off, \t\t\t\t\n\t\t\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\t\t\t\t\n\n\t\t\t\t//Set coex table\n\t\t\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\t\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Main Port\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Aux Port\\n\"));\n\t\t\t\t}\n\t\t\n\t//Set Antenna path, switch WiFi to un-certain antenna port\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, FALSE);\n\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to BT!!\\n\"));\n\n\t\t\t\t//Set AFH mask on at WiFi channel 2472MHz +/- 10MHz\n\t\t\t\tH2C_Parameter[0] = 0x1;\n\t\t\t\tH2C_Parameter[1] = 0xd;\n\t\t\t\tH2C_Parameter[2] = 0x14;\n\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d,  Mask=%d\\n\",\n\t\t\t\t\t\t\t\t\tH2C_Parameter[1],H2C_Parameter[2]));\n\t\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n\n\t\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n       \t\t\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\t\t\t\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\t\n\t\t\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x778=0x%x\\n\",\n\t   \t      \t\t\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n\n\t\t\t\tstate =2;\n\t\t\t\tbreak;\n\t\t\tcase 2:\t//Pre-sweep background psd\n\t\t\t\tfor (pPsdScan->nPSDGenCount=1; pPsdScan->nPSDGenCount<=3; pPsdScan->nPSDGenCount++)\n\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), PSDGenCount = %d\\n \",  pPsdScan->nPSDGenCount));\n\t\t\t\t\thalbtc8723b1ant_PSD_SweepPoint(pBtCoexist, WLPSD_CentFreq, WLPSD_Offset, WLPSD_Span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM);\t\t\t\t\n\t\t\t\t\thalbtc8723b1ant_PSD_MaxHoldData(pBtCoexist,  pPsdScan->nPSDGenCount);\t\t\t\t\t\n\t\t\t\t}\n\t\t\n\t\t\t\tpPsdScan->nAntDet_PrePSDScanPeakVal = pPsdScan->nPSDMaxValue;\n\t\n\t\t\t\tif (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset)*100)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Abort Antenna Detection!! becaus background = %d > thres (%d)\\n\",\n\t\t\t\t\t\tpPsdScan->nPSDMaxValue/100, BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset));\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t\t\tpPsdScan->nAntDet_Result = 5;\n\t\t\t\t\tstate = 99;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Start Antenna Detection!! becaus background = %d <= thres (%d)\\n\",\n\t\t\t\t\t\tpPsdScan->nPSDMaxValue/100, BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND+pPsdScan->nAntDet_ThresOffset));\n\t\t\t\t\tstate = 3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 3:\t\n\t\t\t\tBTResp = pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, (u1Byte)(BTTxTime&0xff), (u1Byte)(BTLEChannel&0xff)); \n\t\n\t\t\t\tfor (pPsdScan->nPSDGenCount=1; pPsdScan->nPSDGenCount<=WLPSD_SweepCount; pPsdScan->nPSDGenCount++)\n\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), PSDGenCount = %d\\n \",  pPsdScan->nPSDGenCount));\n\t\t\t\t\thalbtc8723b1ant_PSD_SweepPoint(pBtCoexist, WLPSD_CentFreq, WLPSD_Offset, WLPSD_Span, BT_8723B_1ANT_ANTDET_PSD_POINTS, BT_8723B_1ANT_ANTDET_PSD_AVGNUM);\t\t\t\t\n\t\t\t\t\thalbtc8723b1ant_PSD_MaxHoldData(pBtCoexist,  pPsdScan->nPSDGenCount);\t\n\n\t\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\t\t\t\tif (bScan ||bRoam)\n\t\t\t{\n\t\t\t\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t\t\t\tpPsdScan->nAntDet_Result = 8;\n\t\t\t\t\t\tstate = 99;\t\n\t\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\n\n\t\t\t\tpPsdScan->nAntDet_PSDScanPeakVal = pPsdScan->nPSDMaxValue;\n\t\t\t\tpPsdScan->nAntDet_PSDScanPeakFreq = pPsdScan->nPSDMaxValuePoint;\n\t\t\t\tstate = 4;\n\t\t\t\tbreak;\n\t\t\tcase 4:\t\t\t\t\n\n\t\t\t\tif (pPsdScan->nPSDPoint == 0)\n\t\t\t\t\tnDeltaFreqPerPoint = 0;\n\t\telse\n\t\t\t\t\tnDeltaFreqPerPoint = pPsdScan->nPSDBandWidth/pPsdScan->nPSDPoint;\t\t\n\n\t\t\t\tPsdRep1 = pPsdScan->nPSDMaxValue/100;\n\t\t\t\tPsdRep2 = pPsdScan->nPSDMaxValue - PsdRep1 * 100;\n\t\t\t\t\n\t\t\t\tfreq = ((pPsdScan->nRealCentFreq-20) * 1000000 + pPsdScan->nPSDMaxValuePoint * nDeltaFreqPerPoint);\n\t\t\t\tfreq1 = freq/1000000;\n\t\t\t\tfreq2 = freq/1000 - freq1 * 1000;\n\n\t\t\t\tif (freq2 < 100)\n\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.0%d MHz\", freq1, freq2));\n\t\t\t\t\tCL_SPRINTF(pPsdScan->nAntDet_PeakFreq, BT_8723B_1ANT_ANTDET_BUF_LEN, \"%d.0%d\", freq1,freq2);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.%d MHz\",  freq1, freq2));\n\t\t\t\t\tCL_SPRINTF(pPsdScan->nAntDet_PeakFreq, BT_8723B_1ANT_ANTDET_BUF_LEN, \"%d.%d\", freq1,freq2);\n\t\t\t\t}\n\n\t\t\t\tif (PsdRep2 < 10)\t\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", Value = %d.0%d dB\\n\",   PsdRep1, PsdRep2));\n\t\t\t\t\tCL_SPRINTF(pPsdScan->nAntDet_PeakVal, BT_8723B_1ANT_ANTDET_BUF_LEN, \"%d.0%d\", PsdRep1,PsdRep2);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\", Value = %d.%d dB\\n\",PsdRep1, PsdRep2));\n\t\t\t\t\tCL_SPRINTF(pPsdScan->nAntDet_PeakVal, BT_8723B_1ANT_ANTDET_BUF_LEN, \"%d.%d\", PsdRep1,PsdRep2);\n\t\t\t\t}\n\n\t\t\t\tpPsdScan->nAntDet_IsBTReplyAvailable = TRUE;\n\t\t\t\t\n\t\t\t\tif (BTResp == FALSE)\n\t\t\t\t{\n\t\t\t\t\tpPsdScan->nAntDet_IsBTReplyAvailable = FALSE;\n\t\t\t\t\tpPsdScan->nAntDet_Result = 0;\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), BT Response = Fail \\n \"));\n\t\t\t\t}\n\t\t\t\telse if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION)*100)\n\t\t\t\t{\n\t\t\t\t\tpPsdScan->nAntDet_Result = 1;\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = TRUE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 2;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Bad-Isolation!! \\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION+pPsdScan->nAntDet_ThresOffset)*100)\n\t\t\t\t\t{\n\t\t\t\t\tpPsdScan->nAntDet_Result = 2;\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = TRUE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 2;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Good-Isolation!! \\n\"));\n\t\t\t\t}\n\t\t\t\telse if (pPsdScan->nPSDMaxValue > (BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT)*100)\n\t\t\t\t{\n\t\t\t\t\tpPsdScan->nAntDet_Result = 3;\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = TRUE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant!!\\n\"));\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpPsdScan->nAntDet_Result = 4;\n\t\t\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\t\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant, un-certainity!!\\n\"));\n\t\t\t\t}\n\n\t\t\t\tstate = 99;\n\t\t\t\tbreak;\n\t\t\tcase 99:  //restore setup\n\t\t\t\n\t\t\t\t//Set AFH mask off at WiFi channel 2472MHz +/- 10MHz\n\t\t\t\tH2C_Parameter[0] = 0x0;\n\t\t\t\tH2C_Parameter[1] = 0x0;\n\t\t\t\tH2C_Parameter[2] = 0x0;\n\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d,  Mask=%d\\n\",\n\t\t\t\t\tH2C_Parameter[1],H2C_Parameter[2]));\t\t\n\n\t\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n\t\t\t\t\n\t\t\t\t//Set Antenna Path\t\t\t\t\t\n\t\t\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to PTA\\n!!\"));\n\n\t\t\t\t//Resume Coex DM\n\t\t\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Resume Coex DM\\n!!\"));\n\n\t\t\t\t//stimulate coex running\n\t\t\t\thalbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\\n!!\"));\n\n\t\t\t\toutloop = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\n\t}while(!outloop);\n\t\n\n\n\t\t}\n\nVOID\nhalbtc8723b1ant_PSD_AntennaDetectionCheck(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u4Byte AntDetCount = 0, AntDetFailCount = 0;\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\t\n\tBOOLEAN bScan, bRoam;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\t\n\n\n\tpPsdScan->nAntDet_BTTxTime = 20;  //0.42ms*50 = 20ms\n\tpPsdScan->nAntDet_BTLEChannel = 39;\t\t\n\n\tAntDetCount++;\n\t\n\tpPsdScan->bAntDet_TryCount = AntDetCount;\t\n\t\t\t\n\tif (bScan ||bRoam)\n\t\t{\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpPsdScan->nAntDet_Result = 6;\n\t}\n\telse if(pBtCoexist->btInfo.bBtDisabled)\n\t{\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpPsdScan->nAntDet_Result = 11;\n\t}\n\telse if (pCoexSta->nNumOfProfile >= 1) \n\t{\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpPsdScan->nAntDet_Result = 7;\n\t}\n\telse if (!pPsdScan->nAntDet_IsAntDetAvailable)  //Antenna initial setup is not ready\n\t{\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpPsdScan->nAntDet_Result = 9;\n\t}\n\telse if (pCoexSta->bC2hBtInquiryPage)\n\t\t{\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpPsdScan->nAntDet_Result = 10;\n\t\t}\n\t\telse\n\t\t{\n\t\thalbtc8723b1ant_PSD_AntennaDetection(pBtCoexist,  pPsdScan->nAntDet_BTTxTime, pPsdScan->nAntDet_BTLEChannel);\t\t\t\n\t\t}\n\n\tif (!pBoardInfo->btdmAntDetFinish)\n\t\tAntDetFailCount++;\n\n\tpPsdScan->bAntDet_FailCount = AntDetFailCount;\n\n}\n\n\n//============================================================\n// work around function start with wa_halbtc8723b1ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8723b1ant_\n//============================================================\nVOID\nEXhalbtc8723b1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x0;\n\tu2Byte u2Tmp=0x0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\\n\"));\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"Ant Det Finish = %s, Ant Det Number  = %d\\n\",  \n\t\t (pBoardInfo->btdmAntDetFinish? \"Yes\":\"No\"), pBoardInfo->btdmAntNumByAntDet));\n\n\tpBtCoexist->bStopCoexDm = TRUE;\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\n\n\t// enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\n\n\t// set GRAN_BT = 1\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t// set WLAN_ACT = 0\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\t\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\n\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t\t// set to S1\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t\t}\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\t\t\t\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8723b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\n\tpBtCoexist->bStopCoexDm = FALSE;\n}\n\nVOID\nEXhalbtc8723b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\n\tpBtCoexist->bStopCoexDm = FALSE;\n\t\n\thalbtc8723b1ant_InitCoexDm(pBtCoexist);\n\n\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723b1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu2Byte\t\t\t\tu2Tmp[4];\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tstatic u1Byte\t\t\tPopReportIn10s = 0;\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Coex is STOPPED]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tif (pPsdScan->bAntDet_TryCount == 0)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"Ant PG Num/ Mech/ Pos\",\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\n\tCL_PRINTF(cliBuf);\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d  (%d/%d/%d)\", \"Ant PG Num/ Mech(Ant_Det)/ Pos\", \n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNumByAntDet, pBoardInfo->btdmAntPos, \n\t\tpPsdScan->bAntDet_TryCount, pPsdScan->bAntDet_FailCount, pPsdScan->nAntDet_Result);\t\t\n\t\tCL_PRINTF(cliBuf);\n\n\t\tif (pBoardInfo->btdmAntDetFinish)\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"Ant Det PSD Value\",  pPsdScan->nAntDet_PeakVal);\t\t\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c\", \"Version Coex/ Fw/ Patch/ Cut\", \\\n\t\tGLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer, pCoexSta->nCutVersion+65);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %s\", \"WifibHiPri/ Ccklock/ CckEverLock\", \\\n\t\t(pCoexSta->bWiFiIsHighPriTask? \"Yes\":\"No\"),\n\t\t(pCoexSta->bCCKLock? \"Yes\":\"No\"),\n\t\t(pCoexSta->bCCKEverLock? \"Yes\":\"No\"));\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tPopReportIn10s++;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d/ %d] \", \"BT [status/ rssi/ retryCnt/ popCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tif (PopReportIn10s >= 5)\n\t{\n\t\tpCoexSta->popEventCnt = 0;\t\n\t\tPopReportIn10s = 0;\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP/NameReq/WHQL\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pCoexSta->bC2hBtRemoteNameReq, pCoexSta->bBtWhckTest );\n\tCL_PRINTF(cliBuf);\n\n\tif (pStackInfo->bProfileNotified)\n\t{\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Role\", \\\n\t\t(pBtLinkInfo->bSlaveRole )? \"Slave\":\"Master\");\n\t\tCL_PRINTF(cliBuf);\t\n\t}\t\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %d\", \"A2DP Rate/Bitpool\", \\\n\t\t(btInfoExt&BIT0)? \"BR\":\"EDR\", pCoexSta->nA2DPBitPool);\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8723B_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8723b1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism] (before Manual)============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t}\t\n\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"SM[LowPenaltyRA]\", \\\n\t\t\tpCoexDm->bCurLowPenaltyRa);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %d \", \"DelBA/ BtCtrlAgg/ AggSize\", \\\n\t\t\t(pBtCoexist->btInfo.bRejectAggPkt? \"Yes\":\"No\"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? \"Yes\":\"No\"),\n\t\t\t\tpBtCoexist->btInfo.aggBufSize);\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\t\tpBtCoexist->btInfo.raMask);\n\t\tCL_PRINTF(cliBuf);\n\n\t\t// Fw mechanism\t\t\n\t\tif(pBtCoexist->bManualControl)\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism] (before Manual) ============\");\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t\t}\n\t\t\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tif (pBoardInfo->btdmAntNumByAntDet == 2)\n\t\t{\n\t\t\tif (pCoexDm->bCurPsTdmaOn)\n\t\t\t\tpsTdmaCase = psTdmaCase +100;  //for WiFi RSSI low or BT RSSI low\n\t\t\telse\n\t\t\t\tpsTdmaCase = 1; //always translate to TDMA(off,1) for TDMA-off case\n\t\t}\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, \n\t\t\t(pCoexDm->bCurPsTdmaOn? \"On\":\"Off\"),\n\t\t\t(pCoexDm->bAutoTdmaAdjust? \"Adj\":\"Fix\") );\n\t\t\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Coex Table Type\", \\\n\t\t\tpCoexSta->nCoexTableType);\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\t/*\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Latest error condition(should be 0)\", \\\n\t\t\tpCoexDm->errorCondition);\n\t\tCL_PRINTF(cliBuf);\n\t\t*/\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"backup ARFR1/ARFR2/RL/AMaxTime\", \\\n\t\tpCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\tu2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"0x430/0x434/0x42a/0x456\", \\\n\t\tu4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6cc);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x778/0x6cc/0x880[29:25]\", \\\n\t\tu1Tmp[0], u4Tmp[0],  (u4Tmp[1]&0x3e000000) >> 25);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x764);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x948/ 0x67[5] / 0x764 / 0x76e\", \\\n\t\tu4Tmp[0], ((u1Tmp[0]&0x20)>> 5), (u4Tmp[1] & 0xffff), u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944);\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x92c[1:0]/ 0x930[7:0]/0x944[1:0]\", \\\n\t\tu4Tmp[0]&0x3, u4Tmp[1]&0xff, u4Tmp[2]&0x3);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x38[11]/0x40/0x4c[24:23]/0x64[0]\", \\\n\t\t((u1Tmp[0] & 0x8)>>3), u1Tmp[1], ((u4Tmp[0]&0x01800000)>>23), u1Tmp[2]&0x1);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(dig)/0x49c(null-drop)\", \\\n\t\tu4Tmp[0]&0xff, u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\n\tfaOfdm = ((u4Tmp[0]&0xffff0000) >> 16) +  ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \\\n\t\t             ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ;\n\tfaCck = (u1Tmp[0] << 8) + u1Tmp[1];\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"OFDM-CCA/OFDM-FA/CCK-FA\", \\\n\t\tu4Tmp[0]&0xffff, faOfdm, faCck);\n\tCL_PRINTF(cliBuf);\n\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_OK CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_Err CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\n\tCL_PRINTF(cliBuf);\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)\n\t//halbtc8723b1ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8723b1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\n\tif(pBtCoexist->bManualControl ||\tpBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\t\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t//halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\n\t\thalbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8723b1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n\n\t\tpCoexSta->bUnderIps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tu1Byte u1Tmpa, u1Tmpb;\n\tu4Byte u4Tmp;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm )\n\t\treturn;\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tpPsdScan->nAntDet_IsAntDetAvailable = TRUE;\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\t\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\t\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n          \n\t   \n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\\n\",\n\t\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\t\t\n\t}\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\treturn;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\t\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8723b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8723b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_SCAN_START == type)\n\t{\t\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist);\n\t\t}\n\t\telse\t// wifi is connected\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\t}\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t pPsdScan->nAntDet_IsAntDetAvailable = TRUE;\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\n\t\t pCoexDm->nArpCnt = 0;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\t\n\t\t//pCoexDm->nArpCnt = 0;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8723b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8723b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\t\n\t\thalbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(!bWifiConnected) // non-connected scan\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tBOOLEAN\t\t\tbWifiUnderBMode = FALSE;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\tpPsdScan->nAntDet_IsAntDetAvailable = TRUE;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\t\t//Set CCK Tx/Rx high Pri except 11b mode\n\t\tif (bWifiUnderBMode)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\n\t\t}\n\t\t\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t\tpCoexDm->nArpCnt = 0;\n\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\n\n\t\tpCoexSta->bCCKEverLock = FALSE;\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\t//H2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[0] = 0x0;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n}\n\nVOID\nEXhalbtc8723b1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE, bUnder4way=FALSE;\n\tu1Byte\taggBufSize=5;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif( BTC_PACKET_DHCP == type || \n\t\tBTC_PACKET_EAPOL == type ||\n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\tif (BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet ARP notify\\n\"));\t\t \n\n\t\t\tpCoexDm->nArpCnt++;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ARP Packet Count = %d\\n\", pCoexDm->nArpCnt));\n\t\t\t\n\t\t\tif((pCoexDm->nArpCnt >= 10) && (!bUnder4way)) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet DHCP or EAPOL notify\\n\"));\t\t \n\t\t}\n\t} \n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet [Type = %d] notify\\n\", type));\n\t}\n\n\tpCoexSta->specialPktPeriodCnt = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8723b1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8723b1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( BTC_PACKET_DHCP == type ||\n\t\tBTC_PACKET_EAPOL == type || \n\t\t( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\n\t\t{\n\t\thalbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\t\tbtInfo=0;\n\tu1Byte\t\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\t\tbWifiConnected=FALSE;\n\tBOOLEAN\t\t\t\tbBtBusy=FALSE;\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\t\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8723B_1ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8723B_1ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\t// if 0xff, it means BT is under WHCK test\n\tif (btInfo == 0xff)\n\t\tpCoexSta->bBtWhckTest = TRUE;\n\telse\n\t\tpCoexSta->bBtWhckTest = FALSE;\n\n\tif(BT_INFO_SRC_8723B_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btRetryCnt >= 1)\n\t\t\tpCoexSta->popEventCnt++;\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtRemoteNameReq = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtRemoteNameReq = FALSE;\t\t\t\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2-90;\n\t\t\t//pCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\t\t\n\t\tif (pCoexSta->btInfoC2h[rspSource][1] == 0x49)\n\t\t{\n\t\t\tpCoexSta->nA2DPBitPool = \n\t\t\t\tpCoexSta->btInfoC2h[rspSource][6]; \n\t\t}\n\t\telse\n\t\t\tpCoexSta->nA2DPBitPool = 0;\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\n#if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\n\t\tif ((pBoardInfo->btdmAntDetFinish) && (pBoardInfo->btdmAntNumByAntDet == 2))\n\t\t{\n\t\t\tif(pCoexSta->bBtTxRxMask)\n\t\t\t{\n\t\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x1\\n\"));\n\n\t\t\t\t//BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1\n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c45); \n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c45); \n\t\n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x1);\n\t\t\t}\t\n\t\t}\n\t\telse\t\n#endif\t\t\t\n#endif\n\n\t\t{\n\t\t\tif(!pCoexSta->bBtTxRxMask)\n\t\t\t{\n\t\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\\n\"));\n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\n\n\t\t\t\t//BT TRx Mask lock 0x2c[0], 0x30[0] = 0\n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x2c, 0x7c44); \n\t\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x30, 0x7c44); \t\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif(pCoexSta->btInfoExt & BIT1)\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tif(pCoexSta->btInfoExt & BIT3)\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8723B_1ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\tpCoexSta->nNumOfProfile = 0;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tpCoexSta->bBtHiPriLinkExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8723B_1ANT_B_FTP)\n\t\t{\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_1ANT_B_A2DP)\n\t\t{\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_1ANT_B_HID)\n\t\t{\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_1ANT_B_SCO_ESCO)\n\t\t{\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\t\tpCoexSta->nNumOfProfile++;\n\t\t}\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tif ((pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) &&( pCoexSta->bScoExist == FALSE))\n\t\t{\n\t\t\tif (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160) \t\t\n\t\t\t{\n\t\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\t\tpCoexSta->wrongProfileNotification++;\n\t\t\t\tpCoexSta->nNumOfProfile++;\n\t\t\t\tbtInfo = btInfo | 0x28;\n\t\t\t}\n\t\t}\n\n\t\t//Add Hi-Pri Tx/Rx counter to avoid false detection\n\t\tif (((pCoexSta->bHidExist) || (pCoexSta->bScoExist)) && (pCoexSta->highPriorityTx + pCoexSta->highPriorityRx >= 160)\n\t\t\t && (!pCoexSta->bC2hBtInquiryPage))\n\t\t\tpCoexSta->bBtHiPriLinkExist = TRUE;\n\t\t\t\n\t\tif((btInfo&BT_INFO_8723B_1ANT_B_ACL_BUSY) && (pCoexSta->nNumOfProfile == 0))\n\t\t{\n\t\t\tif (pCoexSta->lowPriorityTx + pCoexSta->lowPriorityRx >= 160)\n\t\t\t{\n\t\t\t\tpCoexSta->bPanExist = TRUE;\n\t\t\t\tpCoexSta->nNumOfProfile++;\n\t\t\t\tpCoexSta->wrongProfileNotification++;\n\t\t\t\tbtInfo = btInfo | 0x88;\n\t\t\t}\n\t\t}\n\t}\n\n\thalbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tbtInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\n\t\n\tif(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8723B_1ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8723B_1ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8723B_1ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8723B_1ANT_B_ACL_BUSY)\n\t{\n\t\tif(BT_8723B_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus)\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\tbBtBusy = TRUE;\n\telse\n\t\tbBtBusy = FALSE;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\thalbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723b1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp;\n\tu1Byte\tu1Tmpa,u1Tmpb, u1Tmpc;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF Status notify\\n\"));\n\n\tif(BTC_RF_ON == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned ON!!\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t}\n\telse if(BTC_RF_OFF == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned OFF!!\\n\"));\n\t\t\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\t//halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\t\t\n\t\thalbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\t\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n \t\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\t\tu1Tmpc = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\\n\",\n\t\t\tu4Tmp,  u1Tmpa, u1Tmpb, u1Tmpc));\n\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu4Byte\tu4Tmp;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t//halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\n\thalbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\n\tEXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\tpBtCoexist->bStopCoexDm = TRUE;\t\n}\n\nVOID\nEXhalbtc8723b1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\n\t\thalbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t//halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\thalbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8723b1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723b1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], *****************Coex DM Reset*****************\\n\"));\n\n\thalbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);\n\thalbtc8723b1ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723b1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\", \n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\", \n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8723b1Ant, GLCoexVer8723b1Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)\n\thalbtc8723b1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8723b1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8723b1ant_MonitorWiFiCtr(pBtCoexist);\n#if BT_8723B_1ANT_ANTDET_ENABLE\n\thalbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist);\n#endif\n\n\tif ( (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx < 50) && (pBtLinkInfo->bHidExist == TRUE))\n\t{\n\t\tpBtLinkInfo->bHidExist  = FALSE;\n\t}\n\n\tif( halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust )\n\t{\n\t\thalbtc8723b1ant_RunCoexistMechanism(pBtCoexist);\t\n\t}\n\n\tpCoexSta->specialPktPeriodCnt++;\n\n\t// sample to set bt to execute Ant detection\n\t//pBtCoexist->fBtcSetBtAntDetection(pBtCoexist, 20, 14);\n/*\n\tif (pPsdScan->bIsAntDetEnable)\n\t{\n\t\t if (pPsdScan->nPSDGenCount > pPsdScan->realseconds)\n\t\t\tpPsdScan->nPSDGenCount = 0;\n\t\t \n\t\thalbtc8723b1ant_AntennaDetection(pBtCoexist, pPsdScan->realcentFreq,  pPsdScan->realoffset, pPsdScan->realspan,  pPsdScan->realseconds);\t\n\t\tpPsdScan->nPSDGenTotalCount +=2;\n\t\tpPsdScan->nPSDGenCount += 2;\n\t}\n*/\t \t\n#endif\n}\n\nVOID\nEXhalbtc8723b1ant_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\tstatic u4Byte AntDetCount = 0, AntDetFailCount = 0;\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\t\n\tBOOLEAN bScan, bRoam;\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\t\n\n\tif (seconds == 0)\n\t{\n\t\tpPsdScan->bAntDet_TryCount\t= 0;\n\t\tpPsdScan->bAntDet_FailCount\t= 0;\n\t\tAntDetCount = 0;\n\t\tAntDetFailCount = 0;\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\treturn;\n\t}\n\n\tif (!pBoardInfo->btdmAntDetFinish)\n\t{\n\t\tpPsdScan->nAntDet_IntevalCount = pPsdScan->nAntDet_IntevalCount+2;\n\n\t\tif (pPsdScan->nAntDet_IntevalCount >= BT_8723B_1ANT_ANTDET_RETRY_INTERVAL)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is up, Try Detect!!\\n\"));\n\t\t\thalbtc8723b1ant_PSD_AntennaDetectionCheck(pBtCoexist);\t\n\t\t\t\n\t\t\tif (pBoardInfo->btdmAntDetFinish)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Success!!\\n\"));\n#if 1\n\t\t\t\tif (pBoardInfo->btdmAntNumByAntDet == 2)\n\t\t\t\t\thalbtc8723b1ant_MechanismSwitch(pBtCoexist, TRUE);\n\t\t\t\telse\n\t\t\t\t\thalbtc8723b1ant_MechanismSwitch(pBtCoexist, FALSE);\t\n#endif\n\t\t\t}\n\t\t\telse\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Fail!!\\n\"));\n\t\t\t\t\n\t\t\tpPsdScan->nAntDet_IntevalCount = 0;\n\t\t}\n\telse\n\t{\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is not up! (%d)\\n\", pPsdScan->nAntDet_IntevalCount));\n\t\t}\n\t\t\t\n\t}\n#endif\n\t\t\n\t\t\n/*\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\t\n\n\n\tpPsdScan->nAntDet_BTTxTime = seconds;  //0.42ms*50 = 20ms\n\tpPsdScan->nAntDet_BTLEChannel = centFreq;\t\t\n\t\t\n\tif (seconds == 0)\n\t\t{\n\t\tpPsdScan->bAntDet_TryCount\t= 0;\n\t\tpPsdScan->bAntDet_FailCount\t= 0;\n\t\tAntDetCount = 0;\n\t\tAntDetFailCount = 0;\n\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\tpBoardInfo->btdmAntNumByAntDet = 1;\n\t\t\t return;\n\t}\n\telse\n\t{\n \t\tAntDetCount++;\n\t\n\t\tpPsdScan->bAntDet_TryCount = AntDetCount;\t\n\t\t\t\t\n\t\tif (bScan ||bRoam)\n\t\t{\n\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\tpPsdScan->nAntDet_Result = 6;\n\t\t}\n\t\telse if (pCoexSta->nNumOfProfile >= 1) \n\t\t{\n\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\tpPsdScan->nAntDet_Result = 7;\n\t\t}\t\t\t\n\t\telse if (!pPsdScan->nAntDet_IsAntDetAvailable)  //Antenna initial setup is not ready\n\t\t{\n\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\tpPsdScan->nAntDet_Result = 9;\n\t\t}\t\t\t\t\n\t\telse if (pCoexSta->bC2hBtInquiryPage)\n\t\t{\n\t\t\tpBoardInfo->btdmAntDetFinish = FALSE;\n\t\t\tpPsdScan->nAntDet_Result = 10;\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\t//halbtc8723b1ant_PSD_AntennaDetection(pBtCoexist,  pPsdScan->nAntDet_BTTxTime, pPsdScan->nAntDet_BTLEChannel);\t\t\t\n\t}\n\n\t\tif (!pBoardInfo->btdmAntDetFinish)\n\t\t\tAntDetFailCount++;\n\n\t\tpPsdScan->bAntDet_FailCount = AntDetFailCount;\n\t}\n*/\n}\n\nVOID\nEXhalbtc8723b1ant_AntennaIsolation(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\n\n}\n\nVOID\nEXhalbtc8723b1ant_PSDScan(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\n\n}\n\nVOID\nEXhalbtc8723b1ant_DisplayAntDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\n#if BT_8723B_1ANT_ANTDET_ENABLE\n\tif (pPsdScan->bAntDet_TryCount != 0)\n\t{\n\t\thalbtc8723b1ant_PSD_ShowAntennaDetectResult(pBtCoexist);\n\n\t\tif (pBoardInfo->btdmAntDetFinish)\n\t\t\thalbtc8723b1ant_PSD_ShowData(pBtCoexist);\n\t\treturn;\n\t}\n#endif\n\t\n\t//halbtc8723b1ant_ShowPSDData(pBtCoexist);\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723b1Ant.h",
    "content": "//===========================================\n// The following is for 8723B 1ANT BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8723B_1ANT\t\t\t\t1\n\n#define\tBT_INFO_8723B_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8723B_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8723B_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8723B_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8723B_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8723B_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8723B_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8723B_1ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8723B_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\tBTC_RSSI_COEX_THRESH_TOL_8723B_1ANT\t\t2\n\n#define  BT_8723B_1ANT_WIFI_NOISY_THRESH\t\t\t\t\t\t\t\t50 //30   //max: 255\t\t\t\t\t\t\t\t\n\n//for Antenna detection\n#define\tBT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND\t\t\t\t\t50\n#define\tBT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION\t\t\t\t70\n#define\tBT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION\t\t\t55\n#define\tBT_8723B_1ANT_ANTDET_PSDTHRES_1ANT\t\t\t\t\t\t\t35\n#define\tBT_8723B_1ANT_ANTDET_RETRY_INTERVAL\t\t\t\t\t\t\t10\t//retry timer if ant det is fail, unit: second\n#define\tBT_8723B_1ANT_ANTDET_ENABLE\t\t\t\t\t\t\t\t\t0\n#define\tBT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE\t\t\t\t0\n\ntypedef enum _BT_INFO_SRC_8723B_1ANT{\n\tBT_INFO_SRC_8723B_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8723B_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8723B_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8723B_1ANT_MAX\n}BT_INFO_SRC_8723B_1ANT,*PBT_INFO_SRC_8723B_1ANT;\n\ntypedef enum _BT_8723B_1ANT_BT_STATUS{\n\tBT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8723B_1ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8723B_1ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8723B_1ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8723B_1ANT_BT_STATUS_MAX\n}BT_8723B_1ANT_BT_STATUS,*PBT_8723B_1ANT_BT_STATUS;\n\ntypedef enum _BT_8723B_1ANT_WIFI_STATUS{\n\tBT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE\t\t\t\t= 0x0,\n\tBT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN\t\t= 0x1,\n\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN\t\t\t\t\t= 0x2,\n\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT\t\t\t\t= 0x3,\n\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE\t\t\t\t\t= 0x4,\n\tBT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY\t\t\t\t\t= 0x5,\n\tBT_8723B_1ANT_WIFI_STATUS_MAX\n}BT_8723B_1ANT_WIFI_STATUS,*PBT_8723B_1ANT_WIFI_STATUS;\n\ntypedef enum _BT_8723B_1ANT_COEX_ALGO{\n\tBT_8723B_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8723B_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8723B_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8723B_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8723B_1ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8723B_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8723B_1ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8723B_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8723B_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8723B_1ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8723B_1ANT_COEX_ALGO,*PBT_8723B_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8723B_1ANT{\n\t// hw setting\n\tu1Byte\t\tpreAntPosType;\n\tu1Byte\t\tcurAntPosType;\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n\tu4Byte\t\tnArpCnt;\n\n\tu1Byte\t\terrorCondition;\n} COEX_DM_8723B_1ANT, *PCOEX_DM_8723B_1ANT;\n\ntypedef struct _COEX_STA_8723B_1ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\tBOOLEAN\t\t\t\t\tbBtHiPriLinkExist;\n\tu1Byte\t\t\t\t\tnNumOfProfile;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\tspecialPktPeriodCnt;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\ts1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8723B_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8723B_1ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbBtWhckTest;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtRemoteNameReq;\t\t\t\t\n\tBOOLEAN\t\t\t\t\tbWiFiIsHighPriTask;\t\t//Add for win8.1 page out issue\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu4Byte\t\t\t\t\tpopEventCnt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\t\n\n\tBOOLEAN\t\t\t\t\tbCCKLock;\n\tBOOLEAN\t\t\t\t\tbPreCCKLock;\n\tBOOLEAN\t\t\t\t\tbCCKEverLock;\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\tu4Byte\t\t\t\t\twrongProfileNotification;\n\n\tu1Byte\t\t\t\t\tnA2DPBitPool;\n\tu1Byte\t\t\t\t\tnCutVersion;\n}COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT;\n\n#define  BT_8723B_1ANT_ANTDET_PSD_POINTS\t\t\t256\t//MAX:1024\n#define  BT_8723B_1ANT_ANTDET_PSD_AVGNUM\t\t\t1\t//MAX:3\n#define\tBT_8723B_1ANT_ANTDET_BUF_LEN\t\t\t\t16\n\ntypedef struct _PSDSCAN_STA_8723B_1ANT{\n\nu4Byte\t\t \tnAntDet_BTLEChannel;  //BT LE Channel ex:2412\nu4Byte\t\t\tnAntDet_BTTxTime;\nu4Byte\t\t\tnAntDet_PrePSDScanPeakVal;\nBOOLEAN\t\t\tnAntDet_IsAntDetAvailable;\nu4Byte\t\t\tnAntDet_PSDScanPeakVal;\nBOOLEAN\t\t\tnAntDet_IsBTReplyAvailable;\nu4Byte\t\t\tnAntDet_PSDScanPeakFreq;\n\nu1Byte\t\t\tnAntDet_Result;\nu1Byte\t\t\tnAntDet_PeakVal[BT_8723B_1ANT_ANTDET_BUF_LEN];\nu1Byte\t\t\tnAntDet_PeakFreq[BT_8723B_1ANT_ANTDET_BUF_LEN];\nu4Byte\t\t\tbAntDet_TryCount;\nu4Byte\t\t\tbAntDet_FailCount;\nu4Byte\t\t\tnAntDet_IntevalCount;\nu4Byte\t\t\tnAntDet_ThresOffset;\n\nu4Byte\t\t\tnRealCentFreq;\ns4Byte\t\t\tnRealOffset;\nu4Byte\t\t\tnRealSpan;\n\t\nu4Byte\t\t\tnPSDBandWidth;  //unit: Hz\nu4Byte\t\t\tnPSDPoint;\t\t//128/256/512/1024\nu4Byte\t\t\tnPSDReport[1024];  //unit:dB (20logx), 0~255\nu4Byte\t\t\tnPSDReport_MaxHold[1024];  //unit:dB (20logx), 0~255\nu4Byte\t\t\tnPSDStartPoint;\nu4Byte\t\t\tnPSDStopPoint;\nu4Byte\t\t\tnPSDMaxValuePoint;\nu4Byte\t\t\tnPSDMaxValue;\nu4Byte\t\t\tnPSDStartBase;\nu4Byte\t\t\tnPSDAvgNum;\t// 1/8/16/32\nu4Byte\t\t\tnPSDGenCount;\nBOOLEAN\t\t\tbIsPSDRunning;\nBOOLEAN\t\t\tbIsPSDShowMaxOnly;\n} PSDSCAN_STA_8723B_1ANT, *PPSDSCAN_STA_8723B_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8723b1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8723b1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8723b1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8723b1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b1ant_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\nVOID\nEXhalbtc8723b1ant_AntennaIsolation(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\n\nVOID\nEXhalbtc8723b1ant_PSDScan(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\nVOID\nEXhalbtc8723b1ant_DisplayAntDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723b2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8723B Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8723b2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8723B_2ANT\t\tGLCoexDm8723b2Ant;\nstatic PCOEX_DM_8723B_2ANT \tpCoexDm=&GLCoexDm8723b2Ant;\nstatic COEX_STA_8723B_2ANT\t\tGLCoexSta8723b2Ant;\nstatic PCOEX_STA_8723B_2ANT\tpCoexSta=&GLCoexSta8723b2Ant;\n\nconst char *const GLBtInfoSrc8723b2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8723b2Ant=20150119;\nu4Byte\tGLCoexVer8723b2Ant=0x44;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8723b2ant_\n//============================================================\nu1Byte\nhalbtc8723b2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8723b2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8723b2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\",  btDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\",  (bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tif(bBtDisabled)\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n\nVOID\nhalbtc8723b2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n}\n\nVOID\nhalbtc8723b2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif( (pCoexSta->lowPriorityTx > 1050)  && (!pCoexSta->bC2hBtInquiryPage))\n\t\tpCoexSta->popEventCnt++;\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  &&  (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8723b2ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n}\n\nVOID\nhalbtc8723b2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nBOOLEAN\nhalbtc8723b2ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN\tbWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\t\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\t\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\n\n\t\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist,3, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\n\t\tif ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) ||  (BTC_RSSI_STATE_LOW ==wifiRssiState ))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8723b2ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 1)\t// profile from bt patch\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n#else\t// profile from bt stack\n\tpBtLinkInfo->bBtLinkExist = pStackInfo->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pStackInfo->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pStackInfo->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pStackInfo->bPanExist;\n\tpBtLinkInfo->bHidExist = pStackInfo->bHidExist;\n\n\t//for win-8 stack HID report error\n\tif(!pStackInfo->bHidExist)\n\t\tpStackInfo->bHidExist = pCoexSta->bHidExist;  //sync  BTInfo with BT firmware and stack\n\t// when stack HID report error, here we use the info from bt fw.\n\tif(!pStackInfo->bBtLinkExist)\n\t\tpStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\t\n#endif\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8723b2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8723B_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\t\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n#if 0\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8723b2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = decBtPwrLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\\n\", \n\t\tdecBtPwrLvl, H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723b2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), decBtPwrLvl));\n\tpCoexDm->curBtDecPwrLvl = decBtPwrLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\n\n\tpCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\n}\n\nVOID\nhalbtc8723b2ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8723b2ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8723b2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8723b2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8723b2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8723b2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\")) );\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\t//return;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8723b2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val);\n}\n\nVOID\nhalbtc8723b2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8723b2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8723b2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8723b2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8723b2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc05, 0x30, 0x1);\n\t}\n}\n\nVOID\nhalbtc8723b2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8723b2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\t//=================BB AGC Gain Table\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table Off!\\n\"));\n\t \tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001);\n\t}\n\t\n\t\n\t//=================RF Gain\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tif(bAgcTableEn)\n\t{\n\t\trssiAdjustVal = 8;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\nVOID\nhalbtc8723b2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8723b2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8723b2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8723b2ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\thalbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8723b2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b2ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8723b2ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8723b2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8723b2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8723b2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8723b2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\n\n\t if ( (pCoexSta->bA2dpExist) && (pCoexSta->bHidExist) )\n\t {\n\t\tbyte5 = byte5 | 0x1;\n\t }\n\t \n\tH2C_Parameter[0] = byte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = byte5;\n\n\tpCoexDm->psTdmaPara[0] = byte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = byte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x60(5bytes)=0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8723b2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\t/*\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t*/\n\t\n\t//halbtc8723b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\thalbtc8723b2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8723b2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\t//halbtc8723b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\t//halbtc8723b2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\t//halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8723b2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\tfwVer=0, u4Tmp=0;\n\tBOOLEAN\t\t\tbPgExtSwitch=FALSE;\n\tBOOLEAN\t\t\tbUseExtSwitch=FALSE;\n\tu1Byte\t\t\tH2C_Parameter[2] ={0};\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\t// [31:16]=fw ver, [15:0]=fw sub ver\n\n\tif((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)\n\t\tbUseExtSwitch = TRUE;\n\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);\n\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t\t/* Use H2C to set GNT_BT to High to avoid A2DP click */\n\t\t\tH2C_Parameter[0] = 1;\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi TRx Mask off\n\t\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off\n\n\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t{\n\t\t\t//tell firmware \"no antenna inverse\"\n\t\t\tH2C_Parameter[0] = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//tell firmware \"antenna inverse\"\n\t\t\tH2C_Parameter[0] = 1;\n\t\t}\n\n\t\tif (bUseExtSwitch)\n\t\t{\n\t\t\t//ext switch type\n\t\t\tH2C_Parameter[1] = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//int switch type\n\t\t\tH2C_Parameter[1] = 0;\n\t\t}\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t}\n\telse\n\t{\n\t\tif(fwVer >= 0x180000)\n\t\t{\n\t\t\t/* Use H2C to set GNT_BT to \"Control by PTA\"*/\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);\n\t\t}\n\t}\n\n\t// ext switch setting\n\tif(bUseExtSwitch)\n\t{\n\t\tif (bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp &=~BIT23;\n\t\t\tu4Tmp |= BIT24;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);\t// ext switch main at wifi\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);\t// ext switch aux at wifi\n\t\t\t\tbreak;\n\t\t}\t\n\t}\n\telse\t// internal switch\n\t{\n\t\tif (bInitHwCfg)\n\t\t{\n\t\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\t\tu4Tmp |= BIT23;\n\t\t\tu4Tmp &=~BIT24;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //fixed external switch S1->Main, S0->Aux\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\tu1Byte\t\t\twifiRssiState1, btRssiState;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\tu1Byte\t\t\tpsTdmaByte4Modify = 0x0;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\t\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn)\n\t{\n\t\ttype = type +100;  //for WiFi RSSI low or BT RSSI low\n\t\tpCoexDm->bIsSwitchTo1dot5Ant = TRUE;\n\t}\n\telse\n\t{\n\t\tpCoexDm->bIsSwitchTo1dot5Ant = FALSE;\n\t}\n\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\n\tif (pCoexSta->nScanAPNum <= 5)\n\t{\t       \t\n\t\tif (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\n\t\telse if (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\t\n\t\telse\n \t\t  nWiFiDurationAdjust = 5;\t\t\n\t}\n\telse  if  (pCoexSta->nScanAPNum <= 20)\n\t{\t\t   \t\n\t\tif (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\n\t\telse if (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\n\t\telse\n \t\t nWiFiDurationAdjust = 0;\t    \t\n\t}\n\telse if  (pCoexSta->nScanAPNum <= 40)\n\t{\n\t \tif (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\n\t\telse if (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\t\n\t\telse\n \t\t  nWiFiDurationAdjust = -5;\t\n\t}\n\telse\n\t{\n\t \tif (pCoexSta->nA2DPBitPool >= 45)\n\t\t  nWiFiDurationAdjust = -15;\n\t\telse if (pCoexSta->nA2DPBitPool >= 35)\n\t\t  nWiFiDurationAdjust = -10;\t\n\t\telse\n \t\t  nWiFiDurationAdjust = -10;\t\n\t}\n\n\tif ( (pBtLinkInfo->bSlaveRole == TRUE)\t&& (pBtLinkInfo->bA2dpExist) )\n\t\tpsTdmaByte4Modify = 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\t\n\t\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1, 0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x03, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x3, 0x70,  0x90|psTdmaByte4Modify);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x3, 0x70,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x03, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1,  0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x3, 0x70,  0x90|psTdmaByte4Modify);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d+nWiFiDurationAdjust, 0x3, 0x70,  0x90|psTdmaByte4Modify);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70,  0x90|psTdmaByte4Modify);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70,  0x90|psTdmaByte4Modify);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\t\n\t\t\tcase 71:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c+nWiFiDurationAdjust, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 101:\n\t\t\tcase 105:\n\t\t\tcase 171:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a+nWiFiDurationAdjust, 0x03, 0x70, 0x50|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 102:\n\t\t\tcase 106:\n\t\t\tcase 110:\n\t\t\tcase 114:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d+nWiFiDurationAdjust, 0x03, 0x70, 0x50|psTdmaByte4Modify);\n\t\t\t\tbreak;\t\n\t\t\tcase 103:\n\t\t\tcase 107:\n\t\t\tcase 111:\n\t\t\tcase 115:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50|psTdmaByte4Modify);\n\t\t\t\tbreak;\t\t\n\t\t\tcase 104:\n\t\t\tcase 108:\n\t\t\tcase 112:\n\t\t\tcase 116:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50|psTdmaByte4Modify);\n\t\t\t\tbreak;\t\n\t\t\tcase 109:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 113:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\n\t\t\tcase 121:\t\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90|psTdmaByte4Modify);\n\t\t\t\tbreak;\t\n\t\t\tcase 22:\n\t\t\tcase 122:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x03, 0x71, 0x11);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8723b2ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8723b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8723b2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8723b2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\nVOID\nhalbtc8723b2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8723b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\tpCoexSta->popEventCnt = 0;\n\n}\n\nVOID\nhalbtc8723b2ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tBOOLEAN\tbLowPwrDisable=TRUE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi link process + BT Inq/Page!!\\n\"));\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse if(bWifiConnected)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT Inq/Page!!\\n\"));\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi no-link + BT Inq/Page!!\\n\"));\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t}\t\n\t\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n/*\n\tpCoexDm->bNeedRecover0x948 = TRUE;\n\tpCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\n\thalbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, FALSE, FALSE);\n*/\t\n}\n\n\nVOID\nhalbtc8723b2ant_ActionWiFiLinkProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu1Byte \tu1Tmpa, u1Tmpb;\n\t\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\n\t u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n        u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\t u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\n\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\\n\",\n\t   \t      u4Tmp,  u1Tmpa, u1Tmpb));\n}\n\nBOOLEAN\nhalbtc8723b2ant_ActionWifiIdleProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES-20, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif(BTC_RSSI_HIGH(wifiRssiState1) && \n\t\t\t(pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE))\n\t{\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\\n\"));\n\t\t\n\t\thalbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6);\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t// sw all off\n\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t  \treturn TRUE;\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\treturn FALSE;\t\n\t}\n\t\n\t\n}\n\n\n\nBOOLEAN\nhalbtc8723b2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tbtRssiState=BTC_RSSI_STATE_HIGH;\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbBtHsOn=FALSE, bLowPwrDisable=FALSE;\n\tBOOLEAN\t\t\tbAsus8723b=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected)\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-connected idle!!\\n\"));\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n \t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif(BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\t\t\n\t\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t      \thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse if(BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bBtHsOn)\n\t\t\t\treturn FALSE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\t\t\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bWifiBusy)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_IS_ASUS_8723B, &bAsus8723b);\n\t\t\t\tif(!bAsus8723b)\n\t\t\t\t\tbCommon = FALSE;\n\t\t\t\telse\n\t\t\t\t\tbCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist);\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t\t\t//bCommon = FALSE;\t\n\t\t\t\tbCommon = halbtc8723b2ant_ActionWifiIdleProcess(pBtCoexist);\t\t\t\n\t\t\t}\n\t\t}\t\n\t}\n\n\treturn bCommon;\n}\nVOID\nhalbtc8723b2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8723b2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse  //for SCO quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t}\n\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x4);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x4);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x4);\n\t\t}\t\t\n\t}\n}\n\n\nVOID\nhalbtc8723b2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\t\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);\n\t}\n\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t}\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8723b2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif( (apNum >= 10) && BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\t//DbgPrint(\" AP#>10(%d)\\n\", apNum);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\t\n\t\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\t\t\t\n\t\t\t\t\t\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t\t// sw mechanism\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\t\t\n\t\t}\n\t\treturn;\n\t\t\n\t}\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\t\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t}\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8723b2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8723b2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t}\n\t\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n\n//PAN(HS) only\nVOID\nhalbtc8723b2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8723b2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\t\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\telse\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);\n\t\t\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t}\n\t\n\t// sw mechanism\t\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\n\t\t\t//halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\t//halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t}\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t//halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8723b2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1,  btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t}\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);\n\twifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8723b2ant_BtRssiState(3, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\n\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse\t\n\t{\t// only 802.11N mode we have to dec bt power to 4 degree\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\t// need to check ap Number of Not\n\t\t\tif(apNum < 10)\n\t\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\telse\n\t\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\t}\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse\t\n\t\t\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8723b2ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8723b2ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\thalbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8723b2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n}\n\nVOID\nhalbtc8723b2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE, bBtHsOn=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\tu4Byte\t\t\t\tnumOfWifiLink=0;\n\tu4Byte\t\t\t\twifiLinkStatus=0;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbMiracastPlusBt=FALSE;\n\tBOOLEAN\t\t\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bBtWhckTest)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under WHCK TEST!!!\\n\"));\n\t\thalbtc8723b2ant_ActionBtWhckTest(pBtCoexist);\n\t\treturn;\n\t}\n\n\talgorithm = halbtc8723b2ant_ActionAlgorithm(pBtCoexist);\n\tif(pCoexSta->bC2hBtInquiryPage && (BT_8723B_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8723b2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse\n\t{\n\t\t/*\n\t\tif(pCoexDm->bNeedRecover0x948)\n\t\t{\n\t\t\tpCoexDm->bNeedRecover0x948 = FALSE;\n\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);\n\t\t}\n\t\t*/\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], WiFi is under Link Process !!\\n\"));\n\t\thalbtc8723b2ant_ActionWiFiLinkProcess(pBtCoexist);\n\t\treturn;\n\t}\n\n\t//for P2P\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8723b2ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpCoexDm->curAlgorithm = algorithm;\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\tif(halbtc8723b2ant_IsCommonAction(pBtCoexist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\n\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8723B_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8723b2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\thalbtc8723b2ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8723b2ant_WifiOffHwCfg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\tbIsInMpMode = FALSE;\n\tu1Byte H2C_Parameter[2] ={0};\n\tu4Byte fwVer=0;\n\n\t// set wlan_act to low\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tif(fwVer >= 0x180000)\n\t{\n\t/* Use H2C to set GNT_BT to HIGH */\n\tH2C_Parameter[0] = 1;\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);\n\tif(!bIsInMpMode)\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT\n\telse\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi\n}\n\nVOID\nhalbtc8723b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\tu4Tmp=0, fwVer;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\t\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t//0xf0[15:12] --> Chip Cut information \n\tpCoexSta->nCutVersion = (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xf1) & 0xf0) >> 4;\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\t\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t//Antenna config\t\n\thalbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\n\tpCoexSta->disVerInfoCnt = 0;\n\n\t// PTA parameter\n\thalbtc8723b2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\t\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n}\n\n//============================================================\n// work around function start with wa_halbtc8723b2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8723b2ant_\n//============================================================\nVOID\nEXhalbtc8723b2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu2Byte u2Tmp=0x0;\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);\n\n\t// enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.\n\tu2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);\n\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);\n\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);\n\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t\t// set to S1\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tpBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t}\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\t\t\t\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8723b2ant_InitHwConfig(pBtCoexist, TRUE);\n}\n\nVOID\nEXhalbtc8723b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8723b2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723b2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tstatic u1Byte\t\t\tPopReportIn10s = 0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c\", \"Version Coex/ Fw/ Patch/ Cut\", \\\n\t\tGLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer, pCoexSta->nCutVersion+65);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tPopReportIn10s++;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d/ %d] \", \"BT [status/ rssi/ retryCnt/ popCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi-100, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);\n\tCL_PRINTF(cliBuf);\n\n\tif (PopReportIn10s >= 5)\n\t{\n\t\tpCoexSta->popEventCnt = 0;\t\n\t\tPopReportIn10s = 0;\n\t}\n\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP/NameReq/WHQL\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist, pCoexSta->bC2hBtRemoteNameReq, pCoexSta->bBtWhckTest );\n\tCL_PRINTF(cliBuf);\n\n\tif (pStackInfo->bProfileNotified)\n\t{\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Role\", \\\n\t\t(pBtLinkInfo->bSlaveRole )? \"Slave\":\"Master\");\n\t\tCL_PRINTF(cliBuf);\t\n\t}\t\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"A2DP Rate/Bitpool\", \\\n\t\t(btInfoExt&BIT0)? \"BR\":\"EDR\", pCoexSta->nA2DPBitPool);\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8723B_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8723b2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t// Sw mechanism\t\n\tif(pBtCoexist->bManualControl)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism] (before Manual)============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism] (before Manual) ============\");\t\t\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t}\n\n\tpsTdmaCase = pCoexDm->curPsTdma;\n\n\tif (pCoexDm->bIsSwitchTo1dot5Ant)\n\t\tpsTdmaCase = psTdmaCase + 100;\n\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)\", \"PS TDMA\", \\\n\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, \n\t\t\t(pCoexDm->bCurPsTdmaOn? \"On\":\"Off\"),\n\t\t\t(pCoexDm->bAutoTdmaAdjust? \"Adj\":\"Fix\") );\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Coex Table Type\", \\\n\t\t\tpCoexSta->nCoexTableType);\n\t\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\tpCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x778/0x880[29:25]\", \\\n\t\tu1Tmp[0], (u4Tmp[0]&0x3e000000) >> 25);\n\tCL_PRINTF(cliBuf);\n\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x948/ 0x67[5] / 0x765\", \\\n\t\tu4Tmp[0], ((u1Tmp[0]&0x20)>> 5), u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944);\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x92c[1:0]/ 0x930[7:0]/0x944[1:0]\", \\\n\t\tu4Tmp[0]&0x3, u4Tmp[1]&0xff, u4Tmp[2]&0x3);\n\tCL_PRINTF(cliBuf);\n\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x38[11]/0x40/0x4c[24:23]/0x64[0]\", \\\n\t\t((u1Tmp[0] & 0x8)>>3), u1Tmp[1], ((u4Tmp[0]&0x01800000)>>23), u1Tmp[2]&0x1);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(dig)/0x49c(null-drop)\", \\\n\t\tu4Tmp[0]&0xff, u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\n\tfaOfdm = ((u4Tmp[0]&0xffff0000) >> 16) +  ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \\\n\t\t             ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ;\n\tfaCck = (u1Tmp[0] << 8) + u1Tmp[1];\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"OFDM-CCA/OFDM-FA/CCK-FA\", \\\n\t\tu4Tmp[0]&0xffff, faOfdm, faCck);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_OK CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_Err CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\n\tCL_PRINTF(cliBuf);\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 1)\n\t//halbtc8723b2ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8723b2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8723b2ant_WifiOffHwCfg(pBtCoexist);\n\t\thalbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\thalbtc8723b2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\t\thalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8723b2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8723b2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu1Byte \tu1Tmpa, u1Tmpb;\t\n\t\n\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);\n\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\t\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\t\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\\n\",\n\t\tu4Tmp,  u1Tmpa, u1Tmpb));\n}\n\nVOID\nEXhalbtc8723b2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tu1Byte\t\t\tapNum=0;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\tif(apNum < 10)\n\t\t\t\tH2C_Parameter[2] = 0x30;\n\t\t\telse\n\t\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t}\n\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\t\n}\n\nVOID\nEXhalbtc8723b2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE;\n\tstatic BOOLEAN\t\tbPreScoExist=FALSE;\n\tu4Byte\t\t\t\traMask=0x0;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8723B_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8723B_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), return for Manual CTRL<===\\n\"));\n\t\treturn;\n\t}\n\n\t// if 0xff, it means BT is under WHCK test\n\tif (btInfo == 0xff)\n\t\tpCoexSta->bBtWhckTest = TRUE;\n\telse\n\t\tpCoexSta->bBtWhckTest = FALSE;\n\n\tif(BT_INFO_SRC_8723B_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btRetryCnt >= 1)\n\t\t\tpCoexSta->popEventCnt++;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtRemoteNameReq = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtRemoteNameReq = FALSE;\t\t\t\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][1] == 0x49)\n\t\t{\n\t\t\tpCoexSta->nA2DPBitPool = \n\t\t\t\tpCoexSta->btInfoC2h[rspSource][6]; \n\t\t}\n\t\telse\n\t\t\tpCoexSta->nA2DPBitPool = 0;\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif (pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);\n\t\t}\n\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif( (pCoexSta->btInfoExt & BIT3) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\thalbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8723b2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8723B_2ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8723B_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8723B_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tif ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) && (pCoexSta->bScoExist == FALSE))\n\t\t{\n\t\t\tif (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160) \t\t\n\t\t\t{\n\t\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t\t\tbtInfo = btInfo | 0x28;\n\t\t\t}\n\t\t}\n\t}\n\n\thalbtc8723b2ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tif(!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8723B_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8723B_2ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8723B_2ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8723B_2ANT_B_ACL_BUSY)\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\t\n\tif( (BT_8723B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbBtBusy = TRUE;\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8723b2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8723b2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8723b2ant_WifiOffHwCfg(pBtCoexist);\n\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\n\thalbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\n\tEXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8723b2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\thalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8723b2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8723b2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8723b2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\t//static u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(pCoexSta->disVerInfoCnt <= 5)\n\t{\n\t\tpCoexSta->disVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\n\t\tif (pCoexSta->disVerInfoCnt == 3)\n\t\t{\n\t\t\t//Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial \n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set GNT_BT control by PTA\\n\"));\n\t\t\thalbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE);\n\t\t}\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)\n\thalbtc8723b2ant_QueryBtInfo(pBtCoexist);\n\thalbtc8723b2ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8723b2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8723b2ant_MonitorWiFiCtr(pBtCoexist);\n\t\n\t//for some BT speaker that Hi-Pri pkt appear begore start play, this will cause HID exist\n\tif ( (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx < 50) && (pBtLinkInfo->bHidExist == TRUE))\n\t{\n\t\tpBtLinkInfo->bHidExist  = FALSE;\n\t}\n\t\n\tif( halbtc8723b2ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust)\n\t{\n\t\thalbtc8723b2ant_RunCoexistMechanism(pBtCoexist);\n\t}\n#endif\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8723b2Ant.h",
    "content": "//===========================================\n// The following is for 8723B 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8723B_2ANT\t\t\t\t1\n\n\n#define\tBT_INFO_8723B_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8723B_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8723B_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8723B_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8723B_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8723B_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8723B_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8723B_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8723B_2ANT\t\t2\n\n\n#define\tBT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES\t\t\t\t42  //WiFi RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n#define\tBT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES\t\t\t\t46 //BT RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n\ntypedef enum _BT_INFO_SRC_8723B_2ANT{\n\tBT_INFO_SRC_8723B_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8723B_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8723B_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8723B_2ANT_MAX\n}BT_INFO_SRC_8723B_2ANT,*PBT_INFO_SRC_8723B_2ANT;\n\ntypedef enum _BT_8723B_2ANT_BT_STATUS{\n\tBT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8723B_2ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8723B_2ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8723B_2ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8723B_2ANT_BT_STATUS_MAX\n}BT_8723B_2ANT_BT_STATUS,*PBT_8723B_2ANT_BT_STATUS;\n\ntypedef enum _BT_8723B_2ANT_COEX_ALGO{\n\tBT_8723B_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8723B_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8723B_2ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8723B_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8723B_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8723B_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8723B_2ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8723B_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8723B_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8723B_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8723B_2ANT_COEX_ALGO,*PBT_8723B_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8723B_2ANT{\n\t// fw mechanism\n\tu1Byte\t\tpreBtDecPwrLvl;\n\tu1Byte\t\tcurBtDecPwrLvl;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tBOOLEAN\t\tbNeedRecover0x948;\n\tu4Byte\t\tbackup0x948;\n\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\tBOOLEAN\t\tbIsSwitchTo1dot5Ant;\n} COEX_DM_8723B_2ANT, *PCOEX_DM_8723B_2ANT;\n\ntypedef struct _COEX_STA_8723B_2ANT{\t\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8723B_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8723B_2ANT_MAX];\n\tBOOLEAN \t\t\t\tbBtWhckTest;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtRemoteNameReq;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu4Byte\t\t\t\t\tpopEventCnt;\n    \tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\n\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\n\tu1Byte\t\t\t\t\tdisVerInfoCnt;\n\n\tu1Byte\t\t\t\t\tnA2DPBitPool;\n\tu1Byte\t\t\t\t\tnCutVersion;\n}COEX_STA_8723B_2ANT, *PCOEX_STA_8723B_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8723b2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8723b2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8723b2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8723b2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8723b2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8723b2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8812a1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8812A Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8812a1Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8812A_1ANT\t\tGLCoexDm8812a1Ant;\nstatic PCOEX_DM_8812A_1ANT \tpCoexDm=&GLCoexDm8812a1Ant;\nstatic COEX_STA_8812A_1ANT\t\tGLCoexSta8812a1Ant;\nstatic PCOEX_STA_8812A_1ANT\tpCoexSta=&GLCoexSta8812a1Ant;\n\nconst char *const GLBtInfoSrc8812a1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8812a1Ant=20140708;\nu4Byte\tGLCoexVer8812a1Ant=0x52;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8812a1ant_\n//============================================================\nu1Byte\nhalbtc8812a1ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8812a1ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8812a1ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\n//to check 0x430/0x434 is correct??\nVOID\nhalbtc8812a1ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\n//to check 0x42a ??\nVOID\nhalbtc8812a1ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\n//to check 0x456??\nVOID\nhalbtc8812a1ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8812a1ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8812a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8812a1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8812a1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8812a1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8812a1ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8812a1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tu1Byte\tdataLen=3;\n\tu1Byte\tbuf[5] = {0};\n\n\tif(!pBtCoexist->btInfo.bBtDisabled)\n\t{\n\t\tif(!pCoexSta->btInfoQueryCnt ||\n\t\t\t(pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_BT_RSP]-pCoexSta->btInfoQueryCnt)>2)\n\t\t{\n\t\t\tbuf[0] = dataLen;\n\t\t\tbuf[1] = 0x1;\t// polling enable, 1=enable, 0=disable\n\t\t\tbuf[2] = 0x2;\t// polling time in seconds\n\t\t\tbuf[3] = 0x1;\t// auto report enable, 1=enable, 0=disable\n\t\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_INFO, (PVOID)&buf[0]);\n\t\t}\n\t}\n\tpCoexSta->btInfoQueryCnt++;\n}\n\nVOID\nhalbtc8812a1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp, u4Tmp1;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp, u1Tmp1;\n\ts4Byte\t\t\twifiRssi;\n\tstatic u1Byte\t\tNumOfBtCounterChk = 0;\n\t\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif( (pCoexSta->lowPriorityTx > 1150)  && (!pCoexSta->bC2hBtInquiryPage))\n\t\tpCoexSta->popEventCnt++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\\n\",\n\t\tregHPRx, regHPTx, regLPRx, regLPTx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n\n\tif ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))\n\t{\n\t\tNumOfBtCounterChk++;\n\t\tif (NumOfBtCounterChk >= 3)\n\t\t{\n\t\t\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n\t\t\tNumOfBtCounterChk = 0;\n\t\t}\n\t}\n}\n\n//to check registers\nVOID\nhalbtc8812a1ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf04);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf14);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf10);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf40);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf06);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf16);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf12);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf42);\t\t\n\t}\n\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xb58, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xb58, 0x1, 0x0);\n\n\tif ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))\n\t{\n\t\tif ( (pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_ACL_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY) ||\n\t\t\t(pCoexDm->btStatus == BT_8812A_1ANT_BT_STATUS_SCO_BUSY) )\n\t\t{\n\t\t\tif (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n + \n\t\t\t\tpCoexSta->nCRCOK_11nAgg) )\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter < 5)\n\t\t\t\t nCCKLockCounter++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (nCCKLockCounter > 0)\n\t\t\t\t nCCKLockCounter--;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (nCCKLockCounter > 0)\n\t\t\t  nCCKLockCounter--;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter > 0)\n\t\t\tnCCKLockCounter--;\n\t}\n\n\tif (!pCoexSta->bPreCCKLock)\n\t{\n\n\t\tif (nCCKLockCounter >= 5)\n\t\t pCoexSta->bCCKLock = TRUE;\n\t\telse\n\t\t pCoexSta->bCCKLock = FALSE;\t\t\t\n\t}\n\telse\n\t{\n\t\tif (nCCKLockCounter == 0)\n\t\t pCoexSta->bCCKLock = FALSE;\n\t\telse\n\t\t pCoexSta->bCCKLock = TRUE;\t\t\n\t}\n\n\tpCoexSta->bPreCCKLock =  pCoexSta->bCCKLock;\t\n\t\t\n\n}\n\nBOOLEAN\nhalbtc8812a1ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN bWifiConnected=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8812a1ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8812a1ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8812A_1ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO only\\n\"));\n\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID only\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8812a1ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8812a1ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8812a1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\n//to check\nVOID\nhalbtc8812a1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\ttmpU1 |= BIT0;\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8812a1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8812a1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8812a1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8812a1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8812a1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8812a1ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** CoexTable(%d) **********\\n\", type));\n\t\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaa5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8812a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8812a1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\tdataLen=3;\n\tu1Byte\tbuf[5] = {0};\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Ignore Wlan_Act\\n\",\n\t\t(bEnable? \"Enable\":\"Disable\")));\n\n\tbuf[0] = dataLen;\n\tbuf[1] = 0x1;\t\t\t// OP_Code\n\tbuf[2] = 0x1;\t\t\t// OP_Code_Length\n\tif(bEnable)\n\t\tbuf[3] = 0x1;\t\t// OP_Code_Content\n\telse\n\t\tbuf[3] = 0x0;\n\t\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\n}\n\nVOID\nhalbtc8812a1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8812a1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8812a1ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8812a1ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8812a1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8812a1ant_SwMechanism(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN \t\tbLowPenaltyRA\n\t) \n{\n\thalbtc8812a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\n//to check bForceExec\nVOID\nhalbtc8812a1ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tu1Byte\t\t\tu1Tmp=0;\n\n\tpCoexDm->curAntPosType = antPosType;\n\t\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb3, 0x77);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x900, 0x00000400);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76d, 0x1);\n\t}\n\telse if(bWifiOff)\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb3, 0x77);\n\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\t\tu1Tmp &= ~BIT3;\n\t\tu1Tmp |= BIT2;\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp);\n\t}\n\n\tif(bForceExec || (pCoexDm->curAntPosType != pCoexDm->preAntPosType))\n\t{\t\t\n\t\t// ext switch setting\n\t\tswitch(antPosType)\n\t\t{\n\t\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\t\t\t\tu1Tmp |= BIT3;\n\t\t\t\tu1Tmp &= ~BIT2; \t\t\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp);\n\t\t\t\tbreak;\n\t\t\tcase BTC_ANT_PATH_BT:\n\t\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\t\t\t\tu1Tmp &= ~BIT3;\n\t\t\t\tu1Tmp |= BIT2;\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tcase BTC_ANT_PATH_PTA:\n\t\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\t\t\t\tu1Tmp |= BIT3;\n\t\t\t\tu1Tmp &= ~BIT2; \t\t\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpCoexDm->preAntPosType = pCoexDm->curAntPosType;\n}\n\nVOID\nhalbtc8812a1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\n\nVOID\nhalbtc8812a1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0, rssiAdjustVal=0;\n\tu1Byte\t\t\tpsTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val =  0x10;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\tstatic BOOLEAN\t bPreWifiBusy=FALSE;\n\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\t\n\n\tif (bWifiBusy != bPreWifiBusy)\n\t{\n\t\t bForceExec = TRUE;\t\n\t\t bPreWifiBusy = bWifiBusy;\n\t}\n\n\tif (pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(off, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\t\t\t\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\n\n\tif (pCoexSta->nScanAPNum <= 5)\n\t \tnWiFiDurationAdjust = 2;\n\telse if  (pCoexSta->nScanAPNum >= 40)\n\t \tnWiFiDurationAdjust = -15;\t\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t \tnWiFiDurationAdjust = -10;\t\n\t\n\tif (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\n\t}\n\t\n\tif (  (type == 3) || (type == 13) || (type == 14) )\n\t{\n\t\tpsTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\n\t\n\t\tif (!bWifiBusy)\n\t\t psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t}\n\t\n\tif (pBtLinkInfo->bSlaveRole == TRUE)\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\t\n\tif(bTurnOn)\n\t{\t \n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 20:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 30:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 31:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\n\t\t\t\tbreak;\n\t\t\tcase 32:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 33:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 34:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 35:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 36:\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\n\t\t\t\t/* here softap mode screen off will cost 70-80mA for phone */\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\n\t\t\t\tbreak;\t\n\t\t}\n\t}\n\telse\n\t{\t\t\n\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 8: //PTA Control\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:  //Software control, Antenna at BT side\n\t\t\t\thalbtc8812a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\trssiAdjustVal =0;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\n\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nBOOLEAN\nhalbtc8812a1ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\\n\"));\n\t\t\n \t\t//halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t//halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\n\t\t//halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT Busy!!\\n\"));\n\n\t\t//halbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif (bWifiBusy)\t\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t}\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8812a1ant_TdmaDurationAdjustForAcl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbWifiBusy = FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjustForAcl()\\n\"));\n\n\tif(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifiStatus) \n\t\tbWifiBusy = TRUE;\n\telse\n\t\tbWifiBusy = FALSE;\t \t\n\n\tif( (BT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 3 &&\n\t\t\tpCoexDm->curPsTdma != 9 )\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\n\t\tif ( (pCoexSta->lowPriorityTx) > 1150 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n\t\t\tif( (BT_INFO_8812A_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n\t\t\tif( (BT_INFO_8812A_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t}\n\t\t}\n\t\telse\t  //no change\n\t\t{\n\t\t\t/* Bryant Modify\t\n\t\t\tif(bWifiBusy != bPreWifiBusy)  //if busy / idle change\n\t\t\t{\n\t\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, pCoexDm->curPsTdma);\n\t\t\t}\n\t\t\t*/\n\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 9 &&\n\t\t\tpCoexDm->curPsTdma != 11 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a1ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a1ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8812a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8812a1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8812a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiOnly(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n}\n\nVOID\nhalbtc8812a1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t\thalbtc8812a1ant_ActionWifiOnly(pBtCoexist);\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n//=============================================\n//\n//\tSoftware Coex Mechanism start\n//\n//=============================================\n\n// SCO only or SCO+PAN(HS)\n\n/*\nVOID\nhalbtc8812a1ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n\nVOID\nhalbtc8812a1ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8812a1ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8812a1ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8812a1ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8812a1ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8812a1ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8812a1ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8812a1ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8812a1ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n*/\n\n//=============================================\n//\n//\tNon-Software Coex Mechanism start\n//\n//=============================================\nVOID\nhalbtc8812a1ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8812a1ant_ActionHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8812a1ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))\n\t{\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t \thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\t\n\t}\n\telse if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\t// SCO/HID/A2DP  busy\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if ((pBtLinkInfo->bPanExist) || (bWifiBusy))\n\t{\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\t\t\n\t\t\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse\n\t{\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionBtScoHidOnlyBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// tdma and coex table\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n\telse //HID\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiConnectedBtAclBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tu1Byte\t\tbtRssiState;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tbtRssiState = halbtc8812a1ant_BtRssiState(2, 28, 0);\t\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tif(pBtLinkInfo->bHidOnly)  //HID\n\t{\n\t\thalbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\treturn;\n\t}\n\telse if(pBtLinkInfo->bA2dpOnly)  //A2DP\t\t\n\t{\n\t\tif(BT_8812A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\t}\n\t}\n\telse if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\n\t\t       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t}\n\telse if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)\t\t\t\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\t//BT no-profile busy (0x9)\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\t\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\t\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiNotConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiNotConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t        halbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t}\n\telse if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiNotConnectedAssoAuth(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) ||  (pBtLinkInfo->bA2dpExist) )\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse if (pBtLinkInfo->bPanExist)   \t\t\t\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t \t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t}\n\telse if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//Bryant Add\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiConnectedSpecialPacket(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if(pBtLinkInfo->bPanExist) \n\t{\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_ActionWifiConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbWifiBusy=FALSE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tBOOLEAN\t\tbUnder4way=FALSE, bApEnable=FALSE;\n\tu4Byte\t\twifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect()===>\\n\"));\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\tif(bUnder4way)\n\t{\n\t\thalbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\\n\"));\n\t\treturn;\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tif(bScan)\t\n\t\t\thalbtc8812a1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\telse\n\t\t\thalbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t\n\t// power save state\n\tif(!bApEnable && BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\n\t{\n\t\tif(pBtCoexist->btLinkInfo.bA2dpOnly)\t//A2DP\n\t\t\t{\t\t\t\n\t\t\tif(!bWifiBusy)\n\t\t     \t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\n\t\t\telse //busy\n\t\t\t{\n\t\t\t\tif  (pCoexSta->nScanAPNum >= BT_8812A_1ANT_WIFI_NOISY_THRESH)  //no force LPS, no PS-TDMA, use pure TDMA\n\t\t\t\t{\n \t\t\t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))\n \t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\telse\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(!bWifiBusy)\n\t{\n\t\tif(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, \n\t\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist,\n\t\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8812a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse \n\t\t{\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC, FALSE, FALSE);\t\n\t\t\tif ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )\n\t\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\telse\n\t\t\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); \n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a1ant_RunSwCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\t\talgorithm=0;\n\n\talgorithm = halbtc8812a1ant_ActionAlgorithm(pBtCoexist);\n\tpCoexDm->curAlgorithm = algorithm;\n\n\tif(halbtc8812a1ant_IsCommonAction(pBtCoexist))\n\t{\n\n\t}\n\telse\n\t{\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = SCO.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR).\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HS mode.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_1ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP.\\n\"));\n\t\t\t\t//halbtc8812a1ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = coexist All Off!!\\n\"));\n\t\t\t\t//halbtc8812a1ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8812a1ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbIncreaseScanDevNum=FALSE;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tBOOLEAN\tbMiracastPlusBt=FALSE;\n\tu1Byte\taggBufSize=5;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0, wifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif( (BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbIncreaseScanDevNum = TRUE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\n\t\tif ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\n\t\t\thalbtc8812a1ant_ActionBtInquiry(pBtCoexist);\n\t\t}\n\t\telse\n\t\t\thalbtc8812a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )\n\t{\n\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1); \n\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, TRUE, FALSE, 0x5);\n\t\telse\n\t\t{\n\t\t\tif (BTC_WIFI_BW_HT40==wifiBw)\n\t\t\t halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x10);\t\n\t\t\telse\n\t\t\t halbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\t\t\n\t\t}\n\n\t\thalbtc8812a1ant_SwMechanism(pBtCoexist, TRUE);\n\t\thalbtc8812a1ant_RunSwCoexistMechanism(pBtCoexist);  //just print debug message\n\t}\n\telse\n\t{\n\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); \n\n\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);\n\n\t\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\t\thalbtc8812a1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  BT Is Inquirying \\n\") );\t\t\n\t\thalbtc8812a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8812a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\t\n\tif(!bWifiConnected)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is non connected-idle !!!\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif(bScan || bLink || bRoam)\n\t\t{\n\t\t\t if (bScan)\t\n\t\t   \t\thalbtc8812a1ant_ActionWifiNotConnectedScan(pBtCoexist);\t\n\t\t\t else\n\t\t    \t\thalbtc8812a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\t\n\t\t}\n\t\telse\n\t\t\thalbtc8812a1ant_ActionWifiNotConnected(pBtCoexist);\n\t}\n\telse\t// wifi LPS/Busy\n\t{\n\t\thalbtc8812a1ant_ActionWifiConnected(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8812a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\n\t// sw all off\n\thalbtc8812a1ant_SwMechanism(pBtCoexist, FALSE);\n\t\n\t//halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\t//halbtc8812a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\tpCoexSta->popEventCnt = 0;\n}\n\nVOID\nhalbtc8812a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\t\n\t//ant sw control to BT\n\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, TRUE, FALSE);\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t// PTA parameter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffff);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, 0x55555555);\n\n\t// coex parameters\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\n\n\t// enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\t// enable PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\n\t// bt clock related\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4);\n\tu1Tmp |= BIT7;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4, u1Tmp);\n\n\t// bt clock related\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7);\n\tu1Tmp |= BIT1;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp);\n}\n\n//============================================================\n// work around function start with wa_halbtc8812a1ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8812a1ant_\n//============================================================\nVOID\nEXhalbtc8812a1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8812a1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8812a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8812a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\n\tpBtCoexist->bStopCoexDm = FALSE;\n}\n\nVOID\nEXhalbtc8812a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\n\tpBtCoexist->bStopCoexDm = FALSE;\n\t\n\thalbtc8812a1ant_InitCoexDm(pBtCoexist);\n\n\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n}\n\nVOID\nEXhalbtc8812a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte \t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Coex is STOPPED]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8812a1Ant, GLCoexVer8812a1Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\t\t\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\t\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8812A_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8812a1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t\t// Sw mechanism \n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %d \", \"DelBA/ BtCtrlAgg/ AggSize\", \\\n\t\t\t(pBtCoexist->btInfo.bRejectAggPkt? \"Yes\":\"No\"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? \"Yes\":\"No\"),\n\t\t\t\tpBtCoexist->btInfo.aggBufSize);\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\t\tpBtCoexist->btInfo.raMask);\n\t\tCL_PRINTF(cliBuf);\n\n\t\t// Fw mechanism \t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase);\n\t\tCL_PRINTF(cliBuf);\n\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Latest error condition(should be 0)\", \\\n\t\t\tpCoexDm->errorCondition);\n\t\tCL_PRINTF(cliBuf);\n\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d \", \"IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x778\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb3);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x900);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0xcb3/0xcb7/0x900\", \\\n\t\tu1Tmp[0], u1Tmp[1], u4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x40\", \\\n\t\tu1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(hp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(lp rx[31:16]/tx[15:0])\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n\t\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\n\nVOID\nEXhalbtc8812a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\n\tif(pBtCoexist->bManualControl ||\tpBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\t\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\n\t\thalbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8812a1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n\n\t\tpCoexSta->bUnderIps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tu1Byte u1Tmpa, u1Tmpb;\n\tu4Byte u4Tmp;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm )\n\t\treturn;\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\t\t\n\t}\t\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\treturn;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8812a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\t\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8812a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8812a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_SCAN_START == type)\n\t{\t\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiNotConnectedScan(pBtCoexist);\n\t\t}\n\t\telse\t// wifi is connected\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\t}\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t pCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t halbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\t halbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\n\t\t pCoexDm->nArpCnt = 0;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\t\n\t\t//pCoexDm->nArpCnt = 0;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8812a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8812a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8812a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\t\n\t\thalbtc8812a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(!bWifiConnected) // non-connected scan\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\n//to check registers...\nVOID\nEXhalbtc8812a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tdataLen=5;\n\tu1Byte\t\t\tbuf[6] = {0};\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tBOOLEAN\t\t\tbWifiUnderBMode = FALSE;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FORCE_EXEC, FALSE, FALSE);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n#if 0\n\t\t//Set CCK Tx/Rx high Pri except 11b mode\n\t\tif (bWifiUnderBMode)\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx\n\t\t}\n#endif\t\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t\tpCoexDm->nArpCnt = 0;\n\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\t//H2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[0] = 0x0;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\n\tbuf[0] = dataLen;\n\tbuf[1] = 0x5;\t\t\t\t// OP_Code\n\tbuf[2] = 0x3;\t\t\t\t// OP_Code_Length\n\tbuf[3] = H2C_Parameter[0]; \t// OP_Code_Content\n\tbuf[4] = H2C_Parameter[1];\n\tbuf[5] = H2C_Parameter[2];\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\n}\n\nVOID\nEXhalbtc8812a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif( BTC_PACKET_DHCP == type || \n\t\tBTC_PACKET_EAPOL == type ||\n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\tif(BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet ARP notify\\n\"));\t\t \n\n\t\t\tpCoexDm->nArpCnt++;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ARP Packet Count = %d\\n\", pCoexDm->nArpCnt));\n\t\t\t\n\t\t\tif(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet DHCP or EAPOL notify\\n\"));\t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet [Type = %d] notify\\n\", type));\n\t}\n\n\tpCoexSta->specialPktPeriodCnt = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8812a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8812a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8812a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8812a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8812a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( BTC_PACKET_DHCP == type ||\n\t\tBTC_PACKET_EAPOL == type || \n\t\t( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )\n\t{\n\t\thalbtc8812a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\t\tbtInfo=0;\n\tu1Byte\t\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\t\tbWifiConnected=FALSE;\n\tBOOLEAN\t\t\t\tbBtBusy=FALSE;\n\t\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8812A_1ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8812A_1ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8812A_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btRetryCnt >= 1)\n\t\t\tpCoexSta->popEventCnt++;\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtPage = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtPage = FALSE;\t\t\t\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2-90;\n\t\t\t//pCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif(!pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\n\t\t}\n\t\t\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif(pCoexSta->btInfoExt & BIT1)\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tif(pCoexSta->btInfoExt & BIT3)\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8812A_1ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8812A_1ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8812A_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8812A_1ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_1ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_1ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_1ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\n\thalbtc8812a1ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tbtInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\n\t\n\tif(!(btInfo&BT_INFO_8812A_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8812A_1ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8812A_1ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8812A_1ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8812A_1ANT_B_ACL_BUSY)\n\t{\n\t\tif(BT_8812A_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus)\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_1ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8812A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\tbBtBusy = TRUE;\n\telse\n\t\tbBtBusy = FALSE;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\thalbtc8812a1ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8812a1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp;\n\tu1Byte\tu1Tmpa,u1Tmpb, u1Tmpc;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF Status notify\\n\"));\n\n\tif(BTC_RF_ON == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned ON!!\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t}\n\telse if(BTC_RF_OFF == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RF is turned OFF!!\\n\"));\n\t\t\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\t\n\t\thalbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu4Byte\tu4Tmp;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8812a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\n\thalbtc8812a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\n\tEXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\tpBtCoexist->bStopCoexDm = TRUE;\t\n}\n\nVOID\nEXhalbtc8812a1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\n\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8812a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FORCE_EXEC, FALSE, TRUE);\n\t\thalbtc8812a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\thalbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8812a1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8812a1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], *****************Coex DM Reset*****************\\n\"));\n\n\thalbtc8812a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\thalbtc8812a1ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8812a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8812a1Ant, GLCoexVer8812a1Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8812A_1ANT == 0)\n\thalbtc8812a1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8812a1ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8812a1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8812a1ant_MonitorWiFiCtr(pBtCoexist);\n\n\tif( halbtc8812a1ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust )\n\t{\n\t\thalbtc8812a1ant_RunCoexistMechanism(pBtCoexist);\t\n\t}\n\n\tpCoexSta->specialPktPeriodCnt++;\n#endif\n}\n\nVOID\nEXhalbtc8812a1ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte\t\t\t\tpData\n\t)\n{\n\tswitch(opCode)\n\t{\n\t\tcase BTC_DBG_SET_COEX_NORMAL:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set CoexMode to Normal\\n\"));\n\t\t\tpBtCoexist->bManualControl = FALSE;\n\t\t\thalbtc8812a1ant_InitCoexDm(pBtCoexist);\n\t\t\tbreak;\n\t\tcase BTC_DBG_SET_COEX_WIFI_ONLY:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set CoexMode to Wifi Only\\n\"));\n\t\t\tpBtCoexist->bManualControl = TRUE;\n\t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\t\n\t\t\tbreak;\n\t\tcase BTC_DBG_SET_COEX_BT_ONLY:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set CoexMode to BT only\\n\"));\n\t\t\tpBtCoexist->bManualControl = TRUE;\n\t\t\thalbtc8812a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\t\n\t\t\tbreak;\n\t\tcase BTC_DBG_SET_COEX_DEC_BT_PWR:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set Dec BT power\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=4;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tu1Byte\tdecBtPwr=0, pwrLevel=0;\n\t\t\t\tif(opLen == 2)\n\t\t\t\t{\n\t\t\t\t\tdecBtPwr = pData[0];\n\t\t\t\t\tpwrLevel = pData[1];\n\t\t\t\t\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x3;\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x2;\t\t// OP_Code_Length\n\t\t\t\t\t\n\t\t\t\t\tbuf[3] = decBtPwr;\t// OP_Code_Content\n\t\t\t\t\tbuf[4] = pwrLevel;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set Dec BT power=%d, pwrLevel=%d\\n\", decBtPwr, pwrLevel));\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BTC_DBG_SET_COEX_BT_AFH_MAP:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT AFH Map\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=5;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tif(opLen == 3)\n\t\t\t\t{\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x5;\t\t\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x3;\t\t\t\t// OP_Code_Length\n\n\t\t\t\t\tbuf[3] = pData[0]; \t\t\t// OP_Code_Content\n\t\t\t\t\tbuf[4] = pData[1];\n\t\t\t\t\tbuf[5] = pData[2];\n\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT AFH Map = %02x %02x %02x\\n\", \n\t\t\t\t\t\tpData[0], pData[1], pData[2]));\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\n\t\tcase BTC_DBG_SET_COEX_BT_IGNORE_WLAN_ACT:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT Ignore Wlan Active\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=3;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tif(opLen == 1)\n\t\t\t\t{\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x1;\t\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x1;\t\t\t// OP_Code_Length\n\n\t\t\t\t\tbuf[3] = pData[0];\t\t// OP_Code_Content\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT Ignore Wlan Active = 0x%x\\n\", \n\t\t\t\t\t\tpData[0]));\n\t\t\t\t\t\t\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8812a1Ant.h",
    "content": "//===========================================\n// The following is for 8812A 1ANT BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8812A_1ANT\t\t\t\t1\n\n#define\tBT_INFO_8812A_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8812A_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8812A_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8812A_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8812A_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8812A_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8812A_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8812A_1ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8812A_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\tBTC_RSSI_COEX_THRESH_TOL_8812A_1ANT\t\t2\n\n#define  BT_8812A_1ANT_WIFI_NOISY_THRESH\t\t\t\t\t\t\t\t30   //max: 255\n\ntypedef enum _BT_INFO_SRC_8812A_1ANT{\n\tBT_INFO_SRC_8812A_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8812A_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8812A_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8812A_1ANT_MAX\n}BT_INFO_SRC_8812A_1ANT,*PBT_INFO_SRC_8812A_1ANT;\n\ntypedef enum _BT_8812A_1ANT_BT_STATUS{\n\tBT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8812A_1ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8812A_1ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8812A_1ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8812A_1ANT_BT_STATUS_MAX\n}BT_8812A_1ANT_BT_STATUS,*PBT_8812A_1ANT_BT_STATUS;\n\ntypedef enum _BT_8812A_1ANT_WIFI_STATUS{\n\tBT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE\t\t\t\t= 0x0,\n\tBT_8812A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN\t\t= 0x1,\n\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_SCAN\t\t\t\t\t= 0x2,\n\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT\t\t\t\t= 0x3,\n\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_IDLE\t\t\t\t\t= 0x4,\n\tBT_8812A_1ANT_WIFI_STATUS_CONNECTED_BUSY\t\t\t\t\t= 0x5,\n\tBT_8812A_1ANT_WIFI_STATUS_MAX\n}BT_8812A_1ANT_WIFI_STATUS,*PBT_8812A_1ANT_WIFI_STATUS;\n\ntypedef enum _BT_8812A_1ANT_COEX_ALGO{\n\tBT_8812A_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8812A_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8812A_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8812A_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8812A_1ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8812A_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8812A_1ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8812A_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8812A_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8812A_1ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8812A_1ANT_COEX_ALGO,*PBT_8812A_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8812A_1ANT{\n\t// hw setting\n\tu1Byte\t\tpreAntPosType;\n\tu1Byte\t\tcurAntPosType;\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n\tu4Byte\t\tnArpCnt;\n\n\tu1Byte\t\terrorCondition;\n} COEX_DM_8812A_1ANT, *PCOEX_DM_8812A_1ANT;\n\ntypedef struct _COEX_STA_8812A_1ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\tspecialPktPeriodCnt;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\ts1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8812A_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8812A_1ANT_MAX];\n\tu4Byte\t\t\t\t\tbtInfoQueryCnt;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtPage;\t\t\t\t//Add for win8.1 page out issue\n\tBOOLEAN\t\t\t\t\tbWiFiIsHighPriTask;\t\t//Add for win8.1 page out issue\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu4Byte\t\t\t\t\tpopEventCnt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\t\n\n\tBOOLEAN\t\t\t\t\tbCCKLock;\n\tBOOLEAN\t\t\t\t\tbPreCCKLock;\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n}COEX_STA_8812A_1ANT, *PCOEX_STA_8812A_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8812a1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8812a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8812a1ant_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8812a1ant_CoexDmReset(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a1ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte\t\t\t\tpData\n\t);\nVOID\nEXhalbtc8812a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8812a2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8812A Co-exist mechanism\n//\n// History\n// 2012/08/22 Cosa first check in.\n// 2012/11/14 Cosa Revise for 8812A 2Ant out sourcing.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8812a2Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8812A_2ANT\tGLCoexDm8812a2Ant;\nstatic PCOEX_DM_8812A_2ANT \tpCoexDm=&GLCoexDm8812a2Ant;\nstatic COEX_STA_8812A_2ANT\tGLCoexSta8812a2Ant;\nstatic PCOEX_STA_8812A_2ANT\tpCoexSta=&GLCoexSta8812a2Ant;\n\nconst char *const GLBtInfoSrc8812a2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8812a2Ant=20150408;\nu4Byte\tGLCoexVer8812a2Ant=0x39;\n//improve 8761ATV D-cut BT off/on fail issue\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8812a2ant_\n//============================================================\nu1Byte\nhalbtc8812a2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8812a2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8812a2ant_SetEnablePTA(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN \t\tbEnablePTA\n\t)\n{\n\tif(bEnablePTA)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PTA is enable!\\n\"));\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PTA is disable!\\n\"));\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x00);\n\n\t}\n}\n\nVOID\nhalbtc8812a2ant_EnablePTA(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE (COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Enable PTA %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurEnablePTA = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bPreEnablePTA = %d, bCurEnablePTA = %d!!\\n\", \n\t\t\tpCoexDm->bPreEnablePTA, pCoexDm->bCurEnablePTA));\n\n\t\tif(pCoexDm->bPreEnablePTA == pCoexDm->bCurEnablePTA)\n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetEnablePTA(pBtCoexist, bEnable);\n\n\n\tpCoexDm->bPreEnablePTA = pCoexDm->bCurEnablePTA;\n}\n\nVOID\nhalbtc8812a2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\tpStackInfo=&pBtCoexist->stackInfo;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\t// only 8812a need to consider if core stack is installed.\n\tif(!pStackInfo->hciVersion)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n/*\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n*/\n\n\tif((pCoexSta->prebtInfoC2hCnt_BT_RSP == pCoexSta->btInfoC2hCnt[1]) &&\n\t\t(pCoexSta->prebtInfoC2hCnt_BT_SEND == pCoexSta->btInfoC2hCnt[2]))\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\t\n\tpCoexSta->prebtInfoC2hCnt_BT_RSP = pCoexSta->btInfoC2hCnt[1];\n\tpCoexSta->prebtInfoC2hCnt_BT_SEND = pCoexSta->btInfoC2hCnt[2];\n\t\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt is detected as disabled %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(pCoexSta->preBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(pCoexSta->preBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tpCoexSta->preBtDisabled = bBtDisabled;\n\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t\t// enable PTA\n//\t\t\thalbtc8812a2ant_EnablePTA(pBtCoexist,FORCE_EXEC, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// disable PTA\n//\t\t\thalbtc8812a2ant_EnablePTA(pBtCoexist,FORCE_EXEC, FALSE);\n\t\t}\n\t}\n}\n\nu4Byte\nhalbtc8812a2ant_DecideRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\traMaskType\n\t)\n{\n\tu4Byte\tdisRaMask=0x0;\n\t\n\tswitch(raMaskType)\n\t{\n\t\tcase 0: // normal mode\n\t\t\tdisRaMask = 0x0;\n\t\t\tbreak;\n\t\tcase 1: // disable cck 1/2\n\t\t\tdisRaMask = 0x00000003;\n\t\t\tbreak;\n\t\tcase 2: // disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\t\t\t\n\t\t\tdisRaMask = 0x0001f1f7;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn disRaMask;\n}\n\nVOID\nhalbtc8812a2ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8812a2ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8812a2ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8812a2ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8812a2ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tu4Byte\tdisRaMask=0x0;\n\n\tpCoexDm->curRaMaskType = raMaskType;\n\tdisRaMask = halbtc8812a2ant_DecideRaMask(pBtCoexist, raMaskType);\n\thalbtc8812a2ant_UpdateRaMask(pBtCoexist, bForceExec, disRaMask);\n\n\thalbtc8812a2ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8812a2ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8812a2ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8812a2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8812a2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8812a2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tu1Byte\tdataLen=3;\n\tu1Byte\tbuf[5] = {0};\n//8812a watch btifo to check BT enable/disable\n//\tif(!pBtCoexist->btInfo.bBtDisabled)\n\t{\n\t\tif(!pCoexSta->btInfoQueryCnt ||\n\t\t\t(pCoexSta->btInfoC2hCnt[BT_INFO_SRC_8812A_2ANT_BT_RSP]-pCoexSta->btInfoQueryCnt)>2)\n\t\t{\n\t\t\tbuf[0] = dataLen;\n\t\t\tbuf[1] = 0x1;\t// polling enable, 1=enable, 0=disable\n\t\t\tbuf[2] = 0x2;\t// polling time in seconds\n\t\t\tbuf[3] = 0x1;\t// auto report enable, 1=enable, 0=disable\n\t\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_INFO, (PVOID)&buf[0]);\n\t\t}\n\t}\n\tpCoexSta->btInfoQueryCnt++;\n}\n\nBOOLEAN\nhalbtc8812a2ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN\tbWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8812a2ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n#if 1//(BT_AUTO_REPORT_ONLY_8812A_2ANT == 1)\t// profile from bt patch\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\tpBtLinkInfo->bAclBusy = pCoexSta->bAclBusy;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n#else\t// profile from bt stack\n\tpBtLinkInfo->bBtLinkExist = pStackInfo->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pStackInfo->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pStackInfo->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pStackInfo->bPanExist;\n\tpBtLinkInfo->bHidExist = pStackInfo->bHidExist;\n\n\t//for win-8 stack HID report error\n\tif(!pStackInfo->bHidExist)\n\t\tpStackInfo->bHidExist = pCoexSta->bHidExist;  //sync  BTInfo with BT firmware and stack\n\t// when stack HID report error, here we use the info from bt fw.\n\tif(!pStackInfo->bBtLinkExist)\n\t\tpStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\t\n#endif\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8812a2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8812A_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 0)\n\t{\n\t\tif(pBtLinkInfo->bAclBusy)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ACL Busy only\\n\"));\n\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR;\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm =  BT_8812A_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8812A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8812a2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8812a2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tu1Byte\tdataLen=4;\n\tu1Byte\tbuf[6] = {0};\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power level = %d\\n\", \n\t\tdecBtPwrLvl));\n\n\tbuf[0] = dataLen;\n\tbuf[1] = 0x3;\t\t// OP_Code\n\tbuf[2] = 0x2;\t\t// OP_Code_Length\n\tif(decBtPwrLvl)\n\t\tbuf[3] = 0x1;\t// OP_Code_Content\n\telse\n\t\tbuf[3] = 0x0;\n\tbuf[4] = decBtPwrLvl;// pwrLevel\n\t\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\n}\n\nVOID\nhalbtc8812a2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tdecBtPwrLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), decBtPwrLvl));\n\tpCoexDm->curBtDecPwrLvl = decBtPwrLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) \n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\n\n\tpCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\n}\n\nVOID\nhalbtc8812a2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8812a2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8812a2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8812a2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\ttmpU1;\n\n\ttmpU1 = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4fd);\n\ttmpU1 |= BIT0;\n\tif(bLowPenaltyRa)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set low penalty!!\\n\"));\n\t\ttmpU1 &= ~BIT2;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Tx rate adaptive, set normal!!\\n\"));\n\t\ttmpU1 |= BIT2;\n\t}\n\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4fd, tmpU1);\n}\n\nVOID\nhalbtc8812a2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\treturn;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8812a2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);\n}\n\nVOID\nhalbtc8812a2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8812a2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8812a2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8812a2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8812a2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8812a2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);\n\t}\n}\n\nVOID\nhalbtc8812a2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8812a2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x28F4B);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x10AB2);\n\t\trssiAdjustVal = 8;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\nVOID\nhalbtc8812a2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8812a2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8812a2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8812a2ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5ffb5ffb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0xdfffdfff, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x5ddd5ddd, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tif(pCoexSta->nScanAPNum <= 5)\n\t\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xfafafafa, 0xffffff, 0x3);\n\t\t\telse\n\t\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8812a2ant_CoexTable(pBtCoexist, bForceExec, 0x5f5f5f5f, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8812a2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\tdataLen=3;\n\tu1Byte\tbuf[5] = {0};\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Ignore Wlan_Act\\n\",\n\t\t(bEnable? \"Enable\":\"Disable\")));\n\n\tbuf[0] = dataLen;\n\tbuf[1] = 0x1;\t\t\t// OP_Code\n\tbuf[2] = 0x1;\t\t\t// OP_Code_Length\n\tif(bEnable)\n\t\tbuf[3] = 0x1; \t\t// OP_Code_Content\n\telse\n\t\tbuf[3] = 0x0;\n\t\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\n}\n\nVOID\nhalbtc8812a2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8812a2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8812a2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8812a2ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8812a2ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8812a2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8812a2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\t/*\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t*/\n\t \t\n\t halbtc8812a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\t//halbtc8812a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8812a2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\t//halbtc8812a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\thalbtc8812a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\thalbtc8812a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8812a2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tu1Byte\t\t\tu1Tmp=0;\n\t\n\tif(bInitHwCfg)\n\t{\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x900, 0x00000400);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76d, 0x1);\n\t}\n\telse if(bWifiOff)\n\t{\n\n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_WIFI_AT_CPL_MAIN:\n\t\t\tbreak;\n\t\tcase BTC_ANT_WIFI_AT_CPL_AUX:\n\t\t\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\t\t\tu1Tmp &= ~BIT3;\n\t\t\tu1Tmp |= BIT2;\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb7, u1Tmp);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8812a2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\ts1Byte\t\t\tnWiFiDurationAdjust = 0x0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif(!bForceExec)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\\n\", \n\t\t\tpCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], prePsTdma = %d, curPsTdma = %d!!\\n\", \n\t\t\tpCoexDm->prePsTdma, pCoexDm->curPsTdma));\n\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\n\tif  (pCoexSta->nScanAPNum >= 40)\n\t \tnWiFiDurationAdjust = -15;\t\n\telse if  (pCoexSta->nScanAPNum >= 20)\n\t \tnWiFiDurationAdjust = -10;\t\n\n/*\t\n\tif (!pCoexSta->bForceLpsOn)  //only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30\n\t{\n\t\tpsTdmaByte0Val = 0x61;  //no null-pkt\n\t\tpsTdmaByte3Val = 0x11; // no tx-pause at BT-slot\n\t\tpsTdmaByte4Val = 0x10; // 0x778 = d/1 toggle\n\t}\n\n\t\n\tif (  (type == 3) || (type == 13) || (type == 14) )\n\t{\n\t\tpsTdmaByte4Val = psTdmaByte4Val & 0xbf;  //no dynamic slot for multi-profile\n\t\n\t\tif (!bWifiBusy)\n\t\t psTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t}\n\t\n\tif (pBtLinkInfo->bSlaveRole == TRUE)\n\t\tpsTdmaByte4Val = psTdmaByte4Val | 0x1;  //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)\n\t\n*/\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\t//d1,wb\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 5:\t\t//d1,pb,TXpause\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x63, 0x3c, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x63, 0x32, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x63, 0x28, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x63, 0x1e, 0x03, 0x90, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\t//d1,bb\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 13:\t//d1,bb,TXpause\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x32, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x28, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 22:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x61, 0x1a, 0x1a, 0x21, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\t\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x03, 0x31, 0x10);\n\t\t\t\tbreak;\n\n\t\t\tcase 71:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\tbreak;\n\n\t\t\t// following cases is for wifi rssi low, started from 81\n\t\t\tcase 80:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3c, 0x3, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 81:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x3a+nWiFiDurationAdjust, 0x3, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 82:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x30+nWiFiDurationAdjust, 0x03, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 83:\n\t   \t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x21, 0x03, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 84:\n\t   \t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x15, 0x3, 0x90, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 85:\n\t   \t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x1d, 0x1d, 0x80, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 86:\n\t   \t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x53, 0x15, 0x15, 0x80, 0x50);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 0: //ANT2PTA, 0x778=0x1\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1: //ANT2BT, 0x778=3\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0);\t\t\t\t\n\t\t\t\tdelay_ms(5);\n\t\t\t\thalbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8812a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8812a2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8812a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\n\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8812a2ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8812a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8812a2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8812a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nBOOLEAN\nhalbtc8812a2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8812a2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn TRUE;\n\t}\n\n\tif(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist)\n\t{\n\t\thalbtc8812a2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 0, 0, 0);\n\t}\n\telse\n\t{\n\t\thalbtc8812a2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t}\n\n\tif(!bWifiConnected)\n\t{\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-connected idle!!\\n\"));\n\n\t\tif( (BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ||\n\t\t\t(BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\t\t\t\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\n\t\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n \t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif(BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\t\t\n\t\t\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse if(BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tif(bBtHsOn)\n\t\t\t\treturn FALSE;\n\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); \n\t\t\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(bWifiBusy)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t\t\tbCommon = FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\n\t\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\t\t\t\n\t\t\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 17);\n\n\t\t\t\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t\t\tbCommon = TRUE;\n\t\t\t}\n\t\t}\t\n\t}\n\n\treturn bCommon;\n}\n\nVOID\nhalbtc8812a2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n                                if(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\n//==================\n// pstdma for wifi rssi low\n//==================\nVOID\nhalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist//,\n\t//IN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], halbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow()\\n\"));\n#if 0\n\tif( (BT_8812A_2ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8812A_2ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8812A_2ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 81 &&\n\t\t\tpCoexDm->curPsTdma != 82 &&\n\t\t\tpCoexDm->curPsTdma != 83 &&\n\t\t\tpCoexDm->curPsTdma != 84 )\n\t\t{\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n#endif\n\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\n\tretryCount = pCoexSta->btRetryCnt;\n\tbtInfoExt = pCoexSta->btInfoExt;\n\n\tif(!pCoexDm->bAutoTdmaAdjustLowRssi)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjustForWifiRssiLow()!!\\n\"));\n\n\t\tif(BT_INFO_8812A_2ANT_A2DP_BASIC_RATE(btInfoExt))\n\t\t{\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t}\n\t\telse\n\t\t{\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n//\t\tretryCount = pCoexSta->btRetryCnt;\n//\t\tbtInfoExt = pCoexSta->btInfoExt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif ( (pCoexSta->lowPriorityTx) > 1050 ||  (pCoexSta->lowPriorityRx) > 1250 )\n\t\t\tretryCount++;\t\n\t\t\t\t\n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n/*\n\t\t\tif( (BT_INFO_8812A_2ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) )\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 84;\n\t\t\t}\n*/\n\t\t\tif(pCoexDm->curPsTdma == 80)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 81)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 82)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 83)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 84);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 84;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n/*\n\t\t\tif( (BT_INFO_8812A_2ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 81) ||(pCoexDm->curPsTdma == 82)) )\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n*/\n\t\t\tif(pCoexDm->curPsTdma == 84)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 83);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 83;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 83)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 82);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 82;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 82)\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 81;\n\t\t\t}\n\t\t\telse if((pCoexDm->curPsTdma == 81)&&((pCoexSta->nScanAPNum <= 5)))\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 81);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 81;\n\t\t        }\n                }\n\n\t\tif( pCoexDm->curPsTdma != 80 &&\n                        pCoexDm->curPsTdma != 81 &&\n\t\t\tpCoexDm->curPsTdma != 82 &&\n\t\t\tpCoexDm->curPsTdma != 83 &&\n\t\t\tpCoexDm->curPsTdma != 84 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_GetBtRssiThreshold(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\t\tpThres0,\n\tIN\tpu1Byte\t\t\t\tpThres1\n\t)\n{\n\tu1Byte antType, btThreshold=0;\n\t\n//\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_ANT_TYPE, &antType);\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n        antType = pBoardInfo->antType;\n\n\n\tswitch(antType)\n\t{\n\t\tcase BTC_ANT_TYPE_0:\n\t\t\t*pThres0 = 100;\n\t\t\t*pThres1 = 100;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_1:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_2:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_3:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tcase BTC_ANT_TYPE_4:\n\t\t\t*pThres0 = 34;\n\t\t\t*pThres1 = 42;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\n\nVOID\nhalbtc8812a2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\n\t// pstdma\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\telse\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionScoHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\n\t// pstdma\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\telse\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\t\t\n\n\t// decrease BT power\t\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x6);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tanttype=0;\n\tBOOLEAN \tbApEnable=FALSE;\n\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\t\n    anttype = pBoardInfo->antType;\n\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\n\tif(anttype == 0)//ANTTYPE = 0   92E 2ant with SPDT\n\t{\n\t\t// power save state & pstdma & coex table\n       \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n       \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 9);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8812a2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tanttype=0;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\t\n    anttype = pBoardInfo->antType;\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\t\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n//\tanttype = 4;\n\n\tif(anttype == 0)//ANTTYPE = 0   92E 2ant with SPDT\n\t{\n\n\t\tif((pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)))\n\t\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t\t}\n\t\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t\t{\n\t\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t\t}\n\t\t}\n\n\t\t// power save state & pstdma & coex table\n/*\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n*/\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\t//shielding room\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// decrease BT power\n/*\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A)  // BT HIGH RSSI & shielding room\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\t\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n \t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\t\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\n\t// pstdma\t\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 2);\t\t\n\telse\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n \t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x6);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\tBOOLEAN\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\telse\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\t\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(HS) only\nVOID\nhalbtc8812a2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\n\t// pstdma\n\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8812a2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\t\n\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\telse\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n\t}\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\t\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\telse\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 85);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\tif(BTC_RSSI_HIGH(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse if(BTC_RSSI_LOW(wifiRssiState) &&  (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8812a2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\tif((bApEnable == TRUE) || (BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState))))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\telse\n\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\telse\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\thalbtc8812a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 86);\n\t}\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n/*\t\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionHidA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0;\n\n\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\t\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\t// power save state\n\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// coex table\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\telse\n\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// pstdma\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\t\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\telse\n\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\tif(BTC_RSSI_HIGH(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse if(BTC_RSSI_LOW(wifiRssiState) && (!BTC_RSSI_LOW(btRssiState)))\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\telse\n\t\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState=BTC_RSSI_STATE_HIGH, btRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tbtThresh0=0, btThresh1=0, anttype=0;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\t\n    anttype = pBoardInfo->antType;\n\n\n//\thalbtc8812a2ant_GetBtRssiThreshold(pBtCoexist, &btThresh0, &btThresh1);\n//\tbtRssiState = halbtc8812a2ant_BtRssiState(3, btThresh0, btThresh1);\n\n\twifiRssiState = halbtc8812a2ant_WifiRssiState(pBtCoexist, 0, 2, 34, 0);\n\tbtRssiState = halbtc8812a2ant_BtRssiState(3, 34, 42);\n\n\tif(anttype == 0)//ANTTYPE = 0\t92E 2ant with SPDT\n\t{\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 1) //92E 2ant with coupler and bad ant. isolation, 92E 3ant with bad ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 2)//ANTTYPE = 2, 92E 2ant with coupler and normal/good ant. isolation, 92E 3ant with normal ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\t\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n        {\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n        }\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, TRUE, 83);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\t}\n\t}\n\telse if(anttype == 3)\t//ANTTYPE = 3,  92E 3ant with good ant. isolation\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n        \tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;   \n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\t\thalbtc8812a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t}\n\t}\n\telse\t//ANTTYPE = 4 for test\n\t{\t\t\n\t\t// power save state & pstdma & coex table\n\t\tif(BTC_RSSI_HIGH(wifiRssiState) &&\t(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & shielding room\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse if (BTC_RSSI_HIGH(wifiRssiState)&&(!BTC_RSSI_LOW(btRssiState)) && (pCoexSta->nScanAPNum > NOISY_AP_NUM_THRESH_8812A))\n\t\t{\t//WIFI RSSI = high & BT RSSI = high & noisy enviroment\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t\telse\t//WIFI RSSI || BT RSSI == low\n\t\t{\n\t\t\thalbtc8812a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t\t\thalbtc8812a2ant_TdmaDurationAdjustForWifiRssiLow(pBtCoexist);\n\t\t\thalbtc8812a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t}\n\t}\n\n\t// decrease BT power\n\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n/*\n\t// decrease BT power\n\tif(BTC_RSSI_LOW(btRssiState))\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\telse if(BTC_RSSI_MEDIUM(btRssiState)) \n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n        else if (pCoexSta->nScanAPNum < NOISY_AP_NUM_THRESH_8812A)  // BT HIGH RSSI & shielding room\n\t\thalbtc8812a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n*/\n\t// limited Rx\n\thalbtc8812a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\t// fw dac swing level\n\thalbtc8812a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BTC_RSSI_HIGH(wifiRssiState))\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8812a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8812a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8812a2ant_CoexUnder5G(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8812a2ant_CoexAllOff(pBtCoexist);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Under 5G, force set BT to ignore Wlan active!!\\n\"));\n\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\n}\n//====================================================\nVOID\nhalbtc8812a2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE, bBtHsOn=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\tif(bWifiUnder5G)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\\n\"));\n\t\thalbtc8812a2ant_CoexUnder5G(pBtCoexist);\n\t\treturn;\n\t}\n\n\n\talgorithm = halbtc8812a2ant_ActionAlgorithm(pBtCoexist);\n\tif(pCoexSta->bC2hBtInquiryPage && (BT_8812A_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8812a2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpCoexDm->curAlgorithm = algorithm;\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\tif(halbtc8812a2ant_IsCommonAction(pBtCoexist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t}\n\telse\n\t{\n\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t\tpCoexDm->bAutoTdmaAdjustLowRssi = FALSE;\n\t\t}\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_SCO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO+HID.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionScoHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionHidA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8812A_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8812a2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\thalbtc8812a2ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n\t\n}\n\nVOID\nhalbtc8812a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\tif(bBackUp)\n\t{\n\t\t// backup rf 0x1e value\n\t\tpCoexDm->btRf0x1eBackup = \n\t\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\t\n\t//ant sw control to BT\n\thalbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, TRUE, FALSE);\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t// PTA parameter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffff);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555);\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, 0x55555555);\n\n\t// coex parameters\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);\n\n\t// enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\t// disable PTA to avoid BT insn't on\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x00);\n\n\t// bt clock related\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4);\n\tu1Tmp |= BIT7;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4, u1Tmp);\n\n\t// bt clock related\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7);\n\tu1Tmp |= BIT1;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp);\n}\n\n//============================================================\n// work around function start with wa_halbtc8812a2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8812a2ant_\n//============================================================\nVOID\nEXhalbtc8812a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\t\n\nVOID\nEXhalbtc8812a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8812a2ant_InitHwConfig(pBtCoexist, TRUE);\n}\n\nVOID\nEXhalbtc8812a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8812a2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8812a2ant_BTOffOnNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tBTstatus \n\t)\n{\n\tu1Byte u1Tmp=0;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BToff/on notify\\n\"));\n\tDBG_871X(\"%s, BTstatus:%d\", __func__, BTstatus);\n\n\tif(BTC_BT_OFF == BTstatus)\n\t{\n    \t\t//PTA off\n\t\tpBtCoexist->btInfo.bBtDisabled = TRUE;\n\t\thalbtc8812a2ant_EnablePTA(pBtCoexist,FORCE_EXEC, FALSE);\n\n\t}\n\telse\n\t{\n\t\t//PTA on\n\t\tpBtCoexist->btInfo.bBtDisabled = FALSE;\n\t\thalbtc8812a2ant_EnablePTA(pBtCoexist,FORCE_EXEC, TRUE);\n\t}\n\n}\n\n\n\nVOID\nEXhalbtc8812a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu2Byte\t\t\t\tu2Tmp[4];\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Antenna type:\", \\\n\t\tpBoardInfo->antType);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8812a2Ant, GLCoexVer8812a2Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8812A_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8812a2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\tpBtCoexist->btInfo.raMask);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\t\n\tpsTdmaCase = pCoexDm->curPsTdma;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d/%d)\", \"PS TDMA\", \\\n\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\tpCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust, pCoexDm->bAutoTdmaAdjustLowRssi);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\tpCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"backup ARFR1/ARFR2/RL/AMaxTime\", \\\n\t\tpCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\tu2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"0x430/0x434/0x42a/0x456\", \\\n\t\tu4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x \", \"0x778 (W_Act)/ 0x6cc (CoTab Sel)\", \\\n\t\tu1Tmp[0], u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x8db(ADC)/0xc5b[29:25](DAC)\", \\\n\t\t((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1));\n\tCL_PRINTF(cliBuf); \n\t\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb3);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xcb7);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xcb3/ 0xcb7\", \\\n\t\tu1Tmp[0], u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x40/ 0x4c[24:23]/ 0x974\", \\\n\t\tu1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(DIG)/0xa0a(CCK-TH)\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xf48/ 0xa5b (FA cnt-- OFDM : CCK)\", \\\n\t\tu4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1]  );\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8812A_2ANT == 1)\n\thalbtc8812a2ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8812a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnder5G=FALSE;\n\t\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8812a2ant_CoexAllOff(pBtCoexist);\n\t\thalbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, TRUE);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS notify, force set BT to ignore Wlan active!!\\n\"));\n\t\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\tEXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\t\tif(!bWifiUnder5G)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS notify, force set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8812a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8812a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);\n\t}\n}\n\nVOID\nEXhalbtc8812a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8812a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tdataLen=5;\n\tu1Byte\t\t\tbuf[6] = {0};\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tbuf[0] = dataLen;\n\tbuf[1] = 0x5;\t\t\t\t// OP_Code\n\tbuf[2] = 0x3;\t\t\t\t// OP_Code_Length\n\tbuf[3] = H2C_Parameter[0]; \t// OP_Code_Content\n\tbuf[4] = H2C_Parameter[1];\n\tbuf[5] = H2C_Parameter[2];\n\t\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\t\n}\n\nVOID\nEXhalbtc8812a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n\n}\n\nVOID\nEXhalbtc8812a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n    \n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8812A_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8812A_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8812A_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\n\t\tif( (pCoexSta->btInfoExt&BIT3) && !bWifiUnder5G)\n\t\t{\n\t\t\t// BT already ignored WlanAct\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tif(!pCoexSta->bUnderIps)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\t\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\n\t\t\tif(pCoexSta->bUnderIps)\n\t\t\t{\n\t\t\t\t// work around for 8812a combo hw bug => when IPS, wlanAct is always high.\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS, set BT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8812A_2ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\t\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8812A_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t\tpCoexSta->bAclBusy = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8812A_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t\tif(btInfo & BT_INFO_8812A_2ANT_B_ACL_BUSY)\n\t\t\tpCoexSta->bAclBusy = TRUE;\n\t\telse\n\t\t\tpCoexSta->bAclBusy = FALSE;\t\t\t\n\t\t\n\t}\n\n\thalbtc8812a2ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tif(!(btInfo&BT_INFO_8812A_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8812A_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8812A_2ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8812A_2ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8812A_2ANT_B_ACL_BUSY)\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8812A_2ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8812A_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8812A_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbBtBusy = TRUE;\n\t\tif(!bWifiUnder5G)\n\t\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8812a2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8812a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu1Byte u1Tmp=0;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8812a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_CPL_AUX, FALSE, TRUE);\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify, force set BT to ignore Wlan active!!\\n\"));\n\thalbtc8812a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\tEXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\t// 0x522=0xff, pause tx\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x522, 0xff);\n\t// 0x40[7:6]=2'b01, modify BT mode.\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0xc0, 0x2);\n\t//PTA off.\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x0);\n\n}\n\nVOID\nEXhalbtc8812a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8812a2Ant, GLCoexVer8812a2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8812A_2ANT == 0)\n\thalbtc8812a2ant_QueryBtInfo(pBtCoexist);\n\thalbtc8812a2ant_MonitorBtCtr(pBtCoexist);\n//\thalbtc8812a2ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\tif( halbtc8812a2ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust ||\n\t\tpCoexDm->bAutoTdmaAdjustLowRssi)\n\t{\n\t\thalbtc8812a2ant_RunCoexistMechanism(pBtCoexist);\n\t}\n#endif\n}\n\nVOID\nEXhalbtc8812a2ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte\t\t\t\tpData\n\t)\n{\n\tswitch(opCode)\n\t{\n\t\tcase BTC_DBG_SET_COEX_DEC_BT_PWR:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set Dec BT power\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=4;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tu1Byte\tdecBtPwr=0, pwrLevel=0;\n\t\t\t\tif(opLen == 2)\n\t\t\t\t{\n\t\t\t\t\tdecBtPwr = pData[0];\n\t\t\t\t\tpwrLevel = pData[1];\n\t\t\t\t\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x3;\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x2;\t\t// OP_Code_Length\n\t\t\t\t\t\n\t\t\t\t\tbuf[3] = decBtPwr;\t// OP_Code_Content\n\t\t\t\t\tbuf[4] = pwrLevel;\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set Dec BT power=%d, pwrLevel=%d\\n\", decBtPwr, pwrLevel));\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase BTC_DBG_SET_COEX_BT_AFH_MAP:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT AFH Map\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=5;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tif(opLen == 3)\n\t\t\t\t{\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x5;\t\t\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x3;\t\t\t\t// OP_Code_Length\n\t\t\n\t\t\t\t\tbuf[3] = pData[0];\t\t\t// OP_Code_Content\n\t\t\t\t\tbuf[4] = pData[1];\n\t\t\t\t\tbuf[5] = pData[2];\n\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT AFH Map = %02x %02x %02x\\n\", \n\t\t\t\t\t\tpData[0], pData[1], pData[2]));\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\n\t\tcase BTC_DBG_SET_COEX_BT_IGNORE_WLAN_ACT:\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT Ignore Wlan Active\\n\"));\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=3;\n\t\t\t\tu1Byte\tbuf[6] = {0};\n\t\t\t\tif(opLen == 1)\n\t\t\t\t{\n\t\t\t\t\tbuf[0] = dataLen;\n\t\t\t\t\tbuf[1] = 0x1;\t\t\t// OP_Code\n\t\t\t\t\tbuf[2] = 0x1;\t\t\t// OP_Code_Length\n\t\t\n\t\t\t\t\tbuf[3] = pData[0];\t\t// OP_Code_Content\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set BT Ignore Wlan Active = 0x%x\\n\", \n\t\t\t\t\t\tpData[0]));\n\t\t\t\t\t\t\n\t\t\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8812a2Ant.h",
    "content": "//===========================================\n// The following is for 8812A 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8812A_2ANT\t\t\t\t0\n\n#define\tBT_INFO_8812A_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8812A_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8812A_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8812A_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8812A_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8812A_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8812A_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8812A_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8812A_2ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8812A_2ANT\t\t2\n#define \tNOISY_AP_NUM_THRESH_8812A\t\t\t\t\t\t50\n\n\ntypedef enum _BT_INFO_SRC_8812A_2ANT{\n\tBT_INFO_SRC_8812A_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8812A_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8812A_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8812A_2ANT_MAX\n}BT_INFO_SRC_8812A_2ANT,*PBT_INFO_SRC_8812A_2ANT;\n\ntypedef enum _BT_8812A_2ANT_BT_STATUS{\n\tBT_8812A_2ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8812A_2ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8812A_2ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8812A_2ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8812A_2ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8812A_2ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8812A_2ANT_BT_STATUS_MAX\n}BT_8812A_2ANT_BT_STATUS,*PBT_8812A_2ANT_BT_STATUS;\n\ntypedef enum _BT_8812A_2ANT_COEX_ALGO{\n\tBT_8812A_2ANT_COEX_ALGO_UNDEFINED\t\t= 0x0,\n\tBT_8812A_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8812A_2ANT_COEX_ALGO_SCO_HID \t\t= 0x2,\n\tBT_8812A_2ANT_COEX_ALGO_HID\t\t\t\t= 0x3,\n\tBT_8812A_2ANT_COEX_ALGO_A2DP\t\t\t= 0x4,\n\tBT_8812A_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x5,\n\tBT_8812A_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x6,\n\tBT_8812A_2ANT_COEX_ALGO_PANHS\t\t\t= 0x7,\n\tBT_8812A_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x8,\n\tBT_8812A_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x9,\n\tBT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0xa,\n\tBT_8812A_2ANT_COEX_ALGO_HID_A2DP_PANHS\t= 0xb,\n\tBT_8812A_2ANT_COEX_ALGO_HID_A2DP\t\t= 0xc,\n\tBT_8812A_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xd\n}BT_8812A_2ANT_COEX_ALGO,*PBT_8812A_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8812A_2ANT{\n\t// fw mechanism\n\tu1Byte\t\tpreBtDecPwrLvl;\n\tu1Byte\t\tcurBtDecPwrLvl;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjustLowRssi;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\tBOOLEAN\t\tbPreEnablePTA;\n\tBOOLEAN\t\tbCurEnablePTA;\n\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tcurRaMaskType;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n} COEX_DM_8812A_2ANT, *PCOEX_DM_8812A_2ANT;\n\ntypedef struct _COEX_STA_8812A_2ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\tBOOLEAN\t\t\t\t\tbAclBusy;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreBtDisabled;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8812A_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8812A_2ANT_MAX];\n\tu4Byte\t\t\t\t\tprebtInfoC2hCnt_BT_RSP;\n\tu4Byte\t\t\t\t\tprebtInfoC2hCnt_BT_SEND;\n\tu4Byte\t\t\t\t\tbtInfoQueryCnt;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\tu1Byte\t\t\t\t\tnScanAPNum;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\n\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\n\tu1Byte\t\t\t\t\tdisVerInfoCnt;\n\n}COEX_STA_8812A_2ANT, *PCOEX_STA_8812A_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8812a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8812a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8812a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8812a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8812a2ant_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte \t\t\tpData\n\t);\nVOID\nEXhalbtc8812a2ant_BTOffOnNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tBTstatus \n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8821a1Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 8821A_1ANT Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8821a1Ant.tmh\"\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8821A_1ANT\t\tGLCoexDm8821a1Ant;\nstatic PCOEX_DM_8821A_1ANT \tpCoexDm=&GLCoexDm8821a1Ant;\nstatic COEX_STA_8821A_1ANT\t\tGLCoexSta8821a1Ant;\nstatic PCOEX_STA_8821A_1ANT\tpCoexSta=&GLCoexSta8821a1Ant;\n\nconst char *const GLBtInfoSrc8821a1Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8821a1Ant=20140306;\nu4Byte\tGLCoexVer8821a1Ant=0x4b;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8821a1ant_\n//============================================================\nu1Byte\nhalbtc8821a1ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8821a1ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8821a1ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8821a1ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8821a1ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8821a1ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8821a1ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8821a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8821a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8821a1ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8821a1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8821a1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8821a1ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n}\n\nVOID\nhalbtc8821a1ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n\n\n}\n\nVOID\nhalbtc8821a1ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp, u4Tmp1;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp, u1Tmp1;\n\ts4Byte\t\t\twifiRssi;\n#if 0\n       //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS\n\tif (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) ) \n\t{\n\t\tpCoexSta->highPriorityTx = 65535;\n\t\tpCoexSta->highPriorityRx = 65535;\n\t\tpCoexSta->lowPriorityTx = 65535;\n\t\tpCoexSta->lowPriorityRx = 65535;\n\t\treturn;\n\t}\n#endif\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8821a1ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nBOOLEAN\nhalbtc8821a1ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN bWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN bWifiConnected=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8821a1ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8821a1ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8821A_1ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO only\\n\"));\n\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID only\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8821a1ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8821a1ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8821a1ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8821a1ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\") ));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a1ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8821a1ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8821a1ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8821a1ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8821a1ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8821a1ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** CoexTable(%d) **********\\n\", type));\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821a1ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a1ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8821a1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8821a1ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\tu1Byte\t\t\trealByte1=byte1, realByte5=byte5;\n\tBOOLEAN\t\t\tbApEnable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\n\tif(bApEnable)\n\t{\n\t\tif(byte1&BIT4 && !(byte1&BIT5))\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW for 1Ant AP mode\\n\"));\n\t\t\trealByte1 &= ~BIT4;\n\t\t\trealByte1 |= BIT5;\n\n\t\t\trealByte5 |= BIT5;\n\t\t\trealByte5 &= ~BIT6;\n\t\t}\n\t}\n\n\tH2C_Parameter[0] = realByte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = realByte5;\n\n\tpCoexDm->psTdmaPara[0] = realByte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = realByte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a1ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8821a1ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8821a1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8821a1ant_SwMechanism(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN \tbLowPenaltyRA\n\t) \n{\n\thalbtc8821a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8821a1ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\tfwVer=0, u4Tmp=0;\n\tu1Byte\t\t\tH2C_Parameter[2] ={0};\n\t\n\tif(bInitHwCfg)\n\t{\n\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &=~BIT23;\n\t\tu4Tmp |= BIT24;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\t//0x765 = 0x18\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3); \t\n\n\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \n\t\t{\n\t\t\t//tell firmware \"antenna inverse\"  ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 1;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\n\t\t\t//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to  BT for IPS case 0x4c[23]=1\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//tell firmware \"no antenna inverse\" ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\n\t\t\t//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to  BT for IPS case 0x4c[23]=1\n\t\t}\n\t}\n\telse if(bWifiOff)\n\t{\n\t\t// 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL\tBT Vendor 0xac=0xf002\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &= ~BIT23;\n\t\tu4Tmp &= ~BIT24;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\t//0x765 = 0x18\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3); \n\t}\n\telse\n\t{\n\t\t//0x765 = 0x0\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0); \n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_PATH_WIFI:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\n\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\n\t\t\telse\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\n\t\t\tbreak;\n\t\tcase BTC_ANT_PATH_BT:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\n\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\n\t\t\telse\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase BTC_ANT_PATH_PTA:\n\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x66);\n\t\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\n\t\t\telse\n\t\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821a1ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tPBTC_BOARD_INFO\tpBoardInfo=&pBtCoexist->boardInfo;\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0, rssiAdjustVal=0;\n\t//u4Byte\t\t\tfwVer=0;\n\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif (pCoexDm->bCurPsTdmaOn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(off, %d) **********\\n\", \n\t\t\tpCoexDm->curPsTdma));\n\t}\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tdefault:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);\n\t\t\t\trssiAdjustVal = 11;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x50);\n\t\t\t\trssiAdjustVal = 14;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);\n\t\t\t\trssiAdjustVal = 17;\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);\n\t\t\t\trssiAdjustVal = 18;\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);\n\t\t\t\trssiAdjustVal = 20;\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);\n\t\t\t\trssiAdjustVal = 18;\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);\n\t\t\t\trssiAdjustVal = 14;\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 20:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 22:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);\n\t\t\t\trssiAdjustVal = 22;\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);\n\t\t\t\trssiAdjustVal = 22;\n\t\t\t\tbreak;\n\t\t\tcase 25:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\trssiAdjustVal = 22;\n\t\t\t\tbreak;\n\t\t\tcase 26:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);\n\t\t\t\trssiAdjustVal = 22;\n\t\t\t\tbreak;\n\t\t\tcase 27:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);\n\t\t\t\trssiAdjustVal = 22;\n\t\t\t\tbreak;\n\t\t\tcase 28:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 29:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 30:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 31:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);\n\t\t\t\tbreak;\n\t\t\tcase 32:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 33:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 34:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 35:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 36:\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving\n\t\t\t\t/* here softap mode screen off will cost 70-80mA for phone */\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);\n\t\t\t\tbreak;\t\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 8: //PTA Control\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\tdefault:  //Software control, Antenna at BT side\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 9:   //Software control, Antenna at WiFi side\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);\n\t\t\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t// under 5G\n\t\t\t\thalbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x8, 0x0);\n\t\t\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\trssiAdjustVal =0;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal);\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8821a1ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// sw all off\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t// hw all off\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nBOOLEAN\nhalbtc8821a1ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\\n\"));\n \t\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t\t(BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\t\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT connected-idle!!\\n\"));\n\t\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\t\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE != pCoexDm->btStatus) )\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non connected-idle + BT Busy!!\\n\"));\n\t\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif (bWifiBusy)\t\t\t\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t}\n\t\t\n\t\tbCommon = FALSE;\n\t}\n\t\n\treturn bCommon;\n}\n\n\nVOID\nhalbtc8821a1ant_TdmaDurationAdjustForAcl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0, btInfoExt;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjustForAcl()\\n\"));\n\n\tif( (BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus) ||\n\t\t(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifiStatus) ||\n\t\t(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifiStatus) )\n\t{\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 3 &&\n\t\t\tpCoexDm->curPsTdma != 9 )\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tm = 1;\n\t\t\tn= 3;\n\t\t\tresult = 0;\n\t\t\tWaitCount = 0;\n\t\t}\t\t\n\t\treturn;\n\t}\n\t\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tbtInfoExt = pCoexSta->btInfoExt;\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tif(result == -1)\n\t\t{\n\t\t\tif( (BT_INFO_8821A_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t}\n\t\t}\n\t\telse if(result == 1)\n\t\t{\n\t\t\tif( (BT_INFO_8821A_1ANT_A2DP_BASIC_RATE(btInfoExt)) &&\n\t\t\t\t((pCoexDm->curPsTdma == 1) ||(pCoexDm->curPsTdma == 2)) )\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t}\n\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t}\n\t\t}\n\t\telse\t  //no change\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ********** TDMA(on, %d) **********\\n\", \n\t\t\t\tpCoexDm->curPsTdma));\n\t\t}\n\n\t\tif( pCoexDm->curPsTdma != 1 &&\n\t\t\tpCoexDm->curPsTdma != 2 &&\n\t\t\tpCoexDm->curPsTdma != 9 &&\n\t\t\tpCoexDm->curPsTdma != 11 )\n\t\t{\n\t\t\t// recover to previous adjust type\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a1ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a1ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8821a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8821a1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8821a1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821a1ant_CoexUnder5G(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\thalbtc8821a1ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\n\n\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 10);\n\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\n\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 5);\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiOnly(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);\t\n}\n\nVOID\nhalbtc8821a1ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\t\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t\thalbtc8821a1ant_ActionWifiOnly(pBtCoexist);\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t}\n\t}\n}\n\n//=============================================\n//\n//\tSoftware Coex Mechanism start\n//\n//=============================================\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8821a1ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8821a1ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8821a1ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8821a1ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8821a1ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(HS) only\nVOID\nhalbtc8821a1ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8821a1ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n}\n\nVOID\nhalbtc8821a1ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8821a1ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\nVOID\nhalbtc8821a1ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, TRUE);\n}\n\n//=============================================\n//\n//\tNon-Software Coex Mechanism start\n//\n//=============================================\nVOID\nhalbtc8821a1ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8821a1ant_ActionHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n}\n\nVOID\nhalbtc8821a1ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))\n\t{\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\n\t \thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\t\t\n\t}\n\telse if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\t// SCO/HID/A2DP  busy\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if ((pBtLinkInfo->bPanExist) || (bWifiBusy))\n\t{\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\t\t\n\t\t\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t}\n\telse\n\t{\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionBtScoHidOnlyBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\t// tdma and coex table\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse //HID\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiConnectedBtAclBusy(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\twifiStatus\n\t)\n{\n\tu1Byte\t\tbtRssiState;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tbtRssiState = halbtc8821a1ant_BtRssiState(2, 28, 0);\t\n\n\tif(pBtLinkInfo->bHidOnly)  //HID\n\t{\n\t\thalbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\treturn;\n\t}\n\telse if(pBtLinkInfo->bA2dpOnly)  //A2DP\t\t\n\t{\n\t\tif(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)\n\t\t{\n\t\t\t//halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\t//halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse if( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\t\n\t\t{\n\t\t\thalbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t}\n\t\telse //for low BT RSSI\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t}\n\telse if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist)  //HID+A2DP\n\t{\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\t\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\telse //for low BT RSSI\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\t\t   \t\n\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\n\t}\n\telse if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)\t\t\t\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||\n\t\t       (pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\t\t\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\t\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiNotConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// power save state\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\t\n\thalbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiNotConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\t// tdma and coex table\n\tif(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t {\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t        halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t}\n\telse if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t//halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\n\t\t//Bryant Add\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiNotConnectedAssoAuth(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif( (pBtLinkInfo->bScoExist)  || (pBtLinkInfo->bHidExist) )\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if( (pBtLinkInfo->bA2dpExist)  || (pBtLinkInfo->bPanExist) ) \t\t\t\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiConnectedScan(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t{\n\t\tif (pBtLinkInfo->bA2dpExist)\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t\t}\n\t\telse if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)\n\t \t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t \telse\n\t \t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\n\t \t}\n\t}\n\telse if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\thalbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);\n\t}\n\telse\n\t{\n\t\t//halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\t//halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);\n\n\t\t//Bryant Add\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiConnectedSpecialPacket(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))\n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse if(pBtLinkInfo->bPanExist) \n\t{\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);\t\t\n\t}\n\telse\t\n\t{\t\t\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_ActionWifiConnected(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN \tbWifiBusy=FALSE;\n\tBOOLEAN \tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\tBOOLEAN\t\tbUnder4way=FALSE, bApEnable=FALSE;\n\tu4Byte\t\twifiBw;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect()===>\\n\"));\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\tif(bUnder4way)\n\t{\n\t\thalbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\\n\"));\n\t\treturn;\n\t}\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tif(bScan)\t\n\t\t\thalbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\telse\n\t\t\thalbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\t// power save state\n\tif(!bApEnable && BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)\n\t{\n\t\tif(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly)\t//A2DP\n\t\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\telse\n\t\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\telse\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\n\t// tdma and coex table\n\tif(!bWifiBusy)\n\t{\n\t\tif(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist, \n\t\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiConnectedBtAclBusy(pBtCoexist,\n\t\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\t{\n\t\t\thalbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,\n\t\t\t\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);\n\t\t}\n\t\telse \n\t\t{\n\t\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);\n\t\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a1ant_RunSwCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\talgorithm=0;\n\n\talgorithm = halbtc8821a1ant_ActionAlgorithm(pBtCoexist);\n\tpCoexDm->curAlgorithm = algorithm;\n\n\tif(halbtc8821a1ant_IsCommonAction(pBtCoexist))\n\t{\n\n\t}\n\telse\n\t{\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_1ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8821a1ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action algorithm = coexist All Off!!\\n\"));\n\t\t\t\t//halbtc8821a1ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8821a1ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\tbIncreaseScanDevNum=FALSE;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\tu1Byte\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbWifiUnder5G=FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\tif(bWifiUnder5G)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for 5G <===\\n\"));\n\t\thalbtc8821a1ant_CoexUnder5G(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbIncreaseScanDevNum = TRUE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)\n\t{\n\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t}\n\telse\n\t{\n\t\tif(bWifiConnected)\n\t\t{\n\t\t\twifiRssiState = halbtc8821a1ant_WifiRssiState(pBtCoexist, 1, 2, 30, 0);\n\t\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\t}\n\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t{\n\t\tbBtCtrlAggBufSize = TRUE;\n\t\taggBufSize = 0x3;\n\t}\n\telse if(pBtLinkInfo->bHidExist)\n\t{\n\t\tbBtCtrlAggBufSize = TRUE;\n\t\taggBufSize = 0x5;\n\t}\n\telse if(pBtLinkInfo->bA2dpExist || pBtLinkInfo->bPanExist)\n\t{\n\t\tbBtCtrlAggBufSize = TRUE;\n\t\taggBufSize = 0x8;\n\t}\n\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\n\thalbtc8821a1ant_RunSwCoexistMechanism(pBtCoexist);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8821a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8821a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\t\n\tif(!bWifiConnected)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is non connected-idle !!!\\n\"));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\t\tif(bScan || bLink || bRoam)\n\t\t{\n\t\t\t if (bScan)\t\n\t\t   \t\thalbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);\t\n\t\t\t else\n\t\t    \t\thalbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\t\n\t\t}\n\t\telse\n\t\t\thalbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\n\t}\n\telse\t// wifi LPS/Busy\n\t{\t\n\t\thalbtc8821a1ant_ActionWifiConnected(pBtCoexist);\n\t}\n}\n\nVOID\nhalbtc8821a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// force to reset coex mechanism\n\t// sw all off\n\thalbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);\n\n\t//halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n}\n\nVOID\nhalbtc8821a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\tBOOLEAN\t\t\tbWifiUnder5G=FALSE;\n\t\t\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 1Ant Init HW Config!!\\n\"));\n\n\tif(bWifiOnly)\n\t\treturn;\n\t\n\tif(bBackUp)\n\t{\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t}\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\n\t//Antenna config\n\tif(bWifiUnder5G)\n\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);\n\telse\n\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);\n\n\t// PTA parameter\n\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n}\n\n//============================================================\n// work around function start with wa_halbtc8821a1ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8821a1ant_\n//============================================================\nVOID\nEXhalbtc8821a1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8821a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);\n}\n\nVOID\nEXhalbtc8821a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\n\tpBtCoexist->bStopCoexDm = FALSE;\n\t\n\thalbtc8821a1ant_InitCoexDm(pBtCoexist);\n\n\thalbtc8821a1ant_QueryBtInfo(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu2Byte\t\t\t\tu2Tmp[4];\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\tif(pBtCoexist->bStopCoexDm)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Coex is STOPPED]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"Ant PG Num/ Ant Mech/ Ant Pos:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8821a1Ant, GLCoexVer8821a1Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\t\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8821A_1ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8821a1Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"SM[LowPenaltyRA]\", \\\n\t\tpCoexDm->bCurLowPenaltyRa);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %d \", \"DelBA/ BtCtrlAgg/ AggSize\", \\\n\t\t(pBtCoexist->btInfo.bRejectAggPkt? \"Yes\":\"No\"), (pBtCoexist->btInfo.bBtCtrlAggBufSize? \"Yes\":\"No\"),\n\t\t\tpBtCoexist->btInfo.aggBufSize);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Rate Mask\", \\\n\t\t\tpBtCoexist->btInfo.raMask);\n\tCL_PRINTF(cliBuf);\t\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\t\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d \", \"IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x \", \"Latest error condition(should be 0)\", \\\n\t\t\tpCoexDm->errorCondition);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"backup ARFR1/ARFR2/RL/AMaxTime\", \\\n\t\tpCoexDm->backupArfrCnt1, pCoexDm->backupArfrCnt2, pCoexDm->backupRetryLimit, pCoexDm->backupAmpduMaxTime);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\tu2Tmp[0] = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/0x%x/0x%x/0x%x\", \"0x430/0x434/0x42a/0x456\", \\\n\t\tu4Tmp[0], u4Tmp[1], u2Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc58);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x778/ 0xc58[29:25]\", \\\n\t\tu1Tmp[0], (u4Tmp[0]&0x3e000000) >> 25);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8db[6:5]\", \\\n\t\t((u1Tmp[0]&0x60)>>5));\n\tCL_PRINTF(cliBuf); \n\t\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x975);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]\", \\\n\t\t(u4Tmp[0]&0x30000000)>>28, u4Tmp[0]&0xff, u1Tmp[0]& 0x3);\n\tCL_PRINTF(cliBuf);\n\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x40/0x4c[24:23]/0x64[0]\", \\\n\t\tu1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u1Tmp[1]&0x1);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0xc50(dig)\", \\\n\t\tu4Tmp[0]&0xff);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5d);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"OFDM-FA/ CCK-FA\", \\\n\t\tu4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1]  );\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8821A_1ANT == 1)\n\thalbtc8821a1ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8821a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu4Byte\tu4Tmp=0;\n\n\tif(pBtCoexist->bManualControl ||\tpBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\t\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\t\n\t\t//halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\n\t\thalbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8821a1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8821a1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)\n\t\treturn;\n\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm )\n\t\treturn;\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);  //Force antenna setup for no scan result issue\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\t\n\n\tif(pBtCoexist->btInfo.bBtDisabled)\n\t\treturn;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\thalbtc8821a1ant_QueryBtInfo(pBtCoexist);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\t\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8821a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8821a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_SCAN_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);\n\t\t}\n\t\telse\t// wifi is connected\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);\n\t\t}\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t\tif(!bWifiConnected)\t// non-connected scan\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiConnected=FALSE, bBtHsOn=FALSE;\t\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t pCoexSta->bWiFiIsHighPriTask = TRUE;\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\n\t\t pCoexDm->nArpCnt = 0;\n\t}\n\telse\n\t{\n\t pCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\t RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\t\n\t\tpCoexDm->nArpCnt = 0;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8821a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8821a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\t\t\n\t\thalbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t\t\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\tif(!bWifiConnected) // non-connected scan\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a1ant_ActionWifiConnected(pBtCoexist);\n\t\t}\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t\tpCoexDm->nArpCnt = 0;\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\t//H2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[0] = 0x0;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\t\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n}\n\nVOID\nEXhalbtc8821a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbBtHsOn=FALSE;\n\tu4Byte\twifiLinkStatus=0;\n\tu4Byte\tnumOfWifiLink=0;\n\tBOOLEAN\tbBtCtrlAggBufSize=FALSE;\n\tu1Byte\taggBufSize=5;\n\t\n\tif(pBtCoexist->bManualControl ||\n\t\tpBtCoexist->bStopCoexDm ||\n\t\tpBtCoexist->btInfo.bBtDisabled )\n\t\treturn;\n\n\tif( BTC_PACKET_DHCP == type || \n\t\tBTC_PACKET_EAPOL == type ||\n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = TRUE;\n\n\t\tif(BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet ARP notify\\n\"));\t\t \n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet DHCP or EAPOL notify\\n\"));\t\t \n\t\t}\n\t}\n\telse\n\t{\n\t\tpCoexSta->bWiFiIsHighPriTask = FALSE;\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet [Type = %d] notify\\n\", type));\n\t}\n\n\tpCoexSta->specialPktPeriodCnt = 0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\tif(numOfWifiLink >= 2)\n\t{\n\t\thalbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);\n\t\thalbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);\n\t\thalbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tif(pCoexSta->bC2hBtInquiryPage)\n\t{\n\t\thalbtc8821a1ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse if(bBtHsOn)\n\t{\n\t\thalbtc8821a1ant_ActionHs(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif( BTC_PACKET_DHCP == type ||\n\t\tBTC_PACKET_EAPOL == type || \n\t\tBTC_PACKET_ARP == type )\n\t{\n\t\t//RT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], special Packet(%d) notify\\n\", type));\n\t\tif(BTC_PACKET_ARP == type)\n\t\t{\n\t\t\tpCoexDm->nArpCnt++;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ARP Packet Count = %d\\n\", pCoexDm->nArpCnt));\n\t\t\tif(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) \n\t\t\t\treturn;\t\n\t\t}\n\t\t\n\t\thalbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\t\tbtInfo=0;\n\tu1Byte\t\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\t\tbWifiConnected=FALSE;\n\tBOOLEAN\t\t\t\tbBtBusy=FALSE;\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8821A_1ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8821A_1ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(BT_INFO_SRC_8821A_1ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tif (pCoexSta->btInfoC2h[rspSource][2]&0x20)\n\t\t\tpCoexSta->bC2hBtPage = TRUE;\n\t\telse\n\t\t\tpCoexSta->bC2hBtPage = FALSE;\t\t\t\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif(!pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);\n\t\t}\n\t\t\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif(pCoexSta->btInfoExt & BIT1)\n\t\t{\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\n\t\tif( (pCoexSta->btInfoExt & BIT3) && !bWifiUnder5G)\n\t\t{\n\t\t\tif(!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\thalbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t}\n#if(BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\t\t\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8821A_1ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8821A_1ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_1ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_1ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_1ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\n\thalbtc8821a1ant_UpdateBtLinkInfo(pBtCoexist);\n\t\t\n\tbtInfo = btInfo & 0x1f;  //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)\n\t\n\tif(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8821A_1ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8821A_1ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8821A_1ANT_B_ACL_BUSY)\n\t{\n\t\tif(BT_8821A_1ANT_BT_STATUS_ACL_BUSY != pCoexDm->btStatus)\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\tpCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\n\tif( (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t\tbBtBusy = TRUE;\n\telse\n\t\tbBtBusy = FALSE;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\thalbtc8821a1ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tu4Byte\tu4Tmp;\n\t\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\thalbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);\n\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\t//halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\n\thalbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\n\tEXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\n\tpBtCoexist->bStopCoexDm = TRUE;\t\n}\n\nVOID\nEXhalbtc8821a1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\n\t\thalbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\thalbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t\thalbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);\n\t       //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);\n\n\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\thalbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);\n\t\thalbtc8821a1ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8821a1ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8821a1Ant, GLCoexVer8821a1Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)\n\thalbtc8821a1ant_QueryBtInfo(pBtCoexist);\n\thalbtc8821a1ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8821a1ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\tif( halbtc8821a1ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust )\n\t{\n\t\t//if(pCoexSta->specialPktPeriodCnt > 2)\n\t\t//{\n\t\t\thalbtc8821a1ant_RunCoexistMechanism(pBtCoexist);\t\n\t\t//}\n\t}\n\n\tpCoexSta->specialPktPeriodCnt++;\n#endif\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8821a1Ant.h",
    "content": "//===========================================\n// The following is for 8821A 1ANT BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8821A_1ANT\t\t\t\t1\n\n#define\tBT_INFO_8821A_1ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8821A_1ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8821A_1ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8821A_1ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8821A_1ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8821A_1ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8821A_1ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8821A_1ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\tBT_INFO_8821A_1ANT_A2DP_BASIC_RATE(_BT_INFO_EXT_)\t\\\n\t\t(((_BT_INFO_EXT_&BIT0))? TRUE:FALSE)\n\n#define\tBTC_RSSI_COEX_THRESH_TOL_8821A_1ANT\t\t2\n\ntypedef enum _BT_INFO_SRC_8821A_1ANT{\n\tBT_INFO_SRC_8821A_1ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8821A_1ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8821A_1ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8821A_1ANT_MAX\n}BT_INFO_SRC_8821A_1ANT,*PBT_INFO_SRC_8821A_1ANT;\n\ntypedef enum _BT_8821A_1ANT_BT_STATUS{\n\tBT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8821A_1ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8821A_1ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8821A_1ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8821A_1ANT_BT_STATUS_MAX\n}BT_8821A_1ANT_BT_STATUS,*PBT_8821A_1ANT_BT_STATUS;\n\ntypedef enum _BT_8821A_1ANT_WIFI_STATUS{\n\tBT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_IDLE\t\t\t\t= 0x0,\n\tBT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN\t\t= 0x1,\n\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN\t\t\t\t\t= 0x2,\n\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT\t\t\t\t= 0x3,\n\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE\t\t\t\t\t= 0x4,\n\tBT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY\t\t\t\t\t= 0x5,\n\tBT_8821A_1ANT_WIFI_STATUS_MAX\n}BT_8821A_1ANT_WIFI_STATUS,*PBT_8821A_1ANT_WIFI_STATUS;\n\ntypedef enum _BT_8821A_1ANT_COEX_ALGO{\n\tBT_8821A_1ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8821A_1ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8821A_1ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8821A_1ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8821A_1ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8821A_1ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8821A_1ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8821A_1ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8821A_1ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8821A_1ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8821A_1ANT_COEX_ALGO,*PBT_8821A_1ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8821A_1ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n\n\t// sw mechanism\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\n\tu4Byte\t\tbackupArfrCnt1;\t// Auto Rate Fallback Retry cnt\n\tu4Byte\t\tbackupArfrCnt2;\t// Auto Rate Fallback Retry cnt\n\tu2Byte\t\tbackupRetryLimit;\n\tu1Byte\t\tbackupAmpduMaxTime;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\tu1Byte\t\tpreArfrType;\n\tu1Byte\t\tcurArfrType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreAmpduTimeType;\n\tu1Byte\t\tcurAmpduTimeType;\n\tu4Byte\t\tnArpCnt;\n\n\tu1Byte\t\terrorCondition;\n} COEX_DM_8821A_1ANT, *PCOEX_DM_8821A_1ANT;\n\ntypedef struct _COEX_STA_8821A_1ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\tspecialPktPeriodCnt;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8821A_1ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8821A_1ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tBOOLEAN\t\t\t\t\tbC2hBtPage;\t\t\t\t//Add for win8.1 page out issue\n\tBOOLEAN\t\t\t\t\tbWiFiIsHighPriTask;\t\t//Add for win8.1 page out issue\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n}COEX_STA_8821A_1ANT, *PCOEX_STA_8821A_1ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8821a1ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a1ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8821a1ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a1ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a1ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8821a1ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a1ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8821a1ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a1ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8821a2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8821A Co-exist mechanism\n//\n// History\n// 2012/11/15 Cosa first check in.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtc8821a2Ant.tmh\"\n#endif\n\n#if (RTL8821A_SUPPORT == 1)\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8821A_2ANT\t\tGLCoexDm8821a2Ant;\nstatic PCOEX_DM_8821A_2ANT \tpCoexDm=&GLCoexDm8821a2Ant;\nstatic COEX_STA_8821A_2ANT\t\tGLCoexSta8821a2Ant;\nstatic PCOEX_STA_8821A_2ANT\tpCoexSta=&GLCoexSta8821a2Ant;\n\nconst char *const GLBtInfoSrc8821a2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte\tGLCoexVerDate8821a2Ant=20150706;\nu4Byte\tGLCoexVer8821a2Ant=0x57;\n//modify 20140903v43 a2dpandhid tdmaonoff a2dp glitch _ tdma off 778=3(case1)->778=1(case0)\n//and to improve tp while a2dphid case23->case25 , case123->case125 for asus spec\n//and modify for asus bt WHQL test _ tdma off_ 778=3->1_\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8821a2ant_\n//============================================================\nu1Byte\nhalbtc8821a2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8821a2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8821a2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n}\n\nVOID\nhalbtc8821a2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tif ( (pCoexSta->lowPriorityRx >= 950)  &&  (pCoexSta->lowPriorityRx >= pCoexSta->lowPriorityTx) && (!pCoexSta->bUnderIps) )\n\t{\n\t\tpBtLinkInfo->bSlaveRole = TRUE;\n\t}\n\telse\n\t{\n\t\tpBtLinkInfo->bSlaveRole = FALSE;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n}\n\nVOID\nhalbtc8821a2ant_MonitorWiFiCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \tu4Tmp;\n\tu2Byte \tu2Tmp[3];\n\ts4Byte\twifiRssi=0;\n\tBOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;\n\tstatic u1Byte nCCKLockCounter = 0;\n\n\n\tif (pCoexSta->bUnderIps)\n\t{\n\t\tpCoexSta->nCRCOK_CCK = 0;\n\t\tpCoexSta->nCRCOK_11g = 0;\n\t\tpCoexSta->nCRCOK_11n = 0;\n\t\tpCoexSta->nCRCOK_11nAgg = 0;\n\n\t\tpCoexSta->nCRCErr_CCK = 0;\n\t\tpCoexSta->nCRCErr_11g = 0;\n\t\tpCoexSta->nCRCErr_11n = 0;\n\t\tpCoexSta->nCRCErr_11nAgg = 0;\t\n\t}\n\telse\n\t{\n\t\tpCoexSta->nCRCOK_CCK\t= pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);\n\t\tpCoexSta->nCRCOK_11g \t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);\n\t\tpCoexSta->nCRCOK_11n\t= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);\n\t\tpCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);\n\n\t\tpCoexSta->nCRCErr_CCK \t = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);\n\t\tpCoexSta->nCRCErr_11g \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);\n\t\tpCoexSta->nCRCErr_11n \t = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);\n\t\tpCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);\t\t\n\t}\n\n\t//reset counter\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);\n}\n\nVOID\nhalbtc8821a2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nBOOLEAN\nhalbtc8821a2ant_IsWifiStatusChanged(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreWifiBusy=FALSE, bPreUnder4way=FALSE, bPreBtHsOn=FALSE;\n\tBOOLEAN\t\t\tbWifiBusy=FALSE, bUnder4way=FALSE, bBtHsOn=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE;\n\tu1Byte\t\t\twifiRssiState=BTC_RSSI_STATE_HIGH;\n\t\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bWifiBusy != bPreWifiBusy)\n\t\t{\n\t\t\tbPreWifiBusy = bWifiBusy;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bUnder4way != bPreUnder4way)\n\t\t{\n\t\t\tbPreUnder4way = bUnder4way;\n\t\t\treturn TRUE;\n\t\t}\n\t\tif(bBtHsOn != bPreBtHsOn)\n\t\t{\n\t\t\tbPreBtHsOn = bBtHsOn;\n\t\t\treturn TRUE;\n\t\t}\n\n\n\t\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist,3, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\n\t\tif ( (BTC_RSSI_STATE_HIGH ==wifiRssiState ) ||  (BTC_RSSI_STATE_LOW ==wifiRssiState ))\n\t\t{\n\t\t\treturn TRUE;\n\t\t}\n\t\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nhalbtc8821a2ant_UpdateBtLinkInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO \tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\n#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 1)\t// profile from bt patch\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tpBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pCoexSta->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pCoexSta->bPanExist;\n\tpBtLinkInfo->bHidExist = pCoexSta->bHidExist;\n\n\t// work around for HS mode.\n\tif(bBtHsOn)\n\t{\n\t\tpBtLinkInfo->bPanExist = TRUE;\n\t\tpBtLinkInfo->bBtLinkExist = TRUE;\n\t}\n#else\t// profile from bt stack\n\tpBtLinkInfo->bBtLinkExist = pStackInfo->bBtLinkExist;\n\tpBtLinkInfo->bScoExist = pStackInfo->bScoExist;\n\tpBtLinkInfo->bA2dpExist = pStackInfo->bA2dpExist;\n\tpBtLinkInfo->bPanExist = pStackInfo->bPanExist;\n\tpBtLinkInfo->bHidExist = pStackInfo->bHidExist;\n\n\t//for win-8 stack HID report error\n\tif(!pStackInfo->bHidExist)\n\t\tpStackInfo->bHidExist = pCoexSta->bHidExist;  //sync  BTInfo with BT firmware and stack\n\t// when stack HID report error, here we use the info from bt fw.\n\tif(!pStackInfo->bBtLinkExist)\n\t\tpStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\t\n#endif\n\t// check if Sco only\n\tif( pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bScoOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bScoOnly = FALSE;\n\n\t// check if A2dp only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\tpBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bA2dpOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bA2dpOnly = FALSE;\n\n\t// check if Pan only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\tpBtLinkInfo->bPanExist &&\n\t\t!pBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bPanOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bPanOnly = FALSE;\n\t\n\t// check if Hid only\n\tif( !pBtLinkInfo->bScoExist &&\n\t\t!pBtLinkInfo->bA2dpExist &&\n\t\t!pBtLinkInfo->bPanExist &&\n\t\tpBtLinkInfo->bHidExist )\n\t\tpBtLinkInfo->bHidOnly = TRUE;\n\telse\n\t\tpBtLinkInfo->bHidOnly = FALSE;\n}\n\nu1Byte\nhalbtc8821a2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8821A_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\t\t\n\tif(!pBtLinkInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No BT link exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pBtLinkInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pBtLinkInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif(pBtLinkInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if(pBtLinkInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n#if 0\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS) ==> SCO\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR) ==> SCO\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pBtLinkInfo->bScoExist)\n\t\t{\n\t\t\tif( pBtLinkInfo->bHidExist &&\n\t\t\t\tpBtLinkInfo->bPanExist &&\n\t\t\t\tpBtLinkInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nVOID\nhalbtc8821a2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = decBtPwrLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\\n\", \n\t\tdecBtPwrLvl, H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8821a2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\tdecBtPwrLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), decBtPwrLvl));\n\tpCoexDm->curBtDecPwrLvl = decBtPwrLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);\n\n\tpCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;\n}\n\nVOID\nhalbtc8821a2ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8821a2ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8821a2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8821a2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8821a2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8821a2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n                H2C_Parameter[3] = 0xf5;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xa0;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xa0;\t//MCS5 or OFDM36\n\t\t//H2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\t//H2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\t//H2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\")) );\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\t//return;\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8821a2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);\n}\n\nVOID\nhalbtc8821a2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8821a2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8821a2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8821a2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8821a2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);\n\t}\n}\n\nVOID\nhalbtc8821a2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8821a2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\t//=================BB AGC Gain Table\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB Agc Table Off!\\n\"));\n\t \tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001);\n\t}\n\t\n\t\n\t//=================RF Gain\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tif(bAgcTableEn)\n\t{\n\t\trssiAdjustVal = 8;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\nVOID\nhalbtc8821a2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8821a2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8821a2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\t\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8821a2ant_CoexTableWithType(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexSta->nCoexTableType = type;\n\t\n\tswitch(type)\n\t{\n\t\tcase 0:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 13:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tcase 17:\n\t\t\thalbtc8821a2ant_CoexTable(pBtCoexist, bForceExec, 0xfafafafa, 0xfafafafa, 0xffffff, 0x3);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821a2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a2ant_SetLpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tu1Byte\tlps=lpsVal;\n\tu1Byte\trpwm=rpwmVal;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);\n}\n\nVOID\nhalbtc8821a2ant_LpsRpwm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\tbForceExecPwrCmd=FALSE;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set lps/rpwm=0x%x/0x%x \\n\", \n\t\t(bForceExec? \"force to\":\"\"), lpsVal, rpwmVal));\n\tpCoexDm->curLps = lpsVal;\n\tpCoexDm->curRpwm = rpwmVal;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preLps == pCoexDm->curLps) &&\n\t\t\t(pCoexDm->preRpwm == pCoexDm->curRpwm) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\thalbtc8821a2ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);\n\n\tpCoexDm->preLps = pCoexDm->curLps;\n\tpCoexDm->preRpwm = pCoexDm->curRpwm;\n}\n\nVOID\nhalbtc8821a2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\thalbtc8821a2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8821a2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[5] ={0};\n\t \n\tH2C_Parameter[0] = byte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = byte5;\n\n\tpCoexDm->psTdmaPara[0] = byte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = byte5;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x60(5bytes)=0x%x%08x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);\n}\n\nVOID\nhalbtc8821a2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\t/*\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t*/\n\t\n\t//halbtc8821a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\thalbtc8821a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n}\n\nVOID\nhalbtc8821a2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\t//halbtc8821a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\t//halbtc8821a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\thalbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8821a2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\t\tu4Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\n\tif(bInitHwCfg)\n\t{\n\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &=~BIT23;\n\t\tu4Tmp |= BIT24;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x974, 0x3ff);\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\n\n\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \n\t\t{\n\t\t\t//tell firmware \"antenna inverse\"  ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 1;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//tell firmware \"no antenna inverse\" ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t\t}\n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\n\t\t\tbreak;\n\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821a2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\tu1Byte\t\t\twifiRssiState1, btRssiState;\n\n\t\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tif (!(BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState)) && bTurnOn)\n\t{\n\t\ttype = type +100;  //for WiFi RSSI low or BT RSSI low\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);\t\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x2d, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x3, 0x70, 0x90);\t\t\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\t\n\t\t\tcase 23:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1e, 0x03, 0xf0, 0x14);\n\t\t\t\tbreak;\n\t\t\tcase 24:\n\t\t\tcase 124:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3c, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\n\t\t\t\t//case25/case125 : for lenovo bt pan tp degrade<30% while wifi downlink\n\t\t\tcase 25:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x14, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 71:\n\t\t\t\t//halbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 101:\n\t\t\tcase 105:\n\t\t\tcase 171:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x3a, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\n\t\t\tcase 102:\n\t\t\tcase 106:\n\t\t\tcase 110:\n\t\t\tcase 114:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x2d, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\n\t\t\tcase 103:\n\t\t\tcase 107:\n\t\t\tcase 111:\n\t\t\tcase 115:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\t\n\t\t\tcase 104:\n\t\t\tcase 108:\n\t\t\tcase 112:\n\t\t\tcase 116:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x10, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\t\n\t\t\tcase 109:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 113:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x3c, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 121:\t\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\t\n\t\t\tcase 22:\n\t\t\tcase 122:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x35, 0x03, 0x71, 0x11);\n\t\t\t\tbreak;\n\t\t\tcase 123:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1c, 0x03, 0x70, 0x54);\n\t\t\t\tbreak;\n\t\t\t\t//case25/case125 : for lenovo bt pan tp degrade<30% while wifi downlink\n\t\t\tcase 125:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0xd3, 0x14, 0x03, 0x70, 0x50);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8821a2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8821a2ant_PsTdmaCheckForPowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbNewPsState\n\t)\n{\n\tu1Byte\tlpsMode=0x0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);\n\t\n\tif(lpsMode)\t// already under LPS state\n\t{\n\t\tif(bNewPsState)\t\t\n\t\t{\n\t\t\t// keep state under LPS, do nothing.\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// will leave LPS state, turn off psTdma first\n\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t}\n\telse\t\t\t\t\t\t// NO PS state\n\t{\n\t\tif(bNewPsState)\n\t\t{\n\t\t\t// will enter LPS state, turn off psTdma first\n\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// keep state under NO PS state, do nothing.\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_PowerSaveState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpsType,\n\tIN\tu1Byte\t\t\t\tlpsVal,\n\tIN\tu1Byte\t\t\t\trpwmVal\n\t)\n{\n\tBOOLEAN\t\tbLowPwrDisable=FALSE;\n\t\n\tswitch(psType)\n\t{\n\t\tcase BTC_PS_WIFI_NATIVE:\n\t\t\t// recover to original 32k low power setting\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_ON:\n\t\t\thalbtc8821a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);\n\t\t\thalbtc8821a2ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);\t\t\t\n\t\t\t// when coex force to enter LPS, do not enter 32k low power.\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\t// power save must executed before psTdma.\t\t\t\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = TRUE;\n\t\t\tbreak;\n\t\tcase BTC_PS_LPS_OFF:\n\t\t\thalbtc8821a2ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);\n\t\t\tpCoexSta->bForceLpsOn = FALSE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n\nVOID\nhalbtc8821a2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8821a2ant_CoexUnder5G(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a2ant_CoexAllOff(pBtCoexist);\n\n\thalbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\n}\n\nVOID\nhalbtc8821a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8821a2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);\n\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8821a2ant_ActionBtInquiry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tBOOLEAN\tbWifiConnected=FALSE;\n\tBOOLEAN\tbLowPwrDisable=TRUE;\n\tBOOLEAN\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi link process + BT Inq/Page!!\\n\"));\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse if(bWifiConnected)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT Inq/Page!!\\n\"));\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi no-link + BT Inq/Page!!\\n\"));\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t}\t\n\t\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\n}\n\n\nVOID\nhalbtc8821a2ant_ActionWiFiLinkProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte \tu1Tmpa, u1Tmpb;\n\t\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 15);\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\n\n\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\\n\", u1Tmpa, u1Tmpb));\n}\n\nBOOLEAN\nhalbtc8821a2ant_ActionWifiIdleProcess(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//wifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES-20, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif(BTC_RSSI_HIGH(wifiRssiState1) && \n\t\t\t(pCoexSta->bHidExist == TRUE) && (pCoexSta->bA2dpExist == TRUE))\n\t{\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\\n\"));\n\t\t\n\t\thalbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6);\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t// sw all off\n\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t  \treturn TRUE;\n\t}\n\n        //\n       else if (pCoexSta->bPanExist== TRUE)\n\t{\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi  idle process for BT PAN exist!!\\n\"));\n\t\t\n\t\thalbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x6);\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t// sw all off\n\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t  \treturn TRUE;\n\t}\n\t\n\telse\n\t{\n\t\thalbtc8821a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, TRUE, 0x18);\n\t\treturn FALSE;\t\n\t}\n\t\n\t\n}\n\n\n\nBOOLEAN\nhalbtc8821a2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tbtRssiState=BTC_RSSI_STATE_HIGH;\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbBtHsOn=FALSE, bLowPwrDisable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected)\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\t\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi non-connected idle!!\\n\"));\n\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\t\n \t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tif(BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = FALSE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT non connected-idle!!\\n\"));\n\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\t\t\n\t\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t      \thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse if(BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bBtHsOn)\n\t\t\t\treturn FALSE;\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi connected + BT connected-idle!!\\n\"));\n\t\t\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\t\t\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t\t\tbCommon = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbLowPwrDisable = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\t\tif(bWifiBusy)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Busy + BT Busy!!\\n\"));\n\t\t\t\tbCommon = FALSE;\n\t\t\t\t//bCommon = halbtc8821a2ant_ActionWifiIdleProcess(pBtCoexist);\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Connected-Idle + BT Busy!!\\n\"));\n\t\t\t\t//bCommon = FALSE;\t\n\t\t\t\tbCommon = halbtc8821a2ant_ActionWifiIdleProcess(pBtCoexist);\t\t\t\n\t\t\t}\n\t\t}\t\n\t}\n\n\treturn bCommon;\n}\nVOID\nhalbtc8821a2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(!pCoexDm->bAutoTdmaAdjust)\n\t{\n\t\tpCoexDm->bAutoTdmaAdjust = TRUE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n}\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8821a2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\twifiRssiState, btRssiState;\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\telse  //for SCO quality & wifi performance balance at 11n mode\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);\n\t\telse\n\t\t{\n\t\t\tif(pBtLinkInfo->bScoOnly)\n\t\t\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 17);\n\t\t\telse\n\t\t\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);\n\t\t}\n\t}\n\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18);\n\t\t}\t\t\n\t}\n}\n\n\nVOID\nhalbtc8821a2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\t\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);\n\t}\n\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 24);\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8821a2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\n\t// define the office environment\n\tif( (apNum >= 10) && BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\t//DbgPrint(\" AP#>10(%d)\\n\", apNum);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\t\n\t\t\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\t\t\t\n\t\t\t\t\t\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t\t//halbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\n\t\t// sw mechanism\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,TRUE,0x6);\t\t\n\t\t}\n\t\treturn;\n\t\t\n\t}\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\t\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t\t\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\t\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\t//halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t}\n\telse\n\t{\n\t\t//halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t}\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8821a2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\t\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8821a2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\t\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 25);\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 25);\t\n\t}\n\t\n\t// sw mechanism\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n\n//PAN(HS) only\nVOID\nhalbtc8821a2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8821a2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\t\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\telse\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);\n\t\t\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 13);\n\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t}\n\t\n\t// sw mechanism\t\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\t\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t{\n\t\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\n\t\t\t//halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t\t//halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\t}\n\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t//halbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8821a2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState,wifiRssiState1,  btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(BTC_RSSI_HIGH(btRssiState))\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\telse\t\n\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\telse\n\t\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t}\n\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, wifiRssiState1, btRssiState;\n\tu4Byte\t\twifiBw;\n\tu1Byte\t\tapNum=0;\n\n\twifiRssiState = halbtc8821a2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\t//btRssiState = halbtc8821a2ant_BtRssiState(2, 29, 0);\n\twifiRssiState1 = halbtc8821a2ant_WifiRssiState(pBtCoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);\t\n\tbtRssiState = halbtc8821a2ant_BtRssiState(3, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\t\n\thalbtc8821a2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);\n\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tif(BTC_WIFI_BW_LEGACY == wifiBw)\n\t{\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse\t\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\telse\n\t{\t// only 802.11N mode we have to dec bt power to 4 degree\n\t\tif(BTC_RSSI_HIGH(btRssiState))\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\t// need to check ap Number of Not\n\t\t\tif(apNum < 10)\n\t\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);\n\t\t\telse\n\t\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\t}\n\t\telse if(BTC_RSSI_MEDIUM(btRssiState))\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);\n\t\telse\t\n\t\t\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\t}\n\n\tif (BTC_RSSI_HIGH(wifiRssiState1) && BTC_RSSI_HIGH(btRssiState))\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\t}\n\telse\n\t{\n\t\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 14);\n\t\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);\t\t\n\t}\n\n\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t{\n\t\t//halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t}\n\telse\n\t{\n\t\t//halbtc8821a2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t}\n\t\n\t// sw mechanism\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821a2ant_ActionBtWhckTest(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\n\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n}\n\nVOID\nhalbtc8821a2ant_ActionWifiMultiPort(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\t\n\thalbtc8821a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8821a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);\n\n\t// sw all off\n\thalbtc8821a2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821a2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\t//pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);\n\n\thalbtc8821a2ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);\t\t\n\thalbtc8821a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n}\n\nVOID\nhalbtc8821a2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE, bBtHsOn=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\tu4Byte\t\t\t\tnumOfWifiLink=0;\n\tu4Byte\t\t\t\twifiLinkStatus=0;\n\tPBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tBOOLEAN\t\t\t\tbMiracastPlusBt=FALSE;\n\tBOOLEAN\t\t\t\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism()===>\\n\"));\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\tif(bWifiUnder5G)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\\n\"));\n\t\thalbtc8821a2ant_CoexUnder5G(pBtCoexist);\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bUnderIps)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi is under IPS !!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(pCoexSta->bBtWhckTest)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under WHCK TEST!!!\\n\"));\n\t\thalbtc8821a2ant_ActionBtWhckTest(pBtCoexist);\n\t\treturn;\n\t}\n\n\talgorithm = halbtc8821a2ant_ActionAlgorithm(pBtCoexist);\n\tif(pCoexSta->bC2hBtInquiryPage && (BT_8821A_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\thalbtc8821a2ant_ActionBtInquiry(pBtCoexist);\n\t\treturn;\n\t}\n\telse\n\t{\n\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\n\tif(bScan || bLink || bRoam)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], WiFi is under Link Process !!\\n\"));\n\t\thalbtc8821a2ant_ActionWiFiLinkProcess(pBtCoexist);\n\t\treturn;\n\t}\n\n\t//for P2P\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);\n\tnumOfWifiLink = wifiLinkStatus>>16;\n\t\n\tif((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex],  Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\\n\", numOfWifiLink,wifiLinkStatus) );\n\n\t\tif(pBtLinkInfo->bBtLinkExist)\n\t\t{\n\t\t\tbMiracastPlusBt = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbMiracastPlusBt = FALSE;\n\t\t}\n\t\t\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t\thalbtc8821a2ant_ActionWifiMultiPort(pBtCoexist);\n\t\t\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tbMiracastPlusBt = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_MIRACAST_PLUS_BT, &bMiracastPlusBt);\n\t}\n\n\tpCoexDm->curAlgorithm = algorithm;\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\tif(halbtc8821a2ant_IsCommonAction(pBtCoexist))\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t}\n\telse\n\t{\n\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\tpCoexDm->bAutoTdmaAdjust = FALSE;\n\t\t}\n\t\tswitch(pCoexDm->curAlgorithm)\n\t\t{\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_SCO:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionSco(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_PANHS:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionPanHs(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tcase BT_8821A_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\thalbtc8821a2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\thalbtc8821a2ant_CoexAllOff(pBtCoexist);\n\t\t\t\tbreak;\n\t\t}\n\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t}\n}\n\nVOID\nhalbtc8821a2ant_WifiOffHwCfg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\tbIsInMpMode = FALSE;\n\tu1Byte H2C_Parameter[2] ={0};\n\tu4Byte fwVer=0;\n\n\t// set wlan_act to low\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tif(fwVer >= 0x180000)\n\t{\n\t\t/* Use H2C to set GNT_BT to HIGH */\n\t\tH2C_Parameter[0] = 1;\n\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);\n\t}\n\telse\n\t{\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);\n\t}\n}\n\nVOID\nhalbtc8821a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbBackUp\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\tu4Tmp=0, fwVer;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\t\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\t// backup rf 0x1e value\n\tpCoexDm->btRf0x1eBackup = \n\t\tpBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\t\n\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\n\t//Antenna config\t\n\thalbtc8821a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\n\tpCoexSta->disVerInfoCnt = 0;\n\n\t// PTA parameter\n\thalbtc8821a2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);\n\t\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n}\n\n//============================================================\n// work around function start with wa_halbtc8821a2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8821a2ant_\n//============================================================\nVOID\nEXhalbtc8821a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\n}\n\nVOID\nEXhalbtc8821a2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */\n\n\t// \n\t// S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)\n\t// Local setting bit define\n\t//\tBIT0: \"0\" for no antenna inverse; \"1\" for antenna inverse \n\t//\tBIT1: \"0\" for internal switch; \"1\" for external switch\n\t//\tBIT2: \"0\" for one antenna; \"1\" for two antenna\n\t// NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0\n\tif(pBtCoexist->chipInterface == BTC_INTF_USB)\n\t{\n\t\t// fixed at S0 for USB interface\n\t \tu1Tmp |= 0x1;\t// antenna inverse\n\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);\n\t}\n\telse\n\t{\n\t\t// for PCIE and SDIO interface, we check efuse 0xc3[6]\n\t\tif(pBoardInfo->singleAntPath == 0)\n\t\t{\n\t\t}\n\t\telse if(pBoardInfo->singleAntPath == 1)\n\t\t{\n\t\t\t// set to S0\n\t\t\tu1Tmp |= 0x1;\t// antenna inverse\n\t\t}\n\n\t\tif(pBtCoexist->chipInterface == BTC_INTF_PCI)\n\t\t{\t\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);\n\t\t}\n\t\telse if(pBtCoexist->chipInterface == BTC_INTF_SDIO)\n\t\t{\n\t\t\tpBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);\n\t\t}\t\t\t\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\thalbtc8821a2ant_InitHwConfig(pBtCoexist, TRUE);\n}\n\nVOID\nEXhalbtc8821a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8821a2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfaOfdm, faCck;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[Under Manual Control]============\");\n\t\tCL_PRINTF(cliBuf);\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ==========================================\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8821a2Ant, GLCoexVer8821a2Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\t\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %ddBm/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pBtCoexist->btInfo.bBtDisabled)? (\"disabled\"):\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? \"non-connected idle\":\n\t\t(  (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\")))),\n\t\tpCoexSta->btRssi-100, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\tpBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);\n\tCL_PRINTF(cliBuf);\n\n\tif (pStackInfo->bProfileNotified)\n\t{\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\t\n\t}\n\telse\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Role\", \\\n\t\t(pBtLinkInfo->bSlaveRole )? \"Slave\":\"Master\");\n\t\tCL_PRINTF(cliBuf);\t\n\t}\t\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8821A_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8821a2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tpsTdmaCase = pCoexDm->curPsTdma;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)\", \"PS TDMA\", \\\n\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\tpCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"Coex Table Type\", \\\n\t\t\tpCoexSta->nCoexTableType);\n\t\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\tpCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);\n\tCL_PRINTF(cliBuf);\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x778/0x880[29:25]/0xc58[29:25]\", \\\n\t\tu1Tmp[0], (u4Tmp[0]&0x3e000000) >> 25, ((u1Tmp[1]&0x3e)>>1));\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x764);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x764/ 0x765/ 0x76e\", \\\n\t\t(u4Tmp[0]&0xff), (u4Tmp[0]&0xff00)>>8, u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\t\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)\", \\\n\t\tu4Tmp[0]&0xff, ((u4Tmp[0]&0x30000000)>>28));\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x40/ 0x4c[24:23]/ 0x974\", \\\n\t\tu1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(dig)/0x49c(null-drop)\", \\\n\t\tu4Tmp[0]&0xff, u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);\n\tu4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\n\tfaOfdm = ((u4Tmp[0]&0xffff0000) >> 16) +  ((u4Tmp[1]&0xffff0000) >> 16) + (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \\\n\t\t             ((u4Tmp[3]&0xffff0000) >> 16) + (u4Tmp[3] & 0xffff) ;\n\tfaCck = (u1Tmp[0] << 8) + u1Tmp[1];\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"OFDM-CCA/OFDM-FA/CCK-FA\", \\\n\t\tu4Tmp[0]&0xffff, faOfdm, faCck);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_OK CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"CRC_Err CCK/11g/11n/11n-Agg\", \\\n\t\tpCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);\n\tCL_PRINTF(cliBuf);\t\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8/0x6cc(coexTable)\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770(high-pri rx/tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri rx/tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 1)\n\t//halbtc8821a2ant_MonitorBtCtr(pBtCoexist);\n#endif\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8821a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8821a2ant_WifiOffHwCfg(pBtCoexist);\n\t\thalbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\thalbtc8821a2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\t\thalbtc8821a2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8821a2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8821a2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tu1Byte \tu1Tmpa, u1Tmpb;\t\n\t\n\tu1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);\n\tu1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);\n\t \n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\\n\", u1Tmpa, u1Tmpb));\n}\n\nVOID\nEXhalbtc8821a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\tu1Byte\t\t\tapNum=0;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);\n\t\t\tif(apNum < 10)\n\t\t\t\tH2C_Parameter[2] = 0x30;\n\t\t\telse\n\t\t\t\tH2C_Parameter[2] = 0x20;\n\t\t}\n\t}\n\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\t\n}\n\nVOID\nEXhalbtc8821a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tPBTC_BT_LINK_INFO\tpBtLinkInfo=&pBtCoexist->btLinkInfo;\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bWifiUnder5G=FALSE;\n\tstatic BOOLEAN\t\tbPreScoExist=FALSE;\n\tu4Byte\t\t\t\traMask=0x0;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8821A_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8821A_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), return for Manual CTRL<===\\n\"));\n\t\treturn;\n\t}\n\n\t// if 0xff, it means BT is under WHCK test\n\tif (btInfo == 0xff)\n\t\tpCoexSta->bBtWhckTest = TRUE;\n\telse\n\t\tpCoexSta->bBtWhckTest = FALSE;\n\n\tif(BT_INFO_SRC_8821A_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\tpCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);\n\t\tif(pCoexSta->bBtTxRxMask)\n\t\t{\n\t\t\t/* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */\t\t\t\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\\n\"));\n\t\t\tpBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);\n\t\t}\n\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\\n\"));\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tif(!pBtCoexist->bManualControl && !bWifiUnder5G)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info = 0x%x!!\\n\", pCoexSta->btInfoExt));\n\t\t\tif( (pCoexSta->btInfoExt&BIT3) )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3=1, bWifiConnected=%d\\n\", bWifiConnected));\n\t\t\t\tif(bWifiConnected)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\t\thalbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3=0, bWifiConnected=%d\\n\", bWifiConnected));\n\t\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t\t\tif(!bWifiConnected)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\\n\"));\n\t\t\t\t\thalbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 0)\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821a2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n#endif\n\t}\n\n\t// check BIT2 first ==> check if bt is under inquiry or page scan\n\tif(btInfo & BT_INFO_8821A_2ANT_B_INQ_PAGE)\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\telse\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\n\t// set link exist status\n\tif(!(btInfo&BT_INFO_8821A_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t}\n\telse\t// connection exists\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tif(btInfo & BT_INFO_8821A_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\t\tif(btInfo & BT_INFO_8821A_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\t\n\t\tif ( (pCoexSta->bHidExist == FALSE) && (pCoexSta->bC2hBtInquiryPage == FALSE) && (pCoexSta->bScoExist == FALSE))\n\t\t{\n\t\t\tif (pCoexSta->highPriorityTx  + pCoexSta->highPriorityRx >= 160) \n\t\t\t\tpCoexSta->bHidExist = TRUE;\n\t\t}\n\t}\n\n\thalbtc8821a2ant_UpdateBtLinkInfo(pBtCoexist);\n\t\n\tif(!(btInfo&BT_INFO_8821A_2ANT_B_CONNECTION))\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\\n\"));\n\t}\n\telse if(btInfo == BT_INFO_8821A_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\\n\"));\n\t}\n\telse if((btInfo&BT_INFO_8821A_2ANT_B_SCO_ESCO) ||\n\t\t(btInfo&BT_INFO_8821A_2ANT_B_SCO_BUSY))\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_SCO_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT SCO busy!!!\\n\"));\n\t}\n\telse if(btInfo&BT_INFO_8821A_2ANT_B_ACL_BUSY)\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_ACL_BUSY;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT ACL busy!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_2ANT_BT_STATUS_MAX;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\\n\"));\n\t}\n\t\n\tif( (BT_8821A_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||\n\t\t(BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )\n\t{\n\t\tbBtBusy = TRUE;\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t\tbLimitedDig = FALSE;\n\t}\n\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8821a2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8821a2ant_WifiOffHwCfg(pBtCoexist);\n\t//remove due to interrupt is disabled that polling c2h will fail and delay 100ms.\n\t//pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\n\thalbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\n\tEXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8821a2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t\thalbtc8821a2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\thalbtc8821a2ant_InitCoexDm(pBtCoexist);\n\t\thalbtc8821a2ant_QueryBtInfo(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\t//static u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(pCoexSta->disVerInfoCnt <= 5)\n\t{\n\t\tpCoexSta->disVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8821a2Ant, GLCoexVer8821a2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\n\t\tif (pCoexSta->disVerInfoCnt == 3)\n\t\t{\n\t\t\t//Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial \n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Set GNT_BT control by PTA\\n\"));\n\t\t\thalbtc8821a2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, FALSE, FALSE);\n\t\t}\n\t}\n\n#if(BT_AUTO_REPORT_ONLY_8821A_2ANT == 0)\n\thalbtc8821a2ant_QueryBtInfo(pBtCoexist);\t\n\thalbtc8821a2ant_MonitorBtEnableDisable(pBtCoexist);\n#else\n\thalbtc8821a2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8821a2ant_MonitorWiFiCtr(pBtCoexist);\n\t\n\tif( halbtc8821a2ant_IsWifiStatusChanged(pBtCoexist) ||\n\t\tpCoexDm->bAutoTdmaAdjust)\n\t{\n\t\thalbtc8821a2ant_RunCoexistMechanism(pBtCoexist);\n\t}\n#endif\n}\n\n\n#endif\n\n#else\t// #if (RTL8821A_SUPPORT == 1)\nVOID\nEXhalbtc8821a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t){}\nVOID\nEXhalbtc8821a2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t){}\nVOID\nEXhalbtc8821a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t){}\nVOID\nEXhalbtc8821a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t){}\nVOID\nEXhalbtc8821a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t){}\nVOID\nEXhalbtc8821a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t){}\nVOID\nEXhalbtc8821a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t){}\nVOID\nEXhalbtc8821a2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t){}\nVOID\nEXhalbtc8821a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t){}\nVOID\nEXhalbtc8821a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t){}\n#endif\t// #if (RTL8821A_SUPPORT == 1)"
  },
  {
    "path": "hal/btc/HalBtc8821a2Ant.h",
    "content": "//===========================================\n// The following is for 8821A 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_AUTO_REPORT_ONLY_8821A_2ANT\t\t\t\t1\n\n\n#define\tBT_INFO_8821A_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8821A_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8821A_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8821A_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8821A_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8821A_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8821A_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8821A_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8821A_2ANT\t\t2\n\n\n#define\tBT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES\t\t\t\t42  //WiFi RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n#define\tBT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES\t\t\t\t46 //BT RSSI Threshold for 2-Ant TDMA/1-Ant PS-TDMA translation\n\ntypedef enum _BT_INFO_SRC_8821A_2ANT{\n\tBT_INFO_SRC_8821A_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8821A_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8821A_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8821A_2ANT_MAX\n}BT_INFO_SRC_8821A_2ANT,*PBT_INFO_SRC_8821A_2ANT;\n\ntypedef enum _BT_8821A_2ANT_BT_STATUS{\n\tBT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE\t= 0x0,\n\tBT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE\t\t= 0x1,\n\tBT_8821A_2ANT_BT_STATUS_INQ_PAGE\t\t\t\t= 0x2,\n\tBT_8821A_2ANT_BT_STATUS_ACL_BUSY\t\t\t\t= 0x3,\n\tBT_8821A_2ANT_BT_STATUS_SCO_BUSY\t\t\t\t= 0x4,\n\tBT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY\t\t\t= 0x5,\n\tBT_8821A_2ANT_BT_STATUS_MAX\n}BT_8821A_2ANT_BT_STATUS,*PBT_8821A_2ANT_BT_STATUS;\n\ntypedef enum _BT_8821A_2ANT_COEX_ALGO{\n\tBT_8821A_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8821A_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8821A_2ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8821A_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8821A_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8821A_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8821A_2ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8821A_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8821A_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8821A_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8821A_2ANT_COEX_ALGO,*PBT_8821A_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8821A_2ANT{\n\t// fw mechanism\n\tu1Byte\t\tpreBtDecPwrLvl;\n\tu1Byte\t\tcurBtDecPwrLvl;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[5];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbAutoTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n\n\tBOOLEAN\t\tbNeedRecover0x948;\n\tu4Byte\t\tbackup0x948;\n\n\tu1Byte\t\tpreLps;\n\tu1Byte\t\tcurLps;\n\tu1Byte\t\tpreRpwm;\n\tu1Byte\t\tcurRpwm;\n} COEX_DM_8821A_2ANT, *PCOEX_DM_8821A_2ANT;\n\ntypedef struct _COEX_STA_8821A_2ANT{\t\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8821A_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8821A_2ANT_MAX];\n\tBOOLEAN \t\t\t\tbBtWhckTest;\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n\n\tu4Byte\t\t\t\t\tnCRCOK_CCK;\n\tu4Byte\t\t\t\t\tnCRCOK_11g;\n\tu4Byte\t\t\t\t\tnCRCOK_11n;\n\tu4Byte\t\t\t\t\tnCRCOK_11nAgg;\n\t\n\tu4Byte\t\t\t\t\tnCRCErr_CCK;\n\tu4Byte\t\t\t\t\tnCRCErr_11g;\n\tu4Byte\t\t\t\t\tnCRCErr_11n;\n\tu4Byte\t\t\t\t\tnCRCErr_11nAgg;\n\n\tu1Byte\t\t\t\t\tnCoexTableType;\n\tBOOLEAN\t\t\t\t\tbForceLpsOn;\n\n\tu1Byte\t\t\t\t\tdisVerInfoCnt;\n}COEX_STA_8821A_2ANT, *PCOEX_STA_8821A_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8821a2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a2ant_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8821a2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821a2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8821a2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8821a2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821a2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtc8821aCsr2Ant.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for RTL8821A_CSR_CSR Co-exist mechanism\n//\n// History\n// 2012/08/22 Cosa first check in.\n// 2012/11/14 Cosa Revise for 8821A_CSR 2Ant out sourcing.\n//\n//============================================================\n\n//============================================================\n// include files\n//============================================================\n#include \"Mp_Precomp.h\"\n\n#if WPP_SOFTWARE_TRACE\n#include \"HalBtcCsr8821a2Ant.tmh\"\n#endif\n\n#define _BTCOEX_CSR 1\n\n#ifndef rtw_warn_on\n\t#define rtw_warn_on(condition) do {} while (0)\n#endif\n\n#if(BT_30_SUPPORT == 1)\n//============================================================\n// Global variables, these are static variables\n//============================================================\nstatic COEX_DM_8821A_CSR_2ANT\tGLCoexDm8821aCsr2Ant;\nstatic PCOEX_DM_8821A_CSR_2ANT \tpCoexDm=&GLCoexDm8821aCsr2Ant;\nstatic COEX_STA_8821A_CSR_2ANT\tGLCoexSta8821aCsr2Ant;\nstatic PCOEX_STA_8821A_CSR_2ANT\tpCoexSta=&GLCoexSta8821aCsr2Ant;\n\nconst char *const GLBtInfoSrc8821aCsr2Ant[]={\n\t\"BT Info[wifi fw]\",\n\t\"BT Info[bt rsp]\",\n\t\"BT Info[bt auto report]\",\n};\n\nu4Byte GLCoexVerDate8821aCsr2Ant=20140901;\nu4Byte GLCoexVer8821aCsr2Ant=0x51;\n\n//============================================================\n// local function proto type if needed\n//============================================================\n//============================================================\n// local function start with halbtc8821aCsr2ant_\n//============================================================\nu1Byte\nhalbtc8821aCsr2ant_BtRssiState(\n\tu1Byte\t\t\tlevelNum,\n\tu1Byte\t\t\trssiThresh,\n\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\tbtRssi=0;\n\tu1Byte\t\t\tbtRssiState=pCoexSta->preBtRssiState;\n\n\tbtRssi = pCoexSta->btRssi;\n\n\tif(levelNum == 2)\n\t{\t\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT Rssi thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preBtRssiState;\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(btRssi < rssiThresh)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbtRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preBtRssiState = btRssiState;\n\n\treturn btRssiState;\n}\n\nu1Byte\nhalbtc8821aCsr2ant_WifiRssiState(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tindex,\n\tIN\tu1Byte\t\t\tlevelNum,\n\tIN\tu1Byte\t\t\trssiThresh,\n\tIN\tu1Byte\t\t\trssiThresh1\n\t)\n{\n\ts4Byte\t\t\twifiRssi=0;\n\tu1Byte\t\t\twifiRssiState=pCoexSta->preWifiRssiState[index];\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\t\n\tif(levelNum == 2)\n\t{\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\telse if(levelNum == 3)\n\t{\n\t\tif(rssiThresh > rssiThresh1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], wifi RSSI thresh error!!\\n\"));\n\t\t\treturn pCoexSta->preWifiRssiState[index];\n\t\t}\n\t\t\n\t\tif( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_LOW;\n\t\t\t}\n\t\t}\n\t\telse if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||\n\t\t\t(pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))\n\t\t{\n\t\t\tif(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_HIGH;\n\t\t\t}\n\t\t\telse if(wifiRssi < rssiThresh)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_LOW;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(wifiRssi < rssiThresh1)\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_MEDIUM;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twifiRssiState = BTC_RSSI_STATE_STAY_HIGH;\n\t\t\t}\n\t\t}\n\t}\n\t\t\n\tpCoexSta->preWifiRssiState[index] = wifiRssiState;\n\n\treturn wifiRssiState;\n}\n\nVOID\nhalbtc8821aCsr2ant_MonitorBtEnableDisable(\n\tIN \tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tstatic BOOLEAN\tbPreBtDisabled=FALSE;\n\tstatic u4Byte\tbtDisableCnt=0;\n\tBOOLEAN\t\t\tbBtActive=TRUE, bBtDisabled=FALSE;\n\n\t// This function check if bt is disabled\n\n\tif(\tpCoexSta->highPriorityTx == 0 &&\n\t\tpCoexSta->highPriorityRx == 0 &&\n\t\tpCoexSta->lowPriorityTx == 0 &&\n\t\tpCoexSta->lowPriorityRx == 0)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(\tpCoexSta->highPriorityTx == 0xffff &&\n\t\tpCoexSta->highPriorityRx == 0xffff &&\n\t\tpCoexSta->lowPriorityTx == 0xffff &&\n\t\tpCoexSta->lowPriorityRx == 0xffff)\n\t{\n\t\tbBtActive = FALSE;\n\t}\n\tif(bBtActive)\n\t{\n\t\tbtDisableCnt = 0;\n\t\tbBtDisabled = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is enabled !!\\n\"));\n\t}\n\telse\n\t{\n\t\tbtDisableCnt++;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], bt all counters=0, %d times!!\\n\", \n\t\t\t\tbtDisableCnt));\n\t\tif(btDisableCnt >= 2)\n\t\t{\n\t\t\tbBtDisabled = TRUE;\n\t\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is disabled !!\\n\"));\n\t\t}\n\t}\n\tif(bPreBtDisabled != bBtDisabled)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is from %s to %s!!\\n\", \n\t\t\t(bPreBtDisabled ? \"disabled\":\"enabled\"), \n\t\t\t(bBtDisabled ? \"disabled\":\"enabled\")));\n\t\tbPreBtDisabled = bBtDisabled;\n\t\tif(!bBtDisabled)\n\t\t{\n\t\t}\n\t\telse\n\t\t{\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_MonitorBtCtr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu4Byte \t\t\tregHPTxRx, regLPTxRx, u4Tmp;\n\tu4Byte\t\t\tregHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;\n\tu1Byte\t\t\tu1Tmp;\n\t\n\tregHPTxRx = 0x770;\n\tregLPTxRx = 0x774;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);\n\tregHPTx = u4Tmp & bMaskLWord;\n\tregHPRx = (u4Tmp & bMaskHWord)>>16;\n\n\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);\n\tregLPTx = u4Tmp & bMaskLWord;\n\tregLPRx = (u4Tmp & bMaskHWord)>>16;\n\t\t\n\tpCoexSta->highPriorityTx = regHPTx;\n\tpCoexSta->highPriorityRx = regHPRx;\n\tpCoexSta->lowPriorityTx = regLPTx;\n\tpCoexSta->lowPriorityRx = regLPRx;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\\n\", \n\t\tregLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));\n\n\t// reset counter\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x5d);\n}\n\nVOID\nhalbtc8821aCsr2ant_UpdateRaMask(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\t\tdisRateMask\n\t)\n{\n\tpCoexDm->curRaMask = disRateMask;\n\t\n\tif( bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))\n\t{\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_UPDATE_RAMASK, &pCoexDm->curRaMask);\n\t}\n\tpCoexDm->preRaMask = pCoexDm->curRaMask;\n}\n\nVOID\nhalbtc8821aCsr2ant_AutoRateFallbackRetry(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tBOOLEAN\tbWifiUnderBMode=FALSE;\n\t\n\tpCoexDm->curArfrType = type;\n\n\tif( bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType))\n\t{\n\t\tswitch(pCoexDm->curArfrType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, pCoexDm->backupArfrCnt1);\n\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, pCoexDm->backupArfrCnt2);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t\n\t\t\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\t\t\t\tif(bWifiUnderBMode)\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);\n\t\t\t\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preArfrType = pCoexDm->curArfrType;\n}\n\nVOID\nhalbtc8821aCsr2ant_RetryLimit(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curRetryLimitType = type;\n\n\tif( bForceExec || (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType))\n\t{\n\t\tswitch(pCoexDm->curRetryLimitType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, pCoexDm->backupRetryLimit);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// retry limit=8\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;\n}\n\nVOID\nhalbtc8821aCsr2ant_AmpduMaxTime(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduTimeType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType))\n\t{\n\t\tswitch(pCoexDm->curAmpduTimeType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime);\n\t\t\t\tbreak;\n\t\t\tcase 1:\t// AMPDU timw = 0x38 * 32us\n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);\n\t\t\t\tbreak;\n\t\t\tcase 2: \n\t\t\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x17);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;\n}\n\nVOID\nhalbtc8821aCsr2Ant_AmpduMaxNum(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tpCoexDm->curAmpduNumType = type;\n\n\tif( bForceExec || (pCoexDm->preAmpduNumType != pCoexDm->curAmpduNumType))\n\t{\n\t\tswitch(pCoexDm->curAmpduNumType)\n\t\t{\n\t\t\tcase 0:\t// normal mode\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, pCoexDm->backupAmpduMaxNum);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, 0x0808);\n\t\t\t\tbreak;\n\t\t\tcase 2: \n\t\t\t\tpBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x4ca, 0x1f1f);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpCoexDm->preAmpduNumType = pCoexDm->curAmpduNumType;\n\n}\n\nVOID\nhalbtc8821aCsr2ant_LimitedTx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\t\traMaskType,\n\tIN\tu1Byte\t\t\t\tarfrType,\n\tIN\tu1Byte\t\t\t\tretryLimitType,\n\tIN\tu1Byte\t\t\t\tampduTimeType,\n\tIN\tu1Byte\t\t\t\tampduNumType\n\t)\n{\n\tswitch(raMaskType)\n\t{\n\t\tcase 0:\t// normal mode\n\t\t\thalbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0);\n\t\t\tbreak;\n\t\tcase 1:\t// disable cck 1/2\n\t\t\thalbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x00000003);\n\t\t\tbreak;\n\t\tcase 2:\t// disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4\n\t\t\thalbtc8821aCsr2ant_UpdateRaMask(pBtCoexist, bForceExec, 0x0001f1f7);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\thalbtc8821aCsr2ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType);\n\thalbtc8821aCsr2ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType);\n\thalbtc8821aCsr2ant_AmpduMaxTime(pBtCoexist, bForceExec, ampduTimeType);\n\thalbtc8821aCsr2Ant_AmpduMaxNum(pBtCoexist, bForceExec, ampduNumType);\n}\n\n\n\nVOID\nhalbtc8821aCsr2ant_LimitedRx(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\t\tbRejApAggPkt,\n\tIN\tBOOLEAN\t\t\t\tbBtCtrlAggBufSize,\n\tIN\tu1Byte\t\t\t\taggBufSize\n\t)\n{\n\tBOOLEAN\tbRejectRxAgg=bRejApAggPkt;\n\tBOOLEAN\tbBtCtrlRxAggSize=bBtCtrlAggBufSize;\n\tu1Byte\trxAggSize=aggBufSize;\n\n\t//============================================\n\t//\tRx Aggregation related setting\n\t//============================================\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);\n\t// decide BT control aggregation buf size or not\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);\n\t// aggregation buf size, only work when BT control Rx aggregation size.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);\n\t// real update aggregation setting\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);\n}\n\nVOID\nhalbtc8821aCsr2ant_QueryBtInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\tpCoexSta->bC2hBtInfoReqSent = TRUE;\n\n\tH2C_Parameter[0] |= BIT0;\t// trigger\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Query Bt Info, FW write 0x61=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\trtw_warn_on(_BTCOEX_CSR);\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);\n}\n\nu1Byte\nhalbtc8821aCsr2ant_ActionAlgorithm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbBtHsOn=FALSE;\n\tu1Byte\t\t\t\talgorithm=BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED;\n\tu1Byte\t\t\t\tnumOfDiffProfile=0;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\t//sync StackInfo with BT firmware and stack\n\tpStackInfo->bHidExist = pCoexSta->bHidExist;\n\tpStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;\n\tpStackInfo->bScoExist = pCoexSta->bScoExist;\n\tpStackInfo->bPanExist = pCoexSta->bPanExist;\n\tpStackInfo->bA2dpExist = pCoexSta->bA2dpExist;\n\n\tif(!pStackInfo->bBtLinkExist)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], No profile exists!!!\\n\"));\n\t\treturn algorithm;\n\t}\n\n\tif(pStackInfo->bScoExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bHidExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bPanExist)\n\t\tnumOfDiffProfile++;\n\tif(pStackInfo->bA2dpExist)\n\t\tnumOfDiffProfile++;\n\t\n\tif(numOfDiffProfile == 1)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO only\\n\"));\n\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID only\\n\"));\n\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP only\\n\"));\n\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(HS) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PAN(EDR) only\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 2)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif(pStackInfo->bHidExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID\\n\"));\n\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bA2dpExist)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP ==> SCO\\n\"));\n\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if(pStackInfo->bPanExist)\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(pStackInfo->numOfHid >= 2)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID*2 + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm =  BT_8821A_CSR_2ANT_COEX_ALGO_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile == 3)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP ==> HID\\n\"));\n\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t}\n\t\t\telse if( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if( pStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(HS)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], HID + A2DP + PAN(EDR)\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(numOfDiffProfile >= 3)\n\t{\n\t\tif(pStackInfo->bScoExist)\n\t\t{\n\t\t\tif( pStackInfo->bHidExist &&\n\t\t\t\tpStackInfo->bPanExist &&\n\t\t\t\tpStackInfo->bA2dpExist )\n\t\t\t{\n\t\t\t\tif(bBtHsOn)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\\n\"));\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\\n\"));\n\t\t\t\t\talgorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn algorithm;\n}\n\nBOOLEAN\nhalbtc8821aCsr2ant_NeedToDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\tbRet=FALSE;\n\tBOOLEAN\t\tbBtHsOn=FALSE, bWifiConnected=FALSE;\n\ts4Byte\t\tbtHsRssi=0;\n\tu1Byte \t\tbtRssiState;\n\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))\n\t\treturn FALSE;\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))\n\t\treturn FALSE;\n\tif(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))\n\t\treturn FALSE;\n\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\tif(bWifiConnected)\n\t{\n\t\tif(bBtHsOn)\n\t\t{\n\t\t\tif(btHsRssi > 37)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Need to decrease bt power for HS mode!!\\n\"));\n\t\t\t\tbRet = TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t\t{\n\t\t\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Need to decrease bt power for Wifi is connected!!\\n\"));\n\t\t\t\tbRet = TRUE;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn bRet;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetFwDacSwingLevel(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdacSwingLvl\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\n\t// There are several type of dacswing\n\t// 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6\n\tH2C_Parameter[0] = dacSwingLvl;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Set Dac Swing Level=0x%x\\n\", dacSwingLvl));\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x64=0x%x\\n\", H2C_Parameter[0]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8821aCsr2ant_SetFwDecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbDecBtPwr\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bDecBtPwr)\n\t{\n\t\tH2C_Parameter[0] |= BIT1;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\\n\", \n\t\t(bDecBtPwr? \"Yes!!\":\"No!!\"), H2C_Parameter[0]));\n\n\trtw_warn_on(_BTCOEX_CSR);\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8821aCsr2ant_DecBtPwr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDecBtPwr\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s Dec BT power = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDecBtPwr)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurDecBtPwr = bDecBtPwr;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr) \n\t\t\treturn;\n\t}\n\n\t/* TODO: may CSR consider to decrease BT power? */\n\t//halbtc8821aCsr2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);\n\n\tpCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetBtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\n\tH2C_Parameter[0] = 0;\n\n\tif(bEnableAutoReport)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\\n\", \n\t\t(bEnableAutoReport? \"Enabled!!\":\"Disabled!!\"), H2C_Parameter[0]));\n\n\trtw_warn_on(_BTCOEX_CSR);\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);\t\n}\n\nVOID\nhalbtc8821aCsr2ant_BtAutoReport(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnableAutoReport\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s BT Auto report = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bEnableAutoReport)? \"Enabled\":\"Disabled\")));\n\tpCoexDm->bCurBtAutoReport = bEnableAutoReport;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport) \n\t\t\treturn;\n\t}\n\t//halbtc8821aCsr2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);\n\n\tpCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;\n}\n\nVOID\nhalbtc8821aCsr2ant_FwDacSwingLvl(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu1Byte\t\t\tfwDacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s set FW Dac Swing level = %d\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), fwDacSwingLvl));\n\tpCoexDm->curFwDacSwingLvl = fwDacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl) \n\t\t\treturn;\n\t}\n\n\thalbtc8821aCsr2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);\n\n\tpCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetSwRfRxLpfCorner(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tif(bRxRfShrinkOn)\n\t{\n\t\t//Shrink RF Rx LPF corner\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Shrink RF Rx LPF corner!!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);\n\t}\n\telse\n\t{\n\t\t//Resume RF Rx LPF corner\n\t\t// After initialized, we can use pCoexDm->btRf0x1eBackup\n\t\tif(pBtCoexist->bInitilized)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Resume RF Rx LPF corner!!\\n\"));\n\t\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_RfShrink(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbRxRfShrinkOn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Rx RF Shrink = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bRxRfShrinkOn)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink) \n\t\t\treturn;\n\t}\n\thalbtc8821aCsr2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);\n\n\tpCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\t\n\tH2C_Parameter[0] = 0x6;\t// opCode, 0x6= Retry_Penalty\n\n\tif(bLowPenaltyRa)\n\t{\n\t\tH2C_Parameter[1] |= BIT0;\n\t\tH2C_Parameter[2] = 0x00;  //normal rate except MCS7/6/5, OFDM54/48/36\n\t\tH2C_Parameter[3] = 0xf7;  //MCS7 or OFDM54\n\t\tH2C_Parameter[4] = 0xf8;  //MCS6 or OFDM48\n\t\tH2C_Parameter[5] = 0xf9;\t//MCS5 or OFDM36\t\n\t}\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set WiFi Low-Penalty Retry: %s\", \n\t\t(bLowPenaltyRa? \"ON!!\":\"OFF!!\") ));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8821aCsr2ant_LowPenaltyRa(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbLowPenaltyRa\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn LowPenaltyRA = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bLowPenaltyRa)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa) \n\t\t\treturn;\n\t}\n\thalbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);\n\n\tpCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetDacSwingReg(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\tlevel\n\t)\n{\n\tu1Byte\tval=(u1Byte)level;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Write SwDacSwing = 0x%x\\n\", level));\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);\n}\n\nVOID\nhalbtc8821aCsr2ant_SetSwFullTimeDacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbSwDacSwingOn,\n\tIN\tu4Byte\t\t\tswDacSwingLvl\n\t)\n{\n\tif(bSwDacSwingOn)\n\t{\n\t\thalbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);\n\t}\n\telse\n\t{\n\t\thalbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, 0x18);\n\t}\n}\n\n\nVOID\nhalbtc8821aCsr2ant_DacSwing(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbDacSwingOn,\n\tIN\tu4Byte\t\t\tdacSwingLvl\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bDacSwingOn)? \"ON\":\"OFF\"), dacSwingLvl));\n\tpCoexDm->bCurDacSwingOn = bDacSwingOn;\n\tpCoexDm->curDacSwingLvl = dacSwingLvl;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&\n\t\t\t(pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )\n\t\t\treturn;\n\t}\n\tdelay_ms(30);\n\thalbtc8821aCsr2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);\n\n\tpCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;\n\tpCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetAdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tif(bAdcBackOff)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level On!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BB BackOff Level Off!\\n\"));\n\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_AdcBackOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAdcBackOff\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn AdcBackOff = %s\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAdcBackOff)? \"ON\":\"OFF\")));\n\tpCoexDm->bCurAdcBackOff = bAdcBackOff;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff) \n\t\t\treturn;\n\t}\n\thalbtc8821aCsr2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);\n\n\tpCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetAgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tu1Byte\t\trssiAdjustVal=0;\n\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);\n\tif(bAgcTableEn)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table On!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x28F4B);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff,  0x10AB2);\n\t\trssiAdjustVal = 8;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Agc Table Off!\\n\"));\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B);\n\t\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2);\n\t}\n\tpBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);\n\n\t// set rssiAdjustVal for wifi module.\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);\n}\n\nVOID\nhalbtc8821aCsr2ant_AgcTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbAgcTableEn\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s %s Agc Table\\n\",  \n\t\t(bForceExec? \"force to\":\"\"), ((bAgcTableEn)? \"Enable\":\"Disable\")));\n\tpCoexDm->bCurAgcTableEn = bAgcTableEn;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn) \n\t\t\treturn;\n\t}\n\thalbtc8821aCsr2ant_SetAgcTable(pBtCoexist, bAgcTableEn);\n\n\tpCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetCoexTable(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\n\tIN\tu4Byte\t\tval0x6c0,\n\tIN\tu4Byte\t\tval0x6c4,\n\tIN\tu4Byte\t\tval0x6c8,\n\tIN\tu1Byte\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c0=0x%x\\n\", val0x6c0));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c4=0x%x\\n\", val0x6c4));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6c8=0x%x\\n\", val0x6c8));\n\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set coex table, set 0x6cc=0x%x\\n\", val0x6cc));\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);\n}\n\nVOID\nhalbtc8821aCsr2ant_CoexTable(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tu4Byte\t\t\tval0x6c0,\n\tIN\tu4Byte\t\t\tval0x6c4,\n\tIN\tu4Byte\t\t\tval0x6c8,\n\tIN\tu1Byte\t\t\tval0x6cc\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\\n\", \n\t\t(bForceExec? \"force to\":\"\"), val0x6c0, val0x6c4, val0x6c8, val0x6cc));\n\tpCoexDm->curVal0x6c0 = val0x6c0;\n\tpCoexDm->curVal0x6c4 = val0x6c4;\n\tpCoexDm->curVal0x6c8 = val0x6c8;\n\tpCoexDm->curVal0x6cc = val0x6cc;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&\n\t\t\t(pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&\n\t\t\t(pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&\n\t\t\t(pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )\n\t\t\treturn;\n\t}\n\thalbtc8821aCsr2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);\n\n\tpCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;\n\tpCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;\n\tpCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;\n\tpCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetFwIgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[1] ={0};\n\t\t\n\tif(bEnable)\n\t{\n\t\tH2C_Parameter[0] |= BIT0;\t\t// function enable\n\t}\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\\n\", \n\t\tH2C_Parameter[0]));\n\n\trtw_warn_on(_BTCOEX_CSR);\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);\n}\n\nVOID\nhalbtc8821aCsr2ant_IgnoreWlanAct(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbEnable\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn Ignore WlanAct %s\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bEnable? \"ON\":\"OFF\")));\n\tpCoexDm->bCurIgnoreWlanAct = bEnable;\n\n\tif(!bForceExec)\n\t{\n\t\tif(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)\n\t\t\treturn;\n\t}\n\t//halbtc8821aCsr2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);\n\n\tpCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;\n}\n\nVOID\nhalbtc8821aCsr2ant_SetFwPstdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tbyte1,\n\tIN\tu1Byte\t\t\tbyte2,\n\tIN\tu1Byte\t\t\tbyte3,\n\tIN\tu1Byte\t\t\tbyte4,\n\tIN\tu1Byte\t\t\tbyte5\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[6] ={0};\n\n\tH2C_Parameter[0] = byte1;\t\n\tH2C_Parameter[1] = byte2;\t\n\tH2C_Parameter[2] = byte3;\n\tH2C_Parameter[3] = byte4;\n\tH2C_Parameter[4] = byte5;\n\tH2C_Parameter[5] = 0x01;\n\n\tpCoexDm->psTdmaPara[0] = byte1;\n\tpCoexDm->psTdmaPara[1] = byte2;\n\tpCoexDm->psTdmaPara[2] = byte3;\n\tpCoexDm->psTdmaPara[3] = byte4;\n\tpCoexDm->psTdmaPara[4] = byte5;\n\tpCoexDm->psTdmaPara[5] = 0x01;\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x60(6bytes)=0x%x%08x%02x\\n\", \n\t\tH2C_Parameter[0], \n\t\tH2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4], H2C_Parameter[5]));\n\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 6, H2C_Parameter);\n}\n\nVOID\nhalbtc8821aCsr2ant_SwMechanism1(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbShrinkRxLPF,\n\tIN\tBOOLEAN \tbLowPenaltyRA,\n\tIN\tBOOLEAN\t\tbLimitedDIG, \n\tIN\tBOOLEAN\t\tbBTLNAConstrain\n\t) \n{\n\tu4Byte\twifiBw;\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\n\tif(BTC_WIFI_BW_HT40 != wifiBw)  //only shrink RF Rx LPF for HT40\n\t{\n\t\tif (bShrinkRxLPF)\n\t\t\tbShrinkRxLPF = FALSE;\n\t}\n\t \t\n\t halbtc8821aCsr2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);\n\thalbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);\n\n  \t//no limited DIG\n\t//halbtc8821aCsr2ant_SetBtLnaConstrain(pBtCoexist, NORMAL_EXEC, bBTLNAConstrain);\n}\n\nVOID\nhalbtc8821aCsr2ant_SwMechanism2(\n\tIN\tPBTC_COEXIST\tpBtCoexist,\t\n\tIN\tBOOLEAN\t\tbAGCTableShift,\n\tIN\tBOOLEAN \tbADCBackOff,\n\tIN\tBOOLEAN\t\tbSWDACSwing,\n\tIN\tu4Byte\t\tdacSwingLvl\n\t) \n{\n\t//halbtc8821aCsr2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);\n\thalbtc8821aCsr2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);\n\thalbtc8821aCsr2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);\n}\n\nVOID\nhalbtc8821aCsr2ant_SetAntPath(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tantPosType,\n\tIN\tBOOLEAN\t\t\t\tbInitHwCfg,\n\tIN\tBOOLEAN\t\t\t\tbWifiOff\n\t)\n{\n\tPBTC_BOARD_INFO \tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\t\t\t\tu4Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\n\tif(bInitHwCfg)\n\t{\n\t\t// 0x4c[23]=0, 0x4c[24]=1  Antenna control by WL/BT\n\t\tu4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\t\tu4Tmp &=~BIT23;\n\t\tu4Tmp |= BIT24;\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);\n\n\t\tpBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x974, 0x3ff);\n\t\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);\n\n\t\tif(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) \n\t\t{\n\t\t\t//tell firmware \"antenna inverse\"  ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 1;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//tell firmware \"no antenna inverse\" ==> WRONG firmware antenna control code.==>need fw to fix\n\t\t\tH2C_Parameter[0] = 0;\n\t\t\tH2C_Parameter[1] = 1;\n\t\t\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);\n\t\t}\n\t}\n\t\n\t// ext switch setting\n\tswitch(antPosType)\n\t{\n\t\tcase BTC_ANT_WIFI_AT_MAIN:\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);\n\t\t\tbreak;\n\t\tcase BTC_ANT_WIFI_AT_AUX:\n\t\t\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);\n\t\t\tbreak;\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_PsTdma(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbForceExec,\n\tIN\tBOOLEAN\t\t\tbTurnOn,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tBOOLEAN\t\t\tbTurnOnByCnt=FALSE;\n\tu1Byte\t\t\tpsTdmaTypeByCnt=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], %s turn %s PS TDMA, type=%d\\n\", \n\t\t(bForceExec? \"force to\":\"\"), (bTurnOn? \"ON\":\"OFF\"), type));\n\tpCoexDm->bCurPsTdmaOn = bTurnOn;\n\tpCoexDm->curPsTdma = type;\n\n\tif(!bForceExec)\n\t{\n\t\tif( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&\n\t\t\t(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )\n\t\t\treturn;\n\t}\t\n\tif(bTurnOn)\n\t{\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 1:\n\t\t\tdefault:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 8:\t\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 9:\t\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 10:\t\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 11:\t\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 12:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 15:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 16:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);\n\t\t\t\tbreak;\t\t\t\n\t\t\tcase 19:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 20:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 21:\t\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);\n\t\t\t\tbreak;\n\t\t\tcase 22:\t//ad2dp master\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xeb, 0x11, 0x11, 0x21, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 23:\t//a2dp slave\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xeb, 0x12, 0x12, 0x20, 0x10);\n\t\t\t\tbreak;\n\t\t\tcase 71:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// disable PS tdma\n\t\tswitch(type)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thalbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// update pre state\n\tpCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;\n\tpCoexDm->prePsTdma = pCoexDm->curPsTdma;\n}\n\nVOID\nhalbtc8821aCsr2ant_CoexAllOff(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\t// fw all off\n\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t// sw all off\n\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\n\t// hw all off\n\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\n}\n\nVOID\nhalbtc8821aCsr2ant_CoexUnder5G(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\thalbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\n\n\thalbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);\n}\n\nVOID\nhalbtc8821aCsr2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\t\n\t// force to reset coex mechanism\n\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\n\n\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);\n\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);\n\n\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n}\n\nVOID\nhalbtc8821aCsr2ant_BtInquiryPage(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\tbLowPwrDisable=TRUE;\n\t\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\n\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n}\nBOOLEAN\nhalbtc8821aCsr2ant_IsCommonAction(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tBOOLEAN\t\t\tbCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;\n\tBOOLEAN\t\t\tbLowPwrDisable=FALSE;\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\n\tif(!bWifiConnected && \n\t\tBT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi IPS + BT IPS!!\\n\"));\t\n\n\t\t\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\n \t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t\t(BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) )\n\t{\t\t\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\tif(bWifiBusy)\n\t\t{\t\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Busy + BT IPS!!\\n\"));\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi LPS + BT IPS!!\\n\"));\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\t\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t(BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tbLowPwrDisable = TRUE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi IPS + BT LPS!!\\n\"));\t\t\n\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(bWifiConnected && \n\t\t(BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tbLowPwrDisable = TRUE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\t\t\n\t\tif(bWifiBusy)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Busy + BT LPS!!\\n\"));\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi LPS + BT LPS!!\\n\"));\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\t\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\n\n\t\tbCommon = TRUE;\n\t}\n\telse if(!bWifiConnected && \n\t\t\t(BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )\n\t{\n\t\tbLowPwrDisable = FALSE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi IPS + BT Busy!!\\n\"));\t\n\n\t\t//halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 0);\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 0, 0, 0);\n\t\t\n\t\tbCommon = TRUE;\n\t}\n\telse\n\t{\n\t\tbLowPwrDisable = TRUE;\n\t\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);\n\n\t\tif(bWifiBusy)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi Busy + BT Busy!!\\n\"));\n\t  \t\tbCommon = FALSE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Wifi LPS + BT Busy!!\\n\"));\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);\n\n\t\t\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t\telse\t\n\t\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t\t\n\t\t\tbCommon = TRUE;\n\t\t}\n\n\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);\n\t}\n\n\tif (bCommon == TRUE)\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\n\n\treturn bCommon;\n}\nVOID\nhalbtc8821aCsr2ant_TdmaDurationAdjust(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\tbScoHid,\n\tIN\tBOOLEAN\t\t\tbTxPause,\n\tIN\tu1Byte\t\t\tmaxInterval\n\t)\n{\n\tstatic s4Byte\t\tup,dn,m,n,WaitCount;\n\ts4Byte\t\t\tresult;   //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration\n\tu1Byte\t\t\tretryCount=0;\n\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TdmaDurationAdjust()\\n\"));\n\n\tif(pCoexDm->bResetTdmaAdjust)\n\t{\n\t\tpCoexDm->bResetTdmaAdjust = FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], first run TdmaDurationAdjust()!!\\n\"));\n\t\t{\n\t\t\tif(bScoHid)\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(bTxPause)\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(maxInterval == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\t\n\t\t\t\t\t}\n\t\t\t\t\telse if(maxInterval == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//============\n\t\tup = 0;\n\t\tdn = 0;\n\t\tm = 1;\n\t\tn= 3;\n\t\tresult = 0;\n\t\tWaitCount = 0;\n\t}\n\telse\n\t{\n\t\t//accquire the BT TRx retry count from BT_Info byte2\n\t\tretryCount = pCoexSta->btRetryCnt;\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], retryCount = %d\\n\", retryCount));\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\\n\", \n\t\t\tup, dn, m, n, WaitCount));\n\t\tresult = 0;\n\t\tWaitCount++; \n\t\t  \n\t\tif(retryCount == 0)  // no retry in the last 2-second duration\n\t\t{\n\t\t\tup++;\n\t\t\tdn--;\n\n\t\t\tif (dn <= 0)\n\t\t\t\tdn = 0;\t\t\t\t \n\n\t\t\tif(up >= n)\t// if s n 2 retry count0, hռeWiFi duration\n\t\t\t{\n\t\t\t\tWaitCount = 0; \n\t\t\t\tn = 3;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tresult = 1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Increase wifi duration!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse if (retryCount <= 3)\t// <=3 retry in the last 2-second duration\n\t\t{\n\t\t\tup--; \n\t\t\tdn++;\n\n\t\t\tif (up <= 0)\n\t\t\t\tup = 0;\n\n\t\t\tif (dn == 2)\t// if s 2 2 retry count< 3, hկWiFi duration\n\t\t\t{\n\t\t\t\tif (WaitCount <= 2)\n\t\t\t\t\tm++; // קK@blevelӦ^\n\t\t\t\telse\n\t\t\t\t\tm = 1;\n\n\t\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\t\tm = 20;\n\n\t\t\t\tn = 3*m;\n\t\t\t\tup = 0;\n\t\t\t\tdn = 0;\n\t\t\t\tWaitCount = 0;\n\t\t\t\tresult = -1; \n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter<3!!\\n\"));\n\t\t\t}\n\t\t}\n\t\telse  //retry count > 3, un1 retry count > 3, hկWiFi duration\n\t\t{\n\t\t\tif (WaitCount == 1)\n\t\t\t\tm++; // קK@blevelӦ^\n\t\t\telse\n\t\t\t\tm = 1;\n\n\t\t\tif ( m >= 20) //m ̤j = 20 ' ̤j120 recheckO_վ WiFi duration.\n\t\t\t\tm = 20;\n\n\t\t\tn = 3*m;\n\t\t\tup = 0;\n\t\t\tdn = 0;\n\t\t\tWaitCount = 0; \n\t\t\tresult = -1;\n\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], Decrease wifi duration for retryCounter>3!!\\n\"));\n\t\t}\n\n\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], max Interval = %d\\n\", maxInterval));\n\t\tif(maxInterval == 1)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\n\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 5;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 13;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 71)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 71;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 2)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 6;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 14;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 2;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 10;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if(maxInterval == 3)\n\t\t{\n\t\t\tif(bTxPause)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 1\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 4)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 9)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 5) \n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 8;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 13)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 16;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 7;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 15;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], TxPause = 0\\n\"));\n\t\t\t\tif(pCoexDm->curPsTdma == 5)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 6)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 7)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 8)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t}\n\t\t\t\tif(pCoexDm->curPsTdma == 13)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 14)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 15)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t}\n\t\t\t\telse if(pCoexDm->curPsTdma == 16)\n\t\t\t\t{\n\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t}\n\t\t\t\tif(result == -1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 4;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 9)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 12;\n\t\t\t\t\t}\n\t\t\t\t} \n\t\t\t\telse if (result == 1)\n\t\t\t\t{\n\t\t\t\t\tif(pCoexDm->curPsTdma == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 3)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 3;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 12)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 11)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t\telse if(pCoexDm->curPsTdma == 10)\n\t\t\t\t\t{\n\t\t\t\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);\n\t\t\t\t\t\tpCoexDm->psTdmaDuAdjType = 11;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// if current PsTdma not match with the recorded one (when scan, dhcp...), \n\t// then we have to adjust it back to the previous record one.\n\tif(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)\n\t{\n\t\tBOOLEAN\tbScan=FALSE, bLink=FALSE, bRoam=FALSE;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\\n\", \n\t\t\tpCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));\n\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\t\t\n\t\tif( !bScan && !bLink && !bRoam)\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\\n\"));\n\t\t}\n\t}\n\n\t// when halbtc8821aCsr2ant_TdmaDurationAdjust() is called, fw dac swing is included in the function.\n\t//if(pCoexDm->psTdmaDuAdjType == 71)\n\t//\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xc); //Skip because A2DP get worse at HT40\n\t//else\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x6);\n}\n\n// SCO only or SCO+PAN(HS)\nVOID\nhalbtc8821aCsr2ant_ActionSco(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState,btRssiState;\n\tu4Byte\twifiBw;\n\n\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffffff, 0x3);\n\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);\n\n\thalbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);\n\n\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 1, 0, 2, 0);\n\n\tif(pCoexSta->bSlave == FALSE)\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x4);\n\telse\n\t\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x2);\n\n/*\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);\n\t}\n\telse  //for SCO quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\n\t\t// fw mechanism\n\t\t//halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\t//halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n*/\n}\n\n\nVOID\nhalbtc8821aCsr2ant_ActionHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\twifiRssiState, btRssiState;\t\n\tu4Byte\twifiBw;\n\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n \t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\n//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)\nVOID\nhalbtc8821aCsr2ant_ActionA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\thalbtc8821aCsr2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);\n\n\tif(pCoexSta->bSlave == FALSE)\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0xfdfdfdfd, 0xdfdadfda, 0xffffff, 0x3);\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 1);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x0c);\n\t}\n\telse\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0xfdfdfdfd, 0xdfdadfda, 0xffffff, 0x3);\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 23);\n\t\thalbtc8821aCsr2ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0, 2);\n\t\thalbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,TRUE,0x18);\n\t}\n\n/*\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\t//fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\n\t//halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n*/\n}\n\nVOID\nhalbtc8821aCsr2ant_ActionA2dpPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2,35, 0);\n\n\t//fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()\n\t//halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\t\t}\n\t\telse\t\t\t\t//a2dp edr rate\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n \t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);\n\t\t}\n\t\telse\t\t\t\t//a2dp edr rate\n\t\t{\n\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\t\t\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_ActionPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n\n//PAN(HS) only\nVOID\nhalbtc8821aCsr2ant_ActionPanHs(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t}\n\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\t\t}\n\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n//PAN(EDR)+A2DP\nVOID\nhalbtc8821aCsr2ant_ActionPanEdrA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t};\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_ActionPanEdrHid(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState;\n\tu4Byte\t\twifiBw;\n\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{ \n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10); \n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14); \n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\n// HID+A2DP+PAN(EDR)\nVOID\nhalbtc8821aCsr2ant_ActionHidA2dpPanEdr(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\thalbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_ActionHidA2dp(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tu1Byte\t\twifiRssiState, btRssiState, btInfoExt;\n\tu4Byte\t\twifiBw;\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\twifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);\n\tbtRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);\n\n\tif(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);\n\telse\t\n\t\thalbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\n\tif (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode\n\t{\n//Allen\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\n\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\n\t}\n\telse  //for HID quality & wifi performance balance at 11n mode\n\t{\n//Allen\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);\n\t\t\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);\n\n\t}\n\n\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// fw mechanism\n\t\tif( (btRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n//\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n//Allen\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(btInfoExt&BIT0)\t//a2dp basic rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t\telse\t\t\t\t//a2dp edr rate\n\t\t\t{\n\t\t\t\thalbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);\n\t\t\t}\n\t\t}\n\n\t\t// sw mechanism\n\t\tif( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||\n\t\t\t(wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);\n\t\t\t halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);\n\t\t}\n\t}\n}\n\nVOID\nhalbtc8821aCsr2ant_RunCoexistMechanism(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tBOOLEAN\t\t\t\tbWifiUnder5G=FALSE;\n\tu1Byte\t\t\t\tbtInfoOriginal=0, btRetryCnt=0;\n\tu1Byte\t\t\t\talgorithm=0;\n\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Manual control!!!\\n\"));\n\t\treturn;\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\n\tif(bWifiUnder5G)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\\n\"));\n\t\thalbtc8821aCsr2ant_CoexUnder5G(pBtCoexist);\n\t\treturn;\n\t}\n\n\t//if(pStackInfo->bProfileNotified)\n\t{\n\t\talgorithm = halbtc8821aCsr2ant_ActionAlgorithm(pBtCoexist);\n\t\tif(pCoexSta->bC2hBtInquiryPage && (BT_8821A_CSR_2ANT_COEX_ALGO_PANHS!=algorithm))\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT is under inquiry/page scan !!\\n\"));\n\t\t\thalbtc8821aCsr2ant_BtInquiryPage(pBtCoexist);\n\t\t\treturn;\n\t\t}\n\n\t\tpCoexDm->curAlgorithm = algorithm;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Algorithm = %d \\n\", pCoexDm->curAlgorithm));\n\n\t\tif(halbtc8821aCsr2ant_IsCommonAction(pBtCoexist))\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant common.\\n\"));\n\t\t\tpCoexDm->bResetTdmaAdjust = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], preAlgorithm=%d, curAlgorithm=%d\\n\", \n\t\t\t\t\tpCoexDm->preAlgorithm, pCoexDm->curAlgorithm));\n\t\t\t\tpCoexDm->bResetTdmaAdjust = TRUE;\n\t\t\t}\n\t\t\tswitch(pCoexDm->curAlgorithm)\n\t\t\t{\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_SCO:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = SCO.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionSco(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_HID:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionHid(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionA2dpPanHs(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionPanEdr(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_PANHS:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HS mode.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionPanHs(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionPanEdrA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionPanEdrHid(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionHidA2dpPanEdr(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tcase BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_ActionHidA2dp(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpCoexDm->preAlgorithm = pCoexDm->curAlgorithm;\n\t\t}\n\t}\n}\n\n\n\n//============================================================\n// work around function start with wa_halbtc8821aCsr2ant_\n//============================================================\n//============================================================\n// extern function start with EXhalbtc8821aCsr2ant_\n//============================================================\nVOID\nEXhalbtc8821aCsr2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n}\n\nVOID\nEXhalbtc8821aCsr2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tu4Byte\tu4Tmp=0;\n\tu2Byte\t\t\t\tu2Tmp=0;\n\tu1Byte\tu1Tmp=0;\n\tu1Byte\t\t\t\tH2C_Parameter[2] ={0};\n\t\t\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], 2Ant Init HW Config!!\\n\"));\n\n\tif(bWifiOnly)\n\t\treturn;\n\t\n\t//if(bBackUp)\n\t{\n\t\t// backup rf 0x1e value\n\t\tpCoexDm->btRf0x1eBackup = pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);\n\t\tpCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);\n\t\tpCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);\n\t\tpCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);\n\t\tpCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);\n\t\tpCoexDm->backupAmpduMaxNum = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x4ca);\n\t}\n\n\t#if 0 /* REMOVE */\n\t// 0x790[5:0]=0x5\n\tu1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);\n\tu1Tmp &= 0xc0;\n\tu1Tmp |= 0x5;\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);\n\t#endif\n\t\n\t//Antenna config\n\thalbtc8821aCsr2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);\n\n\t// PTA parameter\n\thalbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);\n\t\n\t// Enable counter statistics\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA\n\tpBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\n\t#if 0 /* REMOVE */\n\tpBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);\n\t#endif\n}\n\nVOID\nEXhalbtc8821aCsr2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Coex Mechanism Init!!\\n\"));\n\t\n\thalbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821aCsr2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t)\n{\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\tpu1Byte\t\t\t\tcliBuf=pBtCoexist->cliBuf;\n\tu1Byte\t\t\t\tu1Tmp[4], i, btInfoExt, psTdmaCase=0;\n\tu4Byte\t\t\t\tu4Tmp[4];\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n ============[BT Coexist info]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"Ant PG number/ Ant mechanism:\", \\\n\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(pBtCoexist->bManualControl)\n\t{\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"[Action Manual control]!!\");\n\t\tCL_PRINTF(cliBuf);\n\t}\n\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %d\", \"BT stack/ hci ext ver\", \\\n\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)\", \"CoexVer/ FwVer/ PatchVer\", \\\n\t\tGLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x \", \"Wifi channel informed to BT\", \\\n\t\tpCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],\n\t\tpCoexDm->wifiChnlInfo[2]);\n\tCL_PRINTF(cliBuf);\n\n\t// wifi status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Wifi Status]============\");\n\tCL_PRINTF(cliBuf);\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_WIFI_STATUS);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[BT Status]============\");\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s/ %d/ %d] \", \"BT [status/ rssi/ retryCnt]\", \\\n\t\t((pCoexSta->bC2hBtInquiryPage)?(\"inquiry/page scan\"):((BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? \"idle\":(  (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? \"connected-idle\":\"busy\"))),\n\t\tpCoexSta->btRssi, pCoexSta->btRetryCnt);\n\tCL_PRINTF(cliBuf);\n\t\n\tif(pStackInfo->bProfileNotified)\n\t{\t\t\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"SCO/HID/PAN/A2DP\", \\\n\t\t\tpStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);\n\t\tCL_PRINTF(cliBuf);\t\n\n\t\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);\n\t}\n\n\tbtInfoExt = pCoexSta->btInfoExt;\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"BT Info A2DP rate\", \\\n\t\t(btInfoExt&BIT0)? \"Basic rate\":\"EDR rate\");\n\tCL_PRINTF(cliBuf);\t\n\n\tfor(i=0; i<BT_INFO_SRC_8821A_CSR_2ANT_MAX; i++)\n\t{\n\t\tif(pCoexSta->btInfoC2hCnt[i])\n\t\t{\t\t\t\t\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)\", GLBtInfoSrc8821aCsr2Ant[i], \\\n\t\t\t\tpCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],\n\t\t\t\tpCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],\n\t\t\t\tpCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],\n\t\t\t\tpCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n\n\t// Sw mechanism\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Sw mechanism]============\");\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"SM1[ShRf/ LpRA/ LimDig]\", \\\n\t\tpCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d(0x%x) \", \"SM2[AgcT/ AdcB/ SwDacSwing(lvl)]\", \\\n\t\tpCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);\n\tCL_PRINTF(cliBuf);\n\n\t// Fw mechanism\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Fw mechanism]============\");\n\tCL_PRINTF(cliBuf);\t\n\t\n\tif(!pBtCoexist->bManualControl)\n\t{\n\t\tpsTdmaCase = pCoexDm->curPsTdma;\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x case-%d\", \"PS TDMA\", \\\n\t\t\tpCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],\n\t\t\tpCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],\n\t\t\tpCoexDm->psTdmaPara[4], psTdmaCase);\n\t\tCL_PRINTF(cliBuf);\n\t\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d \", \"DecBtPwr/ IgnWlanAct\", \\\n\t\t\tpCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\t// Hw setting\t\t\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Hw setting]============\");\n\tCL_PRINTF(cliBuf);\t\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"RF-A, 0x1e initVal\", \\\n\t\tpCoexDm->btRf0x1eBackup);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x \", \"0x778 (W_Act)/ 0x6cc (CoTab Sel)\", \\\n\t\tu1Tmp[0], u1Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x8db(ADC)/0xc5b[29:25](DAC)\", \\\n\t\t((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1));\n\tCL_PRINTF(cliBuf); \n\t\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)\", \\\n\t\tu4Tmp[0]&0xff, ((u4Tmp[0]&0x30000000)>>28));\n\tCL_PRINTF(cliBuf);\n\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x40/ 0x4c[24:23]/ 0x974\", \\\n\t\tu1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0x550(bcn ctrl)/0x522\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"0xc50(DIG)/0xa0a(CCK-TH)\", \\\n\t\tu4Tmp[0], u1Tmp[0]);\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);\n\tu1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);\n\tu1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x\", \"OFDM-FA/ CCK-FA\", \\\n\t\tu4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1]  );\n\tCL_PRINTF(cliBuf);\n\n\tu4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);\n\tu4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);\n\tu4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x/ 0x%x/ 0x%x\", \"0x6c0/0x6c4/0x6c8\", \\\n\t\tu4Tmp[0], u4Tmp[1], u4Tmp[2]);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x770 (hi-pri Rx/Tx)\", \\\n\t\tpCoexSta->highPriorityRx, pCoexSta->highPriorityTx);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"0x774(low-pri Rx/Tx)\", \\\n\t\tpCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);\n}\n\n\nVOID\nEXhalbtc8821aCsr2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_IPS_ENTER == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS ENTER notify\\n\"));\n\t\tpCoexSta->bUnderIps = TRUE;\n\t\thalbtc8821aCsr2ant_CoexAllOff(pBtCoexist);\n\t}\n\telse if(BTC_IPS_LEAVE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], IPS LEAVE notify\\n\"));\n\t\tpCoexSta->bUnderIps = FALSE;\n\t\t//halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_LPS_ENABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS ENABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = TRUE;\n\t}\n\telse if(BTC_LPS_DISABLE == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], LPS DISABLE notify\\n\"));\n\t\tpCoexSta->bUnderLps = FALSE;\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_SCAN_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN START notify\\n\"));\n\t}\n\telse if(BTC_SCAN_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], SCAN FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t)\n{\n\tif(BTC_ASSOCIATE_START == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT START notify\\n\"));\n\t}\n\telse if(BTC_ASSOCIATE_FINISH == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CONNECT FINISH notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tu1Byte\t\t\tH2C_Parameter[3] ={0};\n\tu4Byte\t\t\twifiBw;\n\tu1Byte\t\t\twifiCentralChnl;\n\n\tif(BTC_MEDIA_CONNECT == type)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA connect notify\\n\"));\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], MEDIA disconnect notify\\n\"));\n\t}\n\n\t// only 2.4G we need to inform bt the chnl mask\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);\n\tif( (BTC_MEDIA_CONNECT == type) &&\n\t\t(wifiCentralChnl <= 14) )\n\t{\n\t\tH2C_Parameter[0] = 0x1;\n\t\tH2C_Parameter[1] = wifiCentralChnl;\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\t\tif(BTC_WIFI_BW_HT40 == wifiBw)\n\t\t\tH2C_Parameter[2] = 0x30;\n\t\telse\n\t\t\tH2C_Parameter[2] = 0x20;\n\t}\n\n\t#if 0 /* REMOVE */\t\n\tpCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];\n\tpCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];\n\tpCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];\n\t\n\tRT_TRACE(COMP_COEX, DBG_TRACE, (\"[BTCoex], FW write 0x66=0x%x\\n\", \n\t\tH2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));\n\n\trtw_warn_on(_BTCOEX_CSR);\n\tpBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);\n\t#endif\n}\n\nVOID\nEXhalbtc8821aCsr2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t)\n{\n\tif(type == BTC_PACKET_DHCP)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], DHCP Packet notify\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t)\n{\n\tu1Byte\t\t\tbtInfo=0;\n\tu1Byte\t\t\ti, rspSource=0;\n\tBOOLEAN\t\t\tbBtBusy=FALSE, bLimitedDig=FALSE;\n\tBOOLEAN\t\t\tbWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;\n\n\tpCoexSta->bC2hBtInfoReqSent = FALSE;\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);\n\n\trspSource = tmpBuf[0]&0xf;\n\tif(rspSource >= BT_INFO_SRC_8821A_CSR_2ANT_MAX)\n\t\trspSource = BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW;\n\tpCoexSta->btInfoC2hCnt[rspSource]++;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Bt info[%d], length=%d, hex data=[\", rspSource, length));\n\tfor(i=0; i<length; i++)\n\t{\n\t\tpCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];\n\t\tif(i == 1)\n\t\t\tbtInfo = tmpBuf[i];\n\t\tif(i == length-1)\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x]\\n\", tmpBuf[i]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"0x%02x, \", tmpBuf[i]));\n\t\t}\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);\n\tif(BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW != rspSource)\n\t{\n\t\tpCoexSta->btRetryCnt =\t// [3:0]\n\t\t\tpCoexSta->btInfoC2h[rspSource][2]&0xf;\n\n\t\tpCoexSta->btRssi =\n\t\t\tpCoexSta->btInfoC2h[rspSource][3]*2+10;\n\n\t\tpCoexSta->btInfoExt = \n\t\t\tpCoexSta->btInfoC2h[rspSource][4];\n\n\t\t#if 0 /* REMOVE */\n\t\t// Here we need to resend some wifi info to BT\n\t\t// because bt is reset and loss of the info.\n\t\tif( (pCoexSta->btInfoExt & BIT1) )\n\t\t{\t\t\t\n\t\t\t\n\t\t\tif(bWifiConnected)\n\t\t\t{\n\t\t\t\tEXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tEXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n\t\t\t}\n\t\t}\n\t\t#endif\n\n\t\t#if 0 /* REMOVE */\n\t\tif(!pBtCoexist->bManualControl && !bWifiUnder5G)\n\t\t{\n\t\t\tif( (pCoexSta->btInfoExt&BIT3) )\n\t\t\t{\n\t\t\t\tif(bWifiConnected)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// BT already NOT ignore Wlan active, do nothing here.\n\t\t\t\tif(!bWifiConnected)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\\n\"));\n\t\t\t\t\thalbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#endif\n\n\t\t#if 0 /* REMOVE */\n\t\tif( (pCoexSta->btInfoExt & BIT4) )\n\t\t{\n\t\t\t// BT auto report already enabled, do nothing\n\t\t}\n\t\telse\n\t\t{\n\t\t\thalbtc8821aCsr2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);\n\t\t}\n\t\t#endif\n\t}\n\t\t\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\n\tif(btInfo == BT_INFO_8821A_CSR_2ANT_B_CONNECTION)\t// connection exists but no busy\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\t\tpCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE;\n\t}\n\telse if(btInfo & BT_INFO_8821A_CSR_2ANT_B_CONNECTION)\t// connection exists and some link is busy\n\t{\n\t\tpCoexSta->bBtLinkExist = TRUE;\n\n\t\tif(btInfo & BT_INFO_8821A_CSR_2ANT_B_FTP)\n\t\t\tpCoexSta->bPanExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bPanExist = FALSE;\n\n\t\tif(btInfo & BT_INFO_8821A_CSR_2ANT_B_A2DP)\n\t\t\tpCoexSta->bA2dpExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bA2dpExist = FALSE;\n\n\t\tif(btInfo & BT_INFO_8821A_CSR_2ANT_B_HID)\n\t\t\tpCoexSta->bHidExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bHidExist = FALSE;\n\n\t\tif(btInfo & BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO)\n\t\t\tpCoexSta->bScoExist = TRUE;\n\t\telse\n\t\t\tpCoexSta->bScoExist = FALSE;\n\n\t\tif (pCoexSta->btInfoExt & 0x80)\n\t\t\tpCoexSta->bSlave = TRUE; //Slave\n\t\telse\n\t\t\tpCoexSta->bSlave = FALSE; //Master\n\n\t\tpCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\n\t}\n\telse\n\t{\n\t\tpCoexSta->bBtLinkExist = FALSE;\n\t\tpCoexSta->bPanExist = FALSE;\n\t\tpCoexSta->bA2dpExist = FALSE;\n\t\tpCoexSta->bSlave = FALSE;\n\t\tpCoexSta->bHidExist = FALSE;\n\t\tpCoexSta->bScoExist = FALSE;\n\t\tpCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_IDLE;\n\t}\n\n\tif(bBtHsOn)\n\t{\n\t\tpCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\n\t}\n\n\tif(btInfo & BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE)\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = TRUE;\n\t\tpCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;\n\t} \n\telse\n\t{\n\t\tpCoexSta->bC2hBtInquiryPage = FALSE;\n\t}\n\n\n\tif(BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus)\n\t{\n\t\tbBtBusy = TRUE;\n\t}\n\telse\n\t{\n\t\tbBtBusy = FALSE;\n\t}\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);\n\n\tif(BT_8821A_CSR_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus)\n\t{\n\t\tbLimitedDig = TRUE;\n\t}\n\telse\n\t{\n\t\tbLimitedDig = FALSE;\n\t}\n\tpCoexDm->bLimitedDig = bLimitedDig;\n\tpBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);\n\n\thalbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);\n}\n\nVOID\nEXhalbtc8821aCsr2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Halt notify\\n\"));\n\n\thalbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\tEXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);\n}\n\nVOID\nEXhalbtc8821aCsr2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify\\n\"));\n\n\tif(BTC_WIFI_PNP_SLEEP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to SLEEP\\n\"));\n\t\thalbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);\n\t}\n\telse if(BTC_WIFI_PNP_WAKE_UP == pnpState)\n\t{\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Pnp notify to WAKE UP\\n\"));\n\t}\n}\n\nVOID\nEXhalbtc8821aCsr2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t)\n{\n\tstatic u1Byte\t\tdisVerInfoCnt=0;\n\tu4Byte\t\t\t\tfwVer=0, btPatchVer=0;\n\tPBTC_BOARD_INFO\t\tpBoardInfo=&pBtCoexist->boardInfo;\n\tPBTC_STACK_INFO\t\tpStackInfo=&pBtCoexist->stackInfo;\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ==========================Periodical===========================\\n\"));\n\n\tif(disVerInfoCnt <= 5)\n\t{\n\t\tdisVerInfoCnt += 1;\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\\n\",\n\t\t\tpBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], BT stack/ hci ext ver = %s / %d\\n\",\n\t\t\t((pStackInfo->bProfileNotified)? \"Yes\":\"No\"), pStackInfo->hciVersion));\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);\n\t\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\\n\",\n\t\t\tGLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer));\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], ****************************************************************\\n\"));\n\t}\n\n\t//halbtc8821aCsr2ant_QueryBtInfo(pBtCoexist);\n\t//halbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);\n\thalbtc8821aCsr2ant_MonitorBtCtr(pBtCoexist);\n\thalbtc8821aCsr2ant_MonitorBtEnableDisable(pBtCoexist);\n}\n\n\n#endif\n\n"
  },
  {
    "path": "hal/btc/HalBtc8821aCsr2Ant.h",
    "content": "//===========================================\n// The following is for 8821A_CSR 2Ant BT Co-exist definition\n//===========================================\n#define\tBT_INFO_8821A_CSR_2ANT_B_FTP\t\t\t\t\t\tBIT7\n#define\tBT_INFO_8821A_CSR_2ANT_B_A2DP\t\t\t\t\tBIT6\n#define\tBT_INFO_8821A_CSR_2ANT_B_HID\t\t\t\t\t\tBIT5\n#define\tBT_INFO_8821A_CSR_2ANT_B_SCO_BUSY\t\t\t\tBIT4\n#define\tBT_INFO_8821A_CSR_2ANT_B_ACL_BUSY\t\t\t\tBIT3\n#define\tBT_INFO_8821A_CSR_2ANT_B_INQ_PAGE\t\t\t\tBIT2\n#define\tBT_INFO_8821A_CSR_2ANT_B_SCO_ESCO\t\t\t\tBIT1\n#define\tBT_INFO_8821A_CSR_2ANT_B_CONNECTION\t\t\t\tBIT0\n\n#define\t\tBTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT\t\t2\n\ntypedef enum _BT_INFO_SRC_8821A_CSR_2ANT{\n\tBT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW\t\t\t= 0x0,\n\tBT_INFO_SRC_8821A_CSR_2ANT_BT_RSP\t\t\t\t= 0x1,\n\tBT_INFO_SRC_8821A_CSR_2ANT_BT_ACTIVE_SEND\t\t= 0x2,\n\tBT_INFO_SRC_8821A_CSR_2ANT_MAX\n}BT_INFO_SRC_8821A_CSR_2ANT,*PBT_INFO_SRC_8821A_CSR_2ANT;\n\ntypedef enum _BT_8821A_CSR_2ANT_BT_STATUS{\n\tBT_8821A_CSR_2ANT_BT_STATUS_IDLE\t\t\t\t= 0x0,\n\tBT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE\t= 0x1,\n\tBT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE\t\t\t= 0x2,\n\tBT_8821A_CSR_2ANT_BT_STATUS_MAX\n}BT_8821A_CSR_2ANT_BT_STATUS,*PBT_8821A_CSR_2ANT_BT_STATUS;\n\ntypedef enum _BT_8821A_CSR_2ANT_COEX_ALGO{\n\tBT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED\t\t\t= 0x0,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_SCO\t\t\t\t= 0x1,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_HID\t\t\t\t= 0x2,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_A2DP\t\t\t\t= 0x3,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS\t\t= 0x4,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_PANEDR\t\t\t= 0x5,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_PANHS\t\t\t= 0x6,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP\t\t= 0x7,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID\t\t= 0x8,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR\t= 0x9,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP\t\t\t= 0xa,\n\tBT_8821A_CSR_2ANT_COEX_ALGO_MAX\t\t\t\t= 0xb,\n}BT_8821A_CSR_2ANT_COEX_ALGO,*PBT_8821A_CSR_2ANT_COEX_ALGO;\n\ntypedef struct _COEX_DM_8821A_CSR_2ANT{\n\t// fw mechanism\n\tBOOLEAN\t\tbPreDecBtPwr;\n\tBOOLEAN\t\tbCurDecBtPwr;\n\tu1Byte\t\tpreFwDacSwingLvl;\n\tu1Byte\t\tcurFwDacSwingLvl;\n\tBOOLEAN\t\tbCurIgnoreWlanAct;\n\tBOOLEAN\t\tbPreIgnoreWlanAct;\n\tu1Byte\t\tprePsTdma;\n\tu1Byte\t\tcurPsTdma;\n\tu1Byte\t\tpsTdmaPara[6];\n\tu1Byte\t\tpsTdmaDuAdjType;\n\tBOOLEAN\t\tbResetTdmaAdjust;\n\tBOOLEAN\t\tbPrePsTdmaOn;\n\tBOOLEAN\t\tbCurPsTdmaOn;\n\tBOOLEAN\t\tbPreBtAutoReport;\n\tBOOLEAN\t\tbCurBtAutoReport;\n\n\t// sw mechanism\n\tBOOLEAN\t\tbPreRfRxLpfShrink;\n\tBOOLEAN\t\tbCurRfRxLpfShrink;\n\tu4Byte\t\tbtRf0x1eBackup;\n\tBOOLEAN \tbPreLowPenaltyRa;\n\tBOOLEAN\t\tbCurLowPenaltyRa;\n\tBOOLEAN\t\tbPreDacSwingOn;\n\tu4Byte\t\tpreDacSwingLvl;\n\tBOOLEAN\t\tbCurDacSwingOn;\n\tu4Byte\t\tcurDacSwingLvl;\n\tBOOLEAN\t\tbPreAdcBackOff;\n\tBOOLEAN\t\tbCurAdcBackOff;\n\tBOOLEAN \tbPreAgcTableEn;\n\tBOOLEAN\t\tbCurAgcTableEn;\n\tu4Byte\t\tpreVal0x6c0;\n\tu4Byte\t\tcurVal0x6c0;\n\tu4Byte\t\tpreVal0x6c4;\n\tu4Byte\t\tcurVal0x6c4;\n\tu4Byte\t\tpreVal0x6c8;\n\tu4Byte\t\tcurVal0x6c8;\n\tu1Byte\t\tpreVal0x6cc;\n\tu1Byte\t\tcurVal0x6cc;\n\tBOOLEAN\t\tbLimitedDig;\n\n\tu4Byte\t\tpreRaMask;\n\tu4Byte\t\tcurRaMask;\n\n\tu1Byte curAmpduNumType;\n\tu1Byte preAmpduNumType;\n\tu2Byte backupAmpduMaxNum;\n\n\tu1Byte curAmpduTimeType;\n\tu1Byte preAmpduTimeType;\n\tu1Byte backupAmpduMaxTime;\n\n\tu1Byte \t\tcurArfrType;\n\tu1Byte \t\tpreArfrType;\n\tu4Byte\t\tbackupArfrCnt1;\n\tu4Byte\t\tbackupArfrCnt2;\n\n\tu1Byte\t\tcurRetryLimitType;\n\tu1Byte\t\tpreRetryLimitType;\n\tu2Byte\t\tbackupRetryLimit;\n\n\t// algorithm related\n\tu1Byte\t\tpreAlgorithm;\n\tu1Byte\t\tcurAlgorithm;\n\tu1Byte\t\tbtStatus;\n\tu1Byte\t\twifiChnlInfo[3];\n} COEX_DM_8821A_CSR_2ANT, *PCOEX_DM_8821A_CSR_2ANT;\n\ntypedef struct _COEX_STA_8821A_CSR_2ANT{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbSlave;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\n\tBOOLEAN\t\t\t\t\tbUnderLps;\n\tBOOLEAN\t\t\t\t\tbUnderIps;\n\tu4Byte\t\t\t\t\thighPriorityTx;\n\tu4Byte\t\t\t\t\thighPriorityRx;\n\tu4Byte\t\t\t\t\tlowPriorityTx;\n\tu4Byte\t\t\t\t\tlowPriorityRx;\n\tu1Byte\t\t\t\t\tbtRssi;\n\tu1Byte\t\t\t\t\tpreBtRssiState;\n\tu1Byte\t\t\t\t\tpreWifiRssiState[4];\n\tBOOLEAN\t\t\t\t\tbC2hBtInfoReqSent;\n\tu1Byte\t\t\t\t\tbtInfoC2h[BT_INFO_SRC_8821A_CSR_2ANT_MAX][10];\n\tu4Byte\t\t\t\t\tbtInfoC2hCnt[BT_INFO_SRC_8821A_CSR_2ANT_MAX];\n\tBOOLEAN\t\t\t\t\tbC2hBtInquiryPage;\n\tu1Byte\t\t\t\t\tbtRetryCnt;\n\tu1Byte\t\t\t\t\tbtInfoExt;\n}COEX_STA_8821A_CSR_2ANT, *PCOEX_STA_8821A_CSR_2ANT;\n\n//===========================================\n// The following is interface which will notify coex module.\n//===========================================\nVOID\nEXhalbtc8821aCsr2ant_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821aCsr2ant_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtc8821aCsr2ant_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821aCsr2ant_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\ttype\n\t);\nVOID\nEXhalbtc8821aCsr2ant_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtc8821aCsr2ant_HaltNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821aCsr2ant_PnpNotify(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\tpnpState\n\t);\nVOID\nEXhalbtc8821aCsr2ant_Periodical(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist\n\t);\nVOID\nEXhalbtc8821aCsr2ant_DisplayCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n"
  },
  {
    "path": "hal/btc/HalBtcOutSrc.h",
    "content": "#ifndef\t__HALBTC_OUT_SRC_H__\n#define __HALBTC_OUT_SRC_H__\n\n#define\t\tNORMAL_EXEC\t\t\t\t\tFALSE\n#define\t\tFORCE_EXEC\t\t\t\t\t\tTRUE\n\n#define\t\tBTC_RF_OFF\t\t\t\t\t0x0\n#define\t\tBTC_RF_ON\t\t\t\t\t0x1\n\n#define\t\tBTC_RF_A\t\t\t\t\t0x0\n#define\t\tBTC_RF_B\t\t\t\t\t0x1\n#define\t\tBTC_RF_C\t\t\t\t\t0x2\n#define\t\tBTC_RF_D\t\t\t\t\t0x3\n\n#define\t\tBTC_SMSP\t\t\t\tSINGLEMAC_SINGLEPHY\n#define\t\tBTC_DMDP\t\t\t\tDUALMAC_DUALPHY\n#define\t\tBTC_DMSP\t\t\t\tDUALMAC_SINGLEPHY\n#define\t\tBTC_MP_UNKNOWN\t\t0xff\n\n#define\t\tBT_COEX_ANT_TYPE_PG\t\t\t0\n#define\t\tBT_COEX_ANT_TYPE_ANTDIV\t\t1\n#define\t\tBT_COEX_ANT_TYPE_DETECTED\t2\n\n#define\t\tBTC_MIMO_PS_STATIC\t\t\t0\t// 1ss\n#define\t\tBTC_MIMO_PS_DYNAMIC\t\t\t1\t// 2ss\n\n#define\t\tBTC_RATE_DISABLE\t\t\t0\n#define\t\tBTC_RATE_ENABLE\t\t\t\t1\n\n// single Antenna definition\n#define\t\tBTC_ANT_PATH_WIFI\t\t\t0\n#define\t\tBTC_ANT_PATH_BT\t\t\t\t1\n#define\t\tBTC_ANT_PATH_PTA\t\t\t2\n// dual Antenna definition\n#define\t\tBTC_ANT_WIFI_AT_MAIN\t\t0\n#define\t\tBTC_ANT_WIFI_AT_AUX\t\t\t1\n// coupler Antenna definition\n#define\t\tBTC_ANT_WIFI_AT_CPL_MAIN\t0\n#define\t\tBTC_ANT_WIFI_AT_CPL_AUX\t\t1\n\ntypedef enum _BTC_POWERSAVE_TYPE{\n\tBTC_PS_WIFI_NATIVE\t\t\t= 0,\t// wifi original power save behavior\n\tBTC_PS_LPS_ON\t\t\t\t= 1,\n\tBTC_PS_LPS_OFF\t\t\t\t= 2,\n\tBTC_PS_MAX\n} BTC_POWERSAVE_TYPE, *PBTC_POWERSAVE_TYPE;\n\ntypedef enum _BTC_BT_REG_TYPE{\n\tBTC_BT_REG_RF\t\t\t\t\t\t= 0,\n\tBTC_BT_REG_MODEM\t\t\t\t\t= 1,\n\tBTC_BT_REG_BLUEWIZE\t\t\t\t\t= 2,\n\tBTC_BT_REG_VENDOR\t\t\t\t\t= 3,\n\tBTC_BT_REG_LE\t\t\t\t\t\t= 4,\n\tBTC_BT_REG_MAX\n} BTC_BT_REG_TYPE, *PBTC_BT_REG_TYPE;\n\ntypedef enum _BTC_CHIP_INTERFACE{\n\tBTC_INTF_UNKNOWN\t= 0,\n\tBTC_INTF_PCI\t\t\t= 1,\n\tBTC_INTF_USB\t\t\t= 2,\n\tBTC_INTF_SDIO\t\t= 3,\n\tBTC_INTF_MAX\n} BTC_CHIP_INTERFACE, *PBTC_CHIP_INTERFACE;\n\ntypedef enum _BTC_CHIP_TYPE{\n\tBTC_CHIP_UNDEF\t\t= 0,\n\tBTC_CHIP_CSR_BC4\t\t= 1,\n\tBTC_CHIP_CSR_BC8\t\t= 2,\n\tBTC_CHIP_RTL8723A \t= 3,\n\tBTC_CHIP_RTL8821\t= 4,\n\tBTC_CHIP_RTL8723B \t= 5,\n\tBTC_CHIP_MAX\n} BTC_CHIP_TYPE, *PBTC_CHIP_TYPE;\n\n// following is for wifi link status\n#define\t\tWIFI_STA_CONNECTED\t\t\t\tBIT0\n#define\t\tWIFI_AP_CONNECTED\t\t\t\tBIT1\n#define\t\tWIFI_HS_CONNECTED\t\t\t\tBIT2\n#define\t\tWIFI_P2P_GO_CONNECTED\t\t\tBIT3\n#define\t\tWIFI_P2P_GC_CONNECTED\t\t\tBIT4\n\n// following is for command line utility\n#define\tCL_SPRINTF\trsprintf\n#define\tCL_PRINTF\tDCMD_Printf\n\n\ntypedef struct _BTC_BOARD_INFO{\n\t// The following is some board information\n\tu1Byte\t\t\t\tbtChipType;\n\tu1Byte\t\t\t\tpgAntNum;\t// pg ant number\n\tu1Byte\t\t\t\tbtdmAntNum;\t// ant number for btdm\n\tu1Byte\t\t\t\tbtdmAntNumByAntDet;\t// ant number for btdm after antenna detection\n\tu1Byte\t\t\t\tbtdmAntPos;\t\t//Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum =1)  (DPDT+1Ant case)\n\tu1Byte\t\t\t\tsingleAntPath;\t// current used for 8723b only, 1=>s0,  0=>s1\n\tu1Byte\t\t\t\tbTfbgaPackage;    //for Antenna detect threshold \n\tu1Byte\t\t\t\tbtdmAntDetFinish;\n\tu1Byte\t\t\t\tantType;\n} BTC_BOARD_INFO, *PBTC_BOARD_INFO;\n\ntypedef enum _BTC_DBG_OPCODE{\n\tBTC_DBG_SET_COEX_NORMAL\t\t\t\t= 0x0,\n\tBTC_DBG_SET_COEX_WIFI_ONLY\t\t\t\t= 0x1,\n\tBTC_DBG_SET_COEX_BT_ONLY\t\t\t\t= 0x2,\n\tBTC_DBG_SET_COEX_DEC_BT_PWR\t\t\t\t= 0x3,\n\tBTC_DBG_SET_COEX_BT_AFH_MAP\t\t\t\t= 0x4,\n\tBTC_DBG_SET_COEX_BT_IGNORE_WLAN_ACT\t\t= 0x5,\n\tBTC_DBG_MAX\n}BTC_DBG_OPCODE,*PBTC_DBG_OPCODE;\n\ntypedef enum _BTC_RSSI_STATE{\n\tBTC_RSSI_STATE_HIGH\t\t\t\t\t\t= 0x0,\n\tBTC_RSSI_STATE_MEDIUM\t\t\t\t\t= 0x1,\n\tBTC_RSSI_STATE_LOW\t\t\t\t\t\t= 0x2,\n\tBTC_RSSI_STATE_STAY_HIGH\t\t\t\t\t= 0x3,\n\tBTC_RSSI_STATE_STAY_MEDIUM\t\t\t\t= 0x4,\n\tBTC_RSSI_STATE_STAY_LOW\t\t\t\t\t= 0x5,\n\tBTC_RSSI_MAX\n}BTC_RSSI_STATE,*PBTC_RSSI_STATE;\n#define\tBTC_RSSI_HIGH(_rssi_)\t((_rssi_==BTC_RSSI_STATE_HIGH||_rssi_==BTC_RSSI_STATE_STAY_HIGH)? TRUE:FALSE)\n#define\tBTC_RSSI_MEDIUM(_rssi_)\t((_rssi_==BTC_RSSI_STATE_MEDIUM||_rssi_==BTC_RSSI_STATE_STAY_MEDIUM)? TRUE:FALSE)\n#define\tBTC_RSSI_LOW(_rssi_)\t((_rssi_==BTC_RSSI_STATE_LOW||_rssi_==BTC_RSSI_STATE_STAY_LOW)? TRUE:FALSE)\n\ntypedef enum _BTC_WIFI_ROLE{\n\tBTC_ROLE_STATION\t\t\t\t\t\t= 0x0,\n\tBTC_ROLE_AP\t\t\t\t\t\t\t\t= 0x1,\n\tBTC_ROLE_IBSS\t\t\t\t\t\t\t= 0x2,\n\tBTC_ROLE_HS_MODE\t\t\t\t\t\t= 0x3,\n\tBTC_ROLE_MAX\n}BTC_WIFI_ROLE,*PBTC_WIFI_ROLE;\n\ntypedef enum _BTC_WIRELESS_FREQ{\n\tBTC_FREQ_2_4G\t\t\t\t\t= 0x0,\n\tBTC_FREQ_5G\t\t\t\t\t\t= 0x1,\n\tBTC_FREQ_MAX\t\n}BTC_WIRELESS_FREQ,*PBTC_WIRELESS_FREQ;\n\ntypedef enum _BTC_WIFI_BW_MODE{\n\tBTC_WIFI_BW_LEGACY\t\t\t\t\t= 0x0,\n\tBTC_WIFI_BW_HT20\t\t\t\t\t= 0x1,\n\tBTC_WIFI_BW_HT40\t\t\t\t\t= 0x2,\n\tBTC_WIFI_BW_HT80\t\t\t\t\t= 0x3,\n\tBTC_WIFI_BW_HT160\t\t\t\t\t= 0x4,\n\tBTC_WIFI_BW_MAX\t\n}BTC_WIFI_BW_MODE,*PBTC_WIFI_BW_MODE;\n\ntypedef enum _BTC_WIFI_TRAFFIC_DIR{\n\tBTC_WIFI_TRAFFIC_TX\t\t\t\t\t= 0x0,\n\tBTC_WIFI_TRAFFIC_RX\t\t\t\t\t= 0x1,\n\tBTC_WIFI_TRAFFIC_MAX\t\n}BTC_WIFI_TRAFFIC_DIR,*PBTC_WIFI_TRAFFIC_DIR;\n\ntypedef enum _BTC_WIFI_PNP{\n\tBTC_WIFI_PNP_WAKE_UP\t\t\t\t\t= 0x0,\n\tBTC_WIFI_PNP_SLEEP\t\t\t\t\t\t= 0x1,\n\tBTC_WIFI_PNP_MAX\n}BTC_WIFI_PNP,*PBTC_WIFI_PNP;\n\ntypedef enum _BTC_IOT_PEER\n{\n\tBTC_IOT_PEER_UNKNOWN = 0,\n\tBTC_IOT_PEER_REALTEK = 1,\n\tBTC_IOT_PEER_REALTEK_92SE = 2,\n\tBTC_IOT_PEER_BROADCOM = 3,\n\tBTC_IOT_PEER_RALINK = 4,\n\tBTC_IOT_PEER_ATHEROS = 5,\n\tBTC_IOT_PEER_CISCO = 6,\n\tBTC_IOT_PEER_MERU = 7,\t\n\tBTC_IOT_PEER_MARVELL = 8,\n\tBTC_IOT_PEER_REALTEK_SOFTAP = 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17\n\tBTC_IOT_PEER_SELF_SOFTAP = 10, // Self is SoftAP\n\tBTC_IOT_PEER_AIRGO = 11,\n\tBTC_IOT_PEER_INTEL \t\t\t\t= 12, \n\tBTC_IOT_PEER_RTK_APCLIENT \t\t= 13, \n\tBTC_IOT_PEER_REALTEK_81XX \t\t= 14,\t\n\tBTC_IOT_PEER_REALTEK_WOW \t\t= 15,\n\tBTC_IOT_PEER_REALTEK_JAGUAR_BCUTAP = 16,\n\tBTC_IOT_PEER_REALTEK_JAGUAR_CCUTAP = 17,\n\tBTC_IOT_PEER_MAX,\n}BTC_IOT_PEER, *PBTC_IOT_PEER;\n\n//for 8723b-d cut large current issue\ntypedef enum _BT_WIFI_COEX_STATE{\n\tBTC_WIFI_STAT_INIT,\n\tBTC_WIFI_STAT_IQK,\n\tBTC_WIFI_STAT_NORMAL_OFF,\n\tBTC_WIFI_STAT_MP_OFF,\n\tBTC_WIFI_STAT_NORMAL,\n\tBTC_WIFI_STAT_ANT_DIV,\n\tBTC_WIFI_STAT_MAX\n}BT_WIFI_COEX_STATE,*PBT_WIFI_COEX_STATE;\n\ntypedef enum _BT_ANT_TYPE{\n\tBTC_ANT_TYPE_0,\n\tBTC_ANT_TYPE_1,\n\tBTC_ANT_TYPE_2,\n\tBTC_ANT_TYPE_3,\n\tBTC_ANT_TYPE_4,\n\tBTC_ANT_TYPE_MAX\n}BT_ANT_TYPE,*PBT_ANT_TYPE;\n\n// defined for BFP_BTC_GET\ntypedef enum _BTC_GET_TYPE{\n\t// type BOOLEAN\n\tBTC_GET_BL_HS_OPERATION,\n\tBTC_GET_BL_HS_CONNECTING,\n\tBTC_GET_BL_WIFI_CONNECTED,\n\tBTC_GET_BL_WIFI_BUSY,\n\tBTC_GET_BL_WIFI_SCAN,\n\tBTC_GET_BL_WIFI_LINK,\n\tBTC_GET_BL_WIFI_ROAM,\n\tBTC_GET_BL_WIFI_4_WAY_PROGRESS,\n\tBTC_GET_BL_WIFI_UNDER_5G,\n\tBTC_GET_BL_WIFI_AP_MODE_ENABLE,\n\tBTC_GET_BL_WIFI_ENABLE_ENCRYPTION,\n\tBTC_GET_BL_WIFI_UNDER_B_MODE,\n\tBTC_GET_BL_EXT_SWITCH,\n\tBTC_GET_BL_WIFI_IS_IN_MP_MODE,\n\tBTC_GET_BL_IS_ASUS_8723B,\n\n\t// type s4Byte\n\tBTC_GET_S4_WIFI_RSSI,\n\tBTC_GET_S4_HS_RSSI,\n\t\n\t// type u4Byte\n\tBTC_GET_U4_WIFI_BW,\n\tBTC_GET_U4_WIFI_TRAFFIC_DIRECTION,\n\tBTC_GET_U4_WIFI_FW_VER,\n\tBTC_GET_U4_WIFI_LINK_STATUS,\n\tBTC_GET_U4_BT_PATCH_VER,\n\n\t// type u1Byte\n\tBTC_GET_U1_WIFI_DOT11_CHNL,\n\tBTC_GET_U1_WIFI_CENTRAL_CHNL,\n\tBTC_GET_U1_WIFI_HS_CHNL,\n\tBTC_GET_U1_MAC_PHY_MODE,\n\tBTC_GET_U1_AP_NUM,\n\tBTC_GET_U1_ANT_TYPE,\n\tBTC_GET_U1_IOT_PEER,\n\n\t//===== for 1Ant ======\n\tBTC_GET_U1_LPS_MODE,\n\n\tBTC_GET_MAX\n}BTC_GET_TYPE,*PBTC_GET_TYPE;\n\n// defined for BFP_BTC_SET\ntypedef enum _BTC_SET_TYPE{\n\t// type BOOLEAN\n\tBTC_SET_BL_BT_DISABLE,\n\tBTC_SET_BL_BT_TRAFFIC_BUSY,\n\tBTC_SET_BL_BT_LIMITED_DIG,\n\tBTC_SET_BL_FORCE_TO_ROAM,\n\tBTC_SET_BL_TO_REJ_AP_AGG_PKT,\n\tBTC_SET_BL_BT_CTRL_AGG_SIZE,\n\tBTC_SET_BL_INC_SCAN_DEV_NUM,\n\tBTC_SET_BL_BT_TX_RX_MASK,\n\tBTC_SET_BL_MIRACAST_PLUS_BT,\n\n\t// type u1Byte\n\tBTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,\n\tBTC_SET_U1_AGG_BUF_SIZE,\n\n\t// type trigger some action\n\tBTC_SET_ACT_GET_BT_RSSI,\n\tBTC_SET_ACT_AGGREGATE_CTRL,\n\t//===== for 1Ant ======\n\t// type BOOLEAN\n\n\t// type u1Byte\n\tBTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,\n\tBTC_SET_U1_LPS_VAL,\n\tBTC_SET_U1_RPWM_VAL,\n\t// type trigger some action\n\tBTC_SET_ACT_LEAVE_LPS,\n\tBTC_SET_ACT_ENTER_LPS,\n\tBTC_SET_ACT_NORMAL_LPS,\n\tBTC_SET_ACT_DISABLE_LOW_POWER,\n\tBTC_SET_ACT_UPDATE_RAMASK,\n\tBTC_SET_ACT_SEND_MIMO_PS,\n\t// BT Coex related\n\tBTC_SET_ACT_CTRL_BT_INFO,\n\tBTC_SET_ACT_CTRL_BT_COEX,\n\tBTC_SET_ACT_CTRL_8723B_ANT,\n\t//=================\n\tBTC_SET_MAX\n}BTC_SET_TYPE,*PBTC_SET_TYPE;\n\ntypedef enum _BTC_DBG_DISP_TYPE{\n\tBTC_DBG_DISP_COEX_STATISTICS\t\t\t\t= 0x0,\n\tBTC_DBG_DISP_BT_LINK_INFO\t\t\t\t= 0x1,\n\tBTC_DBG_DISP_WIFI_STATUS\t\t\t\t= 0x2,\n\tBTC_DBG_DISP_MAX\n}BTC_DBG_DISP_TYPE,*PBTC_DBG_DISP_TYPE;\n\ntypedef enum _BTC_NOTIFY_TYPE_IPS{\n\tBTC_IPS_LEAVE\t\t\t\t\t\t\t= 0x0,\n\tBTC_IPS_ENTER\t\t\t\t\t\t\t= 0x1,\n\tBTC_IPS_MAX\n}BTC_NOTIFY_TYPE_IPS,*PBTC_NOTIFY_TYPE_IPS;\ntypedef enum _BTC_NOTIFY_TYPE_LPS{\n\tBTC_LPS_DISABLE\t\t\t\t\t\t\t= 0x0,\n\tBTC_LPS_ENABLE\t\t\t\t\t\t\t= 0x1,\n\tBTC_LPS_MAX\n}BTC_NOTIFY_TYPE_LPS,*PBTC_NOTIFY_TYPE_LPS;\ntypedef enum _BTC_NOTIFY_TYPE_SCAN{\n\tBTC_SCAN_FINISH\t\t\t\t\t\t\t= 0x0,\n\tBTC_SCAN_START\t\t\t\t\t\t\t= 0x1,\n\tBTC_SCAN_MAX\n}BTC_NOTIFY_TYPE_SCAN,*PBTC_NOTIFY_TYPE_SCAN;\ntypedef enum _BTC_NOTIFY_TYPE_ASSOCIATE{\n\tBTC_ASSOCIATE_FINISH\t\t\t\t\t\t= 0x0,\n\tBTC_ASSOCIATE_START\t\t\t\t\t\t= 0x1,\n\tBTC_ASSOCIATE_MAX\n}BTC_NOTIFY_TYPE_ASSOCIATE,*PBTC_NOTIFY_TYPE_ASSOCIATE;\ntypedef enum _BTC_NOTIFY_TYPE_MEDIA_STATUS{\n\tBTC_MEDIA_DISCONNECT\t\t\t\t\t= 0x0,\n\tBTC_MEDIA_CONNECT\t\t\t\t\t\t= 0x1,\n\tBTC_MEDIA_MAX\n}BTC_NOTIFY_TYPE_MEDIA_STATUS,*PBTC_NOTIFY_TYPE_MEDIA_STATUS;\ntypedef enum _BTC_NOTIFY_TYPE_SPECIAL_PACKET{\n\tBTC_PACKET_UNKNOWN\t\t\t\t\t= 0x0,\n\tBTC_PACKET_DHCP\t\t\t\t\t\t\t= 0x1,\n\tBTC_PACKET_ARP\t\t\t\t\t\t\t= 0x2,\n\tBTC_PACKET_EAPOL\t\t\t\t\t\t= 0x3,\n\tBTC_PACKET_MAX\n}BTC_NOTIFY_TYPE_SPECIAL_PACKET,*PBTC_NOTIFY_TYPE_SPECIAL_PACKET;\ntypedef enum _BTC_NOTIFY_TYPE_STACK_OPERATION{\n\tBTC_STACK_OP_NONE\t\t\t\t\t= 0x0,\n\tBTC_STACK_OP_INQ_PAGE_PAIR_START\t\t= 0x1,\n\tBTC_STACK_OP_INQ_PAGE_PAIR_FINISH\t= 0x2,\n\tBTC_STACK_OP_MAX\n}BTC_NOTIFY_TYPE_STACK_OPERATION,*PBTC_NOTIFY_TYPE_STACK_OPERATION;\n\n//Bryant Add\ntypedef enum _BTC_ANTENNA_POS{\n\tBTC_ANTENNA_AT_MAIN_PORT\t\t\t\t= 0x1,\n\tBTC_ANTENNA_AT_AUX_PORT\t\t\t\t= 0x2,\n}BTC_ANTENNA_POS,*PBTC_ANTENNA_POS;\n\n//Bryant Add\ntypedef enum _BTC_BT_OFFON{\n\tBTC_BT_OFF\t\t\t\t= 0x0,\n\tBTC_BT_ON\t\t\t\t= 0x1,\n}BTC_BTOFFON,*PBTC_BT_OFFON;\n\ntypedef u1Byte\n(*BFP_BTC_R1)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\ntypedef u2Byte\n(*BFP_BTC_R2)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\ntypedef u4Byte\n(*BFP_BTC_R4)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\ntypedef VOID\n(*BFP_BTC_W1)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu1Byte\t\t\tData\n\t);\ntypedef VOID\n(*BFP_BTC_W1_BIT_MASK)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tregAddr,\n\tIN\tu1Byte\t\t\tbitMask,\n\tIN\tu1Byte\t\t\tdata1b\n\t);\ntypedef VOID\n(*BFP_BTC_W2)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu2Byte\t\t\tData\n\t);\ntypedef VOID\n(*BFP_BTC_W4)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tData\n\t);\ntypedef VOID\n(*BFP_BTC_LOCAL_REG_W1)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu1Byte\t\t\tData\n\t);\ntypedef VOID\n(*BFP_BTC_SET_BB_REG)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tBitMask,\n\tIN\tu4Byte\t\t\tData\n\t);\ntypedef u4Byte \n(*BFP_BTC_GET_BB_REG)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tBitMask\n\t);\ntypedef VOID\n(*BFP_BTC_SET_RF_REG)(\t\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte\t\t\teRFPath,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tBitMask,\n\tIN\tu4Byte\t\t\tData\n\t);\ntypedef u4Byte \n(*BFP_BTC_GET_RF_REG)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte\t\t\teRFPath,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tBitMask\n\t);\ntypedef VOID\n(*BFP_BTC_FILL_H2C)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte \t\t\telementId,\n\tIN\tu4Byte \t\t\tcmdLen,\n\tIN\tpu1Byte\t\t\tpCmdBuffer\n\t);\n\ntypedef\tBOOLEAN\n(*BFP_BTC_GET)(\n\tIN\tPVOID\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tgetType,\n\tOUT\tPVOID\t\t\tpOutBuf\n\t);\n\ntypedef\tBOOLEAN\n(*BFP_BTC_SET)(\n\tIN\tPVOID\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tsetType,\n\tOUT\tPVOID\t\t\tpInBuf\n\t);\ntypedef VOID\n(*BFP_BTC_SET_BT_REG)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte\t\t\tregType,\n\tIN\tu4Byte\t\t\toffset,\n\tIN\tu4Byte\t\t\tvalue\n\t);\ntypedef BOOLEAN\n(*BFP_BTC_SET_BT_ANT_DETECTION)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte\t\t\ttxTime,\n\tIN\tu1Byte\t\t\tbtChnl\n\t);\ntypedef u4Byte \n(*BFP_BTC_GET_BT_REG)(\n\tIN \tPVOID\t\t\tpBtcContext,\n\tIN\tu1Byte\t\t\tregType,\n\tIN\tu4Byte\t\t\toffset\n\t);\ntypedef VOID\n(*BFP_BTC_DISP_DBG_MSG)(\n\tIN\tPVOID\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tdispType\n\t);\n\ntypedef struct _BTC_BT_INFO{\n\tBOOLEAN\t\t\t\t\tbBtDisabled;\n\tu1Byte\t\t\t\t\trssiAdjustForAgcTableOn;\n\tu1Byte\t\t\t\t\trssiAdjustFor1AntCoexType;\n\tBOOLEAN\t\t\t\t\tbPreBtCtrlAggBufSize;\n\tBOOLEAN\t\t\t\t\tbBtCtrlAggBufSize;\n\tBOOLEAN\t\t\t\t\tbPreRejectAggPkt;\n\tBOOLEAN\t\t\t\t\tbRejectAggPkt;\n\tBOOLEAN\t\t\t\t\tbIncreaseScanDevNum;\n\tBOOLEAN\t\t\t\t\tbBtTxRxMask;\n\tu1Byte\t\t\t\t\tpreAggBufSize;\n\tu1Byte\t\t\t\t\taggBufSize;\n\tBOOLEAN\t\t\t\t\tbBtBusy;\n\tBOOLEAN\t\t\t\t\tbLimitedDig;\n\tu2Byte\t\t\t\t\tbtHciVer;\n\tu2Byte\t\t\t\t\tbtRealFwVer;\n\tu1Byte\t\t\t\t\tbtFwVer;\n\tu4Byte\t\t\t\t\tgetBtFwVerCnt;\n\tBOOLEAN\t\t\t\t\tbMiracastPlusBt;\n\n\tBOOLEAN\t\t\t\t\tbBtDisableLowPwr;\n\n\tBOOLEAN\t\t\t\t\tbBtCtrlLps;\n\tBOOLEAN\t\t\t\t\tbBtLpsOn;\n\tBOOLEAN\t\t\t\t\tbForceToRoam;\t// for 1Ant solution\n\tu1Byte\t\t\t\t\tlpsVal;\n\tu1Byte\t\t\t\t\trpwmVal;\n\tu4Byte\t\t\t\t\traMask;\n} BTC_BT_INFO, *PBTC_BT_INFO;\n\ntypedef struct _BTC_STACK_INFO{\n\tBOOLEAN\t\t\t\t\tbProfileNotified;\n\tu2Byte\t\t\t\t\thciVersion;\t// stack hci version\n\tu1Byte\t\t\t\t\tnumOfLink;\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbAclExist;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tu1Byte\t\t\t\t\tnumOfHid;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\tBOOLEAN\t\t\t\t\tbUnknownAclExist;\n\ts1Byte\t\t\t\t\tminBtRssi;\n} BTC_STACK_INFO, *PBTC_STACK_INFO;\n\ntypedef struct _BTC_BT_LINK_INFO{\n\tBOOLEAN\t\t\t\t\tbBtLinkExist;\n\tBOOLEAN\t\t\t\t\tbBtHiPriLinkExist;\n\tBOOLEAN\t\t\t\t\tbScoExist;\n\tBOOLEAN\t\t\t\t\tbScoOnly;\n\tBOOLEAN\t\t\t\t\tbA2dpExist;\n\tBOOLEAN\t\t\t\t\tbA2dpOnly;\n\tBOOLEAN\t\t\t\t\tbHidExist;\n\tBOOLEAN\t\t\t\t\tbHidOnly;\n\tBOOLEAN\t\t\t\t\tbPanExist;\n\tBOOLEAN\t\t\t\t\tbPanOnly;\n\tBOOLEAN\t\t\t\t\tbSlaveRole;\n\tBOOLEAN\t\t\t\t\tbAclBusy;\n} BTC_BT_LINK_INFO, *PBTC_BT_LINK_INFO;\n\ntypedef struct _BTC_STATISTICS{\n\tu4Byte\t\t\t\t\tcntBind;\n\tu4Byte\t\t\t\t\tcntPowerOn;\n\tu4Byte\t\t\t\t\tcntPreLoadFirmware;\n\tu4Byte\t\t\t\t\tcntInitHwConfig;\n\tu4Byte\t\t\t\t\tcntInitCoexDm;\n\tu4Byte\t\t\t\t\tcntIpsNotify;\n\tu4Byte\t\t\t\t\tcntLpsNotify;\n\tu4Byte\t\t\t\t\tcntScanNotify;\n\tu4Byte\t\t\t\t\tcntConnectNotify;\n\tu4Byte\t\t\t\t\tcntMediaStatusNotify;\n\tu4Byte\t\t\t\t\tcntSpecialPacketNotify;\n\tu4Byte\t\t\t\t\tcntBtInfoNotify;\n\tu4Byte\t\t\t\t\tcntRfStatusNotify;\n\tu4Byte\t\t\t\t\tcntPeriodical;\n\tu4Byte\t\t\t\t\tcntCoexDmSwitch;\n\tu4Byte\t\t\t\t\tcntStackOperationNotify;\n\tu4Byte\t\t\t\t\tcntDbgCtrl;\n} BTC_STATISTICS, *PBTC_STATISTICS;\n\ntypedef struct _BTC_COEXIST{\n\tBOOLEAN\t\t\t\tbBinded;\t\t// make sure only one adapter can bind the data context\n\tPVOID\t\t\t\tAdapter;\t\t// default adapter\n\tBTC_BOARD_INFO\t\tboardInfo;\n\tBTC_BT_INFO\t\t\tbtInfo;\t\t// some bt info referenced by non-bt module\n\tBTC_STACK_INFO\t\tstackInfo;\n\tBTC_BT_LINK_INFO\tbtLinkInfo;\n\tBTC_CHIP_INTERFACE\tchipInterface;\n\n\tBOOLEAN\t\t\t\tbInitilized;\n\tBOOLEAN\t\t\t\tbStopCoexDm;\n\tBOOLEAN\t\t\t\tbManualControl;\n\tpu1Byte\t\t\t\tcliBuf;\n\tBTC_STATISTICS\t\tstatistics;\n\tu1Byte\t\t\t\tpwrModeVal[10];\n\t\t\n\t// function pointers\n\t// io related\n\tBFP_BTC_R1\t\t\tfBtcRead1Byte;\n\tBFP_BTC_W1\t\t\tfBtcWrite1Byte;\n\tBFP_BTC_W1_BIT_MASK\tfBtcWrite1ByteBitMask;\n\tBFP_BTC_R2\t\t\tfBtcRead2Byte;\n\tBFP_BTC_W2\t\t\tfBtcWrite2Byte;\n\tBFP_BTC_R4\t\t\tfBtcRead4Byte;\n\tBFP_BTC_W4\t\t\tfBtcWrite4Byte;\n\tBFP_BTC_LOCAL_REG_W1\tfBtcWriteLocalReg1Byte;\n\t// read/write bb related\n\tBFP_BTC_SET_BB_REG\tfBtcSetBbReg;\n\tBFP_BTC_GET_BB_REG\tfBtcGetBbReg;\n\n\t// read/write rf related\n\tBFP_BTC_SET_RF_REG\tfBtcSetRfReg;\n\tBFP_BTC_GET_RF_REG\tfBtcGetRfReg;\n\t\n\t// fill h2c related\n\tBFP_BTC_FILL_H2C\t\tfBtcFillH2c;\n\t// other\n\tBFP_BTC_DISP_DBG_MSG\tfBtcDispDbgMsg;\n\t// normal get/set related\n\tBFP_BTC_GET\t\t\tfBtcGet;\n\tBFP_BTC_SET\t\t\tfBtcSet;\n\n\tBFP_BTC_GET_BT_REG\tfBtcGetBtReg;\n\tBFP_BTC_SET_BT_REG\tfBtcSetBtReg;\n\n\tBFP_BTC_SET_BT_ANT_DETECTION\tfBtcSetBtAntDetection;\n} BTC_COEXIST, *PBTC_COEXIST;\n\nextern BTC_COEXIST\t\t\t\tGLBtCoexist;\n\nBOOLEAN\nEXhalbtcoutsrc_InitlizeVariables(\n\tIN\tPVOID\t\tAdapter\t\n\t);\nVOID\nEXhalbtcoutsrc_PowerOnSetting(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_PreLoadFirmware(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_InitHwConfig(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tBOOLEAN\t\t\t\tbWifiOnly\n\t);\nVOID\nEXhalbtcoutsrc_InitCoexDm(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_IpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtcoutsrc_LpsNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtcoutsrc_ScanNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtcoutsrc_ConnectNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\taction\n\t);\nVOID\nEXhalbtcoutsrc_MediaStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tRT_MEDIA_STATUS\tmediaStatus\n\t);\nVOID\nEXhalbtcoutsrc_SpecialPacketNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tpktType\n\t);\nVOID\nEXhalbtcoutsrc_BtInfoNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tpu1Byte\t\t\ttmpBuf,\n\tIN\tu1Byte\t\t\tlength\n\t);\nVOID\nEXhalbtcoutsrc_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte \t\t\t\ttype\n\t);\nVOID\nEXhalbtcoutsrc_StackOperationNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\ttype\n\t);\nVOID\nEXhalbtcoutsrc_HaltNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_PnpNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\tpnpState\n\t);\nVOID\nEXhalbtcoutsrc_CoexDmSwitch(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_Periodical(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_DbgControl(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu1Byte\t\t\t\topCode,\n\tIN\tu1Byte\t\t\t\topLen,\n\tIN\tpu1Byte\t\t\t\tpData\n\t);\nVOID\nEXhalbtcoutsrc_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t);\nVOID\nEXhalbtcoutsrc_StackUpdateProfileInfo(\n\tVOID\n\t);\nVOID\nEXhalbtcoutsrc_SetHciVersion(\n\tIN\tu2Byte\thciVersion\n\t);\nVOID\nEXhalbtcoutsrc_SetBtPatchVersion(\n\tIN\tu2Byte\tbtHciVersion,\n\tIN\tu2Byte\tbtPatchVersion\n\t);\nVOID\nEXhalbtcoutsrc_UpdateMinBtRssi(\n\tIN\ts1Byte\tbtRssi\n\t);\n#if 0\nVOID\nEXhalbtcoutsrc_SetBtExist(\n\tIN\tBOOLEAN\t\tbBtExist\n\t);\n#endif\nVOID\nEXhalbtcoutsrc_SetChipType(\n\tIN\tu1Byte\t\tchipType\n\t);\nVOID\nEXhalbtcoutsrc_SetAntNum(\n\tIN\tu1Byte\t\ttype,\n\tIN\tu1Byte\t\tantNum\n\t);\nVOID\nEXhalbtcoutsrc_SetSingleAntPath(\n\tIN\tu1Byte\t\tsingleAntPath\n\t);\nVOID\nEXhalbtcoutsrc_DisplayBtCoexInfo(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\nVOID\nEXhalbtcoutsrc_DisplayAntDetection(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist\n\t);\n\n#endif\n"
  },
  {
    "path": "hal/btc/Mp_Precomp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __MP_PRECOMP_H__\n#define __MP_PRECOMP_H__\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#define BT_TMP_BUF_SIZE\t100\n\n#ifdef PLATFORM_LINUX\n#define rsprintf snprintf\n#elif defined(PLATFORM_WINDOWS)\n#define rsprintf sprintf_s\n#endif\n\n#define DCMD_Printf\t\t\tDBG_BT_INFO\n\n#define delay_ms(ms)\t\trtw_mdelay_os(ms)\n\n#ifdef bEnable\n#undef bEnable\n#endif\n\n#define WPP_SOFTWARE_TRACE 0\n\ntypedef enum _BTC_MSG_COMP_TYPE{\n\tCOMP_COEX\t\t= 0,\n\tCOMP_MAX\n}BTC_MSG_COMP_TYPE;\nextern u4Byte GLBtcDbgType[];\n\n#define DBG_OFF\t\t\t0\n#define DBG_SEC\t\t\t1\n#define DBG_SERIOUS\t\t2\n#define DBG_WARNING\t\t3\n#define DBG_LOUD\t\t4\n#define DBG_TRACE\t\t5\n\n#if DBG\n#ifdef RT_TRACE\n#undef RT_TRACE\n#define RT_TRACE(dbgtype, dbgflag, printstr)\\\ndo {\\\n\tif (GLBtcDbgType[dbgtype] & BIT(dbgflag))\\\n\t{\\\n\t\tDbgPrint printstr;\\\n\t}\\\n} while (0)\n#endif\n#else\n#define RT_TRACE(dbgtype, dbgflag, printstr)\n#endif\n\n#include \"HalBtcOutSrc.h\"\n#include \"HalBtc8188c2Ant.h\"\n#include \"HalBtc8192d2Ant.h\"\n#include \"HalBtc8192e1Ant.h\"\n#include \"HalBtc8192e2Ant.h\"\n#include \"HalBtc8723a1Ant.h\"\n#include \"HalBtc8723a2Ant.h\"\n#include \"HalBtc8723b1Ant.h\"\n#include \"HalBtc8723b2Ant.h\"\n#include \"HalBtc8812a1Ant.h\"\n#include \"HalBtc8812a2Ant.h\"\n#include \"HalBtc8821a1Ant.h\"\n#include \"HalBtc8821a2Ant.h\"\n#include \"HalBtc8821aCsr2Ant.h\"\n#include \"HalBtc8703b1Ant.h\"\n#include \"HalBtc8703b2Ant.h\"\n\n#endif // __MP_PRECOMP_H__\n"
  },
  {
    "path": "hal/efuse/efuse_mask.h",
    "content": "\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\n\t#if defined(CONFIG_RTL8188E)\n\t#include \"rtl8188e/HalEfuseMask8188E_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A)\n\t#include \"rtl8812a/HalEfuseMask8812A_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8821A)\n\t#include \"rtl8812a/HalEfuseMask8821A_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8192E)\n\t#include \"rtl8192e/HalEfuseMask8192E_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8723B)\n\t#include \"rtl8723b/HalEfuseMask8723B_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8814A)\n\t#include \"rtl8814a/HalEfuseMask8814A_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8703B)\n\t#include \"rtl8703b/HalEfuseMask8703B_USB.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8188F)\n\t#include \"rtl8188f/HalEfuseMask8188F_USB.h\"\n\t#endif\n\n#elif DEV_BUS_TYPE == RT_PCI_INTERFACE\n\n\t#if defined(CONFIG_RTL8188E)\n\t#include \"rtl8188e/HalEfuseMask8188E_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A)\n\t#include \"rtl8812a/HalEfuseMask8812A_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8821A)\n\t#include \"rtl8812a/HalEfuseMask8821A_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8192E)\n\t#include \"rtl8192e/HalEfuseMask8192E_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8723B)\n\t#include \"rtl8723b/HalEfuseMask8723B_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8814A)\n\t#include \"rtl8814a/HalEfuseMask8814A_PCIE.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8703B)\n\t#include \"rtl8703b/HalEfuseMask8703B_PCIE.h\"\n\t#endif\n\n#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE\n\n\t#if defined(CONFIG_RTL8188E)\n\t#include \"rtl8188e/HalEfuseMask8188E_SDIO.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8703B)\n\t#include \"rtl8703b/HalEfuseMask8703B_SDIO.h\"\n\t#endif\n\n\t#if defined(CONFIG_RTL8188F)\n\t#include \"rtl8188f/HalEfuseMask8188F_SDIO.h\"\n\t#endif\n\n#endif"
  },
  {
    "path": "hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n#include <drv_types.h>\n\n#include \"HalEfuseMask8814A_PCIE.h\"\n\n/******************************************************************************\n*                           MPCIE.TXT\n******************************************************************************/\n\nu1Byte Array_MP_8814A_MPCIE[] = { \n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xF3,\n\t\t0xFF,\n\t\t0x10,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\n};\n\nu2Byte\nEFUSE_GetArrayLen_MP_8814A_MPCIE(VOID)\n{\n\treturn sizeof(Array_MP_8814A_MPCIE)/sizeof(u1Byte);\n}\n\nVOID\nEFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array)\n{\n\tu2Byte len = EFUSE_GetArrayLen_MP_8814A_MPCIE(), i = 0;\n\n\tfor (i = 0; i < len; ++i)\n\t\tArray[i] = Array_MP_8814A_MPCIE[i];\n}\n\nBOOLEAN\nEFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte  Offset)\n{\n\tint r = Offset/16;\n\tint c = (Offset%16) / 2;\n\tint result = 0;\n\n\tif (c < 4) /*Upper double word*/\n\t    result = (Array_MP_8814A_MPCIE[r] & (0x10 << c));\n\telse\n\t    result = (Array_MP_8814A_MPCIE[r] & (0x01 << (c-4)));\n\n\treturn (result > 0) ? 0 : 1;\n}\n\n"
  },
  {
    "path": "hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n\n/******************************************************************************\n*                           MPCIE.TXT\n******************************************************************************/\n\n\nu2Byte EFUSE_GetArrayLen_MP_8814A_MPCIE(VOID);\n\nVOID EFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array);\n\nBOOLEAN EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte  Offset);\n\n\n"
  },
  {
    "path": "hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n#include <drv_types.h>\n\n#include \"HalEfuseMask8814A_USB.h\"\n\n/******************************************************************************\n*                           MUSB.TXT\n******************************************************************************/\n\nu1Byte Array_MP_8814A_MUSB[] = { \n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xF3,\n\t\t0x7F,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0xFF,\n\t\t0x70,\n\t\t0x04,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\t\t0x00,\n\n};\n\nu2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID)\n{\n\treturn sizeof(Array_MP_8814A_MUSB)/sizeof(u1Byte);\n}\n\nVOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array)\n{\n\tu2Byte len = EFUSE_GetArrayLen_MP_8814A_MUSB(), i = 0;\n\n\tfor (i = 0; i < len; ++i)\n\t\tArray[i] = Array_MP_8814A_MUSB[i];\n}\n\nBOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte  Offset)\n{\n\tint r = Offset/16;\n\tint c = (Offset%16) / 2;\n\tint result = 0;\n\n\tif (c < 4) /*Upper double word*/\n\t    result = (Array_MP_8814A_MUSB[r] & (0x10 << c));\n\telse\n\t    result = (Array_MP_8814A_MUSB[r] & (0x01 << (c-4)));\n\n\treturn (result > 0) ? 0 : 1;\n}\n\n"
  },
  {
    "path": "hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n\n\n/******************************************************************************\n*                           MUSB.TXT\n******************************************************************************/\n\n\nu2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID);\n\nVOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array);\n\nBOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte  Offset);\n\n"
  },
  {
    "path": "hal/hal_btcoex.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define __HAL_BTCOEX_C__\n\n#ifdef CONFIG_BT_COEXIST\n\n#include <hal_data.h>\n#include <hal_btcoex.h>\n#include <Mp_Precomp.h>\n\n//====================================\n//\t\tGlobal variables\n//====================================\nconst char *const BtProfileString[] =\n{\n\t\"NONE\",\n\t\"A2DP\",\n\t\"PAN\",\n\t\"HID\",\n\t\"SCO\",\n};\n\nconst char *const BtSpecString[] =\n{\n\t\"1.0b\",\n\t\"1.1\",\n\t\"1.2\",\n\t\"2.0+EDR\",\n\t\"2.1+EDR\",\n\t\"3.0+HS\",\n\t\"4.0\",\n};\n\nconst char *const BtLinkRoleString[] =\n{\n\t\"Master\",\n\t\"Slave\",\n};\n\nconst char *const h2cStaString[] =\n{\n\t\"successful\",\n\t\"h2c busy\",\n\t\"rf off\",\n\t\"fw not read\",\n};\n\nconst char *const ioStaString[] =\n{\n\t\"success\",\n\t\"can not IO\",\n\t\"rf off\",\n\t\"fw not read\",\n\t\"wait io timeout\",\n\t\"invalid len\",\n\t\"idle Q empty\",\n\t\"insert waitQ fail\",\n\t\"unknown fail\",\n\t\"wrong level\",\n\t\"h2c stopped\",\n};\n\nconst char *const GLBtcWifiBwString[]={\n\t\"11bg\",\n\t\"HT20\",\n\t\"HT40\",\n\t\"HT80\",\n\t\"HT160\"\n};\n\nconst char *const GLBtcWifiFreqString[]={\n\t\"2.4G\",\n\t\"5G\"\n};\n\nconst char *const GLBtcIotPeerString[] = {\n\t\"UNKNOWN\",\n\t\"REALTEK\",\n\t\"REALTEK_92SE\",\n\t\"BROADCOM\",\n\t\"RALINK\",\n\t\"ATHEROS\",\n\t\"CISCO\",\n\t\"MERU\",\t\n\t\"MARVELL\",\n\t\"REALTEK_SOFTAP\", /* peer is RealTek SOFT_AP, by Bohn, 2009.12.17 */\n\t\"SELF_SOFTAP\", /* Self is SoftAP */\n\t\"AIRGO\",\n\t\"INTEL\", \n\t\"RTK_APCLIENT\", \n\t\"REALTEK_81XX\",\t\n\t\"REALTEK_WOW\",\n\t\"REALTEK_JAGUAR_BCUTAP\",\n\t\"REALTEK_JAGUAR_CCUTAP\"\n};\n\n#define HALBTCOUTSRC_AGG_CHK_WINDOW_IN_MS\t8000\n\nBTC_COEXIST GLBtCoexist;\nu8 GLBtcWiFiInScanState;\nu8 GLBtcWiFiInIQKState;\nu8 GLBtcWiFiInIPS;\nu8 GLBtcWiFiInLPS;\nu8 GLBtcBtCoexAliveRegistered;\n\nu32 GLBtcDbgType[COMP_MAX];\nu8 GLBtcDbgBuf[BT_TMP_BUF_SIZE];\n\ntypedef struct _btcoexdbginfo\n{\n\tu8 *info;\n\tu32 size; // buffer total size\n\tu32 len; // now used length\n} BTCDBGINFO, *PBTCDBGINFO;\n\nBTCDBGINFO GLBtcDbgInfo;\n\n#define\tBT_Operation(Adapter)\t\t\t\t\t\t_FALSE\n\nstatic void DBG_BT_INFO_INIT(PBTCDBGINFO pinfo, u8 *pbuf, u32 size)\n{\n\tif (NULL == pinfo) return;\n\n\t_rtw_memset(pinfo, 0, sizeof(BTCDBGINFO));\n\n\tif (pbuf && size) {\n\t\tpinfo->info = pbuf;\n\t\tpinfo->size = size;\n\t}\n}\n\nvoid DBG_BT_INFO(u8 *dbgmsg)\n{\n\tPBTCDBGINFO pinfo;\n\tu32 msglen, buflen;\n\tu8 *pbuf;\n\n\n\tpinfo = &GLBtcDbgInfo;\n\n\tif (NULL == pinfo->info)\n\t\treturn;\n\n\tmsglen = strlen(dbgmsg);\n\tif (pinfo->len + msglen > pinfo->size)\n\t\treturn;\n\n\tpbuf = pinfo->info + pinfo->len;\n\t_rtw_memcpy(pbuf, dbgmsg, msglen);\n\tpinfo->len += msglen;\n}\n\n//====================================\n//\t\tDebug related function\n//====================================\nstatic u8 halbtcoutsrc_IsBtCoexistAvailable(PBTC_COEXIST pBtCoexist)\n{\n\tif (!pBtCoexist->bBinded ||\n\t\tNULL == pBtCoexist->Adapter)\n\t{\n\t\treturn _FALSE;\n\t}\n\treturn _TRUE;\n}\n\nstatic void halbtcoutsrc_DbgInit(void)\n{\n\tu8\ti;\n\n\tfor (i = 0; i < COMP_MAX; i++)\n\t\tGLBtcDbgType[i] = 0;\n}\n\nstatic u8 halbtcoutsrc_IsCsrBtCoex(PBTC_COEXIST pBtCoexist)\n{\n\tif (pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC4\n\t\t|| pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC8\n\t){\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n}\n\nstatic u8 halbtcoutsrc_IsHwMailboxExist(PBTC_COEXIST pBtCoexist)\n{\n\tif (pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC4\n\t\t|| pBtCoexist->boardInfo.btChipType == BTC_CHIP_CSR_BC8\n\t){\n\t\treturn _FALSE;\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\treturn _FALSE;\n\t}\n\telse\n\t\treturn _TRUE;\n}\n\nstatic void halbtcoutsrc_LeaveLps(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER padapter;\n\n\n\tpadapter = pBtCoexist->Adapter;\n\n\tpBtCoexist->btInfo.bBtCtrlLps = _TRUE;\n\tpBtCoexist->btInfo.bBtLpsOn = _FALSE;\n\n\trtw_btcoex_LPS_Leave(padapter);\n}\n\nvoid halbtcoutsrc_EnterLps(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER padapter;\n\n\n\tpadapter = pBtCoexist->Adapter;\n\n\tpBtCoexist->btInfo.bBtCtrlLps = _TRUE;\n\tpBtCoexist->btInfo.bBtLpsOn = _TRUE;\n\n\trtw_btcoex_LPS_Enter(padapter);\n}\n\nvoid halbtcoutsrc_NormalLps(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER padapter;\n\n\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Normal LPS behavior!!!\\n\"));\n\n\tpadapter = pBtCoexist->Adapter;\n\n\tif (pBtCoexist->btInfo.bBtCtrlLps)\n\t{\n\t\tpBtCoexist->btInfo.bBtLpsOn = _FALSE;\n\t\trtw_btcoex_LPS_Leave(padapter);\n\t\tpBtCoexist->btInfo.bBtCtrlLps = _FALSE;\n\n\t\t// recover the LPS state to the original\n#if 0\n\t\tpadapter->HalFunc.UpdateLPSStatusHandler(\n\t\t\tpadapter,\n\t\t\tpPSC->RegLeisurePsMode,\n\t\t\tpPSC->RegPowerSaveMode);\n#endif\n\t}\n}\n\n/*\n *  Constraint:\n *\t   1. this function will request pwrctrl->lock\n */\nvoid halbtcoutsrc_LeaveLowPower(PBTC_COEXIST pBtCoexist)\n{\n#ifdef CONFIG_LPS_LCLK\n\tPADAPTER padapter;\n\tPHAL_DATA_TYPE pHalData;\n\tstruct pwrctrl_priv *pwrctrl;\n\ts32 ready;\n\tu32 stime;\n\ts32 utime;\n\tu32 timeout; // unit: ms\n\n\n\tpadapter = pBtCoexist->Adapter;\n\tpHalData = GET_HAL_DATA(padapter);\n\tpwrctrl = adapter_to_pwrctl(padapter);\n\tready = _FAIL;\n#ifdef LPS_RPWM_WAIT_MS\n\ttimeout = LPS_RPWM_WAIT_MS;\n#else // !LPS_RPWM_WAIT_MS\n\ttimeout = 30;\n#endif // !LPS_RPWM_WAIT_MS\n\n\tif (GLBtcBtCoexAliveRegistered == _TRUE)\n\t\treturn;\n\n\tstime = rtw_get_current_time();\n\tdo {\n\t\tready = rtw_register_task_alive(padapter, BTCOEX_ALIVE);\n\t\tif (_SUCCESS == ready)\n\t\t\tbreak;\n\n\t\tutime = rtw_get_passing_time_ms(stime);\n\t\tif (utime > timeout)\n\t\t\tbreak;\n\n\t\trtw_msleep_os(1);\n\t} while (1);\n\n\tGLBtcBtCoexAliveRegistered = _TRUE;\n#endif // CONFIG_LPS_LCLK\n}\n\n/*\n *  Constraint:\n *\t   1. this function will request pwrctrl->lock\n */\nvoid halbtcoutsrc_NormalLowPower(PBTC_COEXIST pBtCoexist)\n{\n#ifdef CONFIG_LPS_LCLK\n\tPADAPTER padapter;\n\n\tif (GLBtcBtCoexAliveRegistered == _FALSE)\n\t\treturn;\n\n\tpadapter = pBtCoexist->Adapter;\n\trtw_unregister_task_alive(padapter, BTCOEX_ALIVE);\n\n\tGLBtcBtCoexAliveRegistered = _FALSE;\n#endif // CONFIG_LPS_LCLK\n}\n\nvoid halbtcoutsrc_DisableLowPower(PBTC_COEXIST pBtCoexist, u8 bLowPwrDisable)\n{\n\tpBtCoexist->btInfo.bBtDisableLowPwr = bLowPwrDisable;\n\tif (bLowPwrDisable)\n\t\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\t\t// leave 32k low power.\n\telse\n\t\thalbtcoutsrc_NormalLowPower(pBtCoexist);\t// original 32k low power behavior.\n}\n\nvoid halbtcoutsrc_AggregationCheck(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER padapter;\n\tBOOLEAN bNeedToAct = _FALSE;\n\tstatic u32 preTime = 0;\n\tu32 curTime = 0;\n\n\tpadapter = pBtCoexist->Adapter;\n\n\t//=====================================\n\t// To void continuous deleteBA=>addBA=>deleteBA=>addBA\n\t// This function is not allowed to continuous called.\n\t// It can only be called after 8 seconds.\n\t//=====================================\n\n\tcurTime = rtw_systime_to_ms(rtw_get_current_time());\n\tif((curTime - preTime) < HALBTCOUTSRC_AGG_CHK_WINDOW_IN_MS)\t// over 8 seconds you can execute this function again.\n\t{\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tpreTime = curTime;\n\t}\n\n\tif (pBtCoexist->btInfo.bRejectAggPkt)\n\t{\n\t\tbNeedToAct = _TRUE;\n\t\tpBtCoexist->btInfo.bPreRejectAggPkt = pBtCoexist->btInfo.bRejectAggPkt;\n\t}\n\telse\n\t{\n\t\tif(pBtCoexist->btInfo.bPreRejectAggPkt)\n\t\t{\n\t\t\tbNeedToAct = _TRUE;\n\t\t\tpBtCoexist->btInfo.bPreRejectAggPkt = pBtCoexist->btInfo.bRejectAggPkt;\n\t\t}\n\t\t\n\t\tif (pBtCoexist->btInfo.bPreBtCtrlAggBufSize !=\n\t\t\tpBtCoexist->btInfo.bBtCtrlAggBufSize)\n\t\t{\n\t\t\tbNeedToAct = _TRUE;\n\t\t\tpBtCoexist->btInfo.bPreBtCtrlAggBufSize = pBtCoexist->btInfo.bBtCtrlAggBufSize;\n\t\t}\n\n\t\tif (pBtCoexist->btInfo.bBtCtrlAggBufSize)\n\t\t{\n\t\t\tif (pBtCoexist->btInfo.preAggBufSize !=\n\t\t\t\tpBtCoexist->btInfo.aggBufSize)\n\t\t\t{\n\t\t\t\tbNeedToAct = _TRUE;\n\t\t\t}\n\t\t\tpBtCoexist->btInfo.preAggBufSize = pBtCoexist->btInfo.aggBufSize;\n\t\t}\n\t}\n\n\tif (bNeedToAct)\n\t\trtw_btcoex_rx_ampdu_apply(padapter);\n}\n\nu8 halbtcoutsrc_IsWifiBusy(PADAPTER padapter)\n{\n\tstruct mlme_priv *pmlmepriv;\n\n\n\tpmlmepriv = &padapter->mlmepriv;\n\n\tif (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _TRUE)\n\t{\n\t\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\treturn _TRUE;\n\t\tif (_TRUE == pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\treturn _TRUE;\n\t}\n\n#if defined(CONFIG_CONCURRENT_MODE)\n\tpmlmepriv = &padapter->pbuddy_adapter->mlmepriv;\n\n\tif (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _TRUE)\n\t{\n\t\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\treturn _TRUE;\n\t\tif (_TRUE == pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\treturn _TRUE;\n\t}\n#endif\n\n\treturn _FALSE;\n}\n\nstatic u32 _halbtcoutsrc_GetWifiLinkStatus(PADAPTER padapter)\n{\n\tstruct mlme_priv *pmlmepriv;\n\tu8 bp2p;\n\tu32 portConnectedStatus;\n\n\n\tpmlmepriv = &padapter->mlmepriv;\n\tbp2p = _FALSE;\n\tportConnectedStatus = 0;\n\n#ifdef CONFIG_P2P\n\tif (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\n\t\tbp2p = _TRUE;\n#endif // CONFIG_P2P\n\n\tif (check_fwstate(pmlmepriv, WIFI_ASOC_STATE) == _TRUE)\n\t{\n\t\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t{\n\t\t\tif (_TRUE == bp2p)\n\t\t\t\tportConnectedStatus |= WIFI_P2P_GO_CONNECTED;\n\t\t\telse\n\t\t\t\tportConnectedStatus |= WIFI_AP_CONNECTED;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (_TRUE == bp2p)\n\t\t\t\tportConnectedStatus |= WIFI_P2P_GC_CONNECTED;\n\t\t\telse\n\t\t\t\tportConnectedStatus |= WIFI_STA_CONNECTED;\n\t\t}\n\t}\n\n\treturn portConnectedStatus;\n}\n\nu32 halbtcoutsrc_GetWifiLinkStatus(PBTC_COEXIST pBtCoexist)\n{\n\t//=================================\n\t// return value:\n\t// [31:16]=> connected port number\n\t// [15:0]=> port connected bit define\n\t//================================\n\n\tPADAPTER padapter;\n\tu32 retVal;\n\tu32 portConnectedStatus, numOfConnectedPort;\n\n\n\tpadapter = pBtCoexist->Adapter;\n\tretVal = 0;\n\tportConnectedStatus = 0;\n\tnumOfConnectedPort = 0;\n\n\tretVal = _halbtcoutsrc_GetWifiLinkStatus(padapter);\n\tif (retVal)\n\t{\n\t\tportConnectedStatus |= retVal;\n\t\tnumOfConnectedPort++;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter)\n\t{\n\t\tretVal = _halbtcoutsrc_GetWifiLinkStatus(padapter->pbuddy_adapter);\n\t\tif (retVal)\n\t\t{\n\t\t\tportConnectedStatus |= retVal;\n\t\t\tnumOfConnectedPort++;\n\t\t}\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\tretVal = (numOfConnectedPort << 16) | portConnectedStatus;\n\t\n\treturn retVal;\n}\n\nu32 halbtcoutsrc_GetBtPatchVer(PBTC_COEXIST pBtCoexist)\n{\n\tu16 btRealFwVer = 0x0;\n\tu8 btFwVer = 0x0;\n\tu8 cnt = 0;\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tif (!pBtCoexist->btInfo.btRealFwVer && cnt<=5)\n\t{\n#if 0\n\t\tif (halbtcoutsrc_IsHwMailboxExist(pBtCoexist))\n\t\t{\t// mailbox exists, through mailbox\n\t\t\tif (NDBG_GetBtFwVersion(pBtCoexist->Adapter, &btRealFwVer, &btFwVer))\n\t\t\t{\n\t\t\t\tpBtCoexist->btInfo.btRealFwVer = btRealFwVer;\n\t\t\t\tpBtCoexist->btInfo.btFwVer = btFwVer;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpBtCoexist->btInfo.btRealFwVer = 0x0;\n\t\t\t\tpBtCoexist->btInfo.btFwVer = 0x0;\n\t\t\t}\n\t\t}\n\t\telse\t// no mailbox, query bt patch version through stack.\n#endif\n\t\t// query bt patch version through socket.\n\t\t{\n\t\t\tu1Byte\tdataLen=2;\n\t\t\tu1Byte\tbuf[4] = {0};\n\t\t\tbuf[0] = 0x0;\t// OP_Code\n\t\t\tbuf[1] = 0x0;\t// OP_Code_Length\n\t\t\tBT_SendEventExtBtCoexControl(pBtCoexist->Adapter, _FALSE, dataLen, &buf[0]);\n\t\t}\n\t\tcnt++;\n\t}\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\treturn pBtCoexist->btInfo.btRealFwVer;\n}\n\ns32 halbtcoutsrc_GetWifiRssi(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\ts32 UndecoratedSmoothedPWDB = 0;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tUndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\n\treturn UndecoratedSmoothedPWDB;\n}\n\nstatic u8 halbtcoutsrc_GetWifiScanAPNum(PADAPTER padapter)\n{\n\tstruct mlme_priv *pmlmepriv;\n\tstruct mlme_ext_priv *pmlmeext;\n\tstatic u8 scan_AP_num = 0;\n\n\n\tpmlmepriv = &padapter->mlmepriv;\n\tpmlmeext = &padapter->mlmeextpriv;\n\n\tif (GLBtcWiFiInScanState == _FALSE) {\n\t\tif (pmlmepriv->num_of_scanned > 0xFF)\n\t\t\tscan_AP_num = 0xFF;\n\t\telse\n\t\t\tscan_AP_num = (u8)pmlmepriv->num_of_scanned;\n\t}\n\n\treturn scan_AP_num;\n}\n\nu8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\tPHAL_DATA_TYPE pHalData;\n\tstruct mlme_ext_priv *mlmeext;\n\tu8 bSoftApExist, bVwifiExist;\n\tu8 *pu8;\n\ts32 *pS4Tmp;\n\tu32 *pU4Tmp;\n\tu8 *pU1Tmp;\n\tu8 ret;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn _FALSE;\n\n\tpadapter = pBtCoexist->Adapter;\n\tpHalData = GET_HAL_DATA(padapter);\n\tmlmeext = &padapter->mlmeextpriv;\n\tbSoftApExist = _FALSE;\n\tbVwifiExist = _FALSE;\n\tpu8 = (u8*)pOutBuf;\n\tpS4Tmp = (s32*)pOutBuf;\n\tpU4Tmp = (u32*)pOutBuf;\n\tpU1Tmp = (u8*)pOutBuf;\n\tret = _TRUE;\n\n\tswitch (getType)\n\t{\n\t\tcase BTC_GET_BL_HS_OPERATION:\n\t\t\t*pu8 = _FALSE;\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_HS_CONNECTING:\n\t\t\t*pu8 = _FALSE;\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_CONNECTED:\n\t\t\t*pu8 = check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((_FALSE == *pu8) && padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\t*pu8 = check_fwstate(&padapter->pbuddy_adapter->mlmepriv, WIFI_ASOC_STATE);\n\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_BUSY:\n\t\t\t*pu8 = halbtcoutsrc_IsWifiBusy(padapter);\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_SCAN:\n#if 0\t\t\t\n\t\t\t*pu8 = check_fwstate(&padapter->mlmepriv, WIFI_SITE_MONITOR);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((_FALSE == *pu8) && padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\t*pu8 = check_fwstate(&padapter->pbuddy_adapter->mlmepriv, WIFI_SITE_MONITOR);\n\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n#else\t\t\n\t\t\t/* Use the value of the new variable GLBtcWiFiInScanState to judge whether WiFi is in scan state or not, since the originally used flag \n\t\t\t\tWIFI_SITE_MONITOR in fwstate may not be cleared in time */\n\t\t\t*pu8 = GLBtcWiFiInScanState;\n#endif\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_LINK:\n\t\t\t*pu8 = check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((_FALSE == *pu8) && padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\t*pu8 = check_fwstate(&padapter->pbuddy_adapter->mlmepriv, WIFI_UNDER_LINKING);\n\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_ROAM:\n\t\t\t*pu8 = check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((_FALSE == *pu8) && padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\t*pu8 = check_fwstate(&padapter->pbuddy_adapter->mlmepriv, WIFI_UNDER_LINKING);\n\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_4_WAY_PROGRESS:\n\t\t\t*pu8 = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_UNDER_5G:\n\t\t\t*pu8 = (pHalData->CurrentBandType == 1)? _TRUE : _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_AP_MODE_ENABLE:\n\t\t\t*pu8 = check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif ((_FALSE == *pu8) && padapter->pbuddy_adapter)\n\t\t\t{\n\t\t\t\t*pu8 = check_fwstate(&padapter->pbuddy_adapter->mlmepriv, WIFI_AP_STATE);\n\t\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_ENABLE_ENCRYPTION:\n\t\t\t*pu8 = padapter->securitypriv.dot11PrivacyAlgrthm == 0? _FALSE: _TRUE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_UNDER_B_MODE:\n\t\t\tif (mlmeext->cur_wireless_mode == WIRELESS_11B)\n\t\t\t\t*pu8 = _TRUE;\n\t\t\telse\n\t\t\t\t*pu8 = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_WIFI_IS_IN_MP_MODE:\n\t\t\tif (padapter->registrypriv.mp_mode == 0)\n\t\t\t{\n\t\t\t\t*pu8 = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*pu8 = _TRUE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BTC_GET_BL_EXT_SWITCH:\n\t\t\t*pu8 = _FALSE;\n\t\t\tbreak;\n\t\tcase BTC_GET_BL_IS_ASUS_8723B:\n\t\t\t/* Always return FALSE in linux driver since this case is added only for windows driver */\n\t\t\t*pu8 = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_S4_WIFI_RSSI:\n\t\t\t*pS4Tmp = halbtcoutsrc_GetWifiRssi(padapter);\n\t\t\tbreak;\n\n\t\tcase BTC_GET_S4_HS_RSSI:\n\t\t\t*pS4Tmp = 0;\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U4_WIFI_BW:\n\t\t\tif (IsLegacyOnly(mlmeext->cur_wireless_mode))\n\t\t\t\t*pU4Tmp = BTC_WIFI_BW_LEGACY;\n\t\t\telse if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_20)\n\t\t\t\t*pU4Tmp = BTC_WIFI_BW_HT20;\n\t\t\telse if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40)\n\t\t\t\t*pU4Tmp = BTC_WIFI_BW_HT40;\n\t\t\telse\n\t\t\t\t*pU4Tmp = BTC_WIFI_BW_HT40; /* todo */\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U4_WIFI_TRAFFIC_DIRECTION:\n\t\t\t{\n\t\t\t\tPRT_LINK_DETECT_T plinkinfo;\n\t\t\t\tplinkinfo = &padapter->mlmepriv.LinkDetectInfo;\n\n\t\t\t\tif (plinkinfo->NumTxOkInPeriod > plinkinfo->NumRxOkInPeriod)\n\t\t\t\t\t*pU4Tmp = BTC_WIFI_TRAFFIC_TX;\n\t\t\t\telse\n\t\t\t\t\t*pU4Tmp = BTC_WIFI_TRAFFIC_RX;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U4_WIFI_FW_VER:\n\t\t\t*pU4Tmp = pHalData->FirmwareVersion << 16;\n\t\t\t*pU4Tmp |= pHalData->FirmwareSubVersion;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U4_WIFI_LINK_STATUS:\n\t\t\t*pU4Tmp = halbtcoutsrc_GetWifiLinkStatus(pBtCoexist);\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U4_BT_PATCH_VER:\n\t\t\t*pU4Tmp = halbtcoutsrc_GetBtPatchVer(pBtCoexist);\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U1_WIFI_DOT11_CHNL:\n\t\t\t*pU1Tmp = padapter->mlmeextpriv.cur_channel;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U1_WIFI_CENTRAL_CHNL:\n\t\t\t*pU1Tmp = pHalData->CurrentChannel;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U1_WIFI_HS_CHNL:\n\t\t\t*pU1Tmp = 0;\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U1_MAC_PHY_MODE:\n//\t\t\t*pU1Tmp = BTC_SMSP;\n//\t\t\t*pU1Tmp = BTC_DMSP;\n//\t\t\t*pU1Tmp = BTC_DMDP;\n//\t\t\t*pU1Tmp = BTC_MP_UNKNOWN;\n\t\t\tbreak;\n\n\t\tcase BTC_GET_U1_AP_NUM:\n\t\t\t*pU1Tmp = halbtcoutsrc_GetWifiScanAPNum(padapter);\n\t\t\tbreak;\n\t\tcase BTC_GET_U1_ANT_TYPE:\n\t\t\tswitch(pHalData->bt_coexist.btAntisolation)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t*pU1Tmp = (u1Byte)BTC_ANT_TYPE_0;\n\t\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\t*pU1Tmp = (u1Byte)BTC_ANT_TYPE_1;\n\t\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t*pU1Tmp = (u1Byte)BTC_ANT_TYPE_2;\n\t\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\t*pU1Tmp = (u1Byte)BTC_ANT_TYPE_3;\n\t\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_3;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\t*pU1Tmp = (u1Byte)BTC_ANT_TYPE_4;\n\t\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_4;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase BTC_GET_U1_IOT_PEER:\n\t\t\t*pU1Tmp = mlmeext->mlmext_info.assoc_AP_vendor;\n\t\t\tbreak;\n\n\t\t//=======1Ant===========\n\t\tcase BTC_GET_U1_LPS_MODE:\n\t\t\t*pU1Tmp = padapter->dvobj->pwrctl_priv.pwr_mode;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\nu8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\tPHAL_DATA_TYPE pHalData;\n\tu8 *pu8;\n\tu8 *pU1Tmp;\n\tu32\t*pU4Tmp;\n\tu8 ret;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\tpHalData = GET_HAL_DATA(padapter);\n\tpu8 = (u8*)pInBuf;\n\tpU1Tmp = (u8*)pInBuf;\n\tpU4Tmp = (u32*)pInBuf;\n\tret = _TRUE;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn _FALSE;\n\n\tswitch (setType)\n\t{\n\t\t// set some u8 type variables.\n\t\tcase BTC_SET_BL_BT_DISABLE:\n\t\t\tpBtCoexist->btInfo.bBtDisabled = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_BT_TRAFFIC_BUSY:\n\t\t\tpBtCoexist->btInfo.bBtBusy = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_BT_LIMITED_DIG:\n\t\t\tpBtCoexist->btInfo.bLimitedDig = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_FORCE_TO_ROAM:\n\t\t\tpBtCoexist->btInfo.bForceToRoam = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_TO_REJ_AP_AGG_PKT:\n\t\t\tpBtCoexist->btInfo.bRejectAggPkt = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_BT_CTRL_AGG_SIZE:\n\t\t\tpBtCoexist->btInfo.bBtCtrlAggBufSize = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_INC_SCAN_DEV_NUM:\n\t\t\tpBtCoexist->btInfo.bIncreaseScanDevNum = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_BT_TX_RX_MASK:\n\t\t\tpBtCoexist->btInfo.bBtTxRxMask = *pu8;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_BL_MIRACAST_PLUS_BT:\n\t\t\tpBtCoexist->btInfo.bMiracastPlusBt = *pu8;\n\t\t\tbreak;\n\n\t\t// set some u8 type variables.\n\t\tcase BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON:\n\t\t\tpBtCoexist->btInfo.rssiAdjustForAgcTableOn = *pU1Tmp;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_U1_AGG_BUF_SIZE:\n\t\t\tpBtCoexist->btInfo.aggBufSize = *pU1Tmp;\n\t\t\tbreak;\n\n\t\t// the following are some action which will be triggered\n\t\tcase BTC_SET_ACT_GET_BT_RSSI:\n#if 0\n\t\t\tBT_SendGetBtRssiEvent(padapter);\n#else\n\t\t\tret = _FALSE;\n#endif\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_AGGREGATE_CTRL:\n\t\t\thalbtcoutsrc_AggregationCheck(pBtCoexist);\n\t\t\tbreak;\n\n\t\t//=======1Ant===========\n\t\t// set some u8 type variables.\n\t\tcase BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE:\n\t\t\tpBtCoexist->btInfo.rssiAdjustFor1AntCoexType = *pU1Tmp;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_U1_LPS_VAL:\n\t\t\tpBtCoexist->btInfo.lpsVal = *pU1Tmp;\n\t\t\tbreak;\n\n\t\tcase BTC_SET_U1_RPWM_VAL:\n\t\t\tpBtCoexist->btInfo.rpwmVal = *pU1Tmp;\n\t\t\tbreak;\n\n\t\t// the following are some action which will be triggered\n\t\tcase BTC_SET_ACT_LEAVE_LPS:\n\t\t\thalbtcoutsrc_LeaveLps(pBtCoexist);\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_ENTER_LPS:\n\t\t\thalbtcoutsrc_EnterLps(pBtCoexist);\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_NORMAL_LPS:\n\t\t\thalbtcoutsrc_NormalLps(pBtCoexist);\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_DISABLE_LOW_POWER:\n\t\t\thalbtcoutsrc_DisableLowPower(pBtCoexist, *pu8);\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_UPDATE_RAMASK:\n\t\t\tpBtCoexist->btInfo.raMask = *pU4Tmp;\n\n\t\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE)\n\t\t\t{\n\t\t\t\tstruct sta_info *psta;\n\t\t\t\tPWLAN_BSSID_EX cur_network;\n\n\t\t\t\tcur_network = &padapter->mlmeextpriv.mlmext_info.network;\n\t\t\t\tpsta = rtw_get_stainfo(&padapter->stapriv, cur_network->MacAddress);\n\t\t\t\trtw_hal_update_ra_mask(psta, 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_SEND_MIMO_PS:\n\t\t\t{\n\t\t\t\tu8 newMimoPsMode = 3;\n\t\t\t\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\t\t\t\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t\t\t\t/* *pU1Tmp = 0 use SM_PS static type */\n\t\t\t\t/* *pU1Tmp = 1 disable SM_PS */\n\t\t\t\tif (*pU1Tmp == 0)\n\t\t\t\t\tnewMimoPsMode = WLAN_HT_CAP_SM_PS_STATIC;\n\t\t\t\telse if (*pU1Tmp == 1)\n\t\t\t\t\tnewMimoPsMode = WLAN_HT_CAP_SM_PS_DISABLED;\n\t\t\t\t\t\t\t\t\t\t\t\t  \n\t\t\t\tif (check_fwstate(&padapter->mlmepriv , WIFI_ASOC_STATE) == _TRUE) {\n\t\t\t\t\t/* issue_action_SM_PS(padapter, get_my_bssid(&(pmlmeinfo->network)), newMimoPsMode); */\n\t\t\t\t\tissue_action_SM_PS_wait_ack(padapter , get_my_bssid(&(pmlmeinfo->network)) , newMimoPsMode, 3 , 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_CTRL_BT_INFO:\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\t{\n\t\t\t\tu8 dataLen = *pU1Tmp;\n\t\t\t\tu8 tmpBuf[20];\n\t\t\t\tif (dataLen)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(tmpBuf, pU1Tmp+1, dataLen);\n\t\t\t\t}\n\t\t\t\tBT_SendEventExtBtInfoControl(padapter, dataLen, &tmpBuf[0]);\n\t\t\t}\n#else //!CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\tret = _FALSE;\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\tbreak;\n\n\t\tcase BTC_SET_ACT_CTRL_BT_COEX:\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\t{\n\t\t\t\tu8 dataLen = *pU1Tmp;\n\t\t\t\tu8 tmpBuf[20];\n\t\t\t\tif (dataLen)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(tmpBuf, pU1Tmp+1, dataLen);\n\t\t\t\t}\n\t\t\t\tBT_SendEventExtBtCoexControl(padapter, _FALSE, dataLen, &tmpBuf[0]);\n\t\t\t}\n#else //!CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\tret = _FALSE;\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\t\t\tbreak;\n\t\tcase BTC_SET_ACT_CTRL_8723B_ANT:\n#if 0\n\t\t\t{\n\t\t\t\tu1Byte\tdataLen=*pU1Tmp;\n\t\t\t\tu1Byte\ttmpBuf[20];\n\t\t\t\tif(dataLen)\n\t\t\t\t{\n\t\t\t\t\tPlatformMoveMemory(&tmpBuf[0], pU1Tmp+1, dataLen);\n\t\t\t\t}\n\t\t\t\tBT_Set8723bAnt(Adapter, dataLen, &tmpBuf[0]);\n\t\t\t}\n#else\n\t\t\tret = _FALSE;\n#endif\n\t\t\tbreak;\n\t\t//=====================\n\t\tdefault:\n\t\t\tret = _FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\nu8 halbtcoutsrc_UnderIps(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER padapter;\n\tstruct pwrctrl_priv *pwrpriv;\n\tu8 bMacPwrCtrlOn;\n\n\tpadapter = pBtCoexist->Adapter;\n\tpwrpriv = &padapter->dvobj->pwrctl_priv;\n\tbMacPwrCtrlOn = _FALSE;\n\n\tif ((_TRUE == pwrpriv->bips_processing)\n\t\t&& (IPS_NONE != pwrpriv->ips_mode_req)\n\t\t)\n\t{\n\t\treturn _TRUE;\n\t}\n\n\tif (rf_off == pwrpriv->rf_pwrstate)\n\t{\n\t\treturn _TRUE;\n\t}\n\n\trtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);\n\tif (_FALSE == bMacPwrCtrlOn)\n\t{\n\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n}\n\nu8 halbtcoutsrc_UnderLps(PBTC_COEXIST pBtCoexist)\n{\n\treturn GLBtcWiFiInLPS;\n}\n\nu8 halbtcoutsrc_Under32K(PBTC_COEXIST pBtCoexist)\n{\n\t/* todo: the method to check whether wifi is under 32K or not */\n\treturn _FALSE;\n}\n\nvoid halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)\n{\n#if 0\n\tPADAPTER padapter = (PADAPTER)pBtCoexist->Adapter;\n\tPBT_MGNT pBtMgnt = &padapter->MgntInfo.BtInfo.BtMgnt;\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\tu8 *cliBuf = pBtCoexist->cliBuf;\n\tu8 i;\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"============[Statistics]============\");\n\tCL_PRINTF(cliBuf);\n\n#if (H2C_USE_IO_THREAD != 1)\n\tfor(i=0; i<H2C_STATUS_MAX; i++)\n\t{\n\t\tif (pHalData->h2cStatistics[i])\n\t\t{\n\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s] = %d\", \"H2C statistics\", \\\n\t\t\t\th2cStaString[i], pHalData->h2cStatistics[i]);\n\t\t\tCL_PRINTF(cliBuf);\n\t\t}\n\t}\n#else\n\t\tfor(i=0; i<IO_STATUS_MAX; i++)\n\t\t{\n\t\t\tif(Adapter->ioComStr.ioH2cStatistics[i])\n\t\t\t{\n\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = [%s] = %d\", \"H2C statistics\", \\\n\t\t\t\t\tioStaString[i], Adapter->ioComStr.ioH2cStatistics[i]);\n\t\t\t\tCL_PRINTF(cliBuf);\n\t\t\t}\n\t\t}\n#endif\n#if 0\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"lastHMEBoxNum\", \\\n\t\tpHalData->LastHMEBoxNum);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x / 0x%x\", \"LastOkH2c/FirstFailH2c(fwNotRead)\", \\\n\t\tpHalData->lastSuccessH2cEid, pHalData->firstFailedH2cEid);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d/ %d\", \"c2hIsr/c2hIntr/clr1AF/noRdy/noBuf\", \\\n\t\tpHalData->InterruptLog.nIMR_C2HCMD, DBG_Var.c2hInterruptCnt, DBG_Var.c2hClrReadC2hCnt,\n\t\tDBG_Var.c2hNotReadyCnt, DBG_Var.c2hBufAlloFailCnt);\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"c2hPacket\", \\\n\t\tDBG_Var.c2hPacketCnt);\n\tCL_PRINTF(cliBuf);\n#endif\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"Periodical/ DbgCtrl\", \\\n\t\tpBtCoexist->statistics.cntPeriodical, pBtCoexist->statistics.cntDbgCtrl);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d\", \"PowerOn/InitHw/InitCoexDm/RfStatus\", \\\n\t\tpBtCoexist->statistics.cntPowerOn, pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm,\n\t\tpBtCoexist->statistics.cntRfStatusNotify);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d/ %d\", \"Ips/Lps/Scan/Connect/Mstatus\", \\\n\t\tpBtCoexist->statistics.cntIpsNotify, pBtCoexist->statistics.cntLpsNotify,\n\t\tpBtCoexist->statistics.cntScanNotify, pBtCoexist->statistics.cntConnectNotify,\n\t\tpBtCoexist->statistics.cntMediaStatusNotify);\n\tCL_PRINTF(cliBuf);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d\", \"Special pkt/Bt info/ bind\", \n\t\tpBtCoexist->statistics.cntSpecialPacketNotify, pBtCoexist->statistics.cntBtInfoNotify,\n\t\tpBtCoexist->statistics.cntBind);\n\tCL_PRINTF(cliBuf);\n#endif\n}\n\nvoid halbtcoutsrc_DisplayBtLinkInfo(PBTC_COEXIST pBtCoexist)\n{\n#if 0\n\tPADAPTER padapter = (PADAPTER)pBtCoexist->Adapter;\n\tPBT_MGNT pBtMgnt = &padapter->MgntInfo.BtInfo.BtMgnt;\n\tu8 *cliBuf = pBtCoexist->cliBuf;\n\tu8 i;\n\n\n\tif (pBtCoexist->stackInfo.bProfileNotified)\n\t{\n\t\tfor (i=0; i<pBtMgnt->ExtConfig.NumberOfACL; i++)\n\t\t{\n\t\t\tif (pBtMgnt->ExtConfig.HCIExtensionVer >= 1)\n\t\t\t{\n\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s/ %s\", \"Bt link type/spec/role\", \\\n\t\t\t\t\tBtProfileString[pBtMgnt->ExtConfig.aclLink[i].BTProfile],\n\t\t\t\t\tBtSpecString[pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec],\n\t\t\t\t\tBtLinkRoleString[pBtMgnt->ExtConfig.aclLink[i].linkRole]);\n\t\t\t\tCL_PRINTF(cliBuf);\t\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s/ %s\", \"Bt link type/spec\", \\\n\t\t\t\t\tBtProfileString[pBtMgnt->ExtConfig.aclLink[i].BTProfile],\n\t\t\t\t\tBtSpecString[pBtMgnt->ExtConfig.aclLink[i].BTCoreSpec]);\n\t\t\t\tCL_PRINTF(cliBuf);\n\t\t\t}\n\t\t}\n\t}\n#endif\n}\n\nvoid halbtcoutsrc_DisplayWifiStatus(PBTC_COEXIST pBtCoexist)\n{\n\tPADAPTER\tpadapter = pBtCoexist->Adapter;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tu8* \t\t\tcliBuf=pBtCoexist->cliBuf;\n\ts32\t\t\twifiRssi=0, btHsRssi=0;\n\tBOOLEAN\tbScan=_FALSE, bLink=_FALSE, bRoam=_FALSE, bWifiBusy=_FALSE, bWifiUnderBMode=_FALSE;\n\tu32\t\t\twifiBw=BTC_WIFI_BW_HT20, wifiTrafficDir=BTC_WIFI_TRAFFIC_TX, wifiFreq=BTC_FREQ_2_4G;\n\tu32\t\t\twifiLinkStatus=0x0;\n\tBOOLEAN\tbBtHsOn=_FALSE, bLowPower=_FALSE;\n\tu8\t\t\twifiChnl=0, wifiHsChnl=0, nScanAPNum = 0, FwPSState;\n\n\twifiLinkStatus = halbtcoutsrc_GetWifiLinkStatus(pBtCoexist);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d/ %d/ %d\", \"STA/vWifi/HS/p2pGo/p2pGc\", \\\n\t\t((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0), \n\t\t((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0), \n\t\t((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );\n\tCL_PRINTF(cliBuf);\n\n\tif (wifiLinkStatus&WIFI_STA_CONNECTED) {\n\t\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s\", \"IOT Peer\", GLBtcIotPeerString[padapter->mlmeextpriv.mlmext_info.assoc_AP_vendor]);\n\t\tCL_PRINTF(cliBuf);\n\t}\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiChnl);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d(%d)\", \"Dot11 channel / HsChnl(High Speed)\", \\\n\t\twifiChnl, wifiHsChnl, bBtHsOn);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d\", \"Wifi rssi/ HS rssi\", \\\n\t\twifiRssi-100, btHsRssi-100);\n\tCL_PRINTF(cliBuf);\n\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d/ %d/ %d \", \"Wifi bLink/ bRoam/ bScan\", \\\n\t\tbLink, bRoam, bScan);\n\tCL_PRINTF(cliBuf);\n\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifiFreq);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);\n\tpBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &nScanAPNum);\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s / %s/ %s/ AP=%d \", \"Wifi freq/ bw/ traffic\", \\\n\t\tGLBtcWifiFreqString[wifiFreq], ((bWifiUnderBMode)? \"11b\": GLBtcWifiBwString[wifiBw]),\n\t\t((!bWifiBusy)? \"idle\": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? \"uplink\":\"downlink\")), \n\t\tnScanAPNum);\n\tCL_PRINTF(cliBuf);\n\n\t// power status\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %s%s%s\", \"Power Status\", \\\n\t\t((halbtcoutsrc_UnderIps(pBtCoexist) == _TRUE)? \"IPS ON\":\"IPS OFF\"),\n\t\t((halbtcoutsrc_UnderLps(pBtCoexist) == _TRUE)? \", LPS ON\":\", LPS OFF\"), \n\t\t((halbtcoutsrc_Under32K(pBtCoexist) == _TRUE)? \", 32k\":\"\"));\n\tCL_PRINTF(cliBuf);\n\n\tCL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %02x %02x %02x %02x %02x %02x (0x%x/0x%x)\", \"Power mode cmd(lps/rpwm)\", \\\n\t\tpBtCoexist->pwrModeVal[0], pBtCoexist->pwrModeVal[1],\n\t\tpBtCoexist->pwrModeVal[2], pBtCoexist->pwrModeVal[3],\n\t\tpBtCoexist->pwrModeVal[4], pBtCoexist->pwrModeVal[5],\n\t\tpBtCoexist->btInfo.lpsVal, \n\t\tpBtCoexist->btInfo.rpwmVal);\n\tCL_PRINTF(cliBuf);\n}\n\nvoid halbtcoutsrc_DisplayDbgMsg(void *pBtcContext, u8 dispType)\n{\n\tPBTC_COEXIST pBtCoexist;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tswitch(dispType)\n\t{\n\t\tcase BTC_DBG_DISP_COEX_STATISTICS:\n\t\t\thalbtcoutsrc_DisplayCoexStatistics(pBtCoexist);\n\t\t\tbreak;\n\t\tcase BTC_DBG_DISP_BT_LINK_INFO:\n\t\t\thalbtcoutsrc_DisplayBtLinkInfo(pBtCoexist);\n\t\t\tbreak;\n\t\tcase BTC_DBG_DISP_WIFI_STATUS:\n\t\t\thalbtcoutsrc_DisplayWifiStatus(pBtCoexist);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n//====================================\n//\t\tIO related function\n//====================================\nu8 halbtcoutsrc_Read1Byte(void *pBtcContext, u32 RegAddr)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\treturn rtw_read8(padapter, RegAddr);\n}\n\nu16 halbtcoutsrc_Read2Byte(void *pBtcContext, u32 RegAddr)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\treturn\trtw_read16(padapter, RegAddr);\n}\n\nu32 halbtcoutsrc_Read4Byte(void *pBtcContext, u32 RegAddr)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\treturn\trtw_read32(padapter, RegAddr);\n}\n\nvoid halbtcoutsrc_Write1Byte(void *pBtcContext, u32 RegAddr, u8 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\trtw_write8(padapter, RegAddr, Data);\n}\n\nvoid halbtcoutsrc_BitMaskWrite1Byte(void *pBtcContext, u32 regAddr, u8 bitMask, u8 data1b)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\tu8 originalValue, bitShift;\n\tu8 i;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\toriginalValue = 0;\n\tbitShift = 0;\n\n\tif(bitMask != 0xff)\n\t{\n\t\toriginalValue = rtw_read8(padapter, regAddr);\n\n\t\tfor (i=0; i<=7; i++)\n\t\t{\n\t\t\tif ((bitMask>>i)&0x1)\n\t\t\t\tbreak;\n\t\t}\n\t\tbitShift = i;\n\n\t\tdata1b = (originalValue & ~bitMask) | ((data1b << bitShift) & bitMask);\n\t}\n\n\trtw_write8(padapter, regAddr, data1b);\n}\n\nvoid halbtcoutsrc_Write2Byte(void *pBtcContext, u32 RegAddr, u16 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\trtw_write16(padapter, RegAddr, Data);\n}\n\nvoid halbtcoutsrc_Write4Byte(void *pBtcContext, u32 RegAddr, u32 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\trtw_write32(padapter, RegAddr, Data);\n}\n\nvoid halbtcoutsrc_WriteLocalReg1Byte(void *pBtcContext, u32 RegAddr, u8 Data)\n{\n\tPBTC_COEXIST\t\tpBtCoexist=(PBTC_COEXIST)pBtcContext;\n\tPADAPTER\t\t\tAdapter=pBtCoexist->Adapter;\n\n\tif(BTC_INTF_SDIO == pBtCoexist->chipInterface)\n\t{\n\t\trtw_write8(Adapter, SDIO_LOCAL_BASE | RegAddr, Data);\n\t}\n\telse\n\t{\n\t\trtw_write8(Adapter, RegAddr, Data);\n\t}\n}\n\nvoid halbtcoutsrc_SetBbReg(void *pBtcContext, u32 RegAddr, u32 BitMask, u32 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\tPHY_SetBBReg(padapter, RegAddr, BitMask, Data);\n}\n\n\nu32 halbtcoutsrc_GetBbReg(void *pBtcContext, u32 RegAddr, u32 BitMask)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\treturn PHY_QueryBBReg(padapter, RegAddr, BitMask);\n}\n\nvoid halbtcoutsrc_SetRfReg(void *pBtcContext, u8 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\tPHY_SetRFReg(padapter, eRFPath, RegAddr, BitMask, Data);\n}\n\nu32 halbtcoutsrc_GetRfReg(void *pBtcContext, u8 eRFPath, u32 RegAddr, u32 BitMask)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\treturn PHY_QueryRFReg(padapter, eRFPath, RegAddr, BitMask);\n}\n\nvoid halbtcoutsrc_SetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr, u32 Data)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\tu8 CmdBuffer1[4] = {0};\n\tu8 CmdBuffer2[4] = {0};\n\tu8* AddrToSet = (u8*)&RegAddr;\n\tu8* ValueToSet = (u8*)&Data;\t\n\tu8 OperVer = 0;\n\tu8 ReqNum = 0;\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\tif (IS_HARDWARE_TYPE_8723B(padapter))\n\t{\n\t\tCmdBuffer1[0] |= (OperVer & 0x0f);\t\t\t\t\t\t/* Set OperVer */\n\t\tCmdBuffer1[0] |= ((ReqNum << 4) & 0xf0);\t\t\t\t/* Set ReqNum */\n\t\tCmdBuffer1[1] = 0x0d; \t\t\t\t\t\t\t\t\t/* Set OpCode to BT_LO_OP_WRITE_REG_VALUE */\n\t\tCmdBuffer1[2] = ValueToSet[0]; \t\t\t\t\t\t\t/* Set WriteRegValue */\n\t\trtw_hal_fill_h2c_cmd(padapter, 0x67, 4, &(CmdBuffer1[0]));\n\n\t\trtw_msleep_os(200);\n\t\tReqNum++;\n\n\t\tCmdBuffer2[0] |= (OperVer & 0x0f);\t\t\t\t\t\t/* Set OperVer */\n\t\tCmdBuffer2[0] |= ((ReqNum << 4) & 0xf0);\t\t\t\t/* Set ReqNum */\n\t\tCmdBuffer2[1] = 0x0c; \t\t\t\t\t\t\t\t\t/* Set OpCode of BT_LO_OP_WRITE_REG_ADDR */\n\t\tCmdBuffer2[3] = AddrToSet[0];\t\t\t\t\t\t\t/* Set WriteRegAddr */\n\t\trtw_hal_fill_h2c_cmd(padapter, 0x67, 4, &(CmdBuffer2[0]));\n\t}\n}\n\nu8 halbtcoutsrc_SetBtAntDetection(void *pBtcContext, u8 txTime, u8 btChnl)\n{\n/* Always return _FALSE since we don't implement this yet */\t\n#if 0\t\n\tPBTC_COEXIST\t\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tPADAPTER\t\t\tAdapter = pBtCoexist->Adapter;\n\tu1Byte\t\t\t\tbtCanTx = 0;\n\tBOOLEAN\t\t\tbStatus = FALSE;\n\n\tbStatus = NDBG_SetBtAntDetection(Adapter, txTime, btChnl, &btCanTx);\n\tif (bStatus && btCanTx)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n#else\n\treturn _FALSE;\n#endif\n}\n\nu32 halbtcoutsrc_GetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr)\n{\n\t/* To be implemented. Always return 0 temporarily */\n\treturn 0;\n}\n\nvoid halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pCmdBuffer)\n{\n\tPBTC_COEXIST pBtCoexist;\n\tPADAPTER padapter;\n\n\n\tpBtCoexist = (PBTC_COEXIST)pBtcContext;\n\tpadapter = pBtCoexist->Adapter;\n\n\trtw_hal_fill_h2c_cmd(padapter, elementId, cmdLen, pCmdBuffer);\n}\n\n//====================================\n//\t\tExtern functions called by other module\n//====================================\nu8 EXhalbtcoutsrc_IsTfbgaPackageType(PADAPTER padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n#ifdef CONFIG_RTL8723B\n\tif ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA80)\n\t\t|| (pHalData->PackageType == PACKAGE_TFBGA90)) {\n\t\treturn _TRUE;\n\t}\t\t\n#endif\n\n\treturn _FALSE;\n}\n\nu8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter)\n{\n\tPBTC_COEXIST\t\tpBtCoexist=&GLBtCoexist;\n\tu1Byte\tantNum=2, chipType;\n\t\n\tif(pBtCoexist->bBinded)\n\t\treturn _FALSE;\n\telse\n\t\tpBtCoexist->bBinded = _TRUE;\n\n\tpBtCoexist->statistics.cntBind++;\n\t\n\tpBtCoexist->Adapter = padapter;\n\t\n\tpBtCoexist->stackInfo.bProfileNotified = _FALSE;\n\n\tpBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;\n\tpBtCoexist->btInfo.aggBufSize = 5;\n\n\tpBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;\n\tpBtCoexist->btInfo.bMiracastPlusBt = _FALSE;\n\n#if 0\n\tchipType = HALBT_GetBtChipType(Adapter);\n\tEXhalbtcoutsrc_SetChipType(chipType);\n\tantNum = HALBT_GetPgAntNum(Adapter);\n\tEXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);\n#endif\n\t// set default antenna position to main  port\n\tpBtCoexist->boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\t\n\n\tpBtCoexist->boardInfo.btdmAntDetFinish = _FALSE;\n\tpBtCoexist->boardInfo.btdmAntNumByAntDet = 1;\n\n\tpBtCoexist->boardInfo.bTfbgaPackage = EXhalbtcoutsrc_IsTfbgaPackageType((PADAPTER)padapter);\n\n\tif (pBtCoexist->boardInfo.bTfbgaPackage)\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Package Type = TFBGA\\n\"));\n\telse\n\t\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], Package Type = Non-TFBGA\\n\"));\n\t\n\treturn _TRUE;\n}\n\nu8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)\n{\n\tPBTC_COEXIST pBtCoexist = &GLBtCoexist;\n\n\t//pBtCoexist->statistics.cntBind++;\n\n\thalbtcoutsrc_DbgInit();\n\n#ifdef CONFIG_PCI_HCI\n\tpBtCoexist->chipInterface = BTC_INTF_PCI;\n#elif defined(CONFIG_USB_HCI)\n\tpBtCoexist->chipInterface = BTC_INTF_USB;\n#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tpBtCoexist->chipInterface = BTC_INTF_SDIO;\n#else\n\tpBtCoexist->chipInterface = BTC_INTF_UNKNOWN;\n#endif\n\n\tEXhalbtcoutsrc_BindBtCoexWithAdapter(padapter);\n\n\tpBtCoexist->fBtcRead1Byte = halbtcoutsrc_Read1Byte;\n\tpBtCoexist->fBtcWrite1Byte = halbtcoutsrc_Write1Byte;\n\tpBtCoexist->fBtcWrite1ByteBitMask = halbtcoutsrc_BitMaskWrite1Byte;\n\tpBtCoexist->fBtcRead2Byte = halbtcoutsrc_Read2Byte;\n\tpBtCoexist->fBtcWrite2Byte = halbtcoutsrc_Write2Byte;\n\tpBtCoexist->fBtcRead4Byte = halbtcoutsrc_Read4Byte;\n\tpBtCoexist->fBtcWrite4Byte = halbtcoutsrc_Write4Byte;\n\tpBtCoexist->fBtcWriteLocalReg1Byte = halbtcoutsrc_WriteLocalReg1Byte;\n\n\tpBtCoexist->fBtcSetBbReg = halbtcoutsrc_SetBbReg;\n\tpBtCoexist->fBtcGetBbReg = halbtcoutsrc_GetBbReg;\n\n\tpBtCoexist->fBtcSetRfReg = halbtcoutsrc_SetRfReg;\n\tpBtCoexist->fBtcGetRfReg = halbtcoutsrc_GetRfReg;\n\n\tpBtCoexist->fBtcFillH2c = halbtcoutsrc_FillH2cCmd;\n\tpBtCoexist->fBtcDispDbgMsg = halbtcoutsrc_DisplayDbgMsg;\n\n\tpBtCoexist->fBtcGet = halbtcoutsrc_Get;\n\tpBtCoexist->fBtcSet = halbtcoutsrc_Set;\n\tpBtCoexist->fBtcGetBtReg = halbtcoutsrc_GetBtReg;\n\tpBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;\n\tpBtCoexist->fBtcSetBtAntDetection = halbtcoutsrc_SetBtAntDetection;\n\n\tpBtCoexist->cliBuf = &GLBtcDbgBuf[0];\n\n\tpBtCoexist->boardInfo.singleAntPath = 0;\n\t\n\tGLBtcWiFiInScanState = _FALSE;\n\n\tGLBtcWiFiInIQKState = _FALSE;\n\n\tGLBtcWiFiInIPS = _FALSE;\n\n\tGLBtcWiFiInLPS = _FALSE;\n\n\tGLBtcBtCoexAliveRegistered = _FALSE;\n\n\treturn _TRUE;\n}\n\nvoid EXhalbtcoutsrc_PowerOnSetting(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\t/* Power on setting function is only added in 8723B currently */\n\tif (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_PowerOnSetting(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_PowerOnSetting(pBtCoexist);\n\t}\n}\n\nvoid EXhalbtcoutsrc_PreLoadFirmware(PBTC_COEXIST pBtCoexist)\n{\n\tif(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\t\n\tpBtCoexist->statistics.cntPreLoadFirmware++;\n\n\tif(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif(pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_PreLoadFirmware(pBtCoexist);\n\t\telse if(pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_PreLoadFirmware(pBtCoexist);\n\t}\n}\n\nvoid EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist, u8 bWifiOnly)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntInitHwConfig++;\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_InitHwConfig(pBtCoexist, bWifiOnly);\n\t}\n}\n\nvoid EXhalbtcoutsrc_InitCoexDm(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntInitCoexDm++;\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_InitCoexDm(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_InitCoexDm(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_InitCoexDm(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_InitCoexDm(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_InitCoexDm(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_InitCoexDm(pBtCoexist);\n\t}\n\n\tpBtCoexist->bInitilized = _TRUE;\n}\n\nvoid EXhalbtcoutsrc_IpsNotify(PBTC_COEXIST pBtCoexist, u8 type)\n{\n\tu8\tipsType;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntIpsNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (IPS_NONE == type)\n\t{\n\t\tipsType = BTC_IPS_LEAVE;\n\t\tGLBtcWiFiInIPS = _FALSE;\n\t}\n\telse\n\t{\n\t\tipsType = BTC_IPS_ENTER;\n\t\tGLBtcWiFiInIPS = _TRUE;\n\t}\n\t\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_IpsNotify(pBtCoexist, ipsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_IpsNotify(pBtCoexist, ipsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_IpsNotify(pBtCoexist, ipsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_IpsNotify(pBtCoexist, ipsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_IpsNotify(pBtCoexist, ipsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_IpsNotify(pBtCoexist, ipsType);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_LpsNotify(PBTC_COEXIST pBtCoexist, u8 type)\n{\n\tu8 lpsType;\n\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntLpsNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (PS_MODE_ACTIVE == type)\n\t{\n\t\tlpsType = BTC_LPS_DISABLE;\n\t\tGLBtcWiFiInLPS = _FALSE;\n\t}\n\telse\n\t{\n\t\tlpsType = BTC_LPS_ENABLE;\n\t\tGLBtcWiFiInLPS = _TRUE;\n\t}\n\t\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_LpsNotify(pBtCoexist, lpsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_LpsNotify(pBtCoexist, lpsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_LpsNotify(pBtCoexist, lpsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_LpsNotify(pBtCoexist, lpsType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_LpsNotify(pBtCoexist, lpsType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_LpsNotify(pBtCoexist, lpsType);\n\t}\n}\n\nvoid EXhalbtcoutsrc_ScanNotify(PBTC_COEXIST pBtCoexist, u8 type)\n{\n\tu8\tscanType;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntScanNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (type)\n\t{\n\t\tscanType = BTC_SCAN_START;\n\t\tGLBtcWiFiInScanState = _TRUE;\n\t}\n\telse\n\t{\n\t\tscanType = BTC_SCAN_FINISH;\n\t\tGLBtcWiFiInScanState = _FALSE;\n\t}\n\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_ScanNotify(pBtCoexist, scanType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_ScanNotify(pBtCoexist, scanType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_ScanNotify(pBtCoexist, scanType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_ScanNotify(pBtCoexist, scanType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_ScanNotify(pBtCoexist, scanType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_ScanNotify(pBtCoexist, scanType);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_ConnectNotify(PBTC_COEXIST pBtCoexist, u8 action)\n{\n\tu8\tassoType;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntConnectNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (action)\n\t\tassoType = BTC_ASSOCIATE_START;\n\telse\n\t\tassoType = BTC_ASSOCIATE_FINISH;\n\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_ConnectNotify(pBtCoexist, assoType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_ConnectNotify(pBtCoexist, assoType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_ConnectNotify(pBtCoexist, assoType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_ConnectNotify(pBtCoexist, assoType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_ConnectNotify(pBtCoexist, assoType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_ConnectNotify(pBtCoexist, assoType);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_MediaStatusNotify(PBTC_COEXIST pBtCoexist, RT_MEDIA_STATUS mediaStatus)\n{\n\tu8 mStatus;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntMediaStatusNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (RT_MEDIA_CONNECT == mediaStatus)\n\t\tmStatus = BTC_MEDIA_CONNECT;\n\telse\n\t\tmStatus = BTC_MEDIA_DISCONNECT;\n\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_MediaStatusNotify(pBtCoexist, mStatus);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_SpecialPacketNotify(PBTC_COEXIST pBtCoexist, u8 pktType)\n{\n\tu8\tpacketType;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntSpecialPacketNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif (PACKET_DHCP == pktType)\n\t\tpacketType = BTC_PACKET_DHCP;\n\telse if (PACKET_EAPOL == pktType)\n\t\tpacketType = BTC_PACKET_EAPOL;\n\telse if (PACKET_ARP == pktType)\n\t\tpacketType = BTC_PACKET_ARP;\n\telse\n\t{\n\t\tpacketType = BTC_PACKET_UNKNOWN;\n\t\treturn;\n\t}\n\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_SpecialPacketNotify(pBtCoexist, packetType);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntBtInfoNotify++;\n\n\t// All notify is called in cmd thread, don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_BtInfoNotify(pBtCoexist, tmpBuf, length);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nVOID\nEXhalbtcoutsrc_RfStatusNotify(\n\tIN\tPBTC_COEXIST\t\tpBtCoexist,\n\tIN\tu1Byte \t\t\t\ttype\n\t)\n{\n\tif(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntRfStatusNotify++;\n\t\n\tif(IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t}\n\telse if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif(pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_RfStatusNotify(pBtCoexist, type);\n\t}\t\n\telse if(IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif(pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_RfStatusNotify(pBtCoexist, type);\n\t}\t\n\telse if(IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t}\n\telse if(IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t}\n}\n\nvoid EXhalbtcoutsrc_StackOperationNotify(PBTC_COEXIST pBtCoexist, u8 type)\n{\n#if 0\n\tu8\tstackOpType;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntStackOperationNotify++;\n\tif (pBtCoexist->bManualControl)\n\t\treturn;\n\n\tif ((HCI_BT_OP_INQUIRY_START == type) ||\n\t\t(HCI_BT_OP_PAGING_START == type) ||\n\t\t(HCI_BT_OP_PAIRING_START == type))\n\t{\n\t\tstackOpType = BTC_STACK_OP_INQ_PAGE_PAIR_START;\n\t}\n\telse if ((HCI_BT_OP_INQUIRY_FINISH == type) ||\n\t\t(HCI_BT_OP_PAGING_SUCCESS == type) ||\n\t\t(HCI_BT_OP_PAGING_UNSUCCESS == type) ||\n\t\t(HCI_BT_OP_PAIRING_FINISH == type) )\n\t{\n\t\tstackOpType = BTC_STACK_OP_INQ_PAGE_PAIR_FINISH;\n\t}\n\telse\n\t{\n\t\tstackOpType = BTC_STACK_OP_NONE;\n\t}\n\n#endif\n}\n\nvoid EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_HaltNotify(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_HaltNotify(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_HaltNotify(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_HaltNotify(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_HaltNotify(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_HaltNotify(pBtCoexist);\n\t}\n\n\tpBtCoexist->bBinded = FALSE;\n}\n\nvoid EXhalbtcoutsrc_SwitchBtTRxMask(PBTC_COEXIST pBtCoexist)\n{\n\tif (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t{\n\t\t\thalbtcoutsrc_SetBtReg(pBtCoexist, 0, 0x3c, 0x01); //BT goto standby while GNT_BT 1-->0\n\t\t}\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t{\n\t\t\thalbtcoutsrc_SetBtReg(pBtCoexist, 0, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0\n\t\t}\n\t}\n}\n\nvoid EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\t//\n\t// currently only 1ant we have to do the notification,\n\t// once pnp is notified to sleep state, we have to leave LPS that we can sleep normally.\n\t//\n\n\tif (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_PnpNotify(pBtCoexist,pnpState);\n\t\telse if(pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_PnpNotify(pBtCoexist,pnpState);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_PnpNotify(pBtCoexist,pnpState);\n\t\telse if(pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_PnpNotify(pBtCoexist,pnpState);\n\t}\n\telse if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_PnpNotify(pBtCoexist, pnpState);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_PnpNotify(pBtCoexist,pnpState);\n\t\telse if(pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_PnpNotify(pBtCoexist,pnpState);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_PnpNotify(pBtCoexist, pnpState);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_PnpNotify(pBtCoexist, pnpState);\n\t}\n}\n\nvoid EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntCoexDmSwitch++;\n\n\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t{\n\t\t\tpBtCoexist->bStopCoexDm = TRUE;\n\t\t\tEXhalbtc8723b1ant_CoexDmReset(pBtCoexist);\n\t\t\tEXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2);\n\t\t\tEXhalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);\n\t\t\tEXhalbtc8723b2ant_InitCoexDm(pBtCoexist);\n\t\t\tpBtCoexist->bStopCoexDm = FALSE;\n\t\t}\n\t}\n\n\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_Periodical(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\tpBtCoexist->statistics.cntPeriodical++;\n\n\t// Periodical should be called in cmd thread,\n\t// don't need to leave low power again\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t{\n\t\t\tif (!halbtcoutsrc_UnderIps(pBtCoexist))\n\t\t\t{\n\t\t\t\tEXhalbtc8821a1ant_Periodical(pBtCoexist);\n\t\t\t}\n\t\t}\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_Periodical(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_Periodical(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_Periodical(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_Periodical(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_Periodical(pBtCoexist);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_DbgControl(PBTC_COEXIST pBtCoexist, u8 opCode, u8 opLen, u8 *pData)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->statistics.cntDbgCtrl++;\n\n\t// This function doesn't be called yet,\n\t// default no need to leave low power to avoid deadlock\n//\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_DbgControl(pBtCoexist, opCode, opLen, pData);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_DbgControl(pBtCoexist, opCode, opLen, pData);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_DbgControl(pBtCoexist, opCode, opLen, pData);\n\t}\n\n//\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\n#if 0\nVOID\nEXhalbtcoutsrc_AntennaDetection(\n\tIN\tPBTC_COEXIST\t\t\tpBtCoexist,\n\tIN\tu4Byte\t\t\t\t\tcentFreq,\n\tIN\tu4Byte\t\t\t\t\toffset,\n\tIN\tu4Byte\t\t\t\t\tspan,\n\tIN\tu4Byte\t\t\t\t\tseconds\n\t)\n{\n\tif(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\t/* Need to refine the following power save operations to enable this function in the future */\t\n#if 0\n\tIPSDisable(pBtCoexist->Adapter, FALSE, 0);\n\tLeisurePSLeave(pBtCoexist->Adapter, LPS_DISABLE_BT_COEX);\n#endif\n\n\tif(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif(pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_AntennaDetection(pBtCoexist, centFreq, offset, span, seconds);\n\t}\n\n\t//IPSReturn(pBtCoexist->Adapter, 0xff);\n}\n#endif\n\nvoid EXhalbtcoutsrc_StackUpdateProfileInfo(void)\n{\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tPBTC_COEXIST pBtCoexist = &GLBtCoexist;\n\tPADAPTER padapter = (PADAPTER)GLBtCoexist.Adapter;\n\tPBT_MGNT pBtMgnt = &padapter->coex_info.BtMgnt;\n\tu8 i;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->stackInfo.bProfileNotified = _TRUE;\n\n\tpBtCoexist->stackInfo.numOfLink =\n\t\tpBtMgnt->ExtConfig.NumberOfACL+pBtMgnt->ExtConfig.NumberOfSCO;\n\n\t// reset first\n\tpBtCoexist->stackInfo.bBtLinkExist = _FALSE;\n\tpBtCoexist->stackInfo.bScoExist = _FALSE;\n\tpBtCoexist->stackInfo.bAclExist = _FALSE;\n\tpBtCoexist->stackInfo.bA2dpExist = _FALSE;\n\tpBtCoexist->stackInfo.bHidExist = _FALSE;\n\tpBtCoexist->stackInfo.numOfHid = 0;\n\tpBtCoexist->stackInfo.bPanExist = _FALSE;\n\n\tif (!pBtMgnt->ExtConfig.NumberOfACL)\n\t\tpBtCoexist->stackInfo.minBtRssi = 0;\n\n\tif (pBtCoexist->stackInfo.numOfLink)\n\t{\n\t\tpBtCoexist->stackInfo.bBtLinkExist = _TRUE;\n\t\tif (pBtMgnt->ExtConfig.NumberOfSCO)\n\t\t\tpBtCoexist->stackInfo.bScoExist = _TRUE;\n\t\tif (pBtMgnt->ExtConfig.NumberOfACL)\n\t\t\tpBtCoexist->stackInfo.bAclExist = _TRUE;\n\t}\n\n\tfor (i=0; i<pBtMgnt->ExtConfig.NumberOfACL; i++)\n\t{\n\t\tif (BT_PROFILE_A2DP == pBtMgnt->ExtConfig.aclLink[i].BTProfile)\n\t\t{\n\t\t\tpBtCoexist->stackInfo.bA2dpExist = _TRUE;\n\t\t}\n\t\telse if (BT_PROFILE_PAN == pBtMgnt->ExtConfig.aclLink[i].BTProfile)\n\t\t{\n\t\t\tpBtCoexist->stackInfo.bPanExist = _TRUE;\n\t\t}\n\t\telse if (BT_PROFILE_HID == pBtMgnt->ExtConfig.aclLink[i].BTProfile)\n\t\t{\n\t\t\tpBtCoexist->stackInfo.bHidExist = _TRUE;\n\t\t\tpBtCoexist->stackInfo.numOfHid++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpBtCoexist->stackInfo.bUnknownAclExist = _TRUE;\n\t\t}\n\t}\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n}\n\nvoid EXhalbtcoutsrc_UpdateMinBtRssi(s8 btRssi)\n{\n\tPBTC_COEXIST pBtCoexist = &GLBtCoexist;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->stackInfo.minBtRssi = btRssi;\n}\n\nvoid EXhalbtcoutsrc_SetHciVersion(u16 hciVersion)\n{\n\tPBTC_COEXIST pBtCoexist = &GLBtCoexist;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->stackInfo.hciVersion = hciVersion;\n}\n\nvoid EXhalbtcoutsrc_SetBtPatchVersion(u16 btHciVersion, u16 btPatchVersion)\n{\n\tPBTC_COEXIST pBtCoexist = &GLBtCoexist;\n\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\tpBtCoexist->btInfo.btRealFwVer = btPatchVersion;\n\tpBtCoexist->btInfo.btHciVer = btHciVersion;\n}\n\n#if 0\nvoid EXhalbtcoutsrc_SetBtExist(u8 bBtExist)\n{\n\tGLBtCoexist.boardInfo.bBtExist = bBtExist;\n}\n#endif\nvoid EXhalbtcoutsrc_SetChipType(u8 chipType)\n{\n\tswitch(chipType)\n\t{\n\t\tdefault:\n\t\tcase BT_2WIRE:\n\t\tcase BT_ISSC_3WIRE:\n\t\tcase BT_ACCEL:\n\t\tcase BT_RTL8756:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_UNDEF;\n\t\t\tbreak;\n\t\tcase BT_CSR_BC4:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_CSR_BC4;\n\t\t\tbreak;\n\t\tcase BT_CSR_BC8:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_CSR_BC8;\n\t\t\tbreak;\n\t\tcase BT_RTL8723A:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_RTL8723A;\n\t\t\tbreak;\n\t\tcase BT_RTL8821:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_RTL8821;\n\t\t\tbreak;\n\t\tcase BT_RTL8723B:\n\t\t\tGLBtCoexist.boardInfo.btChipType = BTC_CHIP_RTL8723B;\n\t\t\tbreak;\n\t}\n}\n\nvoid EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)\n{\n\tif (BT_COEX_ANT_TYPE_PG == type)\n\t{\n\t\tGLBtCoexist.boardInfo.pgAntNum = antNum;\n\t\tGLBtCoexist.boardInfo.btdmAntNum = antNum;\n#if 0\n\t\t//The antenna position: Main (default) or Aux for pgAntNum=2 && btdmAntNum =1\n\t\t//The antenna position should be determined by auto-detect mechanism\n\t\t// The following is assumed to main, and those must be modified if y auto-detect mechanism is ready\n\t\tif ((GLBtCoexist.boardInfo.pgAntNum == 2) && (GLBtCoexist.boardInfo.btdmAntNum == 1) )\n\t\t\tGLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t\telse\n\t\t\tGLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n#endif\n\t}\n\telse if (BT_COEX_ANT_TYPE_ANTDIV == type)\n\t{\n\t\tGLBtCoexist.boardInfo.btdmAntNum = antNum;\n\t\t//GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\t\n\t}\n\telse if (BT_COEX_ANT_TYPE_DETECTED == type)\n\t{\n\t\tGLBtCoexist.boardInfo.btdmAntNum = antNum;\n\t\t//GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;\n\t}\n}\n\n//\n// Currently used by 8723b only, S0 or S1\n//\nvoid EXhalbtcoutsrc_SetSingleAntPath(u8 singleAntPath)\n{\n\tGLBtCoexist.boardInfo.singleAntPath = singleAntPath;\n}\n\nvoid EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)\n{\n\tif (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))\n\t{\n\t\tif (halbtcoutsrc_IsCsrBtCoex(pBtCoexist) == _TRUE)\n\t\t\tEXhalbtc8821aCsr2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8821a2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8821a1ant_DisplayCoexInfo(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8723b2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_DisplayCoexInfo(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8703b2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8703b1ant_DisplayCoexInfo(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8192e2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8192e1ant_DisplayCoexInfo(pBtCoexist);\n\t}\n\telse if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))\n\t{\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_DisplayCoexInfo(pBtCoexist);\n\t\telse if (pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8812a1ant_DisplayCoexInfo(pBtCoexist);\n\t}\n\n\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_DisplayAntDetection(PBTC_COEXIST pBtCoexist)\n{\n\tif(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))\n\t\treturn;\n\n\thalbtcoutsrc_LeaveLowPower(pBtCoexist);\n\n\tif(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))\n\t{\n\t\tif(pBtCoexist->boardInfo.btdmAntNum == 1)\n\t\t\tEXhalbtc8723b1ant_DisplayAntDetection(pBtCoexist);\n\t}\n\t\n\thalbtcoutsrc_NormalLowPower(pBtCoexist);\n}\n\nvoid EXhalbtcoutsrc_BTOffOnNotify(PBTC_COEXIST pBtCoexist, u8 bBTON)\n{\n\n\tif (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter)) {\n\t\tif (pBtCoexist->boardInfo.btdmAntNum == 2)\n\t\t\tEXhalbtc8812a2ant_BTOffOnNotify(pBtCoexist, (bBTON == _TRUE)?BTC_BT_ON:BTC_BT_OFF);\n\t}\n\n}\n\nstatic void halbt_InitHwConfig92C(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tu8 u1Tmp;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif( (pHalData->bt_coexist.btChipType == BT_CSR_BC4) ||\n\t\t(pHalData->bt_coexist.btChipType == BT_CSR_BC8))\n\t{\n\t\tif (pHalData->rf_type == RF_1T1R)\n\t\t{\n\t\t\t// Config to 1T1R\n\t\t\tu1Tmp = rtw_read8(padapter, rOFDM0_TRxPathEnable);\n\t\t\tu1Tmp &= ~BIT(1);\n\t\t\trtw_write8(padapter, rOFDM0_TRxPathEnable, u1Tmp);\n\t\t\tRT_DISP(FBT, BT_TRACE, (\"[BTCoex], BT write 0xC04 = 0x%x\\n\", u1Tmp));\n\n\t\t\tu1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable);\n\t\t\tu1Tmp &= ~BIT(1);\n\t\t\trtw_write8(padapter, rOFDM1_TRxPathEnable, u1Tmp);\n\t\t\tRT_DISP(FBT, BT_TRACE, (\"[BTCoex], BT write 0xD04 = 0x%x\\n\", u1Tmp));\n\t\t}\n\t}\n}\n\nstatic void halbt_InitHwConfig92D(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tu8 u1Tmp;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tif ((pHalData->bt_coexist.btChipType == BT_CSR_BC4) ||\n\t\t(pHalData->bt_coexist.btChipType == BT_CSR_BC8))\n\t{\n\t\tif (pHalData->rf_type == RF_1T1R)\n\t\t{\n\t\t\t// Config to 1T1R\n\t\t\tu1Tmp = rtw_read8(padapter, rOFDM0_TRxPathEnable);\n\t\t\tu1Tmp &= ~BIT(1);\n\t\t\trtw_write8(padapter, rOFDM0_TRxPathEnable, u1Tmp);\n\t\t\tRT_DISP(FBT, BT_TRACE, (\"[BTCoex], BT write 0xC04 = 0x%x\\n\", u1Tmp));\n\n\t\t\tu1Tmp = rtw_read8(padapter, rOFDM1_TRxPathEnable);\n\t\t\tu1Tmp &= ~BIT(1);\n\t\t\trtw_write8(padapter, rOFDM1_TRxPathEnable, u1Tmp);\n\t\t\tRT_DISP(FBT, BT_TRACE, (\"[BTCoex], BT write 0xD04 = 0x%x\\n\", u1Tmp));\n\t\t}\n\t}\n}\n\n/*\n * Description:\n *\tRun BT-Coexist mechansim or not\n *\n */\nvoid hal_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tpHalData->bt_coexist.bBtExist = bBtExist;\n\n\t//EXhalbtcoutsrc_SetBtExist(bBtExist);\n}\n\n/*\n * Dewcription:\n *\tCheck is co-exist mechanism enabled or not\n *\n * Return:\n *\t_TRUE\tEnable BT co-exist mechanism\n *\t_FALSE\tDisable BT co-exist mechanism\n */\nu8 hal_btcoex_IsBtExist(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\treturn pHalData->bt_coexist.bBtExist;\n}\n\nu8 hal_btcoex_IsBtDisabled(PADAPTER padapter)\n{\n\tif (!hal_btcoex_IsBtExist(padapter))\n\t\treturn _TRUE;\n\n\tif (GLBtCoexist.btInfo.bBtDisabled)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n}\n\nvoid hal_btcoex_SetChipType(PADAPTER padapter, u8 chipType)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tpHalData->bt_coexist.btChipType = chipType;\n\n\tEXhalbtcoutsrc_SetChipType(chipType);\n}\n\nu8 hal_btcoex_GetChipType(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\treturn pHalData->bt_coexist.btChipType;\n}\n\nvoid hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tpHalData->bt_coexist.btTotalAntNum = antNum;\n\tEXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);\n}\n\nu8 hal_btcoex_GetPgAntNum(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\treturn pHalData->bt_coexist.btTotalAntNum;\n}\n\nvoid hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)\n{\n\tEXhalbtcoutsrc_SetSingleAntPath(singleAntPath);\n}\n\nu8 hal_btcoex_Initialize(PADAPTER padapter)\n{\n\tu8 ret1;\n\tu8 ret2;\n\n\n\t_rtw_memset(&GLBtCoexist, 0, sizeof(GLBtCoexist));\n\tret1 = EXhalbtcoutsrc_InitlizeVariables((void*)padapter);\n\tret2 = (ret1==_TRUE) ? _TRUE : _FALSE;\n\n\treturn ret2;\n}\n\nvoid hal_btcoex_PowerOnSetting(PADAPTER padapter)\n{\n\tEXhalbtcoutsrc_PowerOnSetting(&GLBtCoexist);\n}\n\nvoid hal_btcoex_PreLoadFirmware(PADAPTER padapter)\n{\n\tEXhalbtcoutsrc_PreLoadFirmware(&GLBtCoexist);\n}\n\nvoid hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly)\n{\n\tif (!hal_btcoex_IsBtExist(padapter))\n\t\treturn;\n\n\tEXhalbtcoutsrc_InitHwConfig(&GLBtCoexist, bWifiOnly);\n\tEXhalbtcoutsrc_InitCoexDm(&GLBtCoexist);\n}\n\nvoid hal_btcoex_IpsNotify(PADAPTER padapter, u8 type)\n{\n\tEXhalbtcoutsrc_IpsNotify(&GLBtCoexist, type);\n}\n\nvoid hal_btcoex_LpsNotify(PADAPTER padapter, u8 type)\n{\n\tEXhalbtcoutsrc_LpsNotify(&GLBtCoexist, type);\n}\n\nvoid hal_btcoex_ScanNotify(PADAPTER padapter, u8 type)\n{\n\tEXhalbtcoutsrc_ScanNotify(&GLBtCoexist, type);\n}\n\nvoid hal_btcoex_ConnectNotify(PADAPTER padapter, u8 action)\n{\n\tEXhalbtcoutsrc_ConnectNotify(&GLBtCoexist, action);\n}\n\nvoid hal_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus)\n{\n\tEXhalbtcoutsrc_MediaStatusNotify(&GLBtCoexist, mediaStatus);\n}\n\nvoid hal_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType)\n{\n\tEXhalbtcoutsrc_SpecialPacketNotify(&GLBtCoexist, pktType);\n}\n\nvoid hal_btcoex_IQKNotify(PADAPTER padapter, u8 state)\n{\n\tGLBtcWiFiInIQKState = state;\n}\n\nvoid hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf)\n{\n\tif (GLBtcWiFiInIQKState == _TRUE)\n\t\treturn;\n\t\n\tEXhalbtcoutsrc_BtInfoNotify(&GLBtCoexist, tmpBuf, length);\n}\n\nvoid hal_btcoex_SuspendNotify(PADAPTER padapter, u8 state)\n{\n\tif (state == 1)\n\t\tstate = BTC_WIFI_PNP_SLEEP;\n\telse\n\t\tstate = BTC_WIFI_PNP_WAKE_UP;\n\n\tEXhalbtcoutsrc_PnpNotify(&GLBtCoexist, state);\n}\n\nvoid hal_btcoex_HaltNotify(PADAPTER padapter)\n{\n\tEXhalbtcoutsrc_HaltNotify(&GLBtCoexist);\n}\n\nvoid hal_btcoex_SwitchBtTRxMask(PADAPTER padapter)\n{\n\tEXhalbtcoutsrc_SwitchBtTRxMask(&GLBtCoexist);\n}\n\nvoid hal_btcoex_Hanlder(PADAPTER padapter)\n{\n\tEXhalbtcoutsrc_Periodical(&GLBtCoexist);\n}\n\ns32 hal_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter)\n{\n\treturn (s32)GLBtCoexist.btInfo.bRejectAggPkt;\n}\n\ns32 hal_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter)\n{\n\treturn (s32)GLBtCoexist.btInfo.bBtCtrlAggBufSize;\n}\n\nu32 hal_btcoex_GetAMPDUSize(PADAPTER padapter)\n{\n\treturn (u32)GLBtCoexist.btInfo.aggBufSize;\n}\n\nvoid hal_btcoex_SetManualControl(PADAPTER padapter, u8 bmanual)\n{\n\tGLBtCoexist.bManualControl = bmanual;\n}\n\nu8 hal_btcoex_1Ant(PADAPTER padapter)\n{\n\tif (hal_btcoex_IsBtExist(padapter) == _FALSE)\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.boardInfo.btdmAntNum == 1)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nu8 hal_btcoex_IsBtControlLps(PADAPTER padapter)\n{\n\tif (hal_btcoex_IsBtExist(padapter) == _FALSE)\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.btInfo.bBtDisabled)\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.btInfo.bBtCtrlLps)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nu8 hal_btcoex_IsLpsOn(PADAPTER padapter)\n{\n\tif (hal_btcoex_IsBtExist(padapter) == _FALSE)\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.btInfo.bBtDisabled)\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.btInfo.bBtLpsOn)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nu8 hal_btcoex_RpwmVal(PADAPTER padapter)\n{\n\treturn GLBtCoexist.btInfo.rpwmVal;\n}\n\nu8 hal_btcoex_LpsVal(PADAPTER padapter)\n{\n\treturn GLBtCoexist.btInfo.lpsVal;\n}\n\nu32 hal_btcoex_GetRaMask(PADAPTER padapter)\n{\n\tif (!hal_btcoex_IsBtExist(padapter))\n\t\treturn 0;\n\n\tif (GLBtCoexist.btInfo.bBtDisabled)\n\t\treturn 0;\n\n\t\t/* Modify by YiWei , suggest by Cosa and Jenyu\n\t\t * Remove the limit antenna number , because 2 antenna case (ex: 8192eu)also want to get BT coex report rate mask.\n\t\t */\n\t/*if (GLBtCoexist.boardInfo.btdmAntNum != 1)\n\t\treturn 0;*/\n\n\treturn GLBtCoexist.btInfo.raMask;\n}\n\nvoid hal_btcoex_RecordPwrMode(PADAPTER padapter, u8 *pCmdBuf, u8 cmdLen)\n{\n\tRT_TRACE(COMP_COEX, DBG_LOUD, (\"[BTCoex], FW write pwrModeCmd=0x%04x%08x\\n\",\n\t\tpCmdBuf[0]<<8|pCmdBuf[1],\n\t\tpCmdBuf[2]<<24|pCmdBuf[3]<<16|pCmdBuf[4]<<8|pCmdBuf[5]));\n\n\t_rtw_memcpy(GLBtCoexist.pwrModeVal, pCmdBuf, cmdLen);\n}\n\nvoid hal_btcoex_DisplayBtCoexInfo(PADAPTER padapter, u8 *pbuf, u32 bufsize)\n{\n\tPBTCDBGINFO pinfo;\n\n\n\tpinfo = &GLBtcDbgInfo;\n\tDBG_BT_INFO_INIT(pinfo, pbuf, bufsize);\n\tEXhalbtcoutsrc_DisplayBtCoexInfo(&GLBtCoexist);\n\tDBG_BT_INFO_INIT(pinfo, NULL, 0);\n}\n\nvoid hal_btcoex_SetDBG(PADAPTER padapter, u32 *pDbgModule)\n{\n\tu32 i;\n\n\n\tif (NULL == pDbgModule)\n\t\treturn;\n\n\tfor (i = 0; i < COMP_MAX; i++)\n\t\tGLBtcDbgType[i] = pDbgModule[i];\n}\n\nu32 hal_btcoex_GetDBG(PADAPTER padapter, u8 *pStrBuf, u32 bufSize)\n{\n\ts32 count;\n\tu8 *pstr;\n\tu32 leftSize;\n\n\n\tif ((NULL == pStrBuf) || (0 == bufSize))\n\t\treturn 0;\n\n\tcount = 0;\n\tpstr = pStrBuf;\n\tleftSize = bufSize;\n//\tDBG_871X(FUNC_ADPT_FMT \": bufsize=%d\\n\", FUNC_ADPT_ARG(padapter), bufSize);\n\n\tcount = rtw_sprintf(pstr, leftSize, \"#define DBG\\t%d\\n\", DBG);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\n\tcount = rtw_sprintf(pstr, leftSize, \"BTCOEX Debug Setting:\\n\");\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\n\tcount = rtw_sprintf(pstr, leftSize,\n\t\t\"COMP_COEX: 0x%08X\\n\\n\",\n\t\tGLBtcDbgType[COMP_COEX]);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\n#if 0\n\tcount = rtw_sprintf(pstr, leftSize, \"INTERFACE Debug Setting Definition:\\n\");\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[0]=%d for INTF_INIT\\n\",\n\t\tGLBtcDbgType[BTC_MSG_INTERFACE]&INTF_INIT?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[2]=%d for INTF_NOTIFY\\n\\n\",\n\t\tGLBtcDbgType[BTC_MSG_INTERFACE]&INTF_NOTIFY?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\t\n\tcount = rtw_sprintf(pstr, leftSize, \"ALGORITHM Debug Setting Definition:\\n\");\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[0]=%d for BT_RSSI_STATE\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_BT_RSSI_STATE?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[1]=%d for WIFI_RSSI_STATE\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_WIFI_RSSI_STATE?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[2]=%d for BT_MONITOR\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_BT_MONITOR?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[3]=%d for TRACE\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[4]=%d for TRACE_FW\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_FW?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[5]=%d for TRACE_FW_DETAIL\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_FW_DETAIL?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[6]=%d for TRACE_FW_EXEC\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_FW_EXEC?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[7]=%d for TRACE_SW\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_SW?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[8]=%d for TRACE_SW_DETAIL\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_SW_DETAIL?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n\tcount = rtw_sprintf(pstr, leftSize, \"\\tbit[9]=%d for TRACE_SW_EXEC\\n\",\n\t\tGLBtcDbgType[BTC_MSG_ALGORITHM]&ALGO_TRACE_SW_EXEC?1:0);\n\tif ((count < 0) || (count >= leftSize))\n\t\tgoto exit;\n\tpstr += count;\n\tleftSize -= count;\n#endif\n\nexit:\n\tcount = pstr - pStrBuf;\n//\tDBG_871X(FUNC_ADPT_FMT \": usedsize=%d\\n\", FUNC_ADPT_ARG(padapter), count);\n\n\treturn count;\n}\n\nu8 hal_btcoex_IncreaseScanDeviceNum(PADAPTER padapter)\n{\n\tif (!hal_btcoex_IsBtExist(padapter))\n\t\treturn _FALSE;\n\n\tif (GLBtCoexist.btInfo.bIncreaseScanDevNum)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nu8 hal_btcoex_IsBtLinkExist(PADAPTER padapter)\n{\n\tif (GLBtCoexist.btLinkInfo.bBtLinkExist)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\nvoid hal_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer,u16 btPatchVer)\n{\n\tEXhalbtcoutsrc_SetBtPatchVersion(btHciVer,btPatchVer);\n}\n\nvoid hal_btcoex_SetHciVersion(PADAPTER padapter, u16 hciVersion)\n{\n\tEXhalbtcoutsrc_SetHciVersion(hciVersion);\n}\n\nvoid hal_btcoex_StackUpdateProfileInfo(void)\n{\n\tEXhalbtcoutsrc_StackUpdateProfileInfo();\n}\n\nvoid hal_btcoex_BTOffOnNotify(PADAPTER padapter, u8 bBTON)\n{\n\tEXhalbtcoutsrc_BTOffOnNotify(&GLBtCoexist, bBTON);\n}\n\n/*\n *\tDescription:\n *\tSetting BT coex antenna isolation type .\n *\tcoex mechanisn/ spital stream/ best throughput\n *\tanttype = 0\t,\tPSTDMA\t/\t2SS\t/\t0.5T\t,\tbad isolation , WiFi/BT ANT Distance<15cm , (<20dB) for 2,3 antenna\n *\tanttype = 1\t,\tPSTDMA\t/\t1SS\t/\t0.5T\t,\tnormal isolaiton , 50cm>WiFi/BT ANT Distance>15cm , (>20dB) for 2 antenna\n *\tanttype = 2\t,\tTDMA\t/\t2SS\t/\tT ,\t\tnormal isolaiton , 50cm>WiFi/BT ANT Distance>15cm , (>20dB) for 3 antenna\n *\tanttype = 3\t,\tno TDMA\t/\t1SS\t/\t0.5T\t,\tgood isolation , WiFi/BT ANT Distance >50cm , (>40dB) for 2 antenna\n *\tanttype = 4\t,\tno TDMA\t/\t2SS\t/\tT ,\t\tgood isolation , WiFi/BT ANT Distance >50cm , (>40dB) for 3 antenna\n *\twifi only throughput ~ T\n *\twifi/BT share one antenna with SPDT\n */\nvoid hal_btcoex_SetAntIsolationType(PADAPTER padapter, u8 anttype)\n{\n\t\tPHAL_DATA_TYPE pHalData;\n\t\tPBTC_COEXIST\tpBtCoexist = &GLBtCoexist;\n\n\t\t/*DBG_871X(\"####%s , anttype = %d  , %d\\n\" , __func__ , anttype , __LINE__); */\n\t\tpHalData = GET_HAL_DATA(padapter);\n\n\n\t\tpHalData->bt_coexist.btAntisolation = anttype;\n\n\t\tswitch (pHalData->bt_coexist.btAntisolation) {\n\t\tcase 0:\n\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_0;\n\t\t\t\tbreak;\n\t\tcase 1:\n\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_1;\n\t\t\t\tbreak;\n\t\tcase 2:\n\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_2;\n\t\t\t\tbreak;\n\t\tcase 3:\n\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_3;\n\t\t\t\tbreak;\n\t\tcase 4:\n\t\t\t\tpBtCoexist->boardInfo.antType = (u1Byte)BTC_ANT_TYPE_4;\n\t\t\t\tbreak;\n\t\t}\n\n}\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nint\nhal_btcoex_ParseAntIsolationConfigFile(\n  PADAPTER\t\tAdapter,\n  char*\t\t\tbuffer\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu32\ti = 0 , j = 0;\n\tchar\t*szLine , *ptmp;\n\tint rtStatus = _SUCCESS;\n\tchar param_value_string[10];\n\tu8 param_value;\n\tu8 anttype = 4;\n\t\n\tu8 ant_num = 3 , ant_distance = 50 , rfe_type = 1; \n\t\n\ttypedef struct ant_isolation {\n\t\tchar *param_name;  /* antenna isolation config parameter name */ \n\t\tu8 *value; /* antenna isolation config parameter value */\n\t} ANT_ISOLATION;\n\n\tANT_ISOLATION ant_isolation_param[] = {\n\t\t\t\t\t\t\t\t\t\t\t\t{\"ANT_NUMBER\" , &ant_num},\n\t\t\t\t\t\t\t\t\t\t\t\t{\"ANT_DISTANCE\" , &ant_distance},\n\t\t\t\t\t\t\t\t\t\t\t\t{\"RFE_TYPE\" , &rfe_type},\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{NULL , 0}\n\t\t\t\t\t\t\t\t\t\t};\n\n\n\t\n\t/* DBG_871X(\"===>Hal_ParseAntIsolationConfigFile()\\n\" ); */\n\t\t\t\n\tptmp = buffer;\n\tfor (szLine = GetLineFromBuffer(ptmp) ; szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {\n\t\t/* skip comment */ \n\t\tif (IsCommentString(szLine))\n\t\t\tcontinue;\t \n\n\t\t/* DBG_871X(\"%s : szLine = %s , strlen(szLine) = %d\\n\" , __func__ , szLine , strlen(szLine));*/\n\t\tfor (j = 0 ; ant_isolation_param[j].param_name != NULL ; j++) {\n\t\t\tif (strstr(szLine , ant_isolation_param[j].param_name) != NULL) {\n\t\t\t\ti = 0;\n\t\t\t\twhile (i < strlen(szLine)) {\n\t\t\t\t\tif (szLine[i] != '\"')\n\t\t\t\t\t\t++i;\n\t\t\t\t\telse {\n\t\t\t\t\t\t/* skip only has one \" */\n\t\t\t\t\t\tif (strpbrk(szLine , \"\\\"\") == strrchr(szLine , '\"')) {\n\t\t\t\t\t\t\tDBG_871X(\"Fail to parse parameters , format error!\\n\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_rtw_memset((PVOID)param_value_string , 0 , 10);\n\t\t\t\t\t\tif (!ParseQualifiedString(szLine , &i , param_value_string , '\"' , '\"')) {\n\t\t\t\t\t\t\tDBG_871X(\"Fail to parse parameters\\n\");\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t} else if (!GetU1ByteIntegerFromStringInDecimal(param_value_string , ant_isolation_param[j].value)) \n\t\t\t\t\t\t\tDBG_871X(\"Fail to GetU1ByteIntegerFromStringInDecimal\\n\");\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} \n\n\t/* YiWei 20140716 , for BT coex antenna isolation control */\n\t/* rfe_type = 0 was SPDT , rfe_type = 1 was coupler */\n\tif (ant_num == 3 && ant_distance >= 50) \n\t\tanttype = 3;\n\telse if (ant_num == 2 && ant_distance >= 50 && rfe_type == 1)\n\t\tanttype = 2;\n\telse if (ant_num == 3 && ant_distance >= 15 && ant_distance < 50)\n\t\tanttype = 2;\n\telse if (ant_num == 2 && ant_distance >= 15 && ant_distance < 50 && rfe_type == 1)\n\t\tanttype = 2;\n\telse if ((ant_num == 2 && ant_distance < 15 && rfe_type == 1) || (ant_num == 3 && ant_distance < 15))\n\t\tanttype = 1;\n\telse if (ant_num == 2 && rfe_type == 0)\n\t\tanttype = 0;\n\telse \n\t\tanttype = 0;\n\n\thal_btcoex_SetAntIsolationType(Adapter, anttype); \n\t\t\t\t\t\t\n\tDBG_871X(\"%s : ant_num = %d\\n\" , __func__ , ant_num);\n\tDBG_871X(\"%s : ant_distance = %d\\n\" , __func__ , ant_distance);\n\tDBG_871X(\"%s : rfe_type = %d\\n\" , __func__ , rfe_type);\n\t/* DBG_871X(\"<===Hal_ParseAntIsolationConfigFile()\\n\"); */\n\treturn rtStatus;\t\n}\n\n\nint\nhal_btcoex_AntIsolationConfig_ParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar*\t \tpFileName\n)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0 , rtStatus = _FAIL;\n\n\t_rtw_memset(pHalData->para_file_buf , 0 , MAX_PARA_FILE_BUF_LEN);\n\n\n\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\n\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t{\n\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\tif (rlen > 0)\n\t\t{\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t}\n\n\n\tif (rtStatus == _SUCCESS) {\n\t\t/*DBG_871X(\"%s(): read %s ok\\n\", __func__ , pFileName);*/\n\t\trtStatus = hal_btcoex_ParseAntIsolationConfigFile(Adapter , pHalData->para_file_buf);\n\t} else {\n\t\tDBG_871X(\"%s(): No File %s, Load from *** Array!\\n\" , __func__ , pFileName);\n\t}\n\n\treturn rtStatus;\n}\n#endif // CONFIG_LOAD_PHY_PARA_FROM_FILE\n#endif // CONFIG_BT_COEXIST\n\n"
  },
  {
    "path": "hal/hal_com.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HAL_COM_C_\n\n#include <drv_types.h>\n#include \"hal_com_h2c.h\"\n\n#include \"hal_data.h\"\n\n//#define CONFIG_GTK_OL_DBG\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nchar\trtw_phy_para_file_path[PATH_LENGTH_MAX];\n#endif\n\nvoid dump_chip_info(HAL_VERSION\tChipVersion)\n{\n\tint cnt = 0;\n\tu8 buf[128]={0};\n\t\n\tif (IS_8188E(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8188E_\");\n\telse if (IS_8188F(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8188F_\");\n\telse if (IS_8812_SERIES(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8812_\");\n\telse if (IS_8192E(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8192E_\");\n\telse if (IS_8821_SERIES(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8821_\");\n\telse if (IS_8723B_SERIES(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8723B_\");\n\telse if (IS_8703B_SERIES(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8703B_\");\n\telse if (IS_8814A_SERIES(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_8814A_\");\n\telse\n\t\tcnt += sprintf((buf+cnt), \"Chip Version Info: CHIP_UNKNOWN_\");\n\n\tcnt += sprintf((buf+cnt), \"%s_\", IS_NORMAL_CHIP(ChipVersion)?\"Normal_Chip\":\"Test_Chip\");\n\tif(IS_CHIP_VENDOR_TSMC(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"%s_\",\"TSMC\");\n\telse if(IS_CHIP_VENDOR_UMC(ChipVersion))\t\n\t\tcnt += sprintf((buf+cnt), \"%s_\",\"UMC\");\n\telse if(IS_CHIP_VENDOR_SMIC(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"%s_\",\"SMIC\");\t\t\n\t\n\tif (IS_A_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"A_CUT_\");\n\telse if (IS_B_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"B_CUT_\");\n\telse if (IS_C_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"C_CUT_\");\n\telse if (IS_D_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"D_CUT_\");\n\telse if (IS_E_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"E_CUT_\");\n\telse if (IS_F_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"F_CUT_\");\n\telse if (IS_I_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"I_CUT_\");\n\telse if (IS_J_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"J_CUT_\");\n\telse if (IS_K_CUT(ChipVersion))\n\t\tcnt += sprintf((buf+cnt), \"K_CUT_\");\n\telse\n\t\tcnt += sprintf((buf+cnt), \"UNKNOWN_CUT(%d)_\", ChipVersion.CUTVersion);\n\n\tif(IS_1T1R(ChipVersion)) cnt += sprintf((buf+cnt), \"1T1R_\");\n\telse if(IS_1T2R(ChipVersion)) cnt += sprintf((buf+cnt), \"1T2R_\");\n\telse if(IS_2T2R(ChipVersion)) cnt += sprintf((buf+cnt), \"2T2R_\");\n\telse if(IS_3T3R(ChipVersion)) cnt += sprintf((buf+cnt), \"3T3R_\");\n\telse if(IS_3T4R(ChipVersion)) cnt += sprintf((buf+cnt), \"3T4R_\");\n\telse if(IS_4T4R(ChipVersion)) cnt += sprintf((buf+cnt), \"4T4R_\");\n\telse cnt += sprintf((buf+cnt), \"UNKNOWN_RFTYPE(%d)_\", ChipVersion.RFType);\n\n\tcnt += sprintf((buf+cnt), \"RomVer(%d)\\n\", ChipVersion.ROMVer);\n\n\tDBG_871X(\"%s\", buf);\n}\nvoid rtw_hal_config_rftype(PADAPTER  padapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);\n\t\n\tif (IS_1T1R(pHalData->VersionID)) {\n\t\tpHalData->rf_type = RF_1T1R;\n\t\tpHalData->NumTotalRFPath = 1;\n\t}\t\n\telse if (IS_2T2R(pHalData->VersionID)) {\n\t\tpHalData->rf_type = RF_2T2R;\n\t\tpHalData->NumTotalRFPath = 2;\n\t}\n\telse if (IS_1T2R(pHalData->VersionID)) {\n\t\tpHalData->rf_type = RF_1T2R;\n\t\tpHalData->NumTotalRFPath = 2;\n\t}\n\telse if(IS_3T3R(pHalData->VersionID)) {\n\t\tpHalData->rf_type = RF_3T3R;\n\t\tpHalData->NumTotalRFPath = 3;\n\t}\t\n\telse if(IS_4T4R(pHalData->VersionID)) {\n\t\tpHalData->rf_type = RF_4T4R;\n\t\tpHalData->NumTotalRFPath = 4;\n\t}\n\telse {\n\t\tpHalData->rf_type = RF_1T1R;\n\t\tpHalData->NumTotalRFPath = 1;\n\t}\n\t\n\tDBG_871X(\"%s RF_Type is %d TotalTxPath is %d \\n\", __FUNCTION__, pHalData->rf_type, pHalData->NumTotalRFPath);\n}\n\n#define\tEEPROM_CHANNEL_PLAN_BY_HW_MASK\t0x80\n\n/*\n * Description:\n * \tUse hardware(efuse), driver parameter(registry) and default channel plan\n * \tto decide which one should be used.\n *\n * Parameters:\n *\tpadapter\t\t\tpointer of adapter\n *\thw_channel_plan\t\tchannel plan from HW (efuse/eeprom)\n *\t\t\t\t\t\tBIT[7] software configure mode; 0:Enable, 1:disable\n *\t\t\t\t\t\tBIT[6:0] Channel Plan\n *\tsw_channel_plan\t\tchannel plan from SW (registry/module param)\n *\tdef_channel_plan\tchannel plan used when HW/SW both invalid\n *\tAutoLoadFail\t\tefuse autoload fail or not\n *\n * Return:\n *\tFinal channel plan decision\n *\n */\nu8\nhal_com_config_channel_plan(\n\tIN\tPADAPTER\tpadapter,\n\tIN\tu8\t\t\thw_channel_plan,\n\tIN\tu8\t\t\tsw_channel_plan,\n\tIN\tu8\t\t\tdef_channel_plan,\n\tIN\tBOOLEAN\t\tAutoLoadFail\n\t)\n{\n\tPHAL_DATA_TYPE\tpHalData;\n\tu8 hwConfig;\n\tu8 chnlPlan;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tpHalData->bDisableSWChannelPlan = _FALSE;\n\tchnlPlan = def_channel_plan;\n\n\tif (0xFF == hw_channel_plan)\n\t\tAutoLoadFail = _TRUE;\n\n\tif (_FALSE == AutoLoadFail)\n\t{\n\t\tu8 hw_chnlPlan;\n\n\t\thw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);\n\t\tif (rtw_is_channel_plan_valid(hw_chnlPlan))\n\t\t{\n#ifndef CONFIG_SW_CHANNEL_PLAN\n\t\t\tif (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)\n\t\t\t\tpHalData->bDisableSWChannelPlan = _TRUE;\n#endif // !CONFIG_SW_CHANNEL_PLAN\n\n\t\t\tchnlPlan = hw_chnlPlan;\n\t\t}\n\t}\n\n\tif ((_FALSE == pHalData->bDisableSWChannelPlan)\n\t\t&& rtw_is_channel_plan_valid(sw_channel_plan))\n\t{\n\t\tchnlPlan = sw_channel_plan;\n\t}\n\n\treturn chnlPlan;\n}\n\nBOOLEAN\nHAL_IsLegalChannel(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\t\tChannel\n\t)\n{\n\tBOOLEAN bLegalChannel = _TRUE;\n\n\tif (Channel > 14) {\n\t\tif(IsSupported5G(Adapter->registrypriv.wireless_mode) == _FALSE) {\n\t\t\tbLegalChannel = _FALSE;\n\t\t\tDBG_871X(\"Channel > 14 but wireless_mode do not support 5G\\n\");\n\t\t}\n\t} else if ((Channel <= 14) && (Channel >=1)){\n\t\tif(IsSupported24G(Adapter->registrypriv.wireless_mode) == _FALSE) {\n\t\t\tbLegalChannel = _FALSE;\n\t\t\tDBG_871X(\"(Channel <= 14) && (Channel >=1) but wireless_mode do not support 2.4G\\n\");\n\t\t}\n\t} else {\n\t\tbLegalChannel = _FALSE;\n\t\tDBG_871X(\"Channel is Invalid !!!\\n\");\n\t}\n\n\treturn bLegalChannel;\n}\t\n\nu8\tMRateToHwRate(u8 rate)\n{\n\tu8\tret = DESC_RATE1M;\n\t\t\n\tswitch(rate)\n\t{\n\t\tcase MGN_1M:\t\t    ret = DESC_RATE1M;\tbreak;\n\t\tcase MGN_2M:\t\t    ret = DESC_RATE2M;\tbreak;\n\t\tcase MGN_5_5M:\t\t    ret = DESC_RATE5_5M;\tbreak;\n\t\tcase MGN_11M:\t\t    ret = DESC_RATE11M;\tbreak;\n\t\tcase MGN_6M:\t\t    ret = DESC_RATE6M;\tbreak;\n\t\tcase MGN_9M:\t\t    ret = DESC_RATE9M;\tbreak;\n\t\tcase MGN_12M:\t\t    ret = DESC_RATE12M;\tbreak;\n\t\tcase MGN_18M:\t\t    ret = DESC_RATE18M;\tbreak;\n\t\tcase MGN_24M:\t\t    ret = DESC_RATE24M;\tbreak;\n\t\tcase MGN_36M:\t\t    ret = DESC_RATE36M;\tbreak;\n\t\tcase MGN_48M:\t\t    ret = DESC_RATE48M;\tbreak;\n\t\tcase MGN_54M:\t\t    ret = DESC_RATE54M;\tbreak;\n\n\t\tcase MGN_MCS0:\t\t    ret = DESC_RATEMCS0;\tbreak;\n\t\tcase MGN_MCS1:\t\t    ret = DESC_RATEMCS1;\tbreak;\n\t\tcase MGN_MCS2:\t\t    ret = DESC_RATEMCS2;\tbreak;\n\t\tcase MGN_MCS3:\t\t    ret = DESC_RATEMCS3;\tbreak;\n\t\tcase MGN_MCS4:\t\t    ret = DESC_RATEMCS4;\tbreak;\n\t\tcase MGN_MCS5:\t\t    ret = DESC_RATEMCS5;\tbreak;\n\t\tcase MGN_MCS6:\t\t    ret = DESC_RATEMCS6;\tbreak;\n\t\tcase MGN_MCS7:\t\t    ret = DESC_RATEMCS7;\tbreak;\n\t\tcase MGN_MCS8:\t\t    ret = DESC_RATEMCS8;\tbreak;\n\t\tcase MGN_MCS9:\t\t    ret = DESC_RATEMCS9;\tbreak;\n\t\tcase MGN_MCS10:\t        ret = DESC_RATEMCS10;\tbreak;\n\t\tcase MGN_MCS11:\t        ret = DESC_RATEMCS11;\tbreak;\n\t\tcase MGN_MCS12:\t        ret = DESC_RATEMCS12;\tbreak;\n\t\tcase MGN_MCS13:\t        ret = DESC_RATEMCS13;\tbreak;\n\t\tcase MGN_MCS14:\t        ret = DESC_RATEMCS14;\tbreak;\n\t\tcase MGN_MCS15:\t        ret = DESC_RATEMCS15;\tbreak;\n\t\tcase MGN_MCS16:\t\t    ret = DESC_RATEMCS16;\tbreak;\n\t\tcase MGN_MCS17:\t\t    ret = DESC_RATEMCS17;\tbreak;\n\t\tcase MGN_MCS18:\t\t    ret = DESC_RATEMCS18;\tbreak;\n\t\tcase MGN_MCS19:\t\t    ret = DESC_RATEMCS19;\tbreak;\n\t\tcase MGN_MCS20:\t        ret = DESC_RATEMCS20;\tbreak;\n\t\tcase MGN_MCS21:\t        ret = DESC_RATEMCS21;\tbreak;\n\t\tcase MGN_MCS22:\t        ret = DESC_RATEMCS22;\tbreak;\n\t\tcase MGN_MCS23:\t        ret = DESC_RATEMCS23;\tbreak;\n\t\tcase MGN_MCS24:\t        ret = DESC_RATEMCS24;\tbreak;\n\t\tcase MGN_MCS25:\t        ret = DESC_RATEMCS25;\tbreak;\n\t\tcase MGN_MCS26:\t\t    ret = DESC_RATEMCS26;\tbreak;\n\t\tcase MGN_MCS27:\t\t    ret = DESC_RATEMCS27;\tbreak;\n\t\tcase MGN_MCS28:\t\t    ret = DESC_RATEMCS28;\tbreak;\n\t\tcase MGN_MCS29:\t\t    ret = DESC_RATEMCS29;\tbreak;\n\t\tcase MGN_MCS30:\t        ret = DESC_RATEMCS30;\tbreak;\n\t\tcase MGN_MCS31:\t        ret = DESC_RATEMCS31;\tbreak;\n\n\t\tcase MGN_VHT1SS_MCS0:\tret = DESC_RATEVHTSS1MCS0;\tbreak;\n\t\tcase MGN_VHT1SS_MCS1:\tret = DESC_RATEVHTSS1MCS1;\tbreak;\n\t\tcase MGN_VHT1SS_MCS2:\tret = DESC_RATEVHTSS1MCS2;\tbreak;\n\t\tcase MGN_VHT1SS_MCS3:\tret = DESC_RATEVHTSS1MCS3;\tbreak;\n\t\tcase MGN_VHT1SS_MCS4:\tret = DESC_RATEVHTSS1MCS4;\tbreak;\n\t\tcase MGN_VHT1SS_MCS5:\tret = DESC_RATEVHTSS1MCS5;\tbreak;\n\t\tcase MGN_VHT1SS_MCS6:\tret = DESC_RATEVHTSS1MCS6;\tbreak;\n\t\tcase MGN_VHT1SS_MCS7:\tret = DESC_RATEVHTSS1MCS7;\tbreak;\n\t\tcase MGN_VHT1SS_MCS8:\tret = DESC_RATEVHTSS1MCS8;\tbreak;\n\t\tcase MGN_VHT1SS_MCS9:\tret = DESC_RATEVHTSS1MCS9;\tbreak;\t\n\t\tcase MGN_VHT2SS_MCS0:\tret = DESC_RATEVHTSS2MCS0;\tbreak;\n\t\tcase MGN_VHT2SS_MCS1:\tret = DESC_RATEVHTSS2MCS1;\tbreak;\n\t\tcase MGN_VHT2SS_MCS2:\tret = DESC_RATEVHTSS2MCS2;\tbreak;\n\t\tcase MGN_VHT2SS_MCS3:\tret = DESC_RATEVHTSS2MCS3;\tbreak;\n\t\tcase MGN_VHT2SS_MCS4:\tret = DESC_RATEVHTSS2MCS4;\tbreak;\n\t\tcase MGN_VHT2SS_MCS5:\tret = DESC_RATEVHTSS2MCS5;\tbreak;\n\t\tcase MGN_VHT2SS_MCS6:\tret = DESC_RATEVHTSS2MCS6;\tbreak;\n\t\tcase MGN_VHT2SS_MCS7:\tret = DESC_RATEVHTSS2MCS7;\tbreak;\n\t\tcase MGN_VHT2SS_MCS8:\tret = DESC_RATEVHTSS2MCS8;\tbreak;\n\t\tcase MGN_VHT2SS_MCS9:\tret = DESC_RATEVHTSS2MCS9;\tbreak;\t\n\t\tcase MGN_VHT3SS_MCS0:\tret = DESC_RATEVHTSS3MCS0;\tbreak;\n\t\tcase MGN_VHT3SS_MCS1:\tret = DESC_RATEVHTSS3MCS1;\tbreak;\n\t\tcase MGN_VHT3SS_MCS2:\tret = DESC_RATEVHTSS3MCS2;\tbreak;\n\t\tcase MGN_VHT3SS_MCS3:\tret = DESC_RATEVHTSS3MCS3;\tbreak;\n\t\tcase MGN_VHT3SS_MCS4:\tret = DESC_RATEVHTSS3MCS4;\tbreak;\n\t\tcase MGN_VHT3SS_MCS5:\tret = DESC_RATEVHTSS3MCS5;\tbreak;\n\t\tcase MGN_VHT3SS_MCS6:\tret = DESC_RATEVHTSS3MCS6;\tbreak;\n\t\tcase MGN_VHT3SS_MCS7:\tret = DESC_RATEVHTSS3MCS7;\tbreak;\n\t\tcase MGN_VHT3SS_MCS8:\tret = DESC_RATEVHTSS3MCS8;\tbreak;\n\t\tcase MGN_VHT3SS_MCS9:\tret = DESC_RATEVHTSS3MCS9;\tbreak;\n\t\tcase MGN_VHT4SS_MCS0:\tret = DESC_RATEVHTSS4MCS0;\tbreak;\n\t\tcase MGN_VHT4SS_MCS1:\tret = DESC_RATEVHTSS4MCS1;\tbreak;\n\t\tcase MGN_VHT4SS_MCS2:\tret = DESC_RATEVHTSS4MCS2;\tbreak;\n\t\tcase MGN_VHT4SS_MCS3:\tret = DESC_RATEVHTSS4MCS3;\tbreak;\n\t\tcase MGN_VHT4SS_MCS4:\tret = DESC_RATEVHTSS4MCS4;\tbreak;\n\t\tcase MGN_VHT4SS_MCS5:\tret = DESC_RATEVHTSS4MCS5;\tbreak;\n\t\tcase MGN_VHT4SS_MCS6:\tret = DESC_RATEVHTSS4MCS6;\tbreak;\n\t\tcase MGN_VHT4SS_MCS7:\tret = DESC_RATEVHTSS4MCS7;\tbreak;\n\t\tcase MGN_VHT4SS_MCS8:\tret = DESC_RATEVHTSS4MCS8;\tbreak;\n\t\tcase MGN_VHT4SS_MCS9:\tret = DESC_RATEVHTSS4MCS9;\tbreak;\n\t\tdefault:\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\nu8\tHwRateToMRate(u8 rate)\n{\n\tu8\tret_rate = MGN_1M;\n\n\tswitch(rate)\n\t{\n\t\n\t\tcase DESC_RATE1M:\t\t    ret_rate = MGN_1M;\t\tbreak;\n\t\tcase DESC_RATE2M:\t\t    ret_rate = MGN_2M;\t\tbreak;\n\t\tcase DESC_RATE5_5M:\t        ret_rate = MGN_5_5M;\tbreak;\n\t\tcase DESC_RATE11M:\t\t    ret_rate = MGN_11M;\t\tbreak;\n\t\tcase DESC_RATE6M:\t\t    ret_rate = MGN_6M;\t\tbreak;\n\t\tcase DESC_RATE9M:\t\t    ret_rate = MGN_9M;\t\tbreak;\n\t\tcase DESC_RATE12M:\t\t    ret_rate = MGN_12M;\t\tbreak;\n\t\tcase DESC_RATE18M:\t\t    ret_rate = MGN_18M;\t\tbreak;\n\t\tcase DESC_RATE24M:\t\t    ret_rate = MGN_24M;\t\tbreak;\n\t\tcase DESC_RATE36M:\t\t    ret_rate = MGN_36M;\t\tbreak;\n\t\tcase DESC_RATE48M:\t\t    ret_rate = MGN_48M;\t\tbreak;\n\t\tcase DESC_RATE54M:\t\t    ret_rate = MGN_54M;\t\tbreak;\t\t\t\n\t\tcase DESC_RATEMCS0:\t        ret_rate = MGN_MCS0;\tbreak;\n\t\tcase DESC_RATEMCS1:\t        ret_rate = MGN_MCS1;\tbreak;\n\t\tcase DESC_RATEMCS2:\t        ret_rate = MGN_MCS2;\tbreak;\n\t\tcase DESC_RATEMCS3:\t        ret_rate = MGN_MCS3;\tbreak;\n\t\tcase DESC_RATEMCS4:\t        ret_rate = MGN_MCS4;\tbreak;\n\t\tcase DESC_RATEMCS5:\t        ret_rate = MGN_MCS5;\tbreak;\n\t\tcase DESC_RATEMCS6:\t        ret_rate = MGN_MCS6;\tbreak;\n\t\tcase DESC_RATEMCS7:\t        ret_rate = MGN_MCS7;\tbreak;\n\t\tcase DESC_RATEMCS8:\t        ret_rate = MGN_MCS8;\tbreak;\n\t\tcase DESC_RATEMCS9:\t        ret_rate = MGN_MCS9;\tbreak;\n\t\tcase DESC_RATEMCS10:\t    ret_rate = MGN_MCS10;\tbreak;\n\t\tcase DESC_RATEMCS11:\t    ret_rate = MGN_MCS11;\tbreak;\n\t\tcase DESC_RATEMCS12:\t    ret_rate = MGN_MCS12;\tbreak;\n\t\tcase DESC_RATEMCS13:\t    ret_rate = MGN_MCS13;\tbreak;\n\t\tcase DESC_RATEMCS14:\t    ret_rate = MGN_MCS14;\tbreak;\n\t\tcase DESC_RATEMCS15:\t    ret_rate = MGN_MCS15;\tbreak;\n\t\tcase DESC_RATEMCS16:\t    ret_rate = MGN_MCS16;\tbreak;\n\t\tcase DESC_RATEMCS17:\t    ret_rate = MGN_MCS17;\tbreak;\n\t\tcase DESC_RATEMCS18:\t    ret_rate = MGN_MCS18;\tbreak;\n\t\tcase DESC_RATEMCS19:\t    ret_rate = MGN_MCS19;\tbreak;\n\t\tcase DESC_RATEMCS20:\t    ret_rate = MGN_MCS20;\tbreak;\n\t\tcase DESC_RATEMCS21:\t    ret_rate = MGN_MCS21;\tbreak;\n\t\tcase DESC_RATEMCS22:\t    ret_rate = MGN_MCS22;\tbreak;\n\t\tcase DESC_RATEMCS23:\t    ret_rate = MGN_MCS23;\tbreak;\n\t\tcase DESC_RATEMCS24:\t    ret_rate = MGN_MCS24;\tbreak;\n\t\tcase DESC_RATEMCS25:\t    ret_rate = MGN_MCS25;\tbreak;\n\t\tcase DESC_RATEMCS26:\t    ret_rate = MGN_MCS26;\tbreak;\n\t\tcase DESC_RATEMCS27:\t    ret_rate = MGN_MCS27;\tbreak;\n\t\tcase DESC_RATEMCS28:\t    ret_rate = MGN_MCS28;\tbreak;\n\t\tcase DESC_RATEMCS29:\t    ret_rate = MGN_MCS29;\tbreak;\n\t\tcase DESC_RATEMCS30:\t    ret_rate = MGN_MCS30;\tbreak;\n\t\tcase DESC_RATEMCS31:\t    ret_rate = MGN_MCS31;\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS0:\tret_rate = MGN_VHT1SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS1:\tret_rate = MGN_VHT1SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS2:\tret_rate = MGN_VHT1SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS3:\tret_rate = MGN_VHT1SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS4:\tret_rate = MGN_VHT1SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS5:\tret_rate = MGN_VHT1SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS6:\tret_rate = MGN_VHT1SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS7:\tret_rate = MGN_VHT1SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS8:\tret_rate = MGN_VHT1SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS1MCS9:\tret_rate = MGN_VHT1SS_MCS9;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS0:\tret_rate = MGN_VHT2SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS1:\tret_rate = MGN_VHT2SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS2:\tret_rate = MGN_VHT2SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS3:\tret_rate = MGN_VHT2SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS4:\tret_rate = MGN_VHT2SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS5:\tret_rate = MGN_VHT2SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS6:\tret_rate = MGN_VHT2SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS7:\tret_rate = MGN_VHT2SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS8:\tret_rate = MGN_VHT2SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS2MCS9:\tret_rate = MGN_VHT2SS_MCS9;\t\tbreak;\t\t\t\t\n\t\tcase DESC_RATEVHTSS3MCS0:\tret_rate = MGN_VHT3SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS1:\tret_rate = MGN_VHT3SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS2:\tret_rate = MGN_VHT3SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS3:\tret_rate = MGN_VHT3SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS4:\tret_rate = MGN_VHT3SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS5:\tret_rate = MGN_VHT3SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS6:\tret_rate = MGN_VHT3SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS7:\tret_rate = MGN_VHT3SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS8:\tret_rate = MGN_VHT3SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS3MCS9:\tret_rate = MGN_VHT3SS_MCS9;\t\tbreak;\t\t\t\t\n\t\tcase DESC_RATEVHTSS4MCS0:\tret_rate = MGN_VHT4SS_MCS0;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS1:\tret_rate = MGN_VHT4SS_MCS1;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS2:\tret_rate = MGN_VHT4SS_MCS2;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS3:\tret_rate = MGN_VHT4SS_MCS3;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS4:\tret_rate = MGN_VHT4SS_MCS4;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS5:\tret_rate = MGN_VHT4SS_MCS5;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS6:\tret_rate = MGN_VHT4SS_MCS6;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS7:\tret_rate = MGN_VHT4SS_MCS7;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS8:\tret_rate = MGN_VHT4SS_MCS8;\t\tbreak;\n\t\tcase DESC_RATEVHTSS4MCS9:\tret_rate = MGN_VHT4SS_MCS9;\t\tbreak;\t\t\t\t\n\t\t\n\t\tdefault:\t\t\t\t\t\t\t\n\t\t\tDBG_871X(\"HwRateToMRate(): Non supported Rate [%x]!!!\\n\",rate );\n\t\t\tbreak;\n\t}\n\n\treturn ret_rate;\n}\n\nvoid\tHalSetBrateCfg(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\t\t*mBratesOS,\n\tOUT u16\t\t\t*pBrateCfg)\n{\n\tu8\ti, is_brate, brate;\n\n\tfor(i=0;i<NDIS_802_11_LENGTH_RATES_EX;i++)\n\t{\n\t\tis_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;\n\t\tbrate = mBratesOS[i] & 0x7f;\n\t\t\n\t\tif( is_brate )\n\t\t{\t\t\n\t\t\tswitch(brate)\n\t\t\t{\n\t\t\t\tcase IEEE80211_CCK_RATE_1MB:\t*pBrateCfg |= RATE_1M;\tbreak;\n\t\t\t\tcase IEEE80211_CCK_RATE_2MB:\t*pBrateCfg |= RATE_2M;\tbreak;\n\t\t\t\tcase IEEE80211_CCK_RATE_5MB:\t*pBrateCfg |= RATE_5_5M;break;\n\t\t\t\tcase IEEE80211_CCK_RATE_11MB:\t*pBrateCfg |= RATE_11M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_6MB:\t*pBrateCfg |= RATE_6M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_9MB:\t*pBrateCfg |= RATE_9M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_12MB:\t*pBrateCfg |= RATE_12M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_18MB:\t*pBrateCfg |= RATE_18M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_24MB:\t*pBrateCfg |= RATE_24M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_36MB:\t*pBrateCfg |= RATE_36M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_48MB:\t*pBrateCfg |= RATE_48M;\tbreak;\n\t\t\t\tcase IEEE80211_OFDM_RATE_54MB:\t*pBrateCfg |= RATE_54M;\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic VOID\n_OneOutPipeMapping(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(pAdapter);\n\n\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI\n\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];//BE\n\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];//BK\n\t\n\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH\n\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\n}\n\nstatic VOID\n_TwoOutPipeMapping(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t \tbWIFICfg\n\t)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(pAdapter);\n\n\tif(bWIFICfg){ //WMM\n\t\t\n\t\t//\tBK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  0, \t1, \t0, \t1, \t0, \t0, \t0, \t0, \t\t0\t};\n\t\t//0:ep_0 num, 1:ep_1 num \n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\n\t\t\n\t}\n\telse{//typical setting\n\n\t\t\n\t\t//BK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  1, \t1, \t0, \t0, \t0, \t0, \t0, \t0, \t\t0\t};\t\t\t\n\t\t//0:ep_0 num, 1:ep_1 num\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\t\n\t\t\n\t}\n\t\n}\n\nstatic VOID _ThreeOutPipeMapping(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t \tbWIFICfg\n\t)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(pAdapter);\n\n\tif(bWIFICfg){//for WMM\n\t\t\n\t\t//\tBK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  1, \t2, \t1, \t0, \t0, \t0, \t0, \t0, \t\t0\t};\n\t\t//0:H, 1:N, 2:L \n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\n\t\t\n\t}\n\telse{//typical setting\n\n\t\t\n\t\t//\tBK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  2, \t2, \t1, \t0, \t0, \t0, \t0, \t0, \t\t0\t};\t\t\t\n\t\t//0:H, 1:N, 2:L \n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\t\n\t}\n\n}\nstatic VOID _FourOutPipeMapping(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t \tbWIFICfg\n\t)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(pAdapter);\n\n\tif(bWIFICfg){//for WMM\n\t\t\n\t\t//\tBK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  1, \t2, \t1, \t0, \t0, \t0, \t0, \t0, \t\t0\t};\n\t\t//0:H, 1:N, 2:L ,3:E\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[3];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\n\t\t\n\t}\n\telse{//typical setting\n\n\t\t\n\t\t//\tBK, \tBE, \tVI, \tVO, \tBCN,\tCMD,MGT,HIGH,HCCA \n\t\t//{  2, \t2, \t1, \t0, \t0, \t0, \t0, \t0, \t\t0\t};\t\t\t\n\t\t//0:H, 1:N, 2:L \n\t\t\n\t\tpdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO\n\t\tpdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];//VI\n\t\tpdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];//BE\n\t\tpdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];//BK\n\t\t\n\t\tpdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];//BCN\n\t\tpdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];//MGT\n\t\tpdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[3];//HIGH\n\t\tpdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];//TXCMD\t\n\t}\n\n}\nBOOLEAN\nHal_MappingOutPipe(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tNumOutPipe\n\t)\n{\n\tstruct registry_priv *pregistrypriv = &pAdapter->registrypriv;\n\n\tBOOLEAN\t bWIFICfg = (pregistrypriv->wifi_spec) ?_TRUE:_FALSE;\n\t\n\tBOOLEAN result = _TRUE;\n\n\tswitch(NumOutPipe)\n\t{\n\t\tcase 2:\n\t\t\t_TwoOutPipeMapping(pAdapter, bWIFICfg);\n\t\t\tbreak;\n\t\tcase 3:\n\t\tcase 4:\n\t\t\t_ThreeOutPipeMapping(pAdapter, bWIFICfg);\n\t\t\tbreak;\t\t\t\n\t\tcase 1:\n\t\t\t_OneOutPipeMapping(pAdapter);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tresult = _FALSE;\n\t\t\tbreak;\n\t}\n\n\treturn result;\n\t\n}\n\nvoid hal_init_macaddr(_adapter *adapter)\n{\n\trtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter));\n#ifdef  CONFIG_CONCURRENT_MODE\n\tif (adapter->pbuddy_adapter)\n\t\trtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter->pbuddy_adapter));\n#endif\n}\n\nvoid rtw_init_hal_com_default_value(PADAPTER Adapter)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\n\tpHalData->AntDetection = 1;\n}\n\n/* \n* C2H event format:\n* Field\t TRIGGER\t\tCONTENT\t   CMD_SEQ \tCMD_LEN\t\t CMD_ID\n* BITS\t [127:120]\t[119:16]      [15:8]\t\t  [7:4]\t \t   [3:0]\n*/\n\nvoid c2h_evt_clear(_adapter *adapter)\n{\n\trtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);\n}\n\ns32 c2h_evt_read(_adapter *adapter, u8 *buf)\n{\n\ts32 ret = _FAIL;\n\tstruct c2h_evt_hdr *c2h_evt;\n\tint i;\n\tu8 trigger;\n\n\tif (buf == NULL)\n\t\tgoto exit;\n\n#if defined (CONFIG_RTL8188E)\n\n\ttrigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);\n\n\tif (trigger == C2H_EVT_HOST_CLOSE) {\n\t\tgoto exit; /* Not ready */\n\t} else if (trigger != C2H_EVT_FW_CLOSE) {\n\t\tgoto clear_evt; /* Not a valid value */\n\t}\n\n\tc2h_evt = (struct c2h_evt_hdr *)buf;\n\n\t_rtw_memset(c2h_evt, 0, 16);\n\n\t*buf = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);\n\t*(buf+1) = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1);\t\n\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_info_, \"c2h_evt_read(): \",\n\t\t&c2h_evt , sizeof(c2h_evt));\n\n\tif (0) {\n\t\tDBG_871X(\"%s id:%u, len:%u, seq:%u, trigger:0x%02x\\n\", __func__\n\t\t\t, c2h_evt->id, c2h_evt->plen, c2h_evt->seq, trigger);\n\t}\n\n\t/* Read the content */\n\tfor (i = 0; i < c2h_evt->plen; i++)\n\t\tc2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);\n\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_info_, \"c2h_evt_read(): Command Content:\\n\",\n\t\tc2h_evt->payload, c2h_evt->plen);\n\n\tret = _SUCCESS;\n\nclear_evt:\n\t/* \n\t* Clear event to notify FW we have read the command.\n\t* If this field isn't clear, the FW won't update the next command message.\n\t*/\n\tc2h_evt_clear(adapter);\n#endif\nexit:\n\treturn ret;\n}\n\n/* \n* C2H event format:\n* Field    TRIGGER    CMD_LEN    CONTENT    CMD_SEQ    CMD_ID\n* BITS    [127:120]   [119:112]    [111:16]\t     [15:8]         [7:0]\n*/\ns32 c2h_evt_read_88xx(_adapter *adapter, u8 *buf)\n{\n\ts32 ret = _FAIL;\n\tstruct c2h_evt_hdr_88xx *c2h_evt;\n\tint i;\n\tu8 trigger;\n\n\tif (buf == NULL)\n\t\tgoto exit;\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B)\n\n\ttrigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);\n\n\tif (trigger == C2H_EVT_HOST_CLOSE) {\n\t\tgoto exit; /* Not ready */\n\t} else if (trigger != C2H_EVT_FW_CLOSE) {\n\t\tgoto clear_evt; /* Not a valid value */\n\t}\n\n\tc2h_evt = (struct c2h_evt_hdr_88xx *)buf;\n\n\t_rtw_memset(c2h_evt, 0, 16);\n\n\tc2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);\n\tc2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);\n\tc2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);\n\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_info_, \"c2h_evt_read(): \",\n\t\t&c2h_evt , sizeof(c2h_evt));\n\n\tif (0) {\n\t\tDBG_871X(\"%s id:%u, len:%u, seq:%u, trigger:0x%02x\\n\", __func__\n\t\t\t, c2h_evt->id, c2h_evt->plen, c2h_evt->seq, trigger);\n\t}\n\n\t/* Read the content */\n\tfor (i = 0; i < c2h_evt->plen; i++)\n\t\tc2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);\n\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_info_, \"c2h_evt_read(): Command Content:\\n\",\n\t\tc2h_evt->payload, c2h_evt->plen);\n\n\tret = _SUCCESS;\n\nclear_evt:\n\t/* \n\t* Clear event to notify FW we have read the command.\n\t* If this field isn't clear, the FW won't update the next command message.\n\t*/\n\tc2h_evt_clear(adapter);\n#endif\nexit:\n\treturn ret;\n}\n\n\nu8  rtw_hal_networktype_to_raid(_adapter *adapter, struct sta_info *psta)\n{\n\tif(IS_NEW_GENERATION_IC(adapter)){\n\t\treturn networktype_to_raid_ex(adapter,psta);\n\t}\n\telse{\n\t\treturn networktype_to_raid(adapter,psta);\n\t}\n\n}\nu8 rtw_get_mgntframe_raid(_adapter *adapter,unsigned char network_type)\n{\t\n\n\tu8 raid;\n\tif(IS_NEW_GENERATION_IC(adapter)){\n\t\t\n\t\traid = (network_type & WIRELESS_11B)\t?RATEID_IDX_B\n\t\t\t\t\t\t\t\t\t\t\t:RATEID_IDX_G;\t\t\n\t}\n\telse{\n\t\traid = (network_type & WIRELESS_11B)\t?RATR_INX_WIRELESS_B\n\t\t\t\t\t\t\t\t\t\t\t:RATR_INX_WIRELESS_G;\t\t\n\t}\t\n\treturn raid;\n}\n\nvoid rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta)\n{\n\tu8\ti, rf_type, limit;\n\tu64\ttx_ra_bitmap;\n\n\tif(psta == NULL)\n\t{\n\t\treturn;\n\t}\n\n\ttx_ra_bitmap = 0;\n\n\t//b/g mode ra_bitmap  \n\tfor (i=0; i<sizeof(psta->bssrateset); i++)\n\t{\n\t\tif (psta->bssrateset[i])\n\t\t\ttx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);\n\t}\n\n#ifdef CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\n\t//AC mode ra_bitmap\n\tif(psta->vhtpriv.vht_option) \n\t{\n\t\ttx_ra_bitmap |= (rtw_vht_rate_to_bitmap(psta->vhtpriv.vht_mcs_map) << 12);\n\t}\n\telse\n#endif //CONFIG_80211AC_VHT\n\t{\n\t\t//n mode ra_bitmap\n\t\tif(psta->htpriv.ht_option)\n\t\t{\n\t\t\trf_type = RF_1T1R;\n\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\t\t\tif(rf_type == RF_2T2R)\n\t\t\t\tlimit=16;// 2R\n\t\t\telse if(rf_type == RF_3T3R)\n\t\t\t\tlimit=24;// 3R\n\t\t\telse\n\t\t\t\tlimit=8;//  1R\n\n\n\t\t\t/* Handling SMPS mode for AP MODE only*/\n\t\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) {\n\t\t\t\t/*0:static SMPS, 1:dynamic SMPS, 3:SMPS disabled, 2:reserved*/\n\t\t\t\tif (psta->htpriv.smps_cap == 0 || psta->htpriv.smps_cap == 1) {\n\t\t\t\t\t/*operate with only one active receive chain // 11n-MCS rate <= MSC7*/\n\t\t\t\t\tlimit = 8;/*  1R*/\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i=0; i<limit; i++) {\n\t\t\t\tif (psta->htpriv.ht_cap.supp_mcs_set[i/8] & BIT(i%8))\n\t\t\t\t\ttx_ra_bitmap |= BIT(i+12);\n\t\t\t}\n\t\t}\n\t}\n#endif //CONFIG_80211N_HT\n\tDBG_871X(\"supp_mcs_set = %02x, %02x, %02x, rf_type=%d, tx_ra_bitmap=%016llx\\n\"\n\t, psta->htpriv.ht_cap.supp_mcs_set[0], psta->htpriv.ht_cap.supp_mcs_set[1], psta->htpriv.ht_cap.supp_mcs_set[2], rf_type, tx_ra_bitmap);\n\tpsta->ra_mask = tx_ra_bitmap;\n\tpsta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;\n}\n\n#ifndef SEC_CAM_ACCESS_TIMEOUT_MS\n\t#define SEC_CAM_ACCESS_TIMEOUT_MS 200\n#endif\n\n#ifndef DBG_SEC_CAM_ACCESS\n\t#define DBG_SEC_CAM_ACCESS 0\n#endif\n\nu32 rtw_sec_read_cam(_adapter *adapter, u8 addr)\n{\n\t_mutex *mutex = &adapter_to_dvobj(adapter)->cam_ctl.sec_cam_access_mutex;\n\tu32 rdata;\n\tu32 cnt = 0;\n\tu32 start = 0, end = 0;\n\tu8 timeout = 0;\n\tu8 sr = 0;\n\n\t_enter_critical_mutex(mutex, NULL);\n\n\trtw_write32(adapter, REG_CAMCMD, CAM_POLLINIG | addr);\n\n\tstart = rtw_get_current_time();\n\twhile (1) {\n\t\tif (rtw_is_surprise_removed(adapter)) {\n\t\t\tsr = 1;\n\t\t\tbreak;\n\t\t}\n\n\t\tcnt++;\n\t\tif (0 == (rtw_read32(adapter, REG_CAMCMD) & CAM_POLLINIG))\n\t\t\tbreak;\n\n\t\tif (rtw_get_passing_time_ms(start) > SEC_CAM_ACCESS_TIMEOUT_MS) {\n\t\t\ttimeout = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tend = rtw_get_current_time();\n\n\trdata = rtw_read32(adapter, REG_CAMREAD);\n\n\t_exit_critical_mutex(mutex, NULL);\n\n\tif (DBG_SEC_CAM_ACCESS || timeout) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" addr:0x%02x, rdata:0x%08x, to:%u, polling:%u, %d ms\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), addr, rdata, timeout, cnt, rtw_get_time_interval_ms(start, end));\n\t}\n\n\treturn rdata;\n}\n\nvoid rtw_sec_write_cam(_adapter *adapter, u8 addr, u32 wdata)\n{\n\t_mutex *mutex = &adapter_to_dvobj(adapter)->cam_ctl.sec_cam_access_mutex;\n\tu32 cnt = 0;\n\tu32 start = 0, end = 0;\n\tu8 timeout = 0;\n\tu8 sr = 0;\n\n\t_enter_critical_mutex(mutex, NULL);\n\n\trtw_write32(adapter, REG_CAMWRITE, wdata);\n\trtw_write32(adapter, REG_CAMCMD, CAM_POLLINIG | CAM_WRITE | addr);\n\n\tstart = rtw_get_current_time();\n\twhile (1) {\n\t\tif (rtw_is_surprise_removed(adapter)) {\n\t\t\tsr = 1;\n\t\t\tbreak;\n\t\t}\n\n\t\tcnt++;\n\t\tif (0 == (rtw_read32(adapter, REG_CAMCMD) & CAM_POLLINIG))\n\t\t\tbreak;\n\n\t\tif (rtw_get_passing_time_ms(start) > SEC_CAM_ACCESS_TIMEOUT_MS) {\n\t\t\ttimeout = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tend = rtw_get_current_time();\n\n\t_exit_critical_mutex(mutex, NULL);\n\n\tif (DBG_SEC_CAM_ACCESS || timeout) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" addr:0x%02x, wdata:0x%08x, to:%u, polling:%u, %d ms\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), addr, wdata, timeout, cnt, rtw_get_time_interval_ms(start, end));\n\t}\n}\n\nvoid rtw_sec_read_cam_ent(_adapter *adapter, u8 id, u8 *ctrl, u8 *mac, u8 *key)\n{\n\tunsigned int val, addr;\n\tu8 i;\n\tu32 rdata;\n\tu8 begin = 0;\n\tu8 end = 5; /* TODO: consider other key length accordingly */\n\n\tif (!ctrl && !mac && !key) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\t/* TODO: check id range */\n\n\tif (!ctrl && !mac)\n\t\tbegin = 2; /* read from key */\n\n\tif (!key && !mac)\n\t\tend = 0; /* read to ctrl */\n\telse if (!key)\n\t\tend = 2; /* read to mac */\n\n\tfor (i = begin; i <= end; i++) {\n\t\trdata = rtw_sec_read_cam(adapter, (id << 3) | i);\n\n\t\tswitch (i) {\n\t\tcase 0:\n\t\t\tif (ctrl)\n\t\t\t\t_rtw_memcpy(ctrl, (u8 *)(&rdata), 2);\n\t\t\tif (mac)\n\t\t\t\t_rtw_memcpy(mac, ((u8 *)(&rdata)) + 2, 2);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tif (mac)\n\t\t\t\t_rtw_memcpy(mac + 2, (u8 *)(&rdata), 4);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif (key)\n\t\t\t\t_rtw_memcpy(key + (i - 2) * 4, (u8 *)(&rdata), 4);\n\t\t\tbreak;\n\t\t}\n\t}\n\nexit:\n\treturn;\n}\n\n\nvoid rtw_sec_write_cam_ent(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)\n{\n\tunsigned int i;\n\tint j;\n\tu8 addr;\n\tu32 wdata;\n\n\t/* TODO: consider other key length accordingly */\n#if 0\n\tswitch ((ctrl & 0x1c) >> 2) {\n\tcase _WEP40_:\n\tcase _TKIP_\n\tcase _AES_\n\tcase _WEP104_\n\n\t}\n#else\n\tj = 5;\n#endif\n\n\tfor (; j >= 0; j--) {\n\t\tswitch (j) {\n\t\tcase 0:\n\t\t\twdata = (ctrl | (mac[0] << 16) | (mac[1] << 24));\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\twdata = (mac[2] | (mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ti = (j - 2) << 2;\n\t\t\twdata = (key[i] | (key[i + 1] << 8) | (key[i + 2] << 16) | (key[i + 3] << 24));\n\t\t\tbreak;\n\t\t}\n\n\t\taddr = (id << 3) + j;\n\n\t\trtw_sec_write_cam(adapter, addr, wdata);\n\t}\n}\n\nbool rtw_sec_read_cam_is_gk(_adapter *adapter, u8 id)\n{\n\tbool res;\n\tu16 ctrl;\n\n\trtw_sec_read_cam_ent(adapter, id, (u8 *)&ctrl, NULL, NULL);\n\n\tres = (ctrl & BIT6) ? _TRUE : _FALSE;\n\treturn res;\n}\n\nvoid hw_var_port_switch(_adapter *adapter)\n{\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_RUNTIME_PORT_SWITCH\n/*\n0x102: MSR\n0x550: REG_BCN_CTRL\n0x551: REG_BCN_CTRL_1\n0x55A: REG_ATIMWND\n0x560: REG_TSFTR\n0x568: REG_TSFTR1\n0x570: REG_ATIMWND_1\n0x610: REG_MACID\n0x618: REG_BSSID\n0x700: REG_MACID1\n0x708: REG_BSSID1\n*/\n\n\tint i;\n\tu8 msr;\n\tu8 bcn_ctrl;\n\tu8 bcn_ctrl_1;\n\tu8 atimwnd[2];\n\tu8 atimwnd_1[2];\n\tu8 tsftr[8];\n\tu8 tsftr_1[8];\n\tu8 macid[6];\n\tu8 bssid[6];\n\tu8 macid_1[6];\n\tu8 bssid_1[6];\n\n\tu8 iface_type;\n\n\tmsr = rtw_read8(adapter, MSR);\n\tbcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);\n\tbcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);\n\n\tfor (i=0; i<2; i++)\n\t\tatimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);\n\tfor (i=0; i<2; i++)\n\t\tatimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);\n\n\tfor (i=0; i<8; i++)\n\t\ttsftr[i] = rtw_read8(adapter, REG_TSFTR+i);\n\tfor (i=0; i<8; i++)\n\t\ttsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);\n\n\tfor (i=0; i<6; i++)\n\t\tmacid[i] = rtw_read8(adapter, REG_MACID+i);\n\n\tfor (i=0; i<6; i++)\n\t\tbssid[i] = rtw_read8(adapter, REG_BSSID+i);\n\n\tfor (i=0; i<6; i++)\n\t\tmacid_1[i] = rtw_read8(adapter, REG_MACID1+i);\n\n\tfor (i=0; i<6; i++)\n\t\tbssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);\n\n#ifdef DBG_RUNTIME_PORT_SWITCH\n\tDBG_871X(FUNC_ADPT_FMT\" before switch\\n\"\n\t\t\"msr:0x%02x\\n\"\n\t\t\"bcn_ctrl:0x%02x\\n\"\n\t\t\"bcn_ctrl_1:0x%02x\\n\"\n\t\t\"atimwnd:0x%04x\\n\"\n\t\t\"atimwnd_1:0x%04x\\n\"\n\t\t\"tsftr:%llu\\n\"\n\t\t\"tsftr1:%llu\\n\"\n\t\t\"macid:\"MAC_FMT\"\\n\"\n\t\t\"bssid:\"MAC_FMT\"\\n\"\n\t\t\"macid_1:\"MAC_FMT\"\\n\"\n\t\t\"bssid_1:\"MAC_FMT\"\\n\"\n\t\t, FUNC_ADPT_ARG(adapter)\n\t\t, msr\n\t\t, bcn_ctrl\n\t\t, bcn_ctrl_1\n\t\t, *((u16*)atimwnd)\n\t\t, *((u16*)atimwnd_1)\n\t\t, *((u64*)tsftr)\n\t\t, *((u64*)tsftr_1)\n\t\t, MAC_ARG(macid)\n\t\t, MAC_ARG(bssid)\n\t\t, MAC_ARG(macid_1)\n\t\t, MAC_ARG(bssid_1)\n\t);\n#endif /* DBG_RUNTIME_PORT_SWITCH */\n\n\t/* disable bcn function, disable update TSF  */\n\trtw_write8(adapter, REG_BCN_CTRL, (bcn_ctrl & (~EN_BCN_FUNCTION)) | DIS_TSF_UDT);\n\trtw_write8(adapter, REG_BCN_CTRL_1, (bcn_ctrl_1 & (~EN_BCN_FUNCTION)) | DIS_TSF_UDT);\n\n\t/* switch msr */\n\tmsr = (msr&0xf0) |((msr&0x03) << 2) | ((msr&0x0c) >> 2);\n\trtw_write8(adapter, MSR, msr);\n\n\t/* write port0 */\n\trtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1 & ~EN_BCN_FUNCTION);\n\tfor (i=0; i<2; i++)\n\t\trtw_write8(adapter, REG_ATIMWND+i, atimwnd_1[i]);\n\tfor (i=0; i<8; i++)\n\t\trtw_write8(adapter, REG_TSFTR+i, tsftr_1[i]);\n\tfor (i=0; i<6; i++)\n\t\trtw_write8(adapter, REG_MACID+i, macid_1[i]);\n\tfor (i=0; i<6; i++)\n\t\trtw_write8(adapter, REG_BSSID+i, bssid_1[i]);\n\n\t/* write port1 */\n\trtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl & ~EN_BCN_FUNCTION);\n\tfor (i=0; i<2; i++)\n\t\trtw_write8(adapter, REG_ATIMWND_1+1, atimwnd[i]);\n\tfor (i=0; i<8; i++)\n\t\trtw_write8(adapter, REG_TSFTR1+i, tsftr[i]);\n\tfor (i=0; i<6; i++)\n\t\trtw_write8(adapter, REG_MACID1+i, macid[i]);\n\tfor (i=0; i<6; i++)\n\t\trtw_write8(adapter, REG_BSSID1+i, bssid[i]);\n\n\t/* write bcn ctl */\n#ifdef CONFIG_BT_COEXIST\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B)\n\t// always enable port0 beacon function for PSTDMA\n\tbcn_ctrl_1 |= EN_BCN_FUNCTION;\n\t// always disable port1 beacon function for PSTDMA\n\tbcn_ctrl &= ~EN_BCN_FUNCTION;\n#endif\n#endif\n\trtw_write8(adapter, REG_BCN_CTRL, bcn_ctrl_1);\n\trtw_write8(adapter, REG_BCN_CTRL_1, bcn_ctrl);\n\n\tif (adapter->iface_type == IFACE_PORT0) {\n\t\tadapter->iface_type = IFACE_PORT1;\n\t\tadapter->pbuddy_adapter->iface_type = IFACE_PORT0;\n\t\tDBG_871X_LEVEL(_drv_always_, \"port switch - port0(\"ADPT_FMT\"), port1(\"ADPT_FMT\")\\n\",\n\t\t\tADPT_ARG(adapter->pbuddy_adapter), ADPT_ARG(adapter));\n\t} else {\n\t\tadapter->iface_type = IFACE_PORT0;\n\t\tadapter->pbuddy_adapter->iface_type = IFACE_PORT1;\n\t\tDBG_871X_LEVEL(_drv_always_, \"port switch - port0(\"ADPT_FMT\"), port1(\"ADPT_FMT\")\\n\",\n\t\t\tADPT_ARG(adapter), ADPT_ARG(adapter->pbuddy_adapter));\n\t}\n\n#ifdef DBG_RUNTIME_PORT_SWITCH\n\tmsr = rtw_read8(adapter, MSR);\n\tbcn_ctrl = rtw_read8(adapter, REG_BCN_CTRL);\n\tbcn_ctrl_1 = rtw_read8(adapter, REG_BCN_CTRL_1);\n\n\tfor (i=0; i<2; i++)\n\t\tatimwnd[i] = rtw_read8(adapter, REG_ATIMWND+i);\n\tfor (i=0; i<2; i++)\n\t\tatimwnd_1[i] = rtw_read8(adapter, REG_ATIMWND_1+i);\n\n\tfor (i=0; i<8; i++)\n\t\ttsftr[i] = rtw_read8(adapter, REG_TSFTR+i);\n\tfor (i=0; i<8; i++)\n\t\ttsftr_1[i] = rtw_read8(adapter, REG_TSFTR1+i);\n\n\tfor (i=0; i<6; i++)\n\t\tmacid[i] = rtw_read8(adapter, REG_MACID+i);\n\n\tfor (i=0; i<6; i++)\n\t\tbssid[i] = rtw_read8(adapter, REG_BSSID+i);\n\n\tfor (i=0; i<6; i++)\n\t\tmacid_1[i] = rtw_read8(adapter, REG_MACID1+i);\n\n\tfor (i=0; i<6; i++)\n\t\tbssid_1[i] = rtw_read8(adapter, REG_BSSID1+i);\n\n\tDBG_871X(FUNC_ADPT_FMT\" after switch\\n\"\n\t\t\"msr:0x%02x\\n\"\n\t\t\"bcn_ctrl:0x%02x\\n\"\n\t\t\"bcn_ctrl_1:0x%02x\\n\"\n\t\t\"atimwnd:%u\\n\"\n\t\t\"atimwnd_1:%u\\n\"\n\t\t\"tsftr:%llu\\n\"\n\t\t\"tsftr1:%llu\\n\"\n\t\t\"macid:\"MAC_FMT\"\\n\"\n\t\t\"bssid:\"MAC_FMT\"\\n\"\n\t\t\"macid_1:\"MAC_FMT\"\\n\"\n\t\t\"bssid_1:\"MAC_FMT\"\\n\"\n\t\t, FUNC_ADPT_ARG(adapter)\n\t\t, msr\n\t\t, bcn_ctrl\n\t\t, bcn_ctrl_1\n\t\t, *((u16*)atimwnd)\n\t\t, *((u16*)atimwnd_1)\n\t\t, *((u64*)tsftr)\n\t\t, *((u64*)tsftr_1)\n\t\t, MAC_ARG(macid)\n\t\t, MAC_ARG(bssid)\n\t\t, MAC_ARG(macid_1)\n\t\t, MAC_ARG(bssid_1)\n\t);\n#endif /* DBG_RUNTIME_PORT_SWITCH */\n\n#endif /* CONFIG_RUNTIME_PORT_SWITCH */\n#endif /* CONFIG_CONCURRENT_MODE */\n}\n\nvoid rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\n{\n\tstruct\thal_ops *pHalFunc = &padapter->HalFunc;\n\tu8\tu1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};\n\tu8\tret = 0;\n\n\tDBG_871X(\"RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\\n\",\n\t\trsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,\n\t\trsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,\n\t\trsvdpageloc->LocBTQosNull);\n\n\tSET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);\n\tSET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);\n\tSET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);\n\tSET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);\n\tSET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);\n\n\tret = rtw_hal_fill_h2c_cmd(padapter,\n\t\t\t\tH2C_RSVD_PAGE,\n\t\t\t\tH2C_RSVDPAGE_LOC_LEN,\n\t\t\t\tu1H2CRsvdPageParm);\n\n}\n\n#ifdef CONFIG_GPIO_WAKEUP\n/*\n * Switch GPIO_13, GPIO_14 to wlan control, or pull GPIO_13,14 MUST fail.\n * It happended at 8723B/8192E/8821A. New IC will check multi function GPIO,\n * and implement HAL function.\n */\nstatic void rtw_hal_switch_gpio_wl_ctrl(_adapter* padapter, u8 index, u8 enable)\n{\n\tif (index !=13 && index != 14) return;\n\n\trtw_hal_set_hwreg(padapter, HW_SET_GPIO_WL_CTRL, (u8 *)(&enable));\n}\n\nvoid rtw_hal_set_output_gpio(_adapter *padapter, u8 index, u8 outputval)\n{\n\tif ( index <= 7 ) {\n\t\t/* config GPIO mode */\n\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL + 3,\n\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL + 3) & ~BIT(index) );\n\n\t\t/* config GPIO Sel */\n\t\t/* 0: input */\n\t\t/* 1: output */\n\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL + 2,\n\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL + 2) | BIT(index));\n\n\t\t/* set output value */\n\t\tif ( outputval ) {\n\t\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,\n\t\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) | BIT(index));\n\t\t} else {\n\t\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL + 1,\n\t\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(index));\n\t\t}\n\t} else if (index <= 15){\n\t\t/* 88C Series: */\n\t\t/* index: 11~8 transform to 3~0 */\n\t\t/* 8723 Series: */\n\t\t/* index: 12~8 transform to 4~0 */\n\n\t\tindex -= 8;\n\n\t\t/* config GPIO mode */\n\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 3,\n\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 3) & ~BIT(index) );\n\n\t\t/* config GPIO Sel */\n\t\t/* 0: input */\n\t\t/* 1: output */\n\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 2,\n\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 2) | BIT(index));\n\n\t\t/* set output value */\n\t\tif ( outputval ) {\n\t\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,\n\t\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) | BIT(index));\n\t\t} else {\n\t\t\trtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1,\n\t\t\t\t\trtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) & ~BIT(index));\n\t\t}\n\t} else {\n\t\tDBG_871X(\"%s: invalid GPIO%d=%d\\n\",\n\t\t\t\t__FUNCTION__, index, outputval);\n\t}\n}\n#endif\n\nvoid rtw_hal_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\n{\n\tstruct\thal_ops *pHalFunc = &padapter->HalFunc;\n\tstruct\tpwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tu8\tres = 0, count = 0, ret = 0;\n#ifdef CONFIG_WOWLAN\t\n\tu8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};\n\n\tDBG_871X(\"AOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\\n\",\n\t\t\trsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,\n\t\t\trsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,\n\t\t\trsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,\n\t\t\trsvdpageloc->LocNetList);\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED)) {\n\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);\n\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);\n\t\t//SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);\n\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);\n\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);\n#ifdef CONFIG_GTK_OL\n\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);\n#endif // CONFIG_GTK_OL\n\t\tret = rtw_hal_fill_h2c_cmd(padapter,\n\t\t\t\t\tH2C_AOAC_RSVD_PAGE,\n\t\t\t\t\tH2C_AOAC_RSVDPAGE_LOC_LEN,\n\t\t\t\t\tu1H2CAoacRsvdPageParm);\n\t}\n#ifdef CONFIG_PNO_SUPPORT\n\telse\n\t{\n\n\t\tif(!pwrpriv->pno_in_resume) {\n\t\t\tDBG_871X(\"NLO_INFO=%d\\n\", rsvdpageloc->LocPNOInfo);\n\t\t\t_rtw_memset(&u1H2CAoacRsvdPageParm, 0,\n\t\t\t\t\tsizeof(u1H2CAoacRsvdPageParm));\n\t\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm,\n\t\t\t\t\trsvdpageloc->LocPNOInfo);\n\t\t\tret = rtw_hal_fill_h2c_cmd(padapter,\n\t\t\t\t\t\tH2C_AOAC_RSVDPAGE3,\n\t\t\t\t\t\tH2C_AOAC_RSVDPAGE_LOC_LEN,\n\t\t\t\t\t\tu1H2CAoacRsvdPageParm);\n\t\t}\n\t}\n#endif //CONFIG_PNO_SUPPORT\n#endif // CONFIG_WOWLAN\n}\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nstatic void rtw_hal_force_enable_rxdma(_adapter *adapter)\n{\n\tDBG_871X(\"%s: Set 0x690=0x00\\n\", __func__);\n\trtw_write8(adapter, REG_WOW_CTRL,\n\t\t\t(rtw_read8(adapter, REG_WOW_CTRL)&0xf0));\n\tDBG_871X_LEVEL(_drv_always_, \"%s: Release RXDMA\\n\", __func__);\n\trtw_write32(adapter, REG_RXPKT_NUM,\n\t\t\t(rtw_read32(adapter,REG_RXPKT_NUM)&(~RW_RELEASE_EN)));\n}\n\nstatic void rtw_hal_disable_tx_report(_adapter *adapter)\n{\n\trtw_write8(adapter, REG_TX_RPT_CTRL,\n\t\t\t((rtw_read8(adapter, REG_TX_RPT_CTRL)&~BIT(1)))&~BIT(5));\n\tDBG_871X(\"disable TXRPT:0x%02x\\n\", rtw_read8(adapter, REG_TX_RPT_CTRL));\n}\n\nstatic void rtw_hal_enable_tx_report(_adapter *adapter)\n{\n\trtw_write8(adapter, REG_TX_RPT_CTRL,\n\t\t\t((rtw_read8(adapter, REG_TX_RPT_CTRL)|BIT(1)))|BIT(5));\n\tDBG_871X(\"enable TX_RPT:0x%02x\\n\", rtw_read8(adapter, REG_TX_RPT_CTRL));\n}\n\nstatic void rtw_hal_release_rx_dma(_adapter *adapter)\n{\n\tu32 val32 = 0;\n\n\tval32 = rtw_read32(adapter, REG_RXPKT_NUM);\n\n\trtw_write32(adapter, REG_RXPKT_NUM, (val32 & (~RW_RELEASE_EN)));\n\n\tDBG_871X(\"%s, [0x%04x]: 0x%08x\\n\",\n\t\t __func__, REG_RXPKT_NUM, (val32 & (~RW_RELEASE_EN)));\n}\n\nstatic u8 rtw_hal_pause_rx_dma(_adapter *adapter)\n{\n\tu8 ret = 0;\n\ts8 trycnt = 100;\n\tu16 len = 0;\n\tu32 tmp = 0;\n\tint res = 0;\n\t//RX DMA stop\n\tDBG_871X_LEVEL(_drv_always_, \"Pause DMA\\n\");\n\trtw_write32(adapter, REG_RXPKT_NUM,\n\t\t\t(rtw_read32(adapter,REG_RXPKT_NUM)|RW_RELEASE_EN));\n\tdo{\n\t\tif((rtw_read32(adapter, REG_RXPKT_NUM)&RXDMA_IDLE)) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"RX_DMA_IDLE is true\\n\");\n\t\t\tret = _SUCCESS;\n\t\t\tbreak;\n\t\t}\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\telse {\n\t\t\t// If RX_DMA is not idle, receive one pkt from DMA\n\t\t\tres = sdio_local_read(adapter,\n\t\t\t\t\tSDIO_REG_RX0_REQ_LEN, 4, (u8*)&tmp);\n\t\t\tlen = le16_to_cpu(tmp);\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"RX len:%d\\n\", len);\n\n\t\t\tif (len > 0)\n\t\t\t\tres = RecvOnePkt(adapter, len);\n\t\t\telse\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"read length fail %d\\n\", len);\n\n\t\t\tDBG_871X_LEVEL(_drv_always_,\n\t\t\t\t       \"RecvOnePkt Result: %d\\n\", res);\n\t\t}\n#endif //CONFIG_SDIO_HCI || CONFIG_GSPI_HCI\n#ifdef CONFIG_USB_HCI\n\t\telse {\n\t\t\tif (adapter->intf_start)\n\t\t\t\tadapter->intf_start(adapter);\n\t\t\ttmp = rtw_read32(adapter, REG_RXPKT_NUM) & RXDMA_IDLE;\n\t\t\tif (tmp) {\n\t\t\t\tif (adapter->intf_stop)\n\t\t\t\t\tadapter->intf_stop(adapter);\n\t\t\t\tRTW_ENABLE_FUNC(adapter, DF_RX_BIT);\n\t\t\t\tRTW_ENABLE_FUNC(adapter, DF_TX_BIT);\n\t\t\t}\n\t\t}\n#endif\n\t}while(trycnt--);\n\n\tif (trycnt < 0) {\n\t\ttmp = rtw_read16(adapter, REG_RXPKT_NUM + 3);\n\n\t\tDBG_871X_LEVEL(_drv_always_, \"Stop RX DMA failed......\\n\");\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s, RXPKT_NUM: 0x%04x\\n\",\n\t\t\t\t__func__, tmp);\n\t\ttmp = rtw_read16(adapter, REG_RXPKT_NUM + 2);\n\t\tif (tmp & BIT(3))\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s, RX DMA has req\\n\",\n\t\t\t\t       __func__);\n\t\telse\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s, RX DMA no req\\n\",\n\t\t\t\t       __func__);\n\t\tret = _FAIL;\n\t}\n\n\treturn ret;\n}\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\nstatic u8 rtw_hal_enable_cpwm2(_adapter* adapter)\n{\n\tu8 ret = 0;\n\tint res = 0;\n\tu32 tmp = 0;\n\n\tDBG_871X_LEVEL(_drv_always_, \"%s\\n\", __func__);\n\n\tres = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);\n\tif (!res)\n\t\tDBG_871X_LEVEL(_drv_info_, \"read SDIO_REG_HIMR: 0x%08x\\n\", tmp);\n\telse\n\t\tDBG_871X_LEVEL(_drv_info_, \"sdio_local_read fail\\n\");\n\n\ttmp = SDIO_HIMR_CPWM2_MSK;\n\n\tres = sdio_local_write(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);\n\n\tif (!res){\n\t\tres = sdio_local_read(adapter, SDIO_REG_HIMR, 4, (u8*)&tmp);\n\t\tDBG_871X_LEVEL(_drv_info_, \"read again SDIO_REG_HIMR: 0x%08x\\n\", tmp);\n\t\tret = _SUCCESS;\n\t}else {\n\t\tDBG_871X_LEVEL(_drv_info_, \"sdio_local_write fail\\n\");\n\t\tret = _FAIL;\n\t}\n\n\treturn ret;\n}\n#endif /* CONFIG_SDIO_HCI, CONFIG_GSPI_HCI */\n#endif /* CONFIG_WOWLAN || CONFIG_AP_WOWLAN */\n\n#ifdef CONFIG_WOWLAN\n/* \n * rtw_hal_check_wow_ctrl\n * chk_type: _TRUE means to check enable, if 0x690 & bit1, WOW enable successful\n *\t\t     _FALSE means to check disable, if 0x690 & bit1, WOW disable fail\n */\nstatic u8 rtw_hal_check_wow_ctrl(_adapter *adapter, u8 chk_type)\n{\n\tu8 mstatus = 0;\n\tu8 trycnt = 25;\n\tu8 res = _FALSE;\n\n\tmstatus = rtw_read8(adapter, REG_WOW_CTRL);\n\tDBG_871X_LEVEL(_drv_info_, \"%s mstatus:0x%02x\\n\", __func__, mstatus);\n\n\tif (chk_type) {\n\t\twhile (!(mstatus&BIT1) && trycnt > 1) {\n\t\t\tmstatus = rtw_read8(adapter, REG_WOW_CTRL);\n\t\t\tDBG_871X_LEVEL(_drv_always_,\n\t\t\t\t\t\"Loop index: %d :0x%02x\\n\",\n\t\t\t\t\ttrycnt, mstatus);\n\t\t\ttrycnt--;\n\t\t\trtw_msleep_os(20);\n\t\t}\n\t\tif (mstatus & BIT1)\n\t\t\tres = _TRUE;\n\t\telse\n\t\t\tres = _FALSE;\n\t} else {\n\t\twhile (mstatus&BIT1 && trycnt > 1) {\n\t\t\tmstatus = rtw_read8(adapter, REG_WOW_CTRL);\n\t\t\tDBG_871X_LEVEL(_drv_always_,\n\t\t\t\t\t\"Loop index: %d :0x%02x\\n\",\n\t\t\t\t\ttrycnt, mstatus);\n\t\t\ttrycnt--;\n\t\t\trtw_msleep_os(20);\n\t\t}\n\n\t\tif (mstatus & BIT1)\n\t\t\tres = _FALSE;\n\t\telse\n\t\t\tres = _TRUE;\n\t}\n\tDBG_871X_LEVEL(_drv_always_, \"%s check_type: %d res: %d trycnt: %d\\n\",\n\t\t\t__func__, chk_type, res, (25 - trycnt));\n\treturn res;\n}\n\n#ifdef CONFIG_PNO_SUPPORT\nstatic u8 rtw_hal_check_pno_enabled(_adapter *adapter)\n{\n\tstruct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);\n\tu8 res = 0, count = 0;\n\tu8 ret = _FALSE;\n\t\n\tif (ppwrpriv->wowlan_pno_enable && ppwrpriv->pno_in_resume == _FALSE) {\n\t\tres = rtw_read8(adapter, REG_PNO_STATUS);\n\t\twhile (!(res&BIT(7)) && count < 25) {\n\t\t\tDBG_871X(\"[%d] cmd: 0x81 REG_PNO_STATUS: 0x%02x\\n\",\n\t\t\t\t\tcount, res);\n\t\t\tres = rtw_read8(adapter, REG_PNO_STATUS);\n\t\t\tcount++;\n\t\t\trtw_msleep_os(2);\n\t\t}\n\t\tif (res & BIT(7))\n\t\t\tret = _TRUE;\n\t\telse\n\t\t\tret = _FALSE;\n\t\tDBG_871X(\"cmd: 0x81 REG_PNO_STATUS: ret(%d)\\n\", ret);\n\t}\n\treturn ret;\n}\n#endif\n\nstatic void rtw_hal_backup_rate(_adapter *adapter)\n{\n\tDBG_871X(\"%s\\n\", __func__);\n\t/* backup data rate to register 0x8b for wowlan FW */\n\trtw_write8(adapter, 0x8d, 1);\n\trtw_write8(adapter, 0x8c, 0);\n\trtw_write8(adapter, 0x8f, 0x40);\n\trtw_write8(adapter, 0x8b, rtw_read8(adapter, 0x2f0));\n}\n\n#ifdef CONFIG_GTK_OL\nstatic void rtw_hal_fw_sync_cam_id(_adapter *adapter)\n{\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tu8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\tint cam_id;\n\tu32 algorithm = 0;\n\tu16 ctrl = 0;\n\tu8 *addr;\n\tu8 index = 0;\n\tu8 get_key[16];\n\n\taddr = get_bssid(&adapter->mlmepriv);\n\n\tif (addr == NULL) {\n\t\tDBG_871X(\"%s: get bssid MAC addr fail!!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tdo{\n\t\tcam_id = rtw_camid_search(adapter, addr, index, -1);\n\t\tif (cam_id == -1) {\n\t\t\tDBG_871X(\"%s: cam_id: %d, key_id:%d\\n\",\n\t\t\t\t\t__func__, cam_id, index);\n\t\t} else if (rtw_camid_is_gk(adapter, cam_id) != _TRUE) {\n\t\t\tDBG_871X(\"%s: cam_id: %d key_id(%d) is not GK\\n\",\n\t\t\t\t\t__func__, cam_id, index);\n\t\t} else {\n\t\t\trtw_sec_read_cam_ent(adapter, cam_id, NULL, NULL, get_key);\n\t\t\talgorithm = psecuritypriv->dot11PrivacyAlgrthm;\n\t\t\tctrl = BIT(15) | BIT6 |(algorithm << 2) | index;\n\t\t\twrite_cam(adapter, index, ctrl, addr, get_key);\n\t\t\tctrl = 0;\n\t\t\twrite_cam(adapter, cam_id, ctrl, null_addr, get_key);\n\t\t}\n\t\tindex++;\n\t}while(index < 4);\n\n\trtw_write8(adapter, REG_SECCFG, 0xcc);\n}\n\nstatic void rtw_hal_update_gtk_offload_info(_adapter *adapter)\n{\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tu8 default_cam_id = 0;\n\tu8 cam_id=5;\n\tu8 *addr;\n\tu8 null_addr[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};\n\tu8 gtk_keyindex=0;\n\tu8 get_key[16];\n\tu8 index = 1;\n\tu16 ctrl = 0;\n\tu32 algorithm = 0;\n\n\taddr = get_bssid(&adapter->mlmepriv);\n\n\tif (addr == NULL) {\n\t\tDBG_871X(\"%s: get bssid MAC addr fail!!\\n\", __func__);\n\t\treturn;\n\t}\n\n\t_rtw_memset(get_key, 0, sizeof(get_key));\n\n\talgorithm = psecuritypriv->dot11PrivacyAlgrthm;\n\n\tif(psecuritypriv->binstallKCK_KEK == _TRUE) {\n\n\t\t//read gtk key index\n\t\tgtk_keyindex = rtw_read8(adapter, 0x48c);\n\t\tdo{\n\t\t\t/* chech if GK */\n\t\t\tif (rtw_sec_read_cam_is_gk(adapter, default_cam_id) == _TRUE) {\n\t\t\t\trtw_sec_read_cam_ent(adapter, default_cam_id, NULL, NULL, get_key);\n\t\t\t\talgorithm = psecuritypriv->dot11PrivacyAlgrthm;\n\t\t\t\t/* in default cam entry, cam id = key id */\n\t\t\t\tctrl = BIT(15) | BIT6 | (algorithm << 2) | default_cam_id;\n\t\t\t\twrite_cam(adapter, cam_id, ctrl, addr, get_key);\n\t\t\t\tcam_id++;\n\t\t\t\tctrl = 0;\n\t\t\t\twrite_cam(adapter, default_cam_id, ctrl, null_addr, get_key);\n\t\t\t}\n\n\t\t\tif (gtk_keyindex < 4 && (default_cam_id == gtk_keyindex)) {\n\t\t\t\tpsecuritypriv->dot118021XGrpKeyid = gtk_keyindex;\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey,\n\t\t\t\t\t\tget_key, 16);\n\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"GTK (%d) = 0x%08x, 0x%08x, 0x%08x, 0x%08x\\n\",\n\t\t\t\t\t\tgtk_keyindex,\n\t\t\t\tpsecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[0], \n\t\t\t\tpsecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[1],\n\t\t\t\tpsecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[2],\n\t\t\t\tpsecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].lkey[3]);\n\t\t\t}\n\t\t\tdefault_cam_id++;\n\t\t} while (default_cam_id < 4);\n\n\t\trtw_write8(adapter, REG_SECCFG, 0x0c);\n#ifdef CONFIG_GTK_OL_DBG\n\t\t//if (gtk_keyindex != 5)\n\t\tdump_sec_cam(RTW_DBGDUMP, adapter);\n#endif\n\t}\n}\n#endif\n\nstatic void rtw_hal_update_tx_iv(_adapter *adapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tu64 iv_low = 0, iv_high = 0;\n\n\t// 3.1 read fw iv\n\tiv_low = rtw_read32(adapter, REG_TXPKTBUF_IV_LOW);\n\t//only low two bytes is PN, check AES_IV macro for detail\n\tiv_low &= 0xffff;\n\tiv_high = rtw_read32(adapter, REG_TXPKTBUF_IV_HIGH);\n\t//get the real packet number\n\tpwrctl->wowlan_fw_iv = iv_high << 16 | iv_low;\n\tDBG_871X_LEVEL(_drv_always_,\n\t\t\t\"fw_iv: 0x%016llx\\n\", pwrctl->wowlan_fw_iv);\n\t//Update TX iv data.\n\trtw_set_sec_pn(adapter);\n}\n\nstatic u8 rtw_hal_set_keep_alive_cmd(_adapter *adapter, u8 enable, u8 pkt_type)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\n\tu8 u1H2CKeepAliveParm[H2C_KEEP_ALIVE_CTRL_LEN]={0};\n\tu8 adopt = 1, check_period = 5;\n\tu8 ret = _FAIL;\n\n\tDBG_871X(\"%s(): enable = %d\\n\", __func__, enable);\n\tSET_H2CCMD_KEEPALIVE_PARM_ENABLE(u1H2CKeepAliveParm, enable);\n\tSET_H2CCMD_KEEPALIVE_PARM_ADOPT(u1H2CKeepAliveParm, adopt);\n\tSET_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(u1H2CKeepAliveParm, pkt_type);\n\tSET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(u1H2CKeepAliveParm, check_period);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_KEEP_ALIVE,\n\t\t\t\tH2C_KEEP_ALIVE_CTRL_LEN,\n\t\t\t\tu1H2CKeepAliveParm);\n\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_disconnect_decision_cmd(_adapter *adapter, u8 enable)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 u1H2CDisconDecisionParm[H2C_DISCON_DECISION_LEN]={0};\n\tu8 adopt = 1, check_period = 10, trypkt_num = 0;\n\tu8 ret = _FAIL;\n\n\tDBG_871X(\"%s(): enable = %d\\n\", __func__, enable);\n\tSET_H2CCMD_DISCONDECISION_PARM_ENABLE(u1H2CDisconDecisionParm, enable);\n\tSET_H2CCMD_DISCONDECISION_PARM_ADOPT(u1H2CDisconDecisionParm, adopt);\n\tSET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(u1H2CDisconDecisionParm, check_period);\n\tSET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(u1H2CDisconDecisionParm, trypkt_num);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_DISCON_DECISION,\n\t\t\t\tH2C_DISCON_DECISION_LEN,\n\t\t\t\tu1H2CDisconDecisionParm);\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_wowlan_ctrl_cmd(_adapter *adapter, u8 enable, u8 change_unit)\n{\n\tstruct security_priv *psecpriv = &adapter->securitypriv;\n\tstruct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\n\tu8 u1H2CWoWlanCtrlParm[H2C_WOWLAN_LEN]={0};\n\tu8 discont_wake = 1, gpionum = 0, gpio_dur = 0;\n\tu8 hw_unicast = 0, gpio_pulse_cnt = 0, gpio_pulse_en = 0;\n\tu8 sdio_wakeup_enable = 1;\n\tu8 gpio_high_active = 0;\n\tu8 pattern_en = 0;\n\tu8 magic_pkt = 0;\n\tu8 gpio_unit = 0; /*0: 64ns, 1: 8ms*/\n\tu8 ret = _FAIL;\n\n#ifdef CONFIG_GPIO_WAKEUP\n\tgpio_high_active = ppwrpriv->is_high_active;\n\tgpionum = WAKEUP_GPIO_IDX;\n\tsdio_wakeup_enable = 0;\n#endif //CONFIG_GPIO_WAKEUP\n\n\tif (!ppwrpriv->wowlan_pno_enable)\n\t\tmagic_pkt = enable;\n\n\tif (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_)\n\t\thw_unicast = 1;\n\telse\n\t\thw_unicast = 0;\n\n\tif (ppwrpriv->wowlan_pattern) {\n\t\tif (enable)\n\t\t\tpattern_en = 1;\n\t\telse\n\t\t\tpattern_en = 0;\n\t}\n\n\tDBG_871X(\"%s(): enable=%d change_unit=%d\\n\", __func__,\n\t\t\tenable, change_unit);\n\n\t/* time = (gpio_dur/2) * gpio_unit, default:256 ms */\n\tif (enable && change_unit) {\n\t\tgpio_dur = 0x40;\n\t\tgpio_unit = 1;\n\t\tgpio_pulse_en = 1;\n\t}\n\n#ifdef CONFIG_PLATFORM_ARM_RK3188\n\tif (enable) {\n\t\tgpio_pulse_en = 1;\n\t\tgpio_pulse_cnt = 0x04;\n\t}\n#endif\n\n\tSET_H2CCMD_WOWLAN_FUNC_ENABLE(u1H2CWoWlanCtrlParm, enable);\n\tSET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(u1H2CWoWlanCtrlParm, pattern_en);\n\tSET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(u1H2CWoWlanCtrlParm, magic_pkt);\n\tSET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(u1H2CWoWlanCtrlParm, hw_unicast);\n\tSET_H2CCMD_WOWLAN_ALL_PKT_DROP(u1H2CWoWlanCtrlParm, 0);\n\tSET_H2CCMD_WOWLAN_GPIO_ACTIVE(u1H2CWoWlanCtrlParm, gpio_high_active);\n#ifndef CONFIG_GTK_OL\n\tSET_H2CCMD_WOWLAN_REKEY_WAKE_UP(u1H2CWoWlanCtrlParm, enable);\n#endif\n\tSET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(u1H2CWoWlanCtrlParm, discont_wake);\n\tSET_H2CCMD_WOWLAN_GPIONUM(u1H2CWoWlanCtrlParm, gpionum);\n\tSET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(u1H2CWoWlanCtrlParm, sdio_wakeup_enable);\n\n\tSET_H2CCMD_WOWLAN_GPIO_DURATION(u1H2CWoWlanCtrlParm, gpio_dur);\n\tSET_H2CCMD_WOWLAN_CHANGE_UNIT(u1H2CWoWlanCtrlParm, gpio_unit);\n\n\tSET_H2CCMD_WOWLAN_GPIO_PULSE_EN(u1H2CWoWlanCtrlParm, gpio_pulse_en);\n\tSET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(u1H2CWoWlanCtrlParm, gpio_pulse_cnt);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_WOWLAN,\n\t\t\t\tH2C_WOWLAN_LEN,\n\t\t\t\tu1H2CWoWlanCtrlParm);\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tstruct security_priv* psecuritypriv=&(adapter->securitypriv);\n\tstruct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);\n\tu8 u1H2CRemoteWakeCtrlParm[H2C_REMOTE_WAKE_CTRL_LEN]={0};\n\tu8 ret = _FAIL, count = 0;\n\n\tDBG_871X(\"%s(): enable=%d\\n\", __func__, enable);\n\n\tif (!ppwrpriv->wowlan_pno_enable) {\n\t\tSET_H2CCMD_REMOTE_WAKECTRL_ENABLE(\n\t\t\t\tu1H2CRemoteWakeCtrlParm, enable);\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(\n\t\t\t\tu1H2CRemoteWakeCtrlParm, 1);\n#ifdef CONFIG_GTK_OL\n\t\tif (psecuritypriv->binstallKCK_KEK == _TRUE &&\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm == _AES_) {\n\t\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(\n\t\t\t\t\tu1H2CRemoteWakeCtrlParm, 1);\n\t\t} else {\n\t\t\tDBG_871X(\"no kck or security is not AES\\n\");\n\t\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(\n\t\t\t\t\tu1H2CRemoteWakeCtrlParm, 0);\n\t\t}\n#endif //CONFIG_GTK_OL\n\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(\n\t\t\t\t\t\tu1H2CRemoteWakeCtrlParm,\n\t\t\t\t\t\t!ppwrpriv->wowlan_pattern);\n\n\t\t/*\n\t\t * filter NetBios name service pkt to avoid being waked-up\n\t\t * by this kind of unicast pkt this exceptional modification \n\t\t * is used for match competitor's behavior\n\t\t */\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_NBNS_FILTER_EN(\n\t\t\t\tu1H2CRemoteWakeCtrlParm, !ppwrpriv->wowlan_pattern);\n\t\t\n\t\tif ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) ||\n\t\t\t(psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_)) {\n\t\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(\n\t\t\t\t\tu1H2CRemoteWakeCtrlParm, 0);\n\t\t} else {\n\t\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(\n\t\t\t\t\tu1H2CRemoteWakeCtrlParm, 1);\n\t\t}\n\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_FW_PARSING_UNTIL_WAKEUP(\n\t\t\tu1H2CRemoteWakeCtrlParm, 1);\n\t}\n#ifdef CONFIG_PNO_SUPPORT\n\telse {\n\t\tSET_H2CCMD_REMOTE_WAKECTRL_ENABLE(\n\t\t\t\tu1H2CRemoteWakeCtrlParm, enable);\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(\n\t\t\t\tu1H2CRemoteWakeCtrlParm, enable);\n\t}\n#endif\n\n#ifdef CONFIG_P2P_WOWLAN\n\tif (_TRUE == ppwrpriv->wowlan_p2p_mode)\n\t{\n\t\tDBG_871X(\"P2P OFFLOAD ENABLE\\n\");\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,1);\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"P2P OFFLOAD DISABLE\\n\");\n\t\tSET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(u1H2CRemoteWakeCtrlParm,0);\n\t}\n#endif //CONFIG_P2P_WOWLAN\n\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_REMOTE_WAKE_CTRL,\n\t\t\t\tH2C_REMOTE_WAKE_CTRL_LEN,\n\t\t\t\tu1H2CRemoteWakeCtrlParm);\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_global_info_cmd(_adapter* adapter, u8 group_alg, u8 pairwise_alg)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 ret = _FAIL;\n\tu8 u1H2CAOACGlobalInfoParm[H2C_AOAC_GLOBAL_INFO_LEN]={0};\n\n\tDBG_871X(\"%s(): group_alg=%d pairwise_alg=%d\\n\",\n\t\t\t__func__, group_alg, pairwise_alg);\n\tSET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(u1H2CAOACGlobalInfoParm,\n\t\t\tpairwise_alg);\n\tSET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(u1H2CAOACGlobalInfoParm,\n\t\t\tgroup_alg);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_AOAC_GLOBAL_INFO,\n\t\t\t\tH2C_AOAC_GLOBAL_INFO_LEN,\n\t\t\t\tu1H2CAOACGlobalInfoParm);\n\n\treturn ret;\n}\n\n#ifdef CONFIG_PNO_SUPPORT\nstatic u8 rtw_hal_set_scan_offload_info_cmd(_adapter* adapter,\n\t\tPRSVDPAGE_LOC rsvdpageloc, u8 enable)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\n\tu8 u1H2CScanOffloadInfoParm[H2C_SCAN_OFFLOAD_CTRL_LEN]={0};\n\tu8 res = 0, count = 0, ret = _FAIL;\n\n\tDBG_871X(\"%s: loc_probe_packet:%d, loc_scan_info: %d loc_ssid_info:%d\\n\",\n\t\t__func__, rsvdpageloc->LocProbePacket,\n\t\trsvdpageloc->LocScanInfo, rsvdpageloc->LocSSIDInfo);\n\n\tSET_H2CCMD_AOAC_NLO_FUN_EN(u1H2CScanOffloadInfoParm, enable);\n\tSET_H2CCMD_AOAC_NLO_IPS_EN(u1H2CScanOffloadInfoParm, enable);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(u1H2CScanOffloadInfoParm,\n\t\t\trsvdpageloc->LocScanInfo);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(u1H2CScanOffloadInfoParm,\n\t\t\trsvdpageloc->LocProbePacket);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(u1H2CScanOffloadInfoParm,\n\t\t\trsvdpageloc->LocSSIDInfo);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_D0_SCAN_OFFLOAD_INFO,\n\t\t\t\tH2C_SCAN_OFFLOAD_CTRL_LEN,\n\t\t\t\tu1H2CScanOffloadInfoParm);\n\treturn ret;\n}\n#endif //CONFIG_PNO_SUPPORT\n\nvoid rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable)\n{\n\tstruct security_priv *psecpriv = &padapter->securitypriv;\n\tstruct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_info *psta = NULL;\n\tu16 media_status_rpt;\n\tu8\tpkt_type = 0;\n\tu8 ret = _SUCCESS;\n\n\tDBG_871X_LEVEL(_drv_always_, \"+%s()+: enable=%d\\n\", __func__, enable);\n_func_enter_;\n\n\trtw_hal_set_wowlan_ctrl_cmd(padapter, enable, _FALSE);\n\n\tif (enable) {\n\t\trtw_hal_set_global_info_cmd(padapter,\n\t\t\t\tpsecpriv->dot118021XGrpPrivacy,\n\t\t\t\tpsecpriv->dot11PrivacyAlgrthm);\n\n\t\tif (!(ppwrpriv->wowlan_pno_enable)) {\n\t\t\trtw_hal_set_disconnect_decision_cmd(padapter, enable);\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\t\t\tif ((psecpriv->dot11PrivacyAlgrthm == _WEP40_) ||\n\t\t\t\t(psecpriv->dot11PrivacyAlgrthm == _WEP104_))\n\t\t\t\tpkt_type = 0;\n\t\t\telse\n\t\t\t\tpkt_type = 1;\n#else\n\t\t\tpkt_type = 0;\n#endif //CONFIG_ARP_KEEP_ALIVE\n\t\t\trtw_hal_set_keep_alive_cmd(padapter, enable, pkt_type);\n\t\t}\n\t\trtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);\n#ifdef CONFIG_PNO_SUPPORT\n\t\trtw_hal_check_pno_enabled(padapter);\n#endif //CONFIG_PNO_SUPPORT\n\t} else {\n#if 0\n\t\t{\n\t\t\tu32 PageSize = 0;\n\t\t\trtw_hal_get_def_var(padapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);\n\t\t\tdump_TX_FIFO(padapter, 4, PageSize);\n\t\t}\n#endif\n\n\t\trtw_hal_set_remote_wake_ctrl_cmd(padapter, enable);\n\t}\n_func_exit_;\n\tDBG_871X_LEVEL(_drv_always_, \"-%s()-\\n\", __func__);\n}\n#endif //CONFIG_WOWLAN\n\n#ifdef CONFIG_AP_WOWLAN\nstatic u8 rtw_hal_set_ap_wowlan_ctrl_cmd(_adapter *adapter, u8 enable)\n{\n\tstruct security_priv *psecpriv = &adapter->securitypriv;\n\tstruct pwrctrl_priv *ppwrpriv = adapter_to_pwrctl(adapter);\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\n\tu8 u1H2CAPWoWlanCtrlParm[H2C_AP_WOW_GPIO_CTRL_LEN] = {0};\n\tu8 gpionum = 0, gpio_dur = 0;\n\tu8 gpio_pulse = enable;\n\tu8 sdio_wakeup_enable = 1;\n\tu8 gpio_high_active = 0;\n\tu8 ret = _FAIL;\n\n#ifdef CONFIG_GPIO_WAKEUP\n\tgpio_high_active = ppwrpriv->is_high_active;\n\tgpionum = WAKEUP_GPIO_IDX;\n\tsdio_wakeup_enable = 0;\n#endif /*CONFIG_GPIO_WAKEUP*/\n\n\tDBG_871X(\"%s(): enable=%d\\n\", __func__, enable);\n\n\tSET_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(u1H2CAPWoWlanCtrlParm,\n\t\t\tgpionum);\n\tSET_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(u1H2CAPWoWlanCtrlParm,\n\t\t\tgpio_pulse);\n\tSET_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(u1H2CAPWoWlanCtrlParm,\n\t\t\tgpio_high_active);\n\tSET_H2CCMD_AP_WOW_GPIO_CTRL_EN(u1H2CAPWoWlanCtrlParm,\n\t\t\tenable);\n\tSET_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(u1H2CAPWoWlanCtrlParm,\n\t\t\tgpio_dur);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_AP_WOW_GPIO_CTRL,\n\t\t\t\tH2C_AP_WOW_GPIO_CTRL_LEN,\n\t\t\t\tu1H2CAPWoWlanCtrlParm);\n\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_ap_offload_ctrl_cmd(_adapter *adapter, u8 enable)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 u1H2CAPOffloadCtrlParm[H2C_WOWLAN_LEN] = {0};\n\tu8 ret = _FAIL;\n\n\tDBG_871X(\"%s(): bFuncEn=%d\\n\", __func__, enable);\n\n\tSET_H2CCMD_AP_WOWLAN_EN(u1H2CAPOffloadCtrlParm, enable);\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_AP_OFFLOAD,\n\t\t\t\tH2C_AP_OFFLOAD_LEN,\n\t\t\t\tu1H2CAPOffloadCtrlParm);\n\n\treturn ret;\n}\n\nstatic u8 rtw_hal_set_ap_ps_cmd(_adapter *adapter, u8 enable)\n{\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 ap_ps_parm[H2C_AP_PS_LEN] = {0};\n\tu8 ret = _FAIL;\n\n\tDBG_871X(\"%s(): enable=%d\\n\" , __func__ , enable);\n\t\n\tSET_H2CCMD_AP_WOW_PS_EN(ap_ps_parm, enable);\n#ifndef CONFIG_USB_HCI\n\tSET_H2CCMD_AP_WOW_PS_32K_EN(ap_ps_parm, enable);\n#endif /*CONFIG_USB_HCI*/\n\tSET_H2CCMD_AP_WOW_PS_RF(ap_ps_parm, enable);\n\t\n\tif (enable)\n\t\tSET_H2CCMD_AP_WOW_PS_DURATION(ap_ps_parm, 0x32);\n\telse\n\t\tSET_H2CCMD_AP_WOW_PS_DURATION(ap_ps_parm, 0x0);\n\t\t\n\tret = rtw_hal_fill_h2c_cmd(adapter, H2C_SAP_PS_,\n\t\t\tH2C_AP_PS_LEN, ap_ps_parm);\n\n\treturn ret;\n}\n\nstatic void rtw_hal_set_ap_rsvdpage_loc_cmd(PADAPTER padapter,\n\t\tPRSVDPAGE_LOC rsvdpageloc)\n{\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\tu8 rsvdparm[H2C_AOAC_RSVDPAGE_LOC_LEN] = {0};\n\tu8 ret = _FAIL, header = 0;\n\n\tif (pHalFunc->fill_h2c_cmd == NULL) {\n\t\tDBG_871X(\"%s: Please hook fill_h2c_cmd first!\\n\", __func__);\n\t\treturn;\n\t}\n\n\theader = rtw_read8(padapter, REG_BCNQ_BDNY);\n\n\tDBG_871X(\"%s: beacon: %d, probeRsp: %d, header:0x%02x\\n\", __func__,\n\t\t\trsvdpageloc->LocApOffloadBCN,\n\t\t\trsvdpageloc->LocProbeRsp,\n\t\t\theader);\n\n\tSET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(rsvdparm,\n\t\t\trsvdpageloc->LocApOffloadBCN + header);\n\n\tret = rtw_hal_fill_h2c_cmd(padapter, H2C_BCN_RSVDPAGE,\n\t\t\t\tH2C_BCN_RSVDPAGE_LEN, rsvdparm);\n\n\tif (ret == _FAIL)\n\t\tDBG_871X(\"%s: H2C_BCN_RSVDPAGE cmd fail\\n\", __func__);\n\n\trtw_msleep_os(10);\n\n\t_rtw_memset(&rsvdparm, 0, sizeof(rsvdparm));\n\n\tSET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(rsvdparm,\n\t\t\trsvdpageloc->LocProbeRsp + header);\n\n\tret = rtw_hal_fill_h2c_cmd(padapter, H2C_PROBERSP_RSVDPAGE,\n\t\t\t\tH2C_PROBERSP_RSVDPAGE_LEN, rsvdparm);\n\n\tif (ret == _FAIL)\n\t\tDBG_871X(\"%s: H2C_PROBERSP_RSVDPAGE cmd fail\\n\", __func__);\n\n\trtw_msleep_os(10);\n}\n\nstatic void rtw_hal_set_fw_ap_wow_related_cmd(_adapter *padapter, u8 enable)\n{\n\trtw_hal_set_ap_offload_ctrl_cmd(padapter, enable);\n\trtw_hal_set_ap_wowlan_ctrl_cmd(padapter, enable);\n\trtw_hal_set_ap_ps_cmd(padapter, enable);\n}\n\nstatic void rtw_hal_ap_wow_enable(_adapter *padapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\tstruct sta_info *psta = NULL;\n#ifdef DBG_CHECK_FW_PS_STATE\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n#endif /*DBG_CHECK_FW_PS_STATE*/\n\tint res;\n\tu16 media_status_rpt;\n\n\tDBG_871X(\"%s, WOWLAN_AP_ENABLE\\n\", __func__);\n#ifdef DBG_CHECK_FW_PS_STATE\n\tif (rtw_fw_ps_state(padapter) == _FAIL) {\n\t\tpdbgpriv->dbg_enwow_dload_fw_fail_cnt++;\n\t\tDBG_871X_LEVEL(_drv_always_, \"wowlan enable no leave 32k\\n\");\n\t}\n#endif /*DBG_CHECK_FW_PS_STATE*/\n\n\t/* 1. Download WOWLAN FW*/\n\tif (pHalFunc->hal_set_wowlan_fw != NULL)\n\t\tpHalFunc->hal_set_wowlan_fw(padapter, _TRUE);\n\telse\n\t\tDBG_871X(\"hal_set_wowlan_fw is null\\n\");\n\n\tmedia_status_rpt = RT_MEDIA_CONNECT;\n\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT,\n\t\t(u8 *)&media_status_rpt);\n\n\tissue_beacon(padapter, 0);\n\n\trtw_msleep_os(2);\n\n\tif (IS_HARDWARE_TYPE_8188E(padapter))\n\t\trtw_hal_disable_tx_report(padapter);\n\n\t/* RX DMA stop */\n\tres = rtw_hal_pause_rx_dma(padapter);\n\tif (res == _FAIL)\n\t\tDBG_871X_LEVEL(_drv_always_, \"[WARNING] pause RX DMA fail\\n\");\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t/* Enable CPWM2 only. */\n\tres = rtw_hal_enable_cpwm2(padapter);\n\tif (res == _FAIL)\n\t\tDBG_871X_LEVEL(_drv_always_, \"[WARNING] enable cpwm2 fail\\n\");\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\n\trtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _TRUE);\n#endif\n\t/* 5. Set Enable WOWLAN H2C command. */\n\tDBG_871X_LEVEL(_drv_always_, \"Set Enable AP WOWLan cmd\\n\");\n\trtw_hal_set_fw_ap_wow_related_cmd(padapter, 1);\n\t\t\n\trtw_write8(padapter, REG_MCUTST_WOWLAN, 0);\n#ifdef CONFIG_USB_HCI \n\tif (padapter->intf_stop)\n\t\tpadapter->intf_stop(padapter);\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter))/*free buddy adapter's resource*/\n\t\tpadapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);\n#endif /*CONFIG_CONCURRENT_MODE*/\n\t\t/* Invoid SE0 reset signal during suspending*/\n\trtw_write8(padapter, REG_RSV_CTRL, 0x20);\n\trtw_write8(padapter, REG_RSV_CTRL, 0x60);\n#endif /*CONFIG_USB_HCI*/\n}\n\nstatic void rtw_hal_ap_wow_disable(_adapter *padapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n#ifdef DBG_CHECK_FW_PS_STATE\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n#endif /*DBG_CHECK_FW_PS_STATE*/\n\tu16 media_status_rpt;\n\tu8 val8;\n\n\tDBG_871X(\"%s, WOWLAN_AP_DISABLE\\n\", __func__);\n\t/* 1. Read wakeup reason*/\n\tpwrctl->wowlan_wake_reason = rtw_read8(padapter, REG_MCUTST_WOWLAN);\n\n\tDBG_871X_LEVEL(_drv_always_, \"wakeup_reason: 0x%02x\\n\",\n\t\tpwrctl->wowlan_wake_reason);\n\n\trtw_hal_set_fw_ap_wow_related_cmd(padapter, 0);\n\n\trtw_msleep_os(2);\n#ifdef DBG_CHECK_FW_PS_STATE\n\tif (rtw_fw_ps_state(padapter) == _FAIL) {\n\t\tpdbgpriv->dbg_diswow_dload_fw_fail_cnt++;\n\t\tDBG_871X_LEVEL(_drv_always_, \"wowlan enable no leave 32k\\n\");\n\t}\n#endif /*DBG_CHECK_FW_PS_STATE*/\n\n\tif (IS_HARDWARE_TYPE_8188E(padapter))\n\t\trtw_hal_enable_tx_report(padapter);\n\n\trtw_hal_force_enable_rxdma(padapter);\n\n\tif (pHalFunc->hal_set_wowlan_fw != NULL)\n\t\tpHalFunc->hal_set_wowlan_fw(padapter, _FALSE);\n\telse\n\t\tDBG_871X(\"hal_set_wowlan_fw is null\\n\");\n#ifdef CONFIG_GPIO_WAKEUP\n\tval8 = (pwrctl->is_high_active == 0) ? 1 : 0;\n\tDBG_871X_LEVEL(_drv_always_, \"Set Wake GPIO to default(%d).\\n\", val8);\n\trtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8);\n\trtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _FALSE);\n#endif\n\tmedia_status_rpt = RT_MEDIA_CONNECT;\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT,\n\t\t\t\t(u8 *)&media_status_rpt);\n\n\tissue_beacon(padapter, 0);\n}\n#endif /*CONFIG_AP_WOWLAN*/\n\n#ifdef CONFIG_P2P_WOWLAN\nstatic int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)\n{\n\tu8 *ssid_ie;\n\tsint ssid_len_ori;\n\tint len_diff = 0;\n\t\n\tssid_ie = rtw_get_ie(ies,  WLAN_EID_SSID, &ssid_len_ori, ies_len);\n\n\t//DBG_871X(\"%s hidden_ssid_mode:%u, ssid_ie:%p, ssid_len_ori:%d\\n\", __FUNCTION__, hidden_ssid_mode, ssid_ie, ssid_len_ori);\n\t\n\tif(ssid_ie && ssid_len_ori>0)\n\t{\n\t\tswitch(hidden_ssid_mode)\n\t\t{\n\t\t\tcase 1:\n\t\t\t{\n\t\t\t\tu8 *next_ie = ssid_ie + 2 + ssid_len_ori;\n\t\t\t\tu32 remain_len = 0;\n\t\t\t\t\n\t\t\t\tremain_len = ies_len -(next_ie-ies);\n\t\t\t\t\n\t\t\t\tssid_ie[1] = 0;\t\t\t\t\n\t\t\t\t_rtw_memcpy(ssid_ie+2, next_ie, remain_len);\n\t\t\t\tlen_diff -= ssid_len_ori;\n\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\t\t\n\t\t\tcase 2:\n\t\t\t\t_rtw_memset(&ssid_ie[2], 0, ssid_len_ori);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn len_diff;\n}\n\nstatic void rtw_hal_construct_P2PBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)\n{\n\t//struct xmit_frame\t*pmgntframe;\n\t//struct pkt_attrib\t*pattrib;\n\t//unsigned char\t*pframe;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tunsigned short *fctrl;\n\tunsigned int\trate_len;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tu32\tpktlen;\n//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n//\t_irqL irqL;\n//\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n#endif //CONFIG_P2P\n\n\t//for debug\n\tu8 *dbgbuf = pframe;\n\tu8 dbgbufLen = 0, index = 0;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n//\t_enter_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\n//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\t\t\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\n\t//pmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_BEACON);\n\t\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\t\n\tpktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\t\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\t//DBG_871X(\"ie len=%d\\n\", cur_network->IELength);\n#ifdef CONFIG_P2P\n\t\t// for P2P : Primary Device Type & Device Name\n\t\tu32 wpsielen=0, insert_len=0;\n\t\tu8 *wpsie=NULL;\t\t\n\t\twpsie = rtw_get_wps_ie(cur_network->IEs+_FIXED_IE_LENGTH_, cur_network->IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);\n\t\t\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wpsie && wpsielen>0)\n\t\t{\n\t\t\tuint wps_offset, remainder_ielen;\n\t\t\tu8 *premainder_ie, *pframe_wscie;\n\t\n\t\t\twps_offset = (uint)(wpsie - cur_network->IEs);\n\n\t\t\tpremainder_ie = wpsie + wpsielen;\n\n\t\t\tremainder_ielen = cur_network->IELength - wps_offset - wpsielen;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t\t{\n\t\t\t\tif(pmlmepriv->wps_beacon_ie && pmlmepriv->wps_beacon_ie_len>0)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, wps_offset);\n\t\t\t\t\tpframe += wps_offset;\n\t\t\t\t\tpktlen += wps_offset;\n\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);\n\t\t\t\t\tpframe += pmlmepriv->wps_beacon_ie_len;\n\t\t\t\t\tpktlen += pmlmepriv->wps_beacon_ie_len;\n\n\t\t\t\t\t//copy remainder_ie to pframe\n\t\t\t\t\t_rtw_memcpy(pframe, premainder_ie, remainder_ielen);\n\t\t\t\t\tpframe += remainder_ielen;\t\t\n\t\t\t\t\tpktlen += remainder_ielen;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\t\t\t\t\tpframe += cur_network->IELength;\n\t\t\t\t\tpktlen += cur_network->IELength;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\t\tpframe_wscie = pframe + wps_offset;\n\t\t\t\t_rtw_memcpy(pframe, cur_network->IEs, wps_offset+wpsielen);\t\t\t\n\t\t\t\tpframe += (wps_offset + wpsielen);\t\t\n\t\t\t\tpktlen += (wps_offset + wpsielen);\n\n\t\t\t\t//now pframe is end of wsc ie, insert Primary Device Type & Device Name\n\t\t\t\t//\tPrimary Device Type\n\t\t\t\t//\tType:\n\t\t\t\t*(u16*) ( pframe + insert_len) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );\n\t\t\t\tinsert_len += 2;\n\t\t\t\t\n\t\t\t\t//\tLength:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( 0x0008 );\n\t\t\t\tinsert_len += 2;\n\t\t\t\t\n\t\t\t\t//\tValue:\n\t\t\t\t//\tCategory ID\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tOUI\n\t\t\t\t*(u32*) ( pframe + insert_len ) = cpu_to_be32( WPSOUI );\n\t\t\t\tinsert_len += 4;\n\n\t\t\t\t//\tSub Category ID\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\t\t\tinsert_len += 2;\n\n\n\t\t\t\t//\tDevice Name\n\t\t\t\t//\tType:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tLength:\n\t\t\t\t*(u16*) ( pframe + insert_len ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\t\t\tinsert_len += 2;\n\n\t\t\t\t//\tValue:\n\t\t\t\t_rtw_memcpy( pframe + insert_len, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\t\t\tinsert_len += pwdinfo->device_name_len;\n\n\n\t\t\t\t//update wsc ie length\n\t\t\t\t*(pframe_wscie+1) = (wpsielen -2) + insert_len;\n\n\t\t\t\t//pframe move to end\n\t\t\t\tpframe+=insert_len;\n\t\t\t\tpktlen += insert_len;\n\n\t\t\t\t//copy remainder_ie to pframe\n\t\t\t\t_rtw_memcpy(pframe, premainder_ie, remainder_ielen);\n\t\t\t\tpframe += remainder_ielen;\t\t\n\t\t\t\tpktlen += remainder_ielen;\n\t\t\t}\n\t\t}\n\t\telse\n#endif //CONFIG_P2P\n\t\t{\n\t\t\tint len_diff;\n\t\t\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\t\t\tlen_diff = update_hidden_ssid(\n\t\t\t\tpframe+_BEACON_IE_OFFSET_\n\t\t\t\t, cur_network->IELength-_BEACON_IE_OFFSET_\n\t\t\t\t, pmlmeinfo->hidden_ssid_mode\n\t\t\t);\n\t\t\tpframe += (cur_network->IELength+len_diff);\n\t\t\tpktlen += (cur_network->IELength+len_diff);\n\t\t}\n#if 0\n\t\t{\n\t\t\tu8 *wps_ie;\n\t\t\tuint wps_ielen;\n\t\t\tu8 sr = 0;\n\t\t\twps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof (struct rtw_ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_,\n\t\t\t\tpattrib->pktlen-sizeof (struct rtw_ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen);\n\t\t\tif (wps_ie && wps_ielen>0) {\n\t\t\t\trtw_get_wps_attr_content(wps_ie,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\n\t\t\t}\n\t\t\tif (sr != 0)\n\t\t\t\tset_fwstate(pmlmepriv, WIFI_UNDER_WPS);\n\t\t\telse\n\t\t\t\t_clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);\n\t\t}\n#endif \n#ifdef CONFIG_P2P\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t{\n\t\t\tu32 len;\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t\t{\n\t\t\t\tlen = pmlmepriv->p2p_beacon_ie_len;\n\t\t\t\tif(pmlmepriv->p2p_beacon_ie && len>0)\t\t\t\t\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_beacon_ie, len);\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\t\tlen = build_beacon_p2p_ie(pwdinfo, pframe);\n\t\t\t}\n\n\t\t\tpframe += len;\n\t\t\tpktlen += len;\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\tif(_TRUE == pwdinfo->wfd_info->wfd_enable)\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\t{\n\t\t\tlen = build_beacon_wfd_ie( pwdinfo, pframe );\n\t\t\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\t\t\telse\n\t\t\t{\t\n\t\t\t\tlen = 0;\n\t\t\t\tif(pmlmepriv->wfd_beacon_ie && pmlmepriv->wfd_beacon_ie_len>0)\n\t\t\t\t{\n\t\t\t\t\tlen = pmlmepriv->wfd_beacon_ie_len;\n\t\t\t\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_beacon_ie, len);\t\n\t\t\t\t}\n\t\t\t}\t\t\n#endif //CONFIG_IOCTL_CFG80211\n\t\t\tpframe += len;\n\t\t\tpktlen += len;\n#endif //CONFIG_WFD\n\t\t}\n#endif //CONFIG_P2P\n\n\t\tgoto _issue_bcn;\n\n\t}\n\n\t//below for ad-hoc mode\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpktlen += 8;\n\n\t// beacon interval: 2 bytes\n\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); \n\n\tpframe += 2;\n\tpktlen += 2;\n\n\t// capability info: 2 bytes\n\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpktlen += 2;\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);\n\n\t// supported rates...\n\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);\n\n\t//if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\tu8 erpinfo=0;\n\t\tu32 ATIMWindow;\n\t\t// IBSS Parameter Set...\n\t\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\t\tATIMWindow = 0;\n\t\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);\n\n\t\t//ERP IE\n\t\tpframe = rtw_set_ie(pframe, _ERPINFO_IE_, 1, &erpinfo, &pktlen);\n\t}\t\n\n\n\t// EXTERNDED SUPPORTED RATE\n\tif (rate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);\n\t}\n\n\n\t//todo:HT for adhoc\n\n_issue_bcn:\n\n//#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n//\tpmlmepriv->update_bcn = _FALSE;\n//\t\n//\t_exit_critical_bh(&pmlmepriv->bcn_update_lock, &irqL);\t\n//#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\n\t*pLength = pktlen;\n#if 0\n\t// printf dbg msg\n\tdbgbufLen = pktlen;\n\tDBG_871X(\"======> DBG MSG FOR CONSTRAUCT P2P BEACON\\n\");\n\n\tfor(index=0;index<dbgbufLen;index++)\n\t\tprintk(\"%x \",*(dbgbuf+index));\n\n\tprintk(\"\\n\");\n\tDBG_871X(\"<====== DBG MSG FOR CONSTRAUCT P2P BEACON\\n\");\n\t\n#endif\n}\n\nstatic int get_reg_classes_full_count(struct p2p_channels channel_list) {\n\tint cnt = 0;\n\tint i;\n\n\tfor (i = 0; i < channel_list.reg_classes; i++) {\n\t\tcnt += channel_list.reg_class[i].channels;\n\t}\n\n\treturn cnt;\n}\n\nstatic void rtw_hal_construct_P2PProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength)\n{\n\t//struct xmit_frame\t\t\t*pmgntframe;\n\t//struct pkt_attrib\t\t\t*pattrib;\n\t//unsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\t\n\tunsigned char\t\t\t\t\t*mac;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t//WLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu16\t\t\t\t\tbeacon_interval = 100;\n\tu16\t\t\t\t\tcapInfo = 0;\n\tstruct wifidirect_info\t*pwdinfo = &(padapter->wdinfo);\n\tu8\t\t\t\t\twpsie[255] = { 0x00 };\n\tu32\t\t\t\t\twpsielen = 0, p2pielen = 0;\n\tu32\t\t\t\t\tpktlen;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n#ifdef CONFIG_INTEL_WIDI\n\tu8 zero_array_check[L2SDTA_SERVICE_VE_LEN] = { 0x00 };\n#endif //CONFIG_INTEL_WIDI\n\n\t//for debug\n\tu8 *dbgbuf = pframe;\n\tu8 dbgbufLen = 0, index = 0;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\t\n\t\n\tmac = adapter_mac_addr(padapter);\n\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t//DA filled by FW\n\t_rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\t\n\t//\tUse the device address for BSSID field.\t\n\t_rtw_memcpy(pwlanhdr->addr3, mac, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(fctrl, WIFI_PROBERSP);\n\n \tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n \tpframe += pktlen;\n\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpktlen += 8;\n\n\t// beacon interval: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *) &beacon_interval, 2); \n\tpframe += 2;\n\tpktlen += 2;\n\n\t//\tcapability info: 2 bytes\n\t//\tESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of WiFi Direct Spec)\n\tcapInfo |= cap_ShortPremble;\n\tcapInfo |= cap_ShortSlot;\n\t\n\t_rtw_memcpy(pframe, (unsigned char *) &capInfo, 2);\n\tpframe += 2;\n\tpktlen += 2;\n\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, 7, pwdinfo->p2p_wildcard_ssid, &pktlen);\n\n\t// supported rates...\n\t//\tUse the OFDM rate in the P2P probe response frame. ( 6(B), 9(B), 12, 18, 24, 36, 48, 54 )\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, 8, pwdinfo->support_rate, &pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&pwdinfo->listen_channel, &pktlen);\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif( pmlmepriv->wps_probe_resp_ie != NULL && pmlmepriv->p2p_probe_resp_ie != NULL )\n\t\t{\n\t\t\t//WPS IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);\n\t\t\tpktlen += pmlmepriv->wps_probe_resp_ie_len;\n\t\t\tpframe += pmlmepriv->wps_probe_resp_ie_len;\n\n\t\t\t//P2P IE\n\t\t\t_rtw_memcpy(pframe, pmlmepriv->p2p_probe_resp_ie, pmlmepriv->p2p_probe_resp_ie_len);\n\t\t\tpktlen += pmlmepriv->p2p_probe_resp_ie_len;\n\t\t\tpframe += pmlmepriv->p2p_probe_resp_ie_len;\n\t\t}\n\t}\n\telse\n#endif //CONFIG_IOCTL_CFG80211\t\t\n\t{\n\n\t\t//\tTodo: WPS IE\n\t\t//\tNoted by Albert 20100907\n\t\t//\tAccording to the WPS specification, all the WPS attribute is presented by Big Endian.\n\n\t\twpsielen = 0;\n\t\t//\tWPS OUI\n\t\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tWPS version\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n#ifdef CONFIG_INTEL_WIDI\n\t\t//\tCommented by Kurt\n\t\t//\tAppended WiDi info. only if we did issued_probereq_widi(), and then we saved ven. ext. in pmlmepriv->sa_ext.\n\t\tif(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE \n\t\t\t|| pmlmepriv->num_p2p_sdt != 0 )\n\t\t{\n\t\t\t//Sec dev type\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SEC_DEV_TYPE_LIST );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tCategory ID\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_DISPLAYS );\n\t\t\twpsielen += 2;\n\n\t\t\t//\tOUI\n\t\t\t*(u32*) ( wpsie + wpsielen ) = cpu_to_be32( INTEL_DEV_TYPE_OUI );\n\t\t\twpsielen += 4;\n\n\t\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_WIDI_CONSUMER_SINK );\n\t\t\twpsielen += 2;\n\n\t\t\tif(  _rtw_memcmp(pmlmepriv->sa_ext, zero_array_check, L2SDTA_SERVICE_VE_LEN) == _FALSE )\n\t\t\t{\n\t\t\t\t//\tVendor Extension\n\t\t\t\t_rtw_memcpy( wpsie + wpsielen, pmlmepriv->sa_ext, L2SDTA_SERVICE_VE_LEN );\n\t\t\t\twpsielen += L2SDTA_SERVICE_VE_LEN;\n\t\t\t}\n\t\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t\t//\tWiFi Simple Config State\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SIMPLE_CONF_STATE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG;\t//\tNot Configured.\n\n\t\t//\tResponse Type\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_RESP_TYPE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;\n\n\t\t//\tUUID-E\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_UUID_E );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0010 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\tif (pwdinfo->external_uuid == 0) {\n\t\t\t_rtw_memset( wpsie + wpsielen, 0x0, 16 );\n\t\t\t_rtw_memcpy(wpsie + wpsielen, mac, ETH_ALEN);\n\t\t} else {\n\t\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->uuid, 0x10 );\n\t\t}\n\t\twpsielen += 0x10;\n\n\t\t//\tManufacturer\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MANUFACTURER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0007 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"Realtek\", 7 );\n\t\twpsielen += 7;\n\n\t\t//\tModel Name\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NAME );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0006 );\n\t\twpsielen += 2;\t\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"8192CU\", 6 );\n\t\twpsielen += 6;\n\n\t\t//\tModel Number\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_MODEL_NUMBER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\twpsie[ wpsielen++ ] = 0x31;\t\t//\tcharacter 1\n\n\t\t//\tSerial Number\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_SERIAL_NUMBER );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( ETH_ALEN );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, \"123456\" , ETH_ALEN );\n\t\twpsielen += ETH_ALEN;\n\n\t\t//\tPrimary Device Type\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_PRIMARY_DEV_TYPE );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0008 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCategory ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\t\twpsielen += 2;\n\n\t\t//\tOUI\n\t\t*(u32*) ( wpsie + wpsielen ) = cpu_to_be32( WPSOUI );\n\t\twpsielen += 4;\n\n\t\t//\tSub Category ID\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\t\twpsielen += 2;\n\n\t\t//\tDevice Name\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t_rtw_memcpy( wpsie + wpsielen, pwdinfo->device_name, pwdinfo->device_name_len );\n\t\twpsielen += pwdinfo->device_name_len;\n\n\t\t//\tConfig Method\n\t\t//\tType:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\t\twpsielen += 2;\n\n\t\t//\tLength:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\t\twpsielen += 2;\n\n\t\t//\tValue:\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\t\twpsielen += 2;\n\t\t\n\n\t\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );\n\t\t\n\n\t\tp2pielen = build_probe_resp_p2p_ie(pwdinfo, pframe);\n\t\tpframe += p2pielen;\n\t\tpktlen += p2pielen;\n\t}\n\n#ifdef CONFIG_WFD\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( _TRUE == pwdinfo->wfd_info->wfd_enable )\n#endif //CONFIG_IOCTL_CFG80211\n\t{\n\t\twfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);\n\t\tpframe += wfdielen;\n\t\tpktlen += wfdielen;\n\t}\n#ifdef CONFIG_IOCTL_CFG80211\n\telse if (pmlmepriv->wfd_probe_resp_ie != NULL && pmlmepriv->wfd_probe_resp_ie_len>0)\n\t{\n\t\t//WFD IE\n\t\t_rtw_memcpy(pframe, pmlmepriv->wfd_probe_resp_ie, pmlmepriv->wfd_probe_resp_ie_len);\n\t\tpktlen += pmlmepriv->wfd_probe_resp_ie_len;\n\t\tpframe += pmlmepriv->wfd_probe_resp_ie_len;\t\t\n\t}\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_WFD\t\n\n\t*pLength = pktlen;\n\n#if 0\n\t// printf dbg msg\n\tdbgbufLen = pktlen;\n\tDBG_871X(\"======> DBG MSG FOR CONSTRAUCT P2P Probe Rsp\\n\");\n\n\tfor(index=0;index<dbgbufLen;index++)\n\t\tprintk(\"%x \",*(dbgbuf+index));\n\n\tprintk(\"\\n\");\n\tDBG_871X(\"<====== DBG MSG FOR CONSTRAUCT P2P Probe Rsp\\n\");\n#endif\n}\nstatic void rtw_hal_construct_P2PNegoRsp(_adapter *padapter, u8 *pframe, u32 *pLength)\n{\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_GO_NEGO_RESP;\n\tu8\t\t\twpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };\n\tu8\t\t\tp2pielen = 0, i;\n\tuint\t\t\twpsielen = 0;\n\tu16\t\t\twps_devicepassword_id = 0x0000;\n\tuint\t\t\twps_devicepassword_id_len = 0;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh;\n\tu16\t\t\tlen_channellist_attr = 0;\n\tu32\t\t\tpktlen;\n\tu8\t\t\tdialogToken = 0;\n\t\n\t//struct xmit_frame\t\t\t*pmgntframe;\n\t//struct pkt_attrib\t\t\t*pattrib;\n\t//unsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\t//WLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\n\t//for debug\n\tu8 *dbgbuf = pframe;\n\tu8 dbgbufLen = 0, index = 0;\n\n\tDBG_871X( \"%s\\n\", __FUNCTION__);\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t//RA, filled by FW\n\t_rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpframe += pktlen;\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));\t\n\t\n\t//dialog token, filled by FW\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));\n\n\t_rtw_memset( wpsie, 0x00, 255 );\n\twpsielen = 0;\n\n\t//\tWPS Section\n\twpsielen = 0;\n\t//\tWPS OUI\n\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\twpsielen += 4;\n\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t//\tDevice Password ID\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_DEVICE_PWID );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\twpsielen += 2;\n\n\t//\tValue:\n\tif ( wps_devicepassword_id == WPS_DPID_USER_SPEC )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_REGISTRAR_SPEC );\n\t}\n\telse if ( wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC )\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_USER_SPEC );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_DPID_PBC );\n\t}\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );\n\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20100908\n\t//\tAccording to the P2P Specification, the group negoitation response frame should contain 9 P2P attributes\n\t//\t1. Status\n\t//\t2. P2P Capability\n\t//\t3. Group Owner Intent\n\t//\t4. Configuration Timeout\n\t//\t5. Operating Channel\n\t//\t6. Intended P2P Interface Address\n\t//\t7. Channel List\n\t//\t8. Device Info\n\t//\t9. Group ID\t( Only GO )\n\n\n\t//\tToDo:\n\n\t//\tP2P Status\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_STATUS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue, filled by FW\n\tp2pie[ p2pielen++ ] = 1;\n\t\n\t//\tP2P Capability\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) )\n\t{\n\t\t//\tCommented by Albert 2011/03/08\n\t\t//\tAccording to the P2P specification\n\t\t//\tif the sending device will be client, the P2P Capability should be reserved of group negotation response frame\n\t\tp2pie[ p2pielen++ ] = 0;\n\t}\n\telse\n\t{\n\t\t//\tBe group owner or meet the error case\n\t\tp2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;\n\t}\n\t\n\t//\tGroup Capability Bitmap, 1 byte\n\tif ( pwdinfo->persistent_supported )\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;\n\t}\n\telse\n\t{\n\t\tp2pie[ p2pielen++ ] = P2P_GRPCAP_CROSS_CONN;\n\t}\n\n\t//\tGroup Owner Intent\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_GO_INTENT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tif ( pwdinfo->peer_intent & 0x01 )\n\t{\n\t\t//\tPeer's tie breaker bit is 1, our tie breaker bit should be 0\n\t\tp2pie[ p2pielen++ ] = ( pwdinfo->intent << 1 );\n\t}\n\telse\n\t{\n\t\t//\tPeer's tie breaker bit is 0, our tie breaker bit should be 1\n\t\tp2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );\n\t}\n\n\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\t//\tOperating Channel\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tOperating Class\n\tif ( pwdinfo->operating_channel <= 14 )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x51;\n\t}\n\telse if ( ( pwdinfo->operating_channel >= 36 ) && ( pwdinfo->operating_channel <= 48 ) )\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x73;\n\t}\n\telse\n\t{\n\t\t//\tOperating Class\n\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t}\n\t\n\t//\tChannel Number\n\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\n\t//\tIntended P2P Interface Address\t\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_INTENTED_IF_ADDR;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tChannel List\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t// Country String(3)\n\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t// + number of channels in all classes\n\tlen_channellist_attr = 3\n\t   + (1 + 1) * (u16)pmlmeext->channel_list.reg_classes\n\t   + get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t}\n\telse\n\t{\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t}\n#else\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n #endif\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tCountry String\n\tp2pie[ p2pielen++ ] = 'X';\n\tp2pie[ p2pielen++ ] = 'X';\n\t\n\t//\tThe third byte should be set to 0x04.\n\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\tp2pie[ p2pielen++ ] = 0x04;\n\n\t//\tChannel Entry List\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t{\n\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t//\tOperating Class\n\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t{\n\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t}\n\n\t\t//\tNumber of Channels\n\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t//\tChannel List\n\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t}\n\telse\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#else // CONFIG_CONCURRENT_MODE\n\t{\n\t\tint i, j;\n\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t//\tOperating Class\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t//\tNumber of Channels\n\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t//\tChannel List\n\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t}\n\t\t}\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\n\t//\tDevice Info\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tP2P Device Address\n\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\tp2pielen += ETH_ALEN;\n\n\t//\tConfig Method\n\t//\tThis field should be big endian. Noted by P2P specification.\n\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->supported_wps_cm );\n\n\tp2pielen += 2;\n\n\t//\tPrimary Device Type\n\t//\tCategory ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_CID_MULIT_MEDIA );\n\tp2pielen += 2;\n\n\t//\tOUI\n\t*(u32*) ( p2pie + p2pielen ) = cpu_to_be32( WPSOUI );\n\tp2pielen += 4;\n\n\t//\tSub Category ID\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_PDT_SCID_MEDIA_SERVER );\n\tp2pielen += 2;\n\n\t//\tNumber of Secondary Device Types\n\tp2pie[ p2pielen++ ] = 0x00;\t//\tNo Secondary Device Type List\n\n\t//\tDevice Name\n\t//\tType:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( WPS_ATTR_DEVICE_NAME );\n\tp2pielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_be16( pwdinfo->device_name_len );\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->device_name , pwdinfo->device_name_len );\n\tp2pielen += pwdinfo->device_name_len;\t\n\t\n\tif ( rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) )\n\t{\n\t\t//\tGroup ID Attribute\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;\n\n\t\t//\tLength:\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN + pwdinfo->nego_ssidlen );\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tp2P Device Address\n\t\t_rtw_memcpy( p2pie + p2pielen , pwdinfo->device_addr, ETH_ALEN );\n\t\tp2pielen += ETH_ALEN;\n\n\t\t//\tSSID\n\t\t_rtw_memcpy( p2pie + p2pielen, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen );\n\t\tp2pielen += pwdinfo->nego_ssidlen;\n\t\t\n\t}\n\t\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen );\t\n\t\n#ifdef CONFIG_WFD\n\twfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpktlen += wfdielen;\n#endif //CONFIG_WFD\n\t\n\t*pLength = pktlen;\n#if 0\n\t// printf dbg msg\n\tdbgbufLen = pktlen;\n\tDBG_871X(\"======> DBG MSG FOR CONSTRAUCT Nego Rsp\\n\");\n\n\tfor(index=0;index<dbgbufLen;index++)\n\t\tprintk(\"%x \",*(dbgbuf+index));\n\t\n\tprintk(\"\\n\");\n\tDBG_871X(\"<====== DBG MSG FOR CONSTRAUCT Nego Rsp\\n\");\n#endif\n}\n\nstatic void rtw_hal_construct_P2PInviteRsp(_adapter * padapter, u8 * pframe, u32 * pLength)\n{\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_INVIT_RESP;\n\tu8\t\t\tp2pie[ 255 ] = { 0x00 };\n\tu8\t\t\tp2pielen = 0, i;\n\tu8\t\t\tchannel_cnt_24g = 0, channel_cnt_5gl = 0, channel_cnt_5gh = 0;\n\tu16\t\t\tlen_channellist_attr = 0;\n\tu32\t\t\tpktlen;\n\tu8\t\t\tdialogToken = 0;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif\t\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\n\t\n\t//struct xmit_frame\t\t\t*pmgntframe;\n\t//struct pkt_attrib\t\t\t*pattrib;\n\t//unsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n\t//for debug\n\tu8 *dbgbuf = pframe;\n\tu8 dbgbufLen = 0, index = 0;\n\n\n\tDBG_871X( \"%s\\n\", __FUNCTION__);\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t//RA fill by FW\n\t_rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\n\t//BSSID fill by FW\n\t_rtw_memset(pwlanhdr->addr3, 0, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));\t\n\n\t//dialog token, filled by FW\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));\n\n\t//\tP2P IE Section.\n\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2pie[ p2pielen++ ] = 0x50;\n\tp2pie[ p2pielen++ ] = 0x6F;\n\tp2pie[ p2pielen++ ] = 0x9A;\n\tp2pie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20101005\n\t//\tAccording to the P2P Specification, the P2P Invitation response frame should contain 5 P2P attributes\n\t//\t1. Status\n\t//\t2. Configuration Timeout\n\t//\t3. Operating Channel\t( Only GO )\n\t//\t4. P2P Group BSSID\t( Only GO )\n\t//\t5. Channel List\n\n\t//\tP2P Status\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_STATUS;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0001 );\n\tp2pielen += 2;\n\n\t//\tValue: filled by FW, defult value is FAIL INFO UNAVAILABLE\n\tp2pie[ p2pielen++ ] = P2P_STATUS_FAIL_INFO_UNAVAILABLE;\n\t\n\t//\tConfiguration Timeout\n\t//\tType:\n\tp2pie[ p2pielen++ ] = P2P_ATTR_CONF_TIMEOUT;\n\n\t//\tLength:\n\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tp2pielen += 2;\n\n\t//\tValue:\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P GO\n\tp2pie[ p2pielen++ ] = 200;\t//\t2 seconds needed to be the P2P Client\n\n\t// due to defult value is FAIL INFO UNAVAILABLE, so the following IE is not needed\n#if 0 \n\tif( status_code == P2P_STATUS_SUCCESS )\n\t{\n\t\tif( rtw_p2p_chk_role( pwdinfo, P2P_ROLE_GO ) )\n\t\t{\n\t\t\t//\tThe P2P Invitation request frame asks this Wi-Fi device to be the P2P GO\n\t\t\t//\tIn this case, the P2P Invitation response frame should carry the two more P2P attributes.\n\t\t\t//\tFirst one is operating channel attribute.\n\t\t\t//\tSecond one is P2P Group BSSID attribute.\n\n\t\t\t//\tOperating Channel\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_OPERATING_CH;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0005 );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tCountry String\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\tp2pie[ p2pielen++ ] = 'X';\n\t\t\n\t\t\t//\tThe third byte should be set to 0x04.\n\t\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t\t//\tOperating Class\n\t\t\tp2pie[ p2pielen++ ] = 0x51;\t//\tCopy from SD7\n\t\t\n\t\t\t//\tChannel Number\n\t\t\tp2pie[ p2pielen++ ] = pwdinfo->operating_channel;\t//\toperating channel number\n\t\t\t\n\n\t\t\t//\tP2P Group BSSID\n\t\t\t//\tType:\n\t\t\tp2pie[ p2pielen++ ] = P2P_ATTR_GROUP_BSSID;\n\n\t\t\t//\tLength:\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( ETH_ALEN );\n\t\t\tp2pielen += 2;\n\n\t\t\t//\tValue:\n\t\t\t//\tP2P Device Address for GO\n\t\t\t_rtw_memcpy(p2pie + p2pielen, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\tp2pielen += ETH_ALEN;\n\n\t\t}\n\n\t\t//\tChannel List\n\t\t//\tType:\n\t\tp2pie[ p2pielen++ ] = P2P_ATTR_CH_LIST;\n\n\t\t//\tLength:\n\t\t// Country String(3)\n\t\t// + ( Operating Class (1) + Number of Channels(1) ) * Operation Classes (?)\n\t\t// + number of channels in all classes\n\t\tlen_channellist_attr = 3\n\t\t\t+ (1 + 1) * (u16)pmlmeext->channel_list.reg_classes\n\t\t\t+ get_reg_classes_full_count(pmlmeext->channel_list);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t{\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 5 + 1 );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\t\t}\n#else\n\n\t\t*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( len_channellist_attr );\n\n#endif\n\t\tp2pielen += 2;\n\n\t\t//\tValue:\n\t\t//\tCountry String\n\t\tp2pie[ p2pielen++ ] = 'X';\n\t\tp2pie[ p2pielen++ ] = 'X';\n\n\t\t//\tThe third byte should be set to 0x04.\n\t\t//\tDescribed in the \"Operating Channel Attribute\" section.\n\t\tp2pie[ p2pielen++ ] = 0x04;\n\n\t\t//\tChannel Entry List\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED ) )\n\t\t{\n\t\t\t_adapter *pbuddy_adapter = padapter->pbuddy_adapter;\t\n\t\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\n\t\t\t//\tOperating Class\n\t\t\tif ( pbuddy_mlmeext->cur_channel > 14 )\n\t\t\t{\n\t\t\t\tif ( pbuddy_mlmeext->cur_channel >= 149 )\n\t\t\t\t{\n\t\t\t\t\tp2pie[ p2pielen++ ] = 0x7c;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tp2pie[ p2pielen++ ] = 0x73;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tp2pie[ p2pielen++ ] = 0x51;\n\t\t\t}\n\n\t\t\t//\tNumber of Channels\n\t\t\t//\tJust support 1 channel and this channel is AP's channel\n\t\t\tp2pie[ p2pielen++ ] = 1;\n\n\t\t\t//\tChannel List\n\t\t\tp2pie[ p2pielen++ ] = pbuddy_mlmeext->cur_channel;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint i, j;\n\t\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t\t//\tOperating Class\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t\t//\tNumber of Channels\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t\t//\tChannel List\n\t\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#else // CONFIG_CONCURRENT_MODE\n\t\t{\n\t\t\tint i, j;\n\t\t\tfor (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {\n\t\t\t\t//\tOperating Class\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;\n\n\t\t\t\t//\tNumber of Channels\n\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;\n\n\t\t\t\t//\tChannel List\n\t\t\t\tfor (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {\n\t\t\t\t\tp2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t}\n#endif\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2pie, &pktlen );\t\n\t\n#ifdef CONFIG_WFD\n\twfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\t*pLength = pktlen;\n\n#if 0\n\t// printf dbg msg\n\tdbgbufLen = pktlen;\n\tDBG_871X(\"======> DBG MSG FOR CONSTRAUCT Invite Rsp\\n\");\n\n\tfor(index=0;index<dbgbufLen;index++)\n\t\tprintk(\"%x \",*(dbgbuf+index));\n\t\n\tprintk(\"\\n\");\n\tDBG_871X(\"<====== DBG MSG FOR CONSTRAUCT Invite Rsp\\n\");\n#endif\n}\n\n\nstatic void rtw_hal_construct_P2PProvisionDisRsp(_adapter * padapter, u8 * pframe, u32 * pLength)\n{\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu8\t\t\tdialogToken = 0;\t\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_PROVISION_DISC_RESP;\n\tu8\t\t\twpsie[ 100 ] = { 0x00 };\n\tu8\t\t\twpsielen = 0;\n\tu32\t\t\tpktlen;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\t\t\n\t\n\t//struct xmit_frame\t\t\t*pmgntframe;\n\t//struct pkt_attrib\t\t\t*pattrib;\n\t//unsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo);\n\n\t//for debug\n\tu8 *dbgbuf = pframe;\n\tu8 dbgbufLen = 0, index = 0;\n\n\tDBG_871X( \"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t//RA filled by FW\n\t_rtw_memset(pwlanhdr->addr1, 0, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr,0);\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pktlen));\t\n\t//dialog token, filled by FW\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pktlen));\t\t\n\n\twpsielen = 0;\n\t//\tWPS OUI\n\t//*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\tRTW_PUT_BE32(wpsie, WPSOUI);\n\twpsielen += 4;\n\n#if 0\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n#endif\n\n\t//\tConfig Method\n\t//\tType:\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\tRTW_PUT_BE16(wpsie + wpsielen, WPS_ATTR_CONF_METHOD);\n\twpsielen += 2;\n\n\t//\tLength:\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\tRTW_PUT_BE16(wpsie + wpsielen, 0x0002);\n\twpsielen += 2;\n\n\t//\tValue: filled by FW, default value is PBC\n\t//*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( config_method );\n\tRTW_PUT_BE16(wpsie + wpsielen, WPS_CM_PUSH_BUTTON);\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pktlen );\t\n\n#ifdef CONFIG_WFD\n\twfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\t*pLength = pktlen;\n\n\t// printf dbg msg\n#if 0\n\tdbgbufLen = pktlen;\n\tDBG_871X(\"======> DBG MSG FOR CONSTRAUCT  ProvisionDis Rsp\\n\");\n\n\tfor(index=0;index<dbgbufLen;index++)\n\t\tprintk(\"%x \",*(dbgbuf+index));\n\n\tprintk(\"\\n\");\n\tDBG_871X(\"<====== DBG MSG FOR CONSTRAUCT ProvisionDis Rsp\\n\");\n#endif\n}\n\nu8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc)\n{\n\tu8 u1H2CP2PRsvdPageParm[H2C_P2PRSVDPAGE_LOC_LEN]={0};\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 ret = _FAIL;\n\n\tDBG_871X(\"P2PRsvdPageLoc: P2PBeacon=%d P2PProbeRsp=%d NegoRsp=%d InviteRsp=%d PDRsp=%d\\n\",  \n\t\trsvdpageloc->LocP2PBeacon, rsvdpageloc->LocP2PProbeRsp,\n\t\trsvdpageloc->LocNegoRsp, rsvdpageloc->LocInviteRsp,\n\t\trsvdpageloc->LocPDRsp);\n\n\tSET_H2CCMD_RSVDPAGE_LOC_P2P_BCN(u1H2CP2PRsvdPageParm, rsvdpageloc->LocProbeRsp);\n\tSET_H2CCMD_RSVDPAGE_LOC_P2P_PROBE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocPsPoll);\n\tSET_H2CCMD_RSVDPAGE_LOC_P2P_NEGO_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocNullData);\n\tSET_H2CCMD_RSVDPAGE_LOC_P2P_INVITE_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocQosNull);\n\tSET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(u1H2CP2PRsvdPageParm, rsvdpageloc->LocBTQosNull);\n\t\n\t//FillH2CCmd8723B(padapter, H2C_8723B_P2P_OFFLOAD_RSVD_PAGE, H2C_P2PRSVDPAGE_LOC_LEN, u1H2CP2PRsvdPageParm);\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_P2P_OFFLOAD_RSVD_PAGE,\n\t\t\t\tH2C_P2PRSVDPAGE_LOC_LEN,\n\t\t\t\tu1H2CP2PRsvdPageParm);\n\n\treturn ret;\n}\n\nu8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter)\n{\n\n\tu8 offload_cmd[H2C_P2P_OFFLOAD_LEN] = {0};\n\tstruct wifidirect_info\t*pwdinfo = &(adapter->wdinfo);\n\tstruct P2P_WoWlan_Offload_t *p2p_wowlan_offload = (struct P2P_WoWlan_Offload_t *)offload_cmd;\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu8 ret = _FAIL;\n\n\t_rtw_memset(p2p_wowlan_offload,0 ,sizeof(struct P2P_WoWlan_Offload_t)); \n\tDBG_871X(\"%s\\n\",__func__);\t\n\tswitch(pwdinfo->role)\n\t{\n\t\tcase P2P_ROLE_DEVICE:\n\t\t\tDBG_871X(\"P2P_ROLE_DEVICE\\n\");\n\t\t\tp2p_wowlan_offload->role = 0;\n\t\t\tbreak;\n\t\tcase P2P_ROLE_CLIENT:\n\t\t\tDBG_871X(\"P2P_ROLE_CLIENT\\n\");\n\t\t\tp2p_wowlan_offload->role = 1;\n\t\t\tbreak;\n\t\tcase P2P_ROLE_GO:\n\t\t\tDBG_871X(\"P2P_ROLE_GO\\n\");\n\t\t\tp2p_wowlan_offload->role = 2;\n\t\t\tbreak;\n\t\tdefault: \n\t\t\tDBG_871X(\"P2P_ROLE_DISABLE\\n\");\n\t\t\tbreak;\n\t\t}\n\tp2p_wowlan_offload->Wps_Config[0] = pwdinfo->supported_wps_cm>>8;\n\tp2p_wowlan_offload->Wps_Config[1] = pwdinfo->supported_wps_cm;\n\toffload_cmd = (u8*)p2p_wowlan_offload;\n\tDBG_871X(\"p2p_wowlan_offload: %x:%x:%x\\n\",offload_cmd[0],offload_cmd[1],offload_cmd[2]);\t\n\n\tret = rtw_hal_fill_h2c_cmd(adapter,\n\t\t\t\tH2C_P2P_OFFLOAD,\n\t\t\t\tH2C_P2P_OFFLOAD_LEN,\n\t\t\t\toffload_cmd);\n\treturn ret;\n\n\t//FillH2CCmd8723B(adapter, H2C_8723B_P2P_OFFLOAD, sizeof(struct P2P_WoWlan_Offload_t), (u8 *)p2p_wowlan_offload);\n}\n#endif //CONFIG_P2P_WOWLAN\n\nstatic void rtw_hal_construct_beacon(_adapter *padapter,\n\t\tu8 *pframe, u32 *pLength)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\trate_len, pktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*cur_network = &(pmlmeinfo->network);\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\n\t//pmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_BEACON);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpktlen += 8;\n\n\t// beacon interval: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpktlen += 2;\n\n\t// capability info: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpktlen += 2;\n\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\t//DBG_871X(\"ie len=%d\\n\", cur_network->IELength);\n\t\tpktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);\n\t\t_rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);\n\n\t\tgoto _ConstructBeacon;\n\t}\n\n\t//below for ad-hoc mode\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);\n\n\t// supported rates...\n\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);\n\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\tu32 ATIMWindow;\n\t\t// IBSS Parameter Set...\n\t\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\t\tATIMWindow = 0;\n\t\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);\n\t}\n\n\n\t//todo: ERP IE\n\n\n\t// EXTERNDED SUPPORTED RATE\n\tif (rate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);\n\t}\n\n\n\t//todo:HT for adhoc\n\n_ConstructBeacon:\n\n\tif ((pktlen + TXDESC_SIZE) > 512)\n\t{\n\t\tDBG_871X(\"beacon frame too large\\n\");\n\t\treturn;\n\t}\n\n\t*pLength = pktlen;\n\n\t//DBG_871X(\"%s bcn_sz=%d\\n\", __FUNCTION__, pktlen);\n\n}\n\nstatic void rtw_hal_construct_PSPoll(_adapter *padapter,\n\t\tu8 *pframe, u32 *pLength)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\tpktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\t// Frame control.\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\tSetPwrMgt(fctrl);\n\tSetFrameSubType(pframe, WIFI_PSPOLL);\n\n\t// AID.\n\tSetDuration(pframe, (pmlmeinfo->aid | 0xc000));\n\n\t// BSSID.\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\t// TA.\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\n\t*pLength = 16;\n}\n\nstatic void rtw_hal_construct_NullFunctionData(\n\tPADAPTER padapter,\n\tu8\t\t*pframe,\n\tu32\t\t*pLength,\n\tu8\t\t*StaAddr,\n\tu8\t\tbQoS,\n\tu8\t\tAC,\n\tu8\t\tbEosp,\n\tu8\t\tbForcePowerSave)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\t\tpktlen;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network\t\t*cur_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\tif (bForcePowerSave)\n\t{\n\t\tSetPwrMgt(fctrl);\n\t}\n\n\tswitch(cur_network->network.InfrastructureMode)\n\t{\n\t\tcase Ndis802_11Infrastructure:\n\t\t\tSetToDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);\n\t\t\tbreak;\n\t\tcase Ndis802_11APMode:\n\t\t\tSetFrDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\tbreak;\n\t\tcase Ndis802_11IBSS:\n\t\tdefault:\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\tbreak;\n\t}\n\n\tSetSeqNum(pwlanhdr, 0);\n\n\tif (bQoS == _TRUE) {\n\t\tstruct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;\n\n\t\tSetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\n\n\t\tpwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;\n\t\tSetPriority(&pwlanqoshdr->qc, AC);\n\t\tSetEOSP(&pwlanqoshdr->qc, bEosp);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\t} else {\n\t\tSetFrameSubType(pframe, WIFI_DATA_NULL);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\t}\n\n\t*pLength = pktlen;\n}\n\nvoid rtw_hal_construct_ProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength,\n\t\tu8 *StaAddr, BOOLEAN bHideSSID)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu8\t\t\t\t\t*mac, *bssid;\n\tu32\t\t\t\t\tpktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX  *cur_network = &(pmlmeinfo->network);\n\n\t/*DBG_871X(\"%s\\n\", __FUNCTION__);*/\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tmac = adapter_mac_addr(padapter);\n\tbssid = cur_network->MacAddress;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(fctrl, WIFI_PROBERSP);\n\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpframe += pktlen;\n\n\tif (cur_network->IELength > MAX_IE_SZ)\n\t\treturn;\n\n\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\tpframe += cur_network->IELength;\n\tpktlen += cur_network->IELength;\n\n\t*pLength = pktlen;\n}\n\n#ifdef CONFIG_WOWLAN\t\n//\n// Description:\n//\tConstruct the ARP response packet to support ARP offload.\n//\nstatic void rtw_hal_construct_ARPRsp(\n\tPADAPTER padapter,\n\tu8\t\t\t*pframe,\n\tu32\t\t\t*pLength,\n\tu8\t\t\t*pIPAddress\n\t)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t*fctrl;\n\tu32\tpktlen;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network\t*cur_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\tstatic u8\tARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06};\n\tu8\t*pARPRspPkt = pframe;\n\t//for TKIP Cal MIC\n\tu8\t*payload = pframe;\n\tu8\tEncryptionHeadOverhead = 0;\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\t//-------------------------------------------------------------------------\n\t// MAC Header.\n\t//-------------------------------------------------------------------------\n\tSetFrameType(fctrl, WIFI_DATA);\n\t//SetFrameSubType(fctrl, 0);\n\tSetToDs(fctrl);\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetDuration(pwlanhdr, 0);\n\t//SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0);\n\t//SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data);\n\t//SET_80211_HDR_TO_DS(pARPRspPkt, 1);\n\t//SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid);\n\t//SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress);\n\t//SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid);\n\n\t//SET_80211_HDR_DURATION(pARPRspPkt, 0);\n\t//SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0);\n#ifdef CONFIG_WAPI_SUPPORT\n\t*pLength = sMacHdrLng;\n#else\n\t*pLength = 24;\n#endif\n\tswitch (psecuritypriv->dot11PrivacyAlgrthm) {\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\tEncryptionHeadOverhead = 4;\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\tEncryptionHeadOverhead = 8;\n\t\t\tbreak;\n\t\tcase _AES_:\n\t\t\tEncryptionHeadOverhead = 8;\n\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\tEncryptionHeadOverhead = 18;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tEncryptionHeadOverhead = 0;\n\t}\n\n\tif(EncryptionHeadOverhead > 0) {\n\t\t_rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);\n\t\t*pLength += EncryptionHeadOverhead;\n\t\t//SET_80211_HDR_WEP(pARPRspPkt, 1);  //Suggested by CCW.\n\t\tSetPrivacy(fctrl);\n\t}\n\n\t//-------------------------------------------------------------------------\n\t// Frame Body.\n\t//-------------------------------------------------------------------------\n\tpARPRspPkt =  (u8*)(pframe+ *pLength);\n\tpayload = pARPRspPkt; //Get Payload pointer\n\t// LLC header\n\t_rtw_memcpy(pARPRspPkt, ARPLLCHeader, 8);\n\t*pLength += 8;\n\n\t// ARP element\n\tpARPRspPkt += 8;\n\tSET_ARP_PKT_HW(pARPRspPkt, 0x0100);\n\tSET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008);\t// IP protocol\n\tSET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6);\n\tSET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4);\n\tSET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200);\t// ARP response\n\tSET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, adapter_mac_addr(padapter));\n\tSET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress);\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\tif (!is_zero_mac_addr(pmlmepriv->gw_mac_addr)) {\n\t\tSET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, pmlmepriv->gw_mac_addr);\n\t\tSET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pmlmepriv->gw_ip);\n\t}    \n\telse\n#endif\n\t{\n\t\tSET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt,\n\t\t\t\tget_my_bssid(&(pmlmeinfo->network)));\n\t\tSET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt,\n\t\t\t\tpIPAddress);\n\t\tDBG_871X(\"%s Target Mac Addr:\" MAC_FMT \"\\n\", __FUNCTION__,\n\t\t\t\tMAC_ARG(get_my_bssid(&(pmlmeinfo->network))));\n\t\tDBG_871X(\"%s Target IP Addr\" IP_FMT \"\\n\", __FUNCTION__,\n\t\t\t\tIP_ARG(pIPAddress));\n\t}\n\n\t*pLength += 28;\n\n\tif (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_) {\n\t\tu8\tmic[8];\n\t\tstruct mic_data\tmicdata;\n\t\tstruct sta_info\t*psta = NULL;\n\t\tu8\tpriority[4]={0x0,0x0,0x0,0x0};\n\t\tu8\tnull_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};\n\n\t\tDBG_871X(\"%s(): Add MIC\\n\",__FUNCTION__);\n\n\t\tpsta = rtw_get_stainfo(&padapter->stapriv,\n\t\t\t\tget_my_bssid(&(pmlmeinfo->network)));\n\t\tif (psta != NULL) {\n\t\t\tif(_rtw_memcmp(&psta->dot11tkiptxmickey.skey[0],\n\t\t\t\t\t\tnull_key, 16)==_TRUE) {\n\t\t\t\tDBG_871X(\"%s(): STA dot11tkiptxmickey==0\\n\",\n\t\t\t\t\t\t__func__);\n\t\t\t}\n\t\t\t//start to calculate the mic code\n\t\t\trtw_secmicsetkey(&micdata,\n\t\t\t\t\t&psta->dot11tkiptxmickey.skey[0]);\n\t\t}\n\n\t\trtw_secmicappend(&micdata, pwlanhdr->addr3, 6);  //DA\n\n\t\trtw_secmicappend(&micdata, pwlanhdr->addr2, 6); //SA\n\n\t\tpriority[0]=0;\n\n\t\trtw_secmicappend(&micdata, &priority[0], 4);\n\n\t\trtw_secmicappend(&micdata, payload, 36); //payload length = 8 + 28\n\n\t\trtw_secgetmic(&micdata,&(mic[0]));\n\n\t\tpARPRspPkt += 28;\n\t\t_rtw_memcpy(pARPRspPkt, &(mic[0]),8);\n\n\t\t*pLength += 8;\n\t}\n}\n\n#ifdef CONFIG_PNO_SUPPORT\nstatic void rtw_hal_construct_ProbeReq(_adapter *padapter, u8 *pframe,\n\t\tu32 *pLength, pno_ssid_t *ssid)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t*fctrl;\n\tu32\t\t\t\tpktlen;\n\tunsigned char\t\t\t*mac;\n\tunsigned char\t\t\tbssrate[NumRates];\n\tstruct xmit_priv\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint\tbssrate_len = 0;\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\tmac = adapter_mac_addr(padapter);\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, bc_addr, ETH_ALEN);\n\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(pframe, WIFI_PROBEREQ);\n\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpframe += pktlen;\n\n\tif (ssid == NULL) {\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, 0, NULL, &pktlen);\n\t} else {\n\t\t//DBG_871X(\"%s len:%d\\n\", ssid->SSID, ssid->SSID_len);\n\t\tpframe = rtw_set_ie(pframe, _SSID_IE_, ssid->SSID_len, ssid->SSID, &pktlen);\n\t}\n\n\tget_rate_set(padapter, bssrate, &bssrate_len);\n\n\tif (bssrate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , 8, bssrate, &pktlen);\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_ , (bssrate_len - 8), (bssrate + 8), &pktlen);\n\t}\n\telse\n\t{\n\t\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_ , bssrate_len , bssrate, &pktlen);\n\t}\n\n\t*pLength = pktlen;\n}\n\nstatic void rtw_hal_construct_PNO_info(_adapter *padapter,\n\t\tu8 *pframe, u32*pLength)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\n\tu8\t*pPnoInfoPkt = pframe;\n\tpPnoInfoPkt =  (u8*)(pframe+ *pLength);\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_num, 1);\n\n\t*pLength+=1;\n\tpPnoInfoPkt += 1;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->hidden_ssid_num, 1);\n\n\t*pLength+=3;\n\tpPnoInfoPkt += 3;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_period, 1);\n\n\t*pLength+=4;\n\tpPnoInfoPkt += 4;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->fast_scan_iterations, 4);\n\n\t*pLength+=4;\n\tpPnoInfoPkt += 4;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->slow_scan_period, 4);\n\n\t*pLength+=4;\n\tpPnoInfoPkt += 4;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_length,\n\t\t\tMAX_PNO_LIST_COUNT);\n\n\t*pLength+=MAX_PNO_LIST_COUNT;\n\tpPnoInfoPkt += MAX_PNO_LIST_COUNT;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_cipher_info,\n\t\t\tMAX_PNO_LIST_COUNT);\n\n\t*pLength+=MAX_PNO_LIST_COUNT;\n\tpPnoInfoPkt += MAX_PNO_LIST_COUNT;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->ssid_channel_info,\n\t\t\tMAX_PNO_LIST_COUNT);\n\n\t*pLength+=MAX_PNO_LIST_COUNT;\n\tpPnoInfoPkt += MAX_PNO_LIST_COUNT;\n\t_rtw_memcpy(pPnoInfoPkt, &pwrctl->pnlo_info->loc_probe_req,\n\t\t\tMAX_HIDDEN_AP);\n\n\t*pLength+=MAX_HIDDEN_AP;\n\tpPnoInfoPkt += MAX_HIDDEN_AP;\n}\n\nstatic void rtw_hal_construct_ssid_list(_adapter *padapter,\n\tu8 *pframe, u32 *pLength)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tu8 *pSSIDListPkt = pframe;\n\tint i;\n\n\tpSSIDListPkt =  (u8*)(pframe+ *pLength);\n\n\tfor(i = 0; i < pwrctl->pnlo_info->ssid_num ; i++) {\n\t\t_rtw_memcpy(pSSIDListPkt, &pwrctl->pno_ssid_list->node[i].SSID,\n\t\t\tpwrctl->pnlo_info->ssid_length[i]);\n\n\t\t*pLength += WLAN_SSID_MAXLEN;\n\t\tpSSIDListPkt += WLAN_SSID_MAXLEN;\n\t}\n}\n\nstatic void rtw_hal_construct_scan_info(_adapter *padapter,\n\tu8 *pframe, u32 *pLength)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tu8 *pScanInfoPkt = pframe;\n\tint i;\n\n\tpScanInfoPkt =  (u8*)(pframe+ *pLength);\n\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->channel_num, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_ch, 1);\n\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_bw, 1);\n\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_40_offset, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->orig_80_offset, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->periodScan, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->period_scan_time, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->enableRFE, 1);\n\n\t*pLength+=1;\n\tpScanInfoPkt += 1;\n\t_rtw_memcpy(pScanInfoPkt, &pwrctl->pscan_info->rfe_type, 8);\n\n\t*pLength+=8;\n\tpScanInfoPkt += 8;\n\n\tfor(i = 0 ; i < MAX_SCAN_LIST_COUNT ; i ++) {\n\t\t_rtw_memcpy(pScanInfoPkt,\n\t\t\t&pwrctl->pscan_info->ssid_channel_info[i], 4);\n\t\t*pLength+=4;\n\t\tpScanInfoPkt += 4;\n\t}\n}\n#endif //CONFIG_PNO_SUPPORT\n\n#ifdef CONFIG_GTK_OL\nstatic void rtw_hal_construct_GTKRsp(\n\tPADAPTER\tpadapter,\n\tu8\t\t*pframe,\n\tu32\t\t*pLength\n\t)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t*fctrl;\n\tu32\tpktlen;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network\t*cur_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\tstatic u8\tLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};\n\tstatic u8\tGTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};\n\tu8\t*pGTKRspPkt = pframe;\n\tu8\tEncryptionHeadOverhead = 0;\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\t//-------------------------------------------------------------------------\n\t// MAC Header.\n\t//-------------------------------------------------------------------------\n\tSetFrameType(fctrl, WIFI_DATA);\n\t//SetFrameSubType(fctrl, 0);\n\tSetToDs(fctrl);\n\n\t_rtw_memcpy(pwlanhdr->addr1,\n\t\t\tget_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\t_rtw_memcpy(pwlanhdr->addr2,\n\t\t\tadapter_mac_addr(padapter), ETH_ALEN);\n\n\t_rtw_memcpy(pwlanhdr->addr3,\n\t\t\tget_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetDuration(pwlanhdr, 0);\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t*pLength = sMacHdrLng;\n#else\n\t*pLength = 24;\n#endif //CONFIG_WAPI_SUPPORT\n\n\t//-------------------------------------------------------------------------\n\t// Security Header: leave space for it if necessary.\n\t//-------------------------------------------------------------------------\n\tswitch (psecuritypriv->dot11PrivacyAlgrthm) {\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\tEncryptionHeadOverhead = 4;\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\tEncryptionHeadOverhead = 8;\n\t\t\tbreak;\n\t\tcase _AES_:\n\t\t\tEncryptionHeadOverhead = 8;\n\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\tEncryptionHeadOverhead = 18;\n\t\t\tbreak;\n#endif //CONFIG_WAPI_SUPPORT\n\t\tdefault:\n\t\t\tEncryptionHeadOverhead = 0;\n\t}\n\n\tif (EncryptionHeadOverhead > 0) {\n\t\t_rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);\n\t\t*pLength += EncryptionHeadOverhead;\n\t\t//SET_80211_HDR_WEP(pGTKRspPkt, 1);  //Suggested by CCW.\n\t\t//GTK's privacy bit is done by FW\n\t\t//SetPrivacy(fctrl);\n\t}\n\t//-------------------------------------------------------------------------\n\t// Frame Body.\n\t//-------------------------------------------------------------------------\n\tpGTKRspPkt =  (u8*)(pframe+ *pLength);\n\t// LLC header\n\t_rtw_memcpy(pGTKRspPkt, LLCHeader, 8);\n\t*pLength += 8;\n\n\t// GTK element\n\tpGTKRspPkt += 8;\n\n\t//GTK frame body after LLC, part 1\n\t_rtw_memcpy(pGTKRspPkt, GTKbody_a, 11);\n\t*pLength += 11;\n\tpGTKRspPkt += 11;\n\t//GTK frame body after LLC, part 2\n\t_rtw_memset(&(pframe[*pLength]), 0, 88);\n\t*pLength += 88;\n\tpGTKRspPkt += 88;\n\n}\n#endif //CONFIG_GTK_OL\n\nvoid rtw_hal_set_wow_fw_rsvd_page(_adapter *adapter, u8 *pframe, u16 index,\n\t\tu8 tx_desc, u32 page_size, u8 *page_num, u32 *total_pkt_len,\n\t\tRSVDPAGE_LOC *rsvd_page_loc)\n{\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tstruct mlme_ext_priv\t*pmlmeext;\n\tstruct mlme_ext_info\t*pmlmeinfo;\n\tu32\tARPLegnth = 0, GTKLegnth = 0, PNOLength = 0, ScanInfoLength = 0;\n\tu32\tSSIDLegnth = 0, ProbeReqLength = 0;\n\tu8 CurtPktPageNum = 0;\n\tu8 currentip[4];\n\tu8 cur_dot11txpn[8];\n\n#ifdef CONFIG_GTK_OL\n\tstruct sta_priv *pstapriv = &adapter->stapriv;\n\tstruct sta_info * psta;\n\tu8 kek[RTW_KEK_LEN];\n\tu8 kck[RTW_KCK_LEN];\n#endif //CONFIG_GTK_OL\n#ifdef\tCONFIG_PNO_SUPPORT \n\tint pno_index;\n\tu8 ssid_num;\n#endif //CONFIG_PNO_SUPPORT\n\n\tpmlmeext = &adapter->mlmeextpriv;\n\tpmlmeinfo = &pmlmeext->mlmext_info;\n\n\tif (pwrctl->wowlan_pno_enable == _FALSE) {\n\t\t//ARP RSP * 1 page\n\t\trtw_get_current_ip_address(adapter, currentip);\n\n\t\trsvd_page_loc->LocArpRsp = *page_num;\n\n\t\trtw_hal_construct_ARPRsp( adapter, &pframe[index],\n\t\t\t\t&ARPLegnth, currentip);\n\n\t\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t\t&pframe[index-tx_desc],\n\t\t\t\tARPLegnth, _FALSE, _FALSE, _TRUE);\n\n\t\tCurtPktPageNum = (u8)PageNum(tx_desc + ARPLegnth, page_size);\n\n\t\t*page_num += CurtPktPageNum;\n\n\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t//3 SEC IV * 1 page\n\t\trtw_get_sec_iv(adapter, cur_dot11txpn,\n\t\t\t\tget_my_bssid(&pmlmeinfo->network));\n\n\t\trsvd_page_loc->LocRemoteCtrlInfo = *page_num;\n\n\t\t_rtw_memcpy(pframe+index-tx_desc, cur_dot11txpn, _AES_IV_LEN_);\n\n\t\tCurtPktPageNum = (u8)PageNum(_AES_IV_LEN_, page_size);\n\n\t\t*page_num += CurtPktPageNum;\n\n\t\t*total_pkt_len = index + _AES_IV_LEN_;\n#ifdef CONFIG_GTK_OL\n\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t//if the ap staion info. exists, get the kek, kck from staion info.\n\t\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\n\t\tif (psta == NULL) {\n\t\t\t_rtw_memset(kek, 0, RTW_KEK_LEN);\n\t\t\t_rtw_memset(kck, 0, RTW_KCK_LEN);\n\t\t\tDBG_8192C(\"%s, KEK, KCK download rsvd page all zero \\n\",\n\t\t\t\t\t__func__);\n\t\t} else {\n\t\t\t_rtw_memcpy(kek, psta->kek, RTW_KEK_LEN);\n\t\t\t_rtw_memcpy(kck, psta->kck, RTW_KCK_LEN);\n\t\t}\n\n\t\t//3 KEK, KCK\n\t\trsvd_page_loc->LocGTKInfo = *page_num;\n\t\tif (IS_HARDWARE_TYPE_8188E(adapter) || IS_HARDWARE_TYPE_8812(adapter)) {\n\t\t\tstruct security_priv *psecpriv = NULL;\n\t\t\t\n\t\t\tpsecpriv = &adapter->securitypriv;\n\t\t\t_rtw_memcpy(pframe+index-tx_desc,\n\t\t\t\t\t&psecpriv->dot11PrivacyAlgrthm, 1);\n\t\t\t_rtw_memcpy(pframe+index-tx_desc+1,\n\t\t\t\t\t&psecpriv->dot118021XGrpPrivacy, 1);\n\t\t\t_rtw_memcpy(pframe+index-tx_desc+2,\n\t\t\t\t\tkck, RTW_KCK_LEN);\n\t\t\t_rtw_memcpy(pframe+index-tx_desc+2+RTW_KCK_LEN,\n\t\t\t\t\tkek, RTW_KEK_LEN);\n\t\t\tCurtPktPageNum = (u8)PageNum(tx_desc + 2 + RTW_KCK_LEN + RTW_KEK_LEN, page_size);\n\t\t} else {\n\t\t\t_rtw_memcpy(pframe+index-tx_desc, kck, RTW_KCK_LEN);\n\t\t\t_rtw_memcpy(pframe+index-tx_desc+RTW_KCK_LEN, kek, RTW_KEK_LEN);\n\t\t\tCurtPktPageNum = (u8)PageNum(tx_desc + RTW_KCK_LEN + RTW_KEK_LEN, page_size);\n\t\t}\n\t\t\n\t\t\n\n#if 0\n\t\t{\n\t\t\tint i;\n\t\t\tprintk(\"\\ntoFW KCK: \");\n\t\t\tfor(i=0;i<16; i++)\n\t\t\t\tprintk(\" %02x \", kck[i]);\n\t\t\tprintk(\"\\ntoFW KEK: \");\n\t\t\tfor(i=0;i<16; i++)\n\t\t\t\tprintk(\" %02x \", kek[i]);\n\t\t\tprintk(\"\\n\");\n\t\t}\n\n\t\tDBG_871X(\"%s(): HW_VAR_SET_TX_CMD: KEK KCK %p %d\\n\", \n\t\t\t__FUNCTION__, &pframe[index-tx_desc],\n\t\t\t(tx_desc + RTW_KCK_LEN + RTW_KEK_LEN));\n#endif\n\n\t\t*page_num += CurtPktPageNum;\n\n\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t//3 GTK Response\n\t\trsvd_page_loc->LocGTKRsp= *page_num;\n\t\trtw_hal_construct_GTKRsp(adapter, &pframe[index], &GTKLegnth);\n\n\t\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\t\tGTKLegnth, _FALSE, _FALSE, _TRUE);\n#if 0\n\t\t{\n\t\t\tint gj;\n\t\t\tprintk(\"123GTK pkt=> \\n\");\n\t\t\tfor(gj=0; gj < GTKLegnth+tx_desc; gj++) {\n\t\t\t\tprintk(\" %02x \", pframe[index-tx_desc+gj]);\n\t\t\t\tif ((gj + 1)%16==0)\n\t\t\t\t\tprintk(\"\\n\");\n\t\t\t}\n\t\t\tprintk(\" <=end\\n\");\n\t\t}\n\n\t\tDBG_871X(\"%s(): HW_VAR_SET_TX_CMD: GTK RSP %p %d\\n\",\n\t\t\t__FUNCTION__, &pframe[index-tx_desc],\n\t\t\t(tx_desc + GTKLegnth));\n#endif\n\n\t\tCurtPktPageNum = (u8)PageNum(tx_desc + GTKLegnth, page_size);\n\n\t\t*page_num += CurtPktPageNum;\n\n\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t//below page is empty for GTK extension memory\n\t\t//3(11) GTK EXT MEM\n\t\trsvd_page_loc->LocGTKEXTMEM = *page_num;\n\n\t\tCurtPktPageNum = 2;\n\n\t\t*page_num += CurtPktPageNum;\n\t\t//extension memory for FW\n\t\t*total_pkt_len =\n\t\t\tindex - tx_desc + (page_size * CurtPktPageNum);\n#endif //CONFIG_GTK_OL\n\t} else {\n#ifdef CONFIG_PNO_SUPPORT\n\t\tif (pwrctl->pno_in_resume == _FALSE &&\n\t\t\t\tpwrctl->pno_inited == _TRUE) {\n\n\t\t\t//Broadcast Probe Request\n\t\t\trsvd_page_loc->LocProbePacket = *page_num;\n\n\t\t\tDBG_871X(\"loc_probe_req: %d\\n\",\n\t\t\t\t\trsvd_page_loc->LocProbePacket);\n\n\t\t\trtw_hal_construct_ProbeReq(\n\t\t\t\tadapter,\n\t\t\t\t&pframe[index],\n\t\t\t\t&ProbeReqLength,\n\t\t\t\tNULL);\n\n\t\t\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t\t&pframe[index-tx_desc],\n\t\t\t\tProbeReqLength, _FALSE, _FALSE, _FALSE);\n\n\t\t\tCurtPktPageNum =\n\t\t\t\t(u8)PageNum(tx_desc + ProbeReqLength, page_size);\n\n\t\t\t*page_num += CurtPktPageNum;\n\n\t\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t\t//Hidden SSID Probe Request\n\t\t\tssid_num = pwrctl->pnlo_info->hidden_ssid_num;\n\n\t\t\tfor (pno_index = 0 ; pno_index < ssid_num ; pno_index++) {\n\t\t\t\tpwrctl->pnlo_info->loc_probe_req[pno_index] =\n\t\t\t\t\t*page_num;\n\n\t\t\t\trtw_hal_construct_ProbeReq(\n\t\t\t\t\tadapter,\n\t\t\t\t\t&pframe[index],\n\t\t\t\t\t&ProbeReqLength,\n\t\t\t\t\t&pwrctl->pno_ssid_list->node[pno_index]);\n\n\t\t\t\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t\t\t&pframe[index - tx_desc],\n\t\t\t\t\tProbeReqLength, _FALSE, _FALSE, _FALSE);\n\n\t\t\t\tCurtPktPageNum =\n\t\t\t\t\t(u8)PageNum(tx_desc + ProbeReqLength, page_size);\n\n\t\t\t\t*page_num += CurtPktPageNum;\n\n\t\t\t\tindex += (CurtPktPageNum * page_size);\n\t\t\t}\n\n\t\t\t//PNO INFO Page\n\t\t\trsvd_page_loc->LocPNOInfo = *page_num;\n\t\t\trtw_hal_construct_PNO_info(adapter,\n\t\t\t\t\t&pframe[index - tx_desc],\n\t\t\t\t\t&PNOLength);\n\n\t\t\tCurtPktPageNum = (u8)PageNum(PNOLength, page_size);\n\t\t\t*page_num += CurtPktPageNum;\n\t\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t\t//SSID List Page\n\t\t\trsvd_page_loc->LocSSIDInfo = *page_num;\n\t\t\trtw_hal_construct_ssid_list(adapter,\n\t\t\t\t\t&pframe[index - tx_desc],\n\t\t\t\t\t&SSIDLegnth);\n\n\t\t\tCurtPktPageNum = (u8)PageNum(SSIDLegnth, page_size);\n\t\t\t*page_num += CurtPktPageNum;\n\t\t\tindex += (CurtPktPageNum * page_size);\n\n\t\t\t//Scan Info Page\n\t\t\trsvd_page_loc->LocScanInfo = *page_num;\n\t\t\trtw_hal_construct_scan_info(adapter,\n\t\t\t\t\t&pframe[index - tx_desc],\n\t\t\t\t\t&ScanInfoLength);\n\n\t\t\tCurtPktPageNum = (u8)PageNum(ScanInfoLength, page_size);\n\t\t\t*page_num += CurtPktPageNum;\n\t\t\tindex += (CurtPktPageNum * page_size);\n\t\t\t*total_pkt_len = index + ScanInfoLength;\n\t\t}\n#endif //CONFIG_PNO_SUPPORT\n\t}\n}\n\nstatic void rtw_hal_gate_bb(_adapter *adapter, bool stop)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);\n\tu8 val8 = 0;\n\tu16 val16 = 0;\n\n\tif (stop) {\n\t\t/* Pause TX*/\n\t\tpwrpriv->wowlan_txpause_status = rtw_read8(adapter, REG_TXPAUSE);\n\t\trtw_write8(adapter, REG_TXPAUSE, 0xff);\n\t\tval8 = rtw_read8(adapter, REG_SYS_FUNC_EN);\n\t\tval8 &= ~BIT(0);\n\t\trtw_write8(adapter, REG_SYS_FUNC_EN, val8);\n\t\tDBG_871X(\"%s: BB gated: 0x%02x, store TXPAUSE: %02x\\n\",\n\t\t\t\t__func__,\n\t\t\t\trtw_read8(adapter, REG_SYS_FUNC_EN),\n\t\t\t\tpwrpriv->wowlan_txpause_status);\n\t} else {\n\t\tval8 = rtw_read8(adapter, REG_SYS_FUNC_EN);\n\t\tval8 |= BIT(0);\n\t\trtw_write8(adapter, REG_SYS_FUNC_EN, val8);\n\t\tDBG_871X(\"%s: BB release: 0x%02x, recover TXPAUSE:%02x\\n\",\n\t\t\t\t__func__, rtw_read8(adapter, REG_SYS_FUNC_EN),\n\t\t\t\tpwrpriv->wowlan_txpause_status);\n\t\t/* release TX*/\n\t\trtw_write8(adapter, REG_TXPAUSE, pwrpriv->wowlan_txpause_status);\n\t}\n}\n\nstatic void rtw_hal_reset_mac_rx(_adapter *adapter)\n{\n\tu8 val8 = 0;\n\t/* Set REG_CR bit1, bit3, bit7 to 0*/\n\tval8 = rtw_read8(adapter, REG_CR);\n\tval8 &= 0x75;\n\trtw_write8(adapter, REG_CR, val8);\n\tval8 = rtw_read8(adapter, REG_CR);\n\t/* Set REG_CR bit1, bit3, bit7 to 1*/\n\tval8 |= 0x8a;\n\trtw_write8(adapter, REG_CR, val8);\n\tDBG_871X(\"0x%04x: %02x\\n\", REG_CR, rtw_read8(adapter, REG_CR));\n}\n\nstatic void rtw_hal_set_wow_rxff_boundary(_adapter *adapter, bool wow_mode)\n{\n\tu8 val8 = 0;\n\tu16 rxff_bndy = 0;\n\tu32 rx_dma_buff_sz = 0;\n\n\tval8 = rtw_read8(adapter, REG_FIFOPAGE + 3);\n\tif (val8 != 0)\n\t\tDBG_871X(\"%s:[%04x]some PKTs in TXPKTBUF\\n\",\n\t\t\t __func__, (REG_FIFOPAGE + 3));\n\n\trtw_hal_reset_mac_rx(adapter);\n\n\tif (wow_mode) {\n\t\trtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ_WOW,\n\t\t\t\t    (u8 *)&rx_dma_buff_sz);\n\t\trxff_bndy = rx_dma_buff_sz - 1;\n\n\t\trtw_write16(adapter, (REG_TRXFF_BNDY + 2), rxff_bndy);\n\t\tDBG_871X(\"%s: wow mode, 0x%04x: 0x%04x\\n\", __func__,\n\t\t\t REG_TRXFF_BNDY + 2,\n\t\t\t rtw_read16(adapter, (REG_TRXFF_BNDY+2)));\n\t} else {\n\t\trtw_hal_get_def_var(adapter, HAL_DEF_RX_DMA_SZ,\n\t\t\t\t    (u8 *)&rx_dma_buff_sz);\n\t\trxff_bndy = rx_dma_buff_sz - 1;\n\t\trtw_write16(adapter, (REG_TRXFF_BNDY + 2), rxff_bndy);\n\t\tDBG_871X(\"%s: normal mode, 0x%04x: 0x%04x\\n\", __func__,\n\t\t\t REG_TRXFF_BNDY + 2,\n\t\t\t rtw_read16(adapter, (REG_TRXFF_BNDY+2)));\n\t}\n}\n\nstatic int rtw_hal_set_pattern(_adapter *adapter, u8 *pattern,\n\t\t\t       u8 len, u8 *mask)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tstruct mlme_ext_priv *pmlmeext = NULL;\n\tstruct mlme_ext_info *pmlmeinfo = NULL;\n\tstruct rtl_wow_pattern wow_pattern;\n\tu8 mask_hw[MAX_WKFM_SIZE] = {0};\n\tu8 content[MAX_WKFM_PATTERN_SIZE] = {0};\n\tu8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu8 multicast_addr1[2] = {0x33, 0x33};\n\tu8 multicast_addr2[3] = {0x01, 0x00, 0x5e};\n\tu8 res = _FALSE, index = 0, mask_len = 0;\n\tu8 mac_addr[ETH_ALEN] = {0};\n\tu16 count = 0;\n\tint i, j;\n\n\tif (pwrctl->wowlan_pattern_idx > MAX_WKFM_NUM) {\n\t\tDBG_871X(\"%s pattern_idx is more than MAX_FMC_NUM: %d\\n\",\n\t\t\t __func__, MAX_WKFM_NUM);\n\t\treturn _FALSE;\n\t}\n\n\tpmlmeext = &adapter->mlmeextpriv;\n\tpmlmeinfo = &pmlmeext->mlmext_info;\n\t_rtw_memcpy(mac_addr, adapter_mac_addr(adapter), ETH_ALEN);\n\t_rtw_memset(&wow_pattern, 0, sizeof(struct rtl_wow_pattern));\n\n\tmask_len = DIV_ROUND_UP(len, 8);\n\n\t/* 1. setup A1 table */\n\tif (memcmp(pattern, broadcast_addr, ETH_ALEN) == 0)\n\t\twow_pattern.type = PATTERN_BROADCAST;\n\telse if (memcmp(pattern, multicast_addr1, 2) == 0)\n\t\twow_pattern.type = PATTERN_MULTICAST;\n\telse if (memcmp(pattern, multicast_addr2, 3) == 0)\n\t\twow_pattern.type = PATTERN_MULTICAST;\n\telse if (memcmp(pattern, mac_addr, ETH_ALEN) == 0)\n\t\twow_pattern.type = PATTERN_UNICAST;\n\telse\n\t\twow_pattern.type = PATTERN_INVALID;\n\n\t/* translate mask from os to mask for hw */\n\n/******************************************************************************\n * pattern from OS uses 'ethenet frame', like this:\n\n\t|    6   |    6   |   2  |     20    |  Variable  |  4  |\n\t|--------+--------+------+-----------+------------+-----|\n\t|    802.3 Mac Header    | IP Header | TCP Packet | FCS |\n\t|   DA   |   SA   | Type |\n\n * BUT, packet catched by our HW is in '802.11 frame', begin from LLC,\n\n\t|     24 or 30      |    6   |   2  |     20    |  Variable  |  4  |\n\t|-------------------+--------+------+-----------+------------+-----|\n\t| 802.11 MAC Header |       LLC     | IP Header | TCP Packet | FCS |\n\t\t\t    | Others | Tpye |\n\n * Therefore, we need translate mask_from_OS to mask_to_hw.\n * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0,\n * because new mask[0~5] means 'SA', but our HW packet begins from LLC,\n * bit[0~5] corresponds to first 6 Bytes in LLC, they just don't match.\n ******************************************************************************/\n\t/* Shift 6 bits */\n\tfor (i = 0; i < mask_len - 1; i++) {\n\t\tmask_hw[i] = mask[i] >> 6;\n\t\tmask_hw[i] |= (mask[i + 1] & 0x3F) << 2;\n\t}\n\n\tmask_hw[i] = (mask[i] >> 6) & 0x3F;\n\t/* Set bit 0-5 to zero */\n\tmask_hw[0] &= 0xC0;\n\t\n\tfor (i = 0; i < (MAX_WKFM_SIZE/4); i++) {\n\t\twow_pattern.mask[i] = mask_hw[i * 4];\n\t\twow_pattern.mask[i] |= (mask_hw[i * 4 + 1] << 8);\n\t\twow_pattern.mask[i] |= (mask_hw[i * 4 + 2] << 16);\n\t\twow_pattern.mask[i] |= (mask_hw[i * 4 + 3] << 24);\n\t}\n\n\t/* To get the wake up pattern from the mask.\n\t * We do not count first 12 bits which means\n\t * DA[6] and SA[6] in the pattern to match HW design. */\n\tcount = 0;\n\tfor (i = 12; i < len; i++) {\n\t\tif ((mask[i / 8] >> (i % 8)) & 0x01) {\n\t\t\tcontent[count] = pattern[i];\n\t\t\tcount++;\n\t\t}\n\t}\n\n\twow_pattern.crc = rtw_calc_crc(content, count);\n\n\tif (wow_pattern.crc != 0 && wow_pattern.type == PATTERN_INVALID)\n\t\twow_pattern.type = PATTERN_VALID;\n\n\tindex = rtw_read8(adapter, REG_WKFMCAM_NUM);\n\n\tif (!pwrctl->bInSuspend)\n\t\tindex += 2;\n\n\t/* write pattern */\n\tres = rtw_write_to_frame_mask(adapter, index, &wow_pattern);\n\n\tif (res == _TRUE) {\n\t\tpwrctl->wowlan_pattern_idx++;\n\t\trtw_write8(adapter,\n\t\t\t   REG_WKFMCAM_NUM,\n\t\t\t   pwrctl->wowlan_pattern_idx);\n\t} else {\n\t\tDBG_871X(\"%s: ERROR write_to_frame_mask_cam fail\\n\", __func__);\n\t}\n\n\treturn res;\n}\n\nstatic void rtw_hal_dl_pattern(_adapter *adapter, u8 clean_all)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);\n\tint i = 0, total = 0;\n\n\ttotal = pwrpriv->wowlan_pattern_idx + 1;\n\n\trtw_clean_pattern(adapter);\n\n\tif (!clean_all) {\n\t\tfor (i = 0 ; i < total ; i++) {\n\t\t\trtw_hal_set_pattern(adapter,\n\t\t\t\t\tpwrpriv->patterns[i].content,\n\t\t\t\t\tpwrpriv->patterns[i].len,\n\t\t\t\t\tpwrpriv->patterns[i].mask);\n\t\t}\n\t\tDBG_871X(\"pattern downloaded\\n\");\n\t} else {\n\t\tfor (i = 0 ; i < MAX_WKFM_NUM ; i++) {\n\t\t\t_rtw_memset(pwrpriv->patterns[i].content, '\\0',\n\t\t\t\t\tsizeof(pwrpriv->patterns[i].content));\n\t\t\t_rtw_memset(pwrpriv->patterns[i].mask, '\\0',\n\t\t\t\t\tsizeof(pwrpriv->patterns[i].mask));\n\t\t\tpwrpriv->patterns[i].len = 0;\n\t\t}\n\t\tDBG_871X(\"clean all pattern\\n\");\n\t}\n}\n\nstatic void rtw_hal_wow_enable(_adapter *adapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tstruct sta_info *psta = NULL;\n\tint res;\n\tu16 media_status_rpt;\n\t\n\n\tDBG_871X_LEVEL(_drv_always_, \"%s, WOWLAN_ENABLE\\n\", __func__);\n\trtw_hal_gate_bb(adapter, _TRUE);\n#ifdef CONFIG_GTK_OL\n\tif (psecuritypriv->dot11PrivacyAlgrthm == _AES_)\n\t\trtw_hal_fw_sync_cam_id(adapter);\n#endif\n\tif (IS_HARDWARE_TYPE_8723B(adapter))\n\t\trtw_hal_backup_rate(adapter);\n\n\t/* RX DMA stop */\n\tif (IS_HARDWARE_TYPE_8188E(adapter))\n\t\trtw_hal_disable_tx_report(adapter);\n\n\tres = rtw_hal_pause_rx_dma(adapter);\n\tif (res == _FAIL)\n\t\tDBG_871X_LEVEL(_drv_always_, \"[WARNING] pause RX DMA fail\\n\");\n\n\t/* Reconfig RX_FF Boundary */\n\trtw_hal_set_wow_rxff_boundary(adapter, _TRUE);\n\n\t/* redownload pattern match */\n\tif (pwrctl->wowlan_pattern)\n\t\trtw_hal_dl_pattern(adapter, _FALSE);\n\n\trtw_hal_set_wowlan_fw(adapter, _TRUE);\n\tmedia_status_rpt = RT_MEDIA_CONNECT;\n\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_FW_JOINBSSRPT,\n\t\t(u8 *)&media_status_rpt);\n\t\t\n\tif (!pwrctl->wowlan_pno_enable) {\n\t\tpsta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));\n\t\tmedia_status_rpt = (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);\n\t\tif (psta != NULL) {\n\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT,\n\t\t\t\t(u8 *)&media_status_rpt);\n\t\t}\n\t}\n\t\t\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t/* Enable CPWM2 only. */\n\tres = rtw_hal_enable_cpwm2(adapter);\n\tif (res == _FAIL)\n\t\tDBG_871X_LEVEL(_drv_always_, \"[WARNING] enable cpwm2 fail\\n\");\n#endif\n#ifdef CONFIG_GPIO_WAKEUP\n\trtw_hal_switch_gpio_wl_ctrl(adapter, WAKEUP_GPIO_IDX, _TRUE);\n#endif\n\t/* Set WOWLAN H2C command. */\n\tDBG_871X_LEVEL(_drv_always_, \"Set WOWLan cmd\\n\");\n\trtw_hal_set_fw_wow_related_cmd(adapter, 1);\n\t\t\n\tres = rtw_hal_check_wow_ctrl(adapter, _TRUE);\n\n\tif (res == _FALSE)\n\t\tDBG_871X(\"[Error]%s: set wowlan CMD fail!!\\n\", __func__);\n\n\tpwrctl->wowlan_wake_reason =\n\t\trtw_read8(adapter, REG_WOWLAN_WAKE_REASON);\n\n\tDBG_871X_LEVEL(_drv_always_, \"wowlan_wake_reason: 0x%02x\\n\",\n\t\t\t\tpwrctl->wowlan_wake_reason);\n#ifdef CONFIG_GTK_OL_DBG\n\tdump_sec_cam(RTW_DBGDUMP, adapter);\n#endif\n#ifdef CONFIG_USB_HCI\n\tif (adapter->intf_stop)\t    /* free adapter's resource */\n\t\tadapter->intf_stop(adapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(adapter)) /*free buddy adapter's resource*/\n\t\tadapter->pbuddy_adapter->intf_stop(adapter->pbuddy_adapter);\n#endif /*CONFIG_CONCURRENT_MODE*/\n\t/* Invoid SE0 reset signal during suspending*/\n\trtw_write8(adapter, REG_RSV_CTRL, 0x20);\n\trtw_write8(adapter, REG_RSV_CTRL, 0x60);\n#endif /*CONFIG_USB_HCI*/\n\n\trtw_hal_gate_bb(adapter, _FALSE);\n}\n\nstatic void rtw_hal_wow_disable(_adapter *adapter)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tstruct security_priv *psecuritypriv = &adapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tstruct sta_info *psta = NULL;\n\tint res;\n\tu16 media_status_rpt;\n\tu8 val8;\n\n\tDBG_871X_LEVEL(_drv_always_, \"%s, WOWLAN_DISABLE\\n\", __func__);\n\n\tif (!pwrctl->wowlan_pno_enable) {\n\t\tpsta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));\n\t\tif (psta != NULL) {\n\t\t\tmedia_status_rpt =\n\t\t\t\t(u16)((psta->mac_id<<8)|RT_MEDIA_DISCONNECT);\n\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT,\n\t\t\t\t\t\t(u8 *)&media_status_rpt);\n\t\t} else {\n\t\t\tDBG_871X(\"%s: psta is null\\n\", __func__);\n\t\t}\n\t}\n\t\t\n\tif (0) {\n\t\tDBG_871X(\"0x630:0x%02x\\n\", rtw_read8(adapter, 0x630));\n\t\tDBG_871X(\"0x631:0x%02x\\n\", rtw_read8(adapter, 0x631));\n\t}\n\n\tpwrctl->wowlan_wake_reason = rtw_read8(adapter, REG_WOWLAN_WAKE_REASON);\n\n\tDBG_871X_LEVEL(_drv_always_, \"wakeup_reason: 0x%02x\\n\",\n\t\tpwrctl->wowlan_wake_reason);\n\n\trtw_hal_set_fw_wow_related_cmd(adapter, 0);\n\n\tres = rtw_hal_check_wow_ctrl(adapter, _FALSE);\n\n\tif (res == _FALSE) {\n\t\tDBG_871X(\"[Error]%s: disable WOW cmd fail\\n!!\", __func__);\n\t\trtw_hal_force_enable_rxdma(adapter);\n\t}\n\n\trtw_hal_gate_bb(adapter, _TRUE);\n\n\tres = rtw_hal_pause_rx_dma(adapter);\n\tif (res == _FAIL)\n\t\tDBG_871X_LEVEL(_drv_always_, \"[WARNING] pause RX DMA fail\\n\");\n\n\t/* clean pattern match */\n\tif (pwrctl->wowlan_pattern)\n\t\trtw_hal_dl_pattern(adapter, _TRUE);\n\n\t/* config RXFF boundary to original */\n\trtw_hal_set_wow_rxff_boundary(adapter, _FALSE);\n\n\trtw_hal_release_rx_dma(adapter);\n\n\tif (IS_HARDWARE_TYPE_8188E(adapter))\n\t\trtw_hal_enable_tx_report(adapter);\n\t\t\n\trtw_hal_update_tx_iv(adapter);\n\n#ifdef CONFIG_GTK_OL\n\tif (psecuritypriv->dot11PrivacyAlgrthm == _AES_)\n\t\trtw_hal_update_gtk_offload_info(adapter);\n#endif /*CONFIG_GTK_OL*/\n\n\trtw_hal_set_wowlan_fw(adapter, _FALSE);\n\n#ifdef CONFIG_GPIO_WAKEUP\n\tval8 = (pwrctl->is_high_active == 0) ? 1 : 0;\n\tDBG_871X_LEVEL(_drv_always_, \"Set Wake GPIO to default(%d).\\n\", val8);\n\trtw_hal_set_output_gpio(adapter, WAKEUP_GPIO_IDX, val8);\n\trtw_hal_switch_gpio_wl_ctrl(adapter, WAKEUP_GPIO_IDX, _FALSE);\n#endif\n\tif ((pwrctl->wowlan_wake_reason != FWDecisionDisconnect) &&\n\t\t(pwrctl->wowlan_wake_reason != Rx_Pairwisekey) &&\n\t\t(pwrctl->wowlan_wake_reason != Rx_DisAssoc) &&\n\t\t(pwrctl->wowlan_wake_reason != Rx_DeAuth)) {\n\n\t\tmedia_status_rpt = RT_MEDIA_CONNECT;\n\t\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_FW_JOINBSSRPT,\n\t\t\t(u8 *)&media_status_rpt);\n\n\t\tif (psta != NULL) {\n\t\t\tmedia_status_rpt = (u16)((psta->mac_id<<8)|RT_MEDIA_CONNECT);\n\t\t\trtw_hal_set_hwreg(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT,\n\t\t\t\t(u8 *)&media_status_rpt);\n\t\t}\n\t}\n\trtw_hal_gate_bb(adapter, _FALSE);\n}\n#endif /*CONFIG_WOWLAN*/\n\n#ifdef CONFIG_P2P_WOWLAN\nvoid rtw_hal_set_p2p_wow_fw_rsvd_page(_adapter* adapter, u8 *pframe, u16 index,\n\t\tu8 tx_desc, u32 page_size, u8 *page_num, u32 *total_pkt_len,\n\t\tRSVDPAGE_LOC* rsvd_page_loc)\n{\n\tu32 P2PNegoRspLength = 0, P2PInviteRspLength = 0;\n\tu32 P2PPDRspLength = 0, P2PProbeRspLength = 0, P2PBCNLength = 0;\n\tu8 CurtPktPageNum = 0;\n\n\t/* P2P Beacon */\n\trsvd_page_loc->LocP2PBeacon = *page_num;\n\trtw_hal_construct_P2PBeacon(adapter, &pframe[index], &P2PBCNLength);\n\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\tP2PBCNLength, _FALSE, _FALSE, _FALSE);\n\n#if 0\n\tDBG_871X(\"%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\\n\", \n\t\t__FUNCTION__, &pframe[index-tx_desc], (P2PBCNLength+tx_desc));\n#endif\n\n\tCurtPktPageNum = (u8)PageNum(tx_desc + P2PBCNLength, page_size);\n\n\t*page_num += CurtPktPageNum;\n\n\tindex += (CurtPktPageNum * page_size);\n\n\t// P2P Probe rsp\n\trsvd_page_loc->LocP2PProbeRsp = *page_num;\n\trtw_hal_construct_P2PProbeRsp(adapter, &pframe[index],\n\t\t\t&P2PProbeRspLength);\n\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\tP2PProbeRspLength, _FALSE, _FALSE, _FALSE);\n\n\t//DBG_871X(\"%s(): HW_VAR_SET_TX_CMD: PROBE RSP %p %d\\n\", \n\t//\t__FUNCTION__, &pframe[index-tx_desc], (P2PProbeRspLength+tx_desc));\n\n\tCurtPktPageNum = (u8)PageNum(tx_desc + P2PProbeRspLength, page_size);\n\n\t*page_num += CurtPktPageNum;\n\n\tindex += (CurtPktPageNum * page_size);\n\n\t//P2P nego rsp\n\trsvd_page_loc->LocNegoRsp = *page_num;\n\trtw_hal_construct_P2PNegoRsp(adapter, &pframe[index],\n\t\t\t&P2PNegoRspLength);\n\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\tP2PNegoRspLength, _FALSE, _FALSE, _FALSE);\n\n\t//DBG_871X(\"%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\\n\", \n\t//\t__FUNCTION__, &pframe[index-tx_desc], (NegoRspLength+tx_desc));\n\n\tCurtPktPageNum = (u8)PageNum(tx_desc + P2PNegoRspLength, page_size);\n\n\t*page_num += CurtPktPageNum;\n\n\tindex += (CurtPktPageNum * page_size);\n\t\t\n\t//P2P invite rsp\n\trsvd_page_loc->LocInviteRsp = *page_num;\n\trtw_hal_construct_P2PInviteRsp(adapter, &pframe[index],\n\t\t\t&P2PInviteRspLength);\n\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\tP2PInviteRspLength, _FALSE, _FALSE, _FALSE);\n\n\t//DBG_871X(\"%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\\n\", \n\t//__FUNCTION__, &pframe[index-tx_desc], (InviteRspLength+tx_desc));\n\n\tCurtPktPageNum = (u8)PageNum(tx_desc + P2PInviteRspLength, page_size);\n\n\t*page_num += CurtPktPageNum;\n\n\tindex += (CurtPktPageNum * page_size);\n\t\n\t//P2P provision discovery rsp\n\trsvd_page_loc->LocPDRsp = *page_num;\n\trtw_hal_construct_P2PProvisionDisRsp( adapter,\n\t\t\t&pframe[index], &P2PPDRspLength);\n\n\trtw_hal_fill_fake_txdesc(adapter, &pframe[index-tx_desc],\n\t\t\tP2PPDRspLength, _FALSE, _FALSE, _FALSE);\n\n\t//DBG_871X(\"%s(): HW_VAR_SET_TX_CMD: QOS NULL DATA %p %d\\n\", \n\t//\t__FUNCTION__, &pframe[index-tx_desc], (PDRspLength+tx_desc));\n\n\tCurtPktPageNum = (u8)PageNum(tx_desc + P2PPDRspLength, page_size);\n\n       *page_num += CurtPktPageNum;\n\n\tindex += (CurtPktPageNum * page_size);\n\n\t*total_pkt_len = index + P2PPDRspLength;\n}\n#endif //CONFIG_P2P_WOWLAN\n\n/*\n * Description: Fill the reserved packets that FW will use to RSVD page.\n *\t\t\tNow we just send 4 types packet to rsvd page.\n *\t\t\t(1)Beacon, (2)Ps-poll, (3)Null data, (4)ProbeRsp.\n * Input:\n * finished - FALSE:At the first time we will send all the packets as a large packet to Hw,\n *\t\t    so we need to set the packet length to total lengh.\n *\t      TRUE: At the second time, we should send the first packet (default:beacon)\n *\t\t    to Hw again and set the lengh in descriptor to the real beacon lengh.\n * 2009.10.15 by tynli.\n *\n * Page Size = 128: 8188e, 8723a/b, 8192c/d,  \n * Page Size = 256: 8192e, 8821a\n * Page Size = 512: 8812a\n */\n\nvoid rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tstruct xmit_frame\t*pcmdframe;\n\tstruct pkt_attrib\t*pattrib;\n\tstruct xmit_priv\t*pxmitpriv;\n\tstruct mlme_ext_priv\t*pmlmeext;\n\tstruct mlme_ext_info\t*pmlmeinfo;\n\tstruct pwrctrl_priv *pwrctl;\n\tstruct mlme_priv *pmlmepriv = &adapter->mlmepriv;\n\tstruct hal_ops *pHalFunc = &adapter->HalFunc;\n\tu32\tBeaconLength = 0, ProbeRspLength = 0, PSPollLength = 0;\n\tu32\tNullDataLength = 0, QosNullLength = 0, BTQosNullLength = 0;\n\tu32\tProbeReqLength = 0, NullFunctionDataLength = 0;\n\tu8\tTxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;\n\tu8\tTotalPageNum = 0 , CurtPktPageNum = 0 , RsvdPageNum = 0;\n\tu8\t*ReservedPagePacket;\n\tu16\tBufIndex = 0;\n\tu32\tTotalPacketLen = 0, MaxRsvdPageBufSize = 0, PageSize = 0;\n\tRSVDPAGE_LOC\tRsvdPageLoc;\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tstruct sreset_priv *psrtpriv;\n#endif /* DBG_CONFIG_ERROR_DETECT */\n\n\n\tpHalData = GET_HAL_DATA(adapter);\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tpsrtpriv = &pHalData->srestpriv;\n#endif\n\tpxmitpriv = &adapter->xmitpriv;\n\tpmlmeext = &adapter->mlmeextpriv;\n\tpmlmeinfo = &pmlmeext->mlmext_info;\n\tpwrctl = adapter_to_pwrctl(adapter);\n\n\trtw_hal_get_def_var(adapter, HAL_DEF_TX_PAGE_SIZE, (u8 *)&PageSize);\n\t\n\tif (PageSize == 0) {\n\t\tDBG_871X(\"[Error]: %s, PageSize is zero!!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif (pwrctl->wowlan_mode == _TRUE || pwrctl->wowlan_ap_mode == _TRUE)\n\t\tRsvdPageNum = rtw_hal_get_txbuff_rsvd_page_num(adapter, _TRUE);\n\telse\n\t\tRsvdPageNum = rtw_hal_get_txbuff_rsvd_page_num(adapter, _FALSE);\n\t\n\tDBG_871X(\"%s PageSize: %d, RsvdPageNUm: %d\\n\",__func__, PageSize, RsvdPageNum);\n\t\n\tMaxRsvdPageBufSize = RsvdPageNum*PageSize;\n\n\tif (MaxRsvdPageBufSize > MAX_CMDBUF_SZ) {\n\t\tDBG_871X(\"%s MaxRsvdPageBufSize(%d) is larger than MAX_CMDBUF_SZ(%d)\",\n\t\t\t__func__, MaxRsvdPageBufSize, MAX_CMDBUF_SZ);\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\t\n\tpcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\n\t\n\tif (pcmdframe == NULL) {\n\t\tDBG_871X(\"%s: alloc ReservedPagePacket fail!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tReservedPagePacket = pcmdframe->buf_addr;\n\t_rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));\n\n\t/* beacon * 2 pages */\n\tBufIndex = TxDescOffset;\n\trtw_hal_construct_beacon(adapter,\n\t\t\t&ReservedPagePacket[BufIndex], &BeaconLength);\n\n\t/*\n\t* When we count the first page size, we need to reserve description size for the RSVD\n\t* packet, it will be filled in front of the packet in TXPKTBUF.\n\t*/\n\tCurtPktPageNum = (u8)PageNum((TxDescLen + BeaconLength), PageSize);\n\t/* If we don't add 1 more page, ARP offload function will fail at 8723bs.*/\n\tif (CurtPktPageNum == 1) \n\t\tCurtPktPageNum += 1;\n\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n\n\tif (pwrctl->wowlan_ap_mode == _TRUE) {\n\t\t/* (4) probe response*/\n\t\tRsvdPageLoc.LocProbeRsp = TotalPageNum;\n\t\trtw_hal_construct_ProbeRsp(\n\t\t\tadapter, &ReservedPagePacket[BufIndex],\n\t\t\t&ProbeRspLength,\n\t\t\tget_my_bssid(&pmlmeinfo->network), _FALSE);\n\t\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t&ReservedPagePacket[BufIndex-TxDescLen],\n\t\t\tProbeRspLength, _FALSE, _FALSE, _FALSE);\n\n\t\tCurtPktPageNum = (u8)PageNum(TxDescLen + BeaconLength, PageSize);\n\t\tTotalPageNum += CurtPktPageNum;\n\t\tBufIndex += (CurtPktPageNum*PageSize);\n\t\tTotalPacketLen = BufIndex + ProbeRspLength;\n\t\tgoto download_page;\n\t}\n\n\t/* ps-poll * 1 page */\n\tRsvdPageLoc.LocPsPoll = TotalPageNum;\n\tDBG_871X(\"LocPsPoll: %d\\n\", RsvdPageLoc.LocPsPoll);\n\trtw_hal_construct_PSPoll(adapter,\n\t\t\t&ReservedPagePacket[BufIndex], &PSPollLength);\n\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t&ReservedPagePacket[BufIndex-TxDescLen],\n\t\t\tPSPollLength, _TRUE, _FALSE, _FALSE);\n\n\tCurtPktPageNum = (u8)PageNum((TxDescLen + PSPollLength), PageSize);\n\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n\n#ifdef CONFIG_BT_COEXIST\n\t/* BT Qos null data * 1 page */\n\tRsvdPageLoc.LocBTQosNull = TotalPageNum;\n\tDBG_871X(\"LocBTQosNull: %d\\n\", RsvdPageLoc.LocBTQosNull);\n\trtw_hal_construct_NullFunctionData(\n\t\t\tadapter,\n\t\t\t&ReservedPagePacket[BufIndex],\n\t\t\t&BTQosNullLength,\n\t\t\tget_my_bssid(&pmlmeinfo->network),\n\t\t\t_TRUE, 0, 0, _FALSE);\n\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t&ReservedPagePacket[BufIndex-TxDescLen],\n\t\t\tBTQosNullLength, _FALSE, _TRUE, _FALSE);\n\n\tCurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength, PageSize);\n\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n#endif /* CONFIG_BT_COEXIT */\n\n\t/* null data * 1 page */\n\tRsvdPageLoc.LocNullData = TotalPageNum;\n\tDBG_871X(\"LocNullData: %d\\n\", RsvdPageLoc.LocNullData);\n\trtw_hal_construct_NullFunctionData(\n\t\t\tadapter,\n\t\t\t&ReservedPagePacket[BufIndex],\n\t\t\t&NullDataLength,\n\t\t\tget_my_bssid(&pmlmeinfo->network),\n\t\t\t_FALSE, 0, 0, _FALSE);\n\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t&ReservedPagePacket[BufIndex-TxDescLen],\n\t\t\tNullDataLength, _FALSE, _FALSE, _FALSE);\n\n\tCurtPktPageNum = (u8)PageNum(TxDescLen + NullDataLength, PageSize);\n\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n\n\t//Qos null data * 1 page\n\tRsvdPageLoc.LocQosNull = TotalPageNum;\n\tDBG_871X(\"LocQosNull: %d\\n\", RsvdPageLoc.LocQosNull);\n\trtw_hal_construct_NullFunctionData(\n\t\t\tadapter,\n\t\t\t&ReservedPagePacket[BufIndex],\n\t\t\t&QosNullLength,\n\t\t\tget_my_bssid(&pmlmeinfo->network),\n\t\t\t_TRUE, 0, 0, _FALSE);\n\trtw_hal_fill_fake_txdesc(adapter,\n\t\t\t&ReservedPagePacket[BufIndex-TxDescLen],\n\t\t\tQosNullLength, _FALSE, _FALSE, _FALSE);\n\n\tCurtPktPageNum = (u8)PageNum(TxDescLen + QosNullLength, PageSize);\n\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n\n\tTotalPacketLen = BufIndex + QosNullLength;\n#ifdef CONFIG_WOWLAN\n\tif (pwrctl->wowlan_mode == _TRUE &&\n\t\t\tcheck_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\trtw_hal_set_wow_fw_rsvd_page(adapter, ReservedPagePacket,\n\t\t\t\tBufIndex, TxDescLen, PageSize,\n\t\t\t\t&TotalPageNum, &TotalPacketLen, &RsvdPageLoc);\n\t}\n#endif /* CONFIG_WOWLAN */\n\n#ifdef CONFIG_P2P_WOWLAN\n\tif(_TRUE == pwrctl->wowlan_p2p_mode) {\n\t\trtw_hal_set_p2p_wow_fw_rsvd_page(adapter, ReservedPagePacket,\n\t\t\t\tBufIndex, TxDescLen, PageSize,\n\t\t\t\t&TotalPageNum, &TotalPacketLen, &RsvdPageLoc);\n\t}\n#endif /* CONFIG_P2P_WOWLAN */\n\ndownload_page:\n\tDBG_871X(\"%s BufIndex(%d), TxDescLen(%d), PageSize(%d)\\n\",\n\t\t\t\t__func__, BufIndex, TxDescLen, PageSize);\n\tDBG_871X(\"%s PageNum(%d), pktlen(%d)\\n\",\n\t\t\t\t__func__, TotalPageNum, TotalPacketLen);\n\n\tif (TotalPacketLen > MaxRsvdPageBufSize) {\n\t\tDBG_871X(\"%s(ERROR): rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\\n\",\n\t\t\t\t__FUNCTION__, TotalPacketLen,MaxRsvdPageBufSize);\n\t\trtw_warn_on(1);\n\t\tgoto error;\n\t} else {\n\t\t/* update attribute */\n\t\tpattrib = &pcmdframe->attrib;\n\t\tupdate_mgntframe_attrib(adapter, pattrib);\n\t\tpattrib->qsel = QSLT_BEACON;\n\t\tpattrib->pktlen = TotalPacketLen - TxDescOffset;\n\t\tpattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\n#ifdef CONFIG_PCI_HCI\n\t\tdump_mgntframe(adapter, pcmdframe);\n#else\n\t\tdump_mgntframe_and_wait(adapter, pcmdframe, 100);\n#endif\n\t}\n\n\tDBG_871X(\"%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\\n\",\n\t\t\t__func__,TotalPacketLen,TotalPageNum);\n\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\trtw_hal_set_FwRsvdPage_cmd(adapter, &RsvdPageLoc);\n\t\tif (pwrctl->wowlan_mode == _TRUE)\n\t\t\trtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);\n#ifdef CONFIG_AP_WOWLAN\n\t\tif (pwrctl->wowlan_ap_mode == _TRUE)\n\t\t\trtw_hal_set_ap_rsvdpage_loc_cmd(adapter, &RsvdPageLoc);\n#endif /* CONFIG_AP_WOWLAN */\n\t} else if (pwrctl->wowlan_pno_enable) {\n#ifdef CONFIG_PNO_SUPPORT\n\t\trtw_hal_set_FwAoacRsvdPage_cmd(adapter, &RsvdPageLoc);\n\t\tif(pwrctl->pno_in_resume)\n\t\t\trtw_hal_set_scan_offload_info_cmd(adapter,\n\t\t\t\t\t&RsvdPageLoc, 0);\n\t\telse\n\t\t\trtw_hal_set_scan_offload_info_cmd(adapter,\n\t\t\t\t\t&RsvdPageLoc, 1);\n#endif /* CONFIG_PNO_SUPPORT */\n\t}\n#ifdef CONFIG_P2P_WOWLAN\n\tif(_TRUE == pwrctl->wowlan_p2p_mode)\n\t\trtw_hal_set_FwP2PRsvdPage_cmd(adapter, &RsvdPageLoc);\n#endif /* CONFIG_P2P_WOWLAN */\n\treturn;\nerror:\n\trtw_free_xmitframe(pxmitpriv, pcmdframe);\n}\n\nvoid SetHwReg(_adapter *adapter, u8 variable, u8 *val)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n_func_enter_;\n\n\tswitch (variable) {\n\t\tcase HW_VAR_PORT_SWITCH:\n\t\t\thw_var_port_switch(adapter);\n\t\t\tbreak;\n\t\tcase HW_VAR_INIT_RTS_RATE:\n\t\t{\n\t\t\tu16 brate_cfg = *((u16*)val);\n\t\t\tu8 rate_index = 0;\n\t\t\tHAL_VERSION *hal_ver = &hal_data->VersionID;\n\n\t\t\tif (IS_8188E(*hal_ver)) {\n\n\t\t\t\twhile (brate_cfg > 0x1) {\n\t\t\t\t\tbrate_cfg = (brate_cfg >> 1);\n\t\t\t\t\trate_index++;\n\t\t\t\t}\n\t\t\t\trtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);\n\t\t\t} else {\n\t\t\t\trtw_warn_on(1);\n\t\t\t}\n\t\t}\n\t\t\tbreak;\n\t\tcase HW_VAR_SEC_CFG:\n\t\t{\n\t\t\t#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)\n\t\t\t// enable tx enc and rx dec engine, and no key search for MC/BC\n\t\t\trtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);\n\t\t\t#elif defined(DYNAMIC_CAMID_ALLOC)\n\t\t\tu16 reg_scr_ori;\n\t\t\tu16 reg_scr;\n\n\t\t\treg_scr = reg_scr_ori = rtw_read16(adapter, REG_SECCFG);\n\t\t\treg_scr |= (SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);\n\n\t\t\tif (_rtw_camctl_chk_cap(adapter, SEC_CAP_CHK_BMC))\n\t\t\t\treg_scr |= SCR_CHK_BMC;\n\n\t\t\tif (_rtw_camctl_chk_flags(adapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))\n\t\t\t\treg_scr |= SCR_NoSKMC;\n\n\t\t\tif (reg_scr != reg_scr_ori)\n\t\t\t\trtw_write16(adapter, REG_SECCFG, reg_scr);\n\t\t\t#else\n\t\t\trtw_write8(adapter, REG_SECCFG, *((u8*)val));\n\t\t\t#endif\n\t\t}\n\t\t\tbreak;\n\t\tcase HW_VAR_SEC_DK_CFG:\n\t\t{\n\t\t\tstruct security_priv *sec = &adapter->securitypriv;\n\t\t\tu8 reg_scr = rtw_read8(adapter, REG_SECCFG);\n\n\t\t\tif (val) /* Enable default key related setting */\n\t\t\t{\n\t\t\t\treg_scr |= SCR_TXBCUSEDK;\n\t\t\t\tif (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)\n\t\t\t\t\treg_scr |= (SCR_RxUseDK|SCR_TxUseDK);\n\t\t\t}\n\t\t\telse /* Disable default key related setting */\n\t\t\t{\n\t\t\t\treg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);\n\t\t\t}\n\n\t\t\trtw_write8(adapter, REG_SECCFG, reg_scr);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_ASIX_IOT:\n\t\t\t// enable  ASIX IOT function\n\t\t\tif (*((u8*)val) == _TRUE) {\n\t\t\t\t// 0xa2e[0]=0 (disable rake receiver)\n\t\t\t\trtw_write8(adapter, rCCK0_FalseAlarmReport+2, \n\t\t\t\t\t\trtw_read8(adapter, rCCK0_FalseAlarmReport+2) & ~(BIT0));\n\t\t\t\t//  0xa1c=0xa0 (reset channel estimation if signal quality is bad)\n\t\t\t\trtw_write8(adapter, rCCK0_DSPParameter2, 0xa0);\n\t\t\t} else {\n\t\t\t// restore reg:0xa2e,   reg:0xa1c\n\t\t\t\trtw_write8(adapter, rCCK0_FalseAlarmReport+2, \n\t\t\t\t\t\trtw_read8(adapter, rCCK0_FalseAlarmReport+2)|(BIT0));\n\t\t\t\trtw_write8(adapter, rCCK0_DSPParameter2, 0x00);\n\t\t\t}\n\t\t\tbreak;\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\t\tcase HW_VAR_WOWLAN:\n\t\t{\n\t\t\tstruct wowlan_ioctl_param *poidparam;\n\t\t\t\n\t\t\tpoidparam = (struct wowlan_ioctl_param *)val;\n\t\t\tswitch (poidparam->subcode) {\n#ifdef CONFIG_WOWLAN\n\t\t\tcase WOWLAN_PATTERN_CLEAN:\n\t\t\t\trtw_hal_dl_pattern(adapter, _TRUE);\n\t\t\t\tbreak;\n\t\t\tcase WOWLAN_ENABLE:\n\t\t\t\trtw_hal_wow_enable(adapter);\n\t\t\t\tbreak;\n\t\t\tcase WOWLAN_DISABLE:\n\t\t\t\trtw_hal_wow_disable(adapter);\n\t\t\t\tbreak;\n#endif /*CONFIG_WOWLAN*/\n#ifdef CONFIG_AP_WOWLAN\n\t\t\tcase WOWLAN_AP_ENABLE:\n\t\t\t\trtw_hal_ap_wow_enable(adapter);\n\t\t\t\tbreak;\n\t\t\tcase WOWLAN_AP_DISABLE:\n\t\t\t\trtw_hal_ap_wow_disable(adapter);\n\t\t\t\tbreak;\n#endif /*CONFIG_AP_WOWLAN*/\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n#endif /*defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)*/\n\t\tdefault:\n\t\t\tif (0)\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" variable(%d) not defined!\\n\",\n\t\t\t\t\tFUNC_ADPT_ARG(adapter), variable);\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\nvoid GetHwReg(_adapter *adapter, u8 variable, u8 *val)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\n_func_enter_;\n\n\tswitch (variable) {\n\tcase HW_VAR_BASIC_RATE:\n\t\t*((u16*)val) = hal_data->BasicRateSet;\n\t\tbreak;\n\tcase HW_VAR_RF_TYPE:\n\t\t*((u8*)val) = hal_data->rf_type;\n\t\tbreak;\n\tdefault:\n\t\tif (0)\n\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" variable(%d) not defined!\\n\",\n\t\t\t\tFUNC_ADPT_ARG(adapter), variable);\n\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\nu8\nSetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)\n{\t\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tu8 bResult = _SUCCESS;\n\n\tswitch(variable) {\n\n\tcase HAL_DEF_DBG_DUMP_RXPKT:\n\t\thal_data->bDumpRxPkt = *((u8*)value);\n\t\tbreak;\n\tcase HAL_DEF_DBG_DUMP_TXPKT:\n\t\thal_data->bDumpTxPkt = *((u8*)value);\n\t\tbreak;\n\tcase HAL_DEF_ANT_DETECT:\n\t\thal_data->AntDetection = *((u8 *)value);\n\t\tbreak;\n\tcase HAL_DEF_DBG_DIS_PWT:\n\t\thal_data->bDisableTXPowerTraining = *((u8*)value);\n\t\tbreak;\t\n\tdefault:\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\\n\", __FUNCTION__, variable);\n\t\tbResult = _FAIL;\n\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\n#ifdef CONFIG_BEAMFORMING\nu8 rtw_hal_query_txbfer_rf_num(_adapter *adapter)\n{\n\tstruct registry_priv\t*pregistrypriv = &adapter->registrypriv;\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\t\n\tif ((pregistrypriv->beamformer_rf_num) && (IS_HARDWARE_TYPE_8814AE(adapter) || IS_HARDWARE_TYPE_8814AU(adapter) || IS_HARDWARE_TYPE_8822BU(adapter)))\n\t\treturn pregistrypriv->beamformer_rf_num;\n\telse if (IS_HARDWARE_TYPE_8814AE(adapter)\n/*\n#if defined(CONFIG_USB_HCI) \n\t||  (IS_HARDWARE_TYPE_8814AU(adapter) && (pUsbModeMech->CurUsbMode == 2 || pUsbModeMech->HubUsbMode == 2)) //for USB3.0\n#endif\n*/\n\t) {\t\n\t\t/*BF cap provided by Yu Chen, Sean, 2015, 01 */\n\t\tif (hal_data->rf_type == RF_3T3R) \n\t\t\treturn 2;\n\t\telse if (hal_data->rf_type == RF_4T4R)\n\t\t\treturn 3;\n\t\telse \n\t\t\treturn 1;\n\t} else\n\t\treturn 1;\n\t\n}\nu8 rtw_hal_query_txbfee_rf_num(_adapter *adapter)\n{\n\tstruct registry_priv\t\t*pregistrypriv = &adapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\t\n\tif ((pregistrypriv->beamformee_rf_num) && (IS_HARDWARE_TYPE_8814AE(adapter) || IS_HARDWARE_TYPE_8814AU(adapter) || IS_HARDWARE_TYPE_8822BU(adapter)))\n\t\treturn pregistrypriv->beamformee_rf_num;\n\telse if (IS_HARDWARE_TYPE_8814AE(adapter) || IS_HARDWARE_TYPE_8814AU(adapter)) {\n\t\tif (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_BROADCOM)\t\t\n\t\t\treturn 2;\t\t\n\t\telse\n\t\t\treturn 2;/*TODO: May be 3 in the future, by ChenYu. */\n\t} else\n\t\treturn 1;\n\t\t\n}\n#endif\n\nu8\nGetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tu8 bResult = _SUCCESS;\n\n\tswitch(variable) {\n\t\tcase HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:\n\t\t\t{\n\t\t\t\tstruct mlme_priv *pmlmepriv;\n\t\t\t\tstruct sta_priv *pstapriv;\n\t\t\t\tstruct sta_info *psta;\n\n\t\t\t\tpmlmepriv = &adapter->mlmepriv;\n\t\t\t\tpstapriv = &adapter->stapriv;\n\t\t\t\tpsta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);\n\t\t\t\tif (psta)\n\t\t\t\t{\n\t\t\t\t\t*((int*)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;     \n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase HAL_DEF_DBG_DUMP_RXPKT:\n\t\t\t*((u8*)value) = hal_data->bDumpRxPkt;\n\t\t\tbreak;\n\t\tcase HAL_DEF_DBG_DUMP_TXPKT:\n\t\t\t*((u8*)value) = hal_data->bDumpTxPkt;\n\t\t\tbreak;\n\t\tcase HAL_DEF_ANT_DETECT:\n\t\t\t*((u8 *)value) = hal_data->AntDetection;\n\t\t\tbreak;\n\t\tcase HAL_DEF_MACID_SLEEP:\n\t\t\t*(u8*)value = _FALSE;\n\t\t\tbreak;\n\t\tcase HAL_DEF_TX_PAGE_SIZE:\n\t\t\t*(( u32*)value) = PAGE_SIZE_128;\n\t\t\tbreak;\n\t\tcase HAL_DEF_DBG_DIS_PWT:\n\t\t\t*(u8*)value = hal_data->bDisableTXPowerTraining;\n\t\t\tbreak;\n#ifdef CONFIG_BEAMFORMING\n\t\tcase HAL_DEF_BEAMFORMER_CAP:\n\t\t\t*(u8 *)value = rtw_hal_query_txbfer_rf_num(adapter);\n\t\t\tbreak;\n\t\tcase HAL_DEF_BEAMFORMEE_CAP:\n\t\t\t*(u8 *)value = rtw_hal_query_txbfee_rf_num(adapter);\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\\n\", __FUNCTION__, variable);\n\t\t\tbResult = _FAIL;\n\t\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\nvoid SetHalODMVar(\n\tPADAPTER\t\t\t\tAdapter,\n\tHAL_ODM_VARIABLE\t\teVariable,\n\tPVOID\t\t\t\t\tpValue1,\n\tBOOLEAN\t\t\t\t\tbSet)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T podmpriv = &pHalData->odmpriv;\n\t//_irqL irqL;\n\tswitch(eVariable){\n\t\tcase HAL_ODM_STA_INFO:\n\t\t\t{\t\n\t\t\t\tstruct sta_info *psta = (struct sta_info *)pValue1;\t\t\t\t\n\t\t\t\tif(bSet){\n\t\t\t\t\tDBG_8192C(\"### Set STA_(%d) info ###\\n\",psta->mac_id);\n\t\t\t\t\tODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tDBG_8192C(\"### Clean STA_(%d) info ###\\n\",psta->mac_id);\n\t\t\t\t\t//_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);\n\t\t\t\t\tODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);\n\t\t\t\t\t\n\t\t\t\t\t//_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);\n\t\t\t            }\n\t\t\t}\n\t\t\tbreak;\n\t\tcase HAL_ODM_P2P_STATE:\t\t\n\t\t\t\tODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);\n\t\t\tbreak;\n\t\tcase HAL_ODM_WIFI_DISPLAY_STATE:\n\t\t\t\tODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);\n\t\t\tbreak;\n\t\tcase HAL_ODM_REGULATION:\n\t\t\t\tODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);\n\t\t\t\tODM_CmnInfoInit(podmpriv, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);\n\t\t\tbreak;\n#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\t\t\n\t\tcase HAL_ODM_NOISE_MONITOR:\n\t\t\t{\n\t\t\t\tstruct noise_info *pinfo = (struct noise_info *)pValue1;\n\n\t\t\t\t#ifdef DBG_NOISE_MONITOR\n\t\t\t\tDBG_8192C(\"### Noise monitor chan(%d)-bPauseDIG:%d,IGIValue:0x%02x,max_time:%d (ms) ###\\n\",\n\t\t\t\t\tpinfo->chan,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tpHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);\t\t\t\t\n\t\t\t\tDBG_871X(\"chan_%d, noise = %d (dBm)\\n\",pinfo->chan,pHalData->noise[pinfo->chan]);\n\t\t\t\t#ifdef DBG_NOISE_MONITOR\n\t\t\t\tDBG_871X(\"noise_a = %d, noise_b = %d  noise_all:%d \\n\", \n\t\t\t\t\tpodmpriv->noise_level.noise[ODM_RF_PATH_A], \n\t\t\t\t\tpodmpriv->noise_level.noise[ODM_RF_PATH_B],\n\t\t\t\t\tpodmpriv->noise_level.noise_all);\t\t\t\t\t\t\n\t\t\t\t#endif\n\t\t\t}\n\t\t\tbreak;\n#endif/*#ifdef CONFIG_BACKGROUND_NOISE_MONITOR*/\n\n\t\tcase HAL_ODM_INITIAL_GAIN:\n\t\t\t{\n\t\t\t\tu8 rx_gain = *((u8 *)(pValue1));\n\t\t\t\t/*printk(\"rx_gain:%x\\n\",rx_gain);*/\n\t\t\t\tif (rx_gain == 0xff) {/*restore rx gain*/\n\t\t\t\t\t/*ODM_Write_DIG(podmpriv,pDigTable->BackupIGValue);*/\n\t\t\t\t\todm_PauseDIG(podmpriv, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, rx_gain);\n\t\t\t\t} else {\n\t\t\t\t\t/*pDigTable->BackupIGValue = pDigTable->CurIGValue;*/\n\t\t\t\t\t/*ODM_Write_DIG(podmpriv,rx_gain);*/\n\t\t\t\t\todm_PauseDIG(podmpriv, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, rx_gain);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\t\t\n\t\tcase HAL_ODM_FA_CNT_DUMP:\n\t\t\tif (*((u8 *)pValue1))\n\t\t\t\tpodmpriv->DebugComponents |= (ODM_COMP_DIG | ODM_COMP_FA_CNT);\n\t\t\telse\n\t\t\t\tpodmpriv->DebugComponents &= ~(ODM_COMP_DIG | ODM_COMP_FA_CNT);\n\t\t\tbreak;\n\t\tcase HAL_ODM_DBG_FLAG:\n\t\t\tODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_DBG_COMP, *((u8Byte *)pValue1));\n\t\t\tbreak;\n\t\tcase HAL_ODM_DBG_LEVEL:\n\t\t\tODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_DBG_LEVEL, *((u4Byte *)pValue1));\n\t\t\tbreak;\n\t\tcase HAL_ODM_RX_INFO_DUMP:\n\t\t{\n\t\t\tPFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(podmpriv , PHYDM_FALSEALMCNT);\n\t\t\tpDIG_T\tpDM_DigTable = &podmpriv->DM_DigTable;\n\n\t\t\tDBG_871X(\"============ Rx Info dump ===================\\n\");\n\t\t\tDBG_871X(\"bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x\\n\",\n\t\t\t\tpodmpriv->bLinked, podmpriv->RSSI_Min, pDM_DigTable->CurIGValue);\t\t\t\n\t\t\tif (FalseAlmCnt)\n\t\t\t\tDBG_871X(\"Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\\n\",\n\t\t\t\t\tFalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all);\n\n\t\t\tif (podmpriv->bLinked) {\n\t\t\t\tDBG_871X(\"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\\n\", \n\t\t\t\t\tHDATA_RATE(podmpriv->RxRate), podmpriv->RSSI_A, podmpriv->RSSI_B);\t\n\n\t\t\t\t#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA\n\t\t\t\trtw_dump_raw_rssi_info(Adapter);\n\t\t\t\t#endif\n\t\t\t}\n\t\t}\t\t\n\t\tbreak;\n\tcase HAL_ODM_RX_Dframe_INFO: {\n\t\tvoid *sel;\n\n\t\tsel = pValue1;\n\n\t\t/*_RTW_PRINT_SEL(sel , \"HAL_ODM_RX_Dframe_INFO\\n\");*/\n#ifdef DBG_RX_DFRAME_RAW_DATA\n\t\trtw_dump_rx_dframe_info(Adapter, sel);\n#endif\n\t}\n\t\tbreak;\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\t\tcase HAL_ODM_AUTO_CHNL_SEL:\n\t\t{\n\t\t\tACS_OP\tacs_op = *(ACS_OP *)pValue1;\n\n\t\t\trtw_phydm_func_set(Adapter, ODM_BB_NHM_CNT);\n\n\t\t\tif (ACS_INIT == acs_op) {\n\t\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] HAL_ODM_AUTO_CHNL_SEL: ACS_INIT\\n\", ADPT_ARG(Adapter));\n\t\t\t\t#endif\n\t\t\t\todm_AutoChannelSelectInit(podmpriv); \n\t\t\t} else if (ACS_RESET == acs_op) {\n\t\t\t\t/* Reset statistics for auto channel selection mechanism.*/\n\t\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] HAL_ODM_AUTO_CHNL_SEL: ACS_RESET\\n\", ADPT_ARG(Adapter));\n\t\t\t\t#endif\n\t\t\t\todm_AutoChannelSelectReset(podmpriv);\n\t\t\t\t\n\t\t\t} else if (ACS_SELECT == acs_op) {\n\t\t\t\t/* Collect NHM measurement result after current channel */\n\t\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] HAL_ODM_AUTO_CHNL_SEL: ACS_SELECT, CH(%d)\\n\", ADPT_ARG(Adapter), rtw_get_acs_channel(Adapter));\n\t\t\t\t#endif\n\t\t\t\todm_AutoChannelSelect(podmpriv, rtw_get_acs_channel(Adapter));\n\t\t\t} else \n\t\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] HAL_ODM_AUTO_CHNL_SEL: Unexpected OP\\n\", ADPT_ARG(Adapter));\n\n\t\t}\n\t\tbreak;\n#endif\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\t\n\nvoid GetHalODMVar(\t\n\tPADAPTER\t\t\t\tAdapter,\n\tHAL_ODM_VARIABLE\t\teVariable,\n\tPVOID\t\t\t\t\tpValue1,\n\tPVOID\t\t\t\t\tpValue2)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T podmpriv = &pHalData->odmpriv;\n\t\n\tswitch (eVariable) {\n#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\tcase HAL_ODM_NOISE_MONITOR:\n\t\t{\n\t\t\tu8 chan = *(u8 *)pValue1;\n\t\t\t*(s16 *)pValue2 = pHalData->noise[chan];\n\t\t\t#ifdef DBG_NOISE_MONITOR\n\t\t\tDBG_8192C(\"### Noise monitor chan(%d)-noise:%d (dBm) ###\\n\",\n\t\t\t\tchan, pHalData->noise[chan]);\n\t\t\t#endif\n\t\t}\n\t\tbreak;\n#endif/*#ifdef CONFIG_BACKGROUND_NOISE_MONITOR*/\n\tcase HAL_ODM_DBG_FLAG:\n\t\t*((u8Byte *)pValue1) = podmpriv->DebugComponents;\n\t\tbreak;\n\tcase HAL_ODM_DBG_LEVEL:\n\t\t*((u4Byte *)pValue1) = podmpriv->DebugLevel;\n\t\tbreak;\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tcase HAL_ODM_AUTO_CHNL_SEL:\n\t\t{\n\t\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] HAL_ODM_AUTO_CHNL_SEL: GET_BEST_CHAN\\n\", ADPT_ARG(Adapter));\n\t\t\t#endif\t\n\t\t\t/* Retrieve better channel from NHM mechanism\t*/\n\t\t\tif (IsSupported24G(Adapter->registrypriv.wireless_mode)) \n\t\t\t\t*((u8 *)(pValue1)) = ODM_GetAutoChannelSelectResult(podmpriv, BAND_ON_2_4G);\n\t\t\tif (IsSupported5G(Adapter->registrypriv.wireless_mode)) \n\t\t\t\t*((u8 *)(pValue2)) = ODM_GetAutoChannelSelectResult(podmpriv, BAND_ON_5G);\n\t\t}\n\t\tbreak;\n#endif\n\tcase HAL_ODM_INITIAL_GAIN:\n\t\t{\n\t\t\tpDIG_T pDM_DigTable = &podmpriv->DM_DigTable;\n\t\t\t*((u8 *)pValue1) = pDM_DigTable->CurIGValue;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n\nu32 rtw_phydm_ability_ops(_adapter *adapter, HAL_PHYDM_OPS ops, u32 ability)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);\n\tPDM_ODM_T podmpriv = &pHalData->odmpriv;\n\tu32 result = 0;\n\t\n\tswitch (ops) {\n\tcase HAL_PHYDM_DIS_ALL_FUNC:\n\t\tpodmpriv->SupportAbility = DYNAMIC_FUNC_DISABLE;\n\t\tbreak;\n\tcase HAL_PHYDM_FUNC_SET:\n\t\tpodmpriv->SupportAbility |= ability;\n\t\tbreak;\n\tcase HAL_PHYDM_FUNC_CLR:\n\t\tpodmpriv->SupportAbility &= ~(ability);\n\t\tbreak;\t\t\t\n\tcase HAL_PHYDM_ABILITY_BK:\n\t\t/* dm flag backup*/\n\t\tpodmpriv->BK_SupportAbility = podmpriv->SupportAbility;\n\t\tbreak;\n\tcase HAL_PHYDM_ABILITY_RESTORE:\n\t\t/* restore dm flag */\n\t\tpodmpriv->SupportAbility = podmpriv->BK_SupportAbility;\n\t\tbreak;\n\tcase HAL_PHYDM_ABILITY_SET:\n\t\tpodmpriv->SupportAbility = ability;\n\t\tbreak;\n\tcase HAL_PHYDM_ABILITY_GET:\n\t\tresult = podmpriv->SupportAbility;\n\t\tbreak;\n\t}\n\treturn result;\n}\n\n\nBOOLEAN \neqNByte(\n\tu8*\tstr1,\n\tu8*\tstr2,\n\tu32\tnum\n\t)\n{\n\tif(num==0)\n\t\treturn _FALSE;\n\twhile(num>0)\n\t{\n\t\tnum--;\n\t\tif(str1[num]!=str2[num])\n\t\t\treturn _FALSE;\n\t}\n\treturn _TRUE;\n}\n\n//\n//\tDescription:\n//\t\tReturn TRUE if chTmp is represent for hex digit and \n//\t\tFALSE otherwise.\n//\n//\nBOOLEAN\nIsHexDigit(\n\tIN\t\tchar\t\tchTmp\n)\n{\n\tif( (chTmp >= '0' && chTmp <= '9') ||  \n\t\t(chTmp >= 'a' && chTmp <= 'f') ||\n\t\t(chTmp >= 'A' && chTmp <= 'F') )\n\t{\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FALSE;\n\t}\n}\n\n\n//\n//\tDescription:\n//\t\tTranslate a character to hex digit.\n//\nu32\nMapCharToHexDigit(\n\tIN\t\tchar\t\tchTmp\n)\n{\n\tif(chTmp >= '0' && chTmp <= '9')\n\t\treturn (chTmp - '0');\n\telse if(chTmp >= 'a' && chTmp <= 'f')\n\t\treturn (10 + (chTmp - 'a'));\n\telse if(chTmp >= 'A' && chTmp <= 'F') \n\t\treturn (10 + (chTmp - 'A'));\n\telse\n\t\treturn 0;\t\n}\n\n\n\n//\n//\tDescription:\n//\t\tParse hex number from the string pucStr.\n//\nBOOLEAN \nGetHexValueFromString(\n\tIN\t\tchar*\t\t\tszStr,\n\tIN OUT\tu32*\t\t\tpu4bVal,\n\tIN OUT\tu32*\t\t\tpu4bMove\n)\n{\n\tchar*\t\tszScan = szStr;\n\n\t// Check input parameter.\n\tif(szStr == NULL || pu4bVal == NULL || pu4bMove == NULL)\n\t{\n\t\tDBG_871X(\"GetHexValueFromString(): Invalid inpur argumetns! szStr: %p, pu4bVal: %p, pu4bMove: %p\\n\", szStr, pu4bVal, pu4bMove);\n\t\treturn _FALSE;\n\t}\n\n\t// Initialize output.\n\t*pu4bMove = 0;\n\t*pu4bVal = 0;\n\n\t// Skip leading space.\n\twhile(\t*szScan != '\\0' && \n\t\t\t(*szScan == ' ' || *szScan == '\\t') )\n\t{\n\t\tszScan++;\n\t\t(*pu4bMove)++;\n\t}\n\n\t// Skip leading '0x' or '0X'.\n\tif(*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X'))\n\t{\n\t\tszScan += 2;\n\t\t(*pu4bMove) += 2;\n\t}\t\n\n\t// Check if szScan is now pointer to a character for hex digit, \n\t// if not, it means this is not a valid hex number.\n\tif(!IsHexDigit(*szScan))\n\t{\n\t\treturn _FALSE;\n\t}\n\n\t// Parse each digit.\n\tdo\n\t{\n\t\t(*pu4bVal) <<= 4;\n\t\t*pu4bVal += MapCharToHexDigit(*szScan);\n\n\t\tszScan++;\n\t\t(*pu4bMove)++;\n\t} while(IsHexDigit(*szScan));\n\n\treturn _TRUE;\n}\n\nBOOLEAN \nGetFractionValueFromString(\n\tIN\t\tchar*\t\t\tszStr,\n\tIN OUT\tu8*\t\t\t\tpInteger,\n\tIN OUT\tu8*\t\t\t\tpFraction,\n\tIN OUT\tu32*\t\t\tpu4bMove\n)\n{\n\tchar\t*szScan = szStr;\n\n\t// Initialize output.\n\t*pu4bMove = 0;\n\t*pInteger = 0;\n\t*pFraction = 0;\n\n\t// Skip leading space.\n\twhile (\t*szScan != '\\0' && \t(*szScan == ' ' || *szScan == '\\t') ) {\n\t\t++szScan;\n\t\t++(*pu4bMove);\n\t}\n\n\t// Parse each digit.\n\tdo {\n\t\t(*pInteger) *= 10;\n\t\t*pInteger += ( *szScan - '0' );\n\n\t\t++szScan;\n\t\t++(*pu4bMove);\n\n\t\tif ( *szScan == '.' ) \n\t\t{\n\t\t\t++szScan;\n\t\t\t++(*pu4bMove);\n\t\t\t\n\t\t\tif ( *szScan < '0' || *szScan > '9' )\n\t\t\t\treturn _FALSE;\n\t\t\telse {\n\t\t\t\t*pFraction = *szScan - '0';\n\t\t\t\t++szScan;\n\t\t\t\t++(*pu4bMove);\n\t\t\t\treturn _TRUE;\n\t\t\t}\n\t\t}\n\t} while(*szScan >= '0' && *szScan <= '9');\n\n\treturn _TRUE;\n}\n\n//\n//\tDescription:\n//\t\tReturn TRUE if szStr is comment out with leading \"//\".\n//\nBOOLEAN\nIsCommentString(\n\tIN\t\tchar\t\t\t*szStr\n)\n{\n\tif(*szStr == '/' && *(szStr+1) == '/')\n\t{\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\treturn _FALSE;\n\t}\n}\n\nBOOLEAN\nGetU1ByteIntegerFromStringInDecimal(\n\tIN\t\tchar*\tStr,\n\tIN OUT\tu8*\t\tpInt\n\t)\n{\n\tu16 i = 0;\n\t*pInt = 0;\n\n\twhile ( Str[i] != '\\0' )\n\t{\n\t\tif ( Str[i] >= '0' && Str[i] <= '9' )\n\t\t{\n\t\t\t*pInt *= 10;\n\t\t\t*pInt += ( Str[i] - '0' );\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn _FALSE;\n\t\t}\n\t\t++i;\n\t}\n\n\treturn _TRUE;\n}\n\n// <20121004, Kordan> For example, \n// ParseQualifiedString(inString, 0, outString, '[', ']') gets \"Kordan\" from a string \"Hello [Kordan]\".\n// If RightQualifier does not exist, it will hang on in the while loop\nBOOLEAN \nParseQualifiedString(\n    IN\t\tchar*\tIn, \n    IN OUT\tu32*\tStart, \n    OUT\t\tchar*\tOut, \n    IN\t\tchar\t\tLeftQualifier, \n    IN\t\tchar\t\tRightQualifier\n    )\n{\n\tu32\ti = 0, j = 0;\n\tchar\tc = In[(*Start)++];\n\n\tif (c != LeftQualifier)\n\t\treturn _FALSE;\n\n\ti = (*Start);\n\twhile ((c = In[(*Start)++]) != RightQualifier) \n\t\t; // find ']'\n\tj = (*Start) - 2;\n\tstrncpy((char *)Out, (const char*)(In+i), j-i+1);\n\n\treturn _TRUE;\n}\n\nBOOLEAN\nisAllSpaceOrTab(\n\tu8*\tdata,\n\tu8\tsize\n\t)\n{\n\tu8\tcnt = 0, NumOfSpaceAndTab = 0;\n\n\twhile( size > cnt )\n\t{\n\t\tif ( data[cnt] == ' ' || data[cnt] == '\\t' || data[cnt] == '\\0' )\n\t\t\t++NumOfSpaceAndTab;\n\n\t\t++cnt;\n\t}\n\n\treturn size == NumOfSpaceAndTab;\n}\n\n\nvoid rtw_hal_check_rxfifo_full(_adapter *adapter)\n{\n\tstruct dvobj_priv *psdpriv = adapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(adapter);\n\tint save_cnt=_FALSE;\n\t\n\t//switch counter to RX fifo\n\tif (IS_8188E(pHalData->VersionID) || IS_8188F(pHalData->VersionID)\n\t\t|| IS_8812_SERIES(pHalData->VersionID) || IS_8821_SERIES(pHalData->VersionID)\n\t\t|| IS_8723B_SERIES(pHalData->VersionID) || IS_8192E(pHalData->VersionID) || IS_8703B_SERIES(pHalData->VersionID))\n\t{\n\t\trtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0);\n\t\tsave_cnt = _TRUE;\n\t}\n\telse \n\t{\n\t\t//todo: other chips \n\t}\n\t\n\t\t\n\tif (save_cnt) {\n\t\tpdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;\n\t\tpdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);\n\t\tpdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;\n\t} else {\n\t\t/* special value to indicate no implementation */\n\t\tpdbgpriv->dbg_rx_fifo_last_overflow = 1;\n\t\tpdbgpriv->dbg_rx_fifo_curr_overflow = 1;\n\t\tpdbgpriv->dbg_rx_fifo_diff_overflow = 1;\n\t}\n}\n\nvoid linked_info_dump(_adapter *padapter,u8 benable)\n{\t\t\t\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\tif(padapter->bLinkInfoDump == benable)\n\t\treturn;\n\t\n\tDBG_871X(\"%s %s \\n\",__FUNCTION__,(benable)?\"enable\":\"disable\");\n\t\t\t\t\t\t\t\t\t\t\n\tif(benable){\n\t\t#ifdef CONFIG_LPS\n\t\tpwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;//keep org value\n\t\trtw_pm_set_lps(padapter,PS_MODE_ACTIVE);\n\t\t#endif\t\n\t\t\t\t\t\t\t\t\n\t\t#ifdef CONFIG_IPS\t\n\t\tpwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;//keep org value\n\t\trtw_pm_set_ips(padapter,IPS_NONE);\n\t\t#endif\t\n\t}\n\telse{\n\t\t#ifdef CONFIG_IPS\t\t\n\t\trtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);\n\t\t#endif // CONFIG_IPS\n\n\t\t#ifdef CONFIG_LPS\t\n\t\trtw_pm_set_lps(padapter, pwrctrlpriv->org_power_mgnt );\n\t\t#endif // CONFIG_LPS\n\t}\n\tpadapter->bLinkInfoDump = benable ;\t\n}\n\n#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA\nvoid rtw_get_raw_rssi_info(void *sel, _adapter *padapter)\n{\n\tu8 isCCKrate,rf_path;\n\tPHAL_DATA_TYPE\tpHalData =  GET_HAL_DATA(padapter);\n\tstruct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;\n\t\n\tDBG_871X_SEL_NL(sel,\"RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\\n\", \n\t\t\tHDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);\n\tisCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;\n\n\tif(isCCKrate)\n\t\tpsample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;\n\t\t\n\tfor(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)\n\t{\n\t\tDBG_871X_SEL_NL(sel, \"RF_PATH_%d=>signal_strength:%d(%%),signal_quality:%d(%%)\\n\"\n\t\t\t, rf_path, psample_pkt_rssi->mimo_signal_strength[rf_path], psample_pkt_rssi->mimo_signal_quality[rf_path]);\n\t\t\n\t\tif(!isCCKrate){\n\t\t\tDBG_871X_SEL_NL(sel,\"\\trx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\\n\",\n\t\t\tpsample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);\n\t\t}\n\t}\t\n}\n\nvoid rtw_dump_raw_rssi_info(_adapter *padapter)\n{\n\tu8 isCCKrate,rf_path;\n\tPHAL_DATA_TYPE\tpHalData =  GET_HAL_DATA(padapter);\n\tstruct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;\n\tDBG_871X(\"============ RAW Rx Info dump ===================\\n\");\n\tDBG_871X(\"RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\\n\", \n\t\t\tHDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);\t\n\n\tisCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE;\n\n\tif(isCCKrate)\n\t\tpsample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;\n\t\t\n\tfor(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++)\n\t{\n\t\tDBG_871X(\"RF_PATH_%d=>signal_strength:%d(%%),signal_quality:%d(%%)\"\n\t\t\t, rf_path, psample_pkt_rssi->mimo_signal_strength[rf_path], psample_pkt_rssi->mimo_signal_quality[rf_path]);\n\t\t\n\t\tif(!isCCKrate){\n\t\t\tprintk(\",rx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\\n\",\n\t\t\tpsample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]);\n\t\t}else{\n\t\t\tprintk(\"\\n\");\t\n\t\t}\n\t}\t\n}\n#endif\n\n#ifdef DBG_RX_DFRAME_RAW_DATA\nvoid rtw_dump_rx_dframe_info(_adapter *padapter, void *sel)\n{\n\t_irqL irqL;\n\tu8 isCCKrate, rf_path;\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\tPHAL_DATA_TYPE\tpHalData =  GET_HAL_DATA(padapter);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta;\n\tstruct sta_recv_dframe_info *psta_dframe_info;\n\tint i;\n\t_list\t*plist, *phead;\n\tchar *BW;\n\tu8 bc_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu8 null_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\n\tif (precvpriv->store_law_data_flag) {\n\n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\tfor (i = 0; i < NUM_STA; i++) {\n\t\t\tphead = &(pstapriv->sta_hash[i]);\n\t\t\tplist = get_next(phead);\n\n\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\t\tplist = get_next(plist);\n\n\t\t\t\tif (psta) {\n\t\t\t\t\tpsta_dframe_info = &psta->sta_dframe_info;\n\t\t\t\t\tif ((_rtw_memcmp(psta->hwaddr, bc_addr, 6)  !=   _TRUE)\n\t\t\t\t\t&& (_rtw_memcmp(psta->hwaddr, null_addr, 6)  !=  _TRUE)\n\t\t\t\t\t&& (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), 6)  !=  _TRUE)) {\n\n\n\t\t\t\t\t\tisCCKrate = (psta_dframe_info->sta_data_rate <= DESC_RATE11M)?TRUE : FALSE;\n\n\t\t\t\t\t\tswitch (psta_dframe_info->sta_bw_mode) {\n\n\t\t\t\t\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\t\t\t\tBW = \"20M\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\t\t\t\tBW = \"40M\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\t\t\t\tBW = \"80M\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase CHANNEL_WIDTH_160:\n\t\t\t\t\t\t\tBW = \"160M\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tBW = \"\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tDBG_871X_SEL_NL(sel, \"==============================\\n\");\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"macaddr =\" MAC_FMT \"\\n\", MAC_ARG(psta->hwaddr));\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"BW=%s, sgi =%d\\n\", BW, psta_dframe_info->sta_sgi);\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"RxRate = %s\\n\", HDATA_RATE(psta_dframe_info->sta_data_rate));\n\n\t\t\t\t\t\tfor (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {\n\n\t\t\t\t\t\t\tif (!isCCKrate) {\n\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel , \"RF_PATH_%d RSSI:%d(dBM)\", rf_path, psta_dframe_info->sta_RxPwr[rf_path]);\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel , \",rx_ofdm_snr:%d(dB)\\n\", psta_dframe_info->sta_ofdm_snr[rf_path]);\n\n\t\t\t\t\t\t\t} else\n\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel , \"RF_PATH_%d RSSI:%d(dBM)\\n\", rf_path, (psta_dframe_info->sta_mimo_signal_strength[rf_path])-100);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t}\n}\n#endif\nvoid rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe)\t\n{\n\tu8 isCCKrate, rf_path , dframe_type;\n\tu8 *ptr;\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n#ifdef DBG_RX_DFRAME_RAW_DATA\n\tstruct sta_recv_dframe_info *psta_dframe_info;\n#endif\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\tPHAL_DATA_TYPE\tpHalData =  GET_HAL_DATA(padapter);\n\tstruct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;\n\tstruct sta_info *psta = prframe->u.hdr.psta;\n\tPODM_PHY_INFO_T pPhyInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);\n\tstruct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;\n\tpsample_pkt_rssi->data_rate = pattrib->data_rate;\n\tptr = prframe->u.hdr.rx_data;\n\tdframe_type = GetFrameType(ptr);\n\t/*RTW_INFO(\"=>%s\\n\", __FUNCTION__);*/\n\n\n\tif (precvpriv->store_law_data_flag) {\n\t\tisCCKrate = (pattrib->data_rate <= DESC_RATE11M)?TRUE :FALSE;\n\n\t\tpsample_pkt_rssi->pwdball = pPhyInfo->RxPWDBAll;\n\t\tpsample_pkt_rssi->pwr_all = pPhyInfo->RecvSignalPower;\n\n\t\tfor (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {\n\t\t\tpsample_pkt_rssi->mimo_signal_strength[rf_path] = pPhyInfo->RxMIMOSignalStrength[rf_path];\n\t\t\tpsample_pkt_rssi->mimo_signal_quality[rf_path] = pPhyInfo->RxMIMOSignalQuality[rf_path];\n\t\t\tif(!isCCKrate){\n\t\t\t\tpsample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];\n\t\t\t\tpsample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];\t\t\n\t\t\t}\n\t\t}\n#ifdef DBG_RX_DFRAME_RAW_DATA\n\t\tif (dframe_type == WIFI_DATA_TYPE  || dframe_type == WIFI_QOS_DATA_TYPE) {\n\n\t\t\t/*RTW_INFO(\"=>%s WIFI_DATA_TYPE or WIFI_QOS_DATA_TYPE\\n\", __FUNCTION__);*/\n\t\t\tif (psta) {\n\t\t\t\tpsta_dframe_info = &psta->sta_dframe_info;\n\t\t\t\t/*RTW_INFO(\"=>%s psta->hwaddr=\"MAC_FMT\" !\\n\", __FUNCTION__, MAC_ARG(psta->hwaddr));*/\n\t\t\t\tif (_rtw_memcmp(psta->hwaddr, bc_addr, ETH_ALEN)  !=  _TRUE) {\n\n\t\t\t\t\tpsta_dframe_info->sta_data_rate = pattrib->data_rate;\n\t\t\t\t\tpsta_dframe_info->sta_sgi = pattrib->sgi;\n\t\t\t\t\tpsta_dframe_info->sta_bw_mode = pattrib->bw;\n\t\t\t\t\tfor (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {\n\n\t\t\t\t\t\tpsta_dframe_info->sta_mimo_signal_strength[rf_path] = (pPhyInfo->RxMIMOSignalStrength[rf_path]);/*Percentage to dbm*/\n\n\t\t\t\t\t\tif (!isCCKrate) {\n\t\t\t\t\t\t\tpsta_dframe_info->sta_ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];\n\t\t\t\t\t\t\tpsta_dframe_info->sta_RxPwr[rf_path] = pPhyInfo->RxPwr[rf_path];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t}\n\n}\n\n\nint check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\tu8* pContent = pHalData->efuse_eeprom_data;\n\tint index = 0;\n\tu16 tx_index_offset = 0x0000;\n\n\tswitch (rtw_get_chip_type(padapter)) {\n\t\tcase RTL8723B:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8723B;\n\t\tbreak;\n\t\tcase RTL8703B:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8703B;\n\t\tbreak;\n\t\tcase RTL8188E:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_88E;\n\t\tbreak;\n\t\tcase RTL8188F:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8188F;\n\t\tbreak;\n\t\tcase RTL8192E:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8192E;\n\t\tbreak;\n\t\tcase RTL8821:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8821;\n\t\tbreak;\n\t\tcase RTL8812:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8812;\n\t\tbreak;\n\t\tcase RTL8814A:\n\t\t\ttx_index_offset = EEPROM_TX_PWR_INX_8814;\n\t\tbreak;\n\t\tdefault:\n\t\t\ttx_index_offset = 0x0010;\n\t\tbreak;\n\t}\n\n\t/* TODO: chacking length by ICs */\n\tfor (index = 0 ; index < 11 ; index++) {\n\t\tif (pContent[tx_index_offset + index] == 0xFF)\n\t\t\treturn _FALSE;\n\t}\n\treturn _TRUE;\n}\n\nint hal_efuse_macaddr_offset(_adapter *adapter)\n{\n\tu8 interface_type = 0;\n\tint addr_offset = -1;\n\n\tinterface_type = rtw_get_intf_type(adapter);\n\n\tswitch (rtw_get_chip_type(adapter)) {\n#ifdef CONFIG_RTL8723B\n\tcase RTL8723B:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8723BU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8723BS;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8723BE;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8703B\n\tcase RTL8703B:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8703BU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8703BS;\n\tbreak;\n#endif\n#ifdef CONFIG_RTL8188E\n\tcase RTL8188E:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_88EU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_88ES;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_88EE;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8188F\n\tcase RTL8188F:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8188FU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8188FS;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8812A\n\tcase RTL8812:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8812AU;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8812AE;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8821A\n\tcase RTL8821:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8821AU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8821AS;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8821AE;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8192E\n\tcase RTL8192E:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8192EU;\n\t\telse if (interface_type == RTW_SDIO)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8192ES;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8192EE;\n\t\tbreak;\n#endif\n#ifdef CONFIG_RTL8814A\n\tcase RTL8814A:\n\t\tif (interface_type == RTW_USB)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8814AU;\n\t\telse if (interface_type == RTW_PCIE)\n\t\t\taddr_offset = EEPROM_MAC_ADDR_8814AE;\n\t\tbreak;\n#endif\n\t}\n\n\tif (addr_offset == -1) {\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s: unknown combination - chip_type:%u, interface:%u\\n\"\n\t\t\t, __func__, rtw_get_chip_type(adapter), rtw_get_intf_type(adapter));\n\t}\n\n\treturn addr_offset;\n}\n\nint Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8 *mac_addr)\n{\n\tint ret = _FAIL;\n\tint addr_offset;\n\n\taddr_offset = hal_efuse_macaddr_offset(padapter);\n\tif (addr_offset == -1)\n\t\tgoto exit;\n\n\tret = rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);\n\nexit:\n\treturn ret;\n}\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\nu32 Hal_readPGDataFromConfigFile(PADAPTER padapter)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);\n\tu32 ret;\n\n\tret = rtw_read_efuse_from_file(EFUSE_MAP_PATH, hal_data->efuse_eeprom_data);\n\thal_data->efuse_file_status = ((ret == _FAIL) ? EFUSE_FILE_FAILED : EFUSE_FILE_LOADED);\n\n\treturn ret;\n}\n\nu32 Hal_ReadMACAddrFromFile(PADAPTER padapter, u8 *mac_addr)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);\n\tu32 ret = _FAIL;\n\n\tif (rtw_read_macaddr_from_file(WIFIMAC_PATH, mac_addr) == _SUCCESS\n\t\t&& rtw_check_invalid_mac_address(mac_addr, _TRUE) == _FALSE\n\t) {\n\t\thal_data->macaddr_file_status = MACADDR_FILE_LOADED;\n\t\tret = _SUCCESS;\n\t} else {\n\t\thal_data->macaddr_file_status = MACADDR_FILE_FAILED;\n\t}\n\n\treturn ret;\n}\n#endif /* CONFIG_EFUSE_CONFIG_FILE */\n\nint hal_config_macaddr(_adapter *adapter, bool autoload_fail)\n{\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tu8 addr[ETH_ALEN];\n\tint addr_offset = hal_efuse_macaddr_offset(adapter);\n\tu8 *hw_addr = NULL;\n\tint ret = _SUCCESS;\n\n\tif (autoload_fail)\n\t\tgoto bypass_hw_pg;\n\n\tif (addr_offset != -1)\n\t\thw_addr = &hal_data->efuse_eeprom_data[addr_offset];\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n\t/* if the hw_addr is written by efuse file, set to NULL */\n\tif (hal_data->efuse_file_status == EFUSE_FILE_LOADED)\n\t\thw_addr = NULL;\n#endif\n\n\tif (!hw_addr) {\n\t\t/* try getting hw pg data */\n\t\tif (Hal_GetPhyEfuseMACAddr(adapter, addr) == _SUCCESS)\n\t\t\thw_addr = addr;\n\t}\n\n\t/* check hw pg data */\n\tif (hw_addr && rtw_check_invalid_mac_address(hw_addr, _TRUE) == _FALSE) {\n\t\t_rtw_memcpy(hal_data->EEPROMMACAddr, hw_addr, ETH_ALEN);\n\t\tgoto exit;\n\t}\n\t\nbypass_hw_pg:\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n\t/* check wifi mac file */\n\tif (Hal_ReadMACAddrFromFile(adapter, addr) == _SUCCESS) {\n\t\t_rtw_memcpy(hal_data->EEPROMMACAddr, addr, ETH_ALEN);\n\t\tgoto exit;\n\t}\n#endif\n\n\t_rtw_memset(hal_data->EEPROMMACAddr, 0, ETH_ALEN);\n\tret = _FAIL;\n\nexit:\n\treturn ret;\n}\n\n#ifdef CONFIG_RF_GAIN_OFFSET\nu32 Array_kfreemap[] = { \n0x08,0xe,\n0x06,0xc,\n0x04,0xa,\n0x02,0x8,\n0x00,0x6,\n0x03,0x4,\n0x05,0x2,\n0x07,0x0,\n0x09,0x0,\n0x0c,0x0,\n};\n\nvoid rtw_bb_rf_gain_offset(_adapter *padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct registry_priv  *registry_par = &padapter->registrypriv;\n\tstruct kfree_data_t *kfree_data = &pHalData->kfree_data;\n\tu8\t\tvalue = pHalData->EEPROMRFGainOffset;\n\tu8\t\ttmp = 0x3e;\n\tu32\t\tres, i = 0;\n\tu4Byte\t\tArrayLen\t= sizeof(Array_kfreemap)/sizeof(u32);\n\tpu4Byte\t\tArray\t= Array_kfreemap;\n\tu4Byte\t\tv1 = 0, v2 = 0, GainValue = 0, target = 0;\n\n\tif (registry_par->RegRfKFreeEnable == 2) {\n\t\tDBG_871X(\"Registry kfree default force disable.\\n\");\n\t\treturn;\n\t}\n\n#if defined(CONFIG_RTL8723B)\n\tif (value & BIT4 || (registry_par->RegRfKFreeEnable == 1)) {\n\t\tDBG_871X(\"Offset RF Gain.\\n\");\n\t\tDBG_871X(\"Offset RF Gain.  pHalData->EEPROMRFGainVal=0x%x\\n\",pHalData->EEPROMRFGainVal);\n\t\t\n\t\tif(pHalData->EEPROMRFGainVal != 0xff){\n\n\t\t\tif(pHalData->ant_path == ODM_RF_PATH_A) {\n\t\t\t\tGainValue=(pHalData->EEPROMRFGainVal & 0x0f);\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tGainValue=(pHalData->EEPROMRFGainVal & 0xf0)>>4;\n\t\t\t}\n\t\t\tDBG_871X(\"Ant PATH_%d GainValue Offset = 0x%x\\n\",(pHalData->ant_path == ODM_RF_PATH_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B),GainValue);\n\t\t\t\n\t\t\tfor (i = 0; i < ArrayLen; i += 2 )\n\t\t\t{\n\t\t\t\t//DBG_871X(\"ArrayLen in =%d ,Array 1 =0x%x ,Array2 =0x%x \\n\",i,Array[i],Array[i]+1);\n\t\t\t\tv1 = Array[i];\n\t\t\t\tv2 = Array[i+1];\n\t\t\t\t if ( v1 == GainValue ) {\n\t\t\t\t\t\tDBG_871X(\"Offset RF Gain. got v1 =0x%x ,v2 =0x%x \\n\",v1,v2);\n\t\t\t\t\t\ttarget=v2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t }\n\t\t\t}\t \n\t\t\tDBG_871X(\"pHalData->EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\\n\",pHalData->EEPROMRFGainVal,target);\n\n\t\t\tres = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);\n\t\t\tDBG_871X(\"Offset RF Gain. before reg 0x7f=0x%08x\\n\",res);\n\t\t\tPHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);\n\t\t\tres = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);\n\n\t\t\tDBG_871X(\"Offset RF Gain. After reg 0x7f=0x%08x\\n\",res);\n\t\t\t\n\t\t}else {\n\n\t\t\tDBG_871X(\"Offset RF Gain.  pHalData->EEPROMRFGainVal=0x%x\t!= 0xff, didn't run Kfree\\n\",pHalData->EEPROMRFGainVal);\n\t\t}\n\t} else {\n\t\tDBG_871X(\"Using the default RF gain.\\n\");\n\t}\n\n#elif defined(CONFIG_RTL8188E)\n\tif (value & BIT4 || (registry_par->RegRfKFreeEnable == 1)) {\n\t\tDBG_871X(\"8188ES Offset RF Gain.\\n\");\n\t\tDBG_871X(\"8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\\n\",\n\t\t\t\tpHalData->EEPROMRFGainVal);\n\n\t\tif (pHalData->EEPROMRFGainVal != 0xff) {\n\t\t\tres = rtw_hal_read_rfreg(padapter, RF_PATH_A,\n\t\t\t\t\tREG_RF_BB_GAIN_OFFSET, 0xffffffff);\n\n\t\t\tDBG_871X(\"Offset RF Gain. reg 0x55=0x%x\\n\",res);\n\t\t\tres &= 0xfff87fff;\n\n\t\t\tres |= (pHalData->EEPROMRFGainVal & 0x0f) << 15;\n\t\t\tDBG_871X(\"Offset RF Gain. res=0x%x\\n\",res);\n\n\t\t\trtw_hal_write_rfreg(padapter, RF_PATH_A,\n\t\t\t\t\tREG_RF_BB_GAIN_OFFSET,\n\t\t\t\t\tRF_GAIN_OFFSET_MASK, res);\n\t\t} else {\n\t\t\tDBG_871X(\"Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\\n\",\n\t\t\t\t\tpHalData->EEPROMRFGainVal);\n\t\t}\n\t} else {\n\t\tDBG_871X(\"Using the default RF gain.\\n\");\n\t}\n#else\n\t/* TODO: call this when channel switch */\n\tif (kfree_data->flag & KFREE_FLAG_ON)\n\t\trtw_rf_apply_tx_gain_offset(padapter, 6); /* input ch6 to select BB_GAIN_2G */\n#endif\n\t\n}\n#endif //CONFIG_RF_GAIN_OFFSET\n\nbool kfree_data_is_bb_gain_empty(struct kfree_data_t *data)\n{\n#ifdef CONFIG_RF_GAIN_OFFSET\n\tint i, j;\n\n\tfor (i = 0; i < BB_GAIN_NUM; i++)\n\t\tfor (j = 0; j < RF_PATH_MAX; j++)\n\t\t\tif (data->bb_gain[i][j] != 0)\n\t\t\t\treturn 0;\n#endif\n\treturn 1;\n}\n\n#ifdef CONFIG_USB_RX_AGGREGATION\t\nvoid rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tif(cur_wireless_mode < WIRELESS_11_24N \n\t\t&& cur_wireless_mode > 0) //ABG mode\n\t{\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\tu32 remainder = 0;\n\t\tu8 quotient = 0;\n\n\t\tremainder = MAX_RECVBUF_SZ % (4*1024); \n\t\tquotient = (u8)(MAX_RECVBUF_SZ >> 12); \n\t\t\n\t\tif (quotient > 5) {\n\t\t\tpHalData->RegAcUsbDmaSize = 0x6;\n\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t} else {\n\t\t\tif (remainder >= 2048) {\n\t\t\t\tpHalData->RegAcUsbDmaSize = quotient;\n\t\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t\t} else {\n\t\t\t\tpHalData->RegAcUsbDmaSize = (quotient-1);\n\t\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t\t}\n\t\t}\n#else /* !CONFIG_PREALLOC_RX_SKB_BUFFER */\n\t\tif(0x6 != pHalData->RegAcUsbDmaSize || 0x10 !=pHalData->RegAcUsbDmaTime)\n\t\t{\n\t\t\tpHalData->RegAcUsbDmaSize = 0x6;\n\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t\trtw_write16(padapter, REG_RXDMA_AGG_PG_TH,\n\t\t\t\tpHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8));\n\t\t}\n#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */\n\t\t\t\t\t\n\t}\n\telse if(cur_wireless_mode >= WIRELESS_11_24N\n\t\t\t&& cur_wireless_mode <= WIRELESS_MODE_MAX)//N AC mode\n\t{\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\tu32 remainder = 0;\n\t\tu8 quotient = 0;\n\n\t\tremainder = MAX_RECVBUF_SZ % (4*1024); \n\t\tquotient = (u8)(MAX_RECVBUF_SZ >> 12); \n\t\t\n\t\tif (quotient > 5) {\n\t\t\tpHalData->RegAcUsbDmaSize = 0x5;\n\t\t\tpHalData->RegAcUsbDmaTime = 0x20;\n\t\t} else {\n\t\t\tif (remainder >= 2048) {\n\t\t\t\tpHalData->RegAcUsbDmaSize = quotient;\n\t\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t\t} else {\n\t\t\t\tpHalData->RegAcUsbDmaSize = (quotient-1);\n\t\t\t\tpHalData->RegAcUsbDmaTime = 0x10;\n\t\t\t}\n\t\t}\n#else /* !CONFIG_PREALLOC_RX_SKB_BUFFER */\n\t\tif(0x5 != pHalData->RegAcUsbDmaSize || 0x20 !=pHalData->RegAcUsbDmaTime)\n\t\t{\n\t\t\tpHalData->RegAcUsbDmaSize = 0x5;\n\t\t\tpHalData->RegAcUsbDmaTime = 0x20;\n\t\t\trtw_write16(padapter, REG_RXDMA_AGG_PG_TH,\n\t\t\t\tpHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8));\n\t\t}\n#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */\n\n\t}\n\telse\n\t{\n\t\t/* DBG_871X(\"%s: Unknow wireless mode(0x%x)\\n\",__func__,padapter->mlmeextpriv.cur_wireless_mode); */\n\t}\n}\n#endif //CONFIG_USB_RX_AGGREGATION\n\n//To avoid RX affect TX throughput\nvoid dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)\n{\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct mlme_priv\t\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeextpriv = &(padapter->mlmeextpriv);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tu8 cur_wireless_mode = pmlmeextpriv->cur_wireless_mode;\n#ifdef CONFIG_CONCURRENT_MODE\n\tstruct mlme_ext_priv\t*pbuddymlmeextpriv = &(padapter->pbuddy_adapter->mlmeextpriv);\n#endif //CONFIG_CONCURRENT_MODE\n\n#ifdef CONFIG_USB_RX_AGGREGATION\t\n\tif(IS_HARDWARE_TYPE_8821U(padapter) )//|| IS_HARDWARE_TYPE_8192EU(padapter))\n\t{\n\t\t//This AGG_PH_TH only for UsbRxAggMode == USB_RX_AGG_USB\n\t\tif((pHalData->UsbRxAggMode == USB_RX_AGG_USB) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t\t{\n\t\t\tif(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)\n\t\t\t\trtw_write16(padapter , REG_RXDMA_AGG_PG_TH , 0x1010);\n\t\t\telse if (pdvobjpriv->traffic_stat.last_tx_bytes > 220000 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)\n\t\t\t\trtw_write16(padapter , REG_RXDMA_AGG_PG_TH , 0x1006);\t\t\t\n\t\t\telse\n\t\t\t\trtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K\n\t\t\t\n\t\t\t//DBG_871X(\"TX_TP=%u, RX_TP=%u \\n\", pdvobjpriv->traffic_stat.cur_tx_tp, pdvobjpriv->traffic_stat.cur_rx_tp);\n\t\t}\n\t}\n\telse if(IS_HARDWARE_TYPE_8812(padapter))\n\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(rtw_linked_check(padapter) == _TRUE && rtw_linked_check(padapter->pbuddy_adapter) == _TRUE)\n\t\t{\n\t\t\tif(pbuddymlmeextpriv->cur_wireless_mode >= pmlmeextpriv->cur_wireless_mode)\n\t\t\t\tcur_wireless_mode = pbuddymlmeextpriv->cur_wireless_mode;\n\t\t\telse\n\t\t\t\tcur_wireless_mode = pmlmeextpriv->cur_wireless_mode;\n\n\t\t\trtw_set_usb_agg_by_mode(padapter,cur_wireless_mode);\n\t\t}\n\t\telse if (rtw_linked_check(padapter) == _TRUE && rtw_linked_check(padapter->pbuddy_adapter) == _FALSE)\n\t\t{\n\t\t\trtw_set_usb_agg_by_mode(padapter,cur_wireless_mode);\n\t\t}\n#else //!CONFIG_CONCURRENT_MODE\n\t\trtw_set_usb_agg_by_mode(padapter,cur_wireless_mode);\n#endif //CONFIG_CONCURRENT_MODE\n\t}\n#endif\n}\n\n//bus-agg check for SoftAP mode\ninline u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel)\n{\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu8 chk_rst = _SUCCESS;\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn chk_rst;\n\n\t//if((pre_qsel == 0xFF)||(next_qsel== 0xFF)) \n\t//\treturn chk_rst;\n\t\n\tif(\t((pre_qsel == QSLT_HIGH)||((next_qsel== QSLT_HIGH))) \n\t\t\t&& (pre_qsel != next_qsel )){\n\t\t\t//DBG_871X(\"### bus-agg break cause of qsel misatch, pre_qsel=0x%02x,next_qsel=0x%02x ###\\n\",\n\t\t\t//\tpre_qsel,next_qsel);\n\t\t\tchk_rst = _FAIL;\n\t\t}\n\treturn chk_rst;\n}\n\n/*\n * Description:\n * dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload\n * contant.\n *\n * Input:\n * adapter: adapter pointer.\n * page_num: The max. page number that user want to dump. \n * page_size: page size of each page. eg. 128 bytes, 256 bytes, 512byte.\n */\nvoid dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){\n\n\tint i;\n\tu8 val = 0;\n\tu8 base = 0;\n\tu32 addr = 0;\n\tu32 count = (page_size / 8);\n\n\tif (page_num <= 0) {\n\t\tDBG_871X(\"!!%s: incorrect input page_num paramter!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif (page_size < 128 || page_size > 512) {\n\t\tDBG_871X(\"!!%s: incorrect input page_size paramter!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tDBG_871X(\"+%s+\\n\", __func__);\n\tval = rtw_read8(padapter, 0x106);\n\trtw_write8(padapter, 0x106, 0x69);\n\tDBG_871X(\"0x106: 0x%02x\\n\", val);\n\tbase = rtw_read8(padapter, 0x209);\n\tDBG_871X(\"0x209: 0x%02x\\n\", base);\n\n\taddr = ((base) * page_size)/8;\n\tfor (i = 0 ; i < page_num * count ; i+=2) {\n\t\trtw_write32(padapter, 0x140, addr + i);\n\t\tprintk(\" %08x %08x \", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\n\t\trtw_write32(padapter, 0x140, addr + i + 1);\n\t\tprintk(\" %08x %08x \\n\", rtw_read32(padapter, 0x144), rtw_read32(padapter, 0x148));\n\t}\n}\n\n#ifdef CONFIG_GPIO_API\nu8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num)\n{\n\tu8 value;\n\tu8 direction;\t\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);\n\n\trtw_ps_deny(adapter, PS_DENY_IOCTL);\n\n\tDBG_871X(\"rf_pwrstate=0x%02x\\n\", pwrpriv->rf_pwrstate);\n\tLeaveAllPowerSaveModeDirect(adapter);\n\n\t/* Read GPIO Direction */\n\tdirection = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;\n\n\t/* According the direction to read register value */\n\tif( direction )\n\t\tvalue =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;\n\telse\n\t\tvalue =  (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;\n\n\trtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);\n\tDBG_871X(\"%s direction=%d value=%d\\n\",__FUNCTION__,direction,value);\n\n\treturn value;\n}\n\nint  rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, bool isHigh)\n{\n\tu8 direction = 0;\n\tu8 res = -1;\n\tif (IS_HARDWARE_TYPE_8188E(adapter)){\n\t\t/* Check GPIO is 4~7 */\n\t\tif( gpio_num > 7 || gpio_num < 4)\n\t\t{\n\t\t\tDBG_871X(\"%s The gpio number does not included 4~7.\\n\",__FUNCTION__);\n\t\t\treturn -1;\n\t\t}\n\t}\t\n\t\n\trtw_ps_deny(adapter, PS_DENY_IOCTL);\n\n\tLeaveAllPowerSaveModeDirect(adapter);\n\n\t/* Read GPIO direction */\n\tdirection = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;\n\n\t/* If GPIO is output direction, setting value. */\n\tif( direction )\n\t{\n\t\tif(isHigh)\n\t\t\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));\n\t\telse\n\t\t\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));\n\n\t\tDBG_871X(\"%s Set gpio %x[%d]=%d\\n\",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );\n\t\tres = 0;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s The gpio is input,not be set!\\n\",__FUNCTION__);\n\t\tres = -1;\n\t}\n\n\trtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);\n\treturn res;\n}\n\nint rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, bool isOutput)\n{\n\tif (IS_HARDWARE_TYPE_8188E(adapter)){\n\t\tif( gpio_num > 7 || gpio_num < 4)\n\t\t{\n\t\t\tDBG_871X(\"%s The gpio number does not included 4~7.\\n\",__FUNCTION__);\n\t\t\treturn -1;\n\t\t}\n\t}\t\n\n\tDBG_871X(\"%s gpio_num =%d direction=%d\\n\",__FUNCTION__,gpio_num,isOutput);\n\n\trtw_ps_deny(adapter, PS_DENY_IOCTL);\n\n\tLeaveAllPowerSaveModeDirect(adapter);\n\n\tif( isOutput )\n\t{\n\t\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));\n\t}\n\telse\n\t{\n\t\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));\n\t}\n\n\trtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);\n\n\treturn 0;\n}\nint rtw_hal_register_gpio_interrupt(_adapter* adapter, int gpio_num, void(*callback)(u8 level))\n{\n\tu8 value;\n\tu8 direction;\n\tPHAL_DATA_TYPE phal = GET_HAL_DATA(adapter);\n\n\tif (IS_HARDWARE_TYPE_8188E(adapter)){\t\n\t\tif(gpio_num > 7 || gpio_num < 4)\n\t\t{\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s The gpio number does not included 4~7.\\n\",__FUNCTION__);\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\trtw_ps_deny(adapter, PS_DENY_IOCTL);\n\n\tLeaveAllPowerSaveModeDirect(adapter);\n\n\t/* Read GPIO direction */\n\tdirection = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;\n\tif(direction){\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s Can't register output gpio as interrupt.\\n\",__FUNCTION__);\n\t\treturn -1;\n\t}\n\n\t/* Config GPIO Mode */\n\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 3, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 3) | BIT(gpio_num));\t\n\n\t/* Register GPIO interrupt handler*/\n\tadapter->gpiointpriv.callback[gpio_num] = callback;\n\t\n\t/* Set GPIO interrupt mode, 0:positive edge, 1:negative edge */\n\tvalue = rtw_read8(adapter, REG_GPIO_PIN_CTRL) & BIT(gpio_num);\n\tadapter->gpiointpriv.interrupt_mode = rtw_read8(adapter, REG_HSIMR + 2)^value;\n\trtw_write8(adapter, REG_GPIO_INTM, adapter->gpiointpriv.interrupt_mode);\n\t\n\t/* Enable GPIO interrupt */\n\tadapter->gpiointpriv.interrupt_enable_mask = rtw_read8(adapter, REG_HSIMR + 2) | BIT(gpio_num);\n\trtw_write8(adapter, REG_HSIMR + 2, adapter->gpiointpriv.interrupt_enable_mask);\n\n\trtw_hal_update_hisr_hsisr_ind(adapter, 1);\n\t\n\trtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);\n\n\treturn 0;\n}\nint rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num)\n{\n\tu8 value;\n\tu8 direction;\n\tPHAL_DATA_TYPE phal = GET_HAL_DATA(adapter);\n\n\tif (IS_HARDWARE_TYPE_8188E(adapter)){\n\t\tif(gpio_num > 7 || gpio_num < 4)\n\t\t{\n\t\t\tDBG_871X(\"%s The gpio number does not included 4~7.\\n\",__FUNCTION__);\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\trtw_ps_deny(adapter, PS_DENY_IOCTL);\n\n\tLeaveAllPowerSaveModeDirect(adapter);\n\n\t/* Config GPIO Mode */\n\trtw_write8(adapter, REG_GPIO_PIN_CTRL + 3, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 3) &~ BIT(gpio_num));\t\n\n\t/* Unregister GPIO interrupt handler*/\n\tadapter->gpiointpriv.callback[gpio_num] = NULL;\n\n\t/* Reset GPIO interrupt mode, 0:positive edge, 1:negative edge */\n\tadapter->gpiointpriv.interrupt_mode = rtw_read8(adapter, REG_GPIO_INTM) &~ BIT(gpio_num);\n\trtw_write8(adapter, REG_GPIO_INTM, 0x00);\n\t\n\t/* Disable GPIO interrupt */\n\tadapter->gpiointpriv.interrupt_enable_mask = rtw_read8(adapter, REG_HSIMR + 2) &~ BIT(gpio_num);\n\trtw_write8(adapter, REG_HSIMR + 2, adapter->gpiointpriv.interrupt_enable_mask);\n\n\tif(!adapter->gpiointpriv.interrupt_enable_mask)\n\t\trtw_hal_update_hisr_hsisr_ind(adapter, 0);\n\t\n\trtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);\n\n\treturn 0;\n}\n#endif\n\nvoid rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter)\n{\n\tu32\tmac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0;\n\tu32\tmac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0;\n\tu32\tmac_cck_fa=0, mac_ofdm_fa=0, mac_ht_fa=0;\n\tu32\tDropPacket=0;\n\t\n\tif(!rx_counter){\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x3);\n\tmac_cck_ok\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t  \n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x0);\n\tmac_ofdm_ok\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t \n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x6);\n\tmac_ht_ok\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\n\tmac_vht_ok\t= 0;\t\n\tif (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) {\n\t\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x0);\n\t\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT26, 0x1);\n\t\tmac_vht_ok\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t \n\t}\t\n\t\t\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x4);\n\tmac_cck_err\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x1);\n\tmac_ofdm_err\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x7);\n\tmac_ht_err\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\t\n\tmac_vht_err\t= 0;\n\tif (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) {\n\t\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x1);\n\t\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT26, 0x1);\n\t\tmac_vht_err\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t \n\t}\n\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x5);\n\tmac_cck_fa\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x2);\n\tmac_ofdm_fa\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT28|BIT29|BIT30|BIT31, 0x9);\n\tmac_ht_fa\t= PHY_QueryMacReg(padapter, REG_RXERR_RPT, bMaskLWord);// [15:0]\t\t\n\t\n\t//Mac_DropPacket\n\trtw_write32(padapter, REG_RXERR_RPT, (rtw_read32(padapter, REG_RXERR_RPT)& 0x0FFFFFFF)| Mac_DropPacket);\n\tDropPacket = rtw_read32(padapter, REG_RXERR_RPT)& 0x0000FFFF;\n\n\trx_counter->rx_pkt_ok = mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok;\n\trx_counter->rx_pkt_crc_error = mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err;\n\trx_counter->rx_cck_fa = mac_cck_fa;\n\trx_counter->rx_ofdm_fa = mac_ofdm_fa;\n\trx_counter->rx_ht_fa = mac_ht_fa;\n\trx_counter->rx_pkt_drop = DropPacket;\n}\nvoid rtw_reset_mac_rx_counters(_adapter* padapter)\n{\n\n\tif (IS_HARDWARE_TYPE_8703B(padapter) || IS_HARDWARE_TYPE_8188F(padapter))\n\t\tPHY_SetMacReg(padapter, 0x608, BIT19, 0x1); /* If no packet rx, MaxRx clock be gating ,BIT_DISGCLK bit19 set 1 for fix*/\t\n\n\t//reset mac counter\n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT27, 0x1); \n\tPHY_SetMacReg(padapter, REG_RXERR_RPT, BIT27, 0x0);\n}\n\nvoid rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter)\n{\n\tu32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,vht_ok=0,vht_err=0;\n\tif(!rx_counter){\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\tif (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)){\n\t\tcckok\t= PHY_QueryBBReg(padapter, 0xF04, 0x3FFF);\t     // [13:0] \n\t\tofdmok\t= PHY_QueryBBReg(padapter, 0xF14, 0x3FFF);\t     // [13:0] \n\t\thtok\t\t= PHY_QueryBBReg(padapter, 0xF10, 0x3FFF);     // [13:0]\n\t\tvht_ok\t= PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF);     // [13:0]\n\t\tcckcrc\t= PHY_QueryBBReg(padapter, 0xF04, 0x3FFF0000); // [29:16]\t\n\t\tofdmcrc\t= PHY_QueryBBReg(padapter, 0xF14, 0x3FFF0000); // [29:16]\n\t\thtcrc\t= PHY_QueryBBReg(padapter, 0xF10, 0x3FFF0000); // [29:16]\n\t\tvht_err\t= PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]\n\t\tCCK_FA\t= PHY_QueryBBReg(padapter, 0xA5C, bMaskLWord);\n\t\tOFDM_FA\t= PHY_QueryBBReg(padapter, 0xF48, bMaskLWord);\n\t} \n\telse\n\t{\n\t\tcckok\t= PHY_QueryBBReg(padapter, 0xF88, bMaskDWord);\n\t\tofdmok\t= PHY_QueryBBReg(padapter, 0xF94, bMaskLWord);\n\t\thtok\t\t= PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);\n\t\tvht_ok\t= 0;\n\t\tcckcrc\t= PHY_QueryBBReg(padapter, 0xF84, bMaskDWord);\n\t\tofdmcrc\t= PHY_QueryBBReg(padapter, 0xF94, bMaskHWord);\n\t\thtcrc\t= PHY_QueryBBReg(padapter, 0xF90, bMaskHWord);\n\t\tvht_err\t= 0;\n\t\tOFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) +\n\t\t\tPHY_QueryBBReg(padapter, 0xDA2, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) +\n\t\t\tPHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord);\n\t\n\t\tCCK_FA=(rtw_read8(padapter, 0xA5B )<<8 ) | (rtw_read8(padapter, 0xA5C));\n\t}\n\t\n\trx_counter->rx_pkt_ok = cckok+ofdmok+htok+vht_ok;\n\trx_counter->rx_pkt_crc_error = cckcrc+ofdmcrc+htcrc+vht_err;\n\trx_counter->rx_ofdm_fa = OFDM_FA;\n\trx_counter->rx_cck_fa = CCK_FA;\n\t\n}\n\nvoid rtw_reset_phy_trx_ok_counters(_adapter *padapter)\n{\n\tif (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) {\n\t\tPHY_SetBBReg(padapter, 0xB58, BIT0, 0x1);\n\t\tPHY_SetBBReg(padapter, 0xB58, BIT0, 0x0);\n\t}\n}\nvoid rtw_reset_phy_rx_counters(_adapter *padapter)\n{\n\t//reset phy counter\n\tif (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter))\n\t{\n\t\trtw_reset_phy_trx_ok_counters(padapter);\n\n\t\tPHY_SetBBReg(padapter, 0x9A4, BIT17, 0x1);//reset  OFDA FA counter\n\t\tPHY_SetBBReg(padapter, 0x9A4, BIT17, 0x0);\n\t\t\t\n\t\tPHY_SetBBReg(padapter, 0xA2C, BIT15, 0x0);//reset  CCK FA counter\n\t\tPHY_SetBBReg(padapter, 0xA2C, BIT15, 0x1);\n\t}\n\telse\n\t{\n\t\tPHY_SetBBReg(padapter, 0xF14, BIT16, 0x1);\n\t\trtw_msleep_os(10);\n\t\tPHY_SetBBReg(padapter, 0xF14, BIT16, 0x0);\n\t\t\n\t\tPHY_SetBBReg(padapter, 0xD00, BIT27, 0x1);//reset  OFDA FA counter\n\t\tPHY_SetBBReg(padapter, 0xC0C, BIT31, 0x1);//reset  OFDA FA counter\n\t\tPHY_SetBBReg(padapter, 0xD00, BIT27, 0x0);\n\t\tPHY_SetBBReg(padapter, 0xC0C, BIT31, 0x0);\n\t\t\t\n\t\tPHY_SetBBReg(padapter, 0xA2C, BIT15, 0x0);//reset  CCK FA counter\n\t\tPHY_SetBBReg(padapter, 0xA2C, BIT15, 0x1);\n\t}\n}\n#ifdef DBG_RX_COUNTER_DUMP\nvoid rtw_dump_drv_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter)\n{\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\tif(!rx_counter){\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\trx_counter->rx_pkt_ok = padapter->drv_rx_cnt_ok;\n\trx_counter->rx_pkt_crc_error = padapter->drv_rx_cnt_crcerror;\n\trx_counter->rx_pkt_drop = precvpriv->rx_drop - padapter->drv_rx_cnt_drop;\t\n}\nvoid rtw_reset_drv_rx_counters(_adapter* padapter)\n{\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\tpadapter->drv_rx_cnt_ok = 0;\n\tpadapter->drv_rx_cnt_crcerror = 0;\n\tpadapter->drv_rx_cnt_drop = precvpriv->rx_drop;\n}\nvoid rtw_dump_phy_rxcnts_preprocess(_adapter* padapter,u8 rx_cnt_mode)\n{\n\tu8 initialgain;\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);\n\t\n\tif((!(padapter->dump_rx_cnt_mode& DUMP_PHY_RX_COUNTER)) && (rx_cnt_mode & DUMP_PHY_RX_COUNTER))\n\t{\n\t\t/*initialgain = pDigTable->CurIGValue;*/\n\t\trtw_hal_get_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, NULL);\n\t\tDBG_871X(\"%s CurIGValue:0x%02x\\n\",__FUNCTION__,initialgain);\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);\n\t\t/*disable dynamic functions, such as high power, DIG*/\n\t\trtw_phydm_ability_backup(padapter);\n\t\trtw_phydm_func_clr(padapter, (ODM_BB_DIG|ODM_BB_FA_CNT));\n\t}\n\telse if((padapter->dump_rx_cnt_mode& DUMP_PHY_RX_COUNTER) &&(!(rx_cnt_mode & DUMP_PHY_RX_COUNTER )))\n\t{\n\t\t//turn on phy-dynamic functions\n\t\trtw_phydm_ability_restore(padapter);\n\t\tinitialgain = 0xff; //restore RX GAIN\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE);\n\t\t\n\t}\n}\n\t\nvoid rtw_dump_rx_counters(_adapter* padapter)\n{\n\tstruct dbg_rx_counter rx_counter;\n\n\tif( padapter->dump_rx_cnt_mode & DUMP_DRV_RX_COUNTER ){\n\t\t_rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter));\n\t\trtw_dump_drv_rx_counters(padapter,&rx_counter);\n\t\tDBG_871X( \"Drv Received packet OK:%d CRC error:%d Drop Packets: %d\\n\",\n\t\t\t\t\trx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,rx_counter.rx_pkt_drop);\t\t\n\t\trtw_reset_drv_rx_counters(padapter);\t\t\n\t}\n\t\t\n\tif( padapter->dump_rx_cnt_mode & DUMP_MAC_RX_COUNTER ){\n\t\t_rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter));\n\t\trtw_dump_mac_rx_counters(padapter,&rx_counter);\n\t\tDBG_871X( \"Mac Received packet OK:%d CRC error:%d FA Counter: %d Drop Packets: %d\\n\",\n\t\t\t\t\trx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,\n\t\t\t\t\trx_counter.rx_cck_fa+rx_counter.rx_ofdm_fa+rx_counter.rx_ht_fa,\n\t\t\t\t\trx_counter.rx_pkt_drop);\t\t\t\n\t\trtw_reset_mac_rx_counters(padapter);\n\t}\n\n\tif(padapter->dump_rx_cnt_mode & DUMP_PHY_RX_COUNTER ){\t\t\n\t\t_rtw_memset(&rx_counter,0,sizeof(struct dbg_rx_counter));\t\t\n\t\trtw_dump_phy_rx_counters(padapter,&rx_counter);\n\t\t//DBG_871X(\"%s: OFDM_FA =%d\\n\", __FUNCTION__, rx_counter.rx_ofdm_fa);\n\t\t//DBG_871X(\"%s: CCK_FA =%d\\n\", __FUNCTION__, rx_counter.rx_cck_fa);\n\t\tDBG_871X(\"Phy Received packet OK:%d CRC error:%d FA Counter: %d\\n\",rx_counter.rx_pkt_ok,rx_counter.rx_pkt_crc_error,\n\t\trx_counter.rx_ofdm_fa+rx_counter.rx_cck_fa);\n\t\trtw_reset_phy_rx_counters(padapter);\t\n\t}\n}\n#endif\nvoid rtw_get_noise(_adapter* padapter)\n{\n#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct noise_info info;\n\tif(rtw_linked_check(padapter)){\n\t\tinfo.bPauseDIG = _TRUE;\n\t\tinfo.IGIValue = 0x1e;\n\t\tinfo.max_time = 100;//ms\n\t\tinfo.chan = pmlmeext->cur_channel ;//rtw_get_oper_ch(padapter);\n\t\trtw_ps_deny(padapter, PS_DENY_IOCTL);\n\t\tLeaveAllPowerSaveModeDirect(padapter);\n\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);\t\n\t\t//ODM_InbandNoise_Monitor(podmpriv,_TRUE,0x20,100);\n\t\trtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);\n\t\trtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(info.chan), &(padapter->recvpriv.noise));\t\n\t\t#ifdef DBG_NOISE_MONITOR\n\t\tDBG_871X(\"chan:%d,noise_level:%d\\n\",info.chan,padapter->recvpriv.noise);\n\t\t#endif\n\t}\n#endif\t\t\n\n}\nu8 rtw_get_current_tx_sgi(_adapter *padapter, u8 macid)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu8 curr_tx_sgi = 0;\n\n#if defined(CONFIG_RTL8188E)\n\tcurr_tx_sgi = ODM_RA_GetDecisionRate_8188E(pDM_Odm, macid);\n#else\n\tcurr_tx_sgi = ((pRA_Table->link_tx_rate[macid]) & 0x80) >> 7;\n#endif\n\n\treturn curr_tx_sgi;\n\n}\nu8 rtw_get_current_tx_rate(_adapter *padapter, u8 macid)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu8 rate_id = 0;\n\n#if (RATE_ADAPTIVE_SUPPORT == 1)\n\trate_id = ODM_RA_GetDecisionRate_8188E(pDM_Odm, macid);\n#else\n\trate_id = (pRA_Table->link_tx_rate[macid]) & 0x7f;\n#endif\n\n\treturn rate_id;\n\n}\n\n#ifdef CONFIG_FW_C2H_DEBUG\n\n/*\tC2H RX package original is 128.\nif enable CONFIG_FW_C2H_DEBUG, it should increase to 256.\n C2H FW debug message:\n without aggregate:\n {C2H_CmdID,Seq,SubID,Len,Content[0~n]}\n Content[0~n]={'a','b','c',...,'z','\\n'}\n with aggregate:\n {C2H_CmdID,Seq,SubID,Len,Content[0~n]}\n Content[0~n]={'a','b','c',...,'z','\\n',Extend C2H pkt 2...}\n Extend C2H pkt 2={C2H CmdID,Seq,SubID,Len,Content = {'a','b','c',...,'z','\\n'}}\n Author: Isaac\t*/\n\nvoid Debug_FwC2H(PADAPTER padapter, u8 *pdata, u8 len)\n{\n\tint i = 0;\n\tint cnt = 0, total_length = 0;\n\tu8 buf[128] = {0};\n\tu8 more_data = _FALSE;\n\tu8 *nextdata = NULL;\n\tu8 test = 0;\n\n\tu8 data_len;\n\tu8 seq_no;\n\n\tnextdata = pdata;\n\tdo {\n\t\tdata_len = *(nextdata + 1);\n\t\tseq_no = *(nextdata + 2);\n\n\t\tfor (i = 0 ; i < data_len - 2 ; i++) {\n\t\t\tcnt += sprintf((buf+cnt), \"%c\", nextdata[3 + i]);\n\n\t\t\tif (nextdata[3 + i] == 0x0a && nextdata[4 + i] == 0xff)\n\t\t\t\tmore_data = _TRUE;\n\t\t\telse if (nextdata[3 + i] == 0x0a && nextdata[4 + i] != 0xff)\n\t\t\t\tmore_data = _FALSE;\n\t\t}\n\n\t\tDBG_871X(\"[RTKFW, SEQ=%d]: %s\", seq_no, buf);\n\t\tdata_len += 3;\n\t\ttotal_length += data_len;\n\n\t\tif (more_data == _TRUE) {\n\t\t\t_rtw_memset(buf, '\\0', 128);\n\t\t\tcnt = 0;\n\t\t\tnextdata = (pdata + total_length);\n\t\t}\n\t} while (more_data == _TRUE);\n}\n#endif /*CONFIG_FW_C2H_DEBUG*/\nvoid update_IOT_info(_adapter *padapter)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tswitch (pmlmeinfo->assoc_AP_vendor)\n\t{\n\t\tcase HT_IOT_PEER_MARVELL:\n\t\t\tpmlmeinfo->turboMode_cts2self = 1;\n\t\t\tpmlmeinfo->turboMode_rtsen = 0;\n\t\t\tbreak;\n\t\t\n\t\tcase HT_IOT_PEER_RALINK:\n\t\t\tpmlmeinfo->turboMode_cts2self = 0;\n\t\t\tpmlmeinfo->turboMode_rtsen = 1;\n\t\t\t//disable high power\t\t\t\n\t\t\trtw_phydm_func_clr(padapter, ODM_BB_DYNAMIC_TXPWR);\n\t\t\tbreak;\n\t\tcase HT_IOT_PEER_REALTEK:\n\t\t\t//rtw_write16(padapter, 0x4cc, 0xffff);\n\t\t\t//rtw_write16(padapter, 0x546, 0x01c0);\n\t\t\t//disable high power\t\t\t\n\t\t\trtw_phydm_func_clr(padapter, ODM_BB_DYNAMIC_TXPWR);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpmlmeinfo->turboMode_cts2self = 0;\n\t\t\tpmlmeinfo->turboMode_rtsen = 1;\n\t\t\tbreak;\t\n\t}\n\t\n}\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\nvoid rtw_acs_start(_adapter *padapter, bool bStart)\n{\t\n\tif (_TRUE == bStart) {\n\t\tACS_OP acs_op = ACS_INIT;\n\t\t\n\t\trtw_hal_set_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &acs_op, _TRUE);\n\t\trtw_set_acs_channel(padapter, 0);\n\t\tSET_ACS_STATE(padapter, ACS_ENABLE);\t\t\n\t} else {\t\t\n\t\tSET_ACS_STATE(padapter, ACS_DISABLE);\n\t\t#ifdef DBG_AUTO_CHNL_SEL_NHM\n\t\tif (1) {\n\t\t\tu8 best_24g_ch = 0;\n\t\t\tu8 best_5g_ch = 0;\n\t\t\t\n\t\t\trtw_hal_get_odm_var(padapter, HAL_ODM_AUTO_CHNL_SEL, &(best_24g_ch), &(best_5g_ch));\n\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] Best 2.4G CH:%u\\n\", ADPT_ARG(padapter), best_24g_ch);\n\t\t\tDBG_871X(\"[ACS-\"ADPT_FMT\"] Best 5G CH:%u\\n\", ADPT_ARG(padapter), best_5g_ch);\n\t\t}\n\t\t#endif\n\t}\n}\n#endif\n\n/* TODO: merge with phydm, see odm_SetCrystalCap() */\nvoid hal_set_crystal_cap(_adapter *adapter, u8 crystal_cap)\n{\n\tcrystal_cap = crystal_cap & 0x3F;\n\n\tswitch (rtw_get_chip_type(adapter)) {\n#if defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8188F)\n\tcase RTL8188E:\n\tcase RTL8188F:\n\t\t/* write 0x24[16:11] = 0x24[22:17] = CrystalCap */\n\t\tPHY_SetBBReg(adapter, REG_AFE_XTAL_CTRL, 0x007FF800, (crystal_cap | (crystal_cap << 6)));\n\t\tbreak;\n#endif\n#if defined(CONFIG_RTL8812A)\n\tcase RTL8812:\n\t\t/* write 0x2C[30:25] = 0x2C[24:19] = CrystalCap */\n\t\tPHY_SetBBReg(adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (crystal_cap | (crystal_cap << 6)));\n\t\tbreak;\n#endif\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8192E)\n\tcase RTL8723B:\n\tcase RTL8703B:\n\tcase RTL8821:\n\tcase RTL8192E:\n\t\t/* write 0x2C[23:18] = 0x2C[17:12] = CrystalCap */\n\t\tPHY_SetBBReg(adapter, REG_MAC_PHY_CTRL, 0x00FFF000, (crystal_cap | (crystal_cap << 6)));\n\t\tbreak;\n#endif\n#if defined(CONFIG_RTL8814A)\n\tcase RTL8814A:\n\t\t/* write 0x2C[26:21] = 0x2C[20:15] = CrystalCap*/\n\t\tPHY_SetBBReg(adapter, REG_MAC_PHY_CTRL, 0x07FF8000, (crystal_cap | (crystal_cap << 6)));\n\t\tbreak;\n#endif\n#if defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B)\n\tcase RTL8821B:\n\tcase RTL8822B:\n\t\t/* write 0x28[6:1] = 0x24[30:25] = CrystalCap */\n\t\tcrystal_cap = crystal_cap & 0x3F;\n\t\tPHY_SetBBReg(adapter, REG_AFE_XTAL_CTRL, 0x7E000000, crystal_cap);\n\t\tPHY_SetBBReg(adapter, REG_AFE_PLL_CTRL, 0x7E, crystal_cap);\n\t\tbreak;\n#endif\n\tdefault:\n\t\trtw_warn_on(1);\n\t}\n}\n\nstatic const char * const _band_cap_str[] = {\n\t/* BIT0 */\"2G\",\n\t/* BIT1 */\"5G\",\n};\n\nstatic const char * const _bw_cap_str[] = {\n\t/* BIT0 */\"5M\",\n\t/* BIT1 */\"10M\",\n\t/* BIT2 */\"20M\",\n\t/* BIT3 */\"40M\",\n\t/* BIT4 */\"80M\",\n\t/* BIT5 */\"160M\",\n\t/* BIT6 */\"80_80M\",\n};\n\nstatic const char * const _wl_func_str[] = {\n\t/* BIT0 */\"P2P\",\n\t/* BIT1 */\"MIRACAST\",\n\t/* BIT2 */\"TDLS\",\n\t/* BIT3 */\"FTM\",\n};\n\nvoid dump_hal_spec(void *sel, _adapter *adapter)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);\n\tint i;\n\n\tDBG_871X_SEL_NL(sel, \"macid_num:%u\\n\", hal_spec->macid_num);\n\tDBG_871X_SEL_NL(sel, \"sec_cap:0x%02x\\n\", hal_spec->sec_cap);\n\tDBG_871X_SEL_NL(sel, \"sec_cam_ent_num:%u\\n\", hal_spec->sec_cam_ent_num);\n\tDBG_871X_SEL_NL(sel, \"nss_num:%u\\n\", hal_spec->nss_num);\n\n\tDBG_871X_SEL_NL(sel, \"band_cap:\");\n\tfor (i = 0; i < BAND_CAP_BIT_NUM; i++) {\n\t\tif (((hal_spec->band_cap) >> i) & BIT0 && _band_cap_str[i])\n\t\t\tDBG_871X_SEL(sel, \"%s \", _band_cap_str[i]);\n\t}\n\tDBG_871X_SEL(sel, \"\\n\");\n\n\tDBG_871X_SEL_NL(sel, \"bw_cap:\");\n\tfor (i = 0; i < BW_CAP_BIT_NUM; i++) {\n\t\tif (((hal_spec->bw_cap) >> i) & BIT0 && _bw_cap_str[i])\n\t\t\tDBG_871X_SEL(sel, \"%s \", _bw_cap_str[i]);\n\t}\n\tDBG_871X_SEL(sel, \"\\n\");\n\n\tDBG_871X_SEL_NL(sel, \"wl_func:\");\n\tfor (i = 0; i < WL_FUNC_BIT_NUM; i++) {\n\t\tif (((hal_spec->wl_func) >> i) & BIT0 && _wl_func_str[i])\n\t\t\tDBG_871X_SEL(sel, \"%s \", _wl_func_str[i]);\n\t}\n\tDBG_871X_SEL(sel, \"\\n\");\n}\n\ninline bool hal_chk_band_cap(_adapter *adapter, u8 cap)\n{\n\treturn (GET_HAL_SPEC(adapter)->band_cap & cap);\n}\n\ninline bool hal_chk_bw_cap(_adapter *adapter, u8 cap)\n{\n\treturn (GET_HAL_SPEC(adapter)->bw_cap & cap);\n}\n\ninline bool hal_is_band_support(_adapter *adapter, u8 band)\n{\n\treturn (GET_HAL_SPEC(adapter)->band_cap & band_to_band_cap(band));\n}\n\ninline bool hal_is_bw_support(_adapter *adapter, u8 bw)\n{\n\treturn (GET_HAL_SPEC(adapter)->bw_cap & ch_width_to_bw_cap(bw));\n}\n\n/*\n* hal_largest_bw - starting from in_bw, get largest bw supported by HAL\n* @adapter:\n* @in_bw: starting bw, value of CHANNEL_WIDTH\n*\n* Returns: value of CHANNEL_WIDTH\n*/\nu8 hal_largest_bw(_adapter *adapter, u8 in_bw)\n{\n\tfor (; in_bw > CHANNEL_WIDTH_20; in_bw--) {\n\t\tif (hal_is_bw_support(adapter, in_bw))\n\t\t\tbreak;\n\t}\n\n\tif (!hal_is_bw_support(adapter, in_bw))\n\t\trtw_warn_on(1);\n\n\treturn in_bw;\n}\n\n"
  },
  {
    "path": "hal/hal_com_c2h.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __COMMON_C2H_H__\n#define __COMMON_C2H_H__\n\ntypedef enum _C2H_EVT {\n\tC2H_DBG = 0x00,\n\tC2H_LB = 0x01,\n\tC2H_TXBF = 0x02,\n\tC2H_CCX_TX_RPT = 0x03,\n\tC2H_BT_INFO = 0x09,\n\tC2H_BT_MP_INFO = 0x0B,\n\tC2H_RA_RPT = 0x0C,\n\tC2H_RA_PARA_RPT = 0x0E,\n\tC2H_FW_SWCHNL = 0x10,\n\tC2H_IQK_FINISH = 0x11,\n\tC2H_MAILBOX_STATUS = 0x15,\n\tC2H_P2P_RPORT = 0x16,\n\tC2H_EXTEND = 0xff,\n} C2H_EVT;\n\ntypedef enum _EXTEND_C2H_EVT {\n\tEXTEND_C2H_DBG_PRINT = 0\n} EXTEND_C2H_EVT;\n\n#endif /* __COMMON_C2H_H__ */\n\n"
  },
  {
    "path": "hal/hal_com_phycfg.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HAL_COM_PHYCFG_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n\n//\n//\tDescription:\n//\t\tMap Tx power index into dBm according to \n//\t\tcurrent HW model, for example, RF and PA, and\n//\t\tcurrent wireless mode.\n//\tBy Bruce, 2008-01-29.\n//\ns32\nphy_TxPwrIdxToDbm(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tWIRELESS_MODE\tWirelessMode,\n\tIN\tu8\t\t\t\tTxPwrIdx\n\t)\n{\n\ts32\t\t\t\tOffset = 0;\n\ts32\t\t\t\tPwrOutDbm = 0;\n\t\n\t//\n\t// Tested by MP, we found that CCK Index 0 equals to -7dbm, OFDM legacy equals to -8dbm.\n\t// Note:\n\t//\tThe mapping may be different by different NICs. Do not use this formula for what needs accurate result.  \n\t// By Bruce, 2008-01-29.\n\t// \n\tswitch(WirelessMode)\n\t{\n\tcase WIRELESS_MODE_B:\n\t\tOffset = -7;\t\t\n\t\tbreak;\n\n\tcase WIRELESS_MODE_G:\n\tcase WIRELESS_MODE_N_24G:\n\t\tOffset = -8;\n\t\tbreak;\n\t\t\n\tdefault: //for MacOSX compiler warning\n\t\tbreak;\t\t\n\t}\n\n\tPwrOutDbm = TxPwrIdx / 2 + Offset; // Discard the decimal part.\n\n\treturn PwrOutDbm;\n}\n\nbool rtw_regsty_tx_power_by_rate_base_valid(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\t/* TODO: check registry power by rate base valid */\n\treturn _FALSE;\n}\n\nu8 rtw_regsty_get_tx_power_by_rate_base(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\tBand,\n\tIN\tu8\t\t\t\tRfPath,\n\tIN\tu8\t\t\t\tTxNum,\n\tIN\tRATE_SECTION\tRateSection\n\t)\n{\n\t/* TODO: return registry power by rate base */\n\treturn 0;\n}\n\nu8\nPHY_GetTxPowerByRateBase(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\tBand,\n\tIN\tu8\t\t\t\tRfPath,\n\tIN\tu8\t\t\t\tTxNum,\n\tIN\tRATE_SECTION\tRateSection\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8 \t\t\tvalue = 0;\n\n\tif ( RfPath > ODM_RF_PATH_D )\n\t{\n\t\tDBG_871X(\"Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\\n\", RfPath );\n\t\treturn 0;\n\t}\n\t\n\tif ( Band == BAND_ON_2_4G )\n\t{\n\t\tswitch ( RateSection ) {\n\t\t\tcase CCK:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][0];\n\t\t\t\tbreak;\n\t\t\tcase OFDM:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][1];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS0_MCS7:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][2];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS8_MCS15:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][3];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS16_MCS23:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][4];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS24_MCS31:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][5];\n\t\t\t\tbreak;\n\t\t\tcase VHT_1SSMCS0_1SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][6];\n\t\t\t\tbreak;\n\t\t\tcase VHT_2SSMCS0_2SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][7];\n\t\t\t\tbreak;\n\t\t\tcase VHT_3SSMCS0_3SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][8];\n\t\t\t\tbreak;\n\t\t\tcase VHT_4SSMCS0_4SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][9];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\\n\", \n\t\t\t\t\t\t RateSection, RfPath, TxNum );\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t};\n\t}\n\telse if ( Band == BAND_ON_5G )\n\t{\n\t\tswitch ( RateSection ) {\n\t\t\tcase OFDM:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][0];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS0_MCS7:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][1];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS8_MCS15:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][2];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS16_MCS23:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][3];\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS24_MCS31:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][4];\n\t\t\t\tbreak;\n\t\t\tcase VHT_1SSMCS0_1SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][5];\n\t\t\t\tbreak;\n\t\t\tcase VHT_2SSMCS0_2SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][6];\n\t\t\t\tbreak;\n\t\t\tcase VHT_3SSMCS0_3SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][7];\n\t\t\t\tbreak;\n\t\t\tcase VHT_4SSMCS0_4SSMCS9:\n\t\t\t\tvalue = pHalData->TxPwrByRateBase5G[RfPath][TxNum][8];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\\n\", \n\t\t\t\t\t\t RateSection, RfPath, TxNum );\n\t\t\t\tbreak;\n\t\t};\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"Invalid Band %d in PHY_GetTxPowerByRateBase()\\n\", Band );\n\t}\n\n\treturn value;\n}\n\nVOID\nphy_SetTxPowerByRateBase(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\tBand,\n\tIN\tu8\t\t\t\tRfPath,\n\tIN\tRATE_SECTION\tRateSection,\n\tIN\tu8\t\t\t\tTxNum,\n\tIN\tu8\t\t\t\tValue\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\tif ( RfPath > ODM_RF_PATH_D )\n\t{\n\t\tDBG_871X(\"Invalid Rf Path %d in phy_SetTxPowerByRatBase()\\n\", RfPath );\n\t\treturn;\n\t}\n\t\n\tif ( Band == BAND_ON_2_4G )\n\t{\n\t\tswitch ( RateSection ) {\n\t\t\tcase CCK:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][0] = Value;\n\t\t\t\tbreak;\n\t\t\tcase OFDM:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][1] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS0_MCS7:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][2] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS8_MCS15:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][3] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS16_MCS23:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][4] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS24_MCS31:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][5] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_1SSMCS0_1SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][6] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_2SSMCS0_2SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][7] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_3SSMCS0_3SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][8] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_4SSMCS0_4SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase2_4G[RfPath][TxNum][9] = Value;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in phy_SetTxPowerByRateBase()\\n\", \n\t\t\t\t\t\t RateSection, RfPath, TxNum );\n\t\t\t\tbreak;\n\t\t};\n\t}\n\telse if ( Band == BAND_ON_5G )\n\t{\n\t\tswitch ( RateSection ) {\n\t\t\tcase OFDM:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][0] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS0_MCS7:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][1] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS8_MCS15:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][2] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS16_MCS23:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][3] = Value;\n\t\t\t\tbreak;\n\t\t\tcase HT_MCS24_MCS31:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][4] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_1SSMCS0_1SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][5] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_2SSMCS0_2SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][6] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_3SSMCS0_3SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][7] = Value;\n\t\t\t\tbreak;\n\t\t\tcase VHT_4SSMCS0_4SSMCS9:\n\t\t\t\tpHalData->TxPwrByRateBase5G[RfPath][TxNum][8] = Value;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in phy_SetTxPowerByRateBase()\\n\", \n\t\t\t\t\t\t RateSection, RfPath, TxNum );\n\t\t\t\tbreak;\n\t\t};\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"Invalid Band %d in phy_SetTxPowerByRateBase()\\n\", Band );\n\t}\n}\n\nVOID\nphy_StoreTxPowerByRateBaseOld(\t\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tu16\t\t\trawValue = 0;\n\tu8\t\t\tbase = 0;\n\tu8\t\t\tpath = 0;\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][7] >> 8 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, CCK, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][1] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, OFDM, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][3] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, HT_MCS0_MCS7, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][5] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, HT_MCS8_MCS15, RF_2TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][7] & 0xFF ); \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, CCK, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][9] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, OFDM, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][11] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, HT_MCS0_MCS7, RF_1TX, base );\n\n\trawValue = ( u16 ) ( pHalData->MCSTxPowerLevelOriginalOffset[0][13] >> 24 ) & 0xFF; \n\tbase = ( rawValue >> 4 ) * 10 + ( rawValue & 0xF );\n\tphy_SetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, HT_MCS8_MCS15, RF_2TX, base );\n}\n\nVOID\nphy_StoreTxPowerByRateBase(\t\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(pAdapter);\n\n\tu8 rate_sec_base[RATE_SECTION_NUM] = {\n\t\tMGN_11M,\n\t\tMGN_54M,\n\t\tMGN_MCS7,\n\t\tMGN_MCS15,\n\t\tMGN_MCS23,\n\t\tMGN_MCS31,\n\t\tMGN_VHT1SS_MCS7,\n\t\tMGN_VHT2SS_MCS7,\n\t\tMGN_VHT3SS_MCS7,\n\t\tMGN_VHT4SS_MCS7,\n\t};\n\n\tu8 band, path, rs, tx_num, base, index;\n\n\tfor (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {\n\n\t\tfor (path = RF_PATH_A; path < RF_PATH_MAX; path++) {\n\t\t\t/* TODO: 8814A's NumTotalRFPath differs at probe(3) and up(4), need fixed\n\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\tbreak;\n\t\t\t*/\n\n\t\t\tfor (rs = 0; rs < RATE_SECTION_NUM; rs++) {\n\t\t\t\ttx_num = rate_section_to_tx_num(rs);\n\t\t\t\tif (tx_num >= hal_spec->nss_num)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tbase = PHY_GetTxPowerByRate(pAdapter, band, path, tx_num, rate_sec_base[rs]);\n\t\t\t\tphy_SetTxPowerByRateBase(pAdapter, band, path, rs, tx_num, base);\n\t\t\t}\n\t\t}\n\t}\n}\n\nu8\nPHY_GetRateSectionIndexOfTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu32\t\t\tRegAddr,\n\tIN\tu32\t\t\tBitMask\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tu8 \t\t\tindex = 0;\n\t\n\tif ( pDM_Odm->PhyRegPgVersion == 0 )\n\t{\n\t\tswitch ( RegAddr )\n\t\t{\n\t\t\tcase rTxAGC_A_Rate18_06:\t index = 0;\t\tbreak;\n\t\t\tcase rTxAGC_A_Rate54_24:\t index = 1;\t\tbreak;\n\t\t\tcase rTxAGC_A_CCK1_Mcs32:\t index = 6;\t\tbreak;\n\t\t\tcase rTxAGC_B_CCK11_A_CCK2_11:\n\t\t\t\tif ( BitMask == bMaskH3Bytes )\n\t\t\t\t\tindex = 7;\n\t\t\t\telse if ( BitMask == 0x000000ff )\n\t\t\t\t\tindex = 15;\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase rTxAGC_A_Mcs03_Mcs00:\t index = 2;\t\tbreak;\n\t\t\tcase rTxAGC_A_Mcs07_Mcs04:\t index = 3;\t\tbreak;\n\t\t\tcase rTxAGC_A_Mcs11_Mcs08:\t index = 4;\t\tbreak;\n\t\t\tcase rTxAGC_A_Mcs15_Mcs12:\t index = 5;\t\tbreak;\n\t\t\tcase rTxAGC_B_Rate18_06:\t index = 8;\t\tbreak;\n\t\t\tcase rTxAGC_B_Rate54_24:\t index = 9;\t\tbreak;\n\t\t\tcase rTxAGC_B_CCK1_55_Mcs32: index = 14;\tbreak;\n\t\t\tcase rTxAGC_B_Mcs03_Mcs00:\t index = 10;\tbreak;\n\t\t\tcase rTxAGC_B_Mcs07_Mcs04:\t index = 11;\tbreak;\n\t\t\tcase rTxAGC_B_Mcs11_Mcs08:\t index = 12;\tbreak;\n\t\t\tcase rTxAGC_B_Mcs15_Mcs12:\t index = 13;\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"Invalid RegAddr 0x3%x in PHY_GetRateSectionIndexOfTxPowerByRate()\", RegAddr );\n\t\t\t\tbreak;\n\t\t};\n\t}\n\t\n\treturn index;\n}\n\nVOID\nPHY_GetRateValuesOfTxPowerByRate(\n\tIN\tPADAPTER pAdapter,\n\tIN\tu32 RegAddr,\n\tIN\tu32 BitMask,\n\tIN\tu32 Value,\n\tOUT\tu8 *Rate,\n\tOUT\ts8 *PwrByRateVal,\n\tOUT\tu8 *RateNum\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tu8\t \t\t\tindex = 0, i = 0;\n\t\n\tswitch ( RegAddr )\n\t{\n\t\tcase rTxAGC_A_Rate18_06:\n\t\tcase rTxAGC_B_Rate18_06:\n\t\t\tRate[0] = MGN_6M;\n\t\t\tRate[1] = MGN_9M;\n\t\t\tRate[2] = MGN_12M;\n\t\t\tRate[3] = MGN_18M;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_Rate54_24:\n\t\tcase rTxAGC_B_Rate54_24:\n\t\t\tRate[0] = MGN_24M;\n\t\t\tRate[1] = MGN_36M;\n\t\t\tRate[2] = MGN_48M;\n\t\t\tRate[3] = MGN_54M;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_CCK1_Mcs32:\n\t\t\tRate[0] = MGN_1M;\n\t\t\tPwrByRateVal[0] = ( s8 ) ( ( ( ( Value >> (8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t( ( Value >> 8 ) & 0xF ) );\n\t\t\t*RateNum = 1;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_B_CCK11_A_CCK2_11:\n\t\t\tif ( BitMask == 0xffffff00 )\n\t\t\t{\n\t\t\t\tRate[0] = MGN_2M;\n\t\t\t\tRate[1] = MGN_5_5M;\n\t\t\t\tRate[2] = MGN_11M;\n\t\t\t\tfor ( i = 1; i < 4; ++ i )\n\t\t\t\t{\n\t\t\t\t\tPwrByRateVal[i - 1] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t\t}\n\t\t\t\t*RateNum = 3;\n\t\t\t}\n\t\t\telse if ( BitMask == 0x000000ff )\n\t\t\t{\n\t\t\t\tRate[0] = MGN_11M;\n\t\t\t\tPwrByRateVal[0] = ( s8 ) ( ( ( ( Value >> 4 ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t        ( Value & 0xF ) );\n\t\t\t\t*RateNum = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_Mcs03_Mcs00:\n\t\tcase rTxAGC_B_Mcs03_Mcs00:\n\t\t\tRate[0] = MGN_MCS0;\n\t\t\tRate[1] = MGN_MCS1;\n\t\t\tRate[2] = MGN_MCS2;\n\t\t\tRate[3] = MGN_MCS3;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_Mcs07_Mcs04:\n\t\tcase rTxAGC_B_Mcs07_Mcs04:\n\t\t\tRate[0] = MGN_MCS4;\n\t\t\tRate[1] = MGN_MCS5;\n\t\t\tRate[2] = MGN_MCS6;\n\t\t\tRate[3] = MGN_MCS7;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_Mcs11_Mcs08:\n\t\tcase rTxAGC_B_Mcs11_Mcs08:\n\t\t\tRate[0] = MGN_MCS8;\n\t\t\tRate[1] = MGN_MCS9;\n\t\t\tRate[2] = MGN_MCS10;\n\t\t\tRate[3] = MGN_MCS11;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_A_Mcs15_Mcs12:\n\t\tcase rTxAGC_B_Mcs15_Mcs12:\n\t\t\tRate[0] = MGN_MCS12;\n\t\t\tRate[1] = MGN_MCS13;\n\t\t\tRate[2] = MGN_MCS14;\n\t\t\tRate[3] = MGN_MCS15;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase rTxAGC_B_CCK1_55_Mcs32:\n\t\t\tRate[0] = MGN_1M;\n\t\t\tRate[1] = MGN_2M;\n\t\t\tRate[2] = MGN_5_5M;\n\t\t\tfor ( i = 1; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i - 1] = ( s8 ) ( ( ( ( Value >> ( i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> ( i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 3;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 0xC20:\n\t\tcase 0xE20:\n\t\tcase 0x1820:\n\t\tcase 0x1a20:\n\t\t\tRate[0] = MGN_1M;\n\t\t\tRate[1] = MGN_2M;\n\t\t\tRate[2] = MGN_5_5M;\n\t\t\tRate[3] = MGN_11M;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\t\t\t\n\t\tcase 0xC24:\n\t\tcase 0xE24:\n\t\tcase 0x1824:\n\t\tcase 0x1a24:\n\t\t\tRate[0] = MGN_6M;\n\t\t\tRate[1] = MGN_9M;\n\t\t\tRate[2] = MGN_12M;\n\t\t\tRate[3] = MGN_18M;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC28:\n\t\tcase 0xE28:\n\t\tcase 0x1828:\n\t\tcase 0x1a28:\n\t\t\tRate[0] = MGN_24M;\n\t\t\tRate[1] = MGN_36M;\n\t\t\tRate[2] = MGN_48M;\n\t\t\tRate[3] = MGN_54M;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC2C:\n\t\tcase 0xE2C:\n\t\tcase 0x182C:\n\t\tcase 0x1a2C:\n\t\t\tRate[0] = MGN_MCS0;\n\t\t\tRate[1] = MGN_MCS1;\n\t\t\tRate[2] = MGN_MCS2;\n\t\t\tRate[3] = MGN_MCS3;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC30:\n\t\tcase 0xE30:\n\t\tcase 0x1830:\n\t\tcase 0x1a30:\n\t\t\tRate[0] = MGN_MCS4;\n\t\t\tRate[1] = MGN_MCS5;\n\t\t\tRate[2] = MGN_MCS6;\n\t\t\tRate[3] = MGN_MCS7;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC34:\n\t\tcase 0xE34:\n\t\tcase 0x1834:\n\t\tcase 0x1a34:\n\t\t\tRate[0] = MGN_MCS8;\n\t\t\tRate[1] = MGN_MCS9;\n\t\t\tRate[2] = MGN_MCS10;\n\t\t\tRate[3] = MGN_MCS11;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC38:\n\t\tcase 0xE38:\n\t\tcase 0x1838:\n\t\tcase 0x1a38:\n\t\t\tRate[0] = MGN_MCS12;\n\t\t\tRate[1] = MGN_MCS13;\n\t\t\tRate[2] = MGN_MCS14;\n\t\t\tRate[3] = MGN_MCS15;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC3C:\n\t\tcase 0xE3C:\n\t\tcase 0x183C:\n\t\tcase 0x1a3C:\n\t\t\tRate[0] = MGN_VHT1SS_MCS0;\n\t\t\tRate[1] = MGN_VHT1SS_MCS1;\n\t\t\tRate[2] = MGN_VHT1SS_MCS2;\n\t\t\tRate[3] = MGN_VHT1SS_MCS3;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC40:\n\t\tcase 0xE40:\n\t\tcase 0x1840:\n\t\tcase 0x1a40:\n\t\t\tRate[0] = MGN_VHT1SS_MCS4;\n\t\t\tRate[1] = MGN_VHT1SS_MCS5;\n\t\t\tRate[2] = MGN_VHT1SS_MCS6;\n\t\t\tRate[3] = MGN_VHT1SS_MCS7;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC44:\n\t\tcase 0xE44:\n\t\tcase 0x1844:\n\t\tcase 0x1a44:\n\t\t\tRate[0] = MGN_VHT1SS_MCS8;\n\t\t\tRate[1] = MGN_VHT1SS_MCS9;\n\t\t\tRate[2] = MGN_VHT2SS_MCS0;\n\t\t\tRate[3] = MGN_VHT2SS_MCS1;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC48:\n\t\tcase 0xE48:\n\t\tcase 0x1848:\n\t\tcase 0x1a48:\n\t\t\tRate[0] = MGN_VHT2SS_MCS2;\n\t\t\tRate[1] = MGN_VHT2SS_MCS3;\n\t\t\tRate[2] = MGN_VHT2SS_MCS4;\n\t\t\tRate[3] = MGN_VHT2SS_MCS5;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xC4C:\n\t\tcase 0xE4C:\n\t\tcase 0x184C:\n\t\tcase 0x1a4C:\n\t\t\tRate[0] = MGN_VHT2SS_MCS6;\n\t\t\tRate[1] = MGN_VHT2SS_MCS7;\n\t\t\tRate[2] = MGN_VHT2SS_MCS8;\n\t\t\tRate[3] = MGN_VHT2SS_MCS9;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xCD8:\n\t\tcase 0xED8:\n\t\tcase 0x18D8:\n\t\tcase 0x1aD8:\n\t\t\tRate[0] = MGN_MCS16;\n\t\t\tRate[1] = MGN_MCS17;\n\t\t\tRate[2] = MGN_MCS18;\n\t\t\tRate[3] = MGN_MCS19;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xCDC:\n\t\tcase 0xEDC:\n\t\tcase 0x18DC:\n\t\tcase 0x1aDC:\n\t\t\tRate[0] = MGN_MCS20;\n\t\t\tRate[1] = MGN_MCS21;\n\t\t\tRate[2] = MGN_MCS22;\n\t\t\tRate[3] = MGN_MCS23;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xCE0:\n\t\tcase 0xEE0:\n\t\tcase 0x18E0:\n\t\tcase 0x1aE0:\n\t\t\tRate[0] = MGN_VHT3SS_MCS0;\n\t\t\tRate[1] = MGN_VHT3SS_MCS1;\n\t\t\tRate[2] = MGN_VHT3SS_MCS2;\n\t\t\tRate[3] = MGN_VHT3SS_MCS3;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xCE4:\n\t\tcase 0xEE4:\n\t\tcase 0x18E4:\n\t\tcase 0x1aE4:\n\t\t\tRate[0] = MGN_VHT3SS_MCS4;\n\t\t\tRate[1] = MGN_VHT3SS_MCS5;\n\t\t\tRate[2] = MGN_VHT3SS_MCS6;\n\t\t\tRate[3] = MGN_VHT3SS_MCS7;\n\t\t\tfor ( i = 0; i < 4; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 4;\n\t\t\tbreak;\n\n\t\tcase 0xCE8:\n\t\tcase 0xEE8:\n\t\tcase 0x18E8:\n\t\tcase 0x1aE8:\n\t\t\tRate[0] = MGN_VHT3SS_MCS8;\n\t\t\tRate[1] = MGN_VHT3SS_MCS9;\n\t\t\tfor ( i = 0; i < 2; ++ i )\n\t\t\t{\n\t\t\t\tPwrByRateVal[i] = ( s8 ) ( ( ( ( Value >> (i * 8 + 4) ) & 0xF ) ) * 10 + \n\t\t\t\t\t\t\t\t\t\t\t\t( ( Value >> (i * 8) ) & 0xF ) );\n\t\t\t}\n\t\t\t*RateNum = 2;\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid RegAddr 0x%x in %s()\\n\", RegAddr, __func__);\n\t\t\tbreak;\n\t};\n}\n\nvoid\nPHY_StoreTxPowerByRateNew(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu32\t\t\tBand,\n\tIN\tu32\t\t\tRfPath,\n\tIN\tu32\t\t\tTxNum,\n\tIN\tu32\t\t\tRegAddr,\n\tIN\tu32\t\t\tBitMask,\n\tIN\tu32\t\t\tData\n\t)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\tu8\ti = 0, rates[4] = {0}, rateNum = 0;\n\ts8\tPwrByRateVal[4] = {0};\n\n\tPHY_GetRateValuesOfTxPowerByRate(pAdapter, RegAddr, BitMask, Data, rates, PwrByRateVal, &rateNum);\n\n\tif (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid Band %d\\n\", Band);\n\t\treturn;\n\t}\n\n\tif (RfPath > ODM_RF_PATH_D) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid RfPath %d\\n\", RfPath);\n\t\treturn;\n\t}\n\n\tif (TxNum > ODM_RF_PATH_D) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid TxNum %d\\n\", TxNum);\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < rateNum; ++i) {\n\t\tu8 rate_idx = PHY_GetRateIndexOfTxPowerByRate(rates[i]);\n\n\t\tif (IS_1T_RATE(rates[i]))\n\t\t\tpHalData->TxPwrByRateOffset[Band][RfPath][RF_1TX][rate_idx] = PwrByRateVal[i];\n\t\telse if (IS_2T_RATE(rates[i]))\n\t\t\tpHalData->TxPwrByRateOffset[Band][RfPath][RF_2TX][rate_idx] = PwrByRateVal[i];\n\t\telse if (IS_3T_RATE(rates[i]))\n\t\t\tpHalData->TxPwrByRateOffset[Band][RfPath][RF_3TX][rate_idx] = PwrByRateVal[i];\n\t\telse if (IS_4T_RATE(rates[i]))\n\t\t\tpHalData->TxPwrByRateOffset[Band][RfPath][RF_4TX][rate_idx] = PwrByRateVal[i];\n\t\telse\n\t\t\trtw_warn_on(1);\n\t}\n}\n\nvoid \nPHY_StoreTxPowerByRateOld(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask,\n\tIN\tu32\t\t\t\tData\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu8\t\t\tindex = PHY_GetRateSectionIndexOfTxPowerByRate( pAdapter, RegAddr, BitMask );\n\n\tpHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][index] = Data;\n\t//DBG_871X(\"MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\\n\", pHalData->pwrGroupCnt,\n\t//\tpHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0]);\n}\n\nVOID\nPHY_InitTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu8\tband = 0, rfPath = 0, TxNum = 0, rate = 0, i = 0, j = 0;\n\n\tif ( IS_HARDWARE_TYPE_8188E( pAdapter ) )\n\t{\n\t\tfor ( i = 0; i < MAX_PG_GROUP; ++i )\n\t\t\tfor ( j = 0; j < 16; ++j )\n\t\t\t\tpHalData->MCSTxPowerLevelOriginalOffset[i][j] = 0;\n\t}\n\telse\n\t{\n\t\tfor ( band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band )\n\t\t\t\tfor ( rfPath = 0; rfPath < TX_PWR_BY_RATE_NUM_RF; ++rfPath )\n\t\t\t\t\tfor ( TxNum = 0; TxNum < TX_PWR_BY_RATE_NUM_RF; ++TxNum )\n\t\t\t\t\t\tfor ( rate = 0; rate < TX_PWR_BY_RATE_NUM_RATE; ++rate )\n\t\t\t\t\t\t\tpHalData->TxPwrByRateOffset[band][rfPath][TxNum][rate] = 0;\n\t}\n}\n\nVOID\nPHY_StoreTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu32\t\t\tBand,\n\tIN\tu32\t\t\tRfPath,\n\tIN\tu32\t\t\tTxNum,\n\tIN\tu32\t\t\tRegAddr,\n\tIN\tu32\t\t\tBitMask,\n\tIN\tu32\t\t\tData\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T  \t\tpDM_Odm = &pHalData->odmpriv;\n\t\n\tif ( pDM_Odm->PhyRegPgVersion > 0 )\n\t{\n\t\tPHY_StoreTxPowerByRateNew( pAdapter, Band, RfPath, TxNum, RegAddr, BitMask, Data );\n\t}\n\telse if ( pDM_Odm->PhyRegPgVersion == 0 )\n\t{\n\t\tPHY_StoreTxPowerByRateOld( pAdapter, RegAddr, BitMask, Data );\n\t\n\t\tif ( RegAddr == rTxAGC_A_Mcs15_Mcs12 && pHalData->rf_type == RF_1T1R )\n\t\t\tpHalData->pwrGroupCnt++;\n\t\telse if ( RegAddr == rTxAGC_B_Mcs15_Mcs12 && pHalData->rf_type != RF_1T1R )\n\t\t\tpHalData->pwrGroupCnt++;\n\t}\n\telse\n\t\tDBG_871X(\"Invalid PHY_REG_PG.txt version %d\\n\",  pDM_Odm->PhyRegPgVersion );\n\t\n}\n\nVOID \nphy_ConvertTxPowerByRateByBase(\n\tIN\tu32*\t\tpData,\n\tIN\tu8\t\t\tStart,\n\tIN\tu8\t\t\tEnd,\n\tIN\tu8\t\t\tBaseValue\n\t)\n{\n\ts8\ti = 0;\n\tu8\tTempValue = 0;\n\tu32\tTempData = 0;\n\t\n\tfor ( i = 3; i >= 0; --i )\n\t{\n\t\tif ( i >= Start && i <= End )\n\t\t{\n\t\t\t// Get the exact value\n\t\t\tTempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xF; \n\t\t\tTempValue += ( ( u8 ) ( ( *pData >> ( i * 8 + 4 ) ) & 0xF ) ) * 10; \n\t\t\t\n\t\t\t// Change the value to a relative value\n\t\t\tTempValue = ( TempValue > BaseValue ) ? TempValue - BaseValue : BaseValue - TempValue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTempValue = ( u8 ) ( *pData >> ( i * 8 ) ) & 0xFF;\n\t\t}\n\t\t\n\t\tTempData <<= 8;\n\t\tTempData |= TempValue;\n\t}\n\n\t*pData = TempData;\n}\n\n\nVOID\nPHY_ConvertTxPowerByRateInDbmToRelativeValuesOld(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tu8\t\t\tbase = 0;\n\t\n\t//DBG_871X(\"===>PHY_ConvertTxPowerByRateInDbmToRelativeValuesOld()\\n\" );\n\t\n\t// CCK\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, RF_1TX, CCK );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][6] ), 1, 1, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][7] ), 1, 3, base );\n\n\t// OFDM\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, RF_1TX, OFDM );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][0] ), 0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][1] ),\t0, 3, base );\n\n\t// HT MCS0~7\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, RF_1TX, HT_MCS0_MCS7 );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][2] ),\t0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][3] ),\t0, 3, base );\n\n\t// HT MCS8~15\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, RF_2TX, HT_MCS8_MCS15 );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][4] ), 0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][5] ), 0, 3, base );\n\n\t// CCK\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, RF_1TX, CCK );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][14] ), 1, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][15] ), 0, 0, base );\n\n\t// OFDM\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, RF_1TX, OFDM );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][8] ), 0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][9] ),\t0, 3, base );\n\n\t// HT MCS0~7\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, RF_1TX, HT_MCS0_MCS7 );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][10] ), 0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][11] ), 0, 3, base );\n\n\t// HT MCS8~15\n\tbase = PHY_GetTxPowerByRateBase( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_B, RF_2TX, HT_MCS8_MCS15 );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][12] ), 0, 3, base );\n\tphy_ConvertTxPowerByRateByBase( \n\t\t\t&( pHalData->MCSTxPowerLevelOriginalOffset[0][13] ), 0, 3, base );\n\n\t//DBG_871X(\"<===PHY_ConvertTxPowerByRateInDbmToRelativeValuesOld()\\n\" );\n}\n\nVOID\nphy_ConvertTxPowerByRateInDbmToRelativeValues(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tu8 \t\t\tbase = 0, i = 0, value = 0,\n\t\t\t\tband = 0, path = 0, txNum = 0, index = 0, \n\t\t\t\tstartIndex = 0, endIndex = 0;\n\tu8\t\t\tcckRates[4] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M},\n\t\t\t\tofdmRates[8] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M},\n\t\t\t\tmcs0_7Rates[8] = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7},\n\t\t\t\tmcs8_15Rates[8] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15},\n\t\t\t\tmcs16_23Rates[8] = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23},\n\t\t\t\tvht1ssRates[10] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4, \n\t\t\t\t\t\t\t   MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9},\n\t\t\t\tvht2ssRates[10] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, \n\t\t\t\t\t\t\t   MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9},\n\t\t\t\tvht3ssRates[10] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4, \n\t\t\t\t\t\t\t\t   MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9};\n\n\t//DBG_871X(\"===>PHY_ConvertTxPowerByRateInDbmToRelativeValues()\\n\" );\n\n\tfor ( band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band )\n\t{\n\t\tfor ( path = ODM_RF_PATH_A; path <= ODM_RF_PATH_D; ++path )\n\t\t{\n\t\t\tfor ( txNum = RF_1TX; txNum < RF_MAX_TX_NUM; ++txNum )\n\t\t\t{\n\t\t\t\t// CCK\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_11M );\n\t\t\t\tfor ( i = 0; i < sizeof( cckRates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, cckRates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, cckRates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// OFDM\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_54M );\n\t\t\t\tfor ( i = 0; i < sizeof( ofdmRates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, ofdmRates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, ofdmRates[i], value - base );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// HT MCS0~7\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_MCS7 );\n\t\t\t\tfor ( i = 0; i < sizeof( mcs0_7Rates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, mcs0_7Rates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, mcs0_7Rates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// HT MCS8~15\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_MCS15 );\n\t\t\t\tfor ( i = 0; i < sizeof( mcs8_15Rates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, mcs8_15Rates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, mcs8_15Rates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// HT MCS16~23\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_MCS23 );\n\t\t\t\tfor ( i = 0; i < sizeof( mcs16_23Rates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, mcs16_23Rates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, mcs16_23Rates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// VHT 1SS\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_VHT1SS_MCS7 );\n\t\t\t\tfor ( i = 0; i < sizeof( vht1ssRates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, vht1ssRates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, vht1ssRates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// VHT 2SS\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_VHT2SS_MCS7 );\n\t\t\t\tfor ( i = 0; i < sizeof( vht2ssRates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, vht2ssRates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, vht2ssRates[i], value - base );\n\t\t\t\t}\n\n\t\t\t\t// VHT 3SS\n\t\t\t\tbase = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, MGN_VHT3SS_MCS7 );\n\t\t\t\tfor ( i = 0; i < sizeof( vht3ssRates ); ++i )\n\t\t\t\t{\n\t\t\t\t\tvalue = PHY_GetTxPowerByRate( pAdapter, band, path, txNum, vht3ssRates[i] );\n\t\t\t\t\tPHY_SetTxPowerByRate( pAdapter, band, path, txNum, vht3ssRates[i], value - base );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//DBG_871X(\"<===PHY_ConvertTxPowerByRateInDbmToRelativeValues()\\n\" );\n}\n\n/*\n  * This function must be called if the value in the PHY_REG_PG.txt(or header)\n  * is exact dBm values\n  */\nVOID\nPHY_TxPowerByRateConfiguration(\n\tIN  PADAPTER\t\t\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter);\n\n\tphy_StoreTxPowerByRateBase( pAdapter );\n\tphy_ConvertTxPowerByRateInDbmToRelativeValues( pAdapter );\n}\n\nVOID \nPHY_SetTxPowerIndexByRateSection(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tChannel,\n\tIN\tu8\t\t\t\tRateSection\n\t)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(pAdapter);\n\n\tif ( RateSection == CCK )\n\t{\n\t\tu8\tcckRates[]   = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M};\n\t\tif ( pHalData->CurrentBandType == BAND_ON_2_4G )\n\t\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t\t  cckRates, sizeof(cckRates)/sizeof(u8) );\n\t\t\t\n\t}\n\telse if ( RateSection == OFDM )\n\t{\n\t\tu8\tofdmRates[]  = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t\t ofdmRates, sizeof(ofdmRates)/sizeof(u8));\n\t\t\n\t}\n\telse if ( RateSection == HT_MCS0_MCS7 )\n\t{\n\t\tu8\thtRates1T[]  = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t\t htRates1T, sizeof(htRates1T)/sizeof(u8));\n\n\t}\n\telse if ( RateSection == HT_MCS8_MCS15 )\n\t{\n\t\tu8\thtRates2T[]  = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  \t htRates2T, sizeof(htRates2T)/sizeof(u8));\n\t\t\n\t}\n\telse if ( RateSection == HT_MCS16_MCS23 )\n\t{\n\t\tu1Byte\thtRates3T[]  = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  \t htRates3T, sizeof(htRates3T)/sizeof(u1Byte));\n\t\t\n\t}\n\telse if ( RateSection == HT_MCS24_MCS31 )\n\t{\n\t\tu1Byte\thtRates4T[]  = {MGN_MCS24, MGN_MCS25, MGN_MCS26, MGN_MCS27, MGN_MCS28, MGN_MCS29, MGN_MCS30, MGN_MCS31};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  \t htRates4T, sizeof(htRates4T)/sizeof(u1Byte));\n\t\t\n\t}\n\telse if ( RateSection == VHT_1SSMCS0_1SSMCS9 )\n\t{\t\n\t\tu8\tvhtRates1T[] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4, \n                            \tMGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9};\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t\tvhtRates1T, sizeof(vhtRates1T)/sizeof(u8));\n\n\t}\n\telse if ( RateSection == VHT_2SSMCS0_2SSMCS9 )\n\t{\n\t\tu8\tvhtRates2T[] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, \n                            \tMGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9};\n\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  vhtRates2T, sizeof(vhtRates2T)/sizeof(u8));\n\t}\n\telse if ( RateSection == VHT_3SSMCS0_3SSMCS9 )\n\t{\n\t\tu1Byte\tvhtRates3T[] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4, \n                            \tMGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9};\n\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  vhtRates3T, sizeof(vhtRates3T)/sizeof(u1Byte));\n\t}\n\telse if ( RateSection == VHT_4SSMCS0_4SSMCS9 )\n\t{\n\t\tu1Byte\tvhtRates4T[] = {MGN_VHT4SS_MCS0, MGN_VHT4SS_MCS1, MGN_VHT4SS_MCS2, MGN_VHT4SS_MCS3, MGN_VHT4SS_MCS4, \n                            \tMGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9};\n\n\t\tPHY_SetTxPowerIndexByRateArray( pAdapter, RFPath, pHalData->CurrentChannelBW, Channel,\n\t\t\t\t\t\t\t\t  vhtRates4T, sizeof(vhtRates4T)/sizeof(u1Byte));\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"Invalid RateSection %d in %s\", RateSection, __FUNCTION__ );\n\t}\n}\n\nBOOLEAN \nphy_GetChnlIndex(\n\tIN\tu8 \tChannel,\n\tOUT u8*\tChannelIdx\n\t)\n{\n\tu8  i = 0;\n\tBOOLEAN bIn24G=_TRUE;\n\n\tif (Channel <= 14) {\n\t\tbIn24G = _TRUE;\n\t\t*ChannelIdx = Channel - 1;\n\t} else {\n\t\tbIn24G = _FALSE;\t\n\n\t\tfor (i = 0; i < CENTER_CH_5G_ALL_NUM; ++i) {\n\t\t\tif (center_ch_5g_all[i] == Channel) {\n\t\t\t\t*ChannelIdx = i;\n\t\t\t\treturn bIn24G;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bIn24G;\n}\n\nu8\nPHY_GetTxPowerIndexBase(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel,\n\tOUT PBOOLEAN\t\tbIn24G\n\t)\n{\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->odmpriv;\n\tu8\t\t\t\t\ti = 0;\t//default set to 1S\n\tu8\t\t\t\t\ttxPower = 0;\n\tu8\t\t\t\t\tchnlIdx = (Channel-1);\n\t\n\tif (HAL_IsLegalChannel(pAdapter, Channel) == _FALSE)\n\t{\n\t\tchnlIdx = 0;\n\t\tDBG_871X(\"Illegal channel!!\\n\");\n\t}\n\n\t*bIn24G = phy_GetChnlIndex(Channel, &chnlIdx);\n\n\t//DBG_871X(\"[%s] Channel Index: %d\\n\", (*bIn24G?\"2.4G\":\"5G\"), chnlIdx);\n\n\tif (*bIn24G) //3 ============================== 2.4 G ==============================\n\t{\n\t\tif ( IS_CCK_RATE(Rate) )\n\t\t{\n\t\t\ttxPower = pHalData->Index24G_CCK_Base[RFPath][chnlIdx];\t\n\t\t}\n\t\telse if ( MGN_6M <= Rate )\n\t\t{\t\t\t\t\n\t\t\ttxPower = pHalData->Index24G_BW40_Base[RFPath][chnlIdx];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"PHY_GetTxPowerIndexBase: INVALID Rate.\\n\");\n\t\t}\n\n\t\t//DBG_871X(\"Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\\n\", \n\t\t//\t\t((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower);\n\t\t\n\t\t// OFDM-1T\n\t\tif ( (MGN_6M <= Rate && Rate <= MGN_54M) && ! IS_CCK_RATE(Rate) )\n\t\t{\n\t\t\ttxPower += pHalData->OFDM_24G_Diff[RFPath][TX_1S];\n\t\t\t//DBG_871X(\"+PowerDiff 2.4G (RF-%c): (OFDM-1T) = (%d)\\n\", ((RFPath==0)?'A':'B'), pHalData->OFDM_24G_Diff[RFPath][TX_1S]);\n\t\t}\n\t\t// BW20-1S, BW20-2S\n\t\tif (BandWidth == CHANNEL_WIDTH_20)\n\t\t{\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_24G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_24G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_24G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_24G_Diff[RFPath][TX_4S];\n\n\t\t\t//DBG_871X(\"+PowerDiff 2.4G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW20_24G_Diff[RFPath][TX_1S], pHalData->BW20_24G_Diff[RFPath][TX_2S], \n\t\t\t//\tpHalData->BW20_24G_Diff[RFPath][TX_3S], pHalData->BW20_24G_Diff[RFPath][TX_4S]);\n\t\t}\n\t\t// BW40-1S, BW40-2S\n\t\telse if (BandWidth == CHANNEL_WIDTH_40)\n\t\t{\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];\t\t\t \n\n\t\t\t//DBG_871X(\"+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4S) = (%d, %d, %d, %d)\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S],\n\t\t\t//\tpHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]);\n\t\t}\n\t\t// Willis suggest adopt BW 40M power index while in BW 80 mode\n\t\telse if ( BandWidth == CHANNEL_WIDTH_80 )\n\t\t{\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];\n\n\t\t\t//DBG_871X(\"+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4T) = (%d, %d, %d, %d) P.S. Current is in BW 80MHz\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S],\n\t\t\t//\tpHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]);\n\t\t}\n\t}\n\telse //3 ============================== 5 G ==============================\n\t{\n\t\tif ( MGN_6M <= Rate )\n\t\t{\t\t\t\t\n\t\t\ttxPower = pHalData->Index5G_BW40_Base[RFPath][chnlIdx];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"===> mpt_ProQueryCalTxPower_Jaguar: INVALID Rate.\\n\");\n\t\t}\n\n\t\t//DBG_871X(\"Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\\n\", \n\t\t//\t((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower);\n\n\t\t// OFDM-1T\n\t\tif ( (MGN_6M <= Rate && Rate <= MGN_54M) && ! IS_CCK_RATE(Rate))\n\t\t{\n\t\t\ttxPower += pHalData->OFDM_5G_Diff[RFPath][TX_1S];\n\t\t\t//DBG_871X(\"+PowerDiff 5G (RF-%c): (OFDM-1T) = (%d)\\n\", ((RFPath==0)?'A':'B'), pHalData->OFDM_5G_Diff[RFPath][TX_1S]);\n\t\t}\n\t\t\n\t\t// BW20-1S, BW20-2S\n\t\tif (BandWidth == CHANNEL_WIDTH_20)\n\t\t{\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_5G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_5G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_5G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW20_5G_Diff[RFPath][TX_4S];\n\n\t\t\t//DBG_871X(\"+PowerDiff 5G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW20_5G_Diff[RFPath][TX_1S], pHalData->BW20_5G_Diff[RFPath][TX_2S],\n\t\t\t//\tpHalData->BW20_5G_Diff[RFPath][TX_3S], pHalData->BW20_5G_Diff[RFPath][TX_4S]);\n\t\t}\n\t\t// BW40-1S, BW40-2S\n\t\telse if (BandWidth == CHANNEL_WIDTH_40)\n\t\t{\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_5G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_5G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_5G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW40_5G_Diff[RFPath][TX_4S];\n\n\t\t\t//DBG_871X(\"+PowerDiff 5G(RF-%c): (BW40-1S, BW40-2S) = (%d, %d, %d, %d)\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW40_5G_Diff[RFPath][TX_1S], pHalData->BW40_5G_Diff[RFPath][TX_2S],\n\t\t\t//\tpHalData->BW40_5G_Diff[RFPath][TX_3S], pHalData->BW40_5G_Diff[RFPath][TX_4S]);\n\t\t}\n\t\t// BW80-1S, BW80-2S\n\t\telse if (BandWidth== CHANNEL_WIDTH_80)\n\t\t{\n\t\t\t// <20121220, Kordan> Get the index of array \"Index5G_BW80_Base\".\n\t\t\tfor (i = 0; i < CENTER_CH_5G_80M_NUM; ++i)\n\t\t\t\tif (center_ch_5g_80m[i] == Channel)\n\t\t\t\t\tchnlIdx = i;\n\n\t\t\ttxPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx];\n\n\t\t\tif ( (MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += + pHalData->BW80_5G_Diff[RFPath][TX_1S];\n\t\t\tif ( (MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW80_5G_Diff[RFPath][TX_2S];\n\t\t\tif ( (MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW80_5G_Diff[RFPath][TX_3S];\n\t\t\tif ( (MGN_MCS23 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))\n\t\t\t\ttxPower += pHalData->BW80_5G_Diff[RFPath][TX_4S];\n\n\t\t\t//DBG_871X(\"+PowerDiff 5G(RF-%c): (BW80-1S, BW80-2S, BW80-3S, BW80-4S) = (%d, %d, %d, %d)\\n\",((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), \n\t\t\t//\tpHalData->BW80_5G_Diff[RFPath][TX_1S], pHalData->BW80_5G_Diff[RFPath][TX_2S],\n\t\t\t//\tpHalData->BW80_5G_Diff[RFPath][TX_3S], pHalData->BW80_5G_Diff[RFPath][TX_4S]);\n\t\t}\n\t}\n\n\treturn txPower;\t\n}\n\ns8\nPHY_GetTxPowerTrackingOffset( \n\tPADAPTER\tpAdapter,\n\tu8\t\t\tRFPath,\n\tu8\t\t\tRate\n\t)\n{\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->odmpriv;\t\n\ts8\toffset = 0;\n\t\n\tif( pDM_Odm->RFCalibrateInfo.TxPowerTrackControl  == _FALSE)\n\t\treturn offset;\n\t\n\tif ((Rate == MGN_1M) ||(Rate == MGN_2M)||(Rate == MGN_5_5M)||(Rate == MGN_11M))\n\t{ \n\t\toffset = pDM_Odm->RFCalibrateInfo.Remnant_CCKSwingIdx;\n\t\t/*DBG_871X(\"+Remnant_CCKSwingIdx = 0x%x\\n\", RFPath, Rate, pRFCalibrateInfo->Remnant_CCKSwingIdx);*/\n\t}\n\telse\n\t{\n\t\toffset = pDM_Odm->RFCalibrateInfo.Remnant_OFDMSwingIdx[RFPath]; \n\t\t/*DBG_871X(\"+Remanant_OFDMSwingIdx[RFPath %u][Rate 0x%x] = 0x%x\\n\", RFPath, Rate, pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath]);\t*/\t\n\t\t\n\t}\n\n\treturn offset;\n}\n\nu8\nPHY_GetRateIndexOfTxPowerByRate(\n\tIN\tu8\t\tRate\n\t)\n{\n\tu8\tindex = 0;\n\tswitch ( Rate )\n\t{\n\t\tcase MGN_1M: index = 0; break;\n\t\tcase MGN_2M: index = 1; break;\n\t\tcase MGN_5_5M: index = 2; break;\n\t\tcase MGN_11M: index = 3; break;\n\t\tcase MGN_6M: index = 4; break;\n\t\tcase MGN_9M: index = 5; break;\n\t\tcase MGN_12M: index = 6; break;\n\t\tcase MGN_18M: index = 7; break;\n\t\tcase MGN_24M: index = 8; break;\n\t\tcase MGN_36M: index = 9; break;\n\t\tcase MGN_48M: index = 10; break;\n\t\tcase MGN_54M: index = 11; break;\n\t\tcase MGN_MCS0: index = 12; break;\n\t\tcase MGN_MCS1: index = 13; break;\n\t\tcase MGN_MCS2: index = 14; break;\n\t\tcase MGN_MCS3: index = 15; break;\n\t\tcase MGN_MCS4: index = 16; break;\n\t\tcase MGN_MCS5: index = 17; break;\n\t\tcase MGN_MCS6: index = 18; break;\n\t\tcase MGN_MCS7: index = 19; break;\n\t\tcase MGN_MCS8: index = 20; break;\n\t\tcase MGN_MCS9: index = 21; break;\n\t\tcase MGN_MCS10: index = 22; break;\n\t\tcase MGN_MCS11: index = 23; break;\n\t\tcase MGN_MCS12: index = 24; break;\n\t\tcase MGN_MCS13: index = 25; break;\n\t\tcase MGN_MCS14: index = 26; break;\n\t\tcase MGN_MCS15: index = 27; break;\n\t\tcase MGN_MCS16: index = 28; break;\n\t\tcase MGN_MCS17: index = 29; break;\n\t\tcase MGN_MCS18: index = 30; break;\n\t\tcase MGN_MCS19: index = 31; break;\n\t\tcase MGN_MCS20: index = 32; break;\n\t\tcase MGN_MCS21: index = 33; break;\n\t\tcase MGN_MCS22: index = 34; break;\n\t\tcase MGN_MCS23: index = 35; break;\n\t\tcase MGN_MCS24: index = 36; break;\n\t\tcase MGN_MCS25: index = 37; break;\n\t\tcase MGN_MCS26: index = 38; break;\n\t\tcase MGN_MCS27: index = 39; break;\n\t\tcase MGN_MCS28: index = 40; break;\n\t\tcase MGN_MCS29: index = 41; break;\n\t\tcase MGN_MCS30: index = 42; break;\n\t\tcase MGN_MCS31: index = 43; break;\n\t\tcase MGN_VHT1SS_MCS0: index = 44; break;\n\t\tcase MGN_VHT1SS_MCS1: index = 45; break;\n\t\tcase MGN_VHT1SS_MCS2: index = 46; break;\n\t\tcase MGN_VHT1SS_MCS3: index = 47; break;\n\t\tcase MGN_VHT1SS_MCS4: index = 48; break;\n\t\tcase MGN_VHT1SS_MCS5: index = 49; break;\n\t\tcase MGN_VHT1SS_MCS6: index = 50; break;\n\t\tcase MGN_VHT1SS_MCS7: index = 51; break;\n\t\tcase MGN_VHT1SS_MCS8: index = 52; break;\n\t\tcase MGN_VHT1SS_MCS9: index = 53; break;\n\t\tcase MGN_VHT2SS_MCS0: index = 54; break;\n\t\tcase MGN_VHT2SS_MCS1: index = 55; break;\n\t\tcase MGN_VHT2SS_MCS2: index = 56; break;\n\t\tcase MGN_VHT2SS_MCS3: index = 57; break;\n\t\tcase MGN_VHT2SS_MCS4: index = 58; break;\n\t\tcase MGN_VHT2SS_MCS5: index = 59; break;\n\t\tcase MGN_VHT2SS_MCS6: index = 60; break;\n\t\tcase MGN_VHT2SS_MCS7: index = 61; break;\n\t\tcase MGN_VHT2SS_MCS8: index = 62; break;\n\t\tcase MGN_VHT2SS_MCS9: index = 63; break;\n\t\tcase MGN_VHT3SS_MCS0: index = 64; break;\n\t\tcase MGN_VHT3SS_MCS1: index = 65; break;\n\t\tcase MGN_VHT3SS_MCS2: index = 66; break;\n\t\tcase MGN_VHT3SS_MCS3: index = 67; break;\n\t\tcase MGN_VHT3SS_MCS4: index = 68; break;\n\t\tcase MGN_VHT3SS_MCS5: index = 69; break;\n\t\tcase MGN_VHT3SS_MCS6: index = 70; break;\n\t\tcase MGN_VHT3SS_MCS7: index = 71; break;\n\t\tcase MGN_VHT3SS_MCS8: index = 72; break;\n\t\tcase MGN_VHT3SS_MCS9: index = 73; break;\n\t\tcase MGN_VHT4SS_MCS0: index = 74; break;\n\t\tcase MGN_VHT4SS_MCS1: index = 75; break;\n\t\tcase MGN_VHT4SS_MCS2: index = 76; break;\n\t\tcase MGN_VHT4SS_MCS3: index = 77; break;\n\t\tcase MGN_VHT4SS_MCS4: index = 78; break;\n\t\tcase MGN_VHT4SS_MCS5: index = 79; break;\n\t\tcase MGN_VHT4SS_MCS6: index = 80; break;\n\t\tcase MGN_VHT4SS_MCS7: index = 81; break;\n\t\tcase MGN_VHT4SS_MCS8: index = 82; break;\n\t\tcase MGN_VHT4SS_MCS9: index = 83; break;\n\t\tdefault:\n\t\t\tDBG_871X(\"Invalid rate 0x%x in %s\\n\", Rate, __FUNCTION__ );\n\t\t\tbreak;\n\t};\n\n\treturn index;\n}\n\ns8\nPHY_GetTxPowerByRate( \n\tIN\tPADAPTER\tpAdapter, \n\tIN\tu8\t\t\tBand, \n\tIN\tu8\t\t\tRFPath, \n\tIN\tu8\t\t\tTxNum, \n\tIN\tu8\t\t\tRate\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\ts8 \t\t\tvalue = 0, limit = 0;\n\tu8\t\t\trateIndex = PHY_GetRateIndexOfTxPowerByRate( Rate );\n\n\tif ( ( pAdapter->registrypriv.RegEnableTxPowerByRate == 2 && pHalData->EEPROMRegulatory == 2 ) || \n\t\t   pAdapter->registrypriv.RegEnableTxPowerByRate == 0 )\n\t\treturn 0;\n\t\n\tif ( Band != BAND_ON_2_4G && Band != BAND_ON_5G )\n\t{\n\t\tDBG_871X(\"Invalid band %d in %s\\n\", Band, __FUNCTION__ );\n\t\treturn value;\n\t}\n\tif ( RFPath > ODM_RF_PATH_D )\n\t{\n\t\tDBG_871X(\"Invalid RfPath %d in %s\\n\", RFPath, __FUNCTION__ );\n\t\treturn value;\n\t}\n\tif ( TxNum >= RF_MAX_TX_NUM )\n\t{\n\t\tDBG_871X(\"Invalid TxNum %d in %s\\n\", TxNum, __FUNCTION__ );\n\t\treturn value;\n\t}\n\tif ( rateIndex >= TX_PWR_BY_RATE_NUM_RATE )\n\t{\n\t\tDBG_871X(\"Invalid RateIndex %d in %s\\n\", rateIndex, __FUNCTION__ );\n\t\treturn value;\n\t}\n\n\tvalue = pHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex];\n\n\treturn value;\n\n}\n\nVOID\nPHY_SetTxPowerByRate( \n\tIN\tPADAPTER\tpAdapter, \n\tIN\tu8\t\t\tBand, \n\tIN\tu8\t\t\tRFPath, \n\tIN\tu8\t\t\tTxNum, \n\tIN\tu8\t\t\tRate,\n\tIN\ts8\t\t\tValue\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA( pAdapter );\n\tu8\trateIndex = PHY_GetRateIndexOfTxPowerByRate( Rate );\n\t\n\tif ( Band != BAND_ON_2_4G && Band != BAND_ON_5G )\n\t{\n\t\tDBG_871X(\"Invalid band %d in %s\\n\", Band, __FUNCTION__ );\n\t\treturn;\n\t}\n\tif ( RFPath > ODM_RF_PATH_D )\n\t{\n\t\tDBG_871X(\"Invalid RfPath %d in %s\\n\", RFPath, __FUNCTION__ );\n\t\treturn;\n\t}\n\tif ( TxNum >= RF_MAX_TX_NUM )\n\t{\n\t\tDBG_871X( \"Invalid TxNum %d in %s\\n\", TxNum, __FUNCTION__ );\n\t\treturn;\n\t}\n\tif ( rateIndex >= TX_PWR_BY_RATE_NUM_RATE )\n\t{\n\t\tDBG_871X(\"Invalid RateIndex %d in %s\\n\", rateIndex, __FUNCTION__ );\n\t\treturn;\n\t}\n\n\tpHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex] = Value;\n}\n\nVOID\nPHY_SetTxPowerLevelByPath(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel,\n\tIN\tu8\t\t\tpath\n\t)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tBOOLEAN bIsIn24G = (pHalData->CurrentBandType == BAND_ON_2_4G );\n\n\t//if ( pMgntInfo->RegNByteAccess == 0 )\n\t{\n\t\tif ( bIsIn24G )\n\t\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, CCK );\n\t\t\n\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, OFDM );\n\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS0_MCS7 );\n\n\t\tif (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter))\n\t\t\tPHY_SetTxPowerIndexByRateSection(Adapter, path, channel, VHT_1SSMCS0_1SSMCS9);\n\n\t\tif (pHalData->NumTotalRFPath >= 2)\n\t\t{\n\t\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS8_MCS15 );\n\n\t\t\tif (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter))\n\t\t\t\tPHY_SetTxPowerIndexByRateSection(Adapter, path, channel, VHT_2SSMCS0_2SSMCS9);\n\n\t\t\tif (IS_HARDWARE_TYPE_8814A(Adapter))\n\t\t\t{\n\t\t\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, HT_MCS16_MCS23 );\n\t\t\t\tPHY_SetTxPowerIndexByRateSection( Adapter, path, channel, VHT_3SSMCS0_3SSMCS9 );\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nPHY_SetTxPowerIndexByRateArray(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN \tu8\t\t\t\t\tRFPath,\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel,\n\tIN\tu8*\t\t\t\t\tRates,\n\tIN\tu8\t\t\t\t\tRateArraySize\n\t)\n{\n\tu32\tpowerIndex = 0;\n\tint\ti = 0;\n\n\tfor (i = 0; i < RateArraySize; ++i) \n\t{\n\t\tpowerIndex = PHY_GetTxPowerIndex(pAdapter, RFPath, Rates[i], BandWidth, Channel);\n\t\tPHY_SetTxPowerIndex(pAdapter, powerIndex, RFPath, Rates[i]);\n\t}\n}\n\ns8\nphy_GetWorldWideLimit(\n\ts8* LimitTable\n)\n{\n\ts8\tmin = LimitTable[0];\n\tu8\ti = 0;\n\t\n\tfor (i = 0; i < MAX_REGULATION_NUM; ++i) {\n\t\tif (LimitTable[i] < min)\n\t\t\tmin = LimitTable[i];\n\t}\n\n\treturn min;\n}\n\ns8\nphy_GetChannelIndexOfTxPowerLimit(\n\tIN\tu8\t\t\tBand,\n\tIN\tu8\t\t\tChannel\n\t)\n{\n\ts8\tchannelIndex = -1;\n\tu8\ti = 0;\n\n\tif (Band == BAND_ON_2_4G) {\n\t\tchannelIndex = Channel - 1;\n\t} else if (Band == BAND_ON_5G) {\n\t\tfor (i = 0; i < CENTER_CH_5G_ALL_NUM; ++i) {\n\t\t\tif (center_ch_5g_all[i] == Channel)\n\t\t\t\tchannelIndex = i;\n\t\t}\n\t} else {\n\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid Band %d in %s\\n\", Band, __func__);\n\t}\n\n\tif (channelIndex == -1)\n\t\tDBG_871X_LEVEL(_drv_always_, \"Invalid Channel %d of Band %d in %s\\n\", Channel, Band, __func__);\n\n\treturn channelIndex;\n}\n\ns8\nPHY_GetTxPowerLimit(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tRegPwrTblSel,\n\tIN\tBAND_TYPE\t\t\tBand,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tRfPath,\n\tIN\tu8\t\t\t\t\tDataRate,\n\tIN\tu8\t\t\t\t\tChannel\n\t)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\ts16\t\t\t\tband = -1, regulation = -1, bandwidth = -1,\n\t\t\t\t\trateSection = -1, channel = -1;\n\ts8\t\t\t\tpowerLimit = MAX_POWER_INDEX;\n\n\tif ( ( Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory != 1 ) || \n\t\t   Adapter->registrypriv.RegEnableTxPowerLimit == 0 )\n\t\treturn MAX_POWER_INDEX;\n\n\tswitch (RegPwrTblSel) {\n\tcase 1:\n\t\tregulation = TXPWR_LMT_ETSI;\n\t\tbreak;\n\tcase 2:\n\t\tregulation = TXPWR_LMT_MKK;\n\t\tbreak;\n\tcase 3:\n\t\tregulation = TXPWR_LMT_FCC;\n\t\tbreak;\n\tcase 4:\n\t\tregulation = TXPWR_LMT_WW;\n\t\tbreak;\n\tdefault:\n\t\tregulation = (Band == BAND_ON_2_4G) ? pHalData->Regulation2_4G : pHalData->Regulation5G;\n\t\tbreak;\n\t}\n\n\t//DBG_871X(\"pMgntInfo->RegPwrTblSel %d, final regulation %d\\n\", Adapter->registrypriv.RegPwrTblSel, regulation );\n\n\t\n\tif ( Band == BAND_ON_2_4G ) band = 0; \n\telse if ( Band == BAND_ON_5G ) band = 1; \n\n\tif ( Bandwidth == CHANNEL_WIDTH_20 ) bandwidth = 0;\n\telse if ( Bandwidth == CHANNEL_WIDTH_40 ) bandwidth = 1;\n\telse if ( Bandwidth == CHANNEL_WIDTH_80 ) bandwidth = 2;\n\telse if ( Bandwidth == CHANNEL_WIDTH_160 ) bandwidth = 3;\n\n\tswitch ( DataRate )\n\t{\n\t\tcase MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M:\n\t\t\trateSection = 0;\n\t\t\tbreak;\n\n\t\tcase MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M:\n\t\tcase MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M:\n\t\t\trateSection = 1;\n\t\t\tbreak;\n\n\t\tcase MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3: \n\t\tcase MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7:\n\t\t\trateSection = 2;\n\t\t\tbreak;\n\t\t\t\n\t\tcase MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11: \n\t\tcase MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15:\n\t\t\trateSection = 3;\n\t\t\tbreak;\n\n\t\tcase MGN_MCS16: case MGN_MCS17: case MGN_MCS18: case MGN_MCS19: \n\t\tcase MGN_MCS20: case MGN_MCS21: case MGN_MCS22: case MGN_MCS23:\n\t\t\trateSection = 4;\n\t\t\tbreak;\n\n\t\tcase MGN_MCS24: case MGN_MCS25: case MGN_MCS26: case MGN_MCS27: \n\t\tcase MGN_MCS28: case MGN_MCS29: case MGN_MCS30: case MGN_MCS31:\n\t\t\trateSection = 5;\n\t\t\tbreak;\n\n\t\tcase MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2:\n\t\tcase MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5:\n\t\tcase MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8:\n\t\tcase MGN_VHT1SS_MCS9:\n\t\t\trateSection = 6;\n\t\t\tbreak;\n\t\t\t\n\t\tcase MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2:\n\t\tcase MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5:\n\t\tcase MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8:\n\t\tcase MGN_VHT2SS_MCS9:\n\t\t\trateSection = 7;\n\t\t\tbreak;\n\n\t\tcase MGN_VHT3SS_MCS0: case MGN_VHT3SS_MCS1: case MGN_VHT3SS_MCS2:\n\t\tcase MGN_VHT3SS_MCS3: case MGN_VHT3SS_MCS4: case MGN_VHT3SS_MCS5:\n\t\tcase MGN_VHT3SS_MCS6: case MGN_VHT3SS_MCS7: case MGN_VHT3SS_MCS8:\n\t\tcase MGN_VHT3SS_MCS9:\n\t\t\trateSection = 8;\n\t\t\tbreak;\n\n\t\tcase MGN_VHT4SS_MCS0: case MGN_VHT4SS_MCS1: case MGN_VHT4SS_MCS2:\n\t\tcase MGN_VHT4SS_MCS3: case MGN_VHT4SS_MCS4: case MGN_VHT4SS_MCS5:\n\t\tcase MGN_VHT4SS_MCS6: case MGN_VHT4SS_MCS7: case MGN_VHT4SS_MCS8:\n\t\tcase MGN_VHT4SS_MCS9:\n\t\t\trateSection = 9;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBG_871X(\"Wrong rate 0x%x\\n\", DataRate );\n\t\t\tbreak;\n\t}\n\n\tif ( Band == BAND_ON_5G  && rateSection == 0 )\n\t\t\tDBG_871X(\"Wrong rate 0x%x: No CCK in 5G Band\\n\", DataRate );\n\n\t// workaround for wrong index combination to obtain tx power limit, \n\t// OFDM only exists in BW 20M\n\tif ( rateSection == 1 )\n\t\tbandwidth = 0;\n\n\t// workaround for wrong index combination to obtain tx power limit, \n\t// CCK table will only be given in BW 20M\n\tif ( rateSection == 0 )\n\t\tbandwidth = 0;\n\n\t// workaround for wrong indxe combination to obtain tx power limit, \n\t// HT on 80M will reference to HT on 40M\n\tif ( ( rateSection == 2 || rateSection == 3 ) && Band == BAND_ON_5G && bandwidth == 2 ) {\n\t\tbandwidth = 1;\n\t}\n\t\n\tif ( Band == BAND_ON_2_4G )\n\t\tchannel = phy_GetChannelIndexOfTxPowerLimit( BAND_ON_2_4G, Channel );\n\telse if ( Band == BAND_ON_5G )\n\t\tchannel = phy_GetChannelIndexOfTxPowerLimit( BAND_ON_5G, Channel );\n\telse if ( Band == BAND_ON_BOTH )\n\t{\n\t\t// BAND_ON_BOTH don't care temporarily \n\t}\n\t\n\tif ( band == -1 || regulation == -1 || bandwidth == -1 || \n\t     rateSection == -1 || channel == -1 )\n\t{\n\t\t//DBG_871X(\"Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnlGroup %d]\\n\",\n\t\t//\t  band, regulation, bandwidth, RfPath, rateSection, channelGroup );\n\n\t\treturn MAX_POWER_INDEX;\n\t}\n\n\tif ( Band == BAND_ON_2_4G ) {\n\t\ts8 limits[10] = {0}; u8 i = 0;\n\t\tif (bandwidth >= MAX_2_4G_BANDWIDTH_NUM)\n\t\t\tbandwidth = MAX_2_4G_BANDWIDTH_NUM - 1;\n\t\tfor (i = 0; i < MAX_REGULATION_NUM; ++i)\n\t\t\tlimits[i] = pHalData->TxPwrLimit_2_4G[i][bandwidth][rateSection][channel][RfPath]; \n\n\t\tpowerLimit = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) :\n\t\t\t          pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channel][RfPath];\n\n\t} else if ( Band == BAND_ON_5G ) {\n\t\ts8 limits[10] = {0}; u8 i = 0;\n\t\tfor (i = 0; i < MAX_REGULATION_NUM; ++i)\n\t\t\tlimits[i] = pHalData->TxPwrLimit_5G[i][bandwidth][rateSection][channel][RfPath];\n\t\t\n\t\tpowerLimit = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) : \n\t\t\t\t\t  pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channel][RfPath];\n\t} else \n\t\tDBG_871X(\"No power limit table of the specified band\\n\" );\n\n\t// combine 5G VHT & HT rate\n\t// 5G 20M and 40M HT and VHT can cross reference\n\t/*\n\tif ( Band == BAND_ON_5G && powerLimit == MAX_POWER_INDEX ) {\n\t\tif ( bandwidth == 0 || bandwidth == 1 ) { \n\t\t\tRT_TRACE( COMP_INIT, DBG_LOUD, ( \"No power limit table of the specified band %d, bandwidth %d, ratesection %d, rf path %d\\n\", \n\t\t\t\t\t  band, bandwidth, rateSection, RfPath ) );\n\t\t\tif ( rateSection == 2 )\n\t\t\t\tpowerLimit = pHalData->TxPwrLimit_5G[regulation]\n\t\t\t\t\t\t\t\t\t\t[bandwidth][4][channelGroup][RfPath];\n\t\t\telse if ( rateSection == 4 )\n\t\t\t\tpowerLimit = pHalData->TxPwrLimit_5G[regulation]\n\t\t\t\t\t\t\t\t\t\t[bandwidth][2][channelGroup][RfPath];\n\t\t\telse if ( rateSection == 3 )\n\t\t\t\tpowerLimit = pHalData->TxPwrLimit_5G[regulation]\n\t\t\t\t\t\t\t\t\t\t[bandwidth][5][channelGroup][RfPath];\n\t\t\telse if ( rateSection == 5 )\n\t\t\t\tpowerLimit = pHalData->TxPwrLimit_5G[regulation]\n\t\t\t\t\t\t\t\t\t\t[bandwidth][3][channelGroup][RfPath];\n\t\t}\n\t}\n\t*/\n\t//DBG_871X(\"TxPwrLmt[Regulation %d][Band %d][BW %d][RFPath %d][Rate 0x%x][Chnl %d] = %d\\n\", \n\t//\t\tregulation, pHalData->CurrentBandType, Bandwidth, RfPath, DataRate, Channel, powerLimit);\n\treturn powerLimit;\n}\n\nVOID\nphy_CrossReferenceHTAndVHTTxPowerLimit(\n\tIN\tPADAPTER\t\t\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\tu8 regulation, bw, channel, rs, ref_rs;\n\tint ht_ref_vht_5g_20_40 = 0;\n\tint vht_ref_ht_5g_20_40 = 0;\n\tint ht_has_ref_5g_20_40 = 0;\n\tint vht_has_ref_5g_20_40 = 0;\n\n\tpHalData->tx_pwr_lmt_5g_20_40_ref = 0;\n\n\tfor (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {\n\n\t\tfor (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {\n\n\t\t\tfor (channel = 0; channel < CENTER_CH_5G_ALL_NUM; ++channel) {\n\n\t\t\t\tfor (rs = 0; rs < MAX_RATE_SECTION_NUM; ++rs) {\n\n\t\t\t\t\t/* 5G 20M 40M VHT and HT can cross reference */\n\t\t\t\t\tif (bw == CHANNEL_WIDTH_20 || bw == CHANNEL_WIDTH_40) {\n\t\t\t\t\t\tif (rs == HT_1SS)\n\t\t\t\t\t\t\tref_rs = VHT_1SS;\n\t\t\t\t\t\telse if (rs == HT_2SS)\n\t\t\t\t\t\t\tref_rs = VHT_2SS;\n\t\t\t\t\t\telse if (rs == HT_3SS)\n\t\t\t\t\t\t\tref_rs = VHT_3SS;\n\t\t\t\t\t\telse if (rs == HT_4SS)\n\t\t\t\t\t\t\tref_rs = VHT_4SS;\n\t\t\t\t\t\telse if (rs == VHT_1SS)\n\t\t\t\t\t\t\tref_rs = HT_1SS;\n\t\t\t\t\t\telse if (rs == VHT_2SS)\n\t\t\t\t\t\t\tref_rs = HT_2SS;\n\t\t\t\t\t\telse if (rs == VHT_3SS)\n\t\t\t\t\t\t\tref_rs = HT_3SS;\n\t\t\t\t\t\telse if (rs == VHT_4SS)\n\t\t\t\t\t\t\tref_rs = HT_4SS;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif (pHalData->TxPwrLimit_5G[regulation][bw][ref_rs][channel][RF_PATH_A] == MAX_POWER_INDEX)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif (IS_HT_RATE_SECTION(rs))\n\t\t\t\t\t\t\tht_has_ref_5g_20_40++;\n\t\t\t\t\t\telse if (IS_VHT_RATE_SECTION(rs))\n\t\t\t\t\t\t\tvht_has_ref_5g_20_40++;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif (pHalData->TxPwrLimit_5G[regulation][bw][rs][channel][RF_PATH_A] != MAX_POWER_INDEX)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif (IS_HT_RATE_SECTION(rs) && IS_VHT_RATE_SECTION(ref_rs))\n\t\t\t\t\t\t\tht_ref_vht_5g_20_40++;\n\t\t\t\t\t\telse if (IS_VHT_RATE_SECTION(rs) && IS_HT_RATE_SECTION(ref_rs))\n\t\t\t\t\t\t\tvht_ref_ht_5g_20_40++;\n\n\t\t\t\t\t\tif (0)\n\t\t\t\t\t\t\tDBG_871X(\"reg:%u, bw:%u, ch:%u, %s ref %s\\n\"\n\t\t\t\t\t\t\t\t, regulation, bw, channel\n\t\t\t\t\t\t\t\t, rate_section_str(rs), rate_section_str(ref_rs));\n\n\t\t\t\t\t\tpHalData->TxPwrLimit_5G[regulation][bw][rs][channel][RF_PATH_A] =\n\t\t\t\t\t\t\tpHalData->TxPwrLimit_5G[regulation][bw][ref_rs][channel][RF_PATH_A];\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (0) {\n\t\tDBG_871X(\"ht_ref_vht_5g_20_40:%d, ht_has_ref_5g_20_40:%d\\n\", ht_ref_vht_5g_20_40, ht_has_ref_5g_20_40);\n\t\tDBG_871X(\"vht_ref_hht_5g_20_40:%d, vht_has_ref_5g_20_40:%d\\n\", vht_ref_ht_5g_20_40, vht_has_ref_5g_20_40);\n\t}\n\n\t/* 5G 20M&40M HT all come from VHT*/\n\tif (ht_ref_vht_5g_20_40 && ht_has_ref_5g_20_40 == ht_ref_vht_5g_20_40)\n\t\tpHalData->tx_pwr_lmt_5g_20_40_ref |= TX_PWR_LMT_REF_HT_FROM_VHT;\n\n\t/* 5G 20M&40M VHT all come from HT*/\n\tif (vht_ref_ht_5g_20_40 && vht_has_ref_5g_20_40 == vht_ref_ht_5g_20_40)\n\t\tpHalData->tx_pwr_lmt_5g_20_40_ref |= TX_PWR_LMT_REF_VHT_FROM_HT;\n}\n\nVOID \nPHY_ConvertTxPowerLimitToPowerIndex(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tu8 base;\n\tu8 regulation, bw, channel, rateSection;\n\ts8 tempValue = 0, tempPwrLmt = 0;\n\tu8 rfPath = 0;\n\tu8 tx_num;\n\n\tif (pHalData->odmpriv.PhyRegPgValueType != PHY_REG_PG_EXACT_VALUE) {\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tphy_CrossReferenceHTAndVHTTxPowerLimit(Adapter);\n\n\tfor (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {\n\n\t\tfor (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {\n\n\t\t\tfor (channel = 0; channel < CENTER_CH_2G_NUM; ++channel) {\n\n\t\t\t\tfor (rateSection = CCK; rateSection <= HT_4SS; ++rateSection) {\n\t\t\t\t\ttx_num = rate_section_to_tx_num(rateSection);\n\t\t\t\t\ttempPwrLmt = pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][RF_PATH_A];\n\n\t\t\t\t\tif (tempPwrLmt != MAX_POWER_INDEX) {\n\n\t\t\t\t\t\tfor (rfPath = RF_PATH_A; rfPath < MAX_RF_PATH; ++rfPath) {\n\n\t\t\t\t\t\t\tif (rtw_regsty_tx_power_by_rate_base_valid(Adapter) == _TRUE)\n\t\t\t\t\t\t\t\tbase = rtw_regsty_get_tx_power_by_rate_base(Adapter, BAND_ON_2_4G, rfPath, tx_num, rateSection);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tbase = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, tx_num, rateSection);\n\n\t\t\t\t\t\t\ttempValue = tempPwrLmt - base;\n\t\t\t\t\t\t\tpHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][rfPath] = tempValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {\n\n\t\tfor (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {\n\n\t\t\tfor (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {\n\n\t\t\t\tfor (channel = 0; channel < CENTER_CH_5G_ALL_NUM; ++channel) {\n\n\t\t\t\t\tfor (rateSection = OFDM; rateSection <= VHT_4SS; ++rateSection) {\n\t\t\t\t\t\ttx_num = rate_section_to_tx_num(rateSection);\n\t\t\t\t\t\ttempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][channel][RF_PATH_A];\n\n\t\t\t\t\t\tif (tempPwrLmt != MAX_POWER_INDEX) {\n\n\t\t\t\t\t\t\tfor (rfPath = RF_PATH_A; rfPath < MAX_RF_PATH; ++rfPath) {\n\n\t\t\t\t\t\t\t\tif (rtw_regsty_tx_power_by_rate_base_valid(Adapter) == _TRUE)\n\t\t\t\t\t\t\t\t\tbase = rtw_regsty_get_tx_power_by_rate_base(Adapter, BAND_ON_5G, rfPath, tx_num, rateSection);\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tbase = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_5G, rfPath, tx_num, rateSection);\n\n\t\t\t\t\t\t\t\ttempValue = tempPwrLmt - base;\n\t\t\t\t\t\t\t\tpHalData->TxPwrLimit_5G[regulation][bw][rateSection][channel][rfPath] = tempValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n* PHY_InitTxPowerLimit - Set all hal_data.TxPwrLimit_2_4G, TxPwrLimit_5G array to MAX_POWER_INDEX\n*/\nVOID\nPHY_InitTxPowerLimit(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tu8 i, j, k, l, m;\n\n\tfor (i = 0; i < MAX_REGULATION_NUM; ++i)\n\t\tfor (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)\n\t\t\tfor (k = 0; k < MAX_RATE_SECTION_NUM; ++k)\n\t\t\t\tfor (m = 0; m < CENTER_CH_2G_NUM; ++m)\n\t\t\t\t\tfor (l = 0; l < MAX_RF_PATH; ++l)\n\t\t\t\t\t\tpHalData->TxPwrLimit_2_4G[i][j][k][m][l] = MAX_POWER_INDEX;\n\n\tfor (i = 0; i < MAX_REGULATION_NUM; ++i)\n\t\tfor (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)\n\t\t\tfor (k = 0; k < MAX_RATE_SECTION_NUM; ++k)\n\t\t\t\tfor (m = 0; m < CENTER_CH_5G_ALL_NUM; ++m)\n\t\t\t\t\tfor (l = 0; l < MAX_RF_PATH; ++l)\n\t\t\t\t\t\tpHalData->TxPwrLimit_5G[i][j][k][m][l] = MAX_POWER_INDEX;\n}\n\nVOID\nPHY_SetTxPowerLimit(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu8\t\t\t\t*Regulation,\n\tIN\tu8\t\t\t\t*Band,\n\tIN\tu8\t\t\t\t*Bandwidth,\n\tIN\tu8\t\t\t\t*RateSection,\n\tIN\tu8\t\t\t\t*RfPath,\n\tIN\tu8\t\t\t\t*Channel,\n\tIN\tu8\t\t\t\t*PowerLimit\n\t)\n{\n\tPADAPTER\t\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA( Adapter );\n\tu8\t\t\t\tregulation=0, bandwidth=0, rateSection=0, \n\t\t\t\t\tchannel;\n\ts8 \t\t\t\tpowerLimit = 0, prevPowerLimit, channelIndex;\n\n\t//DBG_871X( \"Index of power limit table [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s][val %s]\\n\", \n\t//\t  Band, Regulation, Bandwidth, RateSection, RfPath, Channel, PowerLimit );\n\n\tif ( !GetU1ByteIntegerFromStringInDecimal( (s8 *)Channel, &channel ) ||\n\t\t !GetU1ByteIntegerFromStringInDecimal( (s8 *)PowerLimit, &powerLimit ) )\n\t{\n\t\tDBG_871X(\"Illegal index of power limit table [chnl %s][val %s]\\n\", Channel, PowerLimit );\n\t}\n\n\tpowerLimit = powerLimit > MAX_POWER_INDEX ? MAX_POWER_INDEX : powerLimit;\n\n\tif ( eqNByte( Regulation, (u8 *)(\"FCC\"), 3 ) ) regulation = 0;\n\telse if ( eqNByte( Regulation, (u8 *)(\"MKK\"), 3 ) ) regulation = 1;\n\telse if ( eqNByte( Regulation, (u8 *)(\"ETSI\"), 4 ) ) regulation = 2;\n\telse if ( eqNByte( Regulation, (u8 *)(\"WW13\"), 4 ) ) regulation = 3;\n\n\tif ( eqNByte( RateSection, (u8 *)(\"CCK\"), 3 ) && eqNByte( RfPath, (u8 *)(\"1T\"), 2 ) )\n\t\trateSection = 0;\n\telse if ( eqNByte( RateSection, (u8 *)(\"OFDM\"), 4 ) && eqNByte( RfPath, (u8 *)(\"1T\"), 2 ) )\n\t\trateSection = 1;\n\telse if ( eqNByte( RateSection, (u8 *)(\"HT\"), 2 ) && eqNByte( RfPath, (u8 *)(\"1T\"), 2 ) )\n\t\trateSection = 2;\n\telse if ( eqNByte( RateSection, (u8 *)(\"HT\"), 2 ) && eqNByte( RfPath, (u8 *)(\"2T\"), 2 ) )\n\t\trateSection = 3;\n\telse if ( eqNByte( RateSection, (u8 *)(\"HT\"), 2 ) && eqNByte( RfPath, (u8 *)(\"3T\"), 2 ) )\n\t\trateSection = 4;\n\telse if ( eqNByte( RateSection, (u8 *)(\"HT\"), 2 ) && eqNByte( RfPath, (u8 *)(\"4T\"), 2 ) )\n\t\trateSection = 5;\n\telse if ( eqNByte( RateSection, (u8 *)(\"VHT\"), 3 ) && eqNByte( RfPath, (u8 *)(\"1T\"), 2 ) )\n\t\trateSection = 6;\n\telse if ( eqNByte( RateSection, (u8 *)(\"VHT\"), 3 ) && eqNByte( RfPath, (u8 *)(\"2T\"), 2 ) )\n\t\trateSection = 7;\n\telse if ( eqNByte( RateSection, (u8 *)(\"VHT\"), 3 ) && eqNByte( RfPath, (u8 *)(\"3T\"), 2 ) )\n\t\trateSection = 8;\n\telse if ( eqNByte( RateSection, (u8 *)(\"VHT\"), 3 ) && eqNByte( RfPath, (u8 *)(\"4T\"), 2 ) )\n\t\trateSection = 9;\n\telse\n\t{\n\t\tDBG_871X(\"Wrong rate section!\\n\");\n\t\treturn;\n\t}\n\t\t\t\n\n\tif ( eqNByte( Bandwidth, (u8 *)(\"20M\"), 3 ) ) bandwidth = 0;\n\telse if ( eqNByte( Bandwidth, (u8 *)(\"40M\"), 3 ) ) bandwidth = 1;\n\telse if ( eqNByte( Bandwidth, (u8 *)(\"80M\"), 3 ) ) bandwidth = 2;\n\telse if ( eqNByte( Bandwidth, (u8 *)(\"160M\"), 4 ) ) bandwidth = 3;\n\n\tif ( eqNByte( Band, (u8 *)(\"2.4G\"), 4 ) )\n\t{\n\t\tchannelIndex = phy_GetChannelIndexOfTxPowerLimit( BAND_ON_2_4G, channel );\n\n\t\tif ( channelIndex == -1 )\n\t\t\treturn;\n\n\t\tif (bandwidth >= MAX_2_4G_BANDWIDTH_NUM)\n\t\t\tbandwidth = MAX_2_4G_BANDWIDTH_NUM - 1;\n\n\t\tprevPowerLimit = pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A];\n\n\t\tif ( powerLimit < prevPowerLimit )\n\t\t\tpHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] = powerLimit;\n\t\t\n\t\t//DBG_871X( \"2.4G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\\n\", \n\t\t//\t  regulation, bandwidth, rateSection, channelIndex, pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] );\n\t}\n\telse if ( eqNByte( Band, (u8 *)(\"5G\"), 2 ) )\n\t{\n\t\tchannelIndex = phy_GetChannelIndexOfTxPowerLimit( BAND_ON_5G, channel );\n\n\t\tif ( channelIndex == -1 )\n\t\t\treturn;\n\n\t\tprevPowerLimit = pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A];\n\n\t\tif ( powerLimit < prevPowerLimit )\n\t\t\tpHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] = powerLimit;\n\n\t\t//DBG_871X( \"5G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\\n\", \n\t\t//\t  regulation, bandwidth, rateSection, channel, pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] );\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"Cannot recognize the band info in %s\\n\", Band );\n\t\treturn;\n\t}\n}\n\nu8\nPHY_GetTxPowerIndex(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t)\n{\n\tu8\ttxPower = 0x3E;\n\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter)) {\n#if (RTL8814A_SUPPORT == 1)\n\t\ttxPower = PHY_GetTxPowerIndex_8814A(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t} else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {\n#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))\n\t\ttxPower = PHY_GetTxPowerIndex_8812A(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pAdapter)) {\n#if (RTL8723B_SUPPORT == 1)\n\t\ttxPower = PHY_GetTxPowerIndex_8723B(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pAdapter)) {\n#if (RTL8703B_SUPPORT == 1)\n\t\ttxPower = PHY_GetTxPowerIndex_8703B(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pAdapter)) {\n#if (RTL8192E_SUPPORT==1)\n\t\ttxPower = PHY_GetTxPowerIndex_8192E(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8188E(pAdapter)) {\n#if (RTL8188E_SUPPORT==1)\n\t\ttxPower = PHY_GetTxPowerIndex_8188E(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t} else if (IS_HARDWARE_TYPE_8188F(pAdapter)) {\n#if (RTL8188F_SUPPORT == 1)\n\t\ttxPower = PHY_GetTxPowerIndex_8188F(pAdapter, RFPath, Rate, BandWidth, Channel);\n#endif\n\t}\n\n\treturn txPower;\n}\n\nVOID\nPHY_SetTxPowerIndex(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu32\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tRate\n\t)\n{\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter)) {\n#if (RTL8814A_SUPPORT == 1)\n\t\tPHY_SetTxPowerIndex_8814A(pAdapter, PowerIndex, RFPath, Rate);\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {\n#if ((RTL8812A_SUPPORT==1) || (RTL8821A_SUPPORT == 1))\n\t\tPHY_SetTxPowerIndex_8812A( pAdapter, PowerIndex, RFPath, Rate );\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8723B(pAdapter)) {\n#if (RTL8723B_SUPPORT==1)\n\t\tPHY_SetTxPowerIndex_8723B( pAdapter, PowerIndex, RFPath, Rate );\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8703B(pAdapter)) {\n#if (RTL8703B_SUPPORT==1)\n\t\tPHY_SetTxPowerIndex_8703B( pAdapter, PowerIndex, RFPath, Rate );\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8192E(pAdapter)) {\n#if (RTL8192E_SUPPORT==1)\n\t\tPHY_SetTxPowerIndex_8192E( pAdapter, PowerIndex, RFPath, Rate );\n#endif\n\t}\n\telse if (IS_HARDWARE_TYPE_8188E(pAdapter)) {\n#if (RTL8188E_SUPPORT==1)\n\t\tPHY_SetTxPowerIndex_8188E( pAdapter, PowerIndex, RFPath, Rate );\n#endif\n\t} else if (IS_HARDWARE_TYPE_8188F(pAdapter)) {\n#if (RTL8188F_SUPPORT == 1)\n\t\tPHY_SetTxPowerIndex_8188F(pAdapter, PowerIndex, RFPath, Rate);\n#endif\n\t}\n}\n\nvoid dump_tx_power_by_rate_base(void *sel, _adapter *adapter)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tint path, tx_num, band, rs;\n\n\tfor (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {\n\t\t/* TODO: hal capbility to distinguish 2.4G/5G support */\n\t\tif (band == BAND_ON_5G && !(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter) || IS_HARDWARE_TYPE_8192D(adapter)))\n\t\t\tcontinue;\n\n\t\tfor (path = 0; path < RF_PATH_MAX; path++) {\n\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\tbreak;\n\n\t\t\tDBG_871X_SEL_NL(sel, \"[%sG][%c]\\n\", (band == BAND_ON_2_4G ? \"2.4\" : \"5\"), rf_path_char(path));\n\n\t\t\tfor (rs = 0; rs < RATE_SECTION_NUM; rs++) {\n\t\t\t\ttx_num = rate_section_to_tx_num(rs);\n\t\t\t\tif (tx_num >= hal_spec->nss_num)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tDBG_871X_SEL_NL(sel, \"%7s: %3d\\n\"\n\t\t\t\t\t, rate_section_str(rs)\n\t\t\t\t\t, PHY_GetTxPowerByRateBase(adapter, band, path, tx_num, rs)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid dump_tx_power_by_rate(void *sel, _adapter *adapter)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tint path, tx_num, band, n, rs;\n\tu8 rate_num, max_rate_num, base;\n\ts8 by_rate_offset;\n\n\tfor (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {\n\t\t/* TODO: hal capbility to distinguish 2.4G/5G support */\n\t\tif (band == BAND_ON_5G && !(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter) || IS_HARDWARE_TYPE_8192D(adapter)))\n\t\t\tcontinue;\n\n\t\tfor (path = 0; path < RF_PATH_MAX; path++) {\n\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\tbreak;\n\n\t\t\tDBG_871X_SEL_NL(sel, \"[%sG][%c]\\n\", (band == BAND_ON_2_4G ? \"2.4\" : \"5\"), rf_path_char(path));\n\n\t\t\tfor (rs = 0; rs < RATE_SECTION_NUM; rs++) {\n\t\t\t\ttx_num = rate_section_to_tx_num(rs);\n\t\t\t\tif (tx_num >= hal_spec->nss_num)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\t\t\t\tmax_rate_num = 10;\n\t\t\t\telse\n\t\t\t\t\tmax_rate_num = 8;\n\t\t\t\trate_num = rate_section_rate_num(rs);\n\t\t\t\tbase = PHY_GetTxPowerByRateBase(adapter, band, path, tx_num, rs);\n\n\t\t\t\tDBG_871X_SEL_NL(sel, \"%7s: \", rate_section_str(rs));\n\n\t\t\t\t/* dump power by rate in db */\n\t\t\t\tfor (n = rate_num - 1; n >= 0; n--) {\n\t\t\t\t\tby_rate_offset = PHY_GetTxPowerByRate(adapter, band, path, tx_num, rates_by_sections[rs].rates[n]);\n\n\t\t\t\t\tif ((base + by_rate_offset) % 2)\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"%2d.5 \", (base + by_rate_offset) / 2);\n\t\t\t\t\telse\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"%4d \", (base + by_rate_offset) / 2);\n\t\t\t\t}\n\t\t\t\tfor (n = 0; n < max_rate_num - rate_num; n++)\n\t\t\t\t\tDBG_871X_SEL(sel, \"%4s \", \"\");\n\n\t\t\t\tDBG_871X_SEL(sel, \"|\");\n\n\t\t\t\t/* dump power by rate in offset */\n\t\t\t\tfor (n = rate_num - 1; n >= 0; n--) {\n\t\t\t\t\tby_rate_offset = PHY_GetTxPowerByRate(adapter, band, path, tx_num, rates_by_sections[rs].rates[n]);\n\t\t\t\t\tDBG_871X_SEL(sel, \"%3d \", by_rate_offset);\n\t\t\t\t}\n\t\t\t\tDBG_871X_SEL_NL(sel, \"\\n\");\n\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid dump_tx_power_limit(void *sel, _adapter *adapter)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tstruct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));\n\n\tint bw, band, ch_num, rs, i, path;\n\tu8 ch, n, rd;\n\n\tif (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\tDBG_871X_SEL_NL(sel, \"tx_pwr_lmt_5g_20_40_ref:0x%02x\\n\", hal_data->tx_pwr_lmt_5g_20_40_ref);\n\n\tfor (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {\n\t\t/* TODO: hal capbility to distinguish 2.4G/5G support */\n\t\tif (band == BAND_ON_5G && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\t\tcontinue;\n\n\t\trd = (band == BAND_ON_2_4G ? hal_data->Regulation2_4G : hal_data->Regulation5G);\n\n\t\tfor (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; bw++) {\n\t\t\t/* TODO: hal capbility to distinguish bandwidth support */\n\n\t\t\tif (bw >= CHANNEL_WIDTH_160)\n\t\t\t\tbreak;\n\t\t\tif (band == BAND_ON_2_4G && bw >= CHANNEL_WIDTH_80)\n\t\t\t\tbreak;\n\n\t\t\tif (band == BAND_ON_2_4G)\n\t\t\t\tch_num = CENTER_CH_2G_NUM;\n\t\t\telse\n\t\t\t\tch_num = center_chs_5g_num(bw);\n\n\t\t\tif (ch_num == 0) {\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfor (rs = 0; rs < RATE_SECTION_NUM; rs++) {\n\t\t\t\tif (band == BAND_ON_2_4G && IS_VHT_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (bw > CHANNEL_WIDTH_20 && (IS_CCK_RATE_SECTION(rs) || IS_OFDM_RATE_SECTION(rs)))\n\t\t\t\t\tcontinue;\n\t\t\t\tif (bw > CHANNEL_WIDTH_40 && IS_HT_RATE_SECTION(rs))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (rate_section_to_tx_num(rs) >= hal_spec->nss_num)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/* by pass 5G 20M, 40M pure reference */\n\t\t\t\tif (band == BAND_ON_5G && (bw == CHANNEL_WIDTH_20 || bw == CHANNEL_WIDTH_40)) {\n\t\t\t\t\tif (hal_data->tx_pwr_lmt_5g_20_40_ref == TX_PWR_LMT_REF_HT_FROM_VHT) {\n\t\t\t\t\t\tif (IS_HT_RATE_SECTION(rs))\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (hal_data->tx_pwr_lmt_5g_20_40_ref == TX_PWR_LMT_REF_VHT_FROM_HT) {\n\t\t\t\t\t\tif (IS_VHT_RATE_SECTION(rs) && bw <= CHANNEL_WIDTH_40)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tDBG_871X_SEL_NL(sel, \"[%sG][%s][%s]\\n\"\n\t\t\t\t\t, (band == BAND_ON_2_4G ? \"2.4\" : \"5\")\n\t\t\t\t\t, ch_width_str(bw)\n\t\t\t\t\t, rate_section_str(rs)\n\t\t\t\t);\n\n\t\t\t\t/* header for limit in db */\n\t\t\t\tDBG_871X_SEL_NL(sel, \"%3s %5s %5s %5s %5s \"\n\t\t\t\t\t, \"ch\"\n\t\t\t\t\t, (rd == TXPWR_LMT_FCC ? \"*FCC\" : \"FCC\")\n\t\t\t\t\t, (rd == TXPWR_LMT_ETSI ? \"*ETSI\" : \"ETSI\")\n\t\t\t\t\t, (rd == TXPWR_LMT_MKK ? \"*MKK\" : \"MKK\")\n\t\t\t\t\t, (rd == TXPWR_LMT_WW ? \"*WW\" : \"WW\")\n\t\t\t\t);\n\n\t\t\t\t/* header for limit offset */\n\t\t\t\tfor (path = 0; path < RF_PATH_MAX; path++) {\n\t\t\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tDBG_871X_SEL(sel, \"|%3c %3c %3c %3c \"\n\t\t\t\t\t\t, (rd == TXPWR_LMT_FCC ? rf_path_char(path) : ' ')\n\t\t\t\t\t\t, (rd == TXPWR_LMT_ETSI ? rf_path_char(path) : ' ')\n\t\t\t\t\t\t, (rd == TXPWR_LMT_MKK ? rf_path_char(path) : ' ')\n\t\t\t\t\t\t, (rd == TXPWR_LMT_WW ? rf_path_char(path) : ' ')\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\n\t\t\t\tfor (n = 0; n < ch_num; n++) {\n\t\t\t\t\ts8 limit_idx[RF_PATH_MAX][MAX_REGULATION_NUM];\n\t\t\t\t\ts8 limit_offset[MAX_REGULATION_NUM];\n\t\t\t\t\tu8 base;\n\n\t\t\t\t\tif (band == BAND_ON_2_4G)\n\t\t\t\t\t\tch = n + 1;\n\t\t\t\t\telse\n\t\t\t\t\t\tch = center_chs_5g(bw, n);\n\n\t\t\t\t\tif (ch == 0) {\n\t\t\t\t\t\trtw_warn_on(1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* dump limit in db (calculate from path A) */\n\t\t\t\t\tlimit_offset[0] = PHY_GetTxPowerLimit(adapter, 3, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* FCC */\n\t\t\t\t\tlimit_offset[1] = PHY_GetTxPowerLimit(adapter, 1, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* ETSI */\n\t\t\t\t\tlimit_offset[2] = PHY_GetTxPowerLimit(adapter, 2, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* MKK */\n\t\t\t\t\tlimit_offset[3] = PHY_GetTxPowerLimit(adapter, 4, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* WW */\n\n\t\t\t\t\tbase = PHY_GetTxPowerByRateBase(adapter, band, RF_PATH_A, rate_section_to_tx_num(rs), rs);\n\n\t\t\t\t\tDBG_871X_SEL_NL(sel, \"%3u \", ch);\n\t\t\t\t\tfor (i = 0; i < MAX_REGULATION_NUM; i++) {\n\t\t\t\t\t\tif (limit_offset[i] == MAX_POWER_INDEX) {\n\t\t\t\t\t\t\tlimit_idx[0][i] = MAX_POWER_INDEX;\n\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"%5s \", \"NA\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlimit_idx[0][i] = limit_offset[i] + base;\n\t\t\t\t\t\t\tif ((limit_offset[i] + base) % 2)\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"%3d.5 \", (limit_offset[i] + base) / 2);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"%5d \", (limit_offset[i] + base) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* dump limit offset of each path */\n\t\t\t\t\tfor (path = 0; path < RF_PATH_MAX; path++) {\n\t\t\t\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tlimit_offset[0] = PHY_GetTxPowerLimit(adapter, 3, band, bw, path, rates_by_sections[rs].rates[0], ch); /* FCC */\n\t\t\t\t\t\tlimit_offset[1] = PHY_GetTxPowerLimit(adapter, 1, band, bw, path, rates_by_sections[rs].rates[0], ch); /* ETSI */\n\t\t\t\t\t\tlimit_offset[2] = PHY_GetTxPowerLimit(adapter, 2, band, bw, path, rates_by_sections[rs].rates[0], ch); /* MKK */\n\t\t\t\t\t\tlimit_offset[3] = PHY_GetTxPowerLimit(adapter, 4, band, bw, path, rates_by_sections[rs].rates[0], ch); /* WW */\n\n\t\t\t\t\t\tbase = PHY_GetTxPowerByRateBase(adapter, band, path, rate_section_to_tx_num(rs), rs);\n\n\t\t\t\t\t\tDBG_871X_SEL(sel, \"|\");\n\t\t\t\t\t\tfor (i = 0; i < MAX_REGULATION_NUM; i++) {\n\t\t\t\t\t\t\tif (limit_offset[i] == MAX_POWER_INDEX) {\n\t\t\t\t\t\t\t\tlimit_idx[path][i] = MAX_POWER_INDEX;\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"%3s \", \"NA\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlimit_idx[path][i] = limit_offset[i] + base;\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"%3d \", limit_offset[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* compare limit_idx of each path, print 'x' when mismatch */\n\t\t\t\t\tif (hal_data->NumTotalRFPath > 1) {\n\t\t\t\t\t\tfor (i = 0; i < MAX_REGULATION_NUM; i++) {\n\t\t\t\t\t\t\tfor (path = 0; path < RF_PATH_MAX; path++) {\n\t\t\t\t\t\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tif (limit_idx[path][i] != limit_idx[(path + 1) % hal_data->NumTotalRFPath][i])\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (path >= hal_data->NumTotalRFPath)\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \" \");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tDBG_871X_SEL(sel, \"x\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tDBG_871X_SEL(sel, \"\\n\");\n\n\t\t\t\t}\n\t\t\t\tDBG_871X_SEL_NL(sel, \"\\n\");\n\t\t\t}\n\t\t}\n\t}\n}\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nint\nphy_ConfigMACWithParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar* \t\tpFileName\n)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\tchar\t*szLine, *ptmp;\n\tu32\tu4bRegOffset, u4bRegValue, u4bMove;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_MAC_PARA_FILE))\n\t\treturn rtStatus;\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pHalData->mac_reg_len == 0) && (pHalData->mac_reg == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpHalData->mac_reg = rtw_zvmalloc(rlen);\n\t\t\t\tif(pHalData->mac_reg) {\n\t\t\t\t\t_rtw_memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);\n\t\t\t\t\tpHalData->mac_reg_len = rlen;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s mac_reg alloc fail !\\n\",__FUNCTION__);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pHalData->mac_reg_len != 0) && (pHalData->mac_reg != NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pHalData->mac_reg, pHalData->mac_reg_len);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif (rtStatus == _SUCCESS)\n\t{\n\t\tptmp = pHalData->para_file_buf;\n\t\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t\t{\n\t\t\tif(!IsCommentString(szLine))\n\t\t\t{\n\t\t\t\t// Get 1st hex value as register offset\n\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\n\t\t\t\t{\n\t\t\t\t\tif(u4bRegOffset == 0xffff)\n\t\t\t\t\t{ // Ending.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get 2nd hex value as register value.\n\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_write8(Adapter, u4bRegOffset, (u8)u4bRegValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\nint\nphy_ConfigBBWithParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar*\t\tpFileName,\n\tIN\tu32\t\t\tConfigType\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\tchar\t*szLine, *ptmp;\n\tu32\tu4bRegOffset, u4bRegValue, u4bMove;\n\tchar\t*pBuf = NULL;\n\tu32\t*pBufLen = NULL;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_BB_PARA_FILE))\n\t\treturn rtStatus;\n\n\tswitch(ConfigType)\n\t{\n\t\tcase CONFIG_BB_PHY_REG:\n\t\t\tpBuf = pHalData->bb_phy_reg;\n\t\t\tpBufLen = &pHalData->bb_phy_reg_len;\n\t\t\tbreak;\n\t\tcase CONFIG_BB_AGC_TAB:\n\t\t\tpBuf = pHalData->bb_agc_tab;\n\t\t\tpBufLen = &pHalData->bb_agc_tab_len;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"Unknown ConfigType!! %d\\r\\n\", ConfigType);\n\t\t\tbreak;\n\t}\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpBuf = rtw_zvmalloc(rlen);\n\t\t\t\tif(pBuf) {\n\t\t\t\t\t_rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);\n\t\t\t\t\t*pBufLen = rlen;\n\n\t\t\t\t\tswitch(ConfigType)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase CONFIG_BB_PHY_REG:\n\t\t\t\t\t\t\tpHalData->bb_phy_reg = pBuf;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CONFIG_BB_AGC_TAB:\n\t\t\t\t\t\t\tpHalData->bb_agc_tab = pBuf;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s(): ConfigType %d  alloc fail !\\n\",__FUNCTION__,ConfigType);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif (rtStatus == _SUCCESS)\n\t{\n\t\tptmp = pHalData->para_file_buf;\n\t\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t\t{\n\t\t\tif(!IsCommentString(szLine))\n\t\t\t{\n\t\t\t\t// Get 1st hex value as register offset.\n\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\n\t\t\t\t{\n\t\t\t\t\tif(u4bRegOffset == 0xffff)\n\t\t\t\t\t{ // Ending.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe)\n\t\t\t\t\t{\n\t\t\t\t\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\t\t\t\t\trtw_msleep_os(50);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\trtw_mdelay_os(50);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfd)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_mdelay_os(5);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfc)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_mdelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfb)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(50);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfa)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(5);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xf9)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get 2nd hex value as register value.\n\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t{\n\t\t\t\t\t\t//DBG_871X(\"[BB-ADDR]%03lX=%08lX\\n\", u4bRegOffset, u4bRegValue);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);\n\n\t\t\t\t\t\tif (u4bRegOffset == 0xa24)\n\t\t\t\t\t\t\tpHalData->odmpriv.RFCalibrateInfo.RegA24 = u4bRegValue;\n\n\t\t\t\t\t\t// Add 1us delay between BB/RF register setting.\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\nVOID\nphy_DecryptBBPgParaFile(\n\tPADAPTER\t\tAdapter,\n\tchar*\t\t\tbuffer\n\t)\n{\n\tu32\ti = 0, j = 0;\n\tu8\tmap[95] = {0};\n\tu8\tcurrentChar;\n\tchar\t*BufOfLines, *ptmp;\n\n\t//DBG_871X(\"=====>phy_DecryptBBPgParaFile()\\n\");\n\t// 32 the ascii code of the first visable char, 126 the last one\n\tfor ( i = 0; i < 95; ++i )\n\t\tmap[i] = ( u8 ) ( 94 - i );\n\n\tptmp = buffer;\n\ti = 0;\n\tfor (BufOfLines = GetLineFromBuffer(ptmp); BufOfLines != NULL; BufOfLines = GetLineFromBuffer(ptmp))\n\t{\n\t\t//DBG_871X(\"Encrypted Line: %s\\n\", BufOfLines);\n\n\t\tfor ( j = 0; j < strlen(BufOfLines); ++j )\n\t\t{\n\t\t\tcurrentChar = BufOfLines[j];\n\n\t\t\tif ( currentChar == '\\0' )\n\t\t\t\tbreak;\n\n\t\t\tcurrentChar -=  (u8) ( ( ( ( i + j ) * 3 ) % 128 ) );\n\t\t\t\n\t\t\tBufOfLines[j] = map[currentChar - 32] + 32;\n\t\t}\n\t\t//DBG_871X(\"Decrypted Line: %s\\n\", BufOfLines );\n\t\tif (strlen(BufOfLines) != 0)\n\t\t\ti++;\n\t\tBufOfLines[strlen(BufOfLines)] = '\\n';\n\t}\n}\n\nint\nphy_ParseBBPgParaFile(\n\tPADAPTER\t\tAdapter,\n\tchar*\t\t\tbuffer\n\t)\n{\n\tint\trtStatus = _SUCCESS;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tchar\t*szLine, *ptmp;\n\tu32\tu4bRegOffset, u4bRegMask, u4bRegValue;\n\tu32\tu4bMove;\n\tBOOLEAN firstLine = _TRUE;\n\tu8\ttx_num = 0;\n\tu8\tband = 0, rf_path = 0;\n\n\t//DBG_871X(\"=====>phy_ParseBBPgParaFile()\\n\");\n\t\n\tif ( Adapter->registrypriv.RegDecryptCustomFile == 1 )\n\t\tphy_DecryptBBPgParaFile( Adapter, buffer);\n\n\tptmp = buffer;\n\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t{\n\t\tif(!IsCommentString(szLine))\n\t\t{\n\t\t\tif( isAllSpaceOrTab( szLine, sizeof( *szLine ) ) )\n\t\t\t\tcontinue;\n\n\t\t\t// Get header info (relative value or exact value)\n\t\t\tif ( firstLine )\n\t\t\t{\n\t\t\t\tif ( eqNByte( szLine, (u8 *)(\"#[v1]\"), 5 ) )\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tpHalData->odmpriv.PhyRegPgVersion = szLine[3] - '0';\n\t\t\t\t\t//DBG_871X(\"This is a new format PHY_REG_PG.txt \\n\");\n\t\t\t\t}\n\t\t\t\telse if ( eqNByte( szLine, (u8 *)(\"#[v0]\"), 5 ))\n\t\t\t\t{\n\t\t\t\t\tpHalData->odmpriv.PhyRegPgVersion = szLine[3] - '0';\n\t\t\t\t\t//DBG_871X(\"This is a old format PHY_REG_PG.txt ok\\n\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"The format in PHY_REG_PG are invalid %s\\n\", szLine);\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tif ( eqNByte( szLine + 5, (u8 *)(\"[Exact]#\"), 8 ) )\n\t\t\t\t{\n\t\t\t\t\tpHalData->odmpriv.PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\n\t\t\t\t\t//DBG_871X(\"The values in PHY_REG_PG are exact values ok\\n\");\n\t\t\t\t\tfirstLine = _FALSE;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse if ( eqNByte( szLine + 5, (pu1Byte)(\"[Relative]#\"), 11 ) )\n\t\t\t\t{\n\t\t\t\t\tpHalData->odmpriv.PhyRegPgValueType = PHY_REG_PG_RELATIVE_VALUE;\n\t\t\t\t\t//DBG_871X(\"The values in PHY_REG_PG are relative values ok\\n\");\n\t\t\t\t\tfirstLine = _FALSE;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"The values in PHY_REG_PG are invalid %s\\n\", szLine);\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( pHalData->odmpriv.PhyRegPgVersion == 0 )\n\t\t\t{\n\t\t\t\t// Get 1st hex value as register offset.\n\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\n\t\t\t\t{\n\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\tif(u4bRegOffset == 0xffff)\n\t\t\t\t\t{ // Ending.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get 2nd hex value as register mask.\n\t\t\t\t\tif ( GetHexValueFromString(szLine, &u4bRegMask, &u4bMove) )\n\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\tif ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_RELATIVE_VALUE ) \n\t\t\t\t\t{\n\t\t\t\t\t\t// Get 3rd hex value as register value.\n\t\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPHY_StoreTxPowerByRate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, u4bRegValue);\n\t\t\t\t\t\t\t//DBG_871X(\"[ADDR] %03X=%08X Mask=%08x\\n\", u4bRegOffset, u4bRegValue, u4bRegMask);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) \n\t\t\t\t\t{\n\t\t\t\t\t\tu32\tcombineValue = 0;\n\t\t\t\t\t\tu8\tinteger = 0, fraction = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse \n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t\n\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse \n\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t\n\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse \n\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\t\t\t\t\t\tPHY_StoreTxPowerByRate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, combineValue);\n\n\t\t\t\t\t\t//DBG_871X(\"[ADDR] 0x%3x = 0x%4x\\n\", u4bRegOffset, combineValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( pHalData->odmpriv.PhyRegPgVersion > 0 )\n\t\t\t{\n\t\t\t\tu32\tindex = 0, cnt = 0;\n\n\t\t\t\tif ( eqNByte( szLine, \"0xffff\", 6 ) )\n\t\t\t\t\tbreak;\n\n\t\t\t\tif( !eqNByte( \"#[END]#\", szLine, 7 ) )\n\t\t\t\t{\n\t\t\t\t\t// load the table label info\n\t\t\t\t\tif ( szLine[0] == '#' )\n\t\t\t\t\t{\n\t\t\t\t\t\tindex = 0;\n\t\t\t\t\t\tif ( eqNByte( szLine, \"#[2.4G]\" , 7 ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tband = BAND_ON_2_4G;\n\t\t\t\t\t\t\tindex += 8;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( eqNByte( szLine, \"#[5G]\", 5) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tband = BAND_ON_5G;\n\t\t\t\t\t\t\tindex += 6;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(\"Invalid band %s in PHY_REG_PG.txt \\n\", szLine );\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trf_path= szLine[index] - 'A';\n\t\t\t\t\t\t//DBG_871X(\" Table label Band %d, RfPath %d\\n\", band, rf_path );\n\t\t\t\t\t}\n\t\t\t\t\telse // load rows of tables\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( szLine[1] == '1' )\n\t\t\t\t\t\t\ttx_num = RF_1TX;\n\t\t\t\t\t\telse if ( szLine[1] == '2' )\n\t\t\t\t\t\t\ttx_num = RF_2TX;\n\t\t\t\t\t\telse if ( szLine[1] == '3' )\n\t\t\t\t\t\t\ttx_num = RF_3TX;\n\t\t\t\t\t\telse if ( szLine[1] == '4' )\n\t\t\t\t\t\t\ttx_num = RF_4TX;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tDBG_871X(\"Invalid row in PHY_REG_PG.txt %c\\n\", szLine[1] );\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twhile ( szLine[index] != ']' )\n\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t++index;// skip ]\n\n\t\t\t\t\t\t// Get 2nd hex value as register offset.\n\t\t\t\t\t\tszLine += index;\n\t\t\t\t\t\tif ( GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\t// Get 2nd hex value as register mask.\n\t\t\t\t\t\tif ( GetHexValueFromString(szLine, &u4bRegMask, &u4bMove) )\n\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\tif ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_RELATIVE_VALUE ) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Get 3rd hex value as register value.\n\t\t\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPHY_StoreTxPowerByRate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, u4bRegValue);\n\t\t\t\t\t\t\t\t//DBG_871X(\"[ADDR] %03X (tx_num %d) =%08X Mask=%08x\\n\", u4bRegOffset, tx_num, u4bRegValue, u4bRegMask);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE ) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tu32\tcombineValue = 0;\n\t\t\t\t\t\t\tu8\tinteger = 0, fraction = 0;\n\n\t\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\n\t\t\t\t\t\t\tif ( GetFractionValueFromString( szLine, &integer, &fraction, &u4bMove ) )\n\t\t\t\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\t\t\tinteger *= 2;\n\t\t\t\t\t\t\tif ( fraction == 5 ) integer += 1;\n\t\t\t\t\t\t\tcombineValue <<= 8;\n\t\t\t\t\t\t\tcombineValue |= ( ( ( integer / 10 ) << 4 ) + ( integer % 10 ) );\n\t\t\t\t\t\t\t//DBG_871X(\" %d\", integer );\n\t\t\t\t\t\t\tPHY_StoreTxPowerByRate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, combineValue);\n\n\t\t\t\t\t\t\t//DBG_871X(\"[ADDR] 0x%3x (tx_num %d) = 0x%4x\\n\", u4bRegOffset, tx_num, combineValue );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t//DBG_871X(\"<=====phy_ParseBBPgParaFile()\\n\");\n\treturn rtStatus;\n}\n\nint\nphy_ConfigBBWithPgParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar* \t\tpFileName)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_BB_PG_PARA_FILE))\n\t\treturn rtStatus;\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pHalData->bb_phy_reg_pg_len == 0) && (pHalData->bb_phy_reg_pg == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpHalData->bb_phy_reg_pg = rtw_zvmalloc(rlen);\n\t\t\t\tif(pHalData->bb_phy_reg_pg) {\n\t\t\t\t\t_rtw_memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);\n\t\t\t\t\tpHalData->bb_phy_reg_pg_len = rlen;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s bb_phy_reg_pg alloc fail !\\n\",__FUNCTION__);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pHalData->bb_phy_reg_pg_len != 0) && (pHalData->bb_phy_reg_pg != NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif(rtStatus == _SUCCESS)\n\t{\n\t\t//DBG_871X(\"phy_ConfigBBWithPgParaFile(): read %s ok\\n\", pFileName);\n\t\tphy_ParseBBPgParaFile(Adapter, pHalData->para_file_buf);\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\n#if (MP_DRIVER == 1 )\n\nint\nphy_ConfigBBWithMpParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar* \t\tpFileName\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\tchar\t*szLine, *ptmp;\n\tu32\tu4bRegOffset, u4bRegValue, u4bMove;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_BB_MP_PARA_FILE))\n\t\treturn rtStatus;\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pHalData->bb_phy_reg_mp_len == 0) && (pHalData->bb_phy_reg_mp == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpHalData->bb_phy_reg_mp = rtw_zvmalloc(rlen);\n\t\t\t\tif(pHalData->bb_phy_reg_mp) {\n\t\t\t\t\t_rtw_memcpy(pHalData->bb_phy_reg_mp, pHalData->para_file_buf, rlen);\n\t\t\t\t\tpHalData->bb_phy_reg_mp_len = rlen;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s bb_phy_reg_mp alloc fail !\\n\",__FUNCTION__);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pHalData->bb_phy_reg_mp_len != 0) && (pHalData->bb_phy_reg_mp != NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif(rtStatus == _SUCCESS)\n\t{\n\t\t//DBG_871X(\"phy_ConfigBBWithMpParaFile(): read %s ok\\n\", pFileName);\n\n\t\tptmp = pHalData->para_file_buf;\n\t\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t\t{\n\t\t\tif(!IsCommentString(szLine))\n\t\t\t{\n\t\t\t\t// Get 1st hex value as register offset.\n\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\n\t\t\t\t{\n\t\t\t\t\tif(u4bRegOffset == 0xffff)\n\t\t\t\t\t{ // Ending.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe)\n\t\t\t\t\t{\n\t\t\t\t\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\t\t\t\t\trtw_msleep_os(50);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\trtw_mdelay_os(50);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfd)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_mdelay_os(5);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfc)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_mdelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfb)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(50);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfa)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(5);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xf9)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get 2nd hex value as register value.\n\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t{\n\t\t\t\t\t\t//DBG_871X(\"[ADDR]%03lX=%08lX\\n\", u4bRegOffset, u4bRegValue);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);\n\n\t\t\t\t\t\t// Add 1us delay between BB/RF register setting.\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\n#endif\n\nint\nPHY_ConfigRFWithParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar* \t\tpFileName,\n\tIN\tu8\t\t\teRFPath\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\tchar\t*szLine, *ptmp;\n\tu32\tu4bRegOffset, u4bRegValue, u4bMove;\n\tu16\ti;\n\tchar\t*pBuf = NULL;\n\tu32\t*pBufLen = NULL;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_RF_PARA_FILE))\n\t\treturn rtStatus;\n\n\tswitch(eRFPath)\n\t{\n\t\tcase ODM_RF_PATH_A:\n\t\t\tpBuf = pHalData->rf_radio_a;\n\t\t\tpBufLen = &pHalData->rf_radio_a_len;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_B:\n\t\t\tpBuf = pHalData->rf_radio_b;\n\t\t\tpBufLen = &pHalData->rf_radio_b_len;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"Unknown RF path!! %d\\r\\n\", eRFPath);\n\t\t\tbreak;\t\t\t\n\t}\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpBuf = rtw_zvmalloc(rlen);\n\t\t\t\tif(pBuf) {\n\t\t\t\t\t_rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);\n\t\t\t\t\t*pBufLen = rlen;\n\n\t\t\t\t\tswitch(eRFPath)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase ODM_RF_PATH_A:\n\t\t\t\t\t\t\tpHalData->rf_radio_a = pBuf;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\t\tpHalData->rf_radio_b = pBuf;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s(): eRFPath=%d  alloc fail !\\n\",__FUNCTION__,eRFPath);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif(rtStatus == _SUCCESS)\n\t{\n\t\t//DBG_871X(\"%s(): read %s successfully\\n\", __FUNCTION__, pFileName);\n\t\n\t\tptmp = pHalData->para_file_buf;\n\t\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t\t{\n\t\t\tif(!IsCommentString(szLine))\n\t\t\t{\n\t\t\t\t// Get 1st hex value as register offset.\n\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))\n\t\t\t\t{\n\t\t\t \t\tif(u4bRegOffset == 0xfe || u4bRegOffset == 0xffe)\n\t\t\t\t\t{ // Deay specific ms. Only RF configuration require delay.\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\t\t\t\t\trtw_msleep_os(50);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\trtw_mdelay_os(50);\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfd)\n\t\t\t\t\t{\n\t\t\t\t\t\t//delay_ms(5);\n\t\t\t\t\t\tfor(i=0;i<100;i++)\n\t\t\t\t\t\t\trtw_udelay_os(MAX_STALL_TIME);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfc)\n\t\t\t\t\t{\n\t\t\t\t\t\t//delay_ms(1);\n\t\t\t\t\t\tfor(i=0;i<20;i++)\n\t\t\t\t\t\t\trtw_udelay_os(MAX_STALL_TIME);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfb)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(50);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xfa)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(5);\n\t\t\t\t\t}\n\t\t\t\t\telse if (u4bRegOffset == 0xf9)\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t\telse if(u4bRegOffset == 0xffff)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get 2nd hex value as register value.\n\t\t\t\t\tszLine += u4bMove;\n\t\t\t\t\tif(GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))\n\t\t\t\t\t{\n\t\t\t\t\t\tPHY_SetRFReg(Adapter, eRFPath, u4bRegOffset, bRFRegOffsetMask, u4bRegValue);\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Temp add, for frequency lock, if no delay, that may cause\n\t\t\t\t\t\t// frequency shift, ex: 2412MHz => 2417MHz\n\t\t\t\t\t\t// If frequency shift, the following action may works.\n\t\t\t\t\t\t// Fractional-N table in radio_a.txt \n\t\t\t\t\t\t//0x2a 0x00001\t\t// channel 1\n\t\t\t\t\t\t//0x2b 0x00808\t\tfrequency divider.\n\t\t\t\t\t\t//0x2b 0x53333\n\t\t\t\t\t\t//0x2c 0x0000c\n\t\t\t\t\t\trtw_udelay_os(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\nVOID\ninitDeltaSwingIndexTables(\n\tPADAPTER\tAdapter, \n\tchar*\t\tBand, \n\tchar*\t\tPath,\n\tchar*\t\tSign,\n\tchar*\t\tChannel, \n\tchar*\t\tRate,\n\tchar*\t\tData\n)\n{\n\t#define STR_EQUAL_5G(_band, _path, _sign, _rate, _chnl) \\\n\t\t((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\\\n\t\t(strcmp(Rate, _rate) == 0) && (strcmp(Channel, _chnl) == 0)\\\n\t)\n\t#define STR_EQUAL_2G(_band, _path, _sign, _rate) \\\n\t\t((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\\\n\t\t(strcmp(Rate, _rate) == 0)\\\n\t)\n\t\n\t#define STORE_SWING_TABLE(_array, _iteratedIdx) \\\n\t\tfor(token = strsep(&Data, delim); token != NULL; token = strsep(&Data, delim))\\\n\t\t{\\\n\t\t\tsscanf(token, \"%d\", &idx);\\\n\t\t\t_array[_iteratedIdx++] = (u8)idx;\\\n\t\t}\\\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tu32\tj = 0;\n\tchar\t*token;\n\tchar\tdelim[] = \",\";\n\tu32\tidx = 0;\n\t\n\t//DBG_871X(\"===>initDeltaSwingIndexTables(): Band: %s;\\nPath: %s;\\nSign: %s;\\nChannel: %s;\\nRate: %s;\\n, Data: %s;\\n\", \n\t//\tBand, Path, Sign, Channel, Rate, Data);\n\t\n\tif ( STR_EQUAL_2G(\"2G\", \"A\", \"+\", \"CCK\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"A\", \"-\", \"CCK\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"B\", \"+\", \"CCK\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"B\", \"-\", \"CCK\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"A\", \"+\", \"ALL\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"A\", \"-\", \"ALL\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"B\", \"+\", \"ALL\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, j);\n\t}\n\telse if ( STR_EQUAL_2G(\"2G\", \"B\", \"-\", \"ALL\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"+\", \"ALL\", \"0\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"-\", \"ALL\", \"0\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"+\", \"ALL\", \"0\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"-\", \"ALL\", \"0\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"+\", \"ALL\", \"1\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"-\", \"ALL\", \"1\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"+\", \"ALL\", \"1\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"-\", \"ALL\", \"1\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"+\", \"ALL\", \"2\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"-\", \"ALL\", \"2\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"+\", \"ALL\", \"2\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"-\", \"ALL\", \"2\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"+\", \"ALL\", \"3\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[3], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"A\", \"-\", \"ALL\", \"3\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[3], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"+\", \"ALL\", \"3\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[3], j);\n\t}\n\telse if ( STR_EQUAL_5G(\"5G\", \"B\", \"-\", \"ALL\", \"3\") )\n\t{\n\t\tSTORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[3], j);\n\t}\n\telse\n\t{\n \t\tDBG_871X(\"===>initDeltaSwingIndexTables(): The input is invalid!!\\n\");\n\t}\n}\n\nint\nPHY_ConfigRFWithTxPwrTrackParaFile(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tchar*\t \t\tpFileName\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->odmpriv;\n\tPODM_RF_CAL_T  \t\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tint\trlen = 0, rtStatus = _FAIL;\n\tchar\t*szLine, *ptmp;\n\tu32\ti = 0, j = 0;\n\tchar\tc = 0;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_TRACK_PARA_FILE))\n\t\treturn rtStatus;\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pHalData->rf_tx_pwr_track_len == 0) && (pHalData->rf_tx_pwr_track == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpHalData->rf_tx_pwr_track = rtw_zvmalloc(rlen);\n\t\t\t\tif(pHalData->rf_tx_pwr_track) {\n\t\t\t\t\t_rtw_memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);\n\t\t\t\t\tpHalData->rf_tx_pwr_track_len = rlen;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s rf_tx_pwr_track alloc fail !\\n\",__FUNCTION__);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pHalData->rf_tx_pwr_track_len != 0) && (pHalData->rf_tx_pwr_track != NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif(rtStatus == _SUCCESS)\n\t{\n\t\t//DBG_871X(\"%s(): read %s successfully\\n\", __FUNCTION__, pFileName);\n\n\t\tptmp = pHalData->para_file_buf;\n\t\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t\t{\n\t\t\tif ( ! IsCommentString(szLine) )\n\t\t\t{\n\t\t\t\tchar\tband[5]=\"\", path[5]=\"\", sign[5]  = \"\";\n\t\t\t\tchar\tchnl[5]=\"\", rate[10]=\"\";\n\t\t\t\tchar\tdata[300]=\"\"; // 100 is too small\n\n\t\t\t\tif (strlen(szLine) < 10 || szLine[0] != '[')\n\t\t\t\t\tcontinue;\n\n\t\t\t\tstrncpy(band, szLine+1, 2); \n\t\t\t\tstrncpy(path, szLine+5, 1); \n\t\t\t\tstrncpy(sign, szLine+8, 1);\n\n\t\t\t\ti = 10; // szLine+10\n\t\t\t\tif ( ! ParseQualifiedString(szLine, &i, rate, '[', ']') ) {\n\t\t\t\t\t//DBG_871X(\"Fail to parse rate!\\n\");\n\t\t\t\t}\n\t\t\t\tif ( ! ParseQualifiedString(szLine, &i, chnl, '[', ']') ) {\n\t\t\t\t\t//DBG_871X(\"Fail to parse channel group!\\n\");\n\t\t\t\t}\n\t\t\t\twhile ( szLine[i] != '{' && i < strlen(szLine))\n\t\t\t\t\ti++;\n\t\t\t\tif ( ! ParseQualifiedString(szLine, &i, data, '{', '}') ) {\n\t\t\t\t\t//DBG_871X(\"Fail to parse data!\\n\");\n\t\t\t\t}\n\n\t\t\t\tinitDeltaSwingIndexTables(Adapter, band, path, sign, chnl, rate, data);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n#if 0\n\tfor (i = 0; i < DELTA_SWINGIDX_SIZE; ++i)\n\t{\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P[i]);\n\t\tDBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N[%d] = %d\\n\", i, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N[i]);\n\n\t\tfor (j = 0; j < 3; ++j)\n\t\t{\n\t\t    DBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[%d][%d] = %d\\n\", j, i, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[j][i]);\n\t\t    DBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[%d][%d] = %d\\n\", j, i, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[j][i]);\n\t\t    DBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[%d][%d] = %d\\n\", j, i, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[j][i]);\n\t\t    DBG_871X(\"pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[%d][%d] = %d\\n\", j, i, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[j][i]);\n\t\t}\n\t}\n#endif\n\treturn rtStatus;\n}\n\nint\nphy_ParsePowerLimitTableFile(\n  PADAPTER\t\tAdapter,\n  char*\t\t\tbuffer\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\tpDM_Odm = &(pHalData->odmpriv);\n\tu32\ti = 0, forCnt = 0;\n\tu8\tloadingStage = 0, limitValue = 0, fraction = 0;\n\tchar\t*szLine, *ptmp;\n\tint\trtStatus = _SUCCESS;\n\tchar band[10], bandwidth[10], rateSection[10],\n\t\tregulation[TXPWR_LMT_MAX_REGULATION_NUM][10], rfPath[10],colNumBuf[10];\n\tu8 \tcolNum = 0;\n\n\tDBG_871X(\"===>phy_ParsePowerLimitTableFile()\\n\" );\n\n\tif ( Adapter->registrypriv.RegDecryptCustomFile == 1 )\n\t\tphy_DecryptBBPgParaFile( Adapter, buffer);\n\n\tptmp = buffer;\n\tfor (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp))\n\t{\n\t\t// skip comment \n\t\tif ( IsCommentString( szLine ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( loadingStage == 0 ) {\n\t\t\tfor ( forCnt = 0; forCnt < TXPWR_LMT_MAX_REGULATION_NUM; ++forCnt )\n\t\t\t\t_rtw_memset( ( PVOID ) regulation[forCnt], 0, 10 );\n\t\t\t_rtw_memset( ( PVOID ) band, 0, 10 );\n\t\t\t_rtw_memset( ( PVOID ) bandwidth, 0, 10 );\n\t\t\t_rtw_memset( ( PVOID ) rateSection, 0, 10 );\n\t\t\t_rtw_memset( ( PVOID ) rfPath, 0, 10 );\n\t\t\t_rtw_memset( ( PVOID ) colNumBuf, 0, 10 );\n\n\t\t\tif ( szLine[0] != '#' || szLine[1] != '#' )\n\t\t\t\tcontinue;\n\n\t\t\t// skip the space\n\t\t\ti = 2;\n\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t++i;\n\n\t\t\tszLine[--i] = ' '; // return the space in front of the regulation info\n\n\t\t\t// Parse the label of the table\n\t\t\tif ( ! ParseQualifiedString( szLine, &i, band, ' ', ',' ) ) {\n\t\t\t\tDBG_871X( \"Fail to parse band!\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\t\t\tif ( ! ParseQualifiedString( szLine, &i, bandwidth, ' ', ',' ) ) {\n\t\t\t\tDBG_871X(\"Fail to parse bandwidth!\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\t\t\tif ( ! ParseQualifiedString( szLine, &i, rfPath, ' ', ',' ) ) {\n\t\t\t\tDBG_871X(\"Fail to parse rf path!\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\t\t\tif ( ! ParseQualifiedString( szLine, &i, rateSection, ' ', ',' ) ) {\n\t\t\t\tDBG_871X(\"Fail to parse rate!\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tloadingStage = 1;\n\t\t}\n\t\telse if ( loadingStage == 1 )\n\t\t{\n\t\t\tif ( szLine[0] != '#' || szLine[1] != '#' )\n\t\t\t\tcontinue;\n\n\t\t\t// skip the space\n\t\t\ti = 2;\n\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t++i;\n\n\t\t\tif ( !eqNByte( (u8 *)(szLine + i), (u8 *)(\"START\"), 5 ) ) {\n\t\t\t\tDBG_871X(\"Lost \\\"##   START\\\" label\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tloadingStage = 2;\n\t\t}\n\t\telse if ( loadingStage == 2 )\n\t\t{\n\t\t\tif ( szLine[0] != '#' || szLine[1] != '#' )\n\t\t\t\tcontinue;\n\n\t\t\t// skip the space\n\t\t\ti = 2;\n\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t++i;\n\n\t\t\tif ( ! ParseQualifiedString( szLine, &i, colNumBuf, '#', '#' ) ) {\n\t\t\t\tDBG_871X(\"Fail to parse column number!\\n\");\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tif ( !GetU1ByteIntegerFromStringInDecimal( colNumBuf, &colNum ) )\n\t\t\t\treturn _FAIL;\n\n\t\t\tif ( colNum > TXPWR_LMT_MAX_REGULATION_NUM ) {\n\t\t\t\tDBG_871X(\"unvalid col number %d (greater than max %d)\\n\", \n\t\t\t\t          colNum, TXPWR_LMT_MAX_REGULATION_NUM );\n\t\t\t\treturn _FAIL;\n\t\t\t}\n\n\t\t\tfor ( forCnt = 0; forCnt < colNum; ++forCnt )\n\t\t\t{\n\t\t\t\tu8\tregulation_name_cnt = 0;\n\n\t\t\t\t// skip the space\n\t\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t\t++i;\n\n\t\t\t\twhile ( szLine[i] != ' ' && szLine[i] != '\\t' && szLine[i] != '\\0' )\n\t\t\t\t\tregulation[forCnt][regulation_name_cnt++] = szLine[i++];\n\t\t\t\t//DBG_871X(\"regulation %s!\\n\", regulation[forCnt]);\n\n\t\t\t\tif ( regulation_name_cnt == 0 ) {\n\t\t\t\t\tDBG_871X(\"unvalid number of regulation!\\n\");\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tloadingStage = 3;\n\t\t}\n\t\telse if ( loadingStage == 3 )\n\t\t{\n\t\t\tchar\tchannel[10] = {0}, powerLimit[10] = {0};\n\t\t\tu8\tcnt = 0;\n\t\t\t\n\t\t\t// the table ends\n\t\t\tif ( szLine[0] == '#' && szLine[1] == '#' ) {\n\t\t\t\ti = 2;\n\t\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t\t++i;\n\n\t\t\t\tif ( eqNByte( (u8 *)(szLine + i), (u8 *)(\"END\"), 3 ) ) {\n\t\t\t\t\tloadingStage = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"Wrong format\\n\");\n\t\t\t\t\tDBG_871X(\"<===== phy_ParsePowerLimitTableFile()\\n\");\n\t\t\t\t\treturn _FAIL;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ( szLine[0] != 'c' && szLine[0] != 'C' ) || \n\t\t\t\t ( szLine[1] != 'h' && szLine[1] != 'H' ) ) {\n\t\t\t\tDBG_871X(\"Meet wrong channel => power limt pair\\n\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ti = 2;// move to the  location behind 'h'\n\n\t\t\t// load the channel number\n\t\t\tcnt = 0;\n\t\t\twhile ( szLine[i] >= '0' && szLine[i] <= '9' ) {\n\t\t\t\tchannel[cnt] = szLine[i];\n\t\t\t\t++cnt;\n\t\t\t\t++i;\n\t\t\t}\n\t\t\t//DBG_871X(\"chnl %s!\\n\", channel);\n\t\t\t\n\t\t\tfor ( forCnt = 0; forCnt < colNum; ++forCnt )\n\t\t\t{\n\t\t\t\t// skip the space between channel number and the power limit value\n\t\t\t\twhile ( szLine[i] == ' ' || szLine[i] == '\\t' )\n\t\t\t\t\t++i;\n\n\t\t\t\t// load the power limit value\n\t\t\t\tcnt = 0;\n\t\t\t\tfraction = 0;\n\t\t\t\t_rtw_memset( ( PVOID ) powerLimit, 0, 10 );\n\t\t\t\twhile ( ( szLine[i] >= '0' && szLine[i] <= '9' ) || szLine[i] == '.' )\n\t\t\t\t{\n\t\t\t\t\tif ( szLine[i] == '.' ){\n\t\t\t\t\t\tif ( ( szLine[i+1] >= '0' && szLine[i+1] <= '9' ) ) {\n\t\t\t\t\t\t\tfraction = szLine[i+1];\n\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tDBG_871X(\"Wrong fraction in TXPWR_LMT.txt\\n\");\n\t\t\t\t\t\t\treturn _FAIL;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tpowerLimit[cnt] = szLine[i];\n\t\t\t\t\t++cnt;\n\t\t\t\t\t++i;\n\t\t\t\t}\n\n\t\t\t\tif ( powerLimit[0] == '\\0' ) {\n\t\t\t\t\tpowerLimit[0] = '6';\n\t\t\t\t\tpowerLimit[1] = '3';\n\t\t\t\t\ti += 2;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif ( !GetU1ByteIntegerFromStringInDecimal( powerLimit, &limitValue ) )\n\t\t\t\t\t\treturn _FAIL;\n\n\t\t\t\t\tlimitValue *= 2;\n\t\t\t\t\tcnt = 0;\n\t\t\t\t\tif ( fraction == '5' )\n\t\t\t\t\t\t++limitValue;\n\n\t\t\t\t\t// the value is greater or equal to 100\n\t\t\t\t\tif ( limitValue >= 100 ) {\n\t\t\t\t\t\tpowerLimit[cnt++] = limitValue/100 + '0';\n\t\t\t\t\t\tlimitValue %= 100;\n\n\t\t\t\t\t\tif ( limitValue >= 10 ) {\n\t\t\t\t\t\t\tpowerLimit[cnt++] = limitValue/10 + '0';\n\t\t\t\t\t\t\tlimitValue %= 10;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tpowerLimit[cnt++] = '0';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpowerLimit[cnt++] = limitValue + '0';\n\t\t\t\t\t}\n\t\t\t\t\t// the value is greater or equal to 10\n\t\t\t\t\telse if ( limitValue >= 10 ) {\n\t\t\t\t\t\tpowerLimit[cnt++] = limitValue/10 + '0';\n\t\t\t\t\t\tlimitValue %= 10;\n\t\t\t\t\t\tpowerLimit[cnt++] = limitValue + '0';\n\t\t\t\t\t}\n\t\t\t\t\t// the value is less than 10 \n\t\t\t\t\telse\n\t\t\t\t\t\tpowerLimit[cnt++] = limitValue + '0';\n\n\t\t\t\t\tpowerLimit[cnt] = '\\0';\n\t\t\t\t}\n\n\t\t\t\t//DBG_871X(\"ch%s => %s\\n\", channel, powerLimit);\n\n\t\t\t\t// store the power limit value\n\t\t\t\tPHY_SetTxPowerLimit(pDM_Odm, (u8 *)regulation[forCnt], (u8 *)band,\n\t\t\t\t\t(u8 *)bandwidth, (u8 *)rateSection, (u8 *)rfPath, (u8 *)channel, (u8 *)powerLimit );\n\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\tDBG_871X(\"Abnormal loading stage in phy_ParsePowerLimitTableFile()!\\n\");\n\t\t\trtStatus = _FAIL;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBG_871X(\"<===phy_ParsePowerLimitTableFile()\\n\");\n\treturn rtStatus;\n}\n\nint\nPHY_ConfigRFWithPowerLimitTableParaFile(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tchar*\t \tpFileName\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trlen = 0, rtStatus = _FAIL;\n\n\tif(!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_LMT_PARA_FILE))\n\t\treturn rtStatus;\n\n\t_rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);\n\n\tif ((pHalData->rf_tx_pwr_lmt_len == 0) && (pHalData->rf_tx_pwr_lmt == NULL))\n\t{\n\t\trtw_merge_string(rtw_phy_para_file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName);\n\t\n\t\tif (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE)\n\t\t{\n\t\t\trlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);\n\t\t\tif (rlen > 0)\n\t\t\t{\n\t\t\t\trtStatus = _SUCCESS;\n\t\t\t\tpHalData->rf_tx_pwr_lmt = rtw_zvmalloc(rlen);\n\t\t\t\tif(pHalData->rf_tx_pwr_lmt) {\n\t\t\t\t\t_rtw_memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);\n\t\t\t\t\tpHalData->rf_tx_pwr_lmt_len = rlen;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tDBG_871X(\"%s rf_tx_pwr_lmt alloc fail !\\n\",__FUNCTION__);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((pHalData->rf_tx_pwr_lmt_len != 0) && (pHalData->rf_tx_pwr_lmt != NULL)) {\n\t\t\t_rtw_memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);\n\t\t\trtStatus = _SUCCESS;\n\t\t}\n\t\telse {\n\t\t\tDBG_871X(\"%s(): Critical Error !!!\\n\",__FUNCTION__);\n\t\t}\n\t}\n\n\tif(rtStatus == _SUCCESS)\n\t{\n\t\t//DBG_871X(\"%s(): read %s ok\\n\", __FUNCTION__, pFileName);\n\t\trtStatus = phy_ParsePowerLimitTableFile( Adapter, pHalData->para_file_buf );\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"%s(): No File %s, Load from HWImg Array!\\n\", __FUNCTION__, pFileName);\n\t}\n\n\treturn rtStatus;\n}\n\nvoid phy_free_filebuf(_adapter *padapter)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(padapter);\n\t\n\tif(pHalData->mac_reg)\n\t\trtw_vmfree(pHalData->mac_reg, pHalData->mac_reg_len);\n\tif(pHalData->bb_phy_reg)\n\t\trtw_vmfree(pHalData->bb_phy_reg, pHalData->bb_phy_reg_len);\n\tif(pHalData->bb_agc_tab)\n\t\trtw_vmfree(pHalData->bb_agc_tab, pHalData->bb_agc_tab_len);\n\tif(pHalData->bb_phy_reg_pg)\n\t\trtw_vmfree(pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);\n\tif(pHalData->bb_phy_reg_mp)\n\t\trtw_vmfree(pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);\n\tif(pHalData->rf_radio_a)\n\t\trtw_vmfree(pHalData->rf_radio_a, pHalData->rf_radio_a_len);\n\tif(pHalData->rf_radio_b)\n\t\trtw_vmfree(pHalData->rf_radio_b, pHalData->rf_radio_b_len);\n\tif(pHalData->rf_tx_pwr_track)\n\t\trtw_vmfree(pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);\n\tif(pHalData->rf_tx_pwr_lmt)\n\t\trtw_vmfree(pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);\t\n\t\n}\n\n#endif\n"
  },
  {
    "path": "hal/hal_dm.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2014 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n// A mapping from HalData to ODM.\nODM_BOARD_TYPE_E boardType(u8 InterfaceSel)\n{\n    ODM_BOARD_TYPE_E        board\t= ODM_BOARD_DEFAULT;\n\n#ifdef CONFIG_PCI_HCI\n\tINTERFACE_SELECT_PCIE   pcie \t= (INTERFACE_SELECT_PCIE)InterfaceSel;\n\tswitch (pcie) \n\t{\n        case INTF_SEL0_SOLO_MINICARD:       \n            board |= ODM_BOARD_MINICARD;\n            break;\n        case INTF_SEL1_BT_COMBO_MINICARD:   \n            board |= ODM_BOARD_BT;\n\t\t\tboard |= ODM_BOARD_MINICARD;\n            break;\n        default:\n            board = ODM_BOARD_DEFAULT;\n            break;\n\t}                                \n\n#elif defined(CONFIG_USB_HCI)\n\tINTERFACE_SELECT_USB    usb \t= (INTERFACE_SELECT_USB)InterfaceSel;\n\tswitch (usb) \n\t{\n\t    case INTF_SEL1_USB_High_Power:      \n\t        board |= ODM_BOARD_EXT_LNA;\n\t        board |= ODM_BOARD_EXT_PA;\t\t\t\n\t        break;\n\t    case INTF_SEL2_MINICARD:            \n\t        board |= ODM_BOARD_MINICARD;\n\t        break;\n\t    case INTF_SEL4_USB_Combo:           \n\t        board |= ODM_BOARD_BT;\n\t        break;\n\t    case INTF_SEL5_USB_Combo_MF:        \n\t        board |= ODM_BOARD_BT;\n\t        break;\n\t    case INTF_SEL0_USB: \t\t\t\n\t    case INTF_SEL3_USB_Solo:            \t\t\t\n\t    default:\n\t        board = ODM_BOARD_DEFAULT;\n\t        break;\n\t}\n\t\n#endif\t\n\t//DBG_871X(\"===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\\n\", InterfaceSel, board);\n\n\treturn board;\n}\n\nvoid Init_ODM_ComInfo(_adapter *adapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\tstruct mlme_priv\t*pmlmepriv = &adapter->mlmepriv;\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);\n\tint i;\n\n\t_rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));\n\n\tpDM_Odm->Adapter = adapter;\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);\n\n\tif (rtw_get_intf_type(adapter) == RTW_GSPI)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);\n\telse\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->VersionID));\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);\n\n\n\tif (pHalData->rf_type == RF_1T1R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);\n\telse if (pHalData->rf_type == RF_1T2R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);\n\telse if (pHalData->rf_type == RF_2T2R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);\n\telse if (pHalData->rf_type == RF_2T2R_GREEN)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R_GREEN);\n\telse if (pHalData->rf_type == RF_2T3R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T3R);\n\telse if (pHalData->rf_type == RF_2T4R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T4R);\n\telse if (pHalData->rf_type == RF_3T3R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T3R);\n\telse if (pHalData->rf_type == RF_3T4R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T4R);\n\telse if (pHalData->rf_type == RF_4T4R)\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_4T4R);\n\telse\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_XTXR);\n\t\n\n{\n\t//1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE =======\n\tu8 odm_board_type = ODM_BOARD_DEFAULT;\n\n\tif (pHalData->ExternalLNA_2G != 0) {\n\t\todm_board_type |= ODM_BOARD_EXT_LNA;\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);\n\t}\n\tif (pHalData->ExternalLNA_5G != 0) {\n\t\todm_board_type |= ODM_BOARD_EXT_LNA_5G;\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);\n\t}\n\tif (pHalData->ExternalPA_2G != 0) {\n\t\todm_board_type |= ODM_BOARD_EXT_PA;\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);\n\t}\n\tif (pHalData->ExternalPA_5G != 0) {\n\t\todm_board_type |= ODM_BOARD_EXT_PA_5G;\n\t\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);\n\t}\n\tif (pHalData->EEPROMBluetoothCoexist)\n\t\todm_board_type |= ODM_BOARD_BT;\t\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);\n\t//1 ============== End of BoardType ==============\n}\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->RFEType);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);\n\n\t/* Pointer reference */\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->CurrentBandType));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));\n\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->CurrentChannelBW));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_CHNL, &( pHalData->CurrentChannel));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));\n\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));\n\t/*Add by Yuchen for phydm beamforming*/\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));\n#ifdef CONFIG_USB_HCI\n\tODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));\n#endif\n\tfor(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t\tODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);\n\n\t/* TODO */\n\t//ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE);\n\t//ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE);\n}\n\n"
  },
  {
    "path": "hal/hal_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_DM_H__\n#define __HAL_DM_H__\n\nvoid Init_ODM_ComInfo(_adapter *adapter);\n\n#endif /* __HAL_DM_H__ */\n\n"
  },
  {
    "path": "hal/hal_hci/hal_usb.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HAL_USB_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\nint\tusb_init_recv_priv(_adapter *padapter, u16 ini_in_buf_sz)\n{\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\tint\ti, res = _SUCCESS;\n\tstruct recv_buf *precvbuf;\n\n#ifdef CONFIG_RECV_THREAD_MODE\n\t_rtw_init_sema(&precvpriv->recv_sema, 0);//will be removed\n\t_rtw_init_sema(&precvpriv->terminate_recvthread_sema, 0);//will be removed\n#endif /* CONFIG_RECV_THREAD_MODE */\n\n#ifdef PLATFORM_LINUX\n\ttasklet_init(&precvpriv->recv_tasklet,\n\t\t(void(*)(unsigned long))usb_recv_tasklet,\n\t\t(unsigned long)padapter);\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\t\n\t#ifdef CONFIG_RX_INDICATE_QUEUE\n\tTASK_INIT(&precvpriv->rx_indicate_tasklet, 0, rtw_rx_indicate_tasklet, padapter);\n\t#endif /* CONFIG_RX_INDICATE_QUEUE */\n#endif /* PLATFORM_FREEBSD */\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n#ifdef PLATFORM_LINUX\n\tprecvpriv->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);\n\tif(precvpriv->int_in_urb == NULL){\n\t\tres = _FAIL;\n\t\tDBG_8192C(\"alloc_urb for interrupt in endpoint fail !!!!\\n\");\n\t\tgoto exit;\n\t}\n#endif /* PLATFORM_LINUX */\n\tprecvpriv->int_in_buf = rtw_zmalloc(ini_in_buf_sz);\n\tif(precvpriv->int_in_buf == NULL){\n\t\tres = _FAIL;\n\t\tDBG_8192C(\"alloc_mem for interrupt in endpoint fail !!!!\\n\");\n\t\tgoto exit;\n\t}\n#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */\n\n\t/* init recv_buf */\n\t_rtw_init_queue(&precvpriv->free_recv_buf_queue);\n\t_rtw_init_queue(&precvpriv->recv_buf_pending_queue);\n\t#ifndef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t/* this is used only when RX_IOBUF is sk_buff */\n\tskb_queue_head_init(&precvpriv->free_recv_skb_queue);\n\t#endif\n\n\tDBG_871X(\"NR_RECVBUFF: %d\\n\", NR_RECVBUFF);\n\tDBG_871X(\"MAX_RECVBUF_SZ: %d\\n\", MAX_RECVBUF_SZ);\n\tprecvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4);\n\tif(precvpriv->pallocated_recv_buf==NULL){\n\t\tres= _FAIL;\n\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"alloc recv_buf fail!\\n\"));\n\t\tgoto exit;\n\t}\n\n\tprecvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(precvpriv->pallocated_recv_buf), 4);\n\n\tprecvbuf = (struct recv_buf*)precvpriv->precv_buf;\n\n\tfor(i=0; i < NR_RECVBUFF ; i++)\n\t{\n\t\t_rtw_init_listhead(&precvbuf->list);\n\n\t\t_rtw_spinlock_init(&precvbuf->recvbuf_lock);\n\n\t\tprecvbuf->alloc_sz = MAX_RECVBUF_SZ;\n\n\t\tres = rtw_os_recvbuf_resource_alloc(padapter, precvbuf);\n\t\tif(res==_FAIL)\n\t\t\tbreak;\n\n\t\tprecvbuf->ref_cnt = 0;\n\t\tprecvbuf->adapter =padapter;\n\n\t\t//rtw_list_insert_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue));\n\n\t\tprecvbuf++;\n\t}\n\n\tprecvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF;\n\n#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)\n\n\tskb_queue_head_init(&precvpriv->rx_skb_queue);\n\n#ifdef CONFIG_RX_INDICATE_QUEUE\n\tmemset(&precvpriv->rx_indicate_queue, 0, sizeof(struct ifqueue));\n\tmtx_init(&precvpriv->rx_indicate_queue.ifq_mtx, \"rx_indicate_queue\", NULL, MTX_DEF);\n#endif /* CONFIG_RX_INDICATE_QUEUE */\n\n#ifdef CONFIG_PREALLOC_RECV_SKB\n\t{\n\t\tint i;\n\t\tSIZE_PTR tmpaddr=0;\n\t\tSIZE_PTR alignment=0;\n\t\tstruct sk_buff *pskb=NULL;\n\n\t\tDBG_871X(\"NR_PREALLOC_RECV_SKB: %d\\n\", NR_PREALLOC_RECV_SKB);\n#ifdef CONFIG_FIX_NR_BULKIN_BUFFER\n\t\tDBG_871X(\"Enable CONFIG_FIX_NR_BULKIN_BUFFER\\n\");\n#endif\n\t\t\n\t\tfor(i=0; i<NR_PREALLOC_RECV_SKB; i++)\n\t\t{\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\tpskb = rtw_alloc_skb_premem(MAX_RECVBUF_SZ);\n#else\n\t\t\tpskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);\n#endif //CONFIG_PREALLOC_RX_SKB_BUFFER\n\n\t\t\tif(pskb)\n\t\t\t{\n\t\t\t\t#ifdef PLATFORM_FREEBSD\n\t\t\t\tpskb->dev = padapter->pifp;\n\t\t\t\t#else\n\t\t\t\tpskb->dev = padapter->pnetdev;\n\t\t\t\t#endif //PLATFORM_FREEBSD\n\n#ifndef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\t\ttmpaddr = (SIZE_PTR)pskb->data;\n\t\t\t\talignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\n\t\t\t\tskb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\n#endif\n\t\t\t\tskb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);\n\t\t\t}\n\t\t}\n\t}\n#endif /* CONFIG_PREALLOC_RECV_SKB */\n\n#endif /* defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD) */\n\nexit:\n\n\treturn res;\n}\n\nvoid usb_free_recv_priv (_adapter *padapter, u16 ini_in_buf_sz)\n{\n\tint i;\n\tstruct recv_buf *precvbuf;\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\n\tprecvbuf = (struct recv_buf *)precvpriv->precv_buf;\n\n\tfor(i=0; i < NR_RECVBUFF ; i++)\n\t{\n\t\trtw_os_recvbuf_resource_free(padapter, precvbuf);\n\t\tprecvbuf++;\n\t}\n\n\tif(precvpriv->pallocated_recv_buf)\n\t\trtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4);\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n#ifdef PLATFORM_LINUX\n\tif(precvpriv->int_in_urb)\n\t{\n\t\tusb_free_urb(precvpriv->int_in_urb);\n\t}\n#endif\n\tif(precvpriv->int_in_buf)\n\t\trtw_mfree(precvpriv->int_in_buf, ini_in_buf_sz);\n#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */\n\n#ifdef PLATFORM_LINUX\n\n\tif (skb_queue_len(&precvpriv->rx_skb_queue)) {\n\t\tDBG_8192C(KERN_WARNING \"rx_skb_queue not empty\\n\");\n\t}\n\n\trtw_skb_queue_purge(&precvpriv->rx_skb_queue);\n\n\tif (skb_queue_len(&precvpriv->free_recv_skb_queue)) {\n\t\tDBG_8192C(KERN_WARNING \"free_recv_skb_queue not empty, %d\\n\", skb_queue_len(&precvpriv->free_recv_skb_queue));\n\t}\n\n#if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX)\n\t#if defined(CONFIG_PREALLOC_RECV_SKB) && defined(CONFIG_PREALLOC_RX_SKB_BUFFER)\n\t{\n\t\tstruct sk_buff *skb;\n\n\t\twhile ((skb = skb_dequeue(&precvpriv->free_recv_skb_queue)) != NULL)\n\t\t{\n\t\t\tif (rtw_free_skb_premem(skb) != 0)\n\t\t\t\trtw_skb_free(skb);\n\t\t}\n\t}\n\t#else\n\trtw_skb_queue_purge(&precvpriv->free_recv_skb_queue);\n\t#endif /* defined(CONFIG_PREALLOC_RX_SKB_BUFFER) && defined(CONFIG_PREALLOC_RECV_SKB) */\n#endif /* !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) */\n\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\tstruct sk_buff  *pskb;\n\twhile (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue)))\n\t{\n\t\trtw_skb_free(pskb);\n\t}\n\n\t#if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX)\n\trtw_skb_queue_purge(&precvpriv->free_recv_skb_queue);\n\t#endif\n\n#ifdef CONFIG_RX_INDICATE_QUEUE\n\tstruct mbuf *m;\n\tfor (;;) {\n\t\tIF_DEQUEUE(&precvpriv->rx_indicate_queue, m);\n\t\tif (m == NULL)\n\t\t\tbreak;\n\t\tm_freem(m);\n\t}\n\tmtx_destroy(&precvpriv->rx_indicate_queue.ifq_mtx);\n#endif /* CONFIG_RX_INDICATE_QUEUE */\n\n#endif /* PLATFORM_FREEBSD */\n}\n\n#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ\nint usb_write_async(struct usb_device *udev, u32 addr, void *pdata, u16 len)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tint ret;\n\n\trequesttype = VENDOR_WRITE;//write_out\n\trequest = REALTEK_USB_VENQT_CMD_REQ;\n\tindex = REALTEK_USB_VENQT_CMD_IDX;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\n\tret = _usbctrl_vendorreq_async_write(udev, request, wvalue, index, pdata, len, requesttype);\n\n\treturn ret;\n}\n\nint usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)\n{\n\tu8 data;\n\tint ret;\n\tstruct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\n\tstruct usb_device *udev=pdvobjpriv->pusbdev;\n\n\t_func_enter_;\n\tdata = val;\n\tret = usb_write_async(udev, addr, &data, 1);\n\t_func_exit_;\n\n\treturn ret;\n}\n\nint usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)\n{\n\tu16 data;\n\tint ret;\n\tstruct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\n\tstruct usb_device *udev=pdvobjpriv->pusbdev;\n\n\t_func_enter_;\n\tdata = val;\n\tret = usb_write_async(udev, addr, &data, 2);\n\t_func_exit_;\n\n\treturn ret;\n}\n\nint usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)\n{\n\tu32 data;\n\tint ret;\n\tstruct dvobj_priv  *pdvobjpriv = (struct dvobj_priv  *)pintfhdl->pintf_dev;\n\tstruct usb_device *udev=pdvobjpriv->pusbdev;\n\n\t_func_enter_;\n\tdata = val;\n\tret = usb_write_async(udev, addr, &data, 4);\n\t_func_exit_;\n\t\n\treturn ret;\n}\n#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */\n\nu8 usb_read8(struct intf_hdl *pintfhdl, u32 addr)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu8 data=0;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x01;//read_in\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 1;\t\n\tusbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t&data, len, requesttype);\n\n\t_func_exit_;\n\n\treturn data;\t\n}\n\nu16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)\n{       \n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu16 data=0;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x01;//read_in\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 2;\t\n\tusbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t&data, len, requesttype);\n\n\t_func_exit_;\n\n\treturn data;\n\t\n}\n\nu32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu32 data=0;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x01;//read_in\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 4;\n\tusbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t\t&data, len, requesttype);\n\t\n\t_func_exit_;\n\n\treturn data;\n}\n\nint usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu8 data;\n\tint ret;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x00;//write_out\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 1;\n\t\n\tdata = val;\n\tret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t\t&data, len, requesttype);\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n}\n\nint usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)\n{\t\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu16 data;\n\tint ret;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x00;//write_out\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 2;\n\t\n\tdata = val;\n\tret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t\t&data, len, requesttype);\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n\nint usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu32 data;\n\tint ret;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x00;//write_out\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = 4;\n\tdata =val;\n\tret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t\t&data, len, requesttype);\n\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n\nint usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata)\n{\n\tu8 request;\n\tu8 requesttype;\n\tu16 wvalue;\n\tu16 index;\n\tu16 len;\n\tu8 buf[VENDOR_CMD_MAX_DATA_LEN]={0};\n\tint ret;\n\t\n\t_func_enter_;\n\n\trequest = 0x05;\n\trequesttype = 0x00;//write_out\n\tindex = 0;//n/a\n\n\twvalue = (u16)(addr&0x0000ffff);\n\tlen = length;\n\t _rtw_memcpy(buf, pdata, len );\n\tret = usbctrl_vendorreq(pintfhdl, request, wvalue, index,\n\t\t\t\t\t\tbuf, len, requesttype);\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n"
  },
  {
    "path": "hal/hal_intf.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#define _HAL_INTF_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\nvoid rtw_hal_chip_configure(_adapter *padapter)\n{\n\tpadapter->HalFunc.intf_chip_configure(padapter);\n}\n\nvoid rtw_hal_read_chip_info(_adapter *padapter)\n{\n\tu8 hci_type = rtw_get_intf_type(padapter);\n\tu32 start = rtw_get_current_time();\n\n\t/*  before access eFuse, make sure card enable has been called */\n\tif ((hci_type == RTW_SDIO || hci_type == RTW_GSPI)\n\t\t&& !rtw_is_hw_init_completed(padapter))\n\t\trtw_hal_power_on(padapter);\n\n\tpadapter->HalFunc.read_adapter_info(padapter);\n\n\tif ((hci_type == RTW_SDIO || hci_type == RTW_GSPI)\n\t\t&& !rtw_is_hw_init_completed(padapter))\n\t\trtw_hal_power_off(padapter);\n\n\tDBG_871X(\"%s in %d ms\\n\", __func__, rtw_get_passing_time_ms(start));\n}\n\nvoid rtw_hal_read_chip_version(_adapter *padapter)\n{\n\tpadapter->HalFunc.read_chip_version(padapter);\n}\n\nvoid rtw_hal_def_value_init(_adapter *padapter)\n{\n\tif (is_primary_adapter(padapter)) {\n\t\tpadapter->HalFunc.init_default_value(padapter);\n\n\t\trtw_init_hal_com_default_value(padapter);\n\n\t\t{\n\t\t\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\t\t\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);\n\n\t\t\t/* hal_spec is ready here */\n\t\t\tdvobj->macid_ctl.num = rtw_min(hal_spec->macid_num, MACID_NUM_SW_LIMIT);\n\n\t\t\tdvobj->cam_ctl.sec_cap = hal_spec->sec_cap;\n\t\t\tdvobj->cam_ctl.num = rtw_min(hal_spec->sec_cam_ent_num, SEC_CAM_ENT_NUM_SW_LIMIT);\n\t\t}\n\t}\n}\n\nu8 rtw_hal_data_init(_adapter *padapter)\n{\n\tif (is_primary_adapter(padapter)) {\n\t\tpadapter->hal_data_sz = sizeof(HAL_DATA_TYPE);\n\t\tpadapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);\n\t\tif(padapter->HalData == NULL){\n\t\t\tDBG_8192C(\"cant not alloc memory for HAL DATA \\n\");\n\t\t\treturn _FAIL;\n\t\t}\n\t}\n\treturn _SUCCESS;\n}\n\nvoid rtw_hal_data_deinit(_adapter *padapter)\n{\t\n\tif (is_primary_adapter(padapter)) {\n\t\tif (padapter->HalData) \n\t\t{\n\t\t\t#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\tphy_free_filebuf(padapter);\t\t\t\t\n\t\t\t#endif\n\t\t\trtw_vmfree(padapter->HalData, padapter->hal_data_sz);\n\t\t\tpadapter->HalData = NULL;\n\t\t\tpadapter->hal_data_sz = 0;\n\t\t}\t\n\t}\n}\n\nvoid\trtw_hal_free_data(_adapter *padapter)\n{\n\t//free HAL Data \t\n\trtw_hal_data_deinit(padapter);\t\n}\nvoid rtw_hal_dm_init(_adapter *padapter)\n{\n\tif (is_primary_adapter(padapter)) {\n\t\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\t\t\n\t\tpadapter->HalFunc.dm_init(padapter);\n\n\t\t_rtw_spinlock_init(&pHalData->IQKSpinLock);\n\t}\n}\nvoid rtw_hal_dm_deinit(_adapter *padapter)\n{\n\tif (is_primary_adapter(padapter)) {\n\t\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\t\t\n\n\t\tpadapter->HalFunc.dm_deinit(padapter);\n\n\t\t_rtw_spinlock_free(&pHalData->IQKSpinLock);\n\t}\n}\nvoid\trtw_hal_sw_led_init(_adapter *padapter)\n{\n\tif(padapter->HalFunc.InitSwLeds)\n\t\tpadapter->HalFunc.InitSwLeds(padapter);\n}\n\nvoid rtw_hal_sw_led_deinit(_adapter *padapter)\n{\n\tif(padapter->HalFunc.DeInitSwLeds)\n\t\tpadapter->HalFunc.DeInitSwLeds(padapter);\n}\n\nu32 rtw_hal_power_on(_adapter *padapter)\n{\t\n\treturn padapter->HalFunc.hal_power_on(padapter);\n}\nvoid rtw_hal_power_off(_adapter *padapter)\n{\t\n\tpadapter->HalFunc.hal_power_off(padapter);\t\n}\n\n\nvoid rtw_hal_init_opmode(_adapter *padapter) \n{\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax;\n\tstruct  mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tsint fw_state;\n\n\tfw_state = get_fwstate(pmlmepriv);\n\n\tif (fw_state & WIFI_ADHOC_STATE) \n\t\tnetworkType = Ndis802_11IBSS;\n\telse if (fw_state & WIFI_STATION_STATE)\n\t\tnetworkType = Ndis802_11Infrastructure;\n\telse if (fw_state & WIFI_AP_STATE)\n\t\tnetworkType = Ndis802_11APMode;\n\telse\n\t\treturn;\n\n\trtw_setopmode_cmd(padapter, networkType, _FALSE); \n}\n\nuint\t rtw_hal_init(_adapter *padapter) \n{\n\tuint\tstatus = _SUCCESS;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tint i;\n\n\tstatus = padapter->HalFunc.hal_init(padapter);\n\t\n\tif (status == _SUCCESS) {\n\t\tpHalData->hw_init_completed = _TRUE;\n\t\t\t\n\t\tif (padapter->registrypriv.notch_filter == 1)\n\t\t\trtw_hal_notch_filter(padapter, 1);\n\n\t\tfor (i = 0; i<dvobj->iface_nums; i++)\n\t\t\trtw_sec_restore_wep_key(dvobj->padapters[i]);\n\n\t\trtw_led_control(padapter, LED_CTL_POWER_ON);\n\n\t\tinit_hw_mlme_ext(padapter);\n\n                rtw_hal_init_opmode(padapter);\n\t\t\n#ifdef CONFIG_RF_GAIN_OFFSET\n\t\trtw_bb_rf_gain_offset(padapter);\n#endif //CONFIG_RF_GAIN_OFFSET\n\n\t} else {\n\t\tpHalData->hw_init_completed = _FALSE;\n\t\tDBG_871X(\"rtw_hal_init: hal__init fail\\n\");\n\t}\n\n\tRT_TRACE(_module_hal_init_c_,_drv_err_,(\"-rtl871x_hal_init:status=0x%x\\n\",status));\n\n\treturn status;\n\n}\t\n\nuint rtw_hal_deinit(_adapter *padapter)\n{\n\tuint\tstatus = _SUCCESS;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tint i;\n_func_enter_;\n\n\tstatus = padapter->HalFunc.hal_deinit(padapter);\n\n\tif(status == _SUCCESS){\n\t\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\t\tpHalData->hw_init_completed = _FALSE;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"\\n rtw_hal_deinit: hal_init fail\\n\");\n\t}\n\n_func_exit_;\n\t\n\treturn status;\n}\n\nvoid rtw_hal_set_hwreg(_adapter *padapter, u8 variable, u8 *val)\n{\n\tpadapter->HalFunc.SetHwRegHandler(padapter, variable, val);\n}\n\nvoid rtw_hal_get_hwreg(_adapter *padapter, u8 variable, u8 *val)\n{\n\tpadapter->HalFunc.GetHwRegHandler(padapter, variable, val);\n}\n\n#ifdef CONFIG_C2H_PACKET_EN\nvoid rtw_hal_set_hwreg_with_buf(_adapter *padapter, u8 variable, u8 *pbuf, int len)\n{\n\tif (padapter->HalFunc.SetHwRegHandlerWithBuf)\n\t\tpadapter->HalFunc.SetHwRegHandlerWithBuf(padapter, variable, pbuf, len);\n}\n#endif\n\nu8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)\n{\t\n\treturn padapter->HalFunc.SetHalDefVarHandler(padapter,eVariable,pValue);\n}\nu8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)\n{\t\n\treturn padapter->HalFunc.GetHalDefVarHandler(padapter,eVariable,pValue);\t\t\n}\t\n\nvoid rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet)\n{\n\tpadapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet);\n}\nvoid\trtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2)\n{\n\tpadapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2);\n}\n\n/* FOR SDIO & PCIE */\nvoid rtw_hal_enable_interrupt(_adapter *padapter)\n{\n#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n\tpadapter->HalFunc.enable_interrupt(padapter);\t\n#endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n}\n\n/* FOR SDIO & PCIE */\nvoid rtw_hal_disable_interrupt(_adapter *padapter)\n{\n#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n\tpadapter->HalFunc.disable_interrupt(padapter);\n#endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n}\n\n\nu8 rtw_hal_check_ips_status(_adapter *padapter)\n{\n\tu8 val = _FALSE;\n\tif (padapter->HalFunc.check_ips_status)\n\t\tval = padapter->HalFunc.check_ips_status(padapter);\n\telse \n\t\tDBG_871X(\"%s: HalFunc.check_ips_status is NULL!\\n\", __FUNCTION__);\n\t\n\treturn val;\n}\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid rtw_hal_clear_interrupt(_adapter *padapter)\n{  \n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tpadapter->HalFunc.clear_interrupt(padapter);\n#endif\n}\nvoid rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep)\n{\n\tpadapter->HalFunc.hal_set_wowlan_fw(padapter, sleep);\n}\n\n#endif\n\n#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)\nu32\trtw_hal_inirp_init(_adapter *padapter)\n{\n\tif (is_primary_adapter(padapter)) \t\t\n\t\treturn padapter->HalFunc.inirp_init(padapter);\t\n\t return _SUCCESS;\n}\nu32\trtw_hal_inirp_deinit(_adapter *padapter)\n{\n\n\tif (is_primary_adapter(padapter)) \t\n\t\treturn padapter->HalFunc.inirp_deinit(padapter);\n\n\treturn _SUCCESS;\n}\n#endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)\n\n#if defined(CONFIG_PCI_HCI)\nvoid\trtw_hal_irp_reset(_adapter *padapter)\n{\n\tpadapter->HalFunc.irp_reset(padapter);\n}\n#endif //#if defined(CONFIG_PCI_HCI)\n\n/* for USB Auto-suspend */\nu8\trtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val)\n{\t\n\tif(padapter->HalFunc.interface_ps_func)\t\n\t\treturn padapter->HalFunc.interface_ps_func(padapter,efunc_id,val);\n\treturn _FAIL;\n}\n\ns32\trtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\treturn padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe);\n}\n\ns32\trtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\treturn padapter->HalFunc.hal_xmit(padapter, pxmitframe);\n}\n\n/*\n * [IMPORTANT] This function would be run in interrupt context.\n */\ns32\trtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)\n{\n\ts32 ret = _FAIL;\n\tu8\t*pframe, subtype;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct sta_info\t*psta;\n\tstruct sta_priv\t\t*pstapriv = &padapter->stapriv;\n\t\n\tupdate_mgntframe_attrib_addr(padapter, pmgntframe);\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tsubtype = GetFrameSubType(pframe); /* bit(7)~bit(2) */\n\t\n\t//pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\t//_rtw_memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN);\n\n#ifdef CONFIG_IEEE80211W\n\tif (padapter->securitypriv.binstallBIPkey == _TRUE && (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||\n\t\t\tsubtype == WIFI_ACTION))\n\t{\n\t\tif (IS_MCAST(pmgntframe->attrib.ra) && pmgntframe->attrib.key_type != IEEE80211W_NO_KEY) {\n\t\t\tpmgntframe->attrib.encrypt = _BIP_;\n\t\t\t/* pmgntframe->attrib.bswenc = _TRUE; */\n\t\t} else if (pmgntframe->attrib.key_type != IEEE80211W_NO_KEY) {\n\t\t\tpsta = rtw_get_stainfo(pstapriv, pmgntframe->attrib.ra);\n\t\t\tif (psta && psta->bpairwise_key_installed == _TRUE) {\n\t\t\t\tpmgntframe->attrib.encrypt = _AES_;\n\t\t\t\tpmgntframe->attrib.bswenc = _TRUE;\n\t\t\t} else {\n\t\t\t\tDBG_871X(\"%s, %d, bpairwise_key_installed is FALSE\\n\", __func__, __LINE__);\n\t\t\t\tgoto no_mgmt_coalesce;\n\t\t\t}\n\t\t}\n\t\tDBG_871X(\"encrypt=%d, bswenc=%d\\n\", pmgntframe->attrib.encrypt, pmgntframe->attrib.bswenc);\n\t\trtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);\n\t}\n#endif //CONFIG_IEEE80211W\nno_mgmt_coalesce:\n\tret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe);\n\treturn ret;\n}\n\ns32\trtw_hal_init_xmit_priv(_adapter *padapter)\n{\t\n\treturn padapter->HalFunc.init_xmit_priv(padapter);\t\n}\nvoid\trtw_hal_free_xmit_priv(_adapter *padapter)\n{\n\tpadapter->HalFunc.free_xmit_priv(padapter);\n}\n\ns32\trtw_hal_init_recv_priv(_adapter *padapter)\n{\t\n\treturn padapter->HalFunc.init_recv_priv(padapter);\n}\nvoid\trtw_hal_free_recv_priv(_adapter *padapter)\n{\n\tpadapter->HalFunc.free_recv_priv(padapter);\n}\n\nvoid rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level)\n{\n\t_adapter *padapter;\n\tstruct mlme_priv *pmlmepriv;\n\n\tif(!psta)\n\t\treturn;\n\n\tpadapter = psta->padapter;\n\n\tpmlmepriv = &(padapter->mlmepriv);\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\tadd_RATid(padapter, psta, rssi_level);\n\t}\n\telse\n\t{\n\t\tpadapter->HalFunc.UpdateRAMaskHandler(padapter, psta->mac_id, rssi_level);\n\t}\n}\n\nvoid\trtw_hal_add_ra_tid(_adapter *padapter, u64 bitmap, u8 *arg, u8 rssi_level)\n{\n\tpadapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level);\n}\n\n/*\tStart specifical interface thread\t\t*/\nvoid\trtw_hal_start_thread(_adapter *padapter)\n{\n#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n#ifndef CONFIG_SDIO_TX_TASKLET\t\n\tpadapter->HalFunc.run_thread(padapter);\t\n#endif\n#endif\n}\n/*\tStart specifical interface thread\t\t*/\nvoid\trtw_hal_stop_thread(_adapter *padapter)\n{\n#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n#ifndef CONFIG_SDIO_TX_TASKLET\n\t\n\tpadapter->HalFunc.cancel_thread(padapter);\n\t\n#endif\n#endif\t\n}\n\nu32\trtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask)\n{\n\tu32 data = 0;\n\tif(padapter->HalFunc.read_bbreg)\n\t\t data = padapter->HalFunc.read_bbreg(padapter, RegAddr, BitMask);\n\treturn data;\n}\nvoid\trtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)\n{\n\tif(padapter->HalFunc.write_bbreg)\n\t\tpadapter->HalFunc.write_bbreg(padapter, RegAddr, BitMask, Data);\n}\n\nu32 rtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask)\n{\n\tu32 data = 0;\n\n\tif (padapter->HalFunc.read_rfreg) {\n\t\tdata = padapter->HalFunc.read_rfreg(padapter, eRFPath, RegAddr, BitMask);\n\n\t\tif (match_rf_read_sniff_ranges(eRFPath, RegAddr, BitMask)) {\n\t\t\tDBG_871X(\"DBG_IO rtw_hal_read_rfreg(%u, 0x%04x, 0x%08x) read:0x%08x(0x%08x)\\n\"\n\t\t\t\t, eRFPath, RegAddr, BitMask, (data << PHY_CalculateBitShift(BitMask)), data);\n\t\t}\n\t}\n\n\treturn data;\n}\n\nvoid rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)\n{\n\tif (padapter->HalFunc.write_rfreg) {\n\n\t\tif (match_rf_write_sniff_ranges(eRFPath, RegAddr, BitMask)) {\n\t\t\tDBG_871X(\"DBG_IO rtw_hal_write_rfreg(%u, 0x%04x, 0x%08x) write:0x%08x(0x%08x)\\n\"\n\t\t\t\t, eRFPath, RegAddr, BitMask, (Data << PHY_CalculateBitShift(BitMask)), Data);\n\t\t}\n\n\t\tpadapter->HalFunc.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data);\n\n#ifdef CONFIG_PCI_HCI\n\t\tif (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(padapter)) /*For N-Series IC, suggest by Jenyu*/\n\t\t\trtw_udelay_os(2);\n#endif\n\t}\n}\n\n#if defined(CONFIG_PCI_HCI)\ns32\trtw_hal_interrupt_handler(_adapter *padapter)\n{\n\ts32 ret = _FAIL;\n\tret = padapter->HalFunc.interrupt_handler(padapter);\n\treturn ret;\n}\n#endif\n#if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)\nvoid\trtw_hal_interrupt_handler(_adapter *padapter, u16 pkt_len, u8 *pbuf)\n{\n\tpadapter->HalFunc.interrupt_handler(padapter, pkt_len, pbuf);\n}\n#endif\n\nvoid\trtw_hal_set_bwmode(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\t\n\tODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tif(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s, %d, IQK may race condition\\n\", __func__,__LINE__);\n\tODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tpadapter->HalFunc.set_bwmode_handler(padapter, Bandwidth, Offset);\n\t\n}\n\nvoid\trtw_hal_set_chan(_adapter *padapter, u8 channel)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\t\n\tODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tif(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s, %d, IQK may race condition\\n\", __func__,__LINE__);\n\tODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tpadapter->HalFunc.set_channel_handler(padapter, channel);\t\n}\n\nvoid\trtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\t\n\tODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tif(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)\n\t\tDBG_871X_LEVEL(_drv_err_, \"%s, %d, IQK may race condition\\n\", __func__,__LINE__);\n\tODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);\n\tpadapter->HalFunc.set_chnl_bw_handler(padapter, channel, Bandwidth, Offset40, Offset80);\t\n}\n\nvoid\trtw_hal_set_tx_power_level(_adapter *padapter, u8 channel)\n{\n\tif(padapter->HalFunc.set_tx_power_level_handler)\n\t\tpadapter->HalFunc.set_tx_power_level_handler(padapter, channel);\n}\n\nvoid\trtw_hal_get_tx_power_level(_adapter *padapter, s32 *powerlevel)\n{\n\tif(padapter->HalFunc.get_tx_power_level_handler)\n\t\tpadapter->HalFunc.get_tx_power_level_handler(padapter, powerlevel);\n}\n\nvoid\trtw_hal_dm_watchdog(_adapter *padapter)\n{\n\tif (!is_primary_adapter(padapter))\n\t\treturn;\n\n\tpadapter->HalFunc.hal_dm_watchdog(padapter);\n\t\n}\n\n#ifdef CONFIG_LPS_LCLK_WD_TIMER\nvoid\trtw_hal_dm_watchdog_in_lps(_adapter *padapter)\n{\n#if defined(CONFIG_CONCURRENT_MODE)\n\tif (padapter->iface_type != IFACE_PORT0)\n\t\treturn;\n#endif\t\n\n\tif (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE ) {\n\t\tpadapter->HalFunc.hal_dm_watchdog_in_lps(padapter);//this fuction caller is in interrupt context\t\t\t\t \t\n\t}\n}\n#endif\n\nvoid rtw_hal_bcn_related_reg_setting(_adapter *padapter)\n{\t\n\tpadapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter);\t\n}\n\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nu8\trtw_hal_antdiv_before_linked(_adapter *padapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tint i;\n\n\tif (!padapter->HalFunc.AntDivBeforeLinkHandler)\n\t\treturn _FALSE;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tif (rtw_linked_check(dvobj->padapters[i]))\n\t\t\treturn _FALSE;\n\t}\n\n\treturn padapter->HalFunc.AntDivBeforeLinkHandler(padapter);\n}\nvoid\trtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)\n{\n\tif(padapter->HalFunc.AntDivCompareHandler)\n\t\tpadapter->HalFunc.AntDivCompareHandler(padapter, dst, src);\n}\n#endif\n\n#ifdef CONFIG_HOSTAPD_MLME\ns32\trtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)\n{\n\tif(padapter->HalFunc.hostap_mgnt_xmit_entry)\n\t\treturn padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, pkt);\n\treturn _FAIL;\n}\n#endif //CONFIG_HOSTAPD_MLME\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nvoid\trtw_hal_sreset_init(_adapter *padapter)\n{\n\tpadapter->HalFunc.sreset_init_value(padapter); \n}\nvoid rtw_hal_sreset_reset(_adapter *padapter)\n{\n\tpadapter = GET_PRIMARY_ADAPTER(padapter);\n\tpadapter->HalFunc.silentreset(padapter);\n}\n\nvoid rtw_hal_sreset_reset_value(_adapter *padapter)\n{\n\tpadapter->HalFunc.sreset_reset_value(padapter);\n}\n\nvoid rtw_hal_sreset_xmit_status_check(_adapter *padapter)\n{\n\tif (!is_primary_adapter(padapter))\n\t\treturn;\n\n\tpadapter->HalFunc.sreset_xmit_status_check(padapter);\t\t\n}\nvoid rtw_hal_sreset_linked_status_check(_adapter *padapter)\n{\n\tif (!is_primary_adapter(padapter))\n\t\treturn;\n\tpadapter->HalFunc.sreset_linked_status_check(padapter);\t\n}\nu8   rtw_hal_sreset_get_wifi_status(_adapter *padapter)\n{\t\n\treturn padapter->HalFunc.sreset_get_wifi_status(padapter);\n}\n\nbool rtw_hal_sreset_inprogress(_adapter *padapter)\n{\n\tpadapter = GET_PRIMARY_ADAPTER(padapter);\n\treturn padapter->HalFunc.sreset_inprogress(padapter);\n}\n#endif\t//DBG_CONFIG_ERROR_DETECT\n\n#ifdef CONFIG_IOL\nint rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt)\n{\n\tif(adapter->HalFunc.IOL_exec_cmds_sync)\n\t\treturn adapter->HalFunc.IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms,bndy_cnt);\n\treturn _FAIL;\n}\n#endif\n\n#ifdef CONFIG_XMIT_THREAD_MODE\ns32 rtw_hal_xmit_thread_handler(_adapter *padapter)\n{\t\n\treturn padapter->HalFunc.xmit_thread_handler(padapter);\n}\n#endif\n\nvoid rtw_hal_notch_filter(_adapter *adapter, bool enable)\n{\n\tif(adapter->HalFunc.hal_notch_filter)\n\t\tadapter->HalFunc.hal_notch_filter(adapter,enable);\t\t\n}\n\nbool rtw_hal_c2h_valid(_adapter *adapter, u8 *buf)\n{\n\tHAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);\n\tHAL_VERSION *hal_ver = &HalData->VersionID;\n\tbool ret = _FAIL;\n\n\tif (IS_8188E(*hal_ver)) {\n\t\tret = c2h_evt_valid((struct c2h_evt_hdr *)buf);\n\t} else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) {\n\t\tret = c2h_evt_valid((struct c2h_evt_hdr_88xx*)buf);\n\t} else {\n\t\trtw_warn_on(1);\n\t}\n\n\treturn ret;\n}\n\ns32 rtw_hal_c2h_evt_read(_adapter *adapter, u8 *buf)\n{\n\tHAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);\n\tHAL_VERSION *hal_ver = &HalData->VersionID;\n\ts32 ret = _FAIL;\n\n\tif (IS_8188E(*hal_ver)) {\n\t\tret = c2h_evt_read(adapter, buf);\n\t} else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) {\n\t\tret = c2h_evt_read_88xx(adapter, buf);\n\t} else {\n\t\trtw_warn_on(1);\n\t}\n\n\treturn ret;\n}\n\ns32 rtw_hal_c2h_handler(_adapter *adapter, u8 *c2h_evt)\n{\n\ts32 ret = _FAIL;\n\tif (adapter->HalFunc.c2h_handler)\n\t\tret = adapter->HalFunc.c2h_handler(adapter, c2h_evt);\n\treturn ret;\n}\n\nc2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter)\n{\t\n\treturn adapter->HalFunc.c2h_id_filter_ccx;\n}\n\ns32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter)\n{\n\treturn GET_HAL_DATA(padapter)->bDisableSWChannelPlan;\n}\n\ns32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tu8 support;\n\n\tsupport = _FALSE;\n\trtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);\n\tif (_FALSE == support)\n\t\treturn _FAIL;\n\n\tif (macid >= macid_ctl->num) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\": Invalid macid(%u)\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), macid);\n\t\treturn _FAIL;\n\t}\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, &macid);\n\n\treturn _SUCCESS;\n}\n\ns32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tu8 support;\n\n\tsupport = _FALSE;\n\trtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);\n\tif (_FALSE == support)\n\t\treturn _FAIL;\n\n\tif (macid >= macid_ctl->num) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\": Invalid macid(%u)\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), macid);\n\t\treturn _FAIL;\n\t}\n\n\trtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid);\n\n\treturn _SUCCESS;\n}\n\ns32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)\n{\n\t_adapter *pri_adapter = GET_PRIMARY_ADAPTER(padapter);\n\n\tif (pri_adapter->bFWReady == _TRUE)\n\t\treturn padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer);\n\telse if (padapter->registrypriv.mp_mode == 0)\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" FW doesn't exit when no MP mode, by pass H2C id:0x%02x\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), ElementID);\n\treturn _FAIL;\n}\n\nvoid rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,\n\t\tu8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)\n{\n\tpadapter->HalFunc.fill_fake_txdesc(padapter, pDesc, BufferLen,IsPsPoll, IsBTQosNull, bDataFrame);\n\n}\nu8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan)\n{\n\treturn adapter->HalFunc.hal_get_tx_buff_rsvd_page_num(adapter, wowlan);\n}\n\n#ifdef CONFIG_GPIO_API\nvoid rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag)\n{\n\tif (padapter->HalFunc.update_hisr_hsisr_ind)\n\t\tpadapter->HalFunc.update_hisr_hsisr_ind(padapter, flag);\n}\n#endif\n\nvoid rtw_hal_fw_correct_bcn(_adapter *padapter)\n{\n\tif (padapter->HalFunc.fw_correct_bcn)\n\t\tpadapter->HalFunc.fw_correct_bcn(padapter);\n}\n\n#define rtw_hal_error_msg(ops_fun)\t\t\\\n\tDBG_871X_LEVEL(_drv_always_, \"### %s - Error : Please hook HalFunc.%s ###\\n\",__FUNCTION__,ops_fun)\n\nu8 rtw_hal_ops_check(_adapter *padapter)\n{\t\n\tu8 ret = _SUCCESS;\n#if 1\n\t/*** initialize section ***/\n\tif (NULL == padapter->HalFunc.read_chip_version) {\n\t\trtw_hal_error_msg(\"read_chip_version\");\n\t\tret = _FAIL;\n\t}\t\n\tif (NULL == padapter->HalFunc.init_default_value) {\n\t\trtw_hal_error_msg(\"init_default_value\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.intf_chip_configure) {\n\t\trtw_hal_error_msg(\"intf_chip_configure\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.read_adapter_info) {\n\t\trtw_hal_error_msg(\"read_adapter_info\");\n\t\tret = _FAIL;\n\t}\n\n\tif (NULL == padapter->HalFunc.hal_power_on) {\t\t\n\t\trtw_hal_error_msg(\"hal_power_on\");\n\t\tret = _FAIL;\n\t}\t\n\tif (NULL == padapter->HalFunc.hal_power_off) {\n\t\trtw_hal_error_msg(\"hal_power_off\");\n\t\tret = _FAIL;\n\t}\n\t\n\tif (NULL == padapter->HalFunc.hal_init) {\n\t\trtw_hal_error_msg(\"hal_init\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.hal_deinit) {\n\t\trtw_hal_error_msg(\"hal_deinit\");\n\t\tret = _FAIL;\n\t}\n\t\n\t/*** xmit section ***/\n\tif (NULL == padapter->HalFunc.init_xmit_priv) {\n\t\trtw_hal_error_msg(\"init_xmit_priv\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.free_xmit_priv) {\n\t\trtw_hal_error_msg(\"free_xmit_priv\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.hal_xmit) {\n\t\trtw_hal_error_msg(\"hal_xmit\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.mgnt_xmit) {\n\t\trtw_hal_error_msg(\"mgnt_xmit\");\n\t\tret = _FAIL;\n\t}\n\t#ifdef CONFIG_XMIT_THREAD_MODE\n\tif (NULL == padapter->HalFunc.xmit_thread_handler) {\n\t\trtw_hal_error_msg(\"xmit_thread_handler\");\n\t\tret = _FAIL;\n\t}\n\t#endif\n\tif (NULL == padapter->HalFunc.hal_xmitframe_enqueue) {\n\t\trtw_hal_error_msg(\"hal_xmitframe_enqueue\");\n\t\tret = _FAIL;\n\t}\n\t#if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n\t#ifndef CONFIG_SDIO_TX_TASKLET\n\tif (NULL == padapter->HalFunc.run_thread) {\n\t\trtw_hal_error_msg(\"run_thread\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.cancel_thread) {\n\t\trtw_hal_error_msg(\"cancel_thread\");\n\t\tret = _FAIL;\n\t}\n\t#endif\n\t#endif\n\t\n\t/*** recv section ***/\n\tif (NULL == padapter->HalFunc.init_recv_priv) {\n\t\trtw_hal_error_msg(\"init_recv_priv\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.free_recv_priv) {\n\t\trtw_hal_error_msg(\"free_recv_priv\");\n\t\tret = _FAIL;\n\t}\n\t#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)\n\tif (NULL == padapter->HalFunc.inirp_init) {\n\t\trtw_hal_error_msg(\"inirp_init\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.inirp_deinit) {\n\t\trtw_hal_error_msg(\"inirp_deinit\");\n\t\tret = _FAIL;\n\t}\n\t#endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)\n\t\n\t\n\t/*** interrupt hdl section ***/\n\t#if defined(CONFIG_PCI_HCI)\n\tif (NULL == padapter->HalFunc.irp_reset) {\n\t\trtw_hal_error_msg(\"irp_reset\");\n\t\tret = _FAIL;\n\t}\n\t#endif/*#if defined(CONFIG_PCI_HCI)*/\n\t#if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))\n\tif (NULL == padapter->HalFunc.interrupt_handler) {\n\t\trtw_hal_error_msg(\"interrupt_handler\");\n\t\tret = _FAIL;\n\t}\n\t#endif /*#if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))*/\n\n\t#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\t\n\tif (NULL == padapter->HalFunc.enable_interrupt) {\n\t\trtw_hal_error_msg(\"enable_interrupt\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.disable_interrupt) {\n\t\trtw_hal_error_msg(\"disable_interrupt\");\n\t\tret = _FAIL;\n\t}\n\t#endif //defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)\n\t\t\n\t\n\t/*** DM section ***/\n\tif (NULL == padapter->HalFunc.dm_init) {\n\t\trtw_hal_error_msg(\"dm_init\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.dm_deinit) {\n\t\trtw_hal_error_msg(\"dm_deinit\");\n\t\tret = _FAIL;\n\t}\t\n\tif (NULL == padapter->HalFunc.hal_dm_watchdog) {\n\t\trtw_hal_error_msg(\"hal_dm_watchdog\");\n\t\tret = _FAIL;\n\t}\n\t#ifdef CONFIG_LPS_LCLK_WD_TIMER\n\tif (NULL == padapter->HalFunc.hal_dm_watchdog_in_lps) {\n\t\trtw_hal_error_msg(\"hal_dm_watchdog_in_lps\");\n\t\tret = _FAIL;\n\t}\n\t#endif\n\n\t/*** xxx section ***/\n\tif (NULL == padapter->HalFunc.set_bwmode_handler) {\n\t\trtw_hal_error_msg(\"set_bwmode_handler\");\n\t\tret = _FAIL;\n\t}\n\n\tif (NULL == padapter->HalFunc.set_channel_handler) {\n\t\trtw_hal_error_msg(\"set_channel_handler\");\n\t\tret = _FAIL;\n\t}\n\n\tif (NULL == padapter->HalFunc.set_chnl_bw_handler) {\n\t\trtw_hal_error_msg(\"set_chnl_bw_handler\");\n\t\tret = _FAIL;\n\t}\t\n\t\n\tif (NULL == padapter->HalFunc.SetHwRegHandler) {\n\t\trtw_hal_error_msg(\"SetHwRegHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.GetHwRegHandler) {\n\t\trtw_hal_error_msg(\"GetHwRegHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.GetHalDefVarHandler) {\n\t\trtw_hal_error_msg(\"GetHalDefVarHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.SetHalDefVarHandler) {\n\t\trtw_hal_error_msg(\"SetHalDefVarHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.GetHalODMVarHandler) {\n\t\trtw_hal_error_msg(\"GetHalODMVarHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.SetHalODMVarHandler) {\n\t\trtw_hal_error_msg(\"SetHalODMVarHandler\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.UpdateRAMaskHandler) {\n\t\trtw_hal_error_msg(\"UpdateRAMaskHandler\");\n\t\tret = _FAIL;\n\t}\n\t\n\tif (NULL == padapter->HalFunc.SetBeaconRelatedRegistersHandler) {\n\t\trtw_hal_error_msg(\"SetBeaconRelatedRegistersHandler\");\n\t\tret = _FAIL;\n\t}\n\n\tif (NULL == padapter->HalFunc.Add_RateATid) {\n\t\trtw_hal_error_msg(\"Add_RateATid\");\n\t\tret = _FAIL;\n\t}\t\n\n\tif (NULL == padapter->HalFunc.fill_h2c_cmd) {\n\t\trtw_hal_error_msg(\"fill_h2c_cmd\");\n\t\tret = _FAIL;\n\t}\n\t#if defined(CONFIG_LPS) || defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\tif (NULL == padapter->HalFunc.fill_fake_txdesc) {\n\t\trtw_hal_error_msg(\"fill_fake_txdesc\");\n\t\tret = _FAIL;\n\t}\n\t#endif\n\tif (NULL == padapter->HalFunc.hal_get_tx_buff_rsvd_page_num) {\n\t\trtw_hal_error_msg(\"hal_get_tx_buff_rsvd_page_num\");\n\t\tret = _FAIL;\n\t}\n\n\t#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\t#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tif (NULL == padapter->HalFunc.clear_interrupt) {\n\t\trtw_hal_error_msg(\"clear_interrupt\");\n\t\tret = _FAIL;\n\t}\n\t#endif\n\tif (NULL == padapter->HalFunc.hal_set_wowlan_fw) {\n\t\trtw_hal_error_msg(\"hal_set_wowlan_fw\");\n\t\tret = _FAIL;\n\t}\n\t#endif //CONFIG_WOWLAN\n\tif ((IS_HARDWARE_TYPE_8814A(padapter)\n\t\t|| IS_HARDWARE_TYPE_8822BU(padapter) || IS_HARDWARE_TYPE_8822BS(padapter))\n\t\t&& NULL == padapter->HalFunc.fw_correct_bcn) {\n\t\trtw_hal_error_msg(\"fw_correct_bcn\");\n\t\tret = _FAIL;\n\t}\n\t\n\t\n\t/*** SReset section ***/\n\t#ifdef DBG_CONFIG_ERROR_DETECT\t\t\n\tif (NULL == padapter->HalFunc.sreset_init_value) {\n\t\trtw_hal_error_msg(\"sreset_init_value\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.sreset_reset_value) {\n\t\trtw_hal_error_msg(\"sreset_reset_value\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.silentreset) {\n\t\trtw_hal_error_msg(\"silentreset\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.sreset_xmit_status_check) {\n\t\trtw_hal_error_msg(\"sreset_xmit_status_check\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.sreset_linked_status_check) {\n\t\trtw_hal_error_msg(\"sreset_linked_status_check\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.sreset_get_wifi_status) {\n\t\trtw_hal_error_msg(\"sreset_get_wifi_status\");\n\t\tret = _FAIL;\n\t}\n\tif (NULL == padapter->HalFunc.sreset_inprogress) {\n\t\trtw_hal_error_msg(\"sreset_inprogress\");\n\t\tret = _FAIL;\n\t}\n\t#endif  //#ifdef DBG_CONFIG_ERROR_DETECT\n\n#endif\n\treturn  ret;\n}\n\n"
  },
  {
    "path": "hal/hal_mp.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HAL_MP_C_\n#ifdef CONFIG_MP_INCLUDED\n\n#ifdef CONFIG_RTL8188E\n#include <rtl8188e_hal.h>\n#endif\n#ifdef CONFIG_RTL8723B\n#include <rtl8723b_hal.h>\n#endif\n#ifdef CONFIG_RTL8192E\n#include <rtl8192e_hal.h>\n#endif\n#ifdef CONFIG_RTL8814A\n#include <rtl8814a_hal.h>\n#endif\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n#include <rtl8812a_hal.h>\n#endif\n#ifdef CONFIG_RTL8703B\n#include <rtl8703b_hal.h>\n#endif\n#ifdef CONFIG_RTL8188F\n#include <rtl8188f_hal.h>\n#endif\n\n\nu8 MgntQuery_NssTxRate(u16 Rate)\n{\n\tu8\tNssNum = RF_TX_NUM_NONIMPLEMENT;\n\t\n\tif ((Rate >= MGN_MCS8 && Rate <= MGN_MCS15) || \n\t\t (Rate >= MGN_VHT2SS_MCS0 && Rate <= MGN_VHT2SS_MCS9))\n\t\tNssNum = RF_2TX;\n\telse if ((Rate >= MGN_MCS16 && Rate <= MGN_MCS23) || \n\t\t (Rate >= MGN_VHT3SS_MCS0 && Rate <= MGN_VHT3SS_MCS9))\n\t\tNssNum = RF_3TX;\n\telse if ((Rate >= MGN_MCS24 && Rate <= MGN_MCS31) || \n\t\t (Rate >= MGN_VHT4SS_MCS0 && Rate <= MGN_VHT4SS_MCS9))\n\t\tNssNum = RF_4TX;\n\telse\n\t\tNssNum = RF_1TX;\n\t\t\n\treturn NssNum;\n}\n\nvoid hal_mpt_SwitchRfSetting(PADAPTER\tpAdapter)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu8\t\t\t\tChannelToSw = pMptCtx->MptChannelToSw;\n\tULONG\t\t\t\tulRateIdx = pMptCtx->MptRateIndex;\n\tULONG\t\t\t\tulbandwidth = pMptCtx->MptBandWidth;\n\t\n\t/* <20120525, Kordan> Dynamic mechanism for APK, asked by Dennis.*/\n\tif (IS_HARDWARE_TYPE_8188ES(pAdapter) && (1 <= ChannelToSw && ChannelToSw <= 11) &&\n\t\t(ulRateIdx == MPT_RATE_MCS0 || ulRateIdx == MPT_RATE_1M || ulRateIdx == MPT_RATE_6M)) {\n\t\tpMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0);\n\t\tpMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0);\n\t\t\n\t\tif ((PlatformEFIORead4Byte(pAdapter, 0xF4)&BIT29) == BIT29) {\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0, 0xB);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0, 0xB);\n\t\t} else {\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0, 0xD);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0, 0xD);\n\t\t}\n\t} else if (IS_HARDWARE_TYPE_8188EE(pAdapter)) { /* <20140903, VincentL> Asked by RF Eason and Edlu*/\n\t\n\t\tif (ChannelToSw == 3 && ulbandwidth == MPT_BW_40MHZ) {\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0, 0xB); /*RF 0x52 = 0x0007E4BD*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0, 0xB); /*RF 0x52 = 0x0007E4BD*/\n\t\t} else {\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0, 0x9); /*RF 0x52 = 0x0007E49D*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0, 0x9); /*RF 0x52 = 0x0007E49D*/\n\t\t}\n\t\t\n\t} else if (IS_HARDWARE_TYPE_8188E(pAdapter)) {\n\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_0x52, 0x000F0, pMptCtx->backup0x52_RF_A);\n\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_0x52, 0x000F0, pMptCtx->backup0x52_RF_B);\n\t}\n}\n\ns32 hal_mpt_SetPowerTracking(PADAPTER padapter, u8 enable)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\n\n\tif (!netif_running(padapter->pnetdev)) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"SetPowerTracking! Fail: interface not opened!\\n\"));\n\t\treturn _FAIL;\n\t}\n\n\tif (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"SetPowerTracking! Fail: not in MP mode!\\n\"));\n\t\treturn _FAIL;\n\t}\n\tif (enable)\n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;\t\n\telse\n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;\n\n\treturn _SUCCESS;\n}\n\nvoid hal_mpt_GetPowerTracking(PADAPTER padapter, u8 *enable)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\n\n\t*enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl;\n}\n\n\nvoid hal_mpt_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)\n{\n\tu32\t\tTempVal = 0, TempVal2 = 0, TempVal3 = 0;\n\tu32\t\tCurrCCKSwingVal = 0, CCKSwingIndex = 12;\n\tu8\t\ti;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\tPMPT_CONTEXT\t\tpMptCtx = &(Adapter->mppriv.MptCtx);\n\tu1Byte\t\t\t\tu1Channel = pHalData->CurrentChannel;\n\tULONG\t\t\t\tulRateIdx = pMptCtx->MptRateIndex;\n\tu1Byte\t\t\t\tDataRate = 0xFF;\n\n\tDataRate = MptToMgntRate(ulRateIdx);\n\t\n\tif (u1Channel == 14 && IS_CCK_RATE(DataRate))\n\t\tpHalData->bCCKinCH14 = TRUE;\n\telse\n\t\tpHalData->bCCKinCH14 = FALSE;\t\n\n\tif (IS_HARDWARE_TYPE_8703B(Adapter)) {\n\t\t\tif ((u1Channel == 14) && IS_CCK_RATE(DataRate)) {\n\t\t\t\t/* Channel 14 in CCK, need to set 0xA26~0xA29 to 0 for 8703B */ \n\t\t\t\tPHY_SetBBReg(Adapter, rCCK0_TxFilter2, bMaskHWord, 0);\n\t\t\t\tPHY_SetBBReg(Adapter, rCCK0_DebugPort, bMaskLWord, 0);\n\n\t\t\t\tRT_TRACE(_module_mp_, DBG_LOUD, (\"MPT_CCKTxPowerAdjust 8703B CCK in Channel %u\\n\", u1Channel));\n\t\t\t} else {\n\t\t\t\t/* Normal setting for 8703B, just recover to the default setting. */\n\t\t\t\t/* This hardcore values reference from the parameter which BB team gave. */\n\t\t\t\tfor (i = 0 ; i < 2 ; ++i)\n\t\t\t\t\tPHY_SetBBReg(Adapter, pHalData->RegForRecover[i].offset, bMaskDWord, pHalData->RegForRecover[i].value);\n\n\t\t\t\tRT_TRACE(_module_mp_, DBG_LOUD, (\"MPT_CCKTxPowerAdjust 8703B in Channel %u restore to default setting\\n\", u1Channel));\n\t\t\t}\n\t} else if (IS_HARDWARE_TYPE_8188F(Adapter)) {\n\t\t/* No difference between CCK in CH14 and others, no need to change TX filter */\n\t} else {\n\n\t\t/* get current cck swing value and check 0xa22 & 0xa23 later to match the table.*/\n\t\tCurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord);\n\n\t\tif (!pHalData->bCCKinCH14) {\n\t\t\t/* Readback the current bb cck swing value and compare with the table to */\n\t\t\t/* get the current swing index */\n\t\t\tfor (i = 0; i < CCK_TABLE_SIZE; i++) {\n\t\t\t\tif (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) &&\n\t\t\t\t\t(((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1])) {\n\t\t\t\t\tCCKSwingIndex = i;\n\t\t\t\t\tRT_TRACE(_module_mp_, DBG_LOUD, (\"Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\\n\",\n\t\t\t\t\t\t(rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t/*Write 0xa22 0xa23*/\n\t\tTempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] +\n\t\t\t\t(CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8);\n\n\n\t\t/*Write 0xa24 ~ 0xa27*/\n\t\tTempVal2 = 0;\n\t\tTempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] +\n\t\t\t\t(CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) +\n\t\t\t\t(CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16) +\n\t\t\t\t(CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24);\n\n\t\t/*Write 0xa28  0xa29*/\n\t\tTempVal3 = 0;\n\t\tTempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] +\n\t\t\t\t(CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8);\n\t}  else {\n\t\tfor (i = 0; i < CCK_TABLE_SIZE; i++) {\n\t\t\tif (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) &&\n\t\t\t\t(((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1])) {\n\t\t\t\tCCKSwingIndex = i;\n\t\t\t\tRT_TRACE(_module_mp_, DBG_LOUD, (\"Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\\n\",\n\t\t\t\t\t(rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/*Write 0xa22 0xa23*/\n\t\tTempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] +\n\t\t\t\t(CCKSwingTable_Ch14[CCKSwingIndex][1]<<8);\n\n\t\t/*Write 0xa24 ~ 0xa27*/\n\t\tTempVal2 = 0;\n\t\tTempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] +\n\t\t\t\t(CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) +\n\t\t\t\t(CCKSwingTable_Ch14[CCKSwingIndex][4]<<16) +\n\t\t\t\t(CCKSwingTable_Ch14[CCKSwingIndex][5]<<24);\n\n\t\t/*Write 0xa28  0xa29*/\n\t\tTempVal3 = 0;\n\t\tTempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] +\n\t\t\t\t(CCKSwingTable_Ch14[CCKSwingIndex][7]<<8);\n\t}\n\n\twrite_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal);\n\twrite_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2);\n\twrite_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3);\n\n\t}\n\n}\n\nvoid hal_mpt_SetChannel(PADAPTER pAdapter)\n{\n\tu8 eRFPath;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\tstruct mp_priv\t*pmp = &pAdapter->mppriv;\n\tu8\t\tchannel = pmp->channel;\n\tu8\t\tbandwidth = pmp->bandwidth;\n\n\thal_mpt_SwitchRfSetting(pAdapter);\n\t\n\tSelectChannel(pAdapter, channel);\n\t\n\tpHalData->bSwChnl = _TRUE;\n\tpHalData->bSetChnlBW = _TRUE;\n\trtw_hal_set_chnl_bw(pAdapter, channel, bandwidth, 0, 0);\n\n\thal_mpt_CCKTxPowerAdjust(pAdapter, pHalData->bCCKinCH14);\n\n}\n\n/*\n * Notice\n *\tSwitch bandwitdth may change center frequency(channel)\n */\nvoid hal_mpt_SetBandwidth(PADAPTER pAdapter)\n{\n\tstruct mp_priv *pmp = &pAdapter->mppriv;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\tu8\t\tchannel = pmp->channel;\n\tu8\t\tbandwidth = pmp->bandwidth;\n\t\n\tSetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset);\n\tpHalData->bSwChnl = _TRUE;\n\tpHalData->bSetChnlBW = _TRUE;\n\trtw_hal_set_chnl_bw(pAdapter, channel, bandwidth, 0, 0);\n\t\n\thal_mpt_SwitchRfSetting(pAdapter);\n}\n\nvoid mpt_SetTxPower_Old(PADAPTER pAdapter, MPT_TXPWR_DEF Rate, u8 *pTxPower)\n{\n\tRT_TRACE(_module_mp_, DBG_LOUD, (\"===>mpt_SetTxPower_Old(): Case = %d\\n\", Rate));\n\tswitch (Rate) {\n\tcase MPT_CCK:\n\t\t\t{\n\t\t\tu4Byte\tTxAGC = 0, pwr = 0;\n\t\t\tu1Byte\trf;\n\n\t\t\tpwr = pTxPower[ODM_RF_PATH_A];\n\t\t\tif (pwr < 0x3f) {\n\t\t\t\tTxAGC = (pwr<<16)|(pwr<<8)|(pwr);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pTxPower[ODM_RF_PATH_A]);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);\n\t\t\t}\n\t\t\tpwr = pTxPower[ODM_RF_PATH_B];\n\t\t\tif (pwr < 0x3f) {\n\t\t\t\tTxAGC = (pwr<<16)|(pwr<<8)|(pwr);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, pTxPower[ODM_RF_PATH_B]);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, TxAGC);\n\t\t\t}\n\t\t    \n\t\t\t} break;\n\n\tcase MPT_OFDM_AND_HT:\n\t\t\t{\n\t\t\tu4Byte\tTxAGC = 0;\n\t\t\tu1Byte\tpwr = 0, rf;\n\t\t\t\n\t\t\tpwr = pTxPower[0];\n\t\t\tif (pwr < 0x3f) {\n\t\t\t\tTxAGC |= ((pwr<<24)|(pwr<<16)|(pwr<<8)|pwr);\n\t\t\t\tDBG_871X(\"HT Tx-rf(A) Power = 0x%x\\n\", TxAGC);\n\t\t\t\t\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC);\n\t\t\t}\n\t\t\tTxAGC = 0;\n\t\t\tpwr = pTxPower[1];\n\t\t\tif (pwr < 0x3f) {\n\t\t\t\tTxAGC |= ((pwr<<24)|(pwr<<16)|(pwr<<8)|pwr);\n\t\t\t\tDBG_871X(\"HT Tx-rf(B) Power = 0x%x\\n\", TxAGC);\n\t\t\t\t\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC);\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC);\n\t\t\t}\n\t\t\t} break;\n\n\tdefault:\n\t\tbreak;\n\t}\t\n\t\tDBG_871X(\"<===mpt_SetTxPower_Old()\\n\");\n}\n\n\n\nvoid \nmpt_SetTxPower(\n\t\tPADAPTER\t\tpAdapter,\n\t\tMPT_TXPWR_DEF\tRate,\n\t\tpu1Byte\tpTxPower\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tu1Byte path = 0 , i = 0, MaxRate = MGN_6M;\n\tu1Byte StartPath = ODM_RF_PATH_A, EndPath = ODM_RF_PATH_B;\n\t\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\tEndPath = ODM_RF_PATH_D;\n\n\tswitch (Rate) {\n\tcase MPT_CCK:\n\t\t\t{\n\t\t\tu1Byte rate[] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M};\n\n\t\t\tfor (path = StartPath; path <= EndPath; path++)\n\t\t\t\tfor (i = 0; i < sizeof(rate); ++i)\n\t\t\t\t\tPHY_SetTxPowerIndex(pAdapter, pTxPower[path], path, rate[i]);\t\n\t\t\t}\n\t\t\tbreak;\n\t\t\n\tcase MPT_OFDM:\n\t\t\t{\n\t\t\tu1Byte rate[] = {\n\t\t\t\tMGN_6M, MGN_9M, MGN_12M, MGN_18M,\n\t\t\t\tMGN_24M, MGN_36M, MGN_48M, MGN_54M,\n\t\t\t\t};\n\n\t\t\tfor (path = StartPath; path <= EndPath; path++)\n\t\t\t\tfor (i = 0; i < sizeof(rate); ++i)\n\t\t\t\t\tPHY_SetTxPowerIndex(pAdapter, pTxPower[path], path, rate[i]);\t\n\t\t\t} break;\n\t\t\n\tcase MPT_HT:\n\t\t\t{\n\t\t\tu1Byte rate[] = {\n\t\t\tMGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4,\n\t\t\tMGN_MCS5, MGN_MCS6, MGN_MCS7, MGN_MCS8, MGN_MCS9,\n\t\t\tMGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14,\n\t\t\tMGN_MCS15, MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19,\n\t\t\tMGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23, MGN_MCS24,\n\t\t\tMGN_MCS25, MGN_MCS26, MGN_MCS27, MGN_MCS28, MGN_MCS29,\n\t\t\tMGN_MCS30, MGN_MCS31,\n\t\t\t};\n\t\t\tif (pHalData->rf_type == RF_3T3R)\n\t\t\t\tMaxRate = MGN_MCS23;\n\t\t\telse if (pHalData->rf_type == RF_2T2R)\n\t\t\t\tMaxRate = MGN_MCS15;\n\t\t\telse\n\t\t\t\tMaxRate = MGN_MCS7;\n\t\t\t\n\t\t\tfor (path = StartPath; path <= EndPath; path++) {\n\t\t\t\tfor (i = 0; i < sizeof(rate); ++i) {\n\t\t\t\t\tif (rate[i] > MaxRate)\n\t\t\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t\t    PHY_SetTxPowerIndex(pAdapter, pTxPower[path], path, rate[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t} break;\n\t\t\n\tcase MPT_VHT:\n\t\t\t{\n\t\t\tu1Byte rate[] = {\n\t\t\tMGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4,\n\t\t\tMGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9,\n\t\t\tMGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4,\n\t\t\tMGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9,\n\t\t\tMGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4,\n\t\t\tMGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9,\n\t\t\tMGN_VHT4SS_MCS0, MGN_VHT4SS_MCS1, MGN_VHT4SS_MCS2, MGN_VHT4SS_MCS3, MGN_VHT4SS_MCS4,\n\t\t\tMGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9,\n\t\t\t};\n\t\t\t\t\t\n\t\t\tif (pHalData->rf_type == RF_3T3R)\n\t\t\t\tMaxRate = MGN_VHT3SS_MCS9;\n\t\t\telse if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R)\n\t\t\t\tMaxRate = MGN_VHT2SS_MCS9;\n\t\t\telse\n\t\t\t\tMaxRate = MGN_VHT1SS_MCS9;\n\n\t\t\tfor (path = StartPath; path <= EndPath; path++) {\n\t\t\t\tfor (i = 0; i < sizeof(rate); ++i) {\n\t\t\t\t\tif (rate[i] > MaxRate)\n\t\t\t\t\t\tbreak;\t\n\t\t\t\t\tPHY_SetTxPowerIndex(pAdapter, pTxPower[path], path, rate[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t} break;\n\t\t\t\n\tdefault:\n\t\t\tDBG_871X(\"<===mpt_SetTxPower: Illegal channel!!\\n\");\n\t\t\tbreak;\n\t}\n\n}\n\n\nvoid hal_mpt_SetTxPower(PADAPTER pAdapter)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\n\tif (pHalData->rf_chip < RF_TYPE_MAX) {\n\t\tif (IS_HARDWARE_TYPE_8188E(pAdapter) || \n\t\t\tIS_HARDWARE_TYPE_8723B(pAdapter) || \n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || \n\t\t\tIS_HARDWARE_TYPE_8703B(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8188F(pAdapter)) {\n\t\t\tu8 path = (pHalData->AntennaTxPath == ANTENNA_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B);\n\n\t\t\tDBG_8192C(\"===> MPT_ProSetTxPower: Old\\n\");\n\n\t\t\tRT_TRACE(_module_mp_, DBG_LOUD, (\"===> MPT_ProSetTxPower[Old]:\\n\"));\n\t\t\tmpt_SetTxPower_Old(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel);\t\t\n\t\t\tmpt_SetTxPower_Old(pAdapter, MPT_OFDM_AND_HT, pMptCtx->TxPwrLevel);\n\n\t\t} else {\n\t\t\tDBG_871X(\"===> MPT_ProSetTxPower: Jaguar\\n\");\n\t\t\tmpt_SetTxPower(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel);\n\t\t\tmpt_SetTxPower(pAdapter, MPT_OFDM, pMptCtx->TxPwrLevel);\n\t\t\tmpt_SetTxPower(pAdapter, MPT_HT, pMptCtx->TxPwrLevel);\n\t\t\tmpt_SetTxPower(pAdapter, MPT_VHT, pMptCtx->TxPwrLevel);\n\n\t\t\t}\n\t} else\n\t\tDBG_8192C(\"RFChipID < RF_TYPE_MAX, the RF chip is not supported - %d\\n\", pHalData->rf_chip);\n\n\tODM_ClearTxPowerTrackingState(pDM_Odm);\n\n}\n\n\nvoid hal_mpt_SetDataRate(PADAPTER pAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu32 DataRate;\n\n\tDataRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\n\thal_mpt_SwitchRfSetting(pAdapter);\n\n\thal_mpt_CCKTxPowerAdjust(pAdapter, pHalData->bCCKinCH14);\n#ifdef CONFIG_RTL8723B\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) {\n\t\tif (IS_CCK_RATE(DataRate)) {\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A)\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0x6);\t\n\t\t\telse\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0x6);\n\t\t} else {\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A)\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0xE);\t\n\t\t\telse\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0xE);\t\t\n\t\t}\n\t}\n\t\n\tif ((IS_HARDWARE_TYPE_8723BS(pAdapter) && \n\t\t  ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90)))) {\n\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A)\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0xE);\t\n\t\telse\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0xE);\t\t\t\n\t}\n#endif\t\n}\n\n\n#define RF_PATH_AB\t22\n\n#ifdef CONFIG_RTL8814A\nVOID mpt_ToggleIG_8814A(PADAPTER\tpAdapter)\n{\n\tu1Byte Path = 0;\n\tu4Byte IGReg = rA_IGI_Jaguar, IGvalue = 0;\n\n\tfor (Path; Path <= ODM_RF_PATH_D; Path++) {\n\t\tswitch (Path) {\n\t\tcase ODM_RF_PATH_B:\n\t\t\tIGReg = rB_IGI_Jaguar;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_C:\n\t\t\tIGReg = rC_IGI_Jaguar2;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_D:\n\t\t\tIGReg = rD_IGI_Jaguar2;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tIGReg = rA_IGI_Jaguar;\n\t\t\tbreak;\n\t\t}\n\n\t\tIGvalue = PHY_QueryBBReg(pAdapter, IGReg, bMaskByte0);\n\t\tPHY_SetBBReg(pAdapter, IGReg, bMaskByte0, IGvalue+2);\t   \n\t\tPHY_SetBBReg(pAdapter, IGReg, bMaskByte0, IGvalue);\n\t}\n}\n\nVOID mpt_SetRFPath_8814A(PADAPTER\tpAdapter)\n{\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &pAdapter->mppriv.MptCtx;\n\tR_ANTENNA_SELECT_OFDM\t*p_ofdm_tx;\t/* OFDM Tx register */\n\tR_ANTENNA_SELECT_CCK\t*p_cck_txrx;\n\tu8\tForcedDataRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\tu8\tHtStbcCap = pAdapter->registrypriv.stbc_cap;\n\t/*/PRT_HIGH_THROUGHPUT\t\tpHTInfo = GET_HT_INFO(pMgntInfo);*/\n\t/*/PRT_VERY_HIGH_THROUGHPUT\tpVHTInfo = GET_VHT_INFO(pMgntInfo);*/\n\n\tu32\tulAntennaTx = pHalData->AntennaTxPath;\n\tu32\tulAntennaRx = pHalData->AntennaRxPath;\n\tu8\tNssforRate = MgntQuery_NssTxRate(ForcedDataRate);\n\n\tif ((NssforRate == RF_2TX) || ((NssforRate == RF_1TX) && IS_HT_RATE(ForcedDataRate)) || ((NssforRate == RF_1TX) && IS_VHT_RATE(ForcedDataRate))) {\n\t\tDBG_871X(\"===> SetAntenna 2T ForcedDataRate %d NssforRate %d AntennaTx %d\\n\", ForcedDataRate, NssforRate, ulAntennaTx);\n\n\t\tswitch (ulAntennaTx) {\n\t\tcase ANTENNA_BC:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_BC;\n\t\t\t\t/*pHalData->ValidTxPath = 0x06; linux no use */\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_23Nsts_Jaguar2, 0x0000fff0, 0x106);\t/*/ 0x940[15:4]=12'b0000_0100_0011*/\n\t\t\t\tbreak;\n\n\t\tcase ANTENNA_CD:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_CD;\n\t\t\t\t/*pHalData->ValidTxPath = 0x0C;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_23Nsts_Jaguar2, 0x0000fff0, 0x40c);\t/*/ 0x940[15:4]=12'b0000_0100_0011*/\n\t\t\t\tbreak;\n\t\tcase ANTENNA_AB: default:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_AB;\n\t\t\t\t/*pHalData->ValidTxPath = 0x03;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_23Nsts_Jaguar2, 0x0000fff0, 0x043);\t/*/ 0x940[15:4]=12'b0000_0100_0011*/\n\t\t\t\tbreak;\n\t\t}\n\n\t} else if (NssforRate == RF_3TX) {\n\t\t\t\tDBG_871X(\"===> SetAntenna 3T ForcedDataRate %d NssforRate %d AntennaTx %d\\n\", ForcedDataRate, NssforRate, ulAntennaTx);\n\n\t\tswitch (ulAntennaTx) {\n\t\tcase ANTENNA_BCD:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_BCD;\n\t\t\t\t/*pHalData->ValidTxPath = 0x0e;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_23Nsts_Jaguar2, 0x0fff0000, 0x90e);\t/*/ 0x940[27:16]=12'b0010_0100_0111*/\n\t\t\t\tbreak;\n\n\t\tcase ANTENNA_ABC: default:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_ABC;\n\t\t\t\t/*pHalData->ValidTxPath = 0x0d;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_23Nsts_Jaguar2, 0x0fff0000, 0x247);\t/*/ 0x940[27:16]=12'b0010_0100_0111*/\n\t\t\t\tbreak;\n\t\t}\n\n\t} else { /*/if(NssforRate == RF_1TX)*/\n\t\tDBG_871X(\"===> SetAntenna 1T ForcedDataRate %d NssforRate %d AntennaTx %d\\n\", ForcedDataRate, NssforRate, ulAntennaTx);\n\t\tswitch (ulAntennaTx) {\n\t\tcase ANTENNA_BCD:\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_BCD;\t\t\t\t/*pHalData->ValidTxPath = 0x0e;*/\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x7);\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0x000f00000, 0xe);\t\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0xe);\t\t\t\tbreak;\t\tcase ANTENNA_BC:\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_BC;\t\t\t\t/*pHalData->ValidTxPath = 0x06;*/\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x6);\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0x000f00000, 0x6);\t\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0x6);\t\t\t\tbreak;\t\tcase ANTENNA_B:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_B;\n\t\t\t\t/*pHalData->ValidTxPath = 0x02;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x4);\t\t\t/*/ 0xa07[7:4] = 4'b0100*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0xfff00000, 0x002);\t/*/ 0x93C[31:20]=12'b0000_0000_0010*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0x2);\t\t\t\t\t/* 0x80C[7:4] = 4'b0010*/\n\t\t\t\tbreak;\n\n\t\tcase ANTENNA_C:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_C;\n\t\t\t\t/*pHalData->ValidTxPath = 0x04;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x2);\t\t\t/*/ 0xa07[7:4] = 4'b0010*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0xfff00000, 0x004);\t/*/ 0x93C[31:20]=12'b0000_0000_0100*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0x4);\t\t\t\t\t/*/ 0x80C[7:4] = 4'b0100*/\n\t\t\t\tbreak;\n\n\t\tcase ANTENNA_D:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_D;\n\t\t\t\t/*pHalData->ValidTxPath = 0x08;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x1);\t\t\t/*/ 0xa07[7:4] = 4'b0001*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0xfff00000, 0x008);\t/*/ 0x93C[31:20]=12'b0000_0000_1000*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0x8);\t\t\t\t\t/*/ 0x80C[7:4] = 4'b1000*/\n\t\t\t\tbreak;\n\n\t\tcase ANTENNA_A: default:\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\n\t\t\t\t/*pHalData->ValidTxPath = 0x01;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0xf0000000, 0x8);\t\t\t/*/ 0xa07[7:4] = 4'b1000*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxAnt_1Nsts_Jaguar2, 0xfff00000, 0x001);\t/*/ 0x93C[31:20]=12'b0000_0000_0001*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, 0xf0, 0x1);\t\t\t\t\t/*/ 0x80C[7:4] = 4'b0001*/\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tswitch (ulAntennaRx) {\n\tcase ANTENNA_A:\n\t\t\t/*pHalData->ValidRxPath = 0x01;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x11);\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0C000000, 0x0);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_A_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_C_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_D_0x0[19:16] = 1, Standby mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_B:\n\t\t\t/*pHalData->ValidRxPath = 0x02;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x22);\t\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0C000000, 0x1);\t\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_B_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_C_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_D_0x0[19:16] = 1, Standby mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_C:\n\t\t\t/*pHalData->ValidRxPath = 0x04;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x44);\t\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0C000000, 0x2);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_C_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_D_0x0[19:16] = 1, Standby mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_D:\n\t\t\t/*pHalData->ValidRxPath = 0x08;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x88);\t\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0C000000, 0x3);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_C_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_D_0x0[19:16] = 3, RX mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_BC: \n\t\t\t/*pHalData->ValidRxPath = 0x06;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x66);\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0f000000, 0x6);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_B_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_C_0x0[19:16] = 3, Rx mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_D_0x0[19:16] = 1, Standby mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_CD: \n\t\t\t/*pHalData->ValidRxPath = 0x0C;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0xcc);\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0f000000, 0xB);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_C_0x0[19:16] = 3, Rx mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_D_0x0[19:16] = 3, RX mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0xA);\n\t\t\tbreak;\n\n\tcase ANTENNA_BCD: \n\t\t\t/*pHalData->ValidRxPath = 0x0e;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0xee);\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0f000000, 0x6);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_A_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_B_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_C_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_D_0x0[19:16] = 3, Rx mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0x8);\n\t\t\tbreak;\n\n\tcase ANTENNA_ABCD: \n\t\t\t/*pHalData->ValidRxPath = 0x0f;*/\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x2);\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0xff);\n\t\t\tPHY_SetBBReg(pAdapter, 0x1000, bMaskByte2, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, 0x0f000000, 0x1);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_A_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_B_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_C, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_C_0x0[19:16] = 3, RX mode*/\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_D, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_D_0x0[19:16] = 3, RX mode*/\n\t\t\t/*/ CCA related PD_delay_th*/\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x0F000000, 0x3);\n\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x0000000F, 0x8);\n\t\t\tbreak;\n\n\tdefault:\n\t\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"Unknown Rx antenna.\\n\"));\n\t\t\tbreak;\n\t}\n\n\tPHY_Set_SecCCATH_by_RXANT_8814A(pAdapter, ulAntennaRx);\n\n\tmpt_ToggleIG_8814A(pAdapter);\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-SwitchAntenna: finished\\n\"));\n}\n\nVOID\nmpt_SetSingleTone_8814A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\tbSingleTone,\n\tIN\tBOOLEAN\tbEnPMacTx)\n{\n\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu1Byte StartPath = ODM_RF_PATH_A,  EndPath = ODM_RF_PATH_A;\n\tstatic u4Byte\t\tregIG0 = 0, regIG1 = 0, regIG2 = 0, regIG3 = 0;\n\n\tif (bSingleTone) {\t\t\n\t\tregIG0 = PHY_QueryBBReg(pAdapter, rA_TxScale_Jaguar, bMaskDWord);\t\t/*/ 0xC1C[31:21]*/\n\t\tregIG1 = PHY_QueryBBReg(pAdapter, rB_TxScale_Jaguar, bMaskDWord);\t\t/*/ 0xE1C[31:21]*/\n\t\tregIG2 = PHY_QueryBBReg(pAdapter, rC_TxScale_Jaguar2, bMaskDWord);\t/*/ 0x181C[31:21]*/\n\t\tregIG3 = PHY_QueryBBReg(pAdapter, rD_TxScale_Jaguar2, bMaskDWord);\t/*/ 0x1A1C[31:21]*/\n\n\t\tswitch (pMptCtx->MptRfPath) {\n\t\tcase ODM_RF_PATH_A: case ODM_RF_PATH_B:\n\t\tcase ODM_RF_PATH_C: case ODM_RF_PATH_D:\n\t\t\tStartPath = pMptCtx->MptRfPath;\n\t\t\tEndPath = pMptCtx->MptRfPath;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_AB:\n\t\t\tEndPath = ODM_RF_PATH_B;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_BC:\n\t\t\tStartPath = ODM_RF_PATH_B;\n\t\t\tEndPath = ODM_RF_PATH_C;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_ABC:\n\t\t\tEndPath = ODM_RF_PATH_C;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_BCD:\n\t\t\tStartPath = ODM_RF_PATH_B;\n\t\t\tEndPath = ODM_RF_PATH_D;\n\t\t\tbreak;\n\t\tcase ODM_RF_PATH_ABCD:\n\t\t\tEndPath = ODM_RF_PATH_D;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (bEnPMacTx == FALSE) {\n\t\t\thal_mpt_SetOFDMContinuousTx(pAdapter, _TRUE);\n\t\t\tissue_nulldata(pAdapter, NULL, 1, 3, 500);\n\t\t}\n\n\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, BIT1, 0x1); /*/ Disable CCA*/\n\n\t\tfor (StartPath; StartPath <= EndPath; StartPath++) {\n\t\t\tPHY_SetRFReg(pAdapter, StartPath, RF_AC_Jaguar, 0xF0000, 0x2); /*/ Tx mode: RF0x00[19:16]=4'b0010 */\n\t\t\tPHY_SetRFReg(pAdapter, StartPath, RF_AC_Jaguar, 0x1F, 0x0); /*/ Lowest RF gain index: RF_0x0[4:0] = 0*/\n\n\t\t\tPHY_SetRFReg(pAdapter, StartPath, LNA_Low_Gain_3, BIT1, 0x1); /*/ RF LO enabled*/\n\t\t}\n\n\t\tPHY_SetBBReg(pAdapter, rA_TxScale_Jaguar, 0xFFE00000, 0); /*/ 0xC1C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rB_TxScale_Jaguar, 0xFFE00000, 0); /*/ 0xE1C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rC_TxScale_Jaguar2, 0xFFE00000, 0); /*/ 0x181C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rD_TxScale_Jaguar2, 0xFFE00000, 0); /*/ 0x1A1C[31:21]*/\n\t\t\n\t} else {\n\t\n\t\tswitch (pMptCtx->MptRfPath) {\n\t\tcase ODM_RF_PATH_A: case ODM_RF_PATH_B:\n\t\tcase ODM_RF_PATH_C: case ODM_RF_PATH_D:\n\t\t\t\tStartPath = pMptCtx->MptRfPath;\n\t\t\t\tEndPath = pMptCtx->MptRfPath;\n\t\t\t\tbreak;\n\t\tcase ODM_RF_PATH_AB:\n\t\t\t\tEndPath = ODM_RF_PATH_B;\n\t\t\t\tbreak;\n\t\tcase ODM_RF_PATH_BC:\n\t\t\t\tStartPath = ODM_RF_PATH_B;\n\t\t\t\tEndPath = ODM_RF_PATH_C;\n\t\t\t\tbreak;\n\t\tcase ODM_RF_PATH_ABC:\n\t\t\t\tEndPath = ODM_RF_PATH_C;\n\t\t\t\tbreak;\n\t\tcase ODM_RF_PATH_BCD:\n\t\t\t\tStartPath = ODM_RF_PATH_B;\n\t\t\t\tEndPath = ODM_RF_PATH_D;\n\t\t\t\tbreak;\n\t\tcase ODM_RF_PATH_ABCD:\n\t\t\t\tEndPath = ODM_RF_PATH_D;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tfor (StartPath; StartPath <= EndPath; StartPath++)\n\t\t\tPHY_SetRFReg(pAdapter, StartPath, LNA_Low_Gain_3, BIT1, 0x0); /*// RF LO disabled*/\n\n\t\t\n\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, BIT1, 0x0); /* Enable CCA*/\n\n\t\tif (bEnPMacTx == FALSE)\n\t\t\thal_mpt_SetOFDMContinuousTx(pAdapter, _FALSE);\n\n\t\tPHY_SetBBReg(pAdapter, rA_TxScale_Jaguar, bMaskDWord, regIG0); /* 0xC1C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rB_TxScale_Jaguar, bMaskDWord, regIG1); /* 0xE1C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rC_TxScale_Jaguar2, bMaskDWord, regIG2); /* 0x181C[31:21]*/\n\t\tPHY_SetBBReg(pAdapter, rD_TxScale_Jaguar2, bMaskDWord, regIG3); /* 0x1A1C[31:21]*/\n\t}\n}\n\n#endif\n\n#if\tdefined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nvoid mpt_SetRFPath_8812A(PADAPTER pAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &pAdapter->mppriv.MptCtx;\n\tu32\t\tulAntennaTx, ulAntennaRx;\n\n\tulAntennaTx = pHalData->AntennaTxPath;\n\tulAntennaRx = pHalData->AntennaRxPath;\n\n\tswitch (ulAntennaTx) {\n\tcase ANTENNA_A:\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\n\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x1111);\n\t\t\tif (pHalData->RFEType == 3 && IS_HARDWARE_TYPE_8812(pAdapter))\n\t\t\t\tPHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0);\t \n\t\t\tbreak;\n\tcase ANTENNA_B:\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_B;\n\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x2222);\n\t\t\tif (pHalData->RFEType == 3 && IS_HARDWARE_TYPE_8812(pAdapter))\n\t\t\t\tPHY_SetBBReg(pAdapter,\tr_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x1);\n\t\t\tbreak;\n\tcase ANTENNA_AB:\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_AB;\n\t\t\tPHY_SetBBReg(pAdapter, rTxPath_Jaguar, bMaskLWord, 0x3333);\n\t\t\tif (pHalData->RFEType == 3 && IS_HARDWARE_TYPE_8812(pAdapter))\n\t\t\t\tPHY_SetBBReg(pAdapter, r_ANTSEL_SW_Jaguar, bMask_AntselPathFollow_Jaguar, 0x0);\n\t\t\tbreak;\n\tdefault:\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_AB;\n\t\t\tDBG_871X(\"Unknown Tx antenna.\\n\");\n\t\t\tbreak;\n\t}\n\n\tswitch (ulAntennaRx) {\n\t\t\tu32 reg0xC50 = 0;\n\tcase ANTENNA_A:\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x11);\t\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x1); /*/ RF_B_0x0[19:16] = 1, Standby mode*/\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);\t   \n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); \n\n\t\t\t/*/ <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin.*/\n\t\t\treg0xC50 = PHY_QueryBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0);\n\t\t\tPHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50+2);\t   \n\t\t\tPHY_SetBBReg(pAdapter, rA_IGI_Jaguar, bMaskByte0, reg0xC50);\t\t\t\n\t\t\tbreak;\n\tcase ANTENNA_B:\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x22);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, 0xF0000, 0x1);/*/ RF_A_0x0[19:16] = 1, Standby mode */\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x1);\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, BIT19|BIT18|BIT17|BIT16, 0x3); \n\n\t\t\t/*/ <20121101, Kordan> To prevent gain table from not switched, asked by Ynlin.*/\n\t\t\treg0xC50 = PHY_QueryBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0);\n\t\t\tPHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50+2);\t   \n\t\t\tPHY_SetBBReg(pAdapter, rB_IGI_Jaguar, bMaskByte0, reg0xC50);\t\t\t\t\t\t\n\t\t\tbreak;\n\tcase ANTENNA_AB:\n\t\t\tPHY_SetBBReg(pAdapter, rRxPath_Jaguar, bMaskByte0, 0x33);\t\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_AC_Jaguar, 0xF0000, 0x3); /*/ RF_B_0x0[19:16] = 3, Rx mode*/\n\t\t\tPHY_SetBBReg(pAdapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);\t\n\t\t\tbreak;\n\tdefault:\n\t\t\tDBG_871X(\"Unknown Rx antenna.\\n\");\n\t\t\tbreak;\n\t}\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-SwitchAntenna: finished\\n\"));\n}\n#endif\n\n\n#ifdef CONFIG_RTL8723B\nvoid mpt_SetRFPath_8723B(PADAPTER pAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu32\t\tulAntennaTx, ulAntennaRx;\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tPDM_ODM_T\tpDM_Odm = &pHalData->odmpriv;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tulAntennaTx = pHalData->AntennaTxPath;\n\tulAntennaRx = pHalData->AntennaRxPath;\n\n\tif (pHalData->rf_chip >= RF_TYPE_MAX) {\n\t\tDBG_8192C(\"This RF chip ID is not supported\\n\");\n\t\treturn;\n\t}\n\n\tswitch (pAdapter->mppriv.antenna_tx) {\n\t\tu8 p = 0, i = 0;\n\tcase ANTENNA_A: /*/ Actually path S1  (Wi-Fi)*/\n\t\t\t{\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x0);\n\t\t\tPHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x0); /* AGC Table Sel*/\n\n\t\t\t/*/<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten.*/\n\t\t\tif ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);\n\t\t\telse\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);\n\n\n\t\t\tfor (i = 0; i < 3; ++i) {\n\t\t\t\tu4Byte offset = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][0];\n\t\t\t\tu4Byte data = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][1];\n\t\t\t\t\n\t\t\t\tif (offset != 0) {\n\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\tDBG_8192C(\"Switch to S1 TxIQC(offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tfor (i = 0; i < 2; ++i) {\n\t\t\t\tu4Byte offset = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][0];\n\t\t\t\tu4Byte data = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][1];\n\t\t\t\t\n\t\t\t\tif (offset != 0) {\n\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\t\t\t\t\t\n\t\t\t\t\tDBG_8192C(\"Switch to S1 RxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\tcase ANTENNA_B: /*/ Actually path S0 (BT)*/\n\t\t\t{\n\t\t\tu4Byte offset;\n\t\t\tu4Byte data;\n\t\t\t\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_B;\n\t\t\tPHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x5);\n\t\t\tPHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x1); /*/ AGC Table Sel.*/\n\t\t\t\t\n\t\t\t/* <20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten.*/\n\t\t\tif ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);\n\t\t\telse\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);\n\n\t\t\tfor (i = 0; i < 3; ++i) {\n\t\t\t\t/*/ <20130603, Kordan> Because BB suppors only 1T1R, we restore IQC  to S1 instead of S0.*/\n\t\t\t\toffset = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][0];\n\t\t\t\tdata = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_B][i][1];\n\t\t\t\tif (pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_B][i][0] != 0) {\n\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\tDBG_8192C(\"Switch to S0 TxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*/ <20130603, Kordan> Because BB suppors only 1T1R, we restore IQC to S1 instead of S0.*/\n\t\t\tfor (i = 0; i < 2; ++i) {\n\t\t\t\toffset = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][0];\n\t\t\t\tdata = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_B][i][1];\n\t\t\t\t\n\t\t\t\tif (pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_B][i][0] != 0) {\n\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\tDBG_8192C(\"Switch to S0 RxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\tdefault:\n\t\tpMptCtx->MptRfPath = RF_PATH_AB;\n\t\tRT_TRACE(_module_mp_, _drv_notice_, (\"Unknown Tx antenna.\\n\"));\n\t\tbreak;\n\t}\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-SwitchAntenna: finished\\n\"));\n}\n#endif\n\n#ifdef CONFIG_RTL8703B\nvoid mpt_SetRFPath_8703B(PADAPTER pAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu4Byte\t\t\t\t\tulAntennaTx, ulAntennaRx;\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tPODM_RF_CAL_T\t\t\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tulAntennaTx = pHalData->AntennaTxPath;\n\tulAntennaRx = pHalData->AntennaRxPath;\n\n\tif (pHalData->rf_chip >= RF_TYPE_MAX) {\n\t\tDBG_871X(\"This RF chip ID is not supported\\n\");\n\t\treturn;\n\t}\n\n\tswitch (pAdapter->mppriv.antenna_tx) {\n\t\tu1Byte p = 0, i = 0;\n\n\tcase ANTENNA_A: /* Actually path S1  (Wi-Fi) */\n\t\t\t\t{\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\t\t\t\n\t\t\t\tPHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x0);\n\t\t\t\tPHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x0); /* AGC Table Sel*/\n\n\t\t\t\tfor (i = 0; i < 3; ++i) {\n\t\t\t\t\tu4Byte offset = pRFCalibrateInfo->TxIQC_8703B[i][0];\n\t\t\t\t\tu4Byte data = pRFCalibrateInfo->TxIQC_8703B[i][1];\n\n\t\t\t\t\tif (offset != 0) {\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\t\tDBG_871X(\"Switch to S1 TxIQC(offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < 2; ++i) {\n\t\t\t\t\tu4Byte offset = pRFCalibrateInfo->RxIQC_8703B[i][0];\n\t\t\t\t\tu4Byte data = pRFCalibrateInfo->RxIQC_8703B[i][1];\n\n\t\t\t\t\tif (offset != 0) {\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\t\t\t\t\t\n\t\t\t\t\t\tDBG_871X(\"Switch to S1 RxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t}\n\tbreak;\n\tcase ANTENNA_B: /* Actually path S0 (BT)*/\n\t\t\t\t{\n\t\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_B;\n\t\t\t\tPHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x5);\n\t\t\t\tPHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x1); /* AGC Table Sel */\n\n\t\t\t\tfor (i = 0; i < 3; ++i) {\n\t\t\t\t\tu4Byte offset = pRFCalibrateInfo->TxIQC_8703B[i][0];\n\t\t\t\t\tu4Byte data = pRFCalibrateInfo->TxIQC_8703B[i][1];\n\n\t\t\t\t\tif (pRFCalibrateInfo->TxIQC_8703B[i][0] != 0) {\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\t\tDBG_871X(\"Switch to S0 TxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < 2; ++i) {\n\t\t\t\t\tu4Byte offset = pRFCalibrateInfo->RxIQC_8703B[i][0];\n\t\t\t\t\tu4Byte data = pRFCalibrateInfo->RxIQC_8703B[i][1];\n\n\t\t\t\t\tif (pRFCalibrateInfo->RxIQC_8703B[i][0] != 0) {\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, data);\n\t\t\t\t\t\tDBG_871X(\"Switch to S0 RxIQC (offset, data) = (0x%X, 0x%X)\\n\", offset, data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t}\n\tbreak;\n\tdefault:\n\t\t\tpMptCtx->MptRfPath = RF_PATH_AB; \n\t\t\tRT_TRACE(_module_mp_, _drv_notice_, (\"Unknown Tx antenna.\\n\"));\n\tbreak;\n\t}\n\n\tRT_TRACE(_module_mp_, _drv_notice_, (\"-SwitchAntenna: finished\\n\"));\n}\n#endif\n\n\nVOID mpt_SetRFPath_819X(PADAPTER\tpAdapter)\n{\n\tHAL_DATA_TYPE\t\t\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu4Byte\t\t\tulAntennaTx, ulAntennaRx;\n\tR_ANTENNA_SELECT_OFDM\t*p_ofdm_tx;\t/* OFDM Tx register */\n\tR_ANTENNA_SELECT_CCK\t*p_cck_txrx;\n\tu1Byte\t\tr_rx_antenna_ofdm = 0, r_ant_select_cck_val = 0;\n\tu1Byte\t\tchgTx = 0, chgRx = 0;\n\tu4Byte\t\tr_ant_sel_cck_val = 0, r_ant_select_ofdm_val = 0, r_ofdm_tx_en_val = 0;\n\n\tulAntennaTx = pHalData->AntennaTxPath;\n\tulAntennaRx = pHalData->AntennaRxPath;\n\t\n\tp_ofdm_tx = (R_ANTENNA_SELECT_OFDM *)&r_ant_select_ofdm_val;\n\tp_cck_txrx = (R_ANTENNA_SELECT_CCK *)&r_ant_select_cck_val;\n\n\tp_ofdm_tx->r_ant_ht1\t\t\t= 0x1;\n\tp_ofdm_tx->r_ant_ht2\t\t\t= 0x2;/*Second TX RF path is A*/\n\tp_ofdm_tx->r_ant_non_ht\t\t\t= 0x3;/*/ 0x1+0x2=0x3 */\n\n\tswitch (ulAntennaTx) {\n\tcase ANTENNA_A:\n\t\t\tp_ofdm_tx->r_tx_antenna\t\t= 0x1;\n\t\t\tr_ofdm_tx_en_val\t\t= 0x1;\n\t\t\tp_ofdm_tx->r_ant_l\t\t= 0x1;\n\t\t\tp_ofdm_tx->r_ant_ht_s1\t\t= 0x1;\n\t\t\tp_ofdm_tx->r_ant_non_ht_s1\t= 0x1;\n\t\t\tp_cck_txrx->r_ccktx_enable\t= 0x8;\n\t\t\tchgTx = 1;\n\t\t\t/*/ From SD3 Willis suggestion !!! Set RF A=TX and B as standby*/\n\t\t\t/*/if (IS_HARDWARE_TYPE_8192S(pAdapter))*/\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 1);\n\t\t\t\tr_ofdm_tx_en_val\t\t\t= 0x3;\n\t\t\t\t/*/ Power save*/\n\t\t\t\t/*/cosa r_ant_select_ofdm_val = 0x11111111;*/\n\t\t\t\t/*/ We need to close RFB by SW control*/\n\t\t\tif (pHalData->rf_type == RF_2T2R) {\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 1);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 0);\n\t\t\t}\n\t\t\t}\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_A;\n\t\t\tbreak;\n\tcase ANTENNA_B:\n\t\t\tp_ofdm_tx->r_tx_antenna\t\t= 0x2;\n\t\t\tr_ofdm_tx_en_val\t\t= 0x2;\n\t\t\tp_ofdm_tx->r_ant_l\t\t= 0x2;\n\t\t\tp_ofdm_tx->r_ant_ht_s1\t\t= 0x2;\n\t\t\tp_ofdm_tx->r_ant_non_ht_s1\t= 0x2;\n\t\t\tp_cck_txrx->r_ccktx_enable\t= 0x4;\n\t\t\tchgTx = 1;\n\t\t\t/*/ From SD3 Willis suggestion !!! Set RF A as standby*/\n\t\t\t/*/if (IS_HARDWARE_TYPE_8192S(pAdapter))*/\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 1);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);\n\n\t\t\t\t/*/ 2008/10/31 MH From SD3 Willi's suggestion. We must read RF 1T table.*/\n\t\t\t\t/*/ 2009/01/08 MH From Sd3 Willis. We need to close RFA by SW control*/\n\t\t\tif (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_1T2R) {\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 1);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0);\n\t\t\t\t/*/PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 0);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1);\n\t\t\t}\n\t\t\t}\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_B;\t\t\n\t\t\tbreak;\n\tcase ANTENNA_AB:/*/ For 8192S*/\n\t\t\tp_ofdm_tx->r_tx_antenna\t\t= 0x3;\n\t\t\tr_ofdm_tx_en_val\t\t= 0x3;\n\t\t\tp_ofdm_tx->r_ant_l\t\t= 0x3;\n\t\t\tp_ofdm_tx->r_ant_ht_s1\t\t= 0x3;\n\t\t\tp_ofdm_tx->r_ant_non_ht_s1\t= 0x3;\n\t\t\tp_cck_txrx->r_ccktx_enable\t= 0xC;\n\t\t\tchgTx = 1;\n\t\t\t/*/ From SD3Willis suggestion !!! Set RF B as standby*/\n\t\t\t/*/if (IS_HARDWARE_TYPE_8192S(pAdapter))*/\n\t\t\t{\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, 0xe, 2);\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter2, 0xe, 2);\n\t\t\t/* Disable Power save*/\t\t\t\n\t\t\t/*cosa r_ant_select_ofdm_val = 0x3321333;*/\n\t\t\t/* 2009/01/08 MH From Sd3 Willis. We need to enable RFA/B by SW control*/\n\t\t\tif (pHalData->rf_type == RF_2T2R) {\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0);\n\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0);\n\t\t\t\t/*/PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0);*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT1, 1);\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFParameter, BIT17, 1);\n\t\t\t}\n\t\t\t}\t\t\t\n\t\t\tpMptCtx->MptRfPath = ODM_RF_PATH_AB;\n\t\t\tbreak;\n\tdefault:\n\t\t\t\tbreak;\n\t}\n\n\t\n\t\n/*// r_rx_antenna_ofdm, bit0=A, bit1=B, bit2=C, bit3=D\n// r_cckrx_enable : CCK default, 0=A, 1=B, 2=C, 3=D\n// r_cckrx_enable_2 : CCK option, 0=A, 1=B, 2=C, 3=D\t*/\n\tswitch (ulAntennaRx) {\n\tcase ANTENNA_A:\n\t\tr_rx_antenna_ofdm\t\t= 0x1;\t/* A*/\n\t\tp_cck_txrx->r_cckrx_enable\t= 0x0;\t/* default: A*/\n\t\tp_cck_txrx->r_cckrx_enable_2\t= 0x0;\t/* option: A*/\n\t\tchgRx = 1;\n\t\tbreak;\n\tcase ANTENNA_B:\n\t\tr_rx_antenna_ofdm\t\t\t= 0x2;\t/*/ B*/\n\t\tp_cck_txrx->r_cckrx_enable\t= 0x1;\t/*/ default: B*/\n\t\tp_cck_txrx->r_cckrx_enable_2\t= 0x1;\t/*/ option: B*/\n\t\tchgRx = 1;\n\t\tbreak;\n\tcase ANTENNA_AB:/*/ For 8192S and 8192E/U...*/\n\t\tr_rx_antenna_ofdm\t\t= 0x3;/*/ AB*/\n\t\tp_cck_txrx->r_cckrx_enable\t= 0x0;/*/ default:A*/\n\t\tp_cck_txrx->r_cckrx_enable_2\t= 0x1;/*/ option:B*/\n\t\tchgRx = 1;\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\n\tif (chgTx && chgRx) {\n\t\tswitch (pHalData->rf_chip) {\n\t\tcase RF_8225:\n\t\tcase RF_8256:\n\t\tcase RF_6052:\n\t\t\t\t/*/r_ant_sel_cck_val = r_ant_select_cck_val;*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA1_TxInfo, 0x7fffffff, r_ant_select_ofdm_val);\t\t/*/OFDM Tx*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_TxInfo, 0x0000000f, r_ofdm_tx_en_val);\t\t/*/OFDM Tx*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm);\t/*/OFDM Rx*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x0000000f, r_rx_antenna_ofdm);\t/*/OFDM Rx*/\n\t\t\t\tif (IS_HARDWARE_TYPE_8192E(pAdapter)) {\n\t\t\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, 0x000000F0, r_rx_antenna_ofdm);\t/*/OFDM Rx*/\n\t\t\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_TRxPathEnable, 0x000000F0, r_rx_antenna_ofdm);\t/*/OFDM Rx*/\n\t\t\t\t}\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskByte3, r_ant_select_cck_val);/*/r_ant_sel_cck_val); /CCK TxRx*/\n\t\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t\tDBG_871X(\"Unsupported RFChipID for switching antenna.\\n\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\t/* MPT_ProSetRFPath */\n\n\nvoid hal_mpt_SetAntenna(PADAPTER\tpAdapter)\n\n{\n\tDBG_871X(\"Do %s\\n\", __func__);\n#ifdef\tCONFIG_RTL8814A\n\tif (IS_HARDWARE_TYPE_8814A(pAdapter)) {\n\t\tmpt_SetRFPath_8814A(pAdapter);\n\t\treturn;\n\t}\n#endif\n#if\tdefined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {\n\t\tmpt_SetRFPath_8812A(pAdapter);\n\t\treturn;\n\t}\n#endif\n#ifdef\tCONFIG_RTL8723B\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter)) {\n\t\tmpt_SetRFPath_8723B(pAdapter);\n\t\treturn;\n\t}\t\n#endif\t\n#ifdef\tCONFIG_RTL8703B\n\tif (IS_HARDWARE_TYPE_8703B(pAdapter)) {\n\t\tmpt_SetRFPath_8703B(pAdapter);\n\t\treturn;\n\t}\t\n#endif\t\n\n/*\telse if (IS_HARDWARE_TYPE_8821B(pAdapter))\n\t\tmpt_SetRFPath_8821B(pAdapter);\n\tPrepare for 8822B\n\telse if (IS_HARDWARE_TYPE_8822B(Context))\n\t\tmpt_SetRFPath_8822B(Context);\n*/\t\n\tmpt_SetRFPath_819X(pAdapter);\n\tDBG_871X(\"mpt_SetRFPath_819X Do %s\\n\", __func__);\n\n}\n\n\ns32 hal_mpt_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\n\tif (!netif_running(pAdapter->pnetdev)) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"SetThermalMeter! Fail: interface not opened!\\n\"));\n\t\treturn _FAIL;\n\t}\n\n\n\tif (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {\n\t\tRT_TRACE(_module_mp_, _drv_warning_, (\"SetThermalMeter: Fail! not in MP mode!\\n\"));\n\t\treturn _FAIL;\n\t}\n\n\n\ttarget_ther &= 0xff;\n\tif (target_ther < 0x07)\n\t\ttarget_ther = 0x07;\n\telse if (target_ther > 0x1d)\n\t\ttarget_ther = 0x1d;\n\n\tpHalData->EEPROMThermalMeter = target_ther;\n\n\treturn _SUCCESS;\n}\n\n\nvoid hal_mpt_TriggerRFThermalMeter(PADAPTER pAdapter)\n{\n\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x42, BIT17 | BIT16, 0x03);\n\n}\n\n\nu8 hal_mpt_ReadRFThermalMeter(PADAPTER pAdapter)\n\n{\n\tu32 ThermalValue = 0;\n\n\tThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, 0x42, 0xfc00);\t/*0x42: RF Reg[15:10]*/\n\treturn (u8)ThermalValue;\n\n}\n\n\nvoid hal_mpt_GetThermalMeter(PADAPTER pAdapter, u8 *value)\n{\n#if 0\n\tfw_cmd(pAdapter, IOCMD_GET_THERMAL_METER);\n\trtw_msleep_os(1000);\n\tfw_cmd_data(pAdapter, value, 1);\n\t*value &= 0xFF;\n#else\n\thal_mpt_TriggerRFThermalMeter(pAdapter);\n\trtw_msleep_os(1000);\n\t*value = hal_mpt_ReadRFThermalMeter(pAdapter);\n#endif\n\n}\n\n\nvoid hal_mpt_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\t\n\tpAdapter->mppriv.MptCtx.bSingleCarrier = bStart;\n\t\n\tif (bStart) {/*/ Start Single Carrier.*/\n\t\tRT_TRACE(_module_mp_, _drv_alert_, (\"SetSingleCarrierTx: test start\\n\"));\n\t\t/*/ Start Single Carrier.*/\n\t\t/*/ 1. if OFDM block on?*/\n\t\tif (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn))\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 1); /*set OFDM block on*/\n\n\t\t/*/ 2. set CCK test mode off, set to CCK normal mode*/\n\t\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0);\n\n\t\t/*/ 3. turn on scramble setting*/\n\t\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 1);\n\n\t\t/*/ 4. Turn On Continue Tx and turn off the other test modes.*/\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) ||  defined(CONFIG_RTL8814A)\n\t\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8814A(pAdapter) /*|| IS_HARDWARE_TYPE_8822B(pAdapter)*/)\n\t\t\tPHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_SingleCarrier);\n\t\telse\n#endif\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleCarrier);\n\n\t} else {\n\t\t/*/ Stop Single Carrier.*/\n\t\t/*/ Stop Single Carrier.*/\n\t\t/*/ Turn off all test modes.*/\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) ||  defined(CONFIG_RTL8814A)\t\t\n\t\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8814A(pAdapter) /*|| IS_HARDWARE_TYPE_8822B(pAdapter)*/)\n\t\t\tPHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF);\n\t\telse\n#endif\n\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\n\t\trtw_msleep_os(10);\n\t\t/*/BB Reset*/\n\t    PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\t    PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\t}\n}\n\n\nvoid hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\t\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu4Byte\t\t\tulAntennaTx = pHalData->AntennaTxPath;\n\tstatic u4Byte\t\tregRF = 0, regBB0 = 0, regBB1 = 0, regBB2 = 0, regBB3 = 0;\n\tu8 rfPath;\n\n\tswitch (ulAntennaTx) {\n\tcase ANTENNA_B:\n\t\t\trfPath = ODM_RF_PATH_B;\n\t\t\tbreak;\n\tcase ANTENNA_C:\n\t\t\trfPath = ODM_RF_PATH_C;\n\t\t\tbreak;\n\tcase ANTENNA_D:\n\t\t\trfPath = ODM_RF_PATH_D;\n\t\t\tbreak;\n\tcase ANTENNA_A:\n\tdefault:\t\n\t\t\trfPath = ODM_RF_PATH_A;\n\t\t\tbreak;\n\t}\n\n\tpAdapter->mppriv.MptCtx.bSingleTone = bStart;\n\tif (bStart) {\n\t\t/*/ Start Single Tone.*/\n\t\t/*/ <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu)*/\n\t\tif (IS_HARDWARE_TYPE_8188E(pAdapter)) {\n\t\t\tregRF = PHY_QueryRFReg(pAdapter, rfPath, LNA_Low_Gain_3, bRFRegOffsetMask);\n\t\t\t\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, LNA_Low_Gain_3, BIT1, 0x1); /*/ RF LO enabled*/\t\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0);\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0);\n\t\t} else if (IS_HARDWARE_TYPE_8192E(pAdapter)) { /*/ USB need to do RF LO disable first, PCIE isn't required to follow this order.*/\n\t\t\t\t\t\t/*/Set MAC REG 88C: Prevent SingleTone Fail*/\n\t\t\tPHY_SetMacReg(pAdapter, 0x88C, 0xF00000, 0xF);\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); /*/ RF LO disabled*/\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x2); /*/ Tx mode*/\n\t\t} else if (IS_HARDWARE_TYPE_8723B(pAdapter)) {\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A) {\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x2); /*/ Tx mode*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x56, 0xF, 0x1); /*/ RF LO enabled*/\n\t\t\t} else { \n\t\t\t\t/*/ S0/S1 both use PATH A to configure*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x2); /*/ Tx mode*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x76, 0xF, 0x1); /*/ RF LO enabled*/\n\t\t\t}\n\t\t} else if (IS_HARDWARE_TYPE_8703B(pAdapter)) {\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A) {\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x2); /* Tx mode */\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x53, 0xF000, 0x1); /* RF LO enabled */\n\t\t\t}\n\t\t} else if (IS_HARDWARE_TYPE_8188F(pAdapter)) {\n\t\t\t/*Set BB REG 88C: Prevent SingleTone Fail*/\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, 0xF00000, 0xF);\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1);\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x2);\n\n\t\t} else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\t\t\tu1Byte p = ODM_RF_PATH_A;\n\t\t\t\n\t\t\tregRF = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, bRFRegOffsetMask);\n\t\t\tregBB0 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord);\n\t\t\tregBB1 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord);\n\t\t\tregBB2 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord);\n\t\t\tregBB3 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord);\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x0); /*/ Disable CCK and OFDM*/\n\t\t\t\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_AB) {\n\t\t\t\tfor (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) {\t\t\t\t\t\n\t\t\t\t\tPHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0xF0000, 0x2); /*/ Tx mode: RF0x00[19:16]=4'b0010 */\n\t\t\t\t\tPHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0x1F, 0x0); /*/ Lowest RF gain index: RF_0x0[4:0] = 0*/\n\t\t\t\t\tPHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x1); /*/ RF LO enabled*/\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0xF0000, 0x2); /*/ Tx mode: RF0x00[19:16]=4'b0010 */\n\t\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0x1F, 0x0); /*/ Lowest RF gain index: RF_0x0[4:0] = 0*/\n\t\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); /*/ RF LO enabled*/\n\t\t\t}\t\t\t\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007);  /*/ 0xCB0[[23:16, 7:4] = 0x77007*/\n\t\t\tPHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007);  /*/ 0xCB0[[23:16, 7:4] = 0x77007*/\n\t\t\t\n\t\t\tif (pHalData->ExternalPA_5G) {\n\t\t\t\tPHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); /*/ 0xCB4[23:16] = 0x12*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); /*/ 0xEB4[23:16] = 0x12*/\n\t\t\t} else if (pHalData->ExternalPA_2G) {\n\t\t\t\tPHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); /*/ 0xCB4[23:16] = 0x11*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); /*/ 0xEB4[23:16] = 0x11*/\n\t\t\t}\n#endif\n\t\t}\n#ifdef CONFIG_RTL8814A \n\t\telse if (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\t\tmpt_SetSingleTone_8814A(pAdapter, TRUE, FALSE);\n#endif\n\t\telse\t/*/ Turn On SingleTone and turn off the other test modes.*/\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleTone);\t\t\t\n\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\t} else {/*/ Stop Single Ton e.*/\n\n\t\tif (IS_HARDWARE_TYPE_8188E(pAdapter)) {\n\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, regRF);\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1);\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1);\n\t\t} else if (IS_HARDWARE_TYPE_8192E(pAdapter)) {\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x3);/*/ Tx mode*/\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x0);/*/ RF LO disabled */\n\t\t\t/*/ RESTORE MAC REG 88C: Enable RF Functions*/\n\t\t\tPHY_SetMacReg(pAdapter, 0x88C, 0xF00000, 0x0);\n\t\t} else if (IS_HARDWARE_TYPE_8723B(pAdapter)) {\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A) {\n\t\t\t\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x3); /*/ Rx mode*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x56, 0xF, 0x0); /*/ RF LO disabled*/\n\t\t\t} else {\n\t\t\t\t/*/ S0/S1 both use PATH A to configure*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x3); /*/ Rx mode*/\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x76, 0xF, 0x0); /*/ RF LO disabled*/\n\t\t\t\t}\n\t\t} else if (IS_HARDWARE_TYPE_8703B(pAdapter)) {\n\t\t\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_A) {\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x3); /* Rx mode */\n\t\t\t\tPHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x53, 0xF000, 0x0); /* RF LO disabled */\n\t\t\t}\n\t\t} else if (IS_HARDWARE_TYPE_8188F(pAdapter)) {\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x3); /*Tx mode*/\n\t\t\tPHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x0); /*RF LO disabled*/\n\t\t\t/*Set BB REG 88C: Prevent SingleTone Fail*/\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, 0xF00000, 0xc);\t\n\t\t} else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\t\t\tu1Byte p = ODM_RF_PATH_A;\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x3); /*/ Disable CCK and OFDM*/\n\n\t\t\tif (pMptCtx->MptRfPath == ODM_RF_PATH_AB) {\n\t\t\t\tfor (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) {\t\t\t\t\t\n\t\t\t\t\tPHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, bRFRegOffsetMask, regRF);\n\t\t\t\t\tPHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x0); /*/ RF LO disabled*/\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tPHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, bRFRegOffsetMask, regRF);\n\t\t\t\tPHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x0); /*/ RF LO disabled*/\n\t\t\t}\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, regBB0); \n\t\t\tPHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, regBB1); \n\t\t\tPHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord, regBB2);\n\t\t\tPHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord, regBB3);\n#endif\n\t\t}\n#ifdef CONFIG_RTL8814A\t\t\n\t\telse if (IS_HARDWARE_TYPE_8814A(pAdapter))\n\t\t\tmpt_SetSingleTone_8814A(pAdapter, FALSE, FALSE);\n\n\t\t else/*/ Turn off all test modes.*/\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF);\t\t\t\t   \n#endif\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n\n\t}\n}\n\n\nvoid hal_mpt_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)\n{\n\tu8 Rate;\n\tpAdapter->mppriv.MptCtx.bCarrierSuppression = bStart;\n\n\tRate = HwRateToMPTRate(pAdapter->mppriv.rateidx);\n\tif (bStart) {/* Start Carrier Suppression.*/\n\t\tRT_TRACE(_module_mp_, _drv_alert_, (\"SetCarrierSuppressionTx: test start\\n\"));\n\t\tif (Rate <= MPT_RATE_11M) {\n\t\t\t/*/ 1. if CCK block on?*/\n\t\t\tif (!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))\n\t\t\t\twrite_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);/*set CCK block on*/\n\n\t\t\t/*/Turn Off All Test Mode*/\n\t\t\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8814A(pAdapter) /*|| IS_HARDWARE_TYPE_8822B(pAdapter)*/)\n\t\t\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);/* rSingleTone_ContTx_Jaguar*/\n\t\t\telse\n\t\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\n\t\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);    /*/transmit mode*/\n\t\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0);  /*/turn off scramble setting*/\n\n\t\t\t/*/Set CCK Tx Test Rate*/\n\t\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0);    /*/Set FTxRate to 1Mbps*/\n\t\t}\n\n\t\t /*Set for dynamic set Power index*/\n\t\t write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\t\t write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\t} else {/* Stop Carrier Suppression.*/\t\n\t\tRT_TRACE(_module_mp_, _drv_alert_, (\"SetCarrierSuppressionTx: test stop\\n\"));\n\n\t\tif (Rate <= MPT_RATE_11M) {\n\t\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);    /*normal mode*/\n\t\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1);  /*turn on scramble setting*/\n\n\t\t\t/*BB Reset*/\n\t\t\twrite_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\t\t\twrite_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\t\t}\n\t\t/*Stop for dynamic set Power index*/\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n\t}\n\tDBG_871X(\"\\n MPT_ProSetCarrierSupp() is finished.\\n\");\n}\n\nvoid hal_mpt_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tu32 cckrate;\n\n\tif (bStart) {\n\t\tRT_TRACE(_module_mp_, _drv_alert_,\n\t\t\t (\"SetCCKContinuousTx: test start\\n\"));\n\n\t\t/*/ 1. if CCK block on?*/\n\t\tif (!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))\n\t\t\twrite_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);/*set CCK block on*/\n\n\t\t/*/Turn Off All Test Mode*/\n\t\tif (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter))\n\t\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);/*rSingleTone_ContTx_Jaguar*/\n\t\telse\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\n\t\t/*/Set CCK Tx Test Rate*/\n\n\t\tcckrate  = pAdapter->mppriv.rateidx;\n\n\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);\n\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);\t/*/transmit mode*/\n\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable);\t/*/turn on scramble setting*/\n\n\t\tif (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter)) {\n\t\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3);  /* rCCK0_RxHP 0xa15[1:0] = 11 force cck rxiq = 0*/\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1);\t\t/*/ 0xc08[16] = 1 force ofdm rxiq = ofdm txiq*/\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 1);\n\t\t\tPHY_SetBBReg(pAdapter, 0x0B34, BIT14, 1);\n\t\t}\n\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\t} else {\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t (\"SetCCKContinuousTx: test stop\\n\"));\n\n\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);\t/*/normal mode*/\n\t\twrite_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable);\t/*/turn on scramble setting*/\n\n\t\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter)  && !IS_HARDWARE_TYPE_8814A(pAdapter) /* && !IS_HARDWARE_TYPE_8822B(pAdapter) */) {\n\t\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0);/* rCCK0_RxHP 0xa15[1:0] = 2b00*/\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0);\t\t/*/ 0xc08[16] = 0*/\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 0);\n\t\t\tPHY_SetBBReg(pAdapter, 0x0B34, BIT14, 0);\n\t\t}\n\t\t\n\t\t/*/BB Reset*/\n\t\twrite_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\t\twrite_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n\t}\n\n\tpAdapter->mppriv.MptCtx.bCckContTx = bStart;\n\tpAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE;\n}\n\nvoid hal_mpt_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);\n\n\tif (bStart) {\n\t\tRT_TRACE(_module_mp_, _drv_info_, (\"SetOFDMContinuousTx: test start\\n\"));/*/ 1. if OFDM block on?*/\n\t\tif (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn))\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 1);/*/set OFDM block on*/\n\n\t\t/*/ 2. set CCK test mode off, set to CCK normal mode*/\n\t\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0);\n\n\t\t/*/ 3. turn on scramble setting*/\n\t\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 1);\n\n\t\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_8814A(pAdapter) /*&& !IS_HARDWARE_TYPE_8822B(pAdapter)*/) {\n\t\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3);\t\t\t/* rCCK0_RxHP 0xa15[1:0] = 2b'11*/\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1);\t\t/* 0xc08[16] = 1*/\n\t\t}\n\n\t\t/*/ 4. Turn On Continue Tx and turn off the other test modes.*/\n\t\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8814A(pAdapter) /*|| IS_HARDWARE_TYPE_8822B(pAdapter)*/)\n\t\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ContinuousTx);/*rSingleTone_ContTx_Jaguar*/\n\t\telse\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ContinuousTx);\n\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\t} else {\n\t\tRT_TRACE(_module_mp_, _drv_info_, (\"SetOFDMContinuousTx: test stop\\n\"));\n\t\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8814A(pAdapter) /*|| IS_HARDWARE_TYPE_8822B(pAdapter)*/)\n\t\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);\n\t\telse\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\t\t/*/Delay 10 ms*/\n\t\trtw_msleep_os(10);\n\t\t\n\t\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_8814A(pAdapter) /*&&! IS_HARDWARE_TYPE_8822B(pAdapter)*/) {\n\t\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0);/*/ 0xa15[1:0] = 0*/\n\t\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0);/*/ 0xc08[16] = 0*/\n\t\t}\n\t\t\n\t\t/*/BB Reset*/\n\t\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\t\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\n\t\twrite_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\t\twrite_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n\t}\n\n\tpAdapter->mppriv.MptCtx.bCckContTx = _FALSE;\n\tpAdapter->mppriv.MptCtx.bOfdmContTx = bStart;\n}\n\nvoid hal_mpt_SetContinuousTx(PADAPTER pAdapter, u8 bStart)\n{\n\tu8 Rate;\n\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t (\"SetContinuousTx: rate:%d\\n\", pAdapter->mppriv.rateidx));\n\n\tRate = HwRateToMPTRate(pAdapter->mppriv.rateidx);\n\tpAdapter->mppriv.MptCtx.bStartContTx = bStart;\n\n\tif (Rate <= MPT_RATE_11M)\n\t\thal_mpt_SetCCKContinuousTx(pAdapter, bStart);\n\telse if (Rate >= MPT_RATE_6M) \n\t\thal_mpt_SetOFDMContinuousTx(pAdapter, bStart);\n}\n\nu32 hal_mpt_query_phytxok(PADAPTER\tpAdapter)\n{\n\tPMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);\n\tRT_PMAC_TX_INFO PMacTxInfo = pMptCtx->PMacTxInfo;\n\tu16 count = 0;\n\n\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))\n\t\tcount = PHY_QueryBBReg(pAdapter, 0xF50, bMaskLWord); /* [15:0]*/\n\telse\n\t\tcount = PHY_QueryBBReg(pAdapter, 0xF50, bMaskHWord); /* [31:16]*/\n\n\tif (count > 50000) {\n\t\trtw_reset_phy_trx_ok_counters(pAdapter);\n\t\tpAdapter->mppriv.tx.sended += count;\n\t\tcount = 0;\n\t}\n\n\treturn pAdapter->mppriv.tx.sended + count;\n\n}\n\n#if\tdefined(CONFIG_RTL8814A) || defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B)\n/* for HW TX mode */\nstatic\tVOID mpt_StopCckContTx(\n\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu1Byte\t\t\tu1bReg;\n\n\tpMptCtx->bCckContTx = FALSE;\n\tpMptCtx->bOfdmContTx = FALSE;\n\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0);\t/*normal mode*/\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1);\t/*turn on scramble setting*/\n\n\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {\n\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0);\t\t\t/* 0xa15[1:0] = 2b00*/\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0);\t\t/* 0xc08[16] = 0*/\n\t\t\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 0);\n\t\tPHY_SetBBReg(pAdapter, 0x0B34, BIT14, 0);\n\t}\n\n\t/*BB Reset*/\n\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\n\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n\n}\t/* mpt_StopCckContTx */\n\n\nstatic\tVOID mpt_StopOfdmContTx(\n\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu1Byte\t\t\tu1bReg;\n\tu4Byte\t\t\tdata;\n\n\tpMptCtx->bCckContTx = FALSE;\n\tpMptCtx->bOfdmContTx = FALSE;\n\n\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_JAGUAR2(pAdapter))\n\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);\n\telse\n\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\n\trtw_mdelay_os(10);\n\n\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {\n\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0);\t\t\t/* 0xa15[1:0] = 0*/\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0);\t\t/* 0xc08[16] = 0*/\n\t}\n\n\t/*BB Reset*/\n\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);\n\tPHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);\n\n\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);\n\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);\n}\t/* mpt_StopOfdmContTx */\n\n\nstatic\tVOID mpt_StartCckContTx(\n\tPADAPTER\t\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\tu4Byte\t\t\tcckrate;\n\n\t/* 1. if CCK block on */\n\tif (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn))\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 1);/*set CCK block on*/\n\n\t/*Turn Off All Test Mode*/\n\tif (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter))\n\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);\n\telse\n\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);\n\n\tcckrate  = pAdapter->mppriv.rateidx;\n\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);\n\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2);\t/*transmit mode*/\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1);\t/*turn on scramble setting*/\n\n\tif (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter)) {\n\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3);\t\t\t/* 0xa15[1:0] = 11 force cck rxiq = 0*/\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1);\t\t/* 0xc08[16] = 1 force ofdm rxiq = ofdm txiq*/\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 1);\n\t\tPHY_SetBBReg(pAdapter, 0x0B34, BIT14, 1);\n\t}\n\n\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\tpMptCtx->bCckContTx = TRUE;\n\tpMptCtx->bOfdmContTx = FALSE;\n\t\n}\t/* mpt_StartCckContTx */\n\n\nstatic\tVOID mpt_StartOfdmContTx(\n\tPADAPTER\t\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\n\n\t/* 1. if OFDM block on?*/\n\tif (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn))\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 1);/*set OFDM block on*/\n\n\t/* 2. set CCK test mode off, set to CCK normal mode*/\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0);\n\n\t/* 3. turn on scramble setting*/\n\tPHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 1);\n\n\tif (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {\n\t\tPHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3);\t\t\t/* 0xa15[1:0] = 2b'11*/\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1);\t\t/* 0xc08[16] = 1*/\n\t}\n\n\t/* 4. Turn On Continue Tx and turn off the other test modes.*/\n\tif (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_JAGUAR2(pAdapter))\n\t\tPHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ContinuousTx);\n\telse\n\t\tPHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ContinuousTx);\n\t\n\tPHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);\n\tPHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);\n\n\tpMptCtx->bCckContTx = FALSE;\n\tpMptCtx->bOfdmContTx = TRUE;\n}\t/* mpt_StartOfdmContTx */\n\n\nVOID mpt_ProSetPMacTx(PADAPTER\tAdapter)\n{\n\tPMPT_CONTEXT\tpMptCtx\t\t=\t&(Adapter->mppriv.MptCtx);\n\tRT_PMAC_TX_INFO\tPMacTxInfo\t=\tpMptCtx->PMacTxInfo;\n\tu32\t\t\tu4bTmp;\n\n\tDbgPrint(\"SGI %d bSPreamble %d bSTBC %d bLDPC %d NDP_sound %d\\n\", PMacTxInfo.bSGI, PMacTxInfo.bSPreamble, PMacTxInfo.bSTBC, PMacTxInfo.bLDPC, PMacTxInfo.NDP_sound);\n\tDbgPrint(\"TXSC %d BandWidth %d PacketPeriod %d PacketCount %d PacketLength %d PacketPattern %d\\n\", PMacTxInfo.TX_SC, PMacTxInfo.BandWidth, PMacTxInfo.PacketPeriod, PMacTxInfo.PacketCount, PMacTxInfo.PacketLength, PMacTxInfo.PacketPattern);\n#if 0\n\tPRINT_DATA(\"LSIG \", PMacTxInfo.LSIG, 3);\n\tPRINT_DATA(\"HT_SIG\", PMacTxInfo.HT_SIG, 6);\n\tPRINT_DATA(\"VHT_SIG_A\", PMacTxInfo.VHT_SIG_A, 6);\n\tPRINT_DATA(\"VHT_SIG_B\", PMacTxInfo.VHT_SIG_B, 4);\n\tDbgPrint(\"VHT_SIG_B_CRC %x\\n\", PMacTxInfo.VHT_SIG_B_CRC);\n\tPRINT_DATA(\"VHT_Delimiter\", PMacTxInfo.VHT_Delimiter, 4);\n\n\tPRINT_DATA(\"Src Address\", Adapter->mac_addr, 6);\n\tPRINT_DATA(\"Dest Address\", PMacTxInfo.MacAddress, 6);\n#endif\n\n\tif (PMacTxInfo.bEnPMacTx == FALSE) {\n\t\tif (PMacTxInfo.Mode == CONTINUOUS_TX) {\n\t\t\tPHY_SetBBReg(Adapter, 0xb04, 0xf, 2);\t\t\t/*\tTX Stop*/\n\t\t\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))\n\t\t\t\tmpt_StopCckContTx(Adapter);\n\t\t\telse\n\t\t\t\tmpt_StopOfdmContTx(Adapter);\n\t\t} else if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {\n\t\t\tu4bTmp = PHY_QueryBBReg(Adapter, 0xf50, bMaskLWord);\n\t\t\tPHY_SetBBReg(Adapter, 0xb1c, bMaskLWord, u4bTmp+50);\n\t\t\tPHY_SetBBReg(Adapter, 0xb04, 0xf, 2);\t\t/*TX Stop*/\n\t\t} else\n\t\t\tPHY_SetBBReg(Adapter, 0xb04, 0xf, 2);\t\t/*\tTX Stop*/\n\n\t\tif (PMacTxInfo.Mode == OFDM_Single_Tone_TX) {\n\t\t\t/* Stop HW TX -> Stop Continuous TX -> Stop RF Setting*/\n\t\t\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))\n\t\t\t\tmpt_StopCckContTx(Adapter);\n\t\t\telse\n\t\t\t\tmpt_StopOfdmContTx(Adapter);\n\n\t\t\tmpt_SetSingleTone_8814A(Adapter, FALSE, TRUE);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (PMacTxInfo.Mode == CONTINUOUS_TX) {\n\t\tPMacTxInfo.PacketCount = 1;\n\n\t\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))\n\t\t\tmpt_StartCckContTx(Adapter);\n\t\telse\n\t\t\tmpt_StartOfdmContTx(Adapter);\n\t} else if (PMacTxInfo.Mode == OFDM_Single_Tone_TX) {\n\t\t/* Continuous TX -> HW TX -> RF Setting */\n\t\tPMacTxInfo.PacketCount = 1;\n\n\t\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))\n\t\t\tmpt_StartCckContTx(Adapter);\n\t\telse\n\t\t\tmpt_StartOfdmContTx(Adapter);\n\t} else if (PMacTxInfo.Mode == PACKETS_TX) {\n\t\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE) && PMacTxInfo.PacketCount == 0)\n\t\t\tPMacTxInfo.PacketCount = 0xffff;\n\t}\n\n\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {\n\t\t/* 0xb1c[0:15] TX packet count 0xb1C[31:16]\tSFD*/\n\t\tu4bTmp = PMacTxInfo.PacketCount|(PMacTxInfo.SFD << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb1c, bMaskDWord, u4bTmp);\n\t\t/* 0xb40 7:0 SIGNAL\t15:8 SERVICE\t31:16 LENGTH*/\n\t\tu4bTmp = PMacTxInfo.SignalField|(PMacTxInfo.ServiceField << 8)|(PMacTxInfo.LENGTH << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb40, bMaskDWord, u4bTmp);\n\t\tu4bTmp = PMacTxInfo.CRC16[0] | (PMacTxInfo.CRC16[1] << 8);\n\t\tPHY_SetBBReg(Adapter, 0xb44, bMaskLWord, u4bTmp);\n\n\t\tif (PMacTxInfo.bSPreamble)\n\t\t\tPHY_SetBBReg(Adapter, 0xb0c, BIT27, 0);\t\n\t\telse\n\t\t\tPHY_SetBBReg(Adapter, 0xb0c, BIT27, 1);\t\n\t} else {\n\t\tPHY_SetBBReg(Adapter, 0xb18, 0xfffff, PMacTxInfo.PacketCount);\n\n\t\tu4bTmp = PMacTxInfo.LSIG[0]|((PMacTxInfo.LSIG[1]) << 8)|((PMacTxInfo.LSIG[2]) << 16)|((PMacTxInfo.PacketPattern) << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb08, bMaskDWord, u4bTmp);\t/*\tSet 0xb08[23:0] = LSIG, 0xb08[31:24] =  Data init octet*/\n\n\t\tif (PMacTxInfo.PacketPattern == 0x12)\n\t\t\tu4bTmp = 0x3000000;\n\t\telse\n\t\t\tu4bTmp = 0;\n\t}\n\n\tif (IS_MPT_HT_RATE(PMacTxInfo.TX_RATE)) {\n\t\tu4bTmp |= PMacTxInfo.HT_SIG[0]|((PMacTxInfo.HT_SIG[1]) << 8)|((PMacTxInfo.HT_SIG[2]) << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb0c, bMaskDWord, u4bTmp);\n\t\tu4bTmp = PMacTxInfo.HT_SIG[3]|((PMacTxInfo.HT_SIG[4]) << 8)|((PMacTxInfo.HT_SIG[5]) << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb10, 0xffffff, u4bTmp);\n\t} else if (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE)) {\n\t\tu4bTmp |= PMacTxInfo.VHT_SIG_A[0]|((PMacTxInfo.VHT_SIG_A[1]) << 8)|((PMacTxInfo.VHT_SIG_A[2]) << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb0c, bMaskDWord, u4bTmp);\n\t\tu4bTmp = PMacTxInfo.VHT_SIG_A[3]|((PMacTxInfo.VHT_SIG_A[4]) << 8)|((PMacTxInfo.VHT_SIG_A[5]) << 16);\n\t\tPHY_SetBBReg(Adapter, 0xb10, 0xffffff, u4bTmp);\n\n\t\t_rtw_memcpy(&u4bTmp, PMacTxInfo.VHT_SIG_B, 4);\n\t\tPHY_SetBBReg(Adapter, 0xb14, bMaskDWord, u4bTmp);\n\t}\n\n\tif (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE)) {\n\t\tu4bTmp = (PMacTxInfo.VHT_SIG_B_CRC << 24)|PMacTxInfo.PacketPeriod;\t/* for TX interval */\n\t\tPHY_SetBBReg(Adapter, 0xb20, bMaskDWord, u4bTmp);\n\n\t\t_rtw_memcpy(&u4bTmp, PMacTxInfo.VHT_Delimiter, 4);\n\t\tPHY_SetBBReg(Adapter, 0xb24, bMaskDWord, u4bTmp);\n\n\t\t/* 0xb28 - 0xb34 24 byte Probe Request MAC Header*/\n\t\t/*& Duration & Frame control*/\n\t\tPHY_SetBBReg(Adapter, 0xb28, bMaskDWord, 0x00000040);\n\n\t\t/* Address1 [0:3]*/\n\t\tu4bTmp = PMacTxInfo.MacAddress[0]|(PMacTxInfo.MacAddress[1] << 8)|(PMacTxInfo.MacAddress[2] << 16)|(PMacTxInfo.MacAddress[3] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb2C, bMaskDWord, u4bTmp);\n\n\t\t/* Address3 [3:0]*/\n\t\tPHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);\n\n\t\t/* Address2[0:1] & Address1 [5:4]*/\n\t\tu4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8)|(Adapter->mac_addr[0] << 16)|(Adapter->mac_addr[1] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb30, bMaskDWord, u4bTmp);\n\n\t\t/* Address2 [5:2]*/\n\t\tu4bTmp = Adapter->mac_addr[2]|(Adapter->mac_addr[3] << 8)|(Adapter->mac_addr[4] << 16)|(Adapter->mac_addr[5] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb34, bMaskDWord, u4bTmp);\n\n\t\t/* Sequence Control & Address3 [5:4]*/\n\t\t/*u4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8) ;*/\n\t\t/*PHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);*/\n\t} else {\n\t\tPHY_SetBBReg(Adapter, 0xb20, bMaskDWord, PMacTxInfo.PacketPeriod);\t/* for TX interval*/\n\t\t/* & Duration & Frame control */\n\t\tPHY_SetBBReg(Adapter, 0xb24, bMaskDWord, 0x00000040);\n\n\t\t/* 0xb24 - 0xb38 24 byte Probe Request MAC Header*/\n\t\t/* Address1 [0:3]*/\n\t\tu4bTmp = PMacTxInfo.MacAddress[0]|(PMacTxInfo.MacAddress[1] << 8)|(PMacTxInfo.MacAddress[2] << 16)|(PMacTxInfo.MacAddress[3] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb28, bMaskDWord, u4bTmp);\n\n\t\t/* Address3 [3:0]*/\n\t\tPHY_SetBBReg(Adapter, 0xb34, bMaskDWord, u4bTmp);\n\n\t\t/* Address2[0:1] & Address1 [5:4]*/\n\t\tu4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8)|(Adapter->mac_addr[0] << 16)|(Adapter->mac_addr[1] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb2c, bMaskDWord, u4bTmp);\n\n\t\t/* Address2 [5:2] */\n\t\tu4bTmp = Adapter->mac_addr[2]|(Adapter->mac_addr[3] << 8)|(Adapter->mac_addr[4] << 16)|(Adapter->mac_addr[5] << 24);\n\t\tPHY_SetBBReg(Adapter, 0xb30, bMaskDWord, u4bTmp);\n\n\t\t/* Sequence Control & Address3 [5:4]*/\n\t\tu4bTmp = PMacTxInfo.MacAddress[4] | (PMacTxInfo.MacAddress[5] << 8);\n\t\tPHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);\n\t}\n\n\tPHY_SetBBReg(Adapter, 0xb48, bMaskByte3, PMacTxInfo.TX_RATE_HEX);\n\n\t/* 0xb4c 3:0 TXSC\t5:4\tBW\t7:6 m_STBC\t8 NDP_Sound*/\n\tu4bTmp = (PMacTxInfo.TX_SC)|((PMacTxInfo.BandWidth) << 4)|((PMacTxInfo.m_STBC - 1) << 6)|((PMacTxInfo.NDP_sound) << 8);\n\tPHY_SetBBReg(Adapter, 0xb4c, 0x1ff, u4bTmp);\n\n\tif (IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8822B(Adapter)) {\n\t\tu4Byte offset = 0xb44;\n\n\t\tif (IS_MPT_OFDM_RATE(PMacTxInfo.TX_RATE))\n\t\t\tPHY_SetBBReg(Adapter, offset, 0xc0000000, 0);\n\t\telse if (IS_MPT_HT_RATE(PMacTxInfo.TX_RATE))\n\t\t\tPHY_SetBBReg(Adapter, offset, 0xc0000000, 1);\n\t\telse if (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE))\n\t\t\tPHY_SetBBReg(Adapter, offset, 0xc0000000, 2);\n\t}\n\n\tPHY_SetBBReg(Adapter, 0xb00, BIT8, 1);\t\t/*\tTurn on PMAC*/\n/*\t//PHY_SetBBReg(Adapter, 0xb04, 0xf, 2);\t\t\t\t//TX Stop*/\n\tif (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {\n\t\tPHY_SetBBReg(Adapter, 0xb04, 0xf, 8);\t\t/*TX CCK ON*/\t\n\t\tPHY_SetBBReg(Adapter, 0xA84, BIT31, 0);\n\t} else\n\t\tPHY_SetBBReg(Adapter, 0xb04, 0xf, 4);\t\t/*\tTX Ofdm ON\t*/\n\n\tif (PMacTxInfo.Mode == OFDM_Single_Tone_TX)\n\t\tmpt_SetSingleTone_8814A(Adapter, TRUE, TRUE);\n\n}\n#endif /* CONFIG_MP_VHT_HW_TX_MODE */\n\n#endif /* CONFIG_MP_INCLUDE*/\n\n"
  },
  {
    "path": "hal/hal_phy.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HAL_PHY_C_\n\n#include <drv_types.h>\n\n//================================================================================\n//\tConstant.\n//================================================================================\n// 2008/11/20 MH For Debug only, RF\nstatic RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];\n\n/**\n* Function:\tPHY_CalculateBitShift\n*\n* OverView:\tGet shifted position of the BitMask\n*\n* Input:\n*\t\t\tu4Byte\t\tBitMask,\t\n*\n* Output:\tnone\n* Return:\t\tu4Byte\t\tReturn the shift bit bit position of the mask\n*/\nu32\nPHY_CalculateBitShift(\n\tu32 BitMask\n\t)\n{\n\tu32 i;\n\n\tfor(i=0; i<=31; i++)\n\t{\n\t\tif ( ((BitMask>>i) &  0x1 ) == 1)\n\t\t\tbreak;\n\t}\n\n\treturn (i);\n}\n\n\n//\n// ==> RF shadow Operation API Code Section!!!\n//\n/*-----------------------------------------------------------------------------\n * Function:\tPHY_RFShadowRead\n *\t\t\t\tPHY_RFShadowWrite\n *\t\t\t\tPHY_RFShadowCompare\n *\t\t\t\tPHY_RFShadowRecorver\n *\t\t\t\tPHY_RFShadowCompareAll\n *\t\t\t\tPHY_RFShadowRecorverAll\n *\t\t\t\tPHY_RFShadowCompareFlagSet\n *\t\t\t\tPHY_RFShadowRecorverFlagSet\n *\n * Overview:\tWhen we set RF register, we must write shadow at first.\n *\t\t\tWhen we are running, we must compare shadow abd locate error addr.\n *\t\t\tDecide to recorver or not.\n *\n * Input:       NONE\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Revised History:\n * When\t\t\tWho\t\tRemark\n * 11/20/2008 \tMHC\t\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nu32\nPHY_RFShadowRead(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset)\n{\n\treturn\tRF_Shadow[eRFPath][Offset].Value;\n\n}\t/* PHY_RFShadowRead */\n\n\nVOID\nPHY_RFShadowWrite(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu32\t\t\t\tData)\n{\n\tRF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);\n\tRF_Shadow[eRFPath][Offset].Driver_Write = _TRUE;\n\n}\t/* PHY_RFShadowWrite */\n\n\nBOOLEAN\nPHY_RFShadowCompare(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset)\n{\n\tu32\treg;\n\t// Check if we need to check the register\n\tif (RF_Shadow[eRFPath][Offset].Compare == _TRUE)\n\t{\n\t\treg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);\n\t\t// Compare shadow and real rf register for 20bits!!\n\t\tif (RF_Shadow[eRFPath][Offset].Value != reg)\n\t\t{\n\t\t\t// Locate error position.\n\t\t\tRF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE;\n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD,\n\t\t\t//(\"PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\\n\",\n\t\t\t//eRFPath, Offset, reg));\n\t\t}\n\t\treturn RF_Shadow[eRFPath][Offset].ErrorOrNot ;\n\t}\n\treturn _FALSE;\n}\t/* PHY_RFShadowCompare */\n\n\nVOID\nPHY_RFShadowRecorver(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset)\n{\n\t// Check if the address is error\n\tif (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE)\n\t{\n\t\t// Check if we need to recorver the register.\n\t\tif (RF_Shadow[eRFPath][Offset].Recorver == _TRUE)\n\t\t{\n\t\t\trtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,\n\t\t\t\t\t\t\tRF_Shadow[eRFPath][Offset].Value);\n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD,\n\t\t\t//(\"PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx\",\n\t\t\t//eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value));\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowRecorver */\n\n\nVOID\nPHY_RFShadowCompareAll(\n\tIN\tPADAPTER\t\t\tAdapter)\n{\n\tu8\t\teRFPath = 0 ;\n\tu32\t\tOffset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);\n\n\tfor (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)\n\t{\n\t\tfor (Offset = 0; Offset < maxReg; Offset++)\n\t\t{\n\t\t\tPHY_RFShadowCompare(Adapter, eRFPath, Offset);\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowCompareAll */\n\n\nVOID\nPHY_RFShadowRecorverAll(\n\tIN\tPADAPTER\t\t\tAdapter)\n{\n\tu8\t\teRFPath =0;\n\tu32\t\tOffset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);\n\n\tfor (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)\n\t{\n\t\tfor (Offset = 0; Offset < maxReg; Offset++)\n\t\t{\n\t\t\tPHY_RFShadowRecorver(Adapter, eRFPath, Offset);\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowRecorverAll */\n\n\nVOID\nPHY_RFShadowCompareFlagSet(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu8\t\t\t\tType)\n{\n\t// Set True or False!!!\n\tRF_Shadow[eRFPath][Offset].Compare = Type;\n\n}\t/* PHY_RFShadowCompareFlagSet */\n\n\nVOID\nPHY_RFShadowRecorverFlagSet(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu8\t\t\t\tType)\n{\n\t// Set True or False!!!\n\tRF_Shadow[eRFPath][Offset].Recorver= Type;\n\n}\t/* PHY_RFShadowRecorverFlagSet */\n\n\nVOID\nPHY_RFShadowCompareFlagSetAll(\n\tIN\tPADAPTER\t\t\tAdapter)\n{\n\tu8\t\teRFPath = 0;\n\tu32\t\tOffset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);\n\n\tfor (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)\n\t{\n\t\tfor (Offset = 0; Offset < maxReg; Offset++)\n\t\t{\n\t\t\t// 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!\n\t\t\tif (Offset != 0x26 && Offset != 0x27)\n\t\t\t\tPHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _FALSE);\n\t\t\telse\n\t\t\t\tPHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _TRUE);\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowCompareFlagSetAll */\n\n\nVOID\nPHY_RFShadowRecorverFlagSetAll(\n\tIN\tPADAPTER\t\t\tAdapter)\n{\n\tu8\t\teRFPath = 0;\n\tu32\t\tOffset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);\n\n\tfor (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)\n\t{\n\t\tfor (Offset = 0; Offset < maxReg; Offset++)\n\t\t{\n\t\t\t// 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!\n\t\t\tif (Offset != 0x26 && Offset != 0x27)\n\t\t\t\tPHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _FALSE);\n\t\t\telse\n\t\t\t\tPHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _TRUE);\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowCompareFlagSetAll */\n\nVOID\nPHY_RFShadowRefresh(\n\tIN\tPADAPTER\t\t\tAdapter)\n{\n\tu8\t\teRFPath = 0;\n\tu32\t\tOffset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);\n\n\tfor (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)\n\t{\n\t\tfor (Offset = 0; Offset < maxReg; Offset++)\n\t\t{\n\t\t\tRF_Shadow[eRFPath][Offset].Value = 0;\n\t\t\tRF_Shadow[eRFPath][Offset].Compare = _FALSE;\n\t\t\tRF_Shadow[eRFPath][Offset].Recorver  = _FALSE;\n\t\t\tRF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE;\n\t\t\tRF_Shadow[eRFPath][Offset].Driver_Write = _FALSE;\n\t\t}\n\t}\n\n}\t/* PHY_RFShadowRead */\n\n\n"
  },
  {
    "path": "hal/led/hal_usb_led.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n//\n//\tDescription:\n//\t\tImplementation of LED blinking behavior.\n//\t\tIt toggle off LED and schedule corresponding timer if necessary.\n//\nvoid\nSwLedBlink(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t*padapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,( \"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\t// Determine if we shall change LED state again.\n\tpLed->BlinkTimes--;\n\tswitch(pLed->CurrLedState)\n\t{\n\n\tcase LED_BLINK_NORMAL:\n\t\tif(pLed->BlinkTimes == 0)\n\t\t{\n\t\t\tbStopBlinking = _TRUE;\n\t\t}\n\t\tbreak;\n\n\tcase LED_BLINK_StartToBlink:\n\t\tif( check_fwstate(pmlmepriv, _FW_LINKED) && check_fwstate(pmlmepriv, WIFI_STATION_STATE) )\n\t\t{\n\t\t\tbStopBlinking = _TRUE;\n\t\t}\n\t\tif( check_fwstate(pmlmepriv, _FW_LINKED) &&\n\t\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) )\n\t\t{\n\t\t\tbStopBlinking = _TRUE;\n\t\t}\n\t\telse if(pLed->BlinkTimes == 0)\n\t\t{\n\t\t\tbStopBlinking = _TRUE;\n\t\t}\n\t\tbreak;\n\n\tcase LED_BLINK_WPS:\n\t\tif( pLed->BlinkTimes == 0 )\n\t\t{\n\t\t\tbStopBlinking = _TRUE;\n\t\t}\n\t\tbreak;\n\n\n\tdefault:\n\t\tbStopBlinking = _TRUE;\n\t\tbreak;\n\n\t}\n\n\tif(bStopBlinking)\n\t{\n\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t{\n\t\t\tSwLedOff(padapter, pLed);\n\t\t}\n\t\telse if( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (pLed->bLedOn == _FALSE))\n\t\t{\n\t\t\tSwLedOn(padapter, pLed);\n\t\t}\n\t\telse if( (check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE) &&  pLed->bLedOn == _TRUE)\n\t\t{\n\t\t\tSwLedOff(padapter, pLed);\n\t\t}\n\n\t\tpLed->BlinkTimes = 0;\n\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t}\n\telse\n\t{\n\t\t// Assign LED state to toggle.\n\t\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\telse\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t// Schedule a timer to toggle LED state.\n\t\tswitch( pLed->CurrLedState )\n\t\t{\n\t\tcase LED_BLINK_NORMAL:\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SLOWLY:\n\t\tcase LED_BLINK_StartToBlink:\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\t{\n\t\t\t\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);\n\t\t\t\telse\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nvoid\nSwLedBlink1(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t\t*padapter = pLed->padapter;\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(padapter);\n\tstruct led_priv\t\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t\t*pmlmepriv = &(padapter->mlmepriv);\n\tPLED_USB \t\t\tpLed1 = &(ledpriv->SwLed1);\n\tu8\t\t\t\t\tbStopBlinking = _FALSE;\n\n\tu32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha\n\tif(pHalData->CustomerID == RT_CID_819x_ALPHA_Dlink)\n\t\tuLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS;\n\t\n\tif(pHalData->CustomerID == RT_CID_819x_CAMEO)\n\t\tpLed = &(ledpriv->SwLed1);\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,( \"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\n\tif(pHalData->CustomerID == RT_CID_DEFAULT)\n\t{\n\t\tif(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t{\n\t\t\tif(!pLed1->bSWLedCtrl)\n\t\t\t{\n\t\t\t\tSwLedOn(padapter, pLed1);\n\t\t\t\tpLed1->bSWLedCtrl = _TRUE;\n\t\t\t}\n\t\t\telse if(!pLed1->bLedOn)\n\t\t\t\tSwLedOn(padapter, pLed1);\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (): turn on pLed1\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(!pLed1->bSWLedCtrl)\n\t\t\t{\n\t\t\t\tSwLedOff(padapter, pLed1);\n\t\t\t\tpLed1->bSWLedCtrl = _TRUE;\n\t\t\t}\n\t\t\telse if(pLed1->bLedOn)\n\t\t\t\tSwLedOff(padapter, pLed1);\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (): turn off pLed1\\n\"));\n\t\t}\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SLOWLY:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_NORMAL:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_NORMAL;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_NORMAL;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->BlinkTimes = 0;\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS success\n\t\t\tif(pLed->BlinkingLedState == RTW_LED_ON)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);\n\t\t\t\tbStopBlinking = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_NORMAL;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\n\nvoid\nSwLedBlink2(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t\t*padapter = pLed->padapter;\n\tstruct mlme_priv\t\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8\t\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON)\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tSwLedOn(padapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"stop scan blink CurrLedState %d\\n\", pLed->CurrLedState));\n\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"stop scan blink CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tSwLedOn(padapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"stop CurrLedState %d\\n\", pLed->CurrLedState));\n\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"stop CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\n\nvoid\nSwLedBlink3(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t*padapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tif(pLed->CurrLedState != LED_BLINK_WPS_STOP)\n\t\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tif( !pLed->bLedOn )\n\t\t\t\t\t\tSwLedOn(padapter, pLed);\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tSwLedOff(padapter, pLed);\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t \tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t\t\tif( !pLed->bLedOn )\n\t\t\t\t\t\tSwLedOn(padapter, pLed);\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tSwLedOff(padapter, pLed);\n\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS success\n\t\t\tif(pLed->BlinkingLedState == RTW_LED_ON)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);\n\t\t\t\tbStopBlinking = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tSwLedOn(padapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\n\n\nvoid\nSwLedBlink4(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t*padapter = pLed->padapter;\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tPLED_USB \t\tpLed1 = &(ledpriv->SwLed1);\n\tu8\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tif(!pLed1->bLedWPSBlinkInProgress && pLed1->BlinkingLedState == LED_UNKNOWN)\n\t{\n\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\tSwLedOff(padapter, pLed1);\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SLOWLY:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_StartToBlink:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _FALSE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS authentication fail\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP_OVERLAP:\t//WPS session overlap\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif(pLed->BlinkTimes == 0)\n\t\t\t{\n\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkTimes = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tpLed->BlinkTimes = 10;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_ALWAYS_ON:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"RFOff Status \\n\"));\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink4 CurrLedState %d\\n\", pLed->CurrLedState));\n\n\n}\n\nvoid\nSwLedBlink5(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t*padapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\tif(!pLed->bLedOn)\n\t\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tif(!pLed->bLedOn)\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(padapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink5 CurrLedState %d\\n\", pLed->CurrLedState));\n\n\n}\n\nvoid\nSwLedBlink6(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\t_adapter\t\t\t*padapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8\t\t\t\tbStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(padapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink6\\n\"));\n}\n\nvoid\nSwLedBlink7(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tif(pLed->CurrLedState != LED_BLINK_WPS_STOP)\n\t\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tif( !pLed->bLedOn )\n\t\t\t\t\t\tSwLedOn(Adapter, pLed);\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tSwLedOff(Adapter, pLed);\n\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t \tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS success\n\t\t\tif(pLed->BlinkingLedState == RTW_LED_ON)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t\tbStopBlinking = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink7\\n\"));\n\n}\n\nvoid\nSwLedBlink8(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes blink8(%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes blink8(%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink8\\n\"));\n\n}\n\n//page added for Belkin AC950. 20120813\nvoid\nSwLedBlink9(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter; \n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON ) \n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse \n\t{\n\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\t\n\t//DBG_871X(\"%s, pLed->CurrLedState=%d, pLed->BlinkingLedState=%d \\n\", __FUNCTION__, pLed->CurrLedState, pLed->BlinkingLedState);\n\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase RTW_LED_ON:\n\t\t\tSwLedOn(Adapter, pLed);\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTW_LED_OFF:\n\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tbreak;\n\t\t\t\n\t\tcase LED_BLINK_SLOWLY:\t\t\t\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_StartToBlink:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\t\t\t\n\t\t\t\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\t\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tpLed->BlinkTimes = 0;\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS authentication fail\n\t\t\tif( pLed->bLedOn )\t\t\t\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \t\t\t\n\t\t\telse\t\t\t\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP_OVERLAP:\t//WPS session overlap\t\t\n\t\t\tpLed->BlinkTimes--;\n\t\t\tpLed->BlinkCounter --;\n\t\t\tif(pLed->BlinkCounter == 0)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pLed->BlinkTimes == 0)\n\t\t\t\t{\n\t\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkTimes = 1;\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(bStopBlinking)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tpLed->BlinkTimes = 10;\t\t\t\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \t\t\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\t\t\t\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\t\t\n\t\t\t\t\telse\t\t\t\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase LED_BLINK_ALWAYS_ON:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_ALWAYS_ON;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t}\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"RFOff Status \\n\"));\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t}\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_LINK_IN_PROCESS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_AUTH_ERROR:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking == _FALSE)\n\t\t\t{\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink9 CurrLedState %d\\n\", pLed->CurrLedState));\t\t\t\t\t\n}\n\n//page added for Netgear A6200V2. 20120827\nvoid\nSwLedBlink10(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase RTW_LED_ON:\n\t\t\tSwLedOn(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tcase RTW_LED_OFF:\n\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SLOWLY:\t\t\t\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_StartToBlink:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SCAN:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on )\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t\t}\n\t\t\t\tpLed->BlinkTimes = 0;\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR+LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS authentication fail\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\t\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP_OVERLAP:\t//WPS session overlap\n\t\t\tpLed->BlinkTimes--;\n\t\t\tpLed->BlinkCounter --;\n\t\t\tif(pLed->BlinkCounter == 0)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pLed->BlinkTimes == 0)\n\t\t\t\t{\n\t\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkTimes = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(bStopBlinking)\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkTimes = 10;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\t\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_ALWAYS_ON:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_ALWAYS_ON;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t}\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"RFOff Status \\n\"));\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t}\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_LINK_IN_PROCESS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ON_BELKIN);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_OFF_BELKIN);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_AUTH_ERROR:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking == _FALSE)\n\t\t\t{\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_ERROR_INTERVAL_BELKIN);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink10 CurrLedState %d\\n\", pLed->CurrLedState));\n\n}\n\nvoid\nSwLedBlink11(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_TXRX:\n\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t{\n\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif(pLed->BlinkTimes == 5)\n\t\t\t{\n\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_CM11_LINK_ON_INTERVEL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_CM11_BLINK_INTERVAL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking == _TRUE)\n\t\t\t\tpLed->BlinkTimes = 5;\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS authentication fail\n\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t{\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink5 CurrLedState %d\\n\", pLed->CurrLedState));\n}\n\nvoid\nSwLedBlink12(\n\tPLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%ld): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse\n\t{\n\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%ld): turn off\\n\", pLed->BlinkTimes));\n\t}\n\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_SLOWLY:\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif(pLed->bLedOn)\n\t\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t\t}\n\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t if( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SwLedBlink8 CurrLedState %d\\n\", pLed->CurrLedState));\n\n\n}\n\nVOID\nSwLedBlink13(\n\tIN PLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\tstatic u8\tLinkBlinkCnt=0;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON ) \n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse \n\t{\n\t\tif(pLed->CurrLedState != LED_BLINK_WPS_STOP)\n\t\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\t\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"!!! SwLedBlink13 CurrLedState %d, bLedWPSBlinkInProgress %d, bLedBlinkInProgress %d\\n\", pLed->CurrLedState,pLed->bLedWPSBlinkInProgress,pLed->bLedBlinkInProgress));\n\tswitch(pLed->CurrLedState)\n\t{\t\t\t\n\t\tcase LED_BLINK_LINK_IN_PROCESS:\n\t\t\tif(!pLed->bLedWPSBlinkInProgress)\n\t\t\t\tLinkBlinkCnt++;\n\t\t\t\n\t\t\tif(LinkBlinkCnt>15)\n\t\t\t{\n\t\t\t\tLinkBlinkCnt=0;\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 500);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 500);\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS success\n\t\t\tSwLedOff(Adapter, pLed);\t\n\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\n\t\t\tbreak;\n\t\t\t\t\t\n\t\tdefault:\n\t\t\tLinkBlinkCnt=0;\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink13\\n\"));\n\n}\n\nVOID\nSwLedBlink14(\n\tIN PLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\tstatic u8\tLinkBlinkCnt=0;\n\n\t// Change LED according to BlinkingLedState specified.\n\tif( pLed->BlinkingLedState == RTW_LED_ON )\n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse \n\t{\n\t\tif(pLed->CurrLedState != LED_BLINK_WPS_STOP)\n\t\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\t\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"!!! SwLedBlink14 CurrLedState %d, bLedWPSBlinkInProgress %d, bLedBlinkInProgress %d\\n\", pLed->CurrLedState,pLed->bLedWPSBlinkInProgress,pLed->bLedBlinkInProgress));\n\tswitch(pLed->CurrLedState)\n\t{\t\t\t\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\tif (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\tif (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t\t\t\t\n\t\tdefault:\n\t\t\tLinkBlinkCnt=0;\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink14\\n\"));\n}\n\nVOID\nSwLedBlink15(\n\tIN PLED_USB\t\t\tpLed\n\t)\n{\n\tPADAPTER Adapter = pLed->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN bStopBlinking = _FALSE;\n\tstatic u8\tLinkBlinkCnt=0;\n\t// Change LED according to BlinkingLedState specified.\n\t\n\tif( pLed->BlinkingLedState == RTW_LED_ON ) \n\t{\n\t\tSwLedOn(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn on\\n\", pLed->BlinkTimes));\n\t}\n\telse \n\t{\n\t\tif(pLed->CurrLedState != LED_BLINK_WPS_STOP)\n\t\t\tSwLedOff(Adapter, pLed);\n\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Blinktimes (%d): turn off\\n\", pLed->BlinkTimes));\n\t}\t\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"!!! SwLedBlink15 CurrLedState %d, bLedWPSBlinkInProgress %d, bLedBlinkInProgress %d\\n\", pLed->CurrLedState,pLed->bLedWPSBlinkInProgress,pLed->bLedBlinkInProgress));\n\tswitch(pLed->CurrLedState)\n\t{\n\t\tcase LED_BLINK_WPS:\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_DLINK);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_DLINK);\n\t\t\t}\n\t\t\tbreak;\n\t\n\t\tcase LED_BLINK_WPS_STOP:\t//WPS success\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"blink15, LED_BLINK_WPS_STOP  BlinkingLedState %d\\n\",pLed->BlinkingLedState));\n\t\t\t\n\t\t\tif(pLed->BlinkingLedState == RTW_LED_OFF)\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_LINKED_ON_INTERVAL_DLINK);\t\t\t\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_NO_LINK:\n\t\t\t{\n\t\t\t\tstatic BOOLEAN\t\tbLedOn=_TRUE;\n\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"blink15, LED_NO_LINK_BLINK  bLedOn %d\\n\",bLedOn));\n\t\t\t\tif(bLedOn)\n\t\t\t\t{\n\t\t\t\t\tbLedOn=_FALSE;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbLedOn=_TRUE;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_LINK_IDEL:\n\t\t\t{\n\t\t\t\tstatic BOOLEAN\t\tbLedOn=_TRUE;\n\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"blink15, LED_BLINK_LINK_IDEL  bLedOn %d\\n\",bLedOn));\n\t\t\t\tif(bLedOn)\n\t\t\t\t{\n\t\t\t\t\tbLedOn=_FALSE;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbLedOn=_TRUE;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_IDEL_INTERVAL);\n\t\t\t}\t\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_SCAN:\n\t\t\t{\n\t\t\t\tstatic u8\tBlinkTime=0;\n\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"blink15, LED_SCAN_BLINK  bLedOn %d\\n\",BlinkTime));\n\t\t\t\tif(BlinkTime %2==0)\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t}\n\t\t\t\tBlinkTime ++;\n\n\t\t\t\tif(BlinkTime<24)\n\t\t\t\t{\n\t\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\t\t\n\t\t\t\t\tif(pLed->BlinkingLedState == RTW_LED_ON)\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_OFF_INTERVAL);\n\t\t\t\t\telse\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_ON_INTERVAL);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//if(pLed->OLDLedState ==LED_NO_LINK_BLINK)\n\t\t\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED)== _FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_NO_LINK;\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\t\n\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 100);\n\t\t\t\t\t}\n\t\t\t\t\tBlinkTime =0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_BLINK_TXRX:\n\t\t\tpLed->BlinkTimes--;\n\t\t\tif( pLed->BlinkTimes == 0 )\n\t\t\t{\n\t\t\t\tbStopBlinking = _TRUE;\n\t\t\t}\n\t\t\tif(bStopBlinking)\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( adapter_to_pwrctl(Adapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(Adapter)->rfoff_reason > RF_CHANGE_BY_PS)\n\t\t\t\t{\n\t\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tLinkBlinkCnt=0;\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"<==== blink15\\n\"));\n}\n\n//\n//\tDescription:\n//\t\tHandler function of LED Blinking.\n//\t\tWe dispatch acture LED blink action according to LedStrategy.\n//\nvoid BlinkHandler(PLED_USB pLed)\n{\n\t_adapter\t\t*padapter = pLed->padapter;\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\n\t//DBG_871X(\"%s (%s:%d)\\n\",__FUNCTION__, current->comm, current->pid);\n\n\tif (RTW_CANNOT_RUN(padapter) || (!rtw_is_hw_init_completed(padapter))) {\n\t\t/*DBG_871X(\"%s bDriverStopped:%s, bSurpriseRemoved:%s\\n\"\n\t\t, __func__\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\" );*/\n\t\treturn;\n\t}\n\n\tswitch(ledpriv->LedStrategy)\n\t{\n\t\tcase SW_LED_MODE0:\n\t\t\tSwLedBlink(pLed);\n\t\t\tbreak;\n\t\t\n\t\tcase SW_LED_MODE1:\n\t\t\tSwLedBlink1(pLed);\n\t\t\tbreak;\n\t\t\n\t\tcase SW_LED_MODE2:\n\t\t\tSwLedBlink2(pLed);\n\t\t\tbreak;\n\t\t\t\n\t\tcase SW_LED_MODE3:\n\t\t\tSwLedBlink3(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE4:\n\t\t\tSwLedBlink4(pLed);\n\t\t\tbreak;\t\t\t\n\n\t\tcase SW_LED_MODE5:\n\t\t\tSwLedBlink5(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE6:\n\t\t\tSwLedBlink6(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE7:\n\t\t\tSwLedBlink7(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE8:\n\t\t\tSwLedBlink8(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE9:\n\t\t\tSwLedBlink9(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE10:\n\t\t\tSwLedBlink10(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE11:\n\t\t\tSwLedBlink11(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE12:\n\t\t\tSwLedBlink12(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE13:\n\t\t\tSwLedBlink13(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE14:\n\t\t\tSwLedBlink14(pLed);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE15:\n\t\t\tSwLedBlink15(pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"BlinkWorkItemCallback 0x%x \\n\", ledpriv->LedStrategy));\n\t\t\t//SwLedBlink(pLed);\n\t\t\tbreak;\n\t}\n}\n\n//\n//\tDescription:\n//\t\tCallback function of LED BlinkTimer, \n//\t\tit just schedules to corresponding BlinkWorkItem/led_blink_hdl\n//\nvoid BlinkTimerCallback(void *data)\n{\n\tPLED_USB\t pLed = (PLED_USB)data;\n\t_adapter\t\t*padapter = pLed->padapter;\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tif (RTW_CANNOT_RUN(padapter) || (!rtw_is_hw_init_completed(padapter))) {\n\t\t/*DBG_871X(\"%s bDriverStopped:%s, bSurpriseRemoved:%s\\n\"\n\t\t\t, __func__\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\" );*/\n\t\treturn;\n\t}\n\n\t#ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD\n\trtw_led_blink_cmd(padapter, (PVOID)pLed);\n\t#else\n\t_set_workitem(&(pLed->BlinkWorkItem));\n\t#endif\n}\n\n//\n//\tDescription:\n//\t\tCallback function of LED BlinkWorkItem.\n//\t\tWe dispatch acture LED blink action according to LedStrategy.\n//\nvoid BlinkWorkItemCallback(_workitem *work)\n{\n\tPLED_USB\t pLed = container_of(work, LED_USB, BlinkWorkItem);\n\tBlinkHandler(pLed);\n}\n\nstatic void\nSwLedControlMode0(\n\t_adapter\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tPLED_USB\tpLed = &(ledpriv->SwLed1);\n\n\t// Decide led state\n\tswitch(LedAction)\n\t{\n\tcase LED_CTL_TX:\n\tcase LED_CTL_RX:\n\t\tif( pLed->bLedBlinkInProgress == _FALSE )\n\t\t{\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\n\t\t\tpLed->CurrLedState = LED_BLINK_NORMAL;\n\t\t\tpLed->BlinkTimes = 2;\n\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t}\n\t\tbreak;\n\n\tcase LED_CTL_START_TO_LINK:\n\t\tif( pLed->bLedBlinkInProgress == _FALSE )\n\t\t{\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\n\t\t\tpLed->CurrLedState = LED_BLINK_StartToBlink;\n\t\t\tpLed->BlinkTimes = 24;\n\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpLed->CurrLedState = LED_BLINK_StartToBlink;\n\t\t}\n\t\tbreak;\n\n\tcase LED_CTL_LINK:\n\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\tif( pLed->bLedBlinkInProgress == _FALSE )\n\t\t{\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t}\n\t\tbreak;\n\n\tcase LED_CTL_NO_LINK:\n\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\tif( pLed->bLedBlinkInProgress == _FALSE )\n\t\t{\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t}\n\t\tbreak;\n\n\tcase LED_CTL_POWER_OFF:\n\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\tif(pLed->bLedBlinkInProgress)\n\t\t{\n\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t}\n\t\tSwLedOff(padapter, pLed);\n\t\tbreak;\n\n\tcase LED_CTL_START_WPS:\n\t\tif( pLed->bLedBlinkInProgress == _FALSE || pLed->CurrLedState == RTW_LED_ON)\n\t\t{\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\tpLed->BlinkTimes = 20;\n\n\t\t\tif( pLed->bLedOn )\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LONG_INTERVAL);\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase LED_CTL_STOP_WPS:\n\t\tif(pLed->bLedBlinkInProgress)\n\t\t{\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t}\n\t\tbreak;\n\n\n\tdefault:\n\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led %d\\n\", pLed->CurrLedState));\n\n}\n\n //ALPHA, added by chiyoko, 20090106\nstatic void\nSwLedControlMode1(\n\t_adapter\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t\t*ledpriv = &(padapter->ledpriv);\n\tPLED_USB\t\t\tpLed = &(ledpriv->SwLed0);\n\tstruct mlme_priv\t\t*pmlmepriv = &(padapter->mlmepriv);\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(padapter);\n\n\tu32 uLedBlinkNoLinkInterval = LED_BLINK_NO_LINK_INTERVAL_ALPHA; //add by ylb 20121012 for customer led for alpha\n\tif(pHalData->CustomerID == RT_CID_819x_ALPHA_Dlink)\n\t\tuLedBlinkNoLinkInterval= LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS;\t\n\t\n\tif(pHalData->CustomerID == RT_CID_819x_CAMEO)\n\t\tpLed = &(ledpriv->SwLed1);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_POWER_ON:\n\t\tcase LED_CTL_START_TO_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif( pLed->bLedLinkBlinkInProgress == _TRUE )\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\t\tif( pLed->bLedLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\t\t\t\tpLed->bLedLinkBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_NORMAL;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\t if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t\t\t \t;\n\t\t\t else if(pLed->bLedScanBlinkInProgress ==_FALSE)\n\t\t\t {\n\t\t\t \tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\n\t  \t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif( pLed->bLedLinkBlinkInProgress == _TRUE )\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\t pLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t\tif (adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on && adapter_to_pwrctl(padapter)->rfoff_reason == RF_CHANGE_BY_IPS)\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_INITIAL_INTERVAL);\n\t\t\t\telse\t\t\t\t\t\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\n\t\t\t }\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t\t\tif(pLed->bLedBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif( pLed->bLedLinkBlinkInProgress == _TRUE )\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\t if(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t {\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif( pLed->bLedLinkBlinkInProgress == _TRUE )\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\t pLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t }\n\t\t\tbreak;\n\n\n\t\tcase LED_CTL_STOP_WPS:\n\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedLinkBlinkInProgress == _TRUE )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t pLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tif(pLed->bLedOn)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), uLedBlinkNoLinkInterval);//change by ylb 20121012 for customer led for alpha\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(padapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led %d\\n\", pLed->CurrLedState));\n}\n\n //Arcadyan/Sitecom , added by chiyoko, 20090216\nstatic void\nSwLedControlMode2(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tPLED_USB \t\tpLed = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\t if(pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\t \t;\n\t\t\t else if(pLed->bLedScanBlinkInProgress ==_FALSE)\n\t\t\t {\n\t\t\t \tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\n\t \t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t }\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t  \t\t{\n\t  \t\t  \tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t }\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS:\n\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tif(adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on)\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\n\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_TO_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif(!IS_LED_BLINKING(pLed))\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(padapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n}\n\n  //COREGA, added by chiyoko, 20090316\n static void\n SwLedControlMode3(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tPLED_USB\t\tpLed = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\tif(pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\t\t;\n\t\t\telse if(pLed->bLedScanBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif((pLed->bLedBlinkInProgress ==_FALSE) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t  \t\t{\n\t  \t\t  \tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\treturn;\n\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tif(pLed->bLedOn)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_TO_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif(!IS_LED_BLINKING(pLed))\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(padapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"CurrLedState %d\\n\", pLed->CurrLedState));\n}\n\n\n //Edimax-Belkin, added by chiyoko, 20090413\nstatic void\nSwLedControlMode4(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tPLED_USB\t\tpLed = &(ledpriv->SwLed0);\n\tPLED_USB\t\tpLed1 = &(ledpriv->SwLed1);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_START_TO_LINK:\n\t\t\tif(pLed1->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\n\t\t\t\tif(pLed1->bLedOn)\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\n\t\t\tif( pLed->bLedStartToLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\t \t\t\tif(pLed->bLedNoLinkBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t \t\t\t}\n\n\t\t\t\tpLed->bLedStartToLinkBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_StartToBlink;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\t//LED1 settings\n\t\t\tif(LedAction == LED_CTL_LINK)\n\t\t\t{\n\t\t\t\tif(pLed1->bLedWPSBlinkInProgress)\n\t\t\t\t{\n\t\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\n\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\n\t\t\t\t\tif(pLed1->bLedOn)\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\tif((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t\t\t\t;\n\t\t\telse if(pLed->bLedScanBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif(pLed->bLedBlinkInProgress ==_FALSE)\n\t  \t\t{\n\t  \t\t  \tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t  \t\t  \tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tif(pLed1->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\n\t\t\t\tif(pLed1->bLedOn)\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS:\t//WPS connect success\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\t\t//WPS authentication fail\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\n\t\t\t//LED1 settings\n\t\t\tif(pLed1->bLedWPSBlinkInProgress)\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\telse\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _TRUE;\n\n\t\t\tpLed1->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tif( pLed1->bLedOn )\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL_OVERLAP:\t//WPS session overlap\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\n\t\t\t//LED1 settings\n\t\t\tif(pLed1->bLedWPSBlinkInProgress)\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\telse\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _TRUE;\n\n\t\t\tpLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;\n\t\t\tpLed1->BlinkTimes = 10;\n\t\t\tif( pLed1->bLedOn )\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedStartToLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedStartToLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tif( pLed1->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed1->BlinkingLedState = LED_UNKNOWN;\n\t\t\tSwLedOff(padapter, pLed);\n\t\t\tSwLedOff(padapter, pLed1);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_CONNECTION_NO_TRANSFER:\n\t\t\t if(pLed->bLedBlinkInProgress == _FALSE)\n\t\t\t {\n\t\t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\n\t\t\t \tpLed->CurrLedState = LED_BLINK_ALWAYS_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led %d\\n\", pLed->CurrLedState));\n}\n\n\n\n //Sercomm-Belkin, added by chiyoko, 20090415\nstatic void\nSwLedControlMode5(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(padapter);\n\tPLED_USB\t\tpLed = &(ledpriv->SwLed0);\n\n\tif(pHalData->CustomerID == RT_CID_819x_CAMEO)\n\t\tpLed = &(ledpriv->SwLed1);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_POWER_ON:\n\t\tcase LED_CTL_NO_LINK:\n\t\tcase LED_CTL_LINK: \t//solid blue\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\tif((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t\t\t\t;\n\t\t\telse if(pLed->bLedScanBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif(pLed->bLedBlinkInProgress ==_FALSE)\n\t  \t\t{\n\t  \t\t  \tif(pLed->CurrLedState == LED_BLINK_SCAN)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(padapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led %d\\n\", pLed->CurrLedState));\n}\n\n //WNC-Corega, added by chiyoko, 20090902\nstatic void\nSwLedControlMode6(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tPLED_USB\tpLed0 = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_POWER_ON:\n\t\tcase LED_CTL_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\t_cancel_timer_ex(&(pLed0->BlinkTimer));\n\t\t\tpLed0->CurrLedState = RTW_LED_ON;\n\t\t\tpLed0->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed0->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tSwLedOff(padapter, pLed0);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"ledcontrol 6 Led %d\\n\", pLed0->CurrLedState));\n}\n\n//Netgear, added by sinda, 2011/11/11\n void\n SwLedControlMode7(\n\t PADAPTER\t\t\t Adapter,\n\t LED_CTL_MODE\t\t LedAction\n )\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\t\n\tswitch(LedAction)\n\t{\t\t\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\tif(pmlmepriv->LinkDetectInfo.bBusyTraffic)\n\t\t\t\t;\n\t\t\telse if(pLed->bLedScanBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\n\t \t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 6;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\treturn;\n\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\t\t\t\n\t\t\t}\t\t\t\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tif(pLed->bLedOn)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\t\t\t\t\t\n\n\t\t\tbreak;\n\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\t\t\t\n\t\tcase LED_CTL_STOP_WPS_FAIL_OVERLAP:\t//WPS session overlap\t\t\t\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_TO_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif(!IS_LED_BLINKING(pLed))\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\t\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\tcase LED_CTL_POWER_ON:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"LEd control mode 7 CurrLedState %d\\n\", pLed->CurrLedState));\n}\n\nvoid\nSwLedControlMode8(\n\tPADAPTER\t\t\tAdapter,\n\tLED_CTL_MODE\t\tLedAction\n\t)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed0 = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_LINK:\n\t\t\t_cancel_timer_ex(&(pLed0->BlinkTimer));\t\t\t\n\t\t\tpLed0->CurrLedState = RTW_LED_ON;\n\t\t\tpLed0->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed0->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_NO_LINK:\n\t\t\t_cancel_timer_ex(&(pLed0->BlinkTimer));\n\t\t\tpLed0->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed0->BlinkingLedState = RTW_LED_OFF;\t\t\t\t\n\t\t\t_set_timer(&(pLed0->BlinkTimer), 0);\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tSwLedOff(Adapter, pLed0);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 8 %d\\n\", pLed0->CurrLedState));\n\n}\n\n//page added for Belkin AC950, 20120813\nvoid\nSwLedControlMode9(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\tPLED_USB\tpLed1 = &(ledpriv->SwLed1);\n\tPLED_USB\tpLed2 = &(ledpriv->SwLed2);\n\tBOOLEAN  bWPSOverLap = _FALSE;\n\t//DBG_871X(\"LedAction=%d \\n\", LedAction);\n\tswitch(LedAction)\n\t{\t\t\n\t\tcase LED_CTL_START_TO_LINK:\t\n\t\t\tif(pLed2->bLedBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tpLed2->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed2->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tpLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS;\n\n\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0);\t\n\t\t\t}\n\t\t\tbreak;\t\t\n\n\t\tcase LED_CTL_LINK:\t\t\t\n\t\tcase LED_CTL_NO_LINK:\n\t\t\t//LED1 settings\n\t\t\tif(LedAction == LED_CTL_NO_LINK)\n\t\t\t{\n\t\t\t\t//if(pMgntInfo->AuthStatus == AUTH_STATUS_FAILED)\n\t\t\t\tif(0)\n\t\t\t\t{\n\t\t\t\t\tpLed1->CurrLedState = LED_BLINK_AUTH_ERROR;\n\t\t\t\t\t\tif( pLed1->bLedOn )\n\t\t\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t\t} \n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\tif( pLed1->bLedOn )\n\t\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\tif( pLed1->bLedOn )\n\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0); \n\t\t\t}\n\t\t\t\t\t\t\n\t\t\t//LED2 settings\n\t\t\tif(LedAction == LED_CTL_LINK)\n\t\t\t{\n\t\t\t\tif(Adapter->securitypriv.dot11PrivacyAlgrthm != _NO_PRIVACY_)\n\t\t\t\t{\n\t\t\t\t\tif(pLed2->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t\t{\t\n\t\t\t\t\t\t_cancel_timer_ex(&(pLed2->BlinkTimer));\n\t\t\t\t\t\tpLed2->bLedBlinkInProgress = _FALSE;\n\t\t \t\t\t}\n\t\t\t\t\tpLed2->CurrLedState = RTW_LED_ON;\n\t\t\t\t\tpLed2->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\t\tif(!pLed2->bLedOn)\n\t\t\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0); \t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pLed2->bLedWPSBlinkInProgress != _TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed2->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\t\tpLed2->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\tif(pLed2->bLedOn)\n\t\t\t\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse //NO_LINK\n\t\t\t{\n\t\t\t\tif(pLed2->bLedWPSBlinkInProgress == _FALSE)\n\t\t\t\t{\n\t\t\t\t\tpLed2->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed2->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif(pLed2->bLedOn)\n\t\t\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0); \t\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//LED0 settings\t\t\t\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t\t\t\tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\t\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\t\t\t\t\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t{\n\t\t\t\t\tif(LedAction == LED_CTL_LINK)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\t\telse\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t}\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\t\t\n\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\t if((pmlmepriv->LinkDetectInfo.bBusyTraffic) && (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE))\n\t\t\t \t;\n\t\t\t else //if(pLed->bLedScanBlinkInProgress ==FALSE)\n\t\t\t {\n\t\t\t\tif(IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t\treturn;\n\t\t\t\t\n\t  \t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 24;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\n\t\t\t }\n\t\t\tbreak;\n\t\t\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif(pLed->bLedBlinkInProgress == _FALSE)\n\t  \t\t{\n\t  \t\t  \tif(pLed->CurrLedState == LED_BLINK_SCAN || IS_LED_WPS_BLINKING(pLed))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t  \t\t  \tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tpLed2->bLedBlinkInProgress = _TRUE;\n\t\t\tpLed2->BlinkingLedState = RTW_LED_ON;\n\t\t\tpLed2->CurrLedState = LED_BLINK_LINK_IN_PROCESS;\n\t\t\tpLed2->bLedWPSBlinkInProgress = _TRUE;\n\n\t\t\t_set_timer(&(pLed2->BlinkTimer), 500);\n\t\t\t \n\t\t\tbreak;\n\t\t\n\t\tcase LED_CTL_STOP_WPS:\t//WPS connect success\t\n\t\t\t//LED2 settings\n\t\t\tif(pLed2->bLedWPSBlinkInProgress == _TRUE)\n\t\t\t{\t\n\t\t\t\t_cancel_timer_ex(&(pLed2->BlinkTimer));\n\t\t\t\tpLed2->bLedBlinkInProgress = _FALSE;\n\t\t\t\tpLed2->bLedWPSBlinkInProgress = _FALSE;\n \t\t\t}\n\t\t\tpLed2->CurrLedState = RTW_LED_ON;\n\t\t\tpLed2->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\tif(!pLed2->bLedOn)\n\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0); \t\n\n\t\t\t//LED1 settings\n\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\tif( pLed1->bLedOn )\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\t\n\t\t\t\n\t\t\t\t\n\t\t\tbreak;\t\t\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\t\t//WPS authentication fail\t\n\t\t\t//LED1 settings\n\t\t\t//if(bWPSOverLap == _FALSE)\n\t\t\t{\n\t\t\t\tpLed1->CurrLedState = LED_BLINK_AUTH_ERROR;\n\t\t\t\tpLed1->BlinkTimes = 50;\n\t\t\t\tif( pLed1->bLedOn )\n\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\telse\n\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t}\n\t\t\t//else\n\t\t\t//{\n\t\t\t//\tbWPSOverLap = _FALSE;\n\t\t\t//\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t//\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t//\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t//}\n\n\t\t\t//LED2 settings\n\t\t\tpLed2->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed2->BlinkingLedState = RTW_LED_OFF; \n\t\t\tpLed2->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tif( pLed2->bLedOn )\n\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0);\n\t\t\t\t\t\t\n\t\t\tbreak;\t\t\t\t\n\n\t\tcase LED_CTL_STOP_WPS_FAIL_OVERLAP:\t//WPS session overlap\n\t\t\t//LED1 settings\n\t\t\tbWPSOverLap = _TRUE;\n\t\t\tpLed1->CurrLedState = LED_BLINK_WPS_STOP_OVERLAP;\n\t\t\tpLed1->BlinkTimes = 10;\n\t\t\tpLed1->BlinkCounter = 50;\n\t\t\tif( pLed1->bLedOn )\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\telse\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON; \n\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\n\t\t\t//LED2 settings\n\t\t\tpLed2->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed2->BlinkingLedState = RTW_LED_OFF;\n\t\t\tpLed2->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tif( pLed2->bLedOn )\n\t\t\t\t_set_timer(&(pLed2->BlinkTimer), 0);\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\t\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\n\t\t\tif( pLed->bLedStartToLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedStartToLinkBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\n\t\t\tif( pLed1->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\n\t\t\tpLed1->BlinkingLedState = LED_UNKNOWN;\t\t\t\t\n\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tSwLedOff(Adapter, pLed1);\t\t\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_CONNECTION_NO_TRANSFER:\n\t\t\t if(pLed->bLedBlinkInProgress == _FALSE)\n\t\t\t {\n\t\t\t \t  if(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\n\t\t\t \tpLed->CurrLedState = LED_BLINK_ALWAYS_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t }\n\t\t\tbreak;\n\t\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 9 Led %d\\n\", pLed->CurrLedState));\n}\n\n//page added for Netgear A6200V2, 20120827\nvoid\nSwLedControlMode10(\n\tPADAPTER\t\t\tAdapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\tPLED_USB\tpLed1 = &(ledpriv->SwLed1);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_START_TO_LINK:\n\t\t\tif(pLed1->bLedBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tpLed1->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tpLed1->CurrLedState = LED_BLINK_LINK_IN_PROCESS;\n\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\t\t\t\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif(LedAction == LED_CTL_LINK)\n\t\t\t{\n\t\t\t\tif(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE)\n\t\t\t\t\t;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pHalData->CurrentBandType == BAND_ON_2_4G)\n\t\t\t\t\t//LED0 settings\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t \t\t\t}\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if(pHalData->CurrentBandType == BAND_ON_5G)\n\t\t\t\t\t//LED1 settings\n\t\t\t\t\t{\n\t\t\t\t\t\tpLed1->CurrLedState = RTW_LED_ON;\n\t\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\t\tif(pLed1->bLedBlinkInProgress == _TRUE)\n\t\t\t\t\t\t{\t\n\t\t\t\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\t\t\t\tpLed1->bLedBlinkInProgress = _FALSE;\n\t\t\t \t\t\t}\n\t\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\n\t\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(LedAction == LED_CTL_NO_LINK)   //TODO by page\n\t\t\t{\n\t\t\t\tif(pLed->bLedWPSBlinkInProgress == _TRUE || pLed1->bLedWPSBlinkInProgress == _TRUE)\n\t\t\t\t\t;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif( pLed1->bLedOn )\n\t\t\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\t\t\n\n\t\tcase LED_CTL_SITE_SURVEY:\n\t\t\t if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t \t;                                                                  //don't blink when media connect\n\t\t\t else //if(pLed->bLedScanBlinkInProgress ==FALSE)\n\t\t\t {\n\t\t\t\tif(IS_LED_WPS_BLINKING(pLed) || IS_LED_WPS_BLINKING(pLed1))\n\t\t\t\t\treturn;\n\n\t  \t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t \t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed->BlinkTimes = 12;\n\t\t\t\tpLed->BlinkingLedState = LED_BLINK_SCAN;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\t\tif(pLed1->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\t\tpLed1->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t \t\t\tif(pLed1->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\t\tpLed1->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed1->bLedScanBlinkInProgress = _TRUE;\n\t\t\t\tpLed1->CurrLedState = LED_BLINK_SCAN;\n\t\t\t\tpLed1->BlinkTimes = 12;\n\t\t\t\tpLed1->BlinkingLedState = LED_BLINK_SCAN;\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR);\n\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\t//LED0 settings\n\t\t\tif(pLed->bLedBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->BlinkingLedState = LED_BLINK_WPS;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\n\t\t\t//LED1 settings\n\t\t\tif(pLed1->bLedBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tpLed1->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed1->BlinkingLedState = LED_BLINK_WPS;\n\t\t\t\tpLed1->CurrLedState = LED_BLINK_WPS;\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), LED_BLINK_NORMAL_INTERVAL+LED_BLINK_LINK_INTERVAL_NETGEAR);\n\t\t\t}\n\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS:\t//WPS connect success\n\t\t\tif(pHalData->CurrentBandType == BAND_ON_2_4G)\n\t\t\t//LED0 settings\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\t\t\t}\n\t\t\telse if(pHalData->CurrentBandType == BAND_ON_5G)\n\t\t\t//LED1 settings\n\t\t\t{\n\t\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t\tpLed1->CurrLedState = RTW_LED_ON;\n\t\t\t\tpLed1->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tif(pLed1->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed1->BlinkTimer));\n\t\t\t\t\tpLed1->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\t\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL:\t\t//WPS authentication fail\t\n\t\t\t//LED1 settings\n\t\t\tpLed1->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tpLed1->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed1->BlinkingLedState = RTW_LED_OFF; \n\t\t\t_set_timer(&(pLed1->BlinkTimer), 0);\n\n\t\t\t//LED0 settings\n\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\tbreak;\n\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 10 Led %d\\n\", pLed->CurrLedState));\n}\n\n //Edimax-ASUS, added by Page, 20121221\nvoid\nSwLedControlMode11(\n\tPADAPTER\t\t\tAdapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\t\n\t\tcase LED_CTL_POWER_ON:\n\t\tcase LED_CTL_START_TO_LINK:\t\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\t\tif( pLed->bLedBlinkInProgress == _TRUE )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_SCAN_INTERVAL_ALPHA);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\n\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkTimes = 5;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\n\t\t\tbreak;\n\n\n\t\tcase LED_CTL_STOP_WPS:\n\t\tcase LED_CTL_STOP_WPS_FAIL:\n\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedLinkBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led mode 1 CurrLedState %d\\n\", pLed->CurrLedState));\n}\n\n// page added for NEC\n\nVOID\nSwLedControlMode12(\n\tPADAPTER\t\t\tAdapter,\n\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\n\tswitch(LedAction)\n\t{\n\t\tcase LED_CTL_POWER_ON:\n\t\tcase LED_CTL_NO_LINK:\n\t\tcase LED_CTL_LINK:\n\t\tcase LED_CTL_SITE_SURVEY:\n\n\t\t\tif( pLed->bLedNoLinkBlinkInProgress == _FALSE )\n\t\t\t{\n\t \t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t \t\t\t}\n\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_SLOWLY;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NO_LINK_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif(pLed->bLedBlinkInProgress == _FALSE)\n\t  \t\t{\n\t \t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\telse\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\n\n \t\t\tif(pLed->bLedNoLinkBlinkInProgress == _TRUE)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"SWLed12 %d\\n\", pLed->CurrLedState));\n}\n\n// Maddest add for NETGEAR R6100\n\nVOID\nSwLedControlMode13(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 13 CurrLedState %d, LedAction %d\\n\", pLed->CurrLedState,LedAction));\n\tswitch(LedAction)\n\t{\t\t\n\t\tcase LED_CTL_LINK:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\treturn;\t\n\t\t\t}\n\n\t\t\t\n\t\t\tpLed->CurrLedState = RTW_LED_ON;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\t\t\t\n\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\t\n\t\t\tif(pLed->bLedWPSBlinkInProgress == _FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress == _TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\t\t\t\t\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR);\n\t\t\t\t}\n\t\t\t}\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase LED_CTL_STOP_WPS:\t\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\t\t\t\t\t\t\t\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\t\t\t\n\t\t\t}\t\t\t\t\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t}\n\t\t\t\n\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\t\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\tif(pLed->bLedOn)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\t\t\n\t\t\t\t\t\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\t\t\t\t\t\n\n\t\t\tbreak;\t\t\n\n\t\t\t\n\t\tcase LED_CTL_STOP_WPS_FAIL: \t\t\n\t\tcase LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\t\t\t\t\t\t\t\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\t\t\t\t\n\t\t\t}\t\t\t\n\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\t\t\t\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\t\n\t\t\tbreak;\t\t\t\t\n\n\t\tcase LED_CTL_START_TO_LINK:\t\n\t\t\tif((pLed->bLedBlinkInProgress == _FALSE) && (pLed->bLedWPSBlinkInProgress == _FALSE)) \n\t\t\t{\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_LINK_IN_PROCESS;\n\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\n\t\t\tbreak;\t\n\n\t\tcase LED_CTL_NO_LINK:\n\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\treturn;\t\n\t\t\t}\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\t\t\t//if(!IS_LED_BLINKING(pLed))\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\t\t\t\t\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\t\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase LED_CTL_POWER_OFF:\n\t\tcase LED_CTL_POWER_ON:\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\t\t\tif( pLed->bLedWPSBlinkInProgress )\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tif (LedAction == LED_CTL_POWER_ON)\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\telse\n\t\t\t\tSwLedOff(Adapter, pLed);\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tbreak;\n\n\t}\n\n\t\n}\n\n// Maddest add for DNI Buffalo\n\nVOID\nSwLedControlMode14(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 14 CurrLedState %d, LedAction %d\\n\", pLed->CurrLedState,LedAction));\n\tswitch(LedAction)\n\t{\t\t\t\t\n\t\tcase LED_CTL_POWER_OFF:\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 14 LED_CTL_POWER_OFF\\n\"));\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\t\t\tSwLedOff(Adapter, pLed);\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_POWER_ON:\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 14 LED_CTL_POWER_ON\\n\"));\n\t\t\tSwLedOn(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK:\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tif (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\tSwLedOn(Adapter, pLed);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t \t\tif(pLed->bLedBlinkInProgress ==_FALSE)\n\t  \t\t{\n\t\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\t\tpLed->BlinkTimes = 2;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\tif (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_LINK_INTERVAL_ALPHA);\n\t\t\t\t\telse\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t\tif (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);\n\t\t\t\t\telse\n\t\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\n// Maddest add for Dlink\n\nVOID\nSwLedControlMode15(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n)\n{\n\tstruct led_priv\t*ledpriv = &(Adapter->ledpriv);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\tPLED_USB\tpLed = &(ledpriv->SwLed0);\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 CurrLedState %d, LedAction %d\\n\", pLed->CurrLedState,LedAction));\n\tswitch(LedAction)\n\t{\t\t\n\t\tcase LED_CTL_START_WPS: //wait until xinpin finish\n\t\tcase LED_CTL_START_WPS_BOTTON:\t\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 LED_CTL_START_WPS\\n\"));\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_FALSE)\n\t\t\t{\n\t\t\t\tif(pLed->bLedBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t\t}\n\t\t\t\tif(pLed->bLedScanBlinkInProgress ==_TRUE)\n\t\t\t\t{\n\t\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t\t}\t\t\t\t\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _TRUE;\n\t\t\t\tpLed->CurrLedState = LED_BLINK_WPS;\n\t\t\t\tif( pLed->bLedOn )\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_OFF_INTERVAL_NETGEAR);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t\t\t_set_timer(&(pLed->BlinkTimer), LED_WPS_BLINK_ON_INTERVAL_NETGEAR);\n\t\t\t\t}\n\t\t\t}\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase LED_CTL_STOP_WPS:\t\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 LED_CTL_STOP_WPS\\n\"));\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\t\t\t\t\t\t\n\t\t\t\n\t\t\tpLed->CurrLedState = LED_BLINK_WPS_STOP;\n\t\t\t//if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t{\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\t\t\t\n\t\t\t\t\t\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\t}\t\t\t\t\t\n\n\t\t\tbreak;\n\n\t\tcase LED_CTL_STOP_WPS_FAIL: \t\t\n\t\tcase LED_CTL_STOP_WPS_FAIL_OVERLAP: //WPS session overlap\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 LED_CTL_STOP_WPS_FAIL\\n\"));\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\n\t\t\tpLed->CurrLedState = RTW_LED_OFF;\n\t\t\tpLed->BlinkingLedState = RTW_LED_OFF;\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\n\t\t\tbreak;\n\n\t\tcase LED_CTL_NO_LINK:\n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 LED_CTL_NO_LINK\\n\"));\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\treturn; \n\t\t\t}\n\n\t\t\t/*if(Adapter->securitypriv.dot11PrivacyAlgrthm > _NO_PRIVACY_)\n\t\t\t{\n\t\t\t\tif(SecIsTxKeyInstalled(Adapter, pMgntInfo->Bssid))\n\t\t\t\t{\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pMgntInfo->LEDAssocState ==LED_ASSOC_SECURITY_BEGIN)\n\t\t\t\t\t\treturn; \n\t\t\t\t}\n\t\t\t}*/\n\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tif( pLed->bLedScanBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedScanBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\t\t\t//if(!IS_LED_BLINKING(pLed))\n\t\t\t{\n\t\t\t\tpLed->CurrLedState = LED_BLINK_NO_LINK;\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\t\t\t\t_set_timer(&(pLed->BlinkTimer), 30);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase LED_CTL_LINK: \n\t\t\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"Led control mode 15 LED_CTL_LINK\\n\"));\n\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\treturn; \n\t\t\t}\n\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\n\t\t\tpLed->CurrLedState = LED_BLINK_LINK_IDEL;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\n\n\t\t\t_set_timer(&(pLed->BlinkTimer), 30);\n\t\t\tbreak;\t\n\n\t\tcase LED_CTL_SITE_SURVEY\t:\n\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)\n\t\t\t\treturn;\n\n\t\t\tif(pLed->bLedWPSBlinkInProgress ==_TRUE)\n\t\t\t\treturn;\n\t\t\t\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\n\t\t\tpLed->CurrLedState = LED_BLINK_SCAN;\n\t\t\tpLed->BlinkingLedState = RTW_LED_ON;\t\t\t\t\n\t\t\t_set_timer(&(pLed->BlinkTimer), 0);\t\n\t\t\tbreak;\n\n\t\tcase LED_CTL_TX:\n\t\tcase LED_CTL_RX:\n\t\t\tif(pLed->bLedWPSBlinkInProgress)\n\t\t\t{\n\t\t\t\treturn; \n\t\t\t}\n\n\t\t\tif( pLed->bLedBlinkInProgress)\n\t\t\t{\n\t\t\t\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\t\t\t\tpLed->bLedBlinkInProgress = _FALSE;\n\t\t\t}\t\t\t\n\n\t\t\tpLed->bLedBlinkInProgress = _TRUE;\n\t\t\tpLed->CurrLedState = LED_BLINK_TXRX;\n\t\t\tpLed->BlinkTimes = 2;\n\t\t\tif( pLed->bLedOn )\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_OFF; \n\t\t\telse\n\t\t\t\tpLed->BlinkingLedState = RTW_LED_ON; \n\t\t\t_set_timer(&(pLed->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);\n\t\t\tbreak;\t\t\t\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvoid\nLedControlUSB(\n\t_adapter\t\t\t\t*padapter,\n\tLED_CTL_MODE\t\tLedAction\n\t)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\n#if(MP_DRIVER == 1)\n\tif (padapter->registrypriv.mp_mode == 1)\n\t\treturn;\n#endif\n\n\tif (RTW_CANNOT_RUN(padapter) || (!rtw_is_hw_init_completed(padapter))) {\n\t\t/*DBG_871X(\"%s bDriverStopped:%s, bSurpriseRemoved:%s\\n\"\n\t\t, __func__\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\" );*/\n\t\treturn;\n\t}\n\n\tif( ledpriv->bRegUseLed == _FALSE)\n\t\treturn;\n\n\t//if(priv->bInHctTest)\n\t//\treturn;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t// Only do led action for PRIMARY_ADAPTER\n\tif (padapter->adapter_type != PRIMARY_ADAPTER)\n\t\treturn;\n#endif\n\n\tif( (adapter_to_pwrctl(padapter)->rf_pwrstate != rf_on &&\n\t\tadapter_to_pwrctl(padapter)->rfoff_reason > RF_CHANGE_BY_PS) &&\n\t\t(LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||\n\t\t LedAction == LED_CTL_SITE_SURVEY ||\n\t\t LedAction == LED_CTL_LINK ||\n\t\t LedAction == LED_CTL_NO_LINK ||\n\t\t LedAction == LED_CTL_POWER_ON) )\n\t{\n\t\treturn;\n\t}\n\n\tswitch(ledpriv->LedStrategy)\n\t{\n\t\tcase SW_LED_MODE0:\n\t\t\tSwLedControlMode0(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE1:\n\t\t\tSwLedControlMode1(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE2:\n\t\t\tSwLedControlMode2(padapter, LedAction);\n                \tbreak;\n\n\t\tcase SW_LED_MODE3:\n\t\t\tSwLedControlMode3(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE4:\n\t\t\tSwLedControlMode4(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE5:\n\t\t\tSwLedControlMode5(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE6:\n\t\t\tSwLedControlMode6(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE7:\n\t\t\tSwLedControlMode7(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE8:\n\t\t\tSwLedControlMode8(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE9:\n\t\t\tSwLedControlMode9(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE10:\n\t\t\tSwLedControlMode10(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE11:\n\t\t\tSwLedControlMode11(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE12:\n\t\t\tSwLedControlMode12(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE13:\n\t\t\tSwLedControlMode13(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE14:\n\t\t\tSwLedControlMode14(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tcase SW_LED_MODE15:\n\t\t\tSwLedControlMode15(padapter, LedAction);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tRT_TRACE(_module_rtl8712_led_c_,_drv_info_,(\"LedStrategy:%d, LedAction %d\\n\", ledpriv->LedStrategy,LedAction));\n}\n\n//\n//\tDescription:\n//\t\tReset status of LED_871x object.\n//\nvoid ResetLedStatus(PLED_USB pLed) {\n\n\tpLed->CurrLedState = RTW_LED_OFF; // Current LED state.\n\tpLed->bLedOn = _FALSE; // true if LED is ON, false if LED is OFF.\n\n\tpLed->bLedBlinkInProgress = _FALSE; // true if it is blinking, false o.w..\n\tpLed->bLedWPSBlinkInProgress = _FALSE;\n\t\n\tpLed->BlinkTimes = 0; // Number of times to toggle led state for blinking.\n\tpLed->BlinkCounter = 0;\n\tpLed->BlinkingLedState = LED_UNKNOWN; // Next state for blinking, either RTW_LED_ON or RTW_LED_OFF are.\n\n\tpLed->bLedNoLinkBlinkInProgress = _FALSE;\n\tpLed->bLedLinkBlinkInProgress = _FALSE;\n\tpLed->bLedStartToLinkBlinkInProgress = _FALSE;\n\tpLed->bLedScanBlinkInProgress = _FALSE;\n}\n\n //\n//\tDescription:\n//\t\tInitialize an LED_871x object.\n//\nvoid\nInitLed(\n\t_adapter\t\t\t*padapter,\n\tPLED_USB\t\tpLed,\n\tLED_PIN\t\t\tLedPin\n\t)\n{\n\tpLed->padapter = padapter;\n\tpLed->LedPin = LedPin;\n\n\tResetLedStatus(pLed);\n\t_init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed);\n\t_init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);\n}\n\n\n//\n//\tDescription:\n//\t\tDeInitialize an LED_871x object.\n//\nvoid\nDeInitLed(\n\tPLED_USB\t\tpLed\n\t)\n{\n\t_cancel_workitem_sync(&(pLed->BlinkWorkItem));\n\t_cancel_timer_ex(&(pLed->BlinkTimer));\n\tResetLedStatus(pLed);\n}\n\n\n"
  },
  {
    "path": "hal/phydm/halhwimg.h",
    "content": "#pragma once\n#ifndef __INC_HW_IMG_H\n#define __INC_HW_IMG_H\n\n//\n// 2011/03/15 MH Add for different IC HW image file selection. code size consideration.\n//\n#if RT_PLATFORM == PLATFORM_LINUX\n\n\t#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\t// For 92C\n\t#define\t\tRTL8192CE_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define\t\tRTL8192CE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define\t\tRTL8192CU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8192CU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t// For 92D\n\t#define\t\tRTL8192DE_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define\t\tRTL8192DE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define\t\tRTL8192DU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8192DU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t// For 8723\n\t#define\t\tRTL8723E_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define\t\tRTL8723U_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8723S_HWIMG_SUPPORT\t\t\t\t\t0\n\n\t//For 88E\n\t#define\t\tRTL8188EE_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188EU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188ES_HWIMG_SUPPORT\t\t\t\t\t0\n\t\n\t#elif (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t// For 92C\n\t#define \tRTL8192CE_HWIMG_SUPPORT \t\t\t\t0\n\t#define \tRTL8192CE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define \tRTL8192CU_HWIMG_SUPPORT \t\t\t\t1\n\t#define \tRTL8192CU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t//For 92D\n\t#define \tRTL8192DE_HWIMG_SUPPORT \t\t\t\t0\n\t#define \tRTL8192DE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define \tRTL8192DU_HWIMG_SUPPORT \t\t\t\t1\n\t#define \tRTL8192DU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t// For 8723\n\t#define \tRTL8723E_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define \tRTL8723U_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define \tRTL8723S_HWIMG_SUPPORT\t\t\t\t\t0\n\n\t//For 88E\n\t#define\t\tRTL8188EE_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188EU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188ES_HWIMG_SUPPORT\t\t\t\t\t0\n\t\n\t#elif (DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n\t// For 92C\n\t#define \tRTL8192CE_HWIMG_SUPPORT \t\t\t\t0\n\t#define \tRTL8192CE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define \tRTL8192CU_HWIMG_SUPPORT \t\t\t\t1\n\t#define \tRTL8192CU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t//For 92D\n\t#define \tRTL8192DE_HWIMG_SUPPORT \t\t\t\t0\n\t#define \tRTL8192DE_TEST_HWIMG_SUPPORT\t\t\t0\n\t#define \tRTL8192DU_HWIMG_SUPPORT \t\t\t\t1\n\t#define \tRTL8192DU_TEST_HWIMG_SUPPORT\t\t\t0\n\n\t// For 8723\n\t#define \tRTL8723E_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define \tRTL8723U_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define \tRTL8723S_HWIMG_SUPPORT\t\t\t\t\t1\n\n\t//For 88E\n\t#define\t\tRTL8188EE_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188EU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188ES_HWIMG_SUPPORT\t\t\t\t\t0\n\t#endif\n\n#else\t// PLATFORM_WINDOWS & MacOSX\n\n//For 92C\n#define\t\tRTL8192CE_HWIMG_SUPPORT\t\t\t\t\t\t1\n#define\t\tRTL8192CE_TEST_HWIMG_SUPPORT\t\t\t\t1\n#define\t\tRTL8192CU_HWIMG_SUPPORT\t\t\t\t\t\t1\n#define\t\tRTL8192CU_TEST_HWIMG_SUPPORT\t\t\t\t1\n\n// For 92D\n#define\t\tRTL8192DE_HWIMG_SUPPORT\t\t\t\t\t1\n#define\t\tRTL8192DE_TEST_HWIMG_SUPPORT\t\t\t\t1\n#define\t\tRTL8192DU_HWIMG_SUPPORT\t\t\t\t\t1\n#define\t\tRTL8192DU_TEST_HWIMG_SUPPORT\t\t\t\t1\n\n\t#if defined(UNDER_CE)\n\t// For 8723\n\t#define\t\tRTL8723E_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8723U_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8723S_HWIMG_SUPPORT\t\t\t\t\t1\n\n\t// For 88E\n\t#define\t\tRTL8188EE_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188EU_HWIMG_SUPPORT\t\t\t\t\t0\n\t#define\t\tRTL8188ES_HWIMG_SUPPORT\t\t\t\t\t0\n\n\t#else \n\n\t// For 8723\n\t#define\t\tRTL8723E_HWIMG_SUPPORT\t\t\t\t\t1\n\t//#define\t\tRTL_8723E_TEST_HWIMG_SUPPORT\t\t\t1\n\t#define\t\tRTL8723U_HWIMG_SUPPORT\t\t\t\t\t1\n\t//#define\t\tRTL_8723U_TEST_HWIMG_SUPPORT\t\t\t1\n\t#define\t\tRTL8723S_HWIMG_SUPPORT\t\t\t\t\t1\n\t//#define\t\tRTL_8723S_TEST_HWIMG_SUPPORT\t\t\t1\n\n\t//For 88E\n\t#define\t\tRTL8188EE_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define\t\tRTL8188EU_HWIMG_SUPPORT\t\t\t\t\t1\n\t#define\t\tRTL8188ES_HWIMG_SUPPORT\t\t\t\t\t1\n\t#endif\n\n#endif\n\n#endif //__INC_HW_IMG_H\n"
  },
  {
    "path": "hal/phydm/halphyrf_ap.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n #include \"mp_precomp.h\"\n #include \"phydm_precomp.h\"\n\n#ifndef index_mapping_NUM_88E\n #define\tindex_mapping_NUM_88E\t15\n#endif\n\n//#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n#define \tCALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\\n\t\t\t\t\tdo {\\\n\t\t\t\t\t\tfor(_offset = 0; _offset < _size; _offset++)\\\n\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\tif(_deltaThermal < thermalThreshold[_direction][_offset])\\\n\t\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\t\tif(_offset != 0)\\\n\t\t\t\t\t\t\t\t\t_offset--;\\\n\t\t\t\t\t\t\t\tbreak;\\\n\t\t\t\t\t\t\t}\\\n\t\t\t\t\t\t}\t\t\t\\\n\t\t\t\t\t\tif(_offset >= _size)\\\n\t\t\t\t\t\t\t_offset = _size-1;\\\n\t\t\t\t\t} while(0)\n\n\nvoid ConfigureTxpowerTrack(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if RTL8812A_SUPPORT\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t//if (IS_HARDWARE_TYPE_8812(pDM_Odm->Adapter))\n\tif(pDM_Odm->SupportICType==ODM_RTL8812)\n\t\tConfigureTxpowerTrack_8812A(pConfig);\n\t//else\n#endif\n#endif\n\n#if RTL8814A_SUPPORT\n\tif(pDM_Odm->SupportICType== ODM_RTL8814A)\n\t\tConfigureTxpowerTrack_8814A(pConfig);\n#endif\n\n\n#if RTL8188E_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t\tConfigureTxpowerTrack_8188E(pConfig);\n#endif \n}\n\n#if (RTL8192E_SUPPORT==1) \nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_92E(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\tThermalValue = 0, delta, delta_IQK, delta_LCK, channel, is_decrease, rf_mimo_mode;\n\tu1Byte\tThermalValue_AVG_count = 0;\n    \tu1Byte     OFDM_min_index = 10; //OFDM BB Swing should be less than +2.5dB, which is required by Arthur\n\ts1Byte\tOFDM_index[2], index ;\n    \tu4Byte\tThermalValue_AVG = 0, Reg0x18;\n\tu4Byte\ti = 0, j = 0, rf;\n\ts4Byte\tvalue32, CCK_index = 0, ele_A, ele_D, ele_C, X, Y;\n\tprtl8192cd_priv \tpriv = pDM_Odm->priv;\n\n\trf_mimo_mode = pDM_Odm->RFType;\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"%s:%d rf_mimo_mode:%d\\n\", __FUNCTION__, __LINE__, rf_mimo_mode));\n\n#ifdef MP_TEST\n\tif ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\n\t\tchannel = priv->pshare->working_channel;\n\t\tif (priv->pshare->mp_txpwr_tracking == FALSE)\n\t\t\treturn;\n\t} else\n#endif\n\t{\n\t\tchannel = (priv->pmib->dot11RFEntry.dot11channel);\n\t}\n\n\tThermalValue = (unsigned char)ODM_GetRFReg(pDM_Odm, RF_PATH_A, ODM_RF_T_METER_92E, 0xfc00);\t//0x42: RF Reg[15:10] 88E\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\\n\", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));\n\n\n\tswitch (rf_mimo_mode) {\n\t\tcase MIMO_1T1R:\n\t\t\trf = 1;      \n\t\t\tbreak;\n\t\tcase MIMO_2T2R:\n\t\t\trf = 2;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\trf = 2;\n\t\t\tbreak;\n\t}\n\n\t//Query OFDM path A default setting \tBit[31:21]\n\tele_D = PHY_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskOFDM_D);\n\tfor (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {\n\t\tif (ele_D == (OFDMSwingTable_92E[i] >> 22)) {\n\t\t\tOFDM_index[0] = (unsigned char)i;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"PathA 0xC80[31:22] = 0x%x, OFDM_index=%d\\n\", ele_D, OFDM_index[0]));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t//Query OFDM path B default setting\n\tif (rf_mimo_mode == MIMO_2T2R) {\n\t\tele_D = PHY_QueryBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskOFDM_D);\n\t\tfor (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {\n\t\t\tif (ele_D == (OFDMSwingTable_92E[i] >> 22)) {\n\t\t\t\tOFDM_index[1] = (unsigned char)i;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"PathB 0xC88[31:22] = 0x%x, OFDM_index=%d\\n\", ele_D, OFDM_index[1]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* calculate average thermal meter */\n\t{\n\t\tpriv->pshare->ThermalValue_AVG_88XX[priv->pshare->ThermalValue_AVG_index_88XX] = ThermalValue;\n\t\tpriv->pshare->ThermalValue_AVG_index_88XX++;\n\t\tif (priv->pshare->ThermalValue_AVG_index_88XX == AVG_THERMAL_NUM_88XX)\n\t\t\tpriv->pshare->ThermalValue_AVG_index_88XX = 0;\n\n\t\tfor (i = 0; i < AVG_THERMAL_NUM_88XX; i++) {\n\t\t\tif (priv->pshare->ThermalValue_AVG_88XX[i]) {\n\t\t\t\tThermalValue_AVG += priv->pshare->ThermalValue_AVG_88XX[i];\n\t\t\t\tThermalValue_AVG_count++;\n\t\t\t}\n\t\t}\n\n\t\tif (ThermalValue_AVG_count) {\n\t\t\tThermalValue = (unsigned char)(ThermalValue_AVG / ThermalValue_AVG_count);\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"AVG Thermal Meter = 0x%x \\n\", ThermalValue));\n\t\t}\n\t}\n\n\t/* Initialize */\n\tif (!priv->pshare->ThermalValue) {\n\t\tpriv->pshare->ThermalValue = priv->pmib->dot11RFEntry.ther;\n\t\tpriv->pshare->ThermalValue_IQK = ThermalValue;\n\t\tpriv->pshare->ThermalValue_LCK = ThermalValue;\n\t}\n\n\tif (ThermalValue != priv->pshare->ThermalValue) {\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\n******** START POWER TRACKING ********\\n\")); \t\t\t\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\\n\", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther)); \t\t\t\n\n\t\tdelta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);\n\t\tdelta_IQK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_IQK);\n\t\tdelta_LCK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_LCK);\n\t\tis_decrease = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 1 : 0);\n\t\t\n#ifdef _TRACKING_TABLE_FILE\n\t\tif (priv->pshare->rf_ft_var.pwr_track_file) {\t\t\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"Diff: (%s)%d ==> get index from table : %d)\\n\", (is_decrease?\"-\":\"+\"), delta, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\n        \n            \tif (is_decrease) {\t\t\t\t\t\n                \tfor (i = 0; i < rf; i++) {\n\t\t\t\tOFDM_index[i] = priv->pshare->OFDM_index0[i] + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);\n\t\t\t\tOFDM_index[i] = ((OFDM_index[i] > (OFDM_TABLE_SIZE_92E- 1)) ? (OFDM_TABLE_SIZE_92E - 1) : OFDM_index[i]);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\\n\", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\n\t                        CCK_index = priv->pshare->CCK_index0 + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);                        \n\t\t\t\tCCK_index = ((CCK_index > (CCK_TABLE_SIZE_92E - 1)) ? (CCK_TABLE_SIZE_92E - 1) : CCK_index);\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> Decrese power ---> new CCK_INDEX:%d (%d + %d)\\n\",  CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1)));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 0; i < rf; i++) {\n\t\t\t\tOFDM_index[i] = priv->pshare->OFDM_index0[i] - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);\n\t\t\t\tOFDM_index[i] = ((OFDM_index[i] < OFDM_min_index) ?  OFDM_min_index : OFDM_index[i]);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> Increse power ---> new OFDM_INDEX:%d (%d - %d)\\n\", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\n\t\t\t\tCCK_index = priv->pshare->CCK_index0 - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);\t\t\t\t\t\t  \n\t                        CCK_index = ((CCK_index < 0 )? 0 : CCK_index);  \n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> Increse power ---> new CCK_INDEX:%d (%d - %d)\\n\", CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1)));\n\t\t\t}\n\t\t}\n\t\t}\n#endif //CFG_TRACKING_TABLE_FILE\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"OFDMSwingTable_92E[(unsigned int)OFDM_index[0]] = %x \\n\",OFDMSwingTable_92E[(unsigned int)OFDM_index[0]]));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"OFDMSwingTable_92E[(unsigned int)OFDM_index[1]] = %x \\n\",OFDMSwingTable_92E[(unsigned int)OFDM_index[1]]));\n\n\t\t//Adujst OFDM Ant_A according to IQK result\n\t\tele_D = (OFDMSwingTable_92E[(unsigned int)OFDM_index[0]] & 0xFFC00000) >> 22;\n\t\tX = priv->pshare->RegE94;\n\t\tY = priv->pshare->RegE9C;\n\n\t\tif (X != 0) {\n\t\t\tif ((X & 0x00000200) != 0)\n\t\t\t\tX = X | 0xFFFFFC00;\n\t\t\tele_A = ((X * ele_D) >> 8) & 0x000003FF;\n\n\t\t\t//new element C = element D x Y\n\t\t\tif ((Y & 0x00000200) != 0)\n\t\t\t\tY = Y | 0xFFFFFC00;\n\t\t\tele_C = ((Y * ele_D) >> 8) & 0x000003FF;\n\n\t\t\t//wirte new elements A, C, D to regC80 and regC94, element B is always 0\n\t\t\tvalue32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;\n\t\t\tPHY_SetBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord, value32);\n\n\t\t\tvalue32 = (ele_C&0x000003C0)>>6;\n\t\t\tPHY_SetBBReg(priv, rOFDM0_XCTxAFE, bMaskH4Bits, value32);\n\t\t\t\n\t\t\tvalue32 = ((X * ele_D)>>7)&0x01;\n\t\t\tPHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(24), value32);\n\t\t} else {\n\t\t\tPHY_SetBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable_92E[(unsigned int)OFDM_index[0]]);\n\t\t\tPHY_SetBBReg(priv, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);\n\t\t\tPHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(24), 0x00);\n\t\t}\n\n\t\tset_CCK_swing_index(priv, CCK_index);\n\n\t\tif (rf == 2) {\n\t\t\tele_D = (OFDMSwingTable_92E[(unsigned int)OFDM_index[1]] & 0xFFC00000) >> 22;\n\t\t\tX = priv->pshare->RegEB4;\n\t\t\tY = priv->pshare->RegEBC;\n\n\t\t\tif (X != 0) {\n\t\t\t\tif ((X & 0x00000200) != 0)\t//consider minus\n\t\t\t\t\tX = X | 0xFFFFFC00;\n\t\t\t\tele_A = ((X * ele_D) >> 8) & 0x000003FF;\n\n\t\t\t\t//new element C = element D x Y\n\t\t\t\tif ((Y & 0x00000200) != 0)\n\t\t\t\t\tY = Y | 0xFFFFFC00;\n\t\t\t\tele_C = ((Y * ele_D) >> 8) & 0x00003FF;\n\n\t\t\t\t//wirte new elements A, C, D to regC88 and regC9C, element B is always 0\n\t\t\t\tvalue32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);\n\t\t\t\t\n\t\t\t\tvalue32 = (ele_C & 0x000003C0) >> 6;\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_XDTxAFE, bMaskH4Bits, value32);\n\n\t\t\t\tvalue32 = ((X * ele_D) >> 7) & 0x01;\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(28), value32);\n\t\t\t} else {\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable_92E[(unsigned int)OFDM_index[1]]);\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);\n\t\t\t\tPHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(28), 0x00);\n\t\t\t}\n\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"0xc80 = 0x%x \\n\", PHY_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord)));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"0xc88 = 0x%x \\n\", PHY_QueryBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord)));\n\n\t\tif (delta_IQK > 3) {\n\t\t\tpriv->pshare->ThermalValue_IQK = ThermalValue;\n#ifdef MP_TEST\n\t\t\tif (!(priv->pshare->rf_ft_var.mp_specific && (OPMODE & (WIFI_MP_CTX_BACKGROUND | WIFI_MP_CTX_PACKET))))\n#endif\t\n\t\t\t\tPHY_IQCalibrate_8192E(pDM_Odm,false);\n\t\t}\n\n\t\tif (delta_LCK > 8) {\n\t\t\tRTL_W8(0x522, 0xff);\n\t\t\tReg0x18 = PHY_QueryRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, 1);\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 1);\t\t\t\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0x18, BIT(15), 1);\n\t\t\tdelay_ms(1);\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 0);\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, Reg0x18);\t\t\n\t\t\tRTL_W8(0x522, 0x0);\n\t\t\tpriv->pshare->ThermalValue_LCK = ThermalValue;\n\t\t}\t\n\t}\n\n\t//update thermal meter value\n\tpriv->pshare->ThermalValue = ThermalValue;\n\tfor (i = 0 ; i < rf ; i++)\n\t\tpriv->pshare->OFDM_index[i] = OFDM_index[i];\n\tpriv->pshare->CCK_index = CCK_index;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,  (\"\\n******** END:%s() ********\\n\", __FUNCTION__));\t\n}\n#endif\n\n#if (RTL8814A_SUPPORT ==1)\t\t\t\t\t\n\t\t\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries2(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tThermalValue = 0, delta, delta_LCK, delta_IQK, channel, is_increase;\n\tu1Byte\t\t\tThermalValue_AVG_count = 0, p = 0, i = 0;\n\tu4Byte\t\t\tThermalValue_AVG = 0, Reg0x18;\n\tu4Byte \t\t\tBBSwingReg[4] = {rA_TxScale_Jaguar,rB_TxScale_Jaguar,rC_TxScale_Jaguar2,rD_TxScale_Jaguar2};\n\ts4Byte\t\t\tele_D;\n\tu4Byte\t\t\tBBswingIdx;\n\tprtl8192cd_priv\tpriv = pDM_Odm->priv;\n\tTXPWRTRACK_CFG \tc;\n\tBOOLEAN\t\t\tbTSSIenable = FALSE;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\t//4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_A = NULL, deltaSwingTableIdx_TDOWN_A = NULL;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_B = NULL, deltaSwingTableIdx_TDOWN_B = NULL;\n\t//for 8814 add by Yu Chen\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_C = NULL, deltaSwingTableIdx_TDOWN_C = NULL;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_D = NULL, deltaSwingTableIdx_TDOWN_D = NULL;\n\n#ifdef MP_TEST\n\tif ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\n\t\tchannel = priv->pshare->working_channel;\n\t\tif (priv->pshare->mp_txpwr_tracking == FALSE)\n\t\t\treturn;\n\t} else\n#endif\n\t{\n\t\tchannel = (priv->pmib->dot11RFEntry.dot11channel);\n\t}\n\n\tConfigureTxpowerTrack(pDM_Odm, &c);\n\tpRFCalibrateInfo->DefaultOfdmIndex = priv->pshare->OFDM_index0[ODM_RF_PATH_A];\n\n\t(*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,\n\t\t\t\t\t\t\t\t\t  (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);\n\n\tif(pDM_Odm->SupportICType & ODM_RTL8814A)\t// for 8814 path C & D\n\t(*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_C, (pu1Byte*)&deltaSwingTableIdx_TDOWN_C,\n\t\t\t\t\t\t\t\t\t  (pu1Byte*)&deltaSwingTableIdx_TUP_D, (pu1Byte*)&deltaSwingTableIdx_TDOWN_D);\n\t\n\tThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); //0x42: RF Reg[15:10] 88E\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t(\"\\nReadback Thermal Meter = 0x%x, pre thermal meter 0x%x, EEPROMthermalmeter 0x%x\\n\", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue, priv->pmib->dot11RFEntry.ther));\n\n\t/* Initialize */\n\tif (!pDM_Odm->RFCalibrateInfo.ThermalValue) {\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue = priv->pmib->dot11RFEntry.ther;\n\t}\n\t\n\tif (!pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) {\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = priv->pmib->dot11RFEntry.ther;\n\t}\n\n\tif (!pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) {\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_IQK = priv->pmib->dot11RFEntry.ther;\n\t}\n\t\n\tbTSSIenable = (BOOLEAN)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, rRF_TxGainOffset, BIT7);\t// check TSSI enable\n\t\n\t//4 Query OFDM BB swing default setting \tBit[31:21]\t\n\tfor(p = ODM_RF_PATH_A ; p < c.RfPathCount ; p++)\n\t{\n\t\tele_D = ODM_GetBBReg(pDM_Odm, BBSwingReg[p], 0xffe00000);\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"0x%x:0x%x ([31:21] = 0x%x)\\n\", BBSwingReg[p], ODM_GetBBReg(pDM_Odm, BBSwingReg[p], bMaskDWord), ele_D));\n\t\t\n\t\tfor (BBswingIdx = 0; BBswingIdx < TXSCALE_TABLE_SIZE; BBswingIdx++) {//4 \n\t\t\tif (ele_D == TxScalingTable_Jaguar[BBswingIdx]) {\n\t\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[p] = (u1Byte)BBswingIdx;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"OFDM_index[%d]=%d\\n\",p, pDM_Odm->RFCalibrateInfo.OFDM_index[p]));\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"KfreeOffset[%d]=%d\\n\",p, pRFCalibrateInfo->KfreeOffset[p]));\n\t\t\n\t}\n\n\t/* calculate average thermal meter */\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\n\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   //Average times =  c.AverageThermalNum\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\n\n\tfor(i = 0; i < c.AverageThermalNum; i++)\n\t{\n\t\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])\n\t\t{\n\t\t\tThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\n\t\t\tThermalValue_AVG_count++;\n\t\t}\n\t}\n\n\tif(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\n\t{\n\t\tThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"AVG Thermal Meter = 0x%X, EEPROMthermalmeter = 0x%X\\n\", ThermalValue, priv->pmib->dot11RFEntry.ther));\t\t\t\t\t\n\t}\n\n\t//4 Calculate delta, delta_LCK, delta_IQK.\n\tdelta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);\t\n\tdelta_LCK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_LCK);\n\tdelta_IQK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_IQK);\n\tis_increase = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 0 : 1);\n\n\t//4 if necessary, do LCK.\n\tif (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\n\t\tif (delta_LCK > c.Threshold_IQK) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"delta_LCK(%d) >= Threshold_IQK(%d)\\n\", delta_LCK, c.Threshold_IQK));\n\t\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\n\t\t\tif (c.PHY_LCCalibrate)\n\t\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t\t}\n\t}\n\n\tif (delta_IQK > c.Threshold_IQK) \n\t{\n\t\tpanic_printk(\"%s(%d)\\n\", __FUNCTION__, __LINE__);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"delta_IQK(%d) >= Threshold_IQK(%d)\\n\", delta_IQK, c.Threshold_IQK));\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;\n\t\tif(c.DoIQK)\n\t\t\t(*c.DoIQK)(pDM_Odm, TRUE, 0, 0);\n\t} \n\n\tif(!priv->pmib->dot11RFEntry.ther)\t/*Don't do power tracking since no calibrated thermal value*/\n\t\treturn;\n\t\n\t //4 Do Power Tracking\n\n\t if(bTSSIenable == TRUE)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"**********Enter PURE TSSI MODE**********\\n\"));\n\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TSSI_MODE, p, 0);\n\t}\n\telse if (ThermalValue != pDM_Odm->RFCalibrateInfo.ThermalValue)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"\\n******** START POWER TRACKING ********\\n\")); \t\t\t\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"\\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\\n\", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue, priv->pmib->dot11RFEntry.ther)); \t\t\t\n\t\t\t\t\n#ifdef _TRACKING_TABLE_FILE\n\t\tif (priv->pshare->rf_ft_var.pwr_track_file)\n\t\t{\t\t\t\t\n\t\t\tif (is_increase)\t\t\t// thermal is higher than base\n\t\t\t{\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t\t{\n\t\t\t\t\tswitch(p)\n\t\t\t\t\t{\n\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_B[delta])); \t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_C[delta]));\t\t\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_C[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_D[delta]));\t\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_D[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_A[delta]));\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\t\t\t\t\t// thermal is lower than base\n\t\t\t{\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t\t{\n\t\t\t\t\tswitch(p)\n\t\t\t\t\t{\n\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\n\t\t\tif (is_increase)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> increse power ---> \\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\n\t\t\t} \n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> decrese power --->\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\n\t\t\t}\n\t\t}\n#endif\t\t\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\n******** END:%s() ********\\n\", __FUNCTION__));\n\t//update thermal meter value\n\tpDM_Odm->RFCalibrateInfo.ThermalValue =  ThermalValue;\n\n\t}\n}\n\n#elif(ODM_IC_11AC_SERIES_SUPPORT)\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tunsigned char\t\t\tThermalValue = 0, delta, delta_LCK, channel, is_decrease;\n\tunsigned char\t\t\tThermalValue_AVG_count = 0;\n\tunsigned int\t\t\tThermalValue_AVG = 0, Reg0x18;\n\tunsigned int \t\t\tBBSwingReg[4]={0xc1c,0xe1c,0x181c,0x1a1c};\n\tint \t\t\t\t\tele_D, value32;\n\tchar\t\t\t\t\tOFDM_index[2], index;\n\tunsigned int\t\t\ti = 0, j = 0, rf_path, max_rf_path =2 ,rf;\n\tprtl8192cd_priv\t\tpriv = pDM_Odm->priv;\n\tunsigned char\t\t\tOFDM_min_index = 7; //OFDM BB Swing should be less than +2.5dB, which is required by Arthur and Mimic\n\n#ifdef MP_TEST\n\tif ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\n\t\tchannel = priv->pshare->working_channel;\n\t\tif (priv->pshare->mp_txpwr_tracking == FALSE)\n\t\t\treturn;\n\t} else\n#endif\n\t{\n\t\tchannel = (priv->pmib->dot11RFEntry.dot11channel);\n\t}\n\n#if RTL8881A_SUPPORT\n\tif (pDM_Odm->SupportICType == ODM_RTL8881A) {\n\t\tmax_rf_path = 1;\n\t\tif ((get_bonding_type_8881A() == BOND_8881AM ||get_bonding_type_8881A() == BOND_8881AN) \t\t\t\n\t\t\t&& priv->pshare->rf_ft_var.use_intpa8881A && (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G))\t\t\t\n\t\t\tOFDM_min_index = 6;\t\t// intPA - upper bond set to +3 dB (base: -2 dB)ot11RFEntry.phyBandSelect == PHY_BAND_2G))\n\t\telse\n\t\t\tOFDM_min_index = 10;\t\t//OFDM BB Swing should be less than +1dB, which is required by Arthur and Mimic\n\t}\n#endif\n\n\n\tThermalValue = (unsigned char)PHY_QueryRFReg(priv, RF_PATH_A, 0x42, 0xfc00, 1); //0x42: RF Reg[15:10] 88E\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\\n\", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));\n\n\n\t//4 Query OFDM BB swing default setting \tBit[31:21]\n\tfor(rf_path = 0 ; rf_path < max_rf_path ; rf_path++){\n\t\tele_D = PHY_QueryBBReg(priv, BBSwingReg[rf_path], 0xffe00000);\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"0x%x:0x%x ([31:21] = 0x%x)\\n\",BBSwingReg[rf_path], PHY_QueryBBReg(priv, BBSwingReg[rf_path], bMaskDWord),ele_D)); \t\t\t\n\t\tfor (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {//4 \n\t\t\tif (ele_D == OFDMSwingTable_8812[i]) {\n\t\t\t\tOFDM_index[rf_path] = (unsigned char)i;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"OFDM_index[%d]=%d\\n\",rf_path, OFDM_index[rf_path]));\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n#if 0\t\n\t//Query OFDM path A default setting \tBit[31:21]\n\tele_D = PHY_QueryBBReg(priv, 0xc1c, 0xffe00000);\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"0xc1c:0x%x ([31:21] = 0x%x)\\n\", PHY_QueryBBReg(priv, 0xc1c, bMaskDWord),ele_D)); \t\t\t\n\tfor (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {//4 \n\t\tif (ele_D == OFDMSwingTable_8812[i]) {\n\t\t\tOFDM_index[0] = (unsigned char)i;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"OFDM_index[0]=%d\\n\", OFDM_index[0]));\t\t\t\t\n\t\t\tbreak;\n\t\t}\n\t}\n\t//Query OFDM path B default setting\n\tif (rf == 2) {\n\t\tele_D = PHY_QueryBBReg(priv, 0xe1c, 0xffe00000);\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"0xe1c:0x%x ([32:21] = 0x%x)\\n\", PHY_QueryBBReg(priv, 0xe1c, bMaskDWord),ele_D)); \t\t\t\n\t\tfor (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {\n\t\t\tif (ele_D == OFDMSwingTable_8812[i]) {\n\t\t\t\tOFDM_index[1] = (unsigned char)i;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"OFDM_index[1]=%d\\n\", OFDM_index[1])); \t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n#endif\n\t/* Initialize */\n\tif (!priv->pshare->ThermalValue) {\n\t\tpriv->pshare->ThermalValue = priv->pmib->dot11RFEntry.ther;\n\t\tpriv->pshare->ThermalValue_LCK = ThermalValue;\n\t}\n\n\t/* calculate average thermal meter */\n\t{\n\t\tpriv->pshare->ThermalValue_AVG_8812[priv->pshare->ThermalValue_AVG_index_8812] = ThermalValue;\n\t\tpriv->pshare->ThermalValue_AVG_index_8812++;\n\t\tif (priv->pshare->ThermalValue_AVG_index_8812 == AVG_THERMAL_NUM_8812)\n\t\t\tpriv->pshare->ThermalValue_AVG_index_8812 = 0;\n\n\t\tfor (i = 0; i < AVG_THERMAL_NUM_8812; i++) {\n\t\t\tif (priv->pshare->ThermalValue_AVG_8812[i]) {\n\t\t\t\tThermalValue_AVG += priv->pshare->ThermalValue_AVG_8812[i];\n\t\t\t\tThermalValue_AVG_count++;\n\t\t\t}\n\t\t}\n\n\t\tif (ThermalValue_AVG_count) {\n\t\t\tThermalValue = (unsigned char)(ThermalValue_AVG / ThermalValue_AVG_count);\n\t\t\t//printk(\"AVG Thermal Meter = 0x%x \\n\", ThermalValue);\n\t\t}\n\t}\n\t\n\n\t//4 If necessary,  do power tracking\n\n\tif(!priv->pmib->dot11RFEntry.ther) /*Don't do power tracking since no calibrated thermal value*/\n\t\treturn;  \n\n\tif (ThermalValue != priv->pshare->ThermalValue) {\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\n******** START POWER TRACKING ********\\n\")); \t\t\t\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\\n\", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther)); \t\t\t\n\t\tdelta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);\n\t\tdelta_LCK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_LCK);\n\t\tis_decrease = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 1 : 0);\n\t\t//if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G) \n\t\t{\n#ifdef _TRACKING_TABLE_FILE\n\t\t\tif (priv->pshare->rf_ft_var.pwr_track_file) {\t\t\t\t\n\t\t\t\tfor (rf_path = 0; rf_path < max_rf_path; rf_path++) {\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"Diff: (%s)%d ==> get index from table : %d)\\n\", (is_decrease?\"-\":\"+\"), delta, get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\n\t\t\t\t\tif (is_decrease) {\n\t\t\t\t\t\tOFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] + get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);\n\t\t\t\t\t\tOFDM_index[rf_path] = ((OFDM_index[rf_path] > (OFDM_TABLE_SIZE_8812 - 1)) ? (OFDM_TABLE_SIZE_8812 - 1) : OFDM_index[rf_path]);\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\\n\", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\n#if 0// RTL8881A_SUPPORT\n\t\t\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8881A){\n\t\t\t\t\t\t\tif(priv->pshare->rf_ft_var.pwrtrk_TxAGC_enable){\n\t\t\t\t\t\t\t\tif(priv->pshare->AddTxAGC){//TxAGC has been added\n\t\t\t\t\t\t\t\t\tAddTxPower88XX_AC(priv,0); \n\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC = 0;\n\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC_index = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n#endif\t\t\t\t\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tOFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] - get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);\n#if 0// RTL8881A_SUPPORT\n\t\t\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8881A){ \n\t\t\t\t\t\t\tif(priv->pshare->rf_ft_var.pwrtrk_TxAGC_enable){\n\t\t\t\t\t\t\t\tif(OFDM_index[i] < OFDM_min_index){\n\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC_index = (OFDM_min_index - OFDM_index[i])/2;  // Calculate Remnant TxAGC Value,  2 index for 1 TxAGC \n\t\t\t\t\t\t\t\t\tAddTxPower88XX_AC(priv,priv->pshare->AddTxAGC_index);\n\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC = 1;     //AddTxAGC Flag = 1\n\t\t\t\t\t\t\t\t\tOFDM_index[i] = OFDM_min_index;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tif(priv->pshare->AddTxAGC){// TxAGC been added\n\t\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC = 0;\n\t\t\t\t\t\t\t\t\t\tpriv->pshare->AddTxAGC_index = 0;\n\t\t\t\t\t\t\t\t\t\tAddTxPower88XX_AC(priv,0); //minus the added TPI\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n#else\n\t\t\t\t\t\tOFDM_index[rf_path] = ((OFDM_index[rf_path] < OFDM_min_index) ?  OFDM_min_index : OFDM_index[rf_path]);\n#endif\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\">>> increse power ---> new OFDM_INDEX:%d (%d - %d)\\n\", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t\t//4 Set new BB swing index\n\t\t\tfor (rf_path = 0; rf_path < max_rf_path; rf_path++) {\n\t\t\t\tPHY_SetBBReg(priv, BBSwingReg[rf_path], 0xffe00000, OFDMSwingTable_8812[(unsigned int)OFDM_index[rf_path]]);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"Readback 0x%x[31:21] = 0x%x, OFDM_index:%d\\n\",BBSwingReg[rf_path], PHY_QueryBBReg(priv, BBSwingReg[rf_path], 0xffe00000), OFDM_index[rf_path]));\t\t\t\t\n\t\t\t}\n\n\t\t}\n\t\tif (delta_LCK > 8) {\n\t\t\tRTL_W8(0x522, 0xff);\n\t\t\tReg0x18 = PHY_QueryRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, 1);\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 1);\t\t\t\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0x18, BIT(15), 1);\n            delay_ms(200); // frequency deviation\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 0);\n\t\t\tPHY_SetRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, Reg0x18);\n\t\t\t#ifdef CONFIG_RTL_8812_SUPPORT\n\t\t\tif (GET_CHIP_VER(priv)== VERSION_8812E)\t\t\t\n\t\t\t\tUpdateBBRFVal8812(priv, priv->pmib->dot11RFEntry.dot11channel);\t\n\t\t\t#endif\n\t\t\tRTL_W8(0x522, 0x0);\n\t\t\tpriv->pshare->ThermalValue_LCK = ThermalValue;\n\t\t}\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"\\n******** END:%s() ********\\n\", __FUNCTION__));\n\n\t\t//update thermal meter value\n\t\tpriv->pshare->ThermalValue = ThermalValue;\n\t\tfor (rf_path = 0; rf_path < max_rf_path; rf_path++)\n\t\t\tpriv->pshare->OFDM_index[rf_path] = OFDM_index[rf_path];\n\t}\n}\n\n#endif\n\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n#if (RTL8814A_SUPPORT == 1)\t\t//use this function to do power tracking after 8814 by YuChen\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A) {\n\t\tODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries2(pDM_Odm);\n\t\treturn;\n\t\t}\n#elif ODM_IC_11AC_SERIES_SUPPORT\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\tODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries(pDM_Odm);\n\t\treturn;\n\t}\n#endif\n\n#if (RTL8192E_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType==ODM_RTL8192E) {\n\t\tODM_TXPowerTrackingCallback_ThermalMeter_92E(pDM_Odm);\n\t\treturn;\n\t}\n#endif\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t//PMGNT_INFO      \t\tpMgntInfo = &Adapter->MgntInfo;\n#endif\n\t\n\tu1Byte\t\t\tThermalValue = 0, delta, delta_LCK, delta_IQK, offset;\n\tu1Byte\t\t\tThermalValue_AVG_count = 0;\n\tu4Byte\t\t\tThermalValue_AVG = 0;\t\n//\ts4Byte\t\t\tele_A=0, ele_D, TempCCk, X, value32;\n//\ts4Byte\t\t\tY, ele_C=0;\n//\ts1Byte\t\t\tOFDM_index[2], CCK_index=0, OFDM_index_old[2]={0,0}, CCK_index_old=0, index;\n//\ts1Byte\t\t\tdeltaPowerIndex = 0;\n\tu4Byte\t\t\ti = 0;//, j = 0;\n\tBOOLEAN \t\tis2T = FALSE;\n//\tBOOLEAN \t\tbInteralPA = FALSE;\n\n\tu1Byte\t\t\tOFDM_max_index = 34, rf = (is2T) ? 2 : 1; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur\n\tu1Byte\t\t\tIndexforchannel = 0;/*GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/\n    enum            _POWER_DEC_INC { POWER_DEC, POWER_INC };\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\t#endif\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t#endif\n\n\tTXPWRTRACK_CFG \tc;\n\n\n\t//4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\n\ts1Byte\t\t\tdeltaSwingTableIdx[2][index_mapping_NUM_88E] = { \n                        // {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}}\n                        {0,0,2,3,4,4,5,6,7,7,8,9,10,10,11}, {0,0,1,2,3,4,4,4,4,5,7,8,9,9,10}\n                    };\t\n\tu1Byte\t\t\tthermalThreshold[2][index_mapping_NUM_88E]={\n                        // {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}}\n\t\t\t\t\t    {0,2,4,6,8,10,12,14,16,18,20,22,24,26,27}, {0,2,4,6,8,10,12,14,16,18,20,22,25,25,25}\n                    };\t\t\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tprtl8192cd_priv\tpriv = pDM_Odm->priv;\n#endif\t\n\n\t//4 2. Initilization ( 7 steps in total )\n\n\tConfigureTxpowerTrack(pDM_Odm, &c);\n\t\n\tpDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug\n\tpDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE;\n    \n#if (MP_DRIVER == 1)      \n    pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl; // <Kordan> We should keep updating the control variable according to HalData.\n    // <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.\n    pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317; \n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP) && defined(MP_TEST)\n\tif ((OPMODE & WIFI_MP_STATE) || pDM_Odm->priv->pshare->rf_ft_var.mp_specific) {\n\t\tif(pDM_Odm->priv->pshare->mp_txpwr_tracking == FALSE)\n\t\t\treturn;\n\t}\n#endif\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"===>odm_TXPowerTrackingCallback_ThermalMeter_8188E, pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase: %d \\n\", pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase));\n/*\n\tif (!pDM_Odm->RFCalibrateInfo.TM_Trigger) {\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, c.ThermalRegAddr, BIT17 | BIT16, 0x3);\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 1;\n\t\treturn;\n\t}\n*/\t\n\tThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, RF_PATH_A, c.ThermalRegAddr, 0xfc00);\t//0x42: RF Reg[15:10] 88E\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tif( ! ThermalValue || ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\n#else\n\tif( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\n#endif\t\t\n        return;\n\n\t//4 3. Initialize ThermalValues of RFCalibrateInfo\n\t\n\tif( ! pDM_Odm->RFCalibrateInfo.ThermalValue)\n\t{\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\t\t\t\t\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;\t\t\t\t\t\t\t\t\t\t\n\t}\t\t\t\n\n\tif(pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"reload ofdm index for band switch\\n\"));\t\t\t\t\n\t}\n\n\t//4 4. Calculate average thermal meter\n\t\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\n\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\n\n\tfor(i = 0; i < c.AverageThermalNum; i++)\n\t{\n\t\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])\n\t\t{\n\t\t\tThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\n\t\t\tThermalValue_AVG_count++;\n\t\t}\n\t}\n\n\tif(ThermalValue_AVG_count)\n\t{\n\t\t// Give the new thermo value a weighting\n\t\tThermalValue_AVG += (ThermalValue*4);\n\t\t\n\t\tThermalValue = (u1Byte)(ThermalValue_AVG / (ThermalValue_AVG_count+4));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"AVG Thermal Meter = 0x%x \\n\", ThermalValue));\t\t\t\t\t\n\t}\n\t\t\t\n\t//4 5. Calculate delta, delta_LCK, delta_IQK.\n\t\n\tdelta \t  = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);\n\tdelta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);\n\tdelta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);\n\t\t\n\t//4 6. If necessary, do LCK.\t\n\tif (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\n\t/*if((delta_LCK > pHalData->Delta_LCK) && (pHalData->Delta_LCK != 0))*/\n\t\tif (delta_LCK >= c.Threshold_IQK) { \n\t\t\t/*Delta temperature is equal to or larger than 20 centigrade.*/\n\t\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\n\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t\t}\n\t}\n\n\t//3 7. If necessary, move the index of swing table to adjust Tx power.\t\n\t\n\tif (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\n\t{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\n\t    delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);\t\t\n#else\n\t    delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);\t\t\n#endif\n\n\n\t\t//4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset\n\t\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\t\n\t\tif(ThermalValue > pHalData->EEPROMThermalMeter) {\n#else\n\t\tif(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\n#endif\n\t\t\tCALCULATE_SWINGTALBE_OFFSET(offset, POWER_INC, index_mapping_NUM_88E, delta);\n\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex;\n\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex =  deltaSwingTableIdx[POWER_INC][offset];\n\n        } else {\n        \n\t\t\tCALCULATE_SWINGTALBE_OFFSET(offset, POWER_DEC, index_mapping_NUM_88E, delta);\n\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex;\n\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex = (-1)*deltaSwingTableIdx[POWER_DEC][offset];\n        }\n\t\t\n\t\tif (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast)\n\t\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0;\n\t\telse\n\t\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast;\n\t\t\n\t    for(i = 0; i < rf; i++) \t\t\n\t    \tpDM_Odm->RFCalibrateInfo.OFDM_index[i] = pRFCalibrateInfo->BbSwingIdxOfdmBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset;\n\t\tpDM_Odm->RFCalibrateInfo.CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset;\n\n\t\tpRFCalibrateInfo->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;\t\n\t\tpRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A] = pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_A];\t\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"The 'OFDM' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A], pRFCalibrateInfo->BbSwingIdxOfdmBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset));\n\n\t\t//4 7.1 Handle boundary conditions of index.\n\t\t\n\t\t\n\t\tfor(i = 0; i < rf; i++)\n\t\t{\n\t\t\tif(pDM_Odm->RFCalibrateInfo.OFDM_index[i] > OFDM_max_index)\n\t\t\t{\n\t\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[i] = OFDM_max_index;\n\t\t\t}\n\t\t\telse if (pDM_Odm->RFCalibrateInfo.OFDM_index[i] < 0)\n\t\t\t{\n\t\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tif(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)\n\t\t\tpDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;\n\t\telse if (pDM_Odm->RFCalibrateInfo.CCK_index < 0)\n\t\t\tpDM_Odm->RFCalibrateInfo.CCK_index = 0;\n\t}\n\telse\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"The thermal meter is unchanged or TxPowerTracking OFF: ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d)\\n\", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));\n\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0;\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t(\"TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\\n\", pDM_Odm->RFCalibrateInfo.CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));\n\t\t\t\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t(\"TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index: %d\\n\", pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_A], pRFCalibrateInfo->BbSwingIdxOfdmBase));\n\t\n\tif (pDM_Odm->RFCalibrateInfo.PowerIndexOffset != 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\n\t{\n\t\t//4 7.2 Configure the Swing Table to adjust Tx Power.\n\t\t\n\t\t\tpDM_Odm->RFCalibrateInfo.bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.\t\t\t\n\t\t\t//\n\t\t\t// 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\n\t\t\t// to increase TX power. Otherwise, EVM will be bad.\n\t\t\t//\n\t\t\t// 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\n\t\t\tif (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)\n\t\t\t{\n\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t//\t(\"Temperature Increasing: delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\", \n\t\t\t\t//\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset, delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));\t\n\t\t\t}\n\t\t\telse if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature\n\t\t\t{\n\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t//\t(\"Temperature Decreasing: delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\",\n\t\t\t\t//\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset, delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));\t\t\t\t\n\t\t\t}\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tif (ThermalValue > pHalData->EEPROMThermalMeter)\n#else\n\t\t\tif (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\n#endif\n\t\t\t{\n//\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"Temperature(%d) hugher than PG value(%d), increases the power by TxAGC\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TXAGC, 0, 0);\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t//\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"Temperature(%d) lower than PG value(%d), increases the power by TxAGC\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\n\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, RF_PATH_A, Indexforchannel);\t\n\t\t\t\tif(is2T)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, RF_PATH_B, Indexforchannel);\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;\n\t\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase = pRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A];\n\t\t\tpDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;\n\n\t}\n\t\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t// if((delta_IQK > pHalData->Delta_IQK) && (pHalData->Delta_IQK != 0))\n\tif ((delta_IQK >= 8)) // Delta temperature is equal to or larger than 20 centigrade.\n\t\t(*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\n#endif\t\t\n\t\t\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"<===dm_TXPowerTrackingCallback_ThermalMeter_8188E\\n\"));\n\t\n\tpDM_Odm->RFCalibrateInfo.TXPowercount = 0;\n}\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n\nVOID\nphy_PathAStandBy(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tRTPRINT(FINIT, INIT_IQK, (\"Path-A standby mode!\\n\"));\n\n\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x0);\n\tPHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000);\n\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x808000);\n}\n\n//1 7.\tIQK\n//#define MAX_TOLERANCE\t\t5\n//#define IQK_DELAY_TIME\t\t1\t\t//ms\n\nu1Byte\t\t\t//bit0 = 1 => Tx OK, bit1 = 1 => Rx OK\nphy_PathA_IQK_8192C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tconfigPathB\n\t)\n{\n\n\tu4Byte regEAC, regE94, regE9C, regEA4;\n\tu1Byte result = 0x00;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tRTPRINT(FINIT, INIT_IQK, (\"Path A IQK!\\n\"));\n\n\t//path-A IQK setting\n\tRTPRINT(FINIT, INIT_IQK, (\"Path-A IQK setting!\\n\"));\n\tif(pAdapter->interfaceIndex == 0)\n\t{\n\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\n\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\n\t}\n\telse\n\t{\n\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c22);\n\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c22);\t\n\t}\n\n\tPHY_SetBBReg(pAdapter, rTx_IQK_PI_A, bMaskDWord, 0x82140102);\n\n\tPHY_SetBBReg(pAdapter, rRx_IQK_PI_A, bMaskDWord, configPathB ? 0x28160202 : \n\t\tIS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)?0x28160202:0x28160502);\n\n\t//path-B IQK setting\n\tif(configPathB)\n\t{\n\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x10008c22);\n\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x10008c22);\n\t\tPHY_SetBBReg(pAdapter, rTx_IQK_PI_B, bMaskDWord, 0x82140102);\n\t\tPHY_SetBBReg(pAdapter, rRx_IQK_PI_B, bMaskDWord, 0x28160202);\n\t}\n\n\t//LO calibration setting\n\tRTPRINT(FINIT, INIT_IQK, (\"LO calibration setting!\\n\"));\n\tPHY_SetBBReg(pAdapter, rIQK_AGC_Rsp, bMaskDWord, 0x001028d1);\n\n\t//One shot, path A LOK & IQK\n\tRTPRINT(FINIT, INIT_IQK, (\"One shot, path A LOK & IQK!\\n\"));\n\tPHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\n\tPHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);\n\t\n\t// delay x ms\n\tRTPRINT(FINIT, INIT_IQK, (\"Delay %d ms for One shot, path A LOK & IQK.\\n\", IQK_DELAY_TIME));\n\tPlatformStallExecution(IQK_DELAY_TIME*1000);\n\n\t// Check failed\n\tregEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xeac = 0x%x\\n\", regEAC));\n\tregE94 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xe94 = 0x%x\\n\", regE94));\n\tregE9C= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xe9c = 0x%x\\n\", regE9C));\n\tregEA4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xea4 = 0x%x\\n\", regEA4));\n\n\tif(!(regEAC & BIT28) &&\t\t\n\t\t(((regE94 & 0x03FF0000)>>16) != 0x142) &&\n\t\t(((regE9C & 0x03FF0000)>>16) != 0x42) )\n\t\tresult |= 0x01;\n\telse\t\t\t\t\t\t\t//if Tx not OK, ignore Rx\n\t\treturn result;\n\n\tif(!(regEAC & BIT27) &&\t\t//if Tx is OK, check whether Rx is OK\n\t\t(((regEA4 & 0x03FF0000)>>16) != 0x132) &&\n\t\t(((regEAC & 0x03FF0000)>>16) != 0x36))\n\t\tresult |= 0x02;\n\telse\n\t\tRTPRINT(FINIT, INIT_IQK, (\"Path A Rx IQK fail!!\\n\"));\n\t\n\treturn result;\n\n\n}\n\nu1Byte\t\t\t\t//bit0 = 1 => Tx OK, bit1 = 1 => Rx OK\nphy_PathB_IQK_8192C(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tu4Byte regEAC, regEB4, regEBC, regEC4, regECC;\n\tu1Byte\tresult = 0x00;\n\tRTPRINT(FINIT, INIT_IQK, (\"Path B IQK!\\n\"));\n\n\t//One shot, path B LOK & IQK\n\tRTPRINT(FINIT, INIT_IQK, (\"One shot, path A LOK & IQK!\\n\"));\n\tPHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000002);\n\tPHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000000);\n\n\t// delay x ms\n\tRTPRINT(FINIT, INIT_IQK, (\"Delay %d ms for One shot, path B LOK & IQK.\\n\", IQK_DELAY_TIME));\n\tPlatformStallExecution(IQK_DELAY_TIME*1000);\n\n\t// Check failed\n\tregEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xeac = 0x%x\\n\", regEAC));\n\tregEB4 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xeb4 = 0x%x\\n\", regEB4));\n\tregEBC= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xebc = 0x%x\\n\", regEBC));\n\tregEC4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xec4 = 0x%x\\n\", regEC4));\n\tregECC= PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord);\n\tRTPRINT(FINIT, INIT_IQK, (\"0xecc = 0x%x\\n\", regECC));\n\n\tif(!(regEAC & BIT31) &&\n\t\t(((regEB4 & 0x03FF0000)>>16) != 0x142) &&\n\t\t(((regEBC & 0x03FF0000)>>16) != 0x42))\n\t\tresult |= 0x01;\n\telse\n\t\treturn result;\n\n\tif(!(regEAC & BIT30) &&\n\t\t(((regEC4 & 0x03FF0000)>>16) != 0x132) &&\n\t\t(((regECC & 0x03FF0000)>>16) != 0x36))\n\t\tresult |= 0x02;\n\telse\n\t\tRTPRINT(FINIT, INIT_IQK, (\"Path B Rx IQK fail!!\\n\"));\n\t\n\n\treturn result;\n\n}\n\nVOID\nphy_PathAFillIQKMatrix(\n\tIN\tPADAPTER\tpAdapter,\n\tIN  BOOLEAN    \tbIQKOK,\n\tIN\ts4Byte\t\tresult[][8],\n\tIN\tu1Byte\t\tfinal_candidate,\n\tIN  BOOLEAN\t\tbTxOnly\n\t)\n{\n\tu4Byte\tOldval_0, X, TX0_A, reg;\n\ts4Byte\tY, TX0_C;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\t\n\t\n\tRTPRINT(FINIT, INIT_IQK, (\"Path A IQ Calibration %s !\\n\",(bIQKOK)?\"Success\":\"Failed\"));\n\n\tif(final_candidate == 0xFF)\n\t\treturn;\n\n\telse if(bIQKOK)\n\t{\n\t\tOldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;\n\n\t\tX = result[final_candidate][0];\n\t\tif ((X & 0x00000200) != 0)\n\t\t\tX = X | 0xFFFFFC00;\t\t\t\t\n\t\tTX0_A = (X * Oldval_0) >> 8;\n\t\tRTPRINT(FINIT, INIT_IQK, (\"X = 0x%x, TX0_A = 0x%x, Oldval_0 0x%x\\n\", X, TX0_A, Oldval_0));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X * Oldval_0>>7) & 0x1));\n     \n\t\tY = result[final_candidate][1];\n\t\tif ((Y & 0x00000200) != 0)\n\t\t\tY = Y | 0xFFFFFC00;\t\t\n\n\t\t//path B IQK result + 3\n\t\tif(pAdapter->interfaceIndex == 1 && pHalData->CurrentBandType == BAND_ON_5G)\n\t\t\tY += 3;\n\t\t\n\t\tTX0_C = (Y * Oldval_0) >> 8;\n\t\tRTPRINT(FINIT, INIT_IQK, (\"Y = 0x%x, TX = 0x%x\\n\", Y, TX0_C));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y * Oldval_0>>7) & 0x1));\n\n\t\tif(bTxOnly)\n\t\t{\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_PathAFillIQKMatrix only Tx OK\\n\"));\t\t\n\t\t\treturn;\n\t\t}\n\n\t\treg = result[final_candidate][2];\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);\n\t\n\t\treg = result[final_candidate][3] & 0x3F;\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);\n\n\t\treg = (result[final_candidate][3] >> 6) & 0xF;\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);\n\t}\n}\n\nVOID\nphy_PathBFillIQKMatrix(\n\tIN\tPADAPTER\tpAdapter,\n\tIN  BOOLEAN   \tbIQKOK,\n\tIN\ts4Byte\t\tresult[][8],\n\tIN\tu1Byte\t\tfinal_candidate,\n\tIN\tBOOLEAN\t\tbTxOnly\t\t\t//do Tx only\n\t)\n{\n\tu4Byte\tOldval_1, X, TX1_A, reg;\n\ts4Byte\tY, TX1_C;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\t\n\t\n\tRTPRINT(FINIT, INIT_IQK, (\"Path B IQ Calibration %s !\\n\",(bIQKOK)?\"Success\":\"Failed\"));\n\n\tif(final_candidate == 0xFF)\n\t\treturn;\n\n\telse if(bIQKOK)\n\t{\n\t\tOldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;\n\n\t\tX = result[final_candidate][4];\n\t\tif ((X & 0x00000200) != 0)\n\t\t\tX = X | 0xFFFFFC00;\t\t\n\t\tTX1_A = (X * Oldval_1) >> 8;\n\t\tRTPRINT(FINIT, INIT_IQK, (\"X = 0x%x, TX1_A = 0x%x\\n\", X, TX1_A));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X * Oldval_1>>7) & 0x1));\n\n\t\tY = result[final_candidate][5];\n\t\tif ((Y & 0x00000200) != 0)\n\t\t\tY = Y | 0xFFFFFC00;\t\t\n\t\tif(pHalData->CurrentBandType == BAND_ON_5G)\t\t\n\t\t\tY += 3;\t\t//temp modify for preformance\n\t\tTX1_C = (Y * Oldval_1) >> 8;\n\t\tRTPRINT(FINIT, INIT_IQK, (\"Y = 0x%x, TX1_C = 0x%x\\n\", Y, TX1_C));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y * Oldval_1>>7) & 0x1));\n\n\t\tif(bTxOnly)\n\t\t\treturn;\n\n\t\treg = result[final_candidate][6];\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);\n\t\n\t\treg = result[final_candidate][7] & 0x3F;\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);\n\n\t\treg = (result[final_candidate][7] >> 6) & 0xF;\n\t\tPHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg);\n\t}\n}\n\n\nBOOLEAN\t\t\t\t\t\t\t\nphy_SimularityCompare_92C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\ts4Byte \t\tresult[][8],\n\tIN\tu1Byte\t\t c1,\n\tIN\tu1Byte\t\t c2\n\t)\n{\n\tu4Byte\t\ti, j, diff, SimularityBitMap, bound = 0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\t\n\tu1Byte\t\tfinal_candidate[2] = {0xFF, 0xFF};\t//for path A and path B\n\tBOOLEAN\t\tbResult = TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID);\n\t\n\tif(is2T)\n\t\tbound = 8;\n\telse\n\t\tbound = 4;\n\n\tSimularityBitMap = 0;\n\t\n\tfor( i = 0; i < bound; i++ )\n\t{\n\t\tdiff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]);\n\t\tif (diff > MAX_TOLERANCE)\n\t\t{\n\t\t\tif((i == 2 || i == 6) && !SimularityBitMap)\n\t\t\t{\n\t\t\t\tif(result[c1][i]+result[c1][i+1] == 0)\n\t\t\t\t\tfinal_candidate[(i/4)] = c2;\n\t\t\t\telse if (result[c2][i]+result[c2][i+1] == 0)\n\t\t\t\t\tfinal_candidate[(i/4)] = c1;\n\t\t\t\telse\n\t\t\t\t\tSimularityBitMap = SimularityBitMap|(1<<i);\t\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t\tSimularityBitMap = SimularityBitMap|(1<<i);\n\t\t}\n\t}\n\t\n\tif ( SimularityBitMap == 0)\n\t{\n\t\tfor( i = 0; i < (bound/4); i++ )\n\t\t{\n\t\t\tif(final_candidate[i] != 0xFF)\n\t\t\t{\n\t\t\t\tfor( j = i*4; j < (i+1)*4-2; j++)\n\t\t\t\t\tresult[3][j] = result[final_candidate[i]][j];\n\t\t\t\tbResult = FALSE;\n\t\t\t}\n\t\t}\n\t\treturn bResult;\n\t}\n\telse if (!(SimularityBitMap & 0x0F))\t\t\t//path A OK\n\t{\n\t\tfor(i = 0; i < 4; i++)\n\t\t\tresult[3][i] = result[c1][i];\n\t\treturn FALSE;\n\t}\n\telse if (!(SimularityBitMap & 0xF0) && is2T)\t//path B OK\n\t{\n\t\tfor(i = 4; i < 8; i++)\n\t\t\tresult[3][i] = result[c1][i];\n\t\treturn FALSE;\n\t}\t\n\telse\t\t\n\t\treturn FALSE;\n\t\n}\n\n/*\nreturn FALSE => do IQK again\n*/\nBOOLEAN\t\t\t\t\t\t\t\nphy_SimularityCompare(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\ts4Byte \t\tresult[][8],\n\tIN\tu1Byte\t\t c1,\n\tIN\tu1Byte\t\t c2\n\t)\n{\t\n\treturn phy_SimularityCompare_92C(pAdapter, result, c1, c2);\t\n\n}\n\nVOID\t\nphy_IQCalibrate_8192C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\ts4Byte \t\tresult[][8],\n\tIN\tu1Byte\t\tt,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu4Byte\t\t\ti;\n\tu1Byte\t\t\tPathAOK, PathBOK;\n\tu4Byte\t\t\tADDA_REG[IQK_ADDA_REG_NUM] = {\t\n\t\t\t\t\t\trFPGA0_XCD_SwitchControl, \trBlue_Tooth, \t\n\t\t\t\t\t\trRx_Wait_CCA, \t\trTx_CCK_RFON,\n\t\t\t\t\t\trTx_CCK_BBON, \trTx_OFDM_RFON, \t\n\t\t\t\t\t\trTx_OFDM_BBON, \trTx_To_Rx,\n\t\t\t\t\t\trTx_To_Tx, \t\trRx_CCK, \t\n\t\t\t\t\t\trRx_OFDM, \t\trRx_Wait_RIFS,\n\t\t\t\t\t\trRx_TO_Rx, \t\trStandby, \t\n\t\t\t\t\t\trSleep, \t\t\trPMPD_ANAEN };\n\tu4Byte\t\t\tIQK_MAC_REG[IQK_MAC_REG_NUM] = {\n\t\t\t\t\t\tREG_TXPAUSE, \t\tREG_BCN_CTRL,\t\n\t\t\t\t\t\tREG_BCN_CTRL_1,\tREG_GPIO_MUXCFG};\n\t\t\t\t\t\n\t//since 92C & 92D have the different define in IQK_BB_REG\t\n\tu4Byte\tIQK_BB_REG_92C[IQK_BB_REG_NUM] = {\n\t\t\t\t\t\t\trOFDM0_TRxPathEnable, \t\trOFDM0_TRMuxPar,\t\n\t\t\t\t\t\t\trFPGA0_XCD_RFInterfaceSW,\trConfig_AntA,\trConfig_AntB,\n\t\t\t\t\t\t\trFPGA0_XAB_RFInterfaceSW,\trFPGA0_XA_RFInterfaceOE,\t\n\t\t\t\t\t\t\trFPGA0_XB_RFInterfaceOE,\t/*rFPGA0_RFMOD*/ rCCK0_AFESetting\t\n\t\t\t\t\t\t\t};\t\n\n\tu4Byte\tIQK_BB_REG_92D[IQK_BB_REG_NUM_92D] = {\t//for normal\n\t\t\t\t\t\t\trFPGA0_XAB_RFInterfaceSW,\trFPGA0_XA_RFInterfaceOE,\t\n\t\t\t\t\t\t\trFPGA0_XB_RFInterfaceOE,\trOFDM0_TRMuxPar,\n\t\t\t\t\t\t\trFPGA0_XCD_RFInterfaceSW,\trOFDM0_TRxPathEnable,\t\n\t\t\t\t\t\t\t/*rFPGA0_RFMOD*/ rCCK0_AFESetting,\t\t\trFPGA0_AnalogParameter4,\n\t\t\t\t\t\t\trOFDM0_XAAGCCore1,\t\trOFDM0_XBAGCCore1\t\t\t\t\t\t\n\t\t\t\t\t\t};\t\t\n#if MP_DRIVER\n\tconst u4Byte\tretryCount = 9;\n#else\n\tconst u4Byte\tretryCount = 2;\n#endif\n\t//Neil Chen--2011--05--19--\n       //3 Path Div\t\n\tu1Byte                 rfPathSwitch=0x0;\n\n\t// Note: IQ calibration must be performed after loading \n\t// \t\tPHY_REG.txt , and radio_a, radio_b.txt\t\n\t\n\tu4Byte bbvalue;\n\n\tif(t==0)\n\t{\n\t \t //bbvalue = PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bMaskDWord);\n\t\t//\tRTPRINT(FINIT, INIT_IQK, (\"phy_IQCalibrate_8192C()==>0x%08x\\n\",bbvalue));\n\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"IQ Calibration for %s\\n\", (is2T ? \"2T2R\" : \"1T1R\")));\n\t\n\t \t// Save ADDA parameters, turn Path A ADDA on\n\t \tphy_SaveADDARegisters(pAdapter, ADDA_REG, pHalData->ADDA_backup, IQK_ADDA_REG_NUM);\n\t\tphy_SaveMACRegisters(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\n\t\tphy_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup, IQK_BB_REG_NUM);\n\t}\n\t\n \tphy_PathADDAOn(pAdapter, ADDA_REG, TRUE, is2T);\n\t\n\tif(t==0)\n\t{\n\t\tpHalData->bRfPiEnable = (u1Byte)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8));\n\t}\n\t\n\tif(!pHalData->bRfPiEnable){\n\t\t// Switch BB to PI mode to do IQ Calibration.\n\t\tphy_PIModeSwitch(pAdapter, TRUE);\n\t}\n\t\n\t//MAC settings\n\tphy_MACSettingCalibration(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\n\t\n\t//PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0x00);\t\t\n\tPHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskDWord, (0x0f000000 | (PHY_QueryBBReg(pAdapter, rCCK0_AFESetting, bMaskDWord))) );\n\tPHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);\n\tPHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);\n\tPHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);\n\t{\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01);\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01);\t\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00);\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00);\t\n\t}\n\n\tif(is2T)\n\t{\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000);\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000);\n\t}\n\n\t{\n\t\t//Page B init\n\t\tPHY_SetBBReg(pAdapter, rConfig_AntA, bMaskDWord, 0x00080000);\n\t\t\n\t\tif(is2T)\n\t\t{\n\t\t\tPHY_SetBBReg(pAdapter, rConfig_AntB, bMaskDWord, 0x00080000);\n\t\t}\n\t}\n\t// IQ calibration setting\n\tRTPRINT(FINIT, INIT_IQK, (\"IQK setting!\\n\"));\t\t\n\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x808000);\n\tPHY_SetBBReg(pAdapter, rTx_IQK, bMaskDWord, 0x01007c00);\n\tPHY_SetBBReg(pAdapter, rRx_IQK, bMaskDWord, 0x01004800);\n\n\tfor(i = 0 ; i < retryCount ; i++){\n\t\tPathAOK = phy_PathA_IQK_8192C(pAdapter, is2T);\n\t\tif(PathAOK == 0x03){\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"Path A IQK Success!!\\n\"));\n\t\t\t\tresult[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][2] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][3] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;\n\t\t\tbreak;\n\t\t}\n\t\telse if (i == (retryCount-1) && PathAOK == 0x01)\t//Tx IQK OK\n\t\t{\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"Path A IQK Only  Tx Success!!\\n\"));\n\t\t\t\n\t\t\tresult[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\n\t\t\tresult[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;\t\t\t\n\t\t}\n\t}\n\n\tif(0x00 == PathAOK){\t\t\n\t\tRTPRINT(FINIT, INIT_IQK, (\"Path A IQK failed!!\\n\"));\t\t\n\t}\n\n\tif(is2T){\n\t\tphy_PathAStandBy(pAdapter);\n\n\t\t// Turn Path B ADDA on\n\t\tphy_PathADDAOn(pAdapter, ADDA_REG, FALSE, is2T);\n\n\t\tfor(i = 0 ; i < retryCount ; i++){\n\t\t\tPathBOK = phy_PathB_IQK_8192C(pAdapter);\n\t\t\tif(PathBOK == 0x03){\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"Path B IQK Success!!\\n\"));\n\t\t\t\tresult[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][6] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][7] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (i == (retryCount - 1) && PathBOK == 0x01)\t//Tx IQK OK\n\t\t\t{\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"Path B Only Tx IQK Success!!\\n\"));\n\t\t\t\tresult[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;\n\t\t\t\tresult[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;\t\t\t\t\n\t\t\t}\n\t\t}\n\n\t\tif(0x00 == PathBOK){\t\t\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"Path B IQK failed!!\\n\"));\t\t\n\t\t}\n\t}\n\n\t//Back to BB mode, load original value\n\tRTPRINT(FINIT, INIT_IQK, (\"IQK:Back to BB mode, load original value!\\n\"));\n\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\n\n\tif(t!=0)\n\t{\n\t\tif(!pHalData->bRfPiEnable){\n\t\t\t// Switch back BB to SI mode after finish IQ Calibration.\n\t\t\tphy_PIModeSwitch(pAdapter, FALSE);\n\t\t}\n\n\t \t// Reload ADDA power saving parameters\n\t \tphy_ReloadADDARegisters(pAdapter, ADDA_REG, pHalData->ADDA_backup, IQK_ADDA_REG_NUM);\n\n\t\t// Reload MAC parameters\n\t\tphy_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\n\t\t\n\t \t// Reload BB parameters\n\t\tphy_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup, IQK_BB_REG_NUM);\n\t\t\n\t\t/*Restore RX initial gain*/\n\t\tPHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3);\n\t\tif (is2T)\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3);\n\t\t//load 0xe30 IQC default value\n\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\n\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\t\t\n\t\t\n\t}\n\tRTPRINT(FINIT, INIT_IQK, (\"phy_IQCalibrate_8192C() <==\\n\"));\n\t\n}\n\n\nVOID\t\nphy_LCCalibrate92C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tu1Byte\ttmpReg;\n\tu4Byte\tRF_Amode=0, RF_Bmode=0, LC_Cal;\n//\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\t//Check continuous TX and Packet TX\n\ttmpReg = PlatformEFIORead1Byte(pAdapter, 0xd03);\n\n\tif((tmpReg&0x70) != 0)\t\t\t//Deal with contisuous TX case\n\t\tPlatformEFIOWrite1Byte(pAdapter, 0xd03, tmpReg&0x8F);\t//disable all continuous TX\n\telse\t\t\t\t\t\t\t// Deal with Packet TX case\n\t\tPlatformEFIOWrite1Byte(pAdapter, REG_TXPAUSE, 0xFF);\t\t\t// block all queues\n\n\tif((tmpReg&0x70) != 0)\n\t{\n\t\t//1. Read original RF mode\n\t\t//Path-A\n\t\tRF_Amode = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits);\n\n\t\t//Path-B\n\t\tif(is2T)\n\t\t\tRF_Bmode = PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits);\t\n\n\t\t//2. Set RF mode = standby mode\n\t\t//Path-A\n\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);\n\n\t\t//Path-B\n\t\tif(is2T)\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);\t\t\t\n\t}\n\t\n\t//3. Read RF reg18\n\tLC_Cal = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits);\n\t\n\t//4. Set LC calibration begin\tbit15\n\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);\n\n\tdelay_ms(100);\t\t\n\n\n\t//Restore original situation\n\tif((tmpReg&0x70) != 0)\t//Deal with contisuous TX case \n\t{  \n\t\t//Path-A\n\t\tPlatformEFIOWrite1Byte(pAdapter, 0xd03, tmpReg);\n\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);\n\t\t\n\t\t//Path-B\n\t\tif(is2T)\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);\n\t}\n\telse // Deal with Packet TX case\n\t{\n\t\tPlatformEFIOWrite1Byte(pAdapter, REG_TXPAUSE, 0x00);\t\n\t}\n}\n\n\nVOID\t\nphy_LCCalibrate(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tphy_LCCalibrate92C(pAdapter, is2T);\n}\n\n\n\n//Analog Pre-distortion calibration\n#define\t\tAPK_BB_REG_NUM\t8\n#define\t\tAPK_CURVE_REG_NUM 4\n#define\t\tPATH_NUM\t\t2\n\nVOID\t\nphy_APCalibrate_8192C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\ts1Byte \t\tdelta,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tu4Byte \t\t\tregD[PATH_NUM];\n\tu4Byte\t\t\ttmpReg, index, offset, i, apkbound;\n\tu1Byte\t\t\tpath, pathbound = PATH_NUM;\n\tu4Byte\t\t\tBB_backup[APK_BB_REG_NUM];\n\tu4Byte\t\t\tBB_REG[APK_BB_REG_NUM] = {\t\n\t\t\t\t\t\trFPGA1_TxBlock, \trOFDM0_TRxPathEnable, \n\t\t\t\t\t\trFPGA0_RFMOD, \trOFDM0_TRMuxPar, \n\t\t\t\t\t\trFPGA0_XCD_RFInterfaceSW,\trFPGA0_XAB_RFInterfaceSW, \n\t\t\t\t\t\trFPGA0_XA_RFInterfaceOE, \trFPGA0_XB_RFInterfaceOE\t};\n\tu4Byte\t\t\tBB_AP_MODE[APK_BB_REG_NUM] = {\t\n\t\t\t\t\t\t0x00000020, 0x00a05430, 0x02040000, \n\t\t\t\t\t\t0x000800e4, 0x00204000 };\n\tu4Byte\t\t\tBB_normal_AP_MODE[APK_BB_REG_NUM] = {\t\n\t\t\t\t\t\t0x00000020, 0x00a05430, 0x02040000, \n\t\t\t\t\t\t0x000800e4, 0x22204000 };\t\t\t\t\t\t\n\n\tu4Byte\t\t\tAFE_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\t\t\tAFE_REG[IQK_ADDA_REG_NUM] = {\t\n\t\t\t\t\t\trFPGA0_XCD_SwitchControl, \trBlue_Tooth, \t\n\t\t\t\t\t\trRx_Wait_CCA, \t\trTx_CCK_RFON,\n\t\t\t\t\t\trTx_CCK_BBON, \trTx_OFDM_RFON, \t\n\t\t\t\t\t\trTx_OFDM_BBON, \trTx_To_Rx,\n\t\t\t\t\t\trTx_To_Tx, \t\trRx_CCK, \t\n\t\t\t\t\t\trRx_OFDM, \t\trRx_Wait_RIFS,\n\t\t\t\t\t\trRx_TO_Rx, \t\trStandby, \t\n\t\t\t\t\t\trSleep, \t\t\trPMPD_ANAEN };\n\n\tu4Byte\t\t\tMAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\t\t\tMAC_REG[IQK_MAC_REG_NUM] = {\n\t\t\t\t\t\tREG_TXPAUSE, \t\tREG_BCN_CTRL,\t\n\t\t\t\t\t\tREG_BCN_CTRL_1,\tREG_GPIO_MUXCFG};\n\n\tu4Byte\t\t\tAPK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t\t\t\t{0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},\n\t\t\t\t\t{0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}\n\t\t\t\t\t};\t\n\n\tu4Byte\t\t\tAPK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t\t\t\t{0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},\t//path settings equal to path b settings\n\t\t\t\t\t{0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}\n\t\t\t\t\t};\n\t\n\tu4Byte\t\t\tAPK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t\t\t\t{0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},\n\t\t\t\t\t{0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}\n\t\t\t\t\t};\n\n\tu4Byte\t\t\tAPK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t\t\t\t{0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},\t//path settings equal to path b settings\n\t\t\t\t\t{0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}\n\t\t\t\t\t};\n#if 0\t\n\tu4Byte\t\t\tAPK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t\t\t\t{0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80},\t\t\n\t\t\t\t\t{0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80}\t\t\t\t\t\t\n\t\t\t\t\t};\n#endif\n\tu4Byte\t\t\tAFE_on_off[PATH_NUM] = {\n\t\t\t\t\t0x04db25a4, 0x0b1b25a4};\t//path A on path B off / path A off path B on\n\n\tu4Byte\t\t\tAPK_offset[PATH_NUM] = {\n\t\t\t\t\trConfig_AntA, rConfig_AntB};\n\n\tu4Byte\t\t\tAPK_normal_offset[PATH_NUM] = {\n\t\t\t\t\trConfig_Pmpd_AntA, rConfig_Pmpd_AntB};\n\t\t\t\t\t\n\tu4Byte\t\t\tAPK_value[PATH_NUM] = {\n\t\t\t\t\t0x92fc0000, 0x12fc0000};\t\t\t\t\t\n\n\tu4Byte\t\t\tAPK_normal_value[PATH_NUM] = {\n\t\t\t\t\t0x92680000, 0x12680000};\t\t\t\t\t\n\n\ts1Byte\t\t\tAPK_delta_mapping[APK_BB_REG_NUM][13] = {\n\t\t\t\t\t{-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t\t\t\t{-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t{-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t\t\t\t{-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t\t\t\t{-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}\n\t\t\t\t\t};\n\t\n\tu4Byte\t\t\tAPK_normal_setting_value_1[13] = {\n\t\t\t\t\t0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,\n\t\t\t\t\t0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,\n\t\t\t\t\t0x12680000, 0x00880000, 0x00880000\n\t\t\t\t\t};\n\n\tu4Byte\t\t\tAPK_normal_setting_value_2[16] = {\n\t\t\t\t\t0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,\n\t\t\t\t\t0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,\n\t\t\t\t\t0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,\n\t\t\t\t\t0x00050006\n\t\t\t\t\t};\n\t\n\tu4Byte\t\t\tAPK_result[PATH_NUM][APK_BB_REG_NUM];\t//val_1_1a, val_1_2a, val_2a, val_3a, val_4a\n//\tu4Byte\t\t\tAP_curve[PATH_NUM][APK_CURVE_REG_NUM];\n\n\ts4Byte\t\t\tBB_offset, delta_V, delta_offset;\n\n#if MP_DRIVER == 1\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->MptCtx);\t\n\n\tpMptCtx->APK_bound[0] = 45;\n\tpMptCtx->APK_bound[1] = 52;\t\t\n#endif\n\n\tRTPRINT(FINIT, INIT_IQK, (\"==>phy_APCalibrate_8192C() delta %d\\n\", delta));\n\tRTPRINT(FINIT, INIT_IQK, (\"AP Calibration for %s\\n\", (is2T ? \"2T2R\" : \"1T1R\")));\n\tif(!is2T)\n\t\tpathbound = 1;\n\n\t//2 FOR NORMAL CHIP SETTINGS\n\n// Temporarily do not allow normal driver to do the following settings because these offset\n// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal\n// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the\n// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.\n#if MP_DRIVER != 1\n\treturn;\n#endif\n\t//settings adjust for normal chip\n\tfor(index = 0; index < PATH_NUM; index ++)\n\t{\n\t\tAPK_offset[index] = APK_normal_offset[index];\n\t\tAPK_value[index] = APK_normal_value[index];\n\t\tAFE_on_off[index] = 0x6fdb25a4;\n\t}\n\n\tfor(index = 0; index < APK_BB_REG_NUM; index ++)\n\t{\n\t\tfor(path = 0; path < pathbound; path++)\n\t\t{\n\t\t\tAPK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];\n\t\t\tAPK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];\n\t\t}\n\t\tBB_AP_MODE[index] = BB_normal_AP_MODE[index];\n\t}\t\t\t\n\n\tapkbound = 6;\n\t\n\t//save BB default value\n\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t{\n\t\tif(index == 0)\t\t//skip \n\t\t\tcontinue;\t\t\t\t\n\t\tBB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord);\n\t}\n\t\n\t//save MAC default value\t\t\t\t\t\t\t\t\t\t\t\t\t\n\tphy_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup);\n\t\n\t//save AFE default value\n\tphy_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\n\n\t\tif(path == RF_PATH_A)\n\t\t{\n\t\t\t//path A APK\n\t\t\t//load APK setting\n\t\t\t//path-A\t\t\n\t\t\toffset = rPdp_AntA;\n\t\t\tfor(index = 0; index < 11; index ++)\t\t\t\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\n\t\t\t\n\t\t\toffset = rConfig_AntA;\n\t\t\tfor(; index < 13; index ++) \t\t\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\n\t\t\t\n\t\t\t//page-B1\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x400000);\n\t\t\n\t\t\t//path A\n\t\t\toffset = rPdp_AntA;\n\t\t\tfor(index = 0; index < 16; index++)\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);\t\t\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\t\t\t\t\t\t\t\n\t\t}\n\t\telse if(path == RF_PATH_B)\n\t\t{\n\t\t\t//path B APK\n\t\t\t//load APK setting\n\t\t\t//path-B\t\t\n\t\t\toffset = rPdp_AntB;\n\t\t\tfor(index = 0; index < 10; index ++)\t\t\t\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\n\t\t\tPHY_SetBBReg(pAdapter, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);\n\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\n\t\t\t\n\t\t\toffset = rConfig_AntA;\n\t\t\tindex = 11;\n\t\t\tfor(; index < 13; index ++) //offset 0xb68, 0xb6c\t\t\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\n\t\t\t\n\t\t\t//page-B1\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x400000);\n\t\t\t\n\t\t\t//path B\n\t\t\toffset = 0xb60;\n\t\t\tfor(index = 0; index < 16; index++)\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);\t\t\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord))); \t\n\t\t\t\t\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\t\t\t\t\t\t\t\n\t\t}\n\t\n\t\t//save RF default value\n\t\tregD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask);\n\t\t\n\t\t//Path A AFE all on, path B AFE All off or vise versa\n\t\tfor(index = 0; index < IQK_ADDA_REG_NUM ; index++)\n\t\t\tPHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]);\n\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0xe70 %x\\n\", PHY_QueryBBReg(pAdapter, rRx_Wait_CCA, bMaskDWord)));\t\t\n\n\t\t//BB to AP mode\n\t\tif(path == 0)\n\t\t{\t\t\t\t\n\t\t\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t\t\t{\n\n\t\t\t\tif(index == 0)\t\t//skip \n\t\t\t\t\tcontinue;\t\t\t\n\t\t\t\telse if (index < 5)\n\t\t\t\tPHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);\n\t\t\t\telse if (BB_REG[index] == 0x870)\n\t\t\t\t\tPHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);\n\t\t\t\telse\n\t\t\t\t\tPHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0);\t\t\t\t\t\n\t\t\t}\n\n\t\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\t\t\t\n\t\t}\n\t\telse\t\t//path B\n\t\t{\n\t\t\tPHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\t\t\n\t\t\tPHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\t\t\t\t\n\t\t\n\t\t}\n\n\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x800 %x\\n\", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord)));\t\t\t\t\n\n\t\t//MAC settings\n\t\tphy_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup);\n\t\t\n\t\tif(path == RF_PATH_A)\t//Path B to standby mode\n\t\t{\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bRFRegOffsetMask, 0x10000);\t\t\t\n\t\t}\n\t\telse\t\t\t//Path A to standby mode\n\t\t{\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x10000);\t\t\t\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);\t\t\t\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20103);\t\t\t\t\t\t\n\t\t}\n\n\t\tdelta_offset = ((delta+14)/2);\n\t\tif(delta_offset < 0)\n\t\t\tdelta_offset = 0;\n\t\telse if (delta_offset > 12)\n\t\t\tdelta_offset = 12;\n\t\t\t\n\t\t//AP calibration\n\t\tfor(index = 0; index < APK_BB_REG_NUM; index++)\n\t\t{\n\t\t\tif(index != 1)\t//only DO PA11+PAD01001, AP RF setting\n\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\ttmpReg = APK_RF_init_value[path][index];\n#if 1\t\t\t\n\t\t\tif(!pHalData->bAPKThermalMeterIgnore)\n\t\t\t{\n\t\t\t\tBB_offset = (tmpReg & 0xF0000) >> 16;\n\n\t\t\t\tif(!(tmpReg & BIT15)) //sign bit 0\n\t\t\t\t{\n\t\t\t\t\tBB_offset = -BB_offset;\n\t\t\t\t}\n\n\t\t\t\tdelta_V = APK_delta_mapping[index][delta_offset];\n\t\t\t\t\n\t\t\t\tBB_offset += delta_V;\n\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\\n\", index, tmpReg, delta_V, delta_offset));\t\t\n\t\t\t\t\n\t\t\t\tif(BB_offset < 0)\n\t\t\t\t{\n\t\t\t\t\ttmpReg = tmpReg & (~BIT15);\n\t\t\t\t\tBB_offset = -BB_offset;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpReg = tmpReg | BIT15;\n\t\t\t\t}\n\t\t\t\ttmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);\n\t\t\t}\n#endif\n\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t\t\tif(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))\n\t\t\t\tPHY_SetRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask, 0x894ae);\n\t\t\telse\n#endif\t\n\t\t\t\tPHY_SetRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask, 0x8992e);\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0xc %x\\n\", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask)));\t\t\n\t\t\tPHY_SetRFReg(pAdapter, path, RF_AC, bRFRegOffsetMask, APK_RF_value_0[path][index]);\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x0 %x\\n\", PHY_QueryRFReg(pAdapter, path, RF_AC, bRFRegOffsetMask)));\t\t\n\t\t\tPHY_SetRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask, tmpReg);\n\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0xd %x\\n\", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask)));\t\t\t\t\t\n\t\t\t\n\t\t\t// PA11+PAD01111, one shot\t\n\t\t\ti = 0;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x800000);\n\t\t\t\t{\n\t\t\t\t\tPHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]);\t\t\n\t\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));\n\t\t\t\t\tdelay_ms(3);\t\t\t\t\n\t\t\t\t\tPHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]);\n\t\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0x%x value 0x%x\\n\", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));\n\n\t\t\t\t\tdelay_ms(20);\n\t\t\t\t}\n\t\t\t\tPHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\n\n\t\t\t\tif(path == RF_PATH_A)\n\t\t\t\t\ttmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0x03E00000);\n\t\t\t\telse\n\t\t\t\t\ttmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0xF8000000);\n\t\t\t\tRTPRINT(FINIT, INIT_IQK, (\"phy_APCalibrate_8192C() offset 0xbd8[25:21] %x\\n\", tmpReg));\t\t\n\t\t\t\t\n\n\t\t\t\ti++;\n\t\t\t}\n\t\t\twhile(tmpReg > apkbound && i < 4);\n\n\t\t\tAPK_result[path][index] = tmpReg;\n\t\t}\n\t}\n\n\t//reload MAC default value\t\n\tphy_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup);\n\t\n\t//reload BB default value\t\n\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t{\n\n\t\tif(index == 0)\t\t//skip \n\t\t\tcontinue;\t\t\t\t\t\n\t\tPHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]);\n\t}\n\n\t//reload AFE default value\n\tphy_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n\n\t//reload RF path default value\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\t\tPHY_SetRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask, regD[path]);\n\t\tif(path == RF_PATH_B)\n\t\t{\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);\t\t\t\n\t\t\tPHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20101);\t\t\t\t\t\t\n\t\t}\n\n\t\t//note no index == 0\n\t\tif (APK_result[path][1] > 6)\n\t\t\tAPK_result[path][1] = 6;\n\t\tRTPRINT(FINIT, INIT_IQK, (\"apk path %d result %d 0x%x \\t\", path, 1, APK_result[path][1]));\t\t\t\t\t\n\t}\n\n\tRTPRINT(FINIT, INIT_IQK, (\"\\n\"));\n\t\n\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\t\tPHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G1_G4, bRFRegOffsetMask, \n\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));\n\t\tif(path == RF_PATH_A)\n\t\t\tPHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask, \n\t\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));\t\t\n\t\telse\n\t\tPHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask, \n\t\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));\t\t\t\t\t\t\n\t\t\t\n\t\tPHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G9_G11, bRFRegOffsetMask, ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));\t\t\t\n\t}\n\n\tpHalData->bAPKdone = TRUE;\n\n\tRTPRINT(FINIT, INIT_IQK, (\"<==phy_APCalibrate_8192C()\\n\"));\n}\n\n\nVOID\nPHY_IQCalibrate_8192C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN \tbReCovery\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\ts4Byte\t\t\tresult[4][8];\t//last is final result\n\tu1Byte\t\t\ti, final_candidate, Indexforchannel;\n\tBOOLEAN\t\t\tbPathAOK, bPathBOK;\n\ts4Byte\t\t\tRegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;\n\tBOOLEAN\t\t\tis12simular, is13simular, is23simular;\t\n\tBOOLEAN \t\tbStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\n\tu4Byte\t\t\tIQK_BB_REG_92C[IQK_BB_REG_NUM] = {\n\t\t\t\t\trOFDM0_XARxIQImbalance, \trOFDM0_XBRxIQImbalance, \n\t\t\t\t\trOFDM0_ECCAThreshold, \trOFDM0_AGCRSSITable,\n\t\t\t\t\trOFDM0_XATxIQImbalance, \trOFDM0_XBTxIQImbalance, \n\t\t\t\t\trOFDM0_XCTxAFE, \t\t\trOFDM0_XDTxAFE, \n\t\t\t\t\trOFDM0_RxIQExtAnta};\n\n\tif (ODM_CheckPowerStatus(pAdapter) == FALSE)\n\t\treturn;\n\t\n#if MP_DRIVER == 1\t\n\tbStartContTx = pAdapter->MptCtx.bStartContTx;\n\tbSingleTone = pAdapter->MptCtx.bSingleTone;\n\tbCarrierSuppression = pAdapter->MptCtx.bCarrierSuppression;\t\n#endif\n\t\n\t//ignore IQK when continuous Tx\n\tif(bStartContTx || bSingleTone || bCarrierSuppression)\n\t\treturn;\n\n#ifdef DISABLE_BB_RF\n\treturn;\n#endif\n\tif(pAdapter->bSlaveOfDMSP)\n\t\treturn;\n\n\tif (bReCovery)\n\t\t{\n\t\t\tphy_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup_recover, 9);\n\t\t\treturn;\t\t\n\n\t\t}\n\n\tRTPRINT(FINIT, INIT_IQK, (\"IQK:Start!!!\\n\"));\n\n\tfor(i = 0; i < 8; i++)\n\t{\n\t\tresult[0][i] = 0;\n\t\tresult[1][i] = 0;\n\t\tresult[2][i] = 0;\n\t\tresult[3][i] = 0;\n\t}\n\tfinal_candidate = 0xff;\n\tbPathAOK = FALSE;\n\tbPathBOK = FALSE;\n\tis12simular = FALSE;\n\tis23simular = FALSE;\n\tis13simular = FALSE;\n\n\tAcquireCCKAndRWPageAControl(pAdapter);\n\t/*RT_TRACE(COMP_INIT,DBG_LOUD,(\"Acquire Mutex in IQCalibrate\\n\"));*/\n\tfor (i=0; i<3; i++)\n\t{\n\t\t/*For 88C 1T1R*/\n\t\tphy_IQCalibrate_8192C(pAdapter, result, i, FALSE);\n\t\t\n\t\tif(i == 1)\n\t\t{\n\t\t\tis12simular = phy_SimularityCompare(pAdapter, result, 0, 1);\n\t\t\tif(is12simular)\n\t\t\t{\n\t\t\t\tfinal_candidate = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(i == 2)\n\t\t{\n\t\t\tis13simular = phy_SimularityCompare(pAdapter, result, 0, 2);\n\t\t\tif(is13simular)\n\t\t\t{\n\t\t\t\tfinal_candidate = 0;\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tis23simular = phy_SimularityCompare(pAdapter, result, 1, 2);\n\t\t\tif(is23simular)\n\t\t\t\tfinal_candidate = 1;\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor(i = 0; i < 8; i++)\n\t\t\t\t\tRegTmp += result[3][i];\n\n\t\t\t\tif(RegTmp != 0)\n\t\t\t\t\tfinal_candidate = 3;\t\t\t\n\t\t\t\telse\n\t\t\t\t\tfinal_candidate = 0xFF;\n\t\t\t}\n\t\t}\n\t}\n//\tRT_TRACE(COMP_INIT,DBG_LOUD,(\"Release Mutex in IQCalibrate \\n\"));\n\tReleaseCCKAndRWPageAControl(pAdapter);\n\n\tfor (i=0; i<4; i++)\n\t{\n\t\tRegE94 = result[i][0];\n\t\tRegE9C = result[i][1];\n\t\tRegEA4 = result[i][2];\n\t\tRegEAC = result[i][3];\n\t\tRegEB4 = result[i][4];\n\t\tRegEBC = result[i][5];\n\t\tRegEC4 = result[i][6];\n\t\tRegECC = result[i][7];\n\t\tRTPRINT(FINIT, INIT_IQK, (\"IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\\n \", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));\n\t}\n\t\n\tif(final_candidate != 0xff)\n\t{\n\t\tpHalData->RegE94 = RegE94 = result[final_candidate][0];\n\t\tpHalData->RegE9C = RegE9C = result[final_candidate][1];\n\t\tRegEA4 = result[final_candidate][2];\n\t\tRegEAC = result[final_candidate][3];\n\t\tpHalData->RegEB4 = RegEB4 = result[final_candidate][4];\n\t\tpHalData->RegEBC = RegEBC = result[final_candidate][5];\n\t\tRegEC4 = result[final_candidate][6];\n\t\tRegECC = result[final_candidate][7];\n\t\tRTPRINT(FINIT, INIT_IQK, (\"IQK: final_candidate is %x\\n\",final_candidate));\n\t\tRTPRINT(FINIT, INIT_IQK, (\"IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\\n \", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));\n\t\tbPathAOK = bPathBOK = TRUE;\n\t}\n\telse\n\t{\n\t\tRegE94 = RegEB4 = pHalData->RegE94 = pHalData->RegEB4 = 0x100;\t//X default value\n\t\tRegE9C = RegEBC = pHalData->RegE9C = pHalData->RegEBC = 0x0;\t\t//Y default value\n\t}\n\t\n\tif((RegE94 != 0)/*&&(RegEA4 != 0)*/)\n\t{\n\t\tif(pHalData->CurrentBandType == BAND_ON_5G)\n\t\t\tphy_PathAFillIQKMatrix_5G_Normal(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));\t\t\t\n\t\telse\t\t\n\t\t\tphy_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));\n\n\t}\n\t\n\tif (IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID))\n\t{\n\t\tif((RegEB4 != 0)/*&&(RegEC4 != 0)*/)\n\t\t{\n\t\t\tif(pHalData->CurrentBandType == BAND_ON_5G)\t\t\n\t\t\t\tphy_PathBFillIQKMatrix_5G_Normal(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));\n\t\t\telse\n\t\t\t\tphy_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));\n\t\t}\n\t}\n\t\n\tphy_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup_recover, 9);\n\n}\n\n\nVOID\nPHY_LCCalibrate_8192C(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tBOOLEAN \t\tbStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\n\tPMGNT_INFO\t\tpMgntInfo=&pAdapter->MgntInfo;\n\tPMGNT_INFO\t\tpMgntInfoBuddyAdapter;\n\tu4Byte\t\t\ttimeout = 2000, timecount = 0;\n\tPADAPTER\tBuddyAdapter = pAdapter->BuddyAdapter;\n\n#if MP_DRIVER == 1\t\n\tbStartContTx = pAdapter->MptCtx.bStartContTx;\n\tbSingleTone = pAdapter->MptCtx.bSingleTone;\n\tbCarrierSuppression = pAdapter->MptCtx.bCarrierSuppression;\t\t\n#endif\n\n#ifdef DISABLE_BB_RF\n\treturn;\n#endif\n\n\t//ignore LCK when continuous Tx\n\tif(bStartContTx || bSingleTone || bCarrierSuppression)\n\t\treturn;\n\n\tif(BuddyAdapter != NULL &&\n\t\t((pAdapter->interfaceIndex == 0 && pHalData->CurrentBandType == BAND_ON_2_4G) ||\n\t\t(pAdapter->interfaceIndex == 1 && pHalData->CurrentBandType == BAND_ON_5G)))\n\t{\n\t\tpMgntInfoBuddyAdapter=&BuddyAdapter->MgntInfo;\n\t\twhile(pMgntInfoBuddyAdapter->bScanInProgress && timecount < timeout)\n\t\t{\n\t\t\tdelay_ms(50);\n\t\t\ttimecount += 50;\n\t\t}\n\t}\n\n\twhile(pMgntInfo->bScanInProgress && timecount < timeout)\n\t{\n\t\tdelay_ms(50);\n\t\ttimecount += 50;\n\t}\t\n\t\n\tpHalData->bLCKInProgress = TRUE;\n\n\tRTPRINT(FINIT, INIT_IQK, (\"LCK:Start!!!interface %d currentband %x delay %d ms\\n\", pAdapter->interfaceIndex, pHalData->CurrentBandType, timecount));\n\t\n\t//if(IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID))\n\tif(IS_2T2R(pHalData->VersionID))\n\t{\n\t\tphy_LCCalibrate(pAdapter, TRUE);\n\t}\n\telse{\n\t\t// For 88C 1T1R\n\t\tphy_LCCalibrate(pAdapter, FALSE);\n\t}\n\n\tpHalData->bLCKInProgress = FALSE;\n\n\tRTPRINT(FINIT, INIT_IQK, (\"LCK:Finish!!!interface %d\\n\", pAdapter->interfaceIndex));\n\t\n\n}\n\nVOID\nPHY_APCalibrate_8192C(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\ts1Byte \t\tdelta\t\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\t//default disable APK, because Tx NG issue, suggest by Jenyu, 2011.11.25\n\treturn;\n\n#ifdef DISABLE_BB_RF\n\treturn;\n#endif\n\n#if FOR_BRAZIL_PRETEST != 1\n\tif(pHalData->bAPKdone)\n#endif\t\t\n\t\treturn;\n\n\tif(IS_92C_SERIAL( pHalData->VersionID)){\n\t\tphy_APCalibrate_8192C(pAdapter, delta, TRUE);\n\t}\n\telse{\n\t\t// For 88C 1T1R\n\t\tphy_APCalibrate_8192C(pAdapter, delta, FALSE);\n\t}\n}\n\n\n#endif\n\n\n//3============================================================\n//3 IQ Calibration\n//3============================================================\n\nVOID\nODM_ResetIQKResult(\n\tIN\tPVOID\t\tpDM_VOID \n)\n{\n\treturn;\n}\n#if 1//!(DM_ODM_SUPPORT_TYPE & ODM_AP)\nu1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\n{\n\tu1Byte\tchannel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \n\t{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};\n\tu1Byte\tplace = chnl;\n\n\t\n\tif(chnl > 14)\n\t{\n\t\tfor(place = 14; place<sizeof(channel_all); place++)\n\t\t{\n\t\t\tif(channel_all[place] == chnl)\n\t\t\t{\n\t\t\t\treturn place-13;\n\t\t\t}\n\t\t}\n\t}\t\n\treturn 0;\n\n}\n#endif\n\nVOID\nodm_IQCalibrate(\n\t\tIN\tPDM_ODM_T\tpDM_Odm \n\t\t)\n{\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tif (*pDM_Odm->pIsFcsModeEnable)\n\t\treturn;\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\n\tif (!IS_HARDWARE_TYPE_JAGUAR(Adapter))\n\t\treturn;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\telse if (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\treturn;\n#endif\n#endif\n\t\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->bLinked) {\n\t\tif ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\n\t\t\tpDM_Odm->preChannel = *pDM_Odm->pChannel;\n\t\t\tpDM_Odm->LinkedInterval = 0;\n\t\t}\n\n\t\tif (pDM_Odm->LinkedInterval < 3)\n\t\t\tpDM_Odm->LinkedInterval++;\n\t\t\n\t\tif (pDM_Odm->LinkedInterval == 2) {\n\t\t\t/*Mark out IQK flow to prevent tx stuck. by Maddest 20130306*/\n\t\t\t/*Open it verified by James 20130715*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\tPHY_IQCalibrate_8821A(pDM_Odm, FALSE);\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\tPHY_IQCalibrate(Adapter, FALSE);\n#else\n\t\t\tPHY_IQCalibrate_8821A(Adapter, FALSE);\n#endif\n\t\t}\n\t} else\n\t\tpDM_Odm->LinkedInterval = 0;\n#endif\n}\n\nvoid phydm_rf_init(IN\tPVOID\t\tpDM_VOID)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\todm_TXPowerTrackingInit(pDM_Odm);\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_ClearTxPowerTrackingState(pDM_Odm);\t\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n#if (RTL8814A_SUPPORT == 1)\t\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tPHY_IQCalibrate_8814A_Init(pDM_Odm);\n#endif\t\n#endif\n\n}\n\nvoid phydm_rf_watchdog(IN\tPVOID\t\tpDM_VOID)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_TXPowerTrackingCheck(pDM_Odm);\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\todm_IQCalibrate(pDM_Odm);\n#endif\n}\n"
  },
  {
    "path": "hal/phydm/halphyrf_ap.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n #ifndef __HAL_PHY_RF_H__\n #define __HAL_PHY_RF_H__\n \n#include \"phydm_powertracking_ap.h\"\n#if (RTL8814A_SUPPORT == 1)\n#include \"rtl8814a/phydm_iqk_8814a.h\"\n#endif\n\n#if (RTL8822B_SUPPORT == 1)\n#include \"rtl8822b/phydm_iqk_8822b.h\"\n#endif\n\n\ntypedef enum _PWRTRACK_CONTROL_METHOD {\n\tBBSWING,\n\tTXAGC,\n\tMIX_MODE,\n\tTSSI_MODE\n} PWRTRACK_METHOD;\n\ntypedef VOID \t(*FuncSetPwr)(PVOID, PWRTRACK_METHOD, u1Byte, u1Byte);\ntypedef VOID(*FuncIQK)(PVOID, u1Byte, u1Byte, u1Byte);\ntypedef VOID \t(*FuncLCK)(PVOID);\n\t\t\t\t//refine by YuChen for 8814A\ntypedef VOID  \t(*FuncSwing)(PVOID, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\ntypedef VOID\t(*FuncSwing8814only)(PVOID, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\n\ntypedef struct _TXPWRTRACK_CFG {\n\tu1Byte \t\tSwingTableSize_CCK;\t\n\tu1Byte \t\tSwingTableSize_OFDM;\n\tu1Byte \t\tThreshold_IQK;\n\tu1Byte \t\tThreshold_DPK;\t\n\tu1Byte \t\tAverageThermalNum;\n\tu1Byte \t\tRfPathCount;\n\tu4Byte \t\tThermalRegAddr;\t\n\tFuncSetPwr \tODM_TxPwrTrackSetPwr;\n\tFuncIQK \tDoIQK;\n\tFuncLCK\t\tPHY_LCCalibrate;\n\tFuncSwing\tGetDeltaSwingTable;\n\tFuncSwing8814only\tGetDeltaSwingTable8814only;\n} TXPWRTRACK_CFG, *PTXPWRTRACK_CFG;\n\nVOID \nConfigureTxpowerTrack(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n\n#if (RTL8192E_SUPPORT==1) \nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_92E(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n#endif\n\n#if (RTL8814A_SUPPORT == 1)\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries2(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n\n#elif ODM_IC_11AC_SERIES_SUPPORT\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\tPVOID\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n#endif\n\n#define IS_CCK_RATE(_rate) \t\t\t\t(ODM_MGN_1M == _rate || _rate == ODM_MGN_2M || _rate == ODM_MGN_5_5M || _rate == ODM_MGN_11M )\n\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n#define MAX_TOLERANCE          5\n#define IQK_DELAY_TIME         1               //ms\n\n //\n// BB/MAC/RF other monitor API\n//\n\nvoid\tPHY_SetMonitorMode8192C(IN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\t\t\t\tIN\tBOOLEAN\t\tbEnableMonitorMode\t);\n\t\t\t\t\t\t\t\t\t\t\n//\n// IQ calibrate\n//\nvoid\t\nPHY_IQCalibrate_8192C(\t\tIN\tPADAPTER\tpAdapter,\t\n\t\t\t\t\t\t\tIN\tBOOLEAN \tbReCovery);\n\t\t\t\t\t\t\t\n//\n// LC calibrate\n//\nvoid\t\nPHY_LCCalibrate_8192C(\t\tIN\tPADAPTER\tpAdapter);\n\n//\n// AP calibrate\n//\nvoid\t\nPHY_APCalibrate_8192C(\t\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\t\tIN \ts1Byte\t\tdelta);\n#endif\n\n#define ODM_TARGET_CHNL_NUM_2G_5G\t59\n\n\nVOID\nODM_ResetIQKResult(\n\tIN\tPVOID\t\tpDM_VOID\n);\nu1Byte \nODM_GetRightChnlPlaceforIQK(\n    IN u1Byte chnl\n);\n\nvoid phydm_rf_init(IN\tPVOID\t\tpDM_VOID);\nvoid phydm_rf_watchdog(IN\tPVOID\t\tpDM_VOID);\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_H__\n\n"
  },
  {
    "path": "hal/phydm/halphyrf_ce.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n\n#define \tCALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\\n\t\t\t\t\tdo {\\\n\t\t\t\t\t\tfor(_offset = 0; _offset < _size; _offset++)\\\n\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\tif(_deltaThermal < thermalThreshold[_direction][_offset])\\\n\t\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\t\tif(_offset != 0)\\\n\t\t\t\t\t\t\t\t\t_offset--;\\\n\t\t\t\t\t\t\t\tbreak;\\\n\t\t\t\t\t\t\t}\\\n\t\t\t\t\t\t}\t\t\t\\\n\t\t\t\t\t\tif(_offset >= _size)\\\n\t\t\t\t\t\t\t_offset = _size-1;\\\n\t\t\t\t\t} while(0)\n\nvoid ConfigureTxpowerTrack(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n#if RTL8192E_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8192E)\n\t\tConfigureTxpowerTrack_8192E(pConfig);\n#endif\t\n#if RTL8821A_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8821)\n\t\tConfigureTxpowerTrack_8821A(pConfig);\n#endif\n#if RTL8812A_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8812)\n\t\tConfigureTxpowerTrack_8812A(pConfig);\n#endif\n#if RTL8188E_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t\tConfigureTxpowerTrack_8188E(pConfig);\n#endif \n\n#if RTL8723B_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8723B)\n\t\tConfigureTxpowerTrack_8723B(pConfig);\n#endif\n\n#if RTL8814A_SUPPORT\n\tif (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\tConfigureTxpowerTrack_8814A(pConfig);\n#endif\n\n#if RTL8703B_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8703B)\n\t\tConfigureTxpowerTrack_8703B(pConfig);\n#endif\n\n#if RTL8188F_SUPPORT\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\tConfigureTxpowerTrack_8188F(pConfig);\n#endif \n}\n\n//======================================================================\n// <20121113, Kordan> This function should be called when TxAGC changed.\n// Otherwise the previous compensation is gone, because we record the \n// delta of temperature between two TxPowerTracking watch dogs.\n//\n// NOTE: If Tx BB swing or Tx scaling is varified during run-time, still \n//       need to call this function.\n//======================================================================\nVOID\nODM_ClearTxPowerTrackingState(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(pDM_Odm->Adapter);\n\tu1Byte \t\t\tp = 0;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\n\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\n\tpRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;\n\tpDM_Odm->RFCalibrateInfo.CCK_index = 0;\n\t\n\tfor (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\n\t{\n\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\t\tpRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\t\tpRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\n\t\tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\n\t\tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\n\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0;    /* Initial Mix mode power tracking*/\n\t\tpRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0;\t\t\t  \n\t\tpRFCalibrateInfo->KfreeOffset[p] = 0;\n\t}\n\t\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE;       /*Initial at Modify Tx Scaling Mode*/\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathB = FALSE;       /*Initial at Modify Tx Scaling Mode*/\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathC = FALSE;       /*Initial at Modify Tx Scaling Mode*/\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathD = FALSE;       /*Initial at Modify Tx Scaling Mode*/\n\tpRFCalibrateInfo->Remnant_CCKSwingIdx = 0;\n\tpRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;\n\t\n\tpRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;\t\t\t//modify by Mingzhi.Guo\n\tpRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;\t\t//modify by Mingzhi.Guo\n}\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\t#endif\n#endif\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tu1Byte\t\t\tThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;\n\ts1Byte\t\t\tdiff_DPK[4] = {0};\n\tu1Byte\t\t\tThermalValue_AVG_count = 0;\n\tu4Byte\t\t\tThermalValue_AVG = 0;\t\n\n\tu1Byte\t\t\tOFDM_min_index = 0;  // OFDM BB Swing should be less than +3.0dB, which is required by Arthur\n\tu1Byte\t\t\tIndexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)\n\tBOOLEAN\t\t\tbTSSIenable = FALSE;\n\n\tTXPWRTRACK_CFG \tc;\n\n\t//4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_A;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TDOWN_A;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_B;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TDOWN_B;\n\t/*for 8814 add by Yu Chen*/\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_C;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TDOWN_C;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_D;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TDOWN_D;\n\t\n\t//4 2. Initilization ( 7 steps in total )\n\n\tConfigureTxpowerTrack(pDM_Odm, &c);\n\n\t(*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,\n\t\t\t\t\t\t\t\t\t  (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);\t\n\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\t/*for 8814 path C & D*/\n\t\t(*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_C, (pu1Byte *)&deltaSwingTableIdx_TDOWN_C,\n\t\t\t(pu1Byte *)&deltaSwingTableIdx_TUP_D, (pu1Byte *)&deltaSwingTableIdx_TDOWN_D);\n\t\n\t\n\tpDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug\n\tpDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE;\n    \n#if (MP_DRIVER == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl; // <Kordan> We should keep updating the control variable according to HalData.\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tif (pDM_Odm->mp_mode == TRUE)\n#endif\n\t\t// <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.\n\t\tpDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t\t(\"===>ODM_TXPowerTrackingCallback_ThermalMeter Start\\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\\n\", \n\t\tpRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t\t(\"pDM_Odm->RFCalibrateInfo.TxPowerTrackControl %d,  pHalData->EEPROMThermalMeter %d\\n\", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl,  pHalData->EEPROMThermalMeter));\n\tThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);\t//0x42: RF Reg[15:10] 88E\n\tif( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl || pHalData->EEPROMThermalMeter == 0 || \n\t\tpHalData->EEPROMThermalMeter == 0xFF)\n\t\treturn;\n\n\n\t//4 3. Initialize ThermalValues of RFCalibrateInfo\n\n\tif(pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"reload ofdm index for band switch\\n\"));\t\t\t\t\n\t}\n\n\t//4 4. Calculate average thermal meter\n\t\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\n\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   //Average times =  c.AverageThermalNum\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\n\n\tfor(i = 0; i < c.AverageThermalNum; i++)\n\t{\n\t\tif(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])\n\t\t{\n\t\t\tThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\n\t\t\tThermalValue_AVG_count++;\n\t\t}\n\t}\n\n\tif(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\n\t{\n\t\tThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\t\t\t\t\t\n\t}\n\t\t\t\n\t//4 5. Calculate delta, delta_LCK, delta_IQK.\n\n\t//\"delta\" here is used to determine whether thermal value changes or not.\n\tdelta \t  = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);\n\tdelta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);\n\tdelta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);\n\n\tif (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK == 0xff) {\t/*no PG, use thermal value for IQK*/\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;\n\t\tdelta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"no PG, use ThermalValue for IQK\\n\"));\n\t}\n\t\n\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\tdiff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pDM_Odm->RFCalibrateInfo.DpkThermal[p];\n\n\t/*4 6. If necessary, do LCK.*/\t\n\tif (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\n\n\t\tif (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK == 0xff) {\n\t\t\t/*no PG , do LCK at initial status*/\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"no PG, do LCK\\n\"));\n\t\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\n\t\t\tif (c.PHY_LCCalibrate)\n\t\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t\t\tdelta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\\n\", delta, delta_LCK, delta_IQK));\n\t\t/*DBG_871X(\"(delta, delta_LCK, delta_IQK) = (%d, %d, %d), %d\\n\", delta, delta_LCK, delta_IQK, c.Threshold_IQK);*/\n\t\t\n\t\t/* 4 6. If necessary, do LCK.*/\n\t\t\n\t\tif (delta_LCK >= c.Threshold_IQK) {\n\t\t\t/* Delta temperature is equal to or larger than 20 centigrade.*/\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"delta_LCK(%d) >= Threshold_IQK(%d)\\n\", delta_LCK, c.Threshold_IQK));\n\t\t\tpDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\n\t\t\tif (c.PHY_LCCalibrate)\n\t\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t\t}\n\t}\n\t//3 7. If necessary, move the index of swing table to adjust Tx power.\t\n\t\n\tif (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\n\t{\n\t\t//\"delta\" here is used to record the absolute value of differrence.\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\n\t    delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);\t\t\n#else\n\t    delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);\t\t\n#endif\n\t\tif (delta >= TXPWR_TRACK_TABLE_SIZE)\n\t\t\tdelta = TXPWR_TRACK_TABLE_SIZE - 1;\n\n\t\t//4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset\n\t\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\t\n\t\tif(ThermalValue > pHalData->EEPROMThermalMeter) {\n#else\n\t\tif(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\n#endif\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)  {\n\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p];\t/* recording power index offset */\n\t\t\t\tswitch (p) {\n\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_B[delta])); \n\n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta];       /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]));  \n\n\n\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_C[delta]));\n\t\t\t\n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_C[delta];       /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_D[delta]));\n\n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_D[delta];       /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t\t\t\t\t\t(\"deltaSwingTableIdx_TUP_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_A[delta]));\n\n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta];        /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));\n\t\t\t\tbreak;\n\t\t\t\t}\t\t\n\t\t\t}\n\t\t} else {\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\n\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p];\t/* recording poer index offset */\n\t\t\t\tswitch (p) {\n\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];        /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \n\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];        /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \n\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_D[delta];        /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"deltaSwingTableIdx_TDOWN_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \n\t\t\t\t\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];\n\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        /* Record delta swing for mix mode power tracking */\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"\\n\\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\\n\", p));  \n\t\t\tif (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p])         /* If Thermal value changes but lookup table value still the same */\n\t\t\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;\n\t\t\telse\n\t\t\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p];      /* Power Index Diff between 2 times Power Tracking */\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\\n\", p, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]));\t\t\n\t\t\n\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];\n\t\t\tpDM_Odm->RFCalibrateInfo.CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];\n\n\t\t\tpRFCalibrateInfo->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;\t\n\t\t\tpRFCalibrateInfo->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p];\n\n\n\n\t\t\t/* *************Print BB Swing Base and Index Offset************* */\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));\n\n\t\t    //4 7.1 Handle boundary conditions of index.\n\t\t\n\t\t\tif(pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)\n\t\t\t{\n\t\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;\n\t\t\t}\n\t\t\telse if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)\n\t\t\t{\n\t\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;\n\t\t\t}\n\t\t}\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"\\n\\n========================================================================================================\\n\"));  \n\t\tif(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)\n\t\t\tpDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;\n\t\telse if (pDM_Odm->RFCalibrateInfo.CCK_index <= 0)\n\t\t\tpDM_Odm->RFCalibrateInfo.CCK_index = 0;\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\\n\", \n\t\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl, ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));\n\t\t\n\t    for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \t\t\n\t\t    pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t(\"TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\\n\", \n\t\tpDM_Odm->RFCalibrateInfo.CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));       /*Print Swing base & current*/\n\t\t\t\n\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\\n\",\n\t\t\tpDM_Odm->RFCalibrateInfo.OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p]));\n\t}\n\t\n\tif ((pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||\n\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0 ||\n\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_C] != 0 ||\n\t\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_D] != 0) && \n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff))\n\t{\n\t\t//4 7.2 Configure the Swing Table to adjust Tx Power.\n\t\t\n\t\tpDM_Odm->RFCalibrateInfo.bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.\t\t\t\n\t\t//\n\t\t// 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\n\t\t// to increase TX power. Otherwise, EVM will be bad.\n\t\t//\n\t\t// 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\n\t\tif (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)\n\t\t{\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\", \n\t\t\t\t\tp, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));\t\n\t\t\t}\n\t\t}\n\t\telse if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature\n\t\t{\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\",\n\t\t\t\t\tp, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));\t\t\t\t\n\t\t\t}\n\t\t}\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\tif (ThermalValue > pHalData->EEPROMThermalMeter)\n#else\n\t\tif (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\n#endif\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"Temperature(%d) higher than PG value(%d)\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\t\t\t\n\n\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8822B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"**********Enter POWER Tracking MIX_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"**********Enter POWER Tracking BBSWING_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"Temperature(%d) lower than PG value(%d)\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\n\n\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8822B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"**********Enter POWER Tracking MIX_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"**********Enter POWER Tracking BBSWING_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;    /*Record last time Power Tracking result as base.*/\n\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p];\n\n\t \tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\\n\", pDM_Odm->RFCalibrateInfo.ThermalValue, ThermalValue));\n\t\t\n\t\tpDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;         /*Record last Power Tracking Thermal Value*/\n\n\t}\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\n\tif (!IS_HARDWARE_TYPE_8723B(Adapter) && !IS_HARDWARE_TYPE_8192E(Adapter) && !IS_HARDWARE_TYPE_8703B(Adapter)) {\n\t\t/* Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/\n\t\tif (delta_IQK >= c.Threshold_IQK) {\n\t\t\tif (!pDM_Odm->RFCalibrateInfo.bIQKInProgress) \n\t\t\t\t(*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\n\t\t}\n\t}\t\n\tif (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\n\t\tif (pDM_Odm->RFCalibrateInfo.DpkThermal[ODM_RF_PATH_A] != 0) {\n\t\t\tif (diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK) { \n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK));\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t\t} else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) {\n\t\t\t\ts4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK);\n\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t\t} else {\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\t\n\t\t\t}\n\t\t}\n\t\tif (pDM_Odm->RFCalibrateInfo.DpkThermal[ODM_RF_PATH_B] != 0) {\n\t\t\tif (diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK) { \n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK));\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t\t} else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) {\n\t\t\t\ts4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK);\t\n\t\t\t\t\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t\t} else {\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\t\n\t\t\t}\n\t\t}\n\t}\n\n#endif\t\t\n\t\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"<===ODM_TXPowerTrackingCallback_ThermalMeter End\\n\"));\n\t\n\tpDM_Odm->RFCalibrateInfo.TXPowercount = 0;\n}\n\n\n//3============================================================\n//3 IQ Calibration\n//3============================================================\n\nVOID\nODM_ResetIQKResult(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\treturn;\n\n}\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\nu1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\n{\n\tu1Byte\tchannel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \n\t{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};\n\tu1Byte\tplace = chnl;\n\n\t\n\tif(chnl > 14)\n\t{\n\t\tfor(place = 14; place<sizeof(channel_all); place++)\n\t\t{\n\t\t\tif(channel_all[place] == chnl)\n\t\t\t{\n\t\t\t\treturn place-13;\n\t\t\t}\n\t\t}\n\t}\t\n\treturn 0;\n\n}\n#endif\n\nVOID\nodm_IQCalibrate(\n\t\tIN\tPDM_ODM_T\tpDM_Odm \n\t\t)\n{\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tif (*pDM_Odm->pIsFcsModeEnable)\n\t\treturn;\n#endif\n\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\n\tif (!IS_HARDWARE_TYPE_JAGUAR(Adapter))\n\t\treturn;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\telse if (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\treturn;\n#endif\n#endif\n\t\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->bLinked) {\n\t\tif ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\n\t\t\tpDM_Odm->preChannel = *pDM_Odm->pChannel;\n\t\t\tpDM_Odm->LinkedInterval = 0;\n\t\t}\n\n\t\tif (pDM_Odm->LinkedInterval < 3)\n\t\t\tpDM_Odm->LinkedInterval++;\n\t\t\n\t\tif (pDM_Odm->LinkedInterval == 2) {\n\t\t\t/*Mark out IQK flow to prevent tx stuck. by Maddest 20130306*/\n\t\t\t/*Open it verified by James 20130715*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\tPHY_IQCalibrate_8821A(pDM_Odm, FALSE);\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\tPHY_IQCalibrate(Adapter, FALSE);\n#else\n\t\t\tPHY_IQCalibrate_8821A(Adapter, FALSE);\n#endif\n\t\t}\n\t} else\n\t\tpDM_Odm->LinkedInterval = 0;\n#endif\n}\n\nvoid phydm_rf_init(IN\tPVOID\t\tpDM_VOID)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\todm_TXPowerTrackingInit(pDM_Odm);\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_ClearTxPowerTrackingState(pDM_Odm);\t\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n#if (RTL8814A_SUPPORT == 1)\t\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tPHY_IQCalibrate_8814A_Init(pDM_Odm);\n#endif\t\n#endif\n\n}\n\nvoid phydm_rf_watchdog(IN\tPVOID\t\tpDM_VOID)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_TXPowerTrackingCheck(pDM_Odm);\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\todm_IQCalibrate(pDM_Odm);\n#endif\n}\n"
  },
  {
    "path": "hal/phydm/halphyrf_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n #ifndef __HAL_PHY_RF_H__\n #define __HAL_PHY_RF_H__\n \n/*#include \"phydm_kfree.h\"*/\n#if (RTL8814A_SUPPORT == 1)\n#include \"rtl8814a/phydm_iqk_8814a.h\"\n#endif\n\n#if (RTL8822B_SUPPORT == 1)\n#include \"rtl8822b/phydm_iqk_8822b.h\"\n#endif\n#include \"phydm_powertracking_ce.h\"\n\n\ntypedef enum _SPUR_CAL_METHOD {\n\tPLL_RESET,\n\tAFE_PHASE_SEL\n} SPUR_CAL_METHOD;\n\ntypedef enum _PWRTRACK_CONTROL_METHOD {\n\tBBSWING,\n\tTXAGC,\n\tMIX_MODE,\n\tTSSI_MODE\n} PWRTRACK_METHOD;\n\ntypedef VOID \t(*FuncSetPwr)(PVOID, PWRTRACK_METHOD, u1Byte, u1Byte);\ntypedef VOID(*FuncIQK)(PVOID, u1Byte, u1Byte, u1Byte);\ntypedef VOID \t(*FuncLCK)(PVOID);\ntypedef VOID  \t(*FuncSwing)(PVOID, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\ntypedef VOID\t(*FuncSwing8814only)(PVOID, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\n\ntypedef struct _TXPWRTRACK_CFG {\n\tu1Byte \t\tSwingTableSize_CCK;\t\n\tu1Byte \t\tSwingTableSize_OFDM;\n\tu1Byte \t\tThreshold_IQK;\t\n\tu1Byte\t\tThreshold_DPK;\n\tu1Byte \t\tAverageThermalNum;\n\tu1Byte \t\tRfPathCount;\n\tu4Byte \t\tThermalRegAddr;\t\n\tFuncSetPwr \tODM_TxPwrTrackSetPwr;\n\tFuncIQK \tDoIQK;\n\tFuncLCK\t\tPHY_LCCalibrate;\n\tFuncSwing\tGetDeltaSwingTable;\n\tFuncSwing8814only\tGetDeltaSwingTable8814only;\n} TXPWRTRACK_CFG, *PTXPWRTRACK_CFG;\n\nvoid ConfigureTxpowerTrack(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\n\nVOID\nODM_ClearTxPowerTrackingState(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n\n\n\n#define ODM_TARGET_CHNL_NUM_2G_5G\t59\n\n\nVOID\nODM_ResetIQKResult(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\nu1Byte \nODM_GetRightChnlPlaceforIQK(\n    IN u1Byte chnl\n);\n\nvoid phydm_rf_init(\tIN\t\tPVOID\t\t\t\t\tpDM_VOID);\nvoid phydm_rf_watchdog(\tIN\t\tPVOID\t\t\t\t\tpDM_VOID);\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_H__\n\n"
  },
  {
    "path": "hal/phydm/halphyrf_win.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n #include \"mp_precomp.h\"\n #include \"phydm_precomp.h\"\n\n//#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n#define \tCALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\\n\t\t\t\t\tdo {\\\n\t\t\t\t\t\tfor(_offset = 0; _offset < _size; _offset++)\\\n\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\tif(_deltaThermal < thermalThreshold[_direction][_offset])\\\n\t\t\t\t\t\t\t{\\\n\t\t\t\t\t\t\t\tif(_offset != 0)\\\n\t\t\t\t\t\t\t\t\t_offset--;\\\n\t\t\t\t\t\t\t\tbreak;\\\n\t\t\t\t\t\t\t}\\\n\t\t\t\t\t\t}\t\t\t\\\n\t\t\t\t\t\tif(_offset >= _size)\\\n\t\t\t\t\t\t\t_offset = _size-1;\\\n\t\t\t\t\t} while(0)\n\n\nvoid ConfigureTxpowerTrack(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t)\n{\n#if RTL8192E_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8192E)\n\t\tConfigureTxpowerTrack_8192E(pConfig);\n#endif\t\n#if RTL8821A_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8821)\n\t\tConfigureTxpowerTrack_8821A(pConfig);\n#endif\n#if RTL8812A_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8812)\n\t\tConfigureTxpowerTrack_8812A(pConfig);\n#endif\n#if RTL8188E_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t\tConfigureTxpowerTrack_8188E(pConfig);\n#endif \n\n#if RTL8188F_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8188F)\n\t\tConfigureTxpowerTrack_8188F(pConfig);\n#endif \n\n#if RTL8723B_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8723B)\n\t\tConfigureTxpowerTrack_8723B(pConfig);\n#endif\n\n#if RTL8814A_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8814A)\n\t\tConfigureTxpowerTrack_8814A(pConfig);\n#endif\n\n#if RTL8821B_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8821B)\n\t\tConfigureTxpowerTrack_8821B(pConfig);\n#endif\n\n#if RTL8703B_SUPPORT\n\tif(pDM_Odm->SupportICType==ODM_RTL8703B)\n\t\tConfigureTxpowerTrack_8703B(pConfig);\n#endif\n\n}\n\n//======================================================================\n// <20121113, Kordan> This function should be called when TxAGC changed.\n// Otherwise the previous compensation is gone, because we record the \n// delta of temperature between two TxPowerTracking watch dogs.\n//\n// NOTE: If Tx BB swing or Tx scaling is varified during run-time, still \n//       need to call this function.\n//======================================================================\nVOID\nODM_ClearTxPowerTrackingState(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(pDM_Odm->Adapter);\n\tu1Byte \t\t\tp = 0;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\n\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\n\tpRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;\n\tpRFCalibrateInfo->CCK_index = 0;\n\t\n\tfor (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\n\t{\n\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\t\tpRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\t   \tpRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\n\t\tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\n\n\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0;    // Initial Mix mode power tracking\n\t\tpRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0;\t\t\t  \n\t\tpRFCalibrateInfo->KfreeOffset[p] = 0;\t\t\t  \n\t}\n\t\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathA= FALSE;       //Initial at Modify Tx Scaling Mode\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathB= FALSE;       //Initial at Modify Tx Scaling Mode\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathC= FALSE;       //Initial at Modify Tx Scaling Mode\n\tpRFCalibrateInfo->Modify_TxAGC_Flag_PathD= FALSE;       //Initial at Modify Tx Scaling Mode\n\tpRFCalibrateInfo->Remnant_CCKSwingIdx= 0;\n\tpRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;\n\n\tpRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;\t\t\t//modify by Mingzhi.Guo\n\tpRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;\t\t//modify by Mingzhi.Guo\n\n}\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t)\n{\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm\t  = &pHalData->DM_OutSrc;\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\n\tu1Byte\t\t\tThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0, pathName = 0;\n\ts1Byte\t\t\tdiff_DPK[4] = {0};\n\tu1Byte\t\t\tThermalValue_AVG_count = 0;\n\tu4Byte\t\t\tThermalValue_AVG = 0;\t\n\n\tu1Byte\t\t\tOFDM_min_index = 0;  // OFDM BB Swing should be less than +3.0dB, which is required by Arthur\n\tu1Byte\t\t\tIndexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)\n\tBOOLEAN\t\t\tbTSSIenable = FALSE;\n\n\tTXPWRTRACK_CFG \tc;\n\t\n\t//4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_A, deltaSwingTableIdx_TDOWN_A;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_B, deltaSwingTableIdx_TDOWN_B;\n\t//for 8814 add by Yu Chen\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_C = NULL, deltaSwingTableIdx_TDOWN_C = NULL;\n\tpu1Byte\t\t\tdeltaSwingTableIdx_TUP_D= NULL, deltaSwingTableIdx_TDOWN_D = NULL;\n\t\t\n\t//4 2. Initilization ( 7 steps in total )\n\n\tConfigureTxpowerTrack(pDM_Odm, &c);\n\t\n\t(*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,\n\t\t\t\t\t\t\t\t\t  (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);\n\n\tif(pDM_Odm->SupportICType & ODM_RTL8814A)\t// for 8814 path C & D\n\t(*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_C, (pu1Byte*)&deltaSwingTableIdx_TDOWN_C,\n\t\t\t\t\t\t\t\t\t  (pu1Byte*)&deltaSwingTableIdx_TUP_D, (pu1Byte*)&deltaSwingTableIdx_TDOWN_D);\n\t\n\t\n\tpRFCalibrateInfo->TXPowerTrackingCallbackCnt++; //cosa add for debug\n\tpRFCalibrateInfo->bTXPowerTrackingInit = TRUE;\n   \n#if (MP_DRIVER == 1)      \n    /*pRFCalibrateInfo->TxPowerTrackControl = pHalData->TxPowerTrackControl;\n    <Kordan> We should keep updating the control variable according to HalData. \n    <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files. */\n    pRFCalibrateInfo->RegA24 = 0x090e1317; \n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t(\"===>ODM_TXPowerTrackingCallback_ThermalMeter, \\\n\t\t \\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\\n\", \n\t\tpRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t\t(\"pRFCalibrateInfo->TxPowerTrackControl %d,  pHalData->EEPROMThermalMeter %d\\n\", pRFCalibrateInfo->TxPowerTrackControl,  pHalData->EEPROMThermalMeter));\n\tThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);\t//0x42: RF Reg[15:10] 88E\n\n\n\tif( ! pRFCalibrateInfo->TxPowerTrackControl )\n        \treturn;\n\n\n\t//4 3. Initialize ThermalValues of RFCalibrateInfo\n\n\tif(pRFCalibrateInfo->bReloadtxpowerindex)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"reload ofdm index for band switch\\n\"));\t\t\t\t\n\t}\n\n\t//4 4. Calculate average thermal meter\n\t\n\tpRFCalibrateInfo->ThermalValue_AVG[pRFCalibrateInfo->ThermalValue_AVG_index] = ThermalValue;\n\tpRFCalibrateInfo->ThermalValue_AVG_index++;\n\tif(pRFCalibrateInfo->ThermalValue_AVG_index == c.AverageThermalNum)   //Average times =  c.AverageThermalNum\n\t\tpRFCalibrateInfo->ThermalValue_AVG_index = 0;\n\n\tfor(i = 0; i < c.AverageThermalNum; i++)\n\t{\n\t\tif(pRFCalibrateInfo->ThermalValue_AVG[i])\n\t\t{\n\t\t\tThermalValue_AVG += pRFCalibrateInfo->ThermalValue_AVG[i];\n\t\t\tThermalValue_AVG_count++;\n\t\t}\n\t}\n\n\tif(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\n\t{\n\t\tThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\t\t\t\t\t\n\t}\n\t\t\t\n\t//4 5. Calculate delta, delta_LCK, delta_IQK.\n\n\t//\"delta\" here is used to determine whether thermal value changes or not.\n\tdelta \t  = (ThermalValue > pRFCalibrateInfo->ThermalValue)?(ThermalValue - pRFCalibrateInfo->ThermalValue):(pRFCalibrateInfo->ThermalValue - ThermalValue);\n\tdelta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\n\tdelta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\n\n\tif(pRFCalibrateInfo->ThermalValue_IQK == 0xff)\t//no PG, use thermal value for IQK\n\t{\n\t\tpRFCalibrateInfo->ThermalValue_IQK = ThermalValue;\n\t\tdelta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"no PG, use ThermalValue for IQK\\n\"));\n\t}\n\t\n\tfor(p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t{\n\t\tdiff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pRFCalibrateInfo->DpkThermal[p];\n\t\t}\n\n\t//4 6. If necessary, do LCK.\t\n\n\tif (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\n\t\t/*no PG , do LCK at initial status*/\n\t\tif (pRFCalibrateInfo->ThermalValue_LCK == 0xff) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"no PG, do LCK\\n\"));\n\t\tpRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\n\t\tif(c.PHY_LCCalibrate)\n\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t\tdelta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\\n\", delta, delta_LCK, delta_IQK));\n\t\n\t\t /* Delta temperature is equal to or larger than 20 centigrade.*/\n\t\tif (delta_LCK >= c.Threshold_IQK) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"delta_LCK(%d) >= Threshold_IQK(%d)\\n\", delta_LCK, c.Threshold_IQK));\n\t\tpRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\n\t\tif(c.PHY_LCCalibrate)\n\t\t\t(*c.PHY_LCCalibrate)(pDM_Odm);\n\t}\n\t}\n\n\t//3 7. If necessary, move the index of swing table to adjust Tx power.\t\n\t\n\tif (delta > 0 && pRFCalibrateInfo->TxPowerTrackControl)\n\t{\n\t\t//\"delta\" here is used to record the absolute value of differrence.\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\n\t    delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);\t\t\n#else\n\t    delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);\t\t\n#endif\n\t\tif (delta >= TXPWR_TRACK_TABLE_SIZE)\n\t\t\tdelta = TXPWR_TRACK_TABLE_SIZE - 1;\n\n\t\t//4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset\n\t\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\t\t\n\t\tif(ThermalValue > pHalData->EEPROMThermalMeter) {\n#else\n\t\tif(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\n#endif\n\n\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t{\n\t\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];\t//recording poer index offset\n\t\t\tswitch(p)\n\t\t\t\t{\n\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t                                    \t(\"deltaSwingTableIdx_TUP_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_B[delta])); \n\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_B[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t                                    \t(\"deltaSwingTableIdx_TUP_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_C[delta]));\n\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_C[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t                                   \t (\"deltaSwingTableIdx_TUP_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_D[delta]));\n\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_D[delta];       // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \n\t                                 \t   \t(\"deltaSwingTableIdx_TUP_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TUP_A[delta]));\n\t\t\t\t\t\t\n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_A[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n        } \n\t\telse {\n\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \n\t\t\t{\n\t\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];\t//recording poer index offset\n\t\t\tswitch(p)\n\t\t\t\t{\n\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n               \t \t\t\t\t(\"deltaSwingTableIdx_TDOWN_B[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_B[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n               \t \t\t\t\t(\"deltaSwingTableIdx_TDOWN_C[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_C[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n               \t \t\t\t\t(\"deltaSwingTableIdx_TDOWN_D[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_D[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n               \t \t\t\t\t(\"deltaSwingTableIdx_TDOWN_A[%d] = %d\\n\", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \n\t\t\t\t\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];\n\t\t\t\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        // Record delta swing for mix mode power tracking\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n        }\n\t\t\n\t   for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \t\t\n        \t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"\\n\\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\\n\", p));  \n\t\t\t\n\t\t    if(pRFCalibrateInfo->DeltaPowerIndex[p] == pRFCalibrateInfo->DeltaPowerIndexLast[p])         // If Thermal value changes but lookup table value still the same\n\t\t    \tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t\t    else\n\t\t    \tpRFCalibrateInfo->PowerIndexOffset[p] = pRFCalibrateInfo->DeltaPowerIndex[p] - pRFCalibrateInfo->DeltaPowerIndexLast[p];      // Power Index Diff between 2 times Power Tracking\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\\n\", p, pRFCalibrateInfo->PowerIndexOffset[p], pRFCalibrateInfo->DeltaPowerIndex[p], pRFCalibrateInfo->DeltaPowerIndexLast[p]));\t\t\n\t\t\n\t\t\tpRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pRFCalibrateInfo->PowerIndexOffset[p];\n\t\t\tpRFCalibrateInfo->CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pRFCalibrateInfo->PowerIndexOffset[p];\n\n\t\t\tpRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->CCK_index;\t\n\t\t\tpRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->OFDM_index[p];\t\n\n\t           // *************Print BB Swing Base and Index Offset*************\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->PowerIndexOffset[p]));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\\n\", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pRFCalibrateInfo->PowerIndexOffset[p]));\n\n\t\t    //4 7.1 Handle boundary conditions of index.\n\t\t\n\t\t\tif(pRFCalibrateInfo->OFDM_index[p] > c.SwingTableSize_OFDM-1)\n\t\t\t{\n\t\t\t\tpRFCalibrateInfo->OFDM_index[p] = c.SwingTableSize_OFDM-1;\n\t\t\t}\n\t\t\telse if (pRFCalibrateInfo->OFDM_index[p] <= OFDM_min_index)\n\t\t\t{\n\t\t\t\tpRFCalibrateInfo->OFDM_index[p] = OFDM_min_index;\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n            (\"\\n\\n========================================================================================================\\n\"));  \n\t\tif(pRFCalibrateInfo->CCK_index > c.SwingTableSize_CCK-1)\n\t\t\tpRFCalibrateInfo->CCK_index = c.SwingTableSize_CCK-1;\n\t\telse if (pRFCalibrateInfo->CCK_index <= 0)\n\t\t\tpRFCalibrateInfo->CCK_index = 0;\n\t}\n\telse\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pRFCalibrateInfo->ThermalValue: %d\\n\", \n\t\t\tpRFCalibrateInfo->TxPowerTrackControl, ThermalValue, pRFCalibrateInfo->ThermalValue));\n\n\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \t\t\n\t\t    pRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t}\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\\n\", \n\t\t\tpRFCalibrateInfo->CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));       //Print Swing base & current\n\t\t\n\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t(\"TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\\n\",\n\t\t\tpRFCalibrateInfo->OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p]));\n\t}\n\t\n\tif ((pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_A] != 0 ||\n\t\tpRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_B] != 0 ||\n\t\tpRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_C] != 0 ||\n\t\tpRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_D] != 0) && \n     \t \tpRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff))\n\t{\n\t\t//4 7.2 Configure the Swing Table to adjust Tx Power.\n\t\t\n\t\tpRFCalibrateInfo->bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.\t\t\t\n\t\t//\n\t\t// 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\n\t\t// to increase TX power. Otherwise, EVM will be bad.\n\t\t//\n\t\t// 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\n\t\tif (ThermalValue > pRFCalibrateInfo->ThermalValue)\n\t\t{\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\", \n\t\t\t\t\tp, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));\t\n\t\t\t}\n\t\t}\n\t\t\n\t\telse if (ThermalValue < pRFCalibrateInfo->ThermalValue)// Low temperature\n\t\t{\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t(\"Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\\n\",\n\t\t\t\t\tp, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));\t\t\t\t\n\t\t\t}\n\t\t}\t\t\t\t\n\t\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\tif (ThermalValue > pHalData->EEPROMThermalMeter)\n#else\n\t\tif (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\n#endif\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"Temperature(%d) higher than PG value(%d)\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\t\t\t\n\n\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E ||pDM_Odm->SupportICType == ODM_RTL8821 ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8812  || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A || pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"**********Enter POWER Tracking MIX_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"**********Enter POWER Tracking BBSWING_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"Temperature(%d) lower than PG value(%d)\\n\", ThermalValue, pHalData->EEPROMThermalMeter));\n\n\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\n\t\t\t\tpDM_Odm->SupportICType == ODM_RTL8812  || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A || pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\t\t{\n\t            \t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"**********Enter POWER Tracking MIX_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"**********Enter POWER Tracking BBSWING_MODE**********\\n\"));\n\t\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\t\t(*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;   // Record last time Power Tracking result as base.\n\t\t\tfor (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\n\t\t\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p];\n\n\t \t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t(\"pRFCalibrateInfo->ThermalValue = %d ThermalValue= %d\\n\", pRFCalibrateInfo->ThermalValue, ThermalValue));\n\t\t\n\t\t\tpRFCalibrateInfo->ThermalValue = ThermalValue;         //Record last Power Tracking Thermal Value\n\t\t\t\n\t}\n\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\n\tif(!IS_HARDWARE_TYPE_8723B(Adapter))\n\t{\n\t\t// Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).\n\t\tif ((delta_IQK >= c.Threshold_IQK)) {\n\t\t\tif ( ! pRFCalibrateInfo->bIQKInProgress) \n\t\t\t\t(*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\n\t\t}\n\t}\n\tif (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_A] != 0) {\n\t\tif ((diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK)) { \n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK));\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t} else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) {\n\t\t\ts4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK);\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t} else {\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\t\n\t\t}\n\t}\n\tif (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_B] != 0) {\n\t\tif ((diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK)) { \n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK));\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t} else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) {\n\t\t\ts4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK);\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\n\t\t} else {\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\t\n\t\t}\n\t}\n\n#endif\t\t\n\t\t\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"<===ODM_TXPowerTrackingCallback_ThermalMeter\\n\"));\n\t\n\tpRFCalibrateInfo->TXPowercount = 0;\n}\n\n\n\n//3============================================================\n//3 IQ Calibration\n//3============================================================\n\nVOID\nODM_ResetIQKResult(\n\tIN PDM_ODM_T\tpDM_Odm \n)\n{\n\treturn;\n}\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\nu1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\n{\n\tu1Byte\tchannel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \n\t{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};\n\tu1Byte\tplace = chnl;\n\n\t\n\tif(chnl > 14)\n\t{\n\t\tfor(place = 14; place<sizeof(channel_all); place++)\n\t\t{\n\t\t\tif(channel_all[place] == chnl)\n\t\t\t{\n\t\t\t\treturn place-13;\n\t\t\t}\n\t\t}\n\t}\t\n\treturn 0;\n\n}\n#endif\n\nVOID\nodm_IQCalibrate(\n\t\tIN\tPDM_ODM_T\tpDM_Odm \n\t\t)\n{\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tif (*pDM_Odm->pIsFcsModeEnable)\n\t\treturn;\n#endif\n\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\t\t\n\tif (!IS_HARDWARE_TYPE_JAGUAR(Adapter))\n\t\treturn;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\telse if (IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\treturn;\n#endif\n#endif\n\t\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->bLinked) {\n\t\tif ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\n\t\t\tpDM_Odm->preChannel = *pDM_Odm->pChannel;\n\t\t\tpDM_Odm->LinkedInterval = 0;\n\t\t}\n\n\t\tif (pDM_Odm->LinkedInterval < 3)\n\t\t\tpDM_Odm->LinkedInterval++;\n\t\t\n\t\tif (pDM_Odm->LinkedInterval == 2) {\n\t\t\t/*Mark out IQK flow to prevent tx stuck. by Maddest 20130306*/\n\t\t\t/*Open it verified by James 20130715*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\tPHY_IQCalibrate_8821A(pDM_Odm, FALSE);\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\tPHY_IQCalibrate(Adapter, FALSE);\n#else\n\t\t\tPHY_IQCalibrate_8821A(Adapter, FALSE);\n#endif\n\t\t}\n\t} else\n\t\tpDM_Odm->LinkedInterval = 0;\n#endif\n}\n\nvoid phydm_rf_init(IN\t\tPDM_ODM_T\t\tpDM_Odm)\n{\n\n\todm_TXPowerTrackingInit(pDM_Odm);\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_ClearTxPowerTrackingState(pDM_Odm);\t\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n#if (RTL8814A_SUPPORT == 1)\t\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tPHY_IQCalibrate_8814A_Init(pDM_Odm);\n#endif\t\n#endif\n\n}\n\nvoid phydm_rf_watchdog(IN\t\tPDM_ODM_T\t\tpDM_Odm)\n{\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tODM_TXPowerTrackingCheck(pDM_Odm);\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\todm_IQCalibrate(pDM_Odm);\n#endif\n}"
  },
  {
    "path": "hal/phydm/halphyrf_win.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n #ifndef __HAL_PHY_RF_H__\n #define __HAL_PHY_RF_H__\n \n#include \"phydm_kfree.h\"\n#if (RTL8814A_SUPPORT == 1)\n#include \"rtl8814a/phydm_iqk_8814a.h\"\n#endif\n\n#if (RTL8822B_SUPPORT == 1)\n#include \"rtl8822b/phydm_iqk_8822b.h\"\n#endif\n#include \"phydm_powertracking_win.h\"\n\ntypedef enum _SPUR_CAL_METHOD {\n\tPLL_RESET,\n\tAFE_PHASE_SEL\n} SPUR_CAL_METHOD;\n\ntypedef enum _PWRTRACK_CONTROL_METHOD {\n\tBBSWING,\n\tTXAGC,\n\tMIX_MODE,\n\tTSSI_MODE\n} PWRTRACK_METHOD;\n\ntypedef VOID \t(*FuncSetPwr)(PDM_ODM_T, PWRTRACK_METHOD, u1Byte, u1Byte);\ntypedef VOID(*FuncIQK)(PVOID, u1Byte, u1Byte, u1Byte);\ntypedef VOID \t(*FuncLCK)(PDM_ODM_T);\n\t\t\t\t//refine by YuChen for 8814A\ntypedef VOID  \t(*FuncSwing)(PDM_ODM_T, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\ntypedef VOID\t(*FuncSwing8814only)(PDM_ODM_T, pu1Byte*, pu1Byte*, pu1Byte*, pu1Byte*);\n\ntypedef struct _TXPWRTRACK_CFG {\n\tu1Byte \t\tSwingTableSize_CCK;\t\n\tu1Byte \t\tSwingTableSize_OFDM;\n\tu1Byte \t\tThreshold_IQK;\n\tu1Byte \t\tThreshold_DPK;\t\n\tu1Byte \t\tAverageThermalNum;\n\tu1Byte \t\tRfPathCount;\n\tu4Byte \t\tThermalRegAddr;\t\n\tFuncSetPwr \tODM_TxPwrTrackSetPwr;\n\tFuncIQK \tDoIQK;\n\tFuncLCK\t\tPHY_LCCalibrate;\n\tFuncSwing\tGetDeltaSwingTable;\n\tFuncSwing8814only\tGetDeltaSwingTable8814only;\n} TXPWRTRACK_CFG, *PTXPWRTRACK_CFG;\n\nVOID \nConfigureTxpowerTrack(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tOUT\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\n\nVOID\nODM_ClearTxPowerTrackingState(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t);\n\nVOID\nODM_TXPowerTrackingCallback_ThermalMeter(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm\n#else\n\tIN PADAPTER\tAdapter\n#endif\n\t);\n\n\n\n#define ODM_TARGET_CHNL_NUM_2G_5G\t59\n\n\nVOID\nODM_ResetIQKResult(\n\tIN PDM_ODM_T\tpDM_Odm \n);\nu1Byte \nODM_GetRightChnlPlaceforIQK(\n    IN u1Byte chnl\n);\n\nVOID odm_IQCalibrate(IN\tPDM_ODM_T\tpDM_Odm);\nVOID phydm_rf_init(\tIN\t\tPDM_ODM_T\t\tpDM_Odm);\nVOID phydm_rf_watchdog(\tIN\t\tPDM_ODM_T\t\tpDM_Odm);\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_H__\n\n"
  },
  {
    "path": "hal/phydm/mp_precomp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n"
  },
  {
    "path": "hal/phydm/phydm.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\nconst u2Byte dB_Invert_Table[12][8] = {\n\t{\t1,\t\t1,\t\t1,\t\t2,\t\t2,\t\t2,\t\t2,\t\t3},\n\t{\t3,\t\t3,\t\t4,\t\t4,\t\t4,\t\t5,\t\t6,\t\t6},\n\t{\t7,\t\t8,\t\t9,\t\t10,\t\t11,\t\t13,\t\t14,\t\t16},\n\t{\t18,\t\t20,\t\t22,\t\t25,\t\t28,\t\t32,\t\t35,\t\t40},\n\t{\t45,\t\t50,\t\t56,\t\t63,\t\t71,\t\t79,\t\t89,\t\t100},\n\t{\t112,\t\t126,\t\t141,\t\t158,\t\t178,\t\t200,\t\t224,\t\t251},\n\t{\t282,\t\t316,\t\t355,\t\t398,\t\t447,\t\t501,\t\t562,\t\t631},\n\t{\t708,\t\t794,\t\t891,\t\t1000,\t1122,\t1259,\t1413,\t1585},\n\t{\t1778,\t1995,\t2239,\t2512,\t2818,\t3162,\t3548,\t3981},\n\t{\t4467,\t5012,\t5623,\t6310,\t7079,\t7943,\t8913,\t10000},\n\t{\t11220,\t12589,\t14125,\t15849,\t17783,\t19953,\t22387,\t25119},\n\t{\t28184,\t31623,\t35481,\t39811,\t44668,\t50119,\t56234,\t65535}\n};\n\n\n//============================================================\n// Local Function predefine.\n//============================================================\n\n/* START------------COMMON INFO RELATED--------------- */\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nODM_UpdateInitRateWorkItemCallback(\n    IN PVOID            pContext\n    );\n#endif\n\nVOID\nodm_GlobalAdapterCheck(\n\tIN\t\tVOID\n\t);\n\n//move to odm_PowerTacking.h by YuChen\n\n\n\nVOID\nodm_UpdatePowerTrainingState(\n\tIN\tPDM_ODM_T\tpDM_Odm\n);\n\n//============================================================\n//3 Export Interface\n//============================================================\n\n/*Y = 10*log(X)*/\ns4Byte\nODM_PWdB_Conversion(\n\tIN  s4Byte X,\n\tIN  u4Byte TotalBit,\n\tIN  u4Byte DecimalBit\n\t)\n{\n\ts4Byte Y, integer = 0, decimal = 0;\n\tu4Byte i;\n\n\tif(X == 0)\n\t\tX = 1; // log2(x), x can't be 0\n\n\tfor(i = (TotalBit-1); i > 0; i--)\n\t{\n\t\tif(X & BIT(i))\n\t\t{\n\t\t\tinteger = i;\n\t\t\tif(i > 0)\n\t\t\t\tdecimal = (X & BIT(i-1))?2:0; //decimal is 0.5dB*3=1.5dB~=2dB \n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tY = 3*(integer-DecimalBit)+decimal; //10*log(x)=3*log2(x), \n\n\treturn Y;\n}\n\ns4Byte\nODM_SignConversion(\n    IN  s4Byte value,\n    IN  u4Byte TotalBit\n    )\n{\n\tif(value&BIT(TotalBit-1))\n\t\tvalue -= BIT(TotalBit);\n\treturn value;\n}\n\nVOID\nODM_InitMpDriverStatus(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n)\n{\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n\t// Decide when compile time\n\t#if(MP_DRIVER == 1)\n\tpDM_Odm->mp_mode = TRUE;\n\t#else\n\tpDM_Odm->mp_mode = FALSE;\n\t#endif\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n\tPADAPTER\tAdapter =  pDM_Odm->Adapter;\n\n\t// Update information every period\n\tpDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;\n\n#else\n\n\t// MP mode is always false at AP side\n\tpDM_Odm->mp_mode = FALSE;\n\n#endif\n}\n\nVOID\nODM_UpdateMpDriverStatus(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n)\n{\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n\t// Do nothing.\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\tAdapter =  pDM_Odm->Adapter;\n\n\t// Update information erery period\n\tpDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;\n\n#else\n\n\t// Do nothing.\n\n#endif\n}\n\nVOID\nPHYDM_InitTRXAntennaSetting(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n)\n{\n#if (RTL8814A_SUPPORT == 1)\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8814A)) {\n\t\tu1Byte\tRxAnt = 0, TxAnt = 0;\n\n\t\tRxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH, pDM_Odm), ODM_BIT(BB_RX_PATH, pDM_Odm));\n\t\tTxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_TX_PATH, pDM_Odm), ODM_BIT(BB_TX_PATH, pDM_Odm));\n\t\tpDM_Odm->TXAntStatus =  (TxAnt & 0xf);\n\t\tpDM_Odm->RXAntStatus =  (RxAnt & 0xf);\n\t}\n#endif\n}\n\nVOID\nphydm_Init_cck_setting(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n)\n{\n\tu4Byte value_824,value_82c;\n\n\tpDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm));\n\n\t#if (RTL8192E_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType & (ODM_RTL8192E))\n\t{\n\t\t/* 0x824[9] = 0x82C[9] = 0xA80[7]  these regiaters settinh should be equal or CCK RSSI report may inaccurate */\n\t\tvalue_824 = ODM_GetBBReg(pDM_Odm, 0x824, BIT9);\n\t\tvalue_82c = ODM_GetBBReg(pDM_Odm, 0x82c, BIT9);\n\t\t\n\t\tif(value_824 != value_82c)\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x82c , BIT9, value_824);\n\t\t}\n\t\tODM_SetBBReg(pDM_Odm, 0xa80 , BIT7, value_824);\n\t\tpDM_Odm->cck_agc_report_type = (BOOLEAN)value_824;\n\t}\n\t#endif\n\t\n\t#if (RTL8703B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType & (ODM_RTL8703B)) {\n\n\t\tpDM_Odm->cck_agc_report_type = ODM_GetBBReg(pDM_Odm, 0x950, BIT11) ? 1 : 0; /*1: 4bit LNA , 0: 3bit LNA */\n\t\t\n\t\tif (pDM_Odm->cck_agc_report_type != 1) {\n\t\t\tDbgPrint(\"[Warning] 8703B CCK should be 4bit LNA, ie. 0x950[11] = 1\\n\");\n\t\t\t/**/\n\t\t}\n\t}\n\t#endif\n\t\n}\n\n\nVOID\nphydm_print_parameter_package_ver(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tu4Byte\tcommit_ver = 0;\n\tu4Byte\tdate = 0;\n\tchar\t*commit_by = NULL;\n\tu4Byte\trelease_ver = 0;\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8192C) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8192D) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8723A) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8821) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8814A) {\n\t\t/**/\n\t\t/**/\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\t#if (RTL8703B_SUPPORT == 1) \n\t\tcommit_ver = SVN_COMMIT_VERSION_8703B;\n\t\tdate = RELEASE_DATE_8703B;\n\t\tcommit_by = COMMIT_BY_8703B;\n\t\trelease_ver = RELEASE_VERSION_8703B;\n\t\t#endif\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8822B) {\n\t\t/**/\n\t\t/**/\t\t\t\t\t\t\t\t\t\t\t\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8188F) {\n\t\t/**/\n\t\t/**/\n\t}\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"[Parameter Package Information] Commit_Ver: (( %d )), Date: ((%d)), Commit_By: ((%s)), Release_Ver: ((%d))\\n\", commit_ver, date, commit_by, release_ver));\t\n\t/*DbgPrint(\"[Parameter Package Information] Commit_Ver: (( %d )), Date: ((%d)), Commit_By: ((%s)), Release_Ver: ((%d))\\n\", commit_ver, date, commit_by, release_ver);*/\n\t\n}\n\nu1Byte DummyHubUsbMode = 1;/* USB 2.0 */\nvoid\tphydm_hook_dummy_member(\n\tIN\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tif (pDM_Odm->HubUsbMode == NULL)\n\t\tpDM_Odm->HubUsbMode = &DummyHubUsbMode;\n}\n\n\nVOID\nodm_CommonInfoSelfInit(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tphydm_print_parameter_package_ver(pDM_Odm);\n\tphydm_Init_cck_setting(pDM_Odm);\n\tpDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm));\n#if (DM_ODM_SUPPORT_TYPE != ODM_CE)\t\n\tpDM_Odm->pbNet_closed = &pDM_Odm->BOOLEAN_temp;\n#endif\n\n\tPHYDM_InitDebugSetting(pDM_Odm);\n\tODM_InitMpDriverStatus(pDM_Odm);\n\tPHYDM_InitTRXAntennaSetting(pDM_Odm);\n\n\tpDM_Odm->TxRate = 0xFF;\n\n\tpDM_Odm->number_linked_client = 0;\n\tpDM_Odm->pre_number_linked_client = 0;\n\tpDM_Odm->number_active_client = 0;\n\tpDM_Odm->pre_number_active_client = 0;\n\tphydm_hook_dummy_member(pDM_Odm);\n\tpDM_Odm->nbi_set_result = 0;\n\t\n}\n\nVOID\nodm_CommonInfoSelfUpdate(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tu1Byte\tEntryCnt = 0, num_active_client = 0;\n\tu4Byte\ti, OneEntry_MACID = 0, ma_rx_tp = 0;\n\tPSTA_INFO_T   \tpEntry;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\tPADAPTER\tAdapter =  pDM_Odm->Adapter;\n\tPMGNT_INFO\tpMgntInfo = &Adapter->MgntInfo;\n\n\tpEntry = pDM_Odm->pODM_StaInfo[0];\n\tif(pMgntInfo->mAssoc)\n\t{\n\t\tpEntry->bUsed=TRUE;\n\t\tfor (i=0; i<6; i++)\n\t\t\tpEntry->MacAddr[i] = pMgntInfo->Bssid[i];\n\t}\n\telse\n\t{\n\t\tpEntry->bUsed=FALSE;\n\t\tfor (i=0; i<6; i++)\n\t\t\tpEntry->MacAddr[i] = 0;\n\t}\n\n\t//STA mode is linked to AP\n\tif(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(Adapter))\n\t\tpDM_Odm->bsta_state = TRUE;\n\telse\n\t\tpDM_Odm->bsta_state = FALSE;\n#endif\n\n/* THis variable cannot be used because it is wrong*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t{\n\t\tif (*(pDM_Odm->pSecChOffset) == 1)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 2;\n\t\telse if (*(pDM_Odm->pSecChOffset) == 2)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 2;\n\t} else if (*(pDM_Odm->pBandWidth) == ODM_BW80M)\t{\n\t\tif (*(pDM_Odm->pSecChOffset) == 1)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 6;\n\t\telse if (*(pDM_Odm->pSecChOffset) == 2)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 6;\n\t} else\n\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel);\n#else\n\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M) {\n\t\tif (*(pDM_Odm->pSecChOffset) == 1)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 2;\n\t\telse if (*(pDM_Odm->pSecChOffset) == 2)\n\t\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 2;\n\t} else\n\t\tpDM_Odm->ControlChannel = *(pDM_Odm->pChannel);\n#endif\n\n\tfor (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\tif(IS_STA_VALID(pEntry))\n\t\t{\n\t\t\tEntryCnt++;\n\t\t\tif(EntryCnt==1)\n\t\t\t{\n\t\t\t\tOneEntry_MACID=i;\n\t\t\t}\n\n\t\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\t\tma_rx_tp =  (pEntry->rx_byte_cnt_LowMAW)<<3; /*  low moving average RX  TP   ( bit /sec)*/\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"ClientTP[%d]: ((%d )) bit/sec\\n\", i, ma_rx_tp));\n\t\t\t\t\n\t\t\t\tif (ma_rx_tp > ACTIVE_TP_THRESHOLD)\n\t\t\t\t\tnum_active_client++;\n\t\t\t#endif\n                }\n\t}\n\t\n\tif(EntryCnt == 1)\n\t{\n\t\tpDM_Odm->bOneEntryOnly = TRUE;\n\t\tpDM_Odm->OneEntry_MACID=OneEntry_MACID;\n\t}\n\telse\n\t\tpDM_Odm->bOneEntryOnly = FALSE;\n\n\tpDM_Odm->pre_number_linked_client = pDM_Odm->number_linked_client;\n\tpDM_Odm->pre_number_active_client = pDM_Odm->number_active_client;\n\t\n\tpDM_Odm->number_linked_client = EntryCnt;\n\tpDM_Odm->number_active_client = num_active_client;\t\n\n\t/* Update MP driver status*/\n\tODM_UpdateMpDriverStatus(pDM_Odm);\n}\n\nVOID\nodm_CommonInfoSelfReset(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tpDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;\n#endif\n}\n\nPVOID\nPhyDM_Get_Structure(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tu1Byte\t\t\tStructure_Type\n)\n\n{\n\tPVOID\tpStruct = NULL;\n#if RTL8195A_SUPPORT\n\tswitch (Structure_Type){\n\t\tcase\tPHYDM_FALSEALMCNT:\n\t\t\tpStruct = &FalseAlmCnt;\n\t\tbreak;\n\t\t\n\t\tcase\tPHYDM_CFOTRACK:\n\t\t\tpStruct = &DM_CfoTrack;\n\t\tbreak;\n\n\t\tcase\tPHYDM_ADAPTIVITY:\n\t\t\tpStruct = &(pDM_Odm->Adaptivity);\n\t\tbreak;\n\t\t\n\t\tdefault:\n\t\tbreak;\n\t}\n\n#else\n\tswitch (Structure_Type){\n\t\tcase\tPHYDM_FALSEALMCNT:\n\t\t\tpStruct = &(pDM_Odm->FalseAlmCnt);\n\t\tbreak;\n\t\t\n\t\tcase\tPHYDM_CFOTRACK:\n\t\t\tpStruct = &(pDM_Odm->DM_CfoTrack);\n\t\tbreak;\n\n\t\tcase\tPHYDM_ADAPTIVITY:\n\t\t\tpStruct = &(pDM_Odm->Adaptivity);\n\t\tbreak;\n\t\t\n\t\tdefault:\n\t\tbreak;\n\t}\n\n#endif\n\treturn\tpStruct;\n}\n\nVOID\nodm_HWSetting(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n#if (RTL8821A_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType & ODM_RTL8821)\n\t\todm_HWSetting_8821A(pDM_Odm);\n#endif\n\n}\n\n//\n// 2011/09/21 MH Add to describe different team necessary resource allocate??\n//\nVOID\nODM_DMInit(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\todm_CommonInfoSelfInit(pDM_Odm);\n\todm_DIGInit(pDM_Odm);\n\tPhydm_NHMCounterStatisticsInit(pDM_Odm);\n\tPhydm_AdaptivityInit(pDM_Odm);\n\tphydm_ra_info_init(pDM_Odm);\n\todm_RateAdaptiveMaskInit(pDM_Odm);\n\todm_RA_ParaAdjust_init(pDM_Odm);\n\tODM_CfoTrackingInit(pDM_Odm);\n\tODM_EdcaTurboInit(pDM_Odm);\n\todm_RSSIMonitorInit(pDM_Odm);\n\tphydm_rf_init(pDM_Odm);\n\todm_TXPowerTrackingInit(pDM_Odm);\n\todm_AntennaDiversityInit(pDM_Odm);\n\todm_AutoChannelSelectInit(pDM_Odm);\n\todm_PathDiversityInit(pDM_Odm);\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\tphydm_Beamforming_Init(pDM_Odm);\n#endif\t\n\n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t{\n\t\todm_DynamicBBPowerSavingInit(pDM_Odm);\n\t\todm_DynamicTxPowerInit(pDM_Odm);\n\n#if (RTL8188E_SUPPORT == 1)\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t\t{\n\t\t\todm_PrimaryCCA_Init(pDM_Odm);\n\t\t\tODM_RAInfo_Init_all(pDM_Odm);\n\t\t}\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\n\t#if (RTL8723B_SUPPORT == 1)\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t\todm_SwAntDetectInit(pDM_Odm);\n\t#endif\n\n\t#if (RTL8192E_SUPPORT == 1)\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8192E)\n\t\t\todm_PrimaryCCA_Check_Init(pDM_Odm);\n\t#endif\n\n#endif\n\n\t}\n\n}\n\nVOID\nODM_DMReset(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tpDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;\n\t\n\tODM_AntDivReset(pDM_Odm);\t\n\tphydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);\n}\n\n\nVOID\nphydm_support_ablity_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tpre_support_ability;\n\tu4Byte used = *_used;\n\tu4Byte out_len = *_out_len;\n\n\tpre_support_ability = pDM_Odm->SupportAbility ;\t\n\tPHYDM_SNPRINTF((output+used, out_len-used,\"\\n%s\\n\", \"================================\"));\n\tif(dm_value[0] == 100)\n\t{\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"[Supportablity] PhyDM Selection\\n\"));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\", \"================================\"));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"00. (( %s ))DIG  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_DIG)?(\"V\"):(\".\")) ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"01. (( %s ))RA_MASK  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_RA_MASK)?(\"V\"):(\".\")) ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"02. (( %s ))DYNAMIC_TXPWR  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR)?(\"V\"):(\".\"))   ));\t\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"03. (( %s ))FA_CNT  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_FA_CNT)?(\"V\"):(\".\"))  ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"04. (( %s ))RSSI_MONITOR  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)?(\"V\"):(\".\"))   ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"05. (( %s ))CCK_PD  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_CCK_PD)?(\"V\"):(\".\"))   ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"06. (( %s ))ANT_DIV  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)?(\"V\"):(\".\"))  ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"07. (( %s ))PWR_SAVE  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE)?(\"V\"):(\".\"))  ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"08. (( %s ))PWR_TRAIN  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN)?(\"V\"):(\".\"))   ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"09. (( %s ))RATE_ADAPTIVE  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_RATE_ADAPTIVE)?(\"V\"):(\".\"))   ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"10. (( %s ))PATH_DIV  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_PATH_DIV)?(\"V\"):(\".\"))));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"11. (( %s ))PSD  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_PSD)?(\"V\"):(\".\")) ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"12. (( %s ))RXHP  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_RXHP)?(\"V\"):(\".\"))   ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"13. (( %s ))ADAPTIVITY  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)?(\"V\"):(\".\")) ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"14. (( %s ))CFO_TRACKING  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING)?(\"V\"):(\".\")) ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"15. (( %s ))NHM_CNT  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_NHM_CNT)?(\"V\"):(\".\"))  ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"16. (( %s ))PRIMARY_CCA  \\n\", ((pDM_Odm->SupportAbility & ODM_BB_PRIMARY_CCA)?(\"V\"):(\".\")) ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"20. (( %s ))EDCA_TURBO  \\n\", ((pDM_Odm->SupportAbility & ODM_MAC_EDCA_TURBO)?(\"V\"):(\".\"))  ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"21. (( %s ))EARLY_MODE  \\n\", ((pDM_Odm->SupportAbility & ODM_MAC_EARLY_MODE)?(\"V\"):(\".\")) ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"24. (( %s ))TX_PWR_TRACK  \\n\", ((pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)?(\"V\"):(\".\"))  ));\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"25. (( %s ))RX_GAIN_TRACK  \\n\", ((pDM_Odm->SupportAbility & ODM_RF_RX_GAIN_TRACK)?(\"V\"):(\".\"))  ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"26. (( %s ))RF_CALIBRATION  \\n\", ((pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)?(\"V\"):(\".\"))   ));\n\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\", \"================================\"));\n\t}\n\t/*\n\telse if(dm_value[0] == 101)\n\t{\n\t\tpDM_Odm->SupportAbility = 0 ;\n\t\tDbgPrint(\"Disable all SupportAbility components \\n\");\n\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\", \"Disable all SupportAbility components\"));\t\n\t}\n\t*/\n\telse\n\t{\n\n\t\tif(dm_value[1] == 1) //enable\n\t\t{\n\t\t\tpDM_Odm->SupportAbility |= BIT(dm_value[0]) ;\n\t\t\tif(BIT(dm_value[0]) & ODM_BB_PATH_DIV)\n\t\t\t{\n\t\t\t\todm_PathDiversityInit(pDM_Odm);\n\t\t\t}\n\t\t}\n\t\telse if(dm_value[1] == 2) //disable\n\t\t{\n\t\t\tpDM_Odm->SupportAbility &= ~(BIT(dm_value[0])) ;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//DbgPrint(\"\\n[Warning!!!]  1:enable,  2:disable \\n\\n\");\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\", \"[Warning!!!]  1:enable,  2:disable\"));\n\t\t}\n\t}\n\tPHYDM_SNPRINTF((output+used, out_len-used,\"pre-SupportAbility  =  0x%x\\n\",  pre_support_ability ));\t\n\tPHYDM_SNPRINTF((output+used, out_len-used,\"Curr-SupportAbility =  0x%x\\n\", pDM_Odm->SupportAbility ));\n\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\", \"================================\"));\n}\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n//\n//tmp modify for LC Only\n//\nVOID\nODM_DMWatchdog_LPS(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\t\n\todm_CommonInfoSelfUpdate(pDM_Odm);\n\todm_FalseAlarmCounterStatistics(pDM_Odm);\n\todm_RSSIMonitorCheck(pDM_Odm);\n\todm_DIGbyRSSI_LPS(pDM_Odm);\t\n\todm_CCKPacketDetectionThresh(pDM_Odm);\n\todm_CommonInfoSelfReset(pDM_Odm);\n\n\tif(*(pDM_Odm->pbPowerSaving)==TRUE)\n\t\treturn;\n}\n#endif\n//\n// 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.\n// You can not add any dummy function here, be care, you can only use DM structure\n// to perform any new ODM_DM.\n//\nVOID\nODM_DMWatchdog(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\todm_CommonInfoSelfUpdate(pDM_Odm);\n\tphydm_BasicDbgMessage(pDM_Odm);\n\todm_HWSetting(pDM_Odm);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t{\n\tprtl8192cd_priv priv\t\t= pDM_Odm->priv;\n\tif( (priv->auto_channel != 0) && (priv->auto_channel != 2) )//if ACS running, do not do FA/CCA counter read\n\t\treturn;\n\t}\n#endif\t\n\todm_FalseAlarmCounterStatistics(pDM_Odm);\n\tphydm_NoisyDetection(pDM_Odm);\n\t\n\todm_RSSIMonitorCheck(pDM_Odm);\n\n\tif(*(pDM_Odm->pbPowerSaving) == TRUE)\n\t{\n\t\todm_DIGbyRSSI_LPS(pDM_Odm);\n\t\t{\n\t\t\tpDIG_T\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\t\t\tPhydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"DMWatchdog in power saving mode\\n\"));\n\t\treturn;\n\t}\n\t\n\tPhydm_CheckAdaptivity(pDM_Odm);\n\todm_UpdatePowerTrainingState(pDM_Odm);\n\todm_DIG(pDM_Odm);\n\t{\n\t\tpDIG_T\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\t\tPhydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);\n\t}\n\todm_CCKPacketDetectionThresh(pDM_Odm);\n\tphydm_ra_dynamic_retry_limit(pDM_Odm);\n\tphydm_ra_dynamic_retry_count(pDM_Odm);\n\todm_RefreshRateAdaptiveMask(pDM_Odm);\n\todm_RefreshBasicRateMask(pDM_Odm);\n\todm_DynamicBBPowerSaving(pDM_Odm);\n\todm_EdcaTurboCheck(pDM_Odm);\n\todm_PathDiversity(pDM_Odm);\n\tODM_CfoTracking(pDM_Odm);\n\todm_DynamicTxPower(pDM_Odm);\n\todm_AntennaDiversity(pDM_Odm);\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\tphydm_Beamforming_Watchdog(pDM_Odm);\n#endif\n\n\tphydm_rf_watchdog(pDM_Odm);\n\n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t{\n\t        \n#if (RTL8188E_SUPPORT == 1)\n\t        if(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t                odm_DynamicPrimaryCCA(pDM_Odm);\t\n#endif\n\n#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\n\t#if (RTL8192E_SUPPORT == 1)\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8192E)\n\t\t\todm_DynamicPrimaryCCA_Check(pDM_Odm); \n\t#endif\n#endif\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\todm_dtc(pDM_Odm);\n#endif\n\n\todm_CommonInfoSelfReset(pDM_Odm);\n\t\n}\n\n\n//\n// Init /.. Fixed HW value. Only init time.\n//\nVOID\nODM_CmnInfoInit(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tu4Byte\t\t\tValue\t\n\t)\n{\n\t//\n\t// This section is used for init value\n\t//\n\tswitch\t(CmnInfo)\n\t{\n\t\t//\n\t\t// Fixed ODM value.\n\t\t//\n\t\tcase\tODM_CMNINFO_ABILITY:\n\t\t\tpDM_Odm->SupportAbility = (u4Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_RF_TYPE:\n\t\t\tpDM_Odm->RFType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_PLATFORM:\n\t\t\tpDM_Odm->SupportPlatform = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_INTERFACE:\n\t\t\tpDM_Odm->SupportInterface = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_MP_TEST_CHIP:\n\t\t\tpDM_Odm->bIsMPChip= (u1Byte)Value;\n\t\t\tbreak;\n            \n\t\tcase\tODM_CMNINFO_IC_TYPE:\n\t\t\tpDM_Odm->SupportICType = Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_CUT_VER:\n\t\t\tpDM_Odm->CutVersion = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_FAB_VER:\n\t\t\tpDM_Odm->FabVersion = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_RFE_TYPE:\n\t\t\tpDM_Odm->RFEType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase    ODM_CMNINFO_RF_ANTENNA_TYPE:\n\t\t\tpDM_Odm->AntDivType= (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BOARD_TYPE:\n\t\t\tpDM_Odm->BoardType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_PACKAGE_TYPE:\n\t\t\tpDM_Odm->PackageType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_EXT_LNA:\n\t\t\tpDM_Odm->ExtLNA = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_5G_EXT_LNA:\n\t\t\tpDM_Odm->ExtLNA5G = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_EXT_PA:\n\t\t\tpDM_Odm->ExtPA = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_5G_EXT_PA:\n\t\t\tpDM_Odm->ExtPA5G = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_GPA:\n\t\t\tpDM_Odm->TypeGPA = (u2Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_APA:\n\t\t\tpDM_Odm->TypeAPA = (u2Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_GLNA:\n\t\t\tpDM_Odm->TypeGLNA = (u2Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_ALNA:\n\t\t\tpDM_Odm->TypeALNA = (u2Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_EXT_TRSW:\n\t\t\tpDM_Odm->ExtTRSW = (u1Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_EXT_LNA_GAIN:\n\t\t\tpDM_Odm->ExtLNAGain = (u1Byte)Value;\n\t\t\tbreak;\n\t\tcase \tODM_CMNINFO_PATCH_ID:\n\t\t\tpDM_Odm->PatchID = (u1Byte)Value;\n\t\t\tbreak;\n\t\tcase \tODM_CMNINFO_BINHCT_TEST:\n\t\t\tpDM_Odm->bInHctTest = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\tcase \tODM_CMNINFO_BWIFI_TEST:\n\t\t\tpDM_Odm->bWIFITest = (BOOLEAN)Value;\n\t\t\tbreak;\t\n\t\tcase\tODM_CMNINFO_SMART_CONCURRENT:\n\t\t\tpDM_Odm->bDualMacSmartConcurrent = (BOOLEAN )Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_DOMAIN_CODE_2G:\n\t\t\tpDM_Odm->odm_Regulation2_4G = (u1Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_DOMAIN_CODE_5G:\n\t\t\tpDM_Odm->odm_Regulation5G = (u1Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_CONFIG_BB_RF:\n\t\t\tpDM_Odm->ConfigBBRF = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_IQKFWOFFLOAD:\n\t\t\tpDM_Odm->IQKFWOffload = (u1Byte)Value;\n\t\t\tbreak;\n\t\t//To remove the compiler warning, must add an empty default statement to handle the other values.\t\n\t\tdefault:\n\t\t\t//do nothing\n\t\t\tbreak;\t\n\t\t\n\t}\n\n}\n\n\nVOID\nODM_CmnInfoHook(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tPVOID\t\t\tpValue\t\n\t)\n{\n\t//\n\t// Hook call by reference pointer.\n\t//\n\tswitch\t(CmnInfo)\n\t{\n\t\t//\n\t\t// Dynamic call by reference pointer.\n\t\t//\n\t\tcase\tODM_CMNINFO_MAC_PHY_MODE:\n\t\t\tpDM_Odm->pMacPhyMode = (u1Byte *)pValue;\n\t\t\tbreak;\n\t\t\n\t\tcase\tODM_CMNINFO_TX_UNI:\n\t\t\tpDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_RX_UNI:\n\t\t\tpDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_WM_MODE:\n\t\t\tpDM_Odm->pWirelessMode = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BAND:\n\t\t\tpDM_Odm->pBandType = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_SEC_CHNL_OFFSET:\n\t\t\tpDM_Odm->pSecChOffset = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_SEC_MODE:\n\t\t\tpDM_Odm->pSecurity = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BW:\n\t\t\tpDM_Odm->pBandWidth = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_CHNL:\n\t\t\tpDM_Odm->pChannel = (u1Byte *)pValue;\n\t\t\tbreak;\n\t\t\n\t\tcase\tODM_CMNINFO_DMSP_GET_VALUE:\n\t\t\tpDM_Odm->pbGetValueFromOtherMac = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BUDDY_ADAPTOR:\n\t\t\tpDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_DMSP_IS_MASTER:\n\t\t\tpDM_Odm->pbMasterOfDMSP = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_SCAN:\n\t\t\tpDM_Odm->pbScanInProcess = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_POWER_SAVING:\n\t\t\tpDM_Odm->pbPowerSaving = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_ONE_PATH_CCA:\n\t\t\tpDM_Odm->pOnePathCCA = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_DRV_STOP:\n\t\t\tpDM_Odm->pbDriverStopped =  (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_PNP_IN:\n\t\t\tpDM_Odm->pbDriverIsGoingToPnpSetPowerSleep =  (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_INIT_ON:\n\t\t\tpDM_Odm->pinit_adpt_in_progress =  (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_ANT_TEST:\n\t\t\tpDM_Odm->pAntennaTest =  (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_NET_CLOSED:\n\t\t\tpDM_Odm->pbNet_closed = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\n\t\tcase \tODM_CMNINFO_FORCED_RATE:\n\t\t\tpDM_Odm->pForcedDataRate = (pu2Byte)pValue;\n\t\t\tbreak;\n\n\t\tcase  ODM_CMNINFO_FORCED_IGI_LB:\n\t\t\tpDM_Odm->pu1ForcedIgiLb = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_P2P_LINK:\n\t\t\tpDM_Odm->DM_DigTable.bP2PInProcess = (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase \tODM_CMNINFO_IS1ANTENNA:\n\t\t\tpDM_Odm->pIs1Antenna = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\t\t\t\n\t\tcase \tODM_CMNINFO_RFDEFAULTPATH:\n\t\t\tpDM_Odm->pRFDefaultPath= (u1Byte *)pValue;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_FCS_MODE:\n\t\t\tpDM_Odm->pIsFcsModeEnable = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\t\t/*add by YuChen for beamforming PhyDM*/\n\t\tcase\tODM_CMNINFO_HUBUSBMODE:\n\t\t\tpDM_Odm->HubUsbMode = (u1Byte *)pValue;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_FWDWRSVDPAGEINPROGRESS:\n\t\t\tpDM_Odm->pbFwDwRsvdPageInProgress = (BOOLEAN *)pValue;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_TX_TP:\n\t\t\tpDM_Odm->pCurrentTxTP = (u4Byte *)pValue;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_RX_TP:\n\t\t\tpDM_Odm->pCurrentRxTP = (u4Byte *)pValue;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_SOUNDING_SEQ:\n\t\t\tpDM_Odm->pSoundingSeq = (u1Byte *)pValue;\n\t\t\tbreak;\n\t\t//case\tODM_CMNINFO_RTSTA_AID:\n\t\t//\tpDM_Odm->pAidMap =  (u1Byte *)pValue;\n\t\t//\tbreak;\n\n\t\t//case\tODM_CMNINFO_BT_COEXIST:\n\t\t//\tpDM_Odm->BTCoexist = (BOOLEAN *)pValue;\t\t\n\n\t\t//case\tODM_CMNINFO_STA_STATUS:\n\t\t\t//pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;\n\t\t\t//break;\n\n\t\t//case\tODM_CMNINFO_PHY_STATUS:\n\t\t//\tpDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;\n\t\t//\tbreak;\n\n\t\t//case\tODM_CMNINFO_MAC_STATUS:\n\t\t//\tpDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;\n\t\t//\tbreak;\n\t\t//To remove the compiler warning, must add an empty default statement to handle the other values.\t\t\t\t\n\t\tdefault:\n\t\t\t//do nothing\n\t\t\tbreak;\n\n\t}\n\n}\n\n\nVOID\nODM_CmnInfoPtrArrayHook(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tu2Byte\t\t\tIndex,\n\tIN\t\tPVOID\t\t\tpValue\t\n\t)\n{\n\t//\n\t// Hook call by reference pointer.\n\t//\n\tswitch\t(CmnInfo)\n\t{\n\t\t//\n\t\t// Dynamic call by reference pointer.\n\t\t//\t\t\n\t\tcase\tODM_CMNINFO_STA_STATUS:\n\t\t\tpDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;\n\t\t\t\n\t\t\tif (IS_STA_VALID(pDM_Odm->pODM_StaInfo[Index]))\n\t\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\t\tpDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->AssociatedMacId] = Index; /*AssociatedMacId are unique bttween different Adapter*/\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\t\tpDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->aid] = Index;\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\t\tpDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->mac_id] = Index;\n\t\t\t#endif\n\t\t\t\n\t\t\tbreak;\t\t\n\t\t//To remove the compiler warning, must add an empty default statement to handle the other values.\t\t\t\t\n\t\tdefault:\n\t\t\t//do nothing\n\t\t\tbreak;\n\t}\n\t\n}\n\n\n//\n// Update Band/CHannel/.. The values are dynamic but non-per-packet.\n//\nVOID\nODM_CmnInfoUpdate(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tu4Byte\t\t\tCmnInfo,\n\tIN\t\tu8Byte\t\t\tValue\t\n\t)\n{\n\t//\n\t// This init variable may be changed in run time.\n\t//\n\tswitch\t(CmnInfo)\n\t{\n\t\tcase ODM_CMNINFO_LINK_IN_PROGRESS:\n\t\t\tpDM_Odm->bLinkInProcess = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\t\n\t\tcase\tODM_CMNINFO_ABILITY:\n\t\t\tpDM_Odm->SupportAbility = (u4Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_RF_TYPE:\n\t\t\tpDM_Odm->RFType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_WIFI_DIRECT:\n\t\t\tpDM_Odm->bWIFI_Direct = (BOOLEAN)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_WIFI_DISPLAY:\n\t\t\tpDM_Odm->bWIFI_Display = (BOOLEAN)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_LINK:\n\t\t\tpDM_Odm->bLinked = (BOOLEAN)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_STATION_STATE:\n\t\t\tpDM_Odm->bsta_state = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\t\t\n\t\tcase\tODM_CMNINFO_RSSI_MIN:\n\t\t\tpDM_Odm->RSSI_Min= (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_DBG_COMP:\n\t\t\tpDM_Odm->DebugComponents = Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_DBG_LEVEL:\n\t\t\tpDM_Odm->DebugLevel = (u4Byte)Value;\n\t\t\tbreak;\n\t\tcase\tODM_CMNINFO_RA_THRESHOLD_HIGH:\n\t\t\tpDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_RA_THRESHOLD_LOW:\n\t\t\tpDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;\n\t\t\tbreak;\n#if defined(BT_30_SUPPORT) && (BT_30_SUPPORT == 1)\n\t\t// The following is for BT HS mode and BT coexist mechanism.\n\t\tcase ODM_CMNINFO_BT_ENABLED:\n\t\t\tpDM_Odm->bBtEnabled = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\t\t\n\t\tcase ODM_CMNINFO_BT_HS_CONNECT_PROCESS:\n\t\t\tpDM_Odm->bBtConnectProcess = (BOOLEAN)Value;\n\t\t\tbreak;\n\t\t\n\t\tcase ODM_CMNINFO_BT_HS_RSSI:\n\t\t\tpDM_Odm->btHsRssi = (u1Byte)Value;\n\t\t\tbreak;\n\t\t\t\n\t\tcase\tODM_CMNINFO_BT_OPERATION:\n\t\t\tpDM_Odm->bBtHsOperation = (BOOLEAN)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BT_LIMITED_DIG:\n\t\t\tpDM_Odm->bBtLimitedDig = (BOOLEAN)Value;\n\t\t\tbreak;\t\n\n\t\tcase ODM_CMNINFO_BT_DIG:\n\t\t\tpDM_Odm->btHsDigVal = (u1Byte)Value;\n\t\t\tbreak;\n\t\t\t\n\t\tcase\tODM_CMNINFO_BT_BUSY:\n\t\t\tpDM_Odm->bBtBusy = (BOOLEAN)Value;\n\t\t\tbreak;\t\n\n\t\tcase\tODM_CMNINFO_BT_DISABLE_EDCA:\n\t\t\tpDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value;\n\t\t\tbreak;\n#endif\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_AP)\t\t// for repeater mode add by YuChen 2014.06.23\n#ifdef UNIVERSAL_REPEATER\n\t\tcase\tODM_CMNINFO_VXD_LINK:\n\t\t\tpDM_Odm->VXD_bLinked= (BOOLEAN)Value;\n\t\t\tbreak;\n#endif\n#endif\n\n\t\tcase\tODM_CMNINFO_AP_TOTAL_NUM:\n\t\t\tpDM_Odm->APTotalNum = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_POWER_TRAINING:\n\t\t\tpDM_Odm->bDisablePowerTraining = (BOOLEAN)Value;\n\t\t\tbreak;\n\n/*\n\t\tcase\tODM_CMNINFO_OP_MODE:\n\t\t\tpDM_Odm->OPMode = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_WM_MODE:\n\t\t\tpDM_Odm->WirelessMode = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BAND:\n\t\t\tpDM_Odm->BandType = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_SEC_CHNL_OFFSET:\n\t\t\tpDM_Odm->SecChOffset = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_SEC_MODE:\n\t\t\tpDM_Odm->Security = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_BW:\n\t\t\tpDM_Odm->BandWidth = (u1Byte)Value;\n\t\t\tbreak;\n\n\t\tcase\tODM_CMNINFO_CHNL:\n\t\t\tpDM_Odm->Channel = (u1Byte)Value;\n\t\t\tbreak;\t\t\t\n*/\t\n                default:\n\t\t\t//do nothing\n\t\t\tbreak;\n\t}\n\n\t\n}\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nODM_InitAllWorkItems(IN PDM_ODM_T\tpDM_Odm )\n{\n\n\tPADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n#if USE_WORKITEM\n\t#if (RTL8723B_SUPPORT == 1) || (RTL8821A_SUPPORT == 1)\n\tODM_InitializeWorkItem(\tpDM_Odm, \n\t\t\t\t\t\t\t&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B, \n\t\t\t\t\t\t\t(RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback,\n\t\t\t\t\t\t\t(PVOID)pAdapter,\n\t\t\t\t\t\t\t\"AntennaSwitchWorkitem\");\n\t#endif\n\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tODM_InitializeWorkItem(pDM_Odm, \n\t\t\t\t\t\t&pDM_Odm->dm_sat_table.hl_smart_antenna_workitem, \n\t\t\t\t\t\t(RT_WORKITEM_CALL_BACK)phydm_beam_switch_workitem_callback,\n\t\t\t\t\t\t(PVOID)pAdapter,\n\t\t\t\t\t\t\"hl_smart_ant_workitem\");\n\n\tODM_InitializeWorkItem(pDM_Odm, \n\t\t\t\t\t\t&pDM_Odm->dm_sat_table.hl_smart_antenna_decision_workitem, \n\t\t\t\t\t\t(RT_WORKITEM_CALL_BACK)phydm_beam_decision_workitem_callback,\n\t\t\t\t\t\t(PVOID)pAdapter,\n\t\t\t\t\t\t\"hl_smart_ant_decision_workitem\");\n\t#endif\n\t\n\t#if ((RTL8192C_SUPPORT == 1) && (defined(CONFIG_SW_ANTENNA_DIVERSITY)))\t\n\tODM_InitializeWorkItem(\tpDM_Odm, \n\t\t\t\t\t\t\t&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem, \n\t\t\t\t\t\t\t(RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback,\n\t\t\t\t\t\t\t(PVOID)pAdapter,\n\t\t\t\t\t\t\t\"AntennaSwitchWorkitem\");\n\t#endif\t\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->PathDivSwitchWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"SWAS_WorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->CCKPathDiversityWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"CCKTXPathDiversityWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->MPT_DIGWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)odm_MPT_DIGWorkItemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"MPT_DIGWorkitem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->RaRptWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"RaRptWorkitem\");\n\n#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->FastAntTrainingWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"FastAntTrainingWorkitem\");\n#endif\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem), \n\t\t(RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback, \n\t\t(PVOID)pAdapter,\n\t\t\"PSDRXHP_WorkItem\");\n\n#endif /*#if USE_WORKITEM*/\n\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_EnterWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_EnterWorkItem\");\n\t\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_LeaveWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_LeaveWorkItem\");\n\t\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_FwNdpaWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_FwNdpaWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_ClkWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_ClkWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_RateWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_RateWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_StatusWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_StatusWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_ResetTxPathWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_ResetTxPathWorkItem\");\n\n\tODM_InitializeWorkItem(\n\t\tpDM_Odm,\n\t\t&(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_GetTxRateWorkItem),\n\t\t(RT_WORKITEM_CALL_BACK)halComTxbf_GetTxRateWorkItemCallback,\n\t\t(PVOID)pAdapter,\n\t\t\"Txbf_GetTxRateWorkItem\");\n#endif\n}\n\nVOID\nODM_FreeAllWorkItems(IN PDM_ODM_T\tpDM_Odm )\n{\n#if USE_WORKITEM\n#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n\tODM_FreeWorkItem(&(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B));\n#endif\n#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tODM_FreeWorkItem(&(pDM_Odm->dm_sat_table.hl_smart_antenna_workitem));\n\n\tODM_FreeWorkItem(&(pDM_Odm->dm_sat_table.hl_smart_antenna_decision_workitem));\n#endif\n\n#if ((RTL8192C_SUPPORT == 1) && (defined(CONFIG_SW_ANTENNA_DIVERSITY)))\n\tODM_FreeWorkItem(&(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem));\n#endif\n\tODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));      \n\tODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));\n#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))\n\tODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));\n#endif\n\tODM_FreeWorkItem(&(pDM_Odm->MPT_DIGWorkitem));\n\tODM_FreeWorkItem(&(pDM_Odm->RaRptWorkitem));\n\tODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));\n\t/*ODM_FreeWorkItem((&pDM_Odm->sbdcnt_workitem));*/\n#endif\n\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem));\n\tODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_GetTxRateWorkItem));\n#endif\n\n}\n#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\n\n/*\nVOID\nodm_FindMinimumRSSI(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tu4Byte\ti;\n\tu1Byte\tRSSI_Min = 0xFF;\n\n\tfor(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n//\t\tif(pDM_Odm->pODM_StaInfo[i] != NULL)\n\t\tif(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )\n\t\t{\n\t\t\tif(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)\n\t\t\t{\n\t\t\t\tRSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;\n\t\t\t}\n\t\t}\n\t}\n\n\tpDM_Odm->RSSI_Min = RSSI_Min;\n\n}\n\nVOID\nodm_IsLinked(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tu4Byte i;\n\tBOOLEAN Linked = FALSE;\n\t\n\tfor(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\t\tif(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )\n\t\t\t{\t\t\t\n\t\t\t\tLinked = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t}\n\n\tpDM_Odm->bLinked = Linked;\n}\n*/\n\nVOID\nODM_InitAllTimers(\n\tIN PDM_ODM_T\tpDM_Odm \n\t)\n{\n#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\tODM_AntDivTimers(pDM_Odm,INIT_ANTDIV_TIMMER);\n#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))\n\tODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,\n\t\t(RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, \"SwAntennaSwitchTimer\");\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n#ifdef MP_TEST\n\tif (pDM_Odm->priv->pshare->rf_ft_var.mp_specific) \n\t\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, \n\t\t\t(RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, \"MPT_DIGTimer\");\t\n#endif\n#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, \n\t\t(RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, \"MPT_DIGTimer\");\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer, \n\t\t(RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, \"PSDTimer\");\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer, \n\t\t(RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, \"PathDivTimer\");\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, \n\t\t(RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, \"CCKPathDiversityTimer\");\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,\n\t\t(RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, \"PSDRXHPTimer\"); \n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer,\n\t\t(RT_TIMER_CALL_BACK)phydm_sbd_callback, NULL, \"SbdTimer\"); \n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer,\n\t\t(RT_TIMER_CALL_BACK)halComTxbf_FwNdpaTimerCallback, NULL, \"Txbf_FwNdpaTimer\");\n#endif\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer,\n\t\t(RT_TIMER_CALL_BACK)Beamforming_SWTimerCallback, NULL, \"BeamformingTimer\");\n#endif\n#endif\n}\n\nVOID\nODM_CancelAllTimers(\n\tIN PDM_ODM_T\tpDM_Odm \n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t//\n\t// 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in \n\t// win7 platform.\n\t//\n\tHAL_ADAPTER_STS_CHK(pDM_Odm)\n#endif\t\n\n#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\tODM_AntDivTimers(pDM_Odm,CANCEL_ANTDIV_TIMMER);\n#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))\n\tODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n#ifdef MP_TEST\n\tif (pDM_Odm->priv->pshare->rf_ft_var.mp_specific)\n\t\tODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n#endif\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);\t\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer);\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer);\n#endif\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer);\n#endif\n#endif\n\n}\n\n\nVOID\nODM_ReleaseAllTimers(\n\tIN PDM_ODM_T\tpDM_Odm \n\t)\n{\n#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\tODM_AntDivTimers(pDM_Odm,RELEASE_ANTDIV_TIMMER);\n#elif(defined(CONFIG_SW_ANTENNA_DIVERSITY))\n\tODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n    #ifdef MP_TEST\n\tif (pDM_Odm->priv->pshare->rf_ft_var.mp_specific)\n\t\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n    #endif\n#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN)\nODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer);\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer);\n#endif\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n#if (BEAMFORMING_SUPPORT == 1)\n\tODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer);\n#endif\n#endif\n}\n\n\n//3============================================================\n//3 Tx Power Tracking\n//3============================================================\n\n\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\nVOID\nODM_InitAllThreads(\n\tIN PDM_ODM_T\tpDM_Odm \n\t)\n{\n\t#ifdef TPT_THREAD\n\tkTPT_task_init(pDM_Odm->priv);\n\t#endif\n}\n\nVOID\nODM_StopAllThreads(\n\tIN PDM_ODM_T\tpDM_Odm \n\t)\n{\n\t#ifdef TPT_THREAD\n\tkTPT_task_stop(pDM_Odm->priv);\n\t#endif\n}\n#endif\t\n\n\n#if( DM_ODM_SUPPORT_TYPE == ODM_WIN) \n//\n// 2011/07/26 MH Add an API for testing IQK fail case.\n//\nBOOLEAN\nODM_CheckPowerStatus(\n\tIN\tPADAPTER\t\tAdapter)\n{\n\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tRT_RF_POWER_STATE \trtState;\n\tPMGNT_INFO\t\t\tpMgntInfo\t= &(Adapter->MgntInfo);\n\n\t// 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.\n\tif (pMgntInfo->init_adpt_in_progress == TRUE)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ODM_CheckPowerStatus Return TRUE, due to initadapter\\n\"));\n\t\treturn\tTRUE;\n\t}\n\t\n\t//\n\t//\t2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.\n\t//\n\tAdapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));\t\n\tif(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\\n\", \n\t\tAdapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));\n\t\treturn\tFALSE;\n\t}\n\treturn\tTRUE;\n}\n#elif( DM_ODM_SUPPORT_TYPE == ODM_AP)\nBOOLEAN\nODM_CheckPowerStatus(\n\t\tIN\tPADAPTER\t\tAdapter)\n{\n\t/*\n\t   HAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t   PDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t   RT_RF_POWER_STATE \trtState;\n\t   PMGNT_INFO\t\t\tpMgntInfo\t= &(Adapter->MgntInfo);\n\n\t// 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.\n\tif (pMgntInfo->init_adpt_in_progress == TRUE)\n\t{\n\tODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, (\"ODM_CheckPowerStatus Return TRUE, due to initadapter\"));\n\treturn\tTRUE;\n\t}\n\n\t//\n\t//\t2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.\n\t//\n\tAdapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));\t\n\tif(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)\n\t{\n\tODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, (\"ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\\n\", \n\tAdapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));\n\treturn\tFALSE;\n\t}\n\t */\n\treturn\tTRUE;\n}\n#endif\n\n// need to ODM CE Platform\n//move to here for ANT detection mechanism using\n\n#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))\nu4Byte\nGetPSDData(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tunsigned int \tpoint,\n\tu1Byte initial_gain_psd)\n{\n\t//unsigned int\tval, rfval;\n\t//int\tpsd_report;\n\tu4Byte\tpsd_report;\n\t\n\t//HAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t//Debug Message\n\t//val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);\n\t//DbgPrint(\"Reg908 = 0x%x\\n\",val);\n\t//val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);\n\t//rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);\n\t//DbgPrint(\"RegDF4 = 0x%x, RFReg00 = 0x%x\\n\",val, rfval);\n\t//DbgPrint(\"PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\\n\",\n\t\t//(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);\n\n\t//Set DCO frequency index, offset=(40MHz/SamplePts)*point\n\tODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);\n\n\t//Start PSD calculation, Reg808[22]=0->1\n\tODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);\n\t//Need to wait for HW PSD report\n\tODM_StallExecution(1000);\n\tODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);\n\t//Read PSD report, Reg8B4[15:0]\n\tpsd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;\n\t\n#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))\n\tpsd_report = (u4Byte) (odm_ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);\n#else\n\tpsd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);\n#endif\n\n\treturn psd_report;\n\t\n}\n#endif\n\nu4Byte \nodm_ConvertTo_dB(\n\tu4Byte \tValue)\n{\n\tu1Byte i;\n\tu1Byte j;\n\tu4Byte dB;\n\n\tValue = Value & 0xFFFF;\n\n\tfor (i = 0; i < 12; i++)\n\t{\n\t\tif (Value <= dB_Invert_Table[i][7])\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i >= 12)\n\t{\n\t\treturn (96);\t// maximum 96 dB\n\t}\n\n\tfor (j = 0; j < 8; j++)\n\t{\n\t\tif (Value <= dB_Invert_Table[i][j])\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tdB = (i << 3) + j + 1;\n\n\treturn (dB);\n}\n\nu4Byte \nodm_ConvertTo_linear(\n\tu4Byte \tValue)\n{\n\tu1Byte i;\n\tu1Byte j;\n\tu4Byte linear;\n\t\n\t/* 1dB~96dB */\n\t\n\tValue = Value & 0xFF;\n\n\ti = (u1Byte)((Value - 1) >> 3);\n\tj = (u1Byte)(Value - 1) - (i << 3);\n\n\tlinear = dB_Invert_Table[i][j];\n\n\treturn (linear);\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nODM_UpdateInitRateWorkItemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tu1Byte\t\t\tp = 0;\t\n\n\tif(pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\tODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tfor (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)    //DOn't know how to include &c\n\t\t{\n\t\t\tODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);\n\t\t}\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\t\tODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tfor (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)    //DOn't know how to include &c\n\t\t{\n\t\t\tODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);\n\t\t}\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t\t\tODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n\t}\n}\n#endif\n\n//\n// ODM multi-port consideration, added by Roger, 2013.10.01.\n//\nVOID\nODM_AsocEntry_Init(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER pLoopAdapter = GetDefaultAdapter(pDM_Odm->Adapter);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pLoopAdapter);\n\tPDM_ODM_T\t\t pDM_OutSrc = &pHalData->DM_OutSrc;\n\tu1Byte\tTotalAssocEntryNum = 0;\n\tu1Byte\tindex = 0;\n\n\n\tODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, 0, &pLoopAdapter->MgntInfo.DefaultPort[0]);\n\tpLoopAdapter->MgntInfo.DefaultPort[0].MultiPortStationIdx = TotalAssocEntryNum;\n\t\t\n\tpLoopAdapter = GetNextExtAdapter(pLoopAdapter);\n\tTotalAssocEntryNum +=1;\n\n\twhile(pLoopAdapter)\n\t{\n\t\tfor (index = 0; index <ASSOCIATE_ENTRY_NUM; index++)\n\t\t{\n\t\t\tODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, TotalAssocEntryNum+index, &pLoopAdapter->MgntInfo.AsocEntry[index]);\n\t\t\tpLoopAdapter->MgntInfo.AsocEntry[index].MultiPortStationIdx = TotalAssocEntryNum+index;\t\t\t\t\n\t\t}\n\t\t\n\t\tTotalAssocEntryNum+= index;\n\t\tif(IS_HARDWARE_TYPE_8188E((pDM_Odm->Adapter)))\n\t\t\tpLoopAdapter->RASupport = TRUE;\n\t\tpLoopAdapter = GetNextExtAdapter(pLoopAdapter);\n\t}\n#endif\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n/* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */\nvoid odm_dtc(PDM_ODM_T pDM_Odm)\n{\n#ifdef CONFIG_DM_RESP_TXAGC\n\t#define DTC_BASE            35\t/* RSSI higher than this value, start to decade TX power */\n\t#define DTC_DWN_BASE       (DTC_BASE-5)\t/* RSSI lower than this value, start to increase TX power */\n\n\t/* RSSI vs TX power step mapping: decade TX power */\n\tstatic const u8 dtc_table_down[]={\n\t\tDTC_BASE,\n\t\t(DTC_BASE+5),\n\t\t(DTC_BASE+10),\n\t\t(DTC_BASE+15),\n\t\t(DTC_BASE+20),\n\t\t(DTC_BASE+25)\n\t};\n\n\t/* RSSI vs TX power step mapping: increase TX power */\n\tstatic const u8 dtc_table_up[]={\n\t\tDTC_DWN_BASE,\n\t\t(DTC_DWN_BASE-5),\n\t\t(DTC_DWN_BASE-10),\n\t\t(DTC_DWN_BASE-15),\n\t\t(DTC_DWN_BASE-15),\n\t\t(DTC_DWN_BASE-20),\n\t\t(DTC_DWN_BASE-20),\n\t\t(DTC_DWN_BASE-25),\n\t\t(DTC_DWN_BASE-25),\n\t\t(DTC_DWN_BASE-30),\n\t\t(DTC_DWN_BASE-35)\n\t};\n\n\tu8 i;\n\tu8 dtc_steps=0;\n\tu8 sign;\n\tu8 resp_txagc=0;\n\n\t#if 0\n\t/* As DIG is disabled, DTC is also disable */\n\tif(!(pDM_Odm->SupportAbility & ODM_XXXXXX))\n\t\treturn;\n\t#endif\n\n\tif (DTC_BASE < pDM_Odm->RSSI_Min) {\n\t\t/* need to decade the CTS TX power */\n\t\tsign = 1;\n\t\tfor (i=0;i<ARRAY_SIZE(dtc_table_down);i++)\n\t\t{\n\t\t\tif ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tdtc_steps++;\n\t\t}\n\t}\n#if 0\n\telse if (DTC_DWN_BASE > pDM_Odm->RSSI_Min)\n\t{\n\t\t/* needs to increase the CTS TX power */\n\t\tsign = 0;\n\t\tdtc_steps = 1;\n\t\tfor (i=0;i<ARRAY_SIZE(dtc_table_up);i++)\n\t\t{\n\t\t\tif ((dtc_table_up[i] <= pDM_Odm->RSSI_Min) || (dtc_steps>=10))\n\t\t\t\tbreak;\n\t\t\telse\n\t\t\t\tdtc_steps++;\n\t\t}\n\t}\n#endif\n\telse\n\t{\n\t\tsign = 0;\n\t\tdtc_steps = 0;\n\t}\n\n\tresp_txagc = dtc_steps | (sign << 4);\n\tresp_txagc = resp_txagc | (resp_txagc << 5);\n\tODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);\n\n\tDBG_871X(\"%s RSSI_Min:%u, set RESP_TXAGC to %s %u\\n\", \n\t\t__func__, pDM_Odm->RSSI_Min, sign?\"minus\":\"plus\", dtc_steps);\n#endif /* CONFIG_RESP_TXAGC_ADJUST */\n}\n\n#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */\n\nVOID\nodm_UpdatePowerTrainingState(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPFALSE_ALARM_STATISTICS \tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tu4Byte\t\t\t\t\t\tscore = 0;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN))\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState()============>\\n\"));\n\tpDM_Odm->bChangeState = FALSE;\n\n\t// Debug command\n\tif(pDM_Odm->ForcePowerTrainingState)\n\t{\n\t\tif(pDM_Odm->ForcePowerTrainingState == 1 && !pDM_Odm->bDisablePowerTraining)\n\t\t{\n\t\t\tpDM_Odm->bChangeState = TRUE;\n\t\t\tpDM_Odm->bDisablePowerTraining = TRUE;\n\t\t}\n\t\telse if(pDM_Odm->ForcePowerTrainingState == 2 && pDM_Odm->bDisablePowerTraining)\n\t\t{\n\t\t\tpDM_Odm->bChangeState = TRUE;\n\t\t\tpDM_Odm->bDisablePowerTraining = FALSE;\n\t\t}\n\n\t\tpDM_Odm->PT_score = 0;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): ForcePowerTrainingState = %d\\n\", \n\t\t\tpDM_Odm->ForcePowerTrainingState));\n\t\treturn;\n\t}\n\t\n\tif(!pDM_Odm->bLinked)\n\t\treturn;\n\t\n\t// First connect\n\tif((pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE))\n\t{\n\t\tpDM_Odm->PT_score = 0;\n\t\tpDM_Odm->bChangeState = TRUE;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): First Connect\\n\"));\n\t\treturn;\n\t}\n\n\t// Compute score\n\tif(pDM_Odm->NHM_cnt_0 >= 215)\n\t\tscore = 2;\n\telse if(pDM_Odm->NHM_cnt_0 >= 190) \n\t\tscore = 1;\t\t\t\t\t\t\t// unknow state\n\telse\n\t{\n\t\tu4Byte\tRX_Pkt_Cnt;\n\t\t\n\t\tRX_Pkt_Cnt = (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM) + (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK);\n\t\t\n\t\tif((FalseAlmCnt->Cnt_CCA_all > 31 && RX_Pkt_Cnt > 31) && (FalseAlmCnt->Cnt_CCA_all >= RX_Pkt_Cnt))\n\t\t{\n\t\t\tif((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 1)) <= FalseAlmCnt->Cnt_CCA_all)\n\t\t\t\tscore = 0;\n\t\t\telse if((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 2)) <= FalseAlmCnt->Cnt_CCA_all)\n\t\t\t\tscore = 1;\n\t\t\telse\n\t\t\t\tscore = 2;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): RX_Pkt_Cnt = %d, Cnt_CCA_all = %d\\n\", \n\t\t\tRX_Pkt_Cnt, FalseAlmCnt->Cnt_CCA_all));\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): NumQryPhyStatusOFDM = %d, NumQryPhyStatusCCK = %d\\n\",\n\t\t\t(u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM), (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK)));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): NHM_cnt_0 = %d, score = %d\\n\", \n\t\tpDM_Odm->NHM_cnt_0, score));\n\n\t// smoothing\n\tpDM_Odm->PT_score = (score << 4) + (pDM_Odm->PT_score>>1) + (pDM_Odm->PT_score>>2);\n\tscore = (pDM_Odm->PT_score + 32) >> 6;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): PT_score = %d, score after smoothing = %d\\n\", \n\t\tpDM_Odm->PT_score, score));\n\n\t// Mode decision\n\tif(score == 2)\n\t{\n\t\tif(pDM_Odm->bDisablePowerTraining)\n\t\t{\n\t\t\tpDM_Odm->bChangeState = TRUE;\n\t\t\tpDM_Odm->bDisablePowerTraining = FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): Change state\\n\"));\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): Enable Power Training\\n\"));\n\t}\n\telse if(score == 0)\n\t{\n\t\tif(!pDM_Odm->bDisablePowerTraining)\n\t\t{\n\t\t\tpDM_Odm->bChangeState = TRUE;\n\t\t\tpDM_Odm->bDisablePowerTraining = TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): Change state\\n\"));\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,(\"odm_UpdatePowerTrainingState(): Disable Power Training\\n\"));\n\t}\n\n\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\n\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\n#endif\n}\n\n\n\n/*===========================================================*/\n/* The following is for compile only*/\n/*===========================================================*/\n/*#define TARGET_CHNL_NUM_2G_5G\t59*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nu1Byte GetRightChnlPlaceforIQK(u1Byte chnl)\n{\n\tu1Byte\tchannel_all[TARGET_CHNL_NUM_2G_5G] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, \n\t\t102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 149, 151, 153, 155, 157, 159, 161, 163, 165};\n\tu1Byte\tplace = chnl;\n\n\t\n\tif (chnl > 14) {\n\t\tfor (place = 14; place < sizeof(channel_all); place++) {\n\t\t\tif (channel_all[place] == chnl)\n\t\t\t\treturn place-13;\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\nVOID\nFillH2CCmd92C(\t\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\tElementID,\n\tIN\tu4Byte\tCmdLen,\n\tIN\tpu1Byte\tpCmdBuffer\n)\n{}\nVOID\nPHY_SetTxPowerLevel8192C(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\t\t\tchannel\n\t)\n{\n}\n#endif\n/*===========================================================*/\n\nVOID\nphydm_NoisyDetection(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t)\n{\n\tu4Byte  Total_FA_Cnt, Total_CCA_Cnt;\n\tu4Byte  Score = 0, i, Score_Smooth;\n    \n\tTotal_CCA_Cnt = pDM_Odm->FalseAlmCnt.Cnt_CCA_all;\n\tTotal_FA_Cnt  = pDM_Odm->FalseAlmCnt.Cnt_all;    \n\n/*\n    if( Total_FA_Cnt*16>=Total_CCA_Cnt*14 )         // 87.5\n    \n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*12 )    // 75\n    \n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*10 )    // 56.25\n    \n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*8 )     // 50\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*7 )     // 43.75\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*6 )     // 37.5\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*5 )     // 31.25%\n        \n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*4 )     // 25%\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*3 )     // 18.75%\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*2 )     // 12.5%\n\n    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*1 )     // 6.25%\n*/\n    for(i=0;i<=16;i++)\n    {\n        if( Total_FA_Cnt*16>=Total_CCA_Cnt*(16-i) )\n        {\n            Score = 16-i;\n            break;\n        }\n    }\n\n    // NoisyDecision_Smooth = NoisyDecision_Smooth>>1 + (Score<<3)>>1;\n    pDM_Odm->NoisyDecision_Smooth = (pDM_Odm->NoisyDecision_Smooth>>1) + (Score<<2);\n\n    // Round the NoisyDecision_Smooth: +\"3\" comes from (2^3)/2-1\n    Score_Smooth = (Total_CCA_Cnt>=300)?((pDM_Odm->NoisyDecision_Smooth+3)>>3):0;\n\n    pDM_Odm->NoisyDecision = (Score_Smooth>=3)?1:0;\n/*\n    switch(Score_Smooth)\n    {\n        case 0:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=0%%\\n\"));\n            break;\n        case 1:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=6.25%%\\n\"));\n            break;\n        case 2:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=12.5%%\\n\"));\n            break;\n        case 3:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=18.75%%\\n\"));\n            break;\n        case 4:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=25%%\\n\"));\n            break;\n        case 5:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=31.25%%\\n\"));\n            break;\n        case 6:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=37.5%%\\n\"));\n            break;\n        case 7:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=43.75%%\\n\"));\n            break;\n        case 8:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=50%%\\n\"));\n            break;\n        case 9:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=56.25%%\\n\"));\n            break;\n        case 10:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=62.5%%\\n\"));\n            break;\n        case 11:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=68.75%%\\n\"));\n            break;\n        case 12:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=75%%\\n\"));\n            break;\n        case 13:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=81.25%%\\n\"));\n            break;\n        case 14:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=87.5%%\\n\"));\n            break;\n        case 15:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=93.75%%\\n\"));            \n            break;\n        case 16:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=100%%\\n\"));\n            break;\n        default:\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"[NoisyDetection] Unknown Value!! Need Check!!\\n\"));            \n    }\n*/        \n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD,\n\t(\"[NoisyDetection] Total_CCA_Cnt=%d, Total_FA_Cnt=%d, NoisyDecision_Smooth=%d, Score=%d, Score_Smooth=%d, pDM_Odm->NoisyDecision=%d\\n\",\n\tTotal_CCA_Cnt, Total_FA_Cnt, pDM_Odm->NoisyDecision_Smooth, Score, Score_Smooth, pDM_Odm->NoisyDecision));\n\t\n}\n\nVOID\nphydm_set_nbi_reg(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tchannel,\n\tIN\t\tu4Byte\t\ttone_idx_tmp,\n\tIN\t\tu4Byte\t\tbw\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\tnbi_table_128[NBI_TABLE_SIZE_128] = {25, 55, 85, 115, 135, 155, 185, 205, 225, 245,\t\t/*1~10*/\t\t/*tone_idx X 10*/\n\t\t\t\t\t\t\t\t\t\t\t\t265, 285, 305, 335, 355, 375, 395, 415, 435, 455,\t/*11~20*/\n\t\t\t\t\t\t\t\t\t\t\t\t485, 505, 525, 555, 585, 615, 635};\t\t\t\t/*21~27*/\n\t\n\tu4Byte\tnbi_table_256[NBI_TABLE_SIZE_256] = { 25,   55,   85, 115, 135, 155, 175, 195, 225, 245,\t/*1~10*/\n\t\t\t\t\t\t\t\t\t\t\t\t265, 285, 305, 325, 345, 365, 385, 405, 425, 445,\t/*11~20*/\n\t\t\t\t\t\t\t\t\t\t\t\t465, 485, 505, 525, 545, 565, 585, 605, 625, 645,\t/*21~30*/\n\t\t\t\t\t\t\t\t\t\t\t\t665, 695, 715, 735, 755, 775, 795, 815, 835, 855,\t/*31~40*/\n\t\t\t\t\t\t\t\t\t\t\t\t875, 895, 915, 935, 955, 975, 995, 1015, 1035, 1055,\t/*41~50*/\n\t\t\t\t\t\t\t\t\t\t\t\t1085, 1105, 1125, 1145, 1175, 1195, 1225, 1255, 1275};\t/*51~59*/\n\n\tu4Byte\treg_idx = 0;\n\tu4Byte\ti;\n\tu1Byte\tnbi_table_idx = NBI_128_FFT_TYPE;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\t\n\t\tnbi_table_idx = NBI_128_FFT_TYPE;\n\t} else if (pDM_Odm->SupportICType & ODM_IC_11AC_1_SERIES) {\n\t\n\t\tnbi_table_idx = NBI_256_FFT_TYPE;\n\t} else if (pDM_Odm->SupportICType & ODM_IC_11AC_2_SERIES) {\n\t\n\t\tif (bw == 80)\n\t\t\tnbi_table_idx = NBI_256_FFT_TYPE;\n\t\telse /*20M, 40M*/\n\t\t\tnbi_table_idx = NBI_128_FFT_TYPE;\n\t}\n\n\tif (nbi_table_idx == NBI_128_FFT_TYPE) {\n\t\t\n\t\tfor (i = 0; i < NBI_TABLE_SIZE_128; i++) {\n\t\t\tif (tone_idx_tmp < nbi_table_128[i]) {\n\t\t\t\treg_idx = i+1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t} else if (nbi_table_idx == NBI_256_FFT_TYPE) {\n\n\t\tfor (i = 0; i < NBI_TABLE_SIZE_256; i++) {\n\t\t\tif (tone_idx_tmp < nbi_table_256[i]) {\n\t\t\t\treg_idx = i+1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\t\n\t}\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, 0xc40, 0x1f000000, reg_idx);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Set tone idx:  Reg0xC40[28:24] = ((0x%x))\\n\", reg_idx));\n\t\t/**/\n\t} else {\n\t\tODM_SetBBReg(pDM_Odm, 0x87c, 0xfc000, reg_idx);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Set tone idx: Reg0x87C[19:14] = ((0x%x))\\n\", reg_idx));\n\t\t/**/\n\t}\n}\n\n\nVOID\nphydm_nbi_enable(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tenable\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\treg_value = 0;\n\n\tif (enable == NBI_ENABLE)\n\t\treg_value = 1;\n\telse if (enable == NBI_DISABLE)\n\t\treg_value = 0;\n\t\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\n\t\tODM_SetBBReg(pDM_Odm, 0xc40, BIT9, reg_value);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Enable NBI Reg0xC40[9] = ((0x%x))\\n\", reg_value));\n\t\t\n\t} else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\n\t\tODM_SetBBReg(pDM_Odm, 0x87c, BIT13, reg_value);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Enable NBI Reg0x87C[13] = ((0x%x))\\n\", reg_value));\n\t}\n}\n\nu1Byte\nphydm_nbi_setting(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tenable,\n\tIN\t\tu4Byte\t\tchannel,\n\tIN\t\tu4Byte\t\tbw,\n\tIN\t\tu4Byte\t\tf_interference,\n\tIN\t\tu4Byte\t\tSecond_ch\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\tfc, fc_offset;\t\n\tu4Byte\t\tbw_up, bw_low;\t\n\tu4Byte\t\tint_distance;\n\tu4Byte\t\ttone_idx_tmp;\n\tu4Byte\t\ti;\n\tu4Byte\t\tstart_ch_per_40m[NUM_START_CH_40M] = {36, 44, 52, 60, 100, 108, 116, 124, 132, 140, 149, 157, 165, 173};\n\tu4Byte\t\tstart_ch_per_80m[NUM_START_CH_80M] = {36, 52, 100, 116, 132, 149, 165}; \n\tpu4Byte\t\tp_start_ch = &(start_ch_per_40m[0]);\n\tu4Byte\t\tnum_start_channel = NUM_START_CH_40M;\n\tu4Byte\t\tchannel_offset = 0;\n\t\n\n\tphydm_nbi_enable(pDM_Odm, enable);\n\n\tif (enable == NBI_DISABLE) {\n\t\t\n\t\treturn\tNBI_SET_SUCCESS;\n\t\t/**/\n\t}\n\n\n\t\t\n\t/*2.4G*/\n\tif (channel <= 14 && channel > 0) {\n\n\t\tif (bw == 80) {\n\t\t\tphydm_nbi_enable(pDM_Odm, NBI_DISABLE);\n\t\t\treturn\tNBI_SET_ERROR;\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\\n\", \n\t\tchannel, bw, f_interference, ((bw == 20) ? \"Don't care\" : (Second_ch == PHYDM_ABOVE) ? \"H\" : \"L\")));\n\t\t\n\t\tfc = 2412 + (channel - 1)*5;\n\n\t\tif (bw == 40 && (Second_ch == PHYDM_ABOVE)) {\n\t\t\t\n\t\t\tif (channel >= 10) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"CH = ((%d)), Scnd_CH = ((%d)) Error Setting\\n\", channel, Second_ch));\n\t\t\t\tphydm_nbi_enable(pDM_Odm, NBI_DISABLE);\n\t\t\t\treturn\tNBI_SET_ERROR;\n\t\t\t}\n\t\t\tfc += 10;\n\t\t} else if (bw == 40 && (Second_ch == PHYDM_BELOW)) {\n\t\t\n\t\t\tif (channel <= 2) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"CH = ((%d)), Scnd_CH = ((%d)) Error Setting\\n\", channel, Second_ch));\n\t\t\t\tphydm_nbi_enable(pDM_Odm, NBI_DISABLE);\n\t\t\t\treturn\tNBI_SET_ERROR;\n\t\t\t}\n\t\t\tfc -= 10;\n\t\t}\n\t}\n\t/*5G*/\n\telse if (channel >= 36 && channel <= 177) {\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d))\\n\", \n\t\tchannel, bw, f_interference));\n\n\t\tif (bw != 20) {\n\t\t\t\n\t\t\tif (bw == 40) {\n\t\t\t\tnum_start_channel = NUM_START_CH_40M;\n\t\t\t\tp_start_ch = &(start_ch_per_40m[0]);\n\t\t\t\tchannel_offset = CH_OFFSET_40M;\n\t\t\t} else if (bw == 80) {\n\t\t\t\tnum_start_channel = NUM_START_CH_80M;\n\t\t\t\tp_start_ch = &(start_ch_per_80m[0]);\n\t\t\t\tchannel_offset = CH_OFFSET_80M;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < num_start_channel; i++) {\n\t\t\t\t\n\t\t\t\tif (channel < p_start_ch[i+1]) {\n\t\t\t\t\tchannel = p_start_ch[i] + channel_offset;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Mod_CH = ((%d))\\n\", channel));\n\t\t}\n\t\t\n\t\tfc = 5180 + (channel-36)*5;\n\t\t\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"CH = ((%d)) Error Setting\\n\", channel));\n\t\tphydm_nbi_enable(pDM_Odm, NBI_DISABLE);\n\t\treturn\tNBI_SET_ERROR;\n\t}\n\n\tbw_up = fc + bw/2;\n\tbw_low = fc - bw/2;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\\n\", bw_low, fc, bw_up, f_interference));\n\n\tif ((f_interference >= bw_low) && (f_interference <= bw_up)) {\n\n\t\tint_distance = (fc >= f_interference) ? (fc - f_interference) : (f_interference - fc);\n\t\ttone_idx_tmp = (int_distance<<5);  /* =10*(int_distance /0.3125) */\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"int_distance = ((%d MHz)) Mhz, tone_idx_tmp = ((%d.%d))\\n\", int_distance, (tone_idx_tmp/10), (tone_idx_tmp%10)));\n\t\tphydm_set_nbi_reg(pDM_Odm, channel, tone_idx_tmp, bw);\n\t\treturn\tNBI_SET_SUCCESS;\n\n\t} else {\n\t\tphydm_nbi_enable(pDM_Odm, NBI_DISABLE);\n\t\treturn\tNBI_SET_NO_NEED;\n\t}\n}\n\nVOID\nphydm_nbi_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tused = *_used;\n\tu4Byte\t\t\tout_len = *_out_len;\n\tu4Byte\t\t\tchannel =  dm_value[1];\n\tu4Byte\t\t\tbw =  dm_value[2];\n\tu4Byte\t\t\tf_interference =  dm_value[3];\n\tu4Byte\t\t\tSecond_ch =  dm_value[4];\n\tu1Byte\t\t\tset_result = 0;\n\n\tif (dm_value[0] == 100) {\n\t\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"[HELP]  EN(on=1, off=2)   CH   BW(20/40/80)  f_intf(Mhz)    Scnd_CH(L=1, H=2)\\n\"));\n\t\treturn;\n\t\t\n\t} else if (dm_value[0] == NBI_ENABLE) {\n\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"[Enable NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\\n\", channel, bw, f_interference, (channel > 14)?\"Don't care\":((Second_ch == PHYDM_ABOVE) ? \"H\" : \"L\")));\n\t\tset_result = phydm_nbi_setting(pDM_Odm,\tNBI_ENABLE, channel, bw, f_interference, Second_ch);\n\t\t\n\t} else if (dm_value[0] == NBI_DISABLE) {\n\t\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"[Disable NBI]\\n\"));\n\t\tset_result = phydm_nbi_setting(pDM_Odm, NBI_DISABLE, channel, bw, f_interference, Second_ch);\n\t\t\n\t} else {\n\t\n\t\tset_result = NBI_SET_ERROR;\n\t}\n\tPHYDM_SNPRINTF((output+used, out_len-used, \"[NBI set result: %s]\\n\", (set_result == NBI_SET_SUCCESS) ? \"Success\" : ((set_result == NBI_SET_NO_NEED) ? \"No need\" : \"Error\")));\n}\n\n\n"
  },
  {
    "path": "hal/phydm/phydm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__HALDMOUTSRC_H__\n#define __HALDMOUTSRC_H__\n\n//============================================================\n// include files\n//============================================================\n#include \"phydm_pre_define.h\"\n#include \"phydm_dig.h\"\n#include \"phydm_edcaturbocheck.h\"\n#include \"phydm_pathdiv.h\"\n#include \"phydm_antdiv.h\"\n#include \"phydm_antdect.h\"\n#include \"phydm_dynamicbbpowersaving.h\"\n#include \"phydm_rainfo.h\"\n#include \"phydm_dynamictxpower.h\"\n#include \"phydm_cfotracking.h\"\n#include \"phydm_acs.h\"\n#include \"phydm_adaptivity.h\"\n\n\n#if (RTL8814A_SUPPORT == 1)\n#include \"rtl8814a/phydm_iqk_8814a.h\"\n#endif\n\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n#include \"halphyrf_ap.h\"\n#include \"phydm_powertracking_ap.h\"\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n#include \"phydm_beamforming.h\"\n#include \"phydm_noisemonitor.h\"\n#include \"halphyrf_ce.h\"\n#include \"phydm_powertracking_ce.h\"\n#endif\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n#include \"phydm_beamforming.h\"\n#include \"phydm_rxhp.h\"\n#include \"halphyrf_win.h\"\n#include \"phydm_powertracking_win.h\"\n#endif\n\n//============================================================\n// Definition \n//============================================================\n//\n// 2011/09/22 MH Define all team supprt ability.\n//\n\n//\n// 2011/09/22 MH Define for all teams. Please Define the constan in your precomp header.\n//\n//#define\t\tDM_ODM_SUPPORT_AP\t\t\t0\n//#define\t\tDM_ODM_SUPPORT_ADSL\t\t\t0\n//#define\t\tDM_ODM_SUPPORT_CE\t\t\t0\n//#define\t\tDM_ODM_SUPPORT_MP\t\t\t1\n\n//\n// 2011/09/28 MH Define ODM SW team support flag.\n//\n\n//For SW AntDiv, PathDiv, 8192C AntDiv joint use\n#define\tTP_MODE\t\t0\n#define\tRSSI_MODE\t\t1\n\n#define\tTRAFFIC_LOW\t0\n#define\tTRAFFIC_HIGH\t1\n#define\tTRAFFIC_ULTRA_LOW\t2\n\n#define\tNONE\t\t\t0\n\n/*NBI API------------------------------------*/\n#define\tNBI_ENABLE 1\n#define\tNBI_DISABLE 2\n\n#define\tNBI_TABLE_SIZE_128\t27\n#define\tNBI_TABLE_SIZE_256\t59\n\n#define\tNUM_START_CH_80M\t7\n#define\tNUM_START_CH_40M\t14\n\n#define\tCH_OFFSET_40M\t\t2\n#define\tCH_OFFSET_80M\t\t6\n\n#define\tNBI_128_FFT_TYPE\t1\n#define\tNBI_256_FFT_TYPE\t2\n\n#define\tNBI_SET_SUCCESS\t1\n#define\tNBI_SET_ERROR\t\t2\n#define\tNBI_SET_NO_NEED\t3\n\n\n\n//============================================================\n// structure and define\n//============================================================\n\n//\n// 2011/09/20 MH Add for AP/ADSLpseudo DM structuer requirement.\n// We need to remove to other position???\n//\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\ntypedef\t\tstruct rtl8192cd_priv {\n\tu1Byte\t\ttemp;\n\n}rtl8192cd_priv, *prtl8192cd_priv;\n#endif\n\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\ntypedef\t\tstruct _ADAPTER{\n\tu1Byte\t\ttemp;\n\t#ifdef AP_BUILD_WORKAROUND\n\tHAL_DATA_TYPE*\t\ttemp2;\n\tprtl8192cd_priv\t\tpriv;\n\t#endif\n}ADAPTER, *PADAPTER;\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\ntypedef\t\tstruct _WLAN_STA{\n\tu1Byte\t\ttemp;\n} WLAN_STA, *PRT_WLAN_STA;\n\n#endif\n\ntypedef struct _Dynamic_Primary_CCA{\n\tu1Byte\t\tPriCCA_flag;\n\tu1Byte\t\tintf_flag;\n\tu1Byte\t\tintf_type;  \n\tu1Byte\t\tDupRTS_flag;\n\tu1Byte\t\tMonitor_flag;\n\tu1Byte\t\tCH_offset;\n\tu1Byte  \tMF_state;\n}Pri_CCA_T, *pPri_CCA_T;\n\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\n\n#ifdef ADSL_AP_BUILD_WORKAROUND\n#define MAX_TOLERANCE\t\t\t5\n#define IQK_DELAY_TIME\t\t\t1\t\t//ms\n#endif\n#if 0//defined in 8192cd.h\n//\n// Indicate different AP vendor for IOT issue.\n//\ntypedef enum _HT_IOT_PEER\n{\n\tHT_IOT_PEER_UNKNOWN \t\t\t= 0,\n\tHT_IOT_PEER_REALTEK \t\t\t= 1,\n\tHT_IOT_PEER_REALTEK_92SE \t\t= 2,\n\tHT_IOT_PEER_BROADCOM \t\t= 3,\n\tHT_IOT_PEER_RALINK \t\t\t= 4,\n\tHT_IOT_PEER_ATHEROS \t\t\t= 5,\n\tHT_IOT_PEER_CISCO \t\t\t\t= 6,\n\tHT_IOT_PEER_MERU \t\t\t\t= 7,\t\n\tHT_IOT_PEER_MARVELL \t\t\t= 8,\n\tHT_IOT_PEER_REALTEK_SOFTAP \t= 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17\n\tHT_IOT_PEER_SELF_SOFTAP \t\t= 10, // Self is SoftAP\n\tHT_IOT_PEER_AIRGO \t\t\t\t= 11,\n\tHT_IOT_PEER_INTEL \t\t\t\t= 12, \n\tHT_IOT_PEER_RTK_APCLIENT \t\t= 13, \n\tHT_IOT_PEER_REALTEK_81XX \t\t= 14,\t\n\tHT_IOT_PEER_REALTEK_WOW \t\t= 15,\t\n\tHT_IOT_PEER_MAX \t\t\t\t= 16\n}HT_IOT_PEER_E, *PHTIOT_PEER_E;\n#endif\n#endif//#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\n#define\t\tDM_Type_ByFW\t\t\t0\n#define\t\tDM_Type_ByDriver\t\t1\n\n//\n// Declare for common info\n//\n\n#define IQK_THRESHOLD\t\t\t8\n#define DPK_THRESHOLD\t\t\t4\n\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_AP))\n__PACK typedef struct _ODM_Phy_Status_Info_\n{\n\tu1Byte\t\tRxPWDBAll;\n\tu1Byte\t\tSignalQuality;\t\t\t\t\t/* in 0-100 index. */\n\tu1Byte\t\tRxMIMOSignalStrength[4];\t\t/* in 0~100 index */\n\ts1Byte\t\tRxMIMOSignalQuality[4];\t\t/* EVM */\n\ts1Byte\t\tRxSNR[4];\t\t\t\t\t/* per-path's SNR */\n#if (RTL8822B_SUPPORT == 1)\n\tu1Byte\t\tRxCount;\t\t\t\t\t\t/* RX path counter---*/\n#endif\n\tu1Byte\t\tBandWidth;\n\n} __WLAN_ATTRIB_PACK__ ODM_PHY_INFO_T, *PODM_PHY_INFO_T;\n\ntypedef struct _ODM_Phy_Status_Info_Append_\n{\n\tu1Byte\t\tMAC_CRC32;\t\n\n}ODM_PHY_INFO_Append_T,*PODM_PHY_INFO_Append_T;\n\n#else\n\ntypedef struct _ODM_Phy_Status_Info_\n{\n\t//\n\t// Be care, if you want to add any element please insert between \n\t// RxPWDBAll & SignalStrength.\n\t//\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN))\n\tu4Byte\t\tRxPWDBAll;\t\n#else\n\tu1Byte\t\tRxPWDBAll;\t\n#endif\n\tu1Byte\t\tSignalQuality;\t\t\t\t/* in 0-100 index. */\n\ts1Byte\t\tRxMIMOSignalQuality[4];\t\t/* per-path's EVM */\n\tu1Byte\t\tRxMIMOEVMdbm[4];\t\t\t/* per-path's EVM dbm */\n\tu1Byte\t\tRxMIMOSignalStrength[4];\t/* in 0~100 index */\n\ts2Byte\t\tCfo_short[4];\t\t\t\t/* per-path's Cfo_short */\n\ts2Byte\t\tCfo_tail[4];\t\t\t\t\t/* per-path's Cfo_tail */\n\ts1Byte\t\tRxPower;\t\t\t\t\t/* in dBm Translate from PWdB */\n\ts1Byte\t\tRecvSignalPower;\t\t\t/* Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. */\n\tu1Byte\t\tBTRxRSSIPercentage;\n\tu1Byte\t\tSignalStrength;\t\t\t\t/* in 0-100 index. */\n\ts1Byte\t\tRxPwr[4];\t\t\t\t\t/* per-path's pwdb */\n\ts1Byte\t\tRxSNR[4];\t\t\t\t\t/* per-path's SNR\t*/\n#if (RTL8822B_SUPPORT == 1)\n\tu1Byte\t\tRxCount:2;\t\t\t\t\t/* RX path counter---*/\n\tu1Byte\t\tBandWidth:2;\n\tu1Byte\t\trxsc:4;\t\t\t\t\t\t/* sub-channel---*/\n#else\n\tu1Byte\t\tBandWidth;\n#endif\n\tu1Byte\t\tbtCoexPwrAdjust;\n#if (RTL8822B_SUPPORT == 1)\n\tu1Byte\t\tchannel;\t\t\t\t\t\t/* channel number---*/\n\tBOOLEAN\t\tbMuPacket;\t\t\t\t\t/* is MU packet or not---*/\n\tBOOLEAN\t\tbBeamformed;\t\t\t\t/* BF packet---*/\n#endif\n}ODM_PHY_INFO_T,*PODM_PHY_INFO_T;\n#endif\n\ntypedef struct _ODM_Per_Pkt_Info_\n{\n\t//u1Byte\t\tRate;\t\n\tu1Byte\t\tDataRate;\n\tu1Byte\t\tStationID;\n\tBOOLEAN\t\tbPacketMatchBSSID;\n\tBOOLEAN\t\tbPacketToSelf;\n\tBOOLEAN\t\tbPacketBeacon;\n\tBOOLEAN\t\tbToSelf;\n}ODM_PACKET_INFO_T,*PODM_PACKET_INFO_T;\n\n\ntypedef struct _ODM_Phy_Dbg_Info_\n{\n\t//ODM Write,debug info\n\ts1Byte\t\tRxSNRdB[4];\n\tu4Byte\t\tNumQryPhyStatus;\n\tu4Byte\t\tNumQryPhyStatusCCK;\n\tu4Byte\t\tNumQryPhyStatusOFDM;\n#if (RTL8822B_SUPPORT == 1)\n\tu4Byte\t\tNumQryMuPkt;\n\tu4Byte\t\tNumQryBfPkt;\n#endif\n\tu1Byte\t\tNumQryBeaconPkt;\n\t//Others\n\ts4Byte\t\tRxEVM[4];\t\n\t\n}ODM_PHY_DBG_INFO_T;\n\n\ntypedef struct _ODM_Mac_Status_Info_\n{\n\tu1Byte\ttest;\n\t\n}ODM_MAC_INFO;\n\n//\n// 2011/20/20 MH For MP driver RT_WLAN_STA =  STA_INFO_T\n// Please declare below ODM relative info in your STA info structure.\n//\n#if 1\ntypedef\t\tstruct _ODM_STA_INFO{\n\t// Driver Write\n\tBOOLEAN\t\tbUsed;\t\t\t\t// record the sta status link or not?\n\t//u1Byte\t\tWirelessMode;\t\t// \n\tu1Byte\t\tIOTPeer;\t\t\t// Enum value.\tHT_IOT_PEER_E\n\n\t// ODM Write\n\t//1 PHY_STATUS_INFO\n\tu1Byte\t\tRSSI_Path[4];\t\t// \n\tu1Byte\t\tRSSI_Ave;\n\tu1Byte\t\tRXEVM[4];\n\tu1Byte\t\tRXSNR[4];\n\n\t// ODM Write\n\t//1 TX_INFO (may changed by IC)\n\t//TX_INFO_T\t\tpTxInfo;\t\t\t\t// Define in IC folder. Move lower layer.\n#if 0\n\tu1Byte\t\tANTSEL_A;\t\t\t//in Jagar: 4bit; others: 2bit\n\tu1Byte\t\tANTSEL_B;\t\t\t//in Jagar: 4bit; others: 2bit\n\tu1Byte\t\tANTSEL_C;\t\t\t//only in Jagar: 4bit\n\tu1Byte\t\tANTSEL_D;\t\t\t//only in Jagar: 4bit\n\tu1Byte\t\tTX_ANTL;\t\t\t//not in Jagar: 2bit\n\tu1Byte\t\tTX_ANT_HT;\t\t\t//not in Jagar: 2bit\n\tu1Byte\t\tTX_ANT_CCK;\t\t\t//not in Jagar: 2bit\n\tu1Byte\t\tTXAGC_A;\t\t\t//not in Jagar: 4bit\n\tu1Byte\t\tTXAGC_B;\t\t\t//not in Jagar: 4bit\n\tu1Byte\t\tTXPWR_OFFSET;\t\t//only in Jagar: 3bit\n\tu1Byte\t\tTX_ANT;\t\t\t\t//only in Jagar: 4bit for TX_ANTL/TX_ANTHT/TX_ANT_CCK\n#endif\n\n\t//\n\t// \tPlease use compile flag to disabe the strcutrue for other IC except 88E.\n\t//\tMove To lower layer.\n\t//\n\t// ODM Write Wilson will handle this part(said by Luke.Lee)\n\t//TX_RPT_T\t\tpTxRpt;\t\t\t\t// Define in IC folder. Move lower layer.\n#if 0\t\n\t//1 For 88E RA (don't redefine the naming)\n\tu1Byte\t\trate_id;\n\tu1Byte\t\trate_SGI;\n\tu1Byte\t\trssi_sta_ra;\n\tu1Byte\t\tSGI_enable;\n\tu1Byte\t\tDecision_rate;\n\tu1Byte\t\tPre_rate;\n\tu1Byte\t\tActive;\n\n\t// Driver write Wilson handle.\n\t//1 TX_RPT (don't redefine the naming)\n\tu2Byte\t\tRTY[4];\t\t\t\t// ???\n\tu2Byte\t\tTOTAL;\t\t\t\t// ???\n\tu2Byte\t\tDROP;\t\t\t\t// ???\n\t//\n\t// Please use compile flag to disabe the strcutrue for other IC except 88E.\n\t//\n#endif\n\n}ODM_STA_INFO_T, *PODM_STA_INFO_T;\n#endif\n\n//\n// 2011/10/20 MH Define Common info enum for all team.\n//\ntypedef enum _ODM_Common_Info_Definition\n{\n//-------------REMOVED CASE-----------//\n\t//ODM_CMNINFO_CCK_HP,\n\t//ODM_CMNINFO_RFPATH_ENABLE,\t\t// Define as ODM write???\t\n\t//ODM_CMNINFO_BT_COEXIST,\t\t\t\t// ODM_BT_COEXIST_E\n\t//ODM_CMNINFO_OP_MODE,\t\t\t\t// ODM_OPERATION_MODE_E\n//-------------REMOVED CASE-----------//\n\n\t//\n\t// Fixed value:\n\t//\n\n\t//-----------HOOK BEFORE REG INIT-----------//\n\tODM_CMNINFO_PLATFORM = 0,\n\tODM_CMNINFO_ABILITY,\t\t\t\t\t// ODM_ABILITY_E\n\tODM_CMNINFO_INTERFACE,\t\t\t\t// ODM_INTERFACE_E\n\tODM_CMNINFO_MP_TEST_CHIP,\n\tODM_CMNINFO_IC_TYPE,\t\t\t\t\t// ODM_IC_TYPE_E\n\tODM_CMNINFO_CUT_VER,\t\t\t\t\t// ODM_CUT_VERSION_E\n\tODM_CMNINFO_FAB_VER,\t\t\t\t\t// ODM_FAB_E\n\tODM_CMNINFO_RF_TYPE,\t\t\t\t\t// ODM_RF_PATH_E or ODM_RF_TYPE_E?\n\tODM_CMNINFO_RFE_TYPE, \n\tODM_CMNINFO_BOARD_TYPE,\t\t\t\t// ODM_BOARD_TYPE_E\n\tODM_CMNINFO_PACKAGE_TYPE,\n\tODM_CMNINFO_EXT_LNA,\t\t\t\t\t// TRUE\n\tODM_CMNINFO_5G_EXT_LNA,\t\n\tODM_CMNINFO_EXT_PA,\n\tODM_CMNINFO_5G_EXT_PA,\n\tODM_CMNINFO_GPA,\n\tODM_CMNINFO_APA,\n\tODM_CMNINFO_GLNA,\n\tODM_CMNINFO_ALNA,\n\tODM_CMNINFO_EXT_TRSW,\n\tODM_CMNINFO_EXT_LNA_GAIN,\n\tODM_CMNINFO_PATCH_ID,\t\t\t\t//CUSTOMER ID\n\tODM_CMNINFO_BINHCT_TEST,\n\tODM_CMNINFO_BWIFI_TEST,\n\tODM_CMNINFO_SMART_CONCURRENT,\n\tODM_CMNINFO_CONFIG_BB_RF,\n\tODM_CMNINFO_DOMAIN_CODE_2G,\n\tODM_CMNINFO_DOMAIN_CODE_5G,\n\tODM_CMNINFO_IQKFWOFFLOAD,\n\tODM_CMNINFO_HUBUSBMODE,\n\tODM_CMNINFO_FWDWRSVDPAGEINPROGRESS,\n\tODM_CMNINFO_TX_TP,\n\tODM_CMNINFO_RX_TP,\n\tODM_CMNINFO_SOUNDING_SEQ,\n\t//-----------HOOK BEFORE REG INIT-----------//\t\n\n\n\t//\n\t// Dynamic value:\n\t//\n//--------- POINTER REFERENCE-----------//\n\tODM_CMNINFO_MAC_PHY_MODE,\t\t\t// ODM_MAC_PHY_MODE_E\n\tODM_CMNINFO_TX_UNI,\n\tODM_CMNINFO_RX_UNI,\n\tODM_CMNINFO_WM_MODE,\t\t\t\t// ODM_WIRELESS_MODE_E\n\tODM_CMNINFO_BAND,\t\t\t\t\t// ODM_BAND_TYPE_E\n\tODM_CMNINFO_SEC_CHNL_OFFSET,\t\t// ODM_SEC_CHNL_OFFSET_E\n\tODM_CMNINFO_SEC_MODE,\t\t\t\t// ODM_SECURITY_E\n\tODM_CMNINFO_BW,\t\t\t\t\t\t// ODM_BW_E\n\tODM_CMNINFO_CHNL,\n\tODM_CMNINFO_FORCED_RATE,\n\t\n\tODM_CMNINFO_DMSP_GET_VALUE,\n\tODM_CMNINFO_BUDDY_ADAPTOR,\n\tODM_CMNINFO_DMSP_IS_MASTER,\n\tODM_CMNINFO_SCAN,\n\tODM_CMNINFO_POWER_SAVING,\n\tODM_CMNINFO_ONE_PATH_CCA,\t\t\t// ODM_CCA_PATH_E\n\tODM_CMNINFO_DRV_STOP,\n\tODM_CMNINFO_PNP_IN,\n\tODM_CMNINFO_INIT_ON,\n\tODM_CMNINFO_ANT_TEST,\n\tODM_CMNINFO_NET_CLOSED,\n\t//ODM_CMNINFO_RTSTA_AID,\t\t\t\t// For win driver only?\n\tODM_CMNINFO_FORCED_IGI_LB,\n\tODM_CMNINFO_P2P_LINK,\n\tODM_CMNINFO_FCS_MODE,\n\tODM_CMNINFO_IS1ANTENNA,\n\tODM_CMNINFO_RFDEFAULTPATH,\n//--------- POINTER REFERENCE-----------//\n\n//------------CALL BY VALUE-------------//\n\tODM_CMNINFO_WIFI_DIRECT,\n\tODM_CMNINFO_WIFI_DISPLAY,\n\tODM_CMNINFO_LINK_IN_PROGRESS,\t\t\t\n\tODM_CMNINFO_LINK,\n\tODM_CMNINFO_STATION_STATE,\n\tODM_CMNINFO_RSSI_MIN,\n\tODM_CMNINFO_DBG_COMP,\t\t\t\t// u8Byte\n\tODM_CMNINFO_DBG_LEVEL,\t\t\t\t// u4Byte\n\tODM_CMNINFO_RA_THRESHOLD_HIGH,\t\t// u1Byte\n\tODM_CMNINFO_RA_THRESHOLD_LOW,\t\t// u1Byte\n\tODM_CMNINFO_RF_ANTENNA_TYPE,\t\t// u1Byte\n\tODM_CMNINFO_BT_ENABLED,\n\tODM_CMNINFO_BT_HS_CONNECT_PROCESS,\n\tODM_CMNINFO_BT_HS_RSSI,\n\tODM_CMNINFO_BT_OPERATION,\n\tODM_CMNINFO_BT_LIMITED_DIG,\t\t\t\t\t//Need to Limited Dig or not\n\tODM_CMNINFO_BT_DIG,\n\tODM_CMNINFO_BT_BUSY,\t\t\t\t\t//Check Bt is using or not//neil\t\n\tODM_CMNINFO_BT_DISABLE_EDCA,\n#if(DM_ODM_SUPPORT_TYPE & ODM_AP)\t\t// for repeater mode add by YuChen 2014.06.23\n#ifdef UNIVERSAL_REPEATER\n\tODM_CMNINFO_VXD_LINK,\n#endif\n#endif\n\tODM_CMNINFO_AP_TOTAL_NUM,\n\tODM_CMNINFO_POWER_TRAINING,\n//------------CALL BY VALUE-------------//\n\n\t//\n\t// Dynamic ptr array hook itms.\n\t//\n\tODM_CMNINFO_STA_STATUS,\n\tODM_CMNINFO_PHY_STATUS,\n\tODM_CMNINFO_MAC_STATUS,\n\t\n\tODM_CMNINFO_MAX,\n\n\n}ODM_CMNINFO_E;\n\n//\n// 2011/10/20 MH Define ODM support ability.  ODM_CMNINFO_ABILITY\n//\ntypedef enum _ODM_Support_Ability_Definition\n{\n\t//\n\t// BB ODM section BIT 0-19\n\t//\n\tODM_BB_DIG\t\t\t\t\t= BIT0,\n\tODM_BB_RA_MASK\t\t\t\t= BIT1,\n\tODM_BB_DYNAMIC_TXPWR\t\t= BIT2,\n\tODM_BB_FA_CNT\t\t\t\t\t= BIT3,\n\tODM_BB_RSSI_MONITOR\t\t\t= BIT4,\n\tODM_BB_CCK_PD\t\t\t\t= BIT5,\n\tODM_BB_ANT_DIV\t\t\t\t= BIT6,\n\tODM_BB_PWR_SAVE\t\t\t\t= BIT7,\n\tODM_BB_PWR_TRAIN\t\t\t\t= BIT8,\n\tODM_BB_RATE_ADAPTIVE\t\t\t= BIT9,\n\tODM_BB_PATH_DIV\t\t\t\t= BIT10,\n\tODM_BB_PSD\t\t\t\t\t= BIT11,\n\tODM_BB_RXHP\t\t\t\t\t= BIT12,\n\tODM_BB_ADAPTIVITY\t\t\t\t= BIT13,\n\tODM_BB_CFO_TRACKING\t\t\t= BIT14,\n\tODM_BB_NHM_CNT\t\t\t\t= BIT15,\n\tODM_BB_PRIMARY_CCA\t\t\t= BIT16,\n\tODM_BB_TXBF\t\t\t\t= BIT17,\n\t\n\t//\n\t// MAC DM section BIT 20-23\n\t//\n\tODM_MAC_EDCA_TURBO\t\t\t= BIT20,\n\tODM_MAC_EARLY_MODE\t\t\t= BIT21,\n\t\n\t//\n\t// RF ODM section BIT 24-31\n\t//\n\tODM_RF_TX_PWR_TRACK\t\t\t= BIT24,\n\tODM_RF_RX_GAIN_TRACK\t\t\t= BIT25,\n\tODM_RF_CALIBRATION\t\t\t= BIT26,\n\t\n}ODM_ABILITY_E;\n\n//Move some non-DM enum,define, struc. form phydm.h to phydm_types.h by Dino\n\n// ODM_CMNINFO_ONE_PATH_CCA\ntypedef enum tag_CCA_Path\n{\n\tODM_CCA_2R\t\t\t= 0,\n\tODM_CCA_1R_A\t\t= 1,\n\tODM_CCA_1R_B\t\t= 2,\n}ODM_CCA_PATH_E;\n\n//move RAInfo to Phydm_RaInfo.h\n\n//Remove struct  PATHDIV_PARA to odm_PathDiv.h \n\n//Remove struct to odm_PowerTracking.h by YuChen\n//\n// ODM Dynamic common info value definition\n//\n//Move AntDiv form phydm.h to Phydm_AntDiv.h by Dino\n\n//move PathDiv to Phydm_PathDiv.h\n\ntypedef enum _BASEBAND_CONFIG_PHY_REG_PG_VALUE_TYPE{\n\tPHY_REG_PG_RELATIVE_VALUE = 0,\n\tPHY_REG_PG_EXACT_VALUE = 1\n} PHY_REG_PG_TYPE;\n\n//\n// 2011/09/22 MH Copy from SD4 defined structure. We use to support PHY DM integration.\n//\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n#if (RT_PLATFORM != PLATFORM_LINUX)\ntypedef \n#endif\n\t\nstruct DM_Out_Source_Dynamic_Mechanism_Structure\n#else// for AP,ADSL,CE Team\ntypedef  struct DM_Out_Source_Dynamic_Mechanism_Structure\n#endif\n{\n\t//RT_TIMER \tFastAntTrainingTimer;\n\t//\n\t//\tAdd for different team use temporarily\n\t//\n\tPADAPTER\t\tAdapter;\t\t// For CE/NIC team\n\tprtl8192cd_priv\tpriv;\t\t\t// For AP/ADSL team\n\t// WHen you use Adapter or priv pointer, you must make sure the pointer is ready.\n\tBOOLEAN\t\t\todm_ready;\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\trtl8192cd_priv\t\tfake_priv;\n#endif\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t// ADSL_AP_BUILD_WORKAROUND\n\tADAPTER\t\t\tfake_adapter;\n#endif\n\t\n\tPHY_REG_PG_TYPE\t\tPhyRegPgValueType;\n\tu1Byte\t\t\t\tPhyRegPgVersion;\n\n\tu8Byte\t\t\tDebugComponents;\n\tu4Byte\t\t\tDebugLevel;\n\t\n\tu4Byte\t\t\tNumQryPhyStatusAll; \t//CCK + OFDM\n\tu4Byte\t\t\tLastNumQryPhyStatusAll; \n\tu4Byte\t\t\tRxPWDBAve;\n\tBOOLEAN\t\t\tMPDIG_2G; \t\t//off MPDIG\n\tu1Byte\t\t\tTimes_2G;\n\t\n//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------//\n\tBOOLEAN\t\t\tbCckHighPower; \n\tu1Byte\t\t\tRFPathRxEnable;\t\t// ODM_CMNINFO_RFPATH_ENABLE\n\tu1Byte\t\t\tControlChannel;\n//------ ODM HANDLE, DRIVER NEEDS NOT TO HOOK------//\n\n//--------REMOVED COMMON INFO----------//\n\t//u1Byte\t\t\t\tPseudoMacPhyMode;\n\t//BOOLEAN\t\t\t*BTCoexist;\n\t//BOOLEAN\t\t\tPseudoBtCoexist;\n\t//u1Byte\t\t\t\tOPMode;\n\t//BOOLEAN\t\t\tbAPMode;\n\t//BOOLEAN\t\t\tbClientMode;\n\t//BOOLEAN\t\t\tbAdHocMode;\n\t//BOOLEAN\t\t\tbSlaveOfDMSP;\n//--------REMOVED COMMON INFO----------//\n\n\n//1  COMMON INFORMATION\n\n\t//\n\t// Init Value\n\t//\n//-----------HOOK BEFORE REG INIT-----------//\t\n\t// ODM Platform info AP/ADSL/CE/MP = 1/2/3/4\n\tu1Byte\t\t\tSupportPlatform;\t\t\n\t// ODM Support Ability DIG/RATR/TX_PWR_TRACK/ KK = 1/2/3/K\n\tu4Byte\t\t\tSupportAbility;\n\t// ODM PCIE/USB/SDIO = 1/2/3\n\tu1Byte\t\t\tSupportInterface;\t\t\t\n\t// ODM composite or independent. Bit oriented/ 92C+92D+ .... or any other type = 1/2/3/...\n\tu4Byte\t\t\tSupportICType;\t\n\t// Cut Version TestChip/A-cut/B-cut... = 0/1/2/3/...\n\tu1Byte\t\t\tCutVersion;\n\t// Fab Version TSMC/UMC = 0/1\n\tu1Byte\t\t\tFabVersion;\n\t// RF Type 4T4R/3T3R/2T2R/1T2R/1T1R/...\n\tu1Byte\t\t\tRFType;\n\tu1Byte\t\t\tRFEType;\t\n\t// Board Type Normal/HighPower/MiniCard/SLIM/Combo/... = 0/1/2/3/4/...\n\tu1Byte\t\t\tBoardType;\n\tu1Byte\t\t\tPackageType;\n\tu2Byte\t\t\tTypeGLNA;\n\tu2Byte\t\t\tTypeGPA;\n\tu2Byte\t\t\tTypeALNA;\n\tu2Byte\t\t\tTypeAPA;\n\t// with external LNA  NO/Yes = 0/1\n\tu1Byte\t\t\tExtLNA; // 2G\n\tu1Byte\t\t\tExtLNA5G; //5G\n\t// with external PA  NO/Yes = 0/1\n\tu1Byte\t\t\tExtPA; // 2G\n\tu1Byte\t\t\tExtPA5G; //5G\n\t// with external TRSW  NO/Yes = 0/1\n\tu1Byte\t\t\tExtTRSW;\n\tu1Byte\t\t\tExtLNAGain; // 2G\n\tu1Byte\t\t\tPatchID; //Customer ID\n\tBOOLEAN\t\t\tbInHctTest;\n\tBOOLEAN\t\t\tbWIFITest;\n\n\tBOOLEAN\t\t\tbDualMacSmartConcurrent;\n\tu4Byte\t\t\tBK_SupportAbility;\n\tu1Byte\t\t\tAntDivType;\n\tBOOLEAN\t\t\tConfigBBRF;\n\tu1Byte\t\t\todm_Regulation2_4G;\n\tu1Byte\t\t\todm_Regulation5G;\n\tu1Byte\t\t\tIQKFWOffload;\n//-----------HOOK BEFORE REG INIT-----------//\t\n\n\t//\n\t// Dynamic Value\n\t//\t\n//--------- POINTER REFERENCE-----------//\n\n\tu1Byte\t\t\tu1Byte_temp;\n\tBOOLEAN\t\t\tBOOLEAN_temp;\n\tPADAPTER\t\tPADAPTER_temp;\n\t\n\t// MAC PHY Mode SMSP/DMSP/DMDP = 0/1/2\n\tu1Byte\t\t\t*pMacPhyMode;\n\t//TX Unicast byte count\n\tu8Byte\t\t\t*pNumTxBytesUnicast;\n\t//RX Unicast byte count\n\tu8Byte\t\t\t*pNumRxBytesUnicast;\n\t// Wireless mode B/G/A/N = BIT0/BIT1/BIT2/BIT3\n\tu1Byte\t\t\t*pWirelessMode; //ODM_WIRELESS_MODE_E\n\t// Frequence band 2.4G/5G = 0/1\n\tu1Byte\t\t\t*pBandType;\n\t// Secondary channel offset don't_care/below/above = 0/1/2\n\tu1Byte\t\t\t*pSecChOffset;\n\t// Security mode Open/WEP/AES/TKIP = 0/1/2/3\n\tu1Byte\t\t\t*pSecurity;\n\t// BW info 20M/40M/80M = 0/1/2\n\tu1Byte\t\t\t*pBandWidth;\n \t// Central channel location Ch1/Ch2/....\n\tu1Byte\t\t\t*pChannel;\t//central channel number\n\tBOOLEAN\t\t\tDPK_Done;\n\t// Common info for 92D DMSP\n\t\n\tBOOLEAN\t\t\t*pbGetValueFromOtherMac;\n\tPADAPTER\t\t*pBuddyAdapter;\n\tBOOLEAN\t\t\t*pbMasterOfDMSP; //MAC0: master, MAC1: slave\n\t// Common info for Status\n\tBOOLEAN\t\t\t*pbScanInProcess;\n\tBOOLEAN\t\t\t*pbPowerSaving;\n\t// CCA Path 2-path/path-A/path-B = 0/1/2; using ODM_CCA_PATH_E.\n\tu1Byte\t\t\t*pOnePathCCA;\n\t//pMgntInfo->AntennaTest\n\tu1Byte\t\t\t*pAntennaTest;\n\tBOOLEAN\t\t\t*pbNet_closed;\n\t//u1Byte\t\t\t*pAidMap;\n\tu1Byte\t\t\t*pu1ForcedIgiLb;\n\tBOOLEAN\t\t\t*pIsFcsModeEnable;\n/*--------- For 8723B IQK-----------*/\n\tBOOLEAN\t\t\t*pIs1Antenna;\n\tu1Byte\t\t\t*pRFDefaultPath;\n\t// 0:S1, 1:S0\n\t\n//--------- POINTER REFERENCE-----------//\n\tpu2Byte\t\t\tpForcedDataRate;\n\tpu1Byte\t\t\tHubUsbMode;\n\tBOOLEAN\t\t\t*pbFwDwRsvdPageInProgress;\n\tu4Byte\t\t\t*pCurrentTxTP;\n\tu4Byte\t\t\t*pCurrentRxTP;\n\tu1Byte\t\t\t*pSoundingSeq;\n//------------CALL BY VALUE-------------//\n\tBOOLEAN\t\t\tbLinkInProcess;\n\tBOOLEAN\t\t\tbWIFI_Direct;\n\tBOOLEAN\t\t\tbWIFI_Display;\n\tBOOLEAN\t\t\tbLinked;\n\tBOOLEAN\t\t\tbsta_state;\n#if(DM_ODM_SUPPORT_TYPE & ODM_AP)\t\t// for repeater mode add by YuChen 2014.06.23\n#ifdef UNIVERSAL_REPEATER\n\tBOOLEAN\t\t\tVXD_bLinked;\n#endif\n#endif\t\t\t\t\t\t\t\t\t// for repeater mode add by YuChen 2014.06.23\t\n\tu1Byte\t\t\tRSSI_Min;\t\n\tu1Byte\t\t\tInterfaceIndex; /*Add for 92D  dual MAC: 0--Mac0 1--Mac1*/\n\tBOOLEAN\t\t\tbIsMPChip;\n\tBOOLEAN\t\t\tbOneEntryOnly;\n\tBOOLEAN\t\t\tmp_mode;\n\tu4Byte\t\t\tOneEntry_MACID;\n\tu1Byte\t\t\tpre_number_linked_client;\t\n\tu1Byte\t\t\tnumber_linked_client;\n\tu1Byte\t\t\tpre_number_active_client;\t\n\tu1Byte\t\t\tnumber_active_client;\n\t// Common info for BTDM\n\tBOOLEAN\t\t\tbBtEnabled;\t\t\t// BT is enabled\n\tBOOLEAN\t\t\tbBtConnectProcess;\t// BT HS is under connection progress.\n\tu1Byte\t\t\tbtHsRssi;\t\t\t\t// BT HS mode wifi rssi value.\n\tBOOLEAN\t\t\tbBtHsOperation;\t\t// BT HS mode is under progress\n\tu1Byte\t\t\tbtHsDigVal;\t\t\t// use BT rssi to decide the DIG value\n\tBOOLEAN\t\t\tbBtDisableEdcaTurbo;\t// Under some condition, don't enable the EDCA Turbo\n\tBOOLEAN\t\t\tbBtBusy;   \t\t\t// BT is busy.\n\tBOOLEAN\t\t\tbBtLimitedDig;   \t\t// BT is busy.\n\tBOOLEAN\t\t\tbDisablePhyApi;\n//------------CALL BY VALUE-------------//\n\tu1Byte\t\t\tRSSI_A;\n\tu1Byte\t\t\tRSSI_B;\n\tu1Byte\t\t\tRSSI_C;\n\tu1Byte\t\t\tRSSI_D;\n\tu8Byte\t\t\tRSSI_TRSW;\t\n\tu8Byte\t\t\tRSSI_TRSW_H;\n\tu8Byte\t\t\tRSSI_TRSW_L;\t\n\tu8Byte\t\t\tRSSI_TRSW_iso;\n\tu1Byte\t\t\tTXAntStatus;\n\tu1Byte\t\t\tRXAntStatus;\n\tu1Byte\t\t\tcck_lna_idx;\n\tu1Byte\t\t\tcck_vga_idx;\n\tu1Byte\t\t\tofdm_agc_idx[4];\n\n\tu1Byte\t\t\tRxRate;\n\tBOOLEAN\t\t\tbNoisyState;\n\tu1Byte\t\t\tTxRate;\n\tu1Byte\t\t\tLinkedInterval;\n\tu1Byte\t\t\tpreChannel;\n\tu4Byte\t\t\tTxagcOffsetValueA;\n\tBOOLEAN\t\t\tIsTxagcOffsetPositiveA;\n\tu4Byte\t\t\tTxagcOffsetValueB;\n\tBOOLEAN\t\t\tIsTxagcOffsetPositiveB;\n\tu8Byte\t\t\tlastTxOkCnt;\n\tu8Byte\t\t\tlastRxOkCnt;\n\tu4Byte\t\t\tBbSwingOffsetA;\n\tBOOLEAN\t\t\tIsBbSwingOffsetPositiveA;\n\tu4Byte\t\t\tBbSwingOffsetB;\n\tBOOLEAN\t\t\tIsBbSwingOffsetPositiveB;\n\tu1Byte\t\t\tantdiv_rssi;\n\tu1Byte\t\t\tfat_comb_a;\n\tu1Byte\t\t\tfat_comb_b;\n\tu1Byte\t\t\tantdiv_intvl;\n\tu1Byte\t\t\tAntType;\n\tu1Byte\t\t\tpre_AntType;\n\tu1Byte\t\t\tantdiv_period;\n\tu1Byte\t\t\tantdiv_select;\n\tu1Byte\t\t\tpath_select;\t\n\tu1Byte\t\t\tantdiv_evm_en;\n\tu1Byte\t\t\tbdc_holdstate;\n\tu1Byte\t\t\tNdpaPeriod;\n\tBOOLEAN\t\t\tH2C_RARpt_connect;\n\tBOOLEAN\t\t\tcck_agc_report_type;\n\t\n\tu1Byte\t\t\tdm_dig_max_TH;\n\tu1Byte \t\t\tdm_dig_min_TH;\n\tu1Byte \t\t\tprint_agc;\n\n\t//For Adaptivtiy\n\tu2Byte\t\t\tNHM_cnt_0;\n\tu2Byte\t\t\tNHM_cnt_1;\n\ts1Byte\t\t\tTH_L2H_ini;\n\ts1Byte\t\t\tTH_EDCCA_HL_diff;\n\ts1Byte\t\t\tTH_L2H_ini_mode2;\n\ts1Byte\t\t\tTH_EDCCA_HL_diff_mode2;\n\tBOOLEAN\t\t\tCarrier_Sense_enable;\n\tu1Byte\t\t\tAdaptivity_IGI_upper;\n\tBOOLEAN\t\t\tadaptivity_flag;\n\tu1Byte\t\t\tDCbackoff;\n\tBOOLEAN\t\t\tAdaptivity_enable;\n\tu1Byte\t\t\tAPTotalNum;\n\tBOOLEAN\t\t\tEDCCA_enable;\n\tADAPTIVITY_STATISTICS\tAdaptivity;\n\t//For Adaptivtiy\n\tu1Byte\t\t\tLastUSBHub;\n\tu1Byte\t\t\tTxBfDataRate;\n\t\n\tu1Byte\t\t\tnbi_set_result;\n\t\n\tu1Byte\t\t\tc2h_cmd_start;\n\tu1Byte\t\t\tfw_debug_trace[60]; \n\tu1Byte\t\t\tpre_c2h_seq;\n\tBOOLEAN\t\t\tfw_buff_is_enpty;\n\tu4Byte\t\t\tdata_frame_num;\n\n\t/*for noise detection*/\n\tBOOLEAN\t\t\tNoisyDecision; /*b_noisy*/\n\tBOOLEAN\t\t\tpre_b_noisy;\t\n\tu4Byte\t\t\tNoisyDecision_Smooth;\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_CE))\n\tODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM];\n#endif\n\t//\n\t//2 Define STA info.\n\t// _ODM_STA_INFO\n\t// 2012/01/12 MH For MP, we need to reduce one array pointer for default port.??\n\tPSTA_INFO_T\t\tpODM_StaInfo[ODM_ASSOCIATE_ENTRY_NUM];\n\tu2Byte\t\t\tplatform2phydm_macid_table[ODM_ASSOCIATE_ENTRY_NUM];\t\t/* platform_macid_table[platform_macid] = phydm_macid */\n\n#if (RATE_ADAPTIVE_SUPPORT == 1)\n\tu2Byte \t\t\tCurrminRptTime;\n\tODM_RA_INFO_T   RAInfo[ODM_ASSOCIATE_ENTRY_NUM]; //Use MacID as array index. STA MacID=0, VWiFi Client MacID={1, ODM_ASSOCIATE_ENTRY_NUM-1} //YJ,add,120119\n#endif\n\t//\n\t// 2012/02/14 MH Add to share 88E ra with other SW team.\n\t// We need to colelct all support abilit to a proper area.\n\t//\n\tBOOLEAN\t\t\t\tRaSupport88E;\n\n\t// Define ...........\n\n\t// Latest packet phy info (ODM write)\n\tODM_PHY_DBG_INFO_T\t PhyDbgInfo;\n\t//PHY_INFO_88E\t\tPhyInfo;\n\n\t// Latest packet phy info (ODM write)\n\tODM_MAC_INFO\t\t*pMacInfo;\n\t//MAC_INFO_88E\t\tMacInfo;\n\n\t// Different Team independt structure??\n\n\t//\n\t//TX_RTP_CMN\t\tTX_retrpo;\n\t//TX_RTP_88E\t\tTX_retrpo;\n\t//TX_RTP_8195\t\tTX_retrpo;\n\n\t//\n\t//ODM Structure\n\t//\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tBDC_T\t\t\t\t\tDM_BdcTable;\n\t#endif\n\t\n\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tSAT_T\t\t\t\t\t\tdm_sat_table;\n\t#endif\n\t\n#endif\n\tFAT_T\t\t\t\t\t\tDM_FatTable;\n\tDIG_T\t\t\t\t\t\tDM_DigTable;\n\n\tPS_T\t\t\t\t\t\tDM_PSTable;\n\tPri_CCA_T\t\t\t\t\tDM_PriCCA;\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tRXHP_T\t\t\t\t\t\tDM_RXHP_Table;\n#endif\n\tRA_T\t\t\t\t\t\tDM_RA_Table;  \n\tFALSE_ALARM_STATISTICS\t\tFalseAlmCnt;\n\tFALSE_ALARM_STATISTICS\t\tFlaseAlmCntBuddyAdapter;\n\tSWAT_T\t\t\t\t\t\tDM_SWAT_Table;\n\tBOOLEAN\t\t\t\t\t\tRSSI_test;\n\tCFO_TRACKING    \t\t\t\tDM_CfoTrack;\n\tACS\t\t\t\t\t\t\tDM_ACS;\n\n\n#if (RTL8814A_SUPPORT == 1)\n\tIQK_INFO\tIQK_info;\n#endif /* (RTL8814A_SUPPORT==1) */\n\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t//Path Div Struct\n\tPATHDIV_PARA\tpathIQK;\n#endif\n#if(defined(CONFIG_PATH_DIVERSITY))\n\tPATHDIV_T\tDM_PathDiv;\n#endif\t\n\n\tEDCA_T\t\tDM_EDCA_Table;\n\tu4Byte\t\tWMMEDCA_BE;\n\n\t// Copy from SD4 structure\n\t//\n\t// ==================================================\n\t//\n\n\t//common\n\t//u1Byte\t\tDM_Type;\t\n\t//u1Byte    PSD_Report_RXHP[80];   // Add By Gary\n\t//u1Byte    PSD_func_flag;               // Add By Gary\n\t//for DIG\n\t//u1Byte\t\tbDMInitialGainEnable;\n\t//u1Byte\t\tbinitialized; // for dm_initial_gain_Multi_STA use.\n\t//for Antenna diversity\n\t//u8\tAntDivCfg;// 0:OFF , 1:ON, 2:by efuse\n\t//PSTA_INFO_T RSSI_target;\n\n\tBOOLEAN\t\t\t*pbDriverStopped;\n\tBOOLEAN\t\t\t*pbDriverIsGoingToPnpSetPowerSleep;\n\tBOOLEAN\t\t\t*pinit_adpt_in_progress;\n\n\t//PSD\n\tBOOLEAN\t\t\tbUserAssignLevel;\n\tRT_TIMER \t\tPSDTimer;\n\tu1Byte\t\t\tRSSI_BT;\t\t\t//come from BT\n\tBOOLEAN\t\t\tbPSDinProcess;\n\tBOOLEAN\t\t\tbPSDactive;\n\tBOOLEAN\t\t\tbDMInitialGainEnable;\n\n\t//MPT DIG\n\tRT_TIMER \t\tMPT_DIGTimer;\n\t\n\t//for rate adaptive, in fact,  88c/92c fw will handle this\n\tu1Byte\t\t\tbUseRAMask;\n\n\tODM_RATE_ADAPTIVE\tRateAdaptive;\n//#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n#if(defined(CONFIG_ANT_DETECTION))\n\tANT_DETECTED_INFO\tAntDetectedInfo; // Antenna detected information for RSSI tool\n#endif\n\tODM_RF_CAL_T\tRFCalibrateInfo;\n\n\t\n\t//\n\t// Dynamic ATC switch\n\t//\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\t\n\t//\n\t// Power Training\n\t//\n\tu1Byte\t\t\tForcePowerTrainingState;\n\tBOOLEAN\t\t\tbChangeState;\n\tu4Byte\t\t\tPT_score;\n\tu8Byte\t\t\tOFDM_RX_Cnt;\n\tu8Byte\t\t\tCCK_RX_Cnt;\n#endif\n\tBOOLEAN\t\t\tbDisablePowerTraining;\n\n\t//\n\t// ODM system resource.\n\t//\n\n\t// ODM relative time.\n\tRT_TIMER \t\t\t\tPathDivSwitchTimer;\n\t//2011.09.27 add for Path Diversity\n\tRT_TIMER\t\t\t\tCCKPathDiversityTimer;\n\tRT_TIMER \tFastAntTrainingTimer;\n#ifdef ODM_EVM_ENHANCE_ANTDIV\n\tRT_TIMER \t\t\tEVM_FastAntTrainingTimer;\n#endif\n\tRT_TIMER\t\tsbdcnt_timer;\n\n\t// ODM relative workitem.\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#if USE_WORKITEM\n\tRT_WORK_ITEM\t\t\tPathDivSwitchWorkitem;\n\tRT_WORK_ITEM\t\t\tCCKPathDiversityWorkitem;\n\tRT_WORK_ITEM\t\t\tFastAntTrainingWorkitem;\n\tRT_WORK_ITEM\t\t\tMPT_DIGWorkitem;\n\tRT_WORK_ITEM\t\t\tRaRptWorkitem;\n\tRT_WORK_ITEM\t\t\tsbdcnt_workitem;\n#endif\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n#if (BEAMFORMING_SUPPORT == 1)\n\tRT_BEAMFORMING_INFO BeamformingInfo;\n#endif \n#endif\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\n#if (RT_PLATFORM != PLATFORM_LINUX)\n} DM_ODM_T, *PDM_ODM_T;\t\t// DM_Dynamic_Mechanism_Structure\n#else\n};\n#endif\t\n\n#else// for AP,ADSL,CE Team\n} DM_ODM_T, *PDM_ODM_T;\t\t// DM_Dynamic_Mechanism_Structure\n#endif\n\n\ntypedef enum _PHYDM_STRUCTURE_TYPE{\n\tPHYDM_FALSEALMCNT,\n\tPHYDM_CFOTRACK,\n\tPHYDM_ADAPTIVITY,\n\tPHYDM_ROMINFO,\n\t\n}PHYDM_STRUCTURE_TYPE;\n\n\n\n typedef enum _ODM_RF_CONTENT{\n\todm_radioa_txt = 0x1000,\n\todm_radiob_txt = 0x1001,\n\todm_radioc_txt = 0x1002,\n\todm_radiod_txt = 0x1003\n} ODM_RF_CONTENT;\n\ntypedef enum _ODM_BB_Config_Type{\n\tCONFIG_BB_PHY_REG,   \n\tCONFIG_BB_AGC_TAB,   \n\tCONFIG_BB_AGC_TAB_2G,\n\tCONFIG_BB_AGC_TAB_5G, \n\tCONFIG_BB_PHY_REG_PG,\n\tCONFIG_BB_PHY_REG_MP,\n\tCONFIG_BB_AGC_TAB_DIFF,\n} ODM_BB_Config_Type, *PODM_BB_Config_Type;\n\ntypedef enum _ODM_RF_Config_Type{ \n\tCONFIG_RF_RADIO,\n    CONFIG_RF_TXPWR_LMT,\n} ODM_RF_Config_Type, *PODM_RF_Config_Type;\n\ntypedef enum _ODM_FW_Config_Type{\n    CONFIG_FW_NIC,\n    CONFIG_FW_NIC_2,\n    CONFIG_FW_AP,\n    CONFIG_FW_AP_2,\n    CONFIG_FW_MP,\n    CONFIG_FW_WoWLAN,\n    CONFIG_FW_WoWLAN_2,\n    CONFIG_FW_AP_WoWLAN,\n    CONFIG_FW_BT,\n} ODM_FW_Config_Type;\n\n// Status code\n#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\ntypedef enum _RT_STATUS{\n\tRT_STATUS_SUCCESS,\n\tRT_STATUS_FAILURE,\n\tRT_STATUS_PENDING,\n\tRT_STATUS_RESOURCE,\n\tRT_STATUS_INVALID_CONTEXT,\n\tRT_STATUS_INVALID_PARAMETER,\n\tRT_STATUS_NOT_SUPPORT,\n\tRT_STATUS_OS_API_FAILED,\n}RT_STATUS,*PRT_STATUS;\n#endif // end of RT_STATUS definition\n\n#ifdef REMOVE_PACK\n#pragma pack()\n#endif\n\n//#include \"odm_function.h\"\n\n//3===========================================================\n//3 DIG\n//3===========================================================\n\n//Remove DIG by Yuchen\n\n//3===========================================================\n//3 AGC RX High Power Mode\n//3===========================================================\n#define          LNA_Low_Gain_1                      0x64\n#define          LNA_Low_Gain_2                      0x5A\n#define          LNA_Low_Gain_3                      0x58\n\n#define          FA_RXHP_TH1                           5000\n#define          FA_RXHP_TH2                           1500\n#define          FA_RXHP_TH3                             800\n#define          FA_RXHP_TH4                             600\n#define          FA_RXHP_TH5                             500\n\n//3===========================================================\n//3 EDCA\n//3===========================================================\n\n//3===========================================================\n//3 Dynamic Tx Power\n//3===========================================================\n//Dynamic Tx Power Control Threshold\n\n//Remove By YuChen\n\n//3===========================================================\n//3 Tx Power Tracking\n//3===========================================================\n\n\n\n//3===========================================================\n//3 Rate Adaptive\n//3===========================================================\n//Remove to odm_RaInfo.h by RS_James\n\n//3===========================================================\n//3 BB Power Save\n//3===========================================================\n\ntypedef enum tag_1R_CCA_Type_Definition\n{\n\tCCA_1R =0,\n\tCCA_2R = 1,\n\tCCA_MAX = 2,\n}DM_1R_CCA_E;\n\ntypedef enum tag_RF_Type_Definition\n{\n\tRF_Save =0,\n\tRF_Normal = 1,\n\tRF_MAX = 2,\n}DM_RF_E;\n\n\n//\n// Extern Global Variables.\n//\n//PowerTracking move to odm_powerTrakcing.h by YuChen\n//\n// check Sta pointer valid or not\n//\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n#define IS_STA_VALID(pSta)\t\t(pSta && pSta->expire_to)\n#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n#define IS_STA_VALID(pSta)\t\t(pSta && pSta->bUsed)\n#else\n#define IS_STA_VALID(pSta)\t\t(pSta)\n#endif\n\n//Remove DIG by yuchen\n\n//Remove BB power saving by Yuchen\n\n//remove PT by yuchen\n\n//ODM_RAStateCheck() Remove by RS_James\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP|ODM_ADSL))\n//============================================================\n// function prototype\n//============================================================\n//#define DM_ChangeDynamicInitGainThresh\t\tODM_ChangeDynamicInitGainThresh\n//void\tODM_ChangeDynamicInitGainThresh(IN\tPADAPTER\tpAdapter,\n//\t\t\t\t\t\t\t\t\t\t\tIN\tINT32\t\tDM_Type,\n//\t\t\t\t\t\t\t\t\t\t\tIN\tINT32\t\tDM_Value);\n\n//Remove DIG by yuchen\n\n\nBOOLEAN\nODM_CheckPowerStatus(\n\tIN\tPADAPTER\t\tAdapter\n\t);\n\n\n//Remove ODM_RateAdaptiveStateApInit() by RS_James\n\n//Remove Edca by YuChen\n\n#endif\n\n\n\nu4Byte odm_ConvertTo_dB(u4Byte Value);\n\nu4Byte odm_ConvertTo_linear(u4Byte Value);\n\n#if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE))\n\nu4Byte\nGetPSDData(\n\tPDM_ODM_T\tpDM_Odm,\n\tunsigned int \tpoint,\n\tu1Byte initial_gain_psd);\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\t\nVOID\nODM_DMWatchdog_LPS(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n);\n#endif\n\n\ns4Byte\nODM_PWdB_Conversion(\n    IN  s4Byte X,\n    IN  u4Byte TotalBit,\n    IN  u4Byte DecimalBit\n    );\n\ns4Byte\nODM_SignConversion(\n    IN  s4Byte value,\n    IN  u4Byte TotalBit\n    );\n\nVOID \nODM_DMInit(\n IN\tPDM_ODM_T\tpDM_Odm\n);\n\nVOID\nODM_DMReset(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t);\n\nVOID\nphydm_support_ablity_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n\t);\n\nVOID\nODM_DMWatchdog(\n\tIN\t\tPDM_ODM_T\t\t\tpDM_Odm\t\t\t// For common use in the future\n\t);\n\nVOID\nODM_CmnInfoInit(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tu4Byte\t\t\tValue\t\n\t);\n\nVOID\nODM_CmnInfoHook(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tPVOID\t\t\tpValue\t\n\t);\n\nVOID\nODM_CmnInfoPtrArrayHook(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tODM_CMNINFO_E\tCmnInfo,\n\tIN\t\tu2Byte\t\t\tIndex,\n\tIN\t\tPVOID\t\t\tpValue\t\n\t);\n\nVOID\nODM_CmnInfoUpdate(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tu4Byte\t\t\tCmnInfo,\n\tIN\t\tu8Byte\t\t\tValue\t\n\t);\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_AP)\nVOID \nODM_InitAllThreads(\n    IN PDM_ODM_T\tpDM_Odm \n    );\n\nVOID\nODM_StopAllThreads(\n\tIN PDM_ODM_T\tpDM_Odm \n\t);\n#endif\n\nVOID \nODM_InitAllTimers(\n    IN PDM_ODM_T\tpDM_Odm \n    );\n\nVOID \nODM_CancelAllTimers(\n    IN PDM_ODM_T    pDM_Odm \n    );\n\nVOID\nODM_ReleaseAllTimers(\n    IN PDM_ODM_T\tpDM_Odm \n    );\n\n\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID ODM_InitAllWorkItems(IN PDM_ODM_T\tpDM_Odm );\nVOID ODM_FreeAllWorkItems(IN PDM_ODM_T\tpDM_Odm );\n\n\n\nu8Byte\nPlatformDivision64(\n\tIN u8Byte\tx,\n\tIN u8Byte\ty\n);\n\n//====================================================\n//3 PathDiV End\n//====================================================\n\n\n#define DM_ChangeDynamicInitGainThresh\t\tODM_ChangeDynamicInitGainThresh\n//void\tODM_ChangeDynamicInitGainThresh(IN\tPADAPTER\tpAdapter,\n//\t\t\t\t\t\t\t\t\t\t\tIN\tINT32\t\tDM_Type,\n//\t\t\t\t\t\t\t\t\t\t\tIN\tINT32\t\tDM_Value);\n//\n// PathDiveristy Remove by RS_James\n\ntypedef enum tag_DIG_Connect_Definition\n{\n\tDIG_STA_DISCONNECT = 0,\t\n\tDIG_STA_CONNECT = 1,\n\tDIG_STA_BEFORE_CONNECT = 2,\n\tDIG_MultiSTA_DISCONNECT = 3,\n\tDIG_MultiSTA_CONNECT = 4,\n\tDIG_CONNECT_MAX\n}DM_DIG_CONNECT_E;\n\n\n//\n// 2012/01/12 MH Check afapter status. Temp fix BSOD.\n//\n#define\tHAL_ADAPTER_STS_CHK(pDM_Odm)\\\n\tif (pDM_Odm->Adapter == NULL)\\\n\t{\\\n\t\treturn;\\\n\t}\\\n\n\n//\n// For new definition in MP temporarily fro power tracking,\n//\n/*\n#define odm_TXPowerTrackingDirectCall(_Adapter)\t\\\n\tIS_HARDWARE_TYPE_8192D(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92D(_Adapter) : \\\n\tIS_HARDWARE_TYPE_8192C(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_92C(_Adapter) : \\\n\tIS_HARDWARE_TYPE_8723A(_Adapter) ? odm_TXPowerTrackingCallback_ThermalMeter_8723A(_Adapter) :\\\n\tODM_TXPowerTrackingCallback_ThermalMeter(_Adapter)\n*/\n\n\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nODM_AsocEntry_Init(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\n//Remove ODM_DynamicARFBSelect() by RS_James\n\nPVOID\nPhyDM_Get_Structure(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\t\tu1Byte\t\t\tStructure_Type\n);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) ||(DM_ODM_SUPPORT_TYPE == ODM_CE)\n/*===========================================================*/\n/* The following is for compile only*/\n/*===========================================================*/\n\n#define\tIS_HARDWARE_TYPE_8723A(_Adapter)\t\t\tFALSE\n#define IS_HARDWARE_TYPE_8723AE(_Adapter)\t\t\tFALSE\n#define\tIS_HARDWARE_TYPE_8192C(_Adapter)\t\t\tFALSE\n#define\tIS_HARDWARE_TYPE_8192D(_Adapter)\t\t\tFALSE\n#define\tRF_T_METER_92D\t\t\t\t\t0x42\n\n\n#define SET_TX_DESC_ANTSEL_A_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 0, 1, __Value)\n#define SET_TX_DESC_TX_ANTL_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 4, 2, __Value)\n#define SET_TX_DESC_TX_ANT_HT_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 6, 2, __Value)\n#define SET_TX_DESC_TX_ANT_CCK_92C(__pTxDesc, __Value) SET_BITS_TO_LE_1BYTE(__pTxDesc+8+3, 2, 2, __Value)\n\n#define GET_RX_STATUS_DESC_RX_MCS(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_1BYTE( __pRxStatusDesc+12, 0, 6)\n\n#define\t\tRX_HAL_IS_CCK_RATE_92C(pDesc)\\\n\t\t\t(GET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE1M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE2M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE5_5M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_MCS(pDesc) == DESC_RATE11M)\n\n#define\t\tH2C_92C_PSD_RESULT\t\t\t\t16\n\n#define\t\trConfig_ram64x16\t\t\t\t0xb2c\n\n#define TARGET_CHNL_NUM_2G_5G\t59\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nFillH2CCmd92C(\t\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte \tElementID,\n\tIN\tu4Byte \tCmdLen,\n\tIN\tpu1Byte\tpCmdBuffer\n);\nVOID\nPHY_SetTxPowerLevel8192C(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\t\t\tchannel\n\t);\nu1Byte GetRightChnlPlaceforIQK(u1Byte chnl);\n\n#endif\n\n//===========================================================\n#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\nvoid odm_dtc(PDM_ODM_T pDM_Odm);\n#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */\n\n\nVOID phydm_NoisyDetection(IN\tPDM_ODM_T\tpDM_Odm\t);\n\nu1Byte\nphydm_nbi_setting(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tenable,\n\tIN\t\tu4Byte\t\tchannel,\n\tIN\t\tu4Byte\t\tbw,\n\tIN\t\tu4Byte\t\tf_interference,\n\tIN\t\tu4Byte\t\tSecond_ch\n);\n\n\n#endif\n\nVOID\nphydm_nbi_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n);\n\n"
  },
  {
    "path": "hal/phydm/phydm_acs.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n\nu1Byte\nODM_GetAutoChannelSelectResult(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tBand\n)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPACS\t\t\t\t\tpACS = &pDM_Odm->DM_ACS;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tif(Band == ODM_BAND_2_4G)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"[ACS] ODM_GetAutoChannelSelectResult(): CleanChannel_2G(%d)\\n\", pACS->CleanChannel_2G));\n\t\treturn (u1Byte)pACS->CleanChannel_2G;\t\n\t}\n\telse\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"[ACS] ODM_GetAutoChannelSelectResult(): CleanChannel_5G(%d)\\n\", pACS->CleanChannel_5G));\n\t\treturn (u1Byte)pACS->CleanChannel_5G;\t\n\t}\n#else\n\treturn (u1Byte)pACS->CleanChannel_2G;\n#endif\n\n}\n\nVOID\nodm_AutoChannelSelectSetting(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tBOOLEAN\t\t\tIsEnable\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\t\tperiod = 0x2710;// 40ms in default\n\tu2Byte\t\t\t\t\t\tNHMType = 0x7;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelectSetting()=========> \\n\"));\n\n\tif(IsEnable)\n\t{//20 ms\n\t\tperiod = 0x1388;\n\t\tNHMType = 0x1;\n\t}\n\n\tif(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t{\n\t\t//PHY parameters initialize for ac series\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, period);\t//0x990[31:16]=0x2710\tTime duration for NHM unit: 4us, 0x2710=40ms\n\t\t//ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, NHMType);\t//0x994[9:8]=3\t\t\tenable CCX\n\t}\n\telse if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t{\n\t\t//PHY parameters initialize for n series\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, period);\t//0x894[31:16]=0x2710\tTime duration for NHM unit: 4us, 0x2710=40ms\n\t\t//ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, NHMType);\t//0x890[9:8]=3\t\t\tenable CCX\t\t\n\t}\n#endif\n}\n\nVOID\nodm_AutoChannelSelectInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPACS\t\t\t\t\t\tpACS = &pDM_Odm->DM_ACS;\n\tu1Byte\t\t\t\t\t\ti;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\n\t\treturn;\n\n\tif(pACS->bForceACSResult)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelectInit()=========> \\n\"));\n\n\tpACS->CleanChannel_2G = 1;\n\tpACS->CleanChannel_5G = 36;\n\n\tfor (i = 0; i < ODM_MAX_CHANNEL_2G; ++i)\n\t{\n\t\tpACS->Channel_Info_2G[0][i] = 0;\n\t\tpACS->Channel_Info_2G[1][i] = 0;\n\t}\n\n\tif(pDM_Odm->SupportICType & (ODM_IC_11AC_SERIES|ODM_RTL8192D))\n\t{\n\t\tfor (i = 0; i < ODM_MAX_CHANNEL_5G; ++i)\n\t\t{\n\t\t\tpACS->Channel_Info_5G[0][i] = 0;\n\t\t\tpACS->Channel_Info_5G[1][i] = 0;\n\t\t}\n\t}\n#endif\n}\n\nVOID\nodm_AutoChannelSelectReset(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPACS\t\t\t\t\t\tpACS = &pDM_Odm->DM_ACS;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\n\t\treturn;\n\n\tif(pACS->bForceACSResult)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelectReset()=========> \\n\"));\n\n\todm_AutoChannelSelectSetting(pDM_Odm,TRUE);// for 20ms measurement\n\tPhydm_NHMCounterStatisticsReset(pDM_Odm);\n#endif\n}\n\nVOID\nodm_AutoChannelSelect(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tChannel\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPACS\t\t\t\t\t\tpACS = &pDM_Odm->DM_ACS;\n\tu1Byte\t\t\t\t\t\tChannelIDX = 0, SearchIDX = 0;\n\tu2Byte\t\t\t\t\t\tMaxScore=0;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_AutoChannelSelect(): Return: SupportAbility ODM_BB_NHM_CNT is disabled\\n\"));\n\t\treturn;\n\t}\n\n\tif(pACS->bForceACSResult)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_AutoChannelSelect(): Force 2G clean channel = %d, 5G clean channel = %d\\n\",\n\t\t\tpACS->CleanChannel_2G, pACS->CleanChannel_5G));\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelect(): Channel = %d=========> \\n\", Channel));\n\n\tPhydm_GetNHMCounterStatistics(pDM_Odm);\n\todm_AutoChannelSelectSetting(pDM_Odm,FALSE);\n\n\tif(Channel >=1 && Channel <=14)\n\t{\n\t\tChannelIDX = Channel - 1;\n\t\tpACS->Channel_Info_2G[1][ChannelIDX]++;\n\t\t\n\t\tif(pACS->Channel_Info_2G[1][ChannelIDX] >= 2)\n\t\t\tpACS->Channel_Info_2G[0][ChannelIDX] = (pACS->Channel_Info_2G[0][ChannelIDX] >> 1) + \n\t\t\t(pACS->Channel_Info_2G[0][ChannelIDX] >> 2) + (pDM_Odm->NHM_cnt_0>>2);\n\t\telse\n\t\t\tpACS->Channel_Info_2G[0][ChannelIDX] = pDM_Odm->NHM_cnt_0;\n\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelect(): NHM_cnt_0 = %d \\n\", pDM_Odm->NHM_cnt_0));\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelect(): Channel_Info[0][%d] = %d, Channel_Info[1][%d] = %d\\n\", ChannelIDX, pACS->Channel_Info_2G[0][ChannelIDX], ChannelIDX, pACS->Channel_Info_2G[1][ChannelIDX]));\n\n\t\tfor(SearchIDX = 0; SearchIDX < ODM_MAX_CHANNEL_2G; SearchIDX++)\n\t\t{\n\t\t\tif(pACS->Channel_Info_2G[1][SearchIDX] != 0)\n\t\t\t{\n\t\t\t\tif(pACS->Channel_Info_2G[0][SearchIDX] >= MaxScore)\n\t\t\t\t{\n\t\t\t\t\tMaxScore = pACS->Channel_Info_2G[0][SearchIDX];\n\t\t\t\t\tpACS->CleanChannel_2G = SearchIDX+1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"(1)odm_AutoChannelSelect(): 2G: CleanChannel_2G = %d, MaxScore = %d \\n\", \n\t\t\tpACS->CleanChannel_2G, MaxScore));\n\n\t}\n\telse if(Channel >= 36)\n\t{\n\t\t// Need to do\n\t\tpACS->CleanChannel_5G = Channel;\n\t}\n#endif\n}\n\n#if ( DM_ODM_SUPPORT_TYPE & ODM_AP )\n\nVOID\nphydm_AutoChannelSelectSettingAP(\n    IN  PVOID   pDM_VOID,\n    IN  u4Byte  setting,             // 0: STORE_DEFAULT_NHM_SETTING; 1: RESTORE_DEFAULT_NHM_SETTING, 2: ACS_NHM_SETTING\n    IN  u4Byte  acs_step\n)\n{\n    PDM_ODM_T           pDM_Odm = (PDM_ODM_T)pDM_VOID;\n    prtl8192cd_priv       priv           = pDM_Odm->priv;\n    PACS                    pACS         = &pDM_Odm->DM_ACS;\n\n    ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"odm_AutoChannelSelectSettingAP()=========> \\n\"));\n\n    //3 Store Default Setting\n    if(setting == STORE_DEFAULT_NHM_SETTING)\n    {\n        ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"STORE_DEFAULT_NHM_SETTING\\n\"));\n    \n        if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)     // store Reg0x990, Reg0x994, Reg0x998, Reg0x99C, Reg0x9a0\n        {\n            pACS->Reg0x990 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC);                // Reg0x990\n            pACS->Reg0x994 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC);           // Reg0x994\n            pACS->Reg0x998 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC);       // Reg0x998\n            pACS->Reg0x99C = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC);       // Reg0x99c\n            pACS->Reg0x9A0 = ODM_Read1Byte(pDM_Odm, ODM_REG_NHM_TH8_11AC);                   // Reg0x9a0, u1Byte            \n        }\n        else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n        {\n            pACS->Reg0x890 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N);             // Reg0x890\n            pACS->Reg0x894 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N);                  // Reg0x894\n            pACS->Reg0x898 = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N);         // Reg0x898\n            pACS->Reg0x89C = ODM_Read4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N);         // Reg0x89c\n            pACS->Reg0xE28 = ODM_Read1Byte(pDM_Odm, ODM_REG_NHM_TH8_11N);                     // Reg0xe28, u1Byte    \n        }\n    }\n\n    //3 Restore Default Setting\n    else if(setting == RESTORE_DEFAULT_NHM_SETTING)\n    {\n        ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"RESTORE_DEFAULT_NHM_SETTING\\n\"));\n        \n        if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)     // store Reg0x990, Reg0x994, Reg0x998, Reg0x99C, Reg0x9a0\n        {\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC,          pACS->Reg0x990);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC,     pACS->Reg0x994);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, pACS->Reg0x998);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, pACS->Reg0x99C);\n            ODM_Write1Byte(pDM_Odm, ODM_REG_NHM_TH8_11AC,             pACS->Reg0x9A0);   \n        }\n        else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n        {\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N,     pACS->Reg0x890);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N,          pACS->Reg0x894);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, pACS->Reg0x898);\n            ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, pACS->Reg0x89C);\n            ODM_Write1Byte(pDM_Odm, ODM_REG_NHM_TH8_11N,             pACS->Reg0xE28); \n        }        \n    }\n\n    //3 ACS Setting\n    else if(setting == ACS_NHM_SETTING)\n    {        \n        ODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"ACS_NHM_SETTING\\n\"));\n        u2Byte  period;\n        period = 0x61a8;\n        pACS->ACS_Step = acs_step;\n            \n        if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n        {   \n            //4 Set NHM period, 0x990[31:16]=0x61a8, Time duration for NHM unit: 4us, 0x61a8=100ms\n            ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, period);\n            //4 Set NHM ignore_cca=1, ignore_txon=1, ccx_en=0\n            ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC,BIT8|BIT9|BIT10, 3);\n            \n            if(pACS->ACS_Step == 0)\n            {\n                //4 Set IGI\n                ODM_SetBBReg(pDM_Odm,0xc50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x3E);\n                if (get_rf_mimo_mode(priv) != MIMO_1T1R)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm,0xe50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x3E);\n                    \n                //4 Set ACS NHM threshold\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0x82786e64);\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffff8c);\n                ODM_Write1Byte(pDM_Odm, ODM_REG_NHM_TH8_11AC, 0xff);\n                ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff);\n                \n            }\n            else if(pACS->ACS_Step == 1)\n            {\n                //4 Set IGI\n                ODM_SetBBReg(pDM_Odm,0xc50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x2A);\n                if (get_rf_mimo_mode(priv) != MIMO_1T1R)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm,0xe50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x2A);\n\n                //4 Set ACS NHM threshold\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0x5a50463c);\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffff64);\n                \n            }\n\n        }\n        else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n        {\n            //4 Set NHM period, 0x894[31:16]=0x61a8, Time duration for NHM unit: 4us, 0x61a8=100ms\n            ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, period);\n            //4 Set NHM ignore_cca=1, ignore_txon=1, ccx_en=0\n            ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N,BIT8|BIT9|BIT10, 3);\n            \n            if(pACS->ACS_Step == 0)\n            {\n                //4 Set IGI\n                ODM_SetBBReg(pDM_Odm,0xc50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x3E);\n                if (get_rf_mimo_mode(priv) != MIMO_1T1R)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm,0xc58,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x3E);\n            \n                //4 Set ACS NHM threshold\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0x82786e64);\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffff8c);\n                ODM_Write1Byte(pDM_Odm, ODM_REG_NHM_TH8_11N, 0xff);\n                ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff);\n                \n            }\n            else if(pACS->ACS_Step == 1)\n            {\n                //4 Set IGI\n                ODM_SetBBReg(pDM_Odm,0xc50,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x2A);\n                if (get_rf_mimo_mode(priv) != MIMO_1T1R)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm,0xc58,BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6,0x2A);\n            \n                //4 Set ACS NHM threshold\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0x5a50463c);\n                ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffff64);\n\n            }            \n        }\n    }\t\n\t\n}\n\nVOID\nphydm_GetNHMStatisticsAP(\n    IN  PVOID       pDM_VOID,\n    IN  u4Byte      idx,                // @ 2G, Real channel number = idx+1\n    IN  u4Byte      acs_step\n)\n{\n    PDM_ODM_T\t    pDM_Odm = (PDM_ODM_T)pDM_VOID;\n    prtl8192cd_priv     priv    = pDM_Odm->priv;\n    PACS                  pACS    = &pDM_Odm->DM_ACS;\n    u4Byte                value32 = 0;\n    u1Byte                i;\n\n    pACS->ACS_Step = acs_step;\n\n    if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n    {\n        //4 Check if NHM result is ready        \n        for (i=0; i<20; i++) {\n            \n            ODM_delay_ms(1);\n            if ( ODM_GetBBReg(pDM_Odm,rFPGA0_PSDReport,BIT17) )\n                break;\n        }\n        \n        //4 Get NHM Statistics        \n        if ( pACS->ACS_Step==1 ) {\n            \n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT7_TO_CNT4_11N);\n            \n            pACS->NHM_Cnt[idx][9] = (value32 & bMaskByte1) >> 8;\n            pACS->NHM_Cnt[idx][8] = (value32 & bMaskByte0);\n\n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT_11N);    // ODM_REG_NHM_CNT3_TO_CNT0_11N\n\n            pACS->NHM_Cnt[idx][7] = (value32 & bMaskByte3) >> 24;\n            pACS->NHM_Cnt[idx][6] = (value32 & bMaskByte2) >> 16;\n            pACS->NHM_Cnt[idx][5] = (value32 & bMaskByte1) >> 8;\n\n        } else if (pACS->ACS_Step==2) {\n        \n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT_11N);   // ODM_REG_NHM_CNT3_TO_CNT0_11N\n\n            pACS->NHM_Cnt[idx][4] = ODM_Read1Byte(pDM_Odm, ODM_REG_NHM_CNT7_TO_CNT4_11N);            \n            pACS->NHM_Cnt[idx][3] = (value32 & bMaskByte3) >> 24;\n            pACS->NHM_Cnt[idx][2] = (value32 & bMaskByte2) >> 16;\n            pACS->NHM_Cnt[idx][1] = (value32 & bMaskByte1) >> 8;\n            pACS->NHM_Cnt[idx][0] = (value32 & bMaskByte0);\n        }\n    }\n    else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n    {\n        //4 Check if NHM result is ready        \n        for (i=0; i<20; i++) {\n            \n            ODM_delay_ms(1);\n            if (ODM_GetBBReg(pDM_Odm,ODM_REG_NHM_DUR_READY_11AC,BIT17))\n                break;\n        }\n    \n        if ( pACS->ACS_Step==1 ) {\n            \n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT7_TO_CNT4_11AC);\n            \n            pACS->NHM_Cnt[idx][9] = (value32 & bMaskByte1) >> 8;\n            pACS->NHM_Cnt[idx][8] = (value32 & bMaskByte0);\n\n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT_11AC);     // ODM_REG_NHM_CNT3_TO_CNT0_11AC\n\n            pACS->NHM_Cnt[idx][7] = (value32 & bMaskByte3) >> 24;\n            pACS->NHM_Cnt[idx][6] = (value32 & bMaskByte2) >> 16;\n            pACS->NHM_Cnt[idx][5] = (value32 & bMaskByte1) >> 8;\n\n        } else if (pACS->ACS_Step==2) {\n        \n            value32 = ODM_Read4Byte(pDM_Odm,ODM_REG_NHM_CNT_11AC);      // ODM_REG_NHM_CNT3_TO_CNT0_11AC\n\n            pACS->NHM_Cnt[idx][4] = ODM_Read1Byte(pDM_Odm, ODM_REG_NHM_CNT7_TO_CNT4_11AC);            \n            pACS->NHM_Cnt[idx][3] = (value32 & bMaskByte3) >> 24;\n            pACS->NHM_Cnt[idx][2] = (value32 & bMaskByte2) >> 16;\n            pACS->NHM_Cnt[idx][1] = (value32 & bMaskByte1) >> 8;\n            pACS->NHM_Cnt[idx][0] = (value32 & bMaskByte0);\n        }            \n    }\n\n}\n\n\n//#define ACS_DEBUG_INFO //acs debug default off\n/*\nint phydm_AutoChannelSelectAP( \n    IN   PVOID   pDM_VOID,\n    IN   u4Byte  ACS_Type,                      // 0: RXCount_Type, 1:NHM_Type\n    IN   u4Byte  available_chnl_num        // amount of all channels\n    )\n{\n    PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPACS                    pACS    = &pDM_Odm->DM_ACS;\n    prtl8192cd_priv\t\t\tpriv    = pDM_Odm->priv;\n    \n    static u4Byte           score2G[MAX_2G_CHANNEL_NUM], score5G[MAX_5G_CHANNEL_NUM];\n    u4Byte                  score[MAX_BSS_NUM], use_nhm = 0;\n    u4Byte                  minScore=0xffffffff;\n    u4Byte                  tmpScore, tmpIdx=0;\n    u4Byte                  traffic_check = 0;\n    u4Byte                  fa_count_weighting = 1;\n    int                     i, j, idx=0, idx_2G_end=-1, idx_5G_begin=-1, minChan=0;\n\tstruct bss_desc *pBss=NULL;\n\n#ifdef _DEBUG_RTL8192CD_\n\tchar tmpbuf[400];\n\tint len=0;\n#endif\n\n\tmemset(score2G, '\\0', sizeof(score2G));\n\tmemset(score5G, '\\0', sizeof(score5G));\n\n\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\tif (priv->available_chnl[i] <= 14)\n\t\t\tidx_2G_end = i;\n\t\telse\n\t\t\tbreak;\n\t}\n\n\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\tif (priv->available_chnl[i] > 14) {\n\t\t\tidx_5G_begin = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n// DELETE\n#ifndef CONFIG_RTL_NEW_AUTOCH\n\tfor (i=0; i<priv->site_survey->count; i++) {\n\t\tpBss = &priv->site_survey->bss[i];\n\t\tfor (idx=0; idx<priv->available_chnl_num; idx++) {\n\t\t\tif (pBss->channel == priv->available_chnl[idx]) {\n\t\t\t\tif (pBss->channel <= 14)\n\t\t\t\t\tsetChannelScore(idx, score2G, 0, MAX_2G_CHANNEL_NUM-1);\n\t\t\t\telse\n\t\t\t\t\tscore5G[idx - idx_5G_begin] += 5;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n\tif (idx_2G_end >= 0)\n\t\tfor (i=0; i<=idx_2G_end; i++)\n\t\t\tscore[i] = score2G[i];\n\tif (idx_5G_begin >= 0)\n\t\tfor (i=idx_5G_begin; i<priv->available_chnl_num; i++)\n\t\t\tscore[i] = score5G[i - idx_5G_begin];\n\t\t\n#ifdef CONFIG_RTL_NEW_AUTOCH\n\t{\n\t\tu4Byte y, ch_begin=0, ch_end= priv->available_chnl_num;\n\n\t\tu4Byte do_ap_check = 1, ap_ratio = 0;\n\t\t\n\t\tif (idx_2G_end >= 0) \n\t\t\tch_end = idx_2G_end+1;\n\t\tif (idx_5G_begin >= 0)  \n\t\t\tch_begin = idx_5G_begin;\n\n#ifdef ACS_DEBUG_INFO//for debug\n\t\tprintk(\"\\n\");\n\t\tfor (y=ch_begin; y<ch_end; y++)\n\t\t\tprintk(\"1. init: chnl[%d] 20M_rx[%d] 40M_rx[%d] fa_cnt[%d] score[%d]\\n\",\n\t\t\t\tpriv->available_chnl[y], \n\t\t\t\tpriv->chnl_ss_mac_rx_count[y], \n\t\t\t\tpriv->chnl_ss_mac_rx_count_40M[y],\n\t\t\t\tpriv->chnl_ss_fa_count[y],\n\t\t\t\tscore[y]);\n\t\tprintk(\"\\n\");\n#endif\n\n#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE)\n        if( pDM_Odm->SupportICType&(ODM_RTL8188E|ODM_RTL8192E)&& priv->pmib->dot11RFEntry.acs_type )\n\t\t{\n\t\t\tu4Byte tmp_score[MAX_BSS_NUM];\n\t\t\tmemcpy(tmp_score, score, sizeof(score));\n\t\t\tif (find_clean_channel(priv, ch_begin, ch_end, tmp_score)) {\n\t\t\t\t//memcpy(score, tmp_score, sizeof(score));\n#ifdef _DEBUG_RTL8192CD_\n\t\t\t\tprintk(\"!! Found clean channel, select minimum FA channel\\n\");\n#endif\n\t\t\t\tgoto USE_CLN_CH;\n\t\t\t}\n#ifdef _DEBUG_RTL8192CD_\n\t\t\tprintk(\"!! Not found clean channel, use NHM algorithm\\n\");\n#endif\n\t\t\tuse_nhm = 1;\nUSE_CLN_CH:\n\t\t\tfor (y=ch_begin; y<ch_end; y++) {\n\t\t\t\tfor (i=0; i<=9; i++) {\n\t\t\t\t\tu4Byte val32 = priv->nhm_cnt[y][i];\n\t\t\t\t\tfor (j=0; j<i; j++)\n\t\t\t\t\t\tval32 *= 3;\n\t\t\t\t\tscore[y] += val32;\n\t\t\t\t}\n\n#ifdef _DEBUG_RTL8192CD_\t\t\t\t\n\t\t\t\tprintk(\"nhm_cnt_%d: H<-[ %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d]->L, score: %d\\n\", \n\t\t\t\t\ty+1, priv->nhm_cnt[y][9], priv->nhm_cnt[y][8], priv->nhm_cnt[y][7], \n\t\t\t\t\tpriv->nhm_cnt[y][6], priv->nhm_cnt[y][5], priv->nhm_cnt[y][4],\n\t\t\t\t\tpriv->nhm_cnt[y][3], priv->nhm_cnt[y][2], priv->nhm_cnt[y][1],\n\t\t\t\t\tpriv->nhm_cnt[y][0], score[y]);\n#endif\n\t\t\t}\n\n\t\t\tif (!use_nhm)\n\t\t\t\tmemcpy(score, tmp_score, sizeof(score));\n\t\t\t\n\t\t\tgoto choose_ch;\n\t\t}\n#endif\n\n            // For each channel, weighting behind channels with MAC RX counter\n            //For each channel, weighting the channel with FA counter\n\n\t\tfor (y=ch_begin; y<ch_end; y++) {\n\t\t\tscore[y] += 8 * priv->chnl_ss_mac_rx_count[y];\n\t\t\tif (priv->chnl_ss_mac_rx_count[y] > 30)\n\t\t\t\tdo_ap_check = 0;\n\t\t\tif( priv->chnl_ss_mac_rx_count[y] > MAC_RX_COUNT_THRESHOLD )\n\t\t\t\ttraffic_check = 1;\n\t\t\t\n#ifdef RTK_5G_SUPPORT\n\t\t\tif (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)\n#endif\n\t\t\t{\n\t\t\t\tif ((int)(y-4) >= (int)ch_begin)\n\t\t\t\t\tscore[y-4] += 2 * priv->chnl_ss_mac_rx_count[y];\t\t\t\t\n\t\t\t\tif ((int)(y-3) >= (int)ch_begin)\n\t\t\t\t\tscore[y-3] += 8 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y-2) >= (int)ch_begin)\n\t\t\t\t\tscore[y-2] += 8 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\tscore[y-1] += 10 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\tscore[y+1] += 10 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y+2) < (int)ch_end)\n\t\t\t\t\tscore[y+2] += 8 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y+3) < (int)ch_end)\n\t\t\t\t\tscore[y+3] += 8 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t\tif ((int)(y+4) < (int)ch_end)\n\t\t\t\t\tscore[y+4] += 2 * priv->chnl_ss_mac_rx_count[y];\n\t\t\t}\n\n\t\t\t//this is for CH_LOAD caculation\n\t\t\tif( priv->chnl_ss_cca_count[y] > priv->chnl_ss_fa_count[y])\n\t\t\t\tpriv->chnl_ss_cca_count[y]-= priv->chnl_ss_fa_count[y];\n\t\t\telse\n\t\t\t\tpriv->chnl_ss_cca_count[y] = 0;\n\t\t}\n\n#ifdef ACS_DEBUG_INFO//for debug\n\t\tprintk(\"\\n\");\n\t\tfor (y=ch_begin; y<ch_end; y++)\n\t\t\tprintk(\"2. after 20M check: chnl[%d] score[%d]\\n\",priv->available_chnl[y], score[y]);\n\t\tprintk(\"\\n\");\n#endif\t\n\n\t\tfor (y=ch_begin; y<ch_end; y++) {\n\t\t\tif (priv->chnl_ss_mac_rx_count_40M[y]) {\n\t\t\t\tscore[y] += 5 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\tif (priv->chnl_ss_mac_rx_count_40M[y] > 30)\n\t\t\t\t\tdo_ap_check = 0;\n\t\t\t\tif( priv->chnl_ss_mac_rx_count_40M[y] > MAC_RX_COUNT_THRESHOLD )\n\t\t\t\t\ttraffic_check = 1;\n\t\t\t\t\n#ifdef RTK_5G_SUPPORT\n\t\t\t\tif (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)\n#endif\n\t\t\t\t{\n\t\t\t\t\tif ((int)(y-6) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-6] += 1 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y-5) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-5] += 4 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y-4) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-4] += 4 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y-3) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-3] += 5 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y-2) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-2] += (5 * priv->chnl_ss_mac_rx_count_40M[y])/2;\n\t\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\t\tscore[y-1] += 5 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\t\tscore[y+1] += 5 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y+2) < (int)ch_end)\n\t\t\t\t\t\tscore[y+2] += (5 * priv->chnl_ss_mac_rx_count_40M[y])/2;\n\t\t\t\t\tif ((int)(y+3) < (int)ch_end)\n\t\t\t\t\t\tscore[y+3] += 5 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y+4) < (int)ch_end)\n\t\t\t\t\t\tscore[y+4] += 4 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y+5) < (int)ch_end)\n\t\t\t\t\t\tscore[y+5] += 4 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t\tif ((int)(y+6) < (int)ch_end)\n\t\t\t\t\t\tscore[y+6] += 1 * priv->chnl_ss_mac_rx_count_40M[y];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#ifdef ACS_DEBUG_INFO//for debug\n\t\tprintk(\"\\n\");\n\t\tfor (y=ch_begin; y<ch_end; y++)\n\t\t\tprintk(\"3. after 40M check: chnl[%d] score[%d]\\n\",priv->available_chnl[y], score[y]);\n\t\tprintk(\"\\n\");\n\t\tprintk(\"4. do_ap_check=%d traffic_check=%d\\n\", do_ap_check, traffic_check);\n\t\tprintk(\"\\n\");\n#endif\n\n\t\tif( traffic_check == 0)\n\t\t\tfa_count_weighting = 5;\n\t\telse\n\t\t\tfa_count_weighting = 1;\n\n\t\tfor (y=ch_begin; y<ch_end; y++) {\n\t\t\tscore[y] += fa_count_weighting * priv->chnl_ss_fa_count[y];\n\t\t}\n\n#ifdef ACS_DEBUG_INFO//for debug\n\t\tprintk(\"\\n\");\n\t\tfor (y=ch_begin; y<ch_end; y++)\n\t\t\tprintk(\"5. after fa check: chnl[%d] score[%d]\\n\",priv->available_chnl[y], score[y]);\n\t\tprintk(\"\\n\");\n#endif\t\t\t\n\n\t\tif (do_ap_check) {\n\t\t\tfor (i=0; i<priv->site_survey->count; i++) {\t\t\t\t\n\t\t\t\tpBss = &priv->site_survey->bss[i];\n\t\t\t\tfor (y=ch_begin; y<ch_end; y++) {\n\t\t\t\t\tif (pBss->channel == priv->available_chnl[y]) {\n\t\t\t\t\t\tif (pBss->channel <= 14) {\n#ifdef ACS_DEBUG_INFO//for debug\n\t\t\t\t\t\tprintk(\"\\n\");\n\t\t\t\t\t\tprintk(\"chnl[%d] has ap rssi=%d bw[0x%02x]\\n\",\n\t\t\t\t\t\t\tpBss->channel, pBss->rssi, pBss->t_stamp[1]);\n\t\t\t\t\t\tprintk(\"\\n\");\n#endif\n\t\t\t\t\t\t\tif (pBss->rssi > 60)\n\t\t\t\t\t\t\t\tap_ratio = 4;\n\t\t\t\t\t\t\telse if (pBss->rssi > 35)\n\t\t\t\t\t\t\t\tap_ratio = 2;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tap_ratio = 1;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif ((pBss->t_stamp[1] & 0x6) == 0) {\n\t\t\t\t\t\t\t\tscore[y] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-4) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-4] += 10 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-3) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-3] += 20 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-2) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-2] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-1] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+1] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+2) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+2] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+3) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+3] += 20 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+4) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+4] += 10 * ap_ratio;\n\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\telse if ((pBss->t_stamp[1] & 0x4) == 0) {\n\t\t\t\t\t\t\t\tscore[y] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-3) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-3] += 20 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-2) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-2] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-1] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+1] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+2) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+2] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+3) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+3] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+4) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+4] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+5) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+5] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+6) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+6] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+7) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+7] += 20 * ap_ratio;\t\n\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tscore[y] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-7) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-7] += 20 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-6) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-6] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-5) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-5] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-4) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-4] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-3) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-3] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-2) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-2] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-1] += 50 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+1] += 40 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+2) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+2] += 30 * ap_ratio;\n\t\t\t\t\t\t\t\tif ((int)(y+3) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+3] += 20 * ap_ratio;\n\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif ((pBss->t_stamp[1] & 0x6) == 0) {\n\t\t\t\t\t\t\t\tscore[y] += 500;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if ((pBss->t_stamp[1] & 0x4) == 0) {\n\t\t\t\t\t\t\t\tscore[y] += 500;\n\t\t\t\t\t\t\t\tif ((int)(y+1) < (int)ch_end)\n\t\t\t\t\t\t\t\t\tscore[y+1] += 500;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\t\n\t\t\t\t\t\t\t\tscore[y] += 500;\n\t\t\t\t\t\t\t\tif ((int)(y-1) >= (int)ch_begin)\n\t\t\t\t\t\t\t\t\tscore[y-1] += 500;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#ifdef ACS_DEBUG_INFO//for debug\n\t\tprintk(\"\\n\");\n\t\tfor (y=ch_begin; y<ch_end; y++)\n\t\t\tprintk(\"6. after ap check: chnl[%d]:%d\\n\", priv->available_chnl[y],score[y]);\n\t\tprintk(\"\\n\");\n#endif\t\t\n\n#ifdef \tSS_CH_LOAD_PROC\n\n\t\t// caculate noise level -- suggested by wilson\n\t\tfor (y=ch_begin; y<ch_end; y++)  {\n\t\t\tint fa_lv=0, cca_lv=0;\n\t\t\tif (priv->chnl_ss_fa_count[y]>1000) {\n\t\t\t\tfa_lv = 100;\n\t\t\t} else if (priv->chnl_ss_fa_count[y]>500) {\n\t\t\t\tfa_lv = 34 * (priv->chnl_ss_fa_count[y]-500) / 500 + 66;\n\t\t\t} else if (priv->chnl_ss_fa_count[y]>200) {\n\t\t\t\tfa_lv = 33 * (priv->chnl_ss_fa_count[y] - 200) / 300 + 33;\n\t\t\t} else if (priv->chnl_ss_fa_count[y]>100) {\n\t\t\t\tfa_lv = 18 * (priv->chnl_ss_fa_count[y] - 100) / 100 + 15;\n\t\t\t} else {\n\t\t\t\tfa_lv = 15 * priv->chnl_ss_fa_count[y] / 100;\n\t\t\t} \n\t\t\tif (priv->chnl_ss_cca_count[y]>400) {\n\t\t\t\tcca_lv = 100;\n\t\t\t} else if (priv->chnl_ss_cca_count[y]>200) {\n\t\t\t\tcca_lv = 34 * (priv->chnl_ss_cca_count[y] - 200) / 200 + 66;\n\t\t\t} else if (priv->chnl_ss_cca_count[y]>80) {\n\t\t\t\tcca_lv = 33 * (priv->chnl_ss_cca_count[y] - 80) / 120 + 33;\n\t\t\t} else if (priv->chnl_ss_cca_count[y]>40) {\n\t\t\t\tcca_lv = 18 * (priv->chnl_ss_cca_count[y] - 40) / 40 + 15;\n\t\t\t} else {\n\t\t\t\tcca_lv = 15 * priv->chnl_ss_cca_count[y] / 40;\n\t\t\t}\n\n\t\t\tpriv->chnl_ss_load[y] = (((fa_lv > cca_lv)? fa_lv : cca_lv)*75+((score[y]>100)?100:score[y])*25)/100;\n\n\t\t\tDEBUG_INFO(\"ch:%d f=%d (%d), c=%d (%d), fl=%d, cl=%d, sc=%d, cu=%d\\n\", \n\t\t\t\t\tpriv->available_chnl[y],\n\t\t\t\t\tpriv->chnl_ss_fa_count[y], fa_thd,\n\t\t\t\t\tpriv->chnl_ss_cca_count[y], cca_thd,\n\t\t\t\t\tfa_lv, \n\t\t\t\t\tcca_lv,\n\t\t\t\t\tscore[y],\t\t\t\t\t\n\t\t\t\t\tpriv->chnl_ss_load[y]);\n\t\t\t\n\t\t}\t\t\n#endif\t\t\n\t}\n#endif\n\nchoose_ch:\n\n#ifdef DFS\n\t// heavy weighted DFS channel\n\tif (idx_5G_begin >= 0){\n\t\tfor (i=idx_5G_begin; i<priv->available_chnl_num; i++) {\n\t\t\tif (!priv->pmib->dot11DFSEntry.disable_DFS && is_DFS_channel(priv->available_chnl[i]) \n\t\t\t&& (score[i]!= 0xffffffff)){\n\t\t\t\t\tscore[i] += 1600; \n\t\t}\n\t}\n\t}\n#endif\n\n\n//prevent Auto Channel selecting wrong channel in 40M mode-----------------\n\tif ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N)\n\t\t&& priv->pshare->is_40m_bw) {\n#if 0\n\t\tif (GET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset == 1) {\n\t\t\t//Upper Primary Channel, cannot select the two lowest channels\n\t\t\tif (priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) {\n\t\t\t\tscore[0] = 0xffffffff;\n\t\t\t\tscore[1] = 0xffffffff;\n\t\t\t\tscore[2] = 0xffffffff;\n\t\t\t\tscore[3] = 0xffffffff;\n\t\t\t\tscore[4] = 0xffffffff;\n\n\t\t\t\tscore[13] = 0xffffffff;\n\t\t\t\tscore[12] = 0xffffffff;\n\t\t\t\tscore[11] = 0xffffffff;\n\t\t\t}\n\n//\t\t\tif (priv->pmib->dot11BssType.net_work_type & WIRELESS_11A) {\n//\t\t\t\tscore[idx_5G_begin] = 0xffffffff;\n//\t\t\t\tscore[idx_5G_begin + 1] = 0xffffffff;\n//\t\t\t}\n\t\t}\n\t\telse if (GET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset == 2) {\n\t\t\t//Lower Primary Channel, cannot select the two highest channels\n\t\t\tif (priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) {\n\t\t\t\tscore[0] = 0xffffffff;\n\t\t\t\tscore[1] = 0xffffffff;\n\t\t\t\tscore[2] = 0xffffffff;\n\n\t\t\t\tscore[13] = 0xffffffff;\n\t\t\t\tscore[12] = 0xffffffff;\n\t\t\t\tscore[11] = 0xffffffff;\n\t\t\t\tscore[10] = 0xffffffff;\n\t\t\t\tscore[9] = 0xffffffff;\n\t\t\t}\n\n//\t\t\tif (priv->pmib->dot11BssType.net_work_type & WIRELESS_11A) {\n//\t\t\t\tscore[priv->available_chnl_num - 2] = 0xffffffff;\n//\t\t\t\tscore[priv->available_chnl_num - 1] = 0xffffffff;\n//\t\t\t}\n\t\t}\n#endif\n\t\tfor (i=0; i<=idx_2G_end; ++i)\n\t\t\tif (priv->available_chnl[i] == 14)\n\t\t\t\tscore[i] = 0xffffffff;\t\t// mask chan14\n\n#ifdef RTK_5G_SUPPORT\n\t\tif (idx_5G_begin >= 0) {\n\t\t\tfor (i=idx_5G_begin; i<priv->available_chnl_num; i++) {\n\t\t\t\tint ch = priv->available_chnl[i];\n\t\t\t\tif(priv->available_chnl[i] > 144) \n\t\t\t\t\t--ch;\n\t\t\t\tif((ch%4) || ch==140 || ch == 164 )\t//mask ch 140, ch 165, ch 184...\n\t\t\t\t\tscore[i] = 0xffffffff;\n\t\t\t}\n\t\t}\n#endif\n\n\t\t\n\t}\n\n\tif (priv->pmib->dot11RFEntry.disable_ch1213) {\n\t\tfor (i=0; i<=idx_2G_end; ++i) {\n\t\t\tint ch = priv->available_chnl[i];\n\t\t\tif ((ch == 12) || (ch == 13))\n\t\t\t\tscore[i] = 0xffffffff;\n\t\t}\n\t}\n\n\tif (((priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_GLOBAL) ||\n\t\t\t(priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_WORLD_WIDE)) &&\n\t\t (idx_2G_end >= 11) && (idx_2G_end < 14)) {\n\t\tscore[13] = 0xffffffff;\t// mask chan14\n\t\tscore[12] = 0xffffffff; // mask chan13\n\t\tscore[11] = 0xffffffff; // mask chan12\n\t}\n\t\n//------------------------------------------------------------------\n\n#ifdef _DEBUG_RTL8192CD_\n\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\tlen += sprintf(tmpbuf+len, \"ch%d:%u \", priv->available_chnl[i], score[i]);\t\t\n\t}\n\tstrcat(tmpbuf, \"\\n\");\n\tpanic_printk(\"%s\", tmpbuf);\n\n#endif\n\n\tif ( (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)\n\t\t&& (priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_80)) \n\t{\n\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\tif (is80MChannel(priv->available_chnl, priv->available_chnl_num, priv->available_chnl[i])) {\n\t\t\t\ttmpScore = 0;\n\t\t\t\tfor (j=0; j<4; j++) {\n\t\t\t\t\tif ((tmpScore != 0xffffffff) && (score[i+j] != 0xffffffff))\n\t\t\t\t\t\ttmpScore += score[i+j];\n\t\t\t\t\telse\n\t\t\t\t\t\ttmpScore = 0xffffffff;\n\t\t\t\t}\n\t\t\t\ttmpScore = tmpScore / 4;\n\t\t\t\tif (minScore > tmpScore) {\n\t\t\t\t\tminScore = tmpScore;\n\n\t\t\t\t\ttmpScore = 0xffffffff;\n\t\t\t\t\tfor (j=0; j<4; j++) {\n\t\t\t\t\t\tif (score[i+j] < tmpScore) {\n\t\t\t\t\t\t\ttmpScore = score[i+j];\n\t\t\t\t\t\t\ttmpIdx = i+j;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tidx = tmpIdx;\n\t\t\t\t}\n\t\t\t\ti += 3;\n\t\t\t}\n\t\t}\n\t\tif (minScore == 0xffffffff) {\n\t\t\t// there is no 80M channels\n\t\t\tpriv->pshare->is_40m_bw = HT_CHANNEL_WIDTH_20;\n\t\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\t\tif (score[i] < minScore) {\n\t\t\t\t\tminScore = score[i];\n\t\t\t\t\tidx = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if( (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)\n\t\t\t&& (priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_20_40))\n \t{\n\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\tif(is40MChannel(priv->available_chnl,priv->available_chnl_num,priv->available_chnl[i])) {\n\t\t\t\ttmpScore = 0;\n\t\t\t\tfor(j=0;j<2;j++) {\n\t\t\t\t\tif ((tmpScore != 0xffffffff) && (score[i+j] != 0xffffffff))\n\t\t\t\t\t\ttmpScore += score[i+j];\n\t\t\t\t\telse\n\t\t\t\t\t\ttmpScore = 0xffffffff;\n\t\t\t\t}\n\t\t\t\ttmpScore = tmpScore / 2;\n\t\t\t\tif(minScore > tmpScore) {\n\t\t\t\t\tminScore = tmpScore;\n\n\t\t\t\t\ttmpScore = 0xffffffff;\n\t\t\t\t\tfor (j=0; j<2; j++) {\n\t\t\t\t\t\tif (score[i+j] < tmpScore) {\n\t\t\t\t\t\t\ttmpScore = score[i+j];\n\t\t\t\t\t\t\ttmpIdx = i+j;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tidx = tmpIdx;\n\t\t\t\t}\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t\tif (minScore == 0xffffffff) {\n\t\t\t// there is no 40M channels\n\t\t\tpriv->pshare->is_40m_bw = HT_CHANNEL_WIDTH_20;\n\t\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\t\tif (score[i] < minScore) {\n\t\t\t\t\tminScore = score[i];\n\t\t\t\t\tidx = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if( (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G)\n\t\t\t&& (priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_20_40)\n\t\t\t&& (priv->available_chnl_num >= 8) )\n\t{\n\t\tu4Byte groupScore[14];\n\n\t\tmemset(groupScore, 0xff , sizeof(groupScore));\n\t\tfor (i=0; i<priv->available_chnl_num-4; i++) {\n\t\t\tif (score[i] != 0xffffffff && score[i+4] != 0xffffffff) {\n\t\t\t\tgroupScore[i] = score[i] + score[i+4];\n\t\t\t\tDEBUG_INFO(\"groupScore, ch %d,%d: %d\\n\", i+1, i+5, groupScore[i]);\n\t\t\t\tif (groupScore[i] < minScore) {\n#ifdef AUTOCH_SS_SPEEDUP\n\t\t\t\t\tif(priv->pmib->miscEntry.autoch_1611_enable)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(priv->available_chnl[i]==1 || priv->available_chnl[i]==6 || priv->available_chnl[i]==11)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tminScore = groupScore[i];\n\t\t\t\t\t\t\tidx = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n#endif\n\t\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\t\tminScore = groupScore[i];\n\t\t\t\t\t\tidx = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (score[idx] < score[idx+4]) {\n\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_ABOVE;\n\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_ABOVE;\t\t\t\n\t\t} else {\n\t\t\tidx = idx + 4;\n\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_BELOW;\n\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_BELOW;\t\t\t\n\t\t}\n\t}\n\telse \n\t{\n\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\tif (score[i] < minScore) {\n#ifdef AUTOCH_SS_SPEEDUP\n\t\t\t\tif(priv->pmib->miscEntry.autoch_1611_enable)\n\t\t\t\t{\n\t\t\t\t\tif(priv->available_chnl[i]==1 || priv->available_chnl[i]==6 || priv->available_chnl[i]==11)\n\t\t\t\t\t{\n\t\t\t\t\t\tminScore = score[i];\n\t\t\t\t\t\tidx = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tminScore = score[i];\n\t\t\t\t\tidx = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (IS_A_CUT_8881A(priv) &&\n\t\t(priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_80)) {\n\t\tif ((priv->available_chnl[idx] == 36) ||\n\t\t\t(priv->available_chnl[idx] == 52) ||\n\t\t\t(priv->available_chnl[idx] == 100) ||\n\t\t\t(priv->available_chnl[idx] == 116) ||\n\t\t\t(priv->available_chnl[idx] == 132) ||\n\t\t\t(priv->available_chnl[idx] == 149) ||\n\t\t\t(priv->available_chnl[idx] == 165))\n\t\t\tidx++;\n\t\telse if ((priv->available_chnl[idx] == 48) ||\n\t\t\t(priv->available_chnl[idx] == 64) ||\n\t\t\t(priv->available_chnl[idx] == 112) ||\n\t\t\t(priv->available_chnl[idx] == 128) ||\n\t\t\t(priv->available_chnl[idx] == 144) ||\n\t\t\t(priv->available_chnl[idx] == 161) ||\n\t\t\t(priv->available_chnl[idx] == 177))\n\t\t\tidx--;\n\t}\n\n\tminChan = priv->available_chnl[idx];\n\n\t// skip channel 14 if don't support ofdm\n\tif ((priv->pmib->dot11RFEntry.disable_ch14_ofdm) &&\n\t\t\t(minChan == 14)) {\n\t\tscore[idx] = 0xffffffff;\n\t\t\n\t\tminScore = 0xffffffff;\n\t\tfor (i=0; i<priv->available_chnl_num; i++) {\n\t\t\tif (score[i] < minScore) {\n\t\t\t\tminScore = score[i];\n\t\t\t\tidx = i;\n\t\t\t}\n\t\t}\n\t\tminChan = priv->available_chnl[idx];\n\t}\n\n#if 0\n\t//Check if selected channel available for 80M/40M BW or NOT ?\n\tif(priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)\n\t{\n\t\tif(priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_80)\n\t\t{\n\t\t\tif(!is80MChannel(priv->available_chnl,priv->available_chnl_num,minChan))\n\t\t\t{\n\t\t\t\t//printk(\"BW=80M, selected channel = %d is unavaliable! reduce to 40M\\n\", minChan);\n\t\t\t\t//priv->pmib->dot11nConfigEntry.dot11nUse40M = HT_CHANNEL_WIDTH_20_40;\n\t\t\t\tpriv->pshare->is_40m_bw = HT_CHANNEL_WIDTH_20_40;\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tif(priv->pmib->dot11nConfigEntry.dot11nUse40M == HT_CHANNEL_WIDTH_20_40)\n\t\t{\n\t\t\tif(!is40MChannel(priv->available_chnl,priv->available_chnl_num,minChan))\n\t\t\t{\n\t\t\t\t//printk(\"BW=40M, selected channel = %d is unavaliable! reduce to 20M\\n\", minChan);\n\t\t\t\t//priv->pmib->dot11nConfigEntry.dot11nUse40M = HT_CHANNEL_WIDTH_20;\n\t\t\t\tpriv->pshare->is_40m_bw = HT_CHANNEL_WIDTH_20;\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n#ifdef CONFIG_RTL_NEW_AUTOCH\n\tRTL_W32(RXERR_RPT, RXERR_RPT_RST);\n#endif\n\n// auto adjust contro-sideband\n\tif ((priv->pmib->dot11BssType.net_work_type & WIRELESS_11N)\n\t\t\t&& (priv->pshare->is_40m_bw ==1 || priv->pshare->is_40m_bw ==2)) {\n\n#ifdef RTK_5G_SUPPORT\n\t\tif (priv->pmib->dot11RFEntry.phyBandSelect & PHY_BAND_5G) {\n\t\t\tif( (minChan>144) ? ((minChan-1)%8) : (minChan%8)) {\n\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_ABOVE;\n\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_ABOVE;\n\t\t\t} else {\n\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_BELOW;\n\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_BELOW;\n\t\t\t}\n\n\t\t} else\n#endif\t\t\n\t\t{\n#if 0\n#ifdef CONFIG_RTL_NEW_AUTOCH\n\t\t\tunsigned int ch_max;\n\n\t\t\tif (priv->available_chnl[idx_2G_end] >= 13)\n\t\t\t\tch_max = 13;\n\t\t\telse\n\t\t\t\tch_max = priv->available_chnl[idx_2G_end];\n\n\t\t\tif ((minChan >= 5) && (minChan <= (ch_max-5))) {\n\t\t\t\tif (score[minChan+4] > score[minChan-4]) { // what if some channels were cancelled?\n\t\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_BELOW;\n\t\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_BELOW;\n\t\t\t\t} else {\n\t\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_ABOVE;\n\t\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_ABOVE;\n\t\t\t\t}\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tif (minChan < 5) {\n\t\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_ABOVE;\n\t\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_ABOVE;\n\t\t\t\t}\n\t\t\t\telse if (minChan > 7) {\n\t\t\t\t\tGET_MIB(priv)->dot11nConfigEntry.dot11n2ndChOffset = HT_2NDCH_OFFSET_BELOW;\n\t\t\t\t\tpriv->pshare->offset_2nd_chan\t= HT_2NDCH_OFFSET_BELOW;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t}\n//-----------------------\n\n#if defined(__ECOS) && defined(CONFIG_SDIO_HCI)\n\tpanic_printk(\"Auto channel choose ch:%d\\n\", minChan);\n#else\n#ifdef _DEBUG_RTL8192CD_\n\tpanic_printk(\"Auto channel choose ch:%d\\n\", minChan);\n#endif\n#endif\n#ifdef ACS_DEBUG_INFO//for debug\n\tprintk(\"7. minChan:%d 2nd_offset:%d\\n\", minChan, priv->pshare->offset_2nd_chan);\n#endif\n\n\treturn minChan;\n}\n*/\n\n#endif\n\nVOID\nphydm_CLMInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu2Byte\t\t\tsampleNum\t\t\t/*unit : 4us*/\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\t\t\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_TIME_PERIOD_11AC, bMaskLWord, sampleNum);\t/*4us sample 1 time*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11AC, BIT8, 0x1);\t\t\t\t\t\t\t/*Enable CCX for CLM*/\n\t} else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_TIME_PERIOD_11N, bMaskLWord, sampleNum);\t/*4us sample 1 time*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11N, BIT8, 0x1);\t\t\t\t\t\t\t\t/*Enable CCX for CLM*/\t\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"[%s] : CLM sampleNum = %d\\n\", __func__, sampleNum));\n\t\t\n}\n\nVOID\nphydm_CLMtrigger(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11AC, BIT0, 0x0);\t/*Trigger CLM*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11AC, BIT0, 0x1);\n\t} else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11N, BIT0, 0x0);\t/*Trigger CLM*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CLM_11N, BIT0, 0x1);\n\t}\n}\n\nBOOLEAN\nphydm_checkCLMready(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tvalue32 = 0;\n\tBOOLEAN\t\t\tret = FALSE;\n\t\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_CLM_RESULT_11AC, bMaskDWord);\t\t\t\t/*make sure CLM calc is ready*/\n\telse if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_CLM_READY_11N, bMaskDWord);\t\t\t\t/*make sure CLM calc is ready*/\n\n\tif (value32 & BIT16)\n\t\tret = TRUE;\n\telse\n\t\tret = FALSE;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"[%s] : CLM ready = %d\\n\", __func__, ret));\n\n\treturn ret;\n}\n\nu2Byte\nphydm_getCLMresult(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tvalue32 = 0;\n\tu2Byte\t\t\tresults = 0;\n\t\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_CLM_RESULT_11AC, bMaskDWord);\t\t\t\t/*read CLM calc result*/\n\telse if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_CLM_RESULT_11N, bMaskDWord);\t\t\t\t/*read CLM calc result*/\n\n\tresults = (u2Byte)(value32 & bMaskLWord);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ACS, ODM_DBG_LOUD, (\"[%s] : CLM result = %d\\n\", __func__, results));\n\t\n\treturn results;\n/*results are number of CCA times in sampleNum*/\n}\n\n"
  },
  {
    "path": "hal/phydm/phydm_acs.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMACS_H__\n#define    __PHYDMACS_H__\n\n#define ACS_VERSION\t\"1.0\"\n#define CLM_VERSION \"1.0\"\n\n#define ODM_MAX_CHANNEL_2G\t\t\t14\n#define ODM_MAX_CHANNEL_5G\t\t\t24\n\n// For phydm_AutoChannelSelectSettingAP()\n#define STORE_DEFAULT_NHM_SETTING               0\n#define RESTORE_DEFAULT_NHM_SETTING             1\n#define ACS_NHM_SETTING                         2\n\ntypedef struct _ACS_\n{\n\tBOOLEAN\t\tbForceACSResult;\n\tu1Byte\t\tCleanChannel_2G;\n\tu1Byte\t\tCleanChannel_5G;\n\tu2Byte\t\tChannel_Info_2G[2][ODM_MAX_CHANNEL_2G];\t\t//Channel_Info[1]: Channel Score, Channel_Info[2]:Channel_Scan_Times\n\tu2Byte\t\tChannel_Info_5G[2][ODM_MAX_CHANNEL_5G];\t\n\n#if ( DM_ODM_SUPPORT_TYPE & ODM_AP )    \n    u1Byte              ACS_Step;\n    // NHM Count 0-11\n    u1Byte              NHM_Cnt[14][11];\n\n    // AC-Series, for storing previous setting\n    u4Byte              Reg0x990; \n    u4Byte              Reg0x994;\n    u4Byte              Reg0x998;\n    u4Byte              Reg0x99C;\n    u1Byte              Reg0x9A0;   // u1Byte\n\n    // N-Series, for storing previous setting\n    u4Byte              Reg0x890; \n    u4Byte              Reg0x894;\n    u4Byte              Reg0x898;\n    u4Byte              Reg0x89C;\n    u1Byte              Reg0xE28;   // u1Byte\n#endif\n\n}ACS, *PACS;\n\n\nVOID\nodm_AutoChannelSelectInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nVOID\nodm_AutoChannelSelectReset(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nVOID\nodm_AutoChannelSelect(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tChannel\n);\n\nu1Byte\nODM_GetAutoChannelSelectResult(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tBand\n);\n\n#if ( DM_ODM_SUPPORT_TYPE & ODM_AP )\n\nVOID\nphydm_AutoChannelSelectSettingAP(\n    IN  PVOID   pDM_VOID,\n    IN  u4Byte  Setting,             // 0: STORE_DEFAULT_NHM_SETTING; 1: RESTORE_DEFAULT_NHM_SETTING, 2: ACS_NHM_SETTING\n    IN  u4Byte  acs_step        \n);\n\nVOID\nphydm_GetNHMStatisticsAP(\n    IN  PVOID       pDM_VOID,\n    IN  u4Byte      idx,                // @ 2G, Real channel number = idx+1\n    IN  u4Byte      acs_step\n);\n\n#endif  //#if ( DM_ODM_SUPPORT_TYPE & ODM_AP )\n\n\nVOID\nphydm_CLMInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu2Byte\t\t\tsampleNum\n);\n\nVOID\nphydm_CLMtrigger(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nBOOLEAN\nphydm_checkCLMready(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nu2Byte\nphydm_getCLMresult(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\n\n#endif  //#ifndef\t__PHYDMACS_H__"
  },
  {
    "path": "hal/phydm/phydm_adaptivity.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n#if WPP_SOFTWARE_TRACE\n#include \"PhyDM_Adaptivity.tmh\"\n#endif\n#endif\n\n\nVOID\nPhydm_CheckAdaptivity(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n\t\n\tif (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tif (pDM_Odm->APTotalNum > Adaptivity->APNumTH) {\n\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"AP total num > %d!!, disable adaptivity\\n\", Adaptivity->APNumTH));\n\t\t} else\n#endif\n\t\t{\n\t\t\tif (Adaptivity->DynamicLinkAdaptivity == TRUE) {\n\t\t\t\tif (pDM_Odm->bLinked && Adaptivity->bCheck == FALSE) {\n\t\t\t\t\tPhydm_NHMCounterStatistics(pDM_Odm);\n\t\t\t\t\tPhydm_CheckEnvironment(pDM_Odm);\n\t\t\t\t} else if (!pDM_Odm->bLinked)\n\t\t\t\t\tAdaptivity->bCheck = FALSE;\n\t\t\t} else {\n\t\t\t\tpDM_Odm->Adaptivity_enable = TRUE;\n\n\t\t\t\tif (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))\n\t\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\telse\n\t\t\t\t\tpDM_Odm->adaptivity_flag = TRUE;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t}\n\n\t\n\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nBOOLEAN\nPhydm_CheckChannelPlan(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tpAdapter\t= pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(pAdapter->MgntInfo);\n\t\n\tif (pMgntInfo->RegEnableAdaptivity == 2) {\n\t\tif (pDM_Odm->Carrier_Sense_enable == FALSE) {\t\t/*check domain Code for Adaptivity or CarrierSense*/\n\t\t\tif ((*pDM_Odm->pBandType == ODM_BAND_5G) &&\n\t\t\t    !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"Adaptivity skip 5G domain code : %d\\n\", pDM_Odm->odm_Regulation5G));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t} else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\n\t\t\t\t   !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"Adaptivity skip 2.4G domain code : %d\\n\", pDM_Odm->odm_Regulation2_4G));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\n\t\t\t} else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"Adaptivity neither 2G nor 5G band, return\\n\"));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t} else {\n\t\t\tif ((*pDM_Odm->pBandType == ODM_BAND_5G) &&\n\t\t\t    !(pDM_Odm->odm_Regulation5G == REGULATION_MKK || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"CarrierSense skip 5G domain code : %d\\n\", pDM_Odm->odm_Regulation5G));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\n\t\t\telse if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\n\t\t\t\t   !(pDM_Odm->odm_Regulation2_4G == REGULATION_MKK  || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"CarrierSense skip 2.4G domain code : %d\\n\", pDM_Odm->odm_Regulation2_4G));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\n\t\t\t} else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"CarrierSense neither 2G nor 5G band, return\\n\"));\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FALSE;\n\n}\n#endif\n\nVOID\nPhydm_NHMCounterStatisticsInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\t/*PHY parameters initialize for n series*/\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N + 2, 0xC350);\t\t\t/*0x894[31:16]=0x0xC350\tTime duration for NHM unit: us, 0xc350=200ms*/\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N + 2, 0xffff);\t\t/*0x890[31:16]=0xffff\t\tth_9, th_10*/\n\t\tODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50);\t\t/*0x898=0xffffff52\t\t\tth_3, th_2, th_1, th_0*/\n\t\tODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff);\t\t/*0x89c=0xffffffff\t\t\tth_7, th_6, th_5, th_4*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff);\t\t/*0xe28[7:0]=0xff\t\t\tth_8*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10 | BIT9 | BIT8, 0x1);\t/*0x890[10:8]=1\t\t\tignoreCCA ignore PHYTXON enable CCX*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1);\t\t\t/*0xc0c[7]=1\t\t\t\tmax power among all RX ants*/\n\t}\n#if (RTL8195A_SUPPORT == 0)\n\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\t/*PHY parameters initialize for ac series*/\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC + 2, 0xC350);\t\t\t/*0x990[31:16]=0xC350\tTime duration for NHM unit: us, 0xc350=200ms*/\n\t\tODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC + 2, 0xffff);\t\t/*0x994[31:16]=0xffff\t\tth_9, th_10*/\n\t\tODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50);\t/*0x998=0xffffff52\t\t\tth_3, th_2, th_1, th_0*/\n\t\tODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff);\t/*0x99c=0xffffffff\t\t\tth_7, th_6, th_5, th_4*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff);\t\t/*0x9a0[7:0]=0xff\t\t\tth_8*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8 | BIT9 | BIT10, 0x1); /*0x994[10:8]=1\t\t\tignoreCCA ignore PHYTXON\tenable CCX*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1);\t\t\t\t/*0x9e8[7]=1\t\t\t\tmax power among all RX ants*/\n\n\t}\n#endif\n}\n\nVOID\nPhydm_NHMCounterStatistics(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\n\t\treturn;\n\n\t/*Get NHM report*/\n\tPhydm_GetNHMCounterStatistics(pDM_Odm);\n\n\t/*Reset NHM counter*/\n\tPhydm_NHMCounterStatisticsReset(pDM_Odm);\n}\n\nVOID\nPhydm_GetNHMCounterStatistics(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\tvalue32 = 0;\n#if (RTL8195A_SUPPORT == 0)\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);\n\telse if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n#endif\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);\n\n\tpDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);\n\tpDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1) >> 8);\n\n}\n\nVOID\nPhydm_NHMCounterStatisticsReset(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);\n\t}\n#if (RTL8195A_SUPPORT == 0)\n\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);\n\t}\n\n#endif\n\n}\n\nVOID\nPhydm_SetEDCCAThreshold(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\ts1Byte\tH2L,\n\tIN\ts1Byte\tL2H\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2|bMaskByte0, (u4Byte)((u1Byte)L2H|(u1Byte)H2L<<16));\n#if (RTL8195A_SUPPORT == 0)\n\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskLWord, (u2Byte)((u1Byte)L2H|(u1Byte)H2L<<8));\n#endif\n\n}\n\nVOID\nPhydm_SetLNA(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tIN\tPhyDM_set_LNA\ttype\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif (pDM_Odm->SupportICType & (ODM_RTL8188E | ODM_RTL8192E)) {\n\t\tif (type == PhyDM_disable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x37f82);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x37f82);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);\n\t\t\t}\n\t\t} else if (type == PhyDM_enable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x77f82);\t/*back to normal*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x77f82);\n\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);\n\t\t\t}\n\t\t}\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8723B) {\n\t\tif (type == PhyDM_disable_LNA) {\n\t\t\t/*S0*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6137);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\t/*S1*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x3008d);\t/*select Rx mode and disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);\n\t\t} else if (type == PhyDM_enable_LNA) {\n\t\t\t/*S0*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6177);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\t/*S1*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x300bd);\t/*select Rx mode and disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);\n\t\t}\n\t\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8812) {\n\t\tif (type == PhyDM_disable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc22bf);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc22bf);\t/*disable LNA*/\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);\n\t\t\t\t}\n\t\t} else if (type == PhyDM_enable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc26bf);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc26bf);\t/*disable LNA*/\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);\n\t\t\t\t}\n\t\t}\n\t} else if (pDM_Odm->SupportICType & (ODM_RTL8821 | ODM_RTL8881A)) {\n\t\tif (type == PhyDM_disable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb09b);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\n\t\t} else if (type == PhyDM_enable_LNA) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000);\t/*select Rx mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb0bb);\t/*disable LNA*/\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);\t\n\t\t}\n\t}\n}\n\n\n\nVOID\nPhydm_SetTRxMux(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tIN\tPhyDM_Trx_MUX_Type\ttxMode,\n\tIN\tPhyDM_Trx_MUX_Type\trxMode\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3 | BIT2 | BIT1, txMode);\t\t\t/*set TXmod to standby mode to remove outside noise affect*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22 | BIT21 | BIT20, rxMode);\t\t/*set RXmod to standby mode to remove outside noise affect*/\n\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT3 | BIT2 | BIT1, txMode);\t\t/*set TXmod to standby mode to remove outside noise affect*/\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT22 | BIT21 | BIT20, rxMode);\t/*set RXmod to standby mode to remove outside noise affect*/\n\t\t}\n\t}\n#if (RTL8195A_SUPPORT == 0)\n\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11 | BIT10 | BIT9 | BIT8, txMode);\t\t\t\t/*set TXmod to standby mode to remove outside noise affect*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7 | BIT6 | BIT5 | BIT4, rxMode);\t\t\t\t/*set RXmod to standby mode to remove outside noise affect*/\n\t\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11 | BIT10 | BIT9 | BIT8, txMode);\t\t/*set TXmod to standby mode to remove outside noise affect*/\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7 | BIT6 | BIT5 | BIT4, rxMode);\t\t\t/*set RXmod to standby mode to remove outside noise affect*/\n\t\t}\n\t}\n#endif\n\n}\n\nVOID\nPhydm_MACEDCCAState(\n\tIN\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\tPhyDM_MACEDCCA_Type\t\tState\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif (State == PhyDM_IGNORE_EDCCA) {\n\t\tODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1);\t/*ignore EDCCA\treg520[15]=1*/\n\t\tODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0);\t\t\t/*reg524[11]=0*/\n\t} else {\t/*don't set MAC ignore EDCCA signal*/\n\t\tODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0);\t/*don't ignore EDCCA\t reg520[15]=0\u0014*/\n\t\tODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);\t\t\t/*reg524[11]=1\t*/\n\t}\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"EDCCA enable State = %d\\n\", State));\n\n}\n\nBOOLEAN\nPhydm_CalNHMcnt(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\tBase = 0;\n\n\tBase = pDM_Odm->NHM_cnt_0 + pDM_Odm->NHM_cnt_1;\n\n\tif (Base != 0) {\n\t\tpDM_Odm->NHM_cnt_0 = ((pDM_Odm->NHM_cnt_0) << 8) / Base;\n\t\tpDM_Odm->NHM_cnt_1 = ((pDM_Odm->NHM_cnt_1) << 8) / Base;\n\t}\n\tif ((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100)\n\t\treturn TRUE;\t\t\t/*clean environment*/\n\telse\n\t\treturn FALSE;\t\t/*noisy environment*/\n\n}\n\n\nVOID\nPhydm_CheckEnvironment(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n\tBOOLEAN \tisCleanEnvironment = FALSE;\n\n\tif (Adaptivity->bFirstLink == TRUE) {\n\t\tif (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))\n\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\telse\n\t\t\tpDM_Odm->adaptivity_flag = TRUE;\n\n\t\tAdaptivity->bFirstLink = FALSE;\n\t\treturn;\n\t} else {\n\t\tif (Adaptivity->NHMWait < 3) {\t\t/*Start enter NHM after 4 NHMWait*/\n\t\t\tAdaptivity->NHMWait++;\n\t\t\tPhydm_NHMCounterStatistics(pDM_Odm);\n\t\t\treturn;\n\t\t} else {\n\t\t\tPhydm_NHMCounterStatistics(pDM_Odm);\n\t\t\tisCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm);\n\t\t\tif (isCleanEnvironment == TRUE) {\n\t\t\t\tpDM_Odm->TH_L2H_ini = Adaptivity->TH_L2H_ini_backup;\t\t\t/*adaptivity mode*/\n\t\t\t\tpDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_backup;\n\n\t\t\t\tpDM_Odm->Adaptivity_enable = TRUE;\n\n\t\t\t\tif (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))\n\t\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\telse\n\t\t\t\t\tpDM_Odm->adaptivity_flag = TRUE;\n\t\t\t} else {\n\t\t\t\tpDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;\t\t\t/*mode2*/\n\t\t\t\tpDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;\n\n\t\t\t\tpDM_Odm->adaptivity_flag = FALSE;\n\t\t\t\tpDM_Odm->Adaptivity_enable = FALSE;\n\t\t\t}\n\t\t\tAdaptivity->NHMWait = 0;\n\t\t\tAdaptivity->bFirstLink = TRUE;\n\t\t\tAdaptivity->bCheck = TRUE;\n\t\t}\n\n\t}\n\n\n}\n\nVOID\nPhydm_SearchPwdBLowerBound(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n\tu4Byte\t\t\tvalue32 = 0;\n\tu1Byte\t\t\tcnt, IGI = 0x45;\t\t/*IGI = 0x50 for cal EDCCA lower bound*/\n\tu1Byte\t\t\ttxEdcca1 = 0, txEdcca0 = 0;\n\tBOOLEAN\t\t\tbAdjust = TRUE;\n\ts1Byte \t\t\tTH_L2H_dmc, TH_H2L_dmc, IGI_target = 0x32;\n\ts1Byte \t\t\tDiff;\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))\n\t\tPhydm_SetLNA(pDM_Odm, PhyDM_disable_LNA);\n\telse {\n\t\tPhydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\n\t\todm_PauseDIG(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, 0x7e);\n\t}\n\n\tDiff = IGI_target - (s1Byte)IGI;\n\tTH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\n\tif (TH_L2H_dmc > 10)\n\t\tTH_L2H_dmc = 10;\n\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\n\tPhydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\n\tODM_delay_ms(5);\n\n\twhile (bAdjust) {\n\t\tfor (cnt = 0; cnt < 20; cnt++) {\n\t\t\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\t\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord);\n#if (RTL8195A_SUPPORT == 0)\n\t\t\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\t\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord);\n#endif\n\t\t\tif (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A | ODM_RTL8723B | ODM_RTL8188E)))\n\t\t\t\ttxEdcca1 = txEdcca1 + 1;\n\t\t\telse if (value32 & BIT29)\n\t\t\t\ttxEdcca1 = txEdcca1 + 1;\n\t\t\telse\n\t\t\t\ttxEdcca0 = txEdcca0 + 1;\n\t\t}\n\n\t\tif (txEdcca1 > 1) {\n\t\t\tIGI = IGI - 1;\n\t\t\tTH_L2H_dmc = TH_L2H_dmc + 1;\n\t\t\tif (TH_L2H_dmc > 10)\n\t\t\t\tTH_L2H_dmc = 10;\n\t\t\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\n\t\t\tPhydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\n\t\t\tif (TH_L2H_dmc == 10) {\n\t\t\t\tbAdjust = FALSE;\n\t\t\t\tAdaptivity->H2L_lb = TH_H2L_dmc;\n\t\t\t\tAdaptivity->L2H_lb = TH_L2H_dmc;\n\t\t\t\tpDM_Odm->Adaptivity_IGI_upper = IGI;\n\t\t\t}\n\n\t\t\ttxEdcca1 = 0;\n\t\t\ttxEdcca0 = 0;\n\n\t\t} else {\n\t\t\tbAdjust = FALSE;\n\t\t\tAdaptivity->H2L_lb = TH_H2L_dmc;\n\t\t\tAdaptivity->L2H_lb = TH_L2H_dmc;\n\t\t\tpDM_Odm->Adaptivity_IGI_upper = IGI;\n\t\t\ttxEdcca1 = 0;\n\t\t\ttxEdcca0 = 0;\n\t\t}\n\t}\n\n\tpDM_Odm->Adaptivity_IGI_upper = pDM_Odm->Adaptivity_IGI_upper - pDM_Odm->DCbackoff;\n\tAdaptivity->H2L_lb = Adaptivity->H2L_lb + pDM_Odm->DCbackoff;\n\tAdaptivity->L2H_lb = Adaptivity->L2H_lb + pDM_Odm->DCbackoff;\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))\n\t\tPhydm_SetLNA(pDM_Odm, PhyDM_enable_LNA);\n\telse {\n\t\tPhydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);\n\t\todm_PauseDIG(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, NONE);\n\t}\n\t\n\tPhydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\t\t\t\t/*resume to no link state*/\n}\n\nVOID\nPhydm_AdaptivityInit(\n\tIN \tPVOID\t \tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n\ts1Byte\tIGItarget = 0x32;\n\t/*pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;*/\n#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tpAdapter\t= pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(pAdapter->MgntInfo);\n\tpDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;\n\tpDM_Odm->DCbackoff = (u1Byte)pMgntInfo->RegDCbackoff;\n\tAdaptivity->DynamicLinkAdaptivity = (BOOLEAN)pMgntInfo->RegDmLinkAdaptivity;\n\tAdaptivity->APNumTH = (u1Byte)pMgntInfo->RegAPNumTH;\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tpDM_Odm->Carrier_Sense_enable = (pDM_Odm->Adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE;\n\tpDM_Odm->DCbackoff = pDM_Odm->Adapter->registrypriv.adaptivity_dc_backoff;\n\tAdaptivity->DynamicLinkAdaptivity = (pDM_Odm->Adapter->registrypriv.adaptivity_dml != 0) ? TRUE : FALSE;\n#endif\n\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\n\tif (pDM_Odm->Carrier_Sense_enable == FALSE) {\n#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tif (pMgntInfo->RegL2HForAdaptivity != 0)\n\t\t\tpDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity;\n\t\telse\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\tif (pDM_Odm->Adapter->registrypriv.adaptivity_th_l2h_ini != 0)\n\t\t\tpDM_Odm->TH_L2H_ini = pDM_Odm->Adapter->registrypriv.adaptivity_th_l2h_ini;\n\t\telse\n#endif\n\t\t\tpDM_Odm->TH_L2H_ini = 0xf5;\n\t} else\n\t\t\tpDM_Odm->TH_L2H_ini = 0xa;\n\n#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tif (pMgntInfo->RegHLDiffForAdaptivity != 0)\n\t\tpDM_Odm->TH_EDCCA_HL_diff = pMgntInfo->RegHLDiffForAdaptivity;\n\telse\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tif (pDM_Odm->Adapter->registrypriv.adaptivity_th_edcca_hl_diff != 0)\n\t\tpDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->Adapter->registrypriv.adaptivity_th_edcca_hl_diff;\n\telse\n#endif\n\t\tpDM_Odm->TH_EDCCA_HL_diff = 7;\n\n\tAdaptivity->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;\n\tAdaptivity->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff;\n\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv = pDM_Odm->priv;\n\n\tif (pDM_Odm->Carrier_Sense_enable) {\n\t\tpDM_Odm->TH_L2H_ini = 0xa;\n\t\tpDM_Odm->TH_EDCCA_HL_diff = 7;\n\t} else {\n\t\tAdaptivity->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;\t/*set by mib*/\n\t\tpDM_Odm->TH_EDCCA_HL_diff = 7;\n\t}\n\n\tAdaptivity->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff;\n\tif (priv->pshare->rf_ft_var.adaptivity_enable == 2)\n\t\tAdaptivity->DynamicLinkAdaptivity = TRUE;\n\telse\n\t\tAdaptivity->DynamicLinkAdaptivity = FALSE;\n\n#endif\n\n\tpDM_Odm->Adaptivity_IGI_upper = 0;\n\tpDM_Odm->Adaptivity_enable = FALSE;\t/*use this flag to decide enable or disable*/\n\n\tpDM_Odm->EDCCA_enable = TRUE;\t\t/*even no adaptivity, we still enable EDCCA*/\n\n\tpDM_Odm->TH_L2H_ini_mode2 = 20;\n\tpDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;\n\t\n\tAdaptivity->IGI_Base = 0x32;\n\tAdaptivity->IGI_target = 0x1c;\n\tAdaptivity->H2L_lb = 0;\n\tAdaptivity->L2H_lb = 0;\n\tAdaptivity->NHMWait = 0;\n\tAdaptivity->bCheck = FALSE;\n\tAdaptivity->bFirstLink = TRUE;\n\tAdaptivity->AdajustIGILevel = 0;\n\n\tPhydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\n\n\t/*Search pwdB lower bound*/\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);\n#if (RTL8195A_SUPPORT == 0)\n\telse if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);\n#endif\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_GAIN_IDX_EDCCA) {\n\t\t/*ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT_11N, BIT12 | BIT11 | BIT10, 0x7);*/\t\t/*interfernce need > 2^x us, and then EDCCA will be 1*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DCNF_11N, BIT21 | BIT20, 0x1);\t\t/*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/\n\t}\n#if (RTL8195A_SUPPORT == 0)\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_GAIN_IDX_EDCCA) {\t\t/*8814a no need to find pwdB lower bound, maybe*/\n\t\t/*ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT, BIT30 | BIT29 | BIT28, 0x7);*/\t\t/*interfernce need > 2^x us, and then EDCCA will be 1*/\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_ACBB_EDCCA_ENHANCE, BIT29 | BIT28, 0x1);\t\t/*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/\n\t}\n\n\tif(!(pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)))\n\t\tPhydm_SearchPwdBLowerBound(pDM_Odm);\n#endif\n\n/*we need to consider PwdB upper bound for 8814 later IC*/\n\tAdaptivity->AdajustIGILevel = (u1Byte)((pDM_Odm->TH_L2H_ini + IGItarget) - PwdBUpperBound + DFIRloss);\t/*IGI = L2H - PwdB - DFIRloss*/\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"TH_L2H_ini = 0x%x, TH_EDCCA_HL_diff = 0x%x, Adaptivity->AdajustIGILevel = 0x%x\\n\", pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, Adaptivity->AdajustIGILevel));\n\n\t/*phydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);*/\n\n}\n\n\nVOID\nPhydm_Adaptivity(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tIGI\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\ts1Byte\t\t\tTH_L2H_dmc, TH_H2L_dmc;\n\ts1Byte\t\t\tDiff = 0, IGI_target;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tpAdapter\t= pDM_Odm->Adapter;\n\tBOOLEAN\t\t\tbFwCurrentInPSMode = FALSE;\n\tPMGNT_INFO\t\tpMgntInfo = &(pAdapter->MgntInfo);\n\n\tpAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));\n\n\t/*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/\n\tif (bFwCurrentInPSMode)\n\t\treturn;\n#endif\n\n\tif (pDM_Odm->EDCCA_enable == FALSE) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"Disable EDCCA!!!\\n\"));\n\t\treturn;\n\t}\n\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"adaptivity disable, enable EDCCA mode!!!\\n\"));\n\t\tpDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;\n\t\tpDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;\n\t}\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\telse{\n\t\tif (Phydm_CheckChannelPlan(pDM_Odm) || (pDM_Odm->APTotalNum > Adaptivity->APNumTH)) {\n\t\t\tpDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;\n\t\t\tpDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;\n\t\t}\n\t}\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"odm_Adaptivity() =====>\\n\"));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d\\n\",\n\t\t\t Adaptivity->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff));\n#if (RTL8195A_SUPPORT == 0)\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\n\t\t/*fix AC series when enable EDCCA hang issue*/\n\t\tODM_SetBBReg(pDM_Odm, 0x800, BIT10, 1);\t/*ADC_mask disable*/\n\t\tODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0);\t/*ADC_mask enable*/\n\t}\n#endif\n\tif (*pDM_Odm->pBandWidth == ODM_BW20M)\t\t/*CHANNEL_WIDTH_20*/\n\t\tIGI_target = Adaptivity->IGI_Base;\n\telse if (*pDM_Odm->pBandWidth == ODM_BW40M)\n\t\tIGI_target = Adaptivity->IGI_Base + 2;\n#if (RTL8195A_SUPPORT == 0)\n\telse if (*pDM_Odm->pBandWidth == ODM_BW80M)\n\t\tIGI_target = Adaptivity->IGI_Base + 2;\n#endif\n\telse\n\t\tIGI_target = Adaptivity->IGI_Base;\n\tAdaptivity->IGI_target = (u1Byte) IGI_target;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"BandWidth=%s, IGI_target=0x%x, DynamicLinkAdaptivity = %d\\n\",\n\t\t\t (*pDM_Odm->pBandWidth == ODM_BW80M) ? \"80M\" : ((*pDM_Odm->pBandWidth == ODM_BW40M) ? \"40M\" : \"20M\"), IGI_target, Adaptivity->DynamicLinkAdaptivity));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"RSSI_min = %d, Adaptivity->AdajustIGILevel= 0x%x, adaptivity_flag = %d, Adaptivity_enable = %d\\n\",\n\t\t\t pDM_Odm->RSSI_Min, Adaptivity->AdajustIGILevel, pDM_Odm->adaptivity_flag, pDM_Odm->Adaptivity_enable));\n\n\tif ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (!pDM_Odm->bLinked) && (pDM_Odm->Adaptivity_enable == FALSE)) {\n\t\tPhydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"In DynamicLink mode(noisy) and No link, Turn off EDCCA!!\\n\"));\n\t\treturn;\n\t}\n\n\tif (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {\n\t\tif ((Adaptivity->AdajustIGILevel > IGI) && (pDM_Odm->Adaptivity_enable == TRUE)) \n\t\t\tDiff = Adaptivity->AdajustIGILevel - IGI;\n\t\t\n\t\tTH_L2H_dmc = pDM_Odm->TH_L2H_ini - Diff + IGI_target;\n\t\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\t}\n#if (RTL8195A_SUPPORT == 0)\n\telse\t{\n\t\tDiff = IGI_target - (s1Byte)IGI;\n\t\tTH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\n\t\tif (TH_L2H_dmc > 10 && (pDM_Odm->Adaptivity_enable == TRUE))\n\t\t\tTH_L2H_dmc = 10;\n\n\t\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\n\t\t/*replace lower bound to prevent EDCCA always equal 1*/\n\t\tif (TH_H2L_dmc < Adaptivity->H2L_lb)\n\t\t\tTH_H2L_dmc = Adaptivity->H2L_lb;\n\t\tif (TH_L2H_dmc < Adaptivity->L2H_lb)\n\t\t\tTH_L2H_dmc = Adaptivity->L2H_lb;\n\t}\n#endif\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\\n\", IGI, TH_L2H_dmc, TH_H2L_dmc));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\\n\", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));\n\n\tPhydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\n\treturn;\n}\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nPhydm_AdaptivityBSOD(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(pAdapter->MgntInfo);\n\tu1Byte\t\t\tcount = 0;\n\tu4Byte\t\t\tu4Value;\n\n\t/*\n\t1. turn off RF (TRX Mux in standby mode)\n\t2. H2C mac id drop\n\t3. ignore EDCCA\n\t4. wait for clear FIFO\n\t5. don't ignore EDCCA\n\t6. turn on RF (TRX Mux in TRx mdoe)\n\t7. H2C mac id resume\n\t*/\n\n\tRT_TRACE(COMP_MLME, DBG_WARNING, (\"MAC id drop packet!!!!!\\n\"));\n\n\tpAdapter->dropPktByMacIdCnt++;\n\tpMgntInfo->bDropPktInProgress = TRUE;\n\n\tpAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_MAX_Q_PAGE_NUM, (pu1Byte)(&u4Value));\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Queue Reserved Page Number = 0x%08x\\n\", u4Value));\n\tpAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Available Queue Page Number = 0x%08x\\n\", u4Value));\n\n#if 1\n\n\t/*Standby mode*/\n\tPhydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\n\tODM_Write_DIG(pDM_Odm, 0x20);\n\n\t/*H2C mac id drop*/\n\tMacIdIndicateDisconnect(pAdapter);\n\n\t/*Ignore EDCCA*/\n\tPhydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\n\n\tdelay_ms(50);\n\tcount = 5;\n\n#else\n\n\tdo {\n\n\t\tu8Byte \t\tdiffTime, curTime, oldestTime;\n\t\tu1Byte\t\tqueueIdx\n\n\t\t//3 Standby mode\n\t\tPhydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\n\t\tODM_Write_DIG(pDM_Odm, 0x20);\n\n\t\t//3 H2C mac id drop\n\t\tMacIdIndicateDisconnect(pAdapter);\n\n\t\t//3 Ignore EDCCA\n\t\tPhydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\n\n\t\tcount++;\n\t\tdelay_ms(10);\n\n\t\t// Check latest packet\n\t\tcurTime = PlatformGetCurrentTime();\n\t\toldestTime = 0xFFFFFFFFFFFFFFFF;\n\n\t\tfor (queueIdx = 0; queueIdx < MAX_TX_QUEUE; queueIdx++) {\n\t\t\tif (!IS_DATA_QUEUE(queueIdx))\n\t\t\t\tcontinue;\n\n\t\t\tif (!pAdapter->bTcbBusyQEmpty[queueIdx]) {\n\t\t\t\tRT_TRACE(COMP_MLME, DBG_WARNING, (\"oldestTime = %llu\\n\", oldestTime));\n\t\t\t\tRT_TRACE(COMP_MLME, DBG_WARNING, (\"Q[%d] = %llu\\n\", queueIdx, pAdapter->firstTcbSysTime[queueIdx]));\n\t\t\t\tif (pAdapter->firstTcbSysTime[queueIdx] < oldestTime)\n\t\t\t\t\toldestTime = pAdapter->firstTcbSysTime[queueIdx];\n\t\t\t}\n\t\t}\n\n\t\tdiffTime = curTime - oldestTime;\n\n\t\tRT_TRACE(COMP_MLME, DBG_WARNING, (\"diff s = %llu\\n\", (diffTime / 1000000)));\n\n\t} while (((diffTime / 1000000) >= 4) && (oldestTime != 0xFFFFFFFFFFFFFFFF));\n#endif\n\n\t/*Resume EDCCA*/\n\tPhydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\n\n\t/*Turn on TRx mode*/\n\tPhydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);\n\tODM_Write_DIG(pDM_Odm, 0x20);\n\n\t/*Resume H2C macid*/\n\tMacIdRecoverMediaStatus(pAdapter);\n\n\tpAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Available Queue Page Number = 0x%08x\\n\", u4Value));\n\n\tpMgntInfo->bDropPktInProgress = FALSE;\n\tRT_TRACE(COMP_MLME, DBG_WARNING, (\"End of MAC id drop packet, spent %dms\\n\", count * 10));\n\n}\n\n#endif\n\nVOID\nphydm_setEDCCAThresholdAPI(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\tIGI\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTIVITY_STATISTICS\tAdaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\n\ts1Byte\t\t\tTH_L2H_dmc, TH_H2L_dmc;\n\ts1Byte\t\t\tDiff = 0, IGI_target = 0x32;\n\n\tif (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {\n\n\t\tif (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {\n\t\t\tif (Adaptivity->AdajustIGILevel > IGI) \n\t\t\t\tDiff = Adaptivity->AdajustIGILevel - IGI;\n\t\t\n\t\t\tTH_L2H_dmc = pDM_Odm->TH_L2H_ini - Diff + IGI_target;\n\t\t\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\t\t}\n#if (RTL8195A_SUPPORT == 0)\n\t\telse\t{\n\t\t\tDiff = IGI_target - (s1Byte)IGI;\n\t\t\tTH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\n\t\t\tif (TH_L2H_dmc > 10)\n\t\t\t\tTH_L2H_dmc = 10;\n\n\t\t\tTH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\n\n\t\t\t/*replace lower bound to prevent EDCCA always equal 1*/\n\t\t\tif (TH_H2L_dmc < Adaptivity->H2L_lb)\n\t\t\t\tTH_H2L_dmc = Adaptivity->H2L_lb;\n\t\t\tif (TH_L2H_dmc < Adaptivity->L2H_lb)\n\t\t\t\tTH_L2H_dmc = Adaptivity->L2H_lb;\n\t\t}\n#endif\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"API :IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\\n\", IGI, TH_L2H_dmc, TH_H2L_dmc));\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, (\"API :Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\\n\", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));\n\n\t\tPhydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\n\t}\n\n}\n"
  },
  {
    "path": "hal/phydm/phydm_adaptivity.h",
    "content": "\n/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMADAPTIVITY_H__\n#define    __PHYDMADAPTIVITY_H__\n\n#define ADAPTIVITY_VERSION\t\"9.0\"\n\n#define PwdBUpperBound\t7\n#define DFIRloss\t5\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\ntypedef enum _tag_PhyDM_REGULATION_Type {\n\tREGULATION_FCC = 0,\n\tREGULATION_MKK = 1,\n\tREGULATION_ETSI = 2,\n\tREGULATION_WW = 3,\t\n\t\n\tMAX_REGULATION_NUM = 4\n} PhyDM_REGULATION_TYPE;\n#endif\n\ntypedef enum tag_PhyDM_set_LNA {\n\tPhyDM_disable_LNA\t\t= 0,\n\tPhyDM_enable_LNA\t\t= 1,\n} PhyDM_set_LNA;\n\n\ntypedef enum tag_PhyDM_TRx_MUX_Type\n{\n\tPhyDM_SHUTDOWN\t\t\t= 0,\n\tPhyDM_STANDBY_MODE\t\t= 1,\n\tPhyDM_TX_MODE\t\t\t= 2,\n\tPhyDM_RX_MODE\t\t\t= 3\n}PhyDM_Trx_MUX_Type;\n\ntypedef enum tag_PhyDM_MACEDCCA_Type\n{\n\tPhyDM_IGNORE_EDCCA\t\t\t= 0,\n\tPhyDM_DONT_IGNORE_EDCCA\t= 1\n}PhyDM_MACEDCCA_Type;\n\ntypedef struct _ADAPTIVITY_STATISTICS {\n\ts1Byte\t\t\tTH_L2H_ini_backup;\n\ts1Byte\t\t\tTH_EDCCA_HL_diff_backup;\n\ts1Byte\t\t\tIGI_Base;\n\tu1Byte\t\t\tIGI_target;\n\tu1Byte\t\t\tNHMWait;\n\ts1Byte\t\t\tH2L_lb;\n\ts1Byte\t\t\tL2H_lb;\n\tBOOLEAN\t\t\tbFirstLink;\n\tBOOLEAN\t\t\tbCheck;\n\tBOOLEAN\t\t\tDynamicLinkAdaptivity;\n\tu1Byte\t\t\tAPNumTH;\n\tu1Byte\t\t\tAdajustIGILevel;\n} ADAPTIVITY_STATISTICS, *PADAPTIVITY_STATISTICS;\n\nVOID\nPhydm_CheckAdaptivity(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nPhydm_CheckEnvironment(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nPhydm_NHMCounterStatisticsInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nPhydm_NHMCounterStatistics(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nPhydm_NHMCounterStatisticsReset(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nVOID\nPhydm_GetNHMCounterStatistics(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n);\n\nVOID\nPhydm_MACEDCCAState(\n\tIN\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\tPhyDM_MACEDCCA_Type\t\tState\n);\n\nVOID\nPhydm_SetEDCCAThreshold(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\ts1Byte\t\tH2L,\n\tIN\t\ts1Byte\t\tL2H\n);\n\nVOID\nPhydm_SetTRxMux(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tPhyDM_Trx_MUX_Type\t\t\ttxMode,\n\tIN\t\tPhyDM_Trx_MUX_Type\t\t\trxMode\n);\t\n\nBOOLEAN\nPhydm_CalNHMcnt(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nPhydm_SearchPwdBLowerBound(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID \nPhydm_AdaptivityInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nPhydm_Adaptivity(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\t\t\tIGI\n\t);\n\nVOID\nphydm_setEDCCAThresholdAPI(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\tIGI\n);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nPhydm_DisableEDCCA(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID\nPhydm_DynamicEDCCA(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID\nPhydm_AdaptivityBSOD(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\n#endif\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_antdect.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n//#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\n#if(defined(CONFIG_ANT_DETECTION))\n\n//IS_ANT_DETECT_SUPPORT_SINGLE_TONE(Adapter)\t\n//IS_ANT_DETECT_SUPPORT_RSSI(Adapter)\t\t\n//IS_ANT_DETECT_SUPPORT_PSD(Adapter)\n\n//1 [1. Single Tone Method] ===================================================\n\n\nVOID\nodm_PHY_SaveAFERegisters(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tpu4Byte\t\tAFEReg,\n\tIN\tpu4Byte\t\tAFEBackup,\n\tIN\tu4Byte\t\tRegisterNum\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\ti;\n\t\n\t//RT_DISP(FINIT, INIT_IQK, (\"Save ADDA parameters.\\n\"));\n\tfor( i = 0 ; i < RegisterNum ; i++){\n\t\tAFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);\n\t}\n}\n\nVOID\nodm_PHY_ReloadAFERegisters(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tpu4Byte\t\tAFEReg,\n\tIN\tpu4Byte\t\tAFEBackup,\n\tIN\tu4Byte\t\tRegiesterNum\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\ti;\n\n\t//RT_DISP(FINIT, INIT_IQK, (\"Reload ADDA power saving parameters !\\n\"));\n\tfor(i = 0 ; i < RegiesterNum; i++)\n\t{\n\t\n\t\tODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);\n\t}\n}\n\n//\n// Description:\n//\tSet Single/Dual Antenna default setting for products that do not do detection in advance.\n//\n// Added by Joseph, 2012.03.22\n//\nVOID\nODM_SingleDualAntennaDefaultSetting(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tPADAPTER\tpAdapter\t =  pDM_Odm->Adapter;\n\n\tu1Byte btAntNum=BT_GetPgAntNum(pAdapter);\n\t// Set default antenna A and B status\n\tif(btAntNum == 2)\n\t{\n\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\n\t}\n\telse if(btAntNum == 1)\n\t{// Set antenna A as default\n\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\n\t}\n\telse\n\t{\n\t\tRT_ASSERT(FALSE, (\"Incorrect antenna number!!\\n\"));\n\t}\n}\n\n\n//2 8723A ANT DETECT\n//\n// Description:\n//\tImplement IQK single tone for RF DPK loopback and BB PSD scanning. \n//\tThis function is cooperated with BB team Neil. \n//\n// Added by Roger, 2011.12.15\n//\nBOOLEAN\nODM_SingleDualAntennaDetection(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tmode\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\tpAdapter\t =  pDM_Odm->Adapter;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tu4Byte\t\tCurrentChannel,RfLoopReg;\n\tu1Byte\t\tn;\n\tu4Byte\t\tReg88c, Regc08, Reg874, Regc50, Reg948, Regb2c, Reg92c, Reg930, Reg064, AFE_rRx_Wait_CCA;\n\tu1Byte\t\tinitial_gain = 0x5a;\n\tu4Byte\t\tPSD_report_tmp;\n\tu4Byte\t\tAntA_report = 0x0, AntB_report = 0x0, AntO_report = 0x0;\n\tBOOLEAN\t\tbResult = TRUE;\n\tu4Byte\t\tAFE_Backup[16];\n\tu4Byte\t\tAFE_REG_8723A[16] = {\n\t\t\t\t\trRx_Wait_CCA, \trTx_CCK_RFON, \n\t\t\t\t\trTx_CCK_BBON, \trTx_OFDM_RFON,\n\t\t\t\t\trTx_OFDM_BBON, \trTx_To_Rx,\n\t\t\t\t\trTx_To_Tx, \t\trRx_CCK, \n\t\t\t\t\trRx_OFDM, \t\trRx_Wait_RIFS, \n\t\t\t\t\trRx_TO_Rx,\t\trStandby,\n\t\t\t\t\trSleep,\t\t\trPMPD_ANAEN, \t\n\t\t\t\t\trFPGA0_XCD_SwitchControl, rBlue_Tooth};\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection()============> \\n\"));\t\n\n\t\n\tif(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))\n\t\treturn bResult;\n\n\t// Retrieve antenna detection registry info, added by Roger, 2012.11.27.\n\tif(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))\n\t\treturn bResult;\n\n\tif(pDM_Odm->SupportICType == ODM_RTL8192C)\n\t{\n\t\t//Which path in ADC/DAC is turnned on for PSD: both I/Q\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);\n\t\t//Ageraged number: 8\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);\n\t\t//pts = 128;\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);\n\t}\n\n\t//1 Backup Current RF/BB Settings\t\n\t\n\tCurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\n\tRfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tReg92c = ODM_GetBBReg(pDM_Odm, rDPDT_control, bMaskDWord);\t\n\t\tReg930 = ODM_GetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord);\n\t\tReg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\n\t\tRegb2c = ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\n\t\tReg064 = ODM_GetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29);\n\t\tODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);\n\t\tODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);\n\t\tODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, 0x1);  //dbg 7\n\t\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3c0, 0x0);//dbg 8\n\t\tODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x0);\n\t}\n\n\tODM_StallExecution(10);\n\t\n\t//Store A Path Register 88c, c08, 874, c50\n\tReg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);\n\tRegc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);\n\tReg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);\n\tRegc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);\t\n\t\n\t// Store AFE Registers\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\todm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);\t\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\tAFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);\n\t\n\t//Set PSD 128 pts\n\tODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pts\n\t\n\t// To SET CH1 to do\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401);     //Channel 1\n\t\n\t// AFE all on step\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);\n\t\tODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);\n\t}\n\n\t// 3 wire Disable\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);\n\t\n\t//BB IQK Setting\n\tODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);\n\tODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);\n\n\t//IQK setting tone@ 4.34Mhz\n\tODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);\n\tODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);\t\n\n\t//Page B init\n\tODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);\n\tODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);\n\tODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);\n\tODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t{\n\tODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);\n\tODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150016);\n\t\tODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150016);\n\t}\n\tODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);\t\n\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7f, initial_gain);\n\n\t//RF loop Setting\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);\t\n\t\n\t//IQK Single tone start\n\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x808000);\n\tODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\n\tODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);\n\t\n\tODM_StallExecution(10000);\n\n\t// PSD report of antenna A\n\tPSD_report_tmp=0x0;\n\tfor (n=0;n<2;n++)\n \t{\n \t\tPSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);\t\n\t\tif(PSD_report_tmp >AntA_report)\n\t\t\tAntA_report=PSD_report_tmp;\n\t}\n\n\t // change to Antenna B\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B); \n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\t//ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);\n\t\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\n\t\tODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\n\t}\n\n\tODM_StallExecution(10);\t\n\n\t// PSD report of antenna B\n\tPSD_report_tmp=0x0;\n\tfor (n=0;n<2;n++)\n \t{\n \t\tPSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);\t\n\t\tif(PSD_report_tmp > AntB_report)\n\t\t\tAntB_report=PSD_report_tmp;\n\t}\n\n\t// change to open case\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0);  // change to Antenna A\n\n\t\tODM_StallExecution(10);\t\n\t\t\n\t\t// PSD report of open case\n\t\tPSD_report_tmp=0x0;\n\t\tfor (n=0;n<2;n++)\n\t \t{\n\t \t\tPSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);\t\n\t\t\tif(PSD_report_tmp > AntO_report)\n\t\t\t\tAntO_report=PSD_report_tmp;\n\t\t}\n\t}\n\t//Close IQK Single Tone function\n\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x000000);\n\n\t//1 Return to antanna A\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\t// external DPDT\n\t\tODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);\n\n\t\t//internal S0/S1\n\t\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\n\t\tODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\n\t\tODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord, Reg930);\n\t\tODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, Reg064);\n\t}\n\t\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);\n\tODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);\n\tODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);\n\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);\n\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);\n\n\t//Reload AFE Registers\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\n\t\todm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);\t\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\tODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);\n\n\tif(pDM_Odm->SupportICType == ODM_RTL8723A)\n\t{\n\t\t//2 Test Ant B based on Ant A is ON\n\t\tif(mode==ANTTESTB)\n\t\t{\n\t\t\tif(AntA_report >=\t100)\n\t\t\t{\n\t\t\t\tif(AntB_report > (AntA_report+1))\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Single Antenna A\\n\"));\t\t\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\\n\"));\t\n\t\t\t\t}\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Need to check again\\n\"));\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \n\t\t\t\tbResult = FALSE;\n\t\t\t}\n\t\t}\t\n\t\t//2 Test Ant A and B based on DPDT Open\n\t\telse if(mode==ANTTESTALL)\n\t\t{\n\t\t\tif((AntO_report >=100) && (AntO_report <=118))\n\t\t\t{\n\t\t\t\tif(AntA_report > (AntO_report+1))\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTA_ON=FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Ant A is OFF\\n\"));\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Ant A is ON\\n\"));\n\t\t\t\t}\n\n\t\t\t\tif(AntB_report > (AntO_report+2))\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Ant B is OFF\\n\"));\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Ant B is ON\\n\"));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"psd_report_A[%d]= %d \\n\", 2416, AntA_report));\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"psd_report_B[%d]= %d \\n\", 2416, AntB_report));\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"psd_report_O[%d]= %d \\n\", 2416, AntO_report));\n\t\t\t\t\n\t\t\t\tpDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\n\t\t\t\tpDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\n\t\t\t\tpDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\n\t\t\t\tpDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\n\t\t\t\t\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"return FALSE!!\\n\"));\n\t\t\t\tbResult = FALSE;\n\t\t\t}\n\t\t}\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8192C)\n\t{\n\t\tif(AntA_report >=\t100)\n\t\t{\n\t\t\tif(AntB_report > (AntA_report+2))\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON=FALSE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\t\t\tODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Single Antenna B\\n\"));\t\t\n\t\t\t}\t\n\t\t\telse if(AntA_report > (AntB_report+2))\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\t\t\tODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Single Antenna A\\n\"));\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Need to check again\\n\"));\n\t\t\tpDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default \n\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \n\t\t\tbResult = FALSE;\n\t\t}\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"psd_report_A[%d]= %d \\n\", 2416, AntA_report));\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"psd_report_B[%d]= %d \\n\", 2416, AntB_report));\t\n\t\t\n\t\t//2 Test Ant B based on Ant A is ON\n\t\tif((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 135) && (AntB_report <= 135))\n\t\t{\n\t\t\tu1Byte TH1=2, TH2=6;\n\t\t\n\t\t\tif((AntA_report - AntB_report < TH1) || (AntB_report - AntA_report < TH1))\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON=TRUE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=TRUE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"ODM_SingleDualAntennaDetection(): Dual Antenna\\n\"));\n\t\t\t}\n\t\t\telse if(((AntA_report - AntB_report >= TH1) && (AntA_report - AntB_report <= TH2)) || \n\t\t\t\t((AntB_report - AntA_report >= TH1) && (AntB_report - AntA_report <= TH2)))\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON=FALSE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\t\t\tbResult = FALSE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection(): Need to check again\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->ANTA_ON = TRUE;\n\t\t\t\tpDM_SWAT_Table->ANTB_ON=FALSE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"ODM_SingleDualAntennaDetection(): Single Antenna\\n\"));\n\t\t\t}\n\t\t\tpDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\n\t\t\tpDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\n\t\t\tpDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\n\t\t\tpDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\n\t\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"return FALSE!!\\n\"));\n\t\t\tbResult = FALSE;\n\t\t}\n\t}\n\treturn bResult;\n\n}\n\n\n\n//1 [2. Scan AP RSSI Method] ==================================================\n\n\n\n\nBOOLEAN\nODM_SwAntDivCheckBeforeLink(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\n#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\n\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE*\tpHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &Adapter->MgntInfo;\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\ts1Byte\t\t\tScore = 0;\n\tPRT_WLAN_BSS\tpTmpBssDesc, pTestBssDesc;\n\tu1Byte \t\t\tpower_target = 10, power_target_L = 9, power_target_H = 16;\n\tu1Byte\t\t\ttmp_power_diff = 0,power_diff = 0,avg_power_diff = 0,max_power_diff = 0,min_power_diff = 0xff;\n\tu2Byte\t\t\tindex, counter = 0;\n\tstatic u1Byte\t\tScanChannel;\n\tu8Byte\t\t\ttStamp_diff = 0;\t\t\n\tu4Byte\t\t\ttmp_SWAS_NoLink_BK_Reg948;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ANTA_ON = (( %d )) , ANTB_ON = (( %d )) \\n\",pDM_Odm->DM_SWAT_Table.ANTA_ON ,pDM_Odm->DM_SWAT_Table.ANTB_ON ));\n\n\t//if(HP id)\n\t{\n\t\tif(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"8723B RSSI-based Antenna Detection is done\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\t\t\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t{\n\t\t\tif(pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 == 0xff)\n\t\t\t\tpDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\n\t\t}\n\t}\n\n\tif (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413\n\t{\t// The ODM structure is not initialized.\n\t\treturn FALSE;\n\t}\n\n\t// Retrieve antenna detection registry info, added by Roger, 2012.11.27.\n\tif(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))\n\t{\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Antenna Detection: RSSI Method\\n\"));\t\n\t}\n\n\t// Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.\n\tPlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\tif(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)\n\t{\n\t\tPlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\\n\", \n\t\t\t\tpMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));\n\t\n\t\tpDM_SWAT_Table->SWAS_NoLink_State = 0;\n\t\t\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tPlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"pDM_SWAT_Table->SWAS_NoLink_State = %d\\n\", pDM_SWAT_Table->SWAS_NoLink_State));\n\t//1 Run AntDiv mechanism \"Before Link\" part.\n\tif(pDM_SWAT_Table->SWAS_NoLink_State == 0)\n\t{\n\t\t//1 Prepare to do Scan again to check current antenna state.\n\n\t\t// Set check state to next step.\n\t\tpDM_SWAT_Table->SWAS_NoLink_State = 1;\n\t\n\t\t// Copy Current Scan list.\n\t\tpMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;\n\t\tPlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);\n\t\t\n\t\t// Go back to scan function again.\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink: Scan one more time\\n\"));\n\t\tpMgntInfo->ScanStep=0;\n\t\tpMgntInfo->bScanAntDetect = TRUE;\n\t\tScanChannel = odm_SwAntDivSelectScanChnl(Adapter);\n\n\t\t\n\t\tif(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\n\t\t{\n\t\t\tif(pDM_FatTable->RxIdleAnt == MAIN_ANT)\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\n\t\t\telse\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\tif(ScanChannel == 0)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"AUX_ANT\":\"MAIN_ANT\"));\n\n\t\t\t\tif(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pDM_SWAT_Table->Ant5G=%s\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pDM_SWAT_Table->Ant2G=%s\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t}\n\t\t\t\treturn FALSE;\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\\n\", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\")));\n\t\t}\n\t\telse if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))\n\t\t{\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8192C)\n\t\t\t{\n\t\t\t// Switch Antenna to another one.\n\t\t\tpDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\n\t\t\tpDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;\n\t\t\t\n\t\t\t\tpDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\n\t\t\t\tODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\n\t\t\t}\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t\t{\n\t\t\t\t// Switch Antenna to another one.\n\t\t\t\t\n\t\t\t\ttmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\n\t\t\t\t\n\t\t\t\tif( (pDM_SWAT_Table->CurAntenna = MAIN_ANT) && (tmp_SWAS_NoLink_BK_Reg948==0x200))\n\t\t\t\t{\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\n\t\t\t\t\tpDM_SWAT_Table->CurAntenna = AUX_ANT;\n\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Reg[948]= (( %x )) was in wrong state\\n\", tmp_SWAS_NoLink_BK_Reg948 ));\n\t\t\t\t\treturn FALSE;\n\t\t\t\t}\n\t\t\t\tODM_StallExecution(10);\n\t\t\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink: Change to (( %s-ant))  for testing.\\n\", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?\"MAIN\":\"AUX\"));\n\t\t}\n\t\t\n\t\todm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\n\t\tPlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\n\n\t\treturn TRUE;\n\t}\n\telse //pDM_SWAT_Table->SWAS_NoLink_State == 1\n\t{\n\t\t//1 ScanComple() is called after antenna swiched.\n\t\t//1 Check scan result and determine which antenna is going\n\t\t//1 to be used.\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\" tmpNumBssDesc= (( %d )) \\n\",pMgntInfo->tmpNumBssDesc));// debug for Dino\n\t\t\n\t\tfor(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)\n\t\t{\n\t\t\tpTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1\n\t\t\tpTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2\n\n\t\t\tif(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(pDM_Odm->SupportICType != ODM_RTL8723B)\n\t\t\t{\n\t\t\t\tif(pTmpBssDesc->ChannelNumber == ScanChannel)\n\t\t\t\t{\n\t\t\tif(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)\n\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\\n\"));\n\t\t\t\t\t\tRT_PRINT_STR(COMP_SCAN, DBG_WARNING, \"GetScanInfo(): new Bss SSID:\", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"at ch %d, Original: %d, Test: %d\\n\\n\", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\n\t\t\t\tScore++;\n\t\t\t\tPlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\n\t\t\t}\n\t\t\telse if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)\n\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\\n\"));\n\t\t\t\t\t\tRT_PRINT_STR(COMP_SCAN, DBG_WARNING, \"GetScanInfo(): new Bss SSID:\", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"at ch %d, Original: %d, Test: %d\\n\\n\", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\tScore--;\n\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRT_PRINT_STR(COMP_SCAN, DBG_WARNING, \"GetScanInfo(): new Bss SSID:\", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"at ch %d, Original: %d, Test: %d\\n\", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"The 2nd Antenna didn't get this AP\\n\\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // 8723B\n\t\t\t{ \n\t\t\t\tif(pTmpBssDesc->ChannelNumber == ScanChannel)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"ChannelNumber == ScanChannel -> (( %d )) \\n\", pTmpBssDesc->ChannelNumber ));\n\t\t\t\t\n\t\t\t\t\tif(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2)\n\t\t\t\t\t{\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\ttmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);\n\t\t\t\t\t\tpower_diff = power_diff + tmp_power_diff;\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Original: %d, Test: %d\\n\", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"SSID:\"), pTmpBssDesc->bdSsIdBuf);\n\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"BSSID:\"), pTmpBssDesc->bdBssIdBuf);\n\n\t\t\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"tmp_power_diff: (( %d)),max_power_diff: (( %d)),min_power_diff: (( %d))  \\n\", tmp_power_diff,max_power_diff,min_power_diff));\n\t\t\t\t\t\tif(tmp_power_diff > max_power_diff)\n\t\t\t\t\t\t\tmax_power_diff=tmp_power_diff;\n\t\t\t\t\t\tif(tmp_power_diff < min_power_diff)\n\t\t\t\t\t\t\tmin_power_diff=tmp_power_diff;\n\t\t\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"max_power_diff: (( %d)),min_power_diff: (( %d))  \\n\",max_power_diff,min_power_diff));\n\t\t\t\t\t\t\n\t\t\t\t\t\tPlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\n\t\t\t\t\t}\n\t\t\t\t\telse if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2)\n\t\t\t\t\t{\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\ttmp_power_diff=(u1Byte)(pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);\n\t\t\t\t\t\tpower_diff = power_diff + tmp_power_diff;\t\t\t\t\t\t\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Original: %d, Test: %d\\n\", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"SSID:\"), pTmpBssDesc->bdSsIdBuf);\n\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"BSSID:\"), pTmpBssDesc->bdBssIdBuf);\t\t\t\t\t\t\t\n\t\t\t\t\t\tif(tmp_power_diff > max_power_diff)\n\t\t\t\t\t\t\tmax_power_diff=tmp_power_diff;\n\t\t\t\t\t\tif(tmp_power_diff < min_power_diff)\n\t\t\t\t\t\t\tmin_power_diff=tmp_power_diff;\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse // Pow(Ant1) = Pow(Ant2)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) //  Stamp(Ant1) < Stamp(Ant2) \n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"time_diff: %lld\\n\", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\n\t\t\t\t\t\tif(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Original: %d, Test: %d\\n\", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"SSID:\"), pTmpBssDesc->bdSsIdBuf);\n\t\t\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"BSSID:\"), pTmpBssDesc->bdBssIdBuf);\n\t\t\t\t\t\t\t\tmin_power_diff = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Error !!!]: Time_diff: %lld\\n\", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t}\n\n\t\tif(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\n\t\t{\n\t\t\tif(pMgntInfo->NumBssDesc!=0 && Score<0)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"AUX_ANT\":\"MAIN_ANT\"));\n\n\t\t\t\tif(pDM_FatTable->RxIdleAnt == MAIN_ANT)\n\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\n\t\t\t\telse\n\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\t}\n\t\t\t\n\t\t\tif(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pDM_SWAT_Table->Ant5G=%s\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pDM_SWAT_Table->Ant2G=%s\\n\", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t}\n\t\t}\n\t\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t{\n\t\t\tif(counter == 0)\n\t\t\t{\t\n\t\t\t\tif(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE)\n\t\t\t\t{\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = TRUE;\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Counter=(( 0 )) , [[ Cannot find any AP with Aux-ant ]] ->  Scan Target-channel again  \\n\"));\t\n\n                                        //3 [ Scan again ]\n\t\t\t\t\todm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\n\t\t\t\t\tPlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\n\t\t\t\t\treturn TRUE;\n\t\t\t\t}\n\t\t\t\telse// Pre_Aux_FailDetec == TRUE\n\t\t\t\t{\n\t\t\t\t\t//2 [ Single Antenna ]\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Counter=(( 0 )) , [[  Still cannot find any AP ]] \\n\"));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink(): Single antenna\\n\"));\t\n\t\t\t\t}\n\t\t\t\tpDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\n\t\t\t\t\n\t\t\t\tif(counter==3)\n\t\t\t\t{\n\t\t\t\t\tavg_power_diff = ((power_diff-max_power_diff - min_power_diff)>>1)+ ((max_power_diff + min_power_diff)>>2);\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"counter: (( %d )) ,  power_diff: (( %d )) \\n\", counter, power_diff));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ counter==3 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) ,  min_power_diff: (( %d )) \\n\", avg_power_diff,max_power_diff, min_power_diff));\n\t\t\t\t}\n\t\t\t\telse if(counter>=4)\n\t\t\t\t{\n\t\t\t\t\tavg_power_diff=(power_diff-max_power_diff - min_power_diff) / (counter - 2);\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"counter: (( %d )) ,  power_diff: (( %d )) \\n\", counter, power_diff));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ counter>=4 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) ,  min_power_diff: (( %d )) \\n\", avg_power_diff,max_power_diff, min_power_diff));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse//counter==1,2\n\t\t\t\t{\n\t\t\t\t\tavg_power_diff=power_diff/counter;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"avg_power_diff: (( %d )) , counter: (( %d )) ,  power_diff: (( %d )) \\n\", avg_power_diff,counter, power_diff));\n\t\t\t\t}\n\n\t\t\t\t//2 [ Retry ]\n\t\t\t\tif( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H)  )\n\t\t\t\t{\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.Retry_Counter++;\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[[ Low confidence result ]] avg_power_diff= (( %d ))  ->  Scan Target-channel again ]] \\n\", avg_power_diff));\t\n\n\t\t\t\t\t         //3 [ Scan again ]\n\t\t\t\t\t\todm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\n\t\t\t\t\t\tPlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\n\t\t\t\t\t\treturn TRUE;\t\t\t\t\t         \n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t{\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[[ Still Low confidence result ]]  (( Retry_Counter > 3 )) \\n\"));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink(): Single antenna\\n\"));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//2 [ Dual Antenna ]\n\t\t\t\telse if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L)   ) \n\t\t\t\t{\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\n\t\t\t\t\tif(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\n\t\t\t\t\t}\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"ODM_SwAntDivCheckBeforeLink(): Dual antenna\\n\"));\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.Dual_Ant_Counter++;\n\n\t\t\t\t\t// set bt coexDM from 1ant coexDM to 2ant coexDM\n\t\t\t\t\tBT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2);\n\t\t\t\t\t\n\t\t\t\t\t//3 [ Init antenna diversity ]\n\t\t\t\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \n\t\t\t\t\tODM_AntDivInit(pDM_Odm);\n\t\t\t\t}\n\t\t\t\t//2 [ Single Antenna ]\n\t\t\t\telse if(avg_power_diff > power_target_H)\n\t\t\t\t{\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\n\t\t\t\t\tif(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\n\t\t\t\t\t\tpDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\n\t\t\t\t\t\t//BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);\n\t\t\t\t\t}\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink(): Single antenna\\n\"));\n\t\t\t\t\tpDM_Odm->DM_SWAT_Table.Single_Ant_Counter++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"bResult=(( %d ))\\n\",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Dual_Ant_Counter = (( %d )), Single_Ant_Counter = (( %d )) , Retry_Counter = (( %d )) , Aux_FailDetec_Counter = (( %d ))\\n\\n\\n\",\n\t\t\tpDM_Odm->DM_SWAT_Table.Dual_Ant_Counter,pDM_Odm->DM_SWAT_Table.Single_Ant_Counter,pDM_Odm->DM_SWAT_Table.Retry_Counter,pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter));\n\n\t\t\t//2 recover the antenna setting\n\n\t\t\tif(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\n\t\t\t\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, (pDM_SWAT_Table->SWAS_NoLink_BK_Reg948));\n\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"bResult=(( %d )), Recover  Reg[948]= (( %x )) \\n\\n\",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult, pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 ));\n\n\t\t\t\n\t\t}\n\t\telse if(pDM_Odm->SupportICType == ODM_RTL8192C)\n\t\t{\n\t\t\tif(pMgntInfo->NumBssDesc!=0 && Score<=0)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\n\t\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\\n\", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?\"MAIN\":\"AUX\"));\n\n\t\t\t\tpDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t\t(\"ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\\n\", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?\"AUX\":\"MAIN\"));\n\n\t\t\t\tpDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;\n\n\t\t\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);\n\t\t\t\tpDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\n\t\t\t\tPHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check state reset to default and wait for next time.\n\t\tpDM_SWAT_Table->SWAS_NoLink_State = 0;\n\t\tpMgntInfo->bScanAntDetect = FALSE;\n\n\t\treturn FALSE;\n\t}\n\n#else\n\t\treturn\tFALSE;\n#endif\n\nreturn FALSE;\n}\n\n\n\n\n\n\n//1 [3. PSD Method] ==========================================================\n\n\n\n\nu4Byte\nodm_GetPSDData(\n\tIN \tPVOID\t\t\tpDM_VOID,\n\tIN u2Byte\t\t\tpoint,\n\tIN u1Byte \t\tinitial_gain)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tpsd_report;\n\t\n\tODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);\n\tODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);  //Start PSD calculation, Reg808[22]=0->1\n\tODM_StallExecution(150);//Wait for HW PSD report\n\tODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);//Stop PSD calculation,  Reg808[22]=1->0\n\tpsd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;//Read PSD report, Reg8B4[15:0]\n\t\n\tpsd_report = (u4Byte) (odm_ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain);\n\treturn psd_report;\n}\n\n\n\nVOID\nODM_SingleDualAntennaDetection_PSD(\n\tIN\t PVOID \tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\tpAdapter\t =  pDM_Odm->Adapter;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tu4Byte\tChannel_ori;\n\tu1Byte \tinitial_gain = 0x36;\n\tu1Byte\ttone_idx;\n\tu1Byte\tTone_lenth_1=7, Tone_lenth_2=4;\n\tu2Byte\tTone_idx_1[7]={88, 104, 120, 8, 24, 40, 56};\n\tu2Byte\tTone_idx_2[4]={8, 24, 40, 56};\n\tu4Byte\tPSD_report_Main[11]={0}, PSD_report_Aux[11]={0};\n\t//u1Byte\tTone_lenth_1=4, Tone_lenth_2=2;\n\t//u2Byte\tTone_idx_1[4]={88, 120, 24, 56};\n\t//u2Byte\tTone_idx_2[2]={ 24,  56};\n\t//u4Byte\tPSD_report_Main[6]={0}, PSD_report_Aux[6]={0};\n\n\tu4Byte\tPSD_report_temp,MAX_PSD_report_Main=0,MAX_PSD_report_Aux=0;\n\tu4Byte\tPSD_power_threshold;\n\tu4Byte\tMain_psd_result=0, Aux_psd_result=0;\n\tu4Byte\tRegc50, Reg948, Regb2c,Regc14,Reg908;\n\tu4Byte\ti=0,test_num=8;\n\t\n\n\tif(pDM_Odm->SupportICType != ODM_RTL8723B)\n\t\treturn;\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SingleDualAntennaDetection_PSD()============> \\n\"));\t\n\t\n\t//2 [ Backup Current RF/BB Settings ]\t\n\t\n\tChannel_ori = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\n\tReg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\n\tRegb2c =  ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\n\tRegc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);\n\tRegc14 = ODM_GetBBReg(pDM_Odm, 0xc14, bMaskDWord);\n\tReg908 = ODM_GetBBReg(pDM_Odm, 0x908, bMaskDWord);\n\n\t//2 [ Setting for doing PSD function (CH4)]\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0); //disable whole CCK block\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); // Turn off TX  ->  Pause TX Queue\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0); // [ Set IQK Matrix = 0 ] equivalent to [ Turn off CCA]\n\n\t// PHYTXON while loop\n\tODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x803); \n\twhile (ODM_GetBBReg(pDM_Odm, 0xdf4, BIT6)) \n\t{\n\t\ti++;\n\t\tif (i > 1000000) \n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Wait in %s() more than %d times!\\n\", __FUNCTION__, i));\t\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH4 & 40M\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);\t// 3 wire Disable    88c[23:20]=0xf\n\tODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pt\t//Set PSD 128 ptss\n\tODM_StallExecution(3000);\t\n\t\n\t\n\t//2 [ Doing PSD Function in (CH4)]\n\t\n        //Antenna A\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Switch to Main-ant   (CH4)\\n\"));\n\tODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\n\tODM_StallExecution(10);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"dbg\\n\"));\n\tfor (i=0;i<test_num;i++)\n\t{\t\n\t\tfor (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\n\t\t{\n\t\t\tPSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\n\t\t\t//if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\n\t\t\t\tPSD_report_Main[tone_idx]+=PSD_report_temp;\n\t\t}\n\t}\n        //Antenna B\n       ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Switch to Aux-ant   (CH4)\\n\"));\n       ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\n       ODM_StallExecution(10);\t\n\tfor (i=0;i<test_num;i++)\n\t{\n\t\tfor (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\n\t\t{\n\t\t\tPSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\n\t\t\t//if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\n\t\t\t\tPSD_report_Aux[tone_idx]+=PSD_report_temp;\n\t\t}\n\t}\n\t//2 [ Doing PSD Function in (CH8)]\n\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);\t// 3 wire enable    88c[23:20]=0x0\n\tODM_StallExecution(3000);\t\n\t\n\tODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH8 & 40M\n\t\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);\t// 3 wire Disable    88c[23:20]=0xf\n\tODM_StallExecution(3000);\n\n        //Antenna A\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Switch to Main-ant   (CH8)\\n\"));\n\tODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\n\tODM_StallExecution(10);\n\n\tfor (i=0;i<test_num;i++)\n\t{\n\t\tfor (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\n\t\t{\n\t\t\tPSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\n\t\t\t//if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\n\t\t\t\tPSD_report_Main[Tone_lenth_1+tone_idx]+=PSD_report_temp;\n\t\t}\n\t}\n\n        //Antenna B\n        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Switch to Aux-ant   (CH8)\\n\"));\n        ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\n\tODM_StallExecution(10);\t\n\n\tfor (i=0;i<test_num;i++)\n\t{\n\t\tfor (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\n\t\t{\n\t\t\tPSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\n\t\t\t//if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\n\t\t\t\tPSD_report_Aux[Tone_lenth_1+tone_idx]+=PSD_report_temp;\n\t\t}\n\t}\n\n        //2 [ Calculate Result ]\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\nMain PSD Result: (ALL) \\n\"));\n\tfor (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Tone-%d]: %d, \\n\",(tone_idx+1), PSD_report_Main[tone_idx] ));\n\t\tMain_psd_result+= PSD_report_Main[tone_idx];\n\t\tif(PSD_report_Main[tone_idx]>MAX_PSD_report_Main)\n\t\t\tMAX_PSD_report_Main=PSD_report_Main[tone_idx];\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"--------------------------- \\nTotal_Main= (( %d ))\\n\", Main_psd_result));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"MAX_Main = (( %d ))\\n\", MAX_PSD_report_Main));\n\t\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\nAux PSD Result: (ALL) \\n\"));\n\tfor (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Tone-%d]: %d, \\n\",(tone_idx+1), PSD_report_Aux[tone_idx] ));\n\t\tAux_psd_result+= PSD_report_Aux[tone_idx];\n\t\tif(PSD_report_Aux[tone_idx]>MAX_PSD_report_Aux)\n\t\t\tMAX_PSD_report_Aux=PSD_report_Aux[tone_idx];\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"--------------------------- \\nTotal_Aux= (( %d ))\\n\", Aux_psd_result));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"MAX_Aux = (( %d ))\\n\\n\", MAX_PSD_report_Aux));\n\t\t\n\t//Main_psd_result=Main_psd_result-MAX_PSD_report_Main;\n\t//Aux_psd_result=Aux_psd_result-MAX_PSD_report_Aux;\n\tPSD_power_threshold=(Main_psd_result*7)>>3;\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Main_result , Aux_result ] = [ %d , %d ], PSD_power_threshold=(( %d ))\\n\", Main_psd_result, Aux_psd_result,PSD_power_threshold));\n\t\n\t//3 [ Dual Antenna ]\n\t if(Aux_psd_result >= PSD_power_threshold   ) \n\t{\n\t\tif(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\n\t\t{\n\t\t\tpDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\n\t\t\tpDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"ODM_SwAntDivCheckBeforeLink(): Dual antenna\\n\"));\n\t\t\n\t\t// set bt coexDM from 1ant coexDM to 2ant coexDM\n\t\t//BT_SetBtCoexAntNum(pAdapter, BT_COEX_ANT_TYPE_DETECTED, 2);\n\t\t\t\t\t\n\t\t// Init antenna diversity\n\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \n\t\tODM_AntDivInit(pDM_Odm);\n\t\t}\n\t//3 [ Single Antenna ]\n\telse\n\t{\n\t\tif(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\n\t\t{\n\t\t\tpDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\n\t\t\tpDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"ODM_SwAntDivCheckBeforeLink(): Single antenna\\n\"));\n\t}\n\n\t//2 [ Recover all parameters ]\n\t\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,Channel_ori);\t\n\tODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);\t// 3 wire enable    88c[23:20]=0x0\n\tODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, Regc50);  \t\n\t\n\tODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\n\tODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\n\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1); //enable whole CCK block\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x0); //Turn on TX \t// Resume TX Queue\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, Regc14); // [ Set IQK Matrix = 0 ] equivalent to [ Turn on CCA]\n\tODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, Reg908); \n\t\n\treturn;\n\n}\n\n#endif\nvoid\nodm_SwAntDetectInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n#if(defined(CONFIG_ANT_DETECTION))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\n\t//pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);\n\t//pDM_SWAT_Table->PreAntenna = MAIN_ANT;\n\t//pDM_SWAT_Table->CurAntenna = MAIN_ANT;\n\tpDM_SWAT_Table->SWAS_NoLink_State = 0;\n\tpDM_SWAT_Table->Pre_Aux_FailDetec = FALSE;\n\tpDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff;\n#endif\n}\n\n"
  },
  {
    "path": "hal/phydm/phydm_antdect.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMANTDECT_H__\n#define    __PHYDMANTDECT_H__\n\n#define ANTDECT_VERSION\t\"2.0\" //2014.11.04\n\n#if(defined(CONFIG_ANT_DETECTION))\n//#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\n//ANT Test\n#define\t\tANTTESTALL\t\t0x00\t/*Ant A or B will be Testing*/   \n#define\t\tANTTESTA\t\t0x01\t/*Ant A will be Testing*/\t\n#define\t\tANTTESTB\t\t0x02\t/*Ant B will be testing*/\n\n#define\tMAX_ANTENNA_DETECTION_CNT\t10 \n\n\ntypedef struct _ANT_DETECTED_INFO{\n\tBOOLEAN\t\t\tbAntDetected;\n\tu4Byte\t\t\tdBForAntA;\n\tu4Byte\t\t\tdBForAntB;\n\tu4Byte\t\t\tdBForAntO;\n}ANT_DETECTED_INFO, *PANT_DETECTED_INFO;\n\n\ntypedef enum tag_SW_Antenna_Switch_Definition\n{\n\tAntenna_A = 1,\n\tAntenna_B = 2,\t\n\tAntenna_MAX = 3,\n}DM_SWAS_E;\n\n\n\n//1 [1. Single Tone Method] ===================================================\n\n\n\nVOID\nODM_SingleDualAntennaDefaultSetting(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t);\n\nBOOLEAN\nODM_SingleDualAntennaDetection(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tmode\n\t);\n\n//1 [2. Scan AP RSSI Method] ==================================================\n\n#define SwAntDivCheckBeforeLink\tODM_SwAntDivCheckBeforeLink\n\nBOOLEAN \nODM_SwAntDivCheckBeforeLink(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t);\n\n\n\n\n//1 [3. PSD Method] ==========================================================\n\n\nVOID\nODM_SingleDualAntennaDetection_PSD(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\n#endif\n\nVOID\nodm_SwAntDetectInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t);\n\n\n#endif\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_antdiv.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n//======================================================\n// when antenna test utility is on or some testing need to disable antenna diversity\n// call this function to disable all ODM related mechanisms which will switch antenna.\n//======================================================\nVOID\nODM_StopAntennaSwitchDm(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t// disable ODM antenna diversity\n\tpDM_Odm->SupportAbility &= ~ODM_BB_ANT_DIV;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"STOP Antenna Diversity \\n\"));\n}\n\nVOID\nODM_SetAntConfig(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\t\tantSetting\t// 0=A, 1=B, 2=C, ....\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif(antSetting == 0)\t\t// ant A\n\t\t\tODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);\n\t\telse if(antSetting == 1)\n\t\t\tODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);\n\t}\n}\n\n//======================================================\n\n\nVOID\nODM_SwAntDivRestAfterLink(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tu4Byte             i;\n\n\tif(pDM_Odm->SupportICType == ODM_RTL8723A)\n\t{\n\t    pDM_SWAT_Table->RSSI_cnt_A = 0;\n\t    pDM_SWAT_Table->RSSI_cnt_B = 0;\n\t    pDM_Odm->RSSI_test = FALSE;\n\t    pDM_SWAT_Table->try_flag = 0xff;\n\t    pDM_SWAT_Table->RSSI_Trying = 0;\n\t    pDM_SWAT_Table->SelectAntennaMap=0xAA;\n\t\n\t}\n\telse if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))\n\t{\n\t\tpDM_Odm->RSSI_test = FALSE;\n\t\tpDM_SWAT_Table->try_flag = 0xff;\n\t\tpDM_SWAT_Table->RSSI_Trying = 0;\n\t\tpDM_SWAT_Table->Double_chk_flag= 0;\n\t\t\n\t\tpDM_FatTable->RxIdleAnt=MAIN_ANT;\n\t\t\n\t\tfor (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t\t{\n\t\t\tpDM_FatTable->MainAnt_Sum[i] = 0;\n\t\t\tpDM_FatTable->AuxAnt_Sum[i] = 0;\n\t\t\tpDM_FatTable->MainAnt_Cnt[i] = 0;\n\t\t\tpDM_FatTable->AuxAnt_Cnt[i] = 0;\n\t\t}\n\n\t}\n}\n\n\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\nVOID\nodm_AntDiv_on_off( \n\tIN \tPVOID\t\tpDM_VOID ,\n\tIN \tu1Byte \t\tswch\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\n\tif(pDM_FatTable->AntDiv_OnOff != swch)\n\t{\n\t\tif(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV) \n\t\t\treturn;\n\n\t\tif(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"(( Turn %s )) N-Series HW-AntDiv block\\n\",(swch==ANTDIV_ON)?\"ON\" : \"OFF\"));\n\t\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable\n\t\t\tODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable\n\t\t}\n\t\telse if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"(( Turn %s )) AC-Series HW-AntDiv block\\n\",(swch==ANTDIV_ON)?\"ON\" : \"OFF\"));\n\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable\n\t\t\t} else {\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable\n\t\t\t\t\n\t\t\t\tif( (pDM_Odm->CutVersion >= ODM_CUT_C) && (pDM_Odm->SupportICType == ODM_RTL8821) && ( pDM_Odm->AntDivType != S0S1_SW_ANTDIV))\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"(( Turn %s )) CCK HW-AntDiv block\\n\",(swch==ANTDIV_ON)?\"ON\" : \"OFF\"));\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); \n\t\t\t\t\tODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, swch); //CCK AntDiv function block enable\n\t\t\t\t}\n\t\t        }\n\t\t}\n\t}\n\tpDM_FatTable->AntDiv_OnOff =swch;\n\t\n}\n\nVOID\nphydm_FastTraining_enable(\n\tIN\t\tPVOID\t\tpDM_VOID, \n\tIN \t\tu1Byte  \t\t\tswch\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tenable;\n\n\tif (swch == FAT_ON)\n\t\tenable=1;\n\telse\n\t\tenable=0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Fast Ant Training_en = ((%d))\\n\", enable));\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E) {\n\t\tODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, enable);\t/*enable fast training*/\n\t\t/**/\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\n\t\tODM_SetBBReg(pDM_Odm, 0xB34 , BIT28, enable);\t/*enable fast training (path-A)*/\n\t\t/*ODM_SetBBReg(pDM_Odm, 0xB34 , BIT29, enable);*/\t/*enable fast training (path-B)*/\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8821) {\n\t\tODM_SetBBReg(pDM_Odm, 0x900 , BIT19, enable);\t/*enable fast training */\n\t\t/**/\n\t}\n}\n\nVOID\nodm_Tx_By_TxDesc_or_Reg( \n\tIN \t\tPVOID\t\tpDM_VOID, \n\tIN \t\tu1Byte \t\t\tswch\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte enable;\n\t\n\tif( swch== TX_BY_DESC)\n\t\tenable=1;\n\telse\n\t\tenable=0;\n\n\tif(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)\n\t{\n\t\tif(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\n\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x80c , BIT21, enable); \n\t\t}\t\n\t\telse if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\n\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x900 , BIT18, enable); \n\t\t}\n\t}\n}\n\n\nu1Byte\nphydm_traffic_load_decision( \n\tIN\t\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tu8Byte\t\tcurTxOkCnt = 0, curRxOkCnt = 0;\n\tu1Byte\t\ttraffic;\n\t\n\t/*---trafic load decision---*/\n\tcurTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;\n\tcurRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;\n\tpDM_SWAT_Table->lastTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast);\n\tpDM_SWAT_Table->lastRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"TxOkCnt=(( %llu )), RxOkCnt=(( %llu ))\\n\", \n\t\tcurTxOkCnt, curRxOkCnt));\n\t\n\tif (curTxOkCnt > 1875000 || curRxOkCnt > 1875000) {/*if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)  ( 1.875M * 8bit ) / 2= 7.5M bits /sec )*/\n\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[HIGH Traffic]\\n\"));\n\t\ttraffic = TRAFFIC_HIGH;\n\t} else if (curTxOkCnt > 125000 || curRxOkCnt > 125000)  { /*( 0.125M * 8bit ) / 2 =  0.5M bits /sec )*/\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Low Traffic]\\n\"));\n\t\ttraffic = TRAFFIC_LOW;\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Ultra-Low Traffic]\\n\"));\n\t\ttraffic = TRAFFIC_ULTRA_LOW;\n\t}\n\treturn traffic;\n}\n\nVOID\nODM_UpdateRxIdleAnt(\n\tIN \t\tPVOID \t\tpDM_VOID, \n\tIN \t\tu1Byte \t\tAnt\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tu4Byte\tDefaultAnt, OptionalAnt,value32;\n\n\tif(pDM_FatTable->RxIdleAnt != Ant)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] RxIdleAnt =%s\\n\",(Ant==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\n\t\tif(!(pDM_Odm->SupportICType & ODM_RTL8723B))\n                \tpDM_FatTable->RxIdleAnt = Ant;\n\n\t\tif(Ant == MAIN_ANT)\n\t\t{\n\t\t\tDefaultAnt   =  ANT1_2G; \n\t\t\tOptionalAnt =  ANT2_2G; \n\t\t}\n\t\telse\n\t\t{\n\t\t\tDefaultAnt  =   ANT2_2G;\n\t\t\tOptionalAnt =  ANT1_2G;\n\t\t}\n\t\n\t\tif(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\n\t\t{\n\t\t\tif(pDM_Odm->SupportICType==ODM_RTL8192E)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xB38 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, OptionalAnt);//Optional RX\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);//Default TX\t\n\t\t\t}\n\t\t\t#if (RTL8723B_SUPPORT == 1)\n\t\t\telse if(pDM_Odm->SupportICType==ODM_RTL8723B)\n\t\t\t{\n\t\t\t\tvalue32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF);\n\t\t\t\n\t\t\t\tif(value32 !=0x280)\n\t\t\t\t\tODM_UpdateRxIdleAnt_8723B(pDM_Odm, Ant, DefaultAnt, OptionalAnt);\n\t\t\t\telse\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to 0x948 = 0x280\\n\"));\n\t\t\t}\n\t\t\t#endif\n\t\t\telse //88E\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt);\t//Default RX\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt);\t//Optional RX\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt);\t        //Default TX\t\n\t\t\t}\n\t\t}\n\t\telse if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)\n\t\t{\n\t\t\tu2Byte\tvalue16 = ODM_Read2Byte(pDM_Odm, ODM_REG_TRMUX_11AC+2);\n\t\t\t//\n\t\t\t// 2014/01/14 MH/Luke.Lee Add direct write for register 0xc0a to prevnt \n\t\t\t// incorrect 0xc08 bit0-15 .We still not know why it is changed.\n\t\t\t//\n\t\t\tvalue16 &= ~(BIT11|BIT10|BIT9|BIT8|BIT7|BIT6|BIT5|BIT4|BIT3);\n\t\t\tvalue16 |= ((u2Byte)DefaultAnt <<3);\n\t\t\tvalue16 |= ((u2Byte)OptionalAnt <<6);\n\t\t\tvalue16 |= ((u2Byte)DefaultAnt <<9);\n\t\t\tODM_Write2Byte(pDM_Odm, ODM_REG_TRMUX_11AC+2, value16);\n\t\t\t/*\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT21|BIT20|BIT19, DefaultAnt);\t //Default RX\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT24|BIT23|BIT22, OptionalAnt);//Optional RX\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC , BIT27|BIT26|BIT25, DefaultAnt);\t //Default TX\n\t\t\t*/\n\t\t}\n\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8188E)\n\t\t{\t\t\n\t\t\tODM_SetMACReg(pDM_Odm, 0x6D8 , BIT7|BIT6, DefaultAnt);\t//\u0014PathA Resp Tx\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt);\t//\u0014PathA Resp Tx\n\t\t}\t\n\n\t}\n\telse// pDM_FatTable->RxIdleAnt == Ant\n        {\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Stay in Ori-Ant ]  RxIdleAnt =%s\\n\",(Ant==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\tpDM_FatTable->RxIdleAnt = Ant;\n\t}\n}\n\nVOID\nodm_UpdateTxAnt(\n\tIN \t\tPVOID \t\tpDM_VOID, \n\tIN \t\tu1Byte \t\tAnt, \n\tIN \t\tu4Byte \t\tMacId\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tu1Byte\tTxAnt;\n\n\tif (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)\n\t{\n\t\tTxAnt=Ant;\n\t}\n\telse\n\t{\n        \tif(Ant == MAIN_ANT)\n        \t\tTxAnt = ANT1_2G;\n        \telse\n        \t\tTxAnt = ANT2_2G;\n\t}\n\t\n\tpDM_FatTable->antsel_a[MacId] = TxAnt&BIT0;\n\tpDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1;\n\tpDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2;\n\t\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Tx from TxInfo]: MacID:(( %d )),  TxAnt = (( %s ))\\n\", MacId,(Ant==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"antsel_tr_mux=(( 3'b%d%d%d ))\\n\",pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] ));\n\t\n}\n\n#ifdef BEAMFORMING_SUPPORT\n#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\nVOID\nodm_BDC_Init(\n\tIN \t\tPVOID \t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpBDC_T\tpDM_BdcTable=&pDM_Odm->DM_BdcTable;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n[ BDC Initialization......] \\n\"));\n\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\tpDM_BdcTable->BDC_Mode=BDC_MODE_NULL;\n\tpDM_BdcTable->BDC_Try_flag=0;\n\tpDM_BdcTable->BDCcoexType_wBfer=0;\n\tpDM_Odm->bdc_holdstate=0xff;\n\t\n\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0xd7c , 0x0FFFFFFF, 0x1081008); \n\t\tODM_SetBBReg(pDM_Odm, 0xd80 , 0x0FFFFFFF, 0); \n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x9b0 , 0x0FFFFFFF, 0x1081008);     //0x9b0[30:0] = 01081008\n\t\tODM_SetBBReg(pDM_Odm, 0x9b4 , 0x0FFFFFFF, 0);                 //0x9b4[31:0] = 00000000\n\t}\n\t\n}\n\n\nVOID\nodm_CSI_on_off(\n\tIN \t\tPVOID \t\tpDM_VOID, \n\tIN \t\tu1Byte \t\t\tCSI_en\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(CSI_en==CSI_ON)\n\t{\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\t{\n\t\t\tODM_SetMACReg(pDM_Odm, 0xd84 , BIT11, 1);  //0xd84[11]=1\n\t\t}\n\t\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t{\n\t\t\tODM_SetMACReg(pDM_Odm, 0x9b0 , BIT31, 1);  //0x9b0[31]=1\n\t\t}\n\t\n\t}\n\telse if(CSI_en==CSI_OFF)\n\t{\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\t{\n\t\t\tODM_SetMACReg(pDM_Odm, 0xd84 , BIT11, 0);  //0xd84[11]=0\n\t\t}\n\t\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t{\n\t\t\tODM_SetMACReg(pDM_Odm, 0x9b0 , BIT31, 0);  //0x9b0[31]=0\n\t\t}\n\t}\t\n}\n\nVOID\nodm_BDCcoexType_withBferClient(\n\tIN \t\tPVOID \t\tpDM_VOID, \n\tIN \t\tu1Byte \t\t\tswch\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpBDC_T \tpDM_BdcTable = &pDM_Odm->DM_BdcTable;\n\tu1Byte     BDCcoexType_wBfer;\n\t\n\tif(swch==DIVON_CSIOFF)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[BDCcoexType: 1] {DIV,CSI} ={1,0} \\n\"));\n\t\tBDCcoexType_wBfer=1;\n\n\t\tif(BDCcoexType_wBfer != pDM_BdcTable->BDCcoexType_wBfer)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\t\t\todm_CSI_on_off(pDM_Odm,CSI_OFF);\n\t\t\tpDM_BdcTable->BDCcoexType_wBfer=1;\n\t\t}\n\t}\n\telse if(swch==DIVOFF_CSION)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[BDCcoexType: 2] {DIV,CSI} ={0,1}\\n\"));\n\t\tBDCcoexType_wBfer=2;\n\n\t\tif(BDCcoexType_wBfer != pDM_BdcTable->BDCcoexType_wBfer)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\todm_CSI_on_off(pDM_Odm,CSI_ON);\n\t\t\tpDM_BdcTable->BDCcoexType_wBfer=2;\n\t\t}\n\t}\n}\n\nVOID\nodm_BF_AntDiv_ModeArbitration(\n\tIN \t\tPVOID \t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpBDC_T \t\t\tpDM_BdcTable = &pDM_Odm->DM_BdcTable;\n\tu1Byte\t\t\tcurrent_BDC_Mode;\n\n\t#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n\"));\n\t\n\t\t//2 Mode 1\n\t\tif((pDM_BdcTable->num_Txbfee_Client !=0) && (pDM_BdcTable->num_Txbfer_Client == 0))\n\t\t{\n\t\t\tcurrent_BDC_Mode=BDC_MODE_1;\n\t\t\t\n\t\t\tif(current_BDC_Mode != pDM_BdcTable->BDC_Mode)\n\t\t\t{\n\t\t\t\tpDM_BdcTable->BDC_Mode=BDC_MODE_1;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF);\n\t\t\t\tpDM_BdcTable->BDC_RxIdleUpdate_counter=1;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Change to (( Mode1 ))\\n\"));\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Antdiv + BF coextance Mode] : (( Mode1 ))\\n\"));\n\t\t}\n\t\t//2 Mode 2\n\t\telse if((pDM_BdcTable->num_Txbfee_Client ==0) && (pDM_BdcTable->num_Txbfer_Client != 0))\n\t\t{\n\t\t\tcurrent_BDC_Mode=BDC_MODE_2;\n\t\t\t\n\t\t\tif(current_BDC_Mode != pDM_BdcTable->BDC_Mode)\n\t\t\t{\n\t\t\t\tpDM_BdcTable->BDC_Mode=BDC_MODE_2;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Change to (( Mode2 ))\\n\"));\n\t\t\t\t\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Antdiv + BF coextance Mode] : (( Mode2 ))\\n\"));\n\t\t}\n\t\t//2 Mode 3\n\t\telse if((pDM_BdcTable->num_Txbfee_Client !=0) && (pDM_BdcTable->num_Txbfer_Client != 0))\n\t\t{\n\t\t\tcurrent_BDC_Mode=BDC_MODE_3;\n\t\t\t\n\t\t\tif(current_BDC_Mode != pDM_BdcTable->BDC_Mode)\n\t\t\t{\n\t\t\t\tpDM_BdcTable->BDC_Mode=BDC_MODE_3;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_RxIdleUpdate_counter=1;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Change to (( Mode3 ))\\n\"));\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Antdiv + BF coextance Mode] : (( Mode3 ))\\n\"));\n\t\t}\n\t\t//2 Mode 4\n\t\telse if((pDM_BdcTable->num_Txbfee_Client ==0) && (pDM_BdcTable->num_Txbfer_Client == 0))\n\t\t{\n\t\t\tcurrent_BDC_Mode=BDC_MODE_4;\n\t\t\t\n\t\t\tif(current_BDC_Mode != pDM_BdcTable->BDC_Mode)\n\t\t\t{\n\t\t\t\tpDM_BdcTable->BDC_Mode=BDC_MODE_4;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Change to (( Mode4 ))\\n\"));\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Antdiv + BF coextance Mode] : (( Mode4 ))\\n\"));\n\t\t}\n\t#endif\n\n}\n\nVOID\nodm_DivTrainState_setting( \n\tIN\t\tPVOID \t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpBDC_T\tpDM_BdcTable=&pDM_Odm->DM_BdcTable;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n*****[S T A R T ]*****  [2-0. DIV_TRAIN_STATE] \\n\"));\n\tpDM_BdcTable->BDC_Try_counter =2;\n\tpDM_BdcTable->BDC_Try_flag=1; \n\tpDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE;\t\t\t\t\t\n\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF);\n}\n\nVOID\nodm_BDCcoex_BFeeRxDiv_Arbitration(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpBDC_T    pDM_BdcTable = &pDM_Odm->DM_BdcTable;\n\tBOOLEAN StopBF_flag;\n\tu1Byte \tBDC_active_Mode;\n\n\n\t#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***{ num_BFee,  num_BFer , num_Client}  = (( %d  ,  %d  ,  %d))  \\n\",pDM_BdcTable->num_Txbfee_Client,pDM_BdcTable->num_Txbfer_Client,pDM_BdcTable->num_Client));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***{ num_BF_tars,  num_DIV_tars }  = ((  %d  ,  %d ))  \\n\",pDM_BdcTable->num_BfTar , pDM_BdcTable->num_DivTar ));\n\n\t\t//2 [ MIB control ]\n\t\tif (pDM_Odm->bdc_holdstate==2) \n\t\t{\n\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); \n\t\t\tpDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Force in [ BF STATE] \\n\"));\n\t\t\treturn;\t\n\t\t}\n\t\telse if (pDM_Odm->bdc_holdstate==1) \n\t\t{\n\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE;\n\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); \n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Force in [ DIV STATE] \\n\"));\n\t\t\treturn;\t\n\t\t}\n\n\t\t//------------------------------------------------------------\n\n\n\t\t\n\t\t//2 Mode 2 & 3\n\t\tif(pDM_BdcTable->BDC_Mode==BDC_MODE_2 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3)\n\t\t{\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n{ Try_flag ,  Try_counter } = {  %d , %d  } \\n\",pDM_BdcTable->BDC_Try_flag,pDM_BdcTable->BDC_Try_counter));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BDCcoexType = (( %d ))  \\n\\n\", pDM_BdcTable->BDCcoexType_wBfer));\n\t\t\t\n                        // All Client have Bfer-Cap-------------------------------\n\t\t\tif(pDM_BdcTable->num_Txbfer_Client == pDM_BdcTable->num_Client) //BFer STA Only?: yes\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BFer STA only?  (( Yes ))\\n\"));\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BFer STA only?  (( No ))\\n\"));\n\t\t\t}\n\t\t\t//\n\t\t\tif(pDM_BdcTable->bAll_BFSta_Idle==FALSE && pDM_BdcTable->bAll_DivSta_Idle==TRUE)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"All DIV-STA are idle, but BF-STA not\\n\"));\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if(pDM_BdcTable->bAll_BFSta_Idle==TRUE && pDM_BdcTable->bAll_DivSta_Idle==FALSE)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"All BF-STA are idle, but DIV-STA not\\n\"));\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//Select active mode--------------------------------------\n\t\t\tif(pDM_BdcTable->num_BfTar ==0) //  Selsect_1,  Selsect_2\n\t\t\t{\n\t\t\t\tif(pDM_BdcTable->num_DivTar ==0)  // Selsect_3\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Select active mode (( 1 )) \\n\"));\n\t\t\t\t\tpDM_BdcTable->BDC_active_Mode=1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Select active mode  (( 2 ))\\n\"));\n\t\t\t\t\tpDM_BdcTable->BDC_active_Mode=2;\n\t\t\t\t}\n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse // num_BfTar > 0\n\t\t\t{\t\t\t\n\t\t\t\tif(pDM_BdcTable->num_DivTar ==0)  // Selsect_3\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Select active mode (( 3 ))\\n\"));\t\t\n\t\t\t\t\tpDM_BdcTable->BDC_active_Mode=3;\n\t\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_BFer_TRAIN_STATE;\n\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse // Selsect_4\n\t\t\t\t{\n\t\t\t\t\tBDC_active_Mode=4;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Select active mode (( 4 ))\\n\"));\t\n\t\t\t\t\t\n\t\t\t\t\tif(BDC_active_Mode!=pDM_BdcTable->BDC_active_Mode)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->BDC_active_Mode=4;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Change to active mode (( 4 ))  &  return!!! \\n\"));\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n#if 1\n\t\tif (pDM_Odm->bdc_holdstate==0xff) \n\t\t{\n\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE;\n\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); \n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Force in [ DIV STATE] \\n\"));\t\n\t\t\treturn;\n\t\t}\n#endif\n\n\t\t\t// Does Client number changed ? -------------------------------\n\t\t\tif(pDM_BdcTable->num_Client !=pDM_BdcTable->pre_num_Client)\n\t\t\t{ \n\t\t\t\tpDM_BdcTable->BDC_Try_flag=0;\n\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_TRAIN_STATE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[  The number of client has been changed !!!]   return to (( BDC_DIV_TRAIN_STATE )) \\n\"));\t\n\t\t\t}\n\t\t\tpDM_BdcTable->pre_num_Client=pDM_BdcTable->num_Client;\n\n\t\t\tif( pDM_BdcTable->BDC_Try_flag==0)\n\t\t\t{\n\t\t\t\t//2 DIV_TRAIN_STATE (Mode 2-0)\n\t\t\t\tif(pDM_BdcTable->BDC_state==BDC_DIV_TRAIN_STATE)\n\t\t\t\t{\n\t\t\t\t\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t}\n\t\t\t\t//2 BFer_TRAIN_STATE (Mode 2-1)\n\t\t\t\telse if(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE) \n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*****[2-1. BFer_TRAIN_STATE ]*****  \\n\"));\n\t\t\t\t\t\n\t\t\t\t\t//if(pDM_BdcTable->num_BfTar==0) \n\t\t\t\t\t//{\n\t\t\t\t\t//\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BF_tars exist?  : (( No )),   [ BDC_BFer_TRAIN_STATE ] >> [BDC_DIV_TRAIN_STATE] \\n\"));\n\t\t\t\t\t//\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t\t//}\n\t\t\t\t\t//else //num_BfTar != 0\n\t\t\t\t\t//{\n\t\t\t\t\t\tpDM_BdcTable->BDC_Try_counter=2;\n\t\t\t\t\t\tpDM_BdcTable->BDC_Try_flag=1;\n\t\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_DECISION_STATE;\n\t\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); \n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BF_tars exist?  : (( Yes )),   [ BDC_BFer_TRAIN_STATE ] >> [BDC_DECISION_STATE] \\n\"));\n\t\t\t\t\t//}\n\t\t\t\t}\n\t\t\t\t//2 DECISION_STATE (Mode 2-2)\n\t\t\t\telse if(pDM_BdcTable->BDC_state==BDC_DECISION_STATE)\n\t\t\t\t{\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*****[2-2. DECISION_STATE]***** \\n\"));\n\t\t\t\t\t//if(pDM_BdcTable->num_BfTar==0) \n\t\t\t\t\t//{\n\t\t\t\t\t//\tODM_AntDiv_Printk((\"BF_tars exist?  : (( No )),   [ DECISION_STATE ] >> [BDC_DIV_TRAIN_STATE] \\n\"));\n\t\t\t\t\t//\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t\t//}\n\t\t\t\t\t//else //num_BfTar != 0\n\t\t\t\t\t//{\n\t\t\t\t\t\tif(pDM_BdcTable->BF_pass==FALSE || pDM_BdcTable->DIV_pass == FALSE)\n\t\t\t\t\t\t\tStopBF_flag=TRUE;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tStopBF_flag=FALSE;\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BF_tars exist?  : (( Yes )),  {BF_pass, DIV_pass, StopBF_flag }  = { %d, %d, %d } \\n\" ,pDM_BdcTable->BF_pass,pDM_BdcTable->DIV_pass,StopBF_flag));\n\t\t\t\t\t\n\t\t\t\t\t\tif(StopBF_flag==TRUE) //DIV_en\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_BdcTable->BDC_Hold_counter=10; //20\n\t\t\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); \n\t\t\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ StopBF_flag= ((TRUE)),   BDC_DECISION_STATE ] >> [BDC_DIV_HOLD_STATE] \\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse //BF_en\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_BdcTable->BDC_Hold_counter=10; //20\n\t\t\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION); \n\t\t\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[StopBF_flag= ((FALSE)),   BDC_DECISION_STATE ] >> [BDC_BF_HOLD_STATE] \\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t//}\n\t\t\t\t}\n\t\t\t\t//2 BF-HOLD_STATE (Mode 2-3)\n\t\t\t\telse if(pDM_BdcTable->BDC_state==BDC_BF_HOLD_STATE)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*****[2-3. BF_HOLD_STATE ]*****\\n\"));\t\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BDC_Hold_counter = (( %d )) \\n\",pDM_BdcTable->BDC_Hold_counter ));\t\n\n\t\t\t\t\tif(pDM_BdcTable->BDC_Hold_counter==1)\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \\n\"));\t\n\t\t\t\t\t\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->BDC_Hold_counter--;\n\t\t\t\t\t\t\n\t\t\t\t\t\t//if(pDM_BdcTable->num_BfTar==0) \n\t\t\t\t\t\t//{\n\t\t\t\t\t\t//\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BF_tars exist?  : (( No )),   [ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \\n\"));\t\n\t\t\t\t\t\t//\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t\t\t//}\n\t\t\t\t\t\t//else //num_BfTar != 0\n\t\t\t\t\t\t//{\n\t\t\t\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BF_tars exist?  : (( Yes ))\\n\"));\t\n\t\t\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_BF_HOLD_STATE;\n\t\t\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVOFF_CSION);\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ BDC_BF_HOLD_STATE ] >> [BDC_BF_HOLD_STATE] \\n\"));\t\n\t\t\t\t\t\t//}\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//2 DIV-HOLD_STATE (Mode 2-4)\n\t\t\t\telse if(pDM_BdcTable->BDC_state==BDC_DIV_HOLD_STATE)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*****[2-4. DIV_HOLD_STATE ]*****\\n\"));\t\n\t\t\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"BDC_Hold_counter = (( %d )) \\n\",pDM_BdcTable->BDC_Hold_counter ));\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_BdcTable->BDC_Hold_counter==1)\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE] \\n\"));\t\n\t\t\t\t\t\todm_DivTrainState_setting( pDM_Odm);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->BDC_Hold_counter--;\n\t\t\t\t\t\tpDM_BdcTable->BDC_state=BDC_DIV_HOLD_STATE;\n\t\t\t\t\t\todm_BDCcoexType_withBferClient( pDM_Odm, DIVON_CSIOFF); \n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_HOLD_STATE] \\n\"));\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse if( pDM_BdcTable->BDC_Try_flag==1)\n\t\t\t{\n\t\t\t\t//2 Set Training Counter\n\t\t\t\tif(pDM_BdcTable->BDC_Try_counter >1)\n\t\t\t\t{\n\t\t\t\t\tpDM_BdcTable->BDC_Try_counter--;\n\t\t\t\t\tif(pDM_BdcTable->BDC_Try_counter ==1)\n\t\t\t\t\t\tpDM_BdcTable->BDC_Try_flag=0; \n\t\t\t\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Training !!\\n\"));\n\t\t\t\t\t//return ;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n[end]\\n\"));\n\n\t#endif //#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\n\n\n\n\n\t\n\n}\n\n#endif\n#endif //#ifdef BEAMFORMING_SUPPORT\n\n\n#if (RTL8188E_SUPPORT == 1)\n\n\nVOID\nodm_RX_HWAntDiv_Init_88E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\tvalue32;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\n\tif(pDM_Odm->mp_mode == TRUE)\n\t{\n\t\tpDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);  // 1:CG, 0:CS\n        \treturn;\n\t}\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8188E AntDiv_Init =>  AntDivType=[CGCS_RX_HW_ANTDIV]\\n\"));\n\t\n\t//MAC Setting\n\tvalue32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);\n\tODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\n\t//Pin Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 \t\t//antsel antselb by HW\n\tODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0);\t//Reg864[10]=1'b0 \t//antsel2 by HW\n\tODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 1);\t//Regb2c[22]=1'b0 \t//disable CS/CG switch\n\tODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);\t//Regb2c[31]=1'b1\t//output at CG only\n\t//OFDM Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);\n\t//CCK Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue\n\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples\t\n\t\n\tODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0001);\t//antenna mapping table\n\n\tpDM_FatTable->enable_ctrl_frame_antdiv = 1;\n}\n\nVOID\nodm_TRX_HWAntDiv_Init_88E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\tvalue32;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\n\tif(pDM_Odm->mp_mode == TRUE)\n\t{\n\t\tpDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv \n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX   (0/1)\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8188E AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\\n\"));\n\t\n\t//MAC Setting\n\tvalue32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);\n\tODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\n\t//Pin Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 \t\t//antsel antselb by HW\n\tODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0);\t//Reg864[10]=1'b0 \t//antsel2 by HW\n\tODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 0);\t//Regb2c[22]=1'b0 \t//disable CS/CG switch\n\tODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1);\t//Regb2c[31]=1'b1\t//output at CG only\n\t//OFDM Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);\n\t//CCK Settings\n\tODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue\n\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples\n\n\t//antenna mapping table\n\tif(!pDM_Odm->bIsMPChip) //testchip\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT10|BIT9|BIT8, 1);\t//Reg858[10:8]=3'b001\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT13|BIT12|BIT11, 2);\t//Reg858[13:11]=3'b010\n\t}\n\telse //MPchip\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201);\t/*Reg914=3'b010, Reg915=3'b001*/\n\n\tpDM_FatTable->enable_ctrl_frame_antdiv = 1;\n}\n\n\n#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\nVOID\nodm_Smart_HWAntDiv_Init_88E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\tvalue32, i;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8188E AntDiv_Init =>  AntDivType=[CG_TRX_SMART_ANTDIV]\\n\"));\n    \n\tif(pDM_Odm->mp_mode == TRUE)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"pDM_Odm->AntDivType: %d\\n\", pDM_Odm->AntDivType));\n\t\treturn;\n\t}\n\n\tpDM_FatTable->TrainIdx = 0;\n\tpDM_FatTable->FAT_State = FAT_PREPARE_STATE;\n\t\n\tpDM_Odm->fat_comb_a=5;\n\tpDM_Odm->antdiv_intvl = 0x64; // 100ms\n\n\tfor(i=0; i<6; i++)\n\t{\n\t\tpDM_FatTable->Bssid[i] = 0;\n\t}\n\tfor(i=0; i< (pDM_Odm->fat_comb_a) ; i++)\n\t{\n\t\tpDM_FatTable->antSumRSSI[i] = 0;\n\t\tpDM_FatTable->antRSSIcnt[i] = 0;\n\t\tpDM_FatTable->antAveRSSI[i] = 0;\n\t}\n\n\t//MAC Setting\n\tvalue32 = ODM_GetMACReg(pDM_Odm, 0x4c, bMaskDWord);\n\tODM_SetMACReg(pDM_Odm, 0x4c, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output\n\tvalue32 = ODM_GetMACReg(pDM_Odm,  0x7B4, bMaskDWord);\n\tODM_SetMACReg(pDM_Odm, 0x7b4, bMaskDWord, value32|(BIT16|BIT17)); //Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match\n\t//value32 = PlatformEFIORead4Byte(Adapter, 0x7B4);\n\t//PlatformEFIOWrite4Byte(Adapter, 0x7b4, value32|BIT18);\t//append MACID in reponse packet\n\n\t//Match MAC ADDR\n\tODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, 0);\n\tODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, 0);\n\t\n\tODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 \t\t//antsel antselb by HW\n\tODM_SetBBReg(pDM_Odm, 0x864 , BIT10, 0);\t//Reg864[10]=1'b0 \t//antsel2 by HW\n\tODM_SetBBReg(pDM_Odm, 0xb2c , BIT22, 0);\t//Regb2c[22]=1'b0 \t//disable CS/CG switch\n\tODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 0);\t//Regb2c[31]=1'b1\t//output at CS only\n\tODM_SetBBReg(pDM_Odm, 0xca4 , bMaskDWord, 0x000000a0);\n\t\n\t//antenna mapping table\n\tif(pDM_Odm->fat_comb_a == 2)\n\t{\n\t\tif(!pDM_Odm->bIsMPChip) //testchip\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 1);\t//Reg858[10:8]=3'b001\n\t\t\tODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 2);\t//Reg858[13:11]=3'b010\n\t\t}\n\t\telse //MPchip\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(!pDM_Odm->bIsMPChip) //testchip\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 0);\t//Reg858[10:8]=3'b000\n\t\t\tODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 1);\t//Reg858[13:11]=3'b001\n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT16, 0);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x858 , BIT15|BIT14, 2);\t//(Reg878[0],Reg858[14:15])=3'b010\n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT19|BIT18|BIT17, 3);//Reg878[3:1]=3b'011\n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT22|BIT21|BIT20, 4);//Reg878[6:4]=3b'100\n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT25|BIT24|BIT23, 5);//Reg878[9:7]=3b'101 \n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT28|BIT27|BIT26, 6);//Reg878[12:10]=3b'110 \n\t\t\tODM_SetBBReg(pDM_Odm, 0x878 , BIT31|BIT30|BIT29, 7);//Reg878[15:13]=3b'111\n\t\t}\n\t\telse //MPchip\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 4);     // 0: 3b'000\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2);     // 1: 3b'001\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 0);     // 2: 3b'010\n\t\t\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 1);     // 3: 3b'011\n\t\t\tODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 3);     // 4: 3b'100\n\t\t\tODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5);     // 5: 3b'101\n\t\t\tODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6);     // 6: 3b'110\n\t\t\tODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 255); // 7: 3b'111\n\t\t}\n\t}\n\n\t//Default Ant Setting when no fast training\n\tODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, 0);\t//Default RX\n\tODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, 1);\t//Optional RX\n\tODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 0);//Default TX\n\n\t//Enter Traing state\n\tODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (pDM_Odm->fat_comb_a-1));\t//Reg864[2:0]=3'd6\t//ant combination=reg864[2:0]+1\n\n\t//SW Control\n\t//PHY_SetBBReg(Adapter, 0x864 , BIT10, 1);\n\t//PHY_SetBBReg(Adapter, 0x870 , BIT9, 1);\n\t//PHY_SetBBReg(Adapter, 0x870 , BIT8, 1);\n\t//PHY_SetBBReg(Adapter, 0x864 , BIT11, 1);\n\t//PHY_SetBBReg(Adapter, 0x860 , BIT9, 0);\n\t//PHY_SetBBReg(Adapter, 0x860 , BIT8, 0);\n}\n#endif\n\n#endif //#if (RTL8188E_SUPPORT == 1)\n\n\n#if (RTL8192E_SUPPORT == 1)\nVOID\nodm_RX_HWAntDiv_Init_92E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\n\tif(pDM_Odm->mp_mode == TRUE)\n\t{\n\t\t//pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\n\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta  Regc50[8]=1'b0  0: control by c50[9]\n\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1);  // 1:CG, 0:CS\n\t\treturn;\n\t}\n\t\n\t ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8192E AntDiv_Init =>  AntDivType=[CGCS_RX_HW_ANTDIV]\\n\"));\n\t\n\t //Pin Settings\n\t ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0);//Reg870[8]=1'b0,    // \"antsel\" is controled by HWs\n\t ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 1); //Regc50[8]=1'b1  //\" CS/CG switching\" is controled by HWs\n\n\t //Mapping table\n\t ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table\n\t  \n\t //OFDM Settings\n\t ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold\n\t ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias\n\t \n\t //CCK Settings\n\t ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2\n\t ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 0); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0\n\t ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue\n\t ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples \t \n\t \n\t #ifdef ODM_EVM_ENHANCE_ANTDIV\n\t//EVM enhance AntDiv method init----------------------------------------------------------------------\n\tpDM_FatTable->EVM_method_enable=0;\n\tpDM_FatTable->FAT_State = NORMAL_STATE_MIAN;\n\tpDM_Odm->antdiv_intvl = 0x64; \n\tODM_SetBBReg(pDM_Odm, 0x910 , 0x3f, 0xf );\t   \n\tpDM_Odm->antdiv_evm_en=1;\n\t//pDM_Odm->antdiv_period=1;\n\n\t#endif\n\t \n}\n\nVOID\nodm_TRX_HWAntDiv_Init_92E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\n\tif(pDM_Odm->mp_mode == TRUE)\n\t{\n\t\t//pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;\n\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta  Regc50[8]=1'b0  0: control by c50[9]\n\t\tODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1);  // 1:CG, 0:CS\n\t\treturn;\n\t}\n\n\t ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8192E AntDiv_Init =>  AntDivType=[ Only for DIR605, CG_TRX_HW_ANTDIV]\\n\"));\n\t\n\t//3 --RFE pin setting---------\n\t//[MAC]\n\tODM_SetMACReg(pDM_Odm, 0x38, BIT11, 1);            //DBG PAD Driving control (GPIO 8)\n\tODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0);            //path-A , RFE_CTRL_3 \n\tODM_SetMACReg(pDM_Odm, 0x4c, BIT29, 1);            //path-A , RFE_CTRL_8\n\t//[BB]\n\tODM_SetBBReg(pDM_Odm, 0x944 , BIT3, 1);              //RFE_buffer\n\tODM_SetBBReg(pDM_Odm, 0x944 , BIT8, 1);\t\n\tODM_SetBBReg(pDM_Odm, 0x940 , BIT7|BIT6, 0x0); // r_rfe_path_sel_   (RFE_CTRL_3)\n\tODM_SetBBReg(pDM_Odm, 0x940 , BIT17|BIT16, 0x0); // r_rfe_path_sel_   (RFE_CTRL_8)\n\tODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0);     //RFE_buffer\n\tODM_SetBBReg(pDM_Odm, 0x92C , BIT3, 0);     //rfe_inv  (RFE_CTRL_3)\n\tODM_SetBBReg(pDM_Odm, 0x92C , BIT8, 1);     //rfe_inv  (RFE_CTRL_8)\n\tODM_SetBBReg(pDM_Odm, 0x930 , 0xF000, 0x8);           //path-A , RFE_CTRL_3 \n\tODM_SetBBReg(pDM_Odm, 0x934 , 0xF, 0x8);           //path-A , RFE_CTRL_8\n\t//3 -------------------------\n\t\n\t //Pin Settings\n\tODM_SetBBReg(pDM_Odm, 0xC50 , BIT8, 0);\t   //path-A   \t//disable CS/CG switch\n\n/* Let it follows PHY_REG for bit9 setting\n\tif(pDM_Odm->priv->pshare->rf_ft_var.use_ext_pa || pDM_Odm->priv->pshare->rf_ft_var.use_ext_lna)\n\t\tODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1);//path-A \t//output at CS\n\telse\n\t\tODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 0);    //path-A \t//output at CG ->normal power\n*/\n\n\tODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);  //path-A  \t//antsel antselb by HW\n\tODM_SetBBReg(pDM_Odm, 0xB38 , BIT10, 0);\t   //path-A    \t//antsel2 by HW\t\n \n\t//Mapping table\n\t ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table\n\t  \n\t //OFDM Settings\n\t ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold\n\t ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias\n\t \n\t //CCK Settings\n\t ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2\n\t ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 0); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0\n\t ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue\n\t ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples \n\n\t //Timming issue\n\t ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\n\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t//EVM enhance AntDiv method init----------------------------------------------------------------------\n\tpDM_FatTable->EVM_method_enable=0;\n\tpDM_FatTable->FAT_State = NORMAL_STATE_MIAN;\n\tpDM_Odm->antdiv_intvl = 0x64; \n\tODM_SetBBReg(pDM_Odm, 0x910 , 0x3f, 0xf );\t   \n\tpDM_Odm->antdiv_evm_en=1;\n\t//pDM_Odm->antdiv_period=1;\n\t#endif\n}\n\n#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\nVOID\nodm_Smart_HWAntDiv_Init_92E(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8192E AntDiv_Init =>  AntDivType=[CG_TRX_SMART_ANTDIV]\\n\"));\n}\n#endif\n\n#endif //#if (RTL8192E_SUPPORT == 1)\n\n\n#if (RTL8723B_SUPPORT == 1)\nVOID\nodm_TRX_HWAntDiv_Init_8723B(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8723B AntDiv_Init =>  AntDivType=[CG_TRX_HW_ANTDIV(DPDT)]\\n\"));\n      \n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);\n\t\n\t//OFDM HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF, 0xa0); //thershold\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF000, 0x00); //bias\n\t\t\n\t//CCK HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\n\tODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\n\t\n\t//BT Coexistence\n\tODM_SetBBReg(pDM_Odm, 0x864, BIT12, 0); //keep antsel_map when GNT_BT = 1\n\tODM_SetBBReg(pDM_Odm, 0x874 , BIT23, 0); //Disable hw antsw & fast_train.antsw when GNT_BT=1\n\n        //Output Pin Settings\n\tODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0); //\n\t\t\n\tODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0); //WL_BB_SEL_BTG_TRXG_anta,  (1: HW CTRL  0: SW CTRL)\n\tODM_SetBBReg(pDM_Odm, 0x948 , BIT7, 0);\n\t\t\n\tODM_SetMACReg(pDM_Odm, 0x40 , BIT3, 1);\n\tODM_SetMACReg(pDM_Odm, 0x38 , BIT11, 1);\n\tODM_SetMACReg(pDM_Odm, 0x4C ,  BIT24|BIT23, 2); //select DPDT_P and DPDT_N as output pin\n\t\t\n\tODM_SetBBReg(pDM_Odm, 0x944 , BIT0|BIT1, 3); //in/out\n\tODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //\n\n\tODM_SetBBReg(pDM_Odm, 0x92C , BIT1, 0); //DPDT_P non-inverse\n\tODM_SetBBReg(pDM_Odm, 0x92C , BIT0, 1); //DPDT_N inverse\n\n\tODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\n\t//2 [--For HW Bug Setting]\n\tif(pDM_Odm->AntType == ODM_AUTO_ANT)\n\t\tODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\n\n}\n\n\t\n\nVOID\nodm_S0S1_SWAntDiv_Init_8723B(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8723B AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \\n\"));\n\n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);\n\t\n\t//Output Pin Settings\n\t//ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1); \n\tODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); \n\n\tpDM_FatTable->bBecomeLinked  =FALSE;\n\tpDM_SWAT_Table->try_flag = 0xff;\t\n\tpDM_SWAT_Table->Double_chk_flag = 0;\n\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\t\n\t//2 [--For HW Bug Setting]\n\tODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant  by Reg\n\n}\n\nVOID\nodm_S0S1_SWAntDiv_Reset_8723B(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table \t= &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable \t= &pDM_Odm->DM_FatTable;\n    \n\tpDM_FatTable->bBecomeLinked  =FALSE;\n\tpDM_SWAT_Table->try_flag = 0xff;\t\n\tpDM_SWAT_Table->Double_chk_flag = 0;\n\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"odm_S0S1_SWAntDiv_Reset_8723B(): pDM_FatTable->bBecomeLinked = %d\\n\", pDM_FatTable->bBecomeLinked));\n}\n\nVOID\nODM_UpdateRxIdleAnt_8723B(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tAnt,\n\tIN\t\tu4Byte\t\t\tDefaultAnt, \n\tIN\t\tu4Byte\t\t\tOptionalAnt\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tPADAPTER \t\tpAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu1Byte\t\t\tcount=0;\n\tu1Byte\t\t\tu1Temp;\n\tu1Byte\t\t\tH2C_Parameter;\n\t\n\tif(!pDM_Odm->bLinked)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to no link\\n\"));\n\t\treturn;\n\t}\n\n\t// Send H2C command to FW\n\t// Enable wifi calibration\n\tH2C_Parameter = TRUE;\n\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_WIFI_CALIBRATION, 1, &H2C_Parameter);\n\n\t// Check if H2C command sucess or not (0x1e6)\n\tu1Temp = ODM_Read1Byte(pDM_Odm, 0x1e6);\n\twhile((u1Temp != 0x1) && (count < 100))\n\t{\n\t\tODM_delay_us(10);\t\n\t\tu1Temp = ODM_Read1Byte(pDM_Odm, 0x1e6);\n\t\tcount++;\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: H2C command status = %d, count = %d\\n\", u1Temp, count));\n\n\tif(u1Temp == 0x1)\n\t{\n\t\t// Check if BT is doing IQK (0x1e7)\n\t\tcount = 0;\n\t\tu1Temp = ODM_Read1Byte(pDM_Odm, 0x1e7);\n\t\twhile((!(u1Temp & BIT0))  && (count < 100))\n\t\t{\n\t\t\tODM_delay_us(50);\t\n\t\t\tu1Temp = ODM_Read1Byte(pDM_Odm, 0x1e7);\n\t\t\tcount++;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: BT IQK status = %d, count = %d\\n\", u1Temp, count));\n\n\t\tif(u1Temp & BIT0)\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1);\n\t\t\tODM_SetBBReg(pDM_Odm, 0x948 , BIT9, DefaultAnt);\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt);\t//Default RX\n\t\t\tODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt);\t//Optional RX\n\t\t\tODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX\t\n\t\t\tpDM_FatTable->RxIdleAnt = Ant;\n\n\t\t\t// Set TX AGC by S0/S1\n\t\t\t// Need to consider Linux driver\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\t pAdapter->HalFunc.SetTxPowerLevelHandler(pAdapter, pHalData->CurrentChannel);\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\trtw_hal_set_tx_power_level(pAdapter, pHalData->CurrentChannel);\n#endif\n\n\t\t\t// Set IQC by S0/S1\n\t\t\tODM_SetIQCbyRFpath(pDM_Odm,DefaultAnt);\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: Sucess to set RX antenna\\n\"));\n\t\t}\n\t\telse\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to BT IQK\\n\"));\n\t}\n\telse\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Ant ] 8723B: Fail to set RX antenna due to H2C command fail\\n\"));\n\n\t// Send H2C command to FW\n\t// Disable wifi calibration\n\tH2C_Parameter = FALSE;\n\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_WIFI_CALIBRATION, 1, &H2C_Parameter);\n\n}\n#else /*#if (RTL8723B_SUPPORT == 1)*/\nVOID\nODM_UpdateRxIdleAnt_8723B(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tAnt,\n\tIN\t\tu4Byte\t\t\tDefaultAnt, \n\tIN\t\tu4Byte\t\t\tOptionalAnt\n\t){}\n\n#endif //#if (RTL8723B_SUPPORT == 1)\n\n#if (RTL8821A_SUPPORT == 1)\n#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\nVOID\nphydm_hl_smart_ant_type1_init_8821a(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tu4Byte\t\t\tvalue32;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8821A SmartAnt_Init => AntDivType=[Hong-Lin Smart Ant Type1]\\n\"));\n\t\n\t/*----------------------------------------\n\tGPIO 2-3 for Beam control \n\t    reg0x66[2]=0\n\t    reg0x44[27:26] = 0\n\t    reg0x44[23:16] //enable_output for P_GPIO[7:0]\n\t    reg0x44[15:8] //output_value for P_GPIO[7:0]\n\t    reg0x40[1:0] = 0 //GPIO function\n\t------------------------------------------*/\n\t\n\t/*GPIO Setting*/\n\tODM_SetMACReg(pDM_Odm, 0x64 , BIT18, 0); \n\tODM_SetMACReg(pDM_Odm, 0x44 , BIT27|BIT26, 0);\n\tODM_SetMACReg(pDM_Odm, 0x44 , BIT19|BIT18, 0x3);\t/*enable_output for P_GPIO[3:2]*/\n\t/*ODM_SetMACReg(pDM_Odm, 0x44 , BIT11|BIT10, 0);*/ /*output value*/\n\tODM_SetMACReg(pDM_Odm, 0x40 , BIT1|BIT0, 0);\t\t/*GPIO function*/\n\n\t/*Hong_lin smart antenna HW Setting*/\n\tpdm_sat_table->data_codeword_bit_num  = 24;/*max=32*/\n\tpdm_sat_table->beam_patten_num_each_ant = 4;\n\n\t#if DEV_BUS_TYPE == RT_SDIO_INTERFACE\n\tpdm_sat_table->latch_time = 100; /*mu sec*/\n\t#elif DEV_BUS_TYPE == RT_USB_INTERFACE\n\tpdm_sat_table->latch_time = 100; /*mu sec*/\n\t#endif\n\tpdm_sat_table->pkt_skip_statistic_en = 0;\n\t\n\tpdm_sat_table->ant_num  = 2;/*max=8*/\n\n\tpdm_sat_table->fix_beam_pattern_en  = 0;\n\n\t/*beam training setting*/\n\tpdm_sat_table->pkt_counter = 0;\n\tpdm_sat_table->per_beam_training_pkt_num = 10;\n\n\t/*set default beam*/\n\tpdm_sat_table->fast_training_beam_num = 0;\n\tpdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;\n\tphydm_set_all_ant_same_beam_num(pDM_Odm);\n\n\tpDM_FatTable->FAT_State = FAT_BEFORE_LINK_STATE;\n\n\t/*[BB] FAT Setting*/\n\tODM_SetBBReg(pDM_Odm, 0xc08 , BIT18|BIT17|BIT16, pdm_sat_table->ant_num);\n\tODM_SetBBReg(pDM_Odm, 0xc08 , BIT31, 0); /*increase ant num every FAT period 0:+1, 1+2*/\n\tODM_SetBBReg(pDM_Odm, 0x8c4 , BIT2|BIT1, 1); /*change cca antenna timming threshold if no CCA occurred: 0:200ms / 1:100ms / 2:no use / 3: 300*/\n\tODM_SetBBReg(pDM_Odm, 0x8c4 , BIT0, 1); /*FAT_watchdog_en*/\n\t\n\tvalue32 = ODM_GetMACReg(pDM_Odm,  0x7B4, bMaskDWord);\n\tODM_SetMACReg(pDM_Odm, 0x7b4, bMaskDWord, value32|(BIT16|BIT17));\t/*Reg7B4[16]=1 enable antenna training */\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/*Reg7B4[17]=1 enable  match MAC Addr*/\n\tODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, 0);/*Match MAC ADDR*/\n\tODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, 0);\n\n}\n#endif\n\nVOID\nodm_TRX_HWAntDiv_Init_8821A(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8821A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (DPDT)] \\n\"));\n\n\t//Output Pin Settings\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\n\n\tODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control\n\tODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control\n\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);\n\tODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);\n\t\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse\n\n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\n\n\t//OFDM HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias\n\t\t\n\t//CCK HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\n\tODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\n\n\tODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //ANTSEL_CCK sent to the smart_antenna circuit\n\tODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\n\n\t//BT Coexistence\n\tODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1\n\tODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\tODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\n\n\t//response TX ant by RX ant\n\tODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);\n\t\t\t\n}\n\nVOID\nodm_S0S1_SWAntDiv_Init_8821A(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8821A AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \\n\"));\n\n\t//Output Pin Settings\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\n\n\tODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control\n\tODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control\n\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);\n\tODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);\n\t\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse\n\n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\n\n\t//OFDM HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias\n\t\t\n\t//CCK HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\n\tODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\n\n\tODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //ANTSEL_CCK sent to the smart_antenna circuit\n\tODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable\n\n\t//BT Coexistence\n\tODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1\n\tODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\tODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\n\n\t//response TX ant by RX ant\n\tODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);\n\n\n\tODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); \n\t\n\tpDM_SWAT_Table->try_flag = 0xff;\t\n\tpDM_SWAT_Table->Double_chk_flag = 0;\n\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\n\tpDM_SWAT_Table->CurAntenna = MAIN_ANT;\n\tpDM_SWAT_Table->PreAntenna = MAIN_ANT;\n\tpDM_SWAT_Table->SWAS_NoLink_State = 0;\n\n}\n#endif //#if (RTL8821A_SUPPORT == 1)\n\n#if (RTL8881A_SUPPORT == 1)\nVOID\nodm_RX_HWAntDiv_Init_8881A(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8881A AntDiv_Init => AntDivType=[ CGCS_RX_HW_ANTDIV] \\n\"));\n\n}\n\nVOID\nodm_TRX_HWAntDiv_Init_8881A(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8881A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \\n\"));\n\n\t//Output Pin Settings\n\t// [SPDT related]\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);\n\tODM_SetMACReg(pDM_Odm, 0x4C , BIT26, 0);\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT22, 0); \n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT24, 1);\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF00, 8); // DPDT_P = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000, 8); // DPDT_N = ANTSEL[0]\t\n\t\n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\n\n\t//OFDM HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias\n\tODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\n\t\n\t//CCK HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\n\tODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\n\t//2 [--For HW Bug Setting]\n\n\tODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant  by Reg //  A-cut bug\n}\n\n#endif //#if (RTL8881A_SUPPORT == 1)\n\n\n#if (RTL8812A_SUPPORT == 1)\nVOID\nodm_TRX_HWAntDiv_Init_8812A(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \\n\"));\n\n\t//3 //3 --RFE pin setting---------\n\t//[BB]\n\tODM_SetBBReg(pDM_Odm, 0x900 , BIT10|BIT9|BIT8, 0x0);\t  //disable SW switch\n\tODM_SetBBReg(pDM_Odm, 0x900 , BIT17|BIT16, 0x0);\t \n\tODM_SetBBReg(pDM_Odm, 0x974 , BIT7|BIT6, 0x3);     // in/out\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer\n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT26, 0); \n\tODM_SetBBReg(pDM_Odm, 0xCB4 , BIT27, 1);\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF000000, 8); // DPDT_P = ANTSEL[0]\n\tODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000000, 8); // DPDT_N = ANTSEL[0]\n\t//3 -------------------------\n\n\t//Mapping Table\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);\n\n\t//OFDM HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold\n\tODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias\n\tODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns\n\t\n\t//CCK HW AntDiv Parameters\n\tODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M\n\tODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples\n\n\t//Timming issue\n\tODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)\n\n\t//2 [--For HW Bug Setting]\n\n\tODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant  by Reg //  A-cut bug\n\t\n}\n\n#endif //#if (RTL8812A_SUPPORT == 1)\n\n\n\n\n#ifdef ODM_EVM_ENHANCE_ANTDIV\n\n\n\nVOID\nodm_EVM_FastAnt_Reset(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\t\n\tpDM_FatTable->EVM_method_enable=0;\n\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\tpDM_FatTable->FAT_State = NORMAL_STATE_MIAN;\n\tpDM_Odm->antdiv_period=0;\n\tODM_SetMACReg(pDM_Odm, 0x608, BIT8, 0);\n}\n\n\nVOID\nodm_EVM_Enhance_AntDiv(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\tMain_RSSI, Aux_RSSI ;\n\tu4Byte\tMain_CRC_utility=0,Aux_CRC_utility=0,utility_ratio=1;\n\tu4Byte\tMain_EVM, Aux_EVM,Diff_RSSI=0,diff_EVM=0;\t\n\tu1Byte\tscore_EVM=0,score_CRC=0;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tu4Byte\tvalue32, i;\n\tBOOLEAN Main_above1=FALSE,Aux_above1=FALSE;\n\tBOOLEAN Force_antenna=FALSE;\n\tPSTA_INFO_T   \tpEntry;\n\tpDM_FatTable->TargetAnt_enhance=0xFF;\n\t\n\t\n\tif((pDM_Odm->SupportICType & ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC))\n\t{\n\t\tif(pDM_Odm->bOneEntryOnly)\n\t\t{\n\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[One Client only] \\n\"));\n\t\t\ti = pDM_Odm->OneEntry_MACID;\n\n\t\t\tMain_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;\n\t\t\tAux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;\n\n\t\t\tif((Main_RSSI==0 && Aux_RSSI !=0 && Aux_RSSI>=FORCE_RSSI_DIFF) || (Main_RSSI!=0 && Aux_RSSI==0 && Main_RSSI>=FORCE_RSSI_DIFF))\n\t\t\t{\n\t\t\t\tDiff_RSSI=FORCE_RSSI_DIFF;\n\t\t\t}\n\t\t\telse if(Main_RSSI!=0 && Aux_RSSI !=0)\n\t\t\t{\n\t\t\t\tDiff_RSSI = (Main_RSSI>=Aux_RSSI)?(Main_RSSI-Aux_RSSI):(Aux_RSSI-Main_RSSI); \n\t\t\t}\n\t\t\t\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" Main_Cnt = (( %d ))  , Main_RSSI= ((  %d )) \\n\", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" Aux_Cnt   = (( %d ))  , Aux_RSSI = ((  %d )) \\n\" , pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI));\n\t\t\t\t\t\t\n\t\t\tif(  ((Main_RSSI>=Evm_RSSI_TH_High||Aux_RSSI>=Evm_RSSI_TH_High )|| (pDM_FatTable->EVM_method_enable==1)  )\n\t\t\t\t//&& (Diff_RSSI <= FORCE_RSSI_DIFF + 1)\n                                    )\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[> TH_H || EVM_method_enable==1]  && \"));\n\t\t\t\t\n\t\t\t\tif(((Main_RSSI>=Evm_RSSI_TH_Low)||(Aux_RSSI>=Evm_RSSI_TH_Low) ))\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[> TH_L ] \\n\"));\n\n\t\t\t\t\t//2 [ Normal state Main]\n\t\t\t\t\tif(pDM_FatTable->FAT_State == NORMAL_STATE_MIAN)\n\t\t\t\t\t{\n\n\t\t\t\t\t\tpDM_FatTable->EVM_method_enable=1;\n\t\t\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\t\t\t\tpDM_Odm->antdiv_period=3;\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ start training: MIAN] \\n\"));\n\t\t\t\t\t\tpDM_FatTable->MainAntEVM_Sum[i] = 0;\n\t\t\t\t\t\tpDM_FatTable->AuxAntEVM_Sum[i] = 0;\n\t\t\t\t\t\tpDM_FatTable->MainAntEVM_Cnt[i] = 0;\n\t\t\t\t\t\tpDM_FatTable->AuxAntEVM_Cnt[i] = 0;\n\n\t\t\t\t\t\tpDM_FatTable->FAT_State = NORMAL_STATE_AUX;\n\t\t\t\t\t\tODM_SetMACReg(pDM_Odm, 0x608, BIT8, 1); //Accept CRC32 Error packets.\n\t\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDM_FatTable->CRC32_Ok_Cnt=0;\n\t\t\t\t\t\tpDM_FatTable->CRC32_Fail_Cnt=0;\n\t\t\t\t\t\tODM_SetTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //m\n\t\t\t\t\t}\n\t\t\t\t\t//2 [ Normal state Aux ]\n\t\t\t\t\telse if(pDM_FatTable->FAT_State == NORMAL_STATE_AUX)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_FatTable->MainCRC32_Ok_Cnt=pDM_FatTable->CRC32_Ok_Cnt;\n\t\t\t\t\t\tpDM_FatTable->MainCRC32_Fail_Cnt=pDM_FatTable->CRC32_Fail_Cnt;\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ start training: AUX] \\n\"));\n\t\t\t\t\t\tpDM_FatTable->FAT_State = TRAINING_STATE;\n\t\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\n\n\t\t\t\t\t\tpDM_FatTable->CRC32_Ok_Cnt=0;\n\t\t\t\t\t\tpDM_FatTable->CRC32_Fail_Cnt=0;\n\t\t\t\t\t\tODM_SetTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //ms\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if(pDM_FatTable->FAT_State == TRAINING_STATE)\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Training state ] \\n\"));\n\t\t\t\t\t\tpDM_FatTable->FAT_State = NORMAL_STATE_MIAN;\n\t\t\t\t\t\t\n\t\t\t\t\t\t//3 [CRC32 statistic]\n\t\t\t\t\t\tpDM_FatTable->AuxCRC32_Ok_Cnt=pDM_FatTable->CRC32_Ok_Cnt;\n\t\t\t\t\t\tpDM_FatTable->AuxCRC32_Fail_Cnt=pDM_FatTable->CRC32_Fail_Cnt;\n\n\t\t\t\t\t\tif( (pDM_FatTable->MainCRC32_Ok_Cnt  >= ((pDM_FatTable->AuxCRC32_Ok_Cnt)<<1)) || (Diff_RSSI>=18))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32=MAIN_ANT;\n\t\t\t\t\t\t\tForce_antenna=TRUE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"CRC32 Force Main \\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if((pDM_FatTable->AuxCRC32_Ok_Cnt  >= ((pDM_FatTable->MainCRC32_Ok_Cnt)<<1)) || (Diff_RSSI>=18))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32=AUX_ANT;\n\t\t\t\t\t\t\tForce_antenna=TRUE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"CRC32 Force Aux \\n\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(pDM_FatTable->MainCRC32_Fail_Cnt<=5)\n\t\t\t\t\t\t\t\tpDM_FatTable->MainCRC32_Fail_Cnt=5;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(pDM_FatTable->AuxCRC32_Fail_Cnt<=5)\n\t\t\t\t\t\t\t\tpDM_FatTable->AuxCRC32_Fail_Cnt=5;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(pDM_FatTable->MainCRC32_Ok_Cnt >pDM_FatTable->MainCRC32_Fail_Cnt )\n\t\t\t\t\t\t\t\tMain_above1=TRUE;\n\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(pDM_FatTable->AuxCRC32_Ok_Cnt >pDM_FatTable->AuxCRC32_Fail_Cnt )\n\t\t\t\t\t\t\t\tAux_above1=TRUE;\n\n\t\t\t\t\t\t\tif(Main_above1==TRUE && Aux_above1==FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tForce_antenna=TRUE;\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32=MAIN_ANT;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(Main_above1==FALSE && Aux_above1==TRUE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tForce_antenna=TRUE;\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32=AUX_ANT;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(Main_above1==TRUE && Aux_above1==TRUE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tMain_CRC_utility=((pDM_FatTable->MainCRC32_Ok_Cnt)<<7)/pDM_FatTable->MainCRC32_Fail_Cnt;\n\t\t\t\t\t\t\t\tAux_CRC_utility=((pDM_FatTable->AuxCRC32_Ok_Cnt)<<7)/pDM_FatTable->AuxCRC32_Fail_Cnt;\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32 = (Main_CRC_utility==Aux_CRC_utility)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_CRC_utility>=Aux_CRC_utility)?MAIN_ANT:AUX_ANT);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(Main_CRC_utility!=0 && Aux_CRC_utility!=0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif(Main_CRC_utility>=Aux_CRC_utility)\n\t\t\t\t\t\t\t\t\t\tutility_ratio=(Main_CRC_utility<<1)/Aux_CRC_utility;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tutility_ratio=(Aux_CRC_utility<<1)/Main_CRC_utility;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(Main_above1==FALSE && Aux_above1==FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif(pDM_FatTable->MainCRC32_Ok_Cnt==0)\n\t\t\t\t\t\t\t\t\tpDM_FatTable->MainCRC32_Ok_Cnt=1;\n\t\t\t\t\t\t\t\tif(pDM_FatTable->AuxCRC32_Ok_Cnt==0)\n\t\t\t\t\t\t\t\t\tpDM_FatTable->AuxCRC32_Ok_Cnt=1;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tMain_CRC_utility=((pDM_FatTable->MainCRC32_Fail_Cnt)<<7)/pDM_FatTable->MainCRC32_Ok_Cnt;\n\t\t\t\t\t\t\t\tAux_CRC_utility=((pDM_FatTable->AuxCRC32_Fail_Cnt)<<7)/pDM_FatTable->AuxCRC32_Ok_Cnt;\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_CRC32 = (Main_CRC_utility==Aux_CRC_utility)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_CRC_utility<=Aux_CRC_utility)?MAIN_ANT:AUX_ANT);\t\n\n\t\t\t\t\t\t\t\tif(Main_CRC_utility!=0 && Aux_CRC_utility!=0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif(Main_CRC_utility>=Aux_CRC_utility)\n\t\t\t\t\t\t\t\t\t\tutility_ratio=(Main_CRC_utility<<1)/(Aux_CRC_utility);\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tutility_ratio=(Aux_CRC_utility<<1)/(Main_CRC_utility);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tODM_SetMACReg(pDM_Odm, 0x608, BIT8, 0);//NOT Accept CRC32 Error packets.\n\n\t\t\t\t\t\t//3 [EVM statistic]\t\t\t\n\t\t\t\t\t\tMain_EVM = (pDM_FatTable->MainAntEVM_Cnt[i]!=0)?(pDM_FatTable->MainAntEVM_Sum[i]/pDM_FatTable->MainAntEVM_Cnt[i]):0;\n\t\t\t\t\t\tAux_EVM = (pDM_FatTable->AuxAntEVM_Cnt[i]!=0)?(pDM_FatTable->AuxAntEVM_Sum[i]/pDM_FatTable->AuxAntEVM_Cnt[i]):0;\n\t\t\t\t\t\tpDM_FatTable->TargetAnt_EVM = (Main_EVM==Aux_EVM)?(pDM_FatTable->pre_TargetAnt_enhance):((Main_EVM>=Aux_EVM)?MAIN_ANT:AUX_ANT);\n\n\t\t\t\t\t\tif((Main_EVM==0 || Aux_EVM==0))\n\t\t\t\t\t\t\tdiff_EVM=0;\n\t\t\t\t\t\telse if(Main_EVM>=Aux_EVM)\n\t\t\t\t\t\t\tdiff_EVM=Main_EVM-Aux_EVM;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tdiff_EVM=Aux_EVM-Main_EVM;\n\n\t\t\t\t\t\t//2 [ Decision state ]\t\t\t\t\t\n\t\t\t\t\t\tif(pDM_FatTable->TargetAnt_EVM ==pDM_FatTable->TargetAnt_CRC32 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif( (utility_ratio<2 && Force_antenna==FALSE)  && diff_EVM<=2)\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->pre_TargetAnt_enhance;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_EVM;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(diff_EVM<=2 && (utility_ratio > 4 && Force_antenna==FALSE)) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(diff_EVM>=20) // \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_EVM;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(utility_ratio>=6 && Force_antenna==FALSE) // utility_ratio>3\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(Force_antenna==TRUE)\n\t\t\t\t\t\t\t\tscore_CRC=3;\n\t\t\t\t\t\t\telse if(utility_ratio>=4) //>2\n\t\t\t\t\t\t\t\tscore_CRC=2;\n\t\t\t\t\telse if(utility_ratio>=3) //>1.5\n\t\t\t\t\t\tscore_CRC=1;\n\t\t\t\t\telse\n\t\t\t\t\t\tscore_CRC=0;\n\t\t\t\t\t\n\t\t\t\t\tif(diff_EVM>=10)\n\t\t\t\t\t\tscore_EVM=2;\n\t\t\t\t\telse if(diff_EVM>=5)\n\t\t\t\t\t\tscore_EVM=1;\n\t\t\t\t\telse\n\t\t\t\t\t\tscore_EVM=0;\n\n\t\t\t\t\tif(score_CRC>score_EVM)\n\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_CRC32;\n\t\t\t\t\telse if(score_CRC<score_EVM)\n\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->TargetAnt_EVM;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDM_FatTable->TargetAnt_enhance=pDM_FatTable->pre_TargetAnt_enhance;\n\t\t\t\t}\n\t\t\t\tpDM_FatTable->pre_TargetAnt_enhance=pDM_FatTable->TargetAnt_enhance;\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] : MainEVM_Cnt = (( %d ))  , Main_EVM= ((  %d )) \\n\",i, pDM_FatTable->MainAntEVM_Cnt[i], Main_EVM));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] : AuxEVM_Cnt   = (( %d ))  , Aux_EVM = ((  %d )) \\n\" ,i, pDM_FatTable->AuxAntEVM_Cnt[i] , Aux_EVM));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** TargetAnt_EVM = (( %s ))\\n\", ( pDM_FatTable->TargetAnt_EVM  ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"M_CRC_Ok = (( %d ))  , M_CRC_Fail = ((  %d )), Main_CRC_utility = (( %d )) \\n\" , pDM_FatTable->MainCRC32_Ok_Cnt, pDM_FatTable->MainCRC32_Fail_Cnt,Main_CRC_utility));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"A_CRC_Ok  = (( %d ))  , A_CRC_Fail = ((  %d )), Aux_CRC_utility   = ((  %d )) \\n\" , pDM_FatTable->AuxCRC32_Ok_Cnt, pDM_FatTable->AuxCRC32_Fail_Cnt,Aux_CRC_utility));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** TargetAnt_CRC32 = (( %s ))\\n\", ( pDM_FatTable->TargetAnt_CRC32 ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"****** TargetAnt_enhance = (( %s ))******\\n\", ( pDM_FatTable->TargetAnt_enhance ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // RSSI< = Evm_RSSI_TH_Low\n\t\t\t\t{ \n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ <TH_L: escape from > TH_L ] \\n\"));\n\t\t\t\t\todm_EVM_FastAnt_Reset(pDM_Odm);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse \n\t\t\t{ \n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[escape from> TH_H || EVM_method_enable==1] \\n\"));\n\t\t\t\todm_EVM_FastAnt_Reset(pDM_Odm);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[multi-Client] \\n\"));\n\t\t\todm_EVM_FastAnt_Reset(pDM_Odm);\n\t\t}\t\t\t\n\t}\n}\n\nVOID\nodm_EVM_FastAntTrainingCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"******odm_EVM_FastAntTrainingCallback****** \\n\"));\n\todm_HW_AntDiv(pDM_Odm);\n}\n#endif\n\nVOID\nodm_HW_AntDiv(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\ti,MinMaxRSSI=0xFF,  AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI;\n\tu4Byte\tMain_RSSI, Aux_RSSI;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\t\n\tu1Byte\tRxIdleAnt = pDM_FatTable->RxIdleAnt, TargetAnt = 7;\n\tpDIG_T\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tPSTA_INFO_T   \tpEntry;\n\n\t#ifdef BEAMFORMING_SUPPORT\n\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tpBDC_T    pDM_BdcTable = &pDM_Odm->DM_BdcTable;\n\tu4Byte\tTH1=500000;\n\tu4Byte\tTH2=10000000; \n\tu4Byte\tMA_rx_Temp, degrade_TP_temp, improve_TP_temp;\n\tu1Byte\tMonitor_RSSI_threshold=30;\n\n\tpDM_BdcTable->BF_pass=TRUE;\n\tpDM_BdcTable->DIV_pass=TRUE;\n\tpDM_BdcTable->bAll_DivSta_Idle=TRUE;\n\tpDM_BdcTable->bAll_BFSta_Idle=TRUE;\n\tpDM_BdcTable->num_BfTar=0 ;\n\tpDM_BdcTable->num_DivTar=0;\n\tpDM_BdcTable->num_Client=0;\n\t#endif\n\t#endif\n\n\tif(!pDM_Odm->bLinked) //bLinked==False\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[No Link!!!]\\n\"));\n\t\t\n\t\tif(pDM_FatTable->bBecomeLinked == TRUE)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG);\n\t\t\tpDM_Odm->antdiv_period=0;\n\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\treturn;\n\t}\t\n\telse\n\t{\n\t\tif(pDM_FatTable->bBecomeLinked ==FALSE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Linked !!!]\\n\"));\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);\n\t\t\t\n\t\t\t//if(pDM_Odm->SupportICType == ODM_RTL8821 )\n\t\t\t\t//ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable\n\t\t\t\t\n\t\t\t//#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\n\t\t\t//else if(pDM_Odm->SupportICType == ODM_RTL8881A)\n\t\t\t//\tODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable\n\t\t\t//#endif\n\t\t\t\n\t\t\t//else if(pDM_Odm->SupportICType == ODM_RTL8723B ||pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t\t\t//ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function disable\n\t\t\t\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\n\t\t\tif(pDM_Odm->SupportICType==ODM_RTL8723B && pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0]   // for 8723B AntDiv function patch.  BB  Dino  130412\t\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]\n\t\t\t}\n\t\t\t\n\t\t\t//2 BDC Init\n\t\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\t\todm_BDC_Init(pDM_Odm);\n\t\t\t#endif\n\t\t\t#endif\n\t\t\t\n\t\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\t\todm_EVM_FastAnt_Reset(pDM_Odm);\n\t\t\t#endif\n\t\t}\t\n\t}\t\n\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n AntDiv Start =>\\n\"));\n\n\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\tif(pDM_Odm->antdiv_evm_en==1)\n\t{\n\t\todm_EVM_Enhance_AntDiv(pDM_Odm);\n\t\tif(pDM_FatTable->FAT_State !=NORMAL_STATE_MIAN)\n\t\t\treturn;\n\t}\n\telse\n\t{\n\t\todm_EVM_FastAnt_Reset(pDM_Odm);\n\t}\n\t#endif\n\t\n\t//2 BDC Mode Arbitration\n\t#ifdef BEAMFORMING_SUPPORT\n\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tif(pDM_Odm->antdiv_evm_en == 0 ||pDM_FatTable->EVM_method_enable==0)\n\t{\n\t\todm_BF_AntDiv_ModeArbitration(pDM_Odm);\n\t}\n\t#endif\n\t#endif\n\n\tfor (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\tif(IS_STA_VALID(pEntry))\n\t\t{\n\t\t\t//2 Caculate RSSI per Antenna\n\t\t\tMain_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;\n\t\t\tAux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;\n\t\t\tTargetAnt = (Main_RSSI==Aux_RSSI)?pDM_FatTable->RxIdleAnt:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\n\t\t\n\t\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"*** SupportICType=[%d] \\n\",pDM_Odm->SupportICType));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] : Main_Cnt = (( %d ))  , Main_RSSI= ((  %d )) \\n\",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] : Aux_Cnt   = (( %d ))  , Aux_RSSI = ((  %d )) \\n\" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI));\n\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** MAC ID:[ %d ] , TargetAnt = (( %s )) \\n\", i ,( TargetAnt ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"*** Phy_AntSel_A=[ %d, %d, %d] \\n\",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2,\n\t\t\t//\t                                                                              ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0)));\n\n\t\t\tLocalMaxRSSI = (Main_RSSI>Aux_RSSI)?Main_RSSI:Aux_RSSI;\n\t\t\t//2 Select MaxRSSI for DIG\n\t\t\tif((LocalMaxRSSI > AntDivMaxRSSI) && (LocalMaxRSSI < 40))\n\t\t\t\tAntDivMaxRSSI = LocalMaxRSSI;\n\t\t\tif(LocalMaxRSSI > MaxRSSI)\n\t\t\t\tMaxRSSI = LocalMaxRSSI;\n\n\t\t\t//2 Select RX Idle Antenna\n\t\t\tif ( (LocalMaxRSSI != 0) &&  (LocalMaxRSSI < MinMaxRSSI) )\n\t\t\t{\n\t\t\t\tRxIdleAnt = TargetAnt;\n\t\t\t\tMinMaxRSSI = LocalMaxRSSI;\n\t\t\t}\n\n\t\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\tif(pDM_Odm->antdiv_evm_en==1)\n\t\t\t{\n\t\t\t\tif(pDM_FatTable->TargetAnt_enhance!=0xFF)\n\t\t\t\t{\n\t\t\t\t\tTargetAnt=pDM_FatTable->TargetAnt_enhance;\n\t\t\t\t\tRxIdleAnt = pDM_FatTable->TargetAnt_enhance;\n\t\t\t\t}\n\t\t\t}\n\t\t\t#endif\n\n\t\t\t//2 Select TX Antenna\n\t\t\tif(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)\n\t\t\t{\n\t\t\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t\t\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\t\t\tif(pDM_BdcTable->w_BFee_Client[i]==0)\n\t\t\t\t#endif\t\n\t\t\t\t#endif\n\t\t\t\t\t{\n\t\t\t\t\t\todm_UpdateTxAnt(pDM_Odm, TargetAnt, i);\n\t\t\t\t\t}\n\t\t\t}\n\n\t\t\t//------------------------------------------------------------\n\n\t\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t\t#if(DM_ODM_SUPPORT_TYPE  == ODM_AP) \n\n\t\t\tpDM_BdcTable->num_Client++;\n\n\t\t\tif(pDM_BdcTable->BDC_Mode==BDC_MODE_2 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3)\n\t\t\t{\n\t\t\t\t//2 Byte Counter\n\n\t\t\t\tMA_rx_Temp=  (pEntry->rx_byte_cnt_LowMAW)<<3 ; //  RX  TP   ( bit /sec)\n\t\t\t\t\n\t\t\t\tif(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE)\n\t\t\t\t{\n\t\t\t\t\tpDM_BdcTable->MA_rx_TP_DIV[i]=  MA_rx_Temp ;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_BdcTable->MA_rx_TP[i] =MA_rx_Temp ;\n\t\t\t\t}\n\n\t\t\t\tif( (MA_rx_Temp < TH2)   &&  (MA_rx_Temp > TH1) && (LocalMaxRSSI<=Monitor_RSSI_threshold))\n\t\t\t\t{\n\t\t\t\t\tif(pDM_BdcTable->w_BFer_Client[i]==1) // Bfer_Target\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->num_BfTar++;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(pDM_BdcTable->BDC_state==BDC_DECISION_STATE && pDM_BdcTable->BDC_Try_flag==0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t        improve_TP_temp = (pDM_BdcTable->MA_rx_TP_DIV[i] * 9)>>3 ; //* 1.125\n\t\t\t\t\t        \tpDM_BdcTable->BF_pass = (pDM_BdcTable->MA_rx_TP[i] > improve_TP_temp)?TRUE:FALSE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] :  { MA_rx_TP,improve_TP_temp , MA_rx_TP_DIV,  BF_pass}={ %d,  %d, %d , %d }  \\n\" ,i,pDM_BdcTable->MA_rx_TP[i],improve_TP_temp,pDM_BdcTable->MA_rx_TP_DIV[i], pDM_BdcTable->BF_pass ));\n\t\t\t\t\t\t}\t\t\n\t\t\t\t\t}\t\t\n\t\t\t\t\telse// DIV_Target\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->num_DivTar++;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(pDM_BdcTable->BDC_state==BDC_DECISION_STATE && pDM_BdcTable->BDC_Try_flag==0)\n\t\t\t\t\t\t{\n\t\t\t\t\t        \tdegrade_TP_temp=(pDM_BdcTable->MA_rx_TP_DIV[i]*5)>>3;//* 0.625\n\t\t\t\t\t        \tpDM_BdcTable->DIV_pass = (pDM_BdcTable->MA_rx_TP[i] >degrade_TP_temp)?TRUE:FALSE;\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] :  { MA_rx_TP, degrade_TP_temp , MA_rx_TP_DIV,  DIV_pass}=\\n{ %d,  %d, %d , %d }  \\n\" ,i,pDM_BdcTable->MA_rx_TP[i],degrade_TP_temp,pDM_BdcTable->MA_rx_TP_DIV[i], pDM_BdcTable->DIV_pass ));\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(MA_rx_Temp > TH1)\n\t\t\t\t{\n\t\t\t\t\tif(pDM_BdcTable->w_BFer_Client[i]==1) // Bfer_Target\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->bAll_BFSta_Idle=FALSE;\n\t\t\t\t\t}\t\t\n\t\t\t\t\telse// DIV_Target\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_BdcTable->bAll_DivSta_Idle=FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] :  { BFmeeCap , BFmerCap}  = { %d , %d } \\n\" ,i, pDM_BdcTable->w_BFee_Client[i] , pDM_BdcTable->w_BFer_Client[i]));\n\n\t\t\t\tif(pDM_BdcTable->BDC_state==BDC_BFer_TRAIN_STATE)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] :    MA_rx_TP_DIV = (( %d ))  \\n\",i,pDM_BdcTable->MA_rx_TP_DIV[i]  ));\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Client[ %d ] :    MA_rx_TP = (( %d ))  \\n\",i,pDM_BdcTable->MA_rx_TP[i]  ));\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\t#endif\n\t\t\t#endif\n\n\t\t}\n\n\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\tif(pDM_BdcTable->BDC_Try_flag==0)\n\t\t#endif\n\t\t#endif\t\n\t\t{\n        \t\tpDM_FatTable->MainAnt_Sum[i] = 0;\n        \t\tpDM_FatTable->AuxAnt_Sum[i] = 0;\n        \t\tpDM_FatTable->MainAnt_Cnt[i] = 0;\n         \t\tpDM_FatTable->AuxAnt_Cnt[i] = 0;\n                }\n\t}\n       \n\n\t\n\t//2 Set RX Idle Antenna & TX Antenna(Because of HW Bug )\t\n\t#if(DM_ODM_SUPPORT_TYPE  == ODM_AP ) \n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** RxIdleAnt = (( %s ))\\n\\n\", ( RxIdleAnt ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\n\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\tif(pDM_BdcTable->BDC_Mode==BDC_MODE_1 ||pDM_BdcTable->BDC_Mode==BDC_MODE_3)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** BDC_RxIdleUpdate_counter = (( %d ))\\n\", pDM_BdcTable->BDC_RxIdleUpdate_counter));\n\t\t\t\n\t\t\t\tif(pDM_BdcTable->BDC_RxIdleUpdate_counter==1)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***Update RxIdle Antenna!!! \\n\"));\n\t\t\t\t\tpDM_BdcTable->BDC_RxIdleUpdate_counter=30;\n\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_BdcTable->BDC_RxIdleUpdate_counter--;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***NOT update RxIdle Antenna because of BF  ( need to fix TX-ant)\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t#endif\n\t\t#endif\t\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);\n\t#else\n\t\n\t\tODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);\n\t\n\t#endif//#if(DM_ODM_SUPPORT_TYPE  == ODM_AP)\n\n\n\n\t//2 BDC Main Algorithm\n\t#ifdef BEAMFORMING_SUPPORT\n\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tif(pDM_Odm->antdiv_evm_en ==0 ||pDM_FatTable->EVM_method_enable==0)\n\t{\n\t\todm_BDCcoex_BFeeRxDiv_Arbitration(pDM_Odm);\n\t}\n\t#endif\n\t#endif\n\n\tif(AntDivMaxRSSI == 0)\n\t\tpDM_DigTable->AntDiv_RSSI_max = pDM_Odm->RSSI_Min;\n\telse\n\t\tpDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI;\n\t\n\tpDM_DigTable->RSSI_max = MaxRSSI;\n}\n\n\n\n#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\nVOID\nodm_S0S1_SwAntDiv(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tu1Byte\t\t\tStep\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\ti,MinMaxRSSI=0xFF, LocalMaxRSSI,LocalMinRSSI;\n\tu4Byte\t\t\tMain_RSSI, Aux_RSSI;\n\tu1Byte\t\t\treset_period=10, SWAntDiv_threshold=35;\n\tu1Byte\t\t\tHighTraffic_TrainTime_U=0x32,HighTraffic_TrainTime_L=0,Train_time_temp;\n\tu1Byte\t\t\tLowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L=0;\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\t\n\tu1Byte\t\t\tRxIdleAnt = pDM_SWAT_Table->PreAntenna, TargetAnt, nextAnt=0;\n\tPSTA_INFO_T\t\tpEntry=NULL;\n\t//static u1Byte\t\treset_idx;\n\tu4Byte\t\t\tvalue32;\n\tPADAPTER\t\tAdapter\t =  pDM_Odm->Adapter;\n\tu8Byte\t\t\tcurTxOkCnt=0, curRxOkCnt=0,TxCntOffset, RxCntOffset;\n\t\n\tif(!pDM_Odm->bLinked) //bLinked==False\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[No Link!!!]\\n\"));\n\t\tif(pDM_FatTable->bBecomeLinked == TRUE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Set REG 948[9:6]=0x0 \\n\"));\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x948 , BIT9|BIT8|BIT7|BIT6, 0x0); \n\t\t\t\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tif(pDM_FatTable->bBecomeLinked ==FALSE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Linked !!!]\\n\"));\n\t\t\t\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\t\t{\n\t\t\t\tvalue32 = ODM_GetBBReg(pDM_Odm, 0x864, BIT5|BIT4|BIT3);\n\t\t\t\t\n\t\t\t\tif (value32==0x0)\n\t\t\t\t\tODM_UpdateRxIdleAnt_8723B(pDM_Odm, MAIN_ANT, ANT1_2G, ANT2_2G);\n\t\t\t\telse if (value32==0x1)\n\t\t\t\t\tODM_UpdateRxIdleAnt_8723B(pDM_Odm, AUX_ANT, ANT2_2G, ANT1_2G);\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"8723B: First link! Force antenna to  %s\\n\",(value32 == 0x0?\"MAIN\":\"AUX\") ));\n\t\t\t}\n\n\t\t\tpDM_SWAT_Table->lastTxOkCnt = 0; \n\t\t\tpDM_SWAT_Table->lastRxOkCnt =0; \n\t\t\tTxCntOffset =  *(pDM_Odm->pNumTxBytesUnicast);\n\t\t\tRxCntOffset =  *(pDM_Odm->pNumRxBytesUnicast);\n\t\t\t\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTxCntOffset = 0;\n\t\t\tRxCntOffset = 0;\n\t\t}\n\t}\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[%d] { try_flag=(( %d )), Step=(( %d )), Double_chk_flag = (( %d )) }\\n\",\n\t\t__LINE__,pDM_SWAT_Table->try_flag,Step,pDM_SWAT_Table->Double_chk_flag));\n\n\t// Handling step mismatch condition.\n\t// Peak step is not finished at last time. Recover the variable and check again.\n\tif(\tStep != pDM_SWAT_Table->try_flag\t)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Step != try_flag]    Need to Reset After Link\\n\"));\n\t\tODM_SwAntDivRestAfterLink(pDM_Odm);\n\t}\n\n\tif(pDM_SWAT_Table->try_flag == 0xff) \n\t{\t\n\t\tpDM_SWAT_Table->try_flag = 0;\n\t\tpDM_SWAT_Table->Train_time_flag=0;\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"[set try_flag = 0]  Prepare for peak!\\n\\n\"));\n\t\treturn;\n\t}\t\n\telse//if( try_flag != 0xff ) \n\t{\n\t\t//1 Normal State (Begin Trying)\n\t\tif(pDM_SWAT_Table->try_flag == 0) \n\t\t{\n\t\t\n\t\t\t//---trafic decision---\n\t\t\tcurTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset;\n\t\t\tcurRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset;\n\t\t\tpDM_SWAT_Table->lastTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast);\n\t\t\tpDM_SWAT_Table->lastRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast);\n\t\t\t\n\t\t\tif (curTxOkCnt > 1875000 || curRxOkCnt > 1875000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)  ( 1.875M * 8bit ) / 2= 7.5M bits /sec )\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;\n\t\t\t\tTrain_time_temp = pDM_SWAT_Table->Train_time ;\n\t\t\t\t\n\t\t\t\tif(pDM_SWAT_Table->Train_time_flag==3)\n\t\t\t\t{\n\t\t\t\t\tHighTraffic_TrainTime_L=0xa;\n\t\t\t\t\t\n\t\t\t\t\tif(Train_time_temp<=16)\n\t\t\t\t\t\tTrain_time_temp=HighTraffic_TrainTime_L;\n\t\t\t\t\telse\n\t\t\t\t\t\tTrain_time_temp-=16;\n\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if(pDM_SWAT_Table->Train_time_flag==2)\n\t\t\t\t{\n\t\t\t\t\tTrain_time_temp-=8;\n\t\t\t\t\tHighTraffic_TrainTime_L=0xf;\n\t\t\t\t}\t\n\t\t\t\telse if(pDM_SWAT_Table->Train_time_flag==1)\n\t\t\t\t{\n\t\t\t\t\tTrain_time_temp-=4;\n\t\t\t\t\tHighTraffic_TrainTime_L=0x1e;\n\t\t\t\t}\n\t\t\t\telse if(pDM_SWAT_Table->Train_time_flag==0)\n\t\t\t\t{\n\t\t\t\t\tTrain_time_temp+=8;\n\t\t\t\t\tHighTraffic_TrainTime_L=0x28;\n\t\t\t\t}\n\n\t\t\t\t\n\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** Train_time_temp = ((%d))\\n\",Train_time_temp));\n\n\t\t\t\t//--\n\t\t\t\tif(Train_time_temp > HighTraffic_TrainTime_U)\n\t\t\t\t\tTrain_time_temp=HighTraffic_TrainTime_U;\n\t\t\t\t\n\t\t\t\telse if(Train_time_temp < HighTraffic_TrainTime_L)\n\t\t\t\t\tTrain_time_temp=HighTraffic_TrainTime_L;\n\n\t\t\t\tpDM_SWAT_Table->Train_time = Train_time_temp; //50ms~10ms\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"  Train_time_flag=((%d)) , Train_time=((%d)) \\n\",pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"  [HIGH Traffic]  \\n\" ));\n\t\t\t}\n\t\t\telse if (curTxOkCnt > 125000 || curRxOkCnt > 125000) // ( 0.125M * 8bit ) / 2 =  0.5M bits /sec )\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;\n\t\t\t\tTrain_time_temp=pDM_SWAT_Table->Train_time ;\n\t\t\t\t\n\t\t\t\tif(pDM_SWAT_Table->Train_time_flag==3)\n\t\t\t\t{\n\t\t\t\t\tLowTraffic_TrainTime_L=10;\n\t\t\t\t\tif(Train_time_temp<50)\n\t\t\t\t\t\tTrain_time_temp=LowTraffic_TrainTime_L;\n\t\t\t\t\telse\n\t\t\t\t\t\tTrain_time_temp-=50;\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if(pDM_SWAT_Table->Train_time_flag==2)\n\t\t\t\t{\n\t\t\t\t\tTrain_time_temp-=30;\n\t\t\t\t\tLowTraffic_TrainTime_L=36;\n\t\t\t\t}\t\n\t\t\t\telse if(pDM_SWAT_Table->Train_time_flag==1)\n\t\t\t\t{\n\t\t\t\t\tTrain_time_temp-=10;\n\t\t\t\t\tLowTraffic_TrainTime_L=40;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tTrain_time_temp+=10;\t\n\t\t\t\t\n\t\t\t\t//--\n\t\t\t\tif(Train_time_temp >= LowTraffic_TrainTime_U)\n\t\t\t\t\tTrain_time_temp=LowTraffic_TrainTime_U;\n\t\t\t\t\n\t\t\t\telse if(Train_time_temp <= LowTraffic_TrainTime_L)\n\t\t\t\t\tTrain_time_temp=LowTraffic_TrainTime_L;\n\n\t\t\t\tpDM_SWAT_Table->Train_time = Train_time_temp; //50ms~20ms\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Train_time_flag=((%d)) , Train_time=((%d))\\n\", pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Low Traffic]\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->TrafficLoad = TRAFFIC_ULTRA_LOW;\n\t\t\t\tpDM_SWAT_Table->Train_time = 0xc8; //200ms\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Ultra-Low Traffic]\\n\"));\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"TxOkCnt=(( %llu )), RxOkCnt=(( %llu ))\\n\", \n\t\t\t\tcurTxOkCnt ,curRxOkCnt ));\n\t\t\t\t\n\t\t\t//-----------------\n\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\" Current MinMaxRSSI is ((%d)) \\n\",pDM_FatTable->MinMaxRSSI));\n\n                        //---reset index---\n\t\t\tif(pDM_SWAT_Table->reset_idx>=reset_period)\n\t\t\t{\n\t\t\t\tpDM_FatTable->MinMaxRSSI=0; //\n\t\t\t\tpDM_SWAT_Table->reset_idx=0;\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"reset_idx = (( %d )) \\n\",pDM_SWAT_Table->reset_idx ));\n\t\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"reset_idx=%d\\n\",pDM_SWAT_Table->reset_idx));\n\t\t\tpDM_SWAT_Table->reset_idx++;\n\n\t\t\t//---double check flag---\n\t\t\tif(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold && pDM_SWAT_Table->Double_chk_flag== 0)\n\t\t\t{\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\" MinMaxRSSI is ((%d)), and > %d \\n\",\n\t\t\t\t\tpDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\n\n\t\t\t\tpDM_SWAT_Table->Double_chk_flag =1;\n\t\t\t\tpDM_SWAT_Table->try_flag = 1; \n\t\t\t\tpDM_SWAT_Table->RSSI_Trying = 0;\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" Test the current Ant for (( %d )) ms again \\n\", pDM_SWAT_Table->Train_time));\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt);\n\t\t\t\tODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tnextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT;\n\n\t\t\tpDM_SWAT_Table->try_flag = 1;\n\t\t\t\n\t\t\tif(pDM_SWAT_Table->reset_idx<=1)\n\t\t\t\tpDM_SWAT_Table->RSSI_Trying = 2;\n\t\t\telse\n\t\t\t\tpDM_SWAT_Table->RSSI_Trying = 1;\n\n\t\t\todm_S0S1_SwAntDivByCtrlFrame(pDM_Odm, SWAW_STEP_PEAK);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"[set try_flag=1]  Normal State:  Begin Trying!! \\n\"));\t\t\t\n\t\t}\n\t\n\t\telse if(pDM_SWAT_Table->try_flag == 1 && pDM_SWAT_Table->Double_chk_flag== 0)\n\t\t{\t\n\t\t\tnextAnt = (pDM_FatTable->RxIdleAnt  == MAIN_ANT)? AUX_ANT : MAIN_ANT;\t\t\n\t\t\tpDM_SWAT_Table->RSSI_Trying--;\n\t\t}\n\t\t\n\t\t//1 Decision State\n\t\tif((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0) )\n\t\t{\n\t\t\tBOOLEAN bByCtrlFrame = FALSE;\n\t\t\tu8Byte\tpkt_cnt_total = 0;\n\t\t\n\t\t\tfor (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t\t\t{\n\t\t\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\t\t\tif(IS_STA_VALID(pEntry))\n\t\t\t\t{\n\t\t\t\t\t//2 Caculate RSSI per Antenna\n\t\t\t\t\tMain_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;\n\t\t\t\t\tAux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_FatTable->MainAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_main>=1)\n\t\t\t\t\t\tMain_RSSI=0;\t\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_FatTable->AuxAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_aux>=1)\n\t\t\t\t\t\tAux_RSSI=0;\n\t\t\t\t\t\n\t\t\t\t\tTargetAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\n\t\t\t\t\tLocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI;\n\t\t\t\t\tLocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI;\n\t\t\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***  CCK_counter_main = (( %d ))  , CCK_counter_aux= ((  %d )) \\n\", pDM_FatTable->CCK_counter_main, pDM_FatTable->CCK_counter_aux));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***  OFDM_counter_main = (( %d ))  , OFDM_counter_aux= ((  %d )) \\n\", pDM_FatTable->OFDM_counter_main, pDM_FatTable->OFDM_counter_aux));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***  Main_Cnt = (( %d ))  , Main_RSSI= ((  %d )) \\n\", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***  Aux_Cnt   = (( %d ))  , Aux_RSSI = ((  %d )) \\n\", pDM_FatTable->AuxAnt_Cnt[i]  , Aux_RSSI ));\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** MAC ID:[ %d ] , TargetAnt = (( %s )) \\n\", i ,( TargetAnt ==MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\"));\n\t\t\t\t\t\n\t\t\t\t\t//2 Select RX Idle Antenna\n\t\t\t\t\t\n\t\t\t\t\tif (LocalMaxRSSI != 0 && LocalMaxRSSI < MinMaxRSSI)\n\t\t\t\t\t{\n\t\t\t\t\t\tRxIdleAnt = TargetAnt;\n\t\t\t\t\t\tMinMaxRSSI = LocalMaxRSSI;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"*** LocalMaxRSSI-LocalMinRSSI = ((%d))\\n\",(LocalMaxRSSI-LocalMinRSSI)));\n\t\t\t\t\n\t\t\t\t\t\tif((LocalMaxRSSI-LocalMinRSSI)>8)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(LocalMinRSSI != 0)\n\t\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=3;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif(MinMaxRSSI > SWAntDiv_threshold)\n\t\t\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=0;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if((LocalMaxRSSI-LocalMinRSSI)>5)\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=2;\n\t\t\t\t\t\telse if((LocalMaxRSSI-LocalMinRSSI)>2)\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=1;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=0;\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//2 Select TX Antenna\n\t\t\t\t\tif(TargetAnt == MAIN_ANT)\n\t\t\t\t\t\tpDM_FatTable->antsel_a[i] = ANT1_2G;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDM_FatTable->antsel_a[i] = ANT2_2G;\n\t\t\t\n\t\t\t\t}\n\t\t\t\tpDM_FatTable->MainAnt_Sum[i] = 0;\n\t\t\t\tpDM_FatTable->AuxAnt_Sum[i] = 0;\n\t\t\t\tpDM_FatTable->MainAnt_Cnt[i] = 0;\n\t\t\t\tpDM_FatTable->AuxAnt_Cnt[i] = 0;\n\t\t\t}\n\n\t\t\tif(pDM_SWAT_Table->bSWAntDivByCtrlFrame)\n\t\t\t{\n\t\t\t\todm_S0S1_SwAntDivByCtrlFrame(pDM_Odm, SWAW_STEP_DETERMINE);\n\t\t\t\tbByCtrlFrame = TRUE;\n\t\t\t}\n\n\t\t\tpkt_cnt_total = pDM_FatTable->CCK_counter_main + pDM_FatTable->CCK_counter_aux + \n\t\t\tpDM_FatTable->OFDM_counter_main + pDM_FatTable->OFDM_counter_aux;\n\t\t\tpDM_FatTable->CCK_counter_main=0;\n\t\t\tpDM_FatTable->CCK_counter_aux=0;\n\t\t\tpDM_FatTable->OFDM_counter_main=0;\n\t\t\tpDM_FatTable->OFDM_counter_aux=0;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Control frame packet counter = %d, Data frame packet counter = %llu\\n\", \n\t\t\t\tpDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame, pkt_cnt_total));\n\t\t\t\n\t\t\tif(MinMaxRSSI == 0xff || ((pkt_cnt_total < (pDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame >> 1)) && pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2))\n\t\t\t{\t\n\t\t\t\tMinMaxRSSI = 0;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Check RSSI of control frame because MinMaxRSSI == 0xff\\n\"));\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"bByCtrlFrame = %d\\n\", bByCtrlFrame));\n\t\t\t\t\n\t\t\t\tif(bByCtrlFrame)\n\t\t\t\t{\n\t\t\t\t\tMain_RSSI = (pDM_FatTable->MainAnt_CtrlFrame_Cnt!=0)?(pDM_FatTable->MainAnt_CtrlFrame_Sum/pDM_FatTable->MainAnt_CtrlFrame_Cnt):0;\n\t\t\t\t\tAux_RSSI = (pDM_FatTable->AuxAnt_CtrlFrame_Cnt!=0)?(pDM_FatTable->AuxAnt_CtrlFrame_Sum/pDM_FatTable->AuxAnt_CtrlFrame_Cnt):0;\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_FatTable->MainAnt_CtrlFrame_Cnt<=1 && pDM_FatTable->CCK_CtrlFrame_Cnt_main>=1)\n\t\t\t\t\t\tMain_RSSI=0;\t\n\t\t\t\t\t\n\t\t\t\t\tif(pDM_FatTable->AuxAnt_CtrlFrame_Cnt<=1 && pDM_FatTable->CCK_CtrlFrame_Cnt_aux>=1)\n\t\t\t\t\t\tAux_RSSI=0;\n\n\t\t\t\t\tif (Main_RSSI != 0 || Aux_RSSI != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRxIdleAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);\n\t\t\t\t\t\tLocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI;\n\t\t\t\t\t\tLocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI;\n\n\t\t\t\t\t\tif((LocalMaxRSSI-LocalMinRSSI)>8)\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=3;\n\t\t\t\t\t\telse if((LocalMaxRSSI-LocalMinRSSI)>5)\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=2;\n\t\t\t\t\t\telse if((LocalMaxRSSI-LocalMinRSSI)>2)\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=1;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpDM_SWAT_Table->Train_time_flag=0;\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Control frame: Main_RSSI = %d, Aux_RSSI = %d\\n\", Main_RSSI, Aux_RSSI));\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"RxIdleAnt decided by control frame = %s\\n\", (RxIdleAnt == MAIN_ANT?\"MAIN\":\"AUX\")));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpDM_FatTable->MinMaxRSSI = MinMaxRSSI;\n\t\t\tpDM_SWAT_Table->try_flag = 0;\n\t\t\t\t\t\t\n\t\t\tif( pDM_SWAT_Table->Double_chk_flag==1)\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->Double_chk_flag=0;\n\t\t\t\tif(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\" [Double check] MinMaxRSSI ((%d)) > %d again!! \\n\",\n\t\t\t\t\t\tpDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\n\t\t\t\t\t\n\t\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);\t\n\t\t\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"[reset try_flag = 0] Training accomplished !!!] \\n\\n\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\" [Double check] MinMaxRSSI ((%d)) <= %d !! \\n\",\n\t\t\t\t\t\tpDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));\n\n\t\t\t\t\tnextAnt = (pDM_FatTable->RxIdleAnt  == MAIN_ANT)? AUX_ANT : MAIN_ANT;\n\t\t\t\t\tpDM_SWAT_Table->try_flag = 0; \n\t\t\t\t\tpDM_SWAT_Table->reset_idx=reset_period;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"[set try_flag=0]  Normal State:  Need to tryg again!! \\n\\n\\n\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pDM_FatTable->MinMaxRSSI < SWAntDiv_threshold)\n\t\t\t\t\tpDM_SWAT_Table->reset_idx=reset_period;\n\t\t\t\t\n\t\t\t\tpDM_SWAT_Table->PreAntenna =RxIdleAnt;\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt );\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"[reset try_flag = 0] Training accomplished !!!] \\n\\n\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t}\n\n\t//1 4.Change TRX antenna\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"RSSI_Trying = (( %d )),    Ant: (( %s )) >>> (( %s )) \\n\",\n\t\tpDM_SWAT_Table->RSSI_Trying, (pDM_FatTable->RxIdleAnt  == MAIN_ANT?\"MAIN\":\"AUX\"),(nextAnt == MAIN_ANT?\"MAIN\":\"AUX\")));\n\t\t\n\tODM_UpdateRxIdleAnt(pDM_Odm, nextAnt);\n\n\t//1 5.Reset Statistics\n\n\tpDM_FatTable->RxIdleAnt  = nextAnt;\n\n\t//1 6.Set next timer   (Trying State)\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" Test ((%s)) Ant for (( %d )) ms \\n\", (nextAnt == MAIN_ANT?\"MAIN\":\"AUX\"), pDM_SWAT_Table->Train_time));\n\tODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms\n}\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nODM_SW_AntDiv_Callback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;\n\n\t#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t\t#if USE_WORKITEM\n\t\t\tODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);\n\t\t#else\n\t\t\t{\n\t\t\t//DbgPrint(\"SW_antdiv_Callback\");\n\t\t\todm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);\n\t\t\t}\n\t\t#endif\n\t#else\n\tODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);\n\t#endif\n}\nVOID\nODM_SW_AntDiv_WorkitemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\t\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\t//DbgPrint(\"SW_antdiv_Workitem_Callback\");\n\todm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);\n}\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\nVOID\nODM_SW_AntDiv_WorkitemCallback(\n\tIN PVOID\tpContext\n)\n{\n\tPADAPTER\n\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\n\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\t/*DbgPrint(\"SW_antdiv_Workitem_Callback\");*/\n\todm_S0S1_SwAntDiv(&pHalData->odmpriv, SWAW_STEP_DETERMINE);\n}\n\nVOID\nODM_SW_AntDiv_Callback(void *FunctionContext)\n{\n\tPDM_ODM_T\tpDM_Odm= (PDM_ODM_T)FunctionContext;\n\tPADAPTER\tpadapter = pDM_Odm->Adapter;\n\tif(padapter->net_closed == _TRUE)\n\t\treturn;\n\t\n\t#if 0 /* Can't do I/O in timer callback*/\n\todm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE);\n\t#else\n\trtw_run_in_thread_cmd(padapter, ODM_SW_AntDiv_WorkitemCallback, padapter);\n\t#endif\n}\n\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nVOID\nodm_S0S1_SwAntDivByCtrlFrame(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tu1Byte\t\t\tStep\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSWAT_T\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t\n\tswitch(Step)\n\t{\n\t\tcase SWAW_STEP_PEAK:\n\t\t\tpDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame = 0;\n\t\t\tpDM_SWAT_Table->bSWAntDivByCtrlFrame = TRUE;\n\t\t\tpDM_FatTable->MainAnt_CtrlFrame_Cnt = 0;\n\t\t\tpDM_FatTable->AuxAnt_CtrlFrame_Cnt = 0;\n\t\t\tpDM_FatTable->MainAnt_CtrlFrame_Sum = 0;\n\t\t\tpDM_FatTable->AuxAnt_CtrlFrame_Sum = 0;\n\t\t\tpDM_FatTable->CCK_CtrlFrame_Cnt_main = 0;\n\t\t\tpDM_FatTable->CCK_CtrlFrame_Cnt_aux = 0;\n\t\t\tpDM_FatTable->OFDM_CtrlFrame_Cnt_main = 0;\n\t\t\tpDM_FatTable->OFDM_CtrlFrame_Cnt_aux = 0;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"odm_S0S1_SwAntDivForAPMode(): Start peak and reset counter\\n\"));\n\t\t\tbreak;\n\t\tcase SWAW_STEP_DETERMINE:\n\t\t\tpDM_SWAT_Table->bSWAntDivByCtrlFrame = FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"odm_S0S1_SwAntDivForAPMode(): Stop peak\\n\"));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpDM_SWAT_Table->bSWAntDivByCtrlFrame = FALSE;\n\t\t\tbreak;\n\t}\t\t\t\n}\n\nVOID\nodm_AntselStatisticsOfCtrlFrame(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tantsel_tr_mux,\n\tIN\t\tu4Byte\t\t\tRxPWDBAll\n\t\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tif(antsel_tr_mux == ANT1_2G)\n\t{\n\t\tpDM_FatTable->MainAnt_CtrlFrame_Sum+=RxPWDBAll;\n\t\tpDM_FatTable->MainAnt_CtrlFrame_Cnt++;\n\t}\n\telse\n\t{\n\t\tpDM_FatTable->AuxAnt_CtrlFrame_Sum+=RxPWDBAll;\n\t\tpDM_FatTable->AuxAnt_CtrlFrame_Cnt++;\n\t}\n}\n\nVOID\nodm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tPVOID\t\t\tp_phy_info_void,\n\tIN\t\tPVOID\t\t\tp_pkt_info_void\n\t//IN\t\tPODM_PHY_INFO_T\t\tpPhyInfo,\n\t//IN\t\tPODM_PACKET_INFO_T\t\tpPktinfo\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_PHY_INFO_T\t pPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void;\n\tPODM_PACKET_INFO_T \tpPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void;\n\tpSWAT_T\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tpFAT_T\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tBOOLEAN\t\tisCCKrate;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\n\t\treturn;\n\n\tif(pDM_Odm->AntDivType != S0S1_SW_ANTDIV)\n\t\treturn;\n\n\t// In try state\n\tif(!pDM_SWAT_Table->bSWAntDivByCtrlFrame)\n\t\treturn;\n\n\t// No HW error and match receiver address\n\tif(!pPktinfo->bToSelf)\n\t\treturn;\n\t\n\tpDM_SWAT_Table->PktCnt_SWAntDivByCtrlFrame++;\n\tisCCKrate = ((pPktinfo->DataRate >= DESC_RATE1M ) && (pPktinfo->DataRate <= DESC_RATE11M ))?TRUE :FALSE;\n\n\tif(isCCKrate)\n\t{\n\t \tpDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G;\n\n\t\tif(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\n\t\t\tpDM_FatTable->CCK_CtrlFrame_Cnt_main++;\n\t\telse\n\t\t\tpDM_FatTable->CCK_CtrlFrame_Cnt_aux++;\n\n\t\todm_AntselStatisticsOfCtrlFrame(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]);\n\t}\n\telse\n\t{\n\t\tif(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\n\t\t\tpDM_FatTable->OFDM_CtrlFrame_Cnt_main++;\n\t\telse\n\t\t\tpDM_FatTable->OFDM_CtrlFrame_Cnt_aux++;\n\n\t\todm_AntselStatisticsOfCtrlFrame(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPhyInfo->RxPWDBAll);\n\t}\n}\n#endif  //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\n#endif //#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n\n\n\n\nVOID\nodm_SetNextMACAddrTarget(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tPSTA_INFO_T   \tpEntry;\n\tu4Byte\t\t\tvalue32, i;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"odm_SetNextMACAddrTarget() ==>\\n\"));\n\t\n\tif (pDM_Odm->bLinked)\n\t{\n\t\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\t\t\n\t\t\tif ((pDM_FatTable->TrainIdx+1) == ODM_ASSOCIATE_ENTRY_NUM)\n\t\t\t\tpDM_FatTable->TrainIdx = 0;\n\t\t\telse\n\t\t\t\tpDM_FatTable->TrainIdx++;\n\t\t\t\n\t\t\tpEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];\n\t\t\t\n\t\t\tif (IS_STA_VALID(pEntry)) {\n\t\t\t\t\n\t\t\t\t/*Match MAC ADDR*/\n\t\t\t\t#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\t\t\t\tvalue32 = (pEntry->hwaddr[5]<<8)|pEntry->hwaddr[4];\n\t\t\t\t#else\n\t\t\t\tvalue32 = (pEntry->MacAddr[5]<<8)|pEntry->MacAddr[4];\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);/*0x7b4~0x7b5*/\n\t\t\t\t\n\t\t\t\t#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\t\t\t\tvalue32 = (pEntry->hwaddr[3]<<24)|(pEntry->hwaddr[2]<<16) |(pEntry->hwaddr[1]<<8) |pEntry->hwaddr[0];\n\t\t\t\t#else\n\t\t\t\tvalue32 = (pEntry->MacAddr[3]<<24)|(pEntry->MacAddr[2]<<16) |(pEntry->MacAddr[1]<<8) |pEntry->MacAddr[0];\n\t\t\t\t#endif\n\t\t\t\tODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);/*0x7b0~0x7b3*/\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pDM_FatTable->TrainIdx=%d\\n\", pDM_FatTable->TrainIdx));\n\t\t\t\t\n\t\t\t\t#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Training MAC Addr = %x:%x:%x:%x:%x:%x\\n\",\n\t\t\t\t\tpEntry->hwaddr[5], pEntry->hwaddr[4], pEntry->hwaddr[3], pEntry->hwaddr[2], pEntry->hwaddr[1], pEntry->hwaddr[0]));\n\t\t\t\t#else\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Training MAC Addr = %x:%x:%x:%x:%x:%x\\n\",\n\t\t\t\t\tpEntry->MacAddr[5], pEntry->MacAddr[4], pEntry->MacAddr[3], pEntry->MacAddr[2], pEntry->MacAddr[1], pEntry->MacAddr[0]));\n\t\t\t\t#endif\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n#if 0\n\t//\n\t//2012.03.26 LukeLee: This should be removed later, the MAC address is changed according to MACID in turn\n\t//\n\t#if( DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t{\t\t\n\t\tPADAPTER\tAdapter =  pDM_Odm->Adapter;\n\t\tPMGNT_INFO\tpMgntInfo = &Adapter->MgntInfo;\n\n\t\tfor (i=0; i<6; i++)\n\t\t{\n\t\t\tBssid[i] = pMgntInfo->Bssid[i];\n\t\t\t//DbgPrint(\"Bssid[%d]=%x\\n\", i, Bssid[i]);\n\t\t}\n\t}\n\t#endif\n\n\t//odm_SetNextMACAddrTarget(pDM_Odm);\n\t\n\t//1 Select MAC Address Filter\n\tfor (i=0; i<6; i++)\n\t{\n\t\tif(Bssid[i] != pDM_FatTable->Bssid[i])\n\t\t{\n\t\t\tbMatchBSSID = FALSE;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(bMatchBSSID == FALSE)\n\t{\n\t\t//Match MAC ADDR\n\t\tvalue32 = (Bssid[5]<<8)|Bssid[4];\n\t\tODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);\n\t\tvalue32 = (Bssid[3]<<24)|(Bssid[2]<<16) |(Bssid[1]<<8) |Bssid[0];\n\t\tODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);\n\t}\n\n\treturn bMatchBSSID;\n#endif\n\t\t\t\t\n}\n\n#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))\n\nVOID\nodm_FastAntTraining(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tu4Byte\tMaxRSSI_pathA=0, Pckcnt_pathA=0;\n\tu1Byte\ti,TargetAnt_pathA=0;\n\tBOOLEAN\tbPktFilterMacth_pathA = FALSE;\n\t#if(RTL8192E_SUPPORT == 1)\n\tu4Byte\tMaxRSSI_pathB=0, Pckcnt_pathB=0;\n\tu1Byte\tTargetAnt_pathB=0;\n\tBOOLEAN\tbPktFilterMacth_pathB = FALSE;\n\t#endif\n\n\n\tif(!pDM_Odm->bLinked) //bLinked==False\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[No Link!!!]\\n\"));\n\t\t\n\t\tif(pDM_FatTable->bBecomeLinked == TRUE)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\tphydm_FastTraining_enable(pDM_Odm , FAT_OFF);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG);\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tif(pDM_FatTable->bBecomeLinked ==FALSE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Linked!!!]\\n\"));\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t}\n\n\t\t\n        if(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n           ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, ((pDM_Odm->fat_comb_a)-1));\n        }\n\t#if(RTL8192E_SUPPORT == 1)\n        else if(pDM_Odm->SupportICType == ODM_RTL8192E)\n        {\n           ODM_SetBBReg(pDM_Odm, 0xB38 , BIT2|BIT1|BIT0, ((pDM_Odm->fat_comb_a)-1) );\t   //path-A  // ant combination=regB38[2:0]+1\n\t   ODM_SetBBReg(pDM_Odm, 0xB38 , BIT18|BIT17|BIT16, ((pDM_Odm->fat_comb_b)-1) );  //path-B  // ant combination=regB38[18:16]+1\n        }\n\t#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"==>odm_FastAntTraining()\\n\"));\n\n\t//1 TRAINING STATE\n\tif(pDM_FatTable->FAT_State == FAT_TRAINING_STATE)\n\t{\n\t\t//2 Caculate RSSI per Antenna\n\n                //3 [path-A]---------------------------\n\t\tfor (i=0; i<(pDM_Odm->fat_comb_a); i++) // i : antenna index\n\t\t{\n\t\t\tif(pDM_FatTable->antRSSIcnt[i] == 0)\n\t\t\t\tpDM_FatTable->antAveRSSI[i] = 0;\n\t\t\telse\n\t\t\t{\n\t\t\tpDM_FatTable->antAveRSSI[i] = pDM_FatTable->antSumRSSI[i] /pDM_FatTable->antRSSIcnt[i];\n\t\t\t\tbPktFilterMacth_pathA = TRUE;\n\t\t\t}\n\t\t\t\n\t\t\tif(pDM_FatTable->antAveRSSI[i] > MaxRSSI_pathA)\n\t\t\t{\n\t\t\t\tMaxRSSI_pathA = pDM_FatTable->antAveRSSI[i];\n                                Pckcnt_pathA = pDM_FatTable ->antRSSIcnt[i];\n\t\t\t\tTargetAnt_pathA =  i ; \n\t\t\t}\n                        else if(pDM_FatTable->antAveRSSI[i] == MaxRSSI_pathA)\n\t\t\t{\n\t\t\t\tif(  (pDM_FatTable->antRSSIcnt[i] )   >   Pckcnt_pathA)\n\t\t\t{\n\t\t\t\t\tMaxRSSI_pathA = pDM_FatTable->antAveRSSI[i];\n\t\t\t\t\tPckcnt_pathA = pDM_FatTable ->antRSSIcnt[i];\n\t\t\t\t        TargetAnt_pathA = i ;\n\t\t\t        }\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(\"*** Ant-Index : [ %d ],      Counter = (( %d )),     Avg RSSI = (( %d )) \\n\", i, pDM_FatTable->antRSSIcnt[i],  pDM_FatTable->antAveRSSI[i] );\n\t\t}\n\n\n\t\t/*\n\t\t#if(RTL8192E_SUPPORT == 1)\n\t\t//3 [path-B]---------------------------\n\t\tfor (i=0; i<(pDM_Odm->fat_comb_b); i++)\n\t\t{\n\t\t\tif(pDM_FatTable->antRSSIcnt_pathB[i] == 0)\n\t\t\t\tpDM_FatTable->antAveRSSI_pathB[i] = 0;\t\t\t\t\n\t\t\telse // (antRSSIcnt[i] != 0)\n\t\t\t{\n\t\t\t\tpDM_FatTable->antAveRSSI_pathB[i] = pDM_FatTable->antSumRSSI_pathB[i] /pDM_FatTable->antRSSIcnt_pathB[i];\n\t\t\t\tbPktFilterMacth_pathB = TRUE;\n\t\t\t}\n\t\t\tif(pDM_FatTable->antAveRSSI_pathB[i] > MaxRSSI_pathB)\n\t\t\t{\n\t\t\t\tMaxRSSI_pathB = pDM_FatTable->antAveRSSI_pathB[i];\n                                Pckcnt_pathB = pDM_FatTable ->antRSSIcnt_pathB[i];\n\t\t\t\tTargetAnt_pathB = (u1Byte) i; \n\t\t\t}\n                        if(pDM_FatTable->antAveRSSI_pathB[i] == MaxRSSI_pathB)\n\t\t\t{\n\t\t\t\tif(pDM_FatTable ->antRSSIcnt_pathB > Pckcnt_pathB)\n\t\t{\n\t\t\t\t\tMaxRSSI_pathB = pDM_FatTable->antAveRSSI_pathB[i];\n\t\t\t\t\tTargetAnt_pathB = (u1Byte) i;\n\t\t\t\t} \n\t\t}\n\t\t\tif (pDM_Odm->fat_print_rssi==1)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***{Path-B}: Sum RSSI[%d] = (( %d )),      cnt RSSI [%d] = (( %d )),     Avg RSSI[%d] = (( %d )) \\n\",\n\t\t\t\ti, pDM_FatTable->antSumRSSI_pathB[i], i, pDM_FatTable->antRSSIcnt_pathB[i], i, pDM_FatTable->antAveRSSI_pathB[i]));\n\t\t\t}\n\t\t}\n\t\t#endif\n\t\t*/\n\n\t//1 DECISION STATE\n\n\t\t//2 Select TRX Antenna\n\n\t\tphydm_FastTraining_enable(pDM_Odm, FAT_OFF);\n\n\t\t//3 [path-A]---------------------------\n\t\tif(bPktFilterMacth_pathA  == FALSE)\n\t\t{\n\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"{Path-A}: None Packet is matched\\n\"));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"{Path-A}: None Packet is matched\\n\"));\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(\"TargetAnt_pathA = (( %d )) , MaxRSSI_pathA = (( %d )) \\n\",TargetAnt_pathA,MaxRSSI_pathA);\n\n\t\t\t//3 [ update RX-optional ant ]        Default RX is Omni, Optional RX is the best decision by FAT\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt_pathA);\t\n\t\t\t}\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, TargetAnt_pathA);//Optional RX [pth-A]\n\t\t\t}\n\t\t\t//3 [ update TX ant ]\n\t\t\todm_UpdateTxAnt(pDM_Odm, TargetAnt_pathA, (pDM_FatTable->TrainIdx)); \n\n\t\t\tif(TargetAnt_pathA == 0)\n\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t}\n\t\t/*\n\t\t#if(RTL8192E_SUPPORT == 1)\n\t\t//3 [path-B]---------------------------\n\t\tif(bPktFilterMacth_pathB == FALSE)\n\t\t{\n\t\t\tif (pDM_Odm->fat_print_rssi==1)\n\t\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"***[%d]{Path-B}: None Packet is matched\\n\\n\\n\",__LINE__));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (pDM_Odm->fat_print_rssi==1)\n\t\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \n\t\t\t\t(\" ***TargetAnt_pathB = (( %d )) *** MaxRSSI = (( %d ))***\\n\\n\\n\",TargetAnt_pathB,MaxRSSI_pathB));\n\t\t\t}\n\t\t\tODM_SetBBReg(pDM_Odm, 0xB38 , BIT21|BIT20|BIT19, TargetAnt_pathB);\t//Default RX is Omni, Optional RX is the best decision by FAT\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1\t\t//from TX Info\n\n\t\t\tpDM_FatTable->antsel_pathB[pDM_FatTable->TrainIdx] = TargetAnt_pathB;\n\t\t}\n\t\t#endif\n\t\t*/\n\n\t\t//2 Reset Counter\n\t\tfor(i=0; i<(pDM_Odm->fat_comb_a); i++)\n\t\t{\n\t\t\tpDM_FatTable->antSumRSSI[i] = 0;\n\t\t\tpDM_FatTable->antRSSIcnt[i] = 0;\n\t\t}\n\t\t/*\n\t\t#if(RTL8192E_SUPPORT == 1)\n\t\tfor(i=0; i<=(pDM_Odm->fat_comb_b); i++)\n\t\t{\n\t\t\tpDM_FatTable->antSumRSSI_pathB[i] = 0;\n\t\t\tpDM_FatTable->antRSSIcnt_pathB[i] = 0;\n\t\t}\n\t\t#endif\n\t\t*/\n\t\t\n\t\tpDM_FatTable->FAT_State = FAT_PREPARE_STATE;\n\t\treturn;\n\t}\n\n\t//1 NORMAL STATE\n\tif (pDM_FatTable->FAT_State == FAT_PREPARE_STATE)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Start Prepare State ]\\n\"));\n\n\t\todm_SetNextMACAddrTarget(pDM_Odm);\n\n\t\t//2 Prepare Training\n\t\tpDM_FatTable->FAT_State = FAT_TRAINING_STATE;\n\t\tphydm_FastTraining_enable(pDM_Odm , FAT_ON);\n\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\t\t//enable HW AntDiv\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Start Training State]\\n\"));\n\n\t\tODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, pDM_Odm->antdiv_intvl ); //ms\n\t}\n\t\t\n}\n\nVOID\nodm_FastAntTrainingCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPADAPTER\tpadapter = pDM_Odm->Adapter;\n\tif(padapter->net_closed == _TRUE)\n\t    return;\n\t//if(*pDM_Odm->pbNet_closed == TRUE)\n\t   // return;\n#endif\n\n#if USE_WORKITEM\n\tODM_ScheduleWorkItem(&pDM_Odm->FastAntTrainingWorkitem);\n#else\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"******odm_FastAntTrainingCallback****** \\n\"));\n\todm_FastAntTraining(pDM_Odm);\n#endif\n}\n\nVOID\nodm_FastAntTrainingWorkItemCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"******odm_FastAntTrainingWorkItemCallback****** \\n\"));\n\todm_FastAntTraining(pDM_Odm);\n}\n\n#endif\n\n#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\nu4Byte\nphydm_construct_hl_beam_codeword(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*beam_pattern_idx,\n\tIN\t\tu4Byte\t\tant_num\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\tcodeword = 0;\n\tu4Byte\t\tdata_tmp;\n\tu1Byte\t\ti;\n\n\tif (ant_num < 8) {\n\t\tfor (i = 0; i < ant_num; i++) {\n\t\t\t/*ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"beam_pattern_num[%x] = %x\\n\",i,beam_pattern_num[i] ));*/\n\t\t\tif (beam_pattern_idx[i] == 0) {\n\t\t\t\tdata_tmp = 0x0;\n\t\t\t\t/**/\n\t\t\t} else if (beam_pattern_idx[i] == 1) {\n\t\t\t\tdata_tmp = 0x1;\n\t\t\t\t/**/\n\t\t\t} else if (beam_pattern_idx[i] == 2) {\n\t\t\t\tdata_tmp = 0x8;\n\t\t\t\t/**/\n\t\t\t} else if (beam_pattern_idx[i] == 3) {\n\t\t\t\tdata_tmp = 0x9;\n\t\t\t\t/**/\n\t\t\t}  \n\t\t\tcodeword |= (data_tmp<<(i*4));\n\t\t}\n\t}\n\n\treturn codeword;\n}\n\nVOID\nphydm_update_beam_pattern(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tcodeword,\n\tIN\t\tu4Byte\t\tcodeword_length\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tu1Byte\t\t\ti;\n\tBOOLEAN\t\t\tbeam_ctrl_signal;\n\tu4Byte\t\t\tone = 0x1;\n\tu4Byte\t\t\treg44_tmp_p, reg44_tmp_n, reg44_ori;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Set Beam Pattern =0x%x\\n\", codeword));\n\t\n\treg44_ori = ODM_GetMACReg(pDM_Odm, 0x44, bMaskDWord);\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"reg44_ori =0x%x\\n\", reg44_ori));*/\n\t\n\tfor (i = 0; i <= (codeword_length-1); i++) {\n\t\tbeam_ctrl_signal = (BOOLEAN)((codeword&BIT(i)) >> i);\n\n\t\tif (pDM_Odm->DebugComponents & ODM_COMP_ANT_DIV) {\n\t\t\t\n\t\t\tif (i == (codeword_length-1)) {\n\t\t\t\tDbgPrint(\"%d ]\\n\", beam_ctrl_signal);\n\t\t\t\t/**/\n\t\t\t} else if (i == 0) {\n\t\t\t\tDbgPrint(\"Send codeword[1:24] ---> [ %d \", beam_ctrl_signal);\t\n\t\t\t\t/**/\n\t\t\t} else if ((i % 4) == 3) {\n\t\t\t\tDbgPrint(\"%d  |  \", beam_ctrl_signal);\t\n\t\t\t\t/**/\n\t\t\t} else {\n\t\t\t\tDbgPrint(\"%d \", beam_ctrl_signal);\n\t\t\t\t/**/\n\t\t\t}\n\t\t}\n\t\t\n\t\t#if 1\n\t\treg44_tmp_p = reg44_ori & (~(BIT11|BIT10)); /*clean bit 10 & 11*/\n\t\treg44_tmp_p |= ((1<<11) | (beam_ctrl_signal<<10));\n\t\treg44_tmp_n = reg44_tmp_p & (~BIT11);\n\n\t\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\\n\", reg44_tmp_p, reg44_tmp_n));*/\n\t\tODM_SetMACReg(pDM_Odm, 0x44 , bMaskDWord, reg44_tmp_p);\n\t\tODM_SetMACReg(pDM_Odm, 0x44 , bMaskDWord, reg44_tmp_n); \n\t\t#else\n\t\tODM_SetMACReg(pDM_Odm, 0x44 , BIT11|BIT10, ((1<<1) | beam_ctrl_signal));\n\t\tODM_SetMACReg(pDM_Odm, 0x44 , BIT11, 0); \n\t\t#endif\n\n\t}\n}\n\nVOID\nphydm_update_rx_idle_beam(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tu4Byte\t\t\ti;\n\n\tpdm_sat_table->update_beam_codeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Set target beam_pattern codeword = (( 0x%x ))\\n\", pdm_sat_table->update_beam_codeword));\n\n\tif (pdm_sat_table->pre_codeword != pdm_sat_table->update_beam_codeword) {\n\t\tfor (i = 0; i < (pdm_sat_table->ant_num); i++) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Update Rx-Idle-Beam ] RxIdleBeam[%d] =%d\\n\", i, pdm_sat_table->rx_idle_beam[i]));\n\t\t\t/**/\n\t\t}\n\t\t\n\t\t#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n\t\tphydm_update_beam_pattern(pDM_Odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->data_codeword_bit_num);\n\t\t#else\n\t\tODM_ScheduleWorkItem(&pdm_sat_table->hl_smart_antenna_workitem);\n\t\t/*ODM_StallExecution(1);*/\n\t\t#endif\n\t\t\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Stay in Ori-Beam ]\\n\"));\n\t\t/**/\n\t}\n\tpdm_sat_table->pre_codeword = pdm_sat_table->update_beam_codeword;\n}\n\nVOID\nphydm_hl_smart_ant_cmd(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\t\n\tu4Byte\t\t\tused = *_used;\n\tu4Byte\t\t\tout_len = *_out_len;\n\tu4Byte\t\t\tone = 0x1;\n\tu4Byte\t\t\tcodeword_length = pdm_sat_table->data_codeword_bit_num;\n\tu4Byte\t\t\tbeam_ctrl_signal, i;\n\t\n\tif (dm_value[0] == 1) { /*fix beam pattern*/\n\t\t\n\t\tpdm_sat_table->fix_beam_pattern_en = dm_value[1];\n\t\t\n\t\tif (pdm_sat_table->fix_beam_pattern_en == 1) {\n\t\t\t\n\t\t\tpdm_sat_table->fix_beam_pattern_codeword = dm_value[2];\n\n\t\t\tif (pdm_sat_table->fix_beam_pattern_codeword  > (one<<codeword_length)) {\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Codeword overflow, Current codeword is ((0x%x)), and should be less than ((%d))bit\\n\", \n\t\t\t\t\tpdm_sat_table->fix_beam_pattern_codeword, codeword_length));\n\t\t\t\t(pdm_sat_table->fix_beam_pattern_codeword) &= 0xffffff;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Auto modify to (0x%x)\\n\", pdm_sat_table->fix_beam_pattern_codeword));\n\t\t\t}\n\t\t\t\n\t\t\tpdm_sat_table->update_beam_codeword = pdm_sat_table->fix_beam_pattern_codeword;\n\n\t\t\t/*---------------------------------------------------------*/\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"Fix Beam Pattern\\n\"));\n\t\t\tfor (i = 0; i <= (codeword_length-1); i++) {\n\t\t\t\tbeam_ctrl_signal = (BOOLEAN)((pdm_sat_table->update_beam_codeword&BIT(i)) >> i);\n\t\t\t\t\n\t\t\t\tif (i == (codeword_length-1)) {\n\t\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"%d]\\n\", beam_ctrl_signal));\n\t\t\t\t\t/**/\n\t\t\t\t} else if (i == 0) {\n\t\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"Send Codeword[1:24] to RFU -> [%d\", beam_ctrl_signal));\n\t\t\t\t\t/**/\n\t\t\t\t} else if ((i % 4) == 3) {\n\t\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"%d|\", beam_ctrl_signal));\n\t\t\t\t\t/**/\n\t\t\t\t} else {\n\t\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"%d\", beam_ctrl_signal));\n\t\t\t\t\t/**/\n\t\t\t\t}\n\t\t\t}\n\t\t\t/*---------------------------------------------------------*/\n\n\t\t\t\n\t\t\t#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n\t\t\tphydm_update_beam_pattern(pDM_Odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->data_codeword_bit_num);\n\t\t\t#else\n\t\t\tODM_ScheduleWorkItem(&pdm_sat_table->hl_smart_antenna_workitem);\n\t\t\t/*ODM_StallExecution(1);*/\n\t\t\t#endif\n\t\t} else if (pdm_sat_table->fix_beam_pattern_en == 0) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Smart Antenna: Enable\\n\"));\n\t\t}\n\t\t\n\t} else if (dm_value[0] == 2) { /*set latch time*/\n\t\t\n\t\tpdm_sat_table->latch_time = dm_value[1];\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ]  latch_time =0x%x\\n\", pdm_sat_table->latch_time));\n\t} else if (dm_value[0] == 3) {\n\t\n\t\tpdm_sat_table->fix_training_num_en = dm_value[1];\n\t\t\n\t\tif (pdm_sat_table->fix_training_num_en == 1) {\n\t\t\tpdm_sat_table->per_beam_training_pkt_num = dm_value[2];\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ]  Fix per_beam_training_pkt_num = (( 0x%x ))\\n\", pdm_sat_table->per_beam_training_pkt_num));\n\t\t} else if (pdm_sat_table->fix_training_num_en == 0) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ]  AUTO per_beam_training_pkt_num\\n\"));\n\t\t\t/**/\n\t\t}\n\t}\n\t\t\n}\n\n\nvoid\nphydm_set_all_ant_same_beam_num(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\n\tif (pDM_Odm->AntDivType == HL_SW_SMART_ANT_TYPE1) { /*2Ant for 8821A*/\n\t\t\n\t\tpdm_sat_table->rx_idle_beam[0] = pdm_sat_table->fast_training_beam_num;\n\t\tpdm_sat_table->rx_idle_beam[1] = pdm_sat_table->fast_training_beam_num;\n\t}\n\t\n\tpdm_sat_table->update_beam_codeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Set all ant beam_pattern: codeword = (( 0x%x ))\\n\", pdm_sat_table->update_beam_codeword));\n\n\t#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n\tphydm_update_beam_pattern(pDM_Odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->data_codeword_bit_num);\n\t#else\n\tODM_ScheduleWorkItem(&pdm_sat_table->hl_smart_antenna_workitem);\n\t/*ODM_StallExecution(1);*/\n\t#endif\n}\n\n#if 0\nvoid\nphydm_hl_smart_antenna_test(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tpFAT_T\t\tpDM_FatTable\t= &(pDM_Odm->DM_FatTable);\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\n\n\tpdm_sat_table->rx_idle_beam[0] = 0;\n\tpdm_sat_table->rx_idle_beam[1] = 0;\n\tcodeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"1-beam_pattern = %x\\n\", codeword));\n\tphydm_update_beam_pattern(pDM_Odm, codeword, pdm_sat_table->data_codeword_bit_num);\n\n\tpdm_sat_table->rx_idle_beam[0] = 1;\n\tpdm_sat_table->rx_idle_beam[1] = 1;\n\tcodeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"2-beam_pattern = %x\\n\", codeword));\n\tphydm_update_beam_pattern(pDM_Odm, codeword, pdm_sat_table->data_codeword_bit_num);\n\n\tpdm_sat_table->rx_idle_beam[0] = 2;\n\tpdm_sat_table->rx_idle_beam[1] = 2;\n\tcodeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"3-beam_pattern = %x\\n\", codeword));\n\tphydm_update_beam_pattern(pDM_Odm, codeword, pdm_sat_table->data_codeword_bit_num);\n\n\t\n\tpdm_sat_table->rx_idle_beam[0] = 3;\n\tpdm_sat_table->rx_idle_beam[1] = 3;\n\tcodeword = phydm_construct_hl_beam_codeword(pDM_Odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"4-beam_pattern = %x\\n\", codeword));\n\tphydm_update_beam_pattern(pDM_Odm, codeword, pdm_sat_table->data_codeword_bit_num);\t\n}\n#endif\n\nVOID\nodm_FastAntTraining_hl_smart_antenna_type1(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpSAT_T\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tpFAT_T\t\tpDM_FatTable\t = &(pDM_Odm->DM_FatTable);\n\tpSWAT_T\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tu4Byte\t\tcodeword = 0, i, j;\n\tu4Byte\t\tTargetAnt;\n\tu4Byte\t\tavg_rssi_tmp;\n\tu4Byte\t\ttarget_ant_beam_max_rssi[SUPPORT_RF_PATH_NUM] = {0};\n\tu4Byte\t\tmax_beam_ant_rssi = 0;\n\tu4Byte\t\ttarget_ant_beam[SUPPORT_RF_PATH_NUM] = {0};\n\tu4Byte\t\tbeam_tmp;\n\n\n\tif (!pDM_Odm->bLinked) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[No Link!!!]\\n\"));\n\t\t\t\t\n\t\tif (pDM_FatTable->bBecomeLinked == TRUE) {\n\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Link -> no Link\\n\"));\n\t\t\tpDM_FatTable->FAT_State = FAT_BEFORE_LINK_STATE;\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"change to (( %d )) FAT_state\\n\", pDM_FatTable->FAT_State));\n\t\t\t\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\treturn;\n\t\t\n\t} else {\n\t\tif (pDM_FatTable->bBecomeLinked == FALSE) {\n\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Linked !!!]\\n\"));\n\t\t\t\n\t\t\tpDM_FatTable->FAT_State = FAT_PREPARE_STATE;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"change to (( %d )) FAT_state\\n\", pDM_FatTable->FAT_State));\n\t\t\t\n\t\t\t/*pdm_sat_table->fast_training_beam_num = 0;*/\n\t\t\t/*phydm_set_all_ant_same_beam_num(pDM_Odm);*/\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);\n\t\t\t\n\t\t\tpDM_SWAT_Table->lastTxOkCnt =  *(pDM_Odm->pNumTxBytesUnicast);\n\t\t\tpDM_SWAT_Table->lastRxOkCnt =  *(pDM_Odm->pNumRxBytesUnicast);\n\n\t\t\tpDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t}\n\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"HL Smart Ant Training: State (( %d ))\\n\", pDM_FatTable->FAT_State));*/\n\n\t/* [DECISION STATE] */\n\t/*=======================================================================================*/\n\tif (pDM_FatTable->FAT_State == FAT_DECISION_STATE) {\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 3. In Decision State]\\n\"));\n\t\tphydm_FastTraining_enable(pDM_Odm , FAT_OFF);\n\t\t\n\t\t/*compute target beam in each antenna*/\n\t\tfor (i = 0; i < (pdm_sat_table->ant_num); i++) {\n\t\t\tfor (j = 0; j < (pdm_sat_table->beam_patten_num_each_ant); j++) {\n\n\t\t\t\tif (pdm_sat_table->pkt_rssi_cnt[i][j] == 0) {\n\t\t\t\t\tavg_rssi_tmp = 0;\n\t\t\t\t\t/**/\n\t\t\t\t} else {\n\t\t\t\t\tavg_rssi_tmp = (pdm_sat_table->pkt_rssi_sum[i][j]) / (pdm_sat_table->pkt_rssi_cnt[i][j]);\n\t\t\t\t\t/**/\n\t\t\t\t}\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Ant[%d], Beam[%d]: pkt_num=(( %d )), avg_rssi=(( %d ))\\n\", i, j, pdm_sat_table->pkt_rssi_cnt[i][j], avg_rssi_tmp));\n\t\t\t\t\n\t\t\t\tif (avg_rssi_tmp > target_ant_beam_max_rssi[i]) {\n\t\t\t\t\ttarget_ant_beam[i] = j;\n\t\t\t\t\ttarget_ant_beam_max_rssi[i] = avg_rssi_tmp;\n\t\t\t\t}\n\n\t\t\t\t/*reset counter value*/\n\t\t\t\tpdm_sat_table->pkt_rssi_sum[i][j] = 0;\n\t\t\t\tpdm_sat_table->pkt_rssi_cnt[i][j] = 0;\t\n\t\t\t\t\t\n\t\t\t}\n\t\t\tpdm_sat_table->rx_idle_beam[i] = target_ant_beam[i];\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"---------> Target of Ant[%d]: Beam_num-(( %d )) RSSI= ((%d))\\n\", \n\t\t\t\t\ti,  target_ant_beam[i], target_ant_beam_max_rssi[i]));\n\n\t\t\tif (target_ant_beam_max_rssi[i] > max_beam_ant_rssi) {\n\t\t\t\tTargetAnt = i;\n\t\t\t\tmax_beam_ant_rssi = target_ant_beam_max_rssi[i];\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Target of Ant = (( %d )) max_beam_ant_rssi = (( %d ))\\n\", \n\t\t\t\t\tTargetAnt,  max_beam_ant_rssi));\n\t\t\t}\n\t\t}\n\n\t\tif (TargetAnt == 0) \n\t\t\tTargetAnt = MAIN_ANT;\n\t\telse if (TargetAnt == 1)\n\t\t\tTargetAnt = AUX_ANT;\n\n\t\t/* [ update RX ant ]*/\n\t\tODM_UpdateRxIdleAnt(pDM_Odm, (u1Byte)TargetAnt);\n\n\t\t/* [ update TX ant ]*/\n\t\todm_UpdateTxAnt(pDM_Odm, (u1Byte)TargetAnt, (pDM_FatTable->TrainIdx));\n\t\t\n\t\t/*set beam in each antenna*/\n\t\tphydm_update_rx_idle_beam(pDM_Odm);\n\n\t\tphydm_FastTraining_enable(pDM_Odm , FAT_OFF);\n\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\t\t\n\t\tpDM_FatTable->FAT_State = FAT_PREPARE_STATE;\n\n\t} \n\t/* [TRAINING STATE] */\n\telse if (pDM_FatTable->FAT_State == FAT_TRAINING_STATE) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2. In Training State]\\n\"));\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"fat_beam_n = (( %d )), pre_fat_beam_n = (( %d ))\\n\", \n\t\t\tpdm_sat_table->fast_training_beam_num, pdm_sat_table->pre_fast_training_beam_num));\n\t\t\n\t\tif (pdm_sat_table->fast_training_beam_num > pdm_sat_table->pre_fast_training_beam_num) {\n\t\t\t\n\t\t\tpdm_sat_table->force_update_beam_en = 0;\n\n\t\t} else {\n\t\t\n\t\t\tpdm_sat_table->force_update_beam_en = 1;\n\t\t\t\n\t\t\tpdm_sat_table->pkt_counter = 0;\n\t\t\tbeam_tmp = pdm_sat_table->fast_training_beam_num;\n\t\t\tif (pdm_sat_table->fast_training_beam_num >= (pdm_sat_table->beam_patten_num_each_ant-1)) {\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Timeout Update]  Beam_num (( %d )) -> (( decision ))\\n\", pdm_sat_table->fast_training_beam_num));\t\n\t\t\t\tphydm_FastTraining_enable(pDM_Odm , FAT_OFF);\n\t\t\t\tpDM_FatTable->FAT_State = FAT_DECISION_STATE;\t\t\t\t\t\n\t\t\t\todm_FastAntTraining_hl_smart_antenna_type1(pDM_Odm);\n\n\t\t\t} else {\n\t\t\t\tpdm_sat_table->fast_training_beam_num++;\n\t\t\t\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Timeout Update]  Beam_num (( %d )) -> (( %d ))\\n\", beam_tmp, pdm_sat_table->fast_training_beam_num));\n\t\t\t\tphydm_set_all_ant_same_beam_num(pDM_Odm);\n\t\t\t\tpDM_FatTable->FAT_State = FAT_TRAINING_STATE;\t\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\tpdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Update Pre_Beam =(( %d ))\\n\", pdm_sat_table->pre_fast_training_beam_num));\n\t}\n\t/*  [Prepare State] */\n\t/*=======================================================================================*/\n\telse if (pDM_FatTable->FAT_State == FAT_PREPARE_STATE) {\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"\\n\\n[ 1. In Prepare State]\\n\"));\n\n\t\t/* Set training packet number*/\n\t\tif (pdm_sat_table->fix_training_num_en == 0) {\n\t\t\t\n\t\t\tswitch (phydm_traffic_load_decision(pDM_Odm)) {\n\n\t\t\tcase TRAFFIC_HIGH: \n\t\t\t\tpdm_sat_table->per_beam_training_pkt_num = 20;\n\t\t\t\tbreak;\n\t\t\tcase TRAFFIC_LOW: \n\t\t\t\tpdm_sat_table->per_beam_training_pkt_num = 10;\n\t\t\t\tbreak;\n\t\t\tcase TRAFFIC_ULTRA_LOW: \n\t\t\t\tpdm_sat_table->per_beam_training_pkt_num = 2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\t\t\t\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Fix_training_num = (( %d )), per_beam_training_pkt_num = (( %d ))\\n\",\n\t\t\tpdm_sat_table->fix_training_num_en , pdm_sat_table->per_beam_training_pkt_num));\n\t\t\n\t\t/* Set training MAC Addr. of target */\n\t\todm_SetNextMACAddrTarget(pDM_Odm);\n\n\t\tphydm_FastTraining_enable(pDM_Odm , FAT_ON);\n\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\tpdm_sat_table->pkt_counter = 0;\n\t\tpdm_sat_table->fast_training_beam_num = 0;\n\t\tphydm_set_all_ant_same_beam_num(pDM_Odm);\n\t\tpdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;\n\t\tpDM_FatTable->FAT_State = FAT_TRAINING_STATE;\n\t}\n\t\t\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nphydm_beam_switch_workitem_callback(\n\tIN\tPVOID\tpContext\n\t)\n{\n\tPADAPTER\t\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\n\t#if DEV_BUS_TYPE != RT_PCI_INTERFACE\n\tpdm_sat_table->pkt_skip_statistic_en = 1;\n\t#endif\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Beam Switch Workitem Callback, pkt_skip_statistic_en = (( %d ))\\n\", pdm_sat_table->pkt_skip_statistic_en));\n\t\n\tphydm_update_beam_pattern(pDM_Odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->data_codeword_bit_num);\n\n\t#if DEV_BUS_TYPE != RT_PCI_INTERFACE\n\tODM_StallExecution(pdm_sat_table->latch_time);\n\tpdm_sat_table->pkt_skip_statistic_en = 0;\n\t#endif\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"pkt_skip_statistic_en = (( %d )), latch_time = (( %d ))\\n\", pdm_sat_table->pkt_skip_statistic_en, pdm_sat_table->latch_time));\n}\n\nVOID\nphydm_beam_decision_workitem_callback(\n\tIN\tPVOID\tpContext\n\t)\n{\n\tPADAPTER\t\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] Beam decision Workitem Callback\\n\"));\n\todm_FastAntTraining_hl_smart_antenna_type1(pDM_Odm);\n}\n#endif\n\n#endif /*#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1*/\n\nVOID\nODM_AntDivInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!]   Not Support Antenna Diversity Function\\n\"));\n\t\treturn;\n\t}\n        //---\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tif(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\\n\"));\n\t\tif(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))\n\t\t\treturn;\n\t}\n\telse \tif(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\\n\"));\n\t\tif(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))\n\t\t\treturn;\n\t}\n\telse \tif(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\\n\"));\n\t}\n\n#endif\t\n\t//---\n\n\t//2 [--General---]\n\tpDM_Odm->antdiv_period=0;\n\n\tpDM_FatTable->bBecomeLinked =FALSE;\n\tpDM_FatTable->AntDiv_OnOff =0xff;\n\n\t//3       -   AP   -\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\n\t\t#ifdef BEAMFORMING_SUPPORT\n\t\t#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\todm_BDC_Init(pDM_Odm);\n\t\t#endif\n\t\t#endif\n\t\t\n\t//3     -   WIN   -\n\t#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tpDM_SWAT_Table->Ant5G = MAIN_ANT;\n\t\tpDM_SWAT_Table->Ant2G = MAIN_ANT;\n\t\tpDM_FatTable->CCK_counter_main=0;\n\t\tpDM_FatTable->CCK_counter_aux=0;\n\t\tpDM_FatTable->OFDM_counter_main=0;\n\t\tpDM_FatTable->OFDM_counter_aux=0;\n\t#endif\n\n\t//2 [---Set MAIN_ANT as default antenna if Auto-Ant enable---]\n\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\n\tpDM_Odm->AntType = ODM_AUTO_ANT;\n\n\tpDM_FatTable->RxIdleAnt = ANTDIV_INIT;\n\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\n\t//2 [---Set TX Antenna---]\n\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG);\n\n\t\t\n\t//2 [--88E---]\n\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t#if (RTL8188E_SUPPORT == 1)\n\t\t//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t//pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\n\t\tif( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)  && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!]  88E Not Supprrt This AntDiv Type\\n\"));\n\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\n\t\t\todm_RX_HWAntDiv_Init_88E(pDM_Odm);\n\t\telse if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\n\t\t\todm_TRX_HWAntDiv_Init_88E(pDM_Odm);\n\t\t#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\telse if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)\n\t\t\todm_Smart_HWAntDiv_Init_88E(pDM_Odm);\n\t        #endif\t\n\t#endif\n\t}\n\t\n\t//2 [--92E---]\n\t#if (RTL8192E_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\t\n\t\t//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t//pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\n\t\tif( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)   && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!]  8192E Not Supprrt This AntDiv Type\\n\"));\n\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\n\t\t\todm_RX_HWAntDiv_Init_92E(pDM_Odm);\n\t\telse if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\n\t\t\todm_TRX_HWAntDiv_Init_92E(pDM_Odm);\n\t\t#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\telse if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)\n\t\t\todm_Smart_HWAntDiv_Init_92E(pDM_Odm);\n\t\t#endif\n\t\n\t}\n\t#endif\t\n\t\n\t//2 [--8723B---]\n\t#if (RTL8723B_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\t\t\n\t\t//pDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\n\t\tif(pDM_Odm->AntDivType != S0S1_SW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!] 8723B  Not Supprrt This AntDiv Type\\n\"));\n\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\treturn;\n\t\t}\n\t\t\t\n\t\tif( pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\n\t\t\todm_S0S1_SWAntDiv_Init_8723B(pDM_Odm);\n\t\telse if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\n\t\t\todm_TRX_HWAntDiv_Init_8723B(pDM_Odm);\t\t\n\t}\n\t#endif\n\t\n\t//2 [--8811A 8821A---]\n\t#if (RTL8821A_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\t\tpDM_Odm->AntDivType = HL_SW_SMART_ANT_TYPE1;\n\t\t\n\t\tif (pDM_Odm->AntDivType == HL_SW_SMART_ANT_TYPE1) {\n\t\t\t\n\t\t\todm_TRX_HWAntDiv_Init_8821A(pDM_Odm);\n\t\t\tphydm_hl_smart_ant_type1_init_8821a(pDM_Odm);\n\t\t} else \n\t\t#endif\n\t\t{\n\t\t\t/*pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;*/\n\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\n\t\t\tif (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV && pDM_Odm->AntDivType != S0S1_SW_ANTDIV) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[Return!!!] 8821A & 8811A  Not Supprrt This AntDiv Type\\n\"));\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\t\n\t\t\t\todm_TRX_HWAntDiv_Init_8821A(pDM_Odm);\n\t\t\telse if (pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\n\t\t\t\todm_S0S1_SWAntDiv_Init_8821A(pDM_Odm);\n\t\t}\n\t}\n\t#endif\n\t\n\t//2 [--8881A---]\n\t#if (RTL8881A_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8881A)\n\t{\n\t\t\t//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t\t//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\n\t\t\tif(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!] 8881A  Not Supprrt This AntDiv Type\\n\"));\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\n\t\t\t\todm_RX_HWAntDiv_Init_8881A(pDM_Odm);\n\t\t\telse if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\n\t\t\t\todm_TRX_HWAntDiv_Init_8881A(pDM_Odm);\t\n\t}\n\t#endif\n\t\n\t//2 [--8812---]\n\t#if (RTL8812A_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\t\n\t\t\t//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\n\t\t\tif( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!] 8812A  Not Supprrt This AntDiv Type\\n\"));\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\todm_TRX_HWAntDiv_Init_8812A(pDM_Odm);\n\t}\n\t#endif\n\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"*** SupportICType=[%lu] \\n\",pDM_Odm->SupportICType));\n\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"*** AntDiv SupportAbility=[%lu] \\n\",(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)>>6));\n\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"*** AntDiv Type=[%d] \\n\",pDM_Odm->AntDivType));\n\n}\n\nVOID\nODM_AntDiv(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tpAdapter\t= pDM_Odm->Adapter;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\t#endif\n\n\tif(*pDM_Odm->pBandType == ODM_BAND_5G )\n\t{\n\t\tif(pDM_FatTable->idx_AntDiv_counter_5G <  pDM_Odm->antdiv_period )\n\t\t{\n\t\t\tpDM_FatTable->idx_AntDiv_counter_5G++;\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t\tpDM_FatTable->idx_AntDiv_counter_5G=0;\n\t}\n\telse \tif(*pDM_Odm->pBandType == ODM_BAND_2_4G )\n\t{\n\t\tif(pDM_FatTable->idx_AntDiv_counter_2G <  pDM_Odm->antdiv_period )\n\t\t{\n\t\t\tpDM_FatTable->idx_AntDiv_counter_2G++;\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t\tpDM_FatTable->idx_AntDiv_counter_2G=0;\n\t}\n\t\n\t//----------\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[Return!!!]   Not Support Antenna Diversity Function\\n\"));\n\t\treturn;\n\t}\n\n\t//----------\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\tif (pDM_FatTable->enable_ctrl_frame_antdiv) {\n\t\t\n\t\tif ((pDM_Odm->data_frame_num <= 10) && (pDM_Odm->bLinked))\n\t\t\tpDM_FatTable->use_ctrl_frame_antdiv = 1;\n\t\telse\n\t\t\tpDM_FatTable->use_ctrl_frame_antdiv = 0;\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"use_ctrl_frame_antdiv = (( %d )), data_frame_num = (( %d ))\\n\", pDM_FatTable->use_ctrl_frame_antdiv, pDM_Odm->data_frame_num));\n\t\tpDM_Odm->data_frame_num = 0;\n\t}\n\n\tif(pAdapter->MgntInfo.AntennaTest)\n\t\treturn;\n\t\n        {\n\t#if (BEAMFORMING_SUPPORT == 1)\t\t\t\n\t        BEAMFORMING_CAP\t\tBeamformCap = (pDM_Odm->BeamformingInfo.BeamformCap);\n\n\t\tif( BeamformCap & BEAMFORMEE_CAP ) //  BFmee On  &&   Div On ->  Div Off\n\t\t{\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[ AntDiv : OFF ]   BFmee ==1 \\n\"));\n\t\t\tif(pDM_FatTable->fix_ant_bfee == 0)\n\t\t\t{\n\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\t\tpDM_FatTable->fix_ant_bfee = 1;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse // BFmee Off   &&   Div Off ->  Div On\n\t\t{\n\t\t\tif((pDM_FatTable->fix_ant_bfee == 1)  &&  pDM_Odm->bLinked) \n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ AntDiv : ON ]   BFmee ==0\\n\"));\n\t\t\t\tif((pDM_Odm->AntDivType!=S0S1_SW_ANTDIV) )\n\t\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\n\t\t\t\tpDM_FatTable->fix_ant_bfee = 0;\n\t\t\t}\n\t\t}\n\t#endif\t\n\t}\n#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t//----------just for fool proof\n\n\tif(pDM_Odm->antdiv_rssi)\n\t\tpDM_Odm->DebugComponents |= ODM_COMP_ANT_DIV;\n\telse\n\t\tpDM_Odm->DebugComponents &= ~ODM_COMP_ANT_DIV;\n\n\tif(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)\n\t{\n\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[ 2G AntDiv Running ]\\n\"));\n\t\tif(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))\n\t\t\treturn;\n\t}\n\telse if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)\n\t{\n\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[ 5G AntDiv Running ]\\n\"));\n\t\tif(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))\n\t\t\treturn;\n\t}\n\t//else \tif(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))\n\t//{\n\t\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"[ 2G & 5G AntDiv Running ]\\n\"));\n\t//}\n#endif\n\n\t//----------\n\n\tif (pDM_Odm->antdiv_select==1)\n\t\tpDM_Odm->AntType = ODM_FIX_MAIN_ANT;\n\telse if (pDM_Odm->antdiv_select==2)\n\t\tpDM_Odm->AntType = ODM_FIX_AUX_ANT;\n\telse  //if (pDM_Odm->antdiv_select==0)\n\t\tpDM_Odm->AntType = ODM_AUTO_ANT;\n\n\t//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,(\"AntType= (( %d )) , pre_AntType= (( %d ))  \\n\",pDM_Odm->AntType,pDM_Odm->pre_AntType));\n\t\n\tif(pDM_Odm->AntType != ODM_AUTO_ANT)\n\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Fix Antenna at (( %s ))\\n\",(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)?\"MAIN\":\"AUX\"));\n\t\t\t\n\t\tif(pDM_Odm->AntType != pDM_Odm->pre_AntType)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , REG);\n\t\t\t\t\t\t\n\t\t\tif(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\n\t\t\telse if(pDM_Odm->AntType == ODM_FIX_AUX_ANT)\n\t\t\t\tODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\n\t\t}\n\t\tpDM_Odm->pre_AntType=pDM_Odm->AntType; \n\t\treturn;\n\t}\n\telse\n\t{\n\t\tif(pDM_Odm->AntType != pDM_Odm->pre_AntType)\n\t\t{\n\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\t\t\todm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);\n\t\t}\n\t\tpDM_Odm->pre_AntType=pDM_Odm->AntType;\n\t}\n\t \n\t\n\t//3 -----------------------------------------------------------------------------------------------------------\n\t//2 [--88E---]\n\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t\t#if (RTL8188E_SUPPORT == 1)\n\t\tif(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV ||pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)\n\t\t\todm_HW_AntDiv(pDM_Odm);\n\n\t\t#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\telse if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)\n\t\t\todm_FastAntTraining(pDM_Odm);\t\n\t\t#endif\n\t\t\n\t\t#endif\n\n\t}\n\t//2 [--92E---]\t\n\t#if (RTL8192E_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tif(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV || pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\n\t\t\todm_HW_AntDiv(pDM_Odm);\n\t\t\n\t\t#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\telse if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)\n\t\t\todm_FastAntTraining(pDM_Odm);\t\n\t\t#endif\n\t\t\n\t}\n\t#endif\n\n\t#if (RTL8723B_SUPPORT == 1)\t\n\t//2 [--8723B---]\n\telse if(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif (pDM_Odm->AntDivType==S0S1_SW_ANTDIV)\n\t\t\todm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);\n\t\telse if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)\n\t\t\todm_HW_AntDiv(pDM_Odm);\n\t}\n\t#endif\n\t\n\t//2 [--8821A---]\n\t#if (RTL8821A_SUPPORT == 1)\n\telse if (pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\t\tif (pDM_Odm->AntDivType == HL_SW_SMART_ANT_TYPE1) {\n\n\t\t\tif (pdm_sat_table->fix_beam_pattern_en != 0) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\\n\", pdm_sat_table->fix_beam_pattern_codeword));\n\t\t\t\t/*return;*/\n\t\t\t} else {\n\t\t\t\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ SmartAnt ] AntDivType = HL_SW_SMART_ANT_TYPE1\\n\"));*/\n\t\t\t\todm_FastAntTraining_hl_smart_antenna_type1(pDM_Odm);\n\t\t\t}\n\n\t\t} else \n\t\t#endif\n\t\t{\n\t\t\tif (!pDM_Odm->bBtEnabled)  /*BT disabled*/\n\t\t\t{\n\t\t\t\tif (pDM_Odm->AntDivType == S0S1_SW_ANTDIV) {\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" [S0S1_SW_ANTDIV]  ->  [CG_TRX_HW_ANTDIV]\\n\"));\n\t\t\t\t\t/*ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1); */\n\t\t\t\t\tif (pDM_FatTable->bBecomeLinked == TRUE)\n\t\t\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} else { /*BT enabled*/\n\t\t\t\n\t\t\t\tif (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV) {\n\t\t\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\" [CG_TRX_HW_ANTDIV]  ->  [S0S1_SW_ANTDIV]\\n\"));\n\t\t\t\t\t/*ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0);*/\n\t\t\t\t\todm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tif (pDM_Odm->AntDivType == S0S1_SW_ANTDIV)\n\t\t\t\todm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);\n\t\t\telse if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)\n\t\t\t\todm_HW_AntDiv(pDM_Odm);\n\t\t}\n\t}\n\t#endif\n\t\n\t//2 [--8881A---]\n\t#if (RTL8881A_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8881A)\t\t\n\t\todm_HW_AntDiv(pDM_Odm);\n\t#endif\n\t\n\t//2 [--8812A---]\n\t#if (RTL8812A_SUPPORT == 1)\n\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\todm_HW_AntDiv(pDM_Odm);\n\t#endif\n}\n\n\nVOID\nodm_AntselStatistics(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tu1Byte\t\t\tantsel_tr_mux,\n\tIN\t\tu4Byte\t\t\tMacId,\n\tIN\t\tu4Byte\t\t\tutility,\n\tIN            u1Byte\t\t\tmethod\n\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\tif(method==RSSI_METHOD)\n\t{\n\t\tif(antsel_tr_mux == ANT1_2G)\n\t\t{\n\t\t\tpDM_FatTable->MainAnt_Sum[MacId]+=utility;\n\t\t\tpDM_FatTable->MainAnt_Cnt[MacId]++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDM_FatTable->AuxAnt_Sum[MacId]+=utility;\n\t\t\tpDM_FatTable->AuxAnt_Cnt[MacId]++;\n\t\t}\n\t}\n\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\telse if(method==EVM_METHOD)\n\t{\n\t\tif(antsel_tr_mux == ANT1_2G)\n\t\t{\n\t\t\tpDM_FatTable->MainAntEVM_Sum[MacId]+=(utility<<5);\n\t\t\tpDM_FatTable->MainAntEVM_Cnt[MacId]++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDM_FatTable->AuxAntEVM_Sum[MacId]+=(utility<<5);\n\t\t\tpDM_FatTable->AuxAntEVM_Cnt[MacId]++;\n\t\t}\n\t}\n\telse if(method==CRC32_METHOD)\n\t{\n\t\tif(utility==0)\n\t\t\tpDM_FatTable->CRC32_Fail_Cnt++;\n\t\telse\n\t\t\tpDM_FatTable->CRC32_Ok_Cnt+=utility;\n\t}\n\t#endif\n}\n\n\nVOID\nODM_Process_RSSIForAntDiv(\t\n\tIN OUT\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\t\tPVOID\t\t\tp_phy_info_void,\n\tIN\t\t\tPVOID\t\t\tp_pkt_info_void\n\t//IN\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo,\n\t//IN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_PHY_INFO_T \tpPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void;\n\tPODM_PACKET_INFO_T\t pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void;\n\tu1Byte\t\t\tisCCKrate=0,CCKMaxRate=ODM_RATE11M;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tpSAT_T\t\t\tpdm_sat_table = &(pDM_Odm->dm_sat_table);\n\tu4Byte\t\t\tbeam_tmp;\n\t#endif\n\n\t#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN))\n\tu4Byte\t\t\tRxPower_Ant0, RxPower_Ant1;\t\n\tu4Byte\t\t\tRxEVM_Ant0, RxEVM_Ant1;\n\t#else\n\tu1Byte\t\t\tRxPower_Ant0, RxPower_Ant1;\t\n\tu1Byte\t\t\tRxEVM_Ant0, RxEVM_Ant1;\n\t#endif\n\n\tCCKMaxRate=ODM_RATE11M;\n\tisCCKrate = (pPktinfo->DataRate <= CCKMaxRate)?TRUE:FALSE;\n\n\t#if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))\n\tif (pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D) {\n\t\t\tif (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) {\n\t\t\t\tODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID,  pPhyInfo->RxPWDBAll, isCCKrate);\n\t\t\t\t/**/\n\t\t\t}\n\t}\n\t#endif\n\t\t\n\tif ((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8812)) && (pPktinfo->DataRate > CCKMaxRate))\n\t{\n\t\tRxPower_Ant0 = pPhyInfo->RxMIMOSignalStrength[0];\n\t\tRxPower_Ant1= pPhyInfo->RxMIMOSignalStrength[1];\n\n\t\tRxEVM_Ant0 =pPhyInfo->RxMIMOSignalQuality[0];\n\t\tRxEVM_Ant1 =pPhyInfo->RxMIMOSignalQuality[1];\n\t}\n\telse\n\t\tRxPower_Ant0=pPhyInfo->RxPWDBAll;\n\n\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\tif (pDM_Odm->AntDivType == HL_SW_SMART_ANT_TYPE1)\n\t{\n\t\tif ((pDM_Odm->SupportICType & ODM_HL_SMART_ANT_TYPE1_SUPPORT) && \n\t\t\t(pPktinfo->bPacketToSelf)   && \n\t\t\t(pDM_FatTable->FAT_State == FAT_TRAINING_STATE)\n\t\t\t) {\n\t\t\t\n\t\t\tif (pdm_sat_table->pkt_skip_statistic_en == 0) {\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"StaID[%d]:  antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\\n\",\n\t\t\t\t\tpPktinfo->StationID, pDM_FatTable->antsel_rx_keep_0, pDM_FatTable->hw_antsw_occur, pdm_sat_table->fast_training_beam_num, RxPower_Ant0));\n\t\t\t\t\n\t\t\t\tpdm_sat_table->pkt_rssi_sum[pDM_FatTable->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num] += RxPower_Ant0;\n\t\t\t\tpdm_sat_table->pkt_rssi_cnt[pDM_FatTable->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num]++;\n\t\t\t\tpdm_sat_table->pkt_counter++;\n\t\t\t\n\t\t\t\t/*swich beam every N pkt*/\n\t\t\t\tif ((pdm_sat_table->pkt_counter) >= (pdm_sat_table->per_beam_training_pkt_num)) {\n\n\t\t\t\t\tpdm_sat_table->pkt_counter = 0;\n\t\t\t\t\tbeam_tmp = pdm_sat_table->fast_training_beam_num;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\tif (pdm_sat_table->fast_training_beam_num >= (pdm_sat_table->beam_patten_num_each_ant-1)) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDM_FatTable->FAT_State = FAT_DECISION_STATE;\n\t\t\t\t\t\t\n\t\t\t\t\t\t#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n\t\t\t\t\t\todm_FastAntTraining_hl_smart_antenna_type1(pDM_Odm);\n\t\t\t\t\t\t#else\n\t\t\t\t\t\tODM_ScheduleWorkItem(&pdm_sat_table->hl_smart_antenna_decision_workitem);\n\t\t\t\t\t\t#endif\n\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpdm_sat_table->fast_training_beam_num++;\n\t\t\t\t\t\tphydm_set_all_ant_same_beam_num(pDM_Odm);\n\t\t\t\t\t\t\n\t\t\t\t\t\tpDM_FatTable->FAT_State = FAT_TRAINING_STATE;\t\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"Update  Beam_num (( %d )) -> (( %d ))\\n\", beam_tmp, pdm_sat_table->fast_training_beam_num));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else \n\t#endif\n\tif (pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) {\n\t\tif( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) &&  (pPktinfo->bPacketToSelf)   && (pDM_FatTable->FAT_State == FAT_TRAINING_STATE) )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon))\n\t\t{\n\t\t\tu1Byte\tantsel_tr_mux;\n\t\t\tantsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0;\n\t\t\tpDM_FatTable->antSumRSSI[antsel_tr_mux] += RxPower_Ant0;\n\t\t\tpDM_FatTable->antRSSIcnt[antsel_tr_mux]++;\n\t\t}\n\t}\n\telse //AntDivType != CG_TRX_SMART_ANTDIV \n\t{\n\t\tif ((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pPktinfo->bPacketToSelf || pDM_FatTable->use_ctrl_frame_antdiv))\n\t\t{\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\t\t{\n\t\t\t\todm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0,RSSI_METHOD);\n\n\t\t\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\t\tif(!isCCKrate)\n\t\t\t\t{\n\t\t\t\t\todm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxEVM_Ant0,EVM_METHOD);\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse// SupportICType == ODM_RTL8821 and ODM_RTL8723B and ODM_RTL8812)\n\t\t\t{\n\t\t\t\tif(isCCKrate && (pDM_Odm->AntDivType == S0S1_SW_ANTDIV))\n\t\t\t\t{\n\t\t\t\t \tpDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G;\n\n\n\t\t\t\t\tif(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\n\t\t\t\t\t\tpDM_FatTable->CCK_counter_main++;\n\t\t\t\t\telse// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)\n\t\t\t\t\t\tpDM_FatTable->CCK_counter_aux++;\n\n\t\t\t\t\todm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0,RSSI_METHOD);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)\n\t\t\t\t\t\tpDM_FatTable->OFDM_counter_main++;\n\t\t\t\t\telse// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)\n\t\t\t\t\t\tpDM_FatTable->OFDM_counter_aux++;\n\t\t\t\t\todm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0,RSSI_METHOD);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"isCCKrate=%d, PWDB_ALL=%d\\n\",isCCKrate, pPhyInfo->RxPWDBAll));\n\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"antsel_tr_mux=3'b%d%d%d\\n\",pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0));\n}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nVOID\nODM_SetTxAntByTxInfo(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tpu1Byte\t\t\tpDesc,\n\tIN\t\tu1Byte\t\t\tmacId\t\n\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\n\t\treturn;\n\n\tif (pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)\n\t\treturn;\n\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8723B) {\n#if (RTL8723B_SUPPORT == 1)\n\t\tSET_TX_DESC_ANTSEL_A_8723B(pDesc, pDM_FatTable->antsel_a[macId]);\n\t\t/*ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[8723B] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\\n\", \n\t\t\tmacId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/\n#endif\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8821) {\n#if (RTL8821A_SUPPORT == 1)\n\t\tSET_TX_DESC_ANTSEL_A_8812(pDesc, pDM_FatTable->antsel_a[macId]);\n\t\t/*ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[8821A] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\\n\", \n\t\t\tmacId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/\n#endif\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\n#if (RTL8188E_SUPPORT == 1)\n\t\tSET_TX_DESC_ANTSEL_A_88E(pDesc, pDM_FatTable->antsel_a[macId]);\n\t\tSET_TX_DESC_ANTSEL_B_88E(pDesc, pDM_FatTable->antsel_b[macId]);\n\t\tSET_TX_DESC_ANTSEL_C_88E(pDesc, pDM_FatTable->antsel_c[macId]);\n\t\t/*ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[8188E] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\\n\", \n\t\t\tmacId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));*/\n#endif\n\t}\n}\n#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\nVOID\nODM_SetTxAntByTxInfo(\n\tstruct\trtl8192cd_priv\t\t*priv,\n\tstruct\ttx_desc\t*pdesc,\n\tunsigned short\t\t\taid\t\n)\n{\n\tpFAT_T\t\tpDM_FatTable = &priv->pshare->_dmODM.DM_FatTable;\n\tu4Byte\t\tSupportICType = priv->pshare->_dmODM.SupportICType;\n\n\tif (SupportICType == ODM_RTL8881A) {\n\t\t/*panic_printk(\"[%s] [%d]   ******ODM_SetTxAntByTxInfo_8881E******\\n\",__FUNCTION__,__LINE__);\t*/\n\t\tpdesc->Dword6 &= set_desc(~(BIT(18)|BIT(17)|BIT(16)));\t\n\t\tpdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\n\t} else if (SupportICType == ODM_RTL8192E) {\n\t\t/*panic_printk(\"[%s] [%d]   ******ODM_SetTxAntByTxInfo_8192E******\\n\",__FUNCTION__,__LINE__);\t*/\n\t\tpdesc->Dword6 &= set_desc(~(BIT(18)|BIT(17)|BIT(16)));\t\n\t\tpdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\n\t} else if (SupportICType == ODM_RTL8188E) {\n\t\t/*panic_printk(\"[%s] [%d]   ******ODM_SetTxAntByTxInfo_8188E******\\n\",__FUNCTION__,__LINE__);*/\n\t\tpdesc->Dword2 &= set_desc(~BIT(24));\n\t\tpdesc->Dword2 &= set_desc(~BIT(25));\n\t\tpdesc->Dword7 &= set_desc(~BIT(29));\n\n\t\tpdesc->Dword2 |= set_desc(pDM_FatTable->antsel_a[aid]<<24);\n\t\tpdesc->Dword2 |= set_desc(pDM_FatTable->antsel_b[aid]<<25);\n\t\tpdesc->Dword7 |= set_desc(pDM_FatTable->antsel_c[aid]<<29);\n\t\t\t\n\t\t\n\t} else if (SupportICType == ODM_RTL8812) {\n\t\t/*[path-A]*/\n\t\t/*panic_printk(\"[%s] [%d]   ******ODM_SetTxAntByTxInfo_8881E******\\n\",__FUNCTION__,__LINE__);*/\n\t\t\t\n\t\tpdesc->Dword6 &= set_desc(~BIT(16));\n\t\tpdesc->Dword6 &= set_desc(~BIT(17));\n\t\tpdesc->Dword6 &= set_desc(~BIT(18));\n\n\t\tpdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);\n\t\tpdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17);\n\t\tpdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18);\n\t\t\t\n\t}\n}\n#endif\n\n\nVOID\nODM_AntDiv_Config(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"WIN Config Antenna Diversity\\n\"));\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8723B)\n\t\t{\n\t\t\tif((!pDM_Odm->DM_SWAT_Table.ANTA_ON || !pDM_Odm->DM_SWAT_Table.ANTB_ON))\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t}\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"CE Config Antenna Diversity\\n\"));\n\t\tif(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)\n\t\t{\n\t\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\t\n\t\t}\n\t\t\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8723B)\n\t\t{\n\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t}\t\t\t\t\n\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"AP Config Antenna Diversity\\n\"));\n\n\t//2 [ NOT_SUPPORT_ANTDIV ]\n\t#if(defined(CONFIG_NOT_SUPPORT_ANTDIV)) \n\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\\n\"));\n\t\t\n\t\t//2 [ 2G&5G_SUPPORT_ANTDIV ]\n\t#elif(defined(CONFIG_2G5G_SUPPORT_ANTDIV))\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously \\n\"));\n\t\tpDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G|ODM_ANTDIV_5G);\n\n\t\tif(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)\n\t\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\n\t\tif(*pDM_Odm->pBandType == ODM_BAND_5G )\n\t\t{\n\t\t\t\t#if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV; \n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\"));\n\t\t\t\t\tpanic_printk(\"[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\");\n\t\t\t\t#elif( defined(CONFIG_5G_CG_TRX_DIVERSITY)||defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\"));\t\t\t\t\n\t\t\t\t\tpanic_printk(\"[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\");\n\t\t\t\t#elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CG_SMART_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = S0S1_SW_ANTDIV\\n\"));\n\t\t\t\t#endif\n\t\t}\t\t\n\t\telse if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\n\t\t {\n\t\t\t\t#if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )\n\t\t\t\t\t\tpDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\"));\t\t\n\t\t\t\t#elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))\n\t\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = S0S1_SW_ANTDIV\\n\"));\n\t\t\t\t#endif\n\t\t}\n\t\t\n\t\t//2 [ 5G_SUPPORT_ANTDIV ]\n\t#elif(defined(CONFIG_5G_SUPPORT_ANTDIV))\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Enable AntDiv function] : Only 5G Support Antenna Diversity\\n\"));\n\t\tpanic_printk(\"[ Enable AntDiv function] : Only 5G Support Antenna Diversity\\n\");\n\t\tpDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_5G);\n\t\tif(*pDM_Odm->pBandType == ODM_BAND_5G )\n\t\t{\n\t\t\t\tif(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)\n\t\t\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\t\n\t\t\t\t#if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\"));\n\t\t\t\t\tpanic_printk(\"[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\");\n\t\t\t\t#elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\t\tpanic_printk(\"[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\");\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = CG_SMART_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 5G] : AntDiv Type = S0S1_SW_ANTDIV\\n\"));\n\t\t\t\t#endif\n\t\t}\n\t\telse if(*pDM_Odm->pBandType == ODM_BAND_2_4G )\n\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Not Support 2G AntDivType\\n\"));\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t}\n\t\t\n\t\t//2 [ 2G_SUPPORT_ANTDIV ]\n\t#elif(defined(CONFIG_2G_SUPPORT_ANTDIV)) \n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\\n\"));\n\t\tpDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G);\n\t\tif(*pDM_Odm->pBandType == ODM_BAND_2_4G )\n\t\t{\n\t\t\t\tif(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)\n\t\t\t\t\tpDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;\n\t\t\t\t#if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\\n\"));\t\t\n\t\t\t\t#elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\\n\"));\n\t\t\t\t#elif( defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY) )\n\t\t\t\t\tpDM_Odm->AntDivType = S0S1_SW_ANTDIV;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"[ 2.4G] : AntDiv Type = S0S1_SW_ANTDIV\\n\"));\n\t\t\t\t#endif\n\t\t}\n\t\telse if(*pDM_Odm->pBandType == ODM_BAND_5G )\n\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(\"Not Support 5G AntDivType\\n\"));\n\t\t\t\tpDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);\n\t\t}\n\t#endif\t\n#endif\t\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (\"SupportAbility = (( %x ))\\n\", pDM_Odm->SupportAbility ));\n\n}\n\n\nVOID\nODM_AntDivTimers(\n\tIN\t\tPVOID\t\tpDM_VOID,\t\n\tIN \t\tu1Byte\t\tstate\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(state==INIT_ANTDIV_TIMMER)\n\t{\n\t\t#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n\t\t\tODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,\n\t\t\t(RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, \"SwAntennaSwitchTimer_8723B\");\n\t\t#elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\t\tODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,\n\t\t\t(RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, \"FastAntTrainingTimer\");\n\t\t#endif\n\n\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\tODM_InitializeTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer,\n\t\t\t(RT_TIMER_CALL_BACK)odm_EVM_FastAntTrainingCallback, NULL, \"EVM_FastAntTrainingTimer\");\n\t\t#endif\n\t}\n\telse if(state==CANCEL_ANTDIV_TIMMER)\n\t{\n\t\t#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n\t\t\tODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);\n\t\t#elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\t\tODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);\n\t\t#endif\n\n\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\tODM_CancelTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer);\n\t\t#endif\n\t}\n\telse if(state==RELEASE_ANTDIV_TIMMER)\n\t{\n\t\t#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n\t\t\tODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);\n\t\t#elif ( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\n\t\t\tODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);\n\t\t#endif\n\n\t\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\t\t\tODM_ReleaseTimer(pDM_Odm,&pDM_Odm->EVM_FastAntTrainingTimer);\n\t\t#endif\n\t}\n\n}\n\n#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\nVOID\nODM_AntDivReset(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t//2 [--8723B---]\n#if (RTL8723B_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\t#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t\todm_S0S1_SWAntDiv_Reset_8723B(pDM_Odm);\n\t\t#endif\n\t}\n#endif\n}\n\nVOID\nodm_AntennaDiversityInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(pDM_Odm->mp_mode == TRUE)\n\t\treturn;\n\t\n\tif(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT))\n\t{\n\t\t#if (RTL8192C_SUPPORT==1) \n\t\t#if (!(DM_ODM_SUPPORT_TYPE & (ODM_AP)))\n\t\tODM_OldIC_AntDiv_Init(pDM_Odm);\n\t\t#endif\n\t\t#endif\n\t}\n\telse\n\t{\n\t\t#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t\tODM_AntDiv_Config(pDM_Odm);\n\t\tODM_AntDivInit(pDM_Odm);\n\t\t#endif\n\t}\n}\n\nVOID\nodm_AntennaDiversity(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(pDM_Odm->mp_mode == TRUE)\n\t\treturn;\n\n\tif(pDM_Odm->SupportICType & (ODM_OLD_IC_ANTDIV_SUPPORT))\n\t{\n\t\t#if (RTL8192C_SUPPORT==1)\n\t\t#if (!(DM_ODM_SUPPORT_TYPE & (ODM_AP)))\n\t\tODM_OldIC_AntDiv(pDM_Odm);\n\t\t#endif\n\t\t#endif\n\t}\n\telse\n\t{\n\t\t#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t\tODM_AntDiv(pDM_Odm);\n\t\t#endif\n\t}\n}\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_antdiv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef\t__PHYDMANTDIV_H__\n#define    __PHYDMANTDIV_H__\n\n/*#define ANTDIV_VERSION\t\"2.0\"  //2014.11.04*/\n/*#define ANTDIV_VERSION\t\"2.1\"  //2015.01.13  Dino*/\n/*#define ANTDIV_VERSION\t\"2.2\"  2015.01.16  Dino*/\n#define ANTDIV_VERSION\t\"3.0\"  /*2015.06.10  Dino, add HL smart antenna*/\n\n//1 ============================================================\n//1  Definition \n//1 ============================================================\n\n#define\tANTDIV_INIT\t\t0xff\n#define\tMAIN_ANT\t1\t\t//Ant A or Ant Main\n#define\tAUX_ANT\t\t2\t\t//AntB or Ant Aux\n#define\tMAX_ANT\t\t3\t\t// 3 for AP using\n\n#define ANT1_2G 0 // = ANT2_5G\n#define ANT2_2G 1 // = ANT1_5G\n/*smart antenna*/\n#define SUPPORT_RF_PATH_NUM 4\n#define SUPPORT_BEAM_PATTERN_NUM 4\n\n\n//Antenna Diversty Control Type\n#define\tODM_AUTO_ANT\t0\n#define\tODM_FIX_MAIN_ANT\t1\n#define\tODM_FIX_AUX_ANT\t2\n\n#define ODM_ANTDIV_SUPPORT\t\t(ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\n#define ODM_N_ANTDIV_SUPPORT\t\t(ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)\n#define ODM_AC_ANTDIV_SUPPORT\t\t(ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\n#define ODM_SMART_ANT_SUPPORT\t\t(ODM_RTL8188E|ODM_RTL8192E)\n#define ODM_HL_SMART_ANT_TYPE1_SUPPORT\t\t(ODM_RTL8821)\n\n#define ODM_OLD_IC_ANTDIV_SUPPORT\t\t(ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8192D)\n\n#define ODM_ANTDIV_2G_SUPPORT_IC\t\t\t(ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8881A)\n#define ODM_ANTDIV_5G_SUPPORT_IC\t\t\t(ODM_RTL8821|ODM_RTL8881A|ODM_RTL8812)\n\n#define ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC\t(ODM_RTL8192E)\n\n#define ODM_ANTDIV_2G\tBIT0\n#define ODM_ANTDIV_5G\tBIT1\n\n#define ANTDIV_ON 1\n#define ANTDIV_OFF 0\n\n#define FAT_ON 1\n#define FAT_OFF 0\n\n#define TX_BY_DESC 1\n#define REG 0\n\n#define RSSI_METHOD 0\n#define EVM_METHOD 1\n#define CRC32_METHOD 2\n\n#define INIT_ANTDIV_TIMMER 0\n#define CANCEL_ANTDIV_TIMMER 1\n#define RELEASE_ANTDIV_TIMMER 2\n\n#define CRC32_FAIL 1\n#define CRC32_OK 0\n\n#define Evm_RSSI_TH_High 25\n#define Evm_RSSI_TH_Low 20\n\n#define NORMAL_STATE_MIAN 1\n#define NORMAL_STATE_AUX 2\n#define TRAINING_STATE 3\n\n#define FORCE_RSSI_DIFF 10\n\n#define CSI_ON 1\n#define CSI_OFF 0\n\n#define DIVON_CSIOFF 1\n#define DIVOFF_CSION 2\n\n#define BDC_DIV_TRAIN_STATE 0\n#define BDC_BFer_TRAIN_STATE 1\n#define BDC_DECISION_STATE 2\n#define BDC_BF_HOLD_STATE 3\n#define BDC_DIV_HOLD_STATE 4\n\n#define BDC_MODE_1 1\n#define BDC_MODE_2 2\n#define BDC_MODE_3 3\n#define BDC_MODE_4 4\n#define BDC_MODE_NULL 0xff\n\n#define SWAW_STEP_PEAK\t\t0\n#define SWAW_STEP_DETERMINE\t1\n\n#define HL_SMTANT_2WIRE_DATA_LEN 24\n\n//1 ============================================================\n//1  structure\n//1 ============================================================\n\n\ntypedef struct _SW_Antenna_Switch_\n{\n\tu1Byte\t\tDouble_chk_flag;\n\tu1Byte\t\ttry_flag;\n\ts4Byte\t\tPreRSSI;\n\tu1Byte\t\tCurAntenna;\n\tu1Byte\t\tPreAntenna;\n\tu1Byte\t\tRSSI_Trying;\n\tu1Byte\t\tTestMode;\n\tu1Byte\t\tbTriggerAntennaSwitch;\n\tu1Byte\t\tSelectAntennaMap;\n\tu1Byte\t\tRSSI_target;\t\n\tu1Byte \t\treset_idx;\n\tu2Byte\t\tSingle_Ant_Counter;\n\tu2Byte\t\tDual_Ant_Counter;\n\tu2Byte          Aux_FailDetec_Counter;\n\tu2Byte          Retry_Counter;\n\n\t// Before link Antenna Switch check\n\tu1Byte\t\tSWAS_NoLink_State;\n\tu4Byte\t\tSWAS_NoLink_BK_Reg860;\n\tu4Byte\t\tSWAS_NoLink_BK_Reg92c;\n\tu4Byte\t\tSWAS_NoLink_BK_Reg948;\n\tBOOLEAN\t\tANTA_ON;\t//To indicate Ant A is or not\n\tBOOLEAN\t\tANTB_ON;\t//To indicate Ant B is on or not\n\tBOOLEAN\t\tPre_Aux_FailDetec;\n\tBOOLEAN\t\tRSSI_AntDect_bResult;\t\n\tu1Byte\t\tAnt5G;\n\tu1Byte\t\tAnt2G;\n\n\ts4Byte\t\tRSSI_sum_A;\n\ts4Byte\t\tRSSI_sum_B;\n\ts4Byte\t\tRSSI_cnt_A;\n\ts4Byte\t\tRSSI_cnt_B;\n\n\tu8Byte\t\tlastTxOkCnt;\n\tu8Byte\t\tlastRxOkCnt;\n\tu8Byte \t\tTXByteCnt_A;\n\tu8Byte \t\tTXByteCnt_B;\n\tu8Byte \t\tRXByteCnt_A;\n\tu8Byte \t\tRXByteCnt_B;\n\tu1Byte \t\tTrafficLoad;\n\tu1Byte\t\tTrain_time;\n\tu1Byte\t\tTrain_time_flag;\n\tRT_TIMER \tSwAntennaSwitchTimer;\n#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\t\n\tRT_TIMER \tSwAntennaSwitchTimer_8723B;\n\tu4Byte\t\tPktCnt_SWAntDivByCtrlFrame;\n\tBOOLEAN\t\tbSWAntDivByCtrlFrame;\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\t#if USE_WORKITEM\n\tRT_WORK_ITEM\t\t\tSwAntennaSwitchWorkitem;\n\t#if (RTL8723B_SUPPORT == 1) || (RTL8821A_SUPPORT == 1)\t\n\tRT_WORK_ITEM\t\t\tSwAntennaSwitchWorkitem_8723B;\t\n\t#endif\n\t#endif\n#endif\n/* CE Platform use\n#ifdef CONFIG_SW_ANTENNA_DIVERSITY\n\t_timer SwAntennaSwitchTimer; \n\tu8Byte lastTxOkCnt;\n\tu8Byte lastRxOkCnt;\n\tu8Byte TXByteCnt_A;\n\tu8Byte TXByteCnt_B;\n\tu8Byte RXByteCnt_A;\n\tu8Byte RXByteCnt_B;\n\tu1Byte DoubleComfirm;\n\tu1Byte TrafficLoad;\n\t//SW Antenna Switch\n\n\n#endif\n*/\n#ifdef CONFIG_HW_ANTENNA_DIVERSITY\n\t//Hybrid Antenna Diversity\n\tu4Byte\t\tCCK_Ant1_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\t\tCCK_Ant2_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\t\tOFDM_Ant1_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\t\tOFDM_Ant2_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\t\tRSSI_Ant1_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\t\tRSSI_Ant2_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\t\tTxAnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\t\tTargetSTA;\n\tu1Byte\t\tantsel;\n\tu1Byte\t\tRxIdleAnt;\n\n#endif\n\t\n}SWAT_T, *pSWAT_T;\n\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\ntypedef struct _BF_DIV_COEX_\n{\n\tBOOLEAN w_BFer_Client[ODM_ASSOCIATE_ENTRY_NUM];\n\tBOOLEAN w_BFee_Client[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tMA_rx_TP[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tMA_rx_TP_DIV[ODM_ASSOCIATE_ENTRY_NUM];\n\n\tu1Byte  BDCcoexType_wBfer;\n\tu1Byte num_Txbfee_Client;\n\tu1Byte num_Txbfer_Client;\n\tu1Byte BDC_Try_counter;\n\tu1Byte BDC_Hold_counter;\n\tu1Byte BDC_Mode;\n\tu1Byte BDC_active_Mode;\n\tu1Byte BDC_state;\n\tu1Byte BDC_RxIdleUpdate_counter;\n\tu1Byte num_Client;\n\tu1Byte pre_num_Client;\n\tu1Byte num_BfTar;\n\tu1Byte num_DivTar;\n\t\n\tBOOLEAN bAll_DivSta_Idle;\n\tBOOLEAN bAll_BFSta_Idle;\n\tBOOLEAN BDC_Try_flag;\n\tBOOLEAN BF_pass;\n\tBOOLEAN DIV_pass;\t\n}BDC_T,*pBDC_T;\n#endif\n#endif\n\n#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\ntypedef struct _SMART_ANTENNA_TRAINNING_ {\n\tu4Byte\tlatch_time;\n\tBOOLEAN\tpkt_skip_statistic_en;\n\tu4Byte\tfix_beam_pattern_en;\n\tu4Byte\tfix_training_num_en;\n\tu4Byte\tfix_beam_pattern_codeword;\n\tu4Byte\tupdate_beam_codeword;\n\tu4Byte\tant_num; /*number of smart beam antenna*/\n\tu4Byte\tbeam_patten_num_each_ant;/*number of  beam can be switched in each antenna*/\n\tu4Byte\tdata_codeword_bit_num;\n\tu4Byte\tper_beam_training_pkt_num;\n\tu4Byte\tpkt_counter;\n\tu4Byte\tfast_training_beam_num;\n\tu4Byte\tpre_fast_training_beam_num;\t\n\tu4Byte\tpkt_rssi_sum[SUPPORT_RF_PATH_NUM][SUPPORT_BEAM_PATTERN_NUM];\n\tu4Byte\tpkt_rssi_cnt[SUPPORT_RF_PATH_NUM][SUPPORT_BEAM_PATTERN_NUM];\n\tu4Byte\trx_idle_beam[SUPPORT_RF_PATH_NUM];\n\tu4Byte\tpre_codeword;\n\tBOOLEAN\tforce_update_beam_en;\n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tRT_WORK_ITEM\thl_smart_antenna_workitem;\n\tRT_WORK_ITEM\thl_smart_antenna_decision_workitem;\t\n\t#endif\n\n} SAT_T, *pSAT_T;\n#endif\n\ntypedef struct _FAST_ANTENNA_TRAINNING_\n{\n\tu1Byte\tBssid[6];\n\tu1Byte\tantsel_rx_keep_0;\n\tu1Byte\tantsel_rx_keep_1;\n\tu1Byte\tantsel_rx_keep_2;\n\tu1Byte\tantsel_rx_keep_3;\n\tu4Byte\tantSumRSSI[7];\n\tu4Byte\tantRSSIcnt[7];\n\tu4Byte\tantAveRSSI[7];\n\tu1Byte\tFAT_State;\n\tu4Byte\tTrainIdx;\n\tu1Byte\tantsel_a[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\tantsel_b[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\tantsel_c[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tMainAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tAuxAnt_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tMainAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tAuxAnt_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\tRxIdleAnt;\n\tu1Byte\tAntDiv_OnOff;\n\tBOOLEAN\tbBecomeLinked;\n\tu4Byte\tMinMaxRSSI;\n\tu1Byte\tidx_AntDiv_counter_2G;\n\tu1Byte\tidx_AntDiv_counter_5G;\n\tu1Byte\tAntDiv_2G_5G;\n\tu4Byte    CCK_counter_main;\n\tu4Byte    CCK_counter_aux;\t\n\tu4Byte    OFDM_counter_main;\n\tu4Byte    OFDM_counter_aux;\n\n\t#ifdef ODM_EVM_ENHANCE_ANTDIV\n\tu4Byte\tMainAntEVM_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tAuxAntEVM_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tMainAntEVM_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tAuxAntEVM_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tBOOLEAN\tEVM_method_enable;\n\tu1Byte\tTargetAnt_EVM;\n\tu1Byte\tTargetAnt_CRC32;\n\tu1Byte\tTargetAnt_enhance;\n\tu1Byte\tpre_TargetAnt_enhance;\n\tu2Byte\tMain_MPDU_OK_cnt;\n\tu2Byte\tAux_MPDU_OK_cnt;\t\n\n\tu4Byte\tCRC32_Ok_Cnt;\n\tu4Byte\tCRC32_Fail_Cnt;\n\tu4Byte\tMainCRC32_Ok_Cnt;\n\tu4Byte\tAuxCRC32_Ok_Cnt;\n\tu4Byte\tMainCRC32_Fail_Cnt;\n\tu4Byte\tAuxCRC32_Fail_Cnt;\n\t#endif\t\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tu4Byte    CCK_CtrlFrame_Cnt_main;\n\tu4Byte    CCK_CtrlFrame_Cnt_aux;\n\tu4Byte    OFDM_CtrlFrame_Cnt_main;\n\tu4Byte    OFDM_CtrlFrame_Cnt_aux;\n\tu4Byte\tMainAnt_CtrlFrame_Sum;\n\tu4Byte\tAuxAnt_CtrlFrame_Sum;\n\tu4Byte\tMainAnt_CtrlFrame_Cnt;\n\tu4Byte\tAuxAnt_CtrlFrame_Cnt;\n\t#endif\n\tBOOLEAN\tfix_ant_bfee;\n\tBOOLEAN\tenable_ctrl_frame_antdiv;\n\tBOOLEAN\tuse_ctrl_frame_antdiv;\n\tu1Byte\thw_antsw_occur;\n}FAT_T,*pFAT_T;\n\n\n//1 ============================================================\n//1  enumeration\n//1 ============================================================\n\n\n\ntypedef enum _FAT_STATE /*Fast antenna training*/\n{\n\tFAT_BEFORE_LINK_STATE = 0,\n\tFAT_PREPARE_STATE = 1,\n\tFAT_TRAINING_STATE = 2,\n\tFAT_DECISION_STATE = 3\n}FAT_STATE_E, *PFAT_STATE_E;\n\ntypedef enum _ANT_DIV_TYPE\n{\n\tNO_ANTDIV\t\t\t= 0xFF,\t\n\tCG_TRX_HW_ANTDIV\t\t= 0x01,\n\tCGCS_RX_HW_ANTDIV \t= 0x02,\n\tFIXED_HW_ANTDIV\t\t= 0x03,\n\tCG_TRX_SMART_ANTDIV\t= 0x04,\n\tCGCS_RX_SW_ANTDIV\t= 0x05,\n\tS0S1_SW_ANTDIV          = 0x06, /*8723B intrnal switch S0 S1*/\n\tHL_SW_SMART_ANT_TYPE1          = 0x10 /*Hong-Lin Smart antenna use for 8821AE which is a 2 Ant. entitys, and each Ant. is equipped with 4 antenna patterns*/\n}ANT_DIV_TYPE_E, *PANT_DIV_TYPE_E;\n\n\n//1 ============================================================\n//1  function prototype\n//1 ============================================================\n\n\nVOID\nODM_StopAntennaSwitchDm(\n\tIN\tPVOID\tpDM_VOID\n\t);\nVOID\nODM_SetAntConfig(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\t\tantSetting\t// 0=A, 1=B, 2=C, ....\n\t);\n\n\n#define SwAntDivRestAfterLink\tODM_SwAntDivRestAfterLink\nVOID ODM_SwAntDivRestAfterLink(\t\n\tIN\tPVOID\tpDM_VOID\n\t);\n\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\nVOID\nODM_UpdateRxIdleAnt(\n\tIN\t\tPVOID\t\tpDM_VOID, \n\tIN\t\t u1Byte\t\tAnt\n);\n\n#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nODM_SW_AntDiv_Callback(\n\tIN \tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nODM_SW_AntDiv_WorkitemCallback(\n\tIN\tPVOID\tpContext\n\t);\n\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\nVOID\nODM_SW_AntDiv_WorkitemCallback(\n\tIN PVOID\tpContext\n);\n\nVOID\nODM_SW_AntDiv_Callback(\n\tvoid \t\t*FunctionContext\n\t);\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nVOID\nodm_S0S1_SwAntDivByCtrlFrame(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tStep\n);\n\nVOID\nodm_AntselStatisticsOfCtrlFrame(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tantsel_tr_mux,\n\tIN\t\tu4Byte\t\t\tRxPWDBAll\n);\n\nVOID\nodm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(\n\tIN\t\tPVOID\t\t\t\tpDM_VOID,\n\tIN\t\tPVOID\t\tp_phy_info_void,\n\tIN\t\tPVOID\t\tp_pkt_info_void\n);\n\n\n#endif \n#endif\n\n#ifdef ODM_EVM_ENHANCE_ANTDIV\nVOID\nodm_EVM_FastAntTrainingCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n#endif\n\nVOID\nodm_HW_AntDiv(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\n#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\nVOID\nodm_FastAntTraining(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_FastAntTrainingCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_FastAntTrainingWorkItemCallback(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n#endif\n\n\n#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nphydm_beam_switch_workitem_callback(\n\tIN\tPVOID\tpContext\n\t);\n\nVOID\nphydm_beam_decision_workitem_callback(\n\tIN\tPVOID\tpContext\n\t);\n\n#endif\n\nVOID\nphydm_update_beam_pattern(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\tcodeword,\n\tIN\t\tu4Byte\t\tcodeword_length\n\t);\n\nvoid\nphydm_set_all_ant_same_beam_num(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nphydm_hl_smart_ant_cmd(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n);\n\n#endif/*#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1*/\n\nVOID\nODM_AntDivInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nODM_AntDiv(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_AntselStatistics(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tantsel_tr_mux,\n\tIN\t\tu4Byte\t\t\tMacId,\n\tIN\t\tu4Byte\t\t\tutility,\n\tIN\t\tu1Byte\t\t\tmethod\n);\n\nVOID\nODM_Process_RSSIForAntDiv(\t\n\tIN OUT\tPVOID\t\tpDM_VOID,\n\tIN\t\tPVOID\t\tp_phy_info_void,\n\tIN\t\tPVOID\t\tp_pkt_info_void\n);\n\n\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nVOID\nODM_SetTxAntByTxInfo(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tpu1Byte\t\t\tpDesc,\n\tIN\t\tu1Byte\t\t\tmacId\t\n);\n\n#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\nVOID\nODM_SetTxAntByTxInfo(\n\tstruct\trtl8192cd_priv\t\t*priv,\n\tstruct \ttx_desc\t\t\t*pdesc,\n\tunsigned short\t\t\taid\t\n);\n\n#endif\n\n\nVOID\nODM_AntDiv_Config(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\n\nVOID\nODM_UpdateRxIdleAnt_8723B(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tAnt,\n\tIN\t\tu4Byte\t\t\tDefaultAnt, \n\tIN\t\tu4Byte\t\t\tOptionalAnt\n);\n\nVOID\nODM_AntDivTimers(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN \t\tu1Byte\t\tstate\n);\n\n#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\nVOID\nODM_AntDivReset(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_AntennaDiversityInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_AntennaDiversity(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\n\n#endif //#ifndef\t__ODMANTDIV_H__\n"
  },
  {
    "path": "hal/phydm/phydm_beamforming.c",
    "content": "#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#if WPP_SOFTWARE_TRACE\n#include \"phydm_beamforming.tmh\"\n#endif\n#endif\n\n#if (BEAMFORMING_SUPPORT == 1)\n\nPRT_BEAMFORM_STAINFO\nphydm_staInfoInit(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN u2Byte\t\t\tstaIdx\n\t)\n{\n\tPRT_BEAMFORMING_INFO\t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORM_STAINFO\t\tpEntry = &(pBeamInfo->BeamformSTAinfo);\n\tPSTA_INFO_T\t\t\t\t\tpSTA = pDM_Odm->pODM_StaInfo[staIdx];\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPMGNT_INFO\t\t\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tPRT_HIGH_THROUGHPUT\t\tpHTInfo = GET_HT_INFO(pMgntInfo);\n\tPRT_VERY_HIGH_THROUGHPUT\tpVHTInfo = GET_VHT_INFO(pMgntInfo);\n\n\tODM_MoveMemory(pDM_Odm, pEntry->MyMacAddr, Adapter->CurrentAddress, 6);\n\t\n\tpEntry->HtBeamformCap = pHTInfo->HtBeamformCap;\n\tpEntry->VhtBeamformCap = pVHTInfo->VhtBeamformCap;\n\n\t/*IBSS, AP mode*/\n\tif (staIdx != 0) {\n\t\tpEntry->AID = pSTA->AID;\n\t\tpEntry->RA = pSTA->MacAddr;\n\t\tpEntry->MacID = pSTA->AssociatedMacId;\n\t\tpEntry->WirelessMode = pSTA->WirelessMode;\n\t\tpEntry->BW = pSTA->BandWidth;\n\t\tpEntry->CurBeamform = pSTA->HTInfo.HtCurBeamform;\n\t} else {/*client mode*/\n\t\tpEntry->AID = pMgntInfo->mAId;\n\t\tpEntry->RA = pMgntInfo->Bssid;\n\t\tpEntry->MacID = pMgntInfo->mMacId;\n\t\tpEntry->WirelessMode = pMgntInfo->dot11CurrentWirelessMode;\n\t\tpEntry->BW = pMgntInfo->dot11CurrentChannelBandWidth;\n\t\tpEntry->CurBeamform = pHTInfo->HtCurBeamform;\n\t}\t\n\n\tif ((pEntry->WirelessMode & WIRELESS_MODE_AC_5G) || (pEntry->WirelessMode & WIRELESS_MODE_AC_24G)) {\n\t\tif (staIdx != 0)\n\t\t\tpEntry->CurBeamformVHT = pSTA->VHTInfo.VhtCurBeamform;\n\t\telse\n\t\t\tpEntry->CurBeamformVHT = pVHTInfo->VhtCurBeamform;\t\n\t\t}\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"pSTA->wireless_mode = 0x%x, staidx = %d\\n\", pSTA->WirelessMode, staIdx));\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\n\tif (!IS_STA_VALID(pSTA)) {\n\t\trtw_warn_on(1);\n\t\tDBG_871X(\"%s => sta_info(mac_id:%d) failed\\n\", __func__, staIdx);\n\t\treturn pEntry;\n\t}\n\t\n\tODM_MoveMemory(pDM_Odm, pEntry->MyMacAddr, adapter_mac_addr(pSTA->padapter), 6);\n\tpEntry->HtBeamformCap = pSTA->htpriv.beamform_cap;\n\n\tpEntry->AID = pSTA->aid;\n\tpEntry->RA = pSTA->hwaddr;\n\tpEntry->MacID = pSTA->mac_id;\n\tpEntry->WirelessMode = pSTA->wireless_mode;\n\tpEntry->BW = pSTA->bw_mode;\n\n\tpEntry->CurBeamform = pSTA->htpriv.beamform_cap;\n#if\tODM_IC_11AC_SERIES_SUPPORT\n\tif ((pEntry->WirelessMode & WIRELESS_MODE_AC_5G) || (pEntry->WirelessMode & WIRELESS_MODE_AC_24G)) {\n\t\tpEntry->CurBeamformVHT = pSTA->vhtpriv.beamform_cap;\n\t\tpEntry->VhtBeamformCap = pSTA->vhtpriv.beamform_cap;\n\t}\n#endif\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"pSTA->wireless_mode = 0x%x, staidx = %d\\n\", pSTA->wireless_mode, staIdx));\n#endif\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"pEntry->CurBeamform = 0x%x, pEntry->CurBeamformVHT = 0x%x\\n\", pEntry->CurBeamform, pEntry->CurBeamformVHT));\n\treturn pEntry;\n\n}\nvoid phydm_staInfoUpdate(\n\tIN PDM_ODM_T\t\t\tpDM_Odm,\n\tIN u2Byte\t\t\t\tstaIdx,\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry\n\t)\n{\n\tPSTA_INFO_T pSTA = pDM_Odm->pODM_StaInfo[staIdx];\n\t\n\tif (!IS_STA_VALID(pSTA))\n\t\treturn;\n\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tpSTA->txbf_paid = pBeamformEntry->P_AID;\n\tpSTA->txbf_gid = pBeamformEntry->G_ID;\n#endif\t\n}\n\t\n\nu1Byte\nBeamforming_GetHTNDPTxRate(\n\tIN\tPVOID\tpDM_VOID,\n\tu1Byte\tCompSteeringNumofBFer\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte Nr_index = 0;\n\tu1Byte NDPTxRate;\n\t/*Find Nr*/\n\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tNr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), CompSteeringNumofBFer);\n\telse\n\t\tNr_index = TxBF_Nr(1, CompSteeringNumofBFer);\n\t\n\tswitch (Nr_index) {\n\tcase 1:\n\tNDPTxRate = MGN_MCS8;\n\tbreak;\n\n\tcase 2:\n\tNDPTxRate = MGN_MCS16;\n\tbreak;\n\n\tcase 3:\n\tNDPTxRate = MGN_MCS24;\n\tbreak;\n\t\t\t\n\tdefault:\n\tNDPTxRate = MGN_MCS8;\n\tbreak;\n\t}\n\nreturn NDPTxRate;\n\n}\n\nu1Byte\nBeamforming_GetVHTNDPTxRate(\n\tIN\tPVOID\tpDM_VOID,\n\tu1Byte\tCompSteeringNumofBFer\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte Nr_index = 0;\n\tu1Byte NDPTxRate;\n\t/*Find Nr*/\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tNr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), CompSteeringNumofBFer);\n\telse\n\t\tNr_index = TxBF_Nr(1, CompSteeringNumofBFer);\n\t\n\tswitch (Nr_index) {\n\tcase 1:\n\tNDPTxRate = MGN_VHT2SS_MCS0;\n\tbreak;\n\n\tcase 2:\n\tNDPTxRate = MGN_VHT3SS_MCS0;\n\tbreak;\n\n\tcase 3:\n\tNDPTxRate = MGN_VHT4SS_MCS0;\n\tbreak;\n\t\t\t\n\tdefault:\n\tNDPTxRate = MGN_VHT2SS_MCS0;\n\tbreak;\n\t}\n\nreturn NDPTxRate;\n\n}\n\n\nPRT_BEAMFORMEE_ENTRY\nphydm_Beamforming_GetBFeeEntryByAddr(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tpu1Byte\t\tRA,\n\tOUT\tpu1Byte\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti = 0;\n\tPRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;\n\t\n\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed && (eqMacAddr(RA, pBeamInfo->BeamformeeEntry[i].MacAddr))) {\n\t\t\t*Idx = i;\n\t\t\treturn &(pBeamInfo->BeamformeeEntry[i]);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\nPRT_BEAMFORMER_ENTRY\nphydm_Beamforming_GetBFerEntryByAddr(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte \tTA,\n\tOUT\tpu1Byte\tIdx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\ti = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\t\n\tfor (i = 0; i < BEAMFORMER_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformerEntry[i].bUsed &&  (eqMacAddr(TA, pBeamInfo->BeamformerEntry[i].MacAddr))) {\n\t\t\t*Idx = i;\n\t\t\treturn &(pBeamInfo->BeamformerEntry[i]);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\n\nPRT_BEAMFORMEE_ENTRY\nphydm_Beamforming_GetEntryByMacId(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu1Byte\t\tMacId,\n\tOUT\tpu1Byte\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti = 0;\n\tPRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;\n\t\n\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed && (MacId == pBeamInfo->BeamformeeEntry[i].MacId)) {\n\t\t\t*Idx = i;\n\t\t\treturn &(pBeamInfo->BeamformeeEntry[i]);\n\t\t}\n\t}\n\n\treturn NULL;\n}\n\n\nBEAMFORMING_CAP\nphydm_Beamforming_GetEntryBeamCapByMacId(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu1Byte\t\tMacId\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tBEAMFORMING_CAP\t\t\tBeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\n\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed && (MacId == pBeamInfo->BeamformeeEntry[i].MacId)) {\n\t\t\tBeamformEntryCap =  pBeamInfo->BeamformeeEntry[i].BeamformEntryCap;\n\t\t\ti = BEAMFORMEE_ENTRY_NUM;\n\t\t}\n\t}\n\n\treturn BeamformEntryCap;\n}\n\n\nPRT_BEAMFORMEE_ENTRY\nphydm_Beamforming_GetFreeBFeeEntry(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT\tpu1Byte\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti = 0;\n\tPRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed == FALSE) {\n\t\t\t*Idx = i;\n\t\t\treturn &(pBeamInfo->BeamformeeEntry[i]);\n\t\t}\t\n\t}\n\treturn NULL;\n}\n\nPRT_BEAMFORMER_ENTRY\nphydm_Beamforming_GetFreeBFerEntry(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT\tpu1Byte\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti = 0;\n\tPRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s ===>\\n\", __func__));\n\n\tfor (i = 0; i < BEAMFORMER_ENTRY_NUM; i++) {\n\t\tif (pBeamInfo->BeamformerEntry[i].bUsed == FALSE) {\n\t\t\t*Idx = i;\n\t\t\treturn &(pBeamInfo->BeamformerEntry[i]);\n\t\t}\t\n\t}\n\treturn NULL;\n}\n\n/*\n// Description: Get the first entry index of MU Beamformee.\n//\n// Return Value: Index of the first MU sta.\n//\n// 2015.05.25. Created by tynli.\n//\n*/\nu1Byte\nphydm_Beamforming_GetFirstMUBFeeEntryIdx(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\tidx = 0xFF;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tBOOLEAN\t\t\t\t\tbFound = FALSE;\n\n\tfor (idx = 0; idx < BEAMFORMEE_ENTRY_NUM; idx++) {\n\t\tif (pBeamInfo->BeamformeeEntry[idx].bUsed && pBeamInfo->BeamformeeEntry[idx].is_mu_sta) {\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] idx=%d!\\n\", __func__, idx));\n\t\t\tbFound = TRUE;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\tif (!bFound)\n\t\tidx = 0xFF;\n\n\treturn idx;\n}\n\n\n/*Add SU BFee and MU BFee*/\nPRT_BEAMFORMEE_ENTRY\nBeamforming_AddBFeeEntry(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tIN\tPRT_BEAMFORM_STAINFO\tpSTA,\n\tIN\tBEAMFORMING_CAP\tBeamformCap,\n\tIN\tu1Byte\t\t\t\tNumofSoundingDim,\n\tIN\tu1Byte\t\t\t\tCompSteeringNumofBFer,\n\tOUT\tpu1Byte\t\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = phydm_Beamforming_GetFreeBFeeEntry(pDM_Odm, Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (pEntry != NULL) {\t\n\t\tpEntry->bUsed = TRUE;\n\t\tpEntry->AID = pSTA->AID;\n\t\tpEntry->MacId = pSTA->MacID;\n\t\tpEntry->SoundBW = pSTA->BW;\n\t\tODM_MoveMemory(pDM_Odm, pEntry->MyMacAddr, pSTA->MyMacAddr, 6);\n\t\t\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_AP)) {\n\t\t\t/*BSSID[44:47] xor BSSID[40:43]*/\n\t\t\tu2Byte BSSID = ((pSTA->MyMacAddr[5] & 0xf0) >> 4) ^ (pSTA->MyMacAddr[5] & 0xf);\n\t\t\t/*(dec(A) + dec(B)*32) mod 512*/\n\t\t\tpEntry->P_AID = (pSTA->AID + BSSID * 32) & 0x1ff;\n\t\t\tpEntry->G_ID = 63;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BFee P_AID addressed to STA=%d\\n\", __func__, pEntry->P_AID));\n\t\t} else if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS)) {\n\t\t\t/*ad hoc mode*/\n\t\t\tpEntry->P_AID = 0;\n\t\t\tpEntry->G_ID = 63;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BFee P_AID as IBSS=%d\\n\", __func__, pEntry->P_AID));\n\t\t} else {\n\t\t\t/*client mode*/\n\t\t\tpEntry->P_AID =  pSTA->RA[5];\n\t\t\t/*BSSID[39:47]*/\n\t\t\tpEntry->P_AID = (pEntry->P_AID << 1) | (pSTA->RA[4] >> 7);\n\t\t\tpEntry->G_ID = 0;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BFee P_AID addressed to AP=0x%X\\n\", __func__, pEntry->P_AID));\n\t\t}\n\t\tcpMacAddr(pEntry->MacAddr, pSTA->RA);\n\t\tpEntry->bTxBF = FALSE;\n\t\tpEntry->bSound = FALSE;\n\t\tpEntry->SoundPeriod = 400;\n\t\tpEntry->BeamformEntryCap = BeamformCap;\n\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\n/*\t\tpEntry->LogSeq = 0xff;\t\t\t\tMove to Beamforming_AddBFerEntry*/\n/*\t\tpEntry->LogRetryCnt = 0;\t\t\tMove to Beamforming_AddBFerEntry*/\n/*\t\tpEntry->LogSuccessCnt = 0;\t\tMove to Beamforming_AddBFerEntry*/\n\n\t\tpEntry->LogStatusFailCnt = 0;\n\n\t\tpEntry->NumofSoundingDim = NumofSoundingDim;\n\t\tpEntry->CompSteeringNumofBFer = CompSteeringNumofBFer;\n\n\t\tif (BeamformCap & BEAMFORMER_CAP_VHT_MU) {\n\t\t\tpDM_Odm->BeamformingInfo.beamformee_mu_cnt += 1;\n\t\t\tpEntry->is_mu_sta = TRUE;\n\t\t\tpDM_Odm->BeamformingInfo.FirstMUBFeeIndex = phydm_Beamforming_GetFirstMUBFeeEntryIdx(pDM_Odm);\n\t\t} else if  (BeamformCap & BEAMFORMER_CAP_VHT_SU) {\n\t\t\tpDM_Odm->BeamformingInfo.beamformee_su_cnt += 1;\n\t\t\tpEntry->is_mu_sta = FALSE;\n\t\t}\n\n\t\treturn pEntry;\n\t}\n\telse\n\t\treturn NULL;\n}\n\n/*Add SU BFee and MU BFer*/\nPRT_BEAMFORMER_ENTRY\nBeamforming_AddBFerEntry(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tIN\tPRT_BEAMFORM_STAINFO\tpSTA,\n\tIN\tBEAMFORMING_CAP\tBeamformCap,\n\tIN\tu1Byte\t\t\t\tNumofSoundingDim,\n\tOUT\tpu1Byte\t\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMER_ENTRY\tpEntry = phydm_Beamforming_GetFreeBFerEntry(pDM_Odm, Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (pEntry != NULL) {\n\t\tpEntry->bUsed = TRUE;\n\t\tODM_MoveMemory(pDM_Odm, pEntry->MyMacAddr, pSTA->MyMacAddr, 6);\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_AP)) {\n\t\t\t/*BSSID[44:47] xor BSSID[40:43]*/\n\t\t\tu2Byte BSSID = ((pSTA->MyMacAddr[5] & 0xf0) >> 4) ^ (pSTA->MyMacAddr[5] & 0xf);\n\t\t\t\n\t\t\tpEntry->P_AID = (pSTA->AID + BSSID * 32) & 0x1ff;\n\t\t\tpEntry->G_ID = 63;\n\t\t\t/*(dec(A) + dec(B)*32) mod 512*/\n\t\t} else if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS)) {\n\t\t\tpEntry->P_AID = 0;\n\t\t\tpEntry->G_ID = 63;\n\t\t} else {\n\t\t\tpEntry->P_AID =  pSTA->RA[5];\n\t\t\t/*BSSID[39:47]*/\n\t\t\tpEntry->P_AID = (pEntry->P_AID << 1) | (pSTA->RA[4] >> 7);\n\t\t\tpEntry->G_ID = 0;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: P_AID addressed to AP=0x%X\\n\", __func__, pEntry->P_AID));\n\t\t}\n\t\t\n\t\tcpMacAddr(pEntry->MacAddr, pSTA->RA);\n\t\tpEntry->BeamformEntryCap = BeamformCap;\n\n\t\tpEntry->PreLogSeq = 0;\t/*Modified by Jeffery @2015-04-13*/\n\t\tpEntry->LogSeq = 0;\t\t/*Modified by Jeffery @2014-10-29*/\n\t\tpEntry->LogRetryCnt = 0;\t/*Modified by Jeffery @2014-10-29*/\n\t\tpEntry->LogSuccess = 0;\t/*LogSuccess is NOT needed to be accumulated, so  LogSuccessCnt->LogSuccess, 2015-04-13, Jeffery*/\n\t\tpEntry->ClockResetTimes = 0;\t/*Modified by Jeffery @2015-04-13*/\n\n\t\tpEntry->NumofSoundingDim = NumofSoundingDim;\n\n\t\tif (BeamformCap & BEAMFORMEE_CAP_VHT_MU) {\n\t\t\tpDM_Odm->BeamformingInfo.beamformer_mu_cnt += 1;\n\t\t\tpEntry->is_mu_ap = TRUE;\n\t\t\tpEntry->AID = pSTA->AID;\n\t\t} else if (BeamformCap & BEAMFORMEE_CAP_VHT_SU) {\n\t\t\tpDM_Odm->BeamformingInfo.beamformer_su_cnt += 1;\n\t\t\tpEntry->is_mu_ap = FALSE;\n\t\t}\n\n\t\treturn pEntry;\n\t}\n\telse\n\t\treturn NULL;\n}\n\n#if 0\nBOOLEAN\nBeamforming_RemoveEntry(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tpu1Byte\t\tRA,\n\tOUT\tpu1Byte\t\tIdx\n\t)\n{\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tPRT_BEAMFORMER_ENTRY\tpBFerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, RA, Idx);\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, Idx);\n\tBOOLEAN ret = FALSE;\n    \n\tRT_DISP(FBEAM, FBEAM_FUN, (\"[Beamforming]@%s Start!\\n\", __func__));\n\tRT_DISP(FBEAM, FBEAM_FUN, (\"[Beamforming]@%s, pBFerEntry=0x%x\\n\", __func__, pBFerEntry));\n\tRT_DISP(FBEAM, FBEAM_FUN, (\"[Beamforming]@%s, pEntry=0x%x\\n\", __func__, pEntry));\n\t\n\tif (pEntry != NULL) {\t\n\t\tpEntry->bUsed = FALSE;\n\t\tpEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\t/*pEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;*/\n\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\tret = TRUE;\n\t} \n\tif (pBFerEntry != NULL) {\n\t\tpBFerEntry->bUsed = FALSE;\n\t\tpBFerEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\tret = TRUE;\n\t}\n\treturn ret;\n\n}\n#endif\n\n/* Used for BeamformingStart_V1  */\nVOID\nphydm_Beamforming_NDPARate(\n\tIN\tPVOID\t\tpDM_VOID,\n\tCHANNEL_WIDTH \tBW, \n\tu1Byte\t\t\tRate\n)\n{\n\tu2Byte\t\t\tNDPARate = Rate;\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (NDPARate == 0) {\n\t\tif(pDM_Odm->RSSI_Min > 30) // link RSSI > 30%\n\t\t\tNDPARate = ODM_RATE24M;\n\t\telse\n\t\t\tNDPARate = ODM_RATE6M;\n\t}\n\n\tif (NDPARate < ODM_RATEMCS0)\n\t\tBW = (CHANNEL_WIDTH)ODM_BW20M;\n\n\tNDPARate = (NDPARate << 8) | BW;\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_RATE, (pu1Byte)&NDPARate);\n\n}\n\n\n/* Used for BeamformingStart_SW and  BeamformingStart_FW */\nVOID\nphydm_Beamforming_DymNDPARate(\n\tIN\tPVOID\t\tpDM_VOID\n)\n{\n\tu2Byte\t\t\tNDPARate = ODM_RATE6M, BW;\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (pDM_Odm->RSSI_Min > 30)\t/*link RSSI > 30%*/\n\t\tNDPARate = ODM_RATE24M;\n\telse\n\t\tNDPARate = ODM_RATE6M;\n\n\tBW = ODM_BW20M;\n\tNDPARate = NDPARate << 8 | BW;\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_RATE, (pu1Byte)&NDPARate);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s End, NDPA Rate = 0x%X\\n\", __func__, NDPARate));\n}\n\n/*\t\n*\tSW Sounding : SW Timer unit 1ms \n*\t\t\t\t HW Timer unit (1/32000) s  32k is clock. \n*\tFW Sounding : FW Timer unit 10ms\n*/\nVOID\nBeamforming_DymPeriod(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN  u8          status\n)\n{\n\tu1Byte \t\t\t\t\tIdx;\n\tBOOLEAN\t\t\t\t\tbChangePeriod = FALSE;\t\n\tu2Byte\t\t\t\t\tSoundPeriod_SW, SoundPeriod_FW;\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_SOUNDING_INFO\t\tpSoundInfo = &(pBeamInfo->SoundingInfo);\n\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\t\n\t//3 TODO  per-client throughput caculation.\n\n\tif ((*(pDM_Odm->pCurrentTxTP) + *(pDM_Odm->pCurrentRxTP) > 2) && ((pEntry->LogStatusFailCnt <= 20) || status)) {\n\t\tSoundPeriod_SW = 40;\t/* 40ms */\n\t\tSoundPeriod_FW = 40;\t/* From  H2C cmd, unit = 10ms */\n\t} else {\n\t\tSoundPeriod_SW = 4000;/* 4s */\n\t\tSoundPeriod_FW = 400;\n\t}\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]SoundPeriod_SW=%d, SoundPeriod_FW=%d\\n\",\t__func__, SoundPeriod_SW, SoundPeriod_FW));\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\tpBeamformEntry = pBeamInfo->BeamformeeEntry+Idx;\n\t\t\n\t\tif (pBeamformEntry->DefaultCSICnt > 20) {\n\t\t\t/*Modified by David*/\n\t\t\tSoundPeriod_SW = 4000;\n\t\t\tSoundPeriod_FW = 400;\n\t\t}\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Period = %d\\n\", __func__, SoundPeriod_SW));\t\t\n\t\tif (pBeamformEntry->BeamformEntryCap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) {\n\t\t\tif (pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER) {\t\t\t\t\n\t\t\t\tif (pBeamformEntry->SoundPeriod != SoundPeriod_FW) {\n\t\t\t\t\tpBeamformEntry->SoundPeriod = SoundPeriod_FW;\n\t\t\t\t\tbChangePeriod = TRUE;\t\t/*Only FW sounding need to send H2C packet to change sound period. */\n\t\t\t\t}\n\t\t\t} else if (pBeamformEntry->SoundPeriod != SoundPeriod_SW) {\n\t\t\t\tpBeamformEntry->SoundPeriod = SoundPeriod_SW;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (bChangePeriod)\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx);\n}\n\n\n\n\nBOOLEAN\nBeamforming_SendHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW,\n\tIN\tu1Byte\t\t\tQIdx\n\t)\n{\n\tBOOLEAN\t\tret = TRUE;\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (QIdx == BEACON_QUEUE)\n\t\tret = SendFWHTNDPAPacket(pDM_Odm, RA, BW);\n\telse\n\t\tret = SendSWHTNDPAPacket(pDM_Odm, RA, BW);\n\n\treturn ret;\n}\n\n\n\nBOOLEAN\nBeamforming_SendVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW,\n\tIN\tu1Byte\t\t\tQIdx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tBOOLEAN\t\tret = TRUE;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_GET_TX_RATE, NULL);\n\n\tif ((pDM_Odm->TxBfDataRate >= ODM_RATEVHTSS3MCS7) && (pDM_Odm->TxBfDataRate <= ODM_RATEVHTSS3MCS9)) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s: 3SS VHT 789 don't sounding\\n\", __func__));\n\n\t} else  {\n\t\tif (QIdx == BEACON_QUEUE) /* Send to reserved page => FW NDPA */\n\t\t\tret = SendFWVHTNDPAPacket(pDM_Odm, RA, AID, BW);\n\t\telse {\n#ifdef SUPPORT_MU_BF\n\t\t#if (SUPPORT_MU_BF == 1)\n\t\t\tpBeamInfo->is_mu_sounding = TRUE;\n\t\t\tret = SendSWVHTMUNDPAPacket(pDM_Odm, BW);\n\t\t#else\n\t\t\tpBeamInfo->is_mu_sounding = FALSE;\n\t\t\tret = SendSWVHTNDPAPacket(pDM_Odm, RA, AID, BW);\n\t\t#endif\n#else\n\t\t\tpBeamInfo->is_mu_sounding = FALSE;\n\t\t\tret = SendSWVHTNDPAPacket(pDM_Odm, RA, AID, BW);\n#endif\n\t\t}\n\t}\n\t\treturn ret;\n}\n\n\nBEAMFORMING_NOTIFY_STATE\nphydm_beamfomring_bSounding(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \tpBeamInfo,\n\tpu1Byte\t\t\t\t\tIdx\n\t)\n{\n\tBEAMFORMING_NOTIFY_STATE\tbSounding = BEAMFORMING_NOTIFY_NONE;\n\tRT_BEAMFORMING_OID_INFO\tBeamOidInfo = pBeamInfo->BeamformingOidInfo;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\t/*if(( Beamforming_GetBeamCap(pBeamInfo) & BEAMFORMER_CAP) == 0)*/\n\t/*bSounding = BEAMFORMING_NOTIFY_RESET;*/\n\tif (BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER)\n\t\tbSounding = BEAMFORMING_NOTIFY_RESET;\n\telse {\n\t\tu1Byte i;\n\n\t\tfor (i = 0 ; i < BEAMFORMEE_ENTRY_NUM ; i++) {\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s: BFee Entry %d bUsed=%d, bSound=%d\\n\", __func__, i, pBeamInfo->BeamformeeEntry[i].bUsed, pBeamInfo->BeamformeeEntry[i].bSound));\n\t\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed && (!pBeamInfo->BeamformeeEntry[i].bSound)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: Add BFee entry %d\\n\", __func__, i));\n\t\t\t\t*Idx = i;\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[i].is_mu_sta)\n\t\t\t\t\tbSounding = BEAMFORMEE_NOTIFY_ADD_MU;\n\t\t\t\telse\n\t\t\t\t\tbSounding = BEAMFORMEE_NOTIFY_ADD_SU;\n\t\t\t}\n\n\t\t\tif ((!pBeamInfo->BeamformeeEntry[i].bUsed) && pBeamInfo->BeamformeeEntry[i].bSound) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: Delete BFee entry %d\\n\", __func__, i));\n\t\t\t\t*Idx = i;\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[i].is_mu_sta)\n\t\t\t\t\tbSounding = BEAMFORMEE_NOTIFY_DELETE_MU;\n\t\t\t\telse\n\t\t\t\t\tbSounding = BEAMFORMEE_NOTIFY_DELETE_SU;\n\t\t\t}\n\t\t}\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s End, bSounding = %d\\n\", __func__, bSounding));\n\treturn bSounding;\n}\n\n\n//This function is unused\nu1Byte\nphydm_beamforming_SoundingIdx(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo\n\t)\n{\n\tu1Byte\t\t\t\t\tIdx = 0;\n\tRT_BEAMFORMEE_ENTRY\tBeamEntry;\n\tRT_BEAMFORMING_OID_INFO\tBeamOidInfo = pBeamInfo->BeamformingOidInfo;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (BeamOidInfo.SoundOidMode == SOUNDING_SW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_SW_VHT_TIMER ||\n\t\tBeamOidInfo.SoundOidMode == SOUNDING_HW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_VHT_TIMER)\n\t\tIdx = BeamOidInfo.SoundOidIdx;\n\telse {\n\t\tu1Byte\ti;\n\t\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\t\tif (pBeamInfo->BeamformeeEntry[i].bUsed && (FALSE == pBeamInfo->BeamformeeEntry[i].bSound)) {\n\t\t\t\tIdx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Idx;\n}\n\n\nSOUNDING_MODE\nphydm_beamforming_SoundingMode(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \tpBeamInfo,\n\tu1Byte\t\t\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte \t\t\tSupportInterface = pDM_Odm->SupportInterface;\n\n\tRT_BEAMFORMEE_ENTRY\t\tBeamEntry = pBeamInfo->BeamformeeEntry[Idx];\n\tRT_BEAMFORMING_OID_INFO\tBeamOidInfo = pBeamInfo->BeamformingOidInfo;\n\tSOUNDING_MODE\t\t\t\tMode = BeamOidInfo.SoundOidMode;\n\n\tif (BeamOidInfo.SoundOidMode == SOUNDING_SW_VHT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_VHT_TIMER) {\n\t\tif (BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tMode = BeamOidInfo.SoundOidMode;\n\t\telse \n\t\t\tMode = SOUNDING_STOP_All_TIMER;\n\t} else if (BeamOidInfo.SoundOidMode == SOUNDING_SW_HT_TIMER || BeamOidInfo.SoundOidMode == SOUNDING_HW_HT_TIMER) {\n\t\tif (BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)\n\t\t\tMode = BeamOidInfo.SoundOidMode;\n\t\telse\n\t\t\tMode = SOUNDING_STOP_All_TIMER;\n\t} else if (BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_VHT_SU) {\n\t\tif ((SupportInterface == ODM_ITRF_USB) && !(pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B)))\n\t\t\tMode = SOUNDING_FW_VHT_TIMER;\n\t\telse\n\t\t\tMode = SOUNDING_SW_VHT_TIMER;\n\t} else if (BeamEntry.BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT) {\n\t\tif ((SupportInterface == ODM_ITRF_USB) && !(pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B)))\n\t\t\tMode = SOUNDING_FW_HT_TIMER;\n\t\telse\n\t\t\tMode = SOUNDING_SW_HT_TIMER;\n\t} else \n\t\tMode = SOUNDING_STOP_All_TIMER;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] SupportInterface=%d, Mode=%d\\n\", __func__, SupportInterface, Mode));\n\n\treturn Mode;\n}\n\n\nu2Byte\nphydm_beamforming_SoundingTime(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \tpBeamInfo,\n\tSOUNDING_MODE\t\t\tMode,\n\tu1Byte\t\t\t\t\tIdx\n\t)\n{\n\tu2Byte\t\t\t\t\t\tSoundingTime = 0xffff;\n\tRT_BEAMFORMEE_ENTRY\t\tBeamEntry = pBeamInfo->BeamformeeEntry[Idx];\n\tRT_BEAMFORMING_OID_INFO\tBeamOidInfo = pBeamInfo->BeamformingOidInfo;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_HW_VHT_TIMER)\n\t\tSoundingTime = BeamOidInfo.SoundOidPeriod * 32;\n\telse if (Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_SW_VHT_TIMER)\n\t\t/*Modified by David*/\n\t\tSoundingTime = BeamEntry.SoundPeriod;\t/*BeamOidInfo.SoundOidPeriod;*/\n\telse\n\t\tSoundingTime = BeamEntry.SoundPeriod;\n\n\treturn SoundingTime;\n}\n\n\nCHANNEL_WIDTH\nphydm_beamforming_SoundingBW(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \tpBeamInfo,\n\tSOUNDING_MODE\t\t\tMode,\n\tu1Byte\t\t\t\t\tIdx\n\t)\n{\n\tCHANNEL_WIDTH\t\t\t\tSoundingBW = CHANNEL_WIDTH_20;\n\tRT_BEAMFORMEE_ENTRY\t\tBeamEntry = pBeamInfo->BeamformeeEntry[Idx];\n\tRT_BEAMFORMING_OID_INFO\tBeamOidInfo = pBeamInfo->BeamformingOidInfo;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_HW_VHT_TIMER)\n\t\tSoundingBW = BeamOidInfo.SoundOidBW;\n\telse if (Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_SW_VHT_TIMER)\n\t\t/*Modified by David*/\n\t\tSoundingBW = BeamEntry.SoundBW;\t\t/*BeamOidInfo.SoundOidBW;*/\n\telse \n\t\tSoundingBW = BeamEntry.SoundBW;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s, SoundingBW=0x%X\\n\", __func__, SoundingBW));\n\n\treturn SoundingBW;\n}\n\n\nBOOLEAN\nphydm_Beamforming_SelectBeamEntry(\n\tIN\tPVOID\t\t\t\tpDM_VOID,\n\tPRT_BEAMFORMING_INFO \tpBeamInfo\n\t)\n{\n\tPRT_SOUNDING_INFO\t\tpSoundInfo = &(pBeamInfo->SoundingInfo);\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t/*pEntry.bSound is different between first and latter NDPA, and should not be used as BFee entry selection*/\n\t/*BTW, latter modification should sync to the selection mechanism of AP/ADSL instead of the fixed SoundIdx.*/\n\tpSoundInfo->SoundIdx = phydm_beamforming_SoundingIdx(pDM_Odm, pBeamInfo);\n\t/*pSoundInfo->SoundIdx = 0;*/\n\n\tif (pSoundInfo->SoundIdx < BEAMFORMEE_ENTRY_NUM)\n\t\tpSoundInfo->SoundMode = phydm_beamforming_SoundingMode(pDM_Odm, pBeamInfo, pSoundInfo->SoundIdx);\n\telse\n\t\tpSoundInfo->SoundMode = SOUNDING_STOP_All_TIMER;\n\t\n\tif (SOUNDING_STOP_All_TIMER == pSoundInfo->SoundMode) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Return because of SOUNDING_STOP_All_TIMER\\n\", __func__));\n\t\treturn FALSE;\n\t} else {\n\t\tpSoundInfo->SoundBW = phydm_beamforming_SoundingBW(pDM_Odm, pBeamInfo, pSoundInfo->SoundMode, pSoundInfo->SoundIdx );\n\t\tpSoundInfo->SoundPeriod = phydm_beamforming_SoundingTime(pDM_Odm, pBeamInfo, pSoundInfo->SoundMode, pSoundInfo->SoundIdx );\n\t\treturn TRUE;\n\t}\n}\n\n/*SU BFee Entry Only*/\nBOOLEAN\nphydm_beamforming_StartPeriod(\n\tIN\tPVOID\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tBOOLEAN\t\t\t\t\t\tRet = TRUE;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_SOUNDING_INFO\t\t\tpSoundInfo = &(pBeamInfo->SoundingInfo); \n\t\n\tphydm_Beamforming_DymNDPARate(pDM_Odm);\n\n\tphydm_Beamforming_SelectBeamEntry(pDM_Odm, pBeamInfo);\t\t// Modified\n\n\tif (pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER)\n\t\tODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, pSoundInfo->SoundPeriod);\n\telse if (pSoundInfo->SoundMode == SOUNDING_HW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_HW_HT_TIMER ||\n\t\t\tpSoundInfo->SoundMode == SOUNDING_AUTO_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_AUTO_HT_TIMER) {\n\t\tHAL_HW_TIMER_TYPE TimerType = HAL_TIMER_TXBF;\n\t\tu4Byte\tval = (pSoundInfo->SoundPeriod | (TimerType<<16));\n\n\t\t//HW timer stop: All IC has the same setting\n\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_STOP,  (pu1Byte)(&TimerType));\n\t\t//ODM_Write1Byte(pDM_Odm, 0x15F, 0);\n\t\t//HW timer init: All IC has the same setting, but 92E & 8812A only write 2 bytes\n\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_INIT,  (pu1Byte)(&val));\n\t\t//ODM_Write1Byte(pDM_Odm, 0x164, 1);\n\t\t//ODM_Write4Byte(pDM_Odm, 0x15C, val);\n\t\t//HW timer start: All IC has the same setting\n\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_START,  (pu1Byte)(&TimerType));\n\t\t//ODM_Write1Byte(pDM_Odm, 0x15F, 0x5);\n\t} else if (pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER)\n\t\tRet = BeamformingStart_FW(pDM_Odm, pSoundInfo->SoundIdx);\n\telse\n\t\tRet = FALSE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] SoundIdx=%d, SoundMode=%d, SoundBW=%d, SoundPeriod=%d\\n\", __func__, \n\t\t\tpSoundInfo->SoundIdx, pSoundInfo->SoundMode, pSoundInfo->SoundBW, pSoundInfo->SoundPeriod));\n\n\treturn Ret;\n}\n\n// Used after Beamforming_Leave, and will clear the setting of the \"already deleted\" entry\n/*SU BFee Entry Only*/\nVOID\nphydm_beamforming_EndPeriod_SW(\n\tIN\tPVOID\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tu1Byte\t\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\t\tpBeamformEntry;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_SOUNDING_INFO\t\t\tpSoundInfo = &(pBeamInfo->SoundingInfo);\n\t\n\tHAL_HW_TIMER_TYPE TimerType = HAL_TIMER_TXBF;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER)\n\t\tODM_CancelTimer(pDM_Odm, &pBeamInfo->BeamformingTimer);\n\telse if (pSoundInfo->SoundMode == SOUNDING_HW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_HW_HT_TIMER ||\n\t\t\t\tpSoundInfo->SoundMode == SOUNDING_AUTO_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_AUTO_HT_TIMER)\n\t\t/*HW timer stop: All IC has the same setting*/\n\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_STOP,  (pu1Byte)(&TimerType));\n\t\t/*ODM_Write1Byte(pDM_Odm, 0x15F, 0);*/\n}\n\nVOID\nphydm_beamforming_EndPeriod_FW(\n\tIN\tPVOID\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\tIdx = 0;\n\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]\\n\", __func__));\n}\n\n\n/*SU BFee Entry Only*/\nVOID \nphydm_beamforming_ClearEntry_SW(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tBOOLEAN\t\t\t\tIsDelete,\n\tu1Byte\t\t\t\tDeleteIdx\n\t)\n{\n\tu1Byte\t\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\t\tpBeamformEntry = NULL;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tif (IsDelete) {\n\t\tif (DeleteIdx < BEAMFORMEE_ENTRY_NUM) {\n\t\t\tpBeamformEntry = pBeamInfo->BeamformeeEntry + DeleteIdx;\n\t\t\tif (!((!pBeamformEntry->bUsed) && pBeamformEntry->bSound)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] SW DeleteIdx is wrong!!!!!\\n\", __func__));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] SW delete BFee entry %d\\n\", __func__, DeleteIdx));\n\t\tif (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING) {\n\t\t\tpBeamformEntry->bBeamformingInProgress = FALSE;\n\t\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\t\t} else if (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tpBeamformEntry->BeamformEntryState  = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\t\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&DeleteIdx);\n\t\t}\n\t\tpBeamformEntry->bSound = FALSE;\n\t} else {\n\t\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\t\tpBeamformEntry = pBeamInfo->BeamformeeEntry+Idx;\n\n\t\t\t/*Used after bSounding=RESET, and will clear the setting of \"ever sounded\" entry, which is not necessarily be deleted.*/\n\t\t\t/*This function is mainly used in case \"BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER\".*/\n\t\t\t/*However, setting oid doesn't delete entries (bUsed is still TRUE), new entries may fail to be added in.*/\n\t\t\n\t\t\tif (pBeamformEntry->bSound) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] SW reset BFee entry %d\\n\", __func__, Idx));\n\t\t\t\t/*\t\n\t\t\t\t*\tIf End procedure is \n\t\t\t\t*\t1. Between (Send NDPA, C2H packet return), reset state to initialized.\n\t\t\t\t*\tAfter C2H packet return , status bit will be set to zero. \n\t\t\t\t*\n\t\t\t\t*\t2. After C2H packet, then reset state to initialized and clear status bit.\n\t\t\t\t*/\n\n\t\t\t\tif (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\t\t\t\tphydm_Beamforming_End_SW(pDM_Odm, 0);\n\t\t\t\telse if (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\t\t\tpBeamformEntry->BeamformEntryState  = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\t\t\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx);\n\t\t\t\t}\n\n\t\t\t\tpBeamformEntry->bSound = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\nVOID\nphydm_beamforming_ClearEntry_FW(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tBOOLEAN\t\t\t\tIsDelete,\n\tu1Byte\t\t\t\tDeleteIdx\n\t)\n{\n\tu1Byte\t\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\t\tpBeamformEntry = NULL;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tif (IsDelete) {\n\t\tif (DeleteIdx < BEAMFORMEE_ENTRY_NUM) {\n\t\t\tpBeamformEntry = pBeamInfo->BeamformeeEntry + DeleteIdx;\n\n\t\t\tif (!((!pBeamformEntry->bUsed) && pBeamformEntry->bSound)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] FW DeleteIdx is wrong!!!!!\\n\", __func__));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: FW delete BFee entry %d\\n\", __func__, DeleteIdx));\n\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;\n\t\tpBeamformEntry->bSound = FALSE;\n\t} else {\n\t\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\t\tpBeamformEntry = pBeamInfo->BeamformeeEntry+Idx;\n\n\t\t\t/*Used after bSounding=RESET, and will clear the setting of \"ever sounded\" entry, which is not necessarily be deleted.*/\n\t\t\t/*This function is mainly used in case \"BeamOidInfo.SoundOidMode == SOUNDING_STOP_All_TIMER\".*/\n\t\t\t/*However, setting oid doesn't delete entries (bUsed is still TRUE), new entries may fail to be added in.*/\n\t\t\n\t\t\tif (pBeamformEntry->bSound) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]FW reset BFee entry %d\\n\", __func__, Idx));\n\t\t\t\t/*\t\n\t\t\t\t*\tIf End procedure is \n\t\t\t\t*\t1. Between (Send NDPA, C2H packet return), reset state to initialized.\n\t\t\t\t*\tAfter C2H packet return , status bit will be set to zero. \n\t\t\t\t*\n\t\t\t\t*\t2. After C2H packet, then reset state to initialized and clear status bit.\n\t\t\t\t*/\n\t\t\t\t\n\t\t\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\t\t\tpBeamformEntry->bSound = FALSE;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n* \tCalled : \n*\t1. Add and delete entry : Beamforming_Enter/Beamforming_Leave\n*\t2. FW trigger :  Beamforming_SetTxBFen\n*\t3. Set OID_RT_BEAMFORMING_PERIOD : BeamformingControl_V2\n*/\nVOID\nphydm_Beamforming_Notify(\n\tIN\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tu1Byte\t\t\t\t\t\tIdx=BEAMFORMEE_ENTRY_NUM;\n\tBEAMFORMING_NOTIFY_STATE\tbSounding = BEAMFORMING_NOTIFY_NONE;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_SOUNDING_INFO\t\t\tpSoundInfo = &(pBeamInfo->SoundingInfo);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tbSounding = phydm_beamfomring_bSounding(pDM_Odm, pBeamInfo, &Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s, Before notify, bSounding=%d, Idx=%d\\n\", __func__, bSounding, Idx));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: pBeamInfo->beamformee_su_cnt = %d\\n\", __func__, pBeamInfo->beamformee_su_cnt));\n\t\n\n\tswitch (bSounding) {\n\tcase BEAMFORMEE_NOTIFY_ADD_SU:\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BEAMFORMEE_NOTIFY_ADD_SU\\n\", __func__));\n\t\tphydm_beamforming_StartPeriod(pDM_Odm);\n\tbreak;\n\n\tcase BEAMFORMEE_NOTIFY_DELETE_SU:\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BEAMFORMEE_NOTIFY_DELETE_SU\\n\", __func__));\n\t\tif (pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) {\n\t\t\tphydm_beamforming_ClearEntry_FW(pDM_Odm, TRUE, Idx);\n\t\t\tif (pBeamInfo->beamformee_su_cnt == 0) { /* For 2->1 entry, we should not cancel SW timer */\n\t\t\t\tphydm_beamforming_EndPeriod_FW(pDM_Odm);\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: No BFee left\\n\", __func__));\n\t\t\t}\n\t\t} else {\n\t\t\tphydm_beamforming_ClearEntry_SW(pDM_Odm, TRUE, Idx);\n\t\t\tif (pBeamInfo->beamformee_su_cnt == 0) { /* For 2->1 entry, we should not cancel SW timer */\n\t\t\t\tphydm_beamforming_EndPeriod_SW(pDM_Odm);\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: No BFee left\\n\", __func__));\n\t\t\t}\n\t\t}\n\tbreak;\n\n\tcase BEAMFORMEE_NOTIFY_ADD_MU:\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BEAMFORMEE_NOTIFY_ADD_MU\\n\", __func__));\n\t\tif (pBeamInfo->beamformee_mu_cnt == 2) {\n\t\t\t/*if (pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER)\n\t\t\t\tODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, pSoundInfo->SoundPeriod);*/\n\t\t\tODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, 1000); /*Do MU sounding every 1sec*/\n\t\t} else\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: Less or larger than 2 MU STAs, not to set timer\\n\", __func__));\n\tbreak;\n\n\tcase BEAMFORMEE_NOTIFY_DELETE_MU:\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: BEAMFORMEE_NOTIFY_DELETE_MU\\n\", __func__));\n\t\tif (pBeamInfo->beamformee_mu_cnt == 1) {\n\t\t\t/*if (pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER)*/{\n\t\t\t\tODM_CancelTimer(pDM_Odm, &pBeamInfo->BeamformingTimer);\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: Less than 2 MU STAs, stop sounding\\n\", __func__));\n\t\t\t}\n\t\t}\n\tbreak;\n\n\tcase BEAMFORMING_NOTIFY_RESET:\n\t\tif (pSoundInfo->SoundMode == SOUNDING_FW_HT_TIMER || pSoundInfo->SoundMode == SOUNDING_FW_VHT_TIMER) {\t\n\t\t\tphydm_beamforming_ClearEntry_FW(pDM_Odm, FALSE, Idx);\n\t\t\tphydm_beamforming_EndPeriod_FW(pDM_Odm);\n\t\t} else {\n\t\t\tphydm_beamforming_ClearEntry_SW(pDM_Odm, FALSE, Idx);\n\t\t\tphydm_beamforming_EndPeriod_SW(pDM_Odm);\n\t\t}\n\n\tbreak;\n\n\tdefault:\n\tbreak;\n\t}\n\n}\n\n\n\nBOOLEAN\nBeamforming_InitEntry(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu2Byte\t\tstaIdx,\n\tpu1Byte\t\t\tBFerBFeeIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMEE_ENTRY\t\tpBeamformEntry = NULL;\n\tPRT_BEAMFORMER_ENTRY\t\tpBeamformerEntry = NULL;\n\tPRT_BEAMFORM_STAINFO\t\tpSTA = NULL;\n\tBEAMFORMING_CAP\t\t\tBeamformCap = BEAMFORMING_CAP_NONE;\n\tu1Byte\t\t\t\t\t\tBFerIdx=0xF, BFeeIdx=0xF;\n\tu1Byte\t\t\t\t\t\tNumofSoundingDim = 0, CompSteeringNumofBFer = 0;\n\n\tpSTA = phydm_staInfoInit(pDM_Odm, staIdx);\n\n\t/*The current setting does not support Beaforming*/\n\tif (BEAMFORMING_CAP_NONE == pSTA->HtBeamformCap && BEAMFORMING_CAP_NONE == pSTA->VhtBeamformCap) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"The configuration disabled Beamforming! Skip...\\n\"));\t\t\n\t\treturn FALSE;\n\t}\n\n\tif (pSTA->WirelessMode < WIRELESS_MODE_N_24G)\n\t\treturn FALSE;\n\telse {\t/*HT*/\n\t\t/*We are Beamformee because the STA is Beamformer*/\n\t\tif (TEST_FLAG(pSTA->CurBeamform, BEAMFORMING_HT_BEAMFORMER_ENABLE)) {\n\t\t\tBeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMEE_CAP_HT_EXPLICIT);\n\t\t\tNumofSoundingDim = (pSTA->CurBeamform&BEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP)>>6;\n\t\t}\n\t\t/*We are Beamformer because the STA is Beamformee*/\n\t\tif (TEST_FLAG(pSTA->CurBeamform, BEAMFORMING_HT_BEAMFORMEE_ENABLE) ||\n\t\t\tTEST_FLAG(pSTA->HtBeamformCap, BEAMFORMING_HT_BEAMFORMER_TEST)) {\n\t\t\tBeamformCap =(BEAMFORMING_CAP)(BeamformCap | BEAMFORMER_CAP_HT_EXPLICIT);\n\t\t\tCompSteeringNumofBFer = (pSTA->CurBeamform & BEAMFORMING_HT_BEAMFORMER_STEER_NUM)>>4;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] HT CurBeamform=0x%X, BeamformCap=0x%X\\n\", __func__, pSTA->CurBeamform, BeamformCap));\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] HT NumofSoundingDim=%d, CompSteeringNumofBFer=%d\\n\", __func__, NumofSoundingDim, CompSteeringNumofBFer));\n#if\t(ODM_IC_11AC_SERIES_SUPPORT == 1)\n\t\tif (pSTA->WirelessMode & WIRELESS_MODE_AC_5G || pSTA->WirelessMode & WIRELESS_MODE_AC_24G) {\t/*VHT*/\t\n\n\t\t\t/* We are Beamformee because the STA is SU Beamformer*/\n\t\t\tif (TEST_FLAG(pSTA->CurBeamformVHT, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) {\n\t\t\t\tBeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMEE_CAP_VHT_SU);\n\t\t\t\tNumofSoundingDim = (pSTA->CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM)>>12;\n\t\t\t}\n\t\t\t/* We are Beamformer because the STA is SU Beamformee*/\n\t\t\tif (TEST_FLAG(pSTA->CurBeamformVHT, BEAMFORMING_VHT_BEAMFORMEE_ENABLE) ||\n\t\t\t\tTEST_FLAG(pSTA->VhtBeamformCap, BEAMFORMING_VHT_BEAMFORMER_TEST)) {\n\t\t\t\tBeamformCap =(BEAMFORMING_CAP)(BeamformCap |BEAMFORMER_CAP_VHT_SU);\n\t\t\t\tCompSteeringNumofBFer = (pSTA->CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMER_STS_CAP)>>8;\n\t\t\t}\n\t\t\t/* We are Beamformee because the STA is MU Beamformer*/\n\t\t\tif (TEST_FLAG(pSTA->CurBeamformVHT, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) {\n\t\t\t\tBeamformCap = (BEAMFORMING_CAP)(BeamformCap | BEAMFORMEE_CAP_VHT_MU);\n\t\t\t\tNumofSoundingDim = (pSTA->CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM)>>12;\n\t\t\t}\n\t\t\t/* We are Beamformer because the STA is MU Beamformee*/\n\t\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_AP)) { /* Only AP mode supports to act an MU beamformer */\n\t\t\t\tif (TEST_FLAG(pSTA->CurBeamformVHT, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE) ||\n\t\t\t\t\tTEST_FLAG(pSTA->VhtBeamformCap, BEAMFORMING_VHT_BEAMFORMER_TEST)) {\n\t\t\t\t\tBeamformCap = (BEAMFORMING_CAP)(BeamformCap | BEAMFORMER_CAP_VHT_MU);\n\t\t\t\t\tCompSteeringNumofBFer = (pSTA->CurBeamformVHT & BEAMFORMING_VHT_BEAMFORMER_STS_CAP)>>8;\n\t\t\t\t}\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]VHT CurBeamformVHT=0x%X, BeamformCap=0x%X\\n\", __func__, pSTA->CurBeamformVHT, BeamformCap));\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]VHT NumofSoundingDim=0x%X, CompSteeringNumofBFer=0x%X\\n\", __func__, NumofSoundingDim, CompSteeringNumofBFer));\n\t\t\t\n\t\t}\n#endif\n\t}\n\n\n\tif(BeamformCap == BEAMFORMING_CAP_NONE)\n\t\treturn FALSE;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Self BF Entry Cap = 0x%02X\\n\", __func__, BeamformCap));\n\n\t/*We are BFee, so the entry is BFer*/\n\tif (BeamformCap & (BEAMFORMEE_CAP_VHT_MU | BEAMFORMEE_CAP_VHT_SU | BEAMFORMEE_CAP_HT_EXPLICIT)) {\n\t\tpBeamformerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, pSTA->RA, &BFerIdx);\n\t\t\n\t\tif (pBeamformerEntry == NULL) {\n\t\t\tpBeamformerEntry = Beamforming_AddBFerEntry(pDM_Odm, pSTA, BeamformCap, NumofSoundingDim , &BFerIdx);\n\t\t\tif (pBeamformerEntry == NULL)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]Not enough BFer entry!!!!!\\n\", __func__));\n\t\t}\n\t}\n\n\t/*We are BFer, so the entry is BFee*/\n\tif (BeamformCap & (BEAMFORMER_CAP_VHT_MU | BEAMFORMER_CAP_VHT_SU | BEAMFORMER_CAP_HT_EXPLICIT)) {\n\t\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, pSTA->RA, &BFeeIdx);\n\n\t\t/*pGBFeeIdx = 0xF hNثeentrySۦPMACIDb*/\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Get BFee entry 0x%X by address\\n\", __func__, BFeeIdx));\n\t\tif (pBeamformEntry == NULL) {\n\t\t\tpBeamformEntry = Beamforming_AddBFeeEntry(pDM_Odm, pSTA, BeamformCap, NumofSoundingDim, CompSteeringNumofBFer, &BFeeIdx);\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]: pSTA->AID=%d, pSTA->MacID=%d\\n\", __func__, pSTA->AID, pSTA->MacID));\n\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]: Add BFee entry %d\\n\", __func__, BFeeIdx));\n\n\t\t\tif (pBeamformEntry == NULL)\n\t\t\t\treturn FALSE;\n\t\t\telse\n\t\t\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZEING;\n\t\t} else {\n\t\t\t/*Entry has been created. If entry is initialing or progressing then errors occur.*/\n\t\t\tif (pBeamformEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && \n\t\t\t\tpBeamformEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\t\treturn FALSE;\n\t\t\t} else\n\t\t\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZEING;\n\t\t}\n\t\tpBeamformEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\tphydm_staInfoUpdate(pDM_Odm, staIdx, pBeamformEntry);\n\t}\n\n\t*BFerBFeeIdx = (BFerIdx<<4) | BFeeIdx;\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] End: BFerIdx=0x%X, BFeeIdx=0x%X, BFerBFeeIdx=0x%X\\n\", __func__, BFerIdx, BFeeIdx, *BFerBFeeIdx));\n\n\treturn TRUE;\n}\n\n\nVOID\nBeamforming_DeInitEntry(\n\tIN\tPVOID\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA\n\t)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\tIdx = 0;\n\n\tPRT_BEAMFORMER_ENTRY\tpBFerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, RA, &Idx);\n\tPRT_BEAMFORMEE_ENTRY\tpBFeeEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\tBOOLEAN ret = FALSE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\",  __func__));\n\t\n\tif (pBFeeEntry != NULL) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s, pBFeeEntry\\n\", __func__));\n\t\tpBFeeEntry->bUsed = FALSE;\n\t\tpBFeeEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\tpBFeeEntry->bBeamformingInProgress = FALSE;\n\t\tif (pBFeeEntry->is_mu_sta) {\n\t\t\tpDM_Odm->BeamformingInfo.beamformee_mu_cnt -= 1;\n\t\t\tpDM_Odm->BeamformingInfo.FirstMUBFeeIndex = phydm_Beamforming_GetFirstMUBFeeEntryIdx(pDM_Odm);\n\t\t} else {\n\t\t\tpDM_Odm->BeamformingInfo.beamformee_su_cnt -= 1;\n\t\t}\n\t\tret = TRUE;\n\t} \n\t\n\tif (pBFerEntry != NULL) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s, pBFerEntry\\n\", __func__));\n\t\tpBFerEntry->bUsed = FALSE;\n\t\tpBFerEntry->BeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\tif (pBFerEntry->is_mu_ap)\n\t\t\tpDM_Odm->BeamformingInfo.beamformer_mu_cnt -= 1;\n\t\telse\n\t\t\tpDM_Odm->BeamformingInfo.beamformer_su_cnt -= 1;\n\t\tret = TRUE;\n\t}\n\n\tif (ret == TRUE)\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_LEAVE, (pu1Byte)&Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s End, Idx = 0x%X\\n\", __func__, Idx));\n}\n\n\nVOID\nBeamforming_Reset(\n\tIN\tPVOID\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &(pDM_Odm->BeamformingInfo);\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\tif (pBeamformingInfo->BeamformeeEntry[Idx].bUsed == TRUE) {\n\t\t\tpBeamformingInfo->BeamformeeEntry[Idx].bUsed = FALSE;\n\t\t\tpBeamformingInfo->BeamformeeEntry[Idx].BeamformEntryCap = BEAMFORMING_CAP_NONE;\n\t\t\t/*pBeamformingInfo->BeamformeeEntry[Idx].BeamformEntryState = BEAMFORMING_ENTRY_STATE_UNINITIALIZE;*/\n\t\t\t/*Modified by David*/\n\t\t\tpBeamformingInfo->BeamformeeEntry[Idx].bBeamformingInProgress = FALSE;\n\t\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_LEAVE, (pu1Byte)&Idx);\n\t\t}\n\t}\n\n\tfor (Idx = 0; Idx < BEAMFORMER_ENTRY_NUM; Idx++) {\n\t\tpBeamformingInfo->BeamformerEntry[Idx].bUsed = FALSE;\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Idx=%d, bUsed=%d\\n\", __func__, Idx, pBeamformingInfo->BeamformerEntry[Idx].bUsed));\n\t}\n\n}\n\n\nBOOLEAN\nBeamformingStart_V1(\n\tIN\tPVOID\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA,\n\tBOOLEAN\t\t\tMode,\n\tCHANNEL_WIDTH\tBW,\n\tu1Byte\t\t\tRate\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\t\n\tpEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tif (pEntry->bUsed == FALSE) {\n\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\treturn FALSE;\n\t} else {\n\t\tif (pEntry->bBeamformingInProgress)\n\t\t\treturn FALSE;\n\n\t\tpEntry->bBeamformingInProgress = TRUE;\n\n\t\tif (Mode == 1) {\t\n\t\t\tif (!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)) {\n\t\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t} else if (Mode == 0) {\n\t\t\tif (!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)) {\n\t\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\tif (pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\treturn FALSE;\n\t\t} else {\n\t\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING;\n\t\t\tpEntry->bSound = TRUE;\n\t\t}\n\t}\n\n\tpEntry->SoundBW = BW;\n\tpBeamInfo->BeamformeeCurIdx = Idx;\n\tphydm_Beamforming_NDPARate(pDM_Odm, BW, Rate);\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx);\n\n\tif (Mode == 1)\n\t\tret = Beamforming_SendHTNDPAPacket(pDM_Odm, RA, BW, NORMAL_QUEUE);\t\n\telse\n\t\tret = Beamforming_SendVHTNDPAPacket(pDM_Odm, RA, pEntry->AID, BW, NORMAL_QUEUE);\n\n\tif (ret == FALSE) {\n\t\tBeamforming_Leave(pDM_Odm, RA);\n\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\treturn FALSE;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s  Idx %d\\n\", __func__, Idx));\n\treturn TRUE;\n}\n\n\nBOOLEAN\nBeamformingStart_SW(\n\tIN\tPVOID\t\tpDM_VOID,\n\tu1Byte\t\t\tIdx,\n\tu1Byte\t\t\tMode, \n\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tpu1Byte\t\t\t\t\tRA = NULL;\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\n\tpEntry = &(pBeamInfo->BeamformeeEntry[Idx]);\n\n\tif (pEntry->bUsed == FALSE) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Skip Beamforming, no entry for Idx =%d\\n\", Idx));\n\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\treturn FALSE;\n\t} else {\n\t\tif (pEntry->bBeamformingInProgress) {\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"bBeamformingInProgress, skip...\\n\"));\n\t\t\treturn FALSE;\n\t\t}\n\n\t\tpEntry->bBeamformingInProgress = TRUE;\n\t\tRA = pEntry->MacAddr;\n\t\t\n\t\tif (Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_AUTO_HT_TIMER) {\t\n\t\t\tif (!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)) {\n\t\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Return by not support BEAMFORMER_CAP_HT_EXPLICIT <==\\n\", __func__));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t} else if (Mode == SOUNDING_SW_VHT_TIMER || Mode == SOUNDING_HW_VHT_TIMER || Mode == SOUNDING_AUTO_VHT_TIMER) {\n\t\t\tif (!(pEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)) {\n\t\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Return by not support BEAMFORMER_CAP_VHT_SU <==\\n\", __func__));\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\tif (pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_INITIALIZED && pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Return by incorrect BeamformEntryState(%d) <==\\n\", __func__, pEntry->BeamformEntryState));\n\t\t\treturn FALSE;\n\t\t} else {\n\t\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING;\n\t\t\tpEntry->bSound = TRUE;\n\t\t}\n\t}\n\n\tpBeamInfo->BeamformeeCurIdx = Idx;\n\t/*2014.12.22 Luke: Need to be checked*/\n\t/*GET_TXBF_INFO(Adapter)->fTxbfSet(Adapter, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&Idx);*/\n\n\tif (Mode == SOUNDING_SW_HT_TIMER || Mode == SOUNDING_HW_HT_TIMER || Mode == SOUNDING_AUTO_HT_TIMER)\n\t\tret = Beamforming_SendHTNDPAPacket(pDM_Odm, RA , BW, NORMAL_QUEUE);\t\n\telse\n\t\tret = Beamforming_SendVHTNDPAPacket(pDM_Odm, RA , pEntry->AID, BW, NORMAL_QUEUE);\n\n\tif (ret == FALSE) {\n\t\tBeamforming_Leave(pDM_Odm, RA);\n\t\tpEntry->bBeamformingInProgress = FALSE;\n\t\treturn FALSE;\n\t}\n\n\t\n\t/*--------------------------\n\t// Send BF Report Poll for MU BF\n\t--------------------------*/\n#ifdef SUPPORT_MU_BF\n#if (SUPPORT_MU_BF == 1)\n{\n\tu1Byte\t\t\t\tidx, PollSTACnt = 0;\n\tBOOLEAN\t\t\t\tbGetFirstBFee = FALSE;\n\t\n\tif (pBeamInfo->beamformee_mu_cnt > 1) { /* More than 1 MU STA*/\n\t\n\t\tfor (idx = 0; idx < BEAMFORMEE_ENTRY_NUM; idx++) {\n\t\t\tpEntry = &(pBeamInfo->BeamformeeEntry[idx]);\n\t\t\tif (pEntry->is_mu_sta) {\n\t\t\t\tif (bGetFirstBFee) {\n\t\t\t\t\tPollSTACnt++;\n\t\t\t\t\tif (PollSTACnt == (pBeamInfo->beamformee_mu_cnt - 1))/* The last STA*/\n\t\t\t\t\t\tSendSWVHTBFReportPoll(pDM_Odm, pEntry->MacAddr, TRUE);\n\t\t\t\t\telse\n\t\t\t\t\t\tSendSWVHTBFReportPoll(pDM_Odm, pEntry->MacAddr, FALSE);\n\t\t\t\t} else {\n\t\t\t\t\tbGetFirstBFee = TRUE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n#endif\n#endif\n\treturn TRUE;\n}\n\n\nBOOLEAN\nBeamformingStart_FW(\n\tIN PVOID\t\tpDM_VOID,\n\tu1Byte\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpu1Byte\t\t\t\t\tRA = NULL;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\n\tpEntry = &(pBeamInfo->BeamformeeEntry[Idx]);\n\tif (pEntry->bUsed == FALSE) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Skip Beamforming, no entry for Idx =%d\\n\", Idx));\n\t\treturn FALSE;\n\t}\n\n\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSING;\n\tpEntry->bSound = TRUE;\n\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_FW_NDPA, (pu1Byte)&Idx);\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] End, Idx=0x%X\\n\", __func__, Idx));\n\treturn TRUE;\n}\n\nVOID\nBeamforming_CheckSoundingSuccess(\n\tIN PVOID\t\t\tpDM_VOID,\n\tBOOLEAN\t\t\tStatus\t\n)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[David]@%s Start!\\n\", __func__));\n\n\tif (Status == 1) {\n\t\tif (pEntry->LogStatusFailCnt == 21)\n\t\t\tBeamforming_DymPeriod(pDM_Odm, Status);\n\t\tpEntry->LogStatusFailCnt = 0;\n\t} else if (pEntry->LogStatusFailCnt <= 20) {\n\t\tpEntry->LogStatusFailCnt++;\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s LogStatusFailCnt %d\\n\", __func__, pEntry->LogStatusFailCnt));\n\t}\n\tif (pEntry->LogStatusFailCnt > 20) {\n\t\tpEntry->LogStatusFailCnt = 21;\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s LogStatusFailCnt > 20, Stop SOUNDING\\n\", __func__));\n\t\tBeamforming_DymPeriod(pDM_Odm, Status);\n\t}\n}\n\nVOID\nphydm_Beamforming_End_SW(\n\tIN PVOID\t\tpDM_VOID,\n\tBOOLEAN\t\t\tStatus\t\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\n\tif (pEntry->BeamformEntryState != BEAMFORMING_ENTRY_STATE_PROGRESSING) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] BeamformStatus %d\\n\", __func__, pEntry->BeamformEntryState));\n\t\treturn;\n\t}\n\n\tif ((pDM_Odm->TxBfDataRate >= ODM_RATEVHTSS3MCS7) && (pDM_Odm->TxBfDataRate <= ODM_RATEVHTSS3MCS9)) {\n\t\tODM_RT_TRACE(pDM_Odm, BEAMFORMING_DEBUG, ODM_DBG_LOUD, (\"[%s] VHT3SS 7,8,9, do not apply V matrix.\\n\", __func__));\n\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&(pBeamInfo->BeamformeeCurIdx));\n\t} else if (Status == 1) {\n\t\tpEntry->LogStatusFailCnt = 0;\n\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_STATUS, (pu1Byte)&(pBeamInfo->BeamformeeCurIdx));\n\t} else {\n\t\tpEntry->LogStatusFailCnt++;\n\t\tpEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_INITIALIZED;\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_TX_PATH_RESET, (pu1Byte)&(pBeamInfo->BeamformeeCurIdx));\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] LogStatusFailCnt %d\\n\", __func__, pEntry->LogStatusFailCnt));\n\t}\n\t\n\tif (pEntry->LogStatusFailCnt > 30) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s LogStatusFailCnt > 50, Stop SOUNDING\\n\", __func__));\n\t\tpEntry->bSound = FALSE;\n\t\tBeamforming_DeInitEntry(pDM_Odm, pEntry->MacAddr); \n\n\t\t/*Modified by David - Every action of deleting entry should follow by Notify*/\n\t\tphydm_Beamforming_Notify(pDM_Odm);\n\t}\t\n\tpEntry->bBeamformingInProgress = FALSE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: Status=%d\\n\", __func__, Status));\n}\t\n\n\nVOID\nBeamforming_TimerCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN PVOID\t\t\tpDM_VOID\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tIN PVOID            pContext\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPADAPTER\t\t\t\t\tAdapter = (PADAPTER)pContext;\n\tPHAL_DATA_TYPE\t\t\t\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n\tBOOLEAN\t\t\t\t\t\tret = FALSE;\n\tPRT_BEAMFORMING_INFO\t\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\t\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\tPRT_SOUNDING_INFO\t\t\tpSoundInfo = &(pBeamInfo->SoundingInfo);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tif (pEntry->bBeamformingInProgress) {\n\t \tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"bBeamformingInProgress, reset it\\n\"));\n\t\tphydm_Beamforming_End_SW(pDM_Odm, 0);\n\t }\n\n\tret = phydm_Beamforming_SelectBeamEntry(pDM_Odm, pBeamInfo);\n#if (SUPPORT_MU_BF == 1)\n\tif (ret && pBeamInfo->beamformee_mu_cnt > 1)\n\t\tret = 1;\n\telse\n\t\tret = 0;\n#endif\n\tif (ret)\n\t\tret = BeamformingStart_SW(pDM_Odm, pSoundInfo->SoundIdx, pSoundInfo->SoundMode, pSoundInfo->SoundBW);\n\telse\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s, Error value return from BeamformingStart_V2\\n\", __func__));\n\n\tif ((pBeamInfo->beamformee_su_cnt != 0) || (pBeamInfo->beamformee_mu_cnt > 1)) {\n\t\tif (pSoundInfo->SoundMode == SOUNDING_SW_VHT_TIMER || pSoundInfo->SoundMode == SOUNDING_SW_HT_TIMER)\n\t\t\tODM_SetTimer(pDM_Odm, &pBeamInfo->BeamformingTimer, pSoundInfo->SoundPeriod);\n\t\telse {\n\t\t\tu4Byte\tval = (pSoundInfo->SoundPeriod << 16) | HAL_TIMER_TXBF;\n\t\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_HW_REG_TIMER_RESTART, (pu1Byte)(&val));\n\t\t}\n\t}\n}\n\n\nVOID\nBeamforming_SWTimerCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPRT_TIMER\t\tpTimer\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tvoid *FunctionContext\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\tBeamforming_TimerCallback(pDM_Odm);\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)FunctionContext;\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\tif (Adapter->net_closed == TRUE)\n\t\treturn;\n\trtw_run_in_thread_cmd(Adapter, Beamforming_TimerCallback, Adapter);\n#endif\n\t\n}\n\n\nVOID\nphydm_Beamforming_Init(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPHAL_TXBF_INFO\t\t\t\tpTxbfInfo = &pBeamInfo->TxbfInfo;\n\tPRT_BEAMFORMING_OID_INFO\tpBeamOidInfo = &(pBeamInfo->BeamformingOidInfo);\n\t\n\tpBeamOidInfo->SoundOidMode = SOUNDING_STOP_OID_TIMER;\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Mode (%d)\\n\", __func__, pBeamOidInfo->SoundOidMode));\n\n\tpBeamInfo->beamformee_su_cnt = 0;\n\tpBeamInfo->beamformer_su_cnt = 0;\n\tpBeamInfo->beamformee_mu_cnt = 0;\n\tpBeamInfo->beamformer_mu_cnt = 0;\n\tpBeamInfo->beamformee_mu_reg_maping = 0;\n\tpBeamInfo->mu_ap_index = 0;\n\tpBeamInfo->is_mu_sounding = FALSE;\n\tpBeamInfo->FirstMUBFeeIndex = 0xFF;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tpBeamInfo->SourceAdapter = pDM_Odm->Adapter;\n#endif\n\thalComTxbf_beamformInit(pDM_Odm);\n}\t\n\n\nVOID\nBeamforming_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u2Byte\t\tstaIdx\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tBFerBFeeIdx = 0xff;\n\t\n\tif (Beamforming_InitEntry(pDM_Odm, staIdx, &BFerBFeeIdx))\n\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_ENTER, (pu1Byte)&BFerBFeeIdx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] End!\\n\", __func__));\n}\n\n\nVOID\nBeamforming_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (RA == NULL)\n\t\tBeamforming_Reset(pDM_Odm);\n\telse\n\t\tBeamforming_DeInitEntry(pDM_Odm, RA);\n\n\tphydm_Beamforming_Notify(pDM_Odm);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] End!!\\n\", __func__));\n}\n\n#if 0\n//Nobody calls this function\nVOID\nphydm_Beamforming_SetTxBFen(\n\tIN\tPVOID\t\tpDM_VOID,\n\tu1Byte\t\t\tMacId,\n\tBOOLEAN\t\t\tbTxBF\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tpEntry = phydm_Beamforming_GetEntryByMacId(pDM_Odm, MacId, &Idx);\n\n\tif(pEntry == NULL)\n\t\treturn;\n\telse\n\t\tpEntry->bTxBF = bTxBF;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s MacId %d TxBF %d\\n\", __func__, pEntry->MacId, pEntry->bTxBF));\n\n\tphydm_Beamforming_Notify(pDM_Odm);\n}\n#endif\n\nBEAMFORMING_CAP\nphydm_Beamforming_GetBeamCap(\n\tIN PVOID\t\t\t\t\t\tpDM_VOID,\n\tIN PRT_BEAMFORMING_INFO \tpBeamInfo\n\t)\n{\n\tu1Byte\t\t\t\t\ti;\n\tBOOLEAN \t\t\t\tbSelfBeamformer = FALSE;\n\tBOOLEAN \t\t\t\tbSelfBeamformee = FALSE;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tBEAMFORMING_CAP \t\tBeamformCap = BEAMFORMING_CAP_NONE;\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\tBeamformeeEntry = pBeamInfo->BeamformeeEntry[i];\n\n\t\tif (BeamformeeEntry.bUsed) {\n\t\t\tbSelfBeamformer = TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] BFee entry %d bUsed=TRUE\\n\", __func__, i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (i = 0; i < BEAMFORMER_ENTRY_NUM; i++) {\n\t\tBeamformerEntry = pBeamInfo->BeamformerEntry[i];\n\n\t\tif (BeamformerEntry.bUsed) {\n\t\t\tbSelfBeamformee = TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]: BFer entry %d bUsed=TRUE\\n\", __func__, i));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (bSelfBeamformer)\n\t\tBeamformCap = (BEAMFORMING_CAP)(BeamformCap | BEAMFORMER_CAP);\n\tif (bSelfBeamformee)\n\t\tBeamformCap = (BEAMFORMING_CAP)(BeamformCap | BEAMFORMEE_CAP);\n\n\treturn BeamformCap;\n}\n\n\nBOOLEAN\nBeamformingControl_V1(\n\tIN PVOID\t\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA,\n\tu1Byte\t\t\tAID,\n\tu1Byte\t\t\tMode, \n\tCHANNEL_WIDTH\tBW,\n\tu1Byte\t\t\tRate\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tBOOLEAN\t\tret = TRUE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"AID (%d), Mode (%d), BW (%d)\\n\", AID, Mode, BW));\n\n\tswitch (Mode) {\t\n\tcase 0:\n\tret = BeamformingStart_V1(pDM_Odm, RA, 0, BW, Rate);\n\tbreak;\n\tcase 1:\n\tret = BeamformingStart_V1(pDM_Odm, RA, 1, BW, Rate);\n\tbreak;\n\tcase 2:\n\tphydm_Beamforming_NDPARate(pDM_Odm, BW, Rate);\n\tret = Beamforming_SendVHTNDPAPacket(pDM_Odm, RA, AID, BW, NORMAL_QUEUE);\n\tbreak;\n\tcase 3:\n\tphydm_Beamforming_NDPARate(pDM_Odm, BW, Rate);\n\tret = Beamforming_SendHTNDPAPacket(pDM_Odm, RA, BW, NORMAL_QUEUE);\n\tbreak;\n\t}\n\treturn ret;\n}\n\n/*Only OID uses this function*/\nBOOLEAN\nphydm_BeamformingControl_V2(\n\tIN\tPVOID\t\tpDM_VOID,\n\tu1Byte\t\t\tIdx,\n\tu1Byte\t\t\tMode, \n\tCHANNEL_WIDTH\tBW,\n\tu2Byte\t\t\tPeriod\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\t\tpBeamInfo =  &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMING_OID_INFO\tpBeamOidInfo = &(pBeamInfo->BeamformingOidInfo);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Start!\\n\", __func__));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Idx (%d), Mode (%d), BW (%d), Period (%d)\\n\", Idx, Mode, BW, Period));\n\n\tpBeamOidInfo->SoundOidIdx = Idx;\n\tpBeamOidInfo->SoundOidMode = (SOUNDING_MODE) Mode;\n\tpBeamOidInfo->SoundOidBW = BW;\n\tpBeamOidInfo->SoundOidPeriod = Period;\n\n\tphydm_Beamforming_Notify(pDM_Odm);\n\n\treturn TRUE;\n}\n\n\nVOID\nphydm_Beamforming_Watchdog(\n\tIN\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO \t\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_TRACE, (\"%s Start!\\n\", __func__));\n\n\tif (pBeamInfo->beamformee_su_cnt == 0)\n\t\treturn;\n\n\tBeamforming_DymPeriod(pDM_Odm,0);\n\tphydm_Beamforming_DymNDPARate(pDM_Odm);\n\n}\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_beamforming.h",
    "content": "#ifndef __INC_BEAMFORMING_H\n#define __INC_BEAMFORMING_H\n\n#ifndef BEAMFORMING_SUPPORT\n#define\tBEAMFORMING_SUPPORT\t\t0\n#endif\n\n/*Beamforming Related*/\n#include \"txbf/halcomtxbf.h\"\n#include \"txbf/haltxbfjaguar.h\"\n#include \"txbf/haltxbf8192e.h\"\n#include \"txbf/haltxbf8814a.h\"\n#include \"txbf/haltxbf8821b.h\"\n#include \"txbf/haltxbf8822b.h\"\n#include \"txbf/haltxbfinterface.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n\n#define MAX_BEAMFORMEE_SU\t2\n#define MAX_BEAMFORMER_SU\t2\n#if (RTL8822B_SUPPORT == 1)\n#define MAX_BEAMFORMEE_MU\t6\n#define MAX_BEAMFORMER_MU\t1\n#else\n#define MAX_BEAMFORMEE_MU\t0\n#define MAX_BEAMFORMER_MU\t0\n#endif\n\n#define BEAMFORMEE_ENTRY_NUM\t\t(MAX_BEAMFORMEE_SU + MAX_BEAMFORMEE_MU)\n#define BEAMFORMER_ENTRY_NUM\t\t(MAX_BEAMFORMER_SU + MAX_BEAMFORMER_MU)\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n/*for different naming between WIN and CE*/\n#define BEACON_QUEUE\tBCN_QUEUE_INX\n#define NORMAL_QUEUE\tMGT_QUEUE_INX\n#define RT_DISABLE_FUNC RTW_DISABLE_FUNC\n#define RT_ENABLE_FUNC RTW_ENABLE_FUNC\n#endif\n\ntypedef enum _BEAMFORMING_ENTRY_STATE {\n\tBEAMFORMING_ENTRY_STATE_UNINITIALIZE, \n\tBEAMFORMING_ENTRY_STATE_INITIALIZEING, \n\tBEAMFORMING_ENTRY_STATE_INITIALIZED, \n\tBEAMFORMING_ENTRY_STATE_PROGRESSING, \n\tBEAMFORMING_ENTRY_STATE_PROGRESSED \n} BEAMFORMING_ENTRY_STATE, *PBEAMFORMING_ENTRY_STATE;\n\n\ntypedef enum _BEAMFORMING_NOTIFY_STATE {\n\tBEAMFORMING_NOTIFY_NONE,\n\tBEAMFORMING_NOTIFY_ADD,\n\tBEAMFORMING_NOTIFY_DELETE,\n\tBEAMFORMEE_NOTIFY_ADD_SU,\n\tBEAMFORMEE_NOTIFY_DELETE_SU,\n\tBEAMFORMEE_NOTIFY_ADD_MU,\n\tBEAMFORMEE_NOTIFY_DELETE_MU,\n\tBEAMFORMING_NOTIFY_RESET\n} BEAMFORMING_NOTIFY_STATE, *PBEAMFORMING_NOTIFY_STATE;\n\ntypedef enum _BEAMFORMING_CAP {\n\tBEAMFORMING_CAP_NONE = 0x0,\n\tBEAMFORMER_CAP_HT_EXPLICIT = BIT1, \n\tBEAMFORMEE_CAP_HT_EXPLICIT = BIT2, \n\tBEAMFORMER_CAP_VHT_SU = BIT5,\t\t\t/* Self has er Cap, because Reg er  & peer ee */\n\tBEAMFORMEE_CAP_VHT_SU = BIT6,\t\t\t/* Self has ee Cap, because Reg ee & peer er */\n\tBEAMFORMER_CAP_VHT_MU = BIT7,\t\t\t/* Self has er Cap, because Reg er  & peer ee */\n\tBEAMFORMEE_CAP_VHT_MU = BIT8,\t\t\t/* Self has ee Cap, because Reg ee & peer er */\n\tBEAMFORMER_CAP = BIT9,\n\tBEAMFORMEE_CAP = BIT10,\n}BEAMFORMING_CAP, *PBEAMFORMING_CAP;\n\n\ntypedef enum _SOUNDING_MODE {\n\tSOUNDING_SW_VHT_TIMER = 0x0,\n\tSOUNDING_SW_HT_TIMER = 0x1, \n\tSOUNDING_STOP_All_TIMER = 0x2, \n\tSOUNDING_HW_VHT_TIMER = 0x3,\t\t\t\n\tSOUNDING_HW_HT_TIMER = 0x4,\n\tSOUNDING_STOP_OID_TIMER = 0x5, \n\tSOUNDING_AUTO_VHT_TIMER = 0x6,\n\tSOUNDING_AUTO_HT_TIMER = 0x7,\n\tSOUNDING_FW_VHT_TIMER = 0x8,\n\tSOUNDING_FW_HT_TIMER = 0x9,\n}SOUNDING_MODE, *PSOUNDING_MODE;\n\ntypedef struct _RT_BEAMFORM_STAINFO {\n\tpu1Byte\t\t\t\t\t\tRA; \n\tu2Byte\t\t\t\t\t\tAID; \n\tu2Byte\t\t\t\t\t\tMacID;\n\tu1Byte\t\t\t\t\t\tMyMacAddr[6];\n\tWIRELESS_MODE\t\t\t\tWirelessMode;\n\tCHANNEL_WIDTH\t\t\t\tBW;\n\tBEAMFORMING_CAP\t\t\tBeamformCap;\n\tu1Byte\t\t\t\t\t\tHtBeamformCap;\n\tu2Byte\t\t\t\t\t\tVhtBeamformCap;\n\tu1Byte\t\t\t\t\t\tCurBeamform; \n\tu2Byte\t\t\t\t\t\tCurBeamformVHT;\n} RT_BEAMFORM_STAINFO, *PRT_BEAMFORM_STAINFO;\n\n\ntypedef struct _RT_BEAMFORMEE_ENTRY {\n\tBOOLEAN bUsed;\n\tBOOLEAN\tbTxBF;\n\tBOOLEAN bSound;\n\tu2Byte\tAID;\t\t\t\t/*Used to construct AID field of NDPA packet.*/\n\tu2Byte\tMacId;\t\t\t\t/*Used to Set Reg42C in IBSS mode. */\n\tu2Byte\tP_AID;\t\t\t\t/*Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */\n\tu2Byte\tG_ID;\t\t\t\t/*Used to fill Tx DESC*/\n\tu1Byte\tMyMacAddr[6];\n\tu1Byte\tMacAddr[6];\t\t\t/*Used to fill Reg6E4 to fill Mac address of CSI report frame.*/\n\tCHANNEL_WIDTH\t\t\tSoundBW;\t\t/*Sounding BandWidth*/\n\tu2Byte\t\t\t\t\tSoundPeriod;\n\tBEAMFORMING_CAP\t\t\tBeamformEntryCap;\n\tBEAMFORMING_ENTRY_STATE\tBeamformEntryState;\t\n\tBOOLEAN\t\t\t\t\t\tbBeamformingInProgress;\n\t/*u1Byte\tLogSeq;\t\t\t\t\t\t\t\t\t// Move to _RT_BEAMFORMER_ENTRY*/\n\t/*u2Byte\tLogRetryCnt:3;\t\t// 0~4\t\t\t\t// Move to _RT_BEAMFORMER_ENTRY*/\n\t/*u2Byte\tLogSuccessCnt:2;\t\t// 0~2\t\t\t\t// Move to _RT_BEAMFORMER_ENTRY*/\n\tu2Byte\tLogStatusFailCnt:5;\t// 0~21\n\tu2Byte\tDefaultCSICnt:5;\t\t// 0~21\n\tu1Byte\tCSIMatrix[327];\n\tu2Byte\tCSIMatrixLen;\n\tu1Byte\tNumofSoundingDim;\n\tu1Byte\tCompSteeringNumofBFer;\n\tu1Byte\tsu_reg_index;\n\t/*For MU-MIMO*/\n\tBOOLEAN\tis_mu_sta;\n\tu1Byte\tmu_reg_index;\n\tu1Byte\tgid_valid[8];\n\tu1Byte\tuser_position[16];\n} RT_BEAMFORMEE_ENTRY, *PRT_BEAMFORMEE_ENTRY;\n\ntypedef struct _RT_BEAMFORMER_ENTRY {\n\tBOOLEAN \t\t\tbUsed;\n\t/*P_AID of BFer entry is probably not used*/\n\tu2Byte\t\t\t\tP_AID;\t\t\t\t\t/*Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. */\n\tu2Byte\t\t\t\tG_ID;\n\tu1Byte\t\t\t\tMyMacAddr[6];\n\tu1Byte\t\t\t\tMacAddr[6];\n\tBEAMFORMING_CAP\tBeamformEntryCap;\n\tu1Byte\t\t\t\tNumofSoundingDim;\n\tu1Byte\t\t\t\tClockResetTimes;\t\t/*Modified by Jeffery @2015-04-10*/\n\tu1Byte\t\t\t\tPreLogSeq;\t\t\t\t/*Modified by Jeffery @2015-03-30*/\n\tu1Byte\t\t\t\tLogSeq;\t\t\t\t\t/*Modified by Jeffery @2014-10-29*/\n\tu2Byte\t\t\t\tLogRetryCnt:3;\t\t\t/*Modified by Jeffery @2014-10-29*/\n\tu2Byte\t\t\t\tLogSuccess:2;\t\t\t/*Modified by Jeffery @2014-10-29*/\n\tu1Byte\t\t\t\tsu_reg_index;\n\t /*For MU-MIMO*/\n\tBOOLEAN\t\t\t\tis_mu_ap;\n\tu1Byte\t\t\t\tgid_valid[8];\n\tu1Byte\t\t\t\tuser_position[16];\n\tu2Byte\t\t\t\tAID;\n} RT_BEAMFORMER_ENTRY, *PRT_BEAMFORMER_ENTRY;\n\ntypedef struct _RT_SOUNDING_INFO {\n\tu1Byte\t\t\tSoundIdx;\n\tCHANNEL_WIDTH\tSoundBW;\n\tSOUNDING_MODE\tSoundMode; \n\tu2Byte\t\t\tSoundPeriod;\n} RT_SOUNDING_INFO, *PRT_SOUNDING_INFO;\n\n\n\ntypedef struct _RT_BEAMFORMING_OID_INFO {\n\tu1Byte\t\t\tSoundOidIdx;\n\tCHANNEL_WIDTH\tSoundOidBW;\t\n\tSOUNDING_MODE\tSoundOidMode;\n\tu2Byte\t\t\tSoundOidPeriod;\n} RT_BEAMFORMING_OID_INFO, *PRT_BEAMFORMING_OID_INFO;\n\n\ntypedef struct _RT_BEAMFORMING_INFO {\n\tBEAMFORMING_CAP\t\t\tBeamformCap;\n\tRT_BEAMFORMEE_ENTRY\t\tBeamformeeEntry[BEAMFORMEE_ENTRY_NUM];\n\tRT_BEAMFORMER_ENTRY\t\tBeamformerEntry[BEAMFORMER_ENTRY_NUM];\n\tRT_BEAMFORM_STAINFO\t\tBeamformSTAinfo;\n\tu1Byte\t\t\t\t\tBeamformeeCurIdx;\n\tRT_TIMER\t\t\t\t\tBeamformingTimer;\n\tRT_TIMER\t\t\t\t\tmu_timer;\n\tRT_SOUNDING_INFO\t\t\tSoundingInfo;\n\tRT_BEAMFORMING_OID_INFO\tBeamformingOidInfo;\n\tHAL_TXBF_INFO\t\t\tTxbfInfo;\n\tu1Byte\t\t\t\t\tSoundingSequence;\n\tu1Byte\t\t\t\t\tbeamformee_su_cnt;\n\tu1Byte\t\t\t\t\tbeamformer_su_cnt;\n\tu4Byte\t\t\t\t\tbeamformee_su_reg_maping;\n\tu4Byte\t\t\t\t\tbeamformer_su_reg_maping;\n\t/*For MU-MINO*/\n\tu1Byte\t\t\t\t\tbeamformee_mu_cnt;\n\tu1Byte\t\t\t\t\tbeamformer_mu_cnt;\n\tu4Byte\t\t\t\t\tbeamformee_mu_reg_maping;\n\tu1Byte\t\t\t\t\tmu_ap_index;\n\tBOOLEAN\t\t\t\t\tis_mu_sounding;\n\tu1Byte\t\t\t\t\tFirstMUBFeeIndex;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\t\t\tSourceAdapter;\n#endif\n\t/* Control register */\n\tu4Byte\t\t\t\t\tRegMUTxCtrl;\t\t/* For USB/SDIO interfaces aync I/O  */\n} RT_BEAMFORMING_INFO, *PRT_BEAMFORMING_INFO;\n\n\ntypedef struct _RT_NDPA_STA_INFO {\n\tu2Byte\tAID:12;\t\n\tu2Byte\tFeedbackType:1;\n\tu2Byte\tNcIndex:3;\t\n} RT_NDPA_STA_INFO, *PRT_NDPA_STA_INFO;\n\n\nBEAMFORMING_CAP\nphydm_Beamforming_GetEntryBeamCapByMacId(\n\tIN\tPVOID\tpDM_VOID,\n\tIN \tu1Byte \tMacId\n );\n\nPRT_BEAMFORMEE_ENTRY\nphydm_Beamforming_GetBFeeEntryByAddr(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tpu1Byte\t\tRA,\n\tOUT\tpu1Byte\t\tIdx\n\t);\n\nPRT_BEAMFORMER_ENTRY\nphydm_Beamforming_GetBFerEntryByAddr(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tTA,\n\tOUT\tpu1Byte\tIdx\n\t);\n\nu1Byte\nBeamforming_GetHTNDPTxRate(\n\tIN\tPVOID\tpDM_VOID,\n\tu1Byte\tCompSteeringNumofBFer\n);\n\nu1Byte\nBeamforming_GetVHTNDPTxRate(\n\tIN\tPVOID\tpDM_VOID,\n\tu1Byte\tCompSteeringNumofBFer\n);\n\nVOID\nphydm_Beamforming_Notify(\n\tIN\tPVOID\tpDM_VOID\n\t);\n\n\nVOID\nBeamforming_Enter(\n\tIN PVOID\t\tpDM_VOID,\n\tIN u2Byte\tstaIdx\n\t);\n\nVOID\nBeamforming_Leave(\n\tIN PVOID\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA\n\t);\n\nBOOLEAN\nBeamformingStart_FW(\n\tIN PVOID\t\t\tpDM_VOID,\n\tu1Byte\t\t\tIdx\n\t);\n\nVOID\nBeamforming_CheckSoundingSuccess(\n\tIN PVOID\t\t\tpDM_VOID,\n\tBOOLEAN\t\t\tStatus\t\n);\n\nVOID\nphydm_Beamforming_End_SW(\n\tIN PVOID\t\tpDM_VOID,\n\tBOOLEAN\t\t\tStatus\t\n\t);\n\nVOID\nBeamforming_TimerCallback(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nphydm_Beamforming_Init(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n\n\nBEAMFORMING_CAP\nphydm_Beamforming_GetBeamCap(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN PRT_BEAMFORMING_INFO \tpBeamInfo\n\t);\n\n\nBOOLEAN\nBeamformingControl_V1(\n\tIN PVOID\t\t\tpDM_VOID,\n\tpu1Byte\t\t\tRA,\n\tu1Byte\t\t\tAID,\n\tu1Byte\t\t\tMode,\n\tCHANNEL_WIDTH\tBW,\n\tu1Byte\t\t\tRate\n\t);\n\n\nBOOLEAN\nphydm_BeamformingControl_V2(\n\tIN\tPVOID\t\tpDM_VOID,\n\tu1Byte\t\t\tIdx,\n\tu1Byte\t\t\tMode, \n\tCHANNEL_WIDTH\tBW,\n\tu2Byte\t\t\tPeriod\n\t);\n\nVOID\nphydm_Beamforming_Watchdog(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nBeamforming_SWTimerCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPRT_TIMER\t\tpTimer\n#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tvoid *FunctionContext\n#endif\n\t);\n\nBOOLEAN\nBeamforming_SendHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW, \n\tIN\tu1Byte\t\t\tQIdx\n\t);\n\n\nBOOLEAN\nBeamforming_SendVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW,\n\tIN\tu1Byte\t\t\tQIdx\n\t);\n\n#else\n#define Beamforming_GidPAid(Adapter, pTcb)\n#define Beamforming_Enter(pDM_Odm, staIdx)\n#define Beamforming_Leave(pDM_Odm, RA)\n#define Beamforming_End_FW(pDMOdm)\n#define BeamformingControl_V1(pDM_Odm, RA, AID, Mode, BW, Rate)\t\tTRUE\n#define BeamformingControl_V2(pDM_Odm, Idx, Mode, BW, Period)\t\tTRUE\n#define phydm_Beamforming_End_SW(pDM_Odm, _Status)\n#define Beamforming_TimerCallback(pDM_Odm)\n#define phydm_Beamforming_Init(pDM_Odm)\n#define phydm_BeamformingControl_V2(pDM_Odm, _Idx, _Mode, _BW, _Period)\tFALSE\n#define Beamforming_Watchdog(pDM_Odm)\n#define phydm_Beamforming_Watchdog(pDM_Odm)\n\n\n#endif\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_cfotracking.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\nVOID\nodm_SetCrystalCap(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\t\t\tCrystalCap\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPCFO_TRACKING\t\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\tBOOLEAN \t\t\t\t\tbEEPROMCheck;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tbEEPROMCheck = (pHalData->EEPROMVersion >= 0x01)?TRUE:FALSE;\n#else\n\tbEEPROMCheck = TRUE;\n#endif\n\n\tif(pCfoTrack->CrystalCap == CrystalCap)\n\t\treturn;\n\n\tpCfoTrack->CrystalCap = CrystalCap;\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8188E | ODM_RTL8188F)) {\n\t\t/* write 0x24[22:17] = 0x24[16:11] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x007ff800, (CrystalCap|(CrystalCap << 6)));\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8812) {\n\t\t/* write 0x2C[30:25] = 0x2C[24:19] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap|(CrystalCap << 6)));\n\t} else if (((pDM_Odm->SupportICType & ODM_RTL8723A) && bEEPROMCheck) ||\n\t\t(pDM_Odm->SupportICType & (ODM_RTL8703B|ODM_RTL8723B|ODM_RTL8192E|ODM_RTL8821))) {\n\t\t/* 0x2C[23:18] = 0x2C[17:12] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x00FFF000, (CrystalCap|(CrystalCap << 6)));\t\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8821B) {\n\t\t/* write 0x28[6:1] = 0x24[30:25] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7E000000, CrystalCap);\n\t\tODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7E, CrystalCap);\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8814A) {\n\t\t/* write 0x2C[26:21] = 0x2C[20:15] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap|(CrystalCap << 6)));\n\t} else if (pDM_Odm->SupportICType & ODM_RTL8822B) {\n\t\t/* write 0x24[30:25] = 0x28[6:1] = CrystalCap */\n\t\tCrystalCap = CrystalCap & 0x3F;\n\t\tODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7e000000, CrystalCap);\n\t\tODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7e, CrystalCap);\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"odm_SetCrystalCap(): Use default setting.\\n\"));\n\t\tODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap|(CrystalCap << 6)));\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"odm_SetCrystalCap(): CrystalCap = 0x%x\\n\", CrystalCap));\n#endif\n}\n\nu1Byte\nodm_GetDefaultCrytaltalCap(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\t\tCrystalCap = 0x20;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tCrystalCap = pHalData->CrystalCap;\n#else\n\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\n\tif(priv->pmib->dot11RFEntry.xcap > 0)\n\t\tCrystalCap = priv->pmib->dot11RFEntry.xcap;\n#endif\n\n\tCrystalCap = CrystalCap & 0x3f;\n\n\treturn CrystalCap;\n}\n\nVOID\nodm_SetATCStatus(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tBOOLEAN\t\t\t\t\tATCStatus\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPCFO_TRACKING\t\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\n\tif(pCfoTrack->bATCStatus == ATCStatus)\n\t\treturn;\n\t\n\tODM_SetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm), ATCStatus);\n\tpCfoTrack->bATCStatus = ATCStatus;\n}\n\nBOOLEAN\nodm_GetATCStatus(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tBOOLEAN\t\t\t\t\t\tATCStatus;\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tATCStatus = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm));\n\treturn ATCStatus;\n}\n\nVOID\nODM_CfoTrackingReset(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPCFO_TRACKING\t\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\n\tpCfoTrack->DefXCap = odm_GetDefaultCrytaltalCap(pDM_Odm);\n\tpCfoTrack->bAdjust = TRUE;\n\n\tif(pCfoTrack->CrystalCap > pCfoTrack->DefXCap)\n\t{\n\t\todm_SetCrystalCap(pDM_Odm, pCfoTrack->CrystalCap - 1);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD,\n\t\t\t(\"ODM_CfoTrackingReset(): approch default value (0x%x)\\n\", pCfoTrack->CrystalCap));\n\t} else if (pCfoTrack->CrystalCap < pCfoTrack->DefXCap)\n\t{\n\t\todm_SetCrystalCap(pDM_Odm, pCfoTrack->CrystalCap + 1);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD,\n\t\t\t(\"ODM_CfoTrackingReset(): approch default value (0x%x)\\n\", pCfoTrack->CrystalCap));\n\t}\n\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\todm_SetATCStatus(pDM_Odm, TRUE);\n\t#endif\n}\n\nVOID\nODM_CfoTrackingInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPCFO_TRACKING\t\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\n\tpCfoTrack->DefXCap = pCfoTrack->CrystalCap = odm_GetDefaultCrytaltalCap(pDM_Odm);\n\tpCfoTrack->bATCStatus = odm_GetATCStatus(pDM_Odm);\n\tpCfoTrack->bAdjust = TRUE;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking_init()=========> \\n\"));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking_init(): bATCStatus = %d, CrystalCap = 0x%x \\n\",pCfoTrack->bATCStatus, pCfoTrack->DefXCap));\n}\n\nVOID\nODM_CfoTracking(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPCFO_TRACKING\t\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\tint\t\t\t\t\t\t\tCFO_kHz_A, CFO_kHz_B, CFO_ave = 0;\n\tint\t\t\t\t\t\t\tCFO_ave_diff;\n\tint\t\t\t\t\t\t\tCrystalCap = (int)pCfoTrack->CrystalCap;\n\tu1Byte\t\t\t\t\t\tAdjust_Xtal = 1;\n\n\t//4 Support ability\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Return: SupportAbility ODM_BB_CFO_TRACKING is disabled\\n\"));\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking()=========> \\n\"));\n\n\tif(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly)\n\t{\t\n\t\t//4 No link or more than one entry\n\t\tODM_CfoTrackingReset(pDM_Odm);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Reset: bLinked = %d, bOneEntryOnly = %d\\n\", \n\t\t\tpDM_Odm->bLinked, pDM_Odm->bOneEntryOnly));\n\t}\n\telse\n\t{\n\t\t//3 1. CFO Tracking\n\t\t//4 1.1 No new packet\n\t\tif(pCfoTrack->packetCount == pCfoTrack->packetCount_pre)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): packet counter doesn't change\\n\"));\n\t\t\treturn;\n\t\t}\n\t\tpCfoTrack->packetCount_pre = pCfoTrack->packetCount;\n\t\n\t\t//4 1.2 Calculate CFO\n\t\tCFO_kHz_A =  (int)((pCfoTrack->CFO_tail[0] * 3125)  / 10)>>7; /* CFO_tail[1:0] is S(8,7),    (num_subcarrier>>7) x 312.5K = CFO value(K Hz)   */\n\t\tCFO_kHz_B =  (int)((pCfoTrack->CFO_tail[1] * 3125)  / 10)>>7;\n\t\t\n\t\tif(pDM_Odm->RFType < ODM_2T2R)\n\t\t\tCFO_ave = CFO_kHz_A;\n\t\telse\n\t\t\tCFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\\n\", \n\t\t\t\t\t\tCFO_kHz_A, CFO_kHz_B, CFO_ave));\n\n\t\t//4 1.3 Avoid abnormal large CFO\n\t\tCFO_ave_diff = (pCfoTrack->CFO_ave_pre >= CFO_ave)?(pCfoTrack->CFO_ave_pre - CFO_ave):(CFO_ave - pCfoTrack->CFO_ave_pre);\n\t\tif(CFO_ave_diff > 20 && pCfoTrack->largeCFOHit == 0 && !pCfoTrack->bAdjust)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): first large CFO hit\\n\"));\n\t\t\tpCfoTrack->largeCFOHit = 1;\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t\tpCfoTrack->largeCFOHit = 0;\n\t\tpCfoTrack->CFO_ave_pre = CFO_ave;\n\n\t\t//4 1.4 Dynamic Xtal threshold\n\t\tif(pCfoTrack->bAdjust == FALSE)\n\t\t{\n\t\t\tif(CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))\n\t\t\t\tpCfoTrack->bAdjust = TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))\n\t\t\t\tpCfoTrack->bAdjust = FALSE;\n\t\t}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\t//4 1.5 BT case: Disable CFO tracking\n\t\tif(pDM_Odm->bBtEnabled)\n\t\t{\n\t\t\tpCfoTrack->bAdjust = FALSE;\n\t\t\todm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Disable CFO tracking for BT!!\\n\"));\n\t\t}\n/*\n\t\t//4 1.6 Big jump \n\t\tif(pCfoTrack->bAdjust)\n\t\t{\n\t\t\tif(CFO_ave > CFO_TH_XTAL_LOW)\n\t\t\t\tAdjust_Xtal =  Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);\n\t\t\telse if(CFO_ave < (-CFO_TH_XTAL_LOW))\n\t\t\t\tAdjust_Xtal =  Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Crystal cap offset = %d\\n\", Adjust_Xtal));\n\t\t}\n*/\n#endif\n\t\t\n\t\t//4 1.7 Adjust Crystal Cap.\n\t\tif(pCfoTrack->bAdjust)\n\t\t{\n\t\t\tif(CFO_ave > CFO_TH_XTAL_LOW)\n\t\t\t\tCrystalCap = CrystalCap + Adjust_Xtal;\n\t\t\telse if(CFO_ave < (-CFO_TH_XTAL_LOW))\n\t\t\t\tCrystalCap = CrystalCap - Adjust_Xtal;\n\n\t\t\tif(CrystalCap > 0x3f)\n\t\t\t\tCrystalCap = 0x3f;\n\t\t\telse if (CrystalCap < 0)\n\t\t\t\tCrystalCap = 0;\n\n\t\t\todm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap);\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Crystal cap = 0x%x, Default Crystal cap = 0x%x\\n\", \n\t\t\tpCfoTrack->CrystalCap, pCfoTrack->DefXCap));\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\tif(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\t\treturn;\n\t\t\n\t\t//3 2. Dynamic ATC switch\n\t\tif(CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)\n\t\t{\n\t\t\todm_SetATCStatus(pDM_Odm, FALSE);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Disable ATC!!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\todm_SetATCStatus(pDM_Odm, TRUE);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, (\"ODM_CfoTracking(): Enable ATC!!\\n\"));\n\t\t}\n#endif\n\t}\n}\n\nVOID\nODM_ParsingCFO(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tPVOID\t\t\tpPktinfo_VOID,\n\tIN\t\ts1Byte* \t\t\tpcfotail\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_PACKET_INFO_T\t\tpPktinfo = (PODM_PACKET_INFO_T)pPktinfo_VOID;\n\tPCFO_TRACKING\t\t\tpCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\n\tu1Byte\t\t\t\t\ti;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))\n\t\treturn;\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tif(pPktinfo->bPacketMatchBSSID)\n#else\n\tif(pPktinfo->StationID != 0)\n#endif\n\t{\t\t\t\t\n\t\t//3 Update CFO report for path-A & path-B\n\t\t// Only paht-A and path-B have CFO tail and short CFO\n\t\tfor(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++)   \n\t\t{\n\t\t\tpCfoTrack->CFO_tail[i] = (int)pcfotail[i];\n\t \t}\n\n\t\t//3 Update packet counter\n\t\tif(pCfoTrack->packetCount == 0xffffffff)\n\t\t\tpCfoTrack->packetCount = 0;\n\t\telse\n\t \t\tpCfoTrack->packetCount++;\n\t}\n}\n\n"
  },
  {
    "path": "hal/phydm/phydm_cfotracking.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef\t__PHYDMCFOTRACK_H__\n#define    __PHYDMCFOTRACK_H__\n\n#define CFO_TRACKING_VERSION\t\"1.2\" /*2015.06.17*/\n\n#define\t\tCFO_TH_XTAL_HIGH\t\t\t20\t\t\t// kHz\n#define\t\tCFO_TH_XTAL_LOW\t\t\t10\t\t\t// kHz\n#define\t\tCFO_TH_ATC\t\t\t\t\t80\t\t\t// kHz\n\ntypedef struct _CFO_TRACKING_\n{\n\tBOOLEAN\t\t\tbATCStatus;\n\tBOOLEAN\t\t\tlargeCFOHit;\n\tBOOLEAN\t\t\tbAdjust;\n\tu1Byte\t\t\tCrystalCap;\n\tu1Byte\t\t\tDefXCap;\n\tint\t\t\t\tCFO_tail[2];\n\tint\t\t\t\tCFO_ave_pre;\n\tu4Byte\t\t\tpacketCount;\n\tu4Byte\t\t\tpacketCount_pre;\n\n\tBOOLEAN\t\t\tbForceXtalCap;\n\tBOOLEAN\t\t\tbReset;\n}CFO_TRACKING, *PCFO_TRACKING;\n\nVOID\nODM_CfoTrackingReset(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID\nODM_CfoTrackingInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID\nODM_CfoTracking(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n\nVOID\nODM_ParsingCFO(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tPVOID\t\t\t\t\tpPktinfo_VOID,\n\tIN     \ts1Byte* \t\t\t\t\tpcfotail\n);\n\n#endif"
  },
  {
    "path": "hal/phydm/phydm_debug.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n\nVOID\nPHYDM_InitDebugSetting(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n)\n{\n\tpDM_Odm->DebugLevel = ODM_DBG_TRACE;\n\n\tpDM_Odm->DebugComponents\t\t\t=\n\t\t\\\n#if DBG\n//BB Functions\n//\t\t\t\t\t\t\t\t\tODM_COMP_DIG\t\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_RA_MASK\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_DYNAMIC_TXPWR\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_FA_CNT\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_RSSI_MONITOR\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_CCK_PD\t\t\t\t|\n/*\t\t\t\t\t\t\t\t\tODM_COMP_ANT_DIV\t\t\t\t|*/\n//\t\t\t\t\t\t\t\t\tODM_COMP_PWR_SAVE\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_PWR_TRAIN\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_RATE_ADAPTIVE\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_PATH_DIV\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_DYNAMIC_PRICCA\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_RXHP\t\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_MP \t\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_CFO_TRACKING\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_ACS\t\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tPHYDM_COMP_ADAPTIVITY\t\t\t|\n//\t\t\t\t\t\t\t\t\tPHYDM_COMP_RA_DBG\t\t\t\t|\n/*\t\t\t\t\t\t\t\t\tPHYDM_COMP_TXBF\t\t\t\t\t|*/\n//MAC Functions\n//\t\t\t\t\t\t\t\t\tODM_COMP_EDCA_TURBO\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_EARLY_MODE\t\t\t|\n/*\t\t\t\t\t\t\t\t\tODM_FW_DEBUG_TRACE\t\t\t\t|*/\n//RF Functions\n//\t\t\t\t\t\t\t\t\tODM_COMP_TX_PWR_TRACK\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_RX_GAIN_TRACK\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_CALIBRATION\t\t\t|\n//Common\n/*\t\t\t\t\t\t\t\t\tODM_PHY_CONFIG\t\t\t\t\t|*/\n//\t\t\t\t\t\t\t\t\tODM_COMP_COMMON\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_INIT\t\t\t\t\t|\n//\t\t\t\t\t\t\t\t\tODM_COMP_PSD\t\t\t\t\t|\n/*\t\t\t\t\t\t\t\t\tODM_COMP_NOISY_DETECT\t\t\t|*/\n#endif\n\t\t0;\n\n\tpDM_Odm->fw_buff_is_enpty = TRUE;\n\tpDM_Odm->pre_c2h_seq = 0;\n}\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\nstatic u1Byte\tBbDbgBuf[BB_TMP_BUF_SIZE];\n\nVOID\nphydm_BB_RxHang_Info(IN PDM_ODM_T pDM_Odm)\n{\n\tu4Byte\tvalue32 = 0;\n\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\treturn;\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF80 , bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rptreg of sc/bw/ht/...\", value32);\n\tDCMD_Printf(BbDbgBuf);\n\n\t/* dbg_port = state machine */\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x007);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"state machine\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = CCA-related*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x204);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"CCA-related\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\n\t/* dbg_port = edcca/rxd*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x278);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"edcca/rxd\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = rx_state/mux_state/ADC_MASK_OFDM*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x290);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rx_state/mux_state/ADC_MASK_OFDM\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = bf-related*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B2);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"bf-related\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = bf-related*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B8);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"bf-related\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = txon/rxd*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA03);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"txon/rxd\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = l_rate/l_length*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0B);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"l_rate/l_length\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = rxd/rxd_hit*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0D);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rxd/rxd_hit\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = dis_cca*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAA0);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"dis_cca\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\n\t/* dbg_port = tx*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAB0);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"tx\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\t/* dbg_port = rx plcp*/\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD0);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rx plcp\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD1);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rx plcp\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD2);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rx plcp\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD3);\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"0x8fc\", value32);\n\t\tDCMD_Printf(BbDbgBuf);\n\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = 0x%x\", \"rx plcp\", (value32));\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n}\n\nVOID\nphydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm)\n{\n\n\tu1Byte\tRX_HT_BW, RX_VHT_BW, RXSC, RX_HT, RX_BW;\n\tstatic u1Byte vRX_BW ;\n\tu4Byte\tvalue32, value32_1, value32_2, value32_3;\n\ts4Byte\tSFO_A, SFO_B, SFO_C, SFO_D;\n\ts4Byte\tLFO_A, LFO_B, LFO_C, LFO_D;\n\tstatic u1Byte\tMCSS, Tail, Parity, rsv, vrsv, idx, smooth, htsound, agg, stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, vNsts, vtxops, vrsv2, vbrsv, bf, vbcrc;\n\tstatic u2Byte\tHLength, htcrc8, Length;\n\tstatic u2Byte vpaid;\n\tstatic u2Byte\tvLength, vhtcrc8, vMCSS, vTail, vbTail;\n\tstatic u1Byte\tHMCSS, HRX_BW;\n\n\n\tu1Byte    pwDB;\n\ts1Byte    RXEVM_0, RXEVM_1, RXEVM_2 ;\n\tu1Byte    RF_gain_pathA, RF_gain_pathB, RF_gain_pathC, RF_gain_pathD;\n\tu1Byte    RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD;\n\ts4Byte    sig_power;\n\tconst char *RXHT_table[3] = {\"legacy\", \"HT\", \"VHT\"};\n\tconst char *BW_table[3] = {\"20M\", \"40M\", \"80M\"};\n\tconst char *RXSC_table[7] = {\"duplicate/full bw\", \"usc20-1\", \"lsc20-1\", \"usc20-2\", \"lsc20-2\",  \"usc40\", \"lsc40\"};\n\n\tconst char *L_rate[8] = {\"6M\", \"9M\", \"12M\", \"18M\", \"24M\", \"36M\", \"48M\", \"54M\"};\n\n\n\t/*\n\tconst double evm_comp_20M = 0.579919469776867; //10*log10(64.0/56.0)\n\tconst double evm_comp_40M = 0.503051183113957; //10*log10(128.0/114.0)\n\tconst double evm_comp_80M = 0.244245993314183; //10*log10(256.0/242.0)\n\tconst double evm_comp_160M = 0.244245993314183; //10*log10(512.0/484.0)\n\t   */\n\n\tif (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\treturn;\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\\n\", \"BB Report Info\");\n\tDCMD_Printf(BbDbgBuf);\n\n\t/*BW & Mode Detection*/\n\t\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf80 , bMaskDWord);\n\tvalue32_2 = value32;\n\tRX_HT_BW = (u1Byte)(value32 & 0x1);\n\tRX_VHT_BW = (u1Byte)((value32 >> 1) & 0x3);\n\tRXSC = (u1Byte)(value32 & 0x78);\n\tvalue32_1 = (value32 & 0x180) >> 7;\n\tRX_HT = (u1Byte)(value32_1);\n\t/*\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"F80\", value32_2);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"RX_HT_BW\", RX_HT_BW);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"RX_VHT_BW\", RX_VHT_BW);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"RX_SC\", RXSC);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"RX_HT\", RX_HT);\n\tDCMD_Printf(BbDbgBuf);\n\t*/\n\n\t/*rsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  RX_HT:%s \", RXHT_table[RX_HT]);*/\n\t/*DCMD_Printf(BbDbgBuf);*/\n\tRX_BW = 0;\n\n\tif (RX_HT == 2) {\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  Mode: VHT Mode\");\n\t\tDCMD_Printf(BbDbgBuf);\n\t\tif (RX_VHT_BW == 0) {\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"     BW=20M\");\n\t\t\tDCMD_Printf(BbDbgBuf);\n\t\t} else if (RX_VHT_BW == 1) {\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"     BW=40M\");\n\t\t\tDCMD_Printf(BbDbgBuf);\n\t\t} else {\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"     BW=80M\");\n\t\t\tDCMD_Printf(BbDbgBuf);\n\t\t}\n\t\tRX_BW = RX_VHT_BW;\n\t} else if (RX_HT == 1) {\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  Mode: HT Mode\");\n\t\tDCMD_Printf(BbDbgBuf);\n\t\tif (RX_HT_BW == 0) {\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"     BW=20M\");\n\t\t\tDCMD_Printf(BbDbgBuf);\n\t\t} else if (RX_HT_BW == 1) {\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"     BW=40M\");\n\t\t\tDCMD_Printf(BbDbgBuf);\n\t\t}\n\t\tRX_BW = RX_HT_BW;\n\t} else {\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  Mode: Legeacy Mode\");\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\n\tif (RX_HT != 0) {\n\t\tif (RXSC == 0)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  duplicate/full bw\");\n\t\telse if (RXSC == 1)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  usc20-1\");\n\t\telse if (RXSC == 2)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  lsc20-1\");\n\t\telse if (RXSC == 3)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  usc20-2\");\n\t\telse if (RXSC == 4)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  lsc20-2\");\n\t\telse if (RXSC == 9)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  usc40\");\n\t\telse if (RXSC == 10)\n\t\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n  lsc40\");\n\t\tDCMD_Printf(BbDbgBuf);\n\t}\n\t/*\n\tif(RX_HT == 2){\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"  BW:%s\", BW_table[RX_VHT_BW]);\n\t\tRX_BW = RX_VHT_BW;\n\t\t}\n\telse if(RX_HT == 1){\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"  BW:%s\", BW_table[RX_HT_BW]);\n\t\tRX_BW = RX_HT_BW;\n\t\t}\n\telse\n\t\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE,  \"\");\n\t\n\tDCMD_Printf(BbDbgBuf);\t\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"  RXSC:%s\", RXSC_table[RXSC]);\n\tDCMD_Printf(BbDbgBuf);\n\t*/\n\n\n/*\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"dB Conversion: 10log(65)\", ODM_PWdB_Conversion(65,10,0));*/\n/*\tDCMD_Printf(BbDbgBuf);*/\n\n\t/* RX signal power and AGC related info*/\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF90 , bMaskDWord);\n\tpwDB = (u1Byte)((value32 & bMaskByte1) >> 8);\n\tpwDB = pwDB >> 1;\n\tsig_power = -110 + pwDB;\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"OFDM RX Signal Power(dB)\", sig_power);\n\tDCMD_Printf(BbDbgBuf);\n\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord);\n\tRX_SNR_pathA = (u1Byte)(value32 & 0xFF) >> 1;\n\tRF_gain_pathA = (s1Byte)((value32 & bMaskByte1) >> 8);\n\tRF_gain_pathA *= 2;\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord);\n\tRX_SNR_pathB = (u1Byte)(value32 & 0xFF) >> 1;\n\tRF_gain_pathB = (s1Byte)((value32 & bMaskByte1) >> 8);\n\tRF_gain_pathB *= 2;\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord);\n\tRX_SNR_pathC = (u1Byte)(value32 & 0xFF) >> 1;\n\tRF_gain_pathC = (s1Byte)((value32 & bMaskByte1) >> 8);\n\tRF_gain_pathC *= 2;\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord);\n\tRX_SNR_pathD = (u1Byte)(value32 & 0xFF) >> 1;\n\tRF_gain_pathD = (s1Byte)((value32 & bMaskByte1) >> 8);\n\tRF_gain_pathD *= 2;\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"OFDM RX RF Gain(A/B/C/D)\", RF_gain_pathA, RF_gain_pathA, RF_gain_pathC, RF_gain_pathD);\n\tDCMD_Printf(BbDbgBuf);\n\n\n\t/* RX Counter related info*/\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF08, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"OFDM CCA Counter\", ((value32&0xFFFF0000)>>16));\n\tDCMD_Printf(BbDbgBuf);\n\t\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xFD0, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"OFDM SBD Fail Counter\", value32&0xFFFF);\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xFC4, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d\", \"VHT SIGA/SIGB CRC8 Fail Counter\", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xFCC, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"CCK CCA Counter\", value32&0xFFFF);\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xFBC, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d\", \"LSIG (\\\"Parity Fail\\\"/\\\"Rate Illegal\\\") Counter\", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32_1 = ODM_GetBBReg(pDM_Odm, 0xFC8, bMaskDWord);\n\tvalue32_2 = ODM_GetBBReg(pDM_Odm, 0xFC0, bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d\", \"HT/VHT MCS NOT SUPPORT counter\", ((value32_2&0xFFFF0000)>>16), value32_1&0xFFFF);\n\tDCMD_Printf(BbDbgBuf);\n\n\n\t/* PostFFT related info*/\n\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF8c , bMaskDWord);\n\tRXEVM_0 = (s1Byte)((value32 & bMaskByte2) >> 16);\n\tRXEVM_0 /= 2;\n\tif (RXEVM_0 < -63)\n\t\tRXEVM_0 = 0;\n\n\tDCMD_Printf(BbDbgBuf);\n\tRXEVM_1 = (s1Byte)((value32 & bMaskByte3) >> 24);\n\tRXEVM_1 /= 2;\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF88 , bMaskDWord);\n\tRXEVM_2 = (s1Byte)((value32 & bMaskByte2) >> 16);\n\tRXEVM_2 /= 2;\n\n\tif (RXEVM_1 < -63)\n\t\tRXEVM_1 = 0;\n\tif (RXEVM_2 < -63)\n\t\tRXEVM_2 = 0;\n\n\t/*\n\tif(RX_BW == 0){\n\t\tRXEVM_0 -= evm_comp_20M;\n\t\tRXEVM_1 -= evm_comp_20M;\n\t\tRXEVM_2 -= evm_comp_20M;\n\t\t}\n\telse if(RX_BW == 1){\n\t\tRXEVM_0 -= evm_comp_40M;\n\t\tRXEVM_1 -= evm_comp_40M;\n\t\tRXEVM_2 -= evm_comp_40M;\n\t\t}\n\telse if (RX_BW == 2){\n\t\tRXEVM_0 -= evm_comp_80M;\n\t\tRXEVM_1 -= evm_comp_80M;\n\t\tRXEVM_2 -= evm_comp_80M;\n\t\t}\n\t\t*/\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d\", \"RXEVM (1ss/2ss/3ss)\", RXEVM_0, RXEVM_1, RXEVM_2);\n\tDCMD_Printf(BbDbgBuf);\n\n/*\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xD14 ,bMaskDWord);*/\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d / %d / %d\", \"RXSNR(A/B/C/D, dB)\", RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD);\n\tDCMD_Printf(BbDbgBuf);\n/*\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d\", \"B_RXSNR\", (value32&0xFF00)>>9);*/\n/*\tDCMD_Printf(BbDbgBuf);*/\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF8C , bMaskDWord);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d\", \"CSI_1st /CSI_2nd\", value32&0xFFFF, ((value32&0xFFFF0000)>>16));\n\tDCMD_Printf(BbDbgBuf);\n\n\n\t//BW & Mode Detection\n\n\t//Reset Page F Counter\n\tODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 1);\n\tODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 0);\n\n\t//CFO Report Info\n\t//Short CFO\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd0c , bMaskDWord);\n\tvalue32_1 = ODM_GetBBReg(pDM_Odm, 0xd4c , bMaskDWord);\n\tvalue32_2 = ODM_GetBBReg(pDM_Odm, 0xd8c , bMaskDWord);\n\tvalue32_3 = ODM_GetBBReg(pDM_Odm, 0xdcc , bMaskDWord);\n\n\tSFO_A = (s4Byte)(value32 & bMask12Bits);\n\tSFO_B = (s4Byte)(value32_1 & bMask12Bits);\n\tSFO_C = (s4Byte)(value32_2 & bMask12Bits);\n\tSFO_D = (s4Byte)(value32_3 & bMask12Bits);\n\n\tLFO_A = (s4Byte)(value32 >> 16);\n\tLFO_B = (s4Byte)(value32_1 >> 16);\n\tLFO_C = (s4Byte)(value32_2 >> 16);\n\tLFO_D = (s4Byte)(value32_3 >> 16);\n\n\t//SFO 2's to dec\n\tif (SFO_A > 2047)\n\t\tSFO_A = SFO_A - 4096;\n\tSFO_A = (SFO_A * 312500) / 2048;\n\n\tif (SFO_B > 2047)\n\t\tSFO_B = SFO_B - 4096;\n\tSFO_B = (SFO_B * 312500) / 2048;\n\tif (SFO_C > 2047)\n\t\tSFO_C = SFO_C - 4096;\n\tSFO_C = (SFO_C * 312500) / 2048;\n\tif (SFO_D > 2047)\n\t\tSFO_D = SFO_D - 4096;\n\tSFO_D = (SFO_D * 312500) / 2048;\n\n\t//LFO 2's to dec\n\n\tif (LFO_A > 4095)\n\t\tLFO_A = LFO_A - 8192;\n\n\tif (LFO_B > 4095)\n\t\tLFO_B = LFO_B - 8192;\n\n\tif (LFO_C > 4095)\n\t\tLFO_C = LFO_C - 8192;\n\n\tif (LFO_D > 4095)\n\t\tLFO_D = LFO_D - 8192;\n\tLFO_A = LFO_A * 312500 / 4096;\n\tLFO_B = LFO_B * 312500 / 4096;\n\tLFO_C = LFO_C * 312500 / 4096;\n\tLFO_D = LFO_D * 312500 / 4096;\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"CFO Report Info\");\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d/ %d/ %d\", \"  Short CFO(Hz) <A/B/C/D>\", SFO_A, SFO_B, SFO_C, SFO_D);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d/ %d/ %d\", \"  Long CFO(Hz) <A/B/C/D>\", LFO_A, LFO_B, LFO_C, LFO_D);\n\tDCMD_Printf(BbDbgBuf);\n\n\t//SCFO\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd10 , bMaskDWord);\n\tvalue32_1 = ODM_GetBBReg(pDM_Odm, 0xd50 , bMaskDWord);\n\tvalue32_2 = ODM_GetBBReg(pDM_Odm, 0xd90 , bMaskDWord);\n\tvalue32_3 = ODM_GetBBReg(pDM_Odm, 0xdd0 , bMaskDWord);\n\n\tSFO_A = (s4Byte)(value32 & 0x7ff);\n\tSFO_B = (s4Byte)(value32_1 & 0x7ff);\n\tSFO_C = (s4Byte)(value32_2 & 0x7ff);\n\tSFO_D = (s4Byte)(value32_3 & 0x7ff);\n\n\tif (SFO_A > 1023)\n\t\tSFO_A = SFO_A - 2048;\n\n\tif (SFO_B > 2047)\n\t\tSFO_B = SFO_B - 4096;\n\n\tif (SFO_C > 2047)\n\t\tSFO_C = SFO_C - 4096;\n\n\tif (SFO_D > 2047)\n\t\tSFO_D = SFO_D - 4096;\n\n\tSFO_A = SFO_A * 312500 / 1024;\n\tSFO_B = SFO_B * 312500 / 1024;\n\tSFO_C = SFO_C * 312500 / 1024;\n\tSFO_D = SFO_D * 312500 / 1024;\n\n\tLFO_A = (s4Byte)(value32 >> 16);\n\tLFO_B = (s4Byte)(value32_1 >> 16);\n\tLFO_C = (s4Byte)(value32_2 >> 16);\n\tLFO_D = (s4Byte)(value32_3 >> 16);\n\n\tif (LFO_A > 4095)\n\t\tLFO_A = LFO_A - 8192;\n\n\tif (LFO_B > 4095)\n\t\tLFO_B = LFO_B - 8192;\n\n\tif (LFO_C > 4095)\n\t\tLFO_C = LFO_C - 8192;\n\n\tif (LFO_D > 4095)\n\t\tLFO_D = LFO_D - 8192;\n\tLFO_A = LFO_A * 312500 / 4096;\n\tLFO_B = LFO_B * 312500 / 4096;\n\tLFO_C = LFO_C * 312500 / 4096;\n\tLFO_D = LFO_D * 312500 / 4096;\n\t\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d/ %d/ %d\", \"  Value SCFO(Hz) <A/B/C/D>\", SFO_A, SFO_B, SFO_C, SFO_D);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d/ %d/ %d\", \"  ACQ CFO(Hz) <A/B/C/D>\", LFO_A, LFO_B, LFO_C, LFO_D);\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord);\n\tvalue32_1 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord);\n\tvalue32_2 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord);\n\tvalue32_3 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord);\n\n\tLFO_A = (s4Byte)(value32 >> 16);\n\tLFO_B = (s4Byte)(value32_1 >> 16);\n\tLFO_C = (s4Byte)(value32_2 >> 16);\n\tLFO_D = (s4Byte)(value32_3 >> 16);\n\n\tif (LFO_A > 4095)\n\t\tLFO_A = LFO_A - 8192;\n\n\tif (LFO_B > 4095)\n\t\tLFO_B = LFO_B - 8192;\n\n\tif (LFO_C > 4095)\n\t\tLFO_C = LFO_C - 8192;\n\n\tif (LFO_D > 4095)\n\t\tLFO_D = LFO_D - 8192;\n\n\tLFO_A = LFO_A * 312500 / 4096;\n\tLFO_B = LFO_B * 312500 / 4096;\n\tLFO_C = LFO_C * 312500 / 4096;\n\tLFO_D = LFO_D * 312500 / 4096;\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %d / %d/ %d/ %d\", \"  End CFO(Hz) <A/B/C/D>\", LFO_A, LFO_B, LFO_C, LFO_D);\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf20 , bMaskDWord);  /*L SIG*/\n\n\tTail = (u1Byte)((value32 & 0xfc0000) >> 16);\n\tParity = (u1Byte)((value32 & 0x20000) >> 16);\n\tLength = (u2Byte)((value32 & 0x1ffe00) >> 8);\n\trsv = (u1Byte)(value32 & 0x10);\n\tMCSS = (u1Byte)(value32 & 0x0f);\n\n\tswitch (MCSS) {\n\tcase 0x0b:\n\t\tidx = 0;\n\t\tbreak;\n\tcase 0x0f:\n\t\tidx = 1;\n\t\tbreak;\n\tcase 0x0a:\n\t\tidx = 2;\n\t\tbreak;\n\tcase 0x0e:\n\t\tidx = 3;\n\t\tbreak;\n\tcase 0x09:\n\t\tidx = 4;\n\t\tbreak;\n\tcase 0x08:\n\t\tidx = 5;\n\t\tbreak;\n\tcase 0x0c:\n\t\tidx = 6;\n\t\tbreak;\n\tdefault:\n\t\tidx = 6;\n\t\tbreak;\n\n\t}\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"L-SIG\");\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n   Rate:%s\", L_rate[idx]);\t\t\n\tDCMD_Printf(BbDbgBuf);\t\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x/ %x /%x\", \"  Rsv/Length/Parity\", rsv, RX_BW, Length);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"HT-SIG1\");\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord);  /*HT SIG*/\n\tif (RX_HT == 1) {\n\n\t\tHMCSS = (u1Byte)(value32 & 0x7F);\n\t\tHRX_BW = (u1Byte)(value32 & 0x80);\n\t\tHLength = (u2Byte)((value32 >> 8) & 0xffff);\n\t}\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x\", \"  MCS/BW/Length\", HMCSS, HRX_BW, HLength);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"HT-SIG2\");\n\tDCMD_Printf(BbDbgBuf);\n\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord);  /*HT SIG*/\n\n\tif (RX_HT == 1) {\n\t\tsmooth = (u1Byte)(value32 & 0x01);\n\t\thtsound = (u1Byte)(value32 & 0x02);\n\t\trsv = (u1Byte)(value32 & 0x04);\n\t\tagg = (u1Byte)(value32 & 0x08);\n\t\tstbc = (u1Byte)(value32 & 0x30);\n\t\tfec = (u1Byte)(value32 & 0x40);\n\t\tsgi = (u1Byte)(value32 & 0x80);\n\t\thtltf = (u1Byte)((value32 & 0x300) >> 8);\n\t\thtcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8);\n\t\tTail = (u1Byte)((value32 & 0xfc0000) >> 16);\n\n\n\t}\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x/ %x/ %x/ %x\", \"  Smooth/NoSound/Rsv/Aggregate/STBC/LDPC\", smooth, htsound, rsv, agg, stbc, fec);\n\tDCMD_Printf(BbDbgBuf);\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x/ %x\", \"  SGI/E-HT-LTFs/CRC/Tail\", sgi, htltf, htcrc8, Tail);\n\tDCMD_Printf(BbDbgBuf);\n\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"VHT-SIG-A1\");\n\tDCMD_Printf(BbDbgBuf);\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord);  /*VHT SIG A1*/\n\tif (RX_HT == 2) {\n\t\t/* value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);*/\n\t\tvRX_BW = (u1Byte)(value32 & 0x03);\n\t\tvrsv = (u1Byte)(value32 & 0x04);\n\t\tvstbc = (u1Byte)(value32 & 0x08);\n\t\tvgid = (u1Byte)((value32 & 0x3f0) >> 4);\n\t\tvNsts = (u1Byte)(((value32 & 0x1c00) >> 8) + 1);\n\t\tvpaid = (u2Byte)(value32 & 0x3fe);\n\t\tvtxops = (u1Byte)((value32 & 0x400000) >> 20);\n\t\tvrsv2 = (u1Byte)((value32 & 0x800000) >> 20);\n\t}\n\n\t/*rsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x\", \"F2C\", value32);*/\n\t/*DCMD_Printf(BbDbgBuf);*/\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x/ %x/ %x/ %x /%x /%x\", \"  BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2\", vRX_BW, vrsv, vstbc, vgid, vNsts, vpaid, vtxops, vrsv2);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"VHT-SIG-A2\");\n\tDCMD_Printf(BbDbgBuf);\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord);  /*VHT SIG*/\n\n\n\tif (RX_HT == 2) {\n\t\t/*value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); */  /*VHT SIG*/\n\n\t\t//sgi=(u1Byte)(value32&0x01);\n\t\tsgiext = (u1Byte)(value32 & 0x03);\n\t\t//fec = (u1Byte)(value32&0x04);\n\t\tfecext = (u1Byte)(value32 & 0x0C);\n\n\t\tvMCSS = (u1Byte)(value32 & 0xf0);\n\t\tbf = (u1Byte)((value32 & 0x100) >> 8);\n\t\tvrsv = (u1Byte)((value32 & 0x200) >> 8);\n\t\tvhtcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8);\n\t\tvTail = (u1Byte)((value32 & 0xfc0000) >> 16);\n\t}\n\t/*rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x\", \"F30\", value32);*/\n\t/*DCMD_Printf(BbDbgBuf);*/\n\t\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x/ %x/ %x/ %x/ %x\", \"  SGI/FEC/MCS/BF/Rsv/CRC/Tail\", sgiext, fecext, vMCSS, bf, vrsv, vhtcrc8, vTail);\n\tDCMD_Printf(BbDbgBuf);\n\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s\", \"VHT-SIG-B\");\n\tDCMD_Printf(BbDbgBuf);\n\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xf34 , bMaskDWord);  /*VHT SIG*/\n\t{\n\t\tvLength = (u2Byte)(value32 & 0x1fffff);\n\t\tvbrsv = (u1Byte)((value32 & 0x600000) >> 20);\n\t\tvbTail = (u2Byte)((value32 & 0x1f800000) >> 20);\n\t\tvbcrc = (u1Byte)((value32 & 0x80000000) >> 28);\n\n\t}\n\t/*rsprintf(BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x\", \"F34\", value32);*/\n\t/*DCMD_Printf(BbDbgBuf);*/\n\trsprintf((char *)BbDbgBuf, BT_TMP_BUF_SIZE, \"\\r\\n %-35s = %x / %x/ %x/ %x/\", \"  Length/Rsv/Tail/CRC\", vLength, vbrsv, vbTail, vbcrc);\n\tDCMD_Printf(BbDbgBuf);\n\n\n}\n\nvoid phydm_sbd_check(\n\tIN\tPDM_ODM_T\t\t\t\t\tpDM_Odm\n)\n{\n\tstatic u4Byte\tpkt_cnt = 0;\n\tstatic BOOLEAN sbd_state = 0;\n\tu4Byte\tsym_count, count, value32;\n\n\tif (sbd_state == 0) {\n\t\tpkt_cnt++;\n\t\tif (pkt_cnt % 5 == 0) { /*read SBD conter once every 5 packets*/\n\t\t\tODM_SetTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer, 0); /*ms*/\n\t\t\tsbd_state = 1;\n\t\t}\n\t} else { /*read counter*/\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xF98, bMaskDWord);\n\t\tsym_count = (value32 & 0x7C000000) >> 26;\n\t\tcount = (value32 & 0x3F00000) >> 20;\n\t\tDbgPrint(\"#SBD#    sym_count   %d   count   %d\\n\", sym_count, count);\n\t\tsbd_state = 0;\n\t}\n}\n\nvoid phydm_sbd_callback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n#if USE_WORKITEM\n\tODM_ScheduleWorkItem(&pDM_Odm->sbdcnt_workitem);\n#else\n\tphydm_sbd_check(pDM_Odm);\n#endif\n}\n\nvoid phydm_sbd_workitem_callback(\n\tIN PVOID            pContext\n)\n{\n\tPADAPTER\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tphydm_sbd_check(pDM_Odm);\n}\n#endif\nVOID\nphydm_BasicDbgMessage\n(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm , PHYDM_FALSEALMCNT);\n\tpDIG_T\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tu1Byte\tlegacy_table[12] = {1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54};\n\tu1Byte\tvht_en = ((pDM_Odm->RxRate) >= ODM_RATEVHTSS1MCS0) ? 1 : 0;\n\n\tif (pDM_Odm->RxRate <= ODM_RATE11M) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[CCK AGC Report] LNA_idx = 0x%x, VGA_idx = 0x%x\\n\",\n\t\t\tpDM_Odm->cck_lna_idx, pDM_Odm->cck_vga_idx));\t\t\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[OFDM AGC Report] { 0x%x, 0x%x, 0x%x, 0x%x }\\n\",\n\t\t\tpDM_Odm->ofdm_agc_idx[0], pDM_Odm->ofdm_agc_idx[1], pDM_Odm->ofdm_agc_idx[2], pDM_Odm->ofdm_agc_idx[3]));\t\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"RSSI: { %d,  %d,  %d,  %d },    RxRate: { %s%s%s%s%d%s}\\n\",\n\t\t(pDM_Odm->RSSI_A == 0xff) ? 0 : pDM_Odm->RSSI_A , \n\t\t(pDM_Odm->RSSI_B == 0xff) ? 0 : pDM_Odm->RSSI_B , \n\t\t(pDM_Odm->RSSI_C == 0xff) ? 0 : pDM_Odm->RSSI_C, \n\t\t(pDM_Odm->RSSI_D == 0xff) ? 0 : pDM_Odm->RSSI_D,\n\t\t((pDM_Odm->RxRate >= ODM_RATEVHTSS1MCS0) && (pDM_Odm->RxRate <= ODM_RATEVHTSS1MCS9)) ? \"VHT 1ss  \" : \"\",\n\t\t((pDM_Odm->RxRate >= ODM_RATEVHTSS2MCS0) && (pDM_Odm->RxRate <= ODM_RATEVHTSS2MCS9)) ? \"VHT 2ss \" : \"\",\n\t\t((pDM_Odm->RxRate >= ODM_RATEVHTSS3MCS0) && (pDM_Odm->RxRate <= ODM_RATEVHTSS3MCS9)) ? \"VHT 3ss \" : \"\",\n\t\t(pDM_Odm->RxRate >= ODM_RATEMCS0) ? \"MCS \" : \"\",\n\t\t(vht_en) ? ((pDM_Odm->RxRate - ODM_RATEVHTSS1MCS0)%10) : ((pDM_Odm->RxRate >= ODM_RATEMCS0) ? (pDM_Odm->RxRate - ODM_RATEMCS0) : ((pDM_Odm->RxRate <= ODM_RATE54M)?legacy_table[pDM_Odm->RxRate]:0)),\n\t\t(pDM_Odm->RxRate >= ODM_RATEMCS0) ? \"\" : \"M\"));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\\n\",\t\n\t\tFalseAlmCnt->Cnt_CCK_CCA, FalseAlmCnt->Cnt_OFDM_CCA, FalseAlmCnt->Cnt_CCA_all));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\\n\",\t\n\t\tFalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"[OFDM FA Detail] Parity_Fail = (( %d )), Rate_Illegal = (( %d )), CRC8_fail = (( %d )), Mcs_fail = (( %d )), Fast_Fsync = (( %d )), SB_Search_fail = (( %d ))\\n\",\t\n\t\tFalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail, FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"bLinked = %d, RSSI_Min = %d, CurrentIGI = 0x%x, bNoisy=%d\\n\\n\",\n\t\tpDM_Odm->bLinked, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue, pDM_Odm->NoisyDecision));    \n/*\n\ttemp_reg = ODM_GetBBReg(pDM_Odm, 0xDD0, bMaskByte0);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"0xDD0 = 0x%x\\n\",temp_reg));\n\t\t\n\ttemp_reg = ODM_GetBBReg(pDM_Odm, 0xDDc, bMaskByte1);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"0xDDD = 0x%x\\n\",temp_reg));\n\t\n\ttemp_reg = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskByte0);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"0xC50 = 0x%x\\n\",temp_reg));\n\n\ttemp_reg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0x3fe0);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"RF 0x0[13:5] = 0x%x\\n\\n\",temp_reg));\n*/\t\n\n#endif\n}\n\n\nVOID phydm_BasicProfile(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tchar  *Cut = NULL;\n\tchar *ICType = NULL;\n\tu4Byte used = *_used;\n\tu4Byte out_len = *_out_len;\n\tu4Byte\tcommit_ver = 0;\n\tu4Byte\tdate = 0;\n\tchar\t*commit_by = NULL;\n\tu4Byte\trelease_ver = 0;\n\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"%-35s\\n\", \"% Basic Profile %\"));\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8192C)\t\t\t\n\t\tICType = \"RTL8192C\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8192D)\n\t\tICType = \"RTL8192D\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8723A)\n\t\tICType = \"RTL8723A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\tICType = \"RTL8188E\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8812)\n\t\tICType = \"RTL8812A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8821)\n\t\tICType = \"RTL8821A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\tICType = \"RTL8192E\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\tICType = \"RTL8723B\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\tICType = \"RTL8814A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8881A)\n\t\tICType = \"RTL8881A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8821B)\n\t\tICType = \"RTL8821B\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\tICType = \"RTL8822B\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\t#if (RTL8703B_SUPPORT == 1)\n\t\tICType = \"RTL8703B\";\n\t\tcommit_ver = SVN_COMMIT_VERSION_8703B;\n\t\tdate = RELEASE_DATE_8703B;\n\t\tcommit_by = COMMIT_BY_8703B;\n\t\trelease_ver = RELEASE_VERSION_8703B;\n\t\t#endif\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8195A)\n\t\tICType = \"RTL8195A\";\n\telse if (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\tICType = \"RTL8188F\";\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s (MP Chip: %s)\\n\", \"IC Type\", ICType, pDM_Odm->bIsMPChip ? \"Yes\" : \"No\"));\n\n\tif (pDM_Odm->CutVersion == ODM_CUT_A)\t\t\t\n\t\tCut = \"A\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_B)            \n\t\tCut = \"B\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_C)            \n\t\tCut = \"C\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_D)            \n\t\tCut = \"D\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_E)            \n\t\tCut = \"E\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_F)            \n\t\tCut = \"F\";\n\telse if (pDM_Odm->CutVersion == ODM_CUT_I)            \n\t\tCut = \"I\";\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Cut Version\", Cut));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d\\n\", \"PHY Parameter Version\", ODM_GetHWImgVersion(pDM_Odm)));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d\\n\", \"PHY Parameter Commit Version\", commit_ver));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d\\n\", \"PHY Parameter Commit date\", date));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"PHY Parameter Commit by\", commit_by));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d\\n\", \"PHY Parameter Release Version\", release_ver));\n\t\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t{\n\t\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d (Subversion: %d)\\n\", \"FW Version\", Adapter->MgntInfo.FirmwareVersion, Adapter->MgntInfo.FirmwareSubVersion));\n\t}\n#elif (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t{\n\t\tstruct rtl8192cd_priv *priv = pDM_Odm->priv;\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d (Subversion: %d)\\n\", \"FW Version\", priv->pshare->fw_version, priv->pshare->fw_sub_version));\n\t}\n#else\n\t{\n\t\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\t\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %d (Subversion: %d)\\n\", \"FW Version\", pHalData->FirmwareVersion, pHalData->FirmwareSubVersion));\n\t}\n#endif\n\t//1 PHY DM Version List\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"%-35s\\n\", \"% PHYDM Version %\"));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Adaptivity\", ADAPTIVITY_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"DIG\", DIG_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Dynamic BB PowerSaving\", DYNAMIC_BBPWRSAV_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"CFO Tracking\", CFO_TRACKING_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Antenna Diversity\", ANTDIV_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Power Tracking\", POWRTRACKING_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Dynamic TxPower\", DYNAMIC_TXPWR_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"RA Info\", RAINFO_VERSION));\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Antenna Detection\", ANTDECT_VERSION));\n#endif\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Auto Channel Selection\", ACS_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"EDCA Turbo\", EDCATURBO_VERSION));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"Path Diversity\", PATHDIV_VERSION));\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"RxHP\", RXHP_VERSION));\n#endif\n#if (RTL8822B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s: %s\\n\", \"PHY config 8822B\", PHY_CONFIG_VERSION_8822B));\n\t\n#endif\n\t*_used = used;\n\t*_out_len = out_len;\n\n}\n\nVOID\nphydm_fw_trace_en_h2c(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tBOOLEAN\t\tenable,\n\tIN\tu4Byte\t\tmonitor_mode,\n\tIN\tu4Byte\t\tmacid\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\t\tH2C_Parameter[3] = {0};\n\n\tH2C_Parameter[0] = enable;\n\tH2C_Parameter[1] = (u1Byte)monitor_mode;\n\tH2C_Parameter[2] = (u1Byte)macid;\n\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"---->\\n\"));\n\tif (monitor_mode == 0){\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[H2C] FW_debug_en: (( %d ))\\n\", enable));\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[H2C] FW_debug_en: (( %d )), mode: (( %d )), macid: (( %d ))\\n\", enable, monitor_mode, macid));\n\t}\n\tODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_FW_TRACE_EN, 3, H2C_Parameter);\n}\n\nVOID\nphydm_get_per_path_txagc(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tpath,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\trate_idx;\n\tu1Byte\t\t\ttxagc;\n\tu4Byte\t\t\tused = *_used;\n\tu4Byte\t\t\tout_len = *_out_len;\n\n#if (RTL8822B_SUPPORT == 1)\n\tif ((pDM_Odm->SupportICType & ODM_RTL8822B) && (path <= ODM_RF_PATH_B)) {\n\t\tfor (rate_idx = 0; rate_idx <= 0x53; rate_idx++) {\n\t\t\tif (rate_idx == ODM_RATE1M)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %-35s\\n\", \"CCK====>\"));\n\t\t\telse if (rate_idx == ODM_RATE6M)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"OFDM====>\"));\n\t\t\telse if (rate_idx == ODM_RATEMCS0)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"HT 1ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEMCS8)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"HT 2ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEMCS16)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"HT 3ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEMCS24)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"HT 4ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEVHTSS1MCS0)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"VHT 1ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEVHTSS2MCS0)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"VHT 2ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEVHTSS3MCS0)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"VHT 3ss====>\"));\n\t\t\telse if (rate_idx == ODM_RATEVHTSS4MCS0)\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n  %-35s\\n\", \"VHT 4ss====>\"));\n\t\t\t\n\t\t\ttxagc = config_phydm_read_txagc_8822b(pDM_Odm, path, rate_idx);\n\t\t\tif (config_phydm_read_txagc_check_8822b(txagc))\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  0x%02x    \", txagc));\n\t\t\telse\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  0x%s    \", \"xx\"));\n\t\t}\n\t}\n#endif\n}\n\n\nVOID\nphydm_get_txagc(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tused = *_used;\n\tu4Byte\t\t\tout_len = *_out_len;\n\t\n\t/* Path-A */\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"%-35s\\n\", \"Path-A====================\"));\n\tphydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_A, _used, output, _out_len);\n\t\n\t/* Path-B */\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n%-35s\\n\", \"Path-B====================\"));\n\tphydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_B, _used, output, _out_len);\n\n\t/* Path-C */\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n%-35s\\n\", \"Path-C====================\"));\n\tphydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_C, _used, output, _out_len);\n\n\t/* Path-D */\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n%-35s\\n\", \"Path-D====================\"));\n\tphydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_D, _used, output, _out_len);\n\n}\n\nVOID\nphydm_set_txagc(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tused = *_used;\n\tu4Byte\t\t\tout_len = *_out_len;\n\n#if (RTL8822B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType & ODM_RTL8822B) {\n\t\tif (dm_value[0] <= 1) {\n\t\t\tif (phydm_write_txagc_1byte_8822b(pDM_Odm, dm_value[2], dm_value[0], (u1Byte)dm_value[1]))\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %s%d   %s%x%s%x\\n\", \"Write path-\", dm_value[0], \"rate index-0x\", dm_value[1], \" = 0x\", dm_value[2]));\n\t\t\telse\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %s%d   %s%x%s\\n\", \"Write path-\", (dm_value[0] & 0x1), \"rate index-0x\", (dm_value[1] & 0x7f), \" fail\"));\n\t\t} else {\n\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"  %s%d   %s%x%s\\n\", \"Write path-\", (dm_value[0] & 0x1), \"rate index-0x\", (dm_value[1] & 0x7f), \" fail\"));\n\t\t}\n\t}\n#endif\n}\n\nVOID\nodm_debug_trace(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu8Byte\t\t\tpre_debug_components, one = 1;\n\tu4Byte used = *_used;\n\tu4Byte out_len = *_out_len;\n\n\tpre_debug_components = pDM_Odm->DebugComponents;\n\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n%s\\n\", \"================================\"));\n\tif (dm_value[0] == 100) {\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"[Debug Message] PhyDM Selection\"));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"================================\"));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"00. (( %s ))DIG\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_DIG) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"01. (( %s ))RA_MASK\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_RA_MASK) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"02. (( %s ))DYNAMIC_TXPWR\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_TXPWR) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"03. (( %s ))FA_CNT\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_FA_CNT) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"04. (( %s ))RSSI_MONITOR\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_RSSI_MONITOR) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"05. (( %s ))CCK_PD\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_CCK_PD) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"06. (( %s ))ANT_DIV\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_ANT_DIV) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"07. (( %s ))PWR_SAVE\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_PWR_SAVE) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"08. (( %s ))PWR_TRAIN\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_PWR_TRAIN) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"09. (( %s ))RATE_ADAPTIVE\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_RATE_ADAPTIVE) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"10. (( %s ))PATH_DIV\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_PATH_DIV) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"11. (( %s ))PSD\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_PSD) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"12. (( %s ))DYNAMIC_PRICCA\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_PRICCA) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"13. (( %s ))RXHP\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_RXHP) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"14. (( %s ))MP\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_MP) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"15. (( %s ))CFO_TRACKING\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_CFO_TRACKING) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"16. (( %s ))ACS\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_ACS) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"17. (( %s ))ADAPTIVITY\\n\", ((pDM_Odm->DebugComponents & PHYDM_COMP_ADAPTIVITY) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"18. (( %s ))RA_DBG\\n\", ((pDM_Odm->DebugComponents & PHYDM_COMP_RA_DBG) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"20. (( %s ))EDCA_TURBO\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_EDCA_TURBO) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"21. (( %s ))EARLY_MODE\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_EARLY_MODE) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"22. (( %s ))FW_DEBUG_TRACE\\n\", ((pDM_Odm->DebugComponents & ODM_FW_DEBUG_TRACE) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"24. (( %s ))TX_PWR_TRACK\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_TX_PWR_TRACK) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"25. (( %s ))RX_GAIN_TRACK\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_RX_GAIN_TRACK) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"26. (( %s ))CALIBRATION\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_CALIBRATION) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"28. (( %s ))PHY_CONFIG\\n\", ((pDM_Odm->DebugComponents & ODM_PHY_CONFIG) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"29. (( %s ))BEAMFORMING_DEBUG\\n\", ((pDM_Odm->DebugComponents & BEAMFORMING_DEBUG) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"30. (( %s ))COMMON\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_COMMON) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"31. (( %s ))INIT\\n\", ((pDM_Odm->DebugComponents & ODM_COMP_INIT) ? (\"V\") : (\".\"))));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"================================\"));\n\n\t} else if (dm_value[0] == 101) {\n\t\tpDM_Odm->DebugComponents = 0;\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"Disable all debug components\"));\n\t} else {\n\t\tif (dm_value[1] == 1) { /*enable*/\n\t\t\tpDM_Odm->DebugComponents |= (one << dm_value[0]);\n\n\t\t\tif (dm_value[0] == 22) { /*FW trace function*/\n\t\t\t\tphydm_fw_trace_en_h2c(pDM_Odm, 1, dm_value[2], dm_value[3]); /*H2C to enable C2H Msg*/\n\t\t\t}\n\t\t} else if (dm_value[1] == 2) { /*disable*/\n\t\t\tpDM_Odm->DebugComponents &= ~(one << dm_value[0]);\n\n\t\t\tif (dm_value[0] == 22) { /*FW trace function*/\n\t\t\t\tphydm_fw_trace_en_h2c(pDM_Odm, 0, dm_value[2], dm_value[3]); /*H2C to disable C2H Msg*/\n\t\t\t}\n\t\t} else\n\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"[Warning!!!]  1:enable,  2:disable\"));\n\t}\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"pre-DbgComponents = 0x%x\\n\", (u4Byte)pre_debug_components));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"Curr-DbgComponents = 0x%x\\n\", ((u4Byte)pDM_Odm->DebugComponents)));\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"%s\\n\", \"================================\"));\n}\n\nVOID\nphydm_DumpBbReg(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tAddr = 0;\n\t\n\t/* BB Reg */\n\tfor (Addr = 0x800; Addr < 0xfff; Addr += 4)\n\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8814A)) {\n\n\t\tif (pDM_Odm->RFType > ODM_2T2R) {\n\t\t\tfor (Addr = 0x1800; Addr < 0x18ff; Addr += 4)\n\t\t\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\t\t}\n\n\t\tif (pDM_Odm->RFType > ODM_3T3R) {\n\t\t\tfor (Addr = 0x1a00; Addr < 0x1aff; Addr += 4)\n\t\t\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\t\t}\n\n\t\tfor (Addr = 0x1900; Addr < 0x19ff; Addr += 4)\n\t\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\n\t\tfor (Addr = 0x1c00; Addr < 0x1cff; Addr += 4)\n\t\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\n\t\tfor (Addr = 0x1f00; Addr < 0x1fff; Addr += 4)\n\t\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\t}\n}\n\nVOID\nphydm_DumpAllReg(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\tAddr = 0;\n\n\t/* dump MAC register */\n\tDbgPrint(\"MAC==========\\n\");\n\tfor (Addr = 0; Addr < 0x7ff; Addr += 4)\n\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\n\tfor (Addr = 1000; Addr < 0x17ff; Addr += 4)\n\t\tDbgPrint(\"%04x %08x\\n\", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord));\n\n\t/* dump BB register */\n\tDbgPrint(\"BB==========\\n\");\n\tphydm_DumpBbReg(pDM_Odm);\n\n\t/* dump RF register */\n\tDbgPrint(\"RF-A==========\\n\");\n\tfor (Addr = 0; Addr < 0xFF; Addr++)\n\t\tDbgPrint(\"%02x %05x\\n\", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Addr, bRFRegOffsetMask));\n\n\tif (pDM_Odm->RFType > ODM_1T1R) {\n\t\tDbgPrint(\"RF-B==========\\n\");\n\t\tfor (Addr = 0; Addr < 0xFF; Addr++)\n\t\t\tDbgPrint(\"%02x %05x\\n\", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Addr, bRFRegOffsetMask));\n\t}\n\n\tif (pDM_Odm->RFType > ODM_2T2R) {\n\t\tDbgPrint(\"RF-C==========\\n\");\n\t\tfor (Addr = 0; Addr < 0xFF; Addr++)\n\t\t\tDbgPrint(\"%02x %05x\\n\", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_C, Addr, bRFRegOffsetMask));\n\t}\n\n\tif (pDM_Odm->RFType > ODM_3T3R) {\n\t\tDbgPrint(\"RF-D==========\\n\");\n\t\tfor (Addr = 0; Addr < 0xFF; Addr++)\n\t\t\tDbgPrint(\"%02x %05x\\n\", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_D, Addr, bRFRegOffsetMask));\n\t}\n}\n\nstruct _PHYDM_COMMAND {\n\tchar name[16];\n\tu1Byte id;\n};\n\nenum PHYDM_CMD_ID {\n\tPHYDM_DEMO,\n\tPHYDM_RA,\n\tPHYDM_PROFILE,\n\tPHYDM_PATHDIV,\n\tPHYDM_DEBUG,\n\tPHYDM_SUPPORT_ABILITY,\n\tPHYDM_GET_TXAGC,\n\tPHYDM_SET_TXAGC,\n\tPHYDM_SMART_ANT,\n\tPHYDM_API,\n\tPHYDM_TRX_PATH,\n\tPHYDM_LA_MODE,\n\tPHYDM_DUMP_REG,\n\tPHYDM_NBI_EN\n};\n\nstruct _PHYDM_COMMAND phy_dm_ary[] = {\n\t{\"demo\", PHYDM_DEMO},\n\t{\"ra\", PHYDM_RA},\n\t{\"profile\", PHYDM_PROFILE},\n\t{\"pathdiv\", PHYDM_PATHDIV},\n\t{\"dbg\", PHYDM_DEBUG},\n\t{\"ability\", PHYDM_SUPPORT_ABILITY},\n\t{\"get_txagc\", PHYDM_GET_TXAGC},\n\t{\"set_txagc\", PHYDM_SET_TXAGC},\n\t{\"smtant\", PHYDM_SMART_ANT},\n\t{\"api\", PHYDM_API},\n\t{\"trxpath\", PHYDM_TRX_PATH},\n\t{\"lamode\", PHYDM_LA_MODE},\n\t{\"dumpreg\", PHYDM_DUMP_REG},\n\t{\"nbi\", PHYDM_NBI_EN}\n};\n\nVOID\nphydm_cmd_parser(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN char\t\tinput[][MAX_ARGV],\n\tIN u4Byte\tinput_num,\n\tIN u1Byte\tflag,\n\tOUT char\t*output,\n\tIN u4Byte\tout_len\n)\n{\n\tu4Byte used = 0;\n\tu1Byte id = 0;\n\tint var1[5] = {0};\n\tint i, input_idx = 0;\n\n\tif (flag == 0) {\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"GET, nothing to print\\n\"));\n\t\treturn;\n\t}\n\n\tPHYDM_SNPRINTF((output + used, out_len - used, \"\\n\"));\n\n\t//Parsing Cmd ID\n\tif (input_num) {\n\t\tint n, i;\n\n\t\tn = sizeof(phy_dm_ary) / sizeof(struct _PHYDM_COMMAND);\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tif (strcmp(phy_dm_ary[i].name, input[0]) == 0) {\n\t\t\t\tid = phy_dm_ary[i].id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i == n) {\n\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"SET, command not found!\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tswitch (id) {\n\tcase PHYDM_DEMO: /*echo demo 10 0x3a z abcde >cmd*/\n\t\t\t{\n\t\t\t\tu4Byte   directory = 0;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\t\t\t\t\n\t\t\t\tchar   char_temp;\n#else\n\t\t\t\tu4Byte char_temp = ' ';\n#endif\n\t\tPHYDM_SSCANF(input[1], DCMD_DECIMAL, &directory);\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"Decimal Value = %d\\n\", directory));\n\t\tPHYDM_SSCANF(input[2], DCMD_HEX, &directory);\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"Hex Value = 0x%x\\n\", directory));\n\t\tPHYDM_SSCANF(input[3], DCMD_CHAR, &char_temp);\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"Char = %c\\n\", char_temp));\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"String = %s\\n\", input[4]));\n\t}\n\tbreak;\n\n\tcase PHYDM_RA:\n\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\n\t\t\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"new SET, RA_var[%d]= (( %d ))\\n\", i , var1[i]));\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"odm_RA_debug\\n\"));*/\n#if (defined(CONFIG_RA_DBG_CMD))\n\t\t\todm_RA_debug((PVOID)pDM_Odm, var1);\n#endif\n\t\t}\n\n\n\t\tbreak;\n\n\tcase PHYDM_PATHDIV:\n\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\n\n\t\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"new SET, PATHDIV_var[%d]= (( %d ))\\n\", i , var1[i]));*/\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"odm_PATHDIV_debug\\n\"));*/\n#if (defined(CONFIG_PATH_DIVERSITY))\n\t\t\todm_pathdiv_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n#endif\n\t\t}\n\n\t\tbreak;\n\n\tcase PHYDM_DEBUG:\n\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\n\t\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"new SET, Debug_var[%d]= (( %d ))\\n\", i , var1[i]));*/\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"odm_debug_comp\\n\"));*/\n\t\t\todm_debug_trace(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n\t\t}\n\n\n\t\tbreak;\n\n\tcase PHYDM_SUPPORT_ABILITY:\n\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\n\t\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"new SET, support ablity_var[%d]= (( %d ))\\n\", i , var1[i]));*/\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"support ablity\\n\"));*/\n\t\t\tphydm_support_ablity_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n\t\t}\n\n\t\tbreak;\n\t\t\n\tcase PHYDM_SMART_ANT:\n\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t\t\t#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\n\t\t\tphydm_hl_smart_ant_cmd(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n\t\t\t#endif\n\t\t\t#endif\n\t\t}\n\n\t\tbreak;\n\n\tcase PHYDM_API:\n#if (RTL8822B_SUPPORT == 1)\n\t{\n\t\tif (pDM_Odm->SupportICType & ODM_RTL8822B) {\n\t\t\tBOOLEAN\tbEnableDbgMode;\n\t\t\tu1Byte central_ch, primary_ch_idx, bandwidth;\n\t\t\t\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tif (input[i + 1])\n\t\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\t\t\t}\n\t\t\t\n\t\t\tbEnableDbgMode = (BOOLEAN)var1[0];\n\t\t\tcentral_ch = (u1Byte) var1[1];\n\t\t\tprimary_ch_idx = (u1Byte) var1[2];\n\t\t\tbandwidth = (ODM_BW_E) var1[3];\n\n\t\t\tif (bEnableDbgMode) {\n\t\t\t\tpDM_Odm->bDisablePhyApi = FALSE;\n\t\t\tconfig_phydm_switch_channel_bw_8822b(pDM_Odm, central_ch, primary_ch_idx, bandwidth);\n\t\t\t\tpDM_Odm->bDisablePhyApi = TRUE;\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"central_ch = %d, primary_ch_idx = %d, bandwidth = %d\\n\", central_ch, primary_ch_idx, bandwidth));\n\t\t\t} else {\n\t\t\t\tpDM_Odm->bDisablePhyApi = FALSE;\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"Disable API debug mode\\n\"));\n\t\t\t}\n\t\t} else\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support PHYDM API function\\n\"));\n\t}\n#else\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support PHYDM API function\\n\"));\n#endif\n\t\tbreak;\t\n\t\t\n\tcase PHYDM_PROFILE: /*echo profile, >cmd*/\n\t\tphydm_BasicProfile(pDM_Odm, &used, output, &out_len);\n\t\tbreak;\n\n\tcase PHYDM_GET_TXAGC:\n\t\tphydm_get_txagc(pDM_Odm, &used, output, &out_len);\n\t\tbreak;\n\t\t\n\tcase PHYDM_SET_TXAGC:\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\n\t\t\t\t/*PHYDM_SNPRINTF((output+used, out_len-used, \"new SET, support ablity_var[%d]= (( %d ))\\n\", i , var1[i]));*/\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tphydm_set_txagc(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n\t\tbreak;\n\t\t\n\tcase PHYDM_TRX_PATH:\n#if (RTL8822B_SUPPORT == 1)\n\t{\n\t\tif (pDM_Odm->SupportICType & ODM_RTL8822B) {\n\t\t\tu1Byte\t\tTxPath, RxPath;\n\t\t\tBOOLEAN\t\tbEnableDbgMode, bTx2Path;\n\t\t\t\n\t\t\tfor (i = 0; i < 4; i++) {\n\t\t\t\tif (input[i + 1])\n\t\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\t\t\t}\n\n\t\t\tbEnableDbgMode = (BOOLEAN)var1[0];\n\t\t\tTxPath = (u1Byte) var1[1];\n\t\t\tRxPath = (u1Byte) var1[2];\n\t\t\tbTx2Path = (BOOLEAN) var1[3];\n\n\t\t\tif (bEnableDbgMode) {\n\t\t\t\tpDM_Odm->bDisablePhyApi = FALSE;\n\t\t\t\tconfig_phydm_trx_mode_8822b(pDM_Odm, TxPath, RxPath, bTx2Path);\n\t\t\t\tpDM_Odm->bDisablePhyApi = TRUE;\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"TxPath = 0x%x, RxPath = 0x%x, bTx2Path = %d\\n\", TxPath, RxPath, bTx2Path));\n\t\t\t} else {\n\t\t\t\tpDM_Odm->bDisablePhyApi = FALSE;\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"Disable API debug mode\\n\"));\n\t\t\t}\n\t\t} else\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support PHYDM API function\\n\"));\n\t}\n#else\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support PHYDM API function\\n\"));\n#endif\n\t\tbreak;\n\n\tcase PHYDM_LA_MODE:\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n#if ((RTL8822B_SUPPORT == 1) || (RTL8814A_SUPPORT == 1))\n\t{\n\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B)) {\n\t\t\tu2Byte\t\tPollingTime;\n\t\t\tu1Byte\t\tTrigSel, TrigSigSel, DmaDataSigSel, TriggerTime;\n\t\t\tBOOLEAN\t\tbEnableLaMode;\n\n\t\t\tfor (i = 0; i < 6; i++) {\n\t\t\t\tif (input[i + 1])\n\t\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\t\t\t}\n\n\t\t\tbEnableLaMode = (BOOLEAN)var1[0];\n\t\t\tif (bEnableLaMode) {\n\t\t\t\tTrigSel = (u1Byte)var1[1];\n\t\t\t\tTrigSigSel = (u1Byte)var1[2];\n\t\t\t\tDmaDataSigSel = (u1Byte)var1[3];\n\t\t\t\tTriggerTime = (u1Byte)var1[4];\n\t\t\t\tPollingTime = (((u1Byte)var1[5]) << 6);\n\n\t\t\t\tADCSmp_Set(pDM_Odm->Adapter, TrigSel, TrigSigSel, DmaDataSigSel, TriggerTime, PollingTime);\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"TrigSel = %d, TrigSigSel = %d, DmaDataSigSel = %d\\n\", TrigSel, TrigSigSel, DmaDataSigSel));\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"TriggerTime = %d, PollingTime = %d\\n\", TriggerTime, PollingTime));\n\t\t\t} else {\n\t\t\t\tADCSmp_Stop(pDM_Odm->Adapter);\n\t\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"Disable LA mode\\n\"));\n\t\t\t}\n\t\t} else\n\t\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support LA mode\\n\"));\n\t}\n#else\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support LA mode\\n\"));\n#endif\n#else\n\t\tPHYDM_SNPRINTF((output+used, out_len-used, \"This IC doesn't support LA mode\\n\"));\n#endif\n\t\tbreak;\n\n\tcase PHYDM_DUMP_REG:\n\t{\n\t\tu1Byte\ttype = 0;\n\t\t\n\t\tif (input[1]) {\n\t\t\tPHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\n\t\t\ttype = (u1Byte)var1[0];\n\t\t}\n\n\t\tif (type == 0)\n\t\t\tphydm_DumpBbReg(pDM_Odm);\n\t\telse if (type == 1)\n\t\t\tphydm_DumpAllReg(pDM_Odm);\n\t}\n\t\tbreak;\n\tcase PHYDM_NBI_EN:\n\t\t\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tif (input[i + 1]) {\n\t\t\t\tPHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\n\t\t\t\tinput_idx++;\n\t\t\t}\n\t\t}\n\n\t\tif (input_idx >= 1) {\n\t\t\t\n\t\t\tphydm_nbi_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\n\t\t\t/**/\n\t\t}\n\n\n\t\tbreak;\n\n\tdefault:\n\t\tPHYDM_SNPRINTF((output + used, out_len - used, \"SET, unknown command!\\n\"));\n\t\tbreak;\n\n\t}\n}\n\n#ifdef __ECOS\nchar *strsep(char **s, const char *ct)\n{\n\tchar *sbegin = *s;\n\tchar *end;\n\n\tif (sbegin == NULL)\n\t\treturn NULL;\n\n\tend = strpbrk(sbegin, ct);\n\tif (end)\n\t\t*end++ = '\\0';\n\t*s = end;\n\treturn sbegin;\n}\n#endif\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\ns4Byte\nphydm_cmd(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN char\t\t*input,\n\tIN u4Byte\tin_len,\n\tIN u1Byte\tflag,\n\tOUT char\t*output,\n\tIN u4Byte\tout_len\n)\n{\n\tchar *token;\n\tu4Byte\tArgc = 0;\n\tchar\t\tArgv[MAX_ARGC][MAX_ARGV];\n\n\tdo {\n\t\ttoken = strsep(&input, \", \");\n\t\tif (token) {\n\t\t\tstrcpy(Argv[Argc], token);\n\t\t\tArgc++;\n\t\t} else\n\t\t\tbreak;\n\t} while (Argc < MAX_ARGC);\n\n\tif (Argc == 1)\n\t\tArgv[0][strlen(Argv[0]) - 1] = '\\0';\n\n\tphydm_cmd_parser(pDM_Odm, Argv, Argc, flag, output, out_len);\n\n\treturn 0;\n}\n#endif\n\n\nVOID\nphydm_fw_trace_handler(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tCmdBuf,\n\tIN\tu1Byte\tCmdLen\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t/*u1Byte\tdebug_trace_11byte[60];*/\n\tu1Byte\t\tfreg_num, c2h_seq, buf_0 = 0;\n\n\tif (CmdLen > 12)\n\t\treturn;\n\n\tbuf_0 = CmdBuf[0];\n\tfreg_num = (buf_0 & 0xf);\n\tc2h_seq = (buf_0 & 0xf0) >> 4;\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW debug message] freg_num = (( %d )), c2h_seq = (( %d ))\\n\", freg_num,c2h_seq ));*/\n\n\t/*strncpy(debug_trace_11byte,&CmdBuf[1],(CmdLen-1));*/\n\t/*debug_trace_11byte[CmdLen-1] = '\\0';*/\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW debug message] %s\\n\", debug_trace_11byte));*/\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW debug message] CmdLen = (( %d ))\\n\", CmdLen));*/\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW debug message] c2h_cmd_start  = (( %d ))\\n\", pDM_Odm->c2h_cmd_start));*/\n\n\n\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"pre_seq = (( %d )), current_seq = (( %d ))\\n\", pDM_Odm->pre_c2h_seq, c2h_seq));*/\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"fw_buff_is_enpty = (( %d ))\\n\", pDM_Odm->fw_buff_is_enpty));*/\n\n\tif ((c2h_seq != pDM_Odm->pre_c2h_seq)  &&  pDM_Odm->fw_buff_is_enpty == FALSE) {\n\t\tpDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\\0';\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW Dbg Queue Overflow] %s\\n\", pDM_Odm->fw_debug_trace));\n\t\tpDM_Odm->c2h_cmd_start = 0;\n\t}\n\n\tif ((CmdLen - 1) > (60 - pDM_Odm->c2h_cmd_start)) {\n\t\tpDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\\0';\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW Dbg Queue error: wrong C2H length] %s\\n\", pDM_Odm->fw_debug_trace));\n\t\tpDM_Odm->c2h_cmd_start = 0;\n\t\treturn;\n\t}\n\n\tstrncpy((char *)&(pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start]), (char *)&CmdBuf[1], (CmdLen-1));\n\tpDM_Odm->c2h_cmd_start += (CmdLen - 1);\n\tpDM_Odm->fw_buff_is_enpty = FALSE;\t\n\t\n\tif (freg_num == 0 || pDM_Odm->c2h_cmd_start >= 60) {\n\t\tif (pDM_Odm->c2h_cmd_start < 60)\n\t\t\tpDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\\0';\n\t\telse\n\t\t\tpDM_Odm->fw_debug_trace[59] = '\\0';\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW DBG Msg] %s\\n\", pDM_Odm->fw_debug_trace));\n\t\t/*DbgPrint(\"[FW DBG Msg] %s\\n\", pDM_Odm->fw_debug_trace);*/\n\t\tpDM_Odm->c2h_cmd_start = 0;\n\t\tpDM_Odm->fw_buff_is_enpty = TRUE;\n\t}\n\n\tpDM_Odm->pre_c2h_seq = c2h_seq;\n}\n\nVOID\nphydm_fw_trace_handler_code(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tBuffer,\n\tIN\tu1Byte\tCmdLen\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\tfunction = Buffer[0];\n\tu1Byte\tdbg_num = Buffer[1];\n\tu2Byte\tcontent_0 = (((u2Byte)Buffer[3])<<8)|((u2Byte)Buffer[2]);\n\tu2Byte\tcontent_1 = (((u2Byte)Buffer[5])<<8)|((u2Byte)Buffer[4]);\t\t\n\tu2Byte\tcontent_2 = (((u2Byte)Buffer[7])<<8)|((u2Byte)Buffer[6]);\t\n\tu2Byte\tcontent_3 = (((u2Byte)Buffer[9])<<8)|((u2Byte)Buffer[8]);\n\tu2Byte\tcontent_4 = (((u2Byte)Buffer[11])<<8)|((u2Byte)Buffer[10]);\n\n\tif(CmdLen >12) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW Msg] Invalid cmd length (( %d )) >12 \\n\", CmdLen));\n\t}\n\t\n\t//ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW Msg] Func=((%d)),  num=((%d)), ct_0=((%d)), ct_1=((%d)), ct_2=((%d)), ct_3=((%d)), ct_4=((%d))\\n\", \n\t//\tfunction, dbg_num, content_0, content_1, content_2, content_3, content_4));\n\t\n\t/*--------------------------------------------*/\n\tif(function == RATE_DECISION) {\n\t\tif(dbg_num == 0) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin] RA_CNT=((%d))  Max_device=((%d))--------------------------->\\n\", content_1, content_2));\n\t\t\t} else if(content_0 == 2) {\n\t\t\t\t ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin] Check RA macid= ((%d)), MediaStatus=((%d)), Dis_RA=((%d)),  try_bit=((0x%x))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t} else if(content_0 == 3) {\n\t\t\t\t ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Check RA  total=((%d)),  drop=((0x%x)), TXRPT_TRY_bit=((%x)), bNoisy=((%x))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t}\n\t\t} else if(dbg_num == 1) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin] RTY[0,1,2,3]=[ %d,  %d,  %d,  %d ] \\n\", content_1, content_2, content_3, content_4));\n\t\t\t} else if(content_0 == 2) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin] RTY[4]=[ %d ], drop=((%d)), total=((%d)),  current_rate=((0x%x))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t} else if(content_0 == 3) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin] penality_idx=((%d ))\\n\", content_1));\n\t\t\t}\n\t\t}\n\t\t\n\t\telse if(dbg_num == 3) {\n\t\t\tif (content_0 == 1)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Fast_RA (( DOWN ))  total=((%d)),  total>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\telse if (content_0 == 2)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Fast_RA (( UP ))  total_acc=((%d)),  total_acc>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\telse if (content_0 == 3)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Fast_RA (( UP )) ((Rate Down Hold))  RA_CNT=((%d))\\n\", content_1));\n\t\t\telse if (content_0 == 4)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Fast_RA (( UP )) ((tota_accl<5 skip))  RA_CNT=((%d))\\n\", content_1));\n\t\t\telse if (content_0 == 8)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDecisoin] Fast_RA (( Reset Tx Rpt )) RA_CNT=((%d))\\n\", content_1));\n\t\t}\n\t\t\n\t\telse if(dbg_num == 5) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  (( UP))  Nsc=((%d)), N_High=((%d))\\n\", content_1, content_2));\n\t\t\t} else if(content_0 == 2) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  ((DOWN))  Nsc=((%d)), N_Low=((%d))\\n\", content_1, content_2));\n\t\t\t} else if(content_0 == 3) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  ((HOLD))  Nsc=((%d)), N_High=((%d)), N_Low=((%d)), Reset_CNT=((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t}\n\t\t}\n\t\telse if(dbg_num == 0x60) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  ((AP RPT))  macid=((%d)), BUPDATE[macid]=((%d))\\n\", content_1, content_2));\n\t\t\t} else if(content_0 == 4) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  ((AP RPT))  pass=((%d)), rty_num=((%d)), drop=((%d)), total=((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t} else if(content_0 == 5) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"[FW][RateDecisoin]  ((AP RPT))  PASS=((%d)), RTY_NUM=((%d)), DROP=((%d)), TOTAL=((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\t}\n\t\t}\n\t\telse if(dbg_num == 0xff) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,(\"\\n\\n\"));\n\t\t\t} \n\t\t}\n\t\t\n\t} \n\t/*--------------------------------------------*/\n\telse if (function == INIT_RA_TABLE){\n\t\tif(dbg_num == 3) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][INIT_RA_INFO] Ra_init, RA_SKIP_CNT = (( %d ))\\n\", content_0));\n\t\t}\n\t\t\n\t} \n\t/*--------------------------------------------*/\n\telse if (function == RATE_UP) {\n\t\tif(dbg_num == 2) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateUp]  ((Highest rate -> return)), macid=((%d))  Nsc=((%d))\\n\", content_1, content_2));\n\t\t\t}\n\t\t} else if(dbg_num == 5) {\n\t\t\tif (content_0 == 0)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateUp]  ((Rate UP)), up_rate_tmp=((0x%x)), rate_idx=((0x%x)), SGI_en=((%d)),  SGI=((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t\telse if (content_0 == 1)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateUp]  ((Rate UP)), rate_1=((0x%x)), rate_2=((0x%x)), BW=((%d)), Try_Bit=((%d))\\n\", content_1, content_2, content_3, content_4));\n\t\t}\n\t\t\n\t} \n\t/*--------------------------------------------*/\n\telse if (function == RATE_DOWN) {\n\t\t if(dbg_num == 5) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][RateDownStep]  ((Rate Down)), macid=((%d)),  rate=((0x%x)),  BW=((%d))\\n\", content_1, content_2, content_3));\n\t\t\t}\n\t\t}\n\t} else if (function == TRY_DONE) {\n\t\tif (dbg_num == 1) {\n\t\t\tif (content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][Try Done]  ((try succsess )) macid=((%d)), Try_Done_cnt=((%d))\\n\", content_1, content_2));\n\t\t\t\t/**/\n\t\t\t}\n\t\t} else if (dbg_num == 2) {\n\t\t\tif (content_0 == 1)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][Try Done]  ((try fail )) macid=((%d)), Try_Done_cnt=((%d)),  multi_try_rate=((%d))\\n\", content_1, content_2, content_3));\n\t\t}\n\t}\n\t/*--------------------------------------------*/\n\telse if (function == F_RATE_AP_RPT) {\n\t\t if(dbg_num == 1) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  ((1)), SPE_STATIS=((0x%x))---------->\\n\", content_3));\t\t\t\t\n\t\t\t} \n\t\t} else if(dbg_num == 2) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  RTY_all=((%d))\\n\", content_1));\t\t\t\t\n\t\t\t} \n\t\t} else if(dbg_num == 3) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  MACID1[%d], TOTAL=((%d)),  RTY=((%d))\\n\", content_3, content_1, content_2));\n\t\t\t} \n\t\t} else if(dbg_num == 4) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  MACID2[%d], TOTAL=((%d)),  RTY=((%d))\\n\", content_3, content_1, content_2));\n\t\t\t} \n\t\t} else if(dbg_num == 5) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  MACID1[%d], PASS=((%d)),  DROP=((%d))\\n\", content_3, content_1, content_2));\n\t\t\t} \n\t\t} else if(dbg_num == 6) {\n\t\t\tif(content_0 == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW][AP RPT]  MACID2[%d],, PASS=((%d)),  DROP=((%d))\\n\", content_3, content_1, content_2));\n\t\t\t} \n\t\t}\n\t}\n\t/*--------------------------------------------*/\n\t\t\n\n}\n\nVOID\nphydm_fw_trace_handler_8051(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tBuffer,\n\tIN\tu1Byte\tCmdLen\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if 0\n\tif (CmdLen >= 3)\n\t\tCmdBuf[CmdLen - 1] = '\\0';\n\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW DBG Msg] %s\\n\", &(CmdBuf[3])));\n#else\n\n\tint i = 0;\n\tu1Byte\tExtend_c2hSubID = 0, Extend_c2hDbgLen = 0, Extend_c2hDbgSeq = 0;\n\tu1Byte\tfw_debug_trace[100];\n\tpu1Byte\tExtend_c2hDbgContent = 0;\n\n\tExtend_c2hSubID = Buffer[0];\n\tExtend_c2hDbgLen = Buffer[1];\n\tExtend_c2hDbgContent = Buffer + 2; /*DbgSeq+DbgContent  for show HEX*/\n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tRT_DISP(FC2H, C2H_Summary, (\"[Extend C2H packet], Extend_c2hSubId=0x%x, Extend_c2hDbgLen=%d\\n\", \n\t\t\tExtend_c2hSubID, Extend_c2hDbgLen));\n\t\n\tRT_DISP_DATA(FC2H, C2H_Summary, \"[Extend C2H packet], Content Hex:\", Extend_c2hDbgContent, CmdLen-2);\n\t#endif\n\nGoBackforAggreDbgPkt:\n\ti = 0;\n\tExtend_c2hDbgSeq = Buffer[2];\n\tExtend_c2hDbgContent = Buffer + 3;\n\t\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tRT_DISP(FC2H, C2H_Summary, (\"[RTKFW, SEQ= %d] :\", Extend_c2hDbgSeq));\n\t#endif\t\n\n\tfor (; ; i++) {\n\t\tfw_debug_trace[i] = Extend_c2hDbgContent[i];\n\t\tif (Extend_c2hDbgContent[i + 1] == '\\0') {\n\t\t\tfw_debug_trace[i + 1] = '\\0';\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW DBG Msg] %s\", &(fw_debug_trace[0])));\n\t\t\tbreak;\n\t\t} else if (Extend_c2hDbgContent[i] == '\\n') {\n\t\t\tfw_debug_trace[i + 1] = '\\0';\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"[FW DBG Msg] %s\", &(fw_debug_trace[0])));\n\t\t\tBuffer = Extend_c2hDbgContent + i + 3;\n\t\t\tgoto GoBackforAggreDbgPkt;\n\t\t}\n\t}\n\n\n#endif\n}\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_debug.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__ODM_DBG_H__\n#define __ODM_DBG_H__\n\n#define DEBUG_VERSION\t\"1.0\"  /*2015.01.13 Dino*/\n//-----------------------------------------------------------------------------\n//\tDefine the debug levels\n//\n//\t1.\tDBG_TRACE and DBG_LOUD are used for normal cases.\n//\tSo that, they can help SW engineer to develope or trace states changed \n//\tand also help HW enginner to trace every operation to and from HW, \n//\te.g IO, Tx, Rx. \n//\n//\t2.\tDBG_WARNNING and DBG_SERIOUS are used for unusual or error cases, \n//\twhich help us to debug SW or HW.\n//\n//-----------------------------------------------------------------------------\n//\n//\tNever used in a call to ODM_RT_TRACE()!\n//\n#define ODM_DBG_OFF\t\t\t\t\t1\n\n//\n//\tFatal bug. \n//\tFor example, Tx/Rx/IO locked up, OS hangs, memory access violation, \n//\tresource allocation failed, unexpected HW behavior, HW BUG and so on.\n//\n#define ODM_DBG_SERIOUS\t\t\t\t2\n\n//\n//\tAbnormal, rare, or unexpeted cases.\n//\tFor example, IRP/Packet/OID canceled, device suprisely unremoved and so on.\n//\n#define ODM_DBG_WARNING\t\t\t\t3\n\n//\n//\tNormal case with useful information about current SW or HW state. \n//\tFor example, Tx/Rx descriptor to fill, Tx/Rx descriptor completed status, \n//\tSW protocol state change, dynamic mechanism state change and so on.\n//\n#define ODM_DBG_LOUD\t\t\t\t\t4\n\n//\n//\tNormal case with detail execution flow or information.\n//\n#define ODM_DBG_TRACE\t\t\t\t\t5\n\n/*FW DBG MSG*/\n#define\tRATE_DECISION\tBIT0\n#define\tINIT_RA_TABLE\tBIT1\n#define\tRATE_UP\t\t\tBIT2\n#define\tRATE_DOWN\t\tBIT3\n#define\tTRY_DONE\t\tBIT4\n#define\tF_RATE_AP_RPT\tBIT7\n\n//-----------------------------------------------------------------------------\n// Define the tracing components\n//\n//-----------------------------------------------------------------------------\n//BB Functions\n#define\tODM_COMP_DIG\t\t\t\t\tBIT0\t\n#define\tODM_COMP_RA_MASK\t\t\t\tBIT1\t\n#define\tODM_COMP_DYNAMIC_TXPWR\t\tBIT2\n#define\tODM_COMP_FA_CNT\t\t\t\tBIT3\n#define\tODM_COMP_RSSI_MONITOR\t\tBIT4\n#define\tODM_COMP_CCK_PD\t\t\t\tBIT5\n#define\tODM_COMP_ANT_DIV\t\t\t\tBIT6\n#define\tODM_COMP_PWR_SAVE\t\t\tBIT7\n#define\tODM_COMP_PWR_TRAIN\t\t\tBIT8\n#define\tODM_COMP_RATE_ADAPTIVE\t\tBIT9\n#define\tODM_COMP_PATH_DIV\t\t\tBIT10\n#define\tODM_COMP_PSD\t\t\t\t\tBIT11\n#define\tODM_COMP_DYNAMIC_PRICCA\t\tBIT12\n#define\tODM_COMP_RXHP\t\t\t\t\tBIT13\n#define\tODM_COMP_MP\t\t\t\t\tBIT14\n#define\tODM_COMP_CFO_TRACKING\t\tBIT15\n#define\tODM_COMP_ACS\t\t\t\t\tBIT16\n#define\tPHYDM_COMP_ADAPTIVITY\t\tBIT17\n#define\tPHYDM_COMP_RA_DBG\t\t\tBIT18\n#define\tPHYDM_COMP_TXBF\t\t\t\tBIT19\n//MAC Functions\n#define\tODM_COMP_EDCA_TURBO\t\t\tBIT20\n#define\tODM_COMP_EARLY_MODE\t\t\tBIT21\n#define\tODM_FW_DEBUG_TRACE\t\t\tBIT22\n//RF Functions\n#define\tODM_COMP_TX_PWR_TRACK\t\tBIT24\n#define\tODM_COMP_RX_GAIN_TRACK\t\tBIT25\n#define\tODM_COMP_CALIBRATION\t\t\tBIT26\n//Common Functions\n#define\tODM_PHY_CONFIG\t\t\t\tBIT28\n#define\tBEAMFORMING_DEBUG\t\t\t\tBIT29\n#define\tODM_COMP_COMMON\t\t\t\tBIT30\n#define\tODM_COMP_INIT\t\t\t\t\tBIT31\n#define\tODM_COMP_NOISY_DETECT\t\tBIT32\n\n/*------------------------Export Marco Definition---------------------------*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#define RT_PRINTK\t\t\t\tDbgPrint\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#define DbgPrint\tprintk\n\t#define RT_PRINTK(fmt, args...)\tDbgPrint( \"%s(): \" fmt, __FUNCTION__, ## args);\n\t#define\tRT_DISP(dbgtype, dbgflag, printstr)\n#else\n\t#define DbgPrint\tpanic_printk\n\t#define RT_PRINTK(fmt, args...)\tDbgPrint( \"%s(): \" fmt, __FUNCTION__, ## args);\n#endif\n\n#ifndef ASSERT\n\t#define ASSERT(expr)\n#endif\n\n#if DBG\n#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt)\t\t\t\t\t\t\t\t\t\\\n\tdo {\t\\\n\t\tif(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel || level == ODM_DBG_SERIOUS))\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8192C)\t\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-92C] \");\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8192D)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-92D] \");\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8723A)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8723A] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8188E)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8188E] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8192E) \t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8192E] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8812)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8812] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8821)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8821] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8814A)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8814] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8703B)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8703B] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8822B)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8822] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\telse if (pDM_Odm->SupportICType == ODM_RTL8188F)\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM-8188F] \");\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRT_PRINTK fmt;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t}\t\\\n\t} while (0)\n\t\n#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt)\t\t\t\t\t\t\t\t\t\\\n\t\tif(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel))\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tRT_PRINTK fmt;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t}\n\n#define ODM_RT_ASSERT(pDM_Odm, expr, fmt)\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif(!(expr)) {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tDbgPrint( \"Assertion failed! %s at ......\\n\", #expr);\t\t\t\t\t\t\t\t\\\n\t\t\tDbgPrint( \"      ......%s,%s,line=%d\\n\",__FILE__,__FUNCTION__,__LINE__);\t\t\t\\\n\t\t\tRT_PRINTK fmt;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tASSERT(FALSE);\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t}\n#define ODM_dbg_enter() { DbgPrint(\"==> %s\\n\", __FUNCTION__); }\n#define ODM_dbg_exit() { DbgPrint(\"<== %s\\n\", __FUNCTION__); }\n#define ODM_dbg_trace(str) { DbgPrint(\"%s:%s\\n\", __FUNCTION__, str); }\n\n#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr)\t\t\t\t\t\t\t\\\n\t\t\tif(((comp) & pDM_Odm->DebugComponents) && (level <= pDM_Odm->DebugLevel))\t\\\n\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tint __i;\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tpu1Byte\t__ptr = (pu1Byte)ptr;\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"[ODM] \");\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(title_str);\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\" \");\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\tfor( __i=0; __i<6; __i++ )\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\tDbgPrint(\"%02X%s\", __ptr[__i], (__i==5)?\"\":\"-\");\t\t\t\t\t\t\\\n\t\t\t\tDbgPrint(\"\\n\");\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t}\n#else\n#define ODM_RT_TRACE(pDM_Odm, comp, level, fmt)\n#define ODM_RT_TRACE_F(pDM_Odm, comp, level, fmt)\n#define ODM_RT_ASSERT(pDM_Odm, expr, fmt)\n#define ODM_dbg_enter()\n#define ODM_dbg_exit()\n#define ODM_dbg_trace(str)\n#define ODM_PRINT_ADDR(pDM_Odm, comp, level, title_str, ptr)\n#endif\n\n\nVOID \nPHYDM_InitDebugSetting(IN\t\tPDM_ODM_T\t\tpDM_Odm);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID phydm_BB_RxHang_Info(IN PDM_ODM_T pDM_Odm);\n#endif\n\n#define\tBB_TMP_BUF_SIZE\t\t100\nVOID phydm_BB_Debug_Info(IN PDM_ODM_T pDM_Odm);\nVOID phydm_BasicDbgMessage(\tIN\t\tPVOID\t\t\tpDM_VOID);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#define\tPHYDM_DBGPRINT\t\t0\n#define\tPHYDM_SSCANF(x, y, z)\tDCMD_Scanf(x, y, z)\n#if (PHYDM_DBGPRINT == 1)\n#define\tPHYDM_SNPRINTF(msg)\t\\\n\t\tdo {\\\n\t\t\trsprintf msg;\\\n\t\t\tDbgPrint(output);\\\n\t\t} while (0)\n#else\n#define\tPHYDM_SNPRINTF(msg)\t\\\n\t\tdo {\\\n\t\t\trsprintf msg;\\\n\t\t\tDCMD_Printf(output);\\\n\t\t} while (0)\n#endif\n#else\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#define\tPHYDM_DBGPRINT\t\t0\n#else\n#define\tPHYDM_DBGPRINT\t\t1\n#endif\n#define\tMAX_ARGC\t\t\t\t20\n#define\tMAX_ARGV\t\t\t\t16\n#define\tDCMD_DECIMAL\t\t\t\"%d\"\n#define\tDCMD_CHAR\t\t\t\t\"%c\"\n#define\tDCMD_HEX\t\t\t\t\"%x\"\n\n#define\tPHYDM_SSCANF(x, y, z)\tsscanf(x, y, z)\n#if (PHYDM_DBGPRINT == 1)\n#define\tPHYDM_SNPRINTF(msg)\\\n\t\tdo {\\\n\t\t\tsnprintf msg;\\\n\t\t\tDbgPrint(output);\\\n\t\t} while (0)\n#else\n#define\tPHYDM_SNPRINTF(msg)\\\n\t\tdo {\\\n\t\t\tif(out_len > used)\\\n\t\t\t\tused+=snprintf msg;\\\n\t\t} while (0)\n#endif\n#endif\n\n\nVOID phydm_BasicProfile(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t\t*_used,\n\tOUT\t\tchar\t\t\t\t*output,\n\tIN\t\tu4Byte\t\t\t*_out_len\n\t);\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\ns4Byte\nphydm_cmd(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN char\t\t*input,\n\tIN u4Byte\tin_len,\n\tIN u1Byte\tflag,\n\tOUT char\t*output,\n\tIN u4Byte\tout_len\n);\n#endif\nVOID\nphydm_cmd_parser(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN char\t\tinput[][16],\n\tIN u4Byte\tinput_num,\n\tIN u1Byte\tflag,\n\tOUT char\t*output,\n\tIN u4Byte\tout_len\n);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nvoid phydm_sbd_check(\n\tIN\tPDM_ODM_T\t\t\t\t\tpDM_Odm\n\t);\n\nvoid phydm_sbd_callback(\n\tPRT_TIMER\t\tpTimer\n\t);\n\nvoid phydm_sbd_workitem_callback(\n    IN PVOID            pContext\n\t);\n#endif\n\nVOID\nphydm_fw_trace_en_h2c(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tBOOLEAN\t\tenable,\n\tIN\tu4Byte\t\tmonitor_mode,\n\tIN\tu4Byte\t\tmacid\n);\n\nVOID\nphydm_fw_trace_handler(\n\tIN\t\tPVOID\tpDM_VOID,\n\tIN\t\tpu1Byte\tCmdBuf,\n\tIN\t\tu1Byte\tCmdLen\n);\n\nVOID\nphydm_fw_trace_handler_code(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tBuffer,\n\tIN\tu1Byte\tCmdLen\n);\n\nVOID\nphydm_fw_trace_handler_8051(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tpu1Byte\tCmdBuf,\n\tIN\tu1Byte\tCmdLen\n);\n\n#endif\t// __ODM_DBG_H__\n\n"
  },
  {
    "path": "hal/phydm/phydm_dig.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n\nVOID\nODM_ChangeDynamicInitGainThresh(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu4Byte\t\tDM_Type,\n\tIN\tu4Byte\t\tDM_Value\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tif (DM_Type == DIG_TYPE_THRESH_HIGH)\n\t{\n\t\tpDM_DigTable->RssiHighThresh = DM_Value;\t\t\n\t}\n\telse if (DM_Type == DIG_TYPE_THRESH_LOW)\n\t{\n\t\tpDM_DigTable->RssiLowThresh = DM_Value;\n\t}\n\telse if (DM_Type == DIG_TYPE_ENABLE)\n\t{\n\t\tpDM_DigTable->Dig_Enable_Flag\t= TRUE;\n\t}\t\n\telse if (DM_Type == DIG_TYPE_DISABLE)\n\t{\n\t\tpDM_DigTable->Dig_Enable_Flag = FALSE;\n\t}\t\n\telse if (DM_Type == DIG_TYPE_BACKOFF)\n\t{\n\t\tif(DM_Value > 30)\n\t\t\tDM_Value = 30;\n\t\tpDM_DigTable->BackoffVal = (u1Byte)DM_Value;\n\t}\n\telse if(DM_Type == DIG_TYPE_RX_GAIN_MIN)\n\t{\n\t\tif(DM_Value == 0)\n\t\t\tDM_Value = 0x1;\n\t\tpDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;\n\t}\n\telse if(DM_Type == DIG_TYPE_RX_GAIN_MAX)\n\t{\n\t\tif(DM_Value > 0x50)\n\t\t\tDM_Value = 0x50;\n\t\tpDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;\n\t}\n}\t// DM_ChangeDynamicInitGainThresh //\n\nint \ngetIGIForDiff(int value_IGI)\n{\n\t#define ONERCCA_LOW_TH\t\t0x30\n\t#define ONERCCA_LOW_DIFF\t\t8\n\n\tif (value_IGI < ONERCCA_LOW_TH) {\n\t\tif ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)\n\t\t\treturn ONERCCA_LOW_TH;\n\t\telse\n\t\t\treturn value_IGI + ONERCCA_LOW_DIFF;\n\t} else {\n\t\treturn value_IGI;\n\t}\n}\n\nVOID\nodm_FAThresholdCheck(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tBOOLEAN\t\t\tbDFSBand,\n\tIN\t\tBOOLEAN\t\t\tbPerformance,\n\tIN\t\tu4Byte\t\t\tRxTp,\n\tIN\t\tu4Byte\t\t\tTxTp,\n\tOUT\t\tu4Byte*\t\t\tdm_FA_thres\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif(pDM_Odm->bLinked && (bPerformance||bDFSBand))\n\t{\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t\t{\n\t\t\t// 8192D special case\n\t\t\tdm_FA_thres[0] = DM_DIG_FA_TH0_92D;\n\t\t\tdm_FA_thres[1] = DM_DIG_FA_TH1_92D;\n\t\t\tdm_FA_thres[2] = DM_DIG_FA_TH2_92D;\n\t\t}\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\telse if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\n\t\t{\n\t\t\t// For AP\n\t\t\tif((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500)\t\t\t// 10Mbps & 0.5Mbps\n\t\t\t{\n\t\t\t\tdm_FA_thres[0] = 0x080;\n\t\t\t\tdm_FA_thres[1] = 0x100;\n\t\t\t\tdm_FA_thres[2] = 0x200;\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdm_FA_thres[0] = 0x100;\n\t\t\t\tdm_FA_thres[1] = 0x200;\n\t\t\t\tdm_FA_thres[2] = 0x300;\t\n\t\t\t}\n\t\t}\n#else\n\t\telse if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)\n\t\t{\n\t\t\t// 8723A BT special case\n\t\t\tdm_FA_thres[0] = DM_DIG_FA_TH0;\n\t\t\tdm_FA_thres[1] = 0x250;\n\t\t\tdm_FA_thres[2] = 0x300;\n\t\t}\n#endif\n\t\telse\n\t\t{\n\t\t\t// For NIC\n\t\t\tdm_FA_thres[0] = DM_DIG_FA_TH0;\n\t\t\tdm_FA_thres[1] = DM_DIG_FA_TH1;\n\t\t\tdm_FA_thres[2] = DM_DIG_FA_TH2;\n\t\t}\n\t}\n\telse\n\t{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\tif(bDFSBand)\n\t\t{\n\t\t\t// For DFS band and no link\n\t\t\tdm_FA_thres[0] = 250;\n\t\t\tdm_FA_thres[1] = 1000;\n\t\t\tdm_FA_thres[2] = 2000;\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tdm_FA_thres[0] = 2000;\n\t\t\tdm_FA_thres[1] = 4000;\n\t\t\tdm_FA_thres[2] = 5000;\n\t\t}\n\t}\n\treturn;\n}\n\nu1Byte\nodm_ForbiddenIGICheck(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tDIG_Dynamic_MIN,\n\tIN\t\tu1Byte\t\t\tCurrentIGI\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tPFALSE_ALARM_STATISTICS \tpFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tu1Byte\t\t\t\t\t\trx_gain_range_min = pDM_DigTable->rx_gain_range_min;\n\n\tif(pFalseAlmCnt->Cnt_all > 10000)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Abnormally false alarm case. \\n\"));\n\n\t\tif(pDM_DigTable->LargeFAHit != 3)\n\t\t\tpDM_DigTable->LargeFAHit++;\n\t\t\n\t\tif(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)\n\t\t{\n\t\t\tpDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;\n\t\t\tpDM_DigTable->LargeFAHit = 1;\n\t\t}\n\n\t\tif(pDM_DigTable->LargeFAHit >= 3)\n\t\t{\n\t\t\tif((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)\n\t\t\t\trx_gain_range_min = pDM_DigTable->rx_gain_range_max;\n\t\t\telse\n\t\t\t\trx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);\n\t\t\tpDM_DigTable->Recover_cnt = 1800;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Abnormally false alarm case: Recover_cnt = %d \\n\", pDM_DigTable->Recover_cnt));\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(pDM_DigTable->Recover_cnt != 0)\n\t\t{\n\t\t\tpDM_DigTable->Recover_cnt --;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Normal Case: Recover_cnt = %d \\n\", pDM_DigTable->Recover_cnt));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pDM_DigTable->LargeFAHit < 3)\n\t\t\t{\n\t\t\t\tif((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)\n\t\t\t\t{\n\t\t\t\t\tpDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;\n\t\t\t\t\trx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Normal Case: At Lower Bound\\n\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_DigTable->ForbiddenIGI -= 2;\n\t\t\t\t\trx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Normal Case: Approach Lower Bound\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_DigTable->LargeFAHit = 0;\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn rx_gain_range_min;\n\n}\n\nVOID\nodm_InbandNoiseCalculate (\t\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tu1Byte\t\t\t\tIGIBackup, TimeCnt = 0, ValidCnt = 0;\n\tBOOLEAN\t\t\t\tbTimeout = TRUE;\n\ts1Byte\t\t\t\tsNoise_A, sNoise_B;\n\ts4Byte\t\t\t\tNoiseRpt_A = 0,NoiseRpt_B = 0;\n\tu4Byte\t\t\t\ttmp = 0;\n\tstatic\tu1Byte\t\tfailCnt = 0;\n\n\tif(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))\n\t\treturn;\n\n\tif(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)\n\t\treturn;\n\n\tif(!pDM_DigTable->bNoiseEst)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_InbandNoiseEstimate()========>\\n\"));\n\t\n\t//1 Set initial gain.\n\tIGIBackup = pDM_DigTable->CurIGValue;\n\tpDM_DigTable->IGIOffset_A = 0;\n\tpDM_DigTable->IGIOffset_B = 0;\n\tODM_Write_DIG(pDM_Odm, 0x24);\n\n\t//1 Update idle time power report\t\n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);\n\n\tdelay_ms(2);\n\n\t//1 Get noise power level\n\twhile(1)\n\t{\n\t\t//2 Read Noise Floor Report\n\t\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\t\ttmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);\n\n\t\tsNoise_A = (s1Byte)(tmp & 0xff);\n\t\tsNoise_B = (s1Byte)((tmp & 0xff00)>>8);\n\n\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"sNoise_A = %d, sNoise_B = %d\\n\",sNoise_A, sNoise_B));\n\n\t\tif((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))\n\t\t{\n\t\t\tValidCnt++;\n\t\t\tNoiseRpt_A += sNoise_A;\n\t\t\tNoiseRpt_B += sNoise_B;\n\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"sNoise_A = %d, sNoise_B = %d\\n\",sNoise_A, sNoise_B));\n\t\t}\n\n\t\tTimeCnt++;\n\t\tbTimeout = (TimeCnt >= 150)?TRUE:FALSE;\n\t\t\n\t\tif(ValidCnt == 20 || bTimeout)\n\t\t\tbreak;\n\n\t\tdelay_ms(2);\n\t\t\n\t}\n\n\t//1 Keep idle time power report\t\n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);\n\n\t//1 Recover IGI\n\tODM_Write_DIG(pDM_Odm, IGIBackup);\n\t\n\t//1 Calculate Noise Floor\n\tif(ValidCnt != 0)\n\t{\n\t\tNoiseRpt_A  /= (ValidCnt<<1);\n\t\tNoiseRpt_B  /= (ValidCnt<<1);\n\t}\n\t\n\tif(bTimeout)\n\t{\n\t\tNoiseRpt_A = 0;\n\t\tNoiseRpt_B = 0;\n\n\t\tfailCnt ++;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"Noise estimate fail time = %d\\n\", failCnt));\n\t\t\n\t\tif(failCnt == 3)\n\t\t{\n\t\t\tfailCnt = 0;\n\t\t\tpDM_DigTable->bNoiseEst = FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tNoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;\n\t\tNoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;\n\t\tpDM_DigTable->bNoiseEst = FALSE;\n\t\tfailCnt = 0;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"NoiseRpt_A = %d, NoiseRpt_B = %d\\n\", NoiseRpt_A, NoiseRpt_B));\n\t}\n\n\t//1 Calculate IGI Offset\n\tif(NoiseRpt_A > NoiseRpt_B)\n\t{\n\t\tpDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;\n\t\tpDM_DigTable->IGIOffset_B = 0;\n\t}\n\telse\n\t{\n\t\tpDM_DigTable->IGIOffset_A = 0;\n\t\tpDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;\n\t}\n\n#endif\n\treturn;\n}\n\nVOID\nodm_DigForBtHsMode(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\t\tpDM_DigTable=&pDM_Odm->DM_DigTable;\n\tu1Byte\t\t\t\t\tdigForBtHs=0;\n\tu1Byte\t\t\t\t\tdigUpBound=0x5a;\n\t\n\tif(pDM_Odm->bBtConnectProcess)\n\t{\n\t\tif(pDM_Odm->SupportICType&(ODM_RTL8723A))\n\t\t\tdigForBtHs = 0x28;\n\t\telse\n\t\t\tdigForBtHs = 0x22;\n\t}\n\telse\n\t{\n\t\t//\n\t\t// Decide DIG value by BT HS RSSI.\n\t\t//\n\t\tdigForBtHs = pDM_Odm->btHsRssi+4;\n\t\t\n\t\t//DIG Bound\n\t\tif(pDM_Odm->SupportICType&(ODM_RTL8723A))\n\t\t\tdigUpBound = 0x3e;\n\t\t\n\t\tif(digForBtHs > digUpBound)\n\t\t\tdigForBtHs = digUpBound;\n\t\tif(digForBtHs < 0x1c)\n\t\t\tdigForBtHs = 0x1c;\n\n\t\t// update Current IGI\n\t\tpDM_DigTable->BT30_CurIGI = digForBtHs;\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DigForBtHsMode() : set DigValue=0x%x\\n\", digForBtHs));\n#endif\n}\n\nVOID\nODM_Write_DIG(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tCurrentIGI\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tif (pDM_DigTable->bStopDIG) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"ODM_Write_DIG(): Stop Writing IGI\\n\"));\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, (\"ODM_Write_DIG(): ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x\\n\",\n\t\tODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));\n\n\t//1 Check initial gain by upper bound\t\t\n\tif ((!pDM_DigTable->bPSDInProgress) && pDM_Odm->bLinked)\n\t{\n\t\tif (CurrentIGI > pDM_DigTable->rx_gain_range_max) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, (\"ODM_Write_DIG(): CurrentIGI(0x%02x) is larger than upper bound !!\\n\", CurrentIGI));\n\t\t\tCurrentIGI = pDM_DigTable->rx_gain_range_max;\n\t\t}\n\t\tif (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)\n\t\t{\n\t\t\tif(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper)\n\t\t\t\tCurrentIGI = pDM_Odm->Adaptivity_IGI_upper;\n\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"ODM_Write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\\n\", CurrentIGI));\n\t\t}\n\t}\n\n\tif(pDM_DigTable->CurIGValue != CurrentIGI)\n\t{\n\n\t\t/*Add by YuChen for USB IO too slow issue*/\n\t\tif ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && (CurrentIGI > pDM_DigTable->CurIGValue))\n\t\t\tPhydm_Adaptivity(pDM_Odm, CurrentIGI);\n\n\t\t//1 Set IGI value\n\t\tif(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))\n\t\t{ \n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\n\t\t\tif(pDM_Odm->RFType > ODM_1T1R)\n\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\n\t\t\tif((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t}\n\t\t}\n\t\telse if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\n\t\t{\n\t\t\tswitch(*(pDM_Odm->pOnePathCCA))\n\t\t\t{\n\t\t\t\tcase ODM_CCA_2R:\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\n\t\t\t\t\tif(pDM_Odm->RFType > ODM_1T1R)\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\t\t\n\t\t\t\t\tif((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase ODM_CCA_1R_A:\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\t\tif(pDM_Odm->RFType != ODM_1T1R)\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));\n\t\t\t\t\tbreak;\n\t\t\t\tcase ODM_CCA_1R_B:\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));\n\t\t\t\t\tif(pDM_Odm->RFType != ODM_1T1R)\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tpDM_DigTable->CurIGValue = CurrentIGI;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, (\"ODM_Write_DIG(): CurrentIGI(0x%02x).\\n\", CurrentIGI));\n\t\n}\n\nVOID\nodm_PauseDIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tPHYDM_PAUSE_TYPE\t\tPauseType,\n\tIN\t\tPHYDM_PAUSE_LEVEL\t\tpause_level,\n\tIN\t\tu1Byte\t\t\t\t\tIGIValue\n)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG()=========> level = %d\\n\", pause_level));\n\n\tif ((pDM_DigTable->pause_dig_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \n\t\t\t(\"odm_PauseDIG(): Return: SupportAbility DIG or FA is disabled !!\\n\"));\n\t\treturn;\n\t}\n\n\tif (pause_level > DM_DIG_MAX_PAUSE_TYPE) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \n\t\t\t(\"odm_PauseDIG(): Return: Wrong pause level !!\\n\"));\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\\n\", pDM_DigTable->pause_dig_level, IGIValue));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\\n\", \n\t\tpDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],\n\t\tpDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));\n\t\n\tswitch (PauseType) {\n\t/* Pause DIG */\n\tcase PHYDM_PAUSE:\n\t{\n\t\t/* Disable DIG */\n\t\tODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Pause DIG !!\\n\"));\n\t\t\n\t\t/* Backup IGI value */\n\t\tif (pDM_DigTable->pause_dig_level == 0) {\n\t\t\tpDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Backup IGI  = 0x%x, new IGI = 0x%x\\n\", pDM_DigTable->IGIBackup, IGIValue));\n\t\t}\n\n\t\t/* Record IGI value */\n\t\tpDM_DigTable->pause_dig_value[pause_level] = IGIValue;\n\n\t\t/* Update pause level */\n\t\tpDM_DigTable->pause_dig_level = (pDM_DigTable->pause_dig_level | BIT(pause_level));\n\n\t\t/* Write new IGI value */\n\t\tif (BIT(pause_level + 1) > pDM_DigTable->pause_dig_level) {\n\t\t\tODM_Write_DIG(pDM_Odm, IGIValue);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): IGI of higher level = 0x%x\\n\",  IGIValue));\n\t\t}\n\t\tbreak;\n\t}\n\t/* Resume DIG */\n\tcase PHYDM_RESUME:\n\t{\n\t\t/* check if the level is illegal or not */\n\t\tif ((pDM_DigTable->pause_dig_level & (BIT(pause_level))) != 0) {\n\t\t\tpDM_DigTable->pause_dig_level = pDM_DigTable->pause_dig_level & (~(BIT(pause_level)));\n\t\t\tpDM_DigTable->pause_dig_value[pause_level] = 0;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Resume DIG !!\\n\"));\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Wrong resume level !!\\n\"));\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Resume DIG */\n\t\tif (pDM_DigTable->pause_dig_level == 0) {\n\t\t\t/* Write backup IGI value */\n\t\t\tODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);\n\t\t\tpDM_DigTable->bIgnoreDIG = TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Write original IGI = 0x%x\\n\", pDM_DigTable->IGIBackup));\n\n\t\t\t/* Enable DIG */\n\t\t\tODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);\t\n\t\t\tbreak;\n\t\t}\n\n\t\tif (BIT(pause_level) > pDM_DigTable->pause_dig_level) {\n\t\t\tu1Byte\t\tmax_level;\n\t\t\n\t\t\t/* Calculate the maximum level now */\n\t\t\tfor (max_level = (pause_level - 1); max_level >= 0; max_level--) {\n\t\t\t\tif ((pDM_DigTable->pause_dig_level & BIT(max_level)) > 0)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\t/* write IGI of lower level */\n\t\t\tODM_Write_DIG(pDM_Odm, pDM_DigTable->pause_dig_value[max_level]);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Write IGI (0x%x) of level (%d)\\n\",  \n\t\t\t\t pDM_DigTable->pause_dig_value[max_level], max_level));\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\tdefault:\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): Wrong  type !!\\n\"));\n\t\tbreak;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\\n\", pDM_DigTable->pause_dig_level, IGIValue));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\\n\", \n\t\tpDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],\n\t\tpDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));\n\n}\n\nBOOLEAN \nodm_DigAbort(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv = pDM_Odm->priv;\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tpAdapter\t= pDM_Odm->Adapter;\n\tpRXHP_T\t\t\tpRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\n#endif\n\n\t//SupportAbility\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\\n\"));\n\t\treturn\tTRUE;\n\t}\n\n\t//SupportAbility\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_DIG))\n\t{\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\\n\"));\n\t\treturn\tTRUE;\n\t}\n\n\t//ScanInProcess\n\tif(*(pDM_Odm->pbScanInProcess))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: In Scan Progress \\n\"));\n\t    \treturn\tTRUE;\n\t}\n\n\tif(pDM_DigTable->bIgnoreDIG)\n\t{\n\t\tpDM_DigTable->bIgnoreDIG = FALSE;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: Ignore DIG \\n\"));\n\t    \treturn\tTRUE;\n\t}\n\n\t//add by Neil Chen to avoid PSD is processing\n\tif(pDM_Odm->bDMInitialGainEnable == FALSE)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: PSD is Processing \\n\"));\n\t\treturn\tTRUE;\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#if OS_WIN_FROM_WIN7(OS_VERSION)\n\tif(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: Is AP mode or In HCT Test \\n\"));\n\t    \treturn\tTRUE;\n\t}\n\t#endif\n\n\tif(pDM_Odm->bBtHsOperation)\n\t{\n\t\todm_DigForBtHsMode(pDM_Odm);\n\t}\t\n\n\tif(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))\n\t{\n\t\tif(pRX_HP_Table->RXHP_flag == 1)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: In RXHP Operation \\n\"));\n\t\t\treturn\tTRUE;\t\n\t\t}\n\t}\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\t\n\tif((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))\n\t{\t\n\t\tprintk(\"pDM_Odm->RSSI_Min=%d \\n\",pDM_Odm->RSSI_Min);\n\t\tODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);\n\t\treturn\tTRUE;\n\t}\n\t#endif\n#else\n\tif (!(priv->up_time > 5))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Return: Not In DIG Operation Period \\n\"));\n\t\treturn\tTRUE;\n\t}\n#endif\n\n\treturn\tFALSE;\n}\n\nVOID\nodm_DIGInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tPFALSE_ALARM_STATISTICS \tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n#endif\n\n\tpDM_DigTable->bStopDIG = FALSE;\n\tpDM_DigTable->bIgnoreDIG = FALSE;\n\tpDM_DigTable->bPSDInProgress = FALSE;\n\tpDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));\n\tpDM_DigTable->RssiLowThresh \t= DM_DIG_THRESH_LOW;\n\tpDM_DigTable->RssiHighThresh \t= DM_DIG_THRESH_HIGH;\n\tpDM_DigTable->FALowThresh\t= DM_FALSEALARM_THRESH_LOW;\n\tpDM_DigTable->FAHighThresh\t= DM_FALSEALARM_THRESH_HIGH;\n\tpDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;\n\tpDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;\n\tpDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;\n\tpDM_DigTable->PreCCK_CCAThres = 0xFF;\n\tpDM_DigTable->CurCCK_CCAThres = 0x83;\n\tpDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;\n\tpDM_DigTable->LargeFAHit = 0;\n\tpDM_DigTable->Recover_cnt = 0;\n\tpDM_DigTable->bMediaConnect_0 = FALSE;\n\tpDM_DigTable->bMediaConnect_1 = FALSE;\n\n\t//To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error\n\tpDM_Odm->bDMInitialGainEnable = TRUE;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tpDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;\n\tpDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;\n\n\t// For AP\\ ADSL modified DIG\n\tpDM_DigTable->bTpTarget = FALSE;\n\tpDM_DigTable->bNoiseEst = TRUE;\n\tpDM_DigTable->IGIOffset_A = 0;\n\tpDM_DigTable->IGIOffset_B = 0;\n\tpDM_DigTable->TpTrainTH_min = 0;\n\n\t// For RTL8881A\n\tFalseAlmCnt->Cnt_Ofdm_fail_pre = 0;\n\n\t//Dyanmic EDCCA\n\tif(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);\n\t}\n#else\n\tpDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;\n\tpDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;\n\n\t//To Initi BT30 IGI\n\tpDM_DigTable->BT30_CurIGI=0x32;\n\n\tODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_dig_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));\n\tpDM_DigTable->pause_dig_level = 0;\n\tODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_cckpd_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));\n\tpDM_DigTable->pause_cckpd_level = 0;\n#endif\n\n\tif(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))\n\t{\n\t\tpDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;\n\t\tpDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;\n\t}\n\telse\n\t{\n\t\tpDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;\n\t\tpDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;\n\t}\n\t\n}\n\n\nVOID \nodm_DIG(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\t\t\t\tpAdapter\t= pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\t\t\t\tpriv = pDM_Odm->priv;\n\tPSTA_INFO_T   \t\t\t\tpEntry;\n#endif\n\n\t// Common parameters\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tPFALSE_ALARM_STATISTICS\t\tpFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tBOOLEAN\t\t\t\t\t\tFirstConnect,FirstDisConnect;\n\tu1Byte\t\t\t\t\t\tDIG_MaxOfMin, DIG_Dynamic_MIN;\n\tu1Byte\t\t\t\t\t\tdm_dig_max, dm_dig_min;\n\tu1Byte\t\t\t\t\t\tCurrentIGI = pDM_DigTable->CurIGValue;\n\tu1Byte\t\t\t\t\t\toffset;\n\tu4Byte\t\t\t\t\t\tdm_FA_thres[3];\n\tu4Byte\t\t\t\t\t\tTxTp = 0, RxTp = 0;\n\tBOOLEAN\t\t\t\t\t\tbDFSBand = FALSE;\n\tBOOLEAN\t\t\t\t\t\tbPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tu4Byte\t\t\t\t\t\tTpTrainTH_MIN = DM_DIG_TP_Target_TH0;\n\tstatic\t\tu1Byte\t\t\tTimeCnt = 0;\n\tu1Byte\t\t\t\t\t\ti;\n#endif\n\n\tif(odm_DigAbort(pDM_Odm) == TRUE)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG()===========================>\\n\\n\"));\n\t\n\n\t//1 Update status\n#if (RTL8192D_SUPPORT==1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\tif(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)\n\t\t{\n\t\t\tif(*(pDM_Odm->pbMasterOfDMSP))\n\t\t\t{\n\t\t\t\tDIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\n\t\t\t\tFirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\n\t\t\t\tFirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\n\t\t\t\tFirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);\n\t\t\t\tFirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(*(pDM_Odm->pBandType) == ODM_BAND_5G)\n\t\t\t{\n\t\t\t\tDIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\n\t\t\t\tFirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\n\t\t\t\tFirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\n\t\t\t\tFirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);\n\t\t\t\tFirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);\n\t\t\t}\n\t\t}\n\t}\n\telse\n#endif\n\t{\t\n\t\tDIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\n\t\tFirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\n\t\tFirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t//1 Noise Floor Estimate\n\t//pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;\n\t//odm_InbandNoiseCalculate (pDM_Odm);\n\t\n\t//1 Mode decision\n\tif(pDM_Odm->bLinked)\n\t{\n\t\t//2 Calculate total TP\n\t\tfor (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t\t{\n\t\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\t\tif(IS_STA_VALID(pEntry))\n\t\t\t{\n\t\t\t\tRxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);\n\t\t\t\tTxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7);\t\t\t//Kbps\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\\n\", TxTp, RxTp));\n\t}\n\n\tswitch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)\n\t{\n\t\tcase 0:\n\t\t{\n\t\t\tbPerformance = TRUE;\n\t\t\tbreak;\n\t\t}\n\t\tcase 1:\n\t\t{\n\t\t\tbPerformance = FALSE;\n\t\t\tbreak;\n\t\t}\n\t\tcase 2:\n\t\t{\n\t\t\tif(pDM_Odm->bLinked)\n\t\t\t{\n\t\t\t\tif(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)\n\t\t\t\t\tTpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;\n\n\t\t\t\tif(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)\n\t\t\t\t\tTpTrainTH_MIN = DM_DIG_TP_Target_TH1;\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): TP training mode lower bound = %dkbps\\n\", TpTrainTH_MIN));\n\n\t\t\t\t//2 Decide DIG mode by total TP\n\t\t\t\tif((TxTp + RxTp) > DM_DIG_TP_Target_TH1)\t\t\t// change to performance mode\n\t\t\t\t{\n\t\t\t\t\tbFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;\n\t\t\t\t\tpDM_DigTable->bTpTarget = TRUE;\n\t\t\t\t\tbPerformance = TRUE;\n\t\t\t\t}\n\t\t\t\telse if((TxTp + RxTp) < TpTrainTH_MIN)\t// change to coverage mode\n\t\t\t\t{\n\t\t\t\t\tbFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;\n\t\t\t\t\t\n\t\t\t\t\tif(TimeCnt < DM_DIG_TP_Training_Period)\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_DigTable->bTpTarget = FALSE;\n\t\t\t\t\t\tbPerformance = FALSE;\n\t\t\t\t\t\tTimeCnt++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_DigTable->bTpTarget = TRUE;\n\t\t\t\t\t\tbPerformance = TRUE;\n\t\t\t\t\t\tbFirstTpTarget = TRUE;\n\t\t\t\t\t\tTimeCnt = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\t\t\t\t\t\t\t\t\t\t// remain previous mode\n\t\t\t\t{\n\t\t\t\t\tbPerformance = pDM_DigTable->bTpTarget;\n\n\t\t\t\t\tif(!bPerformance)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(TimeCnt < DM_DIG_TP_Training_Period)\n\t\t\t\t\t\t\tTimeCnt++;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_DigTable->bTpTarget = TRUE;\n\t\t\t\t\t\t\tbPerformance = TRUE;\n\t\t\t\t\t\t\tbFirstTpTarget = TRUE;\n\t\t\t\t\t\t\tTimeCnt = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(!bPerformance)\n\t\t\t\t\tpDM_DigTable->TpTrainTH_min = RxTp + TxTp;\n\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbPerformance = FALSE;\n\t\t\t\tpDM_DigTable->TpTrainTH_min = 0;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbPerformance = TRUE;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"====== DIG mode = %d  ======\\n\", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"====== bPerformance = %d ======\\n\", bPerformance));\n#endif\n\n\t//1 Boundary Decision\n#if (RTL8192C_SUPPORT==1) \n\tif((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))\n\t{\n\t\t//2 High power case\n\t\tif(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\n\t\t{\n\t\t\tdm_dig_max = DM_DIG_MAX_AP_HP;\n\t\t\tdm_dig_min = DM_DIG_MIN_AP_HP;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdm_dig_max = DM_DIG_MAX_NIC_HP;\n\t\t\tdm_dig_min = DM_DIG_MIN_NIC_HP;\n\t\t}\n\t\tDIG_MaxOfMin = DM_DIG_MAX_AP_HP;\n\t}\n\telse\n#endif\n\t{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\t//2 For AP\\ADSL\n\t\tif(!bPerformance)\n\t\t{\n\t\t\tdm_dig_max = DM_DIG_MAX_AP_COVERAGR;\n\t\t\tdm_dig_min = DM_DIG_MIN_AP_COVERAGE;\n\t\t\tDIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdm_dig_max = DM_DIG_MAX_AP;\n\t\t\tdm_dig_min = DM_DIG_MIN_AP;\n\t\t\tDIG_MaxOfMin = DM_DIG_MAX_OF_MIN;\n\t\t}\n\n\t\t//4 DFS band\n\t\tif (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||\n\t\t\t((*pDM_Odm->pChannel >= 100) &&\t(*pDM_Odm->pChannel <= 140)))\n\t\t{\n\t\t\tbDFSBand = TRUE;\n\t\t\tif (*pDM_Odm->pBandWidth == ODM_BW20M){\n\t\t\t\tdm_dig_min = DM_DIG_MIN_AP_DFS+2;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tdm_dig_min = DM_DIG_MIN_AP_DFS;\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): ====== In DFS band ======\\n\"));\n\t\t}\n\t\t\n\t\t//4 TX2path\n\t\tif (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))\n\t\t\t\tdm_dig_max = 0x2A;\n\n#if RTL8192E_SUPPORT\n#ifdef HIGH_POWER_EXT_LNA\n\t\tif ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))\n\t\t\tdm_dig_max = 0x42;\t\t\t\t\t\t\n#endif\n#endif\n\n#else\n\t\t//2 For WIN\\CE\n\t\tif(pDM_Odm->SupportICType >= ODM_RTL8188E)\n\t\t\tdm_dig_max = 0x5A;\n\t\telse\n\t\t\tdm_dig_max = DM_DIG_MAX_NIC;\n\t\t\n\t\tif(pDM_Odm->SupportICType != ODM_RTL8821)\n\t\t\tdm_dig_min = DM_DIG_MIN_NIC;\n\t\telse\n\t\t\tdm_dig_min = 0x1C;\n\n\t\tDIG_MaxOfMin = DM_DIG_MAX_AP;\n#endif\t\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\\n\",dm_dig_max, dm_dig_min));\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t// for P2P case\n\tif(0 < *pDM_Odm->pu1ForcedIgiLb)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\\n\", *pDM_Odm->pu1ForcedIgiLb));\n\t\tdm_dig_min = *pDM_Odm->pu1ForcedIgiLb;\n\t\tdm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);\n\t}\n#endif\n\n\t//1 Adjust boundary by RSSI\n\tif(pDM_Odm->bLinked && bPerformance)\n\t{\n\t\t//2 Modify DIG upper bound\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\toffset = 15;\n#else\n\t\t//4 Modify DIG upper bound for 92E, 8723A\\B, 8821 & 8812 BT\n\t\tif((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))\n\t\t{\n\t\t\toffset = 10;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\\n\", offset));\t\t\n\t\t}\n\t\telse\n\t\t\toffset = 15;\n#endif\n\n\t\tif((pDM_Odm->RSSI_Min + offset) > dm_dig_max )\n\t\t\tpDM_DigTable->rx_gain_range_max = dm_dig_max;\n\t\telse if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )\n\t\t\tpDM_DigTable->rx_gain_range_max = dm_dig_min;\n\t\telse\n\t\t\tpDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\t//2 Modify DIG lower bound\n\t\t//if(pDM_Odm->bOneEntryOnly)\n\t\t{\n\t\t\tif(pDM_Odm->RSSI_Min < dm_dig_min)\n\t\t\t\tDIG_Dynamic_MIN = dm_dig_min;\n\t\t\telse if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\n\t\t\t\tDIG_Dynamic_MIN = DIG_MaxOfMin;\n\t\t\telse\n\t\t\t\tDIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\n\t\t}\n#else\n\t\t{\n\t\t\t//4 For AP\n#ifdef __ECOS\n\t\t\tHAL_REORDER_BARRIER();\n#else\n\t\t\trmb();\n#endif\n\t\t\tif (bDFSBand)\n\t\t\t{\n\t\t\t\tDIG_Dynamic_MIN = dm_dig_min;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\\n\", dm_dig_min));\n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\tif(pDM_Odm->RSSI_Min < dm_dig_min)\n\t\t\t\t\tDIG_Dynamic_MIN = dm_dig_min;\n\t\t\t\telse if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\n\t\t\t\t\tDIG_Dynamic_MIN = DIG_MaxOfMin;\n\t\t\t\telse\n\t\t\t\t\tDIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\n\t\t\t}\n\t\t}\n#endif\n\t}\n\telse\n\t{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\tif(bPerformance && bDFSBand)\n\t\t{\n\t\t\tpDM_DigTable->rx_gain_range_max = 0x28;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\\n\", pDM_DigTable->rx_gain_range_max));\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tpDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;\n\t\t}\n\t\tDIG_Dynamic_MIN = dm_dig_min;\n\t}\n\t\n\t//1 Force Lower Bound for AntDiv\n\tif(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)\n\t{\n\t\tif((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\n\t\t{\n\t\t\tif (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) {\n\t\t\t\tif (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)\n\t\t\t\t\tDIG_Dynamic_MIN = DIG_MaxOfMin;\n\t\t\t\telse\n\t\t\t\t\tDIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\\n\", DIG_Dynamic_MIN));\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\\n\", pDM_DigTable->AntDiv_RSSI_max));\n\t\t\t}\n\t\t}\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\\n\",\n\t\tpDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\\n\\n\",\n\t\tpDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));\n\n\t//1 Modify DIG lower bound, deal with abnormal case\n\t//2 Abnormal false alarm case\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tif(bDFSBand)\n\t{\n\t\tpDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\n\t}\n\telse\n#endif\n\t{\n\t\tif(!pDM_Odm->bLinked)\n\t\t{\n\t\t\tpDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\n\n\t\t\tif (FirstDisConnect)\n\t\t\t\tpDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;\n\t\t}\n\t\telse\n\t\t\tpDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);\n\t}\n\n\t//2 Abnormal # beacon case\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tif(pDM_Odm->bLinked && !FirstConnect)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"Beacon Num (%d)\\n\", pDM_Odm->PhyDbgInfo.NumQryBeaconPkt));\n\t\tif((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))\n\t\t{\n\t\t\tpDM_DigTable->rx_gain_range_min = dm_dig_min;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\\n\\n\",\n\t\t\t\tpDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));\n\t\t}\n\t}\n#endif\n\n\t//2 Abnormal lower bound case\n\tif(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)\n\t{\n\t\tpDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\\n\\n\",pDM_DigTable->rx_gain_range_min));\n\t}\n\n\t\n\t//1 False alarm threshold decision\n\todm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): False alarm threshold = %d, %d, %d \\n\\n\", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));\n\n\t//1 Adjust initial gain by false alarm\n\tif(pDM_Odm->bLinked && bPerformance)\n\t{\n\t\t//2 After link\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Adjust IGI after link\\n\"));\n\n\t\tif(bFirstTpTarget || (FirstConnect && bPerformance))\n\t\t{\t\n\t\t\tpDM_DigTable->LargeFAHit = 0;\n\t\t\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\t\tif(bDFSBand)\n\t\t\t{\n\t\t\t\tif(pDM_Odm->RSSI_Min > 0x28)\n\t\t\t\t\tCurrentIGI = 0x28;\n\t\t\t\telse\n\t\t\t\t\tCurrentIGI = pDM_Odm->RSSI_Min;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\\n\"));\n\t\t\t}\n\t\t\telse\n#endif\n\t\t\t{\n\t\t\t\tif(pDM_Odm->RSSI_Min < DIG_MaxOfMin)\n\t\t\t\t{\n\t\t\t\t\tif(CurrentIGI < pDM_Odm->RSSI_Min)\n\t\t\t\t\t\tCurrentIGI = pDM_Odm->RSSI_Min;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(CurrentIGI < DIG_MaxOfMin)\n\t\t\t\t\t\tCurrentIGI = DIG_MaxOfMin;\n\t\t\t\t}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n#if (RTL8812A_SUPPORT==1) \n\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t\t\t\tODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);\n#endif\n#endif\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): First connect case: IGI does on-shot to 0x%x\\n\", CurrentIGI));\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\n\t\t\t\tCurrentIGI = CurrentIGI + 4;\n\t\t\telse if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\n\t\t\t\tCurrentIGI = CurrentIGI + 2;\n\t\t\telse if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\n\t\t\t\tCurrentIGI = CurrentIGI - 2;\n\n\t\t\t//4 Abnormal # beacon case\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\t\tif((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))\n\t\t\t{\t\t\t\t\t\t\n\t\t\t\tCurrentIGI = pDM_DigTable->rx_gain_range_min;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\\n\", \n\t\t\t\t\tpDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));\n\t\t\t}\n#endif\n\t\t}\n\t}\t\n\telse\n\t{\n\t\t//2 Before link\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): Adjust IGI before link\\n\"));\n\t\t\n\t\tif(FirstDisConnect || bFirstCoverage)\n\t\t{\n\t\t\tCurrentIGI = dm_dig_min;\n\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): First disconnect case: IGI does on-shot to lower bound\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\n\t\t\t\tCurrentIGI = CurrentIGI + 4;\n\t\t\telse if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\n\t\t\t\tCurrentIGI = CurrentIGI + 2;\n\t\t\telse if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\n\t\t\t\tCurrentIGI = CurrentIGI - 2;\n\t\t}\n\t}\n\n\t//1 Check initial gain by upper/lower bound\n\tif(CurrentIGI < pDM_DigTable->rx_gain_range_min)\n\t\tCurrentIGI = pDM_DigTable->rx_gain_range_min;\n\t\n\tif(CurrentIGI > pDM_DigTable->rx_gain_range_max)\n\t\tCurrentIGI = pDM_DigTable->rx_gain_range_max;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): CurIGValue=0x%x, TotalFA = %d\\n\\n\", CurrentIGI, pFalseAlmCnt->Cnt_all));\t\n\n\t//1 High power RSSI threshold\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tif((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))\n\t{\n\t\t// High power IGI lower bound\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): UndecoratedSmoothedPWDB(%#x)\\n\", pHalData->UndecoratedSmoothedPWDB));\n\t\tif(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIG(): CurIGValue(%#x)\\n\", pDM_DigTable->CurIGValue));\n\t\t\t//pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;\n\t\t\tCurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;\n\t\t}\n\t}\n\tif((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))\n\t{\n\t\tif(pHalData->UndecoratedSmoothedPWDB > 0x28)\n\t\t{\n\t\t\tif(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)\n\t\t\t{\n\t\t\t \t//pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;\n\t\t\t\tCurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;\n\t\t\t}\t\n\t\t} \n\t}\n#endif\n\n\t//1 Update status\n#if (RTL8192D_SUPPORT==1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\t//sherry  delete DualMacSmartConncurrent 20110517\n\t\tif(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)\n\t\t{\n\t\t\tODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);\n\t\t\tif(*(pDM_Odm->pbMasterOfDMSP))\n\t\t\t{\n\t\t\t\tpDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\n\t\t\t\tpDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;\n\t\t\t\tpDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\n\t\t\tif(*(pDM_Odm->pBandType) == ODM_BAND_5G)\n\t\t\t{\n\t\t\t\tpDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\n\t\t\t\tpDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;\n\t\t\t\tpDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\n\t\t\t}\n\t\t}\n\t}\n\telse\n#endif\n\t{\n#if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))\n\t\tif(pDM_Odm->bBtHsOperation)\n\t\t{\n\t\t\tif(pDM_Odm->bLinked)\n\t\t\t{\n\t\t\t\tif(pDM_DigTable->BT30_CurIGI > (CurrentIGI))\n\t\t\t\t\tODM_Write_DIG(pDM_Odm, CurrentIGI);\n\t\t\t\telse\n\t\t\t\t\tODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);\n\t\t\t\t\t\n\t\t\t\tpDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\n\t\t\t\tpDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pDM_Odm->bLinkInProcess)\n\t\t\t\t\tODM_Write_DIG(pDM_Odm, 0x1c);\n\t\t\t\telse if(pDM_Odm->bBtConnectProcess)\n\t\t\t\t\tODM_Write_DIG(pDM_Odm, 0x28);\n\t\t\t\telse\n\t\t\t\t\tODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\t\n\t\t\t}\n\t\t}\n\t\telse\t\t// BT is not using\n#endif\n\t\t{\n\t\t\tODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\n\t\t\tpDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\n\t\t\tpDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\n\t\t}\n\t}\n}\n\nVOID\nodm_DIGbyRSSI_LPS(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPFALSE_ALARM_STATISTICS\t\tpFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\n\tu1Byte\tRSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C\n\tu1Byte\tCurrentIGI=pDM_Odm->RSSI_Min;\n\n\tif(odm_DigAbort(pDM_Odm) == TRUE)\n\t\treturn;\n\n\tCurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIGbyRSSI_LPS()==>\\n\"));\n\n\t// Using FW PS mode to make IGI\n\t//Adjust by  FA in LPS MODE\n\tif(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)\n\t\tCurrentIGI = CurrentIGI+4;\n\telse if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)\n\t\tCurrentIGI = CurrentIGI+2;\n\telse if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)\n\t\tCurrentIGI = CurrentIGI-2;\t\n\n\n\t//Lower bound checking\n\n\t//RSSI Lower bound check\n\tif((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)\n\t\tRSSI_Lower =(pDM_Odm->RSSI_Min-10);\n\telse\n\t\tRSSI_Lower =DM_DIG_MIN_NIC;\n\n\t//Upper and Lower Bound checking\n\t if(CurrentIGI > DM_DIG_MAX_NIC)\n\t \tCurrentIGI=DM_DIG_MAX_NIC;\n\t else if(CurrentIGI < RSSI_Lower)\n\t\tCurrentIGI =RSSI_Lower;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\\n\",pFalseAlmCnt->Cnt_all));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\\n\",pDM_Odm->RSSI_Min));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\\n\",CurrentIGI));\n\n\tODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\n#endif\n}\n\n//3============================================================\n//3 FASLE ALARM CHECK\n//3============================================================\n\nVOID \nodm_FalseAlarmCounterStatistics(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPFALSE_ALARM_STATISTICS \tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tu4Byte \t\t\t\t\t\tret_value;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n//Mark there, and check this in odm_DMWatchDog\n#if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tprtl8192cd_priv priv\t\t= pDM_Odm->priv;\n\tif( (priv->auto_channel != 0) && (priv->auto_channel != 2) )\n\t\treturn;\n#endif\n#endif\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics()======>\\n\"));\n\n#if (ODM_IC_11N_SERIES_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\n\t{\n\n\t\t//hold ofdm counter\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter\n\t\n\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);\n\t\tFalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);\n\t\tFalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);\t\t\n\n\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);\n\t\tFalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); \n\t\tFalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);\t\n\n\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);\n\t\tFalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);\n\t\tFalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);\n\n\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);\n\t\tFalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);\n\n\t\tFalseAlmCnt->Cnt_Ofdm_fail = \tFalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +\n\t\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +\n\t\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;\n\n#if (RTL8188E_SUPPORT==1)\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\t{\n\t\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);\n\t\t\tFalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);\n\t\t\tFalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);\n\t\t}\n#endif\n\n#if (RTL8192D_SUPPORT==1) \n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t\t{\n\t\t\todm_GetCCKFalseAlarm_92D(pDM_Odm);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\t//hold cck counter\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); \n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); \n\t\t\n\t\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);\n\t\t\tFalseAlmCnt->Cnt_Cck_fail = ret_value;\n\n\t\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);\n\t\t\tFalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;\n\n\t\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);\n\t\t\tFalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);\n\t\t}\n\t\n\t\tFalseAlmCnt->Cnt_all = (\tFalseAlmCnt->Cnt_Fast_Fsync + \n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_SB_Search_fail +\n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Parity_Fail +\n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Rate_Illegal +\n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Crc8_fail +\n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Mcs_fail +\n\t\t\t\t\t\t\tFalseAlmCnt->Cnt_Cck_fail);\t\n\n\t\tFalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;\n\n#if (RTL8192C_SUPPORT==1)\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192C)\n\t\t\todm_ResetFACounter_92C(pDM_Odm);\n#endif\n\n#if (RTL8192D_SUPPORT==1)\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t\t\todm_ResetFACounter_92D(pDM_Odm);\n#endif\n\n\t\tif(pDM_Odm->SupportICType >=ODM_RTL8723A)\n\t\t{\n\t\t\t//reset false alarm counter registers\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);\n\n\t\t\t//update ofdm counter\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter\n\n\t\t\t//reset CCK CCA counter\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); \n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); \n\t\t\t//reset CCK FA counter\n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); \n\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); \n\t\t}\n\t\t\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\\n\",\n\t\t\tFalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\\n\",\n\t\t\tFalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\\n\",\n\t\tFalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));\n\t}\n#endif\n\n#if (ODM_IC_11AC_SERIES_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t{\n\t\tu4Byte CCKenable;\n\t\t\n\t\t/* read OFDM FA counter */\n\t\tFalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);\n\t\t\n\n\t\t/* Read CCK FA counter */\n\t\tFalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);\n\n\t\t/* read CCK/OFDM CCA counter */\n\t\tret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);\n\t\tFalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;\n\t\tFalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;\n\n#if (RTL8881A_SUPPORT==1) \n\t\t/* For 8881A */\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8881A)\n\t\t{\n\t\t\tu4Byte Cnt_Ofdm_fail_temp = 0;\n\t\t\n\t\t\tif(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)\n\t\t\t{\n\t\t\t\tCnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;\n\t\t\t\tFalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\n\t\t\t\tFalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;\n\t\t\t}\n\t\t\telse\n\t\t\t\tFalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\\n\",\tFalseAlmCnt->Cnt_Ofdm_fail_pre));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail_pre=%d\\n\",\tCnt_Ofdm_fail_temp));\n\t\t\t\n\t\t\t/* Reset FA counter by enable/disable OFDM */\n\t\t\tif(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)\n\t\t\t{\n\t\t\t\t// reset OFDM\n\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);\n\t\t\t\tODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);\n\t\t\t\tFalseAlmCnt->Cnt_Ofdm_fail_pre = 0;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Reset false alarm counter\\n\"));\n\t\t\t}\n\t\t}\n#endif\n\n\t\t/* reset OFDM FA coutner */\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);\n\n\t\t/* reset CCK FA counter */\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);\n\n\t\t/* reset CCA counter */\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);\n\n\t\tCCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);\n\t\tif(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)\n\t\t{\n\t\t\tFalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;\n\t\t\tFalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tFalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;\n\t\t\tFalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;\n\t\t}\n\n\t}\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_OFDM_CCA=%d\\n\", FalseAlmCnt->Cnt_OFDM_CCA));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_CCK_CCA=%d\\n\", FalseAlmCnt->Cnt_CCK_CCA));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_CCA_all=%d\\n\", FalseAlmCnt->Cnt_CCA_all));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\\n\", FalseAlmCnt->Cnt_Ofdm_fail));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Cck_fail=%d\\n\", FalseAlmCnt->Cnt_Cck_fail));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\\n\", FalseAlmCnt->Cnt_Ofdm_fail));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, (\"odm_FalseAlarmCounterStatistics(): Total False Alarm=%d\\n\\n\", FalseAlmCnt->Cnt_all));\n}\n\n//3============================================================\n//3 CCK Packet Detect Threshold\n//3============================================================\n\nVOID\nodm_PauseCCKPacketDetection(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tPHYDM_PAUSE_TYPE\t\tPauseType,\n\tIN\t\tPHYDM_PAUSE_LEVEL\t\tpause_level,\n\tIN\t\tu1Byte\t\t\t\t\tCCKPDThreshold\n)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection()=========> level = %d\\n\", pause_level));\n\n\tif ((pDM_DigTable->pause_cckpd_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\\n\"));\n\t\treturn;\n\t}\n\n\tif (pause_level > DM_DIG_MAX_PAUSE_TYPE) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, \n\t\t\t(\"odm_PauseCCKPacketDetection(): Return: Wrong pause level !!\\n\"));\n\t\treturn;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\\n\", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\\n\", \n\t\tpDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],\n\t\tpDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));\n\n\tswitch (PauseType) {\n\t/* Pause CCK Packet Detection Threshold */\n\tcase PHYDM_PAUSE:\n\t{\n\t\t/* Disable CCK PD */\n\t\tODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Pause CCK packet detection threshold !!\\n\"));\n\n\t\t/* Backup original CCK PD threshold decided by CCK PD mechanism */\n\t\tif (pDM_DigTable->pause_cckpd_level == 0) {\n\t\t\tpDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, \n\t\t\t\t(\"odm_PauseCCKPacketDetection(): Backup CCKPD  = 0x%x, new CCKPD = 0x%x\\n\", pDM_DigTable->CCKPDBackup, CCKPDThreshold));\n\t\t}\n\n\t\t/* Update pause level */\n\t\tpDM_DigTable->pause_cckpd_level = (pDM_DigTable->pause_cckpd_level | BIT(pause_level));\n\n\t\t/* Record CCK PD threshold */\n\t\tpDM_DigTable->pause_cckpd_value[pause_level] = CCKPDThreshold;\n\t\t\n\t\t/* Write new CCK PD threshold */\n\t\tif (BIT(pause_level + 1) > pDM_DigTable->pause_cckpd_level) {\n\t\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): CCKPD of higher level = 0x%x\\n\", CCKPDThreshold));\n\t\t}\n\t\tbreak;\n\t}\n\t/* Resume CCK Packet Detection Threshold */\n\tcase PHYDM_RESUME:\n\t{\t\n\t\t/* check if the level is illegal or not */\n\t\tif ((pDM_DigTable->pause_cckpd_level & (BIT(pause_level))) != 0) {\n\t\t\tpDM_DigTable->pause_cckpd_level = pDM_DigTable->pause_cckpd_level & (~(BIT(pause_level)));\n\t\t\tpDM_DigTable->pause_cckpd_value[pause_level] = 0;\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Resume CCK PD !!\\n\"));\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Wrong resume level !!\\n\"));\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Resume DIG */\n\t\tif (pDM_DigTable->pause_cckpd_level == 0) {\n\t\t\t/* Write backup IGI value */\n\t\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);\n\t\t\t/* pDM_DigTable->bIgnoreDIG = TRUE; */\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Write original CCKPD = 0x%x\\n\", pDM_DigTable->CCKPDBackup));\n\n\t\t\t/* Enable DIG */\n\t\t\tODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);\t\n\t\t\tbreak;\n\t\t}\n\n\t\tif (BIT(pause_level) > pDM_DigTable->pause_cckpd_level) {\n\t\t\tu1Byte\tmax_level;\n\t\t\n\t\t\t/* Calculate the maximum level now */\n\t\t\tfor (max_level = (pause_level - 1); max_level >= 0; max_level--) {\n\t\t\t\tif ((pDM_DigTable->pause_cckpd_level & BIT(max_level)) > 0)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\t/* write CCKPD of lower level */\n\t\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->pause_cckpd_value[max_level]);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Write CCKPD (0x%x) of level (%d)\\n\", \n\t\t\t\tpDM_DigTable->pause_cckpd_value[max_level], max_level));\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\t}\n\tdefault:\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): Wrong  type !!\\n\"));\n\t\tbreak;\n\t}\t\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\\n\", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\\n\", \n\t\tpDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],\n\t\tpDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));\n}\n\n\nVOID \nodm_CCKPacketDetectionThresh(\n\tIN\t\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPFALSE_ALARM_STATISTICS \tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tu1Byte\t\t\t\t\t\tCurCCK_CCAThres, RSSI_thd = 55;\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n//modify by Guo.Mingzhi 2011-12-29\n\tif (pDM_Odm->bDualMacSmartConcurrent == TRUE)\n//\tif (pDM_Odm->bDualMacSmartConcurrent == FALSE)\n\t\treturn;\n\tif(pDM_Odm->bBtHsOperation)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\\n\"));\n\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);\n\t\treturn;\n\t}\n#endif\n\n\tif((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_CCKPacketDetectionThresh()  return==========\\n\"));\n#ifdef MCR_WIRELESS_EXTEND\n\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, 0x43);\n#endif\n\t\treturn;\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tif(pDM_Odm->ExtLNA)\n\t\treturn;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_CCKPacketDetectionThresh()  ==========>\\n\"));\n\n\tif (pDM_Odm->bLinked)\n\t{\n\t\tif (pDM_Odm->RSSI_Min > RSSI_thd)\n\t\t\tCurCCK_CCAThres = 0xcd;\n\t\telse if ((pDM_Odm->RSSI_Min <= RSSI_thd) && (pDM_Odm->RSSI_Min > 10))\n\t\t\tCurCCK_CCAThres = 0x83;\n\t\telse\n\t\t{\n\t\t\tif(FalseAlmCnt->Cnt_Cck_fail > 1000)\n\t\t\t\tCurCCK_CCAThres = 0x83;\n\t\t\telse\n\t\t\t\tCurCCK_CCAThres = 0x40;\n\t\t}\n\t} else {\n\t\tif(FalseAlmCnt->Cnt_Cck_fail > 1000)\n\t\t\tCurCCK_CCAThres = 0x83;\n\t\telse\n\t\t\tCurCCK_CCAThres = 0x40;\n\t}\n\t\n#if (RTL8192D_SUPPORT==1) \n\tif((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))\n\t\tODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);\n\telse\n#endif\n\t\tODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, (\"odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\\n\",CurCCK_CCAThres));\n}\n\nVOID\nODM_Write_CCK_CCA_Thres(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tCurCCK_CCAThres\n\t)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tif(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)\t\t//modify by Guo.Mingzhi 2012-01-03\n\t{\n\t\tODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);\n\t}\n\tpDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;\n\tpDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)\nVOID\nodm_RFEControl(\n\tIN\tPDM_ODM_T\tpDM_Odm,\n\tIN  u8Byte\t\tRSSIVal\n\t)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pDM_Odm->Adapter;\n    HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstatic u1Byte \tTRSW_HighPwr = 0;\n\t \n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\\n\",\n\t\t         RSSIVal, TRSW_HighPwr, pHalData->RFEType ));\n\n    if (pHalData->RFEType == 3) {\t   \n\t\t\n        pDM_Odm->RSSI_TRSW = RSSIVal;\n\n        if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) \n\t\t{\t\t\t\t \n            TRSW_HighPwr = 1; // Switch to\n            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\n            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control\n            \n        } \n\t\telse if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) \n        {\t  \n            TRSW_HighPwr = 0; // Switched back\n            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\n            PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control\n\n        }\n    }  \n\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\\n\", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\\n\", \n\t\t\t\t RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, (\"<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\\n\", RSSIVal, TRSW_HighPwr));\t\n}\n\nVOID\nodm_MPT_DIGWorkItemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tODM_MPT_DIG(pDM_Odm);\n}\n\nVOID\nodm_MPT_DIGCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n       HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t  PDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\n\t#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t\t#if USE_WORKITEM\n\t\t\tPlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\n\t\t#else\n\t\t\tODM_MPT_DIG(pDM_Odm);\n\t\t#endif\n\t#else\n\t\tPlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\n\t#endif\n\n}\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\nVOID\nodm_MPT_DIGCallback(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if USE_WORKITEM\n\tPlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\n#else\n\tODM_MPT_DIG(pDM_Odm);\n#endif\n}\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE != ODM_CE)\nVOID\nodm_MPT_Write_DIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\t\t\tCurIGValue\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);\n\n\tif(pDM_Odm->RFType > ODM_1T1R)\n\t\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);\n\n\tif((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\n\t{\n\t\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);\n\t\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);\t\n\t}\n\n\tpDM_DigTable->CurIGValue = CurIGValue;\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"CurIGValue = 0x%x\\n\", CurIGValue));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"pDM_Odm->RFType = 0x%x\\n\", pDM_Odm->RFType));\n}\n\nVOID\nODM_MPT_DIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpDIG_T\t\t\t\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tPFALSE_ALARM_STATISTICS\t\tpFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tu1Byte\t\t\t\t\t\tCurrentIGI = pDM_DigTable->CurIGValue;\n\tu1Byte\t\t\t\t\t\tDIG_Upper = 0x40, DIG_Lower = 0x20;\n\tu4Byte\t\t\t\t\t\tRXOK_cal;\n\tu4Byte\t\t\t\t\t\tRxPWDBAve_final;\n\tu1Byte\t\t\t\t\t\tIGI_A = 0x20, IGI_B = 0x20;\n\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\t#if ODM_FIX_2G_DIG\n\tIGI_A = 0x22;\n\tIGI_B = 0x24;\t\t\n\t#endif\n\t\n#else\n\tif (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))\n\t\treturn;\n\n\tif (*pDM_Odm->pBandType == ODM_BAND_5G)\n\t\tDIG_Lower = 0x22;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"===> ODM_MPT_DIG, pBandType = %d\\n\", *pDM_Odm->pBandType));\n\t\n#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP))\n\tif (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814\n#else\n\tif (1) // for both 2G/5G\n#endif\n\t\t{\n\t\todm_FalseAlarmCounterStatistics(pDM_Odm);\n\n\t\tRXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;\n\t\tRxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;\n\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\n\t\tpDM_Odm->RxPWDBAve = 0;\n\t\tpDM_Odm->MPDIG_2G = FALSE;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tpDM_Odm->Times_2G = 0;\n#endif\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"RX OK = %d\\n\", RXOK_cal));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"RSSI = %d\\n\", RxPWDBAve_final));\n\t\n\t\tif (RXOK_cal >= 70 && RxPWDBAve_final <= 40)\n\t\t{\n\t\t\tif (CurrentIGI > 0x24)\n\t\t\t\todm_MPT_Write_DIG(pDM_Odm, 0x24);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pFalseAlmCnt->Cnt_all > 1000){\n\t\t\t\tCurrentIGI = CurrentIGI + 8;\n\t\t\t}\n\t\t\telse if(pFalseAlmCnt->Cnt_all > 200){\n\t\t\t\tCurrentIGI = CurrentIGI + 4;\n\t\t\t}\n\t\t\telse if (pFalseAlmCnt->Cnt_all > 50){\n\t\t\t\tCurrentIGI = CurrentIGI + 2;\n\t\t\t}\n\t\t\telse if (pFalseAlmCnt->Cnt_all < 2){\n\t\t\t\tCurrentIGI = CurrentIGI - 2;\n\t\t\t}\n\t\t\t\n\t\t\tif (CurrentIGI < DIG_Lower ){\n\t\t\t\tCurrentIGI = DIG_Lower;\n\t\t\t}\n\n\t\t\tif(CurrentIGI > DIG_Upper){\n\t\t\t\tCurrentIGI = DIG_Upper;\n\t\t\t}\n\n\t\t\todm_MPT_Write_DIG(pDM_Odm, CurrentIGI);\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\\n\", \n\t\t\t\tCurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(pDM_Odm->MPDIG_2G == FALSE)\n\t\t{\n\t\t\tif((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)))\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, (\"===> Fix IGI\\n\"));\n\t\t\t\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);\n\t\t\t\tODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);\n\t\t\t\tpDM_DigTable->CurIGValue = IGI_B;\n\t\t\t}\n\t\t\telse\n\t\t\t\todm_MPT_Write_DIG(pDM_Odm, IGI_A);\n\t\t}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tpDM_Odm->Times_2G++;\n\n\t\tif (pDM_Odm->Times_2G == 3)\n#endif\n\t\t{\n\t\t\tpDM_Odm->MPDIG_2G = TRUE;\n\t\t}\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tif (pDM_Odm->SupportICType == ODM_RTL8812)\n\t\todm_RFEControl(pDM_Odm, RxPWDBAve_final);\n#endif\n\n\tODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);\n}\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_dig.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMDIG_H__\n#define    __PHYDMDIG_H__\n\n#define DIG_VERSION\t\"1.8\"\t/*2015.07.01*/\n\n/* Pause DIG & CCKPD */\n#define\t\tDM_DIG_MAX_PAUSE_TYPE\t\t0x7\n\ntypedef struct _Dynamic_Initial_Gain_Threshold_\n{\n\tBOOLEAN\t\tbStopDIG;\t\t// for debug\n\tBOOLEAN\t\tbIgnoreDIG;\n\tBOOLEAN\t\tbPSDInProgress;\n\n\tu1Byte\t\tDig_Enable_Flag;\n\tu1Byte\t\tDig_Ext_Port_Stage;\n\t\n\tint\t\t   \tRssiLowThresh;\n\tint\t\t    \tRssiHighThresh;\n\n\tu4Byte\t\tFALowThresh;\n\tu4Byte\t\tFAHighThresh;\n\n\tu1Byte\t\tCurSTAConnectState;\n\tu1Byte\t\tPreSTAConnectState;\n\tu1Byte\t\tCurMultiSTAConnectState;\n\n\tu1Byte\t\tPreIGValue;\n\tu1Byte\t\tCurIGValue;\n\tu1Byte\t\tBackupIGValue;\t\t//MP DIG\n\tu1Byte\t\tBT30_CurIGI;\n\tu1Byte\t\tIGIBackup;\n\n\ts1Byte\t\tBackoffVal;\n\ts1Byte\t\tBackoffVal_range_max;\n\ts1Byte\t\tBackoffVal_range_min;\n\tu1Byte\t\trx_gain_range_max;\n\tu1Byte\t\trx_gain_range_min;\n\tu1Byte\t\tRssi_val_min;\n\n\tu1Byte\t\tPreCCK_CCAThres;\n\tu1Byte\t\tCurCCK_CCAThres;\n\tu1Byte\t\tPreCCKPDState;\n\tu1Byte\t\tCurCCKPDState;\n\tu1Byte\t\tCCKPDBackup;\n\tu1Byte\t\tpause_cckpd_level;\n\tu1Byte\t\tpause_cckpd_value[DM_DIG_MAX_PAUSE_TYPE + 1];\n\n\tu1Byte\t\tLargeFAHit;\n\tu1Byte\t\tForbiddenIGI;\n\tu4Byte\t\tRecover_cnt;\n\n\tu1Byte\t\tDIG_Dynamic_MIN_0;\n\tu1Byte\t\tDIG_Dynamic_MIN_1;\n\tBOOLEAN\t\tbMediaConnect_0;\n\tBOOLEAN\t\tbMediaConnect_1;\n\n\tu4Byte\t\tAntDiv_RSSI_max;\n\tu4Byte\t\tRSSI_max;\n\n\tu1Byte\t\t*bP2PInProcess;\n\n\tu1Byte\t\tpause_dig_level;\n\tu1Byte\t\tpause_dig_value[DM_DIG_MAX_PAUSE_TYPE + 1];\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tBOOLEAN\t\tbTpTarget;\n\tBOOLEAN\t\tbNoiseEst;\n\tu4Byte\t\tTpTrainTH_min;\n\tu1Byte\t\tIGIOffset_A;\n\tu1Byte\t\tIGIOffset_B;\n#endif\n}DIG_T,*pDIG_T;\n\ntypedef struct _FALSE_ALARM_STATISTICS{\n\tu4Byte\tCnt_Parity_Fail;\n\tu4Byte\tCnt_Rate_Illegal;\n\tu4Byte\tCnt_Crc8_fail;\n\tu4Byte\tCnt_Mcs_fail;\n\tu4Byte\tCnt_Ofdm_fail;\n\tu4Byte\tCnt_Ofdm_fail_pre;\t//For RTL8881A\n\tu4Byte\tCnt_Cck_fail;\n\tu4Byte\tCnt_all;\n\tu4Byte\tCnt_Fast_Fsync;\n\tu4Byte\tCnt_SB_Search_fail;\n\tu4Byte\tCnt_OFDM_CCA;\n\tu4Byte\tCnt_CCK_CCA;\n\tu4Byte\tCnt_CCA_all;\n\tu4Byte\tCnt_BW_USC;\t//Gary\n\tu4Byte\tCnt_BW_LSC;\t//Gary\n}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;\n\ntypedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition\n{\n\tDIG_TYPE_THRESH_HIGH\t= 0,\n\tDIG_TYPE_THRESH_LOW\t= 1,\n\tDIG_TYPE_BACKOFF\t\t= 2,\n\tDIG_TYPE_RX_GAIN_MIN\t= 3,\n\tDIG_TYPE_RX_GAIN_MAX\t= 4,\n\tDIG_TYPE_ENABLE \t\t= 5,\n\tDIG_TYPE_DISABLE \t\t= 6,\t\n\tDIG_OP_TYPE_MAX\n}DM_DIG_OP_E;\n\n/*\ntypedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition\n{\n\tCCK_PD_STAGE_LowRssi = 0,\n\tCCK_PD_STAGE_HighRssi = 1,\n\tCCK_PD_STAGE_MAX = 3,\n}DM_CCK_PDTH_E;\n\ntypedef enum tag_DIG_EXT_PORT_ALGO_Definition\n{\n\tDIG_EXT_PORT_STAGE_0 = 0,\n\tDIG_EXT_PORT_STAGE_1 = 1,\n\tDIG_EXT_PORT_STAGE_2 = 2,\n\tDIG_EXT_PORT_STAGE_3 = 3,\n\tDIG_EXT_PORT_STAGE_MAX = 4,\n}DM_DIG_EXT_PORT_ALG_E;\n\ntypedef enum tag_DIG_Connect_Definition\n{\n\tDIG_STA_DISCONNECT = 0,\t\n\tDIG_STA_CONNECT = 1,\n\tDIG_STA_BEFORE_CONNECT = 2,\n\tDIG_MultiSTA_DISCONNECT = 3,\n\tDIG_MultiSTA_CONNECT = 4,\n\tDIG_CONNECT_MAX\n}DM_DIG_CONNECT_E;\n\n\n#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}\n\n#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER)\t\\\n\tDM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)\n\n#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER)\t\\\n\tDM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)\n*/\n\ntypedef enum tag_PHYDM_Pause_Type {\n\tPHYDM_PAUSE = BIT0,\n\tPHYDM_RESUME = BIT1\n} PHYDM_PAUSE_TYPE;\n\ntypedef enum tag_PHYDM_Pause_Level {\n/* number of pause level can't exceed DM_DIG_MAX_PAUSE_TYPE */\n\tPHYDM_PAUSE_LEVEL_0 = 0,\n\tPHYDM_PAUSE_LEVEL_1 = 1,\n\tPHYDM_PAUSE_LEVEL_2 = 2,\n\tPHYDM_PAUSE_LEVEL_3 = 3,\n\tPHYDM_PAUSE_LEVEL_4 = 4,\n\tPHYDM_PAUSE_LEVEL_5 = 5,\n\tPHYDM_PAUSE_LEVEL_6 = 6,\n\tPHYDM_PAUSE_LEVEL_7 = DM_DIG_MAX_PAUSE_TYPE\t\t/* maximum level */\n} PHYDM_PAUSE_LEVEL;\n\n\n#define\t\tDM_DIG_THRESH_HIGH\t\t\t40\n#define\t\tDM_DIG_THRESH_LOW\t\t\t35\n\n#define\t\tDM_FALSEALARM_THRESH_LOW\t400\n#define\t\tDM_FALSEALARM_THRESH_HIGH\t1000\n\n#define\t\tDM_DIG_MAX_NIC\t\t\t\t0x3e\n#define\t\tDM_DIG_MIN_NIC\t\t\t\t0x1e //0x22//0x1c\n#define\t\tDM_DIG_MAX_OF_MIN_NIC\t\t0x3e\n\n#define\t\tDM_DIG_MAX_AP\t\t\t\t\t0x3e\n#define\t\tDM_DIG_MIN_AP\t\t\t\t\t0x1c\n#define\t\tDM_DIG_MAX_OF_MIN\t\t\t0x2A\t//0x32\n#define\t\tDM_DIG_MIN_AP_DFS\t\t\t\t0x20\n\n#define\t\tDM_DIG_MAX_NIC_HP\t\t\t0x46\n#define\t\tDM_DIG_MIN_NIC_HP\t\t\t\t0x2e\n\n#define\t\tDM_DIG_MAX_AP_HP\t\t\t\t0x42\n#define\t\tDM_DIG_MIN_AP_HP\t\t\t\t0x30\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n#define\t\tDM_DIG_MAX_AP_COVERAGR\t\t0x26\n#define\t\tDM_DIG_MIN_AP_COVERAGE\t\t0x1c\n#define\t\tDM_DIG_MAX_OF_MIN_COVERAGE\t0x22\n\n#define\t\tDM_DIG_TP_Target_TH0\t\t\t500\n#define\t\tDM_DIG_TP_Target_TH1\t\t\t1000\n#define\t\tDM_DIG_TP_Training_Period\t\t10\n#endif\n\n//vivi 92c&92d has different definition, 20110504\n//this is for 92c\n#if (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\n\t#define\t\tDM_DIG_FA_TH0\t\t\t\t0x80//0x20\n\t#else\n\t#define\t\tDM_DIG_FA_TH0\t\t\t\t0x200//0x20\n\t#endif\n#else\n\t#define\t\tDM_DIG_FA_TH0\t\t\t\t0x200//0x20\n#endif\n\n#define\t\tDM_DIG_FA_TH1\t\t\t\t\t0x300\n#define\t\tDM_DIG_FA_TH2\t\t\t\t\t0x400\n//this is for 92d\n#define\t\tDM_DIG_FA_TH0_92D\t\t\t\t0x100\n#define\t\tDM_DIG_FA_TH1_92D\t\t\t\t0x400\n#define\t\tDM_DIG_FA_TH2_92D\t\t\t\t0x600\n\n#define\t\tDM_DIG_BACKOFF_MAX\t\t\t12\n#define\t\tDM_DIG_BACKOFF_MIN\t\t\t-4\n#define\t\tDM_DIG_BACKOFF_DEFAULT\t\t10\n\n#define \t\tDM_DIG_FA_TH0_LPS\t\t\t\t4 //-> 4 in lps\n#define \t\tDM_DIG_FA_TH1_LPS\t\t\t\t15 //-> 15 lps\n#define \t\tDM_DIG_FA_TH2_LPS\t\t\t\t30 //-> 30 lps\n#define \t\tRSSI_OFFSET_DIG\t\t\t\t0x05\n\nVOID\nODM_ChangeDynamicInitGainThresh(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tu4Byte  \t\t\t\t\tDM_Type,\n\tIN\t\tu4Byte \t\t\t\t\tDM_Value\n\t);\n\nVOID\nODM_Write_DIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID, \t\n\tIN\t\tu1Byte\t\t\t\t\tCurrentIGI\n\t);\n\nVOID\nodm_PauseDIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tPHYDM_PAUSE_TYPE\t\tPauseType,\n\tIN\t\tPHYDM_PAUSE_LEVEL\t\tpause_level,\n\tIN\t\tu1Byte\t\t\t\t\tIGIValue\n\t);\n\nVOID\nodm_DIGInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\t\nodm_DIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nodm_DIGbyRSSI_LPS(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_FalseAlarmCounterStatistics(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nodm_PauseCCKPacketDetection(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\t\tPHYDM_PAUSE_TYPE\t\tPauseType,\n\tIN\t\tPHYDM_PAUSE_LEVEL\t\tpause_level,\n\tIN\t\tu1Byte\t\t\t\t\tCCKPDThreshold\n\t);\n\nVOID \nodm_CCKPacketDetectionThresh(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nODM_Write_CCK_CCA_Thres(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID, \n\tIN\t\tu1Byte\t\t\t\t\tCurCCK_CCAThres\n\t);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nodm_MPT_DIGCallback(\n\tPRT_TIMER\t\t\t\t\t\tpTimer\n);\n\nVOID\nodm_MPT_DIGWorkItemCallback(\n    IN \t\tPVOID            \t\t\tpContext\n    );\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\nVOID\nodm_MPT_DIGCallback(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE != ODM_CE)\nVOID\nODM_MPT_DIG(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n);\n#endif\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_dynamicbbpowersaving.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\nVOID \nodm_DynamicBBPowerSavingInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPS_T\tpDM_PSTable = &pDM_Odm->DM_PSTable;\n\n\tpDM_PSTable->PreCCAState = CCA_MAX;\n\tpDM_PSTable->CurCCAState = CCA_MAX;\n\tpDM_PSTable->PreRFState = RF_MAX;\n\tpDM_PSTable->CurRFState = RF_MAX;\n\tpDM_PSTable->Rssi_val_min = 0;\n\tpDM_PSTable->initialize = 0;\n}\n\n\nVOID\nodm_DynamicBBPowerSaving(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\t\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\n\tif (pDM_Odm->SupportICType != ODM_RTL8723A)\n\t\treturn;\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))\n\t\treturn;\n\tif(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))\n\t\treturn;\n\t\n\t//1 2.Power Saving for 92C\n\tif((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))\n\t{\n\t\todm_1R_CCA(pDM_Odm);\n\t}\n\t\n\t// 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.\n\t// 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.\n\t//1 3.Power Saving for 88C\n\telse\n\t{\n\t\tODM_RF_Saving(pDM_Odm, FALSE);\n\t}\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\n}\n\nVOID\nodm_1R_CCA(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPS_T\tpDM_PSTable = &pDM_Odm->DM_PSTable;\n\n\tif(pDM_Odm->RSSI_Min!= 0xFF)\n\t{\n\t\t \n\t\tif(pDM_PSTable->PreCCAState == CCA_2R)\n\t\t{\n\t\t\tif(pDM_Odm->RSSI_Min >= 35)\n\t\t\t\tpDM_PSTable->CurCCAState = CCA_1R;\n\t\t\telse\n\t\t\t\tpDM_PSTable->CurCCAState = CCA_2R;\n\t\t\t\n\t\t}\n\t\telse{\n\t\t\tif(pDM_Odm->RSSI_Min <= 30)\n\t\t\t\tpDM_PSTable->CurCCAState = CCA_2R;\n\t\t\telse\n\t\t\t\tpDM_PSTable->CurCCAState = CCA_1R;\n\t\t}\n\t}\n\telse{\n\t\tpDM_PSTable->CurCCAState=CCA_MAX;\n\t}\n\t\n\tif(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)\n\t{\n\t\tif(pDM_PSTable->CurCCAState == CCA_1R)\n\t\t{\n\t\t\tif(  pDM_Odm->RFType ==ODM_2T2R )\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x13);\n\t\t\t\t//PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x23);\n\t\t\t\t//PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0xc04  , bMaskByte0, 0x33);\n\t\t\t//PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);\n\t\t}\n\t\tpDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;\n\t}\n}\n\nvoid\nODM_RF_Saving(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\tbForceInNormal \n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\tpPS_T\tpDM_PSTable = &pDM_Odm->DM_PSTable;\n\tu1Byte\tRssi_Up_bound = 30 ;\n\tu1Byte\tRssi_Low_bound = 25;\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tif(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV\n\t{\n\t\tRssi_Up_bound = 50 ;\n\t\tRssi_Low_bound = 45;\n\t}\n#endif\n\tif(pDM_PSTable->initialize == 0){\n\t\t\n\t\tpDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;\n\t\tpDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;\n\t\tpDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;\n\t\tpDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;\n\t\t//Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);\n\t\tpDM_PSTable->initialize = 1;\n\t}\n\n\tif(!bForceInNormal)\n\t{\n\t\tif(pDM_Odm->RSSI_Min != 0xFF)\n\t\t{\t\t\t \n\t\t\tif(pDM_PSTable->PreRFState == RF_Normal)\n\t\t\t{\n\t\t\t\tif(pDM_Odm->RSSI_Min >= Rssi_Up_bound)\n\t\t\t\t\tpDM_PSTable->CurRFState = RF_Save;\n\t\t\t\telse\n\t\t\t\t\tpDM_PSTable->CurRFState = RF_Normal;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tif(pDM_Odm->RSSI_Min <= Rssi_Low_bound)\n\t\t\t\t\tpDM_PSTable->CurRFState = RF_Normal;\n\t\t\t\telse\n\t\t\t\t\tpDM_PSTable->CurRFState = RF_Save;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tpDM_PSTable->CurRFState=RF_MAX;\n\t}\n\telse\n\t{\n\t\tpDM_PSTable->CurRFState = RF_Normal;\n\t}\n\t\n\tif(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)\n\t{\n\t\tif(pDM_PSTable->CurRFState == RF_Save)\n\t\t{\n\t\t\t// <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.\n\t\t\t// Suggested by SD3 Yu-Nan. 2011.01.20.\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8723A)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x874  , BIT5, 0x1); //Reg874[5]=1b'1\n\t\t\t}\n\t\t\tODM_SetBBReg(pDM_Odm, 0x874  , 0x1C0000, 0x2); //Reg874[20:18]=3'b010\n\t\t\tODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0\n\t\t\tODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63\n\t\t\tODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10\n\t\t\tODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3\n\t\t\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0\n\t\t\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, 0x874  , 0x1CC000, pDM_PSTable->Reg874); \n\t\t\tODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); \n\t\t\tODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);\n\t\t\tODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); \n\t\t\tODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);  \n\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8723A)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm,0x874  , BIT5, 0x0); //Reg874[5]=1b'0\n\t\t\t}\n\t\t}\n\t\tpDM_PSTable->PreRFState =pDM_PSTable->CurRFState;\n\t}\n#endif\t\n}\n\n"
  },
  {
    "path": "hal/phydm/phydm_dynamicbbpowersaving.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMDYNAMICBBPOWERSAVING_H__\n#define    __PHYDMDYNAMICBBPOWERSAVING_H__\n\n#define DYNAMIC_BBPWRSAV_VERSION\t\"1.0\"\n\ntypedef struct _Dynamic_Power_Saving_\n{\n\tu1Byte\t\tPreCCAState;\n\tu1Byte\t\tCurCCAState;\n\n\tu1Byte\t\tPreRFState;\n\tu1Byte\t\tCurRFState;\n\n\tint\t\t    Rssi_val_min;\n\t\n\tu1Byte\t\tinitialize;\n\tu4Byte\t\tReg874,RegC70,Reg85C,RegA74;\n\t\n}PS_T,*pPS_T;\n\n#define dm_RF_Saving\tODM_RF_Saving\n\nvoid ODM_RF_Saving(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\tbForceInNormal\n);\n\nVOID \nodm_DynamicBBPowerSavingInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_DynamicBBPowerSaving(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nodm_1R_CCA(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_dynamictxpower.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\nVOID \nodm_DynamicTxPowerInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\t\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\t#if DEV_BUS_TYPE==RT_USB_INTERFACE\t\t\t\t\t\n\tif(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)\n\t{\n\t\todm_DynamicTxPowerSavePowerIndex(pDM_Odm);\n\t\tpMgntInfo->bDynamicTxPowerEnable = TRUE;\n\t}\t\t\n\telse\t\n\t#else\n\t//so 92c pci do not need dynamic tx power? vivi check it later\n\tif(IS_HARDWARE_TYPE_8192D(Adapter))\n\t\tpMgntInfo->bDynamicTxPowerEnable = TRUE;\n\telse\n\t\tpMgntInfo->bDynamicTxPowerEnable = FALSE;\n\t#endif\n\t\n\n\tpHalData->LastDTPLvl = TxHighPwrLevel_Normal;\n\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\n\n#endif\n\t\n}\n\nVOID\nodm_DynamicTxPowerSavePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\t\n\t)\n{\t\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tu1Byte\t\tindex;\n\tu4Byte\t\tPower_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\n\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n\tfor(index = 0; index< 6; index++)\n\t\tpHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);\n\t\n\t\n#endif\n#endif\n}\n\nVOID\nodm_DynamicTxPowerRestorePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tu1Byte\t\t\tindex;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu4Byte\t\t\tPower_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tfor(index = 0; index< 6; index++)\n\t\tPlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);\n\n\n#endif\n#endif\n}\n\nVOID\nodm_DynamicTxPowerWritePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID, \n\tIN \tu1Byte\t\tValue)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tindex;\n\tu4Byte\t\t\tPower_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\n\t\n\tfor(index = 0; index< 6; index++)\n\t\t//PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);\n\t\tODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);\n\n}\n\n\nVOID \nodm_DynamicTxPower(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\t// \n\t// For AP/ADSL use prtl8192cd_priv\n\t// For CE/NIC use PADAPTER\n\t//\n\t//PADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n//\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\n\t\treturn;\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\t\tcase\tODM_CE:\n\t\t\todm_DynamicTxPowerNIC(pDM_Odm);\n\t\t\tbreak;\t\n\t\tcase\tODM_AP:\n\t\t\todm_DynamicTxPowerAP(pDM_Odm);\n\t\t\tbreak;\t\t\n\n\t\tcase\tODM_ADSL:\n\t\t\t//odm_DIGAP(pDM_Odm);\n\t\t\tbreak;\t\n\t}\n\n\t\n}\n\n\nVOID \nodm_DynamicTxPowerNIC(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\t\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\n\t\treturn;\n\t\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\n\tif(pDM_Odm->SupportICType == ODM_RTL8192C)\t\n\t{\n\t\todm_DynamicTxPower_92C(pDM_Odm);\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\todm_DynamicTxPower_92D(pDM_Odm);\n\t}\n\telse if (pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n\t\tPADAPTER\t\tAdapter\t =  pDM_Odm->Adapter;\n\t\tPMGNT_INFO\t\tpMgntInfo = GetDefaultMgntInfo(Adapter);\n\n\t\tif (pMgntInfo->RegRspPwr == 1)\n\t\t{\n\t\t\tif(pDM_Odm->RSSI_Min > 60)\n\t\t\t{\n\t\t\t\tODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB\n\n\t\t\t}\n\t\t\telse if(pDM_Odm->RSSI_Min < 55)\n\t\t\t{\n\t\t\t\tODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB\n\t\t\t}\n\t\t}\n#endif\n\t}\n#endif\t\n}\n\nVOID \nodm_DynamicTxPowerAP(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\n\t)\n{\t\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\n//#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))\n\n\n\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\ts4Byte i;\n\ts2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;\n\n\tif(!priv->pshare->rf_ft_var.tx_pwr_ctrl)\n\t\treturn;\n\t\n#if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1) || (RTL8814A_SUPPORT==1))\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A | ODM_RTL8814A))\n\t\tpwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;\n#endif\n\n#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\n\tif(CHIP_VER_92X_SERIES(priv))\n\t{\n#ifdef HIGH_POWER_EXT_PA\n\tif(pDM_Odm->ExtPA)\n\t\ttx_power_control(priv);\n#endif\t\t\n\t}\n#endif\t\n\t/*\n\t *\tCheck if station is near by to use lower tx power\n\t */\n\n\tif ((priv->up_time % 3) == 0 )  {\n\t\tint disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;\n\t\t\t\n\t\tfor(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){\n\t\t\tPSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\n\t\t\tif(IS_STA_VALID(pstat) ) {\n\t\t\t\t\tif(disable_pwr_ctrl)\n\t\t\t\t\t\tpstat->hp_level = 0;\n\t\t\t\t\t else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))\n\t\t\t\t\tpstat->hp_level = 1;\n\t\t\t\t\t\telse if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))\n\t\t\t\t\tpstat->hp_level = 0;\n\t\t\t}\n\t\t}\n\n#if defined(CONFIG_WLAN_HAL_8192EE)\n\t\tif (GET_CHIP_VER(priv) == VERSION_8192E) {\n\t\t\tif( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {\n\t\t\t\tif(pDM_Odm->RSSI_Min > pwr_thd)\n\t\t\t\t\tRRSR_power_control_11n(priv,  1 );\n\t\t\t\telse if(pDM_Odm->RSSI_Min < (pwr_thd-8))\n\t\t\t\t\tRRSR_power_control_11n(priv,  0 );\n\t\t\t} else {\n\t\t\t\t\tRRSR_power_control_11n(priv,  0 );\n\t\t\t}\n\t\t}\n#endif\t\t\t\n\n#ifdef CONFIG_WLAN_HAL_8814AE\n\t\tif (GET_CHIP_VER(priv) == VERSION_8814A) {\n\t\t\tif (!disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff)) {\n\t\t\t\tif (pDM_Odm->RSSI_Min > pwr_thd)\n\t\t\t\t\tRRSR_power_control_14(priv,  1);\n\t\t\t\telse if (pDM_Odm->RSSI_Min < (pwr_thd-8))\n\t\t\t\t\tRRSR_power_control_14(priv,  0);\n\t\t\t} else {\n\t\t\t\t\tRRSR_power_control_14(priv,  0);\n\t\t\t}\n\t\t}\n#endif\t\t\n\n\t}\n//#endif\t\n\n#endif\t\n}\n\n\nVOID \nodm_DynamicTxPower_92C(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\ts4Byte\t\t\t\tUndecoratedSmoothedPWDB;\n\n\t// 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.\n\tif (pDM_Odm->ExtPA == FALSE)\n\t\treturn;\n\n\t// STA not connected and AP not connected\n\tif((!pMgntInfo->bMediaConnect) &&\t\n\t\t(pHalData->EntryMinUndecoratedSmoothedPWDB == 0))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"Not connected to any \\n\"));\n\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\n\t\t//the LastDTPlvl should reset when disconnect, \n\t\t//otherwise the tx power level wouldn't change when disconnect and connect again.\n\t\t// Maddest 20091220.\n\t\t pHalData->LastDTPLvl=TxHighPwrLevel_Normal;\n\t\treturn;\n\t}\n\n#if (INTEL_PROXIMITY_SUPPORT == 1)\n\t// Intel set fixed tx power \n\tif(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)\n\t{\n\t\tswitch(pMgntInfo->IntelProximityModeInfo.PowerOutput){\n\t\t\tcase 1:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_100\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_70\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_50\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_35\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_15\\n\"));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_100\\n\"));\n\t\t\t\tbreak;\n\t\t}\t\t\n\t}\n\telse\n#endif\t\t\n\t{ \n\t\tif(\t(pMgntInfo->bDynamicTxPowerEnable != TRUE) ||\n\t\t\tpMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pMgntInfo->bMediaConnect)\t// Default port\n\t\t\t{\n\t\t\t\tif(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"AP Client PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"STA Default Port PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // associated entry pwdb\n\t\t\t{\t\n\t\t\t\tUndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"AP Ext Port PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t\t\t}\n\t\t\t\t\n\t\t\tif(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)\n\t\t\t{\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Level1 (TxPwr=0x0)\\n\"));\n\t\t\t}\n\t\t\telse if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&\n\t\t\t\t(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )\n\t\t\t{\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Level1 (TxPwr=0x10)\\n\"));\n\t\t\t}\n\t\t\telse if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))\n\t\t\t{\n\t\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Normal\\n\"));\n\t\t\t}\n\t\t}\n\t}\n\tif( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"PHY_SetTxPowerLevel8192C() Channel = %d \\n\" , pHalData->CurrentChannel));\n\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\tif(\t(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&\n\t\t\t(pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal\n\t\t\todm_DynamicTxPowerRestorePowerIndex(pDM_Odm);\n\t\telse if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)\n\t\t\todm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);\n\t\telse if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)\n\t\t\todm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);\n\t}\n\tpHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;\n\n\t\n\n\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n}\n\n\nVOID \nodm_DynamicTxPower_92D(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t)\n{\n#if (RTL8192D_SUPPORT==1)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\ts4Byte\t\t\t\tUndecoratedSmoothedPWDB;\n\n\tPADAPTER\tBuddyAdapter = Adapter->BuddyAdapter;\n\tBOOLEAN\t\tbGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);\n\tu1Byte\t\tHighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;\n\n\t// 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.\n\tif (pDM_Odm->ExtPA == FALSE)\n\t\treturn;\n\n\t// If dynamic high power is disabled.\n\tif( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||\n\t\tpMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)\n\t{\n\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\t\treturn;\n\t}\n\n\t// STA not connected and AP not connected\n\tif((!pMgntInfo->bMediaConnect) &&\t\n\t\t(pHalData->EntryMinUndecoratedSmoothedPWDB == 0))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"Not connected to any \\n\"));\n\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\n\t\t//the LastDTPlvl should reset when disconnect, \n\t\t//otherwise the tx power level wouldn't change when disconnect and connect again.\n\t\t// Maddest 20091220.\n\t\t pHalData->LastDTPLvl=TxHighPwrLevel_Normal;\n\t\treturn;\n\t}\n\t\n\tif(pMgntInfo->bMediaConnect)\t// Default port\n\t{\n\t\tif(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)\n\t\t{\n\t\t\tUndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"AP Client PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"STA Default Port PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t\t}\n\t}\n\telse // associated entry pwdb\n\t{\t\n\t\tUndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"AP Ext Port PWDB = 0x%x \\n\", UndecoratedSmoothedPWDB));\n\t}\n\t\n\tif(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){\n\t\tif(UndecoratedSmoothedPWDB >= 0x33)\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\\n\"));\n\t\t}\n\t\telse if((UndecoratedSmoothedPWDB <0x33) &&\n\t\t\t(UndecoratedSmoothedPWDB >= 0x2b) )\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\\n\"));\n\t\t}\n\t\telse if(UndecoratedSmoothedPWDB < 0x2b)\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"5G:TxHighPwrLevel_Normal\\n\"));\n\t\t}\n\n\t}\n\telse\n\t\n\t{\n\t\tif(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Level1 (TxPwr=0x0)\\n\"));\n\t\t}\n\t\telse if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&\n\t\t\t(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Level1 (TxPwr=0x10)\\n\"));\n\t\t}\n\t\telse if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))\n\t\t{\n\t\t\tpHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"TxHighPwrLevel_Normal\\n\"));\n\t\t}\n\n\t}\n\n//sherry  delete flag 20110517\n\tif(bGetValueFromBuddyAdapter)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() mac 0 for mac 1 \\n\"));\n\t\tif(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() change value \\n\"));\n\t\t\tHighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;\n\t\t\tpHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;\n\t\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\t\tpHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;\n\t\t\tAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;\n\t\t}\t\t\t\t\t\t\n\t}\n\n\tif( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )\n\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"PHY_SetTxPowerLevel8192S() Channel = %d \\n\" , pHalData->CurrentChannel));\n\t\t\tif(Adapter->DualMacSmartConcurrent == TRUE)\n\t\t\t{\n\t\t\t\tif(BuddyAdapter == NULL)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() BuddyAdapter == NULL case \\n\"));\n\t\t\t\t\tif(!Adapter->bSlaveOfDMSP)\n\t\t\t\t\t{\n\t\t\t\t\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() BuddyAdapter DMSP \\n\"));\n\t\t\t\t\t\tif(Adapter->bSlaveOfDMSP)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() bslave case  \\n\"));\n\t\t\t\t\t\t\tBuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;\n\t\t\t\t\t\t\tBuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() master case  \\n\"));\t\t\t\t\t\n\t\t\t\t\t\t\tif(!bGetValueFromBuddyAdapter)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() mac 0 for mac 0 \\n\"));\n\t\t\t\t\t\t\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,(\"dm_DynamicTxPower() BuddyAdapter DMDP\\n\"));\n\t\t\t\t\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\n\t\t\t}\n\n\t\t}\n\tpHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;\n\n\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#endif\n}\n\nVOID \nodm_DynamicTxPower_8821(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\tpu1Byte\t\t\tpDesc,\n\tIN\t\tu1Byte\t\t\tmacId\t\n\t)\n{\n#if (RTL8821A_SUPPORT == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPSTA_INFO_T\t\tpEntry;\n\tu1Byte\t\t\treg0xc56_byte;\n\tu1Byte\t\t\treg0xe56_byte;\n\tu1Byte\t\t\ttxpwr_offset = 0;\n\t\n\tpEntry = pDM_Odm->pODM_StaInfo[macId];\t\n\n\treg0xc56_byte = ODM_Read1Byte(pDM_Odm, 0xc56);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"reg0xc56_byte=%d\\n\", reg0xc56_byte));\n\n\tif (pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB > 85) {\n\n\t\t/* Avoid TXAGC error after TX power offset is applied.\n\t\tFor example: Reg0xc56=0x6, if txpwr_offset=3( reduce 11dB )\n\t\tTotal power = 6-11= -5( overflow!! ), PA may be burned !\n\t\tso txpwr_offset should be adjusted by Reg0xc56*/\n\t\t\n\t\tif (reg0xc56_byte < 7)\n\t\t\ttxpwr_offset = 1;\n\t\telse if (reg0xc56_byte < 11)\n\t\t\ttxpwr_offset = 2;\n\t\telse\n\t\t\ttxpwr_offset = 3;\n\t\t\n\t\tSET_TX_DESC_TX_POWER_OFFSET_8812(pDesc, txpwr_offset);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"odm_DynamicTxPower_8821: RSSI=%d, txpwr_offset=%d\\n\", pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB, txpwr_offset));\n\n\t} else{\n\t\tSET_TX_DESC_TX_POWER_OFFSET_8812(pDesc, txpwr_offset);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, (\"odm_DynamicTxPower_8821: RSSI=%d, txpwr_offset=%d\\n\", pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB, txpwr_offset));\n\n\t}\n#endif\t/*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\n#endif\t/*#if (RTL8821A_SUPPORT==1)*/\n}\n\n"
  },
  {
    "path": "hal/phydm/phydm_dynamictxpower.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMDYNAMICTXPOWER_H__\n#define    __PHYDMDYNAMICTXPOWER_H__\n\n/*#define DYNAMIC_TXPWR_VERSION\t\"1.0\"*/\n#define DYNAMIC_TXPWR_VERSION\t\"1.1\" /*2015.01.13*/\n\n#define\t\tTX_POWER_NEAR_FIELD_THRESH_LVL2\t74\n#define\t\tTX_POWER_NEAR_FIELD_THRESH_LVL1\t67\n#define\t\tTX_POWER_NEAR_FIELD_THRESH_AP\t\t0x3F\n#define\t\tTX_POWER_NEAR_FIELD_THRESH_8812\t60\n\n#define\t\tTxHighPwrLevel_Normal\t\t0\t\n#define\t\tTxHighPwrLevel_Level1\t\t1\n#define\t\tTxHighPwrLevel_Level2\t\t2\n#define\t\tTxHighPwrLevel_BT1\t\t\t3\n#define\t\tTxHighPwrLevel_BT2\t\t\t4\n#define\t\tTxHighPwrLevel_15\t\t\t5\n#define\t\tTxHighPwrLevel_35\t\t\t6\n#define\t\tTxHighPwrLevel_50\t\t\t7\n#define\t\tTxHighPwrLevel_70\t\t\t8\n#define\t\tTxHighPwrLevel_100\t\t\t9\n\nVOID \nodm_DynamicTxPowerInit(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nodm_DynamicTxPowerRestorePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_DynamicTxPowerNIC(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nVOID\nodm_DynamicTxPowerSavePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID\nodm_DynamicTxPowerWritePowerIndex(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID, \n\tIN \tu1Byte\t\tValue);\n\nVOID \nodm_DynamicTxPower_92C(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_DynamicTxPower_92D(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_DynamicTxPower_8821(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\t\n\tIN\t\tpu1Byte\t\t\t\t\tpDesc,\n\tIN\t\tu1Byte\t\t\t\t\tmacId\n\t);\n\n#endif\n\nVOID \nodm_DynamicTxPower(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\nVOID \nodm_DynamicTxPowerAP(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID\n\t);\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_edcaturbocheck.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\nVOID\nODM_EdcaTurboInit(\n\tIN \tPVOID\t \tpDM_VOID)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)\n\tPADAPTER\tAdapter = NULL;\n\tHAL_DATA_TYPE\t*pHalData = NULL;\n\n\tif(pDM_Odm->Adapter==NULL)\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"EdcaTurboInit fail!!!\\n\"));\n\t\treturn;\n\t}\n\n\tAdapter=pDM_Odm->Adapter;\n\tpHalData=GET_HAL_DATA(Adapter);\n\n\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\t\n\tpDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\n\tpHalData->bIsAnyNonBEPkts = FALSE;\n\t\n#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\t\n\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\t\n\tpDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\n\tAdapter->recvpriv.bIsAnyNonBEPkts =FALSE;\n\n#endif\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Orginial VO PARAM: 0x%x\\n\",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Orginial VI PARAM: 0x%x\\n\",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Orginial BE PARAM: 0x%x\\n\",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Orginial BK PARAM: 0x%x\\n\",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));\n\n\t\n}\t// ODM_InitEdcaTurbo\n\nVOID\nodm_EdcaTurboCheck(\n\tIN \tPVOID\t \tpDM_VOID\n\t)\n{\n\t// \n\t// For AP/ADSL use prtl8192cd_priv\n\t// For CE/NIC use PADAPTER\n\t//\n\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"odm_EdcaTurboCheck========================>\\n\"));\n\n\tif(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))\n\t\treturn;\n\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\n\t\t\todm_EdcaTurboCheckMP(pDM_Odm);\n#endif\n\t\t\tbreak;\n\n\t\tcase\tODM_CE:\n#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\n\t\t\todm_EdcaTurboCheckCE(pDM_Odm);\n#endif\n\t\t\tbreak;\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"<========================odm_EdcaTurboCheck\\n\"));\n\n}\t// odm_CheckEdcaTurbo\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\n\n\nVOID\nodm_EdcaTurboCheckCE(\n\tIN \tPVOID\t \tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\tu32\tEDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\n\tu32\tEDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\n\tu32\tICType=pDM_Odm->SupportICType;\n\tu32\tIOTPeer=0;\n\tu8\tWirelessMode=0xFF;                   //invalid value\n\tu32 \ttrafficIndex;\n\tu32\tedca_param;\n\tu64\tcur_tx_bytes = 0;\n\tu64\tcur_rx_bytes = 0;\n\tu8\tbbtchange = _FALSE;\n\tu8\tbBiasOnRx = _FALSE;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct dvobj_priv\t\t*pdvobjpriv = adapter_to_dvobj(Adapter);\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct recv_priv\t\t*precvpriv = &(Adapter->recvpriv);\n\tstruct registry_priv\t*pregpriv = &Adapter->registrypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &(Adapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(pDM_Odm->bLinked != _TRUE)\n\t{\n\t\tprecvpriv->bIsAnyNonBEPkts = _FALSE;\n\t\treturn;\n\t}\n\n\tif ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))\n\t{\n\t\tprecvpriv->bIsAnyNonBEPkts = _FALSE;\n\t\treturn;\n\t}\n\n\tif(pDM_Odm->pWirelessMode!=NULL)\n\t\tWirelessMode=*(pDM_Odm->pWirelessMode);\n\n\tIOTPeer = pmlmeinfo->assoc_AP_vendor;\n\n\tif (IOTPeer >=  HT_IOT_PEER_MAX)\n\t{\n\t\tprecvpriv->bIsAnyNonBEPkts = _FALSE;\n\t\treturn;\n\t}\n\n\tif(\t(pDM_Odm->SupportICType == ODM_RTL8192C) ||\n\t\t(pDM_Odm->SupportICType == ODM_RTL8723A) ||\n\t\t(pDM_Odm->SupportICType == ODM_RTL8188E))\n\t{\n\t\tif((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\n\t\t\tbBiasOnRx = _TRUE;\n\t}\n\n\t// Check if the status needs to be changed.\n\tif((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\n\t{\n\t\tcur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\n\t\tcur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\n\n\t\t//traffic, TX or RX\n\t\tif(bBiasOnRx)\n\t\t{\n\t\t\tif (cur_tx_bytes > (cur_rx_bytes << 2))\n\t\t\t{ // Uplink TP is present.\n\t\t\t\ttrafficIndex = UP_LINK; \n\t\t\t}\n\t\t\telse\n\t\t\t{ // Balance TP is present.\n\t\t\t\ttrafficIndex = DOWN_LINK;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (cur_rx_bytes > (cur_tx_bytes << 2))\n\t\t\t{ // Downlink TP is present.\n\t\t\t\ttrafficIndex = DOWN_LINK;\n\t\t\t}\n\t\t\telse\n\t\t\t{ // Balance TP is present.\n\t\t\t\ttrafficIndex = UP_LINK;\n\t\t\t}\n\t\t}\n\n\t\t//if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\n\t\t{\n\t\t\tif (ICType == ODM_RTL8192D) {\n\t\t\t\t// Single PHY\n\t\t\t\tif (pDM_Odm->RFType == ODM_2T2R) {\n\t\t\t\t\tEDCA_BE_UL = 0x60a42b;    //0x5ea42b;\n\t\t\t\t\tEDCA_BE_DL = 0x60a42b;    //0x5ea42b;\n\t\t\t} else {\n\t\t\t\t\tEDCA_BE_UL = 0x6ea42b;\n\t\t\t\t\tEDCA_BE_DL = 0x6ea42b;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {\n\t\t\t\t\tif((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {\n\t\t\t\t\t\tEDCA_BE_UL = 0x60a42b;\n\t\t\t\t\t\tEDCA_BE_DL = 0x60a42b;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tEDCA_BE_UL = 0x6ea42b;\n\t\t\t\t\t\tEDCA_BE_DL = 0x6ea42b;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t//92D txop can't be set to 0x3e for cisco1250\n\t\t\tif((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\n\t\t\t{\n\t\t\t\tEDCA_BE_DL = edca_setting_DL[IOTPeer];\n\t\t\t\tEDCA_BE_UL = edca_setting_UL[IOTPeer];\n\t\t\t}\n\t\t\t//merge from 92s_92c_merge temp brunch v2445    20120215 \n\t\t\telse if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\n\t\t\t{\n\t\t\t\tEDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\n\t\t\t}\n\t\t\telse if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\n\t\t\t{\n\t\t\t\tEDCA_BE_DL = 0xa630;\n\t\t\t}\n\t\t\telse if(IOTPeer == HT_IOT_PEER_MARVELL)\n\t\t\t{\n\t\t\t\tEDCA_BE_DL = edca_setting_DL[IOTPeer];\n\t\t\t\tEDCA_BE_UL = edca_setting_UL[IOTPeer];\n\t\t\t}\n\t\t\telse if(IOTPeer == HT_IOT_PEER_ATHEROS)\n\t\t\t{\n\t\t\t\t// Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \n\t\t\t\tEDCA_BE_DL = edca_setting_DL[IOTPeer];\n\t\t\t}\n\n\t\t\tif((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\n\t\t\t{\n\t\t\t\tEDCA_BE_UL = 0x5ea42b;\n\t\t\t\tEDCA_BE_DL = 0x5ea42b;\n\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\",EDCA_BE_UL,EDCA_BE_DL));\n\t\t\t}\n\n\t\t\tif (trafficIndex == DOWN_LINK)\n\t\t\t\tedca_param = EDCA_BE_DL;\n\t\t\telse\n\t\t\t\tedca_param = EDCA_BE_UL;\n\n\t\t\trtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\n\n\t\t\tpDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\n\t\t}\n\t\t\n\t\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\n\t}\n\telse\n\t{\n\t\t//\n\t\t// Turn Off EDCA turbo here.\n\t\t// Restore original EDCA according to the declaration of AP.\n\t\t//\n\t\t if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\n\t\t{\n\t\t\trtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\n\t\t\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\n\t\t}\n\t}\n\n}\n\n\n#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\nVOID\nodm_EdcaTurboCheckMP(\n\tIN \tPVOID\t \tpDM_VOID\n\t)\n{\n\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPADAPTER \t\t\tpDefaultAdapter = GetDefaultAdapter(Adapter);\n\tPADAPTER \t\t\tpExtAdapter = GetFirstExtAdapter(Adapter);//NULL;\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tPSTA_QOS\t\t\tpStaQos = Adapter->MgntInfo.pStaQos;\n\t//[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn\n\tu8Byte\t\t\t\tExt_curTxOkCnt = 0;\n\tu8Byte\t\t\t\tExt_curRxOkCnt = 0;\t\n\t//For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\t\n\tu1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\n\n\t// Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.\n\tu8Byte\t\t\t\tcurTxOkCnt = 0;\n\tu8Byte\t\t\t\tcurRxOkCnt = 0;\t\n\tu4Byte\t\t\t\tEDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\n\tu4Byte\t\t\t\tEDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\n\tu4Byte                         EDCA_BE = 0x5ea42b;\n\tu1Byte                         IOTPeer=0;\n\tBOOLEAN                      *pbIsCurRDLState=NULL;\n\tBOOLEAN                      bLastIsCurRDLState=FALSE;\n\tBOOLEAN\t\t\t\t bBiasOnRx=FALSE;\n\tBOOLEAN\t\t\t\tbEdcaTurboOn=FALSE;\n\tu1Byte\t\t\t\tTxRate = 0xFF;\n\tu8Byte\t\t\t\tvalue64;\t\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"odm_EdcaTurboCheckMP========================>\"));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Orginial BE PARAM: 0x%x\\n\",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));\n\n////===============================\n////list paramter for different platform\n////===============================\n\tbLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;\n\tpbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);\t\n\n\t//2012/09/14 MH Add \n\tif (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)\n\t\tpHalData->bIsAnyNonBEPkts = TRUE;\n\n\tpMgntInfo->NumNonBePkt = 0;\n\n       // Caculate TX/RX TP:\n\t//curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\n\t//curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\n\tcurTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;\n\tcurRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;\n\tpDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\n\tpDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\n\n\tif(pExtAdapter == NULL) \n\t\tpExtAdapter = pDefaultAdapter;\n\n\tExt_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;\n\tExt_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;\n\tGetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\n\t//For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\n\tif(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\n\t{\n\t\tcurTxOkCnt = Ext_curTxOkCnt ;\n\t\tcurRxOkCnt = Ext_curRxOkCnt ;\n\t}\n\t//\n\tIOTPeer=pMgntInfo->IOTPeer;\n\tbBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;\n\tbEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"bIsAnyNonBEPkts : 0x%lx  \\n\",pHalData->bIsAnyNonBEPkts));\n\n\n////===============================\n////check if edca turbo is disabled\n////===============================\n\tif(odm_IsEdcaTurboDisable(pDM_Odm))\n\t{\n\t\tpHalData->bIsAnyNonBEPkts = FALSE;\n\t\tpMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\n\t\tpMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\n\t\tpMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;\n\t\tpMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;\n\n\t}\n\n////===============================\n////remove iot case out\n////===============================\n\tODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\n\n\n////===============================\n////Check if the status needs to be changed.\n////===============================\n\tif(bEdcaTurboOn)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\\n\",bEdcaTurboOn,bBiasOnRx));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"curTxOkCnt : 0x%lx \\n\",curTxOkCnt));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"curRxOkCnt : 0x%lx \\n\",curRxOkCnt));\n\t\tif(bBiasOnRx)\n\t\t\todm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);\n\t\telse\n\t\t\todm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);\n\n//modify by Guo.Mingzhi 2011-12-29\n\t\t\tEDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\n\t\t\tif(IS_HARDWARE_TYPE_8821U(Adapter))\n\t\t\t{\n\t\t\t\tif(pMgntInfo->RegTxDutyEnable)\n\t\t\t\t{\n\t\t\t\t\t//2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\n\t\t\t\t\tif(!pMgntInfo->ForcedDataRate) //auto rate\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pDM_Odm->TxRate != 0xFF)\n\t\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \n\t\t\t\t\t}\n\t\t\t\t\telse //force rate\n\t\t\t\t\t{\n\t\t\t\t\t\tTxRate = (u1Byte) pMgntInfo->ForcedDataRate;\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue64 = (curRxOkCnt<<2);\n\t\t\t\t\tif(curTxOkCnt < value64) //Downlink\n\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\telse //Uplink\n\t\t\t\t\t{\n\t\t\t\t\t\t/*DbgPrint(\"pRFCalibrateInfo->ThermalValue = 0x%X\\n\", pRFCalibrateInfo->ThermalValue);*/\n\t\t\t\t\t\t/*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\n\t\t\t\t\t\tif((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\n\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch (TxRate)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS6:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS5:\n\t\t\t\t\t\t\t\tcase MGN_MCS6:\n\t\t\t\t\t\t\t\tcase MGN_MCS5:\n\t\t\t\t\t\t\t\tcase MGN_48M:\n\t\t\t\t\t\t\t\tcase MGN_54M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS4:\n\t\t\t\t\t\t\t\tcase MGN_MCS4:\n\t\t\t\t\t\t\t\tcase MGN_36M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS3:\n\t\t\t\t\t\t\t\tcase MGN_MCS3:\n\t\t\t\t\t\t\t\tcase MGN_24M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS2:\n\t\t\t\t\t\t\t\tcase MGN_MCS2:\n\t\t\t\t\t\t\t\tcase MGN_18M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS1:\n\t\t\t\t\t\t\t\tcase MGN_MCS1:\n\t\t\t\t\t\t\t\tcase MGN_9M:\n\t\t\t\t\t\t\t\tcase MGN_12M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS0:\n\t\t\t\t\t\t\t\tcase MGN_MCS0:\n\t\t\t\t\t\t\t\tcase MGN_6M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse if (IS_HARDWARE_TYPE_8812AU(Adapter)){\n\t\t\t\tif(pMgntInfo->RegTxDutyEnable)\n\t\t\t\t{\n\t\t\t\t\t//2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)\n\t\t\t\t\t// it;s the same issue as 8811AU\n\t\t\t\t\tif(!pMgntInfo->ForcedDataRate) //auto rate\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pDM_Odm->TxRate != 0xFF)\n\t\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \n\t\t\t\t\t}\n\t\t\t\t\telse //force rate\n\t\t\t\t\t{\n\t\t\t\t\t\tTxRate = (u1Byte) pMgntInfo->ForcedDataRate;\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue64 = (curRxOkCnt<<2);\n\t\t\t\t\tif(curTxOkCnt < value64) //Downlink\n\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\telse //Uplink\n\t\t\t\t\t{\n\t\t\t\t\t\t/*DbgPrint(\"pRFCalibrateInfo->ThermalValue = 0x%X\\n\", pRFCalibrateInfo->ThermalValue);*/\n\t\t\t\t\t\t/*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\n\t\t\t\t\t\tif((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\n\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch (TxRate)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS9:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS9:\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS8:\n\t\t\t\t\t\t\t\tcase MGN_MCS15:\n\t\t\t\t\t\t\t\tcase MGN_MCS7:\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS8:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS7:\n\t\t\t\t\t\t\t\tcase MGN_MCS14:\n\t\t\t\t\t\t\t\tcase MGN_MCS6:\n\t\t\t\t\t\t\t\tcase MGN_54M:\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS7:\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS6:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS6:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS5:\n\t\t\t\t\t\t\t\tcase MGN_MCS13:\n\t\t\t\t\t\t\t\tcase MGN_MCS5:\n\t\t\t\t\t\t\t\tcase MGN_48M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS5:\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS4:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS4:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS3:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS12:\n\t\t\t\t\t\t\t\tcase MGN_MCS4:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS3:\t\n\t\t\t\t\t\t\t\tcase MGN_36M:\n\t\t\t\t\t\t\t\tcase MGN_24M:\t\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS3:\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS2:\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS1:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS2:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS1:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS11:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS10:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS9:\t\t\n\t\t\t\t\t\t\t\tcase MGN_MCS2:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS1:\n\t\t\t\t\t\t\t\tcase MGN_18M:\t\n\t\t\t\t\t\t\t\tcase MGN_12M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase MGN_VHT2SS_MCS0:\n\t\t\t\t\t\t\t\tcase MGN_VHT1SS_MCS0:\n\t\t\t\t\t\t\t\tcase MGN_MCS0:\t\n\t\t\t\t\t\t\t\tcase MGN_MCS8:\n\t\t\t\t\t\t\t\tcase MGN_9M:\t\n\t\t\t\t\t\t\t\tcase MGN_6M:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"EDCA Turbo on: EDCA_BE:0x%lx\\n\",EDCA_BE));\n\n\t\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"EDCA_BE_DL : 0x%lx  EDCA_BE_UL : 0x%lx  EDCA_BE : 0x%lx  \\n\",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));\n\n\t}\n\telse\n\t{\n\t\t// Turn Off EDCA turbo here.\n\t\t// Restore original EDCA according to the declaration of AP.\n\t\t if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\n\t\t{\n\t\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\n\n\t\t\tpDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Restore EDCA BE: 0x%lx  \\n\",pDM_Odm->WMMEDCA_BE));\n\n\t\t}\n\t}\n\n}\n\n\n//check if edca turbo is disabled\nBOOLEAN\nodm_IsEdcaTurboDisable(\n\tIN \tPVOID\t \tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tu4Byte\t\t\t\tIOTPeer=pMgntInfo->IOTPeer;\n\n\tif(pDM_Odm->bBtDisableEdcaTurbo)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, (\"EdcaTurboDisable for BT!!\\n\"));\n\t\treturn TRUE;\n\t}\n\n\tif((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||\n\t\t(pDM_Odm->bWIFITest)||\n\t\t(IOTPeer>= HT_IOT_PEER_MAX))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, (\"EdcaTurboDisable\\n\"));\n\t\treturn TRUE;\n\t}\n\n\n\t// 1. We do not turn on EDCA turbo mode for some AP that has IOT issue\n\t// 2. User may disable EDCA Turbo mode with OID settings.\n\tif(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, (\"IOTAction:EdcaTurboDisable\\n\"));\n\t\treturn\tTRUE;\n\t\t}\n\t\t\n\treturn\tFALSE;\n\t\n\n}\n\n//add iot case here: for MP/CE\nVOID \nODM_EdcaParaSelByIot(\n\tIN \tPVOID\t \tpDM_VOID,\n\tOUT\tu4Byte\t\t*EDCA_BE_UL,\n\tOUT u4Byte\t\t*EDCA_BE_DL\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t       Adapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tu4Byte                         IOTPeer=0;\n\tu4Byte                         ICType=pDM_Odm->SupportICType;\n\tu1Byte                         WirelessMode=0xFF;                   //invalid value\n\tu4Byte\t\t\t\tRFType=pDM_Odm->RFType;\n\tu4Byte                         IOTPeerSubType = 0;\n\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\tu1Byte \t\t\t\tTwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\n\n\tif(pDM_Odm->pWirelessMode!=NULL)\n\t\tWirelessMode=*(pDM_Odm->pWirelessMode);\n\t\t\n///////////////////////////////////////////////////////////\n////list paramter for different platform\n\n\tIOTPeer=pMgntInfo->IOTPeer;\n\tIOTPeerSubType=pMgntInfo->IOTPeerSubtype;\n\tGetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\n\n\n\tif(ICType==ODM_RTL8192D)\n\t{      \n\t\t// Single PHY\n\t\tif(pDM_Odm->RFType==ODM_2T2R)\n\t\t{\n\t\t\t(*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;\n\t\t\t(*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t(*EDCA_BE_UL) = 0x6ea42b;\n\t\t\t(*EDCA_BE_DL) = 0x6ea42b;\n\t\t}\n\n\t}\n////============================\n/// IOT case for MP\n////============================\t\n\n\telse\n\t{\n\n\t\tif(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){\n\t\t\tif((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))\t\t\t{\n\t\t\t\t(*EDCA_BE_UL) = 0x60a42b;\n\t\t\t\t(*EDCA_BE_DL) = 0x60a42b;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t(*EDCA_BE_UL) = 0x6ea42b;\n\t\t\t\t(*EDCA_BE_DL) = 0x6ea42b;\n\t\t\t}\n\t\t}\n\t}\n \n\tif(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\n\t{\n\t\t(*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];\n\t\t(*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];\n\t}\n     \n\t#if (INTEL_PROXIMITY_SUPPORT == 1)\n\tif(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\n\t{\n\t\t(*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\n\t}\n\telse\n\t#endif\t\t\n\t{\n\t\tif((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))\n\t\t{// To check whether we shall force turn on TXOP configuration.\n\t\t\tif(!((*EDCA_BE_UL) & 0xffff0000))\n\t\t\t\t(*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.\n\t\t\tif(!((*EDCA_BE_DL) & 0xffff0000))\n\t\t\t\t(*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.\n\t\t}\n\t\t\n\t\t//92D txop can't be set to 0x3e for cisco1250\n\t\tif((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\n\t\t{\n\t\t\t(*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\n\t\t\t(*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\n\t\t}\n\t\t//merge from 92s_92c_merge temp brunch v2445    20120215 \n\t\telse if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))\n\t\t{\n\t\t\t(*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\n\t\t}\n\t\telse if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\n\t\t{\n\t\t\t(*EDCA_BE_DL) = 0xa630;\n\t\t}\n\n\t\telse if(IOTPeer == HT_IOT_PEER_MARVELL)\n\t\t{\n\t\t\t(*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\n\t\t\t(*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\n\t\t}\n\t\telse if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)\n\t\t{\n\t\t\t// Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \n\t\t\tif(WirelessMode==ODM_WM_G)\n\t\t\t\t(*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\n\t\t\telse\n\t\t\t\t(*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\n\n\t\t\tif(ICType == ODM_RTL8821)\n\t\t\t\t (*EDCA_BE_DL) = 0x5ea630;\n\t\t\t\n\t\t}\n\t}\n\n    \tif((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))\n\t{\n\t\t(*EDCA_BE_DL) = 0x432b;\n\t\t(*EDCA_BE_UL) = 0x432b;\n\t}\t\t\n\n\n\n\tif((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\n\t{\n\t\t(*EDCA_BE_UL) = 0x5ea42b;\n\t\t(*EDCA_BE_DL) = 0x5ea42b;\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\\n\",(*EDCA_BE_UL),(*EDCA_BE_DL)));\n\t}\n\n\tif((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK))           /*8814AU and 8814AR*/\n\t{\n\t\t(*EDCA_BE_UL) = 0x5ea42b;\n\t\t(*EDCA_BE_DL) = 0xa42b;\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"8814A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\\n\",(*EDCA_BE_UL),(*EDCA_BE_DL)));\n\t}\n\n\t\n\n\t// Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.\n\tif((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && \n\t\t(pMgntInfo->dot11CurrentChannelNumber == 6))\n\t{\n\t\t(*EDCA_BE_DL) = 0xa92b;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx, IOTPeer = %d\\n\",(*EDCA_BE_UL),(*EDCA_BE_DL), IOTPeer));\n\n}\n\n\nVOID\nodm_EdcaChooseTrafficIdx( \n\tIN \tPVOID\t \tpDM_VOID,\n\tIN\tu8Byte  \t\t\tcur_tx_bytes,  \n\tIN\tu8Byte  \t\t\tcur_rx_bytes, \n\tIN\tBOOLEAN \t\tbBiasOnRx,\n\tOUT BOOLEAN \t\t*pbIsCurRDLState\n\t)\n{\t\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif(bBiasOnRx)\n\t{\n\t  \n\t\tif(cur_tx_bytes>(cur_rx_bytes*4))\n\t\t{\n\t\t\t*pbIsCurRDLState=FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Uplink Traffic\\n \"));\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*pbIsCurRDLState=TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Balance Traffic\\n\"));\n\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(cur_rx_bytes>(cur_tx_bytes*4))\n\t\t{\n\t\t\t*pbIsCurRDLState=TRUE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Downlink\tTraffic\\n\"));\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*pbIsCurRDLState=FALSE;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,(\"Balance Traffic\\n\"));\n\t\t}\n\t}\n\n\treturn ;\n}\n\n#endif\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_edcaturbocheck.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMEDCATURBOCHECK_H__\n#define    __PHYDMEDCATURBOCHECK_H__\n\n/*#define EDCATURBO_VERSION\t\"2.1\"*/\n#define EDCATURBO_VERSION\t\"2.2\"\t/*2015.01.13*/\n\ntypedef struct _EDCA_TURBO_\n{\n\tBOOLEAN bCurrentTurboEDCA;\n\tBOOLEAN bIsCurRDLState;\n\n\t#if(DM_ODM_SUPPORT_TYPE == ODM_CE\t)\n\tu4Byte\tprv_traffic_idx; // edca turbo\n\t#endif\n\n}EDCA_T,*pEDCA_T;\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\nstatic u4Byte edca_setting_UL[HT_IOT_PEER_MAX] = \n// UNKNOWN\t\tREALTEK_90\tREALTEK_92SE\tBROADCOM\t\tRALINK\t\tATHEROS\t\tCISCO\t\tMERU        MARVELL\t92U_AP\t\tSELF_AP(DownLink/Tx)\n{ 0x5e4322, \t\t0xa44f, \t\t0x5e4322,\t\t0x5ea32b,  \t\t0x5ea422, \t0x5ea322,\t0x3ea430,\t0x5ea42b, 0x5ea44f,\t0x5e4322,\t0x5e4322};\n\n\nstatic u4Byte edca_setting_DL[HT_IOT_PEER_MAX] = \n// UNKNOWN\t\tREALTEK_90\tREALTEK_92SE\tBROADCOM\t\tRALINK\t\tATHEROS\t\tCISCO\t\tMERU,       MARVELL\t92U_AP\t\tSELF_AP(UpLink/Rx)\n{ 0xa44f, \t\t0x5ea44f, \t0x5e4322, \t\t0x5ea42b, \t\t0xa44f, \t\t0xa630, \t\t0x5ea630,\t0x5ea42b, 0xa44f,\t\t0xa42b,\t\t0xa42b};\n\nstatic u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] = \n// UNKNOWN\t\tREALTEK_90\tREALTEK_92SE\tBROADCOM\t\tRALINK\t\tATHEROS\t\tCISCO\t\tMERU,       MARVELL\t92U_AP\t\tSELF_AP\n{ 0x4322, \t\t0xa44f, \t\t0x5e4322,\t\t0xa42b, \t\t\t0x5e4322, \t0x4322, \t\t0xa42b,\t\t0x5ea42b, 0xa44f,\t\t0x5e4322,\t0x5ea42b};\n\n#endif\n\n\n\nVOID\nodm_EdcaTurboCheck(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\nVOID\nODM_EdcaTurboInit(\n\tIN \tPVOID\t \tpDM_VOID\n);\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\nVOID\nodm_EdcaTurboCheckMP(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\n//check if edca turbo is disabled\nBOOLEAN\nodm_IsEdcaTurboDisable(\n\tIN \tPVOID\t \tpDM_VOID\n);\n//choose edca paramter for special IOT case\nVOID \nODM_EdcaParaSelByIot(\n\tIN\t\tPVOID\t\t\t\t\tpDM_VOID,\n\tOUT\tu4Byte\t\t*EDCA_BE_UL,\n\tOUT u4Byte\t\t*EDCA_BE_DL\n\t);\n//check if it is UL or DL\nVOID\nodm_EdcaChooseTrafficIdx( \n\tIN \tPVOID\t \tpDM_VOID,\n\tIN\tu8Byte  \t\t\tcur_tx_bytes,  \n\tIN\tu8Byte  \t\t\tcur_rx_bytes, \n\tIN\tBOOLEAN \t\tbBiasOnRx,\n\tOUT BOOLEAN \t\t*pbIsCurRDLState\n\t);\n\n#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)\nVOID\nodm_EdcaTurboCheckCE(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n#endif\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_hwconfig.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm))\n#define READ_AND_CONFIG_TC(ic, txt) (ODM_ReadAndConfig_TC_##ic##txt(pDM_Odm))\n\n\n#if (PHYDM_TESTCHIP_SUPPORT == 1)\n#define READ_AND_CONFIG(ic, txt) do {\\\n                                            if (pDM_Odm->bIsMPChip)\\\n                                    \t\t    READ_AND_CONFIG_MP(ic,txt);\\\n                                            else\\\n                                                READ_AND_CONFIG_TC(ic,txt);\\\n                                    } while(0)\n#else\n  #define READ_AND_CONFIG     READ_AND_CONFIG_MP\n#endif\n\n\n#define READ_FIRMWARE_MP(ic, txt) \t\t(ODM_ReadFirmware_MP_##ic##txt(pDM_Odm, pFirmware, pSize))\n#define READ_FIRMWARE_TC(ic, txt) \t\t(ODM_ReadFirmware_TC_##ic##txt(pDM_Odm, pFirmware, pSize))\t\t\n\n#if (PHYDM_TESTCHIP_SUPPORT == 1)\n#define READ_FIRMWARE(ic, txt) do {\\\n\t\t\t\t\t\tif (pDM_Odm->bIsMPChip)\\\n\t\t\t\t\t\t\tREAD_FIRMWARE_MP(ic,txt);\\\n\t\t\t\t\t\telse\\\n\t\t\t\t\t\t\tREAD_FIRMWARE_TC(ic,txt);\\\n\t\t\t\t\t} while(0) \n#else\n#define READ_FIRMWARE     READ_FIRMWARE_MP\n#endif\n\t\t\t\t\t\t\n#define GET_VERSION_MP(ic, txt) \t\t(ODM_GetVersion_MP_##ic##txt())\n#define GET_VERSION_TC(ic, txt) \t\t(ODM_GetVersion_TC_##ic##txt())\n#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt))\n\nu1Byte\nodm_QueryRxPwrPercentage(\n\tIN\t\ts1Byte\t\tAntPower\n\t)\n{\n\tif ((AntPower <= -100) || (AntPower >= 20))\n\t{\n\t\treturn\t0;\n\t}\n\telse if (AntPower >= 0)\n\t{\n\t\treturn\t100;\n\t}\n\telse\n\t{\n\t\treturn\t(100+AntPower);\n\t}\n\t\n}\n\n\n//\n// 2012/01/12 MH MOve some signal strength smooth method to MP HAL layer.\n// IF other SW team do not support the feature, remove this section.??\n//\ns4Byte\nodm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(\t\n\tIN OUT PDM_ODM_T pDM_Odm,\n\ts4Byte CurrSig \n)\n{\t\n\ts4Byte RetSig = 0;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t//if(pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) \n\t{\n\t\t// Step 1. Scale mapping.\n\t\t// 20100611 Joseph: Re-tunning RSSI presentation for Lenovo.\n\t\t// 20100426 Joseph: Modify Signal strength mapping.\n\t\t// This modification makes the RSSI indication similar to Intel solution.\n\t\t// 20100414 Joseph: Tunning RSSI for Lenovo according to RTL8191SE.\n\t\tif(CurrSig >= 54 && CurrSig <= 100)\n\t\t{\n\t\t\tRetSig = 100;\n\t\t}\n\t\telse if(CurrSig>=42 && CurrSig <= 53 )\n\t\t{\n\t\t\tRetSig = 95;\n\t\t}\n\t\telse if(CurrSig>=36 && CurrSig <= 41 )\n\t\t{\n\t\t\tRetSig = 74 + ((CurrSig - 36) *20)/6;\n\t\t}\n\t\telse if(CurrSig>=33 && CurrSig <= 35 )\n\t\t{\n\t\t\tRetSig = 65 + ((CurrSig - 33) *8)/2;\n\t\t}\n\t\telse if(CurrSig>=18 && CurrSig <= 32 )\n\t\t{\n\t\t\tRetSig = 62 + ((CurrSig - 18) *2)/15;\n\t\t}\n\t\telse if(CurrSig>=15 && CurrSig <= 17 )\n\t\t{\n\t\t\tRetSig = 33 + ((CurrSig - 15) *28)/2;\n\t\t}\n\t\telse if(CurrSig>=10 && CurrSig <= 14 )\n\t\t{\n\t\t\tRetSig = 39;\n\t\t}\n\t\telse if(CurrSig>=8 && CurrSig <= 9 )\n\t\t{\n\t\t\tRetSig = 33;\n\t\t}\n\t\telse if(CurrSig <= 8 )\n\t\t{\n\t\t\tRetSig = 19;\n\t\t}\n\t}\n#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\treturn RetSig;\n}\n\ns4Byte\nodm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(\t\n\tIN OUT PDM_ODM_T pDM_Odm,\n\ts4Byte CurrSig \n)\n{\n\ts4Byte RetSig = 0;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t//if(pDM_Odm->SupportInterface  == ODM_ITRF_USB)\n\t{\n\t\t// Netcore request this modification because 2009.04.13 SU driver use it. \n\t\tif(CurrSig >= 31 && CurrSig <= 100)\n\t\t{\n\t\t\tRetSig = 100;\n\t\t}\t\n\t\telse if(CurrSig >= 21 && CurrSig <= 30)\n\t\t{\n\t\t\tRetSig = 90 + ((CurrSig - 20) / 1);\n\t\t}\n\t\telse if(CurrSig >= 11 && CurrSig <= 20)\n\t\t{\n\t\t\tRetSig = 80 + ((CurrSig - 10) / 1);\n\t\t}\n\t\telse if(CurrSig >= 7 && CurrSig <= 10)\n\t\t{\n\t\t\tRetSig = 69 + (CurrSig - 7);\n\t\t}\n\t\telse if(CurrSig == 6)\n\t\t{\n\t\t\tRetSig = 54;\n\t\t}\n\t\telse if(CurrSig == 5)\n\t\t{\n\t\t\tRetSig = 45;\n\t\t}\n\t\telse if(CurrSig == 4)\n\t\t{\n\t\t\tRetSig = 36;\n\t\t}\n\t\telse if(CurrSig == 3)\n\t\t{\n\t\t\tRetSig = 27;\n\t\t}\n\t\telse if(CurrSig == 2)\n\t\t{\n\t\t\tRetSig = 18;\n\t\t}\n\t\telse if(CurrSig == 1)\n\t\t{\n\t\t\tRetSig = 9;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRetSig = CurrSig;\n\t\t}\n\t}\n#endif //ENDIF (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\treturn RetSig;\n}\n\n\ns4Byte\nodm_SignalScaleMapping_92CSeries(\t\n\tIN OUT PDM_ODM_T pDM_Odm,\n\tIN s4Byte CurrSig \n)\n{\n\ts4Byte RetSig = 0; \n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) \n\tif(pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) \n\t{\n\t\t// Step 1. Scale mapping.\n\t\tif(CurrSig >= 61 && CurrSig <= 100)\n\t\t{\n\t\t\tRetSig = 90 + ((CurrSig - 60) / 4);\n\t\t}\n\t\telse if(CurrSig >= 41 && CurrSig <= 60)\n\t\t{\n\t\t\tRetSig = 78 + ((CurrSig - 40) / 2);\n\t\t}\n\t\telse if(CurrSig >= 31 && CurrSig <= 40)\n\t\t{\n\t\t\tRetSig = 66 + (CurrSig - 30);\n\t\t}\n\t\telse if(CurrSig >= 21 && CurrSig <= 30)\n\t\t{\n\t\t\tRetSig = 54 + (CurrSig - 20);\n\t\t}\n\t\telse if(CurrSig >= 5 && CurrSig <= 20)\n\t\t{\n\t\t\tRetSig = 42 + (((CurrSig - 5) * 2) / 3);\n\t\t}\n\t\telse if(CurrSig == 4)\n\t\t{\n\t\t\tRetSig = 36;\n\t\t}\n\t\telse if(CurrSig == 3)\n\t\t{\n\t\t\tRetSig = 27;\n\t\t}\n\t\telse if(CurrSig == 2)\n\t\t{\n\t\t\tRetSig = 18;\n\t\t}\n\t\telse if(CurrSig == 1)\n\t\t{\n\t\t\tRetSig = 9;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRetSig = CurrSig;\n\t\t}\n\t}\n#endif\n\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) ||(DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n\tif((pDM_Odm->SupportInterface  == ODM_ITRF_USB) || (pDM_Odm->SupportInterface  == ODM_ITRF_SDIO))\n\t{\n\t\tif(CurrSig >= 51 && CurrSig <= 100)\n\t\t{\n\t\t\tRetSig = 100;\n\t\t}\n\t\telse if(CurrSig >= 41 && CurrSig <= 50)\n\t\t{\n\t\t\tRetSig = 80 + ((CurrSig - 40)*2);\n\t\t}\n\t\telse if(CurrSig >= 31 && CurrSig <= 40)\n\t\t{\n\t\t\tRetSig = 66 + (CurrSig - 30);\n\t\t}\n\t\telse if(CurrSig >= 21 && CurrSig <= 30)\n\t\t{\n\t\t\tRetSig = 54 + (CurrSig - 20);\n\t\t}\n\t\telse if(CurrSig >= 10 && CurrSig <= 20)\n\t\t{\n\t\t\tRetSig = 42 + (((CurrSig - 10) * 2) / 3);\n\t\t}\n\t\telse if(CurrSig >= 5 && CurrSig <= 9)\n\t\t{\n\t\t\tRetSig = 22 + (((CurrSig - 5) * 3) / 2);\n\t\t}\n\t\telse if(CurrSig >= 1 && CurrSig <= 4)\n\t\t{\n\t\t\tRetSig = 6 + (((CurrSig - 1) * 3) / 2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRetSig = CurrSig;\n\t\t}\n\t}\n\n#endif\n\treturn RetSig;\n}\ns4Byte\nodm_SignalScaleMapping(\t\n\tIN OUT PDM_ODM_T pDM_Odm,\n\tIN\ts4Byte CurrSig \n)\n{\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tif(\t(pDM_Odm->SupportPlatform == ODM_WIN) && \n\t\t(pDM_Odm->SupportInterface  != ODM_ITRF_PCIE) && //USB & SDIO\n\t\t(pDM_Odm->PatchID==10))//pMgntInfo->CustomerID == RT_CID_819x_Netcore\n\t{\n\t\treturn odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Netcore(pDM_Odm,CurrSig);\n\t}\n\telse if(\t(pDM_Odm->SupportPlatform == ODM_WIN) && \n\t\t\t(pDM_Odm->SupportInterface  == ODM_ITRF_PCIE) &&\n\t\t\t(pDM_Odm->PatchID==19))//pMgntInfo->CustomerID == RT_CID_819x_Lenovo)\n\t{\n\t\treturn odm_SignalScaleMapping_92CSeries_patch_RT_CID_819x_Lenovo(pDM_Odm, CurrSig);\n\t}else\n#endif\n        {\t\t\n\t\treturn odm_SignalScaleMapping_92CSeries(pDM_Odm,CurrSig);\n\t}\n\t\n}\n\n\n\nstatic u1Byte odm_SQ_process_patch_RT_CID_819x_Lenovo(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN u1Byte \t\tisCCKrate,\n\tIN u1Byte \t\tPWDB_ALL,\n\tIN u1Byte \t\tpath,\n\tIN u1Byte \t\tRSSI\n)\n{\n\tu1Byte\tSQ = 0;\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\t\t\t\n\n\tif(isCCKrate){\n\t\t\n\t\tif(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter))\n\t\t{\n\n\t\t\t//\n\t\t\t// <Roger_Notes> Expected signal strength and bars indication at Lenovo lab. 2013.04.11\n\t\t\t// 802.11n, 802.11b, 802.11g only at channel 6\n\t\t\t//\n\t\t\t//\t\tAttenuation (dB)\tOS Signal Bars\tRSSI by Xirrus (dBm)\n\t\t\t//\t\t\t50\t\t\t\t5\t\t\t-52\n\t\t\t//\t\t\t55\t\t\t\t5\t\t\t-54\n\t\t\t//\t\t\t60\t\t\t\t5\t\t\t-55\n\t\t\t//\t\t\t65\t\t\t\t5\t\t\t-59\n\t\t\t//\t\t\t70\t\t\t\t5\t\t\t-63\n\t\t\t//\t\t\t75\t\t\t\t5\t\t\t-66\n\t\t\t//\t\t\t80\t\t\t\t4\t\t\t-72\n\t\t\t//\t\t\t85\t\t\t\t3\t\t\t-75\n\t\t\t//\t\t\t90\t\t\t\t3\t\t\t-80\n\t\t\t//\t\t\t95\t\t\t\t2\t\t\t-85\n\t\t\t//\t\t\t100\t\t\t\t1\t\t\t-89\n\t\t\t//\t\t\t102\t\t\t\t1\t\t\t-90\n\t\t\t//\t\t\t104\t\t\t\t1\t\t\t-91\n\t\t\t//\n\t\t\tRT_TRACE(COMP_DBG, DBG_WARNING, (\"odm_SQ_process_patch_RT_CID_819x_Lenovo\\n\"));\n\t\t\t\n#if OS_WIN_FROM_WIN8(OS_VERSION)\t\n\t\t\tif(PWDB_ALL >= 50)\n\t\t\t\tSQ = 100;\n\t\t\telse if(PWDB_ALL >= 23 && PWDB_ALL < 50)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if(PWDB_ALL >= 18 && PWDB_ALL < 23)\n\t\t\t\tSQ = 60;\n\t\t\telse if(PWDB_ALL >= 8 && PWDB_ALL < 18)\n\t\t\t\tSQ = 40;\n\t\t\telse\n\t\t\t\tSQ = 10;\n#else\n\t\t\tif(PWDB_ALL >= 34)\n\t\t\t\tSQ = 100;\n\t\t\telse if(PWDB_ALL >= 23 && PWDB_ALL < 34)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if(PWDB_ALL >= 18 && PWDB_ALL < 23)\n\t\t\t\tSQ = 60;\n\t\t\telse if(PWDB_ALL >= 8 && PWDB_ALL < 18)\n\t\t\t\tSQ = 40;\n\t\t\telse\n\t\t\t\tSQ = 10;\t\n\n\t\t\tif(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7\n\t\t\t\tSQ = 20;\n#endif\t\t\n\n\t\t}\n\t\telse if(IS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter)){\n\n\t\t\t//\n\t\t\t// <Roger_Notes> Expected signal strength and bars indication at Lenovo lab. 2013.04.11\n\t\t\t// 802.11n, 802.11b, 802.11g only at channel 6\n\t\t\t//\n\t\t\t//\t\tAttenuation (dB)\tOS Signal Bars\tRSSI by Xirrus (dBm)\n\t\t\t//\t\t\t50\t\t\t\t5\t\t\t-49\n\t\t\t//\t\t\t55\t\t\t\t5\t\t\t-49\n\t\t\t//\t\t\t60\t\t\t\t5\t\t\t-50\n\t\t\t//\t\t\t65\t\t\t\t5\t\t\t-51\n\t\t\t//\t\t\t70\t\t\t\t5\t\t\t-52\n\t\t\t//\t\t\t75\t\t\t\t5\t\t\t-54\n\t\t\t//\t\t\t80\t\t\t\t5\t\t\t-55\n\t\t\t//\t\t\t85\t\t\t\t4\t\t\t-60\n\t\t\t//\t\t\t90\t\t\t\t3\t\t\t-63\n\t\t\t//\t\t\t95\t\t\t\t3\t\t\t-65\n\t\t\t//\t\t\t100\t\t\t\t2\t\t\t-67\n\t\t\t//\t\t\t102\t\t\t\t2\t\t\t-67\n\t\t\t//\t\t\t104\t\t\t\t1\t\t\t-70\n\t\t\t//\t\t\t\n\n\t\t\tif(PWDB_ALL >= 50)\n\t\t\t\tSQ = 100;\n\t\t\telse if(PWDB_ALL >= 35 && PWDB_ALL < 50)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if(PWDB_ALL >= 31 && PWDB_ALL < 35)\n\t\t\t\tSQ = 60;\n\t\t\telse if(PWDB_ALL >= 22 && PWDB_ALL < 31)\n\t\t\t\tSQ = 40;\n\t\t\telse if(PWDB_ALL >= 18 && PWDB_ALL < 22)\n\t\t\t\tSQ = 20;\n\t\t\telse\n\t\t\t\tSQ = 10;\n\t\t} else {\n\t\t\tif (PWDB_ALL >= 50)\n\t\t\t\tSQ = 100;\n\t\t\telse if (PWDB_ALL >= 35 && PWDB_ALL < 50)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if (PWDB_ALL >= 22 && PWDB_ALL < 35)\n\t\t\t\tSQ = 60;\n\t\t\telse if (PWDB_ALL >= 18 && PWDB_ALL < 22)\n\t\t\t\tSQ = 40;\n\t\t\telse\n\t\t\t\tSQ = 10;\n\t\t}\n\t\t\n\t}\n\telse\n\t{//OFDM rate\t\t\n\n\t\tif(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter))\n\t\t{\n\t\t\tif(RSSI >= 45)\n\t\t\t\tSQ = 100;\n\t\t\telse if(RSSI >= 22 && RSSI < 45)\n\t\t\t\tSQ = 80;\n\t\t\telse if(RSSI >= 18 && RSSI < 22)\n\t\t\t\tSQ = 40;\n\t\t\telse\n\t\t\tSQ = 20;\n\t\t} else {\n\t\t\tif(RSSI >= 45)\n\t\t\tSQ = 100;\n\t\t\telse if(RSSI >= 22 && RSSI < 45)\n\t\t\tSQ = 80;\n\t\telse if(RSSI >= 18 && RSSI < 22)\n\t\t\tSQ = 40;\n\t\telse\n\t\t\tSQ = 20;\t\t\t\n\t\t}\n\t}\n\n\tRT_TRACE(COMP_DBG, DBG_TRACE, (\"isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\\n\", isCCKrate, PWDB_ALL, RSSI, SQ));\n\t\n#endif\n\treturn SQ;\n}\n\nstatic u1Byte odm_SQ_process_patch_RT_CID_819x_Acer(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN u1Byte \t\tisCCKrate,\n\tIN u1Byte \t\tPWDB_ALL,\n\tIN u1Byte \t\tpath,\n\tIN u1Byte \t\tRSSI\n)\n{\n\tu1Byte\tSQ = 0;\n\t\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\t\t\t\n\n\tif(isCCKrate){\n\n\t\t\tRT_TRACE(COMP_DBG, DBG_WARNING, (\"odm_SQ_process_patch_RT_Acer\\n\"));\n\t\t\t\n#if OS_WIN_FROM_WIN8(OS_VERSION)\t\n\n\t\t\tif(PWDB_ALL >= 50)\n\t\t\t\tSQ = 100;\n\t\t\telse if(PWDB_ALL >= 35 && PWDB_ALL < 50)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if(PWDB_ALL >= 30 && PWDB_ALL < 35)\n\t\t\t\tSQ = 60;\n\t\t\telse if(PWDB_ALL >= 25 && PWDB_ALL < 30)\n\t\t\t\tSQ = 40;\n\t\t\telse if(PWDB_ALL >= 20 && PWDB_ALL < 25)\n\t\t\t\tSQ = 20;\n\t\t\telse\n\t\t\t\tSQ = 10;\t\n#else\n\t\t\tif(PWDB_ALL >= 50)\n\t\t\t\tSQ = 100;\n\t\t\telse if(PWDB_ALL >= 35 && PWDB_ALL < 50)\t\t\t\t\n\t\t\t\tSQ = 80;\n\t\t\telse if(PWDB_ALL >= 30 && PWDB_ALL < 35)\n\t\t\t\tSQ = 60;\n\t\t\telse if(PWDB_ALL >= 25 && PWDB_ALL < 30)\n\t\t\t\tSQ = 40;\n\t\t\telse if(PWDB_ALL >= 20 && PWDB_ALL < 25)\n\t\t\t\tSQ = 20;\n\t\t\telse\n\t\t\t\tSQ = 10;\t\n\n\t\t\tif(PWDB_ALL == 0)// Abnormal case, do not indicate the value above 20 on Win7\n\t\t\t\tSQ = 20;\n#endif\t\t\n\n\t\t\n\t\t\n\t}\n\telse\n\t{//OFDM rate\t\t\n\n\t\tif(IS_HARDWARE_TYPE_8723AE(pDM_Odm->Adapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pDM_Odm->Adapter))\n\t\t{\n\t\t\tif(RSSI >= 45)\n\t\t\t\tSQ = 100;\n\t\t\telse if(RSSI >= 22 && RSSI < 45)\n\t\t\t\tSQ = 80;\n\t\t\telse if(RSSI >= 18 && RSSI < 22)\n\t\t\t\tSQ = 40;\n\t\t\telse\n\t\t\tSQ = 20;\n\t}\n\t\telse\n\t\t{\n\t\t\tif(RSSI >= 35)\n\t\t\tSQ = 100;\n\t\t\telse if(RSSI >= 30 && RSSI < 35)\n\t\t\tSQ = 80;\n\t\telse if(RSSI >= 25 && RSSI < 30)\n\t\t\tSQ = 40;\n\t\telse\n\t\t\tSQ = 20;\t\t\t\n\t}\n\t}\n\n\tRT_TRACE(COMP_DBG, DBG_LOUD, (\"isCCKrate(%#d), PWDB_ALL(%#d), RSSI(%#d), SQ(%#d)\\n\", isCCKrate, PWDB_ALL, RSSI, SQ));\n\t\n#endif\n\treturn SQ;\n}\n\t\t\t\nstatic u1Byte \nodm_EVMdbToPercentage(\n    IN\t\ts1Byte Value\n    )\n{\n\t//\n\t// -33dB~0dB to 0%~99%\n\t//\n\ts1Byte ret_val;\n    \n\tret_val = Value;\n\tret_val /= 2;\n\n\t/*DbgPrint(\"Value=%d\\n\", Value);*/\n\t/*ODM_RT_DISP(FRX, RX_PHY_SQ, (\"EVMdbToPercentage92C Value=%d / %x\\n\", ret_val, ret_val));*/\n#ifdef ODM_EVM_ENHANCE_ANTDIV\n\tif (ret_val >= 0)\n\t\tret_val = 0;\n\n\tif (ret_val <= -40)\n\t\tret_val = -40;\n\n\tret_val = 0 - ret_val;\n\tret_val *= 3;\n#else\n\tif (ret_val >= 0)\n\t\tret_val = 0;\n\n\tif (ret_val <= -33)\n\t\tret_val = -33;\n\n\tret_val = 0 - ret_val;\n\tret_val *= 3;\n\n\tif (ret_val == 99)\n\t\tret_val = 100;\n#endif\n\n\treturn (u1Byte)ret_val;\n}\n\t\t\t\nstatic u1Byte \nodm_EVMdbm_JaguarSeries(\n\tIN  s1Byte Value\n\t)\n{\n\ts1Byte ret_val = Value;\n\t\n\t// -33dB~0dB to 33dB ~ 0dB\n\tif(ret_val == -128)\n\t\tret_val = 127;\n\telse if (ret_val < 0)\n\t\tret_val = 0 - ret_val;\n\t\n\tret_val  = ret_val >> 1;\n\treturn (u1Byte)ret_val;\n}\n\nstatic s2Byte\nodm_Cfo(\n  IN s1Byte Value\n)\n{\n\ts2Byte  ret_val;\n\n\tif (Value < 0)\n\t{\n\t\tret_val = 0 - Value;\n\t\tret_val = (ret_val << 1) + (ret_val >> 1) ;  //  *2.5~=312.5/2^7\n\t\tret_val = ret_val | BIT12;  // set bit12 as 1 for negative cfo\n\t}\n\telse\n\t{\n\t\tret_val = Value;\n\t\tret_val = (ret_val << 1) + (ret_val>>1) ;  //  *2.5~=312.5/2^7\n\t}\n\treturn ret_val;\n}\n\n#if(ODM_IC_11N_SERIES_SUPPORT == 1)\n\ns1Byte\nodm_CCKRSSI_8703B(\n\tIN\t\tu2Byte\tLNA_idx,\n\tIN\t\tu1Byte\tVGA_idx\n\t)\n{\n\ts1Byte\trx_pwr_all = 0x00;\n\t\n\tswitch (LNA_idx) {\n\tcase 0xf:\n\t\trx_pwr_all = -48 - (2 * VGA_idx);\n\t\tbreak;\t\t\n\tcase 0xb:\n\t\trx_pwr_all = -42 - (2 * VGA_idx); /*TBD*/\n\t\tbreak;\n\tcase 0xa:\n\t\trx_pwr_all = -36 - (2 * VGA_idx);\n\t\tbreak;\n\tcase 8:\n\t\trx_pwr_all = -32 - (2 * VGA_idx);\n\t\tbreak;\n\tcase 7:\t\n\t\trx_pwr_all = -28 - (2 * VGA_idx); /*TBD*/\n\t\tbreak;\n\tcase 4:\t\n\t\trx_pwr_all = -16 - (2 * VGA_idx);\n\t\tbreak;\n\tcase 0:\t\n\t\trx_pwr_all = -2 - (2 * VGA_idx);\n\t\tbreak;\n\tdefault:\n\t/*rx_pwr_all = -53+(2*(31-VGA_idx));*/\n\t/*DbgPrint(\"wrong LNA index\\n\");*/\n\t\tbreak;\n\t\t\t\n\t}\n\treturn\trx_pwr_all;\n}\n\nVOID\nodm_RxPhyStatus92CSeries_Parsing(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\t\t\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\t\t\t\t\t\t\t\n\tSWAT_T\t\t\t\t*pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tu1Byte\t\t\t\ti, Max_spatial_stream;\n\ts1Byte\t\t\t\trx_pwr[4], rx_pwr_all=0;\n\tu1Byte\t\t\t\tEVM, PWDB_ALL = 0, PWDB_ALL_BT;\n\tu1Byte\t\t\t\tRSSI, total_rssi=0;\n\tBOOLEAN\t\t\t\tisCCKrate=FALSE;\t\n\tu1Byte\t\t\t\trf_rx_num = 0;\n\tu1Byte\t\t\t\tcck_highpwr = 0;\n\tu1Byte\t\t\t\tLNA_idx = 0;\n\tu1Byte\t\t\t\tVGA_idx = 0;\n\tPPHY_STATUS_RPT_8192CD_T pPhyStaRpt = (PPHY_STATUS_RPT_8192CD_T)pPhyStatus;\n\n\tisCCKrate = (pPktinfo->DataRate <= ODM_RATE11M) ? TRUE : FALSE;\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1;\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\n\n\n\tif(isCCKrate)\n\t{\n\t\tu1Byte report;\n\t\tu1Byte cck_agc_rpt;\n\t\t\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;\n\t\t// \n\t\t// (1)Hardware does not provide RSSI for CCK\n\t\t// (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\n\t\t//\n\n\t\t//if(pHalData->eRFPowerState == eRfOn)\n\t\t\tcck_highpwr = pDM_Odm->bCckHighPower;\n\t\t//else\n\t\t//\tcck_highpwr = FALSE;\n\n\t\tcck_agc_rpt =  pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a ;\n\t\t\n\t\t//2011.11.28 LukeLee: 88E use different LNA & VGA gain table\n\t\t//The RSSI formula should be modified according to the gain table\n\t\t//In 88E, cck_highpwr is always set to 1\n\t\tif (pDM_Odm->SupportICType & (ODM_RTL8703B)) {\n\t\t\t\n\t\t\t#if (RTL8703B_SUPPORT == 1)\n\t\t\tif (pDM_Odm->cck_agc_report_type == 1) {  /*4 bit LNA*/\n\n\t\t\t\tu1Byte cck_agc_rpt_b = (pPhyStaRpt->cck_rpt_b_ofdm_cfosho_b & BIT7) ? 1 : 0;\n\t\t\t\t\t\t\t\t\n\t\t\t\tLNA_idx = (cck_agc_rpt_b << 3) | ((cck_agc_rpt & 0xE0) >> 5);\n\t\t\t\tVGA_idx = (cck_agc_rpt & 0x1F);\n\t\t\t\t\n\t\t\t\trx_pwr_all = odm_CCKRSSI_8703B(LNA_idx, VGA_idx);\n\t\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t\t\tif (PWDB_ALL > 100)\n\t\t\t\t\tPWDB_ALL = 100;\t\n\t\t\t\n\t\t\t}\n\t\t\t#endif\n\t\t} else if (pDM_Odm->SupportICType & (ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8723B | ODM_RTL8188F)) /*3 bit LNA*/\n\t\t{\n\t\t\tLNA_idx = ((cck_agc_rpt & 0xE0) >>5);\n\t\t\tVGA_idx = (cck_agc_rpt & 0x1F); \n\t\t\tif(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E))\n\t\t\t{\n\t\t\t\tif(pDM_Odm->cck_agc_report_type == 0 && (pDM_Odm->SupportICType & ODM_RTL8192E) )\n\t\t\t\t{\n\t\t\t\t\tswitch(LNA_idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\trx_pwr_all = -45  - 2*(VGA_idx);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\trx_pwr_all = -43 -2*(VGA_idx); \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\trx_pwr_all = -27 - 2*(VGA_idx); \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\trx_pwr_all = -21 - 2*(VGA_idx); \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\trx_pwr_all = -18 - 2*(VGA_idx); \n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\trx_pwr_all = -6 - 2*(VGA_idx);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\trx_pwr_all = 9 -2*(VGA_idx);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\trx_pwr_all = 15 -2*(VGA_idx);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(pDM_Odm->BoardType & ODM_BOARD_EXT_LNA)\n\t\t\t\t\t{\n\t\t\t\t\t\trx_pwr_all -= pDM_Odm->ExtLNAGain;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\t\n\t\t\t\t\tswitch(LNA_idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\tif(VGA_idx <= 27)\n\t\t\t\t\t\t\t\trx_pwr_all = -100 + 2*(27-VGA_idx); //VGA_idx = 27~2\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\trx_pwr_all = -100;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\trx_pwr_all = -48 + 2*(2-VGA_idx); //VGA_idx = 2~0\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\trx_pwr_all = -42 + 2*(7-VGA_idx); //VGA_idx = 7~5\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\trx_pwr_all = -36 + 2*(7-VGA_idx); //VGA_idx = 7~4\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t//rx_pwr_all = -28 + 2*(7-VGA_idx); //VGA_idx = 7~0\n\t\t\t\t\t\t\trx_pwr_all = -24 + 2*(7-VGA_idx); //VGA_idx = 7~0\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tif(cck_highpwr)\n\t\t\t\t\t\t\t\trx_pwr_all = -12 + 2*(5-VGA_idx); //VGA_idx = 5~0\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\trx_pwr_all = -6+ 2*(5-VGA_idx);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\trx_pwr_all = 8-2*VGA_idx;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\trx_pwr_all = 14-2*VGA_idx;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t//DbgPrint(\"CCK Exception default\\n\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\trx_pwr_all += 8;\n\n\t\t\t\t\t//2012.10.08 LukeLee: Modify for 92E CCK RSSI\n\t\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\t\t\t\t\trx_pwr_all += 8;\n\t\t\t\t\t\n\t\t\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t\t\t\tif(cck_highpwr == FALSE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(PWDB_ALL >= 80)\n\t\t\t\t\t\t\tPWDB_ALL = ((PWDB_ALL-80)<<1)+((PWDB_ALL-80)>>1)+80;\n\t\t\t\t\t\telse if((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\n\t\t\t\t\t\t\tPWDB_ALL += 3;\n\t\t\t\t\t\tif(PWDB_ALL>100)\n\t\t\t\t\t\t\tPWDB_ALL = 100;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(pDM_Odm->SupportICType & (ODM_RTL8723B))\n\t\t\t{\n#if (RTL8723B_SUPPORT == 1)\t\t\t\n\t\t\t\trx_pwr_all = odm_CCKRSSI_8723B(LNA_idx,VGA_idx);\n\t\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t\t\tif(PWDB_ALL>100)\n\t\t\t\t\tPWDB_ALL = 100;\t\n#endif\t\t\t\t\n\t\t\t} else if (pDM_Odm->SupportICType & (ODM_RTL8188F)) {\n#if (RTL8188F_SUPPORT == 1)\n\t\t\t\trx_pwr_all = odm_CCKRSSI_8188F(LNA_idx, VGA_idx);\n\t\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t\t\tif (PWDB_ALL > 100)\n\t\t\t\t\tPWDB_ALL = 100;\n#endif\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(!cck_highpwr)\n\t\t\t{\t\t\t\n\t\t\t\treport =( cck_agc_rpt & 0xc0 )>>6;\n\t\t\t\tswitch(report)\n\t\t\t\t{\n\t\t\t\t\t// 03312009 modified by cosa\n\t\t\t\t\t// Modify the RF RNA gain value to -40, -20, -2, 14 by Jenyu's suggestion\n\t\t\t\t\t// Note: different RF with the different RNA gain.\n\t\t\t\t\tcase 0x3:\n\t\t\t\t\t\trx_pwr_all = -46 - (cck_agc_rpt & 0x3e);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x2:\n\t\t\t\t\t\trx_pwr_all = -26 - (cck_agc_rpt & 0x3e);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x1:\n\t\t\t\t\t\trx_pwr_all = -12 - (cck_agc_rpt & 0x3e);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x0:\n\t\t\t\t\t\trx_pwr_all = 16 - (cck_agc_rpt & 0x3e);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//report = pDrvInfo->cfosho[0] & 0x60;\t\t\t\n\t\t\t\t//report = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a& 0x60;\n\t\t\t\t\n\t\t\t\treport = (cck_agc_rpt & 0x60)>>5;\n\t\t\t\tswitch(report)\n\t\t\t\t{\n\t\t\t\t\tcase 0x3:\n\t\t\t\t\t\trx_pwr_all = -46 - ((cck_agc_rpt & 0x1f)<<1) ;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x2:\n\t\t\t\t\t\trx_pwr_all = -26 - ((cck_agc_rpt & 0x1f)<<1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x1:\n\t\t\t\t\t\trx_pwr_all = -12 - ((cck_agc_rpt & 0x1f)<<1) ;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x0:\n\t\t\t\t\t\trx_pwr_all = 16 - ((cck_agc_rpt & 0x1f)<<1) ;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\n\t\t\t//Modification for ext-LNA board\n\t\t\tif(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))\n\t\t\t{\n\t\t\t\tif((cck_agc_rpt>>7) == 0){\n\t\t\t\t\tPWDB_ALL = (PWDB_ALL>94)?100:(PWDB_ALL +6);\n\t\t\t\t}\n\t\t\t\telse\t\n\t                   {\n\t\t\t\t\tif(PWDB_ALL > 38)\n\t\t\t\t\t\tPWDB_ALL -= 16;\n\t\t\t\t\telse\n\t\t\t\t\t\tPWDB_ALL = (PWDB_ALL<=16)?(PWDB_ALL>>2):(PWDB_ALL -12);\n\t\t\t\t}             \n\n\t\t\t\t//CCK modification\n\t\t\t\tif(PWDB_ALL > 25 && PWDB_ALL <= 60)\n\t\t\t\t\tPWDB_ALL += 6;\n\t\t\t\t//else if (PWDB_ALL <= 25)\n\t\t\t\t//\tPWDB_ALL += 8;\n\t\t\t}\n\t\t\telse//Modification for int-LNA board\n\t\t\t{\n\t\t\t\tif(PWDB_ALL > 99)\n\t\t\t\t  \tPWDB_ALL -= 8;\n\t\t\t\telse if(PWDB_ALL > 50 && PWDB_ALL <= 68)\n\t\t\t\t\tPWDB_ALL += 4;\n\t\t\t}\n\t\t}\n\n\t\tpDM_Odm->cck_lna_idx = LNA_idx;\n\t\tpDM_Odm->cck_vga_idx = VGA_idx;\n\t\tpPhyInfo->RxPWDBAll = PWDB_ALL;\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t\tpPhyInfo->BTRxRSSIPercentage = PWDB_ALL;\n\t\tpPhyInfo->RecvSignalPower = rx_pwr_all;\n#endif\t\t\n\t\t//\n\t\t// (3) Get Signal Quality (EVM)\n\t\t//\n\t\t//if(pPktinfo->bPacketMatchBSSID)\n\t\t{\n\t\t\tu1Byte\tSQ,SQ_rpt;\t\t\t\n\t\t\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\t\t\n\t\t\tif((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t(pDM_Odm->PatchID==RT_CID_819x_Lenovo)){\n\t\t\t\tSQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,0,0);\n\t\t\t}else if((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t(pDM_Odm->PatchID==RT_CID_819x_Acer))\n\t\t\t{\n\t\t\t\tSQ = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,0);\n\t\t\t}else \n#endif\n\t\t\tif(pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest){\n\t\t\t\tSQ = 100;\n\t\t\t}\n\t\t\telse{\t\t\t\t\t\t\n\t\t\t\tSQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all;\n\t\t\t\t\t\n\t\t\t\tif(SQ_rpt > 64)\n\t\t\t\t\tSQ = 0;\n\t\t\t\telse if (SQ_rpt < 20)\n\t\t\t\t\tSQ = 100;\n\t\t\t\telse\n\t\t\t\t\tSQ = ((64-SQ_rpt) * 100) / 44;\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//DbgPrint(\"cck SQ = %d\\n\", SQ);\n\t\t\tpPhyInfo->SignalQuality = SQ;\n\t\t\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ;\n\t\t\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\n\t\t}\n\n\t\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) {\n\t\t\tif (i == 0)\n\t\t\t\tpPhyInfo->RxMIMOSignalStrength[0] = PWDB_ALL;\n\t\t\telse\n\t\t\t\tpPhyInfo->RxMIMOSignalStrength[1] = 0;\n\t\t}\n\t}\n\telse //2 is OFDM rate\n\t{\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\n\n\t\t// \n\t\t// (1)Get RSSI for HT rate\n\t\t//\n\t\t\n       \t for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)   \n\t\t{\n\t\t\t// 2008/01/30 MH we will judge RF RX path now.\n\t\t\tif (pDM_Odm->RFPathRxEnable & BIT(i))\n\t\t\t\trf_rx_num++;\n\t\t\t//else\n\t\t\t\t//continue;\n\n\t\t\trx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain& 0x3F)*2) - 110;\n\t\t\tpDM_Odm->ofdm_agc_idx[i] = (pPhyStaRpt->path_agc[i].gain & 0x3F);\n\n\t\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\t\tpPhyInfo->RxPwr[i] = rx_pwr[i];\n\t\t#endif\t\n\n\t\t\t/* Translate DBM to percentage. */\n\t\t\tRSSI = odm_QueryRxPwrPercentage(rx_pwr[i]);\n\t\t\ttotal_rssi += RSSI;\n\t\t\t//RT_DISP(FRX, RX_PHY_SS, (\"RF-%d RXPWR=%x RSSI=%d\\n\", i, rx_pwr[i], RSSI));\n\n\n\t\t\tif(pDM_Odm->SupportICType&ODM_RTL8192C)\n\t\t\t{\t\n\t\t\t        //Modification for ext-LNA board\t\n\t\t\t\tif(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))\n\t\t\t\t{\n\t\t\t\t\tif((pPhyStaRpt->path_agc[i].trsw) == 1)\n\t\t\t\t\t\tRSSI = (RSSI>94)?100:(RSSI +6);\n\t\t\t\t\telse\n\t\t\t\t\t\tRSSI = (RSSI<=16)?(RSSI>>3):(RSSI -16);\n\n\t\t\t\t\tif((RSSI <= 34) && (RSSI >=4))\n\t\t\t\t\t\tRSSI -= 4;\n\t\t\t\t}\t\t\n\t\t\t}\n\t\t\n\t\t\tpPhyInfo->RxMIMOSignalStrength[i] =(u1Byte) RSSI;\n\n\t\t#if (DM_ODM_SUPPORT_TYPE &  (/*ODM_WIN|*/ODM_CE|ODM_AP))\n\t\t\t//Get Rx snr value in DB\t\t\n\t\t\tpPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s4Byte)(pPhyStaRpt->path_rxsnr[i]/2);\n\t\t#endif\n\t\t\n\t\t\t/* Record Signal Strength for next packet */\n\t\t\t//if(pPktinfo->bPacketMatchBSSID)\n\t\t\t{\t\t\t\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\t\t\t\n\t\t\t\tif((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t\t(pDM_Odm->PatchID==RT_CID_819x_Lenovo))\n\t\t\t\t{\n\t\t\t\t\tif(i==ODM_RF_PATH_A)\n\t\t\t\t\t\tpPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm,isCCKrate,PWDB_ALL,i,RSSI);\n\t\t\t\t\n\t\t\t\t}\t\t\n\t\t\t\telse if((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t\t(pDM_Odm->PatchID==RT_CID_819x_Acer))\n\t\t\t\t{\n\t\t\t\t\tpPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Acer(pDM_Odm,isCCKrate,PWDB_ALL,0,RSSI);\n\t\t\t\t}\t\n#endif\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t//\n\t\t// (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)\n\t\t//\n\t\trx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1 )& 0x7f) -110;\t\t\n\t\t\n\t\tPWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\t\n\t\n\t\n\t\tpPhyInfo->RxPWDBAll = PWDB_ALL;\n\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, (\"ODM OFDM RSSI=%d\\n\",pPhyInfo->RxPWDBAll));\n\t#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t\tpPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT;\n\t\tpPhyInfo->RxPower = rx_pwr_all;\n\t\tpPhyInfo->RecvSignalPower = rx_pwr_all;\n\t#endif\n\t\t\n\t\tif((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==19)){\n\t\t\t//do nothing\t\n\t\t}else if((pDM_Odm->SupportPlatform == ODM_WIN) &&(pDM_Odm->PatchID==25)){\n\t\t\t//do nothing\t\n\t\t}\n\t\telse{//pMgntInfo->CustomerID != RT_CID_819x_Lenovo\n\t\t\t//\n\t\t\t// (3)EVM of HT rate\n\t\t\t//\n\t\t\tif(pPktinfo->DataRate >=ODM_RATEMCS8 && pPktinfo->DataRate <=ODM_RATEMCS15)\n\t\t\t\tMax_spatial_stream = 2; //both spatial stream make sense\n\t\t\telse\n\t\t\t\tMax_spatial_stream = 1; //only spatial stream 1 makes sense\n\n\t\t\tfor(i=0; i<Max_spatial_stream; i++)\n\t\t\t{\n\t\t\t\t// Do not use shift operation like \"rx_evmX >>= 1\" because the compilor of free build environment\n\t\t\t\t// fill most significant bit to \"zero\" when doing shifting operation which may change a negative \n\t\t\t\t// value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.\t\t\t\n\t\t\t\tEVM = odm_EVMdbToPercentage( (pPhyStaRpt->stream_rxevm[i] ));\t//dbm\n\n\t\t\t\t//GET_RX_STATUS_DESC_RX_MCS(pDesc), pDrvInfo->rxevm[i], \"%\", EVM));\n\t\t\t\t\n\t\t\t\t//if(pPktinfo->bPacketMatchBSSID)\n\t\t\t\t{\n\t\t\t\t\tif(i==ODM_RF_PATH_A) // Fill value in RFD, Get the first spatial stream only\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpPhyInfo->SignalQuality = (u1Byte)(EVM & 0xff);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\tpPhyInfo->RxMIMOSignalQuality[i] = (u1Byte)(EVM & 0xff);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail);\n\t\t\n\t}\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t//UI BSS List signal strength(in percentage), make it good looking, from 0~100.\n\t//It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().\n\tif(isCCKrate)\n\t{\t\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/\t\n\t\tpPhyInfo->SignalStrength = SignalScaleProc(pDM_Odm->Adapter, PWDB_ALL, TRUE, TRUE);\n#else\n\t#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\t\tpPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));/*PWDB_ALL;*/\n\t#else\n\t\tpPhyInfo->SignalStrength = (u1Byte)PWDB_ALL;\n\t#endif\n#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\n\t}\n\telse\n\t{\t\n\t\tif (rf_rx_num != 0)\n\t\t{\t\t\t\n\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\t// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/\t\n\t\t\tpPhyInfo->SignalStrength = SignalScaleProc(pDM_Odm->Adapter, (total_rssi /= rf_rx_num), TRUE, FALSE);\n\t\t#else\n\t\t\t#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\t\t\tpPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi /= rf_rx_num));\n\t\t\t#else\n\t\t\ttotal_rssi/=rf_rx_num;\n\t\t\tpPhyInfo->SignalStrength = (u1Byte)total_rssi;\n\t\t\t#endif\n\t\t#endif\n\t\t}\n\t}\n#endif /*#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))*/\n\n\t//DbgPrint(\"isCCKrate = %d, pPhyInfo->RxPWDBAll = %d, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a = 0x%x\\n\", \n\t\t//isCCKrate, pPhyInfo->RxPWDBAll, pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a);\n\n\t//For 92C/92D HW (Hybrid) Antenna Diversity\n#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\t\n\tpDM_SWAT_Table->antsel = pPhyStaRpt->ant_sel;\n\t//For 88E HW Antenna Diversity\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->ant_sel;\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->ant_sel_b;\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antsel_rx_keep_2;\n#endif\n}\n#endif\n\n#if\tODM_IC_11AC_SERIES_SUPPORT\n\nVOID\nodm_RxPhyBWJaguarSeries_Parsing(\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo,\n\tIN\t\tPPHY_STATUS_RPT_8812_T\t\tpPhyStaRpt\n)\n{\n\n\tif(pPktinfo->DataRate <= ODM_RATE54M) {\n\t\tswitch (pPhyStaRpt->r_RFMOD) {\n\t\tcase 1:\n\t\t\tif (pPhyStaRpt->sub_chnl == 0)\n\t\t\t\tpPhyInfo->BandWidth = 1;\n\t\t\telse\n\t\t\t\tpPhyInfo->BandWidth = 0;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tif (pPhyStaRpt->sub_chnl == 0)\n\t\t\t\tpPhyInfo->BandWidth = 2;\n\t\t\telse if (pPhyStaRpt->sub_chnl == 9 || pPhyStaRpt->sub_chnl == 10)\n\t\t\t\tpPhyInfo->BandWidth = 1;\n\t\t\telse\n\t\t\t\tpPhyInfo->BandWidth = 0;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\tcase 0:\n\t\t\tpPhyInfo->BandWidth = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n\n}\n\nVOID\nodm_RxPhyStatusJaguarSeries_Parsing(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n)\n{\n\tu1Byte\t\t\t\t\ti, Max_spatial_stream;\n\ts1Byte\t\t\t\t\trx_pwr[4], rx_pwr_all = 0;\n\tu1Byte\t\t\t\t\tEVM = 0, EVMdbm, PWDB_ALL = 0, PWDB_ALL_BT;\n\tu1Byte\t\t\t\t\tRSSI, avg_rssi = 0, best_rssi = 0, second_rssi = 0;\n\tu1Byte\t\t\t\t\tisCCKrate = 0;\t\n\tu1Byte\t\t\t\t\trf_rx_num = 0;\n\tu1Byte\t\t\t\t\tcck_highpwr = 0;\n\tu1Byte\t\t\t\t\tLNA_idx, VGA_idx;\n\tPPHY_STATUS_RPT_8812_T pPhyStaRpt = (PPHY_STATUS_RPT_8812_T)pPhyStatus;\n\tpFAT_T\t\t\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\n\todm_RxPhyBWJaguarSeries_Parsing(pPhyInfo, pPktinfo, pPhyStaRpt);\n\n\tif (pPktinfo->DataRate <= ODM_RATE11M)\n\t\tisCCKrate = TRUE;\n\telse\n\t\tisCCKrate = FALSE;\n\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = -1;\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_B] = -1;\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_C] = -1;\n\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_D] = -1;\n\n\tif (isCCKrate) {\n\t\tu1Byte cck_agc_rpt;\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;\n\n\t\t/*(1)Hardware does not provide RSSI for CCK*/\n\t\t/*(2)PWDB, Average PWDB calculated by hardware (for rate adaptive)*/\n\n\t\t/*if(pHalData->eRFPowerState == eRfOn)*/\n\t\tcck_highpwr = pDM_Odm->bCckHighPower;\n\t\t/*else*/\n\t\t/*cck_highpwr = FALSE;*/\n\n\t\tcck_agc_rpt =  pPhyStaRpt->cfosho[0] ;\n\t\tLNA_idx = ((cck_agc_rpt & 0xE0) >> 5);\n\t\tVGA_idx = (cck_agc_rpt & 0x1F);\n\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\t\tswitch (LNA_idx) {\n\t\t\tcase 7:\n\t\t\t\tif (VGA_idx <= 27)\n\t\t\t\t\trx_pwr_all = -100 + 2 * (27 - VGA_idx); /*VGA_idx = 27~2*/\n\t\t\t\telse\n\t\t\t\t\trx_pwr_all = -100;\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\trx_pwr_all = -48 + 2 * (2 - VGA_idx); /*VGA_idx = 2~0*/\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\trx_pwr_all = -42 + 2 * (7 - VGA_idx); /*VGA_idx = 7~5*/\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\trx_pwr_all = -36 + 2 * (7 - VGA_idx); /*VGA_idx = 7~4*/\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t/*rx_pwr_all = -28 + 2*(7-VGA_idx); VGA_idx = 7~0*/\n\t\t\t\trx_pwr_all = -24 + 2 * (7 - VGA_idx); /*VGA_idx = 7~0*/\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tif (cck_highpwr)\n\t\t\t\t\trx_pwr_all = -12 + 2 * (5 - VGA_idx); /*VGA_idx = 5~0*/\n\t\t\t\telse\n\t\t\t\t\trx_pwr_all = -6 + 2 * (5 - VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\trx_pwr_all = 8 - 2 * VGA_idx;\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\trx_pwr_all = 14 - 2 * VGA_idx;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t/*DbgPrint(\"CCK Exception default\\n\");*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trx_pwr_all += 6;\n\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\n\t\t\tif (cck_highpwr == FALSE) {\n\t\t\t\tif (PWDB_ALL >= 80)\n\t\t\t\t\tPWDB_ALL = ((PWDB_ALL - 80) << 1) + ((PWDB_ALL - 80) >> 1) + 80;\n\t\t\t\telse if ((PWDB_ALL <= 78) && (PWDB_ALL >= 20))\n\t\t\t\t\tPWDB_ALL += 3;\n\t\t\t\tif (PWDB_ALL > 100)\n\t\t\t\t\tPWDB_ALL = 100;\n\t\t\t}\n\t\t} else if (pDM_Odm->SupportICType & (ODM_RTL8821 | ODM_RTL8881A)) {\n\t\t\ts1Byte Pout = -6;\n\n\t\t\tswitch (LNA_idx) {\n\t\t\tcase 5:\n\t\t\t\trx_pwr_all = Pout - 32 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\trx_pwr_all = Pout - 24 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\trx_pwr_all = Pout - 11 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\trx_pwr_all = Pout + 5 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\trx_pwr_all = Pout + 21 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t} else if (pDM_Odm->SupportICType == ODM_RTL8814A || pDM_Odm->SupportICType == ODM_RTL8822B) {\n\t\t\ts1Byte Pout = -6;\n\n\t\t\tswitch (LNA_idx) {\n\t\t\t/*CCK only use LNA: 2, 3, 5, 7*/\n\t\t\tcase 7:\n\t\t\t\trx_pwr_all = Pout - 32 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\trx_pwr_all = Pout - 22 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\trx_pwr_all = Pout - 2 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\trx_pwr_all = Pout + 5 - (2 * VGA_idx);\n\t\t\t\tbreak;\n\t\t\t/*case 6:*/\n\t\t\t/*rx_pwr_all = Pout -26 - (2*VGA_idx);*/\n\t\t\t/*break;*/\n\t\t\t/*case 4:*/\n\t\t\t/*rx_pwr_all = Pout - 8 - (2*VGA_idx);*/\n\t\t\t/*break;*/\n\t\t\t/*case 1:*/\n\t\t\t/*rx_pwr_all = Pout + 21 - (2*VGA_idx);*/\n\t\t\t/*break;*/\n\t\t\t/*case 0:*/\n\t\t\t/*rx_pwr_all = Pout + 10 - (2*VGA_idx);*/\n/*\t\t\t//\tbreak;*/\n\t\t\tdefault:\n/*\t\t\t\t//DbgPrint(\"CCK Exception default\\n\");*/\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tPWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\t\t}\n\n\t\tpPhyInfo->RxPWDBAll = PWDB_ALL;\n/*\t\t//if(pPktinfo->StationID == 0)*/\n/*\t\t//{*/\n/*\t\t//\tDbgPrint(\"CCK: LNA_idx = %d, VGA_idx = %d, pPhyInfo->RxPWDBAll = %d\\n\",*/\n/*\t\t//\t\tLNA_idx, VGA_idx, pPhyInfo->RxPWDBAll);*/\n/*\t\t//}*/\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t\tpPhyInfo->BTRxRSSIPercentage = PWDB_ALL;\n\t\tpPhyInfo->RecvSignalPower = rx_pwr_all;\n#endif\n\t\t/*(3) Get Signal Quality (EVM)*/\n\t\tif (pPktinfo->bPacketMatchBSSID) {\n\t\t\tu1Byte\tSQ, SQ_rpt;\n\n\t\t\tif ((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t(pDM_Odm->PatchID == RT_CID_819x_Lenovo)) {\n\t\t\t\tSQ = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm, isCCKrate, PWDB_ALL, 0, 0);\n\t\t\t} else if (pPhyInfo->RxPWDBAll > 40 && !pDM_Odm->bInHctTest) {\n\t\t\t\tSQ = 100;\n\t\t\t} else {\n\t\t\t\tSQ_rpt = pPhyStaRpt->pwdb_all;\n\n\t\t\t\tif (SQ_rpt > 64)\n\t\t\t\t\tSQ = 0;\n\t\t\t\telse if (SQ_rpt < 20)\n\t\t\t\t\tSQ = 100;\n\t\t\t\telse\n\t\t\t\t\tSQ = ((64 - SQ_rpt) * 100) / 44;\n\t\t\t}\n\n/*\t\t\t//DbgPrint(\"cck SQ = %d\\n\", SQ);*/\n\t\t\tpPhyInfo->SignalQuality = SQ;\n\t\t\tpPhyInfo->RxMIMOSignalQuality[ODM_RF_PATH_A] = SQ;\n\t\t}\n\n\t\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) {\n\t\t\tif (i == 0)\n\t\t\t\tpPhyInfo->RxMIMOSignalStrength[0] = PWDB_ALL;\n\t\t\telse\n\t\t\t\tpPhyInfo->RxMIMOSignalStrength[i] = 0;\n\t\t}\n\t} else {\t\t \n\t\t/*is OFDM rate*/\n\t\tpDM_FatTable->hw_antsw_occur = pPhyStaRpt->hw_antsw_occur;\n\t\t\n\t\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\n\n\t\t/*(1)Get RSSI for OFDM rate*/\n\n\t\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) {\n\t\t\t/*2008/01/30 MH we will judge RF RX path now.*/\n/*\t\t\t//DbgPrint(\"pDM_Odm->RFPathRxEnable = %x\\n\", pDM_Odm->RFPathRxEnable);*/\n\t\t\tif (pDM_Odm->RFPathRxEnable & BIT(i))\n\t\t\t\trf_rx_num++;\n/*\t\t\t//else*/\n/*\t\t\t//continue;*/\n\t\t\t/*2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip*/\n/*\t\t\t//if((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821)) && (!pDM_Odm->bIsMPChip))*/\n\t\t\tif (i < ODM_RF_PATH_C)\n\t\t\t\trx_pwr[i] = (pPhyStaRpt->gain_trsw[i] & 0x7F) - 110;\n\t\t\telse\n\t\t\t\trx_pwr[i] = (pPhyStaRpt->gain_trsw_cd[i - 2] & 0x7F) - 110;\n/*\t\t\t//else*/\n\t\t\t/*rx_pwr[i] = ((pPhyStaRpt->gain_trsw[i]& 0x3F)*2) - 110;  OLD FORMULA*/\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\t\t\tpPhyInfo->RxPwr[i] = rx_pwr[i];\n#endif\n\n\t\t\t/* Translate DBM to percentage. */\n\t\t\tRSSI = odm_QueryRxPwrPercentage(rx_pwr[i]);\t\n\t\t\n\t\t\t/*total_rssi += RSSI;*/\n\t\t\t/*Get the best two RSSI*/\n\t\t\tif (RSSI > best_rssi && RSSI > second_rssi) {\n\t\t\t\tsecond_rssi = best_rssi;\n\t\t\t\tbest_rssi = RSSI;\n\t\t\t} else if (RSSI > second_rssi && RSSI <= best_rssi)\n\t\t\t\tsecond_rssi = RSSI;\n\n\t\t\t/*RT_DISP(FRX, RX_PHY_SS, (\"RF-%d RXPWR=%x RSSI=%d\\n\", i, rx_pwr[i], RSSI));*/\n\n\t\t\tpPhyInfo->RxMIMOSignalStrength[i] = (u1Byte) RSSI;\n\n\n\t\t\t/*Get Rx snr value in DB*/\n\t\t\tif (i < ODM_RF_PATH_C)\n\t\t\t\tpPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->rxsnr[i] / 2;\n\t\t\telse if (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B))\n\t\t\t\tpPhyInfo->RxSNR[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = pPhyStaRpt->csi_current[i - 2] / 2;\n\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\t\t\t/*(2) CFO_short  & CFO_tail*/\n\t\t\tif (i < ODM_RF_PATH_C) {\n\t\t\t\tpPhyInfo->Cfo_short[i] = odm_Cfo((pPhyStaRpt->cfosho[i]));\n\t\t\t\tpPhyInfo->Cfo_tail[i] = odm_Cfo((pPhyStaRpt->cfotail[i]));\n\t\t\t}\n#endif\n\t\t\t/* Record Signal Strength for next packet */\n\t\t\tif (pPktinfo->bPacketMatchBSSID) {\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\t\tif ((pDM_Odm->SupportPlatform == ODM_WIN) &&\n\t\t\t\t\t(pDM_Odm->PatchID == RT_CID_819x_Lenovo)) {\n\t\t\t\t\tif (i == ODM_RF_PATH_A)\n\t\t\t\t\t\tpPhyInfo->SignalQuality = odm_SQ_process_patch_RT_CID_819x_Lenovo(pDM_Odm, isCCKrate, PWDB_ALL, i, RSSI);\n\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t}\n\n\t\t/*(3)PWDB, Average PWDB calculated by hardware (for rate adaptive)*/\n\n\t\t/*2012.05.25 LukeLee: Testchip AGC report is wrong, it should be restored back to old formula in MP chip*/\n\t\tif ((pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A)) && (!pDM_Odm->bIsMPChip))\n\t\t\trx_pwr_all = (pPhyStaRpt->pwdb_all & 0x7f) - 110;\n\t\telse\n\t\t\trx_pwr_all = (((pPhyStaRpt->pwdb_all) >> 1) & 0x7f) - 110;\t /*OLD FORMULA*/\n\n\t\tPWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all);\n\n\t\tpPhyInfo->RxPWDBAll = PWDB_ALL;\n\t\t/*ODM_RT_TRACE(pDM_Odm,ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, (\"ODM OFDM RSSI=%d\\n\",pPhyInfo->RxPWDBAll));*/\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t\tpPhyInfo->BTRxRSSIPercentage = PWDB_ALL_BT;\n\t\tpPhyInfo->RxPower = rx_pwr_all;\n\t\tpPhyInfo->RecvSignalPower = rx_pwr_all;\n#endif\n\n\t\tif ((pDM_Odm->SupportPlatform == ODM_WIN) && (pDM_Odm->PatchID == 19)) {\n\t\t\t/*do nothing*/\n\t\t} else {\n\t\t\t/*pMgntInfo->CustomerID != RT_CID_819x_Lenovo*/\n\n\t\t\t/*(4)EVM of OFDM rate*/\n\t\t\t\n\t\t\tif ((pPktinfo->DataRate >= ODM_RATEMCS8) &&\n\t\t\t\t(pPktinfo->DataRate <= ODM_RATEMCS15))\n\t\t\t\tMax_spatial_stream = 2;\n\t\t\telse if ((pPktinfo->DataRate >= ODM_RATEVHTSS2MCS0) &&\n\t\t\t\t\t (pPktinfo->DataRate <= ODM_RATEVHTSS2MCS9))\n\t\t\t\tMax_spatial_stream = 2;\n\t\t\telse if ((pPktinfo->DataRate >= ODM_RATEMCS16) &&\n\t\t\t\t\t (pPktinfo->DataRate <= ODM_RATEMCS23))\n\t\t\t\tMax_spatial_stream = 3;\n\t\t\telse if ((pPktinfo->DataRate >= ODM_RATEVHTSS3MCS0) &&\n\t\t\t\t\t (pPktinfo->DataRate <= ODM_RATEVHTSS3MCS9))\n\t\t\t\tMax_spatial_stream = 3;\n\t\t\telse\n\t\t\t\tMax_spatial_stream = 1;\n\n\t\t\tif (pPktinfo->bPacketMatchBSSID) {\n\t\t\t\t/*DbgPrint(\"pPktinfo->DataRate = %d\\n\", pPktinfo->DataRate);*/\n\n\t\t\t\tfor (i = 0; i < Max_spatial_stream; i++) {\n\t\t\t\t\t/*Do not use shift operation like \"rx_evmX >>= 1\" because the compilor of free build environment*/\n\t\t\t\t\t/*fill most significant bit to \"zero\" when doing shifting operation which may change a negative*/\n\t\t\t\t\t/*value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.*/\n\n\t\t\t\t\tif (pPktinfo->DataRate >= ODM_RATE6M && pPktinfo->DataRate <= ODM_RATE54M) {\n\t\t\t\t\t\tif (i == ODM_RF_PATH_A) {\n\t\t\t\t\t\t\tEVM = odm_EVMdbToPercentage((pPhyStaRpt->sigevm));\t/*dbm*/\n\t\t\t\t\t\t\tEVM += 20;\n\t\t\t\t\t\t\tif (EVM > 100)\n\t\t\t\t\t\t\t\tEVM = 100;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (i < ODM_RF_PATH_C) {\n\t\t\t\t\t\t\tif (pPhyStaRpt->rxevm[i] == -128)\n\t\t\t\t\t\t\t\tpPhyStaRpt->rxevm[i] = -25;\n\t\t\t\t\t\t\tEVM = odm_EVMdbToPercentage((pPhyStaRpt->rxevm[i]));\t/*dbm*/\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (pPhyStaRpt->rxevm_cd[i - 2] == -128){\n\t\t\t\t\t\t\t\tpPhyStaRpt->rxevm_cd[i - 2] = -25;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tEVM = odm_EVMdbToPercentage((pPhyStaRpt->rxevm_cd[i - 2]));\t/*dbm*/\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i < ODM_RF_PATH_C)\n\t\t\t\t\t\tEVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm[i]);\n\t\t\t\t\telse\n\t\t\t\t\t\tEVMdbm = odm_EVMdbm_JaguarSeries(pPhyStaRpt->rxevm_cd[i - 2]);\n\t\t\t\t\t/*RT_DISP(FRX, RX_PHY_SQ, (\"RXRATE=%x RXEVM=%x EVM=%s%d\\n\",*/\n\t\t\t\t\t/*pPktinfo->DataRate, pPhyStaRpt->rxevm[i], \"%\", EVM));*/\n\n\t\t\t\t\t{\n\t\t\t\t\t\tif (i == ODM_RF_PATH_A) { \n\t\t\t\t\t\t\t/*Fill value in RFD, Get the first spatial stream only*/\n\t\t\t\t\t\t\tpPhyInfo->SignalQuality = EVM;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpPhyInfo->RxMIMOSignalQuality[i] = EVM;\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\t\t\t\t\t\tpPhyInfo->RxMIMOEVMdbm[i] = EVMdbm;\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail);\n\n\t}\n/*\t//DbgPrint(\"isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\\n\", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num);*/\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\t/*UI BSS List signal strength(in percentage), make it good looking, from 0~100.*/\n\t/*It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().*/\n\tif (isCCKrate) {\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t/*2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/*/\n\t\tpPhyInfo->SignalStrength = SignalScaleProc(pDM_Odm->Adapter, PWDB_ALL, FALSE, TRUE);\n#else\n\t\tpPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));/*PWDB_ALL;*/\n#endif\n\t} else {\t\n\t\tif (rf_rx_num != 0) {\n\t\t\t/* 2015/01 Sean, use the best two RSSI only, suggested by Ynlin and ChenYu.*/\n\t\t\tif (rf_rx_num == 1)\n\t\t\t\tavg_rssi = best_rssi;\n\t\t\telse\n\t\t\t\tavg_rssi = (best_rssi + second_rssi)/2;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\t/* 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/*/\t\n\t\t\tpPhyInfo->SignalStrength = SignalScaleProc(pDM_Odm->Adapter, avg_rssi, FALSE, FALSE);\n#else\n\t\t\tpPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, avg_rssi));\n#endif\n\t\t}\n\t}\n#endif\n\tpDM_Odm->RxPWDBAve = pDM_Odm->RxPWDBAve + pPhyInfo->RxPWDBAll;\n\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_0 = pPhyStaRpt->antidx_anta;\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_1 = pPhyStaRpt->antidx_antb;\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_2 = pPhyStaRpt->antidx_antc;\n\tpDM_Odm->DM_FatTable.antsel_rx_keep_3 = pPhyStaRpt->antidx_antd;\n\n\n/*\t\tDbgPrint(\"pPhyStaRpt->antidx_anta = %d, pPhyStaRpt->antidx_antb = %d\\n\",*/\n/*\t\t\tpPhyStaRpt->antidx_anta, pPhyStaRpt->antidx_antb);*/\n/*\t\tDbgPrint(\"----------------------------\\n\");*/\n/*\t\tDbgPrint(\"pPktinfo->StationID=%d, pPktinfo->DataRate=0x%x\\n\",pPktinfo->StationID, pPktinfo->DataRate);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->r_RFMOD = %d\\n\", pPhyStaRpt->r_RFMOD);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->gain_trsw[0]=0x%x, pPhyStaRpt->gain_trsw[1]=0x%x\\n\",*/\n/*\t\t\t\tpPhyStaRpt->gain_trsw[0],pPhyStaRpt->gain_trsw[1]);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->gain_trsw[2]=0x%x, pPhyStaRpt->gain_trsw[3]=0x%x\\n\",*/\n/*\t\t\t\tpPhyStaRpt->gain_trsw_cd[0],pPhyStaRpt->gain_trsw_cd[1]);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->pwdb_all = 0x%x, pPhyInfo->RxPWDBAll = %d\\n\", pPhyStaRpt->pwdb_all, pPhyInfo->RxPWDBAll);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->cfotail[i] = 0x%x, pPhyStaRpt->CFO_tail[i] = 0x%x\\n\", pPhyStaRpt->cfotail[0], pPhyStaRpt->cfotail[1]);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->rxevm[0] = %d, pPhyStaRpt->rxevm[1] = %d\\n\", pPhyStaRpt->rxevm[0], pPhyStaRpt->rxevm[1]);*/\n/*\t\tDbgPrint(\"pPhyStaRpt->rxevm[2] = %d, pPhyStaRpt->rxevm[3] = %d\\n\", pPhyStaRpt->rxevm_cd[0], pPhyStaRpt->rxevm_cd[1]);*/\n/*\t\tDbgPrint(\"pPhyInfo->RxMIMOSignalStrength[0]=%d, pPhyInfo->RxMIMOSignalStrength[1]=%d, RxPWDBAll=%d\\n\",*/\n/*\t\t\t\tpPhyInfo->RxMIMOSignalStrength[0], pPhyInfo->RxMIMOSignalStrength[1], pPhyInfo->RxPWDBAll);*/\n/*\t\tDbgPrint(\"pPhyInfo->RxMIMOSignalStrength[2]=%d, pPhyInfo->RxMIMOSignalStrength[3]=%d\\n\",*/\n/*\t\t\t\tpPhyInfo->RxMIMOSignalStrength[2], pPhyInfo->RxMIMOSignalStrength[3]);*/\n/*\t\tDbgPrint(\"ppPhyInfo->RxMIMOSignalQuality[0]=%d, pPhyInfo->RxMIMOSignalQuality[1]=%d\\n\",*/\n/*\t\t\t\tpPhyInfo->RxMIMOSignalQuality[0], pPhyInfo->RxMIMOSignalQuality[1]);*/\n/*\t\tDbgPrint(\"ppPhyInfo->RxMIMOSignalQuality[2]=%d, pPhyInfo->RxMIMOSignalQuality[3]=%d\\n\",*/\n/*\t\t\t\tpPhyInfo->RxMIMOSignalQuality[2], pPhyInfo->RxMIMOSignalQuality[3]);*/\n\n}\n\n#endif\n\nVOID\nodm_Init_RSSIForDM(\n\tIN OUT\tPDM_ODM_T\tpDM_Odm\n\t)\n{\n\n}\n\nVOID\nodm_Process_RSSIForDM(\t\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n\t\n\ts4Byte\t\t\tUndecoratedSmoothedPWDB, UndecoratedSmoothedCCK, UndecoratedSmoothedOFDM, RSSI_Ave;\n\tu1Byte\t\t\ti, isCCKrate=0;\t\n\tu1Byte\t\t\tRSSI_max, RSSI_min;\n\tu4Byte\t\t\tOFDM_pkt=0; \n\tu4Byte\t\t\tWeighting=0;\n\tPSTA_INFO_T           \tpEntry;\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\t\n\tpFAT_T\t\t\tpDM_FatTable = &pDM_Odm->DM_FatTable;\n\t#endif\n\n\tif (pPktinfo->StationID >= ODM_ASSOCIATE_ENTRY_NUM)\n\t\treturn;\n\n#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\todm_S0S1_SwAntDivByCtrlFrame_ProcessRSSI(pDM_Odm, pPhyInfo, pPktinfo);\n#endif\n#endif\n\n\t//\n\t// 2012/05/30 MH/Luke.Lee Add some description \n\t// In windows driver: AP/IBSS mode STA\n\t//\n\t//if (pDM_Odm->SupportPlatform == ODM_WIN)\n\t//{\n\t//\tpEntry = pDM_Odm->pODM_StaInfo[pDM_Odm->pAidMap[pPktinfo->StationID-1]];\t\t\t\n\t//}\n\t//else\n\t\tpEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID];\t\t\t\t\t\t\t\n\n\tif(!IS_STA_VALID(pEntry) )\n\t{\t\t\n\t\treturn;\n\t}\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\t\n\tif ((pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) &&\n\t\t(pDM_FatTable->enable_ctrl_frame_antdiv)\n\t)\n\t{\n\t\tif (pPktinfo->bPacketMatchBSSID)\n\t\t\tpDM_Odm->data_frame_num++;\n\t\t\t\t\n\t\tif ((pDM_FatTable->use_ctrl_frame_antdiv)) {\n\t\t\tif (!pPktinfo->bToSelf)/*data frame + CTRL frame*/\n\t\t\t\treturn;\n\t\t} else {\n\t\t\tif ((!pPktinfo->bPacketMatchBSSID))/*data frame only*/\n\t\t\t\treturn;\n\t\t}\t\n\t} else\n#endif\n\t{\n\t\tif ((!pPktinfo->bPacketMatchBSSID))/*data frame only*/\n\t\t\treturn;\n\t}\n\n\tif(pPktinfo->bPacketBeacon)\n\t\tpDM_Odm->PhyDbgInfo.NumQryBeaconPkt++;\n\t\n\tisCCKrate = (pPktinfo->DataRate <= ODM_RATE11M )?TRUE :FALSE;\n\tpDM_Odm->RxRate = pPktinfo->DataRate;\n\n\t//--------------Statistic for antenna/path diversity------------------\n\tif(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)\n\t{\n\t\t#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\t\t\tODM_Process_RSSIForAntDiv(pDM_Odm,pPhyInfo,pPktinfo);\n\t\t#endif\n\t}\n\t#if(defined(CONFIG_PATH_DIVERSITY))\n\telse if(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV)\n\t{\n\t\tphydm_process_rssi_for_path_div(pDM_Odm,pPhyInfo,pPktinfo);\n\t}\n\t#endif\n\t//-----------------Smart Antenna Debug Message------------------//\n\t\n\tUndecoratedSmoothedCCK =  pEntry->rssi_stat.UndecoratedSmoothedCCK;\n\tUndecoratedSmoothedOFDM = pEntry->rssi_stat.UndecoratedSmoothedOFDM;\n\tUndecoratedSmoothedPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\t\n\t\n\tif(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon)\n\t{\n\n\t\tif(!isCCKrate)//ofdm rate\n\t\t{\n#if (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1)\n\t\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)) {\n\t\t\t\tu1Byte RX_count = 0;\n\t\t\t\tu4Byte RSSI_linear = 0;\n\n\t\t\t\tif (pDM_Odm->RXAntStatus & ODM_RF_A) {\n\t\t\t\t\tpDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\tRX_count++;\n\t\t\t\t\tRSSI_linear += odm_ConvertTo_linear(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A]);\n\t\t\t\t} else\n\t\t\t\t\tpDM_Odm->RSSI_A = 0;\n\n\t\t\t\tif (pDM_Odm->RXAntStatus & ODM_RF_B) {\n\t\t\t\t\tpDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\n\t\t\t\t\tRX_count++;\n\t\t\t\t\tRSSI_linear += odm_ConvertTo_linear(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]);\n\t\t\t\t} else\n\t\t\t\t\tpDM_Odm->RSSI_B = 0;\n\t\t\t\t\n\t\t\t\tif (pDM_Odm->RXAntStatus & ODM_RF_C) {\n\t\t\t\t\tpDM_Odm->RSSI_C = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_C];\n\t\t\t\t\tRX_count++;\n\t\t\t\t\tRSSI_linear += odm_ConvertTo_linear(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_C]);\n\t\t\t\t} else\n\t\t\t\t\tpDM_Odm->RSSI_C = 0;\n\n\t\t\t\tif (pDM_Odm->RXAntStatus & ODM_RF_D) {\n\t\t\t\t\tpDM_Odm->RSSI_D = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_D];\n\t\t\t\t\tRX_count++;\n\t\t\t\t\tRSSI_linear += odm_ConvertTo_linear(pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_D]);\n\t\t\t\t} else\n\t\t\t\t\tpDM_Odm->RSSI_D = 0;\n\n\t\t\t\t/* Calculate average RSSI */\n\t\t\t\tswitch (RX_count) {\n\t\t\t\tcase 2:\n\t\t\t\t\tRSSI_linear = (RSSI_linear >> 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tRSSI_linear = ((RSSI_linear) + (RSSI_linear << 1) + (RSSI_linear << 3)) >> 5;\t/* RSSI_linear/3 ~ RSSI_linear*11/32 */\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tRSSI_linear = (RSSI_linear >> 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\n\t\t\t\tRSSI_Ave = odm_ConvertTo_dB(RSSI_linear);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tif (pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B] == 0) {\n\t\t\t\t\tRSSI_Ave = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\tpDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\tpDM_Odm->RSSI_B = 0;\n\t\t\t\t} else {\n\t\t\t\t\t/*DbgPrint(\"pRfd->Status.RxMIMOSignalStrength[0] = %d, pRfd->Status.RxMIMOSignalStrength[1] = %d\\n\",*/ \n\t\t\t\t\t\t/*pRfd->Status.RxMIMOSignalStrength[0], pRfd->Status.RxMIMOSignalStrength[1]);*/\n\t\t\t\t\tpDM_Odm->RSSI_A =  pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\tpDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\n\t\t\t\t\n\t\t\t\t\tif (pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A] > pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B]) {\n\t\t\t\t\t\tRSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\t\tRSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tRSSI_max = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\n\t\t\t\t\t\tRSSI_min = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\t\t\t\t}\n\t\t\t\t\tif ((RSSI_max - RSSI_min) < 3)\n\t\t\t\t\t\tRSSI_Ave = RSSI_max;\n\t\t\t\t\telse if ((RSSI_max - RSSI_min) < 6)\n\t\t\t\t\t\tRSSI_Ave = RSSI_max - 1;\n\t\t\t\t\telse if ((RSSI_max - RSSI_min) < 10)\n\t\t\t\t\t\tRSSI_Ave = RSSI_max - 2;\n\t\t\t\t\telse\n\t\t\t\t\t\tRSSI_Ave = RSSI_max - 3;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\t\n\t\t\t//1 Process OFDM RSSI\n\t\t\tif(UndecoratedSmoothedOFDM <= 0)\t// initialize\n\t\t\t{\n\t\t\t\tUndecoratedSmoothedOFDM = pPhyInfo->RxPWDBAll;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedOFDM)\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedOFDM = \t\n\t\t\t\t\t\t\t( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + \n\t\t\t\t\t\t\t(RSSI_Ave)) /(Rx_Smooth_Factor);\n\t\t\t\t\tUndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM + 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedOFDM = \t\n\t\t\t\t\t\t\t( ((UndecoratedSmoothedOFDM)*(Rx_Smooth_Factor-1)) + \n\t\t\t\t\t\t\t(RSSI_Ave)) /(Rx_Smooth_Factor);\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t\tif (pEntry->rssi_stat.OFDM_pkt != 64) {\n\t\t\t\ti = 63;\n\t\t\t\tpEntry->rssi_stat.OFDM_pkt -= (u4Byte)(((pEntry->rssi_stat.PacketMap>>i)&BIT0)-1);\n\t\t\t}\n\t\t\tpEntry->rssi_stat.PacketMap = (pEntry->rssi_stat.PacketMap<<1) | BIT0;\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRSSI_Ave = pPhyInfo->RxPWDBAll;\n\t\t\tpDM_Odm->RSSI_A = (u1Byte) pPhyInfo->RxPWDBAll;\n\t\t\tpDM_Odm->RSSI_B = 0xFF;\n\t\t\tpDM_Odm->RSSI_C = 0xFF;\n\t\t\tpDM_Odm->RSSI_D = 0xFF;\n\n\t\t\t//1 Process CCK RSSI\n\t\t\tif(UndecoratedSmoothedCCK <= 0)\t// initialize\n\t\t\t{\n\t\t\t\tUndecoratedSmoothedCCK = pPhyInfo->RxPWDBAll;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pPhyInfo->RxPWDBAll > (u4Byte)UndecoratedSmoothedCCK)\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedCCK = \t\n\t\t\t\t\t\t\t( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + \n\t\t\t\t\t\t\t(pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor);\n\t\t\t\t\tUndecoratedSmoothedCCK = UndecoratedSmoothedCCK + 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUndecoratedSmoothedCCK = \t\n\t\t\t\t\t\t\t( ((UndecoratedSmoothedCCK)*(Rx_Smooth_Factor-1)) + \n\t\t\t\t\t\t\t(pPhyInfo->RxPWDBAll)) /(Rx_Smooth_Factor);\n\t\t\t\t}\n\t\t\t}\n\t\t\ti = 63;\n\t\t\tpEntry->rssi_stat.OFDM_pkt -= (u4Byte)((pEntry->rssi_stat.PacketMap>>i)&BIT0);\t\t\t\n\t\t\tpEntry->rssi_stat.PacketMap = pEntry->rssi_stat.PacketMap<<1;\t\t\t\n\t\t}\n\n\t\t//if(pEntry)\n\t\t{\n\t\t\t//2011.07.28 LukeLee: modified to prevent unstable CCK RSSI\n\t\t\tif (pEntry->rssi_stat.OFDM_pkt == 64) { /* speed up when all packets are OFDM*/\n\t\t\t\tUndecoratedSmoothedPWDB = UndecoratedSmoothedOFDM;\n\t\t\t} else {\n\t\t\t\tif (pEntry->rssi_stat.ValidBit < 64)\n\t\t\t\t\tpEntry->rssi_stat.ValidBit++;\n\n\t\t\t\tif (pEntry->rssi_stat.ValidBit == 64) {\n\t\t\t\t\tWeighting = ((pEntry->rssi_stat.OFDM_pkt<<4) > 64)?64:(pEntry->rssi_stat.OFDM_pkt<<4);\n\t\t\t\t\tUndecoratedSmoothedPWDB = (Weighting*UndecoratedSmoothedOFDM+(64-Weighting)*UndecoratedSmoothedCCK)>>6;\n\t\t\t\t} else {\n\t\t\t\t\tif (pEntry->rssi_stat.ValidBit != 0)\n\t\t\t\t\t\tUndecoratedSmoothedPWDB = (pEntry->rssi_stat.OFDM_pkt*UndecoratedSmoothedOFDM+(pEntry->rssi_stat.ValidBit-pEntry->rssi_stat.OFDM_pkt)*UndecoratedSmoothedCCK)/pEntry->rssi_stat.ValidBit;\n\t\t\t\t\telse\n\t\t\t\t\t\tUndecoratedSmoothedPWDB = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB == -1)\n\t\t\t\tphydm_ra_rssi_rpt_wk(pDM_Odm);\n\t\t\t#endif\n\t\t\tpEntry->rssi_stat.UndecoratedSmoothedCCK = UndecoratedSmoothedCCK;\n\t\t\tpEntry->rssi_stat.UndecoratedSmoothedOFDM = UndecoratedSmoothedOFDM;\n\t\t\tpEntry->rssi_stat.UndecoratedSmoothedPWDB = UndecoratedSmoothedPWDB;\n\n\t\t\t//DbgPrint(\"OFDM_pkt=%d, Weighting=%d\\n\", OFDM_pkt, Weighting);\n\t\t\t//DbgPrint(\"UndecoratedSmoothedOFDM=%d, UndecoratedSmoothedPWDB=%d, UndecoratedSmoothedCCK=%d\\n\", \n\t\t\t//\tUndecoratedSmoothedOFDM, UndecoratedSmoothedPWDB, UndecoratedSmoothedCCK);\n\t\t\t\n\t\t}\n\t\n\t}\n}\n\n\n#if(ODM_IC_11N_SERIES_SUPPORT ==1)\n//\n// Endianness before calling this API\n//\nVOID\nODM_PhyStatusQuery_92CSeries(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\t\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n\n\todm_RxPhyStatus92CSeries_Parsing(\n\t\t\t\t\t\t\tpDM_Odm,\n\t\t\t\t\t\t\tpPhyInfo,\n\t\t\t\t\t\t\tpPhyStatus,\n\t\t\t\t\t\t\tpPktinfo);\n\n\tif( pDM_Odm->RSSI_test == TRUE)\n\t{\n\t\t// Select the packets to do RSSI checking for antenna switching.\n\t\tif(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon )\n\t\t{\n\t\t\t\t/*\n\t\t\t#if 0//(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\tdm_SWAW_RSSI_Check(\n\t\t\t\tAdapter, \n\t\t\t\t(tmppAdapter!=NULL)?(tmppAdapter==Adapter):TRUE,\n\t\t\t\tbPacketMatchBSSID,\n\t\t\t\tpEntry,\n\t\t\t\tpRfd);\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\t// Select the packets to do RSSI checking for antenna switching.\n\t\t\t//odm_SwAntDivRSSICheck8192C(padapter, precvframe->u.hdr.attrib.RxPWDBAll);\n\t\t\t#endif\n\t\t\t\t*/\n#if (RTL8192C_SUPPORT == 1)\n\t\t\t\tODM_SwAntDivChkPerPktRssi(pDM_Odm,pPktinfo->StationID,pPhyInfo);\n#endif\n\t\t}\t\n\t}\n\telse\n\t{\n\t\todm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\n\t}\n\n}\n#endif\n\n\n//\n// Endianness before calling this API\n//\n#if\tODM_IC_11AC_SERIES_SUPPORT\n\nVOID\nODM_PhyStatusQuery_JaguarSeries(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\t\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n\todm_RxPhyStatusJaguarSeries_Parsing(\n\t\t\t\t\t\t\tpDM_Odm,\n\t\t\t\t\t\t\tpPhyInfo,\n\t\t\t\t\t\t\tpPhyStatus,\n\t\t\t\t\t\t\tpPktinfo);\n\t\n\todm_Process_RSSIForDM(pDM_Odm,pPhyInfo,pPktinfo);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t//phydm_sbd_check(pDM_Odm);\n#endif\n}\n#endif\n\nVOID\nODM_PhyStatusQuery(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\t\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n#if (RTL8822B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType & ODM_RTL8822B) {\n\t\tphydm_RxPhyStatusJaguarSeries2(pDM_Odm, pPhyStatus, pPktinfo, pPhyInfo);\n\t\treturn;\n\t}\n#endif\n\n#if\tODM_IC_11AC_SERIES_SUPPORT\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\tODM_PhyStatusQuery_JaguarSeries(pDM_Odm, pPhyInfo, pPhyStatus, pPktinfo);\n#endif\n\n#if\tODM_IC_11N_SERIES_SUPPORT\n\tif(pDM_Odm->SupportICType & ODM_IC_11N_SERIES )\n\t\tODM_PhyStatusQuery_92CSeries(pDM_Odm,pPhyInfo,pPhyStatus,pPktinfo);\n#endif\n}\n\t\n// For future use.\nVOID\rODM_MacStatusQuery(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpMacStatus,\n\tIN\t\tu1Byte\t\t\t\t\t\tMacID,\t\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketMatchBSSID,\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketToSelf,\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketBeacon\n\t)\n{\n\t// 2011/10/19 Driver team will handle in the future.\n\t\n}\n\n\n//\n// If you want to add a new IC, Please follow below template and generate a new one.\n// \n//\n\nHAL_STATUS\nODM_ConfigRFWithHeaderFile(\n\tIN \tPDM_ODM_T\t        \tpDM_Odm,\n\tIN \tODM_RF_Config_Type \t\tConfigType,\n\tIN \tODM_RF_RADIO_PATH_E \teRFPath\n    )\n{\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\t\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\t\n#endif\n\n   ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t \t\t(\"===>ODM_ConfigRFWithHeaderFile (%s)\\n\", (pDM_Odm->bIsMPChip) ? \"MPChip\" : \"TestChip\"));\n    ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t\t\t(\"pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\\n\",\n\t\t\t\tpDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\n\n//1 AP doesn't use PHYDM power tracking table in these ICs\n#if (DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n#if (RTL8723A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8723A)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t\tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG_MP(8723A,_RadioA);\n\t\t}\n\t}\n#endif\n#if (RTL8812A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t\tif(eRFPath == ODM_RF_PATH_A){\n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_RadioA);\n\t\t\t}\n\t\t\telse if(eRFPath == ODM_RF_PATH_B){\n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_RadioB);\n\t\t\t}\n\t\t}\n\t\telse if(ConfigType == CONFIG_RF_TXPWR_LMT) {\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) && (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\t\tif ((pHalData->EEPROMSVID == 0x17AA && pHalData->EEPROMSMID == 0xA811) ||\n\t\t\t\t(pHalData->EEPROMSVID == 0x10EC && pHalData->EEPROMSMID == 0xA812) ||\n\t\t\t\t(pHalData->EEPROMSVID == 0x10EC && pHalData->EEPROMSMID == 0x8812))\n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_TXPWR_LMT_HM812A03);\n\t\t\telse\n\t\t\t#endif\t\t\t\t\n\t\t\tREAD_AND_CONFIG_MP(8812A,_TXPWR_LMT);\n\t\t}\n\t}\n#endif\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t \t\tif(eRFPath == ODM_RF_PATH_A){\n\t\t\t\tREAD_AND_CONFIG_MP(8821A,_RadioA);\n\t\t\t}\n\t\t}\n\t\telse if(ConfigType == CONFIG_RF_TXPWR_LMT) {\n\t\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\n\t\t\t\tif (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM);\n\t\t\t\telse\n\t\t\t\t\tREAD_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA);\t\t\t\t\n\t\t\t} \n\t\t\telse {\n\t\t\t\t#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n\t\t\t\tif (pMgntInfo->CustomerID == RT_CID_8821AE_ASUS_MB)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A_SAR_8mm);\n\t\t\t\telse if (pMgntInfo->CustomerID == RT_CID_ASUS_NB)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A_SAR_5mm);\n\t\t\t\telse\n\t\t\t\t#endif\n\t\t\t\t\tREAD_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A);\t\t\t\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"<===8821_ODM_ConfigRFWithHeaderFile\\n\"));\n\t}\n#endif\n\n#if (RTL8723B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO)\n\t\t\tREAD_AND_CONFIG_MP(8723B,_RadioA);\n\t\telse if(ConfigType == CONFIG_RF_TXPWR_LMT)\n\t\t\tREAD_AND_CONFIG_MP(8723B,_TXPWR_LMT);\n\t}\n#endif\n\n#if (RTL8192E_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t \tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG_MP(8192E,_RadioA);\n\t\t\telse if(eRFPath == ODM_RF_PATH_B)\n\t\t\t\tREAD_AND_CONFIG_MP(8192E,_RadioB);\n\t\t} else if (ConfigType == CONFIG_RF_TXPWR_LMT) {\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) && (DEV_BUS_TYPE == RT_PCI_INTERFACE)\t/*Refine by Vincent Lan for 5mm SAR pwr limit*/\n\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\t\t\tif ((pHalData->EEPROMSVID == 0x11AD && pHalData->EEPROMSMID == 0x8192) || \n\t\t\t\t(pHalData->EEPROMSVID == 0x11AD && pHalData->EEPROMSMID == 0x8193))\n\t\t\t\tREAD_AND_CONFIG_MP(8192E, _TXPWR_LMT_8192E_SAR_5mm);\n\t\t\telse\n#endif\t\n\t\t\tREAD_AND_CONFIG_MP(8192E,_TXPWR_LMT);\n\t}\n\t}\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n\n//1 All platforms support\n#if (RTL8188E_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t\tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8188E,_RadioA);\n\t\t}\n\t\telse if(ConfigType == CONFIG_RF_TXPWR_LMT)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_TXPWR_LMT);\n\t}\n#endif\n#if (RTL8814A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t{\n\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t \tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG_MP(8814A,_RadioA);\n\t\t\telse if(eRFPath == ODM_RF_PATH_B)\n\t\t\t\tREAD_AND_CONFIG_MP(8814A,_RadioB);\n\t\t\telse if(eRFPath == ODM_RF_PATH_C)\n\t\t\t\tREAD_AND_CONFIG_MP(8814A,_RadioC);\n\t\t\telse if(eRFPath == ODM_RF_PATH_D)\n\t\t\t\tREAD_AND_CONFIG_MP(8814A,_RadioD);\n\t\t}\t\n\t\telse if(ConfigType == CONFIG_RF_TXPWR_LMT) \n\t\t\tREAD_AND_CONFIG_MP(8814A,_TXPWR_LMT);\n\t}\n#endif\n#if (RTL8703B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\tif (ConfigType == CONFIG_RF_RADIO) {\n\t\t\tif (eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG_MP(8703B, _RadioA);\n\t\t}\t\n\t}\n#endif\n\n#if (RTL8188F_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F) {\n\t\tif (ConfigType == CONFIG_RF_RADIO) {\n\t\t\tif (eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG_MP(8188F, _RadioA);\n\t\t} else if (ConfigType == CONFIG_RF_TXPWR_LMT)\n\t\t\tREAD_AND_CONFIG_MP(8188F, _TXPWR_LMT);\n\t}\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n#if (RTL8821B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821B)\n\t{\n\t\tif (ConfigType == CONFIG_RF_RADIO) {\n\t \t\tif (eRFPath == ODM_RF_PATH_A)\n\t\t\t\tREAD_AND_CONFIG(8821B, _RadioA);\n\t\t} else if (ConfigType == CONFIG_RF_TXPWR_LMT)\n\t\t\tREAD_AND_CONFIG(8821B, _TXPWR_LMT);\n\t}\n#endif\n#if (RTL8822B_SUPPORT == 1)\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\t{\n\t\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t\t\tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8822B, _RadioA);\n\t\t\t\telse if(eRFPath == ODM_RF_PATH_B)\n\t\t\t\t\tREAD_AND_CONFIG_MP(8822B, _RadioB);\n\t\t\t}\t\n\t\t}\n#endif\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if (RTL8188F_SUPPORT == 1)\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\t{\n\t\t\tif(ConfigType == CONFIG_RF_RADIO) {\n\t\t\t\tif(eRFPath == ODM_RF_PATH_A)\n\t\t\t\t\tREAD_AND_CONFIG_TC(8188F,_RadioA);\n\t\t\t}\t\n\t\t}\n#endif\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n\n\treturn HAL_STATUS_SUCCESS;\n}\n\nHAL_STATUS\nODM_ConfigRFWithTxPwrTrackHeaderFile(\n\tIN \tPDM_ODM_T\t        \tpDM_Odm\n    )\n{\n   \tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t \t\t (\"===>ODM_ConfigRFWithTxPwrTrackHeaderFile (%s)\\n\", (pDM_Odm->bIsMPChip) ? \"MPChip\" : \"TestChip\"));\n   \tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t\t\t (\"pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\\n\",\n\t\t\t\t pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\n\n\n//1 AP doesn't use PHYDM power tracking table in these ICs\n#if (DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n#if RTL8821A_SUPPORT\n\tif(pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\n\t\t\tREAD_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8821A,_TxPowerTrack_USB);\t\t\t\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8821A,_TxPowerTrack_SDIO);\n\t}\n#endif\t\n#if RTL8812A_SUPPORT\t\n\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\n\t\t\tREAD_AND_CONFIG_MP(8812A,_TxPowerTrack_PCIE);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\n\t\t\tif (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) \n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_TxPowerTrack_RFE3);\t\n\t\t\telse\n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_TxPowerTrack_USB);\t\n\t\t}\n\t\t\n\t}\n#endif\t\n#if RTL8192E_SUPPORT \t\n\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\n\t\t\tREAD_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8192E,_TxPowerTrack_USB); \n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8192E,_TxPowerTrack_SDIO); \n\t}\n#endif\n#if RTL8723B_SUPPORT \t\n\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\n\t\t\tREAD_AND_CONFIG_MP(8723B,_TxPowerTrack_PCIE);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8723B,_TxPowerTrack_USB);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8723B,_TxPowerTrack_SDIO); \t\t\t\n\t}\n#endif\t\n#if RTL8188E_SUPPORT \t\n\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_TxPowerTrack_USB);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_TxPowerTrack_SDIO);\n\t}\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n\n//1 All platforms support\n#if RTL8814A_SUPPORT\n\tif(pDM_Odm->SupportICType == ODM_RTL8814A) \n\t{\n\t\tif(pDM_Odm->RFEType == 0)\n\t\t\tREAD_AND_CONFIG_MP(8814A,_TxPowerTrack_Type0);\n\t\telse if(pDM_Odm->RFEType == 2)\n\t\t\tREAD_AND_CONFIG_MP(8814A,_TxPowerTrack_Type2);\n\t\telse if (pDM_Odm->RFEType == 5)\n\t\t\tREAD_AND_CONFIG_MP(8814A, _TxPowerTrack_Type5);\n\t\telse\n\t\t\tREAD_AND_CONFIG_MP(8814A,_TxPowerTrack);\n\t}\n#endif\t\n#if RTL8703B_SUPPORT\n\tif (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8703B, _TxPowerTrack_USB);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8703B, _TxPowerTrack_SDIO);\t\t\n\t}\n#endif\n\n#if RTL8188F_SUPPORT\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F) {\n\t\tif (pDM_Odm->SupportInterface == ODM_ITRF_USB)\n\t\t\tREAD_AND_CONFIG_MP(8188F, _TxPowerTrack_USB);\n\t\telse if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO)\n\t\t\tREAD_AND_CONFIG_MP(8188F, _TxPowerTrack_SDIO);\n\t}\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n#if RTL8821B_SUPPORT\n\tif(pDM_Odm->SupportICType == ODM_RTL8821B)\n\t\t\tREAD_AND_CONFIG(8821B,_TxPowerTrack);\t\t\t\n#endif\t\n#if RTL8822B_SUPPORT\n/*\tif(pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\t\tREAD_AND_CONFIG_MP(8822B, _TxPowerTrack);\t\t\t*/\n#endif\t\n\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if RTL8188F_SUPPORT\n\tif(pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\t\tREAD_AND_CONFIG_TC(8188F,_TxPowerTrack_PCIE);\t\t\t\n#endif\t\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n\n\n\treturn HAL_STATUS_SUCCESS;\n}\n\nHAL_STATUS\nODM_ConfigBBWithHeaderFile(\n\tIN \tPDM_ODM_T\t             \tpDM_Odm,\n\tIN \tODM_BB_Config_Type \t\tConfigType\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\t\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\t\n#endif\n\n//1 AP doesn't use PHYDM initialization in these ICs\n#if (DM_ODM_SUPPORT_TYPE !=  ODM_AP)\t\n#if (RTL8723A_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8723A)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8723A,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8723A,_AGC_TAB);\n\t\t}\t\t\n\t}\t\t\n#endif\n#if (RTL8812A_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8812A,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8812A,_AGC_TAB);\n\t\t}\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t{\n\t\t\tif (pDM_Odm->RFEType == 3 && pDM_Odm->bIsMPChip) \n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_PHY_REG_PG_ASUS);\n\t\t\t#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n\t\t\telse if (pMgntInfo->CustomerID == RT_CID_WNC_NEC && pDM_Odm->bIsMPChip) \n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_PHY_REG_PG_NEC);\n\t\t\t#endif\t\t\t\n\t\t\telse\n\t\t\t\tREAD_AND_CONFIG_MP(8812A,_PHY_REG_PG);\n\t\t}\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_MP){\n\t\t\tREAD_AND_CONFIG_MP(8812A,_PHY_REG_MP);\n\t\t}\n\t\telse if(ConfigType == CONFIG_BB_AGC_TAB_DIFF)\n\t\t{\n\t\t\tif ((36 <= *pDM_Odm->pChannel)  && (*pDM_Odm->pChannel  <= 64)) \n\t\t\t\tAGC_DIFF_CONFIG_MP(8812A,LB);\n\t\t\telse if (100 <= *pDM_Odm->pChannel) \n\t\t\t\tAGC_DIFF_CONFIG_MP(8812A,HB);\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (\" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8812AGCTABArray\\n\"));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (\" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8812PHY_REGArray\\n\"));\n\t}\t\t\n#endif\n#if (RTL8821A_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8821)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8821A,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8821A,_AGC_TAB);\n\t\t}else if(ConfigType == CONFIG_BB_PHY_REG_PG){\n\t\t\tREAD_AND_CONFIG_MP(8821A,_PHY_REG_PG);\n\t\t}\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (\" ===> phy_ConfigBBWithHeaderFile() phy:Rtl8821AGCTABArray\\n\"));\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (\" ===> phy_ConfigBBWithHeaderFile() agc:Rtl8821PHY_REGArray\\n\"));\n\t}\t\t\n#endif\n#if (RTL8723B_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8723B,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8723B,_AGC_TAB);\n\t\t}else if(ConfigType == CONFIG_BB_PHY_REG_PG){\n\t\t\tREAD_AND_CONFIG_MP(8723B,_PHY_REG_PG);\n\t\t}\n\t}\n#endif\n#if (RTL8192E_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8192E,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8192E,_AGC_TAB);\n\t\t}else if(ConfigType == CONFIG_BB_PHY_REG_PG){\n\t\t\tREAD_AND_CONFIG_MP(8192E,_PHY_REG_PG);\n\t\t}\n\t}\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n\n\n//1 All platforms support\n#if (RTL8188E_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_PHY_REG);\n\t\telse if(ConfigType == CONFIG_BB_AGC_TAB)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_AGC_TAB);\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t\tREAD_AND_CONFIG_MP(8188E,_PHY_REG_PG);\n\t}\n#endif\n#if (RTL8814A_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8814A)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG){\n\t\t\tREAD_AND_CONFIG_MP(8814A,_PHY_REG);\n\t\t}else if(ConfigType == CONFIG_BB_AGC_TAB){\n\t\t\tREAD_AND_CONFIG_MP(8814A,_AGC_TAB);\n\t\t}else if(ConfigType == CONFIG_BB_PHY_REG_PG){\n\t\t\tREAD_AND_CONFIG_MP(8814A,_PHY_REG_PG);\n\t\t}else if(ConfigType == CONFIG_BB_PHY_REG_MP){\n\t\t\tREAD_AND_CONFIG_MP(8814A,_PHY_REG_MP);\n\t\t}\n\t}\n#endif\n#if (RTL8703B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\tif (ConfigType == CONFIG_BB_PHY_REG)\n\t\t\tREAD_AND_CONFIG_MP(8703B, _PHY_REG);\n\t\telse if (ConfigType == CONFIG_BB_AGC_TAB)\n\t\t\tREAD_AND_CONFIG_MP(8703B, _AGC_TAB);\n\t\telse if (ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t\tREAD_AND_CONFIG_MP(8703B, _PHY_REG_PG);\n\t}\n#endif\n\n#if (RTL8188F_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F) {\n\t\tif (ConfigType == CONFIG_BB_PHY_REG) \n\t\t\tREAD_AND_CONFIG_MP(8188F, _PHY_REG);\n\t\telse if (ConfigType == CONFIG_BB_AGC_TAB) \n\t\t\tREAD_AND_CONFIG_MP(8188F, _AGC_TAB);\n\t\telse if (ConfigType == CONFIG_BB_PHY_REG_PG) \n\t\t\tREAD_AND_CONFIG_MP(8188F, _PHY_REG_PG);\n\t}\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n#if (RTL8821B_SUPPORT == 1) \n\tif(pDM_Odm->SupportICType == ODM_RTL8821B)\n\t{\n\t\tif (ConfigType == CONFIG_BB_PHY_REG) {\n\t\t\tREAD_AND_CONFIG(8821B,_PHY_REG);\n\t\t} else if (ConfigType == CONFIG_BB_AGC_TAB) { \n\t\t    READ_AND_CONFIG(8821B,_AGC_TAB);\n\t\t} else if (ConfigType == CONFIG_BB_PHY_REG_PG) {\n\t\t\tREAD_AND_CONFIG(8821B,_PHY_REG_PG);\n\t\t}\n\t}\t\t\n#endif\n#if (RTL8822B_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8822B)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG)\n\t\t\tREAD_AND_CONFIG_MP(8822B, _PHY_REG);\n\t\telse if(ConfigType == CONFIG_BB_AGC_TAB)\n\t\t\tREAD_AND_CONFIG_MP(8822B, _AGC_TAB);\n/*\t\telse if(ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t\tREAD_AND_CONFIG_MP(8822B, _PHY_REG_PG);\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_MP)\n\t\t\tREAD_AND_CONFIG_MP(8822B, _PHY_REG_MP); */\n\t}\n#endif\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if (RTL8188F_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8188F)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG)\n\t\t\tREAD_AND_CONFIG_TC(8188F,_PHY_REG);\n\t\telse if(ConfigType == CONFIG_BB_AGC_TAB)\n\t\t\tREAD_AND_CONFIG_TC(8188F,_AGC_TAB);\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t\tREAD_AND_CONFIG_TC(8188F,_PHY_REG_PG);\n\t}\n#endif\n#endif\n#if (RTL8195A_SUPPORT == 1)\n\tif(pDM_Odm->SupportICType == ODM_RTL8195A)\n\t{\n\t\tif(ConfigType == CONFIG_BB_PHY_REG)\n\t\t\tREAD_AND_CONFIG(8195A,_PHY_REG);\n\t\telse if(ConfigType == CONFIG_BB_AGC_TAB)\n\t\t\tREAD_AND_CONFIG(8195A,_AGC_TAB);\n\t\telse if(ConfigType == CONFIG_BB_PHY_REG_PG)\n\t\t\tREAD_AND_CONFIG(8195A,_PHY_REG_PG);\n\t}\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n\n\treturn HAL_STATUS_SUCCESS; \n}                 \n\nHAL_STATUS\nODM_ConfigMACWithHeaderFile(\n\tIN \tPDM_ODM_T\tpDM_Odm\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\t\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\t\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t \t\t(\"===>ODM_ConfigMACWithHeaderFile (%s)\\n\", (pDM_Odm->bIsMPChip) ? \"MPChip\" : \"TestChip\"));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, \n\t\t\t\t(\"pDM_Odm->SupportPlatform: 0x%X, pDM_Odm->SupportInterface: 0x%X, pDM_Odm->BoardType: 0x%X\\n\",\n\t\t\t\tpDM_Odm->SupportPlatform, pDM_Odm->SupportInterface, pDM_Odm->BoardType));\n\n//1 AP doesn't use PHYDM initialization in these ICs\n#if (DM_ODM_SUPPORT_TYPE !=  ODM_AP)\t\n#if (RTL8723A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8723A){\n\t\tREAD_AND_CONFIG_MP(8723A,_MAC_REG);\n\t}\n#endif\n#if (RTL8812A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8812){\n\t\tREAD_AND_CONFIG_MP(8812A,_MAC_REG);\n\t}\n#endif\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821){\n\t\tREAD_AND_CONFIG_MP(8821A,_MAC_REG);\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"<===8821_ODM_ConfigMACwithHeaderFile\\n\"));\n\t}\n#endif\n#if (RTL8723B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8723B){\n\t\tREAD_AND_CONFIG_MP(8723B,_MAC_REG);\n\t}\n#endif\n#if (RTL8192E_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8192E){\n\t\tREAD_AND_CONFIG_MP(8192E,_MAC_REG);\n\t}\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE !=  ODM_AP)\n\n//1 All platforms support\n#if (RTL8188E_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188E){\n\t\tREAD_AND_CONFIG_MP(8188E,_MAC_REG);\n\t}\n#endif\n#if (RTL8814A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8814A){\n\t\tREAD_AND_CONFIG_MP(8814A,_MAC_REG);\n\t}\n#endif\n#if (RTL8703B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8703B)\n\t\tREAD_AND_CONFIG_MP(8703B, _MAC_REG);\n#endif\n\n#if (RTL8188F_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188F) \n\t\tREAD_AND_CONFIG_MP(8188F, _MAC_REG);\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)\n#if (RTL8821B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821B){\n\t\tREAD_AND_CONFIG(8821B,_MAC_REG);\n\t}\n#endif\n#if (RTL8822B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\tREAD_AND_CONFIG_MP(8822B, _MAC_REG);\n#endif\n\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if (RTL8188F_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\tREAD_AND_CONFIG_TC(8188F,_MAC_REG);\n#endif\n#endif\n#if (RTL8195A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8195A)\n\t\tREAD_AND_CONFIG_MP(8195A,_MAC_REG);\n#endif\n#endif /*#if (DM_ODM_SUPPORT_TYPE &  ODM_WIN)*/\n\n\treturn HAL_STATUS_SUCCESS;    \n} \n\nHAL_STATUS\nODM_ConfigFWWithHeaderFile(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN \tODM_FW_Config_Type \tConfigType,\n\tOUT u1Byte\t\t\t\t*pFirmware,\n\tOUT u4Byte\t\t\t\t*pSize\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\n#if (RTL8188E_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t{\n\t#ifdef CONFIG_SFW_SUPPORTED\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_WoWLAN);\n\t\telse if(ConfigType == CONFIG_FW_NIC_2)\n\t\t\tREAD_FIRMWARE_MP(8188E_S,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN_2)\n\t\t\tREAD_FIRMWARE_MP(8188E_S,_FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\tif (ConfigType == CONFIG_FW_AP)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_AP);\n\t\telse if (ConfigType == CONFIG_FW_AP_2)\n\t\t\tREAD_FIRMWARE_MP(8188E_S,_FW_AP);\n\t\t#endif //CONFIG_AP_WOWLAN\n\t#else\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP)\n\t\t\tREAD_FIRMWARE_MP(8188E_T,_FW_AP);\n\t\t#endif //CONFIG_AP_WOWLAN\n\t#endif\n\t}\n#endif\n#if (RTL8723B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8723B)\n\t{\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8723B,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8723B,_FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE(8723B,_FW_AP_WoWLAN);\n\t\t#endif\n\t\t\n\t}\n#endif //#if (RTL8723B_SUPPORT == 1)  \n#if (RTL8812A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8812)\n\t{\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8812A,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8812A,_FW_WoWLAN);\n\t\telse if (ConfigType == CONFIG_FW_BT)\n\t\t\tREAD_FIRMWARE_MP(8812A,_FW_NIC_BT);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE(8812A,_FW_AP);\n\t\t#endif\n\t}\n#endif\n#if (RTL8821A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821){\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8821A,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8821A,_FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8821A , _FW_AP);\n\t\t#endif /*CONFIG_AP_WOWLAN*/\n\t\telse if (ConfigType == CONFIG_FW_BT)\n\t\t\tREAD_FIRMWARE_MP(8821A,_FW_NIC_BT);\n\t}\n#endif\n#if (RTL8192E_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8192E)\n\t{\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8192E,_FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8192E,_FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8192E,_FW_AP);\n\t\t#endif\n\t}\n#endif\n#if (RTL8814A_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t{\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8814A,_FW_NIC);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8814A,_FW_AP);\n\t\t#endif\n\t}\n#endif\n#if (RTL8703B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8703B, _FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8703B, _FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE(8703B, _FW_AP_WoWLAN);\n\t\t#endif\n\t}\n#endif\n\n#if (RTL8188F_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F) {\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8188F, _FW_NIC);\n\t\telse if (ConfigType == CONFIG_FW_WoWLAN)\n\t\t\tREAD_FIRMWARE_MP(8188F, _FW_WoWLAN);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP)\n\t\t\tREAD_FIRMWARE_MP(8188F,_FW_AP);\n\t\t#endif\n\t}\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#if (RTL8821B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8821B)\n\t{\n\t}\n#endif\n#if (RTL8822B_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8822B)\n\t{\n\t\t/*\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8822B,_FW_NIC);\n\t\t#ifdef CONFIG_AP_WOWLAN\n\t\telse if (ConfigType == CONFIG_FW_AP_WoWLAN)\n\t\t\tREAD_FIRMWARE(8822B,_FW_AP);\n\t\t#endif */\n\t}\n#endif\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if (RTL8188F_SUPPORT == 1)\n\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t{\n\t\tif (ConfigType == CONFIG_FW_NIC)\n\t\t\tREAD_FIRMWARE_MP(8188F,_FW_NIC);\n\t}\n#endif\n#endif\n#endif//(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n#endif//(DM_ODM_SUPPORT_TYPE != ODM_AP)\n\treturn HAL_STATUS_SUCCESS;    \n} \n\nu4Byte \nODM_GetHWImgVersion(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t)\n{\n    u4Byte  Version=0;\n\n//1 AP doesn't use PHYDM initialization in these ICs\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n#if (RTL8723A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8723A)\n\t\tVersion = GET_VERSION_MP(8723A,_MAC_REG);\n#endif\n#if (RTL8723B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8723B)\n\t\tVersion = GET_VERSION_MP(8723B,_MAC_REG);\n#endif\n#if (RTL8821A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8821)\n\t\tVersion = GET_VERSION_MP(8821A,_MAC_REG);\n#endif\n#if (RTL8192E_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\tVersion = GET_VERSION_MP(8192E,_MAC_REG);\n#endif\n#if (RTL8812A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8812)\n\t\tVersion = GET_VERSION_MP(8812A,_MAC_REG);\n#endif\n#endif //(DM_ODM_SUPPORT_TYPE != ODM_AP)\n\n/*1 All platforms support*/\n#if (RTL8188E_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\tVersion = GET_VERSION_MP(8188E,_MAC_REG);\n#endif\n#if (RTL8814A_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\tVersion = GET_VERSION_MP(8814A,_MAC_REG);\n#endif\n#if (RTL8703B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8703B)\n\t\tVersion = GET_VERSION_MP(8703B, _MAC_REG);\n#endif\n#if (RTL8188F_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\tVersion = GET_VERSION_MP(8188F, _MAC_REG);\n#endif\n\n//1 New ICs (WIN only)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#if (RTL8821B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8821B)\n\t\tVersion = GET_VERSION(8821B,_MAC_REG);\n#endif\n#if (RTL8822B_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\tVersion = GET_VERSION(8822B, _MAC_REG);\n#endif\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n#if (RTL8188F_SUPPORT == 1)  \n\tif (pDM_Odm->SupportICType == ODM_RTL8188F)\n\t\tVersion = GET_VERSION_TC(8188F, _MAC_REG);\n#endif\n#endif\n#endif //(DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\treturn Version;\n}\n\n#if (RTL8822B_SUPPORT == 1)\n/* For 8822B only!! need to move to FW finally */\n/*==============================================*/\n\nVOID\nphydm_ResetPhyInfo(\n\tIN\t\tPDM_ODM_T\t\t\t\t\tpPhydm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo\n)\n{\n\tpPhyInfo->RxPWDBAll = 0;\n\tpPhyInfo->SignalQuality = 0;\n\tpPhyInfo->BandWidth = 0;\n#if (RTL8822B_SUPPORT == 1)\n\tpPhyInfo->RxCount = 0;\n#endif\n\tODM_Memory_Set(pPhydm, pPhyInfo->RxMIMOSignalQuality, 0 , 4);\n\tODM_Memory_Set(pPhydm, pPhyInfo->RxMIMOSignalStrength, 0, 4);\n\tODM_Memory_Set(pPhydm, pPhyInfo->RxSNR, 0, 4);\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\t\n\tpPhyInfo->RxPower = -110;\n\tpPhyInfo->RecvSignalPower = -110;\n\tpPhyInfo->BTRxRSSIPercentage = 0;\n\tpPhyInfo->SignalStrength = 0;\n\tpPhyInfo->btCoexPwrAdjust = 0;\n#if (RTL8822B_SUPPORT == 1)\n\tpPhyInfo->channel = 0;\n\tpPhyInfo->bMuPacket = 0;\n\tpPhyInfo->bBeamformed = 0;\n\tpPhyInfo->rxsc = 0;\n#endif\n\tODM_Memory_Set(pPhydm, pPhyInfo->RxPwr, -110, 4);\n\tODM_Memory_Set(pPhydm, pPhyInfo->RxMIMOEVMdbm, 0, 4);\n\tODM_Memory_Set(pPhydm, pPhyInfo->Cfo_short, 0, 8);\n\tODM_Memory_Set(pPhydm, pPhyInfo->Cfo_tail, 0, 8);\n#endif\n}\n\nVOID\nphydm_SetPerPathPhyInfo(\n\tIN\t\tu1Byte\t\t\t\t\t\t\tRxPath,\n\tIN\t\ts1Byte\t\t\t\t\t\t\tRxPwr,\n\tIN\t\ts1Byte\t\t\t\t\t\t\tRxEVM,\n\tIN\t\ts1Byte\t\t\t\t\t\t\tCfo_tail,\n\tIN\t\ts1Byte\t\t\t\t\t\t\tRxSNR,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo\n)\n{\n\tu1Byte\t\t\tEVMdBm = 0;\n\tu1Byte\t\t\tEVMPercentage = 0;\n\n\t/* SNR is S(8,1), EVM is S(8,1), CFO is S(8,7) */\n\t\n\tif (RxEVM < 0) {\n\t\t/* Calculate EVM in dBm */\n\t\tEVMdBm = ((u1Byte)(0 - RxEVM) >> 1);\n\n\t\t/* Calculate EVM in percentage */\n\t\tif (EVMdBm >= 33)\n\t\t\tEVMPercentage = 100;\n\t\telse \n\t\t\tEVMPercentage = (EVMdBm << 1) + (EVMdBm);\n\t}\n\t\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\tpPhyInfo->RxPwr[RxPath] = RxPwr;\n\tpPhyInfo->RxMIMOEVMdbm[RxPath] = EVMdBm;\n\n\t/* CFO = CFO_tail * 312.5 / 2^7 ~= CFO tail * 39/512 (kHz)*/\n\tpPhyInfo->Cfo_tail[RxPath] = Cfo_tail;\n\tpPhyInfo->Cfo_tail[RxPath] = ((pPhyInfo->Cfo_tail[RxPath] << 5) + (pPhyInfo->Cfo_tail[RxPath] << 2) +\n\t\t(pPhyInfo->Cfo_tail[RxPath] << 1) + (pPhyInfo->Cfo_tail[RxPath])) >> 9;\n#endif\n\n\tpPhyInfo->RxMIMOSignalStrength[RxPath] = odm_QueryRxPwrPercentage(RxPwr);\n\tpPhyInfo->RxMIMOSignalQuality[RxPath] = EVMPercentage;\n\tpPhyInfo->RxSNR[RxPath] = RxSNR >> 1;\n\n/*\n\t//if (pPktinfo->bPacketMatchBSSID) \n\t{\n\t\tDbgPrint(\"Path (%d)--------\\n\", RxPath);\n\t\tDbgPrint(\"RxPwr = %d, Signal strength = %d\\n\", pPhyInfo->RxPwr[RxPath], pPhyInfo->RxMIMOSignalStrength[RxPath]);\n\t\tDbgPrint(\"EVMdBm = %d, Signal quality = %d\\n\", pPhyInfo->RxMIMOEVMdbm[RxPath], pPhyInfo->RxMIMOSignalQuality[RxPath]);\n\t\tDbgPrint(\"CFO = %d, SNR = %d\\n\", pPhyInfo->Cfo_tail[RxPath], pPhyInfo->RxSNR[RxPath]);\n\t}\t\n*/\n}\n\nVOID\nphydm_SetCommonPhyInfo(\n\tIN\t\ts1Byte\t\t\t\t\t\t\tRxPower,\n\tIN\t\tu1Byte\t\t\t\t\t\t\tchannel,\n\tIN\t\tBOOLEAN\t\t\t\t\t\t\tbBeamformed,\n\tIN\t\tBOOLEAN\t\t\t\t\t\t\tbMuPacket,\n\tIN\t\tu1Byte\t\t\t\t\t\t\tbandwidth,\n\tIN\t\tu1Byte\t\t\t\t\t\t\tsignalQuality,\n\tIN\t\tu1Byte\t\t\t\t\t\t\trxsc,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo\n)\n{\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\tpPhyInfo->RxPower = RxPower;\t\t\t\t\t\t\t\t\t\t\t/* RSSI in dB */\n\tpPhyInfo->RecvSignalPower = RxPower;\t\t\t\t\t\t\t\t\t\t/* RSSI in dB */\n\tpPhyInfo->channel = channel;\t\t\t\t\t\t\t\t\t\t\t\t/* channel number */\n\tpPhyInfo->bBeamformed = bBeamformed;\t\t\t\t\t\t\t\t\t/* apply BF */\n\tpPhyInfo->bMuPacket = bMuPacket;\t\t\t\t\t\t\t\t\t\t/* MU packet */\n\tpPhyInfo->rxsc = rxsc;\n#endif\n\tpPhyInfo->RxPWDBAll = odm_QueryRxPwrPercentage(RxPower);\t\t\t\t/* RSSI in percentage */\n\tpPhyInfo->SignalQuality = signalQuality;\t\t\t\t\t\t\t\t\t\t/* signal quality */\n\tpPhyInfo->BandWidth = bandwidth;\t\t\t\t\t\t\t\t\t\t\t/* bandwidth */\n\n/*\n\t//if (pPktinfo->bPacketMatchBSSID)\n\t{\n\t\tDbgPrint(\"RxPWDBAll = %d, RxPower = %d, RecvSignalPower = %d\\n\", pPhyInfo->RxPWDBAll, pPhyInfo->RxPower, pPhyInfo->RecvSignalPower);\n\t\tDbgPrint(\"SignalQuality = %d\\n\", pPhyInfo->SignalQuality);\n\t\tDbgPrint(\"bBeamformed = %d, bMuPacket = %d, RxCount = %d\\n\", pPhyInfo->bBeamformed, pPhyInfo->bMuPacket, pPhyInfo->RxCount + 1);\n\t\tDbgPrint(\"channel = %d, rxsc = %d, BandWidth = %d\\n\", channel, rxsc, bandwidth);\n\t}\n*/\n}\n\nVOID\nphydm_GetRxPhyStatusType0(\n\tIN\t\tPDM_ODM_T\t\t\t\t\t\tpDM_Odm,\n\tIN\t\tpu1Byte\t\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\t\tpPktinfo,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo\n)\n{\n\t/* Type 0 is used for cck packet */\n\t\n\tPPHY_STATUS_RPT_JAGUAR2_TYPE0\tpPhyStaRpt = (PPHY_STATUS_RPT_JAGUAR2_TYPE0)pPhyStatus;\n\tu1Byte\t\t\t\t\t\t\ti, SQ = 0;\n\n\t/* Calculate Signal Quality*/\n\tif (pPktinfo->bPacketMatchBSSID) {\n\t\tif (pPhyStaRpt->signal_quality >= 64)\n\t\t\tSQ = 0;\n\t\telse if (pPhyStaRpt->signal_quality <= 20)\n\t\t\tSQ = 100;\n\t\telse {\n\t\t\t/* mapping to 2~99% */\n\t\t\tSQ = 64 - pPhyStaRpt->signal_quality;\n\t\t\tSQ = ((SQ << 3) + SQ) >> 2;\n\t\t}\n\t}\n\n\t/* Update CCK packet counter */\n\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++;\n\n\t/* Update Common information */\n\tphydm_SetCommonPhyInfo((pPhyStaRpt->pwdb - 110), pPhyStaRpt->channel, FALSE, \n\t\tFALSE, ODM_BW20M, SQ, pPhyStaRpt->rxsc, pPhyInfo);\n\n\t/* Update CCK pwdb */\n\tphydm_SetPerPathPhyInfo(ODM_RF_PATH_A, (pPhyStaRpt->pwdb - 110), 0, 0, 0, pPhyInfo);\t\t\t\t\t/* Update per-path information */\n\n/*\n\t//if (pPktinfo->bPacketMatchBSSID)\n\t{\n\t\tDbgPrint(\"pwdb = 0x%x, MP gain index = 0x%x, TRSW = 0x%x\\n\", pPhyStaRpt->pwdb, pPhyStaRpt->gain, pPhyStaRpt->trsw);\n\t\tDbgPrint(\"channel = %d, band = %d, rxsc = %d\\n\", pPhyStaRpt->channel, pPhyStaRpt->band, pPhyStaRpt->rxsc);\n\t\tDbgPrint(\"agc_table = 0x%x, agc_rpt 0x%x, bb_power = 0x%x\\n\", pPhyStaRpt->agc_table, pPhyStaRpt->agc_rpt, pPhyStaRpt->bb_power);\n\t\tDbgPrint(\"length = %d, SQ = %d\\n\", pPhyStaRpt->length, pPhyStaRpt->signal_quality);\n\t\tDbgPrint(\"antidx a = 0x%x, b = 0x%x, c = 0x%x, d = 0x%x\\n\", pPhyStaRpt->antidx_a, pPhyStaRpt->antidx_b, pPhyStaRpt->antidx_c, pPhyStaRpt->antidx_d);\n\t\tDbgPrint(\"rsvd_0 = 0x%x, rsvd_1 = 0x%x, rsvd_2 = 0x%x\\n\", pPhyStaRpt->rsvd_0, pPhyStaRpt->rsvd_1, pPhyStaRpt->rsvd_2);\n\t\tDbgPrint(\"rsvd_3 = 0x%x, rsvd_4 = 0x%x, rsvd_5 = 0x%x\\n\", pPhyStaRpt->rsvd_3, pPhyStaRpt->rsvd_4, pPhyStaRpt->rsvd_5);\n\t\tDbgPrint(\"rsvd_6 = 0x%x, rsvd_7 = 0x%x, rsvd_8 = 0x%x\\n\", pPhyStaRpt->rsvd_6, pPhyStaRpt->rsvd_7, pPhyStaRpt->rsvd_8);\n\t}\n*/\n}\n\nVOID\nphydm_GetRxPhyStatusType1(\n\tIN\t\tPDM_ODM_T\t\t\t\t\t\tpDM_Odm,\n\tIN\t\tpu1Byte\t\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\t\tpPktinfo,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo\n)\n{\n\t/* Type 1 is used for ofdm packet */\n\n\tPPHY_STATUS_RPT_JAGUAR2_TYPE1\tpPhyStaRpt = (PPHY_STATUS_RPT_JAGUAR2_TYPE1)pPhyStatus;\n\ts1Byte\t\t\t\t\t\t\trx_pwr_db = -120;\n\tu1Byte\t\t\t\t\t\t\ti, rxsc, bw, RxCount = 0;\n\tBOOLEAN\t\t\t\t\t\t\tbMU;\n\n\t/* Update OFDM packet counter */\n\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\n\n\t/* Update per-path information */\n\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) {\n\t\tif (pDM_Odm->RXAntStatus & BIT(i)) {\n\t\t\ts1Byte\trx_path_pwr_db;\n\n\t\t\t/* RX path counter */\n\t\t\tRxCount++;\n\n\t\t\t/* Update per-path information (RSSI_dB RSSI_percentage EVM SNR CFO SQ) */\n\t\t\t/* EVM report is reported by stream, not path */\n\t\t\trx_path_pwr_db = pPhyStaRpt->pwdb[i] - 110;\t\t\t\t\t/* per-path pwdb in dB domain */\n\t\t\tphydm_SetPerPathPhyInfo(i, rx_path_pwr_db, pPhyStaRpt->rxevm[RxCount - 1], \n\t\t\t\tpPhyStaRpt->cfo_tail[i], pPhyStaRpt->rxsnr[i], pPhyInfo);\n\n\t\t\t/* search maximum pwdb */\n\t\t\tif (rx_path_pwr_db > rx_pwr_db)\n\t\t\t\trx_pwr_db = rx_path_pwr_db;\n\t\t}\n\t}\n\n\t/* mapping RX counter from 1~4 to 0~3 */\n\tif (RxCount > 0)\n\t\tpPhyInfo->RxCount = RxCount - 1;\n\t\n\t/* Check if MU packet or not */\n\tif ((pPhyStaRpt->gid != 0) && (pPhyStaRpt->gid != 63)) {\n\t\tbMU = TRUE;\n\t\tpDM_Odm->PhyDbgInfo.NumQryMuPkt++;\n\t} else\n\t\tbMU = FALSE;\n\n\t/* Count BF packet */\n\tpDM_Odm->PhyDbgInfo.NumQryBfPkt = pDM_Odm->PhyDbgInfo.NumQryBfPkt + pPhyStaRpt->beamformed;\n\n\t/* Check sub-channel */\n\tif ((pPktinfo->DataRate > ODM_RATE11M) && (pPktinfo->DataRate < ODM_RATEMCS0))\n\t\trxsc = pPhyStaRpt->l_rxsc;\n\telse\n\t\trxsc = pPhyStaRpt->ht_rxsc;\n\n\t/* Check RX bandwidth */\n\tif ((rxsc >= 1) && (rxsc <= 8))\n\t\tbw = ODM_BW20M;\n\telse if ((rxsc >= 9) && (rxsc <= 12))\n\t\tbw = ODM_BW40M;\n\telse if (rxsc >= 13)\n\t\tbw = ODM_BW80M;\n\telse\n\t\tbw = pPhyStaRpt->rf_mode;\n\n\t/* Update packet information */\n\tphydm_SetCommonPhyInfo(rx_pwr_db, pPhyStaRpt->channel, (BOOLEAN)pPhyStaRpt->beamformed,\n\t\tbMU, bw, odm_EVMdbToPercentage(pPhyStaRpt->rxevm[0]), rxsc, pPhyInfo);\n\n/*\n\t//if (pPktinfo->bPacketMatchBSSID)\n\t{\n\t\tDbgPrint(\"channel = %d, band = %d, l_rxsc = %d, ht_rxsc = %d, rf_mode = %d\\n\", pPhyStaRpt->channel, pPhyStaRpt->band, pPhyStaRpt->l_rxsc, pPhyStaRpt->ht_rxsc, pPhyStaRpt->rf_mode);\n\t\tDbgPrint(\"Antidx A = %d, B = %d, C = %d, D = %d\\n\", pPhyStaRpt->antidx_a, pPhyStaRpt->antidx_b, pPhyStaRpt->antidx_c, pPhyStaRpt->antidx_d);\n\t\tDbgPrint(\"pwdb A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->pwdb[0], pPhyStaRpt->pwdb[1], pPhyStaRpt->pwdb[2], pPhyStaRpt->pwdb[3]);\n\t\tDbgPrint(\"EVM  A: %d, B: %d, C: %d, D: %d\\n\", pPhyStaRpt->rxevm[0], pPhyStaRpt->rxevm[1], pPhyStaRpt->rxevm[2], pPhyStaRpt->rxevm[3]);\n\t\tDbgPrint(\"SNR  A: %d, B: %d, C: %d, D: %d\\n\", pPhyStaRpt->rxsnr[0], pPhyStaRpt->rxsnr[1], pPhyStaRpt->rxsnr[2], pPhyStaRpt->rxsnr[3]);\n\t\tDbgPrint(\"CFO  A: %d, B: %d, C: %d, D: %d\\n\", pPhyStaRpt->cfo_tail[0], pPhyStaRpt->cfo_tail[1], pPhyStaRpt->cfo_tail[2], pPhyStaRpt->cfo_tail[3]);\n\t\tDbgPrint(\"paid = %d, gid = %d, length = %d\\n\", (pPhyStaRpt->paid + (pPhyStaRpt->paid_msb<<8)), pPhyStaRpt->gid, pPhyStaRpt->lsig_length);\n\t\tDbgPrint(\"ldpc: %d, stbc: %d, bf: %d, gnt_bt: %d, antsw: %d\\n\", pPhyStaRpt->ldpc, pPhyStaRpt->stbc, pPhyStaRpt->beamformed, pPhyStaRpt->gnt_bt, pPhyStaRpt->hw_antsw_occu);\n\t\tDbgPrint(\"NBI: %d, pos: %d\\n\", pPhyStaRpt->nb_intf_flag, (pPhyStaRpt->intf_pos + (pPhyStaRpt->intf_pos_msb<<8)));\n\t\tDbgPrint(\"rsvd_0 = %d, rsvd_1 = %d, rsvd_2 = %d, rsvd_3 = %d, rsvd_4 = %d, rsvd_5 = %d\\n\", pPhyStaRpt->rsvd_0, pPhyStaRpt->rsvd_1, pPhyStaRpt->rsvd_2, pPhyStaRpt->rsvd_3, pPhyStaRpt->rsvd_4, pPhyStaRpt->rsvd_5);\n\t}\n\tDbgPrint(\"phydm_GetRxPhyStatusType1   pPktinfo->bPacketMatchBSSID = %d\\n\", pPktinfo->bPacketMatchBSSID);\n\tDbgPrint(\"pPktinfo->DataRate = 0x%x\\n\", pPktinfo->DataRate);\n*/\n}\n\nVOID\nphydm_GetRxPhyStatusType2(\n\tIN\t\tPDM_ODM_T\t\t\t\t\t\tpDM_Odm,\n\tIN\t\tpu1Byte\t\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\t\tpPktinfo,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\t\tpPhyInfo\n)\n{\n\tPPHY_STATUS_RPT_JAGUAR2_TYPE2\tpPhyStaRpt = (PPHY_STATUS_RPT_JAGUAR2_TYPE2)pPhyStatus;\n\ts1Byte\t\t\t\t\t\t\trx_pwr_db = -120;\n\tu1Byte\t\t\t\t\t\t\ti, rxsc, bw, RxCount = 0;\n\n\t/* Update OFDM packet counter */\n\tpDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++;\n\n\t/* Update per-path information */\n\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) {\n\t\tif (pDM_Odm->RXAntStatus & BIT(i)) {\n\t\t\ts1Byte\trx_path_pwr_db;\n\n\t\t\t/* RX path counter */\n\t\t\tRxCount++;\n\n\t\t\t/* Update per-path information (RSSI_dB RSSI_percentage EVM SNR CFO SQ) */\n\t\t\trx_path_pwr_db = pPhyStaRpt->pwdb[i] - 110;\t\t\t\t\t/* per-path pwdb in dB domain */\n\t\t\tphydm_SetPerPathPhyInfo(i, rx_path_pwr_db, 0, 0, 0, pPhyInfo);\n\n\t\t\t/* search maximum pwdb */\n\t\t\tif (rx_path_pwr_db > rx_pwr_db)\n\t\t\t\trx_pwr_db = rx_path_pwr_db;\n\t\t}\n\t}\n\n\t/* mapping RX counter from 1~4 to 0~3 */\n\tif (RxCount > 0)\n\t\tpPhyInfo->RxCount = RxCount - 1;\n\t\n\t/* Check RX sub-channel */\n\tif ((pPktinfo->DataRate > ODM_RATE11M) && (pPktinfo->DataRate < ODM_RATEMCS0))\n\t\trxsc = pPhyStaRpt->l_rxsc;\n\telse\n\t\trxsc = pPhyStaRpt->ht_rxsc;\n\n\t/* Check RX bandwidth */\n\t/* the BW information of sc=0 is useless, because there is no information of RF mode*/\n\tif ((rxsc >= 1) && (rxsc <= 8))\n\t\tbw = ODM_BW20M;\n\telse if ((rxsc >= 9) && (rxsc <= 12))\n\t\tbw = ODM_BW40M;\n\telse if (rxsc >= 13)\n\t\tbw = ODM_BW80M;\n\telse\n\t\tbw = ODM_BW20M;\n\n\t/* Update packet information */\n\tphydm_SetCommonPhyInfo(rx_pwr_db, pPhyStaRpt->channel, (BOOLEAN)pPhyStaRpt->beamformed,\n\t\tFALSE, bw, 0, rxsc, pPhyInfo);\n\n/*\n\t//if (pPktinfo->bPacketMatchBSSID)\n\t{\n\t\tDbgPrint(\"channel = %d, band = %d, l_rxsc = %d, ht_rxsc = %d\\n\", pPhyStaRpt->channel, pPhyStaRpt->band, pPhyStaRpt->l_rxsc, pPhyStaRpt->ht_rxsc);\n\t\tDbgPrint(\"pwdb A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->pwdb[0], pPhyStaRpt->pwdb[1], pPhyStaRpt->pwdb[2], pPhyStaRpt->pwdb[3]);\n\t\tDbgPrint(\"Agc table A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->agc_table_a, pPhyStaRpt->agc_table_b, pPhyStaRpt->agc_table_c, pPhyStaRpt->agc_table_d);\n\t\tDbgPrint(\"Gain A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->gain_a, pPhyStaRpt->gain_b, pPhyStaRpt->gain_c, pPhyStaRpt->gain_d);\n\t\tDbgPrint(\"TRSW A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->trsw_a, pPhyStaRpt->trsw_b, pPhyStaRpt->trsw_c, pPhyStaRpt->trsw_d);\n\t\tDbgPrint(\"AAGC step A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->aagc_step_a, pPhyStaRpt->aagc_step_b, pPhyStaRpt->aagc_step_c, pPhyStaRpt->aagc_step_d);\n\t\tDbgPrint(\"HT AAGC gain A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->ht_aagc_gain[0], pPhyStaRpt->ht_aagc_gain[1], pPhyStaRpt->ht_aagc_gain[2], pPhyStaRpt->ht_aagc_gain[3]);\n\t\tDbgPrint(\"DAGC gain A: 0x%x, B: 0x%x, C: 0x%x, D: 0x%x\\n\", pPhyStaRpt->dagc_gain[0], pPhyStaRpt->dagc_gain[1], pPhyStaRpt->dagc_gain[2], pPhyStaRpt->dagc_gain[3]);\n\t\tDbgPrint(\"ldpc: %d, stbc: %d, bf: %d, gnt_bt: %d, antsw: %d\\n\", pPhyStaRpt->ldpc, pPhyStaRpt->stbc, pPhyStaRpt->beamformed, pPhyStaRpt->gnt_bt, pPhyStaRpt->hw_antsw_occu);\n\t\tDbgPrint(\"counter: %d, syn_count: %d\\n\", pPhyStaRpt->counter, pPhyStaRpt->syn_count);\n\t\tDbgPrint(\"cnt_cca2agc_rdy: %d, cnt_pw2cca: %d, shift_l_map\\n\", pPhyStaRpt->cnt_cca2agc_rdy, pPhyStaRpt->cnt_pw2cca, pPhyStaRpt->shift_l_map);\n\t\tDbgPrint(\"rsvd_0 = %d, rsvd_1 = %d, rsvd_2 = %d, rsvd_3 = %d, rsvd_4 = %d, rsvd_5 = %d\\n\", pPhyStaRpt->rsvd_0, pPhyStaRpt->rsvd_1, pPhyStaRpt->rsvd_2, pPhyStaRpt->rsvd_3, pPhyStaRpt->rsvd_4);\n\t\tDbgPrint(\"rsvd_5 = %d, rsvd_6 = %d, rsvd_6 = %d\\n\", pPhyStaRpt->rsvd_5, pPhyStaRpt->rsvd_6, pPhyStaRpt->rsvd_7);\n\t}\n*/\n}\n\nVOID\nphydm_GetRxPhyStatusType5(\n\tIN\t\tpu1Byte\t\t\t\tpPhyStatus\n)\n{\n/*\n\tDbgPrint(\"DW0: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 3), *(pPhyStatus + 2), *(pPhyStatus + 1), *(pPhyStatus + 0));\n\tDbgPrint(\"DW1: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 7), *(pPhyStatus + 6), *(pPhyStatus + 5), *(pPhyStatus + 4));\n\tDbgPrint(\"DW2: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 11), *(pPhyStatus + 10), *(pPhyStatus + 9), *(pPhyStatus + 8));\n\tDbgPrint(\"DW3: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 15), *(pPhyStatus + 14), *(pPhyStatus + 13), *(pPhyStatus + 12));\n\tDbgPrint(\"DW4: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 19), *(pPhyStatus + 18), *(pPhyStatus + 17), *(pPhyStatus + 16));\n\tDbgPrint(\"DW5: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 23), *(pPhyStatus + 22), *(pPhyStatus + 21), *(pPhyStatus + 20));\n\tDbgPrint(\"DW6: 0x%02x%02x%02x%02x\\n\", *(pPhyStatus + 27), *(pPhyStatus + 26), *(pPhyStatus + 25), *(pPhyStatus + 24));\n*/\n}\n\nVOID\nphydm_Process_RSSIForDM_Jaguar2(\t\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t)\n{\n\tu4Byte\t\t\t\tUndecoratedSmoothedPWDB, RSSI_Ave;\n\tu1Byte\t\t\t\ti;\n\tPSTA_INFO_T\t\t\tpEntry;\n\n\tif (pPktinfo->StationID >= ODM_ASSOCIATE_ENTRY_NUM)\n\t\treturn;\n\n\tpEntry = pDM_Odm->pODM_StaInfo[pPktinfo->StationID];\t\t\t\t\t\t\t\n\n\tif (!IS_STA_VALID(pEntry))\n\t\treturn;\n\n\tif ((!pPktinfo->bPacketMatchBSSID))/*data frame only*/\n\t\treturn;\n\n\tif (pPktinfo->bPacketBeacon)\n\t\tpDM_Odm->PhyDbgInfo.NumQryBeaconPkt++;\n\t\n\tif (pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon) {\n\t\tu4Byte RSSI_linear = 0;\n\n\t\tUndecoratedSmoothedPWDB = (u4Byte)pEntry->rssi_stat.UndecoratedSmoothedPWDB;\n\t\tpDM_Odm->RSSI_A = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_A];\n\t\tpDM_Odm->RSSI_B = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_B];\n\t\tpDM_Odm->RSSI_C = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_C];\n\t\tpDM_Odm->RSSI_D = pPhyInfo->RxMIMOSignalStrength[ODM_RF_PATH_D];\n\n\t\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX_JAGUAR; i++) {\n\t\t\tif (pPhyInfo->RxMIMOSignalStrength[i] != 0)\n\t\t\t\tRSSI_linear += odm_ConvertTo_linear(pPhyInfo->RxMIMOSignalStrength[i]);\n\t\t}\n\n\t\tswitch (pPhyInfo->RxCount + 1) {\n\t\tcase 2:\n\t\t\tRSSI_linear = (RSSI_linear >> 1);\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tRSSI_linear = ((RSSI_linear) + (RSSI_linear << 1) + (RSSI_linear << 3)) >> 5;\t/* RSSI_linear/3 ~ RSSI_linear*11/32 */\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tRSSI_linear = (RSSI_linear >> 2);\n\t\t\tbreak;\n\t\t}\n\t\tRSSI_Ave = odm_ConvertTo_dB(RSSI_linear);\n\n\t\tif (UndecoratedSmoothedPWDB <= 0)\n\t\t\tUndecoratedSmoothedPWDB = pPhyInfo->RxPWDBAll;\n\t\telse\n\t\t\tUndecoratedSmoothedPWDB = (RSSI_Ave + ((UndecoratedSmoothedPWDB<<4) - UndecoratedSmoothedPWDB))>>4;\n\n\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB == -1)\n\t\t\tphydm_ra_rssi_rpt_wk(pDM_Odm);\n\t\t#endif\n\n\t\tpEntry->rssi_stat.UndecoratedSmoothedPWDB = (s4Byte)UndecoratedSmoothedPWDB;\n\t}\n}\n\nVOID\nphydm_RxPhyStatusJaguarSeries2(\n\tIN\t\tPDM_ODM_T\t\t\t\t\tpPhydm,\n\tIN\t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo\n)\n{\n\tu1Byte\t\tphy_status_type = (*pPhyStatus & 0xf);\n\n\t/*DbgPrint(\"phydm_RxPhyStatusJaguarSeries2================> (page: %d)\\n\", phy_status_type);*/\n\t\n\t/* Memory reset */\n\tphydm_ResetPhyInfo(pPhydm, pPhyInfo);\n\n\t/* Phy status parsing */\n\tswitch (phy_status_type) {\n\tcase 0:\n\t{\n\t\tphydm_GetRxPhyStatusType0(pPhydm, pPhyStatus, pPktinfo, pPhyInfo);\n\t\tbreak;\n\t}\n\tcase 1:\n\t{\n\t\tphydm_GetRxPhyStatusType1(pPhydm, pPhyStatus, pPktinfo, pPhyInfo);\n\t\tbreak;\n\t}\n\tcase 2:\n\t{\n\t\tphydm_GetRxPhyStatusType2(pPhydm, pPhyStatus, pPktinfo, pPhyInfo);\n\t\tbreak;\n\t}\n\tcase 5:\n\t{\n\t\tphydm_GetRxPhyStatusType5(pPhyStatus);\n\t\treturn;\n\t}\n\tdefault:\n\t\treturn;\n\t}\n\n\t/* Update signal strength to UI, and pPhyInfo->RxPWDBAll is the maximum RSSI of all path */\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tpPhyInfo->SignalStrength = SignalScaleProc(pPhydm->Adapter, pPhyInfo->RxPWDBAll, FALSE, FALSE);\n#else\n\tpPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pPhydm, pPhyInfo->RxPWDBAll));\n#endif\n\n\t/* Calculate average RSSI and smoothed RSSI */\n\tphydm_Process_RSSIForDM_Jaguar2(pPhydm, pPhyInfo, pPktinfo);\n\n}\n/*==============================================*/\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_hwconfig.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__HALHWOUTSRC_H__\n#define __HALHWOUTSRC_H__\n\n\n/*--------------------------Define -------------------------------------------*/ \n\n#define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \\\n                                                                              sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))\n#define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \\\n                                                                              sizeof(Array_TC_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))\n\n#define AGC_DIFF_CONFIG(ic, band) do {\\\n                                            if (pDM_Odm->bIsMPChip)\\\n                                    \t\t    AGC_DIFF_CONFIG_MP(ic,band);\\\n                                            else\\\n                                                AGC_DIFF_CONFIG_TC(ic,band);\\\n                                    } while(0)\n\n\n//============================================================\n// structure and define\n//============================================================\n\n__PACK typedef struct _Phy_Rx_AGC_Info\n{\n\t#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\t\n\t\tu1Byte\tgain:7,trsw:1;\t\t\t\n\t#else\t\t\t\n\t\tu1Byte\ttrsw:1,gain:7;\n\t#endif\n} __WLAN_ATTRIB_PACK__ PHY_RX_AGC_INFO_T, *pPHY_RX_AGC_INFO_T;\n\n__PACK typedef struct _Phy_Status_Rpt_8192cd {\n\tPHY_RX_AGC_INFO_T path_agc[2];\n\tu1Byte\tch_corr[2];\n\tu1Byte\tcck_sig_qual_ofdm_pwdb_all;\n\tu1Byte\tcck_agc_rpt_ofdm_cfosho_a;\n\tu1Byte\tcck_rpt_b_ofdm_cfosho_b;\n\tu1Byte\trsvd_1;/*ch_corr_msb;*/\n\tu1Byte\tnoise_power_db_msb;\n\ts1Byte\tpath_cfotail[2];\n\tu1Byte\tpcts_mask[2];\n\ts1Byte\tstream_rxevm[2];\n\tu1Byte\tpath_rxsnr[2];\n\tu1Byte\tnoise_power_db_lsb;\n\tu1Byte\trsvd_2[3];\n\tu1Byte\tstream_csi[2];\n\tu1Byte\tstream_target_csi[2];\n\ts1Byte\tsig_evm;\n\tu1Byte\trsvd_3;\n\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\tantsel_rx_keep_2: 1;\t/*ex_intf_flg:1;*/\n\tu1Byte\tsgi_en: 1;\n\tu1Byte\trxsc: 2;\n\tu1Byte\tidle_long: 1;\n\tu1Byte\tr_ant_train_en: 1;\n\tu1Byte\tant_sel_b: 1;\n\tu1Byte\tant_sel: 1;\n#else\t/*_BIG_ENDIAN_\t*/\n\tu1Byte\tant_sel: 1;\n\tu1Byte\tant_sel_b: 1;\n\tu1Byte\tr_ant_train_en: 1;\n\tu1Byte\tidle_long: 1;\n\tu1Byte\trxsc: 2;\n\tu1Byte\tsgi_en: 1;\n\tu1Byte\tantsel_rx_keep_2: 1;/*ex_intf_flg:1;*/\n#endif\n} __WLAN_ATTRIB_PACK__ PHY_STATUS_RPT_8192CD_T, *PPHY_STATUS_RPT_8192CD_T;\n\n\ntypedef struct _Phy_Status_Rpt_8812 {\n/*\tDWORD 0*/\n\tu1Byte\t\t\tgain_trsw[2];\t\t\t\t\t\t\t/*path-A and path-B {TRSW, gain[6:0] }*/\n\tu1Byte\t\t\tchl_num_LSB;\t\t\t\t\t\t\t/*channel number[7:0]*/\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\t\tchl_num_MSB: 2;\t\t\t\t\t\t\t/*channel number[9:8]*/\n\tu1Byte\t\t\tsub_chnl: 4;\t\t\t\t\t\t\t\t/*sub-channel location[3:0]*/\n\tu1Byte\t\t\tr_RFMOD: 2;\t\t\t\t\t\t\t\t/*RF mode[1:0]*/\n#else\t/*_BIG_ENDIAN_\t*/\n\tu1Byte\t\t\tr_RFMOD: 2;\n\tu1Byte\t\t\tsub_chnl: 4;\n\tu1Byte\t\t\tchl_num_MSB: 2;\n#endif\n\n/*\tDWORD 1*/\n\tu1Byte\t\t\tpwdb_all;\t\t\t\t\t\t\t\t/*CCK signal quality / OFDM pwdb all*/\n\ts1Byte\t\t\tcfosho[2];\t\t/*DW1 byte 1 DW1 byte2\tCCK AGC report and CCK_BB_Power / OFDM Path-A and Path-B short CFO*/\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\t/*this should be checked again because the definition of 8812 and 8814 is different*/\n/*\tu1Byte\t\t\tr_cck_rx_enable_pathc:2;\t\t\t\t\tcck rx enable pathc[1:0]*/\n/*\tu1Byte\t\t\tcck_rx_path:4;\t\t\t\t\t\t\tcck rx path[3:0]*/\n\tu1Byte\t\t\tresvd_0: 6;\n\tu1Byte\t\t\tbt_RF_ch_MSB: 2;\t\t\t\t\t\t/*8812A:2'b0\t\t\t8814A: bt rf channel keep[7:6]*/\n#else\t/*_BIG_ENDIAN_*/\n\tu1Byte\t\t\tbt_RF_ch_MSB: 2;\n\tu1Byte\t\t\tresvd_0: 6;\n#endif\n\n/*\tDWORD 2*/\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\t\tant_div_sw_a: 1;\t\t\t\t\t\t\t/*8812A: ant_div_sw_a    8814A: 1'b0*/\n\tu1Byte\t\t\tant_div_sw_b: 1;\t\t\t\t\t\t\t/*8812A: ant_div_sw_b    8814A: 1'b0*/\n\tu1Byte\t\t\tbt_RF_ch_LSB: 6;\t\t\t\t\t\t/*8812A: 6'b0                   8814A: bt rf channel keep[5:0]*/\n#else\t/*_BIG_ENDIAN_\t*/\n\tu1Byte\t\t\tbt_RF_ch_LSB: 6;\n\tu1Byte\t\t\tant_div_sw_b: 1;\n\tu1Byte\t\t\tant_div_sw_a: 1;\n#endif\n\ts1Byte\t\t\tcfotail[2];\t\t   /*DW2 byte 1 DW2 byte 2\tpath-A and path-B CFO tail*/\n\tu1Byte\t\t\tPCTS_MSK_RPT_0;\t\t\t\t\t\t/*PCTS mask report[7:0]*/\n\tu1Byte\t\t\tPCTS_MSK_RPT_1;\t\t\t\t\t\t/*PCTS mask report[15:8]*/\n\n/*\tDWORD 3*/\n\ts1Byte\t\t\trxevm[2];\t         /*DW3 byte 1 DW3 byte 2\tstream 1 and stream 2 RX EVM*/\n\ts1Byte\t\t\trxsnr[2];\t         /*DW3 byte 3 DW4 byte 0\tpath-A and path-B RX SNR*/\n\n/*\tDWORD 4*/\n\tu1Byte\t\t\tPCTS_MSK_RPT_2;\t\t\t\t\t\t/*PCTS mask report[23:16]*/\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\t\tPCTS_MSK_RPT_3: 6;\t\t\t\t\t\t/*PCTS mask report[29:24]*/\n\tu1Byte\t\t\tpcts_rpt_valid: 1;\t\t\t\t\t\t\t/*pcts_rpt_valid*/\n\tu1Byte\t\t\tresvd_1: 1;\t\t\t\t\t\t\t\t/*1'b0*/\n#else\t/*_BIG_ENDIAN_*/\n\tu1Byte\t\t\tresvd_1: 1;\n\tu1Byte\t\t\tpcts_rpt_valid: 1;\n\tu1Byte\t\t\tPCTS_MSK_RPT_3: 6;\n#endif\n\ts1Byte\t\t\trxevm_cd[2];\t   /*DW 4 byte 3 DW5 byte 0  8812A: 16'b0\t8814A: stream 3 and stream 4 RX EVM*/\n\n/*\tDWORD 5*/\n\tu1Byte\t\t\tcsi_current[2];\t   /*DW5 byte 1 DW5 byte 2\t8812A: stream 1 and 2 CSI\t8814A:  path-C and path-D RX SNR*/\n\tu1Byte\t\t\tgain_trsw_cd[2];\t   /*DW5 byte 3 DW6 byte 0\tpath-C and path-D {TRSW, gain[6:0] }*/\n\n/*\tDWORD 6*/\n\ts1Byte\t\t\tsigevm;\t\t\t\t\t\t\t\t\t/*signal field EVM*/\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\t\tantidx_antc: 3;\t\t\t\t\t\t\t/*8812A: 3'b0\t\t8814A: antidx_antc[2:0]*/\n\tu1Byte\t\t\tantidx_antd: 3;\t\t\t\t\t\t\t/*8812A: 3'b0\t\t8814A: antidx_antd[2:0]*/\n\tu1Byte\t\t\tdpdt_ctrl_keep: 1;\t\t\t\t\t\t/*8812A: 1'b0\t\t8814A: dpdt_ctrl_keep*/\n\tu1Byte\t\t\tGNT_BT_keep: 1;\t\t\t\t\t\t\t/*8812A: 1'b0\t\t8814A: GNT_BT_keep*/\n#else\t/*_BIG_ENDIAN_*/\n\tu1Byte\t\t\tGNT_BT_keep: 1;\n\tu1Byte\t\t\tdpdt_ctrl_keep: 1;\n\tu1Byte\t\t\tantidx_antd: 3;\n\tu1Byte\t\t\tantidx_antc: 3;\n#endif\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\t\tantidx_anta: 3;\t\t\t\t\t\t\t/*antidx_anta[2:0]*/\n\tu1Byte\t\t\tantidx_antb: 3;\t\t\t\t\t\t\t/*antidx_antb[2:0]*/\n\tu1Byte\t\t\thw_antsw_occur: 2;\t\t\t\t\t\t\t\t/*1'b0*/\n#else\t/*_BIG_ENDIAN_*/\n\tu1Byte\t\t\thw_antsw_occur: 2;\n\tu1Byte\t\t\tantidx_antb: 3;\n\tu1Byte\t\t\tantidx_anta: 3;\n#endif\n} PHY_STATUS_RPT_8812_T, *PPHY_STATUS_RPT_8812_T;\n\nVOID\nodm_Init_RSSIForDM(\n\tIN OUT\tPDM_ODM_T\tpDM_Odm\n\t);\n\nVOID\nODM_PhyStatusQuery(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\t\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo\n\t);\n\nVOID\nODM_MacStatusQuery(\n\tIN OUT\tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN \t\tpu1Byte\t\t\t\t\t\tpMacStatus,\n\tIN\t\tu1Byte\t\t\t\t\t\tMacID,\t\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketMatchBSSID,\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketToSelf,\n\tIN\t\tBOOLEAN\t\t\t\t\t\tbPacketBeacon\n\t);\n\nHAL_STATUS\nODM_ConfigRFWithTxPwrTrackHeaderFile(\n\tIN \tPDM_ODM_T\t        \tpDM_Odm\n    );\n    \nHAL_STATUS\nODM_ConfigRFWithHeaderFile(\n\tIN \tPDM_ODM_T\t        \tpDM_Odm,\n\tIN \tODM_RF_Config_Type \t\tConfigType,\n\tIN \tODM_RF_RADIO_PATH_E \teRFPath\n\t);\n\nHAL_STATUS\nODM_ConfigBBWithHeaderFile(\n\tIN  \tPDM_ODM_T\t                pDM_Odm,\n\tIN\tODM_BB_Config_Type\t\tConfigType\n    );\n\nHAL_STATUS\nODM_ConfigMACWithHeaderFile(\n\tIN  \tPDM_ODM_T\tpDM_Odm\n    );\n\nHAL_STATUS\nODM_ConfigFWWithHeaderFile(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN \tODM_FW_Config_Type \tConfigType,\n\tOUT u1Byte\t\t\t\t*pFirmware,\n\tOUT u4Byte\t\t\t\t*pSize\n\t);\n\nu4Byte \nODM_GetHWImgVersion(\n\tIN\tPDM_ODM_T\tpDM_Odm\n\t);\n\ns4Byte\nodm_SignalScaleMapping(\t\n\tIN OUT PDM_ODM_T pDM_Odm,\n\tIN\ts4Byte CurrSig \n\t);\n\n#if (RTL8822B_SUPPORT == 1)\n/*For 8822B only!! need to move to FW finally */\n/*==============================================*/\nVOID\nphydm_RxPhyStatusJaguarSeries2(\n\tIN\t\tPDM_ODM_T\t\t\t\t\tpPhydm,\n\tIN\t\tpu1Byte\t\t\t\t\t\tpPhyStatus,\n\tIN\t\tPODM_PACKET_INFO_T\t\t\tpPktinfo,\n\tOUT\t\tPODM_PHY_INFO_T\t\t\tpPhyInfo\n);\n\ntypedef struct _Phy_Status_Rpt_Jaguar2_Type0 {\n\t/* DW0 */\n\tu1Byte\t\tpage_num;\n\tu1Byte\t\tpwdb;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tgain: 6;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\ttrsw: 1;\n#else\n\tu1Byte\t\ttrsw: 1;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\tgain: 6;\n#endif\n\tu1Byte\t\trsvd_1;\n\n\t/* DW1 */\n\tu1Byte\t\trsvd_2;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\trxsc: 4;\n\tu1Byte\t\tagc_table: 4;\n#else\n\tu1Byte\t\tagc_table: 4;\n\tu1Byte\t\trxsc: 4;\n#endif\n\tu1Byte\t\tchannel;\n\tu1Byte\t\tband;\n\n\t/* DW2 */\n\tu2Byte\t\tlength;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tantidx_a: 3;\n\tu1Byte\t\tantidx_b: 3;\n\tu1Byte\t\trsvd_3: 2;\n\tu1Byte\t\tantidx_c: 3;\n\tu1Byte\t\tantidx_d: 3;\n\tu1Byte\t\trsvd_4:2;\n#else\n\tu1Byte\t\trsvd_3: 2;\n\tu1Byte\t\tantidx_b: 3;\n\tu1Byte\t\tantidx_a: 3;\n\tu1Byte\t\trsvd_4:2;\n\tu1Byte\t\tantidx_d: 3;\n\tu1Byte\t\tantidx_c: 3;\n#endif\n\n\t/* DW3 */\n\tu1Byte\t\tsignal_quality;\n\tu1Byte\t\tagc_rpt;\n\tu1Byte\t\tbb_power;\n\tu1Byte\t\trsvd_5;\n\n\t/* DW4 */\n\tu4Byte\t\trsvd_6;\n\n\t/* DW5 */\n\tu4Byte\t\trsvd_7;\n\n\t/* DW6 */\n\tu4Byte\t\trsvd_8;\n} PHY_STATUS_RPT_JAGUAR2_TYPE0, *PPHY_STATUS_RPT_JAGUAR2_TYPE0;\n\ntypedef struct _Phy_Status_Rpt_Jaguar2_Type1 {\n\t/* DW0 and DW1 */\n\tu1Byte\t\tpage_num;\n\tu1Byte\t\tpwdb[4];\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tl_rxsc: 4;\n\tu1Byte\t\tht_rxsc: 4;\n#else\n\tu1Byte\t\tht_rxsc: 4;\n\tu1Byte\t\tl_rxsc: 4;\n#endif\n\tu1Byte\t\tchannel;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tband: 2;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\thw_antsw_occu: 1;\n\tu1Byte\t\tgnt_bt: 1;\n\tu1Byte\t\tldpc: 1;\n\tu1Byte\t\tstbc: 1;\n\tu1Byte\t\tbeamformed: 1;\n#else\n\tu1Byte\t\tbeamformed: 1;\n\tu1Byte\t\tstbc: 1;\n\tu1Byte\t\tldpc: 1;\n\tu1Byte\t\tgnt_bt: 1;\n\tu1Byte\t\thw_antsw_occu: 1;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\tband: 2;\n#endif\n\n\t/* DW2 */\n\tu2Byte\t\tlsig_length;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tantidx_a: 3;\n\tu1Byte\t\tantidx_b: 3;\n\tu1Byte\t\trsvd_1: 2;\n\tu1Byte\t\tantidx_c: 3;\n\tu1Byte\t\tantidx_d: 3;\n\tu1Byte\t\trsvd_2: 2;\n#else\n\tu1Byte\t\trsvd_1: 2;\n\tu1Byte\t\tantidx_b: 3;\n\tu1Byte\t\tantidx_a: 3;\n\tu1Byte\t\trsvd_2: 2;\n\tu1Byte\t\tantidx_d: 3;\n\tu1Byte\t\tantidx_c: 3;\n#endif\n\n\t/* DW3 */\n\tu1Byte\t\tpaid;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tpaid_msb: 1;\n\tu1Byte\t\tgid: 6;\n\tu1Byte\t\trsvd_3: 1;\n#else\n\tu1Byte\t\trsvd_3: 1;\n\tu1Byte\t\tgid: 6;\n\tu1Byte\t\tpaid_msb: 1;\n#endif\n\tu1Byte\t\tintf_pos;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tintf_pos_msb: 1;\n\tu1Byte\t\trsvd_4: 2;\n\tu1Byte\t\tnb_intf_flag: 1;\n\tu1Byte\t\trf_mode: 2;\n\tu1Byte\t\trsvd_5: 2;\n#else\n\tu1Byte\t\trsvd_5: 2;\n\tu1Byte\t\trf_mode: 2;\n\tu1Byte\t\tnb_intf_flag: 1;\n\tu1Byte\t\trsvd_4: 2;\n\tu1Byte\t\tintf_pos_msb: 1;\n#endif\n\n\t/* DW4 */\n\ts1Byte\t\trxevm[4];\t\t\t/* s(8,1) */\n\n\t/* DW5 */\n\ts1Byte\t\tcfo_tail[4];\t\t\t/* s(8,7) */\n\n\t/* DW6 */\n\ts1Byte\t\trxsnr[4];\t\t\t/* s(8,1) */\n} PHY_STATUS_RPT_JAGUAR2_TYPE1, *PPHY_STATUS_RPT_JAGUAR2_TYPE1;\n\ntypedef struct _Phy_Status_Rpt_Jaguar2_Type2 {\n\t/* DW0 ane DW1 */\n\tu1Byte\t\tpage_num;\n\tu1Byte\t\tpwdb[4];\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\t\n\tu1Byte\t\tl_rxsc: 4;\n\tu1Byte\t\tht_rxsc: 4;\n#else\n\tu1Byte\t\tht_rxsc: 4;\n\tu1Byte\t\tl_rxsc: 4;\n#endif\n\tu1Byte\t\tchannel;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tband: 2;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\thw_antsw_occu: 1;\n\tu1Byte\t\tgnt_bt: 1;\n\tu1Byte\t\tldpc: 1;\n\tu1Byte\t\tstbc: 1;\n\tu1Byte\t\tbeamformed: 1;\n#else\n\tu1Byte\t\tbeamformed: 1;\n\tu1Byte\t\tstbc: 1;\n\tu1Byte\t\tldpc: 1;\n\tu1Byte\t\tgnt_bt: 1;\n\tu1Byte\t\thw_antsw_occu: 1;\n\tu1Byte\t\trsvd_0: 1;\n\tu1Byte\t\tband: 2;\n#endif\n\n\t/* DW2 */\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tshift_l_map: 6;\n\tu1Byte\t\trsvd_1: 2;\n#else\n\tu1Byte\t\trsvd_1: 2;\n\tu1Byte\t\tshift_l_map: 6;\n#endif\n\tu1Byte\t\tcnt_pw2cca;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tagc_table_a: 4;\n\tu1Byte\t\tagc_table_b: 4;\n\tu1Byte\t\tagc_table_c: 4;\n\tu1Byte\t\tagc_table_d: 4;\n#else\n\tu1Byte\t\tagc_table_b: 4;\n\tu1Byte\t\tagc_table_a: 4;\n\tu1Byte\t\tagc_table_d: 4;\n\tu1Byte\t\tagc_table_c: 4;\n#endif\n\n\t/* DW3 ~ DW6*/\n\tu1Byte\t\tcnt_cca2agc_rdy;\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tgain_a: 6;\n\tu1Byte\t\trsvd_2: 1;\n\tu1Byte\t\ttrsw_a: 1;\n\tu1Byte\t\tgain_b: 6;\n\tu1Byte\t\trsvd_3: 1;\n\tu1Byte\t\ttrsw_b: 1;\n\tu1Byte\t\tgain_c: 6;\n\tu1Byte\t\trsvd_4: 1;\n\tu1Byte\t\ttrsw_c: 1;\n\tu1Byte\t\tgain_d: 6;\n\tu1Byte\t\trsvd_5: 1;\n\tu1Byte\t\ttrsw_d: 1;\n\tu1Byte\t\taagc_step_a: 2;\n\tu1Byte\t\taagc_step_b: 2;\n\tu1Byte\t\taagc_step_c: 2;\n\tu1Byte\t\taagc_step_d: 2;\n#else\n\tu1Byte\t\ttrsw_a: 1;\n\tu1Byte\t\trsvd_2: 1;\n\tu1Byte\t\tgain_a: 6;\n\tu1Byte\t\ttrsw_b: 1;\n\tu1Byte\t\trsvd_3: 1;\n\tu1Byte\t\tgain_b: 6;\n\tu1Byte\t\ttrsw_c: 1;\n\tu1Byte\t\trsvd_4: 1;\n\tu1Byte\t\tgain_c: 6;\n\tu1Byte\t\ttrsw_d: 1;\n\tu1Byte\t\trsvd_5: 1;\n\tu1Byte\t\tgain_d: 6;\n\tu1Byte\t\taagc_step_d: 2;\n\tu1Byte\t\taagc_step_c: 2;\n\tu1Byte\t\taagc_step_b: 2;\n\tu1Byte\t\taagc_step_a: 2;\n#endif\n\tu1Byte\t\tht_aagc_gain[4];\n\tu1Byte\t\tdagc_gain[4];\n#if (ODM_ENDIAN_TYPE == ODM_ENDIAN_LITTLE)\n\tu1Byte\t\tcounter: 6;\n\tu1Byte\t\trsvd_6: 2;\n\tu1Byte\t\tsyn_count: 5;\n\tu1Byte\t\trsvd_7:3;\n#else\n\tu1Byte\t\trsvd_6: 2;\n\tu1Byte\t\tcounter: 6;\n\tu1Byte\t\trsvd_7:3;\n\tu1Byte\t\tsyn_count: 5;\n#endif\n} PHY_STATUS_RPT_JAGUAR2_TYPE2, *PPHY_STATUS_RPT_JAGUAR2_TYPE2;\n/*==============================================*/\n#endif\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_interface.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n//\n// ODM IO Relative API.\n//\n\nu1Byte\nODM_Read1Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\treturn\tRTL_R8(RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn rtw_read8(Adapter,RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn\tPlatformEFIORead1Byte(Adapter, RegAddr);\n#endif\t\n\n}\n\n\nu2Byte\nODM_Read2Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\treturn\tRTL_R16(RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn rtw_read16(Adapter,RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn\tPlatformEFIORead2Byte(Adapter, RegAddr);\n#endif\t\n\n}\n\n\nu4Byte\nODM_Read4Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\treturn\tRTL_R32(RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn rtw_read32(Adapter,RegAddr);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn\tPlatformEFIORead4Byte(Adapter, RegAddr);\n#endif\t\n\n}\n\n\nVOID\nODM_Write1Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu1Byte\t\t\tData\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\tRTL_W8(RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\trtw_write8(Adapter,RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformEFIOWrite1Byte(Adapter, RegAddr, Data);\n#endif\n\t\n}\n\n\nVOID\nODM_Write2Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu2Byte\t\t\tData\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\tRTL_W16(RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\trtw_write16(Adapter,RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformEFIOWrite2Byte(Adapter, RegAddr, Data);\n#endif\t\n\n}\n\n\nVOID\nODM_Write4Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tData\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tprtl8192cd_priv\tpriv\t= pDM_Odm->priv;\n\tRTL_W32(RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\trtw_write32(Adapter,RegAddr, Data);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformEFIOWrite4Byte(Adapter, RegAddr, Data);\n#endif\t\n\n}\n\n\nVOID\nODM_SetMACReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask,\n\tIN\tu4Byte\t\tData\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tPHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\n#endif\t\n}\n\n\nu4Byte \nODM_GetMACReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\treturn PHY_QueryMacReg(pDM_Odm->Adapter, RegAddr, BitMask);\n#endif\t\n}\n\n\nVOID\nODM_SetBBReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask,\n\tIN\tu4Byte\t\tData\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tPHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\n#endif\t\n}\n\n\nu4Byte \nODM_GetBBReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn PHY_QueryBBReg(Adapter, RegAddr, BitMask);\n#endif\t\n}\n\n\nVOID\nODM_SetRFReg(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tODM_RF_RADIO_PATH_E\teRFPath,\n\tIN\tu4Byte\t\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\t\tBitMask,\n\tIN\tu4Byte\t\t\t\tData\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tPHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);\n\tODM_delay_us(2);\n\t\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPHY_SetRFReg(pDM_Odm->Adapter, eRFPath, RegAddr, BitMask, Data);\n#endif\t\n}\n\n\nu4Byte \nODM_GetRFReg(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tODM_RF_RADIO_PATH_E\teRFPath,\n\tIN\tu4Byte\t\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\t\tBitMask\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\treturn PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);\n#endif\t\n}\n\n\n\n\n//\n// ODM Memory relative API.\n//\nVOID\nODM_AllocateMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT\tPVOID\t\t*pPtr,\n\tIN\tu4Byte\t\tlength\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t*pPtr = kmalloc(length, GFP_ATOMIC);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\n\t*pPtr = rtw_zvmalloc(length);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformAllocateMemory(Adapter, pPtr, length);\n#endif\t\n}\n\n// length could be ignored, used to detect memory leakage.\nVOID\nODM_FreeMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT\tPVOID\t\tpPtr,\n\tIN\tu4Byte\t\tlength\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tkfree(pPtr);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\t\n\trtw_vmfree(pPtr, length);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t//PADAPTER    Adapter = pDM_Odm->Adapter;\n\tPlatformFreeMemory(pPtr, length);\n#endif\t\n}\n\nVOID\nODM_MoveMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT PVOID\t\tpDest,\n\tIN  PVOID\t\tpSrc,\n\tIN  u4Byte\t\tLength\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tmemcpy(pDest, pSrc, Length);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\t\n\t_rtw_memcpy(pDest, pSrc, Length);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformMoveMemory(pDest, pSrc, Length);\n#endif\t\n}\n\nvoid ODM_Memory_Set(\n\tIN\tPDM_ODM_T\tpDM_Odm,\n\tIN\tPVOID\t\tpbuf,\n\tIN\ts1Byte\t\tvalue,\n\tIN\tu4Byte\t\tlength\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tmemset(pbuf, value, length);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\t\n\t_rtw_memset(pbuf,value, length);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformFillMemory(pbuf,length,value);\n#endif\n}\ns4Byte ODM_CompareMemory(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPVOID           pBuf1,\n\tIN\tPVOID           pBuf2,\n\tIN\tu4Byte          length\n       )\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn memcmp(pBuf1,pBuf2,length);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\t\n\treturn _rtw_memcmp(pBuf1,pBuf2,length);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\t\n\treturn PlatformCompareMemory(pBuf1,pBuf2,length);\n#endif\t\n}\n\n\n\n//\n// ODM MISC relative API.\n//\nVOID\nODM_AcquireSpinLock(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tRT_SPINLOCK_TYPE\ttype\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\trtw_odm_acquirespinlock(Adapter, type);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformAcquireSpinLock(Adapter, type);\n#endif\t\n}\nVOID\nODM_ReleaseSpinLock(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tRT_SPINLOCK_TYPE\ttype\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\trtw_odm_releasespinlock(Adapter, type);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformReleaseSpinLock(Adapter, type);\n#endif\t\n}\n\n//\n// Work item relative API. FOr MP driver only~!\n//\nVOID\nODM_InitializeWorkItem(\t\n\tIN \tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN\tPRT_WORK_ITEM\t\t\t\tpRtWorkItem,\n\tIN\tRT_WORKITEM_CALL_BACK\t\tRtWorkItemCallback,\n\tIN\tPVOID\t\t\t\t\t\tpContext,\n\tIN\tconst char*\t\t\t\t\tszID\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);\n#endif\t\n}\n\n\nVOID\nODM_StartWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformStartWorkItem(pRtWorkItem);\n#endif\t\n}\n\n\nVOID\nODM_StopWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformStopWorkItem(pRtWorkItem);\n#endif\t\n}\n\n\nVOID\nODM_FreeWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformFreeWorkItem(pRtWorkItem);\n#endif\t\n}\n\n\nVOID\nODM_ScheduleWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformScheduleWorkItem(pRtWorkItem);\n#endif\t\n}\n\n\nVOID\nODM_IsWorkItemScheduled(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformIsWorkItemScheduled(pRtWorkItem);\n#endif\t\n}\n\n\n\n//\n// ODM Timer relative API.\n//\nVOID\nODM_StallExecution(\t\n\tIN\tu4Byte\tusDelay\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\trtw_udelay_os(usDelay);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformStallExecution(usDelay);\n#endif\t\n}\n\nVOID\nODM_delay_ms(IN u4Byte\tms)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tdelay_ms(ms);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\trtw_mdelay_os(ms);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tdelay_ms(ms);\n#endif\t\t\t\n}\n\nVOID\nODM_delay_us(IN u4Byte\tus)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tdelay_us(us);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\trtw_udelay_os(us);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPlatformStallExecution(us);\n#endif\t\t\t\n}\n\nVOID\nODM_sleep_ms(IN u4Byte\tms)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\trtw_msleep_os(ms);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\t\n#endif\t\t\n}\n\nVOID\nODM_sleep_us(IN u4Byte\tus)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\trtw_usleep_os(us);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\t\n#endif\t\t\n}\n\nVOID\nODM_SetTimer(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER \t\tpTimer, \n\tIN\tu4Byte \t\t\tmsDelay\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tmod_timer(pTimer, jiffies + RTL_MILISECONDS_TO_JIFFIES(msDelay));\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t_set_timer(pTimer,msDelay ); //ms\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPlatformSetTimer(Adapter, pTimer, msDelay);\n#endif\t\n\n}\n\nVOID\nODM_InitializeTimer(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tPRT_TIMER \t\t\tpTimer, \n\tIN\tRT_TIMER_CALL_BACK\tCallBackFunc, \n\tIN\tPVOID\t\t\t\tpContext,\n\tIN\tconst char*\t\t\tszID\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tinit_timer(pTimer);\n\tpTimer->function = CallBackFunc;\n\tpTimer->data = (unsigned long)pDM_Odm;\n\tmod_timer(pTimer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10));\t\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\t_init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\tPlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);\n#endif\t\n}\n\n\nVOID\nODM_CancelTimer(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER\t\tpTimer\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tdel_timer(pTimer);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t_cancel_timer_ex(pTimer);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\tPlatformCancelTimer(Adapter, pTimer);\n#endif\n}\n\n\nVOID\nODM_ReleaseTimer(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER\t\tpTimer\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\n    // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. \n    // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.\n    if (pTimer == 0) \n    {\n        ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, (\"=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\\n\"));\n        return;\n    }\n        \n\tPlatformReleaseTimer(Adapter, pTimer);\n#endif\n}\n\nBOOLEAN\nphydm_actingDetermine(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN PHYDM_ACTING_TYPE\ttype\n\t)\n{\n\tBOOLEAN\t\tret = FALSE;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->BeamformingInfo.SourceAdapter;\n#else\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tif (type == PhyDM_ACTING_AS_AP)\n\t\tret = ACTING_AS_AP(Adapter);\n\telse if (type == PhyDM_ACTING_AS_IBSS)\n\t\tret = ACTING_AS_IBSS(Adapter);\n#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\n\tif (type == PhyDM_ACTING_AS_AP)\n\t\tret = check_fwstate(pmlmepriv, WIFI_AP_STATE);\n\telse if (type == PhyDM_ACTING_AS_IBSS)\n\t\tret = check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\n#endif\n\n\treturn ret;\n\n}\n\n\nu1Byte\nphydm_trans_h2c_id(\n\tIN\tPDM_ODM_T\tpDM_Odm,\n\tIN\tu1Byte\t\tphydm_h2c_id\n)\n{\n\tu1Byte platform_h2c_id=0xff;\n\n\t\n\tswitch(phydm_h2c_id)\n\t{\n\t\t//1 [0]\n\t\tcase ODM_H2C_RSSI_REPORT:\n\n\t\t\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\t\t\t{\n\t\t\t\t\tplatform_h2c_id = H2C_88E_RSSI_REPORT;\n\t\t\t\t}\n\t\t\t\telse if(pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\t\t\t{\n\t\t\t\t\tplatform_h2c_id =H2C_8814A_RSSI_REPORT;                            \n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tplatform_h2c_id = H2C_RSSI_REPORT;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\tplatform_h2c_id = H2C_RSSI_SETTING;\n\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\t\t#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\n\t\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B)) \n\t\t\t\t\t{\n\t\t\t\t\t\tplatform_h2c_id =H2C_88XX_RSSI_REPORT;\t\t\t\t\n\t\t\t\t\t\t/*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[H2C] H2C_88XX_RSSI_REPORT CMD_ID = (( %d ))\\n\", platform_h2c_id));*/\n\t\t\t\t\t} else\n\t\t\t\t#endif\n\t\t\t\t#if(RTL8812A_SUPPORT==1) \n\t\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t\t\t\t{\n\t\t\t\t\t\tplatform_h2c_id = H2C_8812_RSSI_REPORT;\n\t\t\t\t\t} else\n\t\t\t\t#endif\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\n\n\t\t//1 [3]\t\n\t\tcase ODM_H2C_WIFI_CALIBRATION:\n\t\t\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\t\tplatform_h2c_id =H2C_WIFI_CALIBRATION;\n\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t#if(RTL8723B_SUPPORT==1) \n\t\t\t\t\tplatform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\n\t\t\t\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\t\t\n\t\n\t\t\t\n\t\t//1 [4]\n\t\tcase ODM_H2C_IQ_CALIBRATION:\n\t\t\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\tplatform_h2c_id =H2C_IQ_CALIBRATION;\n\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t#if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\n\t\t\t\tplatform_h2c_id = H2C_8812_IQ_CALIBRATION;\n\t\t\t\t#endif\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\n\t\t\t\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\n\t\t//1 [5]\n\t\tcase ODM_H2C_RA_PARA_ADJUST:\n\n\t\t\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B))\n\t\t\t\t\tplatform_h2c_id = H2C_8814A_RA_PARA_ADJUST;\n\t\t\t\telse\n\t\t\t\t\tplatform_h2c_id = H2C_RA_PARA_ADJUST;\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t#if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\n\t\t\t\t\tplatform_h2c_id = H2C_8812_RA_PARA_ADJUST;\n\t\t\t\t#elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\n\t\t\t\t\tplatform_h2c_id = H2C_RA_PARA_ADJUST;\n\t\t\t\t#elif(RTL8192E_SUPPORT==1)\n\t\t\t\t\tplatform_h2c_id =H2C_8192E_RA_PARA_ADJUST;\n\t\t\t\t#elif(RTL8723B_SUPPORT==1) \n\t\t\t\t\tplatform_h2c_id =H2C_8723B_RA_PARA_ADJUST;\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\t\t#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1)) \n\t\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B)) {\n\t\t\t\t\t\tplatform_h2c_id =H2C_88XX_RA_PARA_ADJUST;\t\t\t\t\n\t\t\t\t\t\t/*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[H2C] H2C_88XX_RA_PARA_ADJUST CMD_ID = (( %d ))\\n\", platform_h2c_id));*/\n\t\t\t\t\t} else\n\t\t\t\t#endif\n\t\t\t\t#if(RTL8812A_SUPPORT==1) \n\t\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t\t\t\t{\n\t\t\t\t\t\tplatform_h2c_id = H2C_8812_RA_PARA_ADJUST;\n\t\t\t\t\t} else\n\t\t\t\t#endif\n\t\t\t\t\t{}\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\n\n\n\t\t//1 [6]\n\t\tcase PHYDM_H2C_DYNAMIC_TX_PATH:\n\n\t\t\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\t\t\t{\n\t\t\t\t\tplatform_h2c_id =H2C_8814A_DYNAMIC_TX_PATH;\n\t\t\t\t}\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t#if (RTL8814A_SUPPORT == 1)\n\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\t\t\t\tplatform_h2c_id = H2C_DYNAMIC_TX_PATH;\n\t\t\t\t#endif\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\t\t#if(RTL8814A_SUPPORT==1)\n\t\t\t\t\tif( pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\t\t\t\t{\n\t\t\t\t\t\tplatform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;\t\t\t\t\n\t\t\t\t\t} \n\t\t\t\t#endif\n\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\n\n\t\t/* [7]*/\n\t\tcase PHYDM_H2C_FW_TRACE_EN:\n\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))\n\t\t\t\t\tplatform_h2c_id = H2C_8814A_FW_TRACE_EN;\n\t\t\t\telse \n\t\t\t\t\tplatform_h2c_id = H2C_FW_TRACE_EN;\n\t\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\n\t\t\t\t\n\t\t\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\t\t#if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\n\t\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B))\n\t\t\t\t\t\tplatform_h2c_id  = H2C_88XX_FW_TRACE_EN;\n\t\t\t\t\telse\n\t\t\t\t#endif\n\t\t\t\t#if (RTL8812A_SUPPORT == 1) \n\t\t\t\t\tif (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\t\t\t\t\tplatform_h2c_id = H2C_8812_FW_TRACE_EN;\n\t\t\t\t\t} else\n\t\t\t\t#endif\n\t\t\t\t\t{}\n\n\t\t\t#endif\n\t\t\t\n\t\t\t\tbreak;\n\n\t\tcase PHYDM_H2C_TXBF:\n#if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))\n\t\t\tplatform_h2c_id  = 0x41;\t/*H2C_TxBF*/\n#endif\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tplatform_h2c_id=0xff;\n\t\t\tbreak;\t\n\t}\t\n\t\n\treturn platform_h2c_id;\n\t\n}\n\n//\n// ODM FW relative API.\n//\n\nVOID\nODM_FillH2CCmd(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu1Byte \t\t\tphydm_h2c_id,\n\tIN\tu4Byte \t\t\tCmdLen,\n\tIN\tpu1Byte\t\t\tpCmdBuffer\n)\n{\n\tPADAPTER \tAdapter = pDM_Odm->Adapter;\n\tu1Byte\t\tplatform_h2c_id;\n\n\tplatform_h2c_id=phydm_trans_h2c_id(pDM_Odm, phydm_h2c_id);\n\n\tif(platform_h2c_id==0xff)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[H2C] Wrong H2C CMD-ID !! platform_h2c_id==0xff ,  PHYDM_ElementID=((%d )) \\n\",phydm_h2c_id));\n\t\treturn;\n\t}\n\n\t#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\t\t\n\t\t\tif (!pDM_Odm->RaSupport88E)\n\t\t\t\tFillH2CCmd88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\t\t\n\t\telse if (pDM_Odm->SupportICType == ODM_RTL8192C)\t\t\n\t\t\tFillH2CCmd92C(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\t\t\n\t\telse if (pDM_Odm->SupportICType == ODM_RTL8814A)\t\t\n\t\t\tFillH2CCmd8814A(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\t\t\n\t\telse if (pDM_Odm->SupportICType == ODM_RTL8822B)\t\t\n#if (RTL8822B_SUPPORT == 1)\n\t\t\tFillH2CCmd8822B(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\n#endif\t\t\n\t\telse\t\t\t\t\n\t\t\tFillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\n\t\t\n\t#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\trtw_hal_fill_h2c_cmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\n\n\t#elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\t\n\t\t#if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1)) \n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A) \n\t\t\t{\n\t\t\t\tGET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);\n\t\t\t\t//FillH2CCmd88XX(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);\t\t\t\t\n\t\t\t} else\n\t\t#endif\n\t\t#if(RTL8812A_SUPPORT==1) \n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8812)\n\t\t\t{\n\t\t\t\tFillH2CCmd8812(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);\n\t\t\t} else\n\t\t#endif\n\t\t\t{}\n\t#endif\n}\n\nu1Byte\nphydm_c2H_content_parsing(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tc2hCmdId,\n\tIN\tu1Byte\t\t\tc2hCmdLen,\n\tIN\tpu1Byte\t\t\ttmpBuf\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\t#endif\n\tu1Byte\tExtend_c2hSubID = 0;\n\tu1Byte\tfind_c2h_cmd = TRUE;\n\n\tswitch (c2hCmdId) {\n\tcase PHYDM_C2H_DBG:\n\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))\n\t\t\tphydm_fw_trace_handler(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\t\n\t\tbreak;\n\n\tcase PHYDM_C2H_RA_RPT:\n\t\tphydm_c2h_ra_report_handler(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\tbreak;\n\n\tcase PHYDM_C2H_RA_PARA_RPT:\n\t\tODM_C2HRaParaReportHandler(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\tbreak;\n\t\t\n\tcase PHYDM_C2H_DYNAMIC_TX_PATH_RPT:\n\t\tif (pDM_Odm->SupportICType & (ODM_RTL8814A))\n\t\t\tphydm_c2h_dtp_handler(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\t\n\t\tbreak;\n\t\t\n\tcase PHYDM_C2H_IQK_FINISH:\n\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t\n\t\tif (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821)) {\n\t\t\t\n\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"== FW IQK Finish ==\\n\"));\n\t\t\tPlatformAcquireSpinLock(Adapter, RT_IQK_SPINLOCK);\n\t\t\tpDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;\n\t\t\tPlatformReleaseSpinLock(Adapter, RT_IQK_SPINLOCK);\n\t\t\tpDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = 0;\n\t\t\tpDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime);\n\t\t}\n\t\t\n\t\t#endif\n\t\tbreak;\n\n\tcase PHYDM_C2H_DBG_CODE:\n\t\tphydm_fw_trace_handler_code(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\tbreak;\t\n\n\tcase PHYDM_C2H_EXTEND:\n\t\tExtend_c2hSubID = tmpBuf[0];\n\t\tif (Extend_c2hSubID == PHYDM_EXTEND_C2H_DBG_PRINT)\n\t\t\tphydm_fw_trace_handler_8051(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\t\n\t\tbreak;\n\n\tdefault:\n\t\tfind_c2h_cmd = FALSE;\n\t\tbreak;\n\t}\n\n\treturn find_c2h_cmd;\n\n}\n\nu8Byte\nODM_GetCurrentTime(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn  0;\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\treturn (u8Byte)rtw_get_current_time();\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\t\n\treturn  PlatformGetCurrentTime();\n#endif\n}\n\nu8Byte\nODM_GetProgressingTime(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu8Byte\t\t\tStart_Time\n\t)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\treturn  0;\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\treturn rtw_get_passing_time_ms((u4Byte)Start_Time);\n#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\treturn   ((PlatformGetCurrentTime() - Start_Time)>>10);\n#endif\n}\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_interface.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__ODM_INTERFACE_H__\n#define __ODM_INTERFACE_H__\n\n#define INTERFACE_VERSION\t\"1.0\"\t\t/*2015.01.13  Dino*/\n\n//\n// =========== Constant/Structure/Enum/... Define\n//\n\n\n\n//\n// =========== Macro Define\n//\n\n#define _reg_all(_name)\t\t\tODM_##_name\n#define _reg_ic(_name, _ic)\t\tODM_##_name##_ic\n#define _bit_all(_name)\t\t\tBIT_##_name\n#define _bit_ic(_name, _ic)\t\tBIT_##_name##_ic\n\n// _cat: implemented by Token-Pasting Operator.\n#if 0\n#define _cat(_name, _ic_type, _func)\t\t\t\t\t\t\t\t\\\n\t( \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t_func##_all(_name)\t\t\t\t\t\t\t\t\t\t\\\n\t)\n#endif\n\n/*===================================\n\n#define ODM_REG_DIG_11N\t\t0xC50\n#define ODM_REG_DIG_11AC\t0xDDD\n\nODM_REG(DIG,_pDM_Odm)\n=====================================*/\n\n#define _reg_11N(_name)\t\t\tODM_REG_##_name##_11N \n#define _reg_11AC(_name)\t\tODM_REG_##_name##_11AC\n#define _bit_11N(_name)\t\t\tODM_BIT_##_name##_11N \n#define _bit_11AC(_name)\t\tODM_BIT_##_name##_11AC\n\n#ifdef __ECOS\n#define _rtk_cat(_name, _ic_type, _func)\t\t\\\n\t( \t\t\t\t\t\\\n\t\t((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name):\t\t\\\n\t\t_func##_11AC(_name)\t\\\n\t)\n#else\n\n#define _cat(_name, _ic_type, _func)\t\t\t\t\t\t\t\t\t\\\n\t( \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t((_ic_type) & ODM_IC_11N_SERIES)? _func##_11N(_name):\t\t\\\n\t\t_func##_11AC(_name)\t\t\t\t\t\t\t\t\t\\\n\t)\n#endif\n/* \n// only sample code\n//#define _cat(_name, _ic_type, _func)\t\t\t\t\t\t\t\t\t\\\n//\t( \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n//\t\t((_ic_type) & ODM_RTL8192C)? _func##_ic(_name, _8192C):\t\t\\\n//\t\t((_ic_type) & ODM_RTL8192D)? _func##_ic(_name, _8192D):\t\t\\\n//\t\t((_ic_type) & ODM_RTL8192S)? _func##_ic(_name, _8192S):\t\t\\\n//\t\t((_ic_type) & ODM_RTL8723A)? _func##_ic(_name, _8723A):\t\t\\\n//\t\t((_ic_type) & ODM_RTL8188E)? _func##_ic(_name, _8188E):\t\t\\\n//\t\t_func##_ic(_name, _8195)\t\t\t\t\t\t\t\t\t\\\n//\t)\n*/\n\n// _name: name of register or bit.\n// Example: \"ODM_REG(R_A_AGC_CORE1, pDM_Odm)\" \n//        gets \"ODM_R_A_AGC_CORE1\" or \"ODM_R_A_AGC_CORE1_8192C\", depends on SupportICType.\n#ifdef __ECOS\n#define ODM_REG(_name, _pDM_Odm)\t_rtk_cat(_name, _pDM_Odm->SupportICType, _reg)\n#define ODM_BIT(_name, _pDM_Odm)\t_rtk_cat(_name, _pDM_Odm->SupportICType, _bit)\n#else\n#define ODM_REG(_name, _pDM_Odm)\t_cat(_name, _pDM_Odm->SupportICType, _reg)\n#define ODM_BIT(_name, _pDM_Odm)\t_cat(_name, _pDM_Odm->SupportICType, _bit)\n#endif\ntypedef enum _PHYDM_H2C_CMD {\n\tODM_H2C_RSSI_REPORT = 0,\n\tODM_H2C_PSD_RESULT = 1,\t\n\tODM_H2C_PathDiv = 2,\n\tODM_H2C_WIFI_CALIBRATION = 3,\n\tODM_H2C_IQ_CALIBRATION = 4,\n\tODM_H2C_RA_PARA_ADJUST = 5,\n\tPHYDM_H2C_DYNAMIC_TX_PATH = 6,\n\tPHYDM_H2C_FW_TRACE_EN = 7,\n\tPHYDM_H2C_TXBF = 8,\n\tODM_MAX_H2CCMD\n} PHYDM_H2C_CMD;\n\ntypedef enum _PHYDM_C2H_EVT {\n\tPHYDM_C2H_DBG = 0,\n\tPHYDM_C2H_LB = 1,\n\tPHYDM_C2H_XBF = 2,\n\tPHYDM_C2H_TX_REPORT = 3,\n\tPHYDM_C2H_INFO = 9,\n\tPHYDM_C2H_BT_MP = 11,\n\tPHYDM_C2H_RA_RPT = 12,\n\tPHYDM_C2H_RA_PARA_RPT = 14,\n\tPHYDM_C2H_DYNAMIC_TX_PATH_RPT = 15,\n\tPHYDM_C2H_IQK_FINISH = 17, /*0x11*/\n\tPHYDM_C2H_DBG_CODE = 0xFE,\n\tPHYDM_C2H_EXTEND = 0xFF,\n} PHYDM_C2H_EVT;\n\ntypedef enum _PHYDM_EXTEND_C2H_EVT {\n\tPHYDM_EXTEND_C2H_DBG_PRINT = 0\n\n} PHYDM_EXTEND_C2H_EVT;\n\ntypedef enum _PHYDM_ACTING_TYPE {\n\tPhyDM_ACTING_AS_IBSS = 0,\n\tPhyDM_ACTING_AS_AP = 1\n} PHYDM_ACTING_TYPE;\n\n\n//\n// 2012/02/17 MH For non-MP compile pass only. Linux does not support workitem.\n// Suggest HW team to use thread instead of workitem. Windows also support the feature.\n//\n#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\ntypedef  void *PRT_WORK_ITEM ;\ntypedef  void RT_WORKITEM_HANDLE,*PRT_WORKITEM_HANDLE;\ntypedef VOID (*RT_WORKITEM_CALL_BACK)(PVOID pContext);\n\n#if 0\ntypedef struct tasklet_struct RT_WORKITEM_HANDLE, *PRT_WORKITEM_HANDLE;\n\ntypedef struct _RT_WORK_ITEM\n{\n\t\n\tRT_WORKITEM_HANDLE\t\t\tHandle;\t\t\t// Platform-dependent handle for this workitem, e.g. Ndis Workitem object.\n\tPVOID\t\t\t\t\t\tAdapter;\t\t// Pointer to Adapter object.\n\tPVOID\t\t\t\t\t\tpContext;\t\t// Parameter to passed to CallBackFunc(). \n\tRT_WORKITEM_CALL_BACK\t\tCallbackFunc;\t// Callback function of the workitem.\n\tu1Byte\t\t\t\t\t\tRefCount;\t\t// 0: driver is going to unload, 1: No such workitem scheduled, 2: one workitem is schedueled. \n\tPVOID\t\t\t\t\t\tpPlatformExt;\t// Pointer to platform-dependent extension.\t\n\tBOOLEAN\t\t\t\t\t\tbFree;\n\tchar\t\t\t\t\t\tszID[36];\t\t// An identity string of this workitem.\n}RT_WORK_ITEM, *PRT_WORK_ITEM;\n\n#endif\n\n\n#endif\n\n//\n// =========== Extern Variable ??? It should be forbidden.\n//\n\n\n//\n// =========== EXtern Function Prototype\n//\n\n\nu1Byte\nODM_Read1Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\n\nu2Byte\nODM_Read2Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\n\nu4Byte\nODM_Read4Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr\n\t);\n\nVOID\nODM_Write1Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu1Byte\t\t\tData\n\t);\n\nVOID\nODM_Write2Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu2Byte\t\t\tData\n\t);\n\nVOID\nODM_Write4Byte(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu4Byte\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\tData\n\t);\n\nVOID\nODM_SetMACReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask,\n\tIN\tu4Byte\t\tData\n\t);\n\nu4Byte \nODM_GetMACReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask\n\t);\n\nVOID\nODM_SetBBReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask,\n\tIN\tu4Byte\t\tData\n\t);\n\nu4Byte \nODM_GetBBReg(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tu4Byte\t\tRegAddr,\n\tIN\tu4Byte\t\tBitMask\n\t);\n\nVOID\nODM_SetRFReg(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tODM_RF_RADIO_PATH_E\teRFPath,\n\tIN\tu4Byte\t\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\t\tBitMask,\n\tIN\tu4Byte\t\t\t\tData\n\t);\n\nu4Byte \nODM_GetRFReg(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tODM_RF_RADIO_PATH_E\teRFPath,\n\tIN\tu4Byte\t\t\t\tRegAddr,\n\tIN\tu4Byte\t\t\t\tBitMask\n\t);\n\n\n//\n// Memory Relative Function.\n//\nVOID\nODM_AllocateMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT\tPVOID\t\t*pPtr,\n\tIN\tu4Byte\t\tlength\n\t);\nVOID\nODM_FreeMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT\tPVOID\t\tpPtr,\n\tIN\tu4Byte\t\tlength\n\t);\n\nVOID\nODM_MoveMemory(\t\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tOUT PVOID\t\tpDest,\n\tIN  PVOID\t\tpSrc,\n\tIN  u4Byte\t\tLength\n\t);\n\ns4Byte ODM_CompareMemory(\n\tIN \tPDM_ODM_T\tpDM_Odm,\n\tIN\tPVOID           pBuf1,\n      IN\tPVOID           pBuf2,\n      IN\tu4Byte          length\n       );\n\nvoid ODM_Memory_Set\n\t(IN \tPDM_ODM_T\tpDM_Odm,\n\t\tIN  PVOID\tpbuf,\n\t\tIN  s1Byte\tvalue,\n\t\tIN  u4Byte\tlength);\n\t\n//\n// ODM MISC-spin lock relative API.\n//\nVOID\nODM_AcquireSpinLock(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tRT_SPINLOCK_TYPE\ttype\n\t);\n\nVOID\nODM_ReleaseSpinLock(\t\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tRT_SPINLOCK_TYPE\ttype\n\t);\n\n\n//\n// ODM MISC-workitem relative API.\n//\nVOID\nODM_InitializeWorkItem(\t\n\tIN \tPDM_ODM_T\t\t\t\t\tpDM_Odm,\n\tIN\tPRT_WORK_ITEM\t\t\t\tpRtWorkItem,\n\tIN\tRT_WORKITEM_CALL_BACK\t\tRtWorkItemCallback,\n\tIN\tPVOID\t\t\t\t\t\tpContext,\n\tIN\tconst char*\t\t\t\t\tszID\n\t);\n\nVOID\nODM_StartWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t);\n\nVOID\nODM_StopWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t);\n\nVOID\nODM_FreeWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t);\n\nVOID\nODM_ScheduleWorkItem(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t);\n\nVOID\nODM_IsWorkItemScheduled(\t\n\tIN\tPRT_WORK_ITEM\tpRtWorkItem\n\t);\n\n//\n// ODM Timer relative API.\n//\nVOID\nODM_StallExecution(\t\n\tIN\tu4Byte\tusDelay\n\t);\n\nVOID\nODM_delay_ms(IN u4Byte\tms);\n\n\n\nVOID\nODM_delay_us(IN u4Byte\tus);\n\nVOID\nODM_sleep_ms(IN u4Byte\tms);\n\nVOID\nODM_sleep_us(IN u4Byte\tus);\n\nVOID\nODM_SetTimer(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER \t\tpTimer, \n\tIN\tu4Byte \t\t\tmsDelay\n\t);\n\nVOID\nODM_InitializeTimer(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tPRT_TIMER \t\t\tpTimer, \n\tIN\tRT_TIMER_CALL_BACK\tCallBackFunc, \n\tIN\tPVOID\t\t\t\tpContext,\n\tIN\tconst char*\t\t\tszID\n\t);\n\nVOID\nODM_CancelTimer(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nODM_ReleaseTimer(\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPRT_TIMER\t\tpTimer\n\t);\n\nBOOLEAN\nphydm_actingDetermine(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tPHYDM_ACTING_TYPE\ttype\n\t);\n\n//\n// ODM FW relative API.\n//\nVOID\nODM_FillH2CCmd(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu1Byte \t\t\tElementID,\n\tIN\tu4Byte \t\t\tCmdLen,\n\tIN\tpu1Byte\t\t\tpCmdBuffer\n);\n\nu1Byte\nphydm_c2H_content_parsing(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tc2hCmdId,\n\tIN\tu1Byte\t\t\tc2hCmdLen,\n\tIN\tpu1Byte\t\t\ttmpBuf\n);\n\nu8Byte\nODM_GetCurrentTime(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm\n\t);\nu8Byte\nODM_GetProgressingTime(\t\n\tIN \tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu8Byte\t\t\tStart_Time\n\t);\n\n#endif\t// __ODM_INTERFACE_H__\n\n"
  },
  {
    "path": "hal/phydm/phydm_noisemonitor.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n//#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n#include \"phydm_noisemonitor.h\"\n\n//=================================================\n// This function is for inband noise test utility only\n// To obtain the inband noise level(dbm), do the following.\n// 1. disable DIG and Power Saving \n// 2. Set initial gain = 0x1a\n// 3. Stop updating idle time pwer report (for driver read)\n//\t- 0x80c[25]\n//\n//=================================================\n\n#define Valid_Min\t\t\t\t-35\n#define Valid_Max\t\t\t10\n#define ValidCnt\t\t\t\t5\t\n\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_CE))\n\ns2Byte odm_InbandNoise_Monitor_NSeries(PDM_ODM_T\tpDM_Odm,u8 bPauseDIG,u8 IGIValue,u32 max_time)\n{\n\tu4Byte\t\t\t\ttmp4b;\t\n\tu1Byte\t\t\t\tmax_rf_path=0,rf_path;\t\n\tu1Byte\t\t\t\treg_c50, reg_c58,valid_done=0;\t\n\tstruct noise_level\t\tnoise_data;\n\tu32 start  = 0, \tfunc_start=0,\tfunc_end = 0;\n\n\tfunc_start = ODM_GetCurrentTime(pDM_Odm);\n\tpDM_Odm->noise_level.noise_all = 0;\n\t\n\tif((pDM_Odm->RFType == ODM_1T2R) ||(pDM_Odm->RFType == ODM_2T2R))\t\n\t\tmax_rf_path = 2;\n\telse\n\t\tmax_rf_path = 1;\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"odm_DebugControlInbandNoise_Nseries() ==> \\n\"));\n\n\tODM_Memory_Set(pDM_Odm,&noise_data,0,sizeof(struct noise_level));\n\t\n\t//\n\t// Step 1. Disable DIG && Set initial gain.\n\t//\n\t\n\tif(bPauseDIG)\n\t{\n\t\todm_PauseDIG(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_1, IGIValue);\n\t}\n\t//\n\t// Step 2. Disable all power save for read registers\n\t//\n\t//dcmd_DebugControlPowerSave(pAdapter, PSDisable);\n\n\t//\n\t// Step 3. Get noise power level\n\t//\n\tstart = ODM_GetCurrentTime(pDM_Odm);\n\twhile(1)\n\t{\n\t\t\n\t\t//Stop updating idle time pwer report (for driver read)\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 1);\t\n\t\t\n\t\t//Read Noise Floor Report\n\t\ttmp4b = ODM_GetBBReg(pDM_Odm, 0x8f8,bMaskDWord );\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"Noise Floor Report (0x8f8) = 0x%08x\\n\", tmp4b));\n\t\t\n\t\t//ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, TestInitialGain);\n\t\t//if(max_rf_path == 2)\n\t\t//\tODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, TestInitialGain);\n\t\t\n\t\t//update idle time pwer report per 5us\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 0);\n\t\t\n\t\tnoise_data.value[ODM_RF_PATH_A] = (u1Byte)(tmp4b&0xff);\t\t\n\t\tnoise_data.value[ODM_RF_PATH_B]  = (u1Byte)((tmp4b&0xff00)>>8);\n\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, (\"value_a = 0x%x(%d), value_b = 0x%x(%d)\\n\", \n\t\t\tnoise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_B], noise_data.value[ODM_RF_PATH_B]));\n\n\t\t for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \n\t\t {\n\t\t \tnoise_data.sval[rf_path] = (s1Byte)noise_data.value[rf_path];\n\t\t\tnoise_data.sval[rf_path] /= 2;\n\t\t }\t\n\t\t \t\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"sval_a = %d, sval_b = %d\\n\", \n\t\t\tnoise_data.sval[ODM_RF_PATH_A], noise_data.sval[ODM_RF_PATH_B]));\n\t\t//ODM_delay_ms(10);\n\t\t//ODM_sleep_ms(10);\n\n\t\tfor(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++) \n\t\t{\n\t\t\tif( (noise_data.valid_cnt[rf_path] < ValidCnt) && (noise_data.sval[rf_path] < Valid_Max && noise_data.sval[rf_path] >= Valid_Min))\n\t\t\t{\n\t\t\t\tnoise_data.valid_cnt[rf_path]++;\n\t\t\t\tnoise_data.sum[rf_path] += noise_data.sval[rf_path];\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"RF_Path:%d Valid sval = %d\\n\", rf_path,noise_data.sval[rf_path]));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"Sum of sval = %d, \\n\", noise_data.sum[rf_path]));\n\t\t\t\tif(noise_data.valid_cnt[rf_path] == ValidCnt)\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tvalid_done++;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"After divided, RF_Path:%d ,sum = %d \\n\", rf_path,noise_data.sum[rf_path]));\n\t\t\t\t}\t\t\t\t\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\t//printk(\"####### valid_done:%d #############\\n\",valid_done);\n\t\tif ((valid_done==max_rf_path) || (ODM_GetProgressingTime(pDM_Odm,start) > max_time))\n\t\t{\n\t\t\tfor(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)\n\t\t\t{ \n\t\t\t\t//printk(\"%s PATH_%d - sum = %d, valid_cnt = %d \\n\",__FUNCTION__,rf_path,noise_data.sum[rf_path], noise_data.valid_cnt[rf_path]);\n\t\t\t\tif(noise_data.valid_cnt[rf_path])\n\t\t\t\t\tnoise_data.sum[rf_path] /= noise_data.valid_cnt[rf_path];\t\t\n\t\t\t\telse\n\t\t\t\t\tnoise_data.sum[rf_path]  = 0;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treg_c50 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XAAGCCore1,bMaskByte0);\n\treg_c50 &= ~BIT7;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"0x%x = 0x%02x(%d)\\n\", rOFDM0_XAAGCCore1, reg_c50, reg_c50));\n\tpDM_Odm->noise_level.noise[ODM_RF_PATH_A] = -110 + reg_c50 + noise_data.sum[ODM_RF_PATH_A];\n\tpDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_A];\n\t\t\n\tif(max_rf_path == 2){\n\t\treg_c58 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XBAGCCore1,bMaskByte0);\n\t\treg_c58 &= ~BIT7;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"0x%x = 0x%02x(%d)\\n\", rOFDM0_XBAGCCore1, reg_c58, reg_c58));\n\t\tpDM_Odm->noise_level.noise[ODM_RF_PATH_B] = -110 + reg_c58 + noise_data.sum[ODM_RF_PATH_B];\n\t\tpDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_B];\n\t}\n\tpDM_Odm->noise_level.noise_all /= max_rf_path;\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,(\"noise_a = %d, noise_b = %d\\n\", \n\t\tpDM_Odm->noise_level.noise[ODM_RF_PATH_A],\n\t\tpDM_Odm->noise_level.noise[ODM_RF_PATH_B]));\n\n\t//\n\t// Step 4. Recover the Dig\n\t//\n\tif(bPauseDIG)\n\t{\n\t\todm_PauseDIG(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_1, IGIValue);\n\t}\t\n\tfunc_end = ODM_GetProgressingTime(pDM_Odm,func_start) ;\t\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"odm_DebugControlInbandNoise_Nseries() <==\\n\"));\n\treturn pDM_Odm->noise_level.noise_all;\n\n}\n\ns2Byte\t\nodm_InbandNoise_Monitor_ACSeries(PDM_ODM_T\tpDM_Odm, u8 bPauseDIG, u8 IGIValue, u32 max_time\n\t)\n{\n\ts4Byte          rxi_buf_anta, rxq_buf_anta; /*rxi_buf_antb, rxq_buf_antb;*/\n\ts4Byte\t        value32, pwdb_A = 0, sval, noise, sum;\n\tBOOLEAN\t        pd_flag;\n\tu1Byte\t\t\ti, valid_cnt;\n\tu32 start = 0, func_start = 0, func_end = 0;\n\n\n\tif (!(pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821)))\n\t\treturn 0;\n\t\n\tfunc_start = ODM_GetCurrentTime(pDM_Odm);\n\tpDM_Odm->noise_level.noise_all = 0;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"odm_InbandNoise_Monitor_ACSeries() ==>\\n\"));\n\t\n\t/* Step 1. Disable DIG && Set initial gain. */\n\tif (bPauseDIG)\n\t\todm_PauseDIG(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_1, IGIValue);\n\n\t/* Step 2. Disable all power save for read registers */\n\t/*dcmd_DebugControlPowerSave(pAdapter, PSDisable); */\n\n\t/* Step 3. Get noise power level */\n\tstart = ODM_GetCurrentTime(pDM_Odm);\n\n\t/* reset counters */\n\tsum = 0;\n\tvalid_cnt = 0;\n\n\t/* Step 3. Get noise power level */\n\twhile (1) {\n\t\t/*Set IGI=0x1C */\n\t\tODM_Write_DIG(pDM_Odm, 0x1C);\n\t\t/*stop CK320&CK88 */\n\t\tODM_SetBBReg(pDM_Odm, 0x8B4, BIT6, 1);\n\t\t/*Read Path-A */\n\t\tODM_SetBBReg(pDM_Odm, 0x8FC, bMaskDWord, 0x200); /*set debug port*/\n\t\tvalue32 = ODM_GetBBReg(pDM_Odm, 0xFA0, bMaskDWord); /*read debug port*/\n\t\t\n\t\trxi_buf_anta = (value32 & 0xFFC00) >> 10; /*rxi_buf_anta=RegFA0[19:10]*/\n\t\trxq_buf_anta = value32 & 0x3FF; /*rxq_buf_anta=RegFA0[19:10]*/\n\n\t\tpd_flag = (BOOLEAN) ((value32 & BIT31) >> 31);\n\n\t\t/*Not in packet detection period or Tx state */\n\t\tif ((!pd_flag) || (rxi_buf_anta != 0x200)) {\n\t\t\t/*sign conversion*/\n\t\t\trxi_buf_anta = ODM_SignConversion(rxi_buf_anta, 10);\n\t\t\trxq_buf_anta = ODM_SignConversion(rxq_buf_anta, 10);\n\n\t\t\tpwdb_A = ODM_PWdB_Conversion(rxi_buf_anta * rxi_buf_anta + rxq_buf_anta * rxq_buf_anta, 20, 18); /*S(10,9)*S(10,9)=S(20,18)*/\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"pwdb_A= %d dB, rxi_buf_anta= 0x%x, rxq_buf_anta= 0x%x\\n\", pwdb_A, rxi_buf_anta & 0x3FF, rxq_buf_anta & 0x3FF));\n\t\t}\n\n\t\t/*BB Reset*/\n\t\tODM_Write1Byte(pDM_Odm, 0x02, ODM_Read1Byte(pDM_Odm, 0x02) & (~BIT0));\n\t\tODM_Write1Byte(pDM_Odm, 0x02, ODM_Read1Byte(pDM_Odm, 0x02) | BIT0);\n\n\t\t/*Start CK320&CK88*/\n\t\tODM_SetBBReg(pDM_Odm, 0x8B4, BIT6, 0);\n\n\t\tsval = pwdb_A;\n\n\t\tif (sval < 0 && sval >= -27) {\n\t\t\tif (valid_cnt < ValidCnt) {\n\t\t\t\tvalid_cnt++;\n\t\t\t\tsum += sval;\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Valid sval = %d\\n\", sval));\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"Sum of sval = %d,\\n\", sum));\n\t\t\t\tif ((valid_cnt >= ValidCnt) || (ODM_GetProgressingTime(pDM_Odm, start) > max_time)) {\n\t\t\t\t\tsum /= valid_cnt;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"After divided, sum = %d\\n\", sum)); \n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*ADC backoff is 12dB,*/ \n\t/*Ptarget=0x1C-110=-82dBm*/\n\tnoise = sum + 12 + 0x1C - 110; \n\t\n\t/*Offset*/\n\tnoise = noise - 3;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"noise = %d\\n\", noise));\n\tpDM_Odm->noise_level.noise_all = (s2Byte)noise;\n\n\t/* Step 4. Recover the Dig*/\n\tif (bPauseDIG)\n\t\todm_PauseDIG(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_1, IGIValue);\n\t\n\tfunc_end = ODM_GetProgressingTime(pDM_Odm, func_start);\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"odm_InbandNoise_Monitor_ACSeries() <==\\n\"));\n\n\treturn pDM_Odm->noise_level.noise_all;\n}\n\n\n\ns2Byte\nODM_InbandNoise_Monitor(PVOID pDM_VOID, u8 bPauseDIG, u8 IGIValue, u32 max_time)\n{\n\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\n\t\treturn odm_InbandNoise_Monitor_ACSeries(pDM_Odm, bPauseDIG, IGIValue, max_time);\n\telse\n\t\treturn odm_InbandNoise_Monitor_NSeries(pDM_Odm, bPauseDIG, IGIValue, max_time);\n}\n\n#endif\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_noisemonitor.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n *****************************************************************************/\n#ifndef\t__ODMNOISEMONITOR_H__\n#define __ODMNOISEMONITOR_H__\n\n#define\tODM_MAX_CHANNEL_NUM\t\t\t\t\t38//14+24\nstruct noise_level\n{\n\t//u1Byte\t\t\t\tvalue_a, value_b;\n\tu1Byte\t\t\t\tvalue[MAX_RF_PATH];\n\t//s1Byte\t\t\t\tsval_a, sval_b;\n\ts1Byte\t\t\t\tsval[MAX_RF_PATH];\n\t\n\t//s4Byte\t\t\t\tnoise_a=0, noise_b=0,sum_a=0, sum_b=0;\n\t//s4Byte\t\t\t\tnoise[ODM_RF_PATH_MAX];\n\ts4Byte\t\t\t\tsum[MAX_RF_PATH];\n\t//u1Byte\t\t\t\tvalid_cnt_a=0, valid_cnt_b=0, \n\tu1Byte\t\t\t\tvalid[MAX_RF_PATH];\n\tu1Byte\t\t\t\tvalid_cnt[MAX_RF_PATH];\n\n};\n\n\ntypedef struct _ODM_NOISE_MONITOR_\n{\n\ts1Byte\t\t\tnoise[MAX_RF_PATH];\n\ts2Byte\t\t\tnoise_all;\t\n}ODM_NOISE_MONITOR;\n\ns2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time);\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_pathdiv.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if(defined(CONFIG_PATH_DIVERSITY))\n#if RTL8814A_SUPPORT\n\nVOID\nphydm_dtp_fix_tx_path(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\tpath\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv = &pDM_Odm->DM_PathDiv;\n\tu1Byte\t\t\ti,num_enable_path=0;\n\n\tif(path==pDM_PathDiv->pre_tx_path)\n\t{\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tpDM_PathDiv->pre_tx_path=path;\n\t}\n\n\tODM_SetBBReg( pDM_Odm, 0x93c, BIT18|BIT19, 3);\n\n\tfor(i=0; i<4; i++)\n\t{\n\t\tif(path&BIT(i))\n\t\t\tnum_enable_path++;\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Number of trun-on path : (( %d ))\\n\", num_enable_path));\n\n\tif(num_enable_path == 1)\n\t{\n\t\tODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);\n\t\n\t\tif(path==PHYDM_A)//1-1\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A ))\\n\"));\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t}\n\t\telse \tif(path==PHYDM_B)//1-2\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( B ))\\n\"));\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);\n\t\t}\n\t\telse \tif(path==PHYDM_C)//1-3\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( C ))\\n\"));\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0);\n\n\t\t}\n\t\telse \tif(path==PHYDM_D)//1-4\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( D ))\\n\"));\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 0);\n\t\t}\n\n\t}\n\telse \tif(num_enable_path == 2)\n\t{\n\t\tODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);\n\t\tODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path);\n\t\n\t\tif(path==PHYDM_AB)//2-1\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A B ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);\t\t\t\n\t\t}\n\t\telse \tif(path==PHYDM_AC)//2-2\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A C ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);\t\n\t\t}\n\t\telse \tif(path==PHYDM_AD)//2-3\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A D ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);\t\n\t\t}\n\t\telse \tif(path==PHYDM_BC)//2-4\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( B C ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);\t\n\t\t}\n\t\telse \tif(path==PHYDM_BD)//2-5\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( B D ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);\t\n\t\t}\n\t\telse \tif(path==PHYDM_CD)//2-6\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( C D ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);\t\n\t\t}\n\n\t}\n\telse \tif(num_enable_path == 3)\n\t{\n\t\tODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);\n\t\tODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path);\n\t\tODM_SetBBReg( pDM_Odm, 0x940, 0xf0000, path);\n\t\n\t\tif(path==PHYDM_ABC)//3-1\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A B C))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 2);\t\t\t\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 2);\n\t\t\t//set for 3ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 2);\n\t\t}\n\t\telse \tif(path==PHYDM_ABD)//3-2\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A B D ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);\t\t\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);\t\t\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);\n\t\t\t//set for 3ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);\n\n\t\t}\n\t\telse \tif(path==PHYDM_ACD)//3-3\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( A C D ))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);\t\t\t\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);\n\t\t\t//set for 3ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);\n\t\t}\n\t\telse \tif(path==PHYDM_BCD)//3-4\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path (( B C D))\\n\"));\n\t\t\t//set for 1ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);\t\t\t\n\t\t\t//set for 2ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);\n\t\t\t//set for 3ss\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 0);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1);\n\t\t\tODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);\n\t\t}\n\t}\n\telse \tif(num_enable_path == 4)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" Trun on path ((A  B C D))\\n\"));\n\t}\n\n}\n\nVOID\nphydm_find_default_path(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv = &pDM_Odm->DM_PathDiv;\n\tu4Byte\trssi_avg_a=0, rssi_avg_b=0, rssi_avg_c=0, rssi_avg_d=0, rssi_avg_bcd=0;\n\tu4Byte\trssi_total_a=0, rssi_total_b=0, rssi_total_c=0, rssi_total_d=0;\n\n\t//2 Default Path Selection By RSSI\n\n\trssi_avg_a = (pDM_PathDiv->path_a_cnt_all > 0)? (pDM_PathDiv->path_a_sum_all / pDM_PathDiv->path_a_cnt_all) :0 ;\n\trssi_avg_b = (pDM_PathDiv->path_b_cnt_all > 0)? (pDM_PathDiv->path_b_sum_all / pDM_PathDiv->path_b_cnt_all) :0 ;\n\trssi_avg_c = (pDM_PathDiv->path_c_cnt_all > 0)? (pDM_PathDiv->path_c_sum_all / pDM_PathDiv->path_c_cnt_all) :0 ;\n\trssi_avg_d = (pDM_PathDiv->path_d_cnt_all > 0)? (pDM_PathDiv->path_d_sum_all / pDM_PathDiv->path_d_cnt_all) :0 ;\n\n\n\tpDM_PathDiv->path_a_sum_all = 0;\n \tpDM_PathDiv->path_a_cnt_all = 0;\n\tpDM_PathDiv->path_b_sum_all = 0;\n \tpDM_PathDiv->path_b_cnt_all = 0;\n\tpDM_PathDiv->path_c_sum_all = 0;\n \tpDM_PathDiv->path_c_cnt_all = 0;\n\tpDM_PathDiv->path_d_sum_all = 0;\n \tpDM_PathDiv->path_d_cnt_all = 0;\n\n\tif(pDM_PathDiv->use_path_a_as_default_ant == 1)\n\t{\n\t\trssi_avg_bcd=(rssi_avg_b+rssi_avg_c+rssi_avg_d)/3;\n\n\t\tif( (rssi_avg_a + ANT_DECT_RSSI_TH) > rssi_avg_bcd  )\n\t\t{\n\t\t\tpDM_PathDiv->is_pathA_exist=TRUE;\n\t\t\tpDM_PathDiv->default_path=PATH_A;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDM_PathDiv->is_pathA_exist=FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( (rssi_avg_a >=rssi_avg_b) && (rssi_avg_a >=rssi_avg_c)&&(rssi_avg_a >=rssi_avg_d))\n\t\t\tpDM_PathDiv->default_path=PATH_A;\n\t\telse if(  (rssi_avg_b >=rssi_avg_c)&&(rssi_avg_b >=rssi_avg_d))\n\t\t\tpDM_PathDiv->default_path=PATH_B;\n\t\telse if(  rssi_avg_c >=rssi_avg_d)\n\t\t\tpDM_PathDiv->default_path=PATH_C;\n\t\telse\n\t\t\tpDM_PathDiv->default_path=PATH_D;\n\t}\n\n\n}\n\n\nVOID\nphydm_candidate_dtp_update(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv = &pDM_Odm->DM_PathDiv;\n\n\tpDM_PathDiv->num_candidate=3;\n\t\n\tif(pDM_PathDiv->use_path_a_as_default_ant == 1)\n\t{\n\t\tif(pDM_PathDiv->num_tx_path==3)\n\t\t{\n\t\t\tif(pDM_PathDiv->is_pathA_exist)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_ABC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_ABD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_ACD;\n\t\t\t}\n\t\t\telse // use path BCD \n\t\t\t{\n\t\t\t\tpDM_PathDiv->num_candidate=1;\n\t\t\t\tphydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse \tif(pDM_PathDiv->num_tx_path==2)\n\t\t{\n\t\t\tif(pDM_PathDiv->is_pathA_exist)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_AB; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_AC; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_AD; \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_BC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_BD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_CD; \n\t\t\t}\t\n\t\t}\n\t}\n\telse\n\t{\n\t\t//2 3 TX Mode \n\t\tif(pDM_PathDiv->num_tx_path==3)//choose 3 ant form 4 \n\t\t{\n\t\t\tif(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_ABC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_ABD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_ACD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path==PATH_B)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_ABC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_ABD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_BCD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path == PATH_C)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_ABC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_ACD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_BCD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path == PATH_D)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_ABD; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_ACD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_BCD; \n\t\t\t}\n\t\t}\n\t\t\n\t\t//2 2 TX Mode \n\t\telse if(pDM_PathDiv->num_tx_path==2)//choose 2 ant form 4 \n\t\t{\n\t\t\tif(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_AB; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_AC; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_AD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path==PATH_B)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_AB; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_BC; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_BD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path == PATH_C)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1 =  PHYDM_AC; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_BC; \n\t\t\t\tpDM_PathDiv->ant_candidate_3 =  PHYDM_CD; \n\t\t\t}\n\t\t\telse if(pDM_PathDiv->default_path == PATH_D)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->ant_candidate_1=  PHYDM_AD; \n\t\t\t\tpDM_PathDiv->ant_candidate_2 =  PHYDM_BD; \n\t\t\t\tpDM_PathDiv->ant_candidate_3=  PHYDM_CD; \n\t\t\t}\n\t\t}\n\t}\n}\n\n\nVOID\nphydm_dynamic_tx_path(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv = &pDM_Odm->DM_PathDiv;\t\n\t\n\tPSTA_INFO_T   \tpEntry;\n\tu4Byte\ti;\n\tu1Byte\tnum_client=0;\n\tu1Byte\tH2C_Parameter[6] ={0};\n\n\n\tif(!pDM_Odm->bLinked) //bLinked==False\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"DTP_8814 [No Link!!!]\\n\"));\n\t\t\n\t\tif(pDM_PathDiv->bBecomeLinked == TRUE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" [Be disconnected]----->\\n\"));\n\t\t\tpDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\n\t\treturn;\n\t}\t\n\telse\n\t{\n\t\tif(pDM_PathDiv->bBecomeLinked ==FALSE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\" [Be Linked !!!]----->\\n\"));\n\t\t\tpDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked;\n\t\t}\t\n\t}\t\n\t\n\t//2 [Period CTRL]\n\tif(pDM_PathDiv->dtp_period >=2)\n\t{\n\t\tpDM_PathDiv->dtp_period=0;\t\n\t}\n\telse\n\t{\t\n\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"Phydm_Dynamic_Tx_Path_8814A()  Stay = (( %d ))\\n\",pDM_PathDiv->dtp_period));\n\t\tpDM_PathDiv->dtp_period++;\t\t\n\t\treturn;\n\t}\n\t\n\n\t//2 [Fix Path]\n\tif (pDM_Odm->path_select != PHYDM_AUTO_PATH)\n\t{\n\t\treturn;\n\t}\n\t\n\t//2 [Check Bfer]\t\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#if (BEAMFORMING_SUPPORT == 1)\n\t{\n\t\tBEAMFORMING_CAP\t\tBeamformCap = (pDM_Odm->BeamformingInfo.BeamformCap);\n\n\t\tif( BeamformCap & BEAMFORMER_CAP ) //  BFmer On  &&   Div On ->  Div Off\n\t\t{\t\n\t\t\tif( pDM_PathDiv->fix_path_bfer == 0) \n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,(\"[ PathDiv : OFF ]   BFmer ==1  \\n\"));\n\t\t\t\tpDM_PathDiv->fix_path_bfer = 1 ;\t\t\t\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\telse // BFmer Off   &&   Div Off ->  Div On\n\t\t{\n\t\t\tif( pDM_PathDiv->fix_path_bfer == 1 ) \n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,(\"[ PathDiv : ON ]   BFmer ==0 \\n\"));\n\t\t\t\tpDM_PathDiv->fix_path_bfer = 0;\n\t\t\t}\n\t\t}\n\t}\n\t#endif\t\n\t#endif\n\n\tif(pDM_PathDiv->use_path_a_as_default_ant ==1)\n\t{\n\t\tphydm_find_default_path(pDM_Odm);\n\t\tphydm_candidate_dtp_update(pDM_Odm);\t\n\t}\n\telse\n\t{\n\t\tif( pDM_PathDiv->dtp_state == PHYDM_DTP_INIT)\n\t\t{\n\t\t\tphydm_find_default_path(pDM_Odm);\n\t\t\tphydm_candidate_dtp_update(pDM_Odm);\n\t\t\tpDM_PathDiv->dtp_state = PHYDM_DTP_RUNNING_1;\n\t\t}\n\t\t\n\t\telse \tif( pDM_PathDiv->dtp_state == PHYDM_DTP_RUNNING_1)\n\t\t{\n\t\t\tpDM_PathDiv->dtp_check_patha_counter++;\n\t\t\t\n\t\t\tif(pDM_PathDiv->dtp_check_patha_counter>=NUM_RESET_DTP_PERIOD)\n\t\t\t{\n\t\t\t\tpDM_PathDiv->dtp_check_patha_counter=0;\n\t\t\t\tpDM_PathDiv->dtp_state = PHYDM_DTP_INIT;\n\t\t\t}\n\t\t\t//2 Search space update\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\t// 1.  find the worst candidate\n\t\t\t\t\n\n\t\t\t\t// 2. repalce the worst candidate\n\t\t\t}\n\t\t}\n\t}\n\n\t//2 Dynamic Path Selection H2C\n\n\tif(pDM_PathDiv->num_candidate == 1)\n\t{\n\t\treturn;\n\t}\n\telse\n\t{\t\n\t\tH2C_Parameter[0] =  pDM_PathDiv->num_candidate;\n\t\tH2C_Parameter[1] =  pDM_PathDiv->num_tx_path;\t\n\t\tH2C_Parameter[2] =  pDM_PathDiv->ant_candidate_1; \n\t\tH2C_Parameter[3] =  pDM_PathDiv->ant_candidate_2; \n\t\tH2C_Parameter[4] =  pDM_PathDiv->ant_candidate_3; \n\n\t\tODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_DYNAMIC_TX_PATH, 6, H2C_Parameter);\n\t}\n\n}\n\n\n\nVOID\nphydm_dynamic_tx_path_init(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv  = &(pDM_Odm->DM_PathDiv);\n\tPADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tUSB_MODE_MECH\t*pUsbModeMech = &pAdapter->UsbModeMechanism;\n\t#endif\n\tu1Byte \t\t\tsearch_space_2[NUM_CHOOSE2_FROM4]= {PHYDM_AB, PHYDM_AC, PHYDM_AD, PHYDM_BC, PHYDM_BD, PHYDM_CD };\n\tu1Byte \t\t\tsearch_space_3[NUM_CHOOSE3_FROM4]= {PHYDM_BCD, PHYDM_ACD,  PHYDM_ABD, PHYDM_ABC};\n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tpDM_PathDiv->is_u3_mode = (pUsbModeMech->CurUsbMode==USB_MODE_U3)? 1 : 0 ;\n\t#else\n\t\tpDM_PathDiv->is_u3_mode = 1;\n\t#endif\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"Dynamic TX Path Init 8814\\n\"));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"is_u3_mode = (( %d ))\\n\", pDM_PathDiv->is_u3_mode));\n\n\tmemcpy(&(pDM_PathDiv->search_space_2[0]), &(search_space_2[0]), NUM_CHOOSE2_FROM4);\n\tmemcpy(&(pDM_PathDiv->search_space_3[0]), &(search_space_3[0]), NUM_CHOOSE3_FROM4);\n\n\tpDM_PathDiv->use_path_a_as_default_ant= 1;\n\tpDM_PathDiv->dtp_state = PHYDM_DTP_INIT;\t\n\tpDM_Odm->path_select = PHYDM_AUTO_PATH;\n\tpDM_PathDiv->path_div_type = PHYDM_4R_PATH_DIV;\n\n\t\n\tif(pDM_PathDiv->is_u3_mode )\n\t{\n\t\tpDM_PathDiv->num_tx_path=3;\n\t\tphydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD);/* 3TX  Set Init TX Path*/\n\t\t\n\t}\n\telse\n\t{\n\t\tpDM_PathDiv->num_tx_path=2;\n\t\tphydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BC);/* 2TX // Set Init TX Path*/\n\t}\n\t\n}\n\n\nVOID\nphydm_process_rssi_for_path_div(\t\n\tIN OUT\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\t\tPVOID\t\t\tp_phy_info_void,\n\tIN\t\t\tPVOID\t\t\tp_pkt_info_void\n\t)\n{\n\tPDM_ODM_T\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_PHY_INFO_T \t\tpPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void;\n\tPODM_PACKET_INFO_T\t pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void;\n\tpPATHDIV_T\t\t\tpDM_PathDiv  = &(pDM_Odm->DM_PathDiv);\n\n\tif(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID)\n\t{\n\t\tif(pPktinfo->DataRate > ODM_RATE11M)\n\t\t{\n\t\t\tif(pDM_PathDiv->path_div_type == PHYDM_4R_PATH_DIV)\n\t\t\t{\n\t\t\t\t#if RTL8814A_SUPPORT\n\t\t\t\tif(pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\t\t\t{\n\t\t\t\t\tpDM_PathDiv->path_a_sum_all+=pPhyInfo->RxMIMOSignalStrength[0];\n\t\t\t\t\tpDM_PathDiv->path_a_cnt_all++;\n\t\t\t\t\t\n\t\t\t\t\tpDM_PathDiv->path_b_sum_all+=pPhyInfo->RxMIMOSignalStrength[1];\n\t\t\t\t\tpDM_PathDiv->path_b_cnt_all++;\n\t\t\t\t\t\n\t\t\t\t\tpDM_PathDiv->path_c_sum_all+=pPhyInfo->RxMIMOSignalStrength[2];\n\t\t\t\t\tpDM_PathDiv->path_c_cnt_all++;\n\t\t\t\t\t\n\t\t\t\t\tpDM_PathDiv->path_d_sum_all+=pPhyInfo->RxMIMOSignalStrength[3];\n\t\t\t\t\tpDM_PathDiv->path_d_cnt_all++;\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_PathDiv->PathA_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[0];\n\t\t\t\tpDM_PathDiv->PathA_Cnt[pPktinfo->StationID]++;\n\n\t\t\t\tpDM_PathDiv->PathB_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[1];\n\t\t\t\tpDM_PathDiv->PathB_Cnt[pPktinfo->StationID]++;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n}\n\n#endif //#if RTL8814A_SUPPORT\n\nVOID\nodm_pathdiv_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\t\tpDM_PathDiv  = &(pDM_Odm->DM_PathDiv);\n\tu4Byte used = *_used;\n\tu4Byte out_len = *_out_len;\n\t\n\tpDM_Odm->path_select = (dm_value[0] & 0xf);\n\tPHYDM_SNPRINTF((output+used, out_len-used,\"Path_select = (( 0x%x ))\\n\",pDM_Odm->path_select ));\n\t\n\t//2 [Fix Path]\n\tif (pDM_Odm->path_select != PHYDM_AUTO_PATH)\n\t{\n\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"Trun on path  [%s%s%s%s]\\n\",\n\t\t\t((pDM_Odm->path_select) & 0x1)?\"A\":\"\",\n\t\t\t((pDM_Odm->path_select) & 0x2)?\"B\":\"\",\n\t\t\t((pDM_Odm->path_select) & 0x4)?\"C\":\"\",\n\t\t\t((pDM_Odm->path_select) & 0x8)?\"D\":\"\" ));\n\t\t\n\t\tphydm_dtp_fix_tx_path( pDM_Odm, pDM_Odm->path_select );\n\t}\n\telse\n\t{\n\t\tPHYDM_SNPRINTF((output+used, out_len-used,\"%s\\n\",\"Auto Path\"));\n\t}\n}\n\n#endif // #if(defined(CONFIG_PATH_DIVERSITY))\n\nVOID\nphydm_c2h_dtp_handler(\n IN\tPVOID\tpDM_VOID,\n IN \tpu1Byte   CmdBuf,\n IN \tu1Byte\tCmdLen\n)\n{\n#if(defined(CONFIG_PATH_DIVERSITY))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpPATHDIV_T\t\tpDM_PathDiv  = &(pDM_Odm->DM_PathDiv);\n\n\tu1Byte  macid = CmdBuf[0]; \n\tu1Byte  target = CmdBuf[1];\t\n\tu1Byte  nsc_1 = CmdBuf[2];\n\tu1Byte  nsc_2 = CmdBuf[3];\n\tu1Byte  nsc_3 = CmdBuf[4];\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,(\"Target_candidate = (( %d ))\\n\", target));\n\t/*\n\tif( (nsc_1 >= nsc_2) &&  (nsc_1 >= nsc_3))\n\t{\n\t\tphydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_1);\n\t}\n\telse \tif( nsc_2 >= nsc_3)\n\t{\n\t\tphydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_2);\n\t}\n\telse\n\t{\n\t\tphydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_3);\t\n\t}\n\t*/\n#endif\t\n}\n\nVOID\nodm_PathDiversity(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if(defined(CONFIG_PATH_DIVERSITY))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,(\"Return: Not Support PathDiv\\n\"));\n\t\treturn;\n\t}\n\n\t#if RTL8812A_SUPPORT\n\n\tif(pDM_Odm->SupportICType & ODM_RTL8812)\n\t\t\tODM_PathDiversity_8812A(pDM_Odm);\n\t\telse\n\t#endif\n\n\t#if RTL8814A_SUPPORT\n\t\tif(pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\t\tphydm_dynamic_tx_path(pDM_Odm);\n\t\telse\n\t#endif\n    \t\t{}\n#endif\n}\n\nVOID\nodm_PathDiversityInit(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if(defined(CONFIG_PATH_DIVERSITY))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t/*pDM_Odm->SupportAbility |= ODM_BB_PATH_DIV;*/\n\t\n\tif(pDM_Odm->mp_mode == TRUE)\n\t\treturn;\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))\n\t{\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,(\"Return: Not Support PathDiv\\n\"));\n\t\treturn;\n\t}\n\n#if RTL8812A_SUPPORT\n\t\tif(pDM_Odm->SupportICType & ODM_RTL8812)\n\t\t\tODM_PathDiversityInit_8812A(pDM_Odm);\n\t\telse\n\t#endif\n\n\t#if RTL8814A_SUPPORT\n\t\tif(pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\t\tphydm_dynamic_tx_path_init(pDM_Odm);\n\t\telse\n\t#endif\t\n\t\t{}\n#endif\n}\n\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n//\n// 2011/12/02 MH Copy from MP oursrc for temporarily test.\n//\n#if RTL8192C_SUPPORT\nBOOLEAN\nodm_IsConnected_92C(\n\tIN\tPADAPTER\tAdapter\n)\n{\n\tPRT_WLAN_STA\tpEntry;\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tu4Byte\t\ti;\n\tBOOLEAN\t\tbConnected=FALSE;\n\t\n\tif(pMgntInfo->mAssoc)\n\t{\n\t\tbConnected = TRUE;\n\t}\n\telse\n\t{\n\t\tfor(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t\t{\n\t\t\tif(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)\n\t\t\t\tpEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\n\t\t\telse\n\t\t\t\tpEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\n\n\t\t\tif(pEntry!=NULL)\n\t\t\t{\n\t\t\t\tif(pEntry->bAssociated)\n\t\t\t\t{\n\t\t\t\t\tbConnected = TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn\tbConnected;\n}\n\nBOOLEAN\nODM_PathDiversityBeforeLink92C(\n\t//IN\tPADAPTER\tAdapter\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE*\tpHalData = NULL;\n\tPMGNT_INFO\t\tpMgntInfo = NULL;\n\t//pSWAT_T\t\tpDM_SWAT_Table = &Adapter->DM_SWAT_Table;\n\tpPD_T\t\t\tpDM_PDTable = NULL;\n\n\ts1Byte\t\t\tScore = 0;\n\tPRT_WLAN_BSS\tpTmpBssDesc;\n\tPRT_WLAN_BSS\tpTestBssDesc;\n\n\tu1Byte\t\t\ttarget_chnl = 0;\n\tu2Byte\t\t\tindex;\n\n\tif (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413\n\t{\t// The ODM structure is not initialized.\n\t\treturn FALSE;\n\t}\n\tpHalData = GET_HAL_DATA(Adapter);\n\tpMgntInfo = &Adapter->MgntInfo;\n\tpDM_PDTable = &Adapter->DM_PDTable;\n\t\n\t// Condition that does not need to use path diversity.\n\tif((!(pHalData->CVID_Version==VERSION_1_BEFORE_8703B && IS_92C_SERIAL(pHalData->VersionID))) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )\n\t{\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, \n\t\t\t\t(\"ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\\n\"));\n\t\treturn FALSE;\n\t}\n\n\t// Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.\n\tPlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\tif(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)\n\t{\n\t\tPlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\t\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, \n\t\t\t\t(\"ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\\n\", \n\t\t\t\tpMgntInfo->RFChangeInProgress,\n\t\t\t\tpHalData->eRFPowerState));\n\t\n\t\t//pDM_SWAT_Table->SWAS_NoLink_State = 0;\n\t\tpDM_PDTable->PathDiv_NoLink_State = 0;\n\t\t\n\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tPlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\n\t}\n\n\t//1 Run AntDiv mechanism \"Before Link\" part.\n\t//if(pDM_SWAT_Table->SWAS_NoLink_State == 0)\n\tif(pDM_PDTable->PathDiv_NoLink_State == 0)\n\t{\n\t\t//1 Prepare to do Scan again to check current antenna state.\n\n\t\t// Set check state to next step.\n\t\t//pDM_SWAT_Table->SWAS_NoLink_State = 1;\n\t\tpDM_PDTable->PathDiv_NoLink_State = 1;\n\t\n\t\t// Copy Current Scan list.\n\t\tAdapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;\n\t\tPlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);\n\n\t\t// Switch Antenna to another one.\n\t\tif(pDM_PDTable->DefaultRespPath == 0)\n\t\t{\n\t\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // TRX path = PathB\n\t\t\todm_SetRespPath_92C(Adapter, 1);\n\t\t\tpDM_PDTable->OFDMTXPath = 0xFFFFFFFF;\n\t\t\tpDM_PDTable->CCKTXPath = 0xFFFFFFFF;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // TRX path = PathA\n\t\t\todm_SetRespPath_92C(Adapter, 0);\n\t\t\tpDM_PDTable->OFDMTXPath = 0x0;\n\t\t\tpDM_PDTable->CCKTXPath = 0x0;\n\t\t}\n#if 0\t\n\n\t\tpDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\n\t\tpDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;\n\t\t\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, \n\t\t\t(\"ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\\n\", (pDM_SWAT_Table->CurAntenna==Antenna_A)?\"A\":\"B\"));\n\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);\n\t\tpDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\n\t\tPHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\n#endif\n\n\t\t// Go back to scan function again.\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"ODM_PathDiversityBeforeLink92C: Scan one more time\\n\"));\n\t\tpMgntInfo->ScanStep=0;\n\t\ttarget_chnl = odm_SwAntDivSelectScanChnl(Adapter);\n\t\todm_SwAntDivConstructScanChnl(Adapter, target_chnl);\n\t\tPlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\n\n\t\treturn TRUE;\n\t}\n\telse\n\t{\n\t\t//1 ScanComple() is called after antenna swiched.\n\t\t//1 Check scan result and determine which antenna is going\n\t\t//1 to be used.\n\n\t\tfor(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)\n\t\t{\n\t\t\tpTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);\n\t\t\tpTestBssDesc = &(pMgntInfo->bssDesc[index]);\n\n\t\t\tif(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\\n\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\\n\"));\n\t\t\t\tRT_PRINT_STR(COMP_INIT, DBG_LOUD, \"SSID: \", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);\n\t\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Original: %d, Test: %d\\n\", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\n\t\t\t\tScore++;\n\t\t\t\tPlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\n\t\t\t}\n\t\t\telse if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\\n\"));\n\t\t\t\tRT_PRINT_STR(COMP_INIT, DBG_LOUD, \"SSID: \", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);\n\t\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Original: %d, Test: %d\\n\", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\n\t\t\t\tScore--;\n\t\t\t}\n\n\t\t}\n\n\t\tif(pMgntInfo->NumBssDesc!=0 && Score<=0)\n\t\t{\n\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD,\n\t\t\t\t(\"ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\\n\", pDM_PDTable->DefaultRespPath));\n\n\t\t\t//pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_INIT, DBG_LOUD, \n\t\t\t\t(\"ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\\n\", pDM_PDTable->DefaultRespPath));\n\n\t\t\tif(pDM_PDTable->DefaultRespPath == 0)\n\t\t\t{\n\t\t\t\tpDM_PDTable->OFDMTXPath = 0xFFFFFFFF;\n\t\t\t\tpDM_PDTable->CCKTXPath = 0xFFFFFFFF;\n\t\t\t\todm_SetRespPath_92C(Adapter, 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_PDTable->OFDMTXPath = 0x0;\n\t\t\t\tpDM_PDTable->CCKTXPath = 0x0;\n\t\t\t\todm_SetRespPath_92C(Adapter, 0);\n\t\t\t}\n\t\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); // RX path = PathAB\n\n\t\t\t//pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;\n\n\t\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);\n\t\t\t//pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\n\t\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\n\t\t}\n\n\t\t// Check state reset to default and wait for next time.\n\t\t//pDM_SWAT_Table->SWAS_NoLink_State = 0;\n\t\tpDM_PDTable->PathDiv_NoLink_State = 0;\n\n\t\treturn FALSE;\n\t}\n#else\n\t\treturn\tFALSE;\n#endif\n\t\n}\n\n\n\nVOID\nodm_PathDiversityAfterLink_92C(\n\tIN\tPADAPTER\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tpPD_T\t\tpDM_PDTable = &Adapter->DM_PDTable;\n\tu1Byte\t\tDefaultRespPath=0;\n\n\tif((!(pHalData->CVID_Version==VERSION_1_BEFORE_8703B && IS_92C_SERIAL(pHalData->VersionID))) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))\n\t{\n\t\tif(pHalData->PathDivCfg == 0)\n\t\t{\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"No ODM_TXPathDiversity()\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"2T ODM_TXPathDiversity()\\n\"));\n\t\t}\n\t\treturn;\n\t}\n\tif(!odm_IsConnected_92C(Adapter))\n\t{\n\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"ODM_TXPathDiversity(): No Connections\\n\"));\n\t\treturn;\n\t}\n\t\n\t\n\tif(pDM_PDTable->TrainingState == 0)\n\t{\n\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"ODM_TXPathDiversity() ==>\\n\"));\n\t\todm_OFDMTXPathDiversity_92C(Adapter);\n\n\t\tif((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))\n\t\t{\n\t\t\t//RT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: TrainingState=0\\n\"));\n\t\t\t\n\t\t\tif(pDM_PDTable->CCK_Pkt_Cnt > 300)\n\t\t\t\tpDM_PDTable->Timer = 20;\n\t\t\telse if(pDM_PDTable->CCK_Pkt_Cnt > 100)\n\t\t\t\tpDM_PDTable->Timer = 60;\n\t\t\telse\n\t\t\t\tpDM_PDTable->Timer = 250;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: timer=%d\\n\",pDM_PDTable->Timer));\n\n\t\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x00); // RX path = PathA\n\t\t\tpDM_PDTable->TrainingState = 1;\n\t\t\tpHalData->RSSI_test = TRUE;\n\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;\n\t\t\tDefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\\n\"));\n\t\t\todm_SetRespPath_92C(Adapter, DefaultRespPath);\n\t\t\todm_ResetPathDiversity_92C(Adapter);\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"ODM_TXPathDiversity() <==\\n\"));\n\t\t}\n\t}\n\telse if(pDM_PDTable->TrainingState == 1)\n\t{\t\t\n\t\t//RT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: TrainingState=1\\n\"));\n\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x05); // RX path = PathB\n\t\tpDM_PDTable->TrainingState = 2;\n\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms\n\t}\n\telse\n\t{\n\t\t//RT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: TrainingState=2\\n\"));\n\t\tpDM_PDTable->TrainingState = 0;\t\n\t\todm_CCKTXPathDiversity_92C(Adapter); \n\t\tif(pDM_PDTable->OFDM_Pkt_Cnt != 0)\n\t\t{\n\t\t\tDefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_SetRespPath_92C: DefaultRespPath is OFDM\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDefaultRespPath = pDM_PDTable->CCKDefaultRespPath;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_SetRespPath_92C: DefaultRespPath is CCK\\n\"));\n\t\t}\n\t\todm_SetRespPath_92C(Adapter, DefaultRespPath);\n\t\todm_ResetPathDiversity_92C(Adapter);\n\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"ODM_TXPathDiversity() <==\\n\"));\n\t}\n\n}\n\nVOID\nodm_SetRespPath_92C(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu1Byte\tDefaultRespPath\n\t)\n{\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\n\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_SetRespPath_92C: Select Response Path=%d\\n\",DefaultRespPath));\n\tif(DefaultRespPath != pDM_PDTable->DefaultRespPath)\n\t{\n\t\tif(DefaultRespPath == 0)\n\t\t{\n\t\t\tPlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);\n\t\t}\t\n\t}\n\tpDM_PDTable->DefaultRespPath = DefaultRespPath;\n}\n\nVOID\nodm_OFDMTXPathDiversity_92C(\n\tIN\tPADAPTER\tAdapter)\n{\n//\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tPRT_WLAN_STA\tpEntry;\n\tu1Byte\ti, DefaultRespPath = 0;\n\ts4Byte\tMinRSSI = 0xFF;\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\tpDM_PDTable->OFDMTXPath = 0;\n\t\n\t//1 Default Port\n\tif(pMgntInfo->mAssoc)\n\t{\n\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\\n\",\n\t\t\tAdapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));\n\t\tif(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])\n\t\t{\n\t\t\tpDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);\n\t\t\tMinRSSI =  Adapter->RxStats.RxRSSIPercentage[1];\n\t\t\tDefaultRespPath = 0;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: Default port Select Path-0\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpDM_PDTable->OFDMTXPath =  pDM_PDTable->OFDMTXPath | BIT0;\n\t\t\tMinRSSI =  Adapter->RxStats.RxRSSIPercentage[0];\n\t\t\tDefaultRespPath = 1;\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: Default port Select Path-1\\n\"));\n\t\t}\n\t\t\t//RT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"pDM_PDTable->OFDMTXPath =0x%x\\n\",pDM_PDTable->OFDMTXPath));\n\t}\n\t//1 Extension Port\n\tfor(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\tif(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)\n\t\t\tpEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\n\t\telse\n\t\t\tpEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\n\n\t\tif(pEntry!=NULL)\n\t\t{\n\t\t\tif(pEntry->bAssociated)\n\t\t\t{\n\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\\n\", \n\t\t\t\t\tpEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));\n\t\t\t\t\n\t\t\t\tif(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])\n\t\t\t\t{\n\t\t\t\t\tpDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));\n\t\t\t\t\t//pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\tif(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)\n\t\t\t\t\t{\n\t\t\t\t\t\tMinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];\n\t\t\t\t\t\tDefaultRespPath = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);\n\t\t\t\t\t//pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\tif(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)\n\t\t\t\t\t{\n\t\t\t\t\t\tMinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];\n\t\t\t\t\t\tDefaultRespPath = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tpDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;\n}\n\n\nVOID\nodm_CCKTXPathDiversity_92C(\n\tIN\tPADAPTER\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tPRT_WLAN_STA\tpEntry;\n\ts4Byte\tMinRSSI = 0xFF;\n\tu1Byte\ti, DefaultRespPath = 0;\n//\tBOOLEAN\tbBModePathDiv = FALSE;\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\n\t//1 Default Port\n\tif(pMgntInfo->mAssoc)\n\t{\n\t\tif(pHalData->OFDM_Pkt_Cnt == 0)\n\t\t{\n\t\t\tfor(i=0; i<2; i++)\n\t\t\t{\n\t\t\t\tif(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded\n\t\t\t\t\tpDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);\n\t\t\t\telse\n\t\t\t\t\tpDM_PDTable->RSSI_CCK_Path[i] = 0;\n\t\t\t}\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\\n\",\n\t\t\t\tpDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\\n\",\n\t\t\t\tpDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));\n\t\t\n\t\t\tif(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])\n\t\t\t{\n\t\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);\n\t\t\t\tMinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];\n\t\t\t\tDefaultRespPath = 0;\n\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\\n\"));\n\t\t\t}\n\t\t\telse if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])\n\t\t\t{\n\t\t\t\tpDM_PDTable->CCKTXPath =  pDM_PDTable->CCKTXPath | BIT0;\n\t\t\t\tMinRSSI =  pDM_PDTable->RSSI_CCK_Path[0];\n\t\t\t\tDefaultRespPath = 1;\n\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))\n\t\t\t\t{\n\t\t\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\\n\"));\n\t\t\t\t\tMinRSSI =  pDM_PDTable->RSSI_CCK_Path[1];\n\t\t\t\t\tDefaultRespPath = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse //Follow OFDM decision\n\t\t{\n\t\t\tpDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);\n\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\\n\",\n\t\t\t\tpDM_PDTable->CCKTXPath &BIT0));\n\t\t}\n\t}\n\t//1 Extension Port\n\tfor(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\tif(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)\n\t\t\tpEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\n\t\telse\n\t\t\tpEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\n\n\t\tif(pEntry!=NULL)\n\t\t{\n\t\t\tif(pEntry->bAssociated)\n\t\t\t{\n\t\t\t\tif(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)\n\t\t\t\t{\n\t\t\t\t\tu1Byte j=0;\n\t\t\t\t\tfor(j=0; j<2; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)\n\t\t\t\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path[j] = 0;\n\t\t\t\t\t}\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\\n\", \n\t\t\t\t\t\tpEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));\n\t\t\t\t\t\n\t\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));\n\t\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];\n\t\t\t\t\t\t\tDefaultRespPath = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])\n\t\t\t\t\t{\n\t\t\t\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);\n\t\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];\n\t\t\t\t\t\t\tDefaultRespPath = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));\n\t\t\t\t\t\t\tMinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];\n\t\t\t\t\t\t\tDefaultRespPath = 0;\n\t\t\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\\n\", pEntry->AssociatedMacId));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse //Follow OFDM decision\n\t\t\t\t{\n\t\t\t\t\tpDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));\n\t\t\t\t\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\\n\",\n\t\t\t\t\t\tpEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tRT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"odm_CCKTXPathDiversity_92C:MinRSSI=%d\\n\",MinRSSI));\n\n\tif(MinRSSI == 0xFF)\n\t\tDefaultRespPath = pDM_PDTable->CCKDefaultRespPath;\n\n\tpDM_PDTable->CCKDefaultRespPath = DefaultRespPath;\n}\n\n\nVOID\nodm_ResetPathDiversity_92C(\n\t\tIN\tPADAPTER\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\tPRT_WLAN_STA\tpEntry;\n\tu4Byte\ti,j;\n\n\tpHalData->RSSI_test = FALSE;\n\tpDM_PDTable->CCK_Pkt_Cnt = 0;\n\tpDM_PDTable->OFDM_Pkt_Cnt = 0;\n\tpHalData->CCK_Pkt_Cnt =0;\n\tpHalData->OFDM_Pkt_Cnt =0;\n\t\n\tif(pDM_PDTable->CCKPathDivEnable == TRUE)\t\n\t\tPHY_SetBBReg(Adapter, rCCK0_AFESetting  , 0x0F000000, 0x01); //RX path = PathAB\n\n\tfor(i=0; i<2; i++)\n\t{\n\t\tpDM_PDTable->RSSI_CCK_Path_cnt[i]=0;\n\t\tpDM_PDTable->RSSI_CCK_Path[i] = 0;\n\t}\n\tfor(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\n\t{\n\t\tif(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)\n\t\t\tpEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);\n\t\telse\n\t\t\tpEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);\n\n\t\tif(pEntry!=NULL)\n\t\t{\n\t\t\tpEntry->rssi_stat.CCK_Pkt_Cnt = 0;\n\t\t\tpEntry->rssi_stat.OFDM_Pkt_Cnt = 0;\n\t\t\tfor(j=0; j<2; j++)\n\t\t\t{\n\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;\n\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path[j] = 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tbreak;\n\t}\n}\n\n\n\n\n\nVOID\nodm_CCKTXPathDiversityCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n#if USE_WORKITEM\n       PADAPTER\tAdapter = (PADAPTER)pTimer->Adapter;\n       HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t   PDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPADAPTER\tAdapter = (PADAPTER)pTimer->Adapter;\n#endif\n\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n#if USE_WORKITEM\n\tPlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);\n#else\n\todm_PathDiversityAfterLink_92C(Adapter);\n#endif\n#else\n\tPlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);\n#endif\n\n}\n\n\nVOID\nodm_CCKTXPathDiversityWorkItemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tAdapter = (PADAPTER)pContext;\n\n\todm_CCKTXPathDiversity_92C(Adapter);\n}\n\n//\n// 20100514 Luke/Joseph:\n// Callback function for 500ms antenna test trying.\n//\nVOID\nodm_PathDivChkAntSwitchCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\n#if USE_WORKITEM\n\tPlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);\n#else\n\todm_PathDivChkAntSwitch(pDM_Odm);\n#endif\n#else\n\tPlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);\n#endif\n\n//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);\n\n}\n\n\nVOID\nodm_PathDivChkAntSwitchWorkitemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\todm_PathDivChkAntSwitch(pDM_Odm);\n}\n\n\n //MAC0_ACCESS_PHY1\n\n// 2011-06-22 Neil Chen & Gary Hsin\n// Refer to Jr.Luke's SW ANT DIV\n// 92D Path Diversity Main function\n// refer to 88C software antenna diversity\n// \nVOID\nodm_PathDivChkAntSwitch(\n\tPDM_ODM_T\t\tpDM_Odm\n\t//PADAPTER\t\tAdapter,\n\t//u1Byte\t\t\tStep\n)\n{\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &Adapter->MgntInfo;\n\n\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\ts4Byte\t\t\tcurRSSI=100, RSSI_A, RSSI_B;\n\tu1Byte\t\t\tnextAntenna=AUX_ANT;\n\tstatic u8Byte\t\tlastTxOkCnt=0, lastRxOkCnt=0;\n\tu8Byte\t\t\tcurTxOkCnt, curRxOkCnt;\n\tstatic u8Byte\t\tTXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;\n\tu8Byte\t\t\tCurByteCnt=0, PreByteCnt=0;\n\tstatic u1Byte\t\tTrafficLoad = TRAFFIC_LOW;\n\tu1Byte\t\t\tScore_A=0, Score_B=0;\n\tu1Byte\t\t\ti=0x0;\n       // Neil Chen\n       static u1Byte        pathdiv_para=0x0;     \n       static u1Byte        switchfirsttime=0x00;\n\t// u1Byte                 regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);\n\tu1Byte\t\t\tregB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);\n\n\n       //u1Byte                 reg637 =0x0;   \n       static u1Byte        fw_value=0x0;         \n\t//u8Byte\t\t\tcurTxOkCnt_tmp, curRxOkCnt_tmp;\n       PADAPTER            BuddyAdapter = Adapter->BuddyAdapter;     // another adapter MAC\n        // Path Diversity   //Neil Chen--2011--06--22\n\n\t//u1Byte                 PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);\n\tu1Byte                 PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);\n\tu1Byte                 PathDiv_Enable = pHalData->bPathDiv_Enable;\n\n\n\t//DbgPrint(\"Path Div PG Value:%x \\n\",PathDiv_Enable);\t\n       if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))\n       {\n           return;\n       }\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,(\"===================>odm_PathDivChkAntSwitch()\\n\"));\n\n       // The first time to switch path excluding 2nd, 3rd, ....etc....\n\tif(switchfirsttime==0)\n\t{\n\t    if(regB33==0)\n\t    {\n\t       pDM_SWAT_Table->CurAntenna = MAIN_ANT;    // Default MAC0_5G-->Path A (current antenna)     \n\t    }\t    \n\t}\n\n\t// Condition that does not need to use antenna diversity.\n\tif(pDM_Odm->SupportICType != ODM_RTL8192D)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"odm_PathDiversityMechanims(): No PathDiv Mechanism.\\n\"));\n\t\treturn;\n\t}\n\n\t// Radio off: Status reset to default and return.\n\tif(pHalData->eRFPowerState==eRfOff)\n\t{\n\t\t//ODM_SwAntDivRestAfterLink(Adapter);\n\t\treturn;\n\t}\n\n       /*\n\t// Handling step mismatch condition.\n\t// Peak step is not finished at last time. Recover the variable and check again.\n\tif(\tStep != pDM_SWAT_Table->try_flag\t)\n\t{\n\t\tODM_SwAntDivRestAfterLink(Adapter);\n\t} */\n\t\n\tif(pDM_SWAT_Table->try_flag == 0xff)\n\t{\n\t\t// Select RSSI checking target\n\t\tif(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))\n\t\t{\n\t\t\t// Target: Infrastructure mode AP.\n\t\t\tpHalData->RSSI_target = NULL;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"odm_PathDivMechanism(): RSSI_target is DEF AP!\\n\"));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tu1Byte\t\t\tindex = 0;\n\t\t\tPRT_WLAN_STA\tpEntry = NULL;\n\t\t\tPADAPTER\t\tpTargetAdapter = NULL;\n\t\t\n\t\t\tif(\tpMgntInfo->mIbss || ACTING_AS_AP(Adapter) )\n\t\t\t{\n\t\t\t\t// Target: AP/IBSS peer.\n\t\t\t\tpTargetAdapter = Adapter;\n\t\t\t}\n\t\t\telse if(IsAPModeExist(Adapter)  && GetFirstExtAdapter(Adapter) != NULL)\n\t\t\t{\n\t\t\t\t// Target: VWIFI peer.\n\t\t\t\tpTargetAdapter = GetFirstExtAdapter(Adapter);\n\t\t\t}\n\n\t\t\tif(pTargetAdapter != NULL)\n\t\t\t{\n\t\t\t\tfor(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)\n\t\t\t\t{\n\t\t\t\t\tpEntry = AsocEntry_EnumStation(pTargetAdapter, index);\n\t\t\t\t\tif(pEntry != NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(pEntry->bAssociated)\n\t\t\t\t\t\t\tbreak;\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(pEntry == NULL)\n\t\t\t{\n\t\t\t\tODM_PathDivRestAfterLink(pDM_Odm);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"odm_SwAntDivChkAntSwitch(): No Link.\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpHalData->RSSI_target = pEntry;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\\n\"));\n\t\t\t}\n\t\t}\n\t\t\t\n\t\tpHalData->RSSI_cnt_A = 0;\n\t\tpHalData->RSSI_cnt_B = 0;\n\t\tpDM_SWAT_Table->try_flag = 0;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\\n\"));\n\t\treturn;\n\t}\n\telse\n\t{\n\t       // 1st step\n\t\tcurTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;\n\t\tcurRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;\n\t\tlastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\n\t\tlastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\n\t\n\t\tif(pDM_SWAT_Table->try_flag == 1)   // Training State\n\t\t{\n\t\t\tif(pDM_SWAT_Table->CurAntenna == MAIN_ANT)\n\t\t\t{\n\t\t\t\tTXByteCnt_A += curTxOkCnt;\n\t\t\t\tRXByteCnt_A += curRxOkCnt;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tTXByteCnt_B += curTxOkCnt;\n\t\t\t\tRXByteCnt_B += curRxOkCnt;\n\t\t\t}\n\t\t\n\t\t\tnextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;\n\t\t\tpDM_SWAT_Table->RSSI_Trying--;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: RSSI_Trying = %d\\n\",pDM_SWAT_Table->RSSI_Trying));\n\t\t\tif(pDM_SWAT_Table->RSSI_Trying == 0)\n\t\t\t{\n\t\t\t\tCurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);\n\t\t\t\tPreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);\n\t\t\t\t\n\t\t\t\tif(TrafficLoad == TRAFFIC_HIGH)\n\t\t\t\t{\n\t\t\t\t\t//CurByteCnt = PlatformDivision64(CurByteCnt, 9);\n\t\t\t\t\tPreByteCnt =PreByteCnt*9;\n\t\t\t\t}\n\t\t\t\telse if(TrafficLoad == TRAFFIC_LOW)\n\t\t\t\t{\n\t\t\t\t\t//CurByteCnt = PlatformDivision64(CurByteCnt, 2);\n\t\t\t\t\tPreByteCnt =PreByteCnt*2;\n\t\t\t\t}\n\t\t\t\tif(pHalData->RSSI_cnt_A > 0)\n\t\t\t\t\tRSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; \n\t\t\t\telse\n\t\t\t\t\tRSSI_A = 0;\n\t\t\t\tif(pHalData->RSSI_cnt_B > 0)\n\t\t\t\t\tRSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; \n\t\t             else\n\t\t\t\t\tRSSI_B = 0;\n\t\t\t\tcurRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;\n\t\t\t\tpDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: PreRSSI = %d, CurRSSI = %d\\n\",pDM_SWAT_Table->PreRSSI, curRSSI));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: preAntenna= %s, curAntenna= %s \\n\", \n\t\t\t\t(pDM_SWAT_Table->PreAntenna == MAIN_ANT?\"MAIN\":\"AUX\"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?\"MAIN\":\"AUX\")));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\\n\",\n\t\t\t\t\tRSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));\n\t\t\t}\n\n\t\t}\n\t\telse   // try_flag=0\n\t\t{\n\t\t\n\t\t\tif(pHalData->RSSI_cnt_A > 0)\n\t\t\t\tRSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A; \n\t\t\telse\n\t\t\t\tRSSI_A = 0;\n\t\t\tif(pHalData->RSSI_cnt_B > 0)\n\t\t\t\tRSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B; \n\t\t\telse\n\t\t\t\tRSSI_B = 0;\t\n\t\t\tcurRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;\n\t\t\tpDM_SWAT_Table->PreRSSI =  (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: PreRSSI = %d, CurRSSI = %d\\n\", pDM_SWAT_Table->PreRSSI, curRSSI));\n\t\t       ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: preAntenna= %s, curAntenna= %s \\n\", \n\t\t\t(pDM_SWAT_Table->PreAntenna == MAIN_ANT?\"MAIN\":\"AUX\"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?\"MAIN\":\"AUX\")));\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\\n\",\n\t\t\t\tRSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));\n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"Ekul:curTxOkCnt = %d\\n\", curTxOkCnt));\n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"Ekul:curRxOkCnt = %d\\n\", curRxOkCnt));\n\t\t}\n\n\t\t//1 Trying State\n\t\tif((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))\n\t\t{\n\n\t\t\tif(pDM_SWAT_Table->TestMode == TP_MODE)\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: TestMode = TP_MODE\"));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH= TRY:CurByteCnt = %\"i64fmt\"d,\", CurByteCnt));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH= TRY:PreByteCnt = %\"i64fmt\"d\\n\",PreByteCnt));\t\t\n\t\t\t\tif(CurByteCnt < PreByteCnt)\n\t\t\t\t{\n\t\t\t\t\tif(pDM_SWAT_Table->CurAntenna == MAIN_ANT)\n\t\t\t\t\t\tpDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(pDM_SWAT_Table->CurAntenna == MAIN_ANT)\n\t\t\t\t\t\tpDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;\n\t\t\t\t\telse\n\t\t\t\t\t\tpDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;\n\t\t\t\t}\n\t\t\t\tfor (i= 0; i<8; i++)\n\t\t\t\t{\n\t\t\t\t\tif(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)\n\t\t\t\t\t\tScore_A++;\n\t\t\t\t\telse\n\t\t\t\t\t\tScore_B++;\n\t\t\t\t}\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"SelectAntennaMap=%x\\n \",pDM_SWAT_Table->SelectAntennaMap));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Score_A=%d, Score_B=%d\\n\", Score_A, Score_B));\n\t\t\t\n\t\t\t\tif(pDM_SWAT_Table->CurAntenna == MAIN_ANT)\n\t\t\t\t{\n\t\t\t\t\tnextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;\n\t\t\t\t}\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: nextAntenna=%s\\n\",(nextAntenna==MAIN_ANT)?\"MAIN\":\"AUX\"));\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: preAntenna= %s, curAntenna= %s \\n\", \n\t\t\t\t(pDM_SWAT_Table->PreAntenna == MAIN_ANT?\"MAIN\":\"AUX\"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?\"MAIN\":\"AUX\")));\n\n\t\t\t\tif(nextAntenna != pDM_SWAT_Table->CurAntenna)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Switch back to another antenna\"));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: current anntena is good\\n\"));\n\t\t\t\t}\t\n\t\t\t}\n\n                    \n\t\t\tif(pDM_SWAT_Table->TestMode == RSSI_MODE)\n\t\t\t{\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: TestMode = RSSI_MODE\"));\n\t\t\t\tpDM_SWAT_Table->SelectAntennaMap=0xAA;\n\t\t\t\tif(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna\n\t\t\t\t{\n\t\t\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"SWAS: Switch back to another antenna\"));\n\t\t\t\t\tnextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;\n\t\t\t\t}\n\t\t\t\telse // current anntena is good\n\t\t\t\t{\n\t\t\t\t\tnextAntenna =pDM_SWAT_Table->CurAntenna;\n\t\t\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"SWAS: current anntena is good\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tpDM_SWAT_Table->try_flag = 0;\n\t\t\tpHalData->RSSI_test = FALSE;\n\t\t\tpHalData->RSSI_sum_A = 0;\n\t\t\tpHalData->RSSI_cnt_A = 0;\n\t\t\tpHalData->RSSI_sum_B = 0;\n\t\t\tpHalData->RSSI_cnt_B = 0;\n\t\t\tTXByteCnt_A = 0;\n\t\t\tTXByteCnt_B = 0;\n\t\t\tRXByteCnt_A = 0;\n\t\t\tRXByteCnt_B = 0;\n\t\t\t\n\t\t}\n\n\t\t//1 Normal State\n\t\telse if(pDM_SWAT_Table->try_flag == 0)\n\t\t{\n\t\t\tif(TrafficLoad == TRAFFIC_HIGH)\n\t\t\t{\n\t\t\t\tif ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)\n\t\t\t\t\tTrafficLoad = TRAFFIC_HIGH;\n\t\t\t\telse\n\t\t\t\t\tTrafficLoad = TRAFFIC_LOW;\n\t\t\t}\n\t\t\telse if(TrafficLoad == TRAFFIC_LOW)\n\t\t\t\t{\n\t\t\t\tif ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)\n\t\t\t\t\tTrafficLoad = TRAFFIC_HIGH;\n\t\t\t\telse\n\t\t\t\t\tTrafficLoad = TRAFFIC_LOW;\n\t\t\t}\n\t\t\tif(TrafficLoad == TRAFFIC_HIGH)\n\t\t\t\tpDM_SWAT_Table->bTriggerAntennaSwitch = 0;\n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"Normal:TrafficLoad = %llu\\n\", curTxOkCnt+curRxOkCnt));\n\n\t\t\t//Prepare To Try Antenna\t\t\n\t\t\t\tnextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;\n\t\t\t\tpDM_SWAT_Table->try_flag = 1;\n\t\t\t\tpHalData->RSSI_test = TRUE;\n\t\t\tif((curRxOkCnt+curTxOkCnt) > 1000)\n\t\t\t{\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t                    pDM_SWAT_Table->RSSI_Trying = 4;                           \n#else\n\t                    pDM_SWAT_Table->RSSI_Trying = 2;\n#endif\n\t\t\t\tpDM_SWAT_Table->TestMode = TP_MODE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpDM_SWAT_Table->RSSI_Trying = 2;\n\t\t\t\tpDM_SWAT_Table->TestMode = RSSI_MODE;\n\n\t\t\t}\n                          \n\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"SWAS: Normal State -> Begin Trying!\\n\"));\t\t\t\n\t\t\tpHalData->RSSI_sum_A = 0;\n\t\t\tpHalData->RSSI_cnt_A = 0;\n\t\t\tpHalData->RSSI_sum_B = 0;\n\t\t\tpHalData->RSSI_cnt_B = 0;\n\t\t} // end of try_flag=0\n\t}\n\t\n\t//1 4.Change TRX antenna\n\tif(nextAntenna != pDM_SWAT_Table->CurAntenna)\n\t{\n\t\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Change TX Antenna!\\n \"));\n\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C\n\t\tif(nextAntenna==MAIN_ANT)\n\t\t{\n\t\t    ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Next Antenna is RF PATH A\\n \"));\n\t\t    pathdiv_para = 0x02;   //02 to switchback to RF path A\n\t\t    fw_value = 0x03;\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n                 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);\n#else\n                 ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));\t\n#endif\n\t\t}\t\n\t       else if(nextAntenna==AUX_ANT)\n\t       {\n\t           ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Next Antenna is RF PATH B\\n \"));\n\t           if(switchfirsttime==0)  // First Time To Enter Path Diversity\n\t           {\n\t               switchfirsttime=0x01;\n                      pathdiv_para = 0x00;\n\t\t\t  fw_value=0x00;    // to backup RF Path A Releated Registers\t\t  \n\t\t\t\t\t  \n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);\n#else\n                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));\t\n                     //for(u1Byte n=0; n<80,n++)\n                     //{\n                     //delay_us(500);\n\t\t\t  ODM_delay_ms(500);\n                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);\n\t\t\t \t\t \n\t\t\t fw_value=0x01;   \t// to backup RF Path A Releated Registers\t\t \n                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));\t\n#endif\t\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: FIRST TIME To DO PATH SWITCH!\\n \"));\t\n\t           }\t\t   \n\t\t    else\n\t\t    {\n\t\t        pathdiv_para = 0x01;\n\t\t\t fw_value = 0x02;\t\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n                     odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);\n#else\n                     ODM_FillH2CCmd(pDM_Odm, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));\t\n#endif\t\n\t\t    }\t\t\n\t       }\n           //   odm_PathDiversity_8192D(Adapter, pathdiv_para);\n\t}\n\n\t//1 5.Reset Statistics\n\tpDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\n\tpDM_SWAT_Table->CurAntenna = nextAntenna;\n\tpDM_SWAT_Table->PreRSSI = curRSSI;\n\n\t//1 6.Set next timer\n\n\tif(pDM_SWAT_Table->RSSI_Trying == 0)\n\t\treturn;\n\n\tif(pDM_SWAT_Table->RSSI_Trying%2 == 0)\n\t{\n\t\tif(pDM_SWAT_Table->TestMode == TP_MODE)\n\t\t{\n\t\t\tif(TrafficLoad == TRAFFIC_HIGH)\n\t\t\t{\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Test another antenna for 10 ms\\n\"));\n#else\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Test another antenna for 20 ms\\n\"));\n#endif\t\t\t\t\n\t\t\t}\n\t\t\telse if(TrafficLoad == TRAFFIC_LOW)\n\t\t\t{\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Test another antenna for 50 ms\\n\"));\n\t\t\t}\n\t\t}\n\t\telse   // TestMode == RSSI_MODE\n\t\t{\n\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Test another antenna for 500 ms\\n\"));\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(pDM_SWAT_Table->TestMode == TP_MODE)\n\t\t{\n\t\t\tif(TrafficLoad == TRAFFIC_HIGH)\n\t\t\t\t\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms\n\t\t\t\t//ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (\"=PATH=: Test another antenna for 90 ms\\n\"));\n#else\t\t\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms\n#endif\t\t\t\t\n\t\t\telse if(TrafficLoad == TRAFFIC_LOW)\n\t\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms\n\t\t}\n\t\telse\n\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms\n\t}\n}\n\n\n\nVOID\nODM_CCKPathDiversityChkPerPktRssi(\n\tPADAPTER\t\tAdapter,\n\tBOOLEAN\t\t\tbIsDefPort,\n\tBOOLEAN\t\t\tbMatchBSSID,\n\tPRT_WLAN_STA\tpEntry,\n\tPRT_RFD\t\t\tpRfd,\n\tpu1Byte\t\t\tpDesc\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tBOOLEAN\t\t\tbCount = FALSE;\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\t//BOOLEAN\tisCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);\n#if DEV_BUS_TYPE != RT_SDIO_INTERFACE\n\tBOOLEAN\tisCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);\n#else  //below code would be removed if we have verified SDIO\n\tBOOLEAN\tisCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);\n#endif\n\n\tif((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))\n\t\treturn;\n\t\t\n\tif(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)\n\t\tbCount = TRUE;\n\telse if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)\n\t\tbCount = TRUE;\n\n\tif(bCount && isCCKrate)\n\t{\n\t\tif(pDM_PDTable->TrainingState == 1 )\n\t\t{\n\t\t\tif(pEntry)\n\t\t\t{\n\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)\n\t\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;\n\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)\n\t\t\t\t\tpDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;\n\t\t\t\tpDM_PDTable->RSSI_CCK_Path_cnt[0]++;\n\t\t\t}\n\t\t}\n\t\telse if(pDM_PDTable->TrainingState == 2 )\n\t\t{\n\t\t\tif(pEntry)\n\t\t\t{\n\t\t\t\tif(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)\n\t\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;\n\t\t\t\tpEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)\n\t\t\t\t\tpDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;\n\t\t\t\tpDM_PDTable->RSSI_CCK_Path_cnt[1]++;\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\n\n//Neil Chen---2011--06--22\n//----92D Path Diversity----//\n//#ifdef PathDiv92D\n//==================================\n//3 Path Diversity \n//==================================\n//\n// 20100514 Luke/Joseph:\n// Add new function for antenna diversity after link.\n// This is the main function of antenna diversity after link.\n// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().\n// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.\n// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.\n// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just\n// listened on the air with the RSSI of original antenna.\n// It chooses the antenna with better RSSI.\n// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting \n// penalty to get next try.\n//\n//\n// 20100503 Joseph:\n// Add new function SwAntDivCheck8192C().\n// This is the main function of Antenna diversity function before link.\n// Mainly, it just retains last scan result and scan again.\n// After that, it compares the scan result to see which one gets better RSSI.\n// It selects antenna with better receiving power and returns better scan result.\n//\n\n\n//\n// 20100514 Luke/Joseph:\n// This function is used to gather the RSSI information for antenna testing.\n// It selects the RSSI of the peer STA that we want to know.\n//\nVOID\nODM_PathDivChkPerPktRssi(\n\tPADAPTER\t\tAdapter,\n\tBOOLEAN\t\t\tbIsDefPort,\n\tBOOLEAN\t\t\tbMatchBSSID,\n\tPRT_WLAN_STA\tpEntry,\n\tPRT_RFD\t\t\tpRfd\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n\tBOOLEAN\t\t\tbCount = FALSE;\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\n\tif(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)\n\t\tbCount = TRUE;\n\telse if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)\n\t\tbCount = TRUE;\n\n\tif(bCount)\n\t{\n\t\t//1 RSSI for SW Antenna Switch\n\t\tif(pDM_SWAT_Table->CurAntenna == MAIN_ANT)\n\t\t{\n\t\t\tpHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;\n\t\t\tpHalData->RSSI_cnt_A++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;\n\t\t\tpHalData->RSSI_cnt_B++;\n\n\t\t}\n\t}\n}\n\n\n//\n// 20100514 Luke/Joseph:\n// Add new function to reset antenna diversity state after link.\n//\nVOID\nODM_PathDivRestAfterLink(\n\tIN\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tPADAPTER\t\tAdapter=pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tpSWAT_T\t\t\tpDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\n\tpHalData->RSSI_cnt_A = 0;\n\tpHalData->RSSI_cnt_B = 0;\n\tpHalData->RSSI_test = FALSE;\n\tpDM_SWAT_Table->try_flag = 0x0;       // NOT 0xff\n\tpDM_SWAT_Table->RSSI_Trying = 0;\n\tpDM_SWAT_Table->SelectAntennaMap=0xAA;\n\tpDM_SWAT_Table->CurAntenna = MAIN_ANT;  \n}\n\n\n//==================================================\n//3 PathDiv End\n//==================================================\n\n\nVOID\nODM_FillTXPathInTXDESC(\n\t\tIN\tPADAPTER\tAdapter,\n\t\tIN\tPRT_TCB\t\tpTcb,\n\t\tIN\tpu1Byte\t\tpDesc\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu4Byte\tTXPath;\n\tpPD_T\tpDM_PDTable = &Adapter->DM_PDTable;\n\n\t//2011.09.05  Add by Luke Lee for path diversity\n\tif(pHalData->PathDivCfg == 1)\n\t{\t\n\t\tTXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;\n\t\t//RT_TRACE(\tCOMP_INIT, DBG_LOUD, (\"Fill TXDESC: macID=%d, TXPath=%d\\n\", pTcb->macId, TXPath));\n\t\t//SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);\n\t\tif(TXPath == 0)\n\t\t{\n\t\t\tSET_TX_DESC_TX_ANTL_92C(pDesc,1);\n\t\t\tSET_TX_DESC_TX_ANT_HT_92C(pDesc,1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSET_TX_DESC_TX_ANTL_92C(pDesc,2);\n\t\t\tSET_TX_DESC_TX_ANT_HT_92C(pDesc,2);\n\t\t}\n\t\tTXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;\n\t\tif(TXPath == 0)\n\t\t{\n\t\t\tSET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);\n\t\t}\n\t}\n}\n\n//Only for MP //Neil Chen--2012--0502--\nVOID\nodm_PathDivInit_92D(\nIN\tPDM_ODM_T \tpDM_Odm)\n{\n\tpPATHDIV_PARA\tpathIQK = &pDM_Odm->pathIQK;\n\n\tpathIQK->org_2g_RegC14=0x0;\n\tpathIQK->org_2g_RegC4C=0x0;\n\tpathIQK->org_2g_RegC80=0x0;\n\tpathIQK->org_2g_RegC94=0x0;\n\tpathIQK->org_2g_RegCA0=0x0;\n\tpathIQK->org_5g_RegC14=0x0;\n\tpathIQK->org_5g_RegCA0=0x0;\n\tpathIQK->org_5g_RegE30=0x0;\n\tpathIQK->swt_2g_RegC14=0x0;\n\tpathIQK->swt_2g_RegC4C=0x0;\n\tpathIQK->swt_2g_RegC80=0x0;\n\tpathIQK->swt_2g_RegC94=0x0;\n\tpathIQK->swt_2g_RegCA0=0x0;\n\tpathIQK->swt_5g_RegC14=0x0;\n\tpathIQK->swt_5g_RegCA0=0x0;\n\tpathIQK->swt_5g_RegE30=0x0;\n\n}\n\n\nu1Byte\nodm_SwAntDivSelectScanChnl(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tu2Byte \t\t\t\ti;\n\tu1Byte\t\t\t\tj, ScanChannel = 0, ChannelNum = 0;\n\tPRT_CHANNEL_LIST\tpChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);\n\tu1Byte \t\t\t\tEachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};\n\n\tif(pMgntInfo->tmpNumBssDesc == 0)\n\t\treturn 0;\n\n\tfor(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)\n\t{\t\t\n\t\tChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;\n\t\tfor(j = 0; j < pChannelList->ChannelLen; j++)\n\t\t{\n\t\t\tif(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)\n\t\t\t{\n\t\t\t\tEachChannelSTAs[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfor(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)\n\t\t{\n\t\tif(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])\n\t\t\tScanChannel = (u1Byte)i;\n\t\t}\n\n\tif(EachChannelSTAs[ScanChannel] == 0)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, (\"odm_SwAntDivSelectScanChnl(): Scan List is empty.\\n\"));\n\t\treturn 0;\n\t}\n\t\n\tScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;\n\n\t\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, \n\t\t(\"odm_SwAntDivSelectScanChnl(): Channel (( %d )) is select as scan channel.\\n\", ScanChannel));\n\n\treturn ScanChannel;\n#else\n\treturn\t0;\n#endif\t\n}\n\n\nVOID\nodm_SwAntDivConstructScanChnl(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu1Byte\t\tScanChnl\n\t)\n{\n\n\tPMGNT_INFO\t\t\tpMgntInfo = &Adapter->MgntInfo;\n\n\tif(ScanChnl == 0)\n\t{\n\t\tu1Byte\t\t\t\ti;\t\t\n\t\tPRT_CHANNEL_LIST\tpChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);\n\t\n\t\t// 20100519 Joseph: Original antenna scanned nothing. \n\t\t// Test antenna shall scan all channel with half period in this condition.\n\n\t\tRT_TRACE_F(COMP_SCAN, DBG_TRACE, (\" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \\n\", ScanChnl));\n\n\t\tRtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);\n\t\tfor(i = 0; i < pChannelList->ChannelLen; i++)\n\t\t\tpChannelList->ChnlListEntry[i].ScanPeriod /= 2;\n\t}\n\telse\n\t{\n\t\t// The using of this CustomizedScanRequest is a trick to rescan the two channels \n\t\t//\tunder the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.\n\t\tCUSTOMIZED_SCAN_REQUEST CustomScanReq;\n\n\t\tCustomScanReq.bEnabled = TRUE;\n\t\tCustomScanReq.Channels[0] = ScanChnl;\n\t\tCustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;\n\t\tCustomScanReq.nChannels = 2;\n\t\tCustomScanReq.ScanType = SCAN_ACTIVE;\n\t\tCustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;\n\n\t\tRT_TRACE_F(COMP_SCAN, DBG_TRACE, (\" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \\n\", ScanChnl));\n\n\t\tRtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);\n\t}\n\n}\n#else\n\nVOID\nodm_PathDivChkAntSwitchCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n}\n\nVOID\nodm_PathDivChkAntSwitchWorkitemCallback(\n    IN PVOID            pContext\n    )\n{\n}\n\nVOID\nodm_CCKTXPathDiversityCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n}\n\nVOID\nodm_CCKTXPathDiversityWorkItemCallback(\n    IN PVOID            pContext\n    )\n{\n}\nu1Byte\nodm_SwAntDivSelectScanChnl(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\treturn\t0;\n}\nVOID\nodm_SwAntDivConstructScanChnl(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu1Byte\t\tScanChnl\n\t)\n{\n}\n\n\n#endif\n\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n"
  },
  {
    "path": "hal/phydm/phydm_pathdiv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMPATHDIV_H__\n#define    __PHYDMPATHDIV_H__\n/*#define PATHDIV_VERSION \"2.0\" //2014.11.04*/\n#define PATHDIV_VERSION\t\"3.0\" /*2015.01.13 Dino*/\n\n#if(defined(CONFIG_PATH_DIVERSITY))\n#define USE_PATH_A_AS_DEFAULT_ANT   //for 8814 dynamic TX path selection\n\n#define\tNUM_RESET_DTP_PERIOD 5\n#define\tANT_DECT_RSSI_TH 3 \n\n#define PATH_A 1\n#define PATH_B 2\n#define PATH_C 3\n#define PATH_D 4\n\n#define PHYDM_AUTO_PATH\t0\n#define PHYDM_FIX_PATH\t\t1\n\n#define NUM_CHOOSE2_FROM4 6\n#define NUM_CHOOSE3_FROM4 4\n\n\n#define\t\tPHYDM_A\t\t BIT0\n#define\t\tPHYDM_B\t\t BIT1\n#define\t\tPHYDM_C\t\t BIT2\n#define\t\tPHYDM_D\t\t BIT3\n#define\t\tPHYDM_AB\t (BIT0 | BIT1)  // 0\n#define\t\tPHYDM_AC\t (BIT0 | BIT2)  // 1\n#define\t\tPHYDM_AD\t (BIT0 | BIT3)  // 2\n#define\t\tPHYDM_BC\t (BIT1 | BIT2)  // 3\n#define\t\tPHYDM_BD\t (BIT1 | BIT3)  // 4\n#define\t\tPHYDM_CD\t (BIT2 | BIT3)  // 5\n\n#define\t\tPHYDM_ABC\t (BIT0 | BIT1 | BIT2) /* 0*/\n#define\t\tPHYDM_ABD\t (BIT0 | BIT1 | BIT3) /* 1*/\n#define\t\tPHYDM_ACD\t (BIT0 | BIT2 | BIT3) /* 2*/\n#define\t\tPHYDM_BCD\t (BIT1 | BIT2 | BIT3) /* 3*/\n\n#define\t\tPHYDM_ABCD\t (BIT0 | BIT1 | BIT2 | BIT3)\n\n\ntypedef enum dtp_state\n{\n\tPHYDM_DTP_INIT=1,\n\tPHYDM_DTP_RUNNING_1\n\n}PHYDM_DTP_STATE;\n\ntypedef enum path_div_type\n{\n\tPHYDM_2R_PATH_DIV = 1,\n\tPHYDM_4R_PATH_DIV = 2\n}PHYDM_PATH_DIV_TYPE;\n\nVOID\nphydm_process_rssi_for_path_div(\t\n\tIN OUT\t\tPVOID\t\t\tpDM_VOID,\t\n\tIN\t\t\tPVOID\t\t\tp_phy_info_void,\n\tIN\t\t\tPVOID\t\t\tp_pkt_info_void\n\t);\n\ntypedef struct _ODM_PATH_DIVERSITY_\n{\n\tu1Byte\tRespTxPath;\n\tu1Byte\tPathSel[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tPathA_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu4Byte\tPathB_Sum[ODM_ASSOCIATE_ENTRY_NUM];\n\tu2Byte\tPathA_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu2Byte\tPathB_Cnt[ODM_ASSOCIATE_ENTRY_NUM];\n\tu1Byte\tpath_div_type;\n  #if RTL8814A_SUPPORT\n\t\n\tu4Byte\tpath_a_sum_all;\n\tu4Byte\tpath_b_sum_all;\n\tu4Byte\tpath_c_sum_all;\n\tu4Byte\tpath_d_sum_all;\n\n\tu4Byte\tpath_a_cnt_all;\n\tu4Byte\tpath_b_cnt_all;\n\tu4Byte\tpath_c_cnt_all;\n\tu4Byte\tpath_d_cnt_all;\n\t\n\tu1Byte\tdtp_period;\n\tBOOLEAN\tbBecomeLinked;\n\tBOOLEAN\tis_u3_mode;\n\tu1Byte\tnum_tx_path;\n\tu1Byte\tdefault_path;\n\tu1Byte\tnum_candidate;\n\tu1Byte\tant_candidate_1;\n\tu1Byte\tant_candidate_2;\n\tu1Byte\tant_candidate_3;\n\tu1Byte     dtp_state;\n\tu1Byte\tdtp_check_patha_counter;\n\tBOOLEAN\tfix_path_bfer;\n\tu1Byte\tsearch_space_2[NUM_CHOOSE2_FROM4];\n\tu1Byte\tsearch_space_3[NUM_CHOOSE3_FROM4];\n\t\n\tu1Byte\tpre_tx_path;\n\tu1Byte\tuse_path_a_as_default_ant;\n\tBOOLEAN is_pathA_exist;\n\n  #endif\n}PATHDIV_T, *pPATHDIV_T;\n\n\n#endif //#if(defined(CONFIG_PATH_DIVERSITY))\n\nVOID\nphydm_c2h_dtp_handler(\n\t IN\tPVOID\tpDM_VOID,\n\t IN \tpu1Byte   CmdBuf,\n\t IN \tu1Byte\tCmdLen\n\t);\n\nVOID\nodm_PathDiversityInit(\n\tIN\tPVOID\tpDM_VOID\n\t);\n\nVOID\nodm_PathDiversity(\n\tIN\tPVOID\tpDM_VOID\n\t);\n\nVOID\nodm_pathdiv_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value,\n\tIN\t\tu4Byte\t\t*_used,\n\tOUT\t\tchar\t\t*output,\n\tIN\t\tu4Byte\t\t*_out_len\n\t);\n\n\n\n//1 [OLD IC]--------------------------------------------------------------------------------\n\n\n\n\n\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \n\n//#define   PATHDIV_ENABLE \t 1\n#define dm_PathDiv_RSSI_Check\tODM_PathDivChkPerPktRssi\n#define PathDivCheckBeforeLink8192C\tODM_PathDiversityBeforeLink92C\n\n\n\n\ntypedef struct _PathDiv_Parameter_define_\n{\n\tu4Byte org_5g_RegE30;\n\tu4Byte org_5g_RegC14;\n\tu4Byte org_5g_RegCA0;\n\tu4Byte swt_5g_RegE30;\n\tu4Byte swt_5g_RegC14;\n\tu4Byte swt_5g_RegCA0;\n\t//for 2G IQK information\n\tu4Byte org_2g_RegC80;\n\tu4Byte org_2g_RegC4C;\n\tu4Byte org_2g_RegC94;\n\tu4Byte org_2g_RegC14;\n\tu4Byte org_2g_RegCA0;\n\n\tu4Byte swt_2g_RegC80;\n\tu4Byte swt_2g_RegC4C;\n\tu4Byte swt_2g_RegC94;\n\tu4Byte swt_2g_RegC14;\n\tu4Byte swt_2g_RegCA0;\n}PATHDIV_PARA,*pPATHDIV_PARA;\n\nVOID\t\nodm_PathDiversityInit_92C(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\t\nodm_2TPathDiversityInit_92C(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\t\nodm_1TPathDiversityInit_92C(\t\n\tIN\tPADAPTER\tAdapter\n\t);\n\nBOOLEAN\nodm_IsConnected_92C(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nBOOLEAN \nODM_PathDiversityBeforeLink92C(\n\t//IN\tPADAPTER\tAdapter\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\nVOID\t\nodm_PathDiversityAfterLink_92C(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\nodm_SetRespPath_92C(\t\n\tIN\tPADAPTER\tAdapter, \t\n\tIN\tu1Byte\tDefaultRespPath\n\t);\n\nVOID\t\nodm_OFDMTXPathDiversity_92C(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\t\nodm_CCKTXPathDiversity_92C(\t\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\t\nodm_ResetPathDiversity_92C(\t\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\nodm_CCKTXPathDiversityCallback(\n\tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nodm_CCKTXPathDiversityWorkItemCallback(\n\tIN PVOID            pContext\n\t);\n\nVOID\nodm_PathDivChkAntSwitchCallback(\n\tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nodm_PathDivChkAntSwitchWorkitemCallback(\n\tIN PVOID            pContext\n\t);\n\n\nVOID \nodm_PathDivChkAntSwitch(\n\tPDM_ODM_T    pDM_Odm\n\t);\n\nVOID\nODM_CCKPathDiversityChkPerPktRssi(\n\tPADAPTER\t\tAdapter,\n\tBOOLEAN\t\t\tbIsDefPort,\n\tBOOLEAN\t\t\tbMatchBSSID,\n\tPRT_WLAN_STA\tpEntry,\n\tPRT_RFD\t\t\tpRfd,\n\tpu1Byte\t\t\tpDesc\n\t);\n\nVOID \nODM_PathDivChkPerPktRssi(\n\tPADAPTER\t\tAdapter,\n\tBOOLEAN\t\t\tbIsDefPort,\n\tBOOLEAN\t\t\tbMatchBSSID,\n\tPRT_WLAN_STA\tpEntry,\n\tPRT_RFD\t\t\tpRfd\t\n\t);\n\nVOID\nODM_PathDivRestAfterLink(\n\tIN\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\nVOID\nODM_FillTXPathInTXDESC(\n\t\tIN\tPADAPTER\tAdapter,\n\t\tIN\tPRT_TCB\t\tpTcb,\n\t\tIN\tpu1Byte\t\tpDesc\n\t);\n\nVOID\nodm_PathDivInit_92D(\n\tIN\tPDM_ODM_T \tpDM_Odm\n\t);\n\nu1Byte\nodm_SwAntDivSelectScanChnl(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\nodm_SwAntDivConstructScanChnl(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu1Byte\t\tScanChnl\n\t);\n\t\n #endif       //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \n \n \n #endif\t\t //#ifndef  __ODMPATHDIV_H__\n\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_ap.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if !defined(_OUTSRC_COEXIST)\n//============================================================\n// Global var\n//============================================================\n\n\nu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE_92D] = {\n\t0x0b40002d, // 0,  -15.0dB\t\n\t0x0c000030, // 1,  -14.5dB\n\t0x0cc00033, // 2,  -14.0dB\n\t0x0d800036, // 3,  -13.5dB\n\t0x0e400039, // 4,  -13.0dB    \n\t0x0f00003c, // 5,  -12.5dB\n\t0x10000040, // 6,  -12.0dB\n\t0x11000044, // 7,  -11.5dB\n\t0x12000048, // 8,  -11.0dB\n\t0x1300004c, // 9,  -10.5dB\n\t0x14400051, // 10, -10.0dB\n\t0x15800056, // 11, -9.5dB\n\t0x16c0005b, // 12, -9.0dB\n\t0x18000060, // 13, -8.5dB\n\t0x19800066, // 14, -8.0dB\n\t0x1b00006c, // 15, -7.5dB\n\t0x1c800072, // 16, -7.0dB\n\t0x1e400079, // 17, -6.5dB\n\t0x20000080, // 18, -6.0dB\n\t0x22000088, // 19, -5.5dB\n\t0x24000090, // 20, -5.0dB\n\t0x26000098, // 21, -4.5dB\n\t0x288000a2, // 22, -4.0dB\n\t0x2ac000ab, // 23, -3.5dB\n\t0x2d4000b5, // 24, -3.0dB\n\t0x300000c0, // 25, -2.5dB\n\t0x32c000cb, // 26, -2.0dB\n\t0x35c000d7, // 27, -1.5dB\n\t0x390000e4, // 28, -1.0dB\n\t0x3c8000f2, // 29, -0.5dB\n\t0x40000100, // 30, +0dB\n\t0x43c0010f, // 31, +0.5dB\n\t0x47c0011f, // 32, +1.0dB\n\t0x4c000130, // 33, +1.5dB\n\t0x50800142, // 34, +2.0dB\n\t0x55400155, // 35, +2.5dB\n\t0x5a400169, // 36, +3.0dB\n\t0x5fc0017f, // 37, +3.5dB\n\t0x65400195, // 38, +4.0dB\n\t0x6b8001ae, // 39, +4.5dB\n\t0x71c001c7, // 40, +5.0dB\n\t0x788001e2, // 41, +5.5dB\n\t0x7f8001fe  // 42, +6.0dB\n};               \n\nu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 14, -9.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 18, -7.0dB \n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 19, -6.5dB\n    \t{0x1c, 0x1a, 0x18, 0x12, 0x0e, 0x08, 0x04, 0x02},\t// 20, -6.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 22, -5.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 24, -4.0dB \n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 25, -3.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 26, -3.0dB\n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 28, -2.0dB \n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 30, -1.0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 31, -0.5dB\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} \t// 32, +0dB\n};                                                                  \n\n\nu1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 14, -9.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 18, -7.0dB  \n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 19, -6.5dB \n\t{0x1c, 0x1a, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 20, -6.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 22, -5.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 24, -4.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 25, -3.5dB  \n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 26, -3.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 28, -2.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 30, -1.0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 31, -0.5dB \n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} \t// 32, +0dB\t\n};\n\nu4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D] = {\n\t0x0b40002d, // 0,  -15.0dB\t\n\t0x0c000030, // 1,  -14.5dB\n\t0x0cc00033, // 2,  -14.0dB\n\t0x0d800036, // 3,  -13.5dB\n\t0x0e400039, // 4,  -13.0dB    \n\t0x0f00003c, // 5,  -12.5dB\n\t0x10000040, // 6,  -12.0dB\n\t0x11000044, // 7,  -11.5dB\n\t0x12000048, // 8,  -11.0dB\n\t0x1300004c, // 9,  -10.5dB\n\t0x14400051, // 10, -10.0dB\n\t0x15800056, // 11, -9.5dB\n\t0x16c0005b, // 12, -9.0dB\n\t0x18000060, // 13, -8.5dB\n\t0x19800066, // 14, -8.0dB\n\t0x1b00006c, // 15, -7.5dB\n\t0x1c800072, // 16, -7.0dB\n\t0x1e400079, // 17, -6.5dB\n\t0x20000080, // 18, -6.0dB\n\t0x22000088, // 19, -5.5dB\n\t0x24000090, // 20, -5.0dB\n\t0x26000098, // 21, -4.5dB\n\t0x288000a2, // 22, -4.0dB\n\t0x2ac000ab, // 23, -3.5dB\n\t0x2d4000b5, // 24, -3.0dB\n\t0x300000c0, // 25, -2.5dB\n\t0x32c000cb, // 26, -2.0dB\n\t0x35c000d7, // 27, -1.5dB\n\t0x390000e4, // 28, -1.0dB\n\t0x3c8000f2, // 29, -0.5dB\n\t0x40000100, // 30, +0dB\n\t0x43c0010f, // 31, +0.5dB\n\t0x47c0011f, // 32, +1.0dB\n\t0x4c000130, // 33, +1.5dB\n\t0x50800142, // 34, +2.0dB\n\t0x55400155, // 35, +2.5dB\n\t0x5a400169, // 36, +3.0dB\n\t0x5fc0017f, // 37, +3.5dB\n\t0x65400195, // 38, +4.0dB\n\t0x6b8001ae, // 39, +4.5dB\n\t0x71c001c7, // 40, +5.0dB\n\t0x788001e2, // 41, +5.5dB\n\t0x7f8001fe  // 42, +6.0dB\n};               \n\n\nu1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 14, -9.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 18, -7.0dB \n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 19, -6.5dB\n    \t{0x1c, 0x1a, 0x18, 0x12, 0x0e, 0x08, 0x04, 0x02},\t// 20, -6.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 22, -5.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 24, -4.0dB \n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 25, -3.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 26, -3.0dB\n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 28, -2.0dB \n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 30, -1.0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 31, -0.5dB\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} \t// 32, +0dB\n};                                                                  \n\n\nu1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= {\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 14, -9.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 18, -7.0dB  \n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 19, -6.5dB \n\t{0x1c, 0x1a, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 20, -6.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 22, -5.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 24, -4.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 25, -3.5dB  \n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 26, -3.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 28, -2.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 30, -1.0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 31, -0.5dB \n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} \t// 32, +0dB\t\n};\n\nu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16] = {\n{0x16, 0x15, 0x13, 0x10, 0xD, 0x9, 0x6, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 0  -16dB */\n{0x18, 0x17, 0x15, 0x12, 0xE, 0xA, 0x7, 0x4, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 1  -15.5dB */\n{0x1B, 0x1A, 0x18, 0x14, 0x10, 0xB, 0x7, 0x4, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 2  -15dB */\n{0x1F, 0x1E, 0x1B, 0x17, 0x12, 0xD, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 3  -14.5dB */\n{0x22, 0x21, 0x1E, 0x19, 0x14, 0xE, 0x9, 0x5, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 4  -14dB */\n{0x26, 0x25, 0x22, 0x1C, 0x16, 0x10, 0xA, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 5  -13.5dB */\n{0x2B, 0x2A, 0x26, 0x20, 0x19, 0x12, 0xC, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 6  -13dB */\n{0x30, 0x2F, 0x2A, 0x24, 0x1C, 0x14, 0xD, 0x8, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 7  -12.5dB */\n{0x36, 0x34, 0x2F, 0x28, 0x1F, 0x17, 0xF, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 8  -12dB */\n{0x3D, 0x3B, 0x35, 0x2D, 0x23, 0x19, 0x11, 0xA, 0x5, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 9  -11.5dB */\n{0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0xB, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 10  -11dB */\n{0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0xC, 0x6, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 11  -10.5dB */\n{0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0xE, 0x6, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 12  -10dB */\n{0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0xF, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 13  -9.5dB */\n{0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x8, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 14  -9dB */\n{0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x9, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 15  -8.5dB */\n{0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0xA, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 16  -8dB */\n{0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0xB, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 17  -7.5dB */\n{0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0xD, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 18  -7dB */\n{0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0xE, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},        /* 19  -6.5dB */\n{0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}      /* 20  -6dB */\n};\n\n\n#if 0\nu4Byte OFDMSwingTable_92E[OFDM_TABLE_SIZE_92E] = {\n\t/* Index0   6  dB */ 0x7fc001ff,\n\t/* Index1   5.7dB */ 0x7b4001ed,\n\t/* Index2   5.4dB */ 0x774001dd,\n\t/* Index3   5.1dB */ 0x734001cd,\n\t/* Index4   4.8dB */ 0x6f4001bd,\n\t/* Index5   4.5dB */ 0x6b8001ae,\n\t/* Index6   4.2dB */ 0x67c0019f,\n\t/* Index7   3.9dB */ 0x64400191,\n\t/* Index8   3.6dB */ 0x60c00183,\n\t/* Index9   3.3dB */ 0x5d800176,\n\t/* Index10  3  dB */ 0x5a80016a,\n\t/* Index11  2.7dB */ 0x5740015d,\n\t/* Index12  2.4dB */ 0x54400151,\n\t/* Index13  2.1dB */ 0x51800146,\n\t/* Index14  1.8dB */ 0x4ec0013b,\n\t/* Index15  1.5dB */ 0x4c000130,\n\t/* Index16  1.2dB */ 0x49800126,\n\t/* Index17  0.9dB */ 0x4700011c,\n\t/* Index18  0.6dB */ 0x44800112,\n\t/* Index19  0.3dB */ 0x42000108,\n\t/* Index20  0  dB */ 0x40000100, // 20 This is OFDM base index\n\t/* Index21 -0.3dB */ 0x3dc000f7,\n\t/* Index22 -0.6dB */ 0x3bc000ef,\n\t/* Index23 -0.9dB */ 0x39c000e7,\n\t/* Index24 -1.2dB */ 0x37c000df,\n\t/* Index25 -1.5dB */ 0x35c000d7,\n\t/* Index26 -1.8dB */ 0x340000d0,\n\t/* Index27 -2.1dB */ 0x324000c9,\n\t/* Index28 -2.4dB */ 0x308000c2,\n\t/* Index29 -2.7dB */ 0x2f0000bc,\n\t/* Index30 -3  dB */ 0x2d4000b5,\n\t/* Index31 -3.3dB */ 0x2bc000af,\n\t/* Index32 -3.6dB */ 0x2a4000a9,\n\t/* Index33 -3.9dB */ 0x28c000a3,\n\t/* Index34 -4.2dB */ 0x2780009e,\n\t/* Index35 -4.5dB */ 0x26000098,\n\t/* Index36 -4.8dB */ 0x24c00093,\n\t/* Index37 -5.1dB */ 0x2380008e,\n\t/* Index38 -5.4dB */ 0x22400089,\n\t/* Index39 -5.7dB */ 0x21400085,\n\t/* Index40 -6  dB */ 0x20000080,\n\t/* Index41 -6.3dB */ 0x1f00007c,\n\t/* Index42 -6.6dB */ 0x1e000078,\n\t/* Index43 -6.9dB */ 0x1d000074,\n\t/* Index44 -7.2dB */ 0x1c000070,\n\t/* Index45 -7.5dB */ 0x1b00006c,\n\t/* Index46 -7.8dB */ 0x1a000068,\n\t/* Index47 -8.1dB */ 0x19400065,\n\t/* Index48 -8.4dB */ 0x18400061,\n\t/* Index49 -8.7dB */ 0x1780005e,\n\t/* Index50 -9  dB */ 0x16c0005b,\n\t/* Index51 -9.3dB */ 0x16000058,\n\t/* Index52 -9.6dB */ 0x15400055,\n\t/* Index53 -9.9dB */ 0x14800052\n};\nu1Byte CCKSwingTable_Ch1_Ch13_92E[CCK_TABLE_SIZE_92E][8] = {\n\t/* Index0    0  dB */    {0x36, 0x34 , 0x2E , 0x26 , 0x1C , 0x12 , 0x08 , 0x04},\n\t/* Index1   -0.3dB */    {0x34, 0x32 , 0x2C , 0x25 , 0x1B , 0x11 , 0x08 , 0x04},\n\t/* Index2   -0.6dB */    {0x32, 0x30 , 0x2B , 0x23 , 0x1A , 0x11 , 0x07 , 0x04},\n\t/* Index3   -0.9dB */    {0x31, 0x2F , 0x29 , 0x22 , 0x19 , 0x10 , 0x07 , 0x04},\n\t/* Index4   -1.2dB */    {0x2F, 0x2D , 0x28 , 0x21 , 0x18 , 0x10 , 0x07 , 0x03},\n\t/* Index5   -1.5dB */    {0x2D, 0x2C , 0x27 , 0x20 , 0x18 , 0x0F , 0x07 , 0x03},\n\t/* Index6   -1.8dB */    {0x2C, 0x2A , 0x25 , 0x1F , 0x17 , 0x0F , 0x06 , 0x03},\n\t/* Index7   -2.1dB */    {0x2A, 0x29 , 0x24 , 0x1E , 0x16 , 0x0E , 0x06 , 0x03},\n\t/* Index8   -2.4dB */    {0x29, 0x27 , 0x23 , 0x1D , 0x15 , 0x0E , 0x06 , 0x03},\n\t/* Index9   -2.7dB */    {0x27, 0x26 , 0x22 , 0x1C , 0x14 , 0x0D , 0x06 , 0x03},\n\t/* Index10  -3  dB */    {0x26, 0x25 , 0x20 , 0x1B , 0x14 , 0x0D , 0x06 , 0x03},\n\t/* Index11  -3.3dB */    {0x25, 0x23 , 0x1F , 0x1A , 0x13 , 0x0C , 0x05 , 0x03},\n\t/* Index12  -3.6dB */    {0x24, 0x22 , 0x1E , 0x19 , 0x12 , 0x0C , 0x05 , 0x03},\n\t/* Index13  -3.9dB */    {0x22, 0x21 , 0x1D , 0x18 , 0x12 , 0x0B , 0x05 , 0x03},\n\t/* Index14  -4.2dB */    {0x21, 0x20 , 0x1C , 0x17 , 0x11 , 0x0B , 0x05 , 0x02},\n\t/* Index15  -4.5dB */    {0x20, 0x1F , 0x1B , 0x17 , 0x11 , 0x0B , 0x05 , 0x02},\n\t/* Index16  -4.8dB */    {0x1F, 0x1E , 0x1A , 0x16 , 0x10 , 0x0A , 0x05 , 0x02},\n\t/* Index17  -5.1dB */    {0x1E, 0x1D , 0x1A , 0x15 , 0x10 , 0x0A , 0x04 , 0x02},\n\t/* Index18  -5.4dB */    {0x1D, 0x1C , 0x19 , 0x14 , 0x0F , 0x0A , 0x04 , 0x02},\n\t/* Index19  -5.7dB */    {0x1C, 0x1B , 0x18 , 0x14 , 0x0E , 0x09 , 0x04 , 0x02},\n\t/* Index20  -6.0dB */    {0x1B, 0x1A , 0x17 , 0x13 , 0x0E , 0x09 , 0x04 , 0x02}, // 20 This is CCK base index\n\t/* Index21  -6.3dB */    {0x1A, 0x19 , 0x16 , 0x12 , 0x0E , 0x09 , 0x04 , 0x02},\n\t/* Index22  -6.6dB */    {0x19, 0x18 , 0x15 , 0x12 , 0x0D , 0x08 , 0x04 , 0x02},\n\t/* Index23  -6.9dB */    {0x18, 0x17 , 0x15 , 0x11 , 0x0D , 0x08 , 0x04 , 0x02},\n\t/* Index24  -7.2dB */    {0x18, 0x17 , 0x14 , 0x11 , 0x0C , 0x08 , 0x03 , 0x02},\n\t/* Index25  -7.5dB */    {0x17, 0x16 , 0x13 , 0x10 , 0x0C , 0x08 , 0x03 , 0x02},\n\t/* Index26  -7.8dB */    {0x16, 0x15 , 0x13 , 0x0F , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index27  -8.1dB */    {0x15, 0x14 , 0x12 , 0x0F , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index28  -8.4dB */    {0x14, 0x14 , 0x11 , 0x0E , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index29  -8.7dB */    {0x14, 0x13 , 0x11 , 0x0E , 0x0A , 0x07 , 0x03 , 0x01},\n\t/* Index30  -9.0dB */    {0x13, 0x12 , 0x10 , 0x0D , 0x0A , 0x06 , 0x03 , 0x01}, // 30 This is hp CCK base index\n\t/* Index31  -9.3dB */    {0x12, 0x12 , 0x0F , 0x0D , 0x0A , 0x06 , 0x03 , 0x01},\n\t/* Index32  -9.6dB */    {0x12, 0x11 , 0x0F , 0x0D , 0x09 , 0x06 , 0x03 , 0x01},\n\t/* Index33  -9.9dB */    {0x11, 0x11 , 0x0F , 0x0C , 0x09 , 0x06 , 0x03 , 0x01},\n\t/* Index34 -10.2dB */    {0x11, 0x11 , 0x0E , 0x0C , 0x09 , 0x06 , 0x02 , 0x01},\n\t/* Index35 -10.5dB */    {0x10, 0x0F , 0x0E , 0x0B , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index36 -10.8dB */    {0x10, 0x0F , 0x0D , 0x0B , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index37 -11.1dB */    {0x0F, 0x0E , 0x0D , 0x0A , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index38 -11.4dB */    {0x0E, 0x0E , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index39 -11.7dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index40 -12  dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index41 -12.3dB */    {0x0D, 0x0D , 0x0B , 0x09 , 0x07 , 0x04 , 0x02 , 0x01},\n\t/* Index42 -12.6dB */    {0x0D, 0x0C , 0x0B , 0x09 , 0x07 , 0x04 , 0x02 , 0x01},\n\t/* Index43 -12.9dB */    {0x0C, 0x0C , 0x0A , 0x09 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index44 -13.2dB */    {0x0C, 0x0B , 0x0A , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index45 -13.5dB */    {0x0B, 0x0B , 0x0A , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index46 -13.8dB */    {0x0B, 0x0B , 0x09 , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index47 -14.1dB */    {0x0B, 0x0A , 0x09 , 0x07 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index48 -14.4dB */    {0x0A, 0x0A , 0x09 , 0x07 , 0x05 , 0x03 , 0x02 , 0x01},\n\t/* Index49 -14.7dB */    {0x0A, 0x0A , 0x08 , 0x07 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index50 -15  dB */    {0x0A, 0x09 , 0x08 , 0x07 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index51 -15.3dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index52 -15.6dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index53 -15.9dB */    {0x09, 0x08 , 0x07 , 0x06 , 0x04 , 0x03 , 0x01 , 0x01}\n};\nu1Byte CCKSwingTable_Ch14_92E[CCK_TABLE_SIZE_92E][8] = {\n\t/* Index0    0  dB */    {0x36, 0x34 , 0x2E , 0x26 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index1   -0.3dB */    {0x34, 0x32 , 0x2C , 0x25 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index2   -0.6dB */    {0x32, 0x30 , 0x2B , 0x23 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index3   -0.9dB */    {0x31, 0x2F , 0x29 , 0x22 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index4   -1.2dB */    {0x2F, 0x2D , 0x28 , 0x21 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index5   -1.5dB */    {0x2D, 0x2C , 0x27 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index6   -1.8dB */    {0x2C, 0x2A , 0x25 , 0x1F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index7   -2.1dB */    {0x2A, 0x29 , 0x24 , 0x1E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index8   -2.4dB */    {0x29, 0x27 , 0x23 , 0x1D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index9   -2.7dB */    {0x27, 0x26 , 0x22 , 0x1C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index10  -3  dB */    {0x26, 0x25 , 0x20 , 0x1B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index11  -3.3dB */    {0x25, 0x23 , 0x1F , 0x1A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index12  -3.6dB */    {0x24, 0x22 , 0x1E , 0x19 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index13  -3.9dB */    {0x22, 0x21 , 0x1D , 0x18 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index14  -4.2dB */    {0x21, 0x20 , 0x1C , 0x17 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index15  -4.5dB */    {0x20, 0x1F , 0x1B , 0x17 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index16  -4.8dB */    {0x1F, 0x1E , 0x1A , 0x16 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index17  -5.1dB */    {0x1E, 0x1D , 0x1A , 0x15 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index18  -5.4dB */    {0x1D, 0x1C , 0x19 , 0x14 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index19  -5.7dB */    {0x1C, 0x1B , 0x18 , 0x14 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index20  -6  dB */     {0x1B, 0x1A , 0x17 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index21  -6.3dB */    {0x1A, 0x19 , 0x16 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index22  -6.6dB */    {0x19, 0x18 , 0x15 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index23  -6.9dB */    {0x18, 0x17 , 0x15 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index24  -7.2dB */    {0x18, 0x17 , 0x14 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index25  -7.5dB */    {0x17, 0x16 , 0x13 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index26  -7.8dB */    {0x16, 0x15 , 0x13 , 0x0F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index27  -8.1dB */    {0x15, 0x14 , 0x12 , 0x0F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index28  -8.4dB */    {0x14, 0x14 , 0x11 , 0x0E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index29  -8.7dB */    {0x14, 0x13 , 0x11 , 0x0E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index30  -9  dB */    {0x13, 0x12 , 0x10 , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index31  -9.3dB */    {0x12, 0x12 , 0x0F , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index32  -9.6dB */    {0x12, 0x11 , 0x0F , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index33  -9.9dB */    {0x11, 0x11 , 0x0F , 0x0C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index34 -10.2dB */    {0x11, 0x11 , 0x0E , 0x0C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index35 -10.5dB */    {0x10, 0x0F , 0x0E , 0x0B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index36 -10.8dB */    {0x10, 0x0F , 0x0D , 0x0B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index37 -11.1dB */    {0x0F, 0x0E , 0x0D , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index38 -11.4dB */    {0x0E, 0x0E , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index39 -11.7dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index40 -12  dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index41 -12.3dB */    {0x0D, 0x0D , 0x0B , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index42 -12.6dB */    {0x0D, 0x0C , 0x0B , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index43 -12.9dB */    {0x0C, 0x0C , 0x0A , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index44 -13.2dB */    {0x0C, 0x0B , 0x0A , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index45 -13.5dB */    {0x0B, 0x0B , 0x0A , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index46 -13.8dB */    {0x0B, 0x0B , 0x09 , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index47 -14.1dB */    {0x0B, 0x0A , 0x09 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index48 -14.4dB */    {0x0A, 0x0A , 0x09 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index49 -14.7dB */    {0x0A, 0x0A , 0x08 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index50 -15  dB */    {0x0A, 0x09 , 0x08 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index51 -15.3dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index52 -15.6dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index53 -15.9dB */    {0x09, 0x08 , 0x07 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00}\n};\n#endif\n\n#ifdef AP_BUILD_WORKAROUND\n\nunsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {\n\t/*  +6.0dB */ 0x7f8001fe,\n\t/*  +5.5dB */ 0x788001e2,\n\t/*  +5.0dB */ 0x71c001c7,\n\t/*  +4.5dB */ 0x6b8001ae,\n\t/*  +4.0dB */ 0x65400195,\n\t/*  +3.5dB */ 0x5fc0017f,\n\t/*  +3.0dB */ 0x5a400169,\n\t/*  +2.5dB */ 0x55400155,\n\t/*  +2.0dB */ 0x50800142,\n\t/*  +1.5dB */ 0x4c000130,\n\t/*  +1.0dB */ 0x47c0011f,\n\t/*  +0.5dB */ 0x43c0010f,\n\t/*   0.0dB */ 0x40000100,\n\t/*  -0.5dB */ 0x3c8000f2,\n\t/*  -1.0dB */ 0x390000e4,\n\t/*  -1.5dB */ 0x35c000d7,\n\t/*  -2.0dB */ 0x32c000cb,\n\t/*  -2.5dB */ 0x300000c0,\n\t/*  -3.0dB */ 0x2d4000b5,\n\t/*  -3.5dB */ 0x2ac000ab,\n\t/*  -4.0dB */ 0x288000a2,\n\t/*  -4.5dB */ 0x26000098,\n\t/*  -5.0dB */ 0x24000090,\n\t/*  -5.5dB */ 0x22000088,\n\t/*  -6.0dB */ 0x20000080,\n\t/*  -6.5dB */ 0x1a00006c,\n\t/*  -7.0dB */ 0x1c800072,\n\t/*  -7.5dB */ 0x18000060,\n\t/*  -8.0dB */ 0x19800066,\n\t/*  -8.5dB */ 0x15800056,\n\t/*  -9.0dB */ 0x26c0005b,\n\t/*  -9.5dB */ 0x14400051,\n\t/* -10.0dB */ 0x24400051,\n\t/* -10.5dB */ 0x1300004c,\n\t/* -11.0dB */ 0x12000048,\n\t/* -11.5dB */ 0x11000044,\n\t/* -12.0dB */ 0x10000040\n};\n#endif\n\n#endif\n\n\nu1Byte DeltaSwingTableIdx_2GA_P_DEFAULT[DELTA_SWINGIDX_SIZE] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3\n, 4, 4, 4,  4,  4,  4,  4,  4,  5,  5,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9};\nu1Byte DeltaSwingTableIdx_2GA_N_DEFAULT[DELTA_SWINGIDX_SIZE] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4\n, 4, 5, 5,  6,  6,  7,  7,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11, 11}; \n\n\n#ifdef CONFIG_WLAN_HAL_8192EE\nu4Byte OFDMSwingTable_92E[OFDM_TABLE_SIZE_92E] = {\n\t/* Index0   6  dB */ 0x7fc001ff,\n\t/* Index1   5.7dB */ 0x7b4001ed,\n\t/* Index2   5.4dB */ 0x774001dd,\n\t/* Index3   5.1dB */ 0x734001cd,\n\t/* Index4   4.8dB */ 0x6f4001bd,\n\t/* Index5   4.5dB */ 0x6b8001ae,\n\t/* Index6   4.2dB */ 0x67c0019f,\n\t/* Index7   3.9dB */ 0x64400191,\n\t/* Index8   3.6dB */ 0x60c00183,\n\t/* Index9   3.3dB */ 0x5d800176,\n\t/* Index10  3  dB */ 0x5a80016a,\n\t/* Index11  2.7dB */ 0x5740015d,\n\t/* Index12  2.4dB */ 0x54400151,\n\t/* Index13  2.1dB */ 0x51800146,\n\t/* Index14  1.8dB */ 0x4ec0013b,\n\t/* Index15  1.5dB */ 0x4c000130,\n\t/* Index16  1.2dB */ 0x49800126,\n\t/* Index17  0.9dB */ 0x4700011c,\n\t/* Index18  0.6dB */ 0x44800112,\n\t/* Index19  0.3dB */ 0x42000108,\n\t/* Index20  0  dB */ 0x40000100, // 20 This is OFDM base index\n\t/* Index21 -0.3dB */ 0x3dc000f7,\n\t/* Index22 -0.6dB */ 0x3bc000ef,\n\t/* Index23 -0.9dB */ 0x39c000e7,\n\t/* Index24 -1.2dB */ 0x37c000df,\n\t/* Index25 -1.5dB */ 0x35c000d7,\n\t/* Index26 -1.8dB */ 0x340000d0,\n\t/* Index27 -2.1dB */ 0x324000c9,\n\t/* Index28 -2.4dB */ 0x308000c2,\n\t/* Index29 -2.7dB */ 0x2f0000bc,\n\t/* Index30 -3  dB */ 0x2d4000b5,\n\t/* Index31 -3.3dB */ 0x2bc000af,\n\t/* Index32 -3.6dB */ 0x2a4000a9,\n\t/* Index33 -3.9dB */ 0x28c000a3,\n\t/* Index34 -4.2dB */ 0x2780009e,\n\t/* Index35 -4.5dB */ 0x26000098,\n\t/* Index36 -4.8dB */ 0x24c00093,\n\t/* Index37 -5.1dB */ 0x2380008e,\n\t/* Index38 -5.4dB */ 0x22400089,\n\t/* Index39 -5.7dB */ 0x21400085,\n\t/* Index40 -6  dB */ 0x20000080,\n\t/* Index41 -6.3dB */ 0x1f00007c,\n\t/* Index42 -6.6dB */ 0x1e000078,\n\t/* Index43 -6.9dB */ 0x1d000074,\n\t/* Index44 -7.2dB */ 0x1c000070,\n\t/* Index45 -7.5dB */ 0x1b00006c,\n\t/* Index46 -7.8dB */ 0x1a000068,\n\t/* Index47 -8.1dB */ 0x19400065,\n\t/* Index48 -8.4dB */ 0x18400061,\n\t/* Index49 -8.7dB */ 0x1780005e,\n\t/* Index50 -9  dB */ 0x16c0005b,\n\t/* Index51 -9.3dB */ 0x16000058,\n\t/* Index52 -9.6dB */ 0x15400055,\n\t/* Index53 -9.9dB */ 0x14800052\n};\nu1Byte CCKSwingTable_Ch1_Ch13_92E[CCK_TABLE_SIZE_92E][8] = {\n\t/* Index0    0  dB */    {0x36, 0x34 , 0x2E , 0x26 , 0x1C , 0x12 , 0x08 , 0x04},\n\t/* Index1   -0.3dB */    {0x34, 0x32 , 0x2C , 0x25 , 0x1B , 0x11 , 0x08 , 0x04},\n\t/* Index2   -0.6dB */    {0x32, 0x30 , 0x2B , 0x23 , 0x1A , 0x11 , 0x07 , 0x04},\n\t/* Index3   -0.9dB */    {0x31, 0x2F , 0x29 , 0x22 , 0x19 , 0x10 , 0x07 , 0x04},\n\t/* Index4   -1.2dB */    {0x2F, 0x2D , 0x28 , 0x21 , 0x18 , 0x10 , 0x07 , 0x03},\n\t/* Index5   -1.5dB */    {0x2D, 0x2C , 0x27 , 0x20 , 0x18 , 0x0F , 0x07 , 0x03},\n\t/* Index6   -1.8dB */    {0x2C, 0x2A , 0x25 , 0x1F , 0x17 , 0x0F , 0x06 , 0x03},\n\t/* Index7   -2.1dB */    {0x2A, 0x29 , 0x24 , 0x1E , 0x16 , 0x0E , 0x06 , 0x03},\n\t/* Index8   -2.4dB */    {0x29, 0x27 , 0x23 , 0x1D , 0x15 , 0x0E , 0x06 , 0x03},\n\t/* Index9   -2.7dB */    {0x27, 0x26 , 0x22 , 0x1C , 0x14 , 0x0D , 0x06 , 0x03},\n\t/* Index10  -3  dB */    {0x26, 0x25 , 0x20 , 0x1B , 0x14 , 0x0D , 0x06 , 0x03},\n\t/* Index11  -3.3dB */    {0x25, 0x23 , 0x1F , 0x1A , 0x13 , 0x0C , 0x05 , 0x03},\n\t/* Index12  -3.6dB */    {0x24, 0x22 , 0x1E , 0x19 , 0x12 , 0x0C , 0x05 , 0x03},\n\t/* Index13  -3.9dB */    {0x22, 0x21 , 0x1D , 0x18 , 0x12 , 0x0B , 0x05 , 0x03},\n\t/* Index14  -4.2dB */    {0x21, 0x20 , 0x1C , 0x17 , 0x11 , 0x0B , 0x05 , 0x02},\n\t/* Index15  -4.5dB */    {0x20, 0x1F , 0x1B , 0x17 , 0x11 , 0x0B , 0x05 , 0x02},\n\t/* Index16  -4.8dB */    {0x1F, 0x1E , 0x1A , 0x16 , 0x10 , 0x0A , 0x05 , 0x02},\n\t/* Index17  -5.1dB */    {0x1E, 0x1D , 0x1A , 0x15 , 0x10 , 0x0A , 0x04 , 0x02},\n\t/* Index18  -5.4dB */    {0x1D, 0x1C , 0x19 , 0x14 , 0x0F , 0x0A , 0x04 , 0x02},\n\t/* Index19  -5.7dB */    {0x1C, 0x1B , 0x18 , 0x14 , 0x0E , 0x09 , 0x04 , 0x02},\n\t/* Index20  -6.0dB */    {0x1B, 0x1A , 0x17 , 0x13 , 0x0E , 0x09 , 0x04 , 0x02}, // 20 This is CCK base index\n\t/* Index21  -6.3dB */    {0x1A, 0x19 , 0x16 , 0x12 , 0x0E , 0x09 , 0x04 , 0x02},\n\t/* Index22  -6.6dB */    {0x19, 0x18 , 0x15 , 0x12 , 0x0D , 0x08 , 0x04 , 0x02},\n\t/* Index23  -6.9dB */    {0x18, 0x17 , 0x15 , 0x11 , 0x0D , 0x08 , 0x04 , 0x02},\n\t/* Index24  -7.2dB */    {0x18, 0x17 , 0x14 , 0x11 , 0x0C , 0x08 , 0x03 , 0x02},\n\t/* Index25  -7.5dB */    {0x17, 0x16 , 0x13 , 0x10 , 0x0C , 0x08 , 0x03 , 0x02},\n\t/* Index26  -7.8dB */    {0x16, 0x15 , 0x13 , 0x0F , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index27  -8.1dB */    {0x15, 0x14 , 0x12 , 0x0F , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index28  -8.4dB */    {0x14, 0x14 , 0x11 , 0x0E , 0x0B , 0x07 , 0x03 , 0x02},\n\t/* Index29  -8.7dB */    {0x14, 0x13 , 0x11 , 0x0E , 0x0A , 0x07 , 0x03 , 0x01},\n\t/* Index30  -9.0dB */    {0x13, 0x12 , 0x10 , 0x0D , 0x0A , 0x06 , 0x03 , 0x01}, // 30 This is hp CCK base index\n\t/* Index31  -9.3dB */    {0x12, 0x12 , 0x0F , 0x0D , 0x0A , 0x06 , 0x03 , 0x01},\n\t/* Index32  -9.6dB */    {0x12, 0x11 , 0x0F , 0x0D , 0x09 , 0x06 , 0x03 , 0x01},\n\t/* Index33  -9.9dB */    {0x11, 0x11 , 0x0F , 0x0C , 0x09 , 0x06 , 0x03 , 0x01},\n\t/* Index34 -10.2dB */    {0x11, 0x11 , 0x0E , 0x0C , 0x09 , 0x06 , 0x02 , 0x01},\n\t/* Index35 -10.5dB */    {0x10, 0x0F , 0x0E , 0x0B , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index36 -10.8dB */    {0x10, 0x0F , 0x0D , 0x0B , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index37 -11.1dB */    {0x0F, 0x0E , 0x0D , 0x0A , 0x08 , 0x05 , 0x02 , 0x01},\n\t/* Index38 -11.4dB */    {0x0E, 0x0E , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index39 -11.7dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index40 -12  dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x07 , 0x05 , 0x02 , 0x01},\n\t/* Index41 -12.3dB */    {0x0D, 0x0D , 0x0B , 0x09 , 0x07 , 0x04 , 0x02 , 0x01},\n\t/* Index42 -12.6dB */    {0x0D, 0x0C , 0x0B , 0x09 , 0x07 , 0x04 , 0x02 , 0x01},\n\t/* Index43 -12.9dB */    {0x0C, 0x0C , 0x0A , 0x09 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index44 -13.2dB */    {0x0C, 0x0B , 0x0A , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index45 -13.5dB */    {0x0B, 0x0B , 0x0A , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index46 -13.8dB */    {0x0B, 0x0B , 0x09 , 0x08 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index47 -14.1dB */    {0x0B, 0x0A , 0x09 , 0x07 , 0x06 , 0x04 , 0x02 , 0x01},\n\t/* Index48 -14.4dB */    {0x0A, 0x0A , 0x09 , 0x07 , 0x05 , 0x03 , 0x02 , 0x01},\n\t/* Index49 -14.7dB */    {0x0A, 0x0A , 0x08 , 0x07 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index50 -15  dB */    {0x0A, 0x09 , 0x08 , 0x07 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index51 -15.3dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index52 -15.6dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x05 , 0x03 , 0x01 , 0x01},\n\t/* Index53 -15.9dB */    {0x09, 0x08 , 0x07 , 0x06 , 0x04 , 0x03 , 0x01 , 0x01}\n};\nu1Byte CCKSwingTable_Ch14_92E[CCK_TABLE_SIZE_92E][8] = {\n\t/* Index0    0  dB */    {0x36, 0x34 , 0x2E , 0x26 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index1   -0.3dB */    {0x34, 0x32 , 0x2C , 0x25 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index2   -0.6dB */    {0x32, 0x30 , 0x2B , 0x23 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index3   -0.9dB */    {0x31, 0x2F , 0x29 , 0x22 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index4   -1.2dB */    {0x2F, 0x2D , 0x28 , 0x21 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index5   -1.5dB */    {0x2D, 0x2C , 0x27 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index6   -1.8dB */    {0x2C, 0x2A , 0x25 , 0x1F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index7   -2.1dB */    {0x2A, 0x29 , 0x24 , 0x1E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index8   -2.4dB */    {0x29, 0x27 , 0x23 , 0x1D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index9   -2.7dB */    {0x27, 0x26 , 0x22 , 0x1C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index10  -3  dB */    {0x26, 0x25 , 0x20 , 0x1B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index11  -3.3dB */    {0x25, 0x23 , 0x1F , 0x1A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index12  -3.6dB */    {0x24, 0x22 , 0x1E , 0x19 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index13  -3.9dB */    {0x22, 0x21 , 0x1D , 0x18 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index14  -4.2dB */    {0x21, 0x20 , 0x1C , 0x17 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index15  -4.5dB */    {0x20, 0x1F , 0x1B , 0x17 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index16  -4.8dB */    {0x1F, 0x1E , 0x1A , 0x16 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index17  -5.1dB */    {0x1E, 0x1D , 0x1A , 0x15 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index18  -5.4dB */    {0x1D, 0x1C , 0x19 , 0x14 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index19  -5.7dB */    {0x1C, 0x1B , 0x18 , 0x14 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index20  -6  dB */     {0x1B, 0x1A , 0x17 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index21  -6.3dB */    {0x1A, 0x19 , 0x16 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index22  -6.6dB */    {0x19, 0x18 , 0x15 , 0x12 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index23  -6.9dB */    {0x18, 0x17 , 0x15 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index24  -7.2dB */    {0x18, 0x17 , 0x14 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index25  -7.5dB */    {0x17, 0x16 , 0x13 , 0x10 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index26  -7.8dB */    {0x16, 0x15 , 0x13 , 0x0F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index27  -8.1dB */    {0x15, 0x14 , 0x12 , 0x0F , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index28  -8.4dB */    {0x14, 0x14 , 0x11 , 0x0E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index29  -8.7dB */    {0x14, 0x13 , 0x11 , 0x0E , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index30  -9  dB */    {0x13, 0x12 , 0x10 , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index31  -9.3dB */    {0x12, 0x12 , 0x0F , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index32  -9.6dB */    {0x12, 0x11 , 0x0F , 0x0D , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index33  -9.9dB */    {0x11, 0x11 , 0x0F , 0x0C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index34 -10.2dB */    {0x11, 0x11 , 0x0E , 0x0C , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index35 -10.5dB */    {0x10, 0x0F , 0x0E , 0x0B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index36 -10.8dB */    {0x10, 0x0F , 0x0D , 0x0B , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index37 -11.1dB */    {0x0F, 0x0E , 0x0D , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index38 -11.4dB */    {0x0E, 0x0E , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index39 -11.7dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index40 -12  dB */    {0x0E, 0x0D , 0x0C , 0x0A , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index41 -12.3dB */    {0x0D, 0x0D , 0x0B , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index42 -12.6dB */    {0x0D, 0x0C , 0x0B , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index43 -12.9dB */    {0x0C, 0x0C , 0x0A , 0x09 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index44 -13.2dB */    {0x0C, 0x0B , 0x0A , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index45 -13.5dB */    {0x0B, 0x0B , 0x0A , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index46 -13.8dB */    {0x0B, 0x0B , 0x09 , 0x08 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index47 -14.1dB */    {0x0B, 0x0A , 0x09 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index48 -14.4dB */    {0x0A, 0x0A , 0x09 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index49 -14.7dB */    {0x0A, 0x0A , 0x08 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index50 -15  dB */    {0x0A, 0x09 , 0x08 , 0x07 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index51 -15.3dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index52 -15.6dB */    {0x09, 0x09 , 0x08 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00},\n\t/* Index53 -15.9dB */    {0x09, 0x08 , 0x07 , 0x06 , 0x00 , 0x00 , 0x00 , 0x00}\n};\n#endif\n\n#if(RTL8814A_SUPPORT == 1)\nu4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =\n{\n\t0x081, // 0,  -12.0dB\n\t0x088, // 1,  -11.5dB\n\t0x090, // 2,  -11.0dB\n\t0x099, // 3,  -10.5dB\n\t0x0A2, // 4,  -10.0dB\n\t0x0AC, // 5,  -9.5dB\n\t0x0B6, // 6,  -9.0dB\n\t0x0C0, // 7,  -8.5dB\n\t0x0CC, // 8,  -8.0dB\n\t0x0D8, // 9,  -7.5dB\n\t0x0E5, // 10, -7.0dB\n\t0x0F2, // 11, -6.5dB\n\t0x101, // 12, -6.0dB\n\t0x110, // 13, -5.5dB\n\t0x120, // 14, -5.0dB\n\t0x131, // 15, -4.5dB\n\t0x143, // 16, -4.0dB\n\t0x156, // 17, -3.5dB\n\t0x16A, // 18, -3.0dB\n\t0x180, // 19, -2.5dB\n\t0x197, // 20, -2.0dB\n\t0x1AF, // 21, -1.5dB\n\t0x1C8, // 22, -1.0dB\n\t0x1E3, // 23, -0.5dB\n\t0x200, // 24, +0  dB\n\t0x21E, // 25, +0.5dB\n\t0x23E, // 26, +1.0dB\n\t0x261, // 27, +1.5dB\n\t0x285, // 28, +2.0dB\n\t0x2AB, // 29, +2.5dB\n\t0x2D3, // 30, +3.0dB\n\t0x2FE, // 31, +3.5dB\n\t0x32B, // 32, +4.0dB\n\t0x35C, // 33, +4.5dB\n\t0x38E, // 34, +5.0dB\n\t0x3C4, // 35, +5.5dB\n\t0x3FE  // 36, +6.0dB\t\n};\n#elif(ODM_IC_11AC_SERIES_SUPPORT)\nu4Byte OFDMSwingTable_8812[OFDM_TABLE_SIZE_8812] = {\t\n\t0x3FE, // 0,  (6dB) \n\t0x3C4, // 1,  (5.5dB) \n\t0x38E, // 2,  (5dB)\n\t0x35C, // 3,  (4.5dB)\n\t0x32B, // 4,  (4dB)\n\t0x2FE, // 5,  (3.5dB)\n\t0x2D3, // 6,  (3dB)\n\t0x2AB, // 7,  (2.5dB)\n\t0x285, // 8,  (2dB)\n\t0x261, // 9,  (1.5dB\n\t0x23E, // 10, (1dB)\n\t0x21E, // 11, (0.5dB)\n\t0x200, // 12, (0dB)\t\t8814 int PA 2G default\n\t0x1E3, // 13, (-0.5dB)\n\t0x1C8, // 14, (-1dB)\n\t0x1AF, // 15, (-1.5dB)\n\t0x197, // 16, (-2dB)\n\t0x180, // 17, (-2.5dB)\n\t0x16A, // 18, (-3dB)\t\t8812 / 8814 int PA 5G / 8814 ext PA 2G5G default\n\t0x156, // 19, (-3.5dB)\n\t0x143, // 20, (-4dB)\t\t8812 HP default\n\t0x131, // 21, (-4.5dB)\n\t0x120, // 22, (-5dB)\n\t0x110, // 23, (-5.5dB)\n\t0x101, // 24, (-6dB)\n\t0x0F2, // 25, (-6.5dB)\n\t0x0E5, // 26, (-7dB)\n\t0x0D8, // 27, (-7.5dB)\n\t0x0CC, // 28, (-8dB)\n\t0x0C0, // 29, (-8.5dB)\n\t0x0B6, // 30, (-9dB)\n\t0x0AC, // 31, (-9.5dB)\n\t0x0A2, // 32, (-10dB)\n\t0x099, // 33, (-10.5dB)\n\t0x090, // 34, (-11dB)\n\t0x088, // 35, (-11.5dB)\n\t0x081, // 36, (-12dB)\t\n\t0x079, // 37, (-12.5dB)\n\t0x072, // 38, (-13dB)\n\t0x06c, // 39, (-13.5dB)\n\t0x066, // 40, (-14dB)\n\t0x060, // 41, (-14.5dB)\n\t0x05B  // 42, (-15dB)\n};\n#endif\n\n//#endif\n//3============================================================\n//3 Tx Power Tracking\n//3============================================================\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN\tPVOID\t\tpDM_VOID \n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tif(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))\n\t\treturn;\n#endif\n\n\todm_TXPowerTrackingThermalMeterInit(pDM_Odm);\n}\t\n\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN\tPVOID\t\tpDM_VOID \n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tu1Byte p;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO      \tpMgntInfo = &Adapter->MgntInfo;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\tpMgntInfo->bTXPowerTracking = TRUE;\n\tpHalData->TXPowercount       = 0;\n\tpHalData->bTXPowerTrackingInit = FALSE;\n\n\tif(pDM_Odm->mp_mode == FALSE)\n\t\tpHalData->TxPowerTrackControl = TRUE;\n\tODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, (\"pMgntInfo->bTXPowerTracking = %d\\n\", pMgntInfo->bTXPowerTracking));\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#ifdef CONFIG_RTL8188E\n\t{\n\t\tpDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;\n\t\tpDM_Odm->RFCalibrateInfo.TXPowercount = 0;\n\t\tpDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;\n\n\t\tif(pDM_Odm->mp_mode == FALSE)\n\t\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;\n\t\t\n\t\tMSG_8192C(\"pDM_Odm TxPowerTrackControl = %d\\n\", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);\n\t}\n\t#else\n\t{\n\t\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\tstruct dm_priv\t*pdmpriv = &pHalData->dmpriv;\n\n\t\t//if(IS_HARDWARE_TYPE_8192C(pHalData))\n\t\t{\n\t\t\tpdmpriv->bTXPowerTracking = _TRUE;\n\t\t\tpdmpriv->TXPowercount = 0;\n\t\t\tpdmpriv->bTXPowerTrackingInit = _FALSE;\n\n\t\t\tif(pDM_Odm->mp_mode == FALSE)\t\t//for mp driver, turn off txpwrtracking as default\n\t\t\t\tpdmpriv->TxPowerTrackControl = _TRUE;\n\n\t\t}\n\t\tMSG_8192C(\"pdmpriv->TxPowerTrackControl = %d\\n\", pdmpriv->TxPowerTrackControl);\n\t\n\t}\t\n\t#endif//endif (CONFIG_RTL8188E==1)\t\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\n\t#ifdef RTL8188E_SUPPORT\n\t{\n\t\tpDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;\n\t\tpDM_Odm->RFCalibrateInfo.TXPowercount = 0;\n\t\tpDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;\n\t\tpDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 0;\n\t}\n\t#endif\n#endif\n\n       pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;\n\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndex = 0;\n\tpDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = 0;\n\tpDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0;\n\tpDM_Odm->RFCalibrateInfo.ThermalValue = 0;\n\tpRFCalibrateInfo->DefaultOfdmIndex = 28;\n\n\t\n#if RTL8188E_SUPPORT\t\n\tpRFCalibrateInfo->DefaultCckIndex = 20;\t// -6 dB\t\n#elif RTL8192E_SUPPORT\n\tpRFCalibrateInfo->DefaultCckIndex = 8;\t// -12 dB\n#endif\n\tpRFCalibrateInfo->BbSwingIdxOfdmBase = pRFCalibrateInfo->DefaultOfdmIndex;\n\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\n\tpDM_Odm->RFCalibrateInfo.CCK_index = pRFCalibrateInfo->DefaultCckIndex;\n\tfor(p = 0; p < MAX_RF_PATH; p++)\n\t{\n \tpDM_Odm->RFCalibrateInfo.OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\t\t\n\tpRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;\n\tpRFCalibrateInfo->KfreeOffset[p] = 0; // for 8814 kfree\n\t}\n\tpRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;\n\t\n}\n\n\nVOID\nODM_TXPowerTrackingCheck(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\t// \n\t// For AP/ADSL use prtl8192cd_priv\n\t// For CE/NIC use PADAPTER\n\t//\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\n\n\tif (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t\treturn;\n\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\t\t\todm_TXPowerTrackingCheckMP(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_CE:\n\t\t\todm_TXPowerTrackingCheckCE(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_AP:\n\t\t\todm_TXPowerTrackingCheckAP(pDM_Odm);\t\t\n\t\t\tbreak;\t\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n}\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\t#if(RTL8188E_SUPPORT==1)\n\n\t//if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)\n\tif(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t{\n\t\treturn;\n\t}\n\n\tif(!pDM_Odm->RFCalibrateInfo.TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\t//pHalData->TxPowerCheckCnt++;\t//cosa add for debug\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);\n\t\t//DBG_8192C(\"Trigger 92C Thermal Meter!!\\n\");\n\t\t\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 1;\n\t\treturn;\n\t\t\n\t}\n\telse\n\t{\n\t\t//DBG_8192C(\"Schedule TxPowerTracking direct call!!\\n\");\n\t\todm_TXPowerTrackingCallback_ThermalMeter_8188E(Adapter);\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 0;\n\t}\n\t#endif\n\t\n#endif\t\n}\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN\tPVOID\t\tpDM_VOID \n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\tif (ODM_CheckPowerStatus(Adapter) == FALSE)\n\t\treturn;\n\n\tif(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)\n\t\todm_TXPowerTrackingThermalMeterCheck(Adapter);\n#endif\n\t\n}\n\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\n#if ((RTL8188E_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) || (RTL8814A_SUPPORT == 1))\t\n\tif (pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8812|ODM_RTL8881A|ODM_RTL8814A))\n\t\tODM_TXPowerTrackingCallback_ThermalMeter(pDM_Odm);\n\telse\n#endif\n\t{\n\t}\n#endif\t\n\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n#ifndef AP_BUILD_WORKAROUND\n#if (HAL_CODE_BASE==RTL8192_C)\n\tPMGNT_INFO      \t\tpMgntInfo = &Adapter->MgntInfo;\n\t//HAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstatic u1Byte\t\t\tTM_Trigger = 0;\n\t//u1Byte\t\t\t\t\tTxPowerCheckCnt = 5;\t//10 sec\n\n\tif(!pMgntInfo->bTXPowerTracking /*|| (!pHalData->TxPowerTrackControl && pHalData->bAPKdone)*/)\n\t{\n\t\treturn;\n\t}\n\n\tif(!TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\tif (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_8812(Adapter))\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);\n\t\telse\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Trigger 92C Thermal Meter!!\\n\"));\n\t\t\n\t\tTM_Trigger = 1;\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Schedule TxPowerTracking direct call!!\\n\"));\t\t\n\t\todm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.\n\t\tTM_Trigger = 0;\n\t}\n#endif\n#endif\n}\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_ap.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMPOWERTRACKING_H__\n#define    __PHYDMPOWERTRACKING_H__\n\n#define POWRTRACKING_VERSION\t\"1.1\"\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n#ifdef RTK_AC_SUPPORT\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t1\n#else\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t0\n#endif\n#else\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t1\n#endif\n\n#define\t\tDPK_DELTA_MAPPING_NUM\t13\n#define\t\tindex_mapping_HP_NUM\t15\n#define\t\tDELTA_SWINGIDX_SIZE     30\n#define\t\tBAND_NUM \t\t\t\t3\n#define\t\tMAX_RF_PATH\t4\n#define \t\tTXSCALE_TABLE_SIZE \t\t37\n#define IQK_MAC_REG_NUM\t\t4\n#define IQK_ADDA_REG_NUM\t\t16\n#define IQK_BB_REG_NUM_MAX\t10\n\n#define IQK_BB_REG_NUM\t\t9\n\n#define HP_THERMAL_NUM\t\t8\n\n#define AVG_THERMAL_NUM\t\t8\n#define IQK_Matrix_REG_NUM\t8\n//#define IQK_Matrix_Settings_NUM\t1+24+21\n#define IQK_Matrix_Settings_NUM\t(14+24+21) // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G\n\n#if !defined(_OUTSRC_COEXIST)\n#define\tOFDM_TABLE_SIZE_92D \t43\n#define\tOFDM_TABLE_SIZE \t37\n#define\tCCK_TABLE_SIZE\t\t33\n#define\tCCK_TABLE_SIZE_88F\t21\n\n\n\n//#define\tOFDM_TABLE_SIZE_92E \t54\n//#define \tCCK_TABLE_SIZE_92E     \t54\nextern\tu4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8];\n\n\nextern\tu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE_92D];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16];\n\n#endif\n\n#define\tODM_OFDM_TABLE_SIZE \t37\n#define\tODM_CCK_TABLE_SIZE\t\t33\n// <20140613, YuChen> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table.\nextern u1Byte DeltaSwingTableIdx_2GA_P_DEFAULT[DELTA_SWINGIDX_SIZE];\nextern u1Byte DeltaSwingTableIdx_2GA_N_DEFAULT[DELTA_SWINGIDX_SIZE]; \n\n\n//extern\tu4Byte OFDMSwingTable_92E[OFDM_TABLE_SIZE_92E];\n//extern\tu1Byte CCKSwingTable_Ch1_Ch13_92E[CCK_TABLE_SIZE_92E][8];\n//extern\tu1Byte CCKSwingTable_Ch14_92E[CCK_TABLE_SIZE_92E][8];\n\n#ifdef CONFIG_WLAN_HAL_8192EE\n#define\tOFDM_TABLE_SIZE_92E \t54\n#define\tCCK_TABLE_SIZE_92E     \t54\nextern\tu4Byte OFDMSwingTable_92E[OFDM_TABLE_SIZE_92E];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13_92E[CCK_TABLE_SIZE_92E][8];\nextern\tu1Byte CCKSwingTable_Ch14_92E[CCK_TABLE_SIZE_92E][8];\n#endif\n\n#define\tOFDM_TABLE_SIZE_8812 \t43\n#define\tAVG_THERMAL_NUM_8812\t4\n\n#if(RTL8814A_SUPPORT == 1)\nextern u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE];\n#elif(ODM_IC_11AC_SERIES_SUPPORT)\nextern unsigned int OFDMSwingTable_8812[OFDM_TABLE_SIZE_8812];\n#endif\n\n#define dm_CheckTXPowerTracking \tODM_TXPowerTrackingCheck\n\ntypedef struct _IQK_MATRIX_REGS_SETTING{\n\tBOOLEAN \tbIQKDone;\n\ts4Byte\t\tValue[1][IQK_Matrix_REG_NUM];\n}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;\n\ntypedef struct ODM_RF_Calibration_Structure\n{\n\t//for tx power tracking\n\t\n\tu4Byte\tRegA24; // for TempCCK\n\ts4Byte\tRegE94;\n\ts4Byte \tRegE9C;\n\ts4Byte\tRegEB4;\n\ts4Byte\tRegEBC;\t\n\n\t//u1Byte bTXPowerTracking;\n\tu1Byte  \tTXPowercount;\n\tBOOLEAN bTXPowerTrackingInit; \n\tBOOLEAN bTXPowerTracking;\n\tu1Byte  \tTxPowerTrackControl; //for mp mode, turn off txpwrtracking as default\n\tu1Byte  \tTM_Trigger;\n    \tu1Byte  \tInternalPA5G[2];\t//pathA / pathB\n\t\n\tu1Byte  \tThermalMeter[2];    // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1\n\tu1Byte  \tThermalValue;\n\tu1Byte  \tThermalValue_LCK;\n\tu1Byte  \tThermalValue_IQK;\n\tu1Byte\tThermalValue_DPK;\t\t\n\tu1Byte\tThermalValue_AVG[AVG_THERMAL_NUM];\n\tu1Byte\tThermalValue_AVG_index;\t\t\n\tu1Byte\tThermalValue_RxGain;\n\tu1Byte\tThermalValue_Crystal;\n\tu1Byte\tThermalValue_DPKstore;\n\tu1Byte\tThermalValue_DPKtrack;\n\tBOOLEAN\tTxPowerTrackingInProgress;\n\tBOOLEAN\tbDPKenable;\n\t\n\tBOOLEAN\tbReloadtxpowerindex;\t\n\tu1Byte \tbRfPiEnable;\n\tu4Byte \tTXPowerTrackingCallbackCnt; //cosa add for debug\n\n\tu1Byte \tbCCKinCH14;\n\tu1Byte \tCCK_index;\n\tu1Byte \tOFDM_index[MAX_RF_PATH];\n\ts1Byte\tPowerIndexOffset;\n\ts1Byte\tDeltaPowerIndex;\n\ts1Byte\tDeltaPowerIndexLast;\t\n\tBOOLEAN bTxPowerChanged;\n\t\t\n\tu1Byte \tThermalValue_HP[HP_THERMAL_NUM];\n\tu1Byte \tThermalValue_HP_index;\n\tIQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];\n\tBOOLEAN bNeedIQK;\n\tu1Byte\tDelta_IQK;\n\tu1Byte\tDelta_LCK;\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE];\n\t\n\tu1Byte\t\t\tBbSwingIdxOfdm[MAX_RF_PATH];\n\tu1Byte\t\t\tBbSwingIdxOfdmCurrent;\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\t\n\tu1Byte\t\t\tBbSwingIdxOfdmBase[MAX_RF_PATH];\n#else\n\tu1Byte\t\t\tBbSwingIdxOfdmBase;\n#endif\n\tBOOLEAN\t\t\tBbSwingFlagOfdm;\n\tu1Byte\t\t\tBbSwingIdxCck;\n\tu1Byte\t\t\tBbSwingIdxCckCurrent;\n\tu1Byte\t\t\tBbSwingIdxCckBase;\n\tu1Byte\t\t\tDefaultOfdmIndex;\n\tu1Byte\t\t\tDefaultCckIndex;\t\n\tBOOLEAN\t\t\tBbSwingFlagCck;\n\t\n\ts1Byte\t\t\tAbsolute_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_CCKSwingIdx;\n\ts1Byte\t\t\tModify_TxAGC_Value;       /*Remnat compensate value at TxAGC */\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathB;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathC;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathD;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA_CCK;\n\t\n\ts1Byte\t\t\tKfreeOffset[MAX_RF_PATH];\n    \n\t//--------------------------------------------------------------------//\t\n\t\n\t//for IQK\t\n\tu4Byte \tRegC04;\n\tu4Byte \tReg874;\n\tu4Byte \tRegC08;\n\tu4Byte \tRegB68;\n\tu4Byte \tRegB6C;\n\tu4Byte \tReg870;\n\tu4Byte \tReg860;\n\tu4Byte \tReg864;\n\t\n\tBOOLEAN\tbIQKInitialized;\n\tBOOLEAN bLCKInProgress;\n\tBOOLEAN\tbAntennaDetected;\n\tu4Byte\tADDA_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\tIQK_MAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\tIQK_BB_backup_recover[9];\n\tu4Byte\tIQK_BB_backup[IQK_BB_REG_NUM];\t\n\n\t//for APK\n\tu4Byte \tAPKoutput[2][2]; //path A/B; output1_1a/output1_2a\n\tu1Byte \tbAPKdone;\n\tu1Byte \tbAPKThermalMeterIgnore;\n\tu1Byte \tbDPdone;\n\tu1Byte \tbDPPathAOK;\n\tu1Byte \tbDPPathBOK;\n\n\t/*Add by Yuchen for Kfree Phydm*/\n\tu1Byte\t\t\tRegRfKFreeEnable;\t/*for registry*/\n\tu1Byte\t\t\tRfKFreeEnable;\t\t/*for efuse enable check*/\n\t\n}ODM_RF_CAL_T,*PODM_RF_CAL_T;\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nODM_TXPowerTrackingCheck(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \n\nVOID \nodm_TXPowerTrackingCallbackThermalMeter92C(\n            IN PADAPTER\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingCallbackRXGainThermalMeter92D(\n\tIN PADAPTER \tAdapter\n\t);\n\nVOID\nodm_TXPowerTrackingCallbackThermalMeter92D(\n            IN PADAPTER\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingDirectCall92C(\n            IN\tPADAPTER\t\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t);\n\n#endif\n\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_ce.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n/*============================================================\t*/\n/* include files\t\t\t\t\t\t\t\t\t\t\t\t*/\n/*============================================================\t*/\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n//============================================================\n// Global var\n//============================================================\n\nu4Byte\tOFDMSwingTable[OFDM_TABLE_SIZE] = {\n\t0x7f8001fe,\t// 0, +6.0dB\n\t0x788001e2,\t// 1, +5.5dB\n\t0x71c001c7,\t// 2, +5.0dB\n\t0x6b8001ae,\t// 3, +4.5dB\n\t0x65400195,\t// 4, +4.0dB\n\t0x5fc0017f,\t// 5, +3.5dB\n\t0x5a400169,\t// 6, +3.0dB\n\t0x55400155,\t// 7, +2.5dB\n\t0x50800142,\t// 8, +2.0dB\n\t0x4c000130,\t// 9, +1.5dB\n\t0x47c0011f,\t// 10, +1.0dB\n\t0x43c0010f,\t// 11, +0.5dB\n\t0x40000100,\t// 12, +0dB\n\t0x3c8000f2,\t// 13, -0.5dB\n\t0x390000e4,\t// 14, -1.0dB\n\t0x35c000d7,\t// 15, -1.5dB\n\t0x32c000cb,\t// 16, -2.0dB\n\t0x300000c0,\t// 17, -2.5dB\n\t0x2d4000b5,\t// 18, -3.0dB\n\t0x2ac000ab,\t// 19, -3.5dB\n\t0x288000a2,\t// 20, -4.0dB\n\t0x26000098,\t// 21, -4.5dB\n\t0x24000090,\t// 22, -5.0dB\n\t0x22000088,\t// 23, -5.5dB\n\t0x20000080,\t// 24, -6.0dB\n\t0x1e400079,\t// 25, -6.5dB\n\t0x1c800072,\t// 26, -7.0dB\n\t0x1b00006c,\t// 27. -7.5dB\n\t0x19800066,\t// 28, -8.0dB\n\t0x18000060,\t// 29, -8.5dB\n\t0x16c0005b,\t// 30, -9.0dB\n\t0x15800056,\t// 31, -9.5dB\n\t0x14400051,\t// 32, -10.0dB\n\t0x1300004c,\t// 33, -10.5dB\n\t0x12000048,\t// 34, -11.0dB\n\t0x11000044,\t// 35, -11.5dB\n\t0x10000040,\t// 36, -12.0dB\n};\n\nu1Byte\tCCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},\t// 0, +0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 1, -0.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 2, -1.0dB\n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 3, -1.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 4, -2.0dB \n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 5, -2.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 6, -3.0dB\n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 7, -3.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 8, -4.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 9, -4.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 10, -5.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 11, -5.5dB\n\t{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},\t// 12, -6.0dB <== default\n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 13, -6.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 14, -7.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 15, -7.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 17, -8.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 18, -9.0dB \n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 19, -9.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 20, -10.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 21, -10.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 22, -11.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t// 23, -11.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t// 24, -12.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t// 25, -12.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t// 26, -13.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t// 27, -13.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t// 28, -14.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t// 29, -14.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t// 30, -15.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t// 31, -15.5dB\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}\t// 32, -16.0dB\n};\n\n\nu1Byte\tCCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {\n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},\t// 0, +0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 1, -0.5dB \n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 2, -1.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 3, -1.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 4, -2.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 5, -2.5dB\n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 6, -3.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 7, -3.5dB  \n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 8, -4.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 9, -4.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 10, -5.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 11, -5.5dB\n\t{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 12, -6.0dB  <== default\n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 13, -6.5dB \n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 14, -7.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 15, -7.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 17, -8.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 18, -9.0dB  \n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 19, -9.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 20, -10.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 21, -10.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 22, -11.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t// 23, -11.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t// 24, -12.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 25, -12.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 26, -13.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 27, -13.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 28, -14.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 29, -14.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 30, -15.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 31, -15.5dB\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}\t// 32, -16.0dB\n};\n\n\nu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE] = {\n\t0x0b40002d, // 0,  -15.0dB\t\n\t0x0c000030, // 1,  -14.5dB\n\t0x0cc00033, // 2,  -14.0dB\n\t0x0d800036, // 3,  -13.5dB\n\t0x0e400039, // 4,  -13.0dB    \n\t0x0f00003c, // 5,  -12.5dB\n\t0x10000040, // 6,  -12.0dB\n\t0x11000044, // 7,  -11.5dB\n\t0x12000048, // 8,  -11.0dB\n\t0x1300004c, // 9,  -10.5dB\n\t0x14400051, // 10, -10.0dB\n\t0x15800056, // 11, -9.5dB\n\t0x16c0005b, // 12, -9.0dB\n\t0x18000060, // 13, -8.5dB\n\t0x19800066, // 14, -8.0dB\n\t0x1b00006c, // 15, -7.5dB\n\t0x1c800072, // 16, -7.0dB\n\t0x1e400079, // 17, -6.5dB\n\t0x20000080, // 18, -6.0dB\n\t0x22000088, // 19, -5.5dB\n\t0x24000090, // 20, -5.0dB\n\t0x26000098, // 21, -4.5dB\n\t0x288000a2, // 22, -4.0dB\n\t0x2ac000ab, // 23, -3.5dB\n\t0x2d4000b5, // 24, -3.0dB\n\t0x300000c0, // 25, -2.5dB\n\t0x32c000cb, // 26, -2.0dB\n\t0x35c000d7, // 27, -1.5dB\n\t0x390000e4, // 28, -1.0dB\n\t0x3c8000f2, // 29, -0.5dB\n\t0x40000100, // 30, +0dB\n\t0x43c0010f, // 31, +0.5dB\n\t0x47c0011f, // 32, +1.0dB\n\t0x4c000130, // 33, +1.5dB\n\t0x50800142, // 34, +2.0dB\n\t0x55400155, // 35, +2.5dB\n\t0x5a400169, // 36, +3.0dB\n\t0x5fc0017f, // 37, +3.5dB\n\t0x65400195, // 38, +4.0dB\n\t0x6b8001ae, // 39, +4.5dB\n\t0x71c001c7, // 40, +5.0dB\n\t0x788001e2, // 41, +5.5dB\n\t0x7f8001fe  // 42, +6.0dB\n};               \n\n\nu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16] = {\n{0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-16dB*/\n{0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15.5dB*/\n{0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15dB*/\n{0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14.5dB*/\n{0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14dB*/\n{0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13.5dB*/\n{0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13dB*/\n{0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12.5dB*/\n{0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12dB*/\n{0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11.5dB*/\n{0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11dB*/\n{0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10.5dB*/\n{0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10dB*/\n{0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9.5dB*/\n{0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9dB*/\n{0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8.5dB*/\n{0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8dB*/\n{0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7.5dB*/\n{0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7dB*/\n{0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-6.5dB*/\n{0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     /*-6dB*/\n};\n\n\nu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 14, -9.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 18, -7.0dB \n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 19, -6.5dB\n    {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},\t// 20, -6.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 22, -5.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 24, -4.0dB \n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 25, -3.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 26, -3.0dB\n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 28, -2.0dB \n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 30, -1.0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 31, -0.5dB\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} \t// 32, +0dB\n};                                                                  \n\n\nu1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 14, -9.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 18, -7.0dB  \n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 19, -6.5dB \n\t{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 20, -6.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 22, -5.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 24, -4.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 25, -3.5dB  \n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 26, -3.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 28, -2.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 30, -1.0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 31, -0.5dB \n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} \t// 32, +0dB\t\n};\n\nu4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =\n{\n\t0x081, // 0,  -12.0dB\n\t0x088, // 1,  -11.5dB\n\t0x090, // 2,  -11.0dB\n\t0x099, // 3,  -10.5dB\n\t0x0A2, // 4,  -10.0dB\n\t0x0AC, // 5,  -9.5dB\n\t0x0B6, // 6,  -9.0dB\n\t0x0C0, // 7,  -8.5dB\n\t0x0CC, // 8,  -8.0dB\n\t0x0D8, // 9,  -7.5dB\n\t0x0E5, // 10, -7.0dB\n\t0x0F2, // 11, -6.5dB\n\t0x101, // 12, -6.0dB\n\t0x110, // 13, -5.5dB\n\t0x120, // 14, -5.0dB\n\t0x131, // 15, -4.5dB\n\t0x143, // 16, -4.0dB\n\t0x156, // 17, -3.5dB\n\t0x16A, // 18, -3.0dB\n\t0x180, // 19, -2.5dB\n\t0x197, // 20, -2.0dB\n\t0x1AF, // 21, -1.5dB\n\t0x1C8, // 22, -1.0dB\n\t0x1E3, // 23, -0.5dB\n\t0x200, // 24, +0  dB\n\t0x21E, // 25, +0.5dB\n\t0x23E, // 26, +1.0dB\n\t0x261, // 27, +1.5dB\n\t0x285, // 28, +2.0dB\n\t0x2AB, // 29, +2.5dB\n\t0x2D3, // 30, +3.0dB\n\t0x2FE, // 31, +3.5dB\n\t0x32B, // 32, +4.0dB\n\t0x35C, // 33, +4.5dB\n\t0x38E, // 34, +5.0dB\n\t0x3C4, // 35, +5.5dB\n\t0x3FE  // 36, +6.0dB\t\n};\n\n#ifdef AP_BUILD_WORKAROUND\n\nunsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {\n\t/*  +6.0dB */ 0x7f8001fe,\n\t/*  +5.5dB */ 0x788001e2,\n\t/*  +5.0dB */ 0x71c001c7,\n\t/*  +4.5dB */ 0x6b8001ae,\n\t/*  +4.0dB */ 0x65400195,\n\t/*  +3.5dB */ 0x5fc0017f,\n\t/*  +3.0dB */ 0x5a400169,\n\t/*  +2.5dB */ 0x55400155,\n\t/*  +2.0dB */ 0x50800142,\n\t/*  +1.5dB */ 0x4c000130,\n\t/*  +1.0dB */ 0x47c0011f,\n\t/*  +0.5dB */ 0x43c0010f,\n\t/*   0.0dB */ 0x40000100,\n\t/*  -0.5dB */ 0x3c8000f2,\n\t/*  -1.0dB */ 0x390000e4,\n\t/*  -1.5dB */ 0x35c000d7,\n\t/*  -2.0dB */ 0x32c000cb,\n\t/*  -2.5dB */ 0x300000c0,\n\t/*  -3.0dB */ 0x2d4000b5,\n\t/*  -3.5dB */ 0x2ac000ab,\n\t/*  -4.0dB */ 0x288000a2,\n\t/*  -4.5dB */ 0x26000098,\n\t/*  -5.0dB */ 0x24000090,\n\t/*  -5.5dB */ 0x22000088,\n\t/*  -6.0dB */ 0x20000080,\n\t/*  -6.5dB */ 0x1a00006c,\n\t/*  -7.0dB */ 0x1c800072,\n\t/*  -7.5dB */ 0x18000060,\n\t/*  -8.0dB */ 0x19800066,\n\t/*  -8.5dB */ 0x15800056,\n\t/*  -9.0dB */ 0x26c0005b,\n\t/*  -9.5dB */ 0x14400051,\n\t/* -10.0dB */ 0x24400051,\n\t/* -10.5dB */ 0x1300004c,\n\t/* -11.0dB */ 0x12000048,\n\t/* -11.5dB */ 0x11000044,\n\t/* -12.0dB */ 0x10000040\n};\n#endif\n\n\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN\tPVOID\tpDM_VOID \n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tif(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))\n\t\treturn;\n#endif\n\n\todm_TXPowerTrackingThermalMeterInit(pDM_Odm);\n}\t\n\nu1Byte \ngetSwingIndex(\n\tIN\tPVOID\tpDM_VOID \n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu1Byte \t\t\ti = 0;\n\tu4Byte \t\t\tbbSwing;\n\tu4Byte \t\t\tswingTableSize;\n\tpu4Byte \t\t\tpSwingTable;\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B\n\t\t|| pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8703B\n\t) {\n\t\tbbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);\n\n\t\tpSwingTable = OFDMSwingTable_New;\n\t\tswingTableSize = OFDM_TABLE_SIZE;\n\t} else {\n#if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)\n\t\t{\n\t\t\tbbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);\n\t\t\tpSwingTable = TxScalingTable_Jaguar;\n\t\t\tswingTableSize = TXSCALE_TABLE_SIZE;\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tbbSwing = 0;\n\t\t\tpSwingTable = OFDMSwingTable;\n\t\t\tswingTableSize = OFDM_TABLE_SIZE;\n\t\t}\n\t}\n\n\tfor (i = 0; i < swingTableSize; ++i) {\n\t\tu4Byte tableValue = pSwingTable[i];\n\t\t\n\t\tif (tableValue >= 0x100000 )\n\t\t\ttableValue >>= 22;\n\t\tif (bbSwing == tableValue)\n\t\t\tbreak;\n\t}\n\treturn i;\n}\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);\n\tu1Byte \t\t\tp = 0;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif(pDM_Odm->mp_mode == FALSE)\n\t\tpHalData->TxPowerTrackControl = TRUE;\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tpRFCalibrateInfo->bTXPowerTracking = _TRUE;\n\tpRFCalibrateInfo->TXPowercount = 0;\n\tpRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;\n\n\tif(pDM_Odm->mp_mode == FALSE)\n\t\tpRFCalibrateInfo->TxPowerTrackControl = _TRUE;\n\telse\n\t\tpRFCalibrateInfo->TxPowerTrackControl = _FALSE;\t\n\n\tif(pDM_Odm->mp_mode == FALSE)\n\t\tpRFCalibrateInfo->TxPowerTrackControl = _TRUE;\n\n\n\tMSG_8192C(\"pDM_Odm TxPowerTrackControl = %d\\n\", pRFCalibrateInfo->TxPowerTrackControl);\n\t\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\t#ifdef RTL8188E_SUPPORT\n\t{\n\t\tpRFCalibrateInfo->bTXPowerTracking = _TRUE;\n\t\tpRFCalibrateInfo->TXPowercount = 0;\n\t\tpRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;\n\t\tpRFCalibrateInfo->TxPowerTrackControl = _TRUE;\n\t}\n\t#endif\n#endif\n\n\t//pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;\n\tpRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;\n\tpRFCalibrateInfo->ThermalValue_IQK = pHalData->EEPROMThermalMeter;\n\tpRFCalibrateInfo->ThermalValue_LCK = pHalData->EEPROMThermalMeter;\t\n\n\t// The index of \"0 dB\" in SwingTable.\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||\n\t\tpDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8703B) {\n\t\tpRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;\n\t\tpRFCalibrateInfo->DefaultCckIndex = 20;\t\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8188F)          //add by Mingzhi.Guo  2015-03-23\n\t{\n\t\tpRFCalibrateInfo->DefaultOfdmIndex =28;\t\t\t\t\t\t\t//OFDM: -1dB\n\t\tpRFCalibrateInfo->DefaultCckIndex =20;\t\t\t\t\t\t\t//CCK:-6dB\n\t}\n\telse\n\t{\n\t\tpRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;\n\t\tpRFCalibrateInfo->DefaultCckIndex = 24;\t\n\t}\n\n\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\n\tpRFCalibrateInfo->CCK_index = pRFCalibrateInfo->DefaultCckIndex;\n\t\n\tfor (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\n\t{\n\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\t\t\n\t\tpRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\t\t\n\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\n\t\tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t}\n\tpRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;\t\t\t//add by Mingzhi.Guo\n\tpRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;\t\t\t//add by Mingzhi.Guo\n\n}\n\n\nVOID\nODM_TXPowerTrackingCheck(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\t/* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\tat the same time. In the stage2/3, we need to prive universal interface and merge all\n\tHW dynamic mechanism. */\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\t\t\todm_TXPowerTrackingCheckMP(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_CE:\n\t\t\todm_TXPowerTrackingCheckCE(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_AP:\n\t\t\todm_TXPowerTrackingCheckAP(pDM_Odm);\t\t\n\t\t\tbreak;\t\t\n\n\t\tdefault:\n\t\t\tbreak;\t\n\t}\n\n}\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\tif (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t\treturn;\n\n\tif(!pDM_Odm->RFCalibrateInfo.TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\t//pHalData->TxPowerCheckCnt++;\t//cosa add for debug\n\t\tif (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)\n\t\t\t|| IS_HARDWARE_TYPE_8723B(Adapter)\n\t\t\t|| IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter)\n\t\t\t|| IS_HARDWARE_TYPE_8703B(Adapter)\n\t\t) {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);\n\t\t} else {\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);\n\t\t}\n\t\t\n\t\t//DBG_871X(\"Trigger Thermal Meter!!\\n\");\n\t\t\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 1;\n\t\treturn;\n\t}\n\telse\n\t{\n\t\t//DBG_871X(\"Schedule TxPowerTracking direct call!!\\n\");\n\t\tODM_TXPowerTrackingCallback_ThermalMeter(Adapter);\n\t\tpDM_Odm->RFCalibrateInfo.TM_Trigger = 0;\n\t}\n\t\n#endif\t\n}\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\tif (ODM_CheckPowerStatus(Adapter) == FALSE) \n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, (\"===>ODM_CheckPowerStatus() return FALSE\\n\"));\n\t\treturn;\n\t}\n\n\tif(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)\n\t\todm_TXPowerTrackingThermalMeterCheck(Adapter);\n\telse {\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, (\"!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\\n\"));\n\t}\n#endif\n\t\n}\n\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\n\treturn;\n\n#endif\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n#ifndef AP_BUILD_WORKAROUND\n\tstatic u1Byte\t\t\tTM_Trigger = 0;\n\n\tif(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,\n\t\t\t(\"===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(!TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\tif (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||\n\t\t\t    IS_HARDWARE_TYPE_8723B(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8188F(Adapter) \n\t\t\t    || IS_HARDWARE_TYPE_8703B(Adapter))\n\t\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);\n\t\telse\n\t\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);\n\t\t\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Trigger Thermal Meter!!\\n\"));\n\t\t\n\t\tTM_Trigger = 1;\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Schedule TxPowerTracking direct call!!\\n\"));\t\t\n\t\todm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.\n\t\tTM_Trigger = 0;\n\t}\n#endif\n}\n#endif\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMPOWERTRACKING_H__\n#define    __PHYDMPOWERTRACKING_H__\n\n#define POWRTRACKING_VERSION\t\"1.1\"\n\n#define\t\tDPK_DELTA_MAPPING_NUM\t13\n#define\t\tindex_mapping_HP_NUM\t15\t\n#define\tOFDM_TABLE_SIZE \t43\n#define\tCCK_TABLE_SIZE\t\t\t33\n#define\tCCK_TABLE_SIZE_88F\t21\n#define TXSCALE_TABLE_SIZE \t\t37\n#define TXPWR_TRACK_TABLE_SIZE \t30\n#define DELTA_SWINGIDX_SIZE     30\n#define BAND_NUM \t\t\t\t4\n\n#define AVG_THERMAL_NUM\t\t8\n#define HP_THERMAL_NUM\t\t8\n#define IQK_MAC_REG_NUM\t\t4\n#define IQK_ADDA_REG_NUM\t\t16\n#define IQK_BB_REG_NUM_MAX\t10\n\n#define IQK_BB_REG_NUM\t\t9\n\n\n\n#define IQK_Matrix_REG_NUM\t8\n#define IQK_Matrix_Settings_NUM\t14+24+21 // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G\n\nextern\tu4Byte OFDMSwingTable[OFDM_TABLE_SIZE];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8];\n\nextern\tu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16];\n\n\nextern  u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE];\n\n// <20121018, Kordan> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table.\nstatic u1Byte DeltaSwingTableIdx_2GA_P_8188E[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4,  4,  4,  4,  4,  4,  5,  5,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9};\nstatic u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5,  6,  6,  7,  7,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11, 11}; \n\n#define dm_CheckTXPowerTracking \tODM_TXPowerTrackingCheck\n\ntypedef struct _IQK_MATRIX_REGS_SETTING{\n\tBOOLEAN \tbIQKDone;\n\ts4Byte\t\tValue[3][IQK_Matrix_REG_NUM];\n\tBOOLEAN \tbBWIqkResultSaved[3];\t\n}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;\n\ntypedef struct ODM_RF_Calibration_Structure\n{\n\t//for tx power tracking\n\t\n\tu4Byte\tRegA24; // for TempCCK\n\ts4Byte\tRegE94;\n\ts4Byte \tRegE9C;\n\ts4Byte\tRegEB4;\n\ts4Byte\tRegEBC;\t\n\n\tu1Byte  \tTXPowercount;\n\tBOOLEAN bTXPowerTrackingInit; \n\tBOOLEAN bTXPowerTracking;\n\tu1Byte  \tTxPowerTrackControl; //for mp mode, turn off txpwrtracking as default\n\tu1Byte  \tTM_Trigger;\n    \tu1Byte  \tInternalPA5G[2];\t//pathA / pathB\n\t\n\tu1Byte  \tThermalMeter[2];    // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1\n\tu1Byte  \tThermalValue;\n\tu1Byte  \tThermalValue_LCK;\n\tu1Byte  \tThermalValue_IQK;\n\tu1Byte\tThermalValue_DPK;\t\t\n\tu1Byte\tThermalValue_AVG[AVG_THERMAL_NUM];\n\tu1Byte\tThermalValue_AVG_index;\t\t\n\tu1Byte\tThermalValue_RxGain;\n\tu1Byte\tThermalValue_Crystal;\n\tu1Byte\tThermalValue_DPKstore;\n\tu1Byte\tThermalValue_DPKtrack;\n\tBOOLEAN\tTxPowerTrackingInProgress;\n\t\n\tBOOLEAN\tbReloadtxpowerindex;\t\n\tu1Byte \tbRfPiEnable;\n\tu4Byte \tTXPowerTrackingCallbackCnt; //cosa add for debug\n\n\n\t//------------------------- Tx power Tracking -------------------------//\n\tu1Byte \tbCCKinCH14;\n\tu1Byte \tCCK_index;\n\tu1Byte \tOFDM_index[MAX_RF_PATH];\n\ts1Byte\tPowerIndexOffset[MAX_RF_PATH];\n\ts1Byte\tDeltaPowerIndex[MAX_RF_PATH];\n\ts1Byte\tDeltaPowerIndexLast[MAX_RF_PATH];\t\n\tBOOLEAN bTxPowerChanged;\n\t\t\n\tu1Byte \tThermalValue_HP[HP_THERMAL_NUM];\n\tu1Byte \tThermalValue_HP_index;\n\tIQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];\n\tu1Byte\tDelta_LCK;\n\ts1Byte  BBSwingDiff2G, BBSwingDiff5G; // Unit: dB\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE];\n    \n\tu1Byte\t\t\tBbSwingIdxOfdm[MAX_RF_PATH];\n\tu1Byte\t\t\tBbSwingIdxOfdmCurrent;\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\t\n\tu1Byte\t\t\tBbSwingIdxOfdmBase[MAX_RF_PATH];\n#else\n\tu1Byte\t\t\tBbSwingIdxOfdmBase;\n#endif\n\tBOOLEAN\t\t\tBbSwingFlagOfdm;\n\tu1Byte\t\t\tBbSwingIdxCck;\n\tu1Byte\t\t\tBbSwingIdxCckCurrent;\n\tu1Byte\t\t\tBbSwingIdxCckBase;\n\tu1Byte\t\t\tDefaultOfdmIndex;\n\tu1Byte\t\t\tDefaultCckIndex;\t\n\tBOOLEAN\t\t\tBbSwingFlagCck;\n\t\n\ts1Byte\t\t\tAbsolute_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_CCKSwingIdx;\n\ts1Byte\t\t\tModify_TxAGC_Value;       /*Remnat compensate value at TxAGC */\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathB;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathC;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathD;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA_CCK;\n\t\n\ts1Byte\t\t\tKfreeOffset[MAX_RF_PATH];\n    \n\t//--------------------------------------------------------------------//\t\n\t\n\t//for IQK\t\n\tu4Byte \tRegC04;\n\tu4Byte \tReg874;\n\tu4Byte \tRegC08;\n\tu4Byte \tRegB68;\n\tu4Byte \tRegB6C;\n\tu4Byte \tReg870;\n\tu4Byte \tReg860;\n\tu4Byte \tReg864;\n\t\n\tBOOLEAN\tbIQKInitialized;\n\tBOOLEAN bLCKInProgress;\n\tBOOLEAN\tbAntennaDetected;\n\tBOOLEAN\tbNeedIQK;\n\tBOOLEAN\tbIQKInProgress;\t\n\tu1Byte\tDelta_IQK;\n\tu4Byte\tADDA_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\tIQK_MAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\tIQK_BB_backup_recover[9];\n\tu4Byte\tIQK_BB_backup[IQK_BB_REG_NUM];\t\n\tu4Byte \tTxIQC_8723B[2][3][2]; // { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}}\n\tu4Byte \tRxIQC_8723B[2][2][2]; // { {S1: 0xc14, 0xca0} ,           {S0: 0xc14, 0xca0}}\n\tu4Byte\tTxIQC_8703B[3][2];\t/* { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}}*/\n\tu4Byte\tRxIQC_8703B[2][2];\t/* { {S1: 0xc14, 0xca0} ,           {S0: 0xc14, 0xca0}}*/\n\n\t\n\n\t// <James> IQK time measurement \n\tu8Byte\tIQK_StartTime;\n\tu8Byte\tIQK_ProgressingTime;\n\tu4Byte  LOK_Result;\n\n\t//for APK\n\tu4Byte \tAPKoutput[2][2]; //path A/B; output1_1a/output1_2a\n\tu1Byte \tbAPKdone;\n\tu1Byte \tbAPKThermalMeterIgnore;\n\t\n\t// DPK\n\tBOOLEAN bDPKFail;\t\n\tu1Byte \tbDPdone;\n\tu1Byte \tbDPPathAOK;\n\tu1Byte \tbDPPathBOK;\n\n\tu4Byte\tTxLOK[2];\n\tu4Byte  DpkTxAGC;\n\ts4Byte  DpkGain;\n\tu4Byte  DpkThermal[4];\n\ts1Byte Modify_TxAGC_Value_OFDM;\n\ts1Byte Modify_TxAGC_Value_CCK;\n}ODM_RF_CAL_T,*PODM_RF_CAL_T;\n\n\nVOID\t\nODM_TXPowerTrackingCheck(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN \tPVOID\t \tpDM_VOID\n\t);\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \n\nVOID \nodm_TXPowerTrackingCallbackThermalMeter92C(\n            IN PADAPTER\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingCallbackRXGainThermalMeter92D(\n\tIN PADAPTER \tAdapter\n\t);\n\nVOID\nodm_TXPowerTrackingCallbackThermalMeter92D(\n            IN PADAPTER\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingDirectCall92C(\n            IN\tPADAPTER\t\tAdapter\n            );\n\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t);\n\n#endif\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_win.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n//============================================================\n// Global var\n//============================================================\n\nu4Byte\tOFDMSwingTable[OFDM_TABLE_SIZE] = {\n\t0x7f8001fe,\t// 0, +6.0dB\n\t0x788001e2,\t// 1, +5.5dB\n\t0x71c001c7,\t// 2, +5.0dB\n\t0x6b8001ae,\t// 3, +4.5dB\n\t0x65400195,\t// 4, +4.0dB\n\t0x5fc0017f,\t// 5, +3.5dB\n\t0x5a400169,\t// 6, +3.0dB\n\t0x55400155,\t// 7, +2.5dB\n\t0x50800142,\t// 8, +2.0dB\n\t0x4c000130,\t// 9, +1.5dB\n\t0x47c0011f,\t// 10, +1.0dB\n\t0x43c0010f,\t// 11, +0.5dB\n\t0x40000100,\t// 12, +0dB\n\t0x3c8000f2,\t// 13, -0.5dB\n\t0x390000e4,\t// 14, -1.0dB\n\t0x35c000d7,\t// 15, -1.5dB\n\t0x32c000cb,\t// 16, -2.0dB\n\t0x300000c0,\t// 17, -2.5dB\n\t0x2d4000b5,\t// 18, -3.0dB\n\t0x2ac000ab,\t// 19, -3.5dB\n\t0x288000a2,\t// 20, -4.0dB\n\t0x26000098,\t// 21, -4.5dB\n\t0x24000090,\t// 22, -5.0dB\n\t0x22000088,\t// 23, -5.5dB\n\t0x20000080,\t// 24, -6.0dB\n\t0x1e400079,\t// 25, -6.5dB\n\t0x1c800072,\t// 26, -7.0dB\n\t0x1b00006c,\t// 27. -7.5dB\n\t0x19800066,\t// 28, -8.0dB\n\t0x18000060,\t// 29, -8.5dB\n\t0x16c0005b,\t// 30, -9.0dB\n\t0x15800056,\t// 31, -9.5dB\n\t0x14400051,\t// 32, -10.0dB\n\t0x1300004c,\t// 33, -10.5dB\n\t0x12000048,\t// 34, -11.0dB\n\t0x11000044,\t// 35, -11.5dB\n\t0x10000040,\t// 36, -12.0dB\n};\n\nu1Byte\tCCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},\t// 0, +0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 1, -0.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 2, -1.0dB\n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 3, -1.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 4, -2.0dB \n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 5, -2.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 6, -3.0dB\n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 7, -3.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 8, -4.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 9, -4.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 10, -5.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 11, -5.5dB\n\t{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},\t// 12, -6.0dB <== default\n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 13, -6.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 14, -7.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 15, -7.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 17, -8.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 18, -9.0dB \n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 19, -9.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 20, -10.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 21, -10.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 22, -11.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t// 23, -11.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t// 24, -12.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t// 25, -12.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t// 26, -13.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t// 27, -13.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t// 28, -14.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t// 29, -14.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t// 30, -15.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t// 31, -15.5dB\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}\t// 32, -16.0dB\n};\n\n\nu1Byte\tCCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {\n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},\t// 0, +0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 1, -0.5dB \n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 2, -1.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 3, -1.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 4, -2.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 5, -2.5dB\n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 6, -3.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 7, -3.5dB  \n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 8, -4.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 9, -4.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 10, -5.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 11, -5.5dB\n\t{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 12, -6.0dB  <== default\n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 13, -6.5dB \n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 14, -7.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 15, -7.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 17, -8.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 18, -9.0dB  \n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 19, -9.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 20, -10.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 21, -10.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 22, -11.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t// 23, -11.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t// 24, -12.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 25, -12.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 26, -13.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t// 27, -13.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 28, -14.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 29, -14.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 30, -15.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t// 31, -15.5dB\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}\t// 32, -16.0dB\n};\n\n\nu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE] = {\n\t0x0b40002d, // 0,  -15.0dB\t\n\t0x0c000030, // 1,  -14.5dB\n\t0x0cc00033, // 2,  -14.0dB\n\t0x0d800036, // 3,  -13.5dB\n\t0x0e400039, // 4,  -13.0dB    \n\t0x0f00003c, // 5,  -12.5dB\n\t0x10000040, // 6,  -12.0dB\n\t0x11000044, // 7,  -11.5dB\n\t0x12000048, // 8,  -11.0dB\n\t0x1300004c, // 9,  -10.5dB\n\t0x14400051, // 10, -10.0dB\n\t0x15800056, // 11, -9.5dB\n\t0x16c0005b, // 12, -9.0dB\n\t0x18000060, // 13, -8.5dB\n\t0x19800066, // 14, -8.0dB\n\t0x1b00006c, // 15, -7.5dB\n\t0x1c800072, // 16, -7.0dB\n\t0x1e400079, // 17, -6.5dB\n\t0x20000080, // 18, -6.0dB\n\t0x22000088, // 19, -5.5dB\n\t0x24000090, // 20, -5.0dB\n\t0x26000098, // 21, -4.5dB\n\t0x288000a2, // 22, -4.0dB\n\t0x2ac000ab, // 23, -3.5dB\n\t0x2d4000b5, // 24, -3.0dB\n\t0x300000c0, // 25, -2.5dB\n\t0x32c000cb, // 26, -2.0dB\n\t0x35c000d7, // 27, -1.5dB\n\t0x390000e4, // 28, -1.0dB\n\t0x3c8000f2, // 29, -0.5dB\n\t0x40000100, // 30, +0dB\n\t0x43c0010f, // 31, +0.5dB\n\t0x47c0011f, // 32, +1.0dB\n\t0x4c000130, // 33, +1.5dB\n\t0x50800142, // 34, +2.0dB\n\t0x55400155, // 35, +2.5dB\n\t0x5a400169, // 36, +3.0dB\n\t0x5fc0017f, // 37, +3.5dB\n\t0x65400195, // 38, +4.0dB\n\t0x6b8001ae, // 39, +4.5dB\n\t0x71c001c7, // 40, +5.0dB\n\t0x788001e2, // 41, +5.5dB\n\t0x7f8001fe  // 42, +6.0dB\n};               \n\n\nu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16] = {\n{0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-16dB*/\n{0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15.5dB*/\n{0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15dB*/\n{0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14.5dB*/\n{0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14dB*/\n{0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13.5dB*/\n{0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13dB*/\n{0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12.5dB*/\n{0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12dB*/\n{0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11.5dB*/\n{0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11dB*/\n{0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10.5dB*/\n{0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10dB*/\n{0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9.5dB*/\n{0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9dB*/\n{0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8.5dB*/\n{0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8dB*/\n{0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7.5dB*/\n{0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7dB*/\n{0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-6.5dB*/\n{0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     /*-6dB*/\n};\n\n\nu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {\n\t{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},\t// 14, -9.0dB \n\t{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},\t// 16, -8.0dB \n\t{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},\t// 18, -7.0dB \n\t{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},\t// 19, -6.5dB\n    {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},\t// 20, -6.0dB \n\t{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},\t// 22, -5.0dB \n\t{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},\t// 24, -4.0dB \n\t{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},\t// 25, -3.5dB\n\t{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},\t// 26, -3.0dB\n\t{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},\t// 28, -2.0dB \n\t{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},\t// 30, -1.0dB\n\t{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},\t// 31, -0.5dB\n\t{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} \t// 32, +0dB\n};                                                                  \n\n\nu1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {\n\t{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},\t//  0, -16.0dB\n\t{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  1, -15.5dB\n\t{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  2, -15.0dB\n\t{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  3, -14.5dB\n\t{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},\t//  4, -14.0dB\n\t{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  5, -13.5dB\n\t{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  6, -13.0dB\n\t{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},\t//  7, -12.5dB\n\t{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  8, -12.0dB\n\t{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},\t//  9, -11.5dB\n\t{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 10, -11.0dB\n\t{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},\t// 11, -10.5dB\n\t{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 12, -10.0dB\n\t{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},\t// 13, -9.5dB\n\t{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 14, -9.0dB  \n\t{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},\t// 15, -8.5dB\n\t{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 16, -8.0dB  \n\t{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},\t// 17, -7.5dB\n\t{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},\t// 18, -7.0dB  \n\t{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},\t// 19, -6.5dB \n\t{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 20, -6.0dB  \n\t{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},\t// 21, -5.5dB\n\t{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},\t// 22, -5.0dB  \n\t{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},\t// 23, -4.5dB\n\t{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},\t// 24, -4.0dB  \n\t{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},\t// 25, -3.5dB  \n\t{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},\t// 26, -3.0dB  \n\t{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},\t// 27, -2.5dB\n\t{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},\t// 28, -2.0dB  \n\t{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},\t// 29, -1.5dB\n\t{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},\t// 30, -1.0dB  \n\t{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},\t// 31, -0.5dB \n\t{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} \t// 32, +0dB\t\n};\n\nu4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =\n{\n\t0x081, // 0,  -12.0dB\n\t0x088, // 1,  -11.5dB\n\t0x090, // 2,  -11.0dB\n\t0x099, // 3,  -10.5dB\n\t0x0A2, // 4,  -10.0dB\n\t0x0AC, // 5,  -9.5dB\n\t0x0B6, // 6,  -9.0dB\n\t0x0C0, // 7,  -8.5dB\n\t0x0CC, // 8,  -8.0dB\n\t0x0D8, // 9,  -7.5dB\n\t0x0E5, // 10, -7.0dB\n\t0x0F2, // 11, -6.5dB\n\t0x101, // 12, -6.0dB\n\t0x110, // 13, -5.5dB\n\t0x120, // 14, -5.0dB\n\t0x131, // 15, -4.5dB\n\t0x143, // 16, -4.0dB\n\t0x156, // 17, -3.5dB\n\t0x16A, // 18, -3.0dB\n\t0x180, // 19, -2.5dB\n\t0x197, // 20, -2.0dB\n\t0x1AF, // 21, -1.5dB\n\t0x1C8, // 22, -1.0dB\n\t0x1E3, // 23, -0.5dB\n\t0x200, // 24, +0  dB\n\t0x21E, // 25, +0.5dB\n\t0x23E, // 26, +1.0dB\n\t0x261, // 27, +1.5dB\n\t0x285, // 28, +2.0dB\n\t0x2AB, // 29, +2.5dB\n\t0x2D3, // 30, +3.0dB\n\t0x2FE, // 31, +3.5dB\n\t0x32B, // 32, +4.0dB\n\t0x35C, // 33, +4.5dB\n\t0x38E, // 34, +5.0dB\n\t0x3C4, // 35, +5.5dB\n\t0x3FE  // 36, +6.0dB\t\n};\n\n#ifdef AP_BUILD_WORKAROUND\n\nunsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {\n\t/*  +6.0dB */ 0x7f8001fe,\n\t/*  +5.5dB */ 0x788001e2,\n\t/*  +5.0dB */ 0x71c001c7,\n\t/*  +4.5dB */ 0x6b8001ae,\n\t/*  +4.0dB */ 0x65400195,\n\t/*  +3.5dB */ 0x5fc0017f,\n\t/*  +3.0dB */ 0x5a400169,\n\t/*  +2.5dB */ 0x55400155,\n\t/*  +2.0dB */ 0x50800142,\n\t/*  +1.5dB */ 0x4c000130,\n\t/*  +1.0dB */ 0x47c0011f,\n\t/*  +0.5dB */ 0x43c0010f,\n\t/*   0.0dB */ 0x40000100,\n\t/*  -0.5dB */ 0x3c8000f2,\n\t/*  -1.0dB */ 0x390000e4,\n\t/*  -1.5dB */ 0x35c000d7,\n\t/*  -2.0dB */ 0x32c000cb,\n\t/*  -2.5dB */ 0x300000c0,\n\t/*  -3.0dB */ 0x2d4000b5,\n\t/*  -3.5dB */ 0x2ac000ab,\n\t/*  -4.0dB */ 0x288000a2,\n\t/*  -4.5dB */ 0x26000098,\n\t/*  -5.0dB */ 0x24000090,\n\t/*  -5.5dB */ 0x22000088,\n\t/*  -6.0dB */ 0x20000080,\n\t/*  -6.5dB */ 0x1a00006c,\n\t/*  -7.0dB */ 0x1c800072,\n\t/*  -7.5dB */ 0x18000060,\n\t/*  -8.0dB */ 0x19800066,\n\t/*  -8.5dB */ 0x15800056,\n\t/*  -9.0dB */ 0x26c0005b,\n\t/*  -9.5dB */ 0x14400051,\n\t/* -10.0dB */ 0x24400051,\n\t/* -10.5dB */ 0x1300004c,\n\t/* -11.0dB */ 0x12000048,\n\t/* -11.5dB */ 0x11000044,\n\t/* -12.0dB */ 0x10000040\n};\n\n#endif\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tif(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES|ODM_RTL8822B)))\n\t\treturn;\n#endif\n\n\todm_TXPowerTrackingThermalMeterInit(pDM_Odm);\n}\t\n\nu1Byte \ngetSwingIndex(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu1Byte \t\t\ti = 0;\n\tu4Byte \t\t\tbbSwing;\n\tu4Byte \t\t\tswingTableSize;\n\tpu4Byte \t\t\tpSwingTable;\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||\n\t\tpDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8703B) \n\t{\n\t\tbbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);\n\n\t\tpSwingTable = OFDMSwingTable_New;\n\t\tswingTableSize = OFDM_TABLE_SIZE;\n\t} else {\n\t\tbbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);\n\t\tpSwingTable = TxScalingTable_Jaguar;\n\t\tswingTableSize = TXSCALE_TABLE_SIZE;\t\t\n\t}\n\n\tfor (i = 0; i < swingTableSize; ++i) {\n\t\tu4Byte tableValue = pSwingTable[i];\n\t\t\n\t\tif (tableValue >= 0x100000 )\n\t\t\ttableValue >>= 22;\n\t\tif (bbSwing == tableValue)\n\t\t\tbreak;\n\t}\n\treturn i;\n}\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu1Byte \t\t\tp = 0;\n\n\tif(pDM_Odm->mp_mode == FALSE)\n\t\tpRFCalibrateInfo->TxPowerTrackControl = TRUE;\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#ifdef CONFIG_RTL8188E\n\t{\n\t\tpRFCalibrateInfo->bTXPowerTracking = _TRUE;\n\t\tpRFCalibrateInfo->TXPowercount = 0;\n\t\tpRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;\n\n\t\tif(pDM_Odm->mp_mode == FALSE)\n\t\t\tpRFCalibrateInfo->TxPowerTrackControl = _TRUE;\n\t\t\n\t\tMSG_8192C(\"pDM_Odm TxPowerTrackControl = %d\\n\", pRFCalibrateInfo->TxPowerTrackControl);\n\t}\n\t#else\n\t{\n\t\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\tstruct dm_priv\t*pdmpriv = &pHalData->dmpriv;\n\n\t\tpdmpriv->bTXPowerTracking = _TRUE;\n\t\tpdmpriv->TXPowercount = 0;\n\t\tpdmpriv->bTXPowerTrackingInit = _FALSE;\n\n\t\tif(pDM_Odm->mp_mode == FALSE)\n\t\t\tpdmpriv->TxPowerTrackControl = _TRUE;\n\n\t\tMSG_8192C(\"pdmpriv->TxPowerTrackControl = %d\\n\", pdmpriv->TxPowerTrackControl);\n\t\n\t}\t\n\t#endif//endif (CONFIG_RTL8188E==1)\t\n#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\t#ifdef RTL8188E_SUPPORT\n\t{\n\t\tpRFCalibrateInfo->bTXPowerTracking = _TRUE;\n\t\tpRFCalibrateInfo->TXPowercount = 0;\n\t\tpRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;\n\t\tpRFCalibrateInfo->TxPowerTrackControl = _TRUE;\n\t}\n\t#endif\n#endif\n\n\tpRFCalibrateInfo->TxPowerTrackControl = TRUE;\n\tpRFCalibrateInfo->ThermalValue \t\t= pHalData->EEPROMThermalMeter;\n\tpRFCalibrateInfo->ThermalValue_IQK \t= pHalData->EEPROMThermalMeter;\n\tpRFCalibrateInfo->ThermalValue_LCK \t= pHalData->EEPROMThermalMeter;\t\n\n\t// The index of \"0 dB\" in SwingTable.\n\tif (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||\n\t\tpDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8703B) \n\t{\n\t\tpRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;\n\t\tpRFCalibrateInfo->DefaultCckIndex = 20;\t\n\t}\n\telse if(pDM_Odm->SupportICType == ODM_RTL8188F)          //add by Mingzhi.Guo  2015-03-23\n\t{\n\t\tpRFCalibrateInfo->DefaultOfdmIndex =28;\t\t\t\t\t\t\t//OFDM: -1dB\n\t\tpRFCalibrateInfo->DefaultCckIndex =20;\t\t\t\t\t\t\t//CCK:-6dB\n\t}\n\telse\n\t{\n\t\tpRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;\n\t\tpRFCalibrateInfo->DefaultCckIndex = 24;\t\n\t}\n\n\tpRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\n\tpRFCalibrateInfo->CCK_index = pRFCalibrateInfo->DefaultCckIndex;\n\t\n\tfor (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\n\t{\n\t\tpRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\t\t\n\t   \tpRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\t\t\n\t\tpRFCalibrateInfo->DeltaPowerIndex[p] = 0;\n\t\tpRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\n\t\tpRFCalibrateInfo->PowerIndexOffset[p] = 0;\n\t\tpRFCalibrateInfo->KfreeOffset[p] = 0;\n\t}\n\tpRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;\t\t\t//add by Mingzhi.Guo\n\tpRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;\t\t\t//add by Mingzhi.Guo\n\n}\n\n\nVOID\nODM_TXPowerTrackingCheck(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\t\t\todm_TXPowerTrackingCheckMP(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_CE:\n\t\t\todm_TXPowerTrackingCheckCE(pDM_Odm);\n\t\t\tbreak;\n\n\t\tcase\tODM_AP:\n\t\t\todm_TXPowerTrackingCheckAP(pDM_Odm);\t\t\n\t\t\tbreak;\t\t\n\n\t\tdefault:\n\t\t\tbreak;\t\n\t}\n\n}\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\t#if ((RTL8188F_SUPPORT == 1))\n\trtl8192c_odm_CheckTXPowerTracking(Adapter);\n\t#endif\n\n\t#if(RTL8188E_SUPPORT==1)\n\n\tif(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t{\n\t\treturn;\n\t}\n\n\tif(!pRFCalibrateInfo->TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);\n\t\t//DBG_8192C(\"Trigger 92C Thermal Meter!!\\n\");\n\t\t\n\t\tpRFCalibrateInfo->TM_Trigger = 1;\n\t\treturn;\n\t\t\n\t}\n\telse\n\t{\n\t\t//DBG_8192C(\"Schedule TxPowerTracking direct call!!\\n\");\n\t\todm_TXPowerTrackingCallback_ThermalMeter_8188E(Adapter);\n\t\tpRFCalibrateInfo->TM_Trigger = 0;\n\t}\n\t#endif\n#endif\t\n}\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\n\tif(*pDM_Odm->pIsFcsModeEnable)\n\t\treturn;\n\n\tif (ODM_CheckPowerStatus(Adapter) == FALSE) \n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, (\"===>ODM_CheckPowerStatus() return FALSE\\n\"));\n\t\treturn;\n\t}\n\n\tif(IS_HARDWARE_TYPE_8821B(Adapter)) // TODO: Don't Do PowerTracking\n\t\treturn;\n\t\n//\t#if(RTL8192D_SUPPORT==1)\n//\tif(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)\n\tif (IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8188F(Adapter))\n\t\todm_TXPowerTrackingThermalMeterCheck(Adapter);\n\telse {\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, (\"!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\\n\"));\n\t}\n//\t#endif\n#endif\n\t\n}\n\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\nreturn;\n\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nodm_TXPowerTrackingDirectCall(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t\t*pHalData\t= GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t\n\tODM_TXPowerTrackingCallback_ThermalMeter(Adapter);\n}\n\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n#ifndef AP_BUILD_WORKAROUND\n\tstatic u1Byte\t\t\tTM_Trigger = 0;\n\n\tif(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))\n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,\n\t\t\t(\"===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\\n\"));\n\t\treturn;\n\t}\n\n\tif(!TM_Trigger)\t\t//at least delay 1 sec\n\t{\n\t\tif (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||\n\t\t\t    IS_HARDWARE_TYPE_8723B(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8703B(Adapter))\n\t\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);\n\t\telse\n\t\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);\n\t\t\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Trigger Thermal Meter!!\\n\"));\n\t\t\n\t\tTM_Trigger = 1;\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tRT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,(\"Schedule TxPowerTracking direct call!!\\n\"));\t\t\n\t\todm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.\n\t\tTM_Trigger = 0;\n\t}\n#endif\n}\n\n#endif //end #ifMP\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_powertracking_win.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__PHYDMPOWERTRACKING_H__\n#define    __PHYDMPOWERTRACKING_H__\n\n#define POWRTRACKING_VERSION\t\"1.1\"\n\n#define\tDPK_DELTA_MAPPING_NUM\t13\n#define\tindex_mapping_HP_NUM\t15\t\n#define\tTXSCALE_TABLE_SIZE \t\t37\n#define\tTXPWR_TRACK_TABLE_SIZE \t30\n#define\tDELTA_SWINGIDX_SIZE     30\n#define\tBAND_NUM \t\t\t\t3\n#define\tMAX_RF_PATH\t4\n#define\tCCK_TABLE_SIZE_88F\t21\n\n\n#define\tdm_CheckTXPowerTracking \tODM_TXPowerTrackingCheck\n\n#define IQK_Matrix_Settings_NUM\t14+24+21 // Channels_2_4G_NUM + Channels_5G_20M_NUM + Channels_5G\n#define\tAVG_THERMAL_NUM\t\t8\n#define\tHP_THERMAL_NUM\t\t8\n#define\tIQK_Matrix_REG_NUM\t8\n#define\tIQK_MAC_REG_NUM\t\t4\n#define\tIQK_ADDA_REG_NUM\t\t16\n\n#define\tIQK_BB_REG_NUM\t\t9\n\n\nextern\tu4Byte OFDMSwingTable[OFDM_TABLE_SIZE];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8];\n\nextern\tu4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE];\nextern\tu1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch14_New [CCK_TABLE_SIZE][8];\nextern\tu1Byte CCKSwingTable_Ch1_Ch14_88F[CCK_TABLE_SIZE_88F][16];\n\nextern  u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE];\n\n// <20121018, Kordan> In case fail to read TxPowerTrack.txt, we use the table of 88E as the default table.\nstatic u1Byte DeltaSwingTableIdx_2GA_P_8188E[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4,  4,  4,  4,  4,  4,  5,  5,  7,  7,  8,  8,  8,  9,  9,  9,  9,  9};\nstatic u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5,  6,  6,  7,  7,  7,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11, 11}; \n\nVOID\nODM_TXPowerTrackingCheck(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingCheckAP(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingThermalMeterInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingInit(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\nVOID\nodm_TXPowerTrackingCheckMP(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n\nVOID\nodm_TXPowerTrackingCheckCE(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN)) \n\n\nVOID\nodm_TXPowerTrackingThermalMeterCheck(\n\tIN\tPADAPTER\t\tAdapter\n\t);\n\n#endif\n\ntypedef struct _IQK_MATRIX_REGS_SETTING{\n\tBOOLEAN \tbIQKDone;\n\ts4Byte\t\tValue[3][IQK_Matrix_REG_NUM];\n\tBOOLEAN \tbBWIqkResultSaved[3];\t\n}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;\n\ntypedef struct ODM_RF_Calibration_Structure\n{\n\t//for tx power tracking\n\t\n\tu4Byte\tRegA24; // for TempCCK\n\ts4Byte\tRegE94;\n\ts4Byte \tRegE9C;\n\ts4Byte\tRegEB4;\n\ts4Byte\tRegEBC;\t\n\t//u1Byte bTXPowerTracking;\n\tu1Byte  \tTXPowercount;\n\tBOOLEAN bTXPowerTrackingInit; \n\tBOOLEAN bTXPowerTracking;\n\tu1Byte  \tTxPowerTrackControl; //for mp mode, turn off txpwrtracking as default\n\tu1Byte  \tTM_Trigger;\n    \tu1Byte  \tInternalPA5G[2];\t//pathA / pathB\n\t\n\tu1Byte  \tThermalMeter[2];    // ThermalMeter, index 0 for RFIC0, and 1 for RFIC1\n\tu1Byte  \tThermalValue;\n\tu1Byte  \tThermalValue_LCK;\n\tu1Byte  \tThermalValue_IQK;\n\tu1Byte\tThermalValue_AVG[AVG_THERMAL_NUM];\n\tu1Byte\tThermalValue_AVG_index;\t\t\n\tu1Byte\tThermalValue_RxGain;\n\t\n\tBOOLEAN\tbReloadtxpowerindex;\t\n\tu1Byte \tbRfPiEnable;\n\tu4Byte \tTXPowerTrackingCallbackCnt; //cosa add for debug\n\n\n\t//------------------------- Tx power Tracking -------------------------//\n\tu1Byte \tbCCKinCH14;\n\tu1Byte \tCCK_index;\n\tu1Byte \tOFDM_index[MAX_RF_PATH];\n\ts1Byte\tPowerIndexOffset[MAX_RF_PATH];\n\ts1Byte\tDeltaPowerIndex[MAX_RF_PATH];\n\ts1Byte\tDeltaPowerIndexLast[MAX_RF_PATH];\t\n\tBOOLEAN bTxPowerChanged;\n\t\t\n\tu1Byte \tThermalValue_HP[HP_THERMAL_NUM];\n\tu1Byte \tThermalValue_HP_index;\n\tIQK_MATRIX_REGS_SETTING IQKMatrixRegSetting[IQK_Matrix_Settings_NUM];\n\tu1Byte\tDelta_LCK;\n\ts1Byte  BBSwingDiff2G, BBSwingDiff5G; // Unit: dB\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GCCKD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GB_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GC_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_P[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GD_N[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GA_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GB_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GC_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_P[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_5GD_N[BAND_NUM][DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_P_8188E[DELTA_SWINGIDX_SIZE];\n\tu1Byte  DeltaSwingTableIdx_2GA_N_8188E[DELTA_SWINGIDX_SIZE];\n\t\n\tu1Byte\t\t\tBbSwingIdxOfdm[MAX_RF_PATH];\n\tu1Byte\t\t\tBbSwingIdxOfdmCurrent;\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\t\n\tu1Byte\t\t\tBbSwingIdxOfdmBase[MAX_RF_PATH];\n#else\n\tu1Byte\t\t\tBbSwingIdxOfdmBase;\n#endif\n\tBOOLEAN\t\t\tBbSwingFlagOfdm;\n\tu1Byte\t\t\tBbSwingIdxCck;\n\tu1Byte\t\t\tBbSwingIdxCckCurrent;\n\tu1Byte\t\t\tBbSwingIdxCckBase;\n\tu1Byte\t\t\tDefaultOfdmIndex;\n\tu1Byte\t\t\tDefaultCckIndex;\t\n\tBOOLEAN\t\t\tBbSwingFlagCck;\n\t\n\ts1Byte\t\t\tAbsolute_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_OFDMSwingIdx[MAX_RF_PATH];   \n\ts1Byte\t\t\tRemnant_CCKSwingIdx;\n\ts1Byte\t\t\tModify_TxAGC_Value;       /*Remnat compensate value at TxAGC */\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathB;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathC;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathD;\n\tBOOLEAN\t\t\tModify_TxAGC_Flag_PathA_CCK;\n\t\n\ts1Byte\t\t\tKfreeOffset[MAX_RF_PATH];\n    \n\t//--------------------------------------------------------------------//\t\n\t\n\t//for IQK\t\n\tu4Byte \tRegC04;\n\tu4Byte \tReg874;\n\tu4Byte \tRegC08;\n\tu4Byte \tRegB68;\n\tu4Byte \tRegB6C;\n\tu4Byte \tReg870;\n\tu4Byte \tReg860;\n\tu4Byte \tReg864;\n\t\n\tBOOLEAN\tbIQKInitialized;\n\tBOOLEAN bLCKInProgress;\n\tBOOLEAN\tbAntennaDetected;\n\tBOOLEAN\tbNeedIQK;\n\tBOOLEAN\tbIQKInProgress;\t\n\tu1Byte\tDelta_IQK;\n\tu4Byte\tADDA_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\tIQK_MAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\tIQK_BB_backup_recover[9];\n\tu4Byte\tIQK_BB_backup[IQK_BB_REG_NUM];\t\n\tu4Byte\tTxIQC_8723B[2][3][2]; /* { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}} */\n\tu4Byte\tRxIQC_8723B[2][2][2]; /* { {S1: 0xc14, 0xca0} ,           {S0: 0xc14, 0xca0}} */\n\tu4Byte\tTxIQC_8703B[3][2];\t/* { {S1: 0xc94, 0xc80, 0xc4c} , {S0: 0xc9c, 0xc88, 0xc4c}}*/\n\tu4Byte\tRxIQC_8703B[2][2];\t/* { {S1: 0xc14, 0xca0} ,           {S0: 0xc14, 0xca0}}*/\n\t\n\t\n\n\t// <James> IQK time measurement \n\tu8Byte\tIQK_StartTime;\n\tu8Byte\tIQK_ProgressingTime;\n\tu4Byte  LOK_Result;\n\n\t//for APK\n\tu4Byte \tAPKoutput[2][2]; //path A/B; output1_1a/output1_2a\n\tu1Byte \tbAPKdone;\n\tu1Byte \tbAPKThermalMeterIgnore;\n\t\n\t// DPK\n\tBOOLEAN bDPKFail;\t\n\tu1Byte \tbDPdone;\n\tu1Byte \tbDPPathAOK;\n\tu1Byte \tbDPPathBOK;\n\n\tu4Byte\tTxLOK[2];\n\tu4Byte  DpkTxAGC;\n\ts4Byte  DpkGain;\n\tu4Byte  DpkThermal[4];\t\n\n\ts1Byte Modify_TxAGC_Value_OFDM;\n\ts1Byte Modify_TxAGC_Value_CCK;\n}ODM_RF_CAL_T,*PODM_RF_CAL_T;\n\n\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_pre_define.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__PHYDMPREDEFINE_H__\n#define    __PHYDMPREDEFINE_H__\n\n//1 ============================================================\n//1  Definition \n//1 ============================================================\n\n//Max path of IC\n#define MAX_PATH_NUM_92CS\t\t2\n#define MAX_PATH_NUM_8188E\t\t1\n#define MAX_PATH_NUM_8192E\t\t2\n#define MAX_PATH_NUM_8723B\t\t1\n#define MAX_PATH_NUM_8812A\t\t2\n#define MAX_PATH_NUM_8821A\t\t1\n#define MAX_PATH_NUM_8814A\t\t4\n#define MAX_PATH_NUM_8822B\t\t2\n#define MAX_PATH_NUM_8821B\t\t2\n#define MAX_PATH_NUM_8703B\t\t1\n#define MAX_PATH_NUM_8188F\t\t1\n\n//Max RF path\n#define ODM_RF_PATH_MAX 2\n#define ODM_RF_PATH_MAX_JAGUAR 4\n\n//number of entry\n#if(DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\t#define\tASSOCIATE_ENTRY_NUM\t\t\t\t\tMACID_NUM_SW_LIMIT  /* Max size of AsocEntry[].*/\n\t#define\tODM_ASSOCIATE_ENTRY_NUM\t\t\t\tASSOCIATE_ENTRY_NUM\n#elif(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\t#define ASSOCIATE_ENTRY_NUM\t\t\t\t\tNUM_STAT\n\t#define\tODM_ASSOCIATE_ENTRY_NUM\t\t\t\t(ASSOCIATE_ENTRY_NUM+1)\n#else\n\t#define ODM_ASSOCIATE_ENTRY_NUM\t\t\t\t((ASSOCIATE_ENTRY_NUM*3)+1)\n#endif\n\n/* -----MGN rate--------------------------------- */\n\n#define\tODM_MGN_1M\t\t\t0x02\n#define\tODM_MGN_2M\t\t\t0x04\n#define\tODM_MGN_5_5M\t\t\t0x0b\n#define\tODM_MGN_11M\t\t\t0x16\n\n#define\tODM_MGN_6M\t\t\t0x0c\n#define\tODM_MGN_9M\t\t\t0x12\n#define\tODM_MGN_12M\t\t\t0x18\n#define\tODM_MGN_18M\t\t\t0x24\n#define\tODM_MGN_24M\t\t\t0x30\n#define\tODM_MGN_36M\t\t\t0x48\n#define\tODM_MGN_48M\t\t\t0x60\n#define\tODM_MGN_54M\t\t\t0x6c\n\n/*TxHT = 1*/\n#define\tODM_MGN_MCS0\t\t\t0x80\n#define\tODM_MGN_MCS1\t\t\t0x81\n#define\tODM_MGN_MCS2\t\t\t0x82\n#define\tODM_MGN_MCS3\t\t\t0x83\n#define\tODM_MGN_MCS4\t\t\t0x84\n#define\tODM_MGN_MCS5\t\t\t0x85\n#define\tODM_MGN_MCS6\t\t\t0x86\n#define\tODM_MGN_MCS7\t\t\t0x87\n#define\tODM_MGN_MCS8\t\t\t0x88\n#define\tODM_MGN_MCS9\t\t\t0x89\n#define\tODM_MGN_MCS10\t\t0x8a\n#define\tODM_MGN_MCS11\t\t0x8b\n#define\tODM_MGN_MCS12\t\t0x8c\n#define\tODM_MGN_MCS13\t\t0x8d\n#define\tODM_MGN_MCS14\t\t0x8e\n#define\tODM_MGN_MCS15\t\t0x8f\n#define\tODM_MGN_VHT1SS_MCS0\t0x90\n#define\tODM_MGN_VHT1SS_MCS1\t0x91\n#define\tODM_MGN_VHT1SS_MCS2\t0x92\n#define\tODM_MGN_VHT1SS_MCS3\t0x93\n#define\tODM_MGN_VHT1SS_MCS4\t0x94\n#define\tODM_MGN_VHT1SS_MCS5\t0x95\n#define\tODM_MGN_VHT1SS_MCS6\t0x96\n#define\tODM_MGN_VHT1SS_MCS7\t0x97\n#define\tODM_MGN_VHT1SS_MCS8\t0x98\n#define\tODM_MGN_VHT1SS_MCS9\t0x99\n#define\tODM_MGN_VHT2SS_MCS0\t0x9a\n#define\tODM_MGN_VHT2SS_MCS1\t0x9b\n#define\tODM_MGN_VHT2SS_MCS2\t0x9c\n#define\tODM_MGN_VHT2SS_MCS3\t0x9d\n#define\tODM_MGN_VHT2SS_MCS4\t0x9e\n#define\tODM_MGN_VHT2SS_MCS5\t0x9f\n#define\tODM_MGN_VHT2SS_MCS6\t0xa0\n#define\tODM_MGN_VHT2SS_MCS7\t0xa1\n#define\tODM_MGN_VHT2SS_MCS8\t0xa2\n#define\tODM_MGN_VHT2SS_MCS9\t0xa3\n\n#define\tODM_MGN_MCS0_SG\t\t0xc0\n#define\tODM_MGN_MCS1_SG\t\t0xc1\n#define\tODM_MGN_MCS2_SG\t\t0xc2\n#define\tODM_MGN_MCS3_SG\t\t0xc3\n#define\tODM_MGN_MCS4_SG\t\t0xc4\n#define\tODM_MGN_MCS5_SG\t\t0xc5\n#define\tODM_MGN_MCS6_SG\t\t0xc6\n#define\tODM_MGN_MCS7_SG\t\t0xc7\n#define\tODM_MGN_MCS8_SG\t\t0xc8\n#define\tODM_MGN_MCS9_SG\t\t0xc9\n#define\tODM_MGN_MCS10_SG\t\t0xca\n#define\tODM_MGN_MCS11_SG\t\t0xcb\n#define\tODM_MGN_MCS12_SG\t\t0xcc\n#define\tODM_MGN_MCS13_SG\t\t0xcd\n#define\tODM_MGN_MCS14_SG\t\t0xce\n#define\tODM_MGN_MCS15_SG\t\t0xcf\n\n/* -----DESC rate--------------------------------- */\n\n#define ODM_RATEMCS15_SG\t\t0x1c\n#define ODM_RATEMCS32\t\t\t0x20\n\n\n// CCK Rates, TxHT = 0\n#define ODM_RATE1M\t\t\t\t0x00\n#define ODM_RATE2M\t\t\t\t0x01\n#define ODM_RATE5_5M\t\t\t0x02\n#define ODM_RATE11M\t\t\t\t0x03\n// OFDM Rates, TxHT = 0\n#define ODM_RATE6M\t\t\t\t0x04\n#define ODM_RATE9M\t\t\t\t0x05\n#define ODM_RATE12M\t\t\t\t0x06\n#define ODM_RATE18M\t\t\t\t0x07\n#define ODM_RATE24M\t\t\t\t0x08\n#define ODM_RATE36M\t\t\t\t0x09\n#define ODM_RATE48M\t\t\t\t0x0A\n#define ODM_RATE54M\t\t\t\t0x0B\n// MCS Rates, TxHT = 1\n#define ODM_RATEMCS0\t\t\t0x0C\n#define ODM_RATEMCS1\t\t\t0x0D\n#define ODM_RATEMCS2\t\t\t0x0E\n#define ODM_RATEMCS3\t\t\t0x0F\n#define ODM_RATEMCS4\t\t\t0x10\n#define ODM_RATEMCS5\t\t\t0x11\n#define ODM_RATEMCS6\t\t\t0x12\n#define ODM_RATEMCS7\t\t\t0x13\n#define ODM_RATEMCS8\t\t\t0x14\n#define ODM_RATEMCS9\t\t\t0x15\n#define ODM_RATEMCS10\t\t\t0x16\n#define ODM_RATEMCS11\t\t\t0x17\n#define ODM_RATEMCS12\t\t\t0x18\n#define ODM_RATEMCS13\t\t\t0x19\n#define ODM_RATEMCS14\t\t\t0x1A\n#define ODM_RATEMCS15\t\t\t0x1B\n#define ODM_RATEMCS16\t\t\t0x1C\n#define ODM_RATEMCS17\t\t\t0x1D\n#define ODM_RATEMCS18\t\t\t0x1E\n#define ODM_RATEMCS19\t\t\t0x1F\n#define ODM_RATEMCS20\t\t\t0x20\n#define ODM_RATEMCS21\t\t\t0x21\n#define ODM_RATEMCS22\t\t\t0x22\n#define ODM_RATEMCS23\t\t\t0x23\n#define ODM_RATEMCS24\t\t\t0x24\n#define ODM_RATEMCS25\t\t\t0x25\n#define ODM_RATEMCS26\t\t\t0x26\n#define ODM_RATEMCS27\t\t\t0x27\n#define ODM_RATEMCS28\t\t\t0x28\n#define ODM_RATEMCS29\t\t\t0x29\n#define ODM_RATEMCS30\t\t\t0x2A\n#define ODM_RATEMCS31\t\t\t0x2B\n#define ODM_RATEVHTSS1MCS0\t\t0x2C\n#define ODM_RATEVHTSS1MCS1\t\t0x2D\n#define ODM_RATEVHTSS1MCS2\t\t0x2E\n#define ODM_RATEVHTSS1MCS3\t\t0x2F\n#define ODM_RATEVHTSS1MCS4\t\t0x30\n#define ODM_RATEVHTSS1MCS5\t\t0x31\n#define ODM_RATEVHTSS1MCS6\t\t0x32\n#define ODM_RATEVHTSS1MCS7\t\t0x33\n#define ODM_RATEVHTSS1MCS8\t\t0x34\n#define ODM_RATEVHTSS1MCS9\t\t0x35\n#define ODM_RATEVHTSS2MCS0\t\t0x36\n#define ODM_RATEVHTSS2MCS1\t\t0x37\n#define ODM_RATEVHTSS2MCS2\t\t0x38\n#define ODM_RATEVHTSS2MCS3\t\t0x39\n#define ODM_RATEVHTSS2MCS4\t\t0x3A\n#define ODM_RATEVHTSS2MCS5\t\t0x3B\n#define ODM_RATEVHTSS2MCS6\t\t0x3C\n#define ODM_RATEVHTSS2MCS7\t\t0x3D\n#define ODM_RATEVHTSS2MCS8\t\t0x3E\n#define ODM_RATEVHTSS2MCS9\t\t0x3F\n#define ODM_RATEVHTSS3MCS0\t\t0x40\n#define ODM_RATEVHTSS3MCS1\t\t0x41\n#define ODM_RATEVHTSS3MCS2\t\t0x42\n#define ODM_RATEVHTSS3MCS3\t\t0x43\n#define ODM_RATEVHTSS3MCS4\t\t0x44\n#define ODM_RATEVHTSS3MCS5\t\t0x45\n#define ODM_RATEVHTSS3MCS6\t\t0x46\n#define ODM_RATEVHTSS3MCS7\t\t0x47\n#define ODM_RATEVHTSS3MCS8\t\t0x48\n#define ODM_RATEVHTSS3MCS9\t\t0x49\n#define ODM_RATEVHTSS4MCS0\t\t0x4A\n#define ODM_RATEVHTSS4MCS1\t\t0x4B\n#define ODM_RATEVHTSS4MCS2\t\t0x4C\n#define ODM_RATEVHTSS4MCS3\t\t0x4D\n#define ODM_RATEVHTSS4MCS4\t\t0x4E\n#define ODM_RATEVHTSS4MCS5\t\t0x4F\n#define ODM_RATEVHTSS4MCS6\t\t0x50\n#define ODM_RATEVHTSS4MCS7\t\t0x51\n#define ODM_RATEVHTSS4MCS8\t\t0x52\n#define ODM_RATEVHTSS4MCS9\t\t0x53\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#define ODM_NUM_RATE_IDX (ODM_RATEVHTSS4MCS9+1)\n#else\n\t#if (RTL8192E_SUPPORT == 1)\n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEMCS15+1)\n\t#elif (RTL8723B_SUPPORT == 1) || (RTL8188E_SUPPORT == 1) || (RTL8188F_SUPPORT == 1) \n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEMCS7+1)\n\t#elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) \n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEVHTSS1MCS9+1)\n\t#elif (RTL8812A_SUPPORT == 1)\n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEVHTSS2MCS9+1)\n\t#elif(RTL8814A_SUPPORT == 1)\n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEVHTSS3MCS9+1)\n\t#else\n\t\t#define ODM_NUM_RATE_IDX (ODM_RATEVHTSS4MCS9+1)\n\t#endif\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#define CONFIG_SFW_SUPPORTED\n#endif\n\n//1 ============================================================\n//1  enumeration\n//1 ============================================================\n\n\n//\tODM_CMNINFO_INTERFACE\ntypedef enum tag_ODM_Support_Interface_Definition\n{\n\tODM_ITRF_PCIE \t=\t0x1,\n\tODM_ITRF_USB \t=\t0x2,\n\tODM_ITRF_SDIO \t=\t0x4,\n\tODM_ITRF_ALL \t=\t0x7,\n}ODM_INTERFACE_E;\n\n// ODM_CMNINFO_IC_TYPE\ntypedef enum tag_ODM_Support_IC_Type_Definition\n{\n\tODM_RTL8192S \t=\tBIT0,\n\tODM_RTL8192C \t=\tBIT1,\n\tODM_RTL8192D \t=\tBIT2,\n\tODM_RTL8723A \t=\tBIT3,\n\tODM_RTL8188E \t=\tBIT4,\n\tODM_RTL8812 \t=\tBIT5,\n\tODM_RTL8821 \t=\tBIT6,\n\tODM_RTL8192E \t=\tBIT7,\t\n\tODM_RTL8723B\t=\tBIT8,\n\tODM_RTL8814A\t=\tBIT9,\t\n\tODM_RTL8881A \t=\tBIT10,\n\tODM_RTL8821B \t=\tBIT11,\n\tODM_RTL8822B \t=\tBIT12,\n\tODM_RTL8703B \t=\tBIT13,\n\tODM_RTL8195A\t=\tBIT14,\n\tODM_RTL8188F \t=\tBIT15\n}ODM_IC_TYPE_E;\n\n\n\n\n#define ODM_IC_11N_SERIES\t\t(ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B|ODM_RTL8188F)\n#define ODM_IC_11AC_SERIES\t\t(ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8821B|ODM_RTL8822B)\n#define ODM_IC_11AC_1_SERIES\t\t(ODM_RTL8812|ODM_RTL8821|ODM_RTL8881A|ODM_RTL8821B)\n#define ODM_IC_11AC_2_SERIES\t\t(ODM_RTL8814A|ODM_RTL8822B)\n#define ODM_IC_TXBF_SUPPORT\t\t(ODM_RTL8192E|ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A|ODM_RTL8822B)\n#define ODM_IC_11N_GAIN_IDX_EDCCA\t\t(ODM_RTL8195A|ODM_RTL8703B|ODM_RTL8188F)\n#define ODM_IC_11AC_GAIN_IDX_EDCCA\t\t(ODM_RTL8814A|ODM_RTL8822B)\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\n#ifdef RTK_AC_SUPPORT\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t1\n#else\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t0\n#endif\n\n#define ODM_IC_11N_SERIES_SUPPORT\t\t\t1\n#define ODM_CONFIG_BT_COEXIST\t\t\t\t0\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t1\n#define ODM_IC_11N_SERIES_SUPPORT\t\t\t1\n#define ODM_CONFIG_BT_COEXIST\t\t\t\t1\n\n#else \n\n#if((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1) || (RTL8723A_SUPPORT == 1) || (RTL8188E_SUPPORT == 1) ||\\\n(RTL8723B_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8195A_SUPPORT == 1) || (RTL8703B_SUPPORT == 1) || \\\n(RTL8188F_SUPPORT == 1))\n#define ODM_IC_11N_SERIES_SUPPORT\t\t\t1\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t0\n#else\n#define ODM_IC_11N_SERIES_SUPPORT\t\t\t0\n#define ODM_IC_11AC_SERIES_SUPPORT\t\t1\n#endif\n\n#ifdef CONFIG_BT_COEXIST\n#define ODM_CONFIG_BT_COEXIST\t\t\t\t1\n#else\n#define ODM_CONFIG_BT_COEXIST\t\t\t\t0\n#endif\n\n#endif\n\n\n//ODM_CMNINFO_CUT_VER\ntypedef enum tag_ODM_Cut_Version_Definition\n{\n\tODM_CUT_A \t\t=\t0,\n\tODM_CUT_B \t\t=\t1,\n\tODM_CUT_C \t\t=\t2,\n\tODM_CUT_D \t\t=\t3,\n\tODM_CUT_E \t\t=\t4,\n\tODM_CUT_F \t\t=\t5,\n\n\tODM_CUT_I \t\t=\t8,\n\tODM_CUT_J \t\t=\t9,\n\tODM_CUT_K \t\t=\t10,\t\n\tODM_CUT_TEST \t=\t15,\n}ODM_CUT_VERSION_E;\n\n// ODM_CMNINFO_FAB_VER\ntypedef enum tag_ODM_Fab_Version_Definition\n{\n\tODM_TSMC \t=\t0,\n\tODM_UMC \t=\t1,\n}ODM_FAB_E;\n\n// ODM_CMNINFO_RF_TYPE\n//\n// For example 1T2R (A+AB = BIT0|BIT4|BIT5)\n//\ntypedef enum tag_ODM_RF_Path_Bit_Definition\n{\n\tODM_RF_A = BIT0,\n\tODM_RF_B = BIT1,\n\tODM_RF_C = BIT2,\n\tODM_RF_D = BIT3,\n}ODM_RF_PATH_E;\n\ntypedef enum tag_PHYDM_RF_TX_NUM {\n\tODM_1T\t=\t1,\n\tODM_2T\t=\t2,\n\tODM_3T\t=\t3,\n\tODM_4T\t=\t4,\n} ODM_RF_TX_NUM_E;\n\ntypedef enum tag_ODM_RF_Type_Definition {\n\tODM_1T1R,\n\tODM_1T2R,\n\tODM_2T2R,\n\tODM_2T2R_GREEN,\n\tODM_2T3R,\n\tODM_2T4R,\n\tODM_3T3R,\n\tODM_3T4R,\n\tODM_4T4R,\n\tODM_XTXR\n}ODM_RF_TYPE_E;\n\n\ntypedef enum tag_ODM_MAC_PHY_Mode_Definition\n{\n\tODM_SMSP\t= 0,\n\tODM_DMSP\t= 1,\n\tODM_DMDP\t= 2,\n}ODM_MAC_PHY_MODE_E;\n\n\ntypedef enum tag_BT_Coexist_Definition\n{\t\n\tODM_BT_BUSY \t\t= 1,\n\tODM_BT_ON \t\t\t= 2,\n\tODM_BT_OFF \t\t= 3,\n\tODM_BT_NONE \t\t= 4,\n}ODM_BT_COEXIST_E;\n\n// ODM_CMNINFO_OP_MODE\ntypedef enum tag_Operation_Mode_Definition\n{\n\tODM_NO_LINK \t\t= BIT0,\n\tODM_LINK \t\t\t= BIT1,\n\tODM_SCAN \t\t\t= BIT2,\n\tODM_POWERSAVE \t= BIT3,\n\tODM_AP_MODE \t\t= BIT4,\n\tODM_CLIENT_MODE\t= BIT5,\n\tODM_AD_HOC \t\t= BIT6,\n\tODM_WIFI_DIRECT\t= BIT7,\n\tODM_WIFI_DISPLAY\t= BIT8,\n}ODM_OPERATION_MODE_E;\n\n// ODM_CMNINFO_WM_MODE\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\ntypedef enum tag_Wireless_Mode_Definition\n{\n\tODM_WM_UNKNOW\t= 0x0,\n\tODM_WM_B\t\t\t= BIT0,\n\tODM_WM_G\t\t\t= BIT1,\n\tODM_WM_A\t\t\t= BIT2,\n\tODM_WM_N24G\t\t= BIT3,\n\tODM_WM_N5G\t\t= BIT4,\n\tODM_WM_AUTO\t\t= BIT5,\n\tODM_WM_AC\t\t= BIT6,\n}ODM_WIRELESS_MODE_E;\n#else\ntypedef enum tag_Wireless_Mode_Definition\n{\n\tODM_WM_UNKNOWN\t= 0x00,/*0x0*/\n\tODM_WM_A\t\t\t= BIT0, /* 0x1*/\n\tODM_WM_B\t\t\t= BIT1, /* 0x2*/\n\tODM_WM_G\t\t\t= BIT2,/* 0x4*/\n\tODM_WM_AUTO\t\t= BIT3,/* 0x8*/\n\tODM_WM_N24G\t\t= BIT4,/* 0x10*/\n\tODM_WM_N5G\t\t= BIT5,/* 0x20*/\n\tODM_WM_AC_5G\t\t= BIT6,/* 0x40*/\n\tODM_WM_AC_24G\t= BIT7,/* 0x80*/\n\tODM_WM_AC_ONLY\t= BIT8,/* 0x100*/\n\tODM_WM_MAX\t\t= BIT11/* 0x800*/\n\n}ODM_WIRELESS_MODE_E;\n#endif\n\n// ODM_CMNINFO_BAND\ntypedef enum tag_Band_Type_Definition\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\tODM_BAND_2_4G \t= BIT0,\n\tODM_BAND_5G \t\t= BIT1,\n#else\n\tODM_BAND_2_4G = 0,\n\tODM_BAND_5G,\n\tODM_BAND_ON_BOTH,\n\tODM_BANDMAX\n#endif\n}ODM_BAND_TYPE_E;\n\n\n\n// ODM_CMNINFO_SEC_CHNL_OFFSET\ntypedef enum tag_Secondary_Channel_Offset_Definition {\n\n\tPHYDM_DONT_CARE\t= 0,\n\tPHYDM_BELOW\t\t= 1,\n\tPHYDM_ABOVE\t\t= 2\n} PHYDM_SEC_CHNL_OFFSET_E;\n\n// ODM_CMNINFO_SEC_MODE\ntypedef enum tag_Security_Definition\n{\n\tODM_SEC_OPEN \t\t\t= 0,\n\tODM_SEC_WEP40 \t\t= 1,\n\tODM_SEC_TKIP \t\t\t= 2,\n\tODM_SEC_RESERVE \t\t= 3,\n\tODM_SEC_AESCCMP \t\t= 4,\n\tODM_SEC_WEP104 \t\t= 5,\n\tODM_WEP_WPA_MIXED    = 6, // WEP + WPA\n\tODM_SEC_SMS4 \t\t\t= 7,\n}ODM_SECURITY_E;\n\n// ODM_CMNINFO_BW\ntypedef enum tag_Bandwidth_Definition\n{\t\n\tODM_BW20M \t\t= 0,\n\tODM_BW40M \t\t= 1,\n\tODM_BW80M \t\t= 2,\n\tODM_BW160M \t\t= 3,\n\tODM_BW5M\t\t\t= 4,\n\tODM_BW10M\t\t\t= 5,\n\tODM_BW_MAX\t\t= 6\n}ODM_BW_E;\n\n// ODM_CMNINFO_CHNL\n\n// ODM_CMNINFO_BOARD_TYPE\ntypedef enum tag_Board_Definition\n{\n    ODM_BOARD_DEFAULT  \t= 0, \t  // The DEFAULT case.\n    ODM_BOARD_MINICARD  = BIT(0), // 0 = non-mini card, 1= mini card.\n    ODM_BOARD_SLIM      = BIT(1), // 0 = non-slim card, 1 = slim card\n    ODM_BOARD_BT        = BIT(2), // 0 = without BT card, 1 = with BT\n    ODM_BOARD_EXT_PA    = BIT(3), // 0 = no 2G ext-PA, 1 = existing 2G ext-PA\n    ODM_BOARD_EXT_LNA   = BIT(4), // 0 = no 2G ext-LNA, 1 = existing 2G ext-LNA\n    ODM_BOARD_EXT_TRSW  = BIT(5), // 0 = no ext-TRSW, 1 = existing ext-TRSW\n    ODM_BOARD_EXT_PA_5G\t= BIT(6), // 0 = no 5G ext-PA, 1 = existing 5G ext-PA\n    ODM_BOARD_EXT_LNA_5G= BIT(7), // 0 = no 5G ext-LNA, 1 = existing 5G ext-LNA\n}ODM_BOARD_TYPE_E;\n\ntypedef enum tag_ODM_Package_Definition\n{\n    ODM_PACKAGE_DEFAULT  \t = 0, \t  \n    ODM_PACKAGE_QFN68        = BIT(0), \n    ODM_PACKAGE_TFBGA90      = BIT(1), \n    ODM_PACKAGE_TFBGA79      = BIT(2),\t\n}ODM_Package_TYPE_E;\n\ntypedef enum tag_ODM_TYPE_GPA_Definition {\n\tTYPE_GPA0 = 0x0000,\n\tTYPE_GPA1 = 0x0055,\n\tTYPE_GPA2 = 0x00AA,\n\tTYPE_GPA3 = 0x00FF,\n\tTYPE_GPA4 = 0x5500,\n\tTYPE_GPA5 = 0x5555,\n\tTYPE_GPA6 = 0x55AA,\n\tTYPE_GPA7 = 0x55FF,\n\tTYPE_GPA8 = 0xAA00,\n\tTYPE_GPA9 = 0xAA55,\n\tTYPE_GPA10 = 0xAAAA,\n\tTYPE_GPA11 = 0xAAFF,\n\tTYPE_GPA12 = 0xFF00,\n\tTYPE_GPA13 = 0xFF55,\n\tTYPE_GPA14 = 0xFFAA,\n\tTYPE_GPA15 = 0xFFFF,\n}ODM_TYPE_GPA_E;\n\ntypedef enum tag_ODM_TYPE_APA_Definition {\n\tTYPE_APA0 = 0x0000,\n\tTYPE_APA1 = 0x0055,\n\tTYPE_APA2 = 0x00AA,\n\tTYPE_APA3 = 0x00FF,\n\tTYPE_APA4 = 0x5500,\n\tTYPE_APA5 = 0x5555,\n\tTYPE_APA6 = 0x55AA,\n\tTYPE_APA7 = 0x55FF,\n\tTYPE_APA8 = 0xAA00,\n\tTYPE_APA9 = 0xAA55,\n\tTYPE_APA10 = 0xAAAA,\n\tTYPE_APA11 = 0xAAFF,\n\tTYPE_APA12 = 0xFF00,\n\tTYPE_APA13 = 0xFF55,\n\tTYPE_APA14 = 0xFFAA,\n\tTYPE_APA15 = 0xFFFF,\n}ODM_TYPE_APA_E;\n\ntypedef enum tag_ODM_TYPE_GLNA_Definition {\n\tTYPE_GLNA0 = 0x0000,\n\tTYPE_GLNA1 = 0x0055,\n\tTYPE_GLNA2 = 0x00AA,\n\tTYPE_GLNA3 = 0x00FF,\n\tTYPE_GLNA4 = 0x5500,\n\tTYPE_GLNA5 = 0x5555,\n\tTYPE_GLNA6 = 0x55AA,\n\tTYPE_GLNA7 = 0x55FF,\n\tTYPE_GLNA8 = 0xAA00,\n\tTYPE_GLNA9 = 0xAA55,\n\tTYPE_GLNA10 = 0xAAAA,\n\tTYPE_GLNA11 = 0xAAFF,\n\tTYPE_GLNA12 = 0xFF00,\n\tTYPE_GLNA13 = 0xFF55,\n\tTYPE_GLNA14 = 0xFFAA,\n\tTYPE_GLNA15 = 0xFFFF,\n}ODM_TYPE_GLNA_E;\n\ntypedef enum tag_ODM_TYPE_ALNA_Definition {\n\tTYPE_ALNA0 = 0x0000,\n\tTYPE_ALNA1 = 0x0055,\n\tTYPE_ALNA2 = 0x00AA,\n\tTYPE_ALNA3 = 0x00FF,\n\tTYPE_ALNA4 = 0x5500,\n\tTYPE_ALNA5 = 0x5555,\n\tTYPE_ALNA6 = 0x55AA,\n\tTYPE_ALNA7 = 0x55FF,\n\tTYPE_ALNA8 = 0xAA00,\n\tTYPE_ALNA9 = 0xAA55,\n\tTYPE_ALNA10 = 0xAAAA,\n\tTYPE_ALNA11 = 0xAAFF,\n\tTYPE_ALNA12 = 0xFF00,\n\tTYPE_ALNA13 = 0xFF55,\n\tTYPE_ALNA14 = 0xFFAA,\n\tTYPE_ALNA15 = 0xFFFF,\n}ODM_TYPE_ALNA_E;\n\n\ntypedef enum _ODM_RF_RADIO_PATH {\n    ODM_RF_PATH_A = 0,   //Radio Path A\n    ODM_RF_PATH_B = 1,   //Radio Path B\n    ODM_RF_PATH_C = 2,   //Radio Path C\n    ODM_RF_PATH_D = 3,   //Radio Path D\n    ODM_RF_PATH_AB,\n    ODM_RF_PATH_AC,\n    ODM_RF_PATH_AD,\n    ODM_RF_PATH_BC,\n    ODM_RF_PATH_BD,\n    ODM_RF_PATH_CD,\n    ODM_RF_PATH_ABC,\n    ODM_RF_PATH_ACD,\n    ODM_RF_PATH_BCD,\n    ODM_RF_PATH_ABCD,\n  //  ODM_RF_PATH_MAX,    //Max RF number 90 support\n} ODM_RF_RADIO_PATH_E, *PODM_RF_RADIO_PATH_E;\n\ntypedef enum _ODM_PARAMETER_INIT {\n\tODM_PRE_SETTING = 0,\n\tODM_POST_SETTING = 1,\n} ODM_PARAMETER_INIT_E;\n\n#endif\n"
  },
  {
    "path": "hal/phydm/phydm_precomp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef\t__ODM_PRECOMP_H__\n#define __ODM_PRECOMP_H__\n\n#include \"phydm_types.h\"\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#include \"Precomp.h\"\t\t// We need to include mp_precomp.h due to batch file setting.\n#else\n#define\t\tTEST_FALG___\t\t1\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE ==ODM_CE) \n#define \tRTL8192CE_SUPPORT \t\t\t\t0\n#define \tRTL8192CU_SUPPORT \t\t\t\t0\n#define \tRTL8192C_SUPPORT \t\t\t\t0\t\n\n#define \tRTL8192DE_SUPPORT \t\t\t\t0\n#define \tRTL8192DU_SUPPORT \t\t\t\t0\n#define \tRTL8192D_SUPPORT \t\t\t\t0\t\n\n#define \tRTL8723AU_SUPPORT\t\t\t\t0\n#define \tRTL8723AS_SUPPORT\t\t\t\t0\n#define \tRTL8723AE_SUPPORT\t\t\t\t0\n#define \tRTL8723A_SUPPORT\t\t\t\t0\n#define \tRTL8723_FPGA_VERIFICATION\t\t0\n#endif\n\n//2 Config Flags and Structs - defined by each ODM Type\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t#include \"../8192cd_cfg.h\"\n\t#include \"../odm_inc.h\"\n\n\t#include \"../8192cd.h\"\n\t#include \"../8192cd_util.h\"\n\t#ifdef _BIG_ENDIAN_\n\t#define\tODM_ENDIAN_TYPE\t\t\t\tODM_ENDIAN_BIG\n\t#else\n\t#define\tODM_ENDIAN_TYPE\t\t\t\tODM_ENDIAN_LITTLE\n\t#endif\n\n\t#ifdef AP_BUILD_WORKAROUND\n\t#include \"../8192cd_headers.h\"\n\t#include \"../8192cd_debug.h\"\t\t\n\t#endif\n\n#elif (DM_ODM_SUPPORT_TYPE ==ODM_CE)\n\t#define __PACK\n\t#define __WLAN_ATTRIB_PACK__\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#include \"mp_precomp.h\"\n\t#define\tODM_ENDIAN_TYPE\t\t\t\tODM_ENDIAN_LITTLE\n\t#define __PACK\n\t#define __WLAN_ATTRIB_PACK__\n#endif\n\n//2 OutSrc Header Files\n \n#include \"phydm.h\" \n#include \"phydm_hwconfig.h\"\n#include \"phydm_debug.h\"\n#include \"phydm_regdefine11ac.h\"\n#include \"phydm_regdefine11n.h\"\n#include \"phydm_interface.h\"\n#include \"phydm_reg.h\"\n\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_CE)\n#define RTL8821B_SUPPORT\t\t0\n#define RTL8822B_SUPPORT\t\t0\n\nVOID\nPHY_SetTxPowerLimit(\n\tIN\tPDM_ODM_T\tpDM_Odm,\n\tIN\tu8\t*Regulation,\n\tIN\tu8\t*Band,\n\tIN\tu8\t*Bandwidth,\n\tIN\tu8\t*RateSection,\n\tIN\tu8\t*RfPath,\n\tIN\tu8\t*Channel,\n\tIN\tu8\t*PowerLimit\n);\n\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n#define RTL8821B_SUPPORT\t\t0\n#define RTL8822B_SUPPORT\t\t0\n#define RTL8703B_SUPPORT\t\t0\n#define RTL8188F_SUPPORT\t\t0\n#endif\n\n#if RTL8188E_SUPPORT == 1\n#define RTL8188E_T_SUPPORT 1\n#ifdef CONFIG_SFW_SUPPORTED\n#define RTL8188E_S_SUPPORT 1\n#else\n#define RTL8188E_S_SUPPORT 0\n#endif\n#endif\n\n#if (RTL8188E_SUPPORT==1) \n#include \"rtl8188e/hal8188erateadaptive.h\"//for  RA,Power training\n#include \"rtl8188e/halhwimg8188e_mac.h\"\n#include \"rtl8188e/halhwimg8188e_rf.h\"\n#include \"rtl8188e/halhwimg8188e_bb.h\"\n#include \"rtl8188e/halhwimg8188e_t_fw.h\"\n#include \"rtl8188e/halhwimg8188e_s_fw.h\"\n#include \"rtl8188e/phydm_regconfig8188e.h\"\n#include \"rtl8188e/phydm_rtl8188e.h\"\n#include \"rtl8188e/hal8188ereg.h\"\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include \"rtl8188e_hal.h\" \n\t#include \"rtl8188e/halphyrf_8188e_ce.h\"\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#include \"rtl8188e/halphyrf_8188e_win.h\"\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t#include \"rtl8188e/halphyrf_8188e_ap.h\"\n#endif\n#endif  //88E END\n\n#if (RTL8192E_SUPPORT==1) \n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\t#include \"rtl8192e/halphyrf_8192e_win.h\" /*FOR_8192E_IQK*/\n\t#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t#include \"rtl8192e/halphyrf_8192e_ap.h\" /*FOR_8192E_IQK*/\n\t#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t#include \"rtl8192e/halphyrf_8192e_ce.h\" /*FOR_8192E_IQK*/\n\t#endif\n\t\n#include \"rtl8192e/phydm_rtl8192e.h\" //FOR_8192E_IQK\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\t#include \"rtl8192e/halhwimg8192e_bb.h\"\n\t#include \"rtl8192e/halhwimg8192e_mac.h\"\n\t#include \"rtl8192e/halhwimg8192e_rf.h\"\n\t#include \"rtl8192e/phydm_regconfig8192e.h\"\n\t#include \"rtl8192e/halhwimg8192e_fw.h\"\n\t#include \"rtl8192e/hal8192ereg.h\"\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include \"rtl8192e_hal.h\"\n#endif\n#endif  //92E END\n\n#if (RTL8812A_SUPPORT==1)\n\n    #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n        #include \"rtl8812a/halphyrf_8812a_win.h\"\n    #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n        #include \"rtl8812a/halphyrf_8812a_ap.h\"\n    #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n        #include \"rtl8812a/halphyrf_8812a_ce.h\"\n    #endif\n\n    //#include \"rtl8812a/HalPhyRf_8812A.h\" //FOR_8812_IQK\n    #if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n        #include \"rtl8812a/halhwimg8812a_bb.h\"\n        #include \"rtl8812a/halhwimg8812a_mac.h\"\n        #include \"rtl8812a/halhwimg8812a_rf.h\"\n        #include \"rtl8812a/phydm_regconfig8812a.h\"\n        #include \"rtl8812a/halhwimg8812a_fw.h\"\n        #include \"rtl8812a/phydm_rtl8812a.h\"\n    #endif\n\n    #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t    #include \"rtl8812a_hal.h\"\n    #endif\n\n#endif //8812 END\n\n#if (RTL8814A_SUPPORT==1)\n\n#include \"rtl8814a/halhwimg8814a_mac.h\"\n#include \"rtl8814a/halhwimg8814a_rf.h\"\n#include \"rtl8814a/halhwimg8814a_bb.h\"\n#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\n\t#include \"rtl8814a/halhwimg8814a_fw.h\"\n\t#include \"rtl8814a/phydm_rtl8814a.h\"\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#include \"rtl8814a/halphyrf_8814a_win.h\"\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include \"rtl8814a/halphyrf_8814a_ce.h\"\n#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t#include \"rtl8814a/halphyrf_8814a_ap.h\"\n#endif\n\t#include \"rtl8814a/phydm_regconfig8814a.h\"\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include \"rtl8814a_hal.h\"\n\t#include \"rtl8814a/phydm_iqk_8814a.h\"\n#endif\n#endif //8814 END\n\n#if (RTL8881A_SUPPORT==1)//FOR_8881_IQK\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#include \"rtl8821a/phydm_iqk_8821a_win.h\"\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#include \"rtl8821a/phydm_iqk_8821a_ce.h\"\n#else\n#include \"rtl8821a/phydm_iqk_8821a_ap.h\"\n#endif\n//#include \"rtl8881a/HalHWImg8881A_BB.h\"\n//#include \"rtl8881a/HalHWImg8881A_MAC.h\"\n//#include \"rtl8881a/HalHWImg8881A_RF.h\"\n//#include \"rtl8881a/odm_RegConfig8881A.h\"\n#endif\n\n#if (RTL8723B_SUPPORT==1) \n#include \"rtl8723b/halhwimg8723b_mac.h\"\n#include \"rtl8723b/halhwimg8723b_rf.h\"\n#include \"rtl8723b/halhwimg8723b_bb.h\"\n#include \"rtl8723b/halhwimg8723b_fw.h\"\n#include \"rtl8723b/phydm_regconfig8723b.h\"\n#include \"rtl8723b/phydm_rtl8723b.h\"\n#include \"rtl8723b/hal8723breg.h\"\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n    #include \"rtl8723b/halphyrf_8723b_win.h\"\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n    #include \"rtl8723b/halphyrf_8723b_ce.h\"\n    #include \"rtl8723b/halhwimg8723b_mp.h\"\n    #include \"rtl8723b_hal.h\"\n#endif\n#endif\n\n#if (RTL8821A_SUPPORT==1) \n#include \"rtl8821a/halhwimg8821a_mac.h\"\n#include \"rtl8821a/halhwimg8821a_rf.h\"\n#include \"rtl8821a/halhwimg8821a_bb.h\"\n#include \"rtl8821a/halhwimg8821a_fw.h\"\n#include \"rtl8821a/phydm_regconfig8821a.h\"\n#include \"rtl8821a/phydm_rtl8821a.h\"\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#include \"rtl8821a/halphyrf_8821a_win.h\"\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include \"rtl8821a/halphyrf_8821a_ce.h\"\n\t#include \"rtl8821a/phydm_iqk_8821a_ce.h\"/*for IQK*/\n\t#include \"rtl8812a/halphyrf_8812a_ce.h\"/*for IQK,LCK,Power-tracking*/\n\t#include \"rtl8812a_hal.h\"\n#else\n#endif\n#endif\n\n#if (RTL8821B_SUPPORT==1) \n#include \"rtl8821b/halhwimg8821b_mac.h\"\n#include \"rtl8821b/halhwimg8821b_rf.h\"\n#include \"rtl8821b/halhwimg8821b_bb.h\"\n#include \"rtl8821b/halhwimg8821b_fw.h\"\n#include \"rtl8821b/phydm_regconfig8821b.h\"\n#include \"rtl8821b/halhwimg8821b_testchip_mac.h\"\n#include \"rtl8821b/halhwimg8821b_testchip_rf.h\"\n#include \"rtl8821b/halhwimg8821b_testchip_bb.h\"\n#include \"rtl8821b/halhwimg8821b_testchip_fw.h\"\n#include \"rtl8821b/halphyrf_8821b.h\"\n#endif\n\n#if (RTL8822B_SUPPORT==1) \n#include \"rtl8822b/halhwimg8822b_mac.h\"\n#include \"rtl8822b/halhwimg8822b_rf.h\"\n#include \"rtl8822b/halhwimg8822b_bb.h\"\n/*#include \"rtl8822b/halhwimg8822b_fw.h\"*/\n#include \"rtl8822b/phydm_regconfig8822b.h\"\n#include \"rtl8822b/halphyrf_8822b.h\"\n#include \"rtl8822b/phydm_rtl8822b.h\"\n#include \"rtl8822b/phydm_hal_api8822b.h\"\n#include \"rtl8822b/version_rtl8822b.h\"\n#endif\n\n#if (RTL8703B_SUPPORT==1) \n#include \"rtl8703b/phydm_regconfig8703b.h\"\n#include \"rtl8703b/halhwimg8703b_mac.h\"\n#include \"rtl8703b/halhwimg8703b_rf.h\"\n#include \"rtl8703b/halhwimg8703b_bb.h\"\n#include \"rtl8703b/halhwimg8703b_fw.h\"\n#include \"rtl8703b/halphyrf_8703b.h\"\n#include \"rtl8703b/version_rtl8703b.h\"\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#include \"rtl8703b_hal.h\"\n#endif\n#endif\n\n#if (RTL8188F_SUPPORT == 1) \n#include \"rtl8188f/halhwimg8188f_mac.h\"\n#include \"rtl8188f/halhwimg8188f_rf.h\"\n#include \"rtl8188f/halhwimg8188f_bb.h\"\n#include \"rtl8188f/halhwimg8188f_fw.h\"\n#include \"rtl8188f/hal8188freg.h\"\n#include \"rtl8188f/phydm_rtl8188f.h\"\n#include \"rtl8188f/phydm_regconfig8188f.h\"\n#include \"rtl8188f/halphyrf_8188f.h\" /* for IQK,LCK,Power-tracking */\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#include \"rtl8188f_hal.h\"\n#endif\n#endif\n\n#endif\t// __ODM_PRECOMP_H__\n\n"
  },
  {
    "path": "hal/phydm/phydm_rainfo.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if (defined(CONFIG_RA_DBG_CMD))\nVOID\nODM_C2HRaParaReportHandler(\n\tIN\tPVOID\tpDM_VOID,\n\tIN pu1Byte   CmdBuf,\n\tIN u1Byte   CmdLen\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t    pRA_Table = &pDM_Odm->DM_RA_Table;\n\n\tu1Byte  para_idx = CmdBuf[0]; //Retry Penalty, NH, NL\n\tu1Byte  RateTypeStart = CmdBuf[1];\n\tu1Byte  RateTypeLength = CmdLen - 2;\n\tu1Byte  i;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[ From FW C2H RA Para ]  CmdBuf[0]= (( %d ))\\n\", CmdBuf[0]));\n\n\tif (para_idx == RADBG_RTY_PENALTY) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate Index|   |RTY Penality Index| \\n\"));\n\n\t\tfor (i = 0 ; i < (RateTypeLength) ; i++) {\n\t\t\tif (pRA_Table->is_ra_dbg_init)\n\t\t\t\tpRA_Table->RTY_P_default[RateTypeStart + i] = CmdBuf[2 + i];\n\n\t\t\tpRA_Table->RTY_P[RateTypeStart + i] = CmdBuf[2 + i];\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"%8d  %15d \\n\", (RateTypeStart + i), pRA_Table->RTY_P[RateTypeStart + i]));\n\t\t}\n\n\t} else\tif (para_idx == RADBG_N_HIGH) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate Index|    |N-High| \\n\"));\n\n\n\t} else\tif (para_idx == RADBG_N_LOW){\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate Index|   |N-Low| \\n\"));\n\n\t}\n\telse\t if (para_idx == RADBG_RATE_UP_RTY_RATIO) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate Index|   |Rate Up RTY Ratio| \\n\"));\n\n\t\tfor (i = 0 ; i < (RateTypeLength) ; i++) {\n\t\t\tif (pRA_Table->is_ra_dbg_init)\n\t\t\t\tpRA_Table->RATE_UP_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\n\n\t\t\tpRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"%8d  %15d \\n\", (RateTypeStart + i), pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i]));\n\t\t}\n\t} else\t if (para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate Index|   |Rate Down RTY Ratio| \\n\"));\n\n\t\tfor (i = 0 ; i < (RateTypeLength) ; i++) {\n\t\t\tif (pRA_Table->is_ra_dbg_init)\n\t\t\t\tpRA_Table->RATE_DOWN_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\n\n\t\t\tpRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"%8d  %15d \\n\", (RateTypeStart + i), pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i]));\n\t\t}\n\t} else\t if (para_idx == RADBG_DEBUG_MONITOR1) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"-------------------------------\\n\"));\n\t\tif (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"RSSI =\", CmdBuf[1]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"Rate =\", CmdBuf[2] & 0x7f));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"SGI =\", (CmdBuf[2] & 0x80) >> 7));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"BW =\", CmdBuf[3]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"BW_max =\", CmdBuf[4]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"multi_rate0 =\", CmdBuf[5]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"multi_rate1 =\", CmdBuf[6]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"DISRA =\",\tCmdBuf[7]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"VHT_EN =\", CmdBuf[8]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"SGI_support =\",\tCmdBuf[9]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"try_ness =\", CmdBuf[10]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"pre_rate =\", CmdBuf[11]));\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"RSSI =\", CmdBuf[1]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %x \\n\", \"BW =\", CmdBuf[2]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"DISRA =\", CmdBuf[3]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"VHT_EN =\", CmdBuf[4]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"Hightest Rate =\", CmdBuf[5]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"Lowest Rate =\", CmdBuf[6]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"SGI_support =\", CmdBuf[7]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"Rate_ID =\",\tCmdBuf[8]));;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"-------------------------------\\n\"));\n\t} else\t if (para_idx == RADBG_DEBUG_MONITOR2) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"-------------------------------\\n\"));\n\t\tif (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %d \\n\", \"RateID =\", CmdBuf[1]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"highest_rate =\", CmdBuf[2]));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  0x%x \\n\", \"lowest_rate =\", CmdBuf[3]));\n\n\t\t\tfor (i = 4 ; i <= 11 ; i++)\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"RAMASK =  0x%x \\n\", CmdBuf[i]));\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  %x%x  %x%x  %x%x  %x%x \\n\", \"RA Mask:\",\n\t\t\t\t\t\t CmdBuf[8], CmdBuf[7], CmdBuf[6], CmdBuf[5], CmdBuf[4], CmdBuf[3], CmdBuf[2], CmdBuf[1]));\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"-------------------------------\\n\"));\n\t} else\t if (para_idx == RADBG_DEBUG_MONITOR3) {\n\n\t\tfor (i = 0 ; i < (CmdLen - 1) ; i++)\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"content[%d] =  %d \\n\", i, CmdBuf[1 + i]));\n\t} else\t if (para_idx == RADBG_DEBUG_MONITOR4)\n\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"%5s  {%d.%d} \\n\", \"RA Version =\", CmdBuf[1], CmdBuf[2]));\n\n}\n\nVOID\nodm_RA_ParaAdjust_Send_H2C(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\t\tH2C_Parameter[6] = {0};\n\n\tH2C_Parameter[0] =  RA_FIRST_MACID;\n\n\t//ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"RA_Para_feedback_req= (( %d ))  \\n\",pRA_Table->RA_Para_feedback_req ));\n\tif (pRA_Table->RA_Para_feedback_req) { //H2C_Parameter[5]=1 ; ask FW for all RA parameters\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[H2C] Ask FW for RA parameter \\n\"));\n\t\tH2C_Parameter[5] |= BIT1; //ask FW to report RA parameters\n\t\tH2C_Parameter[1] =  pRA_Table->para_idx; //pRA_Table->para_idx;\n\t\tpRA_Table->RA_Para_feedback_req = 0;\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[H2C] Send H2C to FW for modifying RA parameter \\n\"));\n\n\t\tH2C_Parameter[1] =  pRA_Table->para_idx;\n\t\tH2C_Parameter[2] =  pRA_Table->rate_idx;\n\t\t//1 [8 bit]\n\t\tif (pRA_Table->para_idx == RADBG_RTY_PENALTY || pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO || pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\n\t\t\tH2C_Parameter[3] = pRA_Table->value;\n\t\t\tH2C_Parameter[4] = 0;\n\t\t}\n\t\t//1 [16 bit]\n\t\telse { //if ((pRA_Table->rate_idx==RADBG_N_HIGH)||(pRA_Table->rate_idx==RADBG_N_LOW))\n\t\t\tH2C_Parameter[3] = (u1Byte)(((pRA_Table->value_16) & 0xf0) >> 4); //byte1\n\t\t\tH2C_Parameter[4] = (u1Byte)((pRA_Table->value_16) & 0x0f);\t   //byte0\n\t\t}\n\t}\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" H2C_Parameter[1] = 0x%x  \\n\", H2C_Parameter[1]));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" H2C_Parameter[2] = 0x%x  \\n\", H2C_Parameter[2]));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" H2C_Parameter[3] = 0x%x  \\n\", H2C_Parameter[3]));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" H2C_Parameter[4] = 0x%x  \\n\", H2C_Parameter[4]));\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" H2C_Parameter[5] = 0x%x  \\n\", H2C_Parameter[5]));\n\n\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RA_PARA_ADJUST, 6, H2C_Parameter);\n\n}\n\n\nVOID\nodm_RA_ParaAdjust(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\t\tpara_idx = pRA_Table->para_idx;\n\tu1Byte\t\t\trate_idx = pRA_Table->rate_idx;\n\tu1Byte\t\t\tvalue = pRA_Table->value;\n\tu1Byte\t\t\tPre_value = 0xff;\n\n\tBOOLEAN\t\t\tsign = 0;\n\n\tif (pRA_Table->para_idx == RADBG_RTY_PENALTY) {\n\t\tPre_value = pRA_Table->RTY_P[rate_idx];\n\t\tpRA_Table->RTY_P[rate_idx] = value;\n\t\tpRA_Table->RTY_P_modify_note[rate_idx] = 1;\n\t} else \tif (pRA_Table->para_idx == RADBG_N_HIGH) {\n\n\t} else \tif (pRA_Table->para_idx == RADBG_N_LOW) {\n\n\t} else\t if (pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO) {\n\t\tPre_value = pRA_Table->RATE_UP_RTY_RATIO[rate_idx];\n\t\tpRA_Table->RATE_UP_RTY_RATIO[rate_idx] = value;\n\t\tpRA_Table->RATE_UP_RTY_RATIO_modify_note[rate_idx] = 1;\n\t} else\t if (pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\n\t\tPre_value = pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx];\n\t\tpRA_Table->RATE_DOWN_RTY_RATIO[rate_idx] = value;\n\t\tpRA_Table->RATE_DOWN_RTY_RATIO_modify_note[rate_idx] = 1;\n\t}\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"  Change RA Papa[%d], Rate[ %d ],   ((%d))  ->  ((%d)) \\n\", pRA_Table->para_idx, rate_idx, Pre_value, value));\n\todm_RA_ParaAdjust_Send_H2C(pDM_Odm);\n}\n\n\nVOID\nphydm_ra_print_msg(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t*value,\n\tIN\t\tu1Byte\t\t*value_default,\n\tIN\t\tu1Byte\t\t*modify_note\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu4Byte i;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" |Rate index| |Current-value| |Default-value| |Modify?| \\n\"));\n\tfor (i = 0 ; i <= (pRA_Table->rate_length); i++) {\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"     [ %d ]  %20d  %25d  %20s \\n\", i, value[i], value_default[i], ((modify_note[i] == 1) ? \"V\" : \" .  \")));\n#else\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"     [ %d ]  %10d  %14d  %14s \\n\", i, value[i], value_default[i], ((modify_note[i] == 1) ? \"V\" : \" .  \")));\n#endif\n\t}\n\n}\n\nVOID\nodm_RA_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\n\tpRA_Table->is_ra_dbg_init = FALSE;\n\n\tif (dm_value[0] == 100) { /*1 Print RA Parameters*/\n\t\tu1Byte\tdefault_pointer_value;\n\t\tu1Byte\t*pvalue;\n\t\tu1Byte\t*pvalue_default;\n\t\tu1Byte\t*pmodify_note;\n\n\t\tpvalue = pvalue_default = pmodify_note = &default_pointer_value;\n\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"\\n------------------------------------------------------------------------------------\\n\"));\n\n\t\tif (dm_value[1] == RADBG_RTY_PENALTY) { /* [1]*/\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" [1] RTY_PENALTY\\n\"));\n\t\t\tpvalue\t\t=\t&(pRA_Table->RTY_P[0]);\n\t\t\tpvalue_default\t=\t&(pRA_Table->RTY_P_default[0]);\n\t\t\tpmodify_note\t=\t(u1Byte *)&(pRA_Table->RTY_P_modify_note[0]);\n\t\t} else if (dm_value[1] == RADBG_N_HIGH) { /* [2]*/\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" [2] N_HIGH\\n\"));\n\n\t\t} else if (dm_value[1] == RADBG_N_LOW) { /*[3]*/\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" [3] N_LOW\\n\"));\n\n\t\t} else if (dm_value[1] == RADBG_RATE_UP_RTY_RATIO) { /* [8]*/\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" [8] RATE_UP_RTY_RATIO\\n\"));\n\t\t\tpvalue\t\t=\t&(pRA_Table->RATE_UP_RTY_RATIO[0]);\n\t\t\tpvalue_default\t=\t&(pRA_Table->RATE_UP_RTY_RATIO_default[0]);\n\t\t\tpmodify_note\t=\t(u1Byte *)&(pRA_Table->RATE_UP_RTY_RATIO_modify_note[0]);\n\t\t} else if (dm_value[1] == RADBG_RATE_DOWN_RTY_RATIO) { /* [9]*/\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" [9] RATE_DOWN_RTY_RATIO\\n\"));\n\t\t\tpvalue\t\t=\t&(pRA_Table->RATE_DOWN_RTY_RATIO[0]);\n\t\t\tpvalue_default\t=\t&(pRA_Table->RATE_DOWN_RTY_RATIO_default[0]);\n\t\t\tpmodify_note\t=\t(u1Byte *)&(pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[0]);\n\t\t}\n\n\t\tphydm_ra_print_msg(pDM_Odm, pvalue, pvalue_default, pmodify_note);\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"\\n------------------------------------------------------------------------------------\\n\\n\"));\n\n\t} else if (dm_value[0] == 101) {\n\t\tpRA_Table->para_idx = (u1Byte)dm_value[1];\n\n\t\tpRA_Table->RA_Para_feedback_req = 1;\n\t\todm_RA_ParaAdjust_Send_H2C(pDM_Odm);\n\t} else {\n\t\tpRA_Table->para_idx = (u1Byte)dm_value[0];\n\t\tpRA_Table->rate_idx  = (u1Byte)dm_value[1];\n\t\tpRA_Table->value = (u1Byte)dm_value[2];\n\n\t\todm_RA_ParaAdjust(pDM_Odm);\n\t}\n\n}\n\nVOID\nodm_RA_ParaAdjust_init(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\t\ti;\n\tu1Byte\t\t\tra_para_pool_u8[3] = { RADBG_RTY_PENALTY,  RADBG_RATE_UP_RTY_RATIO, RADBG_RATE_DOWN_RTY_RATIO};\n\t/*\n\t\tRTY_PENALTY\t\t=\t1,  //u8\n\t\tN_HIGH \t\t\t\t=\t2,\n\t\tN_LOW\t\t\t\t=\t3,\n\t\tRATE_UP_TABLE\t\t=\t4,\n\t\tRATE_DOWN_TABLE\t=\t5,\n\t\tTRYING_NECESSARY\t=\t6,\n\t\tDROPING_NECESSARY =\t7,\n\t\tRATE_UP_RTY_RATIO\t=\t8, //u8\n\t\tRATE_DOWN_RTY_RATIO=\t9, //u8\n\t\tALL_PARA\t\t=\t0xff\n\n\t*/\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"odm_RA_ParaAdjust_init \\n\"));\n\n\tpRA_Table->is_ra_dbg_init = TRUE;\n\tfor (i = 0; i < 3; i++) {\n\t\tpRA_Table->RA_Para_feedback_req = 1;\n\t\tpRA_Table->para_idx\t=\tra_para_pool_u8[i];\n\t\todm_RA_ParaAdjust_Send_H2C(pDM_Odm);\n\t}\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8192E)\n\t\tpRA_Table->rate_length = ODM_RATEMCS15;\n\telse if ((pDM_Odm->SupportICType == ODM_RTL8723B) || (pDM_Odm->SupportICType == ODM_RTL8188E))\n\t\tpRA_Table->rate_length = ODM_RATEMCS7;\n\telse if ((pDM_Odm->SupportICType == ODM_RTL8821) || (pDM_Odm->SupportICType == ODM_RTL8881A))\n\t\tpRA_Table->rate_length = ODM_RATEVHTSS1MCS9;\n\telse if (pDM_Odm->SupportICType == ODM_RTL8812)\n\t\tpRA_Table->rate_length = ODM_RATEVHTSS2MCS9;\n\telse if (pDM_Odm->SupportICType == ODM_RTL8814A)\n\t\tpRA_Table->rate_length = ODM_RATEVHTSS3MCS9;\n\telse\n\t\tpRA_Table->rate_length = ODM_RATEVHTSS4MCS9;\n\n}\n\n#else\n\nVOID\nODM_C2HRaParaReportHandler(\n\tIN\tPVOID\tpDM_VOID,\n\tIN pu1Byte   CmdBuf,\n\tIN u1Byte   CmdLen\n)\n{\n}\n\nVOID\nodm_RA_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value\n)\n{\n}\n\nVOID\nodm_RA_ParaAdjust_init(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n\n{\n}\n\n#endif //#if (defined(CONFIG_RA_DBG_CMD))\n\nVOID\nphydm_ra_dynamic_retry_count(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\tPSTA_INFO_T\t\tpEntry;\n\tu1Byte\ti, retry_offset;\n\tu4Byte\tma_rx_tp;\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"pDM_Odm->pre_b_noisy = %d\\n\", pDM_Odm->pre_b_noisy ));*/\n\tif (pDM_Odm->pre_b_noisy != pDM_Odm->NoisyDecision) {\n\n\t\tif (pDM_Odm->NoisyDecision) {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"->Noisy Env. RA fallback value\\n\"));\n\t\t\tODM_SetMACReg(pDM_Odm, 0x430, bMaskDWord, 0x0);\n\t\t\tODM_SetMACReg(pDM_Odm, 0x434, bMaskDWord, 0x04030201);\t\t\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"->Clean Env. RA fallback value\\n\"));\n\t\t\tODM_SetMACReg(pDM_Odm, 0x430, bMaskDWord, 0x02010000);\n\t\t\tODM_SetMACReg(pDM_Odm, 0x434, bMaskDWord, 0x06050403);\t\t\n\t\t}\n\t\tpDM_Odm->pre_b_noisy = pDM_Odm->NoisyDecision;\n\t}\n}\n\n#if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\n\nVOID\nphydm_retry_limit_table_bound(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\t*retry_limit,\n\tIN\tu1Byte\toffset\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\n\tif (*retry_limit >  offset) {\n\t\t\n\t\t*retry_limit -= offset;\n\t\t\n\t\tif (*retry_limit < pRA_Table->retrylimit_low)\n\t\t\t*retry_limit = pRA_Table->retrylimit_low;\n\t\telse if (*retry_limit > pRA_Table->retrylimit_high)\n\t\t\t*retry_limit = pRA_Table->retrylimit_high;\n\t} else\n\t\t*retry_limit = pRA_Table->retrylimit_low;\n}\n\nVOID\nphydm_reset_retry_limit_table(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\t\ti;\n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) /*support all IC platform*/\n\n\t#else\n\t\t#if ((RTL8192E_SUPPORT == 1) || (RTL8723B_SUPPORT == 1) || (RTL8188E_SUPPORT == 1)) \n\t\t\tu1Byte per_rate_retrylimit_table_20M[ODM_RATEMCS15+1] = {\n\t\t\t\t1, 1, 2, 4,\t\t\t\t\t/*CCK*/\n\t\t\t\t2, 2, 4, 6, 8, 12, 16, 18,\t\t/*OFDM*/\n\t\t\t\t2, 4, 6, 8, 12, 18, 20, 22,\t\t/*20M HT-1SS*/\n\t\t\t\t2, 4, 6, 8, 12, 18, 20, 22\t\t/*20M HT-2SS*/\n\t\t\t};\n\t\t\tu1Byte per_rate_retrylimit_table_40M[ODM_RATEMCS15+1] = {\n\t\t\t\t1, 1, 2, 4,\t\t\t\t\t/*CCK*/\n\t\t\t\t2, 2, 4, 6, 8, 12, 16, 18,\t\t/*OFDM*/\n\t\t\t\t4, 8, 12, 16, 24, 32, 32, 32,\t\t/*40M HT-1SS*/\n\t\t\t\t4, 8, 12, 16, 24, 32, 32, 32\t\t/*40M HT-2SS*/\n\t\t\t};\n\n\t\t#elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) \n\n\t\t#elif (RTL8812A_SUPPORT == 1)\n\n\t\t#elif(RTL8814A_SUPPORT == 1)\n\n\t\t#else\n\n\t\t#endif\n\t#endif\n\n\tmemcpy(&(pRA_Table->per_rate_retrylimit_20M[0]), &(per_rate_retrylimit_table_20M[0]), ODM_NUM_RATE_IDX);\n\tmemcpy(&(pRA_Table->per_rate_retrylimit_40M[0]), &(per_rate_retrylimit_table_40M[0]), ODM_NUM_RATE_IDX);\n\n\tfor (i = 0; i < ODM_NUM_RATE_IDX; i++) {\n\t\tphydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), 0);\n\t\tphydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), 0);\n\t}\t\n}\n\nVOID\nphydm_ra_dynamic_retry_limit(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\tPSTA_INFO_T\t\tpEntry;\n\tu1Byte\ti, retry_offset;\n\tu4Byte\tma_rx_tp;\n\n\n\tif (pDM_Odm->pre_number_active_client == pDM_Odm->number_active_client) {\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\" pre_number_active_client ==  number_active_client\\n\"));\n\t\treturn;\n\t\t\n\t} else {\n\t\tif (pDM_Odm->number_active_client == 1) {\n\t\t\tphydm_reset_retry_limit_table(pDM_Odm);\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"one client only->reset to default value\\n\"));\n\t\t} else {\n\n\t\t\tretry_offset = pDM_Odm->number_active_client * pRA_Table->retry_descend_num;\n\t\t\t\n\t\t\tfor (i = 0; i < ODM_NUM_RATE_IDX; i++) {\n\n\t\t\t\tphydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), retry_offset);\n\t\t\t\tphydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), retry_offset);\t\n\t\t\t}\t\t\t\t\n\t\t}\n\t}\n}\n\nVOID\nphydm_ra_dynamic_retry_limit_init(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t        pRA_Table = &pDM_Odm->DM_RA_Table;\n\n\tpRA_Table->retry_descend_num = RA_RETRY_DESCEND_NUM;\n\tpRA_Table->retrylimit_low = RA_RETRY_LIMIT_LOW;\n\tpRA_Table->retrylimit_high = RA_RETRY_LIMIT_HIGH;\n\t\n\tphydm_reset_retry_limit_table(pDM_Odm);\n\t\n}\n#else\nVOID\nphydm_ra_dynamic_retry_limit(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n}\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\nVOID\nphydm_ra_dynamic_rate_id_on_assoc(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\twireless_mode,\n\tIN\tu1Byte\tinit_rate_id\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"[ON ASSOC] rf_mode = ((0x%x)), wireless_mode = ((0x%x)), init_rate_id = ((0x%x))\\n\", pDM_Odm->RFType, wireless_mode, init_rate_id));\n\t\n\tif ((pDM_Odm->RFType == ODM_2T2R) | (pDM_Odm->RFType == ODM_2T2R_GREEN) | (pDM_Odm->RFType == ODM_2T3R) | (pDM_Odm->RFType == ODM_2T4R)) {\n\t\t\n\t\tif ((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) &&\n\t\t\t(wireless_mode & (ODM_WM_N24G | ODM_WM_N5G))\n\t\t\t){\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"[ON ASSOC] set N-2SS ARFR5 table\\n\"));\n\t\t\tODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);\t/*N-2SS, ARFR5, rate_id = 0xe*/\n\t\t\tODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);\t\t/*N-2SS, ARFR5, rate_id = 0xe*/\n\t\t} else if ((pDM_Odm->SupportICType & (ODM_RTL8812)) &&\n\t\t\t(wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY))\n\t\t\t){\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"[ON ASSOC] set AC-2SS ARFR0 table\\n\"));\n\t\t\tODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);\t/*AC-2SS, ARFR0, rate_id = 0x9*/\n\t\t\tODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);\t\t/*AC-2SS, ARFR0, rate_id = 0x9*/\n\t\t}\n\t}\n\n}\n\nVOID\nphydm_ra_dynamic_rate_id_init(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) {\n\t\t\n\t\tODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);\t/*N-2SS, ARFR5, rate_id = 0xe*/\n\t\tODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);\t\t/*N-2SS, ARFR5, rate_id = 0xe*/\n\t\t\n\t\tODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);\t\t/*AC-2SS, ARFR0, rate_id = 0x9*/\n\t\tODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);\t/*AC-2SS, ARFR0, rate_id = 0x9*/\n\t}\n}\n\nVOID\nphydm_update_rate_id(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\trate,\n\tIN\tu1Byte\tplatform_macid\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\t\tcurrent_tx_ss;\n\tu1Byte\t\trate_idx = rate & 0x7f; /*remove bit7 SGI*/\n\tu1Byte\t\twireless_mode;\n\tu1Byte\t\tphydm_macid;\n\tPSTA_INFO_T\tpEntry;\n\t\n\tif (rate_idx >= ODM_RATEVHTSS2MCS0) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"Rate[%d]: (( VHT2SS-MCS%d ))\\n\", platform_macid, (rate_idx-ODM_RATEVHTSS2MCS0)));\n\t\t/*dummy for SD4 check patch*/\n\t} else if (rate_idx >= ODM_RATEVHTSS1MCS0) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"Rate[%d]: (( VHT1SS-MCS%d ))\\n\", platform_macid, (rate_idx-ODM_RATEVHTSS1MCS0)));\n\t\t/*dummy for SD4 check patch*/\n\t} else if (rate_idx >= ODM_RATEMCS0) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"Rate[%d]: (( HT-MCS%d ))\\n\", platform_macid, (rate_idx-ODM_RATEMCS0)));\n\t\t/*dummy for SD4 check patch*/\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"Rate[%d]: (( HT-MCS%d ))\\n\", platform_macid, rate_idx));\n\t\t/*dummy for SD4 check patch*/\n\t}\n\t\t\n\tphydm_macid = pDM_Odm->platform2phydm_macid_table[platform_macid];\n\tpEntry = pDM_Odm->pODM_StaInfo[phydm_macid];\n\t\n\tif (IS_STA_VALID(pEntry)) {\n\t\twireless_mode = pEntry->WirelessMode;\n\n\t\tif ((pDM_Odm->RFType  == ODM_2T2R) | (pDM_Odm->RFType  == ODM_2T2R_GREEN) | (pDM_Odm->RFType  == ODM_2T3R) | (pDM_Odm->RFType  == ODM_2T4R)) {\n\t\t\t\n\t\t\tpEntry->ratr_idx = pEntry->ratr_idx_init;\n\t\t\tif (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G)) { /*N mode*/\n\t\t\t\tif (rate_idx >= ODM_RATEMCS8 && rate_idx <= ODM_RATEMCS15) { /*2SS mode*/\n\t\t\t\t\t\n\t\t\t\t\tpEntry->ratr_idx = ARFR_5_RATE_ID;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"ARFR_5\\n\"));\n\t\t\t\t}\n\t\t\t} else if (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY)) {/*AC mode*/\n\t\t\t\tif (rate_idx >= ODM_RATEVHTSS2MCS0 && rate_idx <= ODM_RATEVHTSS2MCS9) {/*2SS mode*/\n\t\t\t\t\t\n\t\t\t\t\tpEntry->ratr_idx = ARFR_0_RATE_ID;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"ARFR_0\\n\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"UPdate_RateID[%d]: (( 0x%x ))\\n\", platform_macid, pEntry->ratr_idx));\n\t\t}\n\t}\n\n}\n#endif\n\nVOID\nphydm_c2h_ra_report_handler(\n\tIN PVOID\tpDM_VOID,\n\tIN pu1Byte   CmdBuf,\n\tIN u1Byte   CmdLen\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tu1Byte\tlegacy_table[12] = {1,2,5,11,6,9,12,18,24,36,48,54};\n\tu1Byte\tmacid = CmdBuf[1];\n\t\n\tu1Byte\trate = CmdBuf[0];\n\tu1Byte\trate_idx = rate & 0x7f; /*remove bit7 SGI*/\n\tu1Byte\tvht_en=(rate_idx >= ODM_RATEVHTSS1MCS0)? 1 :0;\t\n\tu1Byte\tb_sgi = (rate & 0x80)>>7;\n\t\n\tu1Byte\tpre_rate = pRA_Table->link_tx_rate[macid];\n\tu1Byte\tpre_rate_idx = pre_rate & 0x7f; /*remove bit7 SGI*/\n\tu1Byte\tpre_vht_en=(pre_rate_idx >= ODM_RATEVHTSS1MCS0)? 1 :0;\t\n\tu1Byte\tpre_b_sgi = (pre_rate & 0x80)>>7;\n\t\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\t\n\tGET_HAL_DATA(Adapter)->CurrentRARate = HwRateToMRate(rate_idx);\t\n\t#endif\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\tODM_UpdateInitRate(pDM_Odm, rate_idx);\n\t#endif\n\n\t/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,(\"RA: rate_idx=0x%x , sgi = %d\\n\", rate_idx, b_sgi));*/\n\t/*if (pDM_Odm->SupportICType & (ODM_RTL8703B))*/\n\t{\n\t\tif (CmdLen >= 4) {\n\t\t\tif (CmdBuf[3] == 0) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"Init-Rate Update\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 0xff) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"FW Level: Fix rate\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 1) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"Try Success\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 2) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"Try Fail & Try Again\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 3) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"Rate Back\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 4) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"start rate by RSSI\\n\"));\n\t\t\t\t/**/\n\t\t\t} else if (CmdBuf[3] == 5) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, (\"Try rate\\n\"));\n\t\t\t\t/**/\n\t\t\t}\n\t\t}\n\t}\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"Tx Rate Update, MACID[%d] ( %s%s%s%s%d%s%s ) -> ( %s%s%s%s%d%s%s)\\n\",\n\t\tmacid,\n\t\t((pre_rate_idx >= ODM_RATEVHTSS1MCS0) && (pre_rate_idx <= ODM_RATEVHTSS1MCS9)) ? \"VHT 1ss  \" : \"\",\n\t\t((pre_rate_idx >= ODM_RATEVHTSS2MCS0) && (pre_rate_idx <= ODM_RATEVHTSS2MCS9)) ? \"VHT 2ss \" : \"\",\n\t\t((pre_rate_idx >= ODM_RATEVHTSS3MCS0) && (pre_rate_idx <= ODM_RATEVHTSS3MCS9)) ? \"VHT 3ss \" : \"\",\n\t\t(pre_rate_idx >= ODM_RATEMCS0) ? \"MCS \" : \"\",\n\t\t(pre_vht_en) ? ((pre_rate_idx - ODM_RATEVHTSS1MCS0)%10) : ((pre_rate_idx >= ODM_RATEMCS0)? (pre_rate_idx - ODM_RATEMCS0) : ((pre_rate_idx <= ODM_RATE54M)?legacy_table[pre_rate_idx]:0)),\n\t\t(pre_b_sgi) ? \"-S\" : \"  \",\n\t\t(pre_rate_idx >= ODM_RATEMCS0) ? \"\" : \"M\",\n\t\t((rate_idx >= ODM_RATEVHTSS1MCS0) && (rate_idx <= ODM_RATEVHTSS1MCS9)) ? \"VHT 1ss  \" : \"\",\n\t\t((rate_idx >= ODM_RATEVHTSS2MCS0) && (rate_idx <= ODM_RATEVHTSS2MCS9)) ? \"VHT 2ss \" : \"\",\n\t\t((rate_idx >= ODM_RATEVHTSS3MCS0) && (rate_idx <= ODM_RATEVHTSS3MCS9)) ? \"VHT 3ss \" : \"\",\n\t\t(rate_idx >= ODM_RATEMCS0) ? \"MCS \" : \"\",\n\t\t(vht_en) ? ((rate_idx - ODM_RATEVHTSS1MCS0)%10) : ((rate_idx >= ODM_RATEMCS0)? (rate_idx - ODM_RATEMCS0) : ((rate_idx <= ODM_RATE54M)?legacy_table[rate_idx]:0)),\n\t\t(b_sgi) ? \"-S\" : \"  \",\n\t\t(rate_idx >= ODM_RATEMCS0) ? \"\" : \"M\" ));\n\n\tpRA_Table->link_tx_rate[macid] = rate;\n\n\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E))\n\t\tphydm_update_rate_id(pDM_Odm, rate, macid);\n\t#endif\n\n}\n\nVOID\nodm_RSSIMonitorInit(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tpRA_Table->firstconnect = FALSE;\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n\tpRA_Table->PT_collision_pre = TRUE;   //used in ODM_DynamicARFBSelect(WIN only)\n#endif\n#endif\n}\n\nVOID\nODM_RAPostActionOnAssoc(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tpDM_Odm->H2C_RARpt_connect = 1;\n\todm_RSSIMonitorCheck(pDM_Odm);\n\tpDM_Odm->H2C_RARpt_connect = 0;\n}\n\nVOID\nodm_RSSIMonitorCheck(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n\t//\n\t// For AP/ADSL use prtl8192cd_priv\n\t// For CE/NIC use PADAPTER\n\t//\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\n\t\treturn;\n\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tswitch\t(pDM_Odm->SupportPlatform) {\n\tcase\tODM_WIN:\n\t\todm_RSSIMonitorCheckMP(pDM_Odm);\n\t\tbreak;\n\n\tcase\tODM_CE:\n\t\todm_RSSIMonitorCheckCE(pDM_Odm);\n\t\tbreak;\n\n\tcase\tODM_AP:\n\t\todm_RSSIMonitorCheckAP(pDM_Odm);\n\t\tbreak;\n\n\tcase\tODM_ADSL:\n\t\t//odm_DIGAP(pDM_Odm);\n\t\tbreak;\n\t}\n\n}\t// odm_RSSIMonitorCheck\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\ns4Byte\nphydm_FindMinimumRSSI(\nIN\t\tPDM_ODM_T\t\tpDM_Odm,\nIN\t\tPADAPTER\t\tpAdapter,\nIN OUT\tBOOLEAN\t*pbLink_temp\n\n\t)\n{\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(pAdapter->MgntInfo);\n\tBOOLEAN\t\t\tact_as_ap = ACTING_AS_AP(pAdapter);\n\n\t/*DbgPrint(\"bMediaConnect = %d,  ACTING_AS_AP = %d ,  EntryMinUndecoratedSmoothedPWDB = %d\\n\",\n\t\tpMgntInfo->bMediaConnect,act_as_ap,pHalData->EntryMinUndecoratedSmoothedPWDB);*/\n\n\t\n\t/* 1.Determine the minimum RSSI */\n\tif ((!pMgntInfo->bMediaConnect) ||\t\n\t\t(act_as_ap && (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))) {/* We should check AP mode and Entry info.into consideration, revised by Roger, 2013.10.18*/\n\t\n\t\tpHalData->MinUndecoratedPWDBForDM = 0;\n\t\t*pbLink_temp = FALSE;\n\n\t} else\n\t\t*pbLink_temp = TRUE; \n\t\n\n\tif (pMgntInfo->bMediaConnect) {\t/* Default port*/\n\t\n\t\tif (act_as_ap || pMgntInfo->mIbss) {\n\t\t\tpHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\t\t/**/\n\t\t} else {\n\t\t\tpHalData->MinUndecoratedPWDBForDM = pHalData->UndecoratedSmoothedPWDB;\n\t\t\t/**/\n\t\t}\n\t} else { /* associated entry pwdb*/\n\t\tpHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\t\t/**/\n\t}\n\n\treturn pHalData->MinUndecoratedPWDBForDM;\n}\n\n#endif\n\nVOID\nodm_RSSIMonitorCheckMP(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tH2C_Parameter[4] = {0};\n\tu4Byte\t\t\ti;\n\tBOOLEAN\t\t\tbExtRAInfo = FALSE;\n\tu1Byte\t\t\tcmdlen = 3;\n\tu1Byte\t\t\tTxBF_EN = 0, stbc_en = 0;\n\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPRT_WLAN_STA\tpEntry = NULL;\n\ts4Byte\t\t\ttmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\n\tPMGNT_INFO\t\tpMgntInfo = &Adapter->MgntInfo;\n\tPMGNT_INFO\t\tpDefaultMgntInfo = &Adapter->MgntInfo;\n\tu8Byte\t\t\tcurTxOkCnt = 0, curRxOkCnt = 0;\n\t//BOOLEAN\t\t\tFirstConnect = 0;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\tpDIG_T\t\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\n#if (BEAMFORMING_SUPPORT == 1)\n\tBEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;\n#endif\n\n\tPADAPTER\tpLoopAdapter = GetDefaultAdapter(Adapter);\n\n\tif (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) {\n\t\tbExtRAInfo = TRUE;\n\t\tcmdlen = 4;\n\t}\n\n\t//FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\n\t//pRA_Table->firstconnect = pHalData->bLinked;\n\n\n\t/*\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->CustomerID==RT_CID_819x_HP))\n\t\t{\n\t\t\tif(curRxOkCnt >(curTxOkCnt*6))\n\t\t\t\tPlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);\n\t\t\telse\n\t\t\t\tPlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);\n\t\t}\n\n\n\t\tif(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821 ||\n\t\t   pDM_Odm->SupportICType == ODM_RTL8814A|| pDM_Odm->SupportICType == ODM_RTL8822B)\n\t\t{\n\t\t\tif(curRxOkCnt >(curTxOkCnt*6))\n\t\t\t\tH2C_Parameter[3]|=RAINFO_BE_RX_STATE;\n\t\t}\n\t*/\n\n\twhile (pLoopAdapter) {\n\n\t\tif (pLoopAdapter != NULL) {\n\t\t\tpMgntInfo = &pLoopAdapter->MgntInfo;\n\t\t\tcurTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\n\t\t\tcurRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\n\t\t\tpMgntInfo->lastTxOkCnt = curTxOkCnt;\n\t\t\tpMgntInfo->lastRxOkCnt = curRxOkCnt;\n\t\t}\n\n\t\tfor (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {\n\n\t\t\tif (IsAPModeExist(pLoopAdapter)) {\n\t\t\t\tif (GetFirstExtAdapter(pLoopAdapter) != NULL &&\n\t\t\t\t\tGetFirstExtAdapter(pLoopAdapter) == pLoopAdapter)\n\t\t\t\t\tpEntry = AsocEntry_EnumStation(pLoopAdapter, i);\n\t\t\t\telse if (GetFirstGOPort(pLoopAdapter) != NULL &&\n\t\t\t\t\t\t IsFirstGoAdapter(pLoopAdapter))\n\t\t\t\t\tpEntry = AsocEntry_EnumStation(pLoopAdapter, i);\n\t\t\t} else {\n\t\t\t\tif (GetDefaultAdapter(pLoopAdapter) == pLoopAdapter)\n\t\t\t\t\tpEntry = AsocEntry_EnumStation(pLoopAdapter, i);\n\t\t\t}\n\n\t\t\tif (pEntry != NULL) {\n\t\t\t\tif (pEntry->bAssociated) {\n\n\t\t\t\t\tRT_DISP_ADDR(FDM, DM_PWDB, (\"pEntry->MacAddr =\"), pEntry->MacAddr);\n\t\t\t\t\tRT_DISP(FDM, DM_PWDB, (\"pEntry->rssi = 0x%x(%d)\\n\",\n\t\t\t\t\t\t\t\t\t\t   pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\n\n\t\t\t\t\t//2 BF_en\n#if (BEAMFORMING_SUPPORT)\n\t\t\t\t\tBeamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pEntry->AssociatedMacId);\n\t\t\t\t\tif (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\n\t\t\t\t\t\tTxBF_EN = 1;\n#endif\n\t\t\t\t\t//2 STBC_en\n\t\t\t\t\tif ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX)) ||\n\t\t\t\t\t\tTEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX))\n\t\t\t\t\t\tstbc_en = 1;\n\n\t\t\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\n\t\t\t\t\t\ttmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\n\t\t\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\n\t\t\t\t\t\ttmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\n\n\t\t\t\t\tif (bExtRAInfo) {\n\t\t\t\t\t\tif (curRxOkCnt > (curTxOkCnt * 6))\n\t\t\t\t\t\t\tH2C_Parameter[3] |= RAINFO_BE_RX_STATE;\n\n\t\t\t\t\t\tif (TxBF_EN)\n\t\t\t\t\t\t\tH2C_Parameter[3] |= RAINFO_BF_STATE;\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (stbc_en)\n\t\t\t\t\t\t\t\tH2C_Parameter[3] |= RAINFO_STBC_STATE;\n\t\t\t\t\t\t}\n\n                        if ( pDM_Odm->NoisyDecision )\n                        {\n                            H2C_Parameter[3] |= RAINFO_NOISY_STATE;             // BIT2 \n                        }\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tH2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\n                        \n\t\t\t\t\t\tif (pDM_Odm->H2C_RARpt_connect)\n\t\t\t\t\t\t\tH2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\n\t\t\t\t\t}\n\n\t\t\t\t\tH2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);\n\t\t\t\t\t//H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\n\t\t\t\t\tH2C_Parameter[0] = (pEntry->AssociatedMacId);\n\n\t\t\t\t\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\n\t\t\t\t}\n\t\t\t} else\n\t\t\t\tbreak;\n\t\t}\n\n\t\tpLoopAdapter = GetNextExtAdapter(pLoopAdapter);\n\t}\n\n\tif (tmpEntryMaxPWDB != 0) {\t// If associated entry is found\n\t\tpHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\n\t\tRT_DISP(FDM, DM_PWDB, (\"EntryMaxPWDB = 0x%x(%d)\\n\",\ttmpEntryMaxPWDB, tmpEntryMaxPWDB));\n\t} else\n\t\tpHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\n\n\tif (tmpEntryMinPWDB != 0xff) { // If associated entry is found\n\t\tpHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\n\t\tRT_DISP(FDM, DM_PWDB, (\"EntryMinPWDB = 0x%x(%d)\\n\", tmpEntryMinPWDB, tmpEntryMinPWDB));\n\n\t} else\n\t\tpHalData->EntryMinUndecoratedSmoothedPWDB = 0;\n\n\t// Indicate Rx signal strength to FW.\n\tif (pHalData->bUseRAMask) {\n\t\tPRT_HIGH_THROUGHPUT \t\tpHTInfo = GET_HT_INFO(pDefaultMgntInfo);\n\t\tPRT_VERY_HIGH_THROUGHPUT\tpVHTInfo = GET_VHT_INFO(pDefaultMgntInfo);\n\n\t\t//2 BF_en\n#if (BEAMFORMING_SUPPORT == 1)\n\t\tBeamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pDefaultMgntInfo->mMacId);\n\n\t\tif (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\n\t\t\tTxBF_EN = 1;\n#endif\n\n\t\t//2 STBC_en\n\t\tif ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX)) ||\n\t\t\tTEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX))\n\t\t\tstbc_en = 1;\n\n\t\tif (bExtRAInfo) {\n\t\t\tif (TxBF_EN)\n\t\t\t\tH2C_Parameter[3] |= RAINFO_BF_STATE;\n\t\t\telse {\n\t\t\t\tif (stbc_en)\n\t\t\t\t\tH2C_Parameter[3] |= RAINFO_STBC_STATE;\n\t\t\t}\n\n\t\t\tif (pDM_Odm->H2C_RARpt_connect)\n\t\t\t\tH2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\n\t\t\t\n            if ( pDM_Odm->NoisyDecision==1 )\n            {\n                H2C_Parameter[3] |= RAINFO_NOISY_STATE;             // BIT2\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD, (\"[RSSIMonitorCheckMP] Send H2C to FW\\n\"));\n            }\n\t\t\telse\n\t\t\t\tH2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\n\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD, (\"[RSSIMonitorCheckMP] H2C_Parameter=%x\\n\", H2C_Parameter[3]));\n\t\t}\n\n\t\tH2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);\n\t\t//H2C_Parameter[1] = 0x20;\t// fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\n\t\tH2C_Parameter[0] = 0;\t\t// fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\n\n\t\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\n\n\t\t// BT 3.0 HS mode Rssi\n\t\tif (pDM_Odm->bBtHsOperation) {\n\t\t\tH2C_Parameter[2] = pDM_Odm->btHsRssi;\n\t\t\t//H2C_Parameter[1] = 0x0;\n\t\t\tH2C_Parameter[0] = 2;\n\n\t\t\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\n\t\t}\n\t} else\n\t\tPlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);\n\n\tif ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8192E))\n\t\todm_RSSIDumpToRegister(pDM_Odm);\n\n\n\t{\n\t\tPADAPTER pLoopAdapter = GetDefaultAdapter(Adapter);\n\t\tBOOLEAN\t\tdefault_pointer_value, *pbLink_temp = &default_pointer_value;\n\t\ts4Byte\tGlobalRSSI_min = 0xFF, LocalRSSI_Min;\n\t\tBOOLEAN\t\tbLink = FALSE;\n\n\t\twhile (pLoopAdapter) {\n\t\t\tLocalRSSI_Min = phydm_FindMinimumRSSI(pDM_Odm, pLoopAdapter, pbLink_temp);\n\t\t\t//DbgPrint(\"pHalData->bLinked=%d, LocalRSSI_Min=%d\\n\", pHalData->bLinked, LocalRSSI_Min);\n\t\t\tif ((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0))\n\t\t\t\tGlobalRSSI_min = LocalRSSI_Min;\n\n\t\t\tif (*pbLink_temp)\n\t\t\t\tbLink = TRUE;\n\n\t\t\tpLoopAdapter = GetNextExtAdapter(pLoopAdapter);\n\t\t}\n\n\t\tpHalData->bLinked = bLink;\n\t\tODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_LINK, (u8Byte)bLink);\n\n\t\tif (bLink)\n\t\t\tODM_CmnInfoUpdate(&pHalData->DM_OutSrc, ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min);\n\t\telse\n\t\t\tODM_CmnInfoUpdate(&pHalData->DM_OutSrc, ODM_CMNINFO_RSSI_MIN, 0);\n\n\t}\n\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n/*H2C_RSSI_REPORT*/\ns8 phydm_rssi_report(PDM_ODM_T pDM_Odm, u8 mac_id)\n{\n\tPADAPTER Adapter = pDM_Odm->Adapter;\n\tstruct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tu8 H2C_Parameter[4] = {0};\n\tu8 UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;\n\tu8 cmdlen = 4, first_connect = _FALSE;\n\tu64\tcurTxOkCnt = 0, curRxOkCnt = 0;\n\tPSTA_INFO_T pEntry = pDM_Odm->pODM_StaInfo[mac_id];\n\t\n\tif (!IS_STA_VALID(pEntry))\n\t\treturn _FAIL;\n\n\tif (mac_id != pEntry->mac_id) {\n\t\tDBG_871X(\"%s mac_id:%u:%u invalid\\n\", __func__, mac_id, pEntry->mac_id);\n\t\trtw_warn_on(1);\n\t\treturn _FAIL;\n\t}\t\n\t\n\tif (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\n\t\treturn _FAIL;\n\n\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB == (-1)) {\n\t\tDBG_871X(\"%s mac_id:%u, mac:\"MAC_FMT\", rssi == -1\\n\", __func__, pEntry->mac_id, MAC_ARG(pEntry->hwaddr));\n\t\treturn _FAIL;\n\t}\n\n\tcurTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;\n\tcurRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;\n\tif (curRxOkCnt > (curTxOkCnt * 6))\n\t\tUL_DL_STATE = 1;\n\telse\n\t\tUL_DL_STATE = 0;\n\t\n\t#ifdef CONFIG_BEAMFORMING\n\t{\n\t\t#if (BEAMFORMING_SUPPORT == 1)\n\t\tBEAMFORMING_CAP Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pEntry->mac_id);\n\t\t#else/*for drv beamforming*/\n\t\tBEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, pEntry->mac_id);\n\t\t#endif\n\n\t\tif (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\n\t\t\tTxBF_EN = 1;\n\t\telse\n\t\t\tTxBF_EN = 0;\n\t}\n\t#endif /*#ifdef CONFIG_BEAMFORMING*/\n\t\t\n\tif (TxBF_EN)\n\t\tSTBC_TX = 0;\n\telse {\n\t\t#ifdef CONFIG_80211AC_VHT\n\t\tif (IsSupportedVHT(pEntry->wireless_mode))\n\t\t\tSTBC_TX = TEST_FLAG(pEntry->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);\n\t\telse\n\t\t#endif\n\t\t\tSTBC_TX = TEST_FLAG(pEntry->htpriv.stbc_cap, STBC_HT_ENABLE_TX);\n\t}\n\t\t\n\tH2C_Parameter[0] = (u8)(pEntry->mac_id & 0xFF);\n\tH2C_Parameter[2] = pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0x7F;\n\t\t\n\tif (UL_DL_STATE)\n\t\tH2C_Parameter[3] |= RAINFO_BE_RX_STATE;\n\t\t\n\tif (TxBF_EN)\n\t\tH2C_Parameter[3] |= RAINFO_BF_STATE;\n\tif (STBC_TX)\n\t\tH2C_Parameter[3] |= RAINFO_STBC_STATE;\n\tif (pDM_Odm->NoisyDecision)\n\t\tH2C_Parameter[3] |= RAINFO_NOISY_STATE;\n\t\t\n\tif (pEntry->ra_rpt_linked == _FALSE) {\n\t\tH2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\n\t\tpEntry->ra_rpt_linked = _TRUE;\n\t\tfirst_connect = _TRUE;\n\t}\n\t\t\n\t#if 1\n\tif (first_connect) {\n\t\tDBG_871X(\"%s mac_id:%u, mac:\"MAC_FMT\", rssi:%d\\n\", __func__,\n\t\t\tpEntry->mac_id, MAC_ARG(pEntry->hwaddr), pEntry->rssi_stat.UndecoratedSmoothedPWDB);\n\t\t\t\n\t\tDBG_871X(\"%s RAINFO - TP:%s, TxBF:%s, STBC:%s, Noisy:%s, Firstcont:%s\\n\", __func__,\n\t\t\t(UL_DL_STATE) ? \"DL\" : \"UL\", (TxBF_EN) ? \"EN\" : \"DIS\", (STBC_TX) ? \"EN\" : \"DIS\",\n\t\t\t(pDM_Odm->NoisyDecision) ? \"True\" : \"False\", (first_connect) ? \"True\" : \"False\");\n\t}\n\t#endif\n\t\t\n\tif (pHalData->fw_ractrl == _TRUE) {\n\t\t#if (RTL8188E_SUPPORT == 1)\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\t\tcmdlen = 3;\n\t\t#endif\n\t\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\n\t} else {\n\t\t#if ((RTL8188E_SUPPORT == 1) && (RATE_ADAPTIVE_SUPPORT == 1))\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\t\tODM_RA_SetRSSI_8188E(pDM_Odm, (u8)(pEntry->mac_id & 0xFF), pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0x7F);\n\t\t#endif\n\t}\n\treturn _SUCCESS;\n}\n\nvoid phydm_ra_rssi_rpt_wk_hdl(PVOID pContext)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pContext;\n\tint i;\n\tu8 mac_id = 0xFF;\n\tPSTA_INFO_T\tpEntry = NULL;\t\n\t\n\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\tif (IS_STA_VALID(pEntry)) {\n\t\t\tif (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\n\t\t\t\tcontinue;\n\t\t\tif (pEntry->ra_rpt_linked == _FALSE) {\n\t\t\t\tmac_id = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (mac_id != 0xFF)\n\t\tphydm_rssi_report(pDM_Odm, mac_id);\n}\nvoid phydm_ra_rssi_rpt_wk(PVOID pContext)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pContext;\n\t\n\trtw_run_in_thread_cmd(pDM_Odm->Adapter, phydm_ra_rssi_rpt_wk_hdl, pDM_Odm);\n}\n#endif\n\nVOID\nodm_RSSIMonitorCheckCE(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n\tPSTA_INFO_T           pEntry;\n\tint\ti;\n\tint\ttmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\n\tu8\tsta_cnt = 0;\n\t\n\tif (pDM_Odm->bLinked != _TRUE)\n\t\treturn;\t\n\n\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\tpEntry = pDM_Odm->pODM_StaInfo[i];\n\t\tif (IS_STA_VALID(pEntry)) {\n\t\t\tif (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\n\t\t\t\tcontinue;\n\n\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB == (-1))\n\t\t\t\tcontinue;\n\n\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\n\t\t\t\ttmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\n\n\t\t\tif (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\n\t\t\t\ttmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\n\n\t\t\tif (phydm_rssi_report(pDM_Odm, i))\n\t\t\t\tsta_cnt++;\n\t\t}\n\t}\n\t/*DBG_871X(\"%s==> sta_cnt(%d)\\n\", __func__, sta_cnt);*/\n\n\tif (tmpEntryMaxPWDB != 0)\t// If associated entry is found\n\t\tpHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\n\telse\n\t\tpHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\n\n\tif (tmpEntryMinPWDB != 0xff) // If associated entry is found\n\t\tpHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\n\telse\n\t\tpHalData->EntryMinUndecoratedSmoothedPWDB = 0;\n\n\tFindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM\n\n\tpDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM;\n\t//ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\n#endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n}\n\n\nVOID\nodm_RSSIMonitorCheckAP(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n#if (RTL8812A_SUPPORT||RTL8881A_SUPPORT||RTL8192E_SUPPORT||RTL8814A_SUPPORT)\n\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte \t\t\tH2C_Parameter[4] = {0};\n\tu4Byte\t\t\t i;\n\tBOOLEAN\t\t\tbExtRAInfo = FALSE;\n\tu1Byte\t\t\tcmdlen = 3 ;\n\tu1Byte\t\t\tTxBF_EN = 0, stbc_en = 0;\n\n\tprtl8192cd_priv\tpriv\t\t= pDM_Odm->priv;\n\tPSTA_INFO_T \t\tpstat;\n\tBOOLEAN\t\t\tact_bfer = FALSE;\n\n#ifdef BEAMFORMING_SUPPORT\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\n\tpBDC_T\tpDM_BdcTable = &pDM_Odm->DM_BdcTable;\n\tpDM_BdcTable->num_Txbfee_Client = 0;\n\tpDM_BdcTable->num_Txbfer_Client = 0;\n#endif\n#endif\n\n\tif (pDM_Odm->H2C_RARpt_connect) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"[RA Init] First Connected\\n\"));\n\t\t/**/\n\t} else if (priv->up_time % 2)\n\t\treturn;\n\n\tif (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) {\n\t\tbExtRAInfo = TRUE;\n\t\tcmdlen = 4;\n\t}\n\n\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\tpstat = pDM_Odm->pODM_StaInfo[i];\n\n\t\tif (IS_STA_VALID(pstat)) {\n\t\t\tif (pstat->sta_in_firmware != 1)\n\t\t\t\tcontinue;\n\n\t\t\t//2 BF_en\n#ifdef BEAMFORMING_SUPPORT\n\t\t\tBEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid);\n\n\t\t\tif (Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU ||\n\t\t\t\tBeamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_HT_EXPLICIT) ||\n\t\t\t\tBeamform_cap == (BEAMFORMER_CAP_VHT_SU | BEAMFORMEE_CAP_VHT_SU)) {\n\t\t\t\tTxBF_EN = 1;\n\t\t\t\tact_bfer = TRUE;\n\t\t\t}\n\n#if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) //BDC\n\n\t\t\tif (act_bfer == TRUE) {\n\t\t\t\tpDM_BdcTable->w_BFee_Client[i] = 1; //AP act as BFer\n\t\t\t\tpDM_BdcTable->num_Txbfee_Client++;\n\t\t\t} else {\n\t\t\t\tpDM_BdcTable->w_BFee_Client[i] = 0; //AP act as BFer\n\t\t\t}\n\n\t\t\tif ((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU)) {\n\t\t\t\tpDM_BdcTable->w_BFer_Client[i] = 1; //AP act as BFee\n\t\t\t\tpDM_BdcTable->num_Txbfer_Client++;\n\t\t\t} else {\n\t\t\t\tpDM_BdcTable->w_BFer_Client[i] = 0; //AP act as BFer\n\t\t\t}\n#endif\n#endif\n\n\t\t\t//2 STBC_en\n\t\t\tif ((priv->pmib->dot11nConfigEntry.dot11nSTBC) &&\n\t\t\t\t((pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_))\n#ifdef RTK_AC_SUPPORT\n\t\t\t\t || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_))\n#endif\n\t\t\t\t))\n\t\t\t\tstbc_en = 1;\n\n\t\t\t//2 RAINFO\n\n\t\t\tif (bExtRAInfo) {\n\t\t\t\tif ((pstat->rx_avarage)  > ((pstat->tx_avarage) * 6))\n\t\t\t\t\tH2C_Parameter[3] |= RAINFO_BE_RX_STATE;\n\n\t\t\t\tif (TxBF_EN)\n\t\t\t\t\tH2C_Parameter[3] |= RAINFO_BF_STATE;\n\t\t\t\telse {\n\t\t\t\t\tif (stbc_en)\n\t\t\t\t\t\tH2C_Parameter[3] |= RAINFO_STBC_STATE;\n\t\t\t\t}\n\n                if ( pDM_Odm->NoisyDecision )\n                {\n                    H2C_Parameter[3] |= RAINFO_NOISY_STATE;             // BIT2\n                }\n\t\t\t\telse\n\t\t\t\t\tH2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\n\t\t\t\t\n\t\t\t\tif (pDM_Odm->H2C_RARpt_connect) {\n\t\t\t\t\tH2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (\"[RA Init] set Init rate by RSSI\\n\"));\n\t\t\t\t}\n\n\t\t\t\t/*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[RAINFO] H2C_Para[3] = %x\\n\",H2C_Parameter[3]));*/\n\t\t\t}\n\n\t\t\tH2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF);\n\t\t\tH2C_Parameter[0] = REMAP_AID(pstat);\n\n            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\n            (\"H2C_Parameter[3]=%d\\n\", H2C_Parameter[3]));\n\n\t\t\t//ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[RSSI] H2C_Para[2] = %x,  \\n\",H2C_Parameter[2]));\n\t\t\t//ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (\"[MACID] H2C_Para[0] = %x,  \\n\",H2C_Parameter[0]));\n\n\t\t\tODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\n\n\t\t}\n\t}\n\n#endif\n#endif\n\n}\n\n\nVOID\nodm_RateAdaptiveMaskInit(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_RATE_ADAPTIVE\tpOdmRA = &pDM_Odm->RateAdaptive;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPMGNT_INFO\t\tpMgntInfo = &pDM_Odm->Adapter->MgntInfo;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\n\n\tpMgntInfo->Ratr_State = DM_RATR_STA_INIT;\n\n\tif (pMgntInfo->DM_Type == DM_Type_ByDriver)\n\t\tpHalData->bUseRAMask = TRUE;\n\telse\n\t\tpHalData->bUseRAMask = FALSE;\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tpOdmRA->Type = DM_Type_ByDriver;\n\tif (pOdmRA->Type == DM_Type_ByDriver)\n\t\tpDM_Odm->bUseRAMask = _TRUE;\n\telse\n\t\tpDM_Odm->bUseRAMask = _FALSE;\n#endif\n\n\tpOdmRA->RATRState = DM_RATR_STA_INIT;\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tif (pDM_Odm->SupportICType == ODM_RTL8812)\n\t\tpOdmRA->LdpcThres = 50;\n\telse\n\t\tpOdmRA->LdpcThres = 35;\n\n\tpOdmRA->RtsThres = 35;\n\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tpOdmRA->LdpcThres = 35;\n\tpOdmRA->bUseLdpc = FALSE;\n\n#else\n\tpOdmRA->UltraLowRSSIThresh = 9;\n\n#endif\n\n\tpOdmRA->HighRSSIThresh = 50;\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \\\n\t((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n\tpOdmRA->LowRSSIThresh = 23;\n#else\n\tpOdmRA->LowRSSIThresh = 20;\n#endif\n}\n/*-----------------------------------------------------------------------------\n * Function:\todm_RefreshRateAdaptiveMask()\n *\n * Overview:\tUpdate rate table mask according to rssi\n *\n * Input:\t\tNONE\n *\n * Output:\t\tNONE\n *\n * Return:\t\tNONE\n *\n * Revised History:\n *\tWhen\t\tWho\t\tRemark\n *\t05/27/2009\thpfan\tCreate Version 0.\n *\n *---------------------------------------------------------------------------*/\nVOID\nodm_RefreshRateAdaptiveMask(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, (\"odm_RefreshRateAdaptiveMask()---------->\\n\"));\n\tif (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, (\"odm_RefreshRateAdaptiveMask(): Return cos not supported\\n\"));\n\t\treturn;\n\t}\n\t//\n\t// 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\n\t// at the same time. In the stage2/3, we need to prive universal interface and merge all\n\t// HW dynamic mechanism.\n\t//\n\tswitch\t(pDM_Odm->SupportPlatform) {\n\tcase\tODM_WIN:\n\t\todm_RefreshRateAdaptiveMaskMP(pDM_Odm);\n\t\tbreak;\n\n\tcase\tODM_CE:\n\t\todm_RefreshRateAdaptiveMaskCE(pDM_Odm);\n\t\tbreak;\n\n\tcase\tODM_AP:\n\tcase\tODM_ADSL:\n\t\todm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);\n\t\tbreak;\n\t}\n\n}\n\nVOID\nodm_RefreshRateAdaptiveMaskMP(\n\tIN\t\tPVOID\t\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tpAdapter\t =  pDM_Odm->Adapter;\n\tPADAPTER \t\t\t\tpTargetAdapter = NULL;\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPMGNT_INFO\t\t\t\tpMgntInfo = GetDefaultMgntInfo(pAdapter);\n\n\tif (pAdapter->bDriverStopped) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, (\"<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\\n\"));\n\t\treturn;\n\t}\n\n\tif (!pHalData->bUseRAMask) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\\n\"));\n\t\treturn;\n\t}\n\n\t// if default port is connected, update RA table for default port (infrastructure mode only)\n\tif (pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter))) {\n\t\todm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId,  pMgntInfo->IOTPeer, pHalData->UndecoratedSmoothedPWDB);\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"odm_RefreshRateAdaptiveMask(): Infrasture Mode\\n\"));\n\t\tif (ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State)) {\n\t\t\tODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Target AP addr : \"), pMgntInfo->Bssid);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"RSSI:%d, RSSI_LEVEL:%d\\n\", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));\n\t\t\tpAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\n\t\t} else if (pDM_Odm->bChangeState) {\n\t\t\tODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Target AP addr : \"), pMgntInfo->Bssid);\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Change Power Training State, bDisablePowerTraining = %d\\n\", pDM_Odm->bDisablePowerTraining));\n\t\t\tpAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\n\t\t}\n\t}\n\n\t//\n\t// The following part configure AP/VWifi/IBSS rate adaptive mask.\n\t//\n\n\tif (pMgntInfo->mIbss) \t// Target: AP/IBSS peer.\n\t\tpTargetAdapter = GetDefaultAdapter(pAdapter);\n\telse\n\t\tpTargetAdapter = GetFirstAPAdapter(pAdapter);\n\n\t// if extension port (softap) is started, updaet RA table for more than one clients associate\n\tif (pTargetAdapter != NULL) {\n\t\tint\ti;\n\t\tPRT_WLAN_STA\tpEntry;\n\n\t\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\t\tpEntry = AsocEntry_EnumStation(pTargetAdapter, i);\n\t\t\tif (NULL != pEntry) {\n\t\t\t\tif (pEntry->bAssociated) {\n\t\t\t\t\todm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB);\n\n\t\t\t\t\tif (ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State)) {\n\t\t\t\t\t\tODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Target STA addr : \"), pEntry->MacAddr);\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"RSSI:%d, RSSI_LEVEL:%d\\n\", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));\n\t\t\t\t\t\tpAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);\n\t\t\t\t\t} else if (pDM_Odm->bChangeState) {\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Change Power Training State, bDisablePowerTraining = %d\\n\", pDM_Odm->bDisablePowerTraining));\n\t\t\t\t\t\tpAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (pMgntInfo->bSetTXPowerTrainingByOid)\n\t\tpMgntInfo->bSetTXPowerTrainingByOid = FALSE;\n#endif\t// #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n}\n\n\nVOID\nodm_RefreshRateAdaptiveMaskCE(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\ti;\n\tPADAPTER\tpAdapter\t =  pDM_Odm->Adapter;\n\tPODM_RATE_ADAPTIVE\t\tpRA = &pDM_Odm->RateAdaptive;\n\n\tif (RTW_CANNOT_RUN(pAdapter)) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, (\"<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\\n\"));\n\t\treturn;\n\t}\n\n\tif (!pDM_Odm->bUseRAMask) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\\n\"));\n\t\treturn;\n\t}\n\n\t//printk(\"==> %s \\n\",__FUNCTION__);\n\n\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\tPSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\n\t\tif (IS_STA_VALID(pstat)) {\n\t\t\tif (IS_MCAST(pstat->hwaddr))  //if(psta->mac_id ==1)\n\t\t\t\tcontinue;\n\t\t\tif (IS_MCAST(pstat->hwaddr))\n\t\t\t\tcontinue;\n\n#if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\n\t\t\tif ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821)) {\n\t\t\t\tif (pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres) {\n\t\t\t\t\tpRA->bUseLdpc = TRUE;\n\t\t\t\t\tpRA->bLowerRtsRate = TRUE;\n\t\t\t\t\tif ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\n\t\t\t\t\t\tSet_RA_LDPC_8812(pstat, TRUE);\n\t\t\t\t\t//DbgPrint(\"RSSI=%d, bUseLdpc = TRUE\\n\", pHalData->UndecoratedSmoothedPWDB);\n\t\t\t\t} else if (pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres - 5)) {\n\t\t\t\t\tpRA->bUseLdpc = FALSE;\n\t\t\t\t\tpRA->bLowerRtsRate = FALSE;\n\t\t\t\t\tif ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\n\t\t\t\t\t\tSet_RA_LDPC_8812(pstat, FALSE);\n\t\t\t\t\t//DbgPrint(\"RSSI=%d, bUseLdpc = FALSE\\n\", pHalData->UndecoratedSmoothedPWDB);\n\t\t\t\t}\n\t\t\t}\n#endif\n\n\t\t\tif (TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level)) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"RSSI:%d, RSSI_LEVEL:%d\\n\", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));\n\t\t\t\t//printk(\"RSSI:%d, RSSI_LEVEL:%d\\n\", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);\n\t\t\t\trtw_hal_update_ra_mask(pstat, pstat->rssi_level);\n\t\t\t} else if (pDM_Odm->bChangeState) {\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Change Power Training State, bDisablePowerTraining = %d\\n\", pDM_Odm->bDisablePowerTraining));\n\t\t\t\trtw_hal_update_ra_mask(pstat, pstat->rssi_level);\n\t\t\t}\n\n\t\t}\n\t}\n\n#endif\n}\n\nVOID\nodm_RefreshRateAdaptiveMaskAPADSL(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tstruct rtl8192cd_priv *priv = pDM_Odm->priv;\n\tstruct aid_obj *aidarray;\n\tu4Byte i;\n\tPSTA_INFO_T pstat;\n\n\tif (priv->up_time % 2)\n\t\treturn;\n\n\tfor (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\n\t\tpstat = pDM_Odm->pODM_StaInfo[i];\n\n\t\tif (IS_STA_VALID(pstat)) {\n#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\n\t\t\taidarray = container_of(pstat, struct aid_obj, station);\n\t\t\tpriv = aidarray->priv;\n#endif\n\n\t\t\tif (!priv->pmib->dot11StationConfigEntry.autoRate)\n\t\t\t\tcontinue;\n\n\t\t\tif (ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level)) {\n\t\t\t\tODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"Target STA addr : \"), pstat->hwaddr);\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"RSSI:%d, RSSI_LEVEL:%d\\n\", pstat->rssi, pstat->rssi_level));\n\n#ifdef CONFIG_WLAN_HAL\n\t\t\t\tif (IS_HAL_CHIP(priv)) {\n#ifdef WDS\n//\t\t\t\t\tif(!(pstat->state & WIFI_WDS))//if WDS donot setting\n#endif\n\t\t\t\t\tGET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level);\n\t\t\t\t} else\n#endif\n#ifdef CONFIG_RTL_8812_SUPPORT\n\t\t\t\t\tif (GET_CHIP_VER(priv) == VERSION_8812E)\n\t\t\t\t\t\tUpdateHalRAMask8812(priv, pstat, 3);\n\t\t\t\t\telse\n#endif\n#ifdef CONFIG_RTL_88E_SUPPORT\n\t\t\t\t\t\tif (GET_CHIP_VER(priv) == VERSION_8188E) {\n#ifdef TXREPORT\n\t\t\t\t\t\t\tadd_RATid(priv, pstat);\n#endif\n\t\t\t\t\t\t} else\n#endif\n\t\t\t\t\t\t{\n#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\n\t\t\t\t\t\t\tadd_update_RATid(priv, pstat);\n#endif\n\t\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n}\n\n\n// Return Value: BOOLEAN\n// - TRUE: RATRState is changed.\nBOOLEAN\nODM_RAStateCheck(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\ts4Byte\t\t\tRSSI,\n\tIN\t\tBOOLEAN\t\t\tbForceUpdate,\n\tOUT\t\tpu1Byte\t\t\tpRATRState\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;\n\tconst u1Byte GoUpGap = 5;\n\tu1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;\n\tu1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;\n\tu1Byte RATRState;\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"RSSI= (( %d )), Current_RSSI_level = (( %d ))\\n\", RSSI, *pRATRState));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"[Ori RA RSSI Thresh]  High= (( %d )), Low = (( %d ))\\n\", HighRSSIThreshForRA, LowRSSIThreshForRA));\n\t// Threshold Adjustment:\n\t// when RSSI state trends to go up one or two levels, make sure RSSI is high enough.\n\t// Here GoUpGap is added to solve the boundary's level alternation issue.\n#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tu1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh;\n\tif (pDM_Odm->SupportICType == ODM_RTL8881A)\n\t\tLowRSSIThreshForRA = 30;\t\t// for LDPC / BCC switch\n#endif\n\n\tswitch (*pRATRState) {\n\tcase DM_RATR_STA_INIT:\n\tcase DM_RATR_STA_HIGH:\n\t\tbreak;\n\n\tcase DM_RATR_STA_MIDDLE:\n\t\tHighRSSIThreshForRA += GoUpGap;\n\t\tbreak;\n\n\tcase DM_RATR_STA_LOW:\n\t\tHighRSSIThreshForRA += GoUpGap;\n\t\tLowRSSIThreshForRA += GoUpGap;\n\t\tbreak;\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\tcase DM_RATR_STA_ULTRA_LOW:\n\t\tHighRSSIThreshForRA += GoUpGap;\n\t\tLowRSSIThreshForRA += GoUpGap;\n\t\tUltraLowRSSIThreshForRA += GoUpGap;\n\t\tbreak;\n#endif\n\n\tdefault:\n\t\tODM_RT_ASSERT(pDM_Odm, FALSE, (\"wrong rssi level setting %d !\", *pRATRState));\n\t\tbreak;\n\t}\n\n\t// Decide RATRState by RSSI.\n\tif (RSSI > HighRSSIThreshForRA)\n\t\tRATRState = DM_RATR_STA_HIGH;\n\telse if (RSSI > LowRSSIThreshForRA)\n\t\tRATRState = DM_RATR_STA_MIDDLE;\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\n\telse if (RSSI > UltraLowRSSIThreshForRA)\n\t\tRATRState = DM_RATR_STA_LOW;\n\telse\n\t\tRATRState = DM_RATR_STA_ULTRA_LOW;\n#else\n\telse\n\t\tRATRState = DM_RATR_STA_LOW;\n#endif\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"[Mod RA RSSI Thresh]  High= (( %d )), Low = (( %d ))\\n\", HighRSSIThreshForRA, LowRSSIThreshForRA));\n\t/*printk(\"==>%s,RATRState:0x%02x ,RSSI:%d\\n\",__FUNCTION__,RATRState,RSSI);*/\n\n\tif (*pRATRState != RATRState || bForceUpdate) {\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\"[RSSI Level Update] %d -> %d\\n\", *pRATRState, RATRState));\n\t\t*pRATRState = RATRState;\n\t\treturn TRUE;\n\t}\n\n\treturn FALSE;\n}\n\nVOID\nodm_RefreshBasicRateMask(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter\t =  pDM_Odm->Adapter;\n\tstatic u1Byte\t\tStage = 0;\n\tu1Byte\t\t\tCurStage = 0;\n\tOCTET_STRING \tosRateSet;\n\tPMGNT_INFO\t\tpMgntInfo = GetDefaultMgntInfo(Adapter);\n\tu1Byte \t\t\tRateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};\n\n\tif (pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821)\n\t\treturn;\n\n\tif (pDM_Odm->bLinked == FALSE)\t// unlink Default port information\n\t\tCurStage = 0;\n\telse if (pDM_Odm->RSSI_Min < 40)\t// link RSSI  < 40%\n\t\tCurStage = 1;\n\telse if (pDM_Odm->RSSI_Min > 45)\t// link RSSI > 45%\n\t\tCurStage = 3;\n\telse\n\t\tCurStage = 2;\t\t\t\t\t// link  25% <= RSSI <= 30%\n\n\tif (CurStage != Stage) {\n\t\tif (CurStage == 1) {\n\t\t\tFillOctetString(osRateSet, RateSet, 5);\n\t\t\tFilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);\n\t\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);\n\t\t} else if (CurStage == 3 && (Stage == 1 || Stage == 2))\n\t\t\tAdapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates));\n\t}\n\n\tStage = CurStage;\n#endif\n}\n\n\nVOID\nphydm_ra_info_init(\n\tIN\tPVOID\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t#if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\n\tphydm_ra_dynamic_retry_limit_init(pDM_Odm);\n\t#endif\n\t#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\tphydm_ra_dynamic_rate_id_init(pDM_Odm);\n\t#endif\n\n\t/*phydm_fw_trace_en_h2c(pDM_Odm, 1, 0, 0);*/\n}\n\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\nu1Byte\nodm_Find_RTS_Rate(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tTx_Rate,\n\tIN\t\tBOOLEAN\t\t\tbErpProtect\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\tRTS_Ini_Rate = ODM_RATE6M;\n\t\n\tif (bErpProtect) /* use CCK rate as RTS*/\n\t\tRTS_Ini_Rate = ODM_RATE1M;\n\telse {\n\t\tswitch (Tx_Rate) {\n\t\tcase ODM_RATEVHTSS3MCS9:\n\t\tcase ODM_RATEVHTSS3MCS8:\n\t\tcase ODM_RATEVHTSS3MCS7:\n\t\tcase ODM_RATEVHTSS3MCS6:\n\t\tcase ODM_RATEVHTSS3MCS5:\n\t\tcase ODM_RATEVHTSS3MCS4:\n\t\tcase ODM_RATEVHTSS3MCS3:\n\t\tcase ODM_RATEVHTSS2MCS9:\n\t\tcase ODM_RATEVHTSS2MCS8:\n\t\tcase ODM_RATEVHTSS2MCS7:\n\t\tcase ODM_RATEVHTSS2MCS6:\n\t\tcase ODM_RATEVHTSS2MCS5:\n\t\tcase ODM_RATEVHTSS2MCS4:\n\t\tcase ODM_RATEVHTSS2MCS3:\n\t\tcase ODM_RATEVHTSS1MCS9:\n\t\tcase ODM_RATEVHTSS1MCS8:\n\t\tcase ODM_RATEVHTSS1MCS7:\n\t\tcase ODM_RATEVHTSS1MCS6:\n\t\tcase ODM_RATEVHTSS1MCS5:\n\t\tcase ODM_RATEVHTSS1MCS4:\n\t\tcase ODM_RATEVHTSS1MCS3:\n\t\tcase ODM_RATEMCS15:\n\t\tcase ODM_RATEMCS14:\n\t\tcase ODM_RATEMCS13:\n\t\tcase ODM_RATEMCS12:\n\t\tcase ODM_RATEMCS11:\n\t\tcase ODM_RATEMCS7:\n\t\tcase ODM_RATEMCS6:\n\t\tcase ODM_RATEMCS5:\n\t\tcase ODM_RATEMCS4:\n\t\tcase ODM_RATEMCS3:\n\t\tcase ODM_RATE54M:\n\t\tcase ODM_RATE48M:\n\t\tcase ODM_RATE36M:\n\t\tcase ODM_RATE24M:\t\t\n\t\t\tRTS_Ini_Rate = ODM_RATE24M;\n\t\t\tbreak;\n\t\tcase ODM_RATEVHTSS3MCS2:\n\t\tcase ODM_RATEVHTSS3MCS1:\n\t\tcase ODM_RATEVHTSS2MCS2:\n\t\tcase ODM_RATEVHTSS2MCS1:\n\t\tcase ODM_RATEVHTSS1MCS2:\n\t\tcase ODM_RATEVHTSS1MCS1:\n\t\tcase ODM_RATEMCS10:\n\t\tcase ODM_RATEMCS9:\n\t\tcase ODM_RATEMCS2:\n\t\tcase ODM_RATEMCS1:\n\t\tcase ODM_RATE18M:\n\t\tcase ODM_RATE12M:\n\t\t\tRTS_Ini_Rate = ODM_RATE12M;\n\t\t\tbreak;\n\t\tcase ODM_RATEVHTSS3MCS0:\n\t\tcase ODM_RATEVHTSS2MCS0:\n\t\tcase ODM_RATEVHTSS1MCS0:\n\t\tcase ODM_RATEMCS8:\n\t\tcase ODM_RATEMCS0:\n\t\tcase ODM_RATE9M:\n\t\tcase ODM_RATE6M:\n\t\t\tRTS_Ini_Rate = ODM_RATE6M;\n\t\t\tbreak;\n\t\tcase ODM_RATE11M:\n\t\tcase ODM_RATE5_5M:\n\t\tcase ODM_RATE2M:\n\t\tcase ODM_RATE1M:\n\t\t\tRTS_Ini_Rate = ODM_RATE1M;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tRTS_Ini_Rate = ODM_RATE6M;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (*pDM_Odm->pBandType == 1) {\n\t\tif (RTS_Ini_Rate < ODM_RATE6M)\n\t\t\tRTS_Ini_Rate = ODM_RATE6M;\n\t}\n\treturn RTS_Ini_Rate;\n\n}\n\nVOID\nodm_Set_RA_DM_ARFB_by_Noisy(\n\tIN\tPDM_ODM_T\tpDM_Odm\n)\n{\n\t/*DbgPrint(\"DM_ARFB ====>\\n\");*/\n\tif (pDM_Odm->bNoisyState) {\n\t\tODM_Write4Byte(pDM_Odm, 0x430, 0x00000000);\n\t\tODM_Write4Byte(pDM_Odm, 0x434, 0x05040200);\n\t\t/*DbgPrint(\"DM_ARFB ====> Noisy State\\n\");*/\n\t} else {\n\t\tODM_Write4Byte(pDM_Odm, 0x430, 0x02010000);\n\t\tODM_Write4Byte(pDM_Odm, 0x434, 0x07050403);\n\t\t/*DbgPrint(\"DM_ARFB ====> Clean State\\n\");*/\n\t}\n\n}\n\nVOID\nODM_UpdateNoisyState(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tBOOLEAN\t\tbNoisyStateFromC2H\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t/*DbgPrint(\"Get C2H Command! NoisyState=0x%x\\n \", bNoisyStateFromC2H);*/\n\tif (pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  ||\n\t\tpDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)\n\t\tpDM_Odm->bNoisyState = bNoisyStateFromC2H;\n\todm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);\n};\n\nu4Byte\nSet_RA_DM_Ratrbitmap_by_Noisy(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tWIRELESS_MODE\tWirelessMode,\n\tIN\tu4Byte\t\t\tratr_bitmap,\n\tIN\tu1Byte\t\t\trssi_level\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte ret_bitmap = ratr_bitmap;\n\t\n\treturn ret_bitmap;\n\t\n\tswitch (WirelessMode) {\n\tcase WIRELESS_MODE_AC_24G:\n\tcase WIRELESS_MODE_AC_5G:\n\tcase WIRELESS_MODE_AC_ONLY:\n\t\tif (pDM_Odm->bNoisyState) { /*in Noisy State*/\n\t\t\tif (rssi_level == 1)\n\t\t\t\tret_bitmap &= 0xfc3e0c08;\t\t// Reserve MCS 5-9\n\t\t\telse if (rssi_level == 2)\n\t\t\t\tret_bitmap &= 0xfe3f8e08;\t\t// Reserve MCS 3-9\n\t\t\telse if (rssi_level == 3)\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t\telse\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t} else {                                /* in SNR State*/\n\t\t\tif (rssi_level == 1)\n\t\t\t\tret_bitmap &= 0xfe3f0e08;\t\t// Reserve MCS 4-9\n\t\t\telse if (rssi_level == 2)\n\t\t\t\tret_bitmap &= 0xff3fcf8c;\t\t// Reserve MCS 2-9\n\t\t\telse if (rssi_level == 3)\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t\telse\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t}\n\t\tbreak;\n\tcase WIRELESS_MODE_B:\n\tcase WIRELESS_MODE_A:\n\tcase WIRELESS_MODE_G:\n\tcase WIRELESS_MODE_N_24G:\n\tcase WIRELESS_MODE_N_5G:\n\t\tif (pDM_Odm->bNoisyState) {\n\t\t\tif (rssi_level == 1)\n\t\t\t\tret_bitmap &= 0x0f0e0c08;\t\t// Reserve MCS 4-7; MCS12-15\n\t\t\telse if (rssi_level == 2)\n\t\t\t\tret_bitmap &= 0x0fcfce0c;\t\t// Reserve MCS 2-7; MCS10-15\n\t\t\telse if (rssi_level == 3)\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t\telse\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t} else {\n\t\t\tif (rssi_level == 1)\n\t\t\t\tret_bitmap &= 0x0f8f8e08;\t\t// Reserve MCS 3-7; MCS11-15\n\t\t\telse if (rssi_level == 2)\n\t\t\t\tret_bitmap &= 0x0fefef8c;\t\t// Reserve MCS 1-7; MCS9-15\n\t\t\telse if (rssi_level == 3)\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t\telse\n\t\t\t\tret_bitmap &= 0xffffffff;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\t/*DbgPrint(\"DM_RAMask ====> rssi_LV = %d, BITMAP = %x\\n\", rssi_level, ret_bitmap);*/\n\treturn ret_bitmap;\n\n}\n\nVOID\nODM_UpdateInitRate(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu1Byte\t\tRate\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tp = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Get C2H Command! Rate=0x%x\\n\", Rate));\n\n\tpDM_Odm->TxRate = Rate;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n#if USE_WORKITEM\n\t\tPlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\n#else\n\t\tif (pDM_Odm->SupportICType == ODM_RTL8821) {\n#if (RTL8821A_SUPPORT == 1)\n\t\t\tODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n#endif\n\t\t} else if (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\t\tfor (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) {\n#if (RTL8812A_SUPPORT == 1)\n\t\t\t\tODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);\n#endif\n\t\t\t}\n\t\t} else if (pDM_Odm->SupportICType == ODM_RTL8723B) {\n#if (RTL8723B_SUPPORT == 1)\n\t\t\tODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n#endif\n\t\t} else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\n\t\t\tfor (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) {\n#if (RTL8192E_SUPPORT == 1)\n\t\t\t\tODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);\n#endif\n\t\t\t}\n\t\t} else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\n#if (RTL8188E_SUPPORT == 1)\n\t\t\tODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\n#endif\n\t\t}\n#endif\n#else\n\t\tPlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\n#endif\n#endif\n\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nodm_RSSIDumpToRegister(\n\tIN\tPVOID\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\n\tif (pDM_Odm->SupportICType == ODM_RTL8812) {\n\t\tPlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);\n\t\tPlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);\n\n\t\t/* Rx EVM*/\n\t\tPlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);\n\t\tPlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);\n\n\t\t/* Rx SNR*/\n\t\tPlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\n\t\tPlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\n\n\t\t/* Rx Cfo_Short*/\n\t\tPlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);\n\t\tPlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);\n\n\t\t/* Rx Cfo_Tail*/\n\t\tPlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);\n\t\tPlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);\n\t} else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\n\t\tPlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);\n\t\tPlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);\n\t\t/* Rx EVM*/\n\t\tPlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);\n\t\tPlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);\n\t\t/* Rx SNR*/\n\t\tPlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\n\t\tPlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\n\t\t/* Rx Cfo_Short*/\n\t\tPlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);\n\t\tPlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);\n\t\t/* Rx Cfo_Tail*/\n\t\tPlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);\n\t\tPlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);\n\t}\n}\n\nVOID\nodm_RefreshLdpcRtsMP(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\t\tmMacId,\n\tIN\tu1Byte\t\t\t\tIOTPeer,\n\tIN\ts4Byte\t\t\t\tUndecoratedSmoothedPWDB\n)\n{\n\tBOOLEAN\t\t\t\t\tbCtlLdpc = FALSE;\n\tPMGNT_INFO\t\t\t\tpMgntInfo = GetDefaultMgntInfo(pAdapter);\n\tPODM_RATE_ADAPTIVE\t\tpRA = &pDM_Odm->RateAdaptive;\n\n\tif (pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812)\n\t\treturn;\n\n\tif ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\n\t\tbCtlLdpc = TRUE;\n\telse if (pDM_Odm->SupportICType == ODM_RTL8812 &&\n\t\t\t IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)\n\t\tbCtlLdpc = TRUE;\n\n\tif (bCtlLdpc) {\n\t\tif (UndecoratedSmoothedPWDB < (pRA->LdpcThres - 5))\n\t\t\tMgntSet_TX_LDPC(pAdapter, mMacId, TRUE);\n\t\telse if (UndecoratedSmoothedPWDB > pRA->LdpcThres)\n\t\t\tMgntSet_TX_LDPC(pAdapter, mMacId, FALSE);\n\t}\n\n\tif (UndecoratedSmoothedPWDB < (pRA->RtsThres - 5))\n\t\tpRA->bLowerRtsRate = TRUE;\n\telse if (UndecoratedSmoothedPWDB > pRA->RtsThres)\n\t\tpRA->bLowerRtsRate = FALSE;\n}\n\nVOID\nODM_DynamicARFBSelect(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN \t\tu1Byte\t\t\trate,\n\tIN  \t\tBOOLEAN\t\t\tCollision_State\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRA_T\t\t\tpRA_Table = &pDM_Odm->DM_RA_Table;\n\n\tif (pDM_Odm->SupportICType != ODM_RTL8192E)\n\t\treturn;\n\n\tif (Collision_State == pRA_Table->PT_collision_pre)\n\t\treturn;\n\n\tif (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12) {\n\t\tif (Collision_State == 1) {\n\t\t\tif (rate == DESC_RATEMCS12) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);\n\t\t\t} else if (rate == DESC_RATEMCS11) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);\n\t\t\t} else if (rate == DESC_RATEMCS10) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);\n\t\t\t} else if (rate == DESC_RATEMCS9) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);\n\t\t\t} else {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);\n\t\t\t}\n\t\t} else { /* Collision_State == 0*/\n\t\t\tif (rate == DESC_RATEMCS12) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\n\t\t\t} else if (rate == DESC_RATEMCS11) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);\n\t\t\t} else if (rate == DESC_RATEMCS10) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);\n\t\t\t} else if (rate == DESC_RATEMCS9) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);\n\t\t\t} else {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);\n\t\t\t}\n\t\t}\n\t} else { /* MCS13~MCS15,  1SS, G-mode*/\n\t\tif (Collision_State == 1) {\n\t\t\tif (rate == DESC_RATEMCS15) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);\n\t\t\t} else if (rate == DESC_RATEMCS14) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);\n\t\t\t} else if (rate == DESC_RATEMCS13) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);\n\t\t\t} else {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);\n\t\t\t}\n\t\t} else { // Collision_State == 0\n\t\t\tif (rate == DESC_RATEMCS15) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);\n\t\t\t} else if (rate == DESC_RATEMCS14) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\n\t\t\t} else if (rate == DESC_RATEMCS13) {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\n\t\t\t} else {\n\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\n\t\t\t}\n\n\n\t\t}\n\n\t}\n\tpRA_Table->PT_collision_pre = Collision_State;\n}\n\nVOID\nODM_RateAdaptiveStateApInit(\n\tIN\tPVOID\t\tPADAPTER_VOID,\n\tIN\tPRT_WLAN_STA  \tpEntry\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)PADAPTER_VOID;\n\tpEntry->Ratr_State = DM_RATR_STA_INIT;\n}\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\n\nstatic void\nFindMinimumRSSI(\n\tIN\tPADAPTER\tpAdapter\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\n\t/*Determine the minimum RSSI*/\n\n\tif ((pDM_Odm->bLinked != _TRUE) &&\n\t\t(pHalData->EntryMinUndecoratedSmoothedPWDB == 0)) {\n\t\tpHalData->MinUndecoratedPWDBForDM = 0;\n\t\t/*ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, (\"Not connected to any\\n\"));*/\n\t} else\n\t\tpHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\n\n\t/*DBG_8192C(\"%s=>MinUndecoratedPWDBForDM(%d)\\n\",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);*/\n\t/*ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, (\"MinUndecoratedPWDBForDM =%d\\n\",pHalData->MinUndecoratedPWDBForDM));*/\n}\n\nu8Byte\nPhyDM_Get_Rate_Bitmap_Ex(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu4Byte\t\tmacid,\n\tIN\tu8Byte\t\tra_mask,\n\tIN\tu1Byte\t\trssi_level,\n\tOUT\t\tu8Byte\t*dm_RA_Mask,\n\tOUT\t\tu1Byte\t*dm_RteID\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPSTA_INFO_T\tpEntry;\n\tu8Byte\trate_bitmap = 0;\n\tu1Byte\tWirelessMode;\n\n\tpEntry = pDM_Odm->pODM_StaInfo[macid];\n\tif (!IS_STA_VALID(pEntry))\n\t\treturn ra_mask;\n\tWirelessMode = pEntry->wireless_mode;\n\tswitch (WirelessMode) {\n\tcase ODM_WM_B:\n\t\tif (ra_mask & 0x000000000000000c) /* 11M or 5.5M enable */\n\t\t\trate_bitmap = 0x000000000000000d;\n\t\telse\n\t\t\trate_bitmap = 0x000000000000000f;\n\t\tbreak;\n\n\tcase (ODM_WM_G):\n\tcase (ODM_WM_A):\n\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\trate_bitmap = 0x0000000000000f00;\n\t\telse\n\t\t\trate_bitmap = 0x0000000000000ff0;\n\t\tbreak;\n\n\tcase (ODM_WM_B|ODM_WM_G):\n\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\trate_bitmap = 0x0000000000000f00;\n\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\trate_bitmap = 0x0000000000000ff0;\n\t\telse\n\t\t\trate_bitmap = 0x0000000000000ff5;\n\t\tbreak;\n\n\tcase (ODM_WM_B|ODM_WM_G|ODM_WM_N24G):\n\tcase (ODM_WM_B|ODM_WM_N24G):\n\tcase (ODM_WM_G|ODM_WM_N24G):\n\tcase (ODM_WM_A|ODM_WM_N5G): {\n\t\tif (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\n\t\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\t\trate_bitmap = 0x00000000000f0000;\n\t\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\t\trate_bitmap = 0x00000000000ff000;\n\t\t\telse {\n\t\t\t\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t\t\t\t\trate_bitmap = 0x00000000000ff015;\n\t\t\t\telse\n\t\t\t\t\trate_bitmap = 0x00000000000ff005;\n\t\t\t}\n\t\t} else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\n\t\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\t\trate_bitmap = 0x000000000f8f0000;\n\t\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\t\trate_bitmap = 0x000000000f8ff000;\n\t\t\telse {\n\t\t\t\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t\t\t\t\trate_bitmap = 0x000000000f8ff015;\n\t\t\t\telse\n\t\t\t\t\trate_bitmap = 0x000000000f8ff005;\n\t\t\t}\n\t\t} else {\n\t\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\t\trate_bitmap = 0x0000000f0f0f0000;\n\t\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\t\trate_bitmap = 0x0000000fcfcfe000;\n\t\t\telse {\n\t\t\t\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t\t\t\t\trate_bitmap = 0x0000000ffffff015;\n\t\t\t\telse\n\t\t\t\t\trate_bitmap = 0x0000000ffffff005;\n\t\t\t}\n\t\t}\n\t}\n\tbreak;\n\n\tcase (ODM_WM_AC|ODM_WM_G):\n\t\tif (rssi_level == 1)\n\t\t\trate_bitmap = 0x00000000fc3f0000;\n\t\telse if (rssi_level == 2)\n\t\t\trate_bitmap = 0x00000000fffff000;\n\t\telse\n\t\t\trate_bitmap = 0x00000000ffffffff;\n\t\tbreak;\n\n\tcase (ODM_WM_AC|ODM_WM_A):\n\n\t\tif (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\n\t\t\tif (rssi_level == 1)\t\t\t\t/* add by Gary for ac-series */\n\t\t\t\trate_bitmap = 0x00000000003f8000;\n\t\t\telse if (rssi_level == 2)\n\t\t\t\trate_bitmap = 0x00000000003fe000;\n\t\t\telse\n\t\t\t\trate_bitmap = 0x00000000003ff010;\n\t\t} else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\n\t\t\tif (rssi_level == 1)\t\t\t\t/* add by Gary for ac-series */\n\t\t\t\trate_bitmap = 0x00000000fe3f8000;       /* VHT 2SS MCS3~9 */\n\t\t\telse if (rssi_level == 2)\n\t\t\t\trate_bitmap = 0x00000000fffff000;       /* VHT 2SS MCS0~9 */\n\t\t\telse\n\t\t\t\trate_bitmap = 0x00000000fffff010;       /* All */\n\t\t} else {\n\t\t\tif (rssi_level == 1)\t\t\t\t/* add by Gary for ac-series */\n\t\t\t\trate_bitmap = 0x000003f8fe3f8000ULL;       /* VHT 3SS MCS3~9 */\n\t\t\telse if (rssi_level == 2)\n\t\t\t\trate_bitmap = 0x000003fffffff000ULL;       /* VHT3SS MCS0~9 */\n\t\t\telse\n\t\t\t\trate_bitmap = 0x000003fffffff010ULL;       /* All */\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tif (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R)\n\t\t\trate_bitmap = 0x00000000000fffff;\n\t\telse if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R)\n\t\t\trate_bitmap = 0x000000000fffffff;\n\t\telse\n\t\t\trate_bitmap = 0x0000003fffffffffULL;\n\t\tbreak;\n\n\t}\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%016llx\\n\", rssi_level, WirelessMode, rate_bitmap));\n\n\treturn (ra_mask & rate_bitmap);\n}\n\n\nu4Byte\nODM_Get_Rate_Bitmap(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu4Byte\t\tmacid,\n\tIN\tu4Byte \t\tra_mask,\n\tIN\tu1Byte \t\trssi_level\n)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPSTA_INFO_T   \tpEntry;\n\tu4Byte \trate_bitmap = 0;\n\tu1Byte \tWirelessMode;\n\t//u1Byte \tWirelessMode =*(pDM_Odm->pWirelessMode);\n\n\n\tpEntry = pDM_Odm->pODM_StaInfo[macid];\n\tif (!IS_STA_VALID(pEntry))\n\t\treturn ra_mask;\n\n\tWirelessMode = pEntry->wireless_mode;\n\n\tswitch (WirelessMode) {\n\tcase ODM_WM_B:\n\t\tif (ra_mask & 0x0000000c)\t\t//11M or 5.5M enable\n\t\t\trate_bitmap = 0x0000000d;\n\t\telse\n\t\t\trate_bitmap = 0x0000000f;\n\t\tbreak;\n\n\tcase (ODM_WM_G):\n\tcase (ODM_WM_A):\n\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\trate_bitmap = 0x00000f00;\n\t\telse\n\t\t\trate_bitmap = 0x00000ff0;\n\t\tbreak;\n\n\tcase (ODM_WM_B|ODM_WM_G):\n\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\trate_bitmap = 0x00000f00;\n\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\trate_bitmap = 0x00000ff0;\n\t\telse\n\t\t\trate_bitmap = 0x00000ff5;\n\t\tbreak;\n\n\tcase (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)\t:\n\tcase (ODM_WM_B|ODM_WM_N24G)\t:\n\tcase (ODM_WM_G|ODM_WM_N24G)\t:\n\tcase (ODM_WM_A|ODM_WM_N5G)\t: {\n\t\tif (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\n\t\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\t\trate_bitmap = 0x000f0000;\n\t\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\t\trate_bitmap = 0x000ff000;\n\t\t\telse {\n\t\t\t\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t\t\t\t\trate_bitmap = 0x000ff015;\n\t\t\t\telse\n\t\t\t\t\trate_bitmap = 0x000ff005;\n\t\t\t}\n\t\t} else {\n\t\t\tif (rssi_level == DM_RATR_STA_HIGH)\n\t\t\t\trate_bitmap = 0x0f8f0000;\n\t\t\telse if (rssi_level == DM_RATR_STA_MIDDLE)\n\t\t\t\trate_bitmap = 0x0f8ff000;\n\t\t\telse {\n\t\t\t\tif (*(pDM_Odm->pBandWidth) == ODM_BW40M)\n\t\t\t\t\trate_bitmap = 0x0f8ff015;\n\t\t\t\telse\n\t\t\t\t\trate_bitmap = 0x0f8ff005;\n\t\t\t}\n\t\t}\n\t}\n\tbreak;\n\n\tcase (ODM_WM_AC|ODM_WM_G):\n\t\tif (rssi_level == 1)\n\t\t\trate_bitmap = 0xfc3f0000;\n\t\telse if (rssi_level == 2)\n\t\t\trate_bitmap = 0xfffff000;\n\t\telse\n\t\t\trate_bitmap = 0xffffffff;\n\t\tbreak;\n\n\tcase (ODM_WM_AC|ODM_WM_A):\n\n\t\tif (pDM_Odm->RFType == RF_1T1R) {\n\t\t\tif (rssi_level == 1)\t\t\t\t// add by Gary for ac-series\n\t\t\t\trate_bitmap = 0x003f8000;\n\t\t\telse if (rssi_level == 2)\n\t\t\t\trate_bitmap = 0x003ff000;\n\t\t\telse\n\t\t\t\trate_bitmap = 0x003ff010;\n\t\t} else {\n\t\t\tif (rssi_level == 1)\t\t\t\t// add by Gary for ac-series\n\t\t\t\trate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9\n\t\t\telse if (rssi_level == 2)\n\t\t\t\trate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9\n\t\t\telse\n\t\t\t\trate_bitmap = 0xfffff010;       // All\n\t\t}\n\t\tbreak;\n\n\tdefault:\n\t\tif (pDM_Odm->RFType == RF_1T2R)\n\t\t\trate_bitmap = 0x000fffff;\n\t\telse\n\t\t\trate_bitmap = 0x0fffffff;\n\t\tbreak;\n\n\t}\n\n\tDBG_871X(\"%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\\n\", __func__, rssi_level, WirelessMode, rate_bitmap);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (\" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\\n\", rssi_level, WirelessMode, rate_bitmap));\n\n\treturn (ra_mask & rate_bitmap);\n\n}\n\n#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\n#endif /*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/\n\n"
  },
  {
    "path": "hal/phydm/phydm_rainfo.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef\t__PHYDMRAINFO_H__\n#define    __PHYDMRAINFO_H__\n\n/*#define RAINFO_VERSION\t\"2.0\"  //2014.11.04*/\n/*#define RAINFO_VERSION\t\"3.0\"  //2015.01.13 Dino*/\n/*#define RAINFO_VERSION\t\"3.1\"  //2015.01.14 Dino*/\n#define RAINFO_VERSION\t\"3.2\"  /*2015.01.14 Dino*/\n\n#define HIGH_RSSI_THRESH\t50\n#define LOW_RSSI_THRESH\t20\n\n#define\tACTIVE_TP_THRESHOLD\t150\n#define\tRA_RETRY_DESCEND_NUM\t2\n#define\tRA_RETRY_LIMIT_LOW\t4\n#define\tRA_RETRY_LIMIT_HIGH\t32\n\n#define PHYDM_IC_8051_SERIES\t\t(ODM_RTL8881A|ODM_RTL8812|ODM_RTL8821|ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8703B|ODM_RTL8188F)\n#define PHYDM_IC_3081_SERIES\t\t(ODM_RTL8814A|ODM_RTL8821B|ODM_RTL8822B)\n\n#define RAINFO_BE_RX_STATE\t\t\tBIT0  // 1:RX    //ULDL\n#define RAINFO_STBC_STATE\t\t\tBIT1\n//#define RAINFO_LDPC_STATE \t\t\tBIT2\n#define RAINFO_NOISY_STATE \t\t\tBIT2    // set by Noisy_Detection\n#define RAINFO_SHURTCUT_STATE \t\tBIT3\n#define RAINFO_SHURTCUT_FLAG \t\tBIT4\n#define RAINFO_INIT_RSSI_RATE_STATE  BIT5\n#define RAINFO_BF_STATE \t\t\t\tBIT6\n#define RAINFO_BE_TX_STATE \t\t\tBIT7 // 1:TX\n\n#define\tRA_MASK_CCK\t\t0xf\n#define\tRA_MASK_OFDM\t\t0xff0\n#define\tRA_MASK_HT1SS\t\t0xff000\n#define\tRA_MASK_HT2SS\t\t0xff00000\n/*#define\tRA_MASK_MCS3SS\t*/\n#define\tRA_MASK_HT4SS\t\t0xff0\n#define\tRA_MASK_VHT1SS\t0x3ff000\n#define\tRA_MASK_VHT2SS\t0xffc00000\n\n#if(DM_ODM_SUPPORT_TYPE == ODM_AP)\n#define\tEXT_RA_INFO_SUPPORT_IC (ODM_RTL8881A |ODM_RTL8192E |ODM_RTL8812 |ODM_RTL8814A|ODM_RTL8822B)\n#define\t\tRA_FIRST_MACID \t1\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#define\tEXT_RA_INFO_SUPPORT_IC (ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8723B | ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8703B)\n#define\t\tRA_FIRST_MACID \t0\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n/*#define\tEXT_RA_INFO_SUPPORT_IC (ODM_RTL8192E|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723B|ODM_RTL8814A|ODM_RTL8822B|ODM_RTL8703B) */\n#define\t\tRA_FIRST_MACID \t0\n#endif\n\n\n#define AP_InitRateAdaptiveState\tODM_RateAdaptiveStateApInit\n\n#define\t\tDM_RATR_STA_INIT\t\t\t0\n#define\t\tDM_RATR_STA_HIGH\t\t\t1\n#define \t\tDM_RATR_STA_MIDDLE\t\t2\n#define \t\tDM_RATR_STA_LOW\t\t\t3\n#if(DM_ODM_SUPPORT_TYPE & ODM_AP)\n#define\t\tDM_RATR_STA_ULTRA_LOW\t4\n#endif\n\n#define\t\tDM_RA_RATE_UP\t\t\t\t1\n#define\t\tDM_RA_RATE_DOWN\t\t\t2\n\ntypedef enum _phydm_arfr_num {\n\tARFR_0_RATE_ID\t=\t0x9,\n\tARFR_1_RATE_ID\t=\t0xa,\n\tARFR_2_RATE_ID\t=\t0xb,\n\tARFR_3_RATE_ID\t=\t0xc,\n\tARFR_4_RATE_ID\t=\t0xd,\n\tARFR_5_RATE_ID\t=\t0xe\n} PHYDM_RA_ARFR_NUM_E;\n\ntypedef enum _Phydm_ra_dbg_para {\n\tRADBG_RTY_PENALTY\t\t\t=\t1,  //u8\n\tRADBG_N_HIGH \t\t\t\t=\t2,\n\tRADBG_N_LOW\t\t\t\t=\t3,\n\tRADBG_TRATE_UP_TABLE\t\t=\t4,\n\tRADBG_TRATE_DOWN_TABLE\t=\t5,\n\tRADBG_TRYING_NECESSARY\t=\t6,\n\tRADBG_TDROPING_NECESSARY =\t7,\n\tRADBG_RATE_UP_RTY_RATIO\t=\t8, //u8\n\tRADBG_RATE_DOWN_RTY_RATIO =\t9, //u8\n\n\tRADBG_DEBUG_MONITOR1 = 0xc,\n\tRADBG_DEBUG_MONITOR2 = 0xd,\n\tRADBG_DEBUG_MONITOR3 = 0xe,\n\tRADBG_DEBUG_MONITOR4 = 0xf,\n\tNUM_RA_PARA\n} PHYDM_RA_DBG_PARA_E;\n\n\n#if (RATE_ADAPTIVE_SUPPORT == 1)//88E RA\ntypedef struct _ODM_RA_Info_ {\n\tu1Byte RateID;\n\tu4Byte RateMask;\n\tu4Byte RAUseRate;\n\tu1Byte RateSGI;\n\tu1Byte RssiStaRA;\n\tu1Byte PreRssiStaRA;\n\tu1Byte SGIEnable;\n\tu1Byte DecisionRate;\n\tu1Byte PreRate;\n\tu1Byte HighestRate;\n\tu1Byte LowestRate;\n\tu4Byte NscUp;\n\tu4Byte NscDown;\n\tu2Byte RTY[5];\n\tu4Byte TOTAL;\n\tu2Byte DROP;\n\tu1Byte Active;\n\tu2Byte RptTime;\n\tu1Byte RAWaitingCounter;\n\tu1Byte RAPendingCounter;\n#if 1 //POWER_TRAINING_ACTIVE == 1 // For compile  pass only~!\n\tu1Byte PTActive;  // on or off\n\tu1Byte PTTryState;  // 0 trying state, 1 for decision state\n\tu1Byte PTStage;  // 0~6\n\tu1Byte PTStopCount; //Stop PT counter\n\tu1Byte PTPreRate;  // if rate change do PT\n\tu1Byte PTPreRssi; // if RSSI change 5% do PT\n\tu1Byte PTModeSS;  // decide whitch rate should do PT\n\tu1Byte RAstage;  // StageRA, decide how many times RA will be done between PT\n\tu1Byte PTSmoothFactor;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP) && ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\n\tu1Byte RateDownCounter;\n\tu1Byte RateUpCounter;\n\tu1Byte RateDirection;\n\tu1Byte BoundingType;\n\tu1Byte BoundingCounter;\n\tu1Byte BoundingLearningTime;\n\tu1Byte RateDownStartTime;\n#endif\n} ODM_RA_INFO_T, *PODM_RA_INFO_T;\n#endif\n\n\ntypedef struct _Rate_Adaptive_Table_ {\n\tu1Byte\t\tfirstconnect;\n#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\n\tBOOLEAN\t\tPT_collision_pre;\n#endif\n\n#if (defined(CONFIG_RA_DBG_CMD))\n\tBOOLEAN\t\tis_ra_dbg_init;\n\n\tu1Byte\tRTY_P[ODM_NUM_RATE_IDX];\n\tu1Byte\tRTY_P_default[ODM_NUM_RATE_IDX];\n\tBOOLEAN\tRTY_P_modify_note[ODM_NUM_RATE_IDX];\n\n\tu1Byte\tRATE_UP_RTY_RATIO[ODM_NUM_RATE_IDX];\n\tu1Byte\tRATE_UP_RTY_RATIO_default[ODM_NUM_RATE_IDX];\n\tBOOLEAN\tRATE_UP_RTY_RATIO_modify_note[ODM_NUM_RATE_IDX];\n\n\tu1Byte\tRATE_DOWN_RTY_RATIO[ODM_NUM_RATE_IDX];\n\tu1Byte\tRATE_DOWN_RTY_RATIO_default[ODM_NUM_RATE_IDX];\n\tBOOLEAN\tRATE_DOWN_RTY_RATIO_modify_note[ODM_NUM_RATE_IDX];\n\n\tBOOLEAN RA_Para_feedback_req;\n\n\tu1Byte   para_idx;\n\tu1Byte\trate_idx;\n\tu1Byte\tvalue;\n\tu2Byte\tvalue_16;\n\tu1Byte\trate_length;\n#endif\n\tu1Byte\tlink_tx_rate[ODM_ASSOCIATE_ENTRY_NUM];\n\n\t#if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\n\tu1Byte per_rate_retrylimit_20M[ODM_NUM_RATE_IDX];\n\tu1Byte per_rate_retrylimit_40M[ODM_NUM_RATE_IDX];\t\n\tu1Byte\t\t\tretry_descend_num;\n\tu1Byte\t\t\tretrylimit_low;\n\tu1Byte\t\t\tretrylimit_high;\n\t#endif\n\n\n} RA_T, *pRA_T;\n\ntypedef struct _ODM_RATE_ADAPTIVE {\n\tu1Byte\t\t\t\tType;\t\t\t\t// DM_Type_ByFW/DM_Type_ByDriver\n\tu1Byte\t\t\t\tHighRSSIThresh;\t\t// if RSSI > HighRSSIThresh\t=> RATRState is DM_RATR_STA_HIGH\n\tu1Byte\t\t\t\tLowRSSIThresh;\t\t// if RSSI <= LowRSSIThresh\t=> RATRState is DM_RATR_STA_LOW\n\tu1Byte\t\t\t\tRATRState;\t\t\t// Current RSSI level, DM_RATR_STA_HIGH/DM_RATR_STA_MIDDLE/DM_RATR_STA_LOW\n\n#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tu1Byte\t\t\t\tLdpcThres;\t\t\t// if RSSI > LdpcThres => switch from LPDC to BCC\n\tBOOLEAN\t\t\t\tbLowerRtsRate;\n#endif\n\n#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\tu1Byte\t\t\t\tRtsThres;\n#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\n\tBOOLEAN\t\t\t\tbUseLdpc;\n#else\n\tu1Byte\t\t\t\tUltraLowRSSIThresh;\n\tu4Byte\t\t\t\tLastRATR;\t\t\t// RATR Register Content\n#endif\n\n} ODM_RATE_ADAPTIVE, *PODM_RATE_ADAPTIVE;\n\nVOID\nODM_C2HRaParaReportHandler(\n\tIN\tPVOID\tpDM_VOID,\n\tIN pu1Byte   CmdBuf,\n\tIN u1Byte   CmdLen\n);\n\nVOID\nodm_RA_ParaAdjust_Send_H2C(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RA_debug(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN\t\tu4Byte\t\t*const dm_value\n);\n\nVOID\nodm_RA_ParaAdjust_init(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_RA_ParaAdjust(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nphydm_ra_dynamic_retry_count(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nphydm_ra_dynamic_retry_limit(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nphydm_ra_dynamic_rate_id_on_assoc(\n\tIN\tPVOID\tpDM_VOID,\n\tIN\tu1Byte\twireless_mode,\n\tIN\tu1Byte\tinit_rate_id\n);\n\nVOID\nphydm_c2h_ra_report_handler(\n\tIN PVOID\tpDM_VOID,\n\tIN pu1Byte   CmdBuf,\n\tIN u1Byte   CmdLen\n);\n\nVOID\nphydm_ra_info_init(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RSSIMonitorInit(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RSSIMonitorCheck(\n\tIN\tPVOID\tpDM_VOID\n);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\ns4Byte\nphydm_FindMinimumRSSI(\nIN\t\tPDM_ODM_T\t\tpDM_Odm,\nIN\t\tPADAPTER\t\tpAdapter,\nIN OUT\tBOOLEAN\t*pbLink_temp\n\n\t);\n#endif\n\nVOID\nodm_RSSIMonitorCheckMP(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RSSIMonitorCheckCE(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RSSIMonitorCheckAP(\n\tIN\tPVOID\tpDM_VOID\n);\n\n\nVOID\nodm_RateAdaptiveMaskInit(\n\tIN \tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RefreshRateAdaptiveMask(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_RefreshRateAdaptiveMaskMP(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_RefreshRateAdaptiveMaskCE(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nVOID\nodm_RefreshRateAdaptiveMaskAPADSL(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\n\nBOOLEAN\nODM_RAStateCheck(\n\tIN\t\tPVOID\t\t    pDM_VOID,\n\tIN\t\ts4Byte\t\t\tRSSI,\n\tIN\t\tBOOLEAN\t\t\tbForceUpdate,\n\tOUT\t\tpu1Byte\t\t\tpRATRState\n);\n\nVOID\nodm_RefreshBasicRateMask(\n\tIN\t\tPVOID\t\tpDM_VOID\n);\nVOID\nODM_RAPostActionOnAssoc(\n\tIN\t\tPVOID\tpDM_Odm\n);\n\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\nu1Byte\nodm_Find_RTS_Rate(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\t\tu1Byte\t\t\tTx_Rate,\n\tIN\t\tBOOLEAN\t\t\tbErpProtect\n);\n\nVOID\nODM_UpdateNoisyState(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tBOOLEAN\t\tbNoisyStateFromC2H\n);\n\nu4Byte\nSet_RA_DM_Ratrbitmap_by_Noisy(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tWIRELESS_MODE\tWirelessMode,\n\tIN\tu4Byte\t\t\tratr_bitmap,\n\tIN\tu1Byte\t\t\trssi_level\n);\n\nVOID\nODM_UpdateInitRate(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu1Byte\t\tRate\n);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nodm_RSSIDumpToRegister(\n\tIN\tPVOID\tpDM_VOID\n);\n\nVOID\nodm_RefreshLdpcRtsMP(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\t\tmMacId,\n\tIN\tu1Byte\t\t\t\tIOTPeer,\n\tIN\ts4Byte\t\t\t\tUndecoratedSmoothedPWDB\n);\n\nVOID\nODM_DynamicARFBSelect(\n\tIN\t\tPVOID\t\tpDM_VOID,\n\tIN \t\tu1Byte\t\trate,\n\tIN  \tBOOLEAN\t\tCollision_State\n);\n\nVOID\nODM_RateAdaptiveStateApInit(\n\tIN\tPVOID\t\t\tPADAPTER_VOID,\n\tIN\tPRT_WLAN_STA  \tpEntry\n);\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\nstatic void\nFindMinimumRSSI(\n\tIN\tPADAPTER\tpAdapter\n);\n\nu8Byte\nPhyDM_Get_Rate_Bitmap_Ex(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tu4Byte\t\tmacid,\n\tIN\tu8Byte\t\tra_mask,\n\tIN\tu1Byte\t\trssi_level,\n\tOUT\t\tu8Byte\t*dm_RA_Mask,\n\tOUT\t\tu1Byte\t*dm_RteID\n);\nu4Byte\nODM_Get_Rate_Bitmap(\n\tIN\tPVOID\t    pDM_VOID,\n\tIN\tu4Byte\t\tmacid,\n\tIN\tu4Byte \t\tra_mask,\n\tIN\tu1Byte \t\trssi_level\n);\nvoid phydm_ra_rssi_rpt_wk(PVOID pContext);\n\n#endif/*#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)*/\n\n#endif/*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/\n\n#endif /*#ifndef\t__ODMRAINFO_H__*/\n\n\n"
  },
  {
    "path": "hal/phydm/phydm_reg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n//============================================================\n// File Name: odm_reg.h\n//\n// Description:\n//\n// This file is for general register definition.\n//\n//\n//============================================================\n#ifndef\t__HAL_ODM_REG_H__\n#define __HAL_ODM_REG_H__\n\n//\n// Register Definition\n//\n\n//MAC REG\n#define\tODM_BB_RESET\t\t\t\t\t0x002\n#define\tODM_DUMMY\t\t\t\t\t\t0x4fe\n#define\tRF_T_METER_OLD\t\t\t\t0x24\n#define\tRF_T_METER_NEW\t\t\t\t0x42\n\n#define\tODM_EDCA_VO_PARAM\t\t\t0x500\n#define\tODM_EDCA_VI_PARAM\t\t\t0x504\n#define\tODM_EDCA_BE_PARAM\t\t\t0x508\n#define\tODM_EDCA_BK_PARAM\t\t\t0x50C\n#define\tODM_TXPAUSE\t\t\t\t\t0x522\n\n//BB REG\n#define\tODM_FPGA_PHY0_PAGE8\t\t\t0x800\n#define\tODM_PSD_SETTING\t\t\t\t0x808\n#define\tODM_AFE_SETTING\t\t\t\t0x818\n#define\tODM_TXAGC_B_6_18\t\t\t\t0x830\n#define\tODM_TXAGC_B_24_54\t\t\t0x834\n#define\tODM_TXAGC_B_MCS32_5\t\t\t0x838\n#define\tODM_TXAGC_B_MCS0_MCS3\t\t0x83c\n#define\tODM_TXAGC_B_MCS4_MCS7\t\t0x848\n#define\tODM_TXAGC_B_MCS8_MCS11\t\t0x84c\n#define\tODM_ANALOG_REGISTER\t\t\t0x85c\n#define\tODM_RF_INTERFACE_OUTPUT\t\t0x860\n#define\tODM_TXAGC_B_MCS12_MCS15\t0x868\n#define\tODM_TXAGC_B_11_A_2_11\t\t0x86c\n#define\tODM_AD_DA_LSB_MASK\t\t\t0x874\n#define\tODM_ENABLE_3_WIRE\t\t\t0x88c\n#define\tODM_PSD_REPORT\t\t\t\t0x8b4\n#define\tODM_R_ANT_SELECT\t\t\t\t0x90c\n#define\tODM_CCK_ANT_SELECT\t\t\t0xa07\n#define\tODM_CCK_PD_THRESH\t\t\t0xa0a\n#define\tODM_CCK_RF_REG1\t\t\t\t0xa11\n#define\tODM_CCK_MATCH_FILTER\t\t\t0xa20\n#define\tODM_CCK_RAKE_MAC\t\t\t\t0xa2e\n#define\tODM_CCK_CNT_RESET\t\t\t0xa2d\n#define\tODM_CCK_TX_DIVERSITY\t\t\t0xa2f\n#define\tODM_CCK_FA_CNT_MSB\t\t\t0xa5b\n#define\tODM_CCK_FA_CNT_LSB\t\t\t0xa5c\n#define\tODM_CCK_NEW_FUNCTION\t\t0xa75\n#define\tODM_OFDM_PHY0_PAGE_C\t\t0xc00\n#define\tODM_OFDM_RX_ANT\t\t\t\t0xc04\n#define\tODM_R_A_RXIQI\t\t\t\t\t0xc14\n#define\tODM_R_A_AGC_CORE1\t\t\t0xc50\n#define\tODM_R_A_AGC_CORE2\t\t\t0xc54\n#define\tODM_R_B_AGC_CORE1\t\t\t0xc58\n#define\tODM_R_AGC_PAR\t\t\t\t\t0xc70\n#define\tODM_R_HTSTF_AGC_PAR\t\t\t0xc7c\n#define\tODM_TX_PWR_TRAINING_A\t\t0xc90\n#define\tODM_TX_PWR_TRAINING_B\t\t0xc98\n#define\tODM_OFDM_FA_CNT1\t\t\t\t0xcf0\n#define\tODM_OFDM_PHY0_PAGE_D\t\t0xd00\n#define\tODM_OFDM_FA_CNT2\t\t\t\t0xda0\n#define\tODM_OFDM_FA_CNT3\t\t\t\t0xda4\n#define\tODM_OFDM_FA_CNT4\t\t\t\t0xda8\n#define\tODM_TXAGC_A_6_18\t\t\t\t0xe00\n#define\tODM_TXAGC_A_24_54\t\t\t0xe04\n#define\tODM_TXAGC_A_1_MCS32\t\t\t0xe08\n#define\tODM_TXAGC_A_MCS0_MCS3\t\t0xe10\n#define\tODM_TXAGC_A_MCS4_MCS7\t\t0xe14\n#define\tODM_TXAGC_A_MCS8_MCS11\t\t0xe18\n#define\tODM_TXAGC_A_MCS12_MCS15\t\t0xe1c\n\n//RF REG\n#define\tODM_GAIN_SETTING\t\t\t\t0x00\n#define\tODM_CHANNEL\t\t\t\t\t0x18\n#define\tODM_RF_T_METER\t\t\t\t0x24\n#define\tODM_RF_T_METER_92D\t\t\t0x42\n#define\tODM_RF_T_METER_88E\t\t\t0x42\n#define\tODM_RF_T_METER_92E\t\t\t0x42\n#define\tODM_RF_T_METER_8812\t\t\t0x42\n\n//Ant Detect Reg\n#define\tODM_DPDT\t\t\t\t\t\t0x300\n\n//PSD Init\n#define\tODM_PSDREG\t\t\t\t\t0x808\n\n//92D Path Div\n#define\tPATHDIV_REG\t\t\t\t\t0xB30\n#define\tPATHDIV_TRI\t\t\t\t\t0xBA0\n\n\n//\n// Bitmap Definition\n//\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP))\n// TX AGC \n#define\t\trTxAGC_A_CCK11_CCK1_JAguar\t0xc20\n#define\t\trTxAGC_A_Ofdm18_Ofdm6_JAguar\t0xc24\n#define\t\trTxAGC_A_Ofdm54_Ofdm24_JAguar\t0xc28\n#define\t\trTxAGC_A_MCS3_MCS0_JAguar\t0xc2c\n#define\t\trTxAGC_A_MCS7_MCS4_JAguar\t0xc30\n#define\t\trTxAGC_A_MCS11_MCS8_JAguar\t0xc34\n#define\t\trTxAGC_A_MCS15_MCS12_JAguar\t0xc38\n#define\t\trTxAGC_A_Nss1Index3_Nss1Index0_JAguar\t0xc3c\n#define\t\trTxAGC_A_Nss1Index7_Nss1Index4_JAguar\t0xc40\n#define\t\trTxAGC_A_Nss2Index1_Nss1Index8_JAguar\t0xc44\n#define\t\trTxAGC_A_Nss2Index5_Nss2Index2_JAguar\t0xc48\n#define\t\trTxAGC_A_Nss2Index9_Nss2Index6_JAguar\t0xc4c\n#if defined(CONFIG_WLAN_HAL_8814AE)\n#define\t\trTxAGC_A_MCS19_MCS16_JAguar\t0xcd8\n#define\t\trTxAGC_A_MCS23_MCS20_JAguar\t0xcdc\n#define\t\trTxAGC_A_Nss3Index3_Nss3Index0_JAguar\t0xce0\n#define\t\trTxAGC_A_Nss3Index7_Nss3Index4_JAguar\t0xce4\n#define\t\trTxAGC_A_Nss3Index9_Nss3Index8_JAguar\t0xce8\n#endif\n#define\t\trTxAGC_B_CCK11_CCK1_JAguar\t0xe20\n#define\t\trTxAGC_B_Ofdm18_Ofdm6_JAguar\t0xe24\n#define\t\trTxAGC_B_Ofdm54_Ofdm24_JAguar\t0xe28\n#define\t\trTxAGC_B_MCS3_MCS0_JAguar\t0xe2c\n#define\t\trTxAGC_B_MCS7_MCS4_JAguar\t0xe30\n#define\t\trTxAGC_B_MCS11_MCS8_JAguar\t0xe34\n#define\t\trTxAGC_B_MCS15_MCS12_JAguar\t0xe38\n#define\t\trTxAGC_B_Nss1Index3_Nss1Index0_JAguar\t0xe3c\n#define\t\trTxAGC_B_Nss1Index7_Nss1Index4_JAguar\t0xe40\n#define\t\trTxAGC_B_Nss2Index1_Nss1Index8_JAguar\t0xe44\n#define\t\trTxAGC_B_Nss2Index5_Nss2Index2_JAguar\t0xe48\n#define\t\trTxAGC_B_Nss2Index9_Nss2Index6_JAguar\t0xe4c\n#if defined(CONFIG_WLAN_HAL_8814AE)\n#define\t\trTxAGC_B_MCS19_MCS16_JAguar\t0xed8\n#define\t\trTxAGC_B_MCS23_MCS20_JAguar\t0xedc\n#define\t\trTxAGC_B_Nss3Index3_Nss3Index0_JAguar\t0xee0\n#define\t\trTxAGC_B_Nss3Index7_Nss3Index4_JAguar\t0xee4\n#define\t\trTxAGC_B_Nss3Index9_Nss3Index8_JAguar\t0xee8\n#define\t\trTxAGC_C_CCK11_CCK1_JAguar\t0x1820\n#define\t\trTxAGC_C_Ofdm18_Ofdm6_JAguar\t0x1824\n#define\t\trTxAGC_C_Ofdm54_Ofdm24_JAguar\t0x1828\n#define\t\trTxAGC_C_MCS3_MCS0_JAguar\t0x182c\n#define\t\trTxAGC_C_MCS7_MCS4_JAguar\t0x1830\n#define\t\trTxAGC_C_MCS11_MCS8_JAguar\t0x1834\n#define\t\trTxAGC_C_MCS15_MCS12_JAguar\t0x1838\n#define\t\trTxAGC_C_Nss1Index3_Nss1Index0_JAguar\t0x183c\n#define\t\trTxAGC_C_Nss1Index7_Nss1Index4_JAguar\t0x1840\n#define\t\trTxAGC_C_Nss2Index1_Nss1Index8_JAguar\t0x1844\n#define\t\trTxAGC_C_Nss2Index5_Nss2Index2_JAguar\t0x1848\n#define\t\trTxAGC_C_Nss2Index9_Nss2Index6_JAguar\t0x184c\n#define\t\trTxAGC_C_MCS19_MCS16_JAguar\t0x18d8\n#define\t\trTxAGC_C_MCS23_MCS20_JAguar\t0x18dc\n#define\t\trTxAGC_C_Nss3Index3_Nss3Index0_JAguar\t0x18e0\n#define\t\trTxAGC_C_Nss3Index7_Nss3Index4_JAguar\t0x18e4\n#define\t\trTxAGC_C_Nss3Index9_Nss3Index8_JAguar\t0x18e8\n#define\t\trTxAGC_D_CCK11_CCK1_JAguar\t0x1a20\n#define\t\trTxAGC_D_Ofdm18_Ofdm6_JAguar\t0x1a24\n#define\t\trTxAGC_D_Ofdm54_Ofdm24_JAguar\t0x1a28\n#define\t\trTxAGC_D_MCS3_MCS0_JAguar\t0x1a2c\n#define\t\trTxAGC_D_MCS7_MCS4_JAguar\t0x1a30\n#define\t\trTxAGC_D_MCS11_MCS8_JAguar\t0x1a34\n#define\t\trTxAGC_D_MCS15_MCS12_JAguar\t0x1a38\n#define\t\trTxAGC_D_Nss1Index3_Nss1Index0_JAguar\t0x1a3c\n#define\t\trTxAGC_D_Nss1Index7_Nss1Index4_JAguar\t0x1a40\n#define\t\trTxAGC_D_Nss2Index1_Nss1Index8_JAguar\t0x1a44\n#define\t\trTxAGC_D_Nss2Index5_Nss2Index2_JAguar\t0x1a48\n#define\t\trTxAGC_D_Nss2Index9_Nss2Index6_JAguar\t0x1a4c\n#define\t\trTxAGC_D_MCS19_MCS16_JAguar\t0x1ad8\n#define\t\trTxAGC_D_MCS23_MCS20_JAguar\t0x1adc\n#define\t\trTxAGC_D_Nss3Index3_Nss3Index0_JAguar\t0x1ae0\n#define\t\trTxAGC_D_Nss3Index7_Nss3Index4_JAguar\t0x1ae4\n#define\t\trTxAGC_D_Nss3Index9_Nss3Index8_JAguar\t0x1ae8\n#endif\n\n#define\t\tbTxAGC_byte0_Jaguar\t0xff\n#define\t\tbTxAGC_byte1_Jaguar\t0xff00\n#define\t\tbTxAGC_byte2_Jaguar\t0xff0000\n#define\t\tbTxAGC_byte3_Jaguar\t0xff000000\n#endif\n\n#define\tBIT_FA_RESET\t\t\t\t\tBIT0\n\n\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_regdefine11ac.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__ODM_REGDEFINE11AC_H__\n#define __ODM_REGDEFINE11AC_H__\n\n//2 RF REG LIST\n\n\n\n//2 BB REG LIST\n//PAGE 8\n#define\tODM_REG_CCK_RPT_FORMAT_11AC\t0x804\n#define\tODM_REG_BB_RX_PATH_11AC\t\t\t0x808\n#define\tODM_REG_BB_TX_PATH_11AC\t\t\t0x80c\n#define\tODM_REG_BB_ATC_11AC\t\t\t\t0x860\n#define\tODM_REG_EDCCA_POWER_CAL\t\t0x8dc\n#define\tODM_REG_DBG_RPT_11AC\t\t\t0x8fc\n//PAGE 9\n#define\tODM_REG_EDCCA_DOWN_OPT\t\t\t0x900\n#define\tODM_REG_ACBB_EDCCA_ENHANCE\t\t0x944\n#define\tODM_REG_OFDM_FA_RST_11AC\t\t0x9A4\n#define\tODM_REG_NHM_TIMER_11AC\t\t\t0x990\n#define\tODM_REG_CLM_TIME_PERIOD_11AC\t0x990\n#define\tODM_REG_NHM_TH9_TH10_11AC\t\t0x994\n#define\tODM_REG_CLM_11AC\t\t\t\t\t0x994\n#define\tODM_REG_NHM_TH3_TO_TH0_11AC\t0x998\n#define\tODM_REG_NHM_TH7_TO_TH4_11AC\t0x99c\n#define\tODM_REG_NHM_TH8_11AC\t\t\t0x9a0\n#define\tODM_REG_NHM_9E8_11AC\t\t\t0x9e8\n#define\tODM_REG_CSI_CONTENT_VALUE\t\t0x9b4\n//PAGE A\n#define\tODM_REG_CCK_CCA_11AC\t\t\t0xA0A\n#define\tODM_REG_CCK_FA_RST_11AC\t\t\t0xA2C\n#define\tODM_REG_CCK_FA_11AC\t\t\t\t0xA5C\n//PAGE B\n#define\tODM_REG_RST_RPT_11AC\t\t\t\t0xB58\n//PAGE C\n#define\tODM_REG_TRMUX_11AC\t\t\t\t0xC08\n#define\tODM_REG_IGI_A_11AC\t\t\t\t0xC50\n//PAGE E\n#define\tODM_REG_IGI_B_11AC\t\t\t\t0xE50\n#define\tODM_REG_TRMUX_11AC_B\t\t\t0xE08\n//PAGE F\n#define\tODM_REG_CCK_CCA_CNT_11AC\t\t0xF08\n#define\tODM_REG_OFDM_FA_11AC\t\t\t0xF48\n#define\tODM_REG_RPT_11AC\t\t\t\t\t0xfa0\n#define\tODM_REG_CLM_RESULT_11AC\t\t\t0xfa4\n#define\tODM_REG_NHM_CNT_11AC\t\t\t0xfa8\n#define ODM_REG_NHM_DUR_READY_11AC      0xfb4\n\n#define\tODM_REG_NHM_CNT7_TO_CNT4_11AC   0xfac\n#define\tODM_REG_NHM_CNT11_TO_CNT8_11AC  0xfb0\n#define\tODM_REG_OFDM_FA_TYPE2_11AC\t\t0xFD0\n//PAGE 18\n#define\tODM_REG_IGI_C_11AC\t\t\t\t0x1850\n//PAGE 1A\n#define\tODM_REG_IGI_D_11AC\t\t\t\t0x1A50\n\n//2 MAC REG LIST\n#define\tODM_REG_RESP_TX_11AC\t\t\t\t0x6D8\n\n\n\n//DIG Related\n#define\tODM_BIT_IGI_11AC\t\t\t\t\t0xFFFFFFFF\n#define\tODM_BIT_CCK_RPT_FORMAT_11AC\t\tBIT16\n#define\tODM_BIT_BB_RX_PATH_11AC\t\t\t0xF\n#define\tODM_BIT_BB_TX_PATH_11AC\t\t\t0xF\n#define\tODM_BIT_BB_ATC_11AC\t\t\t\tBIT14\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_regdefine11n.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef\t__ODM_REGDEFINE11N_H__\n#define __ODM_REGDEFINE11N_H__\n\n\n//2 RF REG LIST\n#define\tODM_REG_RF_MODE_11N\t\t\t\t0x00\n#define\tODM_REG_RF_0B_11N\t\t\t\t0x0B\n#define\tODM_REG_CHNBW_11N\t\t\t\t0x18\n#define\tODM_REG_T_METER_11N\t\t\t\t0x24\n#define\tODM_REG_RF_25_11N\t\t\t\t0x25\n#define\tODM_REG_RF_26_11N\t\t\t\t0x26\n#define\tODM_REG_RF_27_11N\t\t\t\t0x27\n#define\tODM_REG_RF_2B_11N\t\t\t\t0x2B\n#define\tODM_REG_RF_2C_11N\t\t\t\t0x2C\n#define\tODM_REG_RXRF_A3_11N\t\t\t\t0x3C\n#define\tODM_REG_T_METER_92D_11N\t\t\t0x42\n#define\tODM_REG_T_METER_88E_11N\t\t\t0x42\n\n\n\n//2 BB REG LIST\n//PAGE 8\n#define\tODM_REG_BB_CTRL_11N\t\t\t\t0x800\n#define\tODM_REG_RF_PIN_11N\t\t\t\t0x804\n#define\tODM_REG_PSD_CTRL_11N\t\t\t\t0x808\n#define\tODM_REG_TX_ANT_CTRL_11N\t\t\t0x80C\n#define\tODM_REG_BB_PWR_SAV5_11N\t\t\t0x818\n#define\tODM_REG_CCK_RPT_FORMAT_11N\t\t0x824\n#define\tODM_REG_CCK_RPT_FORMAT_11N_B\t0x82C\n#define\tODM_REG_RX_DEFUALT_A_11N\t\t0x858\n#define\tODM_REG_RX_DEFUALT_B_11N\t\t0x85A\n#define\tODM_REG_BB_PWR_SAV3_11N\t\t\t0x85C\n#define\tODM_REG_ANTSEL_CTRL_11N\t\t\t0x860\n#define\tODM_REG_RX_ANT_CTRL_11N\t\t\t0x864\n#define\tODM_REG_PIN_CTRL_11N\t\t\t\t0x870\n#define\tODM_REG_BB_PWR_SAV1_11N\t\t\t0x874\n#define\tODM_REG_ANTSEL_PATH_11N\t\t\t0x878\n#define\tODM_REG_BB_3WIRE_11N\t\t\t0x88C\n#define\tODM_REG_SC_CNT_11N\t\t\t\t0x8C4\n#define\tODM_REG_PSD_DATA_11N\t\t\t\t0x8B4\n#define\tODM_REG_PSD_DATA_11N\t\t\t\t0x8B4\n#define\tODM_REG_NHM_TIMER_11N\t\t\t0x894\n#define\tODM_REG_CLM_TIME_PERIOD_11N\t\t\t0x894\n#define\tODM_REG_NHM_TH9_TH10_11N\t\t0x890\n#define\tODM_REG_CLM_11N\t\t\t\t\t0x890\n#define\tODM_REG_NHM_TH3_TO_TH0_11N\t\t0x898\n#define\tODM_REG_NHM_TH7_TO_TH4_11N\t\t0x89c\n#define ODM_REG_NHM_TH8_11N\t\t\t\t0xe28\n#define\tODM_REG_CLM_READY_11N\t\t\t0x8b4\n#define\tODM_REG_CLM_RESULT_11N\t\t\t0x8d0\n#define\tODM_REG_NHM_CNT_11N\t\t\t\t0x8d8\n\n// For ACS, Jeffery, 2014-12-26\n#define\tODM_REG_NHM_CNT7_TO_CNT4_11N    0x8dc\n#define\tODM_REG_NHM_CNT9_TO_CNT8_11N    0x8d0\n#define\tODM_REG_NHM_CNT10_11N           0x8d4\n\n\n\n//PAGE 9\n#define\tODM_REG_DBG_RPT_11N\t\t\t\t0x908\n#define\tODM_REG_BB_TX_PATH_11N\t\t\t0x90c\n#define\tODM_REG_ANT_MAPPING1_11N\t\t0x914\n#define\tODM_REG_ANT_MAPPING2_11N\t\t0x918\n#define\tODM_REG_EDCCA_DOWN_OPT_11N\t0x948\n\n//PAGE A\n#define\tODM_REG_CCK_ANTDIV_PARA1_11N\t0xA00\n#define\tODM_REG_CCK_CCA_11N\t\t\t\t0xA0A\n#define\tODM_REG_CCK_ANTDIV_PARA2_11N\t0xA0C\n#define\tODM_REG_CCK_ANTDIV_PARA3_11N\t0xA10\n#define\tODM_REG_CCK_ANTDIV_PARA4_11N\t0xA14\n#define\tODM_REG_CCK_FILTER_PARA1_11N\t0xA22\n#define\tODM_REG_CCK_FILTER_PARA2_11N\t0xA23\n#define\tODM_REG_CCK_FILTER_PARA3_11N\t0xA24\n#define\tODM_REG_CCK_FILTER_PARA4_11N\t0xA25\n#define\tODM_REG_CCK_FILTER_PARA5_11N\t0xA26\n#define\tODM_REG_CCK_FILTER_PARA6_11N\t0xA27\n#define\tODM_REG_CCK_FILTER_PARA7_11N\t0xA28\n#define\tODM_REG_CCK_FILTER_PARA8_11N\t0xA29\n#define\tODM_REG_CCK_FA_RST_11N\t\t\t0xA2C\n#define\tODM_REG_CCK_FA_MSB_11N\t\t\t0xA58\n#define\tODM_REG_CCK_FA_LSB_11N\t\t\t0xA5C\n#define\tODM_REG_CCK_CCA_CNT_11N\t\t\t0xA60\n#define\tODM_REG_BB_PWR_SAV4_11N\t\t\t0xA74\n//PAGE B\n#define\tODM_REG_LNA_SWITCH_11N\t\t\t0xB2C\n#define\tODM_REG_PATH_SWITCH_11N\t\t\t0xB30\n#define\tODM_REG_RSSI_CTRL_11N\t\t\t0xB38\n#define\tODM_REG_CONFIG_ANTA_11N\t\t\t0xB68\n#define\tODM_REG_RSSI_BT_11N\t\t\t\t0xB9C\n//PAGE C\n#define\tODM_REG_OFDM_FA_HOLDC_11N\t\t0xC00\n#define\tODM_REG_BB_RX_PATH_11N\t\t\t0xC04\n#define\tODM_REG_TRMUX_11N\t\t\t\t0xC08\n#define\tODM_REG_OFDM_FA_RSTC_11N\t\t0xC0C\n#define\tODM_REG_RXIQI_MATRIX_11N\t\t0xC14\n#define\tODM_REG_TXIQK_MATRIX_LSB1_11N\t0xC4C\n#define\tODM_REG_IGI_A_11N\t\t\t\t0xC50\n#define\tODM_REG_ANTDIV_PARA2_11N\t\t0xC54\n#define\tODM_REG_IGI_B_11N\t\t\t\t\t0xC58\n#define\tODM_REG_ANTDIV_PARA3_11N\t\t0xC5C\n#define   ODM_REG_L1SBD_PD_CH_11N\t\t\t0XC6C\n#define\tODM_REG_BB_PWR_SAV2_11N\t\t0xC70\n#define\tODM_REG_RX_OFF_11N\t\t\t\t0xC7C\n#define\tODM_REG_TXIQK_MATRIXA_11N\t\t0xC80\n#define\tODM_REG_TXIQK_MATRIXB_11N\t\t0xC88\n#define\tODM_REG_TXIQK_MATRIXA_LSB2_11N\t0xC94\n#define\tODM_REG_TXIQK_MATRIXB_LSB2_11N\t0xC9C\n#define\tODM_REG_RXIQK_MATRIX_LSB_11N\t0xCA0\n#define\tODM_REG_ANTDIV_PARA1_11N\t\t0xCA4\n#define\tODM_REG_OFDM_FA_TYPE1_11N\t\t0xCF0\n//PAGE D\n#define\tODM_REG_OFDM_FA_RSTD_11N\t\t0xD00\n#define\tODM_REG_BB_ATC_11N\t\t\t\t0xD2C\n#define\tODM_REG_OFDM_FA_TYPE2_11N\t\t0xDA0\n#define\tODM_REG_OFDM_FA_TYPE3_11N\t\t0xDA4\n#define\tODM_REG_OFDM_FA_TYPE4_11N\t\t0xDA8\n#define\tODM_REG_RPT_11N\t\t\t\t\t0xDF4\n//PAGE E\n#define\tODM_REG_TXAGC_A_6_18_11N\t\t0xE00\n#define\tODM_REG_TXAGC_A_24_54_11N\t\t0xE04\n#define\tODM_REG_TXAGC_A_1_MCS32_11N\t0xE08\n#define\tODM_REG_TXAGC_A_MCS0_3_11N\t\t0xE10\n#define\tODM_REG_TXAGC_A_MCS4_7_11N\t\t0xE14\n#define\tODM_REG_TXAGC_A_MCS8_11_11N\t0xE18\n#define\tODM_REG_TXAGC_A_MCS12_15_11N\t0xE1C\n#define\tODM_REG_EDCCA_DCNF_11N\t\t\t0xE24\n#define\tODM_REG_FPGA0_IQK_11N\t\t\t0xE28\n#define\tODM_REG_TXIQK_TONE_A_11N\t\t0xE30\n#define\tODM_REG_RXIQK_TONE_A_11N\t\t0xE34\n#define\tODM_REG_TXIQK_PI_A_11N\t\t\t0xE38\n#define\tODM_REG_RXIQK_PI_A_11N\t\t\t0xE3C\n#define\tODM_REG_TXIQK_11N\t\t\t\t0xE40\n#define\tODM_REG_RXIQK_11N\t\t\t\t0xE44\n#define\tODM_REG_IQK_AGC_PTS_11N\t\t\t0xE48\n#define\tODM_REG_IQK_AGC_RSP_11N\t\t\t0xE4C\n#define\tODM_REG_BLUETOOTH_11N\t\t\t0xE6C\n#define\tODM_REG_RX_WAIT_CCA_11N\t\t\t0xE70\n#define\tODM_REG_TX_CCK_RFON_11N\t\t\t0xE74\n#define\tODM_REG_TX_CCK_BBON_11N\t\t\t0xE78\n#define\tODM_REG_OFDM_RFON_11N\t\t\t0xE7C\n#define\tODM_REG_OFDM_BBON_11N\t\t\t0xE80\n#define \tODM_REG_TX2RX_11N\t\t\t\t0xE84\n#define\tODM_REG_TX2TX_11N\t\t\t\t0xE88\n#define\tODM_REG_RX_CCK_11N\t\t\t\t0xE8C\n#define\tODM_REG_RX_OFDM_11N\t\t\t\t0xED0\n#define\tODM_REG_RX_WAIT_RIFS_11N\t\t0xED4\n#define\tODM_REG_RX2RX_11N\t\t\t\t0xED8\n#define\tODM_REG_STANDBY_11N\t\t\t\t0xEDC\n#define\tODM_REG_SLEEP_11N\t\t\t\t0xEE0\n#define\tODM_REG_PMPD_ANAEN_11N\t\t\t0xEEC\n#define\tODM_REG_IGI_C_11N\t\t\t\t\t0xF84\n#define\tODM_REG_IGI_D_11N\t\t\t\t\t0xF88\n\n//2 MAC REG LIST\n#define\tODM_REG_BB_RST_11N\t\t\t\t0x02\n#define\tODM_REG_ANTSEL_PIN_11N\t\t\t0x4C\n#define\tODM_REG_EARLY_MODE_11N\t\t\t0x4D0\n#define\tODM_REG_RSSI_MONITOR_11N\t\t0x4FE\n#define\tODM_REG_EDCA_VO_11N\t\t\t\t0x500\n#define\tODM_REG_EDCA_VI_11N\t\t\t\t0x504\n#define\tODM_REG_EDCA_BE_11N\t\t\t\t0x508\n#define\tODM_REG_EDCA_BK_11N\t\t\t\t0x50C\n#define\tODM_REG_TXPAUSE_11N\t\t\t\t0x522\n#define\tODM_REG_RESP_TX_11N\t\t\t\t0x6D8\n#define\tODM_REG_ANT_TRAIN_PARA1_11N\t0x7b0\n#define\tODM_REG_ANT_TRAIN_PARA2_11N\t0x7b4\n\n\n//DIG Related\n#define\tODM_BIT_IGI_11N\t\t\t\t\t0x0000007F\n#define\tODM_BIT_CCK_RPT_FORMAT_11N\t\tBIT9\n#define\tODM_BIT_BB_RX_PATH_11N\t\t\t0xF\n#define\tODM_BIT_BB_TX_PATH_11N\t\t\t0xF\n#define\tODM_BIT_BB_ATC_11N\t\t\t\tBIT11\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/phydm_rxhp.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"phydm_precomp.h\"\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n#define\tAFH_PSD\t\t1\t//0:normal PSD scan, 1: only do 20 pts PSD\n#define\tMODE_40M\t\t0\t//0:20M, 1:40M\n#define\tPSD_TH2\t\t3  \n#define\tPSD_CHMIN\t\t20   // Minimum channel number for BT AFH\n#define\tSIR_STEP_SIZE\t3\n#define   Smooth_Size_1 \t5\n#define\tSmooth_TH_1\t3\n#define   Smooth_Size_2 \t10\n#define\tSmooth_TH_2\t4\n#define   Smooth_Size_3 \t20\n#define\tSmooth_TH_3\t4\n#define   Smooth_Step_Size 5\n#define\tAdaptive_SIR\t1\n#define\tSCAN_INTERVAL\t1500 //ms\n#define\tSYN_Length\t\t5    // for 92D\n\t\n#define\tLNA_Low_Gain_1                      0x64\n#define\tLNA_Low_Gain_2                      0x5A\n#define\tLNA_Low_Gain_3                      0x58\n\n#define\tpw_th_10dB\t\t\t\t\t0x0\n#define\tpw_th_16dB\t\t\t\t\t0x3\n\n#define\tFA_RXHP_TH1                           5000\n#define\tFA_RXHP_TH2                           1500\n#define\tFA_RXHP_TH3                             800\n#define\tFA_RXHP_TH4                             600\n#define\tFA_RXHP_TH5                             500\n\n#define\tIdle_Mode\t\t\t\t\t0\n#define\tHigh_TP_Mode\t\t\t\t1\n#define\tLow_TP_Mode\t\t\t\t2\n\n\nVOID\nodm_PSDMonitorInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\t//HAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t//PSD Monitor Setting\n\t//Which path in ADC/DAC is turnned on for PSD: both I/Q\n\tODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);\n\t//Ageraged number: 8\n\tODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);\n\tpDM_Odm->bPSDinProcess = FALSE;\n\tpDM_Odm->bUserAssignLevel = FALSE;\n\tpDM_Odm->bPSDactive = FALSE;\n\t//pDM_Odm->bDMInitialGainEnable=TRUE;\t\t//change the initialization to DIGinit\n\t//Set Debug Port\n\t//PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);\n\t//PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD\n\t//PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan\n\t//PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval\n\n\t//PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms\n#endif\n}\n\nVOID\nPatchDCTone(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tpu4Byte\t\tPSD_report,\n\tu1Byte \t\tinitial_gain_psd\n)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t//HAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t//PADAPTER\tpAdapter;\n\t\n\tu4Byte\tpsd_report;\n\n\t//2 Switch to CH11 to patch CH9 and CH13 DC tone\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);\n\t\n\tif(pDM_Odm->SupportICType== ODM_RTL8192D)\n\t{\n\t\tif((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);\n\t\t}\n\t}\n\t\n\t//Ch9 DC tone patch\n\tpsd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);\n\tPSD_report[50] = psd_report;\n\t//Ch13 DC tone patch\n\tpsd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);\n\tPSD_report[70] = psd_report;\n\t\n\t//2 Switch to CH3 to patch CH1 and CH5 DC tone\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);\n\n\t\n\tif(pDM_Odm->SupportICType==ODM_RTL8192D)\n\t{\n\t\tif((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);\n\t\t\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);\n\t\t}\n\t}\n\t\n\t//Ch1 DC tone patch\n\tpsd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);\n\tPSD_report[10] = psd_report;\n\t//Ch5 DC tone patch\n\tpsd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);\n\tPSD_report[30] = psd_report;\n\n}\n\n\nVOID\nGoodChannelDecision(\n\tIN\t\tPVOID\t\t\tpDM_VOID,\n\tpu4Byte\t\tPSD_report,\n\tpu1Byte\t\tPSD_bitmap,\n\tu1Byte \t\tRSSI_BT,\n\tpu1Byte\t\tPSD_bitmap_memory)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRXHP_T\t\t\tpRX_HP_Table = &pDM_Odm->DM_RXHP_Table;\n\t//s4Byte\tTH1 =  SSBT-0x15;    // modify TH by Neil Chen\n\ts4Byte\tTH1= RSSI_BT+0x14;\n\ts4Byte\tTH2 = RSSI_BT+85;\n\t//u2Byte    TH3;\n//\ts4Byte\tRegB34;\n\tu1Byte\tbitmap, Smooth_size[3], Smooth_TH[3];\n\t//u1Byte\tpsd_bit;\n\tu4Byte\ti,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];\n\tint \t\tstart_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;\n\t\n//\tRegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;\n\n\tif((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))\n       {\n            TH1 = RSSI_BT + 0x14;  \n\t}\n\n\tSmooth_size[0]=Smooth_Size_1;\n\tSmooth_size[1]=Smooth_Size_2;\n\tSmooth_size[2]=Smooth_Size_3;\n\tSmooth_TH[0]=Smooth_TH_1;\n\tSmooth_TH[1]=Smooth_TH_2;\n\tSmooth_TH[2]=Smooth_TH_3;\n\tSmooth_Interval[0]=16;\n\tSmooth_Interval[1]=15;\n\tSmooth_Interval[2]=13;\n\tgood_cnt = 0;\n\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t{\n\t\t//2 Threshold  \n\n\t\tif(RSSI_BT >=41)\n\t\t\tTH1 = 113;\t\n\t\telse if(RSSI_BT >=38)   // >= -15dBm\n\t\t\tTH1 = 105;                              //0x69\n\t\telse if((RSSI_BT >=33)&(RSSI_BT <38))\n\t\t\tTH1 = 99+(RSSI_BT-33);         //0x63\n\t\telse if((RSSI_BT >=26)&(RSSI_BT<33))\n\t\t\tTH1 = 99-(33-RSSI_BT)+2;     //0x5e\n\t \telse if((RSSI_BT >=24)&(RSSI_BT<26))\n\t\t\tTH1 = 88-((RSSI_BT-24)*3);   //0x58\n\t\telse if((RSSI_BT >=18)&(RSSI_BT<24))\n\t\t\tTH1 = 77+((RSSI_BT-18)*2);\n\t\telse if((RSSI_BT >=14)&(RSSI_BT<18))\n\t\t\tTH1 = 63+((RSSI_BT-14)*2);\n\t\telse if((RSSI_BT >=8)&(RSSI_BT<14))\n\t\t\tTH1 = 58+((RSSI_BT-8)*2);\n\t\telse if((RSSI_BT >=3)&(RSSI_BT<8))\n\t\t\tTH1 = 52+(RSSI_BT-3);\n\t\telse\n\t\t\tTH1 = 51;\n\t}\n\n\tfor (i = 0; i< 10; i++)\n\t\tPSD_bitmap[i] = 0;\n\t\n\n\t // Add By Gary\n       for (i=0; i<80; i++)\n\t   \tpRX_HP_Table->PSD_bitmap_RXHP[i] = 0;\n\t// End\n\n\n\n\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t{\n\t\tTH1 =TH1-SIR_STEP_SIZE;\n\t}\n\twhile (good_cnt < PSD_CHMIN)\n\t{\n\t\tgood_cnt = 0;\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t\t{\n\t\tif(TH1 ==TH2)\n\t\t\tbreak;\n\t\tif((TH1+SIR_STEP_SIZE) < TH2)\n\t\t\tTH1 += SIR_STEP_SIZE;\n\t\telse\n\t\t\tTH1 = TH2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(TH1==(RSSI_BT+0x1E))\n             \t\t     break;    \n   \t\t\tif((TH1+2) < (RSSI_BT+0x1E))\n\t\t\t\tTH1+=3;\n\t\t     \telse\n\t\t\t\tTH1 = RSSI_BT+0x1E;\t\n             \n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,(\"PSD: decision threshold is: %d\", TH1));\n\t\t\t \n\t\tfor (i = 0; i< 80; i++)\n\t\t{\n\t\t\tif((s4Byte)(PSD_report[i]) < TH1)\n\t\t\t{\n\t\t\t\tbyte_idx = i / 8;\n\t\t\t\tbit_idx = i -8*byte_idx;\n\t\t\t\tbitmap = PSD_bitmap[byte_idx];\n\t\t\t\tPSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);\n\t\t\t}\n\t\t}\n\n#if DBG\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: before smoothing\\n\"));\n\t\tfor(n=0;n<10;n++)\n\t\t{\n\t\t\t//DbgPrint(\"PSD_bitmap[%u]=%x\\n\", n, PSD_bitmap[n]);\n\t\t\tfor (i = 0; i<8; i++)\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD_bitmap[%u] =   %d\\n\", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));\n\t\t}\n#endif\n\t\n\t\t//1 Start of smoothing function\n\n\t\tfor (j=0;j<3;j++)\n\t\t{\n\t\t\tstart_byte_idx=0;\n\t\t\tstart_bit_idx=0;\n\t\t\tfor(n=0; n<Smooth_Interval[j]; n++)\n\t\t\t{\n\t\t\t\tgood_cnt_smoothing = 0;\n\t\t\t\tcur_bit_idx = start_bit_idx;\n\t\t\t\tcur_byte_idx = start_byte_idx;\n\t\t\t\tfor ( i=0; i < Smooth_size[j]; i++)\n\t\t\t\t{\n\t\t\t\t\tNOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;\n\t\t\t\t\tif ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)\n\t\t\t\t\t\tgood_cnt_smoothing++;\n\n\t\t\t\t}\n\n\t\t\t\tif( good_cnt_smoothing < Smooth_TH[j] )\n\t\t\t\t{\n\t\t\t\t\tcur_bit_idx = start_bit_idx;\n\t\t\t\t\tcur_byte_idx = start_byte_idx;\n\t\t\t\t\tfor ( i=0; i< Smooth_size[j] ; i++)\n\t\t\t\t\t{\t\n\t\t\t\t\t\tNOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;\t\t\t\t\n\t\t\t\t\t\tPSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstart_bit_idx =  start_bit_idx + Smooth_Step_Size;\n\t\t\t\twhile ( (start_bit_idx)  > 7 )\n\t\t\t\t{\n\t\t\t\t\tstart_byte_idx= start_byte_idx+start_bit_idx/8;\n\t\t\t\t\tstart_bit_idx = start_bit_idx%8;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tODM_RT_TRACE(\tpDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: after %u smoothing\", j+1));\n\t\t\tfor(n=0;n<10;n++)\n\t\t\t{\n\t\t\t\tfor (i = 0; i<8; i++)\n\t\t\t\t{\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD_bitmap[%u] =   %d\\n\", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));\n\t\t\t\t\t\n\t\t\t\t\tif ( ((PSD_bitmap[n]&BIT(i))>>i) ==1)  //----- Add By Gary\n\t\t\t\t\t{\n\t                                   pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;\n\t\t\t\t\t}                                                  // ------end by Gary\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\n\t\tgood_cnt = 0;\n\t\tfor ( i = 0; i < 10; i++)\n\t\t{\n\t\t\tfor (n = 0; n < 8; n++)\n\t\t\t\tif((PSD_bitmap[i]& BIT(n)) != 0)\n\t\t\t\t\tgood_cnt++;\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, ODM_COMP_PSD,(\"PSD: good channel cnt = %u\",good_cnt));\n\t}\n\n\t//RT_TRACE(ODM_COMP_PSD, DBG_LOUD,(\"PSD: SSBT=%d, TH2=%d, TH1=%d\",SSBT,TH2,TH1));\n\tfor (i = 0; i <10; i++)\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: PSD_bitmap[%u]=%x\",i,PSD_bitmap[i]));\n/*\t\n\t//Update bitmap memory\n\tfor(i = 0; i < 80; i++)\n\t{\n\t\tbyte_idx = i / 8;\n\t\tbit_idx = i -8*byte_idx;\n\t\tpsd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;\n\t\tbitmap = PSD_bitmap_memory[i]; \n\t\tPSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;\n\t}\n*/\n}\n\n\n\nVOID\nodm_PSD_Monitor(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t//HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t//PDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tunsigned int \t\tpts, start_point, stop_point;\n\tu1Byte\t\t\tinitial_gain ;\n\tstatic u1Byte\t\tPSD_bitmap_memory[80], init_memory = 0;\n\tstatic u1Byte \t\tpsd_cnt=0;\n\tstatic u4Byte\t\tPSD_report[80], PSD_report_tmp;\n\tstatic u8Byte\t\tlastTxOkCnt=0, lastRxOkCnt=0;\n\tu1Byte \t\t\tH2C_PSD_DATA[5]={0,0,0,0,0};\n\tstatic u1Byte\t\tH2C_PSD_DATA_last[5] ={0,0,0,0,0};\n\tu1Byte\t\t\tidx[20]={96,99,102,106,109,112,115,118,122,125,\n\t\t\t\t\t0,3,6,10,13,16,19,22,26,29};\n\tu1Byte\t\t\tn, i, channel, BBReset,tone_idx;\n\tu1Byte\t\t\tPSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;\n\ts4Byte    \t\t\tPSD_skip_start, PSD_skip_stop;\n\tu4Byte\t\t\tCurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;\n\tu4Byte\t\t\tReScan, Interval, Is40MHz;\n\tu8Byte\t\t\tcurTxOkCnt, curRxOkCnt;\n\tint \t\t\t\tcur_byte_idx, cur_bit_idx;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tPMGNT_INFO      \tpMgntInfo = &Adapter->MgntInfo;\n\t\n\n\tif(*pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep)\n \t{\n  \t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"pbDriverIsGoingToPnpSetPowerSleep!!!!!!!!!!!!!!!\\n\"));\n  \t\treturn;\n \t}\n\n\t\n\tif( (*(pDM_Odm->pbScanInProcess)) ||\n\t\tpDM_Odm->bLinkInProcess)\n\t{\n\t\tif((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))\n\t\t{\n\t\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms\t\n\t\t\t//psd_cnt=0;\n\t\t}\n\t\treturn;\n\t}\n\n\tif(pDM_Odm->bBtHsOperation)\n\t{\n\t\tReScan = 1;\n\t\tInterval = SCAN_INTERVAL;\n\t}\n\telse\n\t{\n\tReScan = PSD_RESCAN;\n\tInterval = SCAN_INTERVAL;\n\t}\n\n\t//1 Initialization\n\tif(init_memory == 0)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"Init memory\\n\"));\n\t\tfor(i = 0; i < 80; i++)\n\t\t\tPSD_bitmap_memory[i] = 0xFF; // channel is always good\n\t\tinit_memory = 1;\n\t}\n\tif(psd_cnt == 0)\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"Enter dm_PSD_Monitor\\n\"));\n\t\tfor(i = 0; i < 80; i++)\n\t\t\tPSD_report[i] = 0;\n\t}\n\n\t//1 Backup Current Settings\n\tCurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n/*\n\tif(pDM_Odm->SupportICType==ODM_RTL8192D)\n\t{\n\t\t//2 Record Current synthesizer parameters based on current channel\n\t\tif((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))\n\t\t{\n\t\t\tSYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);\n\t\t\tSYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);\n\t\t\tSYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);\n\t\t\tSYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);\n\t\t\tSYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);\n       \t}\n\t\telse     // DualMAC_DualPHY 2G\n\t\t{\n\t\t\tSYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);\n\t\t\tSYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);\n\t\t\tSYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);\n\t\t\tSYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);\n\t\t\tSYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);\n\t\t}\n\t}\n*/\n\t//RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);\n\tRXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);\n\n\t//RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;\n\tRxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;\n\n\t//2???\n\tif(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))\n\t\tIs40MHz = TRUE;\n\telse\n\t\tIs40MHz = FALSE;\n\n\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_PSD, DBG_LOUD,(\"PSD Scan Start\\n\"));\n\t//1 Turn off CCK\n\t//PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);\n\t//1 Turn off TX\n\t//Pause TX Queue\n\t//PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);\n\tODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);\n\t\n\t//Force RX to stop TX immediately\n\t//PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);\n\t//1 Turn off RX\n\t//Rx AGC off  RegC70[0]=0, RegC7C[20]=0\n\t//PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);\n\t//PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);\n\n\tODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);\n\n\t\n\t//Turn off CCA\n\t//PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);\n\t\n\t//BB Reset\n\t//BBReset = PlatformEFIORead1Byte(Adapter, 0x02);\n\tBBReset = ODM_Read1Byte(pDM_Odm, 0x02);\n\t\n\t//PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));\n\t//PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);\n\tODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess \n\tODM_Write1Byte(pDM_Odm,  0x02, BBReset&(~BIT0));\n\tODM_Write1Byte(pDM_Odm,  0x02, BBReset|BIT0);\n\tODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);\n\t\n\t//1 Leave RX idle low power\n\t//PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);\n\n\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);\n\t//1 Fix initial gain\n\t//if (IS_HARDWARE_TYPE_8723AE(Adapter))\n\t//RSSI_BT = pHalData->RSSI_BT;\n       //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))      // Add by Gary\n       //    RSSI_BT = RSSI_BT_new;\n\n\tif((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))\n\tRSSI_BT=pDM_Odm->RSSI_BT;\t\t//need to check C2H to pDM_Odm RSSI BT\n\n\tif(RSSI_BT>=47)\n\t\tRSSI_BT=47;\n\t   \n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: RSSI_BT= %d\\n\", RSSI_BT));\n\t\n\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t{\n\t       //Neil add--2011--10--12\n\t\t//2 Initial Gain index \n\t\tif(RSSI_BT >=35)   // >= -15dBm\n\t\t\tinitial_gain_psd = RSSI_BT*2;\n\t\telse if((RSSI_BT >=33)&(RSSI_BT<35))\n\t\t\tinitial_gain_psd = RSSI_BT*2+6;\n\t\telse if((RSSI_BT >=24)&(RSSI_BT<33))\n\t\t\tinitial_gain_psd = 70-(33-RSSI_BT);\n\t \telse if((RSSI_BT >=19)&(RSSI_BT<24))\n\t\t\tinitial_gain_psd = 64-((24-RSSI_BT)*4);\n\t\telse if((RSSI_BT >=14)&(RSSI_BT<19))\n\t\t\tinitial_gain_psd = 44-((18-RSSI_BT)*2);\n\t\telse if((RSSI_BT >=8)&(RSSI_BT<14))\n\t\t\tinitial_gain_psd = 35-(14-RSSI_BT);\n\t\telse\n\t\t\tinitial_gain_psd = 0x1B;\n\t}\n\telse\n\t{\n\t\n\t\t//need to do\t\n         \tinitial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI\n           \t//}  \t\n\t}\n\t//if(RSSI_BT<0x17)\n\t//\tRSSI_BT +=3;\n\t//DbgPrint(\"PSD: RSSI_BT= %d\\n\", RSSI_BT);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: RSSI_BT= %d\\n\", RSSI_BT));\n\n\t//initialGainUpper = 0x5E;  //Modify by neil chen\n\t\n\tif(pDM_Odm->bUserAssignLevel)\n\t{\n\t\tpDM_Odm->bUserAssignLevel = FALSE;\n\t\tinitialGainUpper = 0x7f;\n\t}\n\telse\n\t{\n\t\tinitialGainUpper = 0x5E;\n\t}\n\t\n\t/*\n\tif (initial_gain_psd < 0x1a)\n\t\tinitial_gain_psd = 0x1a;\n\tif (initial_gain_psd > initialGainUpper)\n\t\tinitial_gain_psd = initialGainUpper;\n\t*/\n\n\t//if(pDM_Odm->SupportICType==ODM_RTL8723A)\n\tSSBT = RSSI_BT  * 2 +0x3E;\n\t\n\t\n\t//if(IS_HARDWARE_TYPE_8723AE(Adapter))\n\t//\tSSBT = RSSI_BT  * 2 +0x3E;\n\t//else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter)))   // Add by Gary\n\t//{\n\t//\tRSSI_BT = initial_gain_psd;\n\t//\tSSBT = RSSI_BT;\n\t//}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: SSBT= %d\\n\", SSBT));\n\tODM_RT_TRACE(\tpDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD: initial gain= 0x%x\\n\", initial_gain_psd));\n\t//DbgPrint(\"PSD: SSBT= %d\", SSBT);\n\t//need to do\n\tpDM_Odm->bDMInitialGainEnable = FALSE;\n\tinitial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);\n\t\n        // make sure the initial gain is under the correct range.\n\t//initial_gain_psd &= 0x7f;\n\tODM_Write_DIG(pDM_Odm, initial_gain_psd);\n\t//1 Turn off 3-wire\n\tODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);\n\n\t//pts value = 128, 256, 512, 1024\n\tpts = 128;\n\n\tif(pts == 128)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);\n\t\tstart_point = 64;\n\t\tstop_point = 192;\n\t}\n\telse if(pts == 256)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);\n\t\tstart_point = 128;\n\t\tstop_point = 384;\n\t}\n\telse if(pts == 512)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);\n\t\tstart_point = 256;\n\t\tstop_point = 768;\n\t}\n\telse\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);\n\t\tstart_point = 512;\n\t\tstop_point = 1536;\n\t}\n\t\n\n//3 Skip WLAN channels if WLAN busy\n\n\tcurTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;\n\tcurRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;\n\tlastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);\n\tlastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);\t\n\n\tPSD_skip_start=80;\n\tPSD_skip_stop = 0;\n\twlan_channel = CurrentChannel & 0x0f;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,(\"PSD: current channel: %x, BW:%d \\n\", wlan_channel, Is40MHz));\n\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t{\n\t\tif(pDM_Odm->bBtHsOperation)\n\t\t{\n\t\t\tif(pDM_Odm->bLinked)\n\t\t\t{\n\t\t\t\tif(Is40MHz)\n\t\t\t\t{\n\t\t\t\t\tPSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask\n\t\t\t\t\tPSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask\n\t\t\t\t\tPSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; \n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// mask for 40MHz\n\t\t\t\tPSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask\n\t\t\t\tPSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;\n\t\t\t}\n\t\t\tif(PSD_skip_start < 0)\n\t\t\t\tPSD_skip_start = 0;\n\t\t\tif(PSD_skip_stop >80)\n\t\t\t\tPSD_skip_stop = 80;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif((curRxOkCnt+curTxOkCnt) > 5)\n\t\t\t{\n\t\t\t\tif(Is40MHz)\n\t\t\t\t{\n\t\t\t\t\tPSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2;  // Modify by Neil to add 10 chs to mask\n\t\t\t\t\tPSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tPSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10;  // Modify by Neil to add 10 chs to mask\n\t\t\t\t\tPSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18; \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(PSD_skip_start < 0)\n\t\t\t\t\tPSD_skip_start = 0;\n\t\t\t\tif(PSD_skip_stop >80)\n\t\t\t\t\tPSD_skip_stop = 80;\n\t\t\t}\n\t\t}\n\t}\n#if 0\t\n\telse\n\t{\n\t\tif((curRxOkCnt+curTxOkCnt) > 1000)\n\t\t{\n\t\t\tPSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;\n\t\t\tPSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;\n\t\t}\n\t}   \n#endif  //Reove RXHP Issue\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,(\"PSD: Skip tone from %d to %d \\n\", PSD_skip_start, PSD_skip_stop));\n\n \tfor (n=0;n<80;n++)\n \t{\n \t\tif((n%20)==0)\n \t\t{\n\t\t\tchannel = (n/20)*4 + 1;\n\t\t\t\t\t\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);\n\t\t\t\t}\n\t\ttone_idx = n%20;\n\t\tif ((n>=PSD_skip_start) && (n<PSD_skip_stop))\n\t\t{\t\n\t\t\tPSD_report[n] = SSBT;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,(\"PSD:Tone %d skipped \\n\", n));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);\n\n\t\t\tif ( PSD_report_tmp > PSD_report[n])\n\t\t\t\tPSD_report[n] = PSD_report_tmp;\n\t\t\t\t\n\t\t}\n\t}\n\n\tPatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);\n      \n       //----end\n\t//1 Turn on RX\n\t//Rx AGC on\n\tODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);\n\tODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);\n\t//CCK on\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);\n\t//1 Turn on TX\n\t//Resume TX Queue\n\t\n\tODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);\n\t//Turn on 3-wire\n\tODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);\n\t//1 Restore Current Settings\n\t//Resume DIG\n\tpDM_Odm->bDMInitialGainEnable = TRUE;\n\t\n\tODM_Write_DIG(pDM_Odm, initial_gain);\n\n\t// restore originl center frequency\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);\n\n\t//Turn on CCA\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);\n\t//Restore RX idle low power\n\tif(RxIdleLowPwr == TRUE)\n\t\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);\n\t\n\tpsd_cnt++;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD:psd_cnt = %d \\n\",psd_cnt));\n\tif (psd_cnt < ReScan)\n\t\tODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);\t\t\n\telse\n\t{\n\t\tpsd_cnt = 0;\n\t\tfor(i=0;i<80;i++)\n\t\t\t//DbgPrint(\"psd_report[%d]=     %d \\n\", 2402+i, PSD_report[i]);\n\t\t\tRT_TRACE(\tODM_COMP_PSD, DBG_LOUD,(\"psd_report[%d]=     %d \\n\", 2402+i, PSD_report[i]));\n\n\n\t\tGoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);\n\n\t\tif(pDM_Odm->SupportICType==ODM_RTL8723A)\n\t\t{\n\t\t\tcur_byte_idx=0;\n\t\t\tcur_bit_idx=0;\n\n\t\t\t//2 Restore H2C PSD Data to Last Data\n\t\t  \tH2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];\n\t\t\tH2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];\n\t\t\tH2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];\n\t\t\tH2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];\n\t\t\tH2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];\n\n\t\n\t\t\t//2 Translate 80bit channel map to 40bit channel\t\n\t\t\tfor ( i=0;i<5;i++)\n\t\t\t{\n\t\t\t\tfor(n=0;n<8;n++)\n\t\t\t\t{\n\t\t\t\t\tcur_byte_idx = i*2 + n/4;\n\t\t\t\t\tcur_bit_idx = (n%4)*2;\n\t\t\t\t\tif ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))\n\t\t\t\t\t\tH2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);\n\t\t\t\t}\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"H2C_PSD_DATA[%d]=0x%x\\n\" ,i, H2C_PSD_DATA[i]));\n\t\t\t}\n\t\n\t\t\t//3 To Compare the difference\n\t\t\tfor ( i=0;i<5;i++)\n\t\t\t{\n\t\t\t\tif(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])\n\t\t\t\t{\n\t\t\t\t\tFillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,(\"Need to Update the AFH Map \\n\"));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(i==5)\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"Not need to Update\\n\"));\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(pDM_Odm->bBtHsOperation)\n\t\t\t{\n\t\t\t\tODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);\n\t\t\t\tODM_RT_TRACE(\tpDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"Leave dm_PSD_Monitor\\n\"));\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);\n\t\t\t\tODM_RT_TRACE(\tpDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"Leave dm_PSD_Monitor\\n\"));\t\t\n\t\t}\n\t}\n    }\n}\n/*\n//Neil for Get BT RSSI\n// Be Triggered by BT C2H CMD\nVOID\nODM_PSDGetRSSI(\n\tIN\tu1Byte\tRSSI_BT)\n{\n\n\n}\n\n*/\n\nVOID\nODM_PSDMonitor(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t//HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\t//if(IS_HARDWARE_TYPE_8723AE(Adapter))\n\t\n\tif(pDM_Odm->SupportICType == ODM_RTL8723A)   //may need to add other IC type\n\t{\n\t\tif(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)\n\t\t{\n\t\t\tif(!pDM_Odm->bBtEnabled) //need to check upper layer connection\n\t\t\t{\n\t\t\t\tpDM_Odm->bPSDactive=FALSE;\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, (\"odm_PSDMonitor, return for BT is disabled!!!\\n\"));\n\t\t   \t\treturn; \n\t\t\t}\n\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, (\"odm_PSDMonitor\\n\"));\n\t\t//{\n\t\t\tpDM_Odm->bPSDinProcess = TRUE;\n\t \t\tpDM_Odm->bPSDactive=TRUE;\n\t\t\todm_PSD_Monitor(pDM_Odm);\n\t\t\tpDM_Odm->bPSDinProcess = FALSE;\n\t\t}\t\n\t}\t\n\n}\nVOID\nodm_PSDMonitorCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n       HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);\n}\n\nVOID\nodm_PSDMonitorWorkItemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tODM_PSDMonitor(pDM_Odm);\n}\n\n\n //cosa debug tool need to modify\n\nVOID\nODM_PSDDbgControl(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu4Byte\t\tmode,\n\tIN\tu4Byte\t\tbtRssi\n\t)\n{\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, (\" Monitor mode=%d, btRssi=%d\\n\", mode, btRssi));\n\tif(mode)\n\t{\n\t\tpDM_Odm->RSSI_BT = (u1Byte)btRssi;\n\t\tpDM_Odm->bUserAssignLevel = TRUE;\n\t\tODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms\t\t\n\t}\n\telse\n\t{\n\t\tODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);\n\t}\n#endif\n}\n\n\n//#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)\n\nvoid\todm_RXHPInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID)\n{\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRXHP_T\t\t\tpRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\n   \tu1Byte\t\t\tindex;\n\n\tpRX_HP_Table->RXHP_enable = TRUE;\n\tpRX_HP_Table->RXHP_flag = 0;\n\tpRX_HP_Table->PSD_func_trigger = 0;\n\tpRX_HP_Table->Pre_IGI = 0x20;\n\tpRX_HP_Table->Cur_IGI = 0x20;\n\tpRX_HP_Table->Cur_pw_th = pw_th_10dB;\n\tpRX_HP_Table->Pre_pw_th = pw_th_10dB;\n\tfor(index=0; index<80; index++)\n\t\tpRX_HP_Table->PSD_bitmap_RXHP[index] = 1;\n\n#if(DEV_BUS_TYPE == RT_USB_INTERFACE)\n\tpRX_HP_Table->TP_Mode = Idle_Mode;\n#endif\n#endif\n}\n\nVOID\nodm_PSD_RXHP(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRXHP_T\t\t\tpRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\n\tPADAPTER\t\tAdapter =  pDM_Odm->Adapter;\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tunsigned int \t\tpts, start_point, stop_point, initial_gain ;\n\tstatic u1Byte\t\tPSD_bitmap_memory[80], init_memory = 0;\n\tstatic u1Byte \t\tpsd_cnt=0;\n\tstatic u4Byte\t\tPSD_report[80], PSD_report_tmp;\n\tstatic u8Byte\t\tlastTxOkCnt=0, lastRxOkCnt=0;\n\tu1Byte\t\t\tidx[20]={96,99,102,106,109,112,115,118,122,125,\n\t\t\t\t\t0,3,6,10,13,16,19,22,26,29};\n\tu1Byte\t\t\tn, i, channel, BBReset,tone_idx;\n\tu1Byte\t\t\tPSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;\n\ts4Byte    \t\t\tPSD_skip_start, PSD_skip_stop;\n\tu4Byte\t\t\tCurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;\n\tu4Byte\t\t\tReScan, Interval, Is40MHz;\n\tu8Byte\t\t\tcurTxOkCnt, curRxOkCnt;\n\t//--------------2G band synthesizer for 92D switch RF channel using----------------- \n\tu1Byte\t\t\tgroup_idx=0;\n\tu4Byte\t\t\tSYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;\n\tu4Byte\t\t\tSYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C};    // synthesizer RF register for 2G channel\n\tu4Byte\t\t\tSYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},     // For CH1,2,4,9,10.11.12   {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}\n\t\t\t\t\t\t\t\t\t    {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},     // For CH3,13,14\n\t\t\t\t\t\t\t\t\t    {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}};   // For Ch5,6,7,8\n       //--------------------- Add by Gary for Debug setting ----------------------\n  \tu1Byte                 RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);\n       u1Byte                 rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);\n       //---------------------------------------------------------------------\n\t\n\tif(pMgntInfo->bScanInProgress)\n\t{\n\t\treturn;\n\t}\n\n\tReScan = PSD_RESCAN;\n\tInterval = SCAN_INTERVAL;\n\n\n\t//1 Initialization\n\tif(init_memory == 0)\n\t{\n\t\tRT_TRACE(\tODM_COMP_PSD, DBG_LOUD,(\"Init memory\\n\"));\n\t\tfor(i = 0; i < 80; i++)\n\t\t\tPSD_bitmap_memory[i] = 0xFF; // channel is always good\n\t\tinit_memory = 1;\n\t}\n\tif(psd_cnt == 0)\n\t{\n\t\tRT_TRACE(ODM_COMP_PSD, DBG_LOUD,(\"Enter dm_PSD_Monitor\\n\"));\n\t\tfor(i = 0; i < 80; i++)\n\t\t\tPSD_report[i] = 0;\n\t}\n\n\t//1 Backup Current Settings\n\tCurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\t//2 Record Current synthesizer parameters based on current channel\n\t\tif((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))\n\t\t{\n\t\t\tSYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);\n\t\t\tSYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);\n\t\t\tSYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);\n\t\t\tSYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);\n\t\t\tSYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);\n       \t}\n\t\telse     // DualMAC_DualPHY 2G\n\t\t{\n\t\t\tSYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);\n\t\t\tSYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);\n\t\t\tSYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);\n\t\t\tSYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);\n\t\t\tSYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);\n\t\t}\n\t}\n\tRXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);\n\tRxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;\n\tIs40MHz = *(pDM_Odm->pBandWidth);\n\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_PSD, DBG_LOUD,(\"PSD Scan Start\\n\"));\n\t//1 Turn off CCK\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);\n\t//1 Turn off TX\n\t//Pause TX Queue\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);\n\t//Force RX to stop TX immediately\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);\n\t//1 Turn off RX\n\t//Rx AGC off  RegC70[0]=0, RegC7C[20]=0\n\tODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);\n\tODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);\n\t//Turn off CCA\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);\n\t//BB Reset\n\tODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess \n\tBBReset = ODM_Read1Byte(pDM_Odm, 0x02);\n\tODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));\n\tODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);\n\tODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);\n\t//1 Leave RX idle low power\n\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);\n\t//1 Fix initial gain\n      \tRSSI_BT = RSSI_BT_new;\n\tRT_TRACE(ODM_COMP_PSD, DBG_LOUD,(\"PSD: RSSI_BT= %d\\n\", RSSI_BT));\n\t\n\tif(rssi_ctrl == 1)        // just for debug!!\n\t\tinitial_gain_psd = RSSI_BT_new; \n     \telse\n\t\tinitial_gain_psd = pDM_Odm->RSSI_Min;    // PSD report based on RSSI\n\t\n\tRT_TRACE(ODM_COMP_PSD, DBG_LOUD,(\"PSD: RSSI_BT= %d\\n\", RSSI_BT));\n\t\n\tinitialGainUpper = 0x54;\n\t\n\tRSSI_BT = initial_gain_psd;\n\t//SSBT = RSSI_BT;\n\t\n\t//RT_TRACE(\tODM_COMP_PSD, DBG_LOUD,(\"PSD: SSBT= %d\\n\", SSBT));\n\tRT_TRACE(\tODM_COMP_PSD, DBG_LOUD,(\"PSD: initial gain= 0x%x\\n\", initial_gain_psd));\n\t\n\tpDM_Odm->bDMInitialGainEnable = FALSE;\t\t\n\tinitial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;\n\t//ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);\t\n\tODM_Write_DIG(pDM_Odm, initial_gain_psd);\n\t//1 Turn off 3-wire\n\tODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);\n\n\t//pts value = 128, 256, 512, 1024\n\tpts = 128;\n\n\tif(pts == 128)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);\n\t\tstart_point = 64;\n\t\tstop_point = 192;\n\t}\n\telse if(pts == 256)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);\n\t\tstart_point = 128;\n\t\tstop_point = 384;\n\t}\n\telse if(pts == 512)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);\n\t\tstart_point = 256;\n\t\tstop_point = 768;\n\t}\n\telse\n\t{\n\t\tODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);\n\t\tstart_point = 512;\n\t\tstop_point = 1536;\n\t}\n\t\n\n//3 Skip WLAN channels if WLAN busy\n\tcurTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;\n\tcurRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;\n\tlastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);\n\tlastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);\n\t\n\tPSD_skip_start=80;\n\tPSD_skip_stop = 0;\n\twlan_channel = CurrentChannel & 0x0f;\n\n\tRT_TRACE(ODM_COMP_PSD,DBG_LOUD,(\"PSD: current channel: %x, BW:%d \\n\", wlan_channel, Is40MHz));\n\t\n\tif((curRxOkCnt+curTxOkCnt) > 1000)\n\t{\n\t\tPSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;\n\t\tPSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;\n\t}\n\n\tRT_TRACE(ODM_COMP_PSD,DBG_LOUD,(\"PSD: Skip tone from %d to %d \\n\", PSD_skip_start, PSD_skip_stop));\n\n \tfor (n=0;n<80;n++)\n \t{\n \t\tif((n%20)==0)\n \t\t{\n\t\t\tchannel = (n/20)*4 + 1;\n\t\t\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t\t\t{\n\t\t\t\tswitch(channel)\n\t\t\t\t{\n\t\t\t\t\tcase 1: \n\t\t\t\t\tcase 9:\n\t\t\t\t\t\tgroup_idx = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tgroup_idx = 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 13:\n\t\t\t\t \t\tgroup_idx = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))   \n\t\t{\n\t\t\t\t\tfor(i = 0; i < SYN_Length; i++)\n\t\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);\n\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);\n\t\t\t\t}\n\t\t\t\telse  // DualMAC_DualPHY 2G\n\t\t\t{\n\t\t\t\t\tfor(i = 0; i < SYN_Length; i++)\n\t\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);   \n\t\t\t\t\t\n\t\t\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);\n\t\t\t}\t\n\t\ttone_idx = n%20;\n\t\tif ((n>=PSD_skip_start) && (n<PSD_skip_stop))\n\t\t{\t\n\t\t\tPSD_report[n] = initial_gain_psd;//SSBT;\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,(\"PSD:Tone %d skipped \\n\", n));\n\t\t}\n\t\telse\n\t\t{\n\t\t\tPSD_report_tmp =  GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);\n\n\t\t\tif ( PSD_report_tmp > PSD_report[n])\n\t\t\t\tPSD_report[n] = PSD_report_tmp;\n\t\t\t\t\n\t\t}\n\t}\n\n\tPatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);\n      \n       //----end\n\t//1 Turn on RX\n\t//Rx AGC on\n\tODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);\n\tODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);\n\t//CCK on\n\tODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);\n\t//1 Turn on TX\n\t//Resume TX Queue\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);\n\t//Turn on 3-wire\n\tODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);\n\t//1 Restore Current Settings\n\t//Resume DIG\n\tpDM_Odm->bDMInitialGainEnable= TRUE;\n\t//ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);\n\tODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);\n\t// restore originl center frequency\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);\n\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\tif((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);\n\t\t}\n\t\telse     // DualMAC_DualPHY\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);\n\t\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);\n\t\t}\n\t}\n\t//Turn on CCA\n\tODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);\n\t//Restore RX idle low power\n\tif(RxIdleLowPwr == TRUE)\n\t\tODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);\n\t\n\tpsd_cnt++;\n\t//gPrint(\"psd cnt=%d\\n\", psd_cnt);\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,(\"PSD:psd_cnt = %d \\n\",psd_cnt));\n\tif (psd_cnt < ReScan)\n\t{\n\t\tODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval);  //ms\n\t}\n\telse\n\t{\t\n\t\tpsd_cnt = 0;\n\t\tfor(i=0;i<80;i++)\n\t\t\tRT_TRACE(\tODM_COMP_PSD, DBG_LOUD,(\"psd_report[%d]=     %d \\n\", 2402+i, PSD_report[i]));\n\t\t\t//DbgPrint(\"psd_report[%d]=     %d \\n\", 2402+i, PSD_report[i]);\n\n\t\tGoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);\n\n\t}\n}\n\nvoid odm_Write_RXHP(\n\tIN\t\tPVOID\t\t\tpDM_VOID)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tpRXHP_T\t\tpRX_HP_Table = &pDM_Odm->DM_RXHP_Table;\n\tu4Byte\t\tcurrentIGI;\n\n\tif(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);\n\t     \tODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);\t\n\t}\n\t\n\tif(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)\n{\n\t\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th);  // RegC54[9:8]=2'b11:  AGC Flow 3\n\t}\n\n\tif(pRX_HP_Table->RXHP_flag == 0)\n\t{\n\t\tpRX_HP_Table->Cur_IGI = 0x20;\n\t}\n\telse\n\t{\n\t\tcurrentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);\n\t\tif(currentIGI<0x50)\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);\n\t     \t\tODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);\t\n\t\t}\n\t}\n\tpRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;\n\tpRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;\n\n}\n\n\nvoid odm_RXHP(\n\tIN\t\tPVOID\t\t\tpDM_VOID)\n{\n#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\tAdapter =  pDM_Odm->Adapter;\n\tPMGNT_INFO\tpMgntInfo = &(Adapter->MgntInfo);\n\tpDIG_T\t\tpDM_DigTable = &pDM_Odm->DM_DigTable;\n\tpRXHP_T\t\tpRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\n\tPFALSE_ALARM_STATISTICS\t\tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_FALSEALMCNT);\n\t\n\tu1Byte              \ti, j, sum;\n\tu1Byte\t\t\tIs40MHz;\n\ts1Byte              \tIntf_diff_idx, MIN_Intf_diff_idx = 16;   \n       s4Byte              \tcur_channel;    \n       u1Byte              \tch_map_intf_5M[17] = {0};     \n       static u4Byte\t\tFA_TH = 0;\t\n\tstatic u1Byte      \tpsd_intf_flag = 0;\n\tstatic s4Byte      \tcurRssi = 0;                \n       static s4Byte  \t\tpreRssi = 0;                                                                \n\tstatic u1Byte\t\tPSDTriggerCnt = 1;\n\t\n\tu1Byte\t\t\tRX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31);   // for debug!!\n\n#if(DEV_BUS_TYPE == RT_USB_INTERFACE)\t\n\tstatic s8Byte  \t\tlastTxOkCnt = 0, lastRxOkCnt = 0;  \n       s8Byte\t\t\tcurTxOkCnt, curRxOkCnt;\n\ts8Byte\t\t\tcurTPOkCnt;\n\ts8Byte\t\t\tTP_Acc3, TP_Acc5;\n\tstatic s8Byte\t\tTP_Buff[5] = {0};\n\tstatic u1Byte\t\tpre_state = 0, pre_state_flag = 0;\n\tstatic u1Byte\t\tIntf_HighTP_flag = 0, De_counter = 16; \n\tstatic u1Byte\t\tTP_Degrade_flag = 0;\n#endif\t   \n\tstatic u1Byte\t\tLatchCnt = 0;\n\t\n\tif(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))\n\t\treturn;\n\t//AGC RX High Power Mode is only applied on 2G band in 92D!!!\n\tif(pDM_Odm->SupportICType == ODM_RTL8192D)\n\t{\n\t\tif(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)\n\t\t\treturn;\n\t}\n\n\tif(!(pDM_Odm->SupportAbility & ODM_BB_RXHP))\n\t\treturn;\n\n\n\t//RX HP ON/OFF\n\tif(RX_HP_enable == 1)\n\t\tpRX_HP_Table->RXHP_enable = FALSE;\n\telse\n\t\tpRX_HP_Table->RXHP_enable = TRUE;\n\n\tif(pRX_HP_Table->RXHP_enable == FALSE)\n\t{\n\t\tif(pRX_HP_Table->RXHP_flag == 1)\n\t\t{\n\t\t\tpRX_HP_Table->RXHP_flag = 0;\n\t\t\tpsd_intf_flag = 0;\n\t\t}\n\t\treturn;\n\t}\n\n#if(DEV_BUS_TYPE == RT_USB_INTERFACE)\t\n\t//2 Record current TP for USB interface\n\tcurTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;\n\tcurRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;\n\tlastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);\n\tlastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);\n\n\tcurTPOkCnt = curTxOkCnt+curRxOkCnt;\n\tTP_Buff[0] = curTPOkCnt;    // current TP  \n\tTP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);\n\tTP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);\n\t\n\tif(TP_Acc5 < 1000)\n\t\tpRX_HP_Table->TP_Mode = Idle_Mode;\n\telse if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))\n\t\tpRX_HP_Table->TP_Mode = Low_TP_Mode;\n\telse\n\t\tpRX_HP_Table->TP_Mode = High_TP_Mode;\n\n\tODM_RT_TRACE(pDM_Odm, \tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RX HP TP Mode = %d\\n\", pRX_HP_Table->TP_Mode));\n\t// Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.\n\t// When LatchCnt = 0, we would Get PSD result.\n\tif(TP_Degrade_flag == 1)\n\t{\n\t\tLatchCnt--;\n\t\tif(LatchCnt == 0)\n\t\t{\n\t\t\tTP_Degrade_flag = 0;\n\t\t}\n\t}\n\t// When PSD function triggered by TP degrade 20%, and Interference Flag = 1\n\t// Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.\n\tif(Intf_HighTP_flag == 1)\n\t{\n\t\tDe_counter--;\n\t\tif(De_counter == 0)\n\t\t{\n\t\t\tIntf_HighTP_flag = 0;\n\t\t\tpsd_intf_flag = 0;\n\t\t}\n\t}\n#endif\n\n\t//2 AGC RX High Power Mode by PSD only applied to STA Mode\n\t//3 NOT applied 1. Ad Hoc Mode.\n\t//3 NOT applied 2. AP Mode\n\tif ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))\n\t{    \n\t\tIs40MHz = *(pDM_Odm->pBandWidth);\n\t\tcurRssi = pDM_Odm->RSSI_Min;\n\t\tcur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;\n\n\t\t/* check illegal channel and bandwidth */\n\t\tif (Is40MHz && ((cur_channel < 3) || (cur_channel > 12))) {\n\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"illegal channel setting, 40MHz channel = %d\\n\", cur_channel));\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, \tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RXHP RX HP flag = %d\\n\", pRX_HP_Table->RXHP_flag));\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RXHP FA = %d\\n\", FalseAlmCnt->Cnt_all));\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RXHP cur RSSI = %d, pre RSSI=%d\\n\", curRssi, preRssi));\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RXHP current CH = %d\\n\", cur_channel));\n\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RXHP Is 40MHz = %d\\n\", Is40MHz));\n       \t//2 PSD function would be triggered \n       \t//3 1. Every 4 sec for PCIE\n       \t//3 2. Before TP Mode (Idle TP<4kbps) for USB\n       \t//3 3. After TP Mode (High TP) for USB \n\t\tif((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0))\t// Only RSSI>TH and RX_HP_flag=0 will Do PSD process \n\t\t{\n#if (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\t\t//2 Before TP Mode ==> PSD would be trigger every 4 sec\n\t\t\tif(pRX_HP_Table->TP_Mode == Idle_Mode)\t\t//2.1 less wlan traffic <4kbps\n\t\t\t{\n#endif\n\t\t\t\tif(PSDTriggerCnt == 1)       \n\t\t\t\t{    \t\n\t\t\t\t\todm_PSD_RXHP(pDM_Odm);\n\t\t\t\t\tpRX_HP_Table->PSD_func_trigger = 1;\n\t\t\t\t\tPSDTriggerCnt = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n             \t\t\t\tPSDTriggerCnt++;\n\t\t\t\t}\n#if(DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\t\t}\t\n\t\t\t//2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function\n\t\t\tif(pRX_HP_Table->TP_Mode == High_TP_Mode)\n\t\t\t{\n\t\t\t\tif((pre_state_flag == 0)&&(LatchCnt == 0)) \n\t\t\t\t{\n\t\t\t\t\t// TP var < 5%\n\t\t\t\t\tif((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))\n\t\t\t\t\t{\n\t\t\t\t\t\tpre_state++;\n\t\t\t\t\t\tif(pre_state == 3)      // hit pre_state condition => consecutive 3 times\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpre_state_flag = 1;\n\t\t\t\t\t\t\tpre_state = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpre_state = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//3 If pre_state_flag=1 ==> start to monitor TP degrade 20%\n\t\t\t\tif(pre_state_flag == 1)\t\t\n\t\t\t\t{\n\t\t\t\t\tif(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3))      // degrade 20%\n\t\t\t\t\t{\n\t\t\t\t\t\todm_PSD_RXHP(pDM_Odm);\n\t\t\t\t\t\tpRX_HP_Table->PSD_func_trigger = 1;\n\t\t\t\t\t\tTP_Degrade_flag = 1;\n\t\t\t\t\t\tLatchCnt = 2;\n\t\t\t\t\t\tpre_state_flag = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])\n\t\t\t\t\t{\n\t\t\t\t\t\todm_PSD_RXHP(pDM_Odm);\n\t\t\t\t\t\tpRX_HP_Table->PSD_func_trigger = 1;\n\t\t\t\t\t\tTP_Degrade_flag = 1;\n\t\t\t\t\t\tLatchCnt = 2;\n\t\t\t\t\t\tpre_state_flag = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])\n\t\t\t\t\t{\n\t\t\t\t\t\todm_PSD_RXHP(pDM_Odm);\n\t\t\t\t\t\tpRX_HP_Table->PSD_func_trigger = 1;\n\t\t\t\t\t\tTP_Degrade_flag = 1;\n\t\t\t\t\t\tLatchCnt = 2;\n\t\t\t\t\t\tpre_state_flag = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif\n}\n\n#if (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\tfor (i=0;i<4;i++)\n\t\t{\n\t\t\tTP_Buff[4-i] = TP_Buff[3-i];\n\t\t}\n#endif\n\t\t//2 Update PSD bitmap according to PSD report \n\t\tif((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))\n    \t\t{\t\n           \t\t//2 Separate 80M bandwidth into 16 group with smaller 5M BW.\n\t\t\tfor (i = 0 ; i < 16 ; i++)\n           \t\t{\n\t\t\t\tsum = 0;\n\t\t\t\tfor(j = 0; j < 5 ; j++)\n                \t\t\tsum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];\n            \n                \t\tif(sum < 5)\n                \t\t{\n                \t\t\tch_map_intf_5M[i] = 1;  // interference flag\n                \t\t}\n           \t\t}\n\t\t\t//=============just for debug=========================\n\t\t\t//for(i=0;i<16;i++)\n\t\t\t\t//DbgPrint(\"RX HP: ch_map_intf_5M[%d] = %d\\n\", i, ch_map_intf_5M[i]);\n\t\t\t//===============================================\n\t\t\t//2 Mask target channel 5M index\n\t    \t\tfor(i = 0; i < (4+4*Is40MHz) ; i++)\n           \t\t{\n\t\t\t\tch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;  \n           \t\t}\n\t\t\t\t\n           \t\tpsd_intf_flag = 0;\n\t    \t\tfor(i = 0; i < 16; i++)\n           \t\t{\n         \t\t\tif(ch_map_intf_5M[i] == 1)\n\t              \t{\n\t              \t\tpsd_intf_flag = 1;            // interference is detected!!!\t\n\t              \t\tbreak;\n         \t\t\t}\n\t    \t\t}\n\t\t\t\t\n#if (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\t\tif(pRX_HP_Table->TP_Mode!=Idle_Mode)\n\t\t\t{\n\t\t\t\tif(psd_intf_flag == 1)     // to avoid psd_intf_flag always 1\n\t\t\t\t{\n\t\t\t\t\tIntf_HighTP_flag = 1;\n\t\t\t\t\tDe_counter = 32;     // 0x1E -> 0x3E needs 32 times by each IGI step =1\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RX HP psd_intf_flag = %d\\n\", psd_intf_flag));\n\t\t\t//2 Distance between target channel and interference\n           \t\tfor(i = 0; i < 16; i++)\n          \t\t{\n\t\t\t\tif(ch_map_intf_5M[i] == 1)\n                \t\t{\n\t\t\t\t\tIntf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));  \n                      \t\tif(Intf_diff_idx < MIN_Intf_diff_idx)\n\t\t\t\t\t\tMIN_Intf_diff_idx = Intf_diff_idx;    // the min difference index between interference and target\n\t\t  \t\t}\n\t    \t\t}\n\t    \t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RX HP MIN_Intf_diff_idx = %d\\n\", MIN_Intf_diff_idx)); \n\t\t\t//2 Choose False Alarm Threshold\n\t\t\tswitch (MIN_Intf_diff_idx){\n      \t\t\t\tcase 0: \n\t   \t\t\tcase 1:\n\t        \t\tcase 2:\n\t        \t\tcase 3:\t \t \n                 \t\t\tFA_TH = FA_RXHP_TH1;  \n                     \t\tbreak;\n\t        \t\tcase 4:\t\t\t\t// CH5\n\t        \t\tcase 5:\t\t\t\t// CH6\n\t\t   \t\t\tFA_TH = FA_RXHP_TH2;\t\n               \t\t\tbreak;\n\t        \t\tcase 6:\t\t\t\t// CH7\n\t        \t\tcase 7:\t\t\t\t// CH8\n\t\t      \t\t\tFA_TH = FA_RXHP_TH3;\n                    \t\t\tbreak; \n               \t\tcase 8:\t\t\t\t// CH9\n\t        \t\tcase 9:\t\t\t\t//CH10\n\t\t      \t\t\tFA_TH = FA_RXHP_TH4;\n                    \t\t\tbreak; \t\n\t        \t\tcase 10:\n\t        \t\tcase 11:\n\t        \t\tcase 12:\n\t        \t\tcase 13:\t \n\t        \t\tcase 14:\n\t      \t\t\tcase 15:\t \t\n\t\t      \t\t\tFA_TH = FA_RXHP_TH5;\n                    \t\t\tbreak;  \t\t\n       \t\t}\t\n\t\t\tODM_RT_TRACE(pDM_Odm,\tODM_COMP_RXHP, ODM_DBG_LOUD, (\"RX HP FA_TH = %d\\n\", FA_TH));\n\t\t\tpRX_HP_Table->PSD_func_trigger = 0;\n\t\t}\n\t\t//1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode\n         \tif(pRX_HP_Table->RXHP_flag == 1)\n         \t{\n              \tif ((curRssi > 80)&&(preRssi < 80))\n              \t{ \n                   \t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;\n              \t}\n              \telse if ((curRssi < 80)&&(preRssi > 80))\n              \t{\n                   \t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;\n\t\t\t}\n\t       \telse if ((curRssi > 72)&&(preRssi < 72))\n\t      \t\t{\n                \t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;\n\t       \t}\n              \telse if ((curRssi < 72)&&( preRssi > 72))\n\t     \t\t{\n                   \t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;\n\t       \t}\n\t       \telse if (curRssi < 68)\t\t //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode\n\t       \t{\n                   \t\tpRX_HP_Table->Cur_pw_th = pw_th_10dB;\n\t\t\t\tpRX_HP_Table->RXHP_flag = 0;    // Back to Normal DIG Mode\t\t  \n\t\t\t\tpsd_intf_flag = 0;\n\t\t\t}\n\t\t}\n\t\telse    // pRX_HP_Table->RXHP_flag == 0\n\t\t{\n\t\t\t//1 Decide whether to enter AGC RX High Power Mode\n\t\t\tif ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&  \n\t\t\t\t(pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))\n\t\t\t{\n             \t\t\tif (curRssi > 80)\n             \t\t\t{\n\t\t\t\t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;\n\t\t\t\t}\n\t\t\t\telse if (curRssi > 72) \n              \t\t{\n               \t\t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;\n\t\t\t\t}\n             \t\t\telse\n            \t\t\t{\n                   \t\t\tpRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;\n\t\t\t\t}\n           \t\t\tpRX_HP_Table->Cur_pw_th = pw_th_16dB;\t\t//RegC54[9:8]=2'b11: to enter AGC Flow 3\n\t\t\t\tpRX_HP_Table->First_time_enter = TRUE;\n\t\t\t\tpRX_HP_Table->RXHP_flag = 1;    //\tRXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode\n\t\t\t}\n\t\t}\n\t\tpreRssi = curRssi; \n\t\todm_Write_RXHP(pDM_Odm);\t\n\t}\n#endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n#endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)\n}\n\n\nVOID\nodm_PSD_RXHPCallback(\n\tPRT_TIMER\t\tpTimer\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tpRXHP_T\t\t\tpRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\n\t\n#if DEV_BUS_TYPE==RT_PCI_INTERFACE\n\t#if USE_WORKITEM\n\tODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);\n\t#else\n\todm_PSD_RXHP(pDM_Odm);\n\t#endif\n#else\n\tODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);\n#endif\n\t\n\t}\n\nVOID\nodm_PSD_RXHPWorkitemCallback(\n    IN PVOID            pContext\n    )\n{\n\tPADAPTER\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t\n\todm_PSD_RXHP(pDM_Odm);\n}\n\n#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n\n \n"
  },
  {
    "path": "hal/phydm/phydm_rxhp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__PHYDMRXHP_H__\n#define    __PHYDMRXHP_H__\n\n#define RXHP_VERSION\t\"1.0\"\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\n#define\tAFH_PSD\t\t1\t//0:normal PSD scan, 1: only do 20 pts PSD\n#define\tMODE_40M\t\t0\t//0:20M, 1:40M\n#define\tPSD_TH2\t\t3  \n#define\tPSD_CHMIN\t\t20   // Minimum channel number for BT AFH\n#define\tSIR_STEP_SIZE\t3\n#define   Smooth_Size_1 \t5\n#define\tSmooth_TH_1\t3\n#define   Smooth_Size_2 \t10\n#define\tSmooth_TH_2\t4\n#define   Smooth_Size_3 \t20\n#define\tSmooth_TH_3\t4\n#define   Smooth_Step_Size 5\n#define\tAdaptive_SIR\t1\n#define\tPSD_RESCAN\t\t4\n#define\tPSD_SCAN_INTERVAL\t700 //ms\n\ntypedef struct _RX_High_Power_\n{\n\tu1Byte\t\tRXHP_flag;\n\tu1Byte\t\tPSD_func_trigger;\n\tu1Byte\t\tPSD_bitmap_RXHP[80];\n\tu1Byte\t\tPre_IGI;\n\tu1Byte\t\tCur_IGI;\n\tu1Byte\t\tPre_pw_th;\n\tu1Byte\t\tCur_pw_th;\n\tBOOLEAN\t\tFirst_time_enter;\n\tBOOLEAN\t\tRXHP_enable;\n\tu1Byte\t\tTP_Mode;\n\tRT_TIMER\tPSDTimer;\n\t#if USE_WORKITEM\n\tRT_WORK_ITEM\t\tPSDTimeWorkitem;\n\t#endif\n}RXHP_T, *pRXHP_T;\n\n#define\tdm_PSDMonitorCallback\todm_PSDMonitorCallback\nVOID\todm_PSDMonitorCallback(PRT_TIMER\t\tpTimer);\n\nVOID\nodm_PSDMonitorInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID\n\t);\n\nvoid\todm_RXHPInit(\n\tIN\t\tPVOID\t\t\tpDM_VOID);\n\nvoid odm_RXHP(\n\tIN\t\tPVOID\t\t\tpDM_VOID);\n\nVOID\nodm_PSD_RXHPCallback(\n\tPRT_TIMER\t\tpTimer\n);\n\n VOID\nODM_PSDDbgControl(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu4Byte\t\tmode,\n\tIN\tu4Byte\t\tbtRssi\n\t);\n\n VOID\nodm_PSD_RXHPCallback(\n\tPRT_TIMER\t\tpTimer\n);\n\nVOID\nodm_PSD_RXHPWorkitemCallback(\n    IN PVOID            pContext\n    );\n\nVOID\nodm_PSDMonitorWorkItemCallback(\n    IN PVOID            pContext\n    );\n\n #endif\n\n #endif\n "
  },
  {
    "path": "hal/phydm/phydm_types.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __ODM_TYPES_H__\n#define __ODM_TYPES_H__\n\n//\n// Define Different SW team support\n//\n#define\tODM_AP\t\t \t0x01\t//BIT0 \n#define\tODM_ADSL\t \t0x02\t//BIT1\n#define\tODM_CE\t\t \t0x04\t//BIT2\n#define\tODM_WIN\t\t \t0x08\t//BIT3\n\n// Deifne HW endian support\n#define\tODM_ENDIAN_BIG\t0\n#define\tODM_ENDIAN_LITTLE\t1\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#define GET_PDM_ODM(__pAdapter)\t((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc)))\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#define GET_PDM_ODM(__pAdapter)\t((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->odmpriv)))\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)\n#define \tRT_PCI_INTERFACE\t\t\t\t1\n#define \tRT_USB_INTERFACE\t\t\t\t2\n#define \tRT_SDIO_INTERFACE\t\t\t\t3\n#endif\n\ntypedef enum _HAL_STATUS{\n\tHAL_STATUS_SUCCESS,\n\tHAL_STATUS_FAILURE,\n\t/*RT_STATUS_PENDING,\n\tRT_STATUS_RESOURCE,\n\tRT_STATUS_INVALID_CONTEXT,\n\tRT_STATUS_INVALID_PARAMETER,\n\tRT_STATUS_NOT_SUPPORT,\n\tRT_STATUS_OS_API_FAILED,*/\n}HAL_STATUS,*PHAL_STATUS;\n\n#if( DM_ODM_SUPPORT_TYPE == ODM_AP)\n#define\t\tMP_DRIVER\t\t0\n#endif\n#if(DM_ODM_SUPPORT_TYPE != ODM_WIN)\n\n#define\t\tVISTA_USB_RX_REVISE\t\t\t0\n\n//\n// Declare for ODM spin lock defintion temporarily fro compile pass.\n//\ntypedef enum _RT_SPINLOCK_TYPE{\n\tRT_TX_SPINLOCK = 1,\n\tRT_RX_SPINLOCK = 2,\n\tRT_RM_SPINLOCK = 3,\n\tRT_CAM_SPINLOCK = 4,\n\tRT_SCAN_SPINLOCK = 5,\n\tRT_LOG_SPINLOCK = 7, \n\tRT_BW_SPINLOCK = 8,\n\tRT_CHNLOP_SPINLOCK = 9,\n\tRT_RF_OPERATE_SPINLOCK = 10,\n\tRT_INITIAL_SPINLOCK = 11,\n\tRT_RF_STATE_SPINLOCK = 12, // For RF state. Added by Bruce, 2007-10-30.\n#if VISTA_USB_RX_REVISE\n\tRT_USBRX_CONTEXT_SPINLOCK = 13,\n\tRT_USBRX_POSTPROC_SPINLOCK = 14, // protect data of Adapter->IndicateW/ IndicateR\n#endif\n\t//Shall we define Ndis 6.2 SpinLock Here ?\n\tRT_PORT_SPINLOCK=16,\n\tRT_VNIC_SPINLOCK=17,\n\tRT_HVL_SPINLOCK=18,\t\n\tRT_H2C_SPINLOCK = 20, // For H2C cmd. Added by tynli. 2009.11.09.\n\n\tRT_BTData_SPINLOCK=25,\n\n\tRT_WAPI_OPTION_SPINLOCK=26,\n\tRT_WAPI_RX_SPINLOCK=27,\n\n      // add for 92D CCK control issue  \n\tRT_CCK_PAGEA_SPINLOCK = 28,\n\tRT_BUFFER_SPINLOCK = 29,\n\tRT_CHANNEL_AND_BANDWIDTH_SPINLOCK = 30,\n\tRT_GEN_TEMP_BUF_SPINLOCK = 31,\n\tRT_AWB_SPINLOCK = 32,\n\tRT_FW_PS_SPINLOCK = 33,\n\tRT_HW_TIMER_SPIN_LOCK = 34,\n\tRT_MPT_WI_SPINLOCK = 35,\n\tRT_P2P_SPIN_LOCK = 36,\t// Protect P2P context\n\tRT_DBG_SPIN_LOCK = 37,\n\tRT_IQK_SPINLOCK = 38,\n\tRT_PENDED_OID_SPINLOCK = 39,\n\tRT_CHNLLIST_SPINLOCK = 40,\t\n\tRT_INDIC_SPINLOCK = 41,\t//protect indication\t\n\tRT_RFD_SPINLOCK = 42,\n\tRT_SYNC_IO_CNT_SPINLOCK = 43,\n\tRT_LAST_SPINLOCK,\n}RT_SPINLOCK_TYPE;\n\n#endif\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t#define\tSTA_INFO_T\t\t\tRT_WLAN_STA\n\t#define\tPSTA_INFO_T\t\t\tPRT_WLAN_STA\n\n\t#define CONFIG_HW_ANTENNA_DIVERSITY \n\t#define CONFIG_SW_ANTENNA_DIVERSITY \n\t/*#define CONFIG_HL_SMART_ANTENNA_TYPE1*/\n\t/*#define CONFIG_PATH_DIVERSITY*/\n\t/*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/\n\t#define CONFIG_ANT_DETECTION\n\t#define CONFIG_RA_DBG_CMD\n\n\t#define\t__func__\t\t__FUNCTION__\n\t#define\tPHYDM_TESTCHIP_SUPPORT\tTESTCHIP_SUPPORT\n\t#define bMaskH3Bytes\t\t\t0xffffff00\n\t#define SUCCESS\t0\n\t#define FAIL\t(-1)\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\n\t// To let ADSL/AP project compile ok; it should be removed after all conflict are solved. Added by Annie, 2011-10-07.\n\t#define ADSL_AP_BUILD_WORKAROUND\n\t#define AP_BUILD_WORKAROUND\n\t\n\t//2 [ Configure RA Debug H2C CMD ]\n\t#define CONFIG_RA_DBG_CMD\n\t\n\t/*#define CONFIG_PATH_DIVERSITY*/\n\t/*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/\n\t\n\t//2 [ Configure Antenna Diversity ]\n#if defined(CONFIG_RTL_8881A_ANT_SWITCH) || defined(CONFIG_SLOT_0_ANT_SWITCH) || defined(CONFIG_SLOT_1_ANT_SWITCH)\n\t#define CONFIG_HW_ANTENNA_DIVERSITY \n\t#define ODM_EVM_ENHANCE_ANTDIV\n\n        //----------\n\t#if(!defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A) && !defined(CONFIG_2G_CGCS_RX_DIVERSITY) && !defined(CONFIG_2G_CG_TRX_DIVERSITY) && !defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))\n\t\t#define CONFIG_NO_2G_DIVERSITY\n\t#endif\n\n\t#ifdef CONFIG_NO_5G_DIVERSITY_8881A\n\t\t#define CONFIG_NO_5G_DIVERSITY\n\t#elif  defined(CONFIG_5G_CGCS_RX_DIVERSITY_8881A)\n\t\t#define CONFIG_5G_CGCS_RX_DIVERSITY\n\t#elif  defined(CONFIG_5G_CG_TRX_DIVERSITY_8881A)\n\t\t#define CONFIG_5G_CG_TRX_DIVERSITY\n\t#elif  defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A)\n\t\t#define CONFIG_2G5G_CG_TRX_DIVERSITY\n\t#endif\n\t#if(!defined(CONFIG_NO_5G_DIVERSITY) && !defined(CONFIG_5G_CGCS_RX_DIVERSITY) && !defined(CONFIG_5G_CG_TRX_DIVERSITY) && !defined(CONFIG_2G5G_CG_TRX_DIVERSITY) && !defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))\n\t\t#define CONFIG_NO_5G_DIVERSITY\n\t#endif\t\n\t//----------\n\t#if ( defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) )\n\t\t#define CONFIG_NOT_SUPPORT_ANTDIV \n\t#elif( !defined(CONFIG_NO_2G_DIVERSITY) && defined(CONFIG_NO_5G_DIVERSITY) )\n\t\t#define CONFIG_2G_SUPPORT_ANTDIV\n\t#elif( defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY) )\n\t\t#define CONFIG_5G_SUPPORT_ANTDIV\n\t#elif( (!defined(CONFIG_NO_2G_DIVERSITY) && !defined(CONFIG_NO_5G_DIVERSITY)) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY) )\n\t\t#define CONFIG_2G5G_SUPPORT_ANTDIV \n\t#endif\n\t//----------\n#endif\n\t#ifdef AP_BUILD_WORKAROUND\n\t#include \"../typedef.h\"\n\t#else\n\ttypedef void\t\t\t\t\tVOID,*PVOID;\n\ttypedef unsigned char\t\t\tBOOLEAN,*PBOOLEAN;\n\ttypedef unsigned char\t\t\tu1Byte,*pu1Byte;\n\ttypedef unsigned short\t\t\tu2Byte,*pu2Byte;\n\ttypedef unsigned int\t\t\tu4Byte,*pu4Byte;\n\ttypedef unsigned long long\t\tu8Byte,*pu8Byte;\n#if 1\n/* In ARM platform, system would use the type -- \"char\" as \"unsigned char\"\n * And we only use s1Byte/ps1Byte as INT8 now, so changes the type of s1Byte.*/\n    typedef signed char\t\t\t\ts1Byte,*ps1Byte;\n#else\n\ttypedef char\t\t\t\t\ts1Byte,*ps1Byte;\n#endif\n\ttypedef short\t\t\t\t\ts2Byte,*ps2Byte;\n\ttypedef long\t\t\t\t\ts4Byte,*ps4Byte;\n\ttypedef long long\t\t\t\ts8Byte,*ps8Byte;\n\t#endif\n\n\ttypedef struct rtl8192cd_priv\t*prtl8192cd_priv;\n\ttypedef struct stat_info\t\tSTA_INFO_T,*PSTA_INFO_T;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\ttypedef struct legacy_timer_emu\t\tRT_TIMER, *PRT_TIMER;\n#else\n\ttypedef struct timer_list\t\tRT_TIMER, *PRT_TIMER;\n#endif\n\ttypedef  void *\t\t\t\tRT_TIMER_CALL_BACK;\n\n#ifdef CONFIG_PCI_HCI\n\t#define DEV_BUS_TYPE\t\tRT_PCI_INTERFACE\n#endif\n\n\t#define _TRUE\t\t\t\t1\n\t#define _FALSE\t\t\t\t0\n\n\t#if (defined(TESTCHIP_SUPPORT))\n\t\t#define\tPHYDM_TESTCHIP_SUPPORT 1\n\t#else\n\t\t#define\tPHYDM_TESTCHIP_SUPPORT 0\n\t#endif\n\t\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t#include <drv_types.h>\n\n\t/*#define CONFIG_RA_DBG_CMD*/\n\t/*#define CONFIG_ANT_DETECTION*/\n\t/*#define CONFIG_PATH_DIVERSITY*/\n\t/*#define CONFIG_RA_DYNAMIC_RTY_LIMIT*/\n\n#if 0\n\ttypedef u8\t\t\t\t\tu1Byte, *pu1Byte;\n\ttypedef u16\t\t\t\t\tu2Byte,*pu2Byte;\n\ttypedef u32\t\t\t\t\tu4Byte,*pu4Byte;\n\ttypedef u64\t\t\t\t\tu8Byte,*pu8Byte;\n\ttypedef s8\t\t\t\t\ts1Byte,*ps1Byte;\n\ttypedef s16\t\t\t\t\ts2Byte,*ps2Byte;\n\ttypedef s32\t\t\t\t\ts4Byte,*ps4Byte;\n\ttypedef s64\t\t\t\t\ts8Byte,*ps8Byte;\n#else\n\t#define u1Byte \t\tu8\n\t#define\tpu1Byte \tu8*\t\n\n\t#define u2Byte \t\tu16\n\t#define\tpu2Byte \tu16*\t\t\n\n\t#define u4Byte \t\tu32\n\t#define\tpu4Byte \tu32*\t\n\n\t#define u8Byte \t\tu64\n\t#define\tpu8Byte \tu64*\n\n\t#define s1Byte \t\ts8\n\t#define\tps1Byte \ts8*\t\n\n\t#define s2Byte \t\ts16\n\t#define\tps2Byte \ts16*\t\n\n\t#define s4Byte \t\ts32\n\t#define\tps4Byte \ts32*\t\n\n\t#define s8Byte \t\ts64\n\t#define\tps8Byte \ts64*\t\n\t\n#endif\n\t#ifdef CONFIG_USB_HCI\n\t\t#define DEV_BUS_TYPE  \tRT_USB_INTERFACE\n\t#elif defined(CONFIG_PCI_HCI)\n\t\t#define DEV_BUS_TYPE  \tRT_PCI_INTERFACE\n\t#elif defined(CONFIG_SDIO_HCI)\n\t\t#define DEV_BUS_TYPE  \tRT_SDIO_INTERFACE\n\t#elif defined(CONFIG_GSPI_HCI)\n\t\t#define DEV_BUS_TYPE  \tRT_SDIO_INTERFACE\n\t#endif\n\t\n\n\t#if defined(CONFIG_LITTLE_ENDIAN)\t\n\t\t#define\tODM_ENDIAN_TYPE\t\t\tODM_ENDIAN_LITTLE\n\t#elif defined (CONFIG_BIG_ENDIAN)\n\t\t#define\tODM_ENDIAN_TYPE\t\t\tODM_ENDIAN_BIG\n\t#endif\n\t\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\ttypedef struct legacy_timer_emu\t\tRT_TIMER, *PRT_TIMER;\n#else\n\ttypedef struct timer_list\t\tRT_TIMER, *PRT_TIMER;\n#endif\n\ttypedef  void *\t\t\t\tRT_TIMER_CALL_BACK;\n\t#define\tSTA_INFO_T\t\t\tstruct sta_info\n\t#define\tPSTA_INFO_T\t\tstruct sta_info *\n\t\t\n\n\n\t#define TRUE \t_TRUE\t\n\t#define FALSE\t_FALSE\n\n\n\t#define SET_TX_DESC_ANTSEL_A_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 1, __Value)\n\t#define SET_TX_DESC_ANTSEL_B_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 25, 1, __Value)\n\t#define SET_TX_DESC_ANTSEL_C_88E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 29, 1, __Value)\n\n\t//define useless flag to avoid compile warning\n\t#define\tUSE_WORKITEM 0\n\t#define\tFOR_BRAZIL_PRETEST 0\n\t/*#define\tBT_30_SUPPORT\t\t\t0*/\n\t#define\tFPGA_TWO_MAC_VERIFICATION\t0\n\t#define\tRTL8881A_SUPPORT\t0\n\n\t#if (defined(TESTCHIP_SUPPORT))\n\t\t#define\tPHYDM_TESTCHIP_SUPPORT 1\n\t#else\n\t\t#define\tPHYDM_TESTCHIP_SUPPORT 0\n\t#endif\n#endif\n\n#define READ_NEXT_PAIR(v1, v2, i) do { if (i+2 >= ArrayLen) break; i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)\n#define COND_ELSE  2\n#define COND_ENDIF 3\n\n#endif // __ODM_TYPES_H__\n\n"
  },
  {
    "path": "hal/phydm/rtchnlplan.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n/******************************************************************************\n     \n History:\n\tData\t\tWho\t\tRemark (Internal History)\n\t\n\t05/14/2012\tMH\t\tCollect RTK inernal infromation and generate channel plan draft.\n\t\n******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n#include \"mp_precomp.h\"\n#include \"rtchnlplan.h\"\n\n\n\n//\n//\tChannel Plan Domain Code\n//\n\n/*\n\tChannel Plan Contents\t\t\t\t\t\n\tDomain Code\t\tEEPROM\tCountries in Specific Domain\t\t\n\t\t\t2G RD\t\t5G RD\t\tBit[6:0]\t2G\t5G\t\n\tCase\tOld Define\t\t\t\t00h~1Fh\tOld Define\tOld Define\t\n\t1\t\t2G_WORLD\t5G_NULL\t\t20h\t\tWorldwird 13\tNA\t\n\t2\t\t2G_ETSI1\t5G_NULL\t\t21h\t\tEurope 2G\t\tNA\t\n\t3\t\t2G_FCC1\t\t5G_NULL\t\t22h\t\tUS 2G\t\t\tNA\t\n\t4\t\t2G_MKK1\t\t5G_NULL\t\t23h\t\tJapan 2G\t\tNA\t\n\t5\t\t2G_ETSI2\t5G_NULL\t\t24h\t\tFrance 2G\t\tNA\t\n\t6\t\t2G_FCC1\t\t5G_FCC1\t\t25h\t\tUS 2G\t\t\tUS 5G\t\t\t\t\tKj{\n\t7\t\t2G_WORLD\t5G_ETSI1\t26h\t\tWorldwird 13\tEurope\t\t\t\t\tKj{\n\t8\t\t2G_MKK1\t\t5G_MKK1\t\t27h\t\tJapan 2G\t\tJapan 5G\t\t\t\tKj{\n\t9\t\t2G_WORLD\t5G_KCC1\t\t28h\t\tWorldwird 13\tKorea\t\t\t\t\tKj{\n\t10\t\t2G_WORLD\t5G_FCC2\t\t29h\t\tWorldwird 13\tUS o/w DFS Channels\t\t\n\t11\t\t2G_WORLD\t5G_FCC3\t\t30h\t\tWorldwird 13\tIndia, Mexico\t    \t\n\t12\t\t2G_WORLD\t5G_FCC4\t\t31h\t\tWorldwird 13\tVenezuela\t        \t\n\t13\t\t2G_WORLD\t5G_FCC5\t\t32h\t\tWorldwird 13\tChina\t            \t\n\t14\t\t2G_WORLD\t5G_FCC6\t\t33h\t\tWorldwird 13\tIsrael\t            \t\n\t15\t\t2G_FCC1\t\t5G_FCC7\t\t34h\t\tUS 2G\t\t\tUS/Canada\t\t\t\tKj{\n\t16\t\t2G_WORLD\t5G_ETSI2\t35h\t\tWorldwird 13\tAustralia, New Zealand\tKj{\n\t17\t\t2G_WORLD\t5G_ETSI3\t36h\t\tWorldwird 13\tRussia\t\n\t18\t\t2G_MKK1\t\t5G_MKK2\t\t37h\t\tJapan 2G\t\tJapan (W52, W53)\t\n\t19\t\t2G_MKK1\t\t5G_MKK3\t\t38h\t\tJapan 2G\t\tJapan (W56)\t\n\t20\t\t2G_FCC1\t\t5G_NCC1\t\t39h\t\tUS 2G\t\t\tTaiwan\t\t\t\t\tKj{\n\t\t\t\t\t\t\n\tNA\t\t2G_WORLD\t5G_FCC1\t\t7F\t\tFCC\tFCC DFS Channels\tRealtek Define\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t2.4G \tRegulatory \tDomains\t\t\t\t\t\n\tCase\t2G RD\t\tRegulation\tChannels\tFrequencyes\t\tNote\t\t\t\t\tCountries in Specific Domain\n\t1\t\t2G_WORLD\tETSI\t\t1~13\t\t2412~2472\t\tPassive scan CH 12, 13\tWorldwird 13\n\t2\t\t2G_ETSI1\tETSI\t\t1~13\t\t2412~2472\t\t\t\t\t\t\t\tEurope\n\t3\t\t2G_FCC1\t\tFCC\t\t\t1~11\t\t2412~2462\t\t\t\t\t\t\t\tUS\n\t4\t\t2G_MKK1\t\tMKK\t\t\t1~13, 14\t2412~2472, 2484\t\t\t\t\t\t\tJapan\n\t5\t\t2G_ETSI2\tETSI\t\t10~13\t\t2457~2472\t\t\t\t\t\t\t\tFrance\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t5G Regulatory Domains\t\t\t\t\t\n\tCase\t5G RD\t\tRegulation\tChannels\t\t\tFrequencyes\t\t\t\t\tNote\t\t\t\t\t\t\t\t\t\t\tCountries in Specific Domain\n\t1\t\t5G_NULL\t\tNA\t\t\tNA\t\t\t\t\tNA\t\t\t\t\t\t\tDo not support 5GHz\t\n\t2\t\t5G_ETSI1\tETSI\t\t\"36~48, 52~64,  \t\n\t\t\t\t\t\t\t\t\t100~140\"\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5700\"\t\t\t\t\tBand1, Ban2, Band3\t\t\t\t\t\t\t\tEurope\n\t3\t\t5G_ETSI2\tETSI\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t100~140, 149~165\"\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5700, 5745~5825\"\t\tBand1, Ban2, Band3, Band4\t\t\t\t\t\tAustralia, New Zealand\n\t4\t\t5G_ETSI3\tETSI\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t100~132, 149~165\"\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5660, 5745~5825\"\t\tBand1, Ban2, Band3(except CH 136, 140), Band4\"\tRussia\n\t5\t\t5G_FCC1\t\tFCC\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t100~140, 149~165\"\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5700, 5745~5825\"\t\tBand1(5150~5250MHz), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand2(5250~5350MHz),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand3(5470~5725MHz),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand4(5725~5850MHz)\"\t\t\t\t\t\t\tUS\n\t6\t\t5G_FCC2\t\tFCC\t\t\t36~48, 149~165\t\t5180~5240, 5745~5825\t\tBand1, Band4\tFCC o/w DFS Channels\n\t7\t\t5G_FCC3\t\tFCC\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t149~165\"\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5745~5825\"\t\t\t\t\tBand1, Ban2, Band4\t\t\t\t\t\t\t\tIndia, Mexico\n\t8\t\t5G_FCC4\t\tFCC\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t149~161\"\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5745~5805\"\t\t\t\t\tBand1, Ban2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand4(except CH 165)\"\t\t\t\t\t\t\tVenezuela\n\t9\t\t5G_FCC5\t\tFCC\t\t\t149~165\t\t\t\t5745~5825\t\t\t\t\tBand4\t\t\t\t\t\t\t\t\t\t\tChina\n\t10\t\t5G_FCC6\t\tFCC\t\t\t36~48, 52~64\t\t5180~5240, 5260~5230\t\tBand1, Band2\t\t\t\t\t\t\t\t\tIsrael\n\t11\t\t5G_FCC7\n\t\t\t5G_IC1\t\tFCC\n\t\t\t\t\t\tIC\"\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t100~116, 136, 140, \n\t\t\t\t\t\t\t\t\t149~165\"\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5580, 5680, 5700, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5745~5825\"\t\t\t\t\t\"Band1, Band2, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand3(except 5600~5650MHz),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand4\"\t\t\t\t\t\t\t\t\t\t\t\"US\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCanada\"\n\t12\t\t5G_KCC1\t\tKCC\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t100~124, 149~165\"\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5620, 5745~5825\"\t\t\"Band1, Ban2, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand3(5470~5650MHz),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand4\"\t\t\t\t\t\t\t\t\t\t\tKorea\n\t13\t\t5G_MKK1\t\tMKK\t\t\t\"36~48, 52~64, \n\t\t\t\t\t\t\t\t\t100~140\"\t\t\t\"5180~5240, 5260~5230\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5700\"\t\t\t\t\tW52, W53, W56\t\t\t\t\t\t\t\t\tJapan\n\t14\t\t5G_MKK2\t\tMKK\t\t\t36~48, 52~64\t\t5180~5240, 5260~5230\t\tW52, W53\t\t\t\t\t\t\t\t\t\tJapan (W52, W53)\n\t15\t\t5G_MKK3\t\tMKK\t\t\t100~140\t\t\t\t5500~5700\t\t\t\t\tW56\tJapan (W56)\n\t16\t\t5G_NCC1\t\tNCC\t\t\t\"56~64,\n\t\t\t\t\t\t\t\t\t100~116, 136, 140,\n\t\t\t\t\t\t\t\t\t149~165\"\t\t\t\"5260~5320\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5500~5580, 5680, 5700, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t5745~5825\"\t\t\t\t\t\"Band2(except CH 52), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand3(except 5600~5650MHz),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tBand4\"\t\t\t\t\t\t\t\t\t\t\tTaiwan\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n*/\t\t\t\t\t\t\n\t\t\t\t\t\t\n//\n// 2.4G CHannel \n//\t\t\t\t\t\t\n/*\n\n\t2.4G Band\t\tRegulatory Domains\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tRTL8192D\t\n\tChannel Number\tChannel Frequency\tUS\t\tCanada\tEurope\tSpain\tFrance\tJapan\tJapan\t\t20M\t\t40M\n\t\t\t\t\t(MHz)\t\t\t\t(FCC)\t(IC)\t(ETSI)\t\t\t\t\t\t\t(MPHPT)\t\t\t\t\n\t1\t\t\t\t2412\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\t\n\t2\t\t\t\t2417\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\t\n\t3\t\t\t\t2422\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t4\t\t\t\t2427\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t5\t\t\t\t2432\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t6\t\t\t\t2437\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t7\t\t\t\t2442\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t8\t\t\t\t2447\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t9\t\t\t\t2452\t\t\t\tv\t\tv\t\tv\t\t\t\t\t\t\t\tv\t\t\tv\t\tv\n\t10\t\t\t\t2457\t\t\t\tv\t\tv\t\tv\t\tv\t\tv\t\t\t\tv\t\t\tv\t\tv\n\t11\t\t\t\t2462\t\t\t\tv\t\tv\t\tv\t\tv\t\tv\t\t\t\tv\t\t\tv\t\tv\n\t12\t\t\t\t2467\t\t\t\t\t\t\t\tv\t\t\t\tv\t\t\t\tv\t\t\tv\t\tv\n\t13\t\t\t\t2472\t\t\t\t\t\t\t\tv\t\t\t\tv\t\t\t\tv\t\t\tv\t\n\t14\t\t\t\t2484\t\t\t\t\t\t\t\t\t\t\t\t\t\tv\t\t\t\t\tv\t\n\n\n*/\n\n\n//\n// 5G Operating Channel\n//\n/*\n\n\t5G Band\t\tRTL8192D\tRTL8195 (Jaguar)\t\t\t\tJaguar 2\tRegulatory Domains\t\t\t\t\t\t\t\t\t\t\t\n\tChannel Number\tChannel Frequency\tGlobal\tGlobal\t\t\t\tGlobal\t\"US\n(FCC 15.407)\"\t\"Canada\n(FCC, except 5.6~5.65GHz)\"\tArgentina, Australia, New Zealand, Brazil, S. Africa (FCC/ETSI)\t\"Europe\n(CE 301 893)\"\tChina\tIndia, Mexico, Singapore\tIsrael, Turkey\t\"Japan\n(MIC Item 19-3, 19-3-2)\"\tKorea\tRussia, Ukraine\t\"Taiwan\n(NCC)\"\tVenezuela\n\t\t(MHz)\t(20MHz)\t(20MHz)\t(40MHz)\t(80MHz)\t(160MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\t(20MHz)\n\"Band 1\n5.15GHz\n~\n5.25GHz\"\t36\t5180\tv\tv\tv\tv\t\tv\tIndoor\tIndoor\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\t\tv\n\t40\t5200\tv\tv\t\t\t\tv\tIndoor\tIndoor\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\t\tv\n\t44\t5220\tv\tv\tv\t\t\tv\tIndoor\tIndoor\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\t\tv\n\t48\t5240\tv\tv\t\t\t\tv\tIndoor\tIndoor\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\t\tv\n\"Band 2\n5.25GHz\n~\n5.35GHz\n(DFS)\"\t52\t5260\tv\tv\tv\tv\t\tv\tv\tv\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\t\tv\n\t56\t5280\tv\tv\t\t\t\tv\tv\tv\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\tIndoor\tv\n\t60\t5300\tv\tv\tv\t\t\tv\tv\tv\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\tIndoor\tv\n\t64\t5320\tv\tv\t\t\t\tv\tv\tv\tv\tIndoor\t\tv\tIndoor\tIndoor\tv\tv\tIndoor\tv\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\"Band 3\n5.47GHz\n~\n5.725GHz\n(DFS)\"\t100\t5500\tv\tv\tv\tv\t\tv\tv\tv\tv\tv\t\t\t\tv\tv\tv\tv\t\n\t104\t5520\tv\tv\t\t\t\tv\tv\tv\tv\tv\t\t\t\tv\tv\tv\tv\t\n\t108\t5540\tv\tv\tv\t\t\tv\tv\tv\tv\tv\t\t\t\tv\tv\tv\tv\t\n\t112\t5560\tv\tv\t\t\t\tv\tv\tv\tv\tv\t\t\t\tv\tv\tv\tv\t\n\t116\t5580\tv\tv\tv\tv\t\tv\tv\tv\tv\tv\t\t\t\tv\tv\tv\tv\t\n\t120\t5600\tv\tv\t\t\t\tv\tIndoor\t\tv\tIndoor\t\t\t\tv\tv\tv\t\t\n\t124\t5620\tv\tv\tv\t\t\tv\tIndoor\t\tv\tIndoor\t\t\t\tv\tv\tv\t\t\n\t128\t5640\tv\tv\t\t\t\tv\tIndoor\t\tv\tIndoor\t\t\t\tv\t\tv\t\t\n\t132\t5660\tv\tv\tv\tE\t\tv\tIndoor\t\tv\tIndoor\t\t\t\tv\t\tv\t\t\n\t136\t5680\tv\tv\t\t\t\tv\tv\tv\tv\tv\t\t\t\tv\t\t\tv\t\n\t140\t5700\tv\tv\tE\t\t\tv\tv\tv\tv\tv\t\t\t\tv\t\t\tv\t\n\t144\t5720\tE\tE\t\t\t\tE\t\t\t\t\t\t\t\t\t\t\t\t\n\"Band 4\n5.725GHz\n~\n5.85GHz\n(~5.9GHz)\"\t149\t5745\tv\tv\tv\tv\t\tv\tv\tv\tv\t\tv\tv\t\t\tv\tv\tv\tv\n\t153\t5765\tv\tv\t\t\t\tv\tv\tv\tv\t\tv\tv\t\t\tv\tv\tv\tv\n\t157\t5785\tv\tv\tv\t\t\tv\tv\tv\tv\t\tv\tv\t\t\tv\tv\tv\tv\n\t161\t5805\tv\tv\t\t\t\tv\tv\tv\tv\t\tv\tv\t\t\tv\tv\tv\tv\n\t165\t5825\tv\tv\tP\tP\t\tv\tv\tv\tv\t\tv\tv\t\t\tv\tv\tv\t\n\t169\t5845\tP\tP\t\t\t\tP\t\t\t\t\t\t\t\t\t\t\t\t\n\t173\t5865\tP\tP\tP\t\t\tP\t\t\t\t\t\t\t\t\t\t\t\t\n\t177\t5885\tP\tP\t\t\t\tP\t\t\t\t\t\t\t\t\t\t\t\t\nChannel Count\t\t\t28\t28\t14\t7\t0\t28\t24\t20\t24\t19\t5\t13\t8\t19\t20\t22\t15\t12\n\t\t\tE: FCC accepted the ask for CH144 from Accord.\t\t\t\t\tPS: 160MHz  80MHz+80MHz{H\t\t\tArgentina\tBelgium (Q)\t\tIndia\tIsrael\t\t\tRussia\t\t\n\t\t\tP: Customer's requirement from James.\t\t\t\t\t\t\t\tAustralia\tThe Netherlands ()\t\tMexico\tTurkey\t\t\tUkraine\t\t\n\t\t\t\t\t\t\t\t\t\t\tNew Zealand\tUK (^)\t\tSingapore\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tBrazil\tSwitzerland (h)\t\t\t\t\t\t\t\t\n\n\n*/\n\n/*---------------------------Define Local Constant---------------------------*/\n\n\n// define Maximum Power v.s each band for each region \n// ISRAEL\n// Format:\n// RT_CHANNEL_DOMAIN_Region ={{{Chnl_Start, Chnl_end, Pwr_dB_Max}, {Chn2_Start, Chn2_end, Pwr_dB_Max}, {Chn3_Start, Chn3_end, Pwr_dB_Max}, {Chn4_Start, Chn4_end, Pwr_dB_Max}, {Chn5_Start, Chn5_end, Pwr_dB_Max}}, Limit_Num} */\n// RT_CHANNEL_DOMAIN_FCC ={{{01,11,30}, {36,48,17}, {52,64,24}, {100,140,24}, {149,165,30}}, 5} \n// \"NR\" is non-release channle.\n// Issue--- Israel--Russia--New Zealand\n// DOMAIN_01= (2G_WORLD, 5G_NULL)\n// DOMAIN_02= (2G_ETSI1, 5G_NULL)\n// DOMAIN_03= (2G_FCC1, 5G_NULL)\n// DOMAIN_04= (2G_MKK1, 5G_NULL)\n// DOMAIN_05= (2G_ETSI2, 5G_NULL)\n// DOMAIN_06= (2G_FCC1, 5G_FCC1)\n// DOMAIN_07= (2G_WORLD, 5G_ETSI1)\n// DOMAIN_08= (2G_MKK1, 5G_MKK1)\n// DOMAIN_09= (2G_WORLD, 5G_KCC1)\n// DOMAIN_10= (2G_WORLD, 5G_FCC2)\n// DOMAIN_11= (2G_WORLD, 5G_FCC3)----india\n// DOMAIN_12= (2G_WORLD, 5G_FCC4)----Venezuela\n// DOMAIN_13= (2G_WORLD, 5G_FCC5)----China\n// DOMAIN_14= (2G_WORLD, 5G_FCC6)----Israel\n// DOMAIN_15= (2G_FCC1, 5G_FCC7)-----Canada\n// DOMAIN_16= (2G_WORLD, 5G_ETSI2)---Australia\n// DOMAIN_17= (2G_WORLD, 5G_ETSI3)---Russia\n// DOMAIN_18= (2G_MKK1, 5G_MKK2)-----Japan\n// DOMAIN_19= (2G_MKK1, 5G_MKK3)-----Japan\n// DOMAIN_20= (2G_FCC1, 5G_NCC1)-----Taiwan\n// DOMAIN_21= (2G_FCC1, 5G_NCC1)-----Taiwan\n\n\nstatic\tRT_CHANNEL_PLAN_MAXPWR\tChnlPlanPwrMax_2G[] = {\n\n\t// 2G_WORLD, \n\t{{1, 13, 20}, 1},\t\n\n\t// 2G_ETSI1\n\t{{1, 13, 20}, 1},\n\n\t/* RT_CHANNEL_DOMAIN_ETSI */\n\t{{{1, 11, 17}, {40, 56, 17}, {60, 128, 17}, {0, 0, 0}, {149, 165, 17}}, 4},\n\n\t// RT_CHANNEL_DOMAIN_MKK\n\t{{{1, 11, 17}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, 1},\n\n\t// Add new channel plan mex power table.\n\t// ......\n\t};\n\n\n/*\n//===========================================1:(2G_WORLD, 5G_NULL)\n\nRT_CHANNEL_PLAN_MAXPWR\tRT_DOMAIN_01 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1} \n\n//===========================================2:(2G_ETSI1, 5G_NULL)\n\nRT_DOMAIN_02 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1}\n\n//===========================================3:(2G_FCC1, 5G_NULL)\n\nRT_DOMAIN_03 ={{{01,11,30}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1}\n\n//===========================================4:(2G_MKK1, 5G_NULL)\n\nRT_DOMAIN_04 ={{{01,14,23}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1}\n\n//===========================================5:(2G_ETSI2, 5G_NULL)\n\nRT_DOMAIN_05 ={{{10,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}}, 1}\n\n//===========================================6:(2G_FCC1, 5G_FCC1)\n\nRT_DOMAIN_06 ={{{01,13,30}, {36,48,17}, {52,64,24}, {100,140,24}, {149,165,30}}, 5}\n\n//===========================================7:(2G_WORLD, 5G_ETSI1)\n\nRT_DOMAIN_07 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {NR,NR,0}}, 4}\n\n//===========================================8:(2G_MKK1, 5G_MKK1)\n\nRT_DOMAIN_08 ={{{01,14,23}, {36,48,23}, {52,64,23}, {100,140,23}, {NR,NR,0}}, 4}\n\n//===========================================9:(2G_WORLD, 5G_KCC1)\n\nRT_DOMAIN_09 ={{{01,13,20}, {36,48,17}, {52,64,23}, {100,124,23}, {149,165,23}}, 5}\n\n//===========================================10:(2G_WORLD, 5G_FCC2)\n\nRT_DOMAIN_10 ={{{01,13,20}, {36,48,17}, {NR,NR,0}, {NR,NR,0}, {149,165,30}}, 3}\n\n//===========================================11:(2G_WORLD, 5G_FCC3)\nRT_DOMAIN_11 ={{{01,13,20}, {36,48,23}, {52,64,23}, {NR,NR,0}, {149,165,23}}, 4}\n\n//===========================================12:(2G_WORLD, 5G_FCC4)\nRT_DOMAIN_12 ={{{01,13,20}, {36,48,24}, {52,64,24}, {NR,NR,0}, {149,161,27}}, 4}\n\n//===========================================13:(2G_WORLD, 5G_FCC5)\nRT_DOMAIN_13 ={{{01,13,20}, {NR,NR,0}, {NR,NR,0}, {NR,NR,0}, {149,165,27}}, 2}\n\n//===========================================14:(2G_WORLD, 5G_FCC6)\nRT_DOMAIN_14 ={{{01,13,20}, {36,48,17}, {52,64,17}, {NR,NR,0}, {NR,NR,0}}, 3}\n\n//===========================================15:(2G_FCC1, 5G_FCC7)\nRT_DOMAIN_15 ={{{01,11,30}, {36,48,23}, {52,64,24}, {100,140,24}, {149,165,30}}, 5}\n\n//===========================================16:(2G_WORLD, 5G_ETSI2)\nRT_DOMAIN_16 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {149,165,30}}, 5}\n\n//===========================================17:(2G_WORLD, 5G_ETSI3)\nRT_DOMAIN_17 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,132,30}, {149,165,20}}, 5}\n\n//===========================================18:(2G_MKK1, 5G_MKK2)\nRT_DOMAIN_18 ={{{01,14,23}, {36,48,23}, {52,64,23}, {NR,NR,0}, {NR,NR,0}}, 3}\n\n//===========================================19:(2G_MKK1, 5G_MKK3)\nRT_DOMAIN_19 ={{{01,14,23}, {NR,NR,0}, {NR,NR,0}, {100,140,23}, {NR,NR,0}}, 2}\n\n//===========================================20:(2G_FCC1, 5G_NCC1)\nRT_DOMAIN_20 ={{{01,11,30}, {NR,NR,0}, {56,64,23}, {100,140,24}, {149,165,30}}, 4}\n\n//===========================================21:(2G_FCC1, 5G_NCC2)\nRT_DOMAIN_21 ={{{01,11,30}, {NR,NR,0}, {56,64,23}, {NR,NR,0}, {149,165,30}}, 3}\n\n//===========================================22:(2G_WORLD, 5G_FCC3)\nRT_DOMAIN_22 ={{{01,13,24}, {36,48,20}, {52,64,24}, {NR,NR,0}, {149,165,30}}, 4}\n\n//===========================================23:(2G_WORLD, 5G_ETSI2)\nRT_DOMAIN_23 ={{{01,13,20}, {36,48,23}, {52,64,23}, {100,140,30}, {149,165,30}}, 5}\n\n*/\n\n//\n// Counter & Realtek Channel plan transfer table.\n//\nRT_CHNL_CTRY_TBL\tRtCtryChnlTbl[] = \n{\n\n\t{\n\t\tRT_CTRY_AL,\t\t\t\t\t\t\t//\t\"Albaniaڥ\"\t\t\t\t\t\n\t\t\"AL\",\n\t\tRT_2G_WORLD,\n\t\tRT_5G_WORLD,\t\t\n\t\tRT_CHANNEL_DOMAIN_UNDEFINED\t\t\t// 2G/5G world.\n\t},\n#if 0\t\n\t{\n\t\tRT_CTRY_BB,\t\t\t\t\t\t\t//  \"Barbadosڤڦh\"\t\t\t\t\n\t\t\"BB\",\n\t\tRT_2G_WORLD,\n\t\tRT_5G_NULL,\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x20\t\t// 2G world. 5G_NULL\n\t},\n\t\n\t{\n\t\tRT_CTRY_DE,\t\t\t\t\t\t\t//  \"Germanyw\"\t\t\t\t\t\n\t\t\"DE\",\n\t\tRT_2G_WORLD,\n\t\tRT_5G_ETSI1,\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x26\n\t},\n\t\n\t{\n\t\tRT_CTRY_US,\t\t\t\t\t\t\t//  \"Germanyw\"\t\t\t\t\t\n\t\t\"US\",\n\t\tRT_2G_FCC1,\n\t\tRT_5G_FCC7,\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x34\n\t},\n\n\t{\n\t\tRT_CTRY_JP,\t\t\t\t\t\t\t//  \"Germanyw\"\t\t\t\t\t\n\t\t\"JP\",\n\t\tRT_2G_MKK1,\n\t\tRT_5G_MKK1,\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x34\n\t},\n\t\t\n\t{\n\t\tRT_CTRY_TW,\t\t\t\t\t\t\t//  \"Germanyw\"\t\t\t\t\t\n\t\t\"TW\",\n\t\tRT_2G_FCC1,\n\t\tRT_5G_NCC1,\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x39\n\t},\t\n#endif\n\n};\t// RtCtryChnlTbl\n\n//\n// Realtek Defined Channel plan.\n//\n#if 0\n\nstatic\tRT_CHANNEL_PLAN_NEW\t\tRtChnlPlan[] =\n{\n\t// Channel Plan   0x20.\n\t{\n\t\t&RtCtryChnlTbl[1],\t\t\t\t\t// RT_CHNL_CTRY_TBL Country & channel plan transfer table.\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x20,\t\t// RT_CHANNEL_DOMAIN RT Channel Plan Define \n\t\tRT_2G_WORLD,\t\t\t\t\t\t// RT_REGULATION_2G\n\t\tRT_5G_NULL,\t\t\t\t\t\t\t// RT_REGULATION_5G\n\t\tRT_WORLD,\t\t\t\t\t\t\t// RT_REGULATION_CMN RT Regulatory domain definition.\n\t\tRT_SREQ_NA,\t\t\t\t\t\t\t// RT Channel plan special & customerize requirement.\n\t\t\n\t\tCHNL_RT_2G_WORLD,\n\t\tCHNL_RT_2G_WORLD_SCAN_TYPE,\n\t\t&ChnlPlanPwrMax_2G[0],\n\n\t\tCHNL_RT_5G_NULL,\n\t\tCHNL_RT_5G_NULL_SCAN_TYPE,\n\n\t\t\n\t},\n\t\n\t// Channel Plan   0x26.\n\t{\n\t\t&RtCtryChnlTbl[1],\t\t\t\t\t// RT_CHNL_CTRY_TBL Country & channel plan transfer table.\t\t\n\t\tRT_CHANNEL_DOMAIN_EFUSE_0x26,\t\t// RT_CHANNEL_DOMAIN RT Channel Plan Define \n\t\tRT_2G_WORLD,\t\t\t\t\t\t// RT_REGULATION_2G\n\t\tRT_5G_ETSI1,\t\t\t\t\t\t// RT_REGULATION_5G\n\t\tRT_WORLD,\t\t\t\t\t\t\t// RT_REGULATION_CMN RT Regulatory domain definition.\n\t\tRT_SREQ_NA,\t\t\t\t\t\t\t// RT Channel plan special & customerize requirement.\n\t\t\n\t\tCHNL_RT_2G_WORLD,\t\t\t\t\t// 2G workd cannel\n\t\tCHNL_RT_2G_WORLD_SCAN_TYPE,\n\t\t&ChnlPlanPwrMax_2G[1],\n\t\t\n\t\tCHNL_RT_5G_ETSI1,\n\t\tCHNL_RT_5G_ETSI1_SCAN_TYPE,\n\t\t\n\t}\n\t\n\t\n};\n#endif\n\n\n\n\n"
  },
  {
    "path": "hal/phydm/rtchnlplan.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef\t__RT_CHANNELPLAN_H__\n#define __RT_CHANNELPLAN_H__\n\ntypedef enum _RT_CHANNEL_DOMAIN_NEW\n{\n\n\t//===== Add new channel plan above this line ===============//\n\n\t// For new architecture we define different 2G/5G CH area for all country.\n\t// 2.4 G only\n\tRT_CHANNEL_DOMAIN_2G_WORLD_5G_NULL\t\t\t\t= 0x20,\n\tRT_CHANNEL_DOMAIN_2G_ETSI1_5G_NULL\t\t\t\t= 0x21,\n\tRT_CHANNEL_DOMAIN_2G_FCC1_5G_NULL\t\t\t\t= 0x22,\n\tRT_CHANNEL_DOMAIN_2G_MKK1_5G_NULL\t\t\t\t= 0x23,\n\tRT_CHANNEL_DOMAIN_2G_ETSI2_5G_NULL\t\t\t\t= 0x24,\n\t// 2.4 G + 5G type 1\n\tRT_CHANNEL_DOMAIN_2G_FCC1_5G_FCC1\t\t\t\t= 0x25,\n\tRT_CHANNEL_DOMAIN_2G_WORLD_5G_ETSI1\t\t\t\t= 0x26,\n\t//RT_CHANNEL_DOMAIN_2G_WORLD_5G_ETSI1\t\t\t\t= 0x27,\n\t// .....\n\n\tRT_CHANNEL_DOMAIN_MAX_NEW,\n\t\n}RT_CHANNEL_DOMAIN_NEW, *PRT_CHANNEL_DOMAIN_NEW;\n\n\n#if 0\n#define DOMAIN_CODE_2G_WORLD \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13\n#define DOMAIN_CODE_2G_ETSI1 \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13\n#define DOMAIN_CODE_2G_ETSI2 \\\n        {1,2,3,4,5,6,7,8,9,10,11}, 11\n#define DOMAIN_CODE_2G_FCC1 \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14\n#define DOMAIN_CODE_2G_MKK1 \\\n        {10,11,12,13}, 4\n\n#define DOMAIN_CODE_5G_ETSI1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19\n#define DOMAIN_CODE_5G_ETSI2 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24\n#define DOMAIN_CODE_5G_ETSI3 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22\n#define DOMAIN_CODE_5G_FCC1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24\n#define DOMAIN_CODE_5G_FCC2 \\\n        {36,40,44,48,149,153,157,161,165}, 9\n#define DOMAIN_CODE_5G_FCC3 \\\n        {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13\n#define DOMAIN_CODE_5G_FCC4 \\\n        {36,40,44,48,52,56,60,64,149,153,157,161}, 12\n#define DOMAIN_CODE_5G_FCC5 \\\n        {149,153,157,161,165}, 5\n#define DOMAIN_CODE_5G_FCC6 \\\n        {36,40,44,48,52,56,60,64}, 8\n#define DOMAIN_CODE_5G_FCC7 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define DOMAIN_CODE_5G_IC1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define DOMAIN_CODE_5G_KCC1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20\n#define DOMAIN_CODE_5G_MKK1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19\n#define DOMAIN_CODE_5G_MKK2 \\\n        {36,40,44,48,52,56,60,64}, 8\n#define DOMAIN_CODE_5G_MKK3 \\\n        {100,104,108,112,116,120,124,128,132,136,140}, 11\n#define DOMAIN_CODE_5G_NCC1 \\\n        {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24\n#define DOMAIN_CODE_5G_NCC2 \\\n        {56,60,64,149,153,157,161,165}, 8  \t\t\t\n#define UNDEFINED \\\n        {0}, 0\n#endif\n\n//\n//\n//\n/*\n\nCountries\t\t\t\t\t\t\t\"Country Abbreviation\"\tDomain Code\t\t\t\t\tSKU's\tCh# of 20MHz\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2G\t\t\t5G\t\t\t\t\t\tCh# of 40MHz\n\"Albaniaڥ\"\t\t\t\t\tAL\t\t\t\t\t\t\t\t\t\t\t\t\tLocal Test\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t            \t\n\"AlgeriaΧQ\"\t\t\t\t\tDZ\t\t\t\t\t\t\t\t\tCE TCF\t    \t\n\t\t\t\t\t                    \t\t\t\t\t        \t            \t\n\"Antigua & Barbudawʮq&ڥF\"\tAG\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t                    \t\t\t\t\t        \t        \t\t\n\"Argentinaڧ\"\t\t\t\t\tAR\t\t\t\t\t\t2G_WORLD\t\t\t\t\tLocal Test\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t        \t\t\n\"ArmeniaȬ\"\t\t\t\t\tAM\t\t\t\t\t\t2G_WORLD\t\t\t\t\tETSI\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t        \t\t\n\"Aruba|ڮq\"\t\t\t\t\t\tAW\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"AustraliaDw\"\t\t\t\t\t\tAU\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI2\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"AustriaaQ\"\t\t\t\t\t\tAT\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"Azerbaijan\"\t\t\t\tAZ\t\t\t\t\t\t2G_WORLD\t\t\t\t\tCE TCF\t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"Bahamasګ\"\t\t\t\t\t\tBS\t\t\t\t\t\t2G_WORLD\t\t\t\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Barbadosڤڦh\"\t\t\t\t\tBB\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"BelgiumQ\"\t\t\t\t\t\tBE\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Bermudaʼ}F\"\t\t\t\t\t\tBM\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t        \t\t\n\"Brazilڦ\"\t\t\t\t\t\tBR\t\t\t\t\t\t2G_WORLD\t\t\t\t\tLocal Test\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"BulgariaO[Q\"\t\t\t\t\tBG\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Canada[j\"\t\t\t\t\t\tCA\t\t\t\t\t\t2G_FCC1\t\t\t5G_FCC7\t\tIC / FCC\tIC / FCC\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"Cayman Islands}Ҹsq\"\t\t\tKY\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"ChileQ\"\t\t\t\t\t\t\tCL\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    \t\n\"China\"\t\t\t\t\t\t\tCN\t\t\t\t\t\t2G_WORLD\t\t5G_FCC5\t\tH?i2002j353? \t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"Columbiaۤ\"\t\t\t\t\tCO\t\t\t\t\t\t2G_WORLD\t\t\t\t\tVoluntary \t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"Costa RicaF[\"\t\t\t\tCR\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"Cyprus\"\t\t\t\t\tCY\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Czech J\"\t\t\t\t\t\tCZ\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Denmark\"\t\t\t\t\t\tDK\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"Dominican Republich[@M\"\tDO\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"EgyptJ\"\tEG\t2G_WORLD\t\t\tCE T\t\t\t\t\t\t\t\t\t\t\t\tCF\t    \t\n\t\t\t\t\t                    \t\t\t\t\t        \t\n\"El Salvadorĺ˦h\"\t\t\t\tSV\t\t\t\t\t\t2G_WORLD\t\t\t\t\tVoluntary\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"EstoniaRF\"\t\t\t\t\tEE\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Finland\"\t\t\t\t\t\tFI\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Francek\"\t\t\t\t\t\tFR\t\t\t\t\t\t\t\t\t\t5G_E\t\tTSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Germanyw\"\t\t\t\t\t\tDE\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Greece þ\"\t\t\t\t\t\tGR\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Guamq\"\t\t\t\t\t\t\tGU\t\t\t\t\t\t2G_WORLD\t\t\t\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Guatemalaʦa\"\t\t\t\t\tGT\t\t\t\t\t\t2G_WORLD\t\t\t\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Haitia\"\t\t\t\t\t\t\tHT\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"HondurasԴ\"\t\t\t\t\tHN\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"HungaryIQ\"\t\t\t\t\t\tHU\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"IcelandBq\"\t\t\t\t\t\tIS\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"IndiaL\"\t\t\t\t\t\t\tIN\t\t\t\t\t\t2G_WORLD\t\t5G_FCC3\t\tFCC/CE TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"IrelandR\"\t\t\t\t\t\tIE\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"IsraelHC\"\t\t\t\t\t\tIL\t\t\t\t\t\t\t\t\t\t5G_F\t\tCC6\tCE TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"ItalyqjQ\"\t\t\t\t\t\tIT\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Japan饻\"\t\t\t\t\t\t\tJP\t\t\t\t\t\t2G_MKK1\t\t\t5G_MKK1\t\tMKK\tMKK\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t    \t\n\"Korea\"\t\t\t\t\t\t\tKR\t\t\t\t\t\t2G_WORLD\t\t5G_KCC1\t\tKCC\tKCC\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"LatviaԲ\"\t\t\t\t\tLV\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Lithuania߳{\"\t\t\t\t\tLT\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Luxembourgc˳\"\t\t\t\t\tLU\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"MalaysiaӦ\"\t\t\t\t\tMY\t\t\t\t\t\t2G_WORLD\t\t\t\t\tLocal Test\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"MaltaL\"\t\t\t\t\t\tMT\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Mexico\"\t\t\t\t\t\tMX\t\t\t\t\t\t2G_WORLD\t\t5G_FCC3\t\tLocal Test\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Morocco\"\t\t\t\t\t\tMA\t\t\t\t\t\t\t\t\t\t\t\t\tCE TCF\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Netherlands\"\t\t\t\t\tNL\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"New Zealandæ\"\t\t\t\t\tNZ\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI2\t\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Norway\"\t\t\t\t\t\tNO\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Panamaڮ \"\t\t\t\t\t\tPA\t\t\t\t\t\t2G_FCC1\t\t\t\t\t\tVoluntary\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Philippines߻\"\t\t\t\t\tPH\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC TCF\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Polandi\"\t\t\t\t\t\tPL\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Portugal\"\t\t\t\t\tPT\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"Romaniaù\"\t\t\t\t\tRO\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"RussiaXù\"\t\t\t\t\t\tRU\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI3\tCE TCF\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"Saudi ArabiaFaԧB\"\t\t\tSA\t\t\t\t\t\t2G_WORLD\t\t\t\t\tCE TCF\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"Singapores[Y\"\t\t\t\t\tSG\t\t\t\t\t\t2G_WORLD\t\t\t\t\n\t\t\t\t\t\t\t\t\t    \t\t\t\t\t        \t\n\"SlovakiaJ\"\t\t\t\t\tSK\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"Slovenia\"\t\t\t\tSI\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"South AfricanD\"\t\t\t\t\tZA\t\t\t\t\t\t2G_WORLD\t\t\t\t\tCE TCF\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"SpainZ\"\t\t\t\t\t\tES\t\t\t\t\t\t\t\t\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Sweden\"\t\t\t\t\t\tSE\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"Switzerlandh\"\t\t\t\t\tCH\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"TaiwanOW\"\t\t\t\t\t\tTW\t\t\t\t\t\t2G_FCC1\t\t\t5G_NCC1\tNCC\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Thailand\"\t\t\t\t\t\tTH\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC/CE TCF\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"Turkeygը\"\t\t\t\t\t\tTR\t\t\t\t\t\t2G_WORLD\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t        \t\n\"UkraineQJ\"\t\t\t\t\t\tUA\t\t\t\t\t\t2G_WORLD\t\t\t\t\tLocal Test\t\n\t\t\t\t\t        \t\t    \t\t\t\t\t        \t\n\"United Kingdom^\"\t\t\t\tGB\t\t\t\t\t\t2G_WORLD\t\t5G_ETSI1\tCE\tETSI\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"United States\"\t\t\t\t\tUS\t\t\t\t\t\t2G_FCC1\t\t\t5G_FCC7\t\tFCC\tFCC\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"Venezuelae\"\t\t\t\t\tVE\t\t\t\t\t\t2G_WORLD\t\t5G_FCC4\t\tFCC TCF\t\n\t\t\t\t\t    \t\t\t    \t\t\t\t\t        \t\n\"VietnamVn\"\t\t\t\t\t\tVN\t\t\t\t\t\t2G_WORLD\t\t\t\t\tFCC/CE TCF\t\n\t\t\t\t\t\n\n\n*/\n\n// Counter abbervation.\ntypedef enum _RT_COUNTRY_DEFINE_NUM\n{\n\tRT_CTRY_AL,\t\t\t\t//\t\"Albaniaڥ\"\t\t\t\t\t\n\tRT_CTRY_DZ,             //  \"AlgeriaΧQ\"\t\t\t\t\t\n\tRT_CTRY_AG,             //  \"Antigua & Barbudawʮq&ڥF\"\t\n\tRT_CTRY_AR,             //  \"Argentinaڧ\"\t\t\t\t\t\n\tRT_CTRY_AM,             //  \"ArmeniaȬ\"\t\t\t\t\t\n\tRT_CTRY_AW,             //  \"Aruba|ڮq\"\t\t\t\t\t\t\n\tRT_CTRY_AU,             //  \"AustraliaDw\"\t\t\t\t\t\t\n\tRT_CTRY_AT,             //  \"AustriaaQ\"\t\t\t\t\t\t\n\tRT_CTRY_AZ,             //  \"Azerbaijan\"\t\t\t\t\n\tRT_CTRY_BS,             //  \"Bahamasګ\"\t\t\t\t\t\n\tRT_CTRY_BB,             //  \"Barbadosڤڦh\"\t\t\t\t\n\tRT_CTRY_BE,             //  \"BelgiumQ\"\t\t\t\t\t\n\tRT_CTRY_BM,             //  \"Bermudaʼ}F\"\t\t\t\t\t\n\tRT_CTRY_BR,             //  \"Brazilڦ\"\t\t\t\t\t\t\n\tRT_CTRY_BG,             //  \"BulgariaO[Q\"\t\t\t\t\n\tRT_CTRY_CA,             //  \"Canada[j\"\t\t\t\t\t\n\tRT_CTRY_KY,             //  \"Cayman Islands}Ҹsq\"\t\t\t\n\tRT_CTRY_CL,             //  \"ChileQ\"\t\t\t\t\t\t\n\tRT_CTRY_CN,             //  \"China\"\t\t\t\t\t\t\n\tRT_CTRY_CO,             //  \"Columbiaۤ\"\t\t\t\t\n\tRT_CTRY_CR,             //  \"Costa RicaF[\"\t\t\t\n\tRT_CTRY_CY,             //  \"Cyprus\"\t\t\t\t\t\n\tRT_CTRY_CZ,             //  \"Czech J\"\t\t\t\t\t\t\n\tRT_CTRY_DK,             //  \"Denmark\"\t\t\t\t\t\n\tRT_CTRY_DO,             //  \"Dominican Republich[@M\"\t\n\tRT_CTRY_CE,             //  \"EgyptJ\"\tEG\t2G_WORLD\t\t\t\n\tRT_CTRY_SV,             //  \"El Salvadorĺ˦h\"\t\t\t\t\n\tRT_CTRY_EE,             //  \"EstoniaRF\"\t\t\t\t\t\n\tRT_CTRY_FI,             //  \"Finland\"\t\t\t\t\t\t\n\tRT_CTRY_FR,             //  \"Francek\"\t\t\t\t\t\t\n\tRT_CTRY_DE,             //  \"Germanyw\"\t\t\t\t\t\n\tRT_CTRY_GR,             //  \"Greece þ\"\t\t\t\t\t\n\tRT_CTRY_GU,             //  \"Guamq\"\t\t\t\t\t\t\n\tRT_CTRY_GT,             //  \"Guatemalaʦa\"\t\t\t\t\n\tRT_CTRY_HT,             //  \"Haitia\"\t\t\t\t\t\t\n\tRT_CTRY_HN,             //  \"HondurasԴ\"\t\t\t\t\n\tRT_CTRY_HU,             //  \"HungaryIQ\"\t\t\t\t\t\n\tRT_CTRY_IS,             //  \"IcelandBq\"\t\t\t\t\t\n\tRT_CTRY_IN,             //  \"IndiaL\"\t\t\t\t\t\t\n\tRT_CTRY_IE,             //  \"IrelandR\"\t\t\t\t\t\n\tRT_CTRY_IL,             //  \"IsraelHC\"\t\t\t\t\t\n\tRT_CTRY_IT,             //  \"ItalyqjQ\"\t\t\t\t\t\n\tRT_CTRY_JP,             //  \"Japan饻\"\t\t\t\t\t\t\n\tRT_CTRY_KR,             //  \"Korea\"\t\t\t\t\t\t\n\tRT_CTRY_LV,             //  \"LatviaԲ\"\t\t\t\t\t\n\tRT_CTRY_LT,             //  \"Lithuania߳{\"\t\t\t\t\n\tRT_CTRY_LU,             //  \"Luxembourgc˳\"\t\t\t\t\n\tRT_CTRY_MY,             //  \"MalaysiaӦ\"\t\t\t\t\n\tRT_CTRY_MT,             //  \"MaltaL\"\t\t\t\t\t\n\tRT_CTRY_MX,             //  \"Mexico\"\t\t\t\t\t\n\tRT_CTRY_MA,             //  \"Morocco\"\t\t\t\t\t\n\tRT_CTRY_NL,             //  \"Netherlands\"\t\t\t\t\n\tRT_CTRY_NZ,             //  \"New Zealandæ\"\t\t\t\t\n\tRT_CTRY_NO,             //  \"Norway\"\t\t\t\t\t\t\n\tRT_CTRY_PA,             //  \"Panamaڮ \"\t\t\t\t\t\n\tRT_CTRY_PH,             //  \"Philippines߻\"\t\t\t\t\n\tRT_CTRY_PL,             //  \"Polandi\"\t\t\t\t\t\t\n\tRT_CTRY_PT,             //  \"Portugal\"\t\t\t\t\t\n\tRT_CTRY_RO,             //  \"Romaniaù\"\t\t\t\t\n\tRT_CTRY_RU,             //  \"RussiaXù\"\t\t\t\t\t\n\tRT_CTRY_SA,             //  \"Saudi ArabiaFaԧB\"\t\t\t\n\tRT_CTRY_SG,             //  \"Singapores[Y\"\t\t\t\t\n\tRT_CTRY_SK,             //  \"SlovakiaJ\"\t\t\t\t\n\tRT_CTRY_SI,             //  \"Slovenia\"\t\t\t\t\n\tRT_CTRY_ZA,             //  \"South AfricanD\"\t\t\t\t\n\tRT_CTRY_ES,             //  \"SpainZ\"\t\t\t\t\t\n\tRT_CTRY_SE,             //  \"Sweden\"\t\t\t\t\t\t\n\tRT_CTRY_CH,             //  \"Switzerlandh\"\t\t\t\t\n\tRT_CTRY_TW,             //  \"TaiwanOW\"\t\t\t\t\t\t\n\tRT_CTRY_TH,             //  \"Thailand\"\t\t\t\t\t\n\tRT_CTRY_TR,             //  \"Turkeygը\"\t\t\t\t\t\n\tRT_CTRY_UA,             //  \"UkraineQJ\"\t\t\t\t\t\n\tRT_CTRY_GB,             //  \"United Kingdom^\"\t\t\t\t\n\tRT_CTRY_US,             //  \"United States\"\t\t\t\t\n\tRT_CTRY_VE,             //  \"Venezuelae\"\t\t\t\t\n\tRT_CTRY_VN,             //  \"VietnamVn\"\t\t\t\t\t\n\tRT_CTRY_MAX,            //  \n\t\n}RT_COUNTRY_NAME, *PRT_COUNTRY_NAME;\n    \n// Scan type including active and passive scan.\ntypedef enum _RT_SCAN_TYPE_NEW\n{\n\tSCAN_NULL,\n\tSCAN_ACT,\n\tSCAN_PAS,\n\tSCAN_BOTH,\n}RT_SCAN_TYPE_NEW, *PRT_SCAN_TYPE_NEW;\n    \n\n// Power table sample.\n\ntypedef struct _RT_CHNL_PLAN_LIMIT\n{\n\tu2Byte\tChnl_Start;\n\tu2Byte\tChnl_end;\t\n\t\n\tu2Byte\tFreq_Start;\n\tu2Byte\tFreq_end;\t\n}RT_CHNL_PLAN_LIMIT, *PRT_CHNL_PLAN_LIMIT;\n\n    \n//    \n// 2.4G Regulatory Domains\n//\ntypedef enum _RT_REGULATION_DOMAIN_2G\n{\n\tRT_2G_NULL,   \n\tRT_2G_WORLD,\n\tRT_2G_ETSI1,\n\tRT_2G_FCC1,\n\tRT_2G_MKK1,\n\tRT_2G_ETSI2\t\n\t\n}RT_REGULATION_2G, *PRT_REGULATION_2G;\n\n\n//typedef struct _RT_CHANNEL_BEHAVIOR\n//{\n//\tu1Byte\tChnl;\n//\tRT_SCAN_TYPE_NEW\n//\t\n//}RT_CHANNEL_BEHAVIOR, *PRT_CHANNEL_BEHAVIOR;\n\n//typedef struct _RT_CHANNEL_PLAN_TYPE\n//{\n//\tRT_CHANNEL_BEHAVIOR\t\t\n//\tu1Byte\t\t\t\t\tChnl_num;\n//}RT_CHNL_PLAN_TYPE, *PRT_CHNL_PLAN_TYPE;\n\n//\n// 2.4G Channel Number\n// Channel definition & number\n//\n#define CHNL_RT_2G_NULL \\\n        {0}, 0\n#define CHNL_RT_2G_WORLD \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13\n#define CHNL_RT_2G_WORLD_TEST \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13\n\n#define CHNL_RT_2G_EFSI1 \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13}, 13\n#define CHNL_RT_2G_FCC1 \\\n        {1,2,3,4,5,6,7,8,9,10,11}, 11\n#define CHNL_RT_2G_MKK1 \\\n        {1,2,3,4,5,6,7,8,9,10,11,12,13,14}, 14\n#define CHNL_RT_2G_ETSI2 \\\n        {10,11,12,13}, 4\n\n//\n// 2.4G Channel Active or passive scan.\n//\n#define CHNL_RT_2G_NULL_SCAN_TYPE \\\n        {SCAN_NULL}\n#define CHNL_RT_2G_WORLD_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1,0,0}\n#define CHNL_RT_2G_EFSI1_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1,1,1}\n#define CHNL_RT_2G_FCC1_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1}\n#define CHNL_RT_2G_MKK1_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1,1,1,1}\n#define CHNL_RT_2G_ETSI2_SCAN_TYPE \\\n        {1,1,1,1}\n\n\n//\n// 2.4G Band & Frequency Section\n// Freqency start & end / band number\n//\n#define FREQ_RT_2G_NULL \\\n        {0}, 0\n        // Passive scan CH 12, 13\n#define FREQ_RT_2G_WORLD \\\n        {2412, 2472}, 1\n#define FREQ_RT_2G_EFSI1 \\\n        {2412, 2472}, 1\n#define FREQ_RT_2G_FCC1 \\\n        {2412, 2462}, 1\n#define FREQ_RT_2G_MKK1 \\\n        {2412, 2484}, 1\n#define FREQ_RT_2G_ETSI2 \\\n        {2457, 2472}, 1\n\n\n//    \n// 5G Regulatory Domains\n//\ntypedef enum _RT_REGULATION_DOMAIN_5G\n{   \n\tRT_5G_NULL,\n\tRT_5G_WORLD,\n\tRT_5G_ETSI1,\n\tRT_5G_ETSI2,\n\tRT_5G_ETSI3,\n\tRT_5G_FCC1,\t\n\tRT_5G_FCC2,\n\tRT_5G_FCC3,\n\tRT_5G_FCC4,\n\tRT_5G_FCC5,\n\tRT_5G_FCC6,\n\tRT_5G_FCC7,\n\tRT_5G_IC1,\n\tRT_5G_KCC1,\n\tRT_5G_MKK1,\n\tRT_5G_MKK2,\n\tRT_5G_MKK3,\n\tRT_5G_NCC1,\n\t\n}RT_REGULATION_5G, *PRT_REGULATION_5G;\n\n//\n// 5G Channel Number\n//\n#define CHNL_RT_5G_NULL \\\n        {0}, 0\n#define CHNL_RT_5G_WORLD \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19\n#define CHNL_RT_5G_ETSI1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24\n#define CHNL_RT_5G_ETSI2 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22\n#define CHNL_RT_5G_ETSI3 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24\n#define CHNL_RT_5G_FCC1 \\\n        {36,40,44,48,149,153,157,161,165}, 9\n#define CHNL_RT_5G_FCC2 \\\n        {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13\n#define CHNL_RT_5G_FCC3 \\\n        {36,40,44,48,52,56,60,64,149,153,157,161}, 12\n#define CHNL_RT_5G_FCC4 \\\n        {149,153,157,161,165}, 5\n#define CHNL_RT_5G_FCC5 \\\n        {36,40,44,48,52,56,60,64}, 8\n#define CHNL_RT_5G_FCC6 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define CHNL_RT_5G_FCC7 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define CHNL_RT_5G_IC1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20\n#define CHNL_RT_5G_KCC1 \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19\n#define CHNL_RT_5G_MKK1 \\\n        {36,40,44,48,52,56,60,64}, 8\n#define CHNL_RT_5G_MKK2 \\\n        {100,104,108,112,116,120,124,128,132,136,140}, 11\n#define CHNL_RT_5G_MKK3 \\\n        {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24\n#define CHNL_RT_5G_NCC1 \\\n        {56,60,64,149,153,157,161,165}, 8  \t\n\n//\n// 5G Channel Active or passive scan.\n//\n#define CHNL_RT_5G_NULL_SCAN_TYPE \\\n        {SCAN_NULL}\n#define CHNL_RT_5G_WORLD_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}\n#define CHNL_RT_5G_ETSI1_SCAN_TYPE \\\n        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}\n#define CHNL_RT_5G_ETSI2_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,149,153,157,161,165}, 22\n#define CHNL_RT_5G_ETSI3_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}, 24\n#define CHNL_RT_5G_FCC1_SCAN_TYPE \\\n        {36,40,44,48,149,153,157,161,165}, 9\n#define CHNL_RT_5G_FCC2_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,149,153,157,161,165}, 13\n#define CHNL_RT_5G_FCC3_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,149,153,157,161}, 12\n#define CHNL_RT_5G_FCC4_SCAN_TYPE \\\n        {149,153,157,161,165}, 5\n#define CHNL_RT_5G_FCC5_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64}, 8\n#define CHNL_RT_5G_FCC6_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define CHNL_RT_5G_FCC7_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 20\n#define CHNL_RT_5G_IC1_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,149,153,157,161,165}, 20\n#define CHNL_RT_5G_KCC1_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140}, 19\n#define CHNL_RT_5G_MKK1_SCAN_TYPE \\\n        {36,40,44,48,52,56,60,64}, 8\n#define CHNL_RT_5G_MKK2_SCAN_TYPE \\\n        {100,104,108,112,116,120,124,128,132,136,140}, 11\n#define CHNL_RT_5G_MKK3_SCAN_TYPE \\\n        {56,60,64,100,104,108,112,116,136,140,149,153,157,161,165}, 24\n#define CHNL_RT_5G_NCC1_SCAN_TYPE \\\n        {56,60,64,149,153,157,161,165}, 8  \t\n\n//    \n// Global Regulation\n//\ntypedef enum _RT_REGULATION_COMMON\n{\n\tRT_WORLD,   \n\tRT_FCC,   \n\tRT_MKK,\n\tRT_ETSI,\n\tRT_IC,\n\tRT_CE,\n\tRT_NCC,\n\t\n}RT_REGULATION_CMN, *PRT_REGULATION_CMN;\n\n\n\n//    \n// Special requirement for different regulation domain.\n// For internal test or customerize special request.\n//\ntypedef enum _RT_CHNLPLAN_SREQ\n{\n\tRT_SREQ_NA\t\t\t\t\t\t= 0x0,\n\tRT_SREQ_2G_ADHOC_11N\t\t\t= 0x00000001,\n\tRT_SREQ_2G_ADHOC_11B\t\t\t= 0x00000002,\n\tRT_SREQ_2G_ALL_PASS\t\t\t\t= 0x00000004,\n\tRT_SREQ_2G_ALL_ACT\t\t\t\t= 0x00000008,\t\n\tRT_SREQ_5G_ADHOC_11N\t\t\t= 0x00000010,\n\tRT_SREQ_5G_ADHOC_11AC\t\t\t= 0x00000020,\n\tRT_SREQ_5G_ALL_PASS\t\t\t\t= 0x00000040,\n\tRT_SREQ_5G_ALL_ACT\t\t\t\t= 0x00000080,\n\tRT_SREQ_C1_PLAN\t\t\t\t\t= 0x00000100,\t\n\tRT_SREQ_C2_PLAN\t\t\t\t\t= 0x00000200,\t\n\tRT_SREQ_C3_PLAN\t\t\t\t\t= 0x00000400,\t\n\tRT_SREQ_C4_PLAN\t\t\t\t\t= 0x00000800,\t\n\tRT_SREQ_NFC_ON\t\t\t\t\t= 0x00001000,\t\n\tRT_SREQ_MASK\t\t\t\t\t= 0x0000FFFF,   /* Requirements bit mask */\n\t\n}RT_CHNLPLAN_SREQ, *PRT_CHNLPLAN_SREQ;\n\n\n//\n// RT_COUNTRY_NAME & RT_REGULATION_2G & RT_REGULATION_5G transfer table\n// \n//\ntypedef struct _RT_CHANNEL_PLAN_COUNTRY_TRANSFER_TABLE\n{   \n\t//\n\t// Define countery domain and corresponding \n\t//\t\n\tRT_COUNTRY_NAME\t\tCountry_Enum;\n\tchar\t\t\t\tCountry_Name[3];\n\t\n\t//char\t\tDomain_Name[12];\n\tRT_REGULATION_2G\tDomain_2G;\t\n\n\tRT_REGULATION_5G\tDomain_5G;\t\n\n\tRT_CHANNEL_DOMAIN\tRtChDomain;\n\t//u1Byte\t\tCountry_Area;\n    \n}RT_CHNL_CTRY_TBL, *PRT_CHNL_CTRY_TBL;\n    \n\n#define\t\tRT_MAX_CHNL_NUM_2G\t\t13\n#define\t\tRT_MAX_CHNL_NUM_5G\t\t44\t\n\n// Power table sample.\n\ntypedef struct _RT_CHNL_PLAN_PWR_LIMIT\n{\n\tu2Byte\tChnl_Start;\n\tu2Byte\tChnl_end;\n\tu1Byte\tdB_Max;\n\tu2Byte\tmW_Max;\n}RT_CHNL_PWR_LIMIT, *PRT_CHNL_PWR_LIMIT;\n\n\n#define\t\tRT_MAX_BAND_NUM\t\t\t5\n\ntypedef struct _RT_CHANNEL_PLAN_MAXPWR\n{\n//\tSTRING_T\n\tRT_CHNL_PWR_LIMIT\tChnl[RT_MAX_BAND_NUM];\n\tu1Byte\t\t\t\tBand_Useful_Num;\n\n\t\n}RT_CHANNEL_PLAN_MAXPWR, *PRT_CHANNEL_PLAN_MAXPWR;\n\n\n//\n// Power By Rate Table.\n//\n\n\n\ntypedef struct _RT_CHANNEL_PLAN_NEW\n{   \n\t//\n\t// Define countery domain and corresponding \n\t//\n\t//char\t\tCountry_Name[36];\n\t//u1Byte\t\tCountry_Enum;\n\t\n\t//char\t\tDomain_Name[12];\n\n\t\n\tPRT_CHNL_CTRY_TBL\t\tpCtryTransfer;\n\t\n\tRT_CHANNEL_DOMAIN\t\tRtChDomain;\t\n\n\tRT_REGULATION_2G\t\tDomain_2G;\n\n\tRT_REGULATION_5G\t\tDomain_5G;\t\n\n\tRT_REGULATION_CMN\t\tRegulator;\n\n\tRT_CHNLPLAN_SREQ\t\tChnlSreq;\n\t\n\t//RT_CHNL_PLAN_LIMIT\t\tRtChnl;\n\t\t\n\tu1Byte\tChnl2G[MAX_CHANNEL_NUM];\t\t\t\t// CHNL_RT_2G_WORLD\n\tu1Byte\tLen2G;\n\tu1Byte\tChnl2GScanTp[MAX_CHANNEL_NUM];\t\t\t// CHNL_RT_2G_WORLD_SCAN_TYPE\n\t//u1Byte\tFreq2G[2];\t\t\t\t\t\t\t\t// FREQ_RT_2G_WORLD\n\n\tu1Byte\tChnl5G[MAX_CHANNEL_NUM];\t\t\t\t\n\tu1Byte\tLen5G;\n\tu1Byte\tChnl5GScanTp[MAX_CHANNEL_NUM];\n\t//u1Byte\tFreq2G[2];\t\t\t\t\t\t\t\t// FREQ_RT_2G_WORLD\n\n\tRT_CHANNEL_PLAN_MAXPWR\tChnlMaxPwr;\n\t\n    \n}RT_CHANNEL_PLAN_NEW, *PRT_CHANNEL_PLAN_NEW;\n    \n    \n#endif\t// __RT_CHANNELPLAN_H__\n    \n    \n    \n    \n \n"
  },
  {
    "path": "hal/phydm/rtl8814a/hal8814areg_odm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n//============================================================\n/* File Name: hal8814areg_odm.h */\n//\n// Description:\n//\n// This file is for RTL8814A register definition.\n//\n//\n//============================================================\n#ifndef\t__HAL_8814A_REG_H__\n#define __HAL_8814A_REG_H__\n\n//\n// Register Definition\n//\n#define TRX_ANTDIV_PATH             0x860\n#define RX_ANTDIV_PATH              0xb2c\n#define\tODM_R_A_AGC_CORE1_8814A\t\t0xc50\n\n\n//\n// Bitmap Definition\n//\n#define\tBIT_FA_RESET_8814A\t\t\tBIT0\n\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_bb.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\nstatic BOOLEAN\nCheckPositive(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2,\n\tIN\tconst u4Byte  Condition3,\n\tIN\tconst u4Byte  Condition4\n)\n{\n\tu1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA*/ \n\t\t\t\t((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */\n\t\t\t\t((pDM_Odm->BoardType & BIT2) >> 2) << 4;  /* _BT*/  \n\n\tu4Byte\tcond1   = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4;\n\tu4Byte    driver1 = pDM_Odm->CutVersion       << 24 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0xF0) << 16 | \n\t\t\t\tpDM_Odm->SupportPlatform  << 16 | \n\t\t\t\tpDM_Odm->PackageType      << 12 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0x0F) << 8  |\n\t\t\t\t_BoardType;\n\n\tu4Byte    driver2 = (pDM_Odm->TypeGLNA & 0xFF) <<  0 |  \n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF)  <<  8 | \n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF) << 16 | \n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF)  << 24; \n\nu4Byte    driver3 = 0;\n\n\tu4Byte    driver4 = (pDM_Odm->TypeGLNA & 0xFF00) >>  8 |\n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF00) |\n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF00) << 8 |\n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF00)  << 16;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\\n\", cond1, cond2, cond3, cond4));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\\n\", driver1, driver2, driver3, driver4));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Platform, Interface) = (0x%X, 0x%X)\\n\", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Board, Package) = (0x%X, 0x%X)\\n\", pDM_Odm->BoardType, pDM_Odm->PackageType));\n\n\n\t/*============== Value Defined Check ===============*/\n\t/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/\n\t\n\tif (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\n\t\treturn FALSE;\n\tif (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\n\t\treturn FALSE;\n\n\t/*=============== Bit Defined Check ================*/\n\t/* We don't care [31:28] */\n\n\tcond1   &= 0x00FF0FFF; \n\tdriver1 &= 0x00FF0FFF; \n\n\tif ((cond1 & driver1) == cond1) {\n\t\tu4Byte bitMask = 0;\n\n\t\tif ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/\n\t\t\treturn TRUE;\n\n\t\tif ((cond1 & BIT0) != 0) /*GLNA*/\n\t\t\tbitMask |= 0x000000FF;\n\t\tif ((cond1 & BIT1) != 0) /*GPA*/\n\t\t\tbitMask |= 0x0000FF00;\n\t\tif ((cond1 & BIT2) != 0) /*ALNA*/\n\t\t\tbitMask |= 0x00FF0000;\n\t\tif ((cond1 & BIT3) != 0) /*APA*/\n\t\t\tbitMask |= 0xFF000000;\n\n\t\tif (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask)))  /* BoardType of each RF path is matched*/\n\t\t\treturn TRUE;\n\t\telse\n\t\t\treturn FALSE;\n\t} else\n\t\treturn FALSE;\n}\nstatic BOOLEAN\nCheckNegative(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2\n)\n{\n\treturn TRUE;\n}\n\n/******************************************************************************\n*                           AGC_TAB.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_AGC_TAB[] = { \n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFE000003,\n\t\t0x81C, 0xFF000003,\n\t\t0x81C, 0xFE020003,\n\t\t0x81C, 0xFD040003,\n\t\t0x81C, 0xFC060003,\n\t\t0x81C, 0xFB080003,\n\t\t0x81C, 0xFA0A0003,\n\t\t0x81C, 0xF90C0003,\n\t\t0x81C, 0xF80E0003,\n\t\t0x81C, 0xF7100003,\n\t\t0x81C, 0xF6120003,\n\t\t0x81C, 0xF5140003,\n\t\t0x81C, 0xF4160003,\n\t\t0x81C, 0xF3180003,\n\t\t0x81C, 0xF21A0003,\n\t\t0x81C, 0xF11C0003,\n\t\t0x81C, 0xF01E0003,\n\t\t0x81C, 0xEF200003,\n\t\t0x81C, 0xEE220003,\n\t\t0x81C, 0xED240003,\n\t\t0x81C, 0xEC260003,\n\t\t0x81C, 0xEB280003,\n\t\t0x81C, 0xEA2A0003,\n\t\t0x81C, 0xE92C0003,\n\t\t0x81C, 0xE82E0003,\n\t\t0x81C, 0xE7300003,\n\t\t0x81C, 0xE6320003,\n\t\t0x81C, 0xE5340003,\n\t\t0x81C, 0xE4360003,\n\t\t0x81C, 0xE3380003,\n\t\t0x81C, 0xC53A0003,\n\t\t0x81C, 0xC43C0003,\n\t\t0x81C, 0xC33E0003,\n\t\t0x81C, 0xC2400003,\n\t\t0x81C, 0xC1420003,\n\t\t0x81C, 0xA8440003,\n\t\t0x81C, 0xA7460003,\n\t\t0x81C, 0xA6480003,\n\t\t0x81C, 0xA54A0003,\n\t\t0x81C, 0xA44C0003,\n\t\t0x81C, 0xA34E0003,\n\t\t0x81C, 0xA2500003,\n\t\t0x81C, 0x65520003,\n\t\t0x81C, 0x64540003,\n\t\t0x81C, 0x63560003,\n\t\t0x81C, 0x62580003,\n\t\t0x81C, 0x615A0003,\n\t\t0x81C, 0x475C0003,\n\t\t0x81C, 0x465E0003,\n\t\t0x81C, 0x45600003,\n\t\t0x81C, 0x44620003,\n\t\t0x81C, 0x43640003,\n\t\t0x81C, 0x42660003,\n\t\t0x81C, 0x41680003,\n\t\t0x81C, 0x416A0003,\n\t\t0x81C, 0x416C0003,\n\t\t0x81C, 0x416E0003,\n\t\t0x81C, 0x41700003,\n\t\t0x81C, 0x41720003,\n\t\t0x81C, 0x41740003,\n\t\t0x81C, 0x41760003,\n\t\t0x81C, 0x41780003,\n\t\t0x81C, 0x417A0003,\n\t\t0x81C, 0x417C0003,\n\t\t0x81C, 0x417E0003,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFE000003,\n\t\t0x81C, 0xFE000003,\n\t\t0x81C, 0xFD020003,\n\t\t0x81C, 0xFC040003,\n\t\t0x81C, 0xFB060003,\n\t\t0x81C, 0xFA080003,\n\t\t0x81C, 0xF90A0003,\n\t\t0x81C, 0xF80C0003,\n\t\t0x81C, 0xF70E0003,\n\t\t0x81C, 0xF6100003,\n\t\t0x81C, 0xF5120003,\n\t\t0x81C, 0xF4140003,\n\t\t0x81C, 0xF3160003,\n\t\t0x81C, 0xF2180003,\n\t\t0x81C, 0xF11A0003,\n\t\t0x81C, 0xF01C0003,\n\t\t0x81C, 0xEF1E0003,\n\t\t0x81C, 0xEE200003,\n\t\t0x81C, 0xED220003,\n\t\t0x81C, 0xEC240003,\n\t\t0x81C, 0xEB260003,\n\t\t0x81C, 0xEA280003,\n\t\t0x81C, 0xE92A0003,\n\t\t0x81C, 0xE82C0003,\n\t\t0x81C, 0xE72E0003,\n\t\t0x81C, 0xE6300003,\n\t\t0x81C, 0xE5320003,\n\t\t0x81C, 0xE4340003,\n\t\t0x81C, 0xE3360003,\n\t\t0x81C, 0xC6380003,\n\t\t0x81C, 0xC53A0003,\n\t\t0x81C, 0xC43C0003,\n\t\t0x81C, 0xC33E0003,\n\t\t0x81C, 0xC2400003,\n\t\t0x81C, 0xA9420003,\n\t\t0x81C, 0xA8440003,\n\t\t0x81C, 0xA7460003,\n\t\t0x81C, 0xA6480003,\n\t\t0x81C, 0xA54A0003,\n\t\t0x81C, 0xA44C0003,\n\t\t0x81C, 0xA34E0003,\n\t\t0x81C, 0x66500003,\n\t\t0x81C, 0x65520003,\n\t\t0x81C, 0x64540003,\n\t\t0x81C, 0x63560003,\n\t\t0x81C, 0x49580003,\n\t\t0x81C, 0x485A0003,\n\t\t0x81C, 0x475C0003,\n\t\t0x81C, 0x465E0003,\n\t\t0x81C, 0x45600003,\n\t\t0x81C, 0x44620003,\n\t\t0x81C, 0x43640003,\n\t\t0x81C, 0x42660003,\n\t\t0x81C, 0x41680003,\n\t\t0x81C, 0x416A0003,\n\t\t0x81C, 0x416C0003,\n\t\t0x81C, 0x416E0003,\n\t\t0x81C, 0x41700003,\n\t\t0x81C, 0x41720003,\n\t\t0x81C, 0x41740003,\n\t\t0x81C, 0x41760003,\n\t\t0x81C, 0x41780003,\n\t\t0x81C, 0x417A0003,\n\t\t0x81C, 0x417C0003,\n\t\t0x81C, 0x417E0003,\n\t0xA0000000,\t0x00000000,\n\t\t0x81C, 0xFF000003,\n\t\t0x81C, 0xFE020003,\n\t\t0x81C, 0xFD040003,\n\t\t0x81C, 0xFC060003,\n\t\t0x81C, 0xFB080003,\n\t\t0x81C, 0xFA0A0003,\n\t\t0x81C, 0xF90C0003,\n\t\t0x81C, 0xF80E0003,\n\t\t0x81C, 0xF7100003,\n\t\t0x81C, 0xF6120003,\n\t\t0x81C, 0xF5140003,\n\t\t0x81C, 0xF4160003,\n\t\t0x81C, 0xF3180003,\n\t\t0x81C, 0xF21A0003,\n\t\t0x81C, 0xF11C0003,\n\t\t0x81C, 0xF01E0003,\n\t\t0x81C, 0xEF200003,\n\t\t0x81C, 0xEE220003,\n\t\t0x81C, 0xED240003,\n\t\t0x81C, 0xCF260003,\n\t\t0x81C, 0xCE280003,\n\t\t0x81C, 0xCD2A0003,\n\t\t0x81C, 0xCC2C0003,\n\t\t0x81C, 0xCB2E0003,\n\t\t0x81C, 0xCA300003,\n\t\t0x81C, 0xC9320003,\n\t\t0x81C, 0xC8340003,\n\t\t0x81C, 0xC7360003,\n\t\t0x81C, 0xC6380003,\n\t\t0x81C, 0xC53A0003,\n\t\t0x81C, 0xC43C0003,\n\t\t0x81C, 0xA63E0003,\n\t\t0x81C, 0xA5400003,\n\t\t0x81C, 0xA4420003,\n\t\t0x81C, 0xA3440003,\n\t\t0x81C, 0xA2460003,\n\t\t0x81C, 0xA1480003,\n\t\t0x81C, 0x864A0003,\n\t\t0x81C, 0x854C0003,\n\t\t0x81C, 0x844E0003,\n\t\t0x81C, 0x83500003,\n\t\t0x81C, 0x66520003,\n\t\t0x81C, 0x65540003,\n\t\t0x81C, 0x64560003,\n\t\t0x81C, 0x63580003,\n\t\t0x81C, 0x625A0003,\n\t\t0x81C, 0x615C0003,\n\t\t0x81C, 0x435E0003,\n\t\t0x81C, 0x42600003,\n\t\t0x81C, 0x41620003,\n\t\t0x81C, 0x27640003,\n\t\t0x81C, 0x26660003,\n\t\t0x81C, 0x25680003,\n\t\t0x81C, 0x246A0003,\n\t\t0x81C, 0x236C0003,\n\t\t0x81C, 0x226E0003,\n\t\t0x81C, 0x21700003,\n\t\t0x81C, 0x21720003,\n\t\t0x81C, 0x21740003,\n\t\t0x81C, 0x21760003,\n\t\t0x81C, 0x21780003,\n\t\t0x81C, 0x217A0003,\n\t\t0x81C, 0x217C0003,\n\t\t0x81C, 0x217E0003,\n\t\t0x81C, 0x217E0003,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFA000103,\n\t\t0x81C, 0xF9020103,\n\t\t0x81C, 0xF8040103,\n\t\t0x81C, 0xF7060103,\n\t\t0x81C, 0xF6080103,\n\t\t0x81C, 0xF50A0103,\n\t\t0x81C, 0xF40C0103,\n\t\t0x81C, 0xF30E0103,\n\t\t0x81C, 0xF2100103,\n\t\t0x81C, 0xF1120103,\n\t\t0x81C, 0xF0140103,\n\t\t0x81C, 0xEF160103,\n\t\t0x81C, 0xEE180103,\n\t\t0x81C, 0xED1A0103,\n\t\t0x81C, 0xEC1C0103,\n\t\t0x81C, 0xEB1E0103,\n\t\t0x81C, 0xEA200103,\n\t\t0x81C, 0xE9220103,\n\t\t0x81C, 0xE8240103,\n\t\t0x81C, 0xE7260103,\n\t\t0x81C, 0xE6280103,\n\t\t0x81C, 0xE52A0103,\n\t\t0x81C, 0xE42C0103,\n\t\t0x81C, 0xE32E0103,\n\t\t0x81C, 0xE2300103,\n\t\t0x81C, 0xE1320103,\n\t\t0x81C, 0xA5340103,\n\t\t0x81C, 0xA4360103,\n\t\t0x81C, 0xA3380103,\n\t\t0x81C, 0xA23A0103,\n\t\t0x81C, 0xA13C0103,\n\t\t0x81C, 0x843E0103,\n\t\t0x81C, 0x83400103,\n\t\t0x81C, 0x82420103,\n\t\t0x81C, 0x81440103,\n\t\t0x81C, 0x64460103,\n\t\t0x81C, 0x63480103,\n\t\t0x81C, 0x624A0103,\n\t\t0x81C, 0x614C0103,\n\t\t0x81C, 0x454E0103,\n\t\t0x81C, 0x44500103,\n\t\t0x81C, 0x43520103,\n\t\t0x81C, 0x42540103,\n\t\t0x81C, 0x41560103,\n\t\t0x81C, 0x24580103,\n\t\t0x81C, 0x235A0103,\n\t\t0x81C, 0x225C0103,\n\t\t0x81C, 0x055E0103,\n\t\t0x81C, 0x04600103,\n\t\t0x81C, 0x03620103,\n\t\t0x81C, 0x02640103,\n\t\t0x81C, 0x01660103,\n\t\t0x81C, 0x01680103,\n\t\t0x81C, 0x016A0103,\n\t\t0x81C, 0x016C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF8000103,\n\t\t0x81C, 0xF7020103,\n\t\t0x81C, 0xF6040103,\n\t\t0x81C, 0xF5060103,\n\t\t0x81C, 0xF4080103,\n\t\t0x81C, 0xF30A0103,\n\t\t0x81C, 0xF20C0103,\n\t\t0x81C, 0xF10E0103,\n\t\t0x81C, 0xF0100103,\n\t\t0x81C, 0xEF120103,\n\t\t0x81C, 0xEE140103,\n\t\t0x81C, 0xED160103,\n\t\t0x81C, 0xEC180103,\n\t\t0x81C, 0xEB1A0103,\n\t\t0x81C, 0xEA1C0103,\n\t\t0x81C, 0xE91E0103,\n\t\t0x81C, 0xE8200103,\n\t\t0x81C, 0xE7220103,\n\t\t0x81C, 0xE6240103,\n\t\t0x81C, 0xE5260103,\n\t\t0x81C, 0xE4280103,\n\t\t0x81C, 0xE32A0103,\n\t\t0x81C, 0xE22C0103,\n\t\t0x81C, 0xE12E0103,\n\t\t0x81C, 0xA5300103,\n\t\t0x81C, 0xA4320103,\n\t\t0x81C, 0xA3340103,\n\t\t0x81C, 0xA2360103,\n\t\t0x81C, 0xA1380103,\n\t\t0x81C, 0x843A0103,\n\t\t0x81C, 0x833C0103,\n\t\t0x81C, 0x823E0103,\n\t\t0x81C, 0x81400103,\n\t\t0x81C, 0x64420103,\n\t\t0x81C, 0x63440103,\n\t\t0x81C, 0x62460103,\n\t\t0x81C, 0x61480103,\n\t\t0x81C, 0x454A0103,\n\t\t0x81C, 0x444C0103,\n\t\t0x81C, 0x434E0103,\n\t\t0x81C, 0x42500103,\n\t\t0x81C, 0x25520103,\n\t\t0x81C, 0x24540103,\n\t\t0x81C, 0x23560103,\n\t\t0x81C, 0x06580103,\n\t\t0x81C, 0x055A0103,\n\t\t0x81C, 0x045C0103,\n\t\t0x81C, 0x035E0103,\n\t\t0x81C, 0x02600103,\n\t\t0x81C, 0x01620103,\n\t\t0x81C, 0x01640103,\n\t\t0x81C, 0x01660103,\n\t\t0x81C, 0x01680103,\n\t\t0x81C, 0x016A0103,\n\t\t0x81C, 0x016C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFC000103,\n\t\t0x81C, 0xFB020103,\n\t\t0x81C, 0xFA040103,\n\t\t0x81C, 0xF9060103,\n\t\t0x81C, 0xF8080103,\n\t\t0x81C, 0xF70A0103,\n\t\t0x81C, 0xF60C0103,\n\t\t0x81C, 0xF50E0103,\n\t\t0x81C, 0xF4100103,\n\t\t0x81C, 0xF3120103,\n\t\t0x81C, 0xF2140103,\n\t\t0x81C, 0xF1160103,\n\t\t0x81C, 0xF0180103,\n\t\t0x81C, 0xEF1A0103,\n\t\t0x81C, 0xEE1C0103,\n\t\t0x81C, 0xED1E0103,\n\t\t0x81C, 0xEC200103,\n\t\t0x81C, 0xEB220103,\n\t\t0x81C, 0xEA240103,\n\t\t0x81C, 0xE9260103,\n\t\t0x81C, 0xE8280103,\n\t\t0x81C, 0xE72A0103,\n\t\t0x81C, 0xE62C0103,\n\t\t0x81C, 0xE52E0103,\n\t\t0x81C, 0xE4300103,\n\t\t0x81C, 0xE3320103,\n\t\t0x81C, 0xE2340103,\n\t\t0x81C, 0xE1360103,\n\t\t0x81C, 0x87380103,\n\t\t0x81C, 0x863A0103,\n\t\t0x81C, 0x853C0103,\n\t\t0x81C, 0x843E0103,\n\t\t0x81C, 0x83400103,\n\t\t0x81C, 0x82420103,\n\t\t0x81C, 0x81440103,\n\t\t0x81C, 0x64460103,\n\t\t0x81C, 0x63480103,\n\t\t0x81C, 0x624A0103,\n\t\t0x81C, 0x464C0103,\n\t\t0x81C, 0x454E0103,\n\t\t0x81C, 0x44500103,\n\t\t0x81C, 0x43520103,\n\t\t0x81C, 0x26540103,\n\t\t0x81C, 0x25560103,\n\t\t0x81C, 0x24580103,\n\t\t0x81C, 0x075A0103,\n\t\t0x81C, 0x065C0103,\n\t\t0x81C, 0x055E0103,\n\t\t0x81C, 0x04600103,\n\t\t0x81C, 0x03620103,\n\t\t0x81C, 0x02640103,\n\t\t0x81C, 0x01660103,\n\t\t0x81C, 0x01680103,\n\t\t0x81C, 0x016A0103,\n\t\t0x81C, 0x016C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF9000103,\n\t\t0x81C, 0xF8020103,\n\t\t0x81C, 0xF7040103,\n\t\t0x81C, 0xF6060103,\n\t\t0x81C, 0xF5080103,\n\t\t0x81C, 0xF40A0103,\n\t\t0x81C, 0xF30C0103,\n\t\t0x81C, 0xF20E0103,\n\t\t0x81C, 0xF1100103,\n\t\t0x81C, 0xF0120103,\n\t\t0x81C, 0xEF140103,\n\t\t0x81C, 0xEE160103,\n\t\t0x81C, 0xED180103,\n\t\t0x81C, 0xEC1A0103,\n\t\t0x81C, 0xEB1C0103,\n\t\t0x81C, 0xEA1E0103,\n\t\t0x81C, 0xE9200103,\n\t\t0x81C, 0xE8220103,\n\t\t0x81C, 0xE7240103,\n\t\t0x81C, 0xE6260103,\n\t\t0x81C, 0xE5280103,\n\t\t0x81C, 0xE42A0103,\n\t\t0x81C, 0xE32C0103,\n\t\t0x81C, 0xE22E0103,\n\t\t0x81C, 0xA6300103,\n\t\t0x81C, 0xA5320103,\n\t\t0x81C, 0xA4340103,\n\t\t0x81C, 0xA3360103,\n\t\t0x81C, 0xA2380103,\n\t\t0x81C, 0xA13A0103,\n\t\t0x81C, 0x843C0103,\n\t\t0x81C, 0x833E0103,\n\t\t0x81C, 0x82400103,\n\t\t0x81C, 0x81420103,\n\t\t0x81C, 0x64440103,\n\t\t0x81C, 0x63460103,\n\t\t0x81C, 0x62480103,\n\t\t0x81C, 0x614A0103,\n\t\t0x81C, 0x444C0103,\n\t\t0x81C, 0x434E0103,\n\t\t0x81C, 0x42500103,\n\t\t0x81C, 0x41520103,\n\t\t0x81C, 0x25540103,\n\t\t0x81C, 0x24560103,\n\t\t0x81C, 0x23580103,\n\t\t0x81C, 0x225A0103,\n\t\t0x81C, 0x055C0103,\n\t\t0x81C, 0x045E0103,\n\t\t0x81C, 0x03600103,\n\t\t0x81C, 0x02620103,\n\t\t0x81C, 0x01640103,\n\t\t0x81C, 0x01660103,\n\t\t0x81C, 0x01680103,\n\t\t0x81C, 0x016A0103,\n\t\t0x81C, 0x016C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x81C, 0xFD000103,\n\t\t0x81C, 0xFC020103,\n\t\t0x81C, 0xFB040103,\n\t\t0x81C, 0xFA060103,\n\t\t0x81C, 0xF9080103,\n\t\t0x81C, 0xF80A0103,\n\t\t0x81C, 0xF70C0103,\n\t\t0x81C, 0xF60E0103,\n\t\t0x81C, 0xF5100103,\n\t\t0x81C, 0xF4120103,\n\t\t0x81C, 0xF3140103,\n\t\t0x81C, 0xF2160103,\n\t\t0x81C, 0xF1180103,\n\t\t0x81C, 0xF01A0103,\n\t\t0x81C, 0xEF1C0103,\n\t\t0x81C, 0xEE1E0103,\n\t\t0x81C, 0xED200103,\n\t\t0x81C, 0xEC220103,\n\t\t0x81C, 0xEB240103,\n\t\t0x81C, 0xEA260103,\n\t\t0x81C, 0xE9280103,\n\t\t0x81C, 0xE82A0103,\n\t\t0x81C, 0xE72C0103,\n\t\t0x81C, 0xE62E0103,\n\t\t0x81C, 0xE5300103,\n\t\t0x81C, 0xE4320103,\n\t\t0x81C, 0xE3340103,\n\t\t0x81C, 0xE2360103,\n\t\t0x81C, 0xE1380103,\n\t\t0x81C, 0xA33A0103,\n\t\t0x81C, 0xA23C0103,\n\t\t0x81C, 0xA13E0103,\n\t\t0x81C, 0x84400103,\n\t\t0x81C, 0x83420103,\n\t\t0x81C, 0x82440103,\n\t\t0x81C, 0x81460103,\n\t\t0x81C, 0x64480103,\n\t\t0x81C, 0x634A0103,\n\t\t0x81C, 0x624C0103,\n\t\t0x81C, 0x614E0103,\n\t\t0x81C, 0x45500103,\n\t\t0x81C, 0x44520103,\n\t\t0x81C, 0x43540103,\n\t\t0x81C, 0x42560103,\n\t\t0x81C, 0x25580103,\n\t\t0x81C, 0x245A0103,\n\t\t0x81C, 0x235C0103,\n\t\t0x81C, 0x065E0103,\n\t\t0x81C, 0x05600103,\n\t\t0x81C, 0x04620103,\n\t\t0x81C, 0x03640103,\n\t\t0x81C, 0x02660103,\n\t\t0x81C, 0x01680103,\n\t\t0x81C, 0x016A0103,\n\t\t0x81C, 0x016C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0xA0000000,\t0x00000000,\n\t\t0x81C, 0xFF000103,\n\t\t0x81C, 0xFE020103,\n\t\t0x81C, 0xFD040103,\n\t\t0x81C, 0xFC060103,\n\t\t0x81C, 0xFB080103,\n\t\t0x81C, 0xFA0A0103,\n\t\t0x81C, 0xF90C0103,\n\t\t0x81C, 0xF80E0103,\n\t\t0x81C, 0xF7100103,\n\t\t0x81C, 0xF6120103,\n\t\t0x81C, 0xF5140103,\n\t\t0x81C, 0xF4160103,\n\t\t0x81C, 0xF3180103,\n\t\t0x81C, 0xF21A0103,\n\t\t0x81C, 0xF11C0103,\n\t\t0x81C, 0xF01E0103,\n\t\t0x81C, 0xEF200103,\n\t\t0x81C, 0xEE220103,\n\t\t0x81C, 0xED240103,\n\t\t0x81C, 0xEC260103,\n\t\t0x81C, 0xEB280103,\n\t\t0x81C, 0xEA2A0103,\n\t\t0x81C, 0xE92C0103,\n\t\t0x81C, 0xE82E0103,\n\t\t0x81C, 0xE7300103,\n\t\t0x81C, 0xE6320103,\n\t\t0x81C, 0xE5340103,\n\t\t0x81C, 0xE4360103,\n\t\t0x81C, 0xE3380103,\n\t\t0x81C, 0xE23A0103,\n\t\t0x81C, 0xE13C0103,\n\t\t0x81C, 0xA43E0103,\n\t\t0x81C, 0xA3400103,\n\t\t0x81C, 0xA2420103,\n\t\t0x81C, 0xA1440103,\n\t\t0x81C, 0x86460103,\n\t\t0x81C, 0x85480103,\n\t\t0x81C, 0x844A0103,\n\t\t0x81C, 0x834C0103,\n\t\t0x81C, 0x824E0103,\n\t\t0x81C, 0x81500103,\n\t\t0x81C, 0x64520103,\n\t\t0x81C, 0x63540103,\n\t\t0x81C, 0x62560103,\n\t\t0x81C, 0x61580103,\n\t\t0x81C, 0x435A0103,\n\t\t0x81C, 0x425C0103,\n\t\t0x81C, 0x415E0103,\n\t\t0x81C, 0x25600103,\n\t\t0x81C, 0x24620103,\n\t\t0x81C, 0x06640103,\n\t\t0x81C, 0x05660103,\n\t\t0x81C, 0x04680103,\n\t\t0x81C, 0x036A0103,\n\t\t0x81C, 0x026C0103,\n\t\t0x81C, 0x016E0103,\n\t\t0x81C, 0x01700103,\n\t\t0x81C, 0x01720103,\n\t\t0x81C, 0x01740103,\n\t\t0x81C, 0x01760103,\n\t\t0x81C, 0x01780103,\n\t\t0x81C, 0x017A0103,\n\t\t0x81C, 0x017C0103,\n\t\t0x81C, 0x017E0103,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFC000203,\n\t\t0x81C, 0xFB020203,\n\t\t0x81C, 0xFA040203,\n\t\t0x81C, 0xF9060203,\n\t\t0x81C, 0xF8080203,\n\t\t0x81C, 0xF70A0203,\n\t\t0x81C, 0xF60C0203,\n\t\t0x81C, 0xF50E0203,\n\t\t0x81C, 0xF4100203,\n\t\t0x81C, 0xF3120203,\n\t\t0x81C, 0xF2140203,\n\t\t0x81C, 0xF1160203,\n\t\t0x81C, 0xF0180203,\n\t\t0x81C, 0xEF1A0203,\n\t\t0x81C, 0xEE1C0203,\n\t\t0x81C, 0xED1E0203,\n\t\t0x81C, 0xEC200203,\n\t\t0x81C, 0xEB220203,\n\t\t0x81C, 0xEA240203,\n\t\t0x81C, 0xE9260203,\n\t\t0x81C, 0xE8280203,\n\t\t0x81C, 0xE72A0203,\n\t\t0x81C, 0xE62C0203,\n\t\t0x81C, 0xE52E0203,\n\t\t0x81C, 0xE4300203,\n\t\t0x81C, 0xE3320203,\n\t\t0x81C, 0xE2340203,\n\t\t0x81C, 0xE1360203,\n\t\t0x81C, 0xA5380203,\n\t\t0x81C, 0xA43A0203,\n\t\t0x81C, 0xA33C0203,\n\t\t0x81C, 0x853E0203,\n\t\t0x81C, 0x84400203,\n\t\t0x81C, 0x83420203,\n\t\t0x81C, 0x82440203,\n\t\t0x81C, 0x81460203,\n\t\t0x81C, 0x64480203,\n\t\t0x81C, 0x634A0203,\n\t\t0x81C, 0x624C0203,\n\t\t0x81C, 0x614E0203,\n\t\t0x81C, 0x46500203,\n\t\t0x81C, 0x45520203,\n\t\t0x81C, 0x44540203,\n\t\t0x81C, 0x43560203,\n\t\t0x81C, 0x25580203,\n\t\t0x81C, 0x245A0203,\n\t\t0x81C, 0x235C0203,\n\t\t0x81C, 0x075E0203,\n\t\t0x81C, 0x06600203,\n\t\t0x81C, 0x05620203,\n\t\t0x81C, 0x04640203,\n\t\t0x81C, 0x03660203,\n\t\t0x81C, 0x02680203,\n\t\t0x81C, 0x016A0203,\n\t\t0x81C, 0x016C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF8000203,\n\t\t0x81C, 0xF7020203,\n\t\t0x81C, 0xF6040203,\n\t\t0x81C, 0xF5060203,\n\t\t0x81C, 0xF4080203,\n\t\t0x81C, 0xF30A0203,\n\t\t0x81C, 0xF20C0203,\n\t\t0x81C, 0xF10E0203,\n\t\t0x81C, 0xF0100203,\n\t\t0x81C, 0xEF120203,\n\t\t0x81C, 0xEE140203,\n\t\t0x81C, 0xED160203,\n\t\t0x81C, 0xEC180203,\n\t\t0x81C, 0xEB1A0203,\n\t\t0x81C, 0xEA1C0203,\n\t\t0x81C, 0xE91E0203,\n\t\t0x81C, 0xE8200203,\n\t\t0x81C, 0xE7220203,\n\t\t0x81C, 0xE6240203,\n\t\t0x81C, 0xE5260203,\n\t\t0x81C, 0xE4280203,\n\t\t0x81C, 0xE32A0203,\n\t\t0x81C, 0xE22C0203,\n\t\t0x81C, 0xE12E0203,\n\t\t0x81C, 0xA6300203,\n\t\t0x81C, 0xA5320203,\n\t\t0x81C, 0xA4340203,\n\t\t0x81C, 0xA3360203,\n\t\t0x81C, 0xA2380203,\n\t\t0x81C, 0x853A0203,\n\t\t0x81C, 0x843C0203,\n\t\t0x81C, 0x833E0203,\n\t\t0x81C, 0x82400203,\n\t\t0x81C, 0x81420203,\n\t\t0x81C, 0x64440203,\n\t\t0x81C, 0x63460203,\n\t\t0x81C, 0x62480203,\n\t\t0x81C, 0x614A0203,\n\t\t0x81C, 0x444C0203,\n\t\t0x81C, 0x434E0203,\n\t\t0x81C, 0x42500203,\n\t\t0x81C, 0x25520203,\n\t\t0x81C, 0x24540203,\n\t\t0x81C, 0x23560203,\n\t\t0x81C, 0x06580203,\n\t\t0x81C, 0x055A0203,\n\t\t0x81C, 0x045C0203,\n\t\t0x81C, 0x035E0203,\n\t\t0x81C, 0x02600203,\n\t\t0x81C, 0x01620203,\n\t\t0x81C, 0x01640203,\n\t\t0x81C, 0x01660203,\n\t\t0x81C, 0x01680203,\n\t\t0x81C, 0x016A0203,\n\t\t0x81C, 0x016C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xFC000203,\n\t\t0x81C, 0xFB020203,\n\t\t0x81C, 0xFA040203,\n\t\t0x81C, 0xF9060203,\n\t\t0x81C, 0xF8080203,\n\t\t0x81C, 0xF70A0203,\n\t\t0x81C, 0xF60C0203,\n\t\t0x81C, 0xF50E0203,\n\t\t0x81C, 0xF4100203,\n\t\t0x81C, 0xF3120203,\n\t\t0x81C, 0xF2140203,\n\t\t0x81C, 0xF1160203,\n\t\t0x81C, 0xF0180203,\n\t\t0x81C, 0xEF1A0203,\n\t\t0x81C, 0xEE1C0203,\n\t\t0x81C, 0xED1E0203,\n\t\t0x81C, 0xEC200203,\n\t\t0x81C, 0xEB220203,\n\t\t0x81C, 0xEA240203,\n\t\t0x81C, 0xE9260203,\n\t\t0x81C, 0xE8280203,\n\t\t0x81C, 0xE72A0203,\n\t\t0x81C, 0xE62C0203,\n\t\t0x81C, 0xE52E0203,\n\t\t0x81C, 0xE4300203,\n\t\t0x81C, 0xE3320203,\n\t\t0x81C, 0xE2340203,\n\t\t0x81C, 0xE1360203,\n\t\t0x81C, 0x87380203,\n\t\t0x81C, 0x863A0203,\n\t\t0x81C, 0x853C0203,\n\t\t0x81C, 0x843E0203,\n\t\t0x81C, 0x83400203,\n\t\t0x81C, 0x82420203,\n\t\t0x81C, 0x81440203,\n\t\t0x81C, 0x64460203,\n\t\t0x81C, 0x63480203,\n\t\t0x81C, 0x624A0203,\n\t\t0x81C, 0x474C0203,\n\t\t0x81C, 0x464E0203,\n\t\t0x81C, 0x45500203,\n\t\t0x81C, 0x44520203,\n\t\t0x81C, 0x43540203,\n\t\t0x81C, 0x42560203,\n\t\t0x81C, 0x24580203,\n\t\t0x81C, 0x235A0203,\n\t\t0x81C, 0x075C0203,\n\t\t0x81C, 0x065E0203,\n\t\t0x81C, 0x05600203,\n\t\t0x81C, 0x04620203,\n\t\t0x81C, 0x03640203,\n\t\t0x81C, 0x02660203,\n\t\t0x81C, 0x01680203,\n\t\t0x81C, 0x016A0203,\n\t\t0x81C, 0x016C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF8000203,\n\t\t0x81C, 0xF7020203,\n\t\t0x81C, 0xF6040203,\n\t\t0x81C, 0xF5060203,\n\t\t0x81C, 0xF4080203,\n\t\t0x81C, 0xF30A0203,\n\t\t0x81C, 0xF20C0203,\n\t\t0x81C, 0xF10E0203,\n\t\t0x81C, 0xF0100203,\n\t\t0x81C, 0xEF120203,\n\t\t0x81C, 0xEE140203,\n\t\t0x81C, 0xED160203,\n\t\t0x81C, 0xEC180203,\n\t\t0x81C, 0xEB1A0203,\n\t\t0x81C, 0xEA1C0203,\n\t\t0x81C, 0xE91E0203,\n\t\t0x81C, 0xE8200203,\n\t\t0x81C, 0xE7220203,\n\t\t0x81C, 0xE6240203,\n\t\t0x81C, 0xE5260203,\n\t\t0x81C, 0xE4280203,\n\t\t0x81C, 0xE32A0203,\n\t\t0x81C, 0xE22C0203,\n\t\t0x81C, 0xE12E0203,\n\t\t0x81C, 0xA6300203,\n\t\t0x81C, 0xA5320203,\n\t\t0x81C, 0xA4340203,\n\t\t0x81C, 0xA3360203,\n\t\t0x81C, 0xA2380203,\n\t\t0x81C, 0xA13A0203,\n\t\t0x81C, 0x843C0203,\n\t\t0x81C, 0x833E0203,\n\t\t0x81C, 0x82400203,\n\t\t0x81C, 0x81420203,\n\t\t0x81C, 0x64440203,\n\t\t0x81C, 0x63460203,\n\t\t0x81C, 0x62480203,\n\t\t0x81C, 0x614A0203,\n\t\t0x81C, 0x444C0203,\n\t\t0x81C, 0x434E0203,\n\t\t0x81C, 0x42500203,\n\t\t0x81C, 0x41520203,\n\t\t0x81C, 0x25540203,\n\t\t0x81C, 0x24560203,\n\t\t0x81C, 0x23580203,\n\t\t0x81C, 0x065A0203,\n\t\t0x81C, 0x055C0203,\n\t\t0x81C, 0x045E0203,\n\t\t0x81C, 0x03600203,\n\t\t0x81C, 0x02620203,\n\t\t0x81C, 0x01640203,\n\t\t0x81C, 0x01660203,\n\t\t0x81C, 0x01680203,\n\t\t0x81C, 0x016A0203,\n\t\t0x81C, 0x016C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x81C, 0xFB000203,\n\t\t0x81C, 0xFA020203,\n\t\t0x81C, 0xF9040203,\n\t\t0x81C, 0xF8060203,\n\t\t0x81C, 0xF7080203,\n\t\t0x81C, 0xF60A0203,\n\t\t0x81C, 0xF50C0203,\n\t\t0x81C, 0xF40E0203,\n\t\t0x81C, 0xF3100203,\n\t\t0x81C, 0xF2120203,\n\t\t0x81C, 0xF1140203,\n\t\t0x81C, 0xF0160203,\n\t\t0x81C, 0xEF180203,\n\t\t0x81C, 0xEE1A0203,\n\t\t0x81C, 0xED1C0203,\n\t\t0x81C, 0xEC1E0203,\n\t\t0x81C, 0xEB200203,\n\t\t0x81C, 0xEA220203,\n\t\t0x81C, 0xE9240203,\n\t\t0x81C, 0xE8260203,\n\t\t0x81C, 0xE7280203,\n\t\t0x81C, 0xE62A0203,\n\t\t0x81C, 0xE52C0203,\n\t\t0x81C, 0xE42E0203,\n\t\t0x81C, 0xE3300203,\n\t\t0x81C, 0xE2320203,\n\t\t0x81C, 0xE1340203,\n\t\t0x81C, 0xA5360203,\n\t\t0x81C, 0xA4380203,\n\t\t0x81C, 0xA33A0203,\n\t\t0x81C, 0xA23C0203,\n\t\t0x81C, 0x843E0203,\n\t\t0x81C, 0x83400203,\n\t\t0x81C, 0x82420203,\n\t\t0x81C, 0x81440203,\n\t\t0x81C, 0x64460203,\n\t\t0x81C, 0x63480203,\n\t\t0x81C, 0x624A0203,\n\t\t0x81C, 0x614C0203,\n\t\t0x81C, 0x474E0203,\n\t\t0x81C, 0x46500203,\n\t\t0x81C, 0x45520203,\n\t\t0x81C, 0x44540203,\n\t\t0x81C, 0x43560203,\n\t\t0x81C, 0x25580203,\n\t\t0x81C, 0x245A0203,\n\t\t0x81C, 0x235C0203,\n\t\t0x81C, 0x075E0203,\n\t\t0x81C, 0x06600203,\n\t\t0x81C, 0x05620203,\n\t\t0x81C, 0x04640203,\n\t\t0x81C, 0x03660203,\n\t\t0x81C, 0x02680203,\n\t\t0x81C, 0x016A0203,\n\t\t0x81C, 0x016C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0xA0000000,\t0x00000000,\n\t\t0x81C, 0xFF000203,\n\t\t0x81C, 0xFF020203,\n\t\t0x81C, 0xFE040203,\n\t\t0x81C, 0xFD060203,\n\t\t0x81C, 0xFC080203,\n\t\t0x81C, 0xFB0A0203,\n\t\t0x81C, 0xFA0C0203,\n\t\t0x81C, 0xF90E0203,\n\t\t0x81C, 0xF8100203,\n\t\t0x81C, 0xF7120203,\n\t\t0x81C, 0xF6140203,\n\t\t0x81C, 0xF5160203,\n\t\t0x81C, 0xF4180203,\n\t\t0x81C, 0xF31A0203,\n\t\t0x81C, 0xF21C0203,\n\t\t0x81C, 0xF11E0203,\n\t\t0x81C, 0xF0200203,\n\t\t0x81C, 0xEF220203,\n\t\t0x81C, 0xEE240203,\n\t\t0x81C, 0xED260203,\n\t\t0x81C, 0xEC280203,\n\t\t0x81C, 0xEB2A0203,\n\t\t0x81C, 0xEA2C0203,\n\t\t0x81C, 0xE92E0203,\n\t\t0x81C, 0xE8300203,\n\t\t0x81C, 0xE7320203,\n\t\t0x81C, 0xE6340203,\n\t\t0x81C, 0xE5360203,\n\t\t0x81C, 0xE4380203,\n\t\t0x81C, 0xE33A0203,\n\t\t0x81C, 0xE23C0203,\n\t\t0x81C, 0xE13E0203,\n\t\t0x81C, 0xA4400203,\n\t\t0x81C, 0xA3420203,\n\t\t0x81C, 0xA2440203,\n\t\t0x81C, 0xA1460203,\n\t\t0x81C, 0x85480203,\n\t\t0x81C, 0x844A0203,\n\t\t0x81C, 0x834C0203,\n\t\t0x81C, 0x824E0203,\n\t\t0x81C, 0x81500203,\n\t\t0x81C, 0x64520203,\n\t\t0x81C, 0x63540203,\n\t\t0x81C, 0x62560203,\n\t\t0x81C, 0x61580203,\n\t\t0x81C, 0x445A0203,\n\t\t0x81C, 0x435C0203,\n\t\t0x81C, 0x425E0203,\n\t\t0x81C, 0x25600203,\n\t\t0x81C, 0x24620203,\n\t\t0x81C, 0x06640203,\n\t\t0x81C, 0x05660203,\n\t\t0x81C, 0x04680203,\n\t\t0x81C, 0x036A0203,\n\t\t0x81C, 0x026C0203,\n\t\t0x81C, 0x016E0203,\n\t\t0x81C, 0x01700203,\n\t\t0x81C, 0x01720203,\n\t\t0x81C, 0x01740203,\n\t\t0x81C, 0x01760203,\n\t\t0x81C, 0x01780203,\n\t\t0x81C, 0x017A0203,\n\t\t0x81C, 0x017C0203,\n\t\t0x81C, 0x017E0203,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF9000303,\n\t\t0x81C, 0xF8020303,\n\t\t0x81C, 0xF7040303,\n\t\t0x81C, 0xF6060303,\n\t\t0x81C, 0xF5080303,\n\t\t0x81C, 0xF40A0303,\n\t\t0x81C, 0xF30C0303,\n\t\t0x81C, 0xF20E0303,\n\t\t0x81C, 0xF1100303,\n\t\t0x81C, 0xF0120303,\n\t\t0x81C, 0xEF140303,\n\t\t0x81C, 0xEE160303,\n\t\t0x81C, 0xED180303,\n\t\t0x81C, 0xEC1A0303,\n\t\t0x81C, 0xEB1C0303,\n\t\t0x81C, 0xEA1E0303,\n\t\t0x81C, 0xE9200303,\n\t\t0x81C, 0xE8220303,\n\t\t0x81C, 0xE7240303,\n\t\t0x81C, 0xE6260303,\n\t\t0x81C, 0xE5280303,\n\t\t0x81C, 0xE42A0303,\n\t\t0x81C, 0xE32C0303,\n\t\t0x81C, 0xE22E0303,\n\t\t0x81C, 0xE1300303,\n\t\t0x81C, 0xA6320303,\n\t\t0x81C, 0xA5340303,\n\t\t0x81C, 0xA4360303,\n\t\t0x81C, 0xA3380303,\n\t\t0x81C, 0xA23A0303,\n\t\t0x81C, 0xA13C0303,\n\t\t0x81C, 0x853E0303,\n\t\t0x81C, 0x84400303,\n\t\t0x81C, 0x83420303,\n\t\t0x81C, 0x82440303,\n\t\t0x81C, 0x81460303,\n\t\t0x81C, 0x64480303,\n\t\t0x81C, 0x634A0303,\n\t\t0x81C, 0x624C0303,\n\t\t0x81C, 0x614E0303,\n\t\t0x81C, 0x44500303,\n\t\t0x81C, 0x43520303,\n\t\t0x81C, 0x42540303,\n\t\t0x81C, 0x41560303,\n\t\t0x81C, 0x25580303,\n\t\t0x81C, 0x245A0303,\n\t\t0x81C, 0x235C0303,\n\t\t0x81C, 0x055E0303,\n\t\t0x81C, 0x04600303,\n\t\t0x81C, 0x03620303,\n\t\t0x81C, 0x02640303,\n\t\t0x81C, 0x01660303,\n\t\t0x81C, 0x01680303,\n\t\t0x81C, 0x016A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF7000303,\n\t\t0x81C, 0xF6020303,\n\t\t0x81C, 0xF5040303,\n\t\t0x81C, 0xF4060303,\n\t\t0x81C, 0xF3080303,\n\t\t0x81C, 0xF20A0303,\n\t\t0x81C, 0xF10C0303,\n\t\t0x81C, 0xF00E0303,\n\t\t0x81C, 0xEF100303,\n\t\t0x81C, 0xEE120303,\n\t\t0x81C, 0xED140303,\n\t\t0x81C, 0xEC160303,\n\t\t0x81C, 0xEB180303,\n\t\t0x81C, 0xEA1A0303,\n\t\t0x81C, 0xE91C0303,\n\t\t0x81C, 0xE81E0303,\n\t\t0x81C, 0xE7200303,\n\t\t0x81C, 0xE6220303,\n\t\t0x81C, 0xE5240303,\n\t\t0x81C, 0xE4260303,\n\t\t0x81C, 0xE3280303,\n\t\t0x81C, 0xC32A0303,\n\t\t0x81C, 0xC22C0303,\n\t\t0x81C, 0xC12E0303,\n\t\t0x81C, 0xA5300303,\n\t\t0x81C, 0xA4320303,\n\t\t0x81C, 0xA3340303,\n\t\t0x81C, 0xA2360303,\n\t\t0x81C, 0xA1380303,\n\t\t0x81C, 0x853A0303,\n\t\t0x81C, 0x843C0303,\n\t\t0x81C, 0x833E0303,\n\t\t0x81C, 0x82400303,\n\t\t0x81C, 0x81420303,\n\t\t0x81C, 0x64440303,\n\t\t0x81C, 0x63460303,\n\t\t0x81C, 0x62480303,\n\t\t0x81C, 0x614A0303,\n\t\t0x81C, 0x454C0303,\n\t\t0x81C, 0x444E0303,\n\t\t0x81C, 0x43500303,\n\t\t0x81C, 0x25520303,\n\t\t0x81C, 0x24540303,\n\t\t0x81C, 0x23560303,\n\t\t0x81C, 0x06580303,\n\t\t0x81C, 0x055A0303,\n\t\t0x81C, 0x045C0303,\n\t\t0x81C, 0x035E0303,\n\t\t0x81C, 0x02600303,\n\t\t0x81C, 0x01620303,\n\t\t0x81C, 0x01640303,\n\t\t0x81C, 0x01660303,\n\t\t0x81C, 0x01680303,\n\t\t0x81C, 0x016A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF9000303,\n\t\t0x81C, 0xF8020303,\n\t\t0x81C, 0xF7040303,\n\t\t0x81C, 0xF6060303,\n\t\t0x81C, 0xF5080303,\n\t\t0x81C, 0xF40A0303,\n\t\t0x81C, 0xF30C0303,\n\t\t0x81C, 0xF20E0303,\n\t\t0x81C, 0xF1100303,\n\t\t0x81C, 0xF0120303,\n\t\t0x81C, 0xEF140303,\n\t\t0x81C, 0xEE160303,\n\t\t0x81C, 0xED180303,\n\t\t0x81C, 0xEC1A0303,\n\t\t0x81C, 0xEB1C0303,\n\t\t0x81C, 0xEA1E0303,\n\t\t0x81C, 0xE9200303,\n\t\t0x81C, 0xE8220303,\n\t\t0x81C, 0xE7240303,\n\t\t0x81C, 0xE6260303,\n\t\t0x81C, 0xE5280303,\n\t\t0x81C, 0xE42A0303,\n\t\t0x81C, 0xE32C0303,\n\t\t0x81C, 0xE22E0303,\n\t\t0x81C, 0xE1300303,\n\t\t0x81C, 0xA4320303,\n\t\t0x81C, 0xA3340303,\n\t\t0x81C, 0xA2360303,\n\t\t0x81C, 0xA1380303,\n\t\t0x81C, 0x853A0303,\n\t\t0x81C, 0x843C0303,\n\t\t0x81C, 0x833E0303,\n\t\t0x81C, 0x82400303,\n\t\t0x81C, 0x81420303,\n\t\t0x81C, 0x64440303,\n\t\t0x81C, 0x63460303,\n\t\t0x81C, 0x62480303,\n\t\t0x81C, 0x614A0303,\n\t\t0x81C, 0x444C0303,\n\t\t0x81C, 0x434E0303,\n\t\t0x81C, 0x42500303,\n\t\t0x81C, 0x25520303,\n\t\t0x81C, 0x24540303,\n\t\t0x81C, 0x23560303,\n\t\t0x81C, 0x07580303,\n\t\t0x81C, 0x065A0303,\n\t\t0x81C, 0x055C0303,\n\t\t0x81C, 0x045E0303,\n\t\t0x81C, 0x03600303,\n\t\t0x81C, 0x02620303,\n\t\t0x81C, 0x01640303,\n\t\t0x81C, 0x01660303,\n\t\t0x81C, 0x01680303,\n\t\t0x81C, 0x016A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x81C, 0xF7000303,\n\t\t0x81C, 0xF6020303,\n\t\t0x81C, 0xF5040303,\n\t\t0x81C, 0xF4060303,\n\t\t0x81C, 0xF3080303,\n\t\t0x81C, 0xF20A0303,\n\t\t0x81C, 0xF10C0303,\n\t\t0x81C, 0xF00E0303,\n\t\t0x81C, 0xEF100303,\n\t\t0x81C, 0xEE120303,\n\t\t0x81C, 0xED140303,\n\t\t0x81C, 0xEC160303,\n\t\t0x81C, 0xEB180303,\n\t\t0x81C, 0xEA1A0303,\n\t\t0x81C, 0xE91C0303,\n\t\t0x81C, 0xE81E0303,\n\t\t0x81C, 0xE7200303,\n\t\t0x81C, 0xE6220303,\n\t\t0x81C, 0xE5240303,\n\t\t0x81C, 0xE4260303,\n\t\t0x81C, 0xE3280303,\n\t\t0x81C, 0xE22A0303,\n\t\t0x81C, 0xE12C0303,\n\t\t0x81C, 0xA72E0303,\n\t\t0x81C, 0xA6300303,\n\t\t0x81C, 0xA5320303,\n\t\t0x81C, 0xA4340303,\n\t\t0x81C, 0xA3360303,\n\t\t0x81C, 0xA2380303,\n\t\t0x81C, 0xA13A0303,\n\t\t0x81C, 0x843C0303,\n\t\t0x81C, 0x833E0303,\n\t\t0x81C, 0x82400303,\n\t\t0x81C, 0x81420303,\n\t\t0x81C, 0x64440303,\n\t\t0x81C, 0x63460303,\n\t\t0x81C, 0x62480303,\n\t\t0x81C, 0x614A0303,\n\t\t0x81C, 0x454C0303,\n\t\t0x81C, 0x444E0303,\n\t\t0x81C, 0x43500303,\n\t\t0x81C, 0x42520303,\n\t\t0x81C, 0x41540303,\n\t\t0x81C, 0x24560303,\n\t\t0x81C, 0x23580303,\n\t\t0x81C, 0x065A0303,\n\t\t0x81C, 0x055C0303,\n\t\t0x81C, 0x045E0303,\n\t\t0x81C, 0x03600303,\n\t\t0x81C, 0x02620303,\n\t\t0x81C, 0x01640303,\n\t\t0x81C, 0x01660303,\n\t\t0x81C, 0x01680303,\n\t\t0x81C, 0x016A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x81C, 0xFB000303,\n\t\t0x81C, 0xFA020303,\n\t\t0x81C, 0xF9040303,\n\t\t0x81C, 0xF8060303,\n\t\t0x81C, 0xF7080303,\n\t\t0x81C, 0xF60A0303,\n\t\t0x81C, 0xF50C0303,\n\t\t0x81C, 0xF40E0303,\n\t\t0x81C, 0xF3100303,\n\t\t0x81C, 0xF2120303,\n\t\t0x81C, 0xF1140303,\n\t\t0x81C, 0xF0160303,\n\t\t0x81C, 0xEF180303,\n\t\t0x81C, 0xEE1A0303,\n\t\t0x81C, 0xED1C0303,\n\t\t0x81C, 0xEC1E0303,\n\t\t0x81C, 0xEB200303,\n\t\t0x81C, 0xEA220303,\n\t\t0x81C, 0xE9240303,\n\t\t0x81C, 0xE8260303,\n\t\t0x81C, 0xE7280303,\n\t\t0x81C, 0xE62A0303,\n\t\t0x81C, 0xE52C0303,\n\t\t0x81C, 0xE42E0303,\n\t\t0x81C, 0xE3300303,\n\t\t0x81C, 0xE2320303,\n\t\t0x81C, 0xE1340303,\n\t\t0x81C, 0xC2360303,\n\t\t0x81C, 0xC1380303,\n\t\t0x81C, 0xA33A0303,\n\t\t0x81C, 0xA23C0303,\n\t\t0x81C, 0x853E0303,\n\t\t0x81C, 0x84400303,\n\t\t0x81C, 0x83420303,\n\t\t0x81C, 0x66440303,\n\t\t0x81C, 0x65460303,\n\t\t0x81C, 0x64480303,\n\t\t0x81C, 0x634A0303,\n\t\t0x81C, 0x624C0303,\n\t\t0x81C, 0x614E0303,\n\t\t0x81C, 0x45500303,\n\t\t0x81C, 0x44520303,\n\t\t0x81C, 0x43540303,\n\t\t0x81C, 0x42560303,\n\t\t0x81C, 0x25580303,\n\t\t0x81C, 0x245A0303,\n\t\t0x81C, 0x235C0303,\n\t\t0x81C, 0x065E0303,\n\t\t0x81C, 0x05600303,\n\t\t0x81C, 0x04620303,\n\t\t0x81C, 0x03640303,\n\t\t0x81C, 0x02660303,\n\t\t0x81C, 0x01680303,\n\t\t0x81C, 0x016A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0xA0000000,\t0x00000000,\n\t\t0x81C, 0xFD000303,\n\t\t0x81C, 0xFC020303,\n\t\t0x81C, 0xFB040303,\n\t\t0x81C, 0xFA060303,\n\t\t0x81C, 0xF9080303,\n\t\t0x81C, 0xF80A0303,\n\t\t0x81C, 0xF70C0303,\n\t\t0x81C, 0xF60E0303,\n\t\t0x81C, 0xF5100303,\n\t\t0x81C, 0xF4120303,\n\t\t0x81C, 0xF3140303,\n\t\t0x81C, 0xF2160303,\n\t\t0x81C, 0xF1180303,\n\t\t0x81C, 0xF01A0303,\n\t\t0x81C, 0xEF1C0303,\n\t\t0x81C, 0xEE1E0303,\n\t\t0x81C, 0xED200303,\n\t\t0x81C, 0xEC220303,\n\t\t0x81C, 0xEB240303,\n\t\t0x81C, 0xEA260303,\n\t\t0x81C, 0xE9280303,\n\t\t0x81C, 0xE82A0303,\n\t\t0x81C, 0xE72C0303,\n\t\t0x81C, 0xE62E0303,\n\t\t0x81C, 0xE5300303,\n\t\t0x81C, 0xE4320303,\n\t\t0x81C, 0xE3340303,\n\t\t0x81C, 0xE2360303,\n\t\t0x81C, 0xE1380303,\n\t\t0x81C, 0xA53A0303,\n\t\t0x81C, 0xA43C0303,\n\t\t0x81C, 0xA33E0303,\n\t\t0x81C, 0xA2400303,\n\t\t0x81C, 0xA1420303,\n\t\t0x81C, 0x87440303,\n\t\t0x81C, 0x86460303,\n\t\t0x81C, 0x85480303,\n\t\t0x81C, 0x844A0303,\n\t\t0x81C, 0x834C0303,\n\t\t0x81C, 0x824E0303,\n\t\t0x81C, 0x81500303,\n\t\t0x81C, 0x64520303,\n\t\t0x81C, 0x63540303,\n\t\t0x81C, 0x62560303,\n\t\t0x81C, 0x61580303,\n\t\t0x81C, 0x435A0303,\n\t\t0x81C, 0x425C0303,\n\t\t0x81C, 0x415E0303,\n\t\t0x81C, 0x07600303,\n\t\t0x81C, 0x06620303,\n\t\t0x81C, 0x05640303,\n\t\t0x81C, 0x04660303,\n\t\t0x81C, 0x03680303,\n\t\t0x81C, 0x026A0303,\n\t\t0x81C, 0x016C0303,\n\t\t0x81C, 0x016E0303,\n\t\t0x81C, 0x01700303,\n\t\t0x81C, 0x01720303,\n\t\t0x81C, 0x01740303,\n\t\t0x81C, 0x01760303,\n\t\t0x81C, 0x01780303,\n\t\t0x81C, 0x017A0303,\n\t\t0x81C, 0x017C0303,\n\t\t0x81C, 0x017E0303,\n\t0xB0000000,\t0x00000000,\n\t\t0xC50, 0x00000022,\n\t\t0xC50, 0x00000020,\n\t\t0xE50, 0x00000022,\n\t\t0xE50, 0x00000020,\n\t\t0x1850, 0x00000022,\n\t\t0x1850, 0x00000020,\n\t\t0x1A50, 0x00000022,\n\t\t0x1A50, 0x00000020,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_AGC_TAB(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_AGC_TAB)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_AGC_TAB;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_AGC_TAB\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigBB_AGC_8814A(pDM_Odm, v1, bMaskDWord, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_AGC_TAB(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           PHY_REG.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG[] = { \n\t\t0x800, 0x9020D010,\n\t\t0x804, 0x08011280,\n\t\t0x808, 0x0E0282FF,\n\t\t0x80C, 0x1000002F,\n\t0x8000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x810, 0x21101263,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x810, 0x21101263,\n\t0xA0000000,\t0x00000000,\n\t\t0x810, 0x20101263,\n\t0xB0000000,\t0x00000000,\n\t\t0x814, 0x020C3D10,\n\t\t0x818, 0x04A10385,\n\t\t0x820, 0x00000000,\n\t\t0x824, 0x00033E40,\n\t\t0x828, 0x00000000,\n\t\t0x82C, 0x73985170,\n\t\t0x830, 0x79A0EA08,\n\t\t0x834, 0x042E7086,\n\t0x8000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x838, 0x86667640,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x838, 0x86667641,\n\t0xA0000000,\t0x00000000,\n\t\t0x838, 0x86667640,\n\t0xB0000000,\t0x00000000,\n\t\t0x83C, 0x9798B9B9,\n\t\t0x840, 0x17577F60,\n\t\t0x844, 0x4BBDFCDE,\n\t\t0x848, 0x5CD07F8B,\n\t\t0x84C, 0x6CFBF7B5,\n\t\t0x850, 0x28834706,\n\t\t0x854, 0x0001520C,\n\t\t0x858, 0x4060C000,\n\t\t0x85C, 0x74210368,\n\t\t0x860, 0x6929C321,\n\t\t0x864, 0x79727432,\n\t\t0x868, 0x8CA7A314,\n\t\t0x86C, 0x438C2878,\n\t\t0x870, 0x44444444,\n\t\t0x874, 0x21612C2E,\n\t\t0x878, 0x00003152,\n\t\t0x87C, 0x000FC000,\n\t\t0x8A0, 0x00000013,\n\t\t0x8A4, 0x7F7F7F7F,\n\t\t0x8A8, 0xA202033E,\n\t\t0x8AC, 0xF40F550A,\n\t\t0x8B0, 0x00000600,\n\t\t0x8B4, 0x000FC080,\n\t\t0x8B8, 0xEC0057FF,\n\t\t0x8BC, 0x8CA520C3,\n\t\t0x8C0, 0x3FF00020,\n\t\t0x8C4, 0x44C00000,\n\t\t0x8C8, 0x80025169,\n\t\t0x8CC, 0x08250492,\n\t\t0x8D0, 0x0000B800,\n\t\t0x8D4, 0x940008A0,\n\t\t0x8D8, 0x290B5612,\n\t\t0x8DC, 0x00000000,\n\t\t0x8E0, 0x32316407,\n\t\t0x8E4, 0x4A092925,\n\t\t0x8E8, 0xFFFFC42C,\n\t\t0x8EC, 0x99999999,\n\t\t0x8F0, 0x00009999,\n\t\t0x8F4, 0x00F80FA1,\n\t\t0x8F8, 0x400082C0,\n\t\t0x8FC, 0x00000000,\n\t\t0x900, 0x00400700,\n\t\t0x90C, 0x09004000,\n\t\t0x910, 0x0000FC00,\n\t\t0x914, 0xD6400404,\n\t\t0x918, 0x1C1028C0,\n\t\t0x91C, 0x64B11A1C,\n\t\t0x920, 0xE0767233,\n\t\t0x924, 0x055AA500,\n\t\t0x928, 0x4AB0E4E4,\n\t\t0x92C, 0xFFFE0000,\n\t\t0x930, 0xFFFFFFFE,\n\t\t0x934, 0x001FFFFF,\n\t\t0x938, 0x00008400,\n\t\t0x93C, 0x932C0642,\n\t\t0x940, 0x093E9360,\n\t\t0x944, 0x08000000,\n\t\t0x948, 0x04000000,\n\t\t0x950, 0x02010080,\n\t\t0x954, 0x86510080,\n\t\t0x960, 0x00000000,\n\t\t0x964, 0x00000000,\n\t\t0x968, 0x00000000,\n\t\t0x96C, 0x00000000,\n\t\t0x970, 0x801FFFFF,\n\t\t0x978, 0x00000000,\n\t\t0x97C, 0x00000000,\n\t\t0x980, 0x00000000,\n\t\t0x984, 0x00000000,\n\t\t0x988, 0x00000000,\n\t\t0x98C, 0x03440000,\n\t\t0x990, 0x27100000,\n\t\t0x994, 0xFFFF0100,\n\t\t0x998, 0xFFFFFF5C,\n\t\t0x99C, 0xFFFFFFFF,\n\t\t0x9A0, 0x000000FF,\n\t\t0x9A4, 0x00080080,\n\t\t0x9A8, 0x0C2F0000,\n\t\t0x9AC, 0x00560000,\n\t\t0x9B0, 0x81081008,\n\t\t0x9B4, 0x00000000,\n\t\t0x9B8, 0x01081008,\n\t\t0x9BC, 0x01081008,\n\t\t0x9D0, 0x00000000,\n\t\t0x9D4, 0x00000000,\n\t\t0x9D8, 0x00000000,\n\t\t0x9DC, 0x00000000,\n\t\t0x9E4, 0x00000002,\n\t\t0x9E8, 0x000022D5,\n\t\t0x9FC, 0xEFFFF7FF,\n\t\t0xB00, 0xE3100000,\n\t\t0xB04, 0x0000B000,\n\t\t0xB0C, 0x31EAA006,\n\t\t0xB5C, 0x41CFFFFF,\n\t\t0xC00, 0x00000007,\n\t\t0xC04, 0x00042020,\n\t\t0xC08, 0x80410231,\n\t\t0xC0C, 0x00000000,\n\t\t0xC10, 0x00000100,\n\t\t0xC14, 0x01000000,\n\t\t0xC1C, 0x40000053,\n\t\t0xC50, 0x00000020,\n\t\t0xC54, 0x00000000,\n\t0x8000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0xC58, 0x3C0A0C14,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0xC58, 0x3C0A0C14,\n\t0xA0000000,\t0x00000000,\n\t\t0xC58, 0x3C020C14,\n\t0xB0000000,\t0x00000000,\n\t\t0xC5C, 0x0D000058,\n\t\t0xC60, 0x1B800000,\n\t\t0xC60, 0x0B800001,\n\t\t0xC60, 0x05800002,\n\t\t0xC60, 0x07800003,\n\t\t0xC60, 0x1A800004,\n\t\t0xC60, 0x0B800005,\n\t\t0xC60, 0x05800006,\n\t\t0xC60, 0x0E800007,\n\t\t0xC60, 0x1A800008,\n\t\t0xC60, 0x0B800009,\n\t\t0xC60, 0x1580000A,\n\t\t0xC60, 0x0880000B,\n\t\t0xC60, 0x1A80000C,\n\t\t0xC60, 0x0B80000D,\n\t\t0xC60, 0x0580000E,\n\t\t0xC60, 0x0E80000F,\n\t\t0xC60, 0x1A800010,\n\t\t0xC60, 0x0B800011,\n\t\t0xC60, 0x15800012,\n\t\t0xC60, 0x08800013,\n\t\t0xC60, 0x1A800014,\n\t\t0xC60, 0x0B800015,\n\t\t0xC60, 0x05800016,\n\t\t0xC60, 0x07800017,\n\t\t0xC60, 0x1A800018,\n\t\t0xC60, 0x0B800019,\n\t\t0xC60, 0x1580001A,\n\t\t0xC60, 0x0880001B,\n\t\t0xC60, 0x1B80001C,\n\t\t0xC60, 0x0B80001D,\n\t\t0xC60, 0x0580001E,\n\t\t0xC60, 0x0780001F,\n\t\t0xC60, 0x1B800020,\n\t\t0xC60, 0x0B800021,\n\t\t0xC60, 0x05800022,\n\t\t0xC60, 0x07800023,\n\t\t0xC60, 0x1B800024,\n\t\t0xC60, 0x0B800025,\n\t\t0xC60, 0x05800026,\n\t\t0xC60, 0x07800027,\n\t\t0xC60, 0x1B800028,\n\t\t0xC60, 0x0B800029,\n\t\t0xC60, 0x0580002A,\n\t\t0xC60, 0x0780002B,\n\t\t0xC60, 0x1B800030,\n\t\t0xC60, 0x0B800031,\n\t\t0xC60, 0x05800032,\n\t\t0xC60, 0x00800033,\n\t\t0xC60, 0x1B800034,\n\t\t0xC60, 0x0B800035,\n\t\t0xC60, 0x05800036,\n\t\t0xC60, 0x00800037,\n\t\t0xC60, 0x1B800038,\n\t\t0xC60, 0x0B800039,\n\t\t0xC60, 0x0580003A,\n\t\t0xC60, 0x0E80803B,\n\t\t0xC94, 0x01000401,\n\t\t0xC98, 0x00188000,\n\t\t0xCA0, 0x00002929,\n\t\t0xCA4, 0x08040201,\n\t\t0xCA8, 0x80402010,\n\t\t0xCAC, 0x77777000,\n\t\t0xCB0, 0x54775477,\n\t\t0xCB4, 0x54775477,\n\t\t0xCB8, 0x00500000,\n\t\t0xCBC, 0x77700000,\n\t\t0xCC0, 0x00000010,\n\t\t0xCC8, 0x00000010,\n\t\t0xE00, 0x00000007,\n\t\t0xE04, 0x00042020,\n\t\t0xE08, 0x80410231,\n\t\t0xE0C, 0x00000000,\n\t\t0xE10, 0x00000100,\n\t\t0xE14, 0x01000000,\n\t\t0xE1C, 0x40000053,\n\t\t0xE50, 0x00000020,\n\t\t0xE54, 0x00000000,\n\t0x8000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0xE58, 0x3C0A0C14,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0xE58, 0x3C0A0C14,\n\t0xA0000000,\t0x00000000,\n\t\t0xE58, 0x3C020C14,\n\t0xB0000000,\t0x00000000,\n\t\t0xE5C, 0x0D000058,\n\t\t0xE60, 0x1B800000,\n\t\t0xE60, 0x0B800001,\n\t\t0xE60, 0x05800002,\n\t\t0xE60, 0x07800003,\n\t\t0xE60, 0x1A800004,\n\t\t0xE60, 0x0B800005,\n\t\t0xE60, 0x05800006,\n\t\t0xE60, 0x0E800007,\n\t\t0xE60, 0x1A800008,\n\t\t0xE60, 0x0B800009,\n\t\t0xE60, 0x1580000A,\n\t\t0xE60, 0x0880000B,\n\t\t0xE60, 0x1A80000C,\n\t\t0xE60, 0x0B80000D,\n\t\t0xE60, 0x0580000E,\n\t\t0xE60, 0x0E80000F,\n\t\t0xE60, 0x1A800010,\n\t\t0xE60, 0x0B800011,\n\t\t0xE60, 0x15800012,\n\t\t0xE60, 0x08800013,\n\t\t0xE60, 0x1A800014,\n\t\t0xE60, 0x0B800015,\n\t\t0xE60, 0x05800016,\n\t\t0xE60, 0x07800017,\n\t\t0xE60, 0x1A800018,\n\t\t0xE60, 0x0B800019,\n\t\t0xE60, 0x1580001A,\n\t\t0xE60, 0x0880001B,\n\t\t0xE60, 0x1B80001C,\n\t\t0xE60, 0x0B80001D,\n\t\t0xE60, 0x0580001E,\n\t\t0xE60, 0x0780001F,\n\t\t0xE60, 0x1B800020,\n\t\t0xE60, 0x0B800021,\n\t\t0xE60, 0x05800022,\n\t\t0xE60, 0x07800023,\n\t\t0xE60, 0x1B800024,\n\t\t0xE60, 0x0B800025,\n\t\t0xE60, 0x05800026,\n\t\t0xE60, 0x07800027,\n\t\t0xE60, 0x1B800028,\n\t\t0xE60, 0x0B800029,\n\t\t0xE60, 0x0580002A,\n\t\t0xE60, 0x0780002B,\n\t\t0xE60, 0x1B800030,\n\t\t0xE60, 0x0B800031,\n\t\t0xE60, 0x05800032,\n\t\t0xE60, 0x00800033,\n\t\t0xE60, 0x1B800034,\n\t\t0xE60, 0x0B800035,\n\t\t0xE60, 0x05800036,\n\t\t0xE60, 0x00800037,\n\t\t0xE60, 0x1B800038,\n\t\t0xE60, 0x0B800039,\n\t\t0xE60, 0x0580003A,\n\t\t0xE60, 0x0E80803B,\n\t\t0xE94, 0x01000401,\n\t\t0xE98, 0x00188000,\n\t\t0xEA0, 0x00002929,\n\t\t0xEA4, 0x08040201,\n\t\t0xEA8, 0x80402010,\n\t\t0xEAC, 0x77777000,\n\t\t0xEB0, 0x54775477,\n\t\t0xEB4, 0x54775477,\n\t\t0xEB8, 0x00500000,\n\t\t0xEBC, 0x77700000,\n\t\t0x1800, 0x00000007,\n\t\t0x1804, 0x00042020,\n\t\t0x1808, 0x80410231,\n\t\t0x180C, 0x00000000,\n\t\t0x1810, 0x00000100,\n\t\t0x1814, 0x01000000,\n\t\t0x181C, 0x40000053,\n\t\t0x1850, 0x00000020,\n\t\t0x1854, 0x00000000,\n\t0x8000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1858, 0x3C0A0C14,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1858, 0x3C0A0C14,\n\t0xA0000000,\t0x00000000,\n\t\t0x1858, 0x3C020C14,\n\t0xB0000000,\t0x00000000,\n\t\t0x185C, 0x0D000058,\n\t\t0x1860, 0x1B800000,\n\t\t0x1860, 0x0B800001,\n\t\t0x1860, 0x05800002,\n\t\t0x1860, 0x07800003,\n\t\t0x1860, 0x1A800004,\n\t\t0x1860, 0x0B800005,\n\t\t0x1860, 0x05800006,\n\t\t0x1860, 0x0E800007,\n\t\t0x1860, 0x1A800008,\n\t\t0x1860, 0x0B800009,\n\t\t0x1860, 0x1580000A,\n\t\t0x1860, 0x0880000B,\n\t\t0x1860, 0x1A80000C,\n\t\t0x1860, 0x0B80000D,\n\t\t0x1860, 0x0580000E,\n\t\t0x1860, 0x0E80000F,\n\t\t0x1860, 0x1A800010,\n\t\t0x1860, 0x0B800011,\n\t\t0x1860, 0x15800012,\n\t\t0x1860, 0x08800013,\n\t\t0x1860, 0x1A800014,\n\t\t0x1860, 0x0B800015,\n\t\t0x1860, 0x05800016,\n\t\t0x1860, 0x07800017,\n\t\t0x1860, 0x1A800018,\n\t\t0x1860, 0x0B800019,\n\t\t0x1860, 0x1580001A,\n\t\t0x1860, 0x0880001B,\n\t\t0x1860, 0x1B80001C,\n\t\t0x1860, 0x0B80001D,\n\t\t0x1860, 0x0580001E,\n\t\t0x1860, 0x0780001F,\n\t\t0x1860, 0x1B800020,\n\t\t0x1860, 0x0B800021,\n\t\t0x1860, 0x05800022,\n\t\t0x1860, 0x07800023,\n\t\t0x1860, 0x1B800024,\n\t\t0x1860, 0x0B800025,\n\t\t0x1860, 0x05800026,\n\t\t0x1860, 0x07800027,\n\t\t0x1860, 0x1B800028,\n\t\t0x1860, 0x0B800029,\n\t\t0x1860, 0x0580002A,\n\t\t0x1860, 0x0780002B,\n\t\t0x1860, 0x1B800030,\n\t\t0x1860, 0x0B800031,\n\t\t0x1860, 0x05800032,\n\t\t0x1860, 0x00800033,\n\t\t0x1860, 0x1B800034,\n\t\t0x1860, 0x0B800035,\n\t\t0x1860, 0x05800036,\n\t\t0x1860, 0x00800037,\n\t\t0x1860, 0x1B800038,\n\t\t0x1860, 0x0B800039,\n\t\t0x1860, 0x0580003A,\n\t\t0x1860, 0x0E80803B,\n\t\t0x1894, 0x01000401,\n\t\t0x1898, 0x00188000,\n\t\t0x18A0, 0x00002929,\n\t\t0x18A4, 0x08040201,\n\t\t0x18A8, 0x80402010,\n\t\t0x18AC, 0x77777000,\n\t\t0x18B0, 0x54775477,\n\t\t0x18B4, 0x54775477,\n\t\t0x18B8, 0x00500000,\n\t\t0x18BC, 0x77700000,\n\t\t0x1A00, 0x00000007,\n\t\t0x1A04, 0x00042020,\n\t\t0x1A08, 0x80410231,\n\t\t0x1A0C, 0x00000000,\n\t\t0x1A10, 0x00000100,\n\t\t0x1A14, 0x01000000,\n\t\t0x1A1C, 0x40000053,\n\t\t0x1A50, 0x00000020,\n\t\t0x1A54, 0x00000000,\n\t0x8000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1A58, 0x3C0A0C14,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1A58, 0x3C0A0C14,\n\t0xA0000000,\t0x00000000,\n\t\t0x1A58, 0x3C020C14,\n\t0xB0000000,\t0x00000000,\n\t\t0x1A5C, 0x0D000058,\n\t\t0x1A60, 0x1B800000,\n\t\t0x1A60, 0x0B800001,\n\t\t0x1A60, 0x05800002,\n\t\t0x1A60, 0x07800003,\n\t\t0x1A60, 0x1A800004,\n\t\t0x1A60, 0x0B800005,\n\t\t0x1A60, 0x05800006,\n\t\t0x1A60, 0x0E800007,\n\t\t0x1A60, 0x1A800008,\n\t\t0x1A60, 0x0B800009,\n\t\t0x1A60, 0x1580000A,\n\t\t0x1A60, 0x0880000B,\n\t\t0x1A60, 0x1A80000C,\n\t\t0x1A60, 0x0B80000D,\n\t\t0x1A60, 0x0580000E,\n\t\t0x1A60, 0x0E80000F,\n\t\t0x1A60, 0x1A800010,\n\t\t0x1A60, 0x0B800011,\n\t\t0x1A60, 0x15800012,\n\t\t0x1A60, 0x08800013,\n\t\t0x1A60, 0x1A800014,\n\t\t0x1A60, 0x0B800015,\n\t\t0x1A60, 0x05800016,\n\t\t0x1A60, 0x07800017,\n\t\t0x1A60, 0x1A800018,\n\t\t0x1A60, 0x0B800019,\n\t\t0x1A60, 0x1580001A,\n\t\t0x1A60, 0x0880001B,\n\t\t0x1A60, 0x1B80001C,\n\t\t0x1A60, 0x0B80001D,\n\t\t0x1A60, 0x0580001E,\n\t\t0x1A60, 0x0780001F,\n\t\t0x1A60, 0x1B800020,\n\t\t0x1A60, 0x0B800021,\n\t\t0x1A60, 0x05800022,\n\t\t0x1A60, 0x07800023,\n\t\t0x1A60, 0x1B800024,\n\t\t0x1A60, 0x0B800025,\n\t\t0x1A60, 0x05800026,\n\t\t0x1A60, 0x07800027,\n\t\t0x1A60, 0x1B800028,\n\t\t0x1A60, 0x0B800029,\n\t\t0x1A60, 0x0580002A,\n\t\t0x1A60, 0x0780002B,\n\t\t0x1A60, 0x1B800030,\n\t\t0x1A60, 0x0B800031,\n\t\t0x1A60, 0x05800032,\n\t\t0x1A60, 0x00800033,\n\t\t0x1A60, 0x1B800034,\n\t\t0x1A60, 0x0B800035,\n\t\t0x1A60, 0x05800036,\n\t\t0x1A60, 0x00800037,\n\t\t0x1A60, 0x1B800038,\n\t\t0x1A60, 0x0B800039,\n\t\t0x1A60, 0x0580003A,\n\t\t0x1A60, 0x0E80803B,\n\t\t0x1A94, 0x01000401,\n\t\t0x1A98, 0x00188000,\n\t\t0x1AA0, 0x00002929,\n\t\t0x1AA4, 0x08040201,\n\t\t0x1AA8, 0x80402010,\n\t\t0x1AAC, 0x77777000,\n\t\t0x1AB0, 0x54775477,\n\t\t0x1AB4, 0x54775477,\n\t\t0x1AB8, 0x00500000,\n\t\t0x1ABC, 0x77700000,\n\t\t0x1904, 0x00030000,\n\t\t0x1914, 0x00030000,\n\t\t0x1984, 0x03000000,\n\t\t0x1988, 0x00000087,\n\t\t0x198C, 0x00000007,\n\t\t0x1990, 0xFFAA5500,\n\t\t0x1994, 0x00000077,\n\t\t0x1998, 0x12801000,\n\t\t0x1998, 0x12801000,\n\t\t0x1998, 0x12801001,\n\t\t0x1998, 0x12801002,\n\t\t0x1998, 0x12801003,\n\t\t0x1998, 0x12801004,\n\t\t0x1998, 0x12801005,\n\t\t0x1998, 0x12801006,\n\t\t0x1998, 0x12801007,\n\t\t0x1998, 0x12801008,\n\t\t0x1998, 0x12801009,\n\t\t0x1998, 0x1280100A,\n\t\t0x1998, 0x1280100B,\n\t\t0x1998, 0x1280100C,\n\t\t0x1998, 0x1280100D,\n\t\t0x1998, 0x1280100E,\n\t\t0x1998, 0x1280100F,\n\t\t0x1998, 0x12801010,\n\t\t0x1998, 0x12801011,\n\t\t0x1998, 0x12801012,\n\t\t0x1998, 0x12801013,\n\t\t0x1998, 0x12801014,\n\t\t0x1998, 0x12801015,\n\t\t0x1998, 0x12801016,\n\t\t0x1998, 0x12801017,\n\t\t0x1998, 0x12801018,\n\t\t0x1998, 0x12801019,\n\t\t0x1998, 0x1280101A,\n\t\t0x1998, 0x1280101B,\n\t\t0x1998, 0x1280101C,\n\t\t0x1998, 0x1280101D,\n\t\t0x1998, 0x1280101E,\n\t\t0x1998, 0x1280101F,\n\t\t0x1998, 0x12801020,\n\t\t0x1998, 0x12801021,\n\t\t0x1998, 0x12801022,\n\t\t0x1998, 0x12801023,\n\t\t0x1998, 0x1280102C,\n\t\t0x1998, 0x1280102D,\n\t\t0x1998, 0x1280102E,\n\t\t0x1998, 0x1280102F,\n\t\t0x1998, 0x12801030,\n\t\t0x1998, 0x12801031,\n\t\t0x1998, 0x12801032,\n\t\t0x1998, 0x12801033,\n\t\t0x1998, 0x12801034,\n\t\t0x1998, 0x12801035,\n\t\t0x1998, 0x12801036,\n\t\t0x1998, 0x12801037,\n\t\t0x1998, 0x12801038,\n\t\t0x1998, 0x12801039,\n\t\t0x1998, 0x1280103A,\n\t\t0x1998, 0x1280103B,\n\t\t0x1998, 0x1280103C,\n\t\t0x1998, 0x1280103D,\n\t\t0x1998, 0x1280103E,\n\t\t0x1998, 0x1280103F,\n\t\t0x1998, 0x12801040,\n\t\t0x1998, 0x12801041,\n\t\t0x1998, 0x12801042,\n\t\t0x1998, 0x12801043,\n\t\t0x1998, 0x12801044,\n\t\t0x1998, 0x12801045,\n\t\t0x1998, 0x12801046,\n\t\t0x1998, 0x12801047,\n\t\t0x1998, 0x12801048,\n\t\t0x1998, 0x12801049,\n\t\t0x1998, 0x12801100,\n\t\t0x1998, 0x12801101,\n\t\t0x1998, 0x12801102,\n\t\t0x1998, 0x12801103,\n\t\t0x1998, 0x12801104,\n\t\t0x1998, 0x12801105,\n\t\t0x1998, 0x12801106,\n\t\t0x1998, 0x12801107,\n\t\t0x1998, 0x12801108,\n\t\t0x1998, 0x12801109,\n\t\t0x1998, 0x1280110A,\n\t\t0x1998, 0x1280110B,\n\t\t0x1998, 0x1280110C,\n\t\t0x1998, 0x1280110D,\n\t\t0x1998, 0x1280110E,\n\t\t0x1998, 0x1280110F,\n\t\t0x1998, 0x12801110,\n\t\t0x1998, 0x12801111,\n\t\t0x1998, 0x12801112,\n\t\t0x1998, 0x12801113,\n\t\t0x1998, 0x12801114,\n\t\t0x1998, 0x12801115,\n\t\t0x1998, 0x12801116,\n\t\t0x1998, 0x12801117,\n\t\t0x1998, 0x12801118,\n\t\t0x1998, 0x12801119,\n\t\t0x1998, 0x1280111A,\n\t\t0x1998, 0x1280111B,\n\t\t0x1998, 0x1280111C,\n\t\t0x1998, 0x1280111D,\n\t\t0x1998, 0x1280111E,\n\t\t0x1998, 0x1280111F,\n\t\t0x1998, 0x12801120,\n\t\t0x1998, 0x12801121,\n\t\t0x1998, 0x12801122,\n\t\t0x1998, 0x12801123,\n\t\t0x1998, 0x1280112C,\n\t\t0x1998, 0x1280112D,\n\t\t0x1998, 0x1280112E,\n\t\t0x1998, 0x1280112F,\n\t\t0x1998, 0x12801130,\n\t\t0x1998, 0x12801131,\n\t\t0x1998, 0x12801132,\n\t\t0x1998, 0x12801133,\n\t\t0x1998, 0x12801134,\n\t\t0x1998, 0x12801135,\n\t\t0x1998, 0x12801136,\n\t\t0x1998, 0x12801137,\n\t\t0x1998, 0x12801138,\n\t\t0x1998, 0x12801139,\n\t\t0x1998, 0x1280113A,\n\t\t0x1998, 0x1280113B,\n\t\t0x1998, 0x1280113C,\n\t\t0x1998, 0x1280113D,\n\t\t0x1998, 0x1280113E,\n\t\t0x1998, 0x1280113F,\n\t\t0x1998, 0x12801140,\n\t\t0x1998, 0x12801141,\n\t\t0x1998, 0x12801142,\n\t\t0x1998, 0x12801143,\n\t\t0x1998, 0x12801144,\n\t\t0x1998, 0x12801145,\n\t\t0x1998, 0x12801146,\n\t\t0x1998, 0x12801147,\n\t\t0x1998, 0x12801148,\n\t\t0x1998, 0x12801149,\n\t\t0x1998, 0x12801200,\n\t\t0x1998, 0x12801201,\n\t\t0x1998, 0x12801202,\n\t\t0x1998, 0x12801203,\n\t\t0x1998, 0x12801204,\n\t\t0x1998, 0x12801205,\n\t\t0x1998, 0x12801206,\n\t\t0x1998, 0x12801207,\n\t\t0x1998, 0x12801208,\n\t\t0x1998, 0x12801209,\n\t\t0x1998, 0x1280120A,\n\t\t0x1998, 0x1280120B,\n\t\t0x1998, 0x1280120C,\n\t\t0x1998, 0x1280120D,\n\t\t0x1998, 0x1280120E,\n\t\t0x1998, 0x1280120F,\n\t\t0x1998, 0x12801210,\n\t\t0x1998, 0x12801211,\n\t\t0x1998, 0x12801212,\n\t\t0x1998, 0x12801213,\n\t\t0x1998, 0x12801214,\n\t\t0x1998, 0x12801215,\n\t\t0x1998, 0x12801216,\n\t\t0x1998, 0x12801217,\n\t\t0x1998, 0x12801218,\n\t\t0x1998, 0x12801219,\n\t\t0x1998, 0x1280121A,\n\t\t0x1998, 0x1280121B,\n\t\t0x1998, 0x1280121C,\n\t\t0x1998, 0x1280121D,\n\t\t0x1998, 0x1280121E,\n\t\t0x1998, 0x1280121F,\n\t\t0x1998, 0x12801220,\n\t\t0x1998, 0x12801221,\n\t\t0x1998, 0x12801222,\n\t\t0x1998, 0x12801223,\n\t\t0x1998, 0x1280122C,\n\t\t0x1998, 0x1280122D,\n\t\t0x1998, 0x1280122E,\n\t\t0x1998, 0x1280122F,\n\t\t0x1998, 0x12801230,\n\t\t0x1998, 0x12801231,\n\t\t0x1998, 0x12801232,\n\t\t0x1998, 0x12801233,\n\t\t0x1998, 0x12801234,\n\t\t0x1998, 0x12801235,\n\t\t0x1998, 0x12801236,\n\t\t0x1998, 0x12801237,\n\t\t0x1998, 0x12801238,\n\t\t0x1998, 0x12801239,\n\t\t0x1998, 0x1280123A,\n\t\t0x1998, 0x1280123B,\n\t\t0x1998, 0x1280123C,\n\t\t0x1998, 0x1280123D,\n\t\t0x1998, 0x1280123E,\n\t\t0x1998, 0x1280123F,\n\t\t0x1998, 0x12801240,\n\t\t0x1998, 0x12801241,\n\t\t0x1998, 0x12801242,\n\t\t0x1998, 0x12801243,\n\t\t0x1998, 0x12801244,\n\t\t0x1998, 0x12801245,\n\t\t0x1998, 0x12801246,\n\t\t0x1998, 0x12801247,\n\t\t0x1998, 0x12801248,\n\t\t0x1998, 0x12801249,\n\t\t0x1998, 0x12801300,\n\t\t0x1998, 0x12801301,\n\t\t0x1998, 0x12801302,\n\t\t0x1998, 0x12801303,\n\t\t0x1998, 0x12801304,\n\t\t0x1998, 0x12801305,\n\t\t0x1998, 0x12801306,\n\t\t0x1998, 0x12801307,\n\t\t0x1998, 0x12801308,\n\t\t0x1998, 0x12801309,\n\t\t0x1998, 0x1280130A,\n\t\t0x1998, 0x1280130B,\n\t\t0x1998, 0x1280130C,\n\t\t0x1998, 0x1280130D,\n\t\t0x1998, 0x1280130E,\n\t\t0x1998, 0x1280130F,\n\t\t0x1998, 0x12801310,\n\t\t0x1998, 0x12801311,\n\t\t0x1998, 0x12801312,\n\t\t0x1998, 0x12801313,\n\t\t0x1998, 0x12801314,\n\t\t0x1998, 0x12801315,\n\t\t0x1998, 0x12801316,\n\t\t0x1998, 0x12801317,\n\t\t0x1998, 0x12801318,\n\t\t0x1998, 0x12801319,\n\t\t0x1998, 0x1280131A,\n\t\t0x1998, 0x1280131B,\n\t\t0x1998, 0x1280131C,\n\t\t0x1998, 0x1280131D,\n\t\t0x1998, 0x1280131E,\n\t\t0x1998, 0x1280131F,\n\t\t0x1998, 0x12801320,\n\t\t0x1998, 0x12801321,\n\t\t0x1998, 0x12801322,\n\t\t0x1998, 0x12801323,\n\t\t0x1998, 0x1280132C,\n\t\t0x1998, 0x1280132D,\n\t\t0x1998, 0x1280132E,\n\t\t0x1998, 0x1280132F,\n\t\t0x1998, 0x12801330,\n\t\t0x1998, 0x12801331,\n\t\t0x1998, 0x12801332,\n\t\t0x1998, 0x12801333,\n\t\t0x1998, 0x12801334,\n\t\t0x1998, 0x12801335,\n\t\t0x1998, 0x12801336,\n\t\t0x1998, 0x12801337,\n\t\t0x1998, 0x12801338,\n\t\t0x1998, 0x12801339,\n\t\t0x1998, 0x1280133A,\n\t\t0x1998, 0x1280133B,\n\t\t0x1998, 0x1280133C,\n\t\t0x1998, 0x1280133D,\n\t\t0x1998, 0x1280133E,\n\t\t0x1998, 0x1280133F,\n\t\t0x1998, 0x12801340,\n\t\t0x1998, 0x12801341,\n\t\t0x1998, 0x12801342,\n\t\t0x1998, 0x12801343,\n\t\t0x1998, 0x12801344,\n\t\t0x1998, 0x12801345,\n\t\t0x1998, 0x12801346,\n\t\t0x1998, 0x12801347,\n\t\t0x1998, 0x12801348,\n\t\t0x1998, 0x12801349,\n\t\t0x19D4, 0x88888888,\n\t\t0x19D8, 0x00000888,\n\t\t0xB00, 0xE3100100,\n\t\t0xB00, 0xE7100100,\n\t\t0xC60, 0x15808002,\n\t\t0xC60, 0x01808003,\n\t\t0xE60, 0x15808002,\n\t\t0xE60, 0x01808003,\n\t\t0x1860, 0x15808002,\n\t\t0x1860, 0x01808003,\n\t\t0x1A60, 0x15808002,\n\t\t0x1A60, 0x01808003,\n\t\t0xB00, 0xE3100100,\n\t\t0xC5C, 0x0D080058,\n\t\t0xE5C, 0x0D080058,\n\t\t0x185C, 0x0D080058,\n\t\t0x1A5C, 0x0D080058,\n\t\t0xC5C, 0x0D000058,\n\t\t0xE5C, 0x0D000058,\n\t\t0x185C, 0x0D000058,\n\t\t0x1A5C, 0x0D000058,\n\t\t0xC60, 0x05808002,\n\t\t0xC60, 0x0E808003,\n\t\t0xE60, 0x05808002,\n\t\t0xE60, 0x0E808003,\n\t\t0x1860, 0x05808002,\n\t\t0x1860, 0x0E808003,\n\t\t0x1A60, 0x05808002,\n\t\t0x1A60, 0x0E808003,\n\t\t0xB00, 0xE7100100,\n\t\t0xB00, 0xE3100100,\n\t\t0xB00, 0xE3100000,\n\t\t0x1C38, 0x00000002,\n\t\t0xA00, 0x00D047C8,\n\t\t0xA04, 0x46FF800C,\n\t\t0xA08, 0x8C838300,\n\t\t0xA0C, 0x2E7E000F,\n\t\t0xA10, 0x9500BB78,\n\t\t0xA14, 0x11144028,\n\t\t0xA18, 0x00881117,\n\t\t0xA1C, 0x89140F00,\n\t\t0xA20, 0x1A1B0030,\n\t\t0xA24, 0x090E1317,\n\t\t0xA28, 0x00000204,\n\t\t0xA2C, 0x00900000,\n\t\t0xA70, 0x101FFF00,\n\t\t0xA74, 0x00000128,\n\t\t0xA78, 0x00000900,\n\t\t0xA7C, 0x225B0606,\n\t\t0xA80, 0x218075B2,\n\t\t0xA84, 0x9C1F8C00,\n\t\t0x1B04, 0xE24628D2,\n\t\t0x1B10, 0x88010D46,\n\t\t0x1B14, 0x00000000,\n\t\t0x1B18, 0x00292903,\n\t\t0x1B00, 0xF8000000,\n\t\t0x1B00, 0xF800D000,\n\t\t0x1B00, 0xF801F000,\n\t\t0x1B1C, 0xA2123DB2,\n\t\t0x1B20, 0x07040001,\n\t\t0x1B24, 0x07060807,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B28, 0xC0060324,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B28, 0xC0060348,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B2C, 0x20000003,\n\t\t0x1B30, 0x20000000,\n\t\t0x1B38, 0x20000000,\n\t\t0x1B3C, 0x20000000,\n\t\t0x1BD4, 0x00000001,\n\t\t0x1B94, 0x80000000,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B34, 0x00000002,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B00, 0xF8000002,\n\t\t0x1B00, 0xF800D002,\n\t\t0x1B00, 0xF801F002,\n\t\t0x1B1C, 0xA2123DB2,\n\t\t0x1B20, 0x07040001,\n\t\t0x1B24, 0x07060807,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B28, 0xC0060324,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B28, 0xC0060348,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B2C, 0x20000003,\n\t\t0x1B30, 0x20000000,\n\t\t0x1B38, 0x20000000,\n\t\t0x1B3C, 0x20000000,\n\t\t0x1BD4, 0x00000001,\n\t\t0x1B94, 0x80000000,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B34, 0x00000002,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B00, 0xF8000004,\n\t\t0x1B00, 0xF800D004,\n\t\t0x1B00, 0xF801F004,\n\t\t0x1B1C, 0xA2123DB2,\n\t\t0x1B20, 0x07040001,\n\t\t0x1B24, 0x07060807,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B28, 0xC0060324,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B28, 0xC0060348,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B2C, 0x20000003,\n\t\t0x1B30, 0x20000000,\n\t\t0x1B38, 0x20000000,\n\t\t0x1B3C, 0x20000000,\n\t\t0x1BD4, 0x00000001,\n\t\t0x1B94, 0x80000000,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B34, 0x00000002,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B00, 0xF8000006,\n\t\t0x1B00, 0xF800D006,\n\t\t0x1B00, 0xF801F006,\n\t\t0x1B1C, 0xA2123DB2,\n\t\t0x1B20, 0x07040001,\n\t\t0x1B24, 0x07060807,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B28, 0xC0060324,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B28, 0xC0060324,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B28, 0xC0060348,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B2C, 0x20000003,\n\t\t0x1B30, 0x20000000,\n\t\t0x1B38, 0x20000000,\n\t\t0x1B3C, 0x20000000,\n\t\t0x1BD4, 0x00000001,\n\t\t0x1B94, 0x80000000,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B34, 0x00000002,\n\t\t0x1B34, 0x00000000,\n\t\t0x1B00, 0xF8000000,\n\t\t0x1B80, 0x00000007,\n\t\t0x1B80, 0x09060005,\n\t\t0x1B80, 0x09060007,\n\t\t0x1B80, 0x0FFE0015,\n\t\t0x1B80, 0x0FFE0017,\n\t\t0x1B80, 0x00240025,\n\t\t0x1B80, 0x00240027,\n\t\t0x1B80, 0x00040035,\n\t\t0x1B80, 0x00040037,\n\t\t0x1B80, 0x05C00045,\n\t\t0x1B80, 0x05C00047,\n\t\t0x1B80, 0x00070055,\n\t\t0x1B80, 0x00070057,\n\t\t0x1B80, 0x64000065,\n\t\t0x1B80, 0x64000067,\n\t\t0x1B80, 0x00020075,\n\t\t0x1B80, 0x00020077,\n\t\t0x1B80, 0x00080085,\n\t\t0x1B80, 0x00080087,\n\t\t0x1B80, 0x80000095,\n\t\t0x1B80, 0x80000097,\n\t\t0x1B80, 0x090100A5,\n\t\t0x1B80, 0x090100A7,\n\t\t0x1B80, 0x0F0200B5,\n\t\t0x1B80, 0x0F0200B7,\n\t\t0x1B80, 0x002400C5,\n\t\t0x1B80, 0x002400C7,\n\t\t0x1B80, 0x000400D5,\n\t\t0x1B80, 0x000400D7,\n\t\t0x1B80, 0x05C000E5,\n\t\t0x1B80, 0x05C000E7,\n\t\t0x1B80, 0x000700F5,\n\t\t0x1B80, 0x000700F7,\n\t\t0x1B80, 0x64020105,\n\t\t0x1B80, 0x64020107,\n\t\t0x1B80, 0x00020115,\n\t\t0x1B80, 0x00020117,\n\t\t0x1B80, 0x00040125,\n\t\t0x1B80, 0x00040127,\n\t\t0x1B80, 0x4A000135,\n\t\t0x1B80, 0x4A000137,\n\t\t0x1B80, 0x4B040145,\n\t\t0x1B80, 0x4B040147,\n\t\t0x1B80, 0x85030155,\n\t\t0x1B80, 0x85030157,\n\t\t0x1B80, 0x40010165,\n\t\t0x1B80, 0x40010167,\n\t\t0x1B80, 0xE0290175,\n\t\t0x1B80, 0xE0290177,\n\t\t0x1B80, 0x00040185,\n\t\t0x1B80, 0x00040187,\n\t\t0x1B80, 0x4B050195,\n\t\t0x1B80, 0x4B050197,\n\t\t0x1B80, 0x860301A5,\n\t\t0x1B80, 0x860301A7,\n\t\t0x1B80, 0x400301B5,\n\t\t0x1B80, 0x400301B7,\n\t\t0x1B80, 0xE02901C5,\n\t\t0x1B80, 0xE02901C7,\n\t\t0x1B80, 0x000401D5,\n\t\t0x1B80, 0x000401D7,\n\t\t0x1B80, 0x4B0601E5,\n\t\t0x1B80, 0x4B0601E7,\n\t\t0x1B80, 0x870301F5,\n\t\t0x1B80, 0x870301F7,\n\t\t0x1B80, 0x40050205,\n\t\t0x1B80, 0x40050207,\n\t\t0x1B80, 0xE0290215,\n\t\t0x1B80, 0xE0290217,\n\t\t0x1B80, 0x00040225,\n\t\t0x1B80, 0x00040227,\n\t\t0x1B80, 0x4B070235,\n\t\t0x1B80, 0x4B070237,\n\t\t0x1B80, 0x88030245,\n\t\t0x1B80, 0x88030247,\n\t\t0x1B80, 0x40070255,\n\t\t0x1B80, 0x40070257,\n\t\t0x1B80, 0xE0290265,\n\t\t0x1B80, 0xE0290267,\n\t\t0x1B80, 0x4B000275,\n\t\t0x1B80, 0x4B000277,\n\t\t0x1B80, 0x30000285,\n\t\t0x1B80, 0x30000287,\n\t\t0x1B80, 0xFE100295,\n\t\t0x1B80, 0xFE100297,\n\t\t0x1B80, 0xFF1002A5,\n\t\t0x1B80, 0xFF1002A7,\n\t\t0x1B80, 0xE18602B5,\n\t\t0x1B80, 0xE18602B7,\n\t\t0x1B80, 0xF00A02C5,\n\t\t0x1B80, 0xF00A02C7,\n\t\t0x1B80, 0xF10A02D5,\n\t\t0x1B80, 0xF10A02D7,\n\t\t0x1B80, 0xF20A02E5,\n\t\t0x1B80, 0xF20A02E7,\n\t\t0x1B80, 0xF30802F5,\n\t\t0x1B80, 0xF30802F7,\n\t\t0x1B80, 0xF4070305,\n\t\t0x1B80, 0xF4070307,\n\t\t0x1B80, 0xF5060315,\n\t\t0x1B80, 0xF5060317,\n\t\t0x1B80, 0xF7060325,\n\t\t0x1B80, 0xF7060327,\n\t\t0x1B80, 0xF8050335,\n\t\t0x1B80, 0xF8050337,\n\t\t0x1B80, 0xF9040345,\n\t\t0x1B80, 0xF9040347,\n\t\t0x1B80, 0x00010355,\n\t\t0x1B80, 0x00010357,\n\t\t0x1B80, 0x303B0365,\n\t\t0x1B80, 0x303B0367,\n\t\t0x1B80, 0x30500375,\n\t\t0x1B80, 0x30500377,\n\t\t0x1B80, 0x305C0385,\n\t\t0x1B80, 0x305C0387,\n\t\t0x1B80, 0x31D50395,\n\t\t0x1B80, 0x31D50397,\n\t\t0x1B80, 0x31C503A5,\n\t\t0x1B80, 0x31C503A7,\n\t\t0x1B80, 0x4D0403B5,\n\t\t0x1B80, 0x4D0403B7,\n\t\t0x1B80, 0x2EF003C5,\n\t\t0x1B80, 0x2EF003C7,\n\t\t0x1B80, 0x000203D5,\n\t\t0x1B80, 0x000203D7,\n\t\t0x1B80, 0x208003E5,\n\t\t0x1B80, 0x208003E7,\n\t\t0x1B80, 0x000003F5,\n\t\t0x1B80, 0x000003F7,\n\t\t0x1B80, 0x4D000405,\n\t\t0x1B80, 0x4D000407,\n\t\t0x1B80, 0x55070415,\n\t\t0x1B80, 0x55070417,\n\t\t0x1B80, 0xE1230425,\n\t\t0x1B80, 0xE1230427,\n\t\t0x1B80, 0xE1230435,\n\t\t0x1B80, 0xE1230437,\n\t\t0x1B80, 0x4D040445,\n\t\t0x1B80, 0x4D040447,\n\t\t0x1B80, 0x20800455,\n\t\t0x1B80, 0x20800457,\n\t\t0x1B80, 0x84000465,\n\t\t0x1B80, 0x84000467,\n\t\t0x1B80, 0x4D000475,\n\t\t0x1B80, 0x4D000477,\n\t\t0x1B80, 0x550F0485,\n\t\t0x1B80, 0x550F0487,\n\t\t0x1B80, 0xE1230495,\n\t\t0x1B80, 0xE1230497,\n\t\t0x1B80, 0x4F0204A5,\n\t\t0x1B80, 0x4F0204A7,\n\t\t0x1B80, 0x4E0004B5,\n\t\t0x1B80, 0x4E0004B7,\n\t\t0x1B80, 0x530204C5,\n\t\t0x1B80, 0x530204C7,\n\t\t0x1B80, 0x520104D5,\n\t\t0x1B80, 0x520104D7,\n\t\t0x1B80, 0xE12704E5,\n\t\t0x1B80, 0xE12704E7,\n\t\t0x1B80, 0x000104F5,\n\t\t0x1B80, 0x000104F7,\n\t\t0x1B80, 0x5C720505,\n\t\t0x1B80, 0x5C720507,\n\t\t0x1B80, 0xE1320515,\n\t\t0x1B80, 0xE1320517,\n\t\t0x1B80, 0x54E50525,\n\t\t0x1B80, 0x54E50527,\n\t\t0x1B80, 0x54BF0535,\n\t\t0x1B80, 0x54BF0537,\n\t\t0x1B80, 0x54C50545,\n\t\t0x1B80, 0x54C50547,\n\t\t0x1B80, 0x54BE0555,\n\t\t0x1B80, 0x54BE0557,\n\t\t0x1B80, 0x54DF0565,\n\t\t0x1B80, 0x54DF0567,\n\t\t0x1B80, 0x0BA60575,\n\t\t0x1B80, 0x0BA60577,\n\t\t0x1B80, 0xF3130585,\n\t\t0x1B80, 0xF3130587,\n\t\t0x1B80, 0xF41E0595,\n\t\t0x1B80, 0xF41E0597,\n\t\t0x1B80, 0xF53C05A5,\n\t\t0x1B80, 0xF53C05A7,\n\t\t0x1B80, 0x000105B5,\n\t\t0x1B80, 0x000105B7,\n\t\t0x1B80, 0x620605C5,\n\t\t0x1B80, 0x620605C7,\n\t\t0x1B80, 0x600605D5,\n\t\t0x1B80, 0x600605D7,\n\t\t0x1B80, 0xE1A905E5,\n\t\t0x1B80, 0xE1A905E7,\n\t\t0x1B80, 0x0C0005F5,\n\t\t0x1B80, 0x0C0005F7,\n\t\t0x1B80, 0x5C720605,\n\t\t0x1B80, 0x5C720607,\n\t\t0x1B80, 0xE1320615,\n\t\t0x1B80, 0xE1320617,\n\t\t0x1B80, 0x5CF10625,\n\t\t0x1B80, 0x5CF10627,\n\t\t0x1B80, 0x0C010635,\n\t\t0x1B80, 0x0C010637,\n\t\t0x1B80, 0xF2020645,\n\t\t0x1B80, 0xF2020647,\n\t\t0x1B80, 0x30D60655,\n\t\t0x1B80, 0x30D60657,\n\t\t0x1B80, 0x0AC60665,\n\t\t0x1B80, 0x0AC60667,\n\t\t0x1B80, 0xE1B60675,\n\t\t0x1B80, 0xE1B60677,\n\t\t0x1B80, 0xE1580685,\n\t\t0x1B80, 0xE1580687,\n\t\t0x1B80, 0x54E50695,\n\t\t0x1B80, 0x54E50697,\n\t\t0x1B80, 0x000106A5,\n\t\t0x1B80, 0x000106A7,\n\t\t0x1B80, 0x560106B5,\n\t\t0x1B80, 0x560106B7,\n\t\t0x1B80, 0x5CE206C5,\n\t\t0x1B80, 0x5CE206C7,\n\t\t0x1B80, 0x0AE106D5,\n\t\t0x1B80, 0x0AE106D7,\n\t\t0x1B80, 0x630C06E5,\n\t\t0x1B80, 0x630C06E7,\n\t\t0x1B80, 0xE13F06F5,\n\t\t0x1B80, 0xE13F06F7,\n\t\t0x1B80, 0x00270705,\n\t\t0x1B80, 0x00270707,\n\t\t0x1B80, 0xE16C0715,\n\t\t0x1B80, 0xE16C0717,\n\t\t0x1B80, 0x00020725,\n\t\t0x1B80, 0x00020727,\n\t\t0x1B80, 0x002A0735,\n\t\t0x1B80, 0x002A0737,\n\t\t0x1B80, 0x07140745,\n\t\t0x1B80, 0x07140747,\n\t\t0x1B80, 0x00020755,\n\t\t0x1B80, 0x00020757,\n\t\t0x1B80, 0x30C30765,\n\t\t0x1B80, 0x30C30767,\n\t\t0x1B80, 0x56010775,\n\t\t0x1B80, 0x56010777,\n\t\t0x1B80, 0x5CE20785,\n\t\t0x1B80, 0x5CE20787,\n\t\t0x1B80, 0x0AE10795,\n\t\t0x1B80, 0x0AE10797,\n\t\t0x1B80, 0x631707A5,\n\t\t0x1B80, 0x631707A7,\n\t\t0x1B80, 0xE13F07B5,\n\t\t0x1B80, 0xE13F07B7,\n\t\t0x1B80, 0x002507C5,\n\t\t0x1B80, 0x002507C7,\n\t\t0x1B80, 0xE16C07D5,\n\t\t0x1B80, 0xE16C07D7,\n\t\t0x1B80, 0x000207E5,\n\t\t0x1B80, 0x000207E7,\n\t\t0x1B80, 0x630F07F5,\n\t\t0x1B80, 0x630F07F7,\n\t\t0x1B80, 0xE13F0805,\n\t\t0x1B80, 0xE13F0807,\n\t\t0x1B80, 0x63070815,\n\t\t0x1B80, 0x63070817,\n\t\t0x1B80, 0xE13F0825,\n\t\t0x1B80, 0xE13F0827,\n\t\t0x1B80, 0x07140835,\n\t\t0x1B80, 0x07140837,\n\t\t0x1B80, 0x56000845,\n\t\t0x1B80, 0x56000847,\n\t\t0x1B80, 0x5CF20855,\n\t\t0x1B80, 0x5CF20857,\n\t\t0x1B80, 0x0AF10865,\n\t\t0x1B80, 0x0AF10867,\n\t\t0x1B80, 0x07140875,\n\t\t0x1B80, 0x07140877,\n\t\t0x1B80, 0x07140885,\n\t\t0x1B80, 0x07140887,\n\t\t0x1B80, 0x630F0895,\n\t\t0x1B80, 0x630F0897,\n\t\t0x1B80, 0xE13F08A5,\n\t\t0x1B80, 0xE13F08A7,\n\t\t0x1B80, 0x631708B5,\n\t\t0x1B80, 0x631708B7,\n\t\t0x1B80, 0xE13F08C5,\n\t\t0x1B80, 0xE13F08C7,\n\t\t0x1B80, 0x002508D5,\n\t\t0x1B80, 0x002508D7,\n\t\t0x1B80, 0xE16C08E5,\n\t\t0x1B80, 0xE16C08E7,\n\t\t0x1B80, 0x000208F5,\n\t\t0x1B80, 0x000208F7,\n\t\t0x1B80, 0x30C30905,\n\t\t0x1B80, 0x30C30907,\n\t\t0x1B80, 0xE1A90915,\n\t\t0x1B80, 0xE1A90917,\n\t\t0x1B80, 0x62060925,\n\t\t0x1B80, 0x62060927,\n\t\t0x1B80, 0x60060935,\n\t\t0x1B80, 0x60060937,\n\t\t0x1B80, 0xE1160945,\n\t\t0x1B80, 0xE1160947,\n\t\t0x1B80, 0x54BE0955,\n\t\t0x1B80, 0x54BE0957,\n\t\t0x1B80, 0x56010965,\n\t\t0x1B80, 0x56010967,\n\t\t0x1B80, 0x5CE20975,\n\t\t0x1B80, 0x5CE20977,\n\t\t0x1B80, 0x0AE10985,\n\t\t0x1B80, 0x0AE10987,\n\t\t0x1B80, 0x633A0995,\n\t\t0x1B80, 0x633A0997,\n\t\t0x1B80, 0xE13F09A5,\n\t\t0x1B80, 0xE13F09A7,\n\t\t0x1B80, 0x633709B5,\n\t\t0x1B80, 0x633709B7,\n\t\t0x1B80, 0xE13F09C5,\n\t\t0x1B80, 0xE13F09C7,\n\t\t0x1B80, 0x632F09D5,\n\t\t0x1B80, 0x632F09D7,\n\t\t0x1B80, 0xE13F09E5,\n\t\t0x1B80, 0xE13F09E7,\n\t\t0x1B80, 0x632709F5,\n\t\t0x1B80, 0x632709F7,\n\t\t0x1B80, 0xE13F0A05,\n\t\t0x1B80, 0xE13F0A07,\n\t\t0x1B80, 0x631F0A15,\n\t\t0x1B80, 0x631F0A17,\n\t\t0x1B80, 0xE13F0A25,\n\t\t0x1B80, 0xE13F0A27,\n\t\t0x1B80, 0x63170A35,\n\t\t0x1B80, 0x63170A37,\n\t\t0x1B80, 0xE13F0A45,\n\t\t0x1B80, 0xE13F0A47,\n\t\t0x1B80, 0x630F0A55,\n\t\t0x1B80, 0x630F0A57,\n\t\t0x1B80, 0xE13F0A65,\n\t\t0x1B80, 0xE13F0A67,\n\t\t0x1B80, 0x63070A75,\n\t\t0x1B80, 0x63070A77,\n\t\t0x1B80, 0xE13F0A85,\n\t\t0x1B80, 0xE13F0A87,\n\t\t0x1B80, 0xE16C0A95,\n\t\t0x1B80, 0xE16C0A97,\n\t\t0x1B80, 0x56000AA5,\n\t\t0x1B80, 0x56000AA7,\n\t\t0x1B80, 0x5CF20AB5,\n\t\t0x1B80, 0x5CF20AB7,\n\t\t0x1B80, 0x0AF10AC5,\n\t\t0x1B80, 0x0AF10AC7,\n\t\t0x1B80, 0xF5040AD5,\n\t\t0x1B80, 0xF5040AD7,\n\t\t0x1B80, 0xE13F0AE5,\n\t\t0x1B80, 0xE13F0AE7,\n\t\t0x1B80, 0xE16C0AF5,\n\t\t0x1B80, 0xE16C0AF7,\n\t\t0x1B80, 0x30B30B05,\n\t\t0x1B80, 0x30B30B07,\n\t\t0x1B80, 0x07140B15,\n\t\t0x1B80, 0x07140B17,\n\t\t0x1B80, 0x07140B25,\n\t\t0x1B80, 0x07140B27,\n\t\t0x1B80, 0x630F0B35,\n\t\t0x1B80, 0x630F0B37,\n\t\t0x1B80, 0xE13F0B45,\n\t\t0x1B80, 0xE13F0B47,\n\t\t0x1B80, 0x63170B55,\n\t\t0x1B80, 0x63170B57,\n\t\t0x1B80, 0xE13F0B65,\n\t\t0x1B80, 0xE13F0B67,\n\t\t0x1B80, 0x631F0B75,\n\t\t0x1B80, 0x631F0B77,\n\t\t0x1B80, 0xE13F0B85,\n\t\t0x1B80, 0xE13F0B87,\n\t\t0x1B80, 0x63270B95,\n\t\t0x1B80, 0x63270B97,\n\t\t0x1B80, 0xE13F0BA5,\n\t\t0x1B80, 0xE13F0BA7,\n\t\t0x1B80, 0x632F0BB5,\n\t\t0x1B80, 0x632F0BB7,\n\t\t0x1B80, 0xE13F0BC5,\n\t\t0x1B80, 0xE13F0BC7,\n\t\t0x1B80, 0x63370BD5,\n\t\t0x1B80, 0x63370BD7,\n\t\t0x1B80, 0xE13F0BE5,\n\t\t0x1B80, 0xE13F0BE7,\n\t\t0x1B80, 0x633A0BF5,\n\t\t0x1B80, 0x633A0BF7,\n\t\t0x1B80, 0xE13F0C05,\n\t\t0x1B80, 0xE13F0C07,\n\t\t0x1B80, 0xF60B0C15,\n\t\t0x1B80, 0xF60B0C17,\n\t\t0x1B80, 0xF7170C25,\n\t\t0x1B80, 0xF7170C27,\n\t\t0x1B80, 0x4D300C35,\n\t\t0x1B80, 0x4D300C37,\n\t\t0x1B80, 0x57040C45,\n\t\t0x1B80, 0x57040C47,\n\t\t0x1B80, 0x57000C55,\n\t\t0x1B80, 0x57000C57,\n\t\t0x1B80, 0x96000C65,\n\t\t0x1B80, 0x96000C67,\n\t\t0x1B80, 0x57080C75,\n\t\t0x1B80, 0x57080C77,\n\t\t0x1B80, 0x57000C85,\n\t\t0x1B80, 0x57000C87,\n\t\t0x1B80, 0x95000C95,\n\t\t0x1B80, 0x95000C97,\n\t\t0x1B80, 0x4D000CA5,\n\t\t0x1B80, 0x4D000CA7,\n\t\t0x1B80, 0x6C070CB5,\n\t\t0x1B80, 0x6C070CB7,\n\t\t0x1B80, 0x00010CC5,\n\t\t0x1B80, 0x00010CC7,\n\t\t0x1B80, 0x00220CD5,\n\t\t0x1B80, 0x00220CD7,\n\t\t0x1B80, 0x06140CE5,\n\t\t0x1B80, 0x06140CE7,\n\t\t0x1B80, 0xE16C0CF5,\n\t\t0x1B80, 0xE16C0CF7,\n\t\t0x1B80, 0x00020D05,\n\t\t0x1B80, 0x00020D07,\n\t\t0x1B80, 0x00250D15,\n\t\t0x1B80, 0x00250D17,\n\t\t0x1B80, 0x06140D25,\n\t\t0x1B80, 0x06140D27,\n\t\t0x1B80, 0xE16C0D35,\n\t\t0x1B80, 0xE16C0D37,\n\t\t0x1B80, 0x00020D45,\n\t\t0x1B80, 0x00020D47,\n\t\t0x1B80, 0x00010D55,\n\t\t0x1B80, 0x00010D57,\n\t\t0x1B80, 0x00320D65,\n\t\t0x1B80, 0x00320D67,\n\t\t0x1B80, 0xE16C0D75,\n\t\t0x1B80, 0xE16C0D77,\n\t\t0x1B80, 0x00020D85,\n\t\t0x1B80, 0x00020D87,\n\t\t0x1B80, 0xE1860D95,\n\t\t0x1B80, 0xE1860D97,\n\t\t0x1B80, 0xE1B60DA5,\n\t\t0x1B80, 0xE1B60DA7,\n\t\t0x1B80, 0x5CD10DB5,\n\t\t0x1B80, 0x5CD10DB7,\n\t\t0x1B80, 0x673A0DC5,\n\t\t0x1B80, 0x673A0DC7,\n\t\t0x1B80, 0xE1230DD5,\n\t\t0x1B80, 0xE1230DD7,\n\t\t0x1B80, 0xF80B0DE5,\n\t\t0x1B80, 0xF80B0DE7,\n\t\t0x1B80, 0xF9110DF5,\n\t\t0x1B80, 0xF9110DF7,\n\t\t0x1B80, 0xE1580E05,\n\t\t0x1B80, 0xE1580E07,\n\t\t0x1B80, 0x67370E15,\n\t\t0x1B80, 0x67370E17,\n\t\t0x1B80, 0xE1580E25,\n\t\t0x1B80, 0xE1580E27,\n\t\t0x1B80, 0x672F0E35,\n\t\t0x1B80, 0x672F0E37,\n\t\t0x1B80, 0xE1580E45,\n\t\t0x1B80, 0xE1580E47,\n\t\t0x1B80, 0x67270E55,\n\t\t0x1B80, 0x67270E57,\n\t\t0x1B80, 0xE1580E65,\n\t\t0x1B80, 0xE1580E67,\n\t\t0x1B80, 0x671F0E75,\n\t\t0x1B80, 0x671F0E77,\n\t\t0x1B80, 0xE1580E85,\n\t\t0x1B80, 0xE1580E87,\n\t\t0x1B80, 0x67170E95,\n\t\t0x1B80, 0x67170E97,\n\t\t0x1B80, 0xE1580EA5,\n\t\t0x1B80, 0xE1580EA7,\n\t\t0x1B80, 0xF8020EB5,\n\t\t0x1B80, 0xF8020EB7,\n\t\t0x1B80, 0x30EE0EC5,\n\t\t0x1B80, 0x30EE0EC7,\n\t\t0x1B80, 0xE0D10ED5,\n\t\t0x1B80, 0xE0D10ED7,\n\t\t0x1B80, 0x670F0EE5,\n\t\t0x1B80, 0x670F0EE7,\n\t\t0x1B80, 0xE1580EF5,\n\t\t0x1B80, 0xE1580EF7,\n\t\t0x1B80, 0x67070F05,\n\t\t0x1B80, 0x67070F07,\n\t\t0x1B80, 0xE1580F15,\n\t\t0x1B80, 0xE1580F17,\n\t\t0x1B80, 0xF9020F25,\n\t\t0x1B80, 0xF9020F27,\n\t\t0x1B80, 0x30F50F35,\n\t\t0x1B80, 0x30F50F37,\n\t\t0x1B80, 0xE0CD0F45,\n\t\t0x1B80, 0xE0CD0F47,\n\t\t0x1B80, 0x06140F55,\n\t\t0x1B80, 0x06140F57,\n\t\t0x1B80, 0xE16C0F65,\n\t\t0x1B80, 0xE16C0F67,\n\t\t0x1B80, 0x5CF10F75,\n\t\t0x1B80, 0x5CF10F77,\n\t\t0x1B80, 0xE1580F85,\n\t\t0x1B80, 0xE1580F87,\n\t\t0x1B80, 0x06140F95,\n\t\t0x1B80, 0x06140F97,\n\t\t0x1B80, 0xE16C0FA5,\n\t\t0x1B80, 0xE16C0FA7,\n\t\t0x1B80, 0xF9020FB5,\n\t\t0x1B80, 0xF9020FB7,\n\t\t0x1B80, 0x30FF0FC5,\n\t\t0x1B80, 0x30FF0FC7,\n\t\t0x1B80, 0xE0CD0FD5,\n\t\t0x1B80, 0xE0CD0FD7,\n\t\t0x1B80, 0x31130FE5,\n\t\t0x1B80, 0x31130FE7,\n\t\t0x1B80, 0x670F0FF5,\n\t\t0x1B80, 0x670F0FF7,\n\t\t0x1B80, 0xE1581005,\n\t\t0x1B80, 0xE1581007,\n\t\t0x1B80, 0x67171015,\n\t\t0x1B80, 0x67171017,\n\t\t0x1B80, 0xE1581025,\n\t\t0x1B80, 0xE1581027,\n\t\t0x1B80, 0xF8021035,\n\t\t0x1B80, 0xF8021037,\n\t\t0x1B80, 0x31071045,\n\t\t0x1B80, 0x31071047,\n\t\t0x1B80, 0xE0D11055,\n\t\t0x1B80, 0xE0D11057,\n\t\t0x1B80, 0x31131065,\n\t\t0x1B80, 0x31131067,\n\t\t0x1B80, 0x670F1075,\n\t\t0x1B80, 0x670F1077,\n\t\t0x1B80, 0xE1581085,\n\t\t0x1B80, 0xE1581087,\n\t\t0x1B80, 0x671F1095,\n\t\t0x1B80, 0x671F1097,\n\t\t0x1B80, 0xE15810A5,\n\t\t0x1B80, 0xE15810A7,\n\t\t0x1B80, 0x672710B5,\n\t\t0x1B80, 0x672710B7,\n\t\t0x1B80, 0xE15810C5,\n\t\t0x1B80, 0xE15810C7,\n\t\t0x1B80, 0x672F10D5,\n\t\t0x1B80, 0x672F10D7,\n\t\t0x1B80, 0xE15810E5,\n\t\t0x1B80, 0xE15810E7,\n\t\t0x1B80, 0x673710F5,\n\t\t0x1B80, 0x673710F7,\n\t\t0x1B80, 0xE1581105,\n\t\t0x1B80, 0xE1581107,\n\t\t0x1B80, 0x673A1115,\n\t\t0x1B80, 0x673A1117,\n\t\t0x1B80, 0xE1581125,\n\t\t0x1B80, 0xE1581127,\n\t\t0x1B80, 0x4D101135,\n\t\t0x1B80, 0x4D101137,\n\t\t0x1B80, 0x30C41145,\n\t\t0x1B80, 0x30C41147,\n\t\t0x1B80, 0x00011155,\n\t\t0x1B80, 0x00011157,\n\t\t0x1B80, 0x6F241165,\n\t\t0x1B80, 0x6F241167,\n\t\t0x1B80, 0x6E401175,\n\t\t0x1B80, 0x6E401177,\n\t\t0x1B80, 0x6D001185,\n\t\t0x1B80, 0x6D001187,\n\t\t0x1B80, 0x55031195,\n\t\t0x1B80, 0x55031197,\n\t\t0x1B80, 0x312311A5,\n\t\t0x1B80, 0x312311A7,\n\t\t0x1B80, 0x6F1C11B5,\n\t\t0x1B80, 0x6F1C11B7,\n\t\t0x1B80, 0x6E4011C5,\n\t\t0x1B80, 0x6E4011C7,\n\t\t0x1B80, 0x550B11D5,\n\t\t0x1B80, 0x550B11D7,\n\t\t0x1B80, 0x312311E5,\n\t\t0x1B80, 0x312311E7,\n\t\t0x1B80, 0x061C11F5,\n\t\t0x1B80, 0x061C11F7,\n\t\t0x1B80, 0x54DE1205,\n\t\t0x1B80, 0x54DE1207,\n\t\t0x1B80, 0x06DC1215,\n\t\t0x1B80, 0x06DC1217,\n\t\t0x1B80, 0x55131225,\n\t\t0x1B80, 0x55131227,\n\t\t0x1B80, 0x74011235,\n\t\t0x1B80, 0x74011237,\n\t\t0x1B80, 0x74001245,\n\t\t0x1B80, 0x74001247,\n\t\t0x1B80, 0x8E001255,\n\t\t0x1B80, 0x8E001257,\n\t\t0x1B80, 0x00011265,\n\t\t0x1B80, 0x00011267,\n\t\t0x1B80, 0x57021275,\n\t\t0x1B80, 0x57021277,\n\t\t0x1B80, 0x57001285,\n\t\t0x1B80, 0x57001287,\n\t\t0x1B80, 0x97001295,\n\t\t0x1B80, 0x97001297,\n\t\t0x1B80, 0x000112A5,\n\t\t0x1B80, 0x000112A7,\n\t\t0x1B80, 0x54BF12B5,\n\t\t0x1B80, 0x54BF12B7,\n\t\t0x1B80, 0x54C112C5,\n\t\t0x1B80, 0x54C112C7,\n\t\t0x1B80, 0x54A212D5,\n\t\t0x1B80, 0x54A212D7,\n\t\t0x1B80, 0x54C012E5,\n\t\t0x1B80, 0x54C012E7,\n\t\t0x1B80, 0x54A112F5,\n\t\t0x1B80, 0x54A112F7,\n\t\t0x1B80, 0x54DF1305,\n\t\t0x1B80, 0x54DF1307,\n\t\t0x1B80, 0x00011315,\n\t\t0x1B80, 0x00011317,\n\t\t0x1B80, 0x55001325,\n\t\t0x1B80, 0x55001327,\n\t\t0x1B80, 0xE1231335,\n\t\t0x1B80, 0xE1231337,\n\t\t0x1B80, 0x54811345,\n\t\t0x1B80, 0x54811347,\n\t\t0x1B80, 0xE1231355,\n\t\t0x1B80, 0xE1231357,\n\t\t0x1B80, 0x54801365,\n\t\t0x1B80, 0x54801367,\n\t\t0x1B80, 0x002A1375,\n\t\t0x1B80, 0x002A1377,\n\t\t0x1B80, 0xE12B1385,\n\t\t0x1B80, 0xE12B1387,\n\t\t0x1B80, 0xE1231395,\n\t\t0x1B80, 0xE1231397,\n\t\t0x1B80, 0x548013A5,\n\t\t0x1B80, 0x548013A7,\n\t\t0x1B80, 0xE17213B5,\n\t\t0x1B80, 0xE17213B7,\n\t\t0x1B80, 0xBF3013C5,\n\t\t0x1B80, 0xBF3013C7,\n\t\t0x1B80, 0x000213D5,\n\t\t0x1B80, 0x000213D7,\n\t\t0x1B80, 0x302813E5,\n\t\t0x1B80, 0x302813E7,\n\t\t0x1B80, 0x4F7813F5,\n\t\t0x1B80, 0x4F7813F7,\n\t\t0x1B80, 0x4E001405,\n\t\t0x1B80, 0x4E001407,\n\t\t0x1B80, 0x53871415,\n\t\t0x1B80, 0x53871417,\n\t\t0x1B80, 0x52F11425,\n\t\t0x1B80, 0x52F11427,\n\t\t0x1B80, 0xE1161435,\n\t\t0x1B80, 0xE1161437,\n\t\t0x1B80, 0xE11B1445,\n\t\t0x1B80, 0xE11B1447,\n\t\t0x1B80, 0xE11F1455,\n\t\t0x1B80, 0xE11F1457,\n\t\t0x1B80, 0xE1271465,\n\t\t0x1B80, 0xE1271467,\n\t\t0x1B80, 0x54811475,\n\t\t0x1B80, 0x54811477,\n\t\t0x1B80, 0xE1161485,\n\t\t0x1B80, 0xE1161487,\n\t\t0x1B80, 0xE11B1495,\n\t\t0x1B80, 0xE11B1497,\n\t\t0x1B80, 0xE11F14A5,\n\t\t0x1B80, 0xE11F14A7,\n\t\t0x1B80, 0xE12714B5,\n\t\t0x1B80, 0xE12714B7,\n\t\t0x1B80, 0x548014C5,\n\t\t0x1B80, 0x548014C7,\n\t\t0x1B80, 0x002A14D5,\n\t\t0x1B80, 0x002A14D7,\n\t\t0x1B80, 0xE12B14E5,\n\t\t0x1B80, 0xE12B14E7,\n\t\t0x1B80, 0xE11614F5,\n\t\t0x1B80, 0xE11614F7,\n\t\t0x1B80, 0xE11B1505,\n\t\t0x1B80, 0xE11B1507,\n\t\t0x1B80, 0xE11F1515,\n\t\t0x1B80, 0xE11F1517,\n\t\t0x1B80, 0xE1271525,\n\t\t0x1B80, 0xE1271527,\n\t\t0x1B80, 0x54801535,\n\t\t0x1B80, 0x54801537,\n\t\t0x1B80, 0xE1721545,\n\t\t0x1B80, 0xE1721547,\n\t\t0x1B80, 0xBF171555,\n\t\t0x1B80, 0xBF171557,\n\t\t0x1B80, 0x00021565,\n\t\t0x1B80, 0x00021567,\n\t\t0x1B80, 0x30281575,\n\t\t0x1B80, 0x30281577,\n\t\t0x1B80, 0x06141585,\n\t\t0x1B80, 0x06141587,\n\t\t0x1B80, 0x73201595,\n\t\t0x1B80, 0x73201597,\n\t\t0x1B80, 0x720015A5,\n\t\t0x1B80, 0x720015A7,\n\t\t0x1B80, 0x710015B5,\n\t\t0x1B80, 0x710015B7,\n\t\t0x1B80, 0x550115C5,\n\t\t0x1B80, 0x550115C7,\n\t\t0x1B80, 0xE12315D5,\n\t\t0x1B80, 0xE12315D7,\n\t\t0x1B80, 0xE12715E5,\n\t\t0x1B80, 0xE12715E7,\n\t\t0x1B80, 0x548115F5,\n\t\t0x1B80, 0x548115F7,\n\t\t0x1B80, 0xE1231605,\n\t\t0x1B80, 0xE1231607,\n\t\t0x1B80, 0xE1271615,\n\t\t0x1B80, 0xE1271617,\n\t\t0x1B80, 0x54801625,\n\t\t0x1B80, 0x54801627,\n\t\t0x1B80, 0x002A1635,\n\t\t0x1B80, 0x002A1637,\n\t\t0x1B80, 0xE12B1645,\n\t\t0x1B80, 0xE12B1647,\n\t\t0x1B80, 0xE1231655,\n\t\t0x1B80, 0xE1231657,\n\t\t0x1B80, 0xE1271665,\n\t\t0x1B80, 0xE1271667,\n\t\t0x1B80, 0x54801675,\n\t\t0x1B80, 0x54801677,\n\t\t0x1B80, 0xE1721685,\n\t\t0x1B80, 0xE1721687,\n\t\t0x1B80, 0xBF031695,\n\t\t0x1B80, 0xBF031697,\n\t\t0x1B80, 0x000216A5,\n\t\t0x1B80, 0x000216A7,\n\t\t0x1B80, 0x302816B5,\n\t\t0x1B80, 0x302816B7,\n\t\t0x1B80, 0x54BF16C5,\n\t\t0x1B80, 0x54BF16C7,\n\t\t0x1B80, 0x54C516D5,\n\t\t0x1B80, 0x54C516D7,\n\t\t0x1B80, 0x050A16E5,\n\t\t0x1B80, 0x050A16E7,\n\t\t0x1B80, 0x071416F5,\n\t\t0x1B80, 0x071416F7,\n\t\t0x1B80, 0x54DF1705,\n\t\t0x1B80, 0x54DF1707,\n\t\t0x1B80, 0x00011715,\n\t\t0x1B80, 0x00011717,\n\t\t0x1B80, 0x54BF1725,\n\t\t0x1B80, 0x54BF1727,\n\t\t0x1B80, 0x54C01735,\n\t\t0x1B80, 0x54C01737,\n\t\t0x1B80, 0x54A31745,\n\t\t0x1B80, 0x54A31747,\n\t\t0x1B80, 0x54C11755,\n\t\t0x1B80, 0x54C11757,\n\t\t0x1B80, 0x54A41765,\n\t\t0x1B80, 0x54A41767,\n\t\t0x1B80, 0x4C831775,\n\t\t0x1B80, 0x4C831777,\n\t\t0x1B80, 0x4C031785,\n\t\t0x1B80, 0x4C031787,\n\t\t0x1B80, 0xBF0B1795,\n\t\t0x1B80, 0xBF0B1797,\n\t\t0x1B80, 0x54C217A5,\n\t\t0x1B80, 0x54C217A7,\n\t\t0x1B80, 0x54A417B5,\n\t\t0x1B80, 0x54A417B7,\n\t\t0x1B80, 0x4C8517C5,\n\t\t0x1B80, 0x4C8517C7,\n\t\t0x1B80, 0x4C0517D5,\n\t\t0x1B80, 0x4C0517D7,\n\t\t0x1B80, 0xBF0617E5,\n\t\t0x1B80, 0xBF0617E7,\n\t\t0x1B80, 0x54C117F5,\n\t\t0x1B80, 0x54C117F7,\n\t\t0x1B80, 0x54A31805,\n\t\t0x1B80, 0x54A31807,\n\t\t0x1B80, 0x4C861815,\n\t\t0x1B80, 0x4C861817,\n\t\t0x1B80, 0x4C061825,\n\t\t0x1B80, 0x4C061827,\n\t\t0x1B80, 0xBF011835,\n\t\t0x1B80, 0xBF011837,\n\t\t0x1B80, 0x54DF1845,\n\t\t0x1B80, 0x54DF1847,\n\t\t0x1B80, 0x00011855,\n\t\t0x1B80, 0x00011857,\n\t\t0x1B80, 0x00071865,\n\t\t0x1B80, 0x00071867,\n\t\t0x1B80, 0x54011875,\n\t\t0x1B80, 0x54011877,\n\t\t0x1B80, 0x00041885,\n\t\t0x1B80, 0x00041887,\n\t\t0x1B80, 0x56001895,\n\t\t0x1B80, 0x56001897,\n\t\t0x1B80, 0x5CF218A5,\n\t\t0x1B80, 0x5CF218A7,\n\t\t0x1B80, 0x630718B5,\n\t\t0x1B80, 0x630718B7,\n\t\t0x1B80, 0x620418C5,\n\t\t0x1B80, 0x620418C7,\n\t\t0x1B80, 0x610018D5,\n\t\t0x1B80, 0x610018D7,\n\t\t0x1B80, 0x670718E5,\n\t\t0x1B80, 0x670718E7,\n\t\t0x1B80, 0x660618F5,\n\t\t0x1B80, 0x660618F7,\n\t\t0x1B80, 0x6F201905,\n\t\t0x1B80, 0x6F201907,\n\t\t0x1B80, 0x6E001915,\n\t\t0x1B80, 0x6E001917,\n\t\t0x1B80, 0x6D001925,\n\t\t0x1B80, 0x6D001927,\n\t\t0x1B80, 0x6C031935,\n\t\t0x1B80, 0x6C031937,\n\t\t0x1B80, 0x73201945,\n\t\t0x1B80, 0x73201947,\n\t\t0x1B80, 0x72001955,\n\t\t0x1B80, 0x72001957,\n\t\t0x1B80, 0x71001965,\n\t\t0x1B80, 0x71001967,\n\t\t0x1B80, 0x7B201975,\n\t\t0x1B80, 0x7B201977,\n\t\t0x1B80, 0x7A001985,\n\t\t0x1B80, 0x7A001987,\n\t\t0x1B80, 0x79001995,\n\t\t0x1B80, 0x79001997,\n\t\t0x1B80, 0x7F2019A5,\n\t\t0x1B80, 0x7F2019A7,\n\t\t0x1B80, 0x7E0019B5,\n\t\t0x1B80, 0x7E0019B7,\n\t\t0x1B80, 0x7D0019C5,\n\t\t0x1B80, 0x7D0019C7,\n\t\t0x1B80, 0x090119D5,\n\t\t0x1B80, 0x090119D7,\n\t\t0x1B80, 0x0AC619E5,\n\t\t0x1B80, 0x0AC619E7,\n\t\t0x1B80, 0x0BA619F5,\n\t\t0x1B80, 0x0BA619F7,\n\t\t0x1B80, 0x0C011A05,\n\t\t0x1B80, 0x0C011A07,\n\t\t0x1B80, 0x0D021A15,\n\t\t0x1B80, 0x0D021A17,\n\t\t0x1B80, 0x0E041A25,\n\t\t0x1B80, 0x0E041A27,\n\t\t0x1B80, 0x0FFF1A35,\n\t\t0x1B80, 0x0FFF1A37,\n\t\t0x1B80, 0x4D041A45,\n\t\t0x1B80, 0x4D041A47,\n\t\t0x1B80, 0x28F81A55,\n\t\t0x1B80, 0x28F81A57,\n\t\t0x1B80, 0xE0001A65,\n\t\t0x1B80, 0xE0001A67,\n\t\t0x1B80, 0x4D001A75,\n\t\t0x1B80, 0x4D001A77,\n\t\t0x1B80, 0x00011A85,\n\t\t0x1B80, 0x00011A87,\n\t\t0x1B80, 0x4D041A95,\n\t\t0x1B80, 0x4D041A97,\n\t\t0x1B80, 0x2EF81AA5,\n\t\t0x1B80, 0x2EF81AA7,\n\t\t0x1B80, 0x00021AB5,\n\t\t0x1B80, 0x00021AB7,\n\t\t0x1B80, 0x23031AC5,\n\t\t0x1B80, 0x23031AC7,\n\t\t0x1B80, 0x00001AD5,\n\t\t0x1B80, 0x00001AD7,\n\t\t0x1B80, 0x23131AE5,\n\t\t0x1B80, 0x23131AE7,\n\t\t0x1B80, 0xE77F1AF5,\n\t\t0x1B80, 0xE77F1AF7,\n\t\t0x1B80, 0x232F1B05,\n\t\t0x1B80, 0x232F1B07,\n\t\t0x1B80, 0xEFBF1B15,\n\t\t0x1B80, 0xEFBF1B17,\n\t\t0x1B80, 0x2EF01B25,\n\t\t0x1B80, 0x2EF01B27,\n\t\t0x1B80, 0x00021B35,\n\t\t0x1B80, 0x00021B37,\n\t\t0x1B80, 0x4D001B45,\n\t\t0x1B80, 0x4D001B47,\n\t\t0x1B80, 0x00011B55,\n\t\t0x1B80, 0x00011B57,\n\t\t0x1B80, 0x4D041B65,\n\t\t0x1B80, 0x4D041B67,\n\t\t0x1B80, 0x2EF81B75,\n\t\t0x1B80, 0x2EF81B77,\n\t\t0x1B80, 0x00021B85,\n\t\t0x1B80, 0x00021B87,\n\t\t0x1B80, 0x23031B95,\n\t\t0x1B80, 0x23031B97,\n\t\t0x1B80, 0x00001BA5,\n\t\t0x1B80, 0x00001BA7,\n\t\t0x1B80, 0x23131BB5,\n\t\t0x1B80, 0x23131BB7,\n\t\t0x1B80, 0xE77F1BC5,\n\t\t0x1B80, 0xE77F1BC7,\n\t\t0x1B80, 0x232F1BD5,\n\t\t0x1B80, 0x232F1BD7,\n\t\t0x1B80, 0xE79F1BE5,\n\t\t0x1B80, 0xE79F1BE7,\n\t\t0x1B80, 0x2EF01BF5,\n\t\t0x1B80, 0x2EF01BF7,\n\t\t0x1B80, 0x00021C05,\n\t\t0x1B80, 0x00021C07,\n\t\t0x1B80, 0x28F81C15,\n\t\t0x1B80, 0x28F81C17,\n\t\t0x1B80, 0x80001C25,\n\t\t0x1B80, 0x80001C27,\n\t\t0x1B80, 0x4D001C35,\n\t\t0x1B80, 0x4D001C37,\n\t\t0x1B80, 0x00011C45,\n\t\t0x1B80, 0x00011C47,\n\t\t0x1B80, 0x00041C55,\n\t\t0x1B80, 0x00041C57,\n\t\t0x1B80, 0x6BC01C65,\n\t\t0x1B80, 0x6BC01C67,\n\t\t0x1B80, 0x4D041C75,\n\t\t0x1B80, 0x4D041C77,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x68241C85,\n\t\t0x1B80, 0x68241C87,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x68481C85,\n\t\t0x1B80, 0x68481C87,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x66061C95,\n\t\t0x1B80, 0x66061C97,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x650C1CA5,\n\t\t0x1B80, 0x650C1CA7,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x65041CA5,\n\t\t0x1B80, 0x65041CA7,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x64471CB5,\n\t\t0x1B80, 0x64471CB7,\n\t\t0x1B80, 0x23411CC5,\n\t\t0x1B80, 0x23411CC7,\n\t\t0x1B80, 0x100E1CD5,\n\t\t0x1B80, 0x100E1CD7,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60101CE5,\n\t\t0x1B80, 0x60101CE7,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x60011CE5,\n\t\t0x1B80, 0x60011CE7,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x23411CF5,\n\t\t0x1B80, 0x23411CF7,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60811D05,\n\t\t0x1B80, 0x60811D07,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x60611D05,\n\t\t0x1B80, 0x60611D07,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x23411D15,\n\t\t0x1B80, 0x23411D17,\n\t\t0x1B80, 0x70E11D25,\n\t\t0x1B80, 0x70E11D27,\n\t\t0x1B80, 0x4D001D35,\n\t\t0x1B80, 0x4D001D37,\n\t\t0x1B80, 0x00011D45,\n\t\t0x1B80, 0x00011D47,\n\t\t0x1B80, 0x00041D55,\n\t\t0x1B80, 0x00041D57,\n\t\t0x1B80, 0x6B401D65,\n\t\t0x1B80, 0x6B401D67,\n\t\t0x1B80, 0x4D041D75,\n\t\t0x1B80, 0x4D041D77,\n\t\t0x1B80, 0x68481D85,\n\t\t0x1B80, 0x68481D87,\n\t\t0x1B80, 0x66061D95,\n\t\t0x1B80, 0x66061D97,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x65081DA5,\n\t\t0x1B80, 0x65081DA7,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x65181DA5,\n\t\t0x1B80, 0x65181DA7,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x65181DA5,\n\t\t0x1B80, 0x65181DA7,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x65181DA5,\n\t\t0x1B80, 0x65181DA7,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x65181DA5,\n\t\t0x1B80, 0x65181DA7,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x65081DA5,\n\t\t0x1B80, 0x65081DA7,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x65081DA5,\n\t\t0x1B80, 0x65081DA7,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x64471DB5,\n\t\t0x1B80, 0x64471DB7,\n\t\t0x1B80, 0x23411DC5,\n\t\t0x1B80, 0x23411DC7,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x11E41DD5,\n\t\t0x1B80, 0x11E41DD7,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x11E81DD5,\n\t\t0x1B80, 0x11E81DD7,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x11E81DD5,\n\t\t0x1B80, 0x11E81DD7,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x11E81DD5,\n\t\t0x1B80, 0x11E81DD7,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x11E81DD5,\n\t\t0x1B80, 0x11E81DD7,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x11E41DD5,\n\t\t0x1B80, 0x11E41DD7,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x11E41DD5,\n\t\t0x1B80, 0x11E41DD7,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x60011DE5,\n\t\t0x1B80, 0x60011DE7,\n\t\t0x1B80, 0x23411DF5,\n\t\t0x1B80, 0x23411DF7,\n\t0x8000000c,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60E11E05,\n\t\t0x1B80, 0x60E11E07,\n\t0x9000000f,\t0x55555555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x61E11E05,\n\t\t0x1B80, 0x61E11E07,\n\t0x9000000f,\t0x55ff5555,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x61E11E05,\n\t\t0x1B80, 0x61E11E07,\n\t0x9000000f,\t0xaaaaaaaa,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x61E11E05,\n\t\t0x1B80, 0x61E11E07,\n\t0x9000000f,\t0xaa00aaaa,\t0x40000000,\t0x00550000,\n\t\t0x1B80, 0x61E11E05,\n\t\t0x1B80, 0x61E11E07,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x1B80, 0x60E11E05,\n\t\t0x1B80, 0x60E11E07,\n\t0xA0000000,\t0x00000000,\n\t\t0x1B80, 0x60E11E05,\n\t\t0x1B80, 0x60E11E07,\n\t0xB0000000,\t0x00000000,\n\t\t0x1B80, 0x23411E15,\n\t\t0x1B80, 0x23411E17,\n\t\t0x1B80, 0x70611E25,\n\t\t0x1B80, 0x70611E27,\n\t\t0x1B80, 0x4D001E35,\n\t\t0x1B80, 0x4D001E37,\n\t\t0x1B80, 0x00011E45,\n\t\t0x1B80, 0x00011E47,\n\t\t0x1B80, 0x00001E55,\n\t\t0x1B80, 0x00001E57,\n\t\t0x1B80, 0x00001E65,\n\t\t0x1B80, 0x00001E67,\n\t\t0x1B80, 0x00001E75,\n\t\t0x1B80, 0x00001E77,\n\t\t0x1B80, 0x00001E85,\n\t\t0x1B80, 0x00001E87,\n\t\t0x1B80, 0x00001E95,\n\t\t0x1B80, 0x00001E97,\n\t\t0x1B80, 0x00001EA5,\n\t\t0x1B80, 0x00001EA7,\n\t\t0x1B80, 0x00001EB5,\n\t\t0x1B80, 0x00001EB7,\n\t\t0x1B80, 0x00001EC5,\n\t\t0x1B80, 0x00001EC7,\n\t\t0x1B80, 0x00001ED5,\n\t\t0x1B80, 0x00001ED7,\n\t\t0x1B80, 0x00001EE5,\n\t\t0x1B80, 0x00001EE7,\n\t\t0x1B80, 0x00001EF5,\n\t\t0x1B80, 0x00001EF7,\n\t\t0x1B80, 0x00001F05,\n\t\t0x1B80, 0x00001F07,\n\t\t0x1B80, 0x00001F15,\n\t\t0x1B80, 0x00001F17,\n\t\t0x1B80, 0x00001F25,\n\t\t0x1B80, 0x00001F27,\n\t\t0x1B80, 0x00001F35,\n\t\t0x1B80, 0x00001F37,\n\t\t0x1B80, 0x00001F45,\n\t\t0x1B80, 0x00001F47,\n\t\t0x1B80, 0x00001F55,\n\t\t0x1B80, 0x00001F57,\n\t\t0x1B80, 0x00001F65,\n\t\t0x1B80, 0x00001F67,\n\t\t0x1B80, 0x00001F75,\n\t\t0x1B80, 0x00001F77,\n\t\t0x1B80, 0x00001F85,\n\t\t0x1B80, 0x00001F87,\n\t\t0x1B80, 0x00001F95,\n\t\t0x1B80, 0x00001F97,\n\t\t0x1B80, 0x00001FA5,\n\t\t0x1B80, 0x00001FA7,\n\t\t0x1B80, 0x00001FB5,\n\t\t0x1B80, 0x00001FB7,\n\t\t0x1B80, 0x00001FC5,\n\t\t0x1B80, 0x00001FC7,\n\t\t0x1B80, 0x00001FD5,\n\t\t0x1B80, 0x00001FD7,\n\t\t0x1B80, 0x00001FE5,\n\t\t0x1B80, 0x00001FE7,\n\t\t0x1B80, 0x00001FF5,\n\t\t0x1B80, 0x00001FF7,\n\t\t0x1B80, 0x00000006,\n\t\t0x1B80, 0x00000002,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_PHY_REG(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           PHY_REG_MP.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG_MP[] = { \n\t\t0x8FC, 0x00000000,\n\t\t0x838, 0x86667641,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_MP(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG_MP)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG_MP;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG_MP\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_PHY_REG_MP(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           PHY_REG_PG.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG_PG[] = { \n\t0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840,\n\t0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,\n\t0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638,\n\t0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,\n\t0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,\n\t0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,\n\t0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,\n\t0, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040,\n\t0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832,\n\t0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,\n\t0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,\n\t0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,\n\t0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,\n\t0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,\n\t0, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040,\n\t0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832,\n\t0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022,\n\t0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840,\n\t0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,\n\t0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638,\n\t0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,\n\t0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,\n\t0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,\n\t0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,\n\t0, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040,\n\t0, 1, 2, 0x00000edc, 0xffffffff, 0x24262832,\n\t0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,\n\t0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,\n\t0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,\n\t0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,\n\t0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,\n\t0, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040,\n\t0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832,\n\t0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022,\n\t0, 2, 0, 0x00001820, 0xffffffff, 0x34363840,\n\t0, 2, 0, 0x00001824, 0xffffffff, 0x42424444,\n\t0, 2, 0, 0x00001828, 0xffffffff, 0x30323638,\n\t0, 2, 0, 0x0000182c, 0xffffffff, 0x40424444,\n\t0, 2, 0, 0x00001830, 0xffffffff, 0x28303236,\n\t0, 2, 1, 0x00001834, 0xffffffff, 0x38404242,\n\t0, 2, 1, 0x00001838, 0xffffffff, 0x26283034,\n\t0, 2, 2, 0x000018d8, 0xffffffff, 0x36384040,\n\t0, 2, 2, 0x000018dc, 0xffffffff, 0x24262832,\n\t0, 2, 0, 0x0000183c, 0xffffffff, 0x40424444,\n\t0, 2, 0, 0x00001840, 0xffffffff, 0x28303236,\n\t0, 2, 0, 0x00001844, 0xffffffff, 0x42422426,\n\t0, 2, 1, 0x00001848, 0xffffffff, 0x30343840,\n\t0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628,\n\t0, 2, 2, 0x000018e0, 0xffffffff, 0x36384040,\n\t0, 2, 2, 0x000018e4, 0xffffffff, 0x24262832,\n\t0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022,\n\t0, 3, 0, 0x00001a20, 0xffffffff, 0x34363840,\n\t0, 3, 0, 0x00001a24, 0xffffffff, 0x42424444,\n\t0, 3, 0, 0x00001a28, 0xffffffff, 0x30323638,\n\t0, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444,\n\t0, 3, 0, 0x00001a30, 0xffffffff, 0x28303236,\n\t0, 3, 1, 0x00001a34, 0xffffffff, 0x38404242,\n\t0, 3, 1, 0x00001a38, 0xffffffff, 0x26283034,\n\t0, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040,\n\t0, 3, 2, 0x00001adc, 0xffffffff, 0x24262832,\n\t0, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444,\n\t0, 3, 0, 0x00001a40, 0xffffffff, 0x28303236,\n\t0, 3, 0, 0x00001a44, 0xffffffff, 0x42422426,\n\t0, 3, 1, 0x00001a48, 0xffffffff, 0x30343840,\n\t0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628,\n\t0, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040,\n\t0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832,\n\t0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022,\n\t1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,\n\t1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640,\n\t1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,\n\t1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,\n\t1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,\n\t1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,\n\t1, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040,\n\t1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832,\n\t1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,\n\t1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,\n\t1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,\n\t1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,\n\t1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,\n\t1, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040,\n\t1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832,\n\t1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022,\n\t1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,\n\t1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640,\n\t1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,\n\t1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,\n\t1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,\n\t1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,\n\t1, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040,\n\t1, 1, 2, 0x00000edc, 0xffffffff, 0x24262832,\n\t1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,\n\t1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,\n\t1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,\n\t1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,\n\t1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,\n\t1, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040,\n\t1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832,\n\t1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022,\n\t1, 2, 0, 0x00001824, 0xffffffff, 0x42424444,\n\t1, 2, 0, 0x00001828, 0xffffffff, 0x30323640,\n\t1, 2, 0, 0x0000182c, 0xffffffff, 0x40424444,\n\t1, 2, 0, 0x00001830, 0xffffffff, 0x28303236,\n\t1, 2, 1, 0x00001834, 0xffffffff, 0x38404242,\n\t1, 2, 1, 0x00001838, 0xffffffff, 0x26283034,\n\t1, 2, 2, 0x000018d8, 0xffffffff, 0x36384040,\n\t1, 2, 2, 0x000018dc, 0xffffffff, 0x24262832,\n\t1, 2, 0, 0x0000183c, 0xffffffff, 0x40424444,\n\t1, 2, 0, 0x00001840, 0xffffffff, 0x28303236,\n\t1, 2, 0, 0x00001844, 0xffffffff, 0x42422426,\n\t1, 2, 1, 0x00001848, 0xffffffff, 0x30343840,\n\t1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628,\n\t1, 2, 2, 0x000018e0, 0xffffffff, 0x36384040,\n\t1, 2, 2, 0x000018e4, 0xffffffff, 0x24262832,\n\t1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022,\n\t1, 3, 0, 0x00001a24, 0xffffffff, 0x42424444,\n\t1, 3, 0, 0x00001a28, 0xffffffff, 0x30323640,\n\t1, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444,\n\t1, 3, 0, 0x00001a30, 0xffffffff, 0x28303236,\n\t1, 3, 1, 0x00001a34, 0xffffffff, 0x38404242,\n\t1, 3, 1, 0x00001a38, 0xffffffff, 0x26283034,\n\t1, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040,\n\t1, 3, 2, 0x00001adc, 0xffffffff, 0x24262832,\n\t1, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444,\n\t1, 3, 0, 0x00001a40, 0xffffffff, 0x28303236,\n\t1, 3, 0, 0x00001a44, 0xffffffff, 0x42422426,\n\t1, 3, 1, 0x00001a48, 0xffffffff, 0x30343840,\n\t1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628,\n\t1, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040,\n\t1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832,\n\t1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG_PG)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG_PG;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrByRate = ArrayLen/6;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG\\n\"));\n\n\tpDM_Odm->PhyRegPgVersion = 1;\n\tpDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\n\n\tfor (i = 0; i < ArrayLen; i += 6) {\n\t\tu4Byte v1 = Array[i];\n\t\tu4Byte v2 = Array[i+1];\n\t\tu4Byte v3 = Array[i+2];\n\t\tu4Byte v4 = Array[i+3];\n\t\tu4Byte v5 = Array[i+4];\n\t\tu4Byte v6 = Array[i+5];\n\n\t    odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\trsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, \"%s, %s, %s, 0x%X, 0x%08X, 0x%08X,\",\n\t\t(v1 == 0?\"2.4G\":\"  5G\"), (v2 == 0?\"A\":\"B\"), (v3 == 0?\"1Tx\":\"2Tx\"), v4, v5, v6);\n#endif\n\t}\n}\n\n\n\n/******************************************************************************\n*                           PHY_REG_PG_Type2.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG_PG_Type2[] = { \n\t0, 0, 0, 0x00000c20, 0xffffffff, 0x36363636,\n\t0, 0, 0, 0x00000c24, 0xffffffff, 0x36363636,\n\t0, 0, 0, 0x00000c28, 0xffffffff, 0x30323436,\n\t0, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636,\n\t0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234,\n\t0, 0, 1, 0x00000c34, 0xffffffff, 0x34343434,\n\t0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032,\n\t0, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232,\n\t0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830,\n\t0, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636,\n\t0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234,\n\t0, 0, 0, 0x00000c44, 0xffffffff, 0x34342426,\n\t0, 0, 1, 0x00000c48, 0xffffffff, 0x30323434,\n\t0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,\n\t0, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232,\n\t0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830,\n\t0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022,\n\t0, 1, 0, 0x00000e20, 0xffffffff, 0x36363636,\n\t0, 1, 0, 0x00000e24, 0xffffffff, 0x36363636,\n\t0, 1, 0, 0x00000e28, 0xffffffff, 0x30323436,\n\t0, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636,\n\t0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234,\n\t0, 1, 1, 0x00000e34, 0xffffffff, 0x34343434,\n\t0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032,\n\t0, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232,\n\t0, 1, 2, 0x00000edc, 0xffffffff, 0x24262830,\n\t0, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636,\n\t0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234,\n\t0, 1, 0, 0x00000e44, 0xffffffff, 0x34342426,\n\t0, 1, 1, 0x00000e48, 0xffffffff, 0x30323434,\n\t0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,\n\t0, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232,\n\t0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830,\n\t0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022,\n\t0, 2, 0, 0x00001820, 0xffffffff, 0x36363636,\n\t0, 2, 0, 0x00001824, 0xffffffff, 0x36363636,\n\t0, 2, 0, 0x00001828, 0xffffffff, 0x30323436,\n\t0, 2, 0, 0x0000182c, 0xffffffff, 0x36363636,\n\t0, 2, 0, 0x00001830, 0xffffffff, 0x28303234,\n\t0, 2, 1, 0x00001834, 0xffffffff, 0x34343434,\n\t0, 2, 1, 0x00001838, 0xffffffff, 0x26283032,\n\t0, 2, 2, 0x000018d8, 0xffffffff, 0x32323232,\n\t0, 2, 2, 0x000018dc, 0xffffffff, 0x24262830,\n\t0, 2, 0, 0x0000183c, 0xffffffff, 0x36363636,\n\t0, 2, 0, 0x00001840, 0xffffffff, 0x28303234,\n\t0, 2, 0, 0x00001844, 0xffffffff, 0x34342426,\n\t0, 2, 1, 0x00001848, 0xffffffff, 0x30323434,\n\t0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628,\n\t0, 2, 2, 0x000018e0, 0xffffffff, 0x32323232,\n\t0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830,\n\t0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022,\n\t0, 3, 0, 0x00001a20, 0xffffffff, 0x36363636,\n\t0, 3, 0, 0x00001a24, 0xffffffff, 0x36363636,\n\t0, 3, 0, 0x00001a28, 0xffffffff, 0x30323436,\n\t0, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636,\n\t0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234,\n\t0, 3, 1, 0x00001a34, 0xffffffff, 0x34343434,\n\t0, 3, 1, 0x00001a38, 0xffffffff, 0x26283032,\n\t0, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232,\n\t0, 3, 2, 0x00001adc, 0xffffffff, 0x24262830,\n\t0, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636,\n\t0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234,\n\t0, 3, 0, 0x00001a44, 0xffffffff, 0x34342426,\n\t0, 3, 1, 0x00001a48, 0xffffffff, 0x30323434,\n\t0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628,\n\t0, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232,\n\t0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830,\n\t0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022,\n\t1, 0, 0, 0x00000c24, 0xffffffff, 0x36363636,\n\t1, 0, 0, 0x00000c28, 0xffffffff, 0x30323436,\n\t1, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636,\n\t1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234,\n\t1, 0, 1, 0x00000c34, 0xffffffff, 0x34343434,\n\t1, 0, 1, 0x00000c38, 0xffffffff, 0x26283032,\n\t1, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232,\n\t1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830,\n\t1, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636,\n\t1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234,\n\t1, 0, 0, 0x00000c44, 0xffffffff, 0x34342426,\n\t1, 0, 1, 0x00000c48, 0xffffffff, 0x30323434,\n\t1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,\n\t1, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232,\n\t1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830,\n\t1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022,\n\t1, 1, 0, 0x00000e24, 0xffffffff, 0x36363636,\n\t1, 1, 0, 0x00000e28, 0xffffffff, 0x30323436,\n\t1, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636,\n\t1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234,\n\t1, 1, 1, 0x00000e34, 0xffffffff, 0x34343434,\n\t1, 1, 1, 0x00000e38, 0xffffffff, 0x26283032,\n\t1, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232,\n\t1, 1, 2, 0x00000edc, 0xffffffff, 0x24262830,\n\t1, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636,\n\t1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234,\n\t1, 1, 0, 0x00000e44, 0xffffffff, 0x34342426,\n\t1, 1, 1, 0x00000e48, 0xffffffff, 0x30323434,\n\t1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,\n\t1, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232,\n\t1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830,\n\t1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022,\n\t1, 2, 0, 0x00001824, 0xffffffff, 0x36363636,\n\t1, 2, 0, 0x00001828, 0xffffffff, 0x30323436,\n\t1, 2, 0, 0x0000182c, 0xffffffff, 0x36363636,\n\t1, 2, 0, 0x00001830, 0xffffffff, 0x28303234,\n\t1, 2, 1, 0x00001834, 0xffffffff, 0x34343434,\n\t1, 2, 1, 0x00001838, 0xffffffff, 0x26283032,\n\t1, 2, 2, 0x000018d8, 0xffffffff, 0x32323232,\n\t1, 2, 2, 0x000018dc, 0xffffffff, 0x24262830,\n\t1, 2, 0, 0x0000183c, 0xffffffff, 0x36363636,\n\t1, 2, 0, 0x00001840, 0xffffffff, 0x28303234,\n\t1, 2, 0, 0x00001844, 0xffffffff, 0x34342426,\n\t1, 2, 1, 0x00001848, 0xffffffff, 0x30323434,\n\t1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628,\n\t1, 2, 2, 0x000018e0, 0xffffffff, 0x32323232,\n\t1, 2, 2, 0x000018e4, 0xffffffff, 0x24262830,\n\t1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022,\n\t1, 3, 0, 0x00001a24, 0xffffffff, 0x36363636,\n\t1, 3, 0, 0x00001a28, 0xffffffff, 0x30323436,\n\t1, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636,\n\t1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234,\n\t1, 3, 1, 0x00001a34, 0xffffffff, 0x34343434,\n\t1, 3, 1, 0x00001a38, 0xffffffff, 0x26283032,\n\t1, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232,\n\t1, 3, 2, 0x00001adc, 0xffffffff, 0x24262830,\n\t1, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636,\n\t1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234,\n\t1, 3, 0, 0x00001a44, 0xffffffff, 0x34342426,\n\t1, 3, 1, 0x00001a48, 0xffffffff, 0x30323434,\n\t1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628,\n\t1, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232,\n\t1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830,\n\t1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type2(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG_PG_Type2)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG_PG_Type2;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrByRate = ArrayLen/6;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type2\\n\"));\n\n\tpDM_Odm->PhyRegPgVersion = 1;\n\tpDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\n\n\tfor (i = 0; i < ArrayLen; i += 6) {\n\t\tu4Byte v1 = Array[i];\n\t\tu4Byte v2 = Array[i+1];\n\t\tu4Byte v3 = Array[i+2];\n\t\tu4Byte v4 = Array[i+3];\n\t\tu4Byte v5 = Array[i+4];\n\t\tu4Byte v6 = Array[i+5];\n\n\t    odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\trsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, \"%s, %s, %s, 0x%X, 0x%08X, 0x%08X,\",\n\t\t(v1 == 0?\"2.4G\":\"  5G\"), (v2 == 0?\"A\":\"B\"), (v3 == 0?\"1Tx\":\"2Tx\"), v4, v5, v6);\n#endif\n\t}\n}\n\n\n\n/******************************************************************************\n*                           PHY_REG_PG_Type3.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG_PG_Type3[] = { \n\t0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848,\n\t0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646,\n\t0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646,\n\t0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444,\n\t0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444,\n\t0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242,\n\t0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242,\n\t0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646,\n\t0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040,\n\t0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444,\n\t0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042,\n\t0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242,\n\t0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242,\n\t0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636,\n\t0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848,\n\t0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646,\n\t0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646,\n\t0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444,\n\t0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444,\n\t0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242,\n\t0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242,\n\t0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646,\n\t0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040,\n\t0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444,\n\t0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042,\n\t0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242,\n\t0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242,\n\t0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636,\n\t0, 2, 0, 0x00001820, 0xffffffff, 0x48484848,\n\t0, 2, 0, 0x00001824, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001828, 0xffffffff, 0x44464646,\n\t0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001830, 0xffffffff, 0x42444646,\n\t0, 2, 1, 0x00001834, 0xffffffff, 0x44444444,\n\t0, 2, 1, 0x00001838, 0xffffffff, 0x40424444,\n\t0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242,\n\t0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242,\n\t0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001840, 0xffffffff, 0x42444646,\n\t0, 2, 0, 0x00001844, 0xffffffff, 0x44444040,\n\t0, 2, 1, 0x00001848, 0xffffffff, 0x44444444,\n\t0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042,\n\t0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242,\n\t0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242,\n\t0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636,\n\t0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848,\n\t0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646,\n\t0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646,\n\t0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444,\n\t0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444,\n\t0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242,\n\t0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242,\n\t0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646,\n\t0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040,\n\t0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444,\n\t0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042,\n\t0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242,\n\t0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242,\n\t0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636,\n\t1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646,\n\t1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646,\n\t1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444,\n\t1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444,\n\t1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242,\n\t1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242,\n\t1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646,\n\t1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840,\n\t1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444,\n\t1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042,\n\t1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242,\n\t1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242,\n\t1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436,\n\t1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646,\n\t1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646,\n\t1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444,\n\t1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444,\n\t1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242,\n\t1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242,\n\t1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646,\n\t1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840,\n\t1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444,\n\t1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042,\n\t1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242,\n\t1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242,\n\t1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436,\n\t1, 2, 0, 0x00001824, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001828, 0xffffffff, 0x44464646,\n\t1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001830, 0xffffffff, 0x42444646,\n\t1, 2, 1, 0x00001834, 0xffffffff, 0x44444444,\n\t1, 2, 1, 0x00001838, 0xffffffff, 0x40424444,\n\t1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242,\n\t1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242,\n\t1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001840, 0xffffffff, 0x42444646,\n\t1, 2, 0, 0x00001844, 0xffffffff, 0x44443840,\n\t1, 2, 1, 0x00001848, 0xffffffff, 0x44444444,\n\t1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042,\n\t1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242,\n\t1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242,\n\t1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436,\n\t1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646,\n\t1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646,\n\t1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444,\n\t1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444,\n\t1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242,\n\t1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242,\n\t1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646,\n\t1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840,\n\t1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444,\n\t1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042,\n\t1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242,\n\t1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242,\n\t1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type3(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG_PG_Type3)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG_PG_Type3;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrByRate = ArrayLen/6;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type3\\n\"));\n\n\tpDM_Odm->PhyRegPgVersion = 1;\n\tpDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;\n\n\tfor (i = 0; i < ArrayLen; i += 6) {\n\t\tu4Byte v1 = Array[i];\n\t\tu4Byte v2 = Array[i+1];\n\t\tu4Byte v3 = Array[i+2];\n\t\tu4Byte v4 = Array[i+3];\n\t\tu4Byte v5 = Array[i+4];\n\t\tu4Byte v6 = Array[i+5];\n\n\t    odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\trsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, \"%s, %s, %s, 0x%X, 0x%08X, 0x%08X,\",\n\t\t(v1 == 0?\"2.4G\":\"  5G\"), (v2 == 0?\"A\":\"B\"), (v3 == 0?\"1Tx\":\"2Tx\"), v4, v5, v6);\n#endif\n\t}\n}\n\n\n\n/******************************************************************************\n*                           PHY_REG_PG_Type5.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_PHY_REG_PG_Type5[] = { \n\t0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848,\n\t0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646,\n\t0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646,\n\t0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444,\n\t0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444,\n\t0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242,\n\t0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242,\n\t0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646,\n\t0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646,\n\t0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040,\n\t0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444,\n\t0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042,\n\t0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242,\n\t0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242,\n\t0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636,\n\t0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848,\n\t0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646,\n\t0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646,\n\t0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444,\n\t0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444,\n\t0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242,\n\t0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242,\n\t0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646,\n\t0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646,\n\t0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040,\n\t0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444,\n\t0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042,\n\t0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242,\n\t0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242,\n\t0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636,\n\t0, 2, 0, 0x00001820, 0xffffffff, 0x48484848,\n\t0, 2, 0, 0x00001824, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001828, 0xffffffff, 0x44464646,\n\t0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001830, 0xffffffff, 0x42444646,\n\t0, 2, 1, 0x00001834, 0xffffffff, 0x44444444,\n\t0, 2, 1, 0x00001838, 0xffffffff, 0x40424444,\n\t0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242,\n\t0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242,\n\t0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646,\n\t0, 2, 0, 0x00001840, 0xffffffff, 0x42444646,\n\t0, 2, 0, 0x00001844, 0xffffffff, 0x44444040,\n\t0, 2, 1, 0x00001848, 0xffffffff, 0x44444444,\n\t0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042,\n\t0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242,\n\t0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242,\n\t0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636,\n\t0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848,\n\t0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646,\n\t0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646,\n\t0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444,\n\t0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444,\n\t0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242,\n\t0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242,\n\t0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646,\n\t0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646,\n\t0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040,\n\t0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444,\n\t0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042,\n\t0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242,\n\t0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242,\n\t0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636,\n\t1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646,\n\t1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646,\n\t1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444,\n\t1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444,\n\t1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242,\n\t1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242,\n\t1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646,\n\t1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646,\n\t1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840,\n\t1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444,\n\t1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042,\n\t1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242,\n\t1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242,\n\t1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436,\n\t1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646,\n\t1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646,\n\t1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444,\n\t1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444,\n\t1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242,\n\t1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242,\n\t1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646,\n\t1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646,\n\t1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840,\n\t1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444,\n\t1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042,\n\t1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242,\n\t1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242,\n\t1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436,\n\t1, 2, 0, 0x00001824, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001828, 0xffffffff, 0x44464646,\n\t1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001830, 0xffffffff, 0x42444646,\n\t1, 2, 1, 0x00001834, 0xffffffff, 0x44444444,\n\t1, 2, 1, 0x00001838, 0xffffffff, 0x40424444,\n\t1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242,\n\t1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242,\n\t1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646,\n\t1, 2, 0, 0x00001840, 0xffffffff, 0x42444646,\n\t1, 2, 0, 0x00001844, 0xffffffff, 0x44443840,\n\t1, 2, 1, 0x00001848, 0xffffffff, 0x44444444,\n\t1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042,\n\t1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242,\n\t1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242,\n\t1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436,\n\t1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646,\n\t1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646,\n\t1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444,\n\t1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444,\n\t1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242,\n\t1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242,\n\t1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646,\n\t1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646,\n\t1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840,\n\t1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444,\n\t1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042,\n\t1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242,\n\t1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242,\n\t1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type5(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_PHY_REG_PG_Type5)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_PHY_REG_PG_Type5;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrByRate = ArrayLen/6;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type5\\n\"));\n\n\tpDM_Odm->PhyRegPgVersion = 1;\n\tpDM_Odm->PhyRegPgValueType = PHY_REG_PG_RELATIVE_VALUE;\n\n\tfor (i = 0; i < ArrayLen; i += 6) {\n\t\tu4Byte v1 = Array[i];\n\t\tu4Byte v2 = Array[i+1];\n\t\tu4Byte v3 = Array[i+2];\n\t\tu4Byte v4 = Array[i+3];\n\t\tu4Byte v5 = Array[i+4];\n\t\tu4Byte v6 = Array[i+5];\n\n\t    odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\trsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, \"%s, %s, %s, 0x%X, 0x%08X, 0x%08X,\",\n\t\t(v1 == 0?\"2.4G\":\"  5G\"), (v2 == 0?\"A\":\"B\"), (v3 == 0?\"1Tx\":\"2Tx\"), v4, v5, v6);\n#endif\n\t}\n}\n\n\n\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_bb.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#if (RTL8814A_SUPPORT == 1)\n#ifndef __INC_MP_BB_HW_IMG_8814A_H\n#define __INC_MP_BB_HW_IMG_8814A_H\n\n\n/******************************************************************************\n*                           AGC_TAB.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_AGC_TAB(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_AGC_TAB(void);\n\n/******************************************************************************\n*                           PHY_REG.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG(void);\n\n/******************************************************************************\n*                           PHY_REG_MP.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_MP(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG_MP(void);\n\n/******************************************************************************\n*                           PHY_REG_PG.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG(void);\n\n/******************************************************************************\n*                           PHY_REG_PG_Type2.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type2(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type2(void);\n\n/******************************************************************************\n*                           PHY_REG_PG_Type3.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type3(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type3(void);\n\n/******************************************************************************\n*                           PHY_REG_PG_Type5.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type5(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type5(void);\n\n#endif\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_fw.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\n#if(DM_ODM_SUPPORT_TYPE & (ODM_AP))\n\n\nu1Byte Array_MP_8814A_FW_AP[] = {\n0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x20, 0x80, 0xE8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x68, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, \n0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, \n0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, \n0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, \n0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, \n0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, \n0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, \n0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, \n0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, \n0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, \n0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, \n0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, \n0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, \n0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, \n0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, \n0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, \n0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, \n0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, \n0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, \n0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, \n0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, \n0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, \n0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, \n0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, \n0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, \n0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, \n0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, \n0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, \n0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, \n0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, \n0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, \n0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, \n0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, \n0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, \n0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, \n0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, \n0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, \n0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, \n0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, \n0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, \n0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, \n0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, \n0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, \n0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, \n0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, \n0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, \n0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, \n0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, \n0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, \n0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, \n0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, \n0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, \n0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, \n0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, \n0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, \n0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, \n0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, \n0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, \n0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, \n0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, \n0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, \n0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, \n0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, \n0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, \n0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, \n0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, \n0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, \n0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, \n0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, \n0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, \n0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, \n0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, \n0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, \n0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, \n0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, \n0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, \n0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, \n0x06, 0x00, 0x78, 0xB8, 0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, \n0xA4, 0x04, 0x64, 0xB8, 0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, \n0x1D, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, \n0xE3, 0x00, 0x60, 0xB8, 0x7F, 0x2E, 0x00, 0x80, 0x87, 0x2E, 0x00, 0x80, 0x8F, 0x2E, 0x00, 0x80, \n0x97, 0x2E, 0x00, 0x80, 0x9F, 0x2E, 0x00, 0x80, 0xA7, 0x2E, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, \n0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, \n0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, \n0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, \n0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, 0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, \n0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, \n0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, \n0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, 0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, \n0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, \n0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, \n0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, \n0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, \n0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, \n0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, 0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, \n0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, \n0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, \n0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, 0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, \n0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, 0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, \n0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, \n0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, \n0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, \n0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, \n0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, \n0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, 0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, \n0xD5, 0x76, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xDF, 0x76, 0x00, 0x80, 0x11, 0x77, 0x00, 0x80, \n0x19, 0x77, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xE9, 0x76, 0x00, 0x80, 0xF3, 0x76, 0x00, 0x80, \n0xFD, 0x76, 0x00, 0x80, 0x07, 0x77, 0x00, 0x80, 0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, \n0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, \n0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, \n0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, \n0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, \n0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, \n0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, \n0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, 0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, \n0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, \n0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, \n0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, \n0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, \n0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, \n0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, 0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, \n0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, 0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, \n0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, \n0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, \n0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, \n0x57, 0xA4, 0x00, 0x80, 0x57, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, 0x95, 0xA4, 0x00, 0x80, \n0xB7, 0xA4, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, \n0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, \n0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, 0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, \n0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, \n0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, \n0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, \n0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, 0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, \n0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, \n0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, \n0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, \n0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, \n0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, \n0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, \n0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, \n0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, \n0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, \n0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, \n0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, 0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, \n0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, \n0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, \n0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, \n0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, \n0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, \n0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, 0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, \n0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, \n0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, 0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, \n0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, \n0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, \n0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, 0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, \n0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, \n0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, \n0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, 0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, \n0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, \n0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, \n0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, \n0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, \n0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, \n0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, \n0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, 0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, \n0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, \n0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, 0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, \n0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, 0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, \n0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, 0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, \n0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, 0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, \n0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, \n0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, 0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, \n0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, \n0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, \n0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, \n0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, \n0x00, 0x00, 0x3C, 0x00, 0x6B, 0x01, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0xD4, 0x04, 0x64, 0xB8, \n0x88, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0xA9, 0x01, 0x64, 0xB8, \n0x00, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x40, 0x00, 0x04, 0x04, 0x64, 0xB8, 0x08, 0x04, 0x64, 0xB8, \n0x0C, 0x04, 0x64, 0xB8, 0x68, 0x04, 0x64, 0xB8, 0x6C, 0x04, 0x64, 0xB8, 0x70, 0x04, 0x64, 0xB8, \n0x74, 0x04, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, 0x00, 0x00, 0x70, 0xB8, \n0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, 0x02, 0x00, 0x70, 0xB8, \n0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, 0x97, 0x02, 0x64, 0xB8, \n0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, \n0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, \n0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, 0x30, 0x00, 0x60, 0xB8, \n0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, \n0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, \n0x51, 0x1C, 0x00, 0x80, 0x9D, 0x1C, 0x00, 0x80, 0xE9, 0x1C, 0x00, 0x80, 0x35, 0x1D, 0x00, 0x80, \n0x81, 0x1D, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x00, 0x1C, 0x66, 0xB8, \n0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, \n0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, \n0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x20, 0x11, 0x64, 0xB8, \n0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x30, 0x11, 0x64, 0xB8, \n0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x38, 0x11, 0x64, 0xB8, \n0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, \n0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, \n0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, \n0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, \n0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x02, 0x01, 0x64, 0xB8, \n0x21, 0x05, 0x64, 0xB8, 0x40, 0x11, 0x64, 0xB8, 0x44, 0x11, 0x64, 0xB8, 0x48, 0x11, 0x64, 0xB8, \n0x4C, 0x11, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x00, 0x00, 0x64, 0xB8, \n0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, \n0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, \n0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, \n0xFB, 0x05, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, \n0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, 0x03, 0x00, 0x78, 0xB8, \n0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, 0x1F, 0x07, 0x64, 0xB8, \n0x1C, 0x07, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, \n0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, \n0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, \n0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x08, \n0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x20, \n0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x80, \n0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, \n0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x04, 0x64, 0xB8, 0x21, 0x04, 0x64, 0xB8, \n0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, \n0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0x06, 0x10, 0x66, 0xB8, \n0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, 0xF4, 0x00, 0x60, 0xB8, \n0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, 0x9A, 0x01, 0x64, 0xB8, \n0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xC0, 0xA3, 0x02, 0x80, \n0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, \n0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, \n0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x30, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, \n0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, \n0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, \n0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, \n0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, \n0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF2, 0x08, 0x4C, 0x00, 0x6E, 0x30, 0xF0, \n0x20, 0x6F, 0xE8, 0xF4, 0x10, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, \n0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, \n0x60, 0xDA, 0x00, 0x18, 0x1B, 0x06, 0x00, 0x18, 0x33, 0x06, 0x00, 0x18, 0xC5, 0x08, 0x00, 0x18, \n0x69, 0x06, 0x00, 0x18, 0xBB, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0xC0, 0xF5, 0x78, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, \n0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, \n0x46, 0x09, 0x00, 0x18, 0xE0, 0x05, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xA1, 0x05, \n0x00, 0x6C, 0x00, 0x18, 0x28, 0x0C, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x21, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x32, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xD6, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE0, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, \n0xE0, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x6C, 0x9B, 0x60, 0xDA, 0x48, 0xB8, \n0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, \n0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, \n0x58, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x5C, 0x9A, 0x04, 0x93, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF6, 0x4C, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, \n0x50, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x54, 0x9A, \n0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x08, 0x93, \n0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x63, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, \n0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, \n0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, \n0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, \n0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, \n0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, \n0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, \n0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, \n0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, \n0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, \n0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, \n0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, \n0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, \n0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, \n0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, \n0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, \n0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, \n0xF1, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0x9A, 0x20, 0xF1, 0x1C, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x00, 0x18, 0x56, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x20, 0x6A, \n0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5A, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x13, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xAC, 0x17, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x5C, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, \n0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x60, 0x13, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x00, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x01, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x01, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x01, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x02, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x03, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x03, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x04, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x04, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x05, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x05, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x05, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, \n0x15, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x06, 0x6C, \n0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x06, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, \n0x14, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x45, 0x9A, 0x00, 0x52, 0x58, 0x67, 0x04, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x7C, 0x14, 0x05, 0x10, \n0x07, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x46, 0x9A, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0x9A, \n0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x9F, 0x13, 0x01, 0x10, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xA3, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x48, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xBF, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0xE1, 0x12, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, \n0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, \n0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, \n0x38, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC2, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xC3, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0xC4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, \n0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xCA, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0xCB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, \n0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCC, 0x13, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xCD, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCE, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCF, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x00, 0x18, 0xD8, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD9, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, \n0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xDA, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x52, 0x9A, 0x80, 0xF0, 0x03, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD0, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xD1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, \n0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD2, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x00, 0x18, 0xD4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x01, 0xF0, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, \n0x00, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, 0x00, 0x18, \n0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, \n0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, \n0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, \n0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, \n0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, 0x01, 0x4B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, \n0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, \n0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x54, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, \n0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x20, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, \n0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x7C, 0x9B, \n0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, \n0x44, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x48, 0x9A, 0x00, 0x6B, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x50, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, \n0x40, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, \n0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, \n0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, \n0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x40, 0xF5, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, \n0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, \n0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, \n0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, \n0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x60, 0xF0, 0x50, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x60, 0xF0, 0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x40, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x34, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, \n0x26, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x00, 0x18, 0xF2, 0x15, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, \n0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, \n0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, \n0x27, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x1D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, \n0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, \n0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xEA, 0x02, 0x00, 0x18, 0x86, 0x10, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, \n0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, \n0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, 0x01, 0xD2, 0x04, 0x92, \n0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, 0x02, 0x92, 0x00, 0xD2, \n0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, \n0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, \n0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, \n0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, \n0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x04, 0x92, 0xFF, 0x4A, \n0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x04, 0xD4, \n0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, 0x05, 0x93, 0x03, 0x6A, \n0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x0D, 0x10, 0x02, 0x92, \n0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, 0x02, 0x92, 0x04, 0x4A, \n0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xEF, 0x22, \n0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, \n0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, \n0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, 0xFF, 0x4B, 0x06, 0xD3, \n0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, \n0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, \n0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, \n0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, \n0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x1D, 0x10, 0x02, 0x93, \n0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0A, 0x10, \n0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x60, 0x82, \n0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x04, 0x92, \n0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x40, 0xA2, \n0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x0C, 0x2A, \n0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x06, 0x92, 0xFF, 0x4A, \n0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, 0x02, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x04, 0x92, \n0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x92, 0x6E, 0xEA, \n0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x01, 0x93, 0x00, 0x92, \n0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, \n0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, \n0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, \n0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, 0x0B, 0x10, 0x00, 0x6A, \n0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, \n0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x46, 0x67, \n0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, \n0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, \n0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, 0x02, 0x92, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0xA0, 0xF4, 0x73, 0xC2, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, \n0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x40, 0x9A, \n0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x64, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, \n0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, \n0x20, 0x6C, 0xA1, 0xF4, 0x84, 0x9C, 0xA0, 0xA4, 0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, \n0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, \n0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, \n0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, \n0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x01, 0x6A, 0x9D, 0x67, 0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x48, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, \n0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, \n0x9D, 0x67, 0x41, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, \n0x40, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, \n0x4C, 0xA4, 0x06, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, \n0x7D, 0x67, 0x48, 0xA3, 0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0x5D, 0x67, 0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, \n0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x58, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, \n0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, \n0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0x66, 0x04, 0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, \n0x05, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, \n0x15, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, \n0x06, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, \n0x5D, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, \n0x5D, 0x67, 0x7D, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, \n0x7D, 0x67, 0x58, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, \n0x7D, 0x67, 0x4D, 0xCB, 0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, \n0x7D, 0x67, 0x4D, 0xAB, 0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, \n0x4B, 0xAB, 0x6E, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, \n0xFF, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, \n0x02, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, \n0x50, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, \n0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, \n0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, \n0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, \n0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, \n0xA2, 0x04, 0x01, 0x4A, 0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, \n0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, \n0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, \n0x7D, 0x67, 0x54, 0xA3, 0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0x4E, 0x04, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, \n0x20, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF0, 0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0x4E, 0x04, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, \n0x50, 0xC5, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, \n0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, \n0x5D, 0x67, 0x69, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x68, 0xC2, \n0x7D, 0x67, 0x49, 0xAB, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, \n0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, \n0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, \n0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, \n0x20, 0x6B, 0xE1, 0xF6, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, \n0x01, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, \n0x58, 0x67, 0xD1, 0x2A, 0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, \n0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x50, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x82, 0xF6, 0x05, 0x4B, \n0x6D, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, \n0x52, 0xC4, 0x7D, 0x67, 0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, \n0x6C, 0xEA, 0x50, 0x22, 0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, \n0x3A, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, \n0x20, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x00, 0x18, 0xCF, 0x04, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, \n0x20, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, \n0x00, 0x6B, 0x60, 0xC2, 0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, \n0x51, 0xC3, 0x19, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, \n0x71, 0xA2, 0x05, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, \n0x72, 0xA4, 0x08, 0x6A, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x9D, 0x67, \n0x71, 0xA4, 0x60, 0xC2, 0x00, 0x18, 0xE0, 0x05, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, \n0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, \n0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, \n0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, \n0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, \n0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, \n0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, \n0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, \n0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, \n0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, \n0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x05, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xF8, 0x05, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0xA0, 0xF4, 0x73, 0xC2, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, \n0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, \n0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, \n0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xE0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, \n0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x41, 0x06, 0x00, 0x18, 0x71, 0x06, \n0x00, 0x18, 0xD5, 0x08, 0x00, 0x18, 0xDA, 0x18, 0x00, 0x18, 0x64, 0x0F, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, \n0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x20, 0xE8, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x64, 0x9B, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x68, 0x9B, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0xE1, 0xF4, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF4, 0x68, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, \n0xCB, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, \n0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, \n0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x6C, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x83, 0x67, \n0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, \n0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, \n0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x6A, \n0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x58, 0x9A, 0x10, 0xF0, \n0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x82, 0xF3, \n0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0xE1, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, \n0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, \n0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x06, 0x2A, 0x00, 0x18, \n0xB8, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x40, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, \n0x58, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x82, 0x67, 0x00, 0x18, \n0x5D, 0x0C, 0x00, 0x18, 0xA8, 0x0C, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, 0x06, 0x22, 0x00, 0x92, \n0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, \n0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, 0x00, 0x94, 0x00, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, \n0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, \n0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x00, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x25, 0x10, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, \n0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, \n0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, \n0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, 0x00, 0x94, 0x00, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, \n0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, \n0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x62, 0x10, 0x00, 0x94, \n0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, \n0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x41, 0x10, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x00, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, \n0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, \n0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, \n0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, \n0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, \n0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, \n0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, \n0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, \n0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, \n0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x23, 0x10, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, \n0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, \n0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF4, \n0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, \n0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6E, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, \n0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, \n0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, \n0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x6B, \n0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, \n0x3F, 0xF4, 0x10, 0x6B, 0x6B, 0xEB, 0x02, 0xF4, 0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x08, 0xF0, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, \n0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, \n0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, \n0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x06, 0x6B, 0x6E, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, \n0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x40, 0xF0, 0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, \n0x00, 0x18, 0x6D, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x40, 0xF0, 0x50, 0xAA, \n0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, \n0xC2, 0x67, 0x00, 0x18, 0x6D, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x12, 0x08, 0x00, 0x18, 0x4A, 0x08, 0x00, 0x18, 0x63, 0x08, 0x00, 0x18, 0x95, 0x08, \n0x00, 0x18, 0x8C, 0x08, 0x00, 0x18, 0xA6, 0x08, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE9, 0x08, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF0, 0x74, 0xC2, 0x00, 0x18, 0x95, 0x06, 0x00, 0x18, \n0xC4, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, \n0x80, 0x06, 0x00, 0x18, 0x84, 0x06, 0x00, 0x18, 0xF8, 0x08, 0x00, 0x18, 0x9E, 0x06, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, \n0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, \n0x03, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, \n0x8C, 0xEA, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0xC1, 0xF6, 0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x00, 0xF4, \n0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, \n0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x40, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, \n0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x54, 0x9A, \n0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, \n0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x7C, 0x9B, 0x60, 0xDA, \n0x11, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, \n0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, \n0x60, 0x9B, 0x60, 0xDA, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, \n0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, \n0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, \n0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, \n0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, \n0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, \n0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, \n0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, \n0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, \n0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, \n0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, \n0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, \n0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, \n0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, \n0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, \n0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, \n0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, \n0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, \n0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, \n0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, \n0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, \n0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, \n0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, \n0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, \n0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, \n0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, \n0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, 0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, \n0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, \n0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, \n0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, \n0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, \n0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, \n0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, \n0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, \n0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, \n0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, \n0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, \n0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, \n0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, \n0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, \n0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, \n0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, \n0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, \n0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, \n0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, \n0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, \n0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, \n0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, \n0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, \n0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, \n0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, \n0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, \n0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, \n0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, 0x02, 0x93, 0x83, 0x67, \n0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, \n0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x01, 0x10, \n0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, \n0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, \n0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x06, 0x93, 0x0B, 0x92, 0x4C, 0xEB, \n0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x0B, 0x92, \n0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x05, 0xD2, 0x0B, 0x92, \n0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, \n0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, \n0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, \n0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, \n0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, 0x4F, 0xEB, 0x01, 0x92, \n0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, 0x02, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x02, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, \n0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xC6, \n0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, 0x01, 0x6C, 0x00, 0x18, \n0xB4, 0x0C, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x0A, 0x92, \n0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, \n0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, \n0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, \n0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x7C, 0xA5, 0x4C, 0xEB, \n0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, \n0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, \n0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, \n0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0x32, \n0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, 0x00, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, 0x00, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, \n0x58, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x58, 0x9A, 0x00, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF5, 0x7C, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, \n0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xC5, \n0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, 0x04, 0xD2, \n0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x01, 0x0C, 0x02, 0x2A, 0x00, 0x6A, \n0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, 0x20, 0x23, 0x48, 0x33, \n0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x02, 0xF2, \n0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x12, 0x10, 0x22, 0xF2, \n0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x0A, 0x10, 0x42, 0xF2, \n0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x02, 0x10, 0x00, 0x6A, \n0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x5C, 0x9A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0xA0, 0xF5, 0x40, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x08, 0x22, \n0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, \n0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x9D, 0x67, \n0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x6D, 0xEA, \n0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x6C, 0xEA, \n0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, \n0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, \n0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, \n0x5C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, \n0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, \n0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xC0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, \n0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, \n0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x04, 0x92, \n0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x70, 0x9B, 0x80, 0x9B, 0x08, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, \n0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x60, 0xAA, \n0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6C, \n0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, 0xD5, 0x22, 0x01, 0x6A, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, \n0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, \n0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, \n0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xA6, 0xF0, 0x01, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, \n0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, \n0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x03, 0x6A, \n0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, \n0x41, 0x12, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x19, 0x10, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xBB, 0x30, 0x00, 0x18, \n0x46, 0x09, 0x9C, 0x17, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x6B, \n0xE2, 0xF2, 0x6C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, 0xE2, 0xF2, 0x6C, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, 0x42, 0x23, 0x29, 0x5A, \n0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, 0x4E, 0xEB, 0x2D, 0x23, \n0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, 0x4A, 0x23, 0x51, 0x5A, \n0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, 0x64, 0x6B, 0x4E, 0xEB, \n0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0x6B, \n0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, \n0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x49, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x09, 0x6B, \n0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, \n0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x31, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0x6B, \n0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, \n0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x05, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x19, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0x6B, \n0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, \n0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF6, 0x64, 0x9B, 0xE2, 0xF2, 0x74, 0xDA, 0x20, 0xE8, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, \n0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x54, 0x9A, 0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, \n0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x50, 0x9A, 0x02, 0x93, 0x58, 0xEB, \n0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x62, 0x67, 0xC3, 0xF0, 0x10, 0x4B, 0x04, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0x4E, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x01, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, \n0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x1D, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xBD, 0x07, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, \n0x6C, 0xEA, 0xFF, 0x6B, 0x69, 0x4B, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xB9, 0x12, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, \n0x5A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, \n0x6C, 0xEA, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x02, 0x6B, 0x6C, 0xEA, 0x13, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xEA, 0x07, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, \n0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x12, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x09, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, \n0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, \n0x6C, 0xEA, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x02, 0x6B, 0x6C, 0xEA, 0x08, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, \n0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, \n0x08, 0xD4, 0x08, 0x92, 0x60, 0xA2, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, 0x08, 0x92, \n0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x56, 0x32, 0xDD, 0x67, \n0x51, 0xC6, 0x5D, 0x67, 0x72, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0xBD, 0x67, \n0x91, 0xA5, 0xDD, 0x67, 0x70, 0xA6, 0xBD, 0x67, 0x53, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0x81, 0x0D, 0xDD, 0x67, 0x53, 0xA6, 0x3B, 0x22, 0x5D, 0x67, 0x91, 0xA2, 0xBD, 0x67, 0x71, 0xA5, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x61, 0x9A, 0xDD, 0x67, 0x50, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, \n0x6C, 0xEA, 0x4C, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, \n0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x37, 0x10, 0xBD, 0x67, \n0x91, 0xA5, 0xDD, 0x67, 0x71, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, \n0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, \n0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x51, 0xA3, \n0x48, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, \n0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x52, 0xC3, 0x9D, 0x67, 0x52, 0xA4, 0x56, 0x32, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x72, 0xA6, \n0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x71, 0xA4, 0xBD, 0x67, 0x50, 0xA5, \n0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xDD, 0x67, 0x91, 0xA6, 0x5D, 0x67, \n0x71, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, \n0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x80, 0xC5, 0xDD, 0x67, 0x64, 0xC6, \n0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x5A, 0x22, 0xBD, 0x67, 0x40, 0xA5, 0x01, 0x6B, \n0x4E, 0xEB, 0x1E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0xAC, 0x10, 0x02, 0x6B, \n0x4E, 0xEB, 0x28, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0xA5, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, 0x80, 0x9B, 0xBD, 0x67, \n0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x93, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, \n0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, \n0x60, 0xDA, 0x81, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, \n0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x65, 0x6E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x5C, 0x10, 0x7D, 0x67, \n0x40, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x1F, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, \n0x52, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x2A, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x3A, 0x22, 0x4B, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, \n0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, \n0x8C, 0xEB, 0x60, 0xDA, 0x38, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, \n0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, \n0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, \n0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, \n0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, \n0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0xD9, 0x63, 0x4D, 0x62, 0x0B, 0x03, 0x80, 0x6A, \n0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, \n0x20, 0xF0, 0x4C, 0xC3, 0x2B, 0x03, 0x80, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, \n0xCB, 0x03, 0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x58, 0xC5, 0x00, 0x6A, \n0x05, 0xD2, 0x00, 0x6A, 0xDD, 0x67, 0x51, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xEB, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, \n0xC0, 0xF0, 0x16, 0x22, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0xCA, 0x10, 0x5D, 0x67, \n0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x01, 0x6C, 0xA4, 0x67, \n0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0xA0, 0xF0, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, \n0x58, 0x9A, 0x40, 0x9A, 0x09, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x54, 0x33, 0x9D, 0x67, \n0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, 0x08, 0xD2, 0x09, 0x93, 0x08, 0x92, 0x43, 0xEB, \n0x58, 0x67, 0x04, 0x2A, 0x09, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x05, 0x10, 0x08, 0x92, 0x4F, 0xEB, \n0x09, 0x92, 0x49, 0xE3, 0x01, 0x4A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x44, 0x67, 0x4C, 0x32, \n0x54, 0x33, 0x4F, 0xE3, 0x78, 0x32, 0x6B, 0xE2, 0x89, 0xE2, 0x58, 0x32, 0x62, 0x67, 0x07, 0x92, \n0x43, 0xEB, 0x58, 0x67, 0x50, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, 0x20, 0xF0, \n0x89, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, \n0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, \n0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x4C, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, \n0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, 0x71, 0xE4, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x69, 0xA4, \n0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x71, 0xE4, 0xFF, 0x6B, \n0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x7C, 0xC2, 0xDD, 0x67, 0x59, 0xA6, 0x08, 0x94, 0xFF, 0x6B, \n0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x80, 0xF0, 0x7C, 0xC2, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x59, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x20, 0xF0, \n0x48, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x0F, 0x2A, \n0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, \n0x20, 0xF0, 0x49, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x1F, 0xF7, 0x0E, 0x2A, 0x00, 0x6A, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x11, 0x11, 0xBD, 0x67, 0x20, 0xF0, \n0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xFF, 0x6E, 0xCE, 0xEA, 0x00, 0xF1, 0x00, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, \n0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, \n0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, \n0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, \n0x20, 0xF0, 0x69, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0xFF, 0xF6, 0x06, 0x2A, \n0x5D, 0x67, 0x78, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, \n0xA0, 0xF0, 0x01, 0x22, 0x7D, 0x67, 0xA0, 0xF0, 0x4C, 0xA3, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, \n0x4C, 0xA4, 0xBD, 0x67, 0x51, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x50, 0xC6, 0x01, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x49, 0xC3, 0x36, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, \n0x80, 0xF0, 0x5C, 0xA2, 0x62, 0x67, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x23, 0x22, 0x7D, 0x67, \n0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0x93, 0x4F, 0xE3, \n0xFF, 0xF7, 0x1F, 0x6A, 0x43, 0xEB, 0x58, 0x67, 0x15, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, \n0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, \n0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, \n0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, \n0x49, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x9D, 0x67, 0x59, 0xA4, 0x43, 0xEB, 0x58, 0x67, \n0xC2, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x56, 0x32, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, \n0x71, 0xA5, 0x1F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0x5D, 0x67, 0x20, 0xF0, \n0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0x81, 0x0D, 0xBD, 0x67, 0x50, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x7C, 0xC2, \n0xDD, 0x67, 0x20, 0xF0, 0x89, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, \n0x20, 0xF0, 0x48, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x61, 0xDA, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, \n0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0xBD, 0x67, 0x78, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, \n0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, 0x1F, 0xF6, 0x19, 0x2A, 0x4D, 0x97, 0x27, 0x63, 0x00, 0xEF, \n0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x1D, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x04, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x11, 0x10, 0x5D, 0x67, \n0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, \n0x7D, 0x67, 0x50, 0x83, 0x00, 0x52, 0x58, 0x67, 0xEA, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF0, \n0x10, 0x4A, 0x82, 0x67, 0x00, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x1C, 0x10, \n0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x80, 0x6B, \n0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, \n0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, \n0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x10, 0x10, 0x5D, 0x67, \n0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, \n0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, \n0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0xE7, 0xF7, 0x1F, 0x6A, \n0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, 0x6C, 0xEA, \n0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, \n0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, \n0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x03, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x61, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, \n0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5A, 0xA2, 0x07, 0x93, 0x41, 0xC3, \n0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7A, 0xC2, 0x06, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x07, 0x92, 0x83, 0x67, \n0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x4C, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, 0x47, 0xAA, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, \n0x0A, 0xD4, 0x00, 0x18, 0x8D, 0x0F, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x6C, 0xEA, \n0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, \n0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, \n0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, \n0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, 0x00, 0xF6, 0x60, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, \n0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA7, 0x0F, 0x06, 0x92, 0x18, 0x4A, \n0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0F, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF7, 0x16, 0x4A, \n0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xE7, 0x0F, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x61, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, \n0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, \n0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, \n0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x00, 0xF2, 0x00, 0x6B, \n0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, \n0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0xE3, \n0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x61, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6F, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, \n0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0x30, 0xF0, \n0x20, 0x6B, 0x81, 0xF4, 0x64, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, 0x1F, 0x6B, 0x04, 0xF7, \n0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, 0x00, 0x6E, 0xE2, 0x67, \n0x00, 0x18, 0x3D, 0x0B, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, 0x00, 0x92, 0x60, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x71, 0xC2, 0x00, 0x92, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x72, 0xC2, 0x00, 0x92, 0x62, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x73, 0xC2, 0x00, 0x92, 0x63, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x74, 0xC2, 0x00, 0x92, 0x64, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x75, 0xC2, 0x00, 0x92, 0x65, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x76, 0xC2, 0x00, 0x92, 0x66, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x77, 0xC2, 0x01, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, \n0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, 0x05, 0x92, 0x42, 0xA2, \n0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, \n0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x05, 0x92, 0x80, 0xA2, \n0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x01, 0x0A, \n0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x06, 0x2A, 0x9D, 0x67, 0x52, 0xA4, \n0x82, 0x67, 0x00, 0x18, 0xA7, 0x09, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, \n0x48, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, \n0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, \n0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, \n0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, \n0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA4, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x7C, 0x33, \n0xA4, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, \n0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, \n0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, \n0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, \n0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, \n0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, 0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, \n0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, 0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, \n0x0C, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, \n0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0xAB, 0x1D, 0x41, 0x10, 0x7D, 0x67, 0x58, 0xA3, 0x0C, 0x6B, 0x4E, 0xEB, \n0x1C, 0x23, 0x0D, 0x52, 0x78, 0x67, 0x05, 0x23, 0x0E, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x10, 0x22, \n0x28, 0x10, 0xC2, 0x6B, 0x4E, 0xEB, 0x20, 0x23, 0xC5, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0x0D, 0x6B, \n0x6E, 0xEA, 0x10, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x99, 0x10, 0x25, 0x10, \n0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB8, 0x10, 0x20, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xBD, 0x0C, 0x1B, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0B, 0x0D, 0x16, 0x10, 0x07, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xDC, 0x10, 0x11, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x61, 0x04, \n0x0C, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, \n0x70, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, \n0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, \n0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, \n0x9B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, \n0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, \n0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, \n0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, \n0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, \n0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, \n0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, \n0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, \n0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, \n0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, \n0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x9B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, \n0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, \n0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xE2, 0xF3, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0x02, 0x6B, \n0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xF2, \n0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, \n0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x46, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x74, 0x11, \n0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, \n0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, \n0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, \n0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, \n0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, \n0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, \n0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, \n0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, \n0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, \n0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, \n0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x40, 0x9A, \n0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, \n0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, \n0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x68, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x68, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x66, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, \n0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF4, 0x08, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, \n0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x72, 0x9B, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x74, 0x11, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1E, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x23, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, \n0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x45, 0xA2, 0x49, 0xE3, \n0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, \n0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x44, 0xA2, 0x5A, 0x32, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, \n0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x44, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x7D, 0x16, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, \n0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0xA0, 0xF4, 0x53, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x11, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x70, 0x9B, 0x80, 0xA3, \n0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, \n0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE2, 0x0D, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0B, 0x22, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, \n0x22, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x12, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x16, 0x22, 0x1B, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x14, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, \n0x40, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0xC7, 0x10, 0xBD, 0x67, \n0x52, 0xA5, 0x01, 0x6B, 0xC3, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x62, 0x67, 0x05, 0x92, 0x4C, 0xEB, \n0x9D, 0x67, 0x52, 0xA4, 0xA3, 0x67, 0xA6, 0xEA, 0x45, 0x67, 0xDD, 0x67, 0x51, 0xC6, 0x5D, 0x67, \n0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, \n0x45, 0x67, 0x4C, 0xEB, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0xBD, 0x67, \n0x50, 0xC5, 0xDD, 0x67, 0x71, 0xA6, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0x80, 0xF0, 0x11, 0x22, \n0xBD, 0x67, 0x51, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x48, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, \n0x9D, 0x67, 0x52, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, \n0x20, 0xF0, 0x80, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, \n0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x52, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, \n0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x5A, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x51, 0xE3, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4C, 0x88, 0x34, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x44, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x3B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, \n0x60, 0xA5, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, \n0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xDD, 0x67, \n0x52, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x61, 0xDA, 0xBD, 0x67, 0x52, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x52, 0xA3, \n0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x13, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x05, 0x93, \n0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, \n0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xBD, 0x67, \n0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x50, 0xA4, \n0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x84, 0xEA, \n0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, \n0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, \n0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, \n0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x40, 0xC5, \n0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, \n0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, \n0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, \n0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, \n0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x7D, 0x67, 0x54, 0xCB, \n0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, \n0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, 0x05, 0x92, 0x0E, 0x10, \n0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, 0x0B, 0x92, 0x4C, 0xEB, \n0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x0C, 0xD6, 0x7D, 0x67, \n0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0xD9, 0x14, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x19, 0x10, 0x0B, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, \n0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, \n0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, \n0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x16, 0x23, \n0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, 0x01, 0x92, 0x48, 0x33, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x0A, 0x10, 0x01, 0x92, \n0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0x10, \n0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, \n0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, 0x1C, 0x4A, 0x05, 0xD2, 0x05, 0x92, 0x67, 0x42, \n0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x04, 0xD2, 0x0B, 0x92, \n0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x8C, 0xEA, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x6C, 0xEA, 0x06, 0xD2, 0x04, 0x92, \n0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, 0x6B, 0xEB, 0x06, 0x92, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, \n0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x9D, 0x67, \n0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, \n0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0x0A, 0x15, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, \n0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, \n0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x0C, 0x92, \n0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x0D, 0x92, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x15, 0x24, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, \n0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, 0x06, 0xD2, 0x0C, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, \n0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, \n0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0x25, 0x15, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, \n0x1C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, 0x00, 0x92, 0x81, 0xF6, \n0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, 0x74, 0xDA, 0x00, 0x92, \n0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, \n0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, \n0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, \n0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, 0x5D, 0x67, 0x68, 0xAA, \n0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, 0x00, 0x6A, 0x7D, 0x67, \n0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, 0x06, 0x92, 0x4D, 0xE3, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x7D, 0x67, \n0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x10, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x4E, 0xAC, \n0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, 0x56, 0xAC, 0x43, 0xEB, \n0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x56, 0x32, \n0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, \n0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, \n0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, 0x6E, 0xEA, 0x31, 0x2A, \n0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x07, 0x6B, \n0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, \n0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, 0x7D, 0x67, 0x40, 0xA3, \n0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, \n0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, \n0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, 0x7D, 0x67, 0x40, 0x83, \n0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x67, 0x42, \n0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, \n0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xCA, 0xF7, \n0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x09, 0x5A, \n0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0xE1, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x09, 0x10, \n0x32, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, \n0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, \n0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, 0x9D, 0x67, 0x60, 0xA4, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, \n0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, \n0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, 0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, \n0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, \n0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x68, 0xAD, \n0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0xAA, \n0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, 0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, \n0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, 0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, \n0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, \n0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, 0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, \n0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, \n0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, \n0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF6, 0x44, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, \n0x58, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, \n0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, \n0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, \n0x02, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x6C, 0x9A, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, \n0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x7D, 0x67, \n0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, \n0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, \n0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, \n0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, \n0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x5C, 0x9A, \n0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, \n0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, \n0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF6, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x40, 0x9A, \n0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x44, 0x9A, 0x9D, 0x67, \n0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, \n0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, \n0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, \n0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x68, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, \n0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x93, 0x16, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, \n0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, \n0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, \n0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, \n0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBE, 0x16, 0x7D, 0x67, 0x54, 0xA3, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x54, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, \n0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, \n0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, \n0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, \n0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, \n0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, \n0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, \n0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, \n0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, \n0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, \n0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, \n0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, \n0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, \n0x5A, 0x31, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x17, 0x0B, 0x10, \n0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x27, 0x17, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x59, 0x17, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, \n0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF6, 0x54, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, \n0x00, 0x6B, 0x40, 0xDC, 0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, \n0x18, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x03, 0x6B, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, \n0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x02, 0x6B, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, \n0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x6C, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, \n0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, \n0x68, 0x9B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0x01, 0xF2, \n0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, \n0x1C, 0x04, 0x62, 0x67, 0x61, 0xF2, 0x00, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x14, 0x4B, 0x54, 0x6A, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, \n0x7D, 0x67, 0x58, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, \n0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, \n0x61, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, \n0x8E, 0xA2, 0x0D, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, \n0x05, 0x92, 0x8E, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, \n0x40, 0x6B, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, \n0x6E, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, \n0x9D, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, \n0x05, 0x92, 0x91, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, \n0x72, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, \n0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x71, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, \n0x00, 0x6B, 0x76, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, \n0x68, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, \n0x49, 0x6B, 0x67, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x00, 0x18, 0xE2, 0x17, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x62, 0x67, 0x65, 0xF7, 0x0C, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, \n0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF7, 0x00, 0x4B, 0x31, 0x02, 0x83, 0x67, \n0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x06, 0xF0, \n0x14, 0x4B, 0x1C, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x47, 0x97, \n0x24, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, \n0x06, 0x04, 0x00, 0x18, 0x4B, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, \n0x08, 0xD4, 0x09, 0xD5, 0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, \n0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, \n0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, \n0x04, 0xD2, 0x0A, 0x92, 0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, \n0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x09, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x0B, 0x93, \n0x60, 0xDA, 0x08, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, \n0x0B, 0x93, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, \n0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x08, 0x2A, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x07, 0x10, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, \n0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x66, 0xF0, 0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, \n0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, \n0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, \n0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, \n0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, \n0x00, 0x18, 0x16, 0x18, 0x00, 0x18, 0xCB, 0x30, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x17, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, \n0x04, 0x6A, 0x04, 0xD2, 0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, \n0x07, 0x11, 0x0F, 0x92, 0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, \n0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, \n0x03, 0x92, 0x13, 0x22, 0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, \n0x9D, 0x67, 0x67, 0xA4, 0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, \n0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, \n0x62, 0x6B, 0x6E, 0xEA, 0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, \n0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, \n0x40, 0x82, 0x9D, 0x67, 0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, \n0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, \n0x1B, 0x10, 0x5D, 0x67, 0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, \n0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, \n0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, \n0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, \n0x41, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, \n0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, \n0x42, 0xCC, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, \n0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, \n0x62, 0xAA, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, \n0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, \n0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, \n0x0F, 0xD2, 0x3E, 0x10, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, \n0x00, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, \n0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, \n0x04, 0x92, 0x66, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, \n0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, \n0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, \n0x08, 0x02, 0x07, 0xD2, 0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, \n0x01, 0x4A, 0x06, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, \n0x58, 0x67, 0xF1, 0x2A, 0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, \n0x0F, 0x92, 0x40, 0x82, 0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, \n0x60, 0xC2, 0x06, 0x93, 0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, \n0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x63, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, \n0x20, 0x6C, 0xE2, 0xF2, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFA, 0x18, 0x30, 0xF0, \n0x20, 0x6A, 0xE2, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, \n0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, \n0x45, 0xC4, 0x7D, 0x67, 0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, \n0x7C, 0x33, 0xAE, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, \n0x78, 0x33, 0xAE, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, \n0x45, 0xA4, 0x80, 0xF0, 0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, \n0x00, 0x93, 0x44, 0xC3, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, \n0x0D, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, \n0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, \n0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, \n0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, \n0x9D, 0x67, 0x46, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, \n0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, \n0x7D, 0x67, 0x44, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x54, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, \n0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, \n0x58, 0x67, 0xE3, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x28, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, \n0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, \n0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, \n0x7D, 0x67, 0x57, 0xA3, 0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, \n0x01, 0x4A, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x53, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, \n0xBD, 0x67, 0x57, 0xC5, 0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, \n0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x0F, 0x5A, \n0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, \n0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, \n0x67, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, \n0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x50, 0x32, \n0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, \n0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, \n0x73, 0xA4, 0xBD, 0x67, 0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, \n0x4C, 0xEB, 0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, \n0x51, 0xA5, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, \n0xBD, 0x67, 0x53, 0xA5, 0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, \n0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, \n0x6F, 0xE2, 0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, \n0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, \n0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, \n0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, \n0x76, 0xA5, 0x9D, 0x67, 0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, \n0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, \n0xBD, 0x67, 0x56, 0xC5, 0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, \n0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, \n0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, \n0x0B, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, \n0x58, 0xC4, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0xBD, 0x67, \n0x57, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, \n0x43, 0xEB, 0x58, 0x67, 0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, \n0x51, 0xCB, 0x0F, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, \n0x56, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, \n0x45, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, \n0x04, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, \n0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF7, 0x78, 0x9A, \n0x09, 0xD3, 0x62, 0x67, 0x20, 0xF7, 0x18, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0x20, 0xF7, 0x18, 0x4A, \n0x48, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x64, 0x9A, \n0x0C, 0xD3, 0x62, 0x67, 0x40, 0xF7, 0x04, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0x40, 0xF7, 0x04, 0x4A, \n0x48, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, \n0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, \n0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, \n0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, \n0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, \n0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, \n0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, \n0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, \n0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x63, 0xF3, 0x64, 0xA3, \n0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, \n0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, \n0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, \n0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, \n0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, \n0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, \n0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, \n0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, \n0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, \n0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, \n0x08, 0x4B, 0x6D, 0xE4, 0xA3, 0xF3, 0x78, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, \n0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, \n0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, \n0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, \n0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, \n0x8E, 0xEA, 0x5D, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, \n0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, \n0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, \n0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, \n0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, \n0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, \n0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, \n0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x03, 0xF4, 0x6C, 0xA3, \n0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, \n0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, \n0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, \n0x09, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, \n0x7D, 0x67, 0x59, 0xC3, 0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, \n0x06, 0x22, 0x7D, 0x67, 0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC7, 0x1A, 0x89, 0x10, 0x0A, 0x92, \n0x40, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, \n0x0A, 0x92, 0x04, 0x4A, 0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, \n0x0A, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, \n0x7D, 0x67, 0x4B, 0xCB, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF6, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, \n0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x63, 0xF3, 0x64, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, \n0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, \n0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x78, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, \n0x09, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x14, 0x4A, 0x82, 0x67, \n0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x6C, 0xC2, 0x20, 0x10, \n0x7D, 0x67, 0x59, 0xA3, 0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, \n0x54, 0xC3, 0x28, 0xF3, 0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, \n0x58, 0x9A, 0x04, 0xD2, 0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x82, 0x67, 0x80, 0xF6, 0x04, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, \n0x40, 0xA2, 0x7D, 0x67, 0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, \n0x7D, 0x67, 0x54, 0xC3, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, \n0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, \n0x8C, 0xEB, 0x74, 0x33, 0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, \n0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, \n0x01, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, \n0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, \n0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, \n0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, \n0x7D, 0x67, 0x55, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x15, 0x31, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, \n0x5A, 0xA2, 0x62, 0x67, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, \n0xFF, 0x6A, 0xAC, 0xEA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xB2, 0x25, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x50, 0xC3, 0x08, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, \n0x63, 0xC2, 0x08, 0x92, 0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x63, 0xF4, 0x64, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, \n0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, \n0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, \n0x61, 0xC2, 0x08, 0x92, 0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, \n0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x42, 0xA2, 0x30, 0xF0, 0x20, 0x6C, \n0xA0, 0xF6, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x34, 0x10, 0x7D, 0x67, \n0x50, 0xA3, 0x02, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x6B, 0xEB, 0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0xE0, 0xF6, 0x00, 0x4C, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, \n0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, \n0x65, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, \n0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, \n0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x9D, 0x67, 0x72, 0xA4, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x9D, 0x67, 0x71, 0xA4, 0x63, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x9D, 0x67, 0x70, 0xA4, 0x63, 0xF4, 0x6A, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, \n0x9E, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, \n0x40, 0xA2, 0x7D, 0x67, 0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, \n0x0C, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x0B, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, \n0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, \n0xF0, 0x2A, 0x5D, 0x67, 0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, \n0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, \n0x58, 0x67, 0x3E, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, \n0x42, 0x33, 0x62, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x5A, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, 0xDF, 0x11, \n0x5D, 0x67, 0x71, 0xA2, 0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, \n0x56, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, \n0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, \n0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, \n0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x5A, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, \n0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, \n0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, \n0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, \n0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, \n0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, \n0x09, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, \n0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, \n0x56, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, \n0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, \n0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, \n0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, \n0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, \n0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, \n0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, \n0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, \n0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x5F, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, \n0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x60, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, \n0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, \n0x06, 0x10, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, \n0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, \n0x78, 0x67, 0x2A, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x10, 0x4A, 0x49, 0xE3, \n0x40, 0x9A, 0x00, 0xEA, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA1, 0x19, 0x1D, 0x10, 0x07, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xC2, 0x1B, 0x18, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0D, 0x1A, \n0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x71, 0x1B, 0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, \n0x00, 0x18, 0x11, 0x1C, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x5E, 0x1C, 0x04, 0x10, \n0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x7E, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x22, \n0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, \n0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x40, 0x5A, \n0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, \n0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, \n0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x60, 0x5A, \n0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, \n0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, \n0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, \n0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, \n0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, \n0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, \n0x58, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, \n0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, \n0xDD, 0x1D, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, \n0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, \n0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, \n0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, \n0x40, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x0C, 0xF0, 0x18, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, \n0x48, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, \n0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, \n0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x54, 0xA3, \n0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x80, 0xF4, 0x10, 0x6A, \n0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, 0x80, 0xF4, 0x18, 0x6A, \n0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, 0x1C, 0x6A, 0x7D, 0x67, \n0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, 0x04, 0x6A, 0x7D, 0x67, \n0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, 0x56, 0xA3, 0x4C, 0x32, \n0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x02, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0xE6, 0xF2, 0x00, 0x4A, 0x01, 0xD2, 0x9D, 0x67, 0x55, 0xA4, 0x01, 0x6B, \n0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, 0x0C, 0x22, 0xA0, 0xF5, \n0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x80, 0xF4, \n0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x7D, 0x67, \n0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, \n0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, \n0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, \n0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x69, 0xAC, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, \n0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, \n0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, \n0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x68, 0xAC, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, \n0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, \n0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, \n0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, \n0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, \n0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, \n0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x12, 0x10, 0x5D, 0x67, \n0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, \n0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, \n0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, \n0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, \n0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, \n0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, 0x5D, 0x67, 0x69, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, \n0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x9D, 0x67, 0x69, 0xAC, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, \n0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, \n0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, \n0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x0A, 0x10, \n0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, \n0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, \n0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, \n0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, \n0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, \n0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, \n0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, \n0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x9D, 0x67, \n0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, \n0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, \n0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, \n0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x0C, 0x10, \n0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, \n0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, \n0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, \n0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x40, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, \n0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, \n0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, \n0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, \n0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, \n0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, \n0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, \n0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, \n0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x9D, 0x67, \n0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, \n0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, \n0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, \n0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, \n0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, \n0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, \n0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, \n0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, \n0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, \n0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, \n0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, \n0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, \n0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, \n0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, \n0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, \n0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, \n0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, \n0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, \n0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x4A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x7D, 0x67, 0x54, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, \n0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x02, 0x6B, \n0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, 0x6E, 0xEA, 0x0A, 0x22, \n0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, 0x6E, 0xEA, 0x40, 0xF1, \n0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, \n0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x6E, 0xA2, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x45, 0xA2, 0x7D, 0x67, \n0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x04, 0x92, 0x4E, 0xA2, \n0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x04, 0x92, 0x4E, 0xA2, \n0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, \n0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, \n0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x13, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, \n0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x44, 0xA2, \n0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x41, 0xA2, \n0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, \n0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x54, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, 0x7D, 0x67, 0x54, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, \n0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, \n0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x81, 0x10, 0x0C, 0x6A, \n0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, \n0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x40, 0xA2, 0x7D, 0x67, \n0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x20, 0xF0, \n0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, \n0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, \n0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, \n0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x4C, 0xAA, 0x62, 0x67, \n0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, \n0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, \n0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, \n0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, \n0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, 0x08, 0x4A, 0x41, 0xA2, \n0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, \n0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, \n0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, 0x7D, 0x67, 0x4C, 0xA3, \n0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, \n0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, \n0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, \n0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, \n0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x60, 0xC6, \n0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, \n0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x07, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xC5, \n0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xC3, 0x9D, 0x67, \n0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x47, 0xC5, 0x00, 0x6A, \n0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, \n0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, 0x07, 0x92, 0x41, 0xA2, \n0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, 0x7F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, \n0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x02, 0x6B, \n0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, \n0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, 0x07, 0x92, 0x4C, 0xA2, \n0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x6D, 0xEA, \n0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x20, 0xF0, \n0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, \n0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x6C, 0xCA, 0xDD, 0x67, \n0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x12, 0x22, 0x9D, 0x67, 0x20, 0xF0, \n0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, 0x16, 0x22, 0x5D, 0x67, \n0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, \n0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, \n0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, \n0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x87, 0x22, 0x7D, 0x67, 0x40, 0xF0, \n0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, \n0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, \n0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, 0x00, 0x6D, 0xC3, 0x67, \n0xE2, 0x67, 0x00, 0x18, 0x8D, 0x26, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x65, 0xA2, 0x01, 0x6A, \n0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, \n0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAF, 0xA2, \n0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, \n0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, 0x6D, 0xEA, 0xDD, 0x67, \n0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF1, \n0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, 0x7A, 0xA2, 0xBD, 0x67, \n0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, \n0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, \n0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x9D, 0x67, \n0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x50, 0x9A, 0xBD, 0x67, \n0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, \n0xE0, 0xF0, 0x02, 0x2A, 0x9D, 0x67, 0x40, 0xF0, 0x40, 0xA4, 0xC0, 0xF0, 0x1D, 0x2A, 0xBD, 0x67, \n0x20, 0xF0, 0x5C, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, \n0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF7, \n0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, \n0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, \n0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, \n0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, \n0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, \n0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, \n0xE0, 0xF7, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x65, 0x6C, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, \n0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, \n0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF0, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, \n0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, \n0x01, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x35, 0x10, 0x9D, 0x67, \n0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, \n0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, \n0x20, 0x6B, 0x21, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x1C, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, \n0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, \n0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, \n0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, \n0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, \n0x54, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, \n0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, \n0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, \n0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, \n0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, \n0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, \n0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, \n0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, \n0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, \n0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, \n0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, \n0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, \n0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, \n0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, \n0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, \n0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, \n0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, \n0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, \n0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, \n0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, \n0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, \n0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, \n0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, \n0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, \n0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, \n0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xE6, 0x23, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, \n0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, \n0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, \n0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, \n0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, \n0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, \n0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, \n0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, \n0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, \n0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, \n0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, \n0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, \n0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, \n0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, \n0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, \n0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, \n0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, \n0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, \n0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, \n0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, \n0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, \n0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, \n0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, \n0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, \n0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, \n0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, \n0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, \n0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, \n0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, \n0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, \n0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, \n0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, \n0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, \n0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, \n0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, \n0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, \n0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, \n0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, \n0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, \n0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, \n0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, \n0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, \n0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, \n0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, \n0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, \n0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, \n0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, \n0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, \n0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, \n0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, \n0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, \n0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, \n0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, \n0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, \n0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, \n0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, \n0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, \n0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, \n0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, \n0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, \n0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, \n0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, \n0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, \n0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, \n0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, \n0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, \n0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, \n0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, \n0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, \n0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, \n0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, \n0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, \n0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, \n0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, \n0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, \n0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, \n0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, \n0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, \n0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x5D, 0x67, \n0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, \n0x20, 0x6C, 0x21, 0xF0, 0x18, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, \n0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, \n0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, \n0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, \n0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, \n0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, \n0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, \n0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, \n0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, \n0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, \n0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, \n0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, \n0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, \n0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, \n0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, \n0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, \n0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, \n0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, \n0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, \n0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, \n0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, \n0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, \n0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, \n0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, \n0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, \n0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, \n0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, \n0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, \n0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, \n0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, \n0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, \n0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, \n0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, \n0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, \n0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, \n0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, \n0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, \n0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x04, 0x92, 0xDD, 0x67, \n0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, \n0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, \n0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, \n0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, \n0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, \n0x00, 0x18, 0xDC, 0x0A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, \n0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, \n0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, \n0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, \n0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, \n0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, \n0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, \n0x8C, 0x22, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, \n0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, \n0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, \n0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, \n0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, \n0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, \n0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, \n0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x28, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, \n0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, \n0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, \n0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, \n0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, \n0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, \n0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, \n0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, \n0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, \n0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, \n0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, \n0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, \n0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, \n0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, \n0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, \n0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, \n0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, \n0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, \n0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0xED, 0x25, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, \n0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, \n0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, \n0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, \n0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, \n0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, \n0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, \n0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, \n0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, 0x20, 0xF0, \n0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, \n0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, \n0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, \n0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, \n0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, \n0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, \n0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, \n0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, \n0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, \n0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0xA1, 0xF3, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, \n0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, \n0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, \n0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, \n0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, \n0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x7D, 0x67, \n0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, \n0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, \n0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, \n0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, \n0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, \n0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, \n0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, \n0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0x46, 0x26, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, \n0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, \n0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, \n0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, \n0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, \n0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, \n0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, \n0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, \n0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, \n0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, \n0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, \n0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, \n0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, \n0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, \n0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, \n0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, \n0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, \n0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, \n0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, \n0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, \n0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x00, 0x65, 0x0B, 0x97, \n0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, \n0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, \n0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, \n0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, \n0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, \n0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, \n0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, \n0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, \n0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, \n0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF0, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, \n0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, \n0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, \n0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, \n0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, \n0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, \n0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, \n0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, \n0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, \n0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0x60, 0xF7, 0x00, 0x4A, \n0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, \n0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, \n0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, \n0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, \n0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, \n0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, \n0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, \n0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, \n0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, \n0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, \n0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, \n0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, \n0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, \n0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, \n0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, \n0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, \n0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, \n0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, \n0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, \n0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, \n0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, \n0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, \n0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x04, 0x92, 0x9D, 0x67, \n0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x70, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x66, 0xF5, \n0x00, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, \n0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, \n0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, \n0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, \n0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, \n0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, \n0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, \n0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, \n0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, \n0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, \n0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, \n0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, \n0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, \n0x00, 0x18, 0xDC, 0x0A, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, \n0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, \n0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, \n0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, \n0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, \n0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, \n0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, \n0x8B, 0x19, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x10, 0x4B, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, \n0x00, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, \n0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0xC4, 0xF0, 0x58, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, \n0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, \n0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, \n0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, \n0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, \n0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, \n0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, \n0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, \n0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, \n0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, \n0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, \n0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x47, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, \n0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, \n0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, \n0x00, 0x18, 0x38, 0x24, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, \n0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, \n0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x06, 0x93, \n0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0xED, 0x12, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x1C, 0x4A, 0x82, 0x67, \n0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x40, 0xA2, 0x9D, 0x67, \n0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x40, 0xA2, 0xBD, 0x67, \n0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, \n0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0xBE, 0x12, 0x0E, 0x92, \n0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, \n0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, \n0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9D, 0x67, 0x40, 0xF0, \n0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, \n0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, \n0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF0, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x50, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, \n0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, \n0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, \n0x00, 0x18, 0x2F, 0x27, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF0, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x40, 0xF0, \n0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x1E, 0x12, 0x13, 0x93, \n0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, \n0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, \n0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF0, 0x0C, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF0, 0x1C, 0x4A, \n0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, \n0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, \n0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, \n0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, \n0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9E, 0x11, 0x06, 0x92, \n0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, \n0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, \n0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, \n0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, \n0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, \n0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, \n0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, \n0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, \n0x00, 0x18, 0x8C, 0x22, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, \n0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, \n0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, \n0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, \n0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, \n0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, \n0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, \n0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x4C, 0xA2, \n0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, \n0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x58, 0xA2, 0x43, 0xEB, 0x58, 0x67, \n0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, \n0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, \n0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x06, 0x92, \n0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, \n0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, \n0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, \n0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x00, 0x4A, \n0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x06, 0x92, \n0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0x8B, 0x19, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, \n0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x61, 0xF1, 0x00, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0x8B, 0x19, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, \n0x8B, 0x19, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0x8D, 0x1E, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x40, 0xF0, \n0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, \n0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, \n0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, \n0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xA2, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, \n0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, \n0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, \n0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, \n0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, \n0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, \n0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, \n0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x45, 0xF6, 0x78, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x01, 0x6B, 0x6B, 0xEB, 0x45, 0xF6, 0x78, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, \n0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, \n0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, \n0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, \n0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, \n0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, \n0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, \n0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, \n0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, \n0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, \n0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, \n0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, \n0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, \n0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, \n0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x16, 0x13, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xED, 0x14, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, \n0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, \n0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, \n0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, \n0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, \n0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, \n0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, \n0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x76, 0x12, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, \n0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x47, 0x12, 0x9D, 0x67, \n0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, \n0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, \n0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, \n0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, \n0x20, 0x6B, 0xE1, 0xF3, 0x68, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, \n0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, \n0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, \n0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, \n0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xC7, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, \n0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, \n0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, \n0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, \n0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, \n0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, \n0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, \n0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, \n0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, \n0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, \n0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, \n0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, \n0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, \n0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, \n0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, \n0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, \n0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, \n0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x44, 0xA2, \n0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, \n0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, \n0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, \n0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, \n0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, \n0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, \n0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, \n0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, \n0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, \n0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, \n0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, \n0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, \n0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, \n0x45, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, \n0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x5E, 0xA3, 0x58, 0x2A, \n0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4C, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, \n0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x32, 0x22, \n0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2D, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, \n0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, \n0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, \n0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x18, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0x2F, 0x31, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x20, 0xF0, \n0x42, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0x85, 0x00, 0x52, 0x58, 0x67, 0xAE, 0x22, 0x06, 0x11, \n0x7D, 0x67, 0x5E, 0xA3, 0x00, 0xF1, 0x02, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, \n0xE0, 0xF0, 0x1C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xF0, 0x10, 0xBD, 0x67, \n0x20, 0xF0, 0x42, 0xA5, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, \n0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, \n0xDC, 0x0A, 0xC0, 0xF0, 0x15, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, \n0x0F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, \n0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, \n0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xC4, 0xF0, \n0x58, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, \n0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, 0x00, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, \n0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, \n0x20, 0xF0, 0x82, 0xA5, 0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, \n0xE2, 0x67, 0x00, 0x18, 0x38, 0x24, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, \n0x09, 0xE2, 0x20, 0xF0, 0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, \n0x29, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF1, 0x04, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, \n0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0xA1, 0xF1, 0x0C, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, \n0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x5E, 0xA5, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, \n0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF1, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, \n0xBD, 0x67, 0x5E, 0xA5, 0x03, 0x6B, 0x6E, 0xEA, 0x53, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, \n0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, \n0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, \n0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, 0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, \n0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, \n0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, \n0x27, 0x2A, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, 0x7D, 0x67, 0x5F, 0xA3, 0x30, 0xF0, \n0x20, 0x6B, 0xC1, 0xF1, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, \n0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, \n0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, \n0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, \n0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x09, 0x22, 0x7D, 0x67, 0x5E, 0xA3, \n0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x14, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x7E, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x45, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x65, 0xC2, 0x1A, 0x10, 0x7D, 0x67, \n0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x04, 0x4A, \n0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, \n0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, \n0x65, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0xE2, 0xF3, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x02, 0x5A, \n0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0xE2, 0xF3, 0x79, 0xC2, 0x00, 0x18, \n0xB3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, \n0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, \n0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, \n0xA9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, \n0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, \n0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x7D, 0x67, 0x41, 0xA3, \n0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, \n0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, \n0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, \n0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, 0x68, 0xA2, \n0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, \n0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, \n0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, \n0x78, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, \n0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, \n0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x32, \n0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, \n0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x01, 0x6A, \n0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, \n0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x4C, 0x32, 0x48, 0x34, \n0x89, 0xE2, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0xE2, 0x00, 0xF7, 0x5F, 0xA2, 0x5A, 0x32, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, 0x55, 0xA4, 0x37, 0x2A, \n0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0x45, 0xF3, \n0x78, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, \n0x89, 0xE2, 0x45, 0xF3, 0x78, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x45, 0xF3, 0x78, 0xA2, 0x9D, 0x67, 0x56, 0xA4, 0x30, 0xF0, 0x20, 0x6C, \n0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, 0x20, 0xF7, 0x43, 0xA2, \n0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, \n0xBF, 0x26, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0xB9, 0x10, 0x7D, 0x67, \n0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0xC5, 0xF3, 0x78, 0xA3, \n0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, \n0xC5, 0xF3, 0x78, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE3, 0xC5, 0xF3, 0x58, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, 0x80, 0xF0, 0x17, 0x2A, \n0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xBF, 0x26, 0x7D, 0x67, 0x56, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, 0xFF, 0x6B, 0x4C, 0xEB, \n0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x54, 0xC5, 0xDD, 0x67, \n0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x4C, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, \n0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, 0xBD, 0x67, 0xF5, 0xA5, \n0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, \n0x48, 0x34, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x80, 0x9A, 0xBD, 0x67, 0x54, 0xA5, \n0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xC9, 0xE2, 0x41, 0xF0, \n0x16, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x80, 0xDA, 0xDD, 0x67, \n0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, \n0xC4, 0xF0, 0x78, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xC4, 0xF0, 0x78, 0xC2, 0xDD, 0x67, 0x96, 0xA6, \n0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, 0x53, 0xA6, 0x49, 0xE5, \n0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, \n0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xEE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n\n};\nu4Byte ArrayLength_MP_8814A_FW_AP = 56224;\n\n\nvoid\nODM_ReadFirmware_MP_8814A_FW_AP(\n     IN   PDM_ODM_T    pDM_Odm,\n     OUT  u1Byte       *pFirmware,\n     OUT  u4Byte       *pFirmwareSize\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n     *((SIZE_PTR*)pFirmware) = (SIZE_PTR)Array_MP_8814A_FW_AP;\n#else\n     ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8814A_FW_AP, ArrayLength_MP_8814A_FW_AP);\n#endif\n     *pFirmwareSize = ArrayLength_MP_8814A_FW_AP;\n}\n\n\n#else\n\n\nu1Byte Array_MP_8814A_FW_NIC[] = {\n0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x20, 0x80, 0xF8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, \n0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, \n0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, \n0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, \n0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, \n0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, \n0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, \n0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, \n0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, \n0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, \n0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, \n0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, \n0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, \n0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, \n0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, \n0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, \n0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, \n0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, \n0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, \n0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, \n0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, \n0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, \n0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, \n0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, \n0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, \n0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, \n0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, \n0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, \n0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, \n0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, \n0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, \n0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, \n0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, \n0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, \n0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, \n0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, \n0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, \n0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, \n0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, \n0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, \n0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, \n0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, \n0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, \n0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, \n0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, \n0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, \n0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, \n0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, \n0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, \n0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, \n0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, \n0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, \n0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, \n0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, \n0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, \n0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, \n0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, \n0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, \n0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, \n0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, \n0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, \n0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, \n0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, \n0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, \n0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, \n0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, \n0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, \n0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, \n0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, \n0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, \n0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, \n0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, \n0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, \n0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, \n0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, \n0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, \n0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, \n0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x81, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xF9, 0x39, 0x00, 0x80, \n0xBB, 0x3A, 0x00, 0x80, 0x11, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, \n0xBB, 0x3A, 0x00, 0x80, 0x7B, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, \n0xBB, 0x3A, 0x00, 0x80, 0x8F, 0x38, 0x00, 0x80, 0x5B, 0x01, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, \n0x3C, 0x01, 0x64, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x89, 0x00, 0x60, 0xB8, 0x8A, 0x00, 0x60, 0xB8, \n0x04, 0x06, 0x64, 0xB8, 0x0A, 0x06, 0x64, 0xB8, 0x1A, 0x04, 0x64, 0xB8, 0x1B, 0x04, 0x64, 0xB8, \n0x00, 0x00, 0x1E, 0x00, 0x58, 0x05, 0x64, 0xB8, 0x57, 0x01, 0x64, 0xB8, 0x87, 0x02, 0x64, 0xB8, \n0x96, 0x02, 0x64, 0xB8, 0x86, 0x02, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0xA8, 0x06, 0x64, 0xB8, \n0x60, 0x05, 0x64, 0xB8, 0x73, 0x05, 0x64, 0xB8, 0xAB, 0x06, 0x64, 0xB8, 0xAA, 0x06, 0x64, 0xB8, \n0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, 0x06, 0x00, 0x78, 0xB8, \n0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, \n0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, 0x1D, 0x04, 0x64, 0xB8, \n0x7A, 0x04, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, 0x04, 0x06, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, \n0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, 0xE3, 0x00, 0x60, 0xB8, 0xA3, 0x4D, 0x00, 0x80, \n0xAB, 0x4D, 0x00, 0x80, 0xB3, 0x4D, 0x00, 0x80, 0xBB, 0x4D, 0x00, 0x80, 0xC3, 0x4D, 0x00, 0x80, \n0xCB, 0x4D, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, \n0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, \n0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, 0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, \n0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, \n0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, 0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, \n0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, 0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, \n0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, 0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, \n0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, 0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, \n0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, \n0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, \n0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, \n0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, \n0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, \n0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, \n0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, \n0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, \n0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, \n0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, \n0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, \n0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, \n0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, \n0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, \n0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, \n0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, 0x81, 0x9F, 0x00, 0x80, 0xC7, 0x9F, 0x00, 0x80, \n0x8B, 0x9F, 0x00, 0x80, 0xBD, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, \n0x95, 0x9F, 0x00, 0x80, 0x9F, 0x9F, 0x00, 0x80, 0xA9, 0x9F, 0x00, 0x80, 0xB3, 0x9F, 0x00, 0x80, \n0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, 0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, \n0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, \n0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, \n0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, \n0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, \n0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, \n0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, \n0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, \n0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, \n0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, \n0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, \n0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, \n0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, \n0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, 0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, \n0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, 0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, \n0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, \n0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, \n0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, \n0x29, 0xCD, 0x00, 0x80, 0xC5, 0xCC, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, \n0xC5, 0xCC, 0x00, 0x80, 0x45, 0xCD, 0x00, 0x80, 0x67, 0xCD, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, \n0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, 0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, \n0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, \n0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, \n0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, \n0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, \n0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, \n0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, \n0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, \n0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, \n0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, \n0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, 0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, \n0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, \n0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, \n0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, \n0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, \n0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, \n0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, \n0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, \n0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, \n0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, 0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, \n0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, \n0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, 0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, \n0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, \n0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, 0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, \n0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, \n0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, \n0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, \n0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, \n0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, \n0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, \n0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, \n0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, \n0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, \n0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, \n0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, 0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, \n0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, 0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, 0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, \n0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, 0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, \n0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, \n0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, 0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, \n0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, 0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, \n0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, \n0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, \n0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, \n0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, 0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, \n0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, \n0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, \n0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, \n0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, \n0x00, 0x00, 0x70, 0xB8, 0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, \n0x02, 0x00, 0x70, 0xB8, 0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, \n0x97, 0x02, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, \n0x30, 0x01, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, \n0x30, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, \n0x00, 0x00, 0x64, 0xB8, 0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, \n0x68, 0x05, 0x64, 0xB8, 0x85, 0x1E, 0x00, 0x80, 0xD1, 0x1E, 0x00, 0x80, 0x1D, 0x1F, 0x00, 0x80, \n0x69, 0x1F, 0x00, 0x80, 0xB5, 0x1F, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, \n0x00, 0x1C, 0x66, 0xB8, 0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, \n0xF8, 0x10, 0x60, 0xB8, 0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, \n0x30, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, \n0x20, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, \n0x30, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, \n0x38, 0x11, 0x64, 0xB8, 0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x00, 0x40, 0x20, 0x00, \n0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, \n0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, 0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, \n0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, \n0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, \n0x00, 0x00, 0x78, 0xB8, 0x60, 0x05, 0x64, 0xB8, 0x61, 0x05, 0x64, 0xB8, 0x62, 0x05, 0x64, 0xB8, \n0x63, 0x05, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, 0x2F, 0x01, 0x64, 0xB8, 0xE0, 0x04, 0x64, 0xB8, \n0x57, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0xFD, 0x70, 0x00, 0x80, \n0xFD, 0x70, 0x00, 0x80, 0xFD, 0x70, 0x00, 0x80, 0x5B, 0x71, 0x00, 0x80, 0xD7, 0x71, 0x00, 0x80, \n0x43, 0x72, 0x00, 0x80, 0xB3, 0x72, 0x00, 0x80, 0x1D, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, \n0xE5, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, 0x61, 0x74, 0x00, 0x80, 0x00, 0x00, 0x64, 0xB8, \n0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, \n0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, \n0x00, 0x00, 0xFE, 0x1F, 0x00, 0x03, 0x07, 0x00, 0xFF, 0x03, 0x07, 0x00, 0x54, 0x04, 0x64, 0xB8, \n0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0xF0, 0x3F, 0x70, 0x77, 0x33, 0x54, 0x00, 0x00, 0x00, 0x01, \n0x00, 0x00, 0x10, 0x00, 0x17, 0x77, 0x33, 0x77, 0x77, 0x77, 0x33, 0x77, 0x17, 0x77, 0x33, 0x54, \n0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFC, 0x10, 0x60, 0xB8, \n0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, 0xFB, 0x05, 0x64, 0xB8, \n0xF8, 0x10, 0x60, 0xB8, 0x83, 0x00, 0x60, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x08, 0x01, 0x64, 0xB8, \n0x90, 0x00, 0x60, 0xB8, 0x92, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, \n0x04, 0x02, 0x64, 0xB8, 0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, \n0x03, 0x00, 0x78, 0xB8, 0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, \n0x38, 0x00, 0x78, 0xB8, 0x05, 0x41, 0x10, 0x04, 0x24, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, \n0x2C, 0x04, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, 0x14, 0x00, 0x78, 0xB8, \n0x1F, 0x04, 0x64, 0xB8, 0x5F, 0x01, 0x64, 0xB8, 0x1F, 0x07, 0x64, 0xB8, 0x1C, 0x07, 0x64, 0xB8, \n0x2D, 0x04, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, \n0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, \n0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, \n0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, \n0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, \n0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7E, 0x04, 0x64, 0xB8, \n0x21, 0x04, 0x64, 0xB8, 0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, \n0x04, 0x10, 0x66, 0xB8, 0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, \n0x06, 0x10, 0x66, 0xB8, 0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, \n0xF4, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, \n0x9A, 0x01, 0x64, 0xB8, 0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, \n0xC0, 0xA3, 0x02, 0x80, 0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x01, 0x64, 0xB8, \n0x00, 0x01, 0x64, 0xB8, 0xB7, 0x06, 0x64, 0xB8, 0xB4, 0x06, 0x64, 0xB8, 0x02, 0x10, 0x60, 0xB8, \n0xF0, 0xFF, 0x03, 0x00, 0x53, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, \n0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, \n0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x30, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, \n0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, \n0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, \n0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, \n0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, \n0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF3, 0x18, 0x4C, 0x00, 0x6E, 0x30, 0xF0, \n0x20, 0x6F, 0x48, 0xF4, 0x18, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, \n0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, \n0x60, 0xDA, 0x00, 0x18, 0xAB, 0x06, 0x00, 0x18, 0xC3, 0x06, 0x00, 0x18, 0x53, 0x09, 0x00, 0x18, \n0xF5, 0x06, 0x00, 0x18, 0x49, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x60, 0xF6, 0x70, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, \n0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, \n0xD4, 0x09, 0x00, 0x18, 0x63, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x24, 0x06, \n0x00, 0x6C, 0x00, 0x18, 0xF1, 0x13, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x09, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1A, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xB8, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xC2, 0x02, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x48, 0xB8, \n0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, \n0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF6, 0x4C, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, \n0x50, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x54, 0x9A, 0x04, 0x93, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0xA0, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, \n0x48, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x4C, 0x9A, \n0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x50, 0x9A, 0x08, 0x93, \n0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x54, 0x9A, 0x08, 0x93, 0x63, 0x9B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, \n0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, \n0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, \n0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, \n0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, \n0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, \n0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, \n0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, \n0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, \n0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, \n0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, \n0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, \n0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, \n0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, \n0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, \n0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, \n0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, \n0x29, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x45, 0x9A, 0xA0, 0xF0, 0x1A, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x00, 0x18, 0x8E, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x20, 0x6A, \n0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x92, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x93, 0x18, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xEC, 0x20, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x94, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, \n0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x98, 0x18, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, \n0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x48, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, \n0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x9C, 0x18, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, \n0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, \n0x03, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x05, 0x6C, \n0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF7, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x9C, 0x18, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, \n0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, \n0x4F, 0x1A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x46, 0x9A, \n0x52, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x19, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, \n0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xE6, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, \n0x00, 0x6C, 0x00, 0x18, 0xFE, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, \n0x22, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x36, 0x1A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, \n0x00, 0x18, 0xD7, 0x18, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x47, 0x9A, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x18, \n0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x48, 0x9A, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x30, 0x19, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, \n0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x7A, 0x06, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0x19, 0x18, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, \n0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, \n0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, \n0x70, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x35, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x36, 0x19, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x3E, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x53, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, \n0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x57, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x58, 0x19, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x59, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x5A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, \n0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x19, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x5C, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5E, 0x19, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x00, 0x18, 0xD2, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x19, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, \n0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xD4, 0x19, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x52, 0x9A, 0x78, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x52, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x5F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x89, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, \n0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x90, 0x19, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xAF, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x8A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, \n0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8C, 0x19, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0x8D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, \n0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8E, 0x19, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x01, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x8F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, \n0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, 0x01, 0x4B, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, \n0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, \n0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, \n0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, \n0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2F, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0xA3, 0x21, \n0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x39, 0x21, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, \n0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x60, 0x9B, \n0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, \n0x44, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x6C, 0x9B, \n0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, \n0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, \n0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x40, 0x9A, \n0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, \n0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, \n0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, \n0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, \n0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, \n0x48, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, \n0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, \n0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, \n0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, \n0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x80, 0xF4, 0x52, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x18, 0x6E, 0x00, 0x6F, 0x00, 0x18, \n0x5F, 0x1E, 0x05, 0xD2, 0x00, 0x18, 0x8F, 0x15, 0x7D, 0x67, 0x50, 0xC3, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4B, 0xE3, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, \n0x73, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, \n0x6E, 0xEA, 0x26, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x66, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, \n0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, \n0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x6C, \n0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x44, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, \n0x3B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x68, 0xC2, \n0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x50, 0xA2, \n0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, \n0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x3A, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0xE0, 0xF5, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, 0x26, 0x6D, 0x00, 0x18, \n0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, \n0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, \n0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x27, 0x6D, 0x00, 0x18, \n0x54, 0x1E, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x23, 0x10, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, \n0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, \n0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x00, 0x18, 0x8F, 0x15, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, \n0x6C, 0xEA, 0x0E, 0x2A, 0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, \n0x01, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, \n0x02, 0x92, 0x00, 0xD2, 0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, \n0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, \n0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x02, 0xD4, 0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, \n0x0A, 0x10, 0x00, 0x92, 0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, \n0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, \n0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, \n0x05, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, \n0x0D, 0x10, 0x02, 0x92, 0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, \n0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, \n0x58, 0x67, 0xEF, 0x22, 0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, \n0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, \n0x00, 0xD2, 0x00, 0x6A, 0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, \n0xFF, 0x4B, 0x06, 0xD3, 0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, \n0x03, 0xD5, 0x04, 0xD6, 0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, \n0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, \n0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, \n0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, \n0x1D, 0x10, 0x02, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, \n0x00, 0xD2, 0x0A, 0x10, 0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, \n0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, \n0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, \n0x40, 0xC3, 0x04, 0x92, 0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, \n0x01, 0x92, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, \n0x40, 0x83, 0x0C, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, \n0x06, 0x92, 0xFF, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, \n0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, \n0x01, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, \n0x03, 0x92, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, \n0x01, 0x93, 0x00, 0x92, 0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, \n0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, \n0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, \n0x0B, 0x10, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, \n0xFF, 0x4B, 0x04, 0xD3, 0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, \n0x03, 0xD5, 0x46, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, \n0x0A, 0x10, 0x00, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, \n0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, \n0xFF, 0x6B, 0x6C, 0xEA, 0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, \n0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, \n0x04, 0xD2, 0x04, 0x92, 0x42, 0xA2, 0x40, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x04, 0x92, \n0x41, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x4A, 0xCB, 0x04, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, \n0x4A, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x54, 0x1B, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x54, 0x9A, 0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x78, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, \n0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, \n0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF4, 0x98, 0x9C, 0xA0, 0xA4, \n0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, \n0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, \n0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, \n0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xF9, 0x63, 0x0D, 0x62, 0x0E, 0xD4, 0x0E, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, \n0x7D, 0x67, 0x50, 0xC3, 0x06, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, \n0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x84, 0x1B, 0x01, 0x6A, 0x4B, 0xEA, 0x00, 0x6C, \n0x18, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x0D, 0x1B, 0x05, 0xD2, 0x05, 0x92, 0x9D, 0x67, 0x50, 0xC4, \n0x06, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, 0x0B, 0x22, 0x06, 0x92, 0x40, 0xA2, \n0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, \n0x84, 0x1B, 0x10, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x1F, 0x6A, 0x9D, 0x67, 0x55, 0xCC, 0x06, 0x92, \n0x40, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x07, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0D, 0x97, \n0x07, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x01, 0x6A, 0x9D, 0x67, \n0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, \n0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, 0x9D, 0x67, 0x41, 0xC4, \n0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x5A, \n0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x06, 0x2A, \n0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, 0x7D, 0x67, 0x48, 0xA3, \n0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, \n0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, \n0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, \n0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, \n0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, 0x09, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, \n0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xC8, 0x04, \n0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x05, 0x2A, 0xBD, 0x67, \n0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, 0x15, 0x2A, 0xBD, 0x67, \n0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x06, 0x2A, 0x9D, 0x67, \n0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, 0x5D, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0x25, 0x05, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, 0x5D, 0x67, 0x7D, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, \n0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, 0x7D, 0x67, 0x4D, 0xCB, \n0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, 0x7D, 0x67, 0x4D, 0xAB, \n0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, 0x4B, 0xAB, 0x6E, 0x42, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0xFF, 0x4A, 0xBD, 0x67, \n0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, 0x02, 0x6A, 0x7D, 0x67, \n0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, 0x50, 0xC5, 0x00, 0x6A, \n0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, \n0x42, 0xF5, 0x09, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, \n0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x01, 0x4A, \n0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, \n0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3B, 0x05, \n0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, \n0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x7D, 0x67, 0x55, 0xC3, \n0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, \n0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x3B, 0x05, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x54, 0xA3, \n0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, \n0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, \n0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, 0x5D, 0x67, \n0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, 0x20, 0x10, 0x7D, 0x67, \n0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x23, 0xF1, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, \n0x18, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, \n0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, \n0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, \n0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, 0x5D, 0x67, 0x69, 0xAA, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x78, 0xC2, 0x7D, 0x67, 0x49, 0xAB, \n0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x18, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, \n0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, 0x00, 0x6A, 0x7D, 0x67, \n0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, \n0x09, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, \n0x18, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0xBD, 0x67, \n0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xD1, 0x2A, \n0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, 0x9D, 0x67, 0x50, 0xA4, \n0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, \n0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF0, 0x11, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0x7D, 0x67, \n0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, 0x6C, 0xEA, 0x50, 0x22, \n0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, \n0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x3A, 0x10, 0x9D, 0x67, \n0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x20, 0x6A, 0x6C, 0xEA, \n0x0F, 0x2A, 0x00, 0x18, 0x52, 0x05, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, 0x20, 0x6A, 0x6D, 0xEA, \n0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, \n0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x19, 0x10, \n0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x05, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x08, 0x6A, \n0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, \n0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, \n0x00, 0x18, 0x63, 0x06, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, \n0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x18, 0xA1, 0x0F, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, \n0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, \n0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, \n0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, \n0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, \n0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, \n0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, \n0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, \n0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x92, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x88, 0x06, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, \n0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, \n0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, \n0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x54, 0x9A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x60, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, \n0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xCD, 0x06, 0x00, 0x18, 0xFE, 0x06, \n0x00, 0x18, 0x64, 0x09, 0x00, 0x18, 0x05, 0x23, 0x00, 0x18, 0xB7, 0x1E, 0x00, 0x18, 0xDC, 0x0B, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, \n0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, \n0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x01, 0x6B, 0x60, 0xC2, \n0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x01, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x01, 0xF5, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x7C, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, \n0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, \n0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, \n0x7D, 0x67, 0x48, 0xAB, 0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, \n0x00, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x60, 0x9A, 0x00, 0xF4, \n0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x44, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x44, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, \n0x02, 0x2A, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, \n0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, \n0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, \n0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF5, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, \n0x1F, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, \n0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, \n0x06, 0x2A, 0x00, 0x18, 0x45, 0x07, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x01, 0x4B, \n0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, \n0x82, 0x67, 0x00, 0x18, 0x36, 0x14, 0x00, 0x18, 0x81, 0x14, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, \n0x06, 0x22, 0x00, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x04, 0x4A, 0x49, 0xE3, \n0x40, 0x9A, 0x00, 0xEA, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, \n0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x54, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, \n0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x25, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, \n0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, \n0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, \n0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, \n0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, \n0x62, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, \n0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x41, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, \n0x60, 0x9B, 0x60, 0xDA, 0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x58, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, \n0x01, 0x6B, 0x6E, 0xEA, 0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, \n0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, \n0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, \n0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, \n0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, \n0x60, 0xDA, 0x23, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF5, 0x5C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, \n0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, \n0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x01, 0x6B, \n0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, \n0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF3, 0x10, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x7C, 0x9B, 0x61, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x01, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, \n0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x0E, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x0C, 0xF0, 0x01, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, \n0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x40, 0xF0, \n0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, \n0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x50, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x9F, 0x08, 0x00, 0x18, 0xD7, 0x08, \n0x00, 0x18, 0xF0, 0x08, 0x00, 0x18, 0x23, 0x09, 0x00, 0x18, 0x1A, 0x09, 0x00, 0x18, 0x34, 0x09, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x78, 0x09, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, \n0x74, 0xC2, 0x00, 0x18, 0x22, 0x07, 0x00, 0x18, 0x52, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, \n0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, 0x0D, 0x07, 0x00, 0x18, 0x11, 0x07, 0x00, 0x18, \n0x87, 0x09, 0x00, 0x18, 0x47, 0x1B, 0x00, 0x18, 0x2B, 0x07, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, 0x7D, 0x67, 0x40, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x40, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF7, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x44, 0x9A, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, \n0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, \n0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, \n0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, 0x8C, 0xEA, 0x40, 0xCB, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x78, 0x9B, \n0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x5C, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x7C, 0x9B, 0x80, 0x9B, 0x00, 0xF4, 0x00, 0x6B, 0x8D, 0xEB, \n0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, \n0x40, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, \n0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x9D, 0x67, \n0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x48, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, \n0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, \n0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x70, 0x9B, 0x60, 0xDA, 0x11, 0x10, 0x9D, 0x67, \n0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x74, 0x9B, 0x60, 0xDA, \n0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0xC1, 0xF7, 0x78, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, \n0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, \n0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, \n0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, \n0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, \n0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, \n0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, \n0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, \n0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, \n0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, \n0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, \n0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, \n0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, \n0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, \n0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, \n0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, \n0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, \n0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, 0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, \n0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, \n0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, \n0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, 0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, \n0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, \n0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, \n0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, \n0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, \n0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, \n0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, \n0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, \n0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, \n0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, 0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, \n0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, \n0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, \n0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, \n0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, \n0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, \n0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, \n0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, \n0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, \n0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, \n0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, \n0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x06, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, \n0x48, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x02, 0x6B, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x4A, 0xA2, 0x46, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0xFF, 0x6B, 0x59, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, \n0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, \n0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x1A, 0x23, 0x02, 0x6B, \n0x4E, 0xEB, 0x20, 0x23, 0x27, 0x2A, 0x5D, 0x67, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x8C, 0xEB, \n0xC0, 0xF4, 0xA5, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, \n0x11, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0xC0, 0xF4, \n0x68, 0xC2, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, \n0xC0, 0xF4, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x41, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x00, 0x52, \n0x78, 0x67, 0x3C, 0x2B, 0x02, 0x52, 0x78, 0x67, 0x04, 0x2B, 0x02, 0x6B, 0x6E, 0xEA, 0x2B, 0x22, \n0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, \n0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, 0x18, 0x4C, 0xC0, 0xF4, \n0xA5, 0xA4, 0x01, 0x6C, 0x8C, 0xED, 0xFF, 0x6C, 0xAC, 0xEC, 0x9C, 0x34, 0x00, 0xF6, 0x80, 0x34, \n0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, \n0x8C, 0xEA, 0x40, 0xC3, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x64, 0xA3, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x6D, \n0x68, 0x6E, 0x00, 0x18, 0x24, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, \n0xC0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, \n0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x00, 0x18, 0xEB, 0x10, 0x00, 0x6C, 0x00, 0x6D, \n0x00, 0x18, 0x9A, 0x0B, 0x02, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x01, 0x6C, 0x0C, 0x6D, \n0x00, 0x18, 0x9A, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x54, 0xA2, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE3, 0xF1, 0x08, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, \n0x00, 0x18, 0x1D, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, 0x20, 0xF5, \n0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0F, 0x6B, 0x20, 0xF5, 0x69, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x8A, 0xA2, 0x01, 0x6B, 0x8C, 0xEB, \n0x83, 0x67, 0x28, 0x6B, 0x8D, 0xEB, 0x20, 0xF5, 0x6A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x07, 0x6B, 0x20, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, \n0xC0, 0xF4, 0x7F, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0x36, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, \n0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF5, 0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, \n0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, \n0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x85, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x11, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, \n0x66, 0xC2, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, \n0x99, 0x07, 0x10, 0xF0, 0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0xFF, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x10, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, \n0x07, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, \n0x00, 0x18, 0x99, 0x07, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, \n0x6C, 0xEC, 0x07, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, \n0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x04, 0x6C, 0x01, 0x6D, \n0x00, 0x18, 0x09, 0x0E, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, \n0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, \n0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xDA, \n0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x26, 0x2A, 0x00, 0x18, 0x39, 0x21, 0x00, 0x18, 0x83, 0x0D, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, \n0x66, 0xC2, 0x04, 0x10, 0x0C, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, \n0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, \n0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x10, \n0x00, 0x18, 0x6C, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, \n0x04, 0x23, 0x02, 0x6B, 0x6E, 0xEA, 0x1F, 0x22, 0x4F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x02, 0x6B, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, \n0xC0, 0xF4, 0x65, 0xC2, 0x31, 0x10, 0x9D, 0x67, 0x44, 0xA4, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x6B, 0xC2, 0x0B, 0x10, 0x7D, 0x67, 0x44, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, \n0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x06, 0xD4, 0x00, 0x18, 0x3C, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x60, 0xA2, 0x7F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x00, 0x18, 0x98, 0x0C, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, \n0x0D, 0x22, 0x06, 0x92, 0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0C, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, \n0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, \n0x6C, 0xEA, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, \n0x05, 0x5A, 0x58, 0x67, 0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, \n0x01, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, 0x37, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x2A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x22, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x10, 0x6A, \n0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, \n0x20, 0x6B, 0x6C, 0xEA, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, \n0x4D, 0xA2, 0x0E, 0x2A, 0x01, 0x6A, 0x0E, 0x10, 0x00, 0x65, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, \n0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, \n0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF5, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, \n0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, \n0x58, 0xA3, 0x38, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x32, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0F, 0x6C, 0x2B, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0xBF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, \n0xC8, 0x03, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x06, 0x6D, \n0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, \n0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x46, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, \n0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, \n0x9A, 0x0B, 0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, \n0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, \n0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x24, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x86, 0xA2, 0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x6F, 0x6C, \n0x2C, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x01, 0x6B, \n0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, \n0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x0E, 0x6D, 0x00, 0x18, 0x9A, 0x0B, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x08, 0x6B, 0x6C, 0xEA, 0x05, 0x2A, 0x01, 0x6C, \n0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, \n0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, \n0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2D, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, \n0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x00, 0x6C, 0x08, 0x6D, \n0x00, 0x18, 0x99, 0x07, 0x00, 0x18, 0xA3, 0x21, 0x01, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x6F, 0x6C, 0x2E, 0x6D, \n0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x02, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, \n0x39, 0x21, 0x7D, 0x67, 0x58, 0xA3, 0x04, 0x22, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, \n0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x22, 0x1E, 0x00, 0x18, 0x43, 0x1E, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x78, 0xC4, \n0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, \n0x01, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x9D, 0x67, 0x78, 0xA4, 0x6E, 0xEA, 0x20, 0xF1, \n0x04, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x0D, 0x5A, 0x78, 0x67, 0x00, 0xF1, 0x1E, 0x23, 0x48, 0x33, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, \n0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, \n0x9D, 0x67, 0x5C, 0xA4, 0x06, 0x22, 0x7D, 0x67, 0x5C, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x61, 0x0D, \n0x02, 0x10, 0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x48, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0xC0, 0xF0, 0x0D, 0x2A, 0x00, 0x18, 0xD4, 0x02, 0xD5, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, \n0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, \n0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x80, 0xF0, 0x1D, 0x2A, 0x00, 0x18, \n0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x80, 0xF0, 0x19, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x9D, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, \n0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, \n0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, \n0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x64, 0x2A, 0x00, 0x18, 0x27, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, \n0x61, 0x2A, 0x00, 0x18, 0xE4, 0x0D, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, \n0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, \n0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, \n0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6C, \n0x8E, 0xEA, 0x22, 0x2A, 0x00, 0x18, 0xF2, 0x0D, 0x20, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x0E, 0x22, 0x00, 0x18, \n0xCC, 0x02, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, 0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, \n0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, \n0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x08, 0x6B, \n0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x4F, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, \n0x04, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0xB0, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x7D, 0x0B, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, \n0x16, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, \n0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, \n0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, \n0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, \n0x18, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, \n0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, \n0x00, 0x18, 0xC6, 0x0E, 0x7B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, \n0x2C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, \n0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x69, 0xA2, 0x01, 0x6A, 0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, \n0x67, 0x03, 0x11, 0x10, 0x00, 0x18, 0xCE, 0x0E, 0x0E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, \n0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x7D, 0x67, 0x48, 0x8B, 0x00, 0x52, 0x58, 0x67, 0x28, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x02, 0x6A, 0x4D, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, \n0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x0E, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0xA0, 0xF0, \n0x1D, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xA0, 0xF0, 0x16, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x3A, 0x22, 0x00, 0x52, 0x78, 0x67, \n0x3C, 0x2B, 0x03, 0x52, 0x58, 0x67, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x4C, 0xA2, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, \n0x1B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x0C, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x05, 0x10, \n0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x50, 0xA3, 0x5E, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, 0x4D, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x09, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x16, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x49, 0xE3, 0xFF, 0x6B, 0x55, 0x4B, \n0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0xFE, 0x4A, \n0x49, 0xE4, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, \n0x6C, 0xEA, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x54, 0x22, \n0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x4E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, 0x7D, 0x67, 0x50, 0xA3, \n0x2B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, \n0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0xFF, 0x6B, \n0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x04, 0x2A, \n0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, \n0x13, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, \n0x6C, 0xEA, 0xE0, 0xF0, 0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x41, 0xA2, 0x0F, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x07, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0xC0, 0xF4, 0x4C, 0xC3, 0x00, 0x18, 0xFD, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, \n0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x61, 0xA2, \n0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x4A, 0x03, 0x5A, 0x58, 0x67, 0x02, 0x22, \n0x00, 0x18, 0xE1, 0x0E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, \n0x40, 0x6B, 0x6C, 0xEA, 0x49, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x46, 0xA2, 0x10, 0x6B, 0x6C, 0xEA, 0x40, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, \n0x6E, 0xEA, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, \n0x10, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, 0x60, 0xC2, 0x10, 0xF0, \n0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, \n0x00, 0x08, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC0, 0xC5, 0xBD, 0x67, \n0x84, 0xC5, 0xDD, 0x67, 0x68, 0xC6, 0x7D, 0x67, 0x4C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0C, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x1F, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x63, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7A, 0xC2, 0x13, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x7A, 0xC2, 0x9D, 0x67, 0x48, 0xA4, 0x05, 0x4A, \n0xBD, 0x67, 0x48, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x63, 0xEA, 0x58, 0x67, \n0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x68, 0xA4, 0xC0, 0xF4, \n0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0xBD, 0x67, \n0x44, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x2B, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x9D, 0x67, 0x64, 0xA4, \n0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x48, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x5A, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5B, 0xA2, \n0x0A, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x5B, 0xA2, 0x67, 0x42, 0x03, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x5E, 0xA2, 0x23, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x67, 0x42, 0x1C, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x52, 0xAA, \n0x6E, 0xEA, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0xC0, 0xF4, 0x66, 0xC2, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x86, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0x20, 0xF5, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x03, 0x6B, 0x20, 0xF5, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x64, 0x6B, 0x20, 0xF5, 0x62, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, \n0x20, 0xF5, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0x20, 0xF5, \n0x65, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x53, 0xC4, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, \n0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x43, 0xEB, 0x58, 0x67, 0x80, 0xF0, 0x08, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, \n0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, \n0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, \n0x43, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x20, 0xF5, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0E, 0x4A, 0x7D, 0x67, 0x53, 0xC3, \n0x26, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, \n0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, \n0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x4A, 0x9D, 0x67, 0x53, 0xC4, 0x7D, 0x67, \n0x53, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0x24, 0x22, 0x5D, 0x67, 0x93, 0xA2, 0x5D, 0x67, 0x73, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x44, 0xA2, 0x61, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xE0, 0xF4, \n0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x61, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7C, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x43, 0xEB, 0x58, 0x67, 0x20, 0xF1, \n0x18, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x23, 0x10, \n0x5D, 0x67, 0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, \n0x64, 0xA2, 0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x9D, 0x67, 0x72, 0xA4, 0x63, 0xEA, 0x58, 0x67, \n0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, \n0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD8, 0x2A, \n0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x2B, 0x10, 0x5D, 0x67, \n0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x64, 0xA2, \n0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, 0x05, 0x22, \n0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x50, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0xE0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x18, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x68, 0x42, 0xFE, 0x4B, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, 0x17, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x19, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, \n0x40, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x18, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x20, 0xF5, 0x41, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x62, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x03, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x00, 0x6C, 0x00, 0x18, \n0x36, 0x12, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, 0x64, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xE0, 0xF4, 0x40, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xE0, 0xF4, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x45, 0xA2, \n0x63, 0xEA, 0x58, 0x67, 0x46, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x8D, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, \n0x44, 0x32, 0x6D, 0xE2, 0xFF, 0x6A, 0x6C, 0xEA, 0x4D, 0xE4, 0xFF, 0x6A, 0x6C, 0xEA, 0x6E, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x04, 0x6F, 0x00, 0x18, \n0x54, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xE0, 0xF4, \n0x64, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, \n0x2D, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0xC0, 0xF4, 0x7C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xE0, 0xF4, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, \n0x7D, 0x67, 0x48, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x2D, 0x6B, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0xE0, 0xF4, 0x62, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, \n0x01, 0x6B, 0x6E, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x0B, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, \n0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x7D, 0x0B, 0x0B, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, \n0x00, 0x18, 0x09, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, \n0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x10, 0x6B, \n0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, \n0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, \n0x6C, 0xEA, 0x43, 0x2A, 0x00, 0x18, 0xC6, 0x0E, 0x40, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, \n0x12, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0xC0, 0xF4, 0x65, 0xC2, 0x02, 0x10, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, \n0x02, 0x93, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x08, 0x2A, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, \n0xEE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, \n0x0A, 0xD4, 0x0B, 0xD5, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x06, 0x93, \n0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, \n0x0C, 0xD6, 0x0B, 0x92, 0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, \n0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, \n0x05, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, \n0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, \n0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, \n0x4F, 0xEB, 0x01, 0x92, 0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, \n0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, \n0x08, 0x10, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, \n0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, \n0x20, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, \n0x01, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, \n0x4C, 0xEB, 0x0A, 0x92, 0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, \n0x7C, 0xA5, 0x4C, 0xEB, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, \n0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, \n0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, \n0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, \n0x4C, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, \n0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, \n0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x4C, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF6, 0x50, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, \n0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x00, 0xF6, 0x74, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, \n0xFB, 0x63, 0x09, 0x62, 0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, \n0x20, 0xF0, 0x88, 0xC5, 0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, \n0x00, 0x6A, 0x04, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xCA, 0x13, \n0x02, 0x2A, 0x00, 0x6A, 0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, \n0x20, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, \n0x00, 0xEA, 0x02, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, \n0x12, 0x10, 0x22, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, \n0x0A, 0x10, 0x42, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, \n0x02, 0x10, 0x00, 0x6A, 0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x54, 0x9A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x58, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, \n0x5C, 0xA3, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x5C, 0x9A, 0x6D, 0xEA, \n0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, \n0x04, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, \n0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, \n0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6D, 0xAE, 0xEA, 0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, \n0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF6, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, \n0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x58, 0x9A, 0x49, 0xE3, \n0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, \n0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, \n0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, \n0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x60, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xC3, 0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, \n0x8D, 0x14, 0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x60, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x08, 0xF0, \n0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, \n0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, \n0xD5, 0x22, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, \n0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, \n0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x60, 0xF6, 0x5C, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xC9, 0xF7, 0x05, 0x4B, \n0x6D, 0xE4, 0x60, 0xDA, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x77, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x77, 0x9A, 0x03, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x77, 0xDA, 0x00, 0x18, 0x79, 0x17, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x22, 0x15, 0x00, 0x18, 0xD4, 0x09, \n0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, \n0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x6E, 0xEA, \n0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, 0x00, 0x18, 0xBE, 0x0E, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, \n0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, \n0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xE4, 0x3A, \n0x00, 0x18, 0xD4, 0x09, 0x7D, 0x17, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x64, 0x6B, 0xE2, 0xF3, 0x7C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, \n0xE2, 0xF3, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, \n0x42, 0x23, 0x29, 0x5A, 0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, \n0x4E, 0xEB, 0x2D, 0x23, 0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, \n0x4A, 0x23, 0x51, 0x5A, 0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, \n0x64, 0x6B, 0x4E, 0xEB, 0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, \n0x02, 0xF4, 0x64, 0xDA, 0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0x02, 0xF4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x49, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x09, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, \n0x02, 0xF4, 0x64, 0xDA, 0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0x02, 0xF4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x31, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x11, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, \n0x02, 0xF4, 0x64, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0x02, 0xF4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x05, 0xF0, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x19, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x22, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, \n0x02, 0xF4, 0x64, 0xDA, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0x02, 0xF4, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF6, 0x7C, 0x9B, 0x02, 0xF4, 0x64, 0xDA, \n0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x44, 0x9A, 0x02, 0x93, 0x58, 0xEB, \n0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x40, 0x9A, \n0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, \n0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, \n0x48, 0xCB, 0x1C, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, \n0x80, 0x9B, 0x80, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, \n0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF4, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, \n0x10, 0x10, 0x5D, 0x67, 0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x50, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, \n0x44, 0xC3, 0x7D, 0x67, 0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, \n0xE7, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x54, 0x9A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, \n0x6D, 0xEA, 0x00, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, \n0x00, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, \n0x03, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, \n0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, \n0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x4A, 0xA2, \n0x07, 0x93, 0x41, 0xC3, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x6A, 0xC2, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x06, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, \n0x47, 0xAA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x00, 0x18, 0x96, 0x14, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, \n0x48, 0x9A, 0x6C, 0xEA, 0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF4, 0x4C, 0x9A, 0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x70, 0x9B, 0x80, 0xA3, \n0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, \n0x00, 0xF6, 0x60, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, \n0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB0, 0x14, \n0x06, 0x92, 0x18, 0x4A, 0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0xD8, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, \n0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF0, 0x06, 0x4A, 0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x14, 0x7D, 0x67, 0x50, 0xC3, \n0x7D, 0x67, 0x50, 0xA3, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, \n0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0xF4, 0x4E, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, \n0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, 0x80, 0x9B, \n0x00, 0xF2, 0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x4D, 0xE3, 0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, \n0x4F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, \n0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0x00, 0xF4, 0x6F, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x74, 0x9B, \n0x80, 0x9B, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x78, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, \n0x1F, 0x6B, 0x04, 0xF7, 0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, \n0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x06, 0x13, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, \n0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x71, 0xC2, \n0x00, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x72, 0xC2, \n0x00, 0x92, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x73, 0xC2, \n0x00, 0x92, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x74, 0xC2, \n0x00, 0x92, 0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x75, 0xC2, \n0x00, 0x92, 0x65, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x76, 0xC2, \n0x00, 0x92, 0x66, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x77, 0xC2, \n0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, \n0x41, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, \n0x05, 0x92, 0x42, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, \n0x50, 0xC3, 0x9D, 0x67, 0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, \n0x05, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0x8F, 0x0A, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x06, 0x2A, \n0x9D, 0x67, 0x52, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x35, 0x0A, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0xD6, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, \n0x9D, 0x67, 0x72, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x7D, 0x67, \n0x51, 0xA3, 0x29, 0x2A, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x25, 0x2A, 0x00, 0x18, 0x39, 0x21, \n0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, \n0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, \n0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x04, 0x92, 0x30, 0xF0, 0x20, 0x6B, 0xC3, 0xF1, 0x18, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x05, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x04, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xFF, 0x0C, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, \n0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, \n0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, \n0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0xA6, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, \n0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, \n0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA6, 0xA2, \n0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, \n0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, \n0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x7C, 0x33, 0xA6, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, \n0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, \n0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, \n0x5C, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x40, 0xF5, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x40, 0x9A, 0x40, 0x9A, \n0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, \n0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, \n0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, \n0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, \n0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, \n0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, \n0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD6, 0x27, 0x5D, 0x10, \n0x7D, 0x67, 0x58, 0xA3, 0x20, 0x6B, 0x4E, 0xEB, 0x35, 0x23, 0x21, 0x52, 0x78, 0x67, 0x0F, 0x23, \n0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x1C, 0x22, 0x39, 0x10, \n0x0B, 0x6B, 0x4E, 0xEB, 0x22, 0x23, 0x14, 0x6B, 0x6E, 0xEA, 0x40, 0x22, 0x32, 0x10, 0x25, 0x6B, \n0x4E, 0xEB, 0x3E, 0x23, 0x26, 0x52, 0x78, 0x67, 0x07, 0x23, 0x21, 0x6B, 0x4E, 0xEB, 0x3A, 0x23, \n0x23, 0x6B, 0x6E, 0xEA, 0x39, 0x22, 0x25, 0x10, 0x87, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0xC5, 0x6B, \n0x6E, 0xEA, 0x1A, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x15, 0x2D, 0x10, \n0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xC1, 0x15, 0x28, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xBA, 0x04, 0x23, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xFB, 0x15, 0x1E, 0x10, 0x07, 0x92, \n0x82, 0x67, 0x00, 0x18, 0x04, 0x05, 0x19, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x06, 0x16, \n0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, \n0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, \n0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, \n0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, \n0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x8B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, \n0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, \n0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, \n0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, \n0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, \n0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, \n0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, \n0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x8B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, \n0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x4B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0x02, 0x6B, \n0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xF2, \n0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, \n0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, \n0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x70, 0x16, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, \n0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xAC, 0x16, \n0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, \n0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, \n0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, \n0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, \n0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, \n0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, \n0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, \n0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, \n0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, \n0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, \n0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, \n0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x40, 0x9A, \n0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, \n0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x40, 0x9A, \n0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, \n0x50, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x40, 0x9A, \n0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x78, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x66, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x02, 0xF5, 0x18, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, \n0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, \n0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x72, 0x9B, \n0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xAC, 0x16, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE7, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xEC, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF5, 0x60, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x47, 0xA2, 0x49, 0xE3, \n0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, \n0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x46, 0xA2, 0x5A, 0x32, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, \n0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x46, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x6C, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x80, 0xF0, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x5D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, \n0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, \n0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, \n0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x74, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, \n0x40, 0x6B, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, \n0xC2, 0x67, 0x05, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x11, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, \n0x08, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, \n0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, 0x39, 0x0F, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, \n0x73, 0x12, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1B, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, \n0x6C, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x7D, 0x0B, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, \n0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x5B, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x00, 0x18, 0xC3, 0x1D, 0x7D, 0x67, 0x50, 0xC3, 0x5D, 0x67, 0x70, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x04, 0x10, \n0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x5D, 0x67, 0x70, 0xA2, 0x40, 0x6A, 0x6C, 0xEA, \n0x1C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF5, 0x58, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x02, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, \n0x01, 0x6B, 0x6C, 0xEA, 0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x86, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, \n0x66, 0xC2, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, \n0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x08, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, \n0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, \n0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x48, 0xA2, 0x02, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0xD4, 0x0F, 0x01, 0x10, 0x00, 0x65, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x19, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, \n0xD2, 0x17, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x3A, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x31, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x00, 0x18, \n0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, \n0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x67, 0x03, 0x02, 0x10, 0x00, 0x18, 0xCE, 0x0E, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x23, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, \n0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, \n0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x12, 0x05, 0x97, 0x03, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, \n0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, \n0x47, 0x67, 0xBD, 0x67, 0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, \n0x9D, 0x67, 0x50, 0xA4, 0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, \n0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, \n0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, \n0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, \n0x9D, 0x67, 0x4C, 0xA4, 0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, \n0x63, 0x33, 0x9D, 0x67, 0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0xBD, 0x67, 0x40, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, \n0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, \n0x46, 0x67, 0xBD, 0x67, 0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, \n0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, \n0x41, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, \n0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, \n0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, \n0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, \n0x7D, 0x67, 0x54, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, \n0x05, 0x92, 0x0E, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, \n0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, \n0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, \n0x0C, 0xD6, 0x7D, 0x67, 0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, \n0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, \n0x19, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, \n0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, \n0x05, 0xD2, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, \n0x05, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, \n0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, \n0x4E, 0xEB, 0x16, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, \n0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, \n0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, \n0x0A, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, \n0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x05, 0xD2, \n0x05, 0x92, 0x67, 0x42, 0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, \n0x04, 0xD2, 0x0B, 0x92, 0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, \n0x50, 0x9A, 0x8C, 0xEA, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, \n0x06, 0xD2, 0x04, 0x92, 0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, \n0x6B, 0xEB, 0x06, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, \n0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, \n0x0A, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0xD7, 0x1A, 0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, \n0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, \n0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, \n0x56, 0xCB, 0x0C, 0x92, 0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, \n0x76, 0xAA, 0x0D, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x24, 0x10, 0x9D, 0x67, \n0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, \n0x06, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, \n0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, \n0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, \n0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, \n0x00, 0x92, 0x81, 0xF6, 0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, \n0x74, 0xDA, 0x00, 0x92, 0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, \n0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, \n0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x60, 0xAA, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, \n0x5D, 0x67, 0x68, 0xAA, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, \n0x00, 0x6A, 0x7D, 0x67, 0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, \n0x06, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, \n0x05, 0xD2, 0x7D, 0x67, 0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, \n0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x10, 0x83, 0xF1, \n0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x9D, 0x67, 0x4E, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, \n0x56, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFA, 0x63, 0x0B, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, \n0x20, 0xF0, 0xD0, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x94, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x78, 0xC6, \n0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, \n0x20, 0xF0, 0x50, 0xA5, 0x24, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, \n0x31, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x60, 0x9A, 0x80, 0xF4, 0x14, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x51, 0x10, \n0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x32, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, \n0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x13, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x38, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x50, 0xA3, 0x75, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x12, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0x1F, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x76, 0x5A, 0x58, 0x67, 0x0D, 0x2A, \n0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x00, 0xF4, 0x12, 0x6A, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x0C, 0x10, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x61, 0xF1, 0x0A, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x56, 0x10, 0x9D, 0x67, 0x20, 0xF0, \n0x50, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, \n0x58, 0x67, 0x04, 0x22, 0xFF, 0x6A, 0x02, 0x4A, 0x07, 0xD2, 0x1C, 0x10, 0x7D, 0x67, 0x20, 0xF0, \n0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x8D, 0x5A, \n0x58, 0x67, 0x04, 0x22, 0x00, 0xF3, 0x01, 0x6A, 0x07, 0xD2, 0x0C, 0x10, 0x7D, 0x67, 0x20, 0xF0, \n0x50, 0xA3, 0x8D, 0x5A, 0x58, 0x67, 0x04, 0x2A, 0x00, 0xF5, 0x01, 0x6A, 0x07, 0xD2, 0x02, 0x10, \n0x00, 0x6A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x04, 0xD2, 0x04, 0x92, \n0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0x05, 0x92, \n0x07, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x48, 0x9A, 0x04, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x80, 0xA6, 0x04, 0x93, 0x06, 0x92, \n0x18, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x27, 0x1B, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, \n0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x04, 0x5A, \n0x58, 0x67, 0xA4, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x0E, 0x2A, \n0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, \n0x82, 0x67, 0x1F, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0x10, 0x7D, 0x67, 0x20, 0xF0, \n0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x91, 0x5A, \n0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x02, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0x0D, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x95, 0x5A, 0x58, 0x67, 0x07, 0x2A, \n0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x03, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x0B, 0x97, \n0x06, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x02, 0x22, \n0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x0F, 0x5A, 0x58, 0x67, \n0x0F, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x1D, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x01, 0x6B, 0x6E, 0xEA, \n0x18, 0x2A, 0x9D, 0x67, 0x5C, 0xA4, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x11, 0x10, \n0x7D, 0x67, 0x58, 0xA3, 0x0F, 0x5A, 0x58, 0x67, 0x0C, 0x2A, 0x00, 0x18, 0x11, 0x1C, 0x07, 0x2A, \n0x7D, 0x67, 0x5C, 0xA3, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x02, 0x10, 0x00, 0x18, \n0x11, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0xC0, 0xF0, 0x1B, 0x2A, \n0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0xE0, 0xF1, 0x11, 0x23, 0x48, 0x33, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xBB, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, \n0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x00, 0x65, \n0x47, 0x11, 0xA1, 0xF4, 0x10, 0x6A, 0x82, 0x67, 0xFF, 0x6D, 0x77, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, \n0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x1D, 0x11, 0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0x00, 0xF1, \n0x17, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, \n0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, \n0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xDA, 0x10, 0xA1, 0xF4, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xAB, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, \n0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xBA, 0x1A, 0x76, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x38, 0x10, \n0xA1, 0xF4, 0x10, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF6, 0x54, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x7C, 0x9A, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0x10, 0x00, 0x65, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x43, 0x2A, 0x01, 0xF0, 0x08, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x10, 0x6A, 0x82, 0x67, \n0x0E, 0x6D, 0x08, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x14, 0x6A, 0x82, 0x67, 0x03, 0x6D, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x44, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x32, 0x1C, 0x01, 0xF0, 0x08, 0x6C, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF6, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, \n0x48, 0xA3, 0x56, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, \n0x78, 0x67, 0x02, 0x23, 0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, \n0x6E, 0xEA, 0x31, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, \n0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, \n0x40, 0xA3, 0x07, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, \n0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, \n0x7D, 0x67, 0x40, 0xA3, 0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, \n0x05, 0x2A, 0x7D, 0x67, 0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, \n0x7D, 0x67, 0x40, 0x83, 0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, \n0x40, 0xA3, 0x67, 0x42, 0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, \n0x20, 0x6B, 0x6E, 0xF6, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, \n0xE0, 0xF3, 0x09, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x50, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, \n0x00, 0x6A, 0x09, 0x10, 0x32, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, \n0x7D, 0x67, 0x48, 0xCB, 0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, \n0x7D, 0x67, 0x42, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x0E, 0xF7, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, \n0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x42, 0xA3, 0x1A, 0x10, \n0x7D, 0x67, 0x40, 0xAB, 0x64, 0x5A, 0x58, 0x67, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, \n0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x40, 0x6B, 0x8D, 0xEB, \n0x60, 0xDA, 0x7D, 0x67, 0x42, 0xA3, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xAB, 0x01, 0x4A, 0x7D, 0x67, \n0x40, 0xCB, 0xD4, 0x17, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x60, 0xDA, 0x2D, 0x10, 0x7D, 0x67, \n0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, \n0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x10, 0x6B, 0x8D, 0xEB, \n0x60, 0xDA, 0x2B, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, \n0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x10, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x80, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x8C, 0xEA, 0x01, 0x22, \n0x01, 0x6A, 0x6E, 0xEA, 0xC4, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, \n0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, \n0x4F, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xF3, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x4F, 0xF0, 0x05, 0x4B, \n0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0xC0, 0xF4, \n0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, \n0x18, 0x4B, 0xC0, 0xF4, 0x70, 0xAB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x48, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x60, 0x9B, 0x80, 0xA3, \n0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x6C, \n0x00, 0x18, 0x8D, 0x14, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0x11, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, \n0x00, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, \n0x85, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, 0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, \n0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, \n0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, \n0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, \n0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, 0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, \n0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, 0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x54, 0x9A, 0xBD, 0x67, 0x68, 0xAD, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xAA, 0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, \n0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, \n0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, 0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, \n0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x9D, 0x67, \n0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x40, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, \n0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, \n0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, \n0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, \n0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, \n0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, \n0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, \n0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, 0x02, 0x63, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xE1, 0xF7, 0x1F, 0x6B, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA0, 0xF4, 0x99, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, 0x8D, 0xEB, \n0xA0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, \n0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, \n0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x50, 0x9A, \n0x49, 0xE3, 0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x54, 0x9A, 0x59, 0xEB, 0x10, 0xEC, 0x8B, 0xE3, 0x46, 0x32, \n0x49, 0xE4, 0x56, 0x34, 0x44, 0x67, 0x58, 0x32, 0x8B, 0xE2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, \n0x48, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x40, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA0, 0xF4, 0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xC2, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x00, 0x6A, 0x06, 0xD2, \n0x00, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x58, 0x9A, 0x60, 0xAA, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x49, 0xCC, \n0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x5C, 0x9A, 0x40, 0xA2, \n0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF7, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0x34, 0x80, 0x34, \n0x83, 0x34, 0x83, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xEE, 0xF1, 0x1F, 0x6C, 0x8C, 0xEA, \n0x10, 0xF0, 0x00, 0x6C, 0x8B, 0xEC, 0x8D, 0xEA, 0x40, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, \n0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0xCB, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA0, 0xF4, 0x54, 0xAA, 0xE1, 0xF7, 0x1F, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x8B, 0x10, 0x01, 0x6C, \n0x00, 0x18, 0x8D, 0x14, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF7, 0x44, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x02, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x4B, 0xAC, 0xC0, 0xF7, 0x10, 0x5A, \n0x58, 0x67, 0xD3, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x74, 0xAA, \n0x9D, 0x67, 0x49, 0xAC, 0x4B, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x82, 0x67, \n0x01, 0x6D, 0x18, 0x6E, 0x07, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x06, 0xD2, 0x06, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF7, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x54, 0x6B, \n0x6E, 0xEA, 0x04, 0x2A, 0x06, 0x92, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1E, 0x06, 0x93, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x03, 0x6B, 0x8C, 0xEB, 0xA0, 0xF4, 0xB9, 0xA2, 0x04, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xA0, 0xF4, 0x79, 0xC2, 0x9D, 0x67, 0x74, 0xA4, 0x6F, 0x6A, \n0x6C, 0xEA, 0x82, 0x67, 0x19, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, \n0x50, 0x9A, 0x20, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, \n0x5A, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA0, 0xF4, 0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, \n0xA0, 0xF4, 0x7C, 0xC2, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x00, 0x18, 0xEA, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, \n0x0E, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, 0xFF, 0x6B, \n0x5D, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x06, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF7, 0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4A, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x5C, 0xA2, 0x43, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA0, 0xF4, 0x79, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, \n0x4E, 0xEB, 0x15, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x23, 0x23, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, \n0x6C, 0xEC, 0x02, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x21, 0x10, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, \n0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, \n0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x7D, 0x67, \n0x50, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, \n0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, \n0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x92, 0x01, 0x4A, \n0x40, 0xA2, 0x40, 0x32, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x6D, 0xEA, 0x40, 0x32, \n0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0xE1, 0xF7, \n0x1F, 0x6B, 0x6E, 0xEA, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, \n0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x44, 0x32, 0x48, 0x33, \n0x6D, 0xE2, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA0, 0xF4, 0x76, 0xCA, 0x00, 0x18, 0x5B, 0x1F, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x9D, 0x67, 0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, \n0x00, 0x6B, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, \n0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, \n0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, \n0x48, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x4C, 0x9A, \n0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, \n0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, \n0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF7, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x50, 0x9A, \n0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x54, 0x9A, 0x9D, 0x67, \n0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, \n0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, \n0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, \n0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x78, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, \n0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, \n0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD3, 0x1F, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, \n0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, \n0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, \n0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, \n0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFE, 0x1F, 0x7D, 0x67, 0x54, 0xA3, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, \n0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x48, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, \n0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x54, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, \n0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, \n0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, \n0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, \n0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, \n0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, \n0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, \n0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0xA2, \n0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF7, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x48, 0x9A, 0x40, 0xA2, 0x7D, 0x67, \n0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, \n0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, \n0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, \n0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, \n0x83, 0x3B, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x4A, 0x20, 0x0B, 0x10, \n0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x67, 0x20, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x99, 0x20, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, \n0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF7, 0x48, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x01, 0xD5, 0x46, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, \n0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x08, 0x22, 0x01, 0x92, 0x40, 0xAA, 0xFF, 0xF5, 0x1F, 0x6B, \n0x6C, 0xEA, 0x01, 0x93, 0x40, 0xCB, 0x0A, 0x10, 0x01, 0x92, 0x60, 0xAA, 0x00, 0xF2, 0x00, 0x6A, \n0x4D, 0xEB, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x01, 0x92, 0x60, 0xCA, 0x7D, 0x67, 0x40, 0xA3, \n0x01, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xCC, 0xF4, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, \n0x0F, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xC1, 0xF4, \n0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x04, 0x10, 0x01, 0x92, 0x48, 0xF2, 0x00, 0x6B, 0x60, 0xCA, \n0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x02, 0x6B, \n0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, \n0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x44, 0x9A, 0x09, 0x6B, \n0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x48, 0x9A, 0x7A, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, \n0xA1, 0xF0, 0x14, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, \n0x62, 0x67, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, \n0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x81, 0xF4, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6C, \n0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF4, 0x00, 0x6B, \n0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, \n0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF4, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF6, \n0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x03, 0xF0, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, \n0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, \n0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, \n0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, \n0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x00, 0x18, 0x9B, 0x1D, 0x01, 0xF4, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF4, \n0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, \n0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF6, 0x00, 0x6C, 0x01, 0x6B, \n0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF0, 0x00, 0x6B, \n0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, \n0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF4, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6B, 0x01, 0x6A, \n0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF0, 0x14, 0x6B, \n0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x40, 0x6A, \n0x6D, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x6C, 0x9A, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF7, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFE, 0x6C, 0x8C, 0xEA, \n0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF7, 0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, 0x80, 0xA2, \n0xFF, 0x6A, 0x8C, 0xEA, 0xFD, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, \n0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, \n0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, 0x00, 0x6B, 0x40, 0xDC, \n0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x03, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, \n0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, \n0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, \n0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x04, 0x4B, 0x54, 0x6A, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x1C, 0x04, 0x62, 0x67, \n0xE1, 0xF2, 0x18, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, \n0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0x41, 0xF3, 0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, \n0x00, 0x18, 0x30, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, 0x7D, 0x67, 0x58, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, \n0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x61, 0xC2, 0x05, 0x92, \n0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x0D, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8E, 0xA2, \n0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, \n0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, \n0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x41, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x92, 0x91, 0xA2, \n0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x05, 0x92, \n0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x08, 0x6B, \n0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, \n0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x76, 0xC2, \n0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x68, 0xC2, 0x05, 0x92, \n0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x49, 0x6B, 0x67, 0xC2, \n0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, \n0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0xA3, 0xF2, 0x7E, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x00, 0x18, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, \n0x21, 0xF4, 0x44, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF6, \n0x14, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, \n0x20, 0x6A, 0x62, 0x67, 0x25, 0xF7, 0x08, 0x4B, 0x31, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, \n0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x65, 0xF7, 0x1C, 0x4B, 0x1C, 0x02, \n0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x47, 0x97, 0x24, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0x04, 0x00, 0x18, \n0x54, 0x15, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x09, 0xD5, \n0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, \n0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0A, 0x92, \n0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, \n0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x09, 0x93, \n0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, 0x08, 0x10, \n0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, \n0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, \n0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, \n0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, \n0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, \n0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, \n0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, \n0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, \n0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, \n0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, 0x00, 0x18, 0x41, 0x22, \n0x00, 0x18, 0xF4, 0x3A, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0x08, 0x22, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, 0x04, 0x6A, 0x04, 0xD2, \n0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, 0x07, 0x11, 0x0F, 0x92, \n0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, \n0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, 0x03, 0x92, 0x13, 0x22, \n0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x9D, 0x67, 0x67, 0xA4, \n0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, \n0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x62, 0x6B, 0x6E, 0xEA, \n0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, \n0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, 0x40, 0x82, 0x9D, 0x67, \n0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, \n0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, \n0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, \n0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, \n0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, \n0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, 0x41, 0x2A, 0x0F, 0x92, \n0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, \n0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x42, 0xCC, 0x0F, 0x92, \n0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, \n0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, 0x62, 0xAA, 0x04, 0x92, \n0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, \n0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, \n0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, \n0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x3E, 0x10, \n0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x01, 0x4A, \n0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, 0x00, 0xD2, 0x0F, 0x92, \n0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, \n0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, 0x04, 0x92, 0x66, 0xEA, \n0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, \n0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, \n0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, \n0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x08, 0x02, 0x07, 0xD2, \n0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, \n0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0xF1, 0x2A, \n0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x40, 0x82, \n0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, 0x60, 0xC2, 0x06, 0x93, \n0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x07, 0xD5, 0x08, 0xD6, \n0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x40, 0xA2, \n0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, \n0x41, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, \n0x08, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, \n0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, 0x02, 0x92, 0x02, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x45, 0xC4, 0x7D, 0x67, \n0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, \n0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x7C, 0x33, 0xAE, 0xA2, \n0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, \n0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAE, 0xA2, \n0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, 0x45, 0xA4, 0x80, 0xF0, \n0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, 0x00, 0x93, 0x44, 0xC3, \n0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, \n0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, \n0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, 0x0D, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, \n0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, 0x6C, 0xEA, 0x53, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, \n0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, 0x9D, 0x67, 0x46, 0xA4, \n0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, \n0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, 0x6D, 0xE4, 0x60, 0xA3, \n0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0x7D, 0x67, 0x44, 0xA3, \n0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, \n0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, \n0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x50, 0xA3, \n0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0xE3, 0x2A, \n0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x16, 0x33, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, \n0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x00, 0x6A, 0x9D, 0x67, \n0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, 0x7D, 0x67, 0x57, 0xA3, \n0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, 0x01, 0x4A, 0xBD, 0x67, \n0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, \n0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x53, 0xA5, \n0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x57, 0xC5, \n0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x0F, 0x5A, 0x58, 0x67, 0x10, 0x22, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7F, 0xC2, 0x07, 0x10, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7F, 0xC2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x50, 0x32, 0x7D, 0x67, 0x50, 0xC3, \n0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, 0x43, 0x67, 0x48, 0x32, \n0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x73, 0xA4, 0xBD, 0x67, \n0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x0F, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, 0x51, 0xA5, 0x4D, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, \n0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6F, 0xE2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, 0x00, 0x6A, 0x7D, 0x67, \n0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, \n0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, \n0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x76, 0xA5, 0x9D, 0x67, \n0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x61, 0x42, 0xFF, 0xF7, \n0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x56, 0xC5, \n0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, \n0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, \n0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x5A, 0x58, 0x67, \n0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, 0x06, 0x94, \n0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0xBD, 0x67, 0x57, 0xA5, 0x01, 0x4A, \n0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, 0x43, 0xEB, 0x58, 0x67, \n0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, \n0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x0F, 0x6A, \n0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x56, 0xC4, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, 0x45, 0xA2, 0x7D, 0x67, \n0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, 0x04, 0x92, 0x20, 0xF0, \n0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, \n0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x70, 0x9A, 0x09, 0xD3, 0x62, 0x67, \n0xC0, 0xF7, 0x10, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0xC0, 0xF7, 0x10, 0x4A, 0x48, 0xA2, 0x9D, 0x67, \n0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x7C, 0x9A, 0x0C, 0xD3, 0x62, 0x67, \n0xC0, 0xF7, 0x1C, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0xC0, 0xF7, 0x1C, 0x4A, 0x48, 0xA2, 0xBD, 0x67, \n0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, \n0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, \n0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, \n0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, \n0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, \n0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0xA3, 0xF1, 0x7C, 0xA3, 0x04, 0x04, 0x49, 0xE4, \n0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, \n0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, \n0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, \n0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, 0x7D, 0x67, 0x40, 0xF0, \n0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, \n0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, \n0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, \n0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, \n0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, \n0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, \n0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, \n0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, \n0x03, 0xF2, 0x70, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, \n0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, \n0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, \n0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, 0x8E, 0xEA, 0x5D, 0x2A, \n0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, \n0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, \n0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, \n0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, \n0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, \n0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, \n0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x63, 0xF2, 0x64, 0xA3, 0x04, 0x04, 0x49, 0xE4, \n0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, \n0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, \n0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, \n0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, 0x09, 0x63, 0x00, 0xEF, \n0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, \n0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x7D, 0x67, \n0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF2, 0x24, 0x89, 0x10, 0x0A, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x0A, 0x92, 0x04, 0x4A, \n0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0x0A, 0x92, 0x03, 0x4A, \n0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x4B, 0xCB, \n0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF6, \n0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA3, 0xF1, \n0x7C, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF6, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, \n0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE4, 0x03, 0xF2, 0x70, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x09, 0x6B, 0x6E, 0xEA, \n0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, \n0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x64, 0xC2, 0x20, 0x10, 0x7D, 0x67, 0x59, 0xA3, \n0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x54, 0xC3, 0x28, 0xF3, \n0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x50, 0x9A, 0x04, 0xD2, \n0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF7, \n0x1C, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x09, 0x97, 0x05, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, \n0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, \n0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x74, 0x33, \n0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, \n0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, \n0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, \n0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, \n0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, \n0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, 0x7D, 0x67, 0x55, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x3E, 0x3B, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, 0x5A, 0xA2, 0x62, 0x67, \n0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, 0xAC, 0xEA, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xDE, 0x2F, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x08, 0x92, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7B, 0xC2, 0x08, 0x92, \n0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7C, 0xC2, \n0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x08, 0x92, \n0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7A, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x58, 0xA2, 0xA2, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5A, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x40, 0xF7, 0x08, 0x4C, \n0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x34, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x6B, \n0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x01, 0x6B, 0x6B, 0xEB, 0xA3, 0xF2, 0x7A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA3, 0xF2, 0x58, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, \n0x59, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x60, 0xF7, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0x08, 0x92, 0x02, 0x4A, \n0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, \n0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x72, 0xA4, \n0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, \n0xC3, 0xF2, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, \n0xC3, 0xF2, 0x62, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, 0xCB, 0x2B, 0x30, 0xF0, \n0x20, 0x6A, 0x80, 0xF7, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, 0x40, 0xA2, 0x7D, 0x67, \n0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x0C, 0x92, 0x02, 0x4A, \n0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x0B, 0x10, 0x7D, 0x67, \n0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, \n0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0xF0, 0x2A, 0x5D, 0x67, \n0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x53, 0xA3, \n0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x3E, 0x2A, \n0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, \n0x70, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0x62, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA5, 0xF4, 0x50, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, \n0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA5, 0xF4, 0x70, 0xDA, 0xDF, 0x11, 0x5D, 0x67, 0x71, 0xA2, \n0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, \n0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, \n0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, \n0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, \n0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, \n0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, \n0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, \n0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, \n0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x7D, 0x67, \n0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, 0x7D, 0x67, 0x53, 0xA3, \n0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x5D, 0x67, \n0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, \n0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, \n0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, 0x52, 0xA3, \n0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, \n0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, \n0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x54, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, \n0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, \n0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x06, 0x10, 0x04, 0x6A, \n0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, \n0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, \n0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, 0x78, 0x67, 0x2F, 0x23, \n0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, \n0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xCC, 0x23, 0x22, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, \n0xED, 0x25, 0x1D, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x38, 0x24, 0x18, 0x10, 0x07, 0x92, \n0x82, 0x67, 0x00, 0x18, 0x9C, 0x25, 0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x3C, 0x26, \n0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x89, 0x26, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, \n0x00, 0x18, 0xA9, 0x26, 0x04, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xAC, 0x1F, 0x05, 0x97, \n0x03, 0x63, 0x00, 0xEF, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, \n0x58, 0x67, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, \n0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x40, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, \n0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, \n0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, \n0x40, 0xA4, 0x60, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, \n0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, \n0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0xFF, 0x6A, \n0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, \n0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, \n0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, \n0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, \n0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, \n0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, \n0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, \n0x54, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, \n0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x0C, 0xF0, \n0x18, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, \n0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, \n0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, \n0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, \n0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, \n0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, \n0x00, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, \n0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, \n0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, \n0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, \n0x7D, 0x67, 0x54, 0xA3, 0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, \n0x80, 0xF4, 0x10, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, \n0x80, 0xF4, 0x18, 0x6A, 0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, \n0x1C, 0x6A, 0x7D, 0x67, 0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, \n0x04, 0x6A, 0x7D, 0x67, 0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, \n0x56, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, \n0x49, 0xE3, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x46, 0xF2, 0x08, 0x4A, 0x01, 0xD2, 0x9D, 0x67, \n0x55, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, \n0x0C, 0x22, 0xA0, 0xF5, 0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, \n0x6E, 0xEA, 0x80, 0xF4, 0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, \n0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, \n0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, \n0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, \n0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, \n0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, \n0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, \n0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, \n0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, \n0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, \n0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, \n0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x10, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, \n0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, \n0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, \n0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, \n0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, \n0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, \n0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, \n0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, \n0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, \n0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, \n0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, \n0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, \n0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, \n0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, \n0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, \n0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, \n0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, \n0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x66, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, \n0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, \n0x60, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, \n0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, \n0x61, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, \n0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, \n0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, \n0x62, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, \n0x0B, 0x10, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, \n0x0B, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, \n0x60, 0xC2, 0x0C, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, \n0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, \n0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, \n0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, \n0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, \n0x61, 0xA3, 0x60, 0xC2, 0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x15, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, \n0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, \n0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, \n0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, \n0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, \n0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, \n0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, \n0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, \n0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, \n0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, \n0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, \n0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, \n0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, \n0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, \n0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, \n0x6C, 0xAB, 0x60, 0xDA, 0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, \n0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, \n0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x13, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, \n0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, \n0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, \n0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, \n0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, \n0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, \n0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, \n0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, \n0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, \n0x44, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, \n0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, \n0x0F, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, \n0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, \n0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, \n0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, \n0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, \n0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, \n0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, \n0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, \n0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, \n0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, \n0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, \n0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, \n0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, \n0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, \n0x60, 0xA3, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x42, 0xA2, 0x7D, 0x67, 0x54, 0xC3, \n0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, \n0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, \n0x41, 0xA2, 0x02, 0x6B, 0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, \n0x6E, 0xEA, 0x0A, 0x22, 0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, \n0x6E, 0xEA, 0x40, 0xF1, 0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, \n0x7D, 0x67, 0x58, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, \n0x5B, 0xC3, 0x04, 0x92, 0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, \n0x6E, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, \n0x45, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x04, 0x92, 0x4E, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, \n0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, \n0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x13, 0x11, 0x0C, 0x6A, \n0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, \n0x04, 0x92, 0x44, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, \n0x04, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x5E, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, \n0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, \n0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, \n0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, \n0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, \n0x81, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, \n0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, \n0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, \n0x04, 0x92, 0x20, 0xF0, 0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, \n0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, \n0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, \n0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, \n0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, \n0x4C, 0xAA, 0x62, 0x67, 0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, \n0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, \n0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF0, 0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, \n0x08, 0x4A, 0x41, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, \n0x00, 0x18, 0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, \n0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, \n0x7D, 0x67, 0x4C, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, \n0x40, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, \n0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, \n0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, \n0xD8, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, \n0x40, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, \n0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, \n0x20, 0xF0, 0x43, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, \n0x49, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, \n0x47, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x45, 0xC3, 0x07, 0x92, 0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, \n0x07, 0x92, 0x41, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, \n0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, \n0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, \n0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, \n0x44, 0xA6, 0x02, 0x6B, 0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, \n0x10, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, \n0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, \n0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, \n0x44, 0xA5, 0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, \n0x49, 0xE4, 0x40, 0xAA, 0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, \n0x6C, 0xCA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x10, 0x22, \n0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, \n0x16, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, \n0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, \n0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, \n0x20, 0xF0, 0x68, 0xA6, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, \n0x7D, 0x67, 0x20, 0xF0, 0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB4, 0x2C, \n0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, \n0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, \n0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x30, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, \n0x65, 0xA2, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, \n0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, \n0x78, 0x33, 0xAF, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, \n0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, \n0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF1, 0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, \n0x7A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, \n0x49, 0xE4, 0x40, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, \n0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, \n0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, \n0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, \n0x20, 0xF0, 0x58, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x44, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x48, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, \n0xE0, 0xF0, 0x02, 0x2A, 0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0xC0, 0xF0, 0x1D, 0x2A, 0x9D, 0x67, \n0x20, 0xF0, 0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, \n0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, \n0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, \n0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, \n0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, \n0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF0, \n0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, \n0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, \n0x81, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x65, 0x6C, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, \n0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, \n0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, \n0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, \n0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, \n0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, \n0xA1, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x35, 0x10, 0x9D, 0x67, \n0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, \n0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, \n0x20, 0x6B, 0xA1, 0xF0, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x1C, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, \n0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, \n0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, \n0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, \n0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, \n0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, \n0x4C, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, \n0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, \n0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, \n0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, \n0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, \n0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, \n0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, \n0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, \n0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, \n0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, \n0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, \n0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, \n0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, \n0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, \n0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, \n0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, \n0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, \n0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, \n0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, \n0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, \n0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, \n0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, \n0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, \n0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, \n0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, \n0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, \n0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, \n0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x12, 0x2E, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, \n0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, \n0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, \n0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, \n0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, \n0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, \n0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, \n0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, \n0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, \n0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, \n0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, \n0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, \n0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, \n0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, \n0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, \n0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, \n0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, \n0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, \n0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, \n0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, \n0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, \n0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, \n0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, \n0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, \n0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, \n0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, \n0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, \n0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, \n0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, \n0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, \n0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, \n0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, \n0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, \n0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, \n0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, \n0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, \n0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, \n0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, \n0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, \n0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, \n0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, \n0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, \n0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, \n0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, \n0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, \n0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, \n0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, \n0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, \n0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, \n0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, \n0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, \n0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, \n0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, \n0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, \n0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, \n0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, \n0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, \n0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, \n0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, \n0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, \n0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, \n0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, \n0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, \n0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, \n0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, \n0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, \n0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, \n0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, \n0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, \n0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, \n0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, \n0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, \n0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, \n0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, \n0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, \n0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, \n0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, \n0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, \n0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, \n0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, \n0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, \n0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x5D, 0x67, \n0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, \n0x20, 0x6C, 0xC1, 0xF0, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, \n0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, \n0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, \n0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, \n0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, \n0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, \n0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, \n0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, \n0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, \n0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, \n0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, \n0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, \n0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, \n0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, \n0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, \n0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, \n0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, \n0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, \n0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, \n0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, \n0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, \n0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, \n0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, \n0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, \n0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, \n0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, \n0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, \n0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, \n0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, \n0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, \n0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, \n0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, \n0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, \n0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, \n0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, \n0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, \n0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, \n0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, \n0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, \n0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, \n0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, \n0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, \n0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x04, 0x92, 0xDD, 0x67, \n0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, \n0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, \n0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, \n0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, \n0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, \n0x00, 0x18, 0x6A, 0x0B, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, \n0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, \n0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, \n0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, \n0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, \n0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, \n0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, \n0xB9, 0x2C, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, \n0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, \n0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, \n0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, \n0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, \n0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, \n0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, \n0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xD9, 0x32, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, \n0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, \n0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, \n0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, \n0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, \n0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, \n0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, \n0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, \n0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, \n0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, \n0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, \n0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, \n0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, \n0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, \n0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, \n0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, \n0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, \n0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, \n0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, \n0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, \n0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, \n0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, \n0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0x19, 0x30, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, \n0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, \n0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, \n0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, \n0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, \n0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, \n0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, \n0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, \n0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, \n0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, \n0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, 0x20, 0xF0, \n0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, \n0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, \n0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, \n0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, \n0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, \n0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, \n0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, \n0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, \n0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, \n0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, \n0x41, 0xF4, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, \n0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, \n0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, \n0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, \n0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, \n0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, \n0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x7D, 0x67, \n0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, \n0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, \n0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, \n0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, \n0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, \n0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, \n0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, \n0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, \n0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, \n0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0x72, 0x30, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, \n0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, \n0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, \n0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, \n0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, \n0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, \n0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, \n0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, \n0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, \n0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, \n0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, \n0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, \n0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, \n0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, \n0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, \n0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, \n0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, \n0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, \n0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, \n0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, \n0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x00, 0x65, 0x0B, 0x97, \n0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, \n0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, \n0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, \n0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, \n0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, \n0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x07, 0x97, \n0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, \n0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, \n0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, \n0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, \n0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, \n0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, \n0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, \n0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x00, 0x4A, 0x49, 0xE3, 0x40, 0x9A, \n0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, \n0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, \n0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, \n0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, \n0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, \n0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, \n0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, \n0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, \n0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, \n0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0xE0, 0xF7, 0x18, 0x4A, \n0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, \n0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, \n0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, \n0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, \n0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, \n0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, \n0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, \n0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, \n0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, \n0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, \n0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, \n0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, \n0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, \n0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, \n0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, \n0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, \n0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, \n0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, \n0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, \n0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, \n0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, \n0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, \n0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, \n0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, \n0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, \n0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x04, 0x92, 0x9D, 0x67, \n0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, \n0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, \n0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x70, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, \n0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, \n0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, \n0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC6, 0xF4, \n0x08, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, \n0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, \n0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, \n0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, \n0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, \n0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, \n0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, \n0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, \n0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, \n0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, \n0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, \n0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, \n0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, \n0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, \n0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, \n0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, \n0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, \n0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, \n0x00, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, \n0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, \n0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, \n0x00, 0x18, 0x6A, 0x0B, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, \n0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, \n0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, \n0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, \n0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, \n0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, \n0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, \n0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, \n0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, \n0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x08, 0x4B, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0xC6, 0xF4, \n0x08, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0x30, 0x04, \n0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x23, 0xF7, 0x50, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, \n0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, \n0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, \n0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, \n0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, \n0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, \n0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, \n0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, \n0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, \n0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, \n0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, \n0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, \n0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, \n0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, \n0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x73, 0x34, 0x7D, 0x67, \n0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, \n0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, \n0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, \n0x00, 0x18, 0x64, 0x2E, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, \n0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, \n0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, \n0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x54, 0x9A, 0x06, 0x93, \n0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, \n0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0xED, 0x12, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x14, 0x4A, 0x82, 0x67, \n0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, \n0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x40, 0xA2, 0xBD, 0x67, \n0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, \n0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0xBE, 0x12, 0x0E, 0x92, \n0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, \n0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, \n0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, \n0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, \n0x20, 0x6A, 0x41, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9D, 0x67, 0x40, 0xF0, \n0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, \n0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, \n0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, \n0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, \n0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, \n0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, \n0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, \n0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, \n0x00, 0x18, 0x5B, 0x31, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x40, 0xF0, \n0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x1E, 0x12, 0x13, 0x93, \n0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, \n0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, \n0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x04, 0x4B, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF1, 0x14, 0x4A, \n0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, \n0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, \n0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, \n0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, \n0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, \n0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, \n0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, \n0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, \n0x20, 0x6A, 0xC1, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9E, 0x11, 0x06, 0x92, \n0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, \n0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, \n0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, \n0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, \n0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, \n0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, \n0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, \n0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, \n0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, \n0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, \n0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, \n0x00, 0x18, 0xB9, 0x2C, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, \n0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, \n0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, \n0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, \n0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, \n0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, \n0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, \n0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, \n0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, \n0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, \n0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, \n0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x44, 0xA2, \n0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, \n0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, \n0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x03, 0xF2, 0x50, 0xA2, 0x43, 0xEB, 0x58, 0x67, \n0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, \n0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, \n0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x06, 0x92, \n0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, \n0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, \n0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, \n0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x18, 0x4A, \n0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, \n0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, \n0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, \n0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x06, 0x92, \n0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, \n0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF1, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0xBA, 0x28, 0x30, 0xF0, \n0x20, 0x6A, 0x01, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x40, 0xF0, \n0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, \n0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, \n0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, \n0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, \n0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, \n0xC2, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, \n0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, \n0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, \n0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, \n0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, \n0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, \n0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, \n0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0xA5, 0xF4, 0x70, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x01, 0x6B, 0x6B, 0xEB, 0xA5, 0xF4, 0x70, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, \n0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, \n0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, \n0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, \n0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, \n0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, \n0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, \n0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, \n0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, \n0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, \n0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, \n0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, \n0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, \n0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, \n0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, \n0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, \n0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, \n0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, \n0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, \n0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, \n0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, \n0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, \n0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, \n0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x16, 0x13, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, \n0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, \n0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, \n0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, \n0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, \n0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, \n0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, \n0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x76, 0x12, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, \n0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, \n0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x47, 0x12, 0x9D, 0x67, \n0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, \n0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, \n0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, \n0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, \n0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, \n0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, \n0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, \n0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, \n0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, \n0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xC7, 0x10, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, \n0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, \n0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, \n0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, \n0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, \n0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, \n0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, \n0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, \n0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, \n0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, \n0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, \n0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, \n0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, \n0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, \n0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, \n0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, \n0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, \n0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, \n0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, \n0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, \n0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, \n0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, \n0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, \n0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, \n0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, \n0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, \n0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, \n0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, \n0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5C, 0xA2, \n0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, \n0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, \n0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, \n0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, \n0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, \n0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, \n0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, \n0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, \n0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, \n0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, \n0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, \n0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, \n0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, \n0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, \n0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, \n0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, \n0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, \n0x5D, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, \n0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x5E, 0xA3, 0x56, 0x2A, \n0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4A, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, \n0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x30, 0x22, \n0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2B, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, \n0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, \n0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x0B, 0x2A, 0x7D, 0x67, \n0x20, 0xF0, 0x40, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, \n0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, \n0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0xB0, 0x22, 0x02, 0x11, 0x7D, 0x67, 0x5E, 0xA3, \n0xE0, 0xF0, 0x1E, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0xE0, 0xF0, 0x18, 0x22, \n0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xEC, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, \n0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, \n0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0xC0, 0xF0, \n0x11, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, 0x0B, 0x2A, 0xBD, 0x67, \n0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x50, 0xA2, 0x7D, 0x67, \n0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, \n0x20, 0x6A, 0xC6, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, \n0x00, 0x18, 0x30, 0x04, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, 0x20, 0xF0, 0x82, 0xA5, \n0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, \n0x64, 0x2E, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x09, 0xE2, 0x20, 0xF0, \n0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x29, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, \n0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, \n0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, 0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0x41, 0xF2, \n0x04, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, \n0x5E, 0xA3, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, 0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, \n0x61, 0xF2, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, \n0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, \n0x51, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, \n0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, \n0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, \n0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, \n0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, \n0x20, 0xF0, 0x42, 0xA3, 0x27, 0x2A, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xCF, 0x37, 0x7D, 0x67, \n0x5F, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, \n0xB6, 0x23, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, \n0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, \n0x42, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x0D, 0x22, \n0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, \n0x81, 0xF2, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x7E, 0xA5, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, \n0x00, 0x18, 0xCF, 0x37, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, \n0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5D, 0xA2, 0x61, 0x42, \n0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7D, 0xC2, \n0x1A, 0x10, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, \n0x81, 0xF2, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, \n0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, \n0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x49, 0xA2, 0x61, 0x42, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x49, 0xA2, 0x02, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF5, \n0x69, 0xC2, 0x00, 0x18, 0xDF, 0x34, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, \n0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, \n0x18, 0x10, 0x5D, 0x67, 0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, \n0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, \n0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, \n0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x61, 0xA2, \n0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, \n0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, \n0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, \n0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, \n0x7D, 0x67, 0x41, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, \n0x58, 0x67, 0x7F, 0xF7, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, \n0xA5, 0xF4, 0x70, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, \n0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, \n0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, \n0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, \n0x5D, 0x67, 0x68, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, \n0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, \n0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, 0x5D, 0x67, \n0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, \n0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, \n0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, \n0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, \n0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x49, 0xE3, \n0x40, 0xA2, 0xDD, 0x67, 0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x3F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, \n0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, \n0x6C, 0xEA, 0x56, 0x32, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, \n0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, \n0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, \n0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, \n0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, \n0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, \n0x4C, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0xE2, 0x60, 0xF5, 0x57, 0xA2, \n0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, \n0x55, 0xA4, 0x37, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, \n0x6D, 0xE2, 0xA5, 0xF1, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, \n0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, 0xA5, 0xF1, 0x70, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, \n0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA5, 0xF1, 0x70, 0xA2, 0x9D, 0x67, 0x56, 0xA4, \n0x30, 0xF0, 0x20, 0x6C, 0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, \n0x60, 0xF5, 0x5B, 0xA2, 0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, \n0x01, 0x6D, 0x00, 0x18, 0xEB, 0x30, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, \n0xB9, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE2, \n0x25, 0xF2, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, \n0x18, 0x4C, 0x89, 0xE2, 0x25, 0xF2, 0x70, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x25, 0xF2, 0x50, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, \n0x80, 0xF0, 0x17, 0x2A, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xEB, 0x30, \n0x7D, 0x67, 0x56, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, \n0xFF, 0x6B, 0x4C, 0xEB, 0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, \n0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, \n0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, \n0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, \n0xA1, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, \n0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, \n0xBD, 0x67, 0xF5, 0xA5, 0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, \n0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x34, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x80, 0x9A, \n0xBD, 0x67, 0x54, 0xA5, 0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, \n0xC9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, \n0x80, 0xDA, 0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, \n0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x70, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, \n0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x23, 0xF7, 0x70, 0xC2, \n0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, \n0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, \n0x53, 0xA6, 0x49, 0xE5, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4C, 0x88, 0x34, \n0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, \n0x01, 0x10, 0x00, 0x65, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x01, 0x14, 0x00, 0x00, \n0xEC, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n};\nu4Byte ArrayLength_MP_8814A_FW_NIC = 66904;\n\n\nvoid\nODM_ReadFirmware_MP_8814A_FW_NIC(\n     IN   PDM_ODM_T    pDM_Odm,\n     OUT  u1Byte       *pFirmware,\n     OUT  u4Byte       *pFirmwareSize\n)\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n     *((SIZE_PTR*)pFirmware) = (SIZE_PTR)Array_MP_8814A_FW_NIC;\n#else\n     ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8814A_FW_NIC, ArrayLength_MP_8814A_FW_NIC);\n#endif\n     *pFirmwareSize = ArrayLength_MP_8814A_FW_NIC;\n}\n\n\n\n#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP)\n\n\n#endif // end of HWIMG_SUPPORT\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_fw.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n#if (RTL8814A_SUPPORT == 1)\n#ifndef __INC_MP_FW_HW_IMG_8814A_H\n#define __INC_MP_FW_HW_IMG_8814A_H\n\n\n/******************************************************************************\n*                           FW_AP.TXT\n******************************************************************************/\n\nvoid\nODM_ReadFirmware_MP_8814A_FW_AP(\n     IN   PDM_ODM_T    pDM_Odm,\n     OUT  u1Byte       *pFirmware,\n     OUT  u4Byte       *pFirmwareSize\n);\nu4Byte ODM_GetVersion_MP_8814A_FW_AP(void);\n\n/******************************************************************************\n*                           FW_NIC.TXT\n******************************************************************************/\n\nvoid\nODM_ReadFirmware_MP_8814A_FW_NIC(\n     IN   PDM_ODM_T    pDM_Odm,\n     OUT  u1Byte       *pFirmware,\n     OUT  u4Byte       *pFirmwareSize\n);\nu4Byte ODM_GetVersion_MP_8814A_FW_NIC(void);\n\n#endif\n#endif // end of HWIMG_SUPPORT\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_mac.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\nstatic BOOLEAN\nCheckPositive(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2,\n\tIN\tconst u4Byte  Condition3,\n\tIN\tconst u4Byte  Condition4\n)\n{\n\tu1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA*/ \n\t\t\t\t((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */\n\t\t\t\t((pDM_Odm->BoardType & BIT2) >> 2) << 4;  /* _BT*/  \n\n\tu4Byte\tcond1   = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4;\n\tu4Byte    driver1 = pDM_Odm->CutVersion       << 24 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0xF0) << 16 | \n\t\t\t\tpDM_Odm->SupportPlatform  << 16 | \n\t\t\t\tpDM_Odm->PackageType      << 12 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0x0F) << 8  |\n\t\t\t\t_BoardType;\n\n\tu4Byte    driver2 = (pDM_Odm->TypeGLNA & 0xFF) <<  0 |  \n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF)  <<  8 | \n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF) << 16 | \n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF)  << 24; \n\nu4Byte    driver3 = 0;\n\n\tu4Byte    driver4 = (pDM_Odm->TypeGLNA & 0xFF00) >>  8 |\n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF00) |\n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF00) << 8 |\n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF00)  << 16;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\\n\", cond1, cond2, cond3, cond4));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\\n\", driver1, driver2, driver3, driver4));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Platform, Interface) = (0x%X, 0x%X)\\n\", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Board, Package) = (0x%X, 0x%X)\\n\", pDM_Odm->BoardType, pDM_Odm->PackageType));\n\n\n\t/*============== Value Defined Check ===============*/\n\t/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/\n\t\n\tif (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\n\t\treturn FALSE;\n\tif (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\n\t\treturn FALSE;\n\n\t/*=============== Bit Defined Check ================*/\n\t/* We don't care [31:28] */\n\n\tcond1   &= 0x00FF0FFF; \n\tdriver1 &= 0x00FF0FFF; \n\n\tif ((cond1 & driver1) == cond1) {\n\t\tu4Byte bitMask = 0;\n\n\t\tif ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/\n\t\t\treturn TRUE;\n\n\t\tif ((cond1 & BIT0) != 0) /*GLNA*/\n\t\t\tbitMask |= 0x000000FF;\n\t\tif ((cond1 & BIT1) != 0) /*GPA*/\n\t\t\tbitMask |= 0x0000FF00;\n\t\tif ((cond1 & BIT2) != 0) /*ALNA*/\n\t\t\tbitMask |= 0x00FF0000;\n\t\tif ((cond1 & BIT3) != 0) /*APA*/\n\t\t\tbitMask |= 0xFF000000;\n\n\t\tif (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask)))  /* BoardType of each RF path is matched*/\n\t\t\treturn TRUE;\n\t\telse\n\t\t\treturn FALSE;\n\t} else\n\t\treturn FALSE;\n}\nstatic BOOLEAN\nCheckNegative(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2\n)\n{\n\treturn TRUE;\n}\n\n/******************************************************************************\n*                           MAC_REG.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_MAC_REG[] = { \n\t\t0x010, 0x0000007C,\n\t\t0x014, 0x000000DB,\n\t\t0x016, 0x00000002,\n\t\t0x073, 0x00000010,\n\t\t0x420, 0x00000080,\n\t\t0x421, 0x0000000F,\n\t\t0x428, 0x0000000A,\n\t\t0x429, 0x00000010,\n\t\t0x430, 0x00000000,\n\t\t0x431, 0x00000000,\n\t\t0x432, 0x00000000,\n\t\t0x433, 0x00000001,\n\t\t0x434, 0x00000004,\n\t\t0x435, 0x00000005,\n\t\t0x436, 0x00000007,\n\t\t0x437, 0x00000008,\n\t\t0x43C, 0x00000004,\n\t\t0x43D, 0x00000005,\n\t\t0x43E, 0x00000007,\n\t\t0x43F, 0x00000008,\n\t\t0x440, 0x0000005D,\n\t\t0x441, 0x00000001,\n\t\t0x442, 0x00000000,\n\t\t0x444, 0x00000010,\n\t\t0x445, 0x000000F0,\n\t\t0x446, 0x00000001,\n\t\t0x447, 0x000000FE,\n\t\t0x448, 0x00000000,\n\t\t0x449, 0x00000000,\n\t\t0x44A, 0x00000000,\n\t\t0x44B, 0x00000040,\n\t\t0x44C, 0x00000010,\n\t\t0x44D, 0x000000F0,\n\t\t0x44E, 0x0000003F,\n\t\t0x44F, 0x00000000,\n\t\t0x450, 0x00000000,\n\t\t0x451, 0x00000000,\n\t\t0x452, 0x00000000,\n\t\t0x453, 0x00000040,\n\t\t0x45E, 0x00000004,\n\t\t0x49C, 0x00000010,\n\t\t0x49D, 0x000000F0,\n\t\t0x49E, 0x00000000,\n\t\t0x49F, 0x00000006,\n\t\t0x4A0, 0x000000E0,\n\t\t0x4A1, 0x00000003,\n\t\t0x4A2, 0x00000000,\n\t\t0x4A3, 0x00000040,\n\t\t0x4A4, 0x00000015,\n\t\t0x4A5, 0x000000F0,\n\t\t0x4A6, 0x00000000,\n\t\t0x4A7, 0x00000006,\n\t\t0x4A8, 0x000000E0,\n\t\t0x4A9, 0x00000000,\n\t\t0x4AA, 0x00000000,\n\t\t0x4AB, 0x00000000,\n\t\t0x7DA, 0x00000008,\n\t\t0x1448, 0x00000006,\n\t\t0x144A, 0x00000006,\n\t\t0x144C, 0x00000006,\n\t\t0x144E, 0x00000006,\n\t\t0x4C8, 0x000000FF,\n\t\t0x4C9, 0x00000008,\n\t\t0x4CA, 0x0000003C,\n\t\t0x4CB, 0x0000003C,\n\t\t0x4CC, 0x000000FF,\n\t\t0x4CD, 0x000000FF,\n\t\t0x4CE, 0x00000001,\n\t\t0x4CF, 0x00000008,\n\t\t0x500, 0x00000026,\n\t\t0x501, 0x000000A2,\n\t\t0x502, 0x0000002F,\n\t\t0x503, 0x00000000,\n\t\t0x504, 0x00000028,\n\t\t0x505, 0x000000A3,\n\t\t0x506, 0x0000005E,\n\t\t0x507, 0x00000000,\n\t\t0x508, 0x0000002B,\n\t\t0x509, 0x000000A4,\n\t\t0x50A, 0x0000005E,\n\t\t0x50B, 0x00000000,\n\t\t0x50C, 0x0000004F,\n\t\t0x50D, 0x000000A4,\n\t\t0x50E, 0x00000000,\n\t\t0x50F, 0x00000000,\n\t\t0x512, 0x0000001C,\n\t\t0x514, 0x0000000A,\n\t\t0x516, 0x0000000A,\n\t\t0x521, 0x0000002F,\n\t\t0x525, 0x0000004F,\n\t\t0x550, 0x00000010,\n\t\t0x551, 0x00000010,\n\t\t0x559, 0x00000002,\n\t\t0x55C, 0x00000064,\n\t\t0x55D, 0x000000FF,\n\t\t0x577, 0x00000003,\n\t\t0x5BE, 0x00000064,\n\t\t0x604, 0x00000001,\n\t\t0x605, 0x00000030,\n\t\t0x607, 0x00000001,\n\t\t0x608, 0x0000000E,\n\t\t0x609, 0x0000002A,\n\t\t0x60A, 0x00000000,\n\t\t0x60C, 0x00000018,\n\t\t0x60D, 0x00000050,\n\t\t0x6A0, 0x000000FF,\n\t\t0x6A1, 0x000000FF,\n\t\t0x6A2, 0x000000FF,\n\t\t0x6A3, 0x000000FF,\n\t\t0x6A4, 0x000000FF,\n\t\t0x6A5, 0x000000FF,\n\t\t0x6DE, 0x00000084,\n\t\t0x620, 0x000000FF,\n\t\t0x621, 0x000000FF,\n\t\t0x622, 0x000000FF,\n\t\t0x623, 0x000000FF,\n\t\t0x624, 0x000000FF,\n\t\t0x625, 0x000000FF,\n\t\t0x626, 0x000000FF,\n\t\t0x627, 0x000000FF,\n\t\t0x638, 0x00000064,\n\t\t0x63C, 0x0000000A,\n\t\t0x63D, 0x0000000A,\n\t\t0x63E, 0x0000000E,\n\t\t0x63F, 0x0000000E,\n\t\t0x640, 0x00000040,\n\t\t0x642, 0x00000040,\n\t\t0x643, 0x00000000,\n\t\t0x652, 0x000000C8,\n\t\t0x66E, 0x00000005,\n\t\t0x700, 0x00000021,\n\t\t0x701, 0x00000043,\n\t\t0x702, 0x00000065,\n\t\t0x703, 0x00000087,\n\t\t0x708, 0x00000021,\n\t\t0x709, 0x00000043,\n\t\t0x70A, 0x00000065,\n\t\t0x70B, 0x00000087,\n\t\t0x718, 0x00000040,\n\t\t0x7D5, 0x000000BC,\n\t\t0x7D8, 0x00000028,\n\t\t0x7D9, 0x00000000,\n\t\t0x7DA, 0x0000000B,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_MAC_REG(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_MAC_REG)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_MAC_REG;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_MAC_REG\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigMAC_8814A(pDM_Odm, v1, (u1Byte)v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_MAC_REG(void)\n{\n\t   return 85;\n}\n\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_mac.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#if (RTL8814A_SUPPORT == 1)\n#ifndef __INC_MP_MAC_HW_IMG_8814A_H\n#define __INC_MP_MAC_HW_IMG_8814A_H\n\n\n/******************************************************************************\n*                           MAC_REG.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_MAC_REG(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_MAC_REG(void);\n\n#endif\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_rf.c",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\nstatic BOOLEAN\nCheckPositive(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2,\n\tIN\tconst u4Byte  Condition3,\n\tIN\tconst u4Byte  Condition4\n)\n{\n\tu1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA*/ \n\t\t\t\t((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA*/\n\t\t\t\t((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */\n\t\t\t\t((pDM_Odm->BoardType & BIT2) >> 2) << 4;  /* _BT*/  \n\n\tu4Byte\tcond1   = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4;\n\tu4Byte    driver1 = pDM_Odm->CutVersion       << 24 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0xF0) << 16 | \n\t\t\t\tpDM_Odm->SupportPlatform  << 16 | \n\t\t\t\tpDM_Odm->PackageType      << 12 | \n\t\t\t\t(pDM_Odm->SupportInterface & 0x0F) << 8  |\n\t\t\t\t_BoardType;\n\n\tu4Byte    driver2 = (pDM_Odm->TypeGLNA & 0xFF) <<  0 |  \n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF)  <<  8 | \n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF) << 16 | \n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF)  << 24; \n\nu4Byte    driver3 = 0;\n\n\tu4Byte    driver4 = (pDM_Odm->TypeGLNA & 0xFF00) >>  8 |\n\t\t\t\t(pDM_Odm->TypeGPA & 0xFF00) |\n\t\t\t\t(pDM_Odm->TypeALNA & 0xFF00) << 8 |\n\t\t\t\t(pDM_Odm->TypeAPA & 0xFF00)  << 16;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\\n\", cond1, cond2, cond3, cond4));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\\n\", driver1, driver2, driver3, driver4));\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Platform, Interface) = (0x%X, 0x%X)\\n\", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \n\t(\"\t(Board, Package) = (0x%X, 0x%X)\\n\", pDM_Odm->BoardType, pDM_Odm->PackageType));\n\n\n\t/*============== Value Defined Check ===============*/\n\t/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/\n\t\n\tif (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\n\t\treturn FALSE;\n\tif (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\n\t\treturn FALSE;\n\n\t/*=============== Bit Defined Check ================*/\n\t/* We don't care [31:28] */\n\n\tcond1   &= 0x00FF0FFF; \n\tdriver1 &= 0x00FF0FFF; \n\n\tif ((cond1 & driver1) == cond1) {\n\t\tu4Byte bitMask = 0;\n\n\t\tif ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/\n\t\t\treturn TRUE;\n\n\t\tif ((cond1 & BIT0) != 0) /*GLNA*/\n\t\t\tbitMask |= 0x000000FF;\n\t\tif ((cond1 & BIT1) != 0) /*GPA*/\n\t\t\tbitMask |= 0x0000FF00;\n\t\tif ((cond1 & BIT2) != 0) /*ALNA*/\n\t\t\tbitMask |= 0x00FF0000;\n\t\tif ((cond1 & BIT3) != 0) /*APA*/\n\t\t\tbitMask |= 0xFF000000;\n\n\t\tif (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask)))  /* BoardType of each RF path is matched*/\n\t\t\treturn TRUE;\n\t\telse\n\t\t\treturn FALSE;\n\t} else\n\t\treturn FALSE;\n}\nstatic BOOLEAN\nCheckNegative(\n\tIN  PDM_ODM_T     pDM_Odm,\n\tIN  const u4Byte  Condition1,\n\tIN  const u4Byte  Condition2\n)\n{\n\treturn TRUE;\n}\n\n/******************************************************************************\n*                           RadioA.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_RadioA[] = { \n\t\t0x018, 0x00013124,\n\t\t0x040, 0x00000C00,\n\t\t0x058, 0x00000F98,\n\t\t0x07F, 0x00068004,\n\t\t0x0B0, 0x000FFFFE,\n\t\t0x0B1, 0x0003FF48,\n\t\t0x0B2, 0x0006AA3F,\n\t\t0x0B3, 0x000FFC9A,\n\t\t0x0B4, 0x0000A78F,\n\t\t0x0B5, 0x00000A3F,\n\t\t0x0B6, 0x0000C09C,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0B7, 0x00030008,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x0B7, 0x00030008,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x0B7, 0x00030008,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x0B7, 0x00030008,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x0B7, 0x00030008,\n\t0xA0000000,\t0x00000000,\n\t\t0x0B7, 0x0003000C,\n\t0xB0000000,\t0x00000000,\n\t\t0x0B8, 0x0007400E,\n\t\t0x0B9, 0x00008250,\n\t\t0x0BA, 0x00050780,\n\t\t0x0BB, 0x00000000,\n\t\t0x0BC, 0x00040009,\n\t\t0x0BD, 0x00000000,\n\t\t0x0BE, 0x00000000,\n\t\t0x0BF, 0x00000000,\n\t\t0x0EF, 0x00020000,\n\t\t0x03E, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03E, 0x00020000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03F, 0x00040000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03F, 0x00040000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03E, 0x00040000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03E, 0x00060000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03F, 0x00030000,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00010000,\n\t\t0x03E, 0x00000000,\n\t\t0x03F, 0x00006800,\n\t\t0x03E, 0x00000080,\n\t\t0x03F, 0x00006000,\n\t\t0x03E, 0x00000100,\n\t\t0x03F, 0x00004800,\n\t\t0x03E, 0x00000180,\n\t\t0x03F, 0x00004000,\n\t\t0x03E, 0x00000200,\n\t\t0x03F, 0x00004000,\n\t\t0x03E, 0x00000280,\n\t\t0x03F, 0x00002800,\n\t\t0x03E, 0x00000300,\n\t\t0x03F, 0x00002800,\n\t\t0x03E, 0x00000380,\n\t\t0x03F, 0x00002000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00040000,\n\t\t0x03E, 0x00000000,\n\t\t0x03F, 0x000000BC,\n\t\t0x03E, 0x00000040,\n\t\t0x03F, 0x00000053,\n\t\t0x03E, 0x00000050,\n\t\t0x03F, 0x00000050,\n\t\t0x03E, 0x00000060,\n\t\t0x03F, 0x00000050,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00000400,\n\t\t0x03E, 0x00000006,\n\t\t0x041, 0x000EE080,\n\t\t0x03E, 0x00000008,\n\t\t0x041, 0x000EE0C0,\n\t\t0x03E, 0x0000000A,\n\t\t0x041, 0x000EE100,\n\t\t0x03E, 0x0000000C,\n\t\t0x041, 0x000EE100,\n\t\t0x0EF, 0x00000000,\n\t\t0x018, 0x00000006,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t0xA0000000,\t0x00000000,\n\t\t0x086, 0x000E4B58,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x087, 0x00079F80,\n\t0xA0000000,\t0x00000000,\n\t\t0x087, 0x00049F80,\n\t0xB0000000,\t0x00000000,\n\t\t0x0DF, 0x00000008,\n\t\t0x0EF, 0x00002000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x000179C3,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x000179C3,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x0003F258,\n\t\t0x03B, 0x00030A58,\n\t\t0x03B, 0x0002FA58,\n\t\t0x03B, 0x00022590,\n\t\t0x03B, 0x0001FA50,\n\t\t0x03B, 0x00010248,\n\t\t0x03B, 0x00008240,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000100,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000ADF6,\n\t\t0x034, 0x00009DF3,\n\t\t0x034, 0x00008DF0,\n\t\t0x034, 0x00007DED,\n\t\t0x034, 0x00006DEA,\n\t\t0x034, 0x00005CED,\n\t\t0x034, 0x00004CEA,\n\t\t0x034, 0x000034EA,\n\t\t0x034, 0x000024E7,\n\t\t0x034, 0x0000146A,\n\t\t0x034, 0x0000006B,\n\t0xB0000000,\t0x00000000,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008ADF6,\n\t\t0x034, 0x00089DF3,\n\t\t0x034, 0x00088DF0,\n\t\t0x034, 0x00087DED,\n\t\t0x034, 0x00086DEA,\n\t\t0x034, 0x00085CED,\n\t\t0x034, 0x00084CEA,\n\t\t0x034, 0x000834EA,\n\t\t0x034, 0x000824E7,\n\t\t0x034, 0x0008146A,\n\t\t0x034, 0x0008006B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x000020A2,\n\t\t0x0DF, 0x00000080,\n\t\t0x035, 0x00000192,\n\t\t0x035, 0x00008192,\n\t\t0x035, 0x00010192,\n\t\t0x036, 0x00000024,\n\t\t0x036, 0x00008024,\n\t\t0x036, 0x00010024,\n\t\t0x036, 0x00018024,\n\t\t0x0EF, 0x00000000,\n\t\t0x051, 0x00000C21,\n\t\t0x052, 0x000006D9,\n\t\t0x053, 0x000FC649,\n\t\t0x054, 0x0000017E,\n\t\t0x018, 0x0001012A,\n\t\t0x081, 0x0007FC00,\n\t\t0x089, 0x00050110,\n\t\t0x08A, 0x00043E50,\n\t\t0x08B, 0x0002E180,\n\t\t0x08C, 0x00093C3C,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xA0000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x08D, 0x000FFFF0,\n\t0xA0000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00001000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00028000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00030023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00028623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00021633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0001C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00010293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00009593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0000078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x000AC000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00024000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x0004C000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00070023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00068623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00061633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0005C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00050293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00049593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0004078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00084000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x0008C000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00084000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00004000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B0023,\n\t0x80000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A8623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A1633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0009C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00090293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00089593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0008078B,\n\t\t0x03C, 0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00000800,\n\t\t0x03B, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000801,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00040000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001801,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000003,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000003,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00080000,\n\t\t0x03A, 0x00001802,\n\t\t0x0EF, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t\t0x03C, 0x00000000,\n\t\t0x03C, 0x00000400,\n\t\t0x03C, 0x00000800,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t\t0x0EF, 0x00000100,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A1AD,\n\t\t0x034, 0x000491AA,\n\t\t0x034, 0x000481A7,\n\t\t0x034, 0x000470AA,\n\t\t0x034, 0x000460A7,\n\t\t0x034, 0x00045049,\n\t\t0x034, 0x00044046,\n\t\t0x034, 0x00043026,\n\t\t0x034, 0x00042009,\n\t\t0x034, 0x00041006,\n\t\t0x034, 0x00040003,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3EF,\n\t\t0x034, 0x000493AF,\n\t\t0x034, 0x000483AB,\n\t\t0x034, 0x0004718C,\n\t\t0x034, 0x00046189,\n\t\t0x034, 0x0004506D,\n\t\t0x034, 0x0004406A,\n\t\t0x034, 0x0004302C,\n\t\t0x034, 0x00042029,\n\t\t0x034, 0x00041026,\n\t\t0x034, 0x00040023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3EF,\n\t\t0x034, 0x000493AF,\n\t\t0x034, 0x000483AB,\n\t\t0x034, 0x0004718C,\n\t\t0x034, 0x00046189,\n\t\t0x034, 0x0004506D,\n\t\t0x034, 0x0004406A,\n\t\t0x034, 0x0004302C,\n\t\t0x034, 0x00042029,\n\t\t0x034, 0x00041026,\n\t\t0x034, 0x00040023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0004AFF1,\n\t\t0x034, 0x00049FEE,\n\t\t0x034, 0x00048FEB,\n\t\t0x034, 0x00047FE8,\n\t\t0x034, 0x00046DEA,\n\t\t0x034, 0x00045DE7,\n\t\t0x034, 0x00044CEA,\n\t\t0x034, 0x00043CE7,\n\t\t0x034, 0x00042C69,\n\t\t0x034, 0x00041C66,\n\t\t0x034, 0x00040C28,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A1AD,\n\t\t0x034, 0x000291AA,\n\t\t0x034, 0x000281A7,\n\t\t0x034, 0x000270AA,\n\t\t0x034, 0x000260A7,\n\t\t0x034, 0x00025049,\n\t\t0x034, 0x00024046,\n\t\t0x034, 0x00023026,\n\t\t0x034, 0x00022009,\n\t\t0x034, 0x00021006,\n\t\t0x034, 0x00020003,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EF,\n\t\t0x034, 0x000293AC,\n\t\t0x034, 0x0002838A,\n\t\t0x034, 0x0002718C,\n\t\t0x034, 0x00026189,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EF,\n\t\t0x034, 0x000293AC,\n\t\t0x034, 0x0002838A,\n\t\t0x034, 0x0002718C,\n\t\t0x034, 0x00026189,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0002AFF1,\n\t\t0x034, 0x00029FEE,\n\t\t0x034, 0x00028FEB,\n\t\t0x034, 0x00027FE8,\n\t\t0x034, 0x00026DEA,\n\t\t0x034, 0x00025DE7,\n\t\t0x034, 0x00024CEA,\n\t\t0x034, 0x00023CE7,\n\t\t0x034, 0x00022C69,\n\t\t0x034, 0x00021C66,\n\t\t0x034, 0x00020C28,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EC,\n\t\t0x034, 0x0000938C,\n\t\t0x034, 0x000081AD,\n\t\t0x034, 0x000071AA,\n\t\t0x034, 0x000061A7,\n\t\t0x034, 0x000050AA,\n\t\t0x034, 0x000040A7,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x0000100C,\n\t\t0x034, 0x00000009,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AC,\n\t\t0x034, 0x0000838A,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AC,\n\t\t0x034, 0x0000838A,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000AFF1,\n\t\t0x034, 0x00009FEE,\n\t\t0x034, 0x00008FEB,\n\t\t0x034, 0x00007FE8,\n\t\t0x034, 0x00006DEA,\n\t\t0x034, 0x00005DE7,\n\t\t0x034, 0x00004CEA,\n\t\t0x034, 0x00003CE7,\n\t\t0x034, 0x00002C69,\n\t\t0x034, 0x00001C66,\n\t\t0x034, 0x00000C28,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA1AD,\n\t\t0x034, 0x000C91AA,\n\t\t0x034, 0x000C81A7,\n\t\t0x034, 0x000C70AA,\n\t\t0x034, 0x000C60A7,\n\t\t0x034, 0x000C5049,\n\t\t0x034, 0x000C4046,\n\t\t0x034, 0x000C3026,\n\t\t0x034, 0x000C2009,\n\t\t0x034, 0x000C1006,\n\t\t0x034, 0x000C0003,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3EF,\n\t\t0x034, 0x000C93AF,\n\t\t0x034, 0x000C83AB,\n\t\t0x034, 0x000C718C,\n\t\t0x034, 0x000C6189,\n\t\t0x034, 0x000C506D,\n\t\t0x034, 0x000C406A,\n\t\t0x034, 0x000C302C,\n\t\t0x034, 0x000C2029,\n\t\t0x034, 0x000C1026,\n\t\t0x034, 0x000C0023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3EF,\n\t\t0x034, 0x000C93AF,\n\t\t0x034, 0x000C83AB,\n\t\t0x034, 0x000C718C,\n\t\t0x034, 0x000C6189,\n\t\t0x034, 0x000C506D,\n\t\t0x034, 0x000C406A,\n\t\t0x034, 0x000C302C,\n\t\t0x034, 0x000C2029,\n\t\t0x034, 0x000C1026,\n\t\t0x034, 0x000C0023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000CA794,\n\t\t0x034, 0x000C9791,\n\t\t0x034, 0x000C878E,\n\t\t0x034, 0x000C778B,\n\t\t0x034, 0x000C658D,\n\t\t0x034, 0x000C558A,\n\t\t0x034, 0x000C448D,\n\t\t0x034, 0x000C348A,\n\t\t0x034, 0x000C244C,\n\t\t0x034, 0x000C1449,\n\t\t0x034, 0x000C042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA1AD,\n\t\t0x034, 0x000A91AA,\n\t\t0x034, 0x000A81A7,\n\t\t0x034, 0x000A70AA,\n\t\t0x034, 0x000A60A7,\n\t\t0x034, 0x000A5049,\n\t\t0x034, 0x000A4046,\n\t\t0x034, 0x000A3026,\n\t\t0x034, 0x000A2009,\n\t\t0x034, 0x000A1006,\n\t\t0x034, 0x000A0003,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EF,\n\t\t0x034, 0x000A93AC,\n\t\t0x034, 0x000A838A,\n\t\t0x034, 0x000A718C,\n\t\t0x034, 0x000A6189,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EF,\n\t\t0x034, 0x000A93AC,\n\t\t0x034, 0x000A838A,\n\t\t0x034, 0x000A718C,\n\t\t0x034, 0x000A6189,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000AA794,\n\t\t0x034, 0x000A9791,\n\t\t0x034, 0x000A878E,\n\t\t0x034, 0x000A778B,\n\t\t0x034, 0x000A658D,\n\t\t0x034, 0x000A558A,\n\t\t0x034, 0x000A448D,\n\t\t0x034, 0x000A348A,\n\t\t0x034, 0x000A244C,\n\t\t0x034, 0x000A1449,\n\t\t0x034, 0x000A042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EC,\n\t\t0x034, 0x0008938C,\n\t\t0x034, 0x000881AD,\n\t\t0x034, 0x000871AA,\n\t\t0x034, 0x000861A7,\n\t\t0x034, 0x000850AA,\n\t\t0x034, 0x000840A7,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x0008100C,\n\t\t0x034, 0x00080009,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AC,\n\t\t0x034, 0x0008838A,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AC,\n\t\t0x034, 0x0008838A,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008A794,\n\t\t0x034, 0x00089791,\n\t\t0x034, 0x0008878E,\n\t\t0x034, 0x0008778B,\n\t\t0x034, 0x0008658D,\n\t\t0x034, 0x0008558A,\n\t\t0x034, 0x0008448D,\n\t\t0x034, 0x0008348A,\n\t\t0x034, 0x0008244C,\n\t\t0x034, 0x00081449,\n\t\t0x034, 0x0008042B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0DF, 0x00000001,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000040,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0xA0000000,\t0x00000000,\n\t\t0x035, 0x00000747,\n\t\t0x035, 0x00008747,\n\t\t0x035, 0x00010747,\n\t\t0x035, 0x00020747,\n\t\t0x035, 0x00028747,\n\t\t0x035, 0x00030747,\n\t\t0x035, 0x00040747,\n\t\t0x035, 0x00048747,\n\t\t0x035, 0x00050747,\n\t\t0x035, 0x000805FB,\n\t\t0x035, 0x000885FB,\n\t\t0x035, 0x000905FB,\n\t\t0x035, 0x000A05FB,\n\t\t0x035, 0x000A85FB,\n\t\t0x035, 0x000B05FB,\n\t\t0x035, 0x000C05FB,\n\t\t0x035, 0x000C85FB,\n\t\t0x035, 0x000D05FB,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0DF, 0x00000001,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000010,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000473,\n\t\t0x036, 0x00008473,\n\t\t0x036, 0x00010473,\n\t\t0x036, 0x00020473,\n\t\t0x036, 0x00028473,\n\t\t0x036, 0x00030473,\n\t\t0x036, 0x00040473,\n\t\t0x036, 0x00048473,\n\t\t0x036, 0x00050473,\n\t\t0x036, 0x00080473,\n\t\t0x036, 0x00088473,\n\t\t0x036, 0x00090473,\n\t\t0x036, 0x000A0473,\n\t\t0x036, 0x000A8473,\n\t\t0x036, 0x000B0473,\n\t\t0x036, 0x000C0473,\n\t\t0x036, 0x000C8473,\n\t\t0x036, 0x000D0473,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0xA0000000,\t0x00000000,\n\t\t0x036, 0x00000473,\n\t\t0x036, 0x00008473,\n\t\t0x036, 0x00010473,\n\t\t0x036, 0x00020473,\n\t\t0x036, 0x00028473,\n\t\t0x036, 0x00030473,\n\t\t0x036, 0x00040473,\n\t\t0x036, 0x00048473,\n\t\t0x036, 0x00050473,\n\t\t0x036, 0x00080473,\n\t\t0x036, 0x00088473,\n\t\t0x036, 0x00090473,\n\t\t0x036, 0x000A0473,\n\t\t0x036, 0x000A8473,\n\t\t0x036, 0x000B0473,\n\t\t0x036, 0x000C0473,\n\t\t0x036, 0x000C8473,\n\t\t0x036, 0x000D0473,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000004,\n\t\t0x037, 0x00000000,\n\t\t0x038, 0x00005146,\n\t\t0x037, 0x00004000,\n\t\t0x038, 0x00005146,\n\t\t0x037, 0x00008000,\n\t\t0x038, 0x00005146,\n\t\t0x037, 0x00010000,\n\t\t0x038, 0x00005146,\n\t\t0x037, 0x00014000,\n\t\t0x038, 0x00005146,\n\t\t0x037, 0x00018000,\n\t\t0x038, 0x00004D4E,\n\t\t0x037, 0x0001C000,\n\t\t0x038, 0x00004D4E,\n\t\t0x037, 0x00020000,\n\t\t0x038, 0x00004D4E,\n\t\t0x037, 0x00024000,\n\t\t0x038, 0x000071C6,\n\t\t0x037, 0x00028000,\n\t\t0x038, 0x000071C6,\n\t\t0x037, 0x0002C000,\n\t\t0x038, 0x000071C6,\n\t\t0x037, 0x00030000,\n\t\t0x038, 0x000071CE,\n\t\t0x037, 0x00034000,\n\t\t0x038, 0x000071CE,\n\t\t0x037, 0x00038000,\n\t\t0x038, 0x00005126,\n\t\t0x037, 0x0003C000,\n\t\t0x038, 0x00005126,\n\t\t0x037, 0x00040000,\n\t\t0x038, 0x00005126,\n\t\t0x037, 0x00044000,\n\t\t0x038, 0x00005126,\n\t\t0x037, 0x00048000,\n\t\t0x038, 0x00005126,\n\t\t0x037, 0x00080000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00084000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00088000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00090000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00094000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00098000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x0009C000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000AC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000BC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000007D,\n\t\t0x03C, 0x0000047D,\n\t\t0x03C, 0x0000087D,\n\t\t0x03C, 0x0000107D,\n\t\t0x03C, 0x0000147D,\n\t\t0x03C, 0x0000187D,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x0000054A,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x0000154A,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x0000254A,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x0000054A,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x0000154A,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x0000254A,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x0000054A,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x0000154A,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x0000254A,\n\t\t0x03C, 0x00002821,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000037E,\n\t\t0x03C, 0x00000575,\n\t\t0x03C, 0x00000971,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001575,\n\t\t0x03C, 0x00001871,\n\t\t0x03C, 0x0000217E,\n\t\t0x03C, 0x00002575,\n\t\t0x03C, 0x00002871,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x061, 0x000C0D47,\n\t\t0x062, 0x0000133C,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0xA0000000,\t0x00000000,\n\t\t0x063, 0x0007D0E7,\n\t0xB0000000,\t0x00000000,\n\t\t0x064, 0x00014FEC,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0xA0000000,\t0x00000000,\n\t\t0x065, 0x000933FF,\n\t0xB0000000,\t0x00000000,\n\t\t0x066, 0x00000040,\n\t\t0x057, 0x00050000,\n\t\t0x056, 0x00051DF0,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x055, 0x00082061,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x055, 0x00082061,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x055, 0x00082061,\n\t0xA0000000,\t0x00000000,\n\t\t0x055, 0x00082060,\n\t0xB0000000,\t0x00000000,\n\t\t0x01C, 0x000739D2,\n\t\t0x01F, 0x0002295C,\n\t\t0x018, 0x0001B126,\n\t\t0xFFE, 0x00000000,\n\t\t0xFFE, 0x00000000,\n\t\t0xFFE, 0x00000000,\n\t\t0x018, 0x00013126,\n\t\t0x018, 0x00013124,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioA(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_RadioA)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_RadioA;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_RadioA\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigRF_RadioA_8814A(pDM_Odm, v1, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_RadioA(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           RadioB.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_RadioB[] = { \n\t\t0x018, 0x00013124,\n\t\t0x040, 0x00000C00,\n\t\t0x058, 0x00000F98,\n\t\t0x07F, 0x00068004,\n\t\t0x018, 0x00000006,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t0xA0000000,\t0x00000000,\n\t\t0x086, 0x000E4B58,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x087, 0x00079F80,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x087, 0x00079F80,\n\t0xA0000000,\t0x00000000,\n\t\t0x087, 0x00049F80,\n\t0xB0000000,\t0x00000000,\n\t\t0x0DF, 0x00000008,\n\t\t0x0EF, 0x00002000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017BC3,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F39B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017BC3,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x0003F258,\n\t\t0x03B, 0x00030A58,\n\t\t0x03B, 0x0002FA58,\n\t\t0x03B, 0x00022590,\n\t\t0x03B, 0x0001FA50,\n\t\t0x03B, 0x00010248,\n\t\t0x03B, 0x00008240,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000100,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000ADF6,\n\t\t0x034, 0x00009DF3,\n\t\t0x034, 0x00008DF0,\n\t\t0x034, 0x00007DED,\n\t\t0x034, 0x00006DEA,\n\t\t0x034, 0x00005CED,\n\t\t0x034, 0x00004CEA,\n\t\t0x034, 0x000034EA,\n\t\t0x034, 0x000024E7,\n\t\t0x034, 0x0000146A,\n\t\t0x034, 0x0000006B,\n\t0xB0000000,\t0x00000000,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008ADF6,\n\t\t0x034, 0x00089DF3,\n\t\t0x034, 0x00088DF0,\n\t\t0x034, 0x00087DED,\n\t\t0x034, 0x00086DEA,\n\t\t0x034, 0x00085CED,\n\t\t0x034, 0x00084CEA,\n\t\t0x034, 0x000834EA,\n\t\t0x034, 0x000824E7,\n\t\t0x034, 0x0008146A,\n\t\t0x034, 0x0008006B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x000020A2,\n\t\t0x0DF, 0x00000080,\n\t\t0x035, 0x00000192,\n\t\t0x035, 0x00008192,\n\t\t0x035, 0x00010192,\n\t\t0x036, 0x00000024,\n\t\t0x036, 0x00008024,\n\t\t0x036, 0x00010024,\n\t\t0x036, 0x00018024,\n\t\t0x0EF, 0x00000000,\n\t\t0x051, 0x00000C21,\n\t\t0x052, 0x000006D9,\n\t\t0x053, 0x000FC649,\n\t\t0x054, 0x0000017E,\n\t\t0x018, 0x0001012A,\n\t\t0x081, 0x0007FC00,\n\t\t0x089, 0x00050110,\n\t\t0x08A, 0x00043E50,\n\t\t0x08B, 0x0002E180,\n\t\t0x08C, 0x00093C3C,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xA0000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xB0000000,\t0x00000000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x08D, 0x000FFFF0,\n\t0xA0000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00001000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00084000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00040000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00030023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00028623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00021633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0001C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00010293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00009593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0000078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00020000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00060000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00048000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00048000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00070023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00068623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00061633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0005C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00050293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00049593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0004078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00048000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00060000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x0004C000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00044000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x0004C000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B0023,\n\t0x80000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A8623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A1633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0009C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00090293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00089593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0008078B,\n\t\t0x03C, 0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00000800,\n\t\t0x03B, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00040000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001001,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00001003,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00080000,\n\t0x80000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001802,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t\t0x03C, 0x00000000,\n\t\t0x03C, 0x00000400,\n\t\t0x03C, 0x00000800,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t\t0x0EF, 0x00000100,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A38C,\n\t\t0x034, 0x000491AD,\n\t\t0x034, 0x000481AA,\n\t\t0x034, 0x000471A7,\n\t\t0x034, 0x000460AA,\n\t\t0x034, 0x000450A7,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x0004200C,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A38C,\n\t\t0x034, 0x00049389,\n\t\t0x034, 0x0004816D,\n\t\t0x034, 0x0004716A,\n\t\t0x034, 0x0004606D,\n\t\t0x034, 0x0004506A,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x00042026,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A38B,\n\t\t0x034, 0x00049388,\n\t\t0x034, 0x0004818B,\n\t\t0x034, 0x00047188,\n\t\t0x034, 0x0004606D,\n\t\t0x034, 0x0004506A,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x00042026,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0004AFF4,\n\t\t0x034, 0x00049FF1,\n\t\t0x034, 0x00048FEE,\n\t\t0x034, 0x00047FEB,\n\t\t0x034, 0x00046FE8,\n\t\t0x034, 0x00045DEA,\n\t\t0x034, 0x00044CED,\n\t\t0x034, 0x00043CEA,\n\t\t0x034, 0x00042C6C,\n\t\t0x034, 0x00041C69,\n\t\t0x034, 0x00040C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A38C,\n\t\t0x034, 0x000291AD,\n\t\t0x034, 0x000281AA,\n\t\t0x034, 0x000271A7,\n\t\t0x034, 0x000260AA,\n\t\t0x034, 0x000250A7,\n\t\t0x034, 0x0002402C,\n\t\t0x034, 0x00023029,\n\t\t0x034, 0x0002200C,\n\t\t0x034, 0x00021009,\n\t\t0x034, 0x00020006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EE,\n\t\t0x034, 0x000293AC,\n\t\t0x034, 0x00028389,\n\t\t0x034, 0x0002716D,\n\t\t0x034, 0x0002616A,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EF,\n\t\t0x034, 0x000293AD,\n\t\t0x034, 0x0002838A,\n\t\t0x034, 0x0002718C,\n\t\t0x034, 0x00026189,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0002AFF4,\n\t\t0x034, 0x00029FF1,\n\t\t0x034, 0x00028FEE,\n\t\t0x034, 0x00027FEB,\n\t\t0x034, 0x00026FE8,\n\t\t0x034, 0x00025DEA,\n\t\t0x034, 0x00024CED,\n\t\t0x034, 0x00023CEA,\n\t\t0x034, 0x00022C6C,\n\t\t0x034, 0x00021C69,\n\t\t0x034, 0x00020C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A38C,\n\t\t0x034, 0x000091AD,\n\t\t0x034, 0x000081AA,\n\t\t0x034, 0x000071A7,\n\t\t0x034, 0x000060AA,\n\t\t0x034, 0x000050A7,\n\t\t0x034, 0x0000402C,\n\t\t0x034, 0x00003029,\n\t\t0x034, 0x00002026,\n\t\t0x034, 0x00001009,\n\t\t0x034, 0x00000006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EC,\n\t\t0x034, 0x000093AC,\n\t\t0x034, 0x000081EC,\n\t\t0x034, 0x0000716D,\n\t\t0x034, 0x0000616A,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000404C,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EF,\n\t\t0x034, 0x000093AD,\n\t\t0x034, 0x0000838A,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000AFF4,\n\t\t0x034, 0x00009FF1,\n\t\t0x034, 0x00008FEE,\n\t\t0x034, 0x00007FEB,\n\t\t0x034, 0x00006FE8,\n\t\t0x034, 0x00005DEA,\n\t\t0x034, 0x00004CED,\n\t\t0x034, 0x00003CEA,\n\t\t0x034, 0x00002C6C,\n\t\t0x034, 0x00001C69,\n\t\t0x034, 0x00000C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA38C,\n\t\t0x034, 0x000C91AD,\n\t\t0x034, 0x000C81AA,\n\t\t0x034, 0x000C71A7,\n\t\t0x034, 0x000C60AA,\n\t\t0x034, 0x000C50A7,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C200C,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA38C,\n\t\t0x034, 0x000C9389,\n\t\t0x034, 0x000C816D,\n\t\t0x034, 0x000C716A,\n\t\t0x034, 0x000C606D,\n\t\t0x034, 0x000C506A,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C2026,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA38B,\n\t\t0x034, 0x000C9388,\n\t\t0x034, 0x000C818B,\n\t\t0x034, 0x000C7188,\n\t\t0x034, 0x000C606D,\n\t\t0x034, 0x000C506A,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C2026,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000CA794,\n\t\t0x034, 0x000C9791,\n\t\t0x034, 0x000C878E,\n\t\t0x034, 0x000C778B,\n\t\t0x034, 0x000C658D,\n\t\t0x034, 0x000C558A,\n\t\t0x034, 0x000C448D,\n\t\t0x034, 0x000C348A,\n\t\t0x034, 0x000C244C,\n\t\t0x034, 0x000C1449,\n\t\t0x034, 0x000C042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA38C,\n\t\t0x034, 0x000A91AD,\n\t\t0x034, 0x000A81AA,\n\t\t0x034, 0x000A71A7,\n\t\t0x034, 0x000A60AA,\n\t\t0x034, 0x000A50A7,\n\t\t0x034, 0x000A402C,\n\t\t0x034, 0x000A3029,\n\t\t0x034, 0x000A200C,\n\t\t0x034, 0x000A1009,\n\t\t0x034, 0x000A0006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EE,\n\t\t0x034, 0x000A93AC,\n\t\t0x034, 0x000A8389,\n\t\t0x034, 0x000A716D,\n\t\t0x034, 0x000A616A,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EF,\n\t\t0x034, 0x000A93AD,\n\t\t0x034, 0x000A838A,\n\t\t0x034, 0x000A718C,\n\t\t0x034, 0x000A6189,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000AA794,\n\t\t0x034, 0x000A9791,\n\t\t0x034, 0x000A878E,\n\t\t0x034, 0x000A778B,\n\t\t0x034, 0x000A658D,\n\t\t0x034, 0x000A558A,\n\t\t0x034, 0x000A448D,\n\t\t0x034, 0x000A348A,\n\t\t0x034, 0x000A244C,\n\t\t0x034, 0x000A1449,\n\t\t0x034, 0x000A042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A38C,\n\t\t0x034, 0x000891AD,\n\t\t0x034, 0x000881AA,\n\t\t0x034, 0x000871A7,\n\t\t0x034, 0x000860AA,\n\t\t0x034, 0x000850A7,\n\t\t0x034, 0x0008402C,\n\t\t0x034, 0x00083029,\n\t\t0x034, 0x00082026,\n\t\t0x034, 0x00081009,\n\t\t0x034, 0x00080006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EC,\n\t\t0x034, 0x000893AC,\n\t\t0x034, 0x000881EC,\n\t\t0x034, 0x0008716D,\n\t\t0x034, 0x0008616A,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008404C,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EF,\n\t\t0x034, 0x000893AD,\n\t\t0x034, 0x0008838A,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008A794,\n\t\t0x034, 0x00089791,\n\t\t0x034, 0x0008878E,\n\t\t0x034, 0x0008778B,\n\t\t0x034, 0x0008658D,\n\t\t0x034, 0x0008558A,\n\t\t0x034, 0x0008448D,\n\t\t0x034, 0x0008348A,\n\t\t0x034, 0x0008244C,\n\t\t0x034, 0x00081449,\n\t\t0x034, 0x0008042B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000040,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0xA0000000,\t0x00000000,\n\t\t0x035, 0x00000484,\n\t\t0x035, 0x00008484,\n\t\t0x035, 0x00010484,\n\t\t0x035, 0x00020584,\n\t\t0x035, 0x00028584,\n\t\t0x035, 0x00030584,\n\t\t0x035, 0x00040584,\n\t\t0x035, 0x00048584,\n\t\t0x035, 0x00050584,\n\t\t0x035, 0x000805FB,\n\t\t0x035, 0x000885FB,\n\t\t0x035, 0x000905FB,\n\t\t0x035, 0x000A05FB,\n\t\t0x035, 0x000A85FB,\n\t\t0x035, 0x000B05FB,\n\t\t0x035, 0x000C05FB,\n\t\t0x035, 0x000C85FB,\n\t\t0x035, 0x000D05FB,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000010,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000473,\n\t\t0x036, 0x00008473,\n\t\t0x036, 0x00010473,\n\t\t0x036, 0x00020473,\n\t\t0x036, 0x00028473,\n\t\t0x036, 0x00030473,\n\t\t0x036, 0x00040473,\n\t\t0x036, 0x00048473,\n\t\t0x036, 0x00050473,\n\t\t0x036, 0x00080473,\n\t\t0x036, 0x00088473,\n\t\t0x036, 0x00090473,\n\t\t0x036, 0x000A0473,\n\t\t0x036, 0x000A8473,\n\t\t0x036, 0x000B0473,\n\t\t0x036, 0x000C0473,\n\t\t0x036, 0x000C8473,\n\t\t0x036, 0x000D0473,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0xA0000000,\t0x00000000,\n\t\t0x036, 0x00000474,\n\t\t0x036, 0x00008474,\n\t\t0x036, 0x00010474,\n\t\t0x036, 0x00020474,\n\t\t0x036, 0x00028474,\n\t\t0x036, 0x00030474,\n\t\t0x036, 0x00040474,\n\t\t0x036, 0x00048474,\n\t\t0x036, 0x00050474,\n\t\t0x036, 0x00080474,\n\t\t0x036, 0x00088474,\n\t\t0x036, 0x00090474,\n\t\t0x036, 0x000A0474,\n\t\t0x036, 0x000A8474,\n\t\t0x036, 0x000B0474,\n\t\t0x036, 0x000C0474,\n\t\t0x036, 0x000C8474,\n\t\t0x036, 0x000D0474,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000004,\n\t\t0x037, 0x00000000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00004000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00008000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00010000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00014000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00018000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0001C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00020000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00024000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00028000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0002C000,\n\t\t0x038, 0x0000714E,\n\t\t0x037, 0x00030000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00034000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00038000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0003C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00040000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00044000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00048000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00080000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00084000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00088000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00090000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00094000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00098000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x0009C000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000AC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000BC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000007D,\n\t\t0x03C, 0x0000047D,\n\t\t0x03C, 0x0000087D,\n\t\t0x03C, 0x0000107D,\n\t\t0x03C, 0x0000147D,\n\t\t0x03C, 0x0000187D,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027E,\n\t\t0x03C, 0x00000546,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001546,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227E,\n\t\t0x03C, 0x00002546,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027E,\n\t\t0x03C, 0x00000546,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001546,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227E,\n\t\t0x03C, 0x00002546,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027E,\n\t\t0x03C, 0x00000546,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001546,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227E,\n\t\t0x03C, 0x00002546,\n\t\t0x03C, 0x00002821,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000037E,\n\t\t0x03C, 0x00000575,\n\t\t0x03C, 0x00000971,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001575,\n\t\t0x03C, 0x00001871,\n\t\t0x03C, 0x0000217E,\n\t\t0x03C, 0x00002575,\n\t\t0x03C, 0x00002871,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x061, 0x000C0D47,\n\t\t0x062, 0x0000133C,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0xA0000000,\t0x00000000,\n\t\t0x063, 0x0007D0E7,\n\t0xB0000000,\t0x00000000,\n\t\t0x064, 0x00014FEC,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0xA0000000,\t0x00000000,\n\t\t0x065, 0x000923FF,\n\t0xB0000000,\t0x00000000,\n\t\t0x066, 0x00000040,\n\t\t0x057, 0x00050000,\n\t\t0x056, 0x00051DF0,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x055, 0x00082060,\n\t0xB0000000,\t0x00000000,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioB(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_RadioB)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_RadioB;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_RadioB\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigRF_RadioB_8814A(pDM_Odm, v1, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_RadioB(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           RadioC.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_RadioC[] = { \n\t\t0x018, 0x00013124,\n\t\t0x040, 0x00000C00,\n\t\t0x058, 0x00000F98,\n\t\t0x07F, 0x00068004,\n\t\t0x018, 0x00000006,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t\t0x087, 0x00079F80,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t\t0x087, 0x00079F80,\n\t0xA0000000,\t0x00000000,\n\t\t0x086, 0x000E4B58,\n\t\t0x087, 0x00049F80,\n\t0xB0000000,\t0x00000000,\n\t\t0x0DF, 0x00000008,\n\t\t0x0EF, 0x00002000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017823,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017823,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x0003F258,\n\t\t0x03B, 0x00030A58,\n\t\t0x03B, 0x0002FA58,\n\t\t0x03B, 0x00022590,\n\t\t0x03B, 0x0001FA50,\n\t\t0x03B, 0x00010248,\n\t\t0x03B, 0x00008240,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000100,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000ADF6,\n\t\t0x034, 0x00009DF3,\n\t\t0x034, 0x00008DF0,\n\t\t0x034, 0x00007DED,\n\t\t0x034, 0x00006DEA,\n\t\t0x034, 0x00005CED,\n\t\t0x034, 0x00004CEA,\n\t\t0x034, 0x000034EA,\n\t\t0x034, 0x000024E7,\n\t\t0x034, 0x0000146A,\n\t\t0x034, 0x0000006B,\n\t0xB0000000,\t0x00000000,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008ADF6,\n\t\t0x034, 0x00089DF3,\n\t\t0x034, 0x00088DF0,\n\t\t0x034, 0x00087DED,\n\t\t0x034, 0x00086DEA,\n\t\t0x034, 0x00085CED,\n\t\t0x034, 0x00084CEA,\n\t\t0x034, 0x000834EA,\n\t\t0x034, 0x000824E7,\n\t\t0x034, 0x0008146A,\n\t\t0x034, 0x0008006B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x000020A2,\n\t\t0x0DF, 0x00000080,\n\t\t0x035, 0x00000192,\n\t\t0x035, 0x00008192,\n\t\t0x035, 0x00010192,\n\t\t0x036, 0x00000024,\n\t\t0x036, 0x00008024,\n\t\t0x036, 0x00010024,\n\t\t0x036, 0x00018024,\n\t\t0x0EF, 0x00000000,\n\t\t0x051, 0x00000C21,\n\t\t0x052, 0x000006D9,\n\t\t0x053, 0x000FC649,\n\t\t0x054, 0x0000017E,\n\t\t0x018, 0x0001012A,\n\t\t0x081, 0x0007FC00,\n\t\t0x089, 0x00050110,\n\t\t0x08A, 0x00043E50,\n\t\t0x08B, 0x0002E180,\n\t\t0x08C, 0x00093C3C,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xA0000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x08D, 0x000FFFF0,\n\t0xA0000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00001000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0006C000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x000D4000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00080000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x000A0000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00030023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00028623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00021633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0001C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00010293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00009593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0000078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x0004C000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00084000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00080000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00028000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00070023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00068623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00061633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0005C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00050293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00049593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0004078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00060000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00080000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B0023,\n\t0x80000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A8623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A1633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0009C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00090293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00089593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0008078B,\n\t\t0x03C, 0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00000800,\n\t\t0x03B, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001803,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00001803,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00040000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000800,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000803,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00080000,\n\t0x80000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001802,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t\t0x03C, 0x00000000,\n\t\t0x03C, 0x00000400,\n\t\t0x03C, 0x00000800,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t0xA0000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000100,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A38C,\n\t\t0x034, 0x000491AD,\n\t\t0x034, 0x000481AA,\n\t\t0x034, 0x000471A7,\n\t\t0x034, 0x000460AA,\n\t\t0x034, 0x000450A7,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x0004200C,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3EF,\n\t\t0x034, 0x000493AD,\n\t\t0x034, 0x0004838A,\n\t\t0x034, 0x0004718C,\n\t\t0x034, 0x00046189,\n\t\t0x034, 0x0004506D,\n\t\t0x034, 0x0004404C,\n\t\t0x034, 0x0004302C,\n\t\t0x034, 0x00042029,\n\t\t0x034, 0x00041026,\n\t\t0x034, 0x00040023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3EF,\n\t\t0x034, 0x000493AD,\n\t\t0x034, 0x0004838A,\n\t\t0x034, 0x0004718C,\n\t\t0x034, 0x00046189,\n\t\t0x034, 0x0004506D,\n\t\t0x034, 0x0004404C,\n\t\t0x034, 0x0004302C,\n\t\t0x034, 0x00042029,\n\t\t0x034, 0x00041026,\n\t\t0x034, 0x00040023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0004AFF4,\n\t\t0x034, 0x00049FF1,\n\t\t0x034, 0x00048FEE,\n\t\t0x034, 0x00047FEB,\n\t\t0x034, 0x00046FE8,\n\t\t0x034, 0x00045DEA,\n\t\t0x034, 0x00044CED,\n\t\t0x034, 0x00043CEA,\n\t\t0x034, 0x00042C6C,\n\t\t0x034, 0x00041C69,\n\t\t0x034, 0x00040C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EC,\n\t\t0x034, 0x0002938C,\n\t\t0x034, 0x000281AD,\n\t\t0x034, 0x000271AA,\n\t\t0x034, 0x000261A7,\n\t\t0x034, 0x000250AA,\n\t\t0x034, 0x000240A7,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x0002100C,\n\t\t0x034, 0x00020009,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EC,\n\t\t0x034, 0x0002936D,\n\t\t0x034, 0x0002836A,\n\t\t0x034, 0x0002716D,\n\t\t0x034, 0x0002616A,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EC,\n\t\t0x034, 0x000293AC,\n\t\t0x034, 0x0002838A,\n\t\t0x034, 0x0002718C,\n\t\t0x034, 0x00026189,\n\t\t0x034, 0x0002506D,\n\t\t0x034, 0x0002406A,\n\t\t0x034, 0x0002302C,\n\t\t0x034, 0x00022029,\n\t\t0x034, 0x00021026,\n\t\t0x034, 0x00020023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0002AFF4,\n\t\t0x034, 0x00029FF1,\n\t\t0x034, 0x00028FEE,\n\t\t0x034, 0x00027FEB,\n\t\t0x034, 0x00026FE8,\n\t\t0x034, 0x00025DEA,\n\t\t0x034, 0x00024CED,\n\t\t0x034, 0x00023CEA,\n\t\t0x034, 0x00022C6C,\n\t\t0x034, 0x00021C69,\n\t\t0x034, 0x00020C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A38C,\n\t\t0x034, 0x000091AD,\n\t\t0x034, 0x000081AA,\n\t\t0x034, 0x000071A7,\n\t\t0x034, 0x000060AA,\n\t\t0x034, 0x000050A7,\n\t\t0x034, 0x0000402C,\n\t\t0x034, 0x00003029,\n\t\t0x034, 0x0000200C,\n\t\t0x034, 0x00001009,\n\t\t0x034, 0x00000006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AB,\n\t\t0x034, 0x00008389,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AB,\n\t\t0x034, 0x00008389,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000AFF4,\n\t\t0x034, 0x00009FF1,\n\t\t0x034, 0x00008FEE,\n\t\t0x034, 0x00007FEB,\n\t\t0x034, 0x00006FE8,\n\t\t0x034, 0x00005DEA,\n\t\t0x034, 0x00004CED,\n\t\t0x034, 0x00003CEA,\n\t\t0x034, 0x00002C6C,\n\t\t0x034, 0x00001C69,\n\t\t0x034, 0x00000C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA38C,\n\t\t0x034, 0x000C91AD,\n\t\t0x034, 0x000C81AA,\n\t\t0x034, 0x000C71A7,\n\t\t0x034, 0x000C60AA,\n\t\t0x034, 0x000C50A7,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C200C,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3EF,\n\t\t0x034, 0x000C93AD,\n\t\t0x034, 0x000C838A,\n\t\t0x034, 0x000C718C,\n\t\t0x034, 0x000C6189,\n\t\t0x034, 0x000C506D,\n\t\t0x034, 0x000C404C,\n\t\t0x034, 0x000C302C,\n\t\t0x034, 0x000C2029,\n\t\t0x034, 0x000C1026,\n\t\t0x034, 0x000C0023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3EF,\n\t\t0x034, 0x000C93AD,\n\t\t0x034, 0x000C838A,\n\t\t0x034, 0x000C718C,\n\t\t0x034, 0x000C6189,\n\t\t0x034, 0x000C506D,\n\t\t0x034, 0x000C404C,\n\t\t0x034, 0x000C302C,\n\t\t0x034, 0x000C2029,\n\t\t0x034, 0x000C1026,\n\t\t0x034, 0x000C0023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000CA794,\n\t\t0x034, 0x000C9791,\n\t\t0x034, 0x000C878E,\n\t\t0x034, 0x000C778B,\n\t\t0x034, 0x000C658D,\n\t\t0x034, 0x000C558A,\n\t\t0x034, 0x000C448D,\n\t\t0x034, 0x000C348A,\n\t\t0x034, 0x000C244C,\n\t\t0x034, 0x000C1449,\n\t\t0x034, 0x000C042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EC,\n\t\t0x034, 0x000A938C,\n\t\t0x034, 0x000A81AD,\n\t\t0x034, 0x000A71AA,\n\t\t0x034, 0x000A61A7,\n\t\t0x034, 0x000A50AA,\n\t\t0x034, 0x000A40A7,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A100C,\n\t\t0x034, 0x000A0009,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EC,\n\t\t0x034, 0x000A936D,\n\t\t0x034, 0x000A836A,\n\t\t0x034, 0x000A716D,\n\t\t0x034, 0x000A616A,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EC,\n\t\t0x034, 0x000A93AC,\n\t\t0x034, 0x000A838A,\n\t\t0x034, 0x000A718C,\n\t\t0x034, 0x000A6189,\n\t\t0x034, 0x000A506D,\n\t\t0x034, 0x000A406A,\n\t\t0x034, 0x000A302C,\n\t\t0x034, 0x000A2029,\n\t\t0x034, 0x000A1026,\n\t\t0x034, 0x000A0023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000AA794,\n\t\t0x034, 0x000A9791,\n\t\t0x034, 0x000A878E,\n\t\t0x034, 0x000A778B,\n\t\t0x034, 0x000A658D,\n\t\t0x034, 0x000A558A,\n\t\t0x034, 0x000A448D,\n\t\t0x034, 0x000A348A,\n\t\t0x034, 0x000A244C,\n\t\t0x034, 0x000A1449,\n\t\t0x034, 0x000A042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A38C,\n\t\t0x034, 0x000891AD,\n\t\t0x034, 0x000881AA,\n\t\t0x034, 0x000871A7,\n\t\t0x034, 0x000860AA,\n\t\t0x034, 0x000850A7,\n\t\t0x034, 0x0008402C,\n\t\t0x034, 0x00083029,\n\t\t0x034, 0x0008200C,\n\t\t0x034, 0x00081009,\n\t\t0x034, 0x00000006,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AB,\n\t\t0x034, 0x00088389,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AB,\n\t\t0x034, 0x00088389,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008A794,\n\t\t0x034, 0x00089791,\n\t\t0x034, 0x0008878E,\n\t\t0x034, 0x0008778B,\n\t\t0x034, 0x0008658D,\n\t\t0x034, 0x0008558A,\n\t\t0x034, 0x0008448D,\n\t\t0x034, 0x0008348A,\n\t\t0x034, 0x0008244C,\n\t\t0x034, 0x00081449,\n\t\t0x034, 0x0008042B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000040,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0xA0000000,\t0x00000000,\n\t\t0x035, 0x00000484,\n\t\t0x035, 0x00008484,\n\t\t0x035, 0x00010484,\n\t\t0x035, 0x00020584,\n\t\t0x035, 0x00028584,\n\t\t0x035, 0x00030584,\n\t\t0x035, 0x00040584,\n\t\t0x035, 0x00048584,\n\t\t0x035, 0x00050584,\n\t\t0x035, 0x000805FB,\n\t\t0x035, 0x000885FB,\n\t\t0x035, 0x000905FB,\n\t\t0x035, 0x000A05FB,\n\t\t0x035, 0x000A85FB,\n\t\t0x035, 0x000B05FB,\n\t\t0x035, 0x000C05FB,\n\t\t0x035, 0x000C85FB,\n\t\t0x035, 0x000D05FB,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000010,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000473,\n\t\t0x036, 0x00008473,\n\t\t0x036, 0x00010473,\n\t\t0x036, 0x00020473,\n\t\t0x036, 0x00028473,\n\t\t0x036, 0x00030473,\n\t\t0x036, 0x00040473,\n\t\t0x036, 0x00048473,\n\t\t0x036, 0x00050473,\n\t\t0x036, 0x00080473,\n\t\t0x036, 0x00088473,\n\t\t0x036, 0x00090473,\n\t\t0x036, 0x000A0473,\n\t\t0x036, 0x000A8473,\n\t\t0x036, 0x000B0473,\n\t\t0x036, 0x000C0473,\n\t\t0x036, 0x000C8473,\n\t\t0x036, 0x000D0473,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0xA0000000,\t0x00000000,\n\t\t0x036, 0x00000474,\n\t\t0x036, 0x00008474,\n\t\t0x036, 0x00010474,\n\t\t0x036, 0x00020474,\n\t\t0x036, 0x00028474,\n\t\t0x036, 0x00030474,\n\t\t0x036, 0x00040474,\n\t\t0x036, 0x00048474,\n\t\t0x036, 0x00050474,\n\t\t0x036, 0x00080474,\n\t\t0x036, 0x00088474,\n\t\t0x036, 0x00090474,\n\t\t0x036, 0x000A0474,\n\t\t0x036, 0x000A8474,\n\t\t0x036, 0x000B0474,\n\t\t0x036, 0x000C0474,\n\t\t0x036, 0x000C8474,\n\t\t0x036, 0x000D0474,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000004,\n\t\t0x037, 0x00000000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00004000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00008000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00010000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00014000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00018000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0001C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00020000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00024000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00028000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0002C000,\n\t\t0x038, 0x0000714E,\n\t\t0x037, 0x00030000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00034000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00038000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0003C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00040000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00044000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00048000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00080000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00084000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00088000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00090000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00094000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00098000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x0009C000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000AC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000BC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000007D,\n\t\t0x03C, 0x0000047D,\n\t\t0x03C, 0x0000087D,\n\t\t0x03C, 0x0000107D,\n\t\t0x03C, 0x0000147D,\n\t\t0x03C, 0x0000187D,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x00000541,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x00001541,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x00002541,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x00000546,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x00001546,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x00002546,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027D,\n\t\t0x03C, 0x00000546,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127D,\n\t\t0x03C, 0x00001546,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227D,\n\t\t0x03C, 0x00002546,\n\t\t0x03C, 0x00002821,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000037E,\n\t\t0x03C, 0x00000575,\n\t\t0x03C, 0x00000971,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001575,\n\t\t0x03C, 0x00001871,\n\t\t0x03C, 0x0000217E,\n\t\t0x03C, 0x00002575,\n\t\t0x03C, 0x00002871,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x061, 0x000C0D47,\n\t\t0x062, 0x0000133C,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0xA0000000,\t0x00000000,\n\t\t0x063, 0x0007D0E7,\n\t0xB0000000,\t0x00000000,\n\t\t0x064, 0x00014FEC,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0xA0000000,\t0x00000000,\n\t\t0x065, 0x000923FF,\n\t0xB0000000,\t0x00000000,\n\t\t0x066, 0x00000040,\n\t\t0x057, 0x00050000,\n\t\t0x056, 0x00051DF0,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x055, 0x00082060,\n\t0xB0000000,\t0x00000000,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioC(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_RadioC)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_RadioC;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_RadioC\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigRF_RadioC_8814A(pDM_Odm, v1, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_RadioC(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           RadioD.TXT\n******************************************************************************/\n\nu4Byte Array_MP_8814A_RadioD[] = { \n\t\t0x018, 0x00013124,\n\t\t0x040, 0x00000C00,\n\t\t0x058, 0x00000F98,\n\t\t0x07F, 0x00068004,\n\t\t0x018, 0x00000006,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t\t0x087, 0x00079F80,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x086, 0x000E335A,\n\t\t0x087, 0x00079F80,\n\t0xA0000000,\t0x00000000,\n\t\t0x086, 0x000E4B58,\n\t\t0x087, 0x00049F80,\n\t0xB0000000,\t0x00000000,\n\t\t0x0DF, 0x00000008,\n\t\t0x0EF, 0x00002000,\n\t0x80000001,\t0x00000055,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F19B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017803,\n\t0x90000001,\t0x000000aa,\t0x40000000,\t0x00000000,\n\t\t0x03B, 0x0003F09B,\n\t\t0x03B, 0x00037A5B,\n\t\t0x03B, 0x0002A433,\n\t\t0x03B, 0x00027BD3,\n\t\t0x03B, 0x0001F80B,\n\t\t0x03B, 0x00017803,\n\t0xA0000000,\t0x00000000,\n\t\t0x03B, 0x0003F258,\n\t\t0x03B, 0x00030A58,\n\t\t0x03B, 0x0002FA58,\n\t\t0x03B, 0x00022590,\n\t\t0x03B, 0x0001FA50,\n\t\t0x03B, 0x00010248,\n\t\t0x03B, 0x00008240,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000100,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000ADF6,\n\t\t0x034, 0x00009DF3,\n\t\t0x034, 0x00008DF0,\n\t\t0x034, 0x00007DED,\n\t\t0x034, 0x00006DEA,\n\t\t0x034, 0x00005CED,\n\t\t0x034, 0x00004CEA,\n\t\t0x034, 0x000034EA,\n\t\t0x034, 0x000024E7,\n\t\t0x034, 0x0000146A,\n\t\t0x034, 0x0000006B,\n\t0xB0000000,\t0x00000000,\n\t0x80000002,\t0x00005500,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0x90000002,\t0x0000aa00,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A0D0,\n\t\t0x034, 0x000090CD,\n\t\t0x034, 0x000080CA,\n\t\t0x034, 0x0000704D,\n\t\t0x034, 0x0000604A,\n\t\t0x034, 0x00005047,\n\t\t0x034, 0x0000400A,\n\t\t0x034, 0x00003007,\n\t\t0x034, 0x00002004,\n\t\t0x034, 0x00001001,\n\t\t0x034, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008ADF6,\n\t\t0x034, 0x00089DF3,\n\t\t0x034, 0x00088DF0,\n\t\t0x034, 0x00087DED,\n\t\t0x034, 0x00086DEA,\n\t\t0x034, 0x00085CED,\n\t\t0x034, 0x00084CEA,\n\t\t0x034, 0x000834EA,\n\t\t0x034, 0x000824E7,\n\t\t0x034, 0x0008146A,\n\t\t0x034, 0x0008006B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x000020A2,\n\t\t0x0DF, 0x00000080,\n\t\t0x035, 0x00000192,\n\t\t0x035, 0x00008192,\n\t\t0x035, 0x00010192,\n\t\t0x036, 0x00000024,\n\t\t0x036, 0x00008024,\n\t\t0x036, 0x00010024,\n\t\t0x036, 0x00018024,\n\t\t0x0EF, 0x00000000,\n\t\t0x051, 0x00000C21,\n\t\t0x052, 0x000006D9,\n\t\t0x053, 0x000FC649,\n\t\t0x054, 0x0000017E,\n\t\t0x018, 0x0001012A,\n\t\t0x081, 0x0007FC00,\n\t\t0x089, 0x00050110,\n\t\t0x08A, 0x00043E50,\n\t\t0x08B, 0x0002E180,\n\t\t0x08C, 0x00093C3C,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xA0000000,\t0x00000000,\n\t\t0x085, 0x000F8000,\n\t0xB0000000,\t0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x08D, 0x000FFFF0,\n\t0xA0000000,\t0x00000000,\n\t\t0x08D, 0x000FFFF0,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00001000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00044000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00048000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00088000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00038023,\n\t\t0x03C, 0x00048000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00030023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00028623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00021633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0001C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00010293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00009593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0000078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00020000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00020000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00044000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00078023,\n\t\t0x03C, 0x00024000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00070023,\n\t\t0x03C, 0x00048000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00068623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00061633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0005C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00050293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00049593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0004078B,\n\t\t0x03C, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00004000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00060000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00024000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B8023,\n\t\t0x03C, 0x00004000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000B0023,\n\t0x80000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x00020000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A8623,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x000A1633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x0009C633,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00090293,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x0000013C,\n\t\t0x03B, 0x00089593,\n\t\t0x03C, 0x00000000,\n\t\t0x03A, 0x00000148,\n\t\t0x03B, 0x0008078B,\n\t\t0x03C, 0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x0EF, 0x00000800,\n\t\t0x03B, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000803,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00000803,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00040000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001002,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t\t0x03A, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x03A, 0x00001000,\n\t0xB0000000,\t0x00000000,\n\t\t0x03B, 0x00080000,\n\t\t0x03A, 0x00001802,\n\t\t0x0EF, 0x00000000,\n\t0x80000004,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00550000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00aa0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00ff0000,\t0x40000000,\t0x00000000,\n\t0x90000004,\t0x00000000,\t0x40000000,\t0x00550000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t\t0x03C, 0x00000000,\n\t\t0x03C, 0x00000400,\n\t\t0x03C, 0x00000800,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x00013124,\n\t\t0x0EF, 0x00000100,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3EB,\n\t\t0x034, 0x0004938B,\n\t\t0x034, 0x000481AC,\n\t\t0x034, 0x000471A9,\n\t\t0x034, 0x000460AC,\n\t\t0x034, 0x000450A9,\n\t\t0x034, 0x0004402E,\n\t\t0x034, 0x0004302B,\n\t\t0x034, 0x00042028,\n\t\t0x034, 0x0004100B,\n\t\t0x034, 0x00040008,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3AD,\n\t\t0x034, 0x0004938A,\n\t\t0x034, 0x0004818C,\n\t\t0x034, 0x00047189,\n\t\t0x034, 0x0004606D,\n\t\t0x034, 0x0004506A,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x00042026,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0004A3AD,\n\t\t0x034, 0x0004938A,\n\t\t0x034, 0x0004818C,\n\t\t0x034, 0x00047189,\n\t\t0x034, 0x0004606D,\n\t\t0x034, 0x0004506A,\n\t\t0x034, 0x0004402C,\n\t\t0x034, 0x00043029,\n\t\t0x034, 0x00042026,\n\t\t0x034, 0x00041009,\n\t\t0x034, 0x00040006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0004AFF4,\n\t\t0x034, 0x00049FF1,\n\t\t0x034, 0x00048FEE,\n\t\t0x034, 0x00047FEB,\n\t\t0x034, 0x00046FE8,\n\t\t0x034, 0x00045DEA,\n\t\t0x034, 0x00044CED,\n\t\t0x034, 0x00043CEA,\n\t\t0x034, 0x00042C6C,\n\t\t0x034, 0x00041C69,\n\t\t0x034, 0x00040C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3EE,\n\t\t0x034, 0x000293EB,\n\t\t0x034, 0x0002838B,\n\t\t0x034, 0x000271AC,\n\t\t0x034, 0x000261A9,\n\t\t0x034, 0x000250AC,\n\t\t0x034, 0x000240A9,\n\t\t0x034, 0x000230A6,\n\t\t0x034, 0x0002202C,\n\t\t0x034, 0x00021029,\n\t\t0x034, 0x00020026,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3AD,\n\t\t0x034, 0x0002938A,\n\t\t0x034, 0x0002818C,\n\t\t0x034, 0x00027189,\n\t\t0x034, 0x0002606D,\n\t\t0x034, 0x0002504C,\n\t\t0x034, 0x0002402C,\n\t\t0x034, 0x00023029,\n\t\t0x034, 0x00022026,\n\t\t0x034, 0x00021023,\n\t\t0x034, 0x00020006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0002A3AD,\n\t\t0x034, 0x0002938A,\n\t\t0x034, 0x0002818C,\n\t\t0x034, 0x00027189,\n\t\t0x034, 0x0002606D,\n\t\t0x034, 0x0002504C,\n\t\t0x034, 0x0002402C,\n\t\t0x034, 0x00023029,\n\t\t0x034, 0x00022026,\n\t\t0x034, 0x00021023,\n\t\t0x034, 0x00020006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0002AFF4,\n\t\t0x034, 0x00029FF1,\n\t\t0x034, 0x00028FEE,\n\t\t0x034, 0x00027FEB,\n\t\t0x034, 0x00026FE8,\n\t\t0x034, 0x00025DEA,\n\t\t0x034, 0x00024CED,\n\t\t0x034, 0x00023CEA,\n\t\t0x034, 0x00022C6C,\n\t\t0x034, 0x00021C69,\n\t\t0x034, 0x00020C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EF,\n\t\t0x034, 0x000093EC,\n\t\t0x034, 0x0000838C,\n\t\t0x034, 0x000071AD,\n\t\t0x034, 0x000061AA,\n\t\t0x034, 0x000050AD,\n\t\t0x034, 0x000040AA,\n\t\t0x034, 0x0000306A,\n\t\t0x034, 0x0000202D,\n\t\t0x034, 0x0000102A,\n\t\t0x034, 0x00000027,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AC,\n\t\t0x034, 0x0000838A,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0000A3EE,\n\t\t0x034, 0x000093AC,\n\t\t0x034, 0x0000838A,\n\t\t0x034, 0x0000718C,\n\t\t0x034, 0x00006189,\n\t\t0x034, 0x0000506D,\n\t\t0x034, 0x0000406A,\n\t\t0x034, 0x0000302C,\n\t\t0x034, 0x00002029,\n\t\t0x034, 0x00001026,\n\t\t0x034, 0x00000023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0000AFF4,\n\t\t0x034, 0x00009FF1,\n\t\t0x034, 0x00008FEE,\n\t\t0x034, 0x00007FEB,\n\t\t0x034, 0x00006FE8,\n\t\t0x034, 0x00005DEA,\n\t\t0x034, 0x00004CED,\n\t\t0x034, 0x00003CEA,\n\t\t0x034, 0x00002C6C,\n\t\t0x034, 0x00001C69,\n\t\t0x034, 0x00000C2B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3EB,\n\t\t0x034, 0x000C938B,\n\t\t0x034, 0x000C81AC,\n\t\t0x034, 0x000C71A9,\n\t\t0x034, 0x000C60AC,\n\t\t0x034, 0x000C50A9,\n\t\t0x034, 0x000C402E,\n\t\t0x034, 0x000C302B,\n\t\t0x034, 0x000C2028,\n\t\t0x034, 0x000C100B,\n\t\t0x034, 0x000C0008,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3AD,\n\t\t0x034, 0x000C938A,\n\t\t0x034, 0x000C818C,\n\t\t0x034, 0x000C7189,\n\t\t0x034, 0x000C606D,\n\t\t0x034, 0x000C506A,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C2026,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000CA3AD,\n\t\t0x034, 0x000C938A,\n\t\t0x034, 0x000C818C,\n\t\t0x034, 0x000C7189,\n\t\t0x034, 0x000C606D,\n\t\t0x034, 0x000C506A,\n\t\t0x034, 0x000C402C,\n\t\t0x034, 0x000C3029,\n\t\t0x034, 0x000C2026,\n\t\t0x034, 0x000C1009,\n\t\t0x034, 0x000C0006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000CA794,\n\t\t0x034, 0x000C9791,\n\t\t0x034, 0x000C878E,\n\t\t0x034, 0x000C778B,\n\t\t0x034, 0x000C658D,\n\t\t0x034, 0x000C558A,\n\t\t0x034, 0x000C448D,\n\t\t0x034, 0x000C348A,\n\t\t0x034, 0x000C244C,\n\t\t0x034, 0x000C1449,\n\t\t0x034, 0x000C042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3EE,\n\t\t0x034, 0x000A93EB,\n\t\t0x034, 0x000A838B,\n\t\t0x034, 0x000A71AC,\n\t\t0x034, 0x000A61A9,\n\t\t0x034, 0x000A50AC,\n\t\t0x034, 0x000A40A9,\n\t\t0x034, 0x000A30A6,\n\t\t0x034, 0x000A202C,\n\t\t0x034, 0x000A1029,\n\t\t0x034, 0x000A0026,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3AD,\n\t\t0x034, 0x000A938A,\n\t\t0x034, 0x000A818C,\n\t\t0x034, 0x000A7189,\n\t\t0x034, 0x000A606D,\n\t\t0x034, 0x000A504C,\n\t\t0x034, 0x000A402C,\n\t\t0x034, 0x000A3029,\n\t\t0x034, 0x000A2026,\n\t\t0x034, 0x000A1023,\n\t\t0x034, 0x000A0006,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x000AA3AD,\n\t\t0x034, 0x000A938A,\n\t\t0x034, 0x000A818C,\n\t\t0x034, 0x000A7189,\n\t\t0x034, 0x000A606D,\n\t\t0x034, 0x000A504C,\n\t\t0x034, 0x000A402C,\n\t\t0x034, 0x000A3029,\n\t\t0x034, 0x000A2026,\n\t\t0x034, 0x000A1023,\n\t\t0x034, 0x000A0006,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x000AA794,\n\t\t0x034, 0x000A9791,\n\t\t0x034, 0x000A878E,\n\t\t0x034, 0x000A778B,\n\t\t0x034, 0x000A658D,\n\t\t0x034, 0x000A558A,\n\t\t0x034, 0x000A448D,\n\t\t0x034, 0x000A348A,\n\t\t0x034, 0x000A244C,\n\t\t0x034, 0x000A1449,\n\t\t0x034, 0x000A042B,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EF,\n\t\t0x034, 0x000893EC,\n\t\t0x034, 0x0008838C,\n\t\t0x034, 0x000871AD,\n\t\t0x034, 0x000861AA,\n\t\t0x034, 0x000850AD,\n\t\t0x034, 0x000840AA,\n\t\t0x034, 0x0008306A,\n\t\t0x034, 0x0008202D,\n\t\t0x034, 0x0008102A,\n\t\t0x034, 0x00080027,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AC,\n\t\t0x034, 0x0008838A,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x034, 0x0008A3EE,\n\t\t0x034, 0x000893AC,\n\t\t0x034, 0x0008838A,\n\t\t0x034, 0x0008718C,\n\t\t0x034, 0x00086189,\n\t\t0x034, 0x0008506D,\n\t\t0x034, 0x0008406A,\n\t\t0x034, 0x0008302C,\n\t\t0x034, 0x00082029,\n\t\t0x034, 0x00081026,\n\t\t0x034, 0x00080023,\n\t0xA0000000,\t0x00000000,\n\t\t0x034, 0x0008A794,\n\t\t0x034, 0x00089791,\n\t\t0x034, 0x0008878E,\n\t\t0x034, 0x0008778B,\n\t\t0x034, 0x0008658D,\n\t\t0x034, 0x0008558A,\n\t\t0x034, 0x0008448D,\n\t\t0x034, 0x0008348A,\n\t\t0x034, 0x0008244C,\n\t\t0x034, 0x00081449,\n\t\t0x034, 0x0008042B,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000040,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x035, 0x000006CC,\n\t\t0x035, 0x000086CC,\n\t\t0x035, 0x000106CC,\n\t\t0x035, 0x000206CC,\n\t\t0x035, 0x000286CC,\n\t\t0x035, 0x000306CC,\n\t\t0x035, 0x000406CC,\n\t\t0x035, 0x000486CC,\n\t\t0x035, 0x000506CC,\n\t\t0x035, 0x000806CC,\n\t\t0x035, 0x000886CC,\n\t\t0x035, 0x000906CC,\n\t\t0x035, 0x000A06CC,\n\t\t0x035, 0x000A86CC,\n\t\t0x035, 0x000B06CC,\n\t\t0x035, 0x000C06CC,\n\t\t0x035, 0x000C86CC,\n\t\t0x035, 0x000D06CC,\n\t0xA0000000,\t0x00000000,\n\t\t0x035, 0x00000484,\n\t\t0x035, 0x00008484,\n\t\t0x035, 0x00010484,\n\t\t0x035, 0x00020584,\n\t\t0x035, 0x00028584,\n\t\t0x035, 0x00030584,\n\t\t0x035, 0x00040584,\n\t\t0x035, 0x00048584,\n\t\t0x035, 0x00050584,\n\t\t0x035, 0x000805FB,\n\t\t0x035, 0x000885FB,\n\t\t0x035, 0x000905FB,\n\t\t0x035, 0x000A05FB,\n\t\t0x035, 0x000A85FB,\n\t\t0x035, 0x000B05FB,\n\t\t0x035, 0x000C05FB,\n\t\t0x035, 0x000C85FB,\n\t\t0x035, 0x000D05FB,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x0DF, 0x00000001,\n\t0xA0000000,\t0x00000000,\n\t\t0x0DF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x018, 0x0001712A,\n\t\t0x0EF, 0x00000010,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000473,\n\t\t0x036, 0x00008473,\n\t\t0x036, 0x00010473,\n\t\t0x036, 0x00020473,\n\t\t0x036, 0x00028473,\n\t\t0x036, 0x00030473,\n\t\t0x036, 0x00040473,\n\t\t0x036, 0x00048473,\n\t\t0x036, 0x00050473,\n\t\t0x036, 0x00080473,\n\t\t0x036, 0x00088473,\n\t\t0x036, 0x00090473,\n\t\t0x036, 0x000A0473,\n\t\t0x036, 0x000A8473,\n\t\t0x036, 0x000B0473,\n\t\t0x036, 0x000C0473,\n\t\t0x036, 0x000C8473,\n\t\t0x036, 0x000D0473,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x036, 0x00000475,\n\t\t0x036, 0x00008475,\n\t\t0x036, 0x00010475,\n\t\t0x036, 0x00020475,\n\t\t0x036, 0x00028475,\n\t\t0x036, 0x00030475,\n\t\t0x036, 0x00040475,\n\t\t0x036, 0x00048475,\n\t\t0x036, 0x00050475,\n\t\t0x036, 0x00080475,\n\t\t0x036, 0x00088475,\n\t\t0x036, 0x00090475,\n\t\t0x036, 0x000A0475,\n\t\t0x036, 0x000A8475,\n\t\t0x036, 0x000B0475,\n\t\t0x036, 0x000C0475,\n\t\t0x036, 0x000C8475,\n\t\t0x036, 0x000D0475,\n\t0xA0000000,\t0x00000000,\n\t\t0x036, 0x00000474,\n\t\t0x036, 0x00008474,\n\t\t0x036, 0x00010474,\n\t\t0x036, 0x00020474,\n\t\t0x036, 0x00028474,\n\t\t0x036, 0x00030474,\n\t\t0x036, 0x00040474,\n\t\t0x036, 0x00048474,\n\t\t0x036, 0x00050474,\n\t\t0x036, 0x00080474,\n\t\t0x036, 0x00088474,\n\t\t0x036, 0x00090474,\n\t\t0x036, 0x000A0474,\n\t\t0x036, 0x000A8474,\n\t\t0x036, 0x000B0474,\n\t\t0x036, 0x000C0474,\n\t\t0x036, 0x000C8474,\n\t\t0x036, 0x000D0474,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x0EF, 0x00000004,\n\t\t0x037, 0x00000000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00004000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00008000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00010000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00014000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00018000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0001C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00020000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00024000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00028000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0002C000,\n\t\t0x038, 0x0000714E,\n\t\t0x037, 0x00030000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00034000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00038000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x0003C000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00040000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00044000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00048000,\n\t\t0x038, 0x0000514E,\n\t\t0x037, 0x00080000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00084000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00088000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00090000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00094000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x00098000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x0009C000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000A8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000AC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000B8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000BC000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C0000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C4000,\n\t\t0x038, 0x00005ECE,\n\t\t0x037, 0x000C8000,\n\t\t0x038, 0x00005ECE,\n\t\t0x0EF, 0x00000000,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000008,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000007D,\n\t\t0x03C, 0x0000047D,\n\t\t0x03C, 0x0000087D,\n\t\t0x03C, 0x0000107D,\n\t\t0x03C, 0x0000147D,\n\t\t0x03C, 0x0000187D,\n\t0xB0000000,\t0x00000000,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x00000275,\n\t\t0x03C, 0x00000542,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x00001275,\n\t\t0x03C, 0x00001542,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x00002275,\n\t\t0x03C, 0x00002542,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027F,\n\t\t0x03C, 0x00000542,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127F,\n\t\t0x03C, 0x00001542,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227F,\n\t\t0x03C, 0x00002542,\n\t\t0x03C, 0x00002821,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x03C, 0x0000027F,\n\t\t0x03C, 0x00000542,\n\t\t0x03C, 0x00000821,\n\t\t0x03C, 0x0000127F,\n\t\t0x03C, 0x00001542,\n\t\t0x03C, 0x00001821,\n\t\t0x03C, 0x0000227F,\n\t\t0x03C, 0x00002542,\n\t\t0x03C, 0x00002821,\n\t0xA0000000,\t0x00000000,\n\t\t0x03C, 0x0000037E,\n\t\t0x03C, 0x00000575,\n\t\t0x03C, 0x00000971,\n\t\t0x03C, 0x0000127E,\n\t\t0x03C, 0x00001575,\n\t\t0x03C, 0x00001871,\n\t\t0x03C, 0x0000217E,\n\t\t0x03C, 0x00002575,\n\t\t0x03C, 0x00002871,\n\t0xB0000000,\t0x00000000,\n\t\t0x0EF, 0x00000000,\n\t\t0x061, 0x000C0D47,\n\t\t0x062, 0x0000133C,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x063, 0x000750E7,\n\t0xA0000000,\t0x00000000,\n\t\t0x063, 0x0007D0E7,\n\t0xB0000000,\t0x00000000,\n\t\t0x064, 0x00014FEC,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t\t0x065, 0x000920D0,\n\t0xA0000000,\t0x00000000,\n\t\t0x065, 0x000923FF,\n\t0xB0000000,\t0x00000000,\n\t\t0x066, 0x00000040,\n\t\t0x057, 0x00050000,\n\t\t0x056, 0x00051DF0,\n\t0x80000008,\t0x00000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0x55000000,\t0x40000000,\t0x00000000,\n\t0x90000008,\t0xaa000000,\t0x40000000,\t0x00000000,\n\t0xA0000000,\t0x00000000,\n\t\t0x055, 0x00082060,\n\t0xB0000000,\t0x00000000,\n\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioD(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i         = 0;\n\tu1Byte     cCond;\n\tBOOLEAN bMatched = TRUE, bSkipped = FALSE;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_RadioD)/sizeof(u4Byte);\n\tpu4Byte    Array       = Array_MP_8814A_RadioD;\n\t\n\tu4Byte\tv1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_RadioD\\n\"));\n\n\twhile ((i + 1) < ArrayLen) {\n\t\tv1 = Array[i];\n\t\tv2 = Array[i + 1];\n\n\t\tif (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\n\t\t\tif (v1 & BIT31) {/* positive condition*/\n\t\t\t\tcCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\n\t\t\t\tif (cCond == COND_ENDIF) {/*end*/\n\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ENDIF\\n\"));\n\t\t\t\t} else if (cCond == COND_ELSE) { /*else*/\n\t\t\t\t\tbMatched = bSkipped?FALSE:TRUE;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"ELSE\\n\"));\n\t\t\t\t} else {/*if , else if*/\n\t\t\t\t\tpre_v1 = v1;\n\t\t\t\t\tpre_v2 = v2;\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"IF or ELSE IF\\n\"));\n\t\t\t\t}\n\t\t\t} else if (v1 & BIT30) { /*negative condition*/\n\t\t\t\tif (bSkipped == FALSE) {\n\t\t\t\t\tif (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) {\n\t\t\t\t\t\tbMatched = TRUE;\n\t\t\t\t\t\tbSkipped = TRUE;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbMatched = FALSE;\n\t\t\t\t\t\tbSkipped = FALSE;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tbMatched = FALSE;\n\t\t\t}\n\t\t} else {\n\t\t\tif (bMatched)\n\t\t\t\todm_ConfigRF_RadioD_8814A(pDM_Odm, v1, v2);\n\t\t}\n\t\ti = i + 2;\n\t}\n}\n\nu4Byte\nODM_GetVersion_MP_8814A_RadioD(void)\n{\n\t   return 85;\n}\n\n/******************************************************************************\n*                           TxPowerTrack.TXT\n******************************************************************************/\n\nu1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tPODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_MP_8814A\\n\"));\n\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3);\n}\n\n/******************************************************************************\n*                           TxPowerTrack_Type0.TXT\n******************************************************************************/\n\nu1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type0(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tPODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_MP_8814A\\n\"));\n\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3);\n}\n\n/******************************************************************************\n*                           TxPowerTrack_Type2.TXT\n******************************************************************************/\n\nu1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type2(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tPODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_MP_8814A\\n\"));\n\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3);\n}\n\n/******************************************************************************\n*                           TxPowerTrack_Type5.TXT\n******************************************************************************/\n\nu1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = {\n\t{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},\n\t{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},\n\t{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},\n};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\nu1Byte 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};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type5(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tPODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_MP_8814A\\n\"));\n\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE);\n\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n\tODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3);\n}\n\n/******************************************************************************\n*                           TXPWR_LMT.TXT\n******************************************************************************/\n\nconst char *Array_MP_8814A_TXPWR_LMT[] = { \n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"32\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"32\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"34\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"30\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"30\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"32\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"28\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"28\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"28\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"28\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"30\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"26\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"26\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"26\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"32\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"32\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"34\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"30\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"30\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"28\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"32\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"28\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"28\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"28\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"26\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"30\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"26\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"26\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"26\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"32\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"32\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"30\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"34\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"30\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"28\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"32\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"28\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"22\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"28\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"26\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"24\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"22\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"26\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"30\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"26\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"34\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"32\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"32\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"34\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"30\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"34\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"34\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"30\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"24\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"28\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"32\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"28\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"24\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"24\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"22\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"28\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"26\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"26\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"30\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"26\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"30\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"32\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"32\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"28\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"32\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"32\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"30\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"32\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"32\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"34\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"32\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"32\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"32\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"28\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"30\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"30\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"26\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"30\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"30\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"28\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"30\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"30\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"32\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"30\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"30\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"34\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"30\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"26\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"28\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"28\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"24\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"28\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"28\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"26\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"28\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"28\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"30\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"28\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"28\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"32\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"28\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"24\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"26\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"26\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"22\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"26\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"26\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"24\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"26\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"26\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"28\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"26\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"26\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"30\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"26\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"63\"\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i           = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_TXPWR_LMT)/sizeof(pu1Byte);\n\tpu1Byte    *Array      = (pu1Byte *)Array_MP_8814A_TXPWR_LMT;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrLmt = ArrayLen/7;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT\\n\"));\n\n\tfor (i = 0; i < ArrayLen; i += 7) {\n\t\tpu1Byte regulation = Array[i];\n\t\tpu1Byte band = Array[i+1];\n\t\tpu1Byte bandwidth = Array[i+2];\n\t\tpu1Byte rate = Array[i+3];\n\t\tpu1Byte rfPath = Array[i+4];\n\t\tpu1Byte chnl = Array[i+5];\n\t\tpu1Byte val = Array[i+6];\n\t\n\t\todm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\trsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, \"\\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\",\",\n\t\t\tregulation, band, bandwidth, rate, rfPath, chnl, val);\n#endif\n\t}\n\n}\n\n/******************************************************************************\n*                           TXPWR_LMT_type2.TXT\n******************************************************************************/\n\nconst char *Array_MP_8814A_TXPWR_LMT_type2[] = { \n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"36\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"36\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"36\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"36\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"36\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"36\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"36\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"36\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"36\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"36\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"36\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"36\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"63\"\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_type2(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i           = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_TXPWR_LMT_type2)/sizeof(pu1Byte);\n\tpu1Byte    *Array      = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_type2;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrLmt = ArrayLen/7;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_type2\\n\"));\n\n\tfor (i = 0; i < ArrayLen; i += 7) {\n\t\tpu1Byte regulation = Array[i];\n\t\tpu1Byte band = Array[i+1];\n\t\tpu1Byte bandwidth = Array[i+2];\n\t\tpu1Byte rate = Array[i+3];\n\t\tpu1Byte rfPath = Array[i+4];\n\t\tpu1Byte chnl = Array[i+5];\n\t\tpu1Byte val = Array[i+6];\n\t\n\t\todm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\trsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, \"\\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\",\",\n\t\t\tregulation, band, bandwidth, rate, rfPath, chnl, val);\n#endif\n\t}\n\n}\n\n/******************************************************************************\n*                           TXPWR_LMT_Type3.TXT\n******************************************************************************/\n\nconst char *Array_MP_8814A_TXPWR_LMT_Type3[] = { \n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"63\"\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type3(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i           = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_TXPWR_LMT_Type3)/sizeof(pu1Byte);\n\tpu1Byte    *Array      = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type3;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrLmt = ArrayLen/7;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type3\\n\"));\n\n\tfor (i = 0; i < ArrayLen; i += 7) {\n\t\tpu1Byte regulation = Array[i];\n\t\tpu1Byte band = Array[i+1];\n\t\tpu1Byte bandwidth = Array[i+2];\n\t\tpu1Byte rate = Array[i+3];\n\t\tpu1Byte rfPath = Array[i+4];\n\t\tpu1Byte chnl = Array[i+5];\n\t\tpu1Byte val = Array[i+6];\n\t\n\t\todm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\trsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, \"\\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\",\",\n\t\t\tregulation, band, bandwidth, rate, rfPath, chnl, val);\n#endif\n\t}\n\n}\n\n/******************************************************************************\n*                           TXPWR_LMT_Type5.TXT\n******************************************************************************/\n\nconst char *Array_MP_8814A_TXPWR_LMT_Type5[] = { \n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"CCK\", \"1T\", \"14\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"OFDM\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"01\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"02\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"20M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"1T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"2T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"3T\", \"14\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"01\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"02\", \"63\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"03\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"04\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"05\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"06\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"07\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"08\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"09\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"10\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"46\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"11\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"12\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"40\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"13\", \"40\",\n\t\"FCC\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"ETSI\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\", \n\t\"MKK\", \"2.4G\", \"40M\", \"HT\", \"4T\", \"14\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"OFDM\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"1T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"2T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"3T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"36\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"40\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"44\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"48\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"52\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"56\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"60\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"64\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"100\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"104\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"108\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"112\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"116\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"120\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"124\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"128\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"132\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"136\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"140\", \"40\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"149\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"153\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"157\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"161\", \"63\",\n\t\"FCC\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"46\", \n\t\"ETSI\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"40\", \n\t\"MKK\", \"5G\", \"20M\", \"HT\", \"4T\", \"165\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"1T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"2T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"3T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"38\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"46\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"54\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"62\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"102\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"110\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"118\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"126\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"134\", \"40\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"151\", \"63\",\n\t\"FCC\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"46\", \n\t\"ETSI\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"40\", \n\t\"MKK\", \"5G\", \"40M\", \"HT\", \"4T\", \"159\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"1T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"2T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"3T\", \"155\", \"63\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"42\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"58\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"106\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"122\", \"40\",\n\t\"FCC\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"46\", \n\t\"ETSI\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"40\", \n\t\"MKK\", \"5G\", \"80M\", \"VHT\", \"4T\", \"155\", \"63\"\n};\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type5(\n\tIN   PDM_ODM_T  pDM_Odm\n)\n{\n\tu4Byte     i           = 0;\n\tu4Byte     ArrayLen    = sizeof(Array_MP_8814A_TXPWR_LMT_Type5)/sizeof(pu1Byte);\n\tpu1Byte    *Array      = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type5;\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tPlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT);\n\tpHalData->nLinesReadPwrLmt = ArrayLen/7;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type5\\n\"));\n\n\tfor (i = 0; i < ArrayLen; i += 7) {\n\t\tpu1Byte regulation = Array[i];\n\t\tpu1Byte band = Array[i+1];\n\t\tpu1Byte bandwidth = Array[i+2];\n\t\tpu1Byte rate = Array[i+3];\n\t\tpu1Byte rfPath = Array[i+4];\n\t\tpu1Byte chnl = Array[i+5];\n\t\tpu1Byte val = Array[i+6];\n\t\n\t\todm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val);\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\trsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, \"\\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\", \\\"%s\\\",\",\n\t\t\tregulation, band, bandwidth, rate, rfPath, chnl, val);\n#endif\n\t}\n\n}\n\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halhwimg8814a_rf.h",
    "content": "/****************************************************************************** \n* \n* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \n* \n* This program is free software; you can redistribute it and/or modify it \n* under the terms of version 2 of the GNU General Public License as \n* published by the Free Software Foundation. \n* \n* This program is distributed in the hope that it will be useful, but WITHOUT \n* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \n* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \n* more details. \n* \n* You should have received a copy of the GNU General Public License along with \n* this program; if not, write to the Free Software Foundation, Inc., \n* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \n* \n* \n******************************************************************************/\n\n/*Image2HeaderVersion: 2.19*/\n#if (RTL8814A_SUPPORT == 1)\n#ifndef __INC_MP_RF_HW_IMG_8814A_H\n#define __INC_MP_RF_HW_IMG_8814A_H\n\n\n/******************************************************************************\n*                           RadioA.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioA(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_RadioA(void);\n\n/******************************************************************************\n*                           RadioB.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioB(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_RadioB(void);\n\n/******************************************************************************\n*                           RadioC.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioC(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_RadioC(void);\n\n/******************************************************************************\n*                           RadioD.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_RadioD(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_RadioD(void);\n\n/******************************************************************************\n*                           TxPowerTrack.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TxPowerTrack(void);\n\n/******************************************************************************\n*                           TxPowerTrack_Type0.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type0(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type0(void);\n\n/******************************************************************************\n*                           TxPowerTrack_Type2.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type2(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type2(void);\n\n/******************************************************************************\n*                           TxPowerTrack_Type5.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TxPowerTrack_Type5(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type5(void);\n\n/******************************************************************************\n*                           TXPWR_LMT.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT(void);\n\n/******************************************************************************\n*                           TXPWR_LMT_type2.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_type2(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_type2(void);\n\n/******************************************************************************\n*                           TXPWR_LMT_Type3.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type3(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type3(void);\n\n/******************************************************************************\n*                           TXPWR_LMT_Type5.TXT\n******************************************************************************/\n\nvoid\nODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type5(/* TC: Test Chip, MP: MP Chip*/\n\tIN   PDM_ODM_T  pDM_Odm\n);\nu4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type5(void);\n\n#endif\n#endif /* end of HWIMG_SUPPORT*/\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_ap.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS)\n#include \"mp_precomp.h\"\n#else\n#include \"../mp_precomp.h\"\n#endif\n#include \"../phydm_precomp.h\"\n\n\n\n/*---------------------------Define Local Constant---------------------------*/\n// 2010/04/25 MH Define the max tx power tracking tx agc power.\n#define\t\tODM_TXPWRTRACK_MAX_IDX8814A\t\t6\n\n/*---------------------------Define Local Constant---------------------------*/\n\n\n//3============================================================\n//3 Tx Power Tracking\n//3============================================================\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte\t\t\t\tRFPath\n\t)\n{\n\ts1Byte\tUpperBound = 10, LowerBound = -5; // 4'b1010 = 10\n\ts1Byte\tFinal_RF_Index = 0;\n\tBOOLEAN\tbPositive = FALSE;\n\tu4Byte\tbitMask = 0;\n\tu1Byte\tFinal_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -9dB\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tif(Method == MIX_MODE)\t//normal Tx power tracking\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"is 8814 MP chip\\n\"));\n\t\tbitMask = BIT19;\n\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath];\n\n\t\tif( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)\t\t\t\t// check if RF_Index is positive or not\n\t\t\tbPositive = TRUE;\n\t\telse\n\t\t\tbPositive = FALSE;\n\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive);\n\t\t\n\t\tbitMask = BIT18|BIT17|BIT16|BIT15;\n\t\tFinal_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] / 2;\t\t/*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/\n\n\t}\n\t\n\tif(Final_RF_Index > UpperBound)\t\t//Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB\n\t{\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound);\t//set RF Reg0x55 per path\n\t\t\t\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1));\n\t\t\n\t\tif(Final_OFDM_Swing_Index > TxScalingUpperBound)\t//\tbb swing upper bound = +2dB\n\t\t\tFinal_OFDM_Swing_Index = TxScalingUpperBound;\n\n\t\treturn Final_OFDM_Swing_Index;\n\t}\n\telse if(Final_RF_Index < LowerBound)\t// lower bound = -5dB\n\t{\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound));\t//set RF Reg0x55 per path\n\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);\n\n\t\tif(Final_OFDM_Swing_Index < TxScalingLowerBound)\t// bb swing lower bound = -10dB\n\t\t\tFinal_OFDM_Swing_Index = TxScalingLowerBound;\n\t\treturn Final_OFDM_Swing_Index;\n\t}\n\telse\t\t// normal case\n\t{\n\n\t\tif(bPositive == TRUE)\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index);\t//set RF Reg0x55 per path\n\t\telse\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index);\t//set RF Reg0x55 per path\n\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2;\n\t\treturn Final_OFDM_Swing_Index;\t\n\t}\n\t\n\treturn FALSE;\n}\n\n\nVOID\nODM_TxPwrTrackSetPwr8814A(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte \t\t\t\tRFPath,\n\tu1Byte \t\t\t\tChannelMappedIndex\n\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\t\t\n\t\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\t\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n#endif\n\t\tu1Byte\t\t\tFinal_OFDM_Swing_Index = 0; \n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\t\tif (Method == MIX_MODE)\t\t\t\n\t\t{\n\t\t\tODM_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\",\n\t\t\t\tpRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath));\n\t\t\n\t\t\tFinal_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath);\n\t\t}\n\t\telse if(Method == TSSI_MODE)\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0);\n\t\t}\n\t\telse if(Method == BBSWING)\t\t// use for mp driver clean power tracking status\n\t\t{\n\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath];\n\n\t\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);\n\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0);\n\t\t}\n\n\t\tif((Method == MIX_MODE) || (Method == BBSWING))\n\t\t{\n\t\t\tswitch(RFPath)\n\t\t\t{\n\t\t\t\tcase ODM_RF_PATH_A:\n\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t            \tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"Wrong Path name!!!! \\n\"));\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn;\n}\t// ODM_TxPwrTrackSetPwr8814A\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t)\n{\n    PODM_RF_CAL_T\tpRFCalibrateInfo\t= &(pDM_Odm->RFCalibrateInfo);\n\tu2Byte\t\t\trate\t\t\t\t= *(pDM_Odm->pForcedDataRate);\n\tu1Byte\t\t\tchannel\t\t\t= *(pDM_Odm->pChannel);\n\n\tif ( 1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(rate)) {\n\t        *TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P;\n\t        *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N;\n\t        *TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P;\n\t        *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N;\t\t\n\t\t} else {\n\t        *TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P;\n\t        *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N;\n\t        *TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P;\n\t        *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N;\t\t\t\n\t\t}\n \t} else if ( 36 <= channel && channel <= 64) {\n        *TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0];\n        *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0];\n        *TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0];\n        *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0];\n    } else if ( 100 <= channel && channel <= 140) {\n        *TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1];\n        *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1];\n        *TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1];\n        *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1];\n    } else if ( 149 <= channel && channel <= 173) {\n        *TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; \n        *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; \n        *TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; \n        *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; \n    } else {\n\t    *TemperatureUP_A   = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT;\n\t    *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT;\t\n\t    *TemperatureUP_B   = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT;\n\t    *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT;\t\t\n    }\n\t\n\treturn;\n}\n\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t)\n{\n\tPODM_RF_CAL_T \tpRFCalibrateInfo\t= &(pDM_Odm->RFCalibrateInfo);\n\tu2Byte\t\t\trate\t\t\t\t= *(pDM_Odm->pForcedDataRate);\n\tu1Byte\t\t\tchannel\t\t\t= *(pDM_Odm->pChannel);\n\n\tif ( 1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(rate)) {\n\t        *TemperatureUP_C  = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P;\n\t        *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N;\n\t        *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P;\n\t        *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N;\t\t\n\t\t} else {\n\t        *TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P;\n\t        *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N;\n\t        *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P;\n\t        *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N;\t\t\t\n\t\t}\n \t} else if ( 36 <= channel && channel <= 64) {\n        *TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0];\n        *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0];\n        *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0];\n        *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0];\n    } else if ( 100 <= channel && channel <= 140) {\n        *TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1];\n        *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1];\n        *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1];\n        *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1];\n    } else if ( 149 <= channel && channel <= 173) {\n        *TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; \n        *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; \n        *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; \n        *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; \n    } else {\n\t    *TemperatureUP_C   = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT;\n\t    *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT;\t\n\t    *TemperatureUP_D   = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT;\n\t    *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT;\t\t\n    }\n\t\n\treturn;\n}\n\n\nvoid ConfigureTxpowerTrack_8814A(\n\t\tIN PTXPWRTRACK_CFG\tpConfig\n\t\t)\n{\n\tpConfig->SwingTableSize_CCK = ODM_CCK_TABLE_SIZE;\n\tpConfig->SwingTableSize_OFDM = ODM_OFDM_TABLE_SIZE;\n\tpConfig->Threshold_IQK = 8;\n\tpConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A;\n\tpConfig->RfPathCount = MAX_PATH_NUM_8814A;\n\tpConfig->ThermalRegAddr = RF_T_METER_8814A;\n\n\tpConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A;\n\tpConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A;\n\tpConfig->DoIQK = DoIQK_8814A;\n\tpConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A;\n\tpConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD;\n}\n\n\n\n//1 7.\tIQK\n\n\n\n//\n// 2011/07/26 MH Add an API for testing IQK fail case.\n//\n// MP Already declare in odm.c \n#if 0\t//!(DM_ODM_SUPPORT_TYPE & ODM_WIN) \nBOOLEAN\nODM_CheckPowerStatus(\n\t\tIN\tPADAPTER\t\tAdapter)\n{\n\t/*\n\t   HAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t   PDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\t   RT_RF_POWER_STATE \trtState;\n\t   PMGNT_INFO\t\t\tpMgntInfo\t= &(Adapter->MgntInfo);\n\n\t// 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.\n\tif (pMgntInfo->init_adpt_in_progress == TRUE)\n\t{\n\tODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, (\"ODM_CheckPowerStatus Return TRUE, due to initadapter\"));\n\treturn\tTRUE;\n\t}\n\n\t//\n\t//\t2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.\n\t//\n\tAdapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));\t\n\tif(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)\n\t{\n\tODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, (\"ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\\n\", \n\tAdapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));\n\treturn\tFALSE;\n\t}\n\t */\n\treturn\tTRUE;\n}\n#endif\n\nVOID\n\t_PHY_SaveADDARegisters_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tpu4Byte\t\tADDAReg,\n\t\t\tIN\tpu4Byte\t\tADDABackup,\n\t\t\tIN\tu4Byte\t\tRegisterNum\n\t\t\t)\n{\n\tu4Byte\ti;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n\n\tif (ODM_CheckPowerStatus(pAdapter) == FALSE)\n\t\treturn;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"Save ADDA parameters.\\n\"));\n\tfor( i = 0 ; i < RegisterNum ; i++){\n\t\tADDABackup[i] = ODM_GetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord);\n\t}\n}\n\n\nVOID\n\t_PHY_SaveMACRegisters_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tpu4Byte\t\tMACReg,\n\t\t\tIN\tpu4Byte\t\tMACBackup\n\t\t\t)\n{\n\tu4Byte\ti;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"Save MAC parameters.\\n\"));\n\tfor( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){\n\t\tMACBackup[i] = ODM_Read1Byte(pDM_Odm, MACReg[i]);\t\t\n\t}\n\tMACBackup[i] = ODM_Read4Byte(pDM_Odm, MACReg[i]);\t\t\n\n}\n\n\nVOID\n\t_PHY_ReloadADDARegisters_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tpu4Byte\t\tADDAReg,\n\t\t\tIN\tpu4Byte\t\tADDABackup,\n\t\t\tIN\tu4Byte\t\tRegiesterNum\n\t\t\t)\n{\n\tu4Byte\ti;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"Reload ADDA power saving parameters !\\n\"));\n\tfor(i = 0 ; i < RegiesterNum; i++)\n\t{\n\t\tODM_SetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord, ADDABackup[i]);\n\t}\n}\n\nVOID\n\t_PHY_ReloadMACRegisters_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tpu4Byte\t\tMACReg,\n\t\t\tIN\tpu4Byte\t\tMACBackup\n\t\t\t)\n{\n\tu4Byte\ti;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  (\"Reload MAC parameters !\\n\"));\n\tfor(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){\n\t\tODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)MACBackup[i]);\n\t}\n\tODM_Write4Byte(pDM_Odm, MACReg[i], MACBackup[i]);\t\n}\n\n\n\nVOID\n\t_PHY_MACSettingCalibration_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tpu4Byte\t\tMACReg,\n\t\t\tIN\tpu4Byte\t\tMACBackup\t\n\t\t\t)\n{\n\tu4Byte\ti = 0;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"MAC settings for Calibration.\\n\"));\n\n\tODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F);\n\n\tfor(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){\n\t\tODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT3)));\n\t}\n\tODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT5)));\t\n\n}\n\n#if 0\n#define BW_20M \t0\n#define\tBW_40M  1\n#define\tBW_80M\t2\n#endif\n\nVOID\n\tphy_LCCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tBOOLEAN\t\tis2T\n\t\t\t)\n{\n\tu4Byte\t/*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0;\n\tu4Byte cnt;\n\t\n\t//Check continuous TX and Packet TX\n\tu4Byte\treg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);;\n\n\t// Backup RF reg18.\n\n\tif((reg0x914 & 0x70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0xFF);\t\t\t\n\n\t//3 3. Read RF reg18\n\tLC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n\n\t//3 4. Set LC calibration begin bit15\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000, 0x1);\n\n\tODM_delay_ms(100);\t\n\n\tfor (cnt = 0; cnt < 100; cnt++) {\n\t\tif (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)\n\t\t\tbreak;\n\t\tODM_delay_ms(10);\n\t}\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"retry cnt = %d\\n\", cnt));\n\n\n\t//3 Restore original situation\n\tif((reg0x914 & 70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0x00);\t\n\n\t// Recover channel number\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal);\n}\n\n//Analog Pre-distortion calibration\n#define\t\tAPK_BB_REG_NUM\t8\n#define\t\tAPK_CURVE_REG_NUM 4\n#define\t\tPATH_NUM\t\t2\n\nVOID\t\n\tphy_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\ts1Byte \t\tdelta,\n\t\t\tIN\tBOOLEAN\t\tis2T\n\t\t\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\n\tu4Byte \t\t\tregD[PATH_NUM];\n\tu4Byte\t\t\ttmpReg, index, offset,  apkbound;\n\tu1Byte\t\t\tpath, i, pathbound = PATH_NUM;\t\t\n\tu4Byte\t\t\tBB_backup[APK_BB_REG_NUM];\n\tu4Byte\t\t\tBB_REG[APK_BB_REG_NUM] = {\t\n\t\trFPGA1_TxBlock, \trOFDM0_TRxPathEnable, \n\t\trFPGA0_RFMOD, \trOFDM0_TRMuxPar, \n\t\trFPGA0_XCD_RFInterfaceSW,\trFPGA0_XAB_RFInterfaceSW, \n\t\trFPGA0_XA_RFInterfaceOE, \trFPGA0_XB_RFInterfaceOE\t};\n\tu4Byte\t\t\tBB_AP_MODE[APK_BB_REG_NUM] = {\t\n\t\t0x00000020, 0x00a05430, 0x02040000, \n\t\t0x000800e4, 0x00204000 };\n\tu4Byte\t\t\tBB_normal_AP_MODE[APK_BB_REG_NUM] = {\t\n\t\t0x00000020, 0x00a05430, 0x02040000, \n\t\t0x000800e4, 0x22204000 };\t\t\t\t\t\t\n\n\tu4Byte\t\t\tAFE_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\t\t\tAFE_REG[IQK_ADDA_REG_NUM] = {\t\n\t\trFPGA0_XCD_SwitchControl, \trBlue_Tooth, \t\n\t\trRx_Wait_CCA, \t\trTx_CCK_RFON,\n\t\trTx_CCK_BBON, \trTx_OFDM_RFON, \t\n\t\trTx_OFDM_BBON, \trTx_To_Rx,\n\t\trTx_To_Tx, \t\trRx_CCK, \t\n\t\trRx_OFDM, \t\trRx_Wait_RIFS,\n\t\trRx_TO_Rx, \t\trStandby, \t\n\t\trSleep, \t\t\trPMPD_ANAEN };\n\n\tu4Byte\t\t\tMAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\t\t\tMAC_REG[IQK_MAC_REG_NUM] = {\n\t\tREG_TXPAUSE, \t\tREG_BCN_CTRL,\t\n\t\tREG_BCN_CTRL_1,\tREG_GPIO_MUXCFG};\n\n\tu4Byte\t\t\tAPK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t{0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},\n\t\t{0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}\n\t};\t\n\n\tu4Byte\t\t\tAPK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t{0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},\t//path settings equal to path b settings\n\t\t{0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}\n\t};\n\n\tu4Byte\t\t\tAPK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t{0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},\n\t\t{0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}\n\t};\n\n\tu4Byte\t\t\tAPK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\n\t\t{0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},\t//path settings equal to path b settings\n\t\t{0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}\n\t};\n\n\tu4Byte\t\t\tAFE_on_off[PATH_NUM] = {\n\t\t0x04db25a4, 0x0b1b25a4};\t//path A on path B off / path A off path B on\n\n\tu4Byte\t\t\tAPK_offset[PATH_NUM] = {\n\t\trConfig_AntA, rConfig_AntB};\n\n\tu4Byte\t\t\tAPK_normal_offset[PATH_NUM] = {\n\t\trConfig_Pmpd_AntA, rConfig_Pmpd_AntB};\n\n\tu4Byte\t\t\tAPK_value[PATH_NUM] = {\n\t\t0x92fc0000, 0x12fc0000};\t\t\t\t\t\n\n\tu4Byte\t\t\tAPK_normal_value[PATH_NUM] = {\n\t\t0x92680000, 0x12680000};\t\t\t\t\t\n\n\ts1Byte\t\t\tAPK_delta_mapping[APK_BB_REG_NUM][13] = {\n\t\t{-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t{-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\t\t\t\t\t\t\t\t\t\t\t\n\t\t{-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t{-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},\n\t\t{-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}\n\t};\n\n\tu4Byte\t\t\tAPK_normal_setting_value_1[13] = {\n\t\t0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,\n\t\t0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,\n\t\t0x12680000, 0x00880000, 0x00880000\n\t};\n\n\tu4Byte\t\t\tAPK_normal_setting_value_2[16] = {\n\t\t0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,\n\t\t0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,\n\t\t0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,\n\t\t0x00050006\n\t};\n\n\tu4Byte\t\t\tAPK_result[PATH_NUM][APK_BB_REG_NUM];\t//val_1_1a, val_1_2a, val_2a, val_3a, val_4a\n\t//\tu4Byte\t\t\tAP_curve[PATH_NUM][APK_CURVE_REG_NUM];\n\n\ts4Byte\t\t\tBB_offset, delta_V, delta_offset;\n\n#if defined(MP_DRIVER) && (MP_DRIVER == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\t\n#else\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->MptCtx);\t\n#endif\n\tpMptCtx->APK_bound[0] = 45;\n\tpMptCtx->APK_bound[1] = 52;\t\t\n\n#endif\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"==>phy_APCalibrate_8814A() delta %d\\n\", delta));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  (\"AP Calibration for %s\\n\", (is2T ? \"2T2R\" : \"1T1R\")));\n\tif(!is2T)\n\t\tpathbound = 1;\n\n\t//2 FOR NORMAL CHIP SETTINGS\n\n\t// Temporarily do not allow normal driver to do the following settings because these offset\n\t// and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal\n\t// will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the\n\t// root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.\n#if !defined(MP_DRIVER) || (MP_DRIVER != 1)\n\treturn;\n#endif\n\t//settings adjust for normal chip\n\tfor(index = 0; index < PATH_NUM; index ++)\n\t{\n\t\tAPK_offset[index] = APK_normal_offset[index];\n\t\tAPK_value[index] = APK_normal_value[index];\n\t\tAFE_on_off[index] = 0x6fdb25a4;\n\t}\n\n\tfor(index = 0; index < APK_BB_REG_NUM; index ++)\n\t{\n\t\tfor(path = 0; path < pathbound; path++)\n\t\t{\n\t\t\tAPK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];\n\t\t\tAPK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];\n\t\t}\n\t\tBB_AP_MODE[index] = BB_normal_AP_MODE[index];\n\t}\t\t\t\n\n\tapkbound = 6;\n\n\t//save BB default value\n\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t{\n\t\tif(index == 0)\t\t//skip \n\t\t\tcontinue;\t\t\t\t\n\t\tBB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord);\n\t}\n\n\t//save MAC default value\t\t\t\t\t\t\t\t\t\t\t\t\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_SaveMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup);\n\n\t//save AFE default value\n\t_PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n#else\n\t_PHY_SaveMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup);\n\n\t//save AFE default value\n\t_PHY_SaveADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n#endif\n\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\n\n\t\tif(path == RF_PATH_A)\n\t\t{\n\t\t\t//path A APK\n\t\t\t//load APK setting\n\t\t\t//path-A\t\t\n\t\t\toffset = rPdp_AntA;\n\t\t\tfor(index = 0; index < 11; index ++)\t\t\t\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\n\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\n\n\t\t\toffset = rConfig_AntA;\n\t\t\tfor(; index < 13; index ++) \t\t\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\n\n\t\t\t//page-B1\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\n\n\t\t\t//path A\n\t\t\toffset = rPdp_AntA;\n\t\t\tfor(index = 0; index < 16; index++)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]);\t\t\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm,  rFPGA0_IQK, bMaskDWord, 0x00000000);\t\t\t\t\t\t\t\n\t\t}\n\t\telse if(path == RF_PATH_B)\n\t\t{\n\t\t\t//path B APK\n\t\t\t//load APK setting\n\t\t\t//path-B\t\t\n\t\t\toffset = rPdp_AntB;\n\t\t\tfor(index = 0; index < 10; index ++)\t\t\t\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\n\n\t\t\toffset = rConfig_AntA;\n\t\t\tindex = 11;\n\t\t\tfor(; index < 13; index ++) //offset 0xb68, 0xb6c\t\t\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]);\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\n\n\t\t\t//page-B1\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\n\n\t\t\t//path B\n\t\t\toffset = 0xb60;\n\t\t\tfor(index = 0; index < 16; index++)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]);\t\t\n\t\t\t\tODM_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))); \t\n\n\t\t\t\toffset += 0x04;\n\t\t\t}\t\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);\t\t\t\t\t\t\t\n\t\t}\n\n\t\t//save RF default value\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\tregD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord);\n#else\n\t\tregD[path] = ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord);\n#endif\n\n\t\t//Path A AFE all on, path B AFE All off or vise versa\n\t\tfor(index = 0; index < IQK_ADDA_REG_NUM ; index++)\n\t\t\tODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]);\n\t\tODM_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)));\t\t\n\n\t\t//BB to AP mode\n\t\tif(path == 0)\n\t\t{\t\t\t\t\n\t\t\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t\t\t{\n\n\t\t\t\tif(index == 0)\t\t//skip \n\t\t\t\t\tcontinue;\t\t\t\n\t\t\t\telse if (index < 5)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);\n\t\t\t\telse if (BB_REG[index] == 0x870)\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);\n\t\t\t\telse\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x0);\t\t\t\t\t\n\t\t\t}\n\n\t\t\tODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\t\t\t\t\n\t\t}\n\t\telse\t\t//path B\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\t\t\t\t\n\n\t\t}\n\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"phy_APCalibrate_8814A() offset 0x800 %x\\n\", ODM_GetBBReg(pDM_Odm, 0x800, bMaskDWord)));\t\t\t\t\n\n\t\t//MAC settings\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t_PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup);\n#else\n\t\t_PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup);\n#endif\n\n\t\tif(path == RF_PATH_A)\t//Path B to standby mode\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000);\t\t\t\n\t\t}\n\t\telse\t\t\t//Path A to standby mode\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000);\t\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f);\t\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103);\t\t\t\t\t\t\n\t\t}\n\n\t\tdelta_offset = ((delta+14)/2);\n\t\tif(delta_offset < 0)\n\t\t\tdelta_offset = 0;\n\t\telse if (delta_offset > 12)\n\t\t\tdelta_offset = 12;\n\n\t\t//AP calibration\n\t\tfor(index = 0; index < APK_BB_REG_NUM; index++)\n\t\t{\n\t\t\tif(index != 1)\t//only DO PA11+PAD01001, AP RF setting\n\t\t\t\tcontinue;\n\n\t\t\ttmpReg = APK_RF_init_value[path][index];\n#if 1\t\t\t\n\t\t\tif(!pDM_Odm->RFCalibrateInfo.bAPKThermalMeterIgnore)\n\t\t\t{\n\t\t\t\tBB_offset = (tmpReg & 0xF0000) >> 16;\n\n\t\t\t\tif(!(tmpReg & BIT15)) //sign bit 0\n\t\t\t\t{\n\t\t\t\t\tBB_offset = -BB_offset;\n\t\t\t\t}\n\n\t\t\t\tdelta_V = APK_delta_mapping[index][delta_offset];\n\n\t\t\t\tBB_offset += delta_V;\n\n\t\t\t\tODM_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));\n\n\t\t\t\tif(BB_offset < 0)\n\t\t\t\t{\n\t\t\t\t\ttmpReg = tmpReg & (~BIT15);\n\t\t\t\t\tBB_offset = -BB_offset;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttmpReg = tmpReg | BIT15;\n\t\t\t\t}\n\t\t\t\ttmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);\n\t\t\t}\n#endif\n\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord, 0x8992e);\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tODM_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)));\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]);\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  (\"phy_APCalibrate_8814A() offset 0x0 %x\\n\", PHY_QueryRFReg(pAdapter, path, RF_AC, bMaskDWord)));\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg);\n\t\t\tODM_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)));\t\t\t\t\t\n#else\n\t\t\tODM_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)));\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]);\n\t\t\tODM_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)));\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg);\n\t\t\tODM_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)));\t\t\t\t\t\n#endif\n\n\t\t\t// PA11+PAD01111, one shot\t\n\t\t\ti = 0;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\n\t\t\t\t{\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]);\t\t\n\t\t\t\t\tODM_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)));\n\t\t\t\t\tODM_delay_ms(3);\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[1]);\n\t\t\t\t\tODM_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)));\n\n\t\t\t\t\tODM_delay_ms(20);\n\t\t\t\t}\n\t\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\n\n\t\t\t\tif(path == RF_PATH_A)\n\t\t\t\t\ttmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000);\n\t\t\t\telse\n\t\t\t\t\ttmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0xF8000000);\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"phy_APCalibrate_8814A() offset 0xbd8[25:21] %x\\n\", tmpReg));\t\t\n\n\n\t\t\t\ti++;\n\t\t\t}\n\t\t\twhile(tmpReg > apkbound && i < 4);\n\n\t\t\tAPK_result[path][index] = tmpReg;\n\t\t}\n\t}\n\n\t//reload MAC default value\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup);\n#else\n\t_PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup);\n#endif\n\n\t//reload BB default value\t\n\tfor(index = 0; index < APK_BB_REG_NUM ; index++)\n\t{\n\n\t\tif(index == 0)\t\t//skip \n\t\t\tcontinue;\t\t\t\t\t\n\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]);\n\t}\n\n\t//reload AFE default value\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n#else\n\t_PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n#endif\n\n\t//reload RF path default value\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\t\tODM_SetRFReg(pDM_Odm, path, 0xd, bMaskDWord, regD[path]);\n\t\tif(path == RF_PATH_B)\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f);\t\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101);\t\t\t\t\t\t\n\t\t}\n\n\t\t//note no index == 0\n\t\tif (APK_result[path][1] > 6)\n\t\t\tAPK_result[path][1] = 6;\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"apk path %d result %d 0x%x \\t\", path, 1, APK_result[path][1]));\t\t\t\t\t\n\t}\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  (\"\\n\"));\n\n\n\tfor(path = 0; path < pathbound; path++)\n\t{\n\t\tODM_SetRFReg(pDM_Odm, path, 0x3, bMaskDWord, \n\t\t\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));\n\t\tif(path == RF_PATH_A)\n\t\t\tODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, \n\t\t\t\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));\t\t\n\t\telse\n\t\t\tODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, \n\t\t\t\t\t((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));\t\t\t\t\t\t\t\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord, \n\t\t\t\t\t((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));\t\t\t\n#endif\t\t\n\t}\n\n\tpDM_Odm->RFCalibrateInfo.bAPKdone = TRUE;\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"<==phy_APCalibrate_8814A()\\n\"));\n}\n\n\n\n\n\n\nVOID\nPHY_LCCalibrate_8814A(\n\t\tIN PDM_ODM_T\t\tpDM_Odm\n\t\t)\n{\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"===> PHY_LCCalibrate_8814A\\n\"));\n\tphy_LCCalibrate_8814A(pDM_Odm, TRUE);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"<=== PHY_LCCalibrate_8814A\\n\"));\n}\n\nVOID\n\tPHY_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\ts1Byte \t\tdelta\t\n\t\t\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n#ifdef DISABLE_BB_RF\n\treturn;\n#endif\n\n\treturn;\n#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\n\tif(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION))\n\t{\n\t\treturn;\n\t}\n#endif\t\n\n#if defined(FOR_BRAZIL_PRETEST) && (FOR_BRAZIL_PRETEST != 1)\n\tif(pDM_Odm->RFCalibrateInfo.bAPKdone)\n#endif\t\t\n\t\treturn;\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tif(IS_92C_SERIAL( pHalData->VersionID)){\n\t\tphy_APCalibrate_8814A(pAdapter, delta, TRUE);\n\t}\n\telse\n#endif\n\t{\n\t\t// For 88C 1T1R\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\tphy_APCalibrate_8814A(pAdapter, delta, FALSE);\n#else\n\t\tphy_APCalibrate_8814A(pDM_Odm, delta, FALSE);\n#endif\n\t}\n}\n\tVOID phy_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tBOOLEAN\t\tbMain,\n\t\t\tIN\tBOOLEAN\t\tis2T\n\t\t\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tif(!pAdapter->bHWInitReady)\t\n#elif  (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\tif(pAdapter->hw_init_completed == _FALSE)\n#endif\n\t\t{\n\t\t\tu1Byte\tu1bTmp;\n\t\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7;\n\t\t\tODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp);\n\t\t\t//ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01);\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01);\n\t\t}\n\n#endif\t\t\n\n\tif(is2T)\t//92C\n\t{\n\t\tif(bMain)\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1);\t//92C_Path_A\t\t\t\n\t\telse\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2);\t//BT\t\t\t\t\t\t\t\n\t}\n\telse\t\t\t//88C\n\t{\n\n\t\tif(bMain)\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x2);\t//Main\n\t\telse\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x1);\t//Aux\t\t\n\t}\t\n}\n\tVOID PHY_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tBOOLEAN\t\tbMain\n\t\t\t)\n{\n\t//HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n#ifdef DISABLE_BB_RF\n\treturn;\n#endif\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tif (IS_92C_SERIAL(pHalData->VersionID))\n\t{\n\t\tphy_SetRFPathSwitch_8814A(pAdapter, bMain, TRUE);\n\t}\n\telse\n#endif\t\t\n\t{\n\t\t// For 88C 1T1R\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\tphy_SetRFPathSwitch_8814A(pAdapter, bMain, FALSE);\n#else\n\t\tphy_SetRFPathSwitch_8814A(pDM_Odm, bMain, FALSE);\n#endif\n\t}\n}\n\n\n#define\t\tDP_BB_REG_NUM\t\t7\n#define\t\tDP_RF_REG_NUM\t\t1\n#define\t\tDP_RETRY_LIMIT\t\t10\n#define\t\tDP_PATH_NUM\t\t2\n#define\t\tDP_DPK_NUM\t\t\t3\n#define\t\tDP_DPK_VALUE_NUM\t2\n\n\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n//digital predistortion\nVOID\t\n\tphy_DigitalPredistortion_8814A(\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN\tPADAPTER\tpAdapter,\n#else\n\t\t\tIN PDM_ODM_T\tpDM_Odm,\n#endif\n\t\t\tIN\tBOOLEAN\t\tis2T\n\t\t\t)\n{\n#if (RT_PLATFORM == PLATFORM_WINDOWS)\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n\n\tu4Byte\t\t\ttmpReg, tmpReg2, index,  i;\t\t\n\tu1Byte\t\t\tpath, pathbound = PATH_NUM;\n\tu4Byte\t\t\tAFE_backup[IQK_ADDA_REG_NUM];\n\tu4Byte\t\t\tAFE_REG[IQK_ADDA_REG_NUM] = {\t\n\t\trFPGA0_XCD_SwitchControl, \trBlue_Tooth, \t\n\t\trRx_Wait_CCA, \t\trTx_CCK_RFON,\n\t\trTx_CCK_BBON, \trTx_OFDM_RFON, \t\n\t\trTx_OFDM_BBON, \trTx_To_Rx,\n\t\trTx_To_Tx, \t\trRx_CCK, \t\n\t\trRx_OFDM, \t\trRx_Wait_RIFS,\n\t\trRx_TO_Rx, \t\trStandby, \t\n\t\trSleep, \t\t\trPMPD_ANAEN };\n\n\tu4Byte\t\t\tBB_backup[DP_BB_REG_NUM];\t\n\tu4Byte\t\t\tBB_REG[DP_BB_REG_NUM] = {\n\t\trOFDM0_TRxPathEnable, rFPGA0_RFMOD, \n\t\trOFDM0_TRMuxPar, \trFPGA0_XCD_RFInterfaceSW,\n\t\trFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, \n\t\trFPGA0_XB_RFInterfaceOE};\t\t\t\t\t\t\n\tu4Byte\t\t\tBB_settings[DP_BB_REG_NUM] = {\n\t\t0x00a05430, 0x02040000, 0x000800e4, 0x22208000, \n\t\t0x0, 0x0, 0x0};\t\n\n\tu4Byte\t\t\tRF_backup[DP_PATH_NUM][DP_RF_REG_NUM];\n\tu4Byte\t\t\tRF_REG[DP_RF_REG_NUM] = {\n\t\tRF_TXBIAS_A};\n\n\tu4Byte\t\t\tMAC_backup[IQK_MAC_REG_NUM];\n\tu4Byte\t\t\tMAC_REG[IQK_MAC_REG_NUM] = {\n\t\tREG_TXPAUSE, \t\tREG_BCN_CTRL,\t\n\t\tREG_BCN_CTRL_1,\tREG_GPIO_MUXCFG};\n\n\tu4Byte\t\t\tTx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = {\n\t\t{0x1e1e1e1e, 0x03901e1e},\n\t\t{0x18181818, 0x03901818},\n\t\t{0x0e0e0e0e, 0x03900e0e}\n\t};\n\n\tu4Byte\t\t\tAFE_on_off[PATH_NUM] = {\n\t\t0x04db25a4, 0x0b1b25a4};\t//path A on path B off / path A off path B on\n\n\tu1Byte\t\t\tRetryCount = 0;\n\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"==>phy_DigitalPredistortion_8814A()\\n\"));\n\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"phy_DigitalPredistortion_8814A for %s %s\\n\", (is2T ? \"2T2R\" : \"1T1R\")));\n\n\t//save BB default value\n\tfor(index=0; index<DP_BB_REG_NUM; index++)\n\t\tBB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord);\n\n\t//save MAC default value\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_SaveMACRegisters_8814A(pAdapter, BB_REG, MAC_backup);\n#else\n\t_PHY_SaveMACRegisters_8814A(pDM_Odm, BB_REG, MAC_backup);\n#endif\t\n\n\t//save RF default value\n\tfor(path=0; path<DP_PATH_NUM; path++)\n\t{\n\t\tfor(index=0; index<DP_RF_REG_NUM; index++)\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tRF_backup[path][index] = PHY_QueryRFReg(pAdapter, path, RF_REG[index], bMaskDWord);\t\n#else\n\t\tRF_backup[path][index] = ODM_GetRFReg(pAdapter, path, RF_REG[index], bMaskDWord);\t\n#endif\t\n\t}\t\n\n\t//save AFE default value\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\n#else\n\tRF_backup[path][index] = ODM_GetRFReg(pAdapter, path, RF_REG[index], bMaskDWord);\t\n#endif\t\n\n\t//Path A/B AFE all on\n\tfor(index = 0; index < IQK_ADDA_REG_NUM ; index++)\n\t\tODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, 0x6fdb25a4);\n\n\t//BB register setting\n\tfor(index = 0; index < DP_BB_REG_NUM; index++)\n\t{\n\t\tif(index < 4)\n\t\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_settings[index]);\n\t\telse if (index == 4)\n\t\t\tODM_SetBBReg(pDM_Odm,BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);\t\t\t\n\t\telse\n\t\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x00);\t\t\t\n\t}\n\n\t//MAC register setting\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup);\n#else\n\t_PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup);\n#endif\t\n\n\t//PAGE-E IQC setting\t\n\tODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); \t\t\n\tODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);\t\n\tODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\n\tODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);\t\n\n\t//path_A DPK\n\t//Path B to standby mode\n\tODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000);\n\n\t// PA gain = 11 & PAD1 => tx_agc 1f ~11\n\t// PA gain = 11 & PAD2 => tx_agc 10~0e\n\t// PA gain = 01 => tx_agc 0b~0d\n\t// PA gain = 00 => tx_agc 0a~00\n\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\t\n\tODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);\t\t\n\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\t\n\n\t//do inner loopback DPK 3 times \n\tfor(i = 0; i < 3; i++)\n\t{\n\t\t//PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07\n\t\tfor(index = 0; index < 3; index++)\n\t\t\tODM_SetBBReg(pDM_Odm, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]);\t\t\t\n\t\tODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, Tx_AGC[i][1]);\t\t\t\n\t\tfor(index = 0; index < 4; index++)\n\t\t\tODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, Tx_AGC[i][0]);\t\t\t\n\n\t\t// PAGE_B for Path-A inner loopback DPK setting\n\t\tODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02097098);\n\t\tODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84);\n\t\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);\n\t\tODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000);\t\t\n\n\t\t//----send one shot signal----//\n\t\t// Path A\n\t\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x80047788);\n\t\tODM_delay_ms(1);\n\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x00047788);\n\t\tODM_delay_ms(50);\n\t}\n\n\t//PA gain = 11 => tx_agc = 1a\n\tfor(index = 0; index < 3; index++)\t\t\n\t\tODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, 0x34343434);\t\n\tODM_SetBBReg(pDM_Odm,0xe08+index*4, bMaskDWord, 0x03903434);\t\n\tfor(index = 0; index < 4; index++)\t\t\n\t\tODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, 0x34343434);\t\n\n\t//====================================\n\t// PAGE_B for Path-A DPK setting\n\t//====================================\n\t// open inner loopback @ b00[19]:10 od 0xb00 0x01097018\n\tODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02017098);\n\tODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84);\n\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);\n\tODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000);\t\t\n\n\t//rf_lpbk_setup\n\t//1.rf 00:5205a, rf 0d:0e52c\n\tODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0c, bMaskDWord, 0x8992b);\n\tODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0d, bMaskDWord, 0x0e52c); \t\n\tODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bMaskDWord, 0x5205a );\t\t\n\n\t//----send one shot signal----//\n\t// Path A\n\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0);\n\tODM_delay_ms(1);\n\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0);\n\tODM_delay_ms(50);\n\n\twhile(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathAOK)\n\t{\n\t\t//----read back measurement results----//\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c297018);\n\t\ttmpReg = ODM_GetBBReg(pDM_Odm, 0xbe0, bMaskDWord);\n\t\tODM_delay_ms(10);\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c29701f);\n\t\ttmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbe8, bMaskDWord);\n\t\tODM_delay_ms(10);\n\n\t\ttmpReg = (tmpReg & bMaskHWord) >> 16;\n\t\ttmpReg2 = (tmpReg2 & bMaskHWord) >> 16;\t\t\n\t\tif(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff )\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098);\n\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\n\t\t\tODM_delay_ms(1);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0);\n\t\t\tODM_delay_ms(1);\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0);\t\t\t\n\t\t\tODM_delay_ms(50);\t\t\t\n\t\t\tRetryCount++;\t\t\t\n\t\t\tODM_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));\t\t\t\t\t\t\t\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"path A DPK Sucess\\n\"));\t\t\n\t\t\tpDM_Odm->RFCalibrateInfo.bDPPathAOK = TRUE;\n\t\t\tbreak;\n\t\t}\t\t\n\t}\n\tRetryCount = 0;\n\n\t//DPP path A\n\tif(pDM_Odm->RFCalibrateInfo.bDPPathAOK)\n\t{\t\n\t\t// DP settings\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x01017098);\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84);\n\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);\n\t\tODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000);\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\n\n\t\tfor(i=rPdp_AntA; i<=0xb3c; i+=4)\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000);\t\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"path A ofsset = 0x%x\\n\", i));\t\t\n\t\t}\n\n\t\t//pwsf\n\t\tODM_SetBBReg(pDM_Odm, 0xb40, bMaskDWord, 0x40404040);\t\n\t\tODM_SetBBReg(pDM_Odm, 0xb44, bMaskDWord, 0x28324040);\t\t\t\n\t\tODM_SetBBReg(pDM_Odm, 0xb48, bMaskDWord, 0x10141920);\t\t\t\t\t\n\n\t\tfor(i=0xb4c; i<=0xb5c; i+=4)\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c);\t\n\t\t}\t\t\n\n\t\t//TX_AGC boundary\n\t\tODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);\t\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\t\t\t\t\t\n\t}\n\telse\n\t{\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x00000000);\t\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x00000000);\t\t\t\n\t}\n\n\t//DPK path B\n\tif(is2T)\n\t{\n\t\t//Path A to standby mode\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000);\n\n\t\t// LUTs => tx_agc\n\t\t// PA gain = 11 & PAD1, => tx_agc 1f ~11\n\t\t// PA gain = 11 & PAD2, => tx_agc 10 ~0e\n\t\t// PA gain = 01 => tx_agc 0b ~0d\n\t\t// PA gain = 00 => tx_agc 0a ~00\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\t\n\t\tODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);\t\t\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\t\n\n\t\t//do inner loopback DPK 3 times \n\t\tfor(i = 0; i < 3; i++)\n\t\t{\n\t\t\t//PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07\n\t\t\tfor(index = 0; index < 4; index++)\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]);\t\t\t\n\t\t\tfor(index = 0; index < 2; index++)\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]);\t\t\t\n\t\t\tfor(index = 0; index < 2; index++)\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]);\t\t\t\n\n\t\t\t// PAGE_B for Path-A inner loopback DPK setting\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02097098);\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);\t\t\n\n\t\t\t//----send one shot signal----//\n\t\t\t// Path B\n\t\t\tODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntB, bMaskDWord, 0x80047788);\n\t\t\tODM_delay_ms(1);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x00047788);\n\t\t\tODM_delay_ms(50);\n\t\t}\n\n\t\t// PA gain = 11 => tx_agc = 1a\t\n\t\tfor(index = 0; index < 4; index++)\n\t\t\tODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, 0x34343434);\t\n\t\tfor(index = 0; index < 2; index++)\n\t\t\tODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, 0x34343434);\t\n\t\tfor(index = 0; index < 2; index++)\n\t\t\tODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, 0x34343434);\t\n\n\t\t// PAGE_B for Path-B DPK setting\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098);\t\t\n\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84);\t\t\n\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);\t\t\n\t\tODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);\t\t\n\n\t\t// RF lpbk switches on\n\t\tODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x0101000f);\t\t\n\t\tODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x01120103);\t\t\n\n\t\t//Path-B RF lpbk\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0c, bMaskDWord, 0x8992b);\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0d, bMaskDWord, 0x0e52c);\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x5205a); \n\n\t\t//----send one shot signal----//\n\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0);\t\t\n\t\tODM_delay_ms(1);\t\n\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0);\t\t\n\t\tODM_delay_ms(50);\n\n\t\twhile(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathBOK)\n\t\t{\n\t\t\t//----read back measurement results----//\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c297018);\t\t\n\t\t\ttmpReg = ODM_GetBBReg(pDM_Odm, 0xbf0, bMaskDWord);\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c29701f);\t\t\n\t\t\ttmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbf8, bMaskDWord);\n\n\t\t\ttmpReg = (tmpReg & bMaskHWord) >> 16;\n\t\t\ttmpReg2 = (tmpReg2 & bMaskHWord) >> 16;\n\n\t\t\tif(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098);\t\t\n\n\t\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);\n\t\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\n\t\t\t\tODM_delay_ms(1);\n\t\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0);\t\t\n\t\t\t\tODM_delay_ms(1);\t\n\t\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0);\t\t\n\t\t\t\tODM_delay_ms(50);\t\t\t\n\t\t\t\tRetryCount++;\t\t\t\n\t\t\t\tODM_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));\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"path B DPK Success\\n\"));\t\t\t\t\t\t\n\t\t\t\tpDM_Odm->RFCalibrateInfo.bDPPathBOK = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\t\t\t\t\t\t\n\t\t}\n\n\t\t//DPP path B\n\t\tif(pDM_Odm->RFCalibrateInfo.bDPPathBOK)\n\t\t{\n\t\t\t// DP setting\n\t\t\t// LUT by SRAM\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x01017098);\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x776d9f84);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);\n\t\t\tODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);\n\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);\n\t\t\tfor(i=0xb60; i<=0xb9c; i+=4)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000);\t\n\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"path B ofsset = 0x%x\\n\", i));\n\t\t\t}\n\n\t\t\t// PWSF\n\t\t\tODM_SetBBReg(pDM_Odm, 0xba0, bMaskDWord, 0x40404040);\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0xba4, bMaskDWord, 0x28324050);\t\t\t\n\t\t\tODM_SetBBReg(pDM_Odm, 0xba8, bMaskDWord, 0x0c141920);\t\t\t\t\t\n\n\t\t\tfor(i=0xbac; i<=0xbbc; i+=4)\n\t\t\t{\n\t\t\t\tODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c);\t\n\t\t\t}\t\t\n\n\t\t\t// tx_agc boundary\n\t\t\tODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);\t\n\t\t\tODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);\t\t\t\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x00000000);\t\n\t\t\tODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x00000000);\t\t\t\t\t\n\t\t}\n\t}\n\n\t//reload BB default value\n\tfor(index=0; index<DP_BB_REG_NUM; index++)\n\t\tODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]);\n\n\t//reload RF default value\n\tfor(path = 0; path<DP_PATH_NUM; path++)\n\t{\n\t\tfor( i = 0 ; i < DP_RF_REG_NUM ; i++){\n\t\t\tODM_SetRFReg(pDM_Odm, path, RF_REG[i], bMaskDWord, RF_backup[path][i]);\n\t\t}\n\t}\n\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f);\t//standby mode\n\tODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101);\t\t//RF lpbk switches off\n\n\t//reload AFE default value\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t_PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\t\n\n\t//reload MAC default value\t\n\t_PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup);\n#else\n\t_PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\t\n\n\t//reload MAC default value\t\n\t_PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup);\n#endif\t\t\n\n\tpDM_Odm->RFCalibrateInfo.bDPdone = TRUE;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"<==phy_DigitalPredistortion_8814A()\\n\"));\n#endif\t\t\n}\n\nVOID\n\tphy_DigitalPredistortion_8814A_8814A(\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN\tPADAPTER\tpAdapter\n#else\n\t\t\tIN PDM_ODM_T\tpDM_Odm\n#endif\t\t\n\t\t\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n#if DISABLE_BB_RF\n\treturn;\n#endif\n\n\treturn;\n\n\tif(pDM_Odm->RFCalibrateInfo.bDPdone)\n\t\treturn;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\n\tif(IS_92C_SERIAL( pHalData->VersionID)){\n\t\tphy_DigitalPredistortion_8814A(pAdapter, TRUE);\n\t}\n\telse\n#endif\t\t\n\t{\n\t\t// For 88C 1T1R\n\t\tphy_DigitalPredistortion_8814A(pAdapter, FALSE);\n\t}\n}\n\n\n\n//return value TRUE => Main; FALSE => Aux\n\n\tBOOLEAN phy_QueryRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tBOOLEAN\t\tis2T\n\t\t\t)\n{\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#endif\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#endif\n#endif\t\n\tif(!pAdapter->bHWInitReady)\n\t{\n\t\tu1Byte\tu1bTmp;\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7;\n\t\tODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp);\n\t\t//ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01);\n\t\tODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01);\n\t}\n\n\tif(is2T)\t\t//\n\t{\n\t\tif(ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01)\n\t\t\treturn TRUE;\n\t\telse \n\t\t\treturn FALSE;\n\t}\n\telse\n\t{\n\t\tif((ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3) == 0x0) ||\n\t\t\t\t(ODM_GetBBReg(pDM_Odm, rConfig_ram64x16, BIT31) == 0x0))\n\t\t\treturn TRUE;\n\t\telse \n\t\t\treturn FALSE;\n\t}\n}\n\n\n\n//return value TRUE => Main; FALSE => Aux\n\tBOOLEAN PHY_QueryRFPathSwitch_8814A(\t\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm\n#else\n\t\t\tIN\tPADAPTER\tpAdapter\n#endif\n\t\t\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n#if DISABLE_BB_RF\n\treturn TRUE;\n#endif\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\n\t//if(IS_92C_SERIAL( pHalData->VersionID)){\n\tif(IS_2T2R( pHalData->VersionID)){\n\t\treturn phy_QueryRFPathSwitch_8814A(pAdapter, TRUE);\n\t}\n\telse\n#endif\t\t\n\t{\n\t\t// For 88C 1T1R\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\treturn phy_QueryRFPathSwitch_8814A(pAdapter, FALSE);\n#else\n\t\treturn phy_QueryRFPathSwitch_8814A(pDM_Odm, FALSE);\n#endif\n\t}\n}\n#endif\n\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_ap.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL_PHY_RF_8814A_H__\n#define __HAL_PHY_RF_8814A_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define\tIQK_DELAY_TIME_8814A\t\t10\t\t//ms\n#define\tindex_mapping_NUM_8814A\t15\n#define\tAVG_THERMAL_NUM_8814A\t4\n#define\tRF_T_METER_8814A \t\t0x42\n#define\tMAX_PATH_NUM_8814A\t4\n\n#include \"../halphyrf_ap.h\"\n\n\nvoid ConfigureTxpowerTrack_8814A(\n\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t);\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t);\n\nVOID\nConfigureTxpowerTrack_8814A(\n\tIN PTXPWRTRACK_CFG\tpConfig\n\t);\n\n\nVOID\nODM_TxPwrTrackSetPwr8814A(\n\tIN PDM_ODM_T\t\t\tpDM_Odm,\n\tIN PWRTRACK_METHOD \tMethod,\n\tIN u1Byte \t\t\t\tRFPath,\n\tIN u1Byte \t\t\t\tChannelMappedIndex\n\t);\n\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte\t\t\t\tRFPath\n\t);\n\n\n//\n// LC calibrate\n//\nvoid\t\nPHY_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm\n);\n\nvoid\nphy_LCCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\t\t\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\t\t\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\tIN\tBOOLEAN\t\tis2T\n);\n\n\n//\n// AP calibrate\n//\nvoid\t\nPHY_APCalibrate_8814A(\t\t\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\t\t\t\t\t\t\tIN \ts1Byte\t\tdelta);\nvoid\t\nPHY_DigitalPredistortion_8814A(\t\tIN\tPADAPTER\tpAdapter);\n\n\n#if 0 //FOR_8814_IQK\nVOID\n_PHY_SaveADDARegisters(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tpu4Byte\t\tADDAReg,\n\tIN\tpu4Byte\t\tADDABackup,\n\tIN\tu4Byte\t\tRegisterNum\n\t);\n\nVOID\n_PHY_PathADDAOn(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tpu4Byte\t\tADDAReg,\n\tIN\tBOOLEAN\t\tisPathAOn,\n\tIN\tBOOLEAN\t\tis2T\n\t);\n\nVOID\n_PHY_MACSettingCalibration(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tpu4Byte\t\tMACReg,\n\tIN\tpu4Byte\t\tMACBackup\t\n\t);\n\n\n\nVOID\n_PHY_PathAStandBy(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm\n#else\n\tIN\tPADAPTER\tpAdapter\n#endif\n\t);\n\n#endif\n\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_8814A_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_ce.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n\n\n/*---------------------------Define Local Constant---------------------------*/\n// 2010/04/25 MH Define the max tx power tracking tx agc power.\n#define\t\tODM_TXPWRTRACK_MAX_IDX_8814A\t\t6\n\n/*---------------------------Define Local Constant---------------------------*/\n\n//3============================================================\n//3 Tx Power Tracking\n//3============================================================\n\n\n// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte\t\t\t\tRFPath\n\t)\n{\n\ts1Byte\tUpperBound = 10, LowerBound = -5; // 4'b1010 = 10\n\ts1Byte\tFinal_RF_Index = 0;\n\tBOOLEAN\tbPositive = FALSE;\n\tu4Byte\tbitMask = 0;\n\tu1Byte\tFinal_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -10dB\n\tPODM_RF_CAL_T  pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tif(Method == MIX_MODE)\t//normal Tx power tracking\n\t{\n\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"is 8814 MP chip\\n\"));\n\t\tbitMask = BIT19;\n\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath];\n\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"=========================== [Path-%d] TXBB Offset============================\\n\", RFPath));\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Absolute_OFDMSwingIdx[RFPath](%d) = Absolute_OFDMSwingIdx[RFPath](%d) + KfreeOffset[RFPath](%d), RFPath=%d\\n\", pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], pRFCalibrateInfo->KfreeOffset[RFPath], RFPath));\n\n\t\tif (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)\t\t\t\t/* check if RF_Index is positive or not*/\n\t\t\tbPositive = TRUE;\n\t\telse\n\t\t\tbPositive = FALSE;\n\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive);\n\t\t\n\t\tbitMask = BIT18|BIT17|BIT16|BIT15;\n\t\tFinal_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]  / 2;\t/*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/\n\n\t}\n\t\n\tif(Final_RF_Index > UpperBound)\t\t//Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB\n\t{\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound);\t//set RF Reg0x55 per path\n\t\t\t\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1));\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Final_OFDM_Swing_Index(%d) = DefaultOfdmIndex(%d) + (Absolute_OFDMSwingIdx[RFPath](%d) - (UpperBound(%d) << 1)), RFPath=%d\\n\", Final_OFDM_Swing_Index, pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], UpperBound, RFPath));\n\t\t\n\t\tif (Final_OFDM_Swing_Index > TxScalingUpperBound) {\t/* bb swing upper bound = +2dB */\n\t\t\tFinal_OFDM_Swing_Index = TxScalingUpperBound;\n\t\t\tODM_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));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"===========================================================================\\n\"));\n\t\t}\n\n\t\treturn Final_OFDM_Swing_Index;\n\t}\n\telse if(Final_RF_Index < LowerBound)\t// lower bound = -5dB\n\t{\n\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound));\t//set RF Reg0x55 per path\n\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);\n\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Final_OFDM_Swing_Index(%d) = DefaultOfdmIndex(%d) - ((LowerBound(%d)<<1) - Absolute_OFDMSwingIdx[RFPath](%d)), RFPath=%d\\n\", Final_OFDM_Swing_Index, pRFCalibrateInfo->DefaultOfdmIndex, LowerBound, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath));\n\n\t\tif (Final_OFDM_Swing_Index < TxScalingLowerBound) {\t/* BB swing lower bound = -10dB */\n\t\t\tFinal_OFDM_Swing_Index = TxScalingLowerBound;\n\t\t\tODM_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));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"===========================================================================\\n\"));\n\t\t}\n\t\treturn Final_OFDM_Swing_Index;\n\t}\n\telse\t\t// normal case\n\t{\n\n\t\tif(bPositive == TRUE)\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index);\t//set RF Reg0x55 per path\n\t\telse\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index);\t//set RF Reg0x55 per path\n\n\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2;\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Final_OFDM_Swing_Index(%d) = DefaultOfdmIndex(%d) + (Absolute_OFDMSwingIdx[RFPath])//2(%d), RFPath=%d\\n\", Final_OFDM_Swing_Index, pRFCalibrateInfo->DefaultOfdmIndex, (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2, RFPath));\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"===========================================================================\\n\"));\n\n\t\treturn Final_OFDM_Swing_Index;\t\n\t}\n\t\n\treturn FALSE;\n}\n\n\nVOID\nODM_TxPwrTrackSetPwr8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte \t\t\t\tRFPath,\n\tu1Byte \t\t\t\tChannelMappedIndex\n\t)\n{\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\t\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\t\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\tu1Byte\t\t\tFinal_OFDM_Swing_Index = 0; \n\n\t\tif (Method == MIX_MODE)\t\t\t\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\\n\",\n\t\t\t\tpRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath));\n\t\t\n\t\t\tFinal_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath);\n\t\t}\n\t\telse if(Method == TSSI_MODE)\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0);\n\t\t}\n\t\telse if(Method == BBSWING)\t\t// use for mp driver clean power tracking status\n\t\t{\n\t\t\tpRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath];\n\n\t\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);\n\n\t\t\tODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0);\n\t\t}\n\n\t\tif((Method == MIX_MODE) || (Method == BBSWING))\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"=========================== [Path-%d] BBSWING Offset============================\\n\", RFPath));\n\n\t\t\tswitch(RFPath)\n\t\t\t{\n\t\t\t\tcase ODM_RF_PATH_A:\n\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t            \tbreak;\n\n\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\t\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \\n\", Final_OFDM_Swing_Index));\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t(\"Wrong Path name!!!! \\n\"));\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"===========================================================================\\n\"));\n\t\t}\n\t\treturn;\n}\t// ODM_TxPwrTrackSetPwr8814A\n\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n    PADAPTER        Adapter   \t\t = pDM_Odm->Adapter;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tHAL_DATA_TYPE  \t*pHalData  \t\t = GET_HAL_DATA(Adapter);\n\tu1Byte\t\tTxRate\t\t\t= 0xFF;\n\tu1Byte         \tchannel   \t\t = pHalData->CurrentChannel;\n\n\t\n\tif (pDM_Odm->mp_mode == TRUE) {\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t#if (MP_DRIVER == 1)\n\t\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);\n\t\t\t\t\t\n\t\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t\t#endif\n\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);\n\t\t\t\t\n\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t#endif\t\n\t#endif\n\t} else {\n\t\tu2Byte\trate\t = *(pDM_Odm->pForcedDataRate);\n\t\t\n\t\tif (!rate) { /*auto rate*/\n\t\t\tif (pDM_Odm->TxRate != 0xFF) {\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t\t\tTxRate = HwRateToMRate(pDM_Odm->TxRate);\n\t\t\t#endif\n\t\t\t}\n\t\t} else { /*force rate*/\n\t\t\tTxRate = (u1Byte)rate;\n\t\t}\n\t}\n\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Power Tracking TxRate=0x%X\\n\", TxRate));\n\n\tif (1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(TxRate)) {\n\t\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P;\n\t\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N;\n\t\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P;\n\t\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N;\t\t\n\t\t} else {\n\t\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P;\n\t\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N;\n\t\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P;\n\t\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N;\t\t\t\n\t\t}\n\t} else if (36 <= channel && channel <= 64) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0];\n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0];\n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0];\n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0];\n\t} else if (100 <= channel && channel <= 144) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1];\n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1];\n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1];\n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1];\n\t} else if (149 <= channel && channel <= 173) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; \n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; \n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; \n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; \n\t} else {\n\t\t*TemperatureUP_A   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\n\t\t*TemperatureUP_B   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\t\n\t}\n\n\n\t\n\treturn;\n}\n\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n    PADAPTER        Adapter   \t\t = pDM_Odm->Adapter;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tHAL_DATA_TYPE  \t*pHalData  \t\t = GET_HAL_DATA(Adapter);\n\tu1Byte\t\tTxRate\t\t\t= 0xFF;\n\tu1Byte         \tchannel   \t\t = pHalData->CurrentChannel;\n\n\t\n\tif (pDM_Odm->mp_mode == TRUE) {\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t#if (MP_DRIVER == 1)\n\t\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);\n\t\t\t\t\t\n\t\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t\t#endif\n\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);\n\t\t\t\t\n\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t#endif\t\n\t#endif\n\t} else {\n\t\tu2Byte\trate\t = *(pDM_Odm->pForcedDataRate);\n\t\t\n\t\tif (!rate) { /*auto rate*/\n\t\t\tif (pDM_Odm->TxRate != 0xFF) {\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t\t\tTxRate = HwRateToMRate(pDM_Odm->TxRate);\n\t\t\t#endif\n\t\t\t}\n\t\t} else { /*force rate*/\n\t\t\tTxRate = (u1Byte)rate;\n\t\t}\n\t}\n\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Power Tracking TxRate=0x%X\\n\", TxRate));\n\n\tif ( 1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(TxRate)) {\n\t\t\t*TemperatureUP_C  = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P;\n\t\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N;\n\t\t\t *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P;\n\t\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N;\t\t\n\t\t} else {\n\t\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P;\n\t\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N;\n\t\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P;\n\t\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N;\t\t\t\n\t\t}\n\t} else if (36 <= channel && channel <= 64) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0];\n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0];\n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0];\n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0];\n\t} else if (100 <= channel && channel <= 144) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1];\n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1];\n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1];\n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1];\n\t} else if (149 <= channel && channel <= 173) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; \n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; \n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; \n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; \n\t} else {\n\t\t*TemperatureUP_C   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\n\t\t*TemperatureUP_D   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\t\n\t}\n\t\n\treturn;\n}\n\nvoid ConfigureTxpowerTrack_8814A(\n\tPTXPWRTRACK_CFG\tpConfig\n\t)\n{\n\tpConfig->SwingTableSize_CCK = CCK_TABLE_SIZE;\n\tpConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE;\n\tpConfig->Threshold_IQK = 8;\n\tpConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A;\n\tpConfig->RfPathCount = MAX_PATH_NUM_8814A;\n\tpConfig->ThermalRegAddr = RF_T_METER_88E;\n\t\t\n\tpConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A;\n\tpConfig->DoIQK = DoIQK_8814A;\n\tpConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A;\n\tpConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A;\n\tpConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD;\n}\n\nVOID\t\nphy_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tu4Byte\t/*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0, cnt;\n\t\n\t//Check continuous TX and Packet TX\n\tu4Byte\treg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);;\n\n\t// Backup RF reg18.\n\n\tif((reg0x914 & 0x70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);\t\t\t\n\n\t//3 3. Read RF reg18\n\tLC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n\n\t//3 4. Set LC calibration begin bit15\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x1b126);\n\n\tODM_delay_ms(100);\t\t\n\n\tfor (cnt = 0; cnt < 100; cnt++) {\n\t\tif (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)\n\t\t\tbreak;\n\t\tODM_delay_ms(10);\n\t}\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"retry cnt = %d\\n\", cnt));\n\n\tODM_SetRFReg( pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13126);\n\tODM_SetRFReg( pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13124);\n\t//3 Restore original situation\n\tif((reg0x914 & 70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);\t\n\n\t// Recover channel number\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal);\n\n\tDbgPrint(\"Call %s\\n\", __FUNCTION__);\n}\n\n\nVOID\t\nphy_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\ts1Byte \t\tdelta,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n}\n\n\nVOID\nPHY_LCCalibrate_8814A(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tBOOLEAN \t\tbStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\n\tPDM_ODM_T\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tPADAPTER \t\tpAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\t\n\t\n#if (MP_DRIVER == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->MptCtx);\n\tbStartContTx = pMptCtx->bStartContTx;\n\tbSingleTone = pMptCtx->bSingleTone;\n\tbCarrierSuppression = pMptCtx->bCarrierSuppression;\n#else\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\t\t\n#endif\t\n#endif\n#endif\t\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"===> PHY_LCCalibrate_8814A\\n\"));\n\n//#if (MP_DRIVER == 1)\t\n\tphy_LCCalibrate_8814A(pDM_Odm, TRUE);\n//#endif \n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"<=== PHY_LCCalibrate_8814A\\n\"));\n\n}\n\nVOID\nPHY_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\ts1Byte \t\tdelta\t\n\t)\n{\n\n}\n\n\nVOID\t                                                 \nPHY_DPCalibrate_8814A(                                   \n\tIN \tPDM_ODM_T\tpDM_Odm                             \n\t)\n{\n}\n\n\nBOOLEAN \nphy_QueryRFPathSwitch_8814A(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\treturn TRUE;\n}\n\n\nBOOLEAN PHY_QueryRFPathSwitch_8814A(\t\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n#if DISABLE_BB_RF\n\treturn TRUE;\n#endif\n\n\treturn phy_QueryRFPathSwitch_8814A(pAdapter);\n}\n\n\nVOID phy_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n}\nVOID PHY_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain\n\t)\n{\n}\n\n\n\n\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL_PHY_RF_8814A_H__\n#define __HAL_PHY_RF_8814A_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define AVG_THERMAL_NUM_8814A\t4\n#define RF_T_METER_8814A\t\t0x42\n\n#include \"../halphyrf_ce.h\"\n\nvoid ConfigureTxpowerTrack_8814A(\n\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t);\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN\tPVOID\t\tpDM_VOID,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t);\n\nVOID \nODM_TxPwrTrackSetPwr8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte \t\t\t\tRFPath,\n\tu1Byte \t\t\t\tChannelMappedIndex\n\t);\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte\t\t\t\tRFPath\n\t);\n\nVOID\nPHY_IQCalibrate_8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tBOOLEAN\t\tbReCovery\n\t);\n\n//\n// LC calibrate\n//\nvoid\t\nPHY_LCCalibrate_8814A(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n//\n// AP calibrate\n//\nvoid\t\nPHY_APCalibrate_8814A(\t\t\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN \ts1Byte\t\tdelta\n\t);\n\n\nVOID\t                                                 \nPHY_DPCalibrate_8814A(                                   \n\tIN \tPDM_ODM_T\tpDM_Odm                             \n\t);\n\n\nVOID PHY_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain\n\t);\n\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_8188E_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_win.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\n\n\n/*---------------------------Define Local Constant---------------------------*/\n// 2010/04/25 MH Define the max tx power tracking tx agc power.\n#define\t\tODM_TXPWRTRACK_MAX_IDX_8814A\t\t6\n\n/*---------------------------Define Local Constant---------------------------*/\n\n//3============================================================\n//3 Tx Power Tracking\n//3============================================================\n\n// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tu1Byte\t\t\t\tRFPath\n\t)\n{\n\tu1Byte\tUpperBound = 10; // 4'b1010 = 10\n\tu1Byte\tFinal_RF_Index = 0;\n\tBOOLEAN\tbPositive = FALSE;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\tif( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)\t\t\t\t// check if RF_Index is positive or not\n\t{\n\t\tFinal_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1;\n\t\tbPositive = TRUE;\n\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive);\n\t}\n\telse\n\t{\n\t\tFinal_RF_Index = (-1)*pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1;\n\t\tbPositive = FALSE;\n\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive);\n\t}\n\n\tif(bPositive == TRUE)\n\t{\n\t\tif(Final_RF_Index >= UpperBound)\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, UpperBound);\t//set RF Reg0x55 per path\n\t\t\treturn UpperBound;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index);\t//set RF Reg0x55 per path\n\t\t\treturn Final_RF_Index;\n\t\t}\n\t}\n\telse\n\t{\n\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index);\t//set RF Reg0x55 per path\t\n\t\treturn Final_RF_Index;\n\t\t\n\t}\n\t\t\n\treturn FALSE;\n\n}\n\n\n\n\nVOID\nODM_TxPwrTrackSetPwr8814A(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte \t\t\t\tRFPath,\n\tu1Byte \t\t\t\tChannelMappedIndex\n\t)\n{\n\t\tu1Byte\t\t\tFinal_OFDM_Swing_Index = 0; \n\t\tu1Byte\t\t\tFinal_CCK_Swing_Index = 0;\n\t\tu1Byte\t\t\tFinal_RF_Index = 0;\n\t\tu1Byte\t\t\tUpperBound = 10, TxScalingUpperBound = 28; // Upperbound = 4'b1010, TxScalingUpperBound = +2 dB\n\t\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\n\t\t\n\t\tif (Method == MIX_MODE)\n\t\t{\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(\"pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\\n\",\n\t\t\t\tpRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath));\n\t\t\t\n\t\t\tFinal_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath];\t\n\t\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2;\n\t\n\t\t\tFinal_RF_Index = CheckRFGainOffset(pDM_Odm, RFPath);\t\t// check if Final_RF_Index >= 10\n\n\t\t\tif((Final_RF_Index == UpperBound) && (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0))\t\t// check BBSW is not over +2dB\n\t\t\t{\n\t\t\t\tFinal_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1));\n\t\t\t\tif(Final_OFDM_Swing_Index > TxScalingUpperBound)\n\t\t\t\t\tFinal_OFDM_Swing_Index = TxScalingUpperBound;\n\t\t\t}\n\t\t\t\n\t\tswitch(RFPath)\n\t\t\t\t{\n\t\t\t\t\tcase ODM_RF_PATH_A:\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \\n\", Final_OFDM_Swing_Index, Final_RF_Index));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_B:\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \\n\", Final_OFDM_Swing_Index, Final_RF_Index));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_C:\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \\n\", Final_OFDM_Swing_Index, Final_RF_Index));\n\t\t\t\t            \tbreak;\n\n\t\t\t\t\tcase ODM_RF_PATH_D:\n\t\t\t\t\t\t\n\t\t\t\t\t\tODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]);\t//set BBswing\n\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \\n\", Final_OFDM_Swing_Index, Final_RF_Index));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\n\t\t\t\t\t\t\t(\"Wrong Path name!!!! \\n\"));\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\n\t\t\t\n\t\t\t}\n\n\t\treturn;\n}\t// ODM_TxPwrTrackSetPwr8814A\n\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t)\n{\n    PADAPTER        Adapter   \t\t = pDM_Odm->Adapter;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tHAL_DATA_TYPE  \t*pHalData  \t\t = GET_HAL_DATA(Adapter);\n\tu1Byte\t\tTxRate\t\t\t= 0xFF;\n\tu1Byte         \tchannel   \t\t = pHalData->CurrentChannel;\n\n\t\n\tif (pDM_Odm->mp_mode == TRUE) {\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t#if (MP_DRIVER == 1)\n\t\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);\n\t\t\t\t\t\n\t\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t\t#endif\n\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);\n\t\t\t\t\n\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t#endif\t\n\t#endif\n\t} else {\n\t\tu2Byte\trate\t = *(pDM_Odm->pForcedDataRate);\n\t\t\n\t\tif (!rate) { /*auto rate*/\n\t\t\tif (rate != 0xFF) {\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t\t\tTxRate = HwRateToMRate(pDM_Odm->TxRate);\n\t\t\t#endif\n\t\t\t}\n\t\t} else { /*force rate*/\n\t\t\tTxRate = (u1Byte)rate;\n\t\t}\n\t}\n\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Power Tracking TxRate=0x%X\\n\", TxRate));\n\n\tif (1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(TxRate)) {\n\t\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P;\n\t\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N;\n\t\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P;\n\t\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N;\t\t\n\t\t} else {\n\t\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P;\n\t\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N;\n\t\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P;\n\t\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N;\t\t\t\n\t\t}\n\t} else if (36 <= channel && channel <= 64) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0];\n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0];\n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0];\n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0];\n\t} else if (100 <= channel && channel <= 144) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1];\n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1];\n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1];\n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1];\n\t} else if (149 <= channel && channel <= 173) {\n\t\t*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; \n\t\t*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; \n\t\t*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; \n\t\t*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; \n\t} else {\n\t\t*TemperatureUP_A   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\n\t\t*TemperatureUP_B   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\t\n\t}\n\n\t\n\treturn;\n}\n\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t)\n{\n    PADAPTER        Adapter   \t\t = pDM_Odm->Adapter;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tHAL_DATA_TYPE  \t*pHalData  \t\t = GET_HAL_DATA(Adapter);\n\tu1Byte\t\tTxRate\t\t\t= 0xFF;\n\tu1Byte         \tchannel   \t\t = pHalData->CurrentChannel;\n\n\tif (pDM_Odm->mp_mode == TRUE) {\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\n\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t#if (MP_DRIVER == 1)\n\t\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);\n\t\t\t\t\t\n\t\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t\t#endif\n\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\tPMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);\n\t\t\t\t\n\t\t\t\tTxRate = MptToMgntRate(pMptCtx->MptRateIndex);\n\t\t#endif\t\n\t#endif\n\t} else {\n\t\tu2Byte\trate\t = *(pDM_Odm->pForcedDataRate);\n\t\t\n\t\tif (!rate) { /*auto rate*/\n\t\t\tif (rate != 0xFF) {\n\t\t\t#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\n\t\t\t\t\t\tTxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);\n\t\t\t#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\n\t\t\t\t\t\tTxRate = HwRateToMRate(pDM_Odm->TxRate);\n\t\t\t#endif\n\t\t\t}\n\t\t} else { /*force rate*/\n\t\t\tTxRate = (u1Byte)rate;\n\t\t}\n\t}\n\t\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (\"Power Tracking TxRate=0x%X\\n\", TxRate));\n\n\n\tif ( 1 <= channel && channel <= 14) {\n\t\tif (IS_CCK_RATE(TxRate)) {\n\t\t\t*TemperatureUP_C  = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P;\n\t\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N;\n\t\t\t *TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P;\n\t\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N;\t\t\n\t\t} else {\n\t\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P;\n\t\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N;\n\t\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P;\n\t\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N;\t\t\t\n\t\t}\n\t} else if (36 <= channel && channel <= 64) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0];\n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0];\n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0];\n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0];\n\t} else if (100 <= channel && channel <= 144) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1];\n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1];\n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1];\n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1];\n\t} else if (149 <= channel && channel <= 173) {\n\t\t*TemperatureUP_C   = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; \n\t\t*TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; \n\t\t*TemperatureUP_D   = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; \n\t\t*TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; \n\t} else {\n\t\t*TemperatureUP_C   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\n\t\t*TemperatureUP_D   = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E;\n\t\t*TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E;\t\t\n\t}\n\n\t\n\treturn;\n}\n\nvoid ConfigureTxpowerTrack_8814A(\n\tPTXPWRTRACK_CFG\tpConfig\n\t)\n{\n\tpConfig->SwingTableSize_CCK = CCK_TABLE_SIZE;\n\tpConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE;\n\tpConfig->Threshold_IQK = 8;\n\tpConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A;\n\tpConfig->RfPathCount = MAX_PATH_NUM_8814A;\n\tpConfig->ThermalRegAddr = RF_T_METER_88E;\n\t\t\n\tpConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A;\n\tpConfig->DoIQK = DoIQK_8814A;\n\tpConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A;\n\tpConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A;\n\tpConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD;\n}\n\nVOID\t\nphy_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n\tu4Byte\tLC_Cal = 0, cnt;\n\t\n\t//Check continuous TX and Packet TX\n\tu4Byte\treg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);;\n\n\t// Backup RF reg18.\n\tLC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n\n\tif((reg0x914 & 0x70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF);\t\t\t\n\n\t//3 3. Read RF reg18\n\tLC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);\n\t\n\t//3 4. Set LC calibration begin bit15\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000);\n\n\tODM_delay_ms(100);\t\t\n\n\tfor (cnt = 0; cnt < 100; cnt++) {\n\t\tif (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)\n\t\t\tbreak;\t\n\t\tODM_delay_ms(10);\n\t}\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"retry cnt = %d\\n\", cnt));\n\n\n\n\t//3 Restore original situation\n\tif((reg0x914 & 70000) == 0)\n\t\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0x00);\t\n\n\t// Recover channel number\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal);\n\n\tDbgPrint(\"Call %s\\n\", __FUNCTION__);\n}\n\n\nVOID\t\nphy_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\ts1Byte \t\tdelta,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n}\n\n\nVOID\nPHY_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\t\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tPADAPTER \t\tpAdapter = pDM_Odm->Adapter;\n\t\n#if (MP_DRIVER == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->MptCtx);\n#else\n\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\t\t\n#endif\t\n#endif\n#endif\t\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"===> PHY_LCCalibrate_8814A\\n\"));\n\n//#if (MP_DRIVER == 1)\t\n\tphy_LCCalibrate_8814A(pDM_Odm, TRUE);\n//#endif \n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"<=== PHY_LCCalibrate_8814A\\n\"));\n\n}\n\nVOID\nPHY_APCalibrate_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\ts1Byte \t\tdelta\t\n\t)\n{\n\n}\n\n\nVOID\t                                                 \nPHY_DPCalibrate_8814A(                                   \n\tIN \tPDM_ODM_T\tpDM_Odm                             \n\t)\n{\n}\n\n\nBOOLEAN \nphy_QueryRFPathSwitch_8814A(\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\treturn TRUE;\n}\n\n\nBOOLEAN PHY_QueryRFPathSwitch_8814A(\t\n\tIN\tPADAPTER\tpAdapter\n\t)\n{\n\n#if DISABLE_BB_RF\n\treturn TRUE;\n#endif\n\n\treturn phy_QueryRFPathSwitch_8814A(pAdapter);\n}\n\n\nVOID phy_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain,\n\tIN\tBOOLEAN\t\tis2T\n\t)\n{\n}\nVOID PHY_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain\n\t)\n{\n}\n\n\n\n\n#else\t/* (RTL8814A_SUPPORT == 0)*/\nVOID\nPHY_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t){}\n\nVOID\nPHY_IQCalibrate_8814A(\n\tIN\tPDM_ODM_T\tpDM_Odm,\n\tIN\tBOOLEAN bReCovery\n\t){}\n#endif\t/* (RTL8814A_SUPPORT == 0)*/\n"
  },
  {
    "path": "hal/phydm/rtl8814a/halphyrf_8814a_win.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL_PHY_RF_8814A_H__\n#define __HAL_PHY_RF_8814A_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define AVG_THERMAL_NUM_8814A\t4\n\n#include \"halphyrf_win.h\"\n\nvoid ConfigureTxpowerTrack_8814A(\n\tPTXPWRTRACK_CFG\tpConfig\n\t);\n\nVOID\nGetDeltaSwingTable_8814A(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_A,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_A,\n\tOUT pu1Byte \t\t\t*TemperatureUP_B,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_B\t\n\t);\n\nVOID\nGetDeltaSwingTable_8814A_PathCD(\n\tIN \tPDM_ODM_T\t\t\tpDM_Odm,\n\tOUT pu1Byte \t\t\t*TemperatureUP_C,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_C,\n\tOUT pu1Byte \t\t\t*TemperatureUP_D,\n\tOUT pu1Byte \t\t\t*TemperatureDOWN_D\t\n\t);\n\n\nVOID\nODM_TxPwrTrackSetPwr8814A(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tPWRTRACK_METHOD \tMethod,\n\tu1Byte \t\t\t\tRFPath,\n\tu1Byte \t\t\t\tChannelMappedIndex\n\t);\n\nu1Byte\nCheckRFGainOffset(\n\tPDM_ODM_T\t\t\tpDM_Odm,\n\tu1Byte\t\t\t\tRFPath\n\t);\n\n\n//\n// LC calibrate\n//\nvoid\t\nPHY_LCCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t);\n\n//\n// AP calibrate\n//\nvoid\t\nPHY_APCalibrate_8814A(\t\t\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN \ts1Byte\t\tdelta\n\t);\n\n\nVOID\t                                                 \nPHY_DPCalibrate_8814A(                                   \n\tIN \tPDM_ODM_T\tpDM_Odm                             \n\t);\n\n\nVOID PHY_SetRFPathSwitch_8814A(\n#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tIN PDM_ODM_T\t\tpDM_Odm,\n#else\n\tIN\tPADAPTER\tpAdapter,\n#endif\n\tIN\tBOOLEAN\t\tbMain\n\t);\n\n\t\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_PHY_RF_8188E_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_iqk_8814a.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n\n\n/*---------------------------Define Local Constant---------------------------*/\n\n\n/*---------------------------Define Local Constant---------------------------*/\n\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\nvoid DoIQK_8814A(\n\tPVOID\t\tpDM_VOID,\n\tu1Byte \t\tDeltaThermalIndex,\n\tu1Byte\t\tThermalValue,\t\n\tu1Byte \t\tThreshold\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tPADAPTER \t\tAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tODM_ResetIQKResult(pDM_Odm);\t\t\n\n\tpDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue;\n    \n\tPHY_IQCalibrate_8814A(pDM_Odm, FALSE);\n\t\n}\n#else\n/*Originally pConfig->DoIQK is hooked PHY_IQCalibrate_8814A, but DoIQK_8814A and PHY_IQCalibrate_8814A have different arguments*/\nvoid DoIQK_8814A(\n\tPVOID\t\tpDM_VOID,\n\tu1Byte\tDeltaThermalIndex,\n\tu1Byte\tThermalValue,\t\n\tu1Byte\tThreshold\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tBOOLEAN\t\tbReCovery = (BOOLEAN) DeltaThermalIndex;\n\n\tPHY_IQCalibrate_8814A(pDM_Odm, bReCovery);\n}\n#endif\n//1 7.\tIQK\n\nVOID \n_IQK_BackupMacBB_8814A(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN pu4Byte\t\tMAC_backup,\n\tIN pu4Byte\t\tBB_backup,\n\tIN pu4Byte\t\tBackup_MAC_REG,\n\tIN pu4Byte\t\tBackup_BB_REG\n\t)\n{\n\tu4Byte i;\n\t //save MACBB default value\n\tfor (i = 0; i < MAC_REG_NUM_8814; i++){\n\t\tMAC_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MAC_REG[i]);\n\t}\n\tfor (i = 0; i < BB_REG_NUM_8814; i++){\n\t\tBB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_BB_REG[i]);\n\t}\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"BackupMacBB Success!!!!\\n\"));\n}\n\n\nVOID\n_IQK_BackupRF_8814A(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN u4Byte\t\tRF_backup[][4],\n\tIN pu4Byte\t\tBackup_RF_REG\n\t)\t\n{\n\tu4Byte i;\n\t//Save RF Parameters\n    \tfor (i = 0; i < RF_REG_NUM_8814; i++){\n        \tRF_backup[i][ODM_RF_PATH_A] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask);\n\t\tRF_backup[i][ODM_RF_PATH_B] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask);\n\t\tRF_backup[i][ODM_RF_PATH_C] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask);\n\t\tRF_backup[i][ODM_RF_PATH_D] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask);\n    \t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"BackupRF Success!!!!\\n\"));\n}\n\n\nVOID\n_IQK_AFESetting_8814A(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tIN BOOLEAN\t\tDo_IQK\n\t)\n{\n\tif(Do_IQK)\n\t{\n\t\t// IQK AFE Setting RX_WAIT_CCA mode \n\t\tODM_Write4Byte(pDM_Odm, 0xc60, 0x0e808003); \n\t\tODM_Write4Byte(pDM_Odm, 0xe60, 0x0e808003);\n\t\tODM_Write4Byte(pDM_Odm, 0x1860, 0x0e808003);\n\t\tODM_Write4Byte(pDM_Odm, 0x1a60, 0x0e808003);\n\t\tODM_SetBBReg(pDM_Odm, 0x90c, BIT(13), 0x1);\n\t\t \n\t\tODM_SetBBReg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3);\n\t\tODM_SetBBReg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0);\n\n\t\tODM_SetBBReg(pDM_Odm, 0x804, BIT(2), 0x1);\n\t\tODM_SetBBReg(pDM_Odm, 0x804, BIT(2), 0x0);\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"AFE IQK mode Success!!!!\\n\"));\n\t}\n\telse\n\t{\n\t\tODM_Write4Byte(pDM_Odm, 0xc60, 0x07808003);\n\t\tODM_Write4Byte(pDM_Odm, 0xe60, 0x07808003);\n\t\tODM_Write4Byte(pDM_Odm, 0x1860, 0x07808003);\n\t\tODM_Write4Byte(pDM_Odm, 0x1a60, 0x07808003);\n\t\tODM_SetBBReg(pDM_Odm, 0x90c, BIT(13), 0x1);\n\t\n\t\tODM_SetBBReg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3);\n\t\tODM_SetBBReg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0);\n\n\t\tODM_SetBBReg(pDM_Odm, 0x804, BIT(2), 0x1);\n\t\tODM_SetBBReg(pDM_Odm, 0x804, BIT(2), 0x0);\n\t\t\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"AFE Normal mode Success!!!!\\n\"));\n\t}\n\t\n}\n\n\nVOID\n_IQK_RestoreMacBB_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN pu4Byte\t\tMAC_backup,\n\tIN pu4Byte\t\tBB_backup,\n\tIN pu4Byte\t\tBackup_MAC_REG, \n\tIN pu4Byte\t\tBackup_BB_REG\n\t)\t\n{\n\tu4Byte i;\n\t//Reload MacBB Parameters \n    \tfor (i = 0; i < MAC_REG_NUM_8814; i++){\n        \tODM_Write4Byte(pDM_Odm, Backup_MAC_REG[i], MAC_backup[i]);\n    \t}\n\tfor (i = 0; i < BB_REG_NUM_8814; i++){\n        \tODM_Write4Byte(pDM_Odm, Backup_BB_REG[i], BB_backup[i]);\n    \t}\n    \tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"RestoreMacBB Success!!!!\\n\"));\n}\n\nVOID\n_IQK_RestoreRF_8814A(\n\tIN PDM_ODM_T\t\t\tpDM_Odm,\n\tIN pu4Byte\t\t\tBackup_RF_REG,\n\tIN u4Byte \t\t\tRF_backup[][4]\n\t)\n{\t\n\tu4Byte i;\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, bRFRegOffsetMask, 0x0);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, bRFRegOffsetMask, 0x0);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_C, 0xef, bRFRegOffsetMask, 0x0);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_D, 0xef, bRFRegOffsetMask, 0x0);\n\n    \tfor (i = 0; i < RF_REG_NUM_8814; i++){\n        \tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_A]);\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_B]);\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_C]);\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_D]);\n    \t}\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"RestoreRF Success!!!!\\n\"));\n\t\n}\n\nVOID \nPHY_ResetIQKResult_8814A(\n\tIN\tPDM_ODM_T\tpDM_Odm\n)\n{\n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b38, 0x20000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000002);\n\tODM_Write4Byte(pDM_Odm, 0x1b38, 0x20000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000004);\n\tODM_Write4Byte(pDM_Odm, 0x1b38, 0x20000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000006);\n\tODM_Write4Byte(pDM_Odm, 0x1b38, 0x20000000);\n\tODM_Write4Byte(pDM_Odm, 0xc10, 0x100);\n\tODM_Write4Byte(pDM_Odm, 0xe10, 0x100);\n\tODM_Write4Byte(pDM_Odm, 0x1810, 0x100);\n\tODM_Write4Byte(pDM_Odm, 0x1a10, 0x100);\n}\n\nVOID \n_IQK_ResetNCTL_8814A(\n\tIN PDM_ODM_T\n\tpDM_Odm\n)\n{ \n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b80, 0x00000006);\n\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000000);\n\tODM_Write4Byte(pDM_Odm, 0x1b80, 0x00000002);\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"ResetNCTL Success!!!!\\n\"));\n}\n\nVOID \n_IQK_ConfigureMAC_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\t// ========MAC register setting========\n\tODM_Write1Byte(pDM_Odm, 0x522, 0x3f);\n\tODM_SetBBReg(pDM_Odm, 0x550, BIT(11)|BIT(3), 0x0);\n\tODM_Write1Byte(pDM_Odm, 0x808, 0x00);\t\t\t\t//\t\tRX ante off\n\tODM_SetBBReg(pDM_Odm, 0x838, 0xf, 0xe);\t\t\t\t//\t\tCCA off\n\tODM_SetBBReg(pDM_Odm, 0xa14, BIT(9)|BIT(8), 0x3);\t//  \t\tCCK RX Path off\n\tODM_Write4Byte(pDM_Odm, 0xcb0, 0x77777777);\n\tODM_Write4Byte(pDM_Odm, 0xeb0, 0x77777777);\n\tODM_Write4Byte(pDM_Odm, 0x18b4, 0x77777777);\n\tODM_Write4Byte(pDM_Odm, 0x1ab4, 0x77777777);\n\tODM_SetBBReg(pDM_Odm, 0x1abc, 0x0ff00000, 0x77);\n\t/*by YN*/\n\tODM_SetBBReg(pDM_Odm, 0xcbc, 0xf, 0x0);\n}\n\nVOID\n_LOK_One_Shot(\n\tIN\tPVOID\t\tpDM_VOID\n)\n{\t\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPIQK_INFO\tpIQK_info = &pDM_Odm->IQK_info;\n\tu1Byte\t\tPath = 0, delay_count = 0, ii;\n\tBOOLEAN\t\tLOK_notready = FALSE;\n\tu4Byte\t\tLOK_temp1 = 0, LOK_temp2 = 0;\n\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"============ LOK ============\\n\"));\n\tfor(Path =0; Path <=3; Path++){\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t(\"==========S%d LOK ==========\\n\", Path));\n\t\t\n\t\tODM_SetBBReg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path);\t // ADC Clock source\n\t\tODM_Write4Byte(pDM_Odm, 0x1b00, (0xf8000001|(1<<(4+Path))));\t// LOK: CMD ID = 0  {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081}\n\t\tODM_delay_ms(LOK_delay);\n\t\tdelay_count = 0;\n\t\tLOK_notready = TRUE;\n\t\t\n\t\twhile(LOK_notready){\n\t\t\tLOK_notready = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0x1b00, BIT(0));\n\t\t\tODM_delay_ms(1);\n\t\t\tdelay_count++;\n\t\t\tif(delay_count >= 10){\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t\t\t\t(\"S%d LOK timeout!!!\\n\", Path));\n\t\t\t\t\n\t\t\t\t_IQK_ResetNCTL_8814A(pDM_Odm);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t(\"S%d ==> delay_count = 0x%d\\n\", Path, delay_count));\n\t\t\n\t\tif(!LOK_notready){\n\t\t\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1));\n\t\t\tODM_Write4Byte(pDM_Odm, 0x1bd4, 0x003f0001);\n\t\t\tLOK_temp2 = (ODM_GetBBReg(pDM_Odm, 0x1bfc, 0x003e0000)+0x10)&0x1f;\n\t\t\tLOK_temp1 = (ODM_GetBBReg(pDM_Odm, 0x1bfc, 0x0000003e)+0x10)&0x1f;\n\t\t\t\n\t\t\tfor(ii = 1; ii<5; ii++){\n\t\t\t\tLOK_temp1 = LOK_temp1 + ((LOK_temp1 & BIT(4-ii))<<(ii*2));\n\t\t\t\tLOK_temp2 = LOK_temp2 + ((LOK_temp2 & BIT(4-ii))<<(ii*2));\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"LOK_temp1 = 0x%x, LOK_temp2 = 0x%x\\n\", LOK_temp1>>4, LOK_temp2>>4));\n\t\t\t\n\t\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)Path, 0x8, 0x07c00, LOK_temp1>>4);\n\t\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)Path, 0x8, 0xf8000, LOK_temp2>>4);\n\t\t\t\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"==>S%d fill LOK\\n\", Path));\n\n\t\t}\n\t\telse{\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"==>S%d LOK Fail!!!\\n\", Path));\n\t\t\tODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)Path, 0x8, bRFRegOffsetMask, 0x08400);\n\t\t}\n\t\tpIQK_info->LOK_fail[Path] = LOK_notready;\n\t\t\n\t}\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t(\"LOK0_notready = %d, LOK1_notready = %d, LOK2_notready = %d, LOK3_notready = %d\\n\", \n\t\tpIQK_info->LOK_fail[0], pIQK_info->LOK_fail[1], pIQK_info->LOK_fail[2], pIQK_info->LOK_fail[3]));\n}\n\nVOID\n_IQK_One_Shot(\n\tIN\tPVOID\t\tpDM_VOID\n)\n{\t\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPIQK_INFO\tpIQK_info = &pDM_Odm->IQK_info;\n\tu1Byte\t\tPath = 0, delay_count = 0, cal_retry = 0, idx;\n\tBOOLEAN\t\tnotready = TRUE, fail = TRUE;\n\tu4Byte\t\tIQK_CMD;\n\tu2Byte\t\tIQK_Apply[4]\t= {0xc94, 0xe94, 0x1894, 0x1a94};\n\t\n\tfor(idx = 0; idx <= 1; idx++){\t\t\t\t\t\t// ii = 0:TXK , 1: RXK\n\t\n\t\tif(idx == TX_IQK){\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t\t\t(\"============ WBTXIQK ============\\n\"));\n\t\t}\n\t\telse if(idx == RX_IQK){\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t\t\t(\"============ WBRXIQK ============\\n\"));\n\t\t}\t\n\t\t\n\t\tfor(Path =0; Path <=3; Path++){\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"==========S%d IQK ==========\\n\", Path));\n\t\t\tcal_retry = 0;\n\t\t\tfail = TRUE;\n\t\t\twhile(fail){\n\t\t\t\tODM_SetBBReg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path);\t\n\t\t\t\tif(idx == TX_IQK){\n\t\t\t\t\tIQK_CMD = (0xf8000001|(*pDM_Odm->pBandWidth+3)<<8|(1<<(4+Path)));\n\t\t\t\t\t\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t\t\t(\"TXK_Trigger = 0x%x\\n\", IQK_CMD));\n\t\t\t\t\t\t/*  \n\t\t\t\t\t\t{0xf8000311, 0xf8000321, 0xf8000341, 0xf8000381} ==> 20 WBTXK (CMD = 3)\n\t\t\t\t\t\t{0xf8000411, 0xf8000421, 0xf8000441, 0xf8000481} ==> 40 WBTXK (CMD = 4)\n\t\t\t\t\t\t{0xf8000511, 0xf8000521, 0xf8000541, 0xf8000581} ==> 80 WBTXK (CMD = 5)\n\t\t\t\t\t\t*/\n\t\t\t\t\tODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD);\n\t\t\t\t}\n\t\t\t\telse if(idx == RX_IQK){\n\t\t\t\t\tIQK_CMD = (0xf8000001|(9-*pDM_Odm->pBandWidth)<<8|(1<<(4+Path)));\n\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t\t\t(\"TXK_Trigger = 0x%x\\n\", IQK_CMD));\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t{0xf8000911, 0xf8000921, 0xf8000941, 0xf8000981} ==> 20 WBRXK (CMD = 9)\n\t\t\t\t\t\t{0xf8000811, 0xf8000821, 0xf8000841, 0xf8000881} ==> 40 WBRXK (CMD = 8)\n\t\t\t\t\t\t{0xf8000711, 0xf8000721, 0xf8000741, 0xf8000781} ==> 80 WBRXK (CMD = 7)\n\t\t\t\t\t\t*/\n\t\t\t\t\tODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tODM_delay_ms(WBIQK_delay);\n\t\t\t\t\n\t\t\t\tdelay_count = 0;\n\t\t\t\tnotready = TRUE;\n\t\t\t\twhile(notready){\n\t\t\t\t\tnotready = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0x1b00, BIT(0));\n\t\t\t\t\tif(!notready){\n\t\t\t\t\t\t\tfail = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0x1b08, BIT(26));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tODM_delay_ms(1);\n\t\t\t\t\tdelay_count++;\n\t\t\t\t\tif(delay_count >= 20){\n\t\t\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t\t\t\t\t\t(\"S%d IQK timeout!!!\\n\", Path));\n\t\t\t\t\t\t_IQK_ResetNCTL_8814A(pDM_Odm);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(fail)\n\t\t\t\t\tcal_retry++;\n\t\t\t\tif(cal_retry >3 )\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t}\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"S%d ==> 0x1b00 = 0x%x\\n\", Path, ODM_Read4Byte(pDM_Odm, 0x1b00)));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"S%d ==> 0x1b08 = 0x%x\\n\", Path, ODM_Read4Byte(pDM_Odm, 0x1b08)));\n\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t(\"S%d ==> delay_count = 0x%d, cal_retry = %x\\n\", Path, delay_count, cal_retry));\n\t\t\t\n\t\t\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1));\n\t\t\tif(!fail){\n\t\t\t\tif(idx == TX_IQK){\n\t\t\t\t\tpIQK_info->IQC_Matrix[idx][Path] = ODM_Read4Byte(pDM_Odm, 0x1b38);\t\n\t\t\t\t}\n\t\t\t\telse if(idx == RX_IQK){\n\t\t\t\t\tODM_Write4Byte(pDM_Odm, 0x1b3c, 0x20000000);\n\t\t\t\t\tpIQK_info->IQC_Matrix[idx][Path] = ODM_Read4Byte(pDM_Odm, 0x1b3c);\n\t\t\t\t}\n\t\t\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, \n\t\t\t\t\t(\"S%d_IQC = 0x%x\\n\", Path, pIQK_info->IQC_Matrix[idx][Path]));\n\n\t\t\t}\n\t\t\t\n\t\t\tif(idx == RX_IQK){\n\t\t\t\tif(pIQK_info->IQK_fail[TX_IQK][Path] == FALSE)\t\t\t// TXIQK success in RXIQK\n\t\t\t\t\tODM_Write4Byte( pDM_Odm, 0x1b38, pIQK_info->IQC_Matrix[TX_IQK][Path]);\n\t\t\t\telse\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, IQK_Apply[Path], BIT0, 0x0);\n\n\t\t\t\tif(fail)\t\t\t\t\t\t\t\t\t\t\t\t// RXIQK Fail\n\t\t\t\t\tODM_SetBBReg(pDM_Odm, IQK_Apply[Path], (BIT11|BIT10), 0x0);\n\t\t\t}\t\t\n\t\t\t\n\t\t\tpIQK_info->IQK_fail[idx][Path] = fail;\n\t\t\t\n\t\t}\n\t\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, \n\t\t\t(\"IQK0_fail = %d, IQK1_fail = %d, IQK2_fail = %d, IQK3_fail = %d\\n\", \n\t\t\tpIQK_info->IQK_fail[idx][0], pIQK_info->IQK_fail[idx][1], pIQK_info->IQK_fail[idx][2], pIQK_info->IQK_fail[idx][3]));\n\t}\n}\n\nVOID\n_IQK_Tx_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN u1Byte chnlIdx\n\t)\n{\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"BandWidth = %d, ExtPA2G = %d\\n\", *pDM_Odm->pBandWidth, pDM_Odm->ExtPA));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"Interface = %d, pBandType = %d\\n\", pDM_Odm->SupportInterface, *pDM_Odm->pBandType));\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"CutVersion = %x\\n\", pDM_Odm->CutVersion));\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x58, BIT(19), 0x1);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x58, BIT(19), 0x1);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_C, 0x58, BIT(19), 0x1);\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_D, 0x58, BIT(19), 0x1);\n\n\tODM_SetBBReg(pDM_Odm, 0xc94, (BIT11|BIT10|BIT0), 0x401);\n\tODM_SetBBReg(pDM_Odm, 0xe94, (BIT11|BIT10|BIT0), 0x401);\n\tODM_SetBBReg(pDM_Odm, 0x1894, (BIT11|BIT10|BIT0), 0x401);\n\tODM_SetBBReg(pDM_Odm, 0x1a94, (BIT11|BIT10|BIT0), 0x401);\n\t\n\tif(*pDM_Odm->pBandType == ODM_BAND_5G)\n\t\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000ff1);\n\telse\n\t\tODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000ef1);\n\n\tODM_delay_ms(1);\n\n\tODM_Write4Byte(pDM_Odm, 0x810, 0x20101063);\n\tODM_Write4Byte(pDM_Odm, 0x90c, 0x0B00C000);\n\n\t_LOK_One_Shot(pDM_Odm);\n\t_IQK_One_Shot(pDM_Odm);\n\n}\n\nVOID\t\nphy_IQCalibrate_8814A(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN u1Byte\t\tChannel\n\t)\n{\n\t\n\tu4Byte\tMAC_backup[MAC_REG_NUM_8814], BB_backup[BB_REG_NUM_8814], RF_backup[RF_REG_NUM_8814][4];\n\tu4Byte \tBackup_MAC_REG[MAC_REG_NUM_8814] = {0x520, 0x550}; \n\tu4Byte \tBackup_BB_REG[BB_REG_NUM_8814] = {0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0,\n\t\t0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc}; \n\tu4Byte \tBackup_RF_REG[RF_REG_NUM_8814] = {0x0, 0x8f}; \n\tu1Byte \tchnlIdx = ODM_GetRightChnlPlaceforIQK(Channel);\n\t\n\t_IQK_BackupMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG);\n\t_IQK_AFESetting_8814A(pDM_Odm,TRUE);\n\t_IQK_BackupRF_8814A(pDM_Odm, RF_backup, Backup_RF_REG);\n\t_IQK_ConfigureMAC_8814A(pDM_Odm);\n\t_IQK_Tx_8814A(pDM_Odm, chnlIdx);\n\t_IQK_ResetNCTL_8814A(pDM_Odm);  //for 3-wire to  BB use\n\t_IQK_AFESetting_8814A(pDM_Odm,FALSE);\n\t_IQK_RestoreMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG);\n  \t_IQK_RestoreRF_8814A(pDM_Odm, Backup_RF_REG, RF_backup);\n}\n\n/*IQK version:v1.1*/\n/*update 0xcbc setting*/\n\n\nVOID\nPHY_IQCalibrate_8814A(\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tBOOLEAN \tbReCovery\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\n\tPADAPTER \t\tpAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\t\n\t\n\t#if (MP_DRIVER == 1)\n\t\t#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\t\t\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->MptCtx);\t\n\t\t#else// (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\t\t\tPMPT_CONTEXT\tpMptCtx = &(pAdapter->mppriv.MptCtx);\t\t\n\t\t#endif\t\n\t#endif//(MP_DRIVER == 1)\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\n\t\tif (ODM_CheckPowerStatus(pAdapter) == FALSE)\n\t\t\treturn;\n\t#endif\n\n\t#if MP_DRIVER == 1\t\n\t\tif( pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression )\n\t\t\treturn;\n\t#endif\n\t\n#endif\t\n\t#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\n\t\tphy_IQCalibrate_8814A(pDM_Odm, pHalData->CurrentChannel);\n\t\t/*DBG_871X(\"%s,%d, do IQK %u ms\\n\", __func__, __LINE__, rtw_get_passing_time_ms(time_iqk));*/\n\t#else\n\t\tphy_IQCalibrate_8814A(pDM_Odm, *pDM_Odm->pChannel);\n\t#endif\n}\n\nVOID\nPHY_IQCalibrate_8814A_Init(\n\tIN\tPVOID\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPIQK_INFO\tpIQK_info = &pDM_Odm->IQK_info;\n\tu1Byte\tii, jj;\n\t\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, (\"=====>PHY_IQCalibrate_8814A_Init\\n\"));\n\tfor(jj = 0; jj < 2; jj++){\n\t\tfor(ii = 0; ii < NUM; ii++){\n\t\t\tpIQK_info->LOK_fail[ii] = TRUE;\n\t\t\tpIQK_info->IQK_fail[jj][ii] = TRUE;\n\t\t\tpIQK_info->IQC_Matrix[jj][ii] = 0x20000000;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_iqk_8814a.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__PHYDM_IQK_8814A_H__\n#define    __PHYDM_IQK_8814A_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define \tMAC_REG_NUM_8814 2\n#define\tBB_REG_NUM_8814 13\n#define \tRF_REG_NUM_8814 2\n#define\tLOK_delay 1\n#define\tWBIQK_delay 10\n#define \tTX_IQK 0\n#define \tRX_IQK 1\n#define\tNUM 4\t\n/*---------------------------End Define Parameters-------------------------------*/\n\ntypedef struct _IQK_INFORMATION{\n\tBOOLEAN\t\tLOK_fail[NUM];\n\tBOOLEAN\t\tIQK_fail[2][NUM];\n\tu4Byte\t\tIQC_Matrix[2][NUM];\n\tu1Byte      IQKtimes;\n\n}IQK_INFO, *PIQK_INFO;\n\n\n#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\nVOID \nDoIQK_8814A(\n\tPVOID\tpDM_VOID,\n\tu1Byte\t\tDeltaThermalIndex,\n\tu1Byte\t\tThermalValue,\t\n\tu1Byte\t\tThreshold\n\t);\n#else\nVOID \nDoIQK_8814A(\n\tPVOID\t\tpDM_VOID,\n\tu1Byte \t\tDeltaThermalIndex,\n\tu1Byte\t\tThermalValue,\t\n\tu1Byte \t\tThreshold\n\t);\n#endif\n\nVOID\t\nPHY_IQCalibrate_8814A(\t\n\tIN\tPVOID\t\tpDM_VOID,\n\tIN\tBOOLEAN \tbReCovery\n\t);\n\nVOID\nPHY_IQCalibrate_8814A_Init(\n\tIN\tPVOID\t\tpDM_VOID\n\t);\n\n #endif\t/* #ifndef __PHYDM_IQK_8814A_H__*/\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_regconfig8814a.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)  \n\nvoid\nodm_ConfigRFReg_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData,\n\tIN  ODM_RF_RADIO_PATH_E     RF_PATH,\n\tIN\tu4Byte\t\t\t\t    RegAddr\n\t)\n{\n    if(Addr == 0xfe || Addr == 0xffe)\n\t{ \t\t\t\t\t  \n\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\tODM_sleep_ms(50);\n\t\t#else\t\t\n\t\tODM_delay_ms(50);\n\t\t#endif\n\t}\n\telse\n\t{\n\t\tODM_SetRFReg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data);\n\t\t// Add 1us delay between BB/RF register setting.\n\t\tODM_delay_us(1);\n\t}\t\n}\n\n\nvoid \nodm_ConfigRF_RadioA_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t)\n{\n\tu4Byte  content = 0x1000; // RF_Content: radioa_txt\n\tu4Byte\tmaskforPhySet= (u4Byte)(content&0xE000);\n\n    odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, ODM_RF_PATH_A, Addr|maskforPhySet);\n\n    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigRFWithHeaderFile: [RadioA] %08X %08X\\n\", Addr, Data));\n}\n\nvoid \nodm_ConfigRF_RadioB_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t)\n{\n\tu4Byte  content = 0x1001; // RF_Content: radiob_txt\n\tu4Byte\tmaskforPhySet= (u4Byte)(content&0xE000);\n\n    odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, ODM_RF_PATH_B, Addr|maskforPhySet);\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigRFWithHeaderFile: [RadioB] %08X %08X\\n\", Addr, Data));\n    \n}\n\nvoid \nodm_ConfigRF_RadioC_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t)\n{\n\tu4Byte  content = 0x1001; // RF_Content: radiob_txt\n\tu4Byte\tmaskforPhySet= (u4Byte)(content&0xE000);\n\n    odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, ODM_RF_PATH_C, Addr|maskforPhySet);\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigRFWithHeaderFile: [RadioC] %08X %08X\\n\", Addr, Data));\n    \n}\n\nvoid \nodm_ConfigRF_RadioD_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t)\n{\n\tu4Byte  content = 0x1001; // RF_Content: radiob_txt\n\tu4Byte\tmaskforPhySet= (u4Byte)(content&0xE000);\n\n    odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, ODM_RF_PATH_D, Addr|maskforPhySet);\n\t\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigRFWithHeaderFile: [RadioD] %08X %08X\\n\", Addr, Data));\n    \n}\n\nvoid \nodm_ConfigMAC_8814A(\n \tIN \tPDM_ODM_T \tpDM_Odm,\n \tIN \tu4Byte \t\tAddr,\n \tIN \tu1Byte \t\tData\n \t)\n{\n\tODM_Write1Byte(pDM_Odm, Addr, Data);\n    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigMACWithHeaderFile: [MAC_REG] %08X %08X\\n\", Addr, Data));\n}\n\nvoid \nodm_ConfigBB_AGC_8814A(\n    IN \tPDM_ODM_T \tpDM_Odm,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    )\n{\n\tODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data);\t\t\n\t// Add 1us delay between BB/RF register setting.\n\tODM_delay_us(1);\n\n    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigBBWithHeaderFile: [AGC_TAB] %08X %08X\\n\", Addr, Data));\n}\n\nvoid\nodm_ConfigBB_PHY_REG_PG_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n\tIN\tu4Byte\t\tBand,\n\tIN\tu4Byte\t\tRfPath,\n\tIN\tu4Byte\t\tTxNum,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    )\n{    \n\tif (Addr == 0xfe || Addr == 0xffe)\n\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\tODM_sleep_ms(50);\n\t\t#else\t\t\n\t\tODM_delay_ms(50);\n\t\t#endif\n    else \n    {\n#if\t!(DM_ODM_SUPPORT_TYPE&ODM_AP)\n\t    PHY_StoreTxPowerByRate(pDM_Odm->Adapter, Band, RfPath, TxNum, Addr, Bitmask, Data);\n#endif\n    }\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, (\"===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\\n\", Addr, Bitmask, Data));\n}\n\nvoid \nodm_ConfigBB_PHY_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    )\n{    \n\tif (Addr == 0xfe)\n\t\t#ifdef CONFIG_LONG_DELAY_ISSUE\n\t\tODM_sleep_ms(50);\n\t\t#else\t\t\n\t\tODM_delay_ms(50);\n\t\t#endif\n\telse if (Addr == 0xfd)\n\t\tODM_delay_ms(5);\n\telse if (Addr == 0xfc)\n\t\tODM_delay_ms(1);\n\telse if (Addr == 0xfb)\n\t\tODM_delay_us(50);\n\telse if (Addr == 0xfa)\n\t\tODM_delay_us(5);\n\telse if (Addr == 0xf9)\n\t\tODM_delay_us(1);\n\telse \n\t{\n\t\tODM_SetBBReg(pDM_Odm, Addr, Bitmask, Data);\t\t\n\t}\n\t\n\t// Add 1us delay between BB/RF register setting.\n\tODM_delay_us(1);\n    ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, (\"===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X\\n\", Addr, Data));\n}\n\nvoid\nodm_ConfigBB_TXPWR_LMT_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n\tIN\tpu1Byte\t\tRegulation,\n\tIN\tpu1Byte\t\tBand,\n\tIN\tpu1Byte\t\tBandwidth,\n\tIN\tpu1Byte\t\tRateSection,\n\tIN\tpu1Byte\t\tRfPath,\n\tIN\tpu1Byte \tChannel,\n\tIN\tpu1Byte\t\tPowerLimit\n    )\n{\n#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\n\tPHY_SetTxPowerLimit(pDM_Odm, Regulation, Band,\n\t\tBandwidth, RateSection, RfPath, Channel, PowerLimit);\n#endif\n}\n#endif\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_regconfig8814a.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_ODM_REGCONFIG_H_8814A\n#define __INC_ODM_REGCONFIG_H_8814A\n \n#if (RTL8814A_SUPPORT == 1)\n\nvoid\nodm_ConfigRFReg_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData,\n\tIN  ODM_RF_RADIO_PATH_E     RF_PATH,\n\tIN\tu4Byte\t\t\t\t    RegAddr\n\t);\n\nvoid \nodm_ConfigRF_RadioA_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t);\n\nvoid \nodm_ConfigRF_RadioB_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t);\n\nvoid \nodm_ConfigRF_RadioC_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t);\n\nvoid \nodm_ConfigRF_RadioD_8814A(\n\tIN \tPDM_ODM_T \t\t\t\tpDM_Odm,\n\tIN \tu4Byte \t\t\t\t\tAddr,\n\tIN \tu4Byte \t\t\t\t\tData\n\t);\n\nvoid \nodm_ConfigMAC_8814A(\n \tIN \tPDM_ODM_T \tpDM_Odm,\n \tIN \tu4Byte \t\tAddr,\n \tIN \tu1Byte \t\tData\n \t);\n\nvoid \nodm_ConfigBB_AGC_8814A(\n    IN \tPDM_ODM_T \tpDM_Odm,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    );\n\nvoid\nodm_ConfigBB_PHY_REG_PG_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n\tIN\tu4Byte\t\tBand,\n\tIN\tu4Byte\t\tRfPath,\n\tIN\tu4Byte\t\tTxNum,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    );\n\nvoid \nodm_ConfigBB_PHY_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n    IN \tu4Byte \t\tAddr,\n    IN \tu4Byte \t\tBitmask,\n    IN \tu4Byte \t\tData\n    );\n\nvoid\nodm_ConfigBB_TXPWR_LMT_8814A(\n\tIN \tPDM_ODM_T \tpDM_Odm,\n\tIN\tpu1Byte\t\tRegulation,\n\tIN\tpu1Byte\t\tBand,\n\tIN\tpu1Byte\t\tBandwidth,\n\tIN\tpu1Byte\t\tRateSection,\n\tIN\tpu1Byte\t\tRfPath,\n\tIN\tpu1Byte \tChannel,\n\tIN\tpu1Byte\t\tPowerLimit\n    );\n#endif\n#endif // end of SUPPORT\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_rtl8814a.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n//============================================================\n// include files\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (RTL8814A_SUPPORT == 1)\n\nVOID\nodm_Write_Dynamic_CCA_8814A(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\tCurrentMFstate\n\t)\n{\n\tpPri_CCA_T\t\tPrimaryCCA = &(pDM_Odm->DM_PriCCA);  \n\t\n\tif (PrimaryCCA->MF_state != CurrentMFstate){\n\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, CurrentMFstate);  \n\t}\t\t\n\t\n\tPrimaryCCA->MF_state = CurrentMFstate;\n\n}\n\nVOID\nodm_PrimaryCCA_Check_Init_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm)\n{\n#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) || (DM_ODM_SUPPORT_TYPE == ODM_AP))\n\tPADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n\tpPri_CCA_T\t\tPrimaryCCA = &(pDM_Odm->DM_PriCCA);  \n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tpHalData->RTSEN = 0;\n\tPrimaryCCA->DupRTS_flag = 0;\n\tPrimaryCCA->intf_flag = 0;\n\tPrimaryCCA->intf_type = 0;\n\tPrimaryCCA->Monitor_flag = 0;\n\tPrimaryCCA->PriCCA_flag = 0;\n\tPrimaryCCA->CH_offset = 0;\n\tPrimaryCCA->MF_state = 0;\n#endif /*((DM_ODM_SUPPORT_TYPE==ODM_WIN) ||(DM_ODM_SUPPORT_TYPE==ODM_AP)) */\n}\n\nVOID\nodm_DynamicPrimaryCCA_Check_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tif(pDM_Odm->SupportICType != ODM_RTL8814A) \n\t\treturn;\n\n\tswitch\t(pDM_Odm->SupportPlatform)\n\t{\n\t\tcase\tODM_WIN:\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\n\t\t\todm_DynamicPrimaryCCAMP_8814A(pDM_Odm);\n#endif\n\t\t\tbreak;\n\n\t\tcase\tODM_CE:\n#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\n\t\t\n#endif\n\t\t\tbreak;\n\n\t\tcase\tODM_AP:\n#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\t\t\todm_DynamicPrimaryCCAAP_8814A(pDM_Odm);\n#endif\n\t\t\tbreak;\t\n\t\t}\n\n}\n\n\n#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\n\nVOID\nodm_DynamicPrimaryCCAMP_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tPADAPTER\t\tpAdapter = pDM_Odm->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPFALSE_ALARM_STATISTICS\t\tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tpPri_CCA_T\t\tPrimaryCCA = &(pDM_Odm->DM_PriCCA);  \n\tBOOLEAN\t\t\tIs40MHz = FALSE;\n\tu8Byte\t\t\tOFDM_CCA, OFDM_FA, BW_USC_Cnt, BW_LSC_Cnt;\n\tu1Byte\t\t\tSecCHOffset;\n\tu1Byte\t\t\tCurMFstate;\n\tstatic u1Byte\t\tCountDown = Monitor_TIME;\n\t\n\tOFDM_CCA = FalseAlmCnt->Cnt_OFDM_CCA;\n\tOFDM_FA = FalseAlmCnt->Cnt_Ofdm_fail;\n\tBW_USC_Cnt = FalseAlmCnt->Cnt_BW_USC;\n\tBW_LSC_Cnt = FalseAlmCnt->Cnt_BW_LSC;\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: OFDM CCA=%d\\n\", OFDM_CCA));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: OFDM FA=%d\\n\", OFDM_FA));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: BW_USC=%d\\n\", BW_USC_Cnt));\n\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: BW_LSC=%d\\n\", BW_LSC_Cnt)); \n       Is40MHz = *(pDM_Odm->pBandWidth);\n\tSecCHOffset = *(pDM_Odm->pSecChOffset);\t\t// NIC: 2: sec is below,  1: sec is above\n\t//DbgPrint(\"8814A: SecCHOffset = %d\\n\", SecCHOffset);\n\tif(!pDM_Odm->bLinked){\n\t\treturn;\n\t}\n\telse{\n\t\t\n\t\tif(Is40MHz){\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: Cont Down= %d\\n\", CountDown));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: Primary_CCA_flag=%d\\n\", PrimaryCCA->PriCCA_flag));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: Intf_Type=%d\\n\", PrimaryCCA->intf_type));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: Intf_flag=%d\\n\", PrimaryCCA->intf_flag ));\n\t\t\tODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, (\"8814A: Duplicate RTS Flag=%d\\n\", PrimaryCCA->DupRTS_flag));\n\t\t\t//DbgPrint(\"8814A RTS_EN=%d\\n\", pHalData->RTSEN);\n\n\t\t\tif(PrimaryCCA->PriCCA_flag == 0){\n\n\t\t\t\tif(SecCHOffset == 2){    // Primary channel is above   NOTE: duplicate CTS can remove this condition\n\n\t\t\t\t\tif((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias)) \n\t\t\t\t\t\t&& (OFDM_FA>(OFDM_CCA>>1))){\n\n\t\t\t\t\t\tPrimaryCCA->intf_type = 1;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 1;\n\t\t\t\t\t\tCurMFstate = MF_USC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);\n\t\t\t\t\t\tPrimaryCCA->PriCCA_flag = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias))\n\t\t\t\t\t\t&& (OFDM_FA < (OFDM_CCA>>1))){\n\n \t\t\t\t\t\tPrimaryCCA->intf_type = 2;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 1;\n\t\t\t\t\t\tCurMFstate = MF_USC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);\n\t\t\t\t\t\tPrimaryCCA->PriCCA_flag = 1;\n\t\t\t\t\t\tPrimaryCCA->DupRTS_flag = 1;   \n\t\t\t\t\t\tpHalData->RTSEN = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\t\n\t\t\t\t\t\tPrimaryCCA->intf_type = 0;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 0;\n\t\t\t\t\t\tCurMFstate = MF_USC_LSC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);\n\t\t\t\t\t\tpHalData->RTSEN = 0;\n\t\t\t\t\t\tPrimaryCCA->DupRTS_flag = 0;\n\t\t\t\t\t}\n\t\t\t\n\t\t\t\t}\n\t\t\t\telse if (SecCHOffset == 1){\n\n\t\t\t\t\tif((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt > (BW_LSC_Cnt + BW_Ind_Bias)) \n\t\t\t\t\t\t&& (OFDM_FA > (OFDM_CCA>>1))){\n\t\t\t\t\n\t\t\t\t\t\tPrimaryCCA->intf_type = 1;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 1;\n\t\t\t\t\t\tCurMFstate = MF_LSC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);\n\t\t\t\t\t\tPrimaryCCA->PriCCA_flag = 1;\n\t\t\t\t\t}\t\t\t\n\t\t\t\t\telse if((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt>(BW_LSC_Cnt + BW_Ind_Bias))\n\t\t\t\t\t\t&& (OFDM_FA < (OFDM_CCA>>1))){\n\n \t\t\t\t\t\tPrimaryCCA->intf_type = 2;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 1;\n\t\t\t\t\t\tCurMFstate = MF_LSC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\t\t\t\t\tPrimaryCCA->PriCCA_flag = 1;\n\t\t\t\t\t\tPrimaryCCA->DupRTS_flag = 1;\n\t\t\t\t\t\tpHalData->RTSEN = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\n\t\t\t\t\t\tPrimaryCCA->intf_type = 0;\n\t\t\t\t\t\tPrimaryCCA->intf_flag = 0;\n\t\t\t\t\t\tCurMFstate = MF_USC_LSC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);\n\t\t\t\t\t\tpHalData->RTSEN = 0;\n\t\t\t\t\t\tPrimaryCCA->DupRTS_flag = 0;\n\t\t\t\t\t}\n\n\t\t\t\t}\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\telse{\t// PrimaryCCA->PriCCA_flag==1\n\t\t\t\n\t\t\t\tCountDown--;\n\t\t\t\tif(CountDown == 0){\n\t\t\t\t\tCountDown = Monitor_TIME;\n\t\t\t\t\tPrimaryCCA->PriCCA_flag = 0;\n\t\t\t\t\tCurMFstate = MF_USC_LSC;\n\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate);   /* default*/\n\t\t\t\t\tpHalData->RTSEN = 0;\n\t\t\t\t\tPrimaryCCA->DupRTS_flag = 0;\n\t\t\t\t\tPrimaryCCA->intf_type = 0;\n\t\t\t\t\tPrimaryCCA->intf_flag = 0;\n\t\t\t\t}\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t}\n\t\telse{\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t}\n\t\n}\t\n\n#elif(DM_ODM_SUPPORT_TYPE == ODM_AP)\n\nVOID\nodm_DynamicPrimaryCCAAP_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\tprtl8192cd_priv\tpriv = pDM_Odm->priv;\n\tPFALSE_ALARM_STATISTICS\t\tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tpPri_CCA_T\t\tPrimaryCCA = &(pDM_Odm->DM_PriCCA);  \n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu1Byte \t\ti;\t\n\tstatic u4Byte\tCount_Down = Monitor_TIME;\n\tBOOLEAN\t\tSTA_BW = FALSE, STA_BW_pre = FALSE, STA_BW_TMP = FALSE;\n\tBOOLEAN\t\tbConnected = FALSE;\n\tBOOLEAN\t\tIs40MHz = FALSE;\n\tu1Byte\t\tSecCHOffset;\n\tu1Byte\t\tCurMFstate;\n\tPSTA_INFO_T\t\tpstat;\t\n\n\tIs40MHz = *(pDM_Odm->pBandWidth);\n\tSecCHOffset = *(pDM_Odm->pSecChOffset);\t\t// AP: 1: sec is below,  2: sec is above\n\n\n\tfor(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){\n\t\tpstat = pDM_Odm->pODM_StaInfo[i];\n\t\tif(IS_STA_VALID(pstat)){\n\n\t\t\tSTA_BW_TMP = pstat->tx_bw;\n\t\t\tif(STA_BW_TMP > STA_BW){\n\t\t\t\tSTA_BW = STA_BW_TMP;\n\t\t\t}\n\t\t\tbConnected = TRUE;\n\t\t}\n\t}\n\n\tif(Is40MHz){\n\t\t\n\t\tif(PrimaryCCA->PriCCA_flag == 0){\n\n\t\t\tif(bConnected){\n\n\t\t\t\tif(STA_BW == 0){   //2 STA BW=20M\n\n\t\t\t\t\tPrimaryCCA->PriCCA_flag = 1;\n\t\t\t\t\tif(SecCHOffset==1){\n\t\t\t\t\t\tCurMFstate = MF_USC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\t\t\t\t}\n\t\t\t\t\telse if(SecCHOffset==2){\n\t\t\t\t\t\tCurMFstate = MF_USC;\n\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse{     \t\t \t//2  STA BW=40M\n\t\t\t\t\tif(PrimaryCCA->intf_flag == 0){\n\n\t\t\t\t\t\todm_Intf_Detection(pDM_Odm);\n\t\t\t\t\t}\n\t\t\t\t\telse{\t// intf_flag = 1 \n\t\t\t\t\t\n\t\t\t\t\t\tif(PrimaryCCA->intf_type == 1){\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(PrimaryCCA->CH_offset == 1){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tCurMFstate = MF_USC;\n\t\t\t\t\t\t\t\tif(SecCHOffset == 1){  // AP,  1: primary is above  2: primary is below\n\t\t\t\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(PrimaryCCA->CH_offset == 2){\n\n\t\t\t\t\t\t\t\tCurMFstate = MF_LSC;\n\t\t\t\t\t\t\t\tif(SecCHOffset == 2){\n\t\t\t\t\t\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\telse if(PrimaryCCA->intf_type==2){\n\n\t\t\t\t\t\t\tif(PrimaryCCA->CH_offset==1){\n\n\t\t\t\t\t\t\t\t//ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_USC); \n\t\t\t\t\t\t\t\tpHalData->RTSEN = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(PrimaryCCA->CH_offset==2){\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t//ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_LSC); \n\t\t\t\t\t\t\t\tpHalData->RTSEN = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\telse{\t\t// disconnected  interference detection\n\t\t\t\n\t\t\t\todm_Intf_Detection(pDM_Odm);\n\t\t\t}// end of disconnected\n\n\n\t\t}\n\t\telse{\t// PrimaryCCA->PriCCA_flag == 1\n\n\t\t\tif(STA_BW==0){\n\t\t\t\t\n\t\t\t\tSTA_BW_pre = STA_BW;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tCount_Down--;\n\t\t\tif((Count_Down == 0) || ((STA_BW & STA_BW_pre) != 1)){\n\n\t\t\t\tCount_Down = Monitor_TIME;\n\t\t\t\tPrimaryCCA->PriCCA_flag = 0;\n\t\t\t\tPrimaryCCA->intf_type = 0;\n\t\t\t\tPrimaryCCA->intf_flag = 0;\n\t\t\t\tCurMFstate = MF_USC_LSC;\n\t\t\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); /* default*/\n\t\t\t\tpHalData->RTSEN = 0;\n\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tSTA_BW_pre = STA_BW;\n\n\t}\n\telse{\n\t\t//2 Reset\n\t\todm_PrimaryCCA_Check_Init(pDM_Odm);\n\t\tCurMFstate = MF_USC_LSC;\n\t\todm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); \n\t\tCount_Down = Monitor_TIME;\n\t}\n\n}\n\n\nVOID\nodm_Intf_Detection_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tPFALSE_ALARM_STATISTICS\t\tFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\n\tpPri_CCA_T\t\t\t\t\tPrimaryCCA = &(pDM_Odm->DM_PriCCA);  \n\n\tif((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH)\n\t\t&&(FalseAlmCnt->Cnt_BW_LSC>(FalseAlmCnt->Cnt_BW_USC+BW_Ind_Bias))){\n\n\t\tPrimaryCCA->intf_flag = 1;\n\t\tPrimaryCCA->CH_offset = 1;  //  1:LSC, 2:USC\n\t\tif(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){\n\t\t\tPrimaryCCA->intf_type = 1;\n\t\t}\n\t\telse{\n\t\t\tPrimaryCCA->intf_type = 2;\n\t\t}\n\t}\n\telse if((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH)\n\t\t&&(FalseAlmCnt->Cnt_BW_USC>(FalseAlmCnt->Cnt_BW_LSC+BW_Ind_Bias))){\n\n\t\tPrimaryCCA->intf_flag = 1;\n\t\tPrimaryCCA->CH_offset = 2;  //  1:LSC, 2:USC\n\t\tif(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){\n\t\t\tPrimaryCCA->intf_type = 1;\n\t\t}\n\t\telse{\n\t\t\tPrimaryCCA->intf_type = 2;\n\t\t}\n\t}\n\telse{\n\t\tPrimaryCCA->intf_flag = 0;\n\t\tPrimaryCCA->intf_type = 0;\n\t\tPrimaryCCA->CH_offset = 0;\n\t}\n\n}\n\n#endif\n\nu1Byte\nphydm_spur_nbi_setting_8814a(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t)\n{\n\tu1Byte\tset_result = 0;\n\n\t/*pDM_Odm->pChannel means central frequency, so we can use 20M as input*/\n\tif (pDM_Odm->RFEType == 0 || pDM_Odm->RFEType == 1 || pDM_Odm->RFEType == 6) {\n\t\t/*channel asked by RF Jeff*/\n\t\tif (*pDM_Odm->pChannel == 14)\n\t\t\tset_result = phydm_nbi_setting(pDM_Odm,\tNBI_ENABLE, *pDM_Odm->pChannel, 40, 2480, PHYDM_DONT_CARE);\n\t\telse if (*pDM_Odm->pChannel >= 4 || *pDM_Odm->pChannel <= 8)\n\t\t\tset_result = phydm_nbi_setting(pDM_Odm,\tNBI_ENABLE, *pDM_Odm->pChannel, 40, 2440, PHYDM_DONT_CARE);\n\t\telse\n\t\t\tset_result = phydm_nbi_setting(pDM_Odm,\tNBI_DISABLE, *pDM_Odm->pChannel, 40, 2440, PHYDM_DONT_CARE);\n\t}\n\tODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, (\"%s, set_result = 0x%d, pChannel = %d\\n\", __func__, set_result, *pDM_Odm->pChannel));\n\t//printk(\"%s, set_result = 0x%d, pChannel = %d\\n\", __func__, set_result, *pDM_Odm->pChannel);\n\tpDM_Odm->nbi_set_result = set_result;\n\treturn set_result;\n\n}\n\n\n\n#endif\t\t// RTL8814A_SUPPORT == 1\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "hal/phydm/rtl8814a/phydm_rtl8814a.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__ODM_RTL8814A_H__\n#define __ODM_RTL8814A_H__\n\n#define\tOFDMCCA_TH\t500\n#define\tBW_Ind_Bias\t500\n#define\tMF_USC\t\t\t2\n#define\tMF_LSC\t\t\t1\n#define\tMF_USC_LSC\t\t0\n#define\tMonitor_TIME\t30\n\nVOID\nodm_Write_Dynamic_CCA_8814A(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\tCurrentMFstate\n\t);\n\nVOID\nodm_PrimaryCCA_Check_Init_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\nVOID\nodm_DynamicPrimaryCCA_Check_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\nVOID\nodm_DynamicPrimaryCCAMP_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\n\nVOID\nodm_DynamicPrimaryCCAAP_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\nVOID\nodm_Intf_Detection_8814A(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n\t);\n\n#endif\n\nu1Byte\nphydm_spur_nbi_setting_8814a(\n\tIN\t\tPDM_ODM_T\t\tpDM_Odm\n);\n\n#endif\n"
  },
  {
    "path": "hal/phydm/rtl8814a/version_rtl8814a.h",
    "content": "/*RTL8814A PHY Parameters*/\n/* \n[Caution] \n  Since 01/Aug/2015, the commit rules will be simplified. \n  You do not need to fill up the version.h anymore, \n  only the maintenance supervisor fills it before formal release.\n*/\n#define\tRELEASE_DATE_8814A\t\t20150908\n#define\tCOMMIT_BY_8814A\t\t\t\"BB_LUKE\"\n#define\tRELEASE_VERSION_8814A\t81\n"
  },
  {
    "path": "hal/phydm/txbf/halcomtxbf.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for TXBF mechanism\n//\n//============================================================\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n/*Beamforming halcomtxbf API create by YuChen 2015/05*/\n\nVOID\nhalComTxbf_beamformInit(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_Init(pDM_Odm);\n}\n\n/*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/\nVOID\nhalComTxbf_ConfigGtab(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_ConfigGtab(pDM_Odm);\n}\n\nVOID\nphydm_beamformSetSoundingEnter(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_EnterWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_EnterWorkItem));\n#else\n\thalComTxbf_EnterWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetSoundingLeave(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_LeaveWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_LeaveWorkItem));\n#else\n\thalComTxbf_LeaveWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetSoundingRate(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_RateWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_RateWorkItem));\n#else\n\thalComTxbf_RateWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetSoundingStatus(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_StatusWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_StatusWorkItem));\n#else\n\thalComTxbf_StatusWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetSoundingFwNdpa(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (*pDM_Odm->pbFwDwRsvdPageInProgress)\n\t\tODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);\n\telse\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));\n#else\n\thalComTxbf_FwNdpaWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetSoundingClk(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ClkWorkItem)) == FALSE)\n\t\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ClkWorkItem));\n#else\n\thalComTxbf_ClkWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetResetTxPath(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ResetTxPathWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ResetTxPathWorkItem));\n#else\n\thalComTxbf_ResetTxPathWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID\nphydm_beamformSetGetTxRate(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tif (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_GetTxRateWorkItem)) == FALSE)\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_GetTxRateWorkItem));\n#else\n\thalComTxbf_GetTxRateWorkItemCallback(pDM_Odm);\n#endif\n}\n\nVOID \nhalComTxbf_EnterWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\tu1Byte\t\t\tIdx = pTxbfInfo->TXBFIdx;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\t\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))\n\t\tHalTxbfJaguar_Enter(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8192E)\n\t\tHalTxbf8192E_Enter(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_Enter(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8821B)\n\t\tHalTxbf8821B_Enter(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_Enter(pDM_Odm, Idx);\n}\n\nVOID \nhalComTxbf_LeaveWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tu1Byte\t\t\tIdx = pTxbfInfo->TXBFIdx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))\n\t\tHalTxbfJaguar_Leave(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8192E)\n\t\tHalTxbf8192E_Leave(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_Leave(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8821B)\n\t\tHalTxbf8821B_Leave(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_Leave(pDM_Odm, Idx);\n}\n\n\nVOID \nhalComTxbf_FwNdpaWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\tu1Byte\tIdx = pTxbfInfo->NdpaIdx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))\n\t\tHalTxbfJaguar_FwTxBF(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8192E)\n\t\tHalTxbf8192E_FwTxBF(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_FwTxBF(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8821B)\n\t\tHalTxbf8821B_FwTxBF(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_FwTxBF(pDM_Odm, Idx);\n}\n\nVOID\nhalComTxbf_ClkWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8812)\n\t\tHalTxbfJaguar_Clk_8812A(pDM_Odm);\n}\n\n\n\nVOID\nhalComTxbf_RateWorkItemCallback(\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\tu1Byte\t\t\tBW = pTxbfInfo->BW;\n\tu1Byte\t\t\tRate = pTxbfInfo->Rate;\t\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8812)\n\t\tHalTxbf8812A_setNDPArate(pDM_Odm, BW, Rate);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8192E)\n\t\tHalTxbf8192E_setNDPArate(pDM_Odm, BW, Rate);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_setNDPArate(pDM_Odm, BW, Rate);\n\t\n}\n\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID \nhalComTxbf_FwNdpaTimerCallback(\n\tIN\tPRT_TIMER\t\tpTimer\n\t)\n{\n\n\tPADAPTER\t\tAdapter = (PADAPTER)pTimer->Adapter;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (*pDM_Odm->pbFwDwRsvdPageInProgress)\n\t\tODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);\n\telse\n\t\tPlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));\n}\n#endif\n\n\nVOID\nhalComTxbf_StatusWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tu1Byte\t\t\tIdx = pTxbfInfo->TXBFIdx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))\n\t\tHalTxbfJaguar_Status(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8192E)\n\t\tHalTxbf8192E_Status(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_Status(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8821B)\n\t\tHalTxbf8821B_Status(pDM_Odm, Idx);\n\telse if (pDM_Odm->SupportICType & ODM_RTL8822B)\n\t\tHalTxbf8822B_Status(pDM_Odm, Idx);\n}\n\nVOID\nhalComTxbf_ResetTxPathWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tu1Byte\t\t\tIdx = pTxbfInfo->TXBFIdx;\n\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_ResetTxPath(pDM_Odm, Idx);\n\t\n}\n\nVOID\nhalComTxbf_GetTxRateWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t)\n{\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n#else\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#endif\n\t\n\tif (pDM_Odm->SupportICType & ODM_RTL8814A)\n\t\tHalTxbf8814A_GetTxRate(pDM_Odm);\n}\n\n\nBOOLEAN\nHalComTxbf_Set(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tsetType,\n\tIN\tPVOID\t\t\tpInBuf\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPBOOLEAN\t\tpBoolean=(PBOOLEAN)pInBuf;\n\tpu1Byte\t\t\tpU1Tmp=(pu1Byte)pInBuf;\n\tpu4Byte\t\t\tpU4Tmp=(pu4Byte)pInBuf;\n\tPHAL_TXBF_INFO\tpTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] setType = 0x%X\\n\", __func__, setType));\n\t\n\tswitch(setType){\n\tcase TXBF_SET_SOUNDING_ENTER:\n\tpTxbfInfo->TXBFIdx = *pU1Tmp;\n\tphydm_beamformSetSoundingEnter(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_SOUNDING_LEAVE:\n\tpTxbfInfo->TXBFIdx = *pU1Tmp;\n\tphydm_beamformSetSoundingLeave(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_SOUNDING_RATE:\n\tpTxbfInfo->BW = pU1Tmp[0];\n\tpTxbfInfo->Rate = pU1Tmp[1];\n\tphydm_beamformSetSoundingRate(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_SOUNDING_STATUS:\n\tpTxbfInfo->TXBFIdx = *pU1Tmp;\n\tphydm_beamformSetSoundingStatus(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_SOUNDING_FW_NDPA:\n\tpTxbfInfo->NdpaIdx = *pU1Tmp;\n\tphydm_beamformSetSoundingFwNdpa(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_SOUNDING_CLK:\n\tphydm_beamformSetSoundingClk(pDM_Odm);\n\tbreak;\n\t\t\n\tcase TXBF_SET_TX_PATH_RESET:\n\tpTxbfInfo->TXBFIdx = *pU1Tmp;\n\tphydm_beamformSetResetTxPath(pDM_Odm);\n\tbreak;\n\n\tcase TXBF_SET_GET_TX_RATE:\n\tphydm_beamformSetGetTxRate(pDM_Odm);\n\tbreak;\n\t\n\t}\n\n\treturn TRUE;\n}\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nBOOLEAN\nHalComTxbf_Get(\n\tIN \tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\t\t\tgetType,\n\tOUT\tPVOID\t\t\tpOutBuf\n\t)\n{\n\tPHAL_DATA_TYPE\t\tpHalData=GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tPBOOLEAN\t\t\tpBoolean=(PBOOLEAN)pOutBuf;\n\tps4Byte\t\t\t\tpS4Tmp=(ps4Byte)pOutBuf;\n\tpu4Byte\t\t\t\tpU4Tmp=(pu4Byte)pOutBuf;\n\tpu1Byte\t\t\t\tpU1Tmp=(pu1Byte)pOutBuf;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (getType == TXBF_GET_EXPLICIT_BEAMFORMEE) {\n\t\tif (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))\n\t\t\t*pBoolean = FALSE;\n\t\telse if (/*IS_HARDWARE_TYPE_8822B(Adapter)\t||*/\n\t\t\t\tIS_HARDWARE_TYPE_8821B(Adapter) \t||\n\t\t\t\tIS_HARDWARE_TYPE_8192E(Adapter) \t||\n\t\t\t\tIS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))\n\t\t\t*pBoolean = TRUE;\n\t\telse\n\t\t\t*pBoolean = FALSE;\n\t} else if (getType == TXBF_GET_EXPLICIT_BEAMFORMER) {\n\t\tif (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))\n\t\t\t*pBoolean = FALSE;\t\t\n\t\telse\tif (/*IS_HARDWARE_TYPE_8822B(Adapter)\t||*/\n\t\t\t\tIS_HARDWARE_TYPE_8821B(Adapter) \t||\n\t\t\t\tIS_HARDWARE_TYPE_8192E(Adapter) \t||\n\t\t\t\tIS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {\n\t\t\tif(pHalData->RF_Type == RF_2T2R || pHalData->RF_Type == RF_3T3R)\n\t\t\t\t*pBoolean = TRUE;\n\t\t\telse\n\t\t\t\t*pBoolean = FALSE;\n\t\t} else\n\t\t\t*pBoolean = FALSE;\n\t} else if (getType == TXBF_GET_MU_MIMO_STA) {\n#if (RTL8822B_SUPPORT == 1)\n\t\tif (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/\n\t\t\tIS_HARDWARE_TYPE_8822B(Adapter))\n\t\t\t*pBoolean = TRUE;\n\t\telse\n#endif\n\t\t\t*pBoolean = FALSE;\n\n\n\t} else if (getType == TXBF_GET_MU_MIMO_AP) {\n#if (RTL8822B_SUPPORT == 1)\t\n\t\tif (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/\n\t\t\tIS_HARDWARE_TYPE_8822B(Adapter))\n\t\t\t*pBoolean = TRUE;\n\t\telse\n#endif\n\t\t\t*pBoolean = FALSE;\n\t}\n\t\n\treturn TRUE;\n}\t\n#endif\n\n\n#endif \n\n"
  },
  {
    "path": "hal/phydm/txbf/halcomtxbf.h",
    "content": "#ifndef __HAL_COM_TXBF_H__\n#define __HAL_COM_TXBF_H__\n\n/*\ntypedef\tBOOLEAN\n(*TXBF_GET)(\n\tIN\tPVOID\t\t\tpAdapter,\n\tIN\tu1Byte\t\t\tgetType,\n\tOUT\tPVOID\t\t\tpOutBuf\n\t);\n\ntypedef\tBOOLEAN\n(*TXBF_SET)(\n\tIN\tPVOID\t\t\tpAdapter,\n\tIN\tu1Byte\t\t\tsetType,\n\tOUT\tPVOID\t\t\tpInBuf\n\t);\n*/\n#define TxBF_Nr(a, b) ((a > b) ? (b) : (a))\n\ntypedef enum _TXBF_SET_TYPE{\n\tTXBF_SET_SOUNDING_ENTER,\n\tTXBF_SET_SOUNDING_LEAVE,\n\tTXBF_SET_SOUNDING_RATE,\n\tTXBF_SET_SOUNDING_STATUS,\n\tTXBF_SET_SOUNDING_FW_NDPA,\n\tTXBF_SET_SOUNDING_CLK,\n\tTXBF_SET_TX_PATH_RESET,\n\tTXBF_SET_GET_TX_RATE\n}TXBF_SET_TYPE,*PTXBF_SET_TYPE;\n\n\ntypedef enum _TXBF_GET_TYPE{\n\tTXBF_GET_EXPLICIT_BEAMFORMEE,\n\tTXBF_GET_EXPLICIT_BEAMFORMER,\n\tTXBF_GET_MU_MIMO_STA,\n\tTXBF_GET_MU_MIMO_AP\n}TXBF_GET_TYPE,*PTXBF_GET_TYPE;\n\n\n\n//2 HAL TXBF related\ntypedef struct _HAL_TXBF_INFO {\n\tu1Byte\t\t\t\tTXBFIdx;\n\tu1Byte\t\t\t\tNdpaIdx;\n\tu1Byte\t\t\t\tBW;\n\tu1Byte\t\t\t\tRate;\n\n\tRT_TIMER\t\t\tTxbf_FwNdpaTimer;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\t\n\tRT_WORK_ITEM\t\tTxbf_EnterWorkItem;  \n\tRT_WORK_ITEM\t\tTxbf_LeaveWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_FwNdpaWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_ClkWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_StatusWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_RateWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_ResetTxPathWorkItem;\n\tRT_WORK_ITEM\t\tTxbf_GetTxRateWorkItem;\n#endif\n\n} HAL_TXBF_INFO, *PHAL_TXBF_INFO;\n\n#if (BEAMFORMING_SUPPORT == 1)\n\nVOID\nhalComTxbf_beamformInit(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nhalComTxbf_ConfigGtab(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID \nhalComTxbf_EnterWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID \nhalComTxbf_LeaveWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID \nhalComTxbf_FwNdpaWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID\nhalComTxbf_ClkWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID\nhalComTxbf_ResetTxPathWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID\nhalComTxbf_GetTxRateWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID\nhalComTxbf_RateWorkItemCallback(\t\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nVOID \nhalComTxbf_FwNdpaTimerCallback(\n\tIN\tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nhalComTxbf_StatusWorkItemCallback(\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tPADAPTER\t\tAdapter\n#else\n\tIN PVOID\t\t\tpDM_VOID\n#endif\n\t);\n\nBOOLEAN\nHalComTxbf_Set(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\tsetType,\n\tIN\tPVOID\t\t\tpInBuf\n\t);\n\nBOOLEAN\nHalComTxbf_Get(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\t\t\tgetType,\n\tOUT\tPVOID\t\t\tpOutBuf\n\t);\n\n#else\n#define halComTxbf_beamformInit(pDM_VOID)\t\t\t\t\tNULL\n#define halComTxbf_ConfigGtab(pDM_VOID)\t\t\t\tNULL\n#define halComTxbf_EnterWorkItemCallback(_Adapter)\t\tNULL\n#define halComTxbf_LeaveWorkItemCallback(_Adapter)\t\tNULL\n#define halComTxbf_FwNdpaWorkItemCallback(_Adapter)\t\tNULL\n#define halComTxbf_ClkWorkItemCallback(_Adapter)\t\t\tNULL\n#define halComTxbf_RateWorkItemCallback(_Adapter)\t\tNULL\n#define halComTxbf_FwNdpaTimerCallback(_Adapter)\t\tNULL\n#define halComTxbf_StatusWorkItemCallback(_Adapter)\t\tNULL\n#define HalComTxbf_Get(_Adapter, _getType, _pOutBuf)\n\n#endif\n\t\t\t\t\t\t\t\n#endif\t// #ifndef __HAL_COM_TXBF_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8192e.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 8192E TXBF mechanism\n//\n//============================================================\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8192E_SUPPORT == 1)\n\nVOID\nHalTxbf8192E_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_Write1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8192E,  (Rate << 2 | BW));\t\n\n}\n\nVOID\nhalTxbf8192E_RfMode(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN PRT_BEAMFORMING_INFO\tpBeamInfo\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tBOOLEAN\t\t\t\tbSelfBeamformer = FALSE;\n\tBOOLEAN\t\t\t\tbSelfBeamformee = FALSE;\n\tBEAMFORMING_CAP\tBeamformCap = BEAMFORMING_CAP_NONE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pDM_Odm->RFType == ODM_1T1R)\n\t\treturn;\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1); /*RF Mode table write enable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WE_LUT, 0x80000, 0x1); /*RF Mode table write enable*/\n\t\n\tif (pBeamInfo->beamformee_su_cnt > 0) {\n\t\t/*Path_A*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0xfffff, 0x18000);\t/*Select RX mode  0x30=0x18000*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x0000f);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0x77fc2);\t/*Enable TXIQGEN in RX mode*/\n\t\t/*Path_B*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0xfffff, 0x18000);\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x0000f);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0x77fc2);\t/*Enable TXIQGEN in RX mode*/\n\t} else {\n\t\t/*Path_A*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0xfffff, 0x18000);\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x0000f);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0x77f82);\t/*Disable TXIQGEN in RX mode*/\n\t\t/*Path_B*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0xfffff, 0x18000);\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x0000f);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0x77f82);\t/*Disable TXIQGEN in RX mode*/\n\t}\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WE_LUT, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\n\tif (pBeamInfo->beamformee_su_cnt > 0) {\n\t\tODM_SetBBReg(pDM_Odm, rFPGA1_TxInfo, bMaskDWord, 0x83321333);\n\t\tODM_SetBBReg(pDM_Odm, rCCK0_AFESetting, bMaskByte3, 0xc1);\n\t} else\n\t\tODM_SetBBReg(pDM_Odm, rFPGA1_TxInfo, bMaskDWord, 0x81121313);\n}\n\n\n\nVOID\nhalTxbf8192E_FwTxBFCmd(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\tIdx, Period0 = 0, Period1 = 0;\n\tu1Byte\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu1Byte\tu1TxBFParm[3] = {0};\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\tif (pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (Idx == 0) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum0 = 0xFF; //stop sounding\n\t\t\t\tPeriod0 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t} else if (Idx == 1) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum1 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum1 = 0xFF; //stop sounding\n\t\t\t\tPeriod1 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t}\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = (Period1 << 4) | Period0;\n\tODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_TXBF, 3, u1TxBFParm);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, \n\t\t(\"[%s] PageNum0 = %d Period0 = %d, PageNum1 = %d Period1 %d\\n\", __func__, PageNum0, Period0, PageNum1, Period1));\n}\n\n\nVOID\nhalTxbf8192E_DownloadNDPA(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tu1bTmp = 0, tmpReg422 = 0, Head_Page;\n\tu1Byte\t\t\tBcnValidReg = 0, count = 0, DLBcnCount = 0;\n\tBOOLEAN\t\t\tbSendBeacon = FALSE;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\tu1Byte\t\t\tTxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8812;\t\n\t/*default reseved 1 page for the IC type which is undefined.*/\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t*pDM_Odm->pbFwDwRsvdPageInProgress = TRUE;\n#endif\n\tif (Idx == 0)\n\t\tHead_Page = 0xFE;\n\telse\n\t\tHead_Page = 0xFE;\n\n\tAdapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu1Byte)&TxPageBndy);\n\n\t/*Set REG_CR bit 8. DMA beacon by SW.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8192E+1);\n\tODM_Write1Byte(pDM_Odm,  REG_CR_8192E+1, (u1bTmp | BIT0));\n\n\t/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\n\ttmpReg422 = ODM_Read1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8192E+2);\n\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8192E+2,  tmpReg422 & (~BIT6));\n\n\tif (tmpReg422 & BIT6) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_WARNING, (\"%s There is an Adapter is sending beacon.\\n\", __func__));\n\t\tbSendBeacon = TRUE;\n\t}\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xFE/0xFD\tNDPA Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+1, Head_Page);\n\n\tdo {\n\t\t/*Clear beacon valid check bit.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+2);\n\t\tODM_Write1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+2, (BcnValidReg | BIT0));\n\n\t\t// download NDPA rsvd page.\n\t\tBeamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\n\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_MGQ_TXBD_NUM_8192E+3);\n\t\tcount = 0;\n\t\twhile ((count < 20) && (u1bTmp & BIT4)) {\n\t\t\tcount++;\n\t\t\tODM_delay_us(10);\n\t\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_MGQ_TXBD_NUM_8192E+3);\n\t\t}\n\t\tODM_Write1Byte(pDM_Odm, REG_MGQ_TXBD_NUM_8192E+3, u1bTmp | BIT4);\n#endif\n\n\t\t/*check rsvd page download OK.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+2);\n\t\tcount = 0;\n\t\twhile (!(BcnValidReg & BIT0) && count < 20) {\n\t\t\tcount++;\n\t\t\tODM_delay_us(10);\n\t\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+2);\n\t\t}\n\t\tDLBcnCount++;\n\t} while (!(BcnValidReg & BIT0) && DLBcnCount < 5);\n\n\tif (!(BcnValidReg & BIT0))\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_WARNING, (\"%s Download RSVD page failed!\\n\", __func__));\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xF9\tBeacon Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_DWBCN0_CTRL_8192E+1, TxPageBndy);\n\n\t/*To make sure that if there exists an adapter which would like to send beacon.*/\n\t/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\n\t/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause*/\n\t/*the beacon cannot be sent by HW.*/\n\t/*2010.06.23. Added by tynli.*/\n\tif (bSendBeacon)\n\t\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8192E+2, tmpReg422);\n\n\t/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\n\t/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8192E+1);\n\tODM_Write1Byte(pDM_Odm, REG_CR_8192E+1, (u1bTmp & (~BIT0)));\n\n\tpBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t*pDM_Odm->pbFwDwRsvdPageInProgress = FALSE;\n#endif\n}\n\n\nVOID\nHalTxbf8192E_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tBFerBFeeIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\ti = 0;\n\tu1Byte\t\t\t\t\tBFerIdx = (BFerBFeeIdx & 0xF0) >> 4;\n\tu1Byte\t\t\t\t\tBFeeIdx = (BFerBFeeIdx & 0xF);\n\tu4Byte\t\t\t\t\tCSI_Param;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tu2Byte\t\t\t\t\tSTAid = 0;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\thalTxbf8192E_RfMode(pDM_Odm, pBeamformingInfo);\n\n\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\tODM_Write4Byte(pDM_Odm, 0xd80, 0x00000000);\t\t/*Nc =2*/\n\n\tif ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];\n\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8192E, 0xCB);\n\n\t\t/*MAC address/Partial AID of Beamformer*/\n\t\tif (BFerIdx == 0) {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER0_INFO_8192E+i), BeamformerEntry.MacAddr[i]);\n\t\t} else {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER1_INFO_8192E+i), BeamformerEntry.MacAddr[i]);\n\t\t}\n\n\t\t/*CSI report parameters of Beamformer Default use Nc = 2*/\n\t\tCSI_Param = 0x03090309;\n\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8192E, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8192E, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8192E, CSI_Param);\n\n\t\t/*Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us,  MP chip)*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8192E+3, 0x50);\n\n\t}\n\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tSTAid = BeamformeeEntry.MacId;\n\t\telse\n\t\t\tSTAid = BeamformeeEntry.P_AID;\n\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s], STAid=0x%X\\n\", __func__, STAid));\n\n\t\t/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\n\t\tif (BFeeIdx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8192E, STAid);\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8192E+3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8192E+3) | BIT4 | BIT6 | BIT7);\n\t\t} else\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8192E+2, STAid | BIT12 | BIT14 | BIT15);\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BFeeIdx == 0) {\n\t\t\t/*Get BIT24 & BIT25*/\n\t\t\tu1Byte tmp = ODM_Read1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E+3) & 0x3;\n\t\t\t\n\t\t\tODM_Write1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E+3, tmp | 0x60);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E, STAid | BIT9);\n\t\t} else {\n\t\t\t/*Set BIT25*/\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E+2, STAid | 0xE200);\n\t\t}\n\t\t\tphydm_Beamforming_Notify(pDM_Odm);\n\n\t}\n}\n\n\nVOID\nHalTxbf8192E_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\thalTxbf8192E_RfMode(pDM_Odm, pBeamInfo);\n\n\t/*\tClear P_AID of Beamformee\n\t* \tClear MAC addresss of Beamformer\n\t*\tClear Associated Bfmee Sel\n\t*/\n\tif (pBeamInfo->BeamformCap == BEAMFORMING_CAP_NONE)\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8192E, 0xC8);\n\n\tif (Idx == 0) {\n\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8192E, 0);\n\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8192E, 0);\n\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8192E+4, 0);\n\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E, 0);\n\t} else {\n\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8192E+2, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8192E+2) & 0xF000);\n\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8192E, 0);\n\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8192E+4, 0);\n\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E+2, ODM_Read2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8192E+2) & 0x60);\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Idx %d\\n\", __func__, Idx));\n}\n\n\nVOID\nHalTxbf8192E_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\tBeamCtrlVal;\n\tu4Byte\t\t\t\t\tBeamCtrlReg;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo =  &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformEntry = pBeamInfo->BeamformeeEntry[Idx];\n\n\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\tBeamCtrlVal = BeamformEntry.MacId;\n\telse\n\t\tBeamCtrlVal = BeamformEntry.P_AID;\n\n\tif (Idx == 0)\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8192E;\n\telse {\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8192E+2;\n\t\tBeamCtrlVal |= BIT12 | BIT14 | BIT15;\n\t}\n\n\tif (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\tif (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)\n\t\t\tBeamCtrlVal |= BIT9;\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)\n\t\t\tBeamCtrlVal |= BIT10;\n\t} else\n\t\tBeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);\n\n\tODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Idx %d BeamCtrlReg %x BeamCtrlVal %x\\n\", __func__, Idx, BeamCtrlReg, BeamCtrlVal));\n}\n\n\nVOID\nHalTxbf8192E_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\thalTxbf8192E_DownloadNDPA(pDM_Odm, Idx);\n\n\thalTxbf8192E_FwTxBFCmd(pDM_Odm);\n}\n\n#endif\t/* #if (RTL8192E_SUPPORT == 1)*/\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8192e.h",
    "content": "#ifndef __HAL_TXBF_8192E_H__\n#define __HAL_TXBF_8192E_H__\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8192E_SUPPORT == 1)\nVOID\nHalTxbf8192E_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n);\n\nVOID\nHalTxbf8192E_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8192E_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8192E_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8192E_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t);\n#else\n\n#define HalTxbf8192E_setNDPArate(pDM_VOID, BW, Rate)\n#define HalTxbf8192E_Enter(pDM_VOID, Idx)\n#define HalTxbf8192E_Leave(pDM_VOID, Idx)\n#define HalTxbf8192E_Status(pDM_VOID, Idx)\n#define HalTxbf8192E_FwTxBF(pDM_VOID, Idx)\n\n#endif\n\n#endif\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8814a.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 8814A TXBF mechanism\n//\n//============================================================\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8814A_SUPPORT == 1)\n\nVOID\nHalTxbf8814A_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_Write1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8814A, BW);\n\tODM_Write1Byte(pDM_Odm, REG_NDPA_RATE_8814A, (u1Byte) Rate);\n\n}\n\n#define PHYDM_MEMORY_MAP_BUF_READ\t0x8000\n#define PHYDM_CTRL_INFO_PAGE\t\t\t0x660\n\nVOID\nphydm_DataRate_8814A(\n\tIN\tPDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\t\tmacId,\t\n\tOUT\tpu4Byte\t\t\t\tdata,\n\tIN\tu1Byte\t\t\t\tdataLen\n\t)\n{\n\tu1Byte\ti = 0;\n\tu2Byte\tXReadDataAddr = 0;\n\n\tODM_Write2Byte(pDM_Odm, REG_PKTBUF_DBG_CTRL_8814A, PHYDM_CTRL_INFO_PAGE);\n\tXReadDataAddr = PHYDM_MEMORY_MAP_BUF_READ + macId*32; /*Ctrl Info: 32Bytes for each macid(n)*/\n\t\n\tif ((XReadDataAddr < PHYDM_MEMORY_MAP_BUF_READ) || (XReadDataAddr > 0x8FFF)) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"XReadDataAddr(0x%x) is not correct!\\n\", XReadDataAddr));\n\t\treturn;\t\n\t}\n\t\n\t/* Read data */\n\tfor (i = 0; i < dataLen; i++)\n\t\t*(data+i) = ODM_Read2Byte(pDM_Odm, XReadDataAddr+i);\t\n\t\n}\n\nVOID\nHalTxbf8814A_GetTxRate(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\tu4Byte\tTxRptData = 0;\n\tu1Byte\tDataRate = 0xFF;\n\n\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\t\n\tphydm_DataRate_8814A(pDM_Odm, (u1Byte)pEntry->MacId, &TxRptData, 1);\n\tDataRate = (u1Byte)TxRptData;\n\tDataRate &= bMask7bits;   /*Bit7 indicates SGI*/\n\n\tpDM_Odm->TxBfDataRate = DataRate;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] pDM_Odm->TxBfDataRate = 0x%x\\n\", __func__, pDM_Odm->TxBfDataRate));\n}\n\nVOID\nHalTxbf8814A_ResetTxPath(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tidx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tu1Byte\tNr_index = 0;\n\n\tif (idx < BEAMFORMEE_ENTRY_NUM)\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[idx];\n\telse\n\t\treturn;\n\n\tif ((pDM_Odm->LastUSBHub) != (*pDM_Odm->HubUsbMode)) {\n\t\tNr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), BeamformeeEntry.CompSteeringNumofBFer);\n\n\t\tif (idx == 0) {\n\t\t\tswitch (Nr_index) {\n\t\t\tcase 0:\n\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x9366);\t\t/*tx2path, BC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskL3Bytes, 0x936);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x9360);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x93e93ee);\t/*tx3path, BCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93e);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93e93e0);\n\t\t\tbreak;\n\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x93f93ff);\t/*tx4path, ABCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93f);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\t}\n\t\t} else\t{\n\t\t\tswitch (Nr_index) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x9366);\t\t/*tx2path, BC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x936);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x9360);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x93e93ee);\t/*tx3path, BCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93e);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93e93e0);\n\t\t\tbreak;\n\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x93f93ff);\t/*tx4path, ABCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93f);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tpDM_Odm->LastUSBHub = *pDM_Odm->HubUsbMode;\n\t} else\n\t\treturn;\n#endif\n}\n\n\nu1Byte\nhalTxbf8814A_GetNtx(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tNtx = 0;\n\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\tif (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\n\t\tif (*pDM_Odm->HubUsbMode == 2) {/*USB3.0*/\n\t\t\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\t\t\tNtx = 3;\n\t\t\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\t\t\tNtx = 2;\n\t\t\telse\n\t\t\t\tNtx = 1;\n\t\t} else if (*pDM_Odm->HubUsbMode == 1)\t/*USB 2.0 always 2Tx*/\n\t\t\tNtx = 1;\n\t\telse\n\t\t\tNtx = 1;\n\t} else\n#endif\n\t{\n\t\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\t\tNtx = 3;\n\t\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\t\tNtx = 2;\n\t\telse\n\t\t\tNtx = 1;\n\t}\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Ntx = %d\\n\", __func__, Ntx));\n\treturn Ntx;\n}\n\nu1Byte\nhalTxbf8814A_GetNrx(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tNrx = 0;\n\n\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\tNrx = 3;\n\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\tNrx = 2;\n\telse if (pDM_Odm->RFType == ODM_2T2R)\n\t\tNrx = 1;\n\telse if (pDM_Odm->RFType == ODM_2T3R)\n\t\tNrx = 2;\n\telse if (pDM_Odm->RFType == ODM_2T4R)\n\t\tNrx = 3;\n\telse if (pDM_Odm->RFType == ODM_1T1R)\n\t\tNrx = 0;\n\telse if (pDM_Odm->RFType == ODM_1T2R)\n\t\tNrx = 1;\n\telse\n\t\tNrx = 0;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Nrx = %d\\n\", __func__, Nrx));\n\treturn Nrx;\n}\n\nVOID\nhalTxbf8814A_RfMode(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tPRT_BEAMFORMING_INFO\tpBeamformingInfo,\n\tIN\tu1Byte\t\t\t\t\tidx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\ti, Nr_index = 0;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\n\tif (idx < BEAMFORMEE_ENTRY_NUM)\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[idx];\n\telse\n\t\treturn;\n\n\tNr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), BeamformeeEntry.CompSteeringNumofBFer);\n\n\tif (pDM_Odm->RFType == ODM_1T1R)\n\t\treturn;\n\n\tfor (i = ODM_RF_PATH_A; i < MAX_RF_PATH; i++) {\n\t\tODM_SetRFReg(pDM_Odm, i, RF_WeLut_Jaguar, 0x80000, 0x1);\n\t\t/*RF Mode table write enable*/\n\t}\n\n\tif (pBeamformingInfo->beamformee_su_cnt > 0) {\n\t\tfor (i = ODM_RF_PATH_A; i < MAX_RF_PATH; i++) {\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableAddr, 0xfffff, 0x18000);\n\t\t\t/*Select RX mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableData0, 0xfffff, 0xBE77F);\n\t\t\t/*Set Table data*/\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableData1, 0xfffff, 0x226BF);\n\t\t\t/*Enable TXIQGEN in RX mode*/\n\t\t}\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF);\n\t\t/*Enable TXIQGEN in RX mode*/\n\t}\n\n\tfor (i = ODM_RF_PATH_A; i < MAX_RF_PATH; i++) {\n\t\tODM_SetRFReg(pDM_Odm, i, RF_WeLut_Jaguar, 0x80000, 0x0);\n\t\t/*RF Mode table write disable*/\n\t}\n\n\tif (pBeamformingInfo->beamformee_su_cnt > 0) {\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\t\tpDM_Odm->LastUSBHub = *pDM_Odm->HubUsbMode;\n#endif\n\n\t\t/*for 8814 19ac(idx 1), 19b4(idx 0), different Tx ant setting*/\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, BIT28 | BIT29, 0x2);\t\t\t/*enable BB TxBF ant mapping register*/\n\n\t\tif (idx == 0) {\n\t\t\tswitch (Nr_index) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x9366);\t\t/*tx2path, BC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskL3Bytes, 0x936);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x9360);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x93e93ee);\t/*tx3path, BCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93e);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93e93e0);\n\t\t\tbreak;\n\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, bMaskByte3LowNibble | bMaskL3Bytes, 0x93f93ff);\t/*tx4path, ABCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93f);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (Nr_index) {\n\t\t\tcase 0:\n\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x9366);\t\t/*tx2path, BC*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x936);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x9360);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x93e93ee);\t/*tx3path, BCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93e);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93e93e0);\n\t\t\tbreak;\n\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, bMaskByte3LowNibble | bMaskL3Bytes, 0x93f93ff);\t/*tx4path, ABCD*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x93f);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ((pBeamformingInfo->beamformee_su_cnt == 0) && (pBeamformingInfo->beamformer_su_cnt == 0)) {\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, bMaskByte3 | bMaskByte2HighNibble, 0x932);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93e9360);\n\t}\n}\n#if 0\nVOID\nhalTxbf8814A_DownloadNDPA(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tu1Byte\t\t\tu1bTmp = 0, tmpReg422 = 0;\n\tu1Byte\t\t\tBcnValidReg = 0, count = 0, DLBcnCount = 0;\n\tu2Byte\t\t\tHead_Page = 0x7FE;\n\tBOOLEAN\t\t\tbSendBeacon = FALSE;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu2Byte\t\t\tTxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8814A; /*default reseved 1 page for the IC type which is undefined.*/\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\n\tpHalData->bFwDwRsvdPageInProgress = TRUE;\n\tAdapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu2Byte)&TxPageBndy);\n\n\t/*Set REG_CR bit 8. DMA beacon by SW.*/\n\tu1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8814A + 1);\n\tPlatformEFIOWrite1Byte(Adapter,  REG_CR_8814A + 1, (u1bTmp | BIT0));\n\n\n\t/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\n\ttmpReg422 = PlatformEFIORead1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A + 2);\n\tPlatformEFIOWrite1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A + 2,  tmpReg422 & (~BIT6));\n\n\tif (tmpReg422 & BIT6) {\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"SetBeamformDownloadNDPA_8814A(): There is an Adapter is sending beacon.\\n\"));\n\t\tbSendBeacon = TRUE;\n\t}\n\n\t/*0x204[11:0]\tBeacon Head for TXDMA*/\n\tPlatformEFIOWrite2Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A, Head_Page);\n\n\tdo {\n\t\t/*Clear beacon valid check bit.*/\n\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A + 1);\n\t\tPlatformEFIOWrite1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A + 1, (BcnValidReg | BIT7));\n\n\t\t/*download NDPA rsvd page.*/\n\t\tif (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tBeamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);\n\t\telse\n\t\t\tBeamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\n\n\t\t/*check rsvd page download OK.*/\n\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A + 1);\n\t\tcount = 0;\n\t\twhile (!(BcnValidReg & BIT7) && count < 20) {\n\t\t\tcount++;\n\t\t\tdelay_us(10);\n\t\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A + 2);\n\t\t}\n\t\tDLBcnCount++;\n\t} while (!(BcnValidReg & BIT7) && DLBcnCount < 5);\n\n\tif (!(BcnValidReg & BIT0))\n\t\tRT_DISP(FBEAM, FBEAM_ERROR, (\"%s Download RSVD page failed!\\n\", __func__));\n\n\t/*0x204[11:0]\tBeacon Head for TXDMA*/\n\tPlatformEFIOWrite2Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A, TxPageBndy);\n\n\t/*To make sure that if there exists an adapter which would like to send beacon.*/\n\t/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\n\t/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause */\n\t/*the beacon cannot be sent by HW.*/\n\t/*2010.06.23. Added by tynli.*/\n\tif (bSendBeacon)\n\t\tPlatformEFIOWrite1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A + 2, tmpReg422);\n\n\t/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\n\t/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\n\tu1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8814A + 1);\n\tPlatformEFIOWrite1Byte(Adapter, REG_CR_8814A + 1, (u1bTmp & (~BIT0)));\n\n\tpBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n\n\tpHalData->bFwDwRsvdPageInProgress = FALSE;\n}\n\nVOID\nhalTxbf8814A_FwTxBFCmd(\n\tIN\tPADAPTER\tAdapter\n)\n{\n\tu1Byte\tIdx, Period = 0;\n\tu1Byte\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu1Byte\tu1TxBFParm[3] = {0};\n\n\tPMGNT_INFO\t\t\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\tif (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound) {\n\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\tPageNum1 = 0x07;\n\t\t\t\tPeriod = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t} else if (PageNum0 == 0xFF) {\n\t\t\t\tPageNum0 = 0xFF; /*stop sounding*/\n\t\t\t\tPageNum1 = 0x0F;\n\t\t\t}\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = Period;\n\tFillH2CCmd(Adapter, PHYDM_H2C_TXBF, 3, u1TxBFParm);\n\n\tRT_DISP(FBEAM, FBEAM_FUN, (\"@%s End, PageNum0 = 0x%x, PageNum1 = 0x%x Period = %d\", __func__, PageNum0, PageNum1, Period));\n}\n#endif\nVOID\nHalTxbf8814A_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tBFerBFeeIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\ti = 0;\n\tu1Byte\t\t\t\t\tBFerIdx = (BFerBFeeIdx & 0xF0) >> 4;\n\tu1Byte\t\t\t\t\tBFeeIdx = (BFerBFeeIdx & 0xF);\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tu2Byte\t\t\t\t\tSTAid = 0, CSI_Param = 0;\n\tu1Byte\t\t\t\t\tNc_index = 0, Nr_index = 0, grouping = 0, codebookinfo = 0, coefficientsize = 0;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] BFerIdx=%d, BFeeIdx=%d\\n\", __func__, BFerIdx, BFeeIdx));\n\tODM_SetMACReg(pDM_Odm, REG_SND_PTCL_CTRL_8814A, bMaskByte1 | bMaskByte2, 0x0202);\n\n\tif ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8814A, 0xDB);\n\n\t\t/*MAC address/Partial AID of Beamformer*/\n\t\tif (BFerIdx == 0) {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER0_INFO_8814A + i), BeamformerEntry.MacAddr[i]);\n\t\t} else {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER1_INFO_8814A + i), BeamformerEntry.MacAddr[i]);\n\t\t}\n\n\t\t/*CSI report parameters of Beamformer*/\n\t\tNc_index = halTxbf8814A_GetNrx(pDM_Odm);\t/*for 8814A Nrx = 3(4 Ant), min=0(1 Ant)*/\n\t\tNr_index = BeamformerEntry.NumofSoundingDim;\t/*0x718[7] = 1 use Nsts, 0x718[7] = 0 use reg setting. as Bfee, we use Nsts, so Nr_index don't care*/\n\n\t\tgrouping = 0;\n\n\t\t/*for ac = 1, for n = 3*/\n\t\tif (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU)\n\t\t\tcodebookinfo = 1;\n\t\telse if (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_HT_EXPLICIT)\n\t\t\tcodebookinfo = 3;\n\n\t\tcoefficientsize = 3;\n\n\t\tCSI_Param = (u2Byte)((coefficientsize << 10) | (codebookinfo << 8) | (grouping << 6) | (Nr_index << 3) | (Nc_index));\n\n\t\tif (BFerIdx == 0)\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8814A, CSI_Param);\n\t\telse\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8814A + 2, CSI_Param);\n\t\t/*ndp_rx_standby_timer, 8814 need > 0x56, suggest from Dvaid*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8814A + 3, 0x40);\n\n\t}\n\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\n\t\thalTxbf8814A_RfMode(pDM_Odm, pBeamformingInfo, BFeeIdx);\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tSTAid = BeamformeeEntry.MacId;\n\t\telse\n\t\t\tSTAid = BeamformeeEntry.P_AID;\n\n\t\t/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\n\t\tif (BFeeIdx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8814A, STAid);\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 3) | BIT4 | BIT6 | BIT7);\n\t\t} else\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 2, STAid | BIT14 | BIT15 | BIT12);\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BFeeIdx == 0) {\n\t\t\t/*Get BIT24 & BIT25*/\n\t\t\tu1Byte\ttmp = ODM_Read1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A + 3) & 0x3;\n\n\t\t\tODM_Write1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A + 3, tmp | 0x60);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A, STAid | BIT9);\n\t\t} else\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A + 2, STAid | 0xE200);\t/*Set BIT25*/\n\n\t\tphydm_Beamforming_Notify(pDM_Odm);\n\t}\n\n}\n\n\nVOID\nHalTxbf8814A_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\n\tif (Idx < BEAMFORMER_ENTRY_NUM) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[Idx];\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[Idx];\n\t} else\n\t\treturn;\n\n\t/*Clear P_AID of Beamformee*/\n\t/*Clear MAC address of Beamformer*/\n\t/*Clear Associated Bfmee Sel*/\n\n\tif (BeamformerEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8814A, 0xD8);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8814A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8814A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8814A, 0);\n\t\t} else {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8814A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8814A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8814A + 2, 0);\n\t\t}\n\t}\n\n\tif (BeamformeeEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\thalTxbf8814A_RfMode(pDM_Odm, pBeamformingInfo, Idx);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8814A, 0x0);\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 3) | BIT4 | BIT6 | BIT7);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A, 0);\n\t\t} else {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8814A + 2, 0x0 | BIT14 | BIT15 | BIT12);\n\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A + 2, ODM_Read2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8814A + 2) & 0x60);\n\t\t}\n\t}\n}\n\nVOID\nHalTxbf8814A_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\tBeamCtrlVal, tmpVal;\n\tu4Byte\t\t\t\t\tBeamCtrlReg;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformEntry;\n\n\tif (Idx < BEAMFORMEE_ENTRY_NUM)\n\t\tBeamformEntry = pBeamformingInfo->BeamformeeEntry[Idx];\n\telse\n\t\treturn;\n\n\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\tBeamCtrlVal = BeamformEntry.MacId;\n\telse\n\t\tBeamCtrlVal = BeamformEntry.P_AID;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s, BeamformEntry.BeamformEntryState = %d\", __func__, BeamformEntry.BeamformEntryState));\n\n\tif (Idx == 0)\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8814A;\n\telse {\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8814A + 2;\n\t\tBeamCtrlVal |= BIT12 | BIT14 | BIT15;\n\t}\n\n\tif (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\tif (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)\n\t\t\tBeamCtrlVal |= BIT9;\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)\n\t\t\tBeamCtrlVal |= (BIT9 | BIT10);\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_80)\n\t\t\tBeamCtrlVal |= (BIT9 | BIT10 | BIT11);\n\t} else {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s, Don't apply Vmatrix\",  __func__));\n\t\tBeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);\n\t}\n\n\tODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\n\t/*disable NDP packet use beamforming */\n\ttmpVal = ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8814A);\n\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8814A, tmpVal | BIT15);\n\n}\n\n\n\n\n\nVOID\nHalTxbf8814A_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n#if 0\n\tPRT_BEAMFORMING_INFO \tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\n\tif (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\thalTxbf8814A_DownloadNDPA(Adapter, Idx);\n\n\thalTxbf8814A_FwTxBFCmd(Adapter);\n#endif\n}\n\n#endif\t/* (RTL8814A_SUPPORT == 1)*/\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8814a.h",
    "content": "#ifndef __HAL_TXBF_8814A_H__\n#define __HAL_TXBF_8814A_H__\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8814A_SUPPORT == 1)\nVOID\nHalTxbf8814A_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n);\n\nu1Byte\nhalTxbf8814A_GetNtx(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nHalTxbf8814A_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8814A_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8814A_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\nVOID\nHalTxbf8814A_ResetTxPath(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8814A_GetTxRate(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nHalTxbf8814A_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t);\n#else\n\n#define HalTxbf8814A_setNDPArate(pDM_VOID,\tBW,\tRate)\n#define halTxbf8814A_GetNtx(pDM_VOID) 0\n#define HalTxbf8814A_Enter(pDM_VOID, Idx)\n#define HalTxbf8814A_Leave(pDM_VOID, Idx)\n#define HalTxbf8814A_Status(pDM_VOID, Idx)\n#define HalTxbf8814A_ResetTxPath(pDM_VOID,\tIdx)\n#define HalTxbf8814A_GetTxRate(pDM_VOID)\n#define HalTxbf8814A_FwTxBF(pDM_VOID,\tIdx)\n#endif\n\n#endif\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8821b.c",
    "content": "/*============================================================*/\n/*Description:*/\n/*This file is for 8812/8821/8811 TXBF mechanism*/\n/*============================================================*/\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8821B_SUPPORT == 1)\n\nVOID\nhalTxbf8821B_RfMode(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN PRT_BEAMFORMING_INFO\tpBeamInfo\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif (pDM_Odm->RFType == ODM_1T1R)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] set TxIQGen\\n\", __func__));\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x1);\t/*RF Mode table write enable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x1);\t/*RF Mode table write enable*/\n\n\tif (pBeamInfo->beamformee_su_cnt > 0) {\n\t\t/*Path_A*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF);\t/*Enable TXIQGEN in RX mode*/\n\t\t/*Path_B*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xE26BF);\t/*Enable TXIQGEN in RX mode*/\n\t} else {\n\t\t/*Path_A*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xC26BF);\t/*Disable TXIQGEN in RX mode*/\n\t\t/*Path_B*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xC26BF);\t/*Disable TXIQGEN in RX mode*/\n\t}\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\n\tif (pBeamInfo->beamformee_su_cnt > 0)\n\t\tODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x33);\n\telse\n\t\tODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x11);\n}\n\n#if 0\nVOID\nhalTxbf8821B_DownloadNDPA(\n\tIN PDM_ODM_T\t\t\tpDM_Odm,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tu1Byte\t\t\tu1bTmp = 0, tmpReg422 = 0, Head_Page;\n\tu1Byte\t\t\tBcnValidReg = 0, count = 0, DLBcnCount = 0;\n\tBOOLEAN\t\t\tbSendBeacon = FALSE;\n\tu1Byte\t\t\tTxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8812;\t/*default reseved 1 page for the IC type which is undefined.*/\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(pDM_Odm->Adapter);\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n\n\tpHalData->bFwDwRsvdPageInProgress = TRUE;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (Idx == 0)\n\t\tHead_Page = 0xFE;\n\telse\n\t\tHead_Page = 0xFE;\n\n\tAdapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu1Byte)&TxPageBndy);\n\n\t/*Set REG_CR bit 8. DMA beacon by SW.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);\n\tODM_Write1Byte(pDM_Odm,  REG_CR_8821B + 1, (u1bTmp | BIT0));\n\n\n\t/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\n\ttmpReg422 = ODM_Read1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2);\n\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2,  tmpReg422 & (~BIT6));\n\n\tif (tmpReg422 & BIT6) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\\n\"));\n\t\tbSendBeacon = TRUE;\n\t}\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, Head_Page);\n\n\tdo {\n\t\t/*Clear beacon valid check bit.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 2, (BcnValidReg | BIT0));\n\n\t\t/*download NDPA rsvd page.*/\n\t\tif (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tBeamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);\n\t\telse\n\t\t\tBeamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\n\n\t\t/*check rsvd page download OK.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\tcount = 0;\n\t\twhile (!(BcnValidReg & BIT0) && count < 20) {\n\t\t\tcount++;\n\t\t\tODM_delay_ms(10);\n\t\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\t}\n\t\tDLBcnCount++;\n\t} while (!(BcnValidReg & BIT0) && DLBcnCount < 5);\n\n\tif (!(BcnValidReg & BIT0))\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Download RSVD page failed!\\n\", __func__));\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, TxPageBndy);\n\n\t/*To make sure that if there exists an adapter which would like to send beacon.*/\n\t/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\n\t/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause*/\n\t/*the beacon cannot be sent by HW.*/\n\t/*2010.06.23. Added by tynli.*/\n\tif (bSendBeacon)\n\t\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2, tmpReg422);\n\n\t/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\n\t/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);\n\tODM_Write1Byte(pDM_Odm, REG_CR_8821B + 1, (u1bTmp & (~BIT0)));\n\n\tpBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n\n\tpHalData->bFwDwRsvdPageInProgress = FALSE;\n}\n\n\nVOID\nhalTxbf8821B_FwTxBFCmd(\n\tIN PDM_ODM_T\t\t\tpDM_Odm\n)\n{\n\tu1Byte\tIdx, Period0 = 0, Period1 = 0;\n\tu1Byte\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu1Byte\tu1TxBFParm[3] = {0};\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\t/*Modified by David*/\n\t\tif (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (Idx == 0) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum0 = 0xFF; /*stop sounding*/\n\t\t\t\tPeriod0 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t} else if (Idx == 1) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum1 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum1 = 0xFF; /*stop sounding*/\n\t\t\t\tPeriod1 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t}\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = (Period1 << 4) | Period0;\n\tFillH2CCmd(Adapter, PHYDM_H2C_TXBF, 3, u1TxBFParm);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, \n\t\t(\"[%s] PageNum0 = %d Period0 = %d, PageNum1 = %d Period1 %d\\n\", __func__, PageNum0, Period0, PageNum1, Period1));\n}\n\n#endif\nVOID\nHalTxbf8821B_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tBFerBFeeIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\ti = 0;\n\tu1Byte\t\t\t\t\tBFerIdx = (BFerBFeeIdx & 0xF0) >> 4;\n\tu1Byte\t\t\t\t\tBFeeIdx = (BFerBFeeIdx & 0xF);\n\tu4Byte\t\t\t\t\tCSI_Param;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tu2Byte\t\t\t\t\tSTAid = 0;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]Start!\\n\", __func__));\n\n\thalTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);\n\n\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x00000000);\t/*Nc =2*/\n\telse\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x01081008);\t/*Nc =1*/\n\n\tif ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];\n\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xCB);\n\n\t\t/*MAC address/Partial AID of Beamformer*/\n\t\tif (BFerIdx == 0) {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_BFMER0_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\n\t\t\t/*CSI report use legacy ofdm so don't need to fill P_AID. */\n\t\t\t/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER0_INFO_8821B+6, BeamformEntry.P_AID); */\n\t\t} else {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_BFMER1_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\n\t\t\t/*CSI report use legacy ofdm so don't need to fill P_AID.*/\n\t\t\t/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER1_INFO_8821B+6, BeamformEntry.P_AID);*/\n\t\t}\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU) {\n\t\t\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\t\t\tCSI_Param = 0x01090109;\n\t\t\telse\n\t\t\t\tCSI_Param = 0x01080108;\n\t\t} else {\n\t\t\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\t\t\tCSI_Param = 0x03090309;\n\t\t\telse\n\t\t\t\tCSI_Param = 0x03080308;\n\t\t}\n\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, CSI_Param);\n\n\t\t/*Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us,  MP chip)*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B + 3, 0x50);\n\t}\n\n\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tSTAid = BeamformeeEntry.MacId;\n\t\telse\n\t\t\tSTAid = BeamformeeEntry.P_AID;\n\n\t\t/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\n\t\tif (BFeeIdx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, STAid);\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3) | BIT4 | BIT6 | BIT7);\n\t\t} else\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, STAid | BIT12 | BIT14 | BIT15);\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BFeeIdx == 0) {\n\t\t\t/*Get BIT24 & BIT25*/\n\t\t\tu1Byte\ttmp = ODM_Read1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3) & 0x3;\n\n\t\t\tODM_Write1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3, tmp | 0x60);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, STAid | BIT9);\n\t\t} else {\n\t\t\t/*Set BIT25*/\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, STAid | 0xE200);\n\t\t}\n\t\t\tphydm_Beamforming_Notify(pDM_Odm);\n\t}\n}\n\n\nVOID\nHalTxbf8821B_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\t\n\tif (Idx < BEAMFORMER_ENTRY_NUM) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[Idx];\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[Idx];\n\t} else\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]Start!, IDx = %d\\n\", __func__, Idx));\n\n\t/*Clear P_AID of Beamformee*/\n\t/*Clear MAC address of Beamformer*/\n\t/*Clear Associated Bfmee Sel*/\n\t\n\tif (BeamformerEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xC8);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_BFMER0_INFO_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMER0_INFO_8812A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);\n\t\t} else {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_BFMER1_INFO_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMER1_INFO_8812A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);\n\t\t}\n\t}\n\n\tif (BeamformeeEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\thalTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, 0x0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, 0);\n\t\t} else {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2) & 0xF000);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, ODM_Read2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2) & 0x60);\n\t\t}\n\t}\n\t\n}\n\n\nVOID\nHalTxbf8821B_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\tBeamCtrlVal;\n\tu4Byte\t\t\t\t\tBeamCtrlReg;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformEntry = pBeamInfo->BeamformeeEntry[Idx];\n\n\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\tBeamCtrlVal = BeamformEntry.MacId;\n\telse\n\t\tBeamCtrlVal = BeamformEntry.P_AID;\n\n\tif (Idx == 0)\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8821B;\n\telse {\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8821B + 2;\n\t\tBeamCtrlVal |= BIT12 | BIT14 | BIT15;\n\t}\n\n\tif (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\tif (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)\n\t\t\tBeamCtrlVal |= BIT9;\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)\n\t\t\tBeamCtrlVal |= BIT10;\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_80)\n\t\t\tBeamCtrlVal |= BIT11;\n\t} else\n\t\tBeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] BeamCtrlVal = 0x%x!\\n\", __func__, BeamCtrlVal));\n\n\tODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\n}\n\n\n\nVOID\nHalTxbf8821B_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n#if 0\n\tif (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\thalTxbf8821B_DownloadNDPA(pDM_Odm, Idx);\n\n\thalTxbf8821B_FwTxBFCmd(pDM_Odm);\n#endif\n}\n\n#endif\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8821b.h",
    "content": "#ifndef __HAL_TXBF_8821B_H__\n#define __HAL_TXBF_8821B_H__\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8821B_SUPPORT == 1)\nVOID\nHalTxbf8821B_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8821B_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8821B_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8821B_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t);\n\n#else\n#define HalTxbf8821B_Enter(pDM_VOID, Idx)\n#define HalTxbf8821B_Leave(pDM_VOID, Idx)\n#define HalTxbf8821B_Status(pDM_VOID, Idx)\n#define HalTxbf8821B_FwTxBF(pDM_VOID, Idx)\n#endif\n\n\n#endif\n\n#endif\t// #ifndef __HAL_TXBF_8821B_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8822b.c",
    "content": "/*============================================================*/\n/* Description:                                               */\n/*                                                            */\n/* This file is for 8814A TXBF mechanism                      */\n/*                                                            */\n/*============================================================*/\n\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8822B_SUPPORT == 1)\n\n#if 0\nVOID\nHalTxbf8814A_GetBeamformcap(\n\tIN PADAPTER\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = GET_BEAMFORM_INFO(Adapter);\n\tBEAMFORMING_CAP\tBeamformCap = BEAMFORMING_CAP_NONE;\n\n\tBeamformCap = phydm_Beamforming_GetBeamCap(pDM_Odm, pBeamformingInfo);\n\n\tif (BeamformCap == pBeamformingInfo->BeamformCap)\n\t\treturn;\n\telse \n\t\tpBeamformingInfo->BeamformCap = BeamformCap;\n\n}\n\nVOID\nHalTxbf8814A_GetTxRate(\n\tIN\tPADAPTER\t\t\tAdapter\n)\n{\n\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tPRT_BEAMFORMING_INFO\t\t\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpEntry;\n\tu4Byte\t\tTxRptData = 0;\n\tu1Byte\t\tDataRate = 0xFF;\n\n\tpEntry = &(pBeamInfo->BeamformeeEntry[pBeamInfo->BeamformeeCurIdx]);\n\n\tReadSdramData_8814A(Adapter, (u1Byte)pEntry->MacId, LOC_8814A_CTRL_INFO, &TxRptData, 1);\n\tDataRate = (u1Byte)TxRptData;\n\tDataRate &= bMask7bits;   /*Bit7 indicates SGI*/\n\t\n\tpDM_Odm->TxBfDataRate = DataRate;\n\n}\n\nVOID\nHalTxbf8814A_ResetTxPath(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu1Byte\t\t\t\tidx\n)\n{\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter); \n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc; \n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = GET_BEAMFORM_INFO(Adapter);\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tu1Byte\tNr_index = 0;\n\t\n\tif (idx < BEAMFORMEE_ENTRY_NUM)\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[idx];\n\telse\n\t\treturn;\n\t\n\tif ((pDM_Odm->LastUSBHub) != (RT_GetHubUSBMode(Adapter))) {\t\n\t\tNr_index = TxBF_Nr(halTxbf8814A_GetNtx(Adapter), BeamformeeEntry.CompSteeringNumofBFer);\n\n\t\tif (idx == 0) {\n\t\t\tswitch (Nr_index) {\t\t\t\n\t\t\tcase 0:\t\n\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT3|BIT2|BIT1|BIT0, 0x6);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT7|BIT6|BIT5|BIT4, 0x6);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, 0x0000ff00, 0x10);\t\t\t\t/*BC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0x6);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x10);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x1060);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT3|BIT2|BIT1|BIT0, 0xe);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT7|BIT6|BIT5|BIT4, 0xe);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, 0x0000ff00, 0x90);\t\t\t\t/*BCD*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT19|BIT18|BIT17|BIT16, 0xe);\t/*3ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, 0xff00000, 0x90);\t\t\t\t\t/*bcd*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0xe);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x90);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x90e90e0);\n\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT3|BIT2|BIT1|BIT0, 0xf);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT7|BIT6|BIT5|BIT4, 0xf);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, 0x0000ff00, 0x93);\t\t\t\t/*BC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, BIT19|BIT18|BIT17|BIT16, 0xf);\t/*3ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF0, 0xff00000, 0x93);\t\t\t\t\t/*bcd*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0xf);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x93);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\t}\n\t\t} else\t{\n\t\t\tswitch (Nr_index) {\n\t\t\tcase 0:\t\n\t\t\tbreak;\n\n\t\t\tcase 1:\t\t\t/*Nsts = 2\tBC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT3|BIT2|BIT1|BIT0, 0x6);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT7|BIT6|BIT5|BIT4, 0x6);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, 0x0000ff00, 0x10);\t\t\t\t/*BC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0x6);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x10);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x1060);\n\t\t\tbreak;\n\n\t\t\tcase 2:\t\t\t/*Nsts = 3\tBCD*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT3|BIT2|BIT1|BIT0, 0xe);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT7|BIT6|BIT5|BIT4, 0xe);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, 0x0000ff00, 0x90);\t\t\t\t/*BC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT19|BIT18|BIT17|BIT16, 0xe);\t/*3ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, 0xff00000, 0x90);\t\t\t\t\t/*bcd*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0xe);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x90);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x90e90e0);\n\t\t\tbreak;\n\t\t\t\n\t\t\tdefault:\t\t\t/*Nr>3, same as Case 3*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT3|BIT2|BIT1|BIT0, 0xf);\t\t/*1ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT7|BIT6|BIT5|BIT4, 0xf);\t\t/*2ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, 0x0000ff00, 0x93);\t\t\t\t/*BC*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, BIT19|BIT18|BIT17|BIT16, 0xf);\t/*3ss*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TXBF_ANT_SET_BF1, 0xff00000, 0x93);\t\t\t\t\t/*bcd*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, BIT23|BIT22|BIT21|BIT20, 0xf);\t/*set TxPath selection for 8814a BFer bug refine*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_1, bMaskByte3, 0x93);\t\t\t\t/*if Bfer enable, always use 3Tx for all Spatial stream*/\n\t\t\tPHY_SetBBReg(Adapter, REG_BB_TX_PATH_SEL_2, bMaskDWord, 0x93f93f0);\n\t\t\tbreak;\n\t\t\n\t\t\t}\n\t\t}\n\n\t\t\tpDM_Odm->LastUSBHub = RT_GetHubUSBMode(Adapter);\n\t}\n\telse\n\t\treturn;\n#endif\n}\n#endif\n\nu1Byte\nhalTxbf8822B_GetNtx(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tNtx = 0;\n\n#if DEV_BUS_TYPE == RT_USB_INTERFACE\n\tif (pDM_Odm->SupportInterface == ODM_ITRF_USB) {\n\t\tif (*pDM_Odm->HubUsbMode == 2) {/*USB3.0*/\n\t\t\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\t\t\tNtx = 3;\n\t\t\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\t\t\tNtx = 2;\n\t\t\telse\n\t\t\t\tNtx = 1;\n\t\t} else if (*pDM_Odm->HubUsbMode == 1)\t/*USB 2.0 always 2Tx*/\n\t\t\tNtx = 1;\n\t\telse\n\t\t\tNtx = 1;\n\t} else\n#endif\n\t{\n\t\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\t\tNtx = 3;\n\t\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\t\tNtx = 2;\n\t\telse\n\t\t\tNtx = 1;\n\t}\n\n\treturn Ntx;\n\n}\n\nu1Byte\nhalTxbf8822B_GetNrx(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tNrx = 0;\n\n\tif (pDM_Odm->RFType == ODM_4T4R)\n\t\tNrx = 3;\n\telse if (pDM_Odm->RFType == ODM_3T3R)\n\t\tNrx = 2;\n\telse if (pDM_Odm->RFType == ODM_2T2R)\n\t\tNrx = 1;\n\telse if (pDM_Odm->RFType == ODM_2T3R)\n\t\tNrx = 2;\n\telse if (pDM_Odm->RFType == ODM_2T4R)\n\t\tNrx = 3;\n\telse if (pDM_Odm->RFType == ODM_1T1R)\n\t\tNrx = 0;\n\telse if (pDM_Odm->RFType == ODM_1T2R)\n\t\tNrx = 1;\n\telse\n\t\tNrx = 0;\n\n\treturn Nrx;\n\t\n}\n\n/***************SU & MU BFee Entry********************/\nVOID\nhalTxbf8822B_RfMode(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tPRT_BEAMFORMING_INFO\tpBeamformingInfo,\n\tIN\tu1Byte\t\t\t\t\tidx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\ti, Nr_index = 0;\n\tBOOLEAN\t\t\t\tbSelfBeamformer = FALSE;\n\tBOOLEAN\t\t\t\tbSelfBeamformee = FALSE;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\n\tif (idx < BEAMFORMEE_ENTRY_NUM)\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[idx];\n\telse\n\t\treturn;\n\n\tif (pDM_Odm->RFType == ODM_1T1R)\n\t\treturn;\n\n\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_B; i++) {\n\t\tODM_SetRFReg(pDM_Odm, i, RF_WeLut_Jaguar, 0x80000, 0x1);\n\t\t/*RF Mode table write enable*/\n\t}\n\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) || (pBeamformingInfo->beamformee_mu_cnt > 0)) {\n\t\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_B; i++) {\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableAddr, 0xfffff, 0x18000);\n\t\t\t/*Select RX mode*/\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableData0, 0xfffff, 0xBE77F);\n\t\t\t/*Set Table data*/\n\t\t\tODM_SetRFReg(pDM_Odm, i, RF_ModeTableData1, 0xfffff, 0x226BF);\n\t\t\t/*Enable TXIQGEN in RX mode*/\n\t\t}\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF);\n\t\t/*Enable TXIQGEN in RX mode*/\n\t}\n\n\tfor (i = ODM_RF_PATH_A; i < ODM_RF_PATH_B; i++) {\n\t\tODM_SetRFReg(pDM_Odm, i, RF_WeLut_Jaguar, 0x80000, 0x0);\n\t\t/*RF Mode table write disable*/\n\t}\n\n\tif (pBeamformingInfo->beamformee_su_cnt > 0) {\n\n\t\t/*for 8814 19ac(idx 1), 19b4(idx 0), different Tx ant setting*/\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, BIT28|BIT29, 0x2);\t\t\t/*enable BB TxBF ant mapping register*/\n\t\t\n\t\tif (idx == 0) {\n\t\t\t/*Nsts = 2\tAB*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF0, 0xffff, 0x0433);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, 0xfff00000, 0x043);\n\t\t\t/*ODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x430);*/\n\n\t\t} else {/*IDX =1*/\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, 0xffff, 0x0433);\n\t\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, 0xfff00000, 0x043);\n\t\t\t/*ODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x430;*/\n\t\t}\n\t} else {\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, 0xfff00000, 0x1); /*1SS by path-A*/\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_2, bMaskLWord, 0x430); /*2SS by path-A,B*/\n\t}\n\t\n\tif (pBeamformingInfo->beamformee_mu_cnt > 0) {\n\t\t/*MU STAs share the common setting*/\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, BIT31, 1);\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TXBF_ANT_SET_BF1, 0xffff, 0x0433);\n\t\tODM_SetBBReg(pDM_Odm, REG_BB_TX_PATH_SEL_1, 0xfff00000, 0x043);\n\t}\n\n}\n#if 0\nVOID\nhalTxbf8822B_DownloadNDPA(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu1Byte\t\t\t\tIdx\n\t)\n{\n\tu1Byte\t\t\tu1bTmp = 0, tmpReg422 = 0;\n\tu1Byte\t\t\tBcnValidReg = 0, count = 0, DLBcnCount = 0;\n\tu2Byte\t\t\tHead_Page = 0x7FE;\n\tBOOLEAN\t\t\tbSendBeacon = FALSE;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu2Byte\t\t\tTxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8814A; /*default reseved 1 page for the IC type which is undefined.*/\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry+Idx;\n\n\tpHalData->bFwDwRsvdPageInProgress = TRUE;\n\tAdapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu2Byte)&TxPageBndy);\n\t\n\t/*Set REG_CR bit 8. DMA beacon by SW.*/\n\tu1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8814A+1);\n\tPlatformEFIOWrite1Byte(Adapter,  REG_CR_8814A+1, (u1bTmp|BIT0));\n\n\n\t/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\n\ttmpReg422 = PlatformEFIORead1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A+2);\n\tPlatformEFIOWrite1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A+2,  tmpReg422&(~BIT6));\n\n\tif (tmpReg422 & BIT6) {\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"SetBeamformDownloadNDPA_8814A(): There is an Adapter is sending beacon.\\n\"));\n\t\tbSendBeacon = TRUE;\n\t}\n\n\t/*0x204[11:0]\tBeacon Head for TXDMA*/\n\tPlatformEFIOWrite2Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A, Head_Page);\n\t\n\tdo {\t\t\n\t\t/*Clear beacon valid check bit.*/\n\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\t\tPlatformEFIOWrite1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7));\n\t\t\n\t\t/*download NDPA rsvd page.*/\n\t\tif (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tBeamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);\n\t\telse \n\t\t\tBeamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\n\t\n\t\t/*check rsvd page download OK.*/\n\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A + 1);\n\t\tcount = 0;\n\t\twhile (!(BcnValidReg & BIT7) && count < 20) {\n\t\t\tcount++;\n\t\t\tdelay_us(10);\n\t\t\tBcnValidReg = PlatformEFIORead1Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A+2);\n\t\t}\n\t\tDLBcnCount++;\n\t} while (!(BcnValidReg & BIT7) && DLBcnCount < 5);\n\t\n\tif (!(BcnValidReg & BIT0))\n\t\tRT_DISP(FBEAM, FBEAM_ERROR, (\"%s Download RSVD page failed!\\n\", __func__));\n\n\t/*0x204[11:0]\tBeacon Head for TXDMA*/\n\tPlatformEFIOWrite2Byte(Adapter, REG_FIFOPAGE_CTRL_2_8814A, TxPageBndy);\n\n\t/*To make sure that if there exists an adapter which would like to send beacon.*/\n\t/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\n\t/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause */\n\t/*the beacon cannot be sent by HW.*/\n\t/*2010.06.23. Added by tynli.*/\n\tif (bSendBeacon)\n\t\tPlatformEFIOWrite1Byte(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422);\n\n\t/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\n\t/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\n\tu1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8814A+1);\n\tPlatformEFIOWrite1Byte(Adapter, REG_CR_8814A+1, (u1bTmp&(~BIT0)));\n\n\tpBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n\n\tpHalData->bFwDwRsvdPageInProgress = FALSE;\n}\n\nVOID\nhalTxbf8822B_FwTxBFCmd(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tu1Byte\tIdx, Period = 0;\n\tu1Byte\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu1Byte\tu1TxBFParm[3] = {0};\n\n\tPMGNT_INFO\t\t\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\tif (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound) {\n\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\tPageNum1 = 0x07;\n\t\t\t\tPeriod = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t} else if (PageNum0 == 0xFF) {\n\t\t\t\tPageNum0 = 0xFF; /*stop sounding*/\n\t\t\t\tPageNum1 = 0x0F;\n\t\t\t}\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = Period;\n\tFillH2CCmd(Adapter, PHYDM_H2C_TXBF, 3, u1TxBFParm);\n\t\n\tRT_DISP(FBEAM, FBEAM_FUN, (\"@%s End, PageNum0 = 0x%x, PageNum1 = 0x%x Period = %d\", __func__, PageNum0, PageNum1, Period));\n}\n#endif\n\nVOID\nHalTxbf8822B_Init(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\tu1bTmp;\n\tPRT_BEAMFORMING_INFO\t\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\n\tODM_SetBBReg(pDM_Odm, 0x14c0 , BIT16, 1); /*Enable P1 aggr new packet according to P0 transfer time*/\n\tODM_SetBBReg(pDM_Odm, 0x14c0 , BIT15|BIT14|BIT13|BIT12, 1); /*MU Retry Limit*/\n\tODM_SetBBReg(pDM_Odm, 0x14c0 , BIT7, 0); /*Disable Tx MU-MIMO until sounding done*/\t\n\tODM_SetBBReg(pDM_Odm, 0x14c0 , 0x3F, 0); /* Clear validity of MU STAs */\n\tODM_Write1Byte(pDM_Odm, 0x167c , 0x70); /*MU-MIMO Option as default value*/\n\tODM_Write2Byte(pDM_Odm, 0x1680 , 0); /*MU-MIMO Control as default value*/\n\n\t/* Set MU NDPA rate & BW source */\n\t/* 0x42C[30] = 1 (0: from Tx desc, 1: from 0x45F) */\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, 0x42C);\n\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8822B, (u1bTmp|BIT6));\n\t/* 0x45F[7:0] = 0x10 (Rate=OFDM_6M, BW20) */\n\tODM_Write1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8822B, 0x10);\n\n\t/* Init HW variable */\n\tpBeamformingInfo->RegMUTxCtrl = ODM_Read4Byte(pDM_Odm, 0x14c0);\n}\n\nVOID\nHalTxbf8822B_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tBFerBFeeIdx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\ti = 0;\n\tu1Byte\t\t\t\t\tBFerIdx = (BFerBFeeIdx & 0xF0)>>4;\n\tu1Byte\t\t\t\t\tBFeeIdx = (BFerBFeeIdx & 0xF);\n\tu2Byte\t\t\t\t\tCSI_Param = 0;\n\tPRT_BEAMFORMING_INFO\t\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformeeEntry;\n\tPRT_BEAMFORMER_ENTRY\tpBeamformerEntry;\n\tu2Byte\t\t\t\t\tvalue16, STAid = 0;\n\tu1Byte\t\t\t\t\tNc_index = 0, Nr_index = 0, grouping = 0, codebookinfo = 0, coefficientsize = 0;\n\tu4Byte\t\t\t\t\tgid_valid, user_position_l, user_position_h;\n\tu4Byte\t\t\t\t\tmu_reg[6] = {0x1684, 0x1686, 0x1688, 0x168a, 0x168c, 0x168e};\n\tu1Byte\t\t\t\t\tu1bTmp;\n\tu4Byte\t\t\t\t\tu4bTmp;\n\t\n\tRT_DISP(FBEAM, FBEAM_FUN, (\"%s: BFerBFeeIdx=%d, BFerIdx=%d, BFeeIdx=%d\\n\", __func__, BFerBFeeIdx, BFerIdx, BFeeIdx));\n\n\t/*************SU BFer Entry Init*************/\n\tif ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tpBeamformerEntry = &pBeamformingInfo->BeamformerEntry[BFerIdx];\n\t\tpBeamformerEntry->is_mu_ap = FALSE;\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B, 0xDB);\t\n\t\n\t\t\n\t\tfor (i = 0; i < MAX_BEAMFORMER_SU; i++) {\n\t\t\tif ((pBeamformingInfo->beamformer_su_reg_maping & BIT(i)) == 0) {\n\t\t\t\tpBeamformingInfo->beamformer_su_reg_maping |= BIT(i);\n\t\t\t\tpBeamformerEntry->su_reg_index = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/*MAC address/Partial AID of Beamformer*/\n\t\tif (pBeamformerEntry->su_reg_index == 0) {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER0_INFO_8822B+i), pBeamformerEntry->MacAddr[i]);\n\t\t} else {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER1_INFO_8822B+i), pBeamformerEntry->MacAddr[i]);\n\t\t}\n\n\t\t/*CSI report parameters of Beamformer*/\n\t\tNc_index = halTxbf8822B_GetNrx(pDM_Odm);\t/*for 8814A Nrx = 3(4 Ant), min=0(1 Ant)*/\n\t\tNr_index = pBeamformerEntry->NumofSoundingDim;\t/*0x718[7] = 1 use Nsts, 0x718[7] = 0 use reg setting. as Bfee, we use Nsts, so Nr_index don't care*/\n\t\t\n\t\tgrouping = 0;\n\n\t\t/*for ac = 1, for n = 3*/\n\t\tif (pBeamformerEntry->BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU)\n\t\t\tcodebookinfo = 1;\t\n\t\telse if (pBeamformerEntry->BeamformEntryCap & BEAMFORMEE_CAP_HT_EXPLICIT)\n\t\t\tcodebookinfo = 3;\t\n\n\t\tcoefficientsize = 3;\n\n\t\tCSI_Param = (u2Byte)((coefficientsize<<10)|(codebookinfo<<8)|(grouping<<6)|(Nr_index<<3)|(Nc_index));\n\n\t\tif (BFerIdx == 0)\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8822B, CSI_Param);\n\t\telse\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8822B+2, CSI_Param);\n\t\t/*ndp_rx_standby_timer, 8814 need > 0x56, suggest from Dvaid*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8814A+3, 0x70);\n\t\n\t}\n\n\t/*************SU BFee Entry Init*************/\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tpBeamformeeEntry = &pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\t\tpBeamformeeEntry->is_mu_sta = FALSE;\n\t\thalTxbf8822B_RfMode(pDM_Odm, pBeamformingInfo, BFeeIdx);\n\t\t\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tSTAid = pBeamformeeEntry->MacId;\n\t\telse \n\t\t\tSTAid = pBeamformeeEntry->P_AID;\n\n\t\tfor (i = 0; i < MAX_BEAMFORMEE_SU; i++) {\n\t\t\tif ((pBeamformingInfo->beamformee_su_reg_maping & BIT(i)) == 0) {\n\t\t\t\tpBeamformingInfo->beamformee_su_reg_maping |= BIT(i);\n\t\t\t\tpBeamformeeEntry->su_reg_index = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\n\t\tif (pBeamformeeEntry->su_reg_index == 0) {\t\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8822B, STAid);\t\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3)|BIT4|BIT6|BIT7);\n\t\t} else {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8822B+2, STAid | BIT14 | BIT15 | BIT12);\n\t\t}\t\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (pBeamformeeEntry->su_reg_index == 0) {\n\t\t\t/*Get BIT24 & BIT25*/\n\t\t\tu1Byte\ttmp = ODM_Read1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B+3) & 0x3;\n\t\t\t\n\t\t\tODM_Write1Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B + 3, tmp | 0x60);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B, STAid | BIT9);\n\t\t} else\t\t\n\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B+2, STAid | 0xE200);\t/*Set BIT25*/\n\t\t\t\n\t\t\tphydm_Beamforming_Notify(pDM_Odm);\n\t}\n\n\t/*************MU BFer Entry Init*************/\n\tif ((pBeamformingInfo->beamformer_mu_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tpBeamformerEntry = &pBeamformingInfo->BeamformerEntry[BFerIdx];\n\t\tpBeamformingInfo->mu_ap_index = BFerIdx;\n\t\tpBeamformerEntry->is_mu_ap = TRUE;\n\t\tfor (i = 0; i < 8; i++)\n\t\t\tpBeamformerEntry->gid_valid[i] = 0;\n\t\tfor (i = 0; i < 16; i++)\n\t\t\tpBeamformerEntry->user_position[i] = 0;\n\t\t\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B, 0xDB);\t\n\t\t\n\t\t/* MAC address */\n\t\tfor (i = 0; i < 6 ; i++)\n\t\t\tODM_Write1Byte(pDM_Odm, (REG_ASSOCIATED_BFMER0_INFO_8822B+i), pBeamformerEntry->MacAddr[i]);\n\n\t\t/* Set partial AID */\n\t\tODM_Write2Byte(pDM_Odm, (REG_ASSOCIATED_BFMER0_INFO_8822B+6), pBeamformerEntry->P_AID);\n\n\t\t/* Fill our AID to 0x1680[11:0] and [13:12] = 2b'00, BF report segment select to 3895 bytes*/\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, 0x1680);\n\t\tu1bTmp = (pBeamformerEntry->AID)&0xFFF;\n\t\tODM_Write1Byte(pDM_Odm, 0x1680, u1bTmp);\n\n\t\t/* Set 80us for leaving ndp_rx_standby_state */\n\t\tODM_Write1Byte(pDM_Odm, 0x71B, 0x50);\n\t\t\n\t\t/* Set 0x6A0[14] = 1 to accept action_no_ack */\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_RXFLTMAP0_8822B+1);\n\t\tu1bTmp |= 0x40;\n\t\tODM_Write1Byte(pDM_Odm, REG_RXFLTMAP0_8822B+1, u1bTmp);\n\t\t/* Set 0x6A2[5:4] = 1 to NDPA and BF report poll */\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_RXFLTMAP1_8822B);\n\t\tu1bTmp |= 0x30;\n\t\tODM_Write1Byte(pDM_Odm, REG_RXFLTMAP1_8822B, u1bTmp);\n\t\t\n\t\t/*CSI report parameters of Beamformer*/\n\t\tNc_index = halTxbf8822B_GetNrx(pDM_Odm);\t/* Depend on RF type */\n\t\tNr_index = 1;\t/*0x718[7] = 1 use Nsts, 0x718[7] = 0 use reg setting. as Bfee, we use Nsts, so Nr_index don't care*/\n\t\tgrouping = 0; /*no grouping*/\n\t\tcodebookinfo = 1; /*7 bit for psi, 9 bit for phi*/\n\t\tcoefficientsize = 0; /*This is nothing really matter*/ \n\t\tCSI_Param = (u2Byte)((coefficientsize<<10)|(codebookinfo<<8)|(grouping<<6)|(Nr_index<<3)|(Nc_index));\n\t\tODM_Write2Byte(pDM_Odm, 0x6F4, CSI_Param);\n\n\t}\n\t\n\t/*************MU BFee Entry Init*************/\n\tif ((pBeamformingInfo->beamformee_mu_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tpBeamformeeEntry = &pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\t\tpBeamformeeEntry->is_mu_sta = TRUE;\n\t\tfor (i = 0; i < MAX_BEAMFORMEE_MU; i++) {\n\t\t\tif ((pBeamformingInfo->beamformee_mu_reg_maping & BIT(i)) == 0) {\n\t\t\t\tpBeamformingInfo->beamformee_mu_reg_maping |= BIT(i);\n\t\t\t\tpBeamformeeEntry->mu_reg_index = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (pBeamformeeEntry->mu_reg_index == 0xFF) {\n\t\t\t/* There is no valid bit in beamformee_mu_reg_maping */\n\t\t\tRT_DISP(FBEAM, FBEAM_FUN, (\"%s: ERROR! There is no valid bit in beamformee_mu_reg_maping!\\n\", __func__));\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/*User position table*/\n\t\tswitch (pBeamformeeEntry->mu_reg_index) {\n\t\tcase 0:\n\t\t\tgid_valid = 0x7fe;\n\t\t\tuser_position_l = 0x111110;\n\t\t\tuser_position_h = 0x0;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tgid_valid = 0x7f806;\n\t\t\tuser_position_l = 0x11000004;\n\t\t\tuser_position_h = 0x11;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tgid_valid = 0x1f81818;\n\t\t\tuser_position_l = 0x400040;\n\t\t\tuser_position_h = 0x11100;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tgid_valid = 0x1e186060;\n\t\t\tuser_position_l = 0x4000400;\n\t\t\tuser_position_h = 0x1100040;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tgid_valid = 0x66618180;\n\t\t\tuser_position_l = 0x40004000;\n\t\t\tuser_position_h = 0x10040400;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tgid_valid = 0x79860600;\n\t\t\tuser_position_l = 0x40000;\n\t\t\tuser_position_h = 0x4404004;\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (i = 0; i < 8; i++) {\n\t\t\tif (i < 4) {\n\t\t\t\tpBeamformeeEntry->gid_valid[i] = (u1Byte)(gid_valid & 0xFF);\n\t\t\t\tgid_valid = (gid_valid >> 8);\n\t\t\t} else\n\t\t\t\tpBeamformeeEntry->gid_valid[i] = 0;\n\t\t}\n\t\tfor (i = 0; i < 16; i++) {\n\t\t\tif (i < 4) {\n\t\t\t\tpBeamformeeEntry->user_position[i] = (u1Byte)(user_position_l & 0xFF);\n\t\t\t\tuser_position_l = user_position_l >> 8;\n\t\t\t} else if (i < 8) {\n\t\t\t\tpBeamformeeEntry->user_position[i] = (u1Byte)(user_position_h & 0xFF);\n\t\t\t\tuser_position_h = user_position_h >> 8;\n\t\t\t} else\n\t\t\t\tpBeamformeeEntry->user_position[i] = 0;\n\t\t}\n\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B, 0xDB);\t\n\n\t\t/*select MU STA table*/\n\t\tpBeamformingInfo->RegMUTxCtrl &= ~(BIT8|BIT9|BIT10);\n\t\tpBeamformingInfo->RegMUTxCtrl |= (pBeamformeeEntry->mu_reg_index << 8)&(BIT8|BIT9|BIT10);\n\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\t\n\t\t\n\t\tODM_SetBBReg(pDM_Odm, 0x14c4 , bMaskDWord, 0); /*Reset gid_valid table*/\n\t\tODM_SetBBReg(pDM_Odm, 0x14c8 , bMaskDWord, user_position_l);\n\t\tODM_SetBBReg(pDM_Odm, 0x14cc , bMaskDWord, user_position_h);\n\n\t\t/*set validity of MU STAs*/\t\t\n\t\tpBeamformingInfo->RegMUTxCtrl &= 0xFFFFFFC0;\n\t\tpBeamformingInfo->RegMUTxCtrl |= pBeamformingInfo->beamformee_mu_reg_maping&0x3F;\n\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\t\n\n\t\tvalue16 = ODM_Read2Byte(pDM_Odm, mu_reg[pBeamformeeEntry->mu_reg_index]);\n\t\tvalue16 &= 0xFE00; /*Clear PAID*/\n\t\tvalue16 |= BIT9; /*Enable MU BFee*/\n\t\tvalue16 |= pBeamformeeEntry->P_AID;\n\t\tODM_Write2Byte(pDM_Odm, mu_reg[pBeamformeeEntry->mu_reg_index] , value16);\n\t\t\n\t\t/* 0x42C[30] = 1 (0: from Tx desc, 1: from 0x45F) */\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3);\n\t\tu1bTmp |= 0xD0; /* Set bit 28, 30, 31 to 3b'111*/\n\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3, u1bTmp);\n\t\t/* Set NDPA to 6M*/\n\t\tODM_Write1Byte(pDM_Odm, REG_NDPA_RATE_8822B, 0x4); /* 6M */\n\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8822B);\n\t\tu1bTmp &= 0xFC; /* Clear bit 0, 1*/\n\t\tODM_Write1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8822B, u1bTmp);\n\n\t\tu4bTmp = ODM_Read4Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B);\n\t\tu4bTmp = ((u4bTmp & 0xFF0000FF) | 0x020200); /* Set [23:8] to 0x0202 */\n\t\tODM_Write4Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B, u4bTmp);\t\n\n\t\t/* Set 0x6A0[14] = 1 to accept action_no_ack */\n\t\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_RXFLTMAP0_8822B+1);\n\t\tu1bTmp |= 0x40;\n\t\tODM_Write1Byte(pDM_Odm, REG_RXFLTMAP0_8822B+1, u1bTmp);\n\t\t/* End of MAC registers setting */\n\t\t\n\t\thalTxbf8822B_RfMode(pDM_Odm, pBeamformingInfo, BFeeIdx);\n#if (SUPPORT_MU_BF == 1)\n\t\t/*Special for plugfest*/\n\t\tdelay_ms(50); /* wait for 4-way handshake ending*/\n\t\tSendSWVHTGIDMgntFrame(pDM_Odm, pBeamformeeEntry->MacAddr, BFeeIdx);\n#endif\t\t\n\n\t\tphydm_Beamforming_Notify(pDM_Odm);\n\n\t}\n\n}\n\n\nVOID\nHalTxbf8822B_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMER_ENTRY\tpBeamformerEntry; \n\tPRT_BEAMFORMEE_ENTRY\tpBeamformeeEntry;\n\tu4Byte\t\t\t\t\tmu_reg[6] = {0x1684, 0x1686, 0x1688, 0x168a, 0x168c, 0x168e};\n\n\tif (Idx < BEAMFORMER_ENTRY_NUM) {\n\t\tpBeamformerEntry = &pBeamformingInfo->BeamformerEntry[Idx];\n\t\tpBeamformeeEntry = &pBeamformingInfo->BeamformeeEntry[Idx];\n\t} else\n\t\treturn;\n\n\t/*Clear P_AID of Beamformee*/\n\t/*Clear MAC address of Beamformer*/\n\t/*Clear Associated Bfmee Sel*/\n\n\tif (pBeamformerEntry->BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8822B, 0xD8);\t\n\t\tif (pBeamformerEntry->is_mu_ap == 0) { /*SU BFer */\n\t\t\tif (pBeamformerEntry->su_reg_index == 0) {\t\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8822B, 0);\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER0_INFO_8822B+4, 0);\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8822B, 0);\n\t\t\t} else {\n\t\t\t\tODM_Write4Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8822B, 0);\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMER1_INFO_8822B+4, 0);\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8822B+2, 0);\n\t\t\t}\n\t\t\tpBeamformingInfo->beamformer_su_reg_maping &= ~(BIT(pBeamformerEntry->su_reg_index));\n\t\t\tpBeamformerEntry->su_reg_index = 0xFF;\n\t\t} else { /*MU BFer */\n\t\t\t/*set validity of MU STA0 and MU STA1*/\n\t\t\tpBeamformingInfo->RegMUTxCtrl &= 0xFFFFFFC0;\n\t\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\t\t\t\n\t\t\tODM_Memory_Set(pDM_Odm, pBeamformerEntry->gid_valid, 0, 8);\n\t\t\tODM_Memory_Set(pDM_Odm, pBeamformerEntry->user_position, 0, 16);\n\t\t\tpBeamformerEntry->is_mu_ap = FALSE;\n\t\t}\n\t}\n\n\tif (pBeamformeeEntry->BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\thalTxbf8822B_RfMode(pDM_Odm, pBeamformingInfo, Idx);\n\t\tif (pBeamformeeEntry->is_mu_sta == 0) { /*SU BFee*/\n\t\t\tif (pBeamformeeEntry->su_reg_index == 0) {\t\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8822B, 0x0);\t\n\t\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8822B+3)|BIT4|BIT6|BIT7);\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B, 0);\n\t\t\t} else {\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8822B+2, 0x0 | BIT14 | BIT15 | BIT12);\n\n\t\t\t\tODM_Write2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B+2, \n\t\t\t\tODM_Read2Byte(pDM_Odm, REG_ASSOCIATED_BFMEE_SEL_8822B+2) & 0x60);\n\t\t\t}\n\t\t\tpBeamformingInfo->beamformee_su_reg_maping &= ~(BIT(pBeamformeeEntry->su_reg_index));\n\t\t\tpBeamformeeEntry->su_reg_index = 0xFF;\n\t\t} else { /*MU BFee */\n\t\t\t/*Disable sending NDPA & BF-rpt-poll to this BFee*/\n\t\t\tODM_Write2Byte(pDM_Odm, mu_reg[pBeamformeeEntry->mu_reg_index] , 0);\n\t\t\t/*set validity of MU STA*/\n\t\t\tpBeamformingInfo->RegMUTxCtrl &= ~(BIT(pBeamformeeEntry->mu_reg_index));\n\t\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\t\t\t\n\t\t\t\n\t\t\tpBeamformeeEntry->is_mu_sta = FALSE;\n\t\t\tpBeamformingInfo->beamformee_mu_reg_maping &= ~(BIT(pBeamformeeEntry->mu_reg_index));\n\t\t\tpBeamformeeEntry->mu_reg_index = 0xFF;\n\t\t}\n\t}\n}\n\n\n/***********SU & MU BFee Entry Only when souding done****************/\nVOID\nHalTxbf8822B_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\tBeamCtrlVal, tmpVal;\n\tu4Byte\t\t\t\t\tBeamCtrlReg;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry;\n\tBOOLEAN\tis_mu_sounding = pBeamformingInfo->is_mu_sounding, is_bitmap_ready = FALSE;\n\tu16 bitmap;\n\tu8 idx, gid, i;\n\tu8 id1, id0;\n\tu32 gid_valid[6] = {0};\n\tu32 user_position_lsb[6] = {0};\n\tu32 user_position_msb[6] = {0};\n\tu32 value32;\n\n\tif (Idx < BEAMFORMEE_ENTRY_NUM)\n\t\tpBeamformEntry = &pBeamformingInfo->BeamformeeEntry[Idx];\n\telse\n\t\treturn;\n\t\n\t/*SU sounding done */\n\tif (is_mu_sounding == FALSE) {\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tBeamCtrlVal = pBeamformEntry->MacId;\n\t\telse \n\t\t\tBeamCtrlVal = pBeamformEntry->P_AID;\n\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s, BeamformEntry.BeamformEntryState = %d\", __func__, pBeamformEntry->BeamformEntryState));\n\n\t\tif (pBeamformEntry->su_reg_index == 0) {\n\t\t\tBeamCtrlReg = REG_TXBF_CTRL_8822B;\n\t\t} else {\n\t\t\tBeamCtrlReg = REG_TXBF_CTRL_8822B+2;\n\t\t\tBeamCtrlVal |= BIT12|BIT14|BIT15;\n\t\t}\n\n\t\tif (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (pBeamformEntry->SoundBW == CHANNEL_WIDTH_20)\n\t\t\t\tBeamCtrlVal |= BIT9;\n\t\t\telse if (pBeamformEntry->SoundBW == CHANNEL_WIDTH_40)\n\t\t\t\tBeamCtrlVal |= (BIT9|BIT10);\n\t\t\telse if (pBeamformEntry->SoundBW == CHANNEL_WIDTH_80)\n\t\t\t\tBeamCtrlVal |= (BIT9|BIT10|BIT11);\t\t\n\t\t} else {\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"@%s, Don't apply Vmatrix\",  __func__));\n\t\t\tBeamCtrlVal &= ~(BIT9|BIT10|BIT11);\n\t\t}\n\n\t\tODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\n\t\t/*disable NDP packet use beamforming */\n\t\ttmpVal = ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8822B);\n\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8822B, tmpVal|BIT15);\n\t} else {\n\t\t/*MU sounding done */\n\t\tif (pBeamformEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\t/*value32 = ODM_GetBBReg(pDM_Odm, 0xF4C, 0xFFFF0000);*/\n\t\t\tvalue32 = 1;\n\t\t\t\n\t\t\tis_bitmap_ready = (BOOLEAN)((value32 & BIT15) >> 15);\n\t\t\tbitmap = (u16)(value32 & 0x3FFF);\n\t\t\n\t\t\tfor (idx = 0; idx < 15; idx++) {\n\t\t\t\tif (idx < 5) {/*bit0~4*/\n\t\t\t\t\tid0 = 0;\n\t\t\t\t\tid1 = (u8)(idx + 1);\n\t\t\t\t} else if (idx < 9) { /*bit5~8*/\n\t\t\t\t\tid0 = 1;\n\t\t\t\t\tid1 = (u8)(idx - 3);\n\t\t\t\t} else if (idx < 12) { /*bit9~11*/\n\t\t\t\t\tid0 = 2;\n\t\t\t\t\tid1 = (u8)(idx - 6);\n\t\t\t\t} else if (idx < 14) { /*bit12~13*/\t\n\t\t\t\t\tid0 = 3;\n\t\t\t\t\tid1 = (u8)(idx - 8);\n\t\t\t\t} else { /*bit14*/\n\t\t\t\t\tid0 = 4;\n\t\t\t\t\tid1 = (u8)(idx - 9);\n\t\t\t\t}\n\t\t\t\tif (bitmap & BIT(idx)) {\n\t\t\t\t\t/*Pair 1*/\n\t\t\t\t\tgid = (idx << 1) + 1;\n\t\t\t\t\tgid_valid[id0] |= (BIT(gid));\n\t\t\t\t\tgid_valid[id1] |= (BIT(gid));\n\t\t\t\t\t/*Pair 2*/\n\t\t\t\t\tgid += 1;\n\t\t\t\t\tgid_valid[id0] |= (BIT(gid));\n\t\t\t\t\tgid_valid[id1] |= (BIT(gid));\n\t\t\t\t} else {\n\t\t\t\t\t/*Pair 1*/\n\t\t\t\t\tgid = (idx << 1) + 1;\n\t\t\t\t\tgid_valid[id0] &= ~(BIT(gid));\n\t\t\t\t\tgid_valid[id1] &= ~(BIT(gid));\n\t\t\t\t\t/*Pair 2*/\n\t\t\t\t\tgid += 1;\n\t\t\t\t\tgid_valid[id0] &= ~(BIT(gid));\n\t\t\t\t\tgid_valid[id1] &= ~(BIT(gid));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = 0; i < BEAMFORMEE_ENTRY_NUM; i++) {\n\t\t\t\tpBeamformEntry = &pBeamformingInfo->BeamformeeEntry[i];\n\t\t\t\tif ((pBeamformEntry->is_mu_sta) && (pBeamformEntry->mu_reg_index < 6)) {\n\t\t\t\t\tvalue32 = gid_valid[pBeamformEntry->mu_reg_index];\n\t\t\t\t\tfor (idx = 0; idx < 4; idx++) {\n\t\t\t\t\t\tpBeamformEntry->gid_valid[idx] = (u8)(value32 & 0xFF);\n\t\t\t\t\t\tvalue32 = (value32 >> 8);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (idx = 0; idx < 6; idx++) {\n\t\t\t\tpBeamformingInfo->RegMUTxCtrl |= ~(BIT8|BIT9|BIT10);\n\t\t\t\tpBeamformingInfo->RegMUTxCtrl |= ((idx<<8)&(BIT8|BIT9|BIT10));\n\t\t\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\t\t\t\tODM_SetMACReg(pDM_Odm, 0x14C4, bMaskDWord, gid_valid[idx]); /*set MU STA gid valid table*/\n\t\t\t}\n\n\t\t\t/*Enable TxMU PPDU*/\n\t\t\tpBeamformingInfo->RegMUTxCtrl |= BIT7;\n\t\t\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\t\t}\n\t}\n}\n\n/*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/\nVOID\nHalTxbf8822B_ConfigGtab(\n\tIN PVOID\t\t\tpDM_VOID\n\t)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMER_ENTRY\tpBeamformerEntry = NULL;\n\tu4Byte\t\tgid_valid = 0, user_position_l = 0, user_position_h = 0, i;\n\n\tif (pBeamformingInfo->mu_ap_index < BEAMFORMER_ENTRY_NUM)\n\t\tpBeamformerEntry = &pBeamformingInfo->BeamformerEntry[pBeamformingInfo->mu_ap_index];\n\telse\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s==>\\n\", __func__));\n\n\t/*For GID 0~31*/\n\tfor (i = 0; i < 4; i++)\n\t\tgid_valid |= (pBeamformerEntry->gid_valid[i] << (i<<3));\n\tfor (i = 0; i < 8; i++) {\n\t\tif (i < 4)\n\t\t\tuser_position_l |= (pBeamformerEntry->user_position[i] << (i << 3));\n\t\telse\n\t\t\tuser_position_h |= (pBeamformerEntry->user_position[i] << ((i - 4)<<3));\n\t}\n\t/*select MU STA0 table*/\n\tpBeamformingInfo->RegMUTxCtrl &= ~(BIT8|BIT9|BIT10);\n\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\tODM_SetBBReg(pDM_Odm, 0x14c4, bMaskDWord, gid_valid); \n\tODM_SetBBReg(pDM_Odm, 0x14c8, bMaskDWord, user_position_l);\n\tODM_SetBBReg(pDM_Odm, 0x14cc, bMaskDWord, user_position_h);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: STA0: gid_valid = 0x%x, user_position_l = 0x%x, user_position_h = 0x%x\\n\",\n\t\t__func__, gid_valid, user_position_l, user_position_h));\n\n\tgid_valid = 0;\n\tuser_position_l = 0;\n\tuser_position_h = 0;\n\n\t/*For GID 32~64*/\n\tfor (i = 4; i < 8; i++)\n\t\tgid_valid |= (pBeamformerEntry->gid_valid[i] << ((i - 4)<<3));\n\tfor (i = 8; i < 16; i++) {\n\t\tif (i < 4)\n\t\t\tuser_position_l |= (pBeamformerEntry->user_position[i] << ((i - 8) << 3));\n\t\telse\n\t\t\tuser_position_h |= (pBeamformerEntry->user_position[i] << ((i - 12) << 3));\n\t}\n\t/*select MU STA1 table*/\n\tpBeamformingInfo->RegMUTxCtrl &= ~(BIT8|BIT9|BIT10);\n\tpBeamformingInfo->RegMUTxCtrl |= BIT8;\n\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\tODM_SetBBReg(pDM_Odm, 0x14c4, bMaskDWord, gid_valid); \n\tODM_SetBBReg(pDM_Odm, 0x14c8, bMaskDWord, user_position_l);\n\tODM_SetBBReg(pDM_Odm, 0x14cc, bMaskDWord, user_position_h);\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s: STA1: gid_valid = 0x%x, user_position_l = 0x%x, user_position_h = 0x%x\\n\",\n\t\t__func__, gid_valid, user_position_l, user_position_h));\n\n\t/* Set validity of MU STA0 and MU STA1*/\n\tpBeamformingInfo->RegMUTxCtrl &= 0xFFFFFFC0;\n\tpBeamformingInfo->RegMUTxCtrl |= 0x3; /* STA0, STA1*/\n\tODM_Write4Byte(pDM_Odm, 0x14c0, pBeamformingInfo->RegMUTxCtrl);\n\t\n}\n\n\n\n#if 0\n/*This function translate the bitmap to GTAB*/\nVOID\nhaltxbf8822b_gtab_translation(\n\tIN PDM_ODM_T\t\t\tpDM_Odm\n) \n{\n\tu8 idx, gid;\n\tu8 id1, id0;\n\tu32 gid_valid[6] = {0};\n\tu32 user_position_lsb[6] = {0};\n\tu32 user_position_msb[6] = {0};\n\t\n\tfor (idx = 0; idx < 15; idx++) {\n\t\tif (idx < 5) {/*bit0~4*/\n\t\t\tid0 = 0;\n\t\t\tid1 = (u8)(idx + 1);\n\t\t} else if (idx < 9) { /*bit5~8*/\n\t\t\tid0 = 1;\n\t\t\tid1 = (u8)(idx - 3);\n\t\t} else if (idx < 12) { /*bit9~11*/\n\t\t\tid0 = 2;\n\t\t\tid1 = (u8)(idx - 6);\n\t\t} else if (idx < 14) { /*bit12~13*/\t\n\t\t\tid0 = 3;\n\t\t\tid1 = (u8)(idx - 8);\n\t\t} else { /*bit14*/\n\t\t\tid0 = 4;\n\t\t\tid1 = (u8)(idx - 9);\n\t\t}\n\n\t\t/*Pair 1*/\n\t\tgid = (idx << 1) + 1;\n\t\tgid_valid[id0] |= (1 << gid);\n\t\tgid_valid[id1] |= (1 << gid);\n\t\tif (gid < 16) {\n\t\t\t/*user_position_lsb[id0] |= (0 << (gid << 1));*/\n\t\t\tuser_position_lsb[id1] |= (1 << (gid << 1));\n\t\t} else {\n\t\t\t/*user_position_msb[id0] |= (0 << ((gid - 16) << 1));*/\n\t\t\tuser_position_msb[id1] |= (1 << ((gid - 16) << 1));\n\t\t}\n\t\t\n\t\t/*Pair 2*/\n\t\tgid += 1;\n\t\tgid_valid[id0] |= (1 << gid);\n\t\tgid_valid[id1] |= (1 << gid);\n\t\tif (gid < 16) {\n\t\t\tuser_position_lsb[id0] |= (1 << (gid << 1));\n\t\t\t/*user_position_lsb[id1] |= (0 << (gid << 1));*/\n\t\t} else {\n\t\t\tuser_position_msb[id0] |= (1 << ((gid - 16) << 1));\n\t\t\t/*user_position_msb[id1] |= (0 << ((gid - 16) << 1));*/\n\t\t}\n\n\t}\n\n\n\tfor (idx = 0; idx < 6; idx++) {\n\t\t/*DbgPrint(\"gid_valid[%d] = 0x%x\\n\", idx, gid_valid[idx]);\n\t\tDbgPrint(\"user_position[%d] = 0x%x   %x\\n\", idx, user_position_msb[idx], user_position_lsb[idx]);*/\n\t}\n}\n#endif\n\nVOID\nHalTxbf8822B_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t)\n{\n#if 0\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = GET_BEAMFORM_INFO(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry+Idx;\n\n\tif (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\thalTxbf8822B_DownloadNDPA(Adapter, Idx);\n\n\thalTxbf8822B_FwTxBFCmd(Adapter);\n#endif\n}\n\n#else\t/* (RTL8822B_SUPPORT == 1)*/\n\n#endif\t/* (RTL8822B_SUPPORT == 1)*/\n\n#endif /*(BEAMFORMING_SUPPORT == 1)*/\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbf8822b.h",
    "content": "#ifndef __HAL_TXBF_8822B_H__\n#define __HAL_TXBF_8822B_H__\n#if (BEAMFORMING_SUPPORT == 1)\n#if (RTL8822B_SUPPORT == 1)\n\nVOID\nHalTxbf8822B_Init(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nHalTxbf8822B_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8822B_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbf8822B_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\nVOID\nHalTxbf8822B_ConfigGtab(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\nVOID\nHalTxbf8822B_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t);\n#else\n#define HalTxbf8822B_Init(pDM_VOID)\t\t\n#define HalTxbf8822B_Enter(pDM_VOID, Idx)\n#define HalTxbf8822B_Leave(pDM_VOID, Idx)\n#define HalTxbf8822B_Status(pDM_VOID, Idx)\n#define HalTxbf8822B_FwTxBF(pDM_VOID, Idx)\n#define HalTxbf8822B_ConfigGtab(pDM_VOID)\n#endif\n\n\n#endif\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbfinterface.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for TXBF interface mechanism\n//\n//============================================================\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nBeamforming_GidPAid(\n\tPADAPTER\tAdapter,\n\tPRT_TCB\t\tpTcb\n)\n{\n\tu1Byte\t\tIdx = 0;\n\tu1Byte\t\tRA[6] ={0};\n\tpu1Byte\t\tpHeader = GET_FRAME_OF_FIRST_FRAG(Adapter, pTcb);\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\n\tif (Adapter->HardwareType < HARDWARE_TYPE_RTL8192EE)\n\t\treturn;\n\telse if (IS_WIRELESS_MODE_N(Adapter) == FALSE)\n\t\treturn;\n\n#if (SUPPORT_MU_BF == 1)\n\tif (pTcb->TxBFPktType == RT_BF_PKT_TYPE_BROADCAST_NDPA) { /* MU NDPA */\n#else\n\tif (0) {\n#endif\n\t\t/* Fill G_ID and P_AID */\n\t\tpTcb->G_ID = 63;\n\t\tif (pBeamInfo->FirstMUBFeeIndex < BEAMFORMEE_ENTRY_NUM) {\n\t\t\tpTcb->P_AID = pBeamInfo->BeamformeeEntry[pBeamInfo->FirstMUBFeeIndex].P_AID;\t\t\t\n\t\t\tRT_DISP(FBEAM, FBEAM_FUN, (\"[David]@%s End, G_ID=0x%X, P_AID=0x%X\\n\", __func__, pTcb->G_ID, pTcb->P_AID));\n\t\t}\n\t} else {\n\t\tGET_80211_HDR_ADDRESS1(pHeader, &RA);\n\n\t\t// VHT SU PPDU carrying one or more group addressed MPDUs or\n\t\t// Transmitting a VHT NDP intended for multiple recipients\n\t\tif (MacAddr_isBcst(RA) || MacAddr_isMulticast(RA)\t|| pTcb->macId == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST) {\n\t\t\tpTcb->G_ID = 63;\n\t\t\tpTcb->P_AID = 0;\n\t\t} else if (ACTING_AS_AP(Adapter)) {\n\t\t\tu2Byte\tAID = (u2Byte) (MacIdGetOwnerAssociatedClientAID(Adapter, pTcb->macId) & 0x1ff);\t\t/*AID[0:8]*/\n\t\n\t\t\t/*RT_DISP(FBEAM, FBEAM_FUN, (\"@%s  pTcb->macId=0x%X, AID=0x%X\\n\", __func__, pTcb->macId, AID));*/\n\t\t\tpTcb->G_ID = 63;\n\n\t\t\tif (AID == 0)\t\t/*A PPDU sent by an AP to a non associated STA*/\n\t\t\t\tpTcb->P_AID = 0;\n\t\t\telse {\t\t\t\t/*Sent by an AP and addressed to a STA associated with that AP*/\n\t\t\t\tu2Byte\tBSSID = 0;\n\t\t\t\tGET_80211_HDR_ADDRESS2(pHeader, &RA);\n\t\t\t\tBSSID = ((RA[5] & 0xf0) >> 4) ^ (RA[5] & 0xf);\t/*BSSID[44:47] xor BSSID[40:43]*/\n\t\t\t\tpTcb->P_AID = (AID + BSSID *32) & 0x1ff;\t\t/*(dec(A) + dec(B)*32) mod 512*/\n\t\t\t}\n\t\t} else if (ACTING_AS_IBSS(Adapter)) {\n\t\t\tpTcb->G_ID = 63;\n\t\t\t/*P_AID for infrasturcture mode; MACID for ad-hoc mode. */\n\t\t\tpTcb->P_AID = pTcb->macId;\n\t\t} else if (MgntLinkStatusQuery(Adapter)) {\t\t\t\t/*Addressed to AP*/\n\t\t\tpTcb->G_ID = 0;\n\t\t\tGET_80211_HDR_ADDRESS1(pHeader, &RA);\n\t\t\tpTcb->P_AID =  RA[5];\t\t\t\t\t\t\t/*RA[39:47]*/\n\t\t\tpTcb->P_AID = (pTcb->P_AID << 1) | (RA[4] >> 7 );\n\t\t} else {\n\t\t\tpTcb->G_ID = 63;\n\t\t\tpTcb->P_AID = 0;\n\t\t}\n\t\t/*RT_DISP(FBEAM, FBEAM_FUN, (\"[David]@%s End, G_ID=0x%X, P_AID=0x%X\\n\", __func__, pTcb->G_ID, pTcb->P_AID));*/\n\t}\n}\n\n\nRT_STATUS\nBeamforming_GetReportFrame(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPRT_RFD\t\t\tpRfd,\n\tIN\tPOCTET_STRING\tpPduOS\n\t)\n{\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tPRT_BEAMFORMEE_ENTRY\t\tpBeamformEntry = NULL;\n\tpu1Byte\t\t\t\t\t\tpMIMOCtrlField, pCSIReport, pCSIMatrix;\n\tu1Byte\t\t\t\t\t\tIdx, Nc, Nr, CH_W;\n\tu2Byte\t\t\t\t\t\tCSIMatrixLen = 0;\n\n\tACT_PKT_TYPE\t\t\t\tpktType = ACT_PKT_TYPE_UNKNOWN;\n\n\t//Memory comparison to see if CSI report is the same with previous one\n\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, Frame_Addr2(*pPduOS), &Idx);\n\n\tif (pBeamformEntry == NULL) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Beamforming_GetReportFrame: Cannot find entry by addr\\n\"));\n\t\treturn RT_STATUS_FAILURE;\n\t}\n\n\tpktType = PacketGetActionFrameType(pPduOS);\n\t\n\t//-@ Modified by David\n\tif (pktType == ACT_PKT_VHT_COMPRESSED_BEAMFORMING) {\n\t\tpMIMOCtrlField = pPduOS->Octet + 26; \n\t\tNc = ((*pMIMOCtrlField) & 0x7) + 1;\n\t\tNr = (((*pMIMOCtrlField) & 0x38) >> 3) + 1;\n\t\tCH_W =  (((*pMIMOCtrlField) & 0xC0) >> 6);\n\t\tpCSIMatrix = pMIMOCtrlField + 3 + Nc; //24+(1+1+3)+2  MAC header+(Category+ActionCode+MIMOControlField) +SNR(Nc=2)\n\t\tCSIMatrixLen = pPduOS->Length  - 26 -3 -Nc;\n\t} else if (pktType == ACT_PKT_HT_COMPRESSED_BEAMFORMING) {\n\t\tpMIMOCtrlField = pPduOS->Octet + 26; \n\t\tNc = ((*pMIMOCtrlField) & 0x3) + 1;\n\t\tNr =  (((*pMIMOCtrlField) & 0xC) >> 2) + 1;\n\t\tCH_W =  (((*pMIMOCtrlField) & 0x10) >> 4);\n\t\tpCSIMatrix = pMIMOCtrlField + 6 + Nr;\t//24+(1+1+6)+2  MAC header+(Category+ActionCode+MIMOControlField) +SNR(Nc=2)\n\t\tCSIMatrixLen = pPduOS->Length  - 26 -6 -Nr;\n\t} else\n\t\treturn RT_STATUS_SUCCESS;\t\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] idx=%d, pkt type=%d, Nc=%d, Nr=%d, CH_W=%d\\n\", __func__, Idx, pktType, Nc, Nr, CH_W));\t\t\n\n\treturn RT_STATUS_SUCCESS;\n}\n\n\nVOID\nConstructHTNDPAPacket(\n\tPADAPTER\t\tAdapter,\n\tpu1Byte\t\t\tRA,\n\tpu1Byte\t\t\tBuffer,\n\tpu4Byte\t\t\tpLength,\n\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tu2Byte\t\t\t\t\tDuration= 0;\n\tPMGNT_INFO\t\t\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tOCTET_STRING\t\t\tpNDPAFrame,ActionContent;\n\tu1Byte\t\t\t\t\tActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\n\n\tPlatformZeroMemory(Buffer, 32);\n\n\tSET_80211_HDR_FRAME_CONTROL(Buffer,0);\n\n\tSET_80211_HDR_ORDER(Buffer, 1);\n\tSET_80211_HDR_TYPE_AND_SUBTYPE(Buffer,Type_Action_No_Ack);\n\n\tSET_80211_HDR_ADDRESS1(Buffer, RA);\n\tSET_80211_HDR_ADDRESS2(Buffer, Adapter->CurrentAddress);\n\tSET_80211_HDR_ADDRESS3(Buffer, pMgntInfo->Bssid);\n\n\tDuration = 2*aSifsTime + 40;\n\t\n\tif (BW == CHANNEL_WIDTH_40)\n\t\tDuration+= 87;\n\telse\t\n\t\tDuration+= 180;\n\n\tSET_80211_HDR_DURATION(Buffer, Duration);\n\n\t//HT control field\n\tSET_HT_CTRL_CSI_STEERING(Buffer+sMacHdrLng, 3);\n\tSET_HT_CTRL_NDP_ANNOUNCEMENT(Buffer+sMacHdrLng, 1);\n\t\n\tFillOctetString(pNDPAFrame, Buffer, sMacHdrLng+sHTCLng);\n\n\tFillOctetString(ActionContent, ActionHdr, 4);\n\tPacketAppendData(&pNDPAFrame, ActionContent);\t\n\n\t*pLength = 32;\n}\n\n\n\n\nBOOLEAN\nSendFWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tPRT_TCB \t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER \tpBuf;\n\tBOOLEAN \t\t\t\tret = TRUE;\n\tu4Byte\t\t\t\t\tBufLen;\n\tpu1Byte\t\t\t\t\tBufAddr;\n\tu1Byte\t\t\t\t\tDescLen = 0, Idx = 0, NDPTxRate;\n\tPADAPTER\t\t\t\tpDefAdapter = GetDefaultAdapter(Adapter);\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pBeamformEntry == NULL)\n\t\treturn FALSE;\n\n\tNDPTxRate = Beamforming_GetHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetFWBuffer(pDefAdapter, &pTcb, &pBuf)) {\n#if(DEV_BUS_TYPE != RT_PCI_INTERFACE)\n\t\tDescLen = Adapter->HWDescHeadLength - pHalData->USBALLDummyLength;\n#endif\n\t\tBufAddr = pBuf->Buffer.VirtualAddress + DescLen;\n\n\t\tConstructHTNDPAPacket(\n\t\t\t\tAdapter, \n\t\t\t\tRA,\n\t\t\t\tBufAddr, \n\t\t\t\t&BufLen,\n\t\t\t\tBW\n\t\t\t\t);\n\n\t\tpTcb->PacketLength = BufLen + DescLen;\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE;\n\t\t\n\t\tpTcb->BWOfPacket = BW;\n\n\t\tif(ACTING_AS_IBSS(Adapter) || ACTING_AS_AP(Adapter))\n\t\t\tpTcb->G_ID = 63;\n\n\t\tpTcb->P_AID = pBeamformEntry->P_AID;\n\t\tpTcb->DataRate = NDPTxRate;\t/*rate of NDP decide by Nr*/\n\n\t\tAdapter->HalFunc.CmdSendPacketHandler(Adapter, pTcb, pBuf, pTcb->PacketLength, DESC_PACKET_TYPE_NORMAL, FALSE);\n\t} else\n\t\tret = FALSE;\n\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\n\t\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n\nBOOLEAN\nSendSWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu1Byte\t\t\t\t\tIdx = 0, NDPTxRate = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tNDPTxRate = Beamforming_GetHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\t\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetBuffer(Adapter, &pTcb, &pBuf)) {\n\t\tConstructHTNDPAPacket(\n\t\t\t\tAdapter, \n\t\t\t\tRA,\n\t\t\t\tpBuf->Buffer.VirtualAddress, \n\t\t\t\t&pTcb->PacketLength,\n\t\t\t\tBW\n\t\t\t\t);\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE;\n\n\t\tpTcb->BWOfPacket = BW;\n\n\t\tMgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, NDPTxRate);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n\n\nVOID\nConstructVHTNDPAPacket(\n\tIN PDM_ODM_T\tpDM_Odm,\n\tpu1Byte\t\t\tRA,\n\tu2Byte\t\t\tAID,\n\tpu1Byte\t\t\tBuffer,\n\tpu4Byte\t\t\tpLength,\n\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tu2Byte\t\t\t\t\tDuration= 0;\n\tu1Byte\t\t\t\t\tSequence = 0;\n\tpu1Byte\t\t\t\t\tpNDPAFrame = Buffer;\n\tRT_NDPA_STA_INFO\t\tSTAInfo;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tu1Byte\tIdx = 0;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\t// Frame control.\n\tSET_80211_HDR_FRAME_CONTROL(pNDPAFrame, 0);\n\tSET_80211_HDR_TYPE_AND_SUBTYPE(pNDPAFrame, Type_NDPA);\n\n\tSET_80211_HDR_ADDRESS1(pNDPAFrame, RA);\n\tSET_80211_HDR_ADDRESS2(pNDPAFrame, pBeamformEntry->MyMacAddr);\n\n\tDuration = 2*aSifsTime + 44;\n\t\n\tif (BW == CHANNEL_WIDTH_80)\n\t\tDuration += 40;\n\telse if(BW == CHANNEL_WIDTH_40)\n\t\tDuration+= 87;\n\telse\t\n\t\tDuration+= 180;\n\n\tSET_80211_HDR_DURATION(pNDPAFrame, Duration);\n\n\tSequence = *(pDM_Odm->pSoundingSeq) << 2;\n\tODM_MoveMemory(pDM_Odm, pNDPAFrame+16, &Sequence, 1);\n\n\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS) || phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_AP) == FALSE)\n\t\tAID = 0;\n\n\tSTAInfo.AID = AID;\n\tSTAInfo.FeedbackType = 0;\n\tSTAInfo.NcIndex = 0;\n\t\n\tODM_MoveMemory(pDM_Odm, pNDPAFrame+17, (pu1Byte)&STAInfo, 2);\n\n\t*pLength = 19;\n}\n\n\nBOOLEAN\nSendFWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu4Byte\t\t\t\t\tBufLen;\n\tpu1Byte\t\t\t\t\tBufAddr;\n\tu1Byte\t\t\t\t\tDescLen = 0, Idx = 0, NDPTxRate = 0;\n\tPADAPTER\t\t\t\tpDefAdapter = GetDefaultAdapter(Adapter);\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry =phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pBeamformEntry == NULL)\n\t\treturn FALSE;\n\n\tNDPTxRate = Beamforming_GetVHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\t\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetFWBuffer(pDefAdapter, &pTcb, &pBuf)) {\n#if(DEV_BUS_TYPE != RT_PCI_INTERFACE)\n\t\tDescLen = Adapter->HWDescHeadLength - pHalData->USBALLDummyLength;\n#endif\n\t\tBufAddr = pBuf->Buffer.VirtualAddress + DescLen;\n\n\t\tConstructVHTNDPAPacket(\n\t\t\t\tpDM_Odm, \n\t\t\t\tRA,\n\t\t\t\tAID,\n\t\t\t\tBufAddr, \n\t\t\t\t&BufLen,\n\t\t\t\tBW\n\t\t\t\t);\n\t\t\n\t\tpTcb->PacketLength = BufLen + DescLen;\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE;\n\t\t\n\t\tpTcb->BWOfPacket = BW;\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS) || phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_AP))\n\t\t\tpTcb->G_ID = 63;\n\n\t\tpTcb->P_AID = pBeamformEntry->P_AID;\n\t\tpTcb->DataRate = NDPTxRate;\t/*decide by Nr*/\n\n\t\tAdapter->HalFunc.CmdSendPacketHandler(Adapter, pTcb, pBuf, pTcb->PacketLength, DESC_PACKET_TYPE_NORMAL, FALSE);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\t\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] End, ret=%d\\n\", __func__, ret));\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n\n\nBOOLEAN\nSendSWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu1Byte\t\t\t\t\tIdx = 0, NDPTxRate = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tNDPTxRate = Beamforming_GetVHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetBuffer(Adapter, &pTcb, &pBuf)) {\n\t\tConstructVHTNDPAPacket(\n\t\t\t\tpDM_Odm, \n\t\t\t\tRA,\n\t\t\t\tAID,\n\t\t\t\tpBuf->Buffer.VirtualAddress, \n\t\t\t\t&pTcb->PacketLength,\n\t\t\t\tBW\n\t\t\t\t);\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE;\n\t\tpTcb->BWOfPacket = BW;\n\n\t\t/*rate of NDP decide by Nr*/\n\t\tMgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, NDPTxRate);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\t\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n#ifdef SUPPORT_MU_BF\n#if (SUPPORT_MU_BF == 1)\n/*\n// Description: On VHT GID management frame by an MU beamformee.\n//\n// 2015.05.20. Created by tynli.\n*/\nRT_STATUS\nBeamforming_GetVHTGIDMgntFrame(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPRT_RFD\t\t\tpRfd,\n\tIN\tPOCTET_STRING\tpPduOS\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->DM_OutSrc;\n\tRT_STATUS\t\trtStatus = RT_STATUS_SUCCESS;\n\tpu1Byte\t\t\tpBuffer = NULL;\n\tpu1Byte\t\t\tpRaddr = NULL;\n\tu1Byte\t\t\tMemStatus[8] = {0}, UserPos[16] = {0};\n\tu1Byte\t\t\tidx;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMER_ENTRY\tpBeamformEntry = &pBeamInfo->BeamformerEntry[pBeamInfo->mu_ap_index];\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] On VHT GID mgnt frame!\\n\", __func__));\t\t\n\n\t/* Check length*/\n\tif (pPduOS->Length < (FRAME_OFFSET_VHT_GID_MGNT_USER_POSITION_ARRAY+16)) {\t\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Beamforming_GetVHTGIDMgntFrame(): Invalid length (%d)\\n\", pPduOS->Length));\n\t\treturn RT_STATUS_INVALID_LENGTH;\n\t}\n\n\t/* Check RA*/\n\tpRaddr = (pu1Byte)(pPduOS->Octet)+4;\n\tif (!eqMacAddr(pRaddr, Adapter->CurrentAddress)) {\t\t\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Beamforming_GetVHTGIDMgntFrame(): Drop because of RA error.\\n\"));\n\t\treturn RT_STATUS_PKT_DROP;\n\t}\n\n\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"On VHT GID Mgnt Frame ==>:\\n\", pPduOS->Octet, pPduOS->Length);\n\n\t/*Parsing Membership Status Array*/\n\tpBuffer = pPduOS->Octet + FRAME_OFFSET_VHT_GID_MGNT_MEMBERSHIP_STATUS_ARRAY;\n\tfor (idx = 0; idx < 8; idx++) {\n\t\tMemStatus[idx] = GET_VHT_GID_MGNT_INFO_MEMBERSHIP_STATUS(pBuffer+idx);\n\t\tpBeamformEntry->gid_valid[idx] = GET_VHT_GID_MGNT_INFO_MEMBERSHIP_STATUS(pBuffer+idx);\n\t}\n\n\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"MemStatus: \", MemStatus, 8);\n\n\t/* Parsing User Position Array*/\n\tpBuffer = pPduOS->Octet + FRAME_OFFSET_VHT_GID_MGNT_USER_POSITION_ARRAY;\n\tfor (idx = 0; idx < 16; idx++) {\n\t\tUserPos[idx] = GET_VHT_GID_MGNT_INFO_USER_POSITION(pBuffer+idx);\n\t\tpBeamformEntry->user_position[idx] = GET_VHT_GID_MGNT_INFO_USER_POSITION(pBuffer+idx);\n\t}\n\n\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"UserPos: \", UserPos, 16);\n\n\t/* Group ID detail printed*/\n\t{\n\t\tu1Byte\ti, j;\n\t\tu1Byte\ttmpVal;\n\t\tu2Byte\ttmpVal2;\n\n\t\tfor (i = 0; i < 8; i++) {\n\t\t\ttmpVal = MemStatus[i];\n\t\t\ttmpVal2 = ((UserPos[i*2 + 1] << 8) & 0xFF00) + (UserPos[i * 2] & 0xFF);\n\t\t\tfor (j = 0; j < 8; j++) {\n\t\t\t\tif ((tmpVal >> j) & BIT0) {\n\t\t\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"Use Group ID (%d), User Position (%d)\\n\",\n\t\t\t\t\t\t(i*8+j), (tmpVal2 >> 2 * j)&0x3));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Indicate GID frame to IHV service. */\n\t{\n\t\tu1Byte\tIndibuffer[24] = {0};\n\t\tu1Byte\tIndioffset = 0;\n\t\t\t\n\t\tPlatformMoveMemory(Indibuffer + Indioffset, pBeamformEntry->gid_valid, 8);\n\t\tIndioffset += 8;\n\t\tPlatformMoveMemory(Indibuffer + Indioffset, pBeamformEntry->user_position, 16);\n\t\tIndioffset += 16;\n\n\t\tPlatformIndicateCustomStatus(\n\t\t\tAdapter,\n\t\t\tRT_CUSTOM_EVENT_VHT_RECV_GID_MGNT_FRAME,\n\t\t\tRT_CUSTOM_INDI_TARGET_IHV,\n\t\t\tIndibuffer,\n\t\t\tIndioffset);\n\t}\n\n\t/* Config HW GID table */\n\thalComTxbf_ConfigGtab(pDM_Odm);\n\n\treturn rtStatus;\n}\n\n/*\n// Description: Construct VHT Group ID (GID) management frame.\n//\n// 2015.05.20. Created by tynli.\n*/\nVOID\nConstructVHTGIDMgntFrame(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry,\n\tOUT\tpu1Byte\t\t\tBuffer,\n\tOUT\tpu4Byte\t\t\tpLength\n\t\n)\n{\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\tOCTET_STRING\t\tosFTMFrame, tmp;\n\n\tFillOctetString(osFTMFrame, Buffer, 0);\n\t*pLength = 0;\n\n\tConstructMaFrameHdr(\n\t\t\t\t\tAdapter, \n\t\t\t\t\tRA, \n\t\t\t\t\tACT_CAT_VHT, \n\t\t\t\t\tACT_VHT_GROUPID_MANAGEMENT, \n\t\t\t\t\t&osFTMFrame);\n\n\t/* Membership Status Array*/\n\tFillOctetString(tmp, pBeamformEntry->gid_valid, 8);\n\tPacketAppendData(&osFTMFrame, tmp);\n\n\t/* User Position Array*/\n\tFillOctetString(tmp, pBeamformEntry->user_position, 16);\n\tPacketAppendData(&osFTMFrame, tmp);\n\n\t*pLength = osFTMFrame.Length;\n\n\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"ConstructVHTGIDMgntFrame():\\n\", Buffer, *pLength);\n}\n\nBOOLEAN\nSendSWVHTGIDMgntFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu1Byte\t\t\tIdx\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu1Byte\t\t\t\t\tDataRate = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = &pBeamInfo->BeamformeeEntry[Idx];\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\t\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetBuffer(Adapter, &pTcb, &pBuf)) {\n\t\tConstructVHTGIDMgntFrame(\n\t\t\t\tpDM_Odm, \n\t\t\t\tRA,\n\t\t\t\tpBeamformEntry,\n\t\t\t\tpBuf->Buffer.VirtualAddress, \n\t\t\t\t&pTcb->PacketLength\n\t\t\t\t);\n\n\t\tpTcb->BWOfPacket = CHANNEL_WIDTH_20;\n\t\tDataRate = MGN_6M;\n\t\tMgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, DataRate);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n\n/*\n// Description: Construct VHT beamforming report poll.\n//\n// 2015.05.20. Created by tynli.\n*/\nVOID\nConstructVHTBFReportPoll(\n\tIN\tPDM_ODM_T\t\tpDM_Odm,\n\tIN\tpu1Byte\t\t\tRA,\n\tOUT\tpu1Byte\t\t\tBuffer,\n\tOUT\tpu4Byte\t\t\tpLength\n)\n{\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\tpu1Byte\t\t\tpBFRptPoll = Buffer;\n\t\n\t/* Frame control*/\n\tSET_80211_HDR_FRAME_CONTROL(pBFRptPoll, 0);\n\tSET_80211_HDR_TYPE_AND_SUBTYPE(pBFRptPoll, Type_Beamforming_Report_Poll);\n\n\t/* Duration*/\t\n\tSET_80211_HDR_DURATION(pBFRptPoll, 100);\n\n\t/* RA*/\n\tSET_VHT_BF_REPORT_POLL_RA(pBFRptPoll, RA);\n\n\t/* TA*/\n\tSET_VHT_BF_REPORT_POLL_TA(pBFRptPoll, Adapter->CurrentAddress);\n\n\t/* Feedback Segment Retransmission Bitmap*/\n\tSET_VHT_BF_REPORT_POLL_FEEDBACK_SEG_RETRAN_BITMAP(pBFRptPoll, 0xFF);\n\n\t*pLength = 17;\n\n\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"ConstructVHTBFReportPoll():\\n\", Buffer, *pLength);\n\n}\n\nBOOLEAN\nSendSWVHTBFReportPoll(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tBOOLEAN\t\t\tbFinalPoll\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu1Byte\t\t\t\t\tIdx = 0, DataRate = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetBuffer(Adapter, &pTcb, &pBuf)) {\n\t\tConstructVHTBFReportPoll(\n\t\t\t\tpDM_Odm, \n\t\t\t\tRA,\n\t\t\t\tpBuf->Buffer.VirtualAddress, \n\t\t\t\t&pTcb->PacketLength\n\t\t\t\t);\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE; /* <tynli_note> need?*/\n\t\tpTcb->BWOfPacket = CHANNEL_WIDTH_20;\n\n\t\tif (bFinalPoll)\n\t\t\tpTcb->TxBFPktType = RT_BF_PKT_TYPE_FINAL_BF_REPORT_POLL;\n\t\telse\n\t\t\tpTcb->TxBFPktType = RT_BF_PKT_TYPE_BF_REPORT_POLL;\n\t\t\n\t\tDataRate = MGN_6M;\t/* Legacy OFDM rate*/\n\t\tMgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, DataRate);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"SendSWVHTBFReportPoll():\\n\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n\n}\n\n\n/*\n// Description: Construct VHT MU NDPA packet.\n//\t<Note> We should combine this function with ConstructVHTNDPAPacket() in the future.\n//\n// 2015.05.21. Created by tynli.\n*/\nVOID\nConstructVHTMUNDPAPacket(\n\tIN PDM_ODM_T\t\tpDM_Odm,\n\tIN CHANNEL_WIDTH\tBW,\n\tOUT pu1Byte\t\t\tBuffer,\n\tOUT pu4Byte\t\t\tpLength\n\t)\n{\t\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\tu2Byte\t\t\t\t\tDuration = 0;\n\tu1Byte\t\t\t\t\tSequence = 0;\n\tpu1Byte\t\t\t\t\tpNDPAFrame = Buffer;\n\tRT_NDPA_STA_INFO\t\tSTAInfo;\n\tu1Byte\t\t\t\t\tidx;\n\tu1Byte\t\t\t\t\tDestAddr[6] = {0};\n\tPRT_BEAMFORMEE_ENTRY\tpEntry = NULL;\n\n\t/* Fill the first MU BFee entry (STA1) MAC addr to destination address then\n\t     HW will change A1 to broadcast addr. 2015.05.28. Suggested by SD1 Chunchu. */\n\tfor (idx = 0; idx < BEAMFORMEE_ENTRY_NUM; idx++) {\t\t\n\t\tpEntry = &(pBeamInfo->BeamformeeEntry[idx]);\n\t\tif (pEntry->is_mu_sta) {\n\t\t\tcpMacAddr(DestAddr, pEntry->MacAddr);\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (pEntry == NULL)\n\t\treturn;\n\n\t/* Frame control.*/\n\tSET_80211_HDR_FRAME_CONTROL(pNDPAFrame, 0);\n\tSET_80211_HDR_TYPE_AND_SUBTYPE(pNDPAFrame, Type_NDPA);\n\n\tSET_80211_HDR_ADDRESS1(pNDPAFrame, DestAddr);\n\tSET_80211_HDR_ADDRESS2(pNDPAFrame, pEntry->MyMacAddr);\n\n\t/*--------------------------------------------*/\n\t/* <Note> Need to modify \"Duration\" to MU consideration. */\n\tDuration = 2*aSifsTime + 44;\n\t\n\tif (BW == CHANNEL_WIDTH_80)\n\t\tDuration += 40;\n\telse if(BW == CHANNEL_WIDTH_40)\n\t\tDuration+= 87;\n\telse\t\n\t\tDuration+= 180;\n\t/*--------------------------------------------*/\n\n\tSET_80211_HDR_DURATION(pNDPAFrame, Duration);\n\n\tSequence = *(pDM_Odm->pSoundingSeq) << 2;\n\tODM_MoveMemory(pDM_Odm, pNDPAFrame + 16, &Sequence, 1);\n\n\t*pLength = 17;\n\n\t/* Construct STA info. for multiple STAs*/\n\tfor (idx = 0; idx < BEAMFORMEE_ENTRY_NUM; idx++) {\t\t\n\t\tpEntry = &(pBeamInfo->BeamformeeEntry[idx]);\n\t\tif (pEntry->is_mu_sta) {\n\t\t\tSTAInfo.AID = pEntry->AID;\n\t\t\tSTAInfo.FeedbackType = 1; /* 1'b1: MU*/\n\t\t\tSTAInfo.NcIndex = 0;\n\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Get BeamformeeEntry idx(%d), AID =%d\\n\", __func__, idx, pEntry->AID));\n\t\t\t\n\t\t\tODM_MoveMemory(pDM_Odm, pNDPAFrame+(*pLength), (pu1Byte)&STAInfo, 2);\n\t\t\t*pLength += 2;\n\t\t}\n\t}\n\n}\n\nBOOLEAN\nSendSWVHTMUNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_TCB\t\t\t\t\tpTcb;\n\tPRT_TX_LOCAL_BUFFER\t\tpBuf;\n\tBOOLEAN\t\t\t\t\tret = TRUE;\n\tu1Byte\t\t\t\t\tNDPTxRate = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPADAPTER\t\t\t\tAdapter = pBeamInfo->SourceAdapter;\n\n\tNDPTxRate = MGN_VHT2SS_MCS0;\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\n\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\n\tif (MgntGetBuffer(Adapter, &pTcb, &pBuf)) {\n\t\tConstructVHTMUNDPAPacket(\n\t\t\t\tpDM_Odm,\n\t\t\t\tBW,\n\t\t\t\tpBuf->Buffer.VirtualAddress, \n\t\t\t\t&pTcb->PacketLength\n\t\t\t\t);\n\n\t\tpTcb->bTxEnableSwCalcDur = TRUE;\n\t\tpTcb->BWOfPacket = BW;\n\t\tpTcb->TxBFPktType = RT_BF_PKT_TYPE_BROADCAST_NDPA;\n\n\t\t/*rate of NDP decide by Nr*/\n\t\tMgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, NDPTxRate);\n\t} else\n\t\tret = FALSE;\n\t\n\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\t\n\n\tif (ret)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"\", pBuf->Buffer.VirtualAddress, pTcb->PacketLength);\n\n\treturn ret;\n}\n\n#endif\t/*#if (SUPPORT_MU_BF == 1)*/\n#endif\t/*#ifdef SUPPORT_MU_BF*/\n\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\nu4Byte\nBeamforming_GetReportFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tunion recv_frame *precv_frame\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu4Byte\t\t\t\t\tret = _SUCCESS;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = NULL;\n\tpu1Byte\t\t\t\t\tpframe = precv_frame->u.hdr.rx_data;\n\tu4Byte\t\t\t\t\tframe_len = precv_frame->u.hdr.len;\n\tpu1Byte\t\t\t\t\tTA;\n\tu1Byte\t\t\t\t\tIdx, offset;\n\t\n\t/*DBG_871X(\"beamforming_get_report_frame\\n\");*/\n\n\t/*Memory comparison to see if CSI report is the same with previous one*/\n\tTA = GetAddr2Ptr(pframe);\n\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, TA, &Idx);\n\tif(pBeamformEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\toffset = 31;\t\t/*24+(1+1+3)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/\n\telse if(pBeamformEntry->BeamformEntryCap & BEAMFORMER_CAP_HT_EXPLICIT)\n\t\toffset = 34;\t\t/*24+(1+1+6)+2  MAC header+(Category+ActionCode+MIMOControlField)+SNR(Nc=2)*/\n\telse\n\t\treturn ret;\n\n\t/*DBG_871X(\"%s MacId %d offset=%d\\n\", __FUNCTION__, pBeamformEntry->mac_id, offset);*/\n\t\n\treturn ret;\n}\n\n\nBOOLEAN\nSendFWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu1Byte\tActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\n\tu1Byte\t*pframe;\n\tu2Byte\t*fctrl;\n\tu2Byte\tduration = 0;\n\tu1Byte\taSifsTime = 0, NDPTxRate = 0, Idx = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\t\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\n\tpattrib->qsel = QSLT_BEACON;\n\tNDPTxRate = Beamforming_GetHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = BW;\n\tpattrib->order = 1;\n\tpattrib->subtype = WIFI_ACTION_NOACK;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetOrderBit(pframe);\n\tSetFrameSubType(pframe, WIFI_ACTION_NOACK);\n\n\t_rtw_memcpy(pwlanhdr->addr1, RA, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pBeamformEntry->MyMacAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tif( pmlmeext->cur_wireless_mode == WIRELESS_11B)\n\t\taSifsTime = 10;\n\telse\n\t\taSifsTime = 16;\n\n\tduration = 2*aSifsTime + 40;\n\t\n\tif(BW == CHANNEL_WIDTH_40)\n\t\tduration+= 87;\n\telse\t\n\t\tduration+= 180;\n\n\tSetDuration(pframe, duration);\n\n\t//HT control field\n\tSET_HT_CTRL_CSI_STEERING(pframe+24, 3);\n\tSET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1);\n\n\t_rtw_memcpy(pframe+28, ActionHdr, 4);\n\n\tpattrib->pktlen = 32;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n}\n\n\nBOOLEAN\nSendSWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu1Byte\tActionHdr[4] = {ACT_CAT_VENDOR, 0x00, 0xe0, 0x4c};\n\tpu1Byte\tpframe;\n\tpu2Byte\tfctrl;\n\tu2Byte\tduration = 0;\n\tu1Byte\taSifsTime = 0, NDPTxRate = 0, Idx = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tNDPTxRate = Beamforming_GetHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\t\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\t\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\tpattrib->qsel = QSLT_MGNT;\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = BW;\n\tpattrib->order = 1;\n\tpattrib->subtype = WIFI_ACTION_NOACK;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetOrderBit(pframe);\n\tSetFrameSubType(pframe, WIFI_ACTION_NOACK);\n\n\t_rtw_memcpy(pwlanhdr->addr1, RA, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pBeamformEntry->MyMacAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tif (pmlmeext->cur_wireless_mode == WIRELESS_11B)\n\t\taSifsTime = 10;\n\telse\n\t\taSifsTime = 16;\n\n\tduration = 2*aSifsTime + 40;\n\t\n\tif (BW == CHANNEL_WIDTH_40)\n\t\tduration += 87;\n\telse\t\n\t\tduration += 180;\n\n\tSetDuration(pframe, duration);\n\n\t/*HT control field*/\n\tSET_HT_CTRL_CSI_STEERING(pframe+24, 3);\n\tSET_HT_CTRL_NDP_ANNOUNCEMENT(pframe+24, 1);\n\n\t_rtw_memcpy(pframe+28, ActionHdr, 4);\n\n\tpattrib->pktlen = 32;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n}\n\n\nBOOLEAN\nSendFWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tpu1Byte\tpframe;\n\tpu2Byte\tfctrl;\n\tu2Byte\tduration = 0;\n\tu1Byte\tsequence = 0, aSifsTime = 0, NDPTxRate= 0, Idx = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\tRT_NDPA_STA_INFO\tsta_info;\n\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\t\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\t_rtw_memcpy(pattrib->ra, RA, ETH_ALEN);\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\n\tpattrib->qsel = QSLT_BEACON;\n\tNDPTxRate = Beamforming_GetVHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = BW;\n\tpattrib->subtype = WIFI_NDPA;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetFrameSubType(pframe, WIFI_NDPA);\n\n\t_rtw_memcpy(pwlanhdr->addr1, RA, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pBeamformEntry->MyMacAddr, ETH_ALEN);\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode))\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tduration = 2*aSifsTime + 44;\n\t\n\tif(BW == CHANNEL_WIDTH_80)\n\t\tduration += 40;\n\telse if(BW == CHANNEL_WIDTH_40)\n\t\tduration+= 87;\n\telse\t\n\t\tduration+= 180;\n\n\tSetDuration(pframe, duration);\n\n\tsequence = pBeamInfo->SoundingSequence<< 2;\n\tif (pBeamInfo->SoundingSequence >= 0x3f)\n\t\tpBeamInfo->SoundingSequence = 0;\n\telse\n\t\tpBeamInfo->SoundingSequence++;\n\n\t_rtw_memcpy(pframe+16, &sequence,1);\n\n\tif (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\tAID = 0;\t\t\n\n\tsta_info.AID = AID;\n\tsta_info.FeedbackType = 0;\n\tsta_info.NcIndex= 0;\n\t\n\t_rtw_memcpy(pframe+17, (u8 *)&sta_info, 2);\n\n\tpattrib->pktlen = 19;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\n\treturn _TRUE;\n}\n\n\n\nBOOLEAN\nSendSWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t)\n{\n\tPDM_ODM_T\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tstruct xmit_frame\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t*pattrib;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tstruct xmit_priv\t\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct mlme_priv\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tRT_NDPA_STA_INFO\tndpa_sta_info;\n\tu1Byte\tNDPTxRate = 0, sequence = 0, aSifsTime = 0, Idx = 0;\n\tpu1Byte\tpframe;\n\tpu2Byte\tfctrl;\n\tu2Byte\tduration = 0;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &(pDM_Odm->BeamformingInfo);\n\tPRT_BEAMFORMEE_ENTRY\tpBeamformEntry = phydm_Beamforming_GetBFeeEntryByAddr(pDM_Odm, RA, &Idx);\n\n\tNDPTxRate = Beamforming_GetVHTNDPTxRate(pDM_Odm, pBeamformEntry->CompSteeringNumofBFer);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] NDPTxRate =%d\\n\", __func__, NDPTxRate));\n\n\tpmgntframe = alloc_mgtxmitframe(pxmitpriv);\n\t\n\tif (pmgntframe == NULL) {\n\t\tDBG_871X(\"%s, alloc mgnt frame fail\\n\", __func__);\n\t\treturn _FALSE;\n\t}\n\t\n\t/*update attribute*/\n\tpattrib = &pmgntframe->attrib;\n\t_rtw_memcpy(pattrib->ra, RA, ETH_ALEN);\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\tpattrib->qsel = QSLT_MGNT;\n\tpattrib->rate = NDPTxRate;\n\tpattrib->bwmode = BW;\n\tpattrib->subtype = WIFI_NDPA;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\tSetFrameSubType(pframe, WIFI_NDPA);\n\n\t_rtw_memcpy(pwlanhdr->addr1, RA, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, pBeamformEntry->MyMacAddr, ETH_ALEN);\n\n\tif (IsSupported5G(pmlmeext->cur_wireless_mode) || IsSupportedHT(pmlmeext->cur_wireless_mode))\n\t\taSifsTime = 16;\n\telse\n\t\taSifsTime = 10;\n\n\tduration = 2*aSifsTime + 44;\n\t\n\tif (BW == CHANNEL_WIDTH_80)\n\t\tduration += 40;\n\telse if (BW == CHANNEL_WIDTH_40)\n\t\tduration += 87;\n\telse\t\n\t\tduration += 180;\n\n\tSetDuration(pframe, duration);\n\t\n\tsequence = pBeamInfo->SoundingSequence << 2;\n\tif (pBeamInfo->SoundingSequence >= 0x3f)\n\t\tpBeamInfo->SoundingSequence = 0;\n\telse\n\t\tpBeamInfo->SoundingSequence++;\n\n\t_rtw_memcpy(pframe+16, &sequence, 1);\n\tif (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\tAID = 0;\t\t\n\n\tndpa_sta_info.AID = AID;\n\tndpa_sta_info.FeedbackType = 0;\n\tndpa_sta_info.NcIndex = 0;\n\t\n\t_rtw_memcpy(pframe+17, (u8 *)&ndpa_sta_info, 2);\n\n\tpattrib->pktlen = 19;\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tdump_mgntframe(Adapter, pmgntframe);\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] [%d]\\n\", __func__, __LINE__));\n\t\n\treturn _TRUE;\n}\n\n\n#endif\n\n\nVOID\nBeamforming_GetNDPAFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tOCTET_STRING\tpduOS\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tunion recv_frame *precv_frame\n#endif\n)\n{\n\tPDM_ODM_T\t\t\t\t\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPADAPTER\t\t\t\t\tAdapter = pDM_Odm->Adapter;\n\tpu1Byte\t\t\t\t\t\tTA ;\n\tu1Byte\t\t\t\t\t\tIdx, Sequence;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tpu1Byte\t\t\t\t\t\tpNDPAFrame = pduOS.Octet;\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tpu1Byte\t\t\t\t\t\tpNDPAFrame = precv_frame->u.hdr.rx_data;\n#endif\n\tPRT_BEAMFORMER_ENTRY\t\tpBeamformerEntry = NULL;\t\t/*Modified By Jeffery @2014-10-29*/\n\t\n\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t\tRT_DISP_DATA(FBEAM, FBEAM_DATA, \"Beamforming_GetNDPAFrame\\n\", pduOS.Octet, pduOS.Length);\n\tif (IsCtrlNDPA(pNDPAFrame) == FALSE)\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tif (GetFrameSubType(pNDPAFrame) != WIFI_NDPA)\n#endif\n\t\treturn;\n\telse if (!(pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821))) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] not 8812 or 8821A, return\\n\", __func__));\n\t\treturn;\n\t}\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tTA = Frame_Addr2(pduOS);\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tTA = GetAddr2Ptr(pNDPAFrame);\n#endif\n\t/*Remove signaling TA. */\n\tTA[0] = TA[0] & 0xFE;\n    \n\tpBeamformerEntry = phydm_Beamforming_GetBFerEntryByAddr(pDM_Odm, TA, &Idx);\t\t// Modified By Jeffery @2014-10-29\n\n\t/*Break options for Clock Reset*/    \n\tif (pBeamformerEntry == NULL)\n\t\treturn;\n\telse if (!(pBeamformerEntry->BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU))\n\t\treturn;\n\t/*LogSuccess: As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is NO LONGER needed !2015-04-10, Jeffery*/\n\t/*ClockResetTimes: While BFer entry always doesn't receive our CSI, clock will reset again and again.So ClockResetTimes is limited to 5 times.2015-04-13, Jeffery*/\n\telse if ((pBeamformerEntry->LogSuccess == 1) || (pBeamformerEntry->ClockResetTimes == 5)) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] LogSeq=%d, PreLogSeq=%d, LogRetryCnt=%d, LogSuccess=%d, ClockResetTimes=%d, clock reset is no longer needed.\\n\", \n\t\t\t__func__, pBeamformerEntry->LogSeq, pBeamformerEntry->PreLogSeq, pBeamformerEntry->LogRetryCnt, pBeamformerEntry->LogSuccess, pBeamformerEntry->ClockResetTimes));\n\n        return;\n\t}\n\n\tSequence = (pNDPAFrame[16]) >> 2;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start, Sequence=%d, LogSeq=%d, PreLogSeq=%d, LogRetryCnt=%d, ClockResetTimes=%d, LogSuccess=%d\\n\", \n\t\t__func__, Sequence, pBeamformerEntry->LogSeq, pBeamformerEntry->PreLogSeq, pBeamformerEntry->LogRetryCnt, pBeamformerEntry->ClockResetTimes, pBeamformerEntry->LogSuccess));\n\n\tif ((pBeamformerEntry->LogSeq != 0) && (pBeamformerEntry->PreLogSeq != 0)) {\n\t\t/*Success condition*/\n\t\tif ((pBeamformerEntry->LogSeq != Sequence) && (pBeamformerEntry->PreLogSeq != pBeamformerEntry->LogSeq)) {\n\t\t\t/* break option for clcok reset, 2015-03-30, Jeffery */\n\t\t\tpBeamformerEntry->LogRetryCnt = 0;\n\t\t\t/*As long as 8812A receive NDPA and feedback CSI succeed once, clock reset is no longer needed.*/\n\t\t\t/*That is, LogSuccess is NOT needed to be reset to zero, 2015-04-13, Jeffery*/\n\t\t\tpBeamformerEntry->LogSuccess = 1;\n\n\t\t} else {/*Fail condition*/\n\n\t\t\tif (pBeamformerEntry->LogRetryCnt == 5) {\n\t\t\t\tpBeamformerEntry->ClockResetTimes++;\n\t\t\t\tpBeamformerEntry->LogRetryCnt = 0;\n\n\t\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Clock Reset!!! ClockResetTimes=%d\\n\", \n\t\t\t\t__func__, pBeamformerEntry->ClockResetTimes));\n\t\t\tHalComTxbf_Set(pDM_Odm, TXBF_SET_SOUNDING_CLK, NULL);\n\n\t\t\t} else\n\t\t\t\tpBeamformerEntry->LogRetryCnt++;\n\t\t}\n\t}\n\n\t/*Update LogSeq & PreLogSeq*/\n\tpBeamformerEntry->PreLogSeq = pBeamformerEntry->LogSeq;\n\tpBeamformerEntry->LogSeq = Sequence;\n\t\n}\n\n\n\n#endif\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbfinterface.h",
    "content": "#ifndef __HAL_TXBF_INTERFACE_H__\n#define __HAL_TXBF_INTERFACE_H__\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\nVOID\nBeamforming_GidPAid(\n\tPADAPTER\tAdapter,\n\tPRT_TCB\t\tpTcb\n\t);\n\nRT_STATUS\nBeamforming_GetReportFrame(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPRT_RFD\t\t\tpRfd,\n\tIN\tPOCTET_STRING\tpPduOS\n\t);\n\nVOID\nBeamforming_GetNDPAFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tOCTET_STRING\tpduOS\n\t);\n\nBOOLEAN\nSendFWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendFWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendSWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendSWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\n#ifdef SUPPORT_MU_BF\n#if (SUPPORT_MU_BF == 1)\nRT_STATUS\nBeamforming_GetVHTGIDMgntFrame(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tPRT_RFD\t\t\tpRfd,\n\tIN\tPOCTET_STRING\tpPduOS\n\t);\n\nBOOLEAN\nSendSWVHTGIDMgntFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu1Byte\t\t\tIdx\n\t);\n\nBOOLEAN\nSendSWVHTBFReportPoll(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tBOOLEAN\t\t\tbFinalPoll\n\t);\n\nBOOLEAN\nSendSWVHTMUNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n#else\n#define Beamforming_GetVHTGIDMgntFrame(Adapter, pRfd, pPduOS) RT_STATUS_FAILURE\n#define SendSWVHTGIDMgntFrame(pDM_VOID, RA)\n#define SendSWVHTBFReportPoll(pDM_VOID, RA, bFinalPoll)\n#define SendSWVHTMUNDPAPacket(pDM_VOID, BW)\n#endif\n#endif\n\n\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\nu4Byte\nBeamforming_GetReportFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tunion recv_frame *precv_frame\n\t);\n\nBOOLEAN\nSendFWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendSWHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendFWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n\nBOOLEAN\nSendSWVHTNDPAPacket(\n\tIN\tPVOID\t\t\tpDM_VOID,\n\tIN\tpu1Byte\t\t\tRA,\n\tIN\tu2Byte\t\t\tAID,\n\tIN\tCHANNEL_WIDTH\tBW\n\t);\n#endif\n\nVOID\nBeamforming_GetNDPAFrame(\n\tIN\tPVOID\t\t\tpDM_VOID,\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tIN\tOCTET_STRING\tpduOS\n#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\n\tunion recv_frame *precv_frame\n#endif\n);\n\n#else\n#define Beamforming_GetNDPAFrame(pDM_Odm, _PduOS)\n#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\n#define Beamforming_GetReportFrame(Adapter, precv_frame)\t\tRT_STATUS_FAILURE\n#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n#define Beamforming_GetReportFrame(Adapter, pRfd, pPduOS)\t\tRT_STATUS_FAILURE\n#define Beamforming_GetVHTGIDMgntFrame(Adapter, pRfd, pPduOS) RT_STATUS_FAILURE\n#endif\n#define SendFWHTNDPAPacket(pDM_VOID, RA, BW)\n#define SendSWHTNDPAPacket(pDM_VOID, RA, BW)\n#define SendFWVHTNDPAPacket(pDM_VOID, RA, AID, BW)\n#define SendSWVHTNDPAPacket(pDM_VOID, RA,\tAID, BW)\n#define SendSWVHTGIDMgntFrame(pDM_VOID, RA, idx)\n#define SendSWVHTBFReportPoll(pDM_VOID, RA, bFinalPoll)\n#define SendSWVHTMUNDPAPacket(pDM_VOID, BW)\n#endif\n\n#endif\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbfjaguar.c",
    "content": "//============================================================\n// Description:\n//\n// This file is for 8812/8821/8811 TXBF mechanism\n//\n//============================================================\n#include \"mp_precomp.h\"\n#include \"../phydm_precomp.h\"\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))\nVOID\nHalTxbf8812A_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tODM_Write1Byte(pDM_Odm, REG_NDPA_OPT_CTRL_8812A,  (Rate << 2 | BW));\t\n\n}\n\nVOID\nhalTxbfJaguar_RfMode(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN PRT_BEAMFORMING_INFO\tpBeamInfo\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\t\n\tif (pDM_Odm->RFType == ODM_1T1R)\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] set TxIQGen\\n\", __func__));\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x1);\t/*RF Mode table write enable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x1);\t/*RF Mode table write enable*/\n\n\tif (pBeamInfo->beamformee_su_cnt > 0) {\n\t\t// Paath_A\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF);\t/*Enable TXIQGEN in RX mode*/\n\t\t// Path_B\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xE26BF);\t/*Enable TXIQGEN in RX mode*/\n\t} else {\n\t\t// Paath_A\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xC26BF);\t/*Disable TXIQGEN in RX mode*/\n\t\t// Path_B\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3);\t\t/*Select RX mode*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF);\t/*Set Table data*/\n\t\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xC26BF);\t/*Disable TXIQGEN in RX mode*/\n\t}\n\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\tODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x0);\t/*RF Mode table write disable*/\n\n\tif (pBeamInfo->beamformee_su_cnt > 0)\n\t\tODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x33);\n\telse\n\t\tODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x11);\n}\n\n\nVOID\nhalTxbfJaguar_DownloadNDPA(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\tu1bTmp = 0, tmpReg422 = 0, Head_Page;\n\tu1Byte\t\t\tBcnValidReg = 0, count = 0, DLBcnCount = 0;\n\tBOOLEAN\t\t\tbSendBeacon = FALSE;\n\tu1Byte\t\t\tTxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8812;\t/*default reseved 1 page for the IC type which is undefined.*/\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\tPADAPTER\t\tAdapter = pDM_Odm->Adapter;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t*pDM_Odm->pbFwDwRsvdPageInProgress = TRUE;\n#endif\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (Idx == 0)\n\t\tHead_Page = 0xFE;\n\telse\n\t\tHead_Page = 0xFE;\n\n\tAdapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu1Byte)&TxPageBndy);\n\n\t/*Set REG_CR bit 8. DMA beacon by SW.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8812A + 1);\n\tODM_Write1Byte(pDM_Odm,  REG_CR_8812A + 1, (u1bTmp | BIT0));\n\n\n\t/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/\n\ttmpReg422 = ODM_Read1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8812A + 2);\n\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8812A + 2,  tmpReg422 & (~BIT6));\n\n\tif (tmpReg422 & BIT6) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\\n\"));\n\t\tbSendBeacon = TRUE;\n\t}\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, Head_Page);\n\n\tdo {\n\t\t/*Clear beacon valid check bit.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 2, (BcnValidReg | BIT0));\n\n\t\t/*download NDPA rsvd page.*/\n\t\tif (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tBeamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);\n\t\telse\n\t\t\tBeamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);\n\n\t\t/*check rsvd page download OK.*/\n\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\tcount = 0;\n\t\twhile (!(BcnValidReg & BIT0) && count < 20) {\n\t\t\tcount++;\n\t\t\tODM_delay_ms(10);\n\t\t\tBcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);\n\t\t}\n\t\tDLBcnCount++;\n\t} while (!(BcnValidReg & BIT0) && DLBcnCount < 5);\n\n\tif (!(BcnValidReg & BIT0))\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"%s Download RSVD page failed!\\n\", __func__));\n\n\t/*TDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, TxPageBndy);\n\n\t/*To make sure that if there exists an adapter which would like to send beacon.*/\n\t/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/\n\t/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause*/\n\t/*the beacon cannot be sent by HW.*/\n\t/*2010.06.23. Added by tynli.*/\n\tif (bSendBeacon)\n\t\tODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8812A + 2, tmpReg422);\n\n\t/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/\n\t/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/\n\tu1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8812A + 1);\n\tODM_Write1Byte(pDM_Odm, REG_CR_8812A + 1, (u1bTmp & (~BIT0)));\n\n\tpBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\t*pDM_Odm->pbFwDwRsvdPageInProgress = FALSE;\n#endif\n}\n\n\nVOID\nhalTxbfJaguar_FwTxBFCmd(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\tIdx, Period0 = 0, Period1 = 0;\n\tu1Byte\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu1Byte\tu1TxBFParm[3] = {0};\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tfor (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {\n\t\t/*Modified by David*/\n\t\tif (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\t\tif (Idx == 0) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum0 = 0xFF; /*stop sounding*/\n\t\t\t\tPeriod0 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t} else if (Idx == 1) {\n\t\t\t\tif (pBeamInfo->BeamformeeEntry[Idx].bSound)\n\t\t\t\t\tPageNum1 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum1 = 0xFF; /*stop sounding*/\n\t\t\t\tPeriod1 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);\n\t\t\t}\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = (Period1 << 4) | Period0;\n\tODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_TXBF, 3, u1TxBFParm);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, \n\t\t(\"[%s] PageNum0 = %d Period0 = %d, PageNum1 = %d Period1 %d\\n\", __func__, PageNum0, Period0, PageNum1, Period1));\n}\n\n\nVOID\nHalTxbfJaguar_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tBFerBFeeIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu1Byte\t\t\t\t\ti = 0;\n\tu1Byte\t\t\t\t\tBFerIdx = (BFerBFeeIdx & 0xF0) >> 4;\n\tu1Byte\t\t\t\t\tBFeeIdx = (BFerBFeeIdx & 0xF);\n\tu4Byte\t\t\t\t\tCSI_Param;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tu2Byte\t\t\t\t\tSTAid = 0;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]Start!\\n\", __func__));\n\n\thalTxbfJaguar_RfMode(pDM_Odm, pBeamformingInfo);\n\n\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x00000000);\t/*Nc =2*/\n\telse\n\t\tODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x01081008);\t/*Nc =1*/\n\n\tif ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];\n\n\t\t/*Sounding protocol control*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8812A, 0xCB);\n\n\t\t/*MAC address/Partial AID of Beamformer*/\n\t\tif (BFerIdx == 0) {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_BFMER0_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\n\t\t\t/*CSI report use legacy ofdm so don't need to fill P_AID. */\n\t\t\t/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER0_INFO_8812A+6, BeamformEntry.P_AID); */\n\t\t} else {\n\t\t\tfor (i = 0; i < 6 ; i++)\n\t\t\t\tODM_Write1Byte(pDM_Odm, (REG_BFMER1_INFO_8812A + i), BeamformerEntry.MacAddr[i]);\n\t\t\t/*CSI report use legacy ofdm so don't need to fill P_AID.*/\n\t\t\t/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER1_INFO_8812A+6, BeamformEntry.P_AID);*/\n\t\t}\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU) {\n\t\t\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\t\t\tCSI_Param = 0x01090109;\n\t\t\telse\n\t\t\t\tCSI_Param = 0x01080108;\n\t\t} else {\n\t\t\tif (pDM_Odm->RFType == ODM_2T2R)\n\t\t\t\tCSI_Param = 0x03090309;\n\t\t\telse\n\t\t\t\tCSI_Param = 0x03080308;\n\t\t}\n\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8812A, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8812A, CSI_Param);\n\t\tODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8812A, CSI_Param);\n\n\t\t/*Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us,  MP chip)*/\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8812A + 3, 0x50);\n\t}\n\n\n\tif ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];\n\n\t\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\t\tSTAid = BeamformeeEntry.MacId;\n\t\telse\n\t\t\tSTAid = BeamformeeEntry.P_AID;\n\n\t\t/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/\n\t\tif (BFeeIdx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8812A, STAid);\n\t\t\tODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8812A + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8812A + 3) | BIT4 | BIT6 | BIT7);\n\t\t} else\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8812A + 2, STAid | BIT12 | BIT14 | BIT15);\n\n\t\t/*CSI report parameters of Beamformee*/\n\t\tif (BFeeIdx == 0) {\n\t\t\t/*Get BIT24 & BIT25*/\n\t\t\tu1Byte\ttmp = ODM_Read1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3) & 0x3;\n\n\t\t\tODM_Write1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3, tmp | 0x60);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, STAid | BIT9);\n\t\t} else {\n\t\t\t/*Set BIT25*/\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, STAid | 0xE200);\n\t\t}\n\t\t\tphydm_Beamforming_Notify(pDM_Odm);\n\t}\n}\n\n\nVOID\nHalTxbfJaguar_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamformingInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMER_ENTRY\tBeamformerEntry;\n\tRT_BEAMFORMEE_ENTRY\tBeamformeeEntry;\n\t\n\tif (Idx < BEAMFORMER_ENTRY_NUM) {\n\t\tBeamformerEntry = pBeamformingInfo->BeamformerEntry[Idx];\n\t\tBeamformeeEntry = pBeamformingInfo->BeamformeeEntry[Idx];\n\t} else\n\t\treturn;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s]Start!, IDx = %d\\n\", __func__, Idx));\n\n\t/*Clear P_AID of Beamformee*/\n\t/*Clear MAC address of Beamformer*/\n\t/*Clear Associated Bfmee Sel*/\n\t\n\tif (BeamformerEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8812A, 0xC8);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_BFMER0_INFO_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMER0_INFO_8812A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8812A, 0);\n\t\t} else {\n\t\t\tODM_Write4Byte(pDM_Odm, REG_BFMER1_INFO_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMER1_INFO_8812A + 4, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8812A, 0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8812A, 0);\n\t\t}\n\t}\n\n\tif (BeamformeeEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {\n\t\thalTxbfJaguar_RfMode(pDM_Odm, pBeamformingInfo);\n\t\tif (Idx == 0) {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8812A, 0x0);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, 0);\n\t\t} else {\n\t\t\tODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8812A + 2, ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8812A + 2) & 0xF000);\n\t\t\tODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, ODM_Read2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2) & 0x60);\n\t\t}\n\t}\n\t\n}\n\n\nVOID\nHalTxbfJaguar_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\t\t\t\t\tBeamCtrlVal;\n\tu4Byte\t\t\t\t\tBeamCtrlReg;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tRT_BEAMFORMEE_ENTRY\tBeamformEntry = pBeamInfo->BeamformeeEntry[Idx];\n\n\tif (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))\n\t\tBeamCtrlVal = BeamformEntry.MacId;\n\telse\n\t\tBeamCtrlVal = BeamformEntry.P_AID;\n\n\tif (Idx == 0)\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8812A;\n\telse {\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8812A + 2;\n\t\tBeamCtrlVal |= BIT12 | BIT14 | BIT15;\n\t}\n\n\tif (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {\n\t\tif (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)\n\t\t\tBeamCtrlVal |= BIT9;\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)\n\t\t\tBeamCtrlVal |= (BIT9 | BIT10);\n\t\telse if (BeamformEntry.SoundBW == CHANNEL_WIDTH_80)\n\t\t\tBeamCtrlVal |= (BIT9 | BIT10 | BIT11);\n\t} else\n\t\tBeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] BeamCtrlVal = 0x%x!\\n\", __func__, BeamCtrlVal));\n\n\tODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);\n}\n\n\n\nVOID\nHalTxbfJaguar_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\tPRT_BEAMFORMEE_ENTRY\tpBeamEntry = pBeamInfo->BeamformeeEntry + Idx;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\thalTxbfJaguar_DownloadNDPA(pDM_Odm, Idx);\n\n\thalTxbfJaguar_FwTxBFCmd(pDM_Odm);\n}\n\n\nVOID\nHalTxbfJaguar_Patch(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tOperation\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tPRT_BEAMFORMING_INFO\tpBeamInfo = &pDM_Odm->BeamformingInfo;\n\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (pBeamInfo->BeamformCap == BEAMFORMING_CAP_NONE)\n\t\treturn;\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tif (Operation == SCAN_OPT_BACKUP_BAND0)\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8812A, 0xC8);\n\telse if (Operation == SCAN_OPT_RESTORE)\n\t\tODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8812A, 0xCB);\n#endif\n}\n\nVOID\nHalTxbfJaguar_Clk_8812A(\n\tIN PVOID\t\t\tpDM_VOID\n)\n{\n\tPDM_ODM_T\tpDM_Odm = (PDM_ODM_T)pDM_VOID;\n\tu2Byte\tu2btmp;\n\tu1Byte\tCount = 0, u1btmp;\n\tPADAPTER\tAdapter = pDM_Odm->Adapter;\n\t\n\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] Start!\\n\", __func__));\n\n\tif (*(pDM_Odm->pbScanInProcess)) {\n\t\tODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, (\"[%s] return by Scan\\n\", __func__));\n\t\treturn;\n\t}\n#if DEV_BUS_TYPE == RT_PCI_INTERFACE\t\n\t/*Stop PCIe TxDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_PCIE_CTRL_REG_8812A + 1, 0xFE);\n#endif\n\n\t/*Stop Usb TxDMA*/\n#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\n\tRT_DISABLE_FUNC(Adapter, DF_TX_BIT);\n\tPlatformReturnAllPendingTxPackets(Adapter);\n#else\n\trtw_write_port_cancel(Adapter);\n#endif\n\n\t/*Wait TXFF empty*/\n\tfor (Count = 0; Count < 100; Count++) {\n\t\tu2btmp = ODM_Read2Byte(pDM_Odm, REG_TXPKT_EMPTY_8812A);\n\t\tu2btmp = u2btmp & 0xfff;\n\t\tif (u2btmp != 0xfff) {\n\t\t\tODM_delay_ms(10);\n\t\t\tcontinue;\n\t\t} else\n\t\t\tbreak;\n\t}\n\n\t/*TX pause*/\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF);\n\n\t/*Wait TX State Machine OK*/\n\tfor (Count = 0; Count < 100; Count++) {\n\t\tif (ODM_Read4Byte(pDM_Odm, REG_SCH_TXCMD_8812A) != 0)\n\t\t\tcontinue;\n\t\telse\n\t\t\tbreak;\n\t}\n\n\n\t/*Stop RX DMA path*/\n\tu1btmp = ODM_Read1Byte(pDM_Odm, REG_RXDMA_CONTROL_8812A);\n\tODM_Write1Byte(pDM_Odm, REG_RXDMA_CONTROL_8812A, u1btmp | BIT2);\n\n\tfor (Count = 0; Count < 100; Count++) {\n\t\tu1btmp = ODM_Read1Byte(pDM_Odm, REG_RXDMA_CONTROL_8812A);\n\t\tif (u1btmp & BIT1)\n\t\t\tbreak;\n\t\telse\n\t\t\tODM_delay_ms(10);\n\t}\n\n\t/*Disable clock*/\n\tODM_Write1Byte(pDM_Odm, REG_SYS_CLKR_8812A + 1, 0xf0);\n\t/*Disable 320M*/\n\tODM_Write1Byte(pDM_Odm, REG_AFE_PLL_CTRL_8812A + 3, 0x8);\n\t/*Enable 320M*/\n\tODM_Write1Byte(pDM_Odm, REG_AFE_PLL_CTRL_8812A + 3, 0xa);\n\t/*Enable clock*/\n\tODM_Write1Byte(pDM_Odm, REG_SYS_CLKR_8812A + 1, 0xfc);\n\n\n\t/*Release Tx pause*/\n\tODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0);\n\n\t/*Enable RX DMA path*/\n\tu1btmp = ODM_Read1Byte(pDM_Odm, REG_RXDMA_CONTROL_8812A);\n\tODM_Write1Byte(pDM_Odm, REG_RXDMA_CONTROL_8812A, u1btmp & (~BIT2));\n#if DEV_BUS_TYPE == RT_PCI_INTERFACE\n\t/*Enable PCIe TxDMA*/\n\tODM_Write1Byte(pDM_Odm, REG_PCIE_CTRL_REG_8812A + 1, 0);\n#endif\n\t/*Start Usb TxDMA*/\n\tRT_ENABLE_FUNC(Adapter, DF_TX_BIT);\n}\n\n#endif\n\n\n\n#endif\n\n"
  },
  {
    "path": "hal/phydm/txbf/haltxbfjaguar.h",
    "content": "#ifndef __HAL_TXBF_JAGUAR_H__\n#define __HAL_TXBF_JAGUAR_H__\n\n#if (BEAMFORMING_SUPPORT == 1)\n#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))\nVOID\nHalTxbf8812A_setNDPArate(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\tBW,\n\tIN u1Byte\tRate\n);\n\n\nVOID\nHalTxbfJaguar_Enter(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbfJaguar_Leave(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbfJaguar_Status(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN u1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbfJaguar_FwTxBF(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tIdx\n\t);\n\n\nVOID\nHalTxbfJaguar_Patch(\n\tIN PVOID\t\t\tpDM_VOID,\n\tIN\tu1Byte\t\t\t\tOperation\n\t);\n\n\nVOID\nHalTxbfJaguar_Clk_8812A(\n\tIN PVOID\t\t\tpDM_VOID\n\t);\n\n#else\n\n#define HalTxbf8812A_setNDPArate(pDM_VOID,\tBW,\tRate)\n#define HalTxbfJaguar_Enter(pDM_VOID, Idx)\n#define HalTxbfJaguar_Leave(pDM_VOID, Idx)\n#define HalTxbfJaguar_Status(pDM_VOID, Idx)\n#define HalTxbfJaguar_FwTxBF(pDM_VOID,\tIdx)\n#define HalTxbfJaguar_Patch(pDM_VOID, Operation)\n#define HalTxbfJaguar_Clk_8812A(pDM_VOID)\n#endif\n\n#endif\t\t\t\t\n#endif\t// #ifndef __HAL_TXBF_JAGUAR_H__\t\t\t\t\t\t\t\t\n\n"
  },
  {
    "path": "hal/rtl8814a/Hal8814PwrSeq.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include \"Hal8814PwrSeq.h\"\n#include <rtl8814a_hal.h>\n\n/* \n    drivers should parse below arrays and do the corresponding actions\n*/\n//3 Power on  Array\nWLAN_PWR_CFG rtl8814A_power_on_flow[RTL8814A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_CARDEMU_TO_ACT\n\tRTL8814A_TRANS_END\n};\n\n//3Radio off GPIO Array\nWLAN_PWR_CFG rtl8814A_radio_off_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_ACT_TO_CARDEMU\n\tRTL8814A_TRANS_END\n};\n\n//3Card Disable Array\nWLAN_PWR_CFG rtl8814A_card_disable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_ACT_TO_CARDEMU\n\tRTL8814A_TRANS_CARDEMU_TO_CARDDIS\n\tRTL8814A_TRANS_END\n};\n\n//3 Card Enable Array\nWLAN_PWR_CFG rtl8814A_card_enable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_CARDDIS_TO_CARDEMU\n\tRTL8814A_TRANS_CARDEMU_TO_ACT\t\t\n\tRTL8814A_TRANS_END\n};\n\n//3Suspend Array\nWLAN_PWR_CFG rtl8814A_suspend_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_ACT_TO_CARDEMU\n\tRTL8814A_TRANS_CARDEMU_TO_SUS\n\tRTL8814A_TRANS_END\n};\n\n//3 Resume Array\nWLAN_PWR_CFG rtl8814A_resume_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_SUS_TO_CARDEMU\n\tRTL8814A_TRANS_CARDEMU_TO_ACT\n\tRTL8814A_TRANS_END\n};\n\n\n\n//3HWPDN Array\nWLAN_PWR_CFG rtl8814A_hwpdn_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\tRTL8814A_TRANS_ACT_TO_CARDEMU\n\tRTL8814A_TRANS_CARDEMU_TO_PDN\t\t\n\tRTL8814A_TRANS_END\n};\n\n//3 Enter LPS \nWLAN_PWR_CFG rtl8814A_enter_lps_flow[RTL8814A_TRANS_ACT_TO_LPS_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\t//FW behavior\n\tRTL8814A_TRANS_ACT_TO_LPS\t\n\tRTL8814A_TRANS_END\n};\n\n//3 Leave LPS \nWLAN_PWR_CFG rtl8814A_leave_lps_flow[RTL8814A_TRANS_LPS_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]=\n{\n\t//FW behavior\n\tRTL8814A_TRANS_LPS_TO_ACT\n\tRTL8814A_TRANS_END\n};\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_cmd.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_CMD_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n#define CONFIG_H2C_EF\n\n#define RTL8814_MAX_H2C_BOX_NUMS\t4\n#define RTL8814_MAX_CMD_LEN\t7\n#define RTL8814_MESSAGE_BOX_SIZE\t\t4\n#define RTL8814_EX_MESSAGE_BOX_SIZE\t4\n\n\nstatic u8 _is_fw_read_cmd_down(_adapter* padapter, u8 msgbox_num)\n{\n\tu8\tread_down = _FALSE;\n\tint \tretry_cnts = 100;\n\n\tu8 valid;\n\n\t//DBG_8192C(\" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\\n\",rtw_read8(padapter,REG_HMETFR),msgbox_num);\n\n\tdo{\n\t\tvalid = rtw_read8(padapter,REG_HMETFR) & BIT(msgbox_num);\n\t\tif(0 == valid ){\n\t\t\tread_down = _TRUE;\n\t\t}\n\t\telse\n\t\t\trtw_msleep_os(1);\n\t}while( (!read_down) && (retry_cnts--));\n\n\treturn read_down;\n\n}\n\n\n/*****************************************\n* H2C Msg format :\n* 0x1DF - 0x1D0\n*| 31 - 8\t| 7-5 \t 4 - 0\t|\n*| h2c_msg \t|Class_ID CMD_ID\t|\n*\n* Extend 0x1FF - 0x1F0\n*|31 - 0\t  |\n*|ext_msg|\n******************************************/\ns32 FillH2CCmd_8814(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)\n{\n\tu8 h2c_box_num;\n\tu32\tmsgbox_addr;\n\tu32 msgbox_ex_addr=0;\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);\n\tu8 cmd_idx,ext_cmd_len;\n\tu32\th2c_cmd = 0;\n\tu32\th2c_cmd_ex = 0;\n\ts32 ret = _FAIL;\n\n_func_enter_;\n\n\tpadapter = GET_PRIMARY_ADAPTER(padapter);\t\t\n\tpHalData = GET_HAL_DATA(padapter);\n\n\t\n\tif(padapter->bFWReady == _FALSE)\n\t{\n\t\t//DBG_8192C(\"FillH2CCmd_8814(): return H2C cmd because fw is not ready\\n\");\n\t\treturn ret;\n\t}\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);\n\n\n\tif (!pCmdBuffer) {\n\t\tgoto exit;\n\t}\n\tif (CmdLen > RTL8814_MAX_CMD_LEN) {\n\t\tgoto exit;\n\t}\n\tif (rtw_is_surprise_removed(padapter))\n\t\tgoto exit;\n\n\t//pay attention to if  race condition happened in  H2C cmd setting.\n\tdo{\n\t\th2c_box_num = pHalData->LastHMEBoxNum;\n\n\t\tif(!_is_fw_read_cmd_down(padapter, h2c_box_num)){\n\t\t\tDBG_871X(\" fw read cmd failed...\\n\");\n\t\t\tgoto exit;\n\t\t}\n\n\t\t*(u8*)(&h2c_cmd) = ElementID;\n\n\t\tif(CmdLen<=3)\n\t\t{\n\t\t\t_rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen );\n\t\t}\n\t\telse{\t\t\t\n\t\t\t_rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer,3);\n\t\t\text_cmd_len = CmdLen-3;\t\n\t\t\t_rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3,ext_cmd_len );\n\n\t\t\t//Write Ext command\n\t\t\tmsgbox_ex_addr = REG_HMEBOX_EXT0_8814A + (h2c_box_num *RTL8814_EX_MESSAGE_BOX_SIZE);\n\t\t\t#ifdef CONFIG_H2C_EF\n\t\t\tfor(cmd_idx=0;cmd_idx<ext_cmd_len;cmd_idx++ ){\n\t\t\t\trtw_write8(padapter,msgbox_ex_addr+cmd_idx,*((u8*)(&h2c_cmd_ex)+cmd_idx));\n\t\t\t}\n\t\t\t#else\n\t\t\th2c_cmd_ex = le32_to_cpu( h2c_cmd_ex );\n\t\t\trtw_write32(padapter, msgbox_ex_addr, h2c_cmd_ex);\n\t\t\t#endif\n\t\t}\n\t\t// Write command\n\t\tmsgbox_addr =REG_HMEBOX_0 + (h2c_box_num *RTL8814_MESSAGE_BOX_SIZE);\n\t\t#ifdef CONFIG_H2C_EF\n\t\tfor(cmd_idx=0;cmd_idx<RTL8814_MESSAGE_BOX_SIZE;cmd_idx++ ){\n\t\t\trtw_write8(padapter,msgbox_addr+cmd_idx,*((u8*)(&h2c_cmd)+cmd_idx));\n\t\t}\n\t\t#else\n\t\th2c_cmd = le32_to_cpu( h2c_cmd );\n\t\trtw_write32(padapter,msgbox_addr, h2c_cmd);\n\t\t#endif\n\n\t\t//DBG_871X(\"MSG_BOX:%d,CmdLen(%d), reg:0x%x =>h2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\\n\"\n\t\t\t//,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex);\n\n\t\tpHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL8814_MAX_H2C_BOX_NUMS;\n\t\n\t}while(0);\n\n\tret = _SUCCESS;\n\nexit:\n\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL);\t\n\n_func_exit_;\n\n\treturn ret;\n}\n\nu8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param)\n{\n\tu8\tres=_SUCCESS;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n_func_enter_;\n\n\t*((u32*) param ) = cpu_to_le32( *((u32*) param ) );\n\n\tFillH2CCmd_8814(padapter, H2C_RSSI_SETTING, 4, param);\n\n_func_exit_;\n\n\treturn res;\n}\n\nvoid rtl8814_fw_update_beacon_cmd(_adapter *padapter)\n{\n\tu8\tparam[2] = {0};\n\tu16\ttxpktbuf_bndy;\n\t\n_func_enter_;\n\n\t\t\n\tSET_8814A_H2CCMD_BCNHWSEQ_EN(param, 1);\n\tSET_8814A_H2CCMD_BCNHWSEQ_BCN_NUMBER(param, 0);\n\tSET_8814A_H2CCMD_BCNHWSEQ_HWSEQ(param, 1);\n\tSET_8814A_H2CCMD_BCNHWSEQ_EXHWSEQ(param, 0);\n\tSET_8814A_H2CCMD_BCNHWSEQ_PAGE(param, 0);\n\tif (GET_HAL_DATA(padapter)->FirmwareVersion < 23)\n\t\t/* FW v21, v22 use H2C_BCNHWSEQ = 0xC2 */\n\t\tFillH2CCmd_8814(padapter, 0xC2, 2, param);\n\telse\n\t\tFillH2CCmd_8814(padapter, H2C_BCNHWSEQ, 2, param);\n\t\n\t/*DBG_871X(\"%s, %d, correct beacon HW sequence, FirmwareVersion=%d, H2C_BCNHWSEQ=%d\\n\", __func__, __LINE__, GET_HAL_DATA(padapter)->FirmwareVersion, H2C_BCNHWSEQ);*/\n_func_exit_;\n\n}\n\nu8\tGet_VHT_ENI(\n\tu32\t\tIOTAction,\n\tu32\t\tWirelessMode,\n\tu32\t\tratr_bitmap\n\t)\n{\n\tu8\tRet = 0;\n\n\tif(WirelessMode == WIRELESS_11_24AC)\n\t{\n\t\tif(ratr_bitmap & 0xfff00000)\t// Mix , 2SS\n\t\t\tRet = 3;\n\t\telse \t\t\t\t\t// Mix, 1SS\n\t\t\tRet = 2;\n\t}\n\telse if(WirelessMode == WIRELESS_11_5AC)\n\t{\n\t\tRet = 1;\t\t\t\t\t// VHT\n\t}\n\n\treturn (Ret << 4);\n}\n\nBOOLEAN \nGet_RA_ShortGI_8814(\t\n\tPADAPTER\t\t\tAdapter,\n\tstruct sta_info\t\t*psta,\n\tu8\t\t\t\t\tshortGIrate,\n\tu32\t\t\t\t\tratr_bitmap\n)\n{\t\n\tBOOLEAN\t\tbShortGI;\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tbShortGI = shortGIrate;\n\n#ifdef CONFIG_80211AC_VHT\n\tif(\tbShortGI && \n\t\tIsSupportedVHT(psta->wireless_mode) &&\n\t\t(pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) &&\n\t\tTEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX)\n\t\t)\n\t{\n\t\tif(ratr_bitmap & 0xC0000000)\n\t\t\tbShortGI = _FALSE;\n\t}\n#endif //CONFIG_80211AC_VHT\n\n\treturn bShortGI;\n}\n\n\nvoid\nSet_RA_LDPC_8814(\n\tstruct sta_info\t*psta,\n\tBOOLEAN\t\t\tbLDPC\n\t)\n{\n\tif(psta == NULL)\n\t\treturn;\n#ifdef CONFIG_80211AC_VHT\n\tif(psta->wireless_mode == WIRELESS_11_5AC)\n\t{\n\t\tif(bLDPC && TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX))\n\t\t\tSET_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX);\n\t\telse\n\t\t\tCLEAR_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX);\n\t}\n\telse if(IsSupportedHT(psta->wireless_mode) || IsSupportedVHT(psta->wireless_mode))\n\t{\n\t\tif(bLDPC && TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX))\n\t\t\tSET_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX);\n\t\telse\n\t\t\tCLEAR_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX);\n\t}\n\n\tupdate_ldpc_stbc_cap(psta);\n#endif //CONFIG_80211AC_VHT\n\n\t//DBG_871X(\"MacId %d bLDPC %d\\n\", psta->mac_id, bLDPC);\n}\n\n\nu8 \nGet_RA_LDPC_8814(\n\tstruct sta_info\t\t*psta\n)\n{\t\n\tu8\tbLDPC = 0;\n\n\tif (psta != NULL) {\n\t\tif(psta->mac_id == 1) {\n\t\t\tbLDPC = 0;\n\t\t} else {\n#ifdef CONFIG_80211AC_VHT\n\t \t\tif(IsSupportedVHT(psta->wireless_mode))\n\t \t\t{\n\t\t\t\tif(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX))\n\t\t\t\t\tbLDPC = 1;\n\t\t\t\telse\n\t\t\t\t\tbLDPC = 0;\n\t \t\t}\t\t\t\n\t\t\telse if(IsSupportedHT(psta->wireless_mode))\n\t\t\t{\n\t\t\t\tif(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX))\n\t\t\t\t\tbLDPC =1;\n\t\t\t\telse\n\t\t\t\t\tbLDPC =0;\n\t\t\t}\n\t\t\telse\n#endif\n\t\t\t\tbLDPC = 0;\n\t\t}\n\t}\n\n\treturn (bLDPC << 2);\n}\n\nvoid rtl8814_set_raid_cmd(PADAPTER padapter, u64 bitmap, u8* arg)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct sta_info\t*psta;\n\tu8 macid, init_rate, raid, shortGIrate=_FALSE;\n\n_func_enter_;\n\n\tmacid = arg[0];\n\traid = arg[1];\n\tshortGIrate = arg[2];\n\tinit_rate = arg[3];\n\n\tpsta = pmlmeinfo->FW_sta_info[macid].psta;\n\tif(psta == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tif(pHalData->fw_ractrl == _TRUE)\n\t{\n\t\tu8\tH2CCommand[7] ={0};\n\n\t\tshortGIrate = Get_RA_ShortGI_8814(padapter, psta, shortGIrate, bitmap);\n\t\n\t\tH2CCommand[0] = macid;\n\t\tH2CCommand[1] = (raid & 0x1F) | (shortGIrate?0x80:0x00) ;\n\t\tH2CCommand[2] = (psta->bw_mode & 0x3) |Get_RA_LDPC_8814(psta) |Get_VHT_ENI(0, psta->wireless_mode, bitmap);\n\n\t\t//DisableTXPowerTraining\n\t\tif(pHalData->bDisableTXPowerTraining){\n\t\t\tH2CCommand[2] |= BIT6;\n\t\t\tDBG_871X(\"%s,Disable PWT by driver\\n\",__FUNCTION__);\n\t\t}\n\t\telse{\n\t\t\tPDM_ODM_T\tpDM_OutSrc = &pHalData->odmpriv;\n\t\n\t\t\tif(pDM_OutSrc->bDisablePowerTraining){\n\t\t\t\tH2CCommand[2] |= BIT6;\n\t\t\t\tDBG_871X(\"%s,Disable PWT by DM\\n\",__FUNCTION__);\n\t\t\t}\n\t\t}\t\n\n\t\tH2CCommand[3] = (u8)(bitmap & 0x000000ff);\n\t\tH2CCommand[4] = (u8)((bitmap & 0x0000ff00) >>8);\n\t\tH2CCommand[5] = (u8)((bitmap & 0x00ff0000) >> 16);\n\t\tH2CCommand[6] = (u8)((bitmap & 0xff000000) >> 24);\n\n\t\tDBG_871X(\"rtl8814_set_raid_cmd, bitmap=0x%016llx, mac_id=0x%x, raid=0x%x, shortGIrate=%x, init_rate=%d, power training=%02x\\n\"\n\t\t, bitmap, macid, raid, shortGIrate, init_rate, H2CCommand[2]&BIT(6));\n\n\t\tFillH2CCmd_8814(padapter, H2C_MACID_CFG, 7, H2CCommand);\n\n\t\t// For 3SS rate, extend H2C cmd \n\t\tH2CCommand[3] = (u8)((bitmap>>32) & 0x000000ff);\n\t\tH2CCommand[4] = (u8)(((bitmap>>32) & 0x0000ff00) >>8);\n\t\tFillH2CCmd_8814(padapter, H2C_RA_MASK_3SS, 5, H2CCommand);\n\t\t\n\t}\n\n\tif (shortGIrate==_TRUE)\n\t\tinit_rate |= BIT(7);\n\n\tpHalData->INIDATA_RATE[macid] = init_rate;\n\n_func_exit_;\n\n}\n\nvoid rtl8814_Add_RateATid(PADAPTER pAdapter, u64 rate_bitmap, u8 *arg, u8 rssi_level)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tu64\t*dm_RA_Mask = NULL;\n\tu8\t*dm_RteID = NULL;\n\tu8\tmacid;\n\n\tmacid = arg[0];\n\n\tif(rssi_level != DM_RATR_STA_INIT)\n\t\trate_bitmap = PhyDM_Get_Rate_Bitmap_Ex(&pHalData->odmpriv, macid, rate_bitmap, rssi_level, dm_RA_Mask, dm_RteID);\n\n\trtl8814_set_raid_cmd(pAdapter, rate_bitmap, arg);\n}\n\nvoid rtl8814_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode)\n{\n\tu8\tu1H2CSetPwrMode[H2C_PWRMODE_LEN]={0};\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tu8\tMode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 2, pwrModeByte5 = 0;\n        HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n_func_enter_;\n\n\tDBG_871X(\"%s: Mode=%d SmartPS=%d UAPSD=%d\\n\", __FUNCTION__,\n\t\t\tPSMode, pwrpriv->smart_ps, padapter->registrypriv.uapsd_enable);\n\n\tswitch(PSMode)\n\t{\n\t\tcase PS_MODE_ACTIVE:\n\t\t\tMode = 0;\n\t\t\tbreak;\n\t\tcase PS_MODE_MIN:\n\t\t\tMode = 1;\n\t\t\tbreak;\n\t\tcase PS_MODE_MAX:\n\t\t\tRLBM = 1;\n\t\t\tMode = 1;\n\t\t\tbreak;\n\t\tcase PS_MODE_DTIM:\n\t\t\tRLBM = 2;\n\t\t\tMode = 1;\n\t\t\tbreak;\n\t\tcase PS_MODE_UAPSD_WMM:\n\t\t\tMode = 2;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tMode = 0;\n\t\t\tbreak;\n\t}\n\n\tif (Mode > PS_MODE_ACTIVE)\n\t{\n#ifdef CONFIG_BT_COEXIST\n\t\tif ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE)  && (_TRUE == pHalData->EEPROMBluetoothCoexist))\n\t\t{\n\t\t\tPowerState = rtw_btcoex_RpwmVal(padapter);\n\t\t\tpwrModeByte5 = rtw_btcoex_LpsVal(padapter);\n\t\t}\n\t\telse\n#endif // CONFIG_BT_COEXIST\n\t\t{\n\t\t\tPowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00)\n\t\t\tpwrModeByte5 = 0x40;\n\t\t}\n\n#ifdef CONFIG_EXT_CLK\n\t\tMode |= BIT(7);//supporting 26M XTAL CLK_Request feature.\n#endif //CONFIG_EXT_CLK\n\t}\n\telse\n\t{\n\t\tPowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00)\n\t\tpwrModeByte5 = 0x40;\n\t}\n\n\t// 0: Active, 1: LPS, 2: WMMPS\n\tSET_8814A_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, Mode);\n\t\n\t// 0:Min, 1:Max , 2:User define\n\tSET_8814A_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, RLBM);\n\n\t// (LPS) smart_ps:  0: PS_Poll, 1: PS_Poll , 2: NullData\n\t// (WMM)smart_ps: 0:PS_Poll, 1:NullData\n\tSET_8814A_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, pwrpriv->smart_ps);\n\n\t// AwakeInterval: Unit is beacon interval, this field is only valid in PS_DTIM mode\n\tSET_8814A_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, LPSAwakeIntvl);\n\n\t// (WMM only)bAllQueueUAPSD\n\tSET_8814A_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, padapter->registrypriv.uapsd_enable);\n\n\t// AllON(0x0C), RFON(0x04), RFOFF(0x00)\n\tSET_8814A_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState);\n\n\tSET_8814A_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CSetPwrMode, pwrModeByte5);\n\n#ifdef CONFIG_BT_COEXIST\n\tif (_TRUE == pHalData->EEPROMBluetoothCoexist)\n\t\trtw_btcoex_RecordPwrMode(padapter, u1H2CSetPwrMode, sizeof(u1H2CSetPwrMode));\n#endif // CONFIG_BT_COEXIST\n\t//DBG_871X(\"u1H2CSetPwrMode=\"MAC_FMT\"\\n\", MAC_ARG(u1H2CSetPwrMode));\n\tFillH2CCmd_8814(padapter, H2C_SET_PWR_MODE, sizeof(u1H2CSetPwrMode), u1H2CSetPwrMode);\n\n_func_exit_;\n}\n\nvoid rtl8814_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt )\n{\n\tu8\tu1JoinBssRptParm[3]={0};\n\tu8\tmstatus, macId, macId_Ind = 0, macId_End = 0;\n\n\tmstatus = (u8) (mstatus_rpt & 0xFF);\n\tmacId = (u8)(mstatus_rpt >> 8)  ;\n\n\tSET_8814A_H2CCMD_MSRRPT_PARM_OPMODE(u1JoinBssRptParm, mstatus);\n\tSET_8814A_H2CCMD_MSRRPT_PARM_MACID_IND(u1JoinBssRptParm, macId_Ind);\n\n\tSET_8814A_H2CCMD_MSRRPT_PARM_MACID(u1JoinBssRptParm, macId);\n\tSET_8814A_H2CCMD_MSRRPT_PARM_MACID_END(u1JoinBssRptParm, macId_End);\n\t\n\tDBG_871X(\"[MacId],  Set MacId Ctrl(original) = 0x%x \\n\", u1JoinBssRptParm[0]<<16|u1JoinBssRptParm[1]<<8|u1JoinBssRptParm[2]);\n\t\n\tFillH2CCmd_8814(padapter, H2C_MEDIA_STATUS_RPT, 3, u1JoinBssRptParm);\n}\n\nvoid ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\trate_len, pktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\n\t//pmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_BEACON);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpktlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\n\t//timestamp will be inserted by hardware\n\tpframe += 8;\n\tpktlen += 8;\n\n\t// beacon interval: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpktlen += 2;\n\n\t// capability info: 2 bytes\n\t_rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2);\n\n\tpframe += 2;\n\tpktlen += 2;\n\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t{\n\t\t//DBG_871X(\"ie len=%d\\n\", cur_network->IELength);\n\t\tpktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs);\n\t\t_rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen);\n\n\t\tgoto _ConstructBeacon;\n\t}\n\n\t//below for ad-hoc mode\n\n\t// SSID\n\tpframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen);\n\n\t// supported rates...\n\trate_len = rtw_get_rateset_len(cur_network->SupportedRates);\n\tpframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen);\n\n\t// DS parameter set\n\tpframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen);\n\n\tif( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE)\n\t{\n\t\tu32 ATIMWindow;\n\t\t// IBSS Parameter Set...\n\t\t//ATIMWindow = cur->Configuration.ATIMWindow;\n\t\tATIMWindow = 0;\n\t\tpframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen);\n\t}\n\n\n\t//todo: ERP IE\n\n\n\t// EXTERNDED SUPPORTED RATE\n\tif (rate_len > 8)\n\t{\n\t\tpframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen);\n\t}\n\n\n\t//todo:HT for adhoc\n\n_ConstructBeacon:\n\n\tif ((pktlen + TXDESC_SIZE) > 512)\n\t{\n\t\tDBG_871X(\"beacon frame too large\\n\");\n\t\treturn;\n\t}\n\n\t*pLength = pktlen;\n\n\t//DBG_871X(\"%s bcn_sz=%d\\n\", __FUNCTION__, pktlen);\n\n}\n\nvoid ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\tpktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\t// Frame control.\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\tSetPwrMgt(fctrl);\n\tSetFrameSubType(pframe, WIFI_PSPOLL);\n\n\t// AID.\n\tSetDuration(pframe, (pmlmeinfo->aid | 0xc000));\n\n\t// BSSID.\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\t// TA.\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\n\t*pLength = 16;\n}\n\nvoid ConstructNullFunctionData(\n\tPADAPTER padapter,\n\tu8\t\t*pframe,\n\tu32\t\t*pLength,\n\tu8\t\t*StaAddr,\n\tu8\t\tbQoS,\n\tu8\t\tAC,\n\tu8\t\tbEosp,\n\tu8\t\tbForcePowerSave)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\t\tpktlen;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network\t\t*cur_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\tif (bForcePowerSave)\n\t{\n\t\tSetPwrMgt(fctrl);\n\t}\n\n\tswitch(cur_network->network.InfrastructureMode)\n\t{\n\t\tcase Ndis802_11Infrastructure:\n\t\t\tSetToDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN);\n\t\t\tbreak;\n\t\tcase Ndis802_11APMode:\n\t\t\tSetFrDs(fctrl);\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\tbreak;\n\t\tcase Ndis802_11IBSS:\n\t\tdefault:\n\t\t\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t\t\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t\t\tbreak;\n\t}\n\n\tSetSeqNum(pwlanhdr, 0);\n\n\tif (bQoS == _TRUE) {\n\t\tstruct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;\n\n\t\tSetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\n\n\t\tpwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;\n\t\tSetPriority(&pwlanqoshdr->qc, AC);\n\t\tSetEOSP(&pwlanqoshdr->qc, bEosp);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\t} else {\n\t\tSetFrameSubType(pframe, WIFI_DATA_NULL);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\t}\n\n\t*pLength = pktlen;\n}\n\nvoid ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t*fctrl;\n\tu8\t\t\t\t\t*mac, *bssid;\n\tu32\t\t\t\t\tpktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX \t\t*cur_network = &(pmlmeinfo->network);\n\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tmac = adapter_mac_addr(padapter);\n\tbssid = cur_network->MacAddress;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetFrameSubType(fctrl, WIFI_PROBERSP);\n\n\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpframe += pktlen;\n\n\tif(cur_network->IELength>MAX_IE_SZ)\n\t\treturn;\n\n\t_rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength);\n\tpframe += cur_network->IELength;\n\tpktlen += cur_network->IELength;\n\n\t*pLength = pktlen;\n}\n\n#ifdef CONFIG_GTK_OL\nstatic void ConstructGTKResponse(\n\tPADAPTER padapter,\n\tu8\t\t\t*pframe,\n\tu32\t\t\t*pLength\n\t)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\t\tpktlen;\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network\t\t*cur_network = &pmlmepriv->cur_network;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstatic u8\t\t\tLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E};\n\tstatic u8\t\t\tGTKbody_a[11] ={0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B};\n\tu8\t\t\t\t*pGTKRspPkt = pframe;\n\tu8\t\t\tEncryptionHeadOverhead = 0;\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\n\t//-------------------------------------------------------------------------\n\t// MAC Header.\n\t//-------------------------------------------------------------------------\n\tSetFrameType(fctrl, WIFI_DATA);\n\t//SetFrameSubType(fctrl, 0);\n\tSetToDs(fctrl);\n\t_rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, 0);\n\tSetDuration(pwlanhdr, 0);\n\n#ifdef CONFIG_WAPI_SUPPORT\n \t*pLength = sMacHdrLng;\n#else\n\t*pLength = 24;\n#endif //CONFIG_WAPI_SUPPORT\n\n//YJ,del,120503\n#if 0\n\t//-------------------------------------------------------------------------\n\t// Qos Header: leave space for it if necessary.\n\t//-------------------------------------------------------------------------\n\tif(pStaQos->CurrentQosMode > QOS_DISABLE)\n\t{\n\t\tSET_80211_HDR_QOS_EN(pGTKRspPkt, 1);\n\t\tPlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng);\n\t\t*pLength += sQoSCtlLng;\n\t}\n#endif //0\n\t//-------------------------------------------------------------------------\n\t// Security Header: leave space for it if necessary.\n\t//-------------------------------------------------------------------------\n\n#if 1\n\tswitch (psecuritypriv->dot11PrivacyAlgrthm)\n\t{\n\t\tcase _WEP40_:\n\t\tcase _WEP104_:\n\t\t\tEncryptionHeadOverhead = 4;\n\t\t\tbreak;\n\t\tcase _TKIP_:\n\t\t\tEncryptionHeadOverhead = 8;\t\n\t\t\tbreak;\t\t\t\n\t\tcase _AES_:\n\t\t\tEncryptionHeadOverhead = 8;\n\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tcase _SMS4_:\n\t\t\tEncryptionHeadOverhead = 18;\n\t\t\tbreak;\n#endif //CONFIG_WAPI_SUPPORT\n\t\tdefault:\n\t\t\tEncryptionHeadOverhead = 0;\n\t}\n\t\n\tif(EncryptionHeadOverhead > 0)\n\t{\n\t\t_rtw_memset(&(pframe[*pLength]), 0,EncryptionHeadOverhead);\n\t       \t*pLength += EncryptionHeadOverhead;\n\t\t//SET_80211_HDR_WEP(pGTKRspPkt, 1);  //Suggested by CCW.\n\t\t//GTK's privacy bit is done by FW\n\t\t//SetPrivacy(fctrl);\n\t}\t\n#endif //1\n\t//-------------------------------------------------------------------------\n\t// Frame Body.\n\t//-------------------------------------------------------------------------\n\tpGTKRspPkt =  (u8*)(pframe+ *pLength); \n\t// LLC header\n\t_rtw_memcpy(pGTKRspPkt, LLCHeader, 8);\t\n\t*pLength += 8;\n\n\t// GTK element\n\tpGTKRspPkt += 8;\n\t\n\t//GTK frame body after LLC, part 1\n\t_rtw_memcpy(pGTKRspPkt, GTKbody_a, 11);\t\n\t*pLength += 11;\n\tpGTKRspPkt += 11;\n\t//GTK frame body after LLC, part 2\n\t_rtw_memset(&(pframe[*pLength]), 0, 88);\n\t*pLength += 88;\n\tpGTKRspPkt += 88;\n\n}\n#endif //CONFIG_GTK_OL\n\n// To check if reserved page content is destroyed by beacon beacuse beacon is too large.\n// 2010.06.23. Added by tynli.\nVOID\nCheckFwRsvdPageContent(\n\tIN\tPADAPTER\t\tAdapter\n)\n{\n\tHAL_DATA_TYPE*\tpHalData = GET_HAL_DATA(Adapter);\n\tu32\tMaxBcnPageNum;\n\n \tif(pHalData->FwRsvdPageStartOffset != 0)\n \t{\n \t\t/*MaxBcnPageNum = PageNum_128(pMgntInfo->MaxBeaconSize);\n\t\tRT_ASSERT((MaxBcnPageNum <= pHalData->FwRsvdPageStartOffset),\n\t\t\t(\"CheckFwRsvdPageContent(): The reserved page content has been\"\\\n\t\t\t\"destroyed by beacon!!! MaxBcnPageNum(%d) FwRsvdPageStartOffset(%d)\\n!\",\n\t\t\tMaxBcnPageNum, pHalData->FwRsvdPageStartOffset));*/\n \t}\n}\n\n//\n// Description: Get the reserved page number in Tx packet buffer.\n// Retrun value: the page number.\n// 2012.08.09, by tynli.\n//\nu8\nGetTxBufferRsvdPageNum8814(_adapter *Adapter, bool bWoWLANBoundary)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\tRsvdPageNum=0;\n\tu16\tTxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8814A; // default reseved 1 page for the IC type which is undefined.\n\n\tif(bWoWLANBoundary)\n\t{\n\t\trtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN, (u8 *)&TxPageBndy);\n\t}\n\telse\n\t{\n\t\trtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy);\n\t}\n\t\n\tRsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8814A -TxPageBndy + 1;\n\n\treturn RsvdPageNum;\n}\n\n\nvoid rtl8814_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tBOOLEAN\t\tbSendBeacon=_FALSE;\n\tBOOLEAN\t\tbcn_valid = _FALSE;\n\tu8\tDLBcnCount=0;\n\tu32 poll = 0;\n\n_func_enter_;\n\n\tDBG_871X(\"%s mstatus(%x)\\n\", __FUNCTION__,mstatus);\n\n\tif(mstatus == 1)\n\t{\n\t\t// We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.\n\t\t// Suggested by filen. Added by tynli.\n\t\trtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));\n\t\t// Do not set TSF again here or vWiFi beacon DMA INT will not work.\n\t\t//correct_TSF(padapter, pmlmeext);\n\t\t// Hw sequende enable by dedault. 2010.06.23. by tynli.\n\t\t//rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF));\n\t\t//rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF);\n\n\t\t//Set REG_CR bit 8. DMA beacon by SW.\n\t\tpHalData->RegCR_1 |= BIT0;\n\t\trtw_write8(padapter,  REG_CR+1, pHalData->RegCR_1);\n\t\t/*DBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/\n\t\t\n\t\t// Disable Hw protection for a time which revserd for Hw sending beacon.\n\t\t// Fix download reserved page packet fail that access collision with the protection time.\n\t\t// 2010.05.11. Added by tynli.\n\t\t//SetBcnCtrlReg(padapter, 0, BIT3);\n\t\t//SetBcnCtrlReg(padapter, BIT4, 0);\n\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3)));\n\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4));\n\t\t\t\n\t\tif(pHalData->RegFwHwTxQCtrl&BIT6)\n\t\t{\n\t\t\tDBG_871X(\"HalDownloadRSVDPage(): There is an Adapter is sending beacon.\\n\");\n\t\t\tbSendBeacon = _TRUE;\n\t\t}\n\n\t\t// Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\n\t\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6)));\n\t\tpHalData->RegFwHwTxQCtrl &= (~BIT6);\n\n\t\t// Clear beacon valid check bit.\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\t\tDLBcnCount = 0;\n\t\tpoll = 0;\n\t\tdo\n\t\t{\n\t\t\t// download rsvd page.\n\t\t\trtw_hal_set_fw_rsvd_page(padapter, _FALSE);\n\t\t\tDLBcnCount++;\n\t\t\tdo\n\t\t\t{\n\t\t\t\trtw_yield_os();\n\t\t\t\t//rtw_mdelay_os(10);\n\t\t\t\t// check rsvd page download OK.\n\t\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));\n\t\t\t\tpoll++;\n\t\t\t} while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter));\n\t\t\t\n\t\t} while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter));\n\t\t\n\t\t//RT_ASSERT(bcn_valid, (\"HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\\n\"));\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\t;\n\t\telse if(!bcn_valid)\n\t\t\tDBG_871X(ADPT_FMT\": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\\n\",\n\t\t\t\tADPT_ARG(padapter) ,DLBcnCount, poll);\n\t\telse {\n\t\t\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\t\t\tpwrctl->fw_psmode_iface_id = padapter->iface_id;\n\t\t\tDBG_871X(ADPT_FMT\": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\\n\",\n\t\t\t\tADPT_ARG(padapter), DLBcnCount, poll);\n\t\t}\n\t\t//\n\t\t// We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower)\n\t\t// becuase we need to free the Tx BCN Desc which is used by the first reserved page packet.\n\t\t// At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return\n\t\t// the beacon TCB in the following code. 2011.11.23. by tynli.\n\t\t//\n\t\t//if(bcn_valid && padapter->bEnterPnpSleep)\n\t\tif(0)\n\t\t{\n\t\t\tif(bSendBeacon)\n\t\t\t{\n\t\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\t\t\t\tDLBcnCount = 0;\n\t\t\t\tpoll = 0;\n\t\t\t\tdo\n\t\t\t\t{\n\t\t\t\t\t//SetFwRsvdPagePkt_8812(padapter, _TRUE);\n\t\t\t\t\trtw_hal_set_fw_rsvd_page(padapter, _TRUE);\n\t\t\t\t\tDLBcnCount++;\n\t\t\t\t\t\n\t\t\t\t\tdo\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_yield_os();\n\t\t\t\t\t\t//rtw_mdelay_os(10);\n\t\t\t\t\t\t// check rsvd page download OK.\n\t\t\t\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));\n\t\t\t\t\t\tpoll++;\n\t\t\t\t\t} while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter));\n\t\t\t\t} while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter));\n\t\t\t\t\n\t\t\t\t//RT_ASSERT(bcn_valid, (\"HalDownloadRSVDPage(): 2 Download RSVD page failed!\\n\"));\n\t\t\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\t\t\t;\n\t\t\t\telse if(!bcn_valid)\n\t\t\t\t\tDBG_871X(\"%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\\n\", __FUNCTION__ ,DLBcnCount, poll);\n\t\t\t\telse\n\t\t\t\t\tDBG_871X(\"%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\\n\", __FUNCTION__, DLBcnCount, poll);\n\t\t\t}\n\t\t}\n\n\t\t// Enable Bcn\n\t\t//SetBcnCtrlReg(padapter, BIT3, 0);\n\t\t//SetBcnCtrlReg(padapter, 0, BIT4);\n\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3));\n\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4)));\n\n\t\t// To make sure that if there exists an adapter which would like to send beacon.\n\t\t// If exists, the origianl value of 0x422[6] will be 1, we should check this to\n\t\t// prevent from setting 0x422[6] to 0 after download reserved page, or it will cause \n\t\t// the beacon cannot be sent by HW.\n\t\t// 2010.06.23. Added by tynli.\n\t\tif(bSendBeacon)\n\t\t{\n\t\t\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6));\n\t\t\tpHalData->RegFwHwTxQCtrl |= BIT6;\n\t\t}\n\n\t\t//\n\t\t// Update RSVD page location H2C to Fw.\n\t\t//\n\t\tif(bcn_valid)\n\t\t{\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\t\t\tDBG_871X(\"Set RSVD page location to Fw.\\n\");\n\t\t\t//FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc);\n\t\t}\n\t\t\n\t\t// Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.\n\t\t//if(!padapter->bEnterPnpSleep)\n\t\t{\n#ifndef RTL8814AE_SW_BCN\n\t\t\t// Clear CR[8] or beacon packet will not be send to TxBuf anymore.\n\t\t\tpHalData->RegCR_1 &= (~BIT0);\n\t\t\trtw_write8(padapter,  REG_CR+1, pHalData->RegCR_1);\n\t\t\t/*DBG_871X(\"%s-%d: disable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/\n#endif\n\t\t}\n\t}\n_func_exit_;\n}\n\n#ifdef CONFIG_P2P_PS\nvoid rtl8814_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct pwrctrl_priv\t\t*pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\t*p2p_ps_offload = (u8 *)&pHalData->p2p_ps_offload;\n\tu8\ti;\n\n_func_enter_;\n\n#if 1\n\tswitch(p2p_ps_state)\n\t{\n\t\tcase P2P_PS_DISABLE:\n\t\t\tDBG_8192C(\"P2P_PS_DISABLE \\n\");\n\t\t\t_rtw_memset(p2p_ps_offload, 0, 1);\n\t\t\tbreak;\n\t\tcase P2P_PS_ENABLE:\n\t\t\tDBG_8192C(\"P2P_PS_ENABLE \\n\");\n\t\t\t// update CTWindow value.\n\t\t\tif( pwdinfo->ctwindow > 0 )\n\t\t\t{\n\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(p2p_ps_offload, 1);\n\t\t\t\trtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow);\t\t\t\t\n\t\t\t}\n\n\t\t\t// hw only support 2 set of NoA\n\t\t\tfor( i=0 ; i<pwdinfo->noa_num ; i++)\n\t\t\t{\n\t\t\t\t// To control the register setting for which NOA\n\t\t\t\trtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4));\n\t\t\t\tif(i == 0) {\n\t\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(p2p_ps_offload, 1);\n\t\t\t\t} else {\n\t\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(p2p_ps_offload, 1);\n\t\t\t\t}\n\n\t\t\t\t// config P2P NoA Descriptor Register\n\t\t\t\t//DBG_8192C(\"%s(): noa_duration = %x\\n\",__FUNCTION__,pwdinfo->noa_duration[i]);\n\t\t\t\trtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]);\n\n\t\t\t\t//DBG_8192C(\"%s(): noa_interval = %x\\n\",__FUNCTION__,pwdinfo->noa_interval[i]);\n\t\t\t\trtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]);\n\n\t\t\t\t//DBG_8192C(\"%s(): start_time = %x\\n\",__FUNCTION__,pwdinfo->noa_start_time[i]);\n\t\t\t\trtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]);\n\n\t\t\t\t//DBG_8192C(\"%s(): noa_count = %x\\n\",__FUNCTION__,pwdinfo->noa_count[i]);\n\t\t\t\trtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]);\n\t\t\t}\n\n\t\t\tif( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) )\n\t\t\t{\n\t\t\t\t// rst p2p circuit: reg 0x5F0\n\t\t\t\trtw_write8(padapter, REG_P2P_RST_8814A, BIT(0)); //rst p2p 0 circuit NOA 0\n\n\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_ENABLE(p2p_ps_offload, 1);\n\n\t\t\t\tif(pwdinfo->role == P2P_ROLE_GO)\n\t\t\t\t{\n\t\t\t\t\t// 1: Owner, 0: Client\n\t\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 1);\n\t\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(p2p_ps_offload, 0);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// 1: Owner, 0: Client\n\t\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 0);\n\t\t\t\t}\n\n\t\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase P2P_PS_SCAN:\n\t\t\tDBG_8192C(\"P2P_PS_SCAN \\n\");\n\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 1);\n\t\t\tbreak;\n\t\tcase P2P_PS_SCAN_DONE:\n\t\t\tDBG_8192C(\"P2P_PS_SCAN_DONE \\n\");\n\t\t\tSET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0);\n\t\t\tpwdinfo->p2p_ps_state = P2P_PS_ENABLE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tDBG_871X(\"P2P_PS_OFFLOAD : %x\\n\", p2p_ps_offload[0]);\n\tFillH2CCmd_8814(padapter, H2C_P2P_PS_OFFLOAD, 1, p2p_ps_offload);\n#endif\n\n_func_exit_;\n\n}\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n/*\n\task FW to Reset sync register at Beacon early interrupt\n*/\nu8 rtl8814_reset_tsf(_adapter *padapter, u8 reset_port )\n{\t\n\tu8\tbuf[2];\n\tu8\tres=_SUCCESS;\n\n\ts32 ret;\n_func_enter_;\n\tif (IFACE_PORT0==reset_port) {\n\t\tbuf[0] = 0x1; buf[1] = 0;\n\t} else{\n\t\tbuf[0] = 0x0; buf[1] = 0x1;\n\t}\n\n\tret = FillH2CCmd_8814(padapter, H2C_RESET_TSF, 2, buf);\n\n_func_exit_;\n\n\treturn res;\n}\n\nint reset_tsf(PADAPTER Adapter, u8 reset_port )\n{\n\tu8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0;\n\tu32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ?\n\t\t\t\tREG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1;\n\tu32 reg_bcncrtl = (IFACE_PORT0==reset_port) ?\n\t\t\t\tREG_BCN_CTRL_1:REG_BCN_CTRL;\n\n\trtw_scan_abort(Adapter->pbuddy_adapter);\t/*\tsite survey will cause reset_tsf fail\t*/\n\treset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt);\n\trtl8814_reset_tsf(Adapter, reset_port);\n\n\twhile ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) {\n\t\trtw_msleep_os(100);\n\t\tloop_cnt++;\n\t\treset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt);\n\t}\n\n\treturn(loop_cnt >= 10) ? _FAIL : _TRUE;\n}\n\n\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\nstatic void rtl8814_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\n{\n\tu8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0};\n\n\tDBG_871X(\"8812au/8821/8811 RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\\n\",  \n\t\trsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll,\n\t\trsvdpageloc->LocNullData, rsvdpageloc->LocQosNull,\n\t\trsvdpageloc->LocBTQosNull);\n\n\tSET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp);\n\tSET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll);\n\tSET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData);\n\tSET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull);\n\tSET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull);\n\t\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_always_, \"u1H2CRsvdPageParm:\", u1H2CRsvdPageParm, H2C_RSVDPAGE_LOC_LEN);\n\tFillH2CCmd_8814(padapter, H2C_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm);\n}\n\n#ifdef CONFIG_WOWLAN\nstatic void rtl8814_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tu8\tres = 0, count = 0;\n#ifdef CONFIG_WOWLAN\t\n\tu8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0};\n\n\tDBG_871X(\"8192EAOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\\n\",  \n\t\t\trsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp,\n\t\t\trsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp,\n\t\t\trsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq,\n\t\t\trsvdpageloc->LocNetList);\n\n#ifdef CONFIG_PNO_SUPPORT\n\tDBG_871X(\"NLO_INFO=%d\\n\", rsvdpageloc->LocPNOInfo);\n#endif\n\tif (check_fwstate(pmlmepriv, _FW_LINKED)) {\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp);\n\t//SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp);\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo);\n#ifdef CONFIG_GTK_OL\n\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM);\n#endif // CONFIG_GTK_OL\n\t} else {\n#ifdef CONFIG_PNO_SUPPORT\n\t\tif(!pwrpriv->pno_in_resume) {\n\t\t\tSET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo);\n\t\t}\n#endif\n\t}\n\n\tRT_PRINT_DATA(_module_hal_init_c_, _drv_always_, \"u1H2CAoacRsvdPageParm:\", u1H2CAoacRsvdPageParm, H2C_AOAC_RSVDPAGE_LOC_LEN);\n\tFillH2CCmd_8814(padapter, H2C_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm);\n\n#ifdef CONFIG_PNO_SUPPORT\n\tif (!check_fwstate(pmlmepriv, WIFI_AP_STATE) &&\n\t\t\t!check_fwstate(pmlmepriv, _FW_LINKED) &&\n\t\t\tpwrpriv->pno_in_resume == _FALSE) {\n\n\t\tres = rtw_read8(padapter, 0x1b8);\n\t\twhile(res == 0 && count < 25) {\n\t\t\tDBG_871X(\"[%d] FW loc_NLOInfo: %d\\n\", count, res);\n\t\t\tres = rtw_read8(padapter, 0x1b8);\n\t\t\tcount++;\n\t\t\trtw_msleep_os(2);\n\t\t}\n\t}\n#endif // CONFIG_PNO_SUPPORT\n#endif // CONFIG_WOWLAN\n}\n#endif\n\n\nint rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct submit_ctx\t*iqk_sctx = &pHalData->iqk_sctx;\n\n\tiqk_sctx->submit_time = rtw_get_current_time();\n\tiqk_sctx->timeout_ms = timeout_ms;\n\tiqk_sctx->status = RTW_SCTX_SUBMITTED;\n\n\treturn rtw_sctx_wait(iqk_sctx, __func__);\n}\n\nvoid rtl8814_iqk_done(_adapter* padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct submit_ctx\t*iqk_sctx = &pHalData->iqk_sctx;\n\t\n\trtw_sctx_done(&iqk_sctx);\n}\n\nstatic VOID\nC2HTxBeamformingHandler_8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8*\t\t\t\tCmdBuf,\n\tIN\tu8\t\t\t\tCmdLen\n)\n{\n#ifdef CONFIG_BEAMFORMING\n#if (BEAMFORMING_SUPPORT == 1)\n\tu8\tstatus = CmdBuf[0] & BIT0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\t/*Beamforming_CheckSoundingSuccess(Adapter, status);*/\n\tphydm_Beamforming_End_SW(pDM_Odm, status);\n#endif/*(BEAMFORMING_SUPPORT == 1)*/\n#endif /*CONFIG_BEAMFORMING*/\n}\n\nstatic VOID\nC2HTxFeedbackHandler_8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\t*CmdBuf,\n\tIN\tu8\t\t\tCmdLen\n)\n{\n#ifdef CONFIG_XMIT_ACK\n\tif (GET_8814A_C2H_TX_RPT_RETRY_OVER(CmdBuf) | GET_8814A_C2H_TX_RPT_LIFE_TIME_OVER(CmdBuf)) {\n\t\trtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL);\n\t} else {\n\t\trtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS);\n\t}\n#endif\n}\n\ns32\n_C2HContentParsing8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tc2hCmdId, \n\tIN\tu8\t\t\tc2hCmdLen,\n\tIN\tu8 \t\t\t*tmpBuf\n)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n#ifdef CONFIG_FW_C2H_DEBUG\n\tu1Byte\tExtend_c2hSubID = 0;\n#endif\n\ts32 ret = _SUCCESS;\n\n\tswitch (c2hCmdId) {\n\tcase C2H_DBG:\n\t\tDBG_871X(\"[C2H], C2H_DBG!!\\n\");\n\t\tbreak;\n\n\tcase C2H_TXBF:\n\t\tDBG_871X(\"[C2H], C2H_TXBF!!\\n\");\n\t\tC2HTxBeamformingHandler_8814(Adapter, tmpBuf, c2hCmdLen);\n\t\tbreak;\n\n\tcase C2H_CCX_TX_RPT:\n\t\t/* DBG_871X(\"[C2H], C2H_CCX_TX_RPT!!\\n\"); */\n\t\tC2HTxFeedbackHandler_8814(Adapter, tmpBuf, c2hCmdLen);\n\t\tbreak;\n\n#ifdef CONFIG_BT_COEXIST\n\tcase C2H_BT_INFO:\n\t\t/* DBG_871X(\"[C2H], C2H_BT_INFO!!\\n\"); */\n\t\trtw_btcoex_BtInfoNotify(Adapter, c2hCmdLen, tmpBuf);\n\t\tbreak;\n#endif\n\n\tcase C2H_BT_MP_INFO:\n\t\tDBG_871X(\"[C2H], C2H_BT_MP_INFO!!\\n\");\n#ifdef CONFIG_MP_INCLUDED\n\t\t/* MPTBT_FwC2hBtMpCtrl(Adapter, tmpBuf, c2hCmdLen); */\n#else\n\t\t/* NDBG_FwC2hBtControl(Adapter, tmpBuf, c2hCmdLen); */\n#endif\n\t\t\tbreak;\n\n\t/*\n\tcase C2H_FW_SWCHNL:\n\t\tDBG_871X(\"channel to %d\\n\", *tmpBuf);\n\t\tbreak;\n\t*/\n\n/*\n\tcase C2H_IQK_FINISH:\n\t\tDBG_871X(\"== IQK Finish ==\\n\");\n\t\trtl8814_iqk_done(Adapter);\n\t\t#if 0\n\t\trtw_odm_acquirespinlock(Adapter, RT_IQK_SPINLOCK);\n\t\tpDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;\n\t\trtw_odm_releasespinlock(Adapter, RT_IQK_SPINLOCK);\n\t\t#endif\n\t\tbreak;\n\n\tcase C2H_MAILBOX_STATUS:\n\t\tDBG_871X(\"[C2H], mailbox status:%u\\n\", *tmpBuf);\n\t\tbreak;\n*/\n\n#ifdef CONFIG_FW_C2H_DEBUG\n\t\tcase C2H_EXTEND:\n\t\t\tExtend_c2hSubID = tmpBuf[0];\n\t\t\tif (Extend_c2hSubID == EXTEND_C2H_DBG_PRINT) {\n\t\t\t\tDBG_871X(\"[C2H], FW_DEBUG.\\n\");\n\t\t\t\tphydm_fw_trace_handler_8051(pDM_Odm, tmpBuf, c2hCmdLen);\n\t\t\t}\n\t\t\tbreak;\n#endif /* CONFIG_FW_C2H_DEBUG*/\n\n\tdefault:\n\t\tif (!(phydm_c2H_content_parsing(pDM_Odm, c2hCmdId, c2hCmdLen, tmpBuf))) {\n\t\t\tDBG_871X(\"%s: [WARNING] unknown C2H(0x%02x)\\n\", __func__, c2hCmdId);\n\t\t\tret = _FAIL;\n\t\t}\n\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\n\nVOID\nC2HPacketHandler_8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\t*Buffer,\n\tIN\tu8\t\t\tLength\n\t)\n{\n\tstruct c2h_evt_hdr_88xx *c2h_evt = (struct c2h_evt_hdr_88xx *)Buffer;\n\tu8\tc2hCmdId=0, c2hCmdSeq=0, c2hCmdLen=0;\n\tu8\t*tmpBuf=NULL;\n\n\t//PRINT_DATA((\"C2HPacketHandler_8812\"), Buffer, Length);\n\tc2hCmdId = Buffer[0];\n\tc2hCmdSeq = Buffer[1];\n\tc2hCmdLen = Length -2;\n\ttmpBuf = Buffer+2;\n\t\n\t//DBG_871X(\"[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\\n\", c2hCmdId, c2hCmdSeq, c2hCmdLen);\n\n#ifdef CONFIG_BT_COEXIST\n\tif (Length>16) {\n\t\tDBG_871X(\"[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\\n\", c2hCmdId, c2hCmdSeq, c2hCmdLen);\n\t\trtw_warn_on(1);\n\t}\n\n\tif (c2hCmdId == C2H_BT_INFO) {\n\t\t/* enqueue */\n\t\tif ((c2h_evt = (struct c2h_evt_hdr_88xx *)rtw_zmalloc(16)) != NULL) {\n\t\t\t_rtw_memcpy(c2h_evt, Buffer, Length);\n\t\t\tc2h_evt->plen = Length - 2;\n\t\t\t//DBG_871X(\"-[C2H packet], id=0x%x, seq=0x%x, plen=%d\\n\", c2h_evt->id, c2h_evt->seq, c2h_evt->plen);\n\t\t\trtw_c2h_wk_cmd(Adapter, (u8 *)c2h_evt);\n\t\t}\n\t}\n\telse\n#endif /* CONFIG_BT_COEXIST */\n\t{\n\t\t/* handle directly */\n#ifdef CONFIG_BEAMFORMING\t\n\t\tif (c2hCmdId == C2H_TXBF) {\n\t\t\t/* enqueue */\n\t\t\tc2h_evt = (struct c2h_evt_hdr_88xx *)rtw_zmalloc(16);\n\t\t\tif (c2h_evt  != NULL) {\n\t\t\t\t_rtw_memcpy(c2h_evt, Buffer, Length);\n\t\t\t\tc2h_evt->plen = Length - 2;\n\t\t\t\t/*DBG_871X(\"-[C2H packet], id=0x%x, seq=0x%x, plen=%d\\n\", c2h_evt->id, c2h_evt->seq, c2h_evt->plen);*/\n\t\t\t\trtw_c2h_wk_cmd(Adapter, (u8 *)c2h_evt);\n\t\t\t}\n\t\t} else\n#endif\n\t\t{\n\t\t_C2HContentParsing8814(Adapter, c2hCmdId, c2hCmdLen, tmpBuf);\n\t\t}\n\t}\n}\n\n#ifdef CONFIG_BT_COEXIST\n\nvoid ConstructBtNullFunctionData(\n\tPADAPTER padapter,\n\tu8\t\t*pframe,\n\tu32\t\t*pLength,\n\tu8\t\t*StaAddr,\n\tu8\t\tbQoS,\n\tu8\t\tAC,\n\tu8\t\tbEosp,\n\tu8\t\tbForcePowerSave)\n{\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tu16\t\t\t\t\t\t*fctrl;\n\tu32\t\t\t\t\t\tpktlen;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu8 bssid[ETH_ALEN];\n\n\t//DBG_871X(\"%s:%d\\n\", __FUNCTION__, bForcePowerSave);\n\n\tpwlanhdr = (struct rtw_ieee80211_hdr*)pframe;\n\n\tif (NULL == StaAddr)\n\t{\n\t\t_rtw_memcpy(bssid, adapter_mac_addr(padapter), ETH_ALEN);\n\t\tStaAddr = bssid;\n\t}\n\t\n\tfctrl = &pwlanhdr->frame_ctl;\n\t*(fctrl) = 0;\n\tif (bForcePowerSave)\n\t{\n\t\tSetPwrMgt(fctrl);\n\t}\n\n\tSetFrDs(fctrl);\n\t_rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN);\n\n\tSetDuration(pwlanhdr, 0);\n\tSetSeqNum(pwlanhdr, 0);\n\n\tif (bQoS == _TRUE) {\n\t\tstruct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr;\n\n\t\tSetFrameSubType(pframe, WIFI_QOS_DATA_NULL);\n\n\t\tpwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos*)pframe;\n\t\tSetPriority(&pwlanqoshdr->qc, AC);\n\t\tSetEOSP(&pwlanqoshdr->qc, bEosp);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos);\n\t} else {\n\t\tSetFrameSubType(pframe, WIFI_DATA_NULL);\n\n\t\tpktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\t}\n\n\t*pLength = pktlen;\n}\n\n\nstatic void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tstruct xmit_frame\t*pcmdframe;\t\n\tstruct pkt_attrib\t*pattrib;\n\tstruct xmit_priv\t*pxmitpriv;\n\tstruct mlme_ext_priv\t*pmlmeext;\n\tstruct mlme_ext_info\t*pmlmeinfo;\n\tstruct pwrctrl_priv *pwrctl;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tu32\tBeaconLength=0;\n\tu32\tNullDataLength=0, QosNullLength=0, BTQosNullLength=0;\n\tu32\tProbeReqLength=0;\n\tu8\t*ReservedPagePacket;\n\tu8\tTxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET;\n\tu8\tTotalPageNum=0, CurtPktPageNum=0, RsvdPageNum=0;\n\tu16\tBufIndex, PageSize = PAGE_SIZE_TX_8814;\n\tu32\tTotalPacketLen, MaxRsvdPageBufSize=0;\n\tRSVDPAGE_LOC\tRsvdPageLoc;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tpxmitpriv = &padapter->xmitpriv;\n\tpmlmeext = &padapter->mlmeextpriv;\n\tpmlmeinfo = &pmlmeext->mlmext_info;\n\tpwrctl = adapter_to_pwrctl(padapter);\n\n\t//RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B;\n\n\tRsvdPageNum = BCNQ_PAGE_NUM_8814;\n\tMaxRsvdPageBufSize = RsvdPageNum*PageSize;\n\n\tpcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\n\tif (pcmdframe == NULL) {\n\t\tDBG_871X(\"%s: alloc ReservedPagePacket fail!\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n\tReservedPagePacket = pcmdframe->buf_addr;\n\t_rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC));\n\n\t//3 (1) beacon\n\tBufIndex = TxDescOffset;\n\tConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength);\n\n\t// When we count the first page size, we need to reserve description size for the RSVD\n\t// packet, it will be filled in front of the packet in TXPKTBUF.\n\tCurtPktPageNum = (u8)PageNum(TxDescLen + BeaconLength, PageSize);\n\t\n\t//If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware\n\tif (CurtPktPageNum == 1)\n\t{\n\t\tCurtPktPageNum += 1;\n\t}\n\tTotalPageNum += CurtPktPageNum;\n\n\tBufIndex += (CurtPktPageNum*PageSize);\n\n\t// Jump to lastest page\n\tif (BufIndex < (MaxRsvdPageBufSize - PageSize))\n\t{\n\t\tBufIndex = TxDescOffset + (MaxRsvdPageBufSize - PageSize);\n\t\tTotalPageNum = BCNQ_PAGE_NUM_8814-1;\n\t\t\n\t}\n\t\n\t//3 (6) BT Qos null data\n\tRsvdPageLoc.LocBTQosNull = TotalPageNum;\n\tConstructBtNullFunctionData(\n\t\tpadapter,\n\t\t&ReservedPagePacket[BufIndex],\n\t\t&BTQosNullLength,\n\t\tNULL,\n\t\t_TRUE, 0, 0, _FALSE);\n\trtl8814a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE,  _FALSE);\n\n\t//DBG_871X(\"%s(): HW_VAR_SET_TX_CMD: BT QOS NULL DATA %p %d\\n\", \n\t//\t__FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (BTQosNullLength+TxDescLen));\n\n\tCurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength,PageSize);\n\n\tTotalPageNum += CurtPktPageNum;\n\n    TotalPacketLen = BufIndex + BTQosNullLength;\n\tif(TotalPacketLen > MaxRsvdPageBufSize)\n\t{\n\t\tDBG_871X(\"%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\\n\",__FUNCTION__,\n\t\t\tTotalPacketLen,MaxRsvdPageBufSize);\n\t\tgoto error;\n\t}\n\telse\n\t{\n\t\t// update attribute\n\t\tpattrib = &pcmdframe->attrib;\n\t\tupdate_mgntframe_attrib(padapter, pattrib);\n\t\tpattrib->qsel = QSLT_BEACON;\n\t\tpattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\n#ifdef CONFIG_PCI_HCI\n\t\tdump_mgntframe(padapter, pcmdframe);\n#else\n\t\tdump_mgntframe_and_wait(padapter, pcmdframe, 100);\n#endif\n\t}\n\n\tDBG_871X(\"%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\\n\", __FUNCTION__,TotalPacketLen,TotalPageNum);\n\tif(check_fwstate(pmlmepriv, _FW_LINKED)) {\n\t\trtl8814_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc);\n                #ifdef CONFIG_WOWLAN\n\t\t    rtl8814_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc);\n                #endif\n\t} \n\t\n\treturn;\n\nerror:\n\n\trtw_free_xmitframe(pxmitpriv, pcmdframe);\n}\n\n\nvoid rtl8812a_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n        BOOLEAN bRecover = _FALSE;\n\tBOOLEAN\tbcn_valid = _FALSE;\n\tu8\tDLBcnCount=0;\n\tu32 poll = 0;\n\tu8 val8;\n        u8 v8;\n\n_func_enter_;\n\n\t\tDBG_8192C(\"+\" FUNC_ADPT_FMT \": iface_type=%d\",\n\t\tFUNC_ADPT_ARG(padapter), get_iface_type(padapter));\n\n\t\t// We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C.\n\t\t// Suggested by filen. Added by tynli.\n\t\trtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid));\n\n\t\t// set REG_CR bit 8\n\t\tv8 = rtw_read8(padapter, REG_CR+1);\n\t\tv8 |= BIT(0); // ENSWBCN\n\t\trtw_write8(padapter,  REG_CR+1, v8);\n\n\t\t// Disable Hw protection for a time which revserd for Hw sending beacon.\n\t\t// Fix download reserved page packet fail that access collision with the protection time.\n\t\t// 2010.05.11. Added by tynli.\n\t\tval8 = rtw_read8(padapter, REG_BCN_CTRL);\n\t\tval8 &= ~BIT(3);\n\t\tval8 |= BIT(4);\n\t\trtw_write8(padapter, REG_BCN_CTRL, val8);\n\n\t\t// Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\n\t\tif (pHalData->RegFwHwTxQCtrl & BIT(6))\n\t\t\tbRecover = _TRUE;\n\n\t\t// To tell Hw the packet is not a real beacon frame.\n\t\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6));\n\t\tpHalData->RegFwHwTxQCtrl &= ~BIT(6);\n\n\t\t// Clear beacon valid check bit.\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL);\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL);\n\n\t\tDLBcnCount = 0;\n\t\tpoll = 0;\n\t\tdo\n\t\t{\n            SetFwRsvdPagePkt_BTCoex(padapter);\n\t\t\tDLBcnCount++;\n\t\t\tdo\n\t\t\t{\n\t\t\t\trtw_yield_os();\n\t\t\t\t//rtw_mdelay_os(10);\n\t\t\t\t// check rsvd page download OK.\n\t\t\t\trtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid));\n\t\t\t\tpoll++;\n\t\t\t} while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter));\n\t\t\t\n\t\t} while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter));\n\n\t\tif (RTW_CANNOT_RUN(padapter))\n\t\t\t;\n\t\telse if(!bcn_valid)\n\t\t\tDBG_871X(ADPT_FMT\": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\\n\",\n\t\t\t\tADPT_ARG(padapter) ,DLBcnCount, poll);\n\t\telse {\n\t\t\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\t\t\tpwrctl->fw_psmode_iface_id = padapter->iface_id;\n\t\t\tDBG_871X(ADPT_FMT\": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\\n\",\n\t\t\t\tADPT_ARG(padapter), DLBcnCount, poll);\n\t\t}\n\n\t\t// 2010.05.11. Added by tynli.\n\t\tval8 = rtw_read8(padapter, REG_BCN_CTRL);\n\t\tval8 |= BIT(3);\n\t\tval8 &= ~BIT(4);\n\t\trtw_write8(padapter, REG_BCN_CTRL, val8);\n\n\t\t// To make sure that if there exists an adapter which would like to send beacon.\n\t\t// If exists, the origianl value of 0x422[6] will be 1, we should check this to\n\t\t// prevent from setting 0x422[6] to 0 after download reserved page, or it will cause\n\t\t// the beacon cannot be sent by HW.\n\t\t// 2010.06.23. Added by tynli.\n\t\tif(bRecover)\n\t\t{\n\t\t\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6));\n\t\t\tpHalData->RegFwHwTxQCtrl |= BIT(6);\n\t\t}\n\n\t\t// Clear CR[8] or beacon packet will not be send to TxBuf anymore.\n#ifndef RTL8814AE_SW_BCN\n\t\tv8 = rtw_read8(padapter, REG_CR+1);\n\t\tv8 &= ~BIT(0); // ~ENSWBCN\n\t\trtw_write8(padapter, REG_CR+1, v8);\n#endif\n\n\n_func_exit_;\n}\n\n#endif // CONFIG_BT_COEXIST\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_dm.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n//============================================================\n// Description:\n//\n// This file is for 92CE/92CU dynamic mechanism only\n//\n//\n//============================================================\n#define _RTL8814A_DM_C_\n\n//============================================================\n// include files\n//============================================================\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n//============================================================\n// Global var\n//============================================================\n\n\nstatic VOID\ndm_CheckProtection(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n#if 0\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tu1Byte\t\t\tCurRate, RateThreshold;\n\n\tif(pMgntInfo->pHTInfo->bCurBW40MHz)\n\t\tRateThreshold = MGN_MCS1;\n\telse\n\t\tRateThreshold = MGN_MCS3;\n\n\tif(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)\n\t{\n\t\tpMgntInfo->bDmDisableProtect = TRUE;\n\t\tDbgPrint(\"Forced disable protect: %x\\n\", Adapter->TxStats.CurrentInitTxRate);\n\t}\n\telse\n\t{\n\t\tpMgntInfo->bDmDisableProtect = FALSE;\n\t\tDbgPrint(\"Enable protect: %x\\n\", Adapter->TxStats.CurrentInitTxRate);\n\t}\n#endif\n}\n\nstatic VOID\ndm_CheckStatistics(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n#if 0\n\tif(!Adapter->MgntInfo.bMediaConnect)\n\t\treturn;\n\n\t//2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly.\n\trtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) );\n\n\t// Calculate current Tx Rate(Successful transmited!!)\n\n\t// Calculate current Rx Rate(Successful received!!)\n\n\t//for tx tx retry count\n\trtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );\n#endif\n}\n#ifdef CONFIG_SUPPORT_HW_WPS_PBC\nstatic void dm_CheckPbcGPIO(_adapter *padapter)\n{\n\tu8\ttmp1byte;\n\tu8\tbPbcPressed = _FALSE;\n\n\tif(!padapter->registrypriv.hw_wps_pbc)\n\t\treturn;\n#ifdef CONFIG_BT_COEXIST\n\tif (hal_btcoex_IsBtExist(padapter))\n\t\treturn;\n#endif /* CONFIG_BT_COEXIST */\n\n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\n\t\n\ttmp1byte = rtw_read8(padapter, REG_GPIO_EXT_CTRL_8814A);\n\t//DBG_871X(\"CheckPbcGPIO - %x\\n\", tmp1byte);\n\n\tif (tmp1byte == 0xff)\n\t\treturn ;\n\telse if (tmp1byte & BIT3)\n\t{\n\t\t// Here we only set bPbcPressed to TRUE. After trigger PBC, the variable will be set to FALSE\n\t\tDBG_871X(\"CheckPbcGPIO - PBC is pressed\\n\");\n\t\tbPbcPressed = _TRUE;\n\t}\n\n#endif\n\n\tif( _TRUE == bPbcPressed)\n\t{\n\t\t// Here we only set bPbcPressed to true\n\t\t// After trigger PBC, the variable will be set to false\n\t\tDBG_871X(\"CheckPbcGPIO - PBC is pressed\\n\");\n\n\t\trtw_request_wps_pbc_event(padapter);\n\t}\n}\n#endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC\n\n#ifdef CONFIG_PCI_HCI\n//\n//\tDescription:\n//\t\tPerform interrupt migration dynamically to reduce CPU utilization.\n//\n//\tAssumption:\n//\t\t1. Do not enable migration under WIFI test.\n//\n//\tCreated by Roger, 2010.03.05.\n//\nVOID\ndm_InterruptMigration(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\tBOOLEAN\t\t\tbCurrentIntMt, bCurrentACIntDisable;\n\tBOOLEAN\t\t\tIntMtToSet = _FALSE;\n\tBOOLEAN\t\t\tACIntToSet = _FALSE;\n\n\n\t// Retrieve current interrupt migration and Tx four ACs IMR settings first.\n\tbCurrentIntMt = pHalData->bInterruptMigration;\n\tbCurrentACIntDisable = pHalData->bDisableTxInt;\n\n\t//\n\t// <Roger_Notes> Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics\n\t// when interrupt migration is set before. 2010.03.05.\n\t//\n\tif(!Adapter->registrypriv.wifi_spec &&\n\t\t(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&\n\t\tpmlmepriv->LinkDetectInfo.bHigherBusyTraffic)\n\t{\n\t\tIntMtToSet = _TRUE;\n\n\t\t// To check whether we should disable Tx interrupt or not.\n\t\tif(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic)\n\t\t\tACIntToSet = _TRUE;\n\t}\n\n\t//Update current settings.\n\tif( bCurrentIntMt != IntMtToSet ){\n\t\tDBG_8192C(\"%s(): Update interrrupt migration(%d)\\n\",__FUNCTION__,IntMtToSet);\n\t\tif(IntMtToSet)\n\t\t{\n\t\t\t//\n\t\t\t// <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.\n\t\t\t// timer 25ns*0xfa0=100us for 0xf packets.\n\t\t\t// 2010.03.05.\n\t\t\t//\n\t\t\trtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx\n\t\t\tpHalData->bInterruptMigration = IntMtToSet;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Reset all interrupt migration settings.\n\t\t\trtw_write32(Adapter, REG_INT_MIG, 0);\n\t\t\tpHalData->bInterruptMigration = IntMtToSet;\n\t\t}\n\t}\n\n\t/*if( bCurrentACIntDisable != ACIntToSet ){\n\t\tDBG_8192C(\"%s(): Update AC interrrupt(%d)\\n\",__FUNCTION__,ACIntToSet);\n\t\tif(ACIntToSet) // Disable four ACs interrupts.\n\t\t{\n\t\t\t//\n\t\t\t// <Roger_Notes> Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization.\n\t\t\t// When extremely highly Rx OK occurs, we will disable Tx interrupts.\n\t\t\t// 2010.03.05.\n\t\t\t//\n\t\t\tUpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );\n\t\t\tpHalData->bDisableTxInt = ACIntToSet;\n\t\t}\n\t\telse// Enable four ACs interrupts.\n\t\t{\n\t\t\tUpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );\n\t\t\tpHalData->bDisableTxInt = ACIntToSet;\n\t\t}\n\t}*/\n\n}\n\n#endif //CONFIG_PCI_HCI\n\n//\n// Initialize GPIO setting registers\n//\nstatic void\ndm_InitGPIOSetting(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(Adapter);\n\n\tu8\ttmp1byte;\n\n\ttmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);\n\ttmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);\n\n\trtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);\n}\n\n//============================================================\n// functions\n//============================================================\nstatic void Init_ODM_ComInfo_8814(PADAPTER\tAdapter)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\t\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\tu32 SupportAbility = 0;\n\n\tu8\tcut_ver,fab_ver;\n\n\tInit_ODM_ComInfo(Adapter);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A);\n\n\tfab_ver = ODM_TSMC;\n\tif(IS_A_CUT(pHalData->VersionID))\n\t\tcut_ver = ODM_CUT_A;\n\telse if(IS_B_CUT(pHalData->VersionID))\n\t\tcut_ver = ODM_CUT_B;\n\telse if(IS_C_CUT(pHalData->VersionID)) \n\t\tcut_ver = ODM_CUT_C;\n\telse if(IS_D_CUT(pHalData->VersionID))\n\t\tcut_ver = ODM_CUT_D;\n\telse if(IS_E_CUT(pHalData->VersionID))\n\t\tcut_ver = ODM_CUT_E;\n\telse\n\t\tcut_ver = ODM_CUT_A;\n\n\tODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);\t\t\n\tODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);\n\n \tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IQKFWOFFLOAD, pHalData->RegIQKFWOffload);\n\n\t#ifdef CONFIG_DISABLE_ODM\n\tSupportAbility = 0;\n\t#else\n\tSupportAbility =\tODM_RF_CALIBRATION|\n\t\t\t\t\tODM_RF_TX_PWR_TRACK\n\t\t\t\t\t;\t\n\t/*if(pHalData->AntDivCfg)\n\t\tSupportAbility |= ODM_BB_ANT_DIV;*/\n\t#endif\t\n\n\tODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility);\n\t\n}\n\nstatic void Update_ODM_ComInfo_8814(PADAPTER\tAdapter)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\tu32 SupportAbility = 0;\n\n\tSupportAbility = 0\n\t\t| ODM_BB_DIG\n\t\t| ODM_BB_RA_MASK\n\t\t| ODM_BB_FA_CNT\n\t\t| ODM_BB_RSSI_MONITOR\n\t\t| ODM_BB_CFO_TRACKING\n\t\t| ODM_RF_TX_PWR_TRACK\n\t\t| ODM_MAC_EDCA_TURBO\n\t\t| ODM_BB_NHM_CNT\n\t\t| ODM_BB_CCK_PD\n//\t\t| ODM_BB_PWR_TRAIN\n\t\t;\n\n\tif (rtw_odm_adaptivity_needed(Adapter) == _TRUE) {\n\t\trtw_odm_adaptivity_config_msg(RTW_DBGDUMP, Adapter);\n\t\tSupportAbility |= ODM_BB_ADAPTIVITY;\n\t}\n\n\tif(pHalData->AntDivCfg)\n\t\tSupportAbility |= ODM_BB_ANT_DIV;\n\n#if (MP_DRIVER==1)\n\tif (Adapter->registrypriv.mp_mode == 1) {\n\t\tSupportAbility = 0\n\t\t\t| ODM_RF_CALIBRATION\n\t\t\t| ODM_RF_TX_PWR_TRACK\n\t\t\t;\n\t}\n#endif//(MP_DRIVER==1)\n\n#ifdef CONFIG_DISABLE_ODM\n\tSupportAbility = 0;\n#endif//CONFIG_DISABLE_ODM\n\n\tODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility);\n\n\tODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);\n#ifdef CONFIG_RF_GAIN_OFFSET\n\t/* wait for phydm kfree ready.ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegRfKFreeEnable);*/\n#endif\n}\n\nvoid\nrtl8814_InitHalDm(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n\tu8\ti;\n\n#ifdef CONFIG_USB_HCI\n\tdm_InitGPIOSetting(Adapter);\n#endif //CONFIG_USB_HCI\n\n\tpHalData->DM_Type = DM_Type_ByDriver;\n\n\tUpdate_ODM_ComInfo_8814(Adapter);\n\tODM_DMInit(pDM_Odm);\n\n\t//Adapter->fix_rate = 0xFF;\n\n}\n\n\nVOID\nrtl8814_HalDmWatchDog(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tBOOLEAN\t\tbFwCurrentInPSMode = _FALSE;\n\tBOOLEAN\t\tbFwPSAwake = _TRUE;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &(pHalData->odmpriv);\n#ifdef CONFIG_CONCURRENT_MODE\n\tPADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\n#endif //CONFIG_CONCURRENT_MODE\n\n\t_func_enter_;\n\n\tif (!rtw_is_hw_init_completed(Adapter))\n\t\tgoto skip_dm;\n\n#ifdef CONFIG_LPS\n\tbFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\n\trtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\n#endif\n\n#ifdef CONFIG_P2P_PS\n\t// Fw is under p2p powersaving mode, driver should stop dynamic mechanism.\n\t// modifed by thomas. 2011.06.11.\n\tif(Adapter->wdinfo.p2p_ps_mode)\n\t\tbFwPSAwake = _FALSE;\n#endif //CONFIG_P2P_PS\n\n\tif ((rtw_is_hw_init_completed(Adapter))\n\t\t&& ((!bFwCurrentInPSMode) && bFwPSAwake)) {\n\t\t//\n\t\t// Calculate Tx/Rx statistics.\n\t\t//\n\t\tdm_CheckStatistics(Adapter);\t\n\t\trtw_hal_check_rxfifo_full(Adapter);\n\t\t//\n\t\t// Dynamically switch RTS/CTS protection.\n\t\t//\n\t\t//dm_CheckProtection(Adapter);\n\n#ifdef CONFIG_PCI_HCI\n\t\t// 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.\n\t\t// Tx Migration settings.\n\t\t//dm_InterruptMigration(Adapter);\n\n\t\t//if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\n\t\t//\tPlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\n#endif\n\t\n\t}\n\n\t//ODM\n\tif (rtw_is_hw_init_completed(Adapter))\n\t{\n\t\tu8\tbLinked=_FALSE;\n\t\tu8\tbsta_state=_FALSE;\n\t\tu8\tbBtDisabled = _TRUE;\n\n\t\t#ifdef CONFIG_DISABLE_ODM\n\t\tpHalData->odmpriv.SupportAbility = 0;\n\t\t#endif\n\n\t\tif(rtw_linked_check(Adapter)){\t\t\t\n\t\t\tbLinked = _TRUE;\n\t\t\tif (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\n\t\t\t\tbsta_state = _TRUE;\n\t\t}\n\t\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\n\t\t\tbLinked = _TRUE;\n\t\t\tif(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\n\t\t\t\tbsta_state = _TRUE;\n\t\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n\t\tODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\n\t\tODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\n\n#ifdef CONFIG_BT_COEXIST\n\t\tbBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);\n#endif // CONFIG_BT_COEXIST\n\t\tODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));\n\n\t\tODM_DMWatchdog(&pHalData->odmpriv);\n\t\t\t\n\t}\n\nskip_dm:\n\n#ifdef CONFIG_SUPPORT_HW_WPS_PBC\n\t// Check GPIO to determine current Pbc status.\n\tdm_CheckPbcGPIO(Adapter);\n#endif\n\n\treturn;\n}\n\nvoid rtl8814_init_dm_priv(IN PADAPTER Adapter)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T \t\tpodmpriv = &pHalData->odmpriv;\n\n\t//_rtw_spinlock_init(&(pHalData->odm_stainfo_lock));\n\n#ifdef CONFIG_BT_COEXIST\n\t/* firmware size issue, btcoex fw doesn't support IQK offload */\n\tif (pHalData->EEPROMBluetoothCoexist == _FALSE)\n#endif\n\t{\n\t\tpHalData->RegIQKFWOffload = 1;\n\t\trtw_sctx_init(&pHalData->iqk_sctx, 0);\n\t}\n\n\tInit_ODM_ComInfo_8814(Adapter);\n\tODM_InitAllTimers(podmpriv );\t\n\tPHYDM_InitDebugSetting(podmpriv);\n\n\tpHalData->TxPwrInPercentage = TX_PWR_PERCENTAGE_3;\n\n}\n\nvoid rtl8814_deinit_dm_priv(IN PADAPTER Adapter)\n{\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T \t\tpodmpriv = &pHalData->odmpriv;\n\t//_rtw_spinlock_free(&pHalData->odm_stainfo_lock);\n\tODM_CancelAllTimers(podmpriv);\t\n}\n\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n// Add new function to reset the state of antenna diversity before link.\n//\n// Compare RSSI for deciding antenna\nvoid\tAntDivCompare8814(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)\n{\n\t//PADAPTER Adapter = pDM_Odm->Adapter ;\n\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tif(0 != pHalData->AntDivCfg )\n\t{\n\t\t//DBG_8192C(\"update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\\n\",dst->Rssi,query_rx_pwr_percentage(dst->Rssi),\n\t\t//\tsrc->Rssi,query_rx_pwr_percentage(src->Rssi));\n\t\t//select optimum_antenna for before linked =>For antenna diversity\n\t\tif(dst->Rssi >=  src->Rssi )//keep org parameter\n\t\t{\n\t\t\tsrc->Rssi = dst->Rssi;\n\t\t\tsrc->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna;\t\t\t\t\t\t\n\t\t}\n\t}\n}\n\n// Add new function to reset the state of antenna diversity before link.\nu8 AntDivBeforeLink8814(PADAPTER Adapter )\n{\n\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n\tPDM_ODM_T \tpDM_Odm =&pHalData->odmpriv;\n\tSWAT_T\t\t*pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\n\tstruct mlme_priv\t*pmlmepriv = &(Adapter->mlmepriv);\n\t\n\t// Condition that does not need to use antenna diversity.\n\tif(pHalData->AntDivCfg==0)\n\t{\n\t\t//DBG_8192C(\"odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\\n\");\n\t\treturn _FALSE;\n\t}\n\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\t\n\t{\t\t\n\t\treturn _FALSE;\n\t}\n\n\n\tif(pDM_SWAT_Table->SWAS_NoLink_State == 0){\n\t\t//switch channel\n\t\tpDM_SWAT_Table->SWAS_NoLink_State = 1;\n\t\tpDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;\n\n\t\t//PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna);\n\t\trtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE);\n\t\t//DBG_8192C(\"%s change antenna to ANT_( %s ).....\\n\",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?\"MAIN\":\"AUX\");\n\t\treturn _TRUE;\n\t}\n\telse\n\t{\n\t\tpDM_SWAT_Table->SWAS_NoLink_State = 0;\n\t\treturn _FALSE;\n\t}\t\n\n}\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_hal_init.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_HAL_INIT_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n//-------------------------------------------------------------------------\n//\n// LLT R/W/Init function\n//\n//-------------------------------------------------------------------------\nVOID\nHal_InitEfuseVars_8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPEFUSE_HAL\t\tpEfuseHal = &(pHalData->EfuseHal);\n\tpu2Byte\t\tptr;\n\t\n\t#define INIT_EFUSE(var,value)\tptr = (pu2Byte)&var; *ptr = value\n\n\tDBG_871X(\"====> %s \\n\", __func__);\n\t//2 Common\n\tINIT_EFUSE(pEfuseHal->WordUnit\t     , EFUSE_MAX_WORD_UNIT);\n\tDBG_871X(\"====>pEfuseHal->WordUnit %d \\n\", pEfuseHal->WordUnit);\n\tINIT_EFUSE(pEfuseHal->BankSize\t     , 512);\n\tINIT_EFUSE(pEfuseHal->OOBProtectBytes, EFUSE_OOB_PROTECT_BYTES);\n\tDBG_871X(\"====>pEfuseHal->OOBProtectBytes %d \\n\", pEfuseHal->OOBProtectBytes);\n\tINIT_EFUSE(pEfuseHal->ProtectBytes   , EFUSE_PROTECT_BYTES_BANK_8814A);\n\tDBG_871X(\"====>pEfuseHal->ProtectBytes %d \\n\", pEfuseHal->ProtectBytes);\n\tINIT_EFUSE(pEfuseHal->BankAvailBytes , (pEfuseHal->BankSize - pEfuseHal->OOBProtectBytes));\n\tINIT_EFUSE(pEfuseHal->TotalBankNum   , EFUSE_MAX_BANK_8814A);\n\tINIT_EFUSE(pEfuseHal->HeaderRetry    , 0);\n\tINIT_EFUSE(pEfuseHal->DataRetry      , 0);\n\n\t//2 Wi-Fi\n\tINIT_EFUSE(pEfuseHal->MaxSecNum_WiFi\t  , EFUSE_MAX_SECTION_8814A);\n\tDBG_871X(\"====>pEfuseHal->MaxSecNum_WiFi %d \\n\", pEfuseHal->MaxSecNum_WiFi);\n\tINIT_EFUSE(pEfuseHal->PhysicalLen_WiFi\t  , EFUSE_REAL_CONTENT_LEN_8814A);\n\tDBG_871X(\"====>pEfuseHal->PhysicalLen_WiFi %d \\n\", pEfuseHal->PhysicalLen_WiFi);\n\tINIT_EFUSE(pEfuseHal->LogicalLen_WiFi\t  , EFUSE_MAP_LEN_8814A);\n\tDBG_871X(\"====>pEfuseHal->LogicalLen_WiFi %d \\n\", pEfuseHal->LogicalLen_WiFi);\n\tINIT_EFUSE(pEfuseHal->BankNum_WiFi\t\t , pEfuseHal->PhysicalLen_WiFi/pEfuseHal->BankSize);\t\n\tINIT_EFUSE(pEfuseHal->TotalAvailBytes_WiFi, (pEfuseHal->PhysicalLen_WiFi - (pEfuseHal->TotalBankNum * pEfuseHal->OOBProtectBytes)));\t\n\n\t//2 BT\n\tINIT_EFUSE(pEfuseHal->MaxSecNum_BT   , 0);\t\n\tINIT_EFUSE(pEfuseHal->PhysicalLen_BT , 0);\n\tINIT_EFUSE(pEfuseHal->LogicalLen_BT  , 0);\n\tINIT_EFUSE(pEfuseHal->BankNum_BT\t , 0);\n\tINIT_EFUSE(pEfuseHal->TotalAvailBytes_BT, 0);\t\n\t\n\tDBG_871X(\"%s <====\\n\", __func__);\n}\n\n\ns32 InitLLTTable8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\t// Auto-init LLT table ( Set REG:0x208[BIT0] )\n\t//Write 1 to enable HW init LLT, driver need polling to 0 meaning init success\n\tu8\t\ttmp1byte=0, testcnt=0;\n\ts32\tStatus = _SUCCESS;\n\n\ttmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A);\n\trtw_write8(Adapter, REG_AUTO_LLT_8814A, tmp1byte|BIT0);\n\twhile(tmp1byte & BIT0)\n\t{\n\t\ttmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A);\n\t\trtw_mdelay_os(100);\n\t\ttestcnt++;\n\t\tif(testcnt > 100)\n\t\t{\n\t\t\tStatus = _FAIL;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\treturn Status;\t\n}\n\n#ifdef CONFIG_WOWLAN\nvoid hal_DetectWoWMode(PADAPTER pAdapter)\n{\n\tadapter_to_pwrctl(pAdapter)->bSupportRemoteWakeup = _TRUE;\n}\n#endif\n\nVOID\nSetBcnCtrlReg(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tSetBits,\n\tIN\tu8\t\tClearBits\n\t)\n{\n\tHAL_DATA_TYPE*\tpHalData = GET_HAL_DATA(Adapter);\n\t\n\tpHalData->RegBcnCtrlVal |= SetBits;\n\tpHalData->RegBcnCtrlVal &= ~ClearBits;\n\n#if 0\n//#if DEV_BUS_TYPE == RT_SDIO_INTERFACE\n\tpHalData->RegBcnCtrlVal &= ~EN_TXBCN_RPT;\n#endif\n\trtw_write8(Adapter, REG_BCN_CTRL_8814A, (u8)(pHalData->RegBcnCtrlVal));\n}\n\nVOID\n_FWDownloadEnable_8814A(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tBOOLEAN\t\t\tenable\n\t)\n{\n\tu8\ttmp;\n\tu16\tu2Tmp = 0;\n\n\tif(enable)\n\t{\n\t\t// MCU firmware download enable.\n\t\tu2Tmp = rtw_read16(Adapter, REG_8051FW_CTRL_8814A);\n\t\tu2Tmp &= 0x3000;\n\t\tu2Tmp &= (~BIT12);\n\t\tu2Tmp |= BIT13;\n\t\tu2Tmp |= BIT0;\n\t\trtw_write16(Adapter, REG_8051FW_CTRL_8814A, u2Tmp);\t\n\n\t\t// Clear Rom DL enable\n\t//\ttmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2); //modify by gw 20130826(advice by hw)\n\t//\trtw_write8(Adapter, REG_8051FW_CTRL_8814A+2, tmp&0xf7);//clear bit3 \n\t}\n\telse\n\t{\n\t\t// MCU firmware download enable.\n\t\ttmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A);\n\t\trtw_write8(Adapter, REG_8051FW_CTRL_8814A, tmp&0xfe);\n\t}\n}\n\n#define MAX_REG_BOLCK_SIZE\t196\n\nVOID\n_BlockWrite_8814A(\n\tIN\t\tPADAPTER\t\tAdapter,\n\tIN\t\tPVOID\t\t\tbuffer,\n\tIN\t\tu32\t\t\tbuffSize\n\t)\n{\n\tu32\t\t\tblockSize_p1 = 4;\t// (Default) Phase #1 : PCI muse use 4-byte write to download FW\n\tu32\t\t\tblockSize_p2 = 8;\t// Phase #2 : Use 8-byte, if Phase#1 use big size to write FW.\n\tu32\t\t\tblockSize_p3 = 1;\t// Phase #3 : Use 1-byte, the remnant of FW image.\n\tu32\t\t\tblockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0;\n\tu32\t\t\tremainSize_p1 = 0, remainSize_p2 = 0;\n\tu8*\t\t\tbufferPtr\t= (u8*)buffer;\n\tu32\t\t\ti=0, offset=0;\n\n#ifdef CONFIG_USB_HCI\n\tblockSize_p1\t= MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW\n\t// Small block size will increase USB init speed. But prevent FW download fail\n\t// use 4-Byte instead of 196-Byte to write FW. \n#endif\n\n\t//3 Phase #1\n\tblockCount_p1 = buffSize / blockSize_p1;\n\tremainSize_p1 = buffSize % blockSize_p1;\n\n\tif(blockCount_p1)\n\tRT_TRACE(COMP_INIT,DBG_LOUD,(\"_BlockWrite_8814A[P1]  ::buffSize( %d) blockSize_p1( %d) blockCount_p1( %d), remainSize_p1( %d)\\n\",buffSize ,blockSize_p1,blockCount_p1, remainSize_p1));\t\n\n\tfor(i = 0 ; i < blockCount_p1 ; i++){\n\t\t#if (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\trtw_writeN(Adapter, (FW_START_ADDRESS + i * blockSize_p1), blockSize_p1,(bufferPtr + i * blockSize_p1));\n\t\t#else\n\t\trtw_write32(Adapter, (FW_START_ADDRESS + i * blockSize_p1), *((pu4Byte)(bufferPtr + i * blockSize_p1)));\n\t\t#endif\n\t}\n\n\t//3 Phase #2\n\tif(remainSize_p1){\n\t\toffset = blockCount_p1 * blockSize_p1;\n\n\t\tblockCount_p2=remainSize_p1/blockSize_p2;\n\t\tremainSize_p2=remainSize_p1%blockSize_p2;\n\n\t\tif(blockCount_p2)\n\t\tRT_TRACE(COMP_INIT,DBG_LOUD,(\"_BlockWrite_8814A[P2]  ::buffSize_p2( %d) blockSize_p2( %d) blockCount_p2( %d) remainSize_p2( %d)\\n\",(buffSize-offset), blockSize_p2 ,blockCount_p2, remainSize_p2));\t\n\n\t\t#if (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\t\tfor(i = 0 ; i < blockCount_p2 ; i++){\t\n\t\t\trtw_writeN(Adapter, (FW_START_ADDRESS + offset+i*blockSize_p2), blockSize_p2,(bufferPtr + offset+i*blockSize_p2));\n\t\t}\n\t\t#endif\n\t}\n\t\n\t//3 Phase #3\n\tif(remainSize_p2)\n\t{\n\t\toffset=(blockCount_p1 * blockSize_p1)+(blockCount_p2*blockSize_p2);\t\t\n\n\t\tblockCount_p3 = remainSize_p2 /blockSize_p3;\n\n\t\tRT_TRACE(COMP_INIT,DBG_LOUD,(\"_BlockWrite_8814A[P3]  ::buffSize_p3( %d) blockSize_p3( %d) blockCount_p3( %d) \\n\",(buffSize-offset),blockSize_p3, blockCount_p3));\t\n\t\t \n\t\tfor(i = 0 ; i < blockCount_p3 ; i++){\n\t\t\trtw_write8(Adapter, (FW_START_ADDRESS + offset + i), *(bufferPtr +offset+ i));\n\t\t}\n\t}\n}\n\nVOID\n_PageWrite_8814A(\n\tIN\t\tPADAPTER\t\tAdapter,\n\tIN\t\tu32\t\t\tpage,\n\tIN\t\tPVOID\t\t\tbuffer,\n\tIN\t\tu32\t\t\tsize\n\t)\n{\n\tu8 value8;\n\tu8 u8Page = (u8) (page & 0x07) ;\n\n\tvalue8 = (rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2)& 0xF8 ) | u8Page ;\n\trtw_write8(Adapter,REG_8051FW_CTRL_8814A+2,value8);\n\t\n\t_BlockWrite_8814A(Adapter,buffer,size);\n}\n\nVOID\n_FillDummy_8814A(\n\tu8*\t\tpFwBuf,\n\tpu4Byte\t\tpFwLen\n\t)\n{\n\tu32\tFwLen = *pFwLen;\n\tu8\tremain = (u8)(FwLen%4);\n\tremain = (remain==0)?0:(4-remain);\n\n\twhile(remain>0)\n\t{\n\t\tpFwBuf[FwLen] = 0;\n\t\tFwLen++;\n\t\tremain--;\n\t}\n\n\t*pFwLen = FwLen;\n}\n\nVOID\n_WriteFW_8814A(\n\tIN\t\tPADAPTER\t\tAdapter,\n\tIN\t\tPVOID\t\t\tbuffer,\n\tIN\t\tu32\t\t\tsize\n\t)\n{\n\tu32 \t\t\tpageNums,remainSize ;\n\tu32 \t\t\tpage,offset;\n\tu8*\t\t\tbufferPtr = (u8*)buffer;\n\n#ifdef CONFIG_PCI_HCI\n\t// 20100120 Joseph: Add for 88CE normal chip. \n\t// Fill in zero to make firmware image to dword alignment.\n\t_FillDummy_8814A(bufferPtr, &size);\n#endif //CONFIG_PCI_HCI\n\t\n\tpageNums = size / MAX_PAGE_SIZE ;\t\t\n\n\t//RT_ASSERT((pageNums <= 8), (\"Page numbers should not greater then 8 \\n\"));\t\n\t\n\tremainSize = size % MAX_PAGE_SIZE;\t\t\n\t\n\tfor(page = 0; page < pageNums;  page++){\n\t\toffset = page *MAX_PAGE_SIZE;\n\t\t_PageWrite_8814A(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE);\t\t\t\n\t\trtw_udelay_os(2);\n\t}\n\tif(remainSize){\n\t\toffset = pageNums *MAX_PAGE_SIZE;\n\t\tpage = pageNums;\n\t\t_PageWrite_8814A(Adapter,page, (bufferPtr+offset),remainSize);\n\t}\t\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"_WriteFW_8814A Done- for Normal chip.\\n\"));\n}\n\nVOID\n_3081Disable8814A(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\t\tu8\tu1bTmp;\n\t\tu1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1);\n\t\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp&(~BIT2));\n\n\n}\n\nVOID\n_3081Enable8814A(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\tu8\tu1bTmp;\n\tu1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1);\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp|BIT2);\n}\n\n\n//add by ylb 20130814 for 3081 download FW\nstatic\nBOOLEAN \nIDDMADownLoadFW_3081(\n  IN\t\tPADAPTER\tAdapter,\n  IN\t \tu32 source,\n  IN\t  \tu32 dest,\n  IN\t  \tu32  length,\n  IN\t\tBOOLEAN fs,\n  IN\t  \tBOOLEAN ls\n  )\n  {\n\tu32 ch0ctrl = (DDMA_CHKSUM_EN|DDMA_CH_OWN);\n\tu32 cnt;\n\tu1Byte tmp;\n\t//check if ddma ch0 is idle\n\tcnt=20;\n\twhile(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN)\n\t{\n\t\trtw_udelay_os(1000);\n\t\tcnt--;\n\t\tif(cnt==0)\n\t\t{ \n\t\t\tDBG_871X(\"IDDMADownLoadFW_3081, line%d: CNT fail\\n\", __LINE__);\n\t\t\treturn _FALSE;\n\t\t}\n\t}\n\tch0ctrl |= length & DDMA_LEN_MASK;\n\t\n\t//check if chksum continuous\n\tif(fs == _FALSE){\n\t\tch0ctrl |= DDMA_CH_CHKSUM_CNT;\n\t} \n\trtw_write32(Adapter,REG_DDMA_CH0SA, source);\n\trtw_write32(Adapter,REG_DDMA_CH0DA, dest);\n\trtw_write32(Adapter,REG_DDMA_CH0CTRL, ch0ctrl);\n\n\tcnt=20;\n\twhile(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN)\n\t{\n\t\trtw_udelay_os(1000);\n\t\tcnt--;\n\t\tif(cnt==0)\n\t\t{ \n\t\t\tDBG_871X(\"IDDMADownLoadFW_3081, line%d: CNT fail\\n\", __LINE__);\n\t\t\treturn _FALSE;\n\t\t}\n\t}\n\t\n\t//check checksum \n\tif(ls == _TRUE)\n\t{\n\t\ttmp = rtw_read8(Adapter,REG_8051FW_CTRL_8814A);\n\t\tif(0==(rtw_read32(Adapter,REG_DDMA_CH0CTRL)&DDMA_CHKSUM_FAIL))\n\t\t{//chksum ok\n\t\t\tDBG_871X(\"Check sum OK\\n\");\n\t\t\t//imem\n\t\t\tif(dest < OCPBASE_DMEM_3081)\n\t\t\t{\n\t\t\t\ttmp |= IMEM_DL_RDY;\n\t\t\t\trtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|IMEM_CHKSUM_OK);\n\t\t\t\tDBG_871X(\"imem check sum tmp %d\\n\",tmp);\n\t\t\t}\n\t\t\t//dmem\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmp |= DMEM_DL_RDY;\n\t\t\t\trtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|DMEM_CHKSUM_OK);\n\t\t\t\tDBG_871X(\"dmem check sum tmp %d\\n\",tmp);\n\t\t\t} \n\t\t}\n\t\telse\n\t\t{//chksum fail\n\t\t\tDBG_871X(\"Check sum fail\\n\");\n\t\t\tch0ctrl=rtw_read32(Adapter,REG_DDMA_CH0CTRL);\n\t\t\trtw_write32(Adapter, REG_DDMA_CH0CTRL,ch0ctrl|DDMA_RST_CHKSUM_STS);\n\n\t\t\t//imem\n\t\t\tif(dest < OCPBASE_DMEM_3081)\n\t\t\t{\n\t\t\t\ttmp &= (~IMEM_DL_RDY);\n\t\t\t\trtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~IMEM_CHKSUM_OK);\n\t\t\t}\n\t\t\t//dmem\n\t\t\telse\n\t\t\t{\n\t\t\t\ttmp &= (~DMEM_DL_RDY);\n\t\t\t\trtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~DMEM_CHKSUM_OK);\n\t\t\t}\n\t\t\treturn _FALSE;\n\t\t}\n\t}\n\treturn _TRUE;\n}\n\n\n//add by ylb 20130814 for 3081 download FW\nstatic\nBOOLEAN \nWaitDownLoadRSVDPageOK_3081(\n\tIN\tPADAPTER\t\t\tAdapter\n  )\n{\n\tu8\tBcnValidReg=0,TxBcReg=0;\n\tu8\tcount=0, DLBcnCount=0;\n\tBOOLEAN bRetValue = _FALSE;\n\t\n#if defined(CONFIG_PCI_HCI)\n\t//Polling Beacon Queue to send Beacon\n\tTxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3);\n\tcount=0;\n\twhile(( count <20) && (TxBcReg & BIT4))\n\t{\n\t\tcount++;\n\t\trtw_udelay_os(10);\n\t\tTxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3);\n\t}\n\t\n\trtw_write8(Adapter, REG_MGQ_TXBD_NUM_8814A+3, TxBcReg|BIT4);\n#endif //#if defined(CONFIG_PCI_HCI)\n\t// check rsvd page download OK.\n\tBcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\tcount=0;\n\twhile(!(BcnValidReg & BIT7) && count <20)\n\t{\n\t\tcount++;\n\t\trtw_udelay_os(50);\n\t\tBcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\t}\n\t\t\n\t//Set 1 to Clear BIT7 by SW\n\tif(BcnValidReg & BIT7)\n\t{\n\t\trtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7));\n\t\tbRetValue =  _TRUE;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"WaitDownLoadRSVDPageOK_3081(): Download RSVD page failed!\\n\");\n\t\tbRetValue = _FALSE;\n\t}\n\n\treturn bRetValue;\n}\n\n\nVOID\nSetDownLoadFwRsvdPagePkt_8814A(\n\tIN PADAPTER\t\tAdapter,\n\tIN PVOID\t\t\tbuffer,\n\tIN u32\t\tlen\n\t)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tstruct xmit_frame\t*pcmdframe;\n\tstruct xmit_priv\t*pxmitpriv;\n\tstruct pkt_attrib\t*pattrib;\n\t//The desc lengh in Tx packet buffer of 8814A is 40 bytes.\t\n\tu16\tBufIndex=0, TxDescOffset = TXDESC_OFFSET;\n\tu32\tTotalPacketLen = len;\n\tBOOLEAN\t\tbDLOK = FALSE;\n\tu8\t*ReservedPagePacket;\n\t\t\n\tpHalData = GET_HAL_DATA(Adapter);\n\tpxmitpriv = &Adapter->xmitpriv;\n\n#ifdef CONFIG_BCN_ICF\n\tpcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);\n#else\n\tpcmdframe = alloc_mgtxmitframe(pxmitpriv);\n#endif\n\tif (pcmdframe == NULL) {\n\t\treturn;\n\t}\n\n\tReservedPagePacket = pcmdframe->buf_addr;\n\n\tBufIndex = TxDescOffset;\n\n\tTotalPacketLen = len + BufIndex;\n\t\n\t_rtw_memcpy(&ReservedPagePacket[BufIndex], buffer, len);\n\t//DBG_871X(\"SetFwRsvdPagePkt_8814A(): HW_VAR_SET_TX_CMD: BCN, %p, %d\\n\", &ReservedPagePacket[BufIndex], len);\n\t\n\t//DBG_871X(\"SetFwRsvdPagePkt(): TotalPacketLen=%d \\n\", TotalPacketLen);\n\t\n\t// update attribute\n\tpattrib = &pcmdframe->attrib;\n\tupdate_mgntframe_attrib(Adapter, pattrib);\n\tpattrib->qsel = QSLT_BEACON;\n\tpattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset;\n\t\n\tdump_mgntframe(Adapter, pcmdframe);\n\n\t//ReturnGenTempBuffer(pAdapter, pGenBufReservedPagePacket);\n}\n\n\nVOID\nHalROMDownloadFWRSVDPage8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tPVOID\t\t\t\tbuffer,\n\tIN\tu32\t\t\t\tLen\n)\n{\n\tu8\tu1bTmp=0, tmpReg422=0;\t\n\tu8\tBcnValidReg=0,TxBcReg=0;\n\tBOOLEAN\tbSendBeacon=_FALSE, bDownLoadRSVDPageOK = _FALSE;\n\tu8*  pbuffer = buffer;\n\t\n\tBOOLEAN fs = _TRUE, ls = _FALSE;\n\tu8\tFWHeaderSize = 64, PageSize = 128 ;\n\tu16 RsvdPageNum = 0;\n\tu32 dmem_pkt_size = 0, iram_pkt_size = 0 ,MaxRsvdPageBufSize = 0;\t\n\tu32 last_block_size = 0, filesize_ram_block = 0, pkt_offset = 0;\n\tu32 txpktbuf_bndy = 0;\n\tu32\tBeaconHeaderInTxPacketBuf = 0, MEMOffsetInTxPacketBuf  = 0;\n\n\t//Set REG_CR bit 8. DMA beacon by SW.\n\tu1bTmp = rtw_read8(Adapter, REG_CR_8814A+1);\n\trtw_write8(Adapter,  REG_CR_8814A+1, (u1bTmp|BIT0));\n\t/*DBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(Adapter, REG_CR));*/\n\n\t// Disable Hw protection for a time which revserd for Hw sending beacon.\n\t// Fix download reserved page packet fail that access collision with the protection time.\n\t// 2010.05.11. Added by tynli.\n\tSetBcnCtrlReg(Adapter, 0, BIT3);\n\tSetBcnCtrlReg(Adapter, BIT4, 0);\n\t\n\t// Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\n\ttmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2);\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2,  tmpReg422&(~BIT6));\n\n\tif(tmpReg422&BIT6)\n\t{\n\t\tDBG_871X(\"HalROMDownloadFWRSVDPage8814A(): There is an Adapter is sending beacon.\\n\");\n\t\tbSendBeacon = _TRUE;\n\t}\n\n\t//Set The head page of packet of Bcnq\n\trtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16*)&txpktbuf_bndy);\n\trtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy);\n\t\n\t/* DBG_871X(\"HalROMDownloadFWRSVDPage8814A: txpktbuf_bndy=%d\\n\", txpktbuf_bndy); */\n\t\n\t// Clear beacon valid check bit.\n\tBcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\trtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7));\n\t\n\t// Return Beacon TCB.\n\t//ReturnBeaconQueueTcb_8814A(Adapter);\n\t\t\t\n\tdmem_pkt_size =  (u32)GET_FIRMWARE_HDR_TOTAL_DMEM_SZ_3081(pbuffer);\n\tiram_pkt_size =  (u32)GET_FIRMWARE_HDR_IRAM_SZ_3081(pbuffer);\t\n\tdmem_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ;\n\tiram_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ;\n\t\t\t\n\tif(dmem_pkt_size + iram_pkt_size + FWHeaderSize != Len)\n\t{\n\t\tDBG_871X(\"ERROR: Fw Hdr size do not match the real fw size!!\\n\");\n\t\tDBG_871X(\"dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\\n\",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len);\n\t\treturn;\n\t}\n\tDBG_871X(\"dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\\n\",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len);\n\t\t\t\n\t// download rsvd page.\t\n\t//RsvdPageNum = GetTxBufferRsvdPageNum8814A(Adapter, _FALSE);\n#ifdef CONFIG_BCN_IC\n\t/* TODO: check tx buffer and DMA size */\n\tMaxRsvdPageBufSize = MAX_CMDBUF_SZ-TXDESC_OFFSET;\n#else\n\tMaxRsvdPageBufSize = MAX_XMIT_EXTBUF_SZ-TXDESC_OFFSET;//RsvdPageNum*PageSize - 40 -16 /*modified for usb*/;//TX_INFO_SIZE_8814AE;\n#endif\n\tDBG_871X(\"MaxRsvdPageBufSize %d,  Total len %d\\n\",MaxRsvdPageBufSize,Len);\n\t\t\t\n\tBeaconHeaderInTxPacketBuf = txpktbuf_bndy * PageSize;\n\tMEMOffsetInTxPacketBuf = OCPBASE_TXBUF_3081 + BeaconHeaderInTxPacketBuf + 40;//TX_INFO_SIZE_8814AE;\t\n\t//download DMEM\n\twhile(dmem_pkt_size > 0)\n\t{\t\n\t\tif(dmem_pkt_size > MaxRsvdPageBufSize)\n\t\t{\n\t\t\tfilesize_ram_block = MaxRsvdPageBufSize;\n\t\t\tls = _FALSE;\n\n\t\t\tlast_block_size = dmem_pkt_size -MaxRsvdPageBufSize;\n\t\t\tif(last_block_size < MaxRsvdPageBufSize)\n\t\t\t{\n\t\t\t\tif(((last_block_size + 40) & 0x3F)  == 0)\t// Multiples of 64\n\t\t\t\t\tfilesize_ram_block -=4;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfilesize_ram_block = dmem_pkt_size;\n\t\t\tls = _TRUE;\t\t\t\t\t\n\t\t}\n\t\tfs = (pkt_offset == 0 ? _TRUE: _FALSE);\n\t\t// Return Beacon TCB.\n\t\t//ReturnBeaconQueueTcb_8814A(Adapter);\n\t\t//DBG_871X(\"%d packet offset %d dmem_pkt_size %d\\n\", __LINE__,pkt_offset, dmem_pkt_size);\n\t\tSetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+FWHeaderSize+pkt_offset, filesize_ram_block);\n\t\tbDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter);\n\t\tif(!bDownLoadRSVDPageOK)\n\t\t{\n\t\t\tDBG_871X(\"ERROR: DMEM  bDownLoadRSVDPageOK is false!!\\n\");\n\t\t\treturn;\n\t\t}\t\t\t\n\t\t\n\t\tIDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_DMEM_3081+pkt_offset,filesize_ram_block,fs,ls);\t\n\t\tdmem_pkt_size -= filesize_ram_block;\t\n\t\tpkt_offset += filesize_ram_block;\n\t}\t\t\t\n\t\t\t\n\t//download IRAM\n\tpkt_offset = 0;\n\twhile(iram_pkt_size > 0)\n\t{\t\n\t\tif(iram_pkt_size > MaxRsvdPageBufSize)\n\t\t{\n\t\t\tfilesize_ram_block = MaxRsvdPageBufSize;\n\t\t\tls = _FALSE;\n\n\t\t\tlast_block_size = iram_pkt_size -MaxRsvdPageBufSize;\n\t\t\tif(last_block_size < MaxRsvdPageBufSize)\n\t\t\t{\n\t\t\t\tif(((last_block_size + 40) & 0x3F)  == 0)\t// Multiples of 64\n\t\t\t\t\tfilesize_ram_block -=4;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfilesize_ram_block = iram_pkt_size;\n\t\t\tls = _TRUE;\n\t\t}\n\t\t\n\t\tfs = (pkt_offset == 0 ? _TRUE: _FALSE);\n\t\t// Return Beacon TCB.\n\t\t//ReturnBeaconQueueTcb_8814A(Adapter);\n\t\t//DBG_871X(\"%d packet offset %d iram_pkt_size %d\\n\", __LINE__,pkt_offset, iram_pkt_size);\n\t\tSetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+Len-iram_pkt_size, filesize_ram_block);\n\t\n\t\tbDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter);\n\t\tif(!bDownLoadRSVDPageOK)\n\t\t{\n\t\t\tDBG_871X(\"ERROR: IRAM  bDownLoadRSVDPageOK is false!!\\n\");\n\t\t\treturn;\n\t\t}\n\t\t\t\t\n\t\tIDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_IMEM_3081+pkt_offset,filesize_ram_block,fs,ls);\t\n\t\n\t\tiram_pkt_size -= filesize_ram_block;\t\n\t\tpkt_offset += filesize_ram_block;\n\t}\n\t\t\t\n\t// Enable Bcn\t\n\tSetBcnCtrlReg(Adapter, BIT3, 0);\n\tSetBcnCtrlReg(Adapter, 0, BIT4);\n\n\t// To make sure that if there exists an adapter which would like to send beacon.\n\t// If exists, the origianl value of 0x422[6] will be 1, we should check this to\n\t// prevent from setting 0x422[6] to 0 after download reserved page, or it will cause \n\t// the beacon cannot be sent by HW.\n\t// 2010.06.23. Added by tynli.\n\tif(bSendBeacon)\n\t{\n\t\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422);\n\t}\n\n\t// Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.\n\t//if(!Adapter->bEnterPnpSleep)\n\t{\n\t\t// Clear CR[8] or beacon packet will not be send to TxBuf anymore.\n\t\tu1bTmp = rtw_read8(Adapter, REG_CR_8814A+1);\n\t\trtw_write8(Adapter, REG_CR_8814A+1, (u1bTmp&(~BIT0)));\n\t}\n\n\tu1bTmp=rtw_read8(Adapter, REG_8051FW_CTRL_8814A); //add by gw for flags to show the fw download ok 20130826\n\tif( u1bTmp&DMEM_CHKSUM_OK)\n\t{\n\t\tif(u1bTmp&IMEM_CHKSUM_OK)\n\t\t{\n\t\t\tu1Byte tem;\n\t\t\ttem=rtw_read8(Adapter, REG_8051FW_CTRL_8814A+1);\n\t\t\trtw_write8(Adapter, REG_8051FW_CTRL_8814A+1,(tem|BIT6));\n\t\t}\n\t}\n}\n\ns32\n_FWFreeToGo8814A(\n\tIN\t\tPADAPTER\t\tAdapter\n\t)\n{\n\tu32\tcounter = 0;\n\tu32\tvalue32;\n\n\t// polling CheckSum report\n\tdo{\n\t\trtw_mdelay_os(50);\n\t\tvalue32 = rtw_read32(Adapter, REG_8051FW_CTRL_8814A);\n\t\t\n\t} while ((counter++ < 100) && (!(value32 &  CPU_DL_READY)));\n\n\tif (counter >= 100) {\n\t\tRT_TRACE(COMP_INIT, DBG_SERIOUS, (\"_FWFreeToGo8814A:: FW init fail ! REG_8051FW_CTRL_8814A:0x%08x .\\n\", value32));\t\t\n\t\treturn _FAIL;\n\t}\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"_FWFreeToGo8814A:: FW init ok ! REG_8051FW_CTRL_8814A:0x%08x .\\n\", value32));\n\n\t\n\treturn _SUCCESS;\n}\n\n\n#ifdef CONFIG_FILE_FWIMG\nextern char *rtw_fw_file_path;\nu8\tFwBuffer8814[FW_SIZE];\n#ifdef CONFIG_MP_INCLUDED\nextern char *rtw_fw_mp_bt_file_path;\n#endif // CONFIG_MP_INCLUDED\nu8 FwBuffer[FW_SIZE];\n#endif //CONFIG_FILE_FWIMG\n\ns32\nFirmwareDownload8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tBOOLEAN\t\t\tbUsedWoWLANFw\n)\n{\n\ts32\trtStatus = _SUCCESS;\n\tu8\twrite_fw = 0;\n\tu32 fwdl_start_time;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\t\n\t\n\tu8\t\t\t\t*pFwImageFileName;\n\tu8\t\t\t\t*pucMappedFile = NULL;\n\tPRT_FIRMWARE_8814\tpFirmware = NULL;\n\tu8\t\t\t\t*pFwHdr = NULL;\n\tu8\t\t\t\t*pFirmwareBuf;\n\tu32\t\t\t\tFirmwareLen;\n\n\n\tRT_TRACE(_module_hal_init_c_, _drv_info_, (\"+%s\\n\", __FUNCTION__));\n\tpFirmware = (PRT_FIRMWARE_8814)rtw_zmalloc(sizeof(RT_FIRMWARE_8814));\n\tif(!pFirmware)\n\t{\n\t\trtStatus = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t#ifdef CONFIG_FILE_FWIMG\n\tif(rtw_is_file_readable(rtw_fw_file_path) == _TRUE)\n\t{\n\t\tDBG_871X(\"%s accquire FW from file:%s\\n\", __FUNCTION__, rtw_fw_file_path);\n\t\tpFirmware->eFWSource = FW_SOURCE_IMG_FILE;\n\t}\n\telse\n\t#endif //CONFIG_FILE_FWIMG\n\t{\n\t\tDBG_871X(\"%s fw source from Header\\n\", __FUNCTION__);\n\t\tpFirmware->eFWSource = FW_SOURCE_HEADER_FILE;\n\t}\n\n\tswitch(pFirmware->eFWSource)\n\t{\n\t\tcase FW_SOURCE_IMG_FILE:\n\t\t\t#ifdef CONFIG_FILE_FWIMG\n\t\t\trtStatus = rtw_retrieve_from_file(rtw_fw_file_path, FwBuffer8814, FW_SIZE);\n\t\t\tpFirmware->ulFwLength = rtStatus>=0?rtStatus:0;\n\t\t\tpFirmware->szFwBuffer = FwBuffer8814;\n\t\t\t#endif //CONFIG_FILE_FWIMG\n\t\t\tbreak;\n\t\tcase FW_SOURCE_HEADER_FILE:\n\t\t\t#ifdef CONFIG_WOWLAN\n\t\t\tif (bUsedWoWLANFw) {\n\t\t\t\tODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_WoWLAN, (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));\n\t\t\t\tDBG_871X(\"%s fw:%s, size: %d\\n\", __FUNCTION__, \"WoWLAN\", pFirmware->ulFwLength);\n\t\t\t} else\n\t\t\t#endif /* CONFIG_WOWLAN */\n\t\t\t#ifdef CONFIG_BT_COEXIST\n\t\t\tif (pHalData->EEPROMBluetoothCoexist == _TRUE) {\n\t\t\t\tODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_BT, (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));\n\t\t\t\tDBG_871X(\"%s fw:%s, size: %d\\n\", __FUNCTION__, \"NIC-BTCOEX\", pFirmware->ulFwLength);\n\t\t\t} else\n\t\t\t#endif /* CONFIG_BT_COEXIST */\n\t\t\t{\n\t\t\t\t//ODM_CmnInfoInit(pDM_OutSrc, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A);\n\t\t\t\tODM_ConfigFWWithHeaderFile(&pHalData->odmpriv, CONFIG_FW_NIC, (u8 *)&(pFirmware->szFwBuffer), &(pFirmware->ulFwLength));\n\t\t\t\tDBG_871X(\"%s fw:%s, size: %d\\n\", __FUNCTION__, \"NIC\", pFirmware->ulFwLength);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tif (pFirmware->ulFwLength > FW_SIZE) {\n\t\trtStatus = _FAIL;\n\t\tDBG_871X_LEVEL(_drv_emerg_, \"Firmware size:%u exceed %u\\n\", pFirmware->ulFwLength, FW_SIZE);\n\t\tgoto exit;\n\t}\n\n\tpFirmwareBuf = pFirmware->szFwBuffer;\n\tFirmwareLen = pFirmware->ulFwLength;\n\tpFwHdr = (u8 *)pFirmware->szFwBuffer;\n\n\tpHalData->FirmwareVersion =  (u16)GET_FIRMWARE_HDR_VERSION_3081(pFwHdr);\n\tpHalData->FirmwareSubVersion = (u16)GET_FIRMWARE_HDR_SUB_VER_3081(pFwHdr);\n\tpHalData->FirmwareSignature = (u16)GET_FIRMWARE_HDR_SIGNATURE_3081(pFwHdr);\n\n\tDBG_871X (\"%s: fw_ver=%d fw_subver=%d sig=0x%x\\n\",\n\t\t  __FUNCTION__, pHalData->FirmwareVersion, pHalData->FirmwareSubVersion, pHalData->FirmwareSignature);\n\tfwdl_start_time = rtw_get_current_time();\n\t\n\t_FWDownloadEnable_8814A(Adapter, _TRUE);\n\n\t_3081Disable8814A(Adapter);//add by gw 2013026 for disable mcu core\n\n\tHalROMDownloadFWRSVDPage8814A(Adapter,pFirmwareBuf,FirmwareLen);\n\n\t_3081Enable8814A(Adapter);//add by gw 2013026 for Enable mcu core\n\n\t_FWDownloadEnable_8814A(Adapter, _FALSE);\n\t\n\trtStatus = _FWFreeToGo8814A(Adapter);\t\n\tif (_SUCCESS != rtStatus)\n\t\tgoto fwdl_stat;\n\nfwdl_stat:\n\tDBG_871X(\"FWDL %s. write_fw:%u, %dms\\n\"\n\t\t, (rtStatus == _SUCCESS)?\"success\":\"fail\"\n\t\t, write_fw\n\t\t, rtw_get_passing_time_ms(fwdl_start_time)\n\t);\n\nexit:\n\tif (pFirmware)\n\t\trtw_mfree((u8*)pFirmware, sizeof(RT_FIRMWARE_8814));\n\n#ifdef CONFIG_WOWLAN\n\tif (adapter_to_pwrctl(Adapter)->wowlan_mode)\n\t\tInitializeFirmwareVars8814(Adapter);\t\n\telse\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: wowland_mode:%d wowlan_wake_reason:%d\\n\", \n\t\t\t__func__, adapter_to_pwrctl(Adapter)->wowlan_mode, \n\t\t\tadapter_to_pwrctl(Adapter)->wowlan_wake_reason);\n#endif\n\n\treturn rtStatus;\n}\n\n\n\nvoid InitializeFirmwareVars8814(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\n\t// Init Fw LPS related.\n\tpwrpriv->bFwCurrentInPSMode = _FALSE;\n\n\t/* Init H2C cmd.*/\n\trtw_write8(padapter, REG_HMETFR_8814A, 0x0f);\n\n\t// Init H2C counter. by tynli. 2009.12.09.\n\tpHalData->LastHMEBoxNum = 0;\n}\n\n/*\n//\n// Description: Determine the contents of H2C BT_FW_PATCH Command sent to FW.\n// 2013.01.23 by tynli\n// Porting from 8723B. 2013.04.01\n//\nVOID\nSetFwBTFwPatchCmd(\n\tIN PADAPTER Adapter,\n\tIN u16\t\tFwSize\n\t)\n{\n\tu8\t\tu1BTFwPatchParm[6]={0};\n\n\tDBG_871X(\"SetFwBTFwPatchCmd_8821(): FwSize = %d\\n\", FwSize);\n\n\t//SET_8812_H2CCMD_BT_FW_PATCH_ENABLE(u1BTFwPatchParm, 1);\n\tSET_H2CCMD_BT_FW_PATCH_SIZE(u1BTFwPatchParm, FwSize);\n\tSET_H2CCMD_BT_FW_PATCH_ADDR0(u1BTFwPatchParm, 0);\n\tSET_H2CCMD_BT_FW_PATCH_ADDR1(u1BTFwPatchParm, 0xa0);\n\tSET_H2CCMD_BT_FW_PATCH_ADDR2(u1BTFwPatchParm, 0x10);\n\tSET_H2CCMD_BT_FW_PATCH_ADDR3(u1BTFwPatchParm, 0x80);\n\n\tFillH2CCmd_8812(Adapter, H2C_BT_FW_PATCH, 6 , u1BTFwPatchParm);\n}\n\n\nint _CheckWLANFwPatchBTFwReady_8821A( PADAPTER\tAdapter )\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu32\tcount=0;\n\tu8\tu1bTmp;\n\tint ret = _FAIL;\n\t\n#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n\t\tu32\ttxpktbuf_bndy;\n#endif\n\n\t//---------------------------------------------------------\n\t// Check if BT FW patch procedure is ready.\n\t//---------------------------------------------------------\n\tdo{\n\t\tu1bTmp = rtw_read8(Adapter, REG_FW_DRV_MSG_8812);\n\t\tif((u1bTmp&BIT6) || (u1bTmp&BIT7))\n\t\t{\t\n\t\t\tret = _SUCCESS;\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t\tRT_TRACE(_module_mp_, _drv_info_,(\"0x81=%x, wait for 50 ms (%d) times.\\n\",\n\t\t\t\t\tu1bTmp, count));\n\t\trtw_msleep_os(50); // 50ms\n\t}while(!((u1bTmp&BIT6) || (u1bTmp&BIT7)) && count < 50);\n\n\tRT_TRACE(_module_mp_, _drv_notice_,(\"_CheckWLANFwPatchBTFwReady():\"\n\t\t\t\t\" Polling ready bit 0x88[6:7] for %d times.\\n\", count));\n\n\tif(count >= 50)\n\t{\n\t\tDBG_871X(\"_CheckWLANFwPatchBTFwReady():\"\n\t\t\t\t\" Polling ready bit 0x88[6:7] FAIL!!\\n\");\n\t}\n\n\t//---------------------------------------------------------\n\t// Reset beacon setting to the initial value.\n\t//---------------------------------------------------------\n#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n#if 0\n\t\tif(!Adapter->MgntInfo.bWiFiConfg)\n\t\t{\n\t\t\ttxpktbuf_bndy = TX_PAGE_BOUNDARY_8821;\n\t\t}\n\t\telse\n#endif\n\t\t{// for WMM\n\t\t\ttxpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8821;\n\t\t}\n\t\t\n\t\tret =\tInitLLTTable8812A(Adapter, txpktbuf_bndy);\n\t\tif(_SUCCESS != ret){\n\t\t\tDBG_871X(\"_CheckWLANFwPatchBTFwReady_8821A(): Failed to init LLT!\\n\");\n\t\t}\n\t\n\t\t// Init Tx boundary.\n\t\trtw_write8(Adapter, REG_TDECTRL+1, (u8)txpktbuf_bndy);\n#endif\n\n\tSetBcnCtrlReg(Adapter, BIT3, 0);\n\tSetBcnCtrlReg(Adapter, 0, BIT4);\n\t\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6));\n\tpHalData->RegFwHwTxQCtrl |= BIT6;\n\n\tu1bTmp = rtw_read8(Adapter, REG_CR+1);\n\trtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0)));\n\t\n\treturn ret;\n}\n\n\nint _WriteBTFWtoTxPktBuf8812(\n\tPADAPTER\t\tAdapter,\n\tPVOID\t\t\tbuffer,\n\tu32\t\t\tFwBufLen,\n\tu8\t\t\ttimes\n\t)\n{\n\tint \t\trtStatus = _SUCCESS;\n\t//u32\t\t\t\tvalue32;\n\t//u8\t\t\t\tnumHQ, numLQ, numPubQ;//, txpktbuf_bndy;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\t//PMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tu8\t\t\t\tBcnValidReg;\n\tu8\t\t\t\tcount=0, DLBcnCount=0;\n\tu8* \t\t\tFwbufferPtr = (u8*)buffer;\n\t//PRT_TCB\t\t\tpTcb, ptempTcb;\n\t//PRT_TX_LOCAL_BUFFER pBuf;\n\tBOOLEAN \t\t\tbRecover=_FALSE;\n\tu8* \t\t\tReservedPagePacket = NULL;\n\tu8* \t\t\tpGenBufReservedPagePacket = NULL;\n\tu32\t\t\t\tTotalPktLen,txpktbuf_bndy;\n\t//u8\t\t\t\ttmpReg422;\n\t//u8\t\t\t\tu1bTmp;\n\tu8\t\t\t*pframe;\n\tstruct xmit_priv\t*pxmitpriv = &(Adapter->xmitpriv);\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tu8\t\t\ttxdesc_offset = TXDESC_OFFSET;\n\tu8\t\t\tval8;\n\n#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\tTotalPktLen = FwBufLen;\n#else\n\tTotalPktLen = FwBufLen+pHalData->HWDescHeadLength;\n#endif\n\tif((TotalPktLen+TXDESC_OFFSET) > MAX_CMDBUF_SZ)\n\t{\n\t\tDBG_871X(\" WARNING %s => Total packet len = %d over MAX_CMDBUF_SZ:%d \\n\"\n\t\t\t,__FUNCTION__,(TotalPktLen+TXDESC_OFFSET),MAX_CMDBUF_SZ);\n\t\treturn _FAIL;\n\t}\n\tpGenBufReservedPagePacket = rtw_zmalloc(TotalPktLen);//GetGenTempBuffer (Adapter, TotalPktLen);\n\tif (!pGenBufReservedPagePacket)\n\t\treturn _FAIL;\n\n\tReservedPagePacket = (u8 *)pGenBufReservedPagePacket;\n\n\t_rtw_memset(ReservedPagePacket, 0, TotalPktLen);\n\n#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\t_rtw_memcpy(ReservedPagePacket, FwbufferPtr, FwBufLen);\n\n#else\n\tPlatformMoveMemory(ReservedPagePacket+Adapter->HWDescHeadLength , FwbufferPtr, FwBufLen);\n#endif\n\n\t//---------------------------------------------------------\n\t// 1. Pause BCN\n\t//---------------------------------------------------------\n\t//Set REG_CR bit 8. DMA beacon by SW.\n#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\tu1bTmp = rtw_read8(Adapter, REG_CR+1);\n\trtw_write8(Adapter,  REG_CR+1, (u1bTmp|BIT0));\n#else\n\t// Remove for temparaily because of the code on v2002 is not sync to MERGE_TMEP for USB/SDIO.\n\t// De not remove this part on MERGE_TEMP. by tynli.\n\t//pHalData->RegCR_1 |= (BIT0);\n\t//rtw_write8(Adapter,  REG_CR+1, pHalData->RegCR_1);\n#endif\n\n\t// Disable Hw protection for a time which revserd for Hw sending beacon.\n\t// Fix download reserved page packet fail that access collision with the protection time.\n\t// 2010.05.11. Added by tynli.\n\tval8 = rtw_read8(Adapter, REG_BCN_CTRL);\n\tval8 &= ~BIT(3);\n\tval8 |= BIT(4);\n\trtw_write8(Adapter, REG_BCN_CTRL, val8);\n\n#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\ttmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2);\n\tif( tmpReg422&BIT6)\n\t\tbRecover = _TRUE;\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2,  tmpReg422&(~BIT6));\n#else\n\t// Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\n\tif(pHalData->RegFwHwTxQCtrl & BIT(6))\n\t\tbRecover=_TRUE;\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT(6))));\n\tpHalData->RegFwHwTxQCtrl &= (~ BIT(6));\n#endif\n\n\t//---------------------------------------------------------\n\t// 2. Adjust LLT table to an even boundary.\n\t//---------------------------------------------------------\n#if 0//(DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n\ttxpktbuf_bndy = 10; // rsvd page start address should be an even value. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\trtStatus =\tInitLLTTable8723BS(Adapter, txpktbuf_bndy);\n\tif(_SUCCESS != rtStatus){\n\t\tDBG_8192C(\"_CheckWLANFwPatchBTFwReady_8723B(): Failed to init LLT!\\n\");\n\t\treturn _FAIL;\n\t}\n\t\n\t// Init Tx boundary.\n\trtw_write8(Adapter, REG_DWBCN0_CTRL_8723B+1, (u8)txpktbuf_bndy);\t\n#endif\n\n\n\t//---------------------------------------------------------\n\t// 3. Write Fw to Tx packet buffer by reseverd page.\n\t//---------------------------------------------------------\n\tdo\n\t{\n\t\t// download rsvd page.\n\t\t// Clear beacon valid check bit.\n\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\trtw_write8(Adapter, REG_TDECTRL+2, BcnValidReg&(~BIT(0)));\n\n\t\t//BT patch is big, we should set 0x209 < 0x40 suggested from Gimmy\n\t\tRT_TRACE(_module_mp_, _drv_info_,(\"0x209:%x\\n\",\n\t\t\t\t\trtw_read8(Adapter, REG_TDECTRL+1)));//209 < 0x40\n\n\t\trtw_write8(Adapter, REG_TDECTRL+1, (0x90-0x20*(times-1)));\n\t\tDBG_871X(\"0x209:0x%x\\n\", rtw_read8(Adapter, REG_TDECTRL+1));\n\t\tRT_TRACE(_module_mp_, _drv_info_,(\"0x209:%x\\n\",\n\t\t\t\t\trtw_read8(Adapter, REG_TDECTRL+1)));\n\n#if 0\n\t\t// Acquice TX spin lock before GetFwBuf and send the packet to prevent system deadlock.\n\t\t// Advertised by Roger. Added by tynli. 2010.02.22.\n\t\tPlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);\n\t\tif(MgntGetFWBuffer(Adapter, &pTcb, &pBuf))\n\t\t{\n\t\t\tPlatformMoveMemory(pBuf->Buffer.VirtualAddress, ReservedPagePacket, TotalPktLen);\n\t\t\tCmdSendPacket(Adapter, pTcb, pBuf, TotalPktLen, DESC_PACKET_TYPE_NORMAL, _FALSE);\n\t\t}\n\t\telse\n\t\t\tdbgdump(\"SetFwRsvdPagePkt(): MgntGetFWBuffer FAIL!!!!!!!!.\\n\");\n\t\tPlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);\n#else\n\t\t//---------------------------------------------------------\n\t\t//tx reserved_page_packet\n\t\t//----------------------------------------------------------\n\t\t\tif ((pmgntframe = rtw_alloc_cmdxmitframe(pxmitpriv)) == NULL) {\n\t\t\t\t\trtStatus = _FAIL;\n\t\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\t//update attribute\n\t\t\tpattrib = &pmgntframe->attrib;\n\t\t\tupdate_mgntframe_attrib(Adapter, pattrib);\n\n\t\t\tpattrib->qsel = QSLT_BEACON;\n\t\t\tpattrib->pktlen = pattrib->last_txcmdsz = FwBufLen ;\n\n\t\t\t//_rtw_memset(pmgntframe->buf_addr, 0, TotalPktLen+txdesc_size);\n\t\t\t//pmgntframe->buf_addr = ReservedPagePacket ;\n\n\t\t\t_rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen);\n\t\t\tDBG_871X(\"[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \\n\", DLBcnCount, (FwBufLen + txdesc_offset));\n\n#ifdef CONFIG_PCI_HCI\n\t\t\tdump_mgntframe(Adapter, pmgntframe);\n#else\n\t\t\tdump_mgntframe_and_wait(Adapter, pmgntframe, 100);\n#endif\n\n#endif\n#if 1\n\t\t// check rsvd page download OK.\n\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\twhile(!(BcnValidReg & BIT(0)) && count <200)\n\t\t{\n\t\t\tcount++;\n\t\t\t//PlatformSleepUs(10);\n\t\t\trtw_msleep_os(1);\n\t\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\t\tRT_TRACE(_module_mp_, _drv_notice_,(\"Poll 0x20A = %x\\n\", BcnValidReg));\n\t\t}\n\t\tDLBcnCount++;\n\t\t//DBG_871X(\"##0x208:%08x,0x210=%08x\\n\",rtw_read32(Adapter, REG_TDECTRL),rtw_read32(Adapter, 0x210));\n\n\t\trtw_write8(Adapter, REG_TDECTRL+2,BcnValidReg);\n\t\t\n\t}while((!(BcnValidReg&BIT(0))) && DLBcnCount<5);\n\n\n#endif\n\tif(DLBcnCount >=5){\n\t\tDBG_871X(\" check rsvd page download OK DLBcnCount =%d  \\n\",DLBcnCount);\n\t\trtStatus = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tif(!(BcnValidReg&BIT(0)))\n\t{\n\t\tDBG_871X(\"_WriteFWtoTxPktBuf(): 1 Download RSVD page failed!\\n\");\n\t\trtStatus = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t//---------------------------------------------------------\n\t// 4. Set Tx boundary to the initial value\n\t//---------------------------------------------------------\n\n\n\t//---------------------------------------------------------\n\t// 5. Reset beacon setting to the initial value.\n\t//\t After _CheckWLANFwPatchBTFwReady().\n\t//---------------------------------------------------------\n\nexit:\n\n\tif(pGenBufReservedPagePacket)\n\t{\n\t\tDBG_871X(\"_WriteBTFWtoTxPktBuf8723B => rtw_mfree pGenBufReservedPagePacket!\\n\");\n\t\trtw_mfree((u8*)pGenBufReservedPagePacket, TotalPktLen);\n\t\t}\n\treturn rtStatus;\n}\n\nint ReservedPage_Compare(PADAPTER Adapter,PRT_MP_FIRMWARE pFirmware,u32 BTPatchSize)\n{\n\tu8 temp,ret,lastBTsz;\n\tu32 u1bTmp=0,address_start=0,count=0,i=0;\n\tu8\t*myBTFwBuffer = NULL;\n\n\tmyBTFwBuffer = rtw_zmalloc(BTPatchSize);\n\tif (myBTFwBuffer == NULL)\n\t{\n\t\tDBG_871X(\"%s can't be executed due to the failed malloc.\\n\", __FUNCTION__);\n\t\tAdapter->mppriv.bTxBufCkFail=_TRUE;\n\t\treturn _FALSE;\n\t}\t\n\t\n\ttemp=rtw_read8(Adapter,0x209);\n\t\n\taddress_start=(temp*128)/8;\n\t\n\trtw_write32(Adapter,0x140,0x00000000);\n\trtw_write32(Adapter,0x144,0x00000000);\n\trtw_write32(Adapter,0x148,0x00000000);\n\n\trtw_write8(Adapter,0x106,0x69);\n\n\t\n\tfor(i=0;i<(BTPatchSize/8);i++)\n\t{\n\t\trtw_write32(Adapter,0x140,address_start+5+i) ;\t\t  \n\t\t\t\n\t\t//polling until reg 0x140[23]=1;\n\t\tdo{\n\t\t\tu1bTmp = rtw_read32(Adapter, 0x140);\n\t\t\tif(u1bTmp&BIT(23))\n\t\t\t{\n\t\t\t\tret = _SUCCESS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcount++;\n\t\t\tDBG_871X(\"0x140=%x, wait for 10 ms (%d) times.\\n\",u1bTmp, count);\n\t\t\trtw_msleep_os(10); // 10ms\n\t\t}while(!(u1bTmp&BIT(23)) && count < 50);\n\t\t\n\t\t\tmyBTFwBuffer[i*8+0]=rtw_read8(Adapter, 0x144);\n\t\t\tmyBTFwBuffer[i*8+1]=rtw_read8(Adapter, 0x145);\n\t\t\tmyBTFwBuffer[i*8+2]=rtw_read8(Adapter, 0x146); \n\t\t\tmyBTFwBuffer[i*8+3]=rtw_read8(Adapter, 0x147);\n\t\t\tmyBTFwBuffer[i*8+4]=rtw_read8(Adapter, 0x148);\n\t\t\tmyBTFwBuffer[i*8+5]=rtw_read8(Adapter, 0x149);\n\t\t\tmyBTFwBuffer[i*8+6]=rtw_read8(Adapter, 0x14a);\n\t\t\tmyBTFwBuffer[i*8+7]=rtw_read8(Adapter, 0x14b);\n\t}\n\t\n\trtw_write32(Adapter,0x140,address_start+5+BTPatchSize/8) ;\t\t\t  \n\n\tlastBTsz=BTPatchSize%8;\n\t\n\t//polling until reg 0x140[23]=1;\n\tu1bTmp=0;\n\tcount=0;\n\tdo{\n\t\t\tu1bTmp = rtw_read32(Adapter, 0x140);\n\t\t\tif(u1bTmp&BIT(23))\n\t\t\t{\n\t\t\t\tret = _SUCCESS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcount++;\n\t\t\tDBG_871X(\"0x140=%x, wait for 10 ms (%d) times.\\n\",u1bTmp, count);\n\t\t\trtw_msleep_os(10); // 10ms\n\t}while(!(u1bTmp&BIT(23)) && count < 50);\n\n\tfor(i=0;i<lastBTsz;i++)\n\t{\n\t\tmyBTFwBuffer[(BTPatchSize/8)*8+i] = rtw_read8(Adapter, (0x144+i));\n\n\t}\n\n\tfor(i=0;i<BTPatchSize;i++)\n\t{\n\t\tif(myBTFwBuffer[i]!= pFirmware->szFwBuffer[i])\n\t\t{\n\t\t\tDBG_871X(\" In direct myBTFwBuffer[%d]=%x , pFirmware->szFwBuffer=%x\\n\",i, myBTFwBuffer[i],pFirmware->szFwBuffer[i]);\n\t\t\tAdapter->mppriv.bTxBufCkFail=_TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (myBTFwBuffer != NULL)\n\t{\n\t\trtw_mfree(myBTFwBuffer, BTPatchSize);\n\t}\n\t\n\treturn _TRUE;\n}\n\n#ifdef CONFIG_RTL8821A\ns32 FirmwareDownloadBT(PADAPTER padapter, PRT_MP_FIRMWARE pFirmware)\n{\n\ts32 rtStatus;\n\tu8 *pBTFirmwareBuf;\n\tu32 BTFirmwareLen;\n\tu8 download_time;\n\ts8 i;\n\n\n\trtStatus = _SUCCESS;\n\tpBTFirmwareBuf = NULL;\n\tBTFirmwareLen = 0;\n\n\t//\n\t// Patch BT Fw. Download BT RAM code to Tx packet buffer.\n\t//\n\tif (padapter->bBTFWReady) {\n\t\tDBG_8192C(\"%s: BT Firmware is ready!!\\n\", __FUNCTION__);\n\t\treturn _FAIL;\n\t}\n\n#ifdef CONFIG_FILE_FWIMG\n\tif (rtw_is_file_readable(rtw_fw_mp_bt_file_path) == _TRUE)\n\t{\n\t\tDBG_8192C(\"%s: accquire MP BT FW from file:%s\\n\", __FUNCTION__, rtw_fw_mp_bt_file_path);\n\n\t\trtStatus = rtw_retrieve_from_file(rtw_fw_mp_bt_file_path, FwBuffer, 0x8000);\n\t\tBTFirmwareLen = rtStatus>=0?rtStatus:0;\n\t\tpBTFirmwareBuf = FwBuffer;\n\t}\n\telse\n#endif // CONFIG_FILE_FWIMG\n\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\tDBG_8192C(\"%s: Download MP BT FW from header\\n\", __FUNCTION__);\n\n\t\tpBTFirmwareBuf = (u8*)Rtl8821A_BT_MP_Patch_FW;\n\t\tBTFirmwareLen = Rtl8812BFwBTImgArrayLength;\n\t\tpFirmware->szFwBuffer = pBTFirmwareBuf;\n\t\tpFirmware->ulFwLength = BTFirmwareLen;\n#endif // CONFIG_EMBEDDED_FWIMG\n\t}\n\n\tDBG_8192C(\"%s: MP BT Firmware size=%d\\n\", __FUNCTION__, BTFirmwareLen);\n\n\t// for h2c cam here should be set to  true\n\tpadapter->bFWReady = _TRUE;\n\n\tdownload_time = (BTFirmwareLen + 4095) / 4096;\n\tDBG_8192C(\"%s: download_time is %d\\n\", __FUNCTION__, download_time);\n\n\t// Download BT patch Fw.\n\tfor (i = (download_time-1); i >= 0; i--)\n\t{\n\t\tif (i == (download_time - 1))\n\t\t{\n\t\t\trtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), (BTFirmwareLen-(4096*i)), 1);\n\t\t\tDBG_8192C(\"%s: start %d, len %d, time 1\\n\", __FUNCTION__, 4096*i, BTFirmwareLen-(4096*i));\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), 4096, (download_time-i));\n\t\t\tDBG_8192C(\"%s: start %d, len 4096, time %d\\n\", __FUNCTION__, 4096*i, download_time-i);\n\t\t}\n\n\t\tif (rtStatus != _SUCCESS)\n\t\t{\n\t\t\tDBG_8192C(\"%s: BT Firmware download to Tx packet buffer fail!\\n\", __FUNCTION__);\n\t\t\tpadapter->bBTFWReady = _FALSE;\n\t\t\treturn rtStatus;\n\t\t}\n\t}\n\n\tReservedPage_Compare(padapter,pFirmware,BTFirmwareLen);\n\n\tpadapter->bBTFWReady = _TRUE;\n\tSetFwBTFwPatchCmd_8821(padapter, (u16)BTFirmwareLen);\n\trtStatus = _CheckWLANFwPatchBTFwReady_8821A(padapter);\n\n\tDBG_8192C(\"<===%s: return %s!\\n\", __FUNCTION__, rtStatus==_SUCCESS?\"SUCCESS\":\"FAIL\");\n\treturn rtStatus;\n}\n#endif //CONFIG_RTL8821A*/\n\n#ifdef CONFIG_WOWLAN\n//===========================================\n//\n// Description: Prepare some information to Fw for WoWLAN.\n//\t\t\t\t\t(1) Download wowlan Fw.\n//\t\t\t\t\t(2) Download RSVD page packets.\n//\t\t\t\t\t(3) Enable AP offload if needed.\n//\n// 2011.04.12 by tynli.\n//\nVOID\nSetFwRelatedForWoWLAN8812(\n\t\tIN\t\tPADAPTER\t\t\tpadapter,\n\t\tIN\t\tu8\t\t\t\t\tbHostIsGoingtoSleep\n)\n{\n\t\tint\t\t\t\tstatus=_FAIL;\n\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\tu8\t\t\t\tbRecover = _FALSE;\n\t//\n\t// 1. Before WoWLAN we need to re-download WoWLAN Fw.\n\t//\n\tstatus = FirmwareDownload8812(padapter, bHostIsGoingtoSleep);\n\tif(status != _SUCCESS) {\n\t\tDBG_871X(\"SetFwRelatedForWoWLAN8812(): Re-Download Firmware failed!!\\n\");\n\t\treturn;\n\t} else {\n\t\tDBG_871X(\"SetFwRelatedForWoWLAN8812(): Re-Download Firmware Success !!\\n\");\n\t}\n\t//\n\t// 2. Re-Init the variables about Fw related setting.\n\t//\n\tInitializeFirmwareVars8812(padapter);\n}\n#endif //CONFIG_WOWLAN\n\n//===========================================================\n//\t\t\t\tEfuse related code\n//===========================================================\nBOOLEAN \nhal_GetChnlGroup8814A(\n\tIN\tu8 Channel,\n\tOUT u8*\tpGroup\n\t)\n{\n\tBOOLEAN bIn24G=_TRUE;\n\n\tif(Channel <= 14)\n\t{\n\t\tbIn24G=_TRUE;\n\n\t\tif      (1  <= Channel && Channel <= 2 )   *pGroup = 0;\n\t\telse if (3  <= Channel && Channel <= 5 )   *pGroup = 1;\n\t\telse if (6  <= Channel && Channel <= 8 )   *pGroup = 2;\n\t\telse if (9  <= Channel && Channel <= 11)   *pGroup = 3;\n\t\telse if (12 <= Channel && Channel <= 14)   *pGroup = 4;\n\t\telse\n\t\t{\n\t\t\tRT_DISP(FPHY, PHY_TXPWR_EFUSE, (\"==>hal_GetChnlGroupJaguar in 2.4 G, but Channel %d in Group not found \\n\", Channel));\n\t\t}\n\t}\n\telse\n\t{\n\t\tbIn24G=_FALSE;\n\n\t\tif      (36   <= Channel && Channel <=  42)   *pGroup = 0;\t\t// 36 38 40\n\t\telse if (44   <= Channel && Channel <=  48)   *pGroup = 1;\t// 44 46 48\n\t\telse if (50   <= Channel && Channel <=  58)   *pGroup = 2;\t// 52 54 56\n\t\telse if (60   <= Channel && Channel <=  64)   *pGroup = 3;\t// 60 62 64\n\t\telse if (100  <= Channel && Channel <= 106)   *pGroup = 4;\t// 100 102 104\n\t\telse if (108  <= Channel && Channel <= 114)   *pGroup = 5;\t// 108 110 112\n\t\telse if (116  <= Channel && Channel <= 122)   *pGroup = 6;\t// 116 118  120\n\t\telse if (124  <= Channel && Channel <= 130)   *pGroup = 7;\t// 124 126 128\n\t\telse if (132  <= Channel && Channel <= 138)   *pGroup = 8;\t// 132 134 136\n\t\telse if (140  <= Channel && Channel <= 144)   *pGroup = 9;\t// 140 142 144\n\t\telse if (149  <= Channel && Channel <= 155)   *pGroup = 10;\t// 149 151 153\n\t\telse if (157  <= Channel && Channel <= 161)   *pGroup = 11;\t// 157 159 161\n\t\telse if (165  <= Channel && Channel <= 171)   *pGroup = 12;\t// 165 167 169\n\t\telse if (173  <= Channel && Channel <= 177)   *pGroup = 13;\t// 173 175 177\n\t\telse\n\t\t{\n\t\t\tRT_DISP(FPHY, PHY_TXPWR_EFUSE, (\"==>hal_GetChnlGroupJaguar in 5G, but Channel %d in Group not found \\n\",Channel));\n\t\t}\n\n\t}\n\n\treturn bIn24G;\n}\n\n\nstatic void\nhal_ReadPowerValueFromPROM8814A(\n\tIN\tPADAPTER \t\tAdapter,\n\tIN\tPTxPowerInfo24G\tpwrInfo24G,\n\tIN\tPTxPowerInfo5G\tpwrInfo5G,\n\tIN\tu8*\t\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\t\tAutoLoadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu32 rfPath, eeAddr=EEPROM_TX_PWR_INX_8814, group,TxCount=0;\n\t\n\t_rtw_memset(pwrInfo24G, 0, sizeof(TxPowerInfo24G));\n\t_rtw_memset(pwrInfo5G, 0, sizeof(TxPowerInfo5G));\n\n\t/* DBG_871X(\"hal_ReadPowerValueFromPROM8814A(): PROMContent[0x%x]=0x%x\\n\", (eeAddr+1), PROMContent[eeAddr+1]); */\n\tif(0xFF == PROMContent[eeAddr+1])  //YJ,add,120316\n\t\tAutoLoadFail = _TRUE;\n\n\tif(AutoLoadFail)\n\t{\n\t\tDBG_871X(\"hal_ReadPowerValueFromPROM8814A(): Use Default value!\\n\");\n\t\tfor(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++)\n\t\t{\n\t\t\t// 2.4G default value\n\t\t\tfor(group = 0 ; group < MAX_CHNL_GROUP_24G; group++)\n\t\t\t{\n\t\t\t\tpwrInfo24G->IndexCCK_Base[rfPath][group] =\tEEPROM_DEFAULT_24G_INDEX;\n\t\t\t\tpwrInfo24G->IndexBW40_Base[rfPath][group] =\tEEPROM_DEFAULT_24G_INDEX;\n\t\t\t}\n\t\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t\t{\n\t\t\t\tif(TxCount==0)\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][0] =\tEEPROM_DEFAULT_24G_HT20_DIFF;\n\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][0] =\tEEPROM_DEFAULT_24G_OFDM_DIFF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo24G->BW40_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo24G->CCK_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t}\n\t\t\t}\t\n\n\t\t\t// 5G default value\n\t\t\tfor(group = 0 ; group < MAX_CHNL_GROUP_5G; group++)\n\t\t\t{\n\t\t\t\tpwrInfo5G->IndexBW40_Base[rfPath][group] =\t\tEEPROM_DEFAULT_5G_INDEX;\n\t\t\t}\n\t\t\t\n\t\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t\t{\n\t\t\t\tif(TxCount==0)\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->OFDM_Diff[rfPath][0] =\tEEPROM_DEFAULT_5G_OFDM_DIFF;\n\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][0] =\tEEPROM_DEFAULT_5G_HT20_DIFF;\n\t\t\t\t\tpwrInfo5G->BW80_Diff[rfPath][0] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo5G->BW160_Diff[rfPath][0] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->OFDM_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo5G->BW40_Diff[rfPath][TxCount]=\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo5G->BW80_Diff[rfPath][TxCount]=\tEEPROM_DEFAULT_DIFF;\n\t\t\t\t\tpwrInfo5G->BW160_Diff[rfPath][TxCount] =\tEEPROM_DEFAULT_DIFF;\n\n\t\t\t\t}\n\t\t\t}\t\n\t\t\t\n\t\t}\n\t\t\n\t\t//pHalData->bNOPG = _TRUE;\t\t\t\t\n\t\treturn;\n\t}\n\n\tfor(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++)\n\t{\n\t\t// 2.4G default value\n\t\tfor(group = 0 ; group < MAX_CHNL_GROUP_24G; group++)\n\t\t{\n\t\t\tpwrInfo24G->IndexCCK_Base[rfPath][group] =\tPROMContent[eeAddr++];\n\t\t\tif(pwrInfo24G->IndexCCK_Base[rfPath][group] == 0xFF)\n\t\t\t{\n\t\t\t\tpwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX;\n\t\t\t}\n\t\t\t/* DBG_871X(\"8814-2G RF-%d-G-%d CCK-Addr-%x BASE=%x\\n\", \n\t\t\t\trfPath, group, eeAddr-1, pwrInfo24G->IndexCCK_Base[rfPath][group]); */\n\t\t}\n\t\tfor(group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++)\n\t\t{\n\t\t\tpwrInfo24G->IndexBW40_Base[rfPath][group] =\tPROMContent[eeAddr++];\n\t\t\tif(pwrInfo24G->IndexBW40_Base[rfPath][group] == 0xFF)\n\t\t\t\tpwrInfo24G->IndexBW40_Base[rfPath][group] =\tEEPROM_DEFAULT_24G_INDEX;\n\t\t\t/* DBG_871X(\"8814-2G RF-%d-G-%d BW40-Addr-%x BASE=%x\\n\", \n\t\t\t\trfPath, group, eeAddr-1, pwrInfo24G->IndexBW40_Base[rfPath][group]); */\n\t\t}\n\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t{\n\t\t\tif(TxCount==0)\n\t\t\t{\n\t\t\t\tpwrInfo24G->BW40_Diff[rfPath][TxCount] = 0;\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0xf0)>>4;\t\t\t\t\n\t\t\t\t \tif(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0x0f);\t\t\t\t\t\n\t\t\t\t\tif(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->OFDM_Diff[rfPath][TxCount]); */\n\n\t\t\t\tpwrInfo24G->CCK_Diff[rfPath][TxCount] = 0;\n\t\t\t\teeAddr++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\t\t\t\t\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->BW40_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0xf0)>>4;\t\t\t\t\n\t\t\t\t\tif(pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->BW40_Diff[rfPath][TxCount]); */\n\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0x0f);\t\t\t\t\n\t\t\t\t\tif(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */\n\n\t\t\t\teeAddr++;\n\t\t\t\t\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0xf0)>>4;\t\t\t\t\n\t\t\t\t\tif(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */\n\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo24G->CCK_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0x0f);\t\t\t\t\n\t\t\t\t\tif(pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0;\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-2G RF-%d-SS-%d CCK-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo24G->CCK_Diff[rfPath][TxCount]); */\n\n\t\t\t\teeAddr++;\n\t\t\t}\n\t\t}\n\n\t\t//5G default value\n\t\tfor(group = 0 ; group < MAX_CHNL_GROUP_5G; group++)\n\t\t{\n\t\t\tpwrInfo5G->IndexBW40_Base[rfPath][group] =\t\tPROMContent[eeAddr++];\n\t\t\tif(pwrInfo5G->IndexBW40_Base[rfPath][group] == 0xFF)\n\t\t\t\tpwrInfo5G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_DIFF;\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t/* DBG_871X(\"8814-5G RF-%d-G-%d BW40-Addr-%x BASE=%x\\n\", \n\t\t\t\trfPath, TxCount, eeAddr-1, pwrInfo5G->IndexBW40_Base[rfPath][group]); */\n\t\t}\n\t\t\n\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t{\n\t\t\tif(TxCount==0)\n\t\t\t{\n\t\t\t\tpwrInfo5G->BW40_Diff[rfPath][TxCount]=\t 0;\t\t\t\t\n\t\t\t\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][0] =\t(PROMContent[eeAddr]&0xf0)>>4;\t\t\t\t\n\t\t\t\t\tif(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0;\t\t\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */\n\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->OFDM_Diff[rfPath][0] =\t(PROMContent[eeAddr]&0x0f);\t\t\t\t\n\t\t\t\t\tif(pwrInfo5G->OFDM_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\t\tpwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0;\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */\n\n\t\t\t\teeAddr++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->BW40_Diff[rfPath][TxCount]=\t (PROMContent[eeAddr]&0xf0)>>4;\t\t\t\t\t\n\t\t\t\t\tif(pwrInfo5G->BW40_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\tpwrInfo5G->BW40_Diff[rfPath][TxCount] |= 0xF0;\t\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->BW40_Diff[rfPath][TxCount]); */\n\t\t\t\t\n\n\t\t\t\t{\n\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f);\t\t\t\t\n\t\t\t\t\tif(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\tpwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\\n\", \n\t\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */\n\t\t\t\t\n\t\t\t\teeAddr++;\n\t\t\t}\n\t\t}\t\n\n\n\t\t{\n\t\t\tpwrInfo5G->OFDM_Diff[rfPath][1] =\t(PROMContent[eeAddr]&0xf0)>>4;\n\t\t\tpwrInfo5G->OFDM_Diff[rfPath][2] =\t(PROMContent[eeAddr]&0x0f);\n\t\t}\n\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\trfPath, 2, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][2]); */\n\t\teeAddr++;\t\t\n\n\n\t\t\tpwrInfo5G->OFDM_Diff[rfPath][3] =\t(PROMContent[eeAddr]&0x0f);\n\n\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\trfPath, 3, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][3]); */\n\t\teeAddr++;\n\t\t\n\t\tfor(TxCount=1;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t{\n\t\t\tif(pwrInfo5G->OFDM_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\tpwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0;\t\t\t\n\n\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\\n\", \n\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */\n\t\t}\t\n\t\t\n\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t{\t\t\n\n\t\t\t{\n\t\t\t\tpwrInfo5G->BW80_Diff[rfPath][TxCount] =\t(PROMContent[eeAddr]&0xf0)>>4;\t\t\t\n\t\t\t\tif(pwrInfo5G->BW80_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\tpwrInfo5G->BW80_Diff[rfPath][TxCount] |= 0xF0;\t\t\t\n\t\t\t}\n\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d BW80-Addr-%x DIFF=%d\\n\", \n\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->BW80_Diff[rfPath][TxCount]); */\n\t\t\t\n\n\t\t\t{\n\t\t\t\tpwrInfo5G->BW160_Diff[rfPath][TxCount]=\t(PROMContent[eeAddr]&0x0f);\t\t\t\n\t\t\t\tif(pwrInfo5G->BW160_Diff[rfPath][TxCount] & BIT3)\t\t//4bit sign number to 8 bit sign number\n\t\t\t\t\tpwrInfo5G->BW160_Diff[rfPath][TxCount] |= 0xF0;\t\t\t\t\t\t\n\t\t\t}\n\t\t\t/* DBG_871X(\"8814-5G RF-%d-SS-%d BW160-Addr-%x DIFF=%d\\n\", \n\t\t\t\trfPath, TxCount, eeAddr, pwrInfo5G->BW160_Diff[rfPath][TxCount]); */\n\t\t\teeAddr++;\n\t\t}\n\t}\n\n}\n\nVOID\nHALBT_InitHalVars(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n#ifdef CONFIG_BT_COEXIST\n#if (MP_DRIVER == 1)\n\tpHalData->bt_coexist.bBtExist = 0;\n#else\n\tpHalData->bt_coexist.bBtExist = pHalData->EEPROMBluetoothCoexist;\n#endif\n\tpHalData->bt_coexist.btTotalAntNum = pHalData->EEPROMBluetoothAntNum;\n\tpHalData->bt_coexist.btChipType = pHalData->EEPROMBluetoothType;\n#endif //CONFIG_BT_COEXIST\n}\n\n\nVOID \nBT_InitHalVars(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n\tu8\tantNum=2, chipType;\n\tBOOLEAN\tbBtExist=_FALSE;\n\n\t// HALBT_InitHalVars() must be called first\n\tHALBT_InitHalVars(Adapter);\n#if 0\n\t// called after HALBT_InitHalVars()\n\tbBtExist = HALBT_GetBtExist(Adapter);\n\tEXhalbtcoutsrc_SetBtExist(bBtExist);\n\tchipType = HALBT_GetBtChipType(Adapter);\n\tEXhalbtcoutsrc_SetChipType(chipType);\n\tantNum = HALBT_GetPgAntNum(Adapter);\n\tEXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);\n#endif\n}\n\n\nVOID\nhal_EfuseParseBTCoexistInfo8814A(\n\tIN PADAPTER\t\t\tAdapter,\n\tIN u8*\t\t\thwinfo,\n\tIN BOOLEAN\t\t\tAutoLoadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\ttempval=0x0;\n\n\tif(!AutoLoadFail)\n\t{\n\t\ttempval = hwinfo[EEPROM_RF_BOARD_OPTION_8814];\n\t\tif( ((tempval & 0xe0)>>5) == 0x1)// [7:5]\n\t\t\tpHalData->EEPROMBluetoothCoexist = 1;\n\t\telse\n\t\t\tpHalData->EEPROMBluetoothCoexist = 0;\n\t\tpHalData->EEPROMBluetoothType = BT_RTL8814A;\n\n\t\ttempval = hwinfo[EEPROM_RF_BT_SETTING_8814];\n\t\tpHalData->EEPROMBluetoothAntNum = Ant_x1;\n\t}\n\telse\n\t{\n\t\tpHalData->EEPROMBluetoothCoexist = 0;\n\t\tpHalData->EEPROMBluetoothType = BT_RTL8814A;\n\t\tpHalData->EEPROMBluetoothAntNum = Ant_x1;\n\t}\n\n\tBT_InitHalVars(Adapter);\n}\n\nVOID\nhal_ReadPROMVersion8814A(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8* \tPROMContent,\n\tIN\tBOOLEAN \tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif(AutoloadFail){\n\t\tpHalData->EEPROMVersion = EEPROM_Default_Version;\t\t\n\t}\n\telse{\n\t\tpHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION_8814];\n\t\tif(pHalData->EEPROMVersion == 0xFF)\n\t\t\tpHalData->EEPROMVersion = EEPROM_Default_Version;\t\t\t\t\t\n\t}\n}\n\nvoid\nhal_ReadTxPowerInfo8814A(\n\tIN\tPADAPTER \t\tAdapter,\n\tIN\tu8*\t\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\t\tAutoLoadFail\n\t)\n{\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tTxPowerInfo24G\tpwrInfo24G;\n\tTxPowerInfo5G\tpwrInfo5G;\n\tu8\trfPath, ch, group, TxCount;\n\n\thal_ReadPowerValueFromPROM8814A(Adapter, &pwrInfo24G,&pwrInfo5G, PROMContent, AutoLoadFail);\n\n\t//if(!AutoLoadFail)\n\t//\tpHalData->bTXPowerDataReadFromEEPORM = _TRUE;\t\t\n\n\tfor(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++)\n\t{\n\t\tfor (ch = 0 ; ch < CENTER_CH_2G_NUM ; ch++) {\n\t\t\thal_GetChnlGroup8814A(ch+1, &group);\n\n\t\t\tif(ch == 14-1) \n\t\t\t{\n\t\t\t\tpHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][5];\n\t\t\t\tpHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][group];\n\t\t\t\tpHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group];\n\t\t\t}\n\t\t\t//DBG_871X(\"======= Path %d, ChannelIndex %d, Group %d=======\\n\",rfPath,ch, group);\t\n\t\t\t//DBG_871X(\"Index24G_CCK_Base[%d][%d] = 0x%x\\n\",rfPath,ch ,pHalData->Index24G_CCK_Base[rfPath][ch]);\n\t\t\t//DBG_871X(\"Index24G_BW40_Base[%d][%d] = 0x%x\\n\",rfPath,ch,pHalData->Index24G_BW40_Base[rfPath][ch]);\n\t\t}\t\n\n\t\tfor (ch = 0 ; ch < CENTER_CH_5G_ALL_NUM; ch++) {\n\t\t\thal_GetChnlGroup8814A(center_ch_5g_all[ch], &group);\n\t\t\t\n\t\t\tpHalData->Index5G_BW40_Base[rfPath][ch] = pwrInfo5G.IndexBW40_Base[rfPath][group];\n\t\t\t//DBG_871X(\"======= Path %d, ChannelIndex %d, Group %d=======\\n\",rfPath,ch, group);\t\t\t\n\t\t\t//DBG_871X(\"Index5G_BW40_Base[%d][%d] = 0x%x\\n\",rfPath,ch,pHalData->Index5G_BW40_Base[rfPath][ch]);\n\t\t}\n\t\tfor (ch = 0 ; ch < CENTER_CH_5G_80M_NUM; ch++) {\n\t\t\tu8\tupper, lower;\n\t\t\t\n\t\t\thal_GetChnlGroup8814A(center_ch_5g_80m[ch], &group);\n\t\t\tupper = pwrInfo5G.IndexBW40_Base[rfPath][group];\n\t\t\tlower = pwrInfo5G.IndexBW40_Base[rfPath][group+1];\n\t\t\t\n\t\t\tpHalData->Index5G_BW80_Base[rfPath][ch] = (upper + lower) / 2;\n\t\t\t\n\t\t\t//DBG_871X(\"======= Path %d, ChannelIndex %d, Group %d=======\\n\",rfPath,ch, group);\t\n\t\t\t//DBG_871X(\"Index5G_BW80_Base[%d][%d] = 0x%x\\n\",rfPath,ch,pHalData->Index5G_BW80_Base[rfPath][ch]);\n\t\t}\n\n\t\tfor(TxCount=0;TxCount<MAX_TX_COUNT;TxCount++)\n\t\t{\n\t\t\tpHalData->CCK_24G_Diff[rfPath][TxCount]=pwrInfo24G.CCK_Diff[rfPath][TxCount];\n\t\t\tpHalData->OFDM_24G_Diff[rfPath][TxCount]=pwrInfo24G.OFDM_Diff[rfPath][TxCount];\n\t\t\tpHalData->BW20_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW20_Diff[rfPath][TxCount];\n\t\t\tpHalData->BW40_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW40_Diff[rfPath][TxCount];\n\t\t\t\n\t\t\tpHalData->OFDM_5G_Diff[rfPath][TxCount]=pwrInfo5G.OFDM_Diff[rfPath][TxCount];\n\t\t\tpHalData->BW20_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW20_Diff[rfPath][TxCount];\n\t\t\tpHalData->BW40_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW40_Diff[rfPath][TxCount];\n\t\t\tpHalData->BW80_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW80_Diff[rfPath][TxCount];\n//#if DBG\n#if 0\n\t\t\tDBG_871X(\"--------------------------------------- 2.4G ---------------------------------------\\n\");\n\t\t\tDBG_871X(\"CCK_24G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->CCK_24G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"OFDM_24G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->OFDM_24G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"BW20_24G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->BW20_24G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"BW40_24G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->BW40_24G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"---------------------------------------- 5G ----------------------------------------\\n\");\n\t\t\tDBG_871X(\"OFDM_5G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->OFDM_5G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"BW20_5G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->BW20_5G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"BW40_5G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->BW40_5G_Diff[rfPath][TxCount]);\n\t\t\tDBG_871X(\"BW80_5G_Diff[%d][%d]= %d\\n\",rfPath,TxCount,pHalData->BW80_5G_Diff[rfPath][TxCount]);\n#endif\t\t\t\t\t\t\t\n\t\t}\n\t}\n\n\t\n\t// 2010/10/19 MH Add Regulator recognize for CU.\n\tif(!AutoLoadFail)\n\t{\n\t\tstruct registry_priv  *registry_par = &Adapter->registrypriv;\n\t\t\n\t\tpHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0x7);\t//bit0~2\n\t\tif(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF)\n\t\t\tpHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION&0x7);\t//bit0~2\n\t}\n\telse\n\t{\n\t\tpHalData->EEPROMRegulatory = 0;\n\n\t}\n\tDBG_871X(\"EEPROMRegulatory = 0x%x\\n\", pHalData->EEPROMRegulatory);\n\n}\n\nVOID\nhal_ReadBoardType8814A(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8*\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif(!AutoloadFail)\n\t{\n\t\tpHalData->InterfaceSel = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0xE0)>>5;\n\t\tif(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF)\n\t\t\tpHalData->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION&0xE0)>>5;\n\t}\n\telse\n\t{\n\t\tpHalData->InterfaceSel = 0;\n\t}\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Board Type: 0x%2x\\n\", pHalData->InterfaceSel));\n}\n\nVOID\nhal_Read_TRX_antenna_8814A(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8\t*PROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8 trx_antenna = RF_2T4R;\n\n\tif (!AutoloadFail) {\n\t\tu8 trx_antenna_option = PROMContent[EEPROM_TRX_ANTENNA_OPTION_8814];\n\n\t\tif (trx_antenna_option == 0xff) {\n\t\t\ttrx_antenna = RF_4T4R;\n\t\t\tDBG_871X(\"EEPROM RF set 4T4R\\n\");\n\t\t} else if (trx_antenna_option == 0xee) {\n\t\t\ttrx_antenna = RF_3T3R;\n\t\t\tDBG_871X(\"EEPROM RF set 3T3R\\n\");\n\t\t} else if (trx_antenna_option == 0x66) {\n\t\t\ttrx_antenna = RF_2T2R;\n\t\t\tDBG_871X(\"EEPROM RF set 2T2R\\n\");\n\t\t} else if (trx_antenna_option == 0x6f) {\n\t\t\ttrx_antenna = RF_2T4R;\n\t\t\tDBG_871X(\"EEPROM RF set 2T4R\\n\");\n\t\t} else {\n\t\t\ttrx_antenna = RF_2T4R;\n\t\t\tDBG_871X(\"unknown EEPROM RF set, default to 2T4R\\n\");\n\t\t}\n\t} else {\n\t\ttrx_antenna = RF_2T4R;\n\t\tDBG_871X(\"AutoloadFail, default to 2T4R\\n\");\n\t}\n\t\n\t/* if driver doesn't set rf_config, use the value of EEPROM */\n\tif (Adapter->registrypriv.rf_config == RF_MAX_TYPE) {\n\n\t\tif (trx_antenna == RF_4T4R\n#ifdef CONFIG_USB_HCI\n\t\t&& IS_SUPER_SPEED_USB(Adapter)\n#endif /* CONFIG_USB_HCI */\n\t\t)\n\t\t\tAdapter->registrypriv.rf_config = RF_3T3R;\n\t\telse if (trx_antenna == RF_2T4R)\n\t\t\tAdapter->registrypriv.rf_config = RF_2T4R;\n\t\telse {\n\t\t\tAdapter->registrypriv.rf_config = RF_2T4R;\n\t\t\tDBG_871X(\"default rf type: %d\\n\", Adapter->registrypriv.rf_config);\n\t\t}\n\t} else {\n#ifdef CONFIG_USB_HCI\n\t\tif (!IS_SUPER_SPEED_USB(Adapter))\n\t\t\tAdapter->registrypriv.rf_config = RF_2T4R;\n#endif /* CONFIG_USB_HCI */\n\t}\n\t\n\tDBG_871X(\"Final rf_config: %d\\n\", Adapter->registrypriv.rf_config);\n}\n\n\nVOID\nhal_ReadThermalMeter_8814A(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8* \t\tPROMContent,\n\tIN\tBOOLEAN \tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tpHalData->EEPROMThermalMeter = 0xff;\n\t\n\tif(!AutoloadFail)\t\n\t\tpHalData->EEPROMThermalMeter = PROMContent[EEPROM_THERMAL_METER_8814];\n\n#if 0 /* ToDo: check with RF */\n\telse\n\t\tpHalData->EEPROMThermalMeter = EEPROM_Default_ThermalMeter_8814A;\n\n\tif ((pHalData->EEPROMThermalMeter == 0xff) || (_TRUE == AutoloadFail)) {\n\t\tpHalData->odmpriv.RFCalibrateInfo.bAPKThermalMeterIgnore = _TRUE;\n\t\tpHalData->EEPROMThermalMeter = EEPROM_Default_ThermalMeter_8814A;\n\t}\n#endif\n\n\t//pHalData->ThermalMeter[0] = pHalData->EEPROMThermalMeter;\n\tDBG_871X(\"ThermalMeter = 0x%x\\n\", pHalData->EEPROMThermalMeter);\n}\n\n\nvoid hal_ReadRemoteWakeup_8814A(\n\tPADAPTER\t\tpadapter,\n\tIN\tu8*\t\t\thwinfo,\n\tIN\tBOOLEAN\t\t\tAutoLoadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tu8 tmpvalue;\n\n\tif(AutoLoadFail){\n\t\tpwrctl->bHWPowerdown = _FALSE;\n\t\tpwrctl->bSupportRemoteWakeup = _FALSE;\n\t}\n\telse\n\t{\t\t\n\t\t// decide hw if support remote wakeup function\n\t\t// if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume\n/* todo: wowlan should check the efuse again\n#ifdef CONFIG_USB_HCI\n\t\tif(IS_HARDWARE_TYPE_8821U(padapter))\n\t\t\tpwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0_8811AU] & BIT1)?_TRUE :_FALSE;\n\t\telse\n\t\t\tpwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT1)?_TRUE :_FALSE;\n#endif //CONFIG_USB_HCI\n*/\n\t\tDBG_871X(\"%s...bSupportRemoteWakeup(%x)\\n\",__FUNCTION__, pwrctl->bSupportRemoteWakeup);\n\t}\n}\n\nVOID\nhal_ReadChannelPlan8814A(\n\tIN\tPADAPTER\t\tpadapter,\n\tIN\tu8*\t\t\t\thwinfo,\n\tIN\tBOOLEAN\t\t\tAutoLoadFail\n\t)\n{\n\tpadapter->mlmepriv.ChannelPlan = hal_com_config_channel_plan(\n\t\tpadapter\n\t\t, hwinfo?hwinfo[EEPROM_ChannelPlan_8814]:0xFF\n\t\t, padapter->registrypriv.channel_plan\n\t\t, RTW_CHPLAN_REALTEK_DEFINE\n\t\t, AutoLoadFail\n\t);\n\n\tDBG_871X(\"mlmepriv.ChannelPlan = 0x%02x\\n\", padapter->mlmepriv.ChannelPlan);\n}\n\nvoid hal_GetRxGainOffset_8814A(\n\tPADAPTER\tAdapter,\n\tpu1Byte\t\tPROMContent,\n\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct registry_priv *pregistrypriv = &Adapter->registrypriv;\n\n\tpHalData->RxGainOffset[0] = 0;\n\tpHalData->RxGainOffset[1] = 0;\n\tpHalData->RxGainOffset[2] = 0;\n\tpHalData->RxGainOffset[3] = 0;\n\n\tif ((pregistrypriv->reg_rxgain_offset_2g != 0 && pregistrypriv->reg_rxgain_offset_5gl != 0) && \n\t\t(pregistrypriv->reg_rxgain_offset_5gm != 0 && pregistrypriv->reg_rxgain_offset_5gh != 0)) {\n\t\tpHalData->RxGainOffset[0] = pregistrypriv->reg_rxgain_offset_2g;\n\t\tpHalData->RxGainOffset[1] = pregistrypriv->reg_rxgain_offset_5gl;\n\t\tpHalData->RxGainOffset[2] = pregistrypriv->reg_rxgain_offset_5gm;\n\t\tpHalData->RxGainOffset[3] = pregistrypriv->reg_rxgain_offset_5gh;\n\t\tDBG_871X(\"%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);\n\n\t} else {\n\t\tDBG_871X(\"%s(): AutoloadFail = %d!!\\n\", __func__, AutoloadFail);\n\t\tpHalData->RxGainOffset[0] = PROMContent[EEPROM_IG_OFFSET_4_CD_2G_8814A];\n\t\tpHalData->RxGainOffset[0] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_2G_8814A]) << 8;\n\t\tpHalData->RxGainOffset[1] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GL_8814A];\n\t\tpHalData->RxGainOffset[1] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GL_8814A]) << 8;\n\t\tpHalData->RxGainOffset[2] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GM_8814A];\n\t\tpHalData->RxGainOffset[2] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GM_8814A]) << 8;\n\t\tpHalData->RxGainOffset[3] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GH_8814A];\n\t\tpHalData->RxGainOffset[3] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GH_8814A]) << 8;\n\t}\n\tDBG_871X(\"hal_GetRxGainOffset_8814A(): RegRxGainOffset_2G = 0x%x!!\\n\", pHalData->RxGainOffset[0]);\n\tDBG_871X(\"hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GL = 0x%x!!\\n\", pHalData->RxGainOffset[1]);\n\tDBG_871X(\"hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GM = 0x%x!!\\n\", pHalData->RxGainOffset[2]);\n\tDBG_871X(\"hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GH = 0x%x!!\\n\", pHalData->RxGainOffset[3]);\n}\n\n\nvoid Hal_EfuseParseKFreeData_8814A(\n\tIN\t\tPADAPTER\t\tAdapter,\n\tIN\t\tu8\t\t\t\t*PROMContent,\n\tIN\t\tBOOLEAN\t\t\tAutoloadFail)\n{\n#ifdef CONFIG_RF_GAIN_OFFSET\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct kfree_data_t *kfree_data = &pHalData->kfree_data;\n\tu8 kfreePhydata[KFREE_GAIN_DATA_LENGTH_8814A];\n\tu32 i = 0, j = 2, chidx = 0, efuseaddr = 0;\n\tu8 rfpath = 0;\n\n\tif (GET_PG_KFREE_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff)\n\t\tkfree_data->flag |= KFREE_FLAG_ON;\n\tif (GET_PG_KFREE_THERMAL_K_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff)\n\t\tkfree_data->flag |= KFREE_FLAG_THERMAL_K_ON;\n\n\tif (Adapter->registrypriv.RegRfKFreeEnable == 1) {\n\t\t\tkfree_data->flag |= KFREE_FLAG_ON;\n\t\t\tkfree_data->flag |= KFREE_FLAG_THERMAL_K_ON;\n\t}\n\n\t_rtw_memset(kfree_data->bb_gain, 0xff, BB_GAIN_NUM * RF_PATH_MAX);\n\n\tif (kfree_data->flag & KFREE_FLAG_ON) {\n\n\t\tfor (i = 0; i < KFREE_GAIN_DATA_LENGTH_8814A; i++) {\n\t\t\tefuseaddr = PPG_BB_GAIN_2G_TXBA_OFFSET_8814A - i;\n\n\t\t\tif (efuseaddr <= PPG_BB_GAIN_2G_TXBA_OFFSET_8814A) {\n\t\t\t\tkfreePhydata[i] = EFUSE_Read1Byte(Adapter, efuseaddr);\n\t\t\t\tDBG_871X(\"%s,kfreePhydata[%d] = %x\\n\", __func__, i, kfreePhydata[i]);\n\t\t\t}\n\t\t}\n\t\tkfree_data->bb_gain[0][RF_PATH_A]\n\t\t\t= (kfreePhydata[0] & PPG_BB_GAIN_2G_TX_OFFSET_MASK);\n\t\tkfree_data->bb_gain[0][RF_PATH_B]\n\t\t\t= (kfreePhydata[0] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4;\n\t\tkfree_data->bb_gain[0][RF_PATH_C]\n\t\t\t= (kfreePhydata[1] & PPG_BB_GAIN_2G_TX_OFFSET_MASK);\n\t\tkfree_data->bb_gain[0][RF_PATH_D]\n\t\t\t= (kfreePhydata[1] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4;\n\n\t\tfor (chidx = 1; chidx <= BB_GAIN_5GHB; chidx++) {\n\t\t\tfor (rfpath = RF_PATH_A;  rfpath < RF_PATH_MAX; rfpath++)\n\t\t\t\t\tkfree_data->bb_gain[chidx][rfpath] = kfreePhydata[j + rfpath] & PPG_BB_GAIN_5G_TX_OFFSET_MASK;\n\n\t\t\tj = j + RF_PATH_MAX;\n\t\t}\n\t}\n\n\tif (kfree_data->flag & KFREE_FLAG_THERMAL_K_ON)\n\t\tpHalData->EEPROMThermalMeter += kfree_data->thermal;\n\n\tDBG_871X(\"registrypriv.RegRfKFreeEnable = %d\\n\", Adapter->registrypriv.RegRfKFreeEnable);\n\n\tDBG_871X(\"kfree flag:%u\\n\", kfree_data->flag);\n\tif (Adapter->registrypriv.RegRfKFreeEnable == 1 || kfree_data->flag & KFREE_FLAG_ON) {\n\t\tfor (chidx = 0 ; chidx <= BB_GAIN_5GHB; chidx++) {\n\t\t\tfor (rfpath = RF_PATH_A;  rfpath < RF_PATH_MAX; rfpath++)\n\t\t\t\tDBG_871X(\"bb_gain[%d][%d]= %x\\n\", chidx, rfpath, kfree_data->bb_gain[chidx][rfpath]);\n\t\t}\n\t}\n\n#endif /*CONFIG_RF_GAIN_OFFSET */\n}\n\n\nVOID\nhal_EfuseParseXtal_8814A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8*\t\t\thwinfo,\n\tIN\tBOOLEAN\t\tAutoLoadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tif(!AutoLoadFail)\n\t{\n\t\tpHalData->CrystalCap = hwinfo[EEPROM_XTAL_8814];\n\t\tif(pHalData->CrystalCap == 0xFF)\n\t\t\tpHalData->CrystalCap = EEPROM_Default_CrystalCap_8814;\t /* what value should 8814 set? */\n\t}\n\telse\n\t{\n\t\tpHalData->CrystalCap = EEPROM_Default_CrystalCap_8814;\n\t}\n\tDBG_871X(\"CrystalCap: 0x%2x\\n\", pHalData->CrystalCap);\n}\n\nVOID\nhal_ReadAntennaDiversity8814A(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8*\t\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\t\tAutoLoadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\tpHalData->TRxAntDivType = NO_ANTDIV; \n\tpHalData->AntDivCfg = 0;\n\t\n\tDBG_871X(\"SWAS: bHwAntDiv = %x, TRxAntDivType = %x\\n\", \n                                                pHalData->AntDivCfg, pHalData->TRxAntDivType);\n}\n\nVOID\nhal_ReadPAType_8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8*\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail,\n\tOUT u8*\t\tpPAType, \n\tOUT u8*\t\tpLNAType\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\tLNAType_AB, LNAType_CD;\n\n\tif( ! AutoloadFail )\n\t{\n\t\tu8\t\t\tRFEType = PROMContent[EEPROM_RFE_OPTION_8814];\n\n\t\tif (GetRegAmplifierType2G(Adapter) == 0) // AUTO\n\t\t{\n\t\t\t*pPAType = EF1Byte( *(u8*)&PROMContent[EEPROM_PA_TYPE_8814] );\n\n\t\t\tLNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_2G_8814] );\n\t\t\tLNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_2G_8814] );\n\t\t\t\n\t\t\tif (*pPAType == 0xFF && RFEType == 0xFF)\n\t\t\t\tpHalData->ExternalPA_2G  = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA)  ? 1 : 0; \n  \t\t\telse\t\n\t\t\t\tpHalData->ExternalPA_2G = (*pPAType & BIT4) ? 1 : 0;\n\n\t\t\tif (LNAType_AB == 0xFF)\n\t\t\t\tpHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0;\n\t\t\telse\n\t\t\t\tpHalData->ExternalLNA_2G = (LNAType_AB & BIT3) ? 1 : 0;\t\t\n\n\t\t\t*pLNAType =\t(LNAType_AB & BIT3) << 1 | (LNAType_AB & BIT7) >> 2 |\n\t\t\t\t\t\t(LNAType_CD & BIT3) << 3 | (LNAType_CD & BIT7);\n\t\t}\n\t\telse \n\t\t{\n\t\t\tpHalData->ExternalPA_2G  = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA)  ? 1 : 0; \n\t\t\tpHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; \t\t\t\t\t    \n\t\t}\n\n\t\tif (GetRegAmplifierType5G(Adapter) == 0) // AUTO\n\t\t{\n\t\t\tLNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_5G_8814] );\n\t\t\tLNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_5G_8814] );\n\t\t\t\n\t\t\tif (*pPAType == 0xFF && RFEType == 0xFF)\n\t\t\t\tpHalData->ExternalPA_5G  = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA)  ? 1 : 0; \n  \t\t\telse\t\n\t\t\t    pHalData->ExternalPA_5G = (*pPAType & BIT0) ? 1 : 0;\t\t\t\t\t\n\n\t\t\tif (LNAType_AB == 0xFF)\n\t\t\t\tpHalData->ExternalLNA_5G = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0;\n\t\t\telse\n\t\t\t    pHalData->ExternalLNA_5G = (LNAType_AB & BIT3) ? 1 : 0;\t\t\n\n\t\t\t(*pLNAType) |= \t((LNAType_AB & BIT3) >> 3 | (LNAType_AB & BIT7) >> 6 |\n\t\t\t\t\t\t\t(LNAType_CD & BIT3) >> 1 | (LNAType_CD & BIT7) >> 4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpHalData->ExternalPA_5G  = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G)  ? 1 : 0; \t\t\t\n\t\t\tpHalData->ExternalLNA_5G = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0;  \t\t    \n\t\t}\n\t}\n\telse\n\t{\n\t\tpHalData->ExternalPA_2G  = EEPROM_Default_PAType; \n\t\tpHalData->ExternalPA_5G  = 0xFF; \n\t\tpHalData->ExternalLNA_2G = EEPROM_Default_LNAType;  \n\t\tpHalData->ExternalLNA_5G = 0xFF; \n\t\t\n\t\tif (GetRegAmplifierType2G(Adapter) == 0) \n\t\t{\t\t\n\t\t\tpHalData->ExternalPA_2G  = 0; \n\t\t\tpHalData->ExternalLNA_2G = 0;  \n\t\t}\n\t\telse\n\t\t{\n\t\t\tpHalData->ExternalPA_2G  = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA)  ? 1 : 0; \n\t\t\tpHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0;  \n\t\t}\n\t\tif (GetRegAmplifierType5G(Adapter) == 0) \n\t\t{\t\t\n\t\t\tpHalData->ExternalPA_5G  = 0; \n\t\t\tpHalData->ExternalLNA_5G = 0;  \n\t\t}\n\t\telse\n\t\t{\n\t\t\tpHalData->ExternalPA_5G  = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G)  ? 1 : 0; \t\t\t\n\t\t\tpHalData->ExternalLNA_5G = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0;  \n\t\t}\n\t}\n\tDBG_871X(\"PAType is 0x%x, LNAType is 0x%x\\n\", *pPAType, *pLNAType);\n\tDBG_871X(\"pHalData->ExternalPA_2G = %d, pHalData->ExternalPA_5G = %d\\n\", pHalData->ExternalPA_2G, pHalData->ExternalPA_5G);\n\tDBG_871X(\"pHalData->ExternalLNA_2G = %d, pHalData->ExternalLNA_5G = %d\\n\", pHalData->ExternalLNA_2G, pHalData->ExternalLNA_5G);\n}\n\nVOID hal_ReadAmplifierType_8814A(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tswitch(pHalData->RFEType)\n\t{\n\t\tcase 1:\t/* 8814AU */\n\t\t\tpHalData->ExternalPA_5G = pHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeAPA = pHalData->TypeALNA = 0;/* APA and ALNA is 0 */\n\t\t\tbreak;\n\t\tcase 2:\t/* socket board 8814AR and 8194AR */\n\t\t\tpHalData->ExternalPA_2G = pHalData->ExternalPA_5G = _TRUE;\n\t\t\tpHalData->ExternalLNA_2G = pHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeAPA = pHalData->TypeALNA = 0x55;/* APA and ALNA is 1 */\n\t\t\tpHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */\n\t\t\tbreak;\n\t\tcase 3:\t/* high power on-board 8814AR and 8194AR */\n\t\t\tpHalData->ExternalPA_2G = pHalData->ExternalPA_5G = _TRUE;\n\t\t\tpHalData->ExternalLNA_2G = pHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeAPA = pHalData->TypeALNA = 0xaa;/* APA and ALNA is 2 */\n\t\t\tpHalData->TypeGPA = pHalData->TypeGLNA = 0xaa;/* GPA and GLNA is 2 */\n\t\t\tbreak;\n\t\tcase 4:\t/* on-board 8814AR and 8194AR */\n\t\t\tpHalData->ExternalPA_2G = pHalData->ExternalPA_5G = _TRUE;\n\t\t\tpHalData->ExternalLNA_2G = pHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeAPA = 0x55;/* APA is 1 */\n\t\t\tpHalData->TypeALNA = 0xff; /* ALNA is 3 */\n\t\t\tpHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tpHalData->ExternalPA_2G = pHalData->ExternalPA_5G = _TRUE;\n\t\t\tpHalData->ExternalLNA_2G = pHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeAPA = 0xaa; /* APA2 */\n\t\t\tpHalData->TypeALNA = 0x5500; /* ALNA4 */\n\t\t\tpHalData->TypeGPA = pHalData->TypeGLNA = 0xaa; /* GPA2,GLNA2 */\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tpHalData->ExternalLNA_5G = _TRUE;\n\t\t\tpHalData->TypeALNA = 0; /* ALNA0 */\n\t\t\tbreak;\n\t\tcase 0:\n\t\tdefault:\t/* 8814AE */\n\t\t\tbreak;\n\t}\n\n\tDBG_871X(\"pHalData->ExternalPA_2G = %d, pHalData->ExternalPA_5G = %d\\n\", pHalData->ExternalPA_2G, pHalData->ExternalPA_5G);\n\tDBG_871X(\"pHalData->ExternalLNA_2G = %d, pHalData->ExternalLNA_5G = %d\\n\", pHalData->ExternalLNA_2G, pHalData->ExternalLNA_5G);\n\tDBG_871X(\"pHalData->TypeGPA = 0x%X, pHalData->TypeAPA = 0x%X\\n\", pHalData->TypeGPA, pHalData->TypeAPA);\n\tDBG_871X(\"pHalData->TypeGLNA = 0x%X, pHalData->TypeALNA = 0x%X\\n\", pHalData->TypeGLNA, pHalData->TypeALNA);\n}\n\n\nVOID\nhal_ReadRFEType_8814A(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8*\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif(!AutoloadFail)\n\t{\n\t\tif ((GetRegRFEType(Adapter) != 64) || 0xFF == PROMContent[EEPROM_RFE_OPTION_8814] || PROMContent[EEPROM_RFE_OPTION_8814] & BIT7) {\n\t\t\tif(GetRegRFEType(Adapter) != 64)\n\t\t\t\tpHalData->RFEType = GetRegRFEType(Adapter);\n\t\t\telse if(IS_HARDWARE_TYPE_8814AE(Adapter))\n\t\t\t\tpHalData->RFEType = 0;\n\t\t\telse if(IS_HARDWARE_TYPE_8814AU(Adapter))\n\t\t\t\tpHalData->RFEType = 1;\n\t\t\thal_ReadAmplifierType_8814A(Adapter);\n\t\t\t\n\t\t} else {\n\t\t\t/* bit7==0 means  RFE type defined by 0xCA[6:0] */\n\t\t\tpHalData->RFEType = PROMContent[EEPROM_RFE_OPTION_8814] & 0x7F;\n\t\t\thal_ReadAmplifierType_8814A(Adapter);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(GetRegRFEType(Adapter) != 64)\n\t\t\tpHalData->RFEType = GetRegRFEType(Adapter);\n\t\telse if(IS_HARDWARE_TYPE_8814AE(Adapter))\n\t\t\tpHalData->RFEType = 0;\n\t\telse if(IS_HARDWARE_TYPE_8814AU(Adapter))\n\t\t\tpHalData->RFEType = 1;\n\n\t\thal_ReadAmplifierType_8814A(Adapter);\n\t}\n\tDBG_871X(\"RFE Type: 0x%2x\\n\", pHalData->RFEType);\n}\n\nstatic VOID\nhal_EfusePowerSwitch8814A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tbWrite,\n\tIN\tu8\t\tPwrState)\n{\n\tu8\ttempval;\n\tu16\ttmpV16;\n\tu8 \tEFUSE_ACCESS_ON_8814A = 0x69;\n\tu8\tEFUSE_ACCESS_OFF_8814A = 0x00;\n\t\n\tif (PwrState == _TRUE)\n\t{\n\t\trtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON_8814A);\t\n\t\t\n\t\t// Reset: 0x0000h[28], default valid\n\t\ttmpV16 =  PlatformEFIORead2Byte(pAdapter,REG_SYS_FUNC_EN);\n\t\tif( !(tmpV16 & FEN_ELDR) ){\n\t\t\ttmpV16 |= FEN_ELDR ;\n\t\t\trtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16);\n\t\t}\n\t\t\n\t\t// Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid\n\t\ttmpV16 = PlatformEFIORead2Byte(pAdapter,REG_SYS_CLKR);\n\t\tif( (!(tmpV16 & LOADER_CLK_EN) )  ||(!(tmpV16 & ANA8M) ) )\n\t\t{\n\t\t\ttmpV16 |= (LOADER_CLK_EN |ANA8M ) ;\n\t\t\trtw_write16(pAdapter,REG_SYS_CLKR,tmpV16);\n\t\t}\n\n\t\tif(bWrite == _TRUE)\n\t\t{\n\t\t\t// Enable LDO 2.5V before read/write action\n\t\t\ttempval = rtw_read8(pAdapter, EFUSE_TEST+3);\n\t\t\ttempval &= 0x0F;\n\t\t\ttempval |= (VOLTAGE_V25 << 4);\n\t\t\trtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80));\n\t\t}\n\t}\n\telse\n\t{\t\n\t\trtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF_8814A);\n\t\t\n\t\tif(bWrite == _TRUE){\n\t\t\t// Disable LDO 2.5V after read/write action\n\t\t\ttempval = rtw_read8(pAdapter, EFUSE_TEST+3);\n\t\t\trtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F));\n\t\t}\n\t}\t\n}\n\nstatic VOID\nrtl8814_EfusePowerSwitch(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tbWrite,\n\tIN\tu8\t\tPwrState)\n{\n\thal_EfusePowerSwitch8814A(pAdapter, bWrite, PwrState);\t\n}\n\nstatic VOID\nhal_EfuseReadEFuse8814A(\n\tPADAPTER\t\tAdapter,\n\tu16\t\t\t_offset,\n\tu16 \t\t\t_size_byte,\n\tu8      \t\t*pbuf,\n\tIN\tBOOLEAN\tbPseudoTest\n\t)\n{\n\tu8\t*efuseTbl = NULL;\n\tu16\teFuse_Addr = 0;\n\tu8\toffset=0, wden=0;\n\tu16\ti, j;\n\tu16\t**eFuseWord = NULL;\n\tu16\tefuse_utilized = 0;\n\tu8\tefuse_usage = 0;\n\tu8\toffset_2_0=0;\n\tu8\tefuseHeader=0, efuseExtHdr=0, efuseData=0;\n\n\t//\n\t// Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10.\n\t//\n\tif((_offset + _size_byte)>EFUSE_MAP_LEN_8814A)\n\t{// total E-Fuse table is 512bytes\n\t\tDBG_8192C(\"Hal_EfuseReadEFuse8814A(): Invalid offset(%#x) with read bytes(%#x)!!\\n\", _offset, _size_byte);\n\t\tgoto exit;\n\t}\n\n\tefuseTbl = (u8*)rtw_zmalloc(EFUSE_MAP_LEN_8814A);\n\tif(efuseTbl == NULL)\n\t{\n\t\tDBG_871X(\"%s: alloc efuseTbl fail!\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\n\teFuseWord= (u16 **)rtw_malloc2d(EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, 2);\n\tif(eFuseWord == NULL)\n\t{\n\t\tDBG_871X(\"%s: alloc eFuseWord fail!\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\n\t// 0. Refresh efuse init map as all oxFF.\n\tfor (i = 0; i < EFUSE_MAX_SECTION_8814A; i++)\n\t\tfor (j = 0; j < EFUSE_MAX_WORD_UNIT_8814A; j++)\n\t\t\teFuseWord[i][j] = 0xFFFF;\n\n\t//\n\t// 1. Read the first byte to check if efuse is empty!!!\n\t// \n\t//\n\tefuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);\t\n\n\tif(efuseHeader != 0xFF)\n\t{\n\t\tefuse_utilized++;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"EFUSE is empty\\n\");\n\t\tefuse_utilized = 0;\n\t\tgoto exit;\n\t}\n\t/* RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\\n\", efuse_utilized)); */\n\n\t//\n\t// 2. Read real efuse content. Filter PG header and every section data.\n\t//\n\twhile((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr))\n\t{\n\t\t//RTPRINT(FEEPROM, EFUSE_READ_ALL, (\"efuse_Addr-%d efuse_data=%x\\n\", eFuse_Addr-1, *rtemp8));\n\t\n\t\t// Check PG header for section num.\n\t\tif(EXT_HEADER(efuseHeader))\t\t//extended header\n\t\t{\n\t\t\toffset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader);\n\t\t\t//RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"extended header offset_2_0=%X\\n\", offset_2_0));\n\n\t\t\tefuse_OneByteRead(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest);\t\n\n\t\t\t//RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"efuse[%X]=%X\\n\", eFuse_Addr-1, efuseExtHdr));\n\n\t\t\tif(efuseExtHdr != 0xff)\n\t\t\t{\n\t\t\t\tefuse_utilized++;\n\t\t\t\tif(ALL_WORDS_DISABLED(efuseExtHdr))\n\t\t\t\t{\n\t\t\t\t\tefuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest);\n\t\t\t\t\tif(efuseHeader != 0xff)\n\t\t\t\t\t{\n\t\t\t\t\t\tefuse_utilized++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\toffset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0;\n\t\t\t\t\twden = (efuseExtHdr & 0x0F);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"Error condition, extended = 0xff\\n\");\n\t\t\t\t// We should handle this condition.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\toffset = ((efuseHeader >> 4) & 0x0f);\n\t\t\twden = (efuseHeader & 0x0f);\n\t\t}\n\t\t\n\t\tif(offset < EFUSE_MAX_SECTION_8814A)\n\t\t{\n\t\t\t// Get word enable value from PG header\n\t\t\t//RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"Offset-%X Worden=%X\\n\", offset, wden));\n\n\t\t\tfor(i=0; i<EFUSE_MAX_WORD_UNIT_8814A; i++)\n\t\t\t{\n\t\t\t\t// Check word enable condition in the section\t\t\t\t\n\t\t\t\tif(!(wden & (0x01<<i)))\n\t\t\t\t{\n\t\t\t\t\tefuse_OneByteRead(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);\n\t\t\t\t\t//RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"efuse[%X]=%X\\n\", eFuse_Addr-1, efuseData));\n\t\t\t\t\tefuse_utilized++;\n\t\t\t\t\teFuseWord[offset][i] = (efuseData & 0xff);\n\n\t\t\t\t\tif(!AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tefuse_OneByteRead(Adapter, eFuse_Addr++, &efuseData, bPseudoTest);\n\t\t\t\t\t//RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"efuse[%X]=%X\\n\", eFuse_Addr-1, efuseData));\n\t\t\t\t\tefuse_utilized++;\n\t\t\t\t\teFuseWord[offset][i] |= (((u16)efuseData << 8) & 0xff00);\n\n\t\t\t\t\tif(!AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr)) \n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse{//deal with error offset,skip error data\t\t\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"invalid offset:0x%02x \\n\",offset);\n\t\t\tfor(i=0; i<EFUSE_MAX_WORD_UNIT_8814A; i++){\n\t\t\t\t// Check word enable condition in the section\t\t\t\t\n\t\t\t\tif(!(wden & 0x01)){\n\t\t\t\t\teFuse_Addr++;\n\t\t\t\t\tefuse_utilized++;\n\t\t\t\t\tif(!AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr)) \n\t\t\t\t\t\tbreak;\n\t\t\t\t\teFuse_Addr++;\n\t\t\t\t\tefuse_utilized++;\n\t\t\t\t\tif(!AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr)) \n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Read next PG header\n\t\tefuse_OneByteRead(Adapter, eFuse_Addr, &efuseHeader, bPseudoTest);\n\t\t//RTPRINT(FEEPROM, EFUSE_READ_ALL, (\"Addr=%d rtemp 0x%x\\n\", eFuse_Addr, *rtemp8));\n\t\t\n\t\tif(efuseHeader != 0xFF)\n\t\t{\n\t\t\teFuse_Addr++;\n\t\t\tefuse_utilized++;\n\t\t}\n\n\t}\n\n\t//\n\t// 3. Collect 16 sections and 4 word unit into Efuse map.\n\t//\n\tfor(i=0; i<EFUSE_MAX_SECTION_8814A; i++)\n\t{\n\t\tfor(j=0; j<EFUSE_MAX_WORD_UNIT_8814A; j++)\n\t\t{\n\t\t\tefuseTbl[(i*8)+(j*2)]=(eFuseWord[i][j] & 0xff);\n\t\t\tefuseTbl[(i*8)+((j*2)+1)]=((eFuseWord[i][j] >> 8) & 0xff);\n\t\t}\n\t}\n\n\t/* RT_DISP(FEEPROM, EFUSE_READ_ALL, (\"Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\\n\", efuse_utilized)); */\n\n\t//\n\t// 4. Copy from Efuse map to output pointer memory!!!\n\t//\n\tfor(i=0; i<_size_byte; i++)\n\t{\t\t\n\t\tpbuf[i] = efuseTbl[_offset+i];\n\t}\n\n\t//\n\t// 5. Calculate Efuse utilization.\n\t//\n\tefuse_usage = (u1Byte)((eFuse_Addr*100)/EFUSE_REAL_CONTENT_LEN_8814A);\n\trtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&eFuse_Addr);\n\nexit:\n\tif(efuseTbl)\n\t\trtw_mfree(efuseTbl, EFUSE_MAP_LEN_8814A);\n\n\tif(eFuseWord)\n\t\trtw_mfree2d((void *)eFuseWord, EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, sizeof(u16));\n}\n\nstatic VOID\nrtl8814_ReadEFuse(\n\tPADAPTER\tAdapter,\n\tu8\t\tefuseType,\n\tu16\t\t_offset,\n\tu16 \t\t_size_byte,\n\tu8      \t*pbuf,\n\tIN\tBOOLEAN\tbPseudoTest\n\t)\n{\n\thal_EfuseReadEFuse8814A(Adapter, _offset, _size_byte, pbuf, bPseudoTest);\n}\n\n//Do not support BT\nVOID\nhal_EFUSEGetEfuseDefinition8814A(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu8\t\tefuseType,\n\tIN\t\tu8\t\ttype,\n\tOUT\t\tPVOID\t\tpOut\n\t)\n{\n\tswitch(type)\n\t{\n\t\tcase TYPE_EFUSE_MAX_SECTION:\n\t\t\t{\n\t\t\t\tu8*\tpMax_section;\n\t\t\t\tpMax_section = (u8*)pOut;\n\t\t\t\t*pMax_section = EFUSE_MAX_SECTION_8814A;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_EFUSE_REAL_CONTENT_LEN:\n\t\t\t{\n\t\t\t\tu16* pu2Tmp;\n\t\t\t\tpu2Tmp = (u16*)pOut;\n\t\t\t\t*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_EFUSE_CONTENT_LEN_BANK:\n\t\t\t{\n\t\t\t\tu16* pu2Tmp;\n\t\t\t\tpu2Tmp = (u16*)pOut;\n\t\t\t\t*pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_AVAILABLE_EFUSE_BYTES_BANK:\n\t\t\t{\n\t\t\t\tu16* pu2Tmp;\n\t\t\t\tpu2Tmp = (u16*)pOut;\n\t\t\t\t*pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_AVAILABLE_EFUSE_BYTES_TOTAL:\n\t\t\t{\n\t\t\t\tu16* pu2Tmp;\n\t\t\t\tpu2Tmp = (u16*)pOut;\n\t\t\t\t*pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_EFUSE_MAP_LEN:\n\t\t\t{\n\t\t\t\tu16* pu2Tmp;\n\t\t\t\tpu2Tmp = (u16*)pOut;\n\t\t\t\t*pu2Tmp = (u16)EFUSE_MAP_LEN_8814A;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_EFUSE_PROTECT_BYTES_BANK:\n\t\t\t{\n\t\t\t\tu8* pu1Tmp;\n\t\t\t\tpu1Tmp = (u8*)pOut;\n\t\t\t\t*pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t{\n\t\t\t\tu8* pu1Tmp;\n\t\t\t\tpu1Tmp = (u8*)pOut;\n\t\t\t\t*pu1Tmp = 0;\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nstatic VOID\nrtl8814_EFUSE_GetEfuseDefinition(\n\tIN\t\tPADAPTER\tpAdapter,\n\tIN\t\tu8\t\tefuseType,\n\tIN\t\tu8\t\ttype,\n\tOUT\t\tvoid\t\t*pOut,\n\tIN\t\tBOOLEAN\t\tbPseudoTest\n\t)\n{\n\t\thal_EFUSEGetEfuseDefinition8814A(pAdapter, efuseType, type, pOut);\n}\n\nstatic u8\nhal_EfuseWordEnableDataWrite8814A(\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\tIN\tu16\t\tefuse_addr,\n\t\t\t\t\t\t\tIN\tu8\t\tword_en,\n\t\t\t\t\t\t\tIN\tu8\t\t*data,\n\t\t\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu16 readbackAddr = 0;\n\tu16 start_addr = efuse_addr;\n\tu8  badworden = 0x0F;\n\tu8  readbackData[PGPKT_DATA_SIZE]; \n\n\t_rtw_memset((PVOID)readbackData, 0xff, PGPKT_DATA_SIZE);\n\t\n\tDBG_871X(\"word_en = %x efuse_addr=%x\\n\", word_en, efuse_addr);\n\n\tif ( ! (word_en&BIT0))\n\t{\n\t\treadbackAddr = start_addr;\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[0], bPseudoTest);\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[1], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor\n\t\t\n\t\tefuse_OneByteRead(pAdapter,readbackAddr, &readbackData[0], bPseudoTest);\n\t\tefuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[1], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor\n\t\t\n\t\tif((data[0]!=readbackData[0])||(data[1]!=readbackData[1])){\n\t\t\tbadworden &= (~BIT0);\n\t\t}\n\t}\n\tif ( ! (word_en&BIT1))\n\t{\n\t\treadbackAddr = start_addr;\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[2], bPseudoTest);\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[3], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor\n\n\t\tefuse_OneByteRead(pAdapter,readbackAddr    , &readbackData[2], bPseudoTest);\n\t\tefuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[3], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor\n\n\t\tif((data[2]!=readbackData[2])||(data[3]!=readbackData[3])){\n\t\t\tbadworden &=( ~BIT1);\n\t\t}\n\t}\n\tif ( ! (word_en&BIT2))\n\t{\n\t\treadbackAddr = start_addr;\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[4], bPseudoTest);\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[5], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor\n\n\t\tefuse_OneByteRead(pAdapter,readbackAddr, &readbackData[4], bPseudoTest);\t\t\t\t\t\t\t\n\t\tefuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[5], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor\n\n\t\tif((data[4]!=readbackData[4])||(data[5]!=readbackData[5])){\n\t\t\tbadworden &=( ~BIT2);\n\t\t}\n\t}\n\tif ( ! (word_en&BIT3))\n\t{\n\t\treadbackAddr = start_addr;\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[6], bPseudoTest);\n\t\tefuse_OneByteWrite(pAdapter,start_addr++, data[7], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor\n\n\t\tefuse_OneByteRead(pAdapter,readbackAddr, &readbackData[6], bPseudoTest);\n\t\tefuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[7], bPseudoTest);\n\n\t\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor\n\n\t\tif((data[6]!=readbackData[6])||(data[7]!=readbackData[7])){\n\t\t\tbadworden &=( ~BIT3);\n\t\t}\n\t}\n\treturn badworden;\n}\n\nstatic u8\nrtl8814_Efuse_WordEnableDataWrite(\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\tIN\tu16\t\tefuse_addr,\n\t\t\t\t\t\t\tIN\tu8\t\tword_en,\n\t\t\t\t\t\t\tIN\tu8\t\t*data,\n\t\t\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu8\tret=0;\n\n\tret = hal_EfuseWordEnableDataWrite8814A(pAdapter, efuse_addr, word_en, data, bPseudoTest);\n\n\treturn ret;\n}\n\n\nstatic u16 hal_EfuseGetCurrentSize_8814A( PADAPTER\tpAdapter, BOOLEAN\tbPseudoTest)\n{\n\tint\t\t\tbContinual = _TRUE;\n\n\tu16\t\t\tefuse_addr = 0;\n\tu8\t\t\thoffset=0, hworden=0;\t\n\tu8\t\t\tefuse_data, word_cnts=0;\n\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPEFUSE_HAL\t\tpEfuseHal = &(pHalData->EfuseHal);\n\n\tDBG_871X(\"=======> %s() \\n\", __func__);\n\n\tif(bPseudoTest)\n\t{\n\t\tefuse_addr = (u16)(fakeEfuseUsedBytes);\n\t}\n\telse\n\t{\n\t\trtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr);\n\t}\n\t//RTPRINT(FEEPROM, EFUSE_PG, (\"hal_EfuseGetCurrentSize_8723A(), start_efuse_addr = %d\\n\", efuse_addr));\n\n\twhile ( bContinual &&\n\t\t\tefuse_OneByteRead(pAdapter, efuse_addr , &efuse_data, bPseudoTest) &&\n\t\t\t(efuse_addr  < EFUSE_REAL_CONTENT_LEN_8814A))\n\t{\n\t\tif (efuse_data != 0xFF)\n\t\t{\n\t\t\tif ((efuse_data&0x1F) == 0x0F)\t\t//extended header\n\t\t\t{\t\t\t\n\t\t\t\thoffset = efuse_data;\n\t\t\t\tefuse_addr++;\n\t\t\t\tefuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest);\n\t\t\t\tif((efuse_data & 0x0F) == 0x0F)\n\t\t\t\t{\n\t\t\t\t\tefuse_addr++;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\thoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);\n\t\t\t\t\thworden = efuse_data & 0x0F;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thoffset = (efuse_data>>4) & 0x0F;\n\t\t\t\thworden =  efuse_data & 0x0F;\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\tword_cnts = Efuse_CalculateWordCnts(hworden);\n\t\t\t//read next header\n\t\t\tefuse_addr = efuse_addr + (word_cnts*2)+1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbContinual = _FALSE ;\n\t\t}\n\t}\n\n\tif(bPseudoTest)\n\t{\n\t\tfakeEfuseUsedBytes = efuse_addr;\n\t\tpEfuseHal->fakeEfuseUsedBytes = efuse_addr;\n\t\tDBG_871X (\"%s(), return %d \\n\", __func__, pEfuseHal->fakeEfuseUsedBytes );\n\t}\n\telse\n\t{\n\t\tpEfuseHal->EfuseUsedBytes = efuse_addr;\n\t\tpEfuseHal->EfuseUsedPercentage = (u1Byte)((pEfuseHal->EfuseUsedBytes*100)/pEfuseHal->PhysicalLen_WiFi);\t\n\t\trtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr);\n\t\trtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_USAGE, (u8 *)&(pEfuseHal->EfuseUsedPercentage));\n\t\tDBG_871X(\"%s(), return %d\\n\", __func__, efuse_addr);\n\t}\n\n\treturn efuse_addr;\n\t\n}\n\nstatic u16\nrtl8814_EfuseGetCurrentSize(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\t\tefuseType,\n\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu16\tret=0;\n\n\tret = hal_EfuseGetCurrentSize_8814A(pAdapter, bPseudoTest);\n\n\treturn ret;\n}\n\n\nstatic int\nhal_EfusePgPacketRead_8814A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\t\toffset,\n\tIN\tu8\t\t\t*data,\n\tIN\tBOOLEAN\t\tbPseudoTest)\n{\t\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPEFUSE_HAL\t\tpEfuseHal = &(pHalData->EfuseHal);\n\tu8 ReadState = PG_STATE_HEADER;\t\n\t\n\tint bContinual = _TRUE;\n\tint bDataEmpty = _TRUE ;\t\n\n\tu8 efuse_data,word_cnts=0;\n\tu16 efuse_addr = 0;\n\tu8 hoffset=0,hworden=0;\t\n\tu8 tmpidx=0;\n\tu8 tmpdata[8];\n\tu8 tmp_header = 0;\n\t\n\tif(data==NULL)\treturn _FALSE;\n\tif(offset>=EFUSE_MAX_SECTION_JAGUAR)\t\treturn _FALSE;\t\n\t\n\t_rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);\n\t_rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE);\n\t\n\t//\n\t// <Roger_TODO> Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP.\n\t// Skip dummy parts to prevent unexpected data read from Efuse.\n\t// By pass right now. 2009.02.19.\n\t//\n\twhile(bContinual && (efuse_addr  < pEfuseHal->PhysicalLen_WiFi) )\n\t{\t\t\t\n\t\t//-------  Header Read -------------\n\t\tif(ReadState & PG_STATE_HEADER)\n\t\t{\n\t\t\tif(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF))\n\t\t\t{\n\t\t\t\tif(ALL_WORDS_DISABLED(efuse_data))\n\t\t\t\t{\n\t\t\t\t\ttmp_header = efuse_data;\n\t\t\t\t\tefuse_addr++;\n\t\t\t\t\tefuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest);\n\t\t\t\t\tif((efuse_data & 0x0F) != 0x0F)\n\t\t\t\t\t{\n\t\t\t\t\t\thoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);\n\t\t\t\t\t\thworden = efuse_data & 0x0F;\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tefuse_addr++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\t\n\t\t\t\t{\n\t\t\t\t\thoffset = (efuse_data>>4) & 0x0F;\n\t\t\t\t\thworden =  efuse_data & 0x0F;\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tword_cnts = Efuse_CalculateWordCnts(hworden);\n\t\t\t\tbDataEmpty = _TRUE ;\n\n\t\t\t\tif(hoffset==offset){\n\t\t\t\t\tfor(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){\n\t\t\t\t\t\tif(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){\n\t\t\t\t\t\t\ttmpdata[tmpidx] = efuse_data;\n\t\t\t\t\t\t\tif(efuse_data!=0xff){\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tbDataEmpty = _FALSE;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tif(bDataEmpty==_FALSE){\n\t\t\t\t\t\tReadState = PG_STATE_DATA;\t\t\t\t\t\t\t\n\t\t\t\t\t}else{//read next header\t\t\t\t\t\t\t\n\t\t\t\t\t\tefuse_addr = efuse_addr + (word_cnts*2)+1;\n\t\t\t\t\t\tReadState = PG_STATE_HEADER; \n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse{//read next header \n\t\t\t\t\tefuse_addr = efuse_addr + (word_cnts*2)+1;\n\t\t\t\t\tReadState = PG_STATE_HEADER; \n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse{\n\t\t\t\tbContinual = _FALSE ;\n\t\t\t}\n\t\t}\t\t\n\t\t//-------  Data section Read -------------\n\t\telse if(ReadState & PG_STATE_DATA)\n\t\t{\n\t\t\tefuse_WordEnableDataRead(hworden,tmpdata,data);\n\t\t\tefuse_addr = efuse_addr + (word_cnts*2)+1;\n\t\t\tReadState = PG_STATE_HEADER; \n\t\t}\n\t\t\n\t}\t\t\t\n\t\n\tif( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff)  && (data[3]==0xff) &&\n\t\t(data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff)  && (data[7]==0xff))\n\t\treturn _FALSE;\n\telse\n\t\treturn _TRUE;\n}\n\nstatic int\nrtl8814_Efuse_PgPacketRead(\tIN\tPADAPTER\tpAdapter,\n\t\t\t\t\tIN\tu8\t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\t*data,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tint\tret=0;\n\n\tret = hal_EfusePgPacketRead_8814A(pAdapter, offset, data, bPseudoTest);\n\n\treturn ret;\n}\n\nBOOLEAN\nefuse_PgPacketCheck(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tefuseType,\n\tIN\tBOOLEAN\t\tbPseudoTest\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\n\tif (Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A))\n\t{\n\t\tDBG_871X(\"%s()error: %x >= %x\\n\", __func__, Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest), (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A));\n\t\treturn _FALSE;\n\t}\n\n\treturn _TRUE;\n}\n\nVOID\nefuse_PgPacketConstruct(\n    IN\t    u8 \t\t\toffset,\n    IN\t    u8\t\t\tword_en,\n    IN\t    u8*\t\t\tpData,\n    IN OUT\tPPGPKT_STRUCT\tpTargetPkt\n\t)\n{\n\t_rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8);\n\tpTargetPkt->offset = offset;\n\tpTargetPkt->word_en= word_en;\n\tefuse_WordEnableDataRead(word_en, pData, pTargetPkt->data);\n\tpTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en);\n\n\tDBG_871X(\"efuse_PgPacketConstruct(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\\n\", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts);\n}\n\n\nu16\nefuse_PgPacketExceptionHandle(\n\t\t\t\t\tIN\tPADAPTER\t\tpAdapter,\n\t\t\t\t\tIN\tu16\t\t\tErrOffset\n\t\t\t\t\t)\n{\n\tDBG_871X(\"===> efuse_PgPacketExceptionHandle(), ErrOffset = 0x%X\\n\", ErrOffset);\n\n\t// ErrOffset is the offset of bad (extension) header.\n\t//if (IS_HARDWARE_TYPE_8812AU(pAdapter)) \n\t\t//ErrOffset = Hal_EfusePgPacketExceptionHandle_8812A(pAdapter, ErrOffset);\n\n\tDBG_871X(\"<=== efuse_PgPacketExceptionHandle(), recovered! Jump to Offset = 0x%X\\n\", ErrOffset);\n\t\n\treturn ErrOffset; \n}\n\n\nBOOLEAN\nhal_EfuseCheckIfDatafollowed(\n\tIN\t\tPADAPTER\t\tpAdapter,\n\tIN\t\tu8\t\t\tword_cnts,\n\tIN\t\tu16\t\t\tstartAddr,\n\tIN\t\tBOOLEAN\t\t\tbPseudoTest\n\t)\n{\n\tBOOLEAN\t\tbRet=FALSE;\n\tu8\t\ti, efuse_data;\n\t\n\tfor(i=0; i<(word_cnts*2) ; i++)\n\t{\n\t\tif(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF))\n\t\t\tbRet = TRUE;\n\t}\n\n\treturn bRet;\n}\n\nBOOLEAN\nhal_EfuseWordEnMatched(\n\tIN\tPPGPKT_STRUCT\tpTargetPkt,\n\tIN\tPPGPKT_STRUCT\tpCurPkt,\n\tIN\tu8*\t\t\tpWden\n)\n{\n\tu8\tmatch_word_en = 0x0F;\t// default all words are disabled\n\n\t// check if the same words are enabled both target and current PG packet\n\tif( ((pTargetPkt->word_en & BIT0) == 0) &&\n\t\t((pCurPkt->word_en & BIT0) == 0) )\n\t{\n\t\tmatch_word_en &= ~BIT0;\t\t\t\t// enable word 0\n\t}\n\tif( ((pTargetPkt->word_en & BIT1) == 0) &&\n\t\t((pCurPkt->word_en & BIT1) == 0) )\n\t{\n\t\tmatch_word_en &= ~BIT1;\t\t\t\t// enable word 1\n\t}\n\tif( ((pTargetPkt->word_en & BIT2) == 0) &&\n\t\t((pCurPkt->word_en & BIT2) == 0) )\n\t{\n\t\tmatch_word_en &= ~BIT2;\t\t\t\t// enable word 2\n\t}\n\tif( ((pTargetPkt->word_en & BIT3) == 0) &&\n\t\t((pCurPkt->word_en & BIT3) == 0) )\n\t{\n\t\tmatch_word_en &= ~BIT3;\t\t\t\t// enable word 3\n\t}\n\n\t*pWden = match_word_en;\n\n\tif(match_word_en != 0xf)\n\t\treturn TRUE;\n\telse\n\t\treturn FALSE;\n}\n\n\nBOOLEAN\nefuse_PgPacketPartialWrite(\n    IN\t    PADAPTER\t\tpAdapter,\n    IN\t    u8\t\t\tefuseType,\n    IN OUT\tu16*\t\t\tpAddr,\n    IN\t    PPGPKT_STRUCT\tpTargetPkt,\n    IN\t    BOOLEAN\t\t\tbPseudoTest\n    )\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPEFUSE_HAL\t\tpEfuseHal=&(pHalData->EfuseHal);\n\tBOOLEAN\t\t\tbRet=_FALSE;\n\tu8\t\t\ti, efuse_data=0, cur_header=0;\n\tu8\t\t\tmatched_wden=0, badworden=0;\n\tu16\t\t\tstartAddr=0;\n\tPGPKT_STRUCT\tcurPkt;\n\tu16 \t\t\tmax_sec_num = (efuseType == EFUSE_WIFI) ? pEfuseHal->MaxSecNum_WiFi : pEfuseHal->MaxSecNum_BT;\n\tu16 \t\t\tefuse_max = pEfuseHal->BankSize;\n\tu16 \t\t\tefuse_max_available_len = \n\t\t\t\t\t(efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT;\n\n\tif (bPseudoTest) {\n\t\tpEfuseHal->fakeEfuseBank = (efuseType == EFUSE_WIFI) ? 0 : pEfuseHal->fakeEfuseBank;\n\t\tEfuse_GetCurrentSize(pAdapter, efuseType, _TRUE);\n\t}\n\n\t//EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &efuse_max_available_len, bPseudoTest);\n\t//EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_CONTENT_LEN_BANK, &efuse_max, bPseudoTest);\n\t\n\tif(efuseType == EFUSE_WIFI)\n\t{\n\t\tif(bPseudoTest)\n\t\t{\n#ifdef HAL_EFUSE_MEMORY\n\t\t\t\t\t\tstartAddr = (u16)pEfuseHal->fakeEfuseUsedBytes;\n#else\n\t\t\t\t\t\tstartAddr = (u16)fakeEfuseUsedBytes;\n#endif\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8*)&startAddr);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif(bPseudoTest)\n\t\t{\n#ifdef HAL_EFUSE_MEMORY\n\t\t\t\t\t\tstartAddr = (u16)pEfuseHal->fakeBTEfuseUsedBytes;\n#else\n\t\t\t\t\t\tstartAddr = (u16)fakeBTEfuseUsedBytes;\n#endif\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\trtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BT_BYTES, (u8*)&startAddr);\n\t\t}\n\t}\n\t\n\tstartAddr %= efuse_max;\n\tDBG_8192C(\"%s: startAddr=%#X\\n\", __FUNCTION__, startAddr);\n\tDBG_871X(\"efuse_PgPacketPartialWrite(), startAddr = 0x%X\\n\", startAddr);\n\n\twhile(1)\n\t{\n\t\tif(startAddr >= efuse_max_available_len) \n\t\t{\n\t\t\tbRet = _FALSE;\n\t\t\tDBG_871X(\"startAddr(%d) >= efuse_max_available_len(%d)\\n\", \n\t\t\t\tstartAddr, efuse_max_available_len);\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif (efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF))\n\t\t{\t\n\t\t\tif(EXT_HEADER(efuse_data))\n\t\t\t{\n\t\t\t\tcur_header = efuse_data;\n\t\t\t\tstartAddr++;\n\t\t\t\tefuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest);\n\t\t\t\tif (ALL_WORDS_DISABLED(efuse_data))\n\t\t\t\t{\n\t\t\t\t\tu16 recoveredAddr = startAddr;\t\t\t\t\t\n\t\t\t\t\trecoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr-1);\n\n\t\t\t\t\tif (recoveredAddr == (startAddr-1)) {\n\t\t\t\t\t\tDBG_871X(\"Error! All words disabled and the recovery failed, (Addr, Data) = (0x%X, 0x%X)\\n\", \n\t\t\t\t\t\t\t\t\t\t\t\tstartAddr, efuse_data);\n\t\t\t\t\t\tpAdapter->LastError = ERR_INVALID_DATA;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartAddr = recoveredAddr;\n\t\t\t\t\t\tDBG_871X(\"Bad extension header but recovered => Keep going.\\n\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcurPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1);\n\t\t\t\t\tcurPkt.word_en = efuse_data & 0x0F;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (ALL_WORDS_DISABLED(efuse_data)) {\n\t\t\t\t\tu16 recoveredAddr = startAddr;\n\t\t\t\t\trecoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr);\n\t\t\t\t\tif (recoveredAddr != startAddr) {\n\t\t\t\t\t\tefuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest);\n\t\t\t\t\t\tDBG_871X(\"Bad header but recovered => Read header again.\\n\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcur_header  =  efuse_data;\t\t\t\t\t\n\t\t\t\tcurPkt.offset = (cur_header>>4) & 0x0F;\n\t\t\t\tcurPkt.word_en = cur_header & 0x0F;\n\t\t\t}\n\n\t\t\tif (curPkt.offset > max_sec_num) {\n\t\t\t\tpAdapter->LastError = ERR_OUT_OF_RANGE;\n\t\t\t\tpEfuseHal->Status = ERR_OUT_OF_RANGE;\n\t\t\t\tbRet = _FALSE;\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tcurPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en);\n\t\t\t// if same header is found but no data followed\n\t\t\t// write some part of data followed by the header.\n\t\t\tif( (curPkt.offset == pTargetPkt->offset) && \n\t\t\t\t(!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) &&\n\t\t\t\thal_EfuseWordEnMatched(pTargetPkt, &curPkt, &matched_wden) )\n\t\t\t{\n\t\t\t\tDBG_871X(\"Need to partial write data by the previous wrote header\\n\");\n\t\t\t\t//RT_ASSERT(_FALSE, (\"Error, Need to partial write data by the previous wrote header!!\\n\"));\n\t\t\t\t// Here to write partial data\n\t\t\t\tbadworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest);\n\t\t\t\tif(badworden != 0x0F)\n\t\t\t\t{\n\t\t\t\t\tu32 PgWriteSuccess=0;\n\t\t\t\t\t// if write fail on some words, write these bad words again\n\n\t\t\t\t\tPgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);\n\t\t\t\n\t\t\t\t\tif(!PgWriteSuccess)\n\t\t\t\t\t{\n\t\t\t\t\t\tbRet = _FALSE;\t// write fail, return\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// partial write ok, update the target packet for later use\t\t\n\t\t\t\tfor(i=0; i<4; i++)\n\t\t\t\t{\n\t\t\t\t\tif((matched_wden & (0x1<<i)) == 0)\t// this word has been written\n\t\t\t\t\t{\n\t\t\t\t\t\tpTargetPkt->word_en |= (0x1<<i);\t// disable the word\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en);\n\t\t\t}\n\t\t\t// read from next header\n\t\t\tstartAddr = startAddr + (curPkt.word_cnts*2) +1;\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// not used header, 0xff\n\t\t\t*pAddr = startAddr;\n\t\t\tDBG_871X(\"Started from unused header offset=%d\\n\", startAddr);\n\t\t\tbRet = _TRUE;\n\t\t\tbreak;\n\t\t}\n\t}\t\n\treturn bRet;\n}\n\n\nBOOLEAN\nhal_EfuseFixHeaderProcess(\n\tIN\t\tPADAPTER\t\t\tpAdapter,\n\tIN\t\tu8\t\t\t\tefuseType,\n\tIN\t\tPPGPKT_STRUCT\t\tpFixPkt,\n\tIN\t\tu16*\t\t\t\tpAddr,\n\tIN\t\tBOOLEAN\t\t\t\tbPseudoTest\n)\n{\n\tu8\toriginaldata[8], badworden=0;\n\tu16\tefuse_addr=*pAddr;\n\tu32\tPgWriteSuccess=0;\n\t\n\t_rtw_memset((PVOID)originaldata, 0xff, 8);\n\t\t\t\t\t\n\tif(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest))\n\t{\t//check if data exist\n\t\tbadworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest);\n\n\t\tif(badworden != 0xf)\t// write fail\n\t\t{\n\t\t\tPgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest);\n\t\t\tif(!PgWriteSuccess)\n\t\t\t\treturn _FALSE;\n\t\t\telse\n\t\t\t\tefuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tefuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tefuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1;\n\t}\n\t*pAddr = efuse_addr;\n\treturn _TRUE;\n}\n\n\nBOOLEAN\nefuse_PgPacketWrite2ByteHeader(\n\tIN\t\t\tPADAPTER\t\tpAdapter,\n\tIN\t\t\tu8\t\t\tefuseType,\n\tIN OUT\t\tu16*\t\t\tpAddr,\n\tIN\t\t\tPPGPKT_STRUCT\tpTargetPkt,\n\tIN\t\t\tBOOLEAN\t\t\tbPseudoTest)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPEFUSE_HAL\t\tpEfuseHal = &(pHalData->EfuseHal);\n\tBOOLEAN\t\t\tbRet=_FALSE;\n\tu16\t\t\tefuse_addr=*pAddr;\n\tu8\t\t\tpg_header=0, tmp_header=0, pg_header_temp=0;\n\tu8\t\t\trepeatcnt=0;\n\tu16 \t\t\tefuse_max_available_len = \n\t\t\t\t\t(efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT;\n\n\tDBG_871X(\"Wirte 2byte header\\n\");\n\n\n\twhile(efuse_addr < efuse_max_available_len)\n\t{\n\t\tpg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F;\n\t\tDBG_871X(\"pg_header = 0x%x\\n\", pg_header);\n\t\tefuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);\n\t\tefuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);\n\n\t\twhile(tmp_header == 0xFF || pg_header != tmp_header)\n\t\t{\n\t\t\tif(repeatcnt++ > pEfuseHal->DataRetry)\n\t\t\t{\n\t\t\t\tDBG_871X(\"Repeat over limit for pg_header!!\\n\");\n\t\t\t\treturn _FALSE;\n\t\t\t}\n\n\t\t\tefuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);\n\t\t\tefuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);\n\t\t}\n\t\t\n\t\t//to write ext_header\n\t\tif(tmp_header == pg_header)\n\t\t{\n\t\t\tefuse_addr++;\n\t\t\tpg_header_temp = pg_header;\n\t\t\tpg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en;\n\n\t\t\tefuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);\n\t\t\tefuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);\n\n\t\t\twhile(tmp_header == 0xFF || pg_header != tmp_header)\n\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif(repeatcnt++ > pEfuseHal->DataRetry)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"Repeat over limit for ext_header!!\\n\");\n\t\t\t\t\treturn _FALSE;\n\t\t\t\t}\t\t\t\t\t\t\t\n\n\t\t\t\tefuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);\n\t\t\t\tefuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);\n\t\t\t}\n\n\t\t\tif((tmp_header & 0x0F) == 0x0F)\t//word_en PG fail\n\t\t\t{\n\t\t\t\tif(repeatcnt++ > pEfuseHal->DataRetry)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"Repeat over limit for word_en!!\\n\");\n\t\t\t\t\treturn _FALSE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tefuse_addr++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(pg_header != tmp_header)\t//offset PG fail\t\t\t\t\t\t\n\t\t\t{\n\t\t\t\tPGPKT_STRUCT\tfixPkt;\n\t\t\t\t//RT_ASSERT(_FALSE, (\"Error, efuse_PgPacketWrite2ByteHeader(), offset PG fail, need to cover the existed data!!\\n\"));\n\t\t\t\tDBG_871X(\"Error condition for offset PG fail, need to cover the existed data\\n\");\n\t\t\t\tfixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1);\n\t\t\t\tfixPkt.word_en = tmp_header & 0x0F;\t\t\t\t\t\n\t\t\t\tfixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en);\n\t\t\t\tif(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest))\n\t\t\t\t\treturn _FALSE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbRet = _TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse if ((tmp_header & 0x1F) == 0x0F)\t\t//wrong extended header\n\t\t{\n\t\t\tefuse_addr+=2;\n\t\t\tcontinue;\t\t\t\t\t\t\n\t\t}\n\t}\n\n\t*pAddr = efuse_addr;\n\treturn bRet;\n}\n\n\nBOOLEAN\nefuse_PgPacketWrite1ByteHeader(\n\tIN\t\t\tPADAPTER\t\tpAdapter, \n\tIN\t\t\tu8\t\t\tefuseType,\n\tIN OUT\t\tu16*\t\t\tpAddr,\n\tIN\t\t\tPPGPKT_STRUCT\tpTargetPkt,\n\tIN\t\t\tBOOLEAN\t\t\tbPseudoTest)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tPEFUSE_HAL\t\tpEfuseHal=&(pHalData->EfuseHal);\n\tBOOLEAN\t\t\tbRet=_FALSE;\n\tu8\t\t\tpg_header=0, tmp_header=0;\n\tu16\t\t\tefuse_addr=*pAddr;\n\tu8\t\t\trepeatcnt=0;\n\n\tDBG_871X(\"Wirte 1byte header\\n\");\n\tpg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en;\n\n\tif (IS_HARDWARE_TYPE_8723BE(pAdapter))\n\t\tefuse_OneByteWrite(pAdapter, 0x1FF, 00, _FALSE); // increase current\n\t\t\n\t\n\tefuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest);\n\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor\n\n\tefuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest);\n\n\tif (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) ||\n\t\tIS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter))\n\t\tPHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor\n\n\n\twhile(tmp_header == 0xFF || pg_header != tmp_header)\n\t{\n\t\tif(repeatcnt++ > pEfuseHal->HeaderRetry)\n\t\t{\n\t\t\tDBG_871X(\"retry %d times fail!!\\n\", repeatcnt);\n\t\t\treturn _FALSE;\n\t\t}\n\t\tefuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest);\n\t\tefuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest);\n\t\tDBG_871X(\"===> efuse_PgPacketWrite1ByteHeader: Keep %d-th retrying, tmp_header = 0x%X\\n\", repeatcnt, tmp_header);\n\t}\n\t\n\tif(pg_header == tmp_header)\n\t{\n\t\tbRet = _TRUE;\n\t}\n\telse\n\t{\n\t\tPGPKT_STRUCT\tfixPkt;\n\t\t//RT_ASSERT(_FALSE, (\"Error, efuse_PgPacketWrite1ByteHeader(), offset PG fail, need to cover the existed data!!\\n\"));\n\t\tDBG_871X(\" pg_header(0x%X) != tmp_header(0x%X)\\n\", pg_header, tmp_header);\n\t\tDBG_871X(\"Error condition for fixed PG packet, need to cover the existed data: (Addr, Data) = (0x%X, 0x%X)\\n\",\n\t\t\t                       efuse_addr, tmp_header);\n\t\tfixPkt.offset = (tmp_header>>4) & 0x0F;\n\t\tfixPkt.word_en = tmp_header & 0x0F;\t\t\t\t\t\n\t\tfixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en);\n\t\tif(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest))\n\t\t\treturn _FALSE;\n\t}\n\t\n\t*pAddr = efuse_addr;\n\treturn bRet;\n}\n\n\n\nBOOLEAN\nefuse_PgPacketWriteHeader(\n\tIN\t\t\tPADAPTER\t\tpAdapter, \n\tIN\t\t\tu8\t\t\tefuseType,\n\tIN OUT\t\tu16*\t\t\tpAddr,\n\tIN\t\t\tPPGPKT_STRUCT\tpTargetPkt,\n\tIN\t\t\tBOOLEAN\t\t\tbPseudoTest)\n{\n\tBOOLEAN\t\tbRet=_FALSE;\n\n\tif(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE)\n\t{\n\t\tbRet = efuse_PgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest);\n\t}\n\telse\n\t{\n\t\tbRet = efuse_PgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest);\n\t}\n\n\treturn bRet;\n}\n\nBOOLEAN\nefuse_PgPacketWriteData(\n\tIN\t\t\tPADAPTER\t\tpAdapter, \n\tIN\t\t\tu8\t\t\tefuseType,\n\tIN\t\t\tu16*\t\t\tpAddr,\n\tIN\t\t\tPPGPKT_STRUCT\tpTargetPkt,\n\tIN\t\t\tBOOLEAN\t\t\tbPseudoTest)\n{\n\tBOOLEAN\tbRet=_FALSE;\n\tu16\tefuse_addr=*pAddr;\n\tu8\tbadworden=0;\n\tu32\tPgWriteSuccess=0;\n\n\tbadworden = 0x0f;\n\tbadworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest);\n\tif(badworden == 0x0F)\n\t{ \n\t\tDBG_871X(\"efuse_PgPacketWriteData ok!!\\n\");\n\t\treturn _TRUE;\n\t}\n\telse\n\t{   // Reorganize other pg packet\n\t\t//RT_ASSERT(_FALSE, (\"Error, efuse_PgPacketWriteData(), wirte data fail!!\\n\"));\n\t\tDBG_871X(\"efuse_PgPacketWriteData Fail!!\\n\");\n\t\t\n\t\tPgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest);\n\t\tif(!PgWriteSuccess)\n\t\t\treturn _FALSE;\n\t\telse\n\t\t\treturn _TRUE;\n\t}\n\n\treturn bRet;\n}\n\n\nint\nhal_EfusePgPacketWrite_8814A(IN\tPADAPTER\tpAdapter,\n\t\t\t\t\tIN\tu8 \t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\tword_en,\n\t\t\t\t\tIN\tu8\t\t\t*pData,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tu8 efuseType = EFUSE_WIFI;\n\tPGPKT_STRUCT\ttargetPkt;\n\tu16\t\t\tstartAddr = 0;\n\t\n\tDBG_871X(\"===> efuse_PgPacketWrite[%s], offset: 0x%X\\n\", (efuseType == EFUSE_WIFI) ? \"WIFI\" : \"BT\", offset);\n\n\t//4 [1] Check if the remaining space is available to write. \n\tif(!efuse_PgPacketCheck(pAdapter, efuseType, bPseudoTest))\n\t{\n\t\tpAdapter->LastError = ERR_WRITE_PROTECT;\n\t\tDBG_871X(\"efuse_PgPacketCheck(), fail!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\t//4 [2] Construct a packet to write: (Data, Offset, and WordEnable)\n\tefuse_PgPacketConstruct(offset, word_en, pData, &targetPkt);\n\n\n\t//4 [3] Fix headers without data or fix bad headers, and then return the address where to get started.\n\tif(!efuse_PgPacketPartialWrite(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))\n\t{\n\t\tpAdapter->LastError = ERR_INVALID_DATA;\n\t\tDBG_871X(\"efuse_PgPacketPartialWrite(), fail!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\t//4 [4] Write the (extension) header.\n\tif(!efuse_PgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))\n\t{\n\t\tpAdapter->LastError = ERR_IO_FAILURE;\n\t\tDBG_871X(\"efuse_PgPacketWriteHeader(), fail!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\t//4 [5] Write the data.\n\tif(!efuse_PgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest))\n\t{\n\t\tpAdapter->LastError = ERR_IO_FAILURE;\n\t\tDBG_871X(\"efuse_PgPacketWriteData(), fail!!\\n\");\n\t\treturn _FALSE;\n\t}\n\n\tDBG_871X(\"<=== efuse_PgPacketWrite\\n\");\n\treturn _TRUE;\n}\n\nstatic int\nrtl8814_Efuse_PgPacketWrite(IN\tPADAPTER\tpAdapter,\n\t\t\t\t\tIN\tu8 \t\t\toffset,\n\t\t\t\t\tIN\tu8\t\t\tword_en,\n\t\t\t\t\tIN\tu8\t\t\t*data,\n\t\t\t\t\tIN\tBOOLEAN\t\tbPseudoTest)\n{\n\tint\tret;\n\n\tret = hal_EfusePgPacketWrite_8814A(pAdapter, offset, word_en, data, bPseudoTest);\n\n\treturn ret;\n}\n\nvoid InitRDGSetting8814A(PADAPTER padapter)\n{\n\trtw_write8(padapter, REG_RD_CTRL, 0xFF);\n\trtw_write16(padapter, REG_RD_NAV_NXT, 0x200);\n\trtw_write8(padapter, REG_RD_RESP_PKT_TH, 0x05);\n}\n\nvoid ReadRFType8814A(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\n#if DISABLE_BB_RF\n\tpHalData->rf_chip = RF_PSEUDO_11N;\n#else\n\tpHalData->rf_chip = RF_6052;\n#endif\n\n\t//if (pHalData->rf_type == RF_1T1R){\n\t//\tpHalData->bRFPathRxEnable[0] = _TRUE;\n\t//}\n\t//else {\t// Default unknow type is 2T2r\n\t//\tpHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE;\n\t//}\n\n\tif (IsSupported24G(padapter->registrypriv.wireless_mode) && \n\t\tIsSupported5G(padapter->registrypriv.wireless_mode))\n\t\tpHalData->BandSet = BAND_ON_BOTH;\n\telse if (IsSupported5G(padapter->registrypriv.wireless_mode))\n\t\tpHalData->BandSet = BAND_ON_5G;\n\telse\n\t\tpHalData->BandSet = BAND_ON_2_4G;\n\n\t//if(padapter->bInHctTest)\n\t//\tpHalData->BandSet = BAND_ON_2_4G;\n}\n\nvoid rtl8814_start_thread(PADAPTER padapter)\n{\n}\n\nvoid rtl8814_stop_thread(PADAPTER padapter)\n{\n}\n\nvoid hal_notch_filter_8814(_adapter *adapter, bool enable)\n{\n\tif (enable) {\n\t\tDBG_871X(\"Enable notch filter\\n\");\n\t\t//rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) | BIT1);\n\t} else {\n\t\tDBG_871X(\"Disable notch filter\\n\");\n\t\t//rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) & ~BIT1);\n\t}\n}\n\nu8\nGetEEPROMSize8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tu8\tsize = 0;\n\tu32\tcurRCR;\n\n\tcurRCR = rtw_read16(Adapter, REG_SYS_EEPROM_CTRL);\n\tsize = (curRCR & EEPROMSEL) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse.\n\t\n\tDBG_871X(\"EEPROM type is %s\\n\", size==4 ? \"E-FUSE\" : \"93C46\");\n\t//return size;\n\treturn 4; // <20120713, Kordan> The default value of HW is 6 ?!!\n}\n\n/*\nvoid CheckAutoloadState8812A(PADAPTER padapter)\n{\n\n\tu8 val8;\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\n\n\t// check system boot selection\n\tval8 = rtw_read8(padapter, REG_9346CR);\n\tpHalData->EepromOrEfuse = (val8 & BOOT_FROM_EEPROM) ? _TRUE : _FALSE;\n\tpHalData->bautoload_fail_flag = (val8 & EEPROM_EN) ? _FALSE : _TRUE;\n\n\tDBG_8192C(\"%s: 9346CR(%#x)=0x%02x, Boot from %s, Autoload %s!\\n\",\n\t\t\t__FUNCTION__, REG_9346CR, val8,\n\t\t\t(pHalData->EepromOrEfuse ? \"EEPROM\" : \"EFUSE\"),\n\t\t\t(pHalData->bautoload_fail_flag ? \"Fail\" : \"OK\"));\n}\n*/\n\nvoid InitPGData8814A(PADAPTER padapter)\n{\n\tu32 i;\n\tu16 val16;\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\n\tif (_FALSE == pHalData->bautoload_fail_flag)\n\t{\n\t\t// autoload OK.\n\t\tif (is_boot_from_eeprom(padapter))\n\t\t{\n\t\t\t// Read all Content from EEPROM or EFUSE.\n\t\t\t//for (i = 0; i < HWSET_MAX_SIZE_JAGUAR; i += 2)\n\t\t\t{\n\t\t\t\t//val16 = EF2Byte(ReadEEprom(pAdapter, (u16) (i>>1)));\n\t\t\t\t//*((u16*)(&PROMContent[i])) = val16;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Read EFUSE real map to shadow.\n\t\t\tEFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE);\n\t\t}\n\t}\n\telse\n\t{\n\t\t// update to default value 0xFF\n\t\tif (!is_boot_from_eeprom(padapter))\n\t\t\tEFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE);\n\t}\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n\tif (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {\n\t\tif (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS)\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"invalid phy efuse and read from file fail, will use driver default!!\\n\");\n\t}\n#endif\n}\n\nstatic void read_chip_version_8814a(PADAPTER Adapter)\n{\n\tu32\tvalue32;\n\tPHAL_DATA_TYPE\tpHalData;\n\tu8\tvdr;\n\n\tpHalData = GET_HAL_DATA(Adapter);\n\n\tvalue32 = rtw_read32(Adapter, REG_SYS_CFG);\n\tDBG_871X(\"%s SYS_CFG(0x%X)=0x%08x \\n\", __FUNCTION__, REG_SYS_CFG, value32);\n\n\tpHalData->VersionID.ICType = CHIP_8814A;\n\n\tpHalData->VersionID.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP);\n\n\tpHalData->VersionID.RFType = RF_TYPE_3T3R;\n\n\tif(Adapter->registrypriv.special_rf_path == 1)\n\t\tpHalData->VersionID.RFType = RF_TYPE_1T1R;\t//RF_1T1R;\n\t\n\tvdr = (value32 & EXT_VENDOR_ID) >> EXT_VENDOR_ID_SHIFT;\n\tif(vdr == 0x00)\n\t\tpHalData->VersionID.VendorType = CHIP_VENDOR_TSMC;\n\telse if(vdr == 0x01)\n\t\tpHalData->VersionID.VendorType = CHIP_VENDOR_SMIC;\n\telse if(vdr == 0x02)\n\t\tpHalData->VersionID.VendorType = CHIP_VENDOR_UMC;\t\n\n\tpHalData->VersionID.CUTVersion = (value32 & CHIP_VER_RTL_MASK)>>CHIP_VER_RTL_SHIFT; // IC version (CUT)\n\n\tpHalData->MultiFunc = RT_MULTI_FUNC_NONE;\n\n\trtw_hal_config_rftype(Adapter);\n\t\n#if 1\n\tdump_chip_info(pHalData->VersionID);\n#endif\n\n}\n\nVOID\nhal_PatchwithJaguar_8814(\n\tIN PADAPTER\t\t\t\tAdapter,\n\tIN RT_MEDIA_STATUS\t\tMediaStatus\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &(Adapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif(\t(MediaStatus == RT_MEDIA_CONNECT) && \n\t\t(pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP ))\n\t{\n\t\trtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x1);\n\t\trtw_write8(Adapter, REG_TCR+3, BIT2);\n\t}\n\telse\n\t{\n\t\trtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x3F);\n\t\trtw_write8(Adapter, REG_TCR+3, BIT0|BIT1|BIT2);\n\t}\n\n\n\t/*if(\t(MediaStatus == RT_MEDIA_CONNECT) && \n\t\t((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP) ||\n\t\t (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)))\n\t{\n\t\tpHalData->Reg837 |= BIT2;\n\t\trtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837);\n\t}\n\telse\n\t{\n\t\tpHalData->Reg837 &= (~BIT2);\n\t\trtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837);\n\t}*/\n}\n\nvoid UpdateHalRAMask8814A(PADAPTER padapter, u32 mac_id, u8 rssi_level)\n{\n\tu64\tmask,rate_bitmap, *dm_RA_Mask=NULL;\n\tu8\tshortGIrate = _FALSE, *dm_RteID=NULL;\n\tu8\targ[4] = {0};\n\tstruct sta_info\t*psta;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\tif (mac_id >= NUM_STA) //CAM_SIZE\n\t{\n\t\treturn;\n\t}\n\n\tpsta = pmlmeinfo->FW_sta_info[mac_id].psta;\n\tif(psta == NULL)\n\t{\n\t\treturn;\n\t}\n\n\tshortGIrate = query_ra_short_GI(psta);\n\n\tmask = psta->ra_mask;\n\n\trate_bitmap = 0xffffffff;\n\trate_bitmap = PhyDM_Get_Rate_Bitmap_Ex(&pHalData->odmpriv, mac_id, mask, rssi_level, dm_RA_Mask, dm_RteID);\n\n\tDBG_871X(\"%s => mac_id:%d, networkType:0x%02x, mask:0x%016llx\\n\\t ==> rssi_level:%d, rate_bitmap:0x%016llx, shortGIrate=%d\\n\",\n\t\t\t__FUNCTION__,mac_id,psta->wireless_mode,mask,rssi_level,rate_bitmap,shortGIrate);\n\n\tmask &= rate_bitmap;\n\n#ifdef CONFIG_BT_COEXIST\n    if (pHalData->EEPROMBluetoothCoexist == 1)\n    {\n\t\trate_bitmap = rtw_btcoex_GetRaMask(padapter);\n\t\tmask &= ~rate_bitmap;\n    }\n#endif // CONFIG_BT_COEXIST\n\n\targ[0] = mac_id;\n\targ[1] = psta->raid;\n\targ[2] = shortGIrate;\n\targ[3] = psta->init_rate;\n\n\trtl8814_set_raid_cmd(padapter, mask, arg);\n}\n\nstatic void init_hal_spec_8814a(_adapter *adapter)\n{\n\tstruct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);\n\n\thal_spec->macid_num = MACID_NUM_8814A;\n\thal_spec->sec_cam_ent_num = SEC_CAM_ENT_NUM_8814A;\n\thal_spec->sec_cap = SEC_CAP_CHK_BMC;\n\thal_spec->nss_num = NSS_NUM_8814A;\n\thal_spec->band_cap = BAND_CAP_8814A;\n\thal_spec->bw_cap = BW_CAP_8814A;\n\n\thal_spec->wl_func = 0\n\t\t\t\t\t\t| WL_FUNC_P2P\n\t\t\t\t\t\t| WL_FUNC_MIRACAST\n\t\t\t\t\t\t| WL_FUNC_TDLS\n\t\t\t\t\t\t;\n}\n\nvoid InitDefaultValue8814A(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tstruct pwrctrl_priv *pwrctrlpriv;\n\tu8 i;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tpwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\t// init default value\n\tpHalData->fw_ractrl = _FALSE;\t\t\n\tif (!pwrctrlpriv->bkeepfwalive)\n\t\tpHalData->LastHMEBoxNum = 0;\t\n\n\tinit_hal_spec_8814a(padapter);\n\n\t// init dm default value\n\tpHalData->bChnlBWInitialized = _FALSE;\n\tpHalData->bIQKInitialized = _FALSE;\n\tpHalData->odmpriv.RFCalibrateInfo.TM_Trigger = 0;//for IQK\n\tpHalData->pwrGroupCnt = 0;\n\tpHalData->PGMaxGroup = MAX_PG_GROUP;\n\tpHalData->odmpriv.RFCalibrateInfo.ThermalValue_HP_index = 0;\n\tfor (i = 0; i < HP_THERMAL_NUM; i++)\n\t\tpHalData->odmpriv.RFCalibrateInfo.ThermalValue_HP[i] = 0;\n\tpHalData->EfuseHal.fakeEfuseBank = 0;\n\tpHalData->EfuseHal.fakeEfuseUsedBytes = 0;\n\t_rtw_memset(pHalData->EfuseHal.fakeEfuseContent, 0xFF, EFUSE_MAX_HW_SIZE);\n\t_rtw_memset(pHalData->EfuseHal.fakeEfuseInitMap, 0xFF, EFUSE_MAX_MAP_LEN);\n\t_rtw_memset(pHalData->EfuseHal.fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN);\n}\n\nVOID\n_InitBeaconParameters_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu16 val16;\n\tu8  val8;   \n\n\tval8 = DIS_TSF_UDT;\n\tval16 = val8 | (val8 << 8); // port0 and port1\n#ifdef CONFIG_BT_COEXIST\n    if (pHalData->EEPROMBluetoothCoexist == 1)\n    {\n        // Enable prot0 beacon function for PSTDMA\n        val16 |= EN_BCN_FUNCTION;\n    }\n#endif\n\trtw_write16(Adapter, REG_BCN_CTRL, val16);\n\t//rtw_write16(Adapter, REG_BCN_CTRL, 0x1010);\n\n\t// TODO: Remove these magic number\n\trtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms\n\trtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME_8814);// 5ms\n\trtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME_8814); // 2ms\n\n\t// Suggested by designer timchen. Change beacon AIFS to the largest number\n\t// beacause test chip does not contension before sending beacon. by tynli. 2009.11.03\n\trtw_write16(Adapter, REG_BCNTCFG, 0x660F);\n\n\tpHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL);\n\tpHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); \n\tpHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2);\n\tpHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2);\n\tpHalData->RegCR_1 = rtw_read8(Adapter, REG_CR+1);\n}\n\nstatic VOID\n_BeaconFunctionEnable(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tBOOLEAN\t\t\tEnable,\n\tIN\tBOOLEAN\t\t\tLinked\n\t)\n{\n\trtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1));\n\t//SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00);\n\t//RT_TRACE(COMP_BEACON, DBG_LOUD, (\"_BeaconFunctionEnable 0x550 0x%x\\n\", rtw_read8(Adapter, 0x550)));\t\t\t\n\n\trtw_write8(Adapter, REG_RD_CTRL+1, 0x6F);\t\n}\n\nstatic void ResumeTxBeacon(_adapter *padapter)\n{\n\tHAL_DATA_TYPE*\tpHalData = GET_HAL_DATA(padapter);\t\n\n\t// 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value\n\t// which should be read from register to a global variable.\n\n\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) | BIT6);\n\tpHalData->RegFwHwTxQCtrl |= BIT6;\n\trtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0xff);\n\tpHalData->RegReg542 |= BIT0;\n\trtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);\n}\n\nstatic void StopTxBeacon(_adapter *padapter)\n{\n\tHAL_DATA_TYPE*\tpHalData = GET_HAL_DATA(padapter);\n\n\trtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl) & (~BIT6));\n\tpHalData->RegFwHwTxQCtrl &= (~BIT6);\n\trtw_write8(padapter, REG_TBTT_PROHIBIT+1, 0x64);\n\tpHalData->RegReg542 &= ~(BIT0);\n\trtw_write8(padapter, REG_TBTT_PROHIBIT+2, pHalData->RegReg542);\n\n\t //todo: CheckFwRsvdPageContent(Adapter);  // 2010.06.23. Added by tynli.\n}\n\nvoid SetBeaconRelatedRegisters8814A(PADAPTER padapter)\n{\n\tu32\tvalue32;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu32 bcn_ctrl_reg \t\t\t= REG_BCN_CTRL;\n\t//reset TSF, enable update TSF, correcting TSF On Beacon \n\t\n\t//REG_BCN_INTERVAL\n\t//REG_BCNDMATIM\n\t//REG_ATIMWND\n\t//REG_TBTT_PROHIBIT\n\t//REG_DRVERLYINT\n\t//REG_BCN_MAX_ERR\t\n\t//REG_BCNTCFG //(0x510)\n\t//REG_DUAL_TSF_RST\n\t//REG_BCN_CTRL //(0x550) \n\n\t//BCN interval\n#ifdef CONFIG_CONCURRENT_MODE\n        if (padapter->iface_type == IFACE_PORT1){\n\t\tbcn_ctrl_reg = REG_BCN_CTRL_1;\n        }\n#endif\t\n\trtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval);\n\trtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms\n\n\t_InitBeaconParameters_8814A(padapter);\n\n\trtw_write8(padapter, REG_SLOT, 0x09);\n\n\tvalue32 =rtw_read32(padapter, REG_TCR); \n\tvalue32 &= ~TSFRST;\n\trtw_write32(padapter,  REG_TCR, value32); \n\n\tvalue32 |= TSFRST;\n\trtw_write32(padapter, REG_TCR, value32); \n\n\t// NOTE: Fix test chip's bug (about contention windows's randomness)\n\trtw_write8(padapter,  REG_RXTSF_OFFSET_CCK, 0x50);\n\trtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50);\n\n\t_BeaconFunctionEnable(padapter, _TRUE, _TRUE);\n\n\tResumeTxBeacon(padapter);\n\n\t//rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6));\n\t\n\t//rtw_write8(padapter, 0x541, 0xff);\n\n\t//rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0));\n\n\trtw_write8(padapter, bcn_ctrl_reg, rtw_read8(padapter, bcn_ctrl_reg)|BIT(1));\n\n}\n\n#ifdef CONFIG_BEAMFORMING\n#if (BEAMFORMING_SUPPORT == 0)\nVOID\nSetBeamformingCLK_8812(\n\tIN \tPADAPTER\t\t\tAdapter\n\t)\n{\n\tstruct pwrctrl_priv\t*pwrpriv = adapter_to_pwrctl(Adapter);\n\tu16\tu2btmp;\n\tu8\tCount = 0, u1btmp;\n\n\tDBG_871X(\" ==>%s\\n\", __FUNCTION__);\n\n\tif ( (check_fwstate(&Adapter->mlmepriv, _FW_UNDER_SURVEY)==_TRUE)\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (check_buddy_fwstate(Adapter, _FW_UNDER_SURVEY) == _TRUE)\n#endif\n\t\t)\n\t{\n\t\tDBG_871X(\" <==%s return by Scan\\n\", __FUNCTION__);\n\t\treturn;\n\t}\t\n\t\n\t// Stop Usb TxDMA\n\trtw_write_port_cancel(Adapter);\n\n#ifdef CONFIG_PCI_HCI\n\t// Stop PCIe TxDMA\n\trtw_write8(Adapter, REG_PCIE_CTRL_REG+1, 0xFE);\n#endif\n\n\t// Wait TXFF empty\n\tfor(Count = 0; Count < 100; Count++)\n\t{\n\t\tu2btmp = rtw_read16(Adapter, REG_TXPKT_EMPTY);\n\t\tu2btmp = u2btmp & 0xfff;\n\t\tif(u2btmp != 0xfff)\n\t\t{\n\t\t\trtw_mdelay_os(10);\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t\tbreak;\n\t}\n\n\tDBG_871X(\" Tx Empty count %d \\n\", Count);\n\n\t// TX pause\n\trtw_write8(Adapter, REG_TXPAUSE, 0xFF);\n\n\t// Wait TX State Machine OK\n\tfor(Count = 0; Count < 100; Count++)\n\t{\n\t\tif (rtw_read32(Adapter, REG_SCH_TXCMD_8812A) != 0)\n\t\t\tcontinue;\n\t\telse \n\t\t\tbreak;\n\t}\n\n\tDBG_871X(\" Tx Status count %d\\n\", Count);\n\t\n\t// Stop RX DMA path\n\tu1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A);\n\trtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp | BIT2);\n\n\tfor(Count = 0; Count < 100; Count++)\n\t{\n\t\tu1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A);\n\t\tif(u1btmp & BIT1)\n\t\t\tbreak;\n\t\telse\n\t\t\trtw_mdelay_os(10);\n\t}\n\n\tDBG_871X(\" Rx Empty count %d \\n\", Count);\n\t\n\t// Disable clock\n\trtw_write8(Adapter, REG_SYS_CLKR+1, 0xf0);\n\t// Disable 320M\n\trtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0x8);\n\t// Enable 320M\n\trtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0xa);\n\t// Enable clock\n\trtw_write8(Adapter, REG_SYS_CLKR+1, 0xfc);\n\n\t// Release Tx pause\n\trtw_write8(Adapter, REG_TXPAUSE, 0);\n\n\t// Enable RX DMA path\n\tu1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A);\n\trtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp & (~BIT2));\n\n\t// Start Usb TxDMA\n\tRTW_ENABLE_FUNC(Adapter, DF_TX_BIT);\n\tDBG_871X(\"%s \\n\", __FUNCTION__);\n\n\tDBG_871X(\"<==%s\\n\", __FUNCTION__);\n}\n\nVOID\nSetBeamformRfMode_8812(\n\tIN PADAPTER\t\t\t\tAdapter,\n\tIN struct beamforming_info\t*pBeamInfo\n\t)\n{\n\tBOOLEAN\t\t\t\tbSelfBeamformer = _FALSE;\n\tBOOLEAN\t\t\t\tbSelfBeamformee = _FALSE;\n\tBEAMFORMING_CAP\tBeamformCap = BEAMFORMING_CAP_NONE;\n\n\tBeamformCap = beamforming_get_beamform_cap(pBeamInfo);\n\n\tif(BeamformCap == pBeamInfo->beamforming_cap)\n\t\treturn;\n\telse \n\t\tpBeamInfo->beamforming_cap = BeamformCap;\n\n\tif(GET_RF_TYPE(Adapter) == RF_1T1R)\n\t\treturn;\n\n\tbSelfBeamformer = BeamformCap & BEAMFORMER_CAP;\n\tbSelfBeamformee = BeamformCap & BEAMFORMEE_CAP;\n\n\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable\n\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable\n\n\tif(bSelfBeamformer)\n\t{\t\n\t\t// Paath_A\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000,0x3); // Select RX mode\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode\n\t\t// Path_B\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode\n\t}\n\telse\n\t{\n\t\t// Paath_A\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode\n\t\t// Path_B\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data\n\t\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode\n\t}\n\n\tPHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable\n\tPHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable\n\n\tif(bSelfBeamformer)\n\t\tPHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x33);\n\telse\n\t\tPHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x11);\n}\n\n\n\nVOID\nSetBeamformEnter_8812(\n\tIN PADAPTER\t\t\t\tAdapter,\n\tIN u8\t\t\t\t\tIdx\n\t)\n{\n\tu8\ti = 0;\n\tu32\tCSI_Param;\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct beamforming_entry\tBeamformEntry = pBeamInfo->beamforming_entry[Idx];\n\tu16\tSTAid = 0;\n\n\tSetBeamformRfMode_8812(Adapter, pBeamInfo);\n\n\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))\n\t\tSTAid = BeamformEntry.mac_id;\n\telse \n\t\tSTAid = BeamformEntry.p_aid;\n\n\t// Sounding protocol control\n\trtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB);\n\n\t// MAC addresss/Partial AID of Beamformer\n\tif(Idx == 0)\n\t{\n\t\tfor(i = 0; i < 6 ; i++)\n\t\t\trtw_write8(Adapter, (REG_BFMER0_INFO_8812A+i), BeamformEntry.mac_addr[i]);\n\t\t/* CSI report use legacy ofdm so don't need to fill P_AID.*/\n\t\t/*rtw_write16(Adapter, REG_BFMER0_INFO_8812A+6, BeamformEntry.P_AID);*/\n\t}\n\telse\n\t{\n\t\tfor(i = 0; i < 6 ; i++)\n\t\t\trtw_write8(Adapter, (REG_BFMER1_INFO_8812A+i), BeamformEntry.mac_addr[i]);\n\t\t/* CSI report use legacy ofdm so don't need to fill P_AID.*/\n\t\t/*rtw_write16(Adapter, REG_BFMER1_INFO_8812A+6, BeamformEntry.P_AID);*/\n\t}\n\n\t// CSI report parameters of Beamformee \n\tif(\t(BeamformEntry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) ||\n\t\t(BeamformEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) )\n\t{\n\t\tif(pHalData->rf_type == RF_2T2R)\n\t\t\tCSI_Param = 0x01090109;\n\t\telse\n\t\t\tCSI_Param = 0x01080108;\n\t}\t\n\telse \n\t{\n\t\tif(pHalData->rf_type == RF_2T2R)\n\t\t\tCSI_Param = 0x03090309;\n\t\telse\n\t\t\tCSI_Param = 0x03080308;\n\t}\t\n\n\tif(pHalData->rf_type == RF_2T2R)\n\t\trtw_write32(Adapter, 0x9B4, 0x00000000);\t// Nc =2\n\telse\n\t\trtw_write32(Adapter, 0x9B4, 0x01081008); // Nc =1\n\n\trtw_write32(Adapter, REG_CSI_RPT_PARAM_BW20_8812A, CSI_Param);\n\trtw_write32(Adapter, REG_CSI_RPT_PARAM_BW40_8812A, CSI_Param);\n\trtw_write32(Adapter, REG_CSI_RPT_PARAM_BW80_8812A, CSI_Param);\n\n\t// P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt\n\tif(Idx == 0)\n\t{\t\n\t\trtw_write16(Adapter, REG_TXBF_CTRL_8812A, STAid);\t\n\t\trtw_write8(Adapter, REG_TXBF_CTRL_8812A+3, rtw_read8(Adapter, REG_TXBF_CTRL_8812A+3)|BIT4|BIT6|BIT7);\n\t}\t\n\telse\n\t{\n\t\trtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, STAid | BIT12 | BIT14 | BIT15);\n\t}\t\n\n\t// CSI report parameters of Beamformee\n\tif(Idx == 0)\t\n\t{\n\t\t// Get BIT24 & BIT25\n\t\tu8\ttmp = rtw_read8(Adapter, REG_BFMEE_SEL_8812A+3) & 0x3;\n\t\n\t\trtw_write8(Adapter, REG_BFMEE_SEL_8812A+3, tmp | 0x60);\n\t\trtw_write16(Adapter, REG_BFMEE_SEL_8812A, STAid | BIT9);\n\t}\t\n\telse\n\t{\n\t\t// Set BIT25\n\t\trtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, STAid | (0xE2 << 8));\n\t}\n\n\t// Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us,  MP chip)\n\trtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A+3, 0x50);\n\n\tbeamforming_notify(Adapter);\n}\n\n\nVOID\nSetBeamformLeave_8812(\n\tIN PADAPTER\t\t\t\tAdapter,\n\tIN u8\t\t\t\t\tIdx\n\t)\n{\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv));\n\n\tSetBeamformRfMode_8812(Adapter, pBeamInfo);\n\n\t/*\tClear P_AID of Beamformee\n\t* \tClear MAC addresss of Beamformer\n\t*\tClear Associated Bfmee Sel\n\t*/\n\tif(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE)\n\t\trtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8);\t\n\n\tif(Idx == 0)\n\t{\t\n\t\trtw_write16(Adapter, REG_TXBF_CTRL_8812A, 0);\t\n\n\t\trtw_write32(Adapter, REG_BFMER0_INFO_8812A, 0);\n\t\trtw_write16(Adapter, REG_BFMER0_INFO_8812A+4, 0);\n\n\t\trtw_write16(Adapter, REG_BFMEE_SEL_8812A, 0);\n\t}\t\n\telse\n\t{\n\t\trtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, rtw_read16(Adapter, REG_TXBF_CTRL_8812A+2) & 0xF000);\n\n\t\trtw_write32(Adapter, REG_BFMER1_INFO_8812A, 0);\n\t\trtw_write16(Adapter, REG_BFMER1_INFO_8812A+4, 0);\n\n\t\trtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, rtw_read16(Adapter, REG_BFMEE_SEL_8812A+2) & 0x60);\n\t}\n}\n\n\nVOID\nSetBeamformStatus_8812(\n\tIN PADAPTER\t\t\t\tAdapter,\n\tIN u8\t\t\t\t\tIdx\n\t)\n{\n\tu16\tBeamCtrlVal;\n\tu32\tBeamCtrlReg;\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\tstruct beamforming_entry\tBeamformEntry = pBeamInfo->beamforming_entry[Idx];\n\n\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))\n\t\tBeamCtrlVal = BeamformEntry.mac_id;\n\telse \n\t\tBeamCtrlVal = BeamformEntry.p_aid;\n\n\tif(Idx == 0)\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8812A;\n\telse\n\t{\n\t\tBeamCtrlReg = REG_TXBF_CTRL_8812A+2;\n\t\tBeamCtrlVal |= BIT12 | BIT14|BIT15;\n\t}\n\n\tif(BeamformEntry.beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED)\n\t{\n\t\tif(BeamformEntry.sound_bw == CHANNEL_WIDTH_20)\n\t\t\tBeamCtrlVal |= BIT9;\n\t\telse if(BeamformEntry.sound_bw == CHANNEL_WIDTH_40)\n\t\t\tBeamCtrlVal |= BIT10;\n\t\telse if(BeamformEntry.sound_bw == CHANNEL_WIDTH_80)\n\t\t\tBeamCtrlVal |= BIT11;\n\t}\n\telse\n\t{\n\t\tBeamCtrlVal &= ~(BIT9|BIT10|BIT11);\n\t}\n\n\trtw_write16(Adapter, BeamCtrlReg, BeamCtrlVal);\n\n\tDBG_871X(\"%s Idx %d BeamCtrlReg %x BeamCtrlVal %x\\n\", __FUNCTION__, Idx, BeamCtrlReg, BeamCtrlVal);\n}\n\n\nVOID\nSetBeamformFwTxBFCmd_8812(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tu8\tIdx, Period0 = 0, Period1 = 0;\n\tu8\tPageNum0 = 0xFF, PageNum1 = 0xFF;\n\tu8\tu1TxBFParm[3]={0};\n\n\tstruct mlme_priv\t\t\t*pmlmepriv = &(Adapter->mlmepriv);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv);\n\n\tfor(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++)\n\t{\n\t\tif(pBeamInfo->beamforming_entry[Idx].beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED)\n\t\t{\n\t\t\tif(Idx == 0)\n\t\t\t{\n\t\t\t\tif(pBeamInfo->beamforming_entry[Idx].bSound)\n\t\t\t\t\tPageNum0 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum0 = 0xFF; //stop sounding\n\t\t\t\tPeriod0 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period);\n\t\t\t}\t\n\t\t\telse if(Idx == 1)\n\t\t\t{\n\t\t\t\tif(pBeamInfo->beamforming_entry[Idx].bSound)\n\t\t\t\t\tPageNum1 = 0xFE;\n\t\t\t\telse\n\t\t\t\t\tPageNum1 = 0xFF; //stop sounding\n\t\t\t\tPeriod1 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period);\n\t\t\t}\t\n\t\t}\n\t}\n\n\tu1TxBFParm[0] = PageNum0;\n\tu1TxBFParm[1] = PageNum1;\n\tu1TxBFParm[2] = (Period1 << 4) | Period0;\n\tFillH2CCmd_8812(Adapter, H2C_8812_TxBF, 3, u1TxBFParm);\n\t\n\tDBG_871X(\"%s PageNum0 = %d Period0 = %d\\n\", __FUNCTION__, PageNum0, Period0);\n\tDBG_871X(\"PageNum1 = %d Period1 %d\\n\", PageNum1, Period1);\n}\n\n\nVOID\nSetBeamformDownloadNDPA_8812(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tIdx\n\t)\n{\n\tu8\tu1bTmp=0, tmpReg422=0, Head_Page;\t\n\tu8\tBcnValidReg=0, count=0, DLBcnCount=0;\n\tBOOLEAN\t\t\tbSendBeacon=_FALSE;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu16\tTxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8812; // default reseved 1 page for the IC type which is undefined.\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv));\n\tstruct beamforming_entry\t*pBeamEntry = pBeamInfo->beamforming_entry+Idx;\n\n\t//pHalData->bFwDwRsvdPageInProgress = _TRUE;\n\n\tif(Idx == 0)\n\t\tHead_Page = 0xFE;\n\telse\n\t\tHead_Page = 0xFE;\n\n\trtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16 *)&TxPageBndy);\n\t\n\t//Set REG_CR bit 8. DMA beacon by SW.\n\tu1bTmp = rtw_read8(Adapter, REG_CR+1);\n\trtw_write8(Adapter,  REG_CR+1, (u1bTmp|BIT0));\n\n\tpHalData->RegCR_1 |= BIT0;\n\trtw_write8(Adapter,  REG_CR+1, pHalData->RegCR_1);\n\n\t// Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.\n\ttmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2);\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2,  tmpReg422&(~BIT6));\n\n\tif(tmpReg422&BIT6)\n\t{\n\t\tDBG_871X(\"SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\\n\");\n\t\tbSendBeacon = _TRUE;\n\t}\n\n\t// \tTDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA\n\trtw_write8(Adapter,REG_TDECTRL+1, Head_Page);\n\t\n\tdo\n\t{\t\t\n\t\t// Clear beacon valid check bit.\n\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\trtw_write8(Adapter, REG_TDECTRL+2, (BcnValidReg|BIT0));\n\t\t\n\t\t// download NDPA rsvd page.\n\t\tif(pBeamEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU)\n\t\t\tbeamforming_send_vht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->aid,pBeamEntry->sound_bw, BCN_QUEUE_INX);\n\t\telse \n\t\t\tbeamforming_send_ht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->sound_bw, BCN_QUEUE_INX);\n\n\t\t// check rsvd page download OK.\n\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\tcount=0;\n\t\twhile(!(BcnValidReg & BIT0) && count <20)\n\t\t{\n\t\t\tcount++;\n\t\t\trtw_udelay_os(10);\n\t\t\tBcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2);\n\t\t}\n\t\tDLBcnCount++;\n\t}while(!(BcnValidReg&BIT0) && DLBcnCount<5);\n\t\n\tif(!(BcnValidReg&BIT0))\n\t\tDBG_871X(\"%s Download RSVD page failed!\\n\", __FUNCTION__);\n\n\t// \tTDECTRL[15:8] 0x209[7:0] = 0xF6\tBeacon Head for TXDMA\n\trtw_write8(Adapter,REG_TDECTRL+1, TxPageBndy);\n\n\t// To make sure that if there exists an adapter which would like to send beacon.\n\t// If exists, the origianl value of 0x422[6] will be 1, we should check this to\n\t// prevent from setting 0x422[6] to 0 after download reserved page, or it will cause \n\t// the beacon cannot be sent by HW.\n\t// 2010.06.23. Added by tynli.\n\tif(bSendBeacon)\n\t{\n\t\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422);\n\t}\n\n\t// Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.\n\t// Clear CR[8] or beacon packet will not be send to TxBuf anymore.\n\tu1bTmp = rtw_read8(Adapter, REG_CR+1);\n\trtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0)));\n\n\tpBeamEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSED;\n\n\t//pHalData->bFwDwRsvdPageInProgress = _FALSE;\n}\n\nVOID\nSetBeamformFwTxBF_8812(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tIdx\n\t)\n{\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv));\n\tstruct beamforming_entry\t*pBeamEntry = pBeamInfo->beamforming_entry+Idx;\n\n\tif(pBeamEntry->beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSING)\n\t\tSetBeamformDownloadNDPA_8812(Adapter, Idx);\n\n\tSetBeamformFwTxBFCmd_8812(Adapter);\n}\n\n\nVOID\nSetBeamformPatch_8812(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tOperation\n\t)\n{\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct beamforming_info\t*pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv));\n\t\n\tif(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE)\n\t\treturn;\n\t\n\t/*if(Operation == SCAN_OPT_BACKUP_BAND0)\n\t{\n\t\trtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8);\t\n\t}\n\telse if(Operation == SCAN_OPT_RESTORE)\n\t{\n\t\trtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB);\n\t}*/\n}\n\n#endif /*#if (BEAMFORMING_SUPPORT == 0) for driver's TxBF*/\n#endif /*CONFIG_BEAMFORMING*/\n\nstatic void hw_var_set_monitor(PADAPTER Adapter, u8 variable, u8 *val)\n{\n\tu32\tvalue_rcr, rcr_bits;\n\tu16\tvalue_rxfltmap2;\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);\n\n\tif (*((u8 *)val) == _HW_STATE_MONITOR_) {\n\n\t\t/* Leave IPS */\n\t\trtw_pm_set_ips(Adapter, IPS_NONE);\n\t\tLeaveAllPowerSaveMode(Adapter);\n\n\t\t/* Receive all type */\n\t\trcr_bits = RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_APWRMGT | RCR_ADF | RCR_ACF | RCR_AMF | RCR_APP_PHYST_RXFF;\n\n\t\t/* Append FCS */\n\t\trcr_bits |= RCR_APPFCS;\n\n\t\t#if 0\n\t\t/* \n\t\t   CRC and ICV packet will drop in recvbuf2recvframe()\n\t\t   We no turn on it.\n\t\t */\n\t\trcr_bits |= (RCR_ACRC32 | RCR_AICV);\n\t\t#endif\n\n\t\t/* Receive all data frames */\n\t\tvalue_rxfltmap2 = 0xFFFF;\n\n\t\tvalue_rcr = rcr_bits;\n\t\trtw_write32(Adapter, REG_RCR, value_rcr);\n\n\t\trtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2);\n\n\t\t#if 0\n\t\t/* tx pause */\n\t\trtw_write8(padapter, REG_TXPAUSE, 0xFF);\n\t\t#endif\n\t} else {\n\t\t/* do nothing */\n\t}\n\n}\n\nstatic void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tu8\tval8;\t\n\tu8\tmode = *((u8 *)val);\n\tu32\tvalue_rcr;\n\tstatic u8 isMonitor = _FALSE;\n\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif (isMonitor == _TRUE) {\n\t\t/* reset RCR */\n\t\trtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);\n\t\tisMonitor = _FALSE;\n\t}\n\n\tif (mode == _HW_STATE_MONITOR_) {\n\t\tisMonitor = _TRUE;\n\t\t/* set net_type */\n\t\tSet_MSR(Adapter, _HW_STATE_NOLINK_);\n\n\t\thw_var_set_monitor(Adapter, variable, val);\n\t\treturn;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\t// disable Port1 TSF update\n\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_TSF_UDT);\n\t\t\n\t\t// set net_type\n\t\tval8 = rtw_read8(Adapter, MSR)&0x03;\n\t\tval8 |= (mode<<2);\n\t\trtw_write8(Adapter, MSR, val8);\n\t\t\n\t\tDBG_871X(\"%s()-%d mode = %d\\n\", __FUNCTION__, __LINE__, mode);\n\n\t\tif((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))\n\t\t{\n\t\t\tif(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))\n\t\t\t{\n\t\t\t\tStopTxBeacon(Adapter);\n#ifdef CONFIG_PCI_HCI\n\t\t\t\tUpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0);\n#else //CONFIG_PCI_HCI\n\t\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN\t\n\n\t\t\t\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\t\n\t\t\t\trtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms\n\t\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812);\t\n\t\t\t\t#endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\t\t\n\t\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\t\t\n\t\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812));\n\t\t\t\t#endif// CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\n \n\t\t\t\t#endif //CONFIG_INTERRUPT_BASED_TXBCN\n#endif //CONFIG_PCI_HCI\n\t\t\t}\n\t\t\t\n\t\t\trtw_write8(Adapter,REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function\n\t\t\t//rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18);\n\t\t}\n\t\telse if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)\n\t\t{\n#ifdef RTL8814AE_SW_BCN\n\t\t\t/*Beacon is polled to TXBUF*/\n\t\t\trtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8));\n\t\t\tDBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(Adapter, REG_CR));\n#endif\n\t\t\tResumeTxBeacon(Adapter);\n\t\t\trtw_write8(Adapter,REG_BCN_CTRL_1, 0x1a);\n\t\t}\n\t\telse if(mode == _HW_STATE_AP_)\n\t\t{\n#ifdef CONFIG_PCI_HCI\n\t\t\tUpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0);\n#else\n\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN\t\t\t\n\t\t\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0);\n\t\t\t#endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\n\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\t\n\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0);\n\t\t\t#endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\n\n\t#endif //CONFIG_INTERRUPT_BASED_TXBCN\n#endif\n\n\t\t\tResumeTxBeacon(Adapter);\n\t\t\t\t\t\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, 0x12);\n\n#ifdef RTL8814AE_SW_BCN\n\t\t\trtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8));\n\t\t\tDBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(Adapter, REG_CR));\n#endif\n\t\t\t//Set RCR\n\t\t\t//rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0\n\t\t\t//rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0\n\t\t\t//rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet\n\t\t\tvalue_rcr = rtw_read32(Adapter, REG_RCR);\n\t\t\tvalue_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA\n\t\t\trtw_write32(Adapter, REG_RCR, value_rcr);\n\n\t\t\t//enable to rx data frame\n\t\t\trtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);\n\n\t\t\t//Beacon Control related register for first time \n\t\t\trtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms\t\t\n\n\t\t\t//rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);\n\t\t\trtw_write8(Adapter, REG_ATIMWND_1, 0x0a); // 10ms for port1\n\t\t\trtw_write16(Adapter, REG_BCNTCFG, 0x00);\n\t\t\trtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);\n\t\t\trtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)\n\t\n\t\t\t//reset TSF2\t\n\t\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));\n\n\t\t\t//enable BCN1 Function for if2\n\t\t\t//don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received)\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB));\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))\n\t\t\t\trtw_write8(Adapter, REG_BCN_CTRL, \n\t\t\t\t\trtw_read8(Adapter, REG_BCN_CTRL) & ~EN_BCN_FUNCTION);\n#endif\n\t\t\t//BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked\n\t\t\t//rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5));\n\t\t\t//rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(3));\n\t\t\t\t\t\n\t\t\t//dis BCN0 ATIM  WND if if1 is station\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_ATIM);\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n\t\t\t// Reset TSF for STA+AP concurrent mode\n\t\t\tif ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {\n\t\t\t\tif (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)\n\t\t\t\t\tDBG_871X(\"ERROR! %s()-%d: Reset port1 TSF fail\\n\",\n\t\t\t\t\t\t__FUNCTION__, __LINE__);\n\t\t\t}\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\t\t}\n\t}\n\telse //else for port0\n#endif // CONFIG_CONCURRENT_MODE\n\t{\n\t\t// disable Port0 TSF update\n\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_TSF_UDT);\n\t\t\n\t\t// set net_type\n\t\tval8 = rtw_read8(Adapter, MSR)&0x0c;\n\t\tval8 |= mode;\n\t\trtw_write8(Adapter, MSR, val8);\n\t\t\n\t\tDBG_871X(\"%s()-%d mode = %d\\n\", __FUNCTION__, __LINE__, mode);\n\t\t\n\t\tif((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_))\n\t\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))\t\t\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\t{\n\t\t\t\tStopTxBeacon(Adapter);\n#ifdef CONFIG_PCI_HCI\n\t\t\t\tUpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0);\n#else\n\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN\n\t\t\t\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\t\trtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms\t\t\t\t\t\n\t\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812);\t\n\t\t\t\t#endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\t\t\n\t\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\t\t\n\t\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812));\n\t\t\t\t#endif //CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\n\t\t\t\t\t\n\t\t\t#endif //CONFIG_INTERRUPT_BASED_TXBCN\n#endif\n\t\t\t}\n\t\t\t\n\t\t\trtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd\n\t\t\t//rtw_write8(Adapter,REG_BCN_CTRL, 0x18);\n\t\t}\n\t\telse if((mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/)\n\t\t{\n#ifdef RTL8814AE_SW_BCN\n\t\t\trtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8));\n\t\t\tDBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(Adapter, REG_CR));\n#endif\n\t\t\tResumeTxBeacon(Adapter);\n\t\t\trtw_write8(Adapter,REG_BCN_CTRL, 0x1a);\n\t\t}\n\t\telse if(mode == _HW_STATE_AP_)\n\t\t{\n#ifdef CONFIG_PCI_HCI\n\t\t\tUpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0);\n#else\n\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN\t\t\t\n\t\t\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0);\n\t\t\t#endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\n\t\t\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\t\n\t\t\tUpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0);\n\t\t\t#endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\n\t\t\t\t\t\n\t#endif //CONFIG_INTERRUPT_BASED_TXBCN\n#endif\n\n\t\t\tResumeTxBeacon(Adapter);\n\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, 0x12);\n\t\t\t/*Beacon is polled to TXBUF*/\n#ifdef RTL8814AE_SW_BCN\n\t\t\trtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8));\n\t\t\tDBG_871X(\"%s-%d: enable SW BCN, REG_CR=0x%x\\n\", __func__, __LINE__, rtw_read32(Adapter, REG_CR));\n#endif\n\n\t\t\t//Set RCR\n\t\t\t//rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0\n\t\t\t//rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0\n\t\t\t//rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet\n\t\t\tvalue_rcr = rtw_read32(Adapter, REG_RCR);\n\t\t\tvalue_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA\n\t\t\trtw_write32(Adapter, REG_RCR, value_rcr);\n\n\t\t\t//enable to rx data frame\n\t\t\trtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF);\n\n\t\t\t//Beacon Control related register for first time\n\t\t\trtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms\t\t\t\n\t\t\t\n\t\t\t//rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);\n\t\t\trtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms\n\t\t\trtw_write16(Adapter, REG_BCNTCFG, 0x00);\n\t\t\trtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04);\n\t\t\trtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms)\n\n\t\t\t//reset TSF\n\t\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));\n\t\n\t\t\t//enable BCN0 Function for if1\n\t\t\t//don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received)\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB));\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE))\n\t\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, \n\t\t\t\t\trtw_read8(Adapter, REG_BCN_CTRL_1) & ~EN_BCN_FUNCTION);\n#endif\n\n\t\t\t//dis BCN1 ATIM  WND if if2 is station\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_ATIM);\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n\t\t\t// Reset TSF for STA+AP concurrent mode\n\t\t\tif ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) {\n\t\t\t\tif (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)\n\t\t\t\t\tDBG_871X(\"ERROR! %s()-%d: Reset port0 TSF fail\\n\",\n\t\t\t\t\t\t__FUNCTION__, __LINE__);\n\t\t\t}\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\t\t}\n\t}\n}\n\nstatic void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tu8 idx = 0;\n\tu32 reg_macid;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\treg_macid = REG_MACID1;\n\t}\n\telse\n#endif\n\t{\n\t\treg_macid = REG_MACID;\n\t}\n\n\tfor(idx = 0 ; idx < 6; idx++)\n\t{\n\t\trtw_write8(GET_PRIMARY_ADAPTER(Adapter), (reg_macid+idx), val[idx]);\n\t}\n\t\n}\n\nstatic void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tu8\tidx = 0;\n\tu32 reg_bssid;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\treg_bssid = REG_BSSID1;\n\t}\n\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t{\n\t\treg_bssid = REG_BSSID;\n\t}\n\n\tfor(idx = 0 ; idx < 6; idx++)\n\t{\n\t\trtw_write8(Adapter, (reg_bssid+idx), val[idx]);\n\t}\n\n}\n\nstatic void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tu32 bcn_ctrl_reg;\n\tu8 val8;\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\tbcn_ctrl_reg = REG_BCN_CTRL_1;\n\t}\t\n\telse\n#endif\t\t\n\t{\t\t\n\t\tbcn_ctrl_reg = REG_BCN_CTRL;\n\t}\n\n\tif(*((u8 *)val))\n\t{\n\t\trtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT));\n\t}\n\telse\n\t{\n\t\t\n                u8 val8;\n                val8 = rtw_read8(Adapter, bcn_ctrl_reg);\n                val8 &= ~(EN_BCN_FUNCTION | EN_TXBCN_RPT);\n                \n#ifdef CONFIG_BT_COEXIST\n                if (GET_HAL_DATA(Adapter)->EEPROMBluetoothCoexist == 1)\n                {\n                        // Always enable port0 beacon function for PSTDMA\n                        if (REG_BCN_CTRL == bcn_ctrl_reg)\n                            val8 |= EN_BCN_FUNCTION;\n                }\n#endif //CONFIG_BT_COEXIST\n\n\t\trtw_write8(Adapter, bcn_ctrl_reg, val8);\n\t}\n\t\n\n}\n\nstatic void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val)\n{\n#if 0 //check 8814 still need sw sync tsf??\n#ifdef CONFIG_CONCURRENT_MODE\n\tu64\ttsf;\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us\n\ttsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us\n\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t{\t\t\t\t\n\t\t//pHalData->RegTxPause |= STOP_BCNQ;BIT(6)\n\t\t//rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6)));\n\t\tStopTxBeacon(Adapter);\n\t}\n\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\t//disable related TSF function\n\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));\n\t\t\t\t\t\t\t\n\t\trtw_write32(Adapter, REG_TSFTR1, tsf);\n\t\trtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);\n\n\n\t\t//enable related TSF function\n\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));\t\n\n\t\t// Update buddy port's TSF if it is SoftAP for beacon TX issue!\n\t\tif ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE\n\t\t\t&& check_buddy_fwstate(Adapter, WIFI_AP_STATE)\n\t\t) { \n\t\t\t//disable related TSF function\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));\n\n\t\t\trtw_write32(Adapter, REG_TSFTR, tsf);\n\t\t\trtw_write32(Adapter, REG_TSFTR+4, tsf>>32);\n\n\t\t\t//enable related TSF function\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n\t\t// Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue!\n\t\t\tif (reset_tsf(Adapter, IFACE_PORT0) == _FALSE)\n\t\t\t\tDBG_871X(\"ERROR! %s()-%d: Reset port0 TSF fail\\n\",\n\t\t\t\t\t__FUNCTION__, __LINE__);\n\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\t\n\t\t}\t\t\n\n\t\t\n\t}\n\telse\n\t{\n\t\t//disable related TSF function\n\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3)));\n\t\t\t\t\t\t\t\n\t\trtw_write32(Adapter, REG_TSFTR, tsf);\n\t\trtw_write32(Adapter, REG_TSFTR+4, tsf>>32);\n\n\t\t//enable related TSF function\n\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3));\n\t\t\n\t\t// Update buddy port's TSF if it is SoftAP for beacon TX issue!\n\t\tif ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE\n\t\t\t&& check_buddy_fwstate(Adapter, WIFI_AP_STATE)\n\t\t) { \n\t\t\t//disable related TSF function\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));\n\n\t\t\trtw_write32(Adapter, REG_TSFTR1, tsf);\n\t\t\trtw_write32(Adapter, REG_TSFTR1+4, tsf>>32);\n\n\t\t\t//enable related TSF function\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3));\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n\t\t// Update buddy port's TSF if it is SoftAP for beacon TX issue!\n\t\t\tif (reset_tsf(Adapter, IFACE_PORT1) == _FALSE)\n\t\t\t\tDBG_871X(\"ERROR! %s()-%d: Reset port1 TSF fail\\n\",\n\t\t\t\t\t__FUNCTION__, __LINE__);\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\t\t}\t\t\n\n\t}\n\t\t\t\t\n\t\t\t\t\t\t\t\n\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t{\n\t\t//pHalData->RegTxPause  &= (~STOP_BCNQ);\n\t\t//rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6))));\n\t\tResumeTxBeacon(Adapter);\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n#endif //0\n}\n\nstatic void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val)\n{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t\t\n\tif(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))\t\n\t\trtw_write16(Adapter, REG_RXFLTMAP2, 0x00);\n\t\n\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t{\n\t\t//reset TSF1\n\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1));\n\n\t\t//disable update TSF1\n\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4));\n\n\t\t// disable Port1's beacon function\n\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3)));\n\t}\n\telse\n\t{\n\t\t//reset TSF\n\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0));\n\n\t\t//disable update TSF\n\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4));\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n}\n\nstatic void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);\n\tu32\tvalue_rcr, rcr_clear_bit, reg_bcn_ctl;\n\tu16\tvalue_rxfltmap2;\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_priv *pmlmepriv=&(Adapter->mlmepriv);\n\tu8 ap_num;\n\n\trtw_dev_iface_status(Adapter, NULL, NULL, NULL, &ap_num, NULL);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(Adapter->iface_type == IFACE_PORT1)\n\t\treg_bcn_ctl = REG_BCN_CTRL_1;\n\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t\treg_bcn_ctl = REG_BCN_CTRL;\n\n#ifdef CONFIG_FIND_BEST_CHANNEL\n\n\trcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA);\n\n\t/* Receive all data frames */\n\tvalue_rxfltmap2 = 0xFFFF;\n\n#else /* CONFIG_FIND_BEST_CHANNEL */\n\n\trcr_clear_bit = RCR_CBSSID_BCN;\n\n\t//config RCR to receive different BSSID & not to receive data frame\n\tvalue_rxfltmap2 = 0;\n\n#endif /* CONFIG_FIND_BEST_CHANNEL */\n\n\tif( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t|| (check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE)\n#endif\n\t\t)\n\t{\t\n\t\trcr_clear_bit = RCR_CBSSID_BCN;\t\n\t}\n#ifdef CONFIG_TDLS\n\t// TDLS will clear RCR_CBSSID_DATA bit for connection.\n\telse if (Adapter->tdlsinfo.link_established == _TRUE)\n\t{\n\t\trcr_clear_bit = RCR_CBSSID_BCN;\n\t}\n#endif // CONFIG_TDLS\n\n\tvalue_rcr = rtw_read32(Adapter, REG_RCR);\n\n\tif(*((u8 *)val))//under sitesurvey\n\t{\n\t\tvalue_rcr &= ~(rcr_clear_bit);\n\t\trtw_write32(Adapter, REG_RCR, value_rcr);\n\n\t\trtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2);\n\n\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) {\n\t\t\t//disable update TSF\n\t\t\trtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)|DIS_TSF_UDT);\n\t\t}\n\n\t\t// Save orignal RRSR setting.\n\t\tpHalData->RegRRSR = rtw_read16(Adapter, REG_RRSR);\n\n\t\tif (ap_num)\n\t\t\tStopTxBeacon(Adapter);\n\t}\n\telse//sitesurvey done\n\t{\n\t\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) \n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t|| check_buddy_fwstate(Adapter, (_FW_LINKED|WIFI_AP_STATE))\n#endif\n\t\t\t)\n\t\t{\n\t\t\t//enable to rx data frame\n\t\t\trtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);\n\t\t}\n\n\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) {\n\t\t\t//enable update TSF\n\t\t\trtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)&(~(DIS_TSF_UDT)));\n\t\t}\n\n\t\tvalue_rcr |= rcr_clear_bit;\n\t\trtw_write32(Adapter, REG_RCR, value_rcr);\n\n\t\t// Restore orignal RRSR setting.\n\t\trtw_write16(Adapter, REG_RRSR, pHalData->RegRRSR);\n\n\t\tif (ap_num) {\n\t\t\tint i;\n\t\t\t_adapter *iface;\n\n\t\t\tResumeTxBeacon(Adapter);\n\t\t\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\t\t\tiface = dvobj->padapters[i];\n\t\t\t\tif (!iface)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE\n\t\t\t\t\t&& check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE\n\t\t\t\t) {\n\t\t\t\t\tiface->mlmepriv.update_bcn = _TRUE;\n\t\t\t\t\t#ifndef CONFIG_INTERRUPT_BASED_TXBCN\n\t\t\t\t\t#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\t\t\t\ttx_beacon_hdl(iface, NULL);\n\t\t\t\t\t#endif\n\t\t\t\t\t#endif\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\t\t\n}\n\nstatic void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val)\n{\n#ifdef CONFIG_CONCURRENT_MODE\n\tu8\tRetryLimit = 0x30;\n\tu8\ttype = *((u8 *)val);\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tstruct mlme_priv\t*pmlmepriv = &Adapter->mlmepriv;\n\n\tif(type == 0) // prepare to join\n\t{\t\t\n\t\tif(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&\n\t\t\tcheck_buddy_fwstate(Adapter, _FW_LINKED))\t\t\n\t\t{\n\t\t\tStopTxBeacon(Adapter);\n\t\t}\n\t\n\t\t//enable to rx data frame.Accept all data frame\n\t\t//rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);\n\t\trtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF);\n\n\t\tif(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE))\n\t\t{\n\t\t\trtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN);\t\t\t\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\trtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN);\n\t\t}\t\n\n\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t{\n\t\t\tRetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48;\n\t\t}\n\t\telse // Ad-hoc Mode\n\t\t{\n\t\t\tRetryLimit = 0x7;\n\t\t}\n\t}\n\telse if(type == 1) //joinbss_event call back when join res < 0\n\t{\t\t\n\t\tif(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_))\t\t\n\t\t\trtw_write16(Adapter, REG_RXFLTMAP2,0x00);\n\n\t\tif(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&\n\t\t\tcheck_buddy_fwstate(Adapter, _FW_LINKED))\n\t\t{\n\t\t\tResumeTxBeacon(Adapter);\t\t\t\n\t\t\t\n\t\t\t//reset TSF 1/2 after ResumeTxBeacon\n\t\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));\t\n\t\t\t\n\t\t}\n\t}\n\telse if(type == 2) //sta add event call back\n\t{\n\t \n\t\t//enable update TSF\n\t\tif(Adapter->iface_type == IFACE_PORT1)\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4)));\n\t\telse\t\t\n\t\t\trtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4)));\n\t\t\t\t \n\t\n\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))\n\t\t{\n\t\t\t//fixed beacon issue for 8191su...........\n\t\t\trtw_write8(Adapter,0x542 ,0x02);\n\t\t\tRetryLimit = 0x7;\n\t\t}\n\n\n\t\tif(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) &&\n\t\t\tcheck_buddy_fwstate(Adapter, _FW_LINKED))\n\t\t{\n\t\t\tResumeTxBeacon(Adapter);\t\t\t\n\t\t\t\n\t\t\t//reset TSF 1/2 after ResumeTxBeacon\n\t\t\trtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0));\n\t\t}\n\t\t\n\t}\n\n\trtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT);\n\t\n#endif //CONFIG_CONCURRENT_MODE\n}\n\nstatic void rtw_store_all_sta_hwseq(_adapter *padapter)\n{\n\t_irqL\t irqL;\n\t_list\t*plist, *phead;\n\tu8 index;\n\tu16\thw_seq[NUM_STA];\n\tu32 shcut_addr = 0;\n\tstruct sta_info *psta;\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\t\n_func_enter_;\n\t/* save each HW sequence of mac id from report fifo */\n\tfor (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {\n\t\tif (rtw_macid_is_used(macid_ctl, index)) {\n\t\t\trtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5));\n\t\t\tshcut_addr = 0x8000;\n\t\t\tshcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1;\n\t\t\thw_seq[index] = rtw_read16(padapter, shcut_addr);\n\t\t\t/* DBG_871X(\"mac_id:%d is used, hw_seq[index]=%d\\n\", index, hw_seq[index]); */\n\t\t}\n\t}\n\t\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\tfor (index = 0; index < NUM_STA; index++) {\n\t\tpsta = NULL;\n\t\t\n\t\tphead = &(pstapriv->sta_hash[index]);\n\t\tplist = get_next(phead);\n\t\t\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\tplist = get_next(plist);\n\n\t\t\tpsta->hwseq = hw_seq[psta->mac_id];\n\t\t\t/* DBG_871X(\" psta->mac_id=%d, psta->hwseq=%d\\n\" , psta->mac_id, psta->hwseq); */\n\t\t}\n\n\t}\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\n_func_exit_;\t\n\n}\n\nstatic void rtw_restore_all_sta_hwseq(_adapter *padapter)\n{\n\t_irqL\t irqL;\n\t_list\t*plist, *phead;\n\tu8 index;\n\tu16\thw_seq[NUM_STA];\n\tu32 shcut_addr = 0;\n\tstruct sta_info *psta;\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\t\n_func_enter_;\n\t\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\tfor (index = 0; index < NUM_STA; index++) {\n\t\tpsta = NULL;\n\t\t\n\t\tphead = &(pstapriv->sta_hash[index]);\n\t\tplist = get_next(phead);\n\t\t\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\t\t\tplist = get_next(plist);\n\t\t\t\n\t\t\thw_seq[psta->mac_id] = psta->hwseq;\n\t\t\t/* DBG_871X(\" psta->mac_id=%d, psta->hwseq=%d\\n\", psta->mac_id, psta->hwseq); */\n\t\t}\n\n\t}\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\n\t/* restore each HW sequence of mac id to report fifo */\n\tfor (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {\n\t\tif (rtw_macid_is_used(macid_ctl, index)) {\n\t\t\trtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5));\n\t\t\tshcut_addr = 0x8000;\n\t\t\tshcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1;\n\t\t\trtw_write16(padapter, shcut_addr, hw_seq[index]);\n\t\t\t/* DBG_871X(\"mac_id:%d is used, hw_seq[index]=%d\\n\", index, hw_seq[index]); */\n\t\t}\n\t}\n\t\n_func_exit_;\t\n\n}\n\nvoid SetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval)\n{\n\tPHAL_DATA_TYPE pHalData; \n\tPDM_ODM_T podmpriv;\n\tu8 val8;\n\tu16 val16;\n\tu32 val32;\n\n_func_enter_;\n\n\tpHalData = GET_HAL_DATA(padapter); \n\tpodmpriv = &pHalData->odmpriv;\n\n\tswitch (variable)\n\t{\n\t\tcase HW_VAR_MEDIA_STATUS:\n\t\t\tval8 = rtw_read8(padapter, MSR) & 0x0c;\n\t\t\tval8 |= *pval;\n\t\t\trtw_write8(padapter, MSR, val8);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MEDIA_STATUS1:\n\t\t\tval8 = rtw_read8(padapter, MSR) & 0x03;\n\t\t\tval8 |= *pval << 2;\n\t\t\trtw_write8(padapter, MSR, val8);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_SET_OPMODE:\n\t\t\thw_var_set_opmode(padapter, variable, pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MAC_ADDR:\n\t\t\thw_var_set_macaddr(padapter, variable, pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BSSID:\n\t\t\thw_var_set_bssid(padapter, variable, pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BASIC_RATE:\n\t\t{\n\t\t\tstruct mlme_ext_info *mlmext_info = &padapter->mlmeextpriv.mlmext_info;\n\t\t\tu16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;\n\t\t\tu16 rrsr_2g_force_mask = RRSR_CCK_RATES;\n\t\t\tu16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES);\n\t\t\tu16 rrsr_5g_force_mask = (RRSR_6M);\n\t\t\tu16 rrsr_5g_allow_mask = (RRSR_OFDM_RATES);\n\n\t\t\tHalSetBrateCfg(padapter, pval, &BrateCfg);\n\t\t\tinput_b = BrateCfg;\n\n\t\t\t/* apply force and allow mask */\n\t\t\tif(pHalData->CurrentBandType == BAND_ON_2_4G)\n\t\t\t{\n\t\t\t\tBrateCfg |= rrsr_2g_force_mask;\n\t\t\t\tBrateCfg &= rrsr_2g_allow_mask;\n\t\t\t}\n\t\t\telse // 5G\n\t\t\t{\n\t\t\t\tBrateCfg |= rrsr_5g_force_mask;\n\t\t\t\tBrateCfg &= rrsr_5g_allow_mask;\n\t\t\t}\n\t\t\tmasked = BrateCfg;\n\n\t\t\t/* IOT consideration */\n\t\t\tif (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {\n\t\t\t\t/* if peer is cisco and didn't use ofdm rate, we enable 6M ack */\n\t\t\t\tif((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)\n\t\t\t\t\tBrateCfg |= RRSR_6M;\n\t\t\t}\n\t\t\tioted = BrateCfg;\n\n\t\t\tpHalData->BasicRateSet = BrateCfg;\n\n\t\t\tDBG_8192C(\"HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\\n\", input_b, masked, ioted);\n\n\t\t\t// Set RRSR rate table.\n\t\t\trtw_write16(padapter, REG_RRSR, BrateCfg);\n\t\t\trtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_TXPAUSE:\n\t\t\trtw_write8(padapter, REG_TXPAUSE, *pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BCN_FUNC:\n\t\t\thw_var_set_bcn_func(padapter, variable, pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CORRECT_TSF:\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\thw_var_set_correct_tsf(padapter, variable, pval);\n#else //CONFIG_CONCURRENT_MODE\n\t\t\t{\n\t\t\t\tu64\ttsf;\n\t\t\t\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\t\t\t\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t\t\t\t//tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us\n\t\t\t\ttsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us\n\n\t\t\t\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\t//pHalData->RegTxPause |= STOP_BCNQ;BIT(6)\n\t\t\t\t\t//rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)|BIT(6)));\n\t\t\t\t\tStopTxBeacon(padapter);\n\t\t\t\t}\n\n\t\t\t\t//disable related TSF function\n\t\t\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3)));\n\t\t\t\t//select port0 tsf\n\t\t\t\trtw_write8(padapter, REG_BCN_INTERVAL+3, rtw_read8(padapter, REG_BCN_INTERVAL+3)&0x8f);\n\t\t\t\trtw_write32(padapter, REG_TSFTR, tsf);\n\t\t\t\trtw_write32(padapter, REG_TSFTR+4, tsf>>32);\n\n\t\t\t\t//enable related TSF function\n\t\t\t\trtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3));\n\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\tif(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE))\n\t\t\t\t{\n\t\t\t\t\t//pHalData->RegTxPause  &= (~STOP_BCNQ);\n\t\t\t\t\t//rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)&(~BIT(6))));\n\t\t\t\t\tResumeTxBeacon(padapter);\n\t\t\t\t}\n\t\t\t}\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CHECK_BSSID:\n\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\tif (*pval)\n\t\t\t\tval32 |= RCR_CBSSID_DATA|RCR_CBSSID_BCN;\n\t\t\telse\n\t\t\t\tval32 &= ~(RCR_CBSSID_DATA|RCR_CBSSID_BCN);\n\t\t\trtw_write32(padapter, REG_RCR, val32);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MLME_DISCONNECT:\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\thw_var_set_mlme_disconnect(padapter, variable, pval);\n#else\n\t\t\t{\n\t\t\t\t// Set RCR to not to receive data frame when NO LINK state\n//\t\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n//\t\t\t\tval32 &= ~RCR_ADF;\n//\t\t\t\trtw_write32(padapter, REG_RCR, val32);\n\n\t\t\t\t// reject all data frames\n\t\t\t\trtw_write16(padapter, REG_RXFLTMAP2, 0x00);\n\n\t\t\t\t// reset TSF\n\t\t\t\tval8 = BIT(0) | BIT(1);\n\t\t\t\trtw_write8(padapter, REG_DUAL_TSF_RST, val8);\n\n\t\t\t\t// disable update TSF\n\t\t\t\tval8 = rtw_read8(padapter, REG_BCN_CTRL);\n\t\t\t\tval8 |= BIT(4);\n\t\t\t\trtw_write8(padapter, REG_BCN_CTRL, val8);\n\t\t\t}\n#endif\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MLME_SITESURVEY:\n\t\t\thw_var_set_mlme_sitesurvey(padapter, variable,  pval);\n\n#ifdef CONFIG_BT_COEXIST\n\t\t\tif (_TRUE == pHalData->EEPROMBluetoothCoexist)\n\t\t\t        rtw_btcoex_ScanNotify(padapter, *pval?_TRUE:_FALSE);\n#endif\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MLME_JOIN:\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\thw_var_set_mlme_join(padapter, variable, pval);\n#else // !CONFIG_CONCURRENT_MODE\n\t\t\t{\n\t\t\t\tu8 RetryLimit = 0x30;\n\t\t\t\tu8 type = *(u8*)pval;\n\t\t\t\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\t\n\t\t\t\tif (type == 0) // prepare to join\n\t\t\t\t{\n\t\t\t\t\t//enable to rx data frame.Accept all data frame\n\t\t\t\t\t//rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF);\n\t\t\t\t\trtw_write16(padapter, REG_RXFLTMAP2, 0xFFFF);\n\n\t\t\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\t\t\tif (padapter->in_cta_test)\n\t\t\t\t\t\tval32 &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN);//| RCR_ADF\n\t\t\t\t\telse\n\t\t\t\t\t\tval32 |= RCR_CBSSID_DATA|RCR_CBSSID_BCN;\n\t\t\t\t\trtw_write32(padapter, REG_RCR, val32);\n\n\t\t\t\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t\t\t\t\t{\n\t\t\t\t\t\tRetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48;\n\t\t\t\t\t}\n\t\t\t\t\telse // Ad-hoc Mode\n\t\t\t\t\t{\n\t\t\t\t\t\tRetryLimit = 0x7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (type == 1) //joinbss_event call back when join res < 0\n\t\t\t\t{\n\t\t\t\t\trtw_write16(padapter, REG_RXFLTMAP2, 0x00);\n\t\t\t\t}\n\t\t\t\telse if (type == 2) //sta add event call back\n\t\t\t\t{\n\t\t\t\t\t//enable update TSF\n\t\t\t\t\tval8 = rtw_read8(padapter, REG_BCN_CTRL);\n\t\t\t\t\tval8 &= ~BIT(4);\n\t\t\t\t\trtw_write8(padapter, REG_BCN_CTRL, val8);\n\n\t\t\t\t\tif (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))\n\t\t\t\t\t{\n\t\t\t\t\t\tRetryLimit = 0x7;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tval16 = RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT;\n\t\t\t\trtw_write16(padapter, REG_RL, val16);\n\t\t\t}\n#endif // !CONFIG_CONCURRENT_MODE\n\n#ifdef CONFIG_BT_COEXIST\n\t\t\tif (_TRUE == pHalData->EEPROMBluetoothCoexist)\t\t\t \n\t\t\t{\n\t\t\t\t\tswitch (*pval)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t// prepare to join\n\t\t\t\t\t\trtw_btcoex_ConnectNotify(padapter, _TRUE);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t// joinbss_event callback when join res < 0\n\t\t\t\t\t\trtw_btcoex_ConnectNotify(padapter, _FALSE);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t// sta add event callback\n\t//\t\t\t\t\trtw_btcoex_MediaStatusNotify(padapter, RT_MEDIA_CONNECT);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n#endif\n\t\t\tbreak;\n\n\t\tcase HW_VAR_ON_RCR_AM:\n\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\tval32 |= RCR_AM;\n\t\t\trtw_write32(padapter, REG_RCR, val32);\n\t\t\tDBG_8192C(\"%s, %d, RCR= %x\\n\", __FUNCTION__, __LINE__, rtw_read32(padapter, REG_RCR));\n\t\t\tbreak;\n\n\t\tcase HW_VAR_OFF_RCR_AM:\n\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\tval32 &= ~RCR_AM;\n\t\t\trtw_write32(padapter, REG_RCR, val32);\n\t\t\tDBG_8192C(\"%s, %d, RCR= %x\\n\", __FUNCTION__, __LINE__, rtw_read32(padapter, REG_RCR));\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BEACON_INTERVAL:\n\t\t\trtw_write16(padapter, REG_BCN_INTERVAL, *(u16*)pval);\n#ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\t{\n\t\t\t\tstruct mlme_ext_priv *pmlmeext;\n\t\t\t\tstruct mlme_ext_info *pmlmeinfo;\n\t\t\t\tu16 bcn_interval;\n\n\t\t\t\tpmlmeext = &padapter->mlmeextpriv;\n\t\t\t\tpmlmeinfo = &pmlmeext->mlmext_info;\n\t\t\t\tbcn_interval = *((u16*)pval);\n\n\t\t\t\tif ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"%s==> bcn_interval:%d, eraly_int:%d\\n\", __FUNCTION__, bcn_interval, bcn_interval>>1);\n\t\t\t\t\trtw_write8(padapter, REG_DRVERLYINT, bcn_interval>>1);// 50ms for sdio \n\t\t\t\t}\n\t\t\t}\n#endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t\tbreak;\n\n\t\tcase HW_VAR_SLOT_TIME:\n\t\t\trtw_write8(padapter, REG_SLOT, *pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_RESP_SIFS:\n\t\t\t// SIFS_Timer = 0x0a0a0808;\n\t\t\t// RESP_SIFS for CCK\n\t\t\trtw_write8(padapter, REG_RESP_SIFS_CCK, pval[0]); // SIFS_T2T_CCK (0x08)\n\t\t\trtw_write8(padapter, REG_RESP_SIFS_CCK+1, pval[1]); //SIFS_R2T_CCK(0x08)\n\t\t\t// RESP_SIFS for OFDM\n\t\t\trtw_write8(padapter, REG_RESP_SIFS_OFDM, pval[2]); //SIFS_T2T_OFDM (0x0a)\n\t\t\trtw_write8(padapter, REG_RESP_SIFS_OFDM+1, pval[3]); //SIFS_R2T_OFDM(0x0a)\n\t\t\tbreak;\n\n\t\tcase HW_VAR_ACK_PREAMBLE:\n\t\t\t{\n\t\t\t\tu8 bShortPreamble = *pval;\n\n\t\t\t\t// Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily)\n\t\t\t\tval8 = (pHalData->nCur40MhzPrimeSC) << 5;\n\t\t\t\tif (bShortPreamble)\n\t\t\t\t\tval8 |= 0x80;\n\t\t\t\trtw_write8(padapter, REG_RRSR+2, val8);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CAM_EMPTY_ENTRY:\n\t\t\t{\n\t\t\t\tu8 ucIndex = *pval;\n\t\t\t\tu8 i;\n\t\t\t\tu32\tulCommand = 0;\n\t\t\t\tu32\tulContent = 0;\n\t\t\t\tu32\tulEncAlgo = CAM_AES;\n\n\t\t\t\tfor (i=0; i<CAM_CONTENT_COUNT; i++)\n\t\t\t\t{\n\t\t\t\t\t// filled id in CAM config 2 byte\n\t\t\t\t\tif (i == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tulContent |= (ucIndex & 0x03) | ((u16)(ulEncAlgo)<<2);\n\t\t\t\t\t\t//ulContent |= CAM_VALID;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tulContent = 0;\n\t\t\t\t\t}\n\t\t\t\t\t// polling bit, and No Write enable, and address\n\t\t\t\t\tulCommand = CAM_CONTENT_COUNT*ucIndex+i;\n\t\t\t\t\tulCommand = ulCommand | CAM_POLLINIG | CAM_WRITE;\n\t\t\t\t\t// write content 0 is equall to mark invalid\n\t\t\t\t\trtw_write32(padapter, WCAMI, ulContent);  //rtw_mdelay_os(40);\n\t\t\t\t\trtw_write32(padapter, RWCAM, ulCommand);  //rtw_mdelay_os(40);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CAM_INVALID_ALL:\n\t\t\tval32 = BIT(31) | BIT(30);\n\t\t\trtw_write32(padapter, RWCAM, val32);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_AC_PARAM_VO:\n\t\t\trtw_write32(padapter, REG_EDCA_VO_PARAM, *(u32*)pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_AC_PARAM_VI:\n\t\t\trtw_write32(padapter, REG_EDCA_VI_PARAM, *(u32*)pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_AC_PARAM_BE:\n\t\t\tpHalData->AcParam_BE = *(u32*)pval;\n\t\t\trtw_write32(padapter, REG_EDCA_BE_PARAM, *(u32*)pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_AC_PARAM_BK:\n\t\t\trtw_write32(padapter, REG_EDCA_BK_PARAM, *(u32*)pval);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_ACM_CTRL:\n\t\t\t{\n\t\t\t\tu8 acm_ctrl;\n\t\t\t\tu8 AcmCtrl;\n\n\t\t\t\tacm_ctrl = *(u8*)pval;\n\t\t\t\tAcmCtrl = rtw_read8(padapter, REG_ACMHWCTRL);\n\n\t\t\t\tif (acm_ctrl > 1)\n\t\t\t\t\tAcmCtrl = AcmCtrl | 0x1;\n\n\t\t\t\tif (acm_ctrl & BIT(3))\n\t\t\t\t\tAcmCtrl |= AcmHw_VoqEn;\n\t\t\t\telse\n\t\t\t\t\tAcmCtrl &= (~AcmHw_VoqEn);\n\n\t\t\t\tif (acm_ctrl & BIT(2))\n\t\t\t\t\tAcmCtrl |= AcmHw_ViqEn;\n\t\t\t\telse\n\t\t\t\t\tAcmCtrl &= (~AcmHw_ViqEn);\n\n\t\t\t\tif (acm_ctrl & BIT(1))\n\t\t\t\t\tAcmCtrl |= AcmHw_BeqEn;\n\t\t\t\telse\n\t\t\t\t\tAcmCtrl &= (~AcmHw_BeqEn);\n\n\t\t\t\tDBG_8192C(\"[HW_VAR_ACM_CTRL] Write 0x%X\\n\", AcmCtrl);\n\t\t\t\trtw_write8(padapter, REG_ACMHWCTRL, AcmCtrl );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase HW_VAR_AMPDU_FACTOR:\n\t\t\t{\n\t\t\t\tu32\tAMPDULen = *(u8*)pval;\n\n\t\t\t\tRT_TRACE( COMP_MLME, DBG_LOUD, (\"SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\\n\" ,AMPDULen) );\n\n\t\t\t\tif(AMPDULen < VHT_AGG_SIZE_256K)\n\t\t\t\t\tAMPDULen = (0x2000 << (*((u8*)pval))) -1;\n\t\t\t\telse\n\t\t\t\t\tAMPDULen = 0x3ffff;\n\t\t\t\trtw_write32(padapter, REG_AMPDU_MAX_LENGTH_8814A, AMPDULen);\n\t\t\t\t//DBG_871X(\"SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\\n\" ,AMPDULen);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase HW_VAR_H2C_FW_PWRMODE:\n\t\t\t{\n\t\t\t\tu8 psmode = *pval;\n\t\t\t\trtl8814_set_FwPwrMode_cmd(padapter, psmode);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_H2C_FW_JOINBSSRPT:\n\t\t\trtl8814_set_FwJoinBssReport_cmd(padapter, *pval);\n\t\t\tbreak;\n\n#ifdef CONFIG_P2P_PS\n\t\tcase HW_VAR_H2C_FW_P2P_PS_OFFLOAD:\n\t\t\trtl8814_set_p2p_ps_offload_cmd(padapter, *pval);\n\t\t\tbreak;\n#endif // CONFIG_P2P_PS\n\n#ifdef CONFIG_TDLS\n\t\tcase HW_VAR_TDLS_WRCR:\n\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\tval32 &= ~RCR_CBSSID_DATA;\n\t\t\trtw_write32(padapter, REG_RCR, val32);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_TDLS_RS_RCR:\n\t\t\tval32 = rtw_read32(padapter, REG_RCR);\n\t\t\tval32 |= RCR_CBSSID_DATA;\n\t\t\trtw_write32(padapter, REG_RCR, val32);\n\t\t\tbreak;\n#endif // CONFIG_TDLS\n\n#ifdef CONFIG_SW_ANTENNA_DIVERSITY\n\t\tcase HW_VAR_ANTENNA_DIVERSITY_LINK:\n\t\t\t//SwAntDivRestAfterLink8192C(padapter);\n\t\t\tODM_SwAntDivRestAfterLink(podmpriv);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_ANTENNA_DIVERSITY_SELECT:\n\t\t\t{\n\t\t\t\tu8 Optimum_antenna = *pval;\n\t\t\t\tu8 \tAnt;\n\n\t\t\t\t//switch antenna to Optimum_antenna\n\t\t\t\t//DBG_8192C(\"==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\\n\",(Optimum_antenna==2)?\"A\":\"B\");\n\t\t\t\tif (pHalData->CurAntenna != Optimum_antenna)\n\t\t\t\t{\n\t\t\t\t\tAnt = (Optimum_antenna==2) ? MAIN_ANT : AUX_ANT;\n\t\t\t\t\tODM_UpdateRxIdleAnt(podmpriv, Ant);\n\n\t\t\t\t\tpHalData->CurAntenna = Optimum_antenna;\n\t\t\t\t\t//DBG_8192C(\"==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\\n\",(Optimum_antenna==2)?\"A\":\"B\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n#endif //CONFIG_SW_ANTENNA_DIVERSITY\n\n\t\tcase HW_VAR_EFUSE_USAGE:\n\t\t\tpHalData->EfuseUsedPercentage = *pval;\n\t\t\tbreak;\n\n\t\tcase HW_VAR_EFUSE_BYTES:\n\t\t\tpHalData->EfuseUsedBytes = *(u16*)pval;\n\t\t\tbreak;\n#if 0\n\t\tcase HW_VAR_EFUSE_BT_USAGE:\n#ifdef HAL_EFUSE_MEMORY\n\t\t\tpHalData->EfuseHal.BTEfuseUsedPercentage = *pval;\n#endif //HAL_EFUSE_MEMORY\n\t\t\tbreak;\n\n\t\tcase HW_VAR_EFUSE_BT_BYTES:\n#ifdef HAL_EFUSE_MEMORY\n\t\t\tpHalData->EfuseHal.BTEfuseUsedBytes = *(u16*)pval;\n#else //HAL_EFUSE_MEMORY\n\t\t\tBTEfuseUsedBytes = *(u16*)pval;\n#endif //HAL_EFUSE_MEMORY\n\t\t\tbreak;\n#endif //0\n\t\tcase HW_VAR_FIFO_CLEARN_UP:\n\t\t\t{\n\t\t\t\tstruct pwrctrl_priv *pwrpriv;\n\t\t\t\tu8 trycnt = 100;\t\n\n\t\t\t\tpwrpriv = adapter_to_pwrctl(padapter);\n\n\t\t\t\t// pause tx\n\t\t\t\trtw_write8(padapter, REG_TXPAUSE, 0xff);\n\n\t\t\t\t// keep sn\n\t\t\t\trtw_store_all_sta_hwseq(padapter);\n\n\t\t\t\tif (pwrpriv->bkeepfwalive != _TRUE)\n\t\t\t\t{\n\t\t\t\t\t// RX DMA stop\n\t\t\t\t\tval32 = rtw_read32(padapter, REG_RXPKT_NUM);\n\t\t\t\t\tval32 |= RW_RELEASE_EN;\n\t\t\t\t\trtw_write32(padapter, REG_RXPKT_NUM, val32);\n\t\t\t\t\tdo {\n\t\t\t\t\t\tval32 = rtw_read32(padapter, REG_RXPKT_NUM);\n\t\t\t\t\t\tval32 &= RXDMA_IDLE;\n\t\t\t\t\t\tif (val32)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t} while (--trycnt);\n\t\t\t\t\tif (trycnt == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_8192C(\"[HW_VAR_FIFO_CLEARN_UP] Stop RX DMA failed......\\n\");\n\t\t\t\t\t}\n\n\t\t\t\t\t//RQPN Load 0\n\t\t\t\t\trtw_write16(padapter, REG_RQPN_NPQ, 0x0);\n\t\t\t\t\trtw_write32(padapter, REG_RQPN, 0x80000000);\n\t\t\t\t\trtw_mdelay_os(10);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t\n\t\tcase HW_VAR_RESTORE_HW_SEQ:\n\t\t\trtw_restore_all_sta_hwseq(padapter);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CHECK_TXBUF:\n\t\t\t{\n\t\t\t\tu8 retry_limit;\n\t\t\t\tu32 reg_230 = 0, reg_234 = 0, reg_238 = 0, reg_23c = 0, reg_240 = 0;\n\t\t\t\tu32 init_reg_230 = 0, init_reg_234 = 0, init_reg_238 = 0, init_reg_23c = 0, init_reg_240 = 0;\n\t\t\t\tu32 start = rtw_get_current_time();\n\t\t\t\tu32 pass_ms;\n\t\t\t\tint i = 0;\n\n\t\t\t\tretry_limit = 0x01;\n\n\t\t\t\tval16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;\n\t\t\t\trtw_write16(padapter, REG_RL, val16);\n\n\t\t\t\twhile (rtw_get_passing_time_ms(start) < 2000\n\t\t\t\t\t&& !RTW_CANNOT_RUN(padapter)\n\t\t\t\t) {\n\t\t\t\t\treg_230 = rtw_read32(padapter, REG_FIFOPAGE_INFO_1_8814A);\n\t\t\t\t\treg_234 = rtw_read32(padapter, REG_FIFOPAGE_INFO_2_8814A);\n\t\t\t\t\treg_238 = rtw_read32(padapter, REG_FIFOPAGE_INFO_3_8814A);\n\t\t\t\t\treg_23c = rtw_read32(padapter, REG_FIFOPAGE_INFO_4_8814A);\n\t\t\t\t\treg_240 = rtw_read32(padapter, REG_FIFOPAGE_INFO_5_8814A);\n\n\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\tinit_reg_230 = reg_230;\n\t\t\t\t\t\tinit_reg_234 = reg_234;\n\t\t\t\t\t\tinit_reg_238 = reg_238;\n\t\t\t\t\t\tinit_reg_23c = reg_23c;\n\t\t\t\t\t\tinit_reg_240 = reg_240;\n\t\t\t\t\t}\n\n\t\t\t\t\ti++;\n\t\t\t\t\tif ((((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c))\n\t\t\t\t\t\t|| ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c))\n\t\t\t\t\t\t|| ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) {\n\t\t\t\t\t\t/* DBG_871X(\"%s: (HW_VAR_CHECK_TXBUF)TXBUF NOT empty - 0x230=0x%08x, 0x234=0x%08x 0x238=0x%08x,\"\n\t\t\t\t\t\t\" 0x23c=0x%08x, 0x240=0x%08x (%d)\\n\"\n\t\t\t\t\t\t, __FUNCTION__, reg_230, reg_234, reg_238, reg_23c, reg_240, i); */\n\t\t\t\t\t\trtw_msleep_os(10);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpass_ms = rtw_get_passing_time_ms(start);\n\n\t\t\t\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\t\t\tDBG_871X(\"bDriverStopped or bSurpriseRemoved\\n\");\n\t\t\t\t} else if (pass_ms >= 2000 || (((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c))\n\t\t\t\t\t\t|| ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c))\n\t\t\t\t\t\t|| ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) {\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s:(HW_VAR_CHECK_TXBUF)NOT empty(%d) in %d ms\\n\", __func__, i, pass_ms);\n\t\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"%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\n\t\t\t\t\t, init_reg_230, init_reg_234, init_reg_238, init_reg_23c, init_reg_240);\n\t\t\t\t\t//rtw_warn_on(1);\n\t\t\t\t} else {\n\t\t\t\t\tDBG_871X(\"%s:(HW_VAR_CHECK_TXBUF)TXBUF Empty(%d) in %d ms\\n\", __FUNCTION__, i, pass_ms);\n\t\t\t\t}\n\n\t\t\t\tretry_limit = 0x30;\n\t\t\t\tval16 = retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT;\n\t\t\t\trtw_write16(padapter, REG_RL, val16);\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase HW_VAR_H2C_MEDIA_STATUS_RPT:\n\t\t\t{\n\t\t\t\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\t\t\tRT_MEDIA_STATUS\tmstatus = *(u16*)pval & 0xFF;\n\n\t\t\t\trtl8814_set_FwMediaStatus_cmd(padapter, *(u16*)pval);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_APFM_ON_MAC:\n\t\t\tpHalData->bMacPwrCtrlOn = *pval;\n\t\t\tDBG_8192C(\"%s: bMacPwrCtrlOn=%d\\n\", __FUNCTION__, pHalData->bMacPwrCtrlOn);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_NAV_UPPER:\n\t\t\t{\n\t\t\t\tu32 usNavUpper = *((u32*)pval);\n\n\t\t\t\tif (usNavUpper > HAL_NAV_UPPER_UNIT * 0xFF)\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"%s: [HW_VAR_NAV_UPPER] set value(0x%08X us) is larger than (%d * 0xFF)!\\n\",\n\t\t\t\t\t\t__FUNCTION__, usNavUpper, HAL_NAV_UPPER_UNIT);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t// The value of ((usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT)\n\t\t\t\t// is getting the upper integer.\n\t\t\t\t//usNavUpper = (usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT;\n\t\t\t\trtw_write8(padapter, REG_NAV_UPPER, (u8)usNavUpper);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BCN_VALID:\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif (padapter->iface_type == IFACE_PORT1)\n\t\t\t{\n\t\t\t\t/* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */\n\t\t\t\tval8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3);\n\t\t\t\tval8 |= BIT(7);\n\t\t\t\trtw_write8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3, val8);\n\t\t\t}\n\t\t\telse\n#endif\n\t\t\t{\n\t\t\t\t/* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */\n\t\t\t\tval8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\t\t\t\tval8 |= BIT(7);\n\t\t\t\trtw_write8(padapter,  REG_FIFOPAGE_CTRL_2_8814A+1, val8);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_DL_BCN_SEL:\n#if 0 /* for MBSSID, so far we don't need this */\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif (IS_HARDWARE_TYPE_8821(padapter) && padapter->iface_type == IFACE_PORT1)\n\t\t\t{\n\t\t\t\t// SW_BCN_SEL - Port1\n\t\t\t\tval8 = rtw_read8(padapter, REG_AUTO_LLT_8814A);\n\t\t\t\tval8 |= BIT(2);\n\t\t\t\trtw_write8(padapter, REG_AUTO_LLT_8814A, val8);\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\t{\n\t\t\t\t/* SW_BCN_SEL - Port0 , BIT_r_EN_BCN_SW_HEAD_SEL */\n\t\t\t\tval8 = rtw_read8(padapter, REG_AUTO_LLT_8814A);\n\t\t\t\tval8 &= ~BIT(2);\n\t\t\t\trtw_write8(padapter, REG_AUTO_LLT_8814A, val8);\n\t\t\t}\n#endif /* for MBSSID, so far we don't need this */\n\t\t\tbreak;\n\n\t\tcase HW_VAR_WIRELESS_MODE:\n\t\t\t{\n\t\t\t\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\t\t\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\t\t\t\tstruct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;\n\t\t\t\tu8\tR2T_SIFS = 0, SIFS_Timer = 0;\n\t\t\t\tu8\twireless_mode = *pval;\n\n\t\t\t\tif ((wireless_mode == WIRELESS_11BG) || (wireless_mode == WIRELESS_11G))\n\t\t\t\t\tSIFS_Timer = 0xa;\n\t\t\t\telse\n\t\t\t\t\tSIFS_Timer = 0xe;\n\n\t\t\t\t// SIFS for OFDM Data ACK\n\t\t\t\trtw_write8(padapter, REG_SIFS_CTX+1, SIFS_Timer);\n\t\t\t\t// SIFS for OFDM consecutive tx like CTS data!\n\t\t\t\trtw_write8(padapter, REG_SIFS_TRX+1, SIFS_Timer);\n\t\t\t\t\n\t\t\t\trtw_write8(padapter,REG_SPEC_SIFS+1, SIFS_Timer);\n\t\t\t\trtw_write8(padapter,REG_MAC_SPEC_SIFS+1, SIFS_Timer);\n\n\t\t\t\t// 20100719 Joseph: Revise SIFS setting due to Hardware register definition change.\n\t\t\t\trtw_write8(padapter, REG_RESP_SIFS_OFDM+1, SIFS_Timer);\n\t\t\t\trtw_write8(padapter, REG_RESP_SIFS_OFDM, SIFS_Timer);\n\n\t\t\t\t//\n\t\t\t\t// Adjust R2T SIFS for IOT issue. Add by hpfan 2013.01.25\n\t\t\t\t// Set R2T SIFS to 0x0a for Atheros IOT. Add by hpfan 2013.02.22\n\t\t\t\t//\n\t\t\t\t// Mac has 10 us delay so use 0xa value is enough.\n\t\t\t\tR2T_SIFS = 0xa;\n#ifdef CONFIG_80211AC_VHT\n\t\t\t\tif (wireless_mode & WIRELESS_11_5AC &&\n\t\t\t\t\t\t//MgntLinkStatusQuery(Adapter)  && \n\t\t\t\t\t\tTEST_FLAG(pmlmepriv->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_RX) && \n\t\t\t\t\t\tTEST_FLAG(pmlmepriv->vhtpriv.stbc_cap, STBC_VHT_ENABLE_RX))\n\t\t\t\t{\t\t\n\t\t\t\t\tif (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS)\t\t\t\n\t\t\t\t\t\tR2T_SIFS = 0x8;\n\t\t\t\t\telse\n\t\t\t\t\t\tR2T_SIFS = 0xa;\n\t\t\t\t}\n#endif //CONFIG_80211AC_VHT\n\n\t\t\t\trtw_write8(padapter, REG_RESP_SIFS_OFDM+1, R2T_SIFS);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_DO_IQK:\n\t\t\tpHalData->bNeedIQK = _TRUE;\n\t\t\tbreak;\n\t\tcase HW_VAR_DL_RSVD_PAGE:\n#ifdef CONFIG_BT_COEXIST\n        if (pHalData->EEPROMBluetoothCoexist == 1)\n        {\n\t\t\tif (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t\t{\n\t\t\t\trtl8814a_download_BTCoex_AP_mode_rsvd_page(padapter);\n\t\t\t}\n        }\n#endif // CONFIG_BT_COEXIST\n                        break;\n#ifdef CONFIG_BEAMFORMING\n#if (BEAMFORMING_SUPPORT == 1) /*add by YuChen for PHYDM-TxBF AutoTest HW Timer*/\n\t\tcase HW_VAR_HW_REG_TIMER_INIT:\n\t\t{\n\t\t\tHAL_HW_TIMER_TYPE TimerType = (*(PHAL_HW_TIMER_TYPE)pval)>>16;\n\t\t\t\t\n\t\t\trtw_write8(padapter, 0x164, 1);\n\n\t\t\tif (TimerType == HAL_TIMER_TXBF)\n\t\t\t\trtw_write32(padapter, 0x15C, (*(pu2Byte)pval));\n\t\t\telse if (TimerType == HAL_TIMER_EARLYMODE)\n\t\t\t\trtw_write32(padapter, 0x160, 0x05000190);\t\n\t\t\tbreak;\n\t\t}\t\n\t\tcase HW_VAR_HW_REG_TIMER_START:\n\t\t{\n\t\t\tHAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval;\n\t\t\t\t\n\t\t\tif (TimerType == HAL_TIMER_TXBF)\n\t\t\t\trtw_write8(padapter, 0x15F, 0x5);\n\t\t\telse if (TimerType == HAL_TIMER_EARLYMODE)\n\t\t\t\trtw_write8(padapter, 0x163, 0x5);\t\t\t\n\t\t\tbreak;\t\n\t\t}\t\n\t\tcase HW_VAR_HW_REG_TIMER_RESTART:\n\t\t{\n\t\t\tHAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval;\n\t\t\t\t\n\t\t\tif (TimerType == HAL_TIMER_TXBF) {\n\t\t\t\t\trtw_write8(padapter, 0x15F, 0x0);\n\t\t\t\t\trtw_write8(padapter, 0x15F, 0x5);\n\t\t\t} else if (TimerType == HAL_TIMER_EARLYMODE) {\n\t\t\t\t\trtw_write8(padapter, 0x163, 0x0);\n\t\t\t\t\trtw_write8(padapter, 0x163, 0x5);\t\t\t\n\t\t\t}\n\t\t\tbreak;\n\t\t}\t\n\t\tcase HW_VAR_HW_REG_TIMER_STOP:\n\t\t{\n\t\t\tHAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval;\n\t\t\t\t\n\t\t\tif (TimerType == HAL_TIMER_TXBF)\n\t\t\t\trtw_write8(padapter, 0x15F, 0);\n\t\t\telse if (TimerType == HAL_TIMER_EARLYMODE)\n\t\t\t\trtw_write8(padapter, 0x163, 0x0);\t\t\n\t\t\tbreak;\n\t\t}\n#endif/*#if (BEAMFORMING_SUPPORT == 1) - for PHYDM TxBF*/\n#endif/*#ifdef CONFIG_BEAMFORMING*/\n\n\t\tcase HW_VAR_MACID_SLEEP:\n\t\t{\n\t\t\tu32 reg_macid_sleep;\n\t\t\tu8 bit_shift;\n\t\t\tu8 id = *(u8*)pval;\n\t\t\tu32 val32;\n\n\t\t\tif (id < 32) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP;\n\t\t\t\tbit_shift = id;\n\t\t\t} else if (id < 64) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_1;\n\t\t\t\tbit_shift = id-32;\n\t\t\t} else if (id < 96) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_2;\n\t\t\t\tbit_shift = id-64;\n\t\t\t} else if (id < 128) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_3;\n\t\t\t\tbit_shift = id-96;\n\t\t\t} else {\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tval32 = rtw_read32(padapter, reg_macid_sleep);\n\t\t\tDBG_8192C(FUNC_ADPT_FMT \": [HW_VAR_MACID_SLEEP] macid=%d, org reg_0x%03x=0x%08X\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);\n\n\t\t\tif (val32 & BIT(bit_shift))\n\t\t\t\tbreak;\n\n\t\t\tval32 |= BIT(bit_shift);\n\t\t\trtw_write32(padapter, reg_macid_sleep, val32);\n\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MACID_WAKEUP:\n\t\t{\n\t\t\tu32 reg_macid_sleep;\n\t\t\tu8 bit_shift;\n\t\t\tu8 id = *(u8*)pval;\n\t\t\tu32 val32;\n\n\t\t\tif (id < 32) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP;\n\t\t\t\tbit_shift = id;\n\t\t\t} else if (id < 64) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_1;\n\t\t\t\tbit_shift = id-32;\n\t\t\t} else if (id < 96) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_2;\n\t\t\t\tbit_shift = id-64;\n\t\t\t} else if (id < 128) {\n\t\t\t\treg_macid_sleep = REG_MACID_SLEEP_3;\n\t\t\t\tbit_shift = id-96;\n\t\t\t} else {\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tval32 = rtw_read32(padapter, reg_macid_sleep);\n\t\t\tDBG_8192C(FUNC_ADPT_FMT \": [HW_VAR_MACID_WAKEUP] macid=%d, org reg_0x%03x=0x%08X\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);\n\n\t\t\tif (!(val32 & BIT(bit_shift)))\n\t\t\t\tbreak;\n\n\t\t\tval32 &= ~BIT(bit_shift);\n\t\t\trtw_write32(padapter, reg_macid_sleep, val32);\n\t\t}\n\t\t\tbreak;\n#ifdef CONFIG_GPIO_WAKEUP\n\t\tcase HW_SET_GPIO_WL_CTRL:\n\t\t{\n\t\t\tu8 enable = *pval;\n\t\t\tu8 value = rtw_read8(padapter, 0x4e);\n\t\t\tif (enable && (value & BIT(6))) {\n\t\t\t\tvalue &= ~BIT(6);\n\t\t\t\trtw_write8(padapter, 0x4e, value);\n\t\t\t} else if (enable == _FALSE){\n\t\t\t\tvalue |= BIT(6);\n\t\t\t\trtw_write8(padapter, 0x4e, value);\n\t\t\t}\n\t\t\tDBG_871X(\"%s: set WL control, 0x4E=0x%02X\\n\",\n\t\t\t\t\t__func__, rtw_read8(padapter, 0x4e));\n\t\t}\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tSetHwReg(padapter, variable, pval);\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\nstruct qinfo_8814a {\n\tu32 head:8;\n\tu32 pkt_num:7;\n\tu32 tail:8;\n\tu32 ac:2;\n\tu32 macid:7;\n};\n\nstruct bcn_qinfo_8814a {\n\tu16 head:8;\n\tu16 pkt_num:8;\n};\n\nvoid dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag)\n{\n\t//if (info->pkt_num)\n\tDBG_871X_SEL_NL(sel, \"%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\\n\"\n\t\t, tag ? tag : \"\", info->head, info->tail, info->pkt_num, info->macid, info->ac\n\t);\n}\n\nvoid dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *tag)\n{\n\t//if (info->pkt_num)\n\tDBG_871X_SEL_NL(sel, \"%shead:0x%02x, pkt_num:%u\\n\"\n\t\t, tag ? tag : \"\", info->head, info->pkt_num\n\t);\n}\n\nvoid dump_mac_qinfo_8814a(void *sel, _adapter *adapter)\n{\n\tu32 q0_info;\n\tu32 q1_info;\n\tu32 q2_info;\n\tu32 q3_info;\n\tu32 q4_info;\n\tu32 q5_info;\n\tu32 q6_info;\n\tu32 q7_info;\n\tu32 mg_q_info;\n\tu32 hi_q_info;\n\tu16 bcn_q_info;\n\n\tq0_info = rtw_read32(adapter, REG_Q0_INFO);\n\tq1_info = rtw_read32(adapter, REG_Q1_INFO);\n\tq2_info = rtw_read32(adapter, REG_Q2_INFO);\n\tq3_info = rtw_read32(adapter, REG_Q3_INFO);\n\tq4_info = rtw_read32(adapter, REG_Q4_INFO);\n\tq5_info = rtw_read32(adapter, REG_Q5_INFO);\n\tq6_info = rtw_read32(adapter, REG_Q6_INFO);\n\tq7_info = rtw_read32(adapter, REG_Q7_INFO);\n\tmg_q_info = rtw_read32(adapter, REG_MGQ_INFO);\n\thi_q_info = rtw_read32(adapter, REG_HGQ_INFO);\n\tbcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO);\n\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q0_info, \"Q0 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q1_info, \"Q1 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q2_info, \"Q2 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q3_info, \"Q3 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q4_info, \"Q4 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q5_info, \"Q5 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q6_info, \"Q6 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&q7_info, \"Q7 \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&mg_q_info, \"MG \");\n\tdump_qinfo_8814a(sel, (struct qinfo_8814a *)&hi_q_info, \"HI \");\n\tdump_bcn_qinfo_8814a(sel, (struct bcn_qinfo_8814a *)&bcn_q_info, \"BCN \");\n}\n\nvoid GetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tPDM_ODM_T podmpriv;\n\tu8 val8;\n\tu16 val16;\n\tu32 val32;\n\n_func_enter_;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tpodmpriv = &pHalData->odmpriv;\n\n\tswitch (variable)\n\t{\n\t\tcase HW_VAR_TXPAUSE:\n\t\t\t*pval = rtw_read8(padapter, REG_TXPAUSE);\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BCN_VALID:\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif (padapter->iface_type == IFACE_PORT1)\n\t\t\t{\n\t\t\t\t/* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */\n\t\t\t\tval8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3);\n\t\t\t\t*pval = (BIT(7) & val8) ? _TRUE:_FALSE;\n\t\t\t}\n\t\t\telse\n#endif //CONFIG_CONCURRENT_MODE\n\t\t\t{\n\t\t\t\t/* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */\n\t\t\t\tval8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1);\n\t\t\t\t*pval = (BIT(7) & val8) ? _TRUE:_FALSE;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HW_VAR_FWLPS_RF_ON:\n\t\t\t//When we halt NIC, we should check if FW LPS is leave.\n\t\t\tif(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off)\n\t\t\t{\n\t\t\t\t// If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave,\n\t\t\t\t// because Fw is unload.\n\t\t\t\t*pval = _TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tu32 valRCR;\n\t\t\t\tvalRCR = rtw_read32(padapter, REG_RCR);\n\t\t\t\tvalRCR &= 0x00070000;\n\t\t\t\tif(valRCR)\n\t\t\t\t\t*pval = _FALSE;\n\t\t\t\telse\n\t\t\t\t\t*pval = _TRUE;\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\tcase HW_VAR_CURRENT_ANTENNA:\n\t\t\t*pval = pHalData->CurAntenna;\n\t\t\tbreak;\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n\t\tcase HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22.\n\t\t\t*(u16*)pval = pHalData->EfuseUsedBytes;\t\n\t\t\tbreak;\n\n\t\tcase HW_VAR_APFM_ON_MAC:\n\t\t\t*pval = pHalData->bMacPwrCtrlOn;\n\t\t\tbreak;\n\n\t\tcase HW_VAR_CHK_HI_QUEUE_EMPTY:\n\t\t\tval16 = rtw_read16(padapter, REG_TXPKT_EMPTY);\n\t\t\t*pval = (val16 & BIT(10)) ? _TRUE:_FALSE;\n\t\t\tbreak;\n\n\t\tcase HW_VAR_DUMP_MAC_QUEUE_INFO:\n\t\t\tdump_mac_qinfo_8814a(pval, padapter);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tGetHwReg(padapter, variable, pval);\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\n/*\n *\tDescription:\n *\t\tChange default setting of specified variable.\n */\nu8 SetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tu8 bResult;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tbResult = _SUCCESS;\n\n\tswitch (variable)\n\t{\n\t\tcase HAL_DEF_EFUSE_BYTES:\n\t\t\tpHalData->EfuseUsedBytes = *((u16*)pval);\n\t\t\tbreak;\n\t\tcase HAL_DEF_EFUSE_USAGE:\n\t\t\tpHalData->EfuseUsedPercentage = *((u8*)pval);\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbResult = SetHalDefVar(padapter, variable, pval);\n\t\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\n/*\n *\tDescription: \n *\t\tQuery setting of specified variable.\n */\nu8 GetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval)\n{\n\tPHAL_DATA_TYPE pHalData;\n\tu8 bResult;\n\n\n\tpHalData = GET_HAL_DATA(padapter);\n\tbResult = _SUCCESS;\n\n\tswitch (variable)\n\t{\n\t\t\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\tcase HAL_DEF_IS_SUPPORT_ANT_DIV:\n\t\t\t*((u8*)pval) = (pHalData->AntDivCfg==0) ? _FALSE : _TRUE;\n\t\t\tbreak;\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\t\tcase HAL_DEF_CURRENT_ANTENNA:\n\t\t\t*((u8*)pval) = pHalData->CurAntenna;\n\t\t\tbreak;\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n\t\tcase HAL_DEF_DRVINFO_SZ:\n\t\t\t*((u32*)pval) = DRVINFO_SZ;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_MAX_RECVBUF_SZ:\n\t\t\t*((u32*)pval) = MAX_RECVBUF_SZ;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_RX_PACKET_OFFSET:\n\t\t\t*((u32*)pval) = RXDESC_SIZE + DRVINFO_SZ*8;\n\t\t\tbreak;\n\n\t\tcase HW_VAR_MAX_RX_AMPDU_FACTOR:\n\t\t\t*((u32*)pval) = MAX_AMPDU_FACTOR_64K;\n\t\t\tbreak;\n\n\t\tcase HW_VAR_BEST_AMPDU_DENSITY:\n\t\t\t*((u32 *)pval) = AMPDU_DENSITY_VALUE_4;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_TX_LDPC:\n\t\t\t\t*(u8*)pval = _TRUE;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_RX_LDPC:\n\t\t\t\t*(u8*)pval = _TRUE;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_TX_STBC:\n\t\t\tif (pHalData->rf_type == RF_1T2R || pHalData->rf_type == RF_1T1R)\n\t\t\t\t*(u8 *)pval = 0;\n\t\t\telse\n\t\t\t\t*(u8 *)pval = 1;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_RX_STBC:\n\t\t\t*(u8*)pval = 1;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_EXPLICIT_BEAMFORMER:\n\t\t\tif (pHalData->rf_type != RF_1T2R || pHalData->rf_type != RF_1T1R)/*1T?R not support mer*/\n\t\t\t\t*((PBOOLEAN)pval) = _TRUE;\n\t\t\telse\n\t\t\t\t*((PBOOLEAN)pval) = _FALSE;\n\t\t\tbreak;\t\t\n\t\tcase HAL_DEF_EXPLICIT_BEAMFORMEE:\n\t\t\t*((PBOOLEAN)pval) = _TRUE;\n\t\t\tbreak;\n\n\t\tcase HW_DEF_RA_INFO_DUMP:\n#if 0\n\t\t\t{\n\t\t\t\tu8 mac_id = *(u8*)pval;\n\t\t\t\tu32 cmd ;\n\t\t\t\tu32 ra_info1, ra_info2;\n\t\t\t\tu32 rate_mask1, rate_mask2;\n\t\t\t\tu8 curr_tx_rate,curr_tx_sgi,hight_rate,lowest_rate;\t\t\t\t\n\t\t\t\t\n\t\t\t\tDBG_8192C(\"============ RA status check  Mac_id:%d ===================\\n\", mac_id);\n\n\t\t\t\tcmd = 0x40000100 |mac_id;\n\t\t\t\trtw_write32(padapter,REG_HMEBOX_E2_E3_8812,cmd);\n\t\t\t\trtw_msleep_os(10);\n\t\t\t\tra_info1 = rtw_read32(padapter,REG_RSVD5_8812);\n\t\t\t\tcurr_tx_rate = ra_info1&0x7F;\n\t\t\t\tcurr_tx_sgi = (ra_info1>>7)&0x01;\n\t\t\t\tDBG_8192C(\"[ ra_info1:0x%08x ] =>cur_tx_rate= %s,cur_sgi:%d, PWRSTS = 0x%02x  \\n\",\n\t\t\t\t\tra_info1,\t\t\t\t\t\t\n\t\t\t\t\tHDATA_RATE(curr_tx_rate),\n\t\t\t\t\tcurr_tx_sgi,\n\t\t\t\t\t(ra_info1>>8)  & 0x07);\n\n\t\t\t\tcmd = 0x40000400 | mac_id;\n\t\t\t\trtw_write32(padapter, REG_HMEBOX_E2_E3_8812,cmd);\n\t\t\t\trtw_msleep_os(10);\n\t\t\t\tra_info1 = rtw_read32(padapter, REG_RSVD5_8812);\n\t\t\t\tra_info2 = rtw_read32(padapter, REG_RSVD6_8812);\n\t\t\t\trate_mask1 = rtw_read32(padapter,REG_RSVD7_8812);\n\t\t\t\trate_mask2 = rtw_read32(padapter,REG_RSVD8_8812);\n\t\t\t\thight_rate = ra_info2&0xFF;\n\t\t\t\tlowest_rate = (ra_info2>>8)  & 0xFF;\t\n\t\t\t\tDBG_8192C(\"[ ra_info1:0x%08x ] =>RSSI=%d, BW_setting=0x%02x, DISRA=0x%02x, VHT_EN=0x%02x\\n\",\n\t\t\t\t\tra_info1,\n\t\t\t\t\tra_info1&0xFF,\n\t\t\t\t\t(ra_info1>>8)  & 0xFF,\n\t\t\t\t\t(ra_info1>>16) & 0xFF,\n\t\t\t\t\t(ra_info1>>24) & 0xFF);\n\t\t\t\t\t\n\t\t\t\tDBG_8192C(\"[ ra_info2:0x%08x ] =>hight_rate=%s, lowest_rate=%s, SGI=0x%02x, RateID=%d\\n\",\n\t\t\t\t\tra_info2,\n\t\t\t\t\tHDATA_RATE(hight_rate),\n\t\t\t\t\tHDATA_RATE(lowest_rate),\n\t\t\t\t\t(ra_info2>>16) & 0xFF,\n\t\t\t\t\t(ra_info2>>24) & 0xFF);\n\t\t\t\tDBG_8192C(\"rate_mask2=0x%08x, rate_mask1=0x%08x\\n\", rate_mask2, rate_mask1);\t\t\t\t\n\t\t\t}\n#else //0\n\t\t\tDBG_871X(\"%s,%d, 8814 need to fix \\n\", __FUNCTION__,__LINE__);\n#endif //0\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_TX_PAGE_SIZE:\n\t\t\t*(u32*)pval = PAGE_SIZE_128;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_TX_PAGE_BOUNDARY:\n\t\t\tif (!padapter->registrypriv.wifi_spec)\n\t\t\t{\n\t\t\t\t*(u16*)pval = TX_PAGE_BOUNDARY_8814A;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*(u16*)pval = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN:\n\t\t\t*(u16*)pval = TX_PAGE_BOUNDARY_WOWLAN_8814A;\n\t\t\tbreak;\n\n\t\tcase HAL_DEF_MACID_SLEEP:\n\t\t\t*(u8*)pval = _TRUE; // support macid sleep\n\t\t\tbreak;\n\t\tcase HAL_DEF_EFUSE_BYTES:\n\t\t\t*((u16*)(pval)) = pHalData->EfuseUsedBytes;\n\t\t\tbreak;\n\t\tcase HAL_DEF_EFUSE_USAGE:\n\t\t\t*((u32*)(pval)) = (pHalData->EfuseUsedPercentage<<16)|(pHalData->EfuseUsedBytes);\t\n\t\t\tbreak;\n\t\tcase HAL_DEF_RX_DMA_SZ_WOW:\n\t\t\t *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1;\n\t\t\tbreak;\n\t\tcase HAL_DEF_RX_DMA_SZ:\n\t\t\t *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1;\n\t\t\tbreak;\n\t\tcase HAL_DEF_RX_PAGE_SIZE:\n\t\t\t *((u32 *)pval) = 8;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbResult = GetHalDefVar(padapter, variable, pval);\n\t\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\ns32 c2h_id_filter_ccx_8814a(u8 *buf)\n{\n\tstruct c2h_evt_hdr_88xx *c2h_evt = (struct c2h_evt_hdr_88xx *)buf;\n\ts32 ret = _FALSE;\n\tif (c2h_evt->id == C2H_CCX_TX_RPT)\n\t\tret = _TRUE;\n\t\n\treturn ret;\n}\n\nstatic s32 c2h_handler_8814a(PADAPTER padapter, u8 *buf)\n{\n\tstruct c2h_evt_hdr_88xx *c2h_evt = (struct c2h_evt_hdr_88xx *)buf;\n\ts32 ret = _SUCCESS;\n\n\tif (c2h_evt == NULL) {\n\t\tDBG_8192C(\"%s c2h_evt is NULL\\n\",__FUNCTION__);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\tret = _C2HContentParsing8814(padapter, c2h_evt->id, c2h_evt->plen, c2h_evt->payload);\n\nexit:\n\treturn ret;\n}\n\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8812a_combo_card_WifiOnlyHwInit(PADAPTER pdapter)\n{\n \tu8  u1Tmp;\n\tDBG_871X(\"%s !\\n\", __FUNCTION__);\n\tif(IS_HARDWARE_TYPE_8812(pdapter))\n\t{\n\t\t//0x790[5:0]=0x5\n\t\tu1Tmp = rtw_read8(pdapter,0x790);\n\t\tu1Tmp = (u1Tmp & 0xb0) | 0x05 ;\n\t\trtw_write8(pdapter,0x790,u1Tmp);\n\t\t// PTA parameter\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0);\n\t\t//pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffffff);\n\t\t//pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555);\n\t\t//pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, 0x55555555);\n\t\trtw_write8(pdapter,0x6cc,0x0);\n\t\trtw_write32(pdapter,0x6c8,0xffffff);\n\t\trtw_write32(pdapter,0x6c4,0x55555555);\n\t\trtw_write32(pdapter,0x6c0,0x55555555);\n\n\t\t// coex parameters\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);\n\t\trtw_write8(pdapter,0x778,0x3);\n\t\t\n\t\t// enable counter statistics\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);\n\t\trtw_write8(pdapter,0x76e,0xc);\n\n\t\t// enable PTA\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20);\n\t\trtw_write8(pdapter,0x40, 0x20);\n\n\t\t// bt clock related\n\t\t//u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4);\n\t\t//u1Tmp |= BIT7;\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4, u1Tmp);\n\t\tu1Tmp = rtw_read8(pdapter,0x4);\n\t\tu1Tmp |= BIT7;\n\t\trtw_write8(pdapter,0x4, u1Tmp);\n\n\t\t// bt clock related\n\t\t//u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7);\n\t\t//u1Tmp |= BIT1;\n\t\t//pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp);\n\t\tu1Tmp = rtw_read8(pdapter,0x7);\n\t\tu1Tmp |= BIT1;\n\t\trtw_write8(pdapter,0x7, u1Tmp);\n\t}\n\n \n}\n#endif //CONFIG_BT_COEXIST\n\nvoid rtl8814_set_hal_ops(struct hal_ops *pHalFunc)\n{\n\tpHalFunc->dm_init = &rtl8814_init_dm_priv;\n\tpHalFunc->dm_deinit = &rtl8814_deinit_dm_priv;\n\n\tpHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8814A;\n\n\tpHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8814A;\n\tpHalFunc->read_chip_version = read_chip_version_8814a;\n\n\tpHalFunc->set_bwmode_handler = &PHY_SetBWMode8814;\n\tpHalFunc->set_channel_handler = &PHY_SwChnl8814;\n\tpHalFunc->set_chnl_bw_handler = &PHY_SetSwChnlBWMode8814;\n\n\tpHalFunc->set_tx_power_level_handler = &PHY_SetTxPowerLevel8814;\n\tpHalFunc->get_tx_power_level_handler = &PHY_GetTxPowerLevel8814;\n\n\tpHalFunc->hal_dm_watchdog = &rtl8814_HalDmWatchDog;\n\n\tpHalFunc->Add_RateATid = &rtl8814_Add_RateATid;\n\n\tpHalFunc->run_thread= &rtl8814_start_thread;\n\tpHalFunc->cancel_thread= &rtl8814_stop_thread;\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\tpHalFunc->AntDivBeforeLinkHandler = &AntDivBeforeLink8812;\n\tpHalFunc->AntDivCompareHandler = &AntDivCompare8812;\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n\tpHalFunc->read_bbreg = &PHY_QueryBBReg8814A;\n\tpHalFunc->write_bbreg = &PHY_SetBBReg8814A;\n\tpHalFunc->read_rfreg = &PHY_QueryRFReg8814A;\n\tpHalFunc->write_rfreg = &PHY_SetRFReg8814A;\n\n\n\t// Efuse related function\n\tpHalFunc->EfusePowerSwitch = &rtl8814_EfusePowerSwitch;\n\tpHalFunc->ReadEFuse = &rtl8814_ReadEFuse;\n\tpHalFunc->EFUSEGetEfuseDefinition = &rtl8814_EFUSE_GetEfuseDefinition;\n\tpHalFunc->EfuseGetCurrentSize = &rtl8814_EfuseGetCurrentSize;\n\tpHalFunc->Efuse_PgPacketRead = &rtl8814_Efuse_PgPacketRead;\n\tpHalFunc->Efuse_PgPacketWrite = &rtl8814_Efuse_PgPacketWrite;\n\tpHalFunc->Efuse_WordEnableDataWrite = &rtl8814_Efuse_WordEnableDataWrite;\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tpHalFunc->sreset_init_value = &sreset_init_value;\n\tpHalFunc->sreset_reset_value = &sreset_reset_value;\n\tpHalFunc->silentreset = &sreset_reset;\n\tpHalFunc->sreset_xmit_status_check = &rtl8814_sreset_xmit_status_check;\n\tpHalFunc->sreset_linked_status_check  = &rtl8814_sreset_linked_status_check;\n\tpHalFunc->sreset_get_wifi_status  = &sreset_get_wifi_status;\n\tpHalFunc->sreset_inprogress= &sreset_inprogress;\n#endif //DBG_CONFIG_ERROR_DETECT\n\n\tpHalFunc->GetHalODMVarHandler = GetHalODMVar;\n\tpHalFunc->SetHalODMVarHandler = SetHalODMVar;\n\tpHalFunc->hal_notch_filter = &hal_notch_filter_8814;\n\n\tpHalFunc->c2h_handler = c2h_handler_8814a;\n\tpHalFunc->c2h_id_filter_ccx = c2h_id_filter_ccx_8814a;\n\n\tpHalFunc->fill_h2c_cmd = &FillH2CCmd_8814;\n\tpHalFunc->fill_fake_txdesc = &rtl8814a_fill_fake_txdesc;\n#ifdef CONFIG_WOWLAN\n\tpHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8814;\n#endif //CONFIG_WOWLAN\n\tpHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8814;\n}\n\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_phycfg.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_PHYCFG_C_\n\n//#include <drv_types.h>\n\n#include <rtl8814a_hal.h>\n#include \"hal_com_h2c.h\"\n\n/*---------------------Define local function prototype-----------------------*/\n\n/*----------------------------Function Body----------------------------------*/\n//1   1. BB register R/W API\n\nu32\nPHY_QueryBBReg8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask\n\t)\n{\n\tu32\tReturnValue = 0, OriginalValue, BitShift;\n\n#if (DISABLE_BB_RF == 1)\n\treturn 0;\n#endif\n\n#if(SIC_ENABLE == 1)\n\treturn SIC_QueryBBReg(Adapter, RegAddr, BitMask);\n#endif\n\n\tOriginalValue = rtw_read32(Adapter, RegAddr);\n\tBitShift = PHY_CalculateBitShift(BitMask);\n\tReturnValue = (OriginalValue & BitMask) >> BitShift;\n\n\t//DBG_871X(\"BBR MASK=0x%x Addr[0x%x]=0x%x\\n\", BitMask, RegAddr, OriginalValue);\n\n\treturn (ReturnValue);\n}\n\n\nVOID\nPHY_SetBBReg8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t)\n{\n\tu32\t\t\tOriginalValue, BitShift;\n\n#if (DISABLE_BB_RF == 1)\n\treturn;\n#endif\n\n#if(SIC_ENABLE == 1)\n\tSIC_SetBBReg(Adapter, RegAddr, BitMask, Data);\n\treturn; \n#endif\n\n\tif(BitMask!= bMaskDWord)\n\t{//if not \"double word\" write\n\t\tOriginalValue = rtw_read32(Adapter, RegAddr);\n\t\tBitShift = PHY_CalculateBitShift(BitMask);\n\t\tData = ((OriginalValue) & (~BitMask)) |( ((Data << BitShift)) & BitMask);\n\t}\n\n\trtw_write32(Adapter, RegAddr, Data);\n\t\n\t//DBG_871X(\"BBW MASK=0x%x Addr[0x%x]=0x%x\\n\", BitMask, RegAddr, Data);\n}\n\n\n\nstatic\tu32\nphy_RFRead_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask\n\t)\n{\n\tu32\tDataAndAddr = 0;\n\tu32\tReadback_Value, Direct_Addr;\t\n\t\n\tRegAddr &= 0xff;\n\tswitch(eRFPath){\n\t\tcase ODM_RF_PATH_A:\n\t\t\tDirect_Addr = 0x2800+RegAddr*4;\n\t\tbreak;\n\t\tcase ODM_RF_PATH_B:\n\t\t\tDirect_Addr = 0x2c00+RegAddr*4;\n\t\tbreak;\n\t\tcase ODM_RF_PATH_C:\n\t\t\tDirect_Addr = 0x3800+RegAddr*4;\n\t\tbreak;\n\t\tcase ODM_RF_PATH_D:\n\t\t\tDirect_Addr = 0x3c00+RegAddr*4;\n\t\tbreak;\n\t\tdefault: //pathA\n\t\t\tDirect_Addr = 0x2800+RegAddr*4;\n\t\tbreak;\n\t}\n\t\n\n\tBitMask &= bRFRegOffsetMask;\n\t\n\tReadback_Value = PHY_QueryBBReg(Adapter, Direct_Addr, BitMask);\t\t\n\t//DBG_871X(\"RFR-%d Addr[0x%x]=0x%x\\n\", eRFPath, RegAddr, Readback_Value);\n\n\treturn Readback_Value;\n}\n\n\nstatic\tVOID\nphy_RFWrite_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu32\t\t\t\tData\n\t)\n{\n\tu32\t\t\t\t\t\tDataAndAddr = 0;\n\tHAL_DATA_TYPE\t\t\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tBB_REGISTER_DEFINITION_T\t\t*pPhyReg = &pHalData->PHYRegDef[eRFPath];\n\n\t// 2009/06/17 MH We can not execute IO for power save or other accident mode.\n\t//if(RT_CANNOT_IO(Adapter))\n\t//{\n\t\t//RT_DISP(FPHY, PHY_RFW, (\"phy_RFSerialWrite stop\\n\"));\n\t\t//return;\n\t//}\n\n\tOffset &= 0xff;\n\n\t// Shadow Update\n\t//PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data);\n\n\t// Put write addr in [27:20]  and write data in [19:00]\n\tDataAndAddr = ((Offset<<20) | (Data&0x000fffff)) & 0x0fffffff;\t\n\n\t// Write Operation \n\tPHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);\n\t//DBG_871X(\"RFW-%d Addr[0x%x]=0x%x\\n\", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr);\n}\n\n\nu32\nPHY_QueryRFReg8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask\n\t)\n{\n\tu32\tReadback_Value;\t\n\n#if (DISABLE_BB_RF == 1)\n\treturn 0;\n#endif\n\t\n\tReadback_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, BitMask);\n\n\treturn (Readback_Value);\n}\n\n\nVOID\nPHY_SetRFReg8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask,\n\tIN\tu32\t\t\t\tData\n\t)\n{\n\n#if (DISABLE_BB_RF == 1)\n\treturn;\n#endif\n\n\tif(BitMask == 0)\n\t\treturn;\n\n\tRegAddr &= 0xff;\n\t// RF data is 20 bits only\n\tif (BitMask != bLSSIWrite_data_Jaguar) {\n\t\tu32\t\t\tOriginal_Value, BitShift;\n\n\t\tOriginal_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, bLSSIWrite_data_Jaguar);\n\t\tBitShift =  PHY_CalculateBitShift(BitMask);\n\t\tData = ((Original_Value) & (~BitMask)) | (Data<< BitShift);\n\t}\n\t\n\tphy_RFWrite_8814A(Adapter, eRFPath, RegAddr, Data);\n\n\n}\n\n//\n// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.\n//\n\ns32 PHY_MACConfig8814(PADAPTER Adapter)\n{\n\tint\t\t\t\trtStatus = _FAIL;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\ts8\t\t\t\t*pszMACRegFile;\n\ts8\t\t\t\tsz8814MACRegFile[] = RTL8814A_PHY_MACREG;\n\n\tpszMACRegFile = sz8814MACRegFile;\n\n\n\t//\n\t// Config MAC\n\t//\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\trtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile);\n\tif (rtStatus == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\tODM_ConfigMACWithHeaderFile(&pHalData->odmpriv);\n\t\trtStatus = _SUCCESS;\n#endif//CONFIG_EMBEDDED_FWIMG\n\t}\n\n\treturn rtStatus;\n}\n\n\nstatic\tVOID\nphy_InitBBRFRegisterDefinition(\n\tIN\tPADAPTER\t\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\t\n\n\t// RF Interface Sowrtware Control\n\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870\n\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)\n\n\t// RF Interface Output (and Enable)\n\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860\n\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864\n\n\t// RF Interface (Output and)  Enable\n\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)\n\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)\n\n\tif(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))\n\t{\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; //LSSI Parameter\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar;\n\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar;  //wire control parameter2\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar;  //wire control parameter2\n\t}\n\telse\n\t{\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;\n\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;  //wire control parameter2\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;  //wire control parameter2\n\t}\n\n\tif(IS_HARDWARE_TYPE_8814A(Adapter))\n\t{\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_C].rf3wireOffset = rC_LSSIWrite_Jaguar2; //LSSI Parameter\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_D].rf3wireOffset = rD_LSSIWrite_Jaguar2;\n\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_C].rfHSSIPara2 = rHSSIRead_Jaguar;  //wire control parameter2\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_D].rfHSSIPara2 = rHSSIRead_Jaguar;  //wire control parameter2\n\t}\n\t\n\tif(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))\n\t{\n\t\t // Tranceiver Readback LSSI/HSPI mode \n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar;\n\t}\n\telse\n\t{\n\t\t// Tranceiver Readback LSSI/HSPI mode \n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;\n\t}\n\n\tif(IS_HARDWARE_TYPE_8814A(Adapter))\n\t{\n\t\t// Tranceiver Readback LSSI/HSPI mode \n\t\tpHalData->PHYRegDef[ODM_RF_PATH_C].rfLSSIReadBack = rC_SIRead_Jaguar2;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_D].rfLSSIReadBack = rD_SIRead_Jaguar2;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_C].rfLSSIReadBackPi = rC_PIRead_Jaguar2;\n\t\tpHalData->PHYRegDef[ODM_RF_PATH_D].rfLSSIReadBackPi = rD_PIRead_Jaguar2;\n\t}\n\n\t//pHalData->bPhyValueInitReady=TRUE;\n}\n\n\nint\nPHY_BBConfig8814(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tint\trtStatus = _SUCCESS;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\tTmpU1B=0;\n\n\tphy_InitBBRFRegisterDefinition(Adapter);\n\n    // . APLL_EN,,APLL_320_GATEB,APLL_320BIAS,  auto config by hw fsm after pfsm_go (0x4 bit 8) set\n\tTmpU1B = PlatformEFIORead1Byte(Adapter, REG_SYS_FUNC_EN_8814A);\n\n\tif(IS_HARDWARE_TYPE_8814AU(Adapter))\n\t\tTmpU1B |= FEN_USBA;\n\telse if(IS_HARDWARE_TYPE_8814AE(Adapter))\n\t\tTmpU1B |= FEN_PCIEA;\n\n\tPlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN, TmpU1B);\n\n\tTmpU1B = PlatformEFIORead1Byte(Adapter, 0x1002);\n\tPlatformEFIOWrite1Byte(Adapter, 0x1002, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));//same with 8812\n\n\t//6. 0x1f[7:0] = 0x07 PathA RF Power On\n\tPlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL0_8814A , 0x07);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a\n\t//7. 0x20[7:0] = 0x07 PathB RF Power On\n\t//8. 0x21[7:0] = 0x07 PathC RF Power On\n\tPlatformEFIOWrite2Byte(Adapter, REG_RF_CTRL1_8814A , 0x0707);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a    \n\t//9. 0x76[7:0] = 0x07 PathD RF Power On\n\tPlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL3_8814A , 0x7);\n\n\t//\n\t// Config BB and AGC\n\t//\n\trtStatus = phy_BB8814A_Config_ParaFile(Adapter);\n\n\thal_set_crystal_cap(Adapter, pHalData->CrystalCap);\n\t\n\tswitch (Adapter->registrypriv.rf_config) {\n\tcase RF_1T1R:\n\tcase RF_2T4R:\n\tcase RF_3T3R:\n\t\t/*RX CCK disable 2R CCA*/\n\t\tPHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0);\n\t\t/*pathB tx on, path A/C/D tx off*/\n\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4);\n\t\t/*pathB rx*/\n\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);\n\t\tbreak;\n\tdefault:\n\t\t/*RX CCK disable 2R CCA*/\n\t\tPHY_SetBBReg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0);\n\t\t/*pathB tx on, path A/C/D tx off*/\n\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4);\n\t\t/*pathB rx*/\n\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);\n\t\tDBG_871X(\"%s, unknown rf_config: %d\\n\", __func__, Adapter->registrypriv.rf_config);\n\t\tbreak;\n\t}\n\t\n\treturn rtStatus;\t\n}\n\ns32\nphy_BB8814A_Config_ParaFile(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\t\t\trtStatus = _SUCCESS;\n\n\ts8\t\t\t\tsz8814ABBRegFile[] = RTL8814A_PHY_REG;\t\n\ts8\t\t\t\tsz8814AAGCTableFile[] = RTL8814A_AGC_TAB;\n\ts8\t\t\t\tsz8814ABBRegPgFile[] = RTL8814A_PHY_REG_PG;\n\ts8\t\t\t\tsz8814RFTxPwrLmtFile[] = RTL8814A_TXPWR_LMT;\n\ts8\t\t\t\t*pszBBRegFile = NULL, *pszAGCTableFile = NULL, \n\t\t\t\t\t\t*pszBBRegPgFile = NULL, *pszRFTxPwrLmtFile = NULL, *pszBBRegMpFile=NULL;\n\t\n\t//DBG_871X(\"==>phy_BB8814A_Config_ParaFile\\n\");\n\n\tpszBBRegFile=sz8814ABBRegFile ;\n\tpszAGCTableFile =sz8814AAGCTableFile;\n\tpszBBRegPgFile = sz8814ABBRegPgFile;\n\tpszRFTxPwrLmtFile = sz8814RFTxPwrLmtFile;\n\n\tDBG_871X( \"EEEPROMRegulatory %d\\n\", pHalData->EEPROMRegulatory );\n\t//RT_TRACE( COMP_INIT, DBG_LOUD, ( \"Custom tx power limit file: %s\\n\", pMgntInfo->RegPwrLimitFile.Octet ) );\n\t//RT_TRACE( COMP_INIT, DBG_LOUD, ( \"Custom power by rate file: %s\\n\", pMgntInfo->RegPwrByRateFile.Octet ) );\n\n\t//DBG_871X(\" ===> phy_BB8814A_Config_ParaFile() phy_reg:%s\\n\",pszBBRegFile);\n\t//DBG_871X(\" ===> phy_BB8814A_Config_ParaFile() phy_reg_pg:%s\\n\",pszBBRegPgFile);\n\t//DBG_871X(\" ===> phy_BB8814A_Config_ParaFile() agc_table:%s\\n\",pszAGCTableFile);\n\n\n\t// Read Tx Power Limit \n\tPHY_InitTxPowerLimit( Adapter );\n\tif ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 || \n\t     ( Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory == 1 ) )\n\t{\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\tif (PHY_ConfigRFWithPowerLimitTableParaFile( Adapter, pszRFTxPwrLmtFile )== _FAIL)\n#endif\n\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\tif (HAL_STATUS_SUCCESS != ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_TXPWR_LMT, (ODM_RF_RADIO_PATH_E)0))\n\t\t\t\trtStatus = _FAIL;\n#endif\n\t\t}\n\n\t\tif(rtStatus != _SUCCESS){\n\t\t\tDBG_871X(\"%s():Read Tx power limit fail\\n\",__FUNCTION__\t);\n\t\t\tgoto phy_BB_Config_ParaFile_Fail;\n\t\t}\n\t}\n\n\t// Read PHY_REG.TXT BB INIT!!\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tif (phy_ConfigBBWithParaFile(Adapter, pszBBRegFile, CONFIG_BB_PHY_REG) == _FAIL)\n#endif\n\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\tif (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG))\n\t\t\trtStatus = _FAIL;\n#endif\n\t}\n\n\tif(rtStatus != _SUCCESS){\n\t\tDBG_871X(\"%s(): CONFIG_BB_PHY_REG Fail!!\\n\",__FUNCTION__\t);\n\t\tgoto phy_BB_Config_ParaFile_Fail;\n\t}\n\n\t// Read PHY_REG_MP.TXT BB INIT!!\n#if (MP_DRIVER == 1)\n\tif (Adapter->registrypriv.mp_mode == 1) {\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\tif (phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile) == _FAIL)\n#endif\n\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\tif (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP))\n\t\t\t\trtStatus = _FAIL;\n#endif\n\t\t}\n\n\t\tif(rtStatus != _SUCCESS){\n\t\t\tDBG_871X(\"phy_BB8812_Config_ParaFile():Write BB Reg MP Fail!!\\n\");\n\t\t\tgoto phy_BB_Config_ParaFile_Fail;\n\t\t}\n\t}\n#endif\t// #if (MP_DRIVER == 1)\n\n\t// If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt\n\tPHY_InitTxPowerByRate( Adapter );\n\tif ( Adapter->registrypriv.RegEnableTxPowerByRate == 1 || \n\t     ( Adapter->registrypriv.RegEnableTxPowerByRate == 2 && pHalData->EEPROMRegulatory != 2 ) )\n\t{\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\tif (phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile) == _FAIL)\n#endif\n\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\tif (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_PG))\n\t\t\t\trtStatus = _FAIL;\n#endif\n\t\t}\n\n\t\tif ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE )\n\t\t\tPHY_TxPowerByRateConfiguration( Adapter );\n\n\t\tif ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 || \n\t         ( Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory == 1 ) )\n\t\t\tPHY_ConvertTxPowerLimitToPowerIndex( Adapter );\n\n\t\tif(rtStatus != _SUCCESS){\n\t\t\tDBG_871X(\"%s(): CONFIG_BB_PHY_REG_PG Fail!!\\n\",__FUNCTION__\t);\n\t\t\tgoto phy_BB_Config_ParaFile_Fail;\n\t\t}\n\t}\n\n\t// BB AGC table Initialization\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tif (phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile, CONFIG_BB_AGC_TAB) == _FAIL)\n#endif\n\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\tif (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))\n\t\t\trtStatus = _FAIL;\n#endif\n\t}\n\n\tif(rtStatus != _SUCCESS){\n\t\tDBG_871X(\"%s(): CONFIG_BB_AGC_TAB Fail!!\\n\",__FUNCTION__\t);\n\t}\n\nphy_BB_Config_ParaFile_Fail:\n\n\treturn rtStatus;\n\n}\n\n\nVOID\nphy_ADC_CLK_8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu32\t\t\tMAC_REG_520, BB_REG_8FC, BB_REG_808, RXIQC[4];\n\tu32\t\t\tSearch_index = 0, MAC_Active = 1;\n\tu32\t\t\tRXIQC_REG[2][4] = {{0xc10, 0xe10, 0x1810, 0x1a10}, {0xc14, 0xe14, 0x1814, 0x1a14}} ;\n\n\tif (GET_CVID_CUT_VERSION(pHalData->VersionID) != A_CUT_VERSION)\n\t\treturn;\n\n//1 Step1. MAC TX pause\n\tMAC_REG_520 = PHY_QueryBBReg( Adapter, 0x520, bMaskDWord);\n\tBB_REG_8FC = PHY_QueryBBReg( Adapter, 0x8fc, bMaskDWord);\n\tBB_REG_808 = PHY_QueryBBReg( Adapter, 0x808, bMaskDWord);\n\tPHY_SetBBReg(Adapter, 0x520, bMaskByte2, 0x3f);\n\t\n//1 Step 2. Backup RXIQC & RXIQC = 0\n\tfor(Search_index = 0; Search_index<4; Search_index++){\n\t\tRXIQC[Search_index] = PHY_QueryBBReg( Adapter, RXIQC_REG[0][Search_index], bMaskDWord);\n\t\tPHY_SetBBReg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, 0x0);\n\t\tPHY_SetBBReg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x0);\n\t}\n\tPHY_SetBBReg(Adapter, 0xa14, 0x00000300, 0x3);\n\tSearch_index = 0;\n\t\n//1 Step 3. Monitor MAC IDLE\n\tPHY_SetBBReg(Adapter, 0x8fc, bMaskDWord, 0x0);\n\twhile(MAC_Active){\n\t\tMAC_Active = PHY_QueryBBReg( Adapter, 0xfa0, bMaskDWord) & (0x803e0008);\n\t\tSearch_index++;\n\t\tif(Search_index>1000){\n\t\t\tbreak;\n\t\t}\n\t}\n\n//1 Step 4. ADC clk flow\n\tPHY_SetBBReg(Adapter, 0x808, bMaskByte0, 0x11);\n\tPHY_SetBBReg(Adapter, 0x90c, BIT(13), 0x1);\n\tPHY_SetBBReg(Adapter, 0x764, BIT(10)|BIT(9), 0x3);\n\tPHY_SetBBReg(Adapter, 0x804, BIT(2), 0x1);\n\n\t// 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be written when bbrstb=0         \n\t// 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line              \n\t// 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut          \n\n\t// power_off/clk_off @ anapar_state=idle mode\n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x15800002);\t//0xc60       0x15808002    \n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x01808003);\t//0xc60       0x01808003\n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x15800002);\t//0xe60      0x15808002    \n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x01808003);\t//0xe60      0x01808003    \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x15800002);\t//0x1860    0x15808002    \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x01808003);\t//0x1860    0x01808003    \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x15800002);\t//0x1a60    0x15808002        \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x01808003);\t//0x1a60    0x01808003     \n \n\tPHY_SetBBReg(Adapter, 0x764, BIT(10), 0x0);\n\tPHY_SetBBReg(Adapter, 0x804, BIT(2), 0x0);\n\tPHY_SetBBReg(Adapter, 0xc5c, bMaskDWord,  0x0D080058);\t//0xc5c       0x00080058  // [19] =1 to turn off ADC  \n\tPHY_SetBBReg(Adapter, 0xe5c, bMaskDWord,  0x0D080058);\t//0xe5c       0x00080058  // [19] =1 to turn off ADC     \n\tPHY_SetBBReg(Adapter, 0x185c, bMaskDWord,  0x0D080058);\t//0x185c     0x00080058 // [19] =1 to turn off ADC    \n\tPHY_SetBBReg(Adapter, 0x1a5c, bMaskDWord,  0x0D080058);\t//0x1a5c     0x00080058 // [19] =1 to turn off ADC       \n \n\t// power_on/clk_off \n\t//PHY_SetBBReg(Adapter, 0x764, BIT(10), 0x1);\n\tPHY_SetBBReg(Adapter, 0xc5c, bMaskDWord,  0x0D000058);\t//0xc5c       0x0D000058   // [19] =0 to turn on ADC    \n\tPHY_SetBBReg(Adapter, 0xe5c, bMaskDWord,  0x0D000058);\t//0xe5c       0x0D000058  // [19] =0 to turn on ADC     \n\tPHY_SetBBReg(Adapter, 0x185c, bMaskDWord,  0x0D000058);\t//0x185c     0x0D000058  // [19] =0 to turn on ADC     \n\tPHY_SetBBReg(Adapter, 0x1a5c, bMaskDWord,  0x0D000058);\t//0x1a5c     0x0D000058 // [19] =0 to turn on ADC       \n\n\t// power_on/clk_on @ anapar_state=BT mode\n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x05808032);\t//0xc60 0x05808002 \n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x05808032);\t//0xe60 0x05808002           \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x05808032);\t//0x1860 0x05808002    \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x05808032);\t//0x1a60 0x05808002            \n       PHY_SetBBReg(Adapter, 0x764, BIT(10), 0x1);\n\tPHY_SetBBReg(Adapter, 0x804, BIT(2), 0x1);\n\n\t// recover original setting @ anapar_state=BT mode                              \n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x05808032);\t//0xc60       0x05808036    \n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x05808032);\t//0xe60      0x05808036    \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x05808032);\t//0x1860    0x05808036    \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x05808032);\t//0x1a60    0x05808036        \n\n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x05800002);\t//0xc60       0x05800002    \n\tPHY_SetBBReg(Adapter, 0xc60, bMaskDWord, 0x07808003);\t//0xc60       0x07808003\n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x05800002);\t//0xe60      0x05800002    \n\tPHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0x07808003);\t//0xe60      0x07808003    \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x05800002);\t//0x1860    0x05800002    \n\tPHY_SetBBReg(Adapter, 0x1860, bMaskDWord, 0x07808003);\t//0x1860    0x07808003    \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x05800002);\t//0x1a60    0x05800002        \n\tPHY_SetBBReg(Adapter, 0x1a60, bMaskDWord, 0x07808003);\t//0x1a60    0x07808003     \n\n\tPHY_SetBBReg(Adapter, 0x764, BIT(10)|BIT(9), 0x0);\n\tPHY_SetBBReg(Adapter, 0x804, BIT(2), 0x0);\n\tPHY_SetBBReg(Adapter, 0x90c, BIT(13), 0x0);\n\n//1 Step 5. Recover MAC TX & IQC\n\tPHY_SetBBReg(Adapter, 0x520, bMaskDWord, MAC_REG_520);\n\tPHY_SetBBReg(Adapter, 0x8fc, bMaskDWord, BB_REG_8FC);\n\tPHY_SetBBReg(Adapter, 0x808, bMaskDWord, BB_REG_808);\n\tfor(Search_index = 0; Search_index<4; Search_index++){\n\t\tPHY_SetBBReg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, RXIQC[Search_index]);\n\t\tPHY_SetBBReg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x01000000);\n\t}\n\tPHY_SetBBReg(Adapter, 0xa14, 0x00000300, 0x0);\n}\n\nVOID\nPHY_ConfigBB_8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\" ===> PHY_ConfigBB_8814A() \\n\"));\n\tPHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3);\n}\n\n\n\n//2 3.3 RF Config\n\ns32\nPHY_RFConfig8814A(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\trtStatus = _SUCCESS;\n\n\t//vivi added this, 20100610\n\tif (rtw_is_surprise_removed(Adapter))\n\t\treturn _FAIL;\n\n\tswitch(pHalData->rf_chip)\n\t{\n\t\tcase RF_PSEUDO_11N:\n\t\t\tDBG_871X(\"%s(): RF_PSEUDO_11N\\n\",__FUNCTION__);\n\t\t\tbreak;\n\t\tdefault: \n\t\t\trtStatus = PHY_RF6052_Config_8814A(Adapter);\n\t\t\tbreak;\n\t}\n\n\treturn rtStatus;\n}\n\n#if (MP_DRIVER == 1)\n\nRT_STATUS PHY_BBConfigMP_8814A(PADAPTER\tAdapter)\n{\n\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n \tRT_STATUS\t\t\trtStatus = RT_STATUS_FAILURE;\n\ts1Byte\t\t\t\tsz8814ABBRegMpFile[] = RTL8814A_PHY_REG_MP;\n\tps1Byte \t\t\tpszBBRegMpFile=NULL;\n\n\tpszBBRegMpFile = sz8814ABBRegMpFile;\n\n\tDBG_871X(\" ===> PHY_BBConfigMP_8814A() phy_reg_mp:%s\\n\",pszBBRegMpFile);\n\t\n\t//3 Read PHY_REG_MP.TXT BB INIT!!\n//#if\tLOAD_PHY_PARA_FROM_HEADER\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP);\n\trtStatus = RT_STATUS_SUCCESS;\n#else\n\trtStatus = phy_ConfigBBWithMpParaFile(Adapter,pszBBRegMpFile);\n#endif\n\n\treturn rtStatus;\n}\n\n#endif\n\n\n//1 4. RF State setting API\n\n/*  todo\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\n//\n// 2009/11/03 MH add for LPS mode power save sequence.\n// 2009/11/03 According to document V10.\n// 2009/11/24 According to document V11. by tynli.\n//\nVOID\nphy_SetRTL8814ERfOn(\n\tIN\tPADAPTER\t\t\tAdapter\n)\n{\n\trtw_write8(Adapter, REG_SPS0_CTRL_8814A, 0x2b);\n\n\t// c.\tFor PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3\t//enable BB TRX function\n\t//\tFor USB: SYS_FUNC_EN 0x02[7:0] = 0x17\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3);\n#else\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17);\n#endif\n\n\t// RF_ON_EXCEP(d~g):\n\t// d.\tAPSD_CTRL 0x600[7:0] = 0x00\n\t//rtw_write8(Adapter, REG_APSD_CTRL, 0x00);\n\n\t// e.\tFor PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2\t//reset BB TRX function again\n\t//f.\tFor PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3\t//enable BB TRX function\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE2);\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3);\n#else\n\t// e.For USB: SYS_FUNC_EN 0x02[7:0] = 0x16\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x16);\n\t// f. For USB: SYS_FUNC_EN 0x02[7:0] = 0x17\n\trtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17);\n#endif\n\n\t// g.\tTXPAUSE 0x522[7:0] = 0x00\t\t\t\t//enable MAC TX queue\n\trtw_write8(Adapter, REG_TXPAUSE_8814A, 0x00);\n}\t// phy_SetRTL8188EERfSleep\n\n\nBOOLEAN\nphy_SetRFPowerState_8814E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\trt_rf_power_state\teRFPowerState\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tBOOLEAN\t\t\tbResult = TRUE;\n\tu8\t\t\ti, QueueID;\n\tPRT_POWER_SAVE_CONTROL\tpPSC = GET_POWER_SAVE_CONTROL(pMgntInfo);\n\t\n\tpHalData->SetRFPowerStateInProgress = TRUE;\n\n\tswitch( eRFPowerState )\n\t{\n\t\t//\n\t\t// SW radio on/IPS site survey call will execute all flow\n\t\t// HW radio on\n\t\t//\n\t\tcase eRfOn:\n\t\t\t{\n\t\t\t#if(MUTUAL_AUTHENTICATION == 1)\n\t\t\t\tif(pHalData->MutualAuthenticationFail)\n\t\t\t\t\tbreak;\n\t\t\t#endif\n\t\t\t\tif((pHalData->eRFPowerState == eRfOff) && RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC))\n\t\t\t\t{ // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC.\n\t\t\t\t\ts32 rtstatus;\n\t\t\t\t\tu32 InitializeCount = 0;\n\t\t\t\t\tdo\n\t\t\t\t\t{\t\n\t\t\t\t\t\tInitializeCount++;\n\t\t\t\t\t\trtstatus = NicIFEnableNIC( Adapter );\n\t\t\t\t\t}while( (rtstatus != _SUCCESS) &&(InitializeCount <10) );\n\t\t\t\t\tRT_ASSERT(rtstatus == _SUCCESS,(\"Nic Initialize Fail\\n\"));\n\t\t\t\t\tRT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{ // This is the normal case, we just turn on the RF.\n\t\t\t\t\tphy_SetRTL8814ERfOn(Adapter);\n\t\t\t\t}\n\t\t\n\t\t\t\t// Turn on RF we are still linked, which might happen when \n\t\t\t\t// we quickly turn off and on HW RF. 2006.05.12, by rcnjko.\n\t\t\t\tif( pMgntInfo->bMediaConnect == TRUE )\n\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK);\n\t\t\t\telse // Turn off LED if RF is not ON.\n\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK);\n\t\t\t}\n\t\t\tbreak;\n\n\t\t// Card Disable/SW radio off/HW radio off/IPS enter call\n\t\tcase eRfOff:\n\t\t\t{\t\t\t\t\t\n\t\t\t\t// Make sure BusyQueue is empty befor turn off RFE pwoer.\n\t\t\t\tfor(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )\n\t\t\t\t{\n\t\t\t\t\tif(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID]))\n\t\t\t\t\t{\n\t\t\t\t\t\tQueueID++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse if(IsLowPowerState(Adapter))\n\t\t\t\t\t{\n\t\t\t\t\t\t\tRT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, \n\t\t\t\t\t\t\t(\"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\\n\", (i+1), QueueID));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, \n\t\t\t\t\t\t\t(\"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\\n\", (i+1), QueueID));\n\t\t\t\t\t\t\tPlatformStallExecution(10);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(i >= MAX_DOZE_WAITING_TIMES_9x)\n\t\t\t\t\t{\n\t\t\t\t\t\tRT_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));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC)\n\t\t\t\t{ // Disable all components.\n\t\t\t\t\tNicIFDisableNIC(Adapter);\n\n\t\t\t\t\tif(IS_HARDWARE_TYPE_8814AE(Adapter))\n\t\t\t\t\t\tNicIFEnableInterrupt(Adapter);\n\t\t\t\t\tRT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t} \n\t\t\t\telse\n\t\t\t\t{ // Normal case.\n\t\t\t\t\t//If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015\n\t\t\t\t\tif(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS )\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); \n\t\t\t\t\telse // Turn off LED if RF is not ON.\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); \n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tdefault:\n\t\tcase eRfSleep:// Not used LPS is running on FW\n\t\t\tbResult = FALSE;\n\t\t\tRT_ASSERT(FALSE, (\"phy_SetRFPowerState_8814E(): unknow state to set: 0x%X!!!\\n\", eRFPowerState));\n\t\t\tbreak;\n\t} \n\n\tif(bResult)\n\t{\n\t\t// Update current RF state variable.\n\t\tpHalData->eRFPowerState = eRFPowerState;\n\t}\n\t\n\tpHalData->SetRFPowerStateInProgress = FALSE;\n\n\treturn bResult;\n}\n\n#elif (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\nBOOLEAN\nphy_SetRFPowerState_8814U(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\trt_rf_power_state\teRFPowerState\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tBOOLEAN\t\t\tbResult = TRUE;\n\tu8\t\t\ti, QueueID;\n\tPRT_USB_DEVICE\t\t\t\tpDevice = GET_RT_USB_DEVICE(Adapter);\n\t\n\tif(pHalData->SetRFPowerStateInProgress == TRUE)\n\t\treturn FALSE;\n\t\n\tpHalData->SetRFPowerStateInProgress = TRUE;\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"======> phy_SetRFPowerState_8814U .\\n\"));\n\n\tswitch( eRFPowerState )\n\t{\n\t\tcase eRfOn:\n\t\t\tif((pHalData->eRFPowerState == eRfOff) &&\n\t\t\t\tRT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC))\n\t\t\t{ // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC.\n\t\t\t\tRT_TRACE(COMP_RF, DBG_LOUD, (\"======> phy_SetRFPowerState_8814U-eRfOn .\\n\"));\t\t\t\n\n\t\t\t\tif(!Adapter->bInHctTest)\n\t\t\t\t{\n\t\t\t\t\t// 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence\n\t\t\t\t\t// So disable the different RF on/off sequence for hidden AP.\n\t\t\t\t\tNicIFEnableNIC(Adapter);\n\t\t\t\t\tRT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t    \n\t\t// \n\t\t// In current solution, RFSleep=RFOff in order to save power under 802.11 power save.\n\t\t// By Bruce, 2008-01-16.\n\t\t//\n\t\tcase eRfSleep:\n\t\t\t{\n\t\t\t\t// ToDo:\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase eRfOff:\n\t\t\t// HW setting had been configured.\n\t\t\t// Both of these RF configures are the same, configuring twice may cause HW abnormal.\n\t\t\tif(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff)\n\t\t\t\tbreak;\n\t\t\trtw_write8(Adapter, 0xf015, 0x40);  //page added for usb3 bus\n\t\t\t// Make sure BusyQueue is empty befor turn off RFE pwoer.\n\t\t\tfor(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )\n\t\t\t{\n\t\t\t\tif(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID]))\n\t\t\t\t{\n\t\t\t\t\tQueueID++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_POWER, DBG_LOUD, (\"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\\n\", (i+1), QueueID));\n\t\t\t\t\tPlatformSleepUs(10);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(i >= MAX_DOZE_WAITING_TIMES_9x)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_POWER, DBG_LOUD, (\"\\n\\n\\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\\n\\n\\n\", MAX_DOZE_WAITING_TIMES_9x, QueueID));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\n\t\t\t// \n\t\t\t//RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon.\n\t\t\t// Added by \n\t\t\t//\n\t\t\t//==================================================================\t\t\t\t\n\t\t\t// CU will call card disable flow to set RF off, such that we call halt directly\n\t\t\t// and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases.\n\t\t\t// 2010.03.05. Added by tynli. \t\t\t\t\n\t\t\tif(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS ||\n\t\t\t\tpMgntInfo->RfOffReason & RF_CHANGE_BY_HW ||\n\t\t\t\tpMgntInfo->RfOffReason & RF_CHANGE_BY_SW)\n\t\t\t{\t//for HW/Sw radio off and IPS flow\n\t\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"======> CardDisableWithoutHWSM -eRfOff.\\n\"));\t\t\t\t\n\t\t\t\tif(!Adapter->bInHctTest)\n\t\t\t\t{\n\t\t\t\t\t// 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence\n\t\t\t\t\t// So disable the different RF on/off sequence for hidden AP.\n\t\t\t\t\tNicIFDisableNIC(Adapter);\n\t\t\t\t\tRT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbResult = FALSE;\n\t\t\tRT_ASSERT(FALSE, (\"phy_SetRFPowerState_8814U(): unknow state to set: 0x%X!!!\\n\", eRFPowerState));\n\t\t\tbreak;\n\t} \n\t\t\t\n\tif(bResult)\n\t{\n\t\t// Update current RF state variable.\n\t\tpHalData->eRFPowerState = eRFPowerState;\n\t\t\n\t\tswitch(pHalData->rf_chip )\n\t\t{\n\t\t\tdefault:\t\t\n\t\t\tswitch(pHalData->eRFPowerState)\n\t\t\t{\n\t\t\t\tcase eRfOff:\n\t\t\t\t\t//\n\t\t\t\t\t//If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015\n\t\t\t\t\t//\n\t\t\t\t\tif(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS )\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); \n\t\t\t\t\telse\t\t// Turn off LED if RF is not ON.\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); \n\t\t\t\t\tbreak;\n        \t\t\n\t\t\t\tcase eRfOn:\n\t\t\t\t\t// Turn on RF we are still linked, which might happen when \n\t\t\t\t\t// we quickly turn off and on HW RF. 2006.05.12, by rcnjko.\n\t\t\t\t\tif( pMgntInfo->bMediaConnect == TRUE )\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); \n\t\t\t\t\telse\t\t// Turn off LED if RF is not ON.\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK);\n\t\t\t\t\tbreak;\n        \t\t\n\t\t\t\tdefault:\n\t\t\t\t\t// do nothing.\n\t\t\t\t\tbreak;\n\t\t\t}// Switch RF state\n\n\t\t\tbreak;\n\t\t}// Switch rf_chip\n\t}\n\t\n\tpHalData->SetRFPowerStateInProgress = FALSE;\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"<====== phy_SetRFPowerState_8814U .\\n\"));\n\treturn bResult;\n}\n\n#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE\n\nBOOLEAN\nphy_SetRFPowerState_8814Sdio(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\trt_rf_power_state\teRFPowerState\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\tBOOLEAN\t\t\tbResult = TRUE;\n\tu8\t\t\ti, QueueID;\n\tPRT_SDIO_DEVICE\t\t\t\tpDevice = GET_RT_SDIO_DEVICE(Adapter);\n\t\n\tif(pHalData->SetRFPowerStateInProgress == TRUE)\n\t\treturn FALSE;\n\t\n\tpHalData->SetRFPowerStateInProgress = TRUE;\n\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"======> phy_SetRFPowerState_8814Sdio .\\n\"))\n\t\t\n\tswitch( eRFPowerState )\n\t{\n\t\tcase eRfOn:\n\t\t\tif((pHalData->eRFPowerState == eRfOff) &&\n\t\t\t\tRT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC))\n\t\t\t{ // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC.\n\t\t\t\tRT_TRACE(COMP_RF, DBG_LOUD, (\"======> phy_SetRFPowerState_8814Sdio-eRfOn .\\n\"));\t\t\t\n\n\t\t\t\tif(!Adapter->bInHctTest)\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t// 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence\n\t\t\t\t\t// So disable the different RF on/off sequence for hidden AP.\n\t\t\t\t\tNicIFEnableNIC(Adapter);\n\t\t\t\t\tRT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 2010/08/26 MH Prevent IQK to send out packet.\n\t\t\tif(pHalData->bIQKInitialized )\n\t\t\t\tPHY_IQCalibrate_8814A(Adapter, TRUE);\n\t\t\telse\n\t\t\t{\n\t\t\t\tPHY_IQCalibrate_8814A(Adapter,FALSE);\n\t\t\t\tpHalData->bIQKInitialized = _TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t    \n\t\t// \n\t\t// In current solution, RFSleep=RFOff in order to save power under 802.11 power save.\n\t\t// By Bruce, 2008-01-16.\n\t\t//\n\t\tcase eRfSleep:\n\t\t\t{\n\t\t\t\t// ToDo:\n\t\t\t}\n\t\t\tbreak;\n\t\t\t\n\t\tcase eRfOff:\n\t\t\t// HW setting had been configured.\n\t\t\t// Both of these RF configures are the same, configuring twice may cause HW abnormal.\n\t\t\tif(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff)\n\t\t\t\tbreak;\n\n\t\t\t// Make sure BusyQueue is empty befor turn off RFE pwoer.\n\t\t\tfor(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )\n\t\t\t{\n\t\t\t\tif(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID]))\n\t\t\t\t{\n\t\t\t\t\t//DbgPrint(\"QueueID = %d\", QueueID);\n\t\t\t\t\tQueueID++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_POWER, DBG_LOUD, (\"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\\n\", (i+1), QueueID));\n\t\t\t\t\tPlatformSleepUs(10);\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(i >= MAX_DOZE_WAITING_TIMES_9x)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(COMP_POWER, DBG_LOUD, (\"\\n\\n\\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\\n\\n\\n\", MAX_DOZE_WAITING_TIMES_9x, QueueID));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\n\t\t\t// \n\t\t\t//RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon.\n\t\t\t// Added by \n\t\t\t//\n\t\t\t//==================================================================\t\t\t\t\n\t\t\t// CU will call card disable flow to set RF off, such that we call halt directly\n\t\t\t// and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases.\n\t\t\t// 2010.03.05. Added by tynli. \t\t\t\t\n\t\t\tif(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS ||\n\t\t\t\tpMgntInfo->RfOffReason & RF_CHANGE_BY_HW ||\n\t\t\t\tpMgntInfo->RfOffReason & RF_CHANGE_BY_SW)\n\t\t\t{\t//for HW/Sw radio off and IPS flow\n\t\t\t\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"======> CardDisableWithoutHWSM -eRfOff.\\n\"));\t\t\t\t\n\t\t\t\tif(!Adapter->bInHctTest)\n\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t// 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence\n\t\t\t\t\t// So disable the different RF on/off sequence for hidden AP.\n\t\t\t\t\tNicIFDisableNIC(Adapter);\t\t\n\t\t\t\t\t\n\t\t\t\t\tRT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC);\n\t\t\t\t}\n\t\t\t}\t\t\t\t\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tbResult = FALSE;\n\t\t\tRT_ASSERT(FALSE, (\"phy_SetRFPowerState_8814Sdio(): unknow state to set: 0x%X!!!\\n\", eRFPowerState));\n\t\t\tbreak;\n\t} \n\t\t\t\n\tif(bResult)\n\t{\n\t\t// Update current RF state variable.\n\t\tpHalData->eRFPowerState = eRFPowerState;\n\t\t\n\t\tswitch(pHalData->rf_chip )\n\t\t{\n\t\t\tdefault:\t\t\n\t\t\tswitch(pHalData->eRFPowerState)\n\t\t\t{\n\t\t\t\tcase eRfOff:\n\t\t\t\t\t//\n\t\t\t\t\t//If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015\n\t\t\t\t\t//\n\t\t\t\t\tif(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS )\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); \n\t\t\t\t\telse\t\t// Turn off LED if RF is not ON.\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); \n\t\t\t\t\tbreak;\n        \t\t\n\t\t\t\tcase eRfOn:\n\t\t\t\t\t// Turn on RF we are still linked, which might happen when \n\t\t\t\t\t// we quickly turn off and on HW RF. 2006.05.12, by rcnjko.\n\t\t\t\t\tif( pMgntInfo->bMediaConnect == TRUE )\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); \n\t\t\t\t\telse\t\t// Turn off LED if RF is not ON.\n\t\t\t\t\t\tAdapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); \n\t\t\t\t\tbreak;\n        \t\t\n\t\t\t\tdefault:\n\t\t\t\t\t// do nothing.\n\t\t\t\t\tbreak;\n\t\t\t}// Switch RF state\n\n\t\t\t\tbreak;\n\t\t}// Switch rf_chip\n\t}\n\t\n\tpHalData->SetRFPowerStateInProgress = FALSE;\n\n\treturn bResult;\n}\n\n#endif\n\n\n\nBOOLEAN\nPHY_SetRFPowerState8814A(\n\tIN\tPADAPTER\t\t\tAdapter, \n\tIN\trt_rf_power_state\teRFPowerState\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tBOOLEAN\t\t\tbResult = FALSE;\n\n\tRT_TRACE(COMP_RF, DBG_LOUD, (\"---------> PHY_SetRFPowerState8814(): eRFPowerState(%d)\\n\", eRFPowerState));\n\tif(eRFPowerState == pHalData->eRFPowerState)\n\t{\n\t\tRT_TRACE(COMP_RF, DBG_LOUD, (\"<--------- PHY_SetRFPowerState8814(): discard the request for eRFPowerState(%d) is the same.\\n\", eRFPowerState));\n\t\treturn bResult;\n\t}\n#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)\n\tbResult = phy_SetRFPowerState_8814E(Adapter, eRFPowerState);\n#elif (DEV_BUS_TYPE == RT_USB_INTERFACE)\n\tbResult = phy_SetRFPowerState_8814U(Adapter, eRFPowerState);\n#elif (DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n\tbResult = phy_SetRFPowerState_8814Sdio(Adapter, eRFPowerState);\n#endif\n\t\t\n\tRT_TRACE(COMP_RF, DBG_LOUD, (\"<--------- PHY_SetRFPowerState8814(): bResult(%d)\\n\", bResult));\n\n\treturn bResult;\n}\ntodo */\n//1 5. Tx  Power setting API\n\n\nVOID\nPHY_GetTxPowerLevel8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tOUT ps4Byte    \t\tpowerlevel\n\t)\n{\n#if 0\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\ts4Byte\t\t\tTxPwrDbm = 13;\n\n\tif ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM )\n\t\t*powerlevel = pMgntInfo->ClientConfigPwrInDbm;\n\telse\n\t\t*powerlevel = TxPwrDbm;\n#endif //0\n}\n\nVOID\nPHY_SetTxPowerLevel8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tChannel\n\t)\n{\n\tu32\t\t\ti, j, k = 0;\n\tu32\t\t\tvalue[264]={0};\n\tu32\t\t\tpath = 0, PowerIndex, txagc_table_wd = 0x00801000;\n\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tu8\tjaguar2Rates[][4] =\t{ {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}, \n\t\t\t\t\t\t\t\t{MGN_6M, MGN_9M, MGN_12M, MGN_18M}, \n\t\t\t\t\t\t  \t\t{MGN_24M, MGN_36M, MGN_48M, MGN_54M}, \n\t\t\t\t\t\t  \t\t{MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3},\n\t\t\t\t\t\t  \t\t{MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7}, \n\t\t\t\t\t\t  \t\t{MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11},\n\t\t\t\t\t\t   \t\t{MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15},\n\t\t\t\t\t\t   \t\t{MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19}, \n\t\t\t\t\t\t\t\t{MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23},\n\t\t\t\t\t\t   \t\t{MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3}, \n\t\t\t\t\t\t   \t\t{MGN_VHT1SS_MCS4, MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7}, \n\t\t\t\t\t\t \t\t{MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9, MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1}, \n\t\t\t\t\t\t \t\t{MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, MGN_VHT2SS_MCS5}, \n\t\t\t\t\t\t\t\t{MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9},\n\t\t\t\t\t\t   \t\t{MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3}, \n\t\t\t\t\t\t   \t\t{MGN_VHT3SS_MCS4, MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7}, \n\t\t\t\t\t\t \t\t{MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9, 0, 0}};\t\n\n\t\n\tfor( path = ODM_RF_PATH_A; path <= ODM_RF_PATH_D; ++path )\n\t{\n\t\t\tPHY_SetTxPowerLevelByPath(Adapter, Channel, (u8)path);\n\t}\n#if 0 //todo H2C_TXPOWER_INDEX_OFFLOAD ?\n\tif(Adapter->MgntInfo.bScanInProgress == FALSE &&  pHalData->RegFWOffload == 2)\n\t{\n\t\tHalDownloadTxPowerLevel8814(Adapter, value);\n\t}\n#endif //0\n}\n\n/**************************************************************************************************************\n *   Description: \n *       The low-level interface to get the FINAL Tx Power Index , called  by both MP and Normal Driver.\n *\n *                                                                                    <20120830, Kordan>\n **************************************************************************************************************/\nu8\nPHY_GetTxPowerIndex_8814A(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel\n\t)\n{\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(pAdapter);\n\ts8\t\t\t\tpowerDiffByRate = 0;\n\ts8\t\t\t\ttxPower = 0, limit = 0;\n\tu8\t\t\t\ttx_num = MgntQuery_NssTxRate(Rate );\n\tBOOLEAN\t\t\t\tbIn24G = FALSE;\n\n\t/* DBG_871X( \"===>%s\\n\", __FUNCTION__ ); */\n\t\n\ttxPower = (s8) PHY_GetTxPowerIndexBase( pAdapter, RFPath, Rate, BandWidth, Channel, &bIn24G );\n\n\tpowerDiffByRate = PHY_GetTxPowerByRate( pAdapter, (u8)(!bIn24G), RFPath, tx_num, Rate );\n\n\tlimit = PHY_GetTxPowerLimit( pAdapter, pAdapter->registrypriv.RegPwrTblSel, (u8)(!bIn24G), pHalData->CurrentChannelBW, RFPath, Rate, pHalData->CurrentChannel);\n\n\tpowerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate;\n\t/* DBG_871X(\"Rate-0x%x: (TxPower, PowerDiffByRate Path-%c) = (0x%X, %d)\\n\", Rate, ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), txPower, powerDiffByRate); */\n\n\ttxPower += powerDiffByRate;\n\t\n\t//txPower += PHY_GetTxPowerTrackingOffset( pAdapter, RFPath, Rate );\n#if 0 //todo ?\n#if CCX_SUPPORT\n\tCCX_CellPowerLimit( pAdapter, Channel, Rate, &txPower );\n#endif\n#endif\n\tif(txPower > MAX_POWER_INDEX)\n\t\ttxPower = MAX_POWER_INDEX;\n\n\t//if (Adapter->registrypriv.mp_mode==0 && \n\t\t//(pHalData->bautoload_fail_flag || pHalData->EfuseMap[EFUSE_INIT_MAP][EEPROM_TX_PWR_INX_JAGUAR] == 0xFF))\n\t\t//txPower = 0x12;\n\n\t/* DBG_871X(\"Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\\n\", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), Channel,\n\t\ttxPower, txPower); */\n\n\treturn (u8) txPower;\t\n}\n\n\nVOID\nPHY_SetTxPowerIndex_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tRate\n\t)\n{\n\tu32\ttxagc_table_wd = 0x00801000;\n\n\ttxagc_table_wd |= (RFPath << 8) | MRateToHwRate(Rate) | (PowerIndex << 24);\n\tPHY_SetBBReg(Adapter, 0x1998, bMaskDWord, txagc_table_wd);\n\t/* DBG_871X(\"txagc_table_wd %x\\n\", txagc_table_wd); */\n\tif (Rate == MGN_1M) {\n\t\tPHY_SetBBReg(Adapter, 0x1998, bMaskDWord, txagc_table_wd);\t/* first time to turn on the txagc table */\n\t\t\t\t\t\t\t\t\t\t/* second to write the addr0 */\n\t}\n}\n\n\nBOOLEAN\nPHY_UpdateTxPowerDbm8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\ts4Byte\t\tpowerInDbm\n\t)\n{\n\treturn TRUE;\n}\n\n\nu32 \nPHY_GetTxBBSwing_8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tBAND_TYPE \tBand,\n\tIN \tu8 \t\tRFPath\n\t)\n{\n    HAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter));\n    PDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n    PODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n    s8 \t\t\tbbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter);\n    s8 \t\t\tbbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter);\n    u32          \t\tout = 0x200;\n    const s8\t\tAUTO = -1;\n\n\tRT_TRACE(COMP_MP, DBG_LOUD, (\"===> PHY_GetTxBBSwing_8814A, bbSwing_2G: %d, bbSwing_5G: %d\\n\", \n\t\t\t\t\t\t\t\t\t\t  (s4Byte)bbSwing_2G, (s4Byte)bbSwing_5G));\n\n    if ( pHalData->bautoload_fail_flag )\n    {\n\t\tif ( Band == BAND_ON_2_4G ) \n\t\t{\n\t\t\tpRFCalibrateInfo->BBSwingDiff2G = bbSwing_2G;\n\t\t\tif      (bbSwing_2G == 0)  out = 0x200; //  0 dB\n\t\t\telse if (bbSwing_2G == -3) out = 0x16A; // -3 dB\n\t\t\telse if (bbSwing_2G == -6) out = 0x101; // -6 dB\n\t\t\telse if (bbSwing_2G == -9) out = 0x0B6; // -9 dB\n\t\t\telse \n\t\t\t{\n\t\t\t\tif ( pHalData->ExternalPA_2G ) \n\t\t\t\t{\n\t\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = -3;\n\t\t\t\t\tout = 0x16A;\n\t\t\t\t} \n\t\t\t\telse  \n\t\t\t\t{\n\t\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = 0;\n\t\t\t\t\tout = 0x200;\n\t\t\t\t}\n\t            }\n\t        } \n\t\telse if ( Band == BAND_ON_5G ) \n\t\t{\n\t\t\tpRFCalibrateInfo->BBSwingDiff5G = bbSwing_5G;\n\t\t\tif(bbSwing_5G == 0)  out = 0x200; //  0 dB\n\t\t\telse if (bbSwing_5G == -3) out = 0x16A; // -3 dB\n\t\t\telse if (bbSwing_5G == -6) out = 0x101; // -6 dB\n\t\t\telse if (bbSwing_5G == -9) out = 0x0B6; // -9 dB\n\t\t\telse \n\t\t\t{\n\t\t\t\tif (pHalData->ExternalPA_5G) \n\t\t\t\t{\n\t\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = -3;\n\t\t\t\t\tout = 0x16A;\n\t\t\t\t} \n\t\t\t\telse \n\t\t\t\t{\n\t\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = 0;\n\t\t\t\t\tout = 0x200;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse  \n\t\t{\n\t\t\tpRFCalibrateInfo->BBSwingDiff2G = -3;\n\t\t\tpRFCalibrateInfo->BBSwingDiff5G = -3;\t\t\t\n\t\t\tout = 0x16A; // -3 dB\n\t\t}\n\t}\n\telse\n\t{\n\t\tu32 swing = 0, onePathSwing = 0;\n\n\t\tif (Band == BAND_ON_2_4G)\n\t\t{\n\t\t\tif (GetRegTxBBSwing_2G(Adapter) == AUTO)\n\t\t\t{\n\t\t\t\tEFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8814, (u32 *)&swing);\n\t\t\t\tif (swing == 0xFF) \n\t\t\t\t{\n\t\t\t\t\tif(bbSwing_2G ==  0) swing = 0x00; //  0 dB\n\t\t\t\t\telse if (bbSwing_2G == -3) swing = 0x55; // -3 dB\n\t\t\t\t\telse if (bbSwing_2G == -6) swing = 0xAA; // -6 dB\n\t\t\t\t\telse if (bbSwing_2G == -9) swing = 0xFF; // -9 dB\n\t\t\t\t\telse swing = 0x00;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t\telse if (bbSwing_2G ==  0) swing = 0x00; //  0 dB\n\t\t\telse if (bbSwing_2G == -3) swing = 0x55; // -3 dB\n\t\t\telse if (bbSwing_2G == -6) swing = 0xAA; // -6 dB\n\t\t\telse if (bbSwing_2G == -9) swing = 0xFF; // -9 dB\n\t\t\telse swing = 0x00;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (GetRegTxBBSwing_5G(Adapter) == AUTO)\n\t\t\t{\n\t\t\t\tEFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8814, (u32 *)&swing);\n\t\t\t\tif (swing == 0xFF) \n\t\t\t\t{\n\t\t\t\t\tif(bbSwing_5G ==  0) swing = 0x00; //  0 dB\n\t\t\t\t\telse if (bbSwing_5G == -3) swing = 0x55; // -3 dB\n\t\t\t\t\telse if (bbSwing_5G == -6) swing = 0xAA; // -6 dB\n\t\t\t\t\telse if (bbSwing_5G == -9) swing = 0xFF; // -9 dB\n\t\t\t\t\telse swing = 0x00;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (bbSwing_5G ==  0) swing = 0x00; //  0 dB\n      \t\t\telse if (bbSwing_5G == -3) swing = 0x55; // -3 dB\n\t\t\telse if (bbSwing_5G == -6) swing = 0xAA; // -6 dB\n\t\t\telse if (bbSwing_5G == -9) swing = 0xFF; // -9 dB\n\t\t\telse swing = 0x00;\n\t\t}\n\n\t\tif (RFPath == ODM_RF_PATH_A)\n\t\t\tonePathSwing = (swing & 0x3) >> 0; // 0xC6/C7[1:0]\n\t\telse if(RFPath == ODM_RF_PATH_B)\t\t\n\t\t\tonePathSwing = (swing & 0xC) >> 2; // 0xC6/C7[3:2]\n\t\telse if(RFPath == ODM_RF_PATH_C)\n\t\t\tonePathSwing = (swing & 0x30) >> 4; // 0xC6/C7[5:4]\n\t\telse if(RFPath == ODM_RF_PATH_D)\n\t\t\tonePathSwing = (swing & 0xC0) >> 6; // 0xC6/C7[7:6]\n\n\t\tif (onePathSwing == 0x0) \n\t\t{\n\t\t\tif (Band == BAND_ON_2_4G) \n\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = 0;\n\t\t\telse\n\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = 0;\n\t\t\tout = 0x200; // 0 dB\n\t\t} \n\t\telse if (onePathSwing == 0x1) \n\t\t{\n\t\t\tif (Band == BAND_ON_2_4G) \n\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = -3;\n\t\t\telse\n\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = -3;\n\t\t\tout = 0x16A; // -3 dB\n\t\t} \n\t\telse if (onePathSwing == 0x2) \n\t\t{\n\t\t\tif (Band == BAND_ON_2_4G) \n\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = -6;\n\t\t\telse\n\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = -6;\n\t\t\tout = 0x101; // -6 dB\n\t\t} \n\t\telse if (onePathSwing == 0x3) \n\t\t{\n\t\t\tif (Band == BAND_ON_2_4G) \n\t\t\t\tpRFCalibrateInfo->BBSwingDiff2G = -9;\n\t\t\telse\n\t\t\t\tpRFCalibrateInfo->BBSwingDiff5G = -9;\n\t\t\tout = 0x0B6; // -9 dB\n\t\t}\n\t}\n\tRT_TRACE(COMP_MP, DBG_LOUD,(\"<=== PHY_GetTxBBSwing_8814A, out = 0x%X\\n\", out));\n\treturn out;\n}\n\n\n//1 7. BandWidth setting API\n\nVOID\nphy_SetBwRegAdc_8814A(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tBand,\n\tIN\tCHANNEL_WIDTH \tCurrentBW\n)\t\n{\n\tswitch(CurrentBW)\n\t{\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\tif(Band == BAND_ON_5G)\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); \t// 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0011_0000\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); \t// 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0101_0000\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\tif(Band == BAND_ON_5G)\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1);\t\t// 0x8ac[17, 11, 10, 7:6,1,0]=7'b100_0001\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1);\t\t// 0x8ac[17, 11, 10, 7:6,1,0]=7'b101_0001\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x02);\t\t\t\t// 0x8ac[7:6,1,0]=4'b0010\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRT_DISP(FPHY, PHY_BBW, (\"phy_SetBwRegAdc_8814A():\tunknown Bandwidth: %#X\\n\",CurrentBW));\n\t\t\tbreak;\n\t}\n}\n\n\nVOID\nphy_SetBwRegAgc_8814A(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tBand,\n\tIN\tCHANNEL_WIDTH \tCurrentBW\n)\t\n{\n\tu32 AgcValue = 7;\n\tswitch(CurrentBW)\n\t{\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\tif(Band == BAND_ON_5G)\n\t\t\t\tAgcValue = 6;\n\t\t\telse\n\t\t\t\tAgcValue = 6;\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\tif(Band == BAND_ON_5G)\n\t\t\t\tAgcValue = 8;\n\t\t\telse\n\t\t\t\tAgcValue = 7;\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\tAgcValue = 3;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRT_DISP(FPHY, PHY_BBW, (\"phy_SetBwRegAgc_8814A():\tunknown Bandwidth: %#X\\n\",CurrentBW));\n\t\t\tbreak;\n\t}\n\n\tPHY_SetBBReg(Adapter, rAGC_table_Jaguar, 0xf000, AgcValue);\t// 0x82C[15:12] = AgcValue\t\t\t\t\n}\n\n\nBOOLEAN\nphy_SwBand8814A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\t\tchannelToSW)\n{\n\tu8\t\t\tu1Btmp; \n\tBOOLEAN\t\tret_value = _TRUE;\n\tu8\t\t\tBand = BAND_ON_5G, BandToSW;\n\n\tu1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8814A);\n\tif(u1Btmp & BIT7)\n\t\tBand = BAND_ON_5G;\n\telse\n\t\tBand = BAND_ON_2_4G;\n\n\t// Use current channel to judge Band Type and switch Band if need.\n\tif(channelToSW > 14)\n\t{\n\t\tBandToSW = BAND_ON_5G;\n\t}\n\telse\n\t{\n\t\tBandToSW = BAND_ON_2_4G;\n\t}\n\n\tif(BandToSW != Band)\n\t{\n\t\tPHY_SwitchWirelessBand8814A(pAdapter,BandToSW);\n\t}\n\t\t\n\treturn ret_value;\n}\n\n\nVOID\nPHY_SetRFEReg8814A(\n\tIN PADAPTER\t\tAdapter,\n\tIN BOOLEAN\t\tbInit,\n\tIN u8\t\tBand\n)\n{\n\tu8\t\t\tu1tmp = 0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif(bInit)\n\t{\t\n\t\tswitch(pHalData->RFEType){\n\t\tcase 2:case 1:\n\t\t\tPHY_SetBBReg(Adapter, 0x1994, 0xf, 0xf);\t\t\t\t\t\t\t\t// 0x1994[3:0] = 0xf\n\t\t\tu1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A);\n\t\t\trtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xf0);\t// 0x40[23:20] = 0xf\n\t\t\tbreak;\n\t\tcase 0:\n\t\t\tPHY_SetBBReg(Adapter, 0x1994, 0xf, 0xf);\t\t\t\t\t\t\t\t// 0x1994[3:0] = 0xf\n\t\t\tu1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A);\n\t\t\trtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xc0);\t// 0x40[23:22] = 2b'11\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if(Band == BAND_ON_2_4G)\n\t{\n\t\tswitch(pHalData->RFEType){\n\t\t\tcase 2:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270);\t// 0xCB0 = 0x72707270\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270);\t// 0xEB0 = 0x72707270\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270);\t// 0x18B4 = 0x72707270\n\t\t\tPHY_SetBBReg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77707770);\t// 0x1AB4 = 0x77707770\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x72);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x72\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0xCB0 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0xEB0 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0x18B4 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0x1AB4 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x77);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x77\n\t\t\tbreak;\n\n\t\tcase 0:\n\t\tdefault:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0xCB0 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0xEB0 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777);\t// 0x18B4 = 0x77777777\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x77);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x77\n\t\t\tbreak;\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch(pHalData->RFEType){\n\t\tcase 2:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717);\t// 0xCB0 = 0x33173717\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717);\t// 0xEB0 = 0x33173717\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717);\t// 0x18B4 = 0x33173717\n\t\t\tPHY_SetBBReg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717);\t// 0x1AB4 = 0x77177717\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x37);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x37\n\t\t\tbreak;\n\t\t\t\n\t\tcase 1:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317);\t// 0xCB0 = 0x33173317\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317);\t// 0xEB0 = 0x33173317\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317);\t// 0x18B4 = 0x33173317\n\t\t\tPHY_SetBBReg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717);\t// 0x1AB4 = 0x77177717\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x33);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x33\n\t\t\tbreak;\n\n\t\tcase 0:\n\t\tdefault:\n\t\t\tPHY_SetBBReg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477);\t// 0xCB0 = 0x54775477\n\t\t\tPHY_SetBBReg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477);\t// 0xEB0 = 0x54775477\n\t\t\tPHY_SetBBReg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477);\t// 0x18B4 = 0x54775477\n\t\t\tPHY_SetBBReg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477);\t// 0x1AB4 = 0x54775477\n\t\t\tPHY_SetBBReg(Adapter, 0x1ABC, 0x0ff00000, 0x54);\t\t\t\t\t\t// 0x1ABC[27:20] = 0x54\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nVOID \nphy_SetBBSwingByBand_8814A(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\tBand,\n\tIN u8\t\tPreviousBand\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\ts8 \t\t\tBBDiffBetweenBand = 0; \t\t\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\tPODM_RF_CAL_T  \tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\t\n\tPHY_SetBBReg(Adapter, rA_TxScale_Jaguar, 0xFFE00000, \n\t\t\t\t PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_A)); // 0xC1C[31:21]\n\tPHY_SetBBReg(Adapter, rB_TxScale_Jaguar, 0xFFE00000, \n\t\t\t\t PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_B)); // 0xE1C[31:21]\n\tPHY_SetBBReg(Adapter, rC_TxScale_Jaguar2, 0xFFE00000, \n\t\t\t\t PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_C)); // 0x181C[31:21]\n\tPHY_SetBBReg(Adapter, rD_TxScale_Jaguar2, 0xFFE00000, \n\t\t\t\t PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, ODM_RF_PATH_D)); // 0x1A1C[31:21]\n\t\t\t\t \n\t// <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing.\n\t// That is, reset all info to trigger Tx power tracking.\n\t\t\n\tif (Band != PreviousBand) \n\t{\n\t\tBBDiffBetweenBand = (pRFCalibrateInfo->BBSwingDiff2G - pRFCalibrateInfo->BBSwingDiff5G);\n\t\tBBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand);\n\t\tpRFCalibrateInfo->DefaultOfdmIndex += BBDiffBetweenBand*2;\t\t\t\t\n\t}\n\t\n\tODM_ClearTxPowerTrackingState(pDM_Odm);\n}\n\n\ns32\nPHY_SwitchWirelessBand8814A(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\tBand\n)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\tu8\tPreBand = pHalData->CurrentBandType, tepReg = 0;\n\t\t\t\n\tDBG_871X(\"==>PHY_SwitchWirelessBand8814() %s\\n\", ((Band==0)?\"2.4G\":\"5G\"));\n\n\tpHalData->CurrentBandType =(BAND_TYPE)Band;\n\n\t/*clear 0x1000[16],\tWhen this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled. */\n\ttepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2);\n\trtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg & (~BIT0));\n\t\n\t// STOP Tx/Rx\n\t//PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00);\t\n\n\tif(Band == BAND_ON_2_4G)\n\t{// 2.4G band\n\n\t\t// AGC table select \n\t\tPHY_SetBBReg(Adapter, rAGC_table_Jaguar2, 0x1F, 0);\t\t\t\t\t\t\t\t\t// 0x958[4:0] = 5b'00000\n\n\t\tPHY_SetRFEReg8814A(Adapter, FALSE, Band);\n\n\t\t// cck_enable\n\t\t//PHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3);\n\n\t\tif(Adapter->registrypriv.mp_mode == 0)\n\t\t{\n\t\t\t// 0x80C & 0xa04 should use same antenna.\n\t\t\tPHY_SetBBReg(Adapter, rTxPath_Jaguar, 0xf0, 0x2);\n\t\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);\n\t\t}\n\n\t\tPHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3);\n\n\t\t\n\t\t// CCK_CHECK_en\n\t\trtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x0);\n\t\t/* after 5G swicth 2G , set A82[2] = 0 */\n\t\tPHY_SetBBReg(Adapter, 0xa80, BIT18, 0x0);\n\t\t\t\n\t}\n\telse\t//5G band\n\t{\t\t\n\t\t// CCK_CHECK_en\n\t\trtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x80);\n\t\t/* Enable CCK Tx function, even when CCK is off */\n\t\tPHY_SetBBReg(Adapter, 0xa80, BIT18, 0x1);\n\t\n\t\t// AGC table select \n\t\t// Postpone to channel switch\n\t\t//PHY_SetBBReg(Adapter, rAGC_table_Jaguar2, 0x1F, 1);\t\t\t\t\t\t\t\t\t// 0x958[4:0] = 5b'00001\n\n\t\tPHY_SetRFEReg8814A(Adapter, FALSE, Band);\n\n\t\tif(Adapter->registrypriv.mp_mode == 0)\n\t\t{\n\t\t\tPHY_SetBBReg(Adapter, rTxPath_Jaguar, 0xf0, 0x0);\n\t\t\tPHY_SetBBReg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0xF);\n\t\t}\n\n\t\tPHY_SetBBReg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x02);\n\t\t//DBG_871X(\"==>PHY_SwitchWirelessBand8814() BAND_ON_5G settings OFDM index 0x%x\\n\", pHalData->OFDM_index[0]);\n\t}\n\n\tphy_SetBBSwingByBand_8814A(Adapter, Band, PreBand);\n\tphy_SetBwRegAdc_8814A(Adapter, Band, pHalData->CurrentChannelBW);\n\tphy_SetBwRegAgc_8814A(Adapter, Band, pHalData->CurrentChannelBW);\n\t/* 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.*/\n\ttepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2);\n\trtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg | BIT0);\n\t\n\tDBG_871X(\"<==PHY_SwitchWirelessBand8814():Switch Band OK.\\n\");\n\treturn _SUCCESS;\t\n}\n\n\nu8 \nphy_GetSecondaryChnl_8814A(\n\tIN\tPADAPTER\tAdapter\n)\n{\n\tu8\t\t\t\t\t\tSCSettingOf40 = 0, SCSettingOf20 = 0;\n\tPHAL_DATA_TYPE\t\t\t\tpHalData = GET_HAL_DATA(Adapter);\n\n\t//DBG_871X(\"SCMapping: Case: pHalData->CurrentChannelBW %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \\n\",pHalData->CurrentChannelBW,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC);\n\tif(pHalData->CurrentChannelBW== CHANNEL_WIDTH_80)\n\t{\n\t\tif(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\tSCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;\n\t\telse if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\t\tSCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;\n\t\telse\n\t\t\tDBG_871X(\"SCMapping: DONOT CARE Mode Setting\\n\");\n\t\t\n\t\tif((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;\n\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;\n\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;\n\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;\n\t\telse\n\t\t{\n\t\t\tif(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\t\tSCSettingOf20 = VHT_DATA_SC_40_LOWER_OF_80MHZ;\n\t\t\telse if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\t\t\tSCSettingOf20 = VHT_DATA_SC_40_UPPER_OF_80MHZ;\n\t\t\telse\n\t\t\t\tDBG_871X(\"SCMapping: DONOT CARE Mode Setting\\n\");\n\t\t}\t\n\t}\n\telse if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40)\n\t{\n\t\tDBG_871X(\"SCMapping: pHalData->CurrentChannelBW %d, pHalData->nCur40MhzPrimeSC %d \\n\",pHalData->CurrentChannelBW,pHalData->nCur40MhzPrimeSC);\n\n\t\tif(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;\n\t\telse if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\tSCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;\n\t\telse\n\t\t\tDBG_871X(\"SCMapping: DONOT CARE Mode Setting\\n\");\n\t}\n\n\t/*DBG_871X(\"SCMapping: SC Value %x\\n\", ((SCSettingOf40 << 4) | SCSettingOf20));*/\n\treturn  ( (SCSettingOf40 << 4) | SCSettingOf20);\n}\n\n\nVOID\nphy_SetBwRegMac_8814A(\n\tIN\tPADAPTER\t\tAdapter,\n\tCHANNEL_WIDTH \tCurrentBW\n)\t\n{\n\tu16\t\tRegRfMod_BW, u2tmp = 0;\n\tRegRfMod_BW = PlatformEFIORead2Byte(Adapter, REG_TRXPTCL_CTL_8814A);\n\n\tswitch(CurrentBW)\n\t{\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\tPlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\tu2tmp = RegRfMod_BW | BIT7;\n\t\t\tPlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\tu2tmp = RegRfMod_BW | BIT8;\n\t\t\tPlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRT_DISP(FPHY, PHY_BBW, (\"phy_SetBwRegMac_8814A():\tunknown Bandwidth: %#X\\n\",CurrentBW));\n\t\t\tbreak;\n\t}\n}\n\nvoid PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER\tpAdapter,u4Byte\tulAntennaRx)\n{\n\tPHAL_DATA_TYPE\t\tpHalData\t= GET_HAL_DATA(pAdapter);\n\n\tif ((pHalData->bSWToBW40M == TRUE) && (pHalData->CurrentChannelBW != CHANNEL_WIDTH_40)) {\n\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x007c0000,pHalData->BackUp_BB_REG_4_2nd_CCA[0]);\n\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00,pHalData->BackUp_BB_REG_4_2nd_CCA[1]);\n\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,pHalData->BackUp_BB_REG_4_2nd_CCA[2]);\n\t\tpHalData->bSWToBW40M = FALSE;\n\t}\n\n\tif ((pHalData->bSWToBW80M == TRUE) && (pHalData->CurrentChannelBW != CHANNEL_WIDTH_80)) {\n\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000, pHalData->BackUp_BB_REG_4_2nd_CCA[2]);\n\t\tpHalData->bSWToBW80M = FALSE;\n\t}\n\n\t/*1 Setting CCA TH 2nd CCA parameter by Rx Antenna*/\n\tif (pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) {\n\t\tif (pHalData->bSWToBW80M == FALSE) {\n\t\t\tpHalData->BackUp_BB_REG_4_2nd_CCA[2] = PHY_QueryBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000);\n\t\t}\n\n\t\tpHalData->bSWToBW80M = TRUE;\n\n\t\tswitch (ulAntennaRx) {\n\t\tcase ANTENNA_A:\n\t\tcase ANTENNA_B:\n\t\tcase ANTENNA_C:\n\t\tcase ANTENNA_D:\n\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b);/* 0x844[27:24] = 0xb */\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* 0x838 Enable 2ndCCA */\n\t\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x89); /* 0x82C[23:20] = 8, PWDB_TH_QB, 0x82C[19:16] = 9, PWDB_TH_HB*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x887); /* 838[27:24]=8, RF80_secondary40, 838[23:20]=8, RF80_secondary20, 838[19:16]=7, RF80_primary*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7);\t/* 840[15:12]=7, L1_square_Pk_weight_80M*/\n\t\tbreak;\n\n\t\tcase ANTENNA_AB:\n\t\tcase ANTENNA_AC:\n\t\tcase ANTENNA_AD:\t\n\t\tcase ANTENNA_BC:\n\t\tcase ANTENNA_BD:\n\t\tcase ANTENNA_CD:\n\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d);\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x78); /* 0x82C[23:20] = 7, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x444); /* 838[27:24]=4, RF80_secondary40, 838[23:20]=4, RF80_secondary20, 838[19:16]=4, RF80_primary*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/\n\t\tbreak;\n\n\t\tcase ANTENNA_ABC:\n\t\tcase ANTENNA_ABD:\n\t\tcase ANTENNA_ACD:\n\t\tcase ANTENNA_BCD:\n\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d);\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/\n\t\tbreak;\n\n\t\tcase ANTENNA_ABCD:\n\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d);\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /*Enable 2ndCCA*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/\n\t\t\t\tPHY_SetBBReg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /*840[15:12]=7, L1_square_Pk_weight_80M*/\n\t\tbreak;\n\n\t\tdefault:\n\t\t\t\tDBG_871X(\"Unknown Rx antenna.\\n\");\n\t\tbreak;\n\t\t}\n\t} else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) {\n\t\tif (pHalData->bSWToBW40M == FALSE) {\n\t\t\tpHalData->BackUp_BB_REG_4_2nd_CCA[0] = PHY_QueryBBReg(pAdapter, rPwed_TH_Jaguar, 0x007c0000);\n\t\t\tpHalData->BackUp_BB_REG_4_2nd_CCA[1] = PHY_QueryBBReg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00);\n\t\t\tpHalData->BackUp_BB_REG_4_2nd_CCA[2] = PHY_QueryBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000);\n\t\t}\n\n\t\tswitch (ulAntennaRx) {\n\t\tcase ANTENNA_A:  /* xT1R*/\n\t\tcase ANTENNA_B:\n\t\tcase ANTENNA_C:\n\t\tcase ANTENNA_D:\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xe);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);\n\t\t\t\t\t\tbreak;\n\t\tcase ANTENNA_AB: /* xT2R*/\n\t\tcase ANTENNA_AC:\n\t\tcase ANTENNA_AD:\n\t\tcase ANTENNA_BC:\n\t\tcase ANTENNA_BD:\n\t\tcase ANTENNA_CD:\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0x8);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);\n\t\t\t\t\t\tbreak;\n\t\tcase ANTENNA_ABC: /* xT3R*/\n\t\tcase ANTENNA_ABD:\n\t\tcase ANTENNA_ACD:\n\t\tcase ANTENNA_BCD:\n\t\tcase ANTENNA_ABCD:  /* xT4R*/\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xa);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);\n\t\t\t\t\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);\n\t\t\t\t\t\tbreak;\n\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t}\n\t\tpHalData->bSWToBW40M = TRUE;\n\t} else {\n\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x0); /* Enable 2ndCCA*/\n\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x43); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/\n\t\tPHY_SetBBReg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x7aa); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/\n\t\tPHY_SetBBReg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/\n\t}\n\t\n}\n\n\nVOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER\tAdapter, u1Byte SubChnlNum)\t\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);\n\n\tif (pHalData->CurrentChannelBW == CHANNEL_WIDTH_80) {\n\t\tif (SubChnlNum == 0)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);\n\t\telse if (SubChnlNum == 1)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);\n\t\telse if (SubChnlNum == 2)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);\n\t\telse if (SubChnlNum == 4)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x4);\n\t\telse if (SubChnlNum == 3)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x3);\n\t\telse if (SubChnlNum == 9)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);\n\t\telse if (SubChnlNum == 10)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);\n\t} else if (pHalData->CurrentChannelBW == CHANNEL_WIDTH_40) { \n\t\tif (SubChnlNum == 1)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);\n\t\telse if (SubChnlNum == 2)\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);\n\t} else\n\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x0);\n}\n\n\n/* <20141230, James> A workaround to eliminate the 5280MHz & 5600MHz & 5760MHzspur of 8814A. (Asked by BBSD Neil.)*/\nVOID phy_SpurCalibration_8814A(PADAPTER\tAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tBOOLEAN\t\tReset_NBI_CSI = TRUE;\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\n\t/*DBG_871X(\"%s(),RFE Type =%d, CurrentCh = %d ,ChannelBW =%d\\n\", __func__, pHalData->RFEType, pHalData->CurrentChannel, pHalData->CurrentChannelBW);*/\n\t/*DBG_871X(\"%s(),Before RrNBI_Setting_Jaguar= %x\\n\", __func__, PHY_QueryBBReg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/\n\t\n\tif (pHalData->RFEType == 0) {\n\t\tswitch (pHalData->CurrentChannelBW) {\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\tif (pHalData->CurrentChannel == 54 || pHalData->CurrentChannel == 118) {\n\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3e >> 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t} else if (pHalData->CurrentChannel == 151) {\n\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar,  BIT(16), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t}\n\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\tif (pHalData->CurrentChannel == 58 || pHalData->CurrentChannel == 122) {\n\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3a >> 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(0), 1);\n\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t} else if (pHalData->CurrentChannel == 155) {\n\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t}\n\t\tbreak;\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\tif (pHalData->CurrentChannel == 153) {\n\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1);\n\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t\t}\n\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\tbreak;\n\t\t}\n\t} else if (pHalData->RFEType == 1 || pHalData->RFEType == 2) {\n\t\t\tswitch (pHalData->CurrentChannelBW) {\n\t\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\t\tif (pHalData->CurrentChannel == 153) {\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1E >> 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1);\n\t\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\t\tif (pHalData->CurrentChannel == 151) {\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t\t}\n\t\t\tbreak;\n\t\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\t\tif (pHalData->CurrentChannel == 155) {\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1);\n\t\t\t\t\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t\t\t\t\t\tReset_NBI_CSI = FALSE;\n\t\t\t\t\t}\n\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\tbreak;\n\t\t\t}\n\t}\n\t\n\tif (Reset_NBI_CSI) {\n\t\tPHY_SetBBReg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0xfc >> 1);\n\t\tPHY_SetBBReg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 0);\n\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);\n\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);\n\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);\n\t\tPHY_SetBBReg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);\n\t}\n\t\n\tphydm_spur_nbi_setting_8814a(pDM_Odm);\n\t/*DBG_871X(\"%s(),After RrNBI_Setting_Jaguar= %x\\n\", __func__, PHY_QueryBBReg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/\n}\n\n\nvoid phy_ModifyInitialGain_8814A(\n\tPADAPTER\t\tAdapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8 \t\t\tchannel = pHalData->CurrentChannel;\n\ts1Byte\t\toffset[4]; /*{A,B,C,D}*/\n\tu8\t\t\ti = 0;\n\tu8\t\t\tchnl_section = 0xff;\n\n\tif (channel <= 14 && channel > 0)\n\t\tchnl_section = 0; /*2G*/\n\telse if (channel <= 64 && channel >= 36)\n\t\tchnl_section = 1; /*5GL*/\n\telse if (channel <= 144 && channel >= 100)\n\t\tchnl_section = 2; /*5GM*/\n\telse if (channel <= 177 && channel >= 149)\n\t\tchnl_section = 3; /*5GH*/\n\n\tif (chnl_section > 3) {\n\t\tDBG_871X(\"%s: worng channel section\\n\", __func__);\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < 4; i++) {\n\t\tu1Byte\thex_offset;\n\n\t\thex_offset = (u1Byte)(pHalData->RxGainOffset[chnl_section] >> (12-4*i))&0x0f;\n\t\tDBG_871X(\"%s: pHalData->RxGainOffset[%d] = %x\\n\", __func__, chnl_section, pHalData->RxGainOffset[chnl_section]);\n\t\tDBG_871X(\"%s: hex_offset = %x\\n\", __func__, hex_offset);\n\n\t\tif (hex_offset == 0xf)\n\t\t\toffset[i] = 0;\n\t\telse if (hex_offset >= 0x8)\n\t\t\toffset[i] = 0x11 - hex_offset;\n\t\telse\n\t\t \toffset[i] = 0x0 - hex_offset;\n\t\t offset[i] = (offset[i] / 2) * 2;\n\t\t DBG_871X(\"%s: offset[%d] = %x\\n\", __func__, i, offset[i]);\n\t\t DBG_871X(\"%s: BackUp_IG_REG_4_Chnl_Section[%d] = %x\\n\", __func__, i, pHalData->BackUp_IG_REG_4_Chnl_Section[i]);\n\t}\n\n\tif (pHalData->BackUp_IG_REG_4_Chnl_Section[0] != 0 &&\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[1] != 0 &&\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[2] != 0 &&\n\t\tpHalData->BackUp_IG_REG_4_Chnl_Section[3] != 0\n\t\t) {\n\t\tPHY_SetBBReg(Adapter, rA_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[0] + offset[0]);\n\t\tPHY_SetBBReg(Adapter, rB_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[1] + offset[1]);\n\t\tPHY_SetBBReg(Adapter, rC_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[2] + offset[2]);\n\t\tPHY_SetBBReg(Adapter, rD_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[3] + offset[3]);\n\t}\n}\n\n\nVOID phy_SetBwMode8814A(PADAPTER\tAdapter)\n{\n\tu8\t\t\tSubChnlNum = 0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\t//3 Set Reg668 BW\n\tphy_SetBwRegMac_8814A(Adapter, pHalData->CurrentChannelBW);\n\n\t//3 Set Reg483\n\tSubChnlNum = phy_GetSecondaryChnl_8814A(Adapter);\n\trtw_write8(Adapter, REG_DATA_SC_8814A, SubChnlNum);\n\n\tif(pHalData->rf_chip == RF_PSEUDO_11N)\n\t{\n\t\tDBG_871X(\"phy_SetBwMode8814A: return for PSEUDO \\n\");\n\t\treturn;\n\t}\n\n\t//3 Set Reg8AC Reg8C4 Reg8C8\n\tphy_SetBwRegAdc_8814A(Adapter, pHalData->CurrentBandType, pHalData->CurrentChannelBW);\n\t//3 Set Reg82C\n\tphy_SetBwRegAgc_8814A(Adapter, pHalData->CurrentBandType, pHalData->CurrentChannelBW);\n\n\t//3 Set Reg848  RegA00\n\tswitch(pHalData->CurrentChannelBW)\n\t{\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum);\t\t\t// 0x8ac[5:2]=1/2\n\n\t\t\tif(SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ)\t\t\t\t\t// 0xa00[4]=1/0\n\t\t\t\tPHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1);\n\t\t\telse\n\t\t\t\tPHY_SetBBReg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0);\n\t\t\tbreak;\n\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\tPHY_SetBBReg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum);\t\t\t// 0x8ac[5:2]=1/2/3/4/9/10\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tDBG_871X(\"%s():unknown Bandwidth:%#X\\n\", __func__, pHalData->CurrentChannelBW);\n\t\t\tbreak;\n\t}\n\t\n#if (MP_DRIVER == 1)\nif (Adapter->registrypriv.mp_mode == 1) {\n\t/* 2 Set Reg 0x8AC */\n\tPHY_SetRXSC_by_TXSC_8814A(Adapter, (SubChnlNum & 0xf));\n\tPHY_Set_SecCCATH_by_RXANT_8814A(Adapter, pHalData->AntennaRxPath);\n}\n#endif\t\n\t/* 3 Set RF related register */\n\tPHY_RF6052SetBandwidth8814A(Adapter, pHalData->CurrentChannelBW);\n\n\tphy_ADC_CLK_8814A(Adapter);\n\tphy_SpurCalibration_8814A(Adapter);\n}\n\n\n\n//1 6. Channel setting API\n\n// <YuChen, 140529> Add for KFree Feature Requested by RF David.\n// We need support ABCD four path Kfree\n\nVOID\nphy_SetKfreeToRF_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu8\t\t\t\tData\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter));\t\n\tPDM_ODM_T\tpDM_Odm = &pHalData->odmpriv;\n\tBOOLEAN bOdd;\n\tPODM_RF_CAL_T\tpRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\n\tif((Data%2) != 0)\t\t//odd -> positive\n\t{\n\t\tData = Data - 1;\n\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 1);\n\t\tbOdd = TRUE;\n\t}\n\telse\t\t// even -> negative\n\t{\n\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 0);\n\t\tbOdd = FALSE;\n\t}\n\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): RF_0x55[19]= %d\\n\", bOdd));\n\tswitch(Data)\n\t{\n\t\tcase 2:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 0;\n\t\tbreak;\n\t\tcase 4:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 1;\n\t\tbreak;\n\t\tcase 6:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1);\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 1;\n\t\tbreak;\n\t\tcase 8:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 2;\n\t\tbreak;\n\t\tcase 10:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1);\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 2;\n\t\tbreak;\n\t\tcase 12:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 3;\n\t\tbreak;\n\t\tcase 14:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1);\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 3;\n\t\tbreak;\n\t\tcase 16:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 4;\n\t\tbreak;\n\t\tcase 18:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1);\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 4;\n\t\tbreak;\n\t\tcase 20:\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 5);\n\t\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = 5;\n\t\tbreak;\n\n\t\tdefault:\n\t\tbreak;\n\t}\n\n\tif(bOdd == FALSE)\t\t\t// that means Kfree offset is negative, we need to record it.\n\t{\n\t\tpRFCalibrateInfo->KfreeOffset[eRFPath] = (-1)*pRFCalibrateInfo->KfreeOffset[eRFPath];\n\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): KfreeOffset = %d\\n\", pRFCalibrateInfo->KfreeOffset[eRFPath]));\n\t}\n\telse\n\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): KfreeOffset = %d\\n\", pRFCalibrateInfo->KfreeOffset[eRFPath]));\n\t\n}\n\n\nVOID\nphy_ConfigKFree8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8 \t\tchannelToSW,\n\tIN\tBAND_TYPE\tbandType\n\t)\n{\n\tu8\t\t\ttargetval_A = 0xFF;\n\tu8\t\t\ttargetval_B = 0xFF;\n\tu8\t\t\ttargetval_C = 0xFF;\n\tu8\t\t\ttargetval_D = 0xFF;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\t//DBG_871X(\"===>phy_ConfigKFree8814A()\\n\");\n\t\n\tif (Adapter->registrypriv.RegRfKFreeEnable == 2)\n\t{\n\t\t//DBG_871X(\"phy_ConfigKFree8814A(): RegRfKFreeEnable == 2, Disable \\n\");\n\t\treturn;\n\t}\n\telse if (Adapter->registrypriv.RegRfKFreeEnable == 1 || Adapter->registrypriv.RegRfKFreeEnable == 0)\n\t{\n\t\tDBG_871X(\"phy_ConfigKFree8814A(): RegRfKFreeEnable == TRUE \\n\");\n\t\tif (bandType == BAND_ON_2_4G) // 2G\n\t\t{\n\t\t\tDBG_871X(\"phy_ConfigKFree8814A(): bandType == BAND_ON_2_4G, channelToSW= %d  \\n\", channelToSW);\n\t\t\tif (channelToSW <= 14 && channelToSW >= 1)\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F4, &targetval_A, FALSE);\t// for Path A and B\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F5, &targetval_B, FALSE);\t// for Path C and D\n\t\t\t}\n\t\t\t\n\t\t}\n\t\telse if (bandType == BAND_ON_5G)\n\t\t{\n\t\t\tDBG_871X(\"phy_ConfigKFree8814A(): bandType == BAND_ON_5G, channelToSW= %d  \\n\", channelToSW);\n\t\t\tif (channelToSW >= 36 && channelToSW < 50) // 5GLB_1\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E0, &targetval_A, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E1, &targetval_B, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E2, &targetval_C, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E3, &targetval_D, FALSE);\n\t\t\t}\n\t\t\telse if (channelToSW >= 50 && channelToSW <= 64) // 5GLB_2\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E4, &targetval_A, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E5, &targetval_B, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E6, &targetval_C, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E7, &targetval_D, FALSE);\n\t\t\t}\n\t\t\telse if (channelToSW >= 100 && channelToSW <= 118) // 5GMB_1\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E8, &targetval_A, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3E9, &targetval_B, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3EA, &targetval_C, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3EB, &targetval_D, FALSE);\n\t\t\t}\n\t\t\telse if (channelToSW >= 120 && channelToSW <= 140) // 5GMB_2\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3EC, &targetval_A, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3ED, &targetval_B, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3EE, &targetval_C, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3EF, &targetval_D, FALSE);\n\t\t\t}\n\t\t\telse if (channelToSW >= 149 && channelToSW <= 165) // 5GHB\n\t\t\t{\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F0, &targetval_A, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F1, &targetval_B, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F2, &targetval_C, FALSE);\n\t\t\t\tefuse_OneByteRead(Adapter, 0x3F3, &targetval_D, FALSE);\n\t\t\t}\n\t\t}\n\t\tDBG_871X(\"phy_ConfigKFree8814A(): targetval_A= %#x \\n\", targetval_A);\n\t\tDBG_871X(\"phy_ConfigKFree8814A(): targetval_B= %#x \\n\", targetval_B);\n\t\tDBG_871X(\"phy_ConfigKFree8814A(): targetval_C= %#x \\n\", targetval_C);\n\t\tDBG_871X(\"phy_ConfigKFree8814A(): targetval_D= %#x \\n\", targetval_D);\n\t\t\n\t\t// Make sure the targetval is defined\n\t\tif ((Adapter->registrypriv.RegRfKFreeEnable == 1) && ((targetval_A != 0xFF) || (pHalData->RfKFreeEnable == TRUE)))\n\t\t{\n\t\t\tif (bandType == BAND_ON_2_4G) // 2G\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_A: %#x \\n\", targetval_A&0x0F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_A, targetval_A&0x0F);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_B: %#x \\n\", (targetval_A&0xF0)>>4));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_B, (targetval_A&0xF0)>>4);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_C: %#x \\n\", targetval_B&0x0F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_C, targetval_B&0x0F);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_D: %#x \\n\", (targetval_B&0xF0)>>4));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_D, (targetval_B&0xF0)>>4);\n\t\t\t}\n\t\t\telse if(bandType == BAND_ON_5G)\n\t\t\t{\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_A: %#x \\n\", targetval_A&0x1F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_A, targetval_A&0x1F);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_B: %#x \\n\", targetval_B&0x1F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_B, targetval_B&0x1F);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_C: %#x \\n\", targetval_C&0x1F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_C, targetval_C&0x1F);\n\t\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): PATH_D: %#x \\n\", targetval_D&0x1F));\n\t\t\t\tphy_SetKfreeToRF_8814A(Adapter, ODM_RF_PATH_D, targetval_D&0x1F);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRT_TRACE(COMP_MP, DBG_LOUD, (\"phy_ConfigKFree8814A(): targetval not defined, Don't execute KFree Process.\\n\"));\n\t\t\treturn;\n\t\t}\n\t}\n\tRT_TRACE(COMP_MP, DBG_LOUD, (\"<===phy_ConfigKFree8814A()\\n\"));\n}\n\nVOID\nphy_SwChnl8814A(\t\n\tIN\tPADAPTER\t\t\t\t\tpAdapter\n\t)\n{\n\tu8\t\t\teRFPath = 0 , channelIdx = 0;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n#ifdef CONFIG_RF_GAIN_OFFSET\n\tstruct kfree_data_t *kfree_data = &pHalData->kfree_data;\n#endif\n\tu8 \t\t\tchannelToSW = pHalData->CurrentChannel;\n\tu32\t\t\tRFValToWR , RFTmpVal, BitShift, BitMask;\n\t  \n\t//DBG_871X(\"[BW:CHNL], phy_SwChnl8814A(), switch to channel %d !!\\n\", channelToSW);\n\n\tif (phy_SwBand8814A(pAdapter, channelToSW) == FALSE)\n\t{\n\t\tDBG_871X(\"error Chnl %d\", channelToSW);\n\t}\n\n\tif(pHalData->rf_chip == RF_PSEUDO_11N)\n\t{\n\t\tRT_TRACE(COMP_MLME, DBG_LOUD, (\"phy_SwChnl8814A: return for PSEUDO\\n\"));\n\t\treturn;\n\t}\n\t\n#ifdef CONFIG_RF_GAIN_OFFSET\n\t/* <YuChen, 140529> Add for KFree Feature Requested by RF David. */\n\tif (kfree_data->flag & KFREE_FLAG_ON) {\n\n\t\tchannelIdx = rtw_ch_to_bb_gain_sel(channelToSW);\n\t#if 0\n\t\tif (pHalData->RfKFree_ch_group != channelIdx) {\n\t\t\t/* Todo: wait for new phydm ready */\n\t\t\tphy_ConfigKFree8814A(pAdapter, channelToSW, pHalData->CurrentBandType);\n\t\t\tphydm_ConfigKFree(pDM_Odm, channelToSW, kfree_data->bb_gain);\n\t\t\tDBG_871X(\"RfKFree_ch_group =%d\\n\", channelIdx);\n\t\t}\n\t#endif\n\n\t\tpHalData->RfKFree_ch_group = channelIdx;\n\n\t}\n#endif\n\tif(pHalData->RegFWOffload == 2)\n\t{\n\t\tFillH2CCmd_8814(pAdapter, H2C_CHNL_SWITCH_OFFLOAD, 1, &channelToSW);\n\t}\n\telse\n\t{\n\t\t// fc_area\t\t\n\t\tif (36 <= channelToSW && channelToSW <= 48) \n\t\t\tPHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494); \n\t\telse if (50 <= channelToSW && channelToSW <= 64) \n\t\t\tPHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453);  \n\t\telse if (100 <= channelToSW && channelToSW <= 116) \n\t\t\tPHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452);  \n\t\telse if (118 <= channelToSW) \n\t\t\tPHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412);  \n\t\telse\n\t\t\tPHY_SetBBReg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a);\n\n\t\tfor(eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)\n\t\t{\n\t\t\t// RF_MOD_AG\n\t\t\tif (36 <= channelToSW && channelToSW <= 64)\n\t\t\t\tRFValToWR = 0x101;\t //5'b00101\n\t\t\telse if (100 <= channelToSW && channelToSW <= 140) \n\t\t\t\tRFValToWR = 0x301; \t//5'b01101\n\t\t\telse if (140 < channelToSW) \n\t\t\t\tRFValToWR = 0x501; \t//5'b10101\n\t\t\telse\t\n\t\t\t\tRFValToWR = 0x000; \t//5'b00000\n\n\t\t\t// Channel to switch\n\t\t\tBitMask = BIT18|BIT17|BIT16|BIT9|BIT8;\n\t\t\tBitShift =  PHY_CalculateBitShift(BitMask);\n\t\t\tRFTmpVal = channelToSW | (RFValToWR << BitShift);\n\n\t\t\tBitMask = BIT18|BIT17|BIT16|BIT9|BIT8|bMaskByte0;\n\n\t\t\tPHY_SetRFReg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BitMask, RFTmpVal);\n\t\t}\n\n\t\tif (36 <= channelToSW && channelToSW <= 64)\t\t\t\t// Band 1 & Band 2\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar2, 0x1F, 1);\t// 0x958[4:0] = 0x1\n\t\telse if (100 <= channelToSW && channelToSW <= 144) \t\t\t// Band 3\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar2, 0x1F, 2);\t// 0x958[4:0] = 0x2\n\t\telse\tif(channelToSW >= 149)\t\t\t\t\t\t\t\t// Band 4\n\t\t\tPHY_SetBBReg(pAdapter, rAGC_table_Jaguar2, 0x1F, 3);\t// 0x958[4:0] = 0x3\n\t}\n\n\tif (pAdapter->registrypriv.mp_mode == 1) {\n\t\t\t\tif (!pHalData->bSetChnlBW)\n\t\t\t\t\tphy_ADC_CLK_8814A(pAdapter);\n\t\tphy_SpurCalibration_8814A(pAdapter);\n\t\tphy_ModifyInitialGain_8814A(pAdapter);\n\t}\n\t\n\t/* 2.4G CCK TX DFIR  */\n\tif (channelToSW >= 1 && channelToSW <= 11) {\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1317);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000204);\n\t} else if (channelToSW >= 12 && channelToSW <= 13) {\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1217);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000305);\n\t} else if (channelToSW == 14) {\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x00000E17);\n\t\tPHY_SetBBReg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000000);\n\t}\n\n}\n\n/*\nVOID\nPHY_SwChnlTimerCallback8814A(\n\tIN\tPRT_TIMER\t\tpTimer\n\t)\n{\n\tPADAPTER\t\tpAdapter = (PADAPTER)pTimer->Adapter;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\tRT_TRACE(COMP_SCAN, DBG_LOUD, (\"==>PHY_SwChnlTimerCallback8814A(), switch to channel %d\\n\", pHalData->CurrentChannel));\n\t\n\tif (rtw_is_drv_stopped(padapter))\n\t\treturn;\n\t\n\tif(pHalData->rf_chip == RF_PSEUDO_11N)\n\t{\n\t\tpHalData->SwChnlInProgress=FALSE;\n\t\treturn; \t\t\t\t\t\t\t\t//return immediately if it is peudo-phy\t\n\t}\n\n\n\tPlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\tpHalData->SwChnlInProgress=TRUE;\n\tPlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\t\n\tphy_SwChnl8814A(pAdapter);\n\n\tPlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\tpHalData->SwChnlInProgress=FALSE;\n\tPlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\t\n\tRT_TRACE(COMP_SCAN, DBG_LOUD, (\"<==PHY_SwChnlTimerCallback8814()\\n\"));\n}\n\n\nVOID\nPHY_SwChnlWorkItemCallback8814A(\n\tIN PVOID            pContext\n\t)\n{\n\tPADAPTER\t\tpAdapter = (PADAPTER)pContext;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\tRT_TRACE(COMP_SCAN, DBG_LOUD, (\"==>PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\\n\", pHalData->CurrentChannel));\n\n\tif(pAdapter->bInSetPower && RT_USB_CANNOT_IO(pAdapter))\n\t{\n\t\tRT_TRACE(COMP_SCAN, DBG_LOUD, (\"<== PHY_SwChnlWorkItemCallback8814A() SwChnlInProgress FALSE driver sleep or unload\\n\"));\n\t\n\t\tpHalData->SwChnlInProgress = FALSE;\t\t\n\t\treturn;\n\t}\n\t\n\tif (rtw_is_drv_stopped(padapter))\n\t\treturn;\n\t\n\tif(pHalData->rf_chip == RF_PSEUDO_11N)\n\t{\n\t\tpHalData->SwChnlInProgress=FALSE;\n\t\treturn; \t\t\t\t\t\t\t\t//return immediately if it is peudo-phy\t\n\t}\n\n\tPlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\tpHalData->SwChnlInProgress=TRUE;\n\tPlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\t\t\n\tphy_SwChnl8814A(pAdapter);\n\n\tPlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\t\n\tpHalData->SwChnlInProgress=FALSE;\n\tPlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);\n\t\n\tRT_TRACE(COMP_P2P, DBG_LOUD, (\"PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\\n\", pHalData->CurrentChannel));\n\tRT_TRACE(COMP_SCAN, DBG_LOUD, (\"<==PHY_SwChnlWorkItemCallback8814A()\\n\"));\n}\n\n\nVOID\nHAL_HandleSwChnl8814A(\t// Call after initialization\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tchannel\n\t)\n{\n\tPADAPTER Adapter =  GetDefaultAdapter(pAdapter);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tRT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, (\"HAL_HandleSwChnl8814A()===>\\n\"));\n\tpHalData->CurrentChannel = channel;\n\tphy_SwChnl8814A(Adapter);\n\n\n#if (MP_DRIVER == 1) \n\t// <20120712, Kordan> IQK on each channel, asked by James.\n\tPHY_IQCalibrate_8814A(pAdapter, FALSE);\n#endif\n\n\tRT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, (\"<==HAL_HandleSwChnl8814A()\\n\"));\n}\n*/\n\nVOID\nphy_SwChnlAndSetBwMode8814A(\n\tIN  PADAPTER\t\tAdapter\n)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tPDM_ODM_T\t\tpDM_Odm = &pHalData->odmpriv;\n\n\t//DBG_871X(\"phy_SwChnlAndSetBwMode8814A(): bSwChnl %d, bSetChnlBW %d \\n\", pHalData->bSwChnl, pHalData->bSetChnlBW);\n\tif ( Adapter->bNotifyChannelChange )\n\t{\n\t\tDBG_871X( \"[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\\n\", \n\t\t\t__FUNCTION__, \n\t\t\tpHalData->bSwChnl,\n\t\t\tpHalData->CurrentChannel,\n\t\t\tpHalData->bSetChnlBW,\n\t\t\tpHalData->CurrentChannelBW);\n\t}\n\t\n\tif (RTW_CANNOT_RUN(Adapter)) {\n\t\tpHalData->bSwChnlAndSetBWInProgress= FALSE;\n\t\treturn;\n\t}\n\n\tif (pHalData->bSwChnl)\n\t{\n\t\tphy_SwChnl8814A(Adapter);\n\t\tpHalData->bSwChnl = FALSE;\n\t}\t\n\n\tif (pHalData->bSetChnlBW)\n\t{\n\t\tphy_SetBwMode8814A(Adapter);\n\t\tpHalData->bSetChnlBW = FALSE;\n\t}\t\n\n\tif (Adapter->registrypriv.mp_mode == 0) {\n\t\tODM_ClearTxPowerTrackingState(pDM_Odm);\n\t\tPHY_SetTxPowerLevel8814(Adapter, pHalData->CurrentChannel);\n\t\tif (pHalData->bNeedIQK == _TRUE) {\n\t\t\tPHY_IQCalibrate_8814A(pDM_Odm, _FALSE);\n\t\t\tpHalData->bNeedIQK = _FALSE;\n\t\t}\n\t} else\n\t\tPHY_IQCalibrate_8814A(pDM_Odm, _FALSE);\n#if 0 //todo\n#if (AUTO_CHNL_SEL_NHM == 1)\t\n\tif(IS_AUTO_CHNL_SUPPORT(Adapter) && \n\t\tP2PIsSocialChannel(pHalData->CurrentChannel))\n\t{\t\n\t\tRT_TRACE(COMP_SCAN, DBG_TRACE, (\"[ACS] phy_SwChnlAndSetBwMode8723B(): CurrentChannel %d Reset NHM counter!!\\n\", pHalData->CurrentChannel));\n\t\tRT_TRACE(COMP_SCAN, DBG_TRACE, (\"[ACS] phy_SwChnlAndSetBwMode8723B(): AutoChnlSelPeriod(%d)\\n\", \n\t\t\tGetDefaultAdapter(Adapter)->MgntInfo.AutoChnlSel.AutoChnlSelPeriod));\n\n\t\t// Reset NHM counter\t\t\n    \t\todm_AutoChannelSelectReset(GET_PDM_ODM(Adapter));\n\t\t\n\t\tSET_AUTO_CHNL_STATE(Adapter, ACS_BEFORE_NHM);// Before NHM measurement\n\t}\t\n#endif\n#endif //0\n\tpHalData->bSwChnlAndSetBWInProgress= FALSE;\n}\n\n\nVOID\nPHY_SwChnlAndSetBWModeCallback8814A(\n\tIN PVOID            pContext\n)\n{\n\tPADAPTER\t\tAdapter = (PADAPTER)pContext;\n\tphy_SwChnlAndSetBwMode8814A(Adapter);\n}\n\n/*\n//\n// Description:\n//\tSwitch channel synchronously. Called by SwChnlByDelayHandler.\n//\n// Implemented by Bruce, 2008-02-14.\n// The following procedure is operted according to SwChanlCallback8190Pci().\n// However, this procedure is performed synchronously  which should be running under\n// passive level.\n// \nVOID\nPHY_SwChnlSynchronously8814A(\t// Only called during initialize\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tchannel\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tRT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, (\"==>PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\\n\", pHalData->CurrentChannel, channel));\n\n\t// Cannot IO.\n\tif(RT_CANNOT_IO(Adapter))\n\t\treturn;\n\n\t// Channel Switching is in progress.\n\tif(pHalData->bSwChnlAndSetBWInProgress)\n\t\treturn;\n\t\n\t//return immediately if it is peudo-phy\n\tif(pHalData->rf_chip == RF_PSEUDO_11N)\n\t{\n\t\tpHalData->bSwChnlAndSetBWInProgress=FALSE;\n\t\treturn;\n\t}\n\n\tswitch(pHalData->CurrentWirelessMode)\n\t{\n\t\tcase WIRELESS_MODE_A:\n\t\tcase WIRELESS_MODE_N_5G:\n\t\tcase WIRELESS_MODE_AC_5G:\n\t\t\t//Get first channel error when change between 5G and 2.4G band.\n\t\t\t//FIX ME!!!\n\t\t\tif(channel <=14)\n\t\t\t\treturn;\n\t\t\tRT_ASSERT((channel>14), (\"WIRELESS_MODE_A but channel<=14\"));\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase WIRELESS_MODE_B:\n\t\tcase WIRELESS_MODE_G:\n\t\tcase WIRELESS_MODE_N_24G:\n\t\tcase WIRELESS_MODE_AC_24G:\n\t\t\t//Get first channel error when change between 5G and 2.4G band.\n\t\t\t//FIX ME!!!\n\t\t\tif(channel > 14)\n\t\t\t\treturn;\n\t\t\tRT_ASSERT((channel<=14), (\"WIRELESS_MODE_G but channel>14\"));\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tRT_ASSERT(FALSE, (\"Invalid WirelessMode(%#x)!!\\n\", pHalData->CurrentWirelessMode));\n\t\t\tbreak;\n\t\n\t}\t\n\n\tpHalData->bSwChnlAndSetBWInProgress = TRUE;\n\tif( channel == 0)\n\t\tchannel = 1;\n\n\tpHalData->bSwChnl = TRUE;\n\tpHalData->bSetChnlBW = FALSE;\n\tpHalData->CurrentChannel=channel;\n\n\tphy_SwChnlAndSetBwMode8814A(Adapter);\n\n\tRT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, (\"<==PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\\n\", pHalData->CurrentChannel, channel));\n\t\n}\n*/\n\nVOID\nPHY_HandleSwChnlAndSetBW8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tBOOLEAN\t\t\t\tbSwitchChannel,\n\tIN\tBOOLEAN\t\t\t\tbSetBandWidth,\n\tIN\tu8\t\t\t\t\tChannelNum,\n\tIN\tCHANNEL_WIDTH\t\tChnlWidth,\n\tIN\tu8\t\t\t\t\tChnlOffsetOf40MHz,\n\tIN\tu8\t\t\t\t\tChnlOffsetOf80MHz,\n\tIN\tu8\t\t\t\t\tCenterFrequencyIndex1\n)\n{\n\tPADAPTER  \t\t\tpDefAdapter =  GetDefaultAdapter(Adapter);\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(pDefAdapter);\n\tu8\t\t\t\t\ttmpChannel = pHalData->CurrentChannel;\n\tCHANNEL_WIDTH\t\ttmpBW= pHalData->CurrentChannelBW;\n\tu8\t\t\t\t\ttmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC;\n\tu8\t\t\t\t\ttmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC;\n\tu8\t\t\t\t\ttmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1;\n\tstruct mlme_ext_priv\t*pmlmeext = &Adapter->mlmeextpriv;\n\n\t//check is swchnl or setbw\n\tif(!bSwitchChannel && !bSetBandWidth)\n\t{\n\t\tDBG_871X(\"PHY_HandleSwChnlAndSetBW8812:  not switch channel and not set bandwidth \\n\");\n\t\treturn;\n\t}\n\n\t//skip change for channel or bandwidth is the same\n\tif(bSwitchChannel)\n\t{\n\t\tif(pHalData->CurrentChannel != ChannelNum)\n\t\t{\n\t\t\tif (HAL_IsLegalChannel(Adapter, ChannelNum))\n\t\t\t\tpHalData->bSwChnl = _TRUE;\n\t\t\telse\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tif(bSetBandWidth)\n\t{\n\t\tif(pHalData->bChnlBWInitialized == _FALSE)\n\t\t{\n\t\t\tpHalData->bChnlBWInitialized = _TRUE;\n\t\t\tpHalData->bSetChnlBW = _TRUE;\n\t\t}\n\t\telse if((pHalData->CurrentChannelBW != ChnlWidth) ||\n\t\t\t(pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) || \n\t\t\t(pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) ||\n\t\t\t(pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1))\n\t\t{\n\t\t\tpHalData->bSetChnlBW = _TRUE;\n\t\t}\n\t}\n\n\tif(!pHalData->bSetChnlBW && !pHalData->bSwChnl)\n\t{\n\t\t//DBG_871X(\"<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \\n\",pHalData->bSwChnl,pHalData->bSetChnlBW);\n\t\treturn;\n\t}\n\n\n\tif(pHalData->bSwChnl)\n\t{\n\t\tpHalData->CurrentChannel=ChannelNum;\n\t\tpHalData->CurrentCenterFrequencyIndex1 = ChannelNum;\n\t}\n\t\n\n\tif(pHalData->bSetChnlBW)\n\t{\n\t\tpHalData->CurrentChannelBW = ChnlWidth;\n#if 0\n\t\tif(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER)\n\t\t\tpHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\telse if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER)\n\t\t\tpHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\telse\n\t\t\tpHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\t\tif(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER)\n\t\t\tpHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\telse if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER)\n\t\t\tpHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\telse\n\t\t\tpHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n#else\n\t\tpHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz;\n\t\tpHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz;\n#endif\n\n\t\tpHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;\t\t\n\t}\n\n\t//Switch workitem or set timer to do switch channel or setbandwidth operation\n\tif (!RTW_CANNOT_RUN(Adapter))\n\t\tphy_SwChnlAndSetBwMode8814A(Adapter);\n\telse {\n\t\tif(pHalData->bSwChnl)\n\t\t{\n\t\t\tpHalData->CurrentChannel = tmpChannel;\n\t\t\tpHalData->CurrentCenterFrequencyIndex1 = tmpChannel;\n\t\t}\t\n\t\tif(pHalData->bSetChnlBW)\n\t\t{\n\t\t\tpHalData->CurrentChannelBW = tmpBW;\n\t\t\tpHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC;\n\t\t\tpHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC;\n\t\t\tpHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1;\n\t\t}\n\t}\n\n\t//DBG_871X(\"Channel %d ChannelBW %d \",pHalData->CurrentChannel, pHalData->CurrentChannelBW);\n\t//DBG_871X(\"40MhzPrimeSC %d 80MhzPrimeSC %d \",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC);\n\t//DBG_871X(\"CenterFrequencyIndex1 %d \\n\",pHalData->CurrentCenterFrequencyIndex1);\n\n\t//DBG_871X(\"<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \\n\",pHalData->bSwChnl,pHalData->bSetChnlBW);\n\n}\n\n\n/*\n//\n//\tDescription:\n//\t\tConfigure H/W functionality to enable/disable Monitor mode.\n//\t\tNote, because we possibly need to configure BB and RF in this function, \n//\t\tso caller should in PASSIVE_LEVEL. 080118, by rcnjko.\n//\nVOID\nPHY_SetMonitorMode8814A(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tBOOLEAN\t\t\t\tbEnableMonitorMode\n\t)\n{\n\tHAL_DATA_TYPE\t\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tBOOLEAN\t\t\t\tbFilterOutNonAssociatedBSSID = FALSE;\n\n\t//2 Note: we may need to stop antenna diversity.\n\tif(bEnableMonitorMode)\n\t{\n\t\tbFilterOutNonAssociatedBSSID = FALSE;\n\t\tRT_TRACE(COMP_RM, DBG_LOUD, (\"PHY_SetMonitorMode8814A(): enable monitor mode\\n\"));\n\n\t\tpHalData->bInMonitorMode = TRUE;\n\t\tpAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE);\n\t\trtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID);\n\t}\n\telse\n\t{\n\t\tbFilterOutNonAssociatedBSSID = TRUE;\n\t\tRT_TRACE(COMP_RM, DBG_LOUD, (\"PHY_SetMonitorMode8814A(): disable monitor mode\\n\"));\n\n\t\tpAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE);\n\t\tpHalData->bInMonitorMode = FALSE;\n\t\trtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID);\n\t}\n}\n*/\n\nBOOLEAN\nSetAntennaConfig8814A(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\tDefaultAnt\t\t// 0: Main, 1: Aux.\n)\n{\n\treturn TRUE;\n}\n\nVOID\nPHY_SetBWMode8814(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\t// 20M or 40M\n\tIN\tu8\t\t\t\t\tOffset\t\t// Upper, Lower, or Don't care\n)\n{\n\tPHAL_DATA_TYPE\t\tpHalData = GET_HAL_DATA(Adapter);\n\n\t//DBG_871X(\"%s()===>\\n\",__FUNCTION__);\n\n\tPHY_HandleSwChnlAndSetBW8814A(Adapter, _FALSE, _TRUE, pHalData->CurrentChannel, Bandwidth, Offset, Offset, pHalData->CurrentChannel);\n\n\t//DBG_871X(\"<==%s()\\n\",__FUNCTION__);\n}\n\nVOID\nPHY_SwChnl8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel\n\t)\n{\n\t//DBG_871X(\"%s()===>\\n\",__FUNCTION__);\n\n\tPHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel);\n\n\t//DBG_871X(\"<==%s()\\n\",__FUNCTION__);\n}\n\nVOID\nPHY_SetSwChnlBWMode8814(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n)\n{\n\t//DBG_871X(\"%s()===>\\n\",__FUNCTION__);\n\n\tPHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);\n\n\t//DBG_871X(\"<==%s()\\n\",__FUNCTION__);\n}\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_rf6052.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_RF6052_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n\n/*-----------------------------------------------------------------------------\n * Function:    PHY_RF6052SetBandwidth()\n *\n * Overview:    This function is called by SetBWModeCallback8190Pci() only\n *\n * Input:       PADAPTER\t\t\t\tAdapter\n *\t\t\tWIRELESS_BANDWIDTH_E\tBandwidth\t//20M or 40M\n *\n * Output:      NONE\n *\n * Return:      NONE\n *\n * Note:\t\tFor RF type 0222D\n *---------------------------------------------------------------------------*/\nVOID\nPHY_RF6052SetBandwidth8814A(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth)\t//20M or 40M\n{\n\tswitch(Bandwidth)\n\t{\n\t\tcase CHANNEL_WIDTH_20:\n\t\t\t/*DBG_871X(\"PHY_RF6052SetBandwidth8814A(), set 20MHz\\n\");*/\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 3);\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 3);\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 3);\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 3);\n\t\tbreak;\n\t\t\t\n\t\tcase CHANNEL_WIDTH_40:\n\t\t\t/*DBG_871X(\"PHY_RF6052SetBandwidth8814A(), set 40MHz\\n\");*/\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 1);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 1);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 1);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 1);\t\t\t\n\t\tbreak;\n\t\t\n\t\tcase CHANNEL_WIDTH_80:\n\t\t\t/*DBG_871X(\"PHY_RF6052SetBandwidth8814A(), set 80MHz\\n\");*/\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 0);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 0);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 0);\t\n\t\t\tPHY_SetRFReg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 0);\n\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tDBG_871X(\"PHY_RF6052SetBandwidth8814A(): unknown Bandwidth: %#X\\n\",Bandwidth );\n\t\t\tbreak;\t\t\t\n\t}\n}\n\nstatic int\nphy_RF6052_Config_ParaFile_8814A(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n\tu32\t\t\t\t\tu4RegValue=0;\n\tu8\t\t\t\t\teRFPath;\n\tint\t\t\t\t\trtStatus = _SUCCESS;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstatic char\t\t\tsz8814RadioAFile[] = RTL8814A_PHY_RADIO_A;\n\tstatic char\t\t\tsz8814RadioBFile[] = RTL8814A_PHY_RADIO_B;\n\tstatic char\t\t\tsz8814RadioCFile[] = RTL8814A_PHY_RADIO_C;\n\tstatic char\t\t\tsz8814RadioDFile[] = RTL8814A_PHY_RADIO_D;\n\tstatic char \t\tsz8814TxPwrTrack[] = RTL8814A_TXPWR_TRACK;\n\tchar\t\t\t\t*pszRadioAFile = NULL, *pszRadioBFile = NULL, *pszRadioCFile = NULL, *pszRadioDFile = NULL, *pszTxPwrTrack = NULL;\n\n\n\tpszRadioAFile = sz8814RadioAFile;\n\tpszRadioBFile = sz8814RadioBFile;\n\tpszRadioCFile = sz8814RadioCFile;\n\tpszRadioDFile = sz8814RadioDFile;\n\tpszTxPwrTrack = sz8814TxPwrTrack;\n\n\t//3//-----------------------------------------------------------------\n\t//3// <2> Initialize RF\n\t//3//-----------------------------------------------------------------\n\t//for(eRFPath = RF_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\n\tfor(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\n\t{\n\t\t/*----Initialize RF fom connfiguration file----*/\n\t\tswitch(eRFPath)\n\t\t{\n\t\tcase RF_PATH_A:\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\tif (PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath) == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\t\tif(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))\n\t\t\t\t\trtStatus = _FAIL;\n#endif //CONFIG_EMBEDDED_FWIMG\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RF_PATH_B:\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\tif (PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath) == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\t\tif(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))\n\t\t\t\t\trtStatus = _FAIL;\n#endif //CONFIG_EMBEDDED_FWIMG\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RF_PATH_C:\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\tif (PHY_ConfigRFWithParaFile(Adapter, pszRadioCFile, eRFPath) == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\t\tif(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))\n\t\t\t\t\trtStatus = _FAIL;\n#endif //CONFIG_EMBEDDED_FWIMG\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RF_PATH_D:\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\tif (PHY_ConfigRFWithParaFile(Adapter, pszRadioDFile, eRFPath) == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t\t\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\t\t\tif(HAL_STATUS_FAILURE ==ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv,CONFIG_RF_RADIO, (ODM_RF_RADIO_PATH_E)eRFPath))\n\t\t\t\t\trtStatus = _FAIL;\n#endif //CONFIG_EMBEDDED_FWIMG\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tif(rtStatus != _SUCCESS){\n\t\t\tDBG_871X(\"%s():Radio[%d] Fail!!\", __FUNCTION__, eRFPath);\n\t\t\tgoto phy_RF6052_Config_ParaFile_Fail;\n\t\t}\n\n\t}\n\t\n\tu4RegValue = PHY_QueryRFReg(Adapter, RF_PATH_A, RF_RCK1_Jaguar, bRFRegOffsetMask);\n\tPHY_SetRFReg(Adapter, RF_PATH_B,  RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue);\n\tPHY_SetRFReg(Adapter, RF_PATH_C,  RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue);\n\tPHY_SetRFReg(Adapter, RF_PATH_D,  RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue);\n\t\n\t//3 -----------------------------------------------------------------\n\t//3 Configuration of Tx Power Tracking \n\t//3 -----------------------------------------------------------------\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tif (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrack) == _FAIL)\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\t{\n#ifdef CONFIG_EMBEDDED_FWIMG\n\t\tODM_ConfigRFWithTxPwrTrackHeaderFile(&pHalData->odmpriv);\n#endif\n\t}\n\n\t//RT_TRACE(COMP_INIT, DBG_LOUD, (\"<---phy_RF6052_Config_ParaFile_8812()\\n\"));\n\nphy_RF6052_Config_ParaFile_Fail:\n\treturn rtStatus;\n}\n\n\nint\nPHY_RF6052_Config_8814A(\n\tIN\tPADAPTER\t\tAdapter)\n{\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tint\t\t\t\t\trtStatus = _SUCCESS;\n\n\t// Initialize general global value\n\tpHalData->NumTotalRFPath = 4;\n\n\t//\n\t// Config BB and RF\n\t//\n\trtStatus = phy_RF6052_Config_ParaFile_8814A(Adapter);\n\n\treturn rtStatus;\n\n}\n\n\n/* End of HalRf6052.c */\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_rxdesc.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_RXDESC_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\nvoid rtl8814_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc)\n{\n\tstruct rx_pkt_attrib\t*pattrib = &precvframe->u.hdr.attrib;\n\n\t_rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));\n\n\t//Offset 0\n\tpattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0)&0x00003fff)\n\tpattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1);\n\tpattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1);\n\tpattrib->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\n\tpattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 20) & 0x7);\n\tpattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8814A(pdesc);//(( le32_to_cpu( pdesc->rxdw0 ) >> 23) & 0x1);// Qos data, wireless lan header length is 26\n\tpattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3);\n\tpattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1);\n\tpattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1;\n\n\t//Offset 4\n\tpattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 8) & 0xf);\n\tpattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 26) & 0x1);\n\tpattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit\n\n\t//Offset 8\n\tpattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw2) & 0x00000fff);\n\tpattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number\n\n\n\tif (GET_RX_STATUS_DESC_RPT_SEL_8814A(pdesc))\n\t\tpattrib->pkt_rpt_type = C2H_PACKET;\n\telse\n\t\n\tpattrib->pkt_rpt_type = NORMAL_RX;\n\n\t//Offset 12\n\tpattrib->data_rate=(u8)GET_RX_STATUS_DESC_RX_RATE_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw3))&0x7f);\n\n\t//Offset 16\n\t//Offset 20\n\n}\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_sreset.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_SRESET_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nvoid rtl8814_sreset_xmit_status_check(_adapter *padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\n\tunsigned long current_time;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tunsigned int diff_time;\n\tu32 txdma_status;\n\t\n\tif( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){\n\t\tDBG_871X(\"%s REG_TXDMA_STATUS:0x%08x\\n\", __FUNCTION__, txdma_status);\n\t\trtw_hal_sreset_reset(padapter);\n\t}\n#ifdef CONFIG_USB_HCI\n\t//total xmit irp = 4\n\t//DBG_8192C(\"==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\\n\",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt);\n\t//if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1)\n\tcurrent_time = rtw_get_current_time();\n\n\tif (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) {\n\n\t\tdiff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time);\n\n\t\tif (diff_time > 2000) {\n\t\t\tif (psrtpriv->last_tx_complete_time == 0) {\n\t\t\t\tpsrtpriv->last_tx_complete_time = current_time;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tdiff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time);\n\t\t\t\tif (diff_time > 4000) {\n\t\t\t\t\tu32 ability = 0;\n\n\t\t\t\t\t//padapter->Wifi_Error_Status = WIFI_TX_HANG;\n\t\t\t\t\tability = rtw_phydm_ability_get(padapter);\n\n\t\t\t\t\tDBG_871X(\"%s tx hang %s\\n\", __FUNCTION__,\n\t\t\t\t\t\t(ability & ODM_BB_ADAPTIVITY)? \"ODM_BB_ADAPTIVITY\" : \"\");\n\n\t\t\t\t\tif (!(ability & ODM_BB_ADAPTIVITY))\n\t\t\t\t\t\trtw_hal_sreset_reset(padapter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif //CONFIG_USB_HCI\n\n\tif (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) {\n\t\tpsrtpriv->dbg_trigger_point = SRESET_TGP_NULL;\n\t\trtw_hal_sreset_reset(padapter);\n\t\treturn;\n\t}\n}\n\nvoid rtl8814_sreset_linked_status_check(_adapter *padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\n\tu32 rx_dma_status = 0;\n\trx_dma_status = rtw_read32(padapter,REG_RXDMA_STATUS);\n\tif(rx_dma_status!= 0x00){\n\t\tDBG_8192C(\"%s REG_RXDMA_STATUS:0x%08x\\n\",__FUNCTION__,rx_dma_status);\n\t}\t\n#if 0\n\tu32 regc50,regc58,reg824,reg800;\n\tregc50 = rtw_read32(padapter,0xc50);\n\tregc58 = rtw_read32(padapter,0xc58);\n\treg824 = rtw_read32(padapter,0x824);\n\treg800 = rtw_read32(padapter,0x800);\n\tif(\t((regc50&0xFFFFFF00)!= 0x69543400)||\n\t\t((regc58&0xFFFFFF00)!= 0x69543400)||\n\t\t(((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))||\n\t\t( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000)))\n\t{\n\t\tDBG_8192C(\"%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\\n\", __FUNCTION__,\n\t\t\tregc50, regc58, reg824, reg800);\n\t\trtw_hal_sreset_reset(padapter);\n\t}\n#endif\n\n\tif (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) {\n\t\tpsrtpriv->dbg_trigger_point = SRESET_TGP_NULL;\n\t\trtw_hal_sreset_reset(padapter);\n\t\treturn;\n\t}\n}\n#endif\n\n"
  },
  {
    "path": "hal/rtl8814a/rtl8814a_xmit.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814A_XMIT_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag, u8 *ptxdesc)\n{\n\tu8 bDumpTxPkt;\n\tu8 bDumpTxDesc = _FALSE;\n\trtw_hal_get_def_var(padapter, HAL_DEF_DBG_DUMP_TXPKT, &(bDumpTxPkt));\n\n\tif(bDumpTxPkt ==1){//dump txdesc for data frame\n\t\tDBG_871X(\"dump tx_desc for data frame\\n\");\n\t\tif((frame_tag&0x0f) == DATA_FRAMETAG){\t\n\t\t\tbDumpTxDesc = _TRUE;\t\t\n\t\t}\n\t}\t\n\telse if(bDumpTxPkt ==2){//dump txdesc for mgnt frame\n\t\tDBG_871X(\"dump tx_desc for mgnt frame\\n\");\n\t\tif((frame_tag&0x0f) == MGNT_FRAMETAG){\t\n\t\t\tbDumpTxDesc = _TRUE;\t\t\n\t\t}\n\t}\t\n\telse if(bDumpTxPkt ==3){//dump early info\n\t}\n\t\n\tif(bDumpTxDesc){\n\t\t//\tptxdesc->txdw4 = cpu_to_le32(0x00001006);//RTS Rate=24M\n\t\t//\tptxdesc->txdw6 = 0x6666f800;\n\t\tDBG_8192C(\"=====================================\\n\");\n\t\tDBG_8192C(\"Offset00(0x%08x)\\n\",*((u32 *)(ptxdesc)));\n\t\tDBG_8192C(\"Offset04(0x%08x)\\n\",*((u32 *)(ptxdesc+4)));\n\t\tDBG_8192C(\"Offset08(0x%08x)\\n\",*((u32 *)(ptxdesc+8)));\n\t\tDBG_8192C(\"Offset12(0x%08x)\\n\",*((u32 *)(ptxdesc+12)));\n\t\tDBG_8192C(\"Offset16(0x%08x)\\n\",*((u32 *)(ptxdesc+16)));\n\t\tDBG_8192C(\"Offset20(0x%08x)\\n\",*((u32 *)(ptxdesc+20)));\n\t\tDBG_8192C(\"Offset24(0x%08x)\\n\",*((u32 *)(ptxdesc+24)));\n\t\tDBG_8192C(\"Offset28(0x%08x)\\n\",*((u32 *)(ptxdesc+28)));\n\t\tDBG_8192C(\"Offset32(0x%08x)\\n\",*((u32 *)(ptxdesc+32)));\n\t\tDBG_8192C(\"Offset36(0x%08x)\\n\",*((u32 *)(ptxdesc+36)));\n\t\tDBG_8192C(\"=====================================\\n\");\n\t}\n\n}\n\n/*\n * Description:\n *\tAggregation packets and send to hardware\n *\n * Return:\n *\t0\tSuccess\n *\t-1\tHardware resource(TX FIFO) not ready\n *\t-2\tSoftware resource(xmitbuf) not ready\n */\n#ifdef CONFIG_TX_EARLY_MODE\n\n//#define DBG_EMINFO\n\n#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1\t\n\t#define EARLY_MODE_MAX_PKT_NUM\t10\n#else\n\t#define EARLY_MODE_MAX_PKT_NUM\t5\n#endif\n\n\nstruct EMInfo{\n\tu8 \tEMPktNum;\n\tu16  EMPktLen[EARLY_MODE_MAX_PKT_NUM];\n};\n\n\nvoid\nInsertEMContent_8814(\n\tstruct EMInfo *pEMInfo,\n\tIN pu1Byte\tVirtualAddress)\n{\n\n#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1\n\tu1Byte index=0;\n\tu4Byte\tdwtmp=0;\n#endif\n\n\t_rtw_memset(VirtualAddress, 0, EARLY_MODE_INFO_SIZE);\n\tif(pEMInfo->EMPktNum==0)\n\t\treturn;\n\n\t#ifdef DBG_EMINFO\n\t{\n\t\tint i;\n\t\tDBG_8192C(\"\\n%s ==> pEMInfo->EMPktNum =%d\\n\",__FUNCTION__,pEMInfo->EMPktNum);\n\t\tfor(i=0;i< EARLY_MODE_MAX_PKT_NUM;i++){\n\t\t\tDBG_8192C(\"%s ==> pEMInfo->EMPktLen[%d] =%d\\n\",__FUNCTION__,i,pEMInfo->EMPktLen[i]);\n\t\t}\n\n\t}\n\t#endif\n\t\n#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1\n\tSET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum);\n\n\tif(pEMInfo->EMPktNum == 1){\n\t\tdwtmp = pEMInfo->EMPktLen[0];\n\t}else{\n\t\tdwtmp = pEMInfo->EMPktLen[0];\n\t\tdwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4;\n\t\tdwtmp += pEMInfo->EMPktLen[1];\n\t}\n\tSET_EARLYMODE_LEN0(VirtualAddress, dwtmp);\n\tif(pEMInfo->EMPktNum <= 3){\n\t\tdwtmp = pEMInfo->EMPktLen[2];\n\t}else{\n\t\tdwtmp = pEMInfo->EMPktLen[2];\n\t\tdwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4;\n\t\tdwtmp += pEMInfo->EMPktLen[3];\n\t}\n\tSET_EARLYMODE_LEN1(VirtualAddress, dwtmp);\n\tif(pEMInfo->EMPktNum <= 5){\n\t\tdwtmp = pEMInfo->EMPktLen[4];\n\t}else{\n\t\tdwtmp = pEMInfo->EMPktLen[4];\n\t\tdwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4;\n\t\tdwtmp += pEMInfo->EMPktLen[5];\n\t}\n\tSET_EARLYMODE_LEN2_1(VirtualAddress, dwtmp&0xF);\n\tSET_EARLYMODE_LEN2_2(VirtualAddress, dwtmp>>4);\n\tif(pEMInfo->EMPktNum <= 7){\n\t\tdwtmp = pEMInfo->EMPktLen[6];\n\t}else{\n\t\tdwtmp = pEMInfo->EMPktLen[6];\n\t\tdwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4;\n\t\tdwtmp += pEMInfo->EMPktLen[7];\n\t}\n\tSET_EARLYMODE_LEN3(VirtualAddress, dwtmp);\n\tif(pEMInfo->EMPktNum <= 9){\n\t\tdwtmp = pEMInfo->EMPktLen[8];\n\t}else{\n\t\tdwtmp = pEMInfo->EMPktLen[8];\n\t\tdwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4;\n\t\tdwtmp += pEMInfo->EMPktLen[9];\n\t}\n\tSET_EARLYMODE_LEN4(VirtualAddress, dwtmp);\n#else\t\n\tSET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum);\n\tSET_EARLYMODE_LEN0(VirtualAddress, pEMInfo->EMPktLen[0]);\n\tSET_EARLYMODE_LEN1(VirtualAddress, pEMInfo->EMPktLen[1]);\n\tSET_EARLYMODE_LEN2_1(VirtualAddress, pEMInfo->EMPktLen[2]&0xF);\n\tSET_EARLYMODE_LEN2_2(VirtualAddress, pEMInfo->EMPktLen[2]>>4);\n\tSET_EARLYMODE_LEN3(VirtualAddress, pEMInfo->EMPktLen[3]);\n\tSET_EARLYMODE_LEN4(VirtualAddress, pEMInfo->EMPktLen[4]);\n#endif\t\n\t//RT_PRINT_DATA(COMP_SEND, DBG_LOUD, \"EMHdr:\", VirtualAddress, 8);\n\n}\n\n\n\nvoid UpdateEarlyModeInfo8814(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf )\n{\n\t//_adapter *padapter, struct xmit_frame *pxmitframe,struct tx_servq\t*ptxservq\n\tint index,j;\n\tu16 offset,pktlen;\n\tPTXDESC_8814 ptxdesc;\n\t\n\tu8 *pmem,*pEMInfo_mem;\n\ts8 node_num_0=0,node_num_1=0;\n\tstruct EMInfo eminfo;\n\tstruct agg_pkt_info *paggpkt;\n\tstruct xmit_frame *pframe = (struct xmit_frame*)pxmitbuf->priv_data;\t\n\tpmem= pframe->buf_addr;\t\n\t\n\t#ifdef DBG_EMINFO\t\t\t\n\tDBG_871X(\"\\n%s ==> agg_num:%d\\n\",__FUNCTION__, pframe->agg_num);\n\tfor(index=0;index<pframe->agg_num;index++){\n\t\toffset = \tpxmitpriv->agg_pkt[index].offset;\n\t\tpktlen = pxmitpriv->agg_pkt[index].pkt_len;\n\t\tDBG_871X(\"%s ==> agg_pkt[%d].offset=%d\\n\",__FUNCTION__,index,offset);\n\t\tDBG_871X(\"%s ==> agg_pkt[%d].pkt_len=%d\\n\",__FUNCTION__,index,pktlen);\n\t}\n\t#endif\n\t\n\tif( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM)\n\t{\t\n\t\tnode_num_0 = pframe->agg_num;\n\t\tnode_num_1= EARLY_MODE_MAX_PKT_NUM-1;\n\t}\n\t\n\tfor(index=0;index<pframe->agg_num;index++){\n\n\t\toffset = pxmitpriv->agg_pkt[index].offset;\n\t\tpktlen = pxmitpriv->agg_pkt[index].pkt_len;\t\t\n\n\t\t_rtw_memset(&eminfo,0,sizeof(struct EMInfo));\n\t\tif( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM){\n\t\t\tif(node_num_0 > EARLY_MODE_MAX_PKT_NUM){\n\t\t\t\teminfo.EMPktNum = EARLY_MODE_MAX_PKT_NUM;\n\t\t\t\tnode_num_0--;\n\t\t\t}\n\t\t\telse{\n\t\t\t\teminfo.EMPktNum = node_num_1;\n\t\t\t\tnode_num_1--;\t\t\t\t\n\t\t\t}\t\t\t\n\t\t}\n\t\telse{\n\t\t\teminfo.EMPktNum = pframe->agg_num-(index+1);\t\n\t\t}\t\t\t\t\n\t\tfor(j=0;j< eminfo.EMPktNum ;j++){\n\t\t\teminfo.EMPktLen[j] = pxmitpriv->agg_pkt[index+1+j].pkt_len+4;// 4 bytes CRC\n\t\t}\n\t\t\t\n\t\tif(pmem){\n\t\t\tif(index==0){\n\t\t\t\tptxdesc = (PTXDESC_8814)(pmem);\n\t\t\t\tpEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE;\t\t\t\t\n\t\t\t}\n\t\t\telse{\n\t\t\t\tpmem = pmem + pxmitpriv->agg_pkt[index-1].offset;\n\t\t\t\tptxdesc = (PTXDESC_8814)(pmem);\n\t\t\t\tpEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE;\t\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t#ifdef DBG_EMINFO\n\t\t\tDBG_871X(\"%s ==> desc.pkt_len=%d\\n\",__FUNCTION__,ptxdesc->pktlen);\n\t\t\t#endif\n\t\t\tInsertEMContent_8814(&eminfo,pEMInfo_mem);\n\t\t}\t\n\t\t\n\t\t\n\t} \n\t_rtw_memset(pxmitpriv->agg_pkt,0,sizeof(struct agg_pkt_info)*MAX_AGG_PKT_NUM);\n\n}\n#endif\n\n#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\nvoid rtl8814a_cal_txdesc_chksum(u8 *ptxdesc)\n{\n\tu16\t*usPtr;\n\tu32 count;\n\tu32 index;\n\tu16 checksum = 0;\n\n\n\tusPtr = (u16*)ptxdesc;\n\t// checksume is always calculated by first 32 bytes,\n\t// and it doesn't depend on TX DESC length.\n\t// Thomas,Lucas@SD4,20130515\n\tcount = 16;\n\n\t// Clear first\n\tSET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, 0);\n\n\tfor(index = 0 ; index < count ; index++){\n\t\tchecksum = checksum ^ le16_to_cpu(*(usPtr + index));\n\t}\n\n\tSET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, checksum);\n}\n#endif\n\n//\n// Description: In normal chip, we should send some packet to Hw which will be used by Fw\n//\t\t\tin FW LPS mode. The function is to fill the Tx descriptor of this packets, then\n//\t\t\tFw can tell Hw to send these packet derectly.\n//\nvoid rtl8814a_fill_fake_txdesc(\n\tPADAPTER\tpadapter,\n\tu8*\t\t\tpDesc,\n\tu32\t\t\tBufferLen,\n\tu8\t\t\tIsPsPoll,\n\tu8\t\t\tIsBTQosNull,\n\tu8\t\t\tbDataFrame)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\n\t// Clear all status\n\t_rtw_memset(pDesc, 0, TXDESC_SIZE);\n\n\tSET_TX_DESC_LAST_SEG_8814A(pDesc, 1);\n\n\tSET_TX_DESC_OFFSET_8814A(pDesc, TXDESC_SIZE);\n\n\tSET_TX_DESC_PKT_SIZE_8814A(pDesc, BufferLen);\n\n\tSET_TX_DESC_QUEUE_SEL_8814A(pDesc,  QSLT_MGNT);\n\n\tif (pmlmeext->cur_wireless_mode & WIRELESS_11B) {\n\t\tSET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_B);\n\t} else {\n\t\tSET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_G);\n\t}\n\n\t//Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw.\n\tif (IsPsPoll)\n\t{\n\t\tSET_TX_DESC_NAV_USE_HDR_8814A(pDesc, 1); \n\t}\n\telse\n\t{\n\t\tSET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); // Hw set sequence number\n\t}\n#if 0 //todo\n\tif(IsBTQosNull)\n\t{\n\t\tSET_TX_DESC_BT_INT_8812(pDesc, 1);\n\t}\n#endif //0\n\n\tSET_TX_DESC_USE_RATE_8814A(pDesc, 1);\n\t\n\t//8814 no OWN bit?\n\t//SET_TX_DESC_OWN_8812(pDesc, 1);\n\n\t//\n\t// Encrypt the data frame if under security mode excepct null data. Suggested by CCW.\n\t//\n\tif (_TRUE ==bDataFrame)\n\t{\n\t\tu32 EncAlg;\n\n\t\tEncAlg = padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\tswitch (EncAlg)\n\t\t{\n\t\t\tcase _NO_PRIVACY_:\n\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); \n\t\t\t\tbreak;\n\t\t\tcase _WEP40_:\n\t\t\tcase _WEP104_:\n\t\t\tcase _TKIP_:\n\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x1); \n\t\t\t\tbreak;\n\t\t\tcase _SMS4_:\n\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x2); \n\t\t\t\tbreak;\n\t\t\tcase _AES_:\n\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x3);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); \n\t\t\t\tbreak;\t \n\t\t}\n\t}\n\tSET_TX_DESC_TX_RATE_8814A(pDesc, MRateToHwRate(pmlmeext->tx_rate));\n\n#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\n\t// USB interface drop packet if the checksum of descriptor isn't correct.\n\t// Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.).\n\trtl8814a_cal_txdesc_chksum(pDesc);\n#endif\n}\n\nvoid rtl8814a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc)\n{\n\tif ((pattrib->encrypt > 0) && !pattrib->bswenc)\n\t{\n\t\tswitch (pattrib->encrypt)\n\t\t{\t\n\t\t\t//SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES\n\t\t\tcase _WEP40_:\n\t\t\tcase _WEP104_:\n\t\t\tcase _TKIP_:\n\t\t\tcase _TKIP_WTMIC_:\t\n\t\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x1);\n\t\t\t\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\t\tcase _SMS4_:\n\t\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x2);\n\t\t\t\tbreak;\n#endif\n\t\t\tcase _AES_:\n\t\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x3);\n\t\t\t\t\tbreak;\n\t\t\tcase _NO_PRIVACY_:\n\t\t\tdefault:\n\t\t\t\t\tSET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x0);\n\t\t\t\t\tbreak;\n\t\t\n\t\t}\n\t\t\n\t}\n\n}\n\nvoid rtl8814a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc)\n{\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\n\t//DBG_8192C(\"vcs_mode=%d\\n\", pattrib->vcs_mode);\t\n\n\tif (pattrib->vcs_mode) {\n\n\t\tswitch(pattrib->vcs_mode)\n\t\t{\n\t\t\tcase RTS_CTS:\n\t\t\t\tSET_TX_DESC_RTS_ENABLE_8814A(ptxdesc, 1);\n\t\t\t\tbreak;\n\t\t\tcase CTS_TO_SELF:\n\t\t\t\tSET_TX_DESC_CTS2SELF_8814A(ptxdesc, 1);\n\t\t\t\tbreak;\n\t\t\tcase NONE_VCS:\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (pmlmeinfo->preamble_mode == PREAMBLE_SHORT)\n\t\t\tSET_TX_DESC_RTS_SHORT_8814A(ptxdesc, 1);\n\n\t\tSET_TX_DESC_RTS_RATE_8814A(ptxdesc, 0x8);//RTS Rate=24M\n\n\t\tSET_TX_DESC_RTS_RATE_FB_LIMIT_8814A(ptxdesc, 0xf);\n\t\n\t}\n}\n\n\nu8 \nBWMapping_8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tstruct pkt_attrib\t*pattrib\n)\n{\n\tu8\tBWSettingOfDesc = 0;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\n\t//DBG_871X(\"BWMapping pHalData->CurrentChannelBW %d, pattrib->bwmode %d \\n\",pHalData->CurrentChannelBW,pattrib->bwmode);\n\n\tif(pHalData->CurrentChannelBW== CHANNEL_WIDTH_80)\n\t{\n\t\tif(pattrib->bwmode == CHANNEL_WIDTH_80)\n\t\t\tBWSettingOfDesc= 2;\n\t\telse if(pattrib->bwmode == CHANNEL_WIDTH_40)\n\t\t\tBWSettingOfDesc = 1;\n\t\telse\n\t\t\tBWSettingOfDesc = 0;\n\t}\n\telse if(pHalData->CurrentChannelBW== CHANNEL_WIDTH_40)\n\t{\n\t\tif((pattrib->bwmode == CHANNEL_WIDTH_40) || (pattrib->bwmode == CHANNEL_WIDTH_80))\n\t\t\tBWSettingOfDesc = 1;\n\t\telse\n\t\t\tBWSettingOfDesc = 0;\n\t}\n\telse\n\t\tBWSettingOfDesc = 0;\n\n\treturn BWSettingOfDesc;\n}\n\nu8 \nSCMapping_8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tstruct pkt_attrib\t*pattrib\n)\n{\n\tu8\tSCSettingOfDesc = 0;\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\t//DBG_871X(\"SCMapping: pHalData->CurrentChannelBW %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \\n\",pHalData->CurrentChannelBW,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC);\n\t\n\tif(pHalData->CurrentChannelBW == CHANNEL_WIDTH_80)\n\t{\n\t\tif(pattrib->bwmode == CHANNEL_WIDTH_80)\n\t\t{\n\t\t\tSCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;\n\t\t}\n\t\telse if(pattrib->bwmode == CHANNEL_WIDTH_40)\n\t\t{\n\t\t\tif(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_40_LOWER_OF_80MHZ;\n\t\t\telse if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_40_UPPER_OF_80MHZ;\n\t\t\telse\n\t\t\t\tDBG_871X(\"SCMapping: DONOT CARE Mode Setting\\n\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_LOWEST_OF_80MHZ;\n\t\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;\n\t\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;\n\t\t\telse if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_UPPERST_OF_80MHZ;\n\t\t\telse\n\t\t\t\tDBG_871X(\"SCMapping: DONOT CARE Mode Setting\\n\");\n\t\t}\n\t}\n\telse if(pHalData->CurrentChannelBW== CHANNEL_WIDTH_40)\n\t{\n\t\t//DBG_871X(\"SCMapping: HT Case: pHalData->CurrentChannelBW %d, pHalData->nCur40MhzPrimeSC %d \\n\",pHalData->CurrentChannelBW,pHalData->nCur40MhzPrimeSC);\n\n\t\tif(pattrib->bwmode == CHANNEL_WIDTH_40)\n\t\t{\n\t\t\tSCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;\n\t\t}\n\t\telse if(pattrib->bwmode == CHANNEL_WIDTH_20)\n\t\t{\n\t\t\tif(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)\n\t\t\t{\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ;\n\t\t\t}\n\t\t\telse if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)\n\t\t\t{\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;\n\t\t\t}\n\t\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tSCSettingOfDesc = VHT_DATA_SC_DONOT_CARE;\n\t}\n\n\treturn SCSettingOfDesc;\n}\n\n\nvoid rtl8814a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc)\n{\n\t//DBG_8192C(\"bwmode=%d, ch_off=%d\\n\", pattrib->bwmode, pattrib->ch_offset);\n\n\tif(pattrib->ht_en)\n\t{\n\t\t// Set Bandwidth and sub-channel settings.\n\t\tSET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib));\n\n\t\tSET_TX_DESC_DATA_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib));\n\t}\n}\n\n\n"
  },
  {
    "path": "hal/rtl8814a/usb/rtl8814au_led.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814AU_LED_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n//================================================================================\n// LED object.\n//================================================================================\n\n\n//================================================================================\n//\tPrototype of protected function.\n//================================================================================\n\n\n//================================================================================\n// LED_819xUsb routines. \n//================================================================================\n\n//\n//\tDescription:\n//\t\tTurn on LED according to LedPin specified.\n//\nstatic void\nSwLedOn_8814AU(\n\tPADAPTER\t\tpadapter, \n\tPLED_USB\t\tpLed\n)\n{\n\tu32 LedGpioCfg;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tif (RTW_CANNOT_RUN(padapter))\n\t\treturn;\n\n\tLedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */\n\tswitch (pLed->LedPin) {\n\tcase LED_PIN_LED0:\n\t\tLedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22);\t/* config as gpo */\n\t\tLedGpioCfg &= ~(BIT8 | BIT9 | BIT13 | BIT14);\t/* set gpo value */\n\t\tLedGpioCfg &= ~(BIT0 | BIT1 | BIT5 | BIT6);\t\t/* set gpi value. TBD: may not need this */\n\t\trtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\tpLed->bLedOn = _TRUE;\n}\n\n\n//\n//\tDescription:\n//\t\tTurn off LED according to LedPin specified.\n//\nstatic void\nSwLedOff_8814AU(\n\tPADAPTER\t\tpadapter, \n\tPLED_USB\t\tpLed\n)\n{\n\tu32 LedGpioCfg;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tif (RTW_CANNOT_RUN(padapter))\n\t\treturn;\n\tLedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */\n\tswitch (pLed->LedPin) {\n\tcase LED_PIN_LED0:\n\t\tLedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22);\t/* config as gpo */\n\t\tLedGpioCfg |= (BIT8 | BIT9 | BIT13 | BIT14);\t/* set gpo output value */\n\t\trtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tpLed->bLedOn = _FALSE;\n}\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n\n\n//================================================================================\n// Default LED behavior.\n//================================================================================\n\n//\n//\tDescription:\n//\t\tInitialize all LED_871x objects.\n//\nvoid\nrtl8814au_InitSwLeds(\n\t_adapter\t*padapter\n\t)\n{\n\tstruct led_priv *pledpriv = &(padapter->ledpriv);\n\n\tpledpriv->LedControlHandler = LedControlUSB;\n\n\tpledpriv->SwLedOn = SwLedOn_8814AU;\n\tpledpriv->SwLedOff = SwLedOff_8814AU;\n\n\tInitLed(padapter, &(pledpriv->SwLed0), LED_PIN_LED0);\n\n\tInitLed(padapter, &(pledpriv->SwLed1), LED_PIN_LED1);\n\n\tInitLed(padapter, &(pledpriv->SwLed2), LED_PIN_LED2);\n}\n\n\n//\n//\tDescription:\n//\t\tDeInitialize all LED_819xUsb objects.\n//\nvoid\nrtl8814au_DeInitSwLeds(\n\t_adapter\t*padapter\n\t)\n{\n\tstruct led_priv\t*ledpriv = &(padapter->ledpriv);\n\n\tDeInitLed( &(ledpriv->SwLed0) );\n\tDeInitLed( &(ledpriv->SwLed1) );\n\tDeInitLed( &(ledpriv->SwLed2) );\n}\n\n"
  },
  {
    "path": "hal/rtl8814a/usb/rtl8814au_recv.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814AU_RECV_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\nint\trtl8814au_init_recv_priv(_adapter *padapter)\n{\n\treturn usb_init_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN);\n}\n\nvoid rtl8814au_free_recv_priv(_adapter *padapter)\n{\n\tusb_free_recv_priv(padapter, INTERRUPT_MSG_FORMAT_LEN);\n}\n\n"
  },
  {
    "path": "hal/rtl8814a/usb/rtl8814au_xmit.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RTL8814AU_XMIT_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n\ns32\trtl8814au_init_xmit_priv(_adapter *padapter)\n{\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n#ifdef PLATFORM_LINUX\n\ttasklet_init(&pxmitpriv->xmit_tasklet,\n\t     (void(*)(unsigned long))rtl8814au_xmit_tasklet,\n\t     (unsigned long)padapter);\n#endif\n#ifdef CONFIG_TX_EARLY_MODE\n\tpHalData->bEarlyModeEnable = padapter->registrypriv.early_mode;\n#endif\n\n\treturn _SUCCESS;\n}\n\nvoid\trtl8814au_free_xmit_priv(_adapter *padapter)\n{\n}\n\nstatic s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz ,u8 bagg_pkt)\n{\t\n      int\tpull=0;\n\tuint\tqsel;\n\tu8 data_rate,pwr_status,offset;\n\t_adapter\t\t\t*padapter = pxmitframe->padapter;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\t\t\n\tstruct pkt_attrib\t*pattrib = &pxmitframe->attrib;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tu8\t*ptxdesc =  pmem;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tsint\tbmcst = IS_MCAST(pattrib->ra);\n\tu16\t\t\t\tSWDefineContent = 0x0;\t\n\tu8\t\t\t\tDriverFixedRate = 0x0;\n\n#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX \n\tif (padapter->registrypriv.mp_mode == 0)\n\t{\n\t\tif((PACKET_OFFSET_SZ != 0) && (!bagg_pkt) &&(rtw_usb_bulk_size_boundary(padapter,TXDESC_SIZE+sz)==_FALSE))\n\t\t{\n\t\t\tptxdesc = (pmem+PACKET_OFFSET_SZ);\n\t\t\t//DBG_8192C(\"==> non-agg-pkt,shift pointer...\\n\");\n\t\t\tpull = 1;\n\t\t}\n\t}\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_TX\n\n\t_rtw_memset(ptxdesc, 0, TXDESC_SIZE);\n\t\n        //4 offset 0\n\t//SET_TX_DESC_FIRST_SEG_8812(ptxdesc, 1);\n\tSET_TX_DESC_LAST_SEG_8814A(ptxdesc, 1);\n\t//SET_TX_DESC_OWN_8812(ptxdesc, 1);\n\t\t\n\t//DBG_8192C(\"%s==> pkt_len=%d,bagg_pkt=%02x\\n\",__FUNCTION__,sz,bagg_pkt);\n\tSET_TX_DESC_PKT_SIZE_8814A(ptxdesc, sz);\n\t\n\toffset = TXDESC_SIZE + OFFSET_SZ;\t\t\n\n#ifdef CONFIG_TX_EARLY_MODE\t\n\tif(bagg_pkt){\t\t\n\t\toffset += EARLY_MODE_INFO_SIZE ;//0x28\t\t\t\n\t}\n#endif\n\t//DBG_8192C(\"%s==>offset(0x%02x)  \\n\",__FUNCTION__,offset);\n\tSET_TX_DESC_OFFSET_8814A(ptxdesc, offset);\n\n\tif (bmcst) {\n\t\tSET_TX_DESC_BMC_8814A(ptxdesc, 1);\n\t}\n\n#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\tif (padapter->registrypriv.mp_mode == 0)\n\t{\n\t\tif((PACKET_OFFSET_SZ != 0) && (!bagg_pkt)){\n\t\t\tif((pull) && (pxmitframe->pkt_offset>0)) {\t\n\t\t\t\tpxmitframe->pkt_offset = pxmitframe->pkt_offset -1;\t\t\n\t\t\t}\n\t\t}\n\t}\t\n#endif\n\n\t//DBG_8192C(\"%s, pkt_offset=0x%02x\\n\",__FUNCTION__,pxmitframe->pkt_offset);\n\t// pkt_offset, unit:8 bytes padding\n\tif (pxmitframe->pkt_offset > 0) {\n\t\tSET_TX_DESC_PKT_OFFSET_8814A(ptxdesc, pxmitframe->pkt_offset);\n\t}\n\n\tSET_TX_DESC_MACID_8814A(ptxdesc, pattrib->mac_id);\n\tSET_TX_DESC_RATE_ID_8814A(ptxdesc, pattrib->raid);\n\n\tSET_TX_DESC_QUEUE_SEL_8814A(ptxdesc,  pattrib->qsel);\n\n\t//offset 12\n\n\tif (!pattrib->qos_en) {\n\t\t/* HW sequence, to fix to use 0 queue. todo: 4AC packets to use auto queue select */\n\t\tSET_TX_DESC_HWSEQ_EN_8814A(ptxdesc, 1); // Hw set sequence number\n\t\tSET_TX_DESC_EN_HWEXSEQ_8814A(ptxdesc, 0);\n\t\tSET_TX_DESC_DISQSELSEQ_8814A(ptxdesc, 1);\n\t\tSET_TX_DESC_HW_SSN_SEL_8814A(ptxdesc, 0);\n\t} else {\n\t\tSET_TX_DESC_SEQ_8814A(ptxdesc, pattrib->seqnum);\n\t}\n\n\tif((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)\n\t{\n\t\t//DBG_8192C(\"pxmitframe->frame_tag == DATA_FRAMETAG\\n\");\t\t\n\n\t\trtl8814a_fill_txdesc_sectype(pattrib, ptxdesc);\n\n\t\t//offset 20\n#ifdef CONFIG_USB_TX_AGGREGATION\n\t\tif (pxmitframe->agg_num > 1){\n\t\t\t//DBG_8192C(\"%s agg_num:%d\\n\",__FUNCTION__,pxmitframe->agg_num );\n\t\t\tSET_TX_DESC_USB_TXAGG_NUM_8814A(ptxdesc, pxmitframe->agg_num);\n\t\t}\n#endif //CONFIG_USB_TX_AGGREGATION\n\n\t\trtl8814a_fill_txdesc_vcs(padapter, pattrib, ptxdesc);\n\n\t\tif ((pattrib->ether_type != 0x888e) &&\n\t\t    (pattrib->ether_type != 0x0806) &&\n\t\t    (pattrib->ether_type != 0x88b4) &&\n\t\t    (pattrib->dhcp_pkt != 1)\n#ifdef CONFIG_AUTO_AP_MODE\n\t\t    && (pattrib->pctrl != _TRUE)\n#endif\n\t\t)\n\t\t{\n\t\t\t//Non EAP & ARP & DHCP type data packet\n\n\t\t\tif (pattrib->ampdu_en==_TRUE) {\n\t\t\t\tSET_TX_DESC_AGG_ENABLE_8814A(ptxdesc, 1);\n\t\t\t\tSET_TX_DESC_MAX_AGG_NUM_8814A(ptxdesc, 0x1f);\n\t\t\t\t// Set A-MPDU aggregation.\n\t\t\t\tSET_TX_DESC_AMPDU_DENSITY_8814A(ptxdesc, pattrib->ampdu_spacing);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tSET_TX_DESC_BK_8814A(ptxdesc, 1);\n\t\t\t}\n\n\t\t\trtl8814a_fill_txdesc_phy(padapter, pattrib, ptxdesc);\n\n\t\t\t//DATA  Rate FB LMT\n\t\t\t//SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0x1f);\n\t\t\tif(pHalData->CurrentBandType == BAND_ON_5G)\n\t\t\t{\n\t\t\t\tSET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 4);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tSET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0);\n\t\t\t}\n\n\t\t\tif (pHalData->fw_ractrl == _FALSE) {\n\t\t\t\tSET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\t\t\tDriverFixedRate = 0x01;\n\t\t\t\t\n\t\t\t\tif(pHalData->INIDATA_RATE[pattrib->mac_id] & BIT(7))\n\t\t\t\t\tSET_TX_DESC_DATA_SHORT_8814A(ptxdesc, \t1);\n\n\t\t\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, (pHalData->INIDATA_RATE[pattrib->mac_id] & 0x7F));\n\t\t\t}\n\n\t\t\tif (padapter->fix_rate != 0xFF) { // modify data rate by iwpriv\n\t\t\t\tSET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\t\t\tDriverFixedRate = 0x01;\t\t\t\t\n\t\t\t\tif(padapter->fix_rate & BIT(7))\n\t\t\t\t\tSET_TX_DESC_DATA_SHORT_8814A(ptxdesc, \t1);\n\n\t\t\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, (padapter->fix_rate & 0x7F));\n\t\t\t\tif (!padapter->data_fb)\n\t\t\t\t\tSET_TX_DESC_DISABLE_FB_8814A(ptxdesc,1);\n\t\t\t}\n\n\t\t\tif (pattrib->ldpc)\n\t\t\t\tSET_TX_DESC_DATA_LDPC_8814A(ptxdesc, 1);\n\t\t\tif (pattrib->stbc)\t\n\t\t\t\tSET_TX_DESC_DATA_STBC_8814A(ptxdesc, 1);\n\t\t\t\n\t\t\t//work arond before fixing RA\n\t\t\t//SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\t\t//SET_TX_DESC_TX_RATE_8814A(ptxdesc, 0x10);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// EAP data packet and ARP packet and DHCP.\n\t\t\t// Use the 1M data rate to send the EAP/ARP packet.\n\t\t\t// This will maybe make the handshake smooth.\n\n\t\t\tSET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\t\tDriverFixedRate = 0x01;\n\t\t\tSET_TX_DESC_BK_8814A(ptxdesc, 1);\n\n\t\t\t// HW will ignore this setting if the transmission rate is legacy OFDM.\n\t\t\tif (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) {\n\t\t\t\tSET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1);\n\t\t\t}\n\n\t\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate));\n\t\t}\n\n\t}\n\telse if((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG)\n\t{\n\t\t//DBG_8192C(\"pxmitframe->frame_tag == MGNT_FRAMETAG\\n\");\t\n\n\t\tSET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\tDriverFixedRate = 0x01;\n\n#ifdef CONFIG_INTEL_PROXIM\n\t\tif((padapter->proximity.proxim_on==_TRUE)&&(pattrib->intel_proxim==_TRUE)){\n\t\t\tDBG_871X(\"\\n %s pattrib->rate=%d\\n\",__FUNCTION__,pattrib->rate);\n\t\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, pattrib->rate);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pattrib->rate));\n\t\t}\n\n\t\t// VHT NDPA or HT NDPA Packet for Beamformer.\n\t\tif((pattrib->subtype == WIFI_NDPA) || \n\t\t\t((pattrib->subtype == WIFI_ACTION_NOACK) && (pattrib->order == 1)))\n\t\t{\n\t\t\tSET_TX_DESC_NAV_USE_HDR_8814A(ptxdesc, 1);\n\n\t\t\tSET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib));\n\t\t\tSET_TX_DESC_RTS_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib));\n\n\t\t\tSET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1);\n\t\t\tSET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 5);\n\t\t\tSET_TX_DESC_DISABLE_FB_8814A(ptxdesc, 1);\n\n\t\t\t//if(pattrib->rts_cca)\n\t\t\t//{\n\t\t\t//\tSET_TX_DESC_NDPA_8812(ptxdesc, 2);\n\t\t\t//}\t\n\t\t\t//else\n\t\t\t{\n\t\t\t\tSET_TX_DESC_NDPA_8814A(ptxdesc, 1);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1);\n\t\t\tif (pattrib->retry_ctrl == _TRUE) {\n\t\t\t\tSET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 6);\n\t\t\t} else {\n\t\t\t\tSET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 12);\n\t\t\t}\n\t\t}\n\n#ifdef CONFIG_XMIT_ACK\n\t\t//CCX-TXRPT ack for xmit mgmt frames.\n\t\tif (pxmitframe->ack_report) {\n\t\t\tSET_TX_DESC_SPE_RPT_8814A(ptxdesc, 1);\n\t\t\t#ifdef DBG_CCX\n\t\t\tDBG_871X(\"%s set tx report\\n\", __func__);\n\t\t\t#endif\n\t\t}\n#endif //CONFIG_XMIT_ACK\n\t}\n\telse if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG)\n\t{\n\t\tDBG_871X(\"pxmitframe->frame_tag == TXAGG_FRAMETAG\\n\");\n\t}\n#ifdef CONFIG_MP_INCLUDED\n\telse if(((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) &&\n\t\t(padapter->registrypriv.mp_mode == 1))\n\t{\n\t\tfill_txdesc_for_mp(padapter, ptxdesc);\n\t}\n#endif\n\telse\n\t{\n\t\tDBG_871X(\"pxmitframe->frame_tag = %d\\n\", pxmitframe->frame_tag);\n\n\t\tSET_TX_DESC_USE_RATE_8814A(ptxdesc, 1);\n\t\tDriverFixedRate = 0x01;\n\t\tSET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate));\n\t}\n\tif (DriverFixedRate)\n\t\tSWDefineContent |= 0x01;\n\tSET_TX_DESC_SW_DEFINE_8814A(ptxdesc,  SWDefineContent);\n\n\tSET_TX_DESC_GID_8814A(ptxdesc, pattrib->txbf_g_id);\n\tSET_TX_DESC_PAID_8814A(ptxdesc, pattrib->txbf_p_aid);\t\t\t\t\n\n\trtl8814a_cal_txdesc_chksum(ptxdesc);\n\t_dbg_dump_tx_info(padapter,pxmitframe->frame_tag,ptxdesc);\t\n\treturn pull;\n}\n\n\n#ifdef CONFIG_XMIT_THREAD_MODE\n/*\n * Description\n *\tTransmit xmitbuf to hardware tx fifo\n *\n * Return\n *\t_SUCCESS\tok\n *\t_FAIL\t\tsomething error\n */\ns32 rtl8814au_xmit_buf_handler(PADAPTER padapter)\n{\n\tPHAL_DATA_TYPE phal;\n\tstruct xmit_priv *pxmitpriv;\n\tstruct xmit_buf *pxmitbuf;\n\ts32 ret;\n\n\n\tphal = GET_HAL_DATA(padapter);\n\tpxmitpriv = &padapter->xmitpriv;\n\n\tret = _rtw_down_sema(&pxmitpriv->xmit_sema);\n\tif (_FAIL == ret) {\n\t\tRT_TRACE(_module_hal_xmit_c_, _drv_emerg_,\n\t\t\t\t (\"%s: down SdioXmitBufSema fail!\\n\", __FUNCTION__));\n\t\treturn _FAIL;\n\t}\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\tRT_TRACE(_module_hal_xmit_c_, _drv_notice_\n\t\t\t\t, (\"%s: bDriverStopped(%s) bSurpriseRemoved(%s)!\\n\"\n\t\t\t\t, __func__\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\treturn _FAIL;\n\t}\n\n\tif(check_pending_xmitbuf(pxmitpriv) == _FALSE)\n\t\treturn _SUCCESS;\n\n#ifdef CONFIG_LPS_LCLK\n\tret = rtw_register_tx_alive(padapter);\n\tif (ret != _SUCCESS) {\n\t\tRT_TRACE(_module_hal_xmit_c_, _drv_notice_,\n\t\t\t\t (\"%s: wait to leave LPS_LCLK\\n\", __FUNCTION__));\n\t\treturn _SUCCESS;\n\t}\n#endif //CONFIG_LPS_LCLK\n\n\tdo {\n\t\tpxmitbuf = dequeue_pending_xmitbuf(pxmitpriv);\n\t\tif (pxmitbuf == NULL) break;\n\n\t\trtw_write_port(padapter, pxmitbuf->ff_hwaddr, pxmitbuf->len, (unsigned char*)pxmitbuf);\n\n\t} while (1);\n\n#ifdef CONFIG_LPS_LCLK\n\trtw_unregister_tx_alive(padapter);\n#endif //CONFIG_LPS_LCLK\n\n\treturn _SUCCESS;\n}\n#endif //CONFIG_XMIT_THREAD_MODE\n\n\n//for non-agg data frame or  management frame\nstatic s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\ts32 ret = _SUCCESS;\n\ts32 inner_ret = _SUCCESS;\n\tint t, sz, w_sz, pull=0;\n\tu8 *mem_addr;\n\tu32 ff_hwaddr;\n\tstruct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n#ifdef CONFIG_80211N_HT\n\tif ((pxmitframe->frame_tag == DATA_FRAMETAG) &&\n\t    (pxmitframe->attrib.ether_type != 0x0806) &&\n\t    (pxmitframe->attrib.ether_type != 0x888e) &&\n\t    (pxmitframe->attrib.ether_type != 0x88b4) &&\n\t    (pxmitframe->attrib.dhcp_pkt != 1))\n\t{\n\t\trtw_issue_addbareq_cmd(padapter, pxmitframe);\n\t}\n#endif //CONFIG_80211N_HT\n\tmem_addr = pxmitframe->buf_addr;\n\n\t//DBG_871X(\"rtw_dump_xframe()\\n\");\n\t\n\tfor (t = 0; t < pattrib->nr_frags; t++)\n\t{\n\t\tif (inner_ret != _SUCCESS && ret == _SUCCESS)\n\t\t\tret = _FAIL;\n\t\t\t\n\t\tif (t != (pattrib->nr_frags - 1))\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,(\"pattrib->nr_frags=%d\\n\", pattrib->nr_frags));\n\n\t\t\tsz = pxmitpriv->frag_len;\n\t\t\tsz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len);\t\t\t\t\t\n\t\t}\n\t\telse //no frag\n\t\t{\n\t\t\tsz = pattrib->last_txcmdsz;\n\t\t}\n\n\t\tpull = update_txdesc(pxmitframe, mem_addr, sz, _FALSE);\n             \n\t\tif(pull)\n\t\t{\n\t\t\tmem_addr += PACKET_OFFSET_SZ; //pull txdesc head\n\t\t\t\n\t\t\t//pxmitbuf ->pbuf = mem_addr;\t\t\t\n\t\t\tpxmitframe->buf_addr = mem_addr;\n\n\t\t\tw_sz = sz + TXDESC_SIZE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tw_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ;\n\t\t}\t\n\n\t\tff_hwaddr = rtw_get_ff_hwaddr(pxmitframe);\n\n#ifdef CONFIG_XMIT_THREAD_MODE\n\t\tpxmitbuf->len = w_sz;\n\t\tpxmitbuf->ff_hwaddr = ff_hwaddr;\n\t\tenqueue_pending_xmitbuf(pxmitpriv, pxmitbuf);\n#else\n\t\tinner_ret = rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf);\n#endif\n\t\trtw_count_tx_stats(padapter, pxmitframe, sz);\n\n\t\t//DBG_871X(\"rtw_write_port, w_sz=%d\\n\", w_sz);\n\t\t//DBG_8192C(\"rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\\n\", w_sz, sz, w_sz-sz, pattrib->priority);      \n\n\t\tmem_addr += w_sz;\n\n\t\tmem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr)));\n\n\t}\n\t\n\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\n\tif  (ret != _SUCCESS)\n\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);\n\t\n\treturn ret;\n}\n\n#ifdef CONFIG_USB_TX_AGGREGATION\nstatic u32 xmitframe_need_length(struct xmit_frame *pxmitframe)\n{\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\n\tu32\tlen = 0;\n\n\t// no consider fragement\n\tlen = pattrib->hdrlen + pattrib->iv_len +\n\t\tSNAP_SIZE + sizeof(u16) +\n\t\tpattrib->pktlen +\n\t\t((pattrib->bswenc) ? pattrib->icv_len : 0);\n\n\tif(pattrib->encrypt ==_TKIP_)\n\t\tlen += 8;\n\n\treturn len;\n}\n\n#define IDEA_CONDITION 1\t// check all packets before enqueue\ns32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct xmit_frame *pxmitframe = NULL;\n\tstruct xmit_frame *pfirstframe = NULL;\n\n\t// aggregate variable\n\tstruct hw_xmit *phwxmit;\n\tstruct sta_info *psta = NULL;\n\tstruct tx_servq *ptxservq = NULL;\n\n\t_irqL irqL;\n\t_list *xmitframe_plist = NULL, *xmitframe_phead = NULL;\n\n\tu32\tpbuf;\t// next pkt address\n\tu32\tpbuf_tail;\t// last pkt tail\n\tu32\tlen;\t// packet length, except TXDESC_SIZE and PKT_OFFSET\n\n\tu32\tbulkSize = pHalData->UsbBulkOutSize;\n\tu8\tdescCount;\n\tu32\tbulkPtr;\n\n\t// dump frame variable\n\tu32 ff_hwaddr;\n\n\t_list *sta_plist, *sta_phead;\n\tu8 single_sta_in_queue = _FALSE;\n\n#ifndef IDEA_CONDITION\n\tint res = _SUCCESS;\n#endif\n\n\tRT_TRACE(_module_rtl8192c_xmit_c_, _drv_info_, (\"+xmitframe_complete\\n\"));\n\n\n\t// check xmitbuffer is ok\n\tif (pxmitbuf == NULL) {\n\t\tpxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);\n\t\tif (pxmitbuf == NULL){\n\t\t\t//DBG_871X(\"%s #1, connot alloc xmitbuf!!!! \\n\",__FUNCTION__);\n\t\t\treturn _FALSE;\n\t\t}\n\t}\n\n//DBG_8192C(\"%s ===================================== \\n\",__FUNCTION__);\n\t//3 1. pick up first frame\n\tdo {\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\t\n\t\tpxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);\n\t\tif (pxmitframe == NULL) {\n\t\t\t// no more xmit frame, release xmit buffer\n\t\t\t//DBG_8192C(\"no more xmit frame ,return\\n\");\n\t\t\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n\t\t\treturn _FALSE;\n\t\t}\n\n#ifndef IDEA_CONDITION\n\t\tif (pxmitframe->frame_tag != DATA_FRAMETAG) {\n\t\t\tRT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,\n\t\t\t\t (\"xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\\n\",\n\t\t\t\t  pxmitframe->frame_tag, DATA_FRAMETAG));\n//\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TID 0~15\n\t\tif ((pxmitframe->attrib.priority < 0) ||\n\t\t    (pxmitframe->attrib.priority > 15)) {\n\t\t\tRT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,\n\t\t\t\t (\"xmitframe_complete: TID(%d) should be 0~15!\\n\",\n\t\t\t\t  pxmitframe->attrib.priority));\n//\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tcontinue;\n\t\t}\n#endif\n\t\t//DBG_8192C(\"==> pxmitframe->attrib.priority:%d\\n\",pxmitframe->attrib.priority);\n\t\tpxmitframe->pxmitbuf = pxmitbuf;\n\t\tpxmitframe->buf_addr = pxmitbuf->pbuf;\n\t\tpxmitbuf->priv_data = pxmitframe;\n\n\t\tpxmitframe->agg_num = 1; // alloc xmitframe should assign to 1.\n\t\t#ifdef CONFIG_TX_EARLY_MODE\n\t\tpxmitframe->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\n\t\t#else\n\t\tpxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8); // 1; // first frame of aggregation, reserve offset\n\t\t#endif\n\n\t\tif (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) {\n\t\t\tDBG_871X(\"%s coalesce 1st xmitframe failed \\n\",__FUNCTION__);\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t// always return ndis_packet after rtw_xmitframe_coalesce\n\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\n\t\tbreak;\n\t} while (1);\n\n\t//3 2. aggregate same priority and same DA(AP or STA) frames\n\tpfirstframe = pxmitframe;\n\tlen = xmitframe_need_length(pfirstframe) + TXDESC_SIZE+(pfirstframe->pkt_offset*PACKET_OFFSET_SZ);\n\tpbuf_tail = len;\n\tpbuf = _RND8(pbuf_tail);\n\n\t// check pkt amount in one bulk\n\tdescCount = 0;\n\tbulkPtr = bulkSize;\n\tif (pbuf < bulkPtr)\n\t\tdescCount++;\n\tif (descCount == pHalData->UsbTxAggDescNum)\n\t\tgoto agg_end;\n\telse {\n\t\tdescCount = 0;\n\t\tbulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize\n\t}\n\n\t// dequeue same priority packet from station tx queue\n\tpsta = pfirstframe->attrib.psta;\n\tswitch (pfirstframe->attrib.priority) {\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tptxservq = &(psta->sta_xmitpriv.bk_q);\n\t\t\tphwxmit = pxmitpriv->hwxmits + 3;\n\t\t\tbreak;\n\n\t\tcase 4:\n\t\tcase 5:\n\t\t\tptxservq = &(psta->sta_xmitpriv.vi_q);\n\t\t\tphwxmit = pxmitpriv->hwxmits + 1;\n\t\t\tbreak;\n\n\t\tcase 6:\n\t\tcase 7:\n\t\t\tptxservq = &(psta->sta_xmitpriv.vo_q);\n\t\t\tphwxmit = pxmitpriv->hwxmits;\n\t\t\tbreak;\n\n\t\tcase 0:\n\t\tcase 3:\n\t\tdefault:\n\t\t\tptxservq = &(psta->sta_xmitpriv.be_q);\n\t\t\tphwxmit = pxmitpriv->hwxmits + 2;\n\t\t\tbreak;\n\t}\n//DBG_8192C(\"==> pkt_no=%d,pkt_len=%d,len=%d,RND8_LEN=%d,pkt_offset=0x%02x\\n\",\n\t//pxmitframe->agg_num,pxmitframe->attrib.last_txcmdsz,len,pbuf,pxmitframe->pkt_offset );\n\n\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tsta_phead = get_list_head(phwxmit->sta_queue);\n\tsta_plist = get_next(sta_phead);\n\tsingle_sta_in_queue = rtw_end_of_queue_search(sta_phead, get_next(sta_plist));\n\n\txmitframe_phead = get_list_head(&ptxservq->sta_pending);\n\txmitframe_plist = get_next(xmitframe_phead);\n\t\n\twhile (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE)\n\t{\n\t\tpxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);\n\t\txmitframe_plist = get_next(xmitframe_plist);\n\n\t\tif(_FAIL == rtw_hal_busagg_qsel_check(padapter,pfirstframe->attrib.qsel,pxmitframe->attrib.qsel))\n\t\t\tbreak;\n\t\t\n             pxmitframe->agg_num = 0; // not first frame of aggregation\n\t\t#ifdef CONFIG_TX_EARLY_MODE\n\t\tpxmitframe->pkt_offset = 1;// not first frame of aggregation,reserve offset for EM Info\n\t\t#else\n\t\tpxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset\n\t\t#endif\t\n\n\t\tlen = xmitframe_need_length(pxmitframe) + TXDESC_SIZE +(pxmitframe->pkt_offset*PACKET_OFFSET_SZ);\n\t\t\n\t\tif (_RND8(pbuf + len) > MAX_XMITBUF_SZ)\n\t\t//if (_RND8(pbuf + len) > (MAX_XMITBUF_SZ/2))//to do : for TX TP finial tune , Georgia 2012-0323\n\t\t{\n\t\t\t//DBG_8192C(\"%s....len> MAX_XMITBUF_SZ\\n\",__FUNCTION__);\n\t\t\tpxmitframe->agg_num = 1;\n\t\t\tpxmitframe->pkt_offset = 1;\t\t\t\n\t\t\tbreak;\t\t\n\t\t}\n\t\trtw_list_delete(&pxmitframe->list);\n\t\tptxservq->qcnt--;\n\t\tphwxmit->accnt--;\n\n#ifndef IDEA_CONDITION\n\t\t// suppose only data frames would be in queue\n\t\tif (pxmitframe->frame_tag != DATA_FRAMETAG) {\n\t\t\tRT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,\n\t\t\t\t (\"xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\\n\",\n\t\t\t\t  pxmitframe->frame_tag, DATA_FRAMETAG));\n\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TID 0~15\n\t\tif ((pxmitframe->attrib.priority < 0) ||\n\t\t    (pxmitframe->attrib.priority > 15)) {\n\t\t\tRT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_,\n\t\t\t\t (\"xmitframe_complete: TID(%d) should be 0~15!\\n\",\n\t\t\t\t  pxmitframe->attrib.priority));\n\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tcontinue;\n\t\t}\n#endif\n\n//\t\tpxmitframe->pxmitbuf = pxmitbuf;\n\t\tpxmitframe->buf_addr = pxmitbuf->pbuf + pbuf;\n\t\n\t\tif (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) {\n\t\t\tDBG_871X(\"%s coalesce failed \\n\",__FUNCTION__);\n\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\t\tcontinue;\n\t\t}\n\n\t\t//DBG_8192C(\"==> pxmitframe->attrib.priority:%d\\n\",pxmitframe->attrib.priority);\n\t\t// always return ndis_packet after rtw_xmitframe_coalesce\n\t\trtw_os_xmit_complete(padapter, pxmitframe);\n\n\t\t// (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz\n\t\tupdate_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz,_TRUE);\n\t\t\t\t\n\t\t// don't need xmitframe any more\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\n\t\t// handle pointer and stop condition\n\t\tpbuf_tail = pbuf + len;\n\t\tpbuf = _RND8(pbuf_tail);\n\n\n\t\tpfirstframe->agg_num++;\n#ifdef CONFIG_TX_EARLY_MODE\t\n\t\tpxmitpriv->agg_pkt[pfirstframe->agg_num-1].offset = _RND8(len); \t\t\t\n\t\tpxmitpriv->agg_pkt[pfirstframe->agg_num-1].pkt_len = pxmitframe->attrib.last_txcmdsz;\t\t\t\t\t\t\n#endif\n\t\tif (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num)\n\t\t\tbreak;\n\n\t\tif (pbuf < bulkPtr) {\n\t\t\tdescCount++;\n\t\t\tif (descCount == pHalData->UsbTxAggDescNum)\n\t\t\t\tbreak;\n\t\t} else {\n\t\t\tdescCount = 0;\n\t\t\tbulkPtr = ((pbuf / bulkSize) + 1) * bulkSize;\n\t\t}\n\t}//end while( aggregate same priority and same DA(AP or STA) frames)\n\tif (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE)\n\t\trtw_list_delete(&ptxservq->tx_pending);\n\telse if (single_sta_in_queue == _FALSE) {\n\t\t/* Re-arrange the order of stations in this ac queue to balance the service for these stations */\n\t\trtw_list_delete(&ptxservq->tx_pending);\n\t\trtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmit->sta_queue));\n\t}\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\nagg_end:\n#ifdef CONFIG_80211N_HT\n\tif ((pfirstframe->attrib.ether_type != 0x0806) &&\n\t    (pfirstframe->attrib.ether_type != 0x888e) &&\n\t    (pfirstframe->attrib.ether_type != 0x88b4) &&\n\t    (pfirstframe->attrib.dhcp_pkt != 1))\n\t{\n\t\trtw_issue_addbareq_cmd(padapter, pfirstframe);\n\t}\n#endif //CONFIG_80211N_HT\n#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t//3 3. update first frame txdesc\n\tif ((PACKET_OFFSET_SZ != 0) && ((pbuf_tail % bulkSize) == 0)) {\n\t\t// remove pkt_offset\n\t\tpbuf_tail -= PACKET_OFFSET_SZ;\n\t\tpfirstframe->buf_addr += PACKET_OFFSET_SZ;\n\t\tpfirstframe->pkt_offset--;\n\t\t//DBG_8192C(\"$$$$$ buf size equal to USB block size $$$$$$\\n\");\n\t}\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_TX\n\n\tupdate_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz,_TRUE);\n\t\t\n        #ifdef CONFIG_TX_EARLY_MODE\n\t//prepare EM info for first frame, agg_num value start from 1\n\tpxmitpriv->agg_pkt[0].offset = _RND8(pfirstframe->attrib.last_txcmdsz +TXDESC_SIZE +(pfirstframe->pkt_offset*PACKET_OFFSET_SZ));\n\tpxmitpriv->agg_pkt[0].pkt_len = pfirstframe->attrib.last_txcmdsz;//get from rtw_xmitframe_coalesce \t\t\t\n\n\tUpdateEarlyModeInfo8812(pxmitpriv,pxmitbuf );\n\t#endif\n\t\n\t//3 4. write xmit buffer to USB FIFO\n\tff_hwaddr = rtw_get_ff_hwaddr(pfirstframe);\n//DBG_8192C(\"%s ===================================== write port,buf_size(%d) \\n\",__FUNCTION__,pbuf_tail);\n\t// xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr\n\trtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf);\n\n\n\t//3 5. update statisitc\n\tpbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE);\n\tpbuf_tail -= (pfirstframe->pkt_offset * PACKET_OFFSET_SZ);\n\t\n\t\n\trtw_count_tx_stats(padapter, pfirstframe, pbuf_tail);\n\n\trtw_free_xmitframe(pxmitpriv, pfirstframe);\n\n\treturn _TRUE;\n}\n\n#else //CONFIG_USB_TX_AGGREGATION\n\ns32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)\n{\t\t\n\n\tstruct hw_xmit *phwxmits;\n\tsint hwentry;\n\tstruct xmit_frame *pxmitframe=NULL;\t\n\tint res=_SUCCESS, xcnt = 0;\n\n\tphwxmits = pxmitpriv->hwxmits;\n\thwentry = pxmitpriv->hwxmit_entry;\n\n\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"xmitframe_complete()\\n\"));\n\n\tif(pxmitbuf==NULL)\n\t{\n\t\tpxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);\t\t\n\t\tif(!pxmitbuf)\n\t\t{\n\t\t\treturn _FALSE;\n\t\t}\t\t\t\n\t}\t\n\n\n\tdo\n\t{\t\t\n\t\tpxmitframe =  rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry);\n\t\t\n\t\tif(pxmitframe)\n\t\t{\n\t\t\tpxmitframe->pxmitbuf = pxmitbuf;\t\t\t\t\n\n\t\t\tpxmitframe->buf_addr = pxmitbuf->pbuf;\n\n\t\t\tpxmitbuf->priv_data = pxmitframe;\t\n\n\t\t\tif((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)\n\t\t\t{\t\n\t\t\t\tif(pxmitframe->attrib.priority<=15)//TID0~15\n\t\t\t\t{\n\t\t\t\t\tres = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe);\n\t\t\t\t}\t\n\t\t\t\t//DBG_8192C(\"==> pxmitframe->attrib.priority:%d\\n\",pxmitframe->attrib.priority);\n\t\t\t\trtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce \t\t\t\n\t\t\t}\n\n\t\t\t\t\n\t\t\tRT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(\"xmitframe_complete(): rtw_dump_xframe\\n\"));\n\n\t\t\t\n\t\t\tif(res == _SUCCESS)\n\t\t\t{\n\t\t\t\trtw_dump_xframe(padapter, pxmitframe);\t\t \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n\t\t\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\t\n\t\t\t}\n\t \t\t\t \t\t\n\t\t\txcnt++;\n\t\t\t\n\t\t}\n\t\telse\n\t\t{\t\t\t\n\t\t\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n\t\t\treturn _FALSE;\n\t\t}\n\n\t\tbreak;\n\t\t\n\t}while(0/*xcnt < (NR_XMITFRAME >> 3)*/);\n\n\treturn _TRUE;\n\t\n}\n#endif\n\n\n\nstatic s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\ts32 res = _SUCCESS;\n//DBG_8192C(\"==> %s \\n\",__FUNCTION__);\n\n\tres = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe);\n\tif (res == _SUCCESS) {\n\t\trtw_dump_xframe(padapter, pxmitframe);\n\t}\n\telse{\n\t\tDBG_8192C(\"==> %s xmitframe_coalsece failed\\n\",__FUNCTION__);\n\t}\n\n\treturn res;\n}\n\n/*\n * Return\n *\t_TRUE\tdump packet directly\n *\t_FALSE\tenqueue packet\n */\nstatic s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n        _irqL irqL;\n\ts32 res;\n\tstruct xmit_buf *pxmitbuf = NULL;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tu8 lg_sta_num;\n\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tif (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0)\n\t{\n\t\t//DBG_8192C(\"enqueue AC(%d)\\n\",pattrib->priority);\n\t\tgoto enqueue;\n\t}\n\n\tif (rtw_xmit_ac_blocked(padapter) == _TRUE)\n\t\tgoto enqueue;\n\n\trtw_dev_iface_status(padapter, NULL, NULL , &lg_sta_num, NULL, NULL);\n\tif (lg_sta_num)\n\t\tgoto enqueue;\n\n\tpxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);\n\tif (pxmitbuf == NULL)\n\t\tgoto enqueue;\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tpxmitframe->pxmitbuf = pxmitbuf;\n\tpxmitframe->buf_addr = pxmitbuf->pbuf;\n\tpxmitbuf->priv_data = pxmitframe;\n\n\tif (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) {\n\t\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t}\n\n\treturn _TRUE;\n\nenqueue:\n\tres = rtw_xmitframe_enqueue(padapter, pxmitframe);\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tif (res != _SUCCESS) {\n\t\tRT_TRACE(_module_xmit_osdep_c_, _drv_err_, (\"pre_xmitframe: enqueue xmitframe fail\\n\"));\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\n\t\tpxmitpriv->tx_drop++;\n\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n}\n\ns32 rtl8814au_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)\n{\n\treturn rtw_dump_xframe(padapter, pmgntframe);\n}\n\n/*\n * Return\n *\t_TRUE\tdump packet directly ok\n *\t_FALSE\ttemporary can't transmit packets to hardware\n */\ns32 rtl8814au_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\treturn pre_xmitframe(padapter, pxmitframe);\n}\n\ns32\t rtl8814au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)\n{\n\tstruct xmit_priv \t*pxmitpriv = &padapter->xmitpriv;\n\ts32 err;\n\t\n\tif ((err=rtw_xmitframe_enqueue(padapter, pxmitframe)) != _SUCCESS) \n\t{\n\t\trtw_free_xmitframe(pxmitpriv, pxmitframe);\n\n\t\tpxmitpriv->tx_drop++;\t\t\t\t\t\n\t}\n\telse\n\t{\n#ifdef PLATFORM_LINUX\n\t\ttasklet_hi_schedule(&pxmitpriv->xmit_tasklet);\n#endif\n\t}\n\t\n\treturn err;\n\t\n}\n\n\n#ifdef  CONFIG_HOSTAPD_MLME\n\nstatic void rtl8814au_hostap_mgnt_xmit_cb(struct urb *urb)\n{\t\n#ifdef PLATFORM_LINUX\n\tstruct sk_buff *skb = (struct sk_buff *)urb->context;\n\n\t//DBG_8192C(\"%s\\n\", __FUNCTION__);\n\n\trtw_skb_free(skb);\n#endif\t\n}\n\ns32 rtl8814au_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)\n{\n#ifdef PLATFORM_LINUX\n\tu16 fc;\n\tint rc, len, pipe;\t\n\tunsigned int bmcst, tid, qsel;\n\tstruct sk_buff *skb, *pxmit_skb;\n\tstruct urb *urb;\n\tunsigned char *pxmitbuf;\n\tstruct tx_desc *ptxdesc;\n\tstruct rtw_ieee80211_hdr *tx_hdr;\n\tstruct hostapd_priv *phostapdpriv = padapter->phostapdpriv;\t\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);\n\tstruct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);\t\n\n\t\n\t//DBG_8192C(\"%s\\n\", __FUNCTION__);\n\n\tskb = pkt;\n\t\n\tlen = skb->len;\n\ttx_hdr = (struct rtw_ieee80211_hdr *)(skb->data);\n\tfc = le16_to_cpu(tx_hdr->frame_ctl);\n\tbmcst = IS_MCAST(tx_hdr->addr1);\n\n\tif ((fc & RTW_IEEE80211_FCTL_FTYPE) != RTW_IEEE80211_FTYPE_MGMT)\n\t\tgoto _exit;\n\n\tpxmit_skb = rtw_skb_alloc(len + TXDESC_SIZE);\n\n\tif(!pxmit_skb)\n\t\tgoto _exit;\n\n\tpxmitbuf = pxmit_skb->data;\n\n\turb = usb_alloc_urb(0, GFP_ATOMIC);\n\tif (!urb) {\n\t\tgoto _exit;\n\t}\n\n\t// ----- fill tx desc -----\t\n\tptxdesc = (struct tx_desc *)pxmitbuf;\t\n\t_rtw_memset(ptxdesc, 0, sizeof(*ptxdesc));\n\t\t\n\t//offset 0\t\n\tptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); \n\tptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<<OFFSET_SHT)&0x00ff0000);//default = 32 bytes for TX Desc\n\tptxdesc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);\n\n\tif(bmcst)\t\n\t{\n\t\tptxdesc->txdw0 |= cpu_to_le32(BIT(24));\n\t}\t\n\n\t//offset 4\t\n\tptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID\n\n\tptxdesc->txdw1 |= cpu_to_le32((0x12<<QSEL_SHT)&0x00001f00);\n\n\tptxdesc->txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode\n\n\t//offset 8\t\t\t\n\n\t//offset 12\t\t\n\tptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000);\n\n\t//offset 16\t\t\n\tptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate\n\t\t\n\t//offset 20\n\n\n\t//HW append seq\n\tptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number\n\tptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29.\n\t\n\n\trtl8188eu_cal_txdesc_chksum(ptxdesc);\n\t// ----- end of fill tx desc -----\n\n\t//\n\tskb_put(pxmit_skb, len + TXDESC_SIZE);\n\tpxmitbuf = pxmitbuf + TXDESC_SIZE;\n\t_rtw_memcpy(pxmitbuf, skb->data, len);\n\n\t//DBG_8192C(\"mgnt_xmit, len=%x\\n\", pxmit_skb->len);\n\n\n\t// ----- prepare urb for submit -----\n\t\n\t//translate DMA FIFO addr to pipehandle\n\t//pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX);\n\tpipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f);\n\t\n\tusb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe,\n\t\t\t  pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb);\n\t\n\turb->transfer_flags |= URB_ZERO_PACKET;\n\tusb_anchor_urb(urb, &phostapdpriv->anchored);\n\trc = usb_submit_urb(urb, GFP_ATOMIC);\n\tif (rc < 0) {\n\t\tusb_unanchor_urb(urb);\n\t\tkfree_skb(skb);\n\t}\n\tusb_free_urb(urb);\n\n\t\n_exit:\t\n\t\n\trtw_skb_free(skb);\n\n#endif\n\n\treturn 0;\n\n}\n#endif\n\n"
  },
  {
    "path": "hal/rtl8814a/usb/usb_halinit.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HCI_HAL_INIT_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n#ifndef CONFIG_USB_HCI\n\n#error \"CONFIG_USB_HCI shall be on!\\n\"\n\n#endif\n\n\nstatic void _dbg_dump_macreg(_adapter *padapter)\n{\n\tu32 offset = 0;\n\tu32 val32 = 0;\n\tu32 index =0 ;\n\tfor(index=0;index<64;index++)\n\t{\n\t\toffset = index*4;\n\t\tval32 = rtw_read32(padapter,offset);\n\t\tDBG_871X(\"offset : 0x%02x ,val:0x%08x\\n\",offset,val32);\n\t}\n}\n\nstatic VOID\n_ConfigChipOutEP_8814(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tNumOutPipe\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\n\n\tpHalData->OutEpQueueSel = 0;\n\tpHalData->OutEpNumber = 0;\n\n\tswitch(NumOutPipe){\n\t\tcase \t4:\n\t\t\t\tpHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_LQ|TX_SELE_NQ;\n\t\t\t\tpHalData->OutEpNumber=4;\n\t\t\t\tbreak;\t\t\n\t\tcase \t3:\n\t\t\t\tpHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_LQ|TX_SELE_NQ;\n\t\t\t\tpHalData->OutEpNumber=3;\n\t\t\t\tbreak;\n\t\tcase \t2:\n\t\t\t\tpHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_NQ;\n\t\t\t\tpHalData->OutEpNumber=2;\n\t\t\t\tbreak;\n\t\tcase \t1:\n\t\t\t\tpHalData->OutEpQueueSel=TX_SELE_HQ;\n\t\t\t\tpHalData->OutEpNumber=1;\n\t\t\t\tbreak;\n\t\tdefault:\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t\n\t}\n\tDBG_871X(\"%s OutEpQueueSel(0x%02x), OutEpNumber(%d) \\n\",__FUNCTION__,pHalData->OutEpQueueSel,pHalData->OutEpNumber );\n\n}\n\nstatic BOOLEAN HalUsbSetQueuePipeMapping8814AUsb(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tNumInPipe,\n\tIN\tu8\t\tNumOutPipe\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(pAdapter);\n\tBOOLEAN\t\t\tresult\t\t= _FALSE;\n\n\t_ConfigChipOutEP_8814(pAdapter, NumOutPipe);\n\t\n\t// Normal chip with one IN and one OUT doesn't have interrupt IN EP.\n\tif(1 == pHalData->OutEpNumber){\n\t\tif(1 != NumInPipe){\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t// All config other than above support one Bulk IN and one Interrupt IN.\n\t//if(2 != NumInPipe){\n\t//\treturn result;\n\t//}\n\n\tresult = Hal_MappingOutPipe(pAdapter, NumOutPipe);\n\t\n\treturn result;\n\n}\n\nvoid rtl8814au_interface_configure(_adapter *padapter)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\n\tif (IS_SUPER_SPEED_USB(padapter))\n\t{\n\t\tpHalData->UsbBulkOutSize = USB_SUPER_SPEED_BULK_SIZE;//1024 bytes\n\t}\n\telse if (IS_HIGH_SPEED_USB(padapter))\n\t{\n\t\tpHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes\n\t}\n\telse\n\t{\n\t\tpHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes\n\t}\n\n\tpHalData->interfaceIndex = pdvobjpriv->InterfaceNumber;\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\tpHalData->UsbTxAggMode\t\t= 1;\n\tpHalData->UsbTxAggDescNum\t= 3;\t/* only 4 bits */\n#endif //CONFIG_USB_TX_AGGREGATION\n\n#ifdef CONFIG_USB_RX_AGGREGATION\n\tpHalData->UsbRxAggMode\t\t= USB_RX_AGG_DMA; //todo: change to USB_RX_AGG_DMA;\n\tpHalData->UsbRxAggBlockCount\t= 8; //unit : 512b\n\tpHalData->UsbRxAggBlockTimeout\t= 0x6;\n\tpHalData->UsbRxAggPageCount\t= 16; //uint :128 b //0x0A;\t// 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize\n\tpHalData->UsbRxAggPageTimeout = 0x6; //6, absolute time = 34ms/(2^6)\n\n\tif (IS_SUPER_SPEED_USB(padapter)) {\n\t\tpHalData->RegAcUsbDmaSize = 0x7;\n\t\tpHalData->RegAcUsbDmaTime = 0x1a;\n\t} else {\n\t\t//the setting to reduce RX FIFO overflow on USB2.0 and increase rx throughput\n\t\tpHalData->RegAcUsbDmaSize = 0x5;\n\t\tpHalData->RegAcUsbDmaTime = 0x20;\n\t}\n#endif //CONFIG_USB_RX_AGGREGATION\n\n\tHalUsbSetQueuePipeMapping8814AUsb(padapter,\n\t\t\t\tpdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes);\n\n}\n\nstatic VOID\n_InitBurstPktLen(IN PADAPTER Adapter)\n{\n\tu8 \t\t\tu1bTmp;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n \n\t//yx_qi 131128 move to 0x1448, 144c\n\trtw_write32(Adapter, REG_FAST_EDCA_VOVI_SETTING_8814A, 0x08070807); //yx_qi 131128\n\trtw_write32(Adapter, REG_FAST_EDCA_BEBK_SETTING_8814A, 0x08070807); //yx_qi 131128\n\t\n\tu1bTmp = rtw_read8(Adapter, 0xff); //check device operation speed: SS 0xff bit7\n\t\n\tif(u1bTmp & BIT7)   //USB2/1.1 Mode\n\t{\n \t\tpHalData->bSupportUSB3 = FALSE;\n\t}\n\telse  //USB3 Mode\n\t{\t\t\n\t\tpHalData->bSupportUSB3 = TRUE;\n\t}\n\t\n\tif(pHalData->bSupportUSB3 == _FALSE)   //USB2/1.1 Mode\n\t{\n\t\tif(pHalData->UsbBulkOutSize == 512)\n\t\t{\n\t\t\t//set burst pkt len=512B\n\t\t\trtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x1e);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//set burst pkt len=64B\n\t\t\trtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x2e);\t\t\n\t\t}\n\n\t\trtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x2005); //dmc agg th 20K\n\t}\n\telse  //USB3 Mode\n\t{\t\t\n\t\t//set burst pkt len=1k\n\t\trtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x0e);\t\t\t\t\n\t\trtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x0a05); //dmc agg th 20K\n\t\t\n\t\t// 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\n\t\trtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)&0xE7);\n\t\t//to avoid usb 3.0 H2C fail\n\t\trtw_write16(Adapter, 0xf002, 0);\n\t\t\n\t\trtw_write8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A, rtw_read8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A) & ~BIT(6));\n\t\tDBG_871X(\"turn off the LDPC pre-TX\\n\");\n\t\t\n\t} \n\n\tif(pHalData->AMPDUBurstMode)\n\t{\n\t\trtw_write8(Adapter,REG_SW_AMPDU_BURST_MODE_CTRL_8814A,  0x5F);\n\t}\n}\n\n\nVOID\n_InitQueueReservedPage_8814AUsb(\n\tIN  PADAPTER \tAdapter\n\t)\n{\n\tstruct registry_priv\t*pregistrypriv = &Adapter->registrypriv;\n\tu16\t\ttxpktbuf_bndy; \n\n\tDBG_871X(\"===>_InitQueueReservedPage_8814AUsb()\\n\");\n\n\t//---- Set Fifo page for each Queue under Mac Direct LPBK nonsec mode ------------//\n\trtw_write32(Adapter, REG_FIFOPAGE_INFO_1_8814A, HPQ_PGNUM_8814A);\n\trtw_write32(Adapter, REG_FIFOPAGE_INFO_2_8814A, LPQ_PGNUM_8814A);\n\trtw_write32(Adapter, REG_FIFOPAGE_INFO_3_8814A, NPQ_PGNUM_8814A);\n\trtw_write32(Adapter, REG_FIFOPAGE_INFO_4_8814A, EPQ_PGNUM_8814A);\n\n\trtw_write32(Adapter, REG_FIFOPAGE_INFO_5_8814A, PUB_PGNUM_8814A);\n\n\trtw_write32(Adapter, REG_RQPN_CTRL_2_8814A, 0x80000000);\n\n\tif(!pregistrypriv->wifi_spec)\n\t\ttxpktbuf_bndy = TX_PAGE_BOUNDARY_8814A;\n\telse\t\t// for WMM\n\t\ttxpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A;\n\n\t//Set page boundary and header\n\trtw_write16(Adapter,REG_TXPKTBUF_BCNQ_BDNY_8814A, txpktbuf_bndy);\n\trtw_write16(Adapter,REG_TXPKTBUF_BCNQ1_BDNY_8814A, txpktbuf_bndy);\n\trtw_write16(Adapter,REG_MGQ_PGBNDY_8814A, txpktbuf_bndy);\n\n\t//Set The head page of packet of Bcnq\n\trtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy);\n\t//The head page of packet of Bcnq1\n\trtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A+2,txpktbuf_bndy);\n\t\n\tDBG_871X(\"<===_InitQueueReservedPage_8814AUsb()\\n\");\n}\n\n\nstatic u32 _InitPowerOn_8814AU(_adapter *padapter)\n{\n\tint \t\tstatus = _SUCCESS;\n\tu16\t\t\tu2btmp=0;\n\n\t// YX sugguested 2014.06.03\n\tu8\tu1btmp = rtw_read8(padapter, 0x10C2);\n\trtw_write8(padapter, 0x10C2, (u1btmp | BIT1));\n\n\tif(!HalPwrSeqCmdParsing(padapter, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8814A_NIC_ENABLE_FLOW))\n\t\treturn _FAIL;\n\n\n\t// Enable MAC DMA/WMAC/SCHEDULE/SEC block\n\t// Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31.\n\trtw_write16(padapter, REG_CR_8814A, 0x00);  //suggseted by zhouzhou, by page, 20111230\n\tu2btmp = PlatformEFIORead2Byte(padapter, REG_CR_8814A);\n\tu2btmp |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN\n\t\t\t\t| PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN);\n\trtw_write16(padapter, REG_CR_8814A, u2btmp);\n\n\t_InitQueueReservedPage_8814AUsb(padapter);\n\treturn status;\n}\n\n\n\n\n\n//---------------------------------------------------------------\n//\n//\tMAC init functions\n//\n//---------------------------------------------------------------\n\n// Shall USB interface init this?\nstatic VOID\n_InitInterrupt_8814AU(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\n\t// HIMR\n\trtw_write32(Adapter, REG_HIMR0_8814A, pHalData->IntrMask[0]&0xFFFFFFFF);\n\trtw_write32(Adapter, REG_HIMR1_8814A, pHalData->IntrMask[1]&0xFFFFFFFF);\n}\n\nstatic void _InitID_8814A(IN  PADAPTER Adapter)\n{\n\thal_init_macaddr(Adapter);//set mac_address\n}\n\nstatic VOID\n_InitPageBoundary_8814AUsb(\n\tIN  PADAPTER Adapter\n\t)\n{\n\t//20130416 KaiYuan modified for 8814\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\t\n\trtw_write16(Adapter, REG_RXFF_PTR_8814A, RX_DMA_BOUNDARY_8814A); //yx_qi 20140331\n\t\n}\n\n\nstatic VOID\n_InitNormalChipRegPriority_8814AUsb(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu16\t\tbeQ,\n\tIN\tu16\t\tbkQ,\n\tIN\tu16\t\tviQ,\n\tIN\tu16\t\tvoQ,\n\tIN\tu16\t\tmgtQ,\n\tIN\tu16\t\thiQ\n\t)\n{\n\tu16 value16\t\t= (PlatformEFIORead2Byte(Adapter, REG_TRXDMA_CTRL_8814A) & 0x7);\n\n\tvalue16 |=\t_TXDMA_BEQ_MAP(beQ) \t| _TXDMA_BKQ_MAP(bkQ) |\n\t\t\t\t_TXDMA_VIQ_MAP(viQ) \t| _TXDMA_VOQ_MAP(voQ) |\n\t\t\t\t_TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ) | BIT2;\n\n\trtw_write16(Adapter, REG_TRXDMA_CTRL_8814A, value16);\n}\n\nstatic VOID\n_InitNormalChipTwoOutEpPriority_8814AUsb(\n\tIN\tPADAPTER Adapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\tstruct registry_priv\t*pregistrypriv = &Adapter->registrypriv;\n\tu16\t\t\tbeQ,bkQ,viQ,voQ,mgtQ,hiQ;\n\t\n\n\tu16\tvalueHi = 0;\n\tu16\tvalueLow = 0;\n\t\n\tswitch(pHalData->OutEpQueueSel)\n\t{\n\t\tcase (TX_SELE_HQ | TX_SELE_LQ):\n\t\t\tvalueHi = QUEUE_HIGH;\n\t\t\tvalueLow = QUEUE_LOW;\n\t\t\tbreak;\n\t\tcase (TX_SELE_NQ | TX_SELE_LQ):\n\t\t\tvalueHi = QUEUE_NORMAL;\n\t\t\tvalueLow = QUEUE_LOW;\n\t\t\tbreak;\n\t\tcase (TX_SELE_HQ | TX_SELE_NQ):\n\t\t\tvalueHi = QUEUE_HIGH;\n\t\t\tvalueLow = QUEUE_NORMAL;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tvalueHi = QUEUE_HIGH;\n\t\t\tvalueLow = QUEUE_NORMAL;\t\t\t\n\t\t\tbreak;\n\t}\n\n\tif(!pregistrypriv->wifi_spec){\n\t\tbeQ \t\t= valueLow;\n\t\tbkQ \t\t= valueLow;\n\t\tviQ\t\t= valueHi;\n\t\tvoQ \t\t= valueHi;\n\t\tmgtQ \t= valueHi; \n\t\thiQ \t\t= valueHi;\t\t\t\t\t\t\t\t\n\t}\n\telse{//for WMM ,CONFIG_OUT_EP_WIFI_MODE\n\t\tbeQ\t\t= valueLow;\n\t\tbkQ \t\t= valueHi;\n\t\tviQ \t\t= valueHi;\n\t\tvoQ \t\t= valueLow;\n\t\tmgtQ \t= valueHi;\n\t\thiQ \t\t= valueHi;\t\t\t\t\t\t\t\n\t}\n\t\n\t_InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);\n}\n\nstatic VOID\n_InitNormalChipThreeOutEpPriority_8814AUsb(\n\tIN\tPADAPTER Adapter\n\t)\n{\n\tstruct registry_priv\t*pregistrypriv = &Adapter->registrypriv;\n\tu16\t\t\tbeQ,bkQ,viQ,voQ,mgtQ,hiQ;\n\n\tif(!pregistrypriv->wifi_spec){// typical setting\n\t\tbeQ\t\t= QUEUE_LOW;\n\t\tbkQ \t\t= QUEUE_LOW;\n\t\tviQ \t\t= QUEUE_NORMAL;\n\t\tvoQ \t\t= QUEUE_HIGH;\n\t\tmgtQ \t= QUEUE_HIGH;\n\t\thiQ \t\t= QUEUE_HIGH;\t\t\t\n\t}\n\telse{// for WMM\n\t\tbeQ\t\t= QUEUE_LOW;\n\t\tbkQ \t\t= QUEUE_NORMAL;\n\t\tviQ \t\t= QUEUE_NORMAL;\n\t\tvoQ \t\t= QUEUE_HIGH;\n\t\tmgtQ \t= QUEUE_HIGH;\n\t\thiQ \t\t= QUEUE_HIGH;\t\t\t\n\t}\n\t_InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);\n}\n\nstatic VOID\n_InitQueuePriority_8814AUsb(\n\tIN\tPADAPTER Adapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\n\tswitch(pHalData->OutEpNumber)\n\t{\n\t\tcase 2:\n\t\t\t_InitNormalChipTwoOutEpPriority_8814AUsb(Adapter);\n\t\t\tbreak;\n\t\tcase 3:\n\t\tcase 4:\n\t\t\t_InitNormalChipThreeOutEpPriority_8814AUsb(Adapter);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"_InitQueuePriority_8812AUsb(): Shall not reach here!\\n\");\n\t\t\tbreak;\n\t}\n}\n\n\n\nstatic VOID\n_InitHardwareDropIncorrectBulkOut_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n#ifdef ENABLE_USB_DROP_INCORRECT_OUT\n\tu32\tvalue32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK);\n\tvalue32 |= DROP_DATA_EN;\n\trtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32);\n#endif //ENABLE_USB_DROP_INCORRECT_OUT\n}\n\nstatic VOID\n_InitNetworkType_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tu32\tvalue32;\n\n\tvalue32 = rtw_read32(Adapter, REG_CR);\n\t// TODO: use the other function to set network type\n\tvalue32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP);\n\n\trtw_write32(Adapter, REG_CR, value32);\n}\n\nstatic VOID\n_InitTransferPageSize_8814AUsb(\n\tIN  PADAPTER Adapter\n\t)\n{\n\t//8814 doesn't need this by Alex\n}\n\nstatic VOID\n_InitDriverInfoSize_8814A(\n\tIN  PADAPTER\tAdapter,\n\tIN\tu8\t\tdrvInfoSize\n\t)\n{\n\trtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize);\n}\n/*\nstatic VOID\n_InitWMACSetting_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n\t//u32\t\t\tvalue32;\n\tu16\t\t\tvalue16;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\t//pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS;\n\tpHalData->ReceiveConfig = \n\tRCR_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;\t  \n\n#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC)\n\tpHalData->ReceiveConfig |= ACRC32;\n#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC)\n\n#ifdef CONFIG_RX_PACKET_APPEND_FCS\n\tpHalData->ReceiveConfig |= RCR_APPFCS;\n#endif //CONFIG_RX_PACKET_APPEND_FCS\n\n\tpHalData->ReceiveConfig |= FORCEACK;\n\n\t// some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile()\n\trtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);\n\n\t// Accept all multicast address\n\trtw_write32(Adapter, REG_MAR, 0xFFFFFFFF);\n\trtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF);\n\n\n\t// Accept all data frames\n\t//value16 = 0xFFFF;\n\t//rtw_write16(Adapter, REG_RXFLTMAP2, value16);\n\n\t// 2010.09.08 hpfan\n\t// Since ADF is removed from RCR, ps-poll will not be indicate to driver,\n\t// RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll.\n\tvalue16 = BIT10;\n#ifdef CONFIG_BEAMFORMING\n\t// NDPA packet subtype is 0x0101\n\tvalue16 |= BIT5;\n#endif\n\trtw_write16(Adapter, REG_RXFLTMAP1, value16);\n\n\t// Accept all management frames\n\t//value16 = 0xFFFF;\n\t//rtw_write16(Adapter, REG_RXFLTMAP0, value16);\n\n\t//enable RX_SHIFT bits\n\t//rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1));\t\n\n}\n*/\n\n//old _InitWMACSetting_8812A + _InitAdaptiveCtrl_8812AUsb = new _InitMacConfigure_8814A\nstatic VOID\n_InitMacConfigure_8814A(\n\tIN PADAPTER\t\t\tAdapter\n\t)\n{\n\tu16\t\t\tvalue16;\n\tu32\t\t\tregRRSR;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\t\n\tswitch (Adapter->registrypriv.wireless_mode)\n\t{\n\t\tcase WIRELESS_11B:\n\t\t\tregRRSR = RATE_ALL_CCK;\n\t\t\tbreak;\n\t\t\n\t\tcase WIRELESS_11G:\n\t\tcase WIRELESS_11A:\n\t\tcase WIRELESS_11_5N:\n\t\tcase WIRELESS_11A_5N://Todo: no basic rate for ofdm ?\n\t\tcase WIRELESS_11_5AC:\n\t\t\tregRRSR = RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\t\n\t\tcase WIRELESS_11BG:\n\t\tcase WIRELESS_11G_24N:\n\t\tcase WIRELESS_11_24N:\n\t\tcase WIRELESS_11BG_24N:\n\t\tdefault:\n\t\t\tregRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\n\t}\n\n\t// Init value for RRSR.\n\trtw_write32(Adapter, REG_RRSR, regRRSR);\n\n\t// Retry Limit\n\tvalue16 = _LRL(0x30) | _SRL(0x30);\n\trtw_write16(Adapter, REG_RETRY_LIMIT_8814A, value16);\n\t\n\tpHalData->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;\n\tpHalData->ReceiveConfig |= FORCEACK;\n#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC)\n\tpHalData->ReceiveConfig |= ACRC32;\n#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC)\n\n#ifdef CONFIG_RX_PACKET_APPEND_FCS\n\tpHalData->ReceiveConfig |= RCR_APPFCS;\n#endif //CONFIG_RX_PACKET_APPEND_FCS\n\trtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);\n\n\t// 2010.09.08 hpfan\n\t// Since ADF is removed from RCR, ps-poll will not be indicate to driver,\n\t// RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll.\n\tvalue16 = BIT10;\n#ifdef CONFIG_BEAMFORMING\n\t// NDPA packet subtype is 0x0101\n\tvalue16 |= BIT5;\n#endif /*CONFIG_BEAMFORMING*/\n\trtw_write16(Adapter, REG_RXFLTMAP1, value16);\n\n\t// 201409/25 MH When RA is enabled, we need to reduce the value.\n\trtw_write8(Adapter, REG_MAX_AGGR_NUM_8814A, 0x36);\n\trtw_write8(Adapter, REG_RTS_MAX_AGGR_NUM_8814A,0x36); \n\t\n}\n\n/*\nstatic VOID\n_InitAdaptiveCtrl_8812AUsb(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tu16\tvalue16;\n\tu32\tvalue32;\n\n\t// Response Rate Set\n\tvalue32 = rtw_read32(Adapter, REG_RRSR);\n\tvalue32 &= ~RATE_BITMAP_ALL;\n\n\tif(Adapter->registrypriv.wireless_mode & WIRELESS_11B)\n\t\tvalue32 |= RATE_RRSR_CCK_ONLY_1M;\n\telse\n\t\tvalue32 |= RATE_RRSR_WITHOUT_CCK;\n\n\tvalue32 |= RATE_RRSR_CCK_ONLY_1M;\n\trtw_write32(Adapter, REG_RRSR, value32);\n\n\t// CF-END Threshold\n\t//m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1);\n\n\t// SIFS (used in NAV)\n\tvalue16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10);\n\trtw_write16(Adapter, REG_SPEC_SIFS, value16);\n\n\t// Retry Limit\n\tvalue16 = _LRL(0x30) | _SRL(0x30);\n\trtw_write16(Adapter, REG_RL, value16);\n\t\n}*/\n\nstatic VOID\n_InitEDCA_8814AUsb(\n\tIN  PADAPTER Adapter\n\t)\n{\n\t// Set Spec SIFS (used in NAV)\n\trtw_write16(Adapter,REG_SPEC_SIFS, 0x100a);\n\trtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a);\n\n\t// Set SIFS for CCK\n\trtw_write16(Adapter,REG_SIFS_CTX, 0x100a);\t\n\n\t// Set SIFS for OFDM\n\trtw_write16(Adapter,REG_SIFS_TRX, 0x100a);\n\n\t// TXOP\n\trtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B);\n\trtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F);\n\trtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324);\n\trtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226);\n\n\t// 0x50 for 80MHz clock\n\t//rtw_write8(Adapter, REG_USTIME_TSF, 0x50);\n\t//rtw_write8(Adapter, REG_USTIME_EDCA, 0x50);\n}\n\n\nstatic VOID\n_InitBeaconMaxError_8814A(\n\tIN  PADAPTER\tAdapter,\n\tIN\tBOOLEAN\t\tInfraMode\n\t)\n{\n#ifdef CONFIG_ADHOC_WORKAROUND_SETTING\n\trtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF);\t\n#else\n\t//rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10));\t\n#endif\n}\n\n\n#ifdef CONFIG_LED\nstatic void _InitHWLed(PADAPTER Adapter)\n{\n\tstruct led_priv *pledpriv = &(Adapter->ledpriv);\n\t\n\tif( pledpriv->LedStrategy != HW_LED)\n\t\treturn;\n\t\n// HW led control\n// to do .... \n//must consider cases of antenna diversity/ commbo card/solo card/mini card\n\n}\n#endif //CONFIG_LED\n\n/*\nstatic VOID\n_InitRDGSetting_8812A(\n\tIN\tPADAPTER Adapter\n\t)\n{\n\trtw_write8(Adapter,REG_RD_CTRL,0xFF);\n\trtw_write16(Adapter, REG_RD_NAV_NXT, 0x200);\n\trtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05);\n}*/\n\nstatic VOID\n_InitRetryFunction_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tu8\tvalue8;\n\t\n\tvalue8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL);\n\tvalue8 |= EN_AMPDU_RTY_NEW;\n\trtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8);\n\n\t// Set ACK timeout\n\t//rtw_write8(Adapter, REG_ACKTO, 0x40);  //masked by page for BCM IOT issue temporally\n\trtw_write8(Adapter, REG_ACKTO, 0x80);\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tusb_AggSettingTxUpdate()\n *\n * Overview:\tSeperate TX/RX parameters update independent for TP detection and \n *\t\t\tdynamic TX/RX aggreagtion parameters update.\n *\n * Input:\t\t\tPADAPTER\n *\n * Output/Return:\tNONE\n *\n * Revised History:\n *\tWhen\t\tWho\t\tRemark\n *\t12/10/2010\tMHC\t\tSeperate to smaller function.\n *\n *---------------------------------------------------------------------------*/\nstatic VOID\nusb_AggSettingTxUpdate_8814A(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n#ifdef CONFIG_USB_TX_AGGREGATION\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu32\t\t\tvalue32;\n\n\tif(Adapter->registrypriv.wifi_spec)\n\t\tpHalData->UsbTxAggDescNum = 1;\n\n\tif(pHalData->UsbTxAggMode){\n\t\tvalue32 = rtw_read32(Adapter, REG_TDECTRL);\n\t\tvalue32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT);\n\t\tvalue32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT);\n\t\t\n\t\trtw_write32(Adapter, REG_TDECTRL, value32);\n\t\trtw_write8(Adapter, REG_TDECTRL+3, pHalData->UsbTxAggDescNum<<1);\n\t}\n\t\n#endif //CONFIG_USB_TX_AGGREGATION\n}\t// usb_AggSettingTxUpdate\n\n\n/*-----------------------------------------------------------------------------\n * Function:\tusb_AggSettingRxUpdate()\n *\n * Overview:\tSeperate TX/RX parameters update independent for TP detection and \n *\t\t\tdynamic TX/RX aggreagtion parameters update.\n *\n * Input:\t\t\tPADAPTER\n *\n * Output/Return:\tNONE\n *\n * Revised History:\n *\tWhen\t\tWho\t\tRemark\n *\t12/10/2010\tMHC\t\tSeperate to smaller function.\n *\n *---------------------------------------------------------------------------*/\nstatic VOID\nusb_AggSettingRxUpdate_8814A(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n#ifdef CONFIG_USB_RX_AGGREGATION\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\tvalueDMA;\n\tu8\t\t\tvalueUSB;\n\n\tvalueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL_8814A);\n\tvalueUSB = rtw_read8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3);\n\tswitch(pHalData->UsbRxAggMode)\n\t{\n\t\tcase USB_RX_AGG_DMA:\n\t\t\tvalueDMA |= RXDMA_AGG_EN;\n\t\t\tvalueUSB &= ~USB_AGG_EN_8814A;  //yx_qi 131128\n\t\t\tbreak;\n\t\tcase USB_RX_AGG_USB:\n\t\t\tvalueDMA &= ~RXDMA_AGG_EN;\n\t\t\tvalueUSB |= USB_AGG_EN_8814A;\n\t\t\tbreak;\n\t\tcase USB_RX_AGG_MIX:\n\t\t\tvalueDMA |= RXDMA_AGG_EN;\n\t\t\tvalueUSB |= USB_AGG_EN_8814A;\n\t\t\tbreak;\n\t\tcase USB_RX_AGG_DISABLE:\n\t\tdefault:\n\t\t\tvalueDMA &= ~RXDMA_AGG_EN;\n\t\t\tvalueUSB &= ~USB_AGG_EN_8814A;\n\t\t\tbreak;\n\t}\n\n\trtw_write8(Adapter, REG_TRXDMA_CTRL_8814A, valueDMA);\n\trtw_write8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3, valueUSB);  //yx_qi 131128\n#endif //CONFIG_USB_RX_AGGREGATION\n}\t// usb_AggSettingRxUpdate\n\nstatic VOID\ninit_UsbAggregationSetting_8814A(\n\tIN  PADAPTER Adapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\t// Tx aggregation setting\n\tusb_AggSettingTxUpdate_8814A(Adapter);\n\n\t// Rx aggregation setting\n\tusb_AggSettingRxUpdate_8814A(Adapter);\n\n\t// 201/12/10 MH Add for USB agg mode dynamic switch.\n\tpHalData->UsbRxHighSpeedMode = _FALSE;\n\tpHalData->UsbTxVeryHighSpeedMode = _FALSE;\n}\n\n/*-----------------------------------------------------------------------------\n * Function:\tUSB_AggModeSwitch()\n *\n * Overview:\tWhen RX traffic is more than 40M, we need to adjust some parameters to increase\n *\t\t\tRX speed by increasing batch indication size. This will decrease TCP ACK speed, we\n *\t\t\tneed to monitor the influence of FTP/network share.\n *\t\t\tFor TX mode, we are still ubder investigation.\n *\n * Input:\t\tPADAPTER\n *\n * Output:\t\tNONE\n *\n * Return:\t\tNONE\n *\n * Revised History:\n *\tWhen\t\tWho\t\tRemark\n *\t12/10/2010\tMHC\t\tCreate Version 0.  \n *\n *---------------------------------------------------------------------------*/\nVOID\nUSB_AggModeSwitch(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n#if 0\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo = &(Adapter->MgntInfo);\n\n\t//pHalData->UsbRxHighSpeedMode = _FALSE;\n\t// How to measure the RX speed? We assume that when traffic is more than \n\tif (pMgntInfo->bRegAggDMEnable == _FALSE)\n\t{\n\t\treturn;\t// Inf not support.\n\t}\n\t\n\t\n\tif (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _TRUE && \n\t\tpHalData->UsbRxHighSpeedMode == _FALSE)\n\t{\n\t\tpHalData->UsbRxHighSpeedMode = _TRUE;\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"UsbAggModeSwitchCheck to HIGH\\n\"));\n\t}\n\telse if (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _FALSE && \n\t\tpHalData->UsbRxHighSpeedMode == _TRUE)\n\t{\n\t\tpHalData->UsbRxHighSpeedMode = _FALSE;\n\t\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"UsbAggModeSwitchCheck to LOW\\n\"));\n\t}\n\telse\n\t{\n\t\treturn; \n\t}\n\t\n\n#if USB_RX_AGGREGATION_92C\n\tif (pHalData->UsbRxHighSpeedMode == _TRUE)\t\n\t{\n\t\t// 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator.\n\t\t// USB mode\n#if (RT_PLATFORM == PLATFORM_LINUX)\n\t\tif (pMgntInfo->LinkDetectInfo.bTxBusyTraffic)\n\t\t{\n\t\t\tpHalData->RxAggBlockCount\t= 16;\n\t\t\tpHalData->RxAggBlockTimeout\t= 7;\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tpHalData->RxAggBlockCount\t= 40;\n\t\t\tpHalData->RxAggBlockTimeout\t= 5;\n\t\t}\n\t\t// Mix mode\n\t\tpHalData->RxAggPageCount\t= 72;\n\t\tpHalData->RxAggPageTimeout\t= 6;\t\t\n\t}\n\telse\n\t{\n\t\t// USB mode\n\t\tpHalData->RxAggBlockCount\t= pMgntInfo->RegRxAggBlockCount;\n\t\tpHalData->RxAggBlockTimeout\t= pMgntInfo->RegRxAggBlockTimeout;\t\n\t\t// Mix mode\n\t\tpHalData->RxAggPageCount\t\t= pMgntInfo->RegRxAggPageCount;\n\t\tpHalData->RxAggPageTimeout\t= pMgntInfo->RegRxAggPageTimeout;\t\n\t}\n\n\tif (pHalData->RxAggBlockCount > MAX_RX_AGG_BLKCNT)\n\t\tpHalData->RxAggBlockCount = MAX_RX_AGG_BLKCNT;\n#if (OS_WIN_FROM_VISTA(OS_VERSION)) || (RT_PLATFORM == PLATFORM_LINUX)\t// do not support WINXP to prevent usbehci.sys BSOD\n\tif (IS_WIRELESS_MODE_N_24G(Adapter) || IS_WIRELESS_MODE_N_5G(Adapter))\n\t{\n\t\t//\n\t\t// 2010/12/24 MH According to V1012 QC IOT test, XP BSOD happen when running chariot test\n\t\t// with the aggregation dynamic change!! We need to disable the function to prevent it is broken\n\t\t// in usbehci.sys.\n\t\t//\n\t\tusb_AggSettingRxUpdate_8188E(Adapter);\n\n\t\t// 2010/12/27 MH According to designer's suggstion, we can only modify Timeout value. Otheriwse\n\t\t// there might many HW incorrect behavior, the XP BSOD at usbehci.sys may be relative to the \n\t\t// issue. Base on the newest test, we can not enable block cnt > 30, otherwise XP usbehci.sys may\n\t\t// BSOD.\n\t}\n#endif\n\t\n#endif\n#endif\n}\t// USB_AggModeSwitch\n\nstatic VOID\n_InitOperationMode_8814A(\n\tIN\tPADAPTER\t\t\tAdapter\n\t)\n{\n#if 0//gtest\n\tPHAL_DATA_TYPE\tpHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\t\tregBwOpMode = 0;\n\tu32\t\t\t\tregRATR = 0, regRRSR = 0;\n\n\n\t//1 This part need to modified according to the rate set we filtered!!\n\t//\n\t// Set RRSR, RATR, and REG_BWOPMODE registers\n\t//\n\tswitch(Adapter->RegWirelessMode)\n\t{\n\t\tcase WIRELESS_MODE_B:\n\t\t\tregBwOpMode = BW_OPMODE_20MHZ;\n\t\t\tregRATR = RATE_ALL_CCK;\n\t\t\tregRRSR = RATE_ALL_CCK;\n\t\t\tbreak;\n\t\tcase WIRELESS_MODE_A:\n\t\t\tregBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;\n\t\t\tregRATR = RATE_ALL_OFDM_AG;\n\t\t\tregRRSR = RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\tcase WIRELESS_MODE_G:\n\t\t\tregBwOpMode = BW_OPMODE_20MHZ;\n\t\t\tregRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\tregRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\tcase WIRELESS_MODE_AUTO:\n\t\t\tif (Adapter->bInHctTest)\n\t\t\t{\n\t\t\t    regBwOpMode = BW_OPMODE_20MHZ;\n\t\t\t    regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\t    regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t    regBwOpMode = BW_OPMODE_20MHZ;\n\t\t\t    regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;\n\t\t\t    regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase WIRELESS_MODE_N_24G:\n\t\t\t// It support CCK rate by default.\n\t\t\t// CCK rate will be filtered out only when associated AP does not support it.\n\t\t\tregBwOpMode = BW_OPMODE_20MHZ;\n\t\t\t\tregRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;\n\t\t\t\tregRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\tcase WIRELESS_MODE_N_5G:\n\t\t\tregBwOpMode = BW_OPMODE_5G;\n\t\t\tregRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;\n\t\t\tregRRSR = RATE_ALL_OFDM_AG;\n\t\t\tbreak;\n\t\t\t\n\t\tdefault: //for MacOSX compiler warning.\n\t\t\tbreak;\n\t}\n\n\t// Ziv ????????\n\t//rtw_write32(Adapter, REG_INIRTS_RATE_SEL, regRRSR);\n\trtw_write8(Adapter, REG_BWOPMODE, regBwOpMode);\n#endif\n}\n\n/*\n// Set CCK and OFDM Block \"ON\"\nstatic VOID _BBTurnOnBlock(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n#if (DISABLE_BB_RF)\n\treturn;\n#endif\n\n\tPHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1);\n\tPHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);\n}\n\n\nstatic VOID _RfPowerSave(\n\tIN\tPADAPTER\t\tAdapter\n\t)\n{\n#if 0\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\tPMGNT_INFO\t\tpMgntInfo\t= &(Adapter->MgntInfo);\n\tu8\t\t\teRFPath;\n\n#if (DISABLE_BB_RF)\n\treturn;\n#endif\n\n\tif(pMgntInfo->RegRfOff == _TRUE){ // User disable RF via registry.\n\t\tRT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, (\"InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\\n\"));\n\t\tMgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW);\n\t\t// Those action will be discard in MgntActSet_RF_State because off the same state\n\t\tfor(eRFPath = 0; eRFPath <pHalData->NumTotalRFPath; eRFPath++)\n\t\t\tPHY_SetRFReg(Adapter, eRFPath, 0x4, 0xC00, 0x0);\n\t}\n\telse if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep.\n\t\tRT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, (\"InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\\n\", pMgntInfo->RfOffReason));\n\t\tMgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason);\n\t}\n\telse{\n\t\tpHalData->eRFPowerState = eRfOn;\n\t\tpMgntInfo->RfOffReason = 0; \n\t\tif(Adapter->bInSetPower || Adapter->bResetInProgress)\n\t\t\tPlatformUsbEnableInPipes(Adapter);\n\t\tRT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, (\"InitializeAdapter8192CUsb(): RF is on.\\n\"));\n\t}\n#endif\n}\n*/\nenum {\n\tAntenna_Lfet = 1,\n\tAntenna_Right = 2,\t\n};\n\nstatic VOID\n_InitAntenna_Selection_8814A(IN\tPADAPTER Adapter)\n{\n\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(Adapter);\n\n\tif(pHalData->AntDivCfg==0)\n\t\treturn;\n/*\t\t\n\tDBG_8192C(\"==>  %s ....\\n\",__FUNCTION__);\t\t\n\n\trtw_write8(Adapter, REG_LEDCFG2, 0x82);\n\n\tPHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01);\n\t\t\n\tif(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == MAIN_ANT)\n\t\tpHalData->CurAntenna = MAIN_ANT;\n\telse\n\t\tpHalData->CurAntenna = AUX_ANT;\n\tDBG_8192C(\"%s,Cur_ant:(%x)%s\\n\",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == MAIN_ANT)?\"MAIN_ANT\":\"AUX_ANT\");\n\t\t\t\n*/\n}\n\n//\n// 2010/08/26 MH Add for selective suspend mode check.\n// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and\n// slim card.\n//\nstatic VOID\nHalDetectSelectiveSuspendMode(\n\tIN PADAPTER\t\t\t\tAdapter\n\t)\n{\n#if 0\n\tu8\ttmpvalue;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(Adapter);\n\n\t// If support HW radio detect, we need to enable WOL ability, otherwise, we \n\t// can not use FW to notify host the power state switch.\n\t\n\tEFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue);\n\n\tDBG_8192C(\"HalDetectSelectiveSuspendMode(): SS \");\n\tif(tmpvalue & BIT1)\n\t{\n\t\tDBG_8192C(\"Enable\\n\");\n\t}\n\telse\n\t{\n\t\tDBG_8192C(\"Disable\\n\");\n\t\tpdvobjpriv->RegUsbSS = _FALSE;\n\t}\n\n\t// 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode.\n\tif (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData))\n\t{\n\t\t//PMGNT_INFO\t\t\t\tpMgntInfo = &(Adapter->MgntInfo);\n\n\t\t//if (!pMgntInfo->bRegDongleSS)\t\n\t\t//{\n\t\t//\tRT_TRACE(COMP_INIT, DBG_LOUD, (\"Dongle disable SS\\n\"));\n\t\t\tpdvobjpriv->RegUsbSS = _FALSE;\n\t\t//}\n\t}\n#endif\n}\t// HalDetectSelectiveSuspendMode\n\nrt_rf_power_state RfOnOffDetect(IN\tPADAPTER pAdapter )\n{\n\trt_rf_power_state rfpowerstate = rf_on;\n\n\treturn rfpowerstate;\n}\t// HalDetectPwrDownMode\n\nvoid _ps_open_RF(_adapter *padapter) {\n\t//here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified\n\t//phy_SsPwrSwitch92CU(padapter, rf_on, 1);\n}\n\nvoid _ps_close_RF(_adapter *padapter){\n\t//here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified\n\t//phy_SsPwrSwitch92CU(padapter, rf_off, 1);\n}\n\n\n/*\tA lightweight deinit function\t*/\nstatic void rtl8814au_hw_reset(_adapter *Adapter)\n{\n#if 0\n                u8 reg_val=0;\n\tif(rtw_read8(Adapter, REG_MCUFWDL)&BIT7)\n\t{\t\t\n\t\t_8051Reset8812(Adapter);  \n\t\trtw_write8(Adapter, REG_MCUFWDL, 0x00);\n\t\t//before BB reset should do clock gated\n\t\trtw_write32(Adapter, rFPGA0_XCD_RFPara, \n\t\t\trtw_read32(Adapter, rFPGA0_XCD_RFPara)|(BIT6));\n\t\t//reset BB\n\t\treg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN);\n\t\treg_val &= ~(BIT(0) | BIT(1));\n\t\trtw_write8(Adapter, REG_SYS_FUNC_EN, reg_val);\n\t\t//reset RF\n\t\trtw_write8(Adapter, REG_RF_CTRL, 0);\n\t\t//reset TRX path\n\t\trtw_write16(Adapter, REG_CR, 0);\n\t\t//reset MAC\n\t\treg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); \n\t\treg_val |= BIT(1);\n\t\treg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val);       //reg0x5[1] ,auto FSM off\n\n\t\treg_val = rtw_read8(Adapter, REG_APS_FSMCO+1);\n \n\t\t//check if   reg0x5[1] auto cleared\n\t\twhile(reg_val & BIT(1)){\n\t\t\trtw_udelay_os(1);\n\t\t\treg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); \n\t\t}\n\t\treg_val |= BIT(0);\n\t\treg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val);     //reg0x5[0] ,auto FSM on\n\n\t\treg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);\n\t\treg_val &= ~(BIT(4) | BIT(7));\n\t\trtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val);\n\t\treg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1);\n\t\treg_val |= BIT(4) | BIT(7);\n\t\trtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val);\n\t}\n#endif //0\n}\n\nu32 rtl8814au_hal_init(PADAPTER Adapter)\n{\n\tu8\tvalue8 = 0, u1bRegCR;\n\tu16  value16;\n\tu8\ttxpktbuf_bndy;\n\tu32\tstatus = _SUCCESS;\n\tu32\tNavUpper = WiFiNavUpperUs;\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct pwrctrl_priv\t\t*pwrctrlpriv = adapter_to_pwrctl(Adapter);\n\tstruct registry_priv\t*pregistrypriv = &Adapter->registrypriv;\n\n\trt_rf_power_state\t\teRfPowerStateToSet;\n\n\tu32 init_start_time = rtw_get_current_time();\n\n\n#ifdef DBG_HAL_INIT_PROFILING\n\n\tenum HAL_INIT_STAGES {\n\t\tHAL_INIT_STAGES_BEGIN = 0,\n\t\tHAL_INIT_STAGES_INIT_PW_ON,\n\t\tHAL_INIT_STAGES_INIT_LLTT,\n\t\tHAL_INIT_STAGES_DOWNLOAD_FW,\n\t\tHAL_INIT_STAGES_MAC,\n\t\tHAL_INIT_STAGES_MISC01,\n\t\tHAL_INIT_STAGES_MISC02,\n\t\tHAL_INIT_STAGES_BB,\n\t\tHAL_INIT_STAGES_RF,\n\t\tHAL_INIT_STAGES_TURN_ON_BLOCK,\n\t\tHAL_INIT_STAGES_INIT_SECURITY,\n\t\tHAL_INIT_STAGES_MISC11,\n\t\tHAL_INIT_STAGES_INIT_HAL_DM,\n\t\t//HAL_INIT_STAGES_RF_PS,\n\t\tHAL_INIT_STAGES_IQK,\n\t\tHAL_INIT_STAGES_PW_TRACK,\n\t\tHAL_INIT_STAGES_LCK,\n\t\tHAL_INIT_STAGES_MISC21,\n\t\t//HAL_INIT_STAGES_INIT_PABIAS,\n\t\t#ifdef CONFIG_BT_COEXIST\n\t\tHAL_INIT_STAGES_BT_COEXIST,\n\t\t#endif\n\t\t//HAL_INIT_STAGES_ANTENNA_SEL,\n\t\tHAL_INIT_STAGES_MISC31,\n\t\tHAL_INIT_STAGES_END,\n\t\tHAL_INIT_STAGES_NUM\n\t};\n\n\tchar * hal_init_stages_str[] = {\n\t\t\"HAL_INIT_STAGES_BEGIN\",\n\t\t\"HAL_INIT_STAGES_INIT_PW_ON\",\n\t\t\"HAL_INIT_STAGES_INIT_LLTT\",\n\t\t\"HAL_INIT_STAGES_DOWNLOAD_FW\",\n\t\t\"HAL_INIT_STAGES_MAC\",\n\t\t\"HAL_INIT_STAGES_MISC01\",\n\t\t\"HAL_INIT_STAGES_MISC02\",\n\t\t\"HAL_INIT_STAGES_BB\",\n\t\t\"HAL_INIT_STAGES_RF\",\n\t\t\"HAL_INIT_STAGES_TURN_ON_BLOCK\",\n\t\t\"HAL_INIT_STAGES_INIT_SECURITY\",\n\t\t\"HAL_INIT_STAGES_MISC11\",\n\t\t\"HAL_INIT_STAGES_INIT_HAL_DM\",\n\t\t//\"HAL_INIT_STAGES_RF_PS\",\n\t\t\"HAL_INIT_STAGES_IQK\",\n\t\t\"HAL_INIT_STAGES_PW_TRACK\",\n\t\t\"HAL_INIT_STAGES_LCK\",\n\t\t\"HAL_INIT_STAGES_MISC21\",\n\t\t#ifdef CONFIG_BT_COEXIST\n\t\t\"HAL_INIT_STAGES_BT_COEXIST\",\n\t\t#endif\n\t\t//\"HAL_INIT_STAGES_ANTENNA_SEL\",\n\t\t\"HAL_INIT_STAGES_MISC31\",\n\t\t\"HAL_INIT_STAGES_END\",\n\t};\n\n\tint hal_init_profiling_i;\n\tu32 hal_init_stages_timestamp[HAL_INIT_STAGES_NUM]; //used to record the time of each stage's starting point\n\n\tfor(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM;hal_init_profiling_i++)\n\t\thal_init_stages_timestamp[hal_init_profiling_i]=0;\n\n\t#define HAL_INIT_PROFILE_TAG(stage) hal_init_stages_timestamp[(stage)]=rtw_get_current_time();\n#else //DBG_HAL_INIT_PROFILING\n\t#define HAL_INIT_PROFILE_TAG(stage) do {} while(0)\n#endif //DBG_HAL_INIT_PROFILING\n\n\n\n_func_enter_;\n\t\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN);\n\tif(pwrctrlpriv->bkeepfwalive)\n\t{\n\t\t_ps_open_RF(Adapter);\n\n\t\tif(pHalData->bIQKInitialized){\n\t\t\t//PHY_IQCalibrate_8812A(Adapter,_TRUE);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//PHY_IQCalibrate_8812A(Adapter,_FALSE);\n\t\t\t//pHalData->bIQKInitialized = _TRUE;\n\t\t}\n\n\t\t//ODM_TXPowerTrackingCheck(&pHalData->odmpriv );\n\t\t//PHY_LCCalibrate_8812A(Adapter);\n\n\t\tgoto exit;\n\t}\n\n\t// Check if MAC has already power on. by tynli. 2011.05.27.\n\tvalue8 = rtw_read8(Adapter, REG_SYS_CLKR+1);\t\n\tu1bRegCR = rtw_read8(Adapter, REG_CR);\n\tDBG_871X(\" power-on :REG_SYS_CLKR 0x09=0x%02x. REG_CR 0x100=0x%02x.\\n\", value8, u1bRegCR);\n\tif((value8&BIT3)  && (u1bRegCR != 0 && u1bRegCR != 0xEA))\n\t{\n\t\t//pHalData->bMACFuncEnable = _TRUE;\n\t\tDBG_871X(\" MAC has already power on.\\n\");\n\t}\n\telse\n\t{\n\t\t//pHalData->bMACFuncEnable = _FALSE;\n\t\t// Set FwPSState to ALL_ON mode to prevent from the I/O be return because of 32k\n\t\t// state which is set before sleep under wowlan mode. 2012.01.04. by tynli.\n\t\t//pHalData->FwPSState = FW_PS_STATE_ALL_ON_88E;\n\t\tDBG_871X(\" MAC has not been powered on yet.\\n\");\n\t}\n\n\t//\n\t// 2012/11/13 MH Revise for U2/U3 switch we can not update RF-A/B reset.\n\t// After discuss with BB team YN, reset after MAC power on to prevent RF\n\t// R/W error. Is it a right method?\n\t//\n\t/*if(!IS_HARDWARE_TYPE_8821(Adapter))\n\t{\n\t\trtw_write8(Adapter, REG_RF_CTRL, 5);\n\t\trtw_write8(Adapter, REG_RF_CTRL, 7);\n\t\trtw_write8(Adapter, REG_RF_B_CTRL_8812, 5);\n\t\trtw_write8(Adapter, REG_RF_B_CTRL_8812, 7);\n\t}*/\n\n/*\n\tIf HW didn't go through a complete de-initial procedure,  \n\tit probably occurs some problem for double initial procedure.\n\tLike \"CONFIG_DEINIT_BEFORE_INIT\" in 92du chip\n*/\n\trtl8814au_hw_reset(Adapter); //todo\n\n\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON);\n\tstatus = _InitPowerOn_8814AU(Adapter);\n\tif(status == _FAIL){\n\t\tDBG_871X(\"Failed to init power on!\\n\");\n\t\tgoto exit;\n\t}\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT);\n\t\n\tstatus =  InitLLTTable8814A(Adapter);\n\tif(status == _FAIL){\n\t\tDBG_871X(\"Failed to init LLT table\\n\");\n\t\tgoto exit;\n\t}\n\n\t_InitHardwareDropIncorrectBulkOut_8814A(Adapter);\n\n\t/*if(pHalData->bRDGEnable){\n\t\t_InitRDGSetting_8812A(Adapter);\n\t}*/\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW);\n\tif (Adapter->registrypriv.mp_mode == 0) {\n\t\tstatus = FirmwareDownload8814A(Adapter, _FALSE);\n\t\tif (status != _SUCCESS) {\n\t\t\tDBG_871X(\"%s: Download Firmware failed!!\\n\", __FUNCTION__);\n\t\t\tAdapter->bFWReady = _FALSE;\n\t\t\tpHalData->fw_ractrl = _FALSE;\n\t\t\t//return status;\n\t\t} else {\n\t\t\tDBG_871X(\"%s: Download Firmware Success!!\\n\",__FUNCTION__);\n\t\t\tAdapter->bFWReady = _TRUE;\n\t\t\tpHalData->fw_ractrl = _TRUE;\n\t\t}\n\t}\n\n\tInitializeFirmwareVars8814(Adapter);\n\t\n\tif(pwrctrlpriv->reg_rfoff == _TRUE){\n\t\tpwrctrlpriv->rf_pwrstate = rf_off;\n\t}\n\n\t// 2010/08/09 MH We need to check if we need to turnon or off RF after detecting\n\t// HW GPIO pin. Before PHY_RFConfig8192C.\n\t//HalDetectPwrDownMode(Adapter);\n\t// 2010/08/26 MH If Efuse does not support sective suspend then disable the function.\n\t//HalDetectSelectiveSuspendMode(Adapter);\n\n\t// Save target channel\n\t// <Roger_Notes> Current Channel will be updated again later.\n\tpHalData->CurrentChannel = 0;//set 0 to trigger switch correct channel\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC);\n#if (HAL_MAC_ENABLE == 1)\n\tstatus = PHY_MACConfig8814(Adapter);\n\tif(status == _FAIL)\n\t{\n\t\tgoto exit;\n\t}\n#endif //HAL_MAC_ENABLE\n\t\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01);\n\t\n\t_InitQueuePriority_8814AUsb(Adapter);\n\t_InitPageBoundary_8814AUsb(Adapter);\t\n\n\t_InitTransferPageSize_8814AUsb(Adapter);\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02);\n\t// Get Rx PHY status in order to report RSSI and others.\n\t_InitDriverInfoSize_8814A(Adapter, DRVINFO_SZ);\n\n\t_InitInterrupt_8814AU(Adapter);\n\t_InitID_8814A(Adapter);//set mac_address\n\t_InitNetworkType_8814A(Adapter);//set msr\t\n\t_InitMacConfigure_8814A(Adapter);\n\t//_InitWMACSetting_8814A(Adapter);\n\t//_InitAdaptiveCtrl_8814AUsb(Adapter);\n\t_InitEDCA_8814AUsb(Adapter);\n\n\t_InitRetryFunction_8814A(Adapter);\n\tinit_UsbAggregationSetting_8814A(Adapter);\n\t//_InitOperationMode_8814A(Adapter);//todo\n\t_InitBeaconParameters_8814A(Adapter);\n\t_InitBeaconMaxError_8814A(Adapter, _TRUE);\n\n\t_InitBurstPktLen(Adapter);  //added by page. 20110919\n\n\t//\n\t// Init CR MACTXEN, MACRXEN after setting RxFF boundary REG_TRXFF_BNDY to patch\n\t// Hw bug which Hw initials RxFF boundry size to a value which is larger than the real Rx buffer size in 88E. \n\t// 2011.08.05. by tynli.\n\t//\n\tvalue8 = rtw_read8(Adapter, REG_CR);\n\trtw_write8(Adapter, REG_CR, (value8|MACTXEN|MACRXEN));\n\n#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI)\n\n#ifdef CONFIG_CHECK_AC_LIFETIME\n\t// Enable lifetime check for the four ACs\n\trtw_write8(Adapter, REG_LIFETIME_CTRL, 0x0F);\n#endif\t// CONFIG_CHECK_AC_LIFETIME\n\n#ifdef CONFIG_TX_MCAST2UNI\n\trtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400);\t// unit: 256us. 256ms\n\trtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400);\t// unit: 256us. 256ms\n#else\t// CONFIG_TX_MCAST2UNI\n\trtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x3000);\t// unit: 256us. 3s\n\trtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x3000);\t// unit: 256us. 3s\n#endif\t// CONFIG_TX_MCAST2UNI\n#endif\t// CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI\n\t\n\n#ifdef CONFIG_LED\n\t_InitHWLed(Adapter);\n#endif //CONFIG_LED\n\n\t//\n\t//d. Initialize BB related configurations.\n\t//\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB);\n#if (HAL_BB_ENABLE == 1)\n\tstatus = PHY_BBConfig8814(Adapter);\n\tif(status == _FAIL)\n\t{\n\t\tgoto exit;\n\t}\n#endif //HAL_BB_ENABLE\n\n\t// 92CU use 3-wire to r/w RF\n\t//pHalData->Rf_Mode = RF_OP_By_SW_3wire;\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF);\n#if (HAL_RF_ENABLE == 1)\n\tstatus = PHY_RFConfig8814A(Adapter);\t\n\tif(status == _FAIL)\n\t{\n\t\tgoto exit;\n\t}\n\n\t//todo:\n\t//if(pHalData->rf_type == RF_1T1R && IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t//PHY_BB8812_Config_1T(Adapter);\n#endif\n\n#if (MP_DRIVER == 1)\n\tif (Adapter->registrypriv.mp_mode == 1)\n\t{\t\n\t\tstatus = PHY_BBConfigMP_8814A(Adapter);\t\n\t\tif(status != RT_STATUS_SUCCESS){\n\t\t\tDBG_871X(\"Configure BB MP failed!!\\n\");\n\t\t\treturn status;\n\t\t}\n\t}\t\n#endif\n\n\tPHY_ConfigBB_8814A(Adapter);\n\n\tif(Adapter->registrypriv.channel <= 14)\n\t\tPHY_SwitchWirelessBand8814A(Adapter, BAND_ON_2_4G);\n\telse\n\t\tPHY_SwitchWirelessBand8814A(Adapter, BAND_ON_5G);\n\n\trtw_hal_set_chnl_bw(Adapter, Adapter->registrypriv.channel, \n\t\tCHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HAL_PRIME_CHNL_OFFSET_DONT_CARE);\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK);\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY);\n\tinvalidate_cam_all(Adapter);\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11);\n\t_InitAntenna_Selection_8814A(Adapter);\n\n\t// HW SEQ CTRL\n\t//set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM.\n\trtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); \n\t\n\t// \n\t// Disable BAR, suggested by Scott\n\t// 2010.04.09 add by hpfan\n\t//\n\trtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff);\n\n\trtw_write8(Adapter,REG_SECONDARY_CCA_CTRL_8814A,0x03);\n\n\tif(pregistrypriv->wifi_spec)\n\t\trtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0);\n\t//adjust EDCCA to avoid collision\n\t/*if(pregistrypriv->wifi_spec)\n\t{\n\t\trtw_write16(Adapter, rEDCCA_Jaguar, 0xfe01);\n\t}*/\n\t//Nav limit , suggest by scott\n\trtw_write8(Adapter, 0x652, 0x0);\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM);\n\trtl8814_InitHalDm(Adapter);\n\t\n\t//\n\t// 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status\n\t// and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not \n\t// call init_adapter. May cause some problem??\n\t//\n\t// Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed \n\t// in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState \n\t// is the same as eRfOff, we should change it to eRfOn after we config RF parameters.\n\t// Added by tynli. 2010.03.30.\n\tpwrctrlpriv->rf_pwrstate = rf_on;\n\n\tPHY_IQCalibrate_8814A_Init(&pHalData->odmpriv);\n\n#if (HAL_BB_ENABLE == 1)\t\n\tPHY_SetRFEReg8814A(Adapter, _TRUE, pHalData->CurrentBandType);\n#endif //HAL_BB_ENABLE\n\n\t//0x4c6[3] 1: RTS BW = Data BW\n\t//0: RTS BW depends on CCA / secondary CCA result.\n\trtw_write8(Adapter, REG_QUEUE_CTRL, rtw_read8(Adapter, REG_QUEUE_CTRL)&0xF7);\n\n\trtw_hal_set_hwreg(Adapter, HW_VAR_NAV_UPPER, ((u8 *)&NavUpper));\n\n\t// enable Tx report.\n\trtw_write8(Adapter,  REG_FWHW_TXQ_CTRL+1, 0x0F);\n\n\t// Suggested by SD1 pisa. Added by tynli. 2011.10.21.\n\t//rtw_write8(Adapter, REG_EARLY_MODE_CONTROL_8812+3, 0x01);//Pretx_en, for WEP/TKIP SEC\n\n\t//tynli_test_tx_report.\n\t//rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0);\n\n\t// Reset USB mode switch setting\n\trtw_write8(Adapter, REG_SDIO_CTRL_8814A, 0x0);\n\trtw_write8(Adapter, REG_ACLK_MON, 0x0);\n\t\n\t//RT_TRACE(COMP_INIT, DBG_TRACE, (\"InitializeAdapter8188EUsb() <====\\n\"));\n\t\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK);\n\t// 2010/08/26 MH Merge from 8192CE.\n\tif(pwrctrlpriv->rf_pwrstate == rf_on)\n\t{\n/*\t\tif(IS_HARDWARE_TYPE_8812AU(Adapter))\n\t\t{\n#if (RTL8812A_SUPPORT == 1)\n\t\t\tpHalData->bNeedIQK = _TRUE;\n\t\t\tif(pHalData->bIQKInitialized)\n\t\t\t\tPHY_IQCalibrate_8812A(Adapter, _TRUE);\n\t\t\telse\n\t\t\t{\n\t\t\t\tPHY_IQCalibrate_8812A(Adapter, _FALSE);\n\t\t\t\tpHalData->bIQKInitialized = _TRUE;\n\t\t\t}\n#endif\n\t\t}*/\n\t//this should be done by rf team using phydm code\n\t//PHY_IQCalibrate_8814A(&pHalData->odmpriv, _FALSE);\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_PW_TRACK);\n\t\t\n\t\t//ODM_TXPowerTrackingCheck(&pHalData->odmpriv );\n\t\t\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_LCK);\n\t\t//PHY_LCCalibrate_8812A(Adapter);\n\t}\n\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC21);\n\n\n//HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS);\n//\t_InitPABias(Adapter);\n#if (MP_DRIVER == 1)\n\tif (Adapter->registrypriv.mp_mode == 1)\n\t{\n\t\tAdapter->mppriv.channel = pHalData->CurrentChannel;\n\t\tMPT_InitializeAdapter(Adapter, Adapter->mppriv.channel);\n\t}\n#endif\t//#if (MP_DRIVER == 1)\n\n#ifdef CONFIG_BT_COEXIST\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BT_COEXIST);\n\t//_InitBTCoexist(Adapter);\n\t// 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter\n\t// suspend mode automatically.\n\t//HwSuspendModeEnable92Cu(Adapter, _FALSE);\n\n\tif ( _TRUE == pHalData->EEPROMBluetoothCoexist)\n        {\n               // Init BT hw config.\n                rtw_btcoex_HAL_Initialize(Adapter, _FALSE);      \n        }\n        else\n        {\n                // In combo card run wifi only , must setting some hardware reg.\n                rtl8812a_combo_card_WifiOnlyHwInit(Adapter);\n        }\n#endif //CONFIG_BT_COEXIST\n\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);\n\n\t//rtw_write8(Adapter, REG_USB_HRPWM, 0);\n\n#ifdef CONFIG_XMIT_ACK\n\t//ack for xmit mgmt frames.\n\trtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12));\n#endif //CONFIG_XMIT_ACK\n\n\t//misc\n\t{\n\t\tint i;\t\t\n\t\tu8 mac_addr[6];\n\t\tfor(i=0; i<6; i++)\n\t\t{\t\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(Adapter->iface_type == IFACE_PORT1)\n\t\t\t\tmac_addr[i] = rtw_read8(Adapter, REG_MACID1+i);\n\t\t\telse\n#endif\n\t\t\tmac_addr[i] = rtw_read8(Adapter, REG_MACID+i);\t\t\n\t\t}\n\t\t\n\t\tDBG_8192C(\"MAC Address from REG_MACID = \"MAC_FMT\"\\n\", MAC_ARG(mac_addr));\n\t}\n\nexit:\nHAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END);\n\n\tDBG_871X(\"%s in %dms\\n\", __FUNCTION__, rtw_get_passing_time_ms(init_start_time));\n\n\t#ifdef DBG_HAL_INIT_PROFILING\n\thal_init_stages_timestamp[HAL_INIT_STAGES_END]=rtw_get_current_time();\n\n\tfor(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM-1;hal_init_profiling_i++) {\n\t\tDBG_871X(\"DBG_HAL_INIT_PROFILING: %35s, %u, %5u, %5u\\n\"\n\t\t\t, hal_init_stages_str[hal_init_profiling_i]\n\t\t\t, hal_init_stages_timestamp[hal_init_profiling_i]\n\t\t\t, (hal_init_stages_timestamp[hal_init_profiling_i+1]-hal_init_stages_timestamp[hal_init_profiling_i])\n\t\t\t, rtw_get_time_interval_ms(hal_init_stages_timestamp[hal_init_profiling_i], hal_init_stages_timestamp[hal_init_profiling_i+1])\n\t\t);\n\t}\t\n\t#endif\n\n\n_func_exit_;\n\n\treturn status;\n}\n\nVOID\nhal_carddisable_8814(\n\tIN\tPADAPTER\t\t\tAdapter \n)\n{\n\tu8\tu1bTmp;\n\n\tDBG_871X(\"CardDisableRTL8814AU\\n\");\n\n\t// stop rx \n\trtw_write8(Adapter, REG_CR_8814A, 0x0);\n\n\t// Card disable power action flow\n\tHalPwrSeqCmdParsing(Adapter, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8814A_NIC_DISABLE_FLOW);\n\n\tAdapter->bFWReady = _FALSE;\n\t\n}\n\nstatic void rtl8814au_hw_power_down(_adapter *padapter)\n{\n\t// 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c.\n\t// Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1.\n\t\t\n\t// Enable register area 0x0-0xc.\n\trtw_write8(padapter,REG_RSV_CTRL, 0x0);\t\t\t\n\trtw_write16(padapter, REG_APS_FSMCO, 0x8812);\n}\n\nu32 rtl8814au_hal_deinit(PADAPTER Adapter)\n {\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n   \tDBG_8192C(\"==> %s \\n\",__FUNCTION__);\n\n#ifdef CONFIG_BT_COEXIST\n\tif (hal_btcoex_IsBtExist(Adapter))\n\t{\n\t\tDBG_871X(\"BT module enable SIC\\n\");\n\t\t// Only under WIN7 we can support selective suspend and enter D3 state when system call halt adapter.\n\n\t\t//rtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)|BIT12);\n\t\t// 2010/10/13 MH If we enable SIC in the position and then call _ResetDigitalProcedure1. in XP,\n\t\t// the system will hang due to 8051 reset fail.\n\t}\n\telse\n#endif //CONFIG_BT_COEXIST\n\t{\n\t\trtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)&(~BIT12));\n\t}\n\n\tif(pHalData->bSupportUSB3 == _TRUE)\n\t{\n\t\t// set Reg 0xf008[3:4] to 2'11 to eable U1/U2 Mode in USB3.0. added by page, 20120712\n\t\trtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)|0x18);\n\t}\n\n\trtw_write32(Adapter, REG_HISR, 0xFFFFFFFF);\n\trtw_write32(Adapter, REG_HISRE, 0xFFFFFFFF);\n\trtw_write32(Adapter, REG_HIMR, 0);\n\trtw_write32(Adapter, REG_HIMRE, 0);\n\n #ifdef SUPPORT_HW_RFOFF_DETECTED\n \tDBG_8192C(\"bkeepfwalive(%x)\\n\", pwrctl->bkeepfwalive);\n \tif(pwrctl->bkeepfwalive)\n \t{\n\t\t_ps_close_RF(Adapter);\t\t\n\t\tif((pwrctl->bHWPwrPindetect) && (pwrctl->bHWPowerdown))\n\t\t\trtl8814au_hw_power_down(Adapter);\n \t}\n\telse\n#endif\n\t{\t\n\t\tif (rtw_is_hw_init_completed(Adapter)) {\n\t\t\thal_carddisable_8814(Adapter);\n\n\t\t\tif((pwrctl->bHWPwrPindetect ) && (pwrctl->bHWPowerdown))\n\t\t\t\trtl8814au_hw_power_down(Adapter);\n\t\t}\n\t}\t\t\n\treturn _SUCCESS;\n }\n\n\nunsigned int rtl8814au_inirp_init(PADAPTER Adapter)\n{\t\n\tu8 i;\t\n\tstruct recv_buf *precvbuf;\n\tuint\tstatus;\n\tstruct dvobj_priv *pdev= adapter_to_dvobj(Adapter);\n\tstruct intf_hdl * pintfhdl=&Adapter->iopriv.intf;\n\tstruct recv_priv *precvpriv = &(Adapter->recvpriv);\t\n\tu32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n\tHAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\n\tu32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);\n#endif\n\n_func_enter_;\n\n\t_read_port = pintfhdl->io_ops._read_port;\n\n\tstatus = _SUCCESS;\n\n\tRT_TRACE(_module_hci_hal_init_c_,_drv_info_,(\"===> usb_inirp_init \\n\"));\t\n\t\t\n\tprecvpriv->ff_hwaddr = RECV_BULK_IN_ADDR;\n\n\t//issue Rx irp to receive data\t\n\tprecvbuf = (struct recv_buf *)precvpriv->precv_buf;\t\n\tfor(i=0; i<NR_RECVBUFF; i++)\n\t{\n\t\tif(_read_port(pintfhdl, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE )\n\t\t{\n\t\t\tRT_TRACE(_module_hci_hal_init_c_,_drv_err_,(\"usb_rx_init: usb_read_port error \\n\"));\n\t\t\tstatus = _FAIL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tprecvbuf++;\t\t\n\t\tprecvpriv->free_recv_buf_queue_cnt--;\n\t}\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n\tif (pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX] != 0x05) {\n\t\tstatus = _FAIL;\n\t\tDBG_871X(\"%s =>Warning !! Have not USB Int-IN pipe, RtIntInPipe(%d)!!!\\n\", __func__, pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX]);\n\t\tgoto exit;\n\t}\t\n\t_read_interrupt = pintfhdl->io_ops._read_interrupt;\n\tif(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE )\n\t{\n\t\tRT_TRACE(_module_hci_hal_init_c_,_drv_err_,(\"usb_rx_init: usb_read_interrupt error \\n\"));\n\t\tstatus = _FAIL;\n\t}\n#endif\n\nexit:\n\t\n\tRT_TRACE(_module_hci_hal_init_c_,_drv_info_,(\"<=== usb_inirp_init \\n\"));\n\n_func_exit_;\n\n\treturn status;\n\n}\n\nunsigned int rtl8814au_inirp_deinit(PADAPTER Adapter)\n{\t\n\tRT_TRACE(_module_hci_hal_init_c_,_drv_info_,(\"\\n ===> usb_rx_deinit \\n\"));\n\t\n\trtw_read_port_cancel(Adapter);\n\n\tRT_TRACE(_module_hci_hal_init_c_,_drv_info_,(\"\\n <=== usb_rx_deinit \\n\"));\n\n\treturn _SUCCESS;\n}\n\n//-------------------------------------------------------------------\n//\n//\tEEPROM/EFUSE Content Parsing\n//\n//-------------------------------------------------------------------\nVOID\nhal_ReadIDs_8814AU(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tpu1Byte\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\n\tif( !AutoloadFail )\n\t{\n\t\tpHalData->EEPROMVID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_VID_8814AU] );\n\t\tpHalData->EEPROMPID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_PID_8814AU] );\t\t\n\t\t\n\t\t// Customer ID, 0x00 and 0xff are reserved for Realtek. \t\t\n\t\tpHalData->EEPROMCustomerID = *(pu1Byte)&PROMContent[EEPROM_CustomID_8814];\n\t\tpHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID;\n\t}\n\telse\n\t{\n\t\tpHalData->EEPROMVID \t\t\t= EEPROM_Default_VID;\n\t\tpHalData->EEPROMPID \t\t\t= EEPROM_Default_PID;\n\n\t\t// Customer ID, 0x00 and 0xff are reserved for Realtek. \t\t\n\t\tpHalData->EEPROMCustomerID\t\t= EEPROM_Default_CustomerID;\n\t\tpHalData->EEPROMSubCustomerID\t= EEPROM_Default_SubCustomerID;\n\t}\n\t\n\tDBG_871X(\"VID = 0x%04X, PID = 0x%04X\\n\", pHalData->EEPROMVID, pHalData->EEPROMPID);\n\tDBG_871X(\"Customer ID: 0x%02X, SubCustomer ID: 0x%02X\\n\", pHalData->EEPROMCustomerID, pHalData->EEPROMSubCustomerID);\n}\n\nVOID\nhal_InitPGData_8814A(\n\tIN\tPADAPTER\t\tpadapter,\n\tIN\tOUT\tu8*\t\t\tPROMContent\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tu32\t\t\ti;\n\tu16\t\t\tvalue16;\n\n\tif(_FALSE == pHalData->bautoload_fail_flag)\n\t{ // autoload OK.\n\t\t// hal_ReadeFuse_8814A is FW offload read efuse, todo\n\t//#if ((DEV_BUS_TYPE==RT_USB_INTERFACE || DEV_BUS_TYPE==RT_SDIO_INTERFACE))  && (MP_DRIVER != 1)\n\t\t//if(hal_ReadeFuse_8814A(pAdapter) == _FAIL)\n\t//#endif\n\t\t\n\t\t// Read EFUSE real map to shadow.\n\t\tEFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE);\n\t}\n\telse\n\t{//autoload fail\n\t\tDBG_871X(\"AutoLoad Fail reported from CR9346!!\\n\");\n\t\t//update to default value 0xFF\n\t\tEFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE);\n\t}\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n\tif (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {\n\t\tif (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS)\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"invalid phy efuse and read from file fail, will use driver default!!\\n\");\n\t}\n#endif\n}\n\nVOID\nhal_CustomizedBehavior_8814AU(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n\tstruct led_priv\t*pledpriv = &(Adapter->ledpriv);\n\n\t\n\t// Led mode\n\tswitch(pHalData->CustomerID)\n\t{\n\t\tcase RT_CID_DEFAULT:\n\t\t\tpledpriv->LedStrategy = SW_LED_MODE9;\n\t\t\tpledpriv->bRegUseLed = _TRUE;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tpledpriv->LedStrategy = SW_LED_MODE9;\n\t\t\tbreak;\n\t}\n}\n\nstatic void\nhal_CustomizeByCustomerID_8814AU(\n\tIN\tPADAPTER\t\tpAdapter\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(pAdapter);\n\t\n\tDBG_871X(\"PID= 0x%x, VID=  %x\\n\",pHalData->EEPROMPID,pHalData->EEPROMVID);\n\t\n\t//\tDecide CustomerID according to VID/DID or EEPROM\n\tswitch(pHalData->EEPROMCustomerID)\n\t{\n\t\tcase EEPROM_CID_DEFAULT:\n\t\t\tif((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308))\n\t\t\t\tpHalData->CustomerID = RT_CID_DLINK;\n\t\t\telse if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309))\n\t\t\t\tpHalData->CustomerID = RT_CID_DLINK;\n\t\t\telse if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a))\n\t\t\t\tpHalData->CustomerID = RT_CID_DLINK;\n\t\t\telse if((pHalData->EEPROMVID == 0x0BFF) && (pHalData->EEPROMPID == 0x8160))\n\t\t\t{\n\t\t\t\tpHalData->CustomerID = RT_CID_CHINA_MOBILE;\n\t\t\t}\t\n\t\t\telse if((pHalData->EEPROMVID == 0x0BDA) &&\t(pHalData->EEPROMPID == 0x5088))\n\t\t\t\tpHalData->CustomerID = RT_CID_CC_C;\n\t\t\t\n\t\t\tbreak;\n\t\tcase EEPROM_CID_WHQL:\n\t\t\t//padapter->bInHctTest = _TRUE;\n\t\n\t\t\t//pMgntInfo->bSupportTurboMode = _FALSE;\n\t\t\t//pMgntInfo->bAutoTurboBy8186 = _FALSE;\n\t\n\t\t\t//pMgntInfo->PowerSaveControl.bInactivePs = _FALSE;\n\t\t\t//pMgntInfo->PowerSaveControl.bIPSModeBackup = _FALSE;\n\t\t\t//pMgntInfo->PowerSaveControl.bLeisurePs = _FALSE;\n\t\t\t//pMgntInfo->PowerSaveControl.bLeisurePsModeBackup = _FALSE;\n\t\t\t//pMgntInfo->keepAliveLevel = 0;\n\t\n\t\t\t//padapter->bUnloadDriverwhenS3S4 = _FALSE;\n\t\t\tbreak;\t\t\t\n\t\tdefault:\n\t\t\tpHalData->CustomerID = RT_CID_DEFAULT;\n\t\t\tbreak;\n\t\t\t\n\t}\n\tDBG_871X(\"Customer ID: 0x%2x\\n\", pHalData->CustomerID);\n\t\n\thal_CustomizedBehavior_8814AU(pAdapter);\n}\n\nVOID\nhal_ReadUsbModeSwitch_8814AU(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8*\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n#if 0\n\tif(AutoloadFail)\n\t{\n\t\tUsbModeSwitch_SetUsbModeMechOn(Adapter, _FALSE);\n\t}\n\telse\n\t{\n\t\tUsbModeSwitch_SetUsbModeMechOn(Adapter, ((PROMContent[8]&BIT1)>>1));\n\t}\n#endif\n}\n\nstatic VOID\nReadLEDSetting_8814AU(\n\tIN\tPADAPTER\tAdapter,\t\n\tIN\tu8*\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail\n\t)\n{\n\tstruct led_priv *pledpriv = &(Adapter->ledpriv);\n\n#ifdef CONFIG_SW_LED\n\tpledpriv->bRegUseLed = _TRUE;\n#else // HW LED\n\tpledpriv->LedStrategy = HW_LED;\n#endif //CONFIG_SW_LED\n}\n\nVOID\nInitAdapterVariablesByPROM_8814AU(\n\tIN\tPADAPTER\tAdapter\n\t)\n{\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);\n\n\thal_InitPGData_8814A(Adapter, pHalData->efuse_eeprom_data);\n\n\t//Hal_EfuseParseIDCode8812A(Adapter, pHalData->efuse_eeprom_data);\n\thal_ReadPROMVersion8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_ReadIDs_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_config_macaddr(Adapter, pHalData->bautoload_fail_flag);\n\thal_ReadTxPowerInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_ReadBoardType8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_Read_TRX_antenna_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\t\n\t//\n\t// Read Bluetooth co-exist and initialize\n\t//\n\thal_EfuseParseBTCoexistInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\t\n\thal_ReadChannelPlan8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_EfuseParseXtal_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\t\n\thal_ReadThermalMeter_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_ReadRemoteWakeup_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_ReadAntennaDiversity8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_ReadRFEType_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\t\n\tReadLEDSetting_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\n\thal_ReadUsbModeSwitch_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\thal_CustomizeByCustomerID_8814AU(Adapter);\n\n\thal_GetRxGainOffset_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n\n\tHal_EfuseParseKFreeData_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag);\n}\n\nstatic void hal_ReadPROMContent_8814A(\n\tIN PADAPTER \t\tAdapter\n\t)\n{\t\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\teeValue;\n\n\t/* check system boot selection */\n\teeValue = rtw_read8(Adapter, REG_9346CR);\n\tpHalData->EepromOrEfuse\t\t= (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE;\n\tpHalData->bautoload_fail_flag\t= (eeValue & EEPROM_EN) ? _FALSE : _TRUE;\n\n\tDBG_871X(\"Boot from %s, Autoload %s !\\n\", (pHalData->EepromOrEfuse ? \"EEPROM\" : \"EFUSE\"),\n\t\t\t\t(pHalData->bautoload_fail_flag ? \"Fail\" : \"OK\") );\n\n\t//pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE;\n\n\tInitAdapterVariablesByPROM_8814AU(Adapter);\n}\n\nvoid\nReadAdapterInfo8814AU(\n\tIN PADAPTER\t\t\tAdapter\n\t)\n{\n\tHal_InitEfuseVars_8814A(Adapter);\n\t\n\t// Read all content in Efuse/EEPROM.\n\thal_ReadPROMContent_8814A(Adapter);\n\n\t/* We need to define the RF type after all PROM value is recognized. */\n\tReadRFType8814A(Adapter);\n}\n\nvoid UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 RemoveMSR)\n{\n\tHAL_DATA_TYPE *pHalData;\n\n\tu32 *himr;\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tif(bHIMR0)\n\t\thimr = &(pHalData->IntrMask[0]);\n\telse\n\t\thimr = &(pHalData->IntrMask[1]);\n\t\n\tif (AddMSR)\n\t\t*himr |= AddMSR;\n\n\tif (RemoveMSR)\n\t\t*himr &= (~RemoveMSR);\n\n\tif(bHIMR0)\t\n\t\trtw_write32(padapter, REG_HIMR0_8814A, *himr);\n\telse\n\t\trtw_write32(padapter, REG_HIMR1_8814A, *himr);\t\n\n}\n\nvoid SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter);\n\tstruct registry_priv *registry_par = &Adapter->registrypriv;\n\n\tswitch(variable)\n\t{\n\t\tcase HW_VAR_RXDMA_AGG_PG_TH:\n#ifdef CONFIG_USB_RX_AGGREGATION\n\t\t\t{\n\t\t\t\t/*u8\tthreshold = *((u8 *)val);\n\t\t\t\tif( threshold == 0)\n\t\t\t\t{\n\t\t\t\t\tthreshold = pHalData->UsbRxAggPageCount;\n\t\t\t\t}\n\t\t\t\trtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold);*/\n\t\t\t}\n#endif\n\t\t\tbreak;\n\t\tcase HW_VAR_SET_RPWM:\n#ifdef CONFIG_LPS_LCLK\n\t\t\t{\n\t\t\t\tu8\tps_state = *((u8 *)val);\n\t\t\t\t//rpwm value only use BIT0(clock bit) ,BIT6(Ack bit), and BIT7(Toggle bit) for 88e.\n\t\t\t\t//BIT0 value - 1: 32k, 0:40MHz.\n\t\t\t\t//BIT6 value - 1: report cpwm value after success set, 0:do not report.\n\t\t\t\t//BIT7 value - Toggle bit change.\n\t\t\t\t//modify by Thomas. 2012/4/2.\n\t\t\t\tps_state = ps_state & 0xC1;\n\t\t\t\t//DBG_871X(\"##### Change RPWM value to = %x for switch clk #####\\n\",ps_state);\n\t\t\t\trtw_write8(Adapter, REG_USB_HRPWM, ps_state);\n\t\t\t}\n#endif\n#ifdef CONFIG_AP_WOWLAN\n\t\t\tif (pwrctl->wowlan_ap_mode == _TRUE) {\n\t\t\t\tu8\tps_state = *((u8 *)val);\n\n\t\t\t\tDBG_871X(\"%s, RPWM\\n\", __func__);\n\t\t\t\tps_state = ps_state & 0xC1;\n\t\t\t\trtw_write8(Adapter, REG_USB_HRPWM, ps_state);\n\t\t\t}\n#endif\n\t\t\tbreak;\n\t\tcase HW_VAR_USB_MODE:\n\t\t\t/* U2 to U3 */\n\t\t\tif (registry_par->switch_usb_mode == 1) {\n\t\t\t\tif (IS_HIGH_SPEED_USB(Adapter)) {\n\t\t\t\t\tif ((rtw_read8(Adapter, 0x74) & (BIT(2)|BIT(3))) != BIT(3)) {\n\t\t\t\t\t\trtw_write8(Adapter, 0x74, 0x8);\n\t\t\t\t\t\trtw_write8(Adapter, 0x70, 0x2);\n\t\t\t\t\t\trtw_write8(Adapter, 0x3e, 0x1);\n\t\t\t\t\t\trtw_write8(Adapter, 0x3d, 0x3);\n\t\t\t\t\t\t/* usb disconnect */\n\t\t\t\t\t\trtw_write8(Adapter, 0x5, 0x80);\n\t\t\t\t\t\t*val = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t} else if (IS_SUPER_SPEED_USB(Adapter)) {\n\t\t\t\t\trtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1)));\n\t\t\t\t\trtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0)));\n\t\t\t\t}\n\t\t\t} else if (registry_par->switch_usb_mode == 2) {\n\t\t\t\t/* U3 to U2 */\n\t\t\t\tif (IS_SUPER_SPEED_USB(Adapter)) {\n\t\t\t\t\tif ((rtw_read8(Adapter, 0x74) & (BIT(2)|BIT(3))) != BIT(2)) {\n\t\t\t\t\t\trtw_write8(Adapter, 0x74, 0x4);\n\t\t\t\t\t\trtw_write8(Adapter, 0x70, 0x2);\n\t\t\t\t\t\trtw_write8(Adapter, 0x3e, 0x1);\n\t\t\t\t\t\trtw_write8(Adapter, 0x3d, 0x3);\n\t\t\t\t\t\t/* usb disconnect */\n\t\t\t\t\t\trtw_write8(Adapter, 0x5, 0x80);\n\t\t\t\t\t\t*val = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t} else if (IS_HIGH_SPEED_USB(Adapter)) {\n\t\t\t\t\trtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1)));\n\t\t\t\t\trtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0)));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tSetHwReg8814A(Adapter, variable, val);\n\t\t\tbreak;\n\t}\n\n}\n\nvoid GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\t\n_func_enter_;\n\n\tswitch(variable)\n\t{\n\t\tdefault:\n\t\t\tGetHwReg8814A(Adapter,variable,val);\n\t\t\tbreak;\n\t}\n\n_func_exit_;\n}\n\n//\n//\tDescription:\n//\t\tChange default setting of specified variable.\n//\nu8\nSetHalDefVar8814AUsb(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tHAL_DEF_VARIABLE\t\teVariable,\n\tIN\tPVOID\t\t\t\t\tpValue\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\tbResult = _SUCCESS;\n\n\tswitch(eVariable)\n\t{\n\t\tdefault:\n\t\t\tSetHalDefVar8814A(Adapter,eVariable,pValue);\n\t\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\n//\n//\tDescription: \n//\t\tQuery setting of specified variable.\n//\nu8\nGetHalDefVar8814AUsb(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tHAL_DEF_VARIABLE\t\teVariable,\n\tIN\tPVOID\t\t\t\t\tpValue\n\t)\n{\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(Adapter);\n\tu8\t\t\tbResult = _SUCCESS;\n\n\tswitch(eVariable)\n\t{\n\t\tdefault:\n\t\t\tGetHalDefVar8814A(Adapter,eVariable,pValue);\n\t\t\tbreak;\n\t}\n\n\treturn bResult;\n}\n\nstatic void rtl8814au_init_default_value(_adapter * padapter)\n{\n\tPHAL_DATA_TYPE pHalData;\n\n\tpHalData = GET_HAL_DATA(padapter);\n\n\tInitDefaultValue8814A(padapter);\n\n\tpHalData->IntrMask[0]\t= (u32)(\t\t\t\\\n\t\t\t\t\t\t\t\t//IMR_ROK \t\t|\n\t\t\t\t\t\t\t\t//IMR_RDU\t\t\t|\n\t\t\t\t\t\t\t\t//IMR_VODOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_VIDOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_BEDOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_BKDOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_MGNTDOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_HIGHDOK\t\t|\n\t\t\t\t\t\t\t\t//IMR_CPWM\t\t|\n\t\t\t\t\t\t\t\t//IMR_CPWM2\t\t|\n\t\t\t\t\t\t\t\t//IMR_C2HCMD\t\t|\n\t\t\t\t\t\t\t\t//IMR_HISR1_IND_INT\t|\n\t\t\t\t\t\t\t\t//IMR_ATIMEND\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT_E\t|\n\t\t\t\t\t\t\t\t//IMR_HSISR_IND_ON_INT\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK0\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT0\t|\n\t\t\t\t\t\t\t\t//IMR_TSF_BIT32_TOGGLE\t|\n\t\t\t\t\t\t\t\t//IMR_TXBCN0OK\t|\n\t\t\t\t\t\t\t\t//IMR_TXBCN0ERR\t|\n\t\t\t\t\t\t\t\t//IMR_GTINT3\t\t|\n\t\t\t\t\t\t\t\t//IMR_GTINT4\t\t|\n\t\t\t\t\t\t\t\t//IMR_TXCCK\t\t|\n\t\t\t\t\t\t\t\t0);\n\n\tpHalData->IntrMask[1] \t= (u32)(\\\n\t\t\t\t\t\t\t\t//IMR_RXFOVW\t\t|\n\t\t\t\t\t\t\t\t//IMR_TXFOVW\t\t|\n\t\t\t\t\t\t\t\t//IMR_RXERR\t\t|\n\t\t\t\t\t\t\t\t//IMR_TXERR\t\t|\n\t\t\t\t\t\t\t\t//IMR_ATIMEND_E\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK1\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK2\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK3\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK4\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK5\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK6\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDOK7\t\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT1\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT2\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT3\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT4\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT5\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT6\t|\n\t\t\t\t\t\t\t\t//IMR_BCNDMAINT7\t|\n\t\t\t\t\t\t\t\t0);\n}\n\nstatic u8 rtl8814au_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val)\n{\t\n\tu8 bResult = _TRUE;\n\tswitch(efunc_id){\n\n\t\t#if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED)\n\t\tcase HAL_USB_SELECT_SUSPEND:\n\t\t\t{\n\t\t\t\tu8 bfwpoll = *(( u8*)val);\n\t\t\t\t//rtl8188e_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect\n\t\t\t}\n\t\t\tbreak;\n\t\t#endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn bResult;\n}\n\nvoid rtl8814au_set_hal_ops(_adapter * padapter)\n{\n\tstruct hal_ops\t*pHalFunc = &padapter->HalFunc;\n\n_func_enter_;\n\n\tpHalFunc->hal_power_on = _InitPowerOn_8814AU;\n\tpHalFunc->hal_power_off = hal_carddisable_8814;\n\t\n\tpHalFunc->hal_init = &rtl8814au_hal_init;\n\tpHalFunc->hal_deinit = &rtl8814au_hal_deinit;\n\n\tpHalFunc->inirp_init = &rtl8814au_inirp_init;\n\tpHalFunc->inirp_deinit = &rtl8814au_inirp_deinit;\n\n\tpHalFunc->init_xmit_priv = &rtl8814au_init_xmit_priv;\n\tpHalFunc->free_xmit_priv = &rtl8814au_free_xmit_priv;\n\n\tpHalFunc->init_recv_priv = &rtl8814au_init_recv_priv;\n\tpHalFunc->free_recv_priv = &rtl8814au_free_recv_priv;\n#ifdef CONFIG_SW_LED\n\tpHalFunc->InitSwLeds = &rtl8814au_InitSwLeds;\n\tpHalFunc->DeInitSwLeds = &rtl8814au_DeInitSwLeds;\n#else //case of hw led or no led\n\tpHalFunc->InitSwLeds = NULL;\n\tpHalFunc->DeInitSwLeds = NULL;\n#endif//CONFIG_SW_LED\n\t\n\tpHalFunc->init_default_value = &rtl8814au_init_default_value;\n\tpHalFunc->intf_chip_configure = &rtl8814au_interface_configure;\n\tpHalFunc->read_adapter_info = &ReadAdapterInfo8814AU;\n \n\tpHalFunc->SetHwRegHandler = &SetHwReg8814AU;\n\tpHalFunc->GetHwRegHandler = &GetHwReg8814AU;\n  \tpHalFunc->GetHalDefVarHandler = &GetHalDefVar8814AUsb;\n \tpHalFunc->SetHalDefVarHandler = &SetHalDefVar8814AUsb;\n\n\n\tpHalFunc->hal_xmit = &rtl8814au_hal_xmit;\n\tpHalFunc->mgnt_xmit = &rtl8814au_mgnt_xmit;\n\tpHalFunc->hal_xmitframe_enqueue = &rtl8814au_hal_xmitframe_enqueue;\n\n#ifdef CONFIG_HOSTAPD_MLME\n\tpHalFunc->hostap_mgnt_xmit_entry = &rtl8812au_hostap_mgnt_xmit_entry;\n#endif\n\tpHalFunc->interface_ps_func = &rtl8814au_ps_func;\n#ifdef CONFIG_XMIT_THREAD_MODE\n\tpHalFunc->xmit_thread_handler = &rtl8812au_xmit_buf_handler;\n#endif\n#ifdef CONFIG_SUPPORT_USB_INT\n\tpHalFunc->interrupt_handler = interrupt_handler_8814au;\n#endif\n\tpHalFunc->fw_correct_bcn = &rtl8814_fw_update_beacon_cmd;\n\trtl8814_set_hal_ops(pHalFunc);\n_func_exit_;\n\n}\n\n"
  },
  {
    "path": "hal/rtl8814a/usb/usb_ops_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HCI_OPS_OS_C_\n\n//#include <drv_types.h>\n#include <rtl8814a_hal.h>\n\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8814au(_adapter *padapter,u16 pkt_len,u8 *pbuf)\n{\t\n\tHAL_DATA_TYPE\t*pHalData=GET_HAL_DATA(padapter);\n\tstruct reportpwrstate_parm pwr_rpt;\n\t\n\tif ( pkt_len != INTERRUPT_MSG_FORMAT_LEN )\n\t{\n\t\tDBG_8192C(\"%s Invalid interrupt content length (%d)!\\n\", __FUNCTION__, pkt_len);\n\t\treturn ;\n\t}\n\n\t// HISR \n\t_rtw_memcpy(&(pHalData->IntArray[0]), &(pbuf[USB_INTR_CONTENT_HISR_OFFSET]), 4);\n\t_rtw_memcpy(&(pHalData->IntArray[1]), &(pbuf[USB_INTR_CONTENT_HISRE_OFFSET]), 4);\n\n\t#if 0 //DBG\n\t{\n\t\tu32 hisr=0 ,hisr_ex=0;\n\t\t_rtw_memcpy(&hisr,&(pHalData->IntArray[0]),4);\n\t\thisr = le32_to_cpu(hisr);\t\n\t\t\n\t\t_rtw_memcpy(&hisr_ex,&(pHalData->IntArray[1]),4);\n\t\thisr_ex = le32_to_cpu(hisr_ex);\n\t\t\n\t\tif((hisr != 0) || (hisr_ex!=0))\n\t\t\tDBG_871X(\"===> %s hisr:0x%08x ,hisr_ex:0x%08x \\n\",__FUNCTION__,hisr,hisr_ex);\n\t}\n\t#endif\n\n\n#ifdef CONFIG_LPS_LCLK\n\tif(  pHalData->IntArray[0]  & IMR_CPWM_88E )\n\t{\n\t\t_rtw_memcpy(&pwr_rpt.state, &(pbuf[USB_INTR_CONTENT_CPWM1_OFFSET]), 1);\n\t\t//_rtw_memcpy(&pwr_rpt.state2, &(pbuf[USB_INTR_CONTENT_CPWM2_OFFSET]), 1);\n\n\t\t//88e's cpwm value only change BIT0, so driver need to add PS_STATE_S2 for LPS flow.\t\t\n\t\tpwr_rpt.state |= PS_STATE_S2;\t\t\n\t\t_set_workitem(&(adapter_to_pwrctl(padapter)->cpwm_event));\n\t}\n#endif//CONFIG_LPS_LCLK\n\n#ifdef CONFIG_INTERRUPT_BASED_TXBCN\n\n\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\tif (pHalData->IntArray[0] & IMR_BCNDMAINT0_88E)\n\t#endif\n\t#ifdef  CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\n\tif (pHalData->IntArray[0] & (IMR_TBDER_88E|IMR_TBDOK_88E))\n\t#endif\t\n\t{\t\t\n\t\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\t#if 0\n\t\tif(pHalData->IntArray[0] & IMR_BCNDMAINT0_88E)\n\t\t\tDBG_8192C(\"%s: HISR_BCNERLY_INT\\n\", __func__);\n\t\tif(pHalData->IntArray[0] & IMR_TBDOK_88E)\n\t\t\tDBG_8192C(\"%s: HISR_TXBCNOK\\n\", __func__);\n\t\tif(pHalData->IntArray[0] & IMR_TBDER_88E)\n\t\t\tDBG_8192C(\"%s: HISR_TXBCNERR\\n\", __func__);\n\t\t#endif\n\t\t\n\n\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\t{\n\t\t\t//send_beacon(padapter);\n\t\t\tif(pmlmepriv->update_bcn == _TRUE)\n\t\t\t{\n\t\t\t\t//tx_beacon_hdl(padapter, NULL);\n\t\t\t\tset_tx_beacon_cmd(padapter);\n\t\t\t}\n\t\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(check_buddy_fwstate(padapter, WIFI_AP_STATE))\n\t\t{\n\t\t\t//send_beacon(padapter);\n\t\t\tif(padapter->pbuddy_adapter->mlmepriv.update_bcn == _TRUE)\n\t\t\t{\n\t\t\t\t//tx_beacon_hdl(padapter, NULL);\n\t\t\t\tset_tx_beacon_cmd(padapter->pbuddy_adapter);\n\t\t\t}\n\t\t}\n#endif\n\t\t\n\t}\n#endif //CONFIG_INTERRUPT_BASED_TXBCN\n\n\n\n\n#ifdef DBG_CONFIG_ERROR_DETECT_INT\n\tif(  pHalData->IntArray[1]  & IMR_TXERR_88E )\n\t\tDBG_871X(\"===> %s Tx Error Flag Interrupt Status \\n\",__FUNCTION__);\n\tif(  pHalData->IntArray[1]  & IMR_RXERR_88E )\n\t\tDBG_871X(\"===> %s Rx Error Flag INT Status \\n\",__FUNCTION__);\n\tif(  pHalData->IntArray[1]  & IMR_TXFOVW_88E )\n\t\tDBG_871X(\"===> %s Transmit FIFO Overflow \\n\",__FUNCTION__);\n\tif(  pHalData->IntArray[1]  & IMR_RXFOVW_88E )\n\t\tDBG_871X(\"===> %s Receive FIFO Overflow \\n\",__FUNCTION__);\t\n#endif//DBG_CONFIG_ERROR_DETECT_INT\n\n\n\t// C2H Event \n\tif(pbuf[0]!= 0){\n\t\t_rtw_memcpy(&(pHalData->C2hArray[0]), &(pbuf[USB_INTR_CONTENT_C2H_OFFSET]), 16);\t\t\n\t\t//rtw_c2h_wk_cmd(padapter); to do..\n\t}\t\t\n\t\t\n}\n#endif //CONFIG_SUPPORT_USB_INT\n\t\t\t\t\nstatic s32 pre_recv_entry(union recv_frame *precvframe, u8 *pphy_status)\n{\t\n\ts32 ret=_SUCCESS;\n#ifdef CONFIG_CONCURRENT_MODE\t\n\tu8 *primary_myid, *secondary_myid, *paddr1;\n\tunion recv_frame\t*precvframe_if2 = NULL;\n\t_adapter *primary_padapter = precvframe->u.hdr.adapter;\n\t_adapter *secondary_padapter = primary_padapter->pbuddy_adapter;\n\tstruct recv_priv *precvpriv = &primary_padapter->recvpriv;\n\t_queue *pfree_recv_queue = &precvpriv->free_recv_queue;\n\tu8\t*pbuf = precvframe->u.hdr.rx_data;\n\t\n\tif(!secondary_padapter)\n\t\treturn ret;\n\t\n\tpaddr1 = GetAddr1Ptr(pbuf);\n\n\tif(IS_MCAST(paddr1) == _FALSE)//unicast packets\n\t{\n\t\t//primary_myid = myid(&primary_padapter->eeprompriv);\n\t\tsecondary_myid = adapter_mac_addr(secondary_padapter);\n\n\t\tif(_rtw_memcmp(paddr1, secondary_myid, ETH_ALEN))\n\t\t{\t\t\t\n\t\t\t//change to secondary interface\n\t\t\tprecvframe->u.hdr.adapter = secondary_padapter;\n\t\t}\t\n\n\t\t//ret = recv_entry(precvframe);\n\n\t}\n\telse // Handle BC/MC Packets\t\n\t{\n\t\t\n\t\tu8 clone = _TRUE;\n#if 0\n\t\tu8 type, subtype, *paddr2, *paddr3;\n\t\n\t\ttype =  GetFrameType(pbuf);\n\t\tsubtype = GetFrameSubType(pbuf); //bit(7)~bit(2)\n\t\t\n\t\tswitch (type)\n\t\t{\n\t\t\tcase WIFI_MGT_TYPE: //Handle BC/MC mgnt Packets\n\t\t\t\tif(subtype == WIFI_BEACON)\n\t\t\t\t{\n\t\t\t\t\tpaddr3 = GetAddr3Ptr(precvframe->u.hdr.rx_data);\n\t\t\t\t\n\t\t\t\t\tif (check_fwstate(&secondary_padapter->mlmepriv, _FW_LINKED) &&\n\t\t\t\t\t\t_rtw_memcmp(paddr3, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN))\n\t\t\t\t\t{\n\t\t\t\t\t\t//change to secondary interface\n\t\t\t\t\t\tprecvframe->u.hdr.adapter = secondary_padapter;\n\t\t\t\t\t\tclone = _FALSE;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(check_fwstate(&primary_padapter->mlmepriv, _FW_LINKED) &&\n\t\t\t\t\t\t_rtw_memcmp(paddr3, get_bssid(&primary_padapter->mlmepriv), ETH_ALEN))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(clone==_FALSE)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclone = _TRUE;\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tclone = _FALSE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprecvframe->u.hdr.adapter = primary_padapter;\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif(check_fwstate(&primary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) ||\n\t\t\t\t\t\tcheck_fwstate(&secondary_padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING))\n\t\t\t\t\t{\n\t\t\t\t\t\tclone = _TRUE;\n\t\t\t\t\t\tprecvframe->u.hdr.adapter = primary_padapter;\t\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(subtype == WIFI_PROBEREQ)\n\t\t\t\t{\n\t\t\t\t\t//probe req frame is only for interface2\n\t\t\t\t\t//change to secondary interface\n\t\t\t\t\tprecvframe->u.hdr.adapter = secondary_padapter;\n\t\t\t\t\tclone = _FALSE;\n\t\t\t\t}\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase WIFI_CTRL_TYPE: // Handle BC/MC ctrl Packets\n\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase WIFI_DATA_TYPE: //Handle BC/MC data Packets\n\t\t\t\t\t//Notes: AP MODE never rx BC/MC data packets\n\t\t\t\n\t\t\t\tpaddr2 = GetAddr2Ptr(precvframe->u.hdr.rx_data);\n\n\t\t\t\tif(_rtw_memcmp(paddr2, get_bssid(&secondary_padapter->mlmepriv), ETH_ALEN))\n\t\t\t\t{\n\t\t\t\t\t//change to secondary interface\n\t\t\t\t\tprecvframe->u.hdr.adapter = secondary_padapter;\n\t\t\t\t\tclone = _FALSE;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\n\t\t\t\tbreak;\t\t\t\n\t\t}\n#endif\n\n\t\tif(_TRUE == clone)\n\t\t{\n\t\t\t//clone/copy to if2\t\t\n\t\t\tstruct rx_pkt_attrib *pattrib = NULL;\n\t\t\n\t\t\tprecvframe_if2 = rtw_alloc_recvframe(pfree_recv_queue);\n\t\t\tif(precvframe_if2)\n\t\t\t{\n\t\t\t\tprecvframe_if2->u.hdr.adapter = secondary_padapter;\n\t\t\n\t\t\t\t_rtw_init_listhead(&precvframe_if2->u.hdr.list);\t\n\t\t\t\tprecvframe_if2->u.hdr.precvbuf = NULL;\t//can't access the precvbuf for new arch.\n\t\t\t\tprecvframe_if2->u.hdr.len=0;\n\n\t\t\t\t_rtw_memcpy(&precvframe_if2->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib));\n\n\t\t\t\tpattrib = &precvframe_if2->u.hdr.attrib;\n\n\t\t\t\tif(rtw_os_alloc_recvframe(secondary_padapter, precvframe_if2, pbuf, NULL) == _SUCCESS)\t\t\t\t\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\trecvframe_put(precvframe_if2, pattrib->pkt_len);\n\t\t\t\t\t//recvframe_pull(precvframe_if2, drvinfo_sz + RXDESC_SIZE);\n\n\t\t\t\t\tif (pattrib->physt && pphy_status)\n\t\t\t\t\t\trx_query_phy_status(precvframe_if2, pphy_status);\n\t\n\t\t\t\t\tret = rtw_recv_entry(precvframe_if2);\t\t\t\t\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\trtw_free_recvframe(precvframe_if2, pfree_recv_queue);\n\t\t\t\t\tDBG_8192C(\"%s()-%d: alloc_skb() failed!\\n\", __FUNCTION__, __LINE__);\t\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t}\n\t//if (precvframe->u.hdr.attrib.physt)\n\t//\trx_query_phy_status(precvframe, pphy_status);\n\t\n\t//ret = rtw_recv_entry(precvframe);\n\n#endif\n\n\treturn ret;\n\n}\n\nint recvbuf2recvframe(PADAPTER padapter, void *ptr)\n{\n\tu8\t*pbuf;\n\tu8\tpkt_cnt = 0;\n\tu32\tpkt_offset;\n\ts32\ttransfer_len;\n\tu8\t\t\t\t*pphy_status = NULL;\t\n\tunion recv_frame\t*precvframe = NULL;\n\tstruct rx_pkt_attrib\t*pattrib = NULL;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\t_queue\t\t\t*pfree_recv_queue = &precvpriv->free_recv_queue;\n\t_pkt *pskb;\n\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\tpskb = NULL;\n\ttransfer_len = (s32)((struct recv_buf*)ptr)->transfer_len;\n\tpbuf = ((struct recv_buf*)ptr)->pbuf;\n#else\n\tpskb = (_pkt*)ptr;\n\ttransfer_len = (s32)pskb->len;\n\tpbuf = pskb->data;\n#endif//CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n\n#ifdef CONFIG_USB_RX_AGGREGATION\n\tpkt_cnt = GET_RX_STATUS_DESC_DMA_AGG_NUM_8814A(pbuf);\n#endif\n\n\tdo{\n\t\tprecvframe = rtw_alloc_recvframe(pfree_recv_queue);\n\t\tif(precvframe==NULL)\n\t\t{\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(\"recvbuf2recvframe: precvframe==NULL\\n\"));\n\t\t\tDBG_8192C(\"%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\\n\", __FUNCTION__, __LINE__);\t\n\t\t\tgoto _exit_recvbuf2recvframe;\n\t\t}\n\n\t\t_rtw_init_listhead(&precvframe->u.hdr.list);\t\n\t\tprecvframe->u.hdr.precvbuf = NULL;\t//can't access the precvbuf for new arch.\n\t\tprecvframe->u.hdr.len=0;\n\n\t\trtl8814_query_rx_desc_status(precvframe, pbuf);\n\n\t\tpattrib = &precvframe->u.hdr.attrib;\t\t\n\t\t\t\t\n\t\tif ((padapter->registrypriv.mp_mode == 0) && ((pattrib->crc_err) || (pattrib->icv_err)))\n\t\t{\n\t\t\tDBG_871X(\"%s: RX Warning! crc_err=%d icv_err=%d, skip!\\n\", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);\n\n\t\t\trtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t\tgoto _exit_recvbuf2recvframe;\n\t\t}\n\n\t\tpkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len;\n\n\t\tif((pattrib->pkt_len<=0) || (pkt_offset>transfer_len))\n\t\t{\t\n\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_info_,(\"recvbuf2recvframe: pkt_len<=0\\n\"));\n\t\t\tDBG_871X(\"%s()-%d: RX Warning!,pkt_len<=0 or pkt_offset> transfer_len \\n\", __FUNCTION__, __LINE__);\t\n\t\t\trtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t\tgoto _exit_recvbuf2recvframe;\n\t\t}\n\n#ifdef CONFIG_RX_PACKET_APPEND_FCS\n\t\tif(pattrib->pkt_rpt_type == NORMAL_RX)\n\t\t\tpattrib->pkt_len -= IEEE80211_FCS_LEN;\n#endif\n\t\tif(rtw_os_alloc_recvframe(padapter, precvframe, \n\t\t\t(pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), pskb) == _FAIL)\n\t\t{\n\t\t\trtw_free_recvframe(precvframe, pfree_recv_queue);\n\n\t\t\tgoto _exit_recvbuf2recvframe;\n\t\t}\n\n\t\trecvframe_put(precvframe, pattrib->pkt_len);\n\t\t//recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE);\n\n\t\tif(pattrib->pkt_rpt_type == NORMAL_RX)//Normal rx packet\n\t\t{\n\t\t\tif(pattrib->physt)\n\t\t\t\tpphy_status = (pbuf + RXDESC_OFFSET);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tif(rtw_buddy_adapter_up(padapter))\n\t\t\t{\n\t\t\t\tif(pre_recv_entry(precvframe, pphy_status) != _SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,\n\t\t\t\t\t\t(\"recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\\n\"));\n\t\t\t\t}\n\t\t\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n\t\t\tif(pattrib->physt && pphy_status)\n\t\t\t\trx_query_phy_status(precvframe, pphy_status);\n\n\t\t\tif(rtw_recv_entry(precvframe) != _SUCCESS)\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_recv_c_,_drv_err_,\n\t\t\t\t\t(\"recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\\n\"));\n\t\t\t}\n\n\t\t}\n\t\telse{ // pkt_rpt_type == TX_REPORT1-CCX, TX_REPORT2-TX RTP,HIS_REPORT-USB HISR RTP\n\t\t\tif (pattrib->pkt_rpt_type == C2H_PACKET) {\n\t\t\t\t//DBG_8192C(\"rx C2H_PACKET \\n\");\n\t\t\t\tC2HPacketHandler_8814(padapter,precvframe->u.hdr.rx_data,pattrib->pkt_len);\n\t\t\t}\n\t\t\trtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t}\n\n#ifdef CONFIG_USB_RX_AGGREGATION\n\t\t// jaguar 8-byte alignment\n\t\tpkt_offset = (u16)_RND8(pkt_offset);\n\t\tpkt_cnt--;\n\t\tpbuf += pkt_offset;\n#endif\n\t\ttransfer_len -= pkt_offset;\n\t\tprecvframe = NULL;\n\n\t}while(transfer_len>0);\n\n_exit_recvbuf2recvframe:\n\n\treturn _SUCCESS;\t\n}\n\n\nvoid rtl8814au_xmit_tasklet(void *priv)\n{\t\n\tint ret = _FALSE;\n\t_adapter *padapter = (_adapter*)priv;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\twhile(1)\n\t{\n\t\tif (RTW_CANNOT_TX(padapter))\n\t\t{\n\t\t\tDBG_8192C(\"xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\\n\");\n\t\t\tbreak;\n\t\t}\n\n\t\tif (rtw_xmit_ac_blocked(padapter) == _TRUE)\n\t\t\tbreak;\n\n\t\tret = rtl8814au_xmitframe_complete(padapter, pxmitpriv, NULL);\n\n\t\tif(ret==_FALSE)\n\t\t\tbreak;\n\t\t\n\t}\n\t\n}\n\nvoid rtl8814au_set_intf_ops(struct _io_ops\t*pops)\n{\t\t\n\t_func_enter_;\t\t\n\n\t_rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops));\t\n\n\tpops->_read8 = &usb_read8;\n\tpops->_read16 = &usb_read16;\n\tpops->_read32 = &usb_read32;\n\tpops->_read_mem = &usb_read_mem;\n\tpops->_read_port = &usb_read_port;\t\n\t\n\tpops->_write8 = &usb_write8;\n\tpops->_write16 = &usb_write16;\n\tpops->_write32 = &usb_write32;\n\tpops->_writeN = &usb_writeN;\n\t\n#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ\t\n\tpops->_write8_async= &usb_async_write8;\n\tpops->_write16_async = &usb_async_write16;\n\tpops->_write32_async = &usb_async_write32;\n#endif\t\n\tpops->_write_mem = &usb_write_mem;\n\tpops->_write_port = &usb_write_port;\n\n\tpops->_read_port_cancel = &usb_read_port_cancel;\n\tpops->_write_port_cancel = &usb_write_port_cancel;\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n\tpops->_read_interrupt = &usb_read_interrupt;\n#endif\n\n\t_func_exit_;\n\n}\n\nvoid rtl8814au_set_hw_type(struct dvobj_priv *pdvobj)\n{\n\tpdvobj->HardwareType = HARDWARE_TYPE_RTL8814AU;\n\tDBG_871X(\"CHIP TYPE: RTL8814\\n\");\n}\n\n"
  },
  {
    "path": "ifcfg-wlan0",
    "content": "#DHCP client\nDEVICE=wlan0\nBOOTPROTO=dhcp\nONBOOT=yes"
  },
  {
    "path": "include/Hal8188EPhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8188EPHYCFG_H__\n#define __INC_HAL8188EPHYCFG_H__\n\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n/*------------------------------Define structure----------------------------*/ \n\n#define\tMAX_TX_COUNT_8188E\t\t\t1\n\n/* BB/RF related */\n\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/*------------------------Export global variable----------------------------*/\n/*------------------------Export global variable----------------------------*/\n\n\n/*------------------------Export Marco Definition---------------------------*/\n/*------------------------Export Marco Definition---------------------------*/\n\n\n/*--------------------------Exported Function prototype---------------------*/\n//\n// BB and RF register read/write\n//\nu32\tPHY_QueryBBReg8188E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\tBitMask\t);\nvoid\tPHY_SetBBReg8188E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\tData\t);\nu32\tPHY_QueryRFReg8188E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tBitMask\t);\nvoid\tPHY_SetRFReg8188E(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tData\t);\n\n//\n// Initialization related function\n//\n/* MAC/BB/RF HAL config */\nint\tPHY_MACConfig8188E(IN\tPADAPTER\tAdapter\t);\nint\tPHY_BBConfig8188E(IN\tPADAPTER\tAdapter\t);\nint\tPHY_RFConfig8188E(IN\tPADAPTER\tAdapter\t);\n\n/* RF config */\nint\trtl8188e_PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN u8 * pFileName, u8 eRFPath);\n\n//\n// RF Power setting\n//\n//extern\tBOOLEAN\tPHY_SetRFPowerState(IN\tPADAPTER\t\t\tAdapter, \n//\t\t\t\t\t\t\t\t\tIN\tRT_RF_POWER_STATE\teRFPowerState);\n\n//\n// BB TX Power R/W\n//\nvoid\tPHY_GetTxPowerLevel8188E(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\t\t\t\tOUT s32*    \t\tpowerlevel\t);\nvoid\tPHY_SetTxPowerLevel8188E(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\t\t\t\tIN\tu8\t\t\tchannel\t);\nBOOLEAN\tPHY_UpdateTxPowerDbm8188E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\t\t\t\tIN\tint\t\tpowerInDbm\t);\n\nVOID\nPHY_SetTxPowerIndex_8188E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\t\tRate\n\t);\n\nu8\nPHY_GetTxPowerIndex_8188E(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel\n\t);\n\n//\n// Switch bandwidth for 8192S\n//\n//extern\tvoid\tPHY_SetBWModeCallback8192C(\tIN\tPRT_TIMER\t\tpTimer\t);\nvoid\tPHY_SetBWMode8188E(\tIN\tPADAPTER\t\t\tpAdapter,\n\t\t\t\t\t\t\t\t\tIN\tCHANNEL_WIDTH\tChnlWidth,\n\t\t\t\t\t\t\t\t\tIN\tunsigned char\tOffset\t);\n\n//\n// Set FW CMD IO for 8192S.\n//\n//extern\tBOOLEAN HalSetIO8192C(\tIN\tPADAPTER\t\t\tAdapter,\n//\t\t\t\t\t\t\t\t\tIN\tIO_TYPE\t\t\t\tIOType);\n\n//\n// Set A2 entry to fw for 8192S\n//\nextern\tvoid FillA2Entry8192C(\t\tIN\tPADAPTER\t\t\tAdapter,\n\t\t\t\t\t\t\t\t\t\tIN\tu8\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\tIN\tu8*\t\t\t\tval);\n\n\n//\n// channel switch related funciton\n//\n//extern\tvoid\tPHY_SwChnlCallback8192C(\tIN\tPRT_TIMER\t\tpTimer\t);\nvoid\tPHY_SwChnl8188E(\tIN\tPADAPTER\t\tpAdapter,\n\t\t\t\t\t\t\t\t\tIN\tu8\t\t\tchannel\t);\n\nVOID\nPHY_SetSwChnlBWMode8188E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\n//\n// BB/MAC/RF other monitor API\n//\nvoid\tPHY_SetMonitorMode8192C(IN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\t\t\t\tIN\tBOOLEAN\t\tbEnableMonitorMode\t);\n\nBOOLEAN\tPHY_CheckIsLegalRfPath8192C(IN\tPADAPTER\tpAdapter,\n\t\t\t\t\t\t\t\t\t\t\tIN\tu32\t\teRFPath\t);\n\nVOID PHY_SetRFPathSwitch_8188E(IN\tPADAPTER\tpAdapter, IN\tBOOLEAN\t\tbMain);\n\nextern\tVOID\nPHY_SwitchEphyParameter(\n\tIN\tPADAPTER\t\t\tAdapter\n\t);\n\nextern\tVOID\nPHY_EnableHostClkReq(\n\tIN\tPADAPTER\t\t\tAdapter\n\t);\n\nBOOLEAN\nSetAntennaConfig92C(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tDefaultAnt\t\n\t);\n\nVOID\nstorePwrIndexDiffRateOffset(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t);\n/*--------------------------Exported Function prototype---------------------*/\n\n//\n// Initialization related function\n//\n/* MAC/BB/RF HAL config */\n//extern s32 PHY_MACConfig8723(PADAPTER padapter);\n//s32 PHY_BBConfig8723(PADAPTER padapter);\n//s32 PHY_RFConfig8723(PADAPTER padapter);\n\n\n\n//==================================================================\n// Note: If SIC_ENABLE under PCIE, because of the slow operation\n//\tyou should \n//\t2) \"#define RTL8723_FPGA_VERIFICATION\t1\"\t\t\t\tin Precomp.h.WlanE.Windows\n//\t3) \"#define RTL8190_Download_Firmware_From_Header\t0\"\tin Precomp.h.WlanE.Windows if needed.\n//\n#if (RTL8188E_SUPPORT == 1) && (RTL8188E_FPGA_TRUE_PHY_VERIFICATION == 1)\n#define\tSIC_ENABLE\t\t\t\t1\n#define\tSIC_HW_SUPPORT\t\t1\n#else\n#define\tSIC_ENABLE\t\t\t\t0\n#define\tSIC_HW_SUPPORT\t\t0\n#endif\n//==================================================================\n\n\n#define\tSIC_MAX_POLL_CNT\t\t5\n\n#if(SIC_HW_SUPPORT == 1)\n#define\tSIC_CMD_READY\t\t\t0\n#define\tSIC_CMD_PREWRITE\t\t0x1\n#if(RTL8188E_SUPPORT == 1)\n#define\tSIC_CMD_WRITE\t\t\t0x40\n#define\tSIC_CMD_PREREAD\t\t0x2\n#define\tSIC_CMD_READ\t\t\t0x80\n#define\tSIC_CMD_INIT\t\t\t0xf0\n#define\tSIC_INIT_VAL\t\t\t0xff\n\n#define\tSIC_INIT_REG\t\t\t0x1b7\n#define\tSIC_CMD_REG\t\t\t0x1EB\t\t// 1byte\n#define\tSIC_ADDR_REG\t\t\t0x1E8\t\t// 1b4~1b5, 2 bytes\n#define\tSIC_DATA_REG\t\t\t0x1EC\t\t// 1b0~1b3\n#else\n#define\tSIC_CMD_WRITE\t\t\t0x11\n#define\tSIC_CMD_PREREAD\t\t0x2\n#define\tSIC_CMD_READ\t\t\t0x12\n#define\tSIC_CMD_INIT\t\t\t0x1f\n#define\tSIC_INIT_VAL\t\t\t0xff\n\n#define\tSIC_INIT_REG\t\t\t0x1b7\n#define\tSIC_CMD_REG\t\t\t0x1b6\t\t// 1byte\n#define\tSIC_ADDR_REG\t\t\t0x1b4\t\t// 1b4~1b5, 2 bytes\n#define\tSIC_DATA_REG\t\t\t0x1b0\t\t// 1b0~1b3\n#endif\n#else\n#define\tSIC_CMD_READY\t\t\t0\n#define\tSIC_CMD_WRITE\t\t\t1\n#define\tSIC_CMD_READ\t\t\t2\n\n#if(RTL8188E_SUPPORT == 1)\n#define\tSIC_CMD_REG\t\t\t0x1EB\t\t// 1byte\n#define\tSIC_ADDR_REG\t\t\t0x1E8\t\t// 1b9~1ba, 2 bytes\n#define\tSIC_DATA_REG\t\t\t0x1EC\t\t// 1bc~1bf\n#else\n#define\tSIC_CMD_REG\t\t\t0x1b8\t\t// 1byte\n#define\tSIC_ADDR_REG\t\t\t0x1b9\t\t// 1b9~1ba, 2 bytes\n#define\tSIC_DATA_REG\t\t\t0x1bc\t\t// 1bc~1bf\n#endif\n#endif\n\n#if(SIC_ENABLE == 1)\nVOID SIC_Init(IN PADAPTER Adapter);\n#endif\n\n\n#endif\t// __INC_HAL8192CPHYCFG_H\n\n"
  },
  {
    "path": "include/Hal8188EPhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8188EPHYREG_H__\n#define __INC_HAL8188EPHYREG_H__\n/*--------------------------Define Parameters-------------------------------*/\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t0x18c\n\n//\n// 2. Page2(0x200)\n//\n// The following two definition are only used for USB interface.\n#define\t\tRF_BB_CMD_ADDR\t\t\t\t0x02c0\t// RF/BB read/write command address.\n#define\t\tRF_BB_CMD_DATA\t\t\t\t0x02c4\t// RF/BB read/write command data.\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t\t0x814\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define\t\trFPGA0_RFWakeUpParameter\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\n#define\t\trFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\tTransceiverA_HSPI_Readback\t\t0x8b8\t// Transceiver A HSPI Readback\n#define\t\tTransceiverB_HSPI_Readback\t\t0x8bc\t// Transceiver B HSPI Readback\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\t\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n\n#define\t\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\t\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\t\trFPGA1_TxInfo\t\t\t\t\t0x90c\t// Useless now // Status report??\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t\t0xa50\n#define\t\trCCK0_RxReport            \t\t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t\t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t\t0xa58  //0xa5c\n\n//\n// PageB(0xB00)\n//\n#define\t\trPdp_AntA      \t\t\t\t\t0xb00  \n#define\t\trPdp_AntA_4    \t\t\t\t0xb04\n#define\t\trConfig_Pmpd_AntA \t\t\t0xb28\n#define\t\trConfig_ram64x16\t\t\t\t0xb2c\n#define\t\trConfig_AntA \t\t\t\t\t0xb68\n#define\t\trConfig_AntB \t\t\t\t\t0xb6c\n#define\t\trPdp_AntB \t\t\t\t\t0xb70\n#define\t\trPdp_AntB_4 \t\t\t\t\t0xb74\n#define\t\trConfig_Pmpd_AntB\t\t\t0xb98\n#define\t\trAPK\t\t\t\t\t\t\t0xbd8\n\n\n\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t\t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t\t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t\t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t\t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define\t\trOFDM0_RxHPParameter\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t0xcf4\n\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t0xd3c\n#define\t\trOFDM1_csi_fix_mask1\t\t\t\t0xd40\n#define\t\trOFDM1_csi_fix_mask2\t\t\t\t0xd44\n#define\t\trOFDM1_PseudoNoiseStateAB\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_A_Rate18_06\t\t\t0xe00\n#define\t\trTxAGC_A_Rate54_24\t\t\t0xe04\n#define\t\trTxAGC_A_CCK1_Mcs32\t\t\t0xe08\n#define\t\trTxAGC_A_Mcs03_Mcs00\t\t0xe10\n#define\t\trTxAGC_A_Mcs07_Mcs04\t\t0xe14\n#define\t\trTxAGC_A_Mcs11_Mcs08\t\t0xe18\n#define\t\trTxAGC_A_Mcs15_Mcs12\t\t0xe1c\n\n#define\t\trTxAGC_B_Rate18_06\t\t\t0x830\n#define\t\trTxAGC_B_Rate54_24\t\t\t0x834\n#define\t\trTxAGC_B_CCK1_55_Mcs32\t\t0x838\n#define\t\trTxAGC_B_Mcs03_Mcs00\t\t0x83c\n#define\t\trTxAGC_B_Mcs07_Mcs04\t\t0x848\n#define\t\trTxAGC_B_Mcs11_Mcs08\t\t0x84c\n#define\t\trTxAGC_B_Mcs15_Mcs12\t\t0x868\n#define\t\trTxAGC_B_CCK11_A_CCK2_11\t\t0x86c\n\n#define\t\trFPGA0_IQK\t\t\t\t\t0xe28\n#define\t\trTx_IQK_Tone_A\t\t\t\t0xe30\n#define\t\trRx_IQK_Tone_A\t\t\t\t0xe34\n#define\t\trTx_IQK_PI_A\t\t\t\t\t0xe38\n#define\t\trRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n#define\t\trTx_IQK \t\t\t\t\t\t0xe40\n#define\t\trRx_IQK\t\t\t\t\t\t0xe44\n#define\t\trIQK_AGC_Pts\t\t\t\t\t0xe48\n#define\t\trIQK_AGC_Rsp\t\t\t\t\t0xe4c\n#define\t\trTx_IQK_Tone_B\t\t\t\t0xe50\n#define\t\trRx_IQK_Tone_B\t\t\t\t0xe54\n#define\t\trTx_IQK_PI_B\t\t\t\t\t0xe58\n#define\t\trRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define\t\trIQK_AGC_Cont\t\t\t\t0xe60\n\n#define\t\trBlue_Tooth\t\t\t\t\t0xe6c\n#define\t\trRx_Wait_CCA\t\t\t\t\t0xe70\n#define\t\trTx_CCK_RFON\t\t\t\t\t0xe74\n#define\t\trTx_CCK_BBON\t\t\t\t0xe78\n#define\t\trTx_OFDM_RFON\t\t\t\t0xe7c\n#define\t\trTx_OFDM_BBON\t\t\t\t0xe80\n#define\t\trTx_To_Rx\t\t\t\t\t0xe84\n#define\t\trTx_To_Tx\t\t\t\t\t0xe88\n#define\t\trRx_CCK\t\t\t\t\t\t0xe8c\n\n#define\t\trTx_Power_Before_IQK_A\t\t0xe94\n#define\t\trTx_Power_After_IQK_A\t\t\t0xe9c\n\n#define\t\trRx_Power_Before_IQK_A\t\t0xea0\n#define\t\trRx_Power_Before_IQK_A_2\t\t0xea4\n#define\t\trRx_Power_After_IQK_A\t\t\t0xea8\n#define\t\trRx_Power_After_IQK_A_2\t\t0xeac\n\n#define\t\trTx_Power_Before_IQK_B\t\t0xeb4\n#define\t\trTx_Power_After_IQK_B\t\t\t0xebc\n\n#define\t\trRx_Power_Before_IQK_B\t\t0xec0\n#define\t\trRx_Power_Before_IQK_B_2\t\t0xec4\n#define\t\trRx_Power_After_IQK_B\t\t\t0xec8\n#define\t\trRx_Power_After_IQK_B_2\t\t0xecc\n\n#define\t\trRx_OFDM\t\t\t\t\t0xed0\n#define\t\trRx_Wait_RIFS \t\t\t\t0xed4\n#define\t\trRx_TO_Rx \t\t\t\t\t0xed8\n#define\t\trStandby \t\t\t\t\t\t0xedc\n#define\t\trSleep \t\t\t\t\t\t0xee0\n#define\t\trPMPD_ANAEN\t\t\t\t0xeec\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t\t0x02\t// \n\n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t\t0x08\t// \n#define\t\tRF_IPA_G\t\t\t\t\t\t0x09\t// \n#define\t\tRF_TXBIAS_G\t\t\t\t\t0x0A\n#define\t\tRF_TXPA_AG\t\t\t\t\t0x0B\n#define\t\tRF_IPA_A\t\t\t\t\t\t0x0C\t// \n#define\t\tRF_TXBIAS_A\t\t\t\t\t0x0D\n#define\t\tRF_BS_PA_APSET_G9_G11\t\t0x0E\n#define\t\tRF_BS_IQGEN\t\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16\n#define\t\tRF_POW_ABILITY\t\t\t\t0x17\t// \n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER_88E\t\t\t\t\t0x42\t// \n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define\t\tRF_TX_BIAS_A\t\t\t\t\t0x35\n#define\t\tRF_TX_BIAS_D\t\t\t\t\t0x36\n#define\t\tRF_LOBF_9\t\t\t\t\t0x38\n#define\t\tRF_RXRF_A3\t\t\t\t\t0x3C\t//\t\n#define\t\tRF_TRSW\t\t\t\t\t\t0x3F\n\n#define\t\tRF_TXRF_A2\t\t\t\t\t0x41\n#define\t\tRF_TXPA_G4\t\t\t\t\t0x46\t\n#define\t\tRF_TXPA_A4\t\t\t\t\t0x4B\t\n#define \tRF_0x52 \t\t\t\t\t0x52\n#define\t\tRF_WE_LUT\t\t\t\t\t0xEF\t\n\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t\t0x3f\n\n#define\t\tbAntennaSelect                 \t\t\t0x0300\n\n#define\t\tbXBTxAGC                  \t\t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t\t0xf80000\n#define\t\tbContTxHSSI               \t\t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t\t0x200\n#define\t\tbAGCAddress               \t\t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t\t0xc0000\n#define\t\tbAGCTxCode                \t\t\t0xc00000\n#define\t\tbAGCRxCode                \t\t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t0x40000\n#define\t\tbAD7InputCMMode           \t0x380000\n#define\t\tbAD7Current               \t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t\t0x10\n#define\t\tbAntNonHT           \t      \t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode                \t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving         \t\t0x80\n#define\t\tbCCKRxPowerSaving         \t\t0x40\n\n#define\t\tbCCKSideBand              \t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble              \t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity    \t\t      \t0x8000\n#define\t\tbCCKCarrierRecovery   \t    \t0x4000\n#define\t\tbCCKTxRate           \t\t     \t0x3000\n#define\t\tbCCKDCCancel             \t \t0x0800\n#define\t\tbCCKISICancel             \t\t0x0400\n#define\t\tbCCKMatchFilter           \t\t0x0200\n#define\t\tbCCKEqualizer             \t\t0x0100\n#define\t\tbCCKPreambleDetect       \t \t0x800000\n#define\t\tbCCKFastFalseCCA          \t\t0x400000\n#define\t\tbCCKChEstStart            \t\t0x300000\n#define\t\tbCCKCCACount              \t\t0x080000\n#define\t\tbCCKcs_lim                \t\t\t0x070000\n#define\t\tbCCKBistMode              \t\t0x80000000\n#define\t\tbCCKCCAMask             \t  \t0x40000000\n#define\t\tbCCKTxDACPhase         \t   \t0x4\n#define\t\tbCCKRxADCPhase         \t   \t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0         \t   \t0x0100\n#define\t\tbCCKTxDCOffset           \t \t0xf0\n#define\t\tbCCKRxDCOffset           \t \t0xf\n#define\t\tbCCKCCAMode              \t \t0xc000\n#define\t\tbCCKFalseCS_lim           \t\t0x3f00\n#define\t\tbCCKCS_ratio              \t\t0xc00000\n#define\t\tbCCKCorgBit_sel           \t\t0x300000\n#define\t\tbCCKPD_lim                \t\t0x0f0000\n#define\t\tbCCKNewCCA                \t\t0x80000000\n#define\t\tbCCKRxHPofIG              \t\t0x8000\n#define\t\tbCCKRxIG                  \t\t\t0x7f00\n#define\t\tbCCKLNAPolarity           \t\t0x800000\n#define\t\tbCCKRx1stGain             \t\t0x7f0000\n#define\t\tbCCKRFExtend              \t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel        \t \t0x1f000000\n#define\t\tbCCKRxAGCSatCount       \t  \t0xe0\n#define\t\tbCCKRxRFSettle            \t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC           \t \t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity      \t \t0x2000\n#define\t\tbCCKTxFilterType          \t\t0x0c00\n#define\t\tbCCKRxAGCReportType   \t   \t0x0300\n#define\t\tbCCKRxDAGCEn              \t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod        \t  \t0x20000000\n#define\t\tbCCKRxDAGCSatLevel     \t   \t0x1f000000\n#define\t\tbCCKTimingRecovery       \t \t0x800000\n#define\t\tbCCKTxC0                  \t\t\t0x3f0000\n#define\t\tbCCKTxC1                  \t\t\t0x3f000000\n#define\t\tbCCKTxC2                  \t\t\t0x3f\n#define\t\tbCCKTxC3                  \t\t\t0x3f00\n#define\t\tbCCKTxC4                  \t\t\t0x3f0000\n#define\t\tbCCKTxC5                  \t\t\t0x3f000000\n#define\t\tbCCKTxC6                  \t\t\t0x3f\n#define\t\tbCCKTxC7                  \t\t\t0x3f00\n#define\t\tbCCKDebugPort             \t\t0xff0000\n#define\t\tbCCKDACDebug              \t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable      \t0x8000\n#define\t\tbCCKFalseAlarmRead        \t0x4000\n#define\t\tbCCKTRSSI                 \t\t\t0x7f\n#define\t\tbCCKRxAGCReport           \t\t0xfe\n#define\t\tbCCKRxReport_AntSel       \t0x80000000\n#define\t\tbCCKRxReport_MFOff        \t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss     \t0x20000000\n#define\t\tbCCKRxReport_Pktloss      \t0x10000000\n#define\t\tbCCKRxReport_Lockedbit    \t0x08000000\n#define\t\tbCCKRxReport_RateError    \t0x04000000\n#define\t\tbCCKRxReport_RxRate       \t0x03000000\n#define\t\tbCCKRxFACounterLower      \t0xff\n#define\t\tbCCKRxFACounterUpper      \t0xff000000\n#define\t\tbCCKRxHPAGCStart          \t\t0xe000\n#define\t\tbCCKRxHPAGCFinal          \t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable    \t0x8000\n#define\t\tbCCKFACounterFreeze       \t0x4000       \t\t\n#define\t\tbCCKTxPathSel             \t\t0x10000000\n#define\t\tbCCKDefaultRxPath         \t\t0xc000000\n#define\t\tbCCKOptionRxPath          \t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF                \t\t\t0x3\t// Useless\n#define\t\tbShift_L                 \t\t\t0xc0\n#define\t\tbGI_TH                   \t\t\t0xc\n#define\t\tbRxPathA                 \t\t\t0x1\n#define\t\tbRxPathB                 \t\t\t0x2\n#define\t\tbRxPathC                 \t\t\t0x4\n#define\t\tbRxPathD                 \t\t\t0x8\n#define\t\tbTxPathA                 \t\t\t0x1\n#define\t\tbTxPathB                 \t\t\t0x2\n#define\t\tbTxPathC                 \t\t\t0x4\n#define\t\tbTxPathD                 \t\t\t0x8\n#define\t\tbTRSSIFreq               \t\t\t0x200\n#define\t\tbADCBackoff              \t\t\t0x3000\n#define\t\tbDFIRBackoff             \t\t\t0xc000\n#define\t\tbTRSSILatchPhase         \t\t0x10000\n#define\t\tbRxIDCOffset             \t\t\t0xff\n#define\t\tbRxQDCOffset             \t\t0xff00\n#define\t\tbRxDFIRMode              \t\t0x1800000\n#define\t\tbRxDCNFType              \t\t0xe000000\n#define\t\tbRXIQImb_A               \t\t0x3ff\n#define\t\tbRXIQImb_B               \t\t\t0xfc00\n#define\t\tbRXIQImb_C               \t\t\t0x3f0000\n#define\t\tbRXIQImb_D               \t\t0xffc00000\n#define\t\tbDC_dc_Notch             \t\t0x60000\n#define\t\tbRxNBINotch              \t\t0x1f000000\n#define\t\tbPD_TH                   \t\t\t0xf\n#define\t\tbPD_TH_Opt2              \t\t0xc000\n#define\t\tbPWED_TH                 \t\t\t0x700\n#define\t\tbIfMF_Win_L              \t\t0x800\n#define\t\tbPD_Option               \t\t\t0x1000\n#define\t\tbMF_Win_L                \t\t\t0xe000\n#define\t\tbBW_Search_L             \t\t0x30000\n#define\t\tbwin_enh_L               \t\t\t0xc0000\n#define\t\tbBW_TH                   \t\t\t0x700000\n#define\t\tbED_TH2                  \t\t\t0x3800000\n#define\t\tbBW_option               \t\t\t0x4000000\n#define\t\tbRatio_TH                \t\t\t0x18000000\n#define\t\tbWindow_L                \t\t\t0xe0000000\n#define\t\tbSBD_Option              \t\t0x1\n#define\t\tbFrame_TH                \t\t\t0x1c\n#define\t\tbFS_Option               \t\t\t0x60\n#define\t\tbDC_Slope_check          \t\t0x80\n#define\t\tbFGuard_Counter_DC_L     \t0xe00\n#define\t\tbFrame_Weight_Short      \t0x7000\n#define\t\tbSub_Tune                \t\t\t0xe00000\n#define\t\tbFrame_DC_Length         \t\t0xe000000\n#define\t\tbSBD_start_offset        \t\t0x30000000\n#define\t\tbFrame_TH_2              \t\t0x7\n#define\t\tbFrame_GI2_TH            \t\t0x38\n#define\t\tbGI2_Sync_en             \t\t0x40\n#define\t\tbSarch_Short_Early       \t\t0x300\n#define\t\tbSarch_Short_Late        \t\t0xc00\n#define\t\tbSarch_GI2_Late          \t\t0x70000\n#define\t\tbCFOAntSum               \t\t0x1\n#define\t\tbCFOAcc                  \t\t\t0x2\n#define\t\tbCFOStartOffset          \t\t0xc\n#define\t\tbCFOLookBack             \t\t0x70\n#define\t\tbCFOSumWeight            \t\t0x80\n#define\t\tbDAGCEnable              \t\t0x10000\n#define\t\tbTXIQImb_A               \t\t\t0x3ff\n#define\t\tbTXIQImb_B               \t\t\t0xfc00\n#define\t\tbTXIQImb_C               \t\t\t0x3f0000\n#define\t\tbTXIQImb_D               \t\t\t0xffc00000\n#define\t\tbTxIDCOffset             \t\t\t0xff\n#define\t\tbTxQDCOffset             \t\t0xff00\n#define\t\tbTxDFIRMode              \t\t0x10000\n#define\t\tbTxPesudoNoiseOn         \t\t0x4000000\n#define\t\tbTxPesudoNoise_A         \t\t0xff\n#define\t\tbTxPesudoNoise_B         \t\t0xff00\n#define\t\tbTxPesudoNoise_C         \t\t0xff0000\n#define\t\tbTxPesudoNoise_D         \t\t0xff000000\n#define\t\tbCCADropOption           \t\t0x20000\n#define\t\tbCCADropThres            \t\t0xfff00000\n#define\t\tbEDCCA_H                 \t\t\t0xf\n#define\t\tbEDCCA_L                 \t\t\t0xf0\n#define\t\tbLambda_ED               \t\t0x300\n#define\t\tbRxInitialGain           \t\t\t0x7f\n#define\t\tbRxAntDivEn              \t\t0x80\n#define\t\tbRxAGCAddressForLNA      \t0x7f00\n#define\t\tbRxHighPowerFlow         \t\t0x8000\n#define\t\tbRxAGCFreezeThres        \t\t0xc0000\n#define\t\tbRxFreezeStep_AGC1       \t0x300000\n#define\t\tbRxFreezeStep_AGC2       \t0xc00000\n#define\t\tbRxFreezeStep_AGC3       \t0x3000000\n#define\t\tbRxFreezeStep_AGC0       \t0xc000000\n#define\t\tbRxRssi_Cmp_En           \t\t0x10000000\n#define\t\tbRxQuickAGCEn            \t\t0x20000000\n#define\t\tbRxAGCFreezeThresMode    \t0x40000000\n#define\t\tbRxOverFlowCheckType     \t0x80000000\n#define\t\tbRxAGCShift              \t\t\t0x7f\n#define\t\tbTRSW_Tri_Only           \t\t0x80\n#define\t\tbPowerThres              \t\t0x300\n#define\t\tbRxAGCEn                 \t\t\t0x1\n#define\t\tbRxAGCTogetherEn         \t\t0x2\n#define\t\tbRxAGCMin                \t\t0x4\n#define\t\tbRxHP_Ini                \t\t\t0x7\n#define\t\tbRxHP_TRLNA              \t\t0x70\n#define\t\tbRxHP_RSSI               \t\t\t0x700\n#define\t\tbRxHP_BBP1               \t\t0x7000\n#define\t\tbRxHP_BBP2               \t\t0x70000\n#define\t\tbRxHP_BBP3               \t\t0x700000\n#define\t\tbRSSI_H                  \t\t\t0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen                \t\t\t0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW           \t\t0x7\n#define\t\tbRxSettle_LNA            \t\t0x38\n#define\t\tbRxSettle_RSSI           \t\t0x1c0\n#define\t\tbRxSettle_BBP            \t\t0xe00\n#define\t\tbRxSettle_RxHP           \t\t0x7000\n#define\t\tbRxSettle_AntSW_RSSI     \t0x38000\n#define\t\tbRxSettle_AntSW          \t\t0xc0000\n#define\t\tbRxProcessTime_DAGC      \t0x300000\n#define\t\tbRxSettle_HSSI           \t\t0x400000\n#define\t\tbRxProcessTime_BBPPW     \t0x800000\n#define\t\tbRxAntennaPowerShift     \t0x3000000\n#define\t\tbRSSITableSelect         \t\t0xc000000\n#define\t\tbRxHP_Final              \t\t\t0x7000000\n#define\t\tbRxHTSettle_BBP          \t\t0x7\n#define\t\tbRxHTSettle_HSSI         \t\t0x8\n#define\t\tbRxHTSettle_RxHP         \t\t0x70\n#define\t\tbRxHTSettle_BBPPW        \t\t0x80\n#define\t\tbRxHTSettle_Idle         \t\t0x300\n#define\t\tbRxHTSettle_Reserved     \t0x1c00\n#define\t\tbRxHTRxHPEn              \t\t0x8000\n#define\t\tbRxHTAGCFreezeThres      \t0x30000\n#define\t\tbRxHTAGCTogetherEn       \t0x40000\n#define\t\tbRxHTAGCMin             \t \t0x80000\n#define\t\tbRxHTAGCEn               \t\t0x100000\n#define\t\tbRxHTDAGCEn              \t\t0x200000\n#define\t\tbRxHTRxHP_BBP            \t\t0x1c00000\n#define\t\tbRxHTRxHP_Final          \t\t0xe0000000\n#define\t\tbRxPWRatioTH             \t\t0x3\n#define\t\tbRxPWRatioEn             \t\t0x4\n#define\t\tbRxMFHold                \t\t\t0x3800\n#define\t\tbRxPD_Delay_TH1          \t\t0x38\n#define\t\tbRxPD_Delay_TH2          \t\t0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX       \t0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH           \t\t0x8000\n#define\t\tbRxProcess_Delay         \t\t0xf0000\n#define\t\tbRxSearchrange_GI2_Early \t0x700000\n#define\t\tbRxFrame_Guard_Counter_L \t0x3800000\n#define\t\tbRxSGI_Guard_L           \t\t0xc000000\n#define\t\tbRxSGI_Search_L          \t\t0x30000000\n#define\t\tbRxSGI_TH                \t\t\t0xc0000000\n#define\t\tbDFSCnt0                 \t\t\t0xff\n#define\t\tbDFSCnt1                 \t\t\t0xff00\n#define\t\tbDFSFlag                 \t\t\t0xf0000       \t\t\n#define\t\tbMFWeightSum             \t\t0x300000\n#define\t\tbMinIdxTH                \t\t\t0x7f000000       \t\t\n#define\t\tbDAFormat                \t\t\t0x40000       \t\t\n#define\t\tbTxChEmuEnable           \t\t0x01000000       \t\t\n#define\t\tbTRSWIsolation_A         \t\t0x7f\n#define\t\tbTRSWIsolation_B         \t\t0x7f00\n#define\t\tbTRSWIsolation_C         \t\t0x7f0000\n#define\t\tbTRSWIsolation_D         \t\t0x7f000000       \t\t\n#define\t\tbExtLNAGain              \t\t0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn                  \t\t\t0x4\t// Useless\n#define\t\tbAntennaMapping          \t\t0x10\n#define\t\tbNss                     \t\t\t0x20\n#define\t\tbCFOAntSumD              \t\t0x200\n#define\t\tbPHYCounterReset         \t\t0x8000000\n#define\t\tbCFOReportGet            \t\t0x4000000\n#define\t\tbOFDMContinueTx          \t\t0x10000000\n#define\t\tbOFDMSingleCarrier       \t\t0x20000000\n#define\t\tbOFDMSingleTone          \t\t0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect                \t\t\t0x100\n#define\t\tbCFOEn                   \t\t\t0x10000\n#define\t\tbCFOValue                \t\t\t0xfff00000\n#define\t\tbSigTone_Re              \t\t\t0x3f\n#define\t\tbSigTone_Im              \t\t\t0x7f00\n#define\t\tbCounter_CCA             \t\t0xffff\n#define\t\tbCounter_ParityFail      \t\t0xffff0000\n#define\t\tbCounter_RateIllegal     \t\t0xffff\n#define\t\tbCounter_CRC8Fail        \t\t0xffff0000\n#define\t\tbCounter_MCSNoSupport    \t0xffff\n#define\t\tbCounter_FastSync        \t\t0xffff\n#define\t\tbShortCFO                \t\t\t0xfff\n#define\t\tbShortCFOTLength         \t\t12   //total\n#define\t\tbShortCFOFLength         \t\t11   //fraction\n#define\t\tbLongCFO                 \t\t\t0x7ff\n#define\t\tbLongCFOTLength          \t\t11\n#define\t\tbLongCFOFLength          \t\t11\n#define\t\tbTailCFO                 \t\t\t0x1fff\n#define\t\tbTailCFOTLength          \t\t13\n#define\t\tbTailCFOFLength          \t\t12       \t\t\n#define\t\tbmax_en_pwdB             \t\t0xffff\n#define\t\tbCC_power_dB             \t\t0xffff0000\n#define\t\tbnoise_pwdB              \t\t0xffff\n#define\t\tbPowerMeasTLength        \t10\n#define\t\tbPowerMeasFLength        \t3\n#define\t\tbRx_HT_BW                \t\t0x1\n#define\t\tbRxSC                    \t\t\t0x6\n#define\t\tbRx_HT                   \t\t\t0x8       \t\t\n#define\t\tbNB_intf_det_on          \t\t0x1\n#define\t\tbIntf_win_len_cfg        \t\t0x30\n#define\t\tbNB_Intf_TH_cfg          \t\t0x1c0       \t\t\n#define\t\tbRFGain                  \t\t\t0x3f\n#define\t\tbTableSel                \t\t\t0x40\n#define\t\tbTRSW                    \t\t\t0x80       \t\t\n#define\t\tbRxSNR_A                 \t\t\t0xff\n#define\t\tbRxSNR_B                 \t\t\t0xff00\n#define\t\tbRxSNR_C                 \t\t\t0xff0000\n#define\t\tbRxSNR_D                 \t\t\t0xff000000\n#define\t\tbSNREVMTLength           \t\t8\n#define\t\tbSNREVMFLength           \t\t1       \t\t\n#define\t\tbCSI1st                  \t\t\t0xff\n#define\t\tbCSI2nd                  \t\t\t0xff00\n#define\t\tbRxEVM1st                \t\t\t0xff0000\n#define\t\tbRxEVM2nd                \t\t0xff000000       \t\t\n#define\t\tbSIGEVM                  \t\t\t0xff\n#define\t\tbPWDB                    \t\t\t0xff00\n#define\t\tbSGIEN                   \t\t\t0x10000\n       \t\t\n#define\t\tbSFactorQAM1             \t\t0xf\t// Useless\n#define\t\tbSFactorQAM2             \t\t0xf0\n#define\t\tbSFactorQAM3             \t\t0xf00\n#define\t\tbSFactorQAM4             \t\t0xf000\n#define\t\tbSFactorQAM5             \t\t0xf0000\n#define\t\tbSFactorQAM6             \t\t0xf0000\n#define\t\tbSFactorQAM7             \t\t0xf00000\n#define\t\tbSFactorQAM8             \t\t0xf000000\n#define\t\tbSFactorQAM9             \t\t0xf0000000\n#define\t\tbCSIScheme               \t\t\t0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet          \t\t0x3\t// Useless\n#define\t\tbChSmooth                \t\t\t0x4\n#define\t\tbChSmoothCfg1            \t\t0x38\n#define\t\tbChSmoothCfg2            \t\t0x1c0\n#define\t\tbChSmoothCfg3            \t\t0xe00\n#define\t\tbChSmoothCfg4            \t\t0x7000\n#define\t\tbMRCMode                 \t\t0x800000\n#define\t\tbTHEVMCfg                \t\t\t0x7000000\n       \t\t\n#define\t\tbLoopFitType             \t\t\t0x1\t// Useless\n#define\t\tbUpdCFO                  \t\t\t0x40\n#define\t\tbUpdCFOOffData           \t\t0x80\n#define\t\tbAdvUpdCFO               \t\t0x100\n#define\t\tbAdvTimeCtrl             \t\t0x800\n#define\t\tbUpdClko                 \t\t\t0x1000\n#define\t\tbFC                      \t\t\t\t0x6000\n#define\t\tbTrackingMode            \t\t0x8000\n#define\t\tbPhCmpEnable             \t\t0x10000\n#define\t\tbUpdClkoLTF              \t\t\t0x20000\n#define\t\tbComChCFO                \t\t0x40000\n#define\t\tbCSIEstiMode             \t\t0x80000\n#define\t\tbAdvUpdEqz               \t\t0x100000\n#define\t\tbUChCfg                  \t\t\t0x7000000\n#define\t\tbUpdEqz                  \t\t\t0x8000000\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn         \t\t0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A         \t\t0xff\n#define\t\tbRxPesudoNoise_B         \t\t0xff00\n#define\t\tbRxPesudoNoise_C         \t\t0xff0000\n#define\t\tbRxPesudoNoise_D         \t\t0xff000000\n#define\t\tbPesudoNoiseState_A      \t0xffff\n#define\t\tbPesudoNoiseState_B      \t0xffff0000\n#define\t\tbPesudoNoiseState_C      \t\t0xffff\n#define\t\tbPesudoNoiseState_D      \t0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable        \t\t0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl        \t\t0xc00\n#define\t\tbZebra1_TRxGainSetting    \t0x07f\n#define\t\tbZebra1_RxCorner          \t\t0xc00\n#define\t\tbZebra1_TxChargePump      \t0x38\n#define\t\tbZebra1_RxChargePump      \t0x7\n#define\t\tbZebra1_ChannelNum        \t0xf80\n#define\t\tbZebra1_TxLPFBW           \t\t0x400\n#define\t\tbZebra1_RxLPFBW           \t\t0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1      \t0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0      \t0x40\n#define\t\tbRTL8256_TxLPFBW          \t0x18\n#define\t\tbRTL8256_RxLPFBW          \t0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW          \t0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW          \t0xc00\n#define\t\tbRTL8258_RSSILPFBW        \t0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0                    \t\t\t0x1\t// Useless\n#define\t\tbByte1                    \t\t\t0x2\n#define\t\tbByte2                    \t\t\t0x4\n#define\t\tbByte3                    \t\t\t0x8\n#define\t\tbWord0                    \t\t\t0x3\n#define\t\tbWord1                    \t\t\t0xc\n#define\t\tbDWord                    \t\t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0                \t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1                \t\t0xff00\n#define\t\tbMaskByte2                \t\t0xff0000\n#define\t\tbMaskByte3                \t\t0xff000000\n#define\t\tbMaskHWord                \t\t0xffff0000\n#define\t\tbMaskLWord                \t\t0x0000ffff\n#define\t\tbMaskDWord                \t\t0xffffffff\n#define\t\tbMaskH3Bytes\t\t\t\t0xffffff00\n#define\t\tbMask12Bits\t\t\t\t0xfff\t\n#define\t\tbMaskH4Bits\t\t\t\t0xf0000000\t\n#define \t\tbMaskOFDM_D\t\t\t0xffc00000\n#define\t\tbMaskCCK\t\t\t\t0x3f3f3f3f\n\n\n  \t\t\n#define\t\tbEnable                   0x1\t// Useless\n#define\t\tbDisable                  0x0\n       \t\t\n#define\t\tLeftAntenna               \t\t\t0x0\t// Useless\n#define\t\tRightAntenna              \t\t0x1\n       \t\t\n#define\t\ttCheckTxStatus            \t\t500   //500ms // Useless\n#define\t\ttUpdateRxCounter          \t\t100   //100ms\n       \t\t\n#define\t\trateCCK     \t\t\t\t0\t// Useless\n#define\t\trateOFDM    \t\t\t\t1\n#define\t\trateHT      \t\t\t\t\t2\n\n//define Register-End\n#define\t\tbPMAC_End                 \t\t0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End             \t\t0x8ff\n#define\t\tbFPGAPHY1_End             \t\t0x9ff\n#define\t\tbCCKPHY0_End              \t\t0xaff\n#define\t\tbOFDMPHY0_End             \t\t0xcff\n#define\t\tbOFDMPHY1_End             \t\t0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl              \t\t0x0\t\t// Useless\n#define\t\tbWMACControl              \t\t0x1\n#define\t\tbWNICControl              \t\t0x2\n       \t\t\n#define\t\tPathA                     \t\t\t0x0\t// Useless\n#define\t\tPathB                     \t\t\t0x1\n#define\t\tPathC                     \t\t\t0x2\n#define\t\tPathD                     \t\t\t0x3\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8188EPwrSeq.h",
    "content": "\n/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL8188EPWRSEQ_H__\n#define __HAL8188EPWRSEQ_H__\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n\n    PWR SEQ Version: rtl8188E_PwrSeq_V09.h\n*/\n#define\tRTL8188E_TRANS_CARDEMU_TO_ACT_STEPS\t10\n#define\tRTL8188E_TRANS_ACT_TO_CARDEMU_STEPS\t10\n#define\tRTL8188E_TRANS_CARDEMU_TO_SUS_STEPS\t10\n#define\tRTL8188E_TRANS_SUS_TO_CARDEMU_STEPS\t10\n#define\tRTL8188E_TRANS_CARDEMU_TO_PDN_STEPS\t10\n#define\tRTL8188E_TRANS_PDN_TO_CARDEMU_STEPS\t10\n#define\tRTL8188E_TRANS_ACT_TO_LPS_STEPS\t15\n#define\tRTL8188E_TRANS_LPS_TO_ACT_STEPS\t15\t\n#define\tRTL8188E_TRANS_END_STEPS\t1\n\n\n#define RTL8188E_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, /* 0x02[1:0] = 0\treset BB*/\t\t\t\\\n\t{0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, /* 0x04[15] = 0 disable HWPDN (control by DRV)*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, 0}, /*0x04[12:11] = 2b'00 disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/\t\\\n\n#define RTL8188E_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*LDO Sleep mode*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\n#define RTL8188E_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, BIT7}, /*  0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\t\\\n\t{0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */\t\\\n\t{0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register  0xfe10[4]=1 */\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8188E_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7}, /*0x24[23] = 2b'01 schmit trigger */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*  0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\t\\\n\t{0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*Clear SIC_EN register 0x40[12] = 1'b0 */\t\\\n\t{0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*Set USB suspend enable local register  0xfe10[4]=1 */\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8188E_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8188E_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n//This is used by driver for LPSRadioOff Procedure, not for FW LPS Step\n#define RTL8188E_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8188E_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n#define RTL8188E_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8188E_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_card_disable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_card_enable_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS+RTL8188E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188E_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS+RTL8188E_TRANS_END_STEPS];\n\n#endif //__HAL8188EPWRSEQ_H__\n\n"
  },
  {
    "path": "include/Hal8188FPhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8188FPHYCFG_H__\n#define __INC_HAL8188FPHYCFG_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters End-------------------------------*/\n\n\n/*------------------------------Define structure----------------------------*/\n\n/*------------------------------Define structure End----------------------------*/\n\n/*--------------------------Exported Function prototype---------------------*/\nu32\nPHY_QueryBBReg_8188F(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask\n\t);\n\nVOID\nPHY_SetBBReg_8188F(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t);\n\nu32\nPHY_QueryRFReg_8188F(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask\n\t);\n\nVOID\nPHY_SetRFReg_8188F(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask,\n\tIN\tu32\t\t\t\tData\n\t);\n\n/* MAC/BB/RF HAL config */\nint PHY_BBConfig8188F(PADAPTER\tAdapter\t);\n\nint PHY_RFConfig8188F(PADAPTER\tAdapter\t);\n\ns32 PHY_MACConfig8188F(PADAPTER padapter);\n\nint\nPHY_ConfigRFWithParaFile_8188F(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8* \t\t\t\tpFileName,\n\tRF_PATH\t\t\t\teRFPath\n);\n\nVOID\nPHY_SetTxPowerIndex_8188F(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\t\tRate\n\t);\n\nu8\nPHY_GetTxPowerIndex_8188F(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\nVOID\t\nPHY_GetTxPowerLevel8188F(\t\t\t\n\tIN\tPADAPTER\t\tAdapter,\n\tOUT s32*\t\t    \t\tpowerlevel\t\n\t);\n\nVOID\nPHY_SetTxPowerLevel8188F(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tchannel\n\t);\n\nVOID\nPHY_SetBWMode8188F(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\t\tBandwidth,\t// 20M or 40M\n\tIN\tunsigned char\t\t\t\tOffset\t\t// Upper, Lower, or Don't care\n);\n\nVOID\nPHY_SwChnl8188F(\t// Call after initialization\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tchannel\n\t);\n\nVOID\nPHY_SetSwChnlBWMode8188F(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\nVOID PHY_SetRFPathSwitch_8188F(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tbMain\n\t);\n/*--------------------------Exported Function prototype End---------------------*/\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8188FPhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8188FPHYREG_H__\n#define __INC_HAL8188FPHYREG_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n\n//============================================================\n//       Regsiter offset definition\n//============================================================\n\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t\t0x18c\n\n//\n// 2. Page2(0x200)\n//\n// The following two definition are only used for USB interface.\n#define\t\tRF_BB_CMD_ADDR\t\t\t\t0x02c0\t// RF/BB read/write command address.\n#define\t\tRF_BB_CMD_DATA\t\t\t\t0x02c4\t// RF/BB read/write command data.\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t0x814\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n#define\t\trTxAGC_B_Rate18_06\t\t\t\t0x830\n#define\t\trTxAGC_B_Rate54_24\t\t\t\t0x834\n#define\t\trTxAGC_B_CCK1_55_Mcs32\t\t0x838\n#define\t\trTxAGC_B_Mcs03_Mcs00\t\t\t0x83c\n\n#define\t\trTxAGC_B_Mcs07_Mcs04\t\t\t0x848\n#define\t\trTxAGC_B_Mcs11_Mcs08\t\t\t0x84c\n\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define\t\trFPGA0_RFWakeUpParameter\t\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n\n#define\t\trTxAGC_B_Mcs15_Mcs12\t\t\t0x868\n#define\t\trTxAGC_B_CCK11_A_CCK2_11\t\t0x86c\n\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\t// Useless now\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\tTransceiverA_HSPI_Readback\t0x8b8\t// Transceiver A HSPI Readback\n#define\t\tTransceiverB_HSPI_Readback\t0x8bc\t// Transceiver B HSPI Readback\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\t\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n\n#define\t\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\t\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\t\trFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n#define \trS0S1_PathSwitch\t\t\t0x948\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t0xa50\n#define\t\trCCK0_RxReport            \t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t0xa58  //0xa5c\n//\n// PageB(0xB00)\n//\n#define\t\trPdp_AntA      \t\t\t\t0xb00  \n#define\t\trPdp_AntA_4    \t\t\t\t0xb04\n#define\t\trConfig_Pmpd_AntA \t\t\t0xb28\n#define\t\trConfig_AntA \t\t\t\t0xb68\n#define\t\trConfig_AntB \t\t\t\t0xb6c\n#define\t\trPdp_AntB \t\t\t\t\t0xb70\n#define\t\trPdp_AntB_4 \t\t\t\t0xb74\n#define\t\trConfig_Pmpd_AntB\t\t\t0xb98\n#define\t\trAPK\t\t\t\t\t\t0xbd8\n\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define\t\trOFDM0_RxHPParameter\t\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t\t0xcf4\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t\t0xd3c\n#define\t\trOFDM1_PseudoNoiseStateAB\t\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_A_Rate18_06\t\t\t0xe00\n#define\t\trTxAGC_A_Rate54_24\t\t\t0xe04\n#define\t\trTxAGC_A_CCK1_Mcs32\t\t\t0xe08\n#define\t\trTxAGC_A_Mcs03_Mcs00\t\t\t0xe10\n#define\t\trTxAGC_A_Mcs07_Mcs04\t\t\t0xe14\n#define\t\trTxAGC_A_Mcs11_Mcs08\t\t\t0xe18\n#define\t\trTxAGC_A_Mcs15_Mcs12\t\t\t0xe1c\n\n#define\t\trFPGA0_IQK\t\t\t\t\t0xe28\n#define\t\trTx_IQK_Tone_A\t\t\t\t0xe30\n#define\t\trRx_IQK_Tone_A\t\t\t\t0xe34\n#define\t\trTx_IQK_PI_A\t\t\t\t\t0xe38\n#define\t\trRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n#define\t\trTx_IQK \t\t\t\t\t\t0xe40\n#define\t\trRx_IQK\t\t\t\t\t\t0xe44\n#define\t\trIQK_AGC_Pts\t\t\t\t\t0xe48\n#define\t\trIQK_AGC_Rsp\t\t\t\t\t0xe4c\n#define\t\trTx_IQK_Tone_B\t\t\t\t0xe50\n#define\t\trRx_IQK_Tone_B\t\t\t\t0xe54\n#define\t\trTx_IQK_PI_B\t\t\t\t\t0xe58\n#define\t\trRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define\t\trIQK_AGC_Cont\t\t\t\t0xe60\n\n#define\t\trBlue_Tooth\t\t\t\t\t0xe6c\n#define\t\trRx_Wait_CCA\t\t\t\t\t0xe70\n#define\t\trTx_CCK_RFON\t\t\t\t\t0xe74\n#define\t\trTx_CCK_BBON\t\t\t\t0xe78\n#define\t\trTx_OFDM_RFON\t\t\t\t0xe7c\n#define\t\trTx_OFDM_BBON\t\t\t\t0xe80\n#define\t\trTx_To_Rx\t\t\t\t\t0xe84\n#define\t\trTx_To_Tx\t\t\t\t\t0xe88\n#define\t\trRx_CCK\t\t\t\t\t\t0xe8c\n\n#define\t\trTx_Power_Before_IQK_A\t\t0xe94\n#define\t\trTx_Power_After_IQK_A\t\t\t0xe9c\n\n#define\t\trRx_Power_Before_IQK_A\t\t0xea0\n#define\t\trRx_Power_Before_IQK_A_2\t\t0xea4\n#define\t\trRx_Power_After_IQK_A\t\t\t0xea8\n#define\t\trRx_Power_After_IQK_A_2\t\t0xeac\n\n#define\t\trTx_Power_Before_IQK_B\t\t0xeb4\n#define\t\trTx_Power_After_IQK_B\t\t\t0xebc\n\n#define\t\trRx_Power_Before_IQK_B\t\t0xec0\n#define\t\trRx_Power_Before_IQK_B_2\t\t0xec4\n#define\t\trRx_Power_After_IQK_B\t\t\t0xec8\n#define\t\trRx_Power_After_IQK_B_2\t\t0xecc\n\n#define\t\trRx_OFDM\t\t\t\t\t0xed0\n#define\t\trRx_Wait_RIFS \t\t\t\t0xed4\n#define\t\trRx_TO_Rx \t\t\t\t\t0xed8\n#define\t\trStandby \t\t\t\t\t\t0xedc\n#define\t\trSleep \t\t\t\t\t\t0xee0\n#define\t\trPMPD_ANAEN\t\t\t\t0xeec\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t0x02\t// \n#define\t\tRF_BS_PA_APSET_G1_G4\t\t0x03\n#define\t\tRF_BS_PA_APSET_G5_G8\t\t0x04\n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t0x08\t// \n#define\t\tRF_IPA_G\t\t\t\t\t0x09\t// \n#define\t\tRF_TXBIAS_G\t\t\t\t0x0A\n#define\t\tRF_TXPA_AG\t\t\t\t\t0x0B\n#define\t\tRF_IPA_A\t\t\t\t\t0x0C\t// \n#define\t\tRF_TXBIAS_A\t\t\t\t0x0D\n#define\t\tRF_BS_PA_APSET_G9_G11\t0x0E\n#define\t\tRF_BS_IQGEN\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16 //\n#define\t\tRF_POW_ABILITY\t\t\t0x17\t// \n#define\t\tRF_MODE_AG\t\t\t\t0x18\t// \n#define\t\trRfChannel\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define \tRF_TX_BIAS_A\t\t\t\t0x35\n#define \tRF_TX_BIAS_D\t\t\t\t0x36\n#define \tRF_LOBF_9\t\t\t\t\t0x38\n#define \tRF_RXRF_A3\t\t\t\t\t0x3C\t//\t\n#define \tRF_TRSW \t\t\t\t\t0x3F\n\n#define \tRF_TXRF_A2\t\t\t\t\t0x41\n#define \tRF_TXPA_G4\t\t\t\t\t0x46\t\n#define \tRF_TXPA_A4\t\t\t\t\t0x4B\t\n#define \tRF_0x52 \t\t\t\t\t0x52\n#define\t\tRF_RXG_MIX_SWBW\t\t\t\t0x87\n#define\t\tRF_DBG_LP_RX2\t\t\t\t0xDF\n#define \tRF_WE_LUT\t\t\t\t\t0xEF\t\n#define \tRF_S0S1 \t\t\t\t\t0xB0\n\n#define RF_TX_GAIN_OFFSET_8188F(_val) (abs((_val)) | (((_val) > 0) ? BIT5 : 0))\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t0x3f\n\n#define\t\tbAntennaSelect                 \t\t0x0300\n\n#define\t\tbXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t0xf80000\n#define\t\tbContTxHSSI               \t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t0x200\n#define\t\tbAGCAddress               \t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t0xc0000\n#define\t\tbAGCTxCode                \t\t0xc00000\n#define\t\tbAGCRxCode                \t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t\t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t\t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t\t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t\t0x40000\n#define\t\tbAD7InputCMMode           \t\t0x380000\n#define\t\tbAD7Current               \t\t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t\t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t\t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t\t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t0x10\n#define\t\tbAntNonHT           \t      \t\t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode\t\t\t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving\t\t0x80\n#define\t\tbCCKRxPowerSaving\t\t0x40\n\n#define\t\tbCCKSideBand\t\t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble\t\t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity\t\t0x8000\n#define\t\tbCCKCarrierRecovery\t\t0x4000\n#define\t\tbCCKTxRate\t\t\t\t0x3000\n#define\t\tbCCKDCCancel\t\t\t0x0800\n#define\t\tbCCKISICancel\t\t\t0x0400\n#define\t\tbCCKMatchFilter\t\t\t0x0200\n#define\t\tbCCKEqualizer\t\t\t0x0100\n#define\t\tbCCKPreambleDetect\t\t0x800000\n#define\t\tbCCKFastFalseCCA\t\t0x400000\n#define\t\tbCCKChEstStart\t\t\t0x300000\n#define\t\tbCCKCCACount\t\t\t0x080000\n#define\t\tbCCKcs_lim\t\t\t\t0x070000\n#define\t\tbCCKBistMode\t\t\t0x80000000\n#define\t\tbCCKCCAMask\t\t\t0x40000000\n#define\t\tbCCKTxDACPhase\t\t0x4\n#define\t\tbCCKRxADCPhase\t\t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0\t\t0x0100\n#define\t\tbCCKTxDCOffset\t\t\t0xf0\n#define\t\tbCCKRxDCOffset\t\t\t0xf\n#define\t\tbCCKCCAMode\t\t\t0xc000\n#define\t\tbCCKFalseCS_lim\t\t\t0x3f00\n#define\t\tbCCKCS_ratio\t\t\t0xc00000\n#define\t\tbCCKCorgBit_sel\t\t\t0x300000\n#define\t\tbCCKPD_lim\t\t\t\t0x0f0000\n#define\t\tbCCKNewCCA\t\t\t0x80000000\n#define\t\tbCCKRxHPofIG\t\t\t0x8000\n#define\t\tbCCKRxIG\t\t\t\t0x7f00\n#define\t\tbCCKLNAPolarity\t\t\t0x800000\n#define\t\tbCCKRx1stGain\t\t\t0x7f0000\n#define\t\tbCCKRFExtend\t\t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKRxAGCSatCount\t\t0xe0\n#define\t\tbCCKRxRFSettle\t\t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC\t\t\t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity\t\t0x2000\n#define\t\tbCCKTxFilterType\t\t0x0c00\n#define\t\tbCCKRxAGCReportType\t0x0300\n#define\t\tbCCKRxDAGCEn\t\t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod\t\t0x20000000\n#define\t\tbCCKRxDAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKTimingRecovery\t\t0x800000\n#define\t\tbCCKTxC0\t\t\t\t0x3f0000\n#define\t\tbCCKTxC1\t\t\t\t0x3f000000\n#define\t\tbCCKTxC2\t\t\t\t0x3f\n#define\t\tbCCKTxC3\t\t\t\t0x3f00\n#define\t\tbCCKTxC4\t\t\t\t0x3f0000\n#define\t\tbCCKTxC5\t\t\t\t0x3f000000\n#define\t\tbCCKTxC6\t\t\t\t0x3f\n#define\t\tbCCKTxC7\t\t\t\t0x3f00\n#define\t\tbCCKDebugPort\t\t\t0xff0000\n#define\t\tbCCKDACDebug\t\t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable\t0x8000\n#define\t\tbCCKFalseAlarmRead\t\t0x4000\n#define\t\tbCCKTRSSI\t\t\t\t0x7f\n#define\t\tbCCKRxAGCReport\t\t0xfe\n#define\t\tbCCKRxReport_AntSel\t0x80000000\n#define\t\tbCCKRxReport_MFOff\t\t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss\t0x20000000\n#define\t\tbCCKRxReport_Pktloss\t0x10000000\n#define\t\tbCCKRxReport_Lockedbit\t0x08000000\n#define\t\tbCCKRxReport_RateError\t0x04000000\n#define\t\tbCCKRxReport_RxRate\t0x03000000\n#define\t\tbCCKRxFACounterLower\t0xff\n#define\t\tbCCKRxFACounterUpper\t0xff000000\n#define\t\tbCCKRxHPAGCStart\t\t0xe000\n#define\t\tbCCKRxHPAGCFinal\t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable\t0x8000\n#define\t\tbCCKFACounterFreeze\t0x4000       \t\t\n#define\t\tbCCKTxPathSel\t\t\t0x10000000\n#define\t\tbCCKDefaultRxPath\t\t0xc000000\n#define\t\tbCCKOptionRxPath\t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF\t\t\t\t0x3\t// Useless\n#define\t\tbShift_L\t\t\t\t\t0xc0\n#define\t\tbGI_TH\t\t\t\t\t0xc\n#define\t\tbRxPathA\t\t\t\t0x1\n#define\t\tbRxPathB\t\t\t\t0x2\n#define\t\tbRxPathC\t\t\t\t0x4\n#define\t\tbRxPathD\t\t\t\t0x8\n#define\t\tbTxPathA\t\t\t\t0x1\n#define\t\tbTxPathB\t\t\t\t0x2\n#define\t\tbTxPathC\t\t\t\t0x4\n#define\t\tbTxPathD\t\t\t\t0x8\n#define\t\tbTRSSIFreq\t\t\t\t0x200\n#define\t\tbADCBackoff\t\t\t\t0x3000\n#define\t\tbDFIRBackoff\t\t\t0xc000\n#define\t\tbTRSSILatchPhase\t\t0x10000\n#define\t\tbRxIDCOffset\t\t\t0xff\n#define\t\tbRxQDCOffset\t\t\t0xff00\n#define\t\tbRxDFIRMode\t\t\t0x1800000\n#define\t\tbRxDCNFType\t\t\t0xe000000\n#define\t\tbRXIQImb_A\t\t\t\t0x3ff\n#define\t\tbRXIQImb_B\t\t\t\t0xfc00\n#define\t\tbRXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbRXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbDC_dc_Notch\t\t\t0x60000\n#define\t\tbRxNBINotch\t\t\t0x1f000000\n#define\t\tbPD_TH\t\t\t\t\t0xf\n#define\t\tbPD_TH_Opt2\t\t\t0xc000\n#define\t\tbPWED_TH\t\t\t\t0x700\n#define\t\tbIfMF_Win_L\t\t\t0x800\n#define\t\tbPD_Option\t\t\t\t0x1000\n#define\t\tbMF_Win_L\t\t\t\t0xe000\n#define\t\tbBW_Search_L\t\t\t0x30000\n#define\t\tbwin_enh_L\t\t\t\t0xc0000\n#define\t\tbBW_TH\t\t\t\t\t0x700000\n#define\t\tbED_TH2\t\t\t\t0x3800000\n#define\t\tbBW_option\t\t\t\t0x4000000\n#define\t\tbRatio_TH\t\t\t\t0x18000000\n#define\t\tbWindow_L\t\t\t\t0xe0000000\n#define\t\tbSBD_Option\t\t\t\t0x1\n#define\t\tbFrame_TH\t\t\t\t0x1c\n#define\t\tbFS_Option\t\t\t\t0x60\n#define\t\tbDC_Slope_check\t\t0x80\n#define\t\tbFGuard_Counter_DC_L\t0xe00\n#define\t\tbFrame_Weight_Short\t0x7000\n#define\t\tbSub_Tune\t\t\t\t0xe00000\n#define\t\tbFrame_DC_Length\t\t0xe000000\n#define\t\tbSBD_start_offset\t\t0x30000000\n#define\t\tbFrame_TH_2\t\t\t0x7\n#define\t\tbFrame_GI2_TH\t\t\t0x38\n#define\t\tbGI2_Sync_en\t\t\t0x40\n#define\t\tbSarch_Short_Early\t\t0x300\n#define\t\tbSarch_Short_Late\t\t0xc00\n#define\t\tbSarch_GI2_Late\t\t0x70000\n#define\t\tbCFOAntSum\t\t\t\t0x1\n#define\t\tbCFOAcc\t\t\t\t0x2\n#define\t\tbCFOStartOffset\t\t\t0xc\n#define\t\tbCFOLookBack\t\t\t0x70\n#define\t\tbCFOSumWeight\t\t\t0x80\n#define\t\tbDAGCEnable\t\t\t0x10000\n#define\t\tbTXIQImb_A\t\t\t\t0x3ff\n#define\t\tbTXIQImb_B\t\t\t\t0xfc00\n#define\t\tbTXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbTXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbTxIDCOffset\t\t\t0xff\n#define\t\tbTxQDCOffset\t\t\t0xff00\n#define\t\tbTxDFIRMode\t\t\t0x10000\n#define\t\tbTxPesudoNoiseOn\t\t0x4000000\n#define\t\tbTxPesudoNoise_A\t\t0xff\n#define\t\tbTxPesudoNoise_B\t\t0xff00\n#define\t\tbTxPesudoNoise_C\t\t0xff0000\n#define\t\tbTxPesudoNoise_D\t\t0xff000000\n#define\t\tbCCADropOption\t\t\t0x20000\n#define\t\tbCCADropThres\t\t\t0xfff00000\n#define\t\tbEDCCA_H\t\t\t\t0xf\n#define\t\tbEDCCA_L\t\t\t\t0xf0\n#define\t\tbLambda_ED\t\t\t0x300\n#define\t\tbRxInitialGain\t\t\t0x7f\n#define\t\tbRxAntDivEn\t\t\t\t0x80\n#define\t\tbRxAGCAddressForLNA\t0x7f00\n#define\t\tbRxHighPowerFlow\t\t0x8000\n#define\t\tbRxAGCFreezeThres\t\t0xc0000\n#define\t\tbRxFreezeStep_AGC1\t0x300000\n#define\t\tbRxFreezeStep_AGC2\t0xc00000\n#define\t\tbRxFreezeStep_AGC3\t0x3000000\n#define\t\tbRxFreezeStep_AGC0\t0xc000000\n#define\t\tbRxRssi_Cmp_En\t\t\t0x10000000\n#define\t\tbRxQuickAGCEn\t\t\t0x20000000\n#define\t\tbRxAGCFreezeThresMode\t0x40000000\n#define\t\tbRxOverFlowCheckType\t0x80000000\n#define\t\tbRxAGCShift\t\t\t\t0x7f\n#define\t\tbTRSW_Tri_Only\t\t\t0x80\n#define\t\tbPowerThres\t\t\t0x300\n#define\t\tbRxAGCEn\t\t\t\t0x1\n#define\t\tbRxAGCTogetherEn\t\t0x2\n#define\t\tbRxAGCMin\t\t\t\t0x4\n#define\t\tbRxHP_Ini\t\t\t\t0x7\n#define\t\tbRxHP_TRLNA\t\t\t0x70\n#define\t\tbRxHP_RSSI\t\t\t\t0x700\n#define\t\tbRxHP_BBP1\t\t\t\t0x7000\n#define\t\tbRxHP_BBP2\t\t\t\t0x70000\n#define\t\tbRxHP_BBP3\t\t\t\t0x700000\n#define\t\tbRSSI_H\t\t\t\t\t0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen\t\t\t\t0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW\t\t\t0x7\n#define\t\tbRxSettle_LNA\t\t\t0x38\n#define\t\tbRxSettle_RSSI\t\t\t0x1c0\n#define\t\tbRxSettle_BBP\t\t\t0xe00\n#define\t\tbRxSettle_RxHP\t\t\t0x7000\n#define\t\tbRxSettle_AntSW_RSSI\t0x38000\n#define\t\tbRxSettle_AntSW\t\t0xc0000\n#define\t\tbRxProcessTime_DAGC\t0x300000\n#define\t\tbRxSettle_HSSI\t\t\t0x400000\n#define\t\tbRxProcessTime_BBPPW\t0x800000\n#define\t\tbRxAntennaPowerShift\t0x3000000\n#define\t\tbRSSITableSelect\t\t0xc000000\n#define\t\tbRxHP_Final\t\t\t\t0x7000000\n#define\t\tbRxHTSettle_BBP\t\t\t0x7\n#define\t\tbRxHTSettle_HSSI\t\t0x8\n#define\t\tbRxHTSettle_RxHP\t\t0x70\n#define\t\tbRxHTSettle_BBPPW\t\t0x80\n#define\t\tbRxHTSettle_Idle\t\t0x300\n#define\t\tbRxHTSettle_Reserved\t0x1c00\n#define\t\tbRxHTRxHPEn\t\t\t0x8000\n#define\t\tbRxHTAGCFreezeThres\t0x30000\n#define\t\tbRxHTAGCTogetherEn\t0x40000\n#define\t\tbRxHTAGCMin\t\t\t0x80000\n#define\t\tbRxHTAGCEn\t\t\t\t0x100000\n#define\t\tbRxHTDAGCEn\t\t\t0x200000\n#define\t\tbRxHTRxHP_BBP\t\t\t0x1c00000\n#define\t\tbRxHTRxHP_Final\t\t0xe0000000\n#define\t\tbRxPWRatioTH\t\t\t0x3\n#define\t\tbRxPWRatioEn\t\t\t0x4\n#define\t\tbRxMFHold\t\t\t\t0x3800\n#define\t\tbRxPD_Delay_TH1\t\t0x38\n#define\t\tbRxPD_Delay_TH2\t\t0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX\t0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH\t\t\t0x8000\n#define\t\tbRxProcess_Delay\t\t0xf0000\n#define\t\tbRxSearchrange_GI2_Early\t0x700000\n#define\t\tbRxFrame_Guard_Counter_L\t0x3800000\n#define\t\tbRxSGI_Guard_L\t\t\t0xc000000\n#define\t\tbRxSGI_Search_L\t\t0x30000000\n#define\t\tbRxSGI_TH\t\t\t\t0xc0000000\n#define\t\tbDFSCnt0\t\t\t\t0xff\n#define\t\tbDFSCnt1\t\t\t\t0xff00\n#define\t\tbDFSFlag\t\t\t\t0xf0000       \t\t\n#define\t\tbMFWeightSum\t\t\t0x300000\n#define\t\tbMinIdxTH\t\t\t\t0x7f000000       \t\t\n#define\t\tbDAFormat\t\t\t\t0x40000       \t\t\n#define\t\tbTxChEmuEnable\t\t0x01000000       \t\t\n#define\t\tbTRSWIsolation_A\t\t0x7f\n#define\t\tbTRSWIsolation_B\t\t0x7f00\n#define\t\tbTRSWIsolation_C\t\t0x7f0000\n#define\t\tbTRSWIsolation_D\t\t0x7f000000       \t\t\n#define\t\tbExtLNAGain\t\t\t\t0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn\t\t\t\t0x4\t// Useless\n#define\t\tbAntennaMapping\t\t0x10\n#define\t\tbNss\t\t\t\t\t0x20\n#define\t\tbCFOAntSumD\t\t\t0x200\n#define\t\tbPHYCounterReset\t\t0x8000000\n#define\t\tbCFOReportGet\t\t\t0x4000000\n#define\t\tbOFDMContinueTx\t\t0x10000000\n#define\t\tbOFDMSingleCarrier\t\t0x20000000\n#define\t\tbOFDMSingleTone\t\t0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect\t\t\t0x100\n#define\t\tbCFOEn\t\t\t\t0x10000\n#define\t\tbCFOValue\t\t\t0xfff00000\n#define\t\tbSigTone_Re\t\t0x3f\n#define\t\tbSigTone_Im\t\t0x7f00\n#define\t\tbCounter_CCA\t\t0xffff\n#define\t\tbCounter_ParityFail\t0xffff0000\n#define\t\tbCounter_RateIllegal\t\t0xffff\n#define\t\tbCounter_CRC8Fail\t0xffff0000\n#define\t\tbCounter_MCSNoSupport\t0xffff\n#define\t\tbCounter_FastSync\t0xffff\n#define\t\tbShortCFO\t\t\t0xfff\n#define\t\tbShortCFOTLength\t12   //total\n#define\t\tbShortCFOFLength\t11   //fraction\n#define\t\tbLongCFO\t\t\t0x7ff\n#define\t\tbLongCFOTLength\t11\n#define\t\tbLongCFOFLength\t11\n#define\t\tbTailCFO\t\t\t0x1fff\n#define\t\tbTailCFOTLength\t\t13\n#define\t\tbTailCFOFLength\t\t12       \t\t\n#define\t\tbmax_en_pwdB\t\t0xffff\n#define\t\tbCC_power_dB\t\t0xffff0000\n#define\t\tbnoise_pwdB\t\t0xffff\n#define\t\tbPowerMeasTLength\t10\n#define\t\tbPowerMeasFLength\t3\n#define\t\tbRx_HT_BW\t\t\t0x1\n#define\t\tbRxSC\t\t\t\t0x6\n#define\t\tbRx_HT\t\t\t\t0x8       \t\t\n#define\t\tbNB_intf_det_on\t\t0x1\n#define\t\tbIntf_win_len_cfg\t0x30\n#define\t\tbNB_Intf_TH_cfg\t\t0x1c0       \t\t\n#define\t\tbRFGain\t\t\t\t0x3f\n#define\t\tbTableSel\t\t\t0x40\n#define\t\tbTRSW\t\t\t\t0x80       \t\t\n#define\t\tbRxSNR_A\t\t\t0xff\n#define\t\tbRxSNR_B\t\t\t0xff00\n#define\t\tbRxSNR_C\t\t\t0xff0000\n#define\t\tbRxSNR_D\t\t\t0xff000000\n#define\t\tbSNREVMTLength\t\t8\n#define\t\tbSNREVMFLength\t\t1       \t\t\n#define\t\tbCSI1st\t\t\t\t0xff\n#define\t\tbCSI2nd\t\t\t\t0xff00\n#define\t\tbRxEVM1st\t\t\t0xff0000\n#define\t\tbRxEVM2nd\t\t\t0xff000000       \t\t\n#define\t\tbSIGEVM\t\t\t0xff\n#define\t\tbPWDB\t\t\t\t0xff00\n#define\t\tbSGIEN\t\t\t\t0x10000\n       \t\t\n#define\t\tbSFactorQAM1\t\t0xf\t// Useless\n#define\t\tbSFactorQAM2\t\t0xf0\n#define\t\tbSFactorQAM3\t\t0xf00\n#define\t\tbSFactorQAM4\t\t0xf000\n#define\t\tbSFactorQAM5\t\t0xf0000\n#define\t\tbSFactorQAM6\t\t0xf0000\n#define\t\tbSFactorQAM7\t\t0xf00000\n#define\t\tbSFactorQAM8\t\t0xf000000\n#define\t\tbSFactorQAM9\t\t0xf0000000\n#define\t\tbCSIScheme\t\t\t0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet\t\t0x3\t// Useless\n#define\t\tbChSmooth\t\t\t0x4\n#define\t\tbChSmoothCfg1\t\t0x38\n#define\t\tbChSmoothCfg2\t\t0x1c0\n#define\t\tbChSmoothCfg3\t\t0xe00\n#define\t\tbChSmoothCfg4\t\t0x7000\n#define\t\tbMRCMode\t\t\t0x800000\n#define\t\tbTHEVMCfg\t\t\t0x7000000\n       \t\t\n#define\t\tbLoopFitType\t\t0x1\t// Useless\n#define\t\tbUpdCFO\t\t\t0x40\n#define\t\tbUpdCFOOffData\t\t0x80\n#define\t\tbAdvUpdCFO\t\t\t0x100\n#define\t\tbAdvTimeCtrl\t\t0x800\n#define\t\tbUpdClko\t\t\t0x1000\n#define\t\tbFC\t\t\t\t\t0x6000\n#define\t\tbTrackingMode\t\t0x8000\n#define\t\tbPhCmpEnable\t\t0x10000\n#define\t\tbUpdClkoLTF\t\t0x20000\n#define\t\tbComChCFO\t\t\t0x40000\n#define\t\tbCSIEstiMode\t\t0x80000\n#define\t\tbAdvUpdEqz\t\t\t0x100000\n#define\t\tbUChCfg\t\t\t\t0x7000000\n#define\t\tbUpdEqz\t\t\t0x8000000\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn\t\t0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A\t\t0xff\n#define\t\tbRxPesudoNoise_B\t\t0xff00\n#define\t\tbRxPesudoNoise_C\t\t0xff0000\n#define\t\tbRxPesudoNoise_D\t\t0xff000000\n#define\t\tbPesudoNoiseState_A\t0xffff\n#define\t\tbPesudoNoiseState_B\t0xffff0000\n#define\t\tbPesudoNoiseState_C\t0xffff\n#define\t\tbPesudoNoiseState_D\t0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable\t\t0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl\t\t0xc00\n#define\t\tbZebra1_TRxGainSetting\t0x07f\n#define\t\tbZebra1_RxCorner\t\t0xc00\n#define\t\tbZebra1_TxChargePump\t0x38\n#define\t\tbZebra1_RxChargePump\t0x7\n#define\t\tbZebra1_ChannelNum\t0xf80\n#define\t\tbZebra1_TxLPFBW\t\t0x400\n#define\t\tbZebra1_RxLPFBW\t\t0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1\t0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0\t0x40\n#define\t\tbRTL8256_TxLPFBW\t\t0x18\n#define\t\tbRTL8256_RxLPFBW\t\t0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW\t\t0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW\t\t0xc00\n#define\t\tbRTL8258_RSSILPFBW\t0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0\t\t\t\t0x1\t// Useless\n#define\t\tbByte1\t\t\t\t0x2\n#define\t\tbByte2\t\t\t\t0x4\n#define\t\tbByte3\t\t\t\t0x8\n#define\t\tbWord0\t\t\t\t0x3\n#define\t\tbWord1\t\t\t\t0xc\n#define\t\tbDWord\t\t\t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0\t\t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1\t\t\t0xff00\n#define\t\tbMaskByte2\t\t\t0xff0000\n#define\t\tbMaskByte3\t\t\t0xff000000\n#define\t\tbMaskHWord\t\t0xffff0000\n#define\t\tbMaskLWord\t\t\t0x0000ffff\n#define\t\tbMaskDWord\t\t0xffffffff\n#define\t\tbMaskH3Bytes\t\t0xffffff00\n#define\t\tbMask12Bits\t\t\t0xfff\n#define\t\tbMaskH4Bits\t\t\t0xf0000000\t\n#define\t\tbMaskOFDM_D\t\t0xffc00000\n#define\t\tbMaskCCK\t\t\t0x3f3f3f3f\n\n  \t\t\n#define\t\tbEnable\t\t\t0x1\t// Useless\n#define\t\tbDisable\t\t0x0\n       \t\t\n#define\t\tLeftAntenna\t\t0x0\t// Useless\n#define\t\tRightAntenna\t0x1\n       \t\t\n#define\t\ttCheckTxStatus\t\t500   //500ms // Useless\n#define\t\ttUpdateRxCounter\t100   //100ms\n       \t\t\n#define\t\trateCCK\t\t0\t// Useless\n#define\t\trateOFDM\t1\n#define\t\trateHT\t\t2\n\n//define Register-End\n#define\t\tbPMAC_End\t\t\t0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End\t\t0x8ff\n#define\t\tbFPGAPHY1_End\t\t0x9ff\n#define\t\tbCCKPHY0_End\t\t0xaff\n#define\t\tbOFDMPHY0_End\t\t0xcff\n#define\t\tbOFDMPHY1_End\t\t0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl\t\t0x0\t\t// Useless\n#define\t\tbWMACControl\t\t0x1\n#define\t\tbWNICControl\t\t0x2\n       \t\t\n#define\t\tPathA\t\t\t0x0\t// Useless\n#define\t\tPathB\t\t\t0x1\n#define\t\tPathC\t\t\t0x2\n#define\t\tPathD\t\t\t0x3\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n// BB Register Definition\n//\n// 4. Page9(0x900)\n//\n#define rDPDT_control\t\t\t\t0x92c\n#define rfe_ctrl_anta_src\t\t\t\t0x930\n#define rS0S1_PathSwitch   \t\t\t0x948\n#define\tBBrx_DFIR\t\t\t\t\t\t0x954\n#define AGC_table_select\t\t\t\t0xb2c\n\n//\n// PageB(0xB00)\n//\n#define rPdp_AntA\t\t\t\t\t\t0xb00\n#define rPdp_AntA_4\t\t\t\t\t\t0xb04\n#define rPdp_AntA_8\t\t\t\t\t\t0xb08\n#define rPdp_AntA_C\t\t\t\t\t\t0xb0c\n#define rPdp_AntA_10\t\t\t\t\t0xb10\n#define rPdp_AntA_14\t\t\t\t\t0xb14\n#define rPdp_AntA_18\t\t\t\t\t0xb18\n#define rPdp_AntA_1C\t\t\t\t\t0xb1c\n#define rPdp_AntA_20\t\t\t\t\t0xb20\n#define rPdp_AntA_24\t\t\t\t\t0xb24\n\n#define rConfig_Pmpd_AntA \t\t\t\t0xb28\n#define rConfig_ram64x16\t\t\t\t0xb2c\n\n#define rBndA\t\t\t\t\t\t\t0xb30\n#define rHssiPar\t\t\t\t\t\t0xb34\n\n#define rConfig_AntA\t\t\t\t\t0xb68\n#define rConfig_AntB\t\t\t\t\t0xb6c\n\n#define rPdp_AntB\t\t\t\t\t\t0xb70\n#define rPdp_AntB_4\t\t\t\t\t\t0xb74\n#define rPdp_AntB_8\t\t\t\t\t\t0xb78\n#define rPdp_AntB_C\t\t\t\t\t\t0xb7c\n#define rPdp_AntB_10\t\t\t\t\t0xb80\n#define rPdp_AntB_14\t\t\t\t\t0xb84\n#define rPdp_AntB_18\t\t\t\t\t0xb88\n#define rPdp_AntB_1C\t\t\t\t\t0xb8c\n#define rPdp_AntB_20\t\t\t\t\t0xb90\n#define rPdp_AntB_24\t\t\t\t\t0xb94\n\n#define rConfig_Pmpd_AntB\t\t\t\t0xb98\n\n#define rBndB\t\t\t\t\t\t\t0xba0\n\n#define rAPK\t\t\t\t\t\t\t0xbd8\n#define rPm_Rx0_AntA\t\t\t\t\t0xbdc\n#define rPm_Rx1_AntA\t\t\t\t\t0xbe0\n#define rPm_Rx2_AntA\t\t\t\t\t0xbe4\n#define rPm_Rx3_AntA\t\t\t\t\t0xbe8\n#define rPm_Rx0_AntB\t\t\t\t\t0xbec\n#define rPm_Rx1_AntB\t\t\t\t\t0xbf0\n#define rPm_Rx2_AntB\t\t\t\t\t0xbf4\n#define rPm_Rx3_AntB\t\t\t\t\t0xbf8\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8188FPwrSeq.h",
    "content": "#ifndef REALTEK_POWER_SEQUENCE_8188F\n#define REALTEK_POWER_SEQUENCE_8188F\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WM-20130815-JackieLau-RTL8188F_Power_Architecture v08.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8188F_TRANS_CARDEMU_TO_ACT_STEPS\t13\n#define\tRTL8188F_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8188F_TRANS_CARDEMU_TO_SUS_STEPS\t14\n#define\tRTL8188F_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8188F_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8188F_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8188F_TRANS_ACT_TO_LPS_STEPS\t\t11\n#define\tRTL8188F_TRANS_LPS_TO_ACT_STEPS\t\t13\t\n#define\tRTL8188F_TRANS_ACT_TO_SWLPS_STEPS\t\t21\n#define\tRTL8188F_TRANS_SWLPS_TO_ACT_STEPS\t\t14\n#define\tRTL8188F_TRANS_END_STEPS\t\t1\n\n\n#define RTL8188F_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT3), 0},/*  0x4[11]=1'b0 disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* 0x4[8]=1 polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t \\\n\t{0x0027, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0x35}, /*0x27<=35 to reduce RF noise*/\n\n#define RTL8188F_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\\\n\t{0x0027, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0x34}, /*0x27 <= 34, xtal_qsel=0 to xtal bring up*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\n#define RTL8188F_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00}, /*0x07=0x00 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ \\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4},/* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode*/\n\n#define RTL8188F_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\t\\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0},/* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode*/\n\n#define RTL8188F_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00}, /*0x07=0x00 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/ \\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4},/* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode*/\n\n#define RTL8188F_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\t\\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0},/* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode*/\n\n\n#define RTL8188F_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8188F_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8188F_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0139, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*set RPWM IMR*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\n\n\n#define RTL8188F_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84},  /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0027, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xff,0x35},/*xtal_qsel=1 for low noise*/\t\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x002B, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x1c, 0x1c},   /*.\t0x2b[4:2] = 3b'111\tto enable BB,AFE clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0},  /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n \n #define RTL8188F_TRANS_ACT_TO_SWLPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0139, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0},/*set RPWM IMR*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\t{0x002b, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x1C, 0x00},/*0x2b[4:2]<=0 to gated BB,AFE clock*/\t\\\n\t{0x0027, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0x34},/*xtal_qsel=0 for bring up*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0x00},/* sdio LPS option*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0x83},/* usb LPS option, open bandgap, xtal*/\t\\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, 0}, /* 0xC4[5]<=0, digital LDO no standby mode*/\t\\\n\t{0x00C4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, BIT7}, /* 0xC4[7]<=1, on domain voltage adjust*/\t\\\n\t{0x00a7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0xe0}, /* low power LPS enable for sdio*/\t\\\n\t{0x00a7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xff, 0xe4}, /* low power LPS enable for usb*/\t\\\n\t{0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0}, /* enable WL_LPS_EN*/\n\n\n#define RTL8188F_TRANS_SWLPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*polling TSF stable*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1, enable security engine*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x06B7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x09}, /*.\treset MAC rx state machine*/\\\n\t{0x06B4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x86}, /*.\treset MAC rx state machine*/\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/* set CPU RAM code ready*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* Enable CPU*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable CPU IO Wrapper*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2},/* Enable CPU*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, BIT7},/*polling FW init ready */\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT6, BIT6},/*polling FW init ready */\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n\t\n#define RTL8188F_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8188F_power_on_flow[RTL8188F_TRANS_CARDEMU_TO_ACT_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_radio_off_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_card_disable_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_card_enable_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_suspend_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_resume_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_CARDEMU_TO_SUS_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_hwpdn_flow[RTL8188F_TRANS_ACT_TO_CARDEMU_STEPS+RTL8188F_TRANS_CARDEMU_TO_PDN_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_enter_lps_flow[RTL8188F_TRANS_ACT_TO_LPS_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_leave_lps_flow[RTL8188F_TRANS_LPS_TO_ACT_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_enter_swlps_flow[RTL8188F_TRANS_ACT_TO_SWLPS_STEPS+RTL8188F_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8188F_leave_swlps_flow[RTL8188F_TRANS_SWLPS_TO_ACT_STEPS+RTL8188F_TRANS_END_STEPS];\n#endif\n\n"
  },
  {
    "path": "include/Hal8192EPhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8192EPHYCFG_H__\n#define __INC_HAL8192EPHYCFG_H__\n\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n/*------------------------------Define structure----------------------------*/ \n\n/* BB/RF related */\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/*------------------------Export global variable----------------------------*/\n/*------------------------Export global variable----------------------------*/\n\n\n/*------------------------Export Marco Definition---------------------------*/\n/*------------------------Export Marco Definition---------------------------*/\n\n\n/*--------------------------Exported Function prototype---------------------*/\n//\n// BB and RF register read/write\n//\nu32\tPHY_QueryBBReg8192E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask\t);\nvoid\tPHY_SetBBReg8192E(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tData\t);\nu32\tPHY_QueryRFReg8192E(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask\t);\nvoid\tPHY_SetRFReg8192E(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tData\t);\n\n//\n// Initialization related function\n//\n/* MAC/BB/RF HAL config */\nint\tPHY_MACConfig8192E(IN PADAPTER\tAdapter\t);\nint\tPHY_BBConfig8192E(IN PADAPTER\tAdapter\t);\nint\tPHY_RFConfig8192E(IN PADAPTER\tAdapter\t);\n\n/* RF config */\n\n\n//\n// BB TX Power R/W\n//\nvoid\tPHY_GetTxPowerLevel8192E(\tIN PADAPTER\tAdapter, OUT s32*\tpowerlevel\t);\nvoid\tPHY_SetTxPowerLevel8192E(\tIN PADAPTER\tAdapter, IN u8\tchannel\t);\nBOOLEAN\tPHY_UpdateTxPowerDbm8192E( IN PADAPTER\tAdapter, IN int\tpowerInDbm\t);\n\nVOID\nPHY_SetTxPowerIndex_8192E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\t\tRate\n\t);\n\nu8\nPHY_GetTxPowerIndex_8192E(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\n//\n// Switch bandwidth for 8192S\n//\nVOID\nPHY_SetBWMode8192E(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset\n);\n\n//\n// channel switch related funciton\n//\nVOID\nPHY_SwChnl8192E(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel\n);\n\n\nVOID\nPHY_SetSwChnlBWMode8192E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\nVOID\nPHY_SetRFEReg_8192E(\n\tIN PADAPTER\t\tAdapter\n);\n\nvoid \nphy_SpurCalibration_8192E(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tSPUR_CAL_METHOD\tMethod\n);\nvoid PHY_SpurCalibration_8192E(IN PADAPTER Adapter);\n\n#ifdef CONFIG_SPUR_CAL_NBI\nvoid \nphy_SpurCalibration_8192E_NBI(\n\tIN\tPADAPTER\t\t\tAdapter\n);\n#endif\n//\n// BB/MAC/RF other monitor API\n//\n\nVOID\nPHY_SetRFPathSwitch_8192E(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tbMain\n);\n\nVOID\nstorePwrIndexDiffRateOffset(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t);\n\n/*--------------------------Exported Function prototype---------------------*/\n#endif\t// __INC_HAL8192CPHYCFG_H\n\n"
  },
  {
    "path": "include/Hal8192EPhyReg.h",
    "content": "/*****************************************************************************\n *\tCopyright(c) 2008,  RealTEK Technology Inc. All Right Reserved.\n *\n * Module:\t__INC_HAL8192SPHYREG_H\n *\n *\n * Note:\t1. Define PMAC/BB register map\n *\t\t\t2. Define RF register map\n *\t\t\t3. PMAC/BB register bit mask.\n *\t\t\t4. RF reg bit mask.\n *\t\t\t5. Other BB/RF relative definition.\n *\t\t\t\n *\n * Export:\tConstants, macro, functions(API), global variables(None).\n *\n * Abbrev:\t\n *\n * History:\n *\t\tData\t\tWho\t\tRemark \n *      08/07/2007  MHC    \t1. Porting from 9x series PHYCFG.h.\n *\t\t\t\t\t\t\t2. Reorganize code architecture.\n *\t09/25/2008\tMH\t\t1. Add RL6052 register definition\n * \n *****************************************************************************/\n#ifndef __INC_HAL8192EPHYREG_H\n#define __INC_HAL8192EPHYREG_H\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n//============================================================\n//       8192S Regsiter offset definition\n//============================================================\n\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t0x18c\n\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t\t0x814\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define\t\trFPGA0_RFWakeUpParameter\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\n#define\t\trFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\tTransceiverA_HSPI_Readback\t\t0x8b8\t// Transceiver A HSPI Readback\n#define\t\tTransceiverB_HSPI_Readback\t\t0x8bc\t// Transceiver B HSPI Readback\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\t\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n\n#define\t\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\t\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\t\trFPGA1_TxInfo\t\t\t\t\t0x90c\t// Useless now // Status report??\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t\t0xa50\n#define\t\trCCK0_RxReport            \t\t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t\t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t\t0xa58  //0xa5c\n\n//\n// PageB(0xB00)\n//\n#define\t\trPdp_AntA      \t\t\t\t\t0xb00  \n#define\t\trPdp_AntA_4    \t\t\t\t0xb04\n#define\t\trConfig_Pmpd_AntA \t\t\t0xb28\n#define\t\trConfig_ram64x16\t\t\t\t0xb2c\n\n#define\t\trConfig_AntA \t\t\t\t\t0xb68\n#define\t\trConfig_AntB \t\t\t\t\t0xb6c\n#define\t\trPdp_AntB \t\t\t\t\t0xb70\n#define\t\trPdp_AntB_4 \t\t\t\t\t0xb74\n#define\t\trConfig_Pmpd_AntB\t\t\t0xb98\n#define\t\trAPK\t\t\t\t\t\t\t0xbd8\n\n\n\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t\t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t\t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t\t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t\t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_RxHPParameter\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t0xcf4\n\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t0xd3c\n#define\t\trOFDM1_PseudoNoiseStateAB\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_A_Rate18_06\t\t\t0xe00\n#define\t\trTxAGC_A_Rate54_24\t\t\t0xe04\n#define\t\trTxAGC_A_CCK1_Mcs32\t\t\t0xe08\n#define\t\trTxAGC_A_Mcs03_Mcs00\t\t0xe10\n#define\t\trTxAGC_A_Mcs07_Mcs04\t\t0xe14\n#define\t\trTxAGC_A_Mcs11_Mcs08\t\t0xe18\n#define\t\trTxAGC_A_Mcs15_Mcs12\t\t0xe1c\n\n#define\t\trTxAGC_B_Rate18_06\t\t\t0x830\n#define\t\trTxAGC_B_Rate54_24\t\t\t0x834\n#define\t\trTxAGC_B_CCK1_55_Mcs32\t\t0x838\n#define\t\trTxAGC_B_Mcs03_Mcs00\t\t0x83c\n#define\t\trTxAGC_B_Mcs07_Mcs04\t\t0x848\n#define\t\trTxAGC_B_Mcs11_Mcs08\t\t0x84c\n#define\t\trTxAGC_B_Mcs15_Mcs12\t\t0x868\n#define\t\trTxAGC_B_CCK11_A_CCK2_11\t\t0x86c\n\n#define\t\trFPGA0_IQK\t\t\t\t\t0xe28\n#define\t\trTx_IQK_Tone_A\t\t\t\t0xe30\n#define\t\trRx_IQK_Tone_A\t\t\t\t0xe34\n#define\t\trTx_IQK_PI_A\t\t\t\t\t0xe38\n#define\t\trRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n#define\t\trTx_IQK \t\t\t\t\t\t0xe40\n#define\t\trRx_IQK\t\t\t\t\t\t0xe44\n#define\t\trIQK_AGC_Pts\t\t\t\t\t0xe48\n#define\t\trIQK_AGC_Rsp\t\t\t\t\t0xe4c\n#define\t\trTx_IQK_Tone_B\t\t\t\t0xe50\n#define\t\trRx_IQK_Tone_B\t\t\t\t0xe54\n#define\t\trTx_IQK_PI_B\t\t\t\t\t0xe58\n#define\t\trRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define\t\trIQK_AGC_Cont\t\t\t\t0xe60\n\n#define\t\trBlue_Tooth\t\t\t\t\t0xe6c\n#define\t\trRx_Wait_CCA\t\t\t\t\t0xe70\n#define\t\trTx_CCK_RFON\t\t\t\t\t0xe74\n#define\t\trTx_CCK_BBON\t\t\t\t0xe78\n#define\t\trTx_OFDM_RFON\t\t\t\t0xe7c\n#define\t\trTx_OFDM_BBON\t\t\t\t0xe80\n#define\t\trTx_To_Rx\t\t\t\t\t0xe84\n#define\t\trTx_To_Tx\t\t\t\t\t0xe88\n#define\t\trRx_CCK\t\t\t\t\t\t0xe8c\n\n#define\t\trTx_Power_Before_IQK_A\t\t0xe94\n#define\t\trTx_Power_After_IQK_A\t\t\t0xe9c\n\n#define\t\trRx_Power_Before_IQK_A\t\t0xea0\n#define\t\trRx_Power_Before_IQK_A_2\t\t0xea4\n#define\t\trRx_Power_After_IQK_A\t\t\t0xea8\n#define\t\trRx_Power_After_IQK_A_2\t\t0xeac\n\n#define\t\trTx_Power_Before_IQK_B\t\t0xeb4\n#define\t\trTx_Power_After_IQK_B\t\t\t0xebc\n\n#define\t\trRx_Power_Before_IQK_B\t\t0xec0\n#define\t\trRx_Power_Before_IQK_B_2\t\t0xec4\n#define\t\trRx_Power_After_IQK_B\t\t\t0xec8\n#define\t\trRx_Power_After_IQK_B_2\t\t0xecc\n\n#define\t\trRx_OFDM\t\t\t\t\t0xed0\n#define\t\trRx_Wait_RIFS \t\t\t\t0xed4\n#define\t\trRx_TO_Rx \t\t\t\t\t0xed8\n#define\t\trStandby \t\t\t\t\t\t0xedc\n#define\t\trSleep \t\t\t\t\t\t0xee0\n#define\t\trPMPD_ANAEN\t\t\t\t0xeec\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t\t0x02\t// \n\n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t\t0x08\t// \n#define\t\tRF_IPA_G\t\t\t\t\t\t0x09\t// \n#define\t\tRF_TXBIAS_G\t\t\t\t\t0x0A\n#define\t\tRF_TXPA_AG\t\t\t\t\t0x0B\n#define\t\tRF_IPA_A\t\t\t\t\t\t0x0C\t// \n#define\t\tRF_TXBIAS_A\t\t\t\t\t0x0D\n#define\t\tRF_BS_PA_APSET_G9_G11\t\t0x0E\n#define\t\tRF_BS_IQGEN\t\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16\n#define\t\tRF_POW_ABILITY\t\t\t\t0x17\t// \n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER_8192E\t\t\t0x42\t// \n#define\t\tRF_T_METER_88E\t\t\t\t0x42\t//\n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n//#endif\n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define\t\tRF_TX_BIAS_A\t\t\t\t\t0x35\n#define\t\tRF_TX_BIAS_D\t\t\t\t\t0x36\n#define\t\tRF_LOBF_9\t\t\t\t\t0x38\n#define\t\tRF_RXRF_A3\t\t\t\t\t0x3C\t//\t\n#define\t\tRF_TRSW\t\t\t\t\t\t0x3F\n\n#define\t\tRF_TXRF_A2\t\t\t\t\t0x41\n#define\t\tRF_TXPA_G4\t\t\t\t\t0x46\t\n#define\t\tRF_TXPA_A4\t\t\t\t\t0x4B\t\n#define \t\tRF_0x52\t\t\t\t\t\t0x52\n#define \t\tRF_LDO\t\t\t\t\t\t0xB1\n#define\t\tRF_WE_LUT\t\t\t\t\t0xEF\t\n\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n#define\t\tRF_TX_GAIN_OFFSET_8192E(_val)\t\t((abs((_val)) << 1) | (((_val) > 0) ? BIT0 : 0))\n\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t\t0x3f\n\n#define\t\tbAntennaSelect                 \t\t\t0x0300\n\n#define\t\tbXBTxAGC                  \t\t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t\t0xf80000\n#define\t\tbContTxHSSI               \t\t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t\t0x200\n#define\t\tbAGCAddress               \t\t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t\t0xc0000\n#define\t\tbAGCTxCode                \t\t\t0xc00000\n#define\t\tbAGCRxCode                \t\t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t0x40000\n#define\t\tbAD7InputCMMode           \t0x380000\n#define\t\tbAD7Current               \t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t\t0x10\n#define\t\tbAntNonHT           \t      \t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode                \t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving         \t\t0x80\n#define\t\tbCCKRxPowerSaving         \t\t0x40\n\n#define\t\tbCCKSideBand              \t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble              \t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity    \t\t      \t0x8000\n#define\t\tbCCKCarrierRecovery   \t    \t0x4000\n#define\t\tbCCKTxRate           \t\t     \t0x3000\n#define\t\tbCCKDCCancel             \t \t0x0800\n#define\t\tbCCKISICancel             \t\t0x0400\n#define\t\tbCCKMatchFilter           \t\t0x0200\n#define\t\tbCCKEqualizer             \t\t0x0100\n#define\t\tbCCKPreambleDetect       \t \t0x800000\n#define\t\tbCCKFastFalseCCA          \t\t0x400000\n#define\t\tbCCKChEstStart            \t\t0x300000\n#define\t\tbCCKCCACount              \t\t0x080000\n#define\t\tbCCKcs_lim                \t\t\t0x070000\n#define\t\tbCCKBistMode              \t\t0x80000000\n#define\t\tbCCKCCAMask             \t  \t0x40000000\n#define\t\tbCCKTxDACPhase         \t   \t0x4\n#define\t\tbCCKRxADCPhase         \t   \t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0         \t   \t0x0100\n#define\t\tbCCKTxDCOffset           \t \t0xf0\n#define\t\tbCCKRxDCOffset           \t \t0xf\n#define\t\tbCCKCCAMode              \t \t0xc000\n#define\t\tbCCKFalseCS_lim           \t\t0x3f00\n#define\t\tbCCKCS_ratio              \t\t0xc00000\n#define\t\tbCCKCorgBit_sel           \t\t0x300000\n#define\t\tbCCKPD_lim                \t\t0x0f0000\n#define\t\tbCCKNewCCA                \t\t0x80000000\n#define\t\tbCCKRxHPofIG              \t\t0x8000\n#define\t\tbCCKRxIG                  \t\t\t0x7f00\n#define\t\tbCCKLNAPolarity           \t\t0x800000\n#define\t\tbCCKRx1stGain             \t\t0x7f0000\n#define\t\tbCCKRFExtend              \t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel        \t \t0x1f000000\n#define\t\tbCCKRxAGCSatCount       \t  \t0xe0\n#define\t\tbCCKRxRFSettle            \t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC           \t \t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity      \t \t0x2000\n#define\t\tbCCKTxFilterType          \t\t0x0c00\n#define\t\tbCCKRxAGCReportType   \t   \t0x0300\n#define\t\tbCCKRxDAGCEn              \t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod        \t  \t0x20000000\n#define\t\tbCCKRxDAGCSatLevel     \t   \t0x1f000000\n#define\t\tbCCKTimingRecovery       \t \t0x800000\n#define\t\tbCCKTxC0                  \t\t\t0x3f0000\n#define\t\tbCCKTxC1                  \t\t\t0x3f000000\n#define\t\tbCCKTxC2                  \t\t\t0x3f\n#define\t\tbCCKTxC3                  \t\t\t0x3f00\n#define\t\tbCCKTxC4                  \t\t\t0x3f0000\n#define\t\tbCCKTxC5                  \t\t\t0x3f000000\n#define\t\tbCCKTxC6                  \t\t\t0x3f\n#define\t\tbCCKTxC7                  \t\t\t0x3f00\n#define\t\tbCCKDebugPort             \t\t0xff0000\n#define\t\tbCCKDACDebug              \t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable      \t0x8000\n#define\t\tbCCKFalseAlarmRead        \t0x4000\n#define\t\tbCCKTRSSI                 \t\t\t0x7f\n#define\t\tbCCKRxAGCReport           \t\t0xfe\n#define\t\tbCCKRxReport_AntSel       \t0x80000000\n#define\t\tbCCKRxReport_MFOff        \t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss     \t0x20000000\n#define\t\tbCCKRxReport_Pktloss      \t0x10000000\n#define\t\tbCCKRxReport_Lockedbit    \t0x08000000\n#define\t\tbCCKRxReport_RateError    \t0x04000000\n#define\t\tbCCKRxReport_RxRate       \t0x03000000\n#define\t\tbCCKRxFACounterLower      \t0xff\n#define\t\tbCCKRxFACounterUpper      \t0xff000000\n#define\t\tbCCKRxHPAGCStart          \t\t0xe000\n#define\t\tbCCKRxHPAGCFinal          \t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable    \t0x8000\n#define\t\tbCCKFACounterFreeze       \t0x4000       \t\t\n#define\t\tbCCKTxPathSel             \t\t0x10000000\n#define\t\tbCCKDefaultRxPath         \t\t0xc000000\n#define\t\tbCCKOptionRxPath          \t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF                \t\t\t0x3\t// Useless\n#define\t\tbShift_L                 \t\t\t0xc0\n#define\t\tbGI_TH                   \t\t\t0xc\n#define\t\tbRxPathA                 \t\t\t0x1\n#define\t\tbRxPathB                 \t\t\t0x2\n#define\t\tbRxPathC                 \t\t\t0x4\n#define\t\tbRxPathD                 \t\t\t0x8\n#define\t\tbTxPathA                 \t\t\t0x1\n#define\t\tbTxPathB                 \t\t\t0x2\n#define\t\tbTxPathC                 \t\t\t0x4\n#define\t\tbTxPathD                 \t\t\t0x8\n#define\t\tbTRSSIFreq               \t\t\t0x200\n#define\t\tbADCBackoff              \t\t\t0x3000\n#define\t\tbDFIRBackoff             \t\t\t0xc000\n#define\t\tbTRSSILatchPhase         \t\t0x10000\n#define\t\tbRxIDCOffset             \t\t\t0xff\n#define\t\tbRxQDCOffset             \t\t0xff00\n#define\t\tbRxDFIRMode              \t\t0x1800000\n#define\t\tbRxDCNFType              \t\t0xe000000\n#define\t\tbRXIQImb_A               \t\t0x3ff\n#define\t\tbRXIQImb_B               \t\t\t0xfc00\n#define\t\tbRXIQImb_C               \t\t\t0x3f0000\n#define\t\tbRXIQImb_D               \t\t0xffc00000\n#define\t\tbDC_dc_Notch             \t\t0x60000\n#define\t\tbRxNBINotch              \t\t0x1f000000\n#define\t\tbPD_TH                   \t\t\t0xf\n#define\t\tbPD_TH_Opt2              \t\t0xc000\n#define\t\tbPWED_TH                 \t\t\t0x700\n#define\t\tbIfMF_Win_L              \t\t0x800\n#define\t\tbPD_Option               \t\t\t0x1000\n#define\t\tbMF_Win_L                \t\t\t0xe000\n#define\t\tbBW_Search_L             \t\t0x30000\n#define\t\tbwin_enh_L               \t\t\t0xc0000\n#define\t\tbBW_TH                   \t\t\t0x700000\n#define\t\tbED_TH2                  \t\t\t0x3800000\n#define\t\tbBW_option               \t\t\t0x4000000\n#define\t\tbRatio_TH                \t\t\t0x18000000\n#define\t\tbWindow_L                \t\t\t0xe0000000\n#define\t\tbSBD_Option              \t\t0x1\n#define\t\tbFrame_TH                \t\t\t0x1c\n#define\t\tbFS_Option               \t\t\t0x60\n#define\t\tbDC_Slope_check          \t\t0x80\n#define\t\tbFGuard_Counter_DC_L     \t0xe00\n#define\t\tbFrame_Weight_Short      \t0x7000\n#define\t\tbSub_Tune                \t\t\t0xe00000\n#define\t\tbFrame_DC_Length         \t\t0xe000000\n#define\t\tbSBD_start_offset        \t\t0x30000000\n#define\t\tbFrame_TH_2              \t\t0x7\n#define\t\tbFrame_GI2_TH            \t\t0x38\n#define\t\tbGI2_Sync_en             \t\t0x40\n#define\t\tbSarch_Short_Early       \t\t0x300\n#define\t\tbSarch_Short_Late        \t\t0xc00\n#define\t\tbSarch_GI2_Late          \t\t0x70000\n#define\t\tbCFOAntSum               \t\t0x1\n#define\t\tbCFOAcc                  \t\t\t0x2\n#define\t\tbCFOStartOffset          \t\t0xc\n#define\t\tbCFOLookBack             \t\t0x70\n#define\t\tbCFOSumWeight            \t\t0x80\n#define\t\tbDAGCEnable              \t\t0x10000\n#define\t\tbTXIQImb_A               \t\t\t0x3ff\n#define\t\tbTXIQImb_B               \t\t\t0xfc00\n#define\t\tbTXIQImb_C               \t\t\t0x3f0000\n#define\t\tbTXIQImb_D               \t\t\t0xffc00000\n#define\t\tbTxIDCOffset             \t\t\t0xff\n#define\t\tbTxQDCOffset             \t\t0xff00\n#define\t\tbTxDFIRMode              \t\t0x10000\n#define\t\tbTxPesudoNoiseOn         \t\t0x4000000\n#define\t\tbTxPesudoNoise_A         \t\t0xff\n#define\t\tbTxPesudoNoise_B         \t\t0xff00\n#define\t\tbTxPesudoNoise_C         \t\t0xff0000\n#define\t\tbTxPesudoNoise_D         \t\t0xff000000\n#define\t\tbCCADropOption           \t\t0x20000\n#define\t\tbCCADropThres            \t\t0xfff00000\n#define\t\tbEDCCA_H                 \t\t\t0xf\n#define\t\tbEDCCA_L                 \t\t\t0xf0\n#define\t\tbLambda_ED               \t\t0x300\n#define\t\tbRxInitialGain           \t\t\t0x7f\n#define\t\tbRxAntDivEn              \t\t0x80\n#define\t\tbRxAGCAddressForLNA      \t0x7f00\n#define\t\tbRxHighPowerFlow         \t\t0x8000\n#define\t\tbRxAGCFreezeThres        \t\t0xc0000\n#define\t\tbRxFreezeStep_AGC1       \t0x300000\n#define\t\tbRxFreezeStep_AGC2       \t0xc00000\n#define\t\tbRxFreezeStep_AGC3       \t0x3000000\n#define\t\tbRxFreezeStep_AGC0       \t0xc000000\n#define\t\tbRxRssi_Cmp_En           \t\t0x10000000\n#define\t\tbRxQuickAGCEn            \t\t0x20000000\n#define\t\tbRxAGCFreezeThresMode    \t0x40000000\n#define\t\tbRxOverFlowCheckType     \t0x80000000\n#define\t\tbRxAGCShift              \t\t\t0x7f\n#define\t\tbTRSW_Tri_Only           \t\t0x80\n#define\t\tbPowerThres              \t\t0x300\n#define\t\tbRxAGCEn                 \t\t\t0x1\n#define\t\tbRxAGCTogetherEn         \t\t0x2\n#define\t\tbRxAGCMin                \t\t0x4\n#define\t\tbRxHP_Ini                \t\t\t0x7\n#define\t\tbRxHP_TRLNA              \t\t0x70\n#define\t\tbRxHP_RSSI               \t\t\t0x700\n#define\t\tbRxHP_BBP1               \t\t0x7000\n#define\t\tbRxHP_BBP2               \t\t0x70000\n#define\t\tbRxHP_BBP3               \t\t0x700000\n#define\t\tbRSSI_H                  \t\t\t0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen                \t\t\t0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW           \t\t0x7\n#define\t\tbRxSettle_LNA            \t\t0x38\n#define\t\tbRxSettle_RSSI           \t\t0x1c0\n#define\t\tbRxSettle_BBP            \t\t0xe00\n#define\t\tbRxSettle_RxHP           \t\t0x7000\n#define\t\tbRxSettle_AntSW_RSSI     \t0x38000\n#define\t\tbRxSettle_AntSW          \t\t0xc0000\n#define\t\tbRxProcessTime_DAGC      \t0x300000\n#define\t\tbRxSettle_HSSI           \t\t0x400000\n#define\t\tbRxProcessTime_BBPPW     \t0x800000\n#define\t\tbRxAntennaPowerShift     \t0x3000000\n#define\t\tbRSSITableSelect         \t\t0xc000000\n#define\t\tbRxHP_Final              \t\t\t0x7000000\n#define\t\tbRxHTSettle_BBP          \t\t0x7\n#define\t\tbRxHTSettle_HSSI         \t\t0x8\n#define\t\tbRxHTSettle_RxHP         \t\t0x70\n#define\t\tbRxHTSettle_BBPPW        \t\t0x80\n#define\t\tbRxHTSettle_Idle         \t\t0x300\n#define\t\tbRxHTSettle_Reserved     \t0x1c00\n#define\t\tbRxHTRxHPEn              \t\t0x8000\n#define\t\tbRxHTAGCFreezeThres      \t0x30000\n#define\t\tbRxHTAGCTogetherEn       \t0x40000\n#define\t\tbRxHTAGCMin             \t \t0x80000\n#define\t\tbRxHTAGCEn               \t\t0x100000\n#define\t\tbRxHTDAGCEn              \t\t0x200000\n#define\t\tbRxHTRxHP_BBP            \t\t0x1c00000\n#define\t\tbRxHTRxHP_Final          \t\t0xe0000000\n#define\t\tbRxPWRatioTH             \t\t0x3\n#define\t\tbRxPWRatioEn             \t\t0x4\n#define\t\tbRxMFHold                \t\t\t0x3800\n#define\t\tbRxPD_Delay_TH1          \t\t0x38\n#define\t\tbRxPD_Delay_TH2          \t\t0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX       \t0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH           \t\t0x8000\n#define\t\tbRxProcess_Delay         \t\t0xf0000\n#define\t\tbRxSearchrange_GI2_Early \t0x700000\n#define\t\tbRxFrame_Guard_Counter_L \t0x3800000\n#define\t\tbRxSGI_Guard_L           \t\t0xc000000\n#define\t\tbRxSGI_Search_L          \t\t0x30000000\n#define\t\tbRxSGI_TH                \t\t\t0xc0000000\n#define\t\tbDFSCnt0                 \t\t\t0xff\n#define\t\tbDFSCnt1                 \t\t\t0xff00\n#define\t\tbDFSFlag                 \t\t\t0xf0000       \t\t\n#define\t\tbMFWeightSum             \t\t0x300000\n#define\t\tbMinIdxTH                \t\t\t0x7f000000       \t\t\n#define\t\tbDAFormat                \t\t\t0x40000       \t\t\n#define\t\tbTxChEmuEnable           \t\t0x01000000       \t\t\n#define\t\tbTRSWIsolation_A         \t\t0x7f\n#define\t\tbTRSWIsolation_B         \t\t0x7f00\n#define\t\tbTRSWIsolation_C         \t\t0x7f0000\n#define\t\tbTRSWIsolation_D         \t\t0x7f000000       \t\t\n#define\t\tbExtLNAGain              \t\t0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn                  \t\t\t0x4\t// Useless\n#define\t\tbAntennaMapping          \t\t0x10\n#define\t\tbNss                     \t\t\t0x20\n#define\t\tbCFOAntSumD              \t\t0x200\n#define\t\tbPHYCounterReset         \t\t0x8000000\n#define\t\tbCFOReportGet            \t\t0x4000000\n#define\t\tbOFDMContinueTx          \t\t0x10000000\n#define\t\tbOFDMSingleCarrier       \t\t0x20000000\n#define\t\tbOFDMSingleTone          \t\t0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect                \t\t\t0x100\n#define\t\tbCFOEn                   \t\t\t0x10000\n#define\t\tbCFOValue                \t\t\t0xfff00000\n#define\t\tbSigTone_Re              \t\t\t0x3f\n#define\t\tbSigTone_Im              \t\t\t0x7f00\n#define\t\tbCounter_CCA             \t\t0xffff\n#define\t\tbCounter_ParityFail      \t\t0xffff0000\n#define\t\tbCounter_RateIllegal     \t\t0xffff\n#define\t\tbCounter_CRC8Fail        \t\t0xffff0000\n#define\t\tbCounter_MCSNoSupport    \t0xffff\n#define\t\tbCounter_FastSync        \t\t0xffff\n#define\t\tbShortCFO                \t\t\t0xfff\n#define\t\tbShortCFOTLength         \t\t12   //total\n#define\t\tbShortCFOFLength         \t\t11   //fraction\n#define\t\tbLongCFO                 \t\t\t0x7ff\n#define\t\tbLongCFOTLength          \t\t11\n#define\t\tbLongCFOFLength          \t\t11\n#define\t\tbTailCFO                 \t\t\t0x1fff\n#define\t\tbTailCFOTLength          \t\t13\n#define\t\tbTailCFOFLength          \t\t12       \t\t\n#define\t\tbmax_en_pwdB             \t\t0xffff\n#define\t\tbCC_power_dB             \t\t0xffff0000\n#define\t\tbnoise_pwdB              \t\t0xffff\n#define\t\tbPowerMeasTLength        \t10\n#define\t\tbPowerMeasFLength        \t3\n#define\t\tbRx_HT_BW                \t\t0x1\n#define\t\tbRxSC                    \t\t\t0x6\n#define\t\tbRx_HT                   \t\t\t0x8       \t\t\n#define\t\tbNB_intf_det_on          \t\t0x1\n#define\t\tbIntf_win_len_cfg        \t\t0x30\n#define\t\tbNB_Intf_TH_cfg          \t\t0x1c0       \t\t\n#define\t\tbRFGain                  \t\t\t0x3f\n#define\t\tbTableSel                \t\t\t0x40\n#define\t\tbTRSW                    \t\t\t0x80       \t\t\n#define\t\tbRxSNR_A                 \t\t\t0xff\n#define\t\tbRxSNR_B                 \t\t\t0xff00\n#define\t\tbRxSNR_C                 \t\t\t0xff0000\n#define\t\tbRxSNR_D                 \t\t\t0xff000000\n#define\t\tbSNREVMTLength           \t\t8\n#define\t\tbSNREVMFLength           \t\t1       \t\t\n#define\t\tbCSI1st                  \t\t\t0xff\n#define\t\tbCSI2nd                  \t\t\t0xff00\n#define\t\tbRxEVM1st                \t\t\t0xff0000\n#define\t\tbRxEVM2nd                \t\t0xff000000       \t\t\n#define\t\tbSIGEVM                  \t\t\t0xff\n#define\t\tbPWDB                    \t\t\t0xff00\n#define\t\tbSGIEN                   \t\t\t0x10000\n       \t\t\n#define\t\tbSFactorQAM1             \t\t0xf\t// Useless\n#define\t\tbSFactorQAM2             \t\t0xf0\n#define\t\tbSFactorQAM3             \t\t0xf00\n#define\t\tbSFactorQAM4             \t\t0xf000\n#define\t\tbSFactorQAM5             \t\t0xf0000\n#define\t\tbSFactorQAM6             \t\t0xf0000\n#define\t\tbSFactorQAM7             \t\t0xf00000\n#define\t\tbSFactorQAM8             \t\t0xf000000\n#define\t\tbSFactorQAM9             \t\t0xf0000000\n#define\t\tbCSIScheme               \t\t\t0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet          \t\t0x3\t// Useless\n#define\t\tbChSmooth                \t\t\t0x4\n#define\t\tbChSmoothCfg1            \t\t0x38\n#define\t\tbChSmoothCfg2            \t\t0x1c0\n#define\t\tbChSmoothCfg3            \t\t0xe00\n#define\t\tbChSmoothCfg4            \t\t0x7000\n#define\t\tbMRCMode                 \t\t0x800000\n#define\t\tbTHEVMCfg                \t\t\t0x7000000\n       \t\t\n#define\t\tbLoopFitType             \t\t\t0x1\t// Useless\n#define\t\tbUpdCFO                  \t\t\t0x40\n#define\t\tbUpdCFOOffData           \t\t0x80\n#define\t\tbAdvUpdCFO               \t\t0x100\n#define\t\tbAdvTimeCtrl             \t\t0x800\n#define\t\tbUpdClko                 \t\t\t0x1000\n#define\t\tbFC                      \t\t\t\t0x6000\n#define\t\tbTrackingMode            \t\t0x8000\n#define\t\tbPhCmpEnable             \t\t0x10000\n#define\t\tbUpdClkoLTF              \t\t\t0x20000\n#define\t\tbComChCFO                \t\t0x40000\n#define\t\tbCSIEstiMode             \t\t0x80000\n#define\t\tbAdvUpdEqz               \t\t0x100000\n#define\t\tbUChCfg                  \t\t\t0x7000000\n#define\t\tbUpdEqz                  \t\t\t0x8000000\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn         \t\t0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A         \t\t0xff\n#define\t\tbRxPesudoNoise_B         \t\t0xff00\n#define\t\tbRxPesudoNoise_C         \t\t0xff0000\n#define\t\tbRxPesudoNoise_D         \t\t0xff000000\n#define\t\tbPesudoNoiseState_A      \t0xffff\n#define\t\tbPesudoNoiseState_B      \t0xffff0000\n#define\t\tbPesudoNoiseState_C      \t\t0xffff\n#define\t\tbPesudoNoiseState_D      \t0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable        \t\t0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl        \t\t0xc00\n#define\t\tbZebra1_TRxGainSetting    \t0x07f\n#define\t\tbZebra1_RxCorner          \t\t0xc00\n#define\t\tbZebra1_TxChargePump      \t0x38\n#define\t\tbZebra1_RxChargePump      \t0x7\n#define\t\tbZebra1_ChannelNum        \t0xf80\n#define\t\tbZebra1_TxLPFBW           \t\t0x400\n#define\t\tbZebra1_RxLPFBW           \t\t0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1      \t0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0      \t0x40\n#define\t\tbRTL8256_TxLPFBW          \t0x18\n#define\t\tbRTL8256_RxLPFBW          \t0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW          \t0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW          \t0xc00\n#define\t\tbRTL8258_RSSILPFBW        \t0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0                    \t\t\t0x1\t// Useless\n#define\t\tbByte1                    \t\t\t0x2\n#define\t\tbByte2                    \t\t\t0x4\n#define\t\tbByte3                    \t\t\t0x8\n#define\t\tbWord0                    \t\t\t0x3\n#define\t\tbWord1                    \t\t\t0xc\n#define\t\tbDWord                    \t\t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0                \t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1                \t\t0xff00\n#define\t\tbMaskByte2                \t\t0xff0000\n#define\t\tbMaskByte3                \t\t0xff000000\n#define\t\tbMaskHWord                \t\t0xffff0000\n#define\t\tbMaskLWord                \t\t0x0000ffff\n#define\t\tbMaskDWord                \t\t0xffffffff\n#define\t\tbMaskH3Bytes\t\t\t\t0xffffff00\n#define\t\tbMask12Bits\t\t\t\t0xfff\t\n#define\t\tbMaskH4Bits\t\t\t\t0xf0000000\t\n#define \t\tbMaskOFDM_D\t\t\t0xffc00000\n#define\t\tbMaskCCK\t\t\t\t0x3f3f3f3f\n\n//for PutRFRegsetting & GetRFRegSetting BitMask\n//#define\t\tbMask12Bits               0xfffff\t// RF Reg mask bits\n//#define\t\tbMask20Bits               0xfffff\t// RF Reg mask bits T65 RF\n#define \t\tbRFRegOffsetMask\t\t\t0xfffff\t\t\n  \t\t\n#define\t\tbEnable                   0x1\t// Useless\n#define\t\tbDisable                  0x0\n       \t\t\n#define\t\tLeftAntenna               \t\t\t0x0\t// Useless\n#define\t\tRightAntenna              \t\t0x1\n       \t\t\n#define\t\ttCheckTxStatus            \t\t500   //500ms // Useless\n#define\t\ttUpdateRxCounter          \t\t100   //100ms\n       \t\t\n#define\t\trateCCK     \t\t\t\t0\t// Useless\n#define\t\trateOFDM    \t\t\t\t1\n#define\t\trateHT      \t\t\t\t\t2\n\n//define Register-End\n#define\t\tbPMAC_End                 \t\t0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End             \t\t0x8ff\n#define\t\tbFPGAPHY1_End             \t\t0x9ff\n#define\t\tbCCKPHY0_End              \t\t0xaff\n#define\t\tbOFDMPHY0_End             \t\t0xcff\n#define\t\tbOFDMPHY1_End             \t\t0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl              \t\t0x0\t\t// Useless\n#define\t\tbWMACControl              \t\t0x1\n#define\t\tbWNICControl              \t\t0x2\n       \t\t\n#define\t\tPathA                     \t\t\t0x0\t// Useless\n#define\t\tPathB                     \t\t\t0x1\n#define\t\tPathC                     \t\t\t0x2\n#define\t\tPathD                     \t\t\t0x3\n\n\n// RSSI Dump Message \n#define\t\trA_RSSIDump_92E \t\t\t0xcb0\n#define\t\trB_RSSIDump_92E \t\t\t0xcb1\n#define\t\trS1_RXevmDump_92E\t\t\t0xcb2 \n#define\t\trS2_RXevmDump_92E\t\t\t0xcb3\n#define\t\trA_RXsnrDump_92E\t\t\t0xcb4\n#define\t\trB_RXsnrDump_92E\t\t\t0xcb5\n#define\t\trA_CfoShortDump_92E\t\t0xcb6 \n#define\t\trB_CfoShortDump_92E\t\t0xcb8\n#define   \trA_CfoLongDump_92E\t\t\t0xcba\n#define\t\trB_CfoLongDump_92E\t\t\t0xcbc\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n#endif\t//__INC_HAL8188EPHYREG_H\n\n"
  },
  {
    "path": "include/Hal8192EPwrSeq.h",
    "content": "#ifndef REALTEK_POWER_SEQUENCE_8192E\n#define REALTEK_POWER_SEQUENCE_8192E\n\n#include \"HalPwrSeqCmd.h\"\n/* \n\tCheck document WM-20110607-Paul-RTL8192E_Power_Architecture-R02.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8192E_TRANS_CARDEMU_TO_ACT_STEPS\t18\n#define\tRTL8192E_TRANS_ACT_TO_CARDEMU_STEPS\t18\n#define\tRTL8192E_TRANS_CARDEMU_TO_SUS_STEPS\t18\n#define\tRTL8192E_TRANS_SUS_TO_CARDEMU_STEPS\t18\n#define\tRTL8192E_TRANS_CARDEMU_TO_PDN_STEPS\t18\n#define\tRTL8192E_TRANS_PDN_TO_CARDEMU_STEPS\t18\n#define\tRTL8192E_TRANS_ACT_TO_LPS_STEPS\t23\n#define\tRTL8192E_TRANS_LPS_TO_ACT_STEPS\t23\t\n#define\tRTL8192E_TRANS_END_STEPS\t1\n\n\n#define RTL8192E_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t\\\n\n\t\n#define RTL8192E_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\n\n#define RTL8192E_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8192E_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8192E_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*Unlock small LDO Register*/\t\\\n\t{0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*Disable small LDO*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8192E_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*Enable small LDO*/\t\\\n\t{0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*Lock small LDO Register*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\\\n\n\n#define RTL8192E_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8192E_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8192E_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8192E_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM, For Repeatly In and out, Taggle bit should be changed*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\\\n\t{0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*Clear ISR*/\n \n#define RTL8192E_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8192E_power_on_flow[RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_radio_off_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_card_disable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_card_enable_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_suspend_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_resume_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_hwpdn_flow[RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS+RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_enter_lps_flow[RTL8192E_TRANS_ACT_TO_LPS_STEPS+RTL8192E_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8192E_leave_lps_flow[RTL8192E_TRANS_LPS_TO_ACT_STEPS+RTL8192E_TRANS_END_STEPS];\n\n#endif\n"
  },
  {
    "path": "include/Hal8703BPhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8703BPHYCFG_H__\n#define __INC_HAL8703BPHYCFG_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters End-------------------------------*/\n\n\n/*------------------------------Define structure----------------------------*/\n\n/*------------------------------Define structure End----------------------------*/\n\n/*--------------------------Exported Function prototype---------------------*/\nu32\nPHY_QueryBBReg_8703B(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask\n\t);\n\nVOID\nPHY_SetBBReg_8703B(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t);\n\nu32\nPHY_QueryRFReg_8703B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask\n\t);\n\nVOID\nPHY_SetRFReg_8703B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask,\n\tIN\tu32\t\t\t\tData\n\t);\n\n/* MAC/BB/RF HAL config */\nint PHY_BBConfig8703B(PADAPTER\tAdapter\t);\n\nint PHY_RFConfig8703B(PADAPTER\tAdapter\t);\n\ns32 PHY_MACConfig8703B(PADAPTER padapter);\n\nint\nPHY_ConfigRFWithParaFile_8703B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8* \t\t\t\tpFileName,\n\tRF_PATH\t\t\t\teRFPath\n);\n\nVOID\nPHY_SetTxPowerIndex_8703B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\t\tRate\n\t);\n\nu8\nPHY_GetTxPowerIndex_8703B(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\nVOID\t\nPHY_GetTxPowerLevel8703B(\t\t\t\n\tIN\tPADAPTER\t\tAdapter,\n\tOUT s32*\t\t    \t\tpowerlevel\t\n\t);\n\nVOID\nPHY_SetTxPowerLevel8703B(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tchannel\n\t);\n\nVOID\nPHY_SetBWMode8703B(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\t\tBandwidth,\t// 20M or 40M\n\tIN\tunsigned char\t\t\t\tOffset\t\t// Upper, Lower, or Don't care\n);\n\nVOID\nPHY_SwChnl8703B(\t// Call after initialization\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tchannel\n\t);\n\nVOID\nPHY_SetSwChnlBWMode8703B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n/*--------------------------Exported Function prototype End---------------------*/\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8703BPhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8703BPHYREG_H__\n#define __INC_HAL8703BPHYREG_H__\n\n#define\t\trSYM_WLBT_PAPE_SEL\t\t0x64\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t\t0x18c\n\n//\n// 2. Page2(0x200)\n//\n// The following two definition are only used for USB interface.\n#define\t\tRF_BB_CMD_ADDR\t\t\t\t0x02c0\t// RF/BB read/write command address.\n#define\t\tRF_BB_CMD_DATA\t\t\t\t0x02c4\t// RF/BB read/write command data.\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t0x814\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n#define\t\trTxAGC_B_Rate18_06\t\t\t\t0x830\n#define\t\trTxAGC_B_Rate54_24\t\t\t\t0x834\n#define\t\trTxAGC_B_CCK1_55_Mcs32\t\t0x838\n#define\t\trTxAGC_B_Mcs03_Mcs00\t\t\t0x83c\n\n#define\t\trTxAGC_B_Mcs07_Mcs04\t\t\t0x848\n#define\t\trTxAGC_B_Mcs11_Mcs08\t\t\t0x84c\n\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define\t\trFPGA0_RFWakeUpParameter\t\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n\n#define\t\trTxAGC_B_Mcs15_Mcs12\t\t\t0x868\n#define\t\trTxAGC_B_CCK11_A_CCK2_11\t\t0x86c\n\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\t// Useless now\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\tTransceiverA_HSPI_Readback\t0x8b8\t// Transceiver A HSPI Readback\n#define\t\tTransceiverB_HSPI_Readback\t0x8bc\t// Transceiver B HSPI Readback\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n#define\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\trFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n#define\trDPDT_control\t\t\t\t0x92c\n#define\trfe_ctrl_anta_src\t\t\t\t0x930\n#define\trS0S1_PathSwitch   \t\t\t0x948\n#define\trBBrx_DFIR\t\t\t\t\t0x954\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t0xa50\n#define\t\trCCK0_RxReport            \t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t0xa58  //0xa5c\n\n//\n// PageB(0xB00)\n//\n#define rPdp_AntA\t\t\t\t\t\t0xb00\n#define rPdp_AntA_4\t\t\t\t\t\t0xb04\n#define rPdp_AntA_8\t\t\t\t\t\t0xb08\n#define rPdp_AntA_C\t\t\t\t\t\t0xb0c\n#define rPdp_AntA_10\t\t\t\t\t0xb10\n#define rPdp_AntA_14\t\t\t\t\t0xb14\n#define rPdp_AntA_18\t\t\t\t\t0xb18\n#define rPdp_AntA_1C\t\t\t\t\t0xb1c\n#define rPdp_AntA_20\t\t\t\t\t0xb20\n#define rPdp_AntA_24\t\t\t\t\t0xb24\n\n#define rConfig_Pmpd_AntA \t\t\t\t0xb28\n#define rConfig_ram64x16\t\t\t\t0xb2c\n\n#define rBndA\t\t\t\t\t\t\t0xb30\n#define rHssiPar\t\t\t\t\t\t0xb34\n\n#define rConfig_AntA\t\t\t\t\t0xb68\n#define rConfig_AntB\t\t\t\t\t0xb6c\n\n#define rPdp_AntB\t\t\t\t\t\t0xb70\n#define rPdp_AntB_4\t\t\t\t\t\t0xb74\n#define rPdp_AntB_8\t\t\t\t\t\t0xb78\n#define rPdp_AntB_C\t\t\t\t\t\t0xb7c\n#define rPdp_AntB_10\t\t\t\t\t0xb80\n#define rPdp_AntB_14\t\t\t\t\t0xb84\n#define rPdp_AntB_18\t\t\t\t\t0xb88\n#define rPdp_AntB_1C\t\t\t\t\t0xb8c\n#define rPdp_AntB_20\t\t\t\t\t0xb90\n#define rPdp_AntB_24\t\t\t\t\t0xb94\n\n#define rConfig_Pmpd_AntB\t\t\t\t0xb98\n\n#define rBndB\t\t\t\t\t\t\t0xba0\n\n#define rAPK\t\t\t\t\t\t\t0xbd8\n#define rPm_Rx0_AntA\t\t\t\t\t0xbdc\n#define rPm_Rx1_AntA\t\t\t\t\t0xbe0\n#define rPm_Rx2_AntA\t\t\t\t\t0xbe4\n#define rPm_Rx3_AntA\t\t\t\t\t0xbe8\n#define rPm_Rx0_AntB\t\t\t\t\t0xbec\n#define rPm_Rx1_AntB\t\t\t\t\t0xbf0\n#define rPm_Rx2_AntB\t\t\t\t\t0xbf4\n#define rPm_Rx3_AntB\t\t\t\t\t0xbf8\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define\t\trOFDM0_RxHPParameter\t\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t\t0xcf4\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t\t0xd3c\n#define\t\trOFDM1_PseudoNoiseStateAB\t\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_A_Rate18_06\t\t\t0xe00\n#define\t\trTxAGC_A_Rate54_24\t\t\t0xe04\n#define\t\trTxAGC_A_CCK1_Mcs32\t\t\t0xe08\n#define\t\trTxAGC_A_Mcs03_Mcs00\t\t\t0xe10\n#define\t\trTxAGC_A_Mcs07_Mcs04\t\t\t0xe14\n#define\t\trTxAGC_A_Mcs11_Mcs08\t\t\t0xe18\n#define\t\trTxAGC_A_Mcs15_Mcs12\t\t\t0xe1c\n\n#define\t\trFPGA0_IQK\t\t\t\t\t0xe28\n#define\t\trTx_IQK_Tone_A\t\t\t\t0xe30\n#define\t\trRx_IQK_Tone_A\t\t\t\t0xe34\n#define\t\trTx_IQK_PI_A\t\t\t\t\t0xe38\n#define\t\trRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n#define\t\trTx_IQK \t\t\t\t\t\t0xe40\n#define\t\trRx_IQK\t\t\t\t\t\t0xe44\n#define\t\trIQK_AGC_Pts\t\t\t\t\t0xe48\n#define\t\trIQK_AGC_Rsp\t\t\t\t\t0xe4c\n#define\t\trTx_IQK_Tone_B\t\t\t\t0xe50\n#define\t\trRx_IQK_Tone_B\t\t\t\t0xe54\n#define\t\trTx_IQK_PI_B\t\t\t\t\t0xe58\n#define\t\trRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define\t\trIQK_AGC_Cont\t\t\t\t0xe60\n\n#define\t\trBlue_Tooth\t\t\t\t\t0xe6c\n#define\t\trRx_Wait_CCA\t\t\t\t\t0xe70\n#define\t\trTx_CCK_RFON\t\t\t\t\t0xe74\n#define\t\trTx_CCK_BBON\t\t\t\t0xe78\n#define\t\trTx_OFDM_RFON\t\t\t\t0xe7c\n#define\t\trTx_OFDM_BBON\t\t\t\t0xe80\n#define\t\trTx_To_Rx\t\t\t\t\t0xe84\n#define\t\trTx_To_Tx\t\t\t\t\t0xe88\n#define\t\trRx_CCK\t\t\t\t\t\t0xe8c\n\n#define\t\trTx_Power_Before_IQK_A\t\t0xe94\n#define\t\trTx_Power_After_IQK_A\t\t\t0xe9c\n\n#define\t\trRx_Power_Before_IQK_A\t\t0xea0\n#define\t\trRx_Power_Before_IQK_A_2\t\t0xea4\n#define\t\trRx_Power_After_IQK_A\t\t\t0xea8\n#define\t\trRx_Power_After_IQK_A_2\t\t0xeac\n\n#define\t\trTx_Power_Before_IQK_B\t\t0xeb4\n#define\t\trTx_Power_After_IQK_B\t\t\t0xebc\n\n#define\t\trRx_Power_Before_IQK_B\t\t0xec0\n#define\t\trRx_Power_Before_IQK_B_2\t\t0xec4\n#define\t\trRx_Power_After_IQK_B\t\t\t0xec8\n#define\t\trRx_Power_After_IQK_B_2\t\t0xecc\n\n#define\t\trRx_OFDM\t\t\t\t\t0xed0\n#define\t\trRx_Wait_RIFS \t\t\t\t0xed4\n#define\t\trRx_TO_Rx \t\t\t\t\t0xed8\n#define\t\trStandby \t\t\t\t\t\t0xedc\n#define\t\trSleep \t\t\t\t\t\t0xee0\n#define\t\trPMPD_ANAEN\t\t\t\t0xeec\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t0x02\t// \n#define\t\tRF_BS_PA_APSET_G1_G4\t\t0x03\n#define\t\tRF_BS_PA_APSET_G5_G8\t\t0x04\n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t0x08\t// \n#define\t\tRF_IPA_G\t\t\t\t\t0x09\t// \n#define\t\tRF_TXBIAS_G\t\t\t\t0x0A\n#define\t\tRF_TXPA_AG\t\t\t\t\t0x0B\n#define\t\tRF_IPA_A\t\t\t\t\t0x0C\t// \n#define\t\tRF_TXBIAS_A\t\t\t\t0x0D\n#define\t\tRF_BS_PA_APSET_G9_G11\t0x0E\n#define\t\tRF_BS_IQGEN\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16 //\n#define\t\tRF_POW_ABILITY\t\t\t0x17\t// \n#define\t\tRF_MODE_AG\t\t\t\t0x18\t// \n#define\t\trRfChannel\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define \tRF_TX_BIAS_A\t\t\t\t0x35\n#define \tRF_TX_BIAS_D\t\t\t\t0x36\n#define \tRF_LOBF_9\t\t\t\t\t0x38\n#define \tRF_RXRF_A3\t\t\t\t\t0x3C\t//\t\n#define \tRF_TRSW \t\t\t\t\t0x3F\n\n#define \tRF_TXRF_A2\t\t\t\t\t0x41\n#define \tRF_TXPA_G4\t\t\t\t\t0x46\t\n#define \tRF_TXPA_A4\t\t\t\t\t0x4B\t\n#define \tRF_0x52 \t\t\t\t\t0x52\n#define \tRF_WE_LUT\t\t\t\t\t0xEF\t\n#define \tRF_S0S1 \t\t\t\t\t0xB0\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n#define\tRF_TX_GAIN_OFFSET_8703B(_val) (abs((_val)) | (((_val) > 0) ? BIT5 : 0))\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t0x3f\n\n#define\t\tbAntennaSelect                 \t\t0x0300\n\n#define\t\tbXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t0xf80000\n#define\t\tbContTxHSSI               \t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t0x200\n#define\t\tbAGCAddress               \t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t0xc0000\n#define\t\tbAGCTxCode                \t\t0xc00000\n#define\t\tbAGCRxCode                \t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t\t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t\t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t\t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t\t0x40000\n#define\t\tbAD7InputCMMode           \t\t0x380000\n#define\t\tbAD7Current               \t\t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t\t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t\t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t\t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t0x10\n#define\t\tbAntNonHT           \t      \t\t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode\t\t\t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving\t\t0x80\n#define\t\tbCCKRxPowerSaving\t\t0x40\n\n#define\t\tbCCKSideBand\t\t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble\t\t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity\t\t0x8000\n#define\t\tbCCKCarrierRecovery\t\t0x4000\n#define\t\tbCCKTxRate\t\t\t\t0x3000\n#define\t\tbCCKDCCancel\t\t\t0x0800\n#define\t\tbCCKISICancel\t\t\t0x0400\n#define\t\tbCCKMatchFilter\t\t\t0x0200\n#define\t\tbCCKEqualizer\t\t\t0x0100\n#define\t\tbCCKPreambleDetect\t\t0x800000\n#define\t\tbCCKFastFalseCCA\t\t0x400000\n#define\t\tbCCKChEstStart\t\t\t0x300000\n#define\t\tbCCKCCACount\t\t\t0x080000\n#define\t\tbCCKcs_lim\t\t\t\t0x070000\n#define\t\tbCCKBistMode\t\t\t0x80000000\n#define\t\tbCCKCCAMask\t\t\t0x40000000\n#define\t\tbCCKTxDACPhase\t\t0x4\n#define\t\tbCCKRxADCPhase\t\t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0\t\t0x0100\n#define\t\tbCCKTxDCOffset\t\t\t0xf0\n#define\t\tbCCKRxDCOffset\t\t\t0xf\n#define\t\tbCCKCCAMode\t\t\t0xc000\n#define\t\tbCCKFalseCS_lim\t\t\t0x3f00\n#define\t\tbCCKCS_ratio\t\t\t0xc00000\n#define\t\tbCCKCorgBit_sel\t\t\t0x300000\n#define\t\tbCCKPD_lim\t\t\t\t0x0f0000\n#define\t\tbCCKNewCCA\t\t\t0x80000000\n#define\t\tbCCKRxHPofIG\t\t\t0x8000\n#define\t\tbCCKRxIG\t\t\t\t0x7f00\n#define\t\tbCCKLNAPolarity\t\t\t0x800000\n#define\t\tbCCKRx1stGain\t\t\t0x7f0000\n#define\t\tbCCKRFExtend\t\t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKRxAGCSatCount\t\t0xe0\n#define\t\tbCCKRxRFSettle\t\t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC\t\t\t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity\t\t0x2000\n#define\t\tbCCKTxFilterType\t\t0x0c00\n#define\t\tbCCKRxAGCReportType\t0x0300\n#define\t\tbCCKRxDAGCEn\t\t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod\t\t0x20000000\n#define\t\tbCCKRxDAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKTimingRecovery\t\t0x800000\n#define\t\tbCCKTxC0\t\t\t\t0x3f0000\n#define\t\tbCCKTxC1\t\t\t\t0x3f000000\n#define\t\tbCCKTxC2\t\t\t\t0x3f\n#define\t\tbCCKTxC3\t\t\t\t0x3f00\n#define\t\tbCCKTxC4\t\t\t\t0x3f0000\n#define\t\tbCCKTxC5\t\t\t\t0x3f000000\n#define\t\tbCCKTxC6\t\t\t\t0x3f\n#define\t\tbCCKTxC7\t\t\t\t0x3f00\n#define\t\tbCCKDebugPort\t\t\t0xff0000\n#define\t\tbCCKDACDebug\t\t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable\t0x8000\n#define\t\tbCCKFalseAlarmRead\t\t0x4000\n#define\t\tbCCKTRSSI\t\t\t\t0x7f\n#define\t\tbCCKRxAGCReport\t\t0xfe\n#define\t\tbCCKRxReport_AntSel\t0x80000000\n#define\t\tbCCKRxReport_MFOff\t\t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss\t0x20000000\n#define\t\tbCCKRxReport_Pktloss\t0x10000000\n#define\t\tbCCKRxReport_Lockedbit\t0x08000000\n#define\t\tbCCKRxReport_RateError\t0x04000000\n#define\t\tbCCKRxReport_RxRate\t0x03000000\n#define\t\tbCCKRxFACounterLower\t0xff\n#define\t\tbCCKRxFACounterUpper\t0xff000000\n#define\t\tbCCKRxHPAGCStart\t\t0xe000\n#define\t\tbCCKRxHPAGCFinal\t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable\t0x8000\n#define\t\tbCCKFACounterFreeze\t0x4000       \t\t\n#define\t\tbCCKTxPathSel\t\t\t0x10000000\n#define\t\tbCCKDefaultRxPath\t\t0xc000000\n#define\t\tbCCKOptionRxPath\t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF\t\t\t\t0x3\t// Useless\n#define\t\tbShift_L\t\t\t\t\t0xc0\n#define\t\tbGI_TH\t\t\t\t\t0xc\n#define\t\tbRxPathA\t\t\t\t0x1\n#define\t\tbRxPathB\t\t\t\t0x2\n#define\t\tbRxPathC\t\t\t\t0x4\n#define\t\tbRxPathD\t\t\t\t0x8\n#define\t\tbTxPathA\t\t\t\t0x1\n#define\t\tbTxPathB\t\t\t\t0x2\n#define\t\tbTxPathC\t\t\t\t0x4\n#define\t\tbTxPathD\t\t\t\t0x8\n#define\t\tbTRSSIFreq\t\t\t\t0x200\n#define\t\tbADCBackoff\t\t\t\t0x3000\n#define\t\tbDFIRBackoff\t\t\t0xc000\n#define\t\tbTRSSILatchPhase\t\t0x10000\n#define\t\tbRxIDCOffset\t\t\t0xff\n#define\t\tbRxQDCOffset\t\t\t0xff00\n#define\t\tbRxDFIRMode\t\t\t0x1800000\n#define\t\tbRxDCNFType\t\t\t0xe000000\n#define\t\tbRXIQImb_A\t\t\t\t0x3ff\n#define\t\tbRXIQImb_B\t\t\t\t0xfc00\n#define\t\tbRXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbRXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbDC_dc_Notch\t\t\t0x60000\n#define\t\tbRxNBINotch\t\t\t0x1f000000\n#define\t\tbPD_TH\t\t\t\t\t0xf\n#define\t\tbPD_TH_Opt2\t\t\t0xc000\n#define\t\tbPWED_TH\t\t\t\t0x700\n#define\t\tbIfMF_Win_L\t\t\t0x800\n#define\t\tbPD_Option\t\t\t\t0x1000\n#define\t\tbMF_Win_L\t\t\t\t0xe000\n#define\t\tbBW_Search_L\t\t\t0x30000\n#define\t\tbwin_enh_L\t\t\t\t0xc0000\n#define\t\tbBW_TH\t\t\t\t\t0x700000\n#define\t\tbED_TH2\t\t\t\t0x3800000\n#define\t\tbBW_option\t\t\t\t0x4000000\n#define\t\tbRatio_TH\t\t\t\t0x18000000\n#define\t\tbWindow_L\t\t\t\t0xe0000000\n#define\t\tbSBD_Option\t\t\t\t0x1\n#define\t\tbFrame_TH\t\t\t\t0x1c\n#define\t\tbFS_Option\t\t\t\t0x60\n#define\t\tbDC_Slope_check\t\t0x80\n#define\t\tbFGuard_Counter_DC_L\t0xe00\n#define\t\tbFrame_Weight_Short\t0x7000\n#define\t\tbSub_Tune\t\t\t\t0xe00000\n#define\t\tbFrame_DC_Length\t\t0xe000000\n#define\t\tbSBD_start_offset\t\t0x30000000\n#define\t\tbFrame_TH_2\t\t\t0x7\n#define\t\tbFrame_GI2_TH\t\t\t0x38\n#define\t\tbGI2_Sync_en\t\t\t0x40\n#define\t\tbSarch_Short_Early\t\t0x300\n#define\t\tbSarch_Short_Late\t\t0xc00\n#define\t\tbSarch_GI2_Late\t\t0x70000\n#define\t\tbCFOAntSum\t\t\t\t0x1\n#define\t\tbCFOAcc\t\t\t\t0x2\n#define\t\tbCFOStartOffset\t\t\t0xc\n#define\t\tbCFOLookBack\t\t\t0x70\n#define\t\tbCFOSumWeight\t\t\t0x80\n#define\t\tbDAGCEnable\t\t\t0x10000\n#define\t\tbTXIQImb_A\t\t\t\t0x3ff\n#define\t\tbTXIQImb_B\t\t\t\t0xfc00\n#define\t\tbTXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbTXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbTxIDCOffset\t\t\t0xff\n#define\t\tbTxQDCOffset\t\t\t0xff00\n#define\t\tbTxDFIRMode\t\t\t0x10000\n#define\t\tbTxPesudoNoiseOn\t\t0x4000000\n#define\t\tbTxPesudoNoise_A\t\t0xff\n#define\t\tbTxPesudoNoise_B\t\t0xff00\n#define\t\tbTxPesudoNoise_C\t\t0xff0000\n#define\t\tbTxPesudoNoise_D\t\t0xff000000\n#define\t\tbCCADropOption\t\t\t0x20000\n#define\t\tbCCADropThres\t\t\t0xfff00000\n#define\t\tbEDCCA_H\t\t\t\t0xf\n#define\t\tbEDCCA_L\t\t\t\t0xf0\n#define\t\tbLambda_ED\t\t\t0x300\n#define\t\tbRxInitialGain\t\t\t0x7f\n#define\t\tbRxAntDivEn\t\t\t\t0x80\n#define\t\tbRxAGCAddressForLNA\t0x7f00\n#define\t\tbRxHighPowerFlow\t\t0x8000\n#define\t\tbRxAGCFreezeThres\t\t0xc0000\n#define\t\tbRxFreezeStep_AGC1\t0x300000\n#define\t\tbRxFreezeStep_AGC2\t0xc00000\n#define\t\tbRxFreezeStep_AGC3\t0x3000000\n#define\t\tbRxFreezeStep_AGC0\t0xc000000\n#define\t\tbRxRssi_Cmp_En\t\t\t0x10000000\n#define\t\tbRxQuickAGCEn\t\t\t0x20000000\n#define\t\tbRxAGCFreezeThresMode\t0x40000000\n#define\t\tbRxOverFlowCheckType\t0x80000000\n#define\t\tbRxAGCShift\t\t\t\t0x7f\n#define\t\tbTRSW_Tri_Only\t\t\t0x80\n#define\t\tbPowerThres\t\t\t0x300\n#define\t\tbRxAGCEn\t\t\t\t0x1\n#define\t\tbRxAGCTogetherEn\t\t0x2\n#define\t\tbRxAGCMin\t\t\t\t0x4\n#define\t\tbRxHP_Ini\t\t\t\t0x7\n#define\t\tbRxHP_TRLNA\t\t\t0x70\n#define\t\tbRxHP_RSSI\t\t\t\t0x700\n#define\t\tbRxHP_BBP1\t\t\t\t0x7000\n#define\t\tbRxHP_BBP2\t\t\t\t0x70000\n#define\t\tbRxHP_BBP3\t\t\t\t0x700000\n#define\t\tbRSSI_H\t\t\t\t\t0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen\t\t\t\t0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW\t\t\t0x7\n#define\t\tbRxSettle_LNA\t\t\t0x38\n#define\t\tbRxSettle_RSSI\t\t\t0x1c0\n#define\t\tbRxSettle_BBP\t\t\t0xe00\n#define\t\tbRxSettle_RxHP\t\t\t0x7000\n#define\t\tbRxSettle_AntSW_RSSI\t0x38000\n#define\t\tbRxSettle_AntSW\t\t0xc0000\n#define\t\tbRxProcessTime_DAGC\t0x300000\n#define\t\tbRxSettle_HSSI\t\t\t0x400000\n#define\t\tbRxProcessTime_BBPPW\t0x800000\n#define\t\tbRxAntennaPowerShift\t0x3000000\n#define\t\tbRSSITableSelect\t\t0xc000000\n#define\t\tbRxHP_Final\t\t\t\t0x7000000\n#define\t\tbRxHTSettle_BBP\t\t\t0x7\n#define\t\tbRxHTSettle_HSSI\t\t0x8\n#define\t\tbRxHTSettle_RxHP\t\t0x70\n#define\t\tbRxHTSettle_BBPPW\t\t0x80\n#define\t\tbRxHTSettle_Idle\t\t0x300\n#define\t\tbRxHTSettle_Reserved\t0x1c00\n#define\t\tbRxHTRxHPEn\t\t\t0x8000\n#define\t\tbRxHTAGCFreezeThres\t0x30000\n#define\t\tbRxHTAGCTogetherEn\t0x40000\n#define\t\tbRxHTAGCMin\t\t\t0x80000\n#define\t\tbRxHTAGCEn\t\t\t\t0x100000\n#define\t\tbRxHTDAGCEn\t\t\t0x200000\n#define\t\tbRxHTRxHP_BBP\t\t\t0x1c00000\n#define\t\tbRxHTRxHP_Final\t\t0xe0000000\n#define\t\tbRxPWRatioTH\t\t\t0x3\n#define\t\tbRxPWRatioEn\t\t\t0x4\n#define\t\tbRxMFHold\t\t\t\t0x3800\n#define\t\tbRxPD_Delay_TH1\t\t0x38\n#define\t\tbRxPD_Delay_TH2\t\t0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX\t0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH\t\t\t0x8000\n#define\t\tbRxProcess_Delay\t\t0xf0000\n#define\t\tbRxSearchrange_GI2_Early\t0x700000\n#define\t\tbRxFrame_Guard_Counter_L\t0x3800000\n#define\t\tbRxSGI_Guard_L\t\t\t0xc000000\n#define\t\tbRxSGI_Search_L\t\t0x30000000\n#define\t\tbRxSGI_TH\t\t\t\t0xc0000000\n#define\t\tbDFSCnt0\t\t\t\t0xff\n#define\t\tbDFSCnt1\t\t\t\t0xff00\n#define\t\tbDFSFlag\t\t\t\t0xf0000       \t\t\n#define\t\tbMFWeightSum\t\t\t0x300000\n#define\t\tbMinIdxTH\t\t\t\t0x7f000000       \t\t\n#define\t\tbDAFormat\t\t\t\t0x40000       \t\t\n#define\t\tbTxChEmuEnable\t\t0x01000000       \t\t\n#define\t\tbTRSWIsolation_A\t\t0x7f\n#define\t\tbTRSWIsolation_B\t\t0x7f00\n#define\t\tbTRSWIsolation_C\t\t0x7f0000\n#define\t\tbTRSWIsolation_D\t\t0x7f000000       \t\t\n#define\t\tbExtLNAGain\t\t\t\t0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn\t\t\t\t0x4\t// Useless\n#define\t\tbAntennaMapping\t\t0x10\n#define\t\tbNss\t\t\t\t\t0x20\n#define\t\tbCFOAntSumD\t\t\t0x200\n#define\t\tbPHYCounterReset\t\t0x8000000\n#define\t\tbCFOReportGet\t\t\t0x4000000\n#define\t\tbOFDMContinueTx\t\t0x10000000\n#define\t\tbOFDMSingleCarrier\t\t0x20000000\n#define\t\tbOFDMSingleTone\t\t0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect\t\t\t0x100\n#define\t\tbCFOEn\t\t\t\t0x10000\n#define\t\tbCFOValue\t\t\t0xfff00000\n#define\t\tbSigTone_Re\t\t0x3f\n#define\t\tbSigTone_Im\t\t0x7f00\n#define\t\tbCounter_CCA\t\t0xffff\n#define\t\tbCounter_ParityFail\t0xffff0000\n#define\t\tbCounter_RateIllegal\t\t0xffff\n#define\t\tbCounter_CRC8Fail\t0xffff0000\n#define\t\tbCounter_MCSNoSupport\t0xffff\n#define\t\tbCounter_FastSync\t0xffff\n#define\t\tbShortCFO\t\t\t0xfff\n#define\t\tbShortCFOTLength\t12   //total\n#define\t\tbShortCFOFLength\t11   //fraction\n#define\t\tbLongCFO\t\t\t0x7ff\n#define\t\tbLongCFOTLength\t11\n#define\t\tbLongCFOFLength\t11\n#define\t\tbTailCFO\t\t\t0x1fff\n#define\t\tbTailCFOTLength\t\t13\n#define\t\tbTailCFOFLength\t\t12       \t\t\n#define\t\tbmax_en_pwdB\t\t0xffff\n#define\t\tbCC_power_dB\t\t0xffff0000\n#define\t\tbnoise_pwdB\t\t0xffff\n#define\t\tbPowerMeasTLength\t10\n#define\t\tbPowerMeasFLength\t3\n#define\t\tbRx_HT_BW\t\t\t0x1\n#define\t\tbRxSC\t\t\t\t0x6\n#define\t\tbRx_HT\t\t\t\t0x8       \t\t\n#define\t\tbNB_intf_det_on\t\t0x1\n#define\t\tbIntf_win_len_cfg\t0x30\n#define\t\tbNB_Intf_TH_cfg\t\t0x1c0       \t\t\n#define\t\tbRFGain\t\t\t\t0x3f\n#define\t\tbTableSel\t\t\t0x40\n#define\t\tbTRSW\t\t\t\t0x80       \t\t\n#define\t\tbRxSNR_A\t\t\t0xff\n#define\t\tbRxSNR_B\t\t\t0xff00\n#define\t\tbRxSNR_C\t\t\t0xff0000\n#define\t\tbRxSNR_D\t\t\t0xff000000\n#define\t\tbSNREVMTLength\t\t8\n#define\t\tbSNREVMFLength\t\t1       \t\t\n#define\t\tbCSI1st\t\t\t\t0xff\n#define\t\tbCSI2nd\t\t\t\t0xff00\n#define\t\tbRxEVM1st\t\t\t0xff0000\n#define\t\tbRxEVM2nd\t\t\t0xff000000       \t\t\n#define\t\tbSIGEVM\t\t\t0xff\n#define\t\tbPWDB\t\t\t\t0xff00\n#define\t\tbSGIEN\t\t\t\t0x10000\n       \t\t\n#define\t\tbSFactorQAM1\t\t0xf\t// Useless\n#define\t\tbSFactorQAM2\t\t0xf0\n#define\t\tbSFactorQAM3\t\t0xf00\n#define\t\tbSFactorQAM4\t\t0xf000\n#define\t\tbSFactorQAM5\t\t0xf0000\n#define\t\tbSFactorQAM6\t\t0xf0000\n#define\t\tbSFactorQAM7\t\t0xf00000\n#define\t\tbSFactorQAM8\t\t0xf000000\n#define\t\tbSFactorQAM9\t\t0xf0000000\n#define\t\tbCSIScheme\t\t\t0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet\t\t0x3\t// Useless\n#define\t\tbChSmooth\t\t\t0x4\n#define\t\tbChSmoothCfg1\t\t0x38\n#define\t\tbChSmoothCfg2\t\t0x1c0\n#define\t\tbChSmoothCfg3\t\t0xe00\n#define\t\tbChSmoothCfg4\t\t0x7000\n#define\t\tbMRCMode\t\t\t0x800000\n#define\t\tbTHEVMCfg\t\t\t0x7000000\n       \t\t\n#define\t\tbLoopFitType\t\t0x1\t// Useless\n#define\t\tbUpdCFO\t\t\t0x40\n#define\t\tbUpdCFOOffData\t\t0x80\n#define\t\tbAdvUpdCFO\t\t\t0x100\n#define\t\tbAdvTimeCtrl\t\t0x800\n#define\t\tbUpdClko\t\t\t0x1000\n#define\t\tbFC\t\t\t\t\t0x6000\n#define\t\tbTrackingMode\t\t0x8000\n#define\t\tbPhCmpEnable\t\t0x10000\n#define\t\tbUpdClkoLTF\t\t0x20000\n#define\t\tbComChCFO\t\t\t0x40000\n#define\t\tbCSIEstiMode\t\t0x80000\n#define\t\tbAdvUpdEqz\t\t\t0x100000\n#define\t\tbUChCfg\t\t\t\t0x7000000\n#define\t\tbUpdEqz\t\t\t0x8000000\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn\t\t0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A\t\t0xff\n#define\t\tbRxPesudoNoise_B\t\t0xff00\n#define\t\tbRxPesudoNoise_C\t\t0xff0000\n#define\t\tbRxPesudoNoise_D\t\t0xff000000\n#define\t\tbPesudoNoiseState_A\t0xffff\n#define\t\tbPesudoNoiseState_B\t0xffff0000\n#define\t\tbPesudoNoiseState_C\t0xffff\n#define\t\tbPesudoNoiseState_D\t0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable\t\t0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl\t\t0xc00\n#define\t\tbZebra1_TRxGainSetting\t0x07f\n#define\t\tbZebra1_RxCorner\t\t0xc00\n#define\t\tbZebra1_TxChargePump\t0x38\n#define\t\tbZebra1_RxChargePump\t0x7\n#define\t\tbZebra1_ChannelNum\t0xf80\n#define\t\tbZebra1_TxLPFBW\t\t0x400\n#define\t\tbZebra1_RxLPFBW\t\t0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1\t0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0\t0x40\n#define\t\tbRTL8256_TxLPFBW\t\t0x18\n#define\t\tbRTL8256_RxLPFBW\t\t0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW\t\t0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW\t\t0xc00\n#define\t\tbRTL8258_RSSILPFBW\t0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0\t\t\t\t0x1\t// Useless\n#define\t\tbByte1\t\t\t\t0x2\n#define\t\tbByte2\t\t\t\t0x4\n#define\t\tbByte3\t\t\t\t0x8\n#define\t\tbWord0\t\t\t\t0x3\n#define\t\tbWord1\t\t\t\t0xc\n#define\t\tbDWord\t\t\t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0\t\t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1\t\t\t0xff00\n#define\t\tbMaskByte2\t\t\t0xff0000\n#define\t\tbMaskByte3\t\t\t0xff000000\n#define\t\tbMaskHWord\t\t0xffff0000\n#define\t\tbMaskLWord\t\t\t0x0000ffff\n#define\t\tbMaskDWord\t\t0xffffffff\n#define\t\tbMaskH3Bytes\t\t0xffffff00\n#define\t\tbMask12Bits\t\t\t0xfff\n#define\t\tbMaskH4Bits\t\t\t0xf0000000\t\n#define\t\tbMaskOFDM_D\t\t0xffc00000\n#define\t\tbMaskCCK\t\t\t0x3f3f3f3f\n\n  \t\t\n#define\t\tbEnable\t\t\t0x1\t// Useless\n#define\t\tbDisable\t\t0x0\n       \t\t\n#define\t\tLeftAntenna\t\t0x0\t// Useless\n#define\t\tRightAntenna\t0x1\n       \t\t\n#define\t\ttCheckTxStatus\t\t500   //500ms // Useless\n#define\t\ttUpdateRxCounter\t100   //100ms\n       \t\t\n#define\t\trateCCK\t\t0\t// Useless\n#define\t\trateOFDM\t1\n#define\t\trateHT\t\t2\n\n//define Register-End\n#define\t\tbPMAC_End\t\t\t0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End\t\t0x8ff\n#define\t\tbFPGAPHY1_End\t\t0x9ff\n#define\t\tbCCKPHY0_End\t\t0xaff\n#define\t\tbOFDMPHY0_End\t\t0xcff\n#define\t\tbOFDMPHY1_End\t\t0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl\t\t0x0\t\t// Useless\n#define\t\tbWMACControl\t\t0x1\n#define\t\tbWNICControl\t\t0x2\n       \t\t\n#define\t\tPathA\t\t\t0x0\t// Useless\n#define\t\tPathB\t\t\t0x1\n#define\t\tPathC\t\t\t0x2\n#define\t\tPathD\t\t\t0x3\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8703BPwrSeq.h",
    "content": "#ifndef REALTEK_POWER_SEQUENCE_8703B\n#define REALTEK_POWER_SEQUENCE_8703B\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WM-20140402-JackieLau-RTL8703B_Power_Architecture v09.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8703B_TRANS_CARDEMU_TO_ACT_STEPS\t23\n#define\tRTL8703B_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8703B_TRANS_CARDEMU_TO_SUS_STEPS\t15\n#define\tRTL8703B_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8703B_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8703B_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8703B_TRANS_ACT_TO_LPS_STEPS\t\t15\n#define\tRTL8703B_TRANS_LPS_TO_ACT_STEPS\t\t15\t\n#define\tRTL8703B_TRANS_END_STEPS\t\t1\n\n\n#define RTL8703B_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/   \\\n\t{0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/\t\\\n\t{0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/   \\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3|BIT2), 0},/* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[11]=0*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , BIT0},/* Disable USB suspend */\t\\\n\t{0x0004, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 , BIT3},/* enabled usb resume */\t\\\n\t{0x0004, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 , 0},/* disable usb resume */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , 0},/* Enable USB suspend */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t\\\n\t{0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* Enable WL control XTAL setting*/\t\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\\\n\t{0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\\\n\t{0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\\\n\t{0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\\\n\t{0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3},/*For GPIO9 internal pull high setting by test chip*/\\\n\t{0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*For GPIO9 internal pull high setting*/\\\n\n\n#define RTL8703B_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\t{0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* Enable BT control XTAL setting*/\\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/   \\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/\\\n\n\n#define RTL8703B_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8703B_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8703B_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/\t\\\n        {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8703B_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n        {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\n\n\n#define RTL8703B_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8703B_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8703B_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8703B_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n#define RTL8703B_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8703B_power_on_flow[RTL8703B_TRANS_CARDEMU_TO_ACT_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_radio_off_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_card_disable_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_card_enable_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_suspend_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_resume_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_hwpdn_flow[RTL8703B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8703B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_enter_lps_flow[RTL8703B_TRANS_ACT_TO_LPS_STEPS+RTL8703B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8703B_leave_lps_flow[RTL8703B_TRANS_LPS_TO_ACT_STEPS+RTL8703B_TRANS_END_STEPS];\n\n#endif\n"
  },
  {
    "path": "include/Hal8723BPhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8723BPHYCFG_H__\n#define __INC_HAL8723BPHYCFG_H__\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters End-------------------------------*/\n\n\n/*------------------------------Define structure----------------------------*/\n\n/*------------------------------Define structure End----------------------------*/\n\n/*--------------------------Exported Function prototype---------------------*/\nu32\nPHY_QueryBBReg_8723B(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask\n\t);\n\nVOID\nPHY_SetBBReg_8723B(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\tRegAddr,\n\tIN\tu32\t\tBitMask,\n\tIN\tu32\t\tData\n\t);\n\nu32\nPHY_QueryRFReg_8723B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask\n\t);\n\nVOID\nPHY_SetRFReg_8723B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tRegAddr,\n\tIN\tu32\t\t\t\tBitMask,\n\tIN\tu32\t\t\t\tData\n\t);\n\n/* MAC/BB/RF HAL config */\nint PHY_BBConfig8723B(PADAPTER\tAdapter\t);\n\nint PHY_RFConfig8723B(PADAPTER\tAdapter\t);\n\ns32 PHY_MACConfig8723B(PADAPTER padapter);\n\nint\nPHY_ConfigRFWithParaFile_8723B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8* \t\t\t\tpFileName,\n\tRF_PATH\t\t\t\teRFPath\n);\n\nVOID\nPHY_SetTxPowerIndex_8723B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\t\tRate\n\t);\n\nu8\nPHY_GetTxPowerIndex_8723B(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\nVOID\t\nPHY_GetTxPowerLevel8723B(\t\t\t\n\tIN\tPADAPTER\t\tAdapter,\n\tOUT s32*\t\t    \t\tpowerlevel\t\n\t);\n\nVOID\nPHY_SetTxPowerLevel8723B(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tchannel\n\t);\n\nVOID\nPHY_SetBWMode8723B(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\t\tBandwidth,\t// 20M or 40M\n\tIN\tunsigned char\t\t\t\tOffset\t\t// Upper, Lower, or Don't care\n);\n\nVOID\nPHY_SwChnl8723B(\t// Call after initialization\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tchannel\n\t);\n\nVOID\nPHY_SetSwChnlBWMode8723B(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\nVOID PHY_SetRFPathSwitch_8723B(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tbMain\n\t);\n/*--------------------------Exported Function prototype End---------------------*/\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8723BPhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8723BPHYREG_H__\n#define __INC_HAL8723BPHYREG_H__\n\n#define\t\trSYM_WLBT_PAPE_SEL\t\t0x64\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t\t0x18c\n\n//\n// 2. Page2(0x200)\n//\n// The following two definition are only used for USB interface.\n#define\t\tRF_BB_CMD_ADDR\t\t\t\t0x02c0\t// RF/BB read/write command address.\n#define\t\tRF_BB_CMD_DATA\t\t\t\t0x02c4\t// RF/BB read/write command data.\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t0x814\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n#define\t\trTxAGC_B_Rate18_06\t\t\t\t0x830\n#define\t\trTxAGC_B_Rate54_24\t\t\t\t0x834\n#define\t\trTxAGC_B_CCK1_55_Mcs32\t\t0x838\n#define\t\trTxAGC_B_Mcs03_Mcs00\t\t\t0x83c\n\n#define\t\trTxAGC_B_Mcs07_Mcs04\t\t\t0x848\n#define\t\trTxAGC_B_Mcs11_Mcs08\t\t\t0x84c\n\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define\t\trFPGA0_RFWakeUpParameter\t\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n\n#define\t\trTxAGC_B_Mcs15_Mcs12\t\t\t0x868\n#define\t\trTxAGC_B_CCK11_A_CCK2_11\t\t0x86c\n\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\t// Useless now\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\tTransceiverA_HSPI_Readback\t0x8b8\t// Transceiver A HSPI Readback\n#define\t\tTransceiverB_HSPI_Readback\t0x8bc\t// Transceiver B HSPI Readback\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n#define\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\trFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n#define\trDPDT_control\t\t\t\t0x92c\n#define\trfe_ctrl_anta_src\t\t\t\t0x930\n#define\trS0S1_PathSwitch   \t\t\t0x948\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t0xa50\n#define\t\trCCK0_RxReport            \t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t0xa58  //0xa5c\n\n//\n// PageB(0xB00)\n//\n#define rPdp_AntA\t\t\t\t\t\t0xb00\n#define rPdp_AntA_4\t\t\t\t\t\t0xb04\n#define rPdp_AntA_8\t\t\t\t\t\t0xb08\n#define rPdp_AntA_C\t\t\t\t\t\t0xb0c\n#define rPdp_AntA_10\t\t\t\t\t0xb10\n#define rPdp_AntA_14\t\t\t\t\t0xb14\n#define rPdp_AntA_18\t\t\t\t\t0xb18\n#define rPdp_AntA_1C\t\t\t\t\t0xb1c\n#define rPdp_AntA_20\t\t\t\t\t0xb20\n#define rPdp_AntA_24\t\t\t\t\t0xb24\n\n#define rConfig_Pmpd_AntA \t\t\t\t0xb28\n#define rConfig_ram64x16\t\t\t\t0xb2c\n\n#define rBndA\t\t\t\t\t\t\t0xb30\n#define rHssiPar\t\t\t\t\t\t0xb34\n\n#define rConfig_AntA\t\t\t\t\t0xb68\n#define rConfig_AntB\t\t\t\t\t0xb6c\n\n#define rPdp_AntB\t\t\t\t\t\t0xb70\n#define rPdp_AntB_4\t\t\t\t\t\t0xb74\n#define rPdp_AntB_8\t\t\t\t\t\t0xb78\n#define rPdp_AntB_C\t\t\t\t\t\t0xb7c\n#define rPdp_AntB_10\t\t\t\t\t0xb80\n#define rPdp_AntB_14\t\t\t\t\t0xb84\n#define rPdp_AntB_18\t\t\t\t\t0xb88\n#define rPdp_AntB_1C\t\t\t\t\t0xb8c\n#define rPdp_AntB_20\t\t\t\t\t0xb90\n#define rPdp_AntB_24\t\t\t\t\t0xb94\n\n#define rConfig_Pmpd_AntB\t\t\t\t0xb98\n\n#define rBndB\t\t\t\t\t\t\t0xba0\n\n#define rAPK\t\t\t\t\t\t\t0xbd8\n#define rPm_Rx0_AntA\t\t\t\t\t0xbdc\n#define rPm_Rx1_AntA\t\t\t\t\t0xbe0\n#define rPm_Rx2_AntA\t\t\t\t\t0xbe4\n#define rPm_Rx3_AntA\t\t\t\t\t0xbe8\n#define rPm_Rx0_AntB\t\t\t\t\t0xbec\n#define rPm_Rx1_AntB\t\t\t\t\t0xbf0\n#define rPm_Rx2_AntB\t\t\t\t\t0xbf4\n#define rPm_Rx3_AntB\t\t\t\t\t0xbf8\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define\t\trOFDM0_RxHPParameter\t\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t\t0xcf4\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t\t0xd3c\n#define\t\trOFDM1_PseudoNoiseStateAB\t\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_A_Rate18_06\t\t\t0xe00\n#define\t\trTxAGC_A_Rate54_24\t\t\t0xe04\n#define\t\trTxAGC_A_CCK1_Mcs32\t\t\t0xe08\n#define\t\trTxAGC_A_Mcs03_Mcs00\t\t\t0xe10\n#define\t\trTxAGC_A_Mcs07_Mcs04\t\t\t0xe14\n#define\t\trTxAGC_A_Mcs11_Mcs08\t\t\t0xe18\n#define\t\trTxAGC_A_Mcs15_Mcs12\t\t\t0xe1c\n\n#define\t\trFPGA0_IQK\t\t\t\t\t0xe28\n#define\t\trTx_IQK_Tone_A\t\t\t\t0xe30\n#define\t\trRx_IQK_Tone_A\t\t\t\t0xe34\n#define\t\trTx_IQK_PI_A\t\t\t\t\t0xe38\n#define\t\trRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n#define\t\trTx_IQK \t\t\t\t\t\t0xe40\n#define\t\trRx_IQK\t\t\t\t\t\t0xe44\n#define\t\trIQK_AGC_Pts\t\t\t\t\t0xe48\n#define\t\trIQK_AGC_Rsp\t\t\t\t\t0xe4c\n#define\t\trTx_IQK_Tone_B\t\t\t\t0xe50\n#define\t\trRx_IQK_Tone_B\t\t\t\t0xe54\n#define\t\trTx_IQK_PI_B\t\t\t\t\t0xe58\n#define\t\trRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define\t\trIQK_AGC_Cont\t\t\t\t0xe60\n\n#define\t\trBlue_Tooth\t\t\t\t\t0xe6c\n#define\t\trRx_Wait_CCA\t\t\t\t\t0xe70\n#define\t\trTx_CCK_RFON\t\t\t\t\t0xe74\n#define\t\trTx_CCK_BBON\t\t\t\t0xe78\n#define\t\trTx_OFDM_RFON\t\t\t\t0xe7c\n#define\t\trTx_OFDM_BBON\t\t\t\t0xe80\n#define\t\trTx_To_Rx\t\t\t\t\t0xe84\n#define\t\trTx_To_Tx\t\t\t\t\t0xe88\n#define\t\trRx_CCK\t\t\t\t\t\t0xe8c\n\n#define\t\trTx_Power_Before_IQK_A\t\t0xe94\n#define\t\trTx_Power_After_IQK_A\t\t\t0xe9c\n\n#define\t\trRx_Power_Before_IQK_A\t\t0xea0\n#define\t\trRx_Power_Before_IQK_A_2\t\t0xea4\n#define\t\trRx_Power_After_IQK_A\t\t\t0xea8\n#define\t\trRx_Power_After_IQK_A_2\t\t0xeac\n\n#define\t\trTx_Power_Before_IQK_B\t\t0xeb4\n#define\t\trTx_Power_After_IQK_B\t\t\t0xebc\n\n#define\t\trRx_Power_Before_IQK_B\t\t0xec0\n#define\t\trRx_Power_Before_IQK_B_2\t\t0xec4\n#define\t\trRx_Power_After_IQK_B\t\t\t0xec8\n#define\t\trRx_Power_After_IQK_B_2\t\t0xecc\n\n#define\t\trRx_OFDM\t\t\t\t\t0xed0\n#define\t\trRx_Wait_RIFS \t\t\t\t0xed4\n#define\t\trRx_TO_Rx \t\t\t\t\t0xed8\n#define\t\trStandby \t\t\t\t\t\t0xedc\n#define\t\trSleep \t\t\t\t\t\t0xee0\n#define\t\trPMPD_ANAEN\t\t\t\t0xeec\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t0x02\t// \n#define\t\tRF_BS_PA_APSET_G1_G4\t\t0x03\n#define\t\tRF_BS_PA_APSET_G5_G8\t\t0x04\n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t0x08\t// \n#define\t\tRF_IPA_G\t\t\t\t\t0x09\t// \n#define\t\tRF_TXBIAS_G\t\t\t\t0x0A\n#define\t\tRF_TXPA_AG\t\t\t\t\t0x0B\n#define\t\tRF_IPA_A\t\t\t\t\t0x0C\t// \n#define\t\tRF_TXBIAS_A\t\t\t\t0x0D\n#define\t\tRF_BS_PA_APSET_G9_G11\t0x0E\n#define\t\tRF_BS_IQGEN\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16 //\n#define\t\tRF_POW_ABILITY\t\t\t0x17\t// \n#define\t\tRF_MODE_AG\t\t\t\t0x18\t// \n#define\t\trRfChannel\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define \tRF_TX_BIAS_A\t\t\t\t0x35\n#define \tRF_TX_BIAS_D\t\t\t\t0x36\n#define \tRF_LOBF_9\t\t\t\t\t0x38\n#define \tRF_RXRF_A3\t\t\t\t\t0x3C\t//\t\n#define \tRF_TRSW \t\t\t\t\t0x3F\n\n#define \tRF_TXRF_A2\t\t\t\t\t0x41\n#define \tRF_TXPA_G4\t\t\t\t\t0x46\t\n#define \tRF_TXPA_A4\t\t\t\t\t0x4B\t\n#define \tRF_0x52 \t\t\t\t\t0x52\n#define \tRF_WE_LUT\t\t\t\t\t0xEF\t\n#define \tRF_S0S1 \t\t\t\t\t0xB0\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t0x3f\n\n#define\t\tbAntennaSelect                 \t\t0x0300\n\n#define\t\tbXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t0xf80000\n#define\t\tbContTxHSSI               \t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t0x200\n#define\t\tbAGCAddress               \t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t0xc0000\n#define\t\tbAGCTxCode                \t\t0xc00000\n#define\t\tbAGCRxCode                \t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t\t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t\t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t\t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t\t0x40000\n#define\t\tbAD7InputCMMode           \t\t0x380000\n#define\t\tbAD7Current               \t\t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t\t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t\t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t\t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t0x10\n#define\t\tbAntNonHT           \t      \t\t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode\t\t\t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving\t\t0x80\n#define\t\tbCCKRxPowerSaving\t\t0x40\n\n#define\t\tbCCKSideBand\t\t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble\t\t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity\t\t0x8000\n#define\t\tbCCKCarrierRecovery\t\t0x4000\n#define\t\tbCCKTxRate\t\t\t\t0x3000\n#define\t\tbCCKDCCancel\t\t\t0x0800\n#define\t\tbCCKISICancel\t\t\t0x0400\n#define\t\tbCCKMatchFilter\t\t\t0x0200\n#define\t\tbCCKEqualizer\t\t\t0x0100\n#define\t\tbCCKPreambleDetect\t\t0x800000\n#define\t\tbCCKFastFalseCCA\t\t0x400000\n#define\t\tbCCKChEstStart\t\t\t0x300000\n#define\t\tbCCKCCACount\t\t\t0x080000\n#define\t\tbCCKcs_lim\t\t\t\t0x070000\n#define\t\tbCCKBistMode\t\t\t0x80000000\n#define\t\tbCCKCCAMask\t\t\t0x40000000\n#define\t\tbCCKTxDACPhase\t\t0x4\n#define\t\tbCCKRxADCPhase\t\t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0\t\t0x0100\n#define\t\tbCCKTxDCOffset\t\t\t0xf0\n#define\t\tbCCKRxDCOffset\t\t\t0xf\n#define\t\tbCCKCCAMode\t\t\t0xc000\n#define\t\tbCCKFalseCS_lim\t\t\t0x3f00\n#define\t\tbCCKCS_ratio\t\t\t0xc00000\n#define\t\tbCCKCorgBit_sel\t\t\t0x300000\n#define\t\tbCCKPD_lim\t\t\t\t0x0f0000\n#define\t\tbCCKNewCCA\t\t\t0x80000000\n#define\t\tbCCKRxHPofIG\t\t\t0x8000\n#define\t\tbCCKRxIG\t\t\t\t0x7f00\n#define\t\tbCCKLNAPolarity\t\t\t0x800000\n#define\t\tbCCKRx1stGain\t\t\t0x7f0000\n#define\t\tbCCKRFExtend\t\t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKRxAGCSatCount\t\t0xe0\n#define\t\tbCCKRxRFSettle\t\t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC\t\t\t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity\t\t0x2000\n#define\t\tbCCKTxFilterType\t\t0x0c00\n#define\t\tbCCKRxAGCReportType\t0x0300\n#define\t\tbCCKRxDAGCEn\t\t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod\t\t0x20000000\n#define\t\tbCCKRxDAGCSatLevel\t\t0x1f000000\n#define\t\tbCCKTimingRecovery\t\t0x800000\n#define\t\tbCCKTxC0\t\t\t\t0x3f0000\n#define\t\tbCCKTxC1\t\t\t\t0x3f000000\n#define\t\tbCCKTxC2\t\t\t\t0x3f\n#define\t\tbCCKTxC3\t\t\t\t0x3f00\n#define\t\tbCCKTxC4\t\t\t\t0x3f0000\n#define\t\tbCCKTxC5\t\t\t\t0x3f000000\n#define\t\tbCCKTxC6\t\t\t\t0x3f\n#define\t\tbCCKTxC7\t\t\t\t0x3f00\n#define\t\tbCCKDebugPort\t\t\t0xff0000\n#define\t\tbCCKDACDebug\t\t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable\t0x8000\n#define\t\tbCCKFalseAlarmRead\t\t0x4000\n#define\t\tbCCKTRSSI\t\t\t\t0x7f\n#define\t\tbCCKRxAGCReport\t\t0xfe\n#define\t\tbCCKRxReport_AntSel\t0x80000000\n#define\t\tbCCKRxReport_MFOff\t\t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss\t0x20000000\n#define\t\tbCCKRxReport_Pktloss\t0x10000000\n#define\t\tbCCKRxReport_Lockedbit\t0x08000000\n#define\t\tbCCKRxReport_RateError\t0x04000000\n#define\t\tbCCKRxReport_RxRate\t0x03000000\n#define\t\tbCCKRxFACounterLower\t0xff\n#define\t\tbCCKRxFACounterUpper\t0xff000000\n#define\t\tbCCKRxHPAGCStart\t\t0xe000\n#define\t\tbCCKRxHPAGCFinal\t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable\t0x8000\n#define\t\tbCCKFACounterFreeze\t0x4000       \t\t\n#define\t\tbCCKTxPathSel\t\t\t0x10000000\n#define\t\tbCCKDefaultRxPath\t\t0xc000000\n#define\t\tbCCKOptionRxPath\t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF\t\t\t\t0x3\t// Useless\n#define\t\tbShift_L\t\t\t\t\t0xc0\n#define\t\tbGI_TH\t\t\t\t\t0xc\n#define\t\tbRxPathA\t\t\t\t0x1\n#define\t\tbRxPathB\t\t\t\t0x2\n#define\t\tbRxPathC\t\t\t\t0x4\n#define\t\tbRxPathD\t\t\t\t0x8\n#define\t\tbTxPathA\t\t\t\t0x1\n#define\t\tbTxPathB\t\t\t\t0x2\n#define\t\tbTxPathC\t\t\t\t0x4\n#define\t\tbTxPathD\t\t\t\t0x8\n#define\t\tbTRSSIFreq\t\t\t\t0x200\n#define\t\tbADCBackoff\t\t\t\t0x3000\n#define\t\tbDFIRBackoff\t\t\t0xc000\n#define\t\tbTRSSILatchPhase\t\t0x10000\n#define\t\tbRxIDCOffset\t\t\t0xff\n#define\t\tbRxQDCOffset\t\t\t0xff00\n#define\t\tbRxDFIRMode\t\t\t0x1800000\n#define\t\tbRxDCNFType\t\t\t0xe000000\n#define\t\tbRXIQImb_A\t\t\t\t0x3ff\n#define\t\tbRXIQImb_B\t\t\t\t0xfc00\n#define\t\tbRXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbRXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbDC_dc_Notch\t\t\t0x60000\n#define\t\tbRxNBINotch\t\t\t0x1f000000\n#define\t\tbPD_TH\t\t\t\t\t0xf\n#define\t\tbPD_TH_Opt2\t\t\t0xc000\n#define\t\tbPWED_TH\t\t\t\t0x700\n#define\t\tbIfMF_Win_L\t\t\t0x800\n#define\t\tbPD_Option\t\t\t\t0x1000\n#define\t\tbMF_Win_L\t\t\t\t0xe000\n#define\t\tbBW_Search_L\t\t\t0x30000\n#define\t\tbwin_enh_L\t\t\t\t0xc0000\n#define\t\tbBW_TH\t\t\t\t\t0x700000\n#define\t\tbED_TH2\t\t\t\t0x3800000\n#define\t\tbBW_option\t\t\t\t0x4000000\n#define\t\tbRatio_TH\t\t\t\t0x18000000\n#define\t\tbWindow_L\t\t\t\t0xe0000000\n#define\t\tbSBD_Option\t\t\t\t0x1\n#define\t\tbFrame_TH\t\t\t\t0x1c\n#define\t\tbFS_Option\t\t\t\t0x60\n#define\t\tbDC_Slope_check\t\t0x80\n#define\t\tbFGuard_Counter_DC_L\t0xe00\n#define\t\tbFrame_Weight_Short\t0x7000\n#define\t\tbSub_Tune\t\t\t\t0xe00000\n#define\t\tbFrame_DC_Length\t\t0xe000000\n#define\t\tbSBD_start_offset\t\t0x30000000\n#define\t\tbFrame_TH_2\t\t\t0x7\n#define\t\tbFrame_GI2_TH\t\t\t0x38\n#define\t\tbGI2_Sync_en\t\t\t0x40\n#define\t\tbSarch_Short_Early\t\t0x300\n#define\t\tbSarch_Short_Late\t\t0xc00\n#define\t\tbSarch_GI2_Late\t\t0x70000\n#define\t\tbCFOAntSum\t\t\t\t0x1\n#define\t\tbCFOAcc\t\t\t\t0x2\n#define\t\tbCFOStartOffset\t\t\t0xc\n#define\t\tbCFOLookBack\t\t\t0x70\n#define\t\tbCFOSumWeight\t\t\t0x80\n#define\t\tbDAGCEnable\t\t\t0x10000\n#define\t\tbTXIQImb_A\t\t\t\t0x3ff\n#define\t\tbTXIQImb_B\t\t\t\t0xfc00\n#define\t\tbTXIQImb_C\t\t\t\t0x3f0000\n#define\t\tbTXIQImb_D\t\t\t\t0xffc00000\n#define\t\tbTxIDCOffset\t\t\t0xff\n#define\t\tbTxQDCOffset\t\t\t0xff00\n#define\t\tbTxDFIRMode\t\t\t0x10000\n#define\t\tbTxPesudoNoiseOn\t\t0x4000000\n#define\t\tbTxPesudoNoise_A\t\t0xff\n#define\t\tbTxPesudoNoise_B\t\t0xff00\n#define\t\tbTxPesudoNoise_C\t\t0xff0000\n#define\t\tbTxPesudoNoise_D\t\t0xff000000\n#define\t\tbCCADropOption\t\t\t0x20000\n#define\t\tbCCADropThres\t\t\t0xfff00000\n#define\t\tbEDCCA_H\t\t\t\t0xf\n#define\t\tbEDCCA_L\t\t\t\t0xf0\n#define\t\tbLambda_ED\t\t\t0x300\n#define\t\tbRxInitialGain\t\t\t0x7f\n#define\t\tbRxAntDivEn\t\t\t\t0x80\n#define\t\tbRxAGCAddressForLNA\t0x7f00\n#define\t\tbRxHighPowerFlow\t\t0x8000\n#define\t\tbRxAGCFreezeThres\t\t0xc0000\n#define\t\tbRxFreezeStep_AGC1\t0x300000\n#define\t\tbRxFreezeStep_AGC2\t0xc00000\n#define\t\tbRxFreezeStep_AGC3\t0x3000000\n#define\t\tbRxFreezeStep_AGC0\t0xc000000\n#define\t\tbRxRssi_Cmp_En\t\t\t0x10000000\n#define\t\tbRxQuickAGCEn\t\t\t0x20000000\n#define\t\tbRxAGCFreezeThresMode\t0x40000000\n#define\t\tbRxOverFlowCheckType\t0x80000000\n#define\t\tbRxAGCShift\t\t\t\t0x7f\n#define\t\tbTRSW_Tri_Only\t\t\t0x80\n#define\t\tbPowerThres\t\t\t0x300\n#define\t\tbRxAGCEn\t\t\t\t0x1\n#define\t\tbRxAGCTogetherEn\t\t0x2\n#define\t\tbRxAGCMin\t\t\t\t0x4\n#define\t\tbRxHP_Ini\t\t\t\t0x7\n#define\t\tbRxHP_TRLNA\t\t\t0x70\n#define\t\tbRxHP_RSSI\t\t\t\t0x700\n#define\t\tbRxHP_BBP1\t\t\t\t0x7000\n#define\t\tbRxHP_BBP2\t\t\t\t0x70000\n#define\t\tbRxHP_BBP3\t\t\t\t0x700000\n#define\t\tbRSSI_H\t\t\t\t\t0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen\t\t\t\t0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW\t\t\t0x7\n#define\t\tbRxSettle_LNA\t\t\t0x38\n#define\t\tbRxSettle_RSSI\t\t\t0x1c0\n#define\t\tbRxSettle_BBP\t\t\t0xe00\n#define\t\tbRxSettle_RxHP\t\t\t0x7000\n#define\t\tbRxSettle_AntSW_RSSI\t0x38000\n#define\t\tbRxSettle_AntSW\t\t0xc0000\n#define\t\tbRxProcessTime_DAGC\t0x300000\n#define\t\tbRxSettle_HSSI\t\t\t0x400000\n#define\t\tbRxProcessTime_BBPPW\t0x800000\n#define\t\tbRxAntennaPowerShift\t0x3000000\n#define\t\tbRSSITableSelect\t\t0xc000000\n#define\t\tbRxHP_Final\t\t\t\t0x7000000\n#define\t\tbRxHTSettle_BBP\t\t\t0x7\n#define\t\tbRxHTSettle_HSSI\t\t0x8\n#define\t\tbRxHTSettle_RxHP\t\t0x70\n#define\t\tbRxHTSettle_BBPPW\t\t0x80\n#define\t\tbRxHTSettle_Idle\t\t0x300\n#define\t\tbRxHTSettle_Reserved\t0x1c00\n#define\t\tbRxHTRxHPEn\t\t\t0x8000\n#define\t\tbRxHTAGCFreezeThres\t0x30000\n#define\t\tbRxHTAGCTogetherEn\t0x40000\n#define\t\tbRxHTAGCMin\t\t\t0x80000\n#define\t\tbRxHTAGCEn\t\t\t\t0x100000\n#define\t\tbRxHTDAGCEn\t\t\t0x200000\n#define\t\tbRxHTRxHP_BBP\t\t\t0x1c00000\n#define\t\tbRxHTRxHP_Final\t\t0xe0000000\n#define\t\tbRxPWRatioTH\t\t\t0x3\n#define\t\tbRxPWRatioEn\t\t\t0x4\n#define\t\tbRxMFHold\t\t\t\t0x3800\n#define\t\tbRxPD_Delay_TH1\t\t0x38\n#define\t\tbRxPD_Delay_TH2\t\t0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX\t0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH\t\t\t0x8000\n#define\t\tbRxProcess_Delay\t\t0xf0000\n#define\t\tbRxSearchrange_GI2_Early\t0x700000\n#define\t\tbRxFrame_Guard_Counter_L\t0x3800000\n#define\t\tbRxSGI_Guard_L\t\t\t0xc000000\n#define\t\tbRxSGI_Search_L\t\t0x30000000\n#define\t\tbRxSGI_TH\t\t\t\t0xc0000000\n#define\t\tbDFSCnt0\t\t\t\t0xff\n#define\t\tbDFSCnt1\t\t\t\t0xff00\n#define\t\tbDFSFlag\t\t\t\t0xf0000       \t\t\n#define\t\tbMFWeightSum\t\t\t0x300000\n#define\t\tbMinIdxTH\t\t\t\t0x7f000000       \t\t\n#define\t\tbDAFormat\t\t\t\t0x40000       \t\t\n#define\t\tbTxChEmuEnable\t\t0x01000000       \t\t\n#define\t\tbTRSWIsolation_A\t\t0x7f\n#define\t\tbTRSWIsolation_B\t\t0x7f00\n#define\t\tbTRSWIsolation_C\t\t0x7f0000\n#define\t\tbTRSWIsolation_D\t\t0x7f000000       \t\t\n#define\t\tbExtLNAGain\t\t\t\t0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn\t\t\t\t0x4\t// Useless\n#define\t\tbAntennaMapping\t\t0x10\n#define\t\tbNss\t\t\t\t\t0x20\n#define\t\tbCFOAntSumD\t\t\t0x200\n#define\t\tbPHYCounterReset\t\t0x8000000\n#define\t\tbCFOReportGet\t\t\t0x4000000\n#define\t\tbOFDMContinueTx\t\t0x10000000\n#define\t\tbOFDMSingleCarrier\t\t0x20000000\n#define\t\tbOFDMSingleTone\t\t0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect\t\t\t0x100\n#define\t\tbCFOEn\t\t\t\t0x10000\n#define\t\tbCFOValue\t\t\t0xfff00000\n#define\t\tbSigTone_Re\t\t0x3f\n#define\t\tbSigTone_Im\t\t0x7f00\n#define\t\tbCounter_CCA\t\t0xffff\n#define\t\tbCounter_ParityFail\t0xffff0000\n#define\t\tbCounter_RateIllegal\t\t0xffff\n#define\t\tbCounter_CRC8Fail\t0xffff0000\n#define\t\tbCounter_MCSNoSupport\t0xffff\n#define\t\tbCounter_FastSync\t0xffff\n#define\t\tbShortCFO\t\t\t0xfff\n#define\t\tbShortCFOTLength\t12   //total\n#define\t\tbShortCFOFLength\t11   //fraction\n#define\t\tbLongCFO\t\t\t0x7ff\n#define\t\tbLongCFOTLength\t11\n#define\t\tbLongCFOFLength\t11\n#define\t\tbTailCFO\t\t\t0x1fff\n#define\t\tbTailCFOTLength\t\t13\n#define\t\tbTailCFOFLength\t\t12       \t\t\n#define\t\tbmax_en_pwdB\t\t0xffff\n#define\t\tbCC_power_dB\t\t0xffff0000\n#define\t\tbnoise_pwdB\t\t0xffff\n#define\t\tbPowerMeasTLength\t10\n#define\t\tbPowerMeasFLength\t3\n#define\t\tbRx_HT_BW\t\t\t0x1\n#define\t\tbRxSC\t\t\t\t0x6\n#define\t\tbRx_HT\t\t\t\t0x8       \t\t\n#define\t\tbNB_intf_det_on\t\t0x1\n#define\t\tbIntf_win_len_cfg\t0x30\n#define\t\tbNB_Intf_TH_cfg\t\t0x1c0       \t\t\n#define\t\tbRFGain\t\t\t\t0x3f\n#define\t\tbTableSel\t\t\t0x40\n#define\t\tbTRSW\t\t\t\t0x80       \t\t\n#define\t\tbRxSNR_A\t\t\t0xff\n#define\t\tbRxSNR_B\t\t\t0xff00\n#define\t\tbRxSNR_C\t\t\t0xff0000\n#define\t\tbRxSNR_D\t\t\t0xff000000\n#define\t\tbSNREVMTLength\t\t8\n#define\t\tbSNREVMFLength\t\t1       \t\t\n#define\t\tbCSI1st\t\t\t\t0xff\n#define\t\tbCSI2nd\t\t\t\t0xff00\n#define\t\tbRxEVM1st\t\t\t0xff0000\n#define\t\tbRxEVM2nd\t\t\t0xff000000       \t\t\n#define\t\tbSIGEVM\t\t\t0xff\n#define\t\tbPWDB\t\t\t\t0xff00\n#define\t\tbSGIEN\t\t\t\t0x10000\n       \t\t\n#define\t\tbSFactorQAM1\t\t0xf\t// Useless\n#define\t\tbSFactorQAM2\t\t0xf0\n#define\t\tbSFactorQAM3\t\t0xf00\n#define\t\tbSFactorQAM4\t\t0xf000\n#define\t\tbSFactorQAM5\t\t0xf0000\n#define\t\tbSFactorQAM6\t\t0xf0000\n#define\t\tbSFactorQAM7\t\t0xf00000\n#define\t\tbSFactorQAM8\t\t0xf000000\n#define\t\tbSFactorQAM9\t\t0xf0000000\n#define\t\tbCSIScheme\t\t\t0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet\t\t0x3\t// Useless\n#define\t\tbChSmooth\t\t\t0x4\n#define\t\tbChSmoothCfg1\t\t0x38\n#define\t\tbChSmoothCfg2\t\t0x1c0\n#define\t\tbChSmoothCfg3\t\t0xe00\n#define\t\tbChSmoothCfg4\t\t0x7000\n#define\t\tbMRCMode\t\t\t0x800000\n#define\t\tbTHEVMCfg\t\t\t0x7000000\n       \t\t\n#define\t\tbLoopFitType\t\t0x1\t// Useless\n#define\t\tbUpdCFO\t\t\t0x40\n#define\t\tbUpdCFOOffData\t\t0x80\n#define\t\tbAdvUpdCFO\t\t\t0x100\n#define\t\tbAdvTimeCtrl\t\t0x800\n#define\t\tbUpdClko\t\t\t0x1000\n#define\t\tbFC\t\t\t\t\t0x6000\n#define\t\tbTrackingMode\t\t0x8000\n#define\t\tbPhCmpEnable\t\t0x10000\n#define\t\tbUpdClkoLTF\t\t0x20000\n#define\t\tbComChCFO\t\t\t0x40000\n#define\t\tbCSIEstiMode\t\t0x80000\n#define\t\tbAdvUpdEqz\t\t\t0x100000\n#define\t\tbUChCfg\t\t\t\t0x7000000\n#define\t\tbUpdEqz\t\t\t0x8000000\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn\t\t0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A\t\t0xff\n#define\t\tbRxPesudoNoise_B\t\t0xff00\n#define\t\tbRxPesudoNoise_C\t\t0xff0000\n#define\t\tbRxPesudoNoise_D\t\t0xff000000\n#define\t\tbPesudoNoiseState_A\t0xffff\n#define\t\tbPesudoNoiseState_B\t0xffff0000\n#define\t\tbPesudoNoiseState_C\t0xffff\n#define\t\tbPesudoNoiseState_D\t0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable\t\t0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl\t\t0xc00\n#define\t\tbZebra1_TRxGainSetting\t0x07f\n#define\t\tbZebra1_RxCorner\t\t0xc00\n#define\t\tbZebra1_TxChargePump\t0x38\n#define\t\tbZebra1_RxChargePump\t0x7\n#define\t\tbZebra1_ChannelNum\t0xf80\n#define\t\tbZebra1_TxLPFBW\t\t0x400\n#define\t\tbZebra1_RxLPFBW\t\t0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1\t0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0\t0x40\n#define\t\tbRTL8256_TxLPFBW\t\t0x18\n#define\t\tbRTL8256_RxLPFBW\t\t0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW\t\t0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW\t\t0xc00\n#define\t\tbRTL8258_RSSILPFBW\t0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0\t\t\t\t0x1\t// Useless\n#define\t\tbByte1\t\t\t\t0x2\n#define\t\tbByte2\t\t\t\t0x4\n#define\t\tbByte3\t\t\t\t0x8\n#define\t\tbWord0\t\t\t\t0x3\n#define\t\tbWord1\t\t\t\t0xc\n#define\t\tbDWord\t\t\t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0\t\t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1\t\t\t0xff00\n#define\t\tbMaskByte2\t\t\t0xff0000\n#define\t\tbMaskByte3\t\t\t0xff000000\n#define\t\tbMaskHWord\t\t0xffff0000\n#define\t\tbMaskLWord\t\t\t0x0000ffff\n#define\t\tbMaskDWord\t\t0xffffffff\n#define\t\tbMaskH3Bytes\t\t0xffffff00\n#define\t\tbMask12Bits\t\t\t0xfff\n#define\t\tbMaskH4Bits\t\t\t0xf0000000\t\n#define\t\tbMaskOFDM_D\t\t0xffc00000\n#define\t\tbMaskCCK\t\t\t0x3f3f3f3f\n\n  \t\t\n#define\t\tbEnable\t\t\t0x1\t// Useless\n#define\t\tbDisable\t\t0x0\n       \t\t\n#define\t\tLeftAntenna\t\t0x0\t// Useless\n#define\t\tRightAntenna\t0x1\n       \t\t\n#define\t\ttCheckTxStatus\t\t500   //500ms // Useless\n#define\t\ttUpdateRxCounter\t100   //100ms\n       \t\t\n#define\t\trateCCK\t\t0\t// Useless\n#define\t\trateOFDM\t1\n#define\t\trateHT\t\t2\n\n//define Register-End\n#define\t\tbPMAC_End\t\t\t0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End\t\t0x8ff\n#define\t\tbFPGAPHY1_End\t\t0x9ff\n#define\t\tbCCKPHY0_End\t\t0xaff\n#define\t\tbOFDMPHY0_End\t\t0xcff\n#define\t\tbOFDMPHY1_End\t\t0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl\t\t0x0\t\t// Useless\n#define\t\tbWMACControl\t\t0x1\n#define\t\tbWNICControl\t\t0x2\n       \t\t\n#define\t\tPathA\t\t\t0x0\t// Useless\n#define\t\tPathB\t\t\t0x1\n#define\t\tPathC\t\t\t0x2\n#define\t\tPathD\t\t\t0x3\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8723BPwrSeq.h",
    "content": "#ifndef REALTEK_POWER_SEQUENCE_8723B\n#define REALTEK_POWER_SEQUENCE_8723B\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WM-20130815-JackieLau-RTL8723B_Power_Architecture v08.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8723B_TRANS_CARDEMU_TO_ACT_STEPS\t26\n#define\tRTL8723B_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8723B_TRANS_CARDEMU_TO_SUS_STEPS\t15\n#define\tRTL8723B_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8723B_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8723B_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8723B_TRANS_ACT_TO_LPS_STEPS\t\t15\n#define\tRTL8723B_TRANS_LPS_TO_ACT_STEPS\t\t15\t\n#define\tRTL8723B_TRANS_ACT_TO_SWLPS_STEPS\t\t22\n#define\tRTL8723B_TRANS_SWLPS_TO_ACT_STEPS\t\t15\n#define\tRTL8723B_TRANS_END_STEPS\t\t1\n\n\n#define RTL8723B_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/   \\\n\t{0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/\t\\\n\t{0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/   \\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3|BIT2), 0},/* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[11]=0*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , BIT0},/* Disable USB suspend */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , 0},/* Enable USB suspend */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t\\\n\t{0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* Enable WL control XTAL setting*/\t\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\\\n\t{0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\\\n\t{0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\\\n\t{0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\\\n\t{0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3},/*For GPIO9 internal pull high setting by test chip*/\\\n\t{0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*For GPIO9 internal pull high setting*/\\\n\n\n#define RTL8723B_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\t{0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* Enable BT control XTAL setting*/\\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/   \\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/\\\n\n\n#define RTL8723B_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8723B_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/\t\\\n        {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n        {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\n\n\n#define RTL8723B_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8723B_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8723B_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8723B_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n \n #define RTL8723B_TRANS_ACT_TO_SWLPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable 32 K source*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*CCK and OFDM are enable*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*disable security engine*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x40},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*reset dual TSF*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/*Reset CPU*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*Reset MCUFWDL register*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1},/*Reset CPU IO Wrapper*/\t\\\n\t{0x0287, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*polling RXFF packet number = 0 */\t\\\n\t{0x0286, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/*polling RXDMA idle */\t\\\n\t{0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Clear FW RPWM interrupt */\\\n\t{0x0139, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW RPWM interrupt source*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4},/*switch TSF to 32K*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/*polling TSF stable*/\\\n\t{0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Set FW LPS*/\t\\\n\t{0x0090, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/*polling FW LPS ready */\t\n\n\n#define RTL8723B_TRANS_SWLPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0},/*switch TSF to 32K*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*polling TSF stable*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1, enable security engine*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x06B7, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x09}, /*.\treset MAC rx state machine*/\\\n\t{0x06B4, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x86}, /*.\treset MAC rx state machine*/\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/* set CPU RAM code ready*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*Reset CPU IO Wrapper*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* Enable CPU*/\t\\\n\t{0x001D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*enable CPU IO Wrapper*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2},/* Enable CPU*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, BIT7},/*polling FW init ready */\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT6, BIT6},/*polling FW init ready */\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n\t\n#define RTL8723B_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8723B_power_on_flow[RTL8723B_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_radio_off_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_card_disable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_card_enable_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_suspend_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_resume_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_hwpdn_flow[RTL8723B_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723B_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_enter_lps_flow[RTL8723B_TRANS_ACT_TO_LPS_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_leave_lps_flow[RTL8723B_TRANS_LPS_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_enter_swlps_flow[RTL8723B_TRANS_ACT_TO_SWLPS_STEPS+RTL8723B_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723B_leave_swlps_flow[RTL8723B_TRANS_SWLPS_TO_ACT_STEPS+RTL8723B_TRANS_END_STEPS];\n#endif\n\n"
  },
  {
    "path": "include/Hal8723PwrSeq.h",
    "content": "#ifndef __HAL8723PWRSEQ_H__\n#define __HAL8723PWRSEQ_H__\n/*\n\tCheck document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\n\n\tTRANS_END\n*/\n#include \"HalPwrSeqCmd.h\"\n\n#define\tRTL8723A_TRANS_CARDEMU_TO_ACT_STEPS\t15\n#define\tRTL8723A_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8723A_TRANS_CARDEMU_TO_SUS_STEPS\t15\n#define\tRTL8723A_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8723A_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8723A_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8723A_TRANS_ACT_TO_LPS_STEPS\t15\n#define\tRTL8723A_TRANS_LPS_TO_ACT_STEPS\t15\n#define\tRTL8723A_TRANS_END_STEPS\t1\n\n\n#define RTL8723A_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/   \\\n\t{0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/\t\\\n\t{0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/   \\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t\\\n\t{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 1},/*0x4C[23] = 0x4E[7] = 1, switch DPDT_SEL_P output from WL BB */\\\n\n#define RTL8723A_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/   \\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/   \\\n\n\n#define RTL8723A_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8723A_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/\t\\\n\t{0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\n\n\n#define RTL8723A_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8723A_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8723A_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8723A_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n\n#define RTL8723A_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STEPS+RTL8723A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STEPS+RTL8723A_TRANS_END_STEPS];\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8812PhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8812PHYCFG_H__\n#define __INC_HAL8812PHYCFG_H__\n\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/* BB/RF related */\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/*------------------------Export global variable----------------------------*/\n/*------------------------Export global variable----------------------------*/\n\n\n/*------------------------Export Marco Definition---------------------------*/\n/*------------------------Export Marco Definition---------------------------*/\n\n\n/*--------------------------Exported Function prototype---------------------*/\n//\n// BB and RF register read/write\n//\nu32\tPHY_QueryBBReg8812(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask\t);\nvoid\tPHY_SetBBReg8812(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tData\t);\nu32\tPHY_QueryRFReg8812(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask\t);\nvoid\tPHY_SetRFReg8812(\tIN\tPADAPTER\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tData\t);\n\n//\n// Initialization related function\n//\n/* MAC/BB/RF HAL config */\nint\tPHY_MACConfig8812(IN PADAPTER\tAdapter\t);\nint\tPHY_BBConfig8812(IN PADAPTER\tAdapter\t);\nvoid\tPHY_BB8812_Config_1T(IN PADAPTER\tAdapter );\nint\tPHY_RFConfig8812(IN PADAPTER\tAdapter\t);\n\n/* RF config */\n\ns32\nPHY_SwitchWirelessBand8812(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\t\tBand\n);\n\n//\n// BB TX Power R/W\n//\nvoid\tPHY_GetTxPowerLevel8812(\tIN PADAPTER\tAdapter, OUT s32*\tpowerlevel\t);\nvoid\tPHY_SetTxPowerLevel8812(\tIN PADAPTER\tAdapter, IN u8\tChannel\t);\n\nBOOLEAN\tPHY_UpdateTxPowerDbm8812( IN PADAPTER\tAdapter, IN int\tpowerInDbm\t);\nu8 PHY_GetTxPowerIndex_8812A(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\nu32 PHY_GetTxBBSwing_8812A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tBAND_TYPE \tBand,\n\tIN\tu8\t\t\tRFPath\n\t);\n\nVOID\nPHY_SetTxPowerIndex_8812A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu4Byte\t\t\t\tPowerIndex,\n\tIN\tu1Byte\t\t\t\tRFPath, \n\tIN\tu1Byte\t\t\t\tRate\n\t);\n\n//\n// Switch bandwidth for 8192S\n//\nVOID\nPHY_SetBWMode8812(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset\n);\n\n//\n// channel switch related funciton\n//\nVOID\nPHY_SwChnl8812(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel\n);\n\n\nVOID\nPHY_SetSwChnlBWMode8812(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\n//\n// BB/MAC/RF other monitor API\n//\n\nVOID\nPHY_SetRFPathSwitch_8812A(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tBOOLEAN\t\tbMain\n);\n\n/*--------------------------Exported Function prototype---------------------*/\n#endif\t// __INC_HAL8192CPHYCFG_H\n\n"
  },
  {
    "path": "include/Hal8812PhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8812PHYREG_H__\n#define __INC_HAL8812PHYREG_H__\n/*--------------------------Define Parameters-------------------------------*/\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n// BB Register Definition\n\n#define rCCAonSec_Jaguar\t\t0x838\n#define rPwed_TH_Jaguar\t\t\t0x830\n\n// BW and sideband setting\n#define rBWIndication_Jaguar\t\t0x834\n#define rL1PeakTH_Jaguar\t\t\t0x848\n#define rFPGA0_XA_LSSIReadBack\t0x8a0\t/*Tranceiver LSSI Readback*/\n#define rRFMOD_Jaguar\t\t\t0x8ac\t//RF mode \n#define rADC_Buf_Clk_Jaguar\t\t0x8c4\n#define rRFECTRL_Jaguar\t\t\t0x900\n#define bRFMOD_Jaguar\t\t\t0xc3\n#define rCCK_System_Jaguar\t\t0xa00   // for cck sideband\n#define bCCK_System_Jaguar\t\t0x10\n\n// Block & Path enable\n#define rOFDMCCKEN_Jaguar \t\t0x808 // OFDM/CCK block enable\n#define bOFDMEN_Jaguar\t\t\t0x20000000\n#define bCCKEN_Jaguar\t\t\t0x10000000\n#define rRxPath_Jaguar\t\t\t0x808\t// Rx antenna\n#define bRxPath_Jaguar\t\t\t0xff\n#define rTxPath_Jaguar\t\t\t0x80c\t// Tx antenna\n#define bTxPath_Jaguar\t\t\t0x0fffffff\n#define rCCK_RX_Jaguar\t\t\t0xa04\t// for cck rx path selection\n#define bCCK_RX_Jaguar\t\t\t0x0c000000 \n#define rVhtlen_Use_Lsig_Jaguar\t0x8c3\t// Use LSIG for VHT length\n\n// RF read/write-related\n#define rHSSIRead_Jaguar\t\t\t0x8b0  // RF read addr\n#define bHSSIRead_addr_Jaguar\t\t0xff\n#define bHSSIRead_trigger_Jaguar\t0x100\n#define rA_PIRead_Jaguar\t\t\t0xd04 // RF readback with PI\n#define rB_PIRead_Jaguar\t\t\t0xd44 // RF readback with PI\n#define rA_SIRead_Jaguar\t\t\t0xd08 // RF readback with SI\n#define rB_SIRead_Jaguar\t\t\t0xd48 // RF readback with SI\n#define rRead_data_Jaguar\t\t\t0xfffff\n#define rA_LSSIWrite_Jaguar\t\t\t0xc90 // RF write addr\n#define rB_LSSIWrite_Jaguar\t\t\t0xe90 // RF write addr\n#define bLSSIWrite_data_Jaguar\t\t0x000fffff\n#define bLSSIWrite_addr_Jaguar\t\t0x0ff00000\n\n\n\n// YN: mask the following register definition temporarily \n#define rFPGA0_XA_RFInterfaceOE\t\t\t0x860\t// RF Channel switch\n#define rFPGA0_XB_RFInterfaceOE\t\t\t0x864\n\n#define rFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define rFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n//#define rFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n//#define rFPGA0_XCD_RFParameter\t\t0x87c\n\n//#define rFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n//#define rFPGA0_AnalogParameter2\t\t0x884\n//#define rFPGA0_AnalogParameter3\t\t0x888\n//#define rFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n//#define rFPGA0_AnalogParameter4\t\t0x88c\n\n\n// CCK TX scaling\n#define rCCK_TxFilter1_Jaguar\t\t0xa20\n#define bCCK_TxFilter1_C0_Jaguar   \t0x00ff0000\n#define bCCK_TxFilter1_C1_Jaguar\t\t0xff000000\n#define rCCK_TxFilter2_Jaguar\t\t0xa24\n#define bCCK_TxFilter2_C2_Jaguar\t\t0x000000ff\n#define bCCK_TxFilter2_C3_Jaguar\t\t0x0000ff00\n#define bCCK_TxFilter2_C4_Jaguar\t\t0x00ff0000\n#define bCCK_TxFilter2_C5_Jaguar\t\t0xff000000\n#define rCCK_TxFilter3_Jaguar\t\t0xa28\n#define bCCK_TxFilter3_C6_Jaguar\t\t0x000000ff\n#define bCCK_TxFilter3_C7_Jaguar\t\t0x0000ff00\n\n\n// YN: mask the following register definition temporarily\n//#define rPdp_AntA      \t\t\t\t\t0xb00  \n//#define rPdp_AntA_4    \t\t\t\t0xb04\n//#define rConfig_Pmpd_AntA \t\t\t0xb28\n//#define rConfig_AntA \t\t\t\t\t0xb68\n//#define rConfig_AntB \t\t\t\t\t0xb6c\n//#define rPdp_AntB \t\t\t\t\t0xb70\n//#define rPdp_AntB_4 \t\t\t\t\t0xb74\n//#define rConfig_Pmpd_AntB\t\t\t0xb98\n//#define rAPK\t\t\t\t\t\t\t0xbd8\n\n// RXIQC\n#define rA_RxIQC_AB_Jaguar    \t0xc10  //RxIQ imblance matrix coeff. A & B\n#define rA_RxIQC_CD_Jaguar    \t0xc14  //RxIQ imblance matrix coeff. C & D\n#define rA_TxScale_Jaguar \t\t0xc1c  // Pah_A TX scaling factor\n#define rB_TxScale_Jaguar \t\t0xe1c  // Path_B TX scaling factor\n#define rB_RxIQC_AB_Jaguar    \t0xe10  //RxIQ imblance matrix coeff. A & B\n#define rB_RxIQC_CD_Jaguar    \t0xe14  //RxIQ imblance matrix coeff. C & D\n#define b_RxIQC_AC_Jaguar\t\t0x02ff  // bit mask for IQC matrix element A & C\n#define b_RxIQC_BD_Jaguar\t\t0x02ff0000 // bit mask for IQC matrix element A & C\n\n\n// DIG-related\n#define rA_IGI_Jaguar\t\t\t\t0xc50\t// Initial Gain for path-A\n#define rB_IGI_Jaguar\t\t\t\t0xe50\t// Initial Gain for path-B\n#define rOFDM_FalseAlarm1_Jaguar\t0xf48  // counter for break\n#define rOFDM_FalseAlarm2_Jaguar\t0xf4c  // counter for spoofing\n#define rCCK_FalseAlarm_Jaguar        \t0xa5c // counter for cck false alarm\n#define b_FalseAlarm_Jaguar\t\t\t0xffff\n#define rCCK_CCA_Jaguar\t\t\t\t0xa08\t// cca threshold\n#define bCCK_CCA_Jaguar\t\t\t\t0x00ff0000\n\n// Tx Power Ttraining-related\n#define rA_TxPwrTraing_Jaguar\t\t0xc54\n#define rB_TxPwrTraing_Jaguar\t\t0xe54\n\n// Report-related\n#define rOFDM_ShortCFOAB_Jaguar\t0xf60  \n#define rOFDM_LongCFOAB_Jaguar\t\t0xf64\n#define rOFDM_EndCFOAB_Jaguar\t\t0xf70\n#define rOFDM_AGCReport_Jaguar\t\t0xf84\n#define rOFDM_RxSNR_Jaguar\t\t\t0xf88\n#define rOFDM_RxEVMCSI_Jaguar\t\t0xf8c\n#define rOFDM_SIGReport_Jaguar\t\t0xf90\n\n// Misc functions\n#define rEDCCA_Jaguar\t\t\t\t0x8a4 // EDCCA\n#define bEDCCA_Jaguar\t\t\t\t0xffff\n#define rAGC_table_Jaguar\t\t\t0x82c   // AGC tabel select\n#define bAGC_table_Jaguar\t\t\t0x3\n#define b_sel5g_Jaguar    \t\t\t\t0x1000 // sel5g\n#define b_LNA_sw_Jaguar\t\t\t\t0x8000 // HW/WS control for LNA\n#define rFc_area_Jaguar\t\t\t\t0x860   // fc_area \n#define bFc_area_Jaguar\t\t\t\t0x1ffe000\n#define rSingleTone_ContTx_Jaguar\t0x914\n\n// RFE\n#define rA_RFE_Pinmux_Jaguar\t0xcb0  // Path_A RFE cotrol pinmux\n#define rB_RFE_Pinmux_Jaguar\t0xeb0 // Path_B RFE control pinmux\n#define rA_RFE_Inv_Jaguar\t\t0xcb4  // Path_A RFE cotrol   \n#define rB_RFE_Inv_Jaguar\t\t0xeb4 // Path_B RFE control\n#define rA_RFE_Jaguar\t\t\t0xcb8  // Path_A RFE cotrol   \n#define rB_RFE_Jaguar\t\t\t0xeb8 // Path_B RFE control\n#define r_ANTSEL_SW_Jaguar\t\t0x900 // ANTSEL SW Control\n#define bMask_RFEInv_Jaguar\t\t0x3ff00000\n#define bMask_AntselPathFollow_Jaguar 0x00030000\n\n// TX AGC \n#define rTxAGC_A_CCK11_CCK1_JAguar\t\t\t\t0xc20\n#define rTxAGC_A_Ofdm18_Ofdm6_JAguar\t\t\t\t0xc24\n#define rTxAGC_A_Ofdm54_Ofdm24_JAguar\t\t\t0xc28\n#define rTxAGC_A_MCS3_MCS0_JAguar\t\t\t\t\t0xc2c\n#define rTxAGC_A_MCS7_MCS4_JAguar\t\t\t\t\t0xc30\n#define rTxAGC_A_MCS11_MCS8_JAguar\t\t\t\t0xc34\n#define rTxAGC_A_MCS15_MCS12_JAguar\t\t\t\t0xc38\n#define rTxAGC_A_Nss1Index3_Nss1Index0_JAguar\t0xc3c\n#define rTxAGC_A_Nss1Index7_Nss1Index4_JAguar\t0xc40\n#define rTxAGC_A_Nss2Index1_Nss1Index8_JAguar\t0xc44\n#define rTxAGC_A_Nss2Index5_Nss2Index2_JAguar\t0xc48\n#define rTxAGC_A_Nss2Index9_Nss2Index6_JAguar\t0xc4c\n#define rTxAGC_B_CCK11_CCK1_JAguar\t\t\t\t0xe20\n#define rTxAGC_B_Ofdm18_Ofdm6_JAguar\t\t\t\t0xe24\n#define rTxAGC_B_Ofdm54_Ofdm24_JAguar\t\t\t0xe28\n#define rTxAGC_B_MCS3_MCS0_JAguar\t\t\t\t\t0xe2c\n#define rTxAGC_B_MCS7_MCS4_JAguar\t\t\t\t\t0xe30\n#define rTxAGC_B_MCS11_MCS8_JAguar\t\t\t\t0xe34\n#define rTxAGC_B_MCS15_MCS12_JAguar\t\t\t\t0xe38\n#define rTxAGC_B_Nss1Index3_Nss1Index0_JAguar\t\t0xe3c\n#define rTxAGC_B_Nss1Index7_Nss1Index4_JAguar\t\t0xe40\n#define rTxAGC_B_Nss2Index1_Nss1Index8_JAguar\t\t0xe44\n#define rTxAGC_B_Nss2Index5_Nss2Index2_JAguar\t\t0xe48\n#define rTxAGC_B_Nss2Index9_Nss2Index6_JAguar\t\t0xe4c\n#define bTxAGC_byte0_Jaguar\t\t\t\t\t\t\t0xff\n#define bTxAGC_byte1_Jaguar\t\t\t\t\t\t\t0xff00\n#define bTxAGC_byte2_Jaguar\t\t\t\t\t\t\t0xff0000\n#define bTxAGC_byte3_Jaguar\t\t\t\t\t\t\t0xff000000\n\n// IQK YN: temporaily mask this part\n//#define rFPGA0_IQK\t\t\t\t\t0xe28\n//#define rTx_IQK_Tone_A\t\t\t\t0xe30\n//#define rRx_IQK_Tone_A\t\t\t\t0xe34\n//#define rTx_IQK_PI_A\t\t\t\t\t0xe38\n//#define rRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n//#define rTx_IQK \t\t\t\t\t\t0xe40\n//#define rRx_IQK\t\t\t\t\t\t0xe44\n//#define rIQK_AGC_Pts\t\t\t\t\t0xe48\n//#define rIQK_AGC_Rsp\t\t\t\t\t0xe4c\n//#define rTx_IQK_Tone_B\t\t\t\t0xe50\n//#define rRx_IQK_Tone_B\t\t\t\t0xe54\n//#define rTx_IQK_PI_B\t\t\t\t\t0xe58\n//#define rRx_IQK_PI_B\t\t\t\t\t0xe5c\n//#define rIQK_AGC_Cont\t\t\t\t0xe60\n\n\n// AFE-related\n#define rA_AFEPwr1_Jaguar\t\t\t\t\t0xc60 // dynamic AFE power control\n#define rA_AFEPwr2_Jaguar\t\t\t\t\t0xc64 // dynamic AFE power control\n#define rA_Rx_WaitCCA_Tx_CCKRFON_Jaguar\t0xc68\n#define rA_Tx_CCKBBON_OFDMRFON_Jaguar\t0xc6c\n#define rA_Tx_OFDMBBON_Tx2Rx_Jaguar\t\t0xc70\n#define rA_Tx2Tx_RXCCK_Jaguar\t\t\t\t0xc74\n#define rA_Rx_OFDM_WaitRIFS_Jaguar\t\t\t0xc78\n#define rA_Rx2Rx_BT_Jaguar\t\t\t\t\t0xc7c\n#define rA_sleep_nav_Jaguar \t\t\t\t\t0xc80\n#define rA_pmpd_Jaguar \t\t\t\t\t\t0xc84\n#define rB_AFEPwr1_Jaguar\t\t\t\t\t0xe60 // dynamic AFE power control\n#define rB_AFEPwr2_Jaguar\t\t\t\t\t0xe64 // dynamic AFE power control\n#define rB_Rx_WaitCCA_Tx_CCKRFON_Jaguar\t0xe68\n#define rB_Tx_CCKBBON_OFDMRFON_Jaguar\t0xe6c\n#define rB_Tx_OFDMBBON_Tx2Rx_Jaguar\t\t0xe70\n#define rB_Tx2Tx_RXCCK_Jaguar\t\t\t\t0xe74\n#define rB_Rx_OFDM_WaitRIFS_Jaguar\t\t\t0xe78\n#define rB_Rx2Rx_BT_Jaguar\t\t\t\t\t0xe7c\n#define rB_sleep_nav_Jaguar \t\t\t\t\t0xe80\n#define rB_pmpd_Jaguar \t\t\t\t\t\t0xe84\n\n\n// YN: mask these registers temporaily\n//#define rTx_Power_Before_IQK_A\t\t0xe94\n//#define rTx_Power_After_IQK_A\t\t\t0xe9c\n\n//#define rRx_Power_Before_IQK_A\t\t0xea0\n//#define rRx_Power_Before_IQK_A_2\t\t0xea4\n//#define rRx_Power_After_IQK_A\t\t\t0xea8\n//#define rRx_Power_After_IQK_A_2\t\t0xeac\n\n//#define rTx_Power_Before_IQK_B\t\t0xeb4\n//#define rTx_Power_After_IQK_B\t\t\t0xebc\n\n//#define rRx_Power_Before_IQK_B\t\t0xec0\n//#define rRx_Power_Before_IQK_B_2\t\t0xec4\n//#define rRx_Power_After_IQK_B\t\t\t0xec8\n//#define rRx_Power_After_IQK_B_2\t\t0xecc\n\n\n// RSSI Dump\n#define rA_RSSIDump_Jaguar \t\t\t0xBF0\n#define rB_RSSIDump_Jaguar \t\t\t0xBF1\n#define rS1_RXevmDump_Jaguar\t\t0xBF4 \n#define rS2_RXevmDump_Jaguar \t\t0xBF5\n#define rA_RXsnrDump_Jaguar\t\t0xBF6\n#define rB_RXsnrDump_Jaguar\t\t0xBF7\n#define rA_CfoShortDump_Jaguar\t\t0xBF8 \n#define rB_CfoShortDump_Jaguar\t\t0xBFA\n#define rA_CfoLongDump_Jaguar\t\t0xBEC\n#define rB_CfoLongDump_Jaguar\t\t0xBEE\n \n\n// RF Register\n//\n#define RF_AC_Jaguar\t\t\t\t0x00\t// \n#define RF_RF_Top_Jaguar\t\t\t0x07\t// \n#define RF_TXLOK_Jaguar\t\t\t\t0x08\t// \n#define RF_TXAPK_Jaguar\t\t\t\t0x0B\n#define RF_CHNLBW_Jaguar \t\t\t0x18\t// RF channel and BW switch\n#define RF_RCK1_Jaguar\t\t\t\t0x1c\t// \n#define RF_RCK2_Jaguar\t\t\t\t0x1d\n#define RF_RCK3_Jaguar   \t\t\t0x1e\n#define RF_ModeTableAddr\t\t\t0x30\n#define RF_ModeTableData0\t\t\t0x31\n#define RF_ModeTableData1\t\t\t0x32\n#define RF_TxLCTank_Jaguar          \t0x54\n#define RF_APK_Jaguar\t\t\t\t0x63\n#define RF_LCK\t\t\t\t\t\t0xB4\n#define RF_WeLut_Jaguar\t\t\t\t0xEF\n\n#define bRF_CHNLBW_MOD_AG_Jaguar\t0x70300\n#define bRF_CHNLBW_BW \t\t\t\t0xc00\n\n\n//\n// RL6052 Register definition\n//\n#define RF_AC\t\t\t\t\t\t0x00\t// \n#define RF_IPA_A\t\t\t\t\t0x0C\t// \n#define RF_TXBIAS_A\t\t\t\t\t0x0D\n#define RF_BS_PA_APSET_G9_G11\t\t0x0E\n#define RF_MODE1\t\t\t\t\t0x10\t// \n#define RF_MODE2\t\t\t\t\t0x11\t// \n#define RF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define RF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n#define RF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define RF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define RF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define RF_0x52 \t\t\t\t\t\t0x52\n#define RF_WE_LUT\t\t\t\t\t0xEF\n\n#define RF_TX_GAIN_OFFSET_8812A(_val) ((abs((_val)) << 1) | (((_val) > 0) ? BIT0 : 0))\n#define RF_TX_GAIN_OFFSET_8821A(_val) ((abs((_val)) << 1) | (((_val) > 0) ? BIT0 : 0))\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define bBBResetB\t\t\t\t\t0x100\t// Useless now?\n#define bGlobalResetB\t\t\t\t0x200\n#define bOFDMTxStart\t\t\t\t0x4\n#define bCCKTxStart\t\t\t\t\t0x8\n#define bCRC32Debug\t\t\t\t\t0x100\n#define bPMACLoopback\t\t\t\t0x10\n#define bTxLSIG\t\t\t\t\t\t0xffffff\n#define bOFDMTxRate\t\t\t\t\t0xf\n#define bOFDMTxReserved\t\t\t0x10\n#define bOFDMTxLength\t\t\t\t0x1ffe0\n#define bOFDMTxParity\t\t\t\t0x20000\n#define bTxHTSIG1\t\t\t\t\t0xffffff\n#define bTxHTMCSRate\t\t\t\t0x7f\n#define bTxHTBW\t\t\t\t\t\t0x80\n#define bTxHTLength\t\t\t\t\t0xffff00\n#define bTxHTSIG2\t\t\t\t\t0xffffff\n#define bTxHTSmoothing\t\t\t\t0x1\n#define bTxHTSounding\t\t\t\t0x2\n#define bTxHTReserved\t\t\t\t0x4\n#define bTxHTAggreation\t\t\t\t0x8\n#define bTxHTSTBC\t\t\t\t\t0x30\n#define bTxHTAdvanceCoding\t\t\t0x40\n#define bTxHTShortGI\t\t\t\t\t0x80\n#define bTxHTNumberHT_LTF\t\t\t0x300\n#define bTxHTCRC8\t\t\t\t\t0x3fc00\n#define bCounterReset\t\t\t\t0x10000\n#define bNumOfOFDMTx\t\t\t\t0xffff\n#define bNumOfCCKTx\t\t\t\t\t0xffff0000\n#define bTxIdleInterval\t\t\t\t0xffff\n#define bOFDMService\t\t\t\t0xffff0000\n#define bTxMACHeader\t\t\t\t0xffffffff\n#define bTxDataInit\t\t\t\t\t0xff\n#define bTxHTMode\t\t\t\t\t0x100\n#define bTxDataType\t\t\t\t\t0x30000\n#define bTxRandomSeed\t\t\t\t0xffffffff\n#define bCCKTxPreamble\t\t\t\t0x1\n#define bCCKTxSFD\t\t\t\t\t0xffff0000\n#define bCCKTxSIG\t\t\t\t\t0xff\n#define bCCKTxService\t\t\t\t0xff00\n#define bCCKLengthExt\t\t\t\t0x8000\n#define bCCKTxLength\t\t\t\t0xffff0000\n#define bCCKTxCRC16\t\t\t\t\t0xffff\n#define bCCKTxStatus\t\t\t\t\t0x1\n#define bOFDMTxStatus\t\t\t\t0x2\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define rPMAC_Reset\t\t\t\t\t0x100\n#define rPMAC_TxStart\t\t\t\t0x104\n#define rPMAC_TxLegacySIG\t\t\t0x108\n#define rPMAC_TxHTSIG1\t\t\t\t0x10c\n#define rPMAC_TxHTSIG2\t\t\t\t0x110\n#define rPMAC_PHYDebug\t\t\t\t0x114\n#define rPMAC_TxPacketNum\t\t\t0x118\n#define rPMAC_TxIdle\t\t\t\t\t0x11c\n#define rPMAC_TxMACHeader0\t\t\t0x120\n#define rPMAC_TxMACHeader1\t\t\t0x124\n#define rPMAC_TxMACHeader2\t\t\t0x128\n#define rPMAC_TxMACHeader3\t\t\t0x12c\n#define rPMAC_TxMACHeader4\t\t\t0x130\n#define rPMAC_TxMACHeader5\t\t\t0x134\n#define rPMAC_TxDataType\t\t\t0x138\n#define rPMAC_TxRandomSeed\t\t0x13c\n#define rPMAC_CCKPLCPPreamble\t\t0x140\n#define rPMAC_CCKPLCPHeader\t\t0x144\n#define rPMAC_CCKCRC16\t\t\t\t0x148\n#define rPMAC_OFDMRxCRC32OK\t\t0x170\n#define rPMAC_OFDMRxCRC32Er\t\t0x174\n#define rPMAC_OFDMRxParityEr\t\t0x178\n#define rPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define rPMAC_CCKCRxRC16Er\t\t\t0x180\n#define rPMAC_CCKCRxRC32Er\t\t\t0x184\n#define rPMAC_CCKCRxRC32OK\t\t\t0x188\n#define rPMAC_TxStatus\t\t\t\t0x18c\n\n//\n// 3. Page8(0x800)\n//\n#define rFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define rFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define rFPGA0_PSDFunction\t\t\t0x808\n#define rFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define rFPGA0_XA_HSSIParameter1\t0x820\t// RF 3 wire register\n#define rFPGA0_XA_HSSIParameter2\t0x824\n#define rFPGA0_XB_HSSIParameter1\t0x828\n#define rFPGA0_XB_HSSIParameter2\t0x82c\n\n#define rFPGA0_XAB_SwitchControl\t0x858\t// RF Channel switch\n#define rFPGA0_XCD_SwitchControl\t0x85c\n\n#define rFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define rFPGA0_XCD_RFParameter\t\t0x87c\n\n#define rFPGA0_AnalogParameter1\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define rFPGA0_AnalogParameter2\t0x884\n#define rFPGA0_AnalogParameter3\t0x888\n#define rFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n#define rFPGA0_AnalogParameter4\t0x88c\n#define rFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define rFPGA0_XCD_RFPara\t0x8b4\n\n//\n// 4. Page9(0x900)\n//\n#define rFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n\n#define rFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define rFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define rFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n\n//\n// PageA(0xA00)\n//\n#define rCCK0_System\t\t\t\t0xa00\n#define rCCK0_AFESetting\t\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\trCCK0_DSPParameter2\t\t\t0xa1c\t//SQ threshold\n#define rCCK0_TxFilter1\t\t\t\t0xa20\n#define rCCK0_TxFilter2\t\t\t\t0xa24\n#define rCCK0_DebugPort\t\t\t\t0xa28\t//debug port and Tx filter3\n#define\trCCK0_FalseAlarmReport\t\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n\n//\n// PageB(0xB00)\n//\n#define rPdp_AntA      \t\t\t\t0xb00  \n#define rPdp_AntA_4    \t\t\t\t0xb04\n#define rConfig_Pmpd_AntA \t\t\t0xb28\n#define rConfig_AntA \t\t\t\t\t0xb68\n#define rConfig_AntB \t\t\t\t\t0xb6c\n#define rPdp_AntB \t\t\t\t\t0xb70\n#define rPdp_AntB_4 \t\t\t\t\t0xb74\n#define rConfig_Pmpd_AntB\t\t\t0xb98\n#define rAPK\t\t\t\t\t\t\t0xbd8\n\n//\n// 6. PageC(0xC00)\n//\n#define rOFDM0_LSTF\t\t\t\t\t0xc00\n\n#define rOFDM0_TRxPathEnable\t\t0xc04\n#define rOFDM0_TRMuxPar\t\t\t0xc08\n#define rOFDM0_TRSWIsolation\t\t0xc0c\n\n#define rOFDM0_XARxAFE\t\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define rOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define rOFDM0_XBRxAFE            \t\t0xc18\n#define rOFDM0_XBRxIQImbalance    \t0xc1c\n#define rOFDM0_XCRxAFE            \t\t0xc20\n#define rOFDM0_XCRxIQImbalance    \t0xc24\n#define rOFDM0_XDRxAFE            \t\t0xc28\n#define rOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define rOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define rOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define rOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define rOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define rOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define rOFDM0_CFOandDAGC\t\t\t0xc44  //CFO & DAGC\n#define rOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define rOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define rOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define rOFDM0_XAAGCCore2\t\t\t0xc54\n#define rOFDM0_XBAGCCore1\t\t\t0xc58\n#define rOFDM0_XBAGCCore2\t\t\t0xc5c\n#define rOFDM0_XCAGCCore1\t\t\t0xc60\n#define rOFDM0_XCAGCCore2\t\t\t0xc64\n#define rOFDM0_XDAGCCore1\t\t\t0xc68\n#define rOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define rOFDM0_AGCParameter1\t\t0xc70\n#define rOFDM0_AGCParameter2\t\t0xc74\n#define rOFDM0_AGCRSSITable\t\t0xc78\n#define rOFDM0_HTSTFAGC\t\t\t0xc7c\n\n#define rOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define rOFDM0_XATxAFE\t\t\t\t0xc84\n#define rOFDM0_XBTxIQImbalance\t\t0xc88\n#define rOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define rOFDM0_XCTxIQImbalance\t\t0xc90\n#define rOFDM0_XCTxAFE            \t\t0xc94\n#define rOFDM0_XDTxIQImbalance\t\t0xc98\n#define rOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define rOFDM0_RxIQExtAnta\t\t\t0xca0\n#define rOFDM0_TxCoeff1\t\t\t\t0xca4\n#define rOFDM0_TxCoeff2\t\t\t\t0xca8\n#define rOFDM0_TxCoeff3\t\t\t\t0xcac\n#define rOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define rOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define rOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define rOFDM0_RxHPParameter\t\t0xce0\n#define rOFDM0_TxPseudoNoiseWgt\t0xce4\n#define rOFDM0_FrameSync\t\t\t0xcf0\n#define rOFDM0_DFSReport\t\t\t0xcf4\n\n//\n// 7. PageD(0xD00)\n//\n#define rOFDM1_LSTF\t\t\t\t\t0xd00\n#define rOFDM1_TRxPathEnable\t\t0xd04\n\n//\n// 8. PageE(0xE00)\n//\n#define rTxAGC_A_Rate18_06\t\t\t0xe00\n#define rTxAGC_A_Rate54_24\t\t\t0xe04\n#define rTxAGC_A_CCK1_Mcs32\t\t0xe08\n#define rTxAGC_A_Mcs03_Mcs00\t\t0xe10\n#define rTxAGC_A_Mcs07_Mcs04\t\t0xe14\n#define rTxAGC_A_Mcs11_Mcs08\t\t0xe18\n#define rTxAGC_A_Mcs15_Mcs12\t\t0xe1c\n\n#define rTxAGC_B_Rate18_06\t\t\t0x830\n#define rTxAGC_B_Rate54_24\t\t\t0x834\n#define rTxAGC_B_CCK1_55_Mcs32\t0x838\n#define rTxAGC_B_Mcs03_Mcs00\t\t0x83c\n#define rTxAGC_B_Mcs07_Mcs04\t\t0x848\n#define rTxAGC_B_Mcs11_Mcs08\t\t0x84c\n#define rTxAGC_B_Mcs15_Mcs12\t\t0x868\n#define rTxAGC_B_CCK11_A_CCK2_11\t0x86c\n\n#define rFPGA0_IQK\t\t\t\t\t0xe28\n#define rTx_IQK_Tone_A\t\t\t\t0xe30\n#define rRx_IQK_Tone_A\t\t\t\t0xe34\n#define rTx_IQK_PI_A\t\t\t\t0xe38\n#define rRx_IQK_PI_A\t\t\t\t0xe3c\n\n#define rTx_IQK \t\t\t\t\t\t0xe40\n#define rRx_IQK\t\t\t\t\t\t0xe44\n#define rIQK_AGC_Pts\t\t\t\t\t0xe48\n#define rIQK_AGC_Rsp\t\t\t\t0xe4c\n#define rTx_IQK_Tone_B\t\t\t\t0xe50\n#define rRx_IQK_Tone_B\t\t\t\t0xe54\n#define rTx_IQK_PI_B\t\t\t\t\t0xe58\n#define rRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define rIQK_AGC_Cont\t\t\t\t0xe60\n\n#define rBlue_Tooth\t\t\t\t\t0xe6c\n#define rRx_Wait_CCA\t\t\t\t0xe70\n#define rTx_CCK_RFON\t\t\t\t0xe74\n#define rTx_CCK_BBON\t\t\t\t0xe78\n#define rTx_OFDM_RFON\t\t\t\t0xe7c\n#define rTx_OFDM_BBON\t\t\t\t0xe80\n#define rTx_To_Rx\t\t\t\t\t0xe84\n#define rTx_To_Tx\t\t\t\t\t0xe88\n#define rRx_CCK\t\t\t\t\t\t0xe8c\n\n#define rTx_Power_Before_IQK_A\t\t0xe94\n#define rTx_Power_After_IQK_A\t\t0xe9c\n\n#define rRx_Power_Before_IQK_A\t\t0xea0\n#define rRx_Power_Before_IQK_A_2\t0xea4\n#define rRx_Power_After_IQK_A\t\t0xea8\n#define rRx_Power_After_IQK_A_2\t\t0xeac\n\n#define rTx_Power_Before_IQK_B\t\t0xeb4\n#define rTx_Power_After_IQK_B\t\t0xebc\n\n#define rRx_Power_Before_IQK_B\t\t0xec0\n#define rRx_Power_Before_IQK_B_2\t0xec4\n#define rRx_Power_After_IQK_B\t\t0xec8\n#define rRx_Power_After_IQK_B_2\t\t0xecc\n\n#define rRx_OFDM\t\t\t\t\t0xed0\n#define rRx_Wait_RIFS \t\t\t\t0xed4\n#define rRx_TO_Rx \t\t\t\t\t0xed8\n#define rStandby \t\t\t\t\t\t0xedc\n#define rSleep \t\t\t\t\t\t0xee0\n#define rPMPD_ANAEN\t\t\t\t0xeec\n\n\n// 2. Page8(0x800)\n#define bRFMOD\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define bJapanMode\t\t\t\t\t0x2\n#define bCCKTxSC\t\t\t\t\t0x30\n#define bCCKEn\t\t\t\t\t\t0x1000000\n#define bOFDMEn\t\t\t\t\t\t0x2000000\n#define bXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define bXCTxAGC                  \t\t\t0xf000\n#define bXDTxAGC                  \t\t\t0xf0000\n\n// 4. PageA(0xA00)\n#define bCCKBBMode                \t\t\t0x3\t// Useless\n#define bCCKTxPowerSaving         \t\t0x80\n#define bCCKRxPowerSaving         \t\t0x40\n\n#define bCCKSideBand              \t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define bCCKScramble              \t\t0x8\t// Useless\n#define bCCKAntDiversity    \t\t      \t0x8000\n#define bCCKCarrierRecovery   \t    \t0x4000\n#define bCCKTxRate           \t\t     \t0x3000\n#define bCCKDCCancel             \t \t\t0x0800\n#define bCCKISICancel             \t\t\t0x0400\n#define bCCKMatchFilter           \t\t0x0200\n#define bCCKEqualizer             \t\t\t0x0100\n#define bCCKPreambleDetect       \t \t0x800000\n#define bCCKFastFalseCCA          \t\t0x400000\n#define bCCKChEstStart            \t\t0x300000\n#define bCCKCCACount              \t\t0x080000\n#define bCCKcs_lim                \t\t\t0x070000\n#define bCCKBistMode              \t\t\t0x80000000\n#define bCCKCCAMask             \t  \t\t0x40000000\n#define bCCKTxDACPhase         \t   \t0x4\n#define bCCKRxADCPhase         \t   \t0x20000000   //r_rx_clk\n#define bCCKr_cp_mode0         \t   \t0x0100\n#define bCCKTxDCOffset           \t \t0xf0\n#define bCCKRxDCOffset           \t \t0xf\n#define bCCKCCAMode              \t \t\t0xc000\n#define bCCKFalseCS_lim           \t\t0x3f00\n#define bCCKCS_ratio              \t\t\t0xc00000\n#define bCCKCorgBit_sel           \t\t0x300000\n#define bCCKPD_lim                \t\t\t0x0f0000\n#define bCCKNewCCA                \t\t0x80000000\n#define bCCKRxHPofIG              \t\t0x8000\n#define bCCKRxIG                  \t\t\t0x7f00\n#define bCCKLNAPolarity           \t\t0x800000\n#define bCCKRx1stGain             \t\t0x7f0000\n#define bCCKRFExtend              \t\t0x20000000 //CCK Rx Iinital gain polarity\n#define bCCKRxAGCSatLevel        \t \t0x1f000000\n#define bCCKRxAGCSatCount       \t  \t0xe0\n#define bCCKRxRFSettle            \t\t0x1f       //AGCsamp_dly\n#define bCCKFixedRxAGC           \t \t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define bCCKAntennaPolarity      \t \t0x2000\n#define bCCKTxFilterType          \t\t0x0c00\n#define bCCKRxAGCReportType   \t   \t0x0300\n#define bCCKRxDAGCEn              \t\t0x80000000\n#define bCCKRxDAGCPeriod        \t  \t0x20000000\n#define bCCKRxDAGCSatLevel     \t   \t0x1f000000\n#define bCCKTimingRecovery       \t \t0x800000\n#define bCCKTxC0                  \t\t\t0x3f0000\n#define bCCKTxC1                  \t\t\t0x3f000000\n#define bCCKTxC2                  \t\t\t0x3f\n#define bCCKTxC3                  \t\t\t0x3f00\n#define bCCKTxC4                  \t\t\t0x3f0000\n#define bCCKTxC5                  \t\t\t0x3f000000\n#define bCCKTxC6                  \t\t\t0x3f\n#define bCCKTxC7                  \t\t\t0x3f00\n#define bCCKDebugPort             \t\t0xff0000\n#define bCCKDACDebug              \t\t0x0f000000\n#define bCCKFalseAlarmEnable      \t\t0x8000\n#define bCCKFalseAlarmRead        \t\t0x4000\n#define bCCKTRSSI                 \t\t\t0x7f\n#define bCCKRxAGCReport           \t\t0xfe\n#define bCCKRxReport_AntSel       \t\t0x80000000\n#define bCCKRxReport_MFOff        \t\t0x40000000\n#define bCCKRxRxReport_SQLoss     \t0x20000000\n#define bCCKRxReport_Pktloss      \t\t0x10000000\n#define bCCKRxReport_Lockedbit    \t0x08000000\n#define bCCKRxReport_RateError    \t0x04000000\n#define bCCKRxReport_RxRate       \t\t0x03000000\n#define bCCKRxFACounterLower      \t0xff\n#define bCCKRxFACounterUpper      \t0xff000000\n#define bCCKRxHPAGCStart          \t\t0xe000\n#define bCCKRxHPAGCFinal          \t\t0x1c00       \t\t\n#define bCCKRxFalseAlarmEnable    \t0x8000\n#define bCCKFACounterFreeze       \t\t0x4000       \t\t\n#define bCCKTxPathSel             \t\t0x10000000\n#define bCCKDefaultRxPath         \t\t0xc000000\n#define bCCKOptionRxPath          \t\t0x3000000\n\n// 6. PageE(0xE00)\n#define bSTBCEn                  \t\t\t0x4\t// Useless\n#define bAntennaMapping          \t\t0x10\n#define bNss                     \t\t\t\t0x20\n#define bCFOAntSumD              \t\t0x200\n#define bPHYCounterReset         \t\t0x8000000\n#define bCFOReportGet            \t\t\t0x4000000\n#define bOFDMContinueTx          \t\t0x10000000\n#define bOFDMSingleCarrier       \t\t0x20000000\n#define bOFDMSingleTone          \t\t0x40000000\n\n\n//\n// Other Definition\n//\n\n#define bEnable                   0x1\t// Useless\n#define bDisable                  0x0\n\n//byte endable for srwrite\n#define bByte0                    \t\t0x1\t// Useless\n#define bByte1                    \t\t0x2\n#define bByte2                    \t\t0x4\n#define bByte3                    \t\t0x8\n#define bWord0                    \t\t0x3\n#define bWord1                    \t\t0xc\n#define bDWord                    \t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define bMaskByte0                \t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define bMaskByte1                \t\t0xff00\n#define bMaskByte2                \t\t0xff0000\n#define bMaskByte3                \t\t0xff000000\n#define bMaskHWord                \t0xffff0000\n#define bMaskLWord                \t\t0x0000ffff\n#define bMaskDWord                \t0xffffffff\n#define bMaskH3Bytes\t\t\t\t0xffffff00\n#define bMask12Bits\t\t\t\t0xfff\t\n#define bMaskH4Bits\t\t\t\t0xf0000000\t\n#define bMaskOFDM_D\t\t\t0xffc00000\n#define bMaskCCK\t\t\t\t0x3f3f3f3f\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8812PwrSeq.h",
    "content": "\n/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL8812PWRSEQ_H__\n#define __HAL8812PWRSEQ_H__\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WB-110628-DZ-RTL8195 (Jaguar) Power Architecture-R04.pdf\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8812_TRANS_CARDEMU_TO_ACT_STEPS\t15\n#define\tRTL8812_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8812_TRANS_CARDEMU_TO_SUS_STEPS\t15\n#define\tRTL8812_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8812_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8812_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8812_TRANS_ACT_TO_LPS_STEPS\t15\n#define\tRTL8812_TRANS_LPS_TO_ACT_STEPS\t15\t\n#define\tRTL8812_TRANS_END_STEPS\t1\n\n\n#define RTL8812_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t/*{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, disable HWPDN 0x04[15]=0*/ \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0},/* disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\n\n#define RTL8812_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /* 0x2[0] = 0\t RESET BB, CLOSE RF */\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t/*{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},//0x1F[7:0] = 0 turn off RF*/\t\\\n\t/*{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},//0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x2A}, /* 0x07[7:0] = 0x28 sps pwm mode 0x2a for BT coex*/\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */\t\\\n\t/*{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0}, //  0x02[1:0] = 0\treset BB */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\n\n#define RTL8812_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\\\n\t{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\\\n\t{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */\t\\\n\t{0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */\t\\\n\t{0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* suspend option all off */\t\\\n\t{0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'11 enable WL suspend for PCIe*/\t\n\n#define RTL8812_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO sleep mode leave */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */\t\\\n\t{0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */\t\\\n\t{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */\n\n#define RTL8812_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t/**{0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, //0x194[0]=0 , disable 32K clock*/\t\\\n\t/**{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x94}, //0x93=0x94 , 90[30] =0 enable 500k ANA clock .switch clock from 12M to 500K , 90 [26] =0 disable EEprom loader clock*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x03[2] = 0, reset 8051*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x05}, /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/\t\\\n\t{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},\\\n\t{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},\\\n\t{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},/* gpio11 input mode, gpio10~8 output mode */\t\\\n\t{0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */\t\\\n\t{0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */\t\\\n\t{0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, BIT7},/*0x14[7] = 1 turn on ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, BIT0},/* 0x15[0] =1 trun on ZCD */\t\\\n\t{0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/*0x12[0] = 0 force PFM mode */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},/*0x8[1] = 0 ANA clk =500k */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x01f[1]=0 , disable RFC_0  control  REG_RF_CTRL_8812 */\t\\\n\t{0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /*0x076[1]=0 , disable RFC_1  control REG_OPT_CTRL_8812 +2 */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 2b'01 enable WL suspend*/\t\n\n#define RTL8812_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/                       \\\n\t{0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x12[0] = 1 force PWM mode */\t\\\n\t{0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x80, 0},/*0x14[7] = 0 turn off ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x01, 0},/* 0x15[0] =0 trun off ZCD */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO leave sleep mode */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */\t\\\n\t{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */ \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x04[10] = 0, enable SW LPS PCIE only*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 2b'01enable WL suspend*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x03[2] = 1, enable 8051*/\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\n\n\n#define RTL8812_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8812_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8812_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/\t\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated,and RF closed*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\t\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\n\n\n#define RTL8812_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\t\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\t\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\t\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\t\t\t\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\t\t\t\t\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n#define RTL8812_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_SUS_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS+RTL8812_TRANS_CARDEMU_TO_PDN_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS+RTL8812_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS+RTL8812_TRANS_END_STEPS];\n\n#endif //__HAL8812PWRSEQ_H__\n\n"
  },
  {
    "path": "include/Hal8814PhyCfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8814PHYCFG_H__\n#define __INC_HAL8814PHYCFG_H__\n\n\n/*--------------------------Define Parameters-------------------------------*/\n#define LOOP_LIMIT\t\t\t\t5\n#define MAX_STALL_TIME\t\t\t50\t\t//us\n#define AntennaDiversityValue\t0x80\t//(Adapter->bSoftwareAntennaDiversity ? 0x00:0x80)\n#define MAX_TXPWR_IDX_NMODE_92S\t63\n#define Reset_Cnt_Limit\t\t\t3\n\n\n#ifdef CONFIG_PCI_HCI\n#define MAX_AGGR_NUM\t0x0B\n#else\n#define MAX_AGGR_NUM\t0x07\n#endif // CONFIG_PCI_HCI\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/* BB/RF related */\n\n#define\tSIC_ENABLE\t\t\t\t0\n\n/*------------------------------Define structure----------------------------*/ \n\n\n/*------------------------Export global variable----------------------------*/\n/*------------------------Export global variable----------------------------*/\n\n\n/*------------------------Export Marco Definition---------------------------*/\n/*------------------------Export Marco Definition---------------------------*/\n\n\n/*--------------------------Exported Function prototype---------------------*/\n//1. BB register R/W API\n\nextern\tu32\t\nPHY_QueryBBReg8814A(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\tBitMask\t);\n\n\nVOID\t\nPHY_SetBBReg8814A(\tIN\tPADAPTER\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu32\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\tData\t);\n\n\nextern\tu32\t\nPHY_QueryRFReg8814A(\tIN\tPADAPTER\t\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\tBitMask\t);\n\n\nvoid\t\nPHY_SetRFReg8814A(\tIN\tPADAPTER\t\t\tAdapter,\n\t\t\t\t\t\t\t\tIN\tu8\t\t\teRFPath,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tRegAddr,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tBitMask,\n\t\t\t\t\t\t\t\tIN\tu32\t\t\t\tData\t);\n\n//1 3. Initial BB/RF config by reading MAC/BB/RF txt.\ns32\nphy_BB8814A_Config_ParaFile(\n\tIN\tPADAPTER\tAdapter\n\t);\n\n\nRT_STATUS\nPHY_BBConfigMP_8814A(\n\tIN\tPADAPTER\tAdapter\n\t);\n\nVOID\nPHY_ConfigBB_8814A(\n\tIN\tPADAPTER\tAdapter\n\t);\n\n\nVOID\nphy_ADC_CLK_8814A(\n\tIN\tPADAPTER\tAdapter\n\t);\n\ns32\nPHY_RFConfig8814A(\n\tIN\tPADAPTER\tAdapter\t\n\t);\n\n//\n// RF Power setting\n//\n//BOOLEAN\tPHY_SetRFPowerState8814A(PADAPTER Adapter, rt_rf_power_state\teRFPowerState);\n\n//1 5. Tx  Power setting API\n\nVOID\t\nPHY_GetTxPowerLevel8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tOUT ps4Byte\t\t\tpowerlevel\n\t);\n\nVOID\t\nPHY_SetTxPowerLevel8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\tChannel \n\t);\n\nu8\nPHY_GetTxPowerIndex_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN  u8  \t\t\t\tRFPath,\n\tIN\tu8\t\t\t\tRate,\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel\n\t);\n\nVOID\nPHY_SetTxPowerIndex_8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu32\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tRate\n\t);\n\n\nBOOLEAN\nPHY_UpdateTxPowerDbm8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\ts4Byte\t\tpowerInDbm\t\n\t);\n\n\nu32 \nPHY_GetTxBBSwing_8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tBAND_TYPE \tBand,\n\tIN \tu8 \t\tRFPath\n\t);\n\n\n\n//1 6. Channel setting API\n\nVOID\nPHY_SwChnlTimerCallback8814A(\n\tIN\tPRT_TIMER\t\tpTimer\n\t);\n\nVOID\nPHY_SwChnlWorkItemCallback8814A(\n\tIN PVOID            pContext\n\t);\n\n\nVOID\nHAL_HandleSwChnl8814A(\t\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tchannel\n\t);\n\nVOID\t\nPHY_SwChnlSynchronously8814A(\tIN\tPADAPTER\t\tpAdapter,\n\t\t\t\t\t\t\t\t\t\tIN\tu8\t\t\tchannel\t);\n\nVOID\nPHY_SwChnlAndSetBWModeCallback8814A(IN PVOID            pContext);\n\n\nVOID\nPHY_HandleSwChnlAndSetBW8814A(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tBOOLEAN\t\t\t\tbSwitchChannel,\n\tIN\tBOOLEAN\t\t\t\tbSetBandWidth,\n\tIN\tu8\t\t\t\t\tChannelNum,\n\tIN\tCHANNEL_WIDTH\t\tChnlWidth,\n\tIN\tu8\t\t\t\t\tChnlOffsetOf40MHz,\n\tIN\tu8\t\t\t\t\tChnlOffsetOf80MHz,\n\tIN\tu8\t\t\t\t\tCenterFrequencyIndex1\n);\n\n\nBOOLEAN \nPHY_QueryRFPathSwitch_8814A(\tIN\tPADAPTER\tpAdapter);\n\n\n\n//VOID PHY_SetMonitorMode8814A(PADAPTER pAdapter, BOOLEAN bEnableMonitorMode);\n\n\n#if (USE_WORKITEM)\nVOID\nRtCheckForHangWorkItemCallback8814A(\n                IN PVOID   pContext\n);\n#endif\n\nBOOLEAN\nSetAntennaConfig8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\tDefaultAnt\t\n\t);\n\nVOID\nPHY_SetRFEReg8814A(\n\tIN PADAPTER\t\tAdapter,\n\tIN BOOLEAN\t\tbInit,\n\tIN u8\t\tBand\n\t);\n\n\ns32\nPHY_SwitchWirelessBand8814A(\n\tIN PADAPTER\t\t Adapter,\n\tIN u8\t\tBand\n);\n\nVOID\nPHY_SetIO_8814A(\n    PADAPTER\t\tpAdapter\n    );\n\nVOID\nPHY_SetBWMode8814(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\t// 20M or 40M\n\tIN\tu8\t\t\t\t\tOffset\t\t// Upper, Lower, or Don't care\n);\n\nVOID\nPHY_SwChnl8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel\n\t);\n\nVOID\nPHY_SetSwChnlBWMode8814(\n\tIN\tPADAPTER\t\t\tAdapter,\n\tIN\tu8\t\t\t\t\tchannel,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth,\n\tIN\tu8\t\t\t\t\tOffset40,\n\tIN\tu8\t\t\t\t\tOffset80\n);\n\ns32 PHY_MACConfig8814(PADAPTER Adapter);\nint PHY_BBConfig8814(PADAPTER\tAdapter);\nVOID PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER\tpAdapter, u4Byte ulAntennaRx);\n\n\n\n/*--------------------------Exported Function prototype---------------------*/\n\n/*--------------------------Exported Function prototype---------------------*/\n#endif\t// __INC_HAL8192CPHYCFG_H\n\n"
  },
  {
    "path": "include/Hal8814PhyReg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __INC_HAL8814PHYREG_H__\n#define __INC_HAL8814PHYREG_H__\n/*--------------------------Define Parameters-------------------------------*/\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n/* BB Register Definition */\n\n#define rCCAonSec_Jaguar\t\t0x838\n#define rPwed_TH_Jaguar\t\t\t0x830\n#define rL1_Weight_Jaguar\t\t0x840\n#define\tr_L1_SBD_start_time\t\t0x844\n\n// BW and sideband setting\n#define rBWIndication_Jaguar\t\t0x834\n#define rL1PeakTH_Jaguar\t\t0x848\n#define rRFMOD_Jaguar\t\t\t0x8ac\t//RF mode \n#define rADC_Buf_Clk_Jaguar\t\t0x8c4\n#define\trADC_Buf_40_Clk_Jaguar2\t\t0x8c8\n#define rRFECTRL_Jaguar\t\t\t0x900\n#define bRFMOD_Jaguar\t\t\t0xc3\n#define rCCK_System_Jaguar\t\t0xa00   // for cck sideband\n#define bCCK_System_Jaguar\t\t0x10\n\n// Block & Path enable\n#define rOFDMCCKEN_Jaguar \t\t0x808 // OFDM/CCK block enable\n#define bOFDMEN_Jaguar\t\t\t0x20000000\n#define bCCKEN_Jaguar\t\t\t0x10000000\n#define rRxPath_Jaguar\t\t\t0x808\t// Rx antenna\n#define bRxPath_Jaguar\t\t\t0xff\n#define rTxPath_Jaguar\t\t\t0x80c\t// Tx antenna\n#define bTxPath_Jaguar\t\t\t0x0fffffff\n#define rCCK_RX_Jaguar\t\t\t0xa04\t// for cck rx path selection\n#define bCCK_RX_Jaguar\t\t\t0x0c000000 \n#define rVhtlen_Use_Lsig_Jaguar\t0x8c3\t// Use LSIG for VHT length\n\n#define\trRxPath_Jaguar2\t\t\t\t0xa04\t// Rx antenna\n#define\trTxAnt_1Nsts_Jaguar2\t\t0x93c\t// Tx antenna for 1Nsts\n#define\trTxAnt_23Nsts_Jaguar2\t\t0x940\t// Tx antenna for 2Nsts and 3Nsts\n\n\n// RF read/write-related\n#define rHSSIRead_Jaguar\t\t\t0x8b0  // RF read addr\n#define bHSSIRead_addr_Jaguar\t\t0xff\n#define bHSSIRead_trigger_Jaguar\t0x100\n#define rA_PIRead_Jaguar\t\t\t0xd04 // RF readback with PI\n#define rB_PIRead_Jaguar\t\t\t0xd44 // RF readback with PI\n#define rA_SIRead_Jaguar\t\t\t0xd08 // RF readback with SI\n#define rB_SIRead_Jaguar\t\t\t0xd48 // RF readback with SI\n#define rRead_data_Jaguar\t\t\t0xfffff\n#define rA_LSSIWrite_Jaguar\t\t\t0xc90 // RF write addr\n#define rB_LSSIWrite_Jaguar\t\t\t0xe90 // RF write addr\n#define bLSSIWrite_data_Jaguar\t\t0x000fffff\n#define bLSSIWrite_addr_Jaguar\t\t0x0ff00000\n\n#define\trC_PIRead_Jaguar2\t\t\t0xd84 // RF readback with PI\n#define\trD_PIRead_Jaguar2\t\t\t0xdC4 // RF readback with PI\n#define\trC_SIRead_Jaguar2\t\t\t0xd88 // RF readback with SI\n#define\trD_SIRead_Jaguar2\t\t\t0xdC8 // RF readback with SI\n#define\trC_LSSIWrite_Jaguar2\t\t0x1890 // RF write addr\n#define\trD_LSSIWrite_Jaguar2\t\t0x1A90 // RF write addr\n\n\n// YN: mask the following register definition temporarily \n#define rFPGA0_XA_RFInterfaceOE\t\t\t0x860\t// RF Channel switch\n#define rFPGA0_XB_RFInterfaceOE\t\t\t0x864\n\n#define rFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define rFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n//#define rFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n//#define rFPGA0_XCD_RFParameter\t\t0x87c\n\n//#define rFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n//#define rFPGA0_AnalogParameter2\t\t0x884\n//#define rFPGA0_AnalogParameter3\t\t0x888\n//#define rFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n//#define rFPGA0_AnalogParameter4\t\t0x88c\n\n\n// CCK TX scaling\n#define rCCK_TxFilter1_Jaguar\t\t0xa20\n#define bCCK_TxFilter1_C0_Jaguar   \t0x00ff0000\n#define bCCK_TxFilter1_C1_Jaguar\t\t0xff000000\n#define rCCK_TxFilter2_Jaguar\t\t0xa24\n#define bCCK_TxFilter2_C2_Jaguar\t\t0x000000ff\n#define bCCK_TxFilter2_C3_Jaguar\t\t0x0000ff00\n#define bCCK_TxFilter2_C4_Jaguar\t\t0x00ff0000\n#define bCCK_TxFilter2_C5_Jaguar\t\t0xff000000\n#define rCCK_TxFilter3_Jaguar\t\t0xa28\n#define bCCK_TxFilter3_C6_Jaguar\t\t0x000000ff\n#define bCCK_TxFilter3_C7_Jaguar\t\t0x0000ff00\n/* NBI & CSI Mask setting */\n#define\trCSI_Mask_Setting1_Jaguar\t0x874\n#define\trCSI_Fix_Mask0_Jaguar\t\t0x880\n#define\trCSI_Fix_Mask1_Jaguar\t\t0x884\n#define\trCSI_Fix_Mask2_Jaguar\t\t0x888\n#define\trCSI_Fix_Mask3_Jaguar\t\t0x88c\n#define\trCSI_Fix_Mask4_Jaguar\t\t0x890\n#define\trCSI_Fix_Mask5_Jaguar\t\t0x894\n#define\trCSI_Fix_Mask6_Jaguar\t\t0x898\n#define\trCSI_Fix_Mask7_Jaguar\t\t0x89c\n#define\trNBI_Setting_Jaguar\t\t\t0x87c\n\n\n// YN: mask the following register definition temporarily\n//#define rPdp_AntA      \t\t\t\t\t0xb00  \n//#define rPdp_AntA_4    \t\t\t\t0xb04\n//#define rConfig_Pmpd_AntA \t\t\t0xb28\n//#define rConfig_AntA \t\t\t\t\t0xb68\n//#define rConfig_AntB \t\t\t\t\t0xb6c\n//#define rPdp_AntB \t\t\t\t\t0xb70\n//#define rPdp_AntB_4 \t\t\t\t\t0xb74\n//#define rConfig_Pmpd_AntB\t\t\t0xb98\n//#define rAPK\t\t\t\t\t\t\t0xbd8\n\n// RXIQC\n#define rA_RxIQC_AB_Jaguar    \t0xc10  //RxIQ imblance matrix coeff. A & B\n#define rA_RxIQC_CD_Jaguar    \t0xc14  //RxIQ imblance matrix coeff. C & D\n#define rA_TxScale_Jaguar \t\t0xc1c  // Pah_A TX scaling factor\n#define rB_TxScale_Jaguar \t\t0xe1c  // Path_B TX scaling factor\n#define rB_RxIQC_AB_Jaguar    \t0xe10  //RxIQ imblance matrix coeff. A & B\n#define rB_RxIQC_CD_Jaguar    \t0xe14  //RxIQ imblance matrix coeff. C & D\n#define b_RxIQC_AC_Jaguar\t\t0x02ff  // bit mask for IQC matrix element A & C\n#define b_RxIQC_BD_Jaguar\t\t0x02ff0000 // bit mask for IQC matrix element A & C\n\n#define\trC_TxScale_Jaguar2 \t\t0x181c  // Pah_C TX scaling factor\n#define\trD_TxScale_Jaguar2 \t\t0x1A1c  // Path_D TX scaling factor\n#define\trRF_TxGainOffset\t\t0x55\n\n// DIG-related\n#define rA_IGI_Jaguar\t\t\t\t0xc50\t// Initial Gain for path-A\n#define rB_IGI_Jaguar\t\t\t\t0xe50\t// Initial Gain for path-B\n#define\trC_IGI_Jaguar2\t\t\t\t0x1850\t// Initial Gain for path-C\n#define\trD_IGI_Jaguar2\t\t\t\t0x1A50\t// Initial Gain for path-D\n\n#define rOFDM_FalseAlarm1_Jaguar\t0xf48  // counter for break\n#define rOFDM_FalseAlarm2_Jaguar\t0xf4c  // counter for spoofing\n#define rCCK_FalseAlarm_Jaguar        \t0xa5c // counter for cck false alarm\n#define b_FalseAlarm_Jaguar\t\t\t0xffff\n#define rCCK_CCA_Jaguar\t\t\t\t0xa08\t// cca threshold\n#define bCCK_CCA_Jaguar\t\t\t\t0x00ff0000\n\n// Tx Power Ttraining-related\n#define rA_TxPwrTraing_Jaguar\t\t0xc54\n#define rB_TxPwrTraing_Jaguar\t\t0xe54\n\n// Report-related\n#define rOFDM_ShortCFOAB_Jaguar\t0xf60  \n#define rOFDM_LongCFOAB_Jaguar\t\t0xf64\n#define rOFDM_EndCFOAB_Jaguar\t\t0xf70\n#define rOFDM_AGCReport_Jaguar\t\t0xf84\n#define rOFDM_RxSNR_Jaguar\t\t\t0xf88\n#define rOFDM_RxEVMCSI_Jaguar\t\t0xf8c\n#define rOFDM_SIGReport_Jaguar\t\t0xf90\n\n// Misc functions\n#define rEDCCA_Jaguar\t\t\t\t0x8a4 // EDCCA\n#define bEDCCA_Jaguar\t\t\t\t0xffff\n#define rAGC_table_Jaguar\t\t\t0x82c   // AGC tabel select\n#define bAGC_table_Jaguar\t\t\t0x3\n#define b_sel5g_Jaguar    \t\t\t\t0x1000 // sel5g\n#define b_LNA_sw_Jaguar\t\t\t\t0x8000 // HW/WS control for LNA\n#define rFc_area_Jaguar\t\t\t\t0x860   // fc_area \n#define bFc_area_Jaguar\t\t\t\t0x1ffe000\n#define rSingleTone_ContTx_Jaguar\t0x914\n\n#define\trAGC_table_Jaguar2\t\t\t0x958\t// AGC tabel select\n#define\trDMA_trigger_Jaguar2\t\t0x95C\t// ADC sample mode\n\n\n// RFE\n#define rA_RFE_Pinmux_Jaguar\t0xcb0  // Path_A RFE cotrol pinmux\n#define rB_RFE_Pinmux_Jaguar\t0xeb0 // Path_B RFE control pinmux\n#define rA_RFE_Inv_Jaguar\t\t0xcb4  // Path_A RFE cotrol   \n#define rB_RFE_Inv_Jaguar\t\t0xeb4 // Path_B RFE control\n#define rA_RFE_Jaguar\t\t\t0xcb8  // Path_A RFE cotrol   \n#define rB_RFE_Jaguar\t\t\t0xeb8 // Path_B RFE control\n#define r_ANTSEL_SW_Jaguar\t\t0x900 // ANTSEL SW Control\n#define bMask_RFEInv_Jaguar\t\t0x3ff00000\n#define bMask_AntselPathFollow_Jaguar 0x00030000\n\n#define\trC_RFE_Pinmux_Jaguar\t0x18B4\t// Path_C RFE cotrol pinmux\n#define\trD_RFE_Pinmux_Jaguar\t0x1AB4\t// Path_D RFE cotrol pinmux\n#define\trA_RFE_Sel_Jaguar2\t\t0x1990\n\n\n\n// TX AGC \n#define rTxAGC_A_CCK11_CCK1_JAguar\t\t\t\t0xc20\n#define rTxAGC_A_Ofdm18_Ofdm6_JAguar\t\t\t\t0xc24\n#define rTxAGC_A_Ofdm54_Ofdm24_JAguar\t\t\t0xc28\n#define rTxAGC_A_MCS3_MCS0_JAguar\t\t\t\t\t0xc2c\n#define rTxAGC_A_MCS7_MCS4_JAguar\t\t\t\t\t0xc30\n#define rTxAGC_A_MCS11_MCS8_JAguar\t\t\t\t0xc34\n#define rTxAGC_A_MCS15_MCS12_JAguar\t\t\t\t0xc38\n#define rTxAGC_A_Nss1Index3_Nss1Index0_JAguar\t0xc3c\n#define rTxAGC_A_Nss1Index7_Nss1Index4_JAguar\t0xc40\n#define rTxAGC_A_Nss2Index1_Nss1Index8_JAguar\t0xc44\n#define rTxAGC_A_Nss2Index5_Nss2Index2_JAguar\t0xc48\n#define rTxAGC_A_Nss2Index9_Nss2Index6_JAguar\t0xc4c\n#define rTxAGC_B_CCK11_CCK1_JAguar\t\t\t\t0xe20\n#define rTxAGC_B_Ofdm18_Ofdm6_JAguar\t\t\t\t0xe24\n#define rTxAGC_B_Ofdm54_Ofdm24_JAguar\t\t\t0xe28\n#define rTxAGC_B_MCS3_MCS0_JAguar\t\t\t\t\t0xe2c\n#define rTxAGC_B_MCS7_MCS4_JAguar\t\t\t\t\t0xe30\n#define rTxAGC_B_MCS11_MCS8_JAguar\t\t\t\t0xe34\n#define rTxAGC_B_MCS15_MCS12_JAguar\t\t\t\t0xe38\n#define rTxAGC_B_Nss1Index3_Nss1Index0_JAguar\t\t0xe3c\n#define rTxAGC_B_Nss1Index7_Nss1Index4_JAguar\t\t0xe40\n#define rTxAGC_B_Nss2Index1_Nss1Index8_JAguar\t\t0xe44\n#define rTxAGC_B_Nss2Index5_Nss2Index2_JAguar\t\t0xe48\n#define rTxAGC_B_Nss2Index9_Nss2Index6_JAguar\t\t0xe4c\n#define bTxAGC_byte0_Jaguar\t\t\t\t\t\t\t0xff\n#define bTxAGC_byte1_Jaguar\t\t\t\t\t\t\t0xff00\n#define bTxAGC_byte2_Jaguar\t\t\t\t\t\t\t0xff0000\n#define bTxAGC_byte3_Jaguar\t\t\t\t\t\t\t0xff000000\n\n\n// TX AGC \n#define\t\trTxAGC_A_CCK11_CCK1_Jaguar2\t0xc20\n#define\t\trTxAGC_A_Ofdm18_Ofdm6_Jaguar2\t0xc24\n#define\t\trTxAGC_A_Ofdm54_Ofdm24_Jaguar2\t0xc28\n#define\t\trTxAGC_A_MCS3_MCS0_Jaguar2\t0xc2c\n#define\t\trTxAGC_A_MCS7_MCS4_Jaguar2\t0xc30\n#define\t\trTxAGC_A_MCS11_MCS8_Jaguar2\t0xc34\n#define\t\trTxAGC_A_MCS15_MCS12_Jaguar2\t0xc38\n#define\t\trTxAGC_A_MCS19_MCS16_Jaguar2\t0xcd8\n#define\t\trTxAGC_A_MCS23_MCS20_Jaguar2\t0xcdc\n#define\t\trTxAGC_A_Nss1Index3_Nss1Index0_Jaguar2\t0xc3c\n#define\t\trTxAGC_A_Nss1Index7_Nss1Index4_Jaguar2\t0xc40\n#define\t\trTxAGC_A_Nss2Index1_Nss1Index8_Jaguar2\t0xc44\n#define\t\trTxAGC_A_Nss2Index5_Nss2Index2_Jaguar2\t0xc48\n#define\t\trTxAGC_A_Nss2Index9_Nss2Index6_Jaguar2\t0xc4c\n#define\t\trTxAGC_A_Nss3Index3_Nss3Index0_Jaguar2\t0xce0\n#define\t\trTxAGC_A_Nss3Index7_Nss3Index4_Jaguar2\t0xce4\n#define\t\trTxAGC_A_Nss3Index9_Nss3Index8_Jaguar2\t0xce8\n#define\t\trTxAGC_B_CCK11_CCK1_Jaguar2\t0xe20\n#define\t\trTxAGC_B_Ofdm18_Ofdm6_Jaguar2\t0xe24\n#define\t\trTxAGC_B_Ofdm54_Ofdm24_Jaguar2\t0xe28\n#define\t\trTxAGC_B_MCS3_MCS0_Jaguar2\t0xe2c\n#define\t\trTxAGC_B_MCS7_MCS4_Jaguar2\t0xe30\n#define\t\trTxAGC_B_MCS11_MCS8_Jaguar2\t0xe34\n#define\t\trTxAGC_B_MCS15_MCS12_Jaguar2\t0xe38\n#define\t\trTxAGC_B_MCS19_MCS16_Jaguar2\t0xed8\n#define\t\trTxAGC_B_MCS23_MCS20_Jaguar2\t0xedc\n#define\t\trTxAGC_B_Nss1Index3_Nss1Index0_Jaguar2\t0xe3c\n#define\t\trTxAGC_B_Nss1Index7_Nss1Index4_Jaguar2\t0xe40\n#define\t\trTxAGC_B_Nss2Index1_Nss1Index8_Jaguar2\t0xe44\n#define\t\trTxAGC_B_Nss2Index5_Nss2Index2_Jaguar2\t0xe48\n#define\t\trTxAGC_B_Nss2Index9_Nss2Index6_Jaguar2\t0xe4c\n#define\t\trTxAGC_B_Nss3Index3_Nss3Index0_Jaguar2\t0xee0\n#define\t\trTxAGC_B_Nss3Index7_Nss3Index4_Jaguar2\t0xee4\n#define\t\trTxAGC_B_Nss3Index9_Nss3Index8_Jaguar2\t0xee8\n#define\t\trTxAGC_C_CCK11_CCK1_Jaguar2\t0x1820\n#define\t\trTxAGC_C_Ofdm18_Ofdm6_Jaguar2\t0x1824\n#define\t\trTxAGC_C_Ofdm54_Ofdm24_Jaguar2\t0x1828\n#define\t\trTxAGC_C_MCS3_MCS0_Jaguar2\t0x182c\n#define\t\trTxAGC_C_MCS7_MCS4_Jaguar2\t0x1830\n#define\t\trTxAGC_C_MCS11_MCS8_Jaguar2\t0x1834\n#define\t\trTxAGC_C_MCS15_MCS12_Jaguar2\t0x1838\n#define\t\trTxAGC_C_MCS19_MCS16_Jaguar2\t0x18d8\n#define\t\trTxAGC_C_MCS23_MCS20_Jaguar2\t0x18dc\n#define\t\trTxAGC_C_Nss1Index3_Nss1Index0_Jaguar2\t0x183c\n#define\t\trTxAGC_C_Nss1Index7_Nss1Index4_Jaguar2\t0x1840\n#define\t\trTxAGC_C_Nss2Index1_Nss1Index8_Jaguar2\t0x1844\n#define\t\trTxAGC_C_Nss2Index5_Nss2Index2_Jaguar2\t0x1848\n#define\t\trTxAGC_C_Nss2Index9_Nss2Index6_Jaguar2\t0x184c\n#define\t\trTxAGC_C_Nss3Index3_Nss3Index0_Jaguar2\t0x18e0\n#define\t\trTxAGC_C_Nss3Index7_Nss3Index4_Jaguar2\t0x18e4\n#define\t\trTxAGC_C_Nss3Index9_Nss3Index8_Jaguar2\t0x18e8\n#define\t\trTxAGC_D_CCK11_CCK1_Jaguar2\t0x1a20\n#define\t\trTxAGC_D_Ofdm18_Ofdm6_Jaguar2\t0x1a24\n#define\t\trTxAGC_D_Ofdm54_Ofdm24_Jaguar2\t0x1a28\n#define\t\trTxAGC_D_MCS3_MCS0_Jaguar2\t0x1a2c\n#define\t\trTxAGC_D_MCS7_MCS4_Jaguar2\t0x1a30\n#define\t\trTxAGC_D_MCS11_MCS8_Jaguar2\t0x1a34\n#define\t\trTxAGC_D_MCS15_MCS12_Jaguar2\t0x1a38\n#define\t\trTxAGC_D_MCS19_MCS16_Jaguar2\t0x1ad8\n#define\t\trTxAGC_D_MCS23_MCS20_Jaguar2\t0x1adc\n#define\t\trTxAGC_D_Nss1Index3_Nss1Index0_Jaguar2\t0x1a3c\n#define\t\trTxAGC_D_Nss1Index7_Nss1Index4_Jaguar2\t0x1a40\n#define\t\trTxAGC_D_Nss2Index1_Nss1Index8_Jaguar2\t0x1a44\n#define\t\trTxAGC_D_Nss2Index5_Nss2Index2_Jaguar2\t0x1a48\n#define\t\trTxAGC_D_Nss2Index9_Nss2Index6_Jaguar2\t0x1a4c\n#define\t\trTxAGC_D_Nss3Index3_Nss3Index0_Jaguar2\t0x1ae0\n#define\t\trTxAGC_D_Nss3Index7_Nss3Index4_Jaguar2\t0x1ae4\n#define\t\trTxAGC_D_Nss3Index9_Nss3Index8_Jaguar2\t0x1ae8\n// IQK YN: temporaily mask this part\n//#define rFPGA0_IQK\t\t\t\t\t0xe28\n//#define rTx_IQK_Tone_A\t\t\t\t0xe30\n//#define rRx_IQK_Tone_A\t\t\t\t0xe34\n//#define rTx_IQK_PI_A\t\t\t\t\t0xe38\n//#define rRx_IQK_PI_A\t\t\t\t\t0xe3c\n\n//#define rTx_IQK \t\t\t\t\t\t0xe40\n//#define rRx_IQK\t\t\t\t\t\t0xe44\n//#define rIQK_AGC_Pts\t\t\t\t\t0xe48\n//#define rIQK_AGC_Rsp\t\t\t\t\t0xe4c\n//#define rTx_IQK_Tone_B\t\t\t\t0xe50\n//#define rRx_IQK_Tone_B\t\t\t\t0xe54\n//#define rTx_IQK_PI_B\t\t\t\t\t0xe58\n//#define rRx_IQK_PI_B\t\t\t\t\t0xe5c\n//#define rIQK_AGC_Cont\t\t\t\t0xe60\n\n\n// AFE-related\n#define rA_AFEPwr1_Jaguar\t\t\t\t\t0xc60 // dynamic AFE power control\n#define rA_AFEPwr2_Jaguar\t\t\t\t\t0xc64 // dynamic AFE power control\n#define rA_Rx_WaitCCA_Tx_CCKRFON_Jaguar\t0xc68\n#define rA_Tx_CCKBBON_OFDMRFON_Jaguar\t0xc6c\n#define rA_Tx_OFDMBBON_Tx2Rx_Jaguar\t\t0xc70\n#define rA_Tx2Tx_RXCCK_Jaguar\t\t\t\t0xc74\n#define rA_Rx_OFDM_WaitRIFS_Jaguar\t\t\t0xc78\n#define rA_Rx2Rx_BT_Jaguar\t\t\t\t\t0xc7c\n#define rA_sleep_nav_Jaguar \t\t\t\t\t0xc80\n#define rA_pmpd_Jaguar \t\t\t\t\t\t0xc84\n#define rB_AFEPwr1_Jaguar\t\t\t\t\t0xe60 // dynamic AFE power control\n#define rB_AFEPwr2_Jaguar\t\t\t\t\t0xe64 // dynamic AFE power control\n#define rB_Rx_WaitCCA_Tx_CCKRFON_Jaguar\t0xe68\n#define rB_Tx_CCKBBON_OFDMRFON_Jaguar\t0xe6c\n#define rB_Tx_OFDMBBON_Tx2Rx_Jaguar\t\t0xe70\n#define rB_Tx2Tx_RXCCK_Jaguar\t\t\t\t0xe74\n#define rB_Rx_OFDM_WaitRIFS_Jaguar\t\t\t0xe78\n#define rB_Rx2Rx_BT_Jaguar\t\t\t\t\t0xe7c\n#define rB_sleep_nav_Jaguar \t\t\t\t\t0xe80\n#define rB_pmpd_Jaguar \t\t\t\t\t\t0xe84\n\n\n// YN: mask these registers temporaily\n//#define rTx_Power_Before_IQK_A\t\t0xe94\n//#define rTx_Power_After_IQK_A\t\t\t0xe9c\n\n//#define rRx_Power_Before_IQK_A\t\t0xea0\n//#define rRx_Power_Before_IQK_A_2\t\t0xea4\n//#define rRx_Power_After_IQK_A\t\t\t0xea8\n//#define rRx_Power_After_IQK_A_2\t\t0xeac\n\n//#define rTx_Power_Before_IQK_B\t\t0xeb4\n//#define rTx_Power_After_IQK_B\t\t\t0xebc\n\n//#define rRx_Power_Before_IQK_B\t\t0xec0\n//#define rRx_Power_Before_IQK_B_2\t\t0xec4\n//#define rRx_Power_After_IQK_B\t\t\t0xec8\n//#define rRx_Power_After_IQK_B_2\t\t0xecc\n\n\n// RSSI Dump\n#define rA_RSSIDump_Jaguar \t\t\t0xBF0\n#define rB_RSSIDump_Jaguar \t\t\t0xBF1\n#define rS1_RXevmDump_Jaguar\t\t0xBF4 \n#define rS2_RXevmDump_Jaguar \t\t0xBF5\n#define rA_RXsnrDump_Jaguar\t\t0xBF6\n#define rB_RXsnrDump_Jaguar\t\t0xBF7\n#define rA_CfoShortDump_Jaguar\t\t0xBF8 \n#define rB_CfoShortDump_Jaguar\t\t0xBFA\n#define rA_CfoLongDump_Jaguar\t\t0xBEC\n#define rB_CfoLongDump_Jaguar\t\t0xBEE\n \n\n// RF Register\n//\n#define RF_AC_Jaguar\t\t\t\t0x00\t// \n#define RF_RF_Top_Jaguar\t\t\t0x07\t// \n#define RF_TXLOK_Jaguar\t\t\t\t0x08\t// \n#define RF_TXAPK_Jaguar\t\t\t\t0x0B\n#define RF_CHNLBW_Jaguar \t\t\t0x18\t// RF channel and BW switch\n#define RF_RCK1_Jaguar\t\t\t\t0x1c\t// \n#define RF_RCK2_Jaguar\t\t\t\t0x1d\n#define RF_RCK3_Jaguar   \t\t\t0x1e\n#define RF_ModeTableAddr\t\t\t0x30\n#define RF_ModeTableData0\t\t\t0x31\n#define RF_ModeTableData1\t\t\t0x32\n#define RF_TxLCTank_Jaguar          \t0x54\n#define RF_APK_Jaguar\t\t\t\t0x63\n#define RF_LCK\t\t\t\t\t\t0xB4\n#define RF_WeLut_Jaguar\t\t\t\t0xEF\n\n#define bRF_CHNLBW_MOD_AG_Jaguar\t0x70300\n#define bRF_CHNLBW_BW \t\t\t\t0xc00\n\n\n//\n// RL6052 Register definition\n//\n#define RF_AC\t\t\t\t\t\t0x00\t// \n#define RF_IPA_A\t\t\t\t\t0x0C\t// \n#define RF_TXBIAS_A\t\t\t\t\t0x0D\n#define RF_BS_PA_APSET_G9_G11\t\t0x0E\n#define RF_MODE1\t\t\t\t\t0x10\t// \n#define RF_MODE2\t\t\t\t\t0x11\t// \n#define RF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define RF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n#define RF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define RF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define RF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n#define RF_0x52 \t\t\t\t\t\t0x52\n#define RF_WE_LUT\t\t\t\t\t0xEF\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define bBBResetB\t\t\t\t\t0x100\t// Useless now?\n#define bGlobalResetB\t\t\t\t0x200\n#define bOFDMTxStart\t\t\t\t0x4\n#define bCCKTxStart\t\t\t\t\t0x8\n#define bCRC32Debug\t\t\t\t\t0x100\n#define bPMACLoopback\t\t\t\t0x10\n#define bTxLSIG\t\t\t\t\t\t0xffffff\n#define bOFDMTxRate\t\t\t\t\t0xf\n#define bOFDMTxReserved\t\t\t0x10\n#define bOFDMTxLength\t\t\t\t0x1ffe0\n#define bOFDMTxParity\t\t\t\t0x20000\n#define bTxHTSIG1\t\t\t\t\t0xffffff\n#define bTxHTMCSRate\t\t\t\t0x7f\n#define bTxHTBW\t\t\t\t\t\t0x80\n#define bTxHTLength\t\t\t\t\t0xffff00\n#define bTxHTSIG2\t\t\t\t\t0xffffff\n#define bTxHTSmoothing\t\t\t\t0x1\n#define bTxHTSounding\t\t\t\t0x2\n#define bTxHTReserved\t\t\t\t0x4\n#define bTxHTAggreation\t\t\t\t0x8\n#define bTxHTSTBC\t\t\t\t\t0x30\n#define bTxHTAdvanceCoding\t\t\t0x40\n#define bTxHTShortGI\t\t\t\t\t0x80\n#define bTxHTNumberHT_LTF\t\t\t0x300\n#define bTxHTCRC8\t\t\t\t\t0x3fc00\n#define bCounterReset\t\t\t\t0x10000\n#define bNumOfOFDMTx\t\t\t\t0xffff\n#define bNumOfCCKTx\t\t\t\t\t0xffff0000\n#define bTxIdleInterval\t\t\t\t0xffff\n#define bOFDMService\t\t\t\t0xffff0000\n#define bTxMACHeader\t\t\t\t0xffffffff\n#define bTxDataInit\t\t\t\t\t0xff\n#define bTxHTMode\t\t\t\t\t0x100\n#define bTxDataType\t\t\t\t\t0x30000\n#define bTxRandomSeed\t\t\t\t0xffffffff\n#define bCCKTxPreamble\t\t\t\t0x1\n#define bCCKTxSFD\t\t\t\t\t0xffff0000\n#define bCCKTxSIG\t\t\t\t\t0xff\n#define bCCKTxService\t\t\t\t0xff00\n#define bCCKLengthExt\t\t\t\t0x8000\n#define bCCKTxLength\t\t\t\t0xffff0000\n#define bCCKTxCRC16\t\t\t\t\t0xffff\n#define bCCKTxStatus\t\t\t\t\t0x1\n#define bOFDMTxStatus\t\t\t\t0x2\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define rPMAC_Reset\t\t\t\t\t0x100\n#define rPMAC_TxStart\t\t\t\t0x104\n#define rPMAC_TxLegacySIG\t\t\t0x108\n#define rPMAC_TxHTSIG1\t\t\t\t0x10c\n#define rPMAC_TxHTSIG2\t\t\t\t0x110\n#define rPMAC_PHYDebug\t\t\t\t0x114\n#define rPMAC_TxPacketNum\t\t\t0x118\n#define rPMAC_TxIdle\t\t\t\t\t0x11c\n#define rPMAC_TxMACHeader0\t\t\t0x120\n#define rPMAC_TxMACHeader1\t\t\t0x124\n#define rPMAC_TxMACHeader2\t\t\t0x128\n#define rPMAC_TxMACHeader3\t\t\t0x12c\n#define rPMAC_TxMACHeader4\t\t\t0x130\n#define rPMAC_TxMACHeader5\t\t\t0x134\n#define rPMAC_TxDataType\t\t\t0x138\n#define rPMAC_TxRandomSeed\t\t0x13c\n#define rPMAC_CCKPLCPPreamble\t\t0x140\n#define rPMAC_CCKPLCPHeader\t\t0x144\n#define rPMAC_CCKCRC16\t\t\t\t0x148\n#define rPMAC_OFDMRxCRC32OK\t\t0x170\n#define rPMAC_OFDMRxCRC32Er\t\t0x174\n#define rPMAC_OFDMRxParityEr\t\t0x178\n#define rPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define rPMAC_CCKCRxRC16Er\t\t\t0x180\n#define rPMAC_CCKCRxRC32Er\t\t\t0x184\n#define rPMAC_CCKCRxRC32OK\t\t\t0x188\n#define rPMAC_TxStatus\t\t\t\t0x18c\n\n//\n// 3. Page8(0x800)\n//\n#define rFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define rFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define rFPGA0_PSDFunction\t\t\t0x808\n#define rFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define rFPGA0_XA_HSSIParameter1\t0x820\t// RF 3 wire register\n#define rFPGA0_XA_HSSIParameter2\t0x824\n#define rFPGA0_XB_HSSIParameter1\t0x828\n#define rFPGA0_XB_HSSIParameter2\t0x82c\n\n#define\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\trFPGA0_XB_LSSIParameter\t\t0x844\n\n#define rFPGA0_XAB_SwitchControl\t0x858\t// RF Channel switch\n#define rFPGA0_XCD_SwitchControl\t0x85c\n\n#define rFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define rFPGA0_XCD_RFParameter\t\t0x87c\n\n#define rFPGA0_AnalogParameter1\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define rFPGA0_AnalogParameter2\t0x884\n#define rFPGA0_AnalogParameter3\t0x888\n#define rFPGA0_AdDaClockEn\t\t\t0x888\t// enable ad/da clock1 for dual-phy\n#define rFPGA0_AnalogParameter4\t0x88c\n\n#define\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define rFPGA0_XCD_RFPara\t0x8b4\n#define\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\tTransceiverA_HSPI_Readback\t\t0x8b8\t// Transceiver A HSPI Readback\n#define\tTransceiverB_HSPI_Readback\t\t0x8bc\t// Transceiver B HSPI Readback\n#define\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define rFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n#define\tREG_BB_TX_PATH_SEL_1\t\t0x93c\n#define\tREG_BB_TX_PATH_SEL_2\t\t0x940\n#define rFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define rFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define rFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n\r/*Page 19 for TxBF*/\n#define\tREG_BB_TXBF_ANT_SET_BF1\t0x19ac\n#define\tREG_BB_TXBF_ANT_SET_BF0\t0x19b4\n//\n// PageA(0xA00)\n//\n#define rCCK0_System\t\t\t\t0xa00\n#define rCCK0_AFESetting\t\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\trCCK0_DSPParameter2\t\t\t0xa1c\t//SQ threshold\n#define rCCK0_TxFilter1\t\t\t\t0xa20\n#define rCCK0_TxFilter2\t\t\t\t0xa24\n#define rCCK0_DebugPort\t\t\t\t0xa28\t//debug port and Tx filter3\n#define\trCCK0_FalseAlarmReport\t\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n\n//\n// PageB(0xB00)\n//\n#define rPdp_AntA      \t\t\t\t0xb00  \n#define rPdp_AntA_4    \t\t\t\t0xb04\n#define rConfig_Pmpd_AntA \t\t\t0xb28\n#define rConfig_AntA \t\t\t\t\t0xb68\n#define rConfig_AntB \t\t\t\t\t0xb6c\n#define rPdp_AntB \t\t\t\t\t0xb70\n#define rPdp_AntB_4 \t\t\t\t\t0xb74\n#define rConfig_Pmpd_AntB\t\t\t0xb98\n#define rAPK\t\t\t\t\t\t\t0xbd8\n\n//\n// 6. PageC(0xC00)\n//\n#define rOFDM0_LSTF\t\t\t\t\t0xc00\n\n#define rOFDM0_TRxPathEnable\t\t0xc04\n#define rOFDM0_TRMuxPar\t\t\t0xc08\n#define rOFDM0_TRSWIsolation\t\t0xc0c\n\n#define rOFDM0_XARxAFE\t\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define rOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define rOFDM0_XBRxAFE            \t\t0xc18\n#define rOFDM0_XBRxIQImbalance    \t0xc1c\n#define rOFDM0_XCRxAFE            \t\t0xc20\n#define rOFDM0_XCRxIQImbalance    \t0xc24\n#define rOFDM0_XDRxAFE            \t\t0xc28\n#define rOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define rOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define rOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define rOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define rOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define rOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define rOFDM0_CFOandDAGC\t\t\t0xc44  //CFO & DAGC\n#define rOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define rOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define rOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG\n#define rOFDM0_XAAGCCore2\t\t\t0xc54\n#define rOFDM0_XBAGCCore1\t\t\t0xc58\n#define rOFDM0_XBAGCCore2\t\t\t0xc5c\n#define rOFDM0_XCAGCCore1\t\t\t0xc60\n#define rOFDM0_XCAGCCore2\t\t\t0xc64\n#define rOFDM0_XDAGCCore1\t\t\t0xc68\n#define rOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define rOFDM0_AGCParameter1\t\t0xc70\n#define rOFDM0_AGCParameter2\t\t0xc74\n#define rOFDM0_AGCRSSITable\t\t0xc78\n#define rOFDM0_HTSTFAGC\t\t\t0xc7c\n\n#define rOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define rOFDM0_XATxAFE\t\t\t\t0xc84\n#define rOFDM0_XBTxIQImbalance\t\t0xc88\n#define rOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define rOFDM0_XCTxIQImbalance\t\t0xc90\n#define rOFDM0_XCTxAFE            \t\t0xc94\n#define rOFDM0_XDTxIQImbalance\t\t0xc98\n#define rOFDM0_XDTxAFE\t\t\t\t0xc9c\n\n#define rOFDM0_RxIQExtAnta\t\t\t0xca0\n#define rOFDM0_TxCoeff1\t\t\t\t0xca4\n#define rOFDM0_TxCoeff2\t\t\t\t0xca8\n#define rOFDM0_TxCoeff3\t\t\t\t0xcac\n#define rOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define rOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define rOFDM0_TxCoeff6\t\t\t\t0xcb8\n#define rOFDM0_RxHPParameter\t\t0xce0\n#define rOFDM0_TxPseudoNoiseWgt\t0xce4\n#define rOFDM0_FrameSync\t\t\t0xcf0\n#define rOFDM0_DFSReport\t\t\t0xcf4\n\n//\n// 7. PageD(0xD00)\n//\n#define rOFDM1_LSTF\t\t\t\t\t0xd00\n#define rOFDM1_TRxPathEnable\t\t0xd04\n\n//\n// 8. PageE(0xE00)\n//\n#define rTxAGC_A_Rate18_06\t\t\t0xe00\n#define rTxAGC_A_Rate54_24\t\t\t0xe04\n#define rTxAGC_A_CCK1_Mcs32\t\t0xe08\n#define rTxAGC_A_Mcs03_Mcs00\t\t0xe10\n#define rTxAGC_A_Mcs07_Mcs04\t\t0xe14\n#define rTxAGC_A_Mcs11_Mcs08\t\t0xe18\n#define rTxAGC_A_Mcs15_Mcs12\t\t0xe1c\n\n#define rTxAGC_B_Rate18_06\t\t\t0x830\n#define rTxAGC_B_Rate54_24\t\t\t0x834\n#define rTxAGC_B_CCK1_55_Mcs32\t0x838\n#define rTxAGC_B_Mcs03_Mcs00\t\t0x83c\n#define rTxAGC_B_Mcs07_Mcs04\t\t0x848\n#define rTxAGC_B_Mcs11_Mcs08\t\t0x84c\n#define rTxAGC_B_Mcs15_Mcs12\t\t0x868\n#define rTxAGC_B_CCK11_A_CCK2_11\t0x86c\n\n#define rFPGA0_IQK\t\t\t\t\t0xe28\n#define rTx_IQK_Tone_A\t\t\t\t0xe30\n#define rRx_IQK_Tone_A\t\t\t\t0xe34\n#define rTx_IQK_PI_A\t\t\t\t0xe38\n#define rRx_IQK_PI_A\t\t\t\t0xe3c\n\n#define rTx_IQK \t\t\t\t\t\t0xe40\n#define rRx_IQK\t\t\t\t\t\t0xe44\n#define rIQK_AGC_Pts\t\t\t\t\t0xe48\n#define rIQK_AGC_Rsp\t\t\t\t0xe4c\n#define rTx_IQK_Tone_B\t\t\t\t0xe50\n#define rRx_IQK_Tone_B\t\t\t\t0xe54\n#define rTx_IQK_PI_B\t\t\t\t\t0xe58\n#define rRx_IQK_PI_B\t\t\t\t\t0xe5c\n#define rIQK_AGC_Cont\t\t\t\t0xe60\n\n#define rBlue_Tooth\t\t\t\t\t0xe6c\n#define rRx_Wait_CCA\t\t\t\t0xe70\n#define rTx_CCK_RFON\t\t\t\t0xe74\n#define rTx_CCK_BBON\t\t\t\t0xe78\n#define rTx_OFDM_RFON\t\t\t\t0xe7c\n#define rTx_OFDM_BBON\t\t\t\t0xe80\n#define rTx_To_Rx\t\t\t\t\t0xe84\n#define rTx_To_Tx\t\t\t\t\t0xe88\n#define rRx_CCK\t\t\t\t\t\t0xe8c\n\n#define rTx_Power_Before_IQK_A\t\t0xe94\n#define rTx_Power_After_IQK_A\t\t0xe9c\n\n#define rRx_Power_Before_IQK_A\t\t0xea0\n#define rRx_Power_Before_IQK_A_2\t0xea4\n#define rRx_Power_After_IQK_A\t\t0xea8\n#define rRx_Power_After_IQK_A_2\t\t0xeac\n\n#define rTx_Power_Before_IQK_B\t\t0xeb4\n#define rTx_Power_After_IQK_B\t\t0xebc\n\n#define rRx_Power_Before_IQK_B\t\t0xec0\n#define rRx_Power_Before_IQK_B_2\t0xec4\n#define rRx_Power_After_IQK_B\t\t0xec8\n#define rRx_Power_After_IQK_B_2\t\t0xecc\n\n#define rRx_OFDM\t\t\t\t\t0xed0\n#define rRx_Wait_RIFS \t\t\t\t0xed4\n#define rRx_TO_Rx \t\t\t\t\t0xed8\n#define rStandby \t\t\t\t\t\t0xedc\n#define rSleep \t\t\t\t\t\t0xee0\n#define rPMPD_ANAEN\t\t\t\t0xeec\n\n\n// 2. Page8(0x800)\n#define bRFMOD\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define bJapanMode\t\t\t\t\t0x2\n#define bCCKTxSC\t\t\t\t\t0x30\n#define bCCKEn\t\t\t\t\t\t0x1000000\n#define bOFDMEn\t\t\t\t\t\t0x2000000\n#define bXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define bXCTxAGC                  \t\t\t0xf000\n#define bXDTxAGC                  \t\t\t0xf0000\n\n// 4. PageA(0xA00)\n#define bCCKBBMode                \t\t\t0x3\t// Useless\n#define bCCKTxPowerSaving         \t\t0x80\n#define bCCKRxPowerSaving         \t\t0x40\n\n#define bCCKSideBand              \t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define bCCKScramble              \t\t0x8\t// Useless\n#define bCCKAntDiversity    \t\t      \t0x8000\n#define bCCKCarrierRecovery   \t    \t0x4000\n#define bCCKTxRate           \t\t     \t0x3000\n#define bCCKDCCancel             \t \t\t0x0800\n#define bCCKISICancel             \t\t\t0x0400\n#define bCCKMatchFilter           \t\t0x0200\n#define bCCKEqualizer             \t\t\t0x0100\n#define bCCKPreambleDetect       \t \t0x800000\n#define bCCKFastFalseCCA          \t\t0x400000\n#define bCCKChEstStart            \t\t0x300000\n#define bCCKCCACount              \t\t0x080000\n#define bCCKcs_lim                \t\t\t0x070000\n#define bCCKBistMode              \t\t\t0x80000000\n#define bCCKCCAMask             \t  \t\t0x40000000\n#define bCCKTxDACPhase         \t   \t0x4\n#define bCCKRxADCPhase         \t   \t0x20000000   //r_rx_clk\n#define bCCKr_cp_mode0         \t   \t0x0100\n#define bCCKTxDCOffset           \t \t0xf0\n#define bCCKRxDCOffset           \t \t0xf\n#define bCCKCCAMode              \t \t\t0xc000\n#define bCCKFalseCS_lim           \t\t0x3f00\n#define bCCKCS_ratio              \t\t\t0xc00000\n#define bCCKCorgBit_sel           \t\t0x300000\n#define bCCKPD_lim                \t\t\t0x0f0000\n#define bCCKNewCCA                \t\t0x80000000\n#define bCCKRxHPofIG              \t\t0x8000\n#define bCCKRxIG                  \t\t\t0x7f00\n#define bCCKLNAPolarity           \t\t0x800000\n#define bCCKRx1stGain             \t\t0x7f0000\n#define bCCKRFExtend              \t\t0x20000000 //CCK Rx Iinital gain polarity\n#define bCCKRxAGCSatLevel        \t \t0x1f000000\n#define bCCKRxAGCSatCount       \t  \t0xe0\n#define bCCKRxRFSettle            \t\t0x1f       //AGCsamp_dly\n#define bCCKFixedRxAGC           \t \t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define bCCKAntennaPolarity      \t \t0x2000\n#define bCCKTxFilterType          \t\t0x0c00\n#define bCCKRxAGCReportType   \t   \t0x0300\n#define bCCKRxDAGCEn              \t\t0x80000000\n#define bCCKRxDAGCPeriod        \t  \t0x20000000\n#define bCCKRxDAGCSatLevel     \t   \t0x1f000000\n#define bCCKTimingRecovery       \t \t0x800000\n#define bCCKTxC0                  \t\t\t0x3f0000\n#define bCCKTxC1                  \t\t\t0x3f000000\n#define bCCKTxC2                  \t\t\t0x3f\n#define bCCKTxC3                  \t\t\t0x3f00\n#define bCCKTxC4                  \t\t\t0x3f0000\n#define bCCKTxC5                  \t\t\t0x3f000000\n#define bCCKTxC6                  \t\t\t0x3f\n#define bCCKTxC7                  \t\t\t0x3f00\n#define bCCKDebugPort             \t\t0xff0000\n#define bCCKDACDebug              \t\t0x0f000000\n#define bCCKFalseAlarmEnable      \t\t0x8000\n#define bCCKFalseAlarmRead        \t\t0x4000\n#define bCCKTRSSI                 \t\t\t0x7f\n#define bCCKRxAGCReport           \t\t0xfe\n#define bCCKRxReport_AntSel       \t\t0x80000000\n#define bCCKRxReport_MFOff        \t\t0x40000000\n#define bCCKRxRxReport_SQLoss     \t0x20000000\n#define bCCKRxReport_Pktloss      \t\t0x10000000\n#define bCCKRxReport_Lockedbit    \t0x08000000\n#define bCCKRxReport_RateError    \t0x04000000\n#define bCCKRxReport_RxRate       \t\t0x03000000\n#define bCCKRxFACounterLower      \t0xff\n#define bCCKRxFACounterUpper      \t0xff000000\n#define bCCKRxHPAGCStart          \t\t0xe000\n#define bCCKRxHPAGCFinal          \t\t0x1c00       \t\t\n#define bCCKRxFalseAlarmEnable    \t0x8000\n#define bCCKFACounterFreeze       \t\t0x4000       \t\t\n#define bCCKTxPathSel             \t\t0x10000000\n#define bCCKDefaultRxPath         \t\t0xc000000\n#define bCCKOptionRxPath          \t\t0x3000000\n\n#define\t\tRF_T_METER_88E\t\t\t\t0x42\t//\n\n// 6. PageE(0xE00)\n#define bSTBCEn                  \t\t\t0x4\t// Useless\n#define bAntennaMapping          \t\t0x10\n#define bNss                     \t\t\t\t0x20\n#define bCFOAntSumD              \t\t0x200\n#define bPHYCounterReset         \t\t0x8000000\n#define bCFOReportGet            \t\t\t0x4000000\n#define bOFDMContinueTx          \t\t0x10000000\n#define bOFDMSingleCarrier       \t\t0x20000000\n#define bOFDMSingleTone          \t\t0x40000000\n\n\n//\n// Other Definition\n//\n\n#define bEnable                   0x1\t// Useless\n#define bDisable                  0x0\n\n//byte endable for srwrite\n#define bByte0                    \t\t0x1\t// Useless\n#define bByte1                    \t\t0x2\n#define bByte2                    \t\t0x4\n#define bByte3                    \t\t0x8\n#define bWord0                    \t\t0x3\n#define bWord1                    \t\t0xc\n#define bDWord                    \t\t0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define bMaskByte0                \t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define bMaskByte1                \t\t0xff00\n#define bMaskByte2                \t\t0xff0000\n#define bMaskByte3                \t\t0xff000000\n#define bMaskHWord                \t0xffff0000\n#define bMaskLWord                \t\t0x0000ffff\n#define bMaskDWord                \t0xffffffff\n#define bMaskH3Bytes\t\t\t\t0xffffff00\n#define bMask12Bits\t\t\t\t0xfff\t\n#define bMaskH4Bits\t\t\t\t0xf0000000\t\n#define bMaskOFDM_D\t\t\t0xffc00000\n#define bMaskCCK\t\t\t\t0x3f3f3f3f\n#define bMask7bits\t\t\t\t0x7f\n#define bMaskByte2HighNibble\t\t\t0x00f00000\n#define bMaskByte3LowNibble\t\t\t\t0x0f000000\n#define bMaskL3Bytes\t\t\t0x00ffffff\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n#endif\n\n"
  },
  {
    "path": "include/Hal8814PwrSeq.h",
    "content": "\n/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL8814PWRSEQ_H__\n#define __HAL8814PWRSEQ_H__\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WB-110628-DZ-RTL8195 (Jaguar) Power Architecture-R04.pdf\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8814A_TRANS_CARDEMU_TO_ACT_STEPS\t16\n#define\tRTL8814A_TRANS_ACT_TO_CARDEMU_STEPS\t20\n#define\tRTL8814A_TRANS_CARDEMU_TO_SUS_STEPS\t17\n#define\tRTL8814A_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define\tRTL8814A_TRANS_CARDEMU_TO_PDN_STEPS\t17\n#define\tRTL8814A_TRANS_PDN_TO_CARDEMU_STEPS\t16\n#define\tRTL8814A_TRANS_ACT_TO_LPS_STEPS\t20\n#define\tRTL8814A_TRANS_LPS_TO_ACT_STEPS\t15\t\n#define\tRTL8814A_TRANS_END_STEPS\t1\n\n\n#define RTL8814A_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/* disable SW LPS 0x04[10]=0*/\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x002B, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /* ??0x28[24]=1, enable pll phase select*/ \\\n\t{0x0015, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT3|BIT2|BIT1), (BIT3|BIT2|BIT1)},/* 0x14[11:9]=3'b111,OCP current threshold=1.5A */ \\\n\t{0x002D, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x0E, 0x08},/* 0x2C[11:9]=3'b100, select lpf R3 */ \\\n\t{0x002D, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x70, 0x50},/* 0x2C[14:12]=3'b101, select lpf Rs*/ \\\n\t{0x007B, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* 0x78[30]=1'b1, SDM order select*/ \\\n\t/*{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0}, */ /* disable HWPDN 0x04[15]=0*/ \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0},/* disable WL suspend*/\t\\\n\t{0x00F0, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* */\t\\\n\t{0x0081, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x30, 0x20},/* */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\n\n#define RTL8814A_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},  /* 0x2[0] = 0\t RESET BB, CLOSE RF */\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, /*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t{0x1002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},  /* 0x2[0] = 0\t RESET BB, CLOSE RF */\t\\\n\t{0x0002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, /*Delay 1us*/\t\\\n\t{0x1002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},  /*0x1F[7:0] = 0 turn off RF*/\t\\\n\t/*{0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},*/  /*0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x28},   /* 0x07[7:0] = 0x28 sps pwm mode 0x2a for BT coex*/\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x02, 0},   /*0x8[1] = 0 ANA clk =500k */\t\\\n\t/*{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0|BIT1, 0},*/   /*  0x02[1:0] = 0\treset BB */\t\\\n\t{0x0066, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},   /*0x66[7]=0, disable ckreq for gpio7 output SUS */\t\\\n\t{0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0},   /*0x41[4]=0, disable sic for gpio7 output SUS */\t\\\n\t{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},   /*0x42[1]=0, disable ckout for gpio7 output SUS */\t\\\n\t{0x004e, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},   /*0x4E[5]=1, disable LED2 for gpio7 output SUS */\t\\\n\t{0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},   /*0x41[0]=0, disable uart for gpio7 output SUS */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\n\n#define RTL8814A_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0061, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x0F, 0x0c},\\\n\t{0x0061, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x0F, 0x0E},\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x0F, 0x07},/* gpio11 input mode, gpio10~8 output mode */\t\\\n\t{0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */\t\\\n\t{0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* suspend option all off */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*0x14[13] = 1 turn on ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* 0x14[14] =1 trun on ZCD */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*0x8[1] = 0 ANA clk =500k */\t\\\n\t{0x0091, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xA0, 0xA0}, /* 0x91[7]=1 0x91[5]=1 , disable sps,ldo sleep mode */\t\\\n\t{0x0070, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /* 0x70[3]=1 enable mainbias polling */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 1 enable WL suspend */\n\n#define RTL8814A_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 0 enable WL suspend*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0x10, 0},/*0x23[4] = 0 hpon LDO sleep mode leave */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* 0x14[14] =0 trun off ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0},/*0x14[13] = 0 turn off ZCD */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */\t\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio11 input mode, gpio10~8 input mode */\n\n#define RTL8814A_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t/**{0x0194, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, //0x194[0]=0 , disable 32K clock*/\t\\\n\t/**{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x94}, //0x93=0x94 , 90[30] =0 enable 500k ANA clock .switch clock from 12M to 500K , 90 [26] =0 disable EEprom loader clock*/\t\\\n\t{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x03[2] = 0, reset 3081*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x01}, /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/\t\\\n\t{0x0081, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x30}, /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/\t\\\n\t/*{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xcc},*/   \\\n\t/*{0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xF0, 0xEC},*/   \\\n\t/*{0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x07},*/  /* gpio11 input mode, gpio10~8 output mode */\t\\\n\t{0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio 0~7 output same value as input ?? */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xff},/* gpio0~7 output mode */\t\\\n\t{0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/* 0x47[7:0] = 00 gpio mode */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/* 0x15[6] =1 trun on ZCD output */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*0x15[5] = 1 turn on ZCD */\t\\\n\t{0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/*0x12[6] = 0 force PFM mode */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4},/*0x23[4] = 1 hpon LDO sleep mode */\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*0x8[1] = 0 ANA clk =500k */\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* 0x01f[1]=0 , disable RFC_0  control  REG_RF_CTRL_8814A */\t\\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* 0x020[1]=0 , disable RFC_1  control  REG_RF_CTRL_8814A */\t\\\n\t{0x0021, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* 0x021[1]=0 , disable RFC_2  control  REG_RF_CTRL_8814A */\t\\\n\t{0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0}, /* 0x076[1]=0 , disable RFC_3  control REG_OPT_CTRL_8814A +2 */\t\\\n\t{0x0091, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xA0, 0xA0}, /* 0x91[7]=1 0x91[5]=1 , disable sps,ldo sleep mode */\t\\\n\t{0x0070, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /* 0x70[3]=1 enable mainbias polling */\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, BIT3}, /*0x04[11] = 1 enable WL suspend*/\t\n\n#define RTL8814A_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/                       \\\n\t{0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, BIT6},/*0x12[6] = 1 force PWM mode */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0},/*0x15[5] = 0 turn off ZCD */\t\\\n\t{0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/* 0x15[6] =0 trun off ZCD output */\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0},/*0x23[4] = 0 hpon LDO leave sleep mode */\t\\\n\t{0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/* gpio0~7 input mode */\t\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00}, /* gpio11 input mode, gpio10~8 input mode */ \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0}, /*0x04[10] = 0, enable SW LPS PCIE only*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3, 0}, /*0x04[11] = 0, enable WL suspend*/\t\\\n\t/*{0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2},*/ /*0x03[2] = 1, enable 3081*/\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\t\t\\\n\t{0x0071, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, 0},/*0x70[10] = 0, CPHY_MBIAS_EN disable*/\n\n\n#define RTL8814A_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8814A_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8814A_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/\t\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xc00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x04}, /* 0xe00[7:0] = 4\tturn off 3-wire */\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated,and RF closed*/\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t{0x1002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated,and RF closed*/\t\\\n\t{0x0002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x1002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},  /* Whole BB is reset*/\t\t\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\t\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\t\\\n\t{0x05F1, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Respond TxOK to scheduler*/\t\n\n\n#define RTL8814A_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\t\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\t\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /* Delay*/\t\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\t\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /* Polling 0x109[7]=0  TSF in 40M*/\t\t\t\\\n\t/*{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, */ /*.\t??0x29[7:6] = 2b'00\t enable BB clock*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\t\t\t\t\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\t\\\n\t{0x0002, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\t\\\n\t{0x1002, ~PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x1002[1:0] = 2b'11\t enable BB macro*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n#define RTL8814A_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8814A_power_on_flow[RTL8814A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_radio_off_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_card_disable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_card_enable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_suspend_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_resume_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_hwpdn_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_enter_lps_flow[RTL8814A_TRANS_ACT_TO_LPS_STEPS+RTL8814A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8814A_leave_lps_flow[RTL8814A_TRANS_LPS_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS];\n\n#endif //__HAL8814PWRSEQ_H__\n\n"
  },
  {
    "path": "include/Hal8821APwrSeq.h",
    "content": "#ifndef REALTEK_POWER_SEQUENCE_8821\n#define REALTEK_POWER_SEQUENCE_8821\n\n#include \"HalPwrSeqCmd.h\"\n\n/* \n\tCheck document WM-20130516-JackieLau-RTL8821A_Power_Architecture-R10.vsd\n\tThere are 6 HW Power States:\n\t0: POFF--Power Off\n\t1: PDN--Power Down\n\t2: CARDEMU--Card Emulation\n\t3: ACT--Active Mode\n\t4: LPS--Low Power State\n\t5: SUS--Suspend\n\n\tThe transision from different states are defined below\n\tTRANS_CARDEMU_TO_ACT\n\tTRANS_ACT_TO_CARDEMU\n\tTRANS_CARDEMU_TO_SUS\n\tTRANS_SUS_TO_CARDEMU\n\tTRANS_CARDEMU_TO_PDN\n\tTRANS_ACT_TO_LPS\n\tTRANS_LPS_TO_ACT\t\n\n\tTRANS_END\n*/\n#define\tRTL8821A_TRANS_CARDEMU_TO_ACT_STEPS\t25\n#define\tRTL8821A_TRANS_ACT_TO_CARDEMU_STEPS\t15\n#define\tRTL8821A_TRANS_CARDEMU_TO_SUS_STEPS\t15\n#define\tRTL8821A_TRANS_SUS_TO_CARDEMU_STEPS\t15\n#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS\t15\n#define\tRTL8821A_TRANS_CARDEMU_TO_PDN_STEPS\t15\n#define\tRTL8821A_TRANS_PDN_TO_CARDEMU_STEPS\t15\n#define\tRTL8821A_TRANS_ACT_TO_LPS_STEPS\t15\n#define\tRTL8821A_TRANS_LPS_TO_ACT_STEPS\t15\t\n#define\tRTL8821A_TRANS_END_STEPS\t1\n\n\n#define RTL8821A_TRANS_CARDEMU_TO_ACT \t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/   \\\n\t{0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x67[0] = 0 to disable BT_GPS_SEL pins*/\t\\\n\t{0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS},/*Delay 1ms*/   \\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, 0}, /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3|BIT2), 0},/* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[12:11]=0*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , BIT0},/* Disable USB suspend */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, BIT1},/* wait till 0x04[17] = 1    power ready*/\t\\\n\t{0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0 , 0},/* Enable USB suspend */\t\\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* disable HWPDN 0x04[15]=0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT4|BIT3), 0},/* disable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* polling until return 0*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0},/**/\t\\\n\t{0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*0x4C[24] = 0x4F[0] = 1, switch DPDT_SEL_P output from WL BB */\\\n\t{0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, (BIT5|BIT4), (BIT5|BIT4)},/*0x66[13] = 0x67[5] = 1, switch for PAPE_G/PAPE_A from WL BB ; 0x66[12] = 0x67[4] = 1, switch LNAON from WL BB */\\\n\t{0x0025, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6, 0},/*anapar_mac<118> , 0x25[6]=0 by wlan single function*/\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable falling edge triggering interrupt*/\\\n\t{0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable GPIO9 interrupt mode*/\\\n\t{0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable GPIO9 input mode*/\\\n\t{0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/*Enable HSISR GPIO[C:0] interrupt*/\\\n\t{0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1},/*Enable HSISR GPIO9 interrupt*/\\\n\t{0x007A, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x3A},/*0x7A = 0x3A start BT*/\\\n\t{0x002E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF , 0x82 },/* 0x2C[23:12]=0x820 ; XTAL trim */ \\\n\t{0x0010, PWR_CUT_A_MSK , PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6 , BIT6 },/* 0x10[6]=1 ; MPsW0x2CvA0x10[6]]1~WLAN */ \\\n\n\n#define RTL8821A_TRANS_ACT_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\t\\\n\t{0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from register 0x65[2] */\\\n\t{0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Enable rising edge triggering interrupt*/ \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0},/* release WLON reset  0x04[16]=1*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*0x04[9] = 1 turn off MAC by HW state machine*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT1, 0}, /*wait till 0x04[9] = 0 polling until return 0 to disable*/\t\\\n\t{0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5}, /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/   \\\n\t{0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/   \\\n\n\n#define RTL8821A_TRANS_CARDEMU_TO_SUS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3)}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4}, /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8821A_TRANS_SUS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\n\n#define RTL8821A_TRANS_CARDEMU_TO_CARDDIS\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07=0x20 , SOP option to disable BG/MB*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, BIT3}, /*0x04[12:11] = 2b'01 enable WL suspend*/\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT2, BIT2}, /*0x04[10] = 1, enable SW LPS*/\t\\\n        {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 1}, /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, BIT0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, 0}, /*wait power state to suspend*/\n\n#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3 | BIT7, 0}, /*clear suspend enable and power down enable*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, BIT0, 0}, /*Set SDIO suspend local register*/\t\\\n\t{0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_POLLING, BIT1, BIT1}, /*wait power state to suspend*/\\\n\t{0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0}, /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/   \\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT3|BIT4, 0}, /*0x04[12:11] = 2b'01enable WL suspend*/\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*0x23[4] = 1b'0 12H LDO enter normal mode*/   \\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0},/*PCIe DMA start*/\t\n\n\n#define RTL8821A_TRANS_CARDEMU_TO_PDN\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*0x23[4] = 1b'1 12H LDO enter sleep mode*/   \\\n\t{0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x20}, /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/   \\\n\t{0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/* 0x04[16] = 0*/\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, BIT7},/* 0x04[15] = 1*/\n\n#define RTL8821A_TRANS_PDN_TO_CARDEMU\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT7, 0},/* 0x04[15] = 0*/\n\n#define RTL8821A_TRANS_ACT_TO_LPS\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/\t\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF},/*Tx Pause*/\t\\\n\t{0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, 0xFF, 0},/*Should be zero if no packet is transmitting*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, 0},/*CCK and OFDM are disabled,and clock are gated*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\t\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*Whole BB is reset*/\t\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x03},/*Reset MAC TRX*/\t\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, 0},/*check if removed later*/\t\\\n\t{0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x00},/*When driver enter Sus/ Disable, enable LOP for BT*/\t\\\n\t{0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT5, BIT5},/*Respond TxOK to scheduler*/\t\\\n\n\n#define RTL8821A_TRANS_LPS_TO_ACT\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_SDIO,PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\\\n\t{0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\\\n\t{0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\\\n\t{0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*.\t0x08[4] = 0\t\t switch TSF to 40M*/\\\n\t{0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT7, 0}, /*Polling 0x109[7]=0  TSF in 40M*/\\\n\t{0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT6|BIT7, 0}, /*.\t0x29[7:6] = 2b'00\t enable BB clock*/\\\n\t{0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1, BIT1}, /*.\t0x101[1] = 1*/\\\n\t{0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0xFF}, /*.\t0x100[7:0] = 0xFF\t enable WMAC TRX*/\\\n\t{0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0}, /*.\t0x02[1:0] = 2b'11\t enable BB macro*/\\\n\t{0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, 0xFF, 0}, /*.\t0x522 = 0*/\n \n#define RTL8821A_TRANS_END\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* format */\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, // comments here*/\t\t\t\t\t\t\t\t\\\n\t{0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,0,PWR_CMD_END, 0, 0}, //\n\n\nextern WLAN_PWR_CFG rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_card_disable_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_card_enable_flow[RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS+RTL8821A_TRANS_END_STEPS];\nextern WLAN_PWR_CFG rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS+RTL8821A_TRANS_END_STEPS];\n\n#endif\n"
  },
  {
    "path": "include/HalPwrSeqCmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HALPWRSEQCMD_H__\n#define __HALPWRSEQCMD_H__\n\n#include <drv_types.h>\n\n/*---------------------------------------------*/\n//3 The value of cmd: 4 bits\n/*---------------------------------------------*/\n#define PWR_CMD_READ\t\t\t0x00\n     // offset: the read register offset\n     // msk: the mask of the read value\n     // value: N/A, left by 0\n     // note: dirver shall implement this function by read & msk\n\n#define PWR_CMD_WRITE\t\t\t0x01\n     // offset: the read register offset\n     // msk: the mask of the write bits\n     // value: write value\n     // note: driver shall implement this cmd by read & msk after write\n\n#define PWR_CMD_POLLING\t\t\t0x02\n     // offset: the read register offset\n     // msk: the mask of the polled value\n     // value: the value to be polled, masked by the msd field.\n     // note: driver shall implement this cmd by\n     // do{\n     // if( (Read(offset) & msk) == (value & msk) )\n     // break;\n     // } while(not timeout);\n\n#define PWR_CMD_DELAY\t\t\t0x03\n     // offset: the value to delay\n     // msk: N/A\n     // value: the unit of delay, 0: us, 1: ms\n\n#define PWR_CMD_END\t\t\t\t0x04\n     // offset: N/A\n     // msk: N/A\n     // value: N/A\n\n/*---------------------------------------------*/\n//3 The value of base: 4 bits\n/*---------------------------------------------*/\n   // define the base address of each block\n#define PWR_BASEADDR_MAC\t\t0x00\n#define PWR_BASEADDR_USB\t\t0x01\n#define PWR_BASEADDR_PCIE\t\t0x02\n#define PWR_BASEADDR_SDIO\t\t0x03\n\n/*---------------------------------------------*/\n//3 The value of interface_msk: 4 bits\n/*---------------------------------------------*/\n#define\tPWR_INTF_SDIO_MSK\t\tBIT(0)\n#define\tPWR_INTF_USB_MSK\t\tBIT(1)\n#define\tPWR_INTF_PCI_MSK\t\tBIT(2)\n#define\tPWR_INTF_ALL_MSK\t\t(BIT(0)|BIT(1)|BIT(2)|BIT(3))\n\n/*---------------------------------------------*/\n//3 The value of fab_msk: 4 bits\n/*---------------------------------------------*/\n#define\tPWR_FAB_TSMC_MSK\t\tBIT(0)\n#define\tPWR_FAB_UMC_MSK\t\t\tBIT(1)\n#define\tPWR_FAB_ALL_MSK\t\t\t(BIT(0)|BIT(1)|BIT(2)|BIT(3))\n\n/*---------------------------------------------*/\n//3 The value of cut_msk: 8 bits\n/*---------------------------------------------*/\n#define\tPWR_CUT_TESTCHIP_MSK\tBIT(0)\n#define\tPWR_CUT_A_MSK\t\t\tBIT(1)\n#define\tPWR_CUT_B_MSK\t\t\tBIT(2)\n#define\tPWR_CUT_C_MSK\t\t\tBIT(3)\n#define\tPWR_CUT_D_MSK\t\t\tBIT(4)\n#define\tPWR_CUT_E_MSK\t\t\tBIT(5)\n#define\tPWR_CUT_F_MSK\t\t\tBIT(6)\n#define\tPWR_CUT_G_MSK\t\t\tBIT(7)\n#define\tPWR_CUT_ALL_MSK\t\t\t0xFF\n\n\ntypedef enum _PWRSEQ_CMD_DELAY_UNIT_\n{\n\tPWRSEQ_DELAY_US,\n\tPWRSEQ_DELAY_MS,\n} PWRSEQ_DELAY_UNIT;\n\ntypedef struct _WL_PWR_CFG_\n{\n\tu16 offset;\n\tu8 cut_msk;\n\tu8 fab_msk:4;\n\tu8 interface_msk:4;\n\tu8 base:4;\n\tu8 cmd:4;\n\tu8 msk;\n\tu8 value;\n} WLAN_PWR_CFG, *PWLAN_PWR_CFG;\n\n\n#define GET_PWR_CFG_OFFSET(__PWR_CMD)\t\t__PWR_CMD.offset\n#define GET_PWR_CFG_CUT_MASK(__PWR_CMD)\t\t__PWR_CMD.cut_msk\n#define GET_PWR_CFG_FAB_MASK(__PWR_CMD)\t\t__PWR_CMD.fab_msk\n#define GET_PWR_CFG_INTF_MASK(__PWR_CMD)\t__PWR_CMD.interface_msk\n#define GET_PWR_CFG_BASE(__PWR_CMD)\t\t\t__PWR_CMD.base\n#define GET_PWR_CFG_CMD(__PWR_CMD)\t\t\t__PWR_CMD.cmd\n#define GET_PWR_CFG_MASK(__PWR_CMD)\t\t\t__PWR_CMD.msk\n#define GET_PWR_CFG_VALUE(__PWR_CMD)\t\t__PWR_CMD.value\n\n\n//================================================================================\n//\tPrototype of protected function.\n//================================================================================\nu8 HalPwrSeqCmdParsing(\n\tPADAPTER\t\tpadapter,\n\tu8\t\t\t\tCutVersion,\n\tu8\t\t\t\tFabVersion,\n\tu8\t\t\t\tInterfaceType,\n\tWLAN_PWR_CFG\tPwrCfgCmd[]);\n\n#endif\n\n"
  },
  {
    "path": "include/HalVerDef.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_VERSION_DEF_H__\n#define __HAL_VERSION_DEF_H__\n\n#define TRUE \t_TRUE\t\n#define FALSE\t_FALSE\n\n// HAL_IC_TYPE_E\ntypedef enum tag_HAL_IC_Type_Definition\n{\n\tCHIP_8192S\t=\t0,\n\tCHIP_8188C\t=\t1,\n\tCHIP_8192C\t=\t2,\n\tCHIP_8192D\t=\t3,\n\tCHIP_8723A\t=\t4,\n\tCHIP_8188E\t=\t5,\n\tCHIP_8812\t=\t6,\n\tCHIP_8821\t=\t7,\n\tCHIP_8723B \t=\t8,\n\tCHIP_8192E \t=\t9,\n\tCHIP_8814A\t=\t10,\n\tCHIP_8703B\t=\t11,\n\tCHIP_8188F\t=\t12,\n}HAL_IC_TYPE_E;\n\n//HAL_CHIP_TYPE_E\ntypedef enum tag_HAL_CHIP_Type_Definition\n{\n\tTEST_CHIP \t\t=\t0,\n\tNORMAL_CHIP \t=\t1,\n\tFPGA\t\t\t=\t2,\n}HAL_CHIP_TYPE_E;\n\n//HAL_CUT_VERSION_E\ntypedef enum tag_HAL_Cut_Version_Definition\n{\n\tA_CUT_VERSION \t\t=\t0,\n\tB_CUT_VERSION \t\t=\t1,\n\tC_CUT_VERSION \t\t=\t2,\n\tD_CUT_VERSION \t\t=\t3,\n\tE_CUT_VERSION \t\t=\t4,\n\tF_CUT_VERSION \t\t=\t5,\n\tG_CUT_VERSION \t\t=\t6,\n\tH_CUT_VERSION \t\t=\t7,\t\n\tI_CUT_VERSION \t\t=\t8,\n\tJ_CUT_VERSION \t\t=\t9,\n\tK_CUT_VERSION \t\t=\t10,\n}HAL_CUT_VERSION_E;\n\n// HAL_Manufacturer\ntypedef enum tag_HAL_Manufacturer_Version_Definition\n{\n\tCHIP_VENDOR_TSMC \t=\t0,\n\tCHIP_VENDOR_UMC \t=\t1,\n\tCHIP_VENDOR_SMIC \t=\t2, \n}HAL_VENDOR_E;\n\ntypedef enum tag_HAL_RF_Type_Definition\n{\n\tRF_TYPE_1T1R \t=\t0,\n\tRF_TYPE_1T2R \t=\t1,\n\tRF_TYPE_2T2R\t=\t2,\n\tRF_TYPE_2T3R\t=\t3,\n\tRF_TYPE_2T4R\t=\t4,\n\tRF_TYPE_3T3R\t=\t5,\n\tRF_TYPE_3T4R\t=\t6,\n\tRF_TYPE_4T4R\t=\t7,\n}HAL_RF_TYPE_E;\n\ntypedef\tstruct tag_HAL_VERSION\n{\n\tHAL_IC_TYPE_E\t\tICType;\n\tHAL_CHIP_TYPE_E\t\tChipType;\n\tHAL_CUT_VERSION_E\tCUTVersion;\n\tHAL_VENDOR_E\t\tVendorType;\n\tHAL_RF_TYPE_E\t\tRFType;\t\n\tu8\t\t\t\t\tROMVer;\n}HAL_VERSION,*PHAL_VERSION;\n\n//VERSION_8192C\t\t\tVersionID;\n//HAL_VERSION\t\t\tVersionID;\n\n// Get element\n#define GET_CVID_IC_TYPE(version)\t\t\t((HAL_IC_TYPE_E)(((HAL_VERSION)version).ICType)\t)\n#define GET_CVID_CHIP_TYPE(version)\t\t\t((HAL_CHIP_TYPE_E)(((HAL_VERSION)version).ChipType)\t)\n#define GET_CVID_RF_TYPE(version)\t\t\t((HAL_RF_TYPE_E)(((HAL_VERSION)version).RFType))\n#define GET_CVID_MANUFACTUER(version)\t\t((HAL_VENDOR_E)(((HAL_VERSION)version).VendorType))\n#define GET_CVID_CUT_VERSION(version)\t\t((HAL_CUT_VERSION_E)(((HAL_VERSION)version).CUTVersion))\n#define GET_CVID_ROM_VERSION(version)\t\t((((HAL_VERSION)version).ROMVer) & ROM_VERSION_MASK)\n\n//----------------------------------------------------------------------------\n//Common Macro. --\n//----------------------------------------------------------------------------\n//HAL_VERSION VersionID\n\n// HAL_IC_TYPE_E\n#if 0\n#define IS_81XXC(version)\t\t\t\t(((GET_CVID_IC_TYPE(version) == CHIP_8192C)||(GET_CVID_IC_TYPE(version) == CHIP_8188C))? TRUE : FALSE)\n#define IS_8723_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8723A)? TRUE : FALSE)\n#define IS_92D(version)\t\t\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8192D)? TRUE : FALSE)\n#endif\n\n#define IS_8188E(version)\t\t\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8188E)? TRUE : FALSE)\n#define IS_8188F(version)\t\t\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8188F) ? TRUE : FALSE)\n#define IS_8192E(version)\t\t\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8192E)? TRUE : FALSE)\n#define IS_8812_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8812)? TRUE : FALSE)\n#define IS_8821_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8821)? TRUE : FALSE)\n#define IS_8814A_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8814A) ? TRUE : FALSE)\n#define IS_8723B_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8723B)? TRUE : FALSE)\n#define IS_8703B_SERIES(version)\t\t\t((GET_CVID_IC_TYPE(version) == CHIP_8703B)? TRUE : FALSE)\n\n//HAL_CHIP_TYPE_E\n#define IS_TEST_CHIP(version)\t\t\t((GET_CVID_CHIP_TYPE(version)==TEST_CHIP)? TRUE: FALSE)\n#define IS_NORMAL_CHIP(version)\t\t\t((GET_CVID_CHIP_TYPE(version)==NORMAL_CHIP)? TRUE: FALSE)\n\n//HAL_CUT_VERSION_E\n#define IS_A_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == A_CUT_VERSION) ? TRUE : FALSE)\n#define IS_B_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? TRUE : FALSE)\n#define IS_C_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == C_CUT_VERSION) ? TRUE : FALSE)\n#define IS_D_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == D_CUT_VERSION) ? TRUE : FALSE)\n#define IS_E_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE)\n#define IS_F_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == F_CUT_VERSION) ? TRUE : FALSE)\n#define IS_I_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == I_CUT_VERSION) ? TRUE : FALSE)\n#define IS_J_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == J_CUT_VERSION) ? TRUE : FALSE)\n#define IS_K_CUT(version)\t\t\t\t((GET_CVID_CUT_VERSION(version) == K_CUT_VERSION) ? TRUE : FALSE)\n\n//HAL_VENDOR_E\n#define IS_CHIP_VENDOR_TSMC(version)\t((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC)? TRUE: FALSE)\n#define IS_CHIP_VENDOR_UMC(version)\t((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_UMC)? TRUE: FALSE)\n#define IS_CHIP_VENDOR_SMIC(version)\t((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_SMIC)? TRUE: FALSE)\n\n//HAL_RF_TYPE_E\n#define IS_1T1R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_1T1R)? TRUE : FALSE )\n#define IS_1T2R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)? TRUE : FALSE)\n#define IS_2T2R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)? TRUE : FALSE)\n#define IS_3T3R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_3T3R)? TRUE : FALSE)\n#define IS_3T4R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_3T4R)? TRUE : FALSE)\n#define IS_4T4R(version)\t\t\t\t\t((GET_CVID_RF_TYPE(version) == RF_TYPE_4T4R)? TRUE : FALSE)\n\n\n\n//----------------------------------------------------------------------------\n//Chip version Macro. --\n//----------------------------------------------------------------------------\n#if 0\n#define IS_81XXC_TEST_CHIP(version)\t\t((IS_81XXC(version) && (!IS_NORMAL_CHIP(version)))? TRUE: FALSE)\n\n#define IS_92C_SERIAL(version)   \t\t\t\t\t((IS_81XXC(version) && IS_2T2R(version)) ? TRUE : FALSE)\n#define IS_81xxC_VENDOR_UMC_A_CUT(version)\t(IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_A_CUT(version) ? TRUE : FALSE) : FALSE): FALSE)\n#define IS_81xxC_VENDOR_UMC_B_CUT(version)\t(IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_B_CUT(version) ? TRUE : FALSE) : FALSE): FALSE)\n#define IS_81xxC_VENDOR_UMC_C_CUT(version)\t(IS_81XXC(version)?(IS_CHIP_VENDOR_UMC(version) ? (IS_C_CUT(version) ? TRUE : FALSE) : FALSE): FALSE)\n\n#define IS_NORMAL_CHIP92D(version)\t\t(( IS_92D(version))?((GET_CVID_CHIP_TYPE(version)==NORMAL_CHIP)? TRUE: FALSE):FALSE)\n\n#define IS_92D_SINGLEPHY(version)\t\t((IS_92D(version)) ? (IS_2T2R(version) ? TRUE: FALSE) : FALSE)\n#define IS_92D_C_CUT(version)\t\t\t((IS_92D(version)) ? (IS_C_CUT(version) ? TRUE : FALSE) : FALSE)\n#define IS_92D_D_CUT(version)\t\t\t((IS_92D(version)) ? (IS_D_CUT(version) ? TRUE : FALSE) : FALSE)\n#define IS_92D_E_CUT(version)\t\t\t((IS_92D(version)) ? (IS_E_CUT(version) ? TRUE : FALSE) : FALSE)\n\n#define IS_8723A_A_CUT(version)\t\t\t\t((IS_8723_SERIES(version)) ? ( IS_A_CUT(version)?TRUE : FALSE) : FALSE)\n#define IS_8723A_B_CUT(version)\t\t\t\t((IS_8723_SERIES(version)) ? ( IS_B_CUT(version)?TRUE : FALSE) : FALSE)\n#endif\n\n#define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter)\t\t((IS_8188E(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) >= I_CUT_VERSION) ? TRUE : FALSE) : FALSE)\n\n#define IS_VENDOR_8812A_TEST_CHIP(_Adapter)\t\t((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE)\n#define IS_VENDOR_8812A_MP_CHIP(_Adapter)\t\t((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE)\n#define IS_VENDOR_8812A_C_CUT(_Adapter)\t\t\t((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) == C_CUT_VERSION) ? TRUE : FALSE) : FALSE)\n\n#define IS_VENDOR_8821A_TEST_CHIP(_Adapter)\t((IS_8821_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE)\n#define IS_VENDOR_8821A_MP_CHIP(_Adapter)\t\t((IS_8821_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE)\n\n#define IS_VENDOR_8192E_B_CUT(_Adapter)\t\t((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) == B_CUT_VERSION) ? TRUE : FALSE)\n\n#define IS_VENDOR_8723B_TEST_CHIP(_Adapter)\t((IS_8723B_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE)\n#define IS_VENDOR_8723B_MP_CHIP(_Adapter)\t\t((IS_8723B_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE)\n\n#define IS_VENDOR_8703B_TEST_CHIP(_Adapter)\t((IS_8703B_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE)\n#define IS_VENDOR_8703B_MP_CHIP(_Adapter)\t\t((IS_8703B_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE)\n#define IS_VENDOR_8814A_TEST_CHIP(_Adapter)\t((IS_8814A_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE)\n#define IS_VENDOR_8814A_MP_CHIP(_Adapter)\t\t((IS_8814A_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE)\n\n#endif\n\n"
  },
  {
    "path": "include/autoconf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n//***** temporarily flag *******\n#define CONFIG_SINGLE_IMG\n//#define CONFIG_DISABLE_ODM\n\n//***** temporarily flag *******\n/*\n * Public  General Config\n */\n#define AUTOCONF_INCLUDED\n#define RTL871X_MODULE_NAME \"8814AU\"\n#define DRV_NAME \"rtl8814au\"\n\n\n#define CONFIG_USB_HCI\t1\n\n\n#define PLATFORM_LINUX\t1\n\n\n#define CONFIG_IOCTL_CFG80211 1\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t//#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */\n\t#define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER\n\t//#define CONFIG_DEBUG_CFG80211 \n\t//#define CONFIG_DRV_ISSUE_PROV_REQ // IOT FOR S2\n\t#define CONFIG_SET_SCAN_DENY_TIMER\n\t/*#define SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42*/ /* wpa_supplicant realtek version <= jb42 will be defined this */\n#endif\n\n/*\n * Internal  General Config\n */\n//#define CONFIG_H2CLBK\n\n#define CONFIG_EMBEDDED_FWIMG\t1\n//#define CONFIG_FILE_FWIMG\n\n//#define CONFIG_XMIT_ACK\n#ifdef CONFIG_XMIT_ACK\n\t#define CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n#endif\n\n#define CONFIG_80211N_HT\t1\n\n#ifdef CONFIG_80211N_HT\n\t#define CONFIG_80211AC_VHT 1\n\t#define CONFIG_BEAMFORMING\n\t\n\t#ifdef CONFIG_BEAMFORMING\n\t\t#define CONFIG_PHYDM_BEAMFORMING\n\t\t#ifdef CONFIG_PHYDM_BEAMFORMING\t\t\n\t\t#define BEAMFORMING_SUPPORT\t\t\t1\t/*for phydm beamforming*/\n\t\t#define SUPPORT_MU_BF\t\t\t\t\t0\n\t\t#else\n\t\t#define BEAMFORMING_SUPPORT\t\t\t0\t/*for driver beamforming*/\n\t\t#endif\n\t#endif\n#endif\n\n#define CONFIG_RECV_REORDERING_CTRL\t1\n\n//#define CONFIG_TCP_CSUM_OFFLOAD_RX\t1\n\n//#define CONFIG_DRVEXT_MODULE\t1\n\n#define CONFIG_RF_GAIN_OFFSET\n\n#define CONFIG_DFS\t1\n\n //#define CONFIG_SUPPORT_USB_INT\n #ifdef\tCONFIG_SUPPORT_USB_INT\n//#define CONFIG_USB_INTERRUPT_IN_PIPE\t1\n#endif\n\n//#ifndef CONFIG_MP_INCLUDED\n\t#define CONFIG_IPS\t1\n\t#ifdef CONFIG_IPS\n\t//#define CONFIG_IPS_LEVEL_2\t1 //enable this to set default IPS mode to IPS_LEVEL_2\t\n\t#define CONFIG_IPS_CHECK_IN_WD // Do IPS Check in WatchDog.\t\n\t#endif\n\t//#define SUPPORT_HW_RFOFF_DETECTED\t1\n\n\t#define CONFIG_LPS\t1\n\t#if defined(CONFIG_LPS) && defined(CONFIG_SUPPORT_USB_INT)\n\t//#define CONFIG_LPS_LCLK\t1\n\t#endif\n\n\t#ifdef CONFIG_LPS_LCLK\n\t#define CONFIG_XMIT_THREAD_MODE\n\t#endif\n\n\t//befor link\n\t//#define CONFIG_ANTENNA_DIVERSITY\n\n\t//after link\n\t#ifdef CONFIG_ANTENNA_DIVERSITY\t \n\t#define CONFIG_HW_ANTENNA_DIVERSITY\t\t\n\t#endif\n\n\n\t//#define CONFIG_CONCURRENT_MODE 1\n\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t//#define CONFIG_HWPORT_SWAP\t\t\t\t//Port0->Sec , Port1 -> Pri\n\t\t#define CONFIG_RUNTIME_PORT_SWITCH\n\t\t//#define DBG_RUNTIME_PORT_SWITCH\n\t\t#define CONFIG_SCAN_BACKOP\n\t\t//#ifdef CONFIG_RTL8812A\n\t\t//\t#define CONFIG_TSF_RESET_OFFLOAD 1\t\t// For 2 PORT TSF SYNC.\n\t\t//#endif\n\t#endif\n\n//#else \t//#ifndef CONFIG_MP_INCLUDED\n\t\n//#endif \t//#ifndef CONFIG_MP_INCLUDED\n\n#define CONFIG_AP_MODE\t1\n#ifdef CONFIG_AP_MODE\n\t//#define CONFIG_INTERRUPT_BASED_TXBCN // Tx Beacon when driver BCN_OK ,BCN_ERR interrupt occurs\n\t#if defined(CONFIG_CONCURRENT_MODE) && defined(CONFIG_INTERRUPT_BASED_TXBCN)\n\t\t#undef CONFIG_INTERRUPT_BASED_TXBCN\n\t#endif\n\t#ifdef CONFIG_INTERRUPT_BASED_TXBCN\n\t\t//#define CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT\n\t\t#define CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR\t\t\n\t#endif\n\t\n\t#define CONFIG_NATIVEAP_MLME\n\t#ifndef CONFIG_NATIVEAP_MLME\n\t\t#define CONFIG_HOSTAPD_MLME\t1\n\t#endif\t\t\t\n\t#define CONFIG_FIND_BEST_CHANNEL\t1\n#endif\n\n#define CONFIG_P2P\t1\n#ifdef CONFIG_P2P\n\t//The CONFIG_WFD is for supporting the Wi-Fi display\n\t#define CONFIG_WFD\n\t\n\t#define CONFIG_P2P_REMOVE_GROUP_INFO\n\n\t//#define CONFIG_DBG_P2P\n\n\t#define CONFIG_P2P_PS\n\t//#define CONFIG_P2P_IPS\n\t#define CONFIG_P2P_OP_CHK_SOCIAL_CH\n\t#define CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT  //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag\n\t#define CONFIG_P2P_INVITE_IOT\n#endif\n\n//\tAdded by Kurt 20110511\n#ifdef CONFIG_TDLS\n\t#define CONFIG_TDLS_DRIVER_SETUP\n//\t#ifndef CONFIG_WFD\n//\t\t#define CONFIG_WFD\n//\t#endif\n//\t#define CONFIG_TDLS_AUTOSETUP\n\t#define CONFIG_TDLS_AUTOCHECKALIVE\n\t#define CONFIG_TDLS_CH_SW\t\t/* Enable \"CONFIG_TDLS_CH_SW\" by default, however limit it to only work in wifi logo test mode but not in normal mode currently */\n#endif\n\n\n#define CONFIG_SKB_COPY\t1//for amsdu\n\n#define CONFIG_LED\n#ifdef CONFIG_LED\n\t#define CONFIG_SW_LED\n\t#ifdef CONFIG_SW_LED\n\t\t//#define CONFIG_LED_HANDLED_BY_CMD_THREAD\n\t#endif\n#endif // CONFIG_LED\n\n#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface\n#define CONFIG_GLOBAL_UI_PID\n\n#define CONFIG_LAYER2_ROAMING\n#define CONFIG_LAYER2_ROAMING_RESUME\n//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general...\n//#define CONFIG_RESUME_IN_WORKQUEUE\n//#define CONFIG_SET_SCAN_DENY_TIMER\n#define CONFIG_LONG_DELAY_ISSUE\n#define CONFIG_NEW_SIGNAL_STAT_PROCESS\n//#define CONFIG_SIGNAL_DISPLAY_DBM //display RX signal with dbm\n#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n//#define CONFIG_BACKGROUND_NOISE_MONITOR\n#endif\n#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */\n\n#define CONFIG_TX_MCAST2UNI\t\t/*Support IP multicast->unicast*/\n//#define CONFIG_CHECK_AC_LIFETIME 1\t// Check packet lifetime of 4 ACs.\n\n\n/* \n * Interface  Related Config \n */\n\n#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t#define CONFIG_USB_TX_AGGREGATION\t1\n\t#define CONFIG_USB_RX_AGGREGATION\t1\n#endif\n\n//#define CONFIG_REDUCE_USB_TX_INT\t1\t// Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms.\n//#define CONFIG_EASY_REPLACEMENT\t1\n\n/* \n * CONFIG_USE_USB_BUFFER_ALLOC_XX uses Linux USB Buffer alloc API and is for Linux platform only now!\n */\n//#define CONFIG_USE_USB_BUFFER_ALLOC_TX 1\t// Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms.\n//#define CONFIG_USE_USB_BUFFER_ALLOC_RX 1\t// For RX path\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n#else\n\t#define CONFIG_PREALLOC_RECV_SKB\n\t#ifdef CONFIG_PREALLOC_RECV_SKB\n\t\t//#define CONFIG_FIX_NR_BULKIN_BUFFER /* only use PREALLOC_RECV_SKB buffer, don't alloc skb at runtime */\n\t#endif\n#endif\n\n/* \n * USB VENDOR REQ BUFFER ALLOCATION METHOD\n * if not set we'll use function local variable (stack memory)\n */\n//#define CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE\n#define CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC\n\n#define CONFIG_USB_VENDOR_REQ_MUTEX\n#define CONFIG_VENDOR_REQ_RETRY\n\n//#define CONFIG_USB_SUPPORT_ASYNC_VDN_REQ 1\n\n#ifdef CONFIG_WOWLAN\n\t//#define CONFIG_GTK_OL\n\t#define CONFIG_ARP_KEEP_ALIVE\n#endif // CONFIG_WOWLAN\n\n#ifdef CONFIG_GPIO_WAKEUP\n\t#ifndef WAKEUP_GPIO_IDX\n#define WAKEUP_GPIO_IDX\t1\t//WIFI Chip Side\n\t#endif // !WAKEUP_GPIO_IDX\n#endif // CONFIG_GPIO_WAKEUP\n\n/*\n * HAL  Related Config\n */\n#define RTL8812A_RX_PACKET_INCLUDE_CRC\t0\n\n#define CONFIG_RX_PACKET_APPEND_FCS\n\n//#define CONFIG_ONLY_ONE_OUT_EP_TO_LOW\t0\n\n#define CONFIG_OUT_EP_WIFI_MODE\t0\n\n#define ENABLE_USB_DROP_INCORRECT_OUT\n\n#define CONFIG_ADHOC_WORKAROUND_SETTING\t1\n\n#define ENABLE_NEW_RFE_TYPE\t0\n\n#define DISABLE_BB_RF\t0\n\n#ifdef CONFIG_MP_INCLUDED\n\t#define MP_DRIVER 1\n\t#define CONFIG_MP_IWPRIV_SUPPORT\t1\n\t//#undef CONFIG_USB_TX_AGGREGATION\n\t//#undef CONFIG_USB_RX_AGGREGATION\n#else\n\t#define MP_DRIVER 0\n#endif\n\n\n/*\n * Platform  Related Config\n */\n#ifdef CONFIG_PLATFORM_MN10300\n\t#define CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\n\t#define CONFIG_USE_USB_BUFFER_ALLOC_RX \n\t\n\t#if\tdefined (CONFIG_SW_ANTENNA_DIVERSITY)\n\t\t#undef CONFIG_SW_ANTENNA_DIVERSITY\n\t\t#define CONFIG_HW_ANTENNA_DIVERSITY\n\t#endif\n\n\t#if\tdefined (CONFIG_POWER_SAVING)\n\t\t#undef CONFIG_POWER_SAVING\n\t#endif\n\t\n#endif//CONFIG_PLATFORM_MN10300\n\n\n#if defined(CONFIG_PLATFORM_ACTIONS_ATM702X)\n\t#ifdef CONFIG_USB_TX_AGGREGATION\t\n\t\t#undef CONFIG_USB_TX_AGGREGATION\n\t#endif\n\t#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t\t#define CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t#endif\n\t#ifndef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t\t#define CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t#endif\n#endif\n\n#ifdef CONFIG_BT_COEXIST\n\t// for ODM and outsrc BT-Coex\n\t#define BT_30_SUPPORT 1\n\t#define CONFIG_BT_COEXIST_SOCKET_TRX\n\t#ifndef CONFIG_LPS\n\t\t#define CONFIG_LPS\t// download reserved page to FW\n\t#endif\n#else // !CONFIG_BT_COEXIST\n\t#define BT_30_SUPPORT 0\n#endif // !CONFIG_BT_COEXIST\n\n\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n//#define \tCONFIG_TX_EARLY_MODE\n#endif\n\n#define\tRTL8188E_EARLY_MODE_PKT_NUM_10\t0\n\n#define CONFIG_80211D\n\n#define CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR\n\n/*\n * Debug Related Config\n */\n#define DBG\t0\n\n//#define CONFIG_DEBUG /* DBG_871X, etc... */\n//#define CONFIG_DEBUG_RTL871X /* RT_TRACE, RT_PRINT_DATA, _func_enter_, _func_exit_ */\n\n//#define CONFIG_PROC_DEBUG\n\n//#define DBG_CONFIG_ERROR_DETECT\n//#define DBG_CONFIG_ERROR_DETECT_INT\n//#define DBG_CONFIG_ERROR_RESET\n\n//#define DBG_IO\n//#define DBG_DELAY_OS\n//#define DBG_MEM_ALLOC\n//#define DBG_IOCTL\n\n//#define DBG_TX\n//#define DBG_XMIT_BUF\n//#define DBG_XMIT_BUF_EXT\n//#define DBG_TX_DROP_FRAME\n\n//#define DBG_RX_DROP_FRAME\n//#define DBG_RX_SEQ\n//#define DBG_RX_SIGNAL_DISPLAY_PROCESSING\n//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED \"jeff-ap\"\n\n\n\n//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE\n//#define DBG_ROAMING_TEST\n\n//#define DBG_HAL_INIT_PROFILING\n\n//#define DBG_MEMORY_LEAK\t1\n//#define CONFIG_FW_C2H_DEBUG \n/*#define\tDBG_RX_DFRAME_RAW_DATA*/\n"
  },
  {
    "path": "include/basic_types.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __BASIC_TYPES_H__\n#define __BASIC_TYPES_H__\n\n\n#define SUCCESS\t0\n#define FAIL\t(-1)\n\n#ifndef TRUE\n\t#define _TRUE\t1\n#else\n\t#define _TRUE\tTRUE\t\n#endif\n\t\t\n#ifndef FALSE\t\t\n\t#define _FALSE\t0\n#else\n\t#define _FALSE\tFALSE\t\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n\ttypedef signed char s8;\n\ttypedef unsigned char u8;\n\n\ttypedef signed short s16;\n\ttypedef unsigned short u16;\n\n\ttypedef signed long s32;\n\ttypedef unsigned long u32;\n\t\n\ttypedef unsigned int\tuint;\n\ttypedef\tsigned int\t\tsint;\n\n\n\ttypedef signed long long s64;\n\ttypedef unsigned long long u64;\n\n\t#ifdef NDIS50_MINIPORT\n\t\n\t\t#define NDIS_MAJOR_VERSION       5\n\t\t#define NDIS_MINOR_VERSION       0\n\n\t#endif\n\n\t#ifdef NDIS51_MINIPORT\n\n\t\t#define NDIS_MAJOR_VERSION       5\n\t\t#define NDIS_MINOR_VERSION       1\n\n\t#endif\n\n\ttypedef NDIS_PROC proc_t;\n\n\ttypedef LONG atomic_t;\n\n#endif\n\n\n#ifdef PLATFORM_LINUX\n\t#include <linux/version.h>\n\t#include <linux/types.h>\n\t#include <linux/module.h>\n\t#include <linux/kernel.h>\n\t#include <linux/init.h>\n\t#include <linux/utsname.h>\n\t#define IN\n\t#define OUT\n\t#define VOID void\n\t#define NDIS_OID uint\n\t#define NDIS_STATUS uint\n\n\ttypedef\tsigned int sint;\n\n\t#ifndef\tPVOID\n\ttypedef void * PVOID;\n\t//#define PVOID\t(void *)\n\t#endif\n\n        #define UCHAR u8\n\t#define USHORT u16\n\t#define UINT u32\n\t#define ULONG u32\t\n\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19))\n\t\ttypedef _Bool bool;\n\t#endif\n\n\ttypedef void (*proc_t)(void*);\n\n\ttypedef \t__kernel_size_t\tSIZE_T;\t\n\ttypedef\t__kernel_ssize_t\tSSIZE_T;\n\t#define FIELD_OFFSET(s,field)\t((SSIZE_T)&((s*)(0))->field)\n\t\n#endif\n\n\n#ifdef PLATFORM_FREEBSD\n\n\ttypedef signed char s8;\n\ttypedef unsigned char u8;\n\n\ttypedef signed short s16;\n\ttypedef unsigned short u16;\n\n\ttypedef signed int s32;\n\ttypedef unsigned int u32;\n\t\n\ttypedef unsigned int\tuint;\n\ttypedef\tsigned int\t\tsint;\n\ttypedef long atomic_t;\n\n\ttypedef signed long long s64;\n\ttypedef unsigned long long u64;\n\t#define IN\n\t#define OUT\n\t#define VOID void\n\t#define NDIS_OID uint\n\t#define NDIS_STATUS uint\n\t\n\t#ifndef\tPVOID\n\ttypedef void * PVOID;\n\t//#define PVOID\t(void *)\n\t#endif\n\ttypedef u32 dma_addr_t;\n    #define UCHAR u8\n\t#define USHORT u16\n\t#define UINT u32\n\t#define ULONG u32\t\n\n\ttypedef void (*proc_t)(void*);\n  \n  typedef unsigned int __kernel_size_t;\n  typedef int __kernel_ssize_t;\n  \n\ttypedef \t__kernel_size_t\tSIZE_T;\t\n\ttypedef\t__kernel_ssize_t\tSSIZE_T;\n\t#define FIELD_OFFSET(s,field)\t((SSIZE_T)&((s*)(0))->field)\n\t\n#endif\n\n#define MEM_ALIGNMENT_OFFSET\t(sizeof (SIZE_T))\n#define MEM_ALIGNMENT_PADDING\t(sizeof(SIZE_T) - 1)\n\n#define SIZE_PTR SIZE_T\n#define SSIZE_PTR SSIZE_T\n\n//port from fw by thomas\n// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness\n\n/*\n *\tCall endian free function when\n *\t\t1. Read/write packet content.\n *\t\t2. Before write integer to IO.\n *\t\t3. After read integer from IO.\n*/\n\n//\n// Byte Swapping routine.\n//\n#define EF1Byte\t(u8)\n#define EF2Byte \tle16_to_cpu\n#define EF4Byte\tle32_to_cpu\n\n//\n// Read LE format data from memory\n//\n#define ReadEF1Byte(_ptr)\t\tEF1Byte(*((u8 *)(_ptr)))\n#define ReadEF2Byte(_ptr)\t\tEF2Byte(*((u16 *)(_ptr)))\n#define ReadEF4Byte(_ptr)\t\tEF4Byte(*((u32 *)(_ptr)))\n\n//\n// Write LE data to memory\n//\n#define WriteEF1Byte(_ptr, _val)\t(*((u8 *)(_ptr)))=EF1Byte(_val)\n#define WriteEF2Byte(_ptr, _val)\t(*((u16 *)(_ptr)))=EF2Byte(_val)\n#define WriteEF4Byte(_ptr, _val)\t(*((u32 *)(_ptr)))=EF4Byte(_val)\t\t\t\t\t\t\t\t\t\n\n//\n//\tExample:\n//\t\tBIT_LEN_MASK_32(0) => 0x00000000\n//\t\tBIT_LEN_MASK_32(1) => 0x00000001\n//\t\tBIT_LEN_MASK_32(2) => 0x00000003\n//\t\tBIT_LEN_MASK_32(32) => 0xFFFFFFFF\n//\n#define BIT_LEN_MASK_32(__BitLen) \\\n\t(0xFFFFFFFF >> (32 - (__BitLen)))\n//\n//\tExample:\n//\t\tBIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003\n//\t\tBIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000\n//\n#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \\\n\t(BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) \n\n//\n//\tDescription:\n//\t\tReturn 4-byte value in host byte ordering from\n//\t\t4-byte pointer in litten-endian system.\n//\n#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \\\n\t(EF4Byte(*((u32 *)(__pStart))))\n\n//\n//\tDescription:\n//\t\tTranslate subfield (continuous bits in little-endian) of 4-byte value in litten byte to\n//\t\t4-byte value in host byte ordering.\n//\n#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\t( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \\\n\t\t& \\\n\t\tBIT_LEN_MASK_32(__BitLen) \\\n\t)\n\n//\n//\tDescription:\n//\t\tMask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering  \n//\t\tand return the result in 4-byte value in host byte ordering.\n//\n#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\tLE_P4BYTE_TO_HOST_4BYTE(__pStart) \\\n\t\t& \\\n\t\t( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \\\n\t)\n\n//\n//\tDescription:\n//\t\tSet subfield of little-endian 4-byte value to specified value.\t\n//\n#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \\\n\t*((u32 *)(__pStart)) = \\\n\t\tEF4Byte( \\\n\t\t\tLE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \\\n\t\t\t| \\\n\t\t\t( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \\\n\t\t);\n\n\t\t\n#define BIT_LEN_MASK_16(__BitLen) \\\n\t\t(0xFFFF >> (16 - (__BitLen)))\n\t\t\n#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \\\n\t(BIT_LEN_MASK_16(__BitLen) << (__BitOffset))\n\t\n#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \\\n\t(EF2Byte(*((u16 *)(__pStart))))\n\t\n#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\t( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \\\n\t\t& \\\n\t\tBIT_LEN_MASK_16(__BitLen) \\\n\t)\n\t\n#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\tLE_P2BYTE_TO_HOST_2BYTE(__pStart) \\\n\t\t& \\\n\t\t(u16)(~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen))\\\n\t)\n\n#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \\\n\t*((u16 *)(__pStart)) = \\\n\t\tEF2Byte( \\\n\t\t\tLE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \\\n\t\t\t| \\\n\t\t\t( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \\\n\t\t);\n\t\t\t\n#define BIT_LEN_MASK_8(__BitLen) \\\n\t\t(0xFF >> (8 - (__BitLen)))\n\n#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \\\n\t(BIT_LEN_MASK_8(__BitLen) << (__BitOffset))\n\n#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \\\n\t(EF1Byte(*((u8 *)(__pStart))))\n\n#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\t( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \\\n\t\t& \\\n\t\tBIT_LEN_MASK_8(__BitLen) \\\n\t)\n\n#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\tLE_P1BYTE_TO_HOST_1BYTE(__pStart) \\\n\t\t& \\\n\t\t(u8)(~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen))\\\n\t)\n\n#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \\\ndo { \\\n\t*((u8 *)(__pStart)) = \\\n\t\tEF1Byte( \\\n\t\t\tLE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \\\n\t\t\t| \\\n\t\t\t( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \\\n\t\t); \\\n} while (0)\n\n\n#define LE_BITS_CLEARED_TO_2BYTE_16BIT(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\tLE_P2BYTE_TO_HOST_2BYTE(__pStart) \\\n\t)\n\n#define SET_BITS_TO_LE_2BYTE_16BIT(__pStart, __BitOffset, __BitLen, __Value) \\\n\t*((u16 *)(__pStart)) = \\\n\t\tEF2Byte( \\\n\t\t\tLE_BITS_CLEARED_TO_2BYTE_16BIT(__pStart, __BitOffset, __BitLen) \\\n\t\t\t| \\\n\t\t\t( (u16)__Value) \\\n\t\t);\n\n#define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \\\n\t( \\\n\t\tLE_P1BYTE_TO_HOST_1BYTE(__pStart) \\\n\t)\n\n#define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \\\ndo { \\\n\t*((u8 *)(__pStart)) = \\\n\t\tEF1Byte( \\\n\t\t\tLE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \\\n\t\t\t| \\\n\t\t\t((u8)__Value) \\\n\t\t); \\\n} while (0)\n\n// Get the N-bytes aligment offset from the current length\n#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment))\n\ntypedef unsigned char\tBOOLEAN,*PBOOLEAN;\n\n#define TEST_FLAG(__Flag,__testFlag)\t\t(((__Flag) & (__testFlag)) != 0)\n#define SET_FLAG(__Flag, __setFlag)\t\t\t((__Flag) |= __setFlag)\n#define CLEAR_FLAG(__Flag, __clearFlag)\t\t((__Flag) &= ~(__clearFlag))\n#define CLEAR_FLAGS(__Flag)\t\t\t\t\t((__Flag) = 0)\n#define TEST_FLAGS(__Flag, __testFlags)\t\t(((__Flag) & (__testFlags)) == (__testFlags))\n\n#endif //__BASIC_TYPES_H__\n\n"
  },
  {
    "path": "include/byteorder/big_endian.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_BYTEORDER_BIG_ENDIAN_H\n#define _LINUX_BYTEORDER_BIG_ENDIAN_H\n\n#ifndef __BIG_ENDIAN\n#define __BIG_ENDIAN 4321\n#endif\n#ifndef __BIG_ENDIAN_BITFIELD\n#define __BIG_ENDIAN_BITFIELD\n#endif\n\n#include <byteorder/swab.h>\n\n#define __constant_htonl(x) ((__u32)(x))\n#define __constant_ntohl(x) ((__u32)(x))\n#define __constant_htons(x) ((__u16)(x))\n#define __constant_ntohs(x) ((__u16)(x))\n#define __constant_cpu_to_le64(x) ___constant_swab64((x))\n#define __constant_le64_to_cpu(x) ___constant_swab64((x))\n#define __constant_cpu_to_le32(x) ___constant_swab32((x))\n#define __constant_le32_to_cpu(x) ___constant_swab32((x))\n#define __constant_cpu_to_le16(x) ___constant_swab16((x))\n#define __constant_le16_to_cpu(x) ___constant_swab16((x))\n#define __constant_cpu_to_be64(x) ((__u64)(x))\n#define __constant_be64_to_cpu(x) ((__u64)(x))\n#define __constant_cpu_to_be32(x) ((__u32)(x))\n#define __constant_be32_to_cpu(x) ((__u32)(x))\n#define __constant_cpu_to_be16(x) ((__u16)(x))\n#define __constant_be16_to_cpu(x) ((__u16)(x))\n#define __cpu_to_le64(x) __swab64((x))\n#define __le64_to_cpu(x) __swab64((x))\n#define __cpu_to_le32(x) __swab32((x))\n#define __le32_to_cpu(x) __swab32((x))\n#define __cpu_to_le16(x) __swab16((x))\n#define __le16_to_cpu(x) __swab16((x))\n#define __cpu_to_be64(x) ((__u64)(x))\n#define __be64_to_cpu(x) ((__u64)(x))\n#define __cpu_to_be32(x) ((__u32)(x))\n#define __be32_to_cpu(x) ((__u32)(x))\n#define __cpu_to_be16(x) ((__u16)(x))\n#define __be16_to_cpu(x) ((__u16)(x))\n#define __cpu_to_le64p(x) __swab64p((x))\n#define __le64_to_cpup(x) __swab64p((x))\n#define __cpu_to_le32p(x) __swab32p((x))\n#define __le32_to_cpup(x) __swab32p((x))\n#define __cpu_to_le16p(x) __swab16p((x))\n#define __le16_to_cpup(x) __swab16p((x))\n#define __cpu_to_be64p(x) (*(__u64*)(x))\n#define __be64_to_cpup(x) (*(__u64*)(x))\n#define __cpu_to_be32p(x) (*(__u32*)(x))\n#define __be32_to_cpup(x) (*(__u32*)(x))\n#define __cpu_to_be16p(x) (*(__u16*)(x))\n#define __be16_to_cpup(x) (*(__u16*)(x))\n#define __cpu_to_le64s(x) __swab64s((x))\n#define __le64_to_cpus(x) __swab64s((x))\n#define __cpu_to_le32s(x) __swab32s((x))\n#define __le32_to_cpus(x) __swab32s((x))\n#define __cpu_to_le16s(x) __swab16s((x))\n#define __le16_to_cpus(x) __swab16s((x))\n#define __cpu_to_be64s(x) do {} while (0)\n#define __be64_to_cpus(x) do {} while (0)\n#define __cpu_to_be32s(x) do {} while (0)\n#define __be32_to_cpus(x) do {} while (0)\n#define __cpu_to_be16s(x) do {} while (0)\n#define __be16_to_cpus(x) do {} while (0)\n\n#include <byteorder/generic.h>\n\n#endif /* _LINUX_BYTEORDER_BIG_ENDIAN_H */\n\n"
  },
  {
    "path": "include/byteorder/generic.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_BYTEORDER_GENERIC_H\n#define _LINUX_BYTEORDER_GENERIC_H\n\n/*\n * linux/byteorder_generic.h\n * Generic Byte-reordering support\n *\n * Francois-Rene Rideau <fare@tunes.org> 19970707\n *    gathered all the good ideas from all asm-foo/byteorder.h into one file,\n *    cleaned them up.\n *    I hope it is compliant with non-GCC compilers.\n *    I decided to put __BYTEORDER_HAS_U64__ in byteorder.h,\n *    because I wasn't sure it would be ok to put it in types.h\n *    Upgraded it to 2.1.43\n * Francois-Rene Rideau <fare@tunes.org> 19971012\n *    Upgraded it to 2.1.57\n *    to please Linus T., replaced huge #ifdef's between little/big endian\n *    by nestedly #include'd files.\n * Francois-Rene Rideau <fare@tunes.org> 19971205\n *    Made it to 2.1.71; now a facelift:\n *    Put files under include/linux/byteorder/\n *    Split swab from generic support.\n *\n * TODO:\n *   = Regular kernel maintainers could also replace all these manual\n *    byteswap macros that remain, disseminated among drivers,\n *    after some grep or the sources...\n *   = Linus might want to rename all these macros and files to fit his taste,\n *    to fit his personal naming scheme.\n *   = it seems that a few drivers would also appreciate\n *    nybble swapping support...\n *   = every architecture could add their byteswap macro in asm/byteorder.h\n *    see how some architectures already do (i386, alpha, ppc, etc)\n *   = cpu_to_beXX and beXX_to_cpu might some day need to be well\n *    distinguished throughout the kernel. This is not the case currently,\n *    since little endian, big endian, and pdp endian machines needn't it.\n *    But this might be the case for, say, a port of Linux to 20/21 bit\n *    architectures (and F21 Linux addict around?).\n */\n\n/*\n * The following macros are to be defined by <asm/byteorder.h>:\n *\n * Conversion of long and short int between network and host format\n *\tntohl(__u32 x)\n *\tntohs(__u16 x)\n *\thtonl(__u32 x)\n *\thtons(__u16 x)\n * It seems that some programs (which? where? or perhaps a standard? POSIX?)\n * might like the above to be functions, not macros (why?).\n * if that's true, then detect them, and take measures.\n * Anyway, the measure is: define only ___ntohl as a macro instead,\n * and in a separate file, have\n * unsigned long inline ntohl(x){return ___ntohl(x);}\n *\n * The same for constant arguments\n *\t__constant_ntohl(__u32 x)\n *\t__constant_ntohs(__u16 x)\n *\t__constant_htonl(__u32 x)\n *\t__constant_htons(__u16 x)\n *\n * Conversion of XX-bit integers (16- 32- or 64-)\n * between native CPU format and little/big endian format\n * 64-bit stuff only defined for proper architectures\n *\tcpu_to_[bl]eXX(__uXX x)\n *\t[bl]eXX_to_cpu(__uXX x)\n *\n * The same, but takes a pointer to the value to convert\n *\tcpu_to_[bl]eXXp(__uXX x)\n *\t[bl]eXX_to_cpup(__uXX x)\n *\n * The same, but change in situ\n *\tcpu_to_[bl]eXXs(__uXX x)\n *\t[bl]eXX_to_cpus(__uXX x)\n *\n * See asm-foo/byteorder.h for examples of how to provide\n * architecture-optimized versions\n *\n */\n\n\n#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL) || defined(PLATFORM_FREEBSD)\n/*\n * inside the kernel, we can use nicknames;\n * outside of it, we must avoid POSIX namespace pollution...\n */\n#define cpu_to_le64 __cpu_to_le64\n#define le64_to_cpu __le64_to_cpu\n#define cpu_to_le32 __cpu_to_le32\n#define le32_to_cpu __le32_to_cpu\n#define cpu_to_le16 __cpu_to_le16\n#define le16_to_cpu __le16_to_cpu\n#define cpu_to_be64 __cpu_to_be64\n#define be64_to_cpu __be64_to_cpu\n#define cpu_to_be32 __cpu_to_be32\n#define be32_to_cpu __be32_to_cpu\n#define cpu_to_be16 __cpu_to_be16\n#define be16_to_cpu __be16_to_cpu\n#define cpu_to_le64p __cpu_to_le64p\n#define le64_to_cpup __le64_to_cpup\n#define cpu_to_le32p __cpu_to_le32p\n#define le32_to_cpup __le32_to_cpup\n#define cpu_to_le16p __cpu_to_le16p\n#define le16_to_cpup __le16_to_cpup\n#define cpu_to_be64p __cpu_to_be64p\n#define be64_to_cpup __be64_to_cpup\n#define cpu_to_be32p __cpu_to_be32p\n#define be32_to_cpup __be32_to_cpup\n#define cpu_to_be16p __cpu_to_be16p\n#define be16_to_cpup __be16_to_cpup\n#define cpu_to_le64s __cpu_to_le64s\n#define le64_to_cpus __le64_to_cpus\n#define cpu_to_le32s __cpu_to_le32s\n#define le32_to_cpus __le32_to_cpus\n#define cpu_to_le16s __cpu_to_le16s\n#define le16_to_cpus __le16_to_cpus\n#define cpu_to_be64s __cpu_to_be64s\n#define be64_to_cpus __be64_to_cpus\n#define cpu_to_be32s __cpu_to_be32s\n#define be32_to_cpus __be32_to_cpus\n#define cpu_to_be16s __cpu_to_be16s\n#define be16_to_cpus __be16_to_cpus\n#endif\n\n\n/*\n * Handle ntohl and suches. These have various compatibility\n * issues - like we want to give the prototype even though we\n * also have a macro for them in case some strange program\n * wants to take the address of the thing or something..\n *\n * Note that these used to return a \"long\" in libc5, even though\n * long is often 64-bit these days.. Thus the casts.\n *\n * They have to be macros in order to do the constant folding\n * correctly - if the argument passed into a inline function\n * it is no longer constant according to gcc..\n */\n\n#undef ntohl\n#undef ntohs\n#undef htonl\n#undef htons\n\n/*\n * Do the prototypes. Somebody might want to take the\n * address or some such sick thing..\n */\n#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)\nextern __u32\t\t\tntohl(__u32);\nextern __u32\t\t\thtonl(__u32);\n#else //defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)\n#ifndef PLATFORM_FREEBSD\nextern unsigned long int\tntohl(unsigned long int);\nextern unsigned long int\thtonl(unsigned long int);\n#endif\n#endif\n#ifndef PLATFORM_FREEBSD\nextern unsigned short int\tntohs(unsigned short int);\nextern unsigned short int\thtons(unsigned short int);\n#endif\n\n#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) ||  defined(PLATFORM_MPIXEL)\n\n#define ___htonl(x) __cpu_to_be32(x)\n#define ___htons(x) __cpu_to_be16(x)\n#define ___ntohl(x) __be32_to_cpu(x)\n#define ___ntohs(x) __be16_to_cpu(x)\n\n#if defined(PLATFORM_LINUX) || (defined (__GLIBC__) && __GLIBC__ >= 2)\n#define htonl(x) ___htonl(x)\n#define ntohl(x) ___ntohl(x)\n#else\n#define htonl(x) ((unsigned long)___htonl(x))\n#define ntohl(x) ((unsigned long)___ntohl(x))\n#endif\n#define htons(x) ___htons(x)\n#define ntohs(x) ___ntohs(x)\n\n#endif /* OPTIMIZE */\n\n\n#if defined (PLATFORM_WINDOWS)\n\n#define htonl(x) __cpu_to_be32(x)\n#define ntohl(x) __be32_to_cpu(x)\n#define htons(x) __cpu_to_be16(x)\n#define ntohs(x) __be16_to_cpu(x)\n\n\n#endif\n\n#endif /* _LINUX_BYTEORDER_GENERIC_H */\n\n"
  },
  {
    "path": "include/byteorder/little_endian.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_BYTEORDER_LITTLE_ENDIAN_H\n#define _LINUX_BYTEORDER_LITTLE_ENDIAN_H\n\n#ifndef __LITTLE_ENDIAN\n#define __LITTLE_ENDIAN 1234\n#endif\n#ifndef __LITTLE_ENDIAN_BITFIELD\n#define __LITTLE_ENDIAN_BITFIELD\n#endif\n\n#include <byteorder/swab.h>\n\n#ifndef __constant_htonl\n#define __constant_htonl(x) ___constant_swab32((x))\n#define __constant_ntohl(x) ___constant_swab32((x))\n#define __constant_htons(x) ___constant_swab16((x))\n#define __constant_ntohs(x) ___constant_swab16((x))\n#define __constant_cpu_to_le64(x) ((__u64)(x))\n#define __constant_le64_to_cpu(x) ((__u64)(x))\n#define __constant_cpu_to_le32(x) ((__u32)(x))\n#define __constant_le32_to_cpu(x) ((__u32)(x))\n#define __constant_cpu_to_le16(x) ((__u16)(x))\n#define __constant_le16_to_cpu(x) ((__u16)(x))\n#define __constant_cpu_to_be64(x) ___constant_swab64((x))\n#define __constant_be64_to_cpu(x) ___constant_swab64((x))\n#define __constant_cpu_to_be32(x) ___constant_swab32((x))\n#define __constant_be32_to_cpu(x) ___constant_swab32((x))\n#define __constant_cpu_to_be16(x) ___constant_swab16((x))\n#define __constant_be16_to_cpu(x) ___constant_swab16((x))\n#define __cpu_to_le64(x) ((__u64)(x))\n#define __le64_to_cpu(x) ((__u64)(x))\n#define __cpu_to_le32(x) ((__u32)(x))\n#define __le32_to_cpu(x) ((__u32)(x))\n#define __cpu_to_le16(x) ((__u16)(x))\n#define __le16_to_cpu(x) ((__u16)(x))\n#define __cpu_to_be64(x) __swab64((x))\n#define __be64_to_cpu(x) __swab64((x))\n#define __cpu_to_be32(x) __swab32((x))\n#define __be32_to_cpu(x) __swab32((x))\n#define __cpu_to_be16(x) __swab16((x))\n#define __be16_to_cpu(x) __swab16((x))\n#define __cpu_to_le64p(x) (*(__u64*)(x))\n#define __le64_to_cpup(x) (*(__u64*)(x))\n#define __cpu_to_le32p(x) (*(__u32*)(x))\n#define __le32_to_cpup(x) (*(__u32*)(x))\n#define __cpu_to_le16p(x) (*(__u16*)(x))\n#define __le16_to_cpup(x) (*(__u16*)(x))\n#define __cpu_to_be64p(x) __swab64p((x))\n#define __be64_to_cpup(x) __swab64p((x))\n#define __cpu_to_be32p(x) __swab32p((x))\n#define __be32_to_cpup(x) __swab32p((x))\n#define __cpu_to_be16p(x) __swab16p((x))\n#define __be16_to_cpup(x) __swab16p((x))\n#define __cpu_to_le64s(x) do {} while (0)\n#define __le64_to_cpus(x) do {} while (0)\n#define __cpu_to_le32s(x) do {} while (0)\n#define __le32_to_cpus(x) do {} while (0)\n#define __cpu_to_le16s(x) do {} while (0)\n#define __le16_to_cpus(x) do {} while (0)\n#define __cpu_to_be64s(x) __swab64s((x))\n#define __be64_to_cpus(x) __swab64s((x))\n#define __cpu_to_be32s(x) __swab32s((x))\n#define __be32_to_cpus(x) __swab32s((x))\n#define __cpu_to_be16s(x) __swab16s((x))\n#define __be16_to_cpus(x) __swab16s((x))\n#endif\t// __constant_htonl\n\n#include <byteorder/generic.h>\n\n#endif /* _LINUX_BYTEORDER_LITTLE_ENDIAN_H */\n\n"
  },
  {
    "path": "include/byteorder/swab.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_BYTEORDER_SWAB_H\n#define _LINUX_BYTEORDER_SWAB_H\n\n#if !defined(CONFIG_PLATFORM_MSTAR)\n#ifndef __u16\ntypedef unsigned short __u16;\n#endif\n\n#ifndef __u32\ntypedef unsigned int\t__u32;\n#endif\n\n#ifndef __u8\ntypedef unsigned char __u8;\n#endif\n\n#ifndef __u64\ntypedef unsigned long long\t__u64;\t\n#endif\n\n\n__inline static __u16  ___swab16(__u16 x)\n{\n\t__u16 __x = x; \n\treturn \n\t((__u16)( \n\t\t(((__u16)(__x) & (__u16)0x00ffU) << 8) |\n\t\t(((__u16)(__x) & (__u16)0xff00U) >> 8) ));\n\n}\n\n__inline static __u32  ___swab32(__u32 x)\n{\n\t__u32 __x = (x);\n\treturn ((__u32)(\n\t\t(((__u32)(__x) & (__u32)0x000000ffUL) << 24) |\n\t\t(((__u32)(__x) & (__u32)0x0000ff00UL) <<  8) |\n\t\t(((__u32)(__x) & (__u32)0x00ff0000UL) >>  8) |\n\t\t(((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));\n}\n\n__inline static __u64  ___swab64(__u64 x)\n{\n\t__u64 __x = (x);\n\t\n\treturn \n\t((__u64)( \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) <<  8) | \\\n\t        (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >>  8) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \\\n\t\t(__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \\\n}\n#endif // CONFIG_PLATFORM_MSTAR\n\n#ifndef __arch__swab16\n__inline static __u16 __arch__swab16(__u16 x)\n{\n\treturn ___swab16(x);\n}\n\n#endif\n\n#ifndef __arch__swab32\n__inline static __u32 __arch__swab32(__u32 x)\n{\n\t__u32 __tmp = (x) ; \n\treturn ___swab32(__tmp);\n}\n#endif\n\n#ifndef __arch__swab64\n\n__inline static __u64 __arch__swab64(__u64 x)\n{\n\t__u64 __tmp = (x) ; \n\treturn ___swab64(__tmp);\n}\n\n\n#endif\n\n#ifndef __swab16\n#define __swab16(x) __fswab16(x)\n#define __swab32(x) __fswab32(x)\n#define __swab64(x) __fswab64(x)\n#endif\t// __swab16\n\n#ifdef PLATFORM_FREEBSD\n__inline static __u16 __fswab16(__u16 x)\n#else\n__inline static const __u16 __fswab16(__u16 x)\n#endif //PLATFORM_FREEBSD\n{\n\treturn __arch__swab16(x);\n}\n#ifdef PLATFORM_FREEBSD\n__inline static __u32 __fswab32(__u32 x)\n#else\n__inline static const __u32 __fswab32(__u32 x)\n#endif //PLATFORM_FREEBSD\n{\n\treturn __arch__swab32(x);\n}\n\n#if defined(PLATFORM_LINUX) || defined(PLATFORM_WINDOWS)\n#define swab16 __swab16\n#define swab32 __swab32\n#define swab64 __swab64\n#define swab16p __swab16p\n#define swab32p __swab32p\n#define swab64p __swab64p\n#define swab16s __swab16s\n#define swab32s __swab32s\n#define swab64s __swab64s\n#endif\n\n#endif /* _LINUX_BYTEORDER_SWAB_H */\n\n"
  },
  {
    "path": "include/byteorder/swabb.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_BYTEORDER_SWABB_H\n#define _LINUX_BYTEORDER_SWABB_H\n\n/*\n * linux/byteorder/swabb.h\n * SWAp Bytes Bizarrely\n *\tswaHHXX[ps]?(foo)\n *\n * Support for obNUXIous pdp-endian and other bizarre architectures.\n * Will Linux ever run on such ancient beasts? if not, this file\n * will be but a programming pearl. Still, it's a reminder that we\n * shouldn't be making too many assumptions when trying to be portable.\n *\n */\n\n/*\n * Meaning of the names I chose (vaxlinux people feel free to correct them):\n * swahw32\tswap 16-bit half-words in a 32-bit word\n * swahb32\tswap 8-bit halves of each 16-bit half-word in a 32-bit word\n *\n * No 64-bit support yet. I don't know NUXI conventions for long longs.\n * I guarantee it will be a mess when it's there, though :->\n * It will be even worse if there are conflicting 64-bit conventions.\n * Hopefully, no one ever used 64-bit objects on NUXI machines.\n *\n */\n\n#define ___swahw32(x) \\\n({ \\\n\t__u32 __x = (x); \\\n\t((__u32)( \\\n\t\t(((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \\\n\t\t(((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \\\n})\n#define ___swahb32(x) \\\n({ \\\n\t__u32 __x = (x); \\\n\t((__u32)( \\\n\t\t(((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \\\n\t\t(((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )); \\\n})\n\n#define ___constant_swahw32(x) \\\n\t((__u32)( \\\n\t\t(((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \\\n\t\t(((__u32)(x) & (__u32)0xffff0000UL) >> 16) ))\n#define ___constant_swahb32(x) \\\n\t((__u32)( \\\n\t\t(((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \\\n\t\t(((__u32)(x) & (__u32)0xff00ff00UL) >> 8) ))\n\n/*\n * provide defaults when no architecture-specific optimization is detected\n */\n#ifndef __arch__swahw32\n#  define __arch__swahw32(x) ___swahw32(x)\n#endif\n#ifndef __arch__swahb32\n#  define __arch__swahb32(x) ___swahb32(x)\n#endif\n\n#ifndef __arch__swahw32p\n#  define __arch__swahw32p(x) __swahw32(*(x))\n#endif\n#ifndef __arch__swahb32p\n#  define __arch__swahb32p(x) __swahb32(*(x))\n#endif\n\n#ifndef __arch__swahw32s\n#  define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0)\n#endif\n#ifndef __arch__swahb32s\n#  define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0)\n#endif\n\n\n/*\n * Allow constant folding\n */\n#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__)\n#  define __swahw32(x) \\\n(__builtin_constant_p((__u32)(x)) ? \\\n ___swahw32((x)) : \\\n __fswahw32((x)))\n#  define __swahb32(x) \\\n(__builtin_constant_p((__u32)(x)) ? \\\n ___swahb32((x)) : \\\n __fswahb32((x)))\n#else\n#  define __swahw32(x) __fswahw32(x)\n#  define __swahb32(x) __fswahb32(x)\n#endif /* OPTIMIZE */\n\n\n__inline static__ __const__ __u32 __fswahw32(__u32 x)\n{\n\treturn __arch__swahw32(x);\n}\n__inline static__ __u32 __swahw32p(__u32 *x)\n{\n\treturn __arch__swahw32p(x);\n}\n__inline static__ void __swahw32s(__u32 *addr)\n{\n\t__arch__swahw32s(addr);\n}\n\n\n__inline static__ __const__ __u32 __fswahb32(__u32 x)\n{\n\treturn __arch__swahb32(x);\n}\n__inline static__ __u32 __swahb32p(__u32 *x)\n{\n\treturn __arch__swahb32p(x);\n}\n__inline static__ void __swahb32s(__u32 *addr)\n{\n\t__arch__swahb32s(addr);\n}\n\n#ifdef __BYTEORDER_HAS_U64__\n/*\n * Not supported yet\n */\n#endif /* __BYTEORDER_HAS_U64__ */\n\n#if defined(PLATFORM_LINUX)\n#define swahw32 __swahw32\n#define swahb32 __swahb32\n#define swahw32p __swahw32p\n#define swahb32p __swahb32p\n#define swahw32s __swahw32s\n#define swahb32s __swahb32s\n#endif\n\n#endif /* _LINUX_BYTEORDER_SWABB_H */\n\n"
  },
  {
    "path": "include/circ_buf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __CIRC_BUF_H_\n#define __CIRC_BUF_H_ 1\n\n#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))\n\n#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))\n\n#endif //_CIRC_BUF_H_\n\n"
  },
  {
    "path": "include/cmd_osdep.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __CMD_OSDEP_H_\n#define __CMD_OSDEP_H_\n\n\nextern sint _rtw_init_cmd_priv (struct\tcmd_priv *pcmdpriv);\nextern sint _rtw_init_evt_priv(struct evt_priv *pevtpriv);\nextern void _rtw_free_evt_priv (struct\tevt_priv *pevtpriv);\nextern void _rtw_free_cmd_priv (struct\tcmd_priv *pcmdpriv);\nextern sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj);\nextern struct\tcmd_obj\t*_rtw_dequeue_cmd(_queue *queue);\n\n#endif\n\n"
  },
  {
    "path": "include/custom_gpio.h",
    "content": "#ifndef __CUSTOM_GPIO_H__\n#define __CUSTOM_GPIO_H___\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n\n#ifdef PLATFORM_OS_XP\n#include <drv_types_xp.h>\n#endif\n\n#ifdef PLATFORM_OS_CE\n#include <drv_types_ce.h>\n#endif\n\n#ifdef PLATFORM_LINUX\n#include <drv_types_linux.h>\n#endif\n\ntypedef enum cust_gpio_modes {\n\tWLAN_PWDN_ON,\n\tWLAN_PWDN_OFF,\n\tWLAN_POWER_ON,\n\tWLAN_POWER_OFF,\n\tWLAN_BT_PWDN_ON,\n\tWLAN_BT_PWDN_OFF\n} cust_gpio_modes_t;\n\nextern int rtw_wifi_gpio_init(void);\nextern int rtw_wifi_gpio_deinit(void);\nextern void rtw_wifi_gpio_wlan_ctrl(int onoff);\n\n#endif\n"
  },
  {
    "path": "include/drv_conf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_CONF_H__\n#define __DRV_CONF_H__\n#include \"autoconf.h\"\n#include \"hal_ic_cfg.h\"\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n\n#error \"Shall be Linux or Windows, but not both!\\n\"\n\n#endif\n\n//Older Android kernel doesn't has CONFIG_ANDROID defined,\n//add this to force CONFIG_ANDROID defined\n#ifdef CONFIG_PLATFORM_ANDROID\n#ifndef CONFIG_ANDROID\n#define CONFIG_ANDROID\n#endif\n#endif\n\n#ifdef CONFIG_ANDROID\n//Some Android build will restart the UI while non-printable ascii is passed\n//between java and c/c++ layer (JNI). We force CONFIG_VALIDATE_SSID\n//for Android here. If you are sure there is no risk on your system about this,\n//mask this macro define to support non-printable ascii ssid.\n//#define CONFIG_VALIDATE_SSID\n\n//Android expect dbm as the rx signal strength unit\n#define CONFIG_SIGNAL_DISPLAY_DBM\n#endif\n\n/*\n#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE)\n\t#warning \"You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically\"\n\t#undef CONFIG_RESUME_IN_WORKQUEUE\n#endif\n\n#if defined(CONFIG_ANDROID_POWER) && defined (CONFIG_RESUME_IN_WORKQUEUE)\n\t#warning \"You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically\"\n\t#undef CONFIG_RESUME_IN_WORKQUEUE\n#endif\n*/\n\n#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this...\n\t#if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER)\n\t#error \"enable CONFIG_RESUME_IN_WORKQUEUE without CONFIG_WAKELOCK or CONFIG_ANDROID_POWER will suffer from the danger of wifi's unfunctionality...\"\n\t#error \"If you still want to enable CONFIG_RESUME_IN_WORKQUEUE in this case, mask this preprossor checking and GOOD LUCK...\"\n\t#endif\n#endif\n\n//About USB VENDOR REQ\n#if defined(CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC) && !defined(CONFIG_USB_VENDOR_REQ_MUTEX) \n\t#warning \"define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC automatically\"\n\t#define CONFIG_USB_VENDOR_REQ_MUTEX\n#endif\n#if defined(CONFIG_VENDOR_REQ_RETRY) &&  !defined(CONFIG_USB_VENDOR_REQ_MUTEX)\n\t#warning \"define CONFIG_USB_VENDOR_REQ_MUTEX for CONFIG_VENDOR_REQ_RETRY automatically\"\n\t#define CONFIG_USB_VENDOR_REQ_MUTEX\n#endif\n\n#if !defined(CONFIG_AP_MODE) && defined(CONFIG_DFS_MASTER)\n\t#warning \"undef CONFIG_DFS_MASTER because CONFIG_AP_MODE is not defined\"\n\t#undef CONFIG_DFS_MASTER\n#endif\n\n#define DYNAMIC_CAMID_ALLOC\n\n#define RTW_SCAN_SPARSE_MIRACAST 1\n#define RTW_SCAN_SPARSE_BG 0\n\n#ifndef CONFIG_RTW_HIQ_FILTER\n\t#define CONFIG_RTW_HIQ_FILTER 1\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_EN\n\t#define CONFIG_RTW_ADAPTIVITY_EN 0\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_MODE\n\t#define CONFIG_RTW_ADAPTIVITY_MODE 0\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_DML\n\t#define CONFIG_RTW_ADAPTIVITY_DML 0\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_DC_BACKOFF\n\t#define CONFIG_RTW_ADAPTIVITY_DC_BACKOFF 2\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_TH_L2H_INI\n\t#define CONFIG_RTW_ADAPTIVITY_TH_L2H_INI 0\n#endif\n\n#ifndef CONFIG_RTW_ADAPTIVITY_TH_EDCCA_HL_DIFF\n\t#define CONFIG_RTW_ADAPTIVITY_TH_EDCCA_HL_DIFF 0\n#endif\n\n#ifndef CONFIG_RTW_AMPLIFIER_TYPE_2G\n\t#define CONFIG_RTW_AMPLIFIER_TYPE_2G 0\n#endif\n\n#ifndef CONFIG_RTW_AMPLIFIER_TYPE_5G\n\t#define CONFIG_RTW_AMPLIFIER_TYPE_5G 0\n#endif\n\n#ifndef CONFIG_RTW_RFE_TYPE\n\t#define CONFIG_RTW_RFE_TYPE 64\n#endif\n\n#ifndef CONFIG_RTW_GLNA_TYPE\n\t#define CONFIG_RTW_GLNA_TYPE 0\n#endif\n\n#ifndef CONFIG_RTW_PLL_REF_CLK_SEL\n\t#define CONFIG_RTW_PLL_REF_CLK_SEL 0x0F\n#endif\n\n#define MACID_NUM_SW_LIMIT 32\n#define SEC_CAM_ENT_NUM_SW_LIMIT 32\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)\n\t#define CONFIG_IEEE80211_BAND_5GHZ\n#endif\n\n/*\n\tMark CONFIG_DEAUTH_BEFORE_CONNECT by Arvin 2015/07/20\n\tIf the failure of Wi-Fi connection is due to some irregular disconnection behavior (like unplug dongle,\n\tpower down etc.) in last time, we can unmark this flag to avoid some unpredictable response from AP.\n*/\n/*#define CONFIG_DEAUTH_BEFORE_CONNECT */\n\n/*#define CONFIG_WEXT_DONT_JOIN_BYSSID\t*/\n//#include <rtl871x_byteorder.h>\n\n\n/*#define CONFIG_DOSCAN_IN_BUSYTRAFFIC\t*/\n\n#endif // __DRV_CONF_H__\n\n"
  },
  {
    "path": "include/drv_types.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*-------------------------------------------------------------------------------\n\n\tFor type defines and data structure defines\n\n--------------------------------------------------------------------------------*/\n\n\n#ifndef __DRV_TYPES_H__\n#define __DRV_TYPES_H__\n\n#include <drv_conf.h>\n#include <basic_types.h>\n#include <osdep_service.h>\n#include <rtw_byteorder.h>\n#include <wlan_bssdef.h>\n#include <wifi.h>\n#include <ieee80211.h>\n#ifdef CONFIG_ARP_KEEP_ALIVE\n#include <net/neighbour.h>\n#include <net/arp.h>\n#endif\n\n#ifdef PLATFORM_OS_XP\n#include <drv_types_xp.h>\n#endif\n\n#ifdef PLATFORM_OS_CE\n#include <drv_types_ce.h>\n#endif\n\n#ifdef PLATFORM_LINUX\n#include <drv_types_linux.h>\n#endif\n\nenum _NIC_VERSION {\n\n\tRTL8711_NIC,\n\tRTL8712_NIC,\n\tRTL8713_NIC,\n\tRTL8716_NIC\n\n};\n\ntypedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;\n\n#include <rtw_debug.h>\n#include <rtw_rf.h>\n\n#ifdef CONFIG_80211N_HT\n#include <rtw_ht.h>\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n#include <rtw_vht.h>\n#endif\n\n#ifdef CONFIG_INTEL_WIDI\n#include <rtw_intel_widi.h>\n#endif\n\n#include <rtw_cmd.h>\n#include <cmd_osdep.h>\n#include <rtw_security.h>\n#include <rtw_xmit.h>\n#include <xmit_osdep.h>\n#include <rtw_recv.h>\n\n#ifdef CONFIG_BEAMFORMING\n#include <rtw_beamforming.h>\n#endif\n\n#include <recv_osdep.h>\n#include <rtw_efuse.h>\n#include <rtw_sreset.h>\n#include <hal_intf.h>\n#include <hal_com.h>\n#include<hal_com_h2c.h>\n#include <hal_com_led.h>\n#include \"../hal/hal_dm.h\"\n#include <rtw_qos.h>\n#include <rtw_pwrctrl.h>\n#include <rtw_mlme.h>\n#include <mlme_osdep.h>\n#include <rtw_io.h>\n#include <rtw_ioctl.h>\n#include <rtw_ioctl_set.h>\n#include <rtw_ioctl_query.h>\n#include <rtw_ioctl_rtl.h>\n#include <osdep_intf.h>\n#include <rtw_eeprom.h>\n#include <sta_info.h>\n#include <rtw_event.h>\n#include <rtw_mlme_ext.h>\n#include <rtw_ap.h>\n#include <rtw_efuse.h>\n#include <rtw_version.h>\n#include <rtw_odm.h>\n\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n#include <rtw_mem.h>\n#endif\n\n#ifdef CONFIG_P2P\n#include <rtw_p2p.h>\n#endif // CONFIG_P2P\n\n#ifdef CONFIG_TDLS\n#include <rtw_tdls.h>\n#endif // CONFIG_TDLS\n\n#ifdef CONFIG_WAPI_SUPPORT\n#include <rtw_wapi.h>\n#endif // CONFIG_WAPI_SUPPORT\n\n#ifdef CONFIG_DRVEXT_MODULE\n#include <drvext_api.h>\n#endif // CONFIG_DRVEXT_MODULE\n\n#ifdef CONFIG_MP_INCLUDED\n#include <rtw_mp.h>\n#endif // CONFIG_MP_INCLUDED\n\n#ifdef CONFIG_BR_EXT\n#include <rtw_br_ext.h>\n#endif // CONFIG_BR_EXT\n\n#ifdef CONFIG_IOL\n#include <rtw_iol.h>\n#endif // CONFIG_IOL\n\n#include <ip.h>\n#include <if_ether.h>\n#include <ethernet.h>\n#include <circ_buf.h>\n\n#include <rtw_android.h>\n\n#ifdef CONFIG_BT_COEXIST\n#include <rtw_btcoex.h>\n#endif // CONFIG_BT_COEXIST\n\n#define SPEC_DEV_ID_NONE BIT(0)\n#define SPEC_DEV_ID_DISABLE_HT BIT(1)\n#define SPEC_DEV_ID_ENABLE_PS BIT(2)\n#define SPEC_DEV_ID_RF_CONFIG_1T1R BIT(3)\n#define SPEC_DEV_ID_RF_CONFIG_2T2R BIT(4)\n#define SPEC_DEV_ID_ASSIGN_IFNAME BIT(5)\n\nstruct specific_device_id{\n\n\tu32\t\tflags;\n\n\tu16\t\tidVendor;\n\tu16\t\tidProduct;\n\n};\n\nstruct registry_priv\n{\n\tu8\tchip_version;\n\tu8\trfintfs;\n\tu8\tlbkmode;\n\tu8\thci;\n\tNDIS_802_11_SSID\tssid;\n\tu8\tnetwork_mode;\t//infra, ad-hoc, auto\n\tu8\tchannel;//ad-hoc support requirement\n\tu8\twireless_mode;//A, B, G, auto\n\tu8 \tscan_mode;//active, passive\n\tu8\tradio_enable;\n\tu8\tpreamble;//long, short, auto\n\tu8\tvrtl_carrier_sense;//Enable, Disable, Auto\n\tu8\tvcs_type;//RTS/CTS, CTS-to-self\n\tu16\trts_thresh;\n\tu16  frag_thresh;\n\tu8\tadhoc_tx_pwr;\n\tu8\tsoft_ap;\n\tu8\tpower_mgnt;\n\tu8\tips_mode;\n\tu8\tsmart_ps;\n\tu8   usb_rxagg_mode;\n\tu8\tlong_retry_lmt;\n\tu8\tshort_retry_lmt;\n\tu16\tbusy_thresh;\n\tu8\tack_policy;\n\tu8\tmp_mode;\n\tu8  mp_dm;\n\tu8\tsoftware_encrypt;\n\tu8\tsoftware_decrypt;\n\t#ifdef CONFIG_TX_EARLY_MODE\n\tu8   early_mode;\n\t#endif\n\tu8\tacm_method;\n\t  //UAPSD\n\tu8\twmm_enable;\n\tu8\tuapsd_enable;\n\tu8\tuapsd_max_sp;\n\tu8\tuapsd_acbk_en;\n\tu8\tuapsd_acbe_en;\n\tu8\tuapsd_acvi_en;\n\tu8\tuapsd_acvo_en;\n\n\tWLAN_BSSID_EX    dev_network;\n\n#ifdef CONFIG_80211N_HT\n\tu8\tht_enable;\n\t// 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160MHz\n\t// 2.4G use bit 0 ~ 3, 5G use bit 4 ~ 7\n\t// 0x21 means enable 2.4G 40MHz & 5G 80MHz\n\tu8\tbw_mode;\n\tu8\tampdu_enable;//for tx\n\tu8 \trx_stbc;\n\tu8\tampdu_amsdu;//A-MPDU Supports A-MSDU is permitted\n\t// Short GI support Bit Map\n\t// BIT0 - 20MHz, 1: support, 0: non-support\n\t// BIT1 - 40MHz, 1: support, 0: non-support\n\t// BIT2 - 80MHz, 1: support, 0: non-support\n\t// BIT3 - 160MHz, 1: support, 0: non-support\n\tu8\tshort_gi;\n\t// BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx\n\tu8\tldpc_cap;\n\t// BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx\n\tu8\tstbc_cap;\n\t// BIT0: Enable VHT Beamformer, BIT1: Enable VHT Beamformee, BIT4: Enable HT Beamformer, BIT5: Enable HT Beamformee\n\tu8\tbeamform_cap;\n\tu8\tbeamformer_rf_num;\n\tu8\tbeamformee_rf_num;\n#endif //CONFIG_80211N_HT\n\n#ifdef CONFIG_80211AC_VHT\n\tu8\tvht_enable; //0:disable, 1:enable, 2:auto\n\tu8\tampdu_factor;\n\tu8\tvht_rate_sel;\n#endif //CONFIG_80211AC_VHT\n\n\tu8\tlowrate_two_xmit;\n\n\tu8\trf_config ;\n\tu8\tlow_power ;\n\n\tu8\twifi_spec;// !turbo_mode\n\tu8\tspecial_rf_path; // 0: 2T2R ,1: only turn on path A 1T1R\n\tu8\tchannel_plan;\n#ifdef CONFIG_BT_COEXIST\n\tu8\tbtcoex;\n\tu8\tbt_iso;\n\tu8\tbt_sco;\n\tu8\tbt_ampdu;\n\ts8\tant_num;\n#endif\n\tBOOLEAN\tbAcceptAddbaReq;\n\n\tu8\tantdiv_cfg;\n\tu8\tantdiv_type;\n\t\n\tu8\tswitch_usb_mode;\n\n\tu8\tusbss_enable;//0:disable,1:enable\n\tu8\thwpdn_mode;//0:disable,1:enable,2:decide by EFUSE config\n\tu8\thwpwrp_detect;//0:disable,1:enable\n\n\tu8\thw_wps_pbc;//0:disable,1:enable\n\n#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\n\tchar\tadaptor_info_caching_file_path[PATH_LENGTH_MAX];\n#endif\n\n#ifdef CONFIG_LAYER2_ROAMING\n\tu8\tmax_roaming_times; // the max number driver will try to roaming\n#endif\n\n#ifdef CONFIG_IOL\n\tu8 fw_iol; //enable iol without other concern\n#endif\n\n#ifdef CONFIG_80211D\n\tu8 enable80211d;\n#endif\n\n\tu8 ifname[16];\n\tu8 if2name[16];\n\n\tu8 notch_filter;\n\n#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\n\tu8 force_ant;//0 normal,1 main,2 aux\n\tu8 force_igi;//0 normal\n#endif\n\n\t/* for pll reference clock selction */\n\tu8 pll_ref_clk_sel;\n\n\t//define for tx power adjust\n\tu8\tRegEnableTxPowerLimit;\n\tu8\tRegEnableTxPowerByRate;\n\tu8\tRegPowerBase;\n\tu8\tRegPwrTblSel;\n\ts8\tTxBBSwing_2G;\n\ts8\tTxBBSwing_5G;\n\tu8\tAmplifierType_2G;\n\tu8\tAmplifierType_5G;\n\tu8\tbEn_RFE;\n\tu8\tRFE_Type;\n\tu8\tGLNA_Type;\t\n\tu8  check_fw_ps;\n\tu8\tRegRfKFreeEnable;\n\t\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tu8\tload_phy_file;\n\tu8\tRegDecryptCustomFile;\n#endif\n\n#ifdef CONFIG_MULTI_VIR_IFACES\n\tu8 ext_iface_num;//primary/secondary iface is excluded\n#endif\n\tu8 qos_opt_enable;\n\n\tu8 hiq_filter;\n\tu8 adaptivity_en;\n\tu8 adaptivity_mode;\n\tu8 adaptivity_dml;\n\tu8 adaptivity_dc_backoff;\n\ts8 adaptivity_th_l2h_ini;\n\ts8 adaptivity_th_edcca_hl_diff;\n\n\tu8 boffefusemask;\n\tBOOLEAN bFileMaskEfuse;\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tu8 acs_mode;\n\tu8 acs_auto_scan;\n#endif\n\tu32\t\treg_rxgain_offset_2g;\n\tu32\t\treg_rxgain_offset_5gl;\n\tu32\t\treg_rxgain_offset_5gm;\n\tu32\t\treg_rxgain_offset_5gh;\n};\n\n//For registry parameters\n#define RGTRY_OFT(field) ((ULONG)FIELD_OFFSET(struct registry_priv,field))\n#define RGTRY_SZ(field)   sizeof(((struct registry_priv*) 0)->field)\n\n#define GetRegAmplifierType2G(_Adapter)\t(_Adapter->registrypriv.AmplifierType_2G)\n#define GetRegAmplifierType5G(_Adapter)\t(_Adapter->registrypriv.AmplifierType_5G)\n\n#define GetRegTxBBSwing_2G(_Adapter)\t(_Adapter->registrypriv.TxBBSwing_2G)\n#define GetRegTxBBSwing_5G(_Adapter)\t(_Adapter->registrypriv.TxBBSwing_5G)\n\n#define GetRegbENRFEType(_Adapter)\t(_Adapter->registrypriv.bEn_RFE)\n#define GetRegRFEType(_Adapter)\t(_Adapter->registrypriv.RFE_Type)\n#define GetRegGLNAType(_Adapter)\t(_Adapter->registrypriv.GLNA_Type)\n\n#define BSSID_OFT(field) ((ULONG)FIELD_OFFSET(WLAN_BSSID_EX,field))\n#define BSSID_SZ(field)   sizeof(((PWLAN_BSSID_EX) 0)->field)\n\n#define REGSTY_BW_2G(regsty) ((regsty)->bw_mode & 0x0F)\n#define REGSTY_BW_5G(regsty) (((regsty)->bw_mode) >> 4)\n#define REGSTY_IS_BW_2G_SUPPORT(regsty, bw) (REGSTY_BW_2G((regsty)) >= (bw))\n#define REGSTY_IS_BW_5G_SUPPORT(regsty, bw) (REGSTY_BW_5G((regsty)) >= (bw))\n\n#ifdef CONFIG_SDIO_HCI\n#include <drv_types_sdio.h>\n#define INTF_DATA SDIO_DATA\n#elif defined(CONFIG_GSPI_HCI)\n#include <drv_types_gspi.h>\n#define INTF_DATA GSPI_DATA\n#elif defined(CONFIG_PCI_HCI)\n#include <drv_types_pci.h>\n#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n#define is_primary_adapter(adapter) (adapter->adapter_type == PRIMARY_ADAPTER)\n#define is_vir_adapter(adapter) (adapter->adapter_type == MAX_ADAPTER)\n#define get_iface_type(adapter) (adapter->iface_type)\n#else\n#define is_primary_adapter(adapter) (1)\n#define is_vir_adapter(adapter) (0)\n#define get_iface_type(adapter) (IFACE_PORT0)\n#endif\n#define GET_PRIMARY_ADAPTER(padapter) (((_adapter *)padapter)->dvobj->padapters[IFACE_ID0])\n#define GET_IFACE_NUMS(padapter) (((_adapter *)padapter)->dvobj->iface_nums)\n#define GET_ADAPTER(padapter, iface_id) (((_adapter *)padapter)->dvobj->padapters[iface_id])\n\n#define GetDefaultAdapter(padapter)\tpadapter\n\nenum _IFACE_ID {\n\tIFACE_ID0, //maping to PRIMARY_ADAPTER\n\tIFACE_ID1, //maping to SECONDARY_ADAPTER\n\tIFACE_ID2,\n\tIFACE_ID3,\n\tIFACE_ID_MAX,\n};\n\n#ifdef CONFIG_DBG_COUNTER\n\nstruct rx_logs {\n\tu32 intf_rx;\n\tu32 intf_rx_err_recvframe;\n\tu32 intf_rx_err_skb;\n\tu32 intf_rx_report;\n\tu32 core_rx;\n\tu32 core_rx_pre;\n\tu32 core_rx_pre_ver_err;\n\tu32 core_rx_pre_mgmt;\n\tu32 core_rx_pre_mgmt_err_80211w;\n\tu32 core_rx_pre_mgmt_err;\n\tu32 core_rx_pre_ctrl;\n\tu32 core_rx_pre_ctrl_err;\n\tu32 core_rx_pre_data;\n\tu32 core_rx_pre_data_wapi_seq_err;\n\tu32 core_rx_pre_data_wapi_key_err;\n\tu32 core_rx_pre_data_handled;\n\tu32 core_rx_pre_data_err;\n\tu32 core_rx_pre_data_unknown;\n\tu32 core_rx_pre_unknown;\n\tu32 core_rx_enqueue;\n\tu32 core_rx_dequeue;\n\tu32 core_rx_post;\n\tu32 core_rx_post_decrypt;\n\tu32 core_rx_post_decrypt_wep;\n\tu32 core_rx_post_decrypt_tkip;\n\tu32 core_rx_post_decrypt_aes;\n\tu32 core_rx_post_decrypt_wapi;\n\tu32 core_rx_post_decrypt_hw;\n\tu32 core_rx_post_decrypt_unknown;\n\tu32 core_rx_post_decrypt_err;\n\tu32 core_rx_post_defrag_err;\n\tu32 core_rx_post_portctrl_err;\n\tu32 core_rx_post_indicate;\n\tu32 core_rx_post_indicate_in_oder;\n\tu32 core_rx_post_indicate_reoder;\n\tu32 core_rx_post_indicate_err;\n\tu32 os_indicate;\n\tu32 os_indicate_ap_mcast;\n\tu32 os_indicate_ap_forward;\n\tu32 os_indicate_ap_self;\n\tu32 os_indicate_err;\n\tu32 os_netif_ok;\n\tu32 os_netif_err;\n};\n\nstruct tx_logs {\n\tu32 os_tx;\n\tu32 os_tx_err_up;\n\tu32 os_tx_err_xmit;\n\tu32 os_tx_m2u;\n\tu32 os_tx_m2u_ignore_fw_linked;\n\tu32 os_tx_m2u_ignore_self;\n\tu32 os_tx_m2u_entry;\n\tu32 os_tx_m2u_entry_err_xmit;\n\tu32 os_tx_m2u_entry_err_skb;\n\tu32 os_tx_m2u_stop;\n\tu32 core_tx;\n\tu32 core_tx_err_pxmitframe;\n\tu32 core_tx_err_brtx;\n\tu32 core_tx_upd_attrib;\n\tu32 core_tx_upd_attrib_adhoc;\n\tu32 core_tx_upd_attrib_sta;\n\tu32 core_tx_upd_attrib_ap;\n\tu32 core_tx_upd_attrib_unknown;\n\tu32 core_tx_upd_attrib_dhcp;\n\tu32 core_tx_upd_attrib_icmp;\n\tu32 core_tx_upd_attrib_active;\n\tu32 core_tx_upd_attrib_err_ucast_sta;\n\tu32 core_tx_upd_attrib_err_ucast_ap_link;\n\tu32 core_tx_upd_attrib_err_sta;\n\tu32 core_tx_upd_attrib_err_link;\n\tu32 core_tx_upd_attrib_err_sec;\n\tu32 core_tx_ap_enqueue_warn_fwstate;\n\tu32 core_tx_ap_enqueue_warn_sta;\n\tu32 core_tx_ap_enqueue_warn_nosta;\n\tu32 core_tx_ap_enqueue_warn_link;\n\tu32 core_tx_ap_enqueue_warn_trigger;\n\tu32 core_tx_ap_enqueue_mcast;\n\tu32 core_tx_ap_enqueue_ucast;\n\tu32 core_tx_ap_enqueue;\n\tu32 intf_tx;\n\tu32 intf_tx_pending_ac;\n\tu32 intf_tx_pending_fw_under_survey;\n\tu32 intf_tx_pending_fw_under_linking;\n\tu32 intf_tx_pending_xmitbuf;\n\tu32 intf_tx_enqueue;\n\tu32 core_tx_enqueue;\n\tu32 core_tx_enqueue_class;\n\tu32 core_tx_enqueue_class_err_sta;\n\tu32 core_tx_enqueue_class_err_nosta;\n\tu32 core_tx_enqueue_class_err_fwlink;\n\tu32 intf_tx_direct;\n\tu32 intf_tx_direct_err_coalesce;\n\tu32 intf_tx_dequeue;\n\tu32 intf_tx_dequeue_err_coalesce;\n\tu32 intf_tx_dump_xframe;\n\tu32 intf_tx_dump_xframe_err_txdesc;\n\tu32 intf_tx_dump_xframe_err_port;\n};\n\nstruct int_logs {\n\tu32 all;\n\tu32 err;\n\tu32 tbdok;\n\tu32 tbder;\n\tu32 bcnderr;\n\tu32 bcndma;\n\tu32 bcndma_e;\n\tu32 rx;\n\tu32 rx_rdu;\n\tu32 rx_fovw;\n\tu32 txfovw;\n\tu32 mgntok;\n\tu32 highdok;\n\tu32 bkdok;\n\tu32 bedok;\n\tu32 vidok;\n\tu32 vodok;\n};\n\n#endif // CONFIG_DBG_COUNTER\n\nstruct debug_priv {\n\tu32 dbg_sdio_free_irq_error_cnt;\n\tu32 dbg_sdio_alloc_irq_error_cnt;\n\tu32 dbg_sdio_free_irq_cnt;\n\tu32 dbg_sdio_alloc_irq_cnt;\n\tu32 dbg_sdio_deinit_error_cnt;\n\tu32 dbg_sdio_init_error_cnt;\n\tu32 dbg_suspend_error_cnt;\n\tu32 dbg_suspend_cnt;\n\tu32 dbg_resume_cnt;\n\tu32 dbg_resume_error_cnt;\n\tu32 dbg_deinit_fail_cnt;\n\tu32 dbg_carddisable_cnt;\n\tu32 dbg_carddisable_error_cnt;\n\tu32 dbg_ps_insuspend_cnt;\n\tu32\tdbg_dev_unload_inIPS_cnt;\n\tu32 dbg_wow_leave_ps_fail_cnt;\n\tu32 dbg_scan_pwr_state_cnt;\n\tu32 dbg_downloadfw_pwr_state_cnt;\n\tu32 dbg_fw_read_ps_state_fail_cnt;\n\tu32 dbg_leave_ips_fail_cnt;\n\tu32 dbg_leave_lps_fail_cnt;\n\tu32 dbg_h2c_leave32k_fail_cnt;\n\tu32 dbg_diswow_dload_fw_fail_cnt;\n\tu32 dbg_enwow_dload_fw_fail_cnt;\n\tu32 dbg_ips_drvopen_fail_cnt;\n\tu32 dbg_poll_fail_cnt;\n\tu32 dbg_rpwm_toogle_cnt;\n\tu32 dbg_rpwm_timeout_fail_cnt;\n\tu32 dbg_sreset_cnt;\n\tu64 dbg_rx_fifo_last_overflow;\n\tu64 dbg_rx_fifo_curr_overflow;\n\tu64 dbg_rx_fifo_diff_overflow;\n\tu64 dbg_rx_ampdu_drop_count;\n\tu64 dbg_rx_ampdu_forced_indicate_count;\n\tu64 dbg_rx_ampdu_loss_count;\n\tu64 dbg_rx_dup_mgt_frame_drop_count;\n\tu64 dbg_rx_ampdu_window_shift_cnt;\n\tu64 dbg_rx_conflic_mac_addr_cnt;\n};\n\nstruct rtw_traffic_statistics {\n\t// tx statistics\n\tu64\ttx_bytes;\n\tu64\ttx_pkts;\n\tu64\ttx_drop;\n\tu64\tcur_tx_bytes;\n\tu64\tlast_tx_bytes;\n\tu32\tcur_tx_tp; // Tx throughput in MBps.\n\n\t// rx statistics\n\tu64\trx_bytes;\n\tu64\trx_pkts;\n\tu64\trx_drop;\n\tu64\tcur_rx_bytes;\n\tu64\tlast_rx_bytes;\n\tu32\tcur_rx_tp; // Rx throughput in MBps.\n};\n\n#define SEC_CAP_CHK_BMC\tBIT0\n\n#define SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH\tBIT0\n\nstruct sec_cam_bmp {\n\tu32 m0;\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 32)\n\tu32 m1;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 64)\n\tu32 m2;\n#endif\n#if (SEC_CAM_ENT_NUM_SW_LIMIT > 96)\n\tu32 m3;\n#endif\n};\n\nstruct cam_ctl_t {\n\t_lock lock;\n\n\tu8 sec_cap;\n\tu32 flags;\n\n\tu8 num;\n\tstruct sec_cam_bmp used;\n\n\t_mutex sec_cam_access_mutex;\n};\n\nstruct sec_cam_ent {\n\tu16 ctrl;\n\tu8 mac[ETH_ALEN];\n\tu8 key[16];\n};\n\n#define KEY_FMT \"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\"\n#define KEY_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5], \\\n\t((u8*)(x))[6],((u8*)(x))[7],((u8*)(x))[8],((u8*)(x))[9],((u8*)(x))[10],((u8*)(x))[11], \\\n\t((u8*)(x))[12],((u8*)(x))[13],((u8*)(x))[14],((u8*)(x))[15]\n\nstruct macid_bmp {\n\tu32 m0;\n#if (MACID_NUM_SW_LIMIT > 32)\n\tu32 m1;\n#endif\n#if (MACID_NUM_SW_LIMIT > 64)\n\tu32 m2;\n#endif\n#if (MACID_NUM_SW_LIMIT > 96)\n\tu32 m3;\n#endif\n};\n\nstruct macid_ctl_t {\n\t_lock lock;\n\tu8 num;\n\tstruct macid_bmp used;\n\tstruct macid_bmp bmc;\n\tstruct macid_bmp if_g[IFACE_ID_MAX];\n\tstruct macid_bmp ch_g[2]; /* 2 ch concurrency */\n};\n\nstruct rf_ctl_t {\n\t#ifdef CONFIG_DFS_MASTER\n\tbool radar_detect_by_sta_link;\n\tbool pre_radar_detect_by_sta_link;\n\tbool dfs_master_enabled;\n\n\tu8 radar_detect_ch;\n\tu8 radar_detect_bw;\n\tu8 radar_detect_offset;\n\tu8 pre_radar_detect_ch;\n\tu8 pre_radar_detect_bw;\n\tu8 pre_radar_detect_offset;\n\n\tu32 cac_end_time;\n\n\tu8 dbg_dfs_master_fake_radar_detect_cnt;\n\tu8 dbg_dfs_master_radar_detect_trigger_non;\n\tu8 dbg_dfs_master_choose_dfs_ch_first;\n\t#endif\n};\n\n#define RTW_CAC_STOPPED 0\n#define IS_UNDER_CAC(rfctl) ((rfctl)->cac_end_time > rtw_get_current_time())\n#define IS_CAC_STOPPED(rfctl) ((rfctl)->cac_end_time == RTW_CAC_STOPPED)\n\nstruct dvobj_priv\n{\n\t/*-------- below is common data --------*/\t\n\tu8\tchip_type;\n\tu8\tHardwareType;\n\tu8\tinterface_type;/*USB,SDIO,SPI,PCI*/\n\n\tATOMIC_T\tbSurpriseRemoved;\n\tATOMIC_T\tbDriverStopped;\n\n\ts32\tprocessing_dev_remove;\n\n\tstruct debug_priv drv_dbg;\n\n\t_mutex hw_init_mutex;\n\t_mutex h2c_fwcmd_mutex;\n\t_mutex setch_mutex;\n\t_mutex setbw_mutex;\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\t_mutex sd_indirect_access_mutex;\n#endif\n\n\tunsigned char\toper_channel; //saved channel info when call set_channel_bw\n\tunsigned char\toper_bwmode;\n\tunsigned char\toper_ch_offset;//PRIME_CHNL_OFFSET\n\tu32 on_oper_ch_time;\n\n\t//extend to support mulitu interface\n\t/*padapters[IFACE_ID0] == if1 - PRIMARY_ADAPTER*/\n\t/*padapters[IFACE_ID1] == if2 - SECONDARY_ADAPTER*/\n\t_adapter *padapters[IFACE_ID_MAX];\n\tu8 iface_nums; // total number of ifaces used runtime\n\n\tstruct macid_ctl_t macid_ctl;\n\n\tstruct cam_ctl_t cam_ctl;\n\tstruct sec_cam_ent cam_cache[SEC_CAM_ENT_NUM_SW_LIMIT];\n\n\tstruct rf_ctl_t rf_ctl;\n\n\t//For 92D, DMDP have 2 interface.\n\tu8\tInterfaceNumber;\n\tu8\tNumInterfaces;\n\n\t//In /Out Pipe information\n\tint\tRtInPipe[2];\n\tint\tRtOutPipe[4];\n\tu8\tQueue2Pipe[HW_QUEUE_ENTRY];//for out pipe mapping\n\n\tu8\tirq_alloc;\n\tATOMIC_T continual_io_error;\n\n\tATOMIC_T disable_func;\n\n\tstruct pwrctrl_priv pwrctl_priv;\n\n\tstruct rtw_traffic_statistics\ttraffic_stat;\n\n#if defined(CONFIG_IOCTL_CFG80211) && defined(RTW_SINGLE_WIPHY)\n\tstruct wiphy *wiphy;\n#endif\n\n/*-------- below is for SDIO INTERFACE --------*/\n\n#ifdef INTF_DATA\n\tINTF_DATA intf_data;\n#endif\n\n/*-------- below is for USB INTERFACE --------*/\n\n#ifdef CONFIG_USB_HCI\n\n\tu8\tusb_speed; // 1.1, 2.0 or 3.0\n\tu8\tnr_endpoint;\n\tu8\tRtNumInPipes;\n\tu8\tRtNumOutPipes;\n\tint\tep_num[6]; //endpoint number\n\n\tint\tRegUsbSS;\n\n\t_sema\tusb_suspend_sema;\n\n#ifdef CONFIG_USB_VENDOR_REQ_MUTEX\n\t_mutex  usb_vendor_req_mutex;\n#endif\n\n#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC\n\tu8 * usb_alloc_vendor_req_buf;\n\tu8 * usb_vendor_req_buf;\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\t//related device objects\n\tPDEVICE_OBJECT\tpphysdevobj;//pPhysDevObj;\n\tPDEVICE_OBJECT\tpfuncdevobj;//pFuncDevObj;\n\tPDEVICE_OBJECT\tpnextdevobj;//pNextDevObj;\n\n\tu8\tnextdevstacksz;//unsigned char NextDeviceStackSize;\t//= (CHAR)CEdevice->pUsbDevObj->StackSize + 1;\n\n\t//urb for control diescriptor request\n\n#ifdef PLATFORM_OS_XP\n\tstruct _URB_CONTROL_DESCRIPTOR_REQUEST descriptor_urb;\n\tPUSB_CONFIGURATION_DESCRIPTOR\tpconfig_descriptor;//UsbConfigurationDescriptor;\n#endif\n\n#ifdef PLATFORM_OS_CE\n\tWCHAR\t\t\tactive_path[MAX_ACTIVE_REG_PATH];\t// adapter regpath\n\tUSB_EXTENSION\tusb_extension;\n\n\t_nic_hdl\t\tpipehdls_r8192c[0x10];\n#endif\n\n\tu32\tconfig_descriptor_len;//ULONG UsbConfigurationDescriptorLength;\n#endif//PLATFORM_WINDOWS\n\n#ifdef PLATFORM_LINUX\n\tstruct usb_interface *pusbintf;\n\tstruct usb_device *pusbdev;\n#endif//PLATFORM_LINUX\n\n#ifdef PLATFORM_FREEBSD\n\tstruct usb_interface *pusbintf;\n\tstruct usb_device *pusbdev;\n#endif//PLATFORM_FREEBSD\n\t\n#endif//CONFIG_USB_HCI\n\n/*-------- below is for PCIE INTERFACE --------*/\n\n#ifdef CONFIG_PCI_HCI\n\n#ifdef PLATFORM_LINUX\n\tstruct pci_dev *ppcidev;\n\n\t//PCI MEM map\n\tunsigned long\tpci_mem_end;\t/* shared mem end\t*/\n\tunsigned long\tpci_mem_start;\t/* shared mem start\t*/\n\n\t//PCI IO map\n\tunsigned long\tpci_base_addr;\t/* device I/O address\t*/\n\n\t//PciBridge\n\tstruct pci_priv\tpcipriv;\n\n\tunsigned int irq; /* get from pci_dev.irq, store to net_device.irq */\n\tu16\tirqline;\n\tu8\tirq_enabled;\n\tRT_ISR_CONTENT\tisr_content;\n\t_lock\tirq_th_lock;\n\n\t//ASPM\n\tu8\tconst_pci_aspm;\n\tu8\tconst_amdpci_aspm;\n\tu8\tconst_hwsw_rfoff_d3;\n\tu8\tconst_support_pciaspm;\n\t// pci-e bridge */\n\tu8 \tconst_hostpci_aspm_setting;\n\t// pci-e device */\n\tu8 \tconst_devicepci_aspm_setting;\n\tu8 \tb_support_aspm; // If it supports ASPM, Offset[560h] = 0x40, otherwise Offset[560h] = 0x00.\n\tu8\tb_support_backdoor;\n\tu8\tbdma64;\n#endif//PLATFORM_LINUX\n\n#endif//CONFIG_PCI_HCI\n};\n\n#define dvobj_to_pwrctl(dvobj) (&(dvobj->pwrctl_priv))\n#define pwrctl_to_dvobj(pwrctl) container_of(pwrctl, struct dvobj_priv, pwrctl_priv)\n#define dvobj_to_macidctl(dvobj) (&(dvobj->macid_ctl))\n#define dvobj_to_regsty(dvobj) (&(dvobj->padapters[IFACE_ID0]->registrypriv))\n#if defined(CONFIG_IOCTL_CFG80211) && defined(RTW_SINGLE_WIPHY)\n#define dvobj_to_wiphy(dvobj) ((dvobj)->wiphy)\n#endif\n#define dvobj_to_rfctl(dvobj) (&(dvobj->rf_ctl))\n#define rfctl_to_dvobj(rfctl) container_of((rfctl), struct dvobj_priv, rf_ctl)\n\n#ifdef PLATFORM_LINUX\nstatic struct device *dvobj_to_dev(struct dvobj_priv *dvobj)\n{\n\t/* todo: get interface type from dvobj and the return the dev accordingly */\n#ifdef RTW_DVOBJ_CHIP_HW_TYPE\n#endif\n\n#ifdef CONFIG_USB_HCI\n\treturn &dvobj->pusbintf->dev;\n#endif\n#ifdef CONFIG_SDIO_HCI\n\treturn &dvobj->intf_data.func->dev;\n#endif\n#ifdef CONFIG_GSPI_HCI\n\treturn &dvobj->intf_data.func->dev;\n#endif\n#ifdef CONFIG_PCI_HCI\n\treturn &dvobj->ppcidev->dev;\n#endif\n}\n#endif\n\n_adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj);\n\nenum _IFACE_TYPE {\n\tIFACE_PORT0, //mapping to port0 for C/D series chips\n\tIFACE_PORT1, //mapping to port1 for C/D series chip\n\tMAX_IFACE_PORT,\n};\n\nenum _ADAPTER_TYPE {\n\tPRIMARY_ADAPTER,\n\tSECONDARY_ADAPTER,\n\tMAX_ADAPTER = 0xFF,\n};\n\ntypedef enum _DRIVER_STATE{\n\tDRIVER_NORMAL = 0,\n\tDRIVER_DISAPPEAR = 1,\n\tDRIVER_REPLACE_DONGLE = 2,\n}DRIVER_STATE;\n\n#ifdef CONFIG_INTEL_PROXIM\nstruct proxim {\n\tbool proxim_support;\n\tbool proxim_on;\n\n\tvoid *proximity_priv;\n\tint (*proxim_rx)(_adapter *padapter,\n\t\tunion recv_frame *precv_frame);\n\tu8\t(*proxim_get_var)(_adapter* padapter, u8 type);\n};\n#endif\t//CONFIG_INTEL_PROXIM\n\n#ifdef CONFIG_MAC_LOOPBACK_DRIVER\ntypedef struct loopbackdata\n{\n\t_sema\tsema;\n\t_thread_hdl_ lbkthread;\n\tu8 bstop;\n\tu32 cnt;\n\tu16 size;\n\tu16 txsize;\n\tu8 txbuf[0x8000];\n\tu16 rxsize;\n\tu8 rxbuf[0x8000];\n\tu8 msg[100];\n\n}LOOPBACKDATA, *PLOOPBACKDATA;\n#endif\n\nstruct _ADAPTER{\n\tint\tDriverState;// for disable driver using module, use dongle to replace module.\n\tint\tpid[3];//process id from UI, 0:wps, 1:hostapd, 2:dhcpcd\n\tint\tbDongle;//build-in module or external dongle\n\n\tstruct dvobj_priv *dvobj;\n\tstruct\tmlme_priv mlmepriv;\n\tstruct\tmlme_ext_priv mlmeextpriv;\n\tstruct\tcmd_priv\tcmdpriv;\n\tstruct\tevt_priv\tevtpriv;\n\t//struct\tio_queue\t*pio_queue;\n\tstruct \tio_priv\tiopriv;\n\tstruct\txmit_priv\txmitpriv;\n\tstruct\trecv_priv\trecvpriv;\n\tstruct\tsta_priv\tstapriv;\n\tstruct\tsecurity_priv\tsecuritypriv;\n\t_lock   security_key_mutex; // add for CONFIG_IEEE80211W, none 11w also can use\n\tstruct\tregistry_priv\tregistrypriv;\t\n\n\tstruct\tled_priv\tledpriv;\n\n#ifdef CONFIG_MP_INCLUDED\n       struct\tmp_priv\tmppriv;\n#endif\n\n#ifdef CONFIG_DRVEXT_MODULE\n\tstruct\tdrvext_priv\tdrvextpriv;\n#endif\n\n#ifdef CONFIG_AP_MODE\n\tstruct\thostapd_priv\t*phostapdpriv;\n#endif\n\n#ifdef CONFIG_IOCTL_CFG80211\n#ifdef CONFIG_P2P\n\tstruct cfg80211_wifidirect_info\tcfg80211_wdinfo;\n#endif //CONFIG_P2P\n#endif //CONFIG_IOCTL_CFG80211\n\tu32\tsetband;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\twdinfo;\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_TDLS\n\tstruct tdls_info\ttdlsinfo;\n#endif //CONFIG_TDLS\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tu8\tWapiSupport;\n\tRT_WAPI_T\twapiInfo;\n#endif\n\n\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info wfd_info;\n#endif //CONFIG_WFD\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tstruct bt_coex_info coex_info;\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\t\n\tERROR_CODE\t\tLastError; /* <20130613, Kordan> Only the functions associated with MP records the error code by now. */\n\t\n\tPVOID\t\t\tHalData;\n\tu32 hal_data_sz;\n\tstruct hal_ops\tHalFunc;\n\n\tu32\tIsrContent;\n\tu32\tImrContent;\n\n\tu8\tEepromAddressSize;\n\tu8\tbDriverIsGoingToUnload;\n\tu8\tinit_adpt_in_progress;\n\tu8\tbHaltInProgress;\n#ifdef CONFIG_GPIO_API\t\n\tu8\tpre_gpio_pin;\n\tstruct gpio_int_priv {\n\t\tu8 interrupt_mode;\n\t\tu8 interrupt_enable_mask;\n\t\tvoid (*callback[8])(u8 level);\n\t}gpiointpriv;\n#endif\t\n\t_thread_hdl_ cmdThread;\n\t_thread_hdl_ evtThread;\n\t_thread_hdl_ xmitThread;\n\t_thread_hdl_ recvThread;\n\n#ifndef PLATFORM_LINUX\n\tNDIS_STATUS (*dvobj_init)(struct dvobj_priv *dvobj);\n\tvoid (*dvobj_deinit)(struct dvobj_priv *dvobj);\n#endif\n\n \tu32 (*intf_init)(struct dvobj_priv *dvobj);\n\tvoid (*intf_deinit)(struct dvobj_priv *dvobj);\n\tint (*intf_alloc_irq)(struct dvobj_priv *dvobj);\n\tvoid (*intf_free_irq)(struct dvobj_priv *dvobj);\n\t\n\n\tvoid (*intf_start)(_adapter * adapter);\n\tvoid (*intf_stop)(_adapter * adapter);\n\n#ifdef PLATFORM_WINDOWS\n\t_nic_hdl\t\thndis_adapter;//hNdisAdapter(NDISMiniportAdapterHandle);\n\t_nic_hdl\t\thndis_config;//hNdisConfiguration;\n\tNDIS_STRING fw_img;\n\n\tu32\tNdisPacketFilter;\n\tu8\tMCList[MAX_MCAST_LIST_NUM][6];\n\tu32\tMCAddrCount;\n#endif //end of PLATFORM_WINDOWS\n\n\n#ifdef PLATFORM_LINUX\n\t_nic_hdl pnetdev;\n\tchar old_ifname[IFNAMSIZ];\n\n\t// used by rtw_rereg_nd_name related function\n\tstruct rereg_nd_name_data {\n\t\t_nic_hdl old_pnetdev;\n\t\tchar old_ifname[IFNAMSIZ];\n\t\tu8 old_ips_mode;\n\t\tu8 old_bRegUseLed;\n\t} rereg_nd_name_priv;\n\n\tu8 ndev_unregistering;\n\tint bup;\n\tstruct net_device_stats stats;\n\tstruct iw_statistics iwstats;\n\tstruct proc_dir_entry *dir_dev;// for proc directory\n\tstruct proc_dir_entry *dir_odm;\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tstruct wireless_dev *rtw_wdev;\n\tstruct rtw_wdev_priv wdev_data;\n\n\t#if !defined(RTW_SINGLE_WIPHY)\n\tstruct wiphy *wiphy;\n\t#endif\n\n#endif /* CONFIG_IOCTL_CFG80211 */\n\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\t_nic_hdl pifp;\n\tint bup;\n\t_lock glock;\n#endif //PLATFORM_FREEBSD\n\tu8 mac_addr[ETH_ALEN];\n\tint net_closed;\n\t\n\tu8 netif_up;\n\n\tu8 bFWReady;\n\tu8 bBTFWReady;\n\tu8 bLinkInfoDump;\n\tu8 bRxRSSIDisplay;\n\t//\tAdded by Albert 2012/10/26\n\t//\tThe driver will show up the desired channel number when this flag is 1.\n\tu8 bNotifyChannelChange;\n#ifdef CONFIG_P2P\n\t//\tAdded by Albert 2012/12/06\n\t//\tThe driver will show the current P2P status when the upper application reads it.\n\tu8 bShowGetP2PState;\n#endif\n#ifdef CONFIG_AUTOSUSPEND\n\tu8\tbDisableAutosuspend;\n#endif\n\n\t//pbuddy_adapter is used only in  two inteface case, (iface_nums=2 in struct dvobj_priv)\n\t//PRIMARY_ADAPTER's buddy is SECONDARY_ADAPTER\n\t//SECONDARY_ADAPTER's buddy is PRIMARY_ADAPTER\n\t//for iface_id > SECONDARY_ADAPTER(IFACE_ID1), refer to padapters[iface_id]  in struct dvobj_priv\n\t//and their pbuddy_adapter is PRIMARY_ADAPTER.\n\t//for PRIMARY_ADAPTER(IFACE_ID0) can directly refer to if1 in struct dvobj_priv\n\t_adapter *pbuddy_adapter;\n\n#if defined(CONFIG_CONCURRENT_MODE)\n\tu8 isprimary; //is primary adapter or not\n\t//notes:\n\t// if isprimary is true, the adapter_type value is 0, iface_id is IFACE_ID0 for PRIMARY_ADAPTER\n\t// if isprimary is false, the adapter_type value is 1, iface_id is IFACE_ID1 for SECONDARY_ADAPTER\n\t// refer to iface_id if iface_nums>2 and isprimary is false and the adapter_type value is 0xff.\n\tu8 adapter_type;//used only in  two inteface case(PRIMARY_ADAPTER and SECONDARY_ADAPTER) .\n\tu8 iface_type; //interface port type, it depends on HW port\n#endif //CONFIG_CONCURRENT_MODE \n\n\t//extend to support multi interface\n       //IFACE_ID0 is equals to PRIMARY_ADAPTER\n       //IFACE_ID1 is equals to SECONDARY_ADAPTER\n\tu8 iface_id;\n\n#ifdef CONFIG_BR_EXT\n\t_lock\t\t\t\t\tbr_ext_lock;\n\t//unsigned int\t\t\tmacclone_completed;\n\tstruct nat25_network_db_entry\t*nethash[NAT25_HASH_SIZE];\n\tint\t\t\t\tpppoe_connection_in_progress;\n\tunsigned char\t\t\tpppoe_addr[MACADDRLEN];\n\tunsigned char\t\t\tscdb_mac[MACADDRLEN];\n\tunsigned char\t\t\tscdb_ip[4];\n\tstruct nat25_network_db_entry\t*scdb_entry;\n\tunsigned char\t\t\tbr_mac[MACADDRLEN];\n\tunsigned char\t\t\tbr_ip[4];\n\n\tstruct br_ext_info\t\tethBrExtInfo;\n#endif\t// CONFIG_BR_EXT\n\n#ifdef CONFIG_INTEL_PROXIM\n\t/* intel Proximity, should be alloc mem\n\t * in intel Proximity module and can only\n\t * be used in intel Proximity mode */\n\tstruct proxim proximity;\n#endif\t//CONFIG_INTEL_PROXIM\n\n#ifdef CONFIG_MAC_LOOPBACK_DRIVER\n\tPLOOPBACKDATA ploopback;\n#endif\n\n\t//for debug purpose\n\tu8 fix_rate;\n\tu8 data_fb; /* data rate fallback, valid only when fix_rate is not 0xff */\n\tu8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense for tx\n\tu8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.\n\tu8 driver_ampdu_spacing;//driver control AMPDU Density for peer sta's rx\n\tu8 driver_rx_ampdu_factor;//0xff: disable drv ctrl, 0:8k, 1:16k, 2:32k, 3:64k;\n\tu8 driver_rx_ampdu_spacing;  //driver control Rx AMPDU Density \n\tu8 fix_rx_ampdu_accept;\n\tu8 fix_rx_ampdu_size; /* 0~127, TODO:consider each sta and each TID */\n\tunsigned char     in_cta_test;\n#ifdef DBG_RX_COUNTER_DUMP\t\t\n\tu8 dump_rx_cnt_mode;/*BIT0:drv,BIT1:mac,BIT2:phy*/\n\tu32 drv_rx_cnt_ok;\n\tu32 drv_rx_cnt_crcerror;\n\tu32 drv_rx_cnt_drop;\n#endif\n\n#ifdef CONFIG_DBG_COUNTER\t\n\tstruct rx_logs rx_logs;\n\tstruct tx_logs tx_logs;\n\tstruct int_logs int_logs;\n#endif\n};\n\n#define adapter_to_dvobj(adapter) ((adapter)->dvobj)\n#define adapter_to_regsty(adapter) dvobj_to_regsty(adapter_to_dvobj((adapter)))\n#define adapter_to_pwrctl(adapter) dvobj_to_pwrctl(adapter_to_dvobj((adapter)))\n#define adapter_wdev_data(adapter) (&((adapter)->wdev_data))\n#if defined(RTW_SINGLE_WIPHY)\n#define adapter_to_wiphy(adapter) dvobj_to_wiphy(adapter_to_dvobj(adapter))\n#else\n#define adapter_to_wiphy(adapter) ((adapter)->wiphy)\n#endif\n\n#define adapter_to_rfctl(adapter) dvobj_to_rfctl(adapter_to_dvobj((adapter)))\n\n#define adapter_mac_addr(adapter) (adapter->mac_addr)\n\n#define rtw_get_chip_type(adapter) (((PADAPTER)adapter)->dvobj->chip_type)\n#define rtw_get_hw_type(adapter) (((PADAPTER)adapter)->dvobj->HardwareType)\n#define rtw_get_intf_type(adapter) (((PADAPTER)adapter)->dvobj->interface_type)\n\nstatic inline void rtw_set_surprise_removed(_adapter *padapter)\n{\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->bSurpriseRemoved, _TRUE);\n}\nstatic inline void rtw_clr_surprise_removed(_adapter *padapter)\n{\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->bSurpriseRemoved, _FALSE);\n}\nstatic inline void rtw_set_drv_stopped(_adapter *padapter)\n{\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->bDriverStopped, _TRUE);\n}\nstatic inline void rtw_clr_drv_stopped(_adapter *padapter)\n{\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->bDriverStopped, _FALSE);\n}\n#define rtw_is_surprise_removed(padapter)\t(ATOMIC_READ(&adapter_to_dvobj(padapter)->bSurpriseRemoved) == _TRUE)\n#define rtw_is_drv_stopped(padapter)\t\t(ATOMIC_READ(&adapter_to_dvobj(padapter)->bDriverStopped) == _TRUE)\n\n//\n// Function disabled.\n//\n#define DF_TX_BIT\t\tBIT0\t\t\t/*write_port_cancel*/\n#define DF_RX_BIT\t\tBIT1\t\t\t/*read_port_cancel*/\n#define DF_IO_BIT\t\tBIT2\n\n//#define RTW_DISABLE_FUNC(padapter, func) (ATOMIC_ADD(&adapter_to_dvobj(padapter)->disable_func, (func)))\n//#define RTW_ENABLE_FUNC(padapter, func) (ATOMIC_SUB(&adapter_to_dvobj(padapter)->disable_func, (func)))\n__inline static void RTW_DISABLE_FUNC(_adapter*padapter, int func_bit)\n{\n\tint\tdf = ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func);\n\tdf |= func_bit;\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->disable_func, df);\n}\n\n__inline static void RTW_ENABLE_FUNC(_adapter*padapter, int func_bit)\n{\n\tint\tdf = ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func);\n\tdf &= ~(func_bit);\n\tATOMIC_SET(&adapter_to_dvobj(padapter)->disable_func, df);\n}\n\n#define RTW_CANNOT_RUN(padapter) \\\n\t\t\t(rtw_is_surprise_removed(padapter) || \\\n\t\t\t\trtw_is_drv_stopped(padapter))\n\n#define RTW_IS_FUNC_DISABLED(padapter, func_bit) (ATOMIC_READ(&adapter_to_dvobj(padapter)->disable_func) & (func_bit))\n\n#define RTW_CANNOT_IO(padapter) \\\n\t\t\t(rtw_is_surprise_removed(padapter) || \\\n\t\t\t\tRTW_IS_FUNC_DISABLED((padapter), DF_IO_BIT))\n\n#define RTW_CANNOT_RX(padapter) \\\n\t\t\t(RTW_CANNOT_RUN(padapter) || \\\n\t\t\t RTW_IS_FUNC_DISABLED((padapter), DF_RX_BIT))\n\n#define RTW_CANNOT_TX(padapter) \\\n\t\t\t(RTW_CANNOT_RUN(padapter) || \\\n\t\t\t RTW_IS_FUNC_DISABLED((padapter), DF_TX_BIT))\n\n#ifdef CONFIG_PNO_SUPPORT\nint rtw_parse_ssid_list_tlv(char** list_str, pno_ssid_t* ssid, int max, int *bytes_left);\nint rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num, \n\t\t\t\t\tint pno_time, int pno_repeat, int pno_freq_expo_max);\n#ifdef CONFIG_PNO_SET_DEBUG\nvoid rtw_dev_pno_debug(struct net_device *net);\n#endif //CONFIG_PNO_SET_DEBUG\n#endif //CONFIG_PNO_SUPPORT\n\n#ifdef CONFIG_WOWLAN\nint rtw_suspend_wow(_adapter *padapter);\nint rtw_resume_process_wow(_adapter *padapter);\n#endif\n\n// HCI Related header file\n#ifdef CONFIG_USB_HCI\n#include <usb_osintf.h>\n#include <usb_ops.h>\n#include <usb_hal.h>\n#endif\n\n#ifdef CONFIG_SDIO_HCI\n#include <sdio_osintf.h>\n#include <sdio_ops.h>\n#include <sdio_hal.h>\n#endif\n\n#ifdef CONFIG_GSPI_HCI\n#include <gspi_osintf.h>\n#include <gspi_ops.h>\n#include <gspi_hal.h>\n#endif\n\n#ifdef CONFIG_PCI_HCI\n#include <pci_osintf.h>\n#include <pci_ops.h>\n#include <pci_hal.h>\n#endif\n\n#endif //__DRV_TYPES_H__\n\n"
  },
  {
    "path": "include/drv_types_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_CE_H__\n#define __DRV_TYPES_CE_H__\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n\n#include <Sdcardddk.h>\n\n#define MAX_ACTIVE_REG_PATH 256\n\n#define MAX_MCAST_LIST_NUM\t\t\t\t\t32\n\n\n\n//for ioctl\n#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer)\t((((u32)(_MainVer))<<16)+_MinorVer)\n\n#define NIC_HEADER_SIZE\t\t\t\t14\t\t\t//!< can be moved to typedef.h\n#define NIC_MAX_PACKET_SIZE\t\t\t1514\t\t//!< can be moved to typedef.h\n#define NIC_MAX_SEND_PACKETS\t\t\t10\t\t// max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h\n#define NIC_VENDOR_DRIVER_VERSION       MAKE_DRIVER_VERSION(0,001)\t//!< can be moved to typedef.h\n#define NIC_MAX_PACKET_SIZE\t\t\t1514\t\t//!< can be moved to typedef.h\n\ntypedef struct _MP_REG_ENTRY\n{\n\n\tNDIS_STRING\t\tRegName;\t// variable name text\n\tBOOLEAN\t\t\tbRequired;\t// 1 -> required, 0 -> optional\n\n\tu8\t\t\tType;\t\t// NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString\n\tuint\t\t\tFieldOffset;\t// offset to MP_ADAPTER field\n\tuint\t\t\tFieldSize;\t// size (in bytes) of the field\n\t\n#ifdef UNDER_AMD64\n\tu64\t\t\tDefault;\n#else\n\tu32\t\t\tDefault;\t\t// default value to use\n#endif\n\n\tu32\t\t\tMin;\t\t\t// minimum value allowed\n\tu32\t\t\tMax;\t\t// maximum value allowed\n} MP_REG_ENTRY, *PMP_REG_ENTRY;\n\n#ifdef CONFIG_USB_HCI\ntypedef struct _USB_EXTENSION {\n    LPCUSB_FUNCS    _lpUsbFuncs;\n\tUSB_HANDLE\t    _hDevice;\n    PVOID \t\t    pAdapter;\n\n#if 0\n\tUSB_ENDPOINT_DESCRIPTOR\t\t_endpACLIn;\n    USB_ENDPOINT_DESCRIPTOR\t\t_endpACLOutHigh;\n\tUSB_ENDPOINT_DESCRIPTOR\t\t_endpACLOutNormal;\n\n\tUSB_PIPE        pPipeIn;\n    USB_PIPE        pPipeOutNormal;\n    USB_PIPE        pPipeOutHigh;\n#endif\n\n} USB_EXTENSION, *PUSB_EXTENSION;\n#endif\n\n\ntypedef struct _OCTET_STRING{\n\tu8      *Octet;\n\tu16      Length;\n} OCTET_STRING, *POCTET_STRING;\n\n\n\n\n\n#endif\n\n"
  },
  {
    "path": "include/drv_types_gspi.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_GSPI_H__\n#define __DRV_TYPES_GSPI_H__\n\n// SPI Header Files\n#ifdef PLATFORM_LINUX\n\t#include <linux/platform_device.h>\n\t#include <linux/spi/spi.h>\n\t#include <linux/gpio.h>\n\t//#include <mach/ldo.h>\n\t#include <asm/mach-types.h>\n\t#include <asm/gpio.h>\n\t#include <asm/io.h>\n\t#include <mach/board.h>\n\t#include <mach/hardware.h>\n\t#include <mach/irqs.h>\n\t#include <custom_gpio.h>\n#endif\n\n\ntypedef struct gspi_data\n{\n\tu8  func_number;\n\n\tu8  tx_block_mode;\n\tu8  rx_block_mode;\n\tu32 block_transfer_len;\n\n#ifdef PLATFORM_LINUX\n\tstruct spi_device *func;\n\n\tstruct workqueue_struct *priv_wq;\n\tstruct delayed_work irq_work;\n#endif\n} GSPI_DATA, *PGSPI_DATA;\n\n#endif // #ifndef __DRV_TYPES_GSPI_H__\n\n"
  },
  {
    "path": "include/drv_types_linux.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_LINUX_H__\n#define __DRV_TYPES_LINUX_H__\n\n\n#endif\n\n"
  },
  {
    "path": "include/drv_types_pci.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_PCI_H__\n#define __DRV_TYPES_PCI_H__\n\n\n#ifdef PLATFORM_LINUX\n#include <linux/pci.h>\n#endif\n\n\n#define\tINTEL_VENDOR_ID\t\t\t\t0x8086\n#define\tSIS_VENDOR_ID\t\t\t\t\t0x1039\n#define\tATI_VENDOR_ID\t\t\t\t\t0x1002\n#define\tATI_DEVICE_ID\t\t\t\t\t0x7914\n#define\tAMD_VENDOR_ID\t\t\t\t\t0x1022\n\n#define\tPCI_MAX_BRIDGE_NUMBER\t\t\t255\n#define\tPCI_MAX_DEVICES\t\t\t\t32\n#define\tPCI_MAX_FUNCTION\t\t\t\t8\n\n#define\tPCI_CONF_ADDRESS   \t\t\t\t0x0CF8   // PCI Configuration Space Address \n#define\tPCI_CONF_DATA\t\t\t\t\t0x0CFC   // PCI Configuration Space Data \n\n#define\tPCI_CLASS_BRIDGE_DEV\t\t\t0x06\n#define\tPCI_SUBCLASS_BR_PCI_TO_PCI\t0x04\n\n#define \tPCI_CAPABILITY_ID_PCI_EXPRESS\t0x10\n\n#define\tU1DONTCARE \t\t\t\t\t0xFF\t\n#define\tU2DONTCARE \t\t\t\t\t0xFFFF\t\n#define\tU4DONTCARE \t\t\t\t\t0xFFFFFFFF\n\n#define PCI_VENDER_ID_REALTEK\t\t0x10ec\n\n#define HAL_HW_PCI_8180_DEVICE_ID           \t0x8180\n#define HAL_HW_PCI_8185_DEVICE_ID           \t0x8185\t//8185 or 8185b\n#define HAL_HW_PCI_8188_DEVICE_ID           \t0x8188\t//8185b\t\t\n#define HAL_HW_PCI_8198_DEVICE_ID           \t0x8198\t//8185b\t\t\n#define HAL_HW_PCI_8190_DEVICE_ID           \t0x8190\t//8190\n#define HAL_HW_PCI_8723E_DEVICE_ID\t\t0x8723\t//8723E\n#define HAL_HW_PCI_8192_DEVICE_ID           \t0x8192\t//8192 PCI-E\n#define HAL_HW_PCI_8192SE_DEVICE_ID\t\t0x8192\t//8192 SE\n#define HAL_HW_PCI_8174_DEVICE_ID           \t0x8174\t//8192 SE \n#define HAL_HW_PCI_8173_DEVICE_ID           \t0x8173\t//8191 SE Crab\n#define HAL_HW_PCI_8172_DEVICE_ID           \t0x8172\t//8191 SE RE\n#define HAL_HW_PCI_8171_DEVICE_ID           \t0x8171\t//8191 SE Unicron\n#define HAL_HW_PCI_0045_DEVICE_ID\t\t\t0x0045\t//8190 PCI for Ceraga\n#define HAL_HW_PCI_0046_DEVICE_ID\t\t\t0x0046\t//8190 Cardbus for Ceraga\n#define HAL_HW_PCI_0044_DEVICE_ID\t\t\t0x0044\t//8192e PCIE for Ceraga\n#define HAL_HW_PCI_0047_DEVICE_ID\t\t\t0x0047\t//8192e Express Card for Ceraga\n#define HAL_HW_PCI_700F_DEVICE_ID\t\t\t0x700F\n#define HAL_HW_PCI_701F_DEVICE_ID\t\t\t0x701F\n#define HAL_HW_PCI_DLINK_DEVICE_ID\t\t0x3304\n#define HAL_HW_PCI_8188EE_DEVICE_ID\t\t0x8179\n\n#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI \t\t0x1000     //8190 support 16 pages of IO registers\n#define HAL_HW_PCI_REVISION_ID_8190PCI\t\t\t0x00\n#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE\t0x4000\t//8192 support 16 pages of IO registers\n#define HAL_HW_PCI_REVISION_ID_8192PCIE\t\t\t0x01\n#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE\t\t0x4000\t//8192 support 16 pages of IO registers\n#define HAL_HW_PCI_REVISION_ID_8192SE\t\t\t0x10\n#define HAL_HW_PCI_REVISION_ID_8192CE\t\t\t0x1\n#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE\t\t0x4000\t//8192 support 16 pages of IO registers\n#define HAL_HW_PCI_REVISION_ID_8192DE\t\t\t0x0\n#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE\t\t0x4000\t//8192 support 16 pages of IO registers\n\nenum pci_bridge_vendor {\n\tPCI_BRIDGE_VENDOR_INTEL = 0x0,//0b'0000,0001\n\tPCI_BRIDGE_VENDOR_ATI, //= 0x02,//0b'0000,0010\n\tPCI_BRIDGE_VENDOR_AMD, //= 0x04,//0b'0000,0100\n\tPCI_BRIDGE_VENDOR_SIS ,//= 0x08,//0b'0000,1000\n\tPCI_BRIDGE_VENDOR_UNKNOWN, //= 0x40,//0b'0100,0000\n\tPCI_BRIDGE_VENDOR_MAX ,//= 0x80\n} ;\n\n// copy this data structor defination from MSDN SDK\ntypedef struct _PCI_COMMON_CONFIG {\n\tu16\tVendorID;\n\tu16\tDeviceID;\n\tu16\tCommand;\n\tu16\tStatus;\n\tu8\tRevisionID;\n\tu8\tProgIf;\n\tu8\tSubClass;\n\tu8\tBaseClass;\n\tu8\tCacheLineSize;\n\tu8\tLatencyTimer;\n\tu8\tHeaderType;\n\tu8\tBIST;\n\n\tunion {\n\tstruct _PCI_HEADER_TYPE_0 {\n\t\tu32\tBaseAddresses[6];\n\t\tu32\tCIS;\n\t\tu16\tSubVendorID;\n\t\tu16\tSubSystemID;\n\t\tu32\tROMBaseAddress;\n\t\tu8\tCapabilitiesPtr;\n\t\tu8\tReserved1[3];\n\t\tu32\tReserved2;\n\n\t\tu8\tInterruptLine;\n\t\tu8\tInterruptPin;\n\t\tu8\tMinimumGrant;\n\t\tu8\tMaximumLatency;\n\t} type0;\n#if 0\n\tstruct _PCI_HEADER_TYPE_1 {\n\t\tULONG BaseAddresses[PCI_TYPE1_ADDRESSES];\n\t\tUCHAR PrimaryBusNumber;\n\t\tUCHAR SecondaryBusNumber;\n\t\tUCHAR SubordinateBusNumber;\n\t\tUCHAR SecondaryLatencyTimer;\n\t\tUCHAR IOBase;\n\t\tUCHAR IOLimit;\n\t\tUSHORT SecondaryStatus;\n\t\tUSHORT MemoryBase;\n\t\tUSHORT MemoryLimit;\n\t\tUSHORT PrefetchableMemoryBase;\n\t\tUSHORT PrefetchableMemoryLimit;\n\t\tULONG PrefetchableMemoryBaseUpper32;\n\t\tULONG PrefetchableMemoryLimitUpper32;\n\t\tUSHORT IOBaseUpper;\n\t\tUSHORT IOLimitUpper;\n\t\tULONG Reserved2;\n\t\tULONG ExpansionROMBase;\n\t\tUCHAR InterruptLine;\n\t\tUCHAR InterruptPin;\n\t\tUSHORT BridgeControl;\n\t} type1;\n\n\tstruct _PCI_HEADER_TYPE_2 {\n\t\tULONG BaseAddress;\n\t\tUCHAR CapabilitiesPtr;\n\t\tUCHAR Reserved2;\n\t\tUSHORT SecondaryStatus;\n\t\tUCHAR PrimaryBusNumber;\n\t\tUCHAR CardbusBusNumber;\n\t\tUCHAR SubordinateBusNumber;\n\t\tUCHAR CardbusLatencyTimer;\n\t\tULONG MemoryBase0;\n\t\tULONG MemoryLimit0;\n\t\tULONG MemoryBase1;\n\t\tULONG MemoryLimit1;\n\t\tUSHORT IOBase0_LO;\n\t\tUSHORT IOBase0_HI;\n\t\tUSHORT IOLimit0_LO;\n\t\tUSHORT IOLimit0_HI;\n\t\tUSHORT IOBase1_LO;\n\t\tUSHORT IOBase1_HI;\n\t\tUSHORT IOLimit1_LO;\n\t\tUSHORT IOLimit1_HI;\n\t\tUCHAR InterruptLine;\n\t\tUCHAR InterruptPin;\n\t\tUSHORT BridgeControl;\n\t\tUSHORT SubVendorID;\n\t\tUSHORT SubSystemID;\n\t\tULONG LegacyBaseAddress;\n\t\tUCHAR Reserved3[56];\n\t\tULONG SystemControl;\n\t\tUCHAR MultiMediaControl;\n\t\tUCHAR GeneralStatus;\n\t\tUCHAR Reserved4[2];\n\t\tUCHAR GPIO0Control;\n\t\tUCHAR GPIO1Control;\n\t\tUCHAR GPIO2Control;\n\t\tUCHAR GPIO3Control;\n\t\tULONG IRQMuxRouting;\n\t\tUCHAR RetryStatus;\n\t\tUCHAR CardControl;\n\t\tUCHAR DeviceControl;\n\t\tUCHAR Diagnostic;\n\t} type2;\n#endif\n\t} u;\n\n\tu8\tDeviceSpecific[108];\n} PCI_COMMON_CONFIG , *PPCI_COMMON_CONFIG;\n\ntypedef struct _RT_PCI_CAPABILITIES_HEADER {\n    u8   CapabilityID;\n    u8   Next;\n} RT_PCI_CAPABILITIES_HEADER, *PRT_PCI_CAPABILITIES_HEADER;\n\nstruct pci_priv{\n\tBOOLEAN\t\tpci_clk_req;\n\t\n\tu8\tpciehdr_offset;\n\t//  PCIeCap is only differece between B-cut and C-cut.\n\t//  Configuration Space offset 72[7:4] \n\t//  0: A/B cut \n\t//  1: C cut and later.\n\tu8\tpcie_cap;\n\tu8\tlinkctrl_reg;\n\t\n\tu8\tbusnumber;\n\tu8\tdevnumber;\t\n\tu8\tfuncnumber;\t\n\n\tu8\tpcibridge_busnum;\n\tu8\tpcibridge_devnum;\n\tu8\tpcibridge_funcnum;\n\tu8\tpcibridge_vendor;\n\tu16\tpcibridge_vendorid;\n\tu16\tpcibridge_deviceid;\n\tu8\tpcibridge_pciehdr_offset;\n\tu8\tpcibridge_linkctrlreg;\t\n\n\tu8\tamd_l1_patch;\n};\n\ntypedef struct _RT_ISR_CONTENT\n{\n\tunion{\n\t\tu32\t\t\tIntArray[2];\n\t\tu32\t\t\tIntReg4Byte;\n\t\tu16\t\t\tIntReg2Byte;\n\t};\n}RT_ISR_CONTENT, *PRT_ISR_CONTENT;\n\n//#define RegAddr(addr)           (addr + 0xB2000000UL)\n//some platform macros will def here\nstatic inline void NdisRawWritePortUlong(u32 port,  u32 val) \t\t\n{\n\toutl(val, port);\n\t//writel(val, (u8 *)RegAddr(port));\t\n}\n\nstatic inline void NdisRawWritePortUchar(u32 port,  u8 val)\n{\n\toutb(val, port);\n\t//writeb(val, (u8 *)RegAddr(port));\n}\n\nstatic inline void NdisRawReadPortUchar(u32 port, u8 *pval)\n{\n\t*pval = inb(port);\n\t//*pval = readb((u8 *)RegAddr(port));\n}\n\nstatic inline void NdisRawReadPortUshort(u32 port, u16 *pval)\n{\n\t*pval = inw(port);\n\t//*pval = readw((u8 *)RegAddr(port));\n}\n\nstatic inline void NdisRawReadPortUlong(u32 port, u32 *pval)\n{\n\t*pval = inl(port);\n\t//*pval = readl((u8 *)RegAddr(port));\n}\n\n\n#endif\n\n"
  },
  {
    "path": "include/drv_types_sdio.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_SDIO_H__\n#define __DRV_TYPES_SDIO_H__\n\n// SDIO Header Files\n#ifdef PLATFORM_LINUX\n\t#include <linux/mmc/sdio_func.h> \n\t#include <linux/mmc/sdio_ids.h>\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) || defined(CONFIG_PLATFORM_SPRD)\n\t#include <linux/mmc/host.h>\n\t#include <linux/mmc/card.h>\n#endif\n\n#ifdef CONFIG_PLATFORM_SPRD\n\t#include <linux/gpio.h>\n\t#include <custom_gpio.h>\n#endif // CONFIG_PLATFORM_SPRD\n#endif\n\n#ifdef PLATFORM_OS_XP\n#include <wdm.h>\n#include <ntddsd.h>\n#endif\n\n#ifdef PLATFORM_OS_CE\n#include <sdcardddk.h>\n#endif\n\n\ntypedef struct sdio_data\n{\n\tu8  func_number;\n \n\tu8  tx_block_mode;\n\tu8  rx_block_mode;\n\tu32 block_transfer_len;\n\n#ifdef PLATFORM_LINUX\n\tstruct sdio_func\t *func;\n\t_thread_hdl_ sys_sdio_irq_thd;\n#endif\n\n#ifdef PLATFORM_OS_XP\n\tPDEVICE_OBJECT\t\t\t\tpphysdevobj;\n\tPDEVICE_OBJECT\t\t\t\tpfuncdevobj;\n\tPDEVICE_OBJECT\t\t\t\tpnextdevobj;\n\tSDBUS_INTERFACE_STANDARD\tsdbusinft;\n\tu8\t\t\t\t\t\t\tnextdevstacksz;\n#endif\n\n#ifdef PLATFORM_OS_CE\n\tSD_DEVICE_HANDLE\t\t\thDevice;\n\tSD_CARD_RCA\t\t\t\t\tsd_rca;\n\tSD_CARD_INTERFACE\t\t\tcard_intf;\n\tBOOLEAN\t\t\t\t\t\tenableIsarWithStatus;\n\tWCHAR\t\t\t\t\t\tactive_path[MAX_ACTIVE_REG_PATH];\n\tSD_HOST_BLOCK_CAPABILITY\tsd_host_blk_cap;\n#endif\n} SDIO_DATA, *PSDIO_DATA;\n\n#endif\n\n"
  },
  {
    "path": "include/drv_types_xp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __DRV_TYPES_XP_H__\n#define __DRV_TYPES_XP_H__\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n\n\n\n#define MAX_MCAST_LIST_NUM\t\t\t\t\t32\n\n\n\n//for ioctl\n#define MAKE_DRIVER_VERSION(_MainVer,_MinorVer)\t((((u32)(_MainVer))<<16)+_MinorVer)\n\n#define NIC_HEADER_SIZE\t\t\t\t14\t\t\t//!< can be moved to typedef.h\n#define NIC_MAX_PACKET_SIZE\t\t\t1514\t\t//!< can be moved to typedef.h\n#define NIC_MAX_SEND_PACKETS\t\t\t10\t\t// max number of send packets the MiniportSendPackets function can accept, can be moved to typedef.h\n#define NIC_VENDOR_DRIVER_VERSION       MAKE_DRIVER_VERSION(0,001)\t//!< can be moved to typedef.h\n#define NIC_MAX_PACKET_SIZE\t\t\t1514\t\t//!< can be moved to typedef.h\n\n\n#undef ON_VISTA\n//added by Jackson\n#ifndef ON_VISTA\n//\n// Bus driver versions\n//\n\n#define SDBUS_DRIVER_VERSION_1          0x100\n#define SDBUS_DRIVER_VERSION_2          0x200\n\n#define    SDP_FUNCTION_TYPE\t4\n#define    SDP_BUS_DRIVER_VERSION 5\n#define    SDP_BUS_WIDTH 6\n#define    SDP_BUS_CLOCK 7\n#define    SDP_BUS_INTERFACE_CONTROL 8\n#define    SDP_HOST_BLOCK_LENGTH 9\n#define    SDP_FUNCTION_BLOCK_LENGTH 10\n#define    SDP_FN0_BLOCK_LENGTH 11\n#define    SDP_FUNCTION_INT_ENABLE 12\n#endif\n\n\ntypedef struct _MP_REG_ENTRY\n{\n\n\tNDIS_STRING\t\tRegName;\t// variable name text\n\tBOOLEAN\t\t\tbRequired;\t// 1 -> required, 0 -> optional\n\n\tu8\t\t\tType;\t\t// NdisParameterInteger/NdisParameterHexInteger/NdisParameterStringle/NdisParameterMultiString\n\tuint\t\t\tFieldOffset;\t// offset to MP_ADAPTER field\n\tuint\t\t\tFieldSize;\t// size (in bytes) of the field\n\t\n#ifdef UNDER_AMD64\n\tu64\t\t\tDefault;\n#else\n\tu32\t\t\tDefault;\t\t// default value to use\n#endif\n\n\tu32\t\t\tMin;\t\t\t// minimum value allowed\n\tu32\t\t\tMax;\t\t// maximum value allowed\n} MP_REG_ENTRY, *PMP_REG_ENTRY;\n\n\ntypedef struct _OCTET_STRING{\n\tu8      *Octet;\n\tu16      Length;\n} OCTET_STRING, *POCTET_STRING;\n\n\n\n\n\n#endif\n\n"
  },
  {
    "path": "include/ethernet.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*! \\file */ \n#ifndef __INC_ETHERNET_H\n#define __INC_ETHERNET_H\n\n#define ETHERNET_ADDRESS_LENGTH\t\t\t\t6\t\t//!< Ethernet Address Length\n#define ETHERNET_HEADER_SIZE\t\t\t\t14\t\t//!< Ethernet Header Length\n#define LLC_HEADER_SIZE\t\t\t\t\t\t6\t\t//!< LLC Header Length\n#define TYPE_LENGTH_FIELD_SIZE\t\t\t\t2\t\t//!< Type/Length Size\n#define MINIMUM_ETHERNET_PACKET_SIZE\t\t60\t\t//!< Minimum Ethernet Packet Size\n#define MAXIMUM_ETHERNET_PACKET_SIZE\t\t1514\t//!< Maximum Ethernet Packet Size\n\n#define RT_ETH_IS_MULTICAST(_pAddr)\t((((UCHAR *)(_pAddr))[0]&0x01)!=0)\t\t//!< Is Multicast Address?\n#define RT_ETH_IS_BROADCAST(_pAddr)\t(\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[0]==0xff\t&& \t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[1]==0xff\t&&\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[2]==0xff\t&&\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[3]==0xff\t&&\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[4]==0xff\t&&\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t((UCHAR *)(_pAddr))[5]==0xff\t\t)\t//!< Is Broadcast Address?\n\n\n#endif // #ifndef __INC_ETHERNET_H\n\n"
  },
  {
    "path": "include/gspi_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __GSPI_HAL_H__\n#define __GSPI_HAL_H__\n\n\nvoid spi_int_dpc(PADAPTER padapter, u32 sdio_hisr);\nu8 rtw_set_hal_ops(_adapter *padapter);\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188es_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8723B\nvoid rtl8723bs_set_hal_ops(PADAPTER padapter);\n#endif\n\n#endif //__GSPI_HAL_H__\n\n"
  },
  {
    "path": "include/gspi_ops.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __GSPI_OPS_H__\n#define __GSPI_OPS_H__\n\n/* follwing defination is based on\n * GSPI spec of RTL8723, we temp\n * suppose that it will be the same\n * for diff chips of GSPI, if not\n * we should move it to HAL folder */\n#define SPI_LOCAL_DOMAIN \t\t\t\t0x0\n#define WLAN_IOREG_DOMAIN \t\t\t0x8\n#define FW_FIFO_DOMAIN \t\t\t\t0x4\n#define TX_HIQ_DOMAIN \t\t\t\t\t0xc\n#define TX_MIQ_DOMAIN \t\t\t\t\t0xd\n#define TX_LOQ_DOMAIN \t\t\t\t\t0xe\n#define RX_RXFIFO_DOMAIN \t\t\t\t0x1f\n\n//IO Bus domain address mapping\n#define DEFUALT_OFFSET\t\t\t\t\t0x0\n#define SPI_LOCAL_OFFSET    \t\t\t\t0x10250000\n#define WLAN_IOREG_OFFSET   \t\t\t0x10260000\n#define FW_FIFO_OFFSET \t    \t\t\t0x10270000\n#define TX_HIQ_OFFSET\t    \t\t\t\t0x10310000\n#define TX_MIQ_OFFSET\t\t\t\t\t0x1032000\n#define TX_LOQ_OFFSET\t\t\t\t\t0x10330000\n#define RX_RXOFF_OFFSET\t    \t\t\t0x10340000\n\n//SPI Local registers\n#define SPI_REG_TX_CTRL\t\t\t\t\t0x0000 // SPI Tx Control\n#define SPI_REG_STATUS_RECOVERY\t\t0x0004\n#define SPI_REG_INT_TIMEOUT\t\t   \t0x0006\n#define SPI_REG_HIMR\t\t\t\t\t0x0014 // SPI Host Interrupt Mask\n#define SPI_REG_HISR\t\t\t\t\t0x0018 // SPI Host Interrupt Service Routine\n#define SPI_REG_RX0_REQ_LEN\t\t\t0x001C // RXDMA Request Length\n#define SPI_REG_FREE_TXPG\t\t\t\t0x0020 // Free Tx Buffer Page\n#define SPI_REG_HCPWM1\t\t\t\t\t0x0024 // HCI Current Power Mode 1\n#define SPI_REG_HCPWM2\t\t\t\t\t0x0026 // HCI Current Power Mode 2\n#define SPI_REG_HTSFR_INFO\t\t\t\t0x0030 // HTSF Informaion\n#define SPI_REG_HRPWM1\t\t\t\t\t0x0080 // HCI Request Power Mode 1\n#define SPI_REG_HRPWM2\t\t\t\t\t0x0082 // HCI Request Power Mode 2\n#define SPI_REG_HPS_CLKR\t\t\t\t0x0084 // HCI Power Save Clock\n#define SPI_REG_HSUS_CTRL\t\t\t\t0x0086 // SPI HCI Suspend Control\n#define SPI_REG_HIMR_ON\t\t\t\t0x0090 //SPI Host Extension Interrupt Mask Always\n#define SPI_REG_HISR_ON\t\t\t\t0x0091 //SPI Host Extension Interrupt Status Always\n#define SPI_REG_CFG\t\t\t\t\t\t0x00F0 //SPI Configuration Register\n\n#define SPI_TX_CTRL \t               \t\t\t(SPI_REG_TX_CTRL  |SPI_LOCAL_OFFSET)\n#define SPI_STATUS_RECOVERY\t\t   \t(SPI_REG_STATUS_RECOVERY  |SPI_LOCAL_OFFSET)\n#define SPI_INT_TIMEOUT\t\t   \t   \t\t(SPI_REG_INT_TIMEOUT  |SPI_LOCAL_OFFSET)\n#define SPI_HIMR \t                  \t\t\t(SPI_REG_HIMR |SPI_LOCAL_OFFSET)\n#define SPI_HISR \t                   \t\t\t(SPI_REG_HISR |SPI_LOCAL_OFFSET)\n#define SPI_RX0_REQ_LEN_1_BYTE \t   \t(SPI_REG_RX0_REQ_LEN |SPI_LOCAL_OFFSET)\n#define SPI_FREE_TXPG \t               \t\t(SPI_REG_FREE_TXPG |SPI_LOCAL_OFFSET)\n\n#define\tSPI_HIMR_DISABLED\t\t\t\t0\n\n//SPI HIMR MASK diff with SDIO\n#define SPI_HISR_RX_REQUEST    \t\t\tBIT(0)\n#define SPI_HISR_AVAL\t\t\t\t\tBIT(1)\n#define SPI_HISR_TXERR\t\t\t\t\tBIT(2)\n#define SPI_HISR_RXERR\t\t\t\t\tBIT(3)\n#define SPI_HISR_TXFOVW\t\t\t\tBIT(4)\n#define SPI_HISR_RXFOVW\t\t\t\tBIT(5)\n#define SPI_HISR_TXBCNOK\t\t\t\tBIT(6)\n#define SPI_HISR_TXBCNERR\t\t\t\tBIT(7)\n#define SPI_HISR_BCNERLY_INT\t\t\tBIT(16)\n#define SPI_HISR_ATIMEND\t\t\t\tBIT(17)\n#define SPI_HISR_ATIMEND_E\t\t\t\tBIT(18)\n#define SPI_HISR_CTWEND\t\t\t\tBIT(19)\n#define SPI_HISR_C2HCMD\t\t\t\tBIT(20)\n#define SPI_HISR_CPWM1\t\t\t\t\tBIT(21)\n#define SPI_HISR_CPWM2\t\t\t\t\tBIT(22)\n#define SPI_HISR_HSISR_IND\t\t\t\tBIT(23)\n#define SPI_HISR_GTINT3_IND\t\t\t\tBIT(24)\n#define SPI_HISR_GTINT4_IND\t\t\t\tBIT(25)\n#define SPI_HISR_PSTIMEOUT\t\t\t\tBIT(26)\n#define SPI_HISR_OCPINT\t\t\t\t\tBIT(27)\n#define SPI_HISR_TSF_BIT32_TOGGLE\t\tBIT(29)\n\n#define MASK_SPI_HISR_CLEAR\t\t(SPI_HISR_TXERR |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_RXERR |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_TXFOVW |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_RXFOVW |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_TXBCNOK |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_TXBCNERR |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_C2HCMD |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_CPWM1 |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_CPWM2 |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_HSISR_IND |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_GTINT3_IND |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_GTINT4_IND |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_PSTIMEOUT |\\\n\t\t\t\t\t\t\t\t\tSPI_HISR_OCPINT)\n\n#define REG_LEN_FORMAT(pcmd, x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 0, 8, x)//(x<<(unsigned int)24)\n#define REG_ADDR_FORMAT(pcmd,x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16)\n#define REG_DOMAIN_ID_FORMAT(pcmd,x) \t\tSET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0)\n#define REG_FUN_FORMAT(pcmd,x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5)\n#define REG_RW_FORMAT(pcmd,x) \t\t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7)\n\n#define FIFO_LEN_FORMAT(pcmd, x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 0, 16, x)//(x<<(unsigned int)24)\n//#define FIFO_ADDR_FORMAT(pcmd,x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 8, 16, x)//(x<<(unsigned int)16)\n#define FIFO_DOMAIN_ID_FORMAT(pcmd,x) \tSET_BITS_TO_LE_4BYTE(pcmd, 24, 5, x)//(x<<(unsigned int)0)\n#define FIFO_FUN_FORMAT(pcmd,x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 29, 2, x)//(x<<(unsigned int)5)\n#define FIFO_RW_FORMAT(pcmd,x) \t\t\tSET_BITS_TO_LE_4BYTE(pcmd, 31, 1, x)//(x<<(unsigned int)7)\n\n\n//get status dword0\n#define GET_STATUS_PUB_PAGE_NUM(status)\t\tLE_BITS_TO_4BYTE(status, 24, 8)\n#define GET_STATUS_HI_PAGE_NUM(status)\t\tLE_BITS_TO_4BYTE(status, 18, 6)\n#define GET_STATUS_MID_PAGE_NUM(status)\t\tLE_BITS_TO_4BYTE(status, 12, 6)\n#define GET_STATUS_LOW_PAGE_NUM(status)\t\tLE_BITS_TO_4BYTE(status, 6, 6)\n#define GET_STATUS_HISR_HI6BIT(status)\t\t\tLE_BITS_TO_4BYTE(status, 0, 6)\n\n//get status dword1\n#define GET_STATUS_HISR_MID8BIT(status)\t\tLE_BITS_TO_4BYTE(status + 4, 24, 8)\n#define GET_STATUS_HISR_LOW8BIT(status)\t\tLE_BITS_TO_4BYTE(status + 4, 16, 8)\n#define GET_STATUS_ERROR(status)\t\t    \t\tLE_BITS_TO_4BYTE(status + 4, 17, 1)\n#define GET_STATUS_INT(status)\t\t        \t\tLE_BITS_TO_4BYTE(status + 4, 16, 1)\n#define GET_STATUS_RX_LENGTH(status)\t\t\tLE_BITS_TO_4BYTE(status + 4, 0, 16)\n\n\n#define RXDESC_SIZE\t24\n\n\nstruct spi_more_data {\n\tunsigned long more_data;\n\tunsigned long len;\n};\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188es_set_hal_ops(PADAPTER padapter);\n#define set_hal_ops rtl8188es_set_hal_ops\n#endif\nextern void spi_set_chip_endian(PADAPTER padapter);\nextern unsigned int spi_write8_endian(ADAPTER *Adapter, unsigned int addr, unsigned int buf, u32 big);\nextern void spi_set_intf_ops(_adapter *padapter,struct _io_ops *pops);\nextern void spi_set_chip_endian(PADAPTER padapter);\nextern void InitInterrupt8723ASdio(PADAPTER padapter);\nextern void InitSysInterrupt8723ASdio(PADAPTER padapter);\nextern void EnableInterrupt8723ASdio(PADAPTER padapter);\nextern void DisableInterrupt8723ASdio(PADAPTER padapter);\nextern void spi_int_hdl(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8723ASdio(PADAPTER padapter);\n#ifdef CONFIG_RTL8723B\nextern void InitInterrupt8723BSdio(PADAPTER padapter);\nextern void InitSysInterrupt8723BSdio(PADAPTER padapter);\nextern void EnableInterrupt8723BSdio(PADAPTER padapter);\nextern void DisableInterrupt8723BSdio(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8188E\nextern void InitInterrupt8188EGspi(PADAPTER padapter);\nextern void EnableInterrupt8188EGspi(PADAPTER padapter);\nextern void DisableInterrupt8188EGspi(PADAPTER padapter);\nextern void UpdateInterruptMask8188EGspi(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);\nextern u8 HalQueryTxBufferStatus8189EGspi(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8189EGspi(PADAPTER padapter);\nextern void ClearInterrupt8188EGspi(PADAPTER padapter);\nextern u8 CheckIPSStatus(PADAPTER padapter);\n#endif // CONFIG_RTL8188E\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nextern u8 RecvOnePkt(PADAPTER padapter, u32 size);\n#endif // CONFIG_WOWLAN\n\n#endif //__GSPI_OPS_H__\n"
  },
  {
    "path": "include/gspi_ops_linux.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_OPS_LINUX_H__\n#define __SDIO_OPS_LINUX_H__\n\n#endif\n\n"
  },
  {
    "path": "include/gspi_osintf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_OSINTF_H__\n#define __SDIO_OSINTF_H__\n\n\n#ifdef PLATFORM_OS_CE\nextern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter);\nSD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter);\nextern void sd_setup_irs(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/h2clbk.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#define _H2CLBK_H_\n\n\nvoid _lbk_cmd(PADAPTER Adapter);\n\nvoid _lbk_rsp(PADAPTER Adapter);\n\nvoid _lbk_evt(IN PADAPTER Adapter);\n\nvoid h2c_event_callback(unsigned char *dev, unsigned char *pbuf);\n\n"
  },
  {
    "path": "include/hal_btcoex.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_BTCOEX_H__\n#define __HAL_BTCOEX_H__\n\n#include <drv_types.h>\n\n// Some variables can't get from outsrc BT-Coex,\n// so we need to save here\ntypedef struct _BT_COEXIST\n{\n\tu8 bBtExist;\n\tu8 btTotalAntNum;\n\tu8 btChipType;\n\tu8 bInitlized;\n\tu8 btAntisolation;\n} BT_COEXIST, *PBT_COEXIST;\n\nvoid DBG_BT_INFO(u8 *dbgmsg);\n\nvoid hal_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist);\nu8 hal_btcoex_IsBtExist(PADAPTER padapter);\nu8 hal_btcoex_IsBtDisabled(PADAPTER);\nvoid hal_btcoex_SetChipType(PADAPTER padapter, u8 chipType);\nu8 hal_btcoex_GetChipType(PADAPTER padapter);\nvoid hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum);\nu8 hal_btcoex_GetPgAntNum(PADAPTER padapter);\nvoid hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);\n\nu8 hal_btcoex_Initialize(PADAPTER padapter);\nvoid hal_btcoex_PowerOnSetting(PADAPTER padapter);\nvoid hal_btcoex_PreLoadFirmware(PADAPTER padapter);\nvoid hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly);\n\nvoid hal_btcoex_IpsNotify(PADAPTER padapter, u8 type);\nvoid hal_btcoex_LpsNotify(PADAPTER padapter, u8 type);\nvoid hal_btcoex_ScanNotify(PADAPTER padapter, u8 type);\nvoid hal_btcoex_ConnectNotify(PADAPTER padapter, u8 action);\nvoid hal_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus);\nvoid hal_btcoex_SpecialPacketNotify(PADAPTER padapter, u8 pktType);\nvoid hal_btcoex_IQKNotify(PADAPTER padapter, u8 state);\nvoid hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf);\nvoid hal_btcoex_SuspendNotify(PADAPTER padapter, u8 state);\nvoid hal_btcoex_HaltNotify(PADAPTER padapter);\nvoid hal_btcoex_SwitchBtTRxMask(PADAPTER padapter);\n\nvoid hal_btcoex_Hanlder(PADAPTER padapter);\n\ns32 hal_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter);\ns32 hal_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER padapter);\nu32 hal_btcoex_GetAMPDUSize(PADAPTER padapter);\nvoid hal_btcoex_SetManualControl(PADAPTER padapter, u8 bmanual);\nu8 hal_btcoex_1Ant(PADAPTER padapter);\nu8 hal_btcoex_IsBtControlLps(PADAPTER);\nu8 hal_btcoex_IsLpsOn(PADAPTER);\nu8 hal_btcoex_RpwmVal(PADAPTER);\nu8 hal_btcoex_LpsVal(PADAPTER);\nu32 hal_btcoex_GetRaMask(PADAPTER);\nvoid hal_btcoex_RecordPwrMode(PADAPTER padapter, u8 *pCmdBuf, u8 cmdLen);\nvoid hal_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);\nvoid hal_btcoex_SetDBG(PADAPTER, u32 *pDbgModule);\nu32 hal_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize);\nu8 hal_btcoex_IncreaseScanDeviceNum(PADAPTER);\nu8 hal_btcoex_IsBtLinkExist(PADAPTER);\nvoid hal_btcoex_SetBtPatchVersion(PADAPTER,u16 btHciVer,u16 btPatchVer);\nvoid hal_btcoex_SetHciVersion(PADAPTER, u16 hciVersion);\nvoid hal_btcoex_SendScanNotify(PADAPTER, u8 type);\nvoid hal_btcoex_StackUpdateProfileInfo(void);\nvoid hal_btcoex_BTOffOnNotify(PADAPTER padapter, u8 bBTON);\nvoid hal_btcoex_SetAntIsolationType(PADAPTER padapter, u8 anttype);\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nint hal_btcoex_AntIsolationConfig_ParaFile(IN PADAPTER\tAdapter,IN char* pFileName);\nint hal_btcoex_ParseAntIsolationConfigFile(PADAPTER Adapter, char*\tbuffer);\n#endif // CONFIG_LOAD_PHY_PARA_FROM_FILE\n#endif // !__HAL_BTCOEX_H__\n\n"
  },
  {
    "path": "include/hal_com.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_COMMON_H__\n#define __HAL_COMMON_H__\n\n#include \"HalVerDef.h\"\n#include \"hal_pg.h\"\n#include \"hal_phy.h\"\n#include \"hal_phy_reg.h\"\n#include \"hal_com_reg.h\"\n#include \"hal_com_phycfg.h\"\n#include \"../hal/hal_com_c2h.h\"\n\n/*------------------------------ Tx Desc definition Macro ------------------------*/ \n//#pragma mark -- Tx Desc related definition. --\n//----------------------------------------------------------------------------\n//-----------------------------------------------------------\n//\tRate\n//-----------------------------------------------------------\n// CCK Rates, TxHT = 0\n#define DESC_RATE1M\t\t\t\t\t0x00\n#define DESC_RATE2M\t\t\t\t\t0x01\n#define DESC_RATE5_5M\t\t\t\t0x02\n#define DESC_RATE11M\t\t\t\t0x03\n\n// OFDM Rates, TxHT = 0\n#define DESC_RATE6M\t\t\t\t\t0x04\n#define DESC_RATE9M\t\t\t\t\t0x05\n#define DESC_RATE12M\t\t\t\t0x06\n#define DESC_RATE18M\t\t\t\t0x07\n#define DESC_RATE24M\t\t\t\t0x08\n#define DESC_RATE36M\t\t\t\t0x09\n#define DESC_RATE48M\t\t\t\t0x0a\n#define DESC_RATE54M\t\t\t\t0x0b\n\n// MCS Rates, TxHT = 1\n#define DESC_RATEMCS0\t\t\t\t0x0c\n#define DESC_RATEMCS1\t\t\t\t0x0d\n#define DESC_RATEMCS2\t\t\t\t0x0e\n#define DESC_RATEMCS3\t\t\t\t0x0f\n#define DESC_RATEMCS4\t\t\t\t0x10\n#define DESC_RATEMCS5\t\t\t\t0x11\n#define DESC_RATEMCS6\t\t\t\t0x12\n#define DESC_RATEMCS7\t\t\t\t0x13\n#define DESC_RATEMCS8\t\t\t\t0x14\n#define DESC_RATEMCS9\t\t\t\t0x15\n#define DESC_RATEMCS10\t\t\t\t0x16\n#define DESC_RATEMCS11\t\t\t\t0x17\n#define DESC_RATEMCS12\t\t\t\t0x18\n#define DESC_RATEMCS13\t\t\t\t0x19\n#define DESC_RATEMCS14\t\t\t\t0x1a\n#define DESC_RATEMCS15\t\t\t\t0x1b\n#define DESC_RATEMCS16\t\t\t\t0x1C\n#define DESC_RATEMCS17\t\t\t\t0x1D\n#define DESC_RATEMCS18\t\t\t\t0x1E\n#define DESC_RATEMCS19\t\t\t\t0x1F\n#define DESC_RATEMCS20\t\t\t\t0x20\n#define DESC_RATEMCS21\t\t\t\t0x21\n#define DESC_RATEMCS22\t\t\t\t0x22\n#define DESC_RATEMCS23\t\t\t\t0x23\n#define DESC_RATEMCS24\t\t\t\t0x24\n#define DESC_RATEMCS25\t\t\t\t0x25\n#define DESC_RATEMCS26\t\t\t\t0x26\n#define DESC_RATEMCS27\t\t\t\t0x27\n#define DESC_RATEMCS28\t\t\t\t0x28\n#define DESC_RATEMCS29\t\t\t\t0x29\n#define DESC_RATEMCS30\t\t\t\t0x2A\n#define DESC_RATEMCS31\t\t\t\t0x2B\n#define DESC_RATEVHTSS1MCS0\t\t0x2C\n#define DESC_RATEVHTSS1MCS1\t\t0x2D\n#define DESC_RATEVHTSS1MCS2\t\t0x2E\n#define DESC_RATEVHTSS1MCS3\t\t0x2F\n#define DESC_RATEVHTSS1MCS4\t\t0x30\n#define DESC_RATEVHTSS1MCS5\t\t0x31\n#define DESC_RATEVHTSS1MCS6\t\t0x32\n#define DESC_RATEVHTSS1MCS7\t\t0x33\n#define DESC_RATEVHTSS1MCS8\t\t0x34\n#define DESC_RATEVHTSS1MCS9\t\t0x35\n#define DESC_RATEVHTSS2MCS0\t\t0x36\n#define DESC_RATEVHTSS2MCS1\t\t0x37\n#define DESC_RATEVHTSS2MCS2\t\t0x38\n#define DESC_RATEVHTSS2MCS3\t\t0x39\n#define DESC_RATEVHTSS2MCS4\t\t0x3A\n#define DESC_RATEVHTSS2MCS5\t\t0x3B\n#define DESC_RATEVHTSS2MCS6\t\t0x3C\n#define DESC_RATEVHTSS2MCS7\t\t0x3D\n#define DESC_RATEVHTSS2MCS8\t\t0x3E\n#define DESC_RATEVHTSS2MCS9\t\t0x3F\n#define DESC_RATEVHTSS3MCS0\t\t0x40\n#define DESC_RATEVHTSS3MCS1\t\t0x41\n#define DESC_RATEVHTSS3MCS2\t\t0x42\n#define DESC_RATEVHTSS3MCS3\t\t0x43\n#define DESC_RATEVHTSS3MCS4\t\t0x44\n#define DESC_RATEVHTSS3MCS5\t\t0x45\n#define DESC_RATEVHTSS3MCS6\t\t0x46\n#define DESC_RATEVHTSS3MCS7\t\t0x47\n#define DESC_RATEVHTSS3MCS8\t\t0x48\n#define DESC_RATEVHTSS3MCS9\t\t0x49\n#define DESC_RATEVHTSS4MCS0\t\t0x4A\n#define DESC_RATEVHTSS4MCS1\t\t0x4B\n#define DESC_RATEVHTSS4MCS2\t\t0x4C\n#define DESC_RATEVHTSS4MCS3\t\t0x4D\n#define DESC_RATEVHTSS4MCS4\t\t0x4E\n#define DESC_RATEVHTSS4MCS5\t\t0x4F\n#define DESC_RATEVHTSS4MCS6\t\t0x50\n#define DESC_RATEVHTSS4MCS7\t\t0x51\n#define DESC_RATEVHTSS4MCS8\t\t0x52\n#define DESC_RATEVHTSS4MCS9\t\t0x53\n\n#define HDATA_RATE(rate)\\\n(rate == DESC_RATE1M)?\"CCK_1M\" :\\\n(rate == DESC_RATE2M)?\"CCK_2M\" :\\\n(rate == DESC_RATE5_5M)?\"CCK5_5M\" :\\\n(rate == DESC_RATE11M)?\"CCK_11M\" :\\\n(rate == DESC_RATE6M)?\"OFDM_6M\" :\\\n(rate == DESC_RATE9M)?\"OFDM_9M\" :\\\n(rate == DESC_RATE12M)?\"OFDM_12M\" :\\\n(rate == DESC_RATE18M)?\"OFDM_18M\" :\\\n(rate == DESC_RATE24M)?\"OFDM_24M\" :\\\n(rate == DESC_RATE36M)?\"OFDM_36M\" :\\\n(rate == DESC_RATE48M)?\"OFDM_48M\" :\\\n(rate == DESC_RATE54M)?\"OFDM_54M\" :\\\n(rate == DESC_RATEMCS0)?\"MCS0\" :\\\n(rate == DESC_RATEMCS1)?\"MCS1\" :\\\n(rate == DESC_RATEMCS2)?\"MCS2\" :\\\n(rate == DESC_RATEMCS3)?\"MCS3\" :\\\n(rate == DESC_RATEMCS4)?\"MCS4\" :\\\n(rate == DESC_RATEMCS5)?\"MCS5\" :\\\n(rate == DESC_RATEMCS6)?\"MCS6\" :\\\n(rate == DESC_RATEMCS7)?\"MCS7\" :\\\n(rate == DESC_RATEMCS8)?\"MCS8\" :\\\n(rate == DESC_RATEMCS9)?\"MCS9\" :\\\n(rate == DESC_RATEMCS10)?\"MCS10\" :\\\n(rate == DESC_RATEMCS11)?\"MCS11\" :\\\n(rate == DESC_RATEMCS12)?\"MCS12\" :\\\n(rate == DESC_RATEMCS13)?\"MCS13\" :\\\n(rate == DESC_RATEMCS14)?\"MCS14\" :\\\n(rate == DESC_RATEMCS15)?\"MCS15\" :\\\n(rate == DESC_RATEMCS16)?\"MCS16\" :\\\n(rate == DESC_RATEMCS17)?\"MCS17\" :\\\n(rate == DESC_RATEMCS18)?\"MCS18\" :\\\n(rate == DESC_RATEMCS19)?\"MCS19\" :\\\n(rate == DESC_RATEMCS20)?\"MCS20\" :\\\n(rate == DESC_RATEMCS21)?\"MCS21\" :\\\n(rate == DESC_RATEMCS22)?\"MCS22\" :\\\n(rate == DESC_RATEMCS23)?\"MCS23\" :\\\n(rate == DESC_RATEVHTSS1MCS0)?\"VHTSS1MCS0\" :\\\n(rate == DESC_RATEVHTSS1MCS1)?\"VHTSS1MCS1\" :\\\n(rate == DESC_RATEVHTSS1MCS2)?\"VHTSS1MCS2\" :\\\n(rate == DESC_RATEVHTSS1MCS3)?\"VHTSS1MCS3\" :\\\n(rate == DESC_RATEVHTSS1MCS4)?\"VHTSS1MCS4\" :\\\n(rate == DESC_RATEVHTSS1MCS5)?\"VHTSS1MCS5\" :\\\n(rate == DESC_RATEVHTSS1MCS6)?\"VHTSS1MCS6\" :\\\n(rate == DESC_RATEVHTSS1MCS7)?\"VHTSS1MCS7\" :\\\n(rate == DESC_RATEVHTSS1MCS8)?\"VHTSS1MCS8\" :\\\n(rate == DESC_RATEVHTSS1MCS9)?\"VHTSS1MCS9\" :\\\n(rate == DESC_RATEVHTSS2MCS0)?\"VHTSS2MCS0\" :\\\n(rate == DESC_RATEVHTSS2MCS1)?\"VHTSS2MCS1\" :\\\n(rate == DESC_RATEVHTSS2MCS2)?\"VHTSS2MCS2\" :\\\n(rate == DESC_RATEVHTSS2MCS3)?\"VHTSS2MCS3\" :\\\n(rate == DESC_RATEVHTSS2MCS4)?\"VHTSS2MCS4\" :\\\n(rate == DESC_RATEVHTSS2MCS5)?\"VHTSS2MCS5\" :\\\n(rate == DESC_RATEVHTSS2MCS6)?\"VHTSS2MCS6\" :\\\n(rate == DESC_RATEVHTSS2MCS7)?\"VHTSS2MCS7\" :\\\n(rate == DESC_RATEVHTSS2MCS8)?\"VHTSS2MCS8\" :\\\n(rate == DESC_RATEVHTSS2MCS9)?\"VHTSS2MCS9\" :\\\n(rate == DESC_RATEVHTSS3MCS0)?\"VHTSS3MCS0\" :\\\n(rate == DESC_RATEVHTSS3MCS1)?\"VHTSS3MCS1\" :\\\n(rate == DESC_RATEVHTSS3MCS2)?\"VHTSS3MCS2\" :\\\n(rate == DESC_RATEVHTSS3MCS3)?\"VHTSS3MCS3\" :\\\n(rate == DESC_RATEVHTSS3MCS4)?\"VHTSS3MCS4\" :\\\n(rate == DESC_RATEVHTSS3MCS5)?\"VHTSS3MCS5\" :\\\n(rate == DESC_RATEVHTSS3MCS6)?\"VHTSS3MCS6\" :\\\n(rate == DESC_RATEVHTSS3MCS7)?\"VHTSS3MCS7\" :\\\n(rate == DESC_RATEVHTSS3MCS8)?\"VHTSS3MCS8\" :\\\n(rate == DESC_RATEVHTSS3MCS9)?\"VHTSS3MCS9\" : \"UNKNOWN\"\n\n\nenum{\n\tUP_LINK,\n\tDOWN_LINK,\t\n};\ntypedef enum _RT_MEDIA_STATUS {\n\tRT_MEDIA_DISCONNECT = 0,\n\tRT_MEDIA_CONNECT       = 1\n} RT_MEDIA_STATUS;\n\n#define MAX_DLFW_PAGE_SIZE\t\t\t4096\t// @ page : 4k bytes\ntypedef enum _FIRMWARE_SOURCE {\n\tFW_SOURCE_IMG_FILE = 0,\n\tFW_SOURCE_HEADER_FILE = 1,\t\t//from header file\n} FIRMWARE_SOURCE, *PFIRMWARE_SOURCE;\n\n//\n// Queue Select Value in TxDesc\n//\n#define QSLT_BK\t\t\t\t\t\t\t0x2//0x01\n#define QSLT_BE\t\t\t\t\t\t\t0x0\n#define QSLT_VI\t\t\t\t\t\t\t0x5//0x4\n#define QSLT_VO\t\t\t\t\t\t\t0x7//0x6\n#define QSLT_BEACON\t\t\t\t\t\t0x10\n#define QSLT_HIGH\t\t\t\t\t\t0x11\n#define QSLT_MGNT\t\t\t\t\t\t0x12\n#define QSLT_CMD\t\t\t\t\t\t0x13\n\n// BK, BE, VI, VO, HCCA, MANAGEMENT, COMMAND, HIGH, BEACON.\n//#define MAX_TX_QUEUE\t\t9\n\n#define TX_SELE_HQ\t\t\tBIT(0)\t\t// High Queue\n#define TX_SELE_LQ\t\t\tBIT(1)\t\t// Low Queue\n#define TX_SELE_NQ\t\t\tBIT(2)\t\t// Normal Queue\n#define TX_SELE_EQ\t\t\tBIT(3)\t\t// Extern Queue\n\n#define PageNum_128(_Len)\t\t(u32)(((_Len)>>7) + ((_Len)&0x7F ? 1:0))\n#define PageNum_256(_Len)\t\t(u32)(((_Len)>>8) + ((_Len)&0xFF ? 1:0))\n#define PageNum_512(_Len)\t\t(u32)(((_Len)>>9) + ((_Len)&0x1FF ? 1:0))\n#define PageNum(_Len, _Size)\t\t(u32)(((_Len)/(_Size)) + ((_Len)&((_Size) - 1) ? 1:0))\n\nstruct dbg_rx_counter\n{\n\tu32\trx_pkt_ok;\n\tu32\trx_pkt_crc_error;\n\tu32\trx_pkt_drop;\t\n\tu32\trx_ofdm_fa;\n\tu32\trx_cck_fa;\n\tu32\trx_ht_fa;\n};\nvoid rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter);\nvoid rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter);\nvoid rtw_reset_mac_rx_counters(_adapter* padapter);\nvoid rtw_reset_phy_rx_counters(_adapter* padapter);\nvoid rtw_reset_phy_trx_ok_counters(_adapter *padapter);\n\n#ifdef DBG_RX_COUNTER_DUMP\n#define DUMP_DRV_RX_COUNTER\tBIT0\n#define DUMP_MAC_RX_COUNTER\tBIT1\n#define DUMP_PHY_RX_COUNTER\tBIT2\n#define DUMP_DRV_TRX_COUNTER_DATA\tBIT3\n\nvoid rtw_dump_phy_rxcnts_preprocess(_adapter* padapter,u8 rx_cnt_mode);\nvoid rtw_dump_rx_counters(_adapter* padapter);\n#endif\n\nvoid dump_chip_info(HAL_VERSION\tChipVersion);\nvoid rtw_hal_config_rftype(PADAPTER  padapter);\n\n#define BAND_CAP_2G\t\t\tBIT0\n#define BAND_CAP_5G\t\t\tBIT1\n#define BAND_CAP_BIT_NUM\t2\n\n#define BW_CAP_5M\t\tBIT0\n#define BW_CAP_10M\t\tBIT1\n#define BW_CAP_20M\t\tBIT2\n#define BW_CAP_40M\t\tBIT3\n#define BW_CAP_80M\t\tBIT4\n#define BW_CAP_160M\t\tBIT5\n#define BW_CAP_80_80M\tBIT6\n#define BW_CAP_BIT_NUM\t7\n\n#define WL_FUNC_P2P\t\t\tBIT0\n#define WL_FUNC_MIRACAST\tBIT1\n#define WL_FUNC_TDLS\t\tBIT2\n#define WL_FUNC_FTM\t\t\tBIT3\n#define WL_FUNC_BIT_NUM\t\t4\n\nvoid dump_hal_spec(void *sel, _adapter *adapter);\n\nbool hal_chk_band_cap(_adapter *adapter, u8 cap);\nbool hal_chk_bw_cap(_adapter *adapter, u8 cap);\nbool hal_is_band_support(_adapter *adapter, u8 band);\nbool hal_is_bw_support(_adapter *adapter, u8 bw);\nu8 hal_largest_bw(_adapter *adapter, u8 in_bw);\n\nu8\t//return the final channel plan decision\nhal_com_config_channel_plan(\n\tIN\tPADAPTER\tpadapter,\n\tIN\tu8\t\t\thw_channel_plan,\t//channel plan from HW (efuse/eeprom)\n\tIN\tu8\t\t\tsw_channel_plan,\t//channel plan from SW (registry/module param)\n\tIN\tu8\t\t\tdef_channel_plan,\t//channel plan used when the former two is invalid\n\tIN\tBOOLEAN\t\tAutoLoadFail\n\t);\n\nint hal_config_macaddr(_adapter *adapter, bool autoload_fail);\n\nBOOLEAN\nHAL_IsLegalChannel(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu32\t\t\tChannel\n\t);\n\nu8\tMRateToHwRate(u8 rate);\n\nu8\tHwRateToMRate(u8 rate);\n\nvoid\tHalSetBrateCfg(\n\tIN PADAPTER\t\tAdapter,\n\tIN u8\t\t\t*mBratesOS,\n\tOUT u16\t\t\t*pBrateCfg);\n\nBOOLEAN\nHal_MappingOutPipe(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu8\t\tNumOutPipe\n\t);\n\nvoid hal_init_macaddr(_adapter *adapter);\n\nvoid rtw_init_hal_com_default_value(PADAPTER Adapter);\n\nvoid c2h_evt_clear(_adapter *adapter);\ns32 c2h_evt_read(_adapter *adapter, u8 *buf);\ns32 c2h_evt_read_88xx(_adapter *adapter, u8 *buf);\n\nu8  rtw_hal_networktype_to_raid(_adapter *adapter, struct sta_info *psta);\nu8 rtw_get_mgntframe_raid(_adapter *adapter,unsigned char network_type);\nvoid rtw_hal_update_sta_rate_mask(PADAPTER padapter, struct sta_info *psta);\n\n/* access HW only */\nu32 rtw_sec_read_cam(_adapter *adapter, u8 addr);\nvoid rtw_sec_write_cam(_adapter *adapter, u8 addr, u32 wdata);\nvoid rtw_sec_read_cam_ent(_adapter *adapter, u8 id, u8 *ctrl, u8 *mac, u8 *key);\nvoid rtw_sec_write_cam_ent(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key);\nbool rtw_sec_read_cam_is_gk(_adapter *adapter, u8 id);\n\nvoid hw_var_port_switch(_adapter *adapter);\n\nvoid SetHwReg(PADAPTER padapter, u8 variable, u8 *val);\nvoid GetHwReg(PADAPTER padapter, u8 variable, u8 *val);\nvoid rtw_hal_check_rxfifo_full(_adapter *adapter);\n\nu8 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);\nu8 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);\n\nBOOLEAN \neqNByte(\n\tu8*\tstr1,\n\tu8*\tstr2,\n\tu32\tnum\n\t);\n\nBOOLEAN \nIsHexDigit(\n\tIN\tchar\tchTmp\n\t);\n\nu32\nMapCharToHexDigit(\n\tIN\tchar\tchTmp\n);\n\nBOOLEAN \nGetHexValueFromString(\n\tIN\t\tchar*\t\t\tszStr,\n\tIN OUT\tu32*\t\t\tpu4bVal,\n\tIN OUT\tu32*\t\t\tpu4bMove\n\t);\n\nBOOLEAN \nGetFractionValueFromString(\n\tIN\t\tchar*\t\tszStr,\n\tIN OUT\tu8*\t\t\tpInteger,\n\tIN OUT\tu8*\t\t\tpFraction,\n\tIN OUT\tu32*\t\tpu4bMove\n\t);\n\nBOOLEAN\nIsCommentString(\n\tIN\t\tchar*\t\tszStr\n\t);\n\nBOOLEAN \nParseQualifiedString(\n    IN\tchar* In, \n    IN OUT  u32* Start, \n    OUT\tchar* Out, \n    IN\tchar  LeftQualifier, \n    IN\tchar  RightQualifier\n    );\n\nBOOLEAN\nGetU1ByteIntegerFromStringInDecimal(\n\tIN\t\tchar* Str,\n\tIN OUT\tu8* pInt\n\t);\n\nBOOLEAN\nisAllSpaceOrTab(\n\tu8*\tdata,\n\tu8\tsize\n\t);\n\nvoid linked_info_dump(_adapter *padapter,u8 benable);\n#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA\nvoid rtw_get_raw_rssi_info(void *sel, _adapter *padapter);\nvoid rtw_dump_raw_rssi_info(_adapter *padapter);\n#endif\n\n#ifdef DBG_RX_DFRAME_RAW_DATA\n\tvoid rtw_dump_rx_dframe_info(_adapter *padapter, void *sel);\n#endif\nvoid rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe);\n#define\t\tHWSET_MAX_SIZE\t\t\t512\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n#define\t\tEFUSE_FILE_COLUMN_NUM\t\t16\nu32 Hal_readPGDataFromConfigFile(PADAPTER padapter);\nu32 Hal_ReadMACAddrFromFile(PADAPTER padapter, u8 *mac_addr);\n#endif /* CONFIG_EFUSE_CONFIG_FILE */\n\nint check_phy_efuse_tx_power_info_valid(PADAPTER padapter);\nint hal_efuse_macaddr_offset(_adapter *adapter);\nint Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8 *mac_addr);\n\n#ifdef CONFIG_RF_GAIN_OFFSET\nvoid rtw_bb_rf_gain_offset(_adapter *padapter);\n#endif //CONFIG_RF_GAIN_OFFSET\n\nvoid dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer);\nu8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel);\nvoid GetHalODMVar(\t\n\tPADAPTER\t\t\t\tAdapter,\n\tHAL_ODM_VARIABLE\t\teVariable,\n\tPVOID\t\t\t\t\tpValue1,\n\tPVOID\t\t\t\t\tpValue2);\nvoid SetHalODMVar(\n\tPADAPTER\t\t\t\tAdapter,\n\tHAL_ODM_VARIABLE\t\teVariable,\n\tPVOID\t\t\t\t\tpValue1,\n\tBOOLEAN\t\t\t\t\tbSet);\n\n#ifdef CONFIG_BACKGROUND_NOISE_MONITOR\nstruct noise_info\n{\n\tu8 \t\tbPauseDIG;\n\tu8 \t\tIGIValue;\n\tu32 \tmax_time;//ms\t\n\tu8\t\tchan;\n};\n#endif\n\nvoid rtw_get_noise(_adapter* padapter);\nu8 rtw_get_current_tx_rate(_adapter *padapter, u8 macid);\nu8 rtw_get_current_tx_sgi(_adapter *padapter, u8 macid);\n\nvoid rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished);\n\n#ifdef CONFIG_GPIO_API\nu8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num);\nint rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, bool isHigh);\nint rtw_hal_config_gpio(_adapter* adapter, u8 gpio_num, bool isOutput);\nint rtw_hal_register_gpio_interrupt(_adapter* adapter, int gpio_num, void(*callback)(u8 level));\nint rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num);\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nvoid rtw_hal_set_output_gpio(_adapter *padapter, u8 index, u8 outputval);\n#endif\n\ntypedef enum _HAL_PHYDM_OPS {\n\tHAL_PHYDM_DIS_ALL_FUNC,\n\tHAL_PHYDM_FUNC_SET,\n\tHAL_PHYDM_FUNC_CLR,\n\tHAL_PHYDM_ABILITY_BK,\n\tHAL_PHYDM_ABILITY_RESTORE,\n\tHAL_PHYDM_ABILITY_SET,\n\tHAL_PHYDM_ABILITY_GET,\n} HAL_PHYDM_OPS;\n\n\n#define DYNAMIC_FUNC_DISABLE\t\t(0x0)\nu32 rtw_phydm_ability_ops(_adapter *adapter, HAL_PHYDM_OPS ops, u32 ability);\n\n#define rtw_phydm_func_disable_all(adapter)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_DIS_ALL_FUNC, 0)\n\n#define rtw_phydm_func_for_offchannel(adapter) \\\n\tdo { \\\n\t\trtw_phydm_ability_ops(adapter, HAL_PHYDM_DIS_ALL_FUNC, 0); \\\n\t\tif (rtw_odm_adaptivity_needed(adapter)) \\\n\t\t\trtw_phydm_ability_ops(adapter, HAL_PHYDM_FUNC_SET, ODM_BB_ADAPTIVITY); \\\n\t} while (0)\n\n#define rtw_phydm_func_set(adapter, ability)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_FUNC_SET, ability)\n\n#define rtw_phydm_func_clr(adapter, ability)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_FUNC_CLR, ability)\n\n#define rtw_phydm_ability_backup(adapter)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_ABILITY_BK, 0)\n\n#define rtw_phydm_ability_restore(adapter)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_ABILITY_RESTORE, 0)\n\n#define rtw_phydm_ability_set(adapter, ability)\t\\\n\trtw_phydm_ability_ops(adapter, HAL_PHYDM_ABILITY_SET, ability)\n\nstatic inline u32 rtw_phydm_ability_get(_adapter *adapter)\n{\n\treturn rtw_phydm_ability_ops(adapter, HAL_PHYDM_ABILITY_GET, 0);\n}\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nextern char *rtw_phy_file_path;\nextern char rtw_phy_para_file_path[PATH_LENGTH_MAX];\n#define GetLineFromBuffer(buffer)   strsep(&buffer, \"\\n\")\n#endif\n\n#ifdef CONFIG_FW_C2H_DEBUG\nvoid Debug_FwC2H(PADAPTER padapter, u8 *pdata, u8 len);\n#endif\n/*CONFIG_FW_C2H_DEBUG*/\n\nvoid update_IOT_info(_adapter *padapter);\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\nvoid rtw_acs_start(_adapter *padapter, bool bStart);\n#endif\n\nvoid hal_set_crystal_cap(_adapter *adapter, u8 crystal_cap);\n\n#endif //__HAL_COMMON_H__\n\n"
  },
  {
    "path": "include/hal_com_h2c.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __COMMON_H2C_H__\n#define __COMMON_H2C_H__\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD DEFINITION    ------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n// 88e, 8723b, 8812, 8821, 92e use the same FW code base\nenum h2c_cmd{\n\t//Common Class: 000\n\tH2C_RSVD_PAGE = 0x00,\n\tH2C_MEDIA_STATUS_RPT = 0x01,\n\tH2C_SCAN_ENABLE = 0x02,\n\tH2C_KEEP_ALIVE = 0x03,\n\tH2C_DISCON_DECISION = 0x04,\t\n\tH2C_PSD_OFFLOAD = 0x05,\t\n\tH2C_AP_OFFLOAD = 0x08,\t\n\tH2C_BCN_RSVDPAGE = 0x09,\t\n\tH2C_PROBERSP_RSVDPAGE = 0x0A,\t\n\tH2C_FCS_RSVDPAGE = 0x10,\t\n\tH2C_FCS_INFO = 0x11,\t\n\tH2C_AP_WOW_GPIO_CTRL = 0x13,\n\n\t//PoweSave Class: 001\n\tH2C_SET_PWR_MODE = 0x20,\n\tH2C_PS_TUNING_PARA = 0x21,\n\tH2C_PS_TUNING_PARA2 = 0x22,\n\tH2C_P2P_LPS_PARAM = 0x23,\t\n\tH2C_P2P_PS_OFFLOAD = 0x24,\t\n\tH2C_PS_SCAN_ENABLE = 0x25,\t\n\tH2C_SAP_PS_ = 0x26,\t\n\tH2C_INACTIVE_PS_ = 0x27, //Inactive_PS\n\tH2C_FWLPS_IN_IPS_ = 0x28,\n\t\n\t//Dynamic Mechanism Class: 010\n\tH2C_MACID_CFG = 0x40,\n\tH2C_TXBF = 0x41,\t\n\tH2C_RSSI_SETTING = 0x42,\t\n\tH2C_AP_REQ_TXRPT = 0x43,\t\n\tH2C_INIT_RATE_COLLECT = 0x44,\t\n\tH2C_IQ_CALIBRATION\t= 0x45,\n\n\tH2C_RA_MASK_3SS = 0x46,/* for 8814A */\n\tH2C_RA_PARA_ADJUST = 0x47,/* CONFIG_RA_DBG_CMD */\n\tH2C_DYNAMIC_TX_PATH = 0x48,/* for 8814A */\n\n\tH2C_FW_TRACE_EN = 0x49,\n\t\n\t//BT Class: 011\n\tH2C_B_TYPE_TDMA = 0x60,\n\tH2C_BT_INFO = 0x61,\n\tH2C_FORCE_BT_TXPWR = 0x62,\n\tH2C_BT_IGNORE_WLANACT = 0x63,\n\tH2C_DAC_SWING_VALUE = 0x64,\n\tH2C_ANT_SEL_RSV = 0x65,\n\tH2C_WL_OPMODE = 0x66,\n\tH2C_BT_MP_OPER = 0x67,\n\tH2C_BT_CONTROL = 0x68,\n\tH2C_BT_WIFI_CTRL = 0x69,\n\tH2C_BT_FW_PATCH = 0x6A,\n\t\n\t//WOWLAN Class: 100\n\tH2C_WOWLAN = 0x80,\n\tH2C_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_AOAC_GLOBAL_INFO = 0x82,\t\n\tH2C_AOAC_RSVD_PAGE = 0x83,\t\n\tH2C_AOAC_RSVD_PAGE2 = 0x84,\n\tH2C_D0_SCAN_OFFLOAD_CTRL = 0x85,\n\tH2C_D0_SCAN_OFFLOAD_INFO = 0x86,\n\tH2C_CHNL_SWITCH_OFFLOAD = 0x87,\n\tH2C_AOAC_RSVDPAGE3 = 0x88,\n\tH2C_P2P_OFFLOAD_RSVD_PAGE = 0x8A,\n\tH2C_P2P_OFFLOAD = 0x8B,\n\n\tH2C_RESET_TSF = 0xC0,\n\tH2C_BCNHWSEQ = 0xC5,\n\tH2C_MAXID,\n};\n\n#define H2C_INACTIVE_PS_LEN\t\t3\n#define H2C_RSVDPAGE_LOC_LEN\t\t5\n#define H2C_MEDIA_STATUS_RPT_LEN\t\t3\n#define H2C_KEEP_ALIVE_CTRL_LEN\t2\n#define H2C_DISCON_DECISION_LEN\t \t3\n#define H2C_AP_OFFLOAD_LEN\t\t3\n#define H2C_AP_WOW_GPIO_CTRL_LEN\t4\n#define H2C_AP_PS_LEN\t\t\t2\n#define H2C_PWRMODE_LEN\t\t\t7\n#define H2C_PSTUNEPARAM_LEN\t\t\t4\n#define H2C_MACID_CFG_LEN\t \t7\n#define H2C_BTMP_OPER_LEN\t\t\t5\n#define H2C_WOWLAN_LEN\t\t\t5\n#define H2C_REMOTE_WAKE_CTRL_LEN\t3\n#define H2C_AOAC_GLOBAL_INFO_LEN\t2\n#define H2C_AOAC_RSVDPAGE_LOC_LEN\t7\n#define H2C_SCAN_OFFLOAD_CTRL_LEN\t4\n#define H2C_BT_FW_PATCH_LEN\t\t\t6\n#define H2C_RSSI_SETTING_LEN\t\t4\n#define H2C_AP_REQ_TXRPT_LEN\t\t2\n#define H2C_FORCE_BT_TXPWR_LEN\t\t3\n#define H2C_BCN_RSVDPAGE_LEN\t\t5\n#define H2C_PROBERSP_RSVDPAGE_LEN\t5\n#define H2C_P2PRSVDPAGE_LOC_LEN\t5\n#define H2C_P2P_OFFLOAD_LEN\t3\n\n#define eqMacAddr(a,b)\t\t\t\t\t\t( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )\n#define cpMacAddr(des,src)\t\t\t\t\t((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])\n#define cpIpAddr(des,src)\t\t\t\t\t((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3])\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n//\n// ARP packet\n//\n// LLC Header\n#define GET_ARP_PKT_LLC_TYPE(__pHeader) \t\t\t\t\tReadEF2Byte( ((u8*)(__pHeader)) + 6)\n\n//ARP element\n#define GET_ARP_PKT_OPERATION(__pHeader) \t\t\t\tReadEF2Byte(((u8*)(__pHeader)) + 6)\n#define GET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) \tcpMacAddr((u8*)(_val), ((u8*)(__pHeader))+8)\n#define GET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) \t\tcpIpAddr((u8*)(_val), ((u8*)(__pHeader))+14)\n#define GET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) \tcpMacAddr((u8*)(_val), ((u8*)(__pHeader))+18)\n#define GET_ARP_PKT_TARGET_IP_ADDR(__pHeader, _val) \tcpIpAddr((u8*)(_val), ((u8*)(__pHeader))+24)\n\n#define SET_ARP_PKT_HW(__pHeader, __Value)  \t\t\t\tWriteEF2Byte( ((u8*)(__pHeader)) + 0, __Value)\n#define SET_ARP_PKT_PROTOCOL(__pHeader, __Value)  \t\t\tWriteEF2Byte( ((u8*)(__pHeader)) + 2, __Value)\n#define SET_ARP_PKT_HW_ADDR_LEN(__pHeader, __Value)  \t\tWriteEF1Byte( ((u8*)(__pHeader)) + 4, __Value)\n#define SET_ARP_PKT_PROTOCOL_ADDR_LEN(__pHeader, __Value)  \tWriteEF1Byte( ((u8*)(__pHeader)) + 5, __Value)\n#define SET_ARP_PKT_OPERATION(__pHeader, __Value) \t\tWriteEF2Byte( ((u8*)(__pHeader)) + 6, __Value)\n#define SET_ARP_PKT_SENDER_MAC_ADDR(__pHeader, _val) \tcpMacAddr(((u8*)(__pHeader))+8, (u8*)(_val))\n#define SET_ARP_PKT_SENDER_IP_ADDR(__pHeader, _val) \t\tcpIpAddr(((u8*)(__pHeader))+14, (u8*)(_val))\n#define SET_ARP_PKT_TARGET_MAC_ADDR(__pHeader, _val) \tcpMacAddr(((u8*)(__pHeader))+18, (u8*)(_val))\n#define SET_ARP_PKT_TARGET_IP_ADDR(__pHeader, _val) \t\tcpIpAddr(((u8*)(__pHeader))+24, (u8*)(_val))\n\n#define FW_WOWLAN_FUN_EN\t\t\t\tBIT(0)\n#define FW_WOWLAN_PATTERN_MATCH\t\t\tBIT(1)\n#define FW_WOWLAN_MAGIC_PKT\t\t\t\tBIT(2)\n#define FW_WOWLAN_UNICAST\t\t\t\tBIT(3)\n#define FW_WOWLAN_ALL_PKT_DROP\t\t\tBIT(4)\n#define FW_WOWLAN_GPIO_ACTIVE\t\t\tBIT(5)\n#define FW_WOWLAN_REKEY_WAKEUP\t\t\tBIT(6)\n#define FW_WOWLAN_DEAUTH_WAKEUP\t\t\tBIT(7)\n\n#define FW_WOWLAN_GPIO_WAKEUP_EN\t\tBIT(0)\n#define FW_FW_PARSE_MAGIC_PKT\t\t\tBIT(1)\n\n#define FW_REMOTE_WAKE_CTRL_EN\t\t\tBIT(0)\n#define FW_REALWOWLAN_EN\t\t\t\tBIT(5)\n\n#define FW_WOWLAN_KEEP_ALIVE_EN\t\t\tBIT(0)\n#define FW_ADOPT_USER\t\t\t\t\tBIT(1)\n#define FW_WOWLAN_KEEP_ALIVE_PKT_TYPE\tBIT(2)\n\n#define FW_REMOTE_WAKE_CTRL_EN\t\t\tBIT(0)\n#define FW_ARP_EN\t\t\t\t\t\tBIT(1)\n#define FW_REALWOWLAN_EN\t\t\t\tBIT(5)\n#define FW_WOW_FW_UNICAST_EN\t\t\tBIT(7)\n\n#endif //CONFIG_WOWLAN\n\n//_RSVDPAGE_LOC_CMD_0x00\n#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD_0x01\n#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_KEEP_ALIVE_CMD_0x03\n#define SET_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n\n//_DISCONNECT_DECISION_CMD_0x04\n#define SET_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_AP_Offload 0x08\n#define SET_H2CCMD_AP_WOWLAN_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n//_BCN_RsvdPage\t0x09\n#define SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_BCN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n//_Probersp_RsvdPage 0x0a\n#define SET_H2CCMD_AP_WOWLAN_RSVDPAGE_LOC_ProbeRsp(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n//_Probersp_RsvdPage 0x13\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_INDEX(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_C2H_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_PLUS(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_HIGH_ACTIVE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_DURATION(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_H2CCMD_AP_WOW_GPIO_CTRL_C2H_DURATION(__pH2CCmd, __Value)SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n//_AP_PS 0x26\n#define SET_H2CCMD_AP_WOW_PS_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_AP_WOW_PS_32K_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_AP_WOW_PS_RF(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_H2CCMD_AP_WOW_PS_DURATION(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n\n// _WoWLAN PARAM_CMD_0x80\n#define SET_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_H2CCMD_WOWLAN_ALL_PKT_DROP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_H2CCMD_WOWLAN_GPIO_ACTIVE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n#define SET_H2CCMD_WOWLAN_REKEY_WAKE_UP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)\n#define SET_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)\n#define SET_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 7, __Value)\n#define SET_H2CCMD_WOWLAN_DATAPIN_WAKE_UP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 7, 1, __Value)\n#define SET_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_H2CCMD_WOWLAN_GPIO_PULSE_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 1, __Value)\n#define SET_H2CCMD_WOWLAN_GPIO_PULSE_COUNT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 1, 7, __Value)\n#define SET_H2CCMD_WOWLAN_LOWPR_RX(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 1, __Value)\n#define SET_H2CCMD_WOWLAN_CHANGE_UNIT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 2, 1, __Value)\n// _REMOTE_WAKEUP_CMD_0x81\n#define SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_P2P_OFFLAD_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_NBNS_FILTER_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 2, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 1, __Value)\n#define SET_H2CCMD_REMOTE_WAKE_CTRL_FW_PARSING_UNTIL_WAKEUP(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 4, 1, __Value)\n\n// AOAC_GLOBAL_INFO_0x82\n#define SET_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n\n// AOAC_RSVDPAGE_LOC_0x83\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd), 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#ifdef CONFIG_GTK_OL\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n#endif //CONFIG_GTK_OL\n#ifdef CONFIG_PNO_SUPPORT\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd), 0, 8, __Value)\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n// D0_Scan_Offload_Info_0x86\n#define SET_H2CCMD_AOAC_NLO_FUN_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 3, 1, __Value)\n#define SET_H2CCMD_AOAC_NLO_IPS_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 4, 1, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_PROBE_PACKET(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SCAN_INFO(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_H2CCMD_AOAC_RSVDPAGE_LOC_SSID_INFO(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#endif //CONFIG_PNO_SUPPORT\n\n#ifdef CONFIG_P2P_WOWLAN\n//P2P_RsvdPage_0x8a\n#define SET_H2CCMD_RSVDPAGE_LOC_P2P_BCN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_P2P_PROBE_RSP(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_P2P_NEGO_RSP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_P2P_INVITE_RSP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#endif //CONFIG_P2P_WOWLAN\n\n//---------------------------------------------------------------------------------------------------------//\n//-------------------------------------------    Structure    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\ntypedef struct _RSVDPAGE_LOC {\n\tu8 LocProbeRsp;\n\tu8 LocPsPoll;\n\tu8 LocNullData;\n\tu8 LocQosNull;\n\tu8 LocBTQosNull;\n#ifdef CONFIG_WOWLAN\n\tu8 LocRemoteCtrlInfo;\n\tu8 LocArpRsp;\n\tu8 LocNbrAdv;\n\tu8 LocGTKRsp;\n\tu8 LocGTKInfo;\n\tu8 LocProbeReq;\n\tu8 LocNetList;\n#ifdef CONFIG_GTK_OL\n\tu8 LocGTKEXTMEM;\n#endif //CONFIG_GTK_OL\n#ifdef CONFIG_PNO_SUPPORT\n\tu8 LocPNOInfo;\n\tu8 LocScanInfo;\n\tu8 LocSSIDInfo;\n\tu8 LocProbePacket;\n#endif //CONFIG_PNO_SUPPORT\n#endif //CONFIG_WOWLAN\t\n\tu8 LocApOffloadBCN;\n#ifdef CONFIG_P2P_WOWLAN\n\tu8 LocP2PBeacon;\n\tu8 LocP2PProbeRsp;\n\tu8 LocNegoRsp;\n\tu8 LocInviteRsp;\n\tu8 LocPDRsp;\n#endif //CONFIG_P2P_WOWLAN\n} RSVDPAGE_LOC, *PRSVDPAGE_LOC;\n\n#endif\nvoid dump_TX_FIFO(PADAPTER padapter, u8 page_num, u16 page_size);\nu8 rtw_hal_set_fw_media_status_cmd(_adapter* adapter, u8 mstatus, u8 macid);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n//WOW command function\nvoid rtw_hal_set_fw_wow_related_cmd(_adapter* padapter, u8 enable);\n#ifdef CONFIG_P2P_WOWLAN\n//H2C 0x8A\nu8 rtw_hal_set_FwP2PRsvdPage_cmd(_adapter* adapter, PRSVDPAGE_LOC rsvdpageloc);\n//H2C 0x8B\nu8 rtw_hal_set_p2p_wowlan_offload_cmd(_adapter* adapter);\n#endif //CONFIG_P2P_WOWLAN\n#endif\n"
  },
  {
    "path": "include/hal_com_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_COMMON_LED_H_\n#define __HAL_COMMON_LED_H_\n\n\n#define MSECS(t)        (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)\n\n//================================================================================\n//\tLED Behavior Constant.\n//================================================================================\n// Default LED behavior.\n//\n#define LED_BLINK_NORMAL_INTERVAL\t100\n#define LED_BLINK_SLOWLY_INTERVAL\t200\n#define LED_BLINK_LONG_INTERVAL\t400\n#define LED_INITIAL_INTERVAL\t\t1800\n\n// LED Customerization\n\n//NETTRONIX\n#define LED_BLINK_NORMAL_INTERVAL_NETTRONIX\t100\n#define LED_BLINK_SLOWLY_INTERVAL_NETTRONIX\t2000\n\n//PORNET\n#define LED_BLINK_SLOWLY_INTERVAL_PORNET\t1000\n#define LED_BLINK_NORMAL_INTERVAL_PORNET\t100\n#define LED_BLINK_FAST_INTERVAL_BITLAND\t\t30\n\n//AzWave.\n#define LED_CM2_BLINK_ON_INTERVAL\t\t250\n#define LED_CM2_BLINK_OFF_INTERVAL\t\t4750\n#define LED_CM8_BLINK_OFF_INTERVAL\t\t3750\t//for QMI\n\n//RunTop\n#define LED_RunTop_BLINK_INTERVAL\t\t300\n\n//ALPHA\n#define LED_BLINK_NO_LINK_INTERVAL_ALPHA\t1000\n#define LED_BLINK_NO_LINK_INTERVAL_ALPHA_500MS 500 //add by ylb 20121012 for customer led for alpha\n#define LED_BLINK_LINK_INTERVAL_ALPHA\t\t500\t//500\n#define LED_BLINK_SCAN_INTERVAL_ALPHA\t\t180 \t//150\n#define LED_BLINK_FASTER_INTERVAL_ALPHA\t\t50\n#define LED_BLINK_WPS_SUCESS_INTERVAL_ALPHA\t5000\n\n// 111122 by hpfan: Customized for Xavi\n#define LED_CM11_BLINK_INTERVAL\t\t\t300\n#define LED_CM11_LINK_ON_INTERVEL\t\t3000\n\n//Netgear\n#define LED_BLINK_LINK_INTERVAL_NETGEAR\t\t500\n#define LED_BLINK_LINK_SLOWLY_INTERVAL_NETGEAR\t\t1000\n\n#define LED_WPS_BLINK_OFF_INTERVAL_NETGEAR\t\t100\n#define LED_WPS_BLINK_ON_INTERVAL_NETGEAR\t\t500\n\n//Belkin AC950\n#define LED_BLINK_LINK_INTERVAL_ON_BELKIN\t\t200\n#define LED_BLINK_LINK_INTERVAL_OFF_BELKIN\t\t100\n#define LED_BLINK_ERROR_INTERVAL_BELKIN\t\t100\n\n//by chiyokolin for Azurewave\n#define LED_CM12_BLINK_INTERVAL_5Mbps\t\t160\n#define LED_CM12_BLINK_INTERVAL_10Mbps\t\t80\n#define LED_CM12_BLINK_INTERVAL_20Mbps\t\t50\n#define LED_CM12_BLINK_INTERVAL_40Mbps\t\t40\n#define LED_CM12_BLINK_INTERVAL_80Mbps\t\t30\n#define LED_CM12_BLINK_INTERVAL_MAXMbps\t\t25\n\n//Dlink\n#define\tLED_BLINK_NO_LINK_INTERVAL\t\t1000\n#define\tLED_BLINK_LINK_IDEL_INTERVAL\t\t100\n\n#define\tLED_BLINK_SCAN_ON_INTERVAL\t\t30\n#define\tLED_BLINK_SCAN_OFF_INTERVAL\t\t300\n\n#define LED_WPS_BLINK_ON_INTERVAL_DLINK\t\t30\n#define LED_WPS_BLINK_OFF_INTERVAL_DLINK\t\t\t300\n#define LED_WPS_BLINK_LINKED_ON_INTERVAL_DLINK\t\t\t5000\n\n//================================================================================\n// LED object.\n//================================================================================\n\ntypedef enum _LED_CTL_MODE{\n\tLED_CTL_POWER_ON = 1,\n\tLED_CTL_LINK = 2,\n\tLED_CTL_NO_LINK = 3,\n\tLED_CTL_TX = 4,\n\tLED_CTL_RX = 5,\n\tLED_CTL_SITE_SURVEY = 6,\n\tLED_CTL_POWER_OFF = 7,\n\tLED_CTL_START_TO_LINK = 8,\n\tLED_CTL_START_WPS = 9,\n\tLED_CTL_STOP_WPS = 10,\n\tLED_CTL_START_WPS_BOTTON = 11, //added for runtop\n\tLED_CTL_STOP_WPS_FAIL = 12, //added for ALPHA\t\n\tLED_CTL_STOP_WPS_FAIL_OVERLAP = 13, //added for BELKIN\n\tLED_CTL_CONNECTION_NO_TRANSFER = 14,\n}LED_CTL_MODE;\n\ntypedef\tenum _LED_STATE{\n\tLED_UNKNOWN = 0,\n\tRTW_LED_ON = 1,\n\tRTW_LED_OFF = 2,\n\tLED_BLINK_NORMAL = 3,\n\tLED_BLINK_SLOWLY = 4,\n\tLED_BLINK_POWER_ON = 5,\n\tLED_BLINK_SCAN = 6, \t// LED is blinking during scanning period, the # of times to blink is depend on time for scanning.\n\tLED_BLINK_NO_LINK = 7, // LED is blinking during no link state.\n\tLED_BLINK_StartToBlink = 8, // Customzied for Sercomm Printer Server case\n\tLED_BLINK_TXRX = 9,\n\tLED_BLINK_WPS = 10,\t// LED is blinkg during WPS communication\n\tLED_BLINK_WPS_STOP = 11,\t//for ALPHA\n\tLED_BLINK_WPS_STOP_OVERLAP = 12,\t//for BELKIN\n\tLED_BLINK_RUNTOP = 13, \t// Customized for RunTop\n\tLED_BLINK_CAMEO = 14,\n\tLED_BLINK_XAVI = 15,\n\tLED_BLINK_ALWAYS_ON = 16,\n\tLED_BLINK_LINK_IN_PROCESS = 17,  //Customized for Belkin AC950\n\tLED_BLINK_AUTH_ERROR = 18,  //Customized for Belkin AC950\n\tLED_BLINK_Azurewave_5Mbps = 19,\n\tLED_BLINK_Azurewave_10Mbps = 20,\n\tLED_BLINK_Azurewave_20Mbps = 21,\n\tLED_BLINK_Azurewave_40Mbps = 22,\n\tLED_BLINK_Azurewave_80Mbps = 23,\n\tLED_BLINK_Azurewave_MAXMbps = 24,\n\tLED_BLINK_LINK_IDEL = 25,\n\tLED_BLINK_WPS_LINKED = 26,\n}LED_STATE;\n\ntypedef enum _LED_PIN{\n\tLED_PIN_GPIO0,\n\tLED_PIN_LED0,\n\tLED_PIN_LED1,\n\tLED_PIN_LED2\n}LED_PIN;\n\n\n//================================================================================\n// PCIE LED Definition.\n//================================================================================\n#ifdef CONFIG_PCI_HCI\ntypedef\tenum _LED_STRATEGY_PCIE{\n\tSW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.\n\tSW_LED_MODE1, // SW control for PCI Express\n\tSW_LED_MODE2, // SW control for Cameo.\n\tSW_LED_MODE3, // SW contorl for RunTop.\n\tSW_LED_MODE4, // SW control for Netcore\n\tSW_LED_MODE5, //added by vivi, for led new mode, DLINK\n\tSW_LED_MODE6, //added by vivi, for led new mode, PRONET\n\tSW_LED_MODE7, //added by chiyokolin, for Lenovo, PCI Express Minicard Spec Rev.1.2 spec\n\tSW_LED_MODE8, //added by chiyokolin, for QMI\n\tSW_LED_MODE9, //added by chiyokolin, for BITLAND-LENOVO, PCI Express Minicard Spec Rev.1.1 \t\n\tSW_LED_MODE10, //added by chiyokolin, for Edimax-ASUS\n\tSW_LED_MODE11,\t//added by hpfan, for Xavi\n\tSW_LED_MODE12,\t//added by chiyokolin, for Azurewave\n\tHW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes)\n}LED_STRATEGY_PCIE, *PLED_STRATEGY_PCIE;\n\ntypedef struct _LED_PCIE{\n\tPADAPTER\t\tpadapter;\n\n\tLED_PIN\t\t\tLedPin;\t// Identify how to implement this SW led.\n\n\tLED_STATE\t\tCurrLedState; // Current LED state.\n\tBOOLEAN\t\t\tbLedOn; // TRUE if LED is ON, FALSE if LED is OFF.\n\n\tBOOLEAN\t\t\tbLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w..\n\tBOOLEAN\t\t\tbLedWPSBlinkInProgress; // TRUE if it is blinking, FALSE o.w..\n\n\tBOOLEAN\t\t\tbLedSlowBlinkInProgress;//added by vivi, for led new mode\n\tu32\t\t\t\tBlinkTimes; // Number of times to toggle led state for blinking.\n\tLED_STATE\t\tBlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are.\n\n\t_timer\t\t\tBlinkTimer; // Timer object for led blinking.\n} LED_PCIE, *PLED_PCIE;\n\ntypedef struct _LED_PCIE\tLED_DATA, *PLED_DATA;\ntypedef enum _LED_STRATEGY_PCIE\tLED_STRATEGY, *PLED_STRATEGY;\n\nVOID\nLedControlPCIE(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n\t);\n\nVOID\ngen_RefreshLedState(\n\tIN\tPADAPTER\t\tAdapter);\n\n//================================================================================\n// USB  LED Definition.\n//================================================================================\n#elif defined(CONFIG_USB_HCI)\n\n#define IS_LED_WPS_BLINKING(_LED_USB)\t(((PLED_USB)_LED_USB)->CurrLedState==LED_BLINK_WPS \\\n\t\t\t\t\t|| ((PLED_USB)_LED_USB)->CurrLedState==LED_BLINK_WPS_STOP \\\n\t\t\t\t\t|| ((PLED_USB)_LED_USB)->bLedWPSBlinkInProgress)\n\n#define IS_LED_BLINKING(_LED_USB) \t(((PLED_USB)_LED_USB)->bLedWPSBlinkInProgress \\\n\t\t\t\t\t||((PLED_USB)_LED_USB)->bLedScanBlinkInProgress)\n\n\ntypedef\tenum _LED_STRATEGY_USB{\n\tSW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.\n\tSW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA.\n\tSW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard.\n\tSW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case.\n\tSW_LED_MODE4, //for Edimax / Belkin\n\tSW_LED_MODE5, //for Sercomm / Belkin\t\n\tSW_LED_MODE6,\t//for 88CU minicard, porting from ce SW_LED_MODE7\n\tSW_LED_MODE7,\t//for Netgear special requirement\n\tSW_LED_MODE8, //for LC\n\tSW_LED_MODE9, //for Belkin AC950\n\tSW_LED_MODE10, //for Netgear A6200V2\n\tSW_LED_MODE11, //for Edimax / ASUS\n\tSW_LED_MODE12, //for WNC/NEC\n\tSW_LED_MODE13, //for Netgear A6100, 8811Au\n\tSW_LED_MODE14, //for Buffalo, DNI, 8811Au\n\tSW_LED_MODE15, //for DLINK,  8811Au/8812AU\t\n\tHW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.)\n}LED_STRATEGY_USB, *PLED_STRATEGY_USB;\n\n\ntypedef struct _LED_USB{\n\tPADAPTER\t\t\tpadapter;\n\n\tLED_PIN\t\t\t\tLedPin;\t// Identify how to implement this SW led.\n\n\tLED_STATE\t\t\tCurrLedState; // Current LED state.\n\tBOOLEAN\t\t\t\tbLedOn; // TRUE if LED is ON, FALSE if LED is OFF.\n\n\tBOOLEAN\t\t\t\tbSWLedCtrl;\n\n\tBOOLEAN\t\t\t\tbLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w..\n\t// ALPHA, added by chiyoko, 20090106\n\tBOOLEAN\t\t\t\tbLedNoLinkBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedLinkBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedStartToLinkBlinkInProgress;\t\n\tBOOLEAN\t\t\t\tbLedScanBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedWPSBlinkInProgress;\n\t\n\tu32\t\t\t\t\tBlinkTimes; // Number of times to toggle led state for blinking.\n\tu8\t\t\t\t\tBlinkCounter; //Added for turn off overlap led after blinking a while, by page, 20120821\n\tLED_STATE\t\t\tBlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are.\n\n\t_timer\t\t\t\tBlinkTimer; // Timer object for led blinking.\n\n\t_workitem\t\t\tBlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED.'\n} LED_USB, *PLED_USB;\n\ntypedef struct _LED_USB\tLED_DATA, *PLED_DATA;\ntypedef enum _LED_STRATEGY_USB\tLED_STRATEGY, *PLED_STRATEGY;\n\nVOID\nLedControlUSB(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n\t);\n\n\n//================================================================================\n// SDIO LED Definition.\n//================================================================================\n#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\n#define IS_LED_WPS_BLINKING(_LED_SDIO)\t(((PLED_SDIO)_LED_SDIO)->CurrLedState==LED_BLINK_WPS \\\n\t\t\t\t\t|| ((PLED_SDIO)_LED_SDIO)->CurrLedState==LED_BLINK_WPS_STOP \\\n\t\t\t\t\t|| ((PLED_SDIO)_LED_SDIO)->bLedWPSBlinkInProgress)\n\n#define IS_LED_BLINKING(_LED_SDIO) \t(((PLED_SDIO)_LED_SDIO)->bLedWPSBlinkInProgress \\\n\t\t\t\t\t||((PLED_SDIO)_LED_SDIO)->bLedScanBlinkInProgress)\n\n\ntypedef\tenum _LED_STRATEGY_SDIO{\n\tSW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.\n\tSW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA.\n\tSW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard.\n\tSW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case.\n\tSW_LED_MODE4, //for Edimax / Belkin\n\tSW_LED_MODE5, //for Sercomm / Belkin\t\n\tSW_LED_MODE6,\t//for 88CU minicard, porting from ce SW_LED_MODE7\n\tHW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.)\n}LED_STRATEGY_SDIO, *PLED_STRATEGY_SDIO;\n\ntypedef struct _LED_SDIO{\n\tPADAPTER\t\t\tpadapter;\n\n\tLED_PIN\t\t\t\tLedPin;\t// Identify how to implement this SW led.\n\n\tLED_STATE\t\t\tCurrLedState; // Current LED state.\n\tBOOLEAN\t\t\t\tbLedOn; // TRUE if LED is ON, FALSE if LED is OFF.\n\n\tBOOLEAN\t\t\t\tbSWLedCtrl;\n\n\tBOOLEAN\t\t\t\tbLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w..\n\t// ALPHA, added by chiyoko, 20090106\n\tBOOLEAN\t\t\t\tbLedNoLinkBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedLinkBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedStartToLinkBlinkInProgress;\t\n\tBOOLEAN\t\t\t\tbLedScanBlinkInProgress;\n\tBOOLEAN\t\t\t\tbLedWPSBlinkInProgress;\n\t\n\tu32\t\t\t\t\tBlinkTimes; // Number of times to toggle led state for blinking.\n\tLED_STATE\t\t\tBlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are.\n\n\t_timer\t\t\t\tBlinkTimer; // Timer object for led blinking.\n\n\t_workitem\t\t\tBlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED.\n} LED_SDIO, *PLED_SDIO;\n\ntypedef struct _LED_SDIO\tLED_DATA, *PLED_DATA;\ntypedef enum _LED_STRATEGY_SDIO\tLED_STRATEGY, *PLED_STRATEGY;\n\nVOID\nLedControlSDIO(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tLED_CTL_MODE\t\tLedAction\n\t);\n\n#endif\n\nstruct led_priv{\n\t/* add for led controll */\n\tLED_DATA\t\t\tSwLed0;\n\tLED_DATA\t\t\tSwLed1;\n\tLED_DATA\t\t\tSwLed2;\n\tLED_STRATEGY\t\tLedStrategy;\n\tu8\t\t\t\t\tbRegUseLed;\n\tvoid (*LedControlHandler)(_adapter *padapter, LED_CTL_MODE LedAction);\n\tvoid (*SwLedOn)(_adapter *padapter, PLED_DATA pLed);\n\tvoid (*SwLedOff)(_adapter *padapter, PLED_DATA pLed);\n\t/* add for led controll */\n};\n\n#ifdef CONFIG_SW_LED\n#define rtw_led_control(adapter, LedAction) \\\n\tdo { \\\n\t\tif((adapter)->ledpriv.LedControlHandler) \\\n\t\t\t(adapter)->ledpriv.LedControlHandler((adapter), (LedAction)); \\\n\t} while(0)\n#else //CONFIG_SW_LED\n#define rtw_led_control(adapter, LedAction)\n#endif //CONFIG_SW_LED\n\n#define SwLedOn(adapter, pLed) \\\n\tdo { \\\n\t\tif((adapter)->ledpriv.SwLedOn) \\\n\t\t\t(adapter)->ledpriv.SwLedOn((adapter), (pLed)); \\\n\t} while(0)\n\n#define SwLedOff(adapter, pLed) \\\n\tdo { \\\n\t\tif((adapter)->ledpriv.SwLedOff) \\\n\t\t\t(adapter)->ledpriv.SwLedOff((adapter), (pLed)); \\\n\t} while(0)\n\nvoid BlinkTimerCallback(void *data);\nvoid BlinkWorkItemCallback(_workitem *work);\n\nvoid ResetLedStatus(PLED_DATA pLed);\n\nvoid\nInitLed(\n\t_adapter\t\t\t*padapter,\n\tPLED_DATA\t\tpLed,\n\tLED_PIN\t\t\tLedPin\n\t);\n\nvoid\nDeInitLed(\n\tPLED_DATA\t\tpLed\n\t);\n\n//hal...\nextern void BlinkHandler(PLED_DATA\tpLed);\n\n#endif //__RTW_LED_H_\n\n"
  },
  {
    "path": "include/hal_com_phycfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_COM_PHYCFG_H__\n#define __HAL_COM_PHYCFG_H__\n\n#define\t\tPathA                     \t\t\t0x0\t// Useless\n#define\t\tPathB                     \t\t\t0x1\n#define\t\tPathC                     \t\t\t0x2\n#define\t\tPathD                     \t\t\t0x3\n\ntypedef enum _RF_TX_NUM {\n\tRF_1TX = 0,\n\tRF_2TX,\n\tRF_3TX,\n\tRF_4TX,\n\tRF_MAX_TX_NUM,\n\tRF_TX_NUM_NONIMPLEMENT,\n} RF_TX_NUM;\n\n#define MAX_POWER_INDEX \t\t0x3F\n\ntypedef enum _REGULATION_TXPWR_LMT {\n\tTXPWR_LMT_FCC = 0,\n\tTXPWR_LMT_MKK = 1,\n\tTXPWR_LMT_ETSI = 2,\n\tTXPWR_LMT_WW = 3,\t\n\n\tTXPWR_LMT_MAX_REGULATION_NUM = 4\n} REGULATION_TXPWR_LMT;\n\n#define TX_PWR_LMT_REF_VHT_FROM_HT\tBIT0\n#define TX_PWR_LMT_REF_HT_FROM_VHT\tBIT1\n\n/*------------------------------Define structure----------------------------*/ \ntypedef struct _BB_REGISTER_DEFINITION{\n\tu32 rfintfs;\t\t\t// set software control: \n\t\t\t\t\t\t//\t\t0x870~0x877[8 bytes]\n\t\t\t\t\t\t\t\n\tu32 rfintfo; \t\t\t// output data: \n\t\t\t\t\t\t//\t\t0x860~0x86f [16 bytes]\n\t\t\t\t\t\t\t\n\tu32 rfintfe; \t\t\t// output enable: \n\t\t\t\t\t\t//\t\t0x860~0x86f [16 bytes]\n\t\t\t\t\t\t\t\n\tu32 rf3wireOffset;\t// LSSI data:\n\t\t\t\t\t\t//\t\t0x840~0x84f [16 bytes]\n\n\tu32 rfHSSIPara2; \t// wire parameter control2 : \n\t\t\t\t\t\t//\t\t0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes]\n\t\t\t\t\t\t\t\t\n\tu32 rfLSSIReadBack; \t//LSSI RF readback data SI mode\n\t\t\t\t\t\t//\t\t0x8a0~0x8af [16 bytes]\n\n\tu32 rfLSSIReadBackPi; \t//LSSI RF readback data PI mode 0x8b8-8bc for Path A and B\n\n}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T;\n\n\n//----------------------------------------------------------------------\ns32\nphy_TxPwrIdxToDbm(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tWIRELESS_MODE\tWirelessMode,\n\tIN\tu8\t\t\t\tTxPwrIdx\t\n\t);\n\nu8\nPHY_GetTxPowerByRateBase(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\tBand,\n\tIN\tu8\t\t\t\tRfPath,\n\tIN\tu8\t\t\t\tTxNum,\n\tIN\tRATE_SECTION\tRateSection\n\t);\n\nu8\nPHY_GetRateSectionIndexOfTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu32\t\t\tRegAddr,\n\tIN\tu32\t\t\tBitMask\n\t);\n\nVOID\nPHY_GetRateValuesOfTxPowerByRate(\n\tIN\tPADAPTER pAdapter,\n\tIN\tu32 RegAddr,\n\tIN\tu32 BitMask,\n\tIN\tu32 Value,\n\tOUT\tu8 *Rate,\n\tOUT\ts8 *PwrByRateVal,\n\tOUT\tu8 *RateNum\n\t);\n\nu8\nPHY_GetRateIndexOfTxPowerByRate(\n\tIN\tu8\tRate\n\t);\n\nVOID \nPHY_SetTxPowerIndexByRateSection(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tChannel,\n\tIN\tu8\t\t\t\tRateSection\n\t);\n\ns8\nPHY_GetTxPowerByRate( \n\tIN\tPADAPTER\tpAdapter, \n\tIN\tu8\t\t\tBand, \n\tIN\tu8\t\t\tRFPath, \n\tIN\tu8\t\t\tTxNum, \n\tIN\tu8\t\t\tRateIndex\n\t);\n\nVOID\nPHY_SetTxPowerByRate( \n\tIN\tPADAPTER\tpAdapter, \n\tIN\tu8\t\t\tBand, \n\tIN\tu8\t\t\tRFPath, \n\tIN\tu8\t\t\tTxNum, \n\tIN\tu8\t\t\tRate,\n\tIN\ts8\t\t\tValue\n\t);\n\nVOID\nPHY_SetTxPowerLevelByPath(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tchannel,\n\tIN\tu8\t\t\tpath\n\t);\n\nVOID \nPHY_SetTxPowerIndexByRateArray(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\n\tIN\tCHANNEL_WIDTH\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel,\n\tIN\tu8*\t\t\t\tRates,\n\tIN\tu8\t\t\t\tRateArraySize\n\t);\n\nVOID\nPHY_InitTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter\n\t);\n\nVOID\nPHY_StoreTxPowerByRate(\n\tIN\tPADAPTER\tpAdapter,\n\tIN\tu32\t\t\tBand,\n\tIN\tu32\t\t\tRfPath,\n\tIN\tu32\t\t\tTxNum,\n\tIN\tu32\t\t\tRegAddr,\n\tIN\tu32\t\t\tBitMask,\n\tIN\tu32\t\t\tData\n\t);\n\nVOID\nPHY_TxPowerByRateConfiguration(\n\tIN  PADAPTER\t\t\tpAdapter\n\t);\n\nu8\nPHY_GetTxPowerIndexBase(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu8\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\tBandWidth,\t\n\tIN\tu8\t\t\t\tChannel,\n\tOUT PBOOLEAN\t\tbIn24G\n\t);\n\ns8\nPHY_GetTxPowerLimit(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu32\t\t\t\tRegPwrTblSel,\n\tIN\tBAND_TYPE\t\tBand,\n\tIN\tCHANNEL_WIDTH\tBandwidth,\n\tIN\tu8\t\t\t\tRfPath,\n\tIN\tu8\t\t\t\tDataRate,\n\tIN\tu8\t\t\t\tChannel\n\t);\n\nVOID \nPHY_ConvertTxPowerLimitToPowerIndex(\n\tIN\tPADAPTER\t\t\tAdapter\n\t);\n\nVOID\nPHY_InitTxPowerLimit(\n\tIN\tPADAPTER\t\t\tAdapter\n\t);\n\ns8\nPHY_GetTxPowerTrackingOffset( \n\tPADAPTER\tpAdapter,\n\tu8\t\t\tRate,\n\tu8\t\t\tRFPath\n\t);\n\nu8\nPHY_GetTxPowerIndex(\n\tIN\tPADAPTER\t\t\tpAdapter,\n\tIN\tu8\t\t\t\t\tRFPath,\n\tIN\tu8\t\t\t\t\tRate,\t\n\tIN\tCHANNEL_WIDTH\t\tBandWidth,\t\n\tIN\tu8\t\t\t\t\tChannel\n\t);\n\nVOID\nPHY_SetTxPowerIndex(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tu32\t\t\t\tPowerIndex,\n\tIN\tu8\t\t\t\tRFPath,\t\n\tIN\tu8\t\t\t\tRate\n\t);\n\nvoid dump_tx_power_by_rate_base(void *sel, _adapter *adapter);\nvoid dump_tx_power_by_rate(void *sel, _adapter *adapter);\nvoid dump_tx_power_limit(void *sel, _adapter *adapter);\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n#define MAX_PARA_FILE_BUF_LEN\t25600\n\n#define LOAD_MAC_PARA_FILE\t\t\t\tBIT0\n#define LOAD_BB_PARA_FILE\t\t\t\t\tBIT1\n#define LOAD_BB_PG_PARA_FILE\t\t\t\tBIT2\n#define LOAD_BB_MP_PARA_FILE\t\t\t\tBIT3\n#define LOAD_RF_PARA_FILE\t\t\t\t\tBIT4\n#define LOAD_RF_TXPWR_TRACK_PARA_FILE\tBIT5\n#define LOAD_RF_TXPWR_LMT_PARA_FILE\t\tBIT6\n\nint phy_ConfigMACWithParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName);\n\nint phy_ConfigBBWithParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName, IN u32\tConfigType);\n\nint phy_ConfigBBWithPgParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName);\n\nint phy_ConfigBBWithMpParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName);\n\nint PHY_ConfigRFWithParaFile(IN\tPADAPTER\tAdapter, IN char*\tpFileName, IN u8\teRFPath);\n\nint PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName);\n\nint PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER\tAdapter, IN char*\tpFileName);\n\nvoid phy_free_filebuf(_adapter *padapter);\n#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE\n\n\n#endif //__HAL_COMMON_H__\n\n"
  },
  {
    "path": "include/hal_com_reg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_COMMON_REG_H__\n#define __HAL_COMMON_REG_H__\n\n\n#define MAC_ADDR_LEN\t\t\t\t6\n\n#define HAL_NAV_UPPER_UNIT\t\t128\t\t// micro-second\n\n// 8188E PKT_BUFF_ACCESS_CTRL value\n#define TXPKT_BUF_SELECT\t\t\t\t0x69\n#define RXPKT_BUF_SELECT\t\t\t\t0xA5\n#define DISABLE_TRXPKT_BUF_ACCESS\t\t0x0\n\n//============================================================\n//\n//============================================================\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_SYS_ISO_CTRL\t\t\t\t0x0000\n#define REG_SYS_FUNC_EN\t\t\t\t0x0002\n#define REG_APS_FSMCO\t\t\t\t\t0x0004\n#define REG_SYS_CLKR\t\t\t\t\t0x0008\n#define REG_SYS_CLK_CTRL\t\t\t\tREG_SYS_CLKR\n#define REG_9346CR\t\t\t\t\t\t0x000A\n#define REG_SYS_EEPROM_CTRL\t\t\t0x000A\n#define REG_EE_VPD\t\t\t\t\t\t0x000C\n#define REG_AFE_MISC\t\t\t\t\t0x0010\n#define REG_SPS0_CTRL\t\t\t\t\t0x0011\n#define REG_SPS0_CTRL_6\t\t\t\t\t0x0016\n#define REG_POWER_OFF_IN_PROCESS \t\t0x0017\n#define REG_SPS_OCP_CFG\t\t\t\t0x0018\n#define REG_RSV_CTRL\t\t\t\t\t0x001C\n#define REG_RF_CTRL\t\t\t\t\t\t0x001F\n#define REG_LDOA15_CTRL\t\t\t\t0x0020\n#define REG_LDOV12D_CTRL\t\t\t\t0x0021\n#define REG_LDOHCI12_CTRL\t\t\t\t0x0022\n#define REG_LPLDO_CTRL\t\t\t\t\t0x0023\n#define REG_AFE_XTAL_CTRL\t\t\t\t0x0024\n#define REG_AFE_LDO_CTRL\t\t\t\t0x0027 // 1.5v for 8188EE test chip, 1.4v for MP chip\n#define REG_AFE_PLL_CTRL\t\t\t\t0x0028\n#define REG_MAC_PHY_CTRL\t\t\t\t0x002c //for 92d, DMDP,SMSP,DMSP contrl\n#define REG_APE_PLL_CTRL_EXT\t\t\t0x002c\n#define REG_EFUSE_CTRL\t\t\t\t\t0x0030\n#define REG_EFUSE_TEST\t\t\t\t\t0x0034\n#define REG_PWR_DATA\t\t\t\t\t0x0038\n#define REG_CAL_TIMER\t\t\t\t\t0x003C\n#define REG_ACLK_MON\t\t\t\t\t0x003E\n#define REG_GPIO_MUXCFG\t\t\t\t0x0040\n#define REG_GPIO_IO_SEL\t\t\t\t\t0x0042\n#define REG_MAC_PINMUX_CFG\t\t\t0x0043\n#define REG_GPIO_PIN_CTRL\t\t\t\t0x0044\n#define REG_GPIO_INTM\t\t\t\t\t0x0048\n#define REG_LEDCFG0\t\t\t\t\t\t0x004C\n#define REG_LEDCFG1\t\t\t\t\t\t0x004D\n#define REG_LEDCFG2\t\t\t\t\t\t0x004E\n#define REG_LEDCFG3\t\t\t\t\t\t0x004F\n#define REG_FSIMR\t\t\t\t\t\t0x0050\n#define REG_FSISR\t\t\t\t\t\t0x0054\n#define REG_HSIMR\t\t\t\t\t\t0x0058\n#define REG_HSISR\t\t\t\t\t\t0x005c\n#define REG_GPIO_PIN_CTRL_2\t\t\t0x0060 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Pin Control.\n#define REG_GPIO_IO_SEL_2\t\t\t\t0x0062 // RTL8723 WIFI/BT/GPS Multi-Function GPIO Select.\n#define REG_MULTI_FUNC_CTRL\t\t\t0x0068 // RTL8723 WIFI/BT/GPS Multi-Function control source.\n#define REG_GSSR\t\t\t\t\t\t0x006c\n#define REG_AFE_XTAL_CTRL_EXT\t\t\t0x0078 //RTL8188E\n#define REG_XCK_OUT_CTRL\t\t\t\t0x007c //RTL8188E\n#define REG_MCUFWDL\t\t\t\t\t0x0080\n#define REG_WOL_EVENT\t\t\t\t\t0x0081 //RTL8188E\n#define REG_MCUTSTCFG\t\t\t\t\t0x0084\n#define REG_FDHM0\t\t\t\t\t\t0x0088\n#define REG_HOST_SUSP_CNT\t\t\t\t0x00BC\t// RTL8192C Host suspend counter on FPGA platform\n#define REG_SYSTEM_ON_CTRL\t\t\t0x00CC\t// For 8723AE Reset after S3\n#define REG_EFUSE_ACCESS\t\t\t\t0x00CF\t// Efuse access protection for RTL8723\n#define REG_BIST_SCAN\t\t\t\t\t0x00D0\n#define REG_BIST_RPT\t\t\t\t\t0x00D4\n#define REG_BIST_ROM_RPT\t\t\t\t0x00D8\n#define REG_USB_SIE_INTF\t\t\t\t0x00E0\n#define REG_PCIE_MIO_INTF\t\t\t\t0x00E4\n#define REG_PCIE_MIO_INTD\t\t\t\t0x00E8\n#define REG_HPON_FSM\t\t\t\t\t0x00EC\n#define REG_SYS_CFG\t\t\t\t\t\t0x00F0\n#define REG_GPIO_OUTSTS\t\t\t\t0x00F4\t// For RTL8723 only.\n#define REG_TYPE_ID\t\t\t\t\t\t0x00FC\n\n//\n// 2010/12/29 MH Add for 92D\n//\n#define REG_MAC_PHY_CTRL_NORMAL\t\t0x00f8\n\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_CR\t\t\t\t\t\t\t0x0100\n#define REG_PBP\t\t\t\t\t\t\t0x0104\n#define REG_PKT_BUFF_ACCESS_CTRL\t\t0x0106\n#define REG_TRXDMA_CTRL\t\t\t\t0x010C\n#define REG_TRXFF_BNDY\t\t\t\t\t0x0114\n#define REG_TRXFF_STATUS\t\t\t\t0x0118\n#define REG_RXFF_PTR\t\t\t\t\t0x011C\n#define REG_HIMR\t\t\t\t\t\t0x0120\n#define REG_HISR\t\t\t\t\t\t0x0124\n#define REG_HIMRE\t\t\t\t\t\t0x0128\n#define REG_HISRE\t\t\t\t\t\t0x012C\n#define REG_CPWM\t\t\t\t\t\t0x012F\n#define REG_FWIMR\t\t\t\t\t\t0x0130\n#define REG_FWISR\t\t\t\t\t\t0x0134\n#define REG_FTIMR\t\t\t\t\t\t0x0138\n#define REG_FTISR\t\t\t\t\t\t0x013C //RTL8192C\n#define REG_PKTBUF_DBG_CTRL\t\t\t0x0140\n#define REG_RXPKTBUF_CTRL\t\t\t\t(REG_PKTBUF_DBG_CTRL+2)\n#define REG_PKTBUF_DBG_DATA_L\t\t\t0x0144\n#define REG_PKTBUF_DBG_DATA_H\t\t0x0148\n\n#define REG_TC0_CTRL\t\t\t\t\t0x0150\n#define REG_TC1_CTRL\t\t\t\t\t0x0154\n#define REG_TC2_CTRL\t\t\t\t\t0x0158\n#define REG_TC3_CTRL\t\t\t\t\t0x015C\n#define REG_TC4_CTRL\t\t\t\t\t0x0160\n#define REG_TCUNIT_BASE\t\t\t\t0x0164\n#define REG_MBIST_START\t\t\t\t0x0174\n#define REG_MBIST_DONE\t\t\t\t\t0x0178\n#define REG_MBIST_FAIL\t\t\t\t\t0x017C\n#define REG_32K_CTRL\t\t\t\t\t0x0194 //RTL8188E\n#define REG_C2HEVT_MSG_NORMAL\t\t0x01A0\n#define REG_C2HEVT_CLEAR\t\t\t\t0x01AF\n#define REG_MCUTST_1\t\t\t\t\t0x01c0\n#define REG_MCUTST_WOWLAN\t\t\t0x01C7\t// Defined after 8188E series.\n#define REG_FMETHR\t\t\t\t\t\t0x01C8\n#define REG_HMETFR\t\t\t\t\t\t0x01CC\n#define REG_HMEBOX_0\t\t\t\t\t0x01D0\n#define REG_HMEBOX_1\t\t\t\t\t0x01D4\n#define REG_HMEBOX_2\t\t\t\t\t0x01D8\n#define REG_HMEBOX_3\t\t\t\t\t0x01DC\n#define REG_LLT_INIT\t\t\t\t\t0x01E0\n#define REG_HMEBOX_EXT_0\t\t\t\t0x01F0\n#define REG_HMEBOX_EXT_1\t\t\t\t0x01F4\n#define REG_HMEBOX_EXT_2\t\t\t\t0x01F8\n#define REG_HMEBOX_EXT_3\t\t\t\t0x01FC\n\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RQPN\t\t\t\t\t\t0x0200\n#define REG_FIFOPAGE\t\t\t\t\t0x0204\n#define REG_TDECTRL\t\t\t\t\t\t0x0208\n#define REG_TXDMA_OFFSET_CHK\t\t\t0x020C\n#define REG_TXDMA_STATUS\t\t\t\t0x0210\n#define REG_RQPN_NPQ\t\t\t\t\t0x0214\n#define REG_AUTO_LLT\t\t\t\t\t0x0224\n\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_AGG_PG_TH\t\t\t0x0280\n#define REG_RXPKT_NUM\t\t\t\t\t0x0284 \n#define REG_RXDMA_STATUS\t\t\t\t0x0288\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define REG_PCIE_CTRL_REG\t\t\t\t0x0300\n#define REG_INT_MIG\t\t\t\t\t0x0304\t/* Interrupt Migration */\n#define REG_BCNQ_DESA\t\t\t\t\t0x0308\t/* TX Beacon Descriptor Address */\n#define REG_HQ_DESA\t\t\t\t\t0x0310\t/* TX High Queue Descriptor Address */\n#define REG_MGQ_DESA\t\t\t\t\t0x0318\t/* TX Manage Queue Descriptor Address */\n#define REG_VOQ_DESA\t\t\t\t\t0x0320\t/* TX VO Queue Descriptor Address */\n#define REG_VIQ_DESA\t\t\t\t\t0x0328\t/* TX VI Queue Descriptor Address */\n#define REG_BEQ_DESA\t\t\t\t\t0x0330\t/* TX BE Queue Descriptor Address */\n#define REG_BKQ_DESA\t\t\t\t\t0x0338\t/* TX BK Queue Descriptor Address */\n#define REG_RX_DESA\t\t\t\t\t0x0340\t/* RX Queue Descriptor Address */\n//sherry added for DBI Read/Write  20091126\n#define REG_DBI_WDATA\t\t\t\t\t0x0348\t/*  Backdoor REG for Access Configuration */\n#define REG_DBI_RDATA\t\t\t\t\t0x034C\t/* Backdoor REG for Access Configuration */\n#define REG_DBI_CTRL\t\t\t\t\t0x0350\t/* Backdoor REG for Access Configuration */\n#define REG_DBI_FLAG\t\t\t\t\t0x0352\t/* Backdoor REG for Access Configuration */\n#define REG_MDIO\t\t\t\t\t0x0354\t/* MDIO for Access PCIE PHY */\n#define REG_DBG_SEL\t\t\t\t\t0x0360\t/* Debug Selection Register */\n#define REG_PCIE_HRPWM\t\t\t\t\t0x0361\t/* PCIe RPWM */\n#define REG_PCIE_HCPWM\t\t\t\t\t0x0363\t/* PCIe CPWM */\n#define REG_WATCH_DOG\t\t\t\t\t0x0368\n#define REG_RX_RXBD_NUM\t\t\t\t\t0x0382\n\n// RTL8723 series -------------------------------\n#define REG_PCIE_HISR_EN\t\t\t\t0x0394\t/* PCIE Local Interrupt Enable Register */\n#define REG_PCIE_HISR\t\t\t\t\t0x03A0\n#define REG_PCIE_HISRE\t\t\t\t\t0x03A4\n#define REG_PCIE_HIMR\t\t\t\t\t0x03A8\n#define REG_PCIE_HIMRE\t\t\t\t\t0x03AC\n\n#define REG_USB_HIMR\t\t\t\t\t0xFE38\n#define REG_USB_HIMRE\t\t\t\t\t0xFE3C\n#define REG_USB_HISR\t\t\t\t\t0xFE78\n#define REG_USB_HISRE\t\t\t\t\t0xFE7C\n\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n\n/* 92C, 92D */\n#define REG_VOQ_INFO\t0x0400\n#define REG_VIQ_INFO\t0x0404\n#define REG_BEQ_INFO\t0x0408\n#define REG_BKQ_INFO\t0x040C\n\n/* 88E, 8723A, 8812A, 8821A, 92E, 8723B */\n#define REG_Q0_INFO\t0x400\n#define REG_Q1_INFO\t0x404\n#define REG_Q2_INFO\t0x408\n#define REG_Q3_INFO\t0x40C\n\n#define REG_MGQ_INFO\t0x0410\n#define REG_HGQ_INFO\t0x0414\n#define REG_BCNQ_INFO\t0x0418\n#define REG_TXPKT_EMPTY\t\t\t\t0x041A\n#define REG_CPU_MGQ_INFORMATION\t\t0x041C\n#define REG_FWHW_TXQ_CTRL\t\t\t\t0x0420\n#define REG_HWSEQ_CTRL\t\t\t\t\t0x0423\n#define REG_BCNQ_BDNY\t\t\t\t\t0x0424\n#define REG_MGQ_BDNY\t\t\t\t\t0x0425\n#define REG_LIFETIME_CTRL\t\t\t\t0x0426\n#define REG_MULTI_BCNQ_OFFSET\t\t\t0x0427\n#define REG_SPEC_SIFS\t\t\t\t\t0x0428\n#define REG_RL\t\t\t\t\t\t\t0x042A\n#define REG_DARFRC\t\t\t\t\t\t0x0430\n#define REG_RARFRC\t\t\t\t\t\t0x0438\n#define REG_RRSR\t\t\t\t\t\t0x0440\n#define REG_ARFR0\t\t\t\t\t\t0x0444\n#define REG_ARFR1\t\t\t\t\t\t0x0448\n#define REG_ARFR2\t\t\t\t\t\t0x044C\n#define REG_ARFR3\t\t\t\t\t\t0x0450\n#define REG_BCNQ1_BDNY\t\t\t\t\t0x0457\n\n#define REG_AGGLEN_LMT\t\t\t\t\t0x0458\n#define REG_AMPDU_MIN_SPACE\t\t\t0x045C\n#define REG_WMAC_LBK_BF_HD\t\t\t0x045D\n#define REG_FAST_EDCA_CTRL\t\t\t\t0x0460\n#define REG_RD_RESP_PKT_TH\t\t\t\t0x0463\n\n/* 8723A, 8812A, 8821A, 92E, 8723B */\n#define REG_Q4_INFO\t0x468\n#define REG_Q5_INFO\t0x46C\n#define REG_Q6_INFO\t0x470\n#define REG_Q7_INFO\t0x474\n\n#define REG_INIRTS_RATE_SEL\t\t\t\t0x0480\n#define REG_INIDATA_RATE_SEL\t\t\t0x0484\n\n/* 8723B, 92E, 8812A, 8821A*/\n#define REG_MACID_SLEEP_3\t\t\t\t0x0484\n#define REG_MACID_SLEEP_1\t\t\t\t0x0488\n\n#define REG_POWER_STAGE1\t\t\t\t0x04B4\n#define REG_POWER_STAGE2\t\t\t\t0x04B8\n#define REG_PKT_VO_VI_LIFE_TIME\t\t0x04C0\n#define REG_PKT_BE_BK_LIFE_TIME\t\t0x04C2\n#define REG_STBC_SETTING\t\t\t\t0x04C4\n#define REG_QUEUE_CTRL\t\t\t\t\t0x04C6\n#define REG_SINGLE_AMPDU_CTRL\t\t\t0x04c7\n#define REG_PROT_MODE_CTRL\t\t\t0x04C8\n#define REG_MAX_AGGR_NUM\t\t\t\t0x04CA\n#define REG_RTS_MAX_AGGR_NUM\t\t\t0x04CB\n#define REG_BAR_MODE_CTRL\t\t\t\t0x04CC\n#define REG_RA_TRY_RATE_AGG_LMT\t\t0x04CF\n\n/* 8723A */\n#define REG_MACID_DROP\t0x04D0\n\n/* 88E */\n#define REG_EARLY_MODE_CONTROL\t0x04D0\n\n/* 8723B, 92E, 8812A, 8821A */\n#define REG_MACID_SLEEP_2\t0x04D0\n\n/* 8723A, 8723B, 92E, 8812A, 8821A */\n#define REG_MACID_SLEEP\t0x04D4\n\n#define REG_NQOS_SEQ\t\t\t\t\t0x04DC\n#define REG_QOS_SEQ\t\t\t\t\t0x04DE\n#define REG_NEED_CPU_HANDLE\t\t\t0x04E0\n#define REG_PKT_LOSE_RPT\t\t\t\t0x04E1\n#define REG_PTCL_ERR_STATUS\t\t\t0x04E2\n#define REG_TX_RPT_CTRL\t\t\t\t\t0x04EC\n#define REG_TX_RPT_TIME\t\t\t\t\t0x04F0\t// 2 byte\n#define REG_DUMMY\t\t\t\t\t\t0x04FC\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_EDCA_VO_PARAM\t\t\t\t0x0500\n#define REG_EDCA_VI_PARAM\t\t\t\t0x0504\n#define REG_EDCA_BE_PARAM\t\t\t\t0x0508\n#define REG_EDCA_BK_PARAM\t\t\t\t0x050C\n#define REG_BCNTCFG\t\t\t\t\t\t0x0510\n#define REG_PIFS\t\t\t\t\t\t\t0x0512\n#define REG_RDG_PIFS\t\t\t\t\t0x0513\n#define REG_SIFS_CTX\t\t\t\t\t0x0514\n#define REG_SIFS_TRX\t\t\t\t\t0x0516\n#define REG_TSFTR_SYN_OFFSET\t\t\t0x0518\n#define REG_AGGR_BREAK_TIME\t\t\t0x051A\n#define REG_SLOT\t\t\t\t\t\t0x051B\n#define REG_TX_PTCL_CTRL\t\t\t\t0x0520\n#define REG_TXPAUSE\t\t\t\t\t\t0x0522\n#define REG_DIS_TXREQ_CLR\t\t\t\t0x0523\n#define REG_RD_CTRL\t\t\t\t\t\t0x0524\n//\n// Format for offset 540h-542h:\n//\t[3:0]:   TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT.\n//\t[7:4]:   Reserved.\n//\t[19:8]:  TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet.\n//\t[23:20]: Reserved\n// Description:\n//\t              |\n//     |<--Setup--|--Hold------------>|\n//\t--------------|----------------------\n//                |\n//               TBTT\n// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold.\n// Described by Designer Tim and Bruce, 2011-01-14.\n//\n#define REG_TBTT_PROHIBIT\t\t\t\t0x0540\n#define REG_RD_NAV_NXT\t\t\t\t\t0x0544\n#define REG_NAV_PROT_LEN\t\t\t\t0x0546\n#define REG_BCN_CTRL\t\t\t\t\t0x0550\n#define REG_BCN_CTRL_1\t\t\t\t\t0x0551\n#define REG_MBID_NUM\t\t\t\t\t0x0552\n#define REG_DUAL_TSF_RST\t\t\t\t0x0553\n#define REG_BCN_INTERVAL\t\t\t\t0x0554\t// The same as REG_MBSSID_BCN_SPACE\n#define REG_DRVERLYINT\t\t\t\t\t0x0558\n#define REG_BCNDMATIM\t\t\t\t\t0x0559\n#define REG_ATIMWND\t\t\t\t\t0x055A\n#define REG_USTIME_TSF\t\t\t\t\t0x055C\n#define REG_BCN_MAX_ERR\t\t\t\t0x055D\n#define REG_RXTSF_OFFSET_CCK\t\t\t0x055E\n#define REG_RXTSF_OFFSET_OFDM\t\t\t0x055F\t\n#define REG_TSFTR\t\t\t\t\t\t0x0560\n#define REG_TSFTR1\t\t\t\t\t\t0x0568\t// HW Port 1 TSF Register\n#define REG_ATIMWND_1\t\t\t\t\t0x0570\n#define REG_P2P_CTWIN\t\t\t\t\t0x0572 // 1 Byte long (in unit of TU)\n#define REG_PSTIMER\t\t\t\t\t\t0x0580\n#define REG_TIMER0\t\t\t\t\t\t0x0584\n#define REG_TIMER1\t\t\t\t\t\t0x0588\n#define REG_ACMHWCTRL\t\t\t\t\t0x05C0\n#define REG_NOA_DESC_SEL\t\t\t\t0x05CF\n#define REG_NOA_DESC_DURATION\t\t0x05E0\n#define REG_NOA_DESC_INTERVAL\t\t\t0x05E4\n#define REG_NOA_DESC_START\t\t\t0x05E8\n#define REG_NOA_DESC_COUNT\t\t\t0x05EC\n\n#define REG_DMC\t\t\t\t\t\t\t0x05F0\t//Dual MAC Co-Existence Register\n#define REG_SCH_TX_CMD\t\t\t\t\t0x05F8\n\n#define REG_FW_RESET_TSF_CNT_1\t\t0x05FC\n#define REG_FW_RESET_TSF_CNT_0\t\t0x05FD\n#define REG_FW_BCN_DIS_CNT\t\t\t0x05FE\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#define REG_APSD_CTRL\t\t\t\t\t0x0600\n#define REG_BWOPMODE\t\t\t\t\t0x0603\n#define REG_TCR\t\t\t\t\t\t\t0x0604\n#define REG_RCR\t\t\t\t\t\t\t0x0608\n#define REG_RX_PKT_LIMIT\t\t\t\t0x060C\n#define REG_RX_DLK_TIME\t\t\t\t0x060D\n#define REG_RX_DRVINFO_SZ\t\t\t\t0x060F\n\n#define REG_MACID\t\t\t\t\t\t0x0610\n#define REG_BSSID\t\t\t\t\t\t0x0618\n#define REG_MAR\t\t\t\t\t\t\t0x0620\n#define REG_MBIDCAMCFG\t\t\t\t\t0x0628\n\n#define REG_PNO_STATUS\t\t\t\t\t0x0631\n#define REG_USTIME_EDCA\t\t\t\t0x0638\n#define REG_MAC_SPEC_SIFS\t\t\t\t0x063A\n// 20100719 Joseph: Hardware register definition change. (HW datasheet v54)\n#define REG_RESP_SIFS_CCK\t\t\t\t0x063C\t// [15:8]SIFS_R2T_OFDM, [7:0]SIFS_R2T_CCK\n#define REG_RESP_SIFS_OFDM                    0x063E\t// [15:8]SIFS_T2T_OFDM, [7:0]SIFS_T2T_CCK\n\n#define REG_ACKTO\t\t\t\t\t\t0x0640\n#define REG_CTS2TO\t\t\t\t\t\t0x0641\n#define REG_EIFS\t\t\t\t\t\t\t0x0642\n\n\n//RXERR_RPT\n#define RXERR_TYPE_OFDM_PPDU\t\t\t0\n#define RXERR_TYPE_OFDM_FALSE_ALARM \t1\n#define RXERR_TYPE_OFDM_MPDU_OK \t\t2\n#define RXERR_TYPE_OFDM_MPDU_FAIL\t3\n#define RXERR_TYPE_CCK_PPDU \t\t\t4\n#define RXERR_TYPE_CCK_FALSE_ALARM\t5\n#define RXERR_TYPE_CCK_MPDU_OK\t\t6\n#define RXERR_TYPE_CCK_MPDU_FAIL\t\t7\n#define RXERR_TYPE_HT_PPDU\t\t\t\t8\n#define RXERR_TYPE_HT_FALSE_ALARM\t9\n#define RXERR_TYPE_HT_MPDU_TOTAL\t\t10\n#define RXERR_TYPE_HT_MPDU_OK\t\t\t11\n#define RXERR_TYPE_HT_MPDU_FAIL \t\t12\n#define RXERR_TYPE_RX_FULL_DROP \t\t15\n\n#define RXERR_COUNTER_MASK\t\t\t0xFFFFF\n#define RXERR_RPT_RST\t\t\t\t\tBIT(27)\n#define _RXERR_RPT_SEL(type)\t\t\t((type) << 28)\n\n//\n// Note:\n//\tThe NAV upper value is very important to WiFi 11n 5.2.3 NAV test. The default value is\n//\talways too small, but the WiFi TestPlan test by 25,000 microseconds of NAV through sending\n//\tCTS in the air. We must update this value greater than 25,000 microseconds to pass the item.\n//\tThe offset of NAV_UPPER in 8192C Spec is incorrect, and the offset should be 0x0652. Commented\n//\tby SD1 Scott.\n// By Bruce, 2011-07-18.\n//\n#define REG_NAV_UPPER\t\t\t\t\t0x0652\t// unit of 128\n\n//WMA, BA, CCX\n#define REG_NAV_CTRL\t\t\t\t\t0x0650\n#define REG_BACAMCMD\t\t\t\t\t0x0654\n#define REG_BACAMCONTENT\t\t\t\t0x0658\n#define REG_LBDLY\t\t\t\t\t\t0x0660\n#define REG_FWDLY\t\t\t\t\t\t0x0661\n#define REG_RXERR_RPT\t\t\t\t\t0x0664\n#define REG_WMAC_TRXPTCL_CTL\t\t\t0x0668\n\n// Security\n#define REG_CAMCMD\t\t\t\t\t\t0x0670\n#define REG_CAMWRITE\t\t\t\t\t0x0674\n#define REG_CAMREAD\t\t\t\t\t0x0678\n#define REG_CAMDBG\t\t\t\t\t\t0x067C\n#define REG_SECCFG\t\t\t\t\t\t0x0680\n\n// Power\n#define REG_WOW_CTRL\t\t\t\t\t0x0690\n#define REG_PS_RX_INFO\t\t\t\t\t0x0692\n#define REG_UAPSD_TID\t\t\t\t\t0x0693\n#define REG_WKFMCAM_CMD\t\t\t\t0x0698\n#define REG_WKFMCAM_NUM\t\t\t\tREG_WKFMCAM_CMD\n#define REG_WKFMCAM_RWD\t\t\t\t0x069C\n#define REG_RXFLTMAP0\t\t\t\t\t0x06A0\n#define REG_RXFLTMAP1\t\t\t\t\t0x06A2\n#define REG_RXFLTMAP2\t\t\t\t\t0x06A4\n#define REG_BCN_PSR_RPT\t\t\t\t0x06A8\n#define REG_BT_COEX_TABLE\t\t\t\t0x06C0\n\n// Hardware Port 2\n#define REG_MACID1\t\t\t\t\t\t0x0700\n#define REG_BSSID1\t\t\t\t\t\t0x0708\n\n\n//-----------------------------------------------------\n//\n//\t0xFE00h ~ 0xFE55h\tUSB Configuration\n//\n//-----------------------------------------------------\n#define REG_USB_INFO\t\t\t\t\t0xFE17\n#define REG_USB_SPECIAL_OPTION\t\t0xFE55\n#define REG_USB_DMA_AGG_TO\t\t\t0xFE5B\n#define REG_USB_AGG_TO\t\t\t\t\t0xFE5C\n#define REG_USB_AGG_TH\t\t\t\t\t0xFE5D\n\n#define REG_USB_HRPWM\t\t\t\t\t0xFE58\n#define REG_USB_HCPWM\t\t\t\t\t0xFE57\n\n// for 92DU high_Queue low_Queue Normal_Queue select \n#define REG_USB_High_NORMAL_Queue_Select_MAC0\t0xFE44\n//#define REG_USB_LOW_Queue_Select_MAC0\t\t0xFE45\n#define REG_USB_High_NORMAL_Queue_Select_MAC1\t0xFE47\n//#define REG_USB_LOW_Queue_Select_MAC1\t\t0xFE48\n\n// For test chip\n#define REG_TEST_USB_TXQS\t\t\t\t0xFE48\n#define REG_TEST_SIE_VID\t\t\t\t0xFE60\t\t// 0xFE60~0xFE61\n#define REG_TEST_SIE_PID\t\t\t\t0xFE62\t\t// 0xFE62~0xFE63\n#define REG_TEST_SIE_OPTIONAL\t\t\t0xFE64\n#define REG_TEST_SIE_CHIRP_K\t\t\t0xFE65\n#define REG_TEST_SIE_PHY\t\t\t\t0xFE66\t\t// 0xFE66~0xFE6B\n#define REG_TEST_SIE_MAC_ADDR\t\t\t0xFE70\t\t// 0xFE70~0xFE75\n#define REG_TEST_SIE_STRING\t\t\t0xFE80\t\t// 0xFE80~0xFEB9\n\n\n// For normal chip\n#define REG_NORMAL_SIE_VID\t\t\t\t0xFE60\t\t// 0xFE60~0xFE61\n#define REG_NORMAL_SIE_PID\t\t\t\t0xFE62\t\t// 0xFE62~0xFE63\n#define REG_NORMAL_SIE_OPTIONAL\t\t0xFE64\n#define REG_NORMAL_SIE_EP\t\t\t\t0xFE65\t\t// 0xFE65~0xFE67\n#define REG_NORMAL_SIE_PHY\t\t\t0xFE68\t\t// 0xFE68~0xFE6B\n#define REG_NORMAL_SIE_OPTIONAL2\t\t0xFE6C\n#define REG_NORMAL_SIE_GPS_EP\t\t\t0xFE6D\t\t// 0xFE6D, for RTL8723 only.\n#define REG_NORMAL_SIE_MAC_ADDR\t\t0xFE70\t\t// 0xFE70~0xFE75\n#define REG_NORMAL_SIE_STRING\t\t\t0xFE80\t\t// 0xFE80~0xFEDF\n\n\n//-----------------------------------------------------\n//\n//\tRedifine 8192C register definition for compatibility\n//\n//-----------------------------------------------------\n\n// TODO: use these definition when using REG_xxx naming rule.\n// NOTE: DO NOT Remove these definition. Use later.\n\n#define EFUSE_CTRL\t\t\t\tREG_EFUSE_CTRL\t\t// E-Fuse Control.\n#define EFUSE_TEST\t\t\t\tREG_EFUSE_TEST\t\t// E-Fuse Test.\n#define MSR\t\t\t\t\t\t(REG_CR + 2)\t\t// Media Status register\n//#define ISR\t\t\t\t\t\tREG_HISR\n\n#define TSFR\t\t\t\t\t\tREG_TSFTR\t\t\t// Timing Sync Function Timer Register.\n#define TSFR1\t\t\t\t\tREG_TSFTR1\t\t\t// HW Port 1 TSF Register\n\n#define PBP\t\t\t\t\t\tREG_PBP\n\n// Redifine MACID register, to compatible prior ICs.\n#define IDR0\t\t\t\t\t\tREG_MACID\t\t\t// MAC ID Register, Offset 0x0050-0x0053\n#define IDR4\t\t\t\t\t\t(REG_MACID + 4)\t\t// MAC ID Register, Offset 0x0054-0x0055\n\n\n//\n// 9. Security Control Registers\t(Offset: )\n//\n#define RWCAM\t\t\t\t\tREG_CAMCMD\t\t//IN 8190 Data Sheet is called CAMcmd\n#define WCAMI\t\t\t\t\tREG_CAMWRITE\t// Software write CAM input content\n#define RCAMO\t\t\t\t\tREG_CAMREAD\t\t// Software read/write CAM config\n#define CAMDBG\t\t\t\t\tREG_CAMDBG\n#define SECR\t\t\t\t\t\tREG_SECCFG\t\t//Security Configuration Register\n\n// Unused register\n#define UnusedRegister\t\t\t0x1BF\n#define DCAM\t\t\t\t\tUnusedRegister\n#define PSR\t\t\t\t\t\tUnusedRegister\n#define BBAddr\t\t\t\t\tUnusedRegister\n#define PhyDataR\t\t\t\t\tUnusedRegister\n\n// Min Spacing related settings.\n#define MAX_MSS_DENSITY_2T \t\t\t0x13\n#define MAX_MSS_DENSITY_1T \t\t\t0x0A\n\n//----------------------------------------------------------------------------\n//       8192C Cmd9346CR bits\t\t\t\t\t(Offset 0xA, 16bit)\n//----------------------------------------------------------------------------\n#define CmdEEPROM_En\t\t\t\tBIT5\t // EEPROM enable when set 1\n#define CmdEERPOMSEL\t\t\t\tBIT4 \t// System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346\n#define Cmd9346CR_9356SEL\t\t\tBIT4\n\n//----------------------------------------------------------------------------\n//       8192C GPIO MUX Configuration Register (offset 0x40, 4 byte)\n//----------------------------------------------------------------------------\n#define GPIOSEL_GPIO\t\t\t\t0\n#define GPIOSEL_ENBT\t\t\t\tBIT5\n\n//----------------------------------------------------------------------------\n//       8192C GPIO PIN Control Register (offset 0x44, 4 byte)\n//----------------------------------------------------------------------------\n#define GPIO_IN\t\t\t\t\tREG_GPIO_PIN_CTRL\t\t// GPIO pins input value\n#define GPIO_OUT\t\t\t\t(REG_GPIO_PIN_CTRL+1)\t// GPIO pins output value\n#define GPIO_IO_SEL\t\t\t\t(REG_GPIO_PIN_CTRL+2)\t// GPIO pins output enable when a bit is set to \"1\"; otherwise, input is configured.\n#define GPIO_MOD\t\t\t\t(REG_GPIO_PIN_CTRL+3)\n\n//----------------------------------------------------------------------------\n//       8811A GPIO PIN Control Register (offset 0x60, 4 byte)\n//----------------------------------------------------------------------------\n#define GPIO_IN_8811A\t\t\tREG_GPIO_PIN_CTRL_2\t\t// GPIO pins input value\n#define GPIO_OUT_8811A\t\t\t(REG_GPIO_PIN_CTRL_2+1)\t// GPIO pins output value\n#define GPIO_IO_SEL_8811A\t\t(REG_GPIO_PIN_CTRL_2+2)\t// GPIO pins output enable when a bit is set to \"1\"; otherwise, input is configured.\n#define GPIO_MOD_8811A\t\t\t(REG_GPIO_PIN_CTRL_2+3)\n\n//----------------------------------------------------------------------------\n//       8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte)\n//----------------------------------------------------------------------------\n#define HSIMR_GPIO12_0_INT_EN\t\t\tBIT0\n#define HSIMR_SPS_OCP_INT_EN\t\t\tBIT5\n#define HSIMR_RON_INT_EN\t\t\t\tBIT6\n#define HSIMR_PDN_INT_EN\t\t\t\tBIT7\n#define HSIMR_GPIO9_INT_EN\t\t\t\tBIT25\n\n//----------------------------------------------------------------------------\n//       8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte)\n//----------------------------------------------------------------------------\n#define HSISR_GPIO12_0_INT\t\t\t\tBIT0\n#define HSISR_SPS_OCP_INT\t\t\t\tBIT5\n#define HSISR_RON_INT\t\t\t\t\tBIT6\n#define HSISR_PDNINT\t\t\t\t\tBIT7\n#define HSISR_GPIO9_INT\t\t\t\t\tBIT25\n\n//----------------------------------------------------------------------------\n//       8192C (MSR) Media Status Register\t(Offset 0x4C, 8 bits)  \n//----------------------------------------------------------------------------\n/*\nNetwork Type\n00: No link\n01: Link in ad hoc network\n10: Link in infrastructure network\n11: AP mode\nDefault: 00b.\n*/\n#define MSR_NOLINK\t\t\t\t0x00\n#define MSR_ADHOC\t\t\t\t0x01\n#define MSR_INFRA\t\t\t\t0x02\n#define MSR_AP\t\t\t\t\t0x03\n\n//----------------------------------------------------------------------------\n//       USB INTR CONTENT\n//----------------------------------------------------------------------------\n#define USB_C2H_CMDID_OFFSET\t\t\t\t\t0\n#define USB_C2H_SEQ_OFFSET\t\t\t\t\t1\n#define USB_C2H_EVENT_OFFSET\t\t\t\t\t2\n#define USB_INTR_CPWM_OFFSET\t\t\t\t\t16\n#define USB_INTR_CONTENT_C2H_OFFSET\t\t\t0\n#define USB_INTR_CONTENT_CPWM1_OFFSET\t\t16\n#define USB_INTR_CONTENT_CPWM2_OFFSET\t\t20\n#define USB_INTR_CONTENT_HISR_OFFSET\t\t\t48\n#define USB_INTR_CONTENT_HISRE_OFFSET\t\t52\n#define USB_INTR_CONTENT_LENGTH\t\t\t\t56\n\n//----------------------------------------------------------------------------\n//       Response Rate Set Register\t(offset 0x440, 24bits)\n//----------------------------------------------------------------------------\n#define RRSR_1M\t\t\t\t\tBIT0\n#define RRSR_2M\t\t\t\t\tBIT1 \n#define RRSR_5_5M\t\t\t\tBIT2 \n#define RRSR_11M\t\t\t\tBIT3 \n#define RRSR_6M\t\t\t\t\tBIT4 \n#define RRSR_9M\t\t\t\t\tBIT5 \n#define RRSR_12M\t\t\t\tBIT6 \n#define RRSR_18M\t\t\t\tBIT7 \n#define RRSR_24M\t\t\t\tBIT8 \n#define RRSR_36M\t\t\t\tBIT9 \n#define RRSR_48M\t\t\t\tBIT10 \n#define RRSR_54M\t\t\t\tBIT11\n#define RRSR_MCS0\t\t\t\tBIT12\n#define RRSR_MCS1\t\t\t\tBIT13\n#define RRSR_MCS2\t\t\t\tBIT14\n#define RRSR_MCS3\t\t\t\tBIT15\n#define RRSR_MCS4\t\t\t\tBIT16\n#define RRSR_MCS5\t\t\t\tBIT17\n#define RRSR_MCS6\t\t\t\tBIT18\n#define RRSR_MCS7\t\t\t\tBIT19\n\n#define RRSR_CCK_RATES (RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M)\n#define RRSR_OFDM_RATES (RRSR_54M|RRSR_48M|RRSR_36M|RRSR_24M|RRSR_18M|RRSR_12M|RRSR_9M|RRSR_6M)\n\n// WOL bit information\n#define HAL92C_WOL_PTK_UPDATE_EVENT\t\tBIT0\n#define HAL92C_WOL_GTK_UPDATE_EVENT\t\tBIT1\n#define HAL92C_WOL_DISASSOC_EVENT\t\tBIT2\n#define HAL92C_WOL_DEAUTH_EVENT\t\t\tBIT3\n#define HAL92C_WOL_FW_DISCONNECT_EVENT\tBIT4\n\n//----------------------------------------------------------------------------\n//       Rate Definition\n//----------------------------------------------------------------------------\n//CCK\n#define\tRATR_1M\t\t\t\t\t0x00000001\n#define\tRATR_2M\t\t\t\t\t0x00000002\n#define\tRATR_55M\t\t\t\t\t0x00000004\n#define\tRATR_11M\t\t\t\t\t0x00000008\n//OFDM \t\t\n#define\tRATR_6M\t\t\t\t\t0x00000010\n#define\tRATR_9M\t\t\t\t\t0x00000020\n#define\tRATR_12M\t\t\t\t\t0x00000040\n#define\tRATR_18M\t\t\t\t\t0x00000080\n#define\tRATR_24M\t\t\t\t\t0x00000100\n#define\tRATR_36M\t\t\t\t\t0x00000200\n#define\tRATR_48M\t\t\t\t\t0x00000400\n#define\tRATR_54M\t\t\t\t\t0x00000800\n//MCS 1 Spatial Stream\t\n#define\tRATR_MCS0\t\t\t\t\t0x00001000\n#define\tRATR_MCS1\t\t\t\t\t0x00002000\n#define\tRATR_MCS2\t\t\t\t\t0x00004000\n#define\tRATR_MCS3\t\t\t\t\t0x00008000\n#define\tRATR_MCS4\t\t\t\t\t0x00010000\n#define\tRATR_MCS5\t\t\t\t\t0x00020000\n#define\tRATR_MCS6\t\t\t\t\t0x00040000\n#define\tRATR_MCS7\t\t\t\t\t0x00080000\n//MCS 2 Spatial Stream\n#define\tRATR_MCS8\t\t\t\t\t0x00100000\n#define\tRATR_MCS9\t\t\t\t\t0x00200000\n#define\tRATR_MCS10\t\t\t\t\t0x00400000\n#define\tRATR_MCS11\t\t\t\t\t0x00800000\n#define\tRATR_MCS12\t\t\t\t\t0x01000000\n#define\tRATR_MCS13\t\t\t\t\t0x02000000\n#define\tRATR_MCS14\t\t\t\t\t0x04000000\n#define\tRATR_MCS15\t\t\t\t\t0x08000000\n\n//CCK\n#define RATE_1M\t\t\t\t\tBIT(0)\n#define RATE_2M\t\t\t\t\tBIT(1)\n#define RATE_5_5M\t\t\t\tBIT(2)\n#define RATE_11M\t\t\t\tBIT(3)\n//OFDM \n#define RATE_6M\t\t\t\t\tBIT(4)\n#define RATE_9M\t\t\t\t\tBIT(5)\n#define RATE_12M\t\t\t\tBIT(6)\n#define RATE_18M\t\t\t\tBIT(7)\n#define RATE_24M\t\t\t\tBIT(8)\n#define RATE_36M\t\t\t\tBIT(9)\n#define RATE_48M\t\t\t\tBIT(10)\n#define RATE_54M\t\t\t\tBIT(11)\n//MCS 1 Spatial Stream\n#define RATE_MCS0\t\t\t\tBIT(12)\n#define RATE_MCS1\t\t\t\tBIT(13)\n#define RATE_MCS2\t\t\t\tBIT(14)\n#define RATE_MCS3\t\t\t\tBIT(15)\n#define RATE_MCS4\t\t\t\tBIT(16)\n#define RATE_MCS5\t\t\t\tBIT(17)\n#define RATE_MCS6\t\t\t\tBIT(18)\n#define RATE_MCS7\t\t\t\tBIT(19)\n//MCS 2 Spatial Stream\n#define RATE_MCS8\t\t\t\tBIT(20)\n#define RATE_MCS9\t\t\t\tBIT(21)\n#define RATE_MCS10\t\t\t\tBIT(22)\n#define RATE_MCS11\t\t\t\tBIT(23)\n#define RATE_MCS12\t\t\t\tBIT(24)\n#define RATE_MCS13\t\t\t\tBIT(25)\n#define RATE_MCS14\t\t\t\tBIT(26)\n#define RATE_MCS15\t\t\t\tBIT(27)\n\n\n// ALL CCK Rate\n#define\tRATE_ALL_CCK\t\t\t\tRATR_1M|RATR_2M|RATR_55M|RATR_11M \n#define\tRATE_ALL_OFDM_AG\t\t\tRATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|\\\n\t\t\t\t\t\tRATR_36M|RATR_48M|RATR_54M\t\n#define\tRATE_ALL_OFDM_1SS\t\t\tRATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 |\\\n\t\t\t\t\t\tRATR_MCS4|RATR_MCS5|RATR_MCS6\t|RATR_MCS7\t\n#define\tRATE_ALL_OFDM_2SS\t\t\tRATR_MCS8|RATR_MCS9\t|RATR_MCS10|RATR_MCS11|\\\n\t\t\t\t\t\tRATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15\n\n#define RATE_BITMAP_ALL\t\t\t0xFFFFF\n\n// Only use CCK 1M rate for ACK\n#define RATE_RRSR_CCK_ONLY_1M\t\t0xFFFF1\n#define RATE_RRSR_WITHOUT_CCK\t\t0xFFFF0\n\n//----------------------------------------------------------------------------\n//       BW_OPMODE bits\t\t\t\t(Offset 0x603, 8bit)\n//----------------------------------------------------------------------------\n#define BW_OPMODE_20MHZ\t\t\tBIT2\n#define BW_OPMODE_5G\t\t\t\tBIT1\n\n//----------------------------------------------------------------------------\n//       CAM Config Setting (offset 0x680, 1 byte)\n//----------------------------------------------------------------------------   \t       \t\t\n#define CAM_VALID\t\t\t\tBIT15\n#define CAM_NOTVALID\t\t\t0x0000\n#define CAM_USEDK\t\t\t\tBIT5\n\n#define CAM_CONTENT_COUNT \t8\n\n#define CAM_NONE\t\t\t\t0x0\n#define CAM_WEP40\t\t\t\t0x01\n#define CAM_TKIP\t\t\t\t0x02\n#define CAM_AES\t\t\t\t\t0x04\n#define CAM_WEP104\t\t\t\t0x05\n#define CAM_SMS4\t\t\t\t0x6\n        \t\t\n#define TOTAL_CAM_ENTRY\t\t32\n#define HALF_CAM_ENTRY\t\t\t16\t\n       \t\t\n#define CAM_CONFIG_USEDK\t\t_TRUE\n#define CAM_CONFIG_NO_USEDK\t_FALSE\n\n#define CAM_WRITE\t\t\t\tBIT16\n#define CAM_READ\t\t\t\t0x00000000\n#define CAM_POLLINIG\t\t\tBIT31\n\n//\n// 10. Power Save Control Registers\t \n//\n#define WOW_PMEN\t\t\t\tBIT0 // Power management Enable.\n#define WOW_WOMEN\t\t\t\tBIT1 // WoW function on or off. \n#define WOW_MAGIC\t\t\t\tBIT2 // Magic packet\n#define WOW_UWF\t\t\t\tBIT3 // Unicast Wakeup frame.\n\n//\n// 12. Host Interrupt Status Registers\t \n//\n//----------------------------------------------------------------------------\n//      8190 IMR/ISR bits\t\t\t\t\t\t\n//----------------------------------------------------------------------------\n#define IMR8190_DISABLED\t\t0x0\n#define IMR_DISABLED\t\t\t0x0\n// IMR DW0 Bit 0-31\n#define IMR_BCNDMAINT6\t\t\tBIT31\t\t// Beacon DMA Interrupt 6\n#define IMR_BCNDMAINT5\t\t\tBIT30\t\t// Beacon DMA Interrupt 5\n#define IMR_BCNDMAINT4\t\t\tBIT29\t\t// Beacon DMA Interrupt 4\n#define IMR_BCNDMAINT3\t\t\tBIT28\t\t// Beacon DMA Interrupt 3\n#define IMR_BCNDMAINT2\t\t\tBIT27\t\t// Beacon DMA Interrupt 2\n#define IMR_BCNDMAINT1\t\t\tBIT26\t\t// Beacon DMA Interrupt 1\n#define IMR_BCNDOK8\t\t\t\tBIT25\t\t// Beacon Queue DMA OK Interrup 8\n#define IMR_BCNDOK7\t\t\t\tBIT24\t\t// Beacon Queue DMA OK Interrup 7\n#define IMR_BCNDOK6\t\t\t\tBIT23\t\t// Beacon Queue DMA OK Interrup 6\n#define IMR_BCNDOK5\t\t\t\tBIT22\t\t// Beacon Queue DMA OK Interrup 5\n#define IMR_BCNDOK4\t\t\t\tBIT21\t\t// Beacon Queue DMA OK Interrup 4\n#define IMR_BCNDOK3\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 3\n#define IMR_BCNDOK2\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 2\n#define IMR_BCNDOK1\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 1\n#define IMR_TIMEOUT2\t\t\tBIT17\t\t// Timeout interrupt 2\n#define IMR_TIMEOUT1\t\t\tBIT16\t\t// Timeout interrupt 1\n#define IMR_TXFOVW\t\t\t\tBIT15\t\t// Transmit FIFO Overflow\n#define IMR_PSTIMEOUT\t\t\tBIT14\t\t// Power save time out interrupt \n#define IMR_BcnInt\t\t\t\tBIT13\t\t// Beacon DMA Interrupt 0\n#define IMR_RXFOVW\t\t\t\tBIT12\t\t// Receive FIFO Overflow\n#define IMR_RDU\t\t\t\t\tBIT11\t\t// Receive Descriptor Unavailable\n#define IMR_ATIMEND\t\t\t\tBIT10\t\t// For 92C,ATIM Window End Interrupt. For 8723 and later ICs, it also means P2P CTWin End interrupt.\n#define IMR_BDOK\t\t\t\tBIT9\t\t// Beacon Queue DMA OK Interrup\n#define IMR_HIGHDOK\t\t\t\tBIT8\t\t// High Queue DMA OK Interrupt\n#define IMR_TBDOK\t\t\t\tBIT7\t\t// Transmit Beacon OK interrup\n#define IMR_MGNTDOK\t\t\tBIT6\t\t// Management Queue DMA OK Interrupt\n#define IMR_TBDER\t\t\t\tBIT5\t\t// For 92C,Transmit Beacon Error Interrupt\n#define IMR_BKDOK\t\t\t\tBIT4\t\t// AC_BK DMA OK Interrupt\n#define IMR_BEDOK\t\t\t\tBIT3\t\t// AC_BE DMA OK Interrupt\n#define IMR_VIDOK\t\t\t\tBIT2\t\t// AC_VI DMA OK Interrupt\n#define IMR_VODOK\t\t\t\tBIT1\t\t// AC_VO DMA Interrupt\n#define IMR_ROK\t\t\t\t\tBIT0\t\t// Receive DMA OK Interrupt\n\n// 13. Host Interrupt Status Extension Register\t (Offset: 0x012C-012Eh)\n#define IMR_TSF_BIT32_TOGGLE\tBIT15\n#define IMR_BcnInt_E\t\t\t\tBIT12\n#define IMR_TXERR\t\t\t\tBIT11\n#define IMR_RXERR\t\t\t\tBIT10\n#define IMR_C2HCMD\t\t\t\tBIT9\n#define IMR_CPWM\t\t\t\tBIT8\n//RSVD [2-7]\n#define IMR_OCPINT\t\t\t\tBIT1\n#define IMR_WLANOFF\t\t\tBIT0\n\n//----------------------------------------------------------------------------\n// 8723E series PCIE Host IMR/ISR bit\n//----------------------------------------------------------------------------\n// IMR DW0 Bit 0-31\n#define PHIMR_TIMEOUT2\t\t\t\tBIT31\n#define PHIMR_TIMEOUT1\t\t\t\tBIT30\n#define PHIMR_PSTIMEOUT\t\t\tBIT29\n#define PHIMR_GTINT4\t\t\t\tBIT28\n#define PHIMR_GTINT3\t\t\t\tBIT27\n#define PHIMR_TXBCNERR\t\t\t\tBIT26\n#define PHIMR_TXBCNOK\t\t\t\tBIT25\n#define PHIMR_TSF_BIT32_TOGGLE\tBIT24\n#define PHIMR_BCNDMAINT3\t\t\tBIT23\n#define PHIMR_BCNDMAINT2\t\t\tBIT22\n#define PHIMR_BCNDMAINT1\t\t\tBIT21\n#define PHIMR_BCNDMAINT0\t\t\tBIT20\n#define PHIMR_BCNDOK3\t\t\t\tBIT19\n#define PHIMR_BCNDOK2\t\t\t\tBIT18\n#define PHIMR_BCNDOK1\t\t\t\tBIT17\n#define PHIMR_BCNDOK0\t\t\t\tBIT16\n#define PHIMR_HSISR_IND_ON\t\t\tBIT15\n#define PHIMR_BCNDMAINT_E\t\t\tBIT14\n#define PHIMR_ATIMEND_E\t\t\tBIT13\n#define PHIMR_ATIM_CTW_END\t\tBIT12\n#define PHIMR_HISRE_IND\t\t\tBIT11\t// RO. HISRE Indicator (HISRE & HIMRE is true, this bit is set to 1)\n#define PHIMR_C2HCMD\t\t\t\tBIT10\n#define PHIMR_CPWM2\t\t\t\tBIT9\n#define PHIMR_CPWM\t\t\t\t\tBIT8\n#define PHIMR_HIGHDOK\t\t\t\tBIT7\t\t// High Queue DMA OK Interrupt\n#define PHIMR_MGNTDOK\t\t\t\tBIT6\t\t// Management Queue DMA OK Interrupt\n#define PHIMR_BKDOK\t\t\t\t\tBIT5\t\t// AC_BK DMA OK Interrupt\n#define PHIMR_BEDOK\t\t\t\t\tBIT4\t\t// AC_BE DMA OK Interrupt\n#define PHIMR_VIDOK\t\t\t\t\tBIT3\t\t// AC_VI DMA OK Interrupt\n#define PHIMR_VODOK\t\t\t\tBIT2\t\t// AC_VO DMA Interrupt\n#define PHIMR_RDU\t\t\t\t\tBIT1\t\t// Receive Descriptor Unavailable\n#define PHIMR_ROK\t\t\t\t\tBIT0\t\t// Receive DMA OK Interrupt\n\n// PCIE Host Interrupt Status Extension bit\n#define PHIMR_BCNDMAINT7\t\t\tBIT23\n#define PHIMR_BCNDMAINT6\t\t\tBIT22\n#define PHIMR_BCNDMAINT5\t\t\tBIT21\n#define PHIMR_BCNDMAINT4\t\t\tBIT20\n#define PHIMR_BCNDOK7\t\t\t\tBIT19\n#define PHIMR_BCNDOK6\t\t\t\tBIT18\n#define PHIMR_BCNDOK5\t\t\t\tBIT17\n#define PHIMR_BCNDOK4\t\t\t\tBIT16\n// bit12 15: RSVD\n#define PHIMR_TXERR\t\t\t\t\tBIT11\n#define PHIMR_RXERR\t\t\t\t\tBIT10\n#define PHIMR_TXFOVW\t\t\t\tBIT9\n#define PHIMR_RXFOVW\t\t\t\tBIT8\n// bit2-7: RSVD\n#define PHIMR_OCPINT\t\t\t\tBIT1\n// bit0: RSVD\n\n#define UHIMR_TIMEOUT2\t\t\t\tBIT31\n#define UHIMR_TIMEOUT1\t\t\t\tBIT30\n#define UHIMR_PSTIMEOUT\t\t\tBIT29\n#define UHIMR_GTINT4\t\t\t\tBIT28\n#define UHIMR_GTINT3\t\t\t\tBIT27\n#define UHIMR_TXBCNERR\t\t\t\tBIT26\n#define UHIMR_TXBCNOK\t\t\t\tBIT25\n#define UHIMR_TSF_BIT32_TOGGLE\tBIT24\n#define UHIMR_BCNDMAINT3\t\t\tBIT23\n#define UHIMR_BCNDMAINT2\t\t\tBIT22\n#define UHIMR_BCNDMAINT1\t\t\tBIT21\n#define UHIMR_BCNDMAINT0\t\t\tBIT20\n#define UHIMR_BCNDOK3\t\t\t\tBIT19\n#define UHIMR_BCNDOK2\t\t\t\tBIT18\n#define UHIMR_BCNDOK1\t\t\t\tBIT17\n#define UHIMR_BCNDOK0\t\t\t\tBIT16\n#define UHIMR_HSISR_IND\t\t\tBIT15\n#define UHIMR_BCNDMAINT_E\t\t\tBIT14\n//RSVD\tBIT13\n#define UHIMR_CTW_END\t\t\t\tBIT12\n//RSVD\tBIT11\n#define UHIMR_C2HCMD\t\t\t\tBIT10\n#define UHIMR_CPWM2\t\t\t\tBIT9\n#define UHIMR_CPWM\t\t\t\t\tBIT8\n#define UHIMR_HIGHDOK\t\t\t\tBIT7\t\t// High Queue DMA OK Interrupt\n#define UHIMR_MGNTDOK\t\t\t\tBIT6\t\t// Management Queue DMA OK Interrupt\n#define UHIMR_BKDOK\t\t\t\tBIT5\t\t// AC_BK DMA OK Interrupt\n#define UHIMR_BEDOK\t\t\t\tBIT4\t\t// AC_BE DMA OK Interrupt\n#define UHIMR_VIDOK\t\t\t\t\tBIT3\t\t// AC_VI DMA OK Interrupt\n#define UHIMR_VODOK\t\t\t\tBIT2\t\t// AC_VO DMA Interrupt\n#define UHIMR_RDU\t\t\t\t\tBIT1\t\t// Receive Descriptor Unavailable\n#define UHIMR_ROK\t\t\t\t\tBIT0\t\t// Receive DMA OK Interrupt\n\n// USB Host Interrupt Status Extension bit\n#define UHIMR_BCNDMAINT7\t\t\tBIT23\n#define UHIMR_BCNDMAINT6\t\t\tBIT22\n#define UHIMR_BCNDMAINT5\t\t\tBIT21\n#define UHIMR_BCNDMAINT4\t\t\tBIT20\n#define UHIMR_BCNDOK7\t\t\t\tBIT19\n#define UHIMR_BCNDOK6\t\t\t\tBIT18\n#define UHIMR_BCNDOK5\t\t\t\tBIT17\n#define UHIMR_BCNDOK4\t\t\t\tBIT16\n// bit14-15: RSVD\n#define UHIMR_ATIMEND_E\t\t\tBIT13\n#define UHIMR_ATIMEND\t\t\t\tBIT12\n#define UHIMR_TXERR\t\t\t\t\tBIT11\n#define UHIMR_RXERR\t\t\t\t\tBIT10\n#define UHIMR_TXFOVW\t\t\t\tBIT9\n#define UHIMR_RXFOVW\t\t\t\tBIT8\n// bit2-7: RSVD\n#define UHIMR_OCPINT\t\t\t\tBIT1\n// bit0: RSVD\n\n\n#define HAL_NIC_UNPLUG_ISR\t\t\t0xFFFFFFFF\t// The value when the NIC is unplugged for PCI.\n#define HAL_NIC_UNPLUG_PCI_ISR\t\t0xEAEAEAEA\t// The value when the NIC is unplugged for PCI in PCI interrupt (page 3).\n\n//----------------------------------------------------------------------------\n//       8188 IMR/ISR bits\t\t\t\t\t\t\n//----------------------------------------------------------------------------\n#define IMR_DISABLED_88E\t\t\t0x0\n// IMR DW0(0x0060-0063) Bit 0-31\n#define IMR_TXCCK_88E\t\t\t\tBIT30\t\t// TXRPT interrupt when CCX bit of the packet is set\t\n#define IMR_PSTIMEOUT_88E\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define IMR_GTINT4_88E\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define IMR_GTINT3_88E\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define IMR_TBDER_88E\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define IMR_TBDOK_88E\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define IMR_TSF_BIT32_TOGGLE_88E\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define IMR_BCNDMAINT0_88E\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define IMR_BCNDERR0_88E\t\t\tBIT16\t\t// Beacon Queue DMA Error 0\n#define IMR_HSISR_IND_ON_INT_88E\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\t\t\t\n#define IMR_BCNDMAINT_E_88E\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define IMR_ATIMEND_88E\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define IMR_HISR1_IND_INT_88E\t\tBIT11\t\t// HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1)\n#define IMR_C2HCMD_88E\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define IMR_CPWM2_88E\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define IMR_CPWM_88E\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define IMR_HIGHDOK_88E\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define IMR_MGNTDOK_88E\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define IMR_BKDOK_88E\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define IMR_BEDOK_88E\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define IMR_VIDOK_88E\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define IMR_VODOK_88E\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define IMR_RDU_88E\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define IMR_ROK_88E\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define IMR_BCNDMAINT7_88E\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define IMR_BCNDMAINT6_88E\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define IMR_BCNDMAINT5_88E\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define IMR_BCNDMAINT4_88E\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define IMR_BCNDMAINT3_88E\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define IMR_BCNDMAINT2_88E\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define IMR_BCNDMAINT1_88E\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define IMR_BCNDOK7_88E\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define IMR_BCNDOK6_88E\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define IMR_BCNDOK5_88E\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define IMR_BCNDOK4_88E\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define IMR_BCNDOK3_88E\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define IMR_BCNDOK2_88E\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define IMR_BCNDOK1_88E\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define IMR_ATIMEND_E_88E\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define IMR_TXERR_88E\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define IMR_RXERR_88E\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define IMR_TXFOVW_88E\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define IMR_RXFOVW_88E\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n/*===================================================================\n=====================================================================\nHere the register defines are for 92C. When the define is as same with 92C, \nwe will use the 92C's define for the consistency\nSo the following defines for 92C is not entire!!!!!!\n=====================================================================\n=====================================================================*/\n/*\nBased on Datasheet V33---090401\nRegister Summary\nCurrent IOREG MAP\n0x0000h ~ 0x00FFh   System Configuration (256 Bytes)\n0x0100h ~ 0x01FFh   MACTOP General Configuration (256 Bytes)\n0x0200h ~ 0x027Fh   TXDMA Configuration (128 Bytes)\n0x0280h ~ 0x02FFh   RXDMA Configuration (128 Bytes)\n0x0300h ~ 0x03FFh   PCIE EMAC Reserved Region (256 Bytes)\n0x0400h ~ 0x04FFh   Protocol Configuration (256 Bytes)\n0x0500h ~ 0x05FFh   EDCA Configuration (256 Bytes)\n0x0600h ~ 0x07FFh   WMAC Configuration (512 Bytes)\n0x2000h ~ 0x3FFFh   8051 FW Download Region (8196 Bytes)\n*/\n\t//----------------------------------------------------------------------------\n\t//\t\t 8192C (TXPAUSE) transmission pause \t(Offset 0x522, 8 bits)\n\t//----------------------------------------------------------------------------\n// Note:\n//\tThe the bits of stoping AC(VO/VI/BE/BK) queue in datasheet RTL8192S/RTL8192C are wrong,\n//\tthe correct arragement is VO - Bit0, VI - Bit1, BE - Bit2, and BK - Bit3.\n//\t8723 and 88E may be not correct either in the eralier version. Confirmed with DD Tim.\n// By Bruce, 2011-09-22.\n#define StopBecon\t\tBIT6\n#define StopHigh\t\t\tBIT5\n#define StopMgt\t\t\tBIT4\n#define StopBK\t\t\tBIT3\n#define StopBE\t\t\tBIT2\n#define StopVI\t\t\tBIT1\n#define StopVO\t\t\tBIT0\n\n//----------------------------------------------------------------------------\n//       8192C (RCR) Receive Configuration Register\t(Offset 0x608, 32 bits)\n//----------------------------------------------------------------------------\n#define RCR_APPFCS\t\t\t\tBIT31\t// WMAC append FCS after pauload\n#define RCR_APP_MIC\t\t\t\tBIT30\t// MACRX will retain the MIC at the bottom of the packet. \n#define RCR_APP_ICV\t\t\t\tBIT29\t// MACRX will retain the ICV at the bottom of the packet.\n#define RCR_APP_PHYST_RXFF\t\tBIT28\t// PHY Status is appended before RX packet in RXFF\n#define RCR_APP_BA_SSN\t\t\tBIT27\t// SSN of previous TXBA is appended as after original RXDESC as the 4-th DW of RXDESC.\n#define RCR_VHT_DACK\t\t\tBIT26\t/* This bit to control response type for vht single mpdu data packet. 1. ACK as response 0. BA as response */\n#define RCR_TCPOFLD_EN\t\t\tBIT25\t/* Enable TCP checksum offload */\n#define RCR_ENMBID\t\t\t\tBIT24\t// Enable Multiple BssId. Only response ACK to the packets whose DID(A1) matching to the addresses in the MBSSID CAM Entries.\n#define RCR_LSIGEN\t\t\t\tBIT23\t// Enable LSIG TXOP Protection function. Search KEYCAM for each rx packet to check if LSIGEN bit is set.\n#define RCR_MFBEN\t\t\t\tBIT22\t// Enable immediate MCS Feedback function. When Rx packet with MRQ = 1'b1, then search KEYCAM to find sender's MCS Feedback function and send response.\n#define RCR_DISCHKPPDLLEN\t\tBIT21\t/* Do not check PPDU while the PPDU length is smaller than 14 byte. */\n#define RCR_PKTCTL_DLEN\t\t\tBIT20\t/* While rx path dead lock occurs, reset rx path */\n#define RCR_DISGCLK\t\t\t\tBIT19\t/* Disable macrx clock gating control (no used) */\n#define RCR_TIM_PARSER_EN\t\tBIT18\t// RX Beacon TIM Parser.\n#define RCR_BC_MD_EN\t\t\tBIT17\t/* Broadcast data packet more data bit check interrupt enable.*/\n#define RCR_UC_MD_EN\t\t\tBIT16\t/* Unicast data packet more data bit check interrupt enable. */\n#define RCR_RXSK_PERPKT\t\t\tBIT15\t/* Executing key search per MPDU */\n#define RCR_HTC_LOC_CTRL\t\tBIT14\t// MFC<--HTC=1 MFC-->HTC=0\n#define RCR_AMF\t\t\t\t\tBIT13\t// Accept management type frame\n#define RCR_ACF\t\t\t\t\tBIT12\t// Accept control type frame. Control frames BA, BAR, and PS-Poll (when in AP mode) are not controlled by this bit. They are controlled by ADF.\n#define RCR_ADF\t\t\t\t\tBIT11\t// Accept data type frame. This bit also regulates BA, BAR, and PS-Poll (AP mode only).\n#define RCR_DISDECMYPKT\t\t\tBIT10\t/* This bit determines whether hw need to do decryption.1: If A1 match, do decryption.0: Do decryption. */\n#define RCR_AICV\t\t\t\t\tBIT9\t\t// Accept ICV error packet\n#define RCR_ACRC32\t\t\t\tBIT8\t\t// Accept CRC32 error packet \n#define RCR_CBSSID_BCN\t\t\tBIT7\t\t// Accept BSSID match packet (Rx beacon, probe rsp)\n#define RCR_CBSSID_DATA\t\tBIT6\t\t// Accept BSSID match packet (Data)\n#define RCR_APWRMGT\t\t\tBIT5\t\t// Accept power management packet\n#define RCR_ADD3\t\t\t\tBIT4\t\t// Accept address 3 match packet\n#define RCR_AB\t\t\t\t\tBIT3\t\t// Accept broadcast packet \n#define RCR_AM\t\t\t\t\tBIT2\t\t// Accept multicast packet \n#define RCR_APM\t\t\t\t\tBIT1\t\t// Accept physical match packet\n#define RCR_AAP\t\t\t\t\tBIT0\t\t// Accept all unicast packet \n\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n\n//2 SYS_ISO_CTRL\n#define ISO_MD2PP\t\t\t\tBIT(0)\n#define ISO_UA2USB\t\t\t\tBIT(1)\n#define ISO_UD2CORE\t\t\t\tBIT(2)\n#define ISO_PA2PCIE\t\t\t\tBIT(3)\n#define ISO_PD2CORE\t\t\t\tBIT(4)\n#define ISO_IP2MAC\t\t\t\tBIT(5)\n#define ISO_DIOP\t\t\t\t\tBIT(6)\n#define ISO_DIOE\t\t\t\t\tBIT(7)\n#define ISO_EB2CORE\t\t\t\tBIT(8)\n#define ISO_DIOR\t\t\t\t\tBIT(9)\n#define PWC_EV12V\t\t\t\tBIT(15)\n\n\n//2 SYS_FUNC_EN\n#define FEN_BBRSTB\t\t\t\tBIT(0)\n#define FEN_BB_GLB_RSTn\t\tBIT(1)\n#define FEN_USBA\t\t\t\tBIT(2)\n#define FEN_UPLL\t\t\t\tBIT(3)\n#define FEN_USBD\t\t\t\tBIT(4)\n#define FEN_DIO_PCIE\t\t\tBIT(5)\n#define FEN_PCIEA\t\t\t\tBIT(6)\n#define FEN_PPLL\t\t\t\t\tBIT(7)\n#define FEN_PCIED\t\t\t\tBIT(8)\n#define FEN_DIOE\t\t\t\tBIT(9)\n#define FEN_CPUEN\t\t\t\tBIT(10)\n#define FEN_DCORE\t\t\t\tBIT(11)\n#define FEN_ELDR\t\t\t\tBIT(12)\n#define FEN_EN_25_1\t\t\t\tBIT(13)\n#define FEN_HWPDN\t\t\t\tBIT(14)\n#define FEN_MREGEN\t\t\t\tBIT(15)\n\n//2 APS_FSMCO\n#define PFM_LDALL\t\t\t\tBIT(0)\n#define PFM_ALDN\t\t\t\tBIT(1)\n#define PFM_LDKP\t\t\t\tBIT(2)\n#define PFM_WOWL\t\t\t\tBIT(3)\n#define EnPDN\t\t\t\t\tBIT(4)\n#define PDN_PL\t\t\t\t\tBIT(5)\n#define APFM_ONMAC\t\t\t\tBIT(8)\n#define APFM_OFF\t\t\t\tBIT(9)\n#define APFM_RSM\t\t\t\tBIT(10)\n#define AFSM_HSUS\t\t\t\tBIT(11)\n#define AFSM_PCIE\t\t\t\tBIT(12)\n#define APDM_MAC\t\t\t\tBIT(13)\n#define APDM_HOST\t\t\t\tBIT(14)\n#define APDM_HPDN\t\t\t\tBIT(15)\n#define RDY_MACON\t\t\t\tBIT(16)\n#define SUS_HOST\t\t\t\tBIT(17)\n#define ROP_ALD\t\t\t\t\tBIT(20)\n#define ROP_PWR\t\t\t\t\tBIT(21)\n#define ROP_SPS\t\t\t\t\tBIT(22)\n#define SOP_MRST\t\t\t\tBIT(25)\n#define SOP_FUSE\t\t\t\tBIT(26)\n#define SOP_ABG\t\t\t\t\tBIT(27)\n#define SOP_AMB\t\t\t\t\tBIT(28)\n#define SOP_RCK\t\t\t\t\tBIT(29)\n#define SOP_A8M\t\t\t\t\tBIT(30)\n#define XOP_BTCK\t\t\t\tBIT(31)\n\n//2 SYS_CLKR\n#define ANAD16V_EN\t\t\t\tBIT(0)\n#define ANA8M\t\t\t\t\tBIT(1)\n#define MACSLP\t\t\t\t\tBIT(4)\n#define LOADER_CLK_EN\t\t\tBIT(5)\n\n\n//2 9346CR /REG_SYS_EEPROM_CTRL\n#define BOOT_FROM_EEPROM\t\tBIT(4)\n#define EEPROMSEL\t\t\t\tBIT(4)\n#define EEPROM_EN\t\t\t\tBIT(5)\n\n\n//2 RF_CTRL\n#define RF_EN\t\t\t\t\tBIT(0)\n#define RF_RSTB\t\t\t\t\tBIT(1)\n#define RF_SDMRSTB\t\t\t\tBIT(2)\n\n\n//2 LDOV12D_CTRL\n#define LDV12_EN\t\t\t\tBIT(0)\n#define LDV12_SDBY\t\t\t\tBIT(1)\n#define LPLDO_HSM\t\t\t\tBIT(2)\n#define LPLDO_LSM_DIS\t\t\tBIT(3)\n#define _LDV12_VADJ(x)\t\t\t(((x) & 0xF) << 4)\n\n\n\n//2 EFUSE_TEST (For RTL8723 partially)\n#define EF_TRPT\t\t\t\t\tBIT(7)\n#define EF_CELL_SEL\t\t\t\t(BIT(8)|BIT(9)) // 00: Wifi Efuse, 01: BT Efuse0, 10: BT Efuse1, 11: BT Efuse2\n#define LDOE25_EN\t\t\t\tBIT(31)\n#define EFUSE_SEL(x)\t\t\t\t(((x) & 0x3) << 8)\n#define EFUSE_SEL_MASK\t\t\t0x300\n#define EFUSE_WIFI_SEL_0\t\t0x0\n#define EFUSE_BT_SEL_0\t\t\t0x1\n#define EFUSE_BT_SEL_1\t\t\t0x2\n#define EFUSE_BT_SEL_2\t\t\t0x3\n\n\n//2 8051FWDL\n//2 MCUFWDL\n#define MCUFWDL_EN\t\t\t\tBIT(0)\n#define MCUFWDL_RDY\t\t\tBIT(1)\n#define FWDL_ChkSum_rpt\t\tBIT(2)\n#define MACINI_RDY\t\t\t\tBIT(3)\n#define BBINI_RDY\t\t\t\tBIT(4)\n#define RFINI_RDY\t\t\t\tBIT(5)\n#define WINTINI_RDY\t\t\t\tBIT(6)\n#define RAM_DL_SEL\t\t\t\tBIT(7)\n#define CPU_DL_READY\t\t\tBIT(15) /* add flag  by gw for fw download ready 20130826 */\n#define ROM_DLEN\t\t\t\tBIT(19)\n#define CPRST\t\t\t\t\tBIT(23)\n\n\n//2 REG_SYS_CFG\n#define XCLK_VLD\t\t\t\tBIT(0)\n#define ACLK_VLD\t\t\t\tBIT(1)\n#define UCLK_VLD\t\t\t\tBIT(2)\n#define PCLK_VLD\t\t\t\tBIT(3)\n#define PCIRSTB\t\t\t\t\tBIT(4)\n#define V15_VLD\t\t\t\t\tBIT(5)\n#define SW_OFFLOAD_EN\t\t\tBIT(7)\n#define SIC_IDLE\t\t\t\t\tBIT(8)\n#define BD_MAC2\t\t\t\t\tBIT(9)\n#define BD_MAC1\t\t\t\t\tBIT(10)\n#define IC_MACPHY_MODE\t\tBIT(11)\n#define CHIP_VER\t\t\t\t(BIT(12)|BIT(13)|BIT(14)|BIT(15))\n#define BT_FUNC\t\t\t\t\tBIT(16)\n#define VENDOR_ID\t\t\t\tBIT(19)\n#define EXT_VENDOR_ID\t\t\t(BIT(18)|BIT(19)) //Currently only for RTL8723B\n#define PAD_HWPD_IDN\t\t\tBIT(22)\n#define TRP_VAUX_EN\t\t\t\tBIT(23)\t// RTL ID\n#define TRP_BT_EN\t\t\t\tBIT(24)\n#define BD_PKG_SEL\t\t\t\tBIT(25)\n#define BD_HCI_SEL\t\t\t\tBIT(26)\n#define TYPE_ID\t\t\t\t\tBIT(27)\n#define RF_TYPE_ID\t\t\t\tBIT(27)\n\n#define RTL_ID\t\t\t\t\tBIT(23) // TestChip ID, 1:Test(RLE); 0:MP(RL)\n#define SPS_SEL\t\t\t\t\tBIT(24) // 1:LDO regulator mode; 0:Switching regulator mode\n\n\n#define CHIP_VER_RTL_MASK\t\t0xF000\t//Bit 12 ~ 15\n#define CHIP_VER_RTL_SHIFT\t\t12\n#define EXT_VENDOR_ID_SHIFT\t18\n\n//2 REG_GPIO_OUTSTS (For RTL8723 only)\n#define EFS_HCI_SEL\t\t\t\t(BIT(0)|BIT(1))\n#define PAD_HCI_SEL\t\t\t\t(BIT(2)|BIT(3))\n#define HCI_SEL\t\t\t\t\t(BIT(4)|BIT(5)) \n#define PKG_SEL_HCI\t\t\t\tBIT(6)\n#define FEN_GPS\t\t\t\t\tBIT(7)\n#define FEN_BT\t\t\t\t\tBIT(8)\n#define FEN_WL\t\t\t\t\tBIT(9)\n#define FEN_PCI\t\t\t\t\tBIT(10)\n#define FEN_USB\t\t\t\t\tBIT(11)\n#define BTRF_HWPDN_N\t\t\tBIT(12)\n#define WLRF_HWPDN_N\t\t\tBIT(13)\n#define PDN_BT_N\t\t\t\tBIT(14)\n#define PDN_GPS_N\t\t\t\tBIT(15)\n#define BT_CTL_HWPDN\t\t\tBIT(16)\n#define GPS_CTL_HWPDN\t\t\tBIT(17)\n#define PPHY_SUSB\t\t\t\tBIT(20)\n#define UPHY_SUSB\t\t\t\tBIT(21)\n#define PCI_SUSEN\t\t\t\tBIT(22)\n#define USB_SUSEN\t\t\t\tBIT(23)\n#define RF_RL_ID\t\t\t\t\t(BIT(31)|BIT(30)|BIT(29)|BIT(28))\n\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n\n//2 Function Enable Registers\n//2 CR\n#define HCI_TXDMA_EN\t\t\tBIT(0)\n#define HCI_RXDMA_EN\t\t\tBIT(1)\n#define TXDMA_EN\t\t\t\tBIT(2)\n#define RXDMA_EN\t\t\t\tBIT(3)\n#define PROTOCOL_EN\t\t\t\tBIT(4)\n#define SCHEDULE_EN\t\t\t\tBIT(5)\n#define MACTXEN\t\t\t\t\tBIT(6)\n#define MACRXEN\t\t\t\t\tBIT(7)\n#define ENSWBCN\t\t\t\t\tBIT(8)\n#define ENSEC\t\t\t\t\tBIT(9)\n#define CALTMR_EN\t\t\t\tBIT(10)\t// 32k CAL TMR enable\n\n// Network type\n#define _NETTYPE(x)\t\t\t\t(((x) & 0x3) << 16)\n#define MASK_NETTYPE\t\t\t0x30000\n#define NT_NO_LINK\t\t\t\t0x0\n#define NT_LINK_AD_HOC\t\t\t0x1\n#define NT_LINK_AP\t\t\t\t0x2\n#define NT_AS_AP\t\t\t\t0x3\n\n//2 PBP - Page Size Register\n#define GET_RX_PAGE_SIZE(value)\t\t\t((value) & 0xF)\n#define GET_TX_PAGE_SIZE(value)\t\t\t(((value) & 0xF0) >> 4)\n#define _PSRX_MASK\t\t\t\t0xF\n#define _PSTX_MASK\t\t\t\t0xF0\n#define _PSRX(x)\t\t\t\t(x)\n#define _PSTX(x)\t\t\t\t((x) << 4)\n\n#define PBP_64\t\t\t\t\t0x0\n#define PBP_128\t\t\t\t\t0x1\n#define PBP_256\t\t\t\t\t0x2\n#define PBP_512\t\t\t\t\t0x3\n#define PBP_1024\t\t\t\t0x4\n\n\n//2 TX/RXDMA\n#define RXDMA_ARBBW_EN\t\tBIT(0)\n#define RXSHFT_EN\t\t\t\tBIT(1)\n#define RXDMA_AGG_EN\t\t\tBIT(2)\n#define QS_VO_QUEUE\t\t\tBIT(8)\n#define QS_VI_QUEUE\t\t\t\tBIT(9)\n#define QS_BE_QUEUE\t\t\tBIT(10)\n#define QS_BK_QUEUE\t\t\tBIT(11)\n#define QS_MANAGER_QUEUE\t\tBIT(12)\n#define QS_HIGH_QUEUE\t\t\tBIT(13)\n\n#define HQSEL_VOQ\t\t\t\tBIT(0)\n#define HQSEL_VIQ\t\t\t\tBIT(1)\n#define HQSEL_BEQ\t\t\t\tBIT(2)\n#define HQSEL_BKQ\t\t\t\tBIT(3)\n#define HQSEL_MGTQ\t\t\t\tBIT(4)\n#define HQSEL_HIQ\t\t\t\tBIT(5)\n\n// For normal driver, 0x10C\n#define _TXDMA_CMQ_MAP(x) \t \t\t(((x)&0x3) << 16)\n#define _TXDMA_HIQ_MAP(x) \t \t\t(((x)&0x3) << 14)\n#define _TXDMA_MGQ_MAP(x) \t \t\t(((x)&0x3) << 12)\n#define _TXDMA_BKQ_MAP(x) \t \t\t(((x)&0x3) << 10)\t\t\n#define _TXDMA_BEQ_MAP(x) \t \t\t(((x)&0x3) << 8 )\n#define _TXDMA_VIQ_MAP(x) \t \t\t(((x)&0x3) << 6 )\n#define _TXDMA_VOQ_MAP(x) \t \t\t(((x)&0x3) << 4 )\n\n#define QUEUE_EXTRA\t\t\t\t0\n#define QUEUE_LOW\t\t\t\t1\n#define QUEUE_NORMAL\t\t\t2\n#define QUEUE_HIGH\t\t\t\t3\n\n\n//2 TRXFF_BNDY\n\n\n//2 LLT_INIT\n#define _LLT_NO_ACTIVE\t\t\t\t0x0\n#define _LLT_WRITE_ACCESS\t\t\t0x1\n#define _LLT_READ_ACCESS\t\t\t0x2\n\n#define _LLT_INIT_DATA(x)\t\t\t((x) & 0xFF)\n#define _LLT_INIT_ADDR(x)\t\t\t(((x) & 0xFF) << 8)\n#define _LLT_OP(x)\t\t\t\t\t(((x) & 0x3) << 30)\n#define _LLT_OP_VALUE(x)\t\t\t(((x) >> 30) & 0x3)\n\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n//2 RQPN\n#define _HPQ(x)\t\t\t\t\t((x) & 0xFF)\n#define _LPQ(x)\t\t\t\t\t(((x) & 0xFF) << 8)\n#define _PUBQ(x)\t\t\t\t\t(((x) & 0xFF) << 16)\n#define _NPQ(x)\t\t\t\t\t((x) & 0xFF)\t\t\t// NOTE: in RQPN_NPQ register\n#define _EPQ(x)\t\t\t\t\t(((x) & 0xFF) << 16)\t// NOTE: in RQPN_EPQ register\n\n\n#define HPQ_PUBLIC_DIS\t\t\tBIT(24)\n#define LPQ_PUBLIC_DIS\t\t\tBIT(25)\n#define LD_RQPN\t\t\t\t\tBIT(31)\n\n\n//2 TDECTL\n#define BLK_DESC_NUM_SHIFT\t\t\t4\n#define BLK_DESC_NUM_MASK\t\t\t0xF\n\n\n//2 TXDMA_OFFSET_CHK\n#define DROP_DATA_EN\t\t\t\tBIT(9)\n\n//2 AUTO_LLT\n#define BIT_SHIFT_TXPKTNUM 24\n#define BIT_MASK_TXPKTNUM 0xff\n#define BIT_TXPKTNUM(x) (((x) & BIT_MASK_TXPKTNUM) << BIT_SHIFT_TXPKTNUM)\n\n#define BIT_TDE_DBG_SEL BIT(23)\n#define BIT_AUTO_INIT_LLT BIT(16)\n\n#define BIT_SHIFT_Tx_OQT_free_space 8\n#define BIT_MASK_Tx_OQT_free_space 0xff\n#define BIT_Tx_OQT_free_space(x) (((x) & BIT_MASK_Tx_OQT_free_space) << BIT_SHIFT_Tx_OQT_free_space)\n\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x028Bh\tRX DMA Configuration\n//\n//-----------------------------------------------------\n\n//2 REG_RXDMA_CONTROL, 0x0286h\n// Write only. When this bit is set, RXDMA will decrease RX PKT counter by one. Before\n// this bit is polled, FW shall update RXFF_RD_PTR first. This register is write pulse and auto clear.\n//#define RXPKT_RELEASE_POLL\t\t\tBIT(0)\n// Read only. When RXMA finishes on-going DMA operation, RXMDA will report idle state in \n// this bit. FW can start releasing packets after RXDMA entering idle mode.\n//#define RXDMA_IDLE\t\t\t\t\tBIT(1)\n// When this bit is set, RXDMA will enter this mode after on-going RXDMA packet to host \n// completed, and stop DMA packet to host. RXDMA will then report Default: 0;\n//#define RW_RELEASE_EN\t\t\t\tBIT(2)\n\n//2 REG_RXPKT_NUM, 0x0284\n#define \tRXPKT_RELEASE_POLL\tBIT(16)\n#define\tRXDMA_IDLE\t\t\t\tBIT(17)\n#define\tRW_RELEASE_EN\t\t\tBIT(18)\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n//2 FWHW_TXQ_CTRL\n#define EN_AMPDU_RTY_NEW\t\t\tBIT(7)\n\n\n//2 SPEC SIFS\n#define _SPEC_SIFS_CCK(x)\t\t\t((x) & 0xFF)\n#define _SPEC_SIFS_OFDM(x)\t\t\t(((x) & 0xFF) << 8)\n\n//2 RL\n#define\tRETRY_LIMIT_SHORT_SHIFT\t\t\t8\n#define\tRETRY_LIMIT_LONG_SHIFT\t\t\t0\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n\n//2 EDCA setting\n#define AC_PARAM_TXOP_LIMIT_OFFSET\t\t16\n#define AC_PARAM_ECW_MAX_OFFSET\t\t\t12\n#define AC_PARAM_ECW_MIN_OFFSET\t\t\t8\n#define AC_PARAM_AIFS_OFFSET\t\t\t\t0\n\n\n#define _LRL(x)\t\t\t\t\t((x) & 0x3F)\n#define _SRL(x)\t\t\t\t\t(((x) & 0x3F) << 8)\n\n\n//2 BCN_CTRL\n#define EN_TXBCN_RPT\t\t\tBIT(2)\n#define EN_BCN_FUNCTION\t\tBIT(3)\n#define STOP_BCNQ\t\t\t\tBIT(6)\n#define DIS_RX_BSSID_FIT\t\tBIT(6)\n\n#define DIS_ATIM\t\t\t\t\tBIT(0)\n#define DIS_BCNQ_SUB\t\t\tBIT(1)\n#define DIS_TSF_UDT\t\t\t\tBIT(4)\n\n// The same function but different bit field.\n#define DIS_TSF_UDT0_NORMAL_CHIP\tBIT(4)\n#define DIS_TSF_UDT0_TEST_CHIP\tBIT(5)\n\n\n//2 ACMHWCTRL\n#define AcmHw_HwEn\t\t\t\tBIT(0)\n#define AcmHw_BeqEn\t\t\tBIT(1)\n#define AcmHw_ViqEn\t\t\t\tBIT(2)\n#define AcmHw_VoqEn\t\t\tBIT(3)\n#define AcmHw_BeqStatus\t\tBIT(4)\n#define AcmHw_ViqStatus\t\t\tBIT(5)\n#define AcmHw_VoqStatus\t\tBIT(6)\n\n//2 //REG_DUAL_TSF_RST (0x553)\n#define DUAL_TSF_RST_P2P\t\tBIT(4)\n\n//2 // REG_NOA_DESC_SEL (0x5CF)\n#define NOA_DESC_SEL_0\t\t\t0\n#define NOA_DESC_SEL_1\t\t\tBIT(4)\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n\n//2 APSD_CTRL\n#define APSDOFF\t\t\t\t\tBIT(6)\n\n//2 TCR\n#define TSFRST\t\t\t\t\tBIT(0)\n#define DIS_GCLK\t\t\t\t\tBIT(1)\n#define PAD_SEL\t\t\t\t\tBIT(2)\n#define PWR_ST\t\t\t\t\tBIT(6)\n#define PWRBIT_OW_EN\t\t\tBIT(7)\n#define ACRC\t\t\t\t\t\tBIT(8)\n#define CFENDFORM\t\t\t\tBIT(9)\n#define ICV\t\t\t\t\t\tBIT(10)\n\n\n//2 RCR\n#define AAP\t\t\t\t\t\tBIT(0)\n#define APM\t\t\t\t\t\tBIT(1)\n#define AM\t\t\t\t\t\tBIT(2)\n#define AB\t\t\t\t\t\tBIT(3)\n#define ADD3\t\t\t\t\t\tBIT(4)\n#define APWRMGT\t\t\t\tBIT(5)\n#define CBSSID\t\t\t\t\tBIT(6)\n#define CBSSID_DATA\t\t\t\tBIT(6)\n#define CBSSID_BCN\t\t\t\tBIT(7)\n#define ACRC32\t\t\t\t\tBIT(8)\n#define AICV\t\t\t\t\t\tBIT(9)\n#define ADF\t\t\t\t\t\tBIT(11)\n#define ACF\t\t\t\t\t\tBIT(12)\n#define AMF\t\t\t\t\t\tBIT(13)\n#define HTC_LOC_CTRL\t\t\tBIT(14)\n#define UC_DATA_EN\t\t\t\tBIT(16)\n#define BM_DATA_EN\t\t\t\tBIT(17)\n#define MFBEN\t\t\t\t\tBIT(22)\n#define LSIGEN\t\t\t\t\tBIT(23)\n#define EnMBID\t\t\t\t\tBIT(24)\n#define FORCEACK\t\t\t\tBIT(26)\n#define APP_BASSN\t\t\t\tBIT(27)\n#define APP_PHYSTS\t\t\t\tBIT(28)\n#define APP_ICV\t\t\t\t\tBIT(29)\n#define APP_MIC\t\t\t\t\tBIT(30)\n#define APP_FCS\t\t\t\t\tBIT(31)\n\n\n//2 SECCFG\n#define SCR_TxUseDK\t\t\t\tBIT(0)\t\t\t//Force Tx Use Default Key\n#define SCR_RxUseDK\t\t\t\tBIT(1)\t\t\t//Force Rx Use Default Key\n#define SCR_TxEncEnable\t\t\tBIT(2)\t\t\t//Enable Tx Encryption\n#define SCR_RxDecEnable\t\t\tBIT(3)\t\t\t//Enable Rx Decryption\n#define SCR_SKByA2\t\t\t\tBIT(4)\t\t\t//Search kEY BY A2\n#define SCR_NoSKMC\t\t\t\tBIT(5)\t\t\t//No Key Search Multicast\n#define SCR_TXBCUSEDK\t\t\tBIT(6)\t\t\t// Force Tx Broadcast packets Use Default Key\n#define SCR_RXBCUSEDK\t\t\tBIT(7)\t\t\t// Force Rx Broadcast packets Use Default Key\n#define SCR_CHK_KEYID\t\t\tBIT(8)\n#define SCR_CHK_BMC\t\t\t\tBIT(9)\t\t\t/* add option to support a2+keyid+bcm */\n\n//-----------------------------------------------------\n//\n//\tSDIO Bus Specification\n//\n//-----------------------------------------------------\n\n// I/O bus domain address mapping\n#define SDIO_LOCAL_BASE\t\t0x10250000\n#define WLAN_IOREG_BASE\t\t0x10260000\n#define FIRMWARE_FIFO_BASE\t0x10270000\n#define TX_HIQ_BASE\t\t\t\t0x10310000\n#define TX_MIQ_BASE\t\t\t\t0x10320000\n#define TX_LOQ_BASE\t\t\t\t0x10330000\n#define TX_EPQ_BASE\t\t\t\t0x10350000\n#define RX_RX0FF_BASE\t\t\t0x10340000\n\n//SDIO host local register space mapping.\n#define SDIO_LOCAL_MSK\t\t\t\t0x0FFF\n#define WLAN_IOREG_MSK \t             \t0x7FFF\n#define WLAN_FIFO_MSK\t\t\t      \t0x1FFF\t// Aggregation Length[12:0]\n#define WLAN_RX0FF_MSK\t\t\t      \t0x0003\n\n#define SDIO_WITHOUT_REF_DEVICE_ID\t0\t// Without reference to the SDIO Device ID\n#define SDIO_LOCAL_DEVICE_ID           \t\t0\t// 0b[16], 000b[15:13]\n#define WLAN_TX_HIQ_DEVICE_ID\t\t\t4\t// 0b[16], 100b[15:13]\n#define WLAN_TX_MIQ_DEVICE_ID \t\t5\t// 0b[16], 101b[15:13]\n#define WLAN_TX_LOQ_DEVICE_ID \t\t6\t// 0b[16], 110b[15:13]\n#define WLAN_TX_EXQ_DEVICE_ID\t\t3\t// 0b[16], 011b[15:13]\n#define WLAN_RX0FF_DEVICE_ID \t\t\t7\t// 0b[16], 111b[15:13]\n#define WLAN_IOREG_DEVICE_ID \t\t\t8\t// 1b[16]\n\n//SDIO Tx Free Page Index\n#define HI_QUEUE_IDX           \t\t\t0\n#define MID_QUEUE_IDX         \t\t\t1\n#define LOW_QUEUE_IDX \t      \t\t\t2\n#define PUBLIC_QUEUE_IDX    \t\t\t3\n\n#define SDIO_MAX_TX_QUEUE\t\t\t3\t\t// HIQ, MIQ and LOQ\n#define SDIO_MAX_RX_QUEUE\t\t\t1\n\n#define SDIO_REG_TX_CTRL\t\t\t0x0000 // SDIO Tx Control\n#define SDIO_REG_HIMR\t\t\t\t0x0014 // SDIO Host Interrupt Mask\n#define SDIO_REG_HISR\t\t\t\t0x0018 // SDIO Host Interrupt Service Routine\n#define SDIO_REG_HCPWM\t\t\t0x0019 // HCI Current Power Mode\n#define SDIO_REG_RX0_REQ_LEN\t\t0x001C // RXDMA Request Length\n#define SDIO_REG_OQT_FREE_PG\t\t0x001E // OQT Free Page\n#define SDIO_REG_FREE_TXPG\t\t\t0x0020 // Free Tx Buffer Page\n#define SDIO_REG_HCPWM1\t\t\t0x0024 // HCI Current Power Mode 1\n#define SDIO_REG_HCPWM2\t\t\t0x0026 // HCI Current Power Mode 2\n#define SDIO_REG_FREE_TXPG_SEQ\t0x0028 // Free Tx Page Sequence\n#define SDIO_REG_HTSFR_INFO\t\t0x0030 // HTSF Informaion\n#define SDIO_REG_HRPWM1\t\t\t0x0080 // HCI Request Power Mode 1\n#define SDIO_REG_HRPWM2\t\t\t0x0082 // HCI Request Power Mode 2\n#define SDIO_REG_HPS_CLKR\t\t\t0x0084 // HCI Power Save Clock\n#define SDIO_REG_HSUS_CTRL\t\t\t0x0086 // SDIO HCI Suspend Control\n#define SDIO_REG_HIMR_ON\t\t\t0x0090 //SDIO Host Extension Interrupt Mask Always\n#define SDIO_REG_HISR_ON\t\t\t0x0091 //SDIO Host Extension Interrupt Status Always\n\n#define SDIO_HIMR_DISABLED\t\t\t0\n\n// RTL8723/RTL8188E SDIO Host Interrupt Mask Register\n#define SDIO_HIMR_RX_REQUEST_MSK\t\tBIT0\n#define SDIO_HIMR_AVAL_MSK\t\t\tBIT1\n#define SDIO_HIMR_TXERR_MSK\t\t\tBIT2\n#define SDIO_HIMR_RXERR_MSK\t\t\tBIT3\n#define SDIO_HIMR_TXFOVW_MSK\t\t\tBIT4\n#define SDIO_HIMR_RXFOVW_MSK\t\t\tBIT5\n#define SDIO_HIMR_TXBCNOK_MSK\t\t\tBIT6\n#define SDIO_HIMR_TXBCNERR_MSK\t\tBIT7\n#define SDIO_HIMR_BCNERLY_INT_MSK\t\tBIT16\n#define SDIO_HIMR_C2HCMD_MSK\t\t\tBIT17\n#define SDIO_HIMR_CPWM1_MSK\t\t\tBIT18\n#define SDIO_HIMR_CPWM2_MSK\t\t\tBIT19\n#define SDIO_HIMR_HSISR_IND_MSK\t\tBIT20\n#define SDIO_HIMR_GTINT3_IND_MSK\t\tBIT21\n#define SDIO_HIMR_GTINT4_IND_MSK\t\tBIT22\n#define SDIO_HIMR_PSTIMEOUT_MSK\t\tBIT23\n#define SDIO_HIMR_OCPINT_MSK\t\t\tBIT24\n#define SDIO_HIMR_ATIMEND_MSK\t\t\tBIT25\n#define SDIO_HIMR_ATIMEND_E_MSK\t\tBIT26\n#define SDIO_HIMR_CTWEND_MSK\t\t\tBIT27\n\n//RTL8188E SDIO Specific\n#define SDIO_HIMR_MCU_ERR_MSK\t\t\tBIT28\n#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK\t\tBIT29\n\n// SDIO Host Interrupt Service Routine\n#define SDIO_HISR_RX_REQUEST\t\t\tBIT0\n#define SDIO_HISR_AVAL\t\t\t\t\tBIT1\n#define SDIO_HISR_TXERR\t\t\t\t\tBIT2\n#define SDIO_HISR_RXERR\t\t\t\t\tBIT3\n#define SDIO_HISR_TXFOVW\t\t\t\tBIT4\n#define SDIO_HISR_RXFOVW\t\t\t\tBIT5\n#define SDIO_HISR_TXBCNOK\t\t\t\tBIT6\n#define SDIO_HISR_TXBCNERR\t\t\t\tBIT7\n#define SDIO_HISR_BCNERLY_INT\t\t\tBIT16\n#define SDIO_HISR_C2HCMD\t\t\t\tBIT17\n#define SDIO_HISR_CPWM1\t\t\t\tBIT18\n#define SDIO_HISR_CPWM2\t\t\t\tBIT19\n#define SDIO_HISR_HSISR_IND\t\t\tBIT20\n#define SDIO_HISR_GTINT3_IND\t\t\tBIT21\n#define SDIO_HISR_GTINT4_IND\t\t\tBIT22\n#define SDIO_HISR_PSTIMEOUT\t\t\tBIT23\n#define SDIO_HISR_OCPINT\t\t\t\tBIT24\n#define SDIO_HISR_ATIMEND\t\t\t\tBIT25\n#define SDIO_HISR_ATIMEND_E\t\t\tBIT26\n#define SDIO_HISR_CTWEND\t\t\t\tBIT27\n\n//RTL8188E SDIO Specific\n#define SDIO_HISR_MCU_ERR\t\t\t\tBIT28\n#define SDIO_HISR_TSF_BIT32_TOGGLE\tBIT29\n\n#define MASK_SDIO_HISR_CLEAR\t\t(SDIO_HISR_TXERR |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_RXERR |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_TXFOVW |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_RXFOVW |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_TXBCNOK |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_TXBCNERR |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_C2HCMD |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_CPWM1 |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_CPWM2 |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_HSISR_IND |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_GTINT3_IND |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_GTINT4_IND |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_PSTIMEOUT |\\\n\t\t\t\t\t\t\t\t\tSDIO_HISR_OCPINT)\n\n// SDIO HCI Suspend Control Register\n#define HCI_RESUME_PWR_RDY\t\t\tBIT1\n#define HCI_SUS_CTRL\t\t\t\t\tBIT0\n\n// SDIO Tx FIFO related\n#define SDIO_TX_FREE_PG_QUEUE\t\t\t4\t// The number of Tx FIFO free page\n#define SDIO_TX_FIFO_PAGE_SZ \t\t\t128\n\n#ifdef CONFIG_SDIO_HCI\n\t#define MAX_TX_AGG_PACKET_NUMBER \t0x8\n#else\n\t#define MAX_TX_AGG_PACKET_NUMBER \t0xFF\n\t#define MAX_TX_AGG_PACKET_NUMBER_8812 \t64\n#endif\n\n//-----------------------------------------------------\n//\n//\t0xFE00h ~ 0xFE55h\tUSB Configuration\n//\n//-----------------------------------------------------\n\n//2 USB Information (0xFE17)\n#define USB_IS_HIGH_SPEED\t\t\t0\n#define USB_IS_FULL_SPEED\t\t\t1\n#define USB_SPEED_MASK\t\t\t\tBIT(5)\n\n#define USB_NORMAL_SIE_EP_MASK\t0xF\n#define USB_NORMAL_SIE_EP_SHIFT\t4\n\n//2 Special Option\n#define USB_AGG_EN\t\t\t\tBIT(3)\n\n// 0; Use interrupt endpoint to upload interrupt pkt\n// 1; Use bulk endpoint to upload interrupt pkt,\n#define INT_BULK_SEL\t\t\tBIT(4)\n\n//2REG_C2HEVT_CLEAR\n#define C2H_EVT_HOST_CLOSE\t\t0x00\t// Set by driver and notify FW that the driver has read the C2H command message\n#define C2H_EVT_FW_CLOSE\t\t0xFF\t// Set by FW indicating that FW had set the C2H command message and it's not yet read by driver.\n\n\n//2REG_MULTI_FUNC_CTRL(For RTL8723 Only)\n#define WL_HWPDN_EN\t\t\tBIT0\t// Enable GPIO[9] as WiFi HW PDn source\n#define WL_HWPDN_SL\t\t\tBIT1\t// WiFi HW PDn polarity control\n#define WL_FUNC_EN\t\t\t\tBIT2\t// WiFi function enable\n#define WL_HWROF_EN\t\t\tBIT3\t// Enable GPIO[9] as WiFi RF HW PDn source\n#define BT_HWPDN_EN\t\t\tBIT16\t// Enable GPIO[11] as BT HW PDn source\n#define BT_HWPDN_SL\t\t\tBIT17\t// BT HW PDn polarity control\n#define BT_FUNC_EN\t\t\t\tBIT18\t// BT function enable\n#define BT_HWROF_EN\t\t\tBIT19\t// Enable GPIO[11] as BT/GPS RF HW PDn source\n#define GPS_HWPDN_EN\t\t\tBIT20\t// Enable GPIO[10] as GPS HW PDn source\n#define GPS_HWPDN_SL\t\t\tBIT21\t// GPS HW PDn polarity control\n#define GPS_FUNC_EN\t\t\tBIT22\t// GPS function enable\n\n//3 REG_LIFECTRL_CTRL\n#define HAL92C_EN_PKT_LIFE_TIME_BK\t\tBIT3\n#define HAL92C_EN_PKT_LIFE_TIME_BE\t\tBIT2\n#define HAL92C_EN_PKT_LIFE_TIME_VI\t\tBIT1\n#define HAL92C_EN_PKT_LIFE_TIME_VO\t\tBIT0\n\n#define HAL92C_MSDU_LIFE_TIME_UNIT\t\t128\t// in us, said by Tim.\n\n//2 8192D PartNo.\n#define PARTNO_92D_NIC\t\t\t\t\t\t\t(BIT7|BIT6)\n#define PARTNO_92D_NIC_REMARK \t\t\t\t(BIT5|BIT4)\n#define PARTNO_SINGLE_BAND_VS  \t\t\t\tBIT3\n#define PARTNO_SINGLE_BAND_VS_REMARK \t\tBIT1\n#define PARTNO_CONCURRENT_BAND_VC \t\t\t(BIT3|BIT2)\n#define PARTNO_CONCURRENT_BAND_VC_REMARK \t(BIT1|BIT0)\n\n//========================================================\n// General definitions\n//========================================================\n\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8188E(__Adapter)\t   ( IS_VENDOR_8188E_I_CUT_SERIES(__Adapter) ? 255 : 175 )\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8812\t\t\t255\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8723B\t\t255\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8192C\t\t255\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8703B\t\t255\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC\t127\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8188F\t\t255\n\n#define POLLING_LLT_THRESHOLD\t\t\t\t20\n#if defined(CONFIG_RTL8723B) && defined(CONFIG_PCI_HCI)\n#define POLLING_READY_TIMEOUT_COUNT\t\t6000\n#else\n#define POLLING_READY_TIMEOUT_COUNT\t\t1000\n#endif\n\n\n// GPIO BIT\n#define\tHAL_8812A_HW_GPIO_WPS_BIT\tBIT2\n#define\tHAL_8192C_HW_GPIO_WPS_BIT\tBIT2\n#define\tHAL_8192EU_HW_GPIO_WPS_BIT\tBIT7\n#define\tHAL_8188E_HW_GPIO_WPS_BIT\tBIT7\n\n#endif //__HAL_COMMON_H__\n\n"
  },
  {
    "path": "include/hal_data.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_DATA_H__\n#define __HAL_DATA_H__\n\n#if 1//def  CONFIG_SINGLE_IMG\n\n#include \"../hal/phydm/phydm_precomp.h\"\n#ifdef CONFIG_BT_COEXIST\n#include <hal_btcoex.h>\n#endif\n\n#ifdef CONFIG_SDIO_HCI\n#include <hal_sdio.h>\n#endif\n#ifdef CONFIG_GSPI_HCI\n#include <hal_gspi.h>\n#endif\n//\n// <Roger_Notes> For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06.\n//\ntypedef enum _RT_MULTI_FUNC{\n\tRT_MULTI_FUNC_NONE\t= 0x00,\n\tRT_MULTI_FUNC_WIFI \t= 0x01,\n\tRT_MULTI_FUNC_BT \t\t= 0x02,\n\tRT_MULTI_FUNC_GPS \t= 0x04,\n}RT_MULTI_FUNC,*PRT_MULTI_FUNC;\n//\n// <Roger_Notes> For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08.\n//\ntypedef enum _RT_POLARITY_CTL {\n\tRT_POLARITY_LOW_ACT \t= 0,\n\tRT_POLARITY_HIGH_ACT \t= 1,\t\n} RT_POLARITY_CTL, *PRT_POLARITY_CTL;\n\n// For RTL8723 regulator mode. by tynli. 2011.01.14.\ntypedef enum _RT_REGULATOR_MODE {\n\tRT_SWITCHING_REGULATOR \t= 0,\n\tRT_LDO_REGULATOR \t\t\t= 1,\n} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE;\n\n//\n// Interface type.\n//\ntypedef\tenum _INTERFACE_SELECT_PCIE{\n\tINTF_SEL0_SOLO_MINICARD\t\t\t= 0,\t\t// WiFi solo-mCard\n\tINTF_SEL1_BT_COMBO_MINICARD\t\t= 1,\t\t// WiFi+BT combo-mCard\n\tINTF_SEL2_PCIe\t\t\t\t\t\t= 2,\t\t// PCIe Card\n} INTERFACE_SELECT_PCIE, *PINTERFACE_SELECT_PCIE;\n\n\ntypedef\tenum _INTERFACE_SELECT_USB{\n\tINTF_SEL0_USB \t\t\t\t= 0,\t\t// USB\n\tINTF_SEL1_USB_High_Power  \t= 1,\t\t// USB with high power PA\n\tINTF_SEL2_MINICARD\t\t  \t= 2,\t\t// Minicard\n\tINTF_SEL3_USB_Solo \t\t= 3,\t\t// USB solo-Slim module\n\tINTF_SEL4_USB_Combo\t\t= 4,\t\t// USB Combo-Slim module\n\tINTF_SEL5_USB_Combo_MF\t= 5,\t\t// USB WiFi+BT Multi-Function Combo, i.e., Proprietary layout(AS-VAU) which is the same as SDIO card\n} INTERFACE_SELECT_USB, *PINTERFACE_SELECT_USB;\n\ntypedef enum _RT_AMPDU_BRUST_MODE{\n\tRT_AMPDU_BRUST_NONE \t\t= 0,\n\tRT_AMPDU_BRUST_92D \t\t= 1,\n\tRT_AMPDU_BRUST_88E \t\t= 2,\n\tRT_AMPDU_BRUST_8812_4 \t= 3,\n\tRT_AMPDU_BRUST_8812_8 \t= 4,\n\tRT_AMPDU_BRUST_8812_12 \t= 5,\n\tRT_AMPDU_BRUST_8812_15\t= 6,\n\tRT_AMPDU_BRUST_8723B\t \t= 7,\n}RT_AMPDU_BRUST,*PRT_AMPDU_BRUST_MODE;\n\n/*\n#define CHANNEL_MAX_NUMBER\t\t\t14+24+21\t// 14 is the max channel number\n*/\n#define CHANNEL_GROUP_MAX\t\t(3 + 9)\t/* ch1~3, ch4~9, ch10~14 total three groups */\n#define MAX_PG_GROUP\t\t\t13\n\n// Tx Power Limit Table Size\n#define MAX_REGULATION_NUM\t\t\t\t\t\t4\n#define MAX_RF_PATH_NUM_IN_POWER_LIMIT_TABLE\t4\n#define MAX_2_4G_BANDWIDTH_NUM\t\t\t\t\t2\n#define MAX_RATE_SECTION_NUM\t\t\t\t\t\t10\n#define MAX_5G_BANDWIDTH_NUM\t\t\t\t\t\t4\n\n#define MAX_BASE_NUM_IN_PHY_REG_PG_2_4G\t\t\t10 //  CCK:1,OFDM:1, HT:4, VHT:4\n#define MAX_BASE_NUM_IN_PHY_REG_PG_5G\t\t\t9 // OFDM:1, HT:4, VHT:4\n\n\n//###### duplicate code,will move to ODM #########\n//#define IQK_MAC_REG_NUM\t\t4\n//#define IQK_ADDA_REG_NUM\t\t16\n\n//#define IQK_BB_REG_NUM\t\t\t10\n#define IQK_BB_REG_NUM_92C\t9\n#define IQK_BB_REG_NUM_92D\t10\n#define IQK_BB_REG_NUM_test\t6\n\n#define IQK_Matrix_Settings_NUM_92D\t1+24+21\n\n//#define HP_THERMAL_NUM\t\t8\n//###### duplicate code,will move to ODM #########\n\n#ifdef CONFIG_USB_RX_AGGREGATION\ntypedef enum _USB_RX_AGG_MODE{\n\tUSB_RX_AGG_DISABLE,\n\tUSB_RX_AGG_DMA,\n\tUSB_RX_AGG_USB,\n\tUSB_RX_AGG_MIX\n}USB_RX_AGG_MODE;\n\n//#define MAX_RX_DMA_BUFFER_SIZE\t10240\t\t// 10K for 8192C RX DMA buffer\n\n#endif\n\n/* For store initial value of BB register */\ntypedef struct _BB_INIT_REGISTER {\n\tu16\toffset;\n\tu32\tvalue;\n\n} BB_INIT_REGISTER, *PBB_INIT_REGISTER;\n\n#define PAGE_SIZE_128\t128\n#define PAGE_SIZE_256\t256\n#define PAGE_SIZE_512\t512\n\n#define HCI_SUS_ENTER\t\t0\n#define HCI_SUS_LEAVING\t\t1\n#define HCI_SUS_LEAVE\t\t2\n#define HCI_SUS_ENTERING\t3\n#define HCI_SUS_ERR\t\t\t4\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\ntypedef enum _ACS_OP {\n\tACS_INIT,\t\t/*ACS - Variable init*/\n\tACS_RESET,\t\t/*ACS - NHM Counter reset*/\n\tACS_SELECT,\t\t/*ACS - NHM Counter Statistics */\n} ACS_OP;\n\ntypedef enum _ACS_STATE {\n\tACS_DISABLE,\n\tACS_ENABLE,\n} ACS_STATE;\n\nstruct auto_chan_sel {\n\tATOMIC_T state;\n\tu8\tch; /* previous channel*/\n};\n#endif /*CONFIG_AUTO_CHNL_SEL_NHM*/\n\n#define EFUSE_FILE_UNUSED 0\n#define EFUSE_FILE_FAILED 1\n#define EFUSE_FILE_LOADED 2\n\n#define MACADDR_FILE_UNUSED 0\n#define MACADDR_FILE_FAILED 1\n#define MACADDR_FILE_LOADED 2\n\n#define KFREE_FLAG_ON\t\t\t\tBIT0\n#define KFREE_FLAG_THERMAL_K_ON\t\tBIT1\n\nstruct kfree_data_t {\n\t\tu8 flag;\n\t\ts8 bb_gain[BB_GAIN_NUM][RF_PATH_MAX];\n\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n\t\ts8 pa_bias_5g[RF_PATH_MAX];\n\t\ts8 pad_bias_5g[RF_PATH_MAX];\n#endif\n\t\ts8 thermal;\n};\n\nbool kfree_data_is_bb_gain_empty(struct kfree_data_t *data);\n\nstruct hal_spec_t {\n\tu8 macid_num;\n\n\tu8 sec_cam_ent_num;\n\tu8 sec_cap;\n\n\tu8 nss_num;\n\tu8 band_cap;\t/* value of BAND_CAP_XXX */\n\tu8 bw_cap;\t\t/* value of BW_CAP_XXX */\n\n\tu8 wl_func;\t\t/* value of WL_FUNC_XXX */\n};\n\ntypedef struct hal_com_data\n{\n\tHAL_VERSION\t\t\tVersionID;\n\tRT_MULTI_FUNC\t\tMultiFunc; // For multi-function consideration.\n\tRT_POLARITY_CTL\t\tPolarityCtl; // For Wifi PDn Polarity control.\n\tRT_REGULATOR_MODE\tRegulatorMode; // switching regulator or LDO\n\tu8\thw_init_completed;\n\t/****** FW related ******/\n\tu16\tFirmwareVersion;\n\tu16\tFirmwareVersionRev;\n\tu16\tFirmwareSubVersion;\n\tu16\tFirmwareSignature;\n\tu8\tRegFWOffload;\t\n\tu8\tfw_ractrl;\n\tu8\tFwRsvdPageStartOffset; /* 2010.06.23. Added by tynli. Reserve page start offset except beacon in TxQ.*/\n\tu8\tLastHMEBoxNum;\t/* H2C - for host message to fw */\n\n\t/****** current WIFI_PHY values ******/\n\tWIRELESS_MODE\tCurrentWirelessMode;\n\tCHANNEL_WIDTH\tCurrentChannelBW;\n\tBAND_TYPE\t\tCurrentBandType;\t/* 0:2.4G, 1:5G */\n\tBAND_TYPE\t\tBandSet;\n\tu8\t\t\t\tCurrentChannel;\n\tu8\t\t\t\tCurrentCenterFrequencyIndex1;\n\tu8\t\t\t\tnCur40MhzPrimeSC;\t/* Control channel sub-carrier */\n\tu8\t\t\t\tnCur80MhzPrimeSC;   /* used for primary 40MHz of 80MHz mode */\n\tBOOLEAN \t\tbSwChnlAndSetBWInProgress;\t\n\tu8\t\t\t\tbDisableSWChannelPlan; /* flag of disable software change channel plan\t */\n\tu16\t\t\t\tBasicRateSet;\t\n\tu32\t\t\t\tReceiveConfig;\n\tBOOLEAN\t\t\tbSwChnl;\n\tBOOLEAN\t\t\tbSetChnlBW;\n\tBOOLEAN\t\t\tbSWToBW40M;\n\tBOOLEAN\t\t\tbSWToBW80M;\n\tBOOLEAN\t\t\tbChnlBWInitialized;\n\tu32\t\t\t\tBackUp_BB_REG_4_2nd_CCA[3];\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tstruct auto_chan_sel acs;\n#endif\n\t/****** rf_ctrl *****/\n\tu8\trf_chip;\n\tu8\trf_type;\n\tu8\tPackageType;\n\tu8\tNumTotalRFPath;\n\n\t/****** Debug ******/\n\tu16\tForcedDataRate;\t/* Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M. */\n\tu8\tu1ForcedIgiLb;\t/* forced IGI lower bound */\t\n\tu8\tbDumpRxPkt;\n\tu8\tbDumpTxPkt;\n\tu8 \tbDisableTXPowerTraining;\n\n\t\n\t/****** EEPROM setting.******/\t\n\tu8\tbautoload_fail_flag;\n\tu8\tefuse_file_status;\n\tu8\tmacaddr_file_status;\n\tu8\tEepromOrEfuse;\n\tu8\tefuse_eeprom_data[EEPROM_MAX_SIZE]; /*92C:256bytes, 88E:512bytes, we use union set (512bytes)*/\n\tu8\tInterfaceSel; /* board type kept in eFuse */\n\tu16\tCustomerID;\n\t\n\tu16\tEEPROMVID;\n\tu16\tEEPROMSVID;\n#ifdef CONFIG_USB_HCI\n\tu16\tEEPROMPID;\n\tu16\tEEPROMSDID;\n#endif\n#ifdef CONFIG_PCI_HCI\n \tu16\tEEPROMDID;\n\tu16\tEEPROMSMID;\t\n#endif\n\n\tu8\tEEPROMCustomerID;\n\tu8\tEEPROMSubCustomerID;\n\tu8\tEEPROMVersion;\n\tu8\tEEPROMRegulatory;\n\tu8\tEEPROMThermalMeter;\n\tu8\tEEPROMBluetoothCoexist;\t\n\tu8\tEEPROMBluetoothType;\n\tu8\tEEPROMBluetoothAntNum;\n\tu8\tEEPROMBluetoothAntIsolation;\n\tu8\tEEPROMBluetoothRadioShared;\n\tu8\tbTXPowerDataReadFromEEPORM;\n\tu8\tEEPROMMACAddr[ETH_ALEN];\n\t\n#ifdef CONFIG_RF_GAIN_OFFSET\n\tu8\tEEPROMRFGainOffset;\n\tu8\tEEPROMRFGainVal;\n\tstruct kfree_data_t kfree_data;\n#endif /*CONFIG_RF_GAIN_OFFSET*/\n\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B)\n\tu8\tadjuseVoltageVal;\n#endif\n\tu8\tEfuseUsedPercentage;\n\tu16\tEfuseUsedBytes;\n\t/*u8\t\tEfuseMap[2][HWSET_MAX_SIZE_JAGUAR];*/\n\tEFUSE_HAL\tEfuseHal;\n\n\t/*---------------------------------------------------------------------------------*/\n\t//3 [2.4G]\n\tu8\tIndex24G_CCK_Base[MAX_RF_PATH][CENTER_CH_2G_NUM];\n\tu8\tIndex24G_BW40_Base[MAX_RF_PATH][CENTER_CH_2G_NUM];\n\t//If only one tx, only BW20 and OFDM are used.\n\ts8\tCCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\t\n\ts8\tOFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8\tBW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8\tBW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\t//3 [5G]\n\tu8\tIndex5G_BW40_Base[MAX_RF_PATH][CENTER_CH_5G_ALL_NUM];\n\tu8\tIndex5G_BW80_Base[MAX_RF_PATH][CENTER_CH_5G_80M_NUM];\n\ts8\tOFDM_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8\tBW20_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8\tBW40_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8\tBW80_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\n\tu8\tRegulation2_4G;\n\tu8\tRegulation5G;\n\n\tu8\tTxPwrInPercentage;\n\n\t/********************************\n\t*\tTX power by rate table at most 4RF path.\n\t*\tThe register is \n\t*\n\t*\tVHT TX power by rate off setArray = \n\t*\tBand:-2G&5G = 0 / 1\n\t*\tRF: at most 4*4 = ABCD=0/1/2/3\n\t*\tCCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11\t\t\t\n\t**********************************/\n\tu8\tTxPwrByRateTable;\n\tu8\tTxPwrByRateBand;\n\ts8\tTxPwrByRateOffset[TX_PWR_BY_RATE_NUM_BAND]\n\t\t\t\t\t\t [TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t [TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t [TX_PWR_BY_RATE_NUM_RATE];\n\t//---------------------------------------------------------------------------------//\n\n\t/*\n\t//2 Power Limit Table \n\tu8\tTxPwrLevelCck[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];\n\tu8\tTxPwrLevelHT40_1S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];\t// For HT 40MHZ pwr\n\tu8\tTxPwrLevelHT40_2S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];\t// For HT 40MHZ pwr\n\ts8\tTxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff\n\tu8\tTxPwrLegacyHtDiff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff\n\t*/\n\n\tu8 tx_pwr_lmt_5g_20_40_ref;\n\n\t// Power Limit Table for 2.4G\n\ts8\tTxPwrLimit_2_4G[MAX_REGULATION_NUM]\n\t\t\t\t\t\t[MAX_2_4G_BANDWIDTH_NUM]\n\t\t\t\t\t\t[MAX_RATE_SECTION_NUM]\n\t\t\t\t\t\t[CENTER_CH_2G_NUM]\n\t\t\t\t\t\t[MAX_RF_PATH];\n\n\t// Power Limit Table for 5G\n\ts8\tTxPwrLimit_5G[MAX_REGULATION_NUM]\n\t\t\t\t\t\t[MAX_5G_BANDWIDTH_NUM]\n\t\t\t\t\t\t[MAX_RATE_SECTION_NUM]\n\t\t\t\t\t\t[CENTER_CH_5G_ALL_NUM]\n\t\t\t\t\t\t[MAX_RF_PATH];\n\n\t\n\t// Store the original power by rate value of the base of each rate section of rf path A & B\n\tu8\tTxPwrByRateBase2_4G[TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t[TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t[MAX_BASE_NUM_IN_PHY_REG_PG_2_4G];\n\tu8\tTxPwrByRateBase5G[TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t[TX_PWR_BY_RATE_NUM_RF]\n\t\t\t\t\t\t[MAX_BASE_NUM_IN_PHY_REG_PG_5G];\n\n\t// For power group\n\t/*\n\tu8\tPwrGroupHT20[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];\n\tu8\tPwrGroupHT40[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];\n\t*/\n\tu8\tPGMaxGroup;\n\t\n\t// The current Tx Power Level\n\tu8\tCurrentCckTxPwrIdx;\n\tu8\tCurrentOfdm24GTxPwrIdx;\n\tu8\tCurrentBW2024GTxPwrIdx;\n\tu8\tCurrentBW4024GTxPwrIdx;\n\t\n\t// Read/write are allow for following hardware information variables\t\n\tu8\tpwrGroupCnt;\n\tu32\tMCSTxPowerLevelOriginalOffset[MAX_PG_GROUP][16];\n\tu32\tCCKTxPowerLevelOriginalOffset;\n\n\tu8\tCrystalCap;\n\t\n\tu8\tPAType_2G;\n\tu8\tPAType_5G;\n\tu8\tLNAType_2G;\n\tu8\tLNAType_5G;\n\tu8\tExternalPA_2G;\n\tu8\tExternalLNA_2G;\n\tu8\tExternalPA_5G;\n\tu8\tExternalLNA_5G;\n\tu16\tTypeGLNA;\n\tu16\tTypeGPA;\n\tu16\tTypeALNA;\n\tu16\tTypeAPA;\n\tu16\tRFEType;\n\n\tu8\tbLedOpenDrain; /* Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. */\n\tu32\tAcParam_BE; /* Original parameter for BE, use for EDCA turbo.\t*/\n\n\tBB_REGISTER_DEFINITION_T\tPHYRegDef[MAX_RF_PATH];\t//Radio A/B/C/D\n\n\tu32\tRfRegChnlVal[MAX_RF_PATH];\n\n\t//RDG enable\n\tBOOLEAN\t bRDGEnable;\n\n\tu8\tRegTxPause;\n\t// Beacon function related global variable.\n\tu8\tRegBcnCtrlVal;\n\tu8\tRegFwHwTxQCtrl;\n\tu8\tRegReg542;\n\tu8\tRegCR_1;\n\tu8\tReg837;\n\tu16\tRegRRSR;\n\t\n\t/****** antenna diversity ******/\n\tu8\tCurAntenna;\n\tu8\tAntDivCfg;\n\tu8\tAntDetection;\n\tu8\tTRxAntDivType;\n\tu8\tant_path; //for 8723B s0/s1 selection\t\n\tu32\tAntennaTxPath;\t\t\t\t\t/* Antenna path Tx */\n\tu32\tAntennaRxPath;\t\t\t\t\t/* Antenna path Rx */\n\n\t/******** PHY DM & DM Section **********/\n\tu8\t\t\tDM_Type;\n\t_lock\t\tIQKSpinLock;\t\n\tu8\t\t\tINIDATA_RATE[MACID_NUM_SW_LIMIT];\n\t/* Upper and Lower Signal threshold for Rate Adaptive*/\t\n\tint\t\t\tEntryMinUndecoratedSmoothedPWDB;\n\tint\t\t\tEntryMaxUndecoratedSmoothedPWDB;\n\tint\t\t\tMinUndecoratedPWDBForDM;\n\tDM_ODM_T\todmpriv;\t\n\tu8\t\t\tbIQKInitialized;\n\tu8 \t\t\tbNeedIQK;\n\t/******** PHY DM & DM Section **********/\n\n\n\n\t// 2010/08/09 MH Add CU power down mode.\n\tBOOLEAN\t\tpwrdown;\n\n\t// Add for dual MAC  0--Mac0 1--Mac1\n\tu32\tinterfaceIndex;\n\n#ifdef CONFIG_P2P\n\tu8\tp2p_ps_offload;\n#endif\n\t/* Auto FSM to Turn On, include clock, isolation, power control for MAC only */\n\tu8\tbMacPwrCtrlOn;\n\tu8 hci_sus_state;\n\t\n\tu8\tRegIQKFWOffload;\n\tstruct submit_ctx \tiqk_sctx;\n\n\tRT_AMPDU_BRUST\t\tAMPDUBurstMode; //92C maybe not use, but for compile successfully\n\n\tu8\tOutEpQueueSel;\n\tu8\tOutEpNumber;\t\n\n#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t//\n\t// For SDIO Interface HAL related\n\t//\n\n\t//\n\t// SDIO ISR Related\n\t//\n//\tu32\t\t\tIntrMask[1];\n//\tu32\t\t\tIntrMaskToSet[1];\n//\tLOG_INTERRUPT\t\tInterruptLog;\n\tu32\t\t\tsdio_himr;\n\tu32\t\t\tsdio_hisr;\n\n\t//\n\t// SDIO Tx FIFO related.\n\t//\n\t// HIQ, MID, LOW, PUB free pages; padapter->xmitpriv.free_txpg\n\tu8\t\t\tSdioTxFIFOFreePage[SDIO_TX_FREE_PG_QUEUE];\n\t_lock\t\tSdioTxFIFOFreePageLock;\n\tu8\t\t\tSdioTxOQTMaxFreeSpace;\n\tu8\t\t\tSdioTxOQTFreeSpace;\n\n\t//\n\t// SDIO Rx FIFO related.\n\t//\n\tu8\t\t\tSdioRxFIFOCnt;\n\tu16\t\t\tSdioRxFIFOSize;\n\n\tu32\t\t\tsdio_tx_max_len[SDIO_MAX_TX_QUEUE];// H, N, L, used for sdio tx aggregation max length per queue\n#endif //CONFIG_SDIO_HCI\n\n#ifdef CONFIG_USB_HCI\n\n\t// 2010/12/10 MH Add for USB aggreation mode dynamic shceme.\n\tBOOLEAN\t\tUsbRxHighSpeedMode;\n\tBOOLEAN\t\tUsbTxVeryHighSpeedMode;\n\tu32\t\t\tUsbBulkOutSize;\n\tBOOLEAN\t\tbSupportUSB3;\n\n\t// Interrupt relatd register information.\n\tu32\t\t\tIntArray[3];//HISR0,HISR1,HSISR\n\tu32\t\t\tIntrMask[3];\n\tu8\t\t\tC2hArray[16];\n\t#ifdef CONFIG_USB_TX_AGGREGATION\n\tu8\t\t\tUsbTxAggMode;\n\tu8\t\t\tUsbTxAggDescNum;\n\t#endif // CONFIG_USB_TX_AGGREGATION\n\t\n\t#ifdef CONFIG_USB_RX_AGGREGATION\n\tu16\t\t\tHwRxPageSize;\t\t\t\t// Hardware setting\n\tu32\t\t\tMaxUsbRxAggBlock;\n\n\tUSB_RX_AGG_MODE\tUsbRxAggMode;\n\tu8\t\t\tUsbRxAggBlockCount;\t\t/* FOR USB Mode, USB Block count. Block size is 512-byte in hight speed and 64-byte in full speed */\n\tu8\t\t\tUsbRxAggBlockTimeout;\n\tu8\t\t\tUsbRxAggPageCount;\t\t\t/* FOR DMA Mode, 8192C DMA page count*/\n\tu8\t\t\tUsbRxAggPageTimeout;\n\n\tu8\t\t\tRegAcUsbDmaSize;\n\tu8\t\t\tRegAcUsbDmaTime;\n\t#endif//CONFIG_USB_RX_AGGREGATION\n#endif //CONFIG_USB_HCI\n\n\n#ifdef CONFIG_PCI_HCI\n\t//\n\t// EEPROM setting.\n\t//\n\tu32\t\t\tTransmitConfig;\n\tu32\t\t\tIntrMaskToSet[2];\n\tu32\t\t\tIntArray[2];\n\tu32\t\t\tIntrMask[2];\n\tu32\t\t\tSysIntArray[1];\n\tu32\t\t\tSysIntrMask[1];\n\tu32\t\t\tIntrMaskReg[2];\n\tu32\t\t\tIntrMaskDefault[2];\n\n\tBOOLEAN\t \tbL1OffSupport;\n\tBOOLEAN \tbSupportBackDoor;\n\n\tu8\t\t\tbDefaultAntenna;\n\t\n\tu8\t\t\tbInterruptMigration;\n\tu8\t\t\tbDisableTxInt;\n\n\tu16\t\t\tRxTag;\t\n#endif //CONFIG_PCI_HCI\n\t\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tstruct sreset_priv srestpriv;\n#endif //#ifdef DBG_CONFIG_ERROR_DETECT\n\n#ifdef CONFIG_BT_COEXIST\n\t// For bluetooth co-existance\n\tBT_COEXIST\t\tbt_coexist;\n#endif // CONFIG_BT_COEXIST\n\n#if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B) || defined(CONFIG_RTL8188F)\n\t#ifndef CONFIG_PCI_HCI\t// mutual exclusive with PCI -- so they're SDIO and GSPI \n\t// Interrupt relatd register information.\n\tu32\t\t\tSysIntrStatus;\n\tu32\t\t\tSysIntrMask;\n\t#endif\n#endif /*endif CONFIG_RTL8723B\t*/\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tchar\tpara_file_buf[MAX_PARA_FILE_BUF_LEN];\n\tchar *mac_reg;\n\tu32\tmac_reg_len;\n\tchar *bb_phy_reg;\n\tu32\tbb_phy_reg_len;\n\tchar *bb_agc_tab;\n\tu32\tbb_agc_tab_len;\n\tchar *bb_phy_reg_pg;\n\tu32\tbb_phy_reg_pg_len;\n\tchar *bb_phy_reg_mp;\n\tu32\tbb_phy_reg_mp_len;\n\tchar *rf_radio_a;\n\tu32\trf_radio_a_len;\n\tchar *rf_radio_b;\n\tu32\trf_radio_b_len;\n\tchar *rf_tx_pwr_track;\n\tu32\trf_tx_pwr_track_len;\n\tchar *rf_tx_pwr_lmt;\n\tu32\trf_tx_pwr_lmt_len;\n#endif\n\n#ifdef CONFIG_BACKGROUND_NOISE_MONITOR\n\ts16 noise[ODM_MAX_CHANNEL_NUM];\n#endif\n\n\tstruct hal_spec_t hal_spec;\n\n\tu8\tRfKFreeEnable;\n\tu8\tRfKFree_ch_group;\n\tBOOLEAN\t\t\t\tbCCKinCH14;\n\tBB_INIT_REGISTER\tRegForRecover[5];\n\n#if defined(CONFIG_PCI_HCI) && defined(RTL8814AE_SW_BCN)\n\tBOOLEAN bCorrectBCN;\n#endif\n\n\tu32 RxGainOffset[4]; /*{2G, 5G_Low, 5G_Middle, G_High}*/\n\tu8 BackUp_IG_REG_4_Chnl_Section[4]; /*{A,B,C,D}*/\n} HAL_DATA_COMMON, *PHAL_DATA_COMMON;\n\n\n\ntypedef struct hal_com_data HAL_DATA_TYPE, *PHAL_DATA_TYPE;\n#define GET_HAL_DATA(__pAdapter)\t\t\t((HAL_DATA_TYPE *)((__pAdapter)->HalData))\n#define GET_HAL_SPEC(__pAdapter)\t\t\t(&(GET_HAL_DATA((__pAdapter))->hal_spec))\n\n#define GET_HAL_RFPATH_NUM(__pAdapter)\t\t(((HAL_DATA_TYPE *)((__pAdapter)->HalData))->NumTotalRFPath )\n#define RT_GetInterfaceSelection(_Adapter) \t\t(GET_HAL_DATA(_Adapter)->InterfaceSel)\n#define GET_RF_TYPE(__pAdapter)\t\t\t\t(GET_HAL_DATA(__pAdapter)->rf_type)\n#define GET_KFREE_DATA(_adapter) (&(GET_HAL_DATA((_adapter))->kfree_data))\n\n#define\tSUPPORT_HW_RADIO_DETECT(Adapter)\t(\tRT_GetInterfaceSelection(Adapter) == INTF_SEL2_MINICARD ||\\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_GetInterfaceSelection(Adapter) == INTF_SEL3_USB_Solo ||\\\n\t\t\t\t\t\t\t\t\t\t\t\tRT_GetInterfaceSelection(Adapter) == INTF_SEL4_USB_Combo)\n\n#define get_hal_mac_addr(adapter) \t\t\t\t(GET_HAL_DATA(adapter)->EEPROMMACAddr)\n#define is_boot_from_eeprom(adapter) \t\t\t(GET_HAL_DATA(adapter)->EepromOrEfuse)\n#define rtw_get_hw_init_completed(adapter)\t\t(GET_HAL_DATA(adapter)->hw_init_completed)\n#define rtw_is_hw_init_completed(adapter)\t\t(GET_HAL_DATA(adapter)->hw_init_completed == _TRUE)\n#endif\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n#define GET_ACS_STATE(padapter)\t\t\t\t\t(ATOMIC_READ(&GET_HAL_DATA(padapter)->acs.state))\n#define SET_ACS_STATE(padapter, set_state)\t\t\t(ATOMIC_SET(&GET_HAL_DATA(padapter)->acs.state, set_state))\n#define rtw_get_acs_channel(padapter)\t\t\t\t(GET_HAL_DATA(padapter)->acs.ch)\n#define rtw_set_acs_channel(padapter, survey_ch)\t(GET_HAL_DATA(padapter)->acs.ch = survey_ch)\n#endif /*CONFIG_AUTO_CHNL_SEL_NHM*/\n\n#endif //__HAL_DATA_H__\n\n"
  },
  {
    "path": "include/hal_gspi.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_GSPI_H_\n#define __HAL_GSPI_H_\n\n#define ffaddr2deviceId(pdvobj, addr)\t(pdvobj->Queue2Pipe[addr])\n\nu8 rtw_hal_gspi_max_txoqt_free_space(_adapter *padapter);\nu8 rtw_hal_gspi_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);\nvoid rtw_hal_gspi_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);\nvoid rtw_hal_set_gspi_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);\nu32 rtw_hal_get_gspi_tx_max_length(PADAPTER padapter, u8 queue_idx);\n\n#endif \n\n"
  },
  {
    "path": "include/hal_ic_cfg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_IC_CFG_H__\n#define __HAL_IC_CFG_H__\n\n#define RTL8188E_SUPPORT\t\t\t\t0\n#define RTL8812A_SUPPORT\t\t\t\t0\n#define RTL8821A_SUPPORT\t\t\t\t0\n#define RTL8723B_SUPPORT\t\t\t\t0\n#define RTL8192E_SUPPORT\t\t\t\t0\n#define RTL8814A_SUPPORT\t\t\t\t0\n#define RTL8195A_SUPPORT\t\t\t\t0\n#define RTL8703B_SUPPORT\t\t\t\t0\n#define RTL8188F_SUPPORT\t\t\t\t0\n#define RTL8822B_SUPPORT\t\t\t\t0\n#define RTL8821B_SUPPORT\t\t\t\t0\n\n/*#if (RTL8188E_SUPPORT==1)*/\n#define RATE_ADAPTIVE_SUPPORT\t\t\t0\n#define POWER_TRAINING_ACTIVE\t\t\t0\n\n#ifdef CONFIG_MULTIDRV \n#endif\n\n#ifdef CONFIG_RTL8188E\n#undef RTL8188E_SUPPORT\n#undef RATE_ADAPTIVE_SUPPORT\n#undef POWER_TRAINING_ACTIVE\n\n#define RTL8188E_SUPPORT\t\t\t\t1\n#define RATE_ADAPTIVE_SUPPORT\t\t\t1\n#define POWER_TRAINING_ACTIVE\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8812A\n#undef RTL8812A_SUPPORT\n#define RTL8812A_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8821A\n#undef RTL8821A_SUPPORT\n#define RTL8821A_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8192E\n#undef RTL8192E_SUPPORT\n#define RTL8192E_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8723B\n#undef RTL8723B_SUPPORT\n#define RTL8723B_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8814A\n#undef RTL8814A_SUPPORT\n#define RTL8814A_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8703B\n#undef RTL8703B_SUPPORT\n#define RTL8703B_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8188F\n#undef RTL8188F_SUPPORT\n#define RTL8188F_SUPPORT\t\t\t\t1\n#endif\n\n#ifdef CONFIG_RTL8822B\n#undef RTL8822B_SUPPORT\n#define RTL8822B_SUPPORT\t\t\t\t1\n#endif\n\n#endif /*__HAL_IC_CFG_H__*/\n\n"
  },
  {
    "path": "include/hal_intf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_INTF_H__\n#define __HAL_INTF_H__\n\n\nenum RTL871X_HCI_TYPE {\n\tRTW_PCIE\t= BIT0,\n\tRTW_USB \t= BIT1,\n\tRTW_SDIO \t= BIT2,\n\tRTW_GSPI\t= BIT3,\n};\n\nenum _CHIP_TYPE {\n\n\tNULL_CHIP_TYPE,\n\tRTL8188E,\n\tRTL8192E,\n\tRTL8812,\n\tRTL8821, //RTL8811\n\tRTL8723B,\n\tRTL8814A,\n\tRTL8703B,\n\tRTL8188F,\n\tMAX_CHIP_TYPE\n};\n\ntypedef enum _HAL_HW_TIMER_TYPE {\n\tHAL_TIMER_NONE = 0,\n\tHAL_TIMER_TXBF = 1,\n\tHAL_TIMER_EARLYMODE = 2,\n} HAL_HW_TIMER_TYPE, *PHAL_HW_TIMER_TYPE;\n\n\ntypedef enum _HW_VARIABLES{\n\tHW_VAR_MEDIA_STATUS,\n\tHW_VAR_MEDIA_STATUS1,\n\tHW_VAR_SET_OPMODE,\n\tHW_VAR_MAC_ADDR,\n\tHW_VAR_BSSID,\n\tHW_VAR_INIT_RTS_RATE,\n\tHW_VAR_BASIC_RATE,\n\tHW_VAR_TXPAUSE,\n\tHW_VAR_BCN_FUNC,\n\tHW_VAR_CORRECT_TSF,\n\tHW_VAR_CHECK_BSSID,\n\tHW_VAR_MLME_DISCONNECT,\n\tHW_VAR_MLME_SITESURVEY,\n\tHW_VAR_MLME_JOIN,\n\tHW_VAR_ON_RCR_AM,\n       HW_VAR_OFF_RCR_AM,\n\tHW_VAR_BEACON_INTERVAL,\n\tHW_VAR_SLOT_TIME,\n\tHW_VAR_RESP_SIFS,\n\tHW_VAR_ACK_PREAMBLE,\n\tHW_VAR_SEC_CFG,\n\tHW_VAR_SEC_DK_CFG,\n\tHW_VAR_BCN_VALID,\n\tHW_VAR_RF_TYPE,\n\t/* PHYDM odm->SupportAbility */\n\tHW_VAR_CAM_EMPTY_ENTRY,\n\tHW_VAR_CAM_INVALID_ALL,\n\tHW_VAR_AC_PARAM_VO,\n\tHW_VAR_AC_PARAM_VI,\n\tHW_VAR_AC_PARAM_BE,\n\tHW_VAR_AC_PARAM_BK,\n\tHW_VAR_ACM_CTRL,\n\tHW_VAR_AMPDU_MIN_SPACE,\n\tHW_VAR_AMPDU_FACTOR,\n\tHW_VAR_RXDMA_AGG_PG_TH,\n\tHW_VAR_SET_RPWM,\n\tHW_VAR_CPWM,\n\tHW_VAR_H2C_FW_PWRMODE,\n\tHW_VAR_H2C_PS_TUNE_PARAM,\n\tHW_VAR_H2C_FW_JOINBSSRPT,\n\tHW_VAR_FWLPS_RF_ON,\n\tHW_VAR_H2C_FW_P2P_PS_OFFLOAD,\n\tHW_VAR_TDLS_WRCR,\n\tHW_VAR_TDLS_RS_RCR,\n\tHW_VAR_TRIGGER_GPIO_0,\n\tHW_VAR_BT_SET_COEXIST,\n\tHW_VAR_BT_ISSUE_DELBA,\t\n\tHW_VAR_CURRENT_ANTENNA,\n\tHW_VAR_ANTENNA_DIVERSITY_LINK,\n\tHW_VAR_ANTENNA_DIVERSITY_SELECT,\n\tHW_VAR_SWITCH_EPHY_WoWLAN,\n\tHW_VAR_EFUSE_USAGE,\n\tHW_VAR_EFUSE_BYTES,\n\tHW_VAR_EFUSE_BT_USAGE,\n\tHW_VAR_EFUSE_BT_BYTES,\n\tHW_VAR_FIFO_CLEARN_UP,\n\tHW_VAR_RESTORE_HW_SEQ,\n\tHW_VAR_CHECK_TXBUF,\n\tHW_VAR_PCIE_STOP_TX_DMA,\n\tHW_VAR_APFM_ON_MAC, //Auto FSM to Turn On, include clock, isolation, power control for MAC only\n\tHW_VAR_HCI_SUS_STATE,\n\t// The valid upper nav range for the HW updating, if the true value is larger than the upper range, the HW won't update it.\n\t// Unit in microsecond. 0 means disable this function.\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\tHW_VAR_WOWLAN,\n\tHW_VAR_WAKEUP_REASON,\n\tHW_VAR_RPWM_TOG,\n#endif\n#ifdef CONFIG_GPIO_WAKEUP\n\tHW_SET_GPIO_WL_CTRL,\n#endif\n\tHW_VAR_SYS_CLKR,\n\tHW_VAR_NAV_UPPER,\n\tHW_VAR_C2H_HANDLE,\n\tHW_VAR_RPT_TIMER_SETTING,\n\tHW_VAR_TX_RPT_MAX_MACID,\t\n\tHW_VAR_H2C_MEDIA_STATUS_RPT,\n\tHW_VAR_CHK_HI_QUEUE_EMPTY,\n\tHW_VAR_DL_BCN_SEL,\n\tHW_VAR_AMPDU_MAX_TIME,\n\tHW_VAR_WIRELESS_MODE,\n\tHW_VAR_USB_MODE,\n\tHW_VAR_PORT_SWITCH,\n\tHW_VAR_DO_IQK,\n\tHW_VAR_DM_IN_LPS,\n\tHW_VAR_SET_REQ_FW_PS,\n\tHW_VAR_FW_PS_STATE,\n\tHW_VAR_SOUNDING_ENTER,\n\tHW_VAR_SOUNDING_LEAVE,\n\tHW_VAR_SOUNDING_RATE,\n\tHW_VAR_SOUNDING_STATUS,\n\tHW_VAR_SOUNDING_FW_NDPA,\n\tHW_VAR_SOUNDING_CLK,\n/*Add by YuChen for TXBF HW timer*/\n\tHW_VAR_HW_REG_TIMER_INIT,\n\tHW_VAR_HW_REG_TIMER_RESTART,\n\tHW_VAR_HW_REG_TIMER_START,\n\tHW_VAR_HW_REG_TIMER_STOP,\n/*Add by YuChen for TXBF HW timer*/\n\tHW_VAR_DL_RSVD_PAGE,\n\tHW_VAR_MACID_SLEEP,\n\tHW_VAR_MACID_WAKEUP,\n\tHW_VAR_DUMP_MAC_QUEUE_INFO,\n\tHW_VAR_ASIX_IOT,\n}HW_VARIABLES;\n\ntypedef enum _HAL_DEF_VARIABLE{\n\tHAL_DEF_UNDERCORATEDSMOOTHEDPWDB,\n\tHAL_DEF_IS_SUPPORT_ANT_DIV,\n\tHAL_DEF_CURRENT_ANTENNA,\n\tHAL_DEF_DRVINFO_SZ,\n\tHAL_DEF_MAX_RECVBUF_SZ,\n\tHAL_DEF_RX_PACKET_OFFSET,\n\tHAL_DEF_RX_DMA_SZ_WOW,\n\tHAL_DEF_RX_DMA_SZ,\n\tHAL_DEF_RX_PAGE_SIZE,\n\tHAL_DEF_DBG_DUMP_RXPKT,//for dbg\n\tHAL_DEF_RA_DECISION_RATE,\n\tHAL_DEF_RA_SGI,\n\tHAL_DEF_PT_PWR_STATUS,\n\tHAL_DEF_TX_LDPC, \t\t\t\t// LDPC support\n\tHAL_DEF_RX_LDPC, \t\t\t\t// LDPC support\n\tHAL_DEF_TX_STBC, \t\t\t\t// TX STBC support\n\tHAL_DEF_RX_STBC, \t\t\t\t// RX STBC support\n\tHAL_DEF_EXPLICIT_BEAMFORMER,// Explicit  Compressed Steering Capable\n\tHAL_DEF_EXPLICIT_BEAMFORMEE,// Explicit Compressed Beamforming Feedback Capable\n\tHAL_DEF_BEAMFORMER_CAP,\n\tHAL_DEF_BEAMFORMEE_CAP,\n\tHW_VAR_MAX_RX_AMPDU_FACTOR,\n\tHW_DEF_RA_INFO_DUMP,\n\tHAL_DEF_DBG_DUMP_TXPKT,\n\n\tHAL_DEF_TX_PAGE_SIZE,\n\tHAL_DEF_TX_PAGE_BOUNDARY,\n\tHAL_DEF_TX_PAGE_BOUNDARY_WOWLAN,\n\tHAL_DEF_ANT_DETECT,//to do for 8723a\n\tHAL_DEF_PCI_SUUPORT_L1_BACKDOOR, // Determine if the L1 Backdoor setting is turned on.\n\tHAL_DEF_PCI_AMD_L1_SUPPORT,\n\tHAL_DEF_PCI_ASPM_OSC, // Support for ASPM OSC, added by Roger, 2013.03.27.\n\tHAL_DEF_MACID_SLEEP, // Support for MACID sleep\n\tHAL_DEF_DBG_DIS_PWT, //disable Tx power training or not.\n\tHAL_DEF_EFUSE_USAGE,\t/* Get current EFUSE utilization. 2008.12.19. Added by Roger. */\n\tHAL_DEF_EFUSE_BYTES,\n\tHW_VAR_BEST_AMPDU_DENSITY,\n}HAL_DEF_VARIABLE;\n\ntypedef enum _HAL_ODM_VARIABLE{\n\tHAL_ODM_STA_INFO,\t\n\tHAL_ODM_P2P_STATE,\n\tHAL_ODM_WIFI_DISPLAY_STATE,\n\tHAL_ODM_NOISE_MONITOR,\n\tHAL_ODM_REGULATION,\n\tHAL_ODM_INITIAL_GAIN,\n\tHAL_ODM_FA_CNT_DUMP,\n\tHAL_ODM_DBG_FLAG,\n\tHAL_ODM_DBG_LEVEL,\n\tHAL_ODM_RX_INFO_DUMP,\n\tHAL_ODM_RX_Dframe_INFO,\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tHAL_ODM_AUTO_CHNL_SEL,\n#endif\n}HAL_ODM_VARIABLE;\n\ntypedef enum _HAL_INTF_PS_FUNC{\n\tHAL_USB_SELECT_SUSPEND,\n\tHAL_MAX_ID,\n}HAL_INTF_PS_FUNC;\n\ntypedef s32 (*c2h_id_filter)(u8 *c2h_evt);\n\nstruct hal_ops {\n\t/*** initialize section ***/\n\tvoid\t(*read_chip_version)(_adapter *padapter);\n\tvoid\t(*init_default_value)(_adapter *padapter);\n\tvoid\t(*intf_chip_configure)(_adapter *padapter);\n\tvoid\t(*read_adapter_info)(_adapter *padapter);\n\tu32\t(*hal_power_on)(_adapter *padapter);\n\tvoid\t(*hal_power_off)(_adapter *padapter);\t\n\tu32\t(*hal_init)(_adapter *padapter);\n\tu32\t(*hal_deinit)(_adapter *padapter);\n\tvoid\t(*dm_init)(_adapter *padapter);\n\tvoid\t(*dm_deinit)(_adapter *padapter);\n\t\n\t/*** xmit section ***/\n\ts32\t(*init_xmit_priv)(_adapter *padapter);\n\tvoid\t(*free_xmit_priv)(_adapter *padapter);\n\ts32\t(*hal_xmit)(_adapter *padapter, struct xmit_frame *pxmitframe);\n\t/*\n\t * mgnt_xmit should be implemented to run in interrupt context\n\t */\n\ts32 (*mgnt_xmit)(_adapter *padapter, struct xmit_frame *pmgntframe);\n\ts32\t(*hal_xmitframe_enqueue)(_adapter *padapter, struct xmit_frame *pxmitframe);\n#ifdef CONFIG_XMIT_THREAD_MODE\n\ts32 (*xmit_thread_handler)(_adapter *padapter);\n#endif\n\tvoid\t(*run_thread)(_adapter *padapter);\n\tvoid\t(*cancel_thread)(_adapter *padapter);\n\n\t/*** recv section ***/\n\ts32\t(*init_recv_priv)(_adapter *padapter);\n\tvoid\t(*free_recv_priv)(_adapter *padapter);\t\n#if defined(CONFIG_USB_HCI)||defined(CONFIG_PCI_HCI)\n\tu32\t(*inirp_init)(_adapter *padapter);\n\tu32\t(*inirp_deinit)(_adapter *padapter);\n#endif\n\t/*** interrupt hdl section ***/\n\tvoid\t(*enable_interrupt)(_adapter *padapter);\n\tvoid\t(*disable_interrupt)(_adapter *padapter);\n\tu8\t(*check_ips_status)(_adapter *padapter);\n#if defined(CONFIG_PCI_HCI)\n\ts32\t(*interrupt_handler)(_adapter *padapter);\n#endif\n\n#if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)\n\tvoid\t(*interrupt_handler)(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n\n#if defined(CONFIG_PCI_HCI)\n\tvoid\t(*irp_reset)(_adapter *padapter);\n#endif\n\t\t\n\t/*** DM section ***/\n\t\n\tvoid\t(*InitSwLeds)(_adapter *padapter);\n\tvoid\t(*DeInitSwLeds)(_adapter *padapter);\n\t\t\n\n\tvoid\t(*set_bwmode_handler)(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset);\n\tvoid\t(*set_channel_handler)(_adapter *padapter, u8 channel);\n\tvoid\t(*set_chnl_bw_handler)(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80);\n\n\tvoid\t(*set_tx_power_level_handler)(_adapter *padapter, u8 channel);\n\tvoid\t(*get_tx_power_level_handler)(_adapter *padapter, s32 *powerlevel);\n\n\tvoid\t(*hal_dm_watchdog)(_adapter *padapter);\n#ifdef CONFIG_LPS_LCLK_WD_TIMER\n\tvoid\t(*hal_dm_watchdog_in_lps)(_adapter *padapter);\n#endif\n\n\tvoid\t(*SetHwRegHandler)(_adapter *padapter, u8\tvariable,u8* val);\n\tvoid\t(*GetHwRegHandler)(_adapter *padapter, u8\tvariable,u8* val);\n\n#ifdef CONFIG_C2H_PACKET_EN\n\tvoid\t(*SetHwRegHandlerWithBuf)(_adapter *padapter, u8 variable, u8 * pbuf, int len);\n#endif\n\n\tu8\t(*GetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\n\tu8\t(*SetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\n\n\tvoid\t(*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);\n\tvoid\t(*SetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);\n\n\tvoid\t(*UpdateRAMaskHandler)(_adapter *padapter, u32 mac_id, u8 rssi_level);\n\tvoid\t(*SetBeaconRelatedRegistersHandler)(_adapter *padapter);\n\n\tvoid\t(*Add_RateATid)(_adapter *padapter, u64 bitmap, u8 *arg, u8 rssi_level);\n\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\n\tu8\t(*AntDivBeforeLinkHandler)(_adapter *padapter);\n\tvoid\t(*AntDivCompareHandler)(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\n#endif\n\tu8\t(*interface_ps_func)(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val);\n\n\n\tu32\t(*read_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask);\n\tvoid\t(*write_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data);\n\tu32\t(*read_rfreg)(_adapter *padapter, u8 eRFPath, u32 RegAddr, u32 BitMask);\n\tvoid\t(*write_rfreg)(_adapter *padapter, u8 eRFPath, u32 RegAddr, u32 BitMask, u32 Data);\n\n#ifdef CONFIG_HOSTAPD_MLME\n\ts32\t(*hostap_mgnt_xmit_entry)(_adapter *padapter, _pkt *pkt);\n#endif\n\n\tvoid (*EfusePowerSwitch)(_adapter *padapter, u8 bWrite, u8 PwrState);\n\tvoid (*BTEfusePowerSwitch)(_adapter *padapter, u8 bWrite, u8 PwrState);\n\tvoid (*ReadEFuse)(_adapter *padapter, u8 efuseType, u16 _offset, u16 _size_byte, u8 *pbuf, BOOLEAN bPseudoTest);\n\tvoid (*EFUSEGetEfuseDefinition)(_adapter *padapter, u8 efuseType, u8 type, void *pOut, BOOLEAN bPseudoTest);\n\tu16\t(*EfuseGetCurrentSize)(_adapter *padapter, u8 efuseType, BOOLEAN bPseudoTest);\n\tint \t(*Efuse_PgPacketRead)(_adapter *padapter, u8 offset, u8 *data, BOOLEAN bPseudoTest);\n\tint \t(*Efuse_PgPacketWrite)(_adapter *padapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);\n\tu8\t(*Efuse_WordEnableDataWrite)(_adapter *padapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest);\n\tBOOLEAN\t(*Efuse_PgPacketWrite_BT)(_adapter *padapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);\n\t\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tvoid (*sreset_init_value)(_adapter *padapter);\n\tvoid (*sreset_reset_value)(_adapter *padapter);\t\t\n\tvoid (*silentreset)(_adapter *padapter);\n\tvoid (*sreset_xmit_status_check)(_adapter *padapter);\n\tvoid (*sreset_linked_status_check) (_adapter *padapter);\n\tu8 (*sreset_get_wifi_status)(_adapter *padapter);\n\tbool (*sreset_inprogress)(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_IOL\n\tint (*IOL_exec_cmds_sync)(_adapter *padapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt);\n#endif\n\n\tvoid (*hal_notch_filter)(_adapter * adapter, bool enable);\n\ts32 (*c2h_handler)(_adapter *padapter, u8 *c2h_evt);\n\tc2h_id_filter c2h_id_filter_ccx;\n\ts32 (*fill_h2c_cmd)(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\n\tvoid (*fill_fake_txdesc)(PADAPTER, u8 *pDesc, u32 BufferLen,\n\t\t\tu8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\n\t\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\n\tvoid (*hal_set_wowlan_fw)(_adapter *adapter, u8 sleep);\n\tvoid (*clear_interrupt)(_adapter *padapter);\n#endif\t\n\tu8 (*hal_get_tx_buff_rsvd_page_num)(_adapter *adapter, bool wowlan);\n#ifdef CONFIG_GPIO_API\n\tvoid (*update_hisr_hsisr_ind)(PADAPTER padapter, u32 flag);\n#endif\n\tvoid (*fw_correct_bcn)(PADAPTER padapter);\n};\n\ntypedef\tenum _RT_EEPROM_TYPE{\n\tEEPROM_93C46,\n\tEEPROM_93C56,\n\tEEPROM_BOOT_EFUSE,\n}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE;\n\n\n\n#define RF_CHANGE_BY_INIT\t0\n#define RF_CHANGE_BY_IPS \tBIT28\n#define RF_CHANGE_BY_PS \tBIT29\n#define RF_CHANGE_BY_HW \tBIT30\n#define RF_CHANGE_BY_SW \tBIT31\n\ntypedef enum _HARDWARE_TYPE{\n\tHARDWARE_TYPE_RTL8188EE,\n\tHARDWARE_TYPE_RTL8188EU,\n\tHARDWARE_TYPE_RTL8188ES,\n//\tNEW_GENERATION_IC\n\tHARDWARE_TYPE_RTL8192EE,\n\tHARDWARE_TYPE_RTL8192EU,\n\tHARDWARE_TYPE_RTL8192ES,\n\tHARDWARE_TYPE_RTL8812E,\n\tHARDWARE_TYPE_RTL8812AU,\n\tHARDWARE_TYPE_RTL8811AU,\n\tHARDWARE_TYPE_RTL8821E,\n\tHARDWARE_TYPE_RTL8821U,\n\tHARDWARE_TYPE_RTL8821S,\n\tHARDWARE_TYPE_RTL8723BE,\n\tHARDWARE_TYPE_RTL8723BU,\n\tHARDWARE_TYPE_RTL8723BS,\n\tHARDWARE_TYPE_RTL8814AE,\n\tHARDWARE_TYPE_RTL8814AU,\n\tHARDWARE_TYPE_RTL8814AS,\n\tHARDWARE_TYPE_RTL8821BE,\n\tHARDWARE_TYPE_RTL8821BU,\n\tHARDWARE_TYPE_RTL8821BS,\n\tHARDWARE_TYPE_RTL8822BE,\n\tHARDWARE_TYPE_RTL8822BU,\n\tHARDWARE_TYPE_RTL8822BS,\n\tHARDWARE_TYPE_RTL8703BE,\n\tHARDWARE_TYPE_RTL8703BU,\n\tHARDWARE_TYPE_RTL8703BS,\n\tHARDWARE_TYPE_RTL8188FE,\n\tHARDWARE_TYPE_RTL8188FU,\n\tHARDWARE_TYPE_RTL8188FS,\n\tHARDWARE_TYPE_MAX,\n}HARDWARE_TYPE;\n\n#define IS_NEW_GENERATION_IC(_Adapter)\t(rtw_get_hw_type(_Adapter) >= HARDWARE_TYPE_RTL8192EE)\n//\n// RTL8188E Series\n//\n#define IS_HARDWARE_TYPE_8188EE(_Adapter)\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188EE)\n#define IS_HARDWARE_TYPE_8188EU(_Adapter)\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188EU)\n#define IS_HARDWARE_TYPE_8188ES(_Adapter)\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188ES)\n#define\tIS_HARDWARE_TYPE_8188E(_Adapter)\t\\\n(IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter))\n\n// RTL8812 Series\n#define IS_HARDWARE_TYPE_8812E(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8812E)\n#define IS_HARDWARE_TYPE_8812AU(_Adapter)\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8812AU)\n#define IS_HARDWARE_TYPE_8812(_Adapter)\t\t\t\\\n(IS_HARDWARE_TYPE_8812E(_Adapter) || IS_HARDWARE_TYPE_8812AU(_Adapter))\n\n// RTL8821 Series\n#define IS_HARDWARE_TYPE_8821E(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821E)\n#define IS_HARDWARE_TYPE_8811AU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8811AU)\n#define IS_HARDWARE_TYPE_8821U(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821U ||\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\trtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8811AU)\n#define IS_HARDWARE_TYPE_8821S(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821S)\n#define IS_HARDWARE_TYPE_8821(_Adapter)\t\t\t\\\n(IS_HARDWARE_TYPE_8821E(_Adapter) || IS_HARDWARE_TYPE_8821U(_Adapter)|| IS_HARDWARE_TYPE_8821S(_Adapter))\n\n#define IS_HARDWARE_TYPE_JAGUAR(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8812(_Adapter) || IS_HARDWARE_TYPE_8821(_Adapter))\n\n//RTL8192E Series\n#define IS_HARDWARE_TYPE_8192EE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8192EE)\n#define IS_HARDWARE_TYPE_8192EU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8192EU)\n#define IS_HARDWARE_TYPE_8192ES(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8192ES)\n\n#define IS_HARDWARE_TYPE_8192E(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8192EE(_Adapter) || IS_HARDWARE_TYPE_8192EU(_Adapter) ||IS_HARDWARE_TYPE_8192ES(_Adapter))\n\n#define IS_HARDWARE_TYPE_8723BE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8723BE)\n#define IS_HARDWARE_TYPE_8723BU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8723BU)\n#define IS_HARDWARE_TYPE_8723BS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8723BS)\n\n#define IS_HARDWARE_TYPE_8723B(_Adapter) \\\n\t(IS_HARDWARE_TYPE_8723BE(_Adapter) || IS_HARDWARE_TYPE_8723BU(_Adapter) ||IS_HARDWARE_TYPE_8723BS(_Adapter))\n\n/* RTL8814A Series */\n#define IS_HARDWARE_TYPE_8814AE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8814AE)\n#define IS_HARDWARE_TYPE_8814AU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8814AU)\n#define IS_HARDWARE_TYPE_8814AS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8814AS)\n\n#define IS_HARDWARE_TYPE_8814A(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8814AE(_Adapter) || IS_HARDWARE_TYPE_8814AU(_Adapter) || IS_HARDWARE_TYPE_8814AS(_Adapter))\n\n#define IS_HARDWARE_TYPE_JAGUAR2(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8814A(_Adapter) || IS_HARDWARE_TYPE_8821B(_Adapter) || IS_HARDWARE_TYPE_8822B(_Adapter))\n\n#define IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_JAGUAR(_Adapter) || IS_HARDWARE_TYPE_JAGUAR2(_Adapter))\n\n/* RTL8703B Series */\n#define IS_HARDWARE_TYPE_8703BE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8703BE)\n#define IS_HARDWARE_TYPE_8703BS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8703BS)\n#define IS_HARDWARE_TYPE_8703BU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8703BU)\n#define\tIS_HARDWARE_TYPE_8703B(_Adapter)\t\t\t\\\n(IS_HARDWARE_TYPE_8703BE(_Adapter) || IS_HARDWARE_TYPE_8703BU(_Adapter) || IS_HARDWARE_TYPE_8703BS(_Adapter))\n\n/* RTL8188F Series */\n#define IS_HARDWARE_TYPE_8188FE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188FE)\n#define IS_HARDWARE_TYPE_8188FS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188FS)\n#define IS_HARDWARE_TYPE_8188FU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8188FU)\n#define\tIS_HARDWARE_TYPE_8188F(_Adapter)\t\t\t\\\n(IS_HARDWARE_TYPE_8188FE(_Adapter) || IS_HARDWARE_TYPE_8188FU(_Adapter) || IS_HARDWARE_TYPE_8188FS(_Adapter))\n\n#define IS_HARDWARE_TYPE_8821BE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821BE)\n#define IS_HARDWARE_TYPE_8821BU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821BU)\n#define IS_HARDWARE_TYPE_8821BS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8821BS)\n\n#define IS_HARDWARE_TYPE_8821B(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8821BE(_Adapter) || IS_HARDWARE_TYPE_8821BU(_Adapter) || IS_HARDWARE_TYPE_8821BS(_Adapter))\n\n#define IS_HARDWARE_TYPE_8822BE(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8822BE)\n#define IS_HARDWARE_TYPE_8822BU(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8822BU)\n#define IS_HARDWARE_TYPE_8822BS(_Adapter)\t\t(rtw_get_hw_type(_Adapter) == HARDWARE_TYPE_RTL8822BS)\n#define IS_HARDWARE_TYPE_8822B(_Adapter)\t\t\\\n(IS_HARDWARE_TYPE_8822BE(_Adapter) || IS_HARDWARE_TYPE_8822BU(_Adapter) || IS_HARDWARE_TYPE_8822BS(_Adapter))\n\n\n\ntypedef enum _wowlan_subcode {\n\tWOWLAN_ENABLE\t\t\t= 0,\n\tWOWLAN_DISABLE\t\t\t= 1,\n\tWOWLAN_AP_ENABLE\t\t= 2,\n\tWOWLAN_AP_DISABLE\t\t= 3,\n\tWOWLAN_PATTERN_CLEAN\t\t= 4\n} wowlan_subcode;\n\nstruct wowlan_ioctl_param{\n\tunsigned int subcode;\n\tunsigned int subcode_value;\n\tunsigned int wakeup_reason;\n};\n\n#define Rx_Pairwisekey\t\t\t0x01\n#define Rx_GTK\t\t\t\t\t0x02\n#define Rx_DisAssoc\t\t\t\t0x04\n#define Rx_DeAuth\t\t\t\t0x08\n#define Rx_ARPReq\t\t\t\t0x09\n#define FWDecisionDisconnect\t0x10\n#define Rx_MagicPkt\t\t\t\t0x21\n#define Rx_UnicastPkt\t\t\t0x22\n#define Rx_PatternPkt\t\t\t0x23\n#define\tRX_PNOWakeUp\t\t\t0x55\n#define\tAP_WakeUp\t\t\t0x66\n\nu8 rtw_hal_data_init(_adapter *padapter);\nvoid rtw_hal_data_deinit(_adapter *padapter);\n\nvoid rtw_hal_def_value_init(_adapter *padapter);\n\nvoid\trtw_hal_free_data(_adapter *padapter);\n\nvoid rtw_hal_dm_init(_adapter *padapter);\nvoid rtw_hal_dm_deinit(_adapter *padapter);\nvoid rtw_hal_sw_led_init(_adapter *padapter);\nvoid rtw_hal_sw_led_deinit(_adapter *padapter);\n\nu32 rtw_hal_power_on(_adapter *padapter);\nvoid rtw_hal_power_off(_adapter *padapter);\n\nuint rtw_hal_init(_adapter *padapter);\nuint rtw_hal_deinit(_adapter *padapter);\nvoid rtw_hal_stop(_adapter *padapter);\nvoid rtw_hal_set_hwreg(PADAPTER padapter, u8 variable, u8 *val);\nvoid rtw_hal_get_hwreg(PADAPTER padapter, u8 variable, u8 *val);\n\n#ifdef CONFIG_C2H_PACKET_EN\nvoid rtw_hal_set_hwreg_with_buf(_adapter *padapter, u8 variable, u8 *pbuf, int len);\n#endif\n\nvoid rtw_hal_chip_configure(_adapter *padapter);\nvoid rtw_hal_read_chip_info(_adapter *padapter);\nvoid rtw_hal_read_chip_version(_adapter *padapter);\n\nu8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\nu8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\n\nvoid rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);\nvoid\trtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);\n\nvoid rtw_hal_enable_interrupt(_adapter *padapter);\nvoid rtw_hal_disable_interrupt(_adapter *padapter);\n\nu8 rtw_hal_check_ips_status(_adapter *padapter);\n\n#if defined(CONFIG_USB_HCI)||defined(CONFIG_PCI_HCI)\nu32\trtw_hal_inirp_init(_adapter *padapter);\nu32\trtw_hal_inirp_deinit(_adapter *padapter);\n#endif\n\n#if defined(CONFIG_PCI_HCI)\nvoid\trtw_hal_irp_reset(_adapter *padapter);\n#endif\n\nu8\trtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val);\n\ns32\trtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32\trtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32\trtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe);\n\ns32\trtw_hal_init_xmit_priv(_adapter *padapter);\nvoid\trtw_hal_free_xmit_priv(_adapter *padapter);\n\ns32\trtw_hal_init_recv_priv(_adapter *padapter);\nvoid\trtw_hal_free_recv_priv(_adapter *padapter);\n\nvoid rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level);\nvoid\trtw_hal_add_ra_tid(_adapter *padapter, u64 bitmap, u8 *arg, u8 rssi_level);\n\nvoid\trtw_hal_start_thread(_adapter *padapter);\nvoid\trtw_hal_stop_thread(_adapter *padapter);\n\nvoid rtw_hal_bcn_related_reg_setting(_adapter *padapter);\n\nu32\trtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask);\nvoid\trtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data);\nu32\trtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask);\nvoid\trtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data);\n\n#define PHY_QueryBBReg(Adapter, RegAddr, BitMask) rtw_hal_read_bbreg((Adapter), (RegAddr), (BitMask))\n#define PHY_SetBBReg(Adapter, RegAddr, BitMask, Data) rtw_hal_write_bbreg((Adapter), (RegAddr), (BitMask), (Data))\n#define PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask) rtw_hal_read_rfreg((Adapter), (eRFPath), (RegAddr), (BitMask))\n#define PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data) rtw_hal_write_rfreg((Adapter), (eRFPath), (RegAddr), (BitMask), (Data))\n\n#define PHY_SetMacReg\tPHY_SetBBReg\n#define PHY_QueryMacReg PHY_QueryBBReg\n\n#if defined(CONFIG_PCI_HCI)\ns32\trtw_hal_interrupt_handler(_adapter *padapter);\n#endif\n#if  defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)\nvoid\trtw_hal_interrupt_handler(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n\nvoid\trtw_hal_set_bwmode(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset);\nvoid\trtw_hal_set_chan(_adapter *padapter, u8 channel);\nvoid\trtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80);\nvoid\trtw_hal_dm_watchdog(_adapter *padapter);\nvoid\trtw_hal_dm_watchdog_in_lps(_adapter *padapter);\n\nvoid\trtw_hal_set_tx_power_level(_adapter *padapter, u8 channel);\nvoid\trtw_hal_get_tx_power_level(_adapter *padapter, s32 *powerlevel);\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nu8\trtw_hal_antdiv_before_linked(_adapter *padapter);\nvoid\trtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\n#endif\n\n#ifdef CONFIG_HOSTAPD_MLME\ns32\trtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt);\n#endif\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nvoid rtw_hal_sreset_init(_adapter *padapter);\nvoid rtw_hal_sreset_reset(_adapter *padapter);\nvoid rtw_hal_sreset_reset_value(_adapter *padapter);\nvoid rtw_hal_sreset_xmit_status_check(_adapter *padapter);\nvoid rtw_hal_sreset_linked_status_check (_adapter *padapter);\nu8   rtw_hal_sreset_get_wifi_status(_adapter *padapter);\nbool rtw_hal_sreset_inprogress(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_IOL\nint rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt);\n#endif\n\n#ifdef CONFIG_XMIT_THREAD_MODE\ns32 rtw_hal_xmit_thread_handler(_adapter *padapter);\n#endif\n\nvoid rtw_hal_notch_filter(_adapter * adapter, bool enable);\n\nbool rtw_hal_c2h_valid(_adapter *adapter, u8 *buf);\ns32 rtw_hal_c2h_evt_read(_adapter *adapter, u8 *buf);\ns32 rtw_hal_c2h_handler(_adapter *adapter, u8 *c2h_evt);\nc2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter);\n\ns32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter);\n\ns32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid);\ns32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid);\n\ns32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nvoid rtw_hal_fill_fake_txdesc(_adapter *padapter, u8 *pDesc, u32 BufferLen,\n\t\tu8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\nu8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan);\n\n#ifdef CONFIG_GPIO_API\nvoid rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag);\n#endif\n\nvoid rtw_hal_fw_correct_bcn(_adapter *padapter);\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid rtw_hal_clear_interrupt(_adapter *padapter);\nvoid rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep);\n#endif\nu8 rtw_hal_ops_check(_adapter *padapter);\n\n#endif //__HAL_INTF_H__\n\n"
  },
  {
    "path": "include/hal_pg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __HAL_PG_H__\n#define __HAL_PG_H__\n\n#define PPG_BB_GAIN_2G_TX_OFFSET_MASK\t0x0F\n#define PPG_BB_GAIN_2G_TXB_OFFSET_MASK\t0xF0\n\n#define PPG_BB_GAIN_5G_TX_OFFSET_MASK\t0x1F\n#define PPG_THERMAL_OFFSET_MASK\t\t\t0x1F\n#define KFREE_BB_GAIN_2G_TX_OFFSET(_ppg_v) (((_ppg_v) == PPG_BB_GAIN_2G_TX_OFFSET_MASK) ? 0 : (((_ppg_v) & 0x01) ? ((_ppg_v) >> 1) : (-((_ppg_v) >> 1))))\n#define KFREE_BB_GAIN_5G_TX_OFFSET(_ppg_v) (((_ppg_v) == PPG_BB_GAIN_5G_TX_OFFSET_MASK) ? 0 : (((_ppg_v) & 0x01) ? ((_ppg_v) >> 1) : (-((_ppg_v) >> 1))))\n#define KFREE_THERMAL_OFFSET(_ppg_v) (((_ppg_v) == PPG_THERMAL_OFFSET_MASK) ? 0 : (((_ppg_v) & 0x01) ? ((_ppg_v) >> 1) : (-((_ppg_v) >> 1))))\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 88EE/88EU/88ES\n//====================================================\n#define EEPROM_TX_PWR_INX_88E\t\t\t\t\t0x10\n\n#define EEPROM_ChannelPlan_88E\t\t\t\t\t0xB8\n#define EEPROM_XTAL_88E\t\t\t\t\t\t0xB9\n#define EEPROM_THERMAL_METER_88E\t\t\t\t0xBA\n#define EEPROM_IQK_LCK_88E\t\t\t\t\t\t0xBB\n\n#define EEPROM_RF_BOARD_OPTION_88E\t\t\t0xC1\n#define EEPROM_RF_FEATURE_OPTION_88E\t\t\t0xC2\n#define EEPROM_RF_BT_SETTING_88E\t\t\t\t0xC3\n#define EEPROM_VERSION_88E\t\t\t\t\t\t0xC4\n#define EEPROM_CustomID_88E\t\t\t\t\t0xC5\n#define EEPROM_RF_ANTENNA_OPT_88E\t\t\t0xC9\n\n// RTL88EE\n#define EEPROM_MAC_ADDR_88EE\t\t\t\t\t0xD0\n#define EEPROM_VID_88EE\t\t\t\t\t\t0xD6\n#define EEPROM_DID_88EE\t\t\t\t\t\t0xD8\n#define EEPROM_SVID_88EE\t\t\t\t\t\t0xDA\n#define EEPROM_SMID_88EE\t\t\t\t\t\t0xDC\n\n//RTL88EU\n#define EEPROM_MAC_ADDR_88EU\t\t\t\t\t0xD7\n#define EEPROM_VID_88EU\t\t\t\t\t\t0xD0\n#define EEPROM_PID_88EU\t\t\t\t\t\t0xD2\n#define EEPROM_USB_OPTIONAL_FUNCTION0\t\t0xD4 //8188EU,8192EU, 8812AU is the same\n#define EEPROM_USB_OPTIONAL_FUNCTION0_8811AU 0x104\n\n// RTL88ES\n#define EEPROM_MAC_ADDR_88ES\t\t\t\t\t0x11A\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8192EE/8192EU/8192ES\n//====================================================\n#define GET_PG_KFREE_ON_8192E(_pg_m)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC1, 4, 1)\n#define GET_PG_KFREE_THERMAL_K_ON_8192E(_pg_m)\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 5, 1)\n\n#define PPG_BB_GAIN_2G_TXA_OFFSET_8192E\t0x1F6\n#define PPG_THERMAL_OFFSET_8192E\t\t0x1F5\n\n// 0x10 ~ 0x63 = TX power area.\n#define\tEEPROM_TX_PWR_INX_8192E\t\t\t\t0x10\n\n#define\tEEPROM_ChannelPlan_8192E\t\t\t\t0xB8\n#define\tEEPROM_XTAL_8192E\t\t\t\t\t\t0xB9\n#define\tEEPROM_THERMAL_METER_8192E\t\t\t0xBA\n#define\tEEPROM_IQK_LCK_8192E\t\t\t\t\t0xBB\n#define\tEEPROM_2G_5G_PA_TYPE_8192E\t\t\t0xBC\n#define\tEEPROM_2G_LNA_TYPE_GAIN_SEL_8192E\t0xBD\n#define\tEEPROM_5G_LNA_TYPE_GAIN_SEL_8192E\t0xBF\n\n#define\tEEPROM_RF_BOARD_OPTION_8192E\t\t0xC1\n#define\tEEPROM_RF_FEATURE_OPTION_8192E\t\t0xC2\n#define\tEEPROM_RF_BT_SETTING_8192E\t\t\t0xC3\n#define\tEEPROM_VERSION_8192E\t\t\t\t\t0xC4\n#define\tEEPROM_CustomID_8192E\t\t\t\t0xC5\n#define\tEEPROM_TX_BBSWING_2G_8192E\t\t\t0xC6\n#define\tEEPROM_TX_BBSWING_5G_8192E\t\t\t0xC7\n#define\tEEPROM_TX_PWR_CALIBRATE_RATE_8192E\t0xC8\n#define\tEEPROM_RF_ANTENNA_OPT_8192E\t\t\t0xC9\n#define\tEEPROM_RFE_OPTION_8192E\t\t\t\t0xCA\n\n// RTL8192EE\n#define\tEEPROM_MAC_ADDR_8192EE\t\t\t\t0xD0\n#define\tEEPROM_VID_8192EE\t\t\t\t\t\t0xD6\n#define\tEEPROM_DID_8192EE\t\t\t\t\t\t0xD8\n#define\tEEPROM_SVID_8192EE\t\t\t\t\t0xDA\n#define\tEEPROM_SMID_8192EE\t\t\t\t\t0xDC\n\n//RTL8192EU\n#define\tEEPROM_MAC_ADDR_8192EU\t\t\t\t0xD7\n#define\tEEPROM_VID_8192EU\t\t\t\t\t\t0xD0\n#define\tEEPROM_PID_8192EU\t\t\t\t\t\t0xD2\n#define \tEEPROM_PA_TYPE_8192EU               \t\t0xBC\n#define \tEEPROM_LNA_TYPE_2G_8192EU           \t0xBD\n#define \tEEPROM_LNA_TYPE_5G_8192EU           \t0xBF\n\n// RTL8192ES\n#define\tEEPROM_MAC_ADDR_8192ES\t\t\t\t0x11A\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8812AE/8812AU/8812AS\n//====================================================\n// 0x10 ~ 0x63 = TX power area.\n#define EEPROM_USB_MODE_8812\t\t\t\t\t0x08\n#define EEPROM_TX_PWR_INX_8812\t\t\t\t0x10\n\n#define EEPROM_ChannelPlan_8812\t\t\t\t0xB8\n#define EEPROM_XTAL_8812\t\t\t\t\t\t0xB9\n#define EEPROM_THERMAL_METER_8812\t\t\t0xBA\n#define EEPROM_IQK_LCK_8812\t\t\t\t\t0xBB\n#define EEPROM_2G_5G_PA_TYPE_8812\t\t\t0xBC\n#define EEPROM_2G_LNA_TYPE_GAIN_SEL_8812\t0xBD\n#define EEPROM_5G_LNA_TYPE_GAIN_SEL_8812\t0xBF\n\n#define EEPROM_RF_BOARD_OPTION_8812\t\t\t0xC1\n#define EEPROM_RF_FEATURE_OPTION_8812\t\t0xC2\n#define EEPROM_RF_BT_SETTING_8812\t\t\t\t0xC3\n#define EEPROM_VERSION_8812\t\t\t\t\t0xC4\n#define EEPROM_CustomID_8812\t\t\t\t\t0xC5\n#define EEPROM_TX_BBSWING_2G_8812\t\t\t0xC6\n#define EEPROM_TX_BBSWING_5G_8812\t\t\t0xC7\n#define EEPROM_TX_PWR_CALIBRATE_RATE_8812\t0xC8\n#define EEPROM_RF_ANTENNA_OPT_8812\t\t\t0xC9\n#define EEPROM_RFE_OPTION_8812\t\t\t\t0xCA\n\n// RTL8812AE\n#define EEPROM_MAC_ADDR_8812AE\t\t\t\t0xD0\n#define EEPROM_VID_8812AE\t\t\t\t\t\t0xD6\n#define EEPROM_DID_8812AE\t\t\t\t\t\t0xD8\n#define EEPROM_SVID_8812AE\t\t\t\t\t\t0xDA\n#define EEPROM_SMID_8812AE\t\t\t\t\t0xDC\n\n//RTL8812AU\n#define EEPROM_MAC_ADDR_8812AU\t\t\t\t0xD7\n#define EEPROM_VID_8812AU\t\t\t\t\t\t0xD0\n#define EEPROM_PID_8812AU\t\t\t\t\t\t0xD2\n#define EEPROM_PA_TYPE_8812AU\t\t\t\t\t0xBC\n#define EEPROM_LNA_TYPE_2G_8812AU\t\t\t0xBD\n#define EEPROM_LNA_TYPE_5G_8812AU\t\t\t0xBF\n\n//RTL8814AU\n#define\tEEPROM_MAC_ADDR_8814AU\t\t\t\t0xD8\n#define\tEEPROM_VID_8814AU\t\t\t\t\t\t0xD0\n#define\tEEPROM_PID_8814AU\t\t\t\t\t\t0xD2\n#define\tEEPROM_PA_TYPE_8814AU\t\t\t\t0xBC\n#define\tEEPROM_LNA_TYPE_2G_8814AU\t\t\t0xBD\n#define\tEEPROM_LNA_TYPE_5G_8814AU\t\t\t0xBF\n\n/* RTL8814AE */\n#define EEPROM_MAC_ADDR_8814AE\t\t\t\t0xD0\n#define EEPROM_VID_8814AE\t\t\t\t\t\t0xD6\n#define EEPROM_DID_8814AE\t\t\t\t\t\t0xD8\n#define EEPROM_SVID_8814AE\t\t\t\t\t\t0xDA\n#define EEPROM_SMID_8814AE\t\t\t\t\t0xDC\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8814AU\n//====================================================\n#define GET_PG_KFREE_ON_8814A(_pg_m)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 4, 1)\n#define GET_PG_KFREE_THERMAL_K_ON_8814A(_pg_m)\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 5, 1)\n\n#define KFREE_GAIN_DATA_LENGTH_8814A\t22\n\n#define PPG_BB_GAIN_2G_TXBA_OFFSET_8814A\t0x3EE\n\n#define PPG_THERMAL_OFFSET_8814A\t\t0x3EF\n\n#define EEPROM_TX_PWR_INX_8814\t\t\t\t0x10\n#define EEPROM_ChannelPlan_8814\t\t\t\t0xB8\n#define EEPROM_XTAL_8814\t\t\t\t\t0xB9\n#define EEPROM_THERMAL_METER_8814\t\t\t0xBA\n#define\tEEPROM_IQK_LCK_8814\t\t\t\t\t0xBB\n\n\n#define EEPROM_PA_TYPE_8814\t\t\t\t\t0xBC\n#define EEPROM_LNA_TYPE_AB_2G_8814\t\t\t0xBD\n#define\tEEPROM_LNA_TYPE_CD_2G_8814\t\t\t0xBE\n#define EEPROM_LNA_TYPE_AB_5G_8814\t\t\t0xBF\n#define EEPROM_LNA_TYPE_CD_5G_8814\t\t\t0xC0\n#define\tEEPROM_RF_BOARD_OPTION_8814\t\t\t0xC1\n#define\tEEPROM_RF_BT_SETTING_8814\t\t\t0xC3\n#define\tEEPROM_VERSION_8814\t\t\t\t\t0xC4\n#define\tEEPROM_CustomID_8814\t\t\t\t0xC5\n#define\tEEPROM_TX_BBSWING_2G_8814\t\t\t0xC6\n#define\tEEPROM_TX_BBSWING_5G_8814\t\t\t0xC7\n#define EEPROM_TRX_ANTENNA_OPTION_8814\t\t0xC9\n#define\tEEPROM_RFE_OPTION_8814\t\t\t\t0xCA\n\n/*Extra Info for 8814A Initial Gain Fine Tune  suggested by Willis, JIRA: MP123*/\n#define\tEEPROM_IG_OFFSET_4_AB_2G_8814A\t\t\t\t0x120\n#define\tEEPROM_IG_OFFSET_4_CD_2G_8814A\t\t\t\t0x121\n#define\tEEPROM_IG_OFFSET_4_AB_5GL_8814A\t\t\t\t0x122\n#define\tEEPROM_IG_OFFSET_4_CD_5GL_8814A\t\t\t\t0x123\n#define\tEEPROM_IG_OFFSET_4_AB_5GM_8814A\t\t\t\t0x124\n#define\tEEPROM_IG_OFFSET_4_CD_5GM_8814A\t\t\t\t0x125\n#define\tEEPROM_IG_OFFSET_4_AB_5GH_8814A\t\t\t\t0x126\n#define\tEEPROM_IG_OFFSET_4_CD_5GH_8814A\t\t\t\t0x127\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8821AE/8821AU/8821AS\n//====================================================\n\n#define GET_PG_KFREE_ON_8821A(_pg_m)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 4, 1)\n#define GET_PG_KFREE_THERMAL_K_ON_8821A(_pg_m)\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 5, 1)\n\n#define PPG_BB_GAIN_2G_TXA_OFFSET_8821A\t\t0x1F6\n#define PPG_THERMAL_OFFSET_8821A\t\t\t0x1F5\n#define PPG_BB_GAIN_5GLB1_TXA_OFFSET_8821A\t0x1F4\n#define PPG_BB_GAIN_5GLB2_TXA_OFFSET_8821A\t0x1F3\n#define PPG_BB_GAIN_5GMB1_TXA_OFFSET_8821A\t0x1F2\n#define PPG_BB_GAIN_5GMB2_TXA_OFFSET_8821A\t0x1F1\n#define PPG_BB_GAIN_5GHB_TXA_OFFSET_8821A\t0x1F0\n\n#define EEPROM_TX_PWR_INX_8821\t\t\t\t0x10\n\n#define EEPROM_ChannelPlan_8821\t\t\t\t0xB8\n#define EEPROM_XTAL_8821\t\t\t\t\t\t0xB9\n#define EEPROM_THERMAL_METER_8821\t\t\t0xBA\n#define EEPROM_IQK_LCK_8821\t\t\t\t\t0xBB\n\n\n#define EEPROM_RF_BOARD_OPTION_8821\t\t\t0xC1\n#define EEPROM_RF_FEATURE_OPTION_8821\t\t0xC2\n#define EEPROM_RF_BT_SETTING_8821\t\t\t\t0xC3\n#define EEPROM_VERSION_8821\t\t\t\t\t0xC4\n#define EEPROM_CustomID_8821\t\t\t\t\t0xC5\n#define EEPROM_RF_ANTENNA_OPT_8821\t\t\t0xC9\n\n// RTL8821AE\n#define EEPROM_MAC_ADDR_8821AE\t\t\t\t0xD0\n#define EEPROM_VID_8821AE\t\t\t\t\t\t0xD6\n#define EEPROM_DID_8821AE\t\t\t\t\t\t0xD8\n#define EEPROM_SVID_8821AE\t\t\t\t\t\t0xDA\n#define EEPROM_SMID_8821AE\t\t\t\t\t0xDC\n\n//RTL8821AU\n#define EEPROM_PA_TYPE_8821AU\t\t\t\t\t0xBC\n#define EEPROM_LNA_TYPE_8821AU\t\t\t\t0xBF\n\n// RTL8821AS\n#define EEPROM_MAC_ADDR_8821AS\t\t\t\t0x11A\n\n//RTL8821AU\n#define EEPROM_MAC_ADDR_8821AU\t\t\t\t0x107\n#define EEPROM_VID_8821AU\t\t\t\t\t\t0x100\n#define EEPROM_PID_8821AU\t\t\t\t\t\t0x102\n\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8192 SE/SU\n//====================================================\n#define EEPROM_VID_92SE\t\t\t\t\t\t0x0A\n#define EEPROM_DID_92SE\t\t\t\t\t\t0x0C\n#define EEPROM_SVID_92SE\t\t\t\t\t\t0x0E\n#define EEPROM_SMID_92SE\t\t\t\t\t\t0x10\n\n#define EEPROM_MAC_ADDR_92S\t\t\t\t\t0x12\n\n#define EEPROM_TSSI_A_92SE\t\t\t\t\t\t0x74\n#define EEPROM_TSSI_B_92SE\t\t\t\t\t\t0x75\n\n#define EEPROM_Version_92SE\t\t\t\t\t0x7C\n\n\n#define EEPROM_VID_92SU\t\t\t\t\t\t0x08\n#define EEPROM_PID_92SU\t\t\t\t\t\t0x0A \n\n#define EEPROM_Version_92SU\t\t\t\t\t0x50\n#define EEPROM_TSSI_A_92SU\t\t\t\t\t\t0x6b \n#define EEPROM_TSSI_B_92SU\t\t\t\t\t\t0x6c \n\n/* ====================================================\n\tEEPROM/Efuse PG Offset for 8188FE/8188FU/8188FS\n   ====================================================\n */\n\n#define GET_PG_KFREE_ON_8188F(_pg_m)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC1, 4, 1)\n#define GET_PG_KFREE_THERMAL_K_ON_8188F(_pg_m)\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 5, 1)\n\n#define PPG_BB_GAIN_2G_TXA_OFFSET_8188F\t0xEE\n#define PPG_THERMAL_OFFSET_8188F\t\t0xEF\n\n/* 0x10 ~ 0x63 = TX power area. */\n#define\tEEPROM_TX_PWR_INX_8188F\t\t\t\t0x10\n\n#define\tEEPROM_ChannelPlan_8188F\t\t\t0xB8\n#define\tEEPROM_XTAL_8188F\t\t\t\t\t0xB9\n#define\tEEPROM_THERMAL_METER_8188F\t\t\t0xBA\n#define\tEEPROM_IQK_LCK_8188F\t\t\t\t0xBB\n#define\tEEPROM_2G_5G_PA_TYPE_8188F\t\t\t0xBC\n#define\tEEPROM_2G_LNA_TYPE_GAIN_SEL_8188F\t0xBD\n#define\tEEPROM_5G_LNA_TYPE_GAIN_SEL_8188F\t0xBF\n\n#define\tEEPROM_RF_BOARD_OPTION_8188F\t\t0xC1\n#define\tEEPROM_FEATURE_OPTION_8188F\t\t\t0xC2\n#define\tEEPROM_RF_BT_SETTING_8188F\t\t\t0xC3\n#define\tEEPROM_VERSION_8188F\t\t\t\t0xC4\n#define\tEEPROM_CustomID_8188F\t\t\t\t0xC5\n#define\tEEPROM_TX_BBSWING_2G_8188F\t\t\t0xC6\n#define\tEEPROM_TX_PWR_CALIBRATE_RATE_8188F\t0xC8\n#define\tEEPROM_RF_ANTENNA_OPT_8188F\t\t\t0xC9\n#define\tEEPROM_RFE_OPTION_8188F\t\t\t\t0xCA\n#define EEPROM_CUSTOMER_ID_8188F\t\t\t0x7F\n#define EEPROM_SUBCUSTOMER_ID_8188F\t\t\t0x59\n\n/* RTL8188FU */\n#define EEPROM_MAC_ADDR_8188FU\t\t\t\t0xD7\n#define EEPROM_VID_8188FU\t\t\t\t\t0xD0\n#define EEPROM_PID_8188FU\t\t\t\t\t0xD2\n#define EEPROM_PA_TYPE_8188FU\t\t\t\t0xBC\n#define EEPROM_LNA_TYPE_2G_8188FU\t\t\t0xBD\n#define EEPROM_USB_OPTIONAL_FUNCTION0_8188FU 0xD4\n\n/* RTL8188FS */\n#define\tEEPROM_MAC_ADDR_8188FS\t\t\t\t0x11A\n#define EEPROM_Voltage_ADDR_8188F\t\t\t0x8\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8723BE/8723BU/8723BS\n//====================================================\n// 0x10 ~ 0x63 = TX power area.\n#define\tEEPROM_TX_PWR_INX_8723B\t\t\t\t0x10\n\n#define\tEEPROM_ChannelPlan_8723B\t\t\t\t0xB8\n#define\tEEPROM_XTAL_8723B\t\t\t\t\t\t0xB9\n#define\tEEPROM_THERMAL_METER_8723B\t\t\t0xBA\n#define\tEEPROM_IQK_LCK_8723B\t\t\t\t\t0xBB\n#define\tEEPROM_2G_5G_PA_TYPE_8723B\t\t\t0xBC\n#define\tEEPROM_2G_LNA_TYPE_GAIN_SEL_8723B\t0xBD\n#define\tEEPROM_5G_LNA_TYPE_GAIN_SEL_8723B\t0xBF\n\n#define\tEEPROM_RF_BOARD_OPTION_8723B\t\t0xC1\n#define\tEEPROM_FEATURE_OPTION_8723B\t\t\t0xC2\n#define\tEEPROM_RF_BT_SETTING_8723B\t\t\t0xC3\n#define\tEEPROM_VERSION_8723B\t\t\t\t\t0xC4\n#define\tEEPROM_CustomID_8723B\t\t\t\t0xC5\n#define\tEEPROM_TX_BBSWING_2G_8723B\t\t\t0xC6\n#define\tEEPROM_TX_PWR_CALIBRATE_RATE_8723B\t0xC8\n#define\tEEPROM_RF_ANTENNA_OPT_8723B\t\t0xC9\n#define\tEEPROM_RFE_OPTION_8723B\t\t\t\t0xCA\n\n// RTL8723BE\n#define EEPROM_MAC_ADDR_8723BE\t\t\t\t0xD0\n#define EEPROM_VID_8723BE\t\t\t\t\t\t0xD6\n#define EEPROM_DID_8723BE\t\t\t\t\t\t0xD8\n#define EEPROM_SVID_8723BE\t\t\t\t\t\t0xDA\n#define EEPROM_SMID_8723BE\t\t\t\t\t\t0xDC\n\n//RTL8723BU\n#define EEPROM_MAC_ADDR_8723BU\t\t\t\t0x107\n#define EEPROM_VID_8723BU\t\t\t\t\t\t0x100\n#define EEPROM_PID_8723BU\t\t\t\t\t\t0x102\n#define EEPROM_PA_TYPE_8723BU\t\t\t\t\t0xBC\n#define EEPROM_LNA_TYPE_2G_8723BU\t\t\t\t0xBD\n\n\n//RTL8723BS\n#define\tEEPROM_MAC_ADDR_8723BS\t\t\t\t0x11A\n#define EEPROM_Voltage_ADDR_8723B\t\t\t0x8\n\n//====================================================\n//\t\t\tEEPROM/Efuse PG Offset for 8703BS\n//====================================================\n#define GET_PG_KFREE_ON_8703B(_pg_m)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC1, 4, 1)\n#define GET_PG_KFREE_THERMAL_K_ON_8703B(_pg_m)\tLE_BITS_TO_1BYTE(((u8 *)(_pg_m)) + 0xC8, 5, 1)\n\n#define PPG_BB_GAIN_2G_TXA_OFFSET_8703B\t0xEE\n#define PPG_THERMAL_OFFSET_8703B\t\t0xEF\n\n#define\tEEPROM_TX_PWR_INX_8703B\t\t\t\t0x10\n\n#define\tEEPROM_ChannelPlan_8703B\t\t\t\t0xB8\n#define\tEEPROM_XTAL_8703B\t\t\t\t\t0xB9\n#define\tEEPROM_THERMAL_METER_8703B\t\t\t0xBA\n#define\tEEPROM_IQK_LCK_8703B\t\t\t\t\t0xBB\n#define\tEEPROM_2G_5G_PA_TYPE_8703B\t\t\t0xBC\n#define\tEEPROM_2G_LNA_TYPE_GAIN_SEL_8703B\t0xBD\n#define\tEEPROM_5G_LNA_TYPE_GAIN_SEL_8703B\t0xBF\n\n#define\tEEPROM_RF_BOARD_OPTION_8703B\t\t0xC1\n#define\tEEPROM_FEATURE_OPTION_8703B\t\t\t0xC2\n#define\tEEPROM_RF_BT_SETTING_8703B\t\t\t0xC3\n#define\tEEPROM_VERSION_8703B\t\t\t\t\t0xC4\n#define\tEEPROM_CustomID_8703B\t\t\t\t\t0xC5\n#define\tEEPROM_TX_BBSWING_2G_8703B\t\t\t0xC6\n#define\tEEPROM_TX_PWR_CALIBRATE_RATE_8703B\t0xC8\n#define\tEEPROM_RF_ANTENNA_OPT_8703B\t\t0xC9\n#define\tEEPROM_RFE_OPTION_8703B\t\t\t\t0xCA\n\n/* RTL8703BU */\n#define EEPROM_MAC_ADDR_8703BU                          0x107\n#define EEPROM_VID_8703BU                               0x100\n#define EEPROM_PID_8703BU                               0x102\n#define EEPROM_USB_OPTIONAL_FUNCTION0_8703BU            0x104\n#define EEPROM_PA_TYPE_8703BU                           0xBC\n#define EEPROM_LNA_TYPE_2G_8703BU                       0xBD\n\n//RTL8703BS\n#define\tEEPROM_MAC_ADDR_8703BS\t\t\t\t0x11A\n#define \tEEPROM_Voltage_ADDR_8703B\t\t\t0x8\n\n//====================================================\n//\t\t\tEEPROM/Efuse Value Type\n//====================================================\n#define EETYPE_TX_PWR\t\t\t\t\t\t\t0x0\n//====================================================\n//\t\t\tEEPROM/Efuse Default Value\n//====================================================\n#define EEPROM_CID_DEFAULT\t\t\t\t\t0x0\n#define EEPROM_CID_DEFAULT_EXT\t\t\t\t0xFF // Reserved for Realtek\n#define EEPROM_CID_TOSHIBA\t\t\t\t\t\t0x4\n#define EEPROM_CID_CCX\t\t\t\t\t\t\t0x10\n#define EEPROM_CID_QMI\t\t\t\t\t\t\t0x0D\n#define EEPROM_CID_WHQL \t\t\t\t\t\t0xFE\n\n#define EEPROM_CHANNEL_PLAN_FCC\t\t\t\t0x0\n#define EEPROM_CHANNEL_PLAN_IC\t\t\t\t0x1\n#define EEPROM_CHANNEL_PLAN_ETSI\t\t\t\t0x2\n#define EEPROM_CHANNEL_PLAN_SPAIN\t\t\t0x3\n#define EEPROM_CHANNEL_PLAN_FRANCE\t\t\t0x4\n#define EEPROM_CHANNEL_PLAN_MKK\t\t\t\t0x5\n#define EEPROM_CHANNEL_PLAN_MKK1\t\t\t\t0x6\n#define EEPROM_CHANNEL_PLAN_ISRAEL\t\t\t0x7\n#define EEPROM_CHANNEL_PLAN_TELEC\t\t\t0x8\n#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN\t0x9\n#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13\t0xA\n#define EEPROM_CHANNEL_PLAN_NCC_TAIWAN\t\t0xB\n#define EEPROM_CHANNEL_PLAN_CHIAN\t\t\t0XC\n#define EEPROM_CHANNEL_PLAN_SINGAPORE_INDIA_MEXICO  0XD\n#define EEPROM_CHANNEL_PLAN_KOREA\t\t\t0xE\n#define EEPROM_CHANNEL_PLAN_TURKEY              \t0xF\n#define EEPROM_CHANNEL_PLAN_JAPAN                 \t0x10\n#define EEPROM_CHANNEL_PLAN_FCC_NO_DFS\t\t0x11\n#define EEPROM_CHANNEL_PLAN_JAPAN_NO_DFS\t0x12\n#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_5G\t0x13\n#define EEPROM_CHANNEL_PLAN_TAIWAN_NO_DFS \t0x14\n\n#define EEPROM_USB_OPTIONAL1\t\t\t\t\t0xE\n#define EEPROM_CHANNEL_PLAN_BY_HW_MASK\t\t0x80\n\n#define RTL_EEPROM_ID\t\t\t\t\t\t\t0x8129\n#define EEPROM_Default_TSSI\t\t\t\t\t\t0x0\n#define EEPROM_Default_BoardType\t\t\t\t0x02\n#define EEPROM_Default_ThermalMeter\t\t\t0x12\n#define EEPROM_Default_ThermalMeter_92SU\t\t0x7\n#define EEPROM_Default_ThermalMeter_88E\t\t0x18\n#define EEPROM_Default_ThermalMeter_8812\t\t0x18\n#define\tEEPROM_Default_ThermalMeter_8192E\t\t\t0x1A\n#define\tEEPROM_Default_ThermalMeter_8723B\t\t0x18\n#define\tEEPROM_Default_ThermalMeter_8703B\t\t0x18\n#define\tEEPROM_Default_ThermalMeter_8188F\t\t0x18\n#define EEPROM_Default_ThermalMeter_8814A\t\t0x18\n\n\n#define EEPROM_Default_CrystalCap\t\t\t\t0x0\n#define EEPROM_Default_CrystalCap_8723A\t\t0x20\n#define EEPROM_Default_CrystalCap_88E \t\t\t0x20\n#define EEPROM_Default_CrystalCap_8812\t\t\t0x20\n#define EEPROM_Default_CrystalCap_8814\t\t\t0x20\n#define EEPROM_Default_CrystalCap_8192E\t\t\t0x20\n#define EEPROM_Default_CrystalCap_8723B\t\t\t0x20\n#define EEPROM_Default_CrystalCap_8703B\t\t\t0x20\n#define EEPROM_Default_CrystalCap_8188F\t\t\t0x20\n#define EEPROM_Default_CrystalFreq\t\t\t\t0x0\n#define EEPROM_Default_TxPowerLevel_92C\t\t0x22\n#define EEPROM_Default_TxPowerLevel_2G\t\t\t0x2C\n#define EEPROM_Default_TxPowerLevel_5G\t\t\t0x22\n#define EEPROM_Default_TxPowerLevel\t\t\t0x22\n#define EEPROM_Default_HT40_2SDiff\t\t\t\t0x0\n#define EEPROM_Default_HT20_Diff\t\t\t\t2\n#define EEPROM_Default_LegacyHTTxPowerDiff\t\t0x3\n#define EEPROM_Default_LegacyHTTxPowerDiff_92C\t0x3\n#define EEPROM_Default_LegacyHTTxPowerDiff_92D\t0x4\t\n#define EEPROM_Default_HT40_PwrMaxOffset\t\t0\n#define EEPROM_Default_HT20_PwrMaxOffset\t\t0\n\n#define EEPROM_Default_PID\t\t\t\t\t\t0x1234\n#define EEPROM_Default_VID\t\t\t\t\t\t0x5678\n#define EEPROM_Default_CustomerID\t\t\t\t0xAB\n#define EEPROM_Default_CustomerID_8188E\t\t0x00\n#define EEPROM_Default_SubCustomerID\t\t\t0xCD\n#define EEPROM_Default_Version\t\t\t\t\t0\n\n#define EEPROM_Default_externalPA_C9\t\t0x00\n#define EEPROM_Default_externalPA_CC\t\t0xFF\n#define EEPROM_Default_internalPA_SP3T_C9\t0xAA\n#define EEPROM_Default_internalPA_SP3T_CC\t0xAF\n#define EEPROM_Default_internalPA_SPDT_C9\t0xAA\n#ifdef CONFIG_PCI_HCI\n#define EEPROM_Default_internalPA_SPDT_CC\t0xA0\n#else\n#define EEPROM_Default_internalPA_SPDT_CC\t0xFA\n#endif\n#define EEPROM_Default_PAType\t\t\t\t\t\t0\n#define EEPROM_Default_LNAType\t\t\t\t\t\t0\n\n//New EFUSE deafult value\n#define EEPROM_DEFAULT_24G_INDEX\t\t\t0x2D\n#define EEPROM_DEFAULT_24G_HT20_DIFF\t\t0X02\n#define EEPROM_DEFAULT_24G_OFDM_DIFF\t0X04\n\n#define EEPROM_DEFAULT_5G_INDEX\t\t\t0X2A\n#define EEPROM_DEFAULT_5G_HT20_DIFF\t\t0X00\n#define EEPROM_DEFAULT_5G_OFDM_DIFF\t\t0X04\n\n#define EEPROM_DEFAULT_DIFF\t\t\t\t0XFE\n#define EEPROM_DEFAULT_CHANNEL_PLAN\t\t0x7F\n#define EEPROM_DEFAULT_BOARD_OPTION\t\t0x00\n#define EEPROM_DEFAULT_RFE_OPTION_8192E 0xFF\n#define EEPROM_DEFAULT_RFE_OPTION\t\t0x04\n#define EEPROM_DEFAULT_FEATURE_OPTION\t0x00\n#define EEPROM_DEFAULT_BT_OPTION\t\t\t0x10\n\n\n#define EEPROM_DEFAULT_TX_CALIBRATE_RATE\t0x00\n\n// PCIe related\n#define\tEEPROM_PCIE_DEV_CAP_01\t\t\t\t0xE0 // Express device capability in PCIe configuration space, i.e., map to offset 0x74\n#define\tEEPROM_PCIE_DEV_CAP_02\t\t\t\t0xE1 // Express device capability in PCIe configuration space, i.e., map to offset 0x75\n\n\n//\n// For VHT series TX power by rate table.\n// VHT TX power by rate off setArray = \n// Band:-2G&5G = 0 / 1\n// RF: at most 4*4 = ABCD=0/1/2/3\n// CCK=0 OFDM=1/2 HT-MCS 0-15=3/4/56 VHT=7/8/9/10/11\t\t\t\n//\n#define TX_PWR_BY_RATE_NUM_BAND\t\t\t2\n#define TX_PWR_BY_RATE_NUM_RF\t\t\t4\n#define TX_PWR_BY_RATE_NUM_RATE\t\t\t84\n\n#define TXPWR_LMT_MAX_RF\t\t\t\t4\n\n//----------------------------------------------------------------------------\n//       EEPROM/EFUSE data structure definition.\n//----------------------------------------------------------------------------\n\n//For 88E new structure\n\n/*\n2.4G: \n{\n{1,2},\n{3,4,5},\n{6,7,8},\n{9,10,11},\n{12,13},\n{14}\n}\n\n5G:\n{\n{36,38,40},\n{44,46,48},\n{52,54,56},\n{60,62,64},\n{100,102,104},\n{108,110,112},\n{116,118,120},\n{124,126,128},\n{132,134,136},\n{140,142,144},\n{149,151,153},\n{157,159,161},\n{173,175,177},\n}\n*/\n#define\tMAX_RF_PATH\t\t\t\t4\n#define RF_PATH_MAX\t\t\t\tMAX_RF_PATH\t\n#define\tMAX_CHNL_GROUP_24G\t\t6 \n#define\tMAX_CHNL_GROUP_5G\t\t14 \n\n//It must always set to 4, otherwise read efuse table secquence will be wrong.\n#define \tMAX_TX_COUNT\t\t\t\t4\n\ntypedef struct _TxPowerInfo24G{\n\tu8 IndexCCK_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];\n\tu8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];\n\t//If only one tx, only BW20 and OFDM are used.\n\ts8 CCK_Diff[MAX_RF_PATH][MAX_TX_COUNT];\t\n\ts8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n}TxPowerInfo24G, *PTxPowerInfo24G;\n\ntypedef struct _TxPowerInfo5G{\n\tu8 IndexBW40_Base[MAX_RF_PATH][MAX_CHNL_GROUP_5G];\n\t//If only one tx, only BW20, OFDM, BW80 and BW160 are used.\n\ts8 OFDM_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW20_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW40_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW80_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n\ts8 BW160_Diff[MAX_RF_PATH][MAX_TX_COUNT];\n}TxPowerInfo5G, *PTxPowerInfo5G;\n\n\ntypedef\tenum _BT_Ant_NUM{\n\tAnt_x2\t= 0,\t\t\n\tAnt_x1\t= 1\n} BT_Ant_NUM, *PBT_Ant_NUM;\n\ntypedef\tenum _BT_CoType{\n\tBT_2WIRE\t\t= 0,\t\t\n\tBT_ISSC_3WIRE\t= 1,\n\tBT_ACCEL\t\t= 2,\n\tBT_CSR_BC4\t\t= 3,\n\tBT_CSR_BC8\t\t= 4,\n\tBT_RTL8756\t\t= 5,\n\tBT_RTL8723A\t\t= 6,\n\tBT_RTL8821\t\t= 7,\n\tBT_RTL8723B\t\t= 8,\n\tBT_RTL8192E\t\t= 9,\n\tBT_RTL8814A\t\t= 10,\n\tBT_RTL8812A\t\t= 11,\n\tBT_RTL8703B\t\t= 12\n} BT_CoType, *PBT_CoType;\n\ntypedef\tenum _BT_RadioShared{\n\tBT_Radio_Shared \t= 0,\t\n\tBT_Radio_Individual\t= 1,\n} BT_RadioShared, *PBT_RadioShared;\n\n\n#endif\n"
  },
  {
    "path": "include/hal_phy.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_PHY_H__\n#define __HAL_PHY_H__\n\n\n#if DISABLE_BB_RF\n#define\tHAL_FW_ENABLE\t\t\t\t0\n#define\tHAL_MAC_ENABLE\t\t\t0\n#define\tHAL_BB_ENABLE\t\t\t\t0\n#define\tHAL_RF_ENABLE\t\t\t\t0\n#else // FPGA_PHY and ASIC\n#define \tHAL_FW_ENABLE\t\t\t\t1\n#define\tHAL_MAC_ENABLE\t\t\t1\n#define\tHAL_BB_ENABLE\t\t\t\t1\n#define\tHAL_RF_ENABLE\t\t\t\t1\n#endif\n\n#define\tRF6052_MAX_TX_PWR\t\t\t0x3F\n#define\tRF6052_MAX_REG_88E\t\t\t0xFF\n#define\tRF6052_MAX_REG_92C\t\t\t0x7F\n\n#define\tRF6052_MAX_REG\t\\\n\t\t(RF6052_MAX_REG_88E > RF6052_MAX_REG_92C) ? RF6052_MAX_REG_88E: RF6052_MAX_REG_92C\n\n#define GET_RF6052_REAL_MAX_REG(_Adapter)\t\\\n\t\tIS_HARDWARE_TYPE_8188E(_Adapter) ? RF6052_MAX_REG_88E : RF6052_MAX_REG_92C\n\n#define\tRF6052_MAX_PATH\t\t\t\t2\n\n//\n// Antenna detection method, i.e., using single tone detection or RSSI reported from each antenna detected. \n// Added by Roger, 2013.05.22.\n//\n#define ANT_DETECT_BY_SINGLE_TONE\tBIT0\n#define ANT_DETECT_BY_RSSI\t\t\t\tBIT1\n#define IS_ANT_DETECT_SUPPORT_SINGLE_TONE(__Adapter)\t\t((GET_HAL_DATA(__Adapter)->AntDetection) & ANT_DETECT_BY_SINGLE_TONE)\n#define IS_ANT_DETECT_SUPPORT_RSSI(__Adapter)\t\t((GET_HAL_DATA(__Adapter)->AntDetection) & ANT_DETECT_BY_RSSI)\n\n\n/*--------------------------Define Parameters-------------------------------*/\ntypedef\tenum _RF_TYPE{\n\tRF_TYPE_MIN = 0, \t// 0\n\tRF_8225=1,\t\t\t// 1 11b/g RF for verification only\n\tRF_8256=2,\t\t\t// 2 11b/g/n \n\tRF_8258=3,\t\t\t// 3 11a/b/g/n RF\n\tRF_6052=4,\t\t\t// 4 11b/g/n RF\n\tRF_PSEUDO_11N=5,\t// 5, It is a temporality RF. \n\tRF_TYPE_MAX\n}RF_TYPE_E,*PRF_TYPE_E;\n\n#define\tTX_1S\t\t\t0\t\t\t\n#define\tTX_2S\t\t\t1\t\t\t\n#define\tTX_3S\t\t\t2\t\t\t\n#define\tTX_4S\t\t\t3\n\n#define\tRF_PATH_MAX_92C_88E \t\t2\n#define\tRF_PATH_MAX_90_8812\t\t4\t//Max RF number 90 support \n\ntypedef enum _ANTENNA_PATH{\n       ANTENNA_NONE \t= 0,\n\tANTENNA_D\t\t= 1,\n\tANTENNA_C\t\t= 2,\n\tANTENNA_CD\t= 3,\n\tANTENNA_B\t\t= 4,\n\tANTENNA_BD\t= 5,\n\tANTENNA_BC\t= 6,\n\tANTENNA_BCD\t= 7,\n\tANTENNA_A\t\t= 8,\n\tANTENNA_AD\t= 9,\n\tANTENNA_AC\t= 10,\n\tANTENNA_ACD\t= 11,\n\tANTENNA_AB\t= 12,\n\tANTENNA_ABD\t= 13,\n\tANTENNA_ABC\t= 14,\n\tANTENNA_ABCD\t= 15\n} ANTENNA_PATH;\n\ntypedef enum _RF_CONTENT{\n\tradioa_txt = 0x1000,\n\tradiob_txt = 0x1001,\n\tradioc_txt = 0x1002,\n\tradiod_txt = 0x1003\n} RF_CONTENT;\n\ntypedef enum _BaseBand_Config_Type{\n\tBaseBand_Config_PHY_REG = 0,\t\t\t//Radio Path A\n\tBaseBand_Config_AGC_TAB = 1,\t\t\t//Radio Path B\n\tBaseBand_Config_AGC_TAB_2G = 2,\n\tBaseBand_Config_AGC_TAB_5G = 3,\t\n\tBaseBand_Config_PHY_REG_PG\n}BaseBand_Config_Type, *PBaseBand_Config_Type;\n\ntypedef enum _HW_BLOCK{\n\tHW_BLOCK_MAC = 0,\n\tHW_BLOCK_PHY0 = 1,\n\tHW_BLOCK_PHY1 = 2,\n\tHW_BLOCK_RF = 3,\n\tHW_BLOCK_MAXIMUM = 4, // Never use this\n}HW_BLOCK_E, *PHW_BLOCK_E;\n\ntypedef enum _WIRELESS_MODE {\n\tWIRELESS_MODE_UNKNOWN = 0x00,\n\tWIRELESS_MODE_A = 0x01,\n\tWIRELESS_MODE_B = 0x02,\n\tWIRELESS_MODE_G = 0x04,\n\tWIRELESS_MODE_AUTO = 0x08,\n\tWIRELESS_MODE_N_24G = 0x10,\n\tWIRELESS_MODE_N_5G = 0x20,\n\tWIRELESS_MODE_AC_5G = 0x40,\n\tWIRELESS_MODE_AC_24G  = 0x80,\n\tWIRELESS_MODE_AC_ONLY  = 0x100,\n} WIRELESS_MODE;\n\ntypedef enum _SwChnlCmdID{\n\tCmdID_End,\n\tCmdID_SetTxPowerLevel,\n\tCmdID_BBRegWrite10,\n\tCmdID_WritePortUlong,\n\tCmdID_WritePortUshort,\n\tCmdID_WritePortUchar,\n\tCmdID_RF_WriteReg,\n}SwChnlCmdID;\n\ntypedef struct _SwChnlCmd{\n\tSwChnlCmdID\tCmdID;\n\tu32\t\t\t\tPara1;\n\tu32\t\t\t\tPara2;\n\tu32\t\t\t\tmsDelay;\n}SwChnlCmd;\n\ntypedef struct _R_ANTENNA_SELECT_OFDM{\t\n\tu32\t\t\tr_tx_antenna:4;\t\n\tu32\t\t\tr_ant_l:4;\n\tu32\t\t\tr_ant_non_ht:4;\t\n\tu32\t\t\tr_ant_ht1:4;\n\tu32\t\t\tr_ant_ht2:4;\n\tu32\t\t\tr_ant_ht_s1:4;\n\tu32\t\t\tr_ant_non_ht_s1:4;\n\tu32\t\t\tOFDM_TXSC:2;\n\tu32\t\t\tReserved:2;\n}R_ANTENNA_SELECT_OFDM;\n\ntypedef struct _R_ANTENNA_SELECT_CCK{\n\tu8\t\t\tr_cckrx_enable_2:2;\t\n\tu8\t\t\tr_cckrx_enable:2;\n\tu8\t\t\tr_ccktx_enable:4;\n}R_ANTENNA_SELECT_CCK;\n\ntypedef struct RF_Shadow_Compare_Map {\n\t// Shadow register value\n\tu32\t\tValue;\n\t// Compare or not flag\n\tu8\t\tCompare;\n\t// Record If it had ever modified unpredicted\n\tu8\t\tErrorOrNot;\n\t// Recorver Flag\n\tu8\t\tRecorver;\n\t//\n\tu8\t\tDriver_Write;\n}RF_SHADOW_T;\n\n/*--------------------------Exported Function prototype---------------------*/\n\nu32\nPHY_CalculateBitShift(\n\tu32 BitMask\n\t);\n\nu32\nPHY_RFShadowRead(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset);\n\nVOID\nPHY_RFShadowWrite(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu32\t\t\t\tData);\n\nBOOLEAN\nPHY_RFShadowCompare(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset);\n\nVOID\nPHY_RFShadowRecorver(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset);\n\nVOID\nPHY_RFShadowCompareAll(\n\tIN\tPADAPTER\t\tAdapter);\n\nVOID\nPHY_RFShadowRecorverAll(\n\tIN\tPADAPTER\t\tAdapter);\n\nVOID\nPHY_RFShadowCompareFlagSet(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu8\t\t\t\tType);\n\nVOID\nPHY_RFShadowRecorverFlagSet(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu8\t\t\t\teRFPath,\n\tIN\tu32\t\t\t\tOffset,\n\tIN\tu8\t\t\t\tType);\n\nVOID\nPHY_RFShadowCompareFlagSetAll(\n\tIN\tPADAPTER\t\tAdapter);\n\nVOID\nPHY_RFShadowRecorverFlagSetAll(\n\tIN\tPADAPTER\t\tAdapter);\n\nVOID\nPHY_RFShadowRefresh(\n\tIN\tPADAPTER\t\tAdapter);\n\n#endif //__HAL_COMMON_H__\n\n"
  },
  {
    "path": "include/hal_phy_reg.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_PHY_REG_H__\n#define __HAL_PHY_REG_H__\n\n//for PutRFRegsetting & GetRFRegSetting BitMask\n//#if (RTL92SE_FPGA_VERIFY == 1)\n//#define \t\tbRFRegOffsetMask\t0xfff\t\t\n//#else\n#define \t\tbRFRegOffsetMask\t0xfffff\n//#endif\n\n#endif //__HAL_PHY_REG_H__\n\n"
  },
  {
    "path": "include/hal_sdio.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __HAL_SDIO_H_\n#define __HAL_SDIO_H_\n\n#define ffaddr2deviceId(pdvobj, addr)\t(pdvobj->Queue2Pipe[addr])\n\nu8 rtw_hal_sdio_max_txoqt_free_space(_adapter *padapter);\nu8 rtw_hal_sdio_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);\nvoid rtw_hal_sdio_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);\nvoid rtw_hal_set_sdio_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);\nu32 rtw_hal_get_sdio_tx_max_length(PADAPTER padapter, u8 queue_idx);\n\n#endif //__RTW_LED_H_\n\n"
  },
  {
    "path": "include/ieee80211.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __IEEE80211_H\n#define __IEEE80211_H\n\n\n#ifndef CONFIG_RTL8711FW\n\n\t#if defined PLATFORM_OS_XP\n\t#include <ntstrsafe.h>\n\t#endif\n#else\n\n#endif\n\n#define MGMT_QUEUE_NUM 5\n\n#define ETH_ALEN\t6\n#define ETH_TYPE_LEN\t\t2\n#define PAYLOAD_TYPE_LEN\t1\n\n#ifdef CONFIG_AP_MODE\n\n#define RTL_IOCTL_HOSTAPD (SIOCIWFIRSTPRIV + 28)\n\n/* RTL871X_IOCTL_HOSTAPD ioctl() cmd: */\nenum {\n\tRTL871X_HOSTAPD_FLUSH = 1,\n\tRTL871X_HOSTAPD_ADD_STA = 2,\n\tRTL871X_HOSTAPD_REMOVE_STA = 3,\n\tRTL871X_HOSTAPD_GET_INFO_STA = 4,\n\t/* REMOVED: PRISM2_HOSTAPD_RESET_TXEXC_STA = 5, */\n\tRTL871X_HOSTAPD_GET_WPAIE_STA = 5,\n\tRTL871X_SET_ENCRYPTION = 6,\n\tRTL871X_GET_ENCRYPTION = 7,\n\tRTL871X_HOSTAPD_SET_FLAGS_STA = 8,\n\tRTL871X_HOSTAPD_GET_RID = 9,\n\tRTL871X_HOSTAPD_SET_RID = 10,\n\tRTL871X_HOSTAPD_SET_ASSOC_AP_ADDR = 11,\n\tRTL871X_HOSTAPD_SET_GENERIC_ELEMENT = 12,\n\tRTL871X_HOSTAPD_MLME = 13,\n\tRTL871X_HOSTAPD_SCAN_REQ = 14,\n\tRTL871X_HOSTAPD_STA_CLEAR_STATS = 15,\n\tRTL871X_HOSTAPD_SET_BEACON=16,\n\tRTL871X_HOSTAPD_SET_WPS_BEACON = 17,\n\tRTL871X_HOSTAPD_SET_WPS_PROBE_RESP = 18,\n\tRTL871X_HOSTAPD_SET_WPS_ASSOC_RESP = 19,\n\tRTL871X_HOSTAPD_SET_HIDDEN_SSID = 20,\n\tRTL871X_HOSTAPD_SET_MACADDR_ACL = 21,\n\tRTL871X_HOSTAPD_ACL_ADD_STA = 22,\n\tRTL871X_HOSTAPD_ACL_REMOVE_STA = 23,\n};\n\n/* STA flags */\n#define WLAN_STA_AUTH BIT(0)\n#define WLAN_STA_ASSOC BIT(1)\n#define WLAN_STA_PS BIT(2)\n#define WLAN_STA_TIM BIT(3)\n#define WLAN_STA_PERM BIT(4)\n#define WLAN_STA_AUTHORIZED BIT(5)\n#define WLAN_STA_PENDING_POLL BIT(6) /* pending activity poll not ACKed */\n#define WLAN_STA_SHORT_PREAMBLE BIT(7)\n#define WLAN_STA_PREAUTH BIT(8)\n#define WLAN_STA_WME BIT(9)\n#define WLAN_STA_MFP BIT(10)\n#define WLAN_STA_HT BIT(11)\n#define WLAN_STA_WPS BIT(12)\n#define WLAN_STA_MAYBE_WPS BIT(13)\n#define WLAN_STA_VHT BIT(14)\n#define WLAN_STA_NONERP BIT(31)\n\n#endif\n\n#define IEEE_CMD_SET_WPA_PARAM\t\t\t1\n#define IEEE_CMD_SET_WPA_IE\t\t\t\t2\n#define IEEE_CMD_SET_ENCRYPTION\t\t\t3\n#define IEEE_CMD_MLME\t\t\t\t\t\t4\n\n#define IEEE_PARAM_WPA_ENABLED\t\t\t\t1\n#define IEEE_PARAM_TKIP_COUNTERMEASURES\t\t2\n#define IEEE_PARAM_DROP_UNENCRYPTED\t\t\t3\n#define IEEE_PARAM_PRIVACY_INVOKED\t\t\t4\n#define IEEE_PARAM_AUTH_ALGS\t\t\t\t\t5\n#define IEEE_PARAM_IEEE_802_1X\t\t\t\t6\n#define IEEE_PARAM_WPAX_SELECT\t\t\t\t7\n\n#define AUTH_ALG_OPEN_SYSTEM\t\t\t0x1\n#define AUTH_ALG_SHARED_KEY\t\t\t0x2\n#define AUTH_ALG_LEAP\t\t\t\t0x00000004\n\n#define IEEE_MLME_STA_DEAUTH\t\t\t\t1\n#define IEEE_MLME_STA_DISASSOC\t\t\t2\n\n#define IEEE_CRYPT_ERR_UNKNOWN_ALG\t\t\t2\n#define IEEE_CRYPT_ERR_UNKNOWN_ADDR\t\t\t3\n#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED\t\t4\n#define IEEE_CRYPT_ERR_KEY_SET_FAILED\t\t\t5\n#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED\t\t6\n#define IEEE_CRYPT_ERR_CARD_CONF_FAILED\t\t7\n\n\n#define\tIEEE_CRYPT_ALG_NAME_LEN\t\t\t16\n\n#define WPA_CIPHER_NONE \tBIT(0)\n#define WPA_CIPHER_WEP40 \tBIT(1)\n#define WPA_CIPHER_WEP104 BIT(2)\n#define WPA_CIPHER_TKIP \tBIT(3)\n#define WPA_CIPHER_CCMP \tBIT(4)\n\n\n\n#define WPA_SELECTOR_LEN 4\nextern u8 RTW_WPA_OUI_TYPE[] ;\nextern u16 RTW_WPA_VERSION ;\nextern u8 WPA_AUTH_KEY_MGMT_NONE[];\nextern u8 WPA_AUTH_KEY_MGMT_UNSPEC_802_1X[];\nextern u8 WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X[];\nextern u8 WPA_CIPHER_SUITE_NONE[];\nextern u8 WPA_CIPHER_SUITE_WEP40[];\nextern u8 WPA_CIPHER_SUITE_TKIP[];\nextern u8 WPA_CIPHER_SUITE_WRAP[];\nextern u8 WPA_CIPHER_SUITE_CCMP[];\nextern u8 WPA_CIPHER_SUITE_WEP104[];\n\n\n#define RSN_HEADER_LEN 4\n#define RSN_SELECTOR_LEN 4\n\nextern u16 RSN_VERSION_BSD;\nextern u8 RSN_AUTH_KEY_MGMT_UNSPEC_802_1X[];\nextern u8 RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X[];\nextern u8 RSN_CIPHER_SUITE_NONE[];\nextern u8 RSN_CIPHER_SUITE_WEP40[];\nextern u8 RSN_CIPHER_SUITE_TKIP[];\nextern u8 RSN_CIPHER_SUITE_WRAP[];\nextern u8 RSN_CIPHER_SUITE_CCMP[];\nextern u8 RSN_CIPHER_SUITE_WEP104[];\n\n\ntypedef enum _RATEID_IDX_ {\n\tRATEID_IDX_BGN_40M_2SS = 0,\n\tRATEID_IDX_BGN_40M_1SS = 1,\n\tRATEID_IDX_BGN_20M_2SS_BN = 2,\n\tRATEID_IDX_BGN_20M_1SS_BN = 3,\n\tRATEID_IDX_GN_N2SS = 4,\n\tRATEID_IDX_GN_N1SS = 5,\n\tRATEID_IDX_BG = 6,\n\tRATEID_IDX_G = 7,\n\tRATEID_IDX_B = 8,\n\tRATEID_IDX_VHT_2SS = 9,\n\tRATEID_IDX_VHT_1SS = 10,\n\tRATEID_IDX_MIX1 = 11,\n\tRATEID_IDX_MIX2 = 12,\n\tRATEID_IDX_VHT_3SS = 13,\n\tRATEID_IDX_BGN_3SS = 14,\n} RATEID_IDX, *PRATEID_IDX;\n\ntypedef enum _RATR_TABLE_MODE{\n\tRATR_INX_WIRELESS_NGB = 0,\t// BGN 40 Mhz 2SS 1SS\n\tRATR_INX_WIRELESS_NG = 1,\t\t// GN or N\n\tRATR_INX_WIRELESS_NB = 2,\t\t// BGN 20 Mhz 2SS 1SS  or BN\n\tRATR_INX_WIRELESS_N = 3,\n\tRATR_INX_WIRELESS_GB = 4,\n\tRATR_INX_WIRELESS_G = 5,\n\tRATR_INX_WIRELESS_B = 6,\n\tRATR_INX_WIRELESS_MC = 7,\n\tRATR_INX_WIRELESS_AC_N = 8,\n}RATR_TABLE_MODE, *PRATR_TABLE_MODE;\n\n\nenum NETWORK_TYPE\n{\n\tWIRELESS_INVALID = 0,\n\t//Sub-Element\n\tWIRELESS_11B = BIT(0), // tx: cck only , rx: cck only, hw: cck\n\tWIRELESS_11G = BIT(1), // tx: ofdm only, rx: ofdm & cck, hw: cck & ofdm\n\tWIRELESS_11A = BIT(2), // tx: ofdm only, rx: ofdm only, hw: ofdm only\n\tWIRELESS_11_24N = BIT(3), // tx: MCS only, rx: MCS & cck, hw: MCS & cck\n\tWIRELESS_11_5N = BIT(4), // tx: MCS only, rx: MCS & ofdm, hw: ofdm only\n\tWIRELESS_AUTO = BIT(5), \n\tWIRELESS_11AC = BIT(6), \n\n\t//Combination\n\t//Type for current wireless mode\n\tWIRELESS_11BG = (WIRELESS_11B|WIRELESS_11G), // tx: cck & ofdm, rx: cck & ofdm & MCS, hw: cck & ofdm\n\tWIRELESS_11G_24N = (WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & MCS, rx: ofdm & cck & MCS, hw: cck & ofdm\n\tWIRELESS_11A_5N = (WIRELESS_11A|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only\n\tWIRELESS_11B_24N = (WIRELESS_11B|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck\n\tWIRELESS_11BG_24N = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N), // tx: ofdm & cck & MCS, rx: ofdm & cck & MCS, hw: ofdm & cck\n\tWIRELESS_11_24AC = (WIRELESS_11G|WIRELESS_11AC),\n\tWIRELESS_11_5AC = (WIRELESS_11A|WIRELESS_11AC),\n\n\n\t//Type for registry default wireless mode\n\tWIRELESS_11AGN = (WIRELESS_11A|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N), // tx: ofdm & MCS, rx: ofdm & MCS, hw: ofdm only\n\tWIRELESS_11ABGN = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N),\n\tWIRELESS_MODE_24G = (WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N),\n\tWIRELESS_MODE_5G = (WIRELESS_11A|WIRELESS_11_5N|WIRELESS_11AC),\n\tWIRELESS_MODE_MAX = (WIRELESS_11A|WIRELESS_11B|WIRELESS_11G|WIRELESS_11_24N|WIRELESS_11_5N|WIRELESS_11AC),\n};\n\n#define SUPPORTED_24G_NETTYPE_MSK WIRELESS_MODE_24G\n#define SUPPORTED_5G_NETTYPE_MSK WIRELESS_MODE_5G \n\n#define IsLegacyOnly(NetType)  ((NetType) == ((NetType) & (WIRELESS_11BG|WIRELESS_11A)))\n\n#define IsSupported24G(NetType) ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? _TRUE : _FALSE)\n#define IsSupported5G(NetType) ((NetType) & SUPPORTED_5G_NETTYPE_MSK ? _TRUE : _FALSE)\n\n#define IsEnableHWCCK(NetType) IsSupported24G(NetType)\n#define IsEnableHWOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11_24N|SUPPORTED_5G_NETTYPE_MSK) ? _TRUE : _FALSE)\n\n#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType)\n#define IsSupportedRxOFDM(NetType) IsEnableHWOFDM(NetType)\n#define IsSupportedRxHT(NetType) IsEnableHWOFDM(NetType)\n\n#define IsSupportedTxCCK(NetType) ((NetType) & (WIRELESS_11B) ? _TRUE : _FALSE)\n#define IsSupportedTxOFDM(NetType) ((NetType) & (WIRELESS_11G|WIRELESS_11A) ? _TRUE : _FALSE)\n#define IsSupportedHT(NetType) ((NetType) & (WIRELESS_11_24N|WIRELESS_11_5N) ? _TRUE : _FALSE) \n\n#define IsSupportedVHT(NetType) ((NetType) & (WIRELESS_11AC) ? _TRUE : _FALSE) \n\n\ntypedef struct ieee_param {\n\tu32 cmd;\n\tu8 sta_addr[ETH_ALEN];\n\tunion {\n\t\tstruct {\n\t\t\tu8 name;\n\t\t\tu32 value;\n\t\t} wpa_param;\n\t\tstruct {\n\t\t\tu32 len;\n\t\t\tu8 reserved[32];\n\t\t\tu8 data[0];\n\t\t} wpa_ie;\n\t        struct{\n\t\t\tint command;\n    \t\t\tint reason_code;\n\t\t} mlme;\n\t\tstruct {\n\t\t\tu8 alg[IEEE_CRYPT_ALG_NAME_LEN];\n\t\t\tu8 set_tx;\n\t\t\tu32 err;\n\t\t\tu8 idx;\n\t\t\tu8 seq[8]; /* sequence counter (set: RX, get: TX) */\n\t\t\tu16 key_len;\n\t\t\tu8 key[0];\n\t\t} crypt;\n#ifdef CONFIG_AP_MODE\n\t\tstruct {\n\t\t\tu16 aid;\n\t\t\tu16 capability;\n\t\t\tint flags;\n\t\t\tu8 tx_supp_rates[16];\t\t\n\t\t\tstruct rtw_ieee80211_ht_cap ht_cap;\n\t\t} add_sta;\n\t\tstruct {\n\t\t\tu8\treserved[2];//for set max_num_sta\n\t\t\tu8\tbuf[0];\n\t\t} bcn_ie;\n#endif\n\n\t} u;\t   \n}ieee_param;\n\n#ifdef CONFIG_AP_MODE\ntypedef struct ieee_param_ex {\n\tu32 cmd;\n\tu8 sta_addr[ETH_ALEN];\n\tu8 data[0];\n}ieee_param_ex;\n\nstruct sta_data{\n\tu16 aid;\n\tu16 capability;\n\tint flags;\n\tu32 sta_set;\n\tu8 tx_supp_rates[16];\t\n\tu32 tx_supp_rates_len;\n\tstruct rtw_ieee80211_ht_cap ht_cap;\n\tu64\trx_pkts;\n\tu64\trx_bytes;\n\tu64\trx_drops;\n\tu64\ttx_pkts;\n\tu64\ttx_bytes;\n\tu64\ttx_drops;\n};\n#endif\n\n\n#if WIRELESS_EXT < 17\n#define IW_QUAL_QUAL_INVALID   0x10\n#define IW_QUAL_LEVEL_INVALID  0x20\n#define IW_QUAL_NOISE_INVALID  0x40\n#define IW_QUAL_QUAL_UPDATED   0x1\n#define IW_QUAL_LEVEL_UPDATED  0x2\n#define IW_QUAL_NOISE_UPDATED  0x4\n#endif\n\n#define IEEE80211_DATA_LEN\t\t2304\n/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section\n   6.2.1.1.2.\n\n   The figure in section 7.1.2 suggests a body size of up to 2312\n   bytes is allowed, which is a bit confusing, I suspect this\n   represents the 2304 bytes of real data, plus a possible 8 bytes of\n   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */\n\n\n#define IEEE80211_HLEN\t\t\t30\n#define IEEE80211_FRAME_LEN\t\t(IEEE80211_DATA_LEN + IEEE80211_HLEN)\n\n\n/* this is stolen from ipw2200 driver */\n#define IEEE_IBSS_MAC_HASH_SIZE 31\n\nstruct ieee_ibss_seq {\n\tu8 mac[ETH_ALEN];\n\tu16 seq_num;\n\tu16 frag_num;\n\tunsigned long packet_time;\n\t_list\tlist;\n};\n\n#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)||defined(PLATFORM_FREEBSD) \n\nstruct rtw_ieee80211_hdr {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n\tu8 addr4[ETH_ALEN];\n} __attribute__ ((packed));\n\nstruct rtw_ieee80211_hdr_3addr {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n} __attribute__ ((packed));\n\n\nstruct rtw_ieee80211_hdr_qos {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n\tu8 addr4[ETH_ALEN];\n\tu16\tqc;\n}  __attribute__ ((packed));\n\nstruct rtw_ieee80211_hdr_3addr_qos {\n        u16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n       u16     qc;\n}  __attribute__ ((packed));\n\nstruct eapol {\n\tu8 snap[6];\n\tu16 ethertype;\n\tu8 version;\n\tu8 type;\n\tu16 length;\n} __attribute__ ((packed));\n\n#endif\n\n\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\nstruct rtw_ieee80211_hdr {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n\tu8 addr4[ETH_ALEN];\n};\n\nstruct rtw_ieee80211_hdr_3addr {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[ETH_ALEN];\n\tu8 addr2[ETH_ALEN];\n\tu8 addr3[ETH_ALEN];\n\tu16 seq_ctl;\n};\n\n\nstruct rtw_ieee80211_hdr_qos {\n\tstruct rtw_ieee80211_hdr wlan_hdr;\n\tu16\tqc;\n};\n\nstruct rtw_ieee80211_hdr_3addr_qos {\n        struct  rtw_ieee80211_hdr_3addr wlan_hdr;\n        u16     qc;\n};\n\nstruct eapol {\n\tu8 snap[6];\n\tu16 ethertype;\n\tu8 version;\n\tu8 type;\n\tu16 length;\n};\n#pragma pack()\n\n#endif\n\n\n\nenum eap_type {\n\tEAP_PACKET = 0,\n\tEAPOL_START,\n\tEAPOL_LOGOFF,\n\tEAPOL_KEY,\n\tEAPOL_ENCAP_ASF_ALERT\n};\n\n#define IEEE80211_3ADDR_LEN 24\n#define IEEE80211_4ADDR_LEN 30\n#define IEEE80211_FCS_LEN    4\n\n#define MIN_FRAG_THRESHOLD     256U\n#define\tMAX_FRAG_THRESHOLD     2346U\n\n/* Frame control field constants */\n#define RTW_IEEE80211_FCTL_VERS\t\t0x0003\n#define RTW_IEEE80211_FCTL_FTYPE\t\t0x000c\n#define RTW_IEEE80211_FCTL_STYPE\t\t0x00f0\n#define RTW_IEEE80211_FCTL_TODS\t\t0x0100\n#define RTW_IEEE80211_FCTL_FROMDS\t0x0200\n#define RTW_IEEE80211_FCTL_MOREFRAGS\t0x0400\n#define RTW_IEEE80211_FCTL_RETRY\t\t0x0800\n#define RTW_IEEE80211_FCTL_PM\t\t0x1000\n#define RTW_IEEE80211_FCTL_MOREDATA\t0x2000\n#define RTW_IEEE80211_FCTL_PROTECTED\t0x4000\n#define RTW_IEEE80211_FCTL_ORDER\t\t0x8000\n#define RTW_IEEE80211_FCTL_CTL_EXT\t0x0f00\n\n#define RTW_IEEE80211_FTYPE_MGMT\t\t0x0000\n#define RTW_IEEE80211_FTYPE_CTL\t\t0x0004\n#define RTW_IEEE80211_FTYPE_DATA\t\t0x0008\n#define RTW_IEEE80211_FTYPE_EXT\t\t0x000c\n\n/* management */\n#define RTW_IEEE80211_STYPE_ASSOC_REQ\t0x0000\n#define RTW_IEEE80211_STYPE_ASSOC_RESP \t0x0010\n#define RTW_IEEE80211_STYPE_REASSOC_REQ\t0x0020\n#define RTW_IEEE80211_STYPE_REASSOC_RESP\t0x0030\n#define RTW_IEEE80211_STYPE_PROBE_REQ\t0x0040\n#define RTW_IEEE80211_STYPE_PROBE_RESP\t0x0050\n#define RTW_IEEE80211_STYPE_BEACON\t\t0x0080\n#define RTW_IEEE80211_STYPE_ATIM\t\t0x0090\n#define RTW_IEEE80211_STYPE_DISASSOC\t0x00A0\n#define RTW_IEEE80211_STYPE_AUTH\t\t0x00B0\n#define RTW_IEEE80211_STYPE_DEAUTH\t\t0x00C0\n#define RTW_IEEE80211_STYPE_ACTION\t\t0x00D0\n\n/* control */\n#define RTW_IEEE80211_STYPE_CTL_EXT\t\t0x0060\n#define RTW_IEEE80211_STYPE_BACK_REQ\t\t0x0080\n#define RTW_IEEE80211_STYPE_BACK\t\t0x0090\n#define RTW_IEEE80211_STYPE_PSPOLL\t\t0x00A0\n#define RTW_IEEE80211_STYPE_RTS\t\t0x00B0\n#define RTW_IEEE80211_STYPE_CTS\t\t0x00C0\n#define RTW_IEEE80211_STYPE_ACK\t\t0x00D0\n#define RTW_IEEE80211_STYPE_CFEND\t\t0x00E0\n#define RTW_IEEE80211_STYPE_CFENDACK\t\t0x00F0\n\n/* data */\n#define RTW_IEEE80211_STYPE_DATA\t\t0x0000\n#define RTW_IEEE80211_STYPE_DATA_CFACK\t0x0010\n#define RTW_IEEE80211_STYPE_DATA_CFPOLL\t0x0020\n#define RTW_IEEE80211_STYPE_DATA_CFACKPOLL\t0x0030\n#define RTW_IEEE80211_STYPE_NULLFUNC\t0x0040\n#define RTW_IEEE80211_STYPE_CFACK\t\t0x0050\n#define RTW_IEEE80211_STYPE_CFPOLL\t\t0x0060\n#define RTW_IEEE80211_STYPE_CFACKPOLL\t0x0070\n#define RTW_IEEE80211_STYPE_QOS_DATA\t\t0x0080\n#define RTW_IEEE80211_STYPE_QOS_DATA_CFACK\t\t0x0090\n#define RTW_IEEE80211_STYPE_QOS_DATA_CFPOLL\t\t0x00A0\n#define RTW_IEEE80211_STYPE_QOS_DATA_CFACKPOLL\t0x00B0\n#define RTW_IEEE80211_STYPE_QOS_NULLFUNC\t0x00C0\n#define RTW_IEEE80211_STYPE_QOS_CFACK\t\t0x00D0\n#define RTW_IEEE80211_STYPE_QOS_CFPOLL\t\t0x00E0\n#define RTW_IEEE80211_STYPE_QOS_CFACKPOLL\t0x00F0\n\n/* sequence control field */\n#define RTW_IEEE80211_SCTL_FRAG\t0x000F\n#define RTW_IEEE80211_SCTL_SEQ\t0xFFF0\n\n\n#define RTW_ERP_INFO_NON_ERP_PRESENT BIT(0)\n#define RTW_ERP_INFO_USE_PROTECTION BIT(1)\n#define RTW_ERP_INFO_BARKER_PREAMBLE_MODE BIT(2)\n\n/* QoS,QOS */\n#define NORMAL_ACK\t\t\t0\n#define NO_ACK\t\t\t\t1\n#define NON_EXPLICIT_ACK\t2\n#define BLOCK_ACK\t\t\t3\n\n#ifndef ETH_P_PAE\n#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */\n#endif /* ETH_P_PAE */\n\n#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */\n\n#define ETH_P_ECONET\t0x0018\n\n#ifndef ETH_P_80211_RAW\n#define ETH_P_80211_RAW (ETH_P_ECONET + 1)\n#endif\n\n/* IEEE 802.11 defines */\n\n#define P80211_OUI_LEN 3\n\n#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW) || defined(PLATFORM_FREEBSD)\n\nstruct ieee80211_snap_hdr {\n\n        u8    dsap;   /* always 0xAA */\n        u8    ssap;   /* always 0xAA */\n        u8    ctrl;   /* always 0x03 */\n        u8    oui[P80211_OUI_LEN];    /* organizational universal id */\n\n} __attribute__ ((packed));\n\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\nstruct ieee80211_snap_hdr {\n\n        u8    dsap;   /* always 0xAA */\n        u8    ssap;   /* always 0xAA */\n        u8    ctrl;   /* always 0x03 */\n        u8    oui[P80211_OUI_LEN];    /* organizational universal id */\n\n};\n#pragma pack()\n\n#endif\n\n\n#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)\n\n#define WLAN_FC_GET_TYPE(fc) ((fc) & RTW_IEEE80211_FCTL_FTYPE)\n#define WLAN_FC_GET_STYPE(fc) ((fc) & RTW_IEEE80211_FCTL_STYPE)\n\n#define WLAN_QC_GET_TID(qc) ((qc) & 0x0f)\n\n#define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTW_IEEE80211_SCTL_FRAG)\n#define WLAN_GET_SEQ_SEQ(seq)  ((seq) & RTW_IEEE80211_SCTL_SEQ)\n\n/* Authentication algorithms */\n#define WLAN_AUTH_OPEN 0\n#define WLAN_AUTH_SHARED_KEY 1\n\n#define WLAN_AUTH_CHALLENGE_LEN 128\n\n#define WLAN_CAPABILITY_BSS (1<<0)\n#define WLAN_CAPABILITY_IBSS (1<<1)\n#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)\n#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)\n#define WLAN_CAPABILITY_PRIVACY (1<<4)\n#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)\n#define WLAN_CAPABILITY_PBCC (1<<6)\n#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)\n#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)\n\n/* Status codes */\n#define WLAN_STATUS_SUCCESS 0\n#define WLAN_STATUS_UNSPECIFIED_FAILURE 1\n#define WLAN_STATUS_CAPS_UNSUPPORTED 10\n#define WLAN_STATUS_REASSOC_NO_ASSOC 11\n#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12\n#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13\n#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14\n#define WLAN_STATUS_CHALLENGE_FAIL 15\n#define WLAN_STATUS_AUTH_TIMEOUT 16\n#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17\n#define WLAN_STATUS_ASSOC_DENIED_RATES 18\n/* 802.11b */\n#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19\n#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20\n#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21\n\n/* Reason codes */\n#define WLAN_REASON_UNSPECIFIED 1\n#define WLAN_REASON_PREV_AUTH_NOT_VALID 2\n#define WLAN_REASON_DEAUTH_LEAVING 3\n#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4\n#define WLAN_REASON_DISASSOC_AP_BUSY 5\n#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6\n#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7\n#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8\n#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9\n#define WLAN_REASON_ACTIVE_ROAM 65533\n#define WLAN_REASON_JOIN_WRONG_CHANNEL       65534\n#define WLAN_REASON_EXPIRATION_CHK 65535\n\n/* Information Element IDs */\n#define WLAN_EID_SSID 0\n#define WLAN_EID_SUPP_RATES 1\n#define WLAN_EID_FH_PARAMS 2\n#define WLAN_EID_DS_PARAMS 3\n#define WLAN_EID_CF_PARAMS 4\n#define WLAN_EID_TIM 5\n#define WLAN_EID_IBSS_PARAMS 6\n#define WLAN_EID_CHALLENGE 16\n/* EIDs defined by IEEE 802.11h - START */\n#define WLAN_EID_PWR_CONSTRAINT 32\n#define WLAN_EID_PWR_CAPABILITY 33\n#define WLAN_EID_TPC_REQUEST 34\n#define WLAN_EID_TPC_REPORT 35\n#define WLAN_EID_SUPPORTED_CHANNELS 36\n#define WLAN_EID_CHANNEL_SWITCH 37\n#define WLAN_EID_MEASURE_REQUEST 38\n#define WLAN_EID_MEASURE_REPORT 39\n#define WLAN_EID_QUITE 40\n#define WLAN_EID_IBSS_DFS 41\n/* EIDs defined by IEEE 802.11h - END */\n#define WLAN_EID_ERP_INFO 42\n#define WLAN_EID_HT_CAP 45\n#define WLAN_EID_RSN 48\n#define WLAN_EID_EXT_SUPP_RATES 50\n#define WLAN_EID_MOBILITY_DOMAIN 54\n#define WLAN_EID_FAST_BSS_TRANSITION 55\n#define WLAN_EID_TIMEOUT_INTERVAL 56\n#define WLAN_EID_RIC_DATA 57\n#define WLAN_EID_HT_OPERATION 61\n#define WLAN_EID_SECONDARY_CHANNEL_OFFSET 62\n#define WLAN_EID_20_40_BSS_COEXISTENCE 72\n#define WLAN_EID_20_40_BSS_INTOLERANT 73\n#define WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS 74\n#define WLAN_EID_MMIE 76\n#define WLAN_EID_VENDOR_SPECIFIC 221\n#define WLAN_EID_GENERIC (WLAN_EID_VENDOR_SPECIFIC)\n#define WLAN_EID_VHT_CAPABILITY 191\n#define WLAN_EID_VHT_OPERATION 192\n#define WLAN_EID_VHT_OP_MODE_NOTIFY 199\n\n#define IEEE80211_MGMT_HDR_LEN 24\n#define IEEE80211_DATA_HDR3_LEN 24\n#define IEEE80211_DATA_HDR4_LEN 30\n\n\n#define IEEE80211_STATMASK_SIGNAL (1<<0)\n#define IEEE80211_STATMASK_RSSI (1<<1)\n#define IEEE80211_STATMASK_NOISE (1<<2)\n#define IEEE80211_STATMASK_RATE (1<<3)\n#define IEEE80211_STATMASK_WEMASK 0x7\n\n\n#define IEEE80211_CCK_MODULATION    (1<<0)\n#define IEEE80211_OFDM_MODULATION   (1<<1)\n\n#define IEEE80211_24GHZ_BAND     (1<<0)\n#define IEEE80211_52GHZ_BAND     (1<<1)\n\n#define IEEE80211_CCK_RATE_LEN  \t\t4\n#define IEEE80211_NUM_OFDM_RATESLEN\t8\n\n\n#define IEEE80211_CCK_RATE_1MB\t\t        0x02\n#define IEEE80211_CCK_RATE_2MB\t\t        0x04\n#define IEEE80211_CCK_RATE_5MB\t\t        0x0B\n#define IEEE80211_CCK_RATE_11MB\t\t        0x16\n#define IEEE80211_OFDM_RATE_LEN \t\t8\n#define IEEE80211_OFDM_RATE_6MB\t\t        0x0C\n#define IEEE80211_OFDM_RATE_9MB\t\t        0x12\n#define IEEE80211_OFDM_RATE_12MB\t\t0x18\n#define IEEE80211_OFDM_RATE_18MB\t\t0x24\n#define IEEE80211_OFDM_RATE_24MB\t\t0x30\n#define IEEE80211_OFDM_RATE_36MB\t\t0x48\n#define IEEE80211_OFDM_RATE_48MB\t\t0x60\n#define IEEE80211_OFDM_RATE_54MB\t\t0x6C\n#define IEEE80211_BASIC_RATE_MASK\t\t0x80\n\n#define IEEE80211_CCK_RATE_1MB_MASK\t\t(1<<0)\n#define IEEE80211_CCK_RATE_2MB_MASK\t\t(1<<1)\n#define IEEE80211_CCK_RATE_5MB_MASK\t\t(1<<2)\n#define IEEE80211_CCK_RATE_11MB_MASK\t\t(1<<3)\n#define IEEE80211_OFDM_RATE_6MB_MASK\t\t(1<<4)\n#define IEEE80211_OFDM_RATE_9MB_MASK\t\t(1<<5)\n#define IEEE80211_OFDM_RATE_12MB_MASK\t\t(1<<6)\n#define IEEE80211_OFDM_RATE_18MB_MASK\t\t(1<<7)\n#define IEEE80211_OFDM_RATE_24MB_MASK\t\t(1<<8)\n#define IEEE80211_OFDM_RATE_36MB_MASK\t\t(1<<9)\n#define IEEE80211_OFDM_RATE_48MB_MASK\t\t(1<<10)\n#define IEEE80211_OFDM_RATE_54MB_MASK\t\t(1<<11)\n\n#define IEEE80211_CCK_RATES_MASK\t        0x0000000F\n#define IEEE80211_CCK_BASIC_RATES_MASK\t(IEEE80211_CCK_RATE_1MB_MASK | \\\n\tIEEE80211_CCK_RATE_2MB_MASK)\n#define IEEE80211_CCK_DEFAULT_RATES_MASK\t(IEEE80211_CCK_BASIC_RATES_MASK | \\\n        IEEE80211_CCK_RATE_5MB_MASK | \\\n        IEEE80211_CCK_RATE_11MB_MASK)\n\n#define IEEE80211_OFDM_RATES_MASK\t\t0x00000FF0\n#define IEEE80211_OFDM_BASIC_RATES_MASK\t(IEEE80211_OFDM_RATE_6MB_MASK | \\\n\tIEEE80211_OFDM_RATE_12MB_MASK | \\\n\tIEEE80211_OFDM_RATE_24MB_MASK)\n#define IEEE80211_OFDM_DEFAULT_RATES_MASK\t(IEEE80211_OFDM_BASIC_RATES_MASK | \\\n\tIEEE80211_OFDM_RATE_9MB_MASK  | \\\n\tIEEE80211_OFDM_RATE_18MB_MASK | \\\n\tIEEE80211_OFDM_RATE_36MB_MASK | \\\n\tIEEE80211_OFDM_RATE_48MB_MASK | \\\n\tIEEE80211_OFDM_RATE_54MB_MASK)\n#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \\\n                                IEEE80211_CCK_DEFAULT_RATES_MASK)\n\n#define IEEE80211_NUM_OFDM_RATES\t    8\n#define IEEE80211_NUM_CCK_RATES\t            4\n#define IEEE80211_OFDM_SHIFT_MASK_A         4\n\n\nenum MGN_RATE{\n\tMGN_1M\t\t= 0x02,\n\tMGN_2M\t\t= 0x04,\n\tMGN_5_5M \t= 0x0B,\n\tMGN_6M\t \t= 0x0C,\n\tMGN_9M\t\t= 0x12,\n\tMGN_11M \t= 0x16,\n\tMGN_12M\t= 0x18,\n\tMGN_18M\t= 0x24,\n\tMGN_24M\t= 0x30,\n\tMGN_36M\t= 0x48,\n\tMGN_48M\t= 0x60,\n\tMGN_54M\t= 0x6C,\n\tMGN_MCS32\t= 0x7F,\n\tMGN_MCS0,\n\tMGN_MCS1,\n\tMGN_MCS2,\n\tMGN_MCS3,\n\tMGN_MCS4,\n\tMGN_MCS5,\n\tMGN_MCS6,\n\tMGN_MCS7,\n\tMGN_MCS8,\n\tMGN_MCS9,\n\tMGN_MCS10,\n\tMGN_MCS11,\n\tMGN_MCS12,\n\tMGN_MCS13,\n\tMGN_MCS14,\n\tMGN_MCS15,\n\tMGN_MCS16,\n\tMGN_MCS17,\n\tMGN_MCS18,\n\tMGN_MCS19,\n\tMGN_MCS20,\n\tMGN_MCS21,\n\tMGN_MCS22,\n\tMGN_MCS23,\n\tMGN_MCS24,\n\tMGN_MCS25,\n\tMGN_MCS26,\n\tMGN_MCS27,\n\tMGN_MCS28,\n\tMGN_MCS29,\n\tMGN_MCS30,\n\tMGN_MCS31,\n\tMGN_VHT1SS_MCS0,\n\tMGN_VHT1SS_MCS1,\n\tMGN_VHT1SS_MCS2,\n\tMGN_VHT1SS_MCS3,\n\tMGN_VHT1SS_MCS4,\n\tMGN_VHT1SS_MCS5,\n\tMGN_VHT1SS_MCS6,\n\tMGN_VHT1SS_MCS7,\n\tMGN_VHT1SS_MCS8,\n\tMGN_VHT1SS_MCS9,\n\tMGN_VHT2SS_MCS0,\n\tMGN_VHT2SS_MCS1,\n\tMGN_VHT2SS_MCS2,\n\tMGN_VHT2SS_MCS3,\n\tMGN_VHT2SS_MCS4,\n\tMGN_VHT2SS_MCS5,\n\tMGN_VHT2SS_MCS6,\n\tMGN_VHT2SS_MCS7,\n\tMGN_VHT2SS_MCS8,\n\tMGN_VHT2SS_MCS9,\n\tMGN_VHT3SS_MCS0,\n\tMGN_VHT3SS_MCS1,\n\tMGN_VHT3SS_MCS2,\n\tMGN_VHT3SS_MCS3,\n\tMGN_VHT3SS_MCS4,\n\tMGN_VHT3SS_MCS5,\n\tMGN_VHT3SS_MCS6,\n\tMGN_VHT3SS_MCS7,\n\tMGN_VHT3SS_MCS8,\n\tMGN_VHT3SS_MCS9,\n\tMGN_VHT4SS_MCS0,\n\tMGN_VHT4SS_MCS1,\n\tMGN_VHT4SS_MCS2,\n\tMGN_VHT4SS_MCS3,\n\tMGN_VHT4SS_MCS4,\n\tMGN_VHT4SS_MCS5,\n\tMGN_VHT4SS_MCS6,\n\tMGN_VHT4SS_MCS7,\n\tMGN_VHT4SS_MCS8,\n\tMGN_VHT4SS_MCS9,\n\tMGN_UNKNOWN\n};\n\n#define IS_HT_RATE(_rate)\t((_rate) >= MGN_MCS0 && (_rate) <= MGN_MCS31)\n#define IS_VHT_RATE(_rate)\t((_rate) >= MGN_VHT1SS_MCS0 && (_rate) <= MGN_VHT4SS_MCS9)\n#define IS_CCK_RATE(_rate)\t((_rate) == MGN_1M || (_rate) == MGN_2M || (_rate) == MGN_5_5M || (_rate) == MGN_11M)\n#define IS_OFDM_RATE(_rate)\t((_rate) >= MGN_6M && (_rate) <= MGN_54M  && (_rate) != MGN_11M)\n\n#define IS_HT1SS_RATE(_rate) ((_rate) >= MGN_MCS0 && (_rate) <= MGN_MCS7)\n#define IS_HT2SS_RATE(_rate) ((_rate) >= MGN_MCS8 && (_rate) <= MGN_MCS15)\n#define IS_HT3SS_RATE(_rate) ((_rate) >= MGN_MCS16 && (_rate) <= MGN_MCS23)\n#define IS_HT4SS_RATE(_rate) ((_rate) >= MGN_MCS24 && (_rate) <= MGN_MCS31)\n\n#define IS_VHT1SS_RATE(_rate) ((_rate) >= MGN_VHT1SS_MCS0 && (_rate) <= MGN_VHT1SS_MCS9)\n#define IS_VHT2SS_RATE(_rate) ((_rate) >= MGN_VHT2SS_MCS0 && (_rate) <= MGN_VHT2SS_MCS9)\n#define IS_VHT3SS_RATE(_rate) ((_rate) >= MGN_VHT3SS_MCS0 && (_rate) <= MGN_VHT3SS_MCS9)\n#define IS_VHT4SS_RATE(_rate) ((_rate) >= MGN_VHT4SS_MCS0 && (_rate) <= MGN_VHT4SS_MCS9)\n\n#define IS_1T_RATE(_rate)\t(IS_CCK_RATE((_rate)) || IS_OFDM_RATE((_rate)) || IS_HT1SS_RATE((_rate)) || IS_VHT1SS_RATE((_rate)))\n#define IS_2T_RATE(_rate)\t(IS_HT2SS_RATE((_rate)) || IS_VHT2SS_RATE((_rate)))\n#define IS_3T_RATE(_rate)\t(IS_HT3SS_RATE((_rate)) || IS_VHT3SS_RATE((_rate)))\n#define IS_4T_RATE(_rate)\t(IS_HT4SS_RATE((_rate)) || IS_VHT4SS_RATE((_rate)))\n\ntypedef enum _RATE_SECTION {\n\tCCK = 0,\n\tOFDM = 1,\n\tHT_MCS0_MCS7 = 2,\n\tHT_MCS8_MCS15 = 3,\n\tHT_MCS16_MCS23 = 4,\n\tHT_MCS24_MCS31 = 5,\n\tHT_1SS = HT_MCS0_MCS7,\n\tHT_2SS = HT_MCS8_MCS15,\n\tHT_3SS = HT_MCS16_MCS23,\n\tHT_4SS = HT_MCS24_MCS31,\n\tVHT_1SSMCS0_1SSMCS9 = 6,\n\tVHT_2SSMCS0_2SSMCS9 = 7,\n\tVHT_3SSMCS0_3SSMCS9 = 8,\n\tVHT_4SSMCS0_4SSMCS9 = 9,\n\tVHT_1SS = VHT_1SSMCS0_1SSMCS9,\n\tVHT_2SS = VHT_2SSMCS0_2SSMCS9,\n\tVHT_3SS = VHT_3SSMCS0_3SSMCS9,\n\tVHT_4SS = VHT_4SSMCS0_4SSMCS9,\n\tRATE_SECTION_NUM,\n} RATE_SECTION;\n\nconst char *rate_section_str(u8 section);\n\n#define IS_CCK_RATE_SECTION(section) ((section) == CCK)\n#define IS_OFDM_RATE_SECTION(section) ((section) == OFDM)\n#define IS_HT_RATE_SECTION(section) ((section) >= HT_1SS && (section) <= HT_4SS)\n#define IS_VHT_RATE_SECTION(section) ((section) >= VHT_1SS && (section) <= VHT_4SS)\n\n#define IS_1T_RATE_SECTION(section) ((section) == CCK || (section) == OFDM || (section) == HT_1SS || (section) == VHT_1SS)\n#define IS_2T_RATE_SECTION(section) ((section) == HT_2SS || (section) == VHT_2SS)\n#define IS_3T_RATE_SECTION(section) ((section) == HT_3SS || (section) == VHT_3SS)\n#define IS_4T_RATE_SECTION(section) ((section) == HT_4SS || (section) == VHT_4SS)\n\nextern u8 mgn_rates_cck[];\nextern u8 mgn_rates_ofdm[];\nextern u8 mgn_rates_mcs0_7[];\nextern u8 mgn_rates_mcs8_15[];\nextern u8 mgn_rates_mcs16_23[];\nextern u8 mgn_rates_mcs24_31[];\nextern u8 mgn_rates_vht1ss[];\nextern u8 mgn_rates_vht2ss[];\nextern u8 mgn_rates_vht3ss[];\nextern u8 mgn_rates_vht4ss[];\n\nstruct rate_section_ent {\n\tu8 tx_num; /* value of RF_TX_NUM */\n\tu8 rate_num;\n\tu8 *rates;\n};\n\nextern struct rate_section_ent rates_by_sections[];\n\n#define rate_section_to_tx_num(section) (rates_by_sections[(section)].tx_num)\n#define rate_section_rate_num(section) (rates_by_sections[(section)].rate_num)\n\n/* NOTE: This data is for statistical purposes; not all hardware provides this\n *       information for frames received.  Not setting these will not cause\n *       any adverse affects. */\nstruct ieee80211_rx_stats {\n\t//u32 mac_time[2];\n\ts8 rssi;\n\tu8 signal;\n\tu8 noise;\n\tu8 received_channel;\n\tu16 rate; /* in 100 kbps */\n\t//u8 control;\n\tu8 mask;\n\tu8 freq;\n\tu16 len;\n};\n\n/* IEEE 802.11 requires that STA supports concurrent reception of at least\n * three fragmented frames. This define can be increased to support more\n * concurrent frames, but it should be noted that each entry can consume about\n * 2 kB of RAM and increasing cache size will slow down frame reassembly. */\n#define IEEE80211_FRAG_CACHE_LEN 4\n\nstruct ieee80211_frag_entry {\n\tu32 first_frag_time;\n\tuint seq;\n\tuint last_frag;\n\tuint qos;   //jackson\n\tuint tid;\t//jackson\n\tstruct sk_buff *skb;\n\tu8 src_addr[ETH_ALEN];\n\tu8 dst_addr[ETH_ALEN];\n};\n\n#ifndef PLATFORM_FREEBSD //Baron BSD has already defined\nstruct ieee80211_stats {\n\tuint tx_unicast_frames;\n\tuint tx_multicast_frames;\n\tuint tx_fragments;\n\tuint tx_unicast_octets;\n\tuint tx_multicast_octets;\n\tuint tx_deferred_transmissions;\n\tuint tx_single_retry_frames;\n\tuint tx_multiple_retry_frames;\n\tuint tx_retry_limit_exceeded;\n\tuint tx_discards;\n\tuint rx_unicast_frames;\n\tuint rx_multicast_frames;\n\tuint rx_fragments;\n\tuint rx_unicast_octets;\n\tuint rx_multicast_octets;\n\tuint rx_fcs_errors;\n\tuint rx_discards_no_buffer;\n\tuint tx_discards_wrong_sa;\n\tuint rx_discards_undecryptable;\n\tuint rx_message_in_msg_fragments;\n\tuint rx_message_in_bad_msg_fragments;\n};\n#endif //PLATFORM_FREEBSD\nstruct ieee80211_softmac_stats{\n\tuint rx_ass_ok;\n\tuint rx_ass_err;\n\tuint rx_probe_rq;\n\tuint tx_probe_rs;\n\tuint tx_beacons;\n\tuint rx_auth_rq;\n\tuint rx_auth_rs_ok;\n\tuint rx_auth_rs_err;\n\tuint tx_auth_rq;\n\tuint no_auth_rs;\n\tuint no_ass_rs;\n\tuint tx_ass_rq;\n\tuint rx_ass_rq;\n\tuint tx_probe_rq;\n\tuint reassoc;\n\tuint swtxstop;\n\tuint swtxawake;\n};\n\n#define SEC_KEY_1         (1<<0)\n#define SEC_KEY_2         (1<<1)\n#define SEC_KEY_3         (1<<2)\n#define SEC_KEY_4         (1<<3)\n#define SEC_ACTIVE_KEY    (1<<4)\n#define SEC_AUTH_MODE     (1<<5)\n#define SEC_UNICAST_GROUP (1<<6)\n#define SEC_LEVEL         (1<<7)\n#define SEC_ENABLED       (1<<8)\n\n#define SEC_LEVEL_0      0 /* None */\n#define SEC_LEVEL_1      1 /* WEP 40 and 104 bit */\n#define SEC_LEVEL_2      2 /* Level 1 + TKIP */\n#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */\n#define SEC_LEVEL_3      4 /* Level 2 + CCMP */\n\n#define WEP_KEYS 4\n#define WEP_KEY_LEN 13\n\n#ifdef CONFIG_IEEE80211W\n#define BIP_MAX_KEYID 5\n#define BIP_AAD_SIZE  20\n#endif //CONFIG_IEEE80211W\n\n#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)\n\nstruct ieee80211_security {\n\tu16 active_key:2,\n            enabled:1,\n\t    auth_mode:2,\n            auth_algo:4,\n            unicast_uses_group:1;\n\tu8 key_sizes[WEP_KEYS];\n\tu8 keys[WEP_KEYS][WEP_KEY_LEN];\n\tu8 level;\n\tu16 flags;\n} __attribute__ ((packed));\n\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\nstruct ieee80211_security {\n\tu16 active_key:2,\n            enabled:1,\n\t    auth_mode:2,\n            auth_algo:4,\n            unicast_uses_group:1;\n\tu8 key_sizes[WEP_KEYS];\n\tu8 keys[WEP_KEYS][WEP_KEY_LEN];\n\tu8 level;\n\tu16 flags;\n} ;\n#pragma pack()\n\n#endif\n\n/*\n\n 802.11 data frame from AP\n\n      ,-------------------------------------------------------------------.\nBytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |\n      |------|------|---------|---------|---------|------|---------|------|\nDesc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  frame  |  fcs |\n      |      | tion | (BSSID) |         |         | ence |  data   |      |\n      `-------------------------------------------------------------------'\n\nTotal: 28-2340 bytes\n\n*/\n\nstruct ieee80211_header_data {\n\tu16 frame_ctl;\n\tu16 duration_id;\n\tu8 addr1[6];\n\tu8 addr2[6];\n\tu8 addr3[6];\n\tu16 seq_ctrl;\n};\n\n#define BEACON_PROBE_SSID_ID_POSITION 12\n\n/* Management Frame Information Element Types */\n#define MFIE_TYPE_SSID       0\n#define MFIE_TYPE_RATES      1\n#define MFIE_TYPE_FH_SET     2\n#define MFIE_TYPE_DS_SET     3\n#define MFIE_TYPE_CF_SET     4\n#define MFIE_TYPE_TIM        5\n#define MFIE_TYPE_IBSS_SET   6\n#define MFIE_TYPE_CHALLENGE  16\n#define MFIE_TYPE_ERP        42\n#define MFIE_TYPE_RSN\t     48\n#define MFIE_TYPE_RATES_EX   50\n#define MFIE_TYPE_GENERIC    221\n\n#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)\n\nstruct ieee80211_info_element_hdr {\n\tu8 id;\n\tu8 len;\n} __attribute__ ((packed));\n\nstruct ieee80211_info_element {\n\tu8 id;\n\tu8 len;\n\tu8 data[0];\n} __attribute__ ((packed));\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\nstruct ieee80211_info_element_hdr {\n\tu8 id;\n\tu8 len;\n} ;\n\nstruct ieee80211_info_element {\n\tu8 id;\n\tu8 len;\n\tu8 data[0];\n} ;\n#pragma pack()\n\n#endif\n\n\n/*\n * These are the data types that can make up management packets\n *\n\tu16 auth_algorithm;\n\tu16 auth_sequence;\n\tu16 beacon_interval;\n\tu16 capability;\n\tu8 current_ap[ETH_ALEN];\n\tu16 listen_interval;\n\tstruct {\n\t\tu16 association_id:14, reserved:2;\n\t} __attribute__ ((packed));\n\tu32 time_stamp[2];\n\tu16 reason;\n\tu16 status;\n*/\n\n#define IEEE80211_DEFAULT_TX_ESSID \"Penguin\"\n#define IEEE80211_DEFAULT_BASIC_RATE 10\n\n\n#if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8711FW)\n\n\nstruct ieee80211_authentication {\n\tstruct ieee80211_header_data header;\n\tu16 algorithm;\n\tu16 transaction;\n\tu16 status;\n\t//struct ieee80211_info_element_hdr info_element;\n} __attribute__ ((packed));\n\n\nstruct ieee80211_probe_response {\n\tstruct ieee80211_header_data header;\n\tu32 time_stamp[2];\n\tu16 beacon_interval;\n\tu16 capability;\n\tstruct ieee80211_info_element info_element;\n} __attribute__ ((packed));\n\nstruct ieee80211_probe_request {\n\tstruct ieee80211_header_data header;\n\t/*struct ieee80211_info_element info_element;*/\n} __attribute__ ((packed));\n\nstruct ieee80211_assoc_request_frame {\n\tstruct rtw_ieee80211_hdr_3addr header;\n\tu16 capability;\n\tu16 listen_interval;\n\t//u8 current_ap[ETH_ALEN];\n\tstruct ieee80211_info_element_hdr info_element;\n} __attribute__ ((packed));\n\nstruct ieee80211_assoc_response_frame {\n\tstruct rtw_ieee80211_hdr_3addr header;\n\tu16 capability;\n\tu16 status;\n\tu16 aid;\n//\tstruct ieee80211_info_element info_element; /* supported rates */\n} __attribute__ ((packed));\n#endif\n\n\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\n\nstruct ieee80211_authentication {\n\tstruct ieee80211_header_data header;\n\tu16 algorithm;\n\tu16 transaction;\n\tu16 status;\n\t//struct ieee80211_info_element_hdr info_element;\n} ;\n\n\nstruct ieee80211_probe_response {\n\tstruct ieee80211_header_data header;\n\tu32 time_stamp[2];\n\tu16 beacon_interval;\n\tu16 capability;\n\tstruct ieee80211_info_element info_element;\n} ;\n\nstruct ieee80211_probe_request {\n\tstruct ieee80211_header_data header;\n\t/*struct ieee80211_info_element info_element;*/\n} ;\n\nstruct ieee80211_assoc_request_frame {\n\tstruct rtw_ieee80211_hdr_3addr header;\n\tu16 capability;\n\tu16 listen_interval;\n\t//u8 current_ap[ETH_ALEN];\n\tstruct ieee80211_info_element_hdr info_element;\n} ;\n\nstruct ieee80211_assoc_response_frame {\n\tstruct rtw_ieee80211_hdr_3addr header;\n\tu16 capability;\n\tu16 status;\n\tu16 aid;\n//\tstruct ieee80211_info_element info_element; /* supported rates */\n};\n\n#pragma pack()\n\n#endif\n\n\n\n\nstruct ieee80211_txb {\n\tu8 nr_frags;\n\tu8 encrypted;\n\tu16 reserved;\n\tu16 frag_size;\n\tu16 payload_size;\n\tstruct sk_buff *fragments[0];\n};\n\n\n/* SWEEP TABLE ENTRIES NUMBER*/\n#define MAX_SWEEP_TAB_ENTRIES\t\t  42\n#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET  7\n/* MAX_RATES_LENGTH needs to be 12.  The spec says 8, and many APs\n * only use 8, and then use extended rates for the remaining supported\n * rates.  Other APs, however, stick all of their supported rates on the\n * main rates information element... */\n#define MAX_RATES_LENGTH                  ((u8)12)\n#define MAX_RATES_EX_LENGTH               ((u8)16)\n#define MAX_NETWORK_COUNT                  128\n#define MAX_CHANNEL_NUMBER                 161\n#define IEEE80211_SOFTMAC_SCAN_TIME\t  400\n//(HZ / 2)\n#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)\n\n#define CRC_LENGTH                 4U\n\n#define MAX_WPA_IE_LEN (256)\n#define MAX_WPS_IE_LEN (512)\n#define MAX_P2P_IE_LEN (256)\n#define MAX_WFD_IE_LEN (128)\n\n#define NETWORK_EMPTY_ESSID (1<<0)\n#define NETWORK_HAS_OFDM    (1<<1)\n#define NETWORK_HAS_CCK     (1<<2)\n\n#define IEEE80211_DTIM_MBCAST 4\n#define IEEE80211_DTIM_UCAST 2\n#define IEEE80211_DTIM_VALID 1\n#define IEEE80211_DTIM_INVALID 0\n\n#define IEEE80211_PS_DISABLED 0\n#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST\n#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST\n#define IW_ESSID_MAX_SIZE 32\n#if 0\nstruct ieee80211_network {\n\t/* These entries are used to identify a unique network */\n\tu8 bssid[ETH_ALEN];\n\tu8 channel;\n\t/* Ensure null-terminated for any debug msgs */\n\tu8 ssid[IW_ESSID_MAX_SIZE + 1];\n\tu8 ssid_len;\n\tu8\trssi;\t//relative signal strength\n\tu8\tsq;\t\t//signal quality\n\n\t/* These are network statistics */\n\t//struct ieee80211_rx_stats stats;\n\tu16 capability;\n\tu16\taid;\n\tu8 rates[MAX_RATES_LENGTH];\n\tu8 rates_len;\n\tu8 rates_ex[MAX_RATES_EX_LENGTH];\n\tu8 rates_ex_len;\n\t\n\tu8 edca_parmsets[18];\n\t\t\n\tu8 mode;\n\tu8 flags;\n\tu8 time_stamp[8];\n\tu16 beacon_interval;\n\tu16 listen_interval;\n\tu16 atim_window;\n\tu8 wpa_ie[MAX_WPA_IE_LEN];\n\tsize_t wpa_ie_len;\n\tu8 rsn_ie[MAX_WPA_IE_LEN];\n\tsize_t rsn_ie_len;\n\tu8 country[6];\n\tu8 dtim_period;\n\tu8 dtim_data;\n\tu8 power_constraint;\n\tu8 qosinfo;\n\tu8 qbssload[5];\n\tu8 network_type;\n\tint join_res;\n\tunsigned long\tlast_scanned;\t\n};\n#endif\n/*\njoin_res:\n-1: authentication fail\n-2: association fail\n> 0: TID\n*/\n\n#ifndef PLATFORM_FREEBSD //Baron BSD has already defined\n\nenum ieee80211_state {\n\n\t/* the card is not linked at all */\n\tIEEE80211_NOLINK = 0,\n\t\n\t/* IEEE80211_ASSOCIATING* are for BSS client mode\n\t * the driver shall not perform RX filtering unless\n\t * the state is LINKED.\n\t * The driver shall just check for the state LINKED and\n\t * defaults to NOLINK for ALL the other states (including\n\t * LINKED_SCANNING)\n\t */\n\t\n\t/* the association procedure will start (wq scheduling)*/\n\tIEEE80211_ASSOCIATING,\n\tIEEE80211_ASSOCIATING_RETRY,\n\t\n\t/* the association procedure is sending AUTH request*/\n\tIEEE80211_ASSOCIATING_AUTHENTICATING,\n\t\n\t/* the association procedure has successfully authentcated\n\t * and is sending association request\n\t */\n\tIEEE80211_ASSOCIATING_AUTHENTICATED,\n\t\n\t/* the link is ok. the card associated to a BSS or linked\n\t * to a ibss cell or acting as an AP and creating the bss\n\t */\n\tIEEE80211_LINKED,\n\t\n\t/* same as LINKED, but the driver shall apply RX filter\n\t * rules as we are in NO_LINK mode. As the card is still\n\t * logically linked, but it is doing a syncro site survey\n\t * then it will be back to LINKED state.\n\t */\n\tIEEE80211_LINKED_SCANNING,\n\t\n};\n#endif //PLATFORM_FREEBSD\n\n#define DEFAULT_MAX_SCAN_AGE (15 * HZ)\n#define DEFAULT_FTS 2346\n#define MAC_FMT \"%02x:%02x:%02x:%02x:%02x:%02x\"\n#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]\n#define IP_FMT \"%d.%d.%d.%d\"\n#define IP_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3]\n\n#ifdef PLATFORM_FREEBSD //Baron change func to macro\n#define is_multicast_mac_addr(Addr) ((((Addr[0]) & 0x01) == 0x01) && ((Addr[0]) != 0xff))\n#define is_broadcast_mac_addr(Addr) ((((Addr[0]) & 0xff) == 0xff) && (((Addr[1]) & 0xff) == 0xff) && \\\n(((Addr[2]) & 0xff) == 0xff) && (((Addr[3]) & 0xff) == 0xff) && (((Addr[4]) & 0xff) == 0xff) && \\\n(((Addr[5]) & 0xff) == 0xff))\n#else\nextern __inline int is_multicast_mac_addr(const u8 *addr)\n{\n        return ((addr[0] != 0xff) && (0x01 & addr[0]));\n}\n\nextern __inline int is_broadcast_mac_addr(const u8 *addr)\n{\n\treturn ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) &&   \\\n\t\t(addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));\n}\n\nextern __inline int is_zero_mac_addr(const u8 *addr)\n{\n\treturn ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) &&   \\\n\t\t(addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));\n}\n#endif //PLATFORM_FREEBSD\n\n#define CFG_IEEE80211_RESERVE_FCS (1<<0)\n#define CFG_IEEE80211_COMPUTE_FCS (1<<1)\n\ntypedef struct tx_pending_t{\n\tint frag;\n\tstruct ieee80211_txb *txb;\n}tx_pending_t;\n\n\n\n#define TID_NUM\t16\n\n#define IEEE_A            (1<<0)\n#define IEEE_B            (1<<1)\n#define IEEE_G            (1<<2)\n#define IEEE_MODE_MASK    (IEEE_A|IEEE_B|IEEE_G)\n\n//Baron move to ieee80211.c\nint ieee80211_is_empty_essid(const char *essid, int essid_len);\nint ieee80211_get_hdrlen(u16 fc);\n\n#if 0\n/* Action frame categories (IEEE 802.11-2007, 7.3.1.11, Table 7-24) */\n#define WLAN_ACTION_SPECTRUM_MGMT 0\n#define WLAN_ACTION_QOS 1\n#define WLAN_ACTION_DLS 2\n#define WLAN_ACTION_BLOCK_ACK 3\n#define WLAN_ACTION_RADIO_MEASUREMENT 5\n#define WLAN_ACTION_FT 6\n#define WLAN_ACTION_SA_QUERY 8\n#define WLAN_ACTION_WMM 17\n#endif\n\n\n/* Action category code */\nenum rtw_ieee80211_category {\n\tRTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0,\n\tRTW_WLAN_CATEGORY_QOS = 1,\n\tRTW_WLAN_CATEGORY_DLS = 2,\n\tRTW_WLAN_CATEGORY_BACK = 3,\n\tRTW_WLAN_CATEGORY_PUBLIC = 4, //IEEE 802.11 public action frames\n\tRTW_WLAN_CATEGORY_RADIO_MEASUREMENT  = 5,\n\tRTW_WLAN_CATEGORY_FT = 6,\n\tRTW_WLAN_CATEGORY_HT = 7,\n\tRTW_WLAN_CATEGORY_SA_QUERY = 8,\n\tRTW_WLAN_CATEGORY_UNPROTECTED_WNM = 11, // add for CONFIG_IEEE80211W, none 11w also can use\n\tRTW_WLAN_CATEGORY_TDLS = 12,\n\tRTW_WLAN_CATEGORY_SELF_PROTECTED = 15, // add for CONFIG_IEEE80211W, none 11w also can use\n\tRTW_WLAN_CATEGORY_WMM = 17,\n\tRTW_WLAN_CATEGORY_VHT = 21,\n\tRTW_WLAN_CATEGORY_P2P = 0x7f,//P2P action frames\n};\n\n/* SPECTRUM_MGMT action code */\nenum rtw_ieee80211_spectrum_mgmt_actioncode {\n\tRTW_WLAN_ACTION_SPCT_MSR_REQ = 0,\n\tRTW_WLAN_ACTION_SPCT_MSR_RPRT = 1,\n\tRTW_WLAN_ACTION_SPCT_TPC_REQ = 2,\n\tRTW_WLAN_ACTION_SPCT_TPC_RPRT = 3,\n\tRTW_WLAN_ACTION_SPCT_CHL_SWITCH = 4,\n\tRTW_WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,\n};\n\nenum _PUBLIC_ACTION{\n\tACT_PUBLIC_BSSCOEXIST = 0, // 20/40 BSS Coexistence\n\tACT_PUBLIC_DSE_ENABLE = 1,\n\tACT_PUBLIC_DSE_DEENABLE = 2,\n\tACT_PUBLIC_DSE_REG_LOCATION = 3,\n\tACT_PUBLIC_EXT_CHL_SWITCH = 4,\n\tACT_PUBLIC_DSE_MSR_REQ = 5,\n\tACT_PUBLIC_DSE_MSR_RPRT = 6,\n\tACT_PUBLIC_MP = 7, // Measurement Pilot\n\tACT_PUBLIC_DSE_PWR_CONSTRAINT = 8,\n\tACT_PUBLIC_VENDOR = 9, // for WIFI_DIRECT\n\tACT_PUBLIC_GAS_INITIAL_REQ = 10,\n\tACT_PUBLIC_GAS_INITIAL_RSP = 11,\n\tACT_PUBLIC_GAS_COMEBACK_REQ = 12,\n\tACT_PUBLIC_GAS_COMEBACK_RSP = 13,\n\tACT_PUBLIC_TDLS_DISCOVERY_RSP = 14,\n\tACT_PUBLIC_LOCATION_TRACK = 15,\n\tACT_PUBLIC_MAX\n};\n\n#ifdef CONFIG_TDLS\nenum TDLS_ACTION_FIELD{\n\tTDLS_SETUP_REQUEST = 0,\n\tTDLS_SETUP_RESPONSE = 1,\n\tTDLS_SETUP_CONFIRM = 2,\n\tTDLS_TEARDOWN = 3,\n\tTDLS_PEER_TRAFFIC_INDICATION = 4,\n\tTDLS_CHANNEL_SWITCH_REQUEST = 5,\n\tTDLS_CHANNEL_SWITCH_RESPONSE = 6,\n\tTDLS_PEER_PSM_REQUEST = 7,\n\tTDLS_PEER_PSM_RESPONSE = 8,\n\tTDLS_PEER_TRAFFIC_RESPONSE = 9,\n\tTDLS_DISCOVERY_REQUEST = 10,\n\tTDLS_DISCOVERY_RESPONSE = 14,\t//it's used in public action frame\n};\n\n#define\tTUNNELED_PROBE_REQ\t15\n#define\tTUNNELED_PROBE_RSP\t16\n#endif //CONFIG_TDLS\n\n/* BACK action code */\nenum rtw_ieee80211_back_actioncode {\n\tRTW_WLAN_ACTION_ADDBA_REQ = 0,\n\tRTW_WLAN_ACTION_ADDBA_RESP = 1,\n\tRTW_WLAN_ACTION_DELBA = 2,\n};\n\n/* HT features action code */\nenum rtw_ieee80211_ht_actioncode {\n\tRTW_WLAN_ACTION_HT_NOTI_CHNL_WIDTH = 0,\n       RTW_WLAN_ACTION_HT_SM_PS = 1,\n       RTW_WLAN_ACTION_HT_PSMP = 2,\n       RTW_WLAN_ACTION_HT_SET_PCO_PHASE = 3,\n       RTW_WLAN_ACTION_HT_CSI = 4,\n       RTW_WLAN_ACTION_HT_NON_COMPRESS_BEAMFORMING = 5,\n       RTW_WLAN_ACTION_HT_COMPRESS_BEAMFORMING = 6,\n       RTW_WLAN_ACTION_HT_ASEL_FEEDBACK = 7,\n};\n\n/* BACK (block-ack) parties */\nenum rtw_ieee80211_back_parties {\n\tRTW_WLAN_BACK_RECIPIENT = 0,\n\tRTW_WLAN_BACK_INITIATOR = 1,\n\tRTW_WLAN_BACK_TIMER = 2,\n};\n\n/*20/40 BSS Coexistence element */\n#define RTW_WLAN_20_40_BSS_COEX_INFO_REQ            BIT(0)\n#define RTW_WLAN_20_40_BSS_COEX_40MHZ_INTOL         BIT(1)\n#define RTW_WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ     BIT(2)\n#define RTW_WLAN_20_40_BSS_COEX_OBSS_EXEMPT_REQ     BIT(3)\n#define RTW_WLAN_20_40_BSS_COEX_OBSS_EXEMPT_GRNT    BIT(4)\n\n/* VHT features action code */\nenum rtw_ieee80211_vht_actioncode{\n\tRTW_WLAN_ACTION_VHT_COMPRESSED_BEAMFORMING = 0,\n       RTW_WLAN_ACTION_VHT_GROUPID_MANAGEMENT = 1,\n       RTW_WLAN_ACTION_VHT_OPMODE_NOTIFICATION = 2,\n};\n\n\n#define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs)\n\t\t\t\t* 00:50:F2 */\n#ifndef PLATFORM_FREEBSD //Baron BSD has defined\n#define WME_OUI_TYPE 2\n#endif //PLATFORM_FREEBSD\n#define WME_OUI_SUBTYPE_INFORMATION_ELEMENT 0\n#define WME_OUI_SUBTYPE_PARAMETER_ELEMENT 1\n#define WME_OUI_SUBTYPE_TSPEC_ELEMENT 2\n#define WME_VERSION 1\n\n#define WME_ACTION_CODE_SETUP_REQUEST 0\n#define WME_ACTION_CODE_SETUP_RESPONSE 1\n#define WME_ACTION_CODE_TEARDOWN 2\n\n#define WME_SETUP_RESPONSE_STATUS_ADMISSION_ACCEPTED 0\n#define WME_SETUP_RESPONSE_STATUS_INVALID_PARAMETERS 1\n#define WME_SETUP_RESPONSE_STATUS_REFUSED 3\n\n#define WME_TSPEC_DIRECTION_UPLINK 0\n#define WME_TSPEC_DIRECTION_DOWNLINK 1\n#define WME_TSPEC_DIRECTION_BI_DIRECTIONAL 3\n\n\n#define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */\n\n#define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */\n\n/**\n * enum rtw_ieee80211_channel_flags - channel flags\n *\n * Channel flags set by the regulatory control code.\n *\n * @RTW_IEEE80211_CHAN_DISABLED: This channel is disabled.\n * @RTW_IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted\n *      on this channel.\n * @RTW_IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.\n * @RTW_IEEE80211_CHAN_RADAR: Radar detection is required on this channel.\n * @RTW_IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel\n *      is not permitted.\n * @RTW_IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel\n *      is not permitted.\n */\n  enum rtw_ieee80211_channel_flags {\n          RTW_IEEE80211_CHAN_DISABLED         = 1<<0,\n          RTW_IEEE80211_CHAN_PASSIVE_SCAN     = 1<<1,\n          RTW_IEEE80211_CHAN_NO_IBSS          = 1<<2,\n          RTW_IEEE80211_CHAN_RADAR            = 1<<3,\n          RTW_IEEE80211_CHAN_NO_HT40PLUS      = 1<<4,\n          RTW_IEEE80211_CHAN_NO_HT40MINUS     = 1<<5,\n  };\n  \n  #define RTW_IEEE80211_CHAN_NO_HT40 \\\n          (RTW_IEEE80211_CHAN_NO_HT40PLUS | RTW_IEEE80211_CHAN_NO_HT40MINUS)\n\n/* Represent channel details, subset of ieee80211_channel */\nstruct rtw_ieee80211_channel {\n\t//enum ieee80211_band band;\n\t//u16 center_freq;\n\tu16 hw_value;\n\tu32 flags;\n\t//int max_antenna_gain;\n\t//int max_power;\n\t//int max_reg_power;\n\t//bool beacon_found;\n\t//u32 orig_flags;\n\t//int orig_mag;\n\t//int orig_mpwr;\n}; \n\n#define CHAN_FMT \\\n\t/*\"band:%d, \"*/ \\\n\t/*\"center_freq:%u, \"*/ \\\n\t\"hw_value:%u, \" \\\n\t\"flags:0x%08x\" \\\n\t/*\"max_antenna_gain:%d\\n\"*/ \\\n\t/*\"max_power:%d\\n\"*/ \\\n\t/*\"max_reg_power:%d\\n\"*/ \\\n\t/*\"beacon_found:%u\\n\"*/ \\\n\t/*\"orig_flags:0x%08x\\n\"*/ \\\n\t/*\"orig_mag:%d\\n\"*/ \\\n\t/*\"orig_mpwr:%d\\n\"*/ \n\n#define CHAN_ARG(channel) \\\n\t/*(channel)->band*/ \\\n\t/*, (channel)->center_freq*/ \\\n\t(channel)->hw_value \\\n\t, (channel)->flags \\\n\t/*, (channel)->max_antenna_gain*/ \\\n\t/*, (channel)->max_power*/ \\\n\t/*, (channel)->max_reg_power*/ \\\n\t/*, (channel)->beacon_found*/ \\\n\t/*, (channel)->orig_flags*/ \\\n\t/*, (channel)->orig_mag*/ \\\n\t/*, (channel)->orig_mpwr*/ \\\n\n/* Parsed Information Elements */\nstruct rtw_ieee802_11_elems {\n\tu8 *ssid;\n\tu8 ssid_len;\n\tu8 *supp_rates;\n\tu8 supp_rates_len;\n\tu8 *fh_params;\n\tu8 fh_params_len;\n\tu8 *ds_params;\n\tu8 ds_params_len;\n\tu8 *cf_params;\n\tu8 cf_params_len;\n\tu8 *tim;\n\tu8 tim_len;\n\tu8 *ibss_params;\n\tu8 ibss_params_len;\n\tu8 *challenge;\n\tu8 challenge_len;\n\tu8 *erp_info;\n\tu8 erp_info_len;\n\tu8 *ext_supp_rates;\n\tu8 ext_supp_rates_len;\n\tu8 *wpa_ie;\n\tu8 wpa_ie_len;\n\tu8 *rsn_ie;\n\tu8 rsn_ie_len;\n\tu8 *wme;\n\tu8 wme_len;\n\tu8 *wme_tspec;\n\tu8 wme_tspec_len;\n\tu8 *wps_ie;\n\tu8 wps_ie_len;\n\tu8 *power_cap;\n\tu8 power_cap_len;\n\tu8 *supp_channels;\n\tu8 supp_channels_len;\n\tu8 *mdie;\n\tu8 mdie_len;\n\tu8 *ftie;\n\tu8 ftie_len;\n\tu8 *timeout_int;\n\tu8 timeout_int_len;\n\tu8 *ht_capabilities;\n\tu8 ht_capabilities_len;\n\tu8 *ht_operation;\n\tu8 ht_operation_len;\n\tu8 *vendor_ht_cap;\n\tu8 vendor_ht_cap_len;\n\tu8 *vht_capabilities;\n\tu8 vht_capabilities_len;\n\tu8 *vht_operation;\n\tu8 vht_operation_len;\n\tu8 *vht_op_mode_notify;\n\tu8 vht_op_mode_notify_len;\n};\n\ntypedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes;\n\nParseRes rtw_ieee802_11_parse_elems(u8 *start, uint len,\n\t\t\t\tstruct rtw_ieee802_11_elems *elems,\n\t\t\t\tint show_errors);\n\nu8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, unsigned int *frlen);\nu8 *rtw_set_ie(u8 *pbuf, sint index, uint len, u8 *source, uint *frlen);\n\nenum secondary_ch_offset {\n\tSCN = 0, /* no secondary channel */\n\tSCA = 1, /* secondary channel above */\n\tSCB = 3,  /* secondary channel below */\n};\nu8 secondary_ch_offset_to_hal_ch_offset(u8 ch_offset);\nu8 hal_ch_offset_to_secondary_ch_offset(u8 ch_offset);\nu8 *rtw_set_ie_ch_switch(u8 *buf, u32 *buf_len, u8 ch_switch_mode, u8 new_ch, u8 ch_switch_cnt);\nu8 *rtw_set_ie_secondary_ch_offset(u8 *buf, u32 *buf_len, u8 secondary_ch_offset);\nu8 *rtw_set_ie_mesh_ch_switch_parm(u8 *buf, u32 *buf_len, u8 ttl, u8 flags, u16 reason, u16 precedence);\n\nu8 *rtw_get_ie(u8*pbuf, sint index, sint *len, sint limit);\nu8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, uint *ielen);\nint rtw_ies_remove_ie(u8 *ies, uint *ies_len, uint offset, u8 eid, u8 *oui, u8 oui_len);\n\nvoid rtw_set_supported_rate(u8* SupportedRates, uint mode) ;\n\nunsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit);\nunsigned char *rtw_get_wpa2_ie(unsigned char *pie, int *rsn_ie_len, int limit);\nint rtw_get_wpa_cipher_suite(u8 *s);\nint rtw_get_wpa2_cipher_suite(u8 *s);\nint rtw_get_wapi_ie(u8 *in_ie,uint in_len,u8 *wapi_ie,u16 *wapi_len);\nint rtw_parse_wpa_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);\nint rtw_parse_wpa2_ie(u8* wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwise_cipher, int *is_8021x);\n\nint rtw_get_sec_ie(u8 *in_ie,uint in_len,u8 *rsn_ie,u16 *rsn_len,u8 *wpa_ie,u16 *wpa_len);\n\nu8 rtw_is_wps_ie(u8 *ie_ptr, uint *wps_ielen);\nu8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen, u8 frame_type);\nu8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen);\nu8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_attr, u32 *len_attr);\nu8 *rtw_get_wps_attr_content(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,u8 *buf_content, uint *len_content);\n\n/**\n * for_each_ie - iterate over continuous IEs\n * @ie:\n * @buf:\n * @buf_len:\n */\n#define for_each_ie(ie, buf, buf_len) \\\n\tfor (ie = (void*)buf; (((u8*)ie) - ((u8*)buf) + 1) < buf_len; ie = (void*)(((u8*)ie) + *(((u8*)ie)+1) + 2))\n\nvoid dump_ies(void *sel, u8 *buf, u32 buf_len);\n\t\n#ifdef CONFIG_80211N_HT\nvoid dump_ht_cap_ie_content(void *sel, u8 *buf, u32 buf_len);\n#endif\n\nvoid dump_wps_ie(void *sel, u8 *ie, u32 ie_len);\n\nvoid rtw_ies_get_chbw(u8 *ies, int ies_len, u8 *ch, u8 *bw, u8 *offset);\n\nvoid rtw_bss_get_chbw(WLAN_BSSID_EX *bss, u8 *ch, u8 *bw, u8 *offset);\n\nbool rtw_is_chbw_grouped(u8 ch_a, u8 bw_a, u8 offset_a\n\t, u8 ch_b, u8 bw_b, u8 offset_b);\nvoid rtw_sync_chbw(u8 *req_ch, u8 *req_bw, u8 *req_offset\n\t, u8 *g_ch, u8 *g_bw, u8 *g_offset);\n\n#ifdef CONFIG_P2P\nu32 rtw_get_p2p_merged_ies_len(u8 *in_ie, u32 in_len);\nint rtw_p2p_merge_ies(u8 *in_ie, u32 in_len, u8 *merge_ie);\nvoid dump_p2p_ie(void *sel, u8 *ie, u32 ie_len);\nu8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen);\nu8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type);\nu8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr);\nu8 *rtw_get_p2p_attr_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content);\nu32 rtw_set_p2p_attr_content(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr);\nvoid rtw_WLAN_BSSID_EX_remove_p2p_attr(WLAN_BSSID_EX *bss_ex, u8 attr_id);\n#endif\n\n#ifdef CONFIG_WFD\nvoid dump_wfd_ie(void *sel, u8 *ie, u32 ie_len);\nint rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen);\nint rtw_get_wfd_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen, u8 frame_type);\nint rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen);\n#endif // CONFIG_WFD\n\nuint\trtw_get_rateset_len(u8\t*rateset);\n\nstruct registry_priv;\nint rtw_generate_ie(struct registry_priv *pregistrypriv);\n\nint rtw_get_bit_value_from_ieee_value(u8 val);\n\nuint\trtw_is_cckrates_included(u8 *rate);\n\nuint\trtw_is_cckratesonly_included(u8 *rate);\n\nint rtw_check_network_type(unsigned char *rate, int ratelen, int channel);\n\nvoid rtw_get_bcn_info(struct wlan_network *pnetwork);\n\nu8 rtw_check_invalid_mac_address(u8 *mac_addr, u8 check_local_bit);\nvoid rtw_macaddr_cfg(u8 *out, const u8 *hw_mac_addr);\n\nu16 rtw_mcs_rate(u8 rf_type, u8 bw_40MHz, u8 short_GI, unsigned char * MCS_rate);\nu8\trtw_ht_mcsset_to_nss(u8 *supp_mcs_set);\n\nint rtw_action_frame_parse(const u8 *frame, u32 frame_len, u8* category, u8 *action);\nconst char *action_public_str(u8 action);\n\nu8 key_2char2num(u8 hch, u8 lch);\nu8 str_2char2num(u8 hch, u8 lch);\nvoid macstr2num(u8 *dst, u8 *src);\nu8 convert_ip_addr(u8 hch, u8 mch, u8 lch);\nint wifirate2_ratetbl_inx(unsigned char rate);\n\n#endif /* IEEE80211_H */\n\n"
  },
  {
    "path": "include/ieee80211_ext.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __IEEE80211_EXT_H\n#define __IEEE80211_EXT_H\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n\n#define WMM_OUI_TYPE 2\n#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0\n#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1\n#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2\n#define WMM_VERSION 1\n\n#define WPA_PROTO_WPA BIT(0)\n#define WPA_PROTO_RSN BIT(1)\n\n#define WPA_KEY_MGMT_IEEE8021X BIT(0)\n#define WPA_KEY_MGMT_PSK BIT(1)\n#define WPA_KEY_MGMT_NONE BIT(2)\n#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3)\n#define WPA_KEY_MGMT_WPA_NONE BIT(4)\n\n\n#define WPA_CAPABILITY_PREAUTH BIT(0)\n#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6)\n#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)\n\n\n#define PMKID_LEN 16\n\n\n#ifdef PLATFORM_LINUX\nstruct wpa_ie_hdr {\n\tu8 elem_id;\n\tu8 len;\n\tu8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */\n\tu8 version[2]; /* little endian */\n}__attribute__ ((packed));\n\nstruct rsn_ie_hdr {\n\tu8 elem_id; /* WLAN_EID_RSN */\n\tu8 len;\n\tu8 version[2]; /* little endian */\n}__attribute__ ((packed));\n\nstruct wme_ac_parameter {\n#if defined(CONFIG_LITTLE_ENDIAN)\n\t/* byte 1 */\n\tu8 \taifsn:4,\n\t\tacm:1,\n\t \taci:2,\n\t \treserved:1;\n\n\t/* byte 2 */\n\tu8 \teCWmin:4,\n\t \teCWmax:4;\n#elif defined(CONFIG_BIG_ENDIAN)\n\t/* byte 1 */\n\tu8 \treserved:1,\n\t \taci:2,\n\t \tacm:1,\n\t \taifsn:4;\n\n\t/* byte 2 */\n\tu8 \teCWmax:4,\n\t \teCWmin:4;\n#else\n#error\t\"Please fix <endian.h>\"\n#endif\n\n\t/* bytes 3 & 4 */\n\tu16 txopLimit;\n} __attribute__ ((packed));\n\nstruct wme_parameter_element {\n\t/* required fields for WME version 1 */\n\tu8 oui[3];\n\tu8 oui_type;\n\tu8 oui_subtype;\n\tu8 version;\n\tu8 acInfo;\n\tu8 reserved;\n\tstruct wme_ac_parameter ac[4];\n\n} __attribute__ ((packed));\n\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\n\nstruct wpa_ie_hdr {\n\tu8 elem_id;\n\tu8 len;\n\tu8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */\n\tu8 version[2]; /* little endian */\n};\n\nstruct rsn_ie_hdr {\n\tu8 elem_id; /* WLAN_EID_RSN */\n\tu8 len;\n\tu8 version[2]; /* little endian */\n};\n\n#pragma pack()\n\n#endif\n\n#define WPA_PUT_LE16(a, val)\t\t\t\\\n\tdo {\t\t\t\t\t\\\n\t\t(a)[1] = ((u16) (val)) >> 8;\t\\\n\t\t(a)[0] = ((u16) (val)) & 0xff;\t\\\n\t} while (0)\n\n#define WPA_PUT_BE32(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[3] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define WPA_PUT_LE32(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);\t\\\n\t\t(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[0] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val))\n//#define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val))\n\n\n\n/* Action category code */\nenum ieee80211_category {\n\tWLAN_CATEGORY_SPECTRUM_MGMT = 0,\n\tWLAN_CATEGORY_QOS = 1,\n\tWLAN_CATEGORY_DLS = 2,\n\tWLAN_CATEGORY_BACK = 3,\n\tWLAN_CATEGORY_HT = 7,\n\tWLAN_CATEGORY_WMM = 17,\n};\n\n/* SPECTRUM_MGMT action code */\nenum ieee80211_spectrum_mgmt_actioncode {\n\tWLAN_ACTION_SPCT_MSR_REQ = 0,\n\tWLAN_ACTION_SPCT_MSR_RPRT = 1,\n\tWLAN_ACTION_SPCT_TPC_REQ = 2,\n\tWLAN_ACTION_SPCT_TPC_RPRT = 3,\n\tWLAN_ACTION_SPCT_CHL_SWITCH = 4,\n\tWLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,\n};\n\n/* BACK action code */\nenum ieee80211_back_actioncode {\n\tWLAN_ACTION_ADDBA_REQ = 0,\n\tWLAN_ACTION_ADDBA_RESP = 1,\n\tWLAN_ACTION_DELBA = 2,\n};\n\n/* HT features action code */\nenum ieee80211_ht_actioncode {\n\tWLAN_ACTION_NOTIFY_CH_WIDTH = 0,\n       WLAN_ACTION_SM_PS = 1,\n       WLAN_ACTION_PSPM = 2,\n       WLAN_ACTION_PCO_PHASE = 3,\n       WLAN_ACTION_MIMO_CSI_MX = 4,\n       WLAN_ACTION_MIMO_NONCP_BF = 5,\n       WLAN_ACTION_MIMP_CP_BF = 6,\n       WLAN_ACTION_ASEL_INDICATES_FB = 7,\n       WLAN_ACTION_HI_INFO_EXCHG = 8,\n};\n\n/* BACK (block-ack) parties */\nenum ieee80211_back_parties {\n\tWLAN_BACK_RECIPIENT = 0,\n\tWLAN_BACK_INITIATOR = 1,\n\tWLAN_BACK_TIMER = 2,\n};\n\n#ifdef PLATFORM_LINUX\n\nstruct ieee80211_mgmt {\n\tu16 frame_control;\n\tu16 duration;\n\tu8 da[6];\n\tu8 sa[6];\n\tu8 bssid[6];\n\tu16 seq_ctrl;\n\tunion {\n\t\tstruct {\n\t\t\tu16 auth_alg;\n\t\t\tu16 auth_transaction;\n\t\t\tu16 status_code;\n\t\t\t/* possibly followed by Challenge text */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) auth;\n\t\tstruct {\n\t\t\tu16 reason_code;\n\t\t}  __attribute__ ((packed)) deauth;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 listen_interval;\n\t\t\t/* followed by SSID and Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) assoc_req;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 status_code;\n\t\t\tu16 aid;\n\t\t\t/* followed by Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) assoc_resp, reassoc_resp;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 listen_interval;\n\t\t\tu8 current_ap[6];\n\t\t\t/* followed by SSID and Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) reassoc_req;\n\t\tstruct {\n\t\t\tu16 reason_code;\n\t\t}  __attribute__ ((packed)) disassoc;\n\t\tstruct {\n\t\t\t__le64 timestamp;\n\t\t\tu16 beacon_int;\n\t\t\tu16 capab_info;\n\t\t\t/* followed by some of SSID, Supported rates,\n\t\t\t * FH Params, DS Params, CF Params, IBSS Params, TIM */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) beacon;\n\t\tstruct {\n\t\t\t/* only variable items: SSID, Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) probe_req;\n\t\tstruct {\n\t\t\t__le64 timestamp;\n\t\t\tu16 beacon_int;\n\t\t\tu16 capab_info;\n\t\t\t/* followed by some of SSID, Supported rates,\n\t\t\t * FH Params, DS Params, CF Params, IBSS Params */\n\t\t\tu8 variable[0];\n\t\t}  __attribute__ ((packed)) probe_resp;\n\t\tstruct {\n\t\t\tu8 category;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu8 status_code;\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  __attribute__ ((packed)) wme_action;\n#if 0\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 element_id;\n\t\t\t\t\tu8 length;\n\t\t\t\t\tstruct ieee80211_channel_sw_ie sw_elem;\n\t\t\t\t}  __attribute__ ((packed)) chan_switch;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu8 element_id;\n\t\t\t\t\tu8 length;\n\t\t\t\t\tstruct ieee80211_msrment_ie msr_elem;\n\t\t\t\t}  __attribute__ ((packed)) measurement;\n#endif\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu16 capab;\n\t\t\t\t\tu16 timeout;\n\t\t\t\t\tu16 start_seq_num;\n\t\t\t\t}  __attribute__ ((packed)) addba_req;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu16 status;\n\t\t\t\t\tu16 capab;\n\t\t\t\t\tu16 timeout;\n\t\t\t\t}  __attribute__ ((packed)) addba_resp;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu16 params;\n\t\t\t\t\tu16 reason_code;\n\t\t\t\t}  __attribute__ ((packed)) delba;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\t/* capab_info for open and confirm,\n\t\t\t\t\t * reason for close\n\t\t\t\t\t */\n\t\t\t\t\tu16 aux;\n\t\t\t\t\t/* Followed in plink_confirm by status\n\t\t\t\t\t * code, AID and supported rates,\n\t\t\t\t\t * and directly by supported rates in\n\t\t\t\t\t * plink_open and plink_close\n\t\t\t\t\t */\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  __attribute__ ((packed)) plink_action;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  __attribute__ ((packed)) mesh_action;\n\t\t\t} __attribute__ ((packed)) u;\n\t\t}  __attribute__ ((packed)) action;\n\t} __attribute__ ((packed)) u;\n}__attribute__ ((packed));\n\n#endif\n\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\n\nstruct ieee80211_mgmt {\n\tu16 frame_control;\n\tu16 duration;\n\tu8 da[6];\n\tu8 sa[6];\n\tu8 bssid[6];\n\tu16 seq_ctrl;\n\tunion {\n\t\tstruct {\n\t\t\tu16 auth_alg;\n\t\t\tu16 auth_transaction;\n\t\t\tu16 status_code;\n\t\t\t/* possibly followed by Challenge text */\n\t\t\tu8 variable[0];\n\t\t}  auth;\n\t\tstruct {\n\t\t\tu16 reason_code;\n\t\t}  deauth;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 listen_interval;\n\t\t\t/* followed by SSID and Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  assoc_req;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 status_code;\n\t\t\tu16 aid;\n\t\t\t/* followed by Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  assoc_resp, reassoc_resp;\n\t\tstruct {\n\t\t\tu16 capab_info;\n\t\t\tu16 listen_interval;\n\t\t\tu8 current_ap[6];\n\t\t\t/* followed by SSID and Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  reassoc_req;\n\t\tstruct {\n\t\t\tu16 reason_code;\n\t\t}  disassoc;\n#if 0\t\t\n\t\tstruct {\n\t\t\t__le64 timestamp;\n\t\t\tu16 beacon_int;\n\t\t\tu16 capab_info;\n\t\t\t/* followed by some of SSID, Supported rates,\n\t\t\t * FH Params, DS Params, CF Params, IBSS Params, TIM */\n\t\t\tu8 variable[0];\n\t\t}  beacon;\n\t\tstruct {\n\t\t\t/* only variable items: SSID, Supported rates */\n\t\t\tu8 variable[0];\n\t\t}  probe_req;\n\t\t\n\t\tstruct {\n\t\t\t__le64 timestamp;\n\t\t\tu16 beacon_int;\n\t\t\tu16 capab_info;\n\t\t\t/* followed by some of SSID, Supported rates,\n\t\t\t * FH Params, DS Params, CF Params, IBSS Params */\n\t\t\tu8 variable[0];\n\t\t}  probe_resp;\n#endif\t\n\t\tstruct {\n\t\t\tu8 category;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu8 status_code;\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  wme_action;\n/*\t\t\t\t\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 element_id;\n\t\t\t\t\tu8 length;\n\t\t\t\t\tstruct ieee80211_channel_sw_ie sw_elem;\n\t\t\t\t}  chan_switch;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu8 element_id;\n\t\t\t\t\tu8 length;\n\t\t\t\t\tstruct ieee80211_msrment_ie msr_elem;\n\t\t\t\t}  measurement;\n*/\t\t\t\t\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu16 capab;\n\t\t\t\t\tu16 timeout;\n\t\t\t\t\tu16 start_seq_num;\n\t\t\t\t}  addba_req;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 dialog_token;\n\t\t\t\t\tu16 status;\n\t\t\t\t\tu16 capab;\n\t\t\t\t\tu16 timeout;\n\t\t\t\t}  addba_resp;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu16 params;\n\t\t\t\t\tu16 reason_code;\n\t\t\t\t}  delba;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\t/* capab_info for open and confirm,\n\t\t\t\t\t * reason for close\n\t\t\t\t\t */\n\t\t\t\t\tu16 aux;\n\t\t\t\t\t/* Followed in plink_confirm by status\n\t\t\t\t\t * code, AID and supported rates,\n\t\t\t\t\t * and directly by supported rates in\n\t\t\t\t\t * plink_open and plink_close\n\t\t\t\t\t */\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  plink_action;\n\t\t\t\tstruct{\n\t\t\t\t\tu8 action_code;\n\t\t\t\t\tu8 variable[0];\n\t\t\t\t}  mesh_action;\n\t\t\t} u;\n\t\t}  action;\n\t} u;\n} ;\n\n#pragma pack()\n\n#endif\n\n/* mgmt header + 1 byte category code */\n#define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u)\n\n\n\n#endif\n\n"
  },
  {
    "path": "include/if_ether.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef _LINUX_IF_ETHER_H\n#define _LINUX_IF_ETHER_H\n\n/*\n *\tIEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble\n *\tand FCS/CRC (frame check sequence). \n */\n\n#define ETH_ALEN\t6\t\t/* Octets in one ethernet addr\t */\n#define ETH_HLEN\t14\t\t/* Total octets in header.\t */\n#define ETH_ZLEN\t60\t\t/* Min. octets in frame sans FCS */\n#define ETH_DATA_LEN\t1500\t\t/* Max. octets in payload\t */\n#define ETH_FRAME_LEN\t1514\t\t/* Max. octets in frame sans FCS */\n\n/*\n *\tThese are the defined Ethernet Protocol ID's.\n */\n\n#define ETH_P_LOOP\t0x0060\t\t/* Ethernet Loopback packet\t*/\n#define ETH_P_PUP\t0x0200\t\t/* Xerox PUP packet\t\t*/\n#define ETH_P_PUPAT\t0x0201\t\t/* Xerox PUP Addr Trans packet\t*/\n#define ETH_P_IP\t0x0800\t\t/* Internet Protocol packet\t*/\n#define ETH_P_X25\t0x0805\t\t/* CCITT X.25\t\t\t*/\n#define ETH_P_ARP\t0x0806\t\t/* Address Resolution packet\t*/\n#define\tETH_P_BPQ\t0x08FF\t\t/* G8BPQ AX.25 Ethernet Packet\t[ NOT AN OFFICIALLY REGISTERED ID ] */\n#define ETH_P_IEEEPUP\t0x0a00\t\t/* Xerox IEEE802.3 PUP packet */\n#define ETH_P_IEEEPUPAT\t0x0a01\t\t/* Xerox IEEE802.3 PUP Addr Trans packet */\n#define ETH_P_DEC       0x6000          /* DEC Assigned proto           */\n#define ETH_P_DNA_DL    0x6001          /* DEC DNA Dump/Load            */\n#define ETH_P_DNA_RC    0x6002          /* DEC DNA Remote Console       */\n#define ETH_P_DNA_RT    0x6003          /* DEC DNA Routing              */\n#define ETH_P_LAT       0x6004          /* DEC LAT                      */\n#define ETH_P_DIAG      0x6005          /* DEC Diagnostics              */\n#define ETH_P_CUST      0x6006          /* DEC Customer use             */\n#define ETH_P_SCA       0x6007          /* DEC Systems Comms Arch       */\n#define ETH_P_RARP      0x8035\t\t/* Reverse Addr Res packet\t*/\n#define ETH_P_ATALK\t0x809B\t\t/* Appletalk DDP\t\t*/\n#define ETH_P_AARP\t0x80F3\t\t/* Appletalk AARP\t\t*/\n#define ETH_P_8021Q\t0x8100          /* 802.1Q VLAN Extended Header  */\n#define ETH_P_IPX\t0x8137\t\t/* IPX over DIX\t\t\t*/\n#define ETH_P_IPV6\t0x86DD\t\t/* IPv6 over bluebook\t\t*/\n#define ETH_P_PPP_DISC\t0x8863\t\t/* PPPoE discovery messages     */\n#define ETH_P_PPP_SES\t0x8864\t\t/* PPPoE session messages\t*/\n#define ETH_P_ATMMPOA\t0x884c\t\t/* MultiProtocol Over ATM\t*/\n#define ETH_P_ATMFATE\t0x8884\t\t/* Frame-based ATM Transport\n\t\t\t\t\t * over Ethernet\n\t\t\t\t\t */\n\n/*\n *\tNon DIX types. Won't clash for 1500 types.\n */\n \n#define ETH_P_802_3\t0x0001\t\t/* Dummy type for 802.3 frames  */\n#define ETH_P_AX25\t0x0002\t\t/* Dummy protocol id for AX.25  */\n#define ETH_P_ALL\t0x0003\t\t/* Every packet (be careful!!!) */\n#define ETH_P_802_2\t0x0004\t\t/* 802.2 frames \t\t*/\n#define ETH_P_SNAP\t0x0005\t\t/* Internal only\t\t*/\n#define ETH_P_DDCMP     0x0006          /* DEC DDCMP: Internal only     */\n#define ETH_P_WAN_PPP   0x0007          /* Dummy type for WAN PPP frames*/\n#define ETH_P_PPP_MP    0x0008          /* Dummy type for PPP MP frames */\n#define ETH_P_LOCALTALK 0x0009\t\t/* Localtalk pseudo type \t*/\n#define ETH_P_PPPTALK\t0x0010\t\t/* Dummy type for Atalk over PPP*/\n#define ETH_P_TR_802_2\t0x0011\t\t/* 802.2 frames \t\t*/\n#define ETH_P_MOBITEX\t0x0015\t\t/* Mobitex (kaz@cafe.net)\t*/\n#define ETH_P_CONTROL\t0x0016\t\t/* Card specific control frames */\n#define ETH_P_IRDA\t0x0017\t\t/* Linux-IrDA\t\t\t*/\n#define ETH_P_ECONET\t0x0018\t\t/* Acorn Econet\t\t\t*/\n\n/*\n *\tThis is an Ethernet frame header.\n */\n \nstruct ethhdr \n{\n\tunsigned char\th_dest[ETH_ALEN];\t/* destination eth addr\t*/\n\tunsigned char\th_source[ETH_ALEN];\t/* source ether addr\t*/\n\tunsigned short\th_proto;\t\t/* packet type ID field\t*/\n};\n\nstruct _vlan {\n   unsigned short       h_vlan_TCI;                // Encapsulates priority and VLAN ID\n   unsigned short       h_vlan_encapsulated_proto;\n};\n\n\n\n#define get_vlan_id(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI)) & 0xfff)\n#define get_vlan_priority(pvlan) ((ntohs((unsigned short )pvlan->h_vlan_TCI))>>13)\n#define get_vlan_encap_proto(pvlan) (ntohs((unsigned short )pvlan->h_vlan_encapsulated_proto))\n\n\n#endif\t/* _LINUX_IF_ETHER_H */\n\n"
  },
  {
    "path": "include/ip.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _LINUX_IP_H\n#define _LINUX_IP_H\n\n/* SOL_IP socket options */\n\n#define IPTOS_TOS_MASK\t\t0x1E\n#define IPTOS_TOS(tos)\t\t((tos)&IPTOS_TOS_MASK)\n#define\tIPTOS_LOWDELAY\t\t0x10\n#define\tIPTOS_THROUGHPUT\t0x08\n#define\tIPTOS_RELIABILITY\t0x04\n#define\tIPTOS_MINCOST\t\t0x02\n\n#define IPTOS_PREC_MASK\t\t0xE0\n#define IPTOS_PREC(tos)\t\t((tos)&IPTOS_PREC_MASK)\n#define IPTOS_PREC_NETCONTROL           0xe0\n#define IPTOS_PREC_INTERNETCONTROL      0xc0\n#define IPTOS_PREC_CRITIC_ECP           0xa0\n#define IPTOS_PREC_FLASHOVERRIDE        0x80\n#define IPTOS_PREC_FLASH                0x60\n#define IPTOS_PREC_IMMEDIATE            0x40\n#define IPTOS_PREC_PRIORITY             0x20\n#define IPTOS_PREC_ROUTINE              0x00\n\n\n/* IP options */\n#define IPOPT_COPY\t\t0x80\n#define IPOPT_CLASS_MASK\t0x60\n#define IPOPT_NUMBER_MASK\t0x1f\n\n#define\tIPOPT_COPIED(o)\t\t((o)&IPOPT_COPY)\n#define\tIPOPT_CLASS(o)\t\t((o)&IPOPT_CLASS_MASK)\n#define\tIPOPT_NUMBER(o)\t\t((o)&IPOPT_NUMBER_MASK)\n\n#define\tIPOPT_CONTROL\t\t0x00\n#define\tIPOPT_RESERVED1\t\t0x20\n#define\tIPOPT_MEASUREMENT\t0x40\n#define\tIPOPT_RESERVED2\t\t0x60\n\n#define IPOPT_END\t(0 |IPOPT_CONTROL)\n#define IPOPT_NOOP\t(1 |IPOPT_CONTROL)\n#define IPOPT_SEC\t(2 |IPOPT_CONTROL|IPOPT_COPY)\n#define IPOPT_LSRR\t(3 |IPOPT_CONTROL|IPOPT_COPY)\n#define IPOPT_TIMESTAMP\t(4 |IPOPT_MEASUREMENT)\n#define IPOPT_RR\t(7 |IPOPT_CONTROL)\n#define IPOPT_SID\t(8 |IPOPT_CONTROL|IPOPT_COPY)\n#define IPOPT_SSRR\t(9 |IPOPT_CONTROL|IPOPT_COPY)\n#define IPOPT_RA\t(20|IPOPT_CONTROL|IPOPT_COPY)\n\n#define IPVERSION\t4\n#define MAXTTL\t\t255\n#define IPDEFTTL\t64\n\n/* struct timestamp, struct route and MAX_ROUTES are removed.\n\n   REASONS: it is clear that nobody used them because:\n   - MAX_ROUTES value was wrong.\n   - \"struct route\" was wrong.\n   - \"struct timestamp\" had fatally misaligned bitfields and was completely unusable.\n */\n\n#define IPOPT_OPTVAL 0\n#define IPOPT_OLEN   1\n#define IPOPT_OFFSET 2\n#define IPOPT_MINOFF 4\n#define MAX_IPOPTLEN 40\n#define IPOPT_NOP IPOPT_NOOP\n#define IPOPT_EOL IPOPT_END\n#define IPOPT_TS  IPOPT_TIMESTAMP\n\n#define\tIPOPT_TS_TSONLY\t\t0\t\t/* timestamps only */\n#define\tIPOPT_TS_TSANDADDR\t1\t\t/* timestamps and addresses */\n#define\tIPOPT_TS_PRESPEC\t3\t\t/* specified modules only */\n\n#ifdef PLATFORM_LINUX\n\nstruct ip_options {\n  __u32\t\tfaddr;\t\t\t\t/* Saved first hop address */\n  unsigned char\toptlen;\n  unsigned char srr;\n  unsigned char rr;\n  unsigned char ts;\n  unsigned char is_setbyuser:1,\t\t\t/* Set by setsockopt?\t\t\t*/\n                is_data:1,\t\t\t/* Options in __data, rather than skb\t*/\n                is_strictroute:1,\t\t/* Strict source route\t\t\t*/\n                srr_is_hit:1,\t\t\t/* Packet destination addr was our one\t*/\n                is_changed:1,\t\t\t/* IP checksum more not valid\t\t*/\t\n                rr_needaddr:1,\t\t\t/* Need to record addr of outgoing dev\t*/\n                ts_needtime:1,\t\t\t/* Need to record timestamp\t\t*/\n                ts_needaddr:1;\t\t\t/* Need to record addr of outgoing dev  */\n  unsigned char router_alert;\n  unsigned char __pad1;\n  unsigned char __pad2;\n  unsigned char __data[0];\n};\n\n#define optlength(opt) (sizeof(struct ip_options) + opt->optlen)\n#endif\n\nstruct iphdr {\n#if defined(__LITTLE_ENDIAN_BITFIELD)\n\t__u8\tihl:4,\n\t\tversion:4;\n#elif defined (__BIG_ENDIAN_BITFIELD)\n\t__u8\tversion:4,\n  \t\tihl:4;\n#else\n#error\t\"Please fix <asm/byteorder.h>\"\n#endif\n\t__u8\ttos;\n\t__u16\ttot_len;\n\t__u16\tid;\n\t__u16\tfrag_off;\n\t__u8\tttl;\n\t__u8\tprotocol;\n\t__u16\tcheck;\n\t__u32\tsaddr;\n\t__u32\tdaddr;\n\t/*The options start here. */\n};\n\n#endif\t/* _LINUX_IP_H */\n\n"
  },
  {
    "path": "include/linux/wireless.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef _LINUX_WIRELESS_H\n#define _LINUX_WIRELESS_H\n\n/***************************** INCLUDES *****************************/\n\n#if 0\n#include <linux/types.h>\t\t/* for __u* and __s* typedefs */\n#include <linux/socket.h>\t\t/* for \"struct sockaddr\" et al\t*/\n#include <linux/if.h>\t\t\t/* for IFNAMSIZ and co... */\n#else\n#define __user\n//typedef uint16_t\t__u16;\n#include <sys/socket.h>\t\t\t/* for \"struct sockaddr\" et al\t*/\n#include <net/if.h>\t\t\t/* for IFNAMSIZ and co... */\n#endif\n\n/****************************** TYPES ******************************/\n#ifdef CONFIG_COMPAT\nstruct compat_iw_point {\n         compat_caddr_t pointer;\n         __u16 length;\n         __u16 flags;\n};\n#endif\n/* --------------------------- SUBTYPES --------------------------- */\n/*\n *\tFor all data larger than 16 octets, we need to use a\n *\tpointer to memory allocated in user space.\n */\nstruct\tiw_point\n{\n  void __user\t*pointer;\t/* Pointer to the data  (in user space) */\n  __u16\t\tlength;\t\t/* number of fields or size in bytes */\n  __u16\t\tflags;\t\t/* Optional params */\n};\n\n\n/* ------------------------ IOCTL REQUEST ------------------------ */\n/*\n * This structure defines the payload of an ioctl, and is used \n * below.\n *\n * Note that this structure should fit on the memory footprint\n * of iwreq (which is the same as ifreq), which mean a max size of\n * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...\n * You should check this when increasing the structures defined\n * above in this file...\n */\nunion\tiwreq_data\n{\n\t/* Config - generic */\n\tchar\t\tname[IFNAMSIZ];\n\t/* Name : used to verify the presence of  wireless extensions.\n\t * Name of the protocol/provider... */\n\n\tstruct iw_point\tdata;\t\t/* Other large parameters */\n};\n\n/*\n * The structure to exchange data for ioctl.\n * This structure is the same as 'struct ifreq', but (re)defined for\n * convenience...\n * Do I need to remind you about structure size (32 octets) ?\n */\nstruct\tiwreq \n{\n\tunion\n\t{\n\t\tchar\tifrn_name[IFNAMSIZ];\t/* if name, e.g. \"eth0\" */\n\t} ifr_ifrn;\n\n\t/* Data part (defined just above) */\n\tunion\tiwreq_data\tu;\n};\n\n#endif\t/* _LINUX_WIRELESS_H */\n\n"
  },
  {
    "path": "include/mlme_osdep.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__MLME_OSDEP_H_\n#define __MLME_OSDEP_H_\n\n\n#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_MPIXEL)\nextern int time_after(u32 now, u32 old);\n#endif\n\nextern void rtw_init_mlme_timer(_adapter *padapter);\nextern void rtw_os_indicate_disconnect( _adapter *adapter );\nextern void rtw_os_indicate_connect( _adapter *adapter );\nvoid rtw_os_indicate_scan_done( _adapter *padapter, bool aborted);\nextern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie);\n\nvoid rtw_reset_securitypriv( _adapter *adapter );\n\n#endif\t//_MLME_OSDEP_H_\n\n"
  },
  {
    "path": "include/mp_custom_oid.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__CUSTOM_OID_H\n#define __CUSTOM_OID_H\n\n// by Owen\n// 0xFF818000 - 0xFF81802F\t\tRTL8180 Mass Production Kit\n// 0xFF818500 - 0xFF81850F\t\tRTL8185 Setup Utility\n// 0xFF818580 - 0xFF81858F\t\tRTL8185 Phy Status Utility\n\n//\n\n// by Owen for Production Kit\n// For Production Kit with Agilent Equipments\n// in order to make our custom oids hopefully somewhat unique\n// we will use 0xFF (indicating implementation specific OID)\n//               81(first byte of non zero Realtek unique identifier)\n//               80 (second byte of non zero Realtek unique identifier)\n//               XX (the custom OID number - providing 255 possible custom oids)\n\n#define OID_RT_PRO_RESET_DUT\t\t\t\t0xFF818000\n#define OID_RT_PRO_SET_DATA_RATE\t\t\t0xFF818001\n#define OID_RT_PRO_START_TEST\t\t\t\t0xFF818002\n#define OID_RT_PRO_STOP_TEST    \t\t\t0xFF818003\n#define OID_RT_PRO_SET_PREAMBLE\t\t\t\t0xFF818004\n#define OID_RT_PRO_SET_SCRAMBLER\t\t\t0xFF818005\n#define OID_RT_PRO_SET_FILTER_BB\t\t\t0xFF818006\n#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB\t\t0xFF818007\n#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL\t\t0xFF818008\n#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL\t\t0xFF818009\n#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL\t\t0xFF81800A\n\n#define OID_RT_PRO_SET_TX_ANTENNA_BB\t\t\t0xFF81800D\n#define OID_RT_PRO_SET_ANTENNA_BB\t\t\t0xFF81800E\n#define OID_RT_PRO_SET_CR_SCRAMBLER\t\t\t0xFF81800F\n#define OID_RT_PRO_SET_CR_NEW_FILTER\t\t\t0xFF818010\n#define OID_RT_PRO_SET_TX_POWER_CONTROL\t\t\t0xFF818011\n#define OID_RT_PRO_SET_CR_TX_CONFIG\t\t\t0xFF818012\n#define OID_RT_PRO_GET_TX_POWER_CONTROL\t\t\t0xFF818013\n#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY\t\t0xFF818014\n#define OID_RT_PRO_SET_CR_SETPOINT\t\t\t0xFF818015\n#define OID_RT_PRO_SET_INTEGRATOR\t\t\t0xFF818016\n#define OID_RT_PRO_SET_SIGNAL_QUALITY\t\t\t0xFF818017\n#define OID_RT_PRO_GET_INTEGRATOR\t\t\t0xFF818018\n#define OID_RT_PRO_GET_SIGNAL_QUALITY\t\t\t0xFF818019\n#define OID_RT_PRO_QUERY_EEPROM_TYPE\t\t\t0xFF81801A\n#define OID_RT_PRO_WRITE_MAC_ADDRESS\t\t\t0xFF81801B\n#define OID_RT_PRO_READ_MAC_ADDRESS\t\t\t0xFF81801C\n#define OID_RT_PRO_WRITE_CIS_DATA\t\t\t0xFF81801D\n#define OID_RT_PRO_READ_CIS_DATA\t\t\t0xFF81801E\n#define OID_RT_PRO_WRITE_POWER_CONTROL\t\t\t0xFF81801F\n#define OID_RT_PRO_READ_POWER_CONTROL\t\t\t0xFF818020\n#define OID_RT_PRO_WRITE_EEPROM\t\t\t\t0xFF818021\n#define OID_RT_PRO_READ_EEPROM\t\t\t\t0xFF818022\n#define OID_RT_PRO_RESET_TX_PACKET_SENT\t\t\t0xFF818023\n#define OID_RT_PRO_QUERY_TX_PACKET_SENT\t\t\t0xFF818024\n#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED\t\t0xFF818025 \n#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED\t\t0xFF818026\n#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR\t\t0xFF818027\n#define OID_RT_PRO_QUERY_CURRENT_ADDRESS\t\t0xFF818028\n#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS\t\t0xFF818029\n#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS\t\t0xFF81802A\n#define OID_RT_PRO_RECEIVE_PACKET\t\t\t0xFF81802C\n// added by Owen on 04/08/03 for Cameo's request\n#define OID_RT_PRO_WRITE_EEPROM_BYTE\t\t\t0xFF81802D\n#define OID_RT_PRO_READ_EEPROM_BYTE\t\t\t0xFF81802E\n#define OID_RT_PRO_SET_MODULATION\t\t\t0xFF81802F\n//\n\n//Sean\t\t\n#define OID_RT_DRIVER_OPTION\t\t\t\t0xFF818080\n#define OID_RT_RF_OFF\t\t\t\t\t0xFF818081\n#define OID_RT_AUTH_STATUS\t\t\t\t0xFF818082\n\n//========================================================================\n#define OID_RT_PRO_SET_CONTINUOUS_TX\t\t\t0xFF81800B\n#define OID_RT_PRO_SET_SINGLE_CARRIER_TX\t\t0xFF81800C\n#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX\t\t0xFF81802B\n#define OID_RT_PRO_SET_SINGLE_TONE_TX\t\t\t0xFF818043\n//========================================================================\n\n\n// by Owen for RTL8185 Phy Status Report Utility\n#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS\t\t\t\t0xFF818580\n#define OID_RT_UTILITY_SELECT_DEBUG_MODE\t\t\t\t0xFF818581\n#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER\t\t\t\t0xFF818582\n#define OID_RT_UTILITY_GET_RSSI_STATUS\t\t\t\t\t0xFF818583\n#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS\t\t\t0xFF818584\n#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS\t0xFF818585\n#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS\t\t\t0xFF818586\n//\n\n// by Owen on 03/09/19-03/09/22 for RTL8185\n#define OID_RT_WIRELESS_MODE\t\t\t\t0xFF818500\n#define OID_RT_SUPPORTED_RATES\t\t\t\t0xFF818501\n#define OID_RT_DESIRED_RATES\t\t\t\t0xFF818502\n#define OID_RT_WIRELESS_MODE_STARTING_ADHOC\t\t0xFF818503\n//\n\n#define OID_RT_GET_CONNECT_STATE                \t0xFF030001\n#define OID_RT_RESCAN\t                        \t0xFF030002\n#define OID_RT_SET_KEY_LENGTH\t\t\t\t0xFF030003\n#define OID_RT_SET_DEFAULT_KEY_ID\t\t\t0xFF030004\n\n#define OID_RT_SET_CHANNEL\t\t\t\t0xFF010182\n#define OID_RT_SET_SNIFFER_MODE                 \t0xFF010183\n#define OID_RT_GET_SIGNAL_QUALITY               \t0xFF010184\n#define OID_RT_GET_SMALL_PACKET_CRC\t\t\t0xFF010185\t\t\n#define OID_RT_GET_MIDDLE_PACKET_CRC\t\t\t0xFF010186\n#define OID_RT_GET_LARGE_PACKET_CRC\t\t\t0xFF010187\n#define OID_RT_GET_TX_RETRY\t\t\t\t0xFF010188\n#define OID_RT_GET_RX_RETRY\t\t\t\t0xFF010189\n#define OID_RT_PRO_SET_FW_DIG_STATE\t\t\t0xFF01018A//S\n#define OID_RT_PRO_SET_FW_RA_STATE\t\t\t0xFF01018B//S\n\n#define OID_RT_GET_RX_TOTAL_PACKET\t\t\t0xFF010190\n#define OID_RT_GET_TX_BEACON_OK\t\t\t\t0xFF010191\n#define OID_RT_GET_TX_BEACON_ERR\t\t\t0xFF010192\n#define OID_RT_GET_RX_ICV_ERR\t\t\t\t0xFF010193\n#define OID_RT_SET_ENCRYPTION_ALGORITHM\t\t\t0xFF010194\n#define OID_RT_SET_NO_AUTO_RESCAN\t\t\t0xFF010195\n#define OID_RT_GET_PREAMBLE_MODE\t\t\t0xFF010196\n#define OID_RT_GET_DRIVER_UP_DELTA_TIME\t\t\t0xFF010197\n#define OID_RT_GET_AP_IP\t\t\t\t0xFF010198\n#define OID_RT_GET_CHANNELPLAN\t\t\t\t0xFF010199\n#define OID_RT_SET_PREAMBLE_MODE\t\t\t0xFF01019A\n#define OID_RT_SET_BCN_INTVL\t\t\t\t0xFF01019B\n#define OID_RT_GET_RF_VENDER\t\t\t\t0xFF01019C\n#define OID_RT_DEDICATE_PROBE\t\t\t\t0xFF01019D\n#define OID_RT_PRO_RX_FILTER_PATTERN\t\t\t0xFF01019E\n\n#define OID_RT_GET_DCST_CURRENT_THRESHOLD\t\t0xFF01019F\n\n#define OID_RT_GET_CCA_ERR\t\t\t\t0xFF0101A0\n#define OID_RT_GET_CCA_UPGRADE_THRESHOLD\t\t0xFF0101A1\n#define OID_RT_GET_CCA_FALLBACK_THRESHOLD\t\t0xFF0101A2\n\n#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES\t\t0xFF0101A3\n#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES\t\t0xFF0101A4\n\n// by Owen on 03/31/03 for Cameo's request\n#define OID_RT_SET_RATE_ADAPTIVE\t\t\t0xFF0101A5\n//\n#define OID_RT_GET_DCST_EVALUATE_PERIOD\t\t\t0xFF0101A5\n#define OID_RT_GET_DCST_TIME_UNIT_INDEX\t\t\t0xFF0101A6\n#define OID_RT_GET_TOTAL_TX_BYTES\t\t\t0xFF0101A7\n#define OID_RT_GET_TOTAL_RX_BYTES\t\t\t0xFF0101A8\n#define OID_RT_CURRENT_TX_POWER_LEVEL\t\t\t0xFF0101A9\n#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT\t\t0xFF0101AA\n#define OID_RT_GET_ENC_KEY_MATCH_COUNT\t\t\t0xFF0101AB\n#define OID_RT_GET_CHANNEL\t\t\t\t0xFF0101AC\n\n#define OID_RT_SET_CHANNELPLAN\t\t\t\t0xFF0101AD\n#define OID_RT_GET_HARDWARE_RADIO_OFF\t\t\t0xFF0101AE\n#define OID_RT_CHANNELPLAN_BY_COUNTRY\t\t\t0xFF0101AF\n#define OID_RT_SCAN_AVAILABLE_BSSID\t\t\t0xFF0101B0\n#define OID_RT_GET_HARDWARE_VERSION\t\t\t0xFF0101B1\n#define OID_RT_GET_IS_ROAMING\t\t\t\t0xFF0101B2\n#define OID_RT_GET_IS_PRIVACY\t\t\t\t0xFF0101B3\n#define OID_RT_GET_KEY_MISMATCH\t\t\t\t0xFF0101B4\n#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH\t\t\t0xFF0101B5\n#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH\t\t\t0xFF0101B6\n#define OID_RT_RESET_LOG\t\t\t\t0xFF0101B7\n#define OID_RT_GET_LOG\t\t\t\t\t0xFF0101B8\n#define OID_RT_SET_INDICATE_HIDDEN_AP\t\t\t0xFF0101B9\n#define OID_RT_GET_HEADER_FAIL\t\t\t\t0xFF0101BA\n#define OID_RT_SUPPORTED_WIRELESS_MODE\t\t\t0xFF0101BB\n#define OID_RT_GET_CHANNEL_LIST\t\t\t\t0xFF0101BC\n#define OID_RT_GET_SCAN_IN_PROGRESS\t\t\t0xFF0101BD\n#define OID_RT_GET_TX_INFO\t\t\t\t0xFF0101BE\n#define OID_RT_RF_READ_WRITE_OFFSET\t\t\t0xFF0101BF\n#define OID_RT_RF_READ_WRITE\t\t\t\t0xFF0101C0\n\n// For Netgear request. 2005.01.13, by rcnjko.\n#define OID_RT_FORCED_DATA_RATE\t\t\t\t0xFF0101C1\n#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST\t\t0xFF0101C2\n// For Netgear request. 2005.02.17, by rcnjko.\n#define OID_RT_GET_BSS_WIRELESS_MODE\t\t\t0xFF0101C3\n// For AZ project. 2005.06.27, by rcnjko.\n#define OID_RT_SCAN_WITH_MAGIC_PACKET\t\t\t0xFF0101C4\n\n// Vincent 8185MP\n#define OID_RT_PRO_RX_FILTER\t\t\t\t0xFF0111C0\n\n//Andy TEST\n//#define OID_RT_PRO_WRITE_REGISTRY\t\t\t0xFF0111C1\n//#define OID_RT_PRO_READ_REGISTRY\t\t\t0xFF0111C2\n#define OID_CE_USB_WRITE_REGISTRY\t\t\t0xFF0111C1\n#define OID_CE_USB_READ_REGISTRY\t\t\t0xFF0111C2\n\n\n#define OID_RT_PRO_SET_INITIAL_GAIN\t\t\t0xFF0111C3\n#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE\t\t0xFF0111C4\n#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE\t\t0xFF0111C5\n#define OID_RT_PRO_SET_TX_CHARGE_PUMP\t\t\t0xFF0111C6\n#define OID_RT_PRO_SET_RX_CHARGE_PUMP\t\t\t0xFF0111C7\n#define OID_RT_PRO_RF_WRITE_REGISTRY\t\t\t0xFF0111C8\n#define OID_RT_PRO_RF_READ_REGISTRY\t\t\t0xFF0111C9\n#define OID_RT_PRO_QUERY_RF_TYPE\t\t\t0xFF0111CA\n\n// AP OID\n#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST\t\t0xFF010300\n#define OID_RT_AP_GET_CURRENT_TIME_STAMP\t\t0xFF010301\n#define OID_RT_AP_SWITCH_INTO_AP_MODE\t\t\t0xFF010302\n#define OID_RT_AP_SET_DTIM_PERIOD\t\t\t0xFF010303\n#define OID_RT_AP_SUPPORTED\t\t\t\t0xFF010304\t// Determine if driver supports AP mode. 2004.08.27, by rcnjko.\n#define OID_RT_AP_SET_PASSPHRASE\t\t\t0xFF010305\t// Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko.\n\n// 8187MP. 2004.09.06, by rcnjko.\n#define OID_RT_PRO8187_WI_POLL\t\t\t\t0xFF818780\n#define OID_RT_PRO_WRITE_BB_REG\t\t\t\t0xFF818781\n#define OID_RT_PRO_READ_BB_REG\t\t\t\t0xFF818782\n#define OID_RT_PRO_WRITE_RF_REG\t\t\t\t0xFF818783\n#define OID_RT_PRO_READ_RF_REG\t\t\t\t0xFF818784\n\n// Meeting House. added by Annie, 2005-07-20.\n#define OID_RT_MH_VENDER_ID\t\t\t\t0xFFEDC100\n\n//8711 MP OID added 20051230.\n#define OID_RT_PRO8711_JOIN_BSS\t\t\t\t0xFF871100//S\n\n#define OID_RT_PRO_READ_REGISTER\t\t\t0xFF871101 //Q\n#define OID_RT_PRO_WRITE_REGISTER\t\t\t0xFF871102 //S\n\n#define OID_RT_PRO_BURST_READ_REGISTER\t\t\t0xFF871103 //Q\t\t\n#define OID_RT_PRO_BURST_WRITE_REGISTER \t\t0xFF871104 //S\n\n#define OID_RT_PRO_WRITE_TXCMD\t\t\t\t0xFF871105 //S\n\n#define OID_RT_PRO_READ16_EEPROM\t\t\t0xFF871106 //Q\n#define OID_RT_PRO_WRITE16_EEPROM\t\t\t0xFF871107 //S\n\n#define OID_RT_PRO_H2C_SET_COMMAND\t\t\t0xFF871108 //S\n#define OID_RT_PRO_H2C_QUERY_RESULT\t\t\t0xFF871109 //Q\n\n#define OID_RT_PRO8711_WI_POLL\t\t\t\t0xFF87110A //Q\n#define OID_RT_PRO8711_PKT_LOSS\t\t\t\t0xFF87110B //Q\n#define OID_RT_RD_ATTRIB_MEM\t\t\t\t0xFF87110C//Q\n#define OID_RT_WR_ATTRIB_MEM\t\t\t\t0xFF87110D//S\n\n\n//Method 2 for H2C/C2H\n#define OID_RT_PRO_H2C_CMD_MODE\t\t\t\t0xFF871110 //S\n#define OID_RT_PRO_H2C_CMD_RSP_MODE\t\t\t0xFF871111 //Q\n#define OID_RT_PRO_H2C_CMD_EVENT_MODE\t\t\t0xFF871112 //S\n#define OID_RT_PRO_WAIT_C2H_EVENT\t\t\t0xFF871113 //Q\n#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST\t\t0xFF871114//Q\n\n#define OID_RT_PRO_SCSI_ACCESS_TEST\t\t\t0xFF871115 //Q, S\n\n#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT\t\t0xFF871116 //S\n#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN\t\t\t0xFF871117 //Q,S\n#define OID_RT_RRO_RX_PKT_VIA_IOCTRL\t\t\t0xFF871118 //Q\n#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL\t\t0xFF871119 //Q\n\n#define OID_RT_RPO_SET_PWRMGT_TEST\t\t\t0xFF87111A //S\n#define OID_RT_PRO_QRY_PWRMGT_TEST\t\t\t0XFF87111B //Q\n#define OID_RT_RPO_ASYNC_RWIO_TEST\t\t\t0xFF87111C //S\n#define OID_RT_RPO_ASYNC_RWIO_POLL\t\t\t0xFF87111D //Q\n#define OID_RT_PRO_SET_RF_INTFS\t\t\t\t0xFF87111E //S\n#define OID_RT_POLL_RX_STATUS\t\t\t\t0xFF87111F //Q\n\n#define OID_RT_PRO_CFG_DEBUG_MESSAGE\t\t\t0xFF871120 //Q,S\n#define OID_RT_PRO_SET_DATA_RATE_EX\t\t\t0xFF871121//S\n#define OID_RT_PRO_SET_BASIC_RATE\t\t\t0xFF871122//S\n#define OID_RT_PRO_READ_TSSI\t\t\t\t0xFF871123//S\n#define OID_RT_PRO_SET_POWER_TRACKING\t\t\t0xFF871124//S\n\n \n#define OID_RT_PRO_QRY_PWRSTATE\t\t\t\t0xFF871150 //Q\n#define OID_RT_PRO_SET_PWRSTATE\t\t\t\t0xFF871151 //S \n\n//Method 2 , using workitem\n#define OID_RT_SET_READ_REG\t\t\t\t0xFF871181 //S\n#define OID_RT_SET_WRITE_REG\t\t\t\t0xFF871182 //S\n#define OID_RT_SET_BURST_READ_REG\t\t\t0xFF871183 //S\n#define OID_RT_SET_BURST_WRITE_REG\t\t\t0xFF871184 //S\n#define OID_RT_SET_WRITE_TXCMD\t\t\t\t0xFF871185 //S\n#define OID_RT_SET_READ16_EEPROM\t\t\t0xFF871186 //S\n#define OID_RT_SET_WRITE16_EEPROM\t\t\t0xFF871187 //S\n#define OID_RT_QRY_POLL_WKITEM\t\t\t\t0xFF871188 //Q\n\n//For SDIO INTERFACE only\n#define OID_RT_PRO_SYNCPAGERW_SRAM\t\t\t0xFF8711A0 //Q, S\n#define OID_RT_PRO_871X_DRV_EXT \t\t\t0xFF8711A1\n\n//For USB INTERFACE only\n#define OID_RT_PRO_USB_VENDOR_REQ\t\t\t0xFF8711B0 //Q, S\n#define OID_RT_PRO_SCSI_AUTO_TEST\t\t\t0xFF8711B1 //S\n#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE\t\t0xFF8711B2 //S\n#define OID_RT_PRO_USB_MAC_RX_FIFO_READ\t\t\t0xFF8711B3 //Q\n#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING\t\t0xFF8711B4 //Q\n\n#define OID_RT_PRO_H2C_SET_RATE_TABLE\t\t\t0xFF8711FB //S\n#define OID_RT_PRO_H2C_GET_RATE_TABLE\t\t\t0xFF8711FC //S\n#define OID_RT_PRO_H2C_C2H_LBK_TEST\t\t\t0xFF8711FE\n\n#define OID_RT_PRO_ENCRYPTION_CTRL\t\t\t0xFF871200 //Q, S\n#define OID_RT_PRO_ADD_STA_INFO\t\t\t\t0xFF871201 //S\n#define OID_RT_PRO_DELE_STA_INFO    \t\t\t0xFF871202 //S\n#define OID_RT_PRO_QUERY_DR_VARIABLE   \t\t\t0xFF871203 //Q\n\n#define OID_RT_PRO_RX_PACKET_TYPE\t\t\t0xFF871204 //Q, S\n\n#define OID_RT_PRO_READ_EFUSE\t\t\t\t0xFF871205 //Q\n#define OID_RT_PRO_WRITE_EFUSE\t\t\t\t0xFF871206 //S\n#define OID_RT_PRO_RW_EFUSE_PGPKT\t\t\t0xFF871207 //Q, S\n#define OID_RT_GET_EFUSE_CURRENT_SIZE\t\t\t0xFF871208 //Q\n\n#define OID_RT_SET_BANDWIDTH\t\t\t\t0xFF871209 //S\n#define OID_RT_SET_CRYSTAL_CAP\t\t\t\t0xFF87120A //S\n\n#define OID_RT_SET_RX_PACKET_TYPE    \t\t\t0xFF87120B //S\n\n#define OID_RT_GET_EFUSE_MAX_SIZE\t\t\t0xFF87120C //Q\n\n#define OID_RT_PRO_SET_TX_AGC_OFFSET\t\t\t0xFF87120D //S\n\n#define OID_RT_PRO_SET_PKT_TEST_MODE\t\t\t0xFF87120E //S\n\n#define OID_RT_PRO_FOR_EVM_TEST_SETTING\t\t\t0xFF87120F //S\n\n#define OID_RT_PRO_GET_THERMAL_METER\t\t\t0xFF871210 //Q\n\n#define OID_RT_RESET_PHY_RX_PACKET_COUNT\t\t0xFF871211 //S\n#define OID_RT_GET_PHY_RX_PACKET_RECEIVED\t\t0xFF871212 //Q\n#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR\t\t0xFF871213 //Q\n\n#define OID_RT_SET_POWER_DOWN\t\t\t\t0xFF871214 //S\n\n#define OID_RT_GET_POWER_MODE\t\t\t\t0xFF871215 //Q\n\n#define OID_RT_PRO_EFUSE\t\t\t\t0xFF871216 //Q, S\n#define OID_RT_PRO_EFUSE_MAP\t\t\t\t0xFF871217 //Q, S\n\n#endif //#ifndef\t__CUSTOM_OID_H\n\n"
  },
  {
    "path": "include/nic_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\t\n\n\n#ifndef __NIC_SPEC_H__\n#define __NIC_SPEC_H__\n\n#include <drv_conf.h>\n\n#define RTL8711_MCTRL_\t\t(0x20000)\n#define RTL8711_UART_\t\t(0x30000)\n#define RTL8711_TIMER_\t\t(0x40000)\n#define RTL8711_FINT_\t\t(0x50000)\n#define RTL8711_HINT_\t\t(0x50000)\n#define RTL8711_GPIO_\t\t(0x60000)\n#define RTL8711_WLANCTRL_\t(0x200000)\n#define RTL8711_WLANFF_\t\t(0xe00000)\n#define RTL8711_HCICTRL_\t(0x600000)\n#define RTL8711_SYSCFG_\t\t(0x620000)\n#define RTL8711_SYSCTRL_\t(0x620000)\n#define RTL8711_MCCTRL_\t\t(0x020000)\n\n\n#include <rtl8711_regdef.h>\n\n#include <rtl8711_bitdef.h>\n\n\n#endif // __RTL8711_SPEC_H__\n\n"
  },
  {
    "path": "include/osdep_intf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __OSDEP_INTF_H_\n#define __OSDEP_INTF_H_\n\n\nstruct intf_priv {\n\n\tu8 *intf_dev;\n\tu32\tmax_iosz; \t//USB2.0: 128, USB1.1: 64, SDIO:64\n\tu32\tmax_xmitsz; //USB2.0: unlimited, SDIO:512\n\tu32\tmax_recvsz; //USB2.0: unlimited, SDIO:512\n\n\tvolatile u8 *io_rwmem;\n\tvolatile u8 *allocated_io_rwmem;\n\tu32\tio_wsz; //unit: 4bytes\n\tu32\tio_rsz;//unit: 4bytes\n\tu8 intf_status;\n\n\tvoid (*_bus_io)(u8 *priv);\n\n/*\nUnder Sync. IRP (SDIO/USB)\nA protection mechanism is necessary for the io_rwmem(read/write protocol)\n\nUnder Async. IRP (SDIO/USB)\nThe protection mechanism is through the pending queue.\n*/\n\n\t_mutex ioctl_mutex;\n\n\n#ifdef PLATFORM_LINUX\n\t#ifdef CONFIG_USB_HCI\n\t// when in USB, IO is through interrupt in/out endpoints\n\tstruct usb_device \t*udev;\n\tPURB\tpiorw_urb;\n\tu8 io_irp_cnt;\n\tu8 bio_irp_pending;\n\t_sema io_retevt;\n\t_timer\tio_timer;\n\tu8 bio_irp_timeout;\n\tu8 bio_timer_cancel;\n\t#endif\n#endif\n\n#ifdef PLATFORM_OS_XP\n\t#ifdef CONFIG_SDIO_HCI\n\t\t// below is for io_rwmem...\n\t\tPMDL pmdl;\n\t\tPSDBUS_REQUEST_PACKET  sdrp;\n\t\tPSDBUS_REQUEST_PACKET  recv_sdrp;\n\t\tPSDBUS_REQUEST_PACKET  xmit_sdrp;\n\n\t\t\tPIRP\t\tpiorw_irp;\n\n\t#endif\n\t#ifdef CONFIG_USB_HCI\n\t\tPURB\tpiorw_urb;\n\t\tPIRP\t\tpiorw_irp;\n\t\tu8 io_irp_cnt;\n\t\tu8 bio_irp_pending;\n\t\t_sema io_retevt;\n\t#endif\n#endif\n\n};\n\n\n#ifdef CONFIG_R871X_TEST\nint rtw_start_pseudo_adhoc(_adapter *padapter);\nint rtw_stop_pseudo_adhoc(_adapter *padapter);\n#endif\n\nstruct dvobj_priv *devobj_init(void);\nvoid devobj_deinit(struct dvobj_priv *pdvobj);\n\nu8 rtw_init_drv_sw(_adapter *padapter);\nu8 rtw_free_drv_sw(_adapter *padapter);\nu8 rtw_reset_drv_sw(_adapter *padapter);\nvoid rtw_dev_unload(PADAPTER padapter);\n\nu32 rtw_start_drv_threads(_adapter *padapter);\nvoid rtw_stop_drv_threads (_adapter *padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid rtw_cancel_dynamic_chk_timer(_adapter *padapter);\n#endif\nvoid rtw_cancel_all_timer(_adapter *padapter);\n\nuint loadparam(_adapter *adapter);\n\n#ifdef PLATFORM_LINUX\nint rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);\n\nint rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname);\nstruct net_device *rtw_init_netdev(_adapter *padapter);\n\nvoid rtw_os_ndev_free(_adapter *adapter);\nint rtw_os_ndev_init(_adapter *adapter, char *name);\nvoid rtw_os_ndev_deinit(_adapter *adapter);\nvoid rtw_os_ndevs_unregister(struct dvobj_priv *dvobj);\nint rtw_os_ndevs_init(struct dvobj_priv *dvobj);\nvoid rtw_os_ndevs_deinit(struct dvobj_priv *dvobj);\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\nu16 rtw_recv_select_queue(struct sk_buff *skb);\n#endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)\n\nint rtw_ndev_notifier_register(void);\nvoid rtw_ndev_notifier_unregister(void);\n\n#include \"../os_dep/linux/rtw_proc.h\"\n\n#ifdef CONFIG_IOCTL_CFG80211\n#include \"../os_dep/linux/ioctl_cfg80211.h\"\n#endif //CONFIG_IOCTL_CFG80211\n\n#endif //PLATFORM_LINUX\n\n\n#ifdef PLATFORM_FREEBSD\nextern int rtw_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data);\n#endif\n\nvoid rtw_ips_dev_unload(_adapter *padapter);\n\n#ifdef CONFIG_IPS\nint rtw_ips_pwr_up(_adapter *padapter);\nvoid rtw_ips_pwr_down(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\nstruct _io_ops;\n_adapter *rtw_drv_if2_init(_adapter *primary_padapter, void (*set_intf_ops)(_adapter *primary_padapter,struct _io_ops *pops));\nvoid rtw_drv_if2_free(_adapter *if2);\nvoid rtw_drv_if2_stop(_adapter *if2);\n#ifdef CONFIG_MULTI_VIR_IFACES\nstruct dvobj_priv;\n_adapter *rtw_drv_add_vir_if(_adapter *primary_padapter, void (*set_intf_ops)(_adapter *primary_padapter,struct _io_ops *pops));\nvoid rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj);\nvoid rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj);\n#endif //CONFIG_MULTI_VIR_IFACES\n#endif\n\nvoid rtw_ndev_destructor(_nic_hdl ndev);\n\n#ifdef CONFIG_ARP_KEEP_ALIVE\nint\trtw_gw_addr_query(_adapter *padapter);\n#endif\n\nint rtw_suspend_common(_adapter *padapter);\nint rtw_resume_common(_adapter *padapter);\n\n#endif\t//_OSDEP_INTF_H_\n\n"
  },
  {
    "path": "include/osdep_service.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __OSDEP_SERVICE_H_\n#define __OSDEP_SERVICE_H_\n\n\n#define _FAIL\t\t0\n#define _SUCCESS\t1\n#define RTW_RX_HANDLED 2\n//#define RTW_STATUS_TIMEDOUT -110\n\n#undef _TRUE\n#define _TRUE\t\t1\n\n#undef _FALSE\n#define _FALSE\t\t0\n\n\n#ifdef PLATFORM_FREEBSD\n#include <osdep_service_bsd.h>\n#endif\n\n#ifdef PLATFORM_LINUX\n#include <osdep_service_linux.h>\n\n#include <linux/version.h>\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)\n#include <linux/sched/signal.h>\n#endif\n\n#endif\n\n#ifdef PLATFORM_OS_XP\n#include <osdep_service_xp.h>\n#endif\n\n#ifdef PLATFORM_OS_CE\n#include <osdep_service_ce.h>\n#endif\n\n#define RTW_TIMER_HDL_NAME(name) rtw_##name##_timer_hdl\n#define RTW_DECLARE_TIMER_HDL(name) void RTW_TIMER_HDL_NAME(name)(RTW_TIMER_HDL_ARGS)\n\n//#include <rtw_byteorder.h>\n\n#ifndef BIT\n\t#define BIT(x)\t( 1 << (x))\n#endif\n\n#define BIT0\t0x00000001\n#define BIT1\t0x00000002\n#define BIT2\t0x00000004\n#define BIT3\t0x00000008\n#define BIT4\t0x00000010\n#define BIT5\t0x00000020\n#define BIT6\t0x00000040\n#define BIT7\t0x00000080\n#define BIT8\t0x00000100\n#define BIT9\t0x00000200\n#define BIT10\t0x00000400\n#define BIT11\t0x00000800\n#define BIT12\t0x00001000\n#define BIT13\t0x00002000\n#define BIT14\t0x00004000\n#define BIT15\t0x00008000\n#define BIT16\t0x00010000\n#define BIT17\t0x00020000\n#define BIT18\t0x00040000\n#define BIT19\t0x00080000\n#define BIT20\t0x00100000\n#define BIT21\t0x00200000\n#define BIT22\t0x00400000\n#define BIT23\t0x00800000\n#define BIT24\t0x01000000\n#define BIT25\t0x02000000\n#define BIT26\t0x04000000\n#define BIT27\t0x08000000\n#define BIT28\t0x10000000\n#define BIT29\t0x20000000\n#define BIT30\t0x40000000\n#define BIT31\t0x80000000\n#define BIT32\t0x0100000000\n#define BIT33\t0x0200000000\n#define BIT34\t0x0400000000\n#define BIT35\t0x0800000000\n#define BIT36\t0x1000000000\n\nextern int RTW_STATUS_CODE(int error_code);\n\n#ifndef RTK_DMP_PLATFORM\n#define CONFIG_USE_VMALLOC\n#endif\n\n/* flags used for rtw_mstat_update() */\nenum mstat_f {\n\t/* type: 0x00ff */\n\tMSTAT_TYPE_VIR = 0x00,\n\tMSTAT_TYPE_PHY= 0x01,\n\tMSTAT_TYPE_SKB = 0x02,\n\tMSTAT_TYPE_USB = 0x03,\n\tMSTAT_TYPE_MAX = 0x04,\n\n\t/* func: 0xff00 */\n\tMSTAT_FUNC_UNSPECIFIED = 0x00<<8,\n\tMSTAT_FUNC_IO = 0x01<<8,\n\tMSTAT_FUNC_TX_IO = 0x02<<8,\n\tMSTAT_FUNC_RX_IO = 0x03<<8,\n\tMSTAT_FUNC_TX = 0x04<<8,\n\tMSTAT_FUNC_RX = 0x05<<8,\n\tMSTAT_FUNC_CFG_VENDOR = 0x06<<8,\n\tMSTAT_FUNC_MAX = 0x07<<8,\n};\n\n#define mstat_tf_idx(flags) ((flags)&0xff)\n#define mstat_ff_idx(flags) (((flags)&0xff00) >> 8)\n\ntypedef enum mstat_status{\n\tMSTAT_ALLOC_SUCCESS = 0,\n\tMSTAT_ALLOC_FAIL,\n\tMSTAT_FREE\n} MSTAT_STATUS;\n\n#ifdef DBG_MEM_ALLOC\nvoid rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz);\nvoid rtw_mstat_dump (void *sel);\nu8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);\nu8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);\nvoid dbg_rtw_vmfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line);\nu8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line);\nu8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line);\nvoid dbg_rtw_mfree(u8 *pbuf, const enum mstat_f flags, u32 sz, const char *func, const int line);\n\nstruct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, const int line);\nvoid dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);\nstruct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);\nstruct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line);\nint dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line);\nvoid dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line);\n#ifdef CONFIG_USB_HCI\nvoid *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, const int line);\nvoid dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, const int line);\n#endif /* CONFIG_USB_HCI */\n\n#ifdef CONFIG_USE_VMALLOC\n#define rtw_vmalloc(sz)\t\t\tdbg_rtw_vmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#define rtw_zvmalloc(sz)\t\t\tdbg_rtw_zvmalloc((sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#define rtw_vmfree(pbuf, sz)\t\tdbg_rtw_vmfree((pbuf), (sz), MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#define rtw_vmalloc_f(sz, mstat_f)\t\t\tdbg_rtw_vmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#define rtw_zvmalloc_f(sz, mstat_f)\t\tdbg_rtw_zvmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#define rtw_vmfree_f(pbuf, sz, mstat_f)\tdbg_rtw_vmfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_VIR, __FUNCTION__, __LINE__)\n#else /* CONFIG_USE_VMALLOC */\n#define rtw_vmalloc(sz)\t\t\tdbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_zvmalloc(sz)\t\t\tdbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_vmfree(pbuf, sz)\t\tdbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_vmalloc_f(sz, mstat_f)\t\t\tdbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_zvmalloc_f(sz, mstat_f)\t\tdbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_vmfree_f(pbuf, sz, mstat_f)\tdbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#endif /* CONFIG_USE_VMALLOC */\n#define rtw_malloc(sz)\t\t\tdbg_rtw_malloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_zmalloc(sz)\t\t\tdbg_rtw_zmalloc((sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_mfree(pbuf, sz)\t\tdbg_rtw_mfree((pbuf), (sz), MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_malloc_f(sz, mstat_f)\t\t\tdbg_rtw_malloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_zmalloc_f(sz, mstat_f)\t\t\tdbg_rtw_zmalloc((sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n#define rtw_mfree_f(pbuf, sz, mstat_f)\t\tdbg_rtw_mfree((pbuf), (sz), ((mstat_f)&0xff00)|MSTAT_TYPE_PHY, __FUNCTION__, __LINE__)\n\n#define rtw_skb_alloc(size)\tdbg_rtw_skb_alloc((size), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_free(skb)\tdbg_rtw_skb_free((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_alloc_f(size, mstat_f)\tdbg_rtw_skb_alloc((size), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_free_f(skb, mstat_f)\tdbg_rtw_skb_free((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_copy(skb)\tdbg_rtw_skb_copy((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_clone(skb)\tdbg_rtw_skb_clone((skb), MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_copy_f(skb, mstat_f)\tdbg_rtw_skb_copy((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_clone_f(skb, mstat_f)\tdbg_rtw_skb_clone((skb), ((mstat_f)&0xff00)|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_netif_rx(ndev, skb)\tdbg_rtw_netif_rx(ndev, skb, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#define rtw_skb_queue_purge(sk_buff_head) dbg_rtw_skb_queue_purge(sk_buff_head, MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#ifdef CONFIG_USB_HCI\n#define rtw_usb_buffer_alloc(dev, size, dma)\t\tdbg_rtw_usb_buffer_alloc((dev), (size), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__)\n#define rtw_usb_buffer_free(dev, size, addr, dma)\tdbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), MSTAT_TYPE_USB, __FUNCTION__, __LINE__)\n#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f)\t\t\tdbg_rtw_usb_buffer_alloc((dev), (size), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__)\n#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f)\tdbg_rtw_usb_buffer_free((dev), (size), (addr), (dma), ((mstat_f)&0xff00)|MSTAT_TYPE_USB, __FUNCTION__, __LINE__)\n#endif /* CONFIG_USB_HCI */\n\n#else /* DBG_MEM_ALLOC */\n#define rtw_mstat_update(flag, status, sz) do {} while(0)\n#define rtw_mstat_dump(sel) do {} while(0)\nu8*\t_rtw_vmalloc(u32 sz);\nu8*\t_rtw_zvmalloc(u32 sz);\nvoid\t_rtw_vmfree(u8 *pbuf, u32 sz);\nu8*\t_rtw_zmalloc(u32 sz);\nu8*\t_rtw_malloc(u32 sz);\nvoid\t_rtw_mfree(u8 *pbuf, u32 sz);\n\nstruct sk_buff *_rtw_skb_alloc(u32 sz);\nvoid _rtw_skb_free(struct sk_buff *skb);\nstruct sk_buff *_rtw_skb_copy(const struct sk_buff *skb);\nstruct sk_buff *_rtw_skb_clone(struct sk_buff *skb);\nint _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb);\nvoid _rtw_skb_queue_purge(struct sk_buff_head *list);\n\n#ifdef CONFIG_USB_HCI\nvoid *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma);\nvoid _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma);\n#endif /* CONFIG_USB_HCI */\n\n#ifdef CONFIG_USE_VMALLOC\n#define rtw_vmalloc(sz)\t\t\t_rtw_vmalloc((sz))\n#define rtw_zvmalloc(sz)\t\t\t_rtw_zvmalloc((sz))\n#define rtw_vmfree(pbuf, sz)\t\t_rtw_vmfree((pbuf), (sz))\n#define rtw_vmalloc_f(sz, mstat_f)\t\t\t_rtw_vmalloc((sz))\n#define rtw_zvmalloc_f(sz, mstat_f)\t\t_rtw_zvmalloc((sz))\n#define rtw_vmfree_f(pbuf, sz, mstat_f)\t_rtw_vmfree((pbuf), (sz))\n#else /* CONFIG_USE_VMALLOC */\n#define rtw_vmalloc(sz)\t\t\t_rtw_malloc((sz))\n#define rtw_zvmalloc(sz)\t\t\t_rtw_zmalloc((sz))\n#define rtw_vmfree(pbuf, sz)\t\t_rtw_mfree((pbuf), (sz))\n#define rtw_vmalloc_f(sz, mstat_f)\t\t\t_rtw_malloc((sz))\n#define rtw_zvmalloc_f(sz, mstat_f)\t\t_rtw_zmalloc((sz))\n#define rtw_vmfree_f(pbuf, sz, mstat_f)\t_rtw_mfree((pbuf), (sz))\n#endif /* CONFIG_USE_VMALLOC */\n#define rtw_malloc(sz)\t\t\t_rtw_malloc((sz))\n#define rtw_zmalloc(sz)\t\t\t_rtw_zmalloc((sz))\n#define rtw_mfree(pbuf, sz)\t\t_rtw_mfree((pbuf), (sz))\n#define rtw_malloc_f(sz, mstat_f)\t\t\t_rtw_malloc((sz))\n#define rtw_zmalloc_f(sz, mstat_f)\t\t\t_rtw_zmalloc((sz))\n#define rtw_mfree_f(pbuf, sz, mstat_f)\t\t_rtw_mfree((pbuf), (sz))\n\n#define rtw_skb_alloc(size) _rtw_skb_alloc((size))\n#define rtw_skb_free(skb) _rtw_skb_free((skb))\n#define rtw_skb_alloc_f(size, mstat_f)\t_rtw_skb_alloc((size))\n#define rtw_skb_free_f(skb, mstat_f)\t_rtw_skb_free((skb))\n#define rtw_skb_copy(skb)\t_rtw_skb_copy((skb))\n#define rtw_skb_clone(skb)\t_rtw_skb_clone((skb))\n#define rtw_skb_copy_f(skb, mstat_f)\t_rtw_skb_copy((skb))\n#define rtw_skb_clone_f(skb, mstat_f)\t_rtw_skb_clone((skb))\n#define rtw_netif_rx(ndev, skb) _rtw_netif_rx(ndev, skb)\n#define rtw_skb_queue_purge(sk_buff_head) _rtw_skb_queue_purge(sk_buff_head)\n#ifdef CONFIG_USB_HCI\n#define rtw_usb_buffer_alloc(dev, size, dma) _rtw_usb_buffer_alloc((dev), (size), (dma))\n#define rtw_usb_buffer_free(dev, size, addr, dma) _rtw_usb_buffer_free((dev), (size), (addr), (dma))\n#define rtw_usb_buffer_alloc_f(dev, size, dma, mstat_f) _rtw_usb_buffer_alloc((dev), (size), (dma))\n#define rtw_usb_buffer_free_f(dev, size, addr, dma, mstat_f) _rtw_usb_buffer_free((dev), (size), (addr), (dma))\n#endif /* CONFIG_USB_HCI */\n#endif /* DBG_MEM_ALLOC */\n\nextern void*\trtw_malloc2d(int h, int w, size_t size);\nextern void\trtw_mfree2d(void *pbuf, int h, int w, int size);\n\nextern void\t_rtw_memcpy(void *dec, const void *sour, u32 sz);\nextern int\t_rtw_memcmp(void *dst, void *src, u32 sz);\nextern void\t_rtw_memset(void *pbuf, int c, u32 sz);\n\nextern void\t_rtw_init_listhead(_list *list);\nextern u32\trtw_is_list_empty(_list *phead);\nextern void\trtw_list_insert_head(_list *plist, _list *phead);\nextern void\trtw_list_insert_tail(_list *plist, _list *phead);\n#ifndef PLATFORM_FREEBSD\nextern void\trtw_list_delete(_list *plist);\n#endif //PLATFORM_FREEBSD\n\nextern void\t_rtw_init_sema(_sema *sema, int init_val);\nextern void\t_rtw_free_sema(_sema\t*sema);\nextern void\t_rtw_up_sema(_sema\t*sema);\nextern u32\t_rtw_down_sema(_sema *sema);\nextern void\t_rtw_mutex_init(_mutex *pmutex);\nextern void\t_rtw_mutex_free(_mutex *pmutex);\n#ifndef PLATFORM_FREEBSD\nextern void\t_rtw_spinlock_init(_lock *plock);\n#endif //PLATFORM_FREEBSD\nextern void\t_rtw_spinlock_free(_lock *plock);\nextern void\t_rtw_spinlock(_lock\t*plock);\nextern void\t_rtw_spinunlock(_lock\t*plock);\nextern void\t_rtw_spinlock_ex(_lock\t*plock);\nextern void\t_rtw_spinunlock_ex(_lock\t*plock);\n\nextern void\t_rtw_init_queue(_queue\t*pqueue);\nextern u32\t_rtw_queue_empty(_queue\t*pqueue);\nextern u32\trtw_end_of_queue_search(_list *queue, _list *pelement);\n\nextern u32\trtw_get_current_time(void);\nextern u32\trtw_systime_to_ms(u32 systime);\nextern u32\trtw_ms_to_systime(u32 ms);\nextern s32\trtw_get_passing_time_ms(u32 start);\nextern s32\trtw_get_time_interval_ms(u32 start, u32 end);\n\nextern void\trtw_sleep_schedulable(int ms);\n\nextern void\trtw_msleep_os(int ms);\nextern void\trtw_usleep_os(int us);\n\nextern u32 \trtw_atoi(u8* s);\n\n#ifdef DBG_DELAY_OS\n#define rtw_mdelay_os(ms) _rtw_mdelay_os((ms), __FUNCTION__, __LINE__)\n#define rtw_udelay_os(ms) _rtw_udelay_os((ms), __FUNCTION__, __LINE__)\nextern void _rtw_mdelay_os(int ms, const char *func, const int line);\nextern void _rtw_udelay_os(int us, const char *func, const int line);\n#else\nextern void\trtw_mdelay_os(int ms);\nextern void\trtw_udelay_os(int us);\n#endif\n\nextern void rtw_yield_os(void);\n\n\nextern void rtw_init_timer(_timer *ptimer, void *padapter, void *pfunc);\n\n\n__inline static unsigned char _cancel_timer_ex(_timer *ptimer)\n{\n#ifdef PLATFORM_LINUX\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\treturn del_timer_sync(&ptimer->t);\n#else\n\treturn del_timer_sync(ptimer);\n#endif\n#endif\n#ifdef PLATFORM_FREEBSD\n\t_cancel_timer(ptimer,0);\n\treturn 0;\n#endif\n#ifdef PLATFORM_WINDOWS\n\tu8 bcancelled;\n\t\n\t_cancel_timer(ptimer, &bcancelled);\n\t\n\treturn bcancelled;\n#endif\n}\n\nstatic __inline void thread_enter(char *name)\n{\n#ifdef PLATFORM_LINUX\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))\n\tdaemonize(\"%s\", name);\n\t#endif\n\tallow_signal(SIGTERM);\n#endif\n#ifdef PLATFORM_FREEBSD\n\tprintf(\"%s\", \"RTKTHREAD_enter\");\n#endif\n}\n\n__inline static void flush_signals_thread(void) \n{\n#ifdef PLATFORM_LINUX\n\tif (signal_pending (current)) \n\t{\n\t\tflush_signals(current);\n\t}\n#endif\n}\n\n__inline static _OS_STATUS res_to_status(sint res)\n{\n\n#if defined (PLATFORM_LINUX) || defined (PLATFORM_MPIXEL) || defined (PLATFORM_FREEBSD)\n\treturn res;\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n\tif (res == _SUCCESS)\n\t\treturn NDIS_STATUS_SUCCESS;\n\telse\n\t\treturn NDIS_STATUS_FAILURE;\n\n#endif\t\n\t\n}\n\n__inline static void rtw_dump_stack(void)\n{\n#ifdef PLATFORM_LINUX\n\tdump_stack();\n#endif\n}\n\n#ifdef PLATFORM_LINUX\n#define rtw_warn_on(condition) WARN_ON(condition)\n#else\n#define rtw_warn_on(condition) do {} while (0)\n#endif\n\n__inline static int rtw_bug_check(void *parg1, void *parg2, void *parg3, void *parg4)\n{\n\tint ret = _TRUE;\n\n#ifdef PLATFORM_WINDOWS\n\tif ( ((uint)parg1) <= 0x7fffffff || \n\t \t((uint)parg2) <= 0x7fffffff ||\n\t \t((uint)parg3) <= 0x7fffffff ||\n\t \t((uint)parg4) <= 0x7fffffff)\n\t{\n\t\tret = _FALSE;\n\t\tKeBugCheckEx(0x87110000, (ULONG_PTR)parg1, (ULONG_PTR)parg2, (ULONG_PTR)parg3, (ULONG_PTR)parg4);\t\t\n\t}\n#endif\n\n\treturn ret;\n\n}\n\n#define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r))\n#define RND4(x)\t(((x >> 2) + (((x & 3) == 0) ?  0: 1)) << 2)\n\n__inline static u32 _RND4(u32 sz)\n{\n\n\tu32\tval;\n\n\tval = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2;\n\t\n\treturn val;\n\n}\n\n__inline static u32 _RND8(u32 sz)\n{\n\n\tu32\tval;\n\n\tval = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3;\n\t\n\treturn val;\n\n}\n\n__inline static u32 _RND128(u32 sz)\n{\n\n\tu32\tval;\n\n\tval = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7;\n\t\n\treturn val;\n\n}\n\n__inline static u32 _RND256(u32 sz)\n{\n\n\tu32\tval;\n\n\tval = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8;\n\t\n\treturn val;\n\n}\n\n__inline static u32 _RND512(u32 sz)\n{\n\n\tu32\tval;\n\n\tval = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9;\n\t\n\treturn val;\n\n}\n\n__inline static u32 bitshift(u32 bitmask)\n{\n\tu32 i;\n\n\tfor (i = 0; i <= 31; i++)\n\t\tif (((bitmask>>i) &  0x1) == 1) break;\n\n\treturn i;\n}\n\n#define rtw_min(a, b) ((a>b)?b:a)\n#define rtw_is_range_a_in_b(hi_a, lo_a, hi_b, lo_b) (((hi_a) <= (hi_b)) && ((lo_a) >= (lo_b)))\n#define rtw_is_range_overlap(hi_a, lo_a, hi_b, lo_b) (((hi_a) > (lo_b)) && ((lo_a) < (hi_b)))\n\n#ifndef MAC_FMT\n#define MAC_FMT \"%02x:%02x:%02x:%02x:%02x:%02x\"\n#endif\n#ifndef MAC_ARG\n#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]\n#endif\n\n\nextern void rtw_suspend_lock_init(void);\nextern void rtw_suspend_lock_uninit(void);\nextern void rtw_lock_suspend(void);\nextern void rtw_unlock_suspend(void);\nextern void rtw_lock_suspend_timeout(u32 timeout_ms);\nextern void rtw_lock_ext_suspend_timeout(u32 timeout_ms);\nextern void rtw_lock_rx_suspend_timeout(u32 timeout_ms);\nextern void rtw_lock_traffic_suspend_timeout(u32 timeout_ms);\nextern void rtw_lock_resume_scan_timeout(u32 timeout_ms);\nextern void rtw_resume_lock_suspend(void);\nextern void rtw_resume_unlock_suspend(void);\n#ifdef CONFIG_AP_WOWLAN\nextern void rtw_softap_lock_suspend(void);\nextern void rtw_softap_unlock_suspend(void);\n#endif\n\nextern void ATOMIC_SET(ATOMIC_T *v, int i);\nextern int ATOMIC_READ(ATOMIC_T *v);\nextern void ATOMIC_ADD(ATOMIC_T *v, int i);\nextern void ATOMIC_SUB(ATOMIC_T *v, int i);\nextern void ATOMIC_INC(ATOMIC_T *v);\nextern void ATOMIC_DEC(ATOMIC_T *v);\nextern int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i);\nextern int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i);\nextern int ATOMIC_INC_RETURN(ATOMIC_T *v);\nextern int ATOMIC_DEC_RETURN(ATOMIC_T *v);\n\n//File operation APIs, just for linux now\nextern int rtw_is_file_readable(char *path);\nextern int rtw_retrieve_from_file(char *path, u8 *buf, u32 sz);\nextern int rtw_store_to_file(char *path, u8* buf, u32 sz);\n\n\n#ifndef PLATFORM_FREEBSD\nextern void rtw_free_netdev(struct net_device * netdev);\n#endif //PLATFORM_FREEBSD\n\n\nextern u64 rtw_modular64(u64 x, u64 y);\nextern u64 rtw_division64(u64 x, u64 y);\nextern u32 rtw_random32(void);\n\n/* Macros for handling unaligned memory accesses */\n\n#define RTW_GET_BE16(a) ((u16) (((a)[0] << 8) | (a)[1]))\n#define RTW_PUT_BE16(a, val)\t\t\t\\\n\tdo {\t\t\t\t\t\\\n\t\t(a)[0] = ((u16) (val)) >> 8;\t\\\n\t\t(a)[1] = ((u16) (val)) & 0xff;\t\\\n\t} while (0)\n\n#define RTW_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0]))\n#define RTW_PUT_LE16(a, val)\t\t\t\\\n\tdo {\t\t\t\t\t\\\n\t\t(a)[1] = ((u16) (val)) >> 8;\t\\\n\t\t(a)[0] = ((u16) (val)) & 0xff;\t\\\n\t} while (0)\n\n#define RTW_GET_BE24(a) ((((u32) (a)[0]) << 16) | (((u32) (a)[1]) << 8) | \\\n\t\t\t ((u32) (a)[2]))\t\t\t \n#define RTW_PUT_BE24(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[2] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define RTW_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \\\n\t\t\t (((u32) (a)[2]) << 8) | ((u32) (a)[3]))\t\t\t \n#define RTW_PUT_BE32(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[3] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define RTW_GET_LE32(a) ((((u32) (a)[3]) << 24) | (((u32) (a)[2]) << 16) | \\\n\t\t\t (((u32) (a)[1]) << 8) | ((u32) (a)[0]))\t\t\t \n#define RTW_PUT_LE32(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);\t\\\n\t\t(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[0] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define RTW_GET_BE64(a) ((((u64) (a)[0]) << 56) | (((u64) (a)[1]) << 48) | \\\n\t\t\t (((u64) (a)[2]) << 40) | (((u64) (a)[3]) << 32) | \\\n\t\t\t (((u64) (a)[4]) << 24) | (((u64) (a)[5]) << 16) | \\\n\t\t\t (((u64) (a)[6]) << 8) | ((u64) (a)[7]))\t\t\t \n#define RTW_PUT_BE64(a, val)\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) (((u64) (val)) >> 56);\t\\\n\t\t(a)[1] = (u8) (((u64) (val)) >> 48);\t\\\n\t\t(a)[2] = (u8) (((u64) (val)) >> 40);\t\\\n\t\t(a)[3] = (u8) (((u64) (val)) >> 32);\t\\\n\t\t(a)[4] = (u8) (((u64) (val)) >> 24);\t\\\n\t\t(a)[5] = (u8) (((u64) (val)) >> 16);\t\\\n\t\t(a)[6] = (u8) (((u64) (val)) >> 8);\t\\\n\t\t(a)[7] = (u8) (((u64) (val)) & 0xff);\t\\\n\t} while (0)\n\n#define RTW_GET_LE64(a) ((((u64) (a)[7]) << 56) | (((u64) (a)[6]) << 48) | \\\n\t\t\t (((u64) (a)[5]) << 40) | (((u64) (a)[4]) << 32) | \\\n\t\t\t (((u64) (a)[3]) << 24) | (((u64) (a)[2]) << 16) | \\\n\t\t\t (((u64) (a)[1]) << 8) | ((u64) (a)[0]))\n\nvoid rtw_buf_free(u8 **buf, u32 *buf_len);\nvoid rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len);\n\nstruct rtw_cbuf {\n\tu32 write;\n\tu32 read;\n\tu32 size;\n\tvoid *bufs[0];\n};\n\nbool rtw_cbuf_full(struct rtw_cbuf *cbuf);\nbool rtw_cbuf_empty(struct rtw_cbuf *cbuf);\nbool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf);\nvoid *rtw_cbuf_pop(struct rtw_cbuf *cbuf);\nstruct rtw_cbuf *rtw_cbuf_alloc(u32 size);\nvoid rtw_cbuf_free(struct rtw_cbuf *cbuf);\n\n// String handler\n/*\n * Write formatted output to sized buffer\n */\n#ifdef PLATFORM_LINUX\n#define rtw_sprintf(buf, size, format, arg...)\tsnprintf(buf, size, format, ##arg)\n#else // !PLATFORM_LINUX\n#error \"NOT DEFINE \\\"rtw_sprintf\\\"!!\"\n#endif // !PLATFORM_LINUX\n\n#endif\n\n\n"
  },
  {
    "path": "include/osdep_service_bsd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __OSDEP_BSD_SERVICE_H_\n#define __OSDEP_BSD_SERVICE_H_\n\n\n#include <sys/cdefs.h>\n#include <sys/types.h>\n#include <sys/systm.h>\n#include <sys/param.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/lock.h>\n#include <sys/mutex.h>\n#include <sys/mbuf.h>\n#include <sys/kernel.h>\n#include <sys/socket.h>\n#include <sys/systm.h>\n#include <sys/malloc.h>\n#include <sys/module.h>\n#include <sys/bus.h>\n#include <sys/endian.h>\n#include <sys/kdb.h>\n#include <sys/kthread.h>\n#include <sys/malloc.h>\n#include <sys/time.h>\n#include <machine/atomic.h>\n#include <machine/bus.h>\n#include <machine/resource.h>\n#include <sys/rman.h>\n\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_arp.h>\n#include <net/ethernet.h>\n#include <net/if_dl.h>\n#include <net/if_media.h>\n#include <net/if_types.h>\n#include <net/route.h>\n\n\n#include <netinet/in.h>\n#include <netinet/in_systm.h>\n#include <netinet/in_var.h>\n#include <netinet/if_ether.h>\n#include <if_ether.h>\n\n#include <net80211/ieee80211_var.h>\n#include <net80211/ieee80211_regdomain.h>\n#include <net80211/ieee80211_radiotap.h>\n#include <net80211/ieee80211_ratectl.h>\n\n#include <dev/usb/usb.h>\n#include <dev/usb/usbdi.h>\n#include \"usbdevs.h\"\n\n#define\tUSB_DEBUG_VAR rum_debug\n#include <dev/usb/usb_debug.h>\n\n#if 1 //Baron porting from linux, it's all temp solution, needs to check again\n#include <sys/sema.h>\n#include <sys/pcpu.h> /* XXX for PCPU_GET */\n//\ttypedef struct \tsemaphore _sema;\n\ttypedef struct \tsema _sema;\n//\ttypedef\tspinlock_t\t_lock;\n\ttypedef\tstruct mtx\t_lock;\n\ttypedef struct mtx \t\t_mutex;\n\ttypedef struct timer_list _timer;\n\tstruct list_head {\n\tstruct list_head *next, *prev;\n\t};\n\tstruct\t__queue\t{\n\t\tstruct\tlist_head\tqueue;\t\n\t\t_lock\tlock;\n\t};\n\n\t//typedef\tstruct sk_buff\t_pkt;\n\ttypedef\tstruct mbuf\t_pkt;\n\ttypedef struct mbuf\t_buffer;\n\t\n\ttypedef struct\t__queue\t_queue;\n\ttypedef struct\tlist_head\t_list;\n\ttypedef\tint\t_OS_STATUS;\n\t//typedef u32\t_irqL;\n\ttypedef unsigned long _irqL;\n\ttypedef\tstruct\tifnet * _nic_hdl;\n\t\n\ttypedef pid_t\t\t_thread_hdl_;\n//\ttypedef struct thread\t\t_thread_hdl_;\n\ttypedef void\t\tthread_return;\n\ttypedef void*\tthread_context;\n\n\t//#define thread_exit() complete_and_exit(NULL, 0)\n\n\t#define thread_exit() do{printf(\"%s\", \"RTKTHREAD_exit\");}while(0)\n\n\ttypedef void timer_hdl_return;\n\ttypedef void* timer_hdl_context;\n\ttypedef struct work_struct _workitem;\n\n#define   KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))\n/* emulate a modern version */\n#define LINUX_VERSION_CODE KERNEL_VERSION(2, 6, 35)\n\n#define WIRELESS_EXT -1\n#define HZ hz\n#define spin_lock_irqsave mtx_lock_irqsave\n#define spin_lock_bh mtx_lock_irqsave\n#define mtx_lock_irqsave(lock, x) mtx_lock(lock)//{local_irq_save((x)); mtx_lock_spin((lock));}\n//#define IFT_RTW\t0xf9 //ifnet allocate type for RTW\n#define free_netdev if_free\n#define LIST_CONTAINOR(ptr, type, member) \\\n        ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))\n#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n))\n/* \n * Linux timers are emulated using FreeBSD callout functions\n * (and taskqueue functionality).\n *\n * Currently no timer stats functionality.\n *\n * See (linux_compat) processes.c\n *\n */\nstruct timer_list {\n\n        /* FreeBSD callout related fields */\n        struct callout callout;\n\n \t//timeout function\n        void (*function)(void*);\n\t//argument\n\t void *arg;\n        \n};\nstruct workqueue_struct;\nstruct work_struct;\ntypedef void (*work_func_t)(struct work_struct *work);\n/* Values for the state of an item of work (work_struct) */\ntypedef enum work_state {\n        WORK_STATE_UNSET = 0,\n        WORK_STATE_CALLOUT_PENDING = 1,\n        WORK_STATE_TASK_PENDING = 2,\n        WORK_STATE_WORK_CANCELLED = 3        \n} work_state_t;\n\nstruct work_struct {\n        struct task task; /* FreeBSD task */\n        work_state_t state; /* the pending or otherwise state of work. */\n        work_func_t func;       \n};\n#define spin_unlock_irqrestore mtx_unlock_irqrestore\n#define spin_unlock_bh mtx_unlock_irqrestore\n#define mtx_unlock_irqrestore(lock,x)    mtx_unlock(lock);\nextern void\t_rtw_spinlock_init(_lock *plock);\n\n//modify private structure to match freebsd\n#define BITS_PER_LONG 32\nunion ktime {\n\ts64\ttv64;\n#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)\n\tstruct {\n#ifdef __BIG_ENDIAN\n\ts32\tsec, nsec;\n#else\n\ts32\tnsec, sec;\n#endif\n\t} tv;\n#endif\n};\n#define kmemcheck_bitfield_begin(name)\n#define kmemcheck_bitfield_end(name)\n#define CHECKSUM_NONE 0\ntypedef unsigned char *sk_buff_data_t;\ntypedef union ktime ktime_t;\t\t/* Kill this */\n\nvoid rtw_mtx_lock(_lock *plock);\n\t\nvoid rtw_mtx_unlock(_lock *plock);\n\n/** \n *\tstruct sk_buff - socket buffer\n *\t@next: Next buffer in list\n *\t@prev: Previous buffer in list\n *\t@sk: Socket we are owned by\n *\t@tstamp: Time we arrived\n *\t@dev: Device we arrived on/are leaving by\n *\t@transport_header: Transport layer header\n *\t@network_header: Network layer header\n *\t@mac_header: Link layer header\n *\t@_skb_refdst: destination entry (with norefcount bit)\n *\t@sp: the security path, used for xfrm\n *\t@cb: Control buffer. Free for use by every layer. Put private vars here\n *\t@len: Length of actual data\n *\t@data_len: Data length\n *\t@mac_len: Length of link layer header\n *\t@hdr_len: writable header length of cloned skb\n *\t@csum: Checksum (must include start/offset pair)\n *\t@csum_start: Offset from skb->head where checksumming should start\n *\t@csum_offset: Offset from csum_start where checksum should be stored\n *\t@local_df: allow local fragmentation\n *\t@cloned: Head may be cloned (check refcnt to be sure)\n *\t@nohdr: Payload reference only, must not modify header\n *\t@pkt_type: Packet class\n *\t@fclone: skbuff clone status\n *\t@ip_summed: Driver fed us an IP checksum\n *\t@priority: Packet queueing priority\n *\t@users: User count - see {datagram,tcp}.c\n *\t@protocol: Packet protocol from driver\n *\t@truesize: Buffer size \n *\t@head: Head of buffer\n *\t@data: Data head pointer\n *\t@tail: Tail pointer\n *\t@end: End pointer\n *\t@destructor: Destruct function\n *\t@mark: Generic packet mark\n *\t@nfct: Associated connection, if any\n *\t@ipvs_property: skbuff is owned by ipvs\n *\t@peeked: this packet has been seen already, so stats have been\n *\t\tdone for it, don't do them again\n *\t@nf_trace: netfilter packet trace flag\n *\t@nfctinfo: Relationship of this skb to the connection\n *\t@nfct_reasm: netfilter conntrack re-assembly pointer\n *\t@nf_bridge: Saved data about a bridged frame - see br_netfilter.c\n *\t@skb_iif: ifindex of device we arrived on\n *\t@rxhash: the packet hash computed on receive\n *\t@queue_mapping: Queue mapping for multiqueue devices\n *\t@tc_index: Traffic control index\n *\t@tc_verd: traffic control verdict\n *\t@ndisc_nodetype: router type (from link layer)\n *\t@dma_cookie: a cookie to one of several possible DMA operations\n *\t\tdone by skb DMA functions\n *\t@secmark: security marking\n *\t@vlan_tci: vlan tag control information\n */\n\nstruct sk_buff {\n\t/* These two members must be first. */\n\tstruct sk_buff\t\t*next;\n\tstruct sk_buff\t\t*prev;\n\n\tktime_t\t\t\ttstamp;\n\n\tstruct sock\t\t*sk;\n\t//struct net_device\t*dev;\n\tstruct ifnet *dev;\n\n\t/*\n\t * This is the control buffer. It is free to use for every\n\t * layer. Please put your private variables there. If you\n\t * want to keep them across layers you have to do a skb_clone()\n\t * first. This is owned by whoever has the skb queued ATM.\n\t */\n\tchar\t\t\tcb[48] __aligned(8);\n\n\tunsigned long\t\t_skb_refdst;\n#ifdef CONFIG_XFRM\n\tstruct\tsec_path\t*sp;\n#endif\n\tunsigned int\t\tlen,\n\t\t\t\tdata_len;\n\tu16\t\t\tmac_len,\n\t\t\t\thdr_len;\n\tunion {\n\t\tu32\t\tcsum;\n\t\tstruct {\n\t\t\tu16\tcsum_start;\n\t\t\tu16\tcsum_offset;\n\t\t}smbol2;\n\t}smbol1;\n\tu32\t\t\tpriority;\n\tkmemcheck_bitfield_begin(flags1);\n\tu8\t\t\tlocal_df:1,\n\t\t\t\tcloned:1,\n\t\t\t\tip_summed:2,\n\t\t\t\tnohdr:1,\n\t\t\t\tnfctinfo:3;\n\tu8\t\t\tpkt_type:3,\n\t\t\t\tfclone:2,\n\t\t\t\tipvs_property:1,\n\t\t\t\tpeeked:1,\n\t\t\t\tnf_trace:1;\n\tkmemcheck_bitfield_end(flags1);\n\tu16\t\t\tprotocol;\n\n\tvoid\t\t\t(*destructor)(struct sk_buff *skb);\n#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)\n\tstruct nf_conntrack\t*nfct;\n\tstruct sk_buff\t\t*nfct_reasm;\n#endif\n#ifdef CONFIG_BRIDGE_NETFILTER\n\tstruct nf_bridge_info\t*nf_bridge;\n#endif\n\n\tint\t\t\tskb_iif;\n#ifdef CONFIG_NET_SCHED\n\tu16\t\t\ttc_index;\t/* traffic control index */\n#ifdef CONFIG_NET_CLS_ACT\n\tu16\t\t\ttc_verd;\t/* traffic control verdict */\n#endif\n#endif\n\n\tu32\t\t\trxhash;\n\n\tkmemcheck_bitfield_begin(flags2);\n\tu16\t\t\tqueue_mapping:16;\n#ifdef CONFIG_IPV6_NDISC_NODETYPE\n\tu8\t\t\tndisc_nodetype:2,\n\t\t\t\tdeliver_no_wcard:1;\n#else\n\tu8\t\t\tdeliver_no_wcard:1;\n#endif\n\tkmemcheck_bitfield_end(flags2);\n\n\t/* 0/14 bit hole */\n\n#ifdef CONFIG_NET_DMA\n\tdma_cookie_t\t\tdma_cookie;\n#endif\n#ifdef CONFIG_NETWORK_SECMARK\n\tu32\t\t\tsecmark;\n#endif\n\tunion {\n\t\tu32\t\tmark;\n\t\tu32\t\tdropcount;\n\t}symbol3;\n\n\tu16\t\t\tvlan_tci;\n\n\tsk_buff_data_t\t\ttransport_header;\n\tsk_buff_data_t\t\tnetwork_header;\n\tsk_buff_data_t\t\tmac_header;\n\t/* These elements must be at the end, see alloc_skb() for details.  */\n\tsk_buff_data_t\t\ttail;\n\tsk_buff_data_t\t\tend;\n\tunsigned char\t\t*head,\n\t\t\t\t*data;\n\tunsigned int\t\ttruesize;\n\tatomic_t\t\tusers;\n};\nstruct sk_buff_head {\n\t/* These two members must be first. */\n\tstruct sk_buff\t*next;\n\tstruct sk_buff\t*prev;\n\n\tu32\t\tqlen;\n\t_lock\tlock;\n};\n#define skb_tail_pointer(skb)\tskb->tail\nstatic inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len)\n{\n\tunsigned char *tmp = skb_tail_pointer(skb);\n\t//SKB_LINEAR_ASSERT(skb);\n\tskb->tail += len;\n\tskb->len  += len;\n\treturn tmp;\n}\n\nstatic inline unsigned char *__skb_pull(struct sk_buff *skb, unsigned int len)\n{\n\tskb->len -= len;\n\tif(skb->len < skb->data_len)\n\t\tprintf(\"%s(),%d,error!\\n\",__FUNCTION__,__LINE__);\n\treturn skb->data += len;\n}\nstatic inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len)\n{\n\t#ifdef PLATFORM_FREEBSD\n\treturn __skb_pull(skb, len);\n\t#else\n\treturn unlikely(len > skb->len) ? NULL : __skb_pull(skb, len);\n\t#endif //PLATFORM_FREEBSD\n}\nstatic inline u32 skb_queue_len(const struct sk_buff_head *list_)\n{\n\treturn list_->qlen;\n}\nstatic inline void __skb_insert(struct sk_buff *newsk,\n\t\t\t\tstruct sk_buff *prev, struct sk_buff *next,\n\t\t\t\tstruct sk_buff_head *list)\n{\n\tnewsk->next = next;\n\tnewsk->prev = prev;\n\tnext->prev  = prev->next = newsk;\n\tlist->qlen++;\n}\nstatic inline void __skb_queue_before(struct sk_buff_head *list,\n\t\t\t\t      struct sk_buff *next,\n\t\t\t\t      struct sk_buff *newsk)\n{\n\t__skb_insert(newsk, next->prev, next, list);\n}\nstatic inline void skb_queue_tail(struct sk_buff_head *list,\n\t\t\t\t   struct sk_buff *newsk)\n{\n\tmtx_lock(&list->lock);\n\t__skb_queue_before(list, (struct sk_buff *)list, newsk);\n\tmtx_unlock(&list->lock);\n}\nstatic inline struct sk_buff *skb_peek(struct sk_buff_head *list_)\n{\n\tstruct sk_buff *list = ((struct sk_buff *)list_)->next;\n\tif (list == (struct sk_buff *)list_)\n\t\tlist = NULL;\n\treturn list;\n}\nstatic inline void __skb_unlink(struct sk_buff *skb, struct sk_buff_head *list)\n{\n\tstruct sk_buff *next, *prev;\n\n\tlist->qlen--;\n\tnext\t   = skb->next;\n\tprev\t   = skb->prev;\n\tskb->next  = skb->prev = NULL;\n\tnext->prev = prev;\n\tprev->next = next;\n}\n\nstatic inline struct sk_buff *skb_dequeue(struct sk_buff_head *list)\n{\n\tmtx_lock(&list->lock);\n\n\tstruct sk_buff *skb = skb_peek(list);\n\tif (skb)\n\t\t__skb_unlink(skb, list);\n\n\tmtx_unlock(&list->lock);\n\n\treturn skb;\n}\nstatic inline void skb_reserve(struct sk_buff *skb, int len)\n{\n\tskb->data += len;\n\tskb->tail += len;\n}\nstatic inline void __skb_queue_head_init(struct sk_buff_head *list)\n{\n\tlist->prev = list->next = (struct sk_buff *)list;\n\tlist->qlen = 0;\n}\n/*\n * This function creates a split out lock class for each invocation;\n * this is needed for now since a whole lot of users of the skb-queue\n * infrastructure in drivers have different locking usage (in hardirq)\n * than the networking core (in softirq only). In the long run either the\n * network layer or drivers should need annotation to consolidate the\n * main types of usage into 3 classes.\n */\nstatic inline void skb_queue_head_init(struct sk_buff_head *list)\n{\n\t_rtw_spinlock_init(&list->lock);\n\t__skb_queue_head_init(list);\n}\nunsigned long copy_from_user(void *to, const void *from, unsigned long n);\nunsigned long copy_to_user(void *to, const void *from, unsigned long n);\nstruct sk_buff * dev_alloc_skb(unsigned int size);\nstruct sk_buff *skb_clone(const struct sk_buff *skb);\nvoid dev_kfree_skb_any(struct sk_buff *skb);\n#endif //Baron porting from linux, it's all temp solution, needs to check again\n\n\n#if 1 // kenny add Linux compatibility code for Linux USB driver\n#include <dev/usb/usb_compat_linux.h>\n\n#define __init\t\t// __attribute ((constructor))\n#define __exit\t\t// __attribute ((destructor))\n\n/*\n * Definitions for module_init and module_exit macros.\n *\n * These macros will use the SYSINIT framework to call a specified\n * function (with no arguments) on module loading or unloading.\n * \n */\n\nvoid module_init_exit_wrapper(void *arg);\n\n#define module_init(initfn)                             \\\n        SYSINIT(mod_init_ ## initfn,                    \\\n                SI_SUB_KLD, SI_ORDER_FIRST,             \\\n                module_init_exit_wrapper, initfn)\n\n#define module_exit(exitfn)                             \\\n        SYSUNINIT(mod_exit_ ## exitfn,                  \\\n                  SI_SUB_KLD, SI_ORDER_ANY,             \\\n                  module_init_exit_wrapper, exitfn)\n\n/*\n * The usb_register and usb_deregister functions are used to register\n * usb drivers with the usb subsystem. \n */\nint usb_register(struct usb_driver *driver);\nint usb_deregister(struct usb_driver *driver);\n\n/*\n * usb_get_dev and usb_put_dev - increment/decrement the reference count \n * of the usb device structure.\n *\n * Original body of usb_get_dev:\n *\n *       if (dev)\n *               get_device(&dev->dev);\n *       return dev;\n *\n * Reference counts are not currently used in this compatibility\n * layer. So these functions will do nothing.\n */\nstatic inline struct usb_device *\nusb_get_dev(struct usb_device *dev)\n{\n        return dev;\n}\n\nstatic inline void \nusb_put_dev(struct usb_device *dev)\n{\n        return;\n}\n\n\n// rtw_usb_compat_linux\nint rtw_usb_submit_urb(struct urb *urb, uint16_t mem_flags);\nint rtw_usb_unlink_urb(struct urb *urb);\nint rtw_usb_clear_halt(struct usb_device *dev, struct usb_host_endpoint *uhe);\nint rtw_usb_control_msg(struct usb_device *dev, struct usb_host_endpoint *uhe,\n    uint8_t request, uint8_t requesttype,\n    uint16_t value, uint16_t index, void *data,\n    uint16_t size, usb_timeout_t timeout);\nint rtw_usb_set_interface(struct usb_device *dev, uint8_t iface_no, uint8_t alt_index);\nint rtw_usb_setup_endpoint(struct usb_device *dev,\n    struct usb_host_endpoint *uhe, usb_size_t bufsize);\nstruct urb *rtw_usb_alloc_urb(uint16_t iso_packets, uint16_t mem_flags);\nstruct usb_host_endpoint *rtw_usb_find_host_endpoint(struct usb_device *dev, uint8_t type, uint8_t ep);\nstruct usb_host_interface *rtw_usb_altnum_to_altsetting(const struct usb_interface *intf, uint8_t alt_index);\nstruct usb_interface *rtw_usb_ifnum_to_if(struct usb_device *dev, uint8_t iface_no);\nvoid *rtw_usbd_get_intfdata(struct usb_interface *intf);\nvoid rtw_usb_linux_register(void *arg);\nvoid rtw_usb_linux_deregister(void *arg);\nvoid rtw_usb_linux_free_device(struct usb_device *dev);\nvoid rtw_usb_free_urb(struct urb *urb);\nvoid rtw_usb_init_urb(struct urb *urb);\nvoid rtw_usb_kill_urb(struct urb *urb);\nvoid rtw_usb_set_intfdata(struct usb_interface *intf, void *data);\nvoid rtw_usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev,\n    struct usb_host_endpoint *uhe, void *buf,\n    int length, usb_complete_t callback, void *arg);\nint rtw_usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe,\n    void *data, int len, uint16_t *pactlen, usb_timeout_t timeout);\nvoid *usb_get_intfdata(struct usb_interface *intf);\nint usb_linux_init_endpoints(struct usb_device *udev);\n\n\n\ntypedef struct urb *  PURB;\n\ntypedef unsigned gfp_t;\n#define __GFP_WAIT      ((gfp_t)0x10u)  /* Can wait and reschedule? */\n#define __GFP_HIGH      ((gfp_t)0x20u)  /* Should access emergency pools? */\n#define __GFP_IO        ((gfp_t)0x40u)  /* Can start physical IO? */\n#define __GFP_FS        ((gfp_t)0x80u)  /* Can call down to low-level FS? */\n#define __GFP_COLD      ((gfp_t)0x100u) /* Cache-cold page required */\n#define __GFP_NOWARN    ((gfp_t)0x200u) /* Suppress page allocation failure warning */\n#define __GFP_REPEAT    ((gfp_t)0x400u) /* Retry the allocation.  Might fail */\n#define __GFP_NOFAIL    ((gfp_t)0x800u) /* Retry for ever.  Cannot fail */\n#define __GFP_NORETRY   ((gfp_t)0x1000u)/* Do not retry.  Might fail */\n#define __GFP_NO_GROW   ((gfp_t)0x2000u)/* Slab internal usage */\n#define __GFP_COMP      ((gfp_t)0x4000u)/* Add compound page metadata */\n#define __GFP_ZERO      ((gfp_t)0x8000u)/* Return zeroed page on success */\n#define __GFP_NOMEMALLOC ((gfp_t)0x10000u) /* Don't use emergency reserves */\n#define __GFP_HARDWALL   ((gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */\n\n/* This equals 0, but use constants in case they ever change */\n#define GFP_NOWAIT      (GFP_ATOMIC & ~__GFP_HIGH)\n/* GFP_ATOMIC means both !wait (__GFP_WAIT not set) and use emergency pool */\n#define GFP_ATOMIC      (__GFP_HIGH)\n#define GFP_NOIO        (__GFP_WAIT)\n#define GFP_NOFS        (__GFP_WAIT | __GFP_IO)\n#define GFP_KERNEL      (__GFP_WAIT | __GFP_IO | __GFP_FS)\n#define GFP_USER        (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL)\n#define GFP_HIGHUSER    (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HARDWALL | \\\n                         __GFP_HIGHMEM)\n\n\n#endif // kenny add Linux compatibility code for Linux USB\n\n__inline static _list *get_next(_list\t*list)\n{\n\treturn list->next;\n}\t\n\n__inline static _list\t*get_list_head(_queue\t*queue)\n{\n\treturn (&(queue->queue));\n}\n\n\t\n#define LIST_CONTAINOR(ptr, type, member) \\\n        ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))\t\n\n        \n__inline static void _enter_critical(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_irqsave(plock, *pirqL);\n}\n\n__inline static void _exit_critical(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_irqrestore(plock, *pirqL);\n}\n\n__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_irqsave(plock, *pirqL);\n}\n\n__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_irqrestore(plock, *pirqL);\n}\n\n__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_bh(plock, *pirqL);\n}\n\n__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_bh(plock, *pirqL);\n}\n\n__inline static void _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n\n\t\tmtx_lock(pmutex);\n\n}\n\n\n__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n\n\t\tmtx_unlock(pmutex);\n\n}\nstatic inline void __list_del(struct list_head * prev, struct list_head * next)\n{\n\tnext->prev = prev;\n\tprev->next = next;\n}\nstatic inline void INIT_LIST_HEAD(struct list_head *list)\n{\n\tlist->next = list;\n\tlist->prev = list;\n}\n__inline static void rtw_list_delete(_list *plist)\n{\n\t__list_del(plist->prev, plist->next);\n\tINIT_LIST_HEAD(plist);\n}\n\n__inline static void _init_timer(_timer *ptimer,_nic_hdl padapter,void *pfunc,void* cntx)\n{\n\tptimer->function = pfunc;\n\tptimer->arg = cntx;\n\tcallout_init(&ptimer->callout, CALLOUT_MPSAFE);\n}\n\n__inline static void _set_timer(_timer *ptimer,u32 delay_time)\n{\t\n\t//\tmod_timer(ptimer , (jiffies+(delay_time*HZ/1000)));\n\tif(ptimer->function && ptimer->arg){\n\t\trtw_mtx_lock(NULL);\n\t\tcallout_reset(&ptimer->callout, delay_time,ptimer->function, ptimer->arg);\n\t\trtw_mtx_unlock(NULL);\n\t}\n}\n\n__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)\n{\n\t//\tdel_timer_sync(ptimer); \t\n\t//\t*bcancelled=  _TRUE;//TRUE ==1; FALSE==0\t\n\trtw_mtx_lock(NULL);\n\tcallout_drain(&ptimer->callout);\n\trtw_mtx_unlock(NULL);\n}\n\n__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)\n{\n\tprintf(\"%s Not implement yet! \\n\",__FUNCTION__);\n}\n\n__inline static void _set_workitem(_workitem *pwork)\n{\n\tprintf(\"%s Not implement yet! \\n\",__FUNCTION__);\n//\tschedule_work(pwork);\n}\n\n//\n// Global Mutex: can only be used at PASSIVE level.\n//\n\n#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n}\n\n#define RELEASE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n}\n\n#define ATOMIC_INIT(i)  { (i) }\n\nstatic __inline void thread_enter(char *name);\n\n//Atomic integer operations\ntypedef uint32_t ATOMIC_T ;\n\n#define rtw_netdev_priv(netdev) (((struct ifnet *)netdev)->if_softc)\n\n#define rtw_free_netdev(netdev) if_free((netdev))\n\n#define NDEV_FMT \"%s\"\n#define NDEV_ARG(ndev) \"\"\n#define ADPT_FMT \"%s\"\n#define ADPT_ARG(adapter) \"\"\n#define FUNC_NDEV_FMT \"%s\"\n#define FUNC_NDEV_ARG(ndev) __func__\n#define FUNC_ADPT_FMT \"%s\"\n#define FUNC_ADPT_ARG(adapter) __func__\n\n#define STRUCT_PACKED\n\n#endif\n\n"
  },
  {
    "path": "include/osdep_service_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __OSDEP_CE_SERVICE_H_\n#define __OSDEP_CE_SERVICE_H_\n\n\n#include <ndis.h>\n#include <ntddndis.h>\n\n#ifdef CONFIG_SDIO_HCI\n#include \"SDCardDDK.h\"\n#endif\n\n#ifdef CONFIG_USB_HCI\n#include <usbdi.h>\n#endif\n\ntypedef HANDLE \t_sema;\ntypedef\tLIST_ENTRY\t_list;\ntypedef NDIS_STATUS _OS_STATUS;\n\ntypedef NDIS_SPIN_LOCK\t_lock;\n\ntypedef HANDLE \t\t_rwlock; //Mutex\n\ntypedef u32\t_irqL;\n\ntypedef NDIS_HANDLE  _nic_hdl;\n\n\ntypedef NDIS_MINIPORT_TIMER    _timer;\n\nstruct\t__queue\t{\n\tLIST_ENTRY\tqueue;\n\t_lock\tlock;\n};\n\ntypedef\tNDIS_PACKET\t_pkt;\ntypedef NDIS_BUFFER\t_buffer;\ntypedef struct\t__queue\t_queue;\n\ntypedef HANDLE \t_thread_hdl_;\ntypedef DWORD thread_return;\ntypedef void*\tthread_context;\ntypedef NDIS_WORK_ITEM _workitem;\n\n#define thread_exit() ExitThread(STATUS_SUCCESS); return 0;\n\n\n#define SEMA_UPBND\t(0x7FFFFFFF)   //8192\n\n__inline static _list *get_prev(_list\t*list)\n{\n\treturn list->Blink;\n}\n\t\n__inline static _list *get_next(_list\t*list)\n{\n\treturn list->Flink;\n}\n\n__inline static _list\t*get_list_head(_queue\t*queue)\n{\n\treturn (&(queue->queue));\n}\n\n#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member)\n\n__inline static void _enter_critical(_lock *plock, _irqL *pirqL)\n{\n\tNdisAcquireSpinLock(plock);\n}\n\n__inline static void _exit_critical(_lock *plock, _irqL *pirqL)\n{\n\tNdisReleaseSpinLock(plock);\n}\n\n__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprAcquireSpinLock(plock);\t\n}\n\n__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprReleaseSpinLock(plock);\t\n}\n\n\n__inline static void _enter_hwio_critical(_rwlock *prwlock, _irqL *pirqL)\n{\n\tWaitForSingleObject(*prwlock, INFINITE );\n\n}\n\n__inline static void _exit_hwio_critical(_rwlock *prwlock, _irqL *pirqL)\n{\n\tReleaseMutex(*prwlock);\n}\n\n__inline static void rtw_list_delete(_list *plist)\n{\n\tRemoveEntryList(plist);\n\tInitializeListHead(plist);\n}\n\n#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3\n\n__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx)\n{\n\tNdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx);\n}\n\n__inline static void _set_timer(_timer *ptimer,u32 delay_time)\n{\n \tNdisMSetTimer(ptimer,delay_time);\n}\n\n__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)\n{\n\tNdisMCancelTimer(ptimer,bcancelled);\n}\n\n__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)\n{\n\n\tNdisInitializeWorkItem(pwork, pfunc, cntx);\n}\n\n__inline static void _set_workitem(_workitem *pwork)\n{\n\tNdisScheduleWorkItem(pwork);\n}\n\n#define ATOMIC_INIT(i)  { (i) }\n\n//\n// Global Mutex: can only be used at PASSIVE level.\n//\n\n#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n    while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\\\n    {                                                           \\\n        NdisInterlockedDecrement((PULONG)&(_MutexCounter));        \\\n        NdisMSleep(10000);                          \\\n    }                                                           \\\n}\n\n#define RELEASE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n    NdisInterlockedDecrement((PULONG)&(_MutexCounter));              \\\n}\n\n// limitation of path length\n#define PATH_LENGTH_MAX MAX_PATH\n\n//Atomic integer operations\n#define ATOMIC_T LONG\n\n#define NDEV_FMT \"%s\"\n#define NDEV_ARG(ndev) \"\"\n#define ADPT_FMT \"%s\"\n#define ADPT_ARG(adapter) \"\"\n#define FUNC_NDEV_FMT \"%s\"\n#define FUNC_NDEV_ARG(ndev) __func__\n#define FUNC_ADPT_FMT \"%s\"\n#define FUNC_ADPT_ARG(adapter) __func__\n\n#define STRUCT_PACKED\n\n\n#endif\n\n"
  },
  {
    "path": "include/osdep_service_linux.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __OSDEP_LINUX_SERVICE_H_\n#define __OSDEP_LINUX_SERVICE_H_\n\n\t#include <linux/version.h>\n\t#include <linux/spinlock.h>\n\t#include <linux/compiler.h>\n\t#include <linux/kernel.h>\n\t#include <linux/errno.h>\n\t#include <linux/init.h>\n\t#include <linux/slab.h>\n\t#include <linux/module.h>\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,5))\n\t#include <linux/kref.h>\n#endif\n\t//#include <linux/smp_lock.h>\n\t#include <linux/netdevice.h>\n\t#include <linux/skbuff.h>\n\t#include <linux/circ_buf.h>\n\t#include <asm/uaccess.h>\n\t#include <asm/byteorder.h>\n\t#include <asm/atomic.h>\n\t#include <asm/io.h>\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))\n\t#include <asm/semaphore.h>\n#else\n\t#include <linux/semaphore.h>\n#endif\n\t#include <linux/sem.h>\n\t#include <linux/sched.h>\n\t#include <linux/etherdevice.h>\n\t#include <linux/wireless.h>\n\t#include <net/iw_handler.h>\n\t#include <linux/if_arp.h>\n\t#include <linux/rtnetlink.h>\n\t#include <linux/delay.h>\n\t#include <linux/interrupt.h>\t// for struct tasklet_struct\n\t#include <linux/ip.h>\n\t#include <linux/kthread.h>\n\t#include <linux/list.h>\n\t#include <linux/vmalloc.h>\n\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,41))\n\t#include <linux/tqueue.h>\n#endif\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))\n\t#include <uapi/linux/limits.h>\n#else\n\t#include <linux/limits.h>\n#endif\n\n#ifdef RTK_DMP_PLATFORM\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\n\t#include <linux/pageremap.h>\n#endif\n\t#include <asm/io.h>\n#endif\n\n#ifdef CONFIG_NET_RADIO\n\t#define CONFIG_WIRELESS_EXT\n#endif\n\n\t/* Monitor mode */\n\t#include <net/ieee80211_radiotap.h>\n\n#ifdef CONFIG_IOCTL_CFG80211\t\n/*\t#include <linux/ieee80211.h> */\n\t#include <net/cfg80211.h>\n#endif //CONFIG_IOCTL_CFG80211\n\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\t#include <linux/in.h>\n\t#include <linux/udp.h>\n#endif\n\n#ifdef CONFIG_HAS_EARLYSUSPEND\n\t#include <linux/earlysuspend.h>\n#endif //CONFIG_HAS_EARLYSUSPEND\n\n#ifdef CONFIG_EFUSE_CONFIG_FILE\n\t#include <linux/fs.h>\n#endif\n\n#ifdef CONFIG_USB_HCI\n\t#include <linux/usb.h>\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))\n\t#include <linux/usb_ch9.h>\n#else\n\t#include <linux/usb/ch9.h>\n#endif\n#endif\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\t#include <net/sock.h>\n\t#include <net/tcp.h>\n\t#include <linux/udp.h>\n\t#include <linux/in.h>\n\t#include <linux/netlink.h>\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n#ifdef CONFIG_USB_HCI\n\ttypedef struct urb *  PURB;\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22))\n#ifdef CONFIG_USB_SUSPEND\n#define CONFIG_AUTOSUSPEND\t1\n#endif\n#endif\n#endif\n\n\ttypedef struct \tsemaphore _sema;\n\ttypedef\tspinlock_t\t_lock;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\ttypedef struct mutex \t\t_mutex;\n#else\n\ttypedef struct semaphore\t_mutex;\n#endif\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\ttypedef struct legacy_timer_emu {\n\t\tstruct timer_list t;\n\t\tvoid (*function)(unsigned long);\n\t\tunsigned long data;\n\t} _timer;\n#else\n\ttypedef struct timer_list _timer;\n#endif\n\n\tstruct\t__queue\t{\n\t\tstruct\tlist_head\tqueue;\t\n\t\t_lock\tlock;\n\t};\n\n\ttypedef\tstruct sk_buff\t_pkt;\n\ttypedef unsigned char\t_buffer;\n\t\n\ttypedef struct\t__queue\t_queue;\n\ttypedef struct\tlist_head\t_list;\n\ttypedef\tint\t_OS_STATUS;\n\t//typedef u32\t_irqL;\n\ttypedef unsigned long _irqL;\n\ttypedef\tstruct\tnet_device * _nic_hdl;\n\t\n\ttypedef void*\t\t_thread_hdl_;\n\ttypedef int\t\tthread_return;\n\ttypedef void*\tthread_context;\n\n\t#define thread_exit() complete_and_exit(NULL, 0)\n\n\ttypedef void timer_hdl_return;\n\ttypedef void* timer_hdl_context;\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41))\n\ttypedef struct work_struct _workitem;\n#else\n\ttypedef struct tq_struct _workitem;\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n\t#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))\n// Porting from linux kernel, for compatible with old kernel.\nstatic inline unsigned char *skb_tail_pointer(const struct sk_buff *skb)\n{\n\treturn skb->tail;\n}\n\nstatic inline void skb_reset_tail_pointer(struct sk_buff *skb)\n{\n\tskb->tail = skb->data;\n}\n\nstatic inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset)\n{\n\tskb->tail = skb->data + offset;\n}\n\nstatic inline unsigned char *skb_end_pointer(const struct sk_buff *skb)\n{\n\treturn skb->end;\n}\n#endif\n\n__inline static _list *get_next(_list\t*list)\n{\n\treturn list->next;\n}\t\n\n__inline static _list\t*get_list_head(_queue\t*queue)\n{\n\treturn (&(queue->queue));\n}\n\n\t\n#define LIST_CONTAINOR(ptr, type, member) \\\n        ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member)))\t\n\n        \n__inline static void _enter_critical(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_irqsave(plock, *pirqL);\n}\n\n__inline static void _exit_critical(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_irqrestore(plock, *pirqL);\n}\n\n__inline static void _enter_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_irqsave(plock, *pirqL);\n}\n\n__inline static void _exit_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_irqrestore(plock, *pirqL);\n}\n\n__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tspin_lock_bh(plock);\n}\n\n__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tspin_unlock_bh(plock);\n}\n\n__inline static int _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n\tint ret = 0;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t//mutex_lock(pmutex);\n\tret = mutex_lock_interruptible(pmutex);\n#else\n\tret = down_interruptible(pmutex);\n#endif\n\treturn ret;\n}\n\n\n__inline static void _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\tmutex_unlock(pmutex);\n#else\n\t\tup(pmutex);\n#endif\n}\n\n__inline static void rtw_list_delete(_list *plist)\n{\n\tlist_del_init(plist);\n}\n\n#define RTW_TIMER_HDL_ARGS void *FunctionContext\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\nstatic void legacy_timer_emu_func(struct timer_list *t)\n{\n\tstruct legacy_timer_emu *lt = from_timer(lt, t, t);\n\tlt->function(lt->data);\n}\n#endif\n\n__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,void* cntx)\n{\n\t//setup_timer(ptimer, pfunc,(u32)cntx);\t\n\tptimer->function = pfunc;\n\tptimer->data = (unsigned long)cntx;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\ttimer_setup(&ptimer->t, legacy_timer_emu_func, 0);\n#else\n\tinit_timer(ptimer);\n#endif\n}\n\n__inline static void _set_timer(_timer *ptimer,u32 delay_time)\n{\t\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\tmod_timer(&ptimer->t , (jiffies+(delay_time*HZ/1000)));\n#else\n\tmod_timer(ptimer , (jiffies+(delay_time*HZ/1000)));\n#endif\n}\n\n__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\tdel_timer_sync(&ptimer->t);\n#else\n\tdel_timer_sync(ptimer); \n#endif\t\n\t*bcancelled=  _TRUE;//TRUE ==1; FALSE==0\n}\n\n\n__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))\n\tINIT_WORK(pwork, pfunc);\n#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41))\n\tINIT_WORK(pwork, pfunc,pwork);\n#else\n\tINIT_TQUEUE(pwork, pfunc,pwork);\n#endif\n}\n\n__inline static void _set_workitem(_workitem *pwork)\n{\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41))\n\tschedule_work(pwork);\n#else\n\tschedule_task(pwork);\n#endif\n}\n\n__inline static void _cancel_workitem_sync(_workitem *pwork)\n{\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22))\n\tcancel_work_sync(pwork);\n#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41))\n\tflush_scheduled_work();\n#else\n\tflush_scheduled_tasks();\n#endif\n}\n//\n// Global Mutex: can only be used at PASSIVE level.\n//\n\n#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n\twhile (atomic_inc_return((atomic_t *)&(_MutexCounter)) != 1)\\\n\t{                                                           \\\n\t\tatomic_dec((atomic_t *)&(_MutexCounter));        \\\n\t\tmsleep(10);                          \\\n\t}                                                           \\\n}\n\n#define RELEASE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n\tatomic_dec((atomic_t *)&(_MutexCounter));        \\\n}\n\nstatic inline int rtw_netif_queue_stopped(struct net_device *pnetdev)\n{\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\treturn (netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) &&\n\t\tnetif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 1)) &&\n\t\tnetif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 2)) &&\n\t\tnetif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 3)) );\n#else\n\treturn netif_queue_stopped(pnetdev);\n#endif\n}\n\nstatic inline void rtw_netif_wake_queue(struct net_device *pnetdev)\n{\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\tnetif_tx_wake_all_queues(pnetdev);\n#else\n\tnetif_wake_queue(pnetdev);\n#endif\n}\n\nstatic inline void rtw_netif_start_queue(struct net_device *pnetdev)\n{\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\tnetif_tx_start_all_queues(pnetdev);\n#else\n\tnetif_start_queue(pnetdev);\n#endif\n}\n\nstatic inline void rtw_netif_stop_queue(struct net_device *pnetdev)\n{\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\tnetif_tx_stop_all_queues(pnetdev);\n#else\n\tnetif_stop_queue(pnetdev);\n#endif\n}\n\nstatic inline void rtw_merge_string(char *dst, int dst_len, char *src1, char *src2)\n{\n\tint\tlen = 0;\n\tlen += snprintf(dst+len, dst_len - len, \"%s\", src1);\n\tlen += snprintf(dst+len, dst_len - len, \"%s\", src2);\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))\n#define rtw_signal_process(pid, sig) kill_pid(find_vpid((pid)),(sig), 1)\n#else //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))\n#define rtw_signal_process(pid, sig) kill_proc((pid), (sig), 1)\n#endif //(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))\n\n\n// Suspend lock prevent system from going suspend\n#ifdef CONFIG_WAKELOCK\n#include <linux/wakelock.h>\n#elif defined(CONFIG_ANDROID_POWER)\n#include <linux/android_power.h>\n#endif\n\n// limitation of path length\n#define PATH_LENGTH_MAX PATH_MAX\n\n//Atomic integer operations\n#define ATOMIC_T atomic_t\n\n#define rtw_netdev_priv(netdev) ( ((struct rtw_netdev_priv_indicator *)netdev_priv(netdev))->priv )\n\n#define NDEV_FMT \"%s\"\n#define NDEV_ARG(ndev) ndev->name\n#define ADPT_FMT \"%s\"\n#define ADPT_ARG(adapter) adapter->pnetdev->name\n#define FUNC_NDEV_FMT \"%s(%s)\"\n#define FUNC_NDEV_ARG(ndev) __func__, ndev->name\n#define FUNC_ADPT_FMT \"%s(%s)\"\n#define FUNC_ADPT_ARG(adapter) __func__, adapter->pnetdev->name\n\nstruct rtw_netdev_priv_indicator {\n\tvoid *priv;\n\tu32 sizeof_priv;\n};\nstruct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv);\nextern struct net_device * rtw_alloc_etherdev(int sizeof_priv);\n\n#define STRUCT_PACKED __attribute__ ((packed))\n\n\n#endif\n\n"
  },
  {
    "path": "include/osdep_service_xp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __OSDEP_LINUX_SERVICE_H_\n#define __OSDEP_LINUX_SERVICE_H_\n\n\t#include <ndis.h>\n\t#include <ntddk.h>\n\t#include <ntddndis.h>\n\t#include <ntdef.h>\n\n#ifdef CONFIG_USB_HCI\n\t#include <usb.h>\n\t#include <usbioctl.h>\n\t#include <usbdlib.h>\n#endif\n\n\ttypedef KSEMAPHORE \t_sema;\n\ttypedef\tLIST_ENTRY\t_list;\n\ttypedef NDIS_STATUS _OS_STATUS;\n\t\n\n\ttypedef NDIS_SPIN_LOCK\t_lock;\n\n\ttypedef KMUTEX \t\t\t_mutex;\n\n\ttypedef KIRQL\t_irqL;\n\n\t// USB_PIPE for WINCE , but handle can be use just integer under windows\n\ttypedef NDIS_HANDLE  _nic_hdl;\n\n\n\ttypedef NDIS_MINIPORT_TIMER    _timer;\n\n\tstruct\t__queue\t{\n\t\tLIST_ENTRY\tqueue;\t\n\t\t_lock\tlock;\n\t};\n\n\ttypedef\tNDIS_PACKET\t_pkt;\n\ttypedef NDIS_BUFFER\t_buffer;\n\ttypedef struct\t__queue\t_queue;\n\t\n\ttypedef PKTHREAD _thread_hdl_;\n\ttypedef void\tthread_return;\n\ttypedef void* thread_context;\n\n\ttypedef NDIS_WORK_ITEM _workitem;\n\n\t#define thread_exit() PsTerminateSystemThread(STATUS_SUCCESS);\n\n\t#define HZ\t\t\t10000000\n\t#define SEMA_UPBND\t(0x7FFFFFFF)   //8192\n\t\n__inline static _list *get_next(_list\t*list)\n{\n\treturn list->Flink;\n}\t\n\n__inline static _list\t*get_list_head(_queue\t*queue)\n{\n\treturn (&(queue->queue));\n}\n\t\n\n#define LIST_CONTAINOR(ptr, type, member) CONTAINING_RECORD(ptr, type, member)\n     \n\n__inline static _enter_critical(_lock *plock, _irqL *pirqL)\n{\n\tNdisAcquireSpinLock(plock);\t\n}\n\n__inline static _exit_critical(_lock *plock, _irqL *pirqL)\n{\n\tNdisReleaseSpinLock(plock);\t\n}\n\n\n__inline static _enter_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprAcquireSpinLock(plock);\t\n}\n\n__inline static _exit_critical_ex(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprReleaseSpinLock(plock);\t\n}\n\n__inline static void _enter_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprAcquireSpinLock(plock);\n}\n\n__inline static void _exit_critical_bh(_lock *plock, _irqL *pirqL)\n{\n\tNdisDprReleaseSpinLock(plock);\n}\n\n__inline static _enter_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n\tKeWaitForSingleObject(pmutex, Executive, KernelMode, FALSE, NULL);\n}\n\n\n__inline static _exit_critical_mutex(_mutex *pmutex, _irqL *pirqL)\n{\n\tKeReleaseMutex(pmutex, FALSE);\n}\n\n\n__inline static void rtw_list_delete(_list *plist)\n{\n\tRemoveEntryList(plist);\n\tInitializeListHead(plist);\t\n}\n\n#define RTW_TIMER_HDL_ARGS IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3\n\n__inline static void _init_timer(_timer *ptimer,_nic_hdl nic_hdl,void *pfunc,PVOID cntx)\n{\n\tNdisMInitializeTimer(ptimer, nic_hdl, pfunc, cntx);\n}\n\n__inline static void _set_timer(_timer *ptimer,u32 delay_time)\n{\t\n \tNdisMSetTimer(ptimer,delay_time);\t\n}\n\n__inline static void _cancel_timer(_timer *ptimer,u8 *bcancelled)\n{\n\tNdisMCancelTimer(ptimer,bcancelled);\n}\n\n__inline static void _init_workitem(_workitem *pwork, void *pfunc, PVOID cntx)\n{\n\n\tNdisInitializeWorkItem(pwork, pfunc, cntx);\n}\n\n__inline static void _set_workitem(_workitem *pwork)\n{\n\tNdisScheduleWorkItem(pwork);\n}\n\n\n#define ATOMIC_INIT(i)  { (i) }\n\n//\n// Global Mutex: can only be used at PASSIVE level.\n//\n\n#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n    while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\\\n    {                                                           \\\n        NdisInterlockedDecrement((PULONG)&(_MutexCounter));        \\\n        NdisMSleep(10000);                          \\\n    }                                                           \\\n}\n\n#define RELEASE_GLOBAL_MUTEX(_MutexCounter)                              \\\n{                                                               \\\n    NdisInterlockedDecrement((PULONG)&(_MutexCounter));              \\\n}\n\n// limitation of path length\n#define PATH_LENGTH_MAX MAX_PATH\n\n//Atomic integer operations\n#define ATOMIC_T LONG\n\n\n#define NDEV_FMT \"%s\"\n#define NDEV_ARG(ndev) \"\"\n#define ADPT_FMT \"%s\"\n#define ADPT_ARG(adapter) \"\"\n#define FUNC_NDEV_FMT \"%s\"\n#define FUNC_NDEV_ARG(ndev) __func__\n#define FUNC_ADPT_FMT \"%s\"\n#define FUNC_ADPT_ARG(adapter) __func__\n\n#define STRUCT_PACKED\n\n#endif\n\n"
  },
  {
    "path": "include/pci_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __PCI_HAL_H__\n#define __PCI_HAL_H__\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188ee_set_hal_ops(_adapter *padapter);\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nvoid rtl8812ae_set_hal_ops(_adapter *padapter);\n#endif\n\n#if defined(CONFIG_RTL8192E)\nvoid rtl8192ee_set_hal_ops(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_RTL8723B\nvoid rtl8723be_set_hal_ops(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_RTL8814A\nvoid rtl8814ae_set_hal_ops(_adapter *padapter);\n#endif\n\nu8 rtw_set_hal_ops(_adapter *padapter);\n\n#endif //__PCIE_HAL_H__\n\n"
  },
  {
    "path": "include/pci_ops.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __PCI_OPS_H_\n#define __PCI_OPS_H_\n\n\n#ifdef CONFIG_RTL8188E\nu32\trtl8188ee_init_desc_ring(_adapter *padapter);\nu32\trtl8188ee_free_desc_ring(_adapter *padapter);\nvoid\trtl8188ee_reset_desc_ring(_adapter *padapter);\nint\trtl8188ee_interrupt(PADAPTER Adapter);\nvoid\trtl8188ee_xmit_tasklet(void *priv);\nvoid\trtl8188ee_recv_tasklet(void *priv);\nvoid\trtl8188ee_prepare_bcn_tasklet(void *priv);\nvoid\trtl8188ee_set_intf_ops(struct _io_ops\t*pops);\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nu32\trtl8812ae_init_desc_ring(_adapter *padapter);\nu32\trtl8812ae_free_desc_ring(_adapter *padapter);\nvoid\trtl8812ae_reset_desc_ring(_adapter *padapter);\nint\trtl8812ae_interrupt(PADAPTER Adapter);\nvoid\trtl8812ae_xmit_tasklet(void *priv);\nvoid\trtl8812ae_recv_tasklet(void *priv);\nvoid\trtl8812ae_prepare_bcn_tasklet(void *priv);\nvoid\trtl8812ae_set_intf_ops(struct _io_ops\t*pops);\n#endif\n\n#ifdef CONFIG_RTL8192E\nu32\trtl8192ee_init_desc_ring(_adapter *padapter);\nu32\trtl8192ee_free_desc_ring(_adapter *padapter);\nvoid\trtl8192ee_reset_desc_ring(_adapter *padapter);\nvoid\trtl8192ee_recv_tasklet(void *priv);\nvoid\trtl8192ee_prepare_bcn_tasklet(void *priv);\nint\trtl8192ee_interrupt(PADAPTER Adapter);\nvoid\trtl8192ee_set_intf_ops(struct _io_ops\t*pops);\n#endif\n\n#ifdef CONFIG_RTL8723B\nu32\trtl8723be_init_desc_ring(_adapter *padapter);\nu32\trtl8723be_free_desc_ring(_adapter *padapter);\nvoid\trtl8723be_reset_desc_ring(_adapter *padapter);\nint\trtl8723be_interrupt(PADAPTER Adapter);\nvoid\trtl8723be_recv_tasklet(void *priv);\nvoid\trtl8723be_prepare_bcn_tasklet(void *priv);\nvoid\trtl8723be_set_intf_ops(struct _io_ops\t*pops);\n#endif\n\n#ifdef CONFIG_RTL8814A\nu32\trtl8814ae_init_desc_ring(_adapter *padapter);\nu32\trtl8814ae_free_desc_ring(_adapter *padapter);\nvoid\trtl8814ae_reset_desc_ring(_adapter *padapter);\nint\trtl8814ae_interrupt(PADAPTER Adapter);\nvoid\trtl8814ae_xmit_tasklet(void *priv);\nvoid\trtl8814ae_recv_tasklet(void *priv);\nvoid\trtl8814ae_prepare_bcn_tasklet(void *priv);\nvoid\trtl8814ae_set_intf_ops(struct _io_ops\t*pops);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/pci_osintf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __PCI_OSINTF_H\n#define __PCI_OSINTF_H\n\n\nvoid\trtw_pci_disable_aspm(_adapter *padapter);\nvoid\trtw_pci_enable_aspm(_adapter *padapter);\nvoid\tPlatformClearPciPMEStatus(PADAPTER Adapter);\n#ifdef CONFIG_64BIT_DMA\nu8\tPlatformEnableDMA64(PADAPTER Adapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/recv_osdep.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RECV_OSDEP_H_\n#define __RECV_OSDEP_H_\n\n\nextern sint _rtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter);\nextern void _rtw_free_recv_priv (struct recv_priv *precvpriv);\n\n\nextern s32  rtw_recv_entry(union recv_frame *precv_frame);\t\nextern int rtw_recv_indicatepkt(_adapter *adapter, union recv_frame *precv_frame);\nextern void rtw_recv_returnpacket(IN _nic_hdl cnxt, IN _pkt *preturnedpkt);\n\nextern int rtw_recv_monitor(_adapter *padapter, union recv_frame *precv_frame);\n\nextern void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame);\n\nstruct sta_info;\nextern void rtw_handle_tkip_mic_err(_adapter *padapter, struct sta_info *sta, u8 bgroup);\n\t\t\n\nint\trtw_init_recv_priv(struct recv_priv *precvpriv, _adapter *padapter);\nvoid rtw_free_recv_priv (struct recv_priv *precvpriv);\n\n\nint rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter);\nint rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe);\nvoid rtw_os_recv_resource_free(struct recv_priv *precvpriv);\n\n\nint rtw_os_alloc_recvframe(_adapter *padapter, union recv_frame *precvframe, u8 *pdata, _pkt *pskb);\nvoid rtw_os_free_recvframe(union recv_frame *precvframe);\n\n\nint rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf);\nint rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf);\n\n_pkt *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, u16 nSubframe_Length, u8 *pdata);\nvoid rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attrib *pattrib);\n\nvoid rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf);\n\nvoid rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl);\n\n\n#endif //\n\n"
  },
  {
    "path": "include/rtl8188e_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_CMD_H__\n#define __RTL8188E_CMD_H__\n\n#if 0\nenum cmd_msg_element_id\n{\n\tNONE_CMDMSG_EID,\n\tAP_OFFLOAD_EID = 0,\n\tSET_PWRMODE_EID = 1,\n\tJOINBSS_RPT_EID = 2,\n\tRSVD_PAGE_EID = 3,\n\tRSSI_4_EID = 4,\n\tRSSI_SETTING_EID = 5,\n\tMACID_CONFIG_EID = 6,\n\tMACID_PS_MODE_EID = 7,\n\tP2P_PS_OFFLOAD_EID = 8,\n\tSELECTIVE_SUSPEND_ROF_CMD = 9,\n\tP2P_PS_CTW_CMD_EID = 32,\n\tMAX_CMDMSG_EID\t \n};\n#else\ntypedef enum _RTL8188E_H2C_CMD_ID\n{\n\t//Class Common\n\tH2C_COM_RSVD_PAGE\t\t\t=0x00,\n\tH2C_COM_MEDIA_STATUS_RPT\t=0x01,\n\tH2C_COM_SCAN\t\t\t\t\t=0x02,\t\n\tH2C_COM_KEEP_ALIVE\t\t\t=0x03,\t\n\tH2C_COM_DISCNT_DECISION\t\t=0x04,\n#ifndef CONFIG_WOWLAN\n\tH2C_COM_WWLAN\t\t\t\t=0x05,\n#endif\n\tH2C_COM_INIT_OFFLOAD\t\t\t=0x06,\n\tH2C_COM_REMOTE_WAKE_CTL\t=0x07,\n\tH2C_COM_AP_OFFLOAD\t\t\t=0x08,\n\tH2C_COM_BCN_RSVD_PAGE\t\t=0x09,\n\tH2C_COM_PROB_RSP_RSVD_PAGE\t=0x0A,\n\n\t//Class PS\n\tH2C_PS_PWR_MODE\t\t\t\t=0x20,\n\tH2C_PS_TUNE_PARA\t\t\t\t=0x21,\n\tH2C_PS_TUNE_PARA_2\t\t\t=0x22,\n\tH2C_PS_LPS_PARA\t\t\t\t=0x23,\n\tH2C_PS_P2P_OFFLOAD\t\t\t=0x24,\n\n\t//Class DM\n\tH2C_DM_MACID_CFG\t\t\t\t=0x40,\n\tH2C_DM_TXBF\t\t\t\t\t=0x41,\n\tH2C_RSSI_REPORT \t\t\t\t=0x42,\n\t//Class BT\n\tH2C_BT_COEX_MASK\t\t\t\t=0x60,\n\tH2C_BT_COEX_GPIO_MODE\t\t=0x61,\n\tH2C_BT_DAC_SWING_VAL\t\t\t=0x62,\n\tH2C_BT_PSD_RST\t\t\t\t=0x63,\n\t\n\t//Class Remote WakeUp\n#ifdef CONFIG_WOWLAN\n\tH2C_COM_WWLAN\t\t\t\t=0x80,\n\tH2C_COM_REMOTE_WAKE_CTRL\t=0x81,\n\tH2C_COM_AOAC_GLOBAL_INFO\t=0x82,\n\tH2C_COM_AOAC_RSVD_PAGE\t\t=0x83,\n#endif\n\n\t//Class \n\t //H2C_RESET_TSF\t\t\t\t=0xc0,\n}RTL8188E_H2C_CMD_ID;\n\t\n#endif\n\n\nstruct cmd_msg_parm {\n\tu8 eid; //element id\n\tu8 sz; // sz\n\tu8 buf[6];\n};\n\nenum{\n\tPWRS\n};\n\ntypedef struct _SETPWRMODE_PARM {\n\tu8 Mode;//0:Active,1:LPS,2:WMMPS\n\t//u8 RLBM:4;//0:Min,1:Max,2: User define\n\tu8 SmartPS_RLBM;//LPS=0:PS_Poll,1:PS_Poll,2:NullData,WMM=0:PS_Poll,1:NullData\n\tu8 AwakeInterval;\t// unit: beacon interval\n\tu8 bAllQueueUAPSD;\n\tu8 PwrState;//AllON(0x0c),RFON(0x04),RFOFF(0x00)\n} SETPWRMODE_PARM, *PSETPWRMODE_PARM;\n\nstruct H2C_SS_RFOFF_PARAM{\n\tu8 ROFOn; // 1: on, 0:off\n\tu16 gpio_period; // unit: 1024 us\n}__attribute__ ((packed));\n\n\ntypedef struct JOINBSSRPT_PARM_88E{\n\tu8 OpMode;\t// RT_MEDIA_STATUS\n#ifdef CONFIG_WOWLAN\n\tu8 MacID;       // MACID\n#endif //CONFIG_WOWLAN\n}JOINBSSRPT_PARM_88E, *PJOINBSSRPT_PARM_88E;\n\n/* move to hal_com_h2c.h\ntypedef struct _RSVDPAGE_LOC_88E {\n\tu8 LocProbeRsp;\n\tu8 LocPsPoll;\n\tu8 LocNullData;\n\tu8 LocQosNull;\n\tu8 LocBTQosNull;\n#ifdef CONFIG_WOWLAN\n\tu8 LocRemoteCtrlInfo;\n\tu8 LocArpRsp;\n\tu8 LocNbrAdv;\n\tu8 LocGTKRsp;\n\tu8 LocGTKInfo;\n\tu8 LocProbeReq;\n\tu8 LocNetList;\n#endif //CONFIG_WOWLAN\t\n} RSVDPAGE_LOC_88E, *PRSVDPAGE_LOC_88E;\n*/\n\n// host message to firmware cmd\nvoid rtl8188e_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);\nvoid rtl8188e_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);\nu8 rtl8188e_set_rssi_cmd(PADAPTER padapter, u8 *param);\nu8 rtl8188e_set_raid_cmd(_adapter *padapter, u32 bitmap, u8 *arg);\nvoid rtl8188e_Add_RateATid(PADAPTER padapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\ns32 FillH2CCmd_88E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\n//u8 rtl8192c_set_FwSelectSuspend_cmd(PADAPTER padapter, u8 bfwpoll, u16 period);\nu8 GetTxBufferRsvdPageNum8188E(_adapter *padapter, bool wowlan);\n\n\n#ifdef CONFIG_P2P\nvoid rtl8188e_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\nvoid rtl8188e_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt );\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\n//u8 rtl8188e_reset_tsf(_adapter *padapter, u8 reset_port);\nint reset_tsf(PADAPTER Adapter, u8 reset_port );\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\n//#define H2C_8188E_RSVDPAGE_LOC_LEN      5\n//#define H2C_8188E_AOAC_RSVDPAGE_LOC_LEN 7\n\n#ifdef CONFIG_WOWLAN\nvoid SetFwRelatedForWoWLAN8188ES(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif//CONFIG_WOWLAN\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD CONTENT    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n//\n/* move to hal_com_h2c.h\n//_RSVDPAGE_LOC_CMD_0x00\n#define SET_8188E_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8188E_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)            SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8188E_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8188E_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)     SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)\n// AOAC_RSVDPAGE_LOC_0x83\n#define SET_8188E_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__pH2CCmd, __Value)        SET_BITS_TO_LE_1BYTE((__pH2CCmd), 0, 8, __Value)\n#define SET_8188E_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__pH2CCmd, __Value)                  SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n*/\n#endif//__RTL8188E_CMD_H__\n\n\n"
  },
  {
    "path": "include/rtl8188e_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_DM_H__\n#define __RTL8188E_DM_H__\n\nvoid rtl8188e_init_dm_priv(IN PADAPTER Adapter);\nvoid rtl8188e_deinit_dm_priv(IN PADAPTER Adapter);\nvoid rtl8188e_InitHalDm(IN PADAPTER Adapter);\nvoid rtl8188e_HalDmWatchDog(IN PADAPTER Adapter);\n\n//VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter);\n\n//void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal);\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nvoid\tAntDivCompare8188E(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\nu8 AntDivBeforeLink8188E(PADAPTER Adapter );\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8188e_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_HAL_H__\n#define __RTL8188E_HAL_H__\n\n//#include \"hal_com.h\"\n#include \"hal_data.h\"\n\n//include HAL Related header after HAL Related compiling flags \n#include \"rtl8188e_spec.h\"\n#include \"Hal8188EPhyReg.h\"\n#include \"Hal8188EPhyCfg.h\"\n#include \"rtl8188e_rf.h\"\n#include \"rtl8188e_dm.h\"\n#include \"rtl8188e_recv.h\"\n#include \"rtl8188e_xmit.h\"\n#include \"rtl8188e_cmd.h\"\n#include \"rtl8188e_led.h\"\n#include \"Hal8188EPwrSeq.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8188e_sreset.h\"\n#endif\n\n#if 0\n\t// Fw Array\n\t#define Rtl8188E_FwImageArray\t\t\t\tRtl8188EFwImgArray\n\t#define Rtl8188E_FWImgArrayLength\t\t\tRtl8188EFWImgArrayLength\n#ifdef CONFIG_WOWLAN\n\t#define Rtl8188E_FwWoWImageArray\t\t\tArray_MP_8188E_FW_WoWLAN\n\t#define Rtl8188E_FwWoWImgArrayLength\t\tArrayLength_MP_8188E_FW_WoWLAN\n#endif //CONFIG_WOWLAN\n#endif\n\n\n\t#define RTL8188E_FW_IMG\t\t\t\t\t\"rtl8188e/FW_NIC.bin\"\n\t#define RTL8188E_FW_WW_IMG\t\t\t\t\"rtl8188e/FW_WoWLAN.bin\"\n\t#define RTL8188E_PHY_REG\t\t\t\t\t\"rtl8188e/PHY_REG.txt\" \n\t#define RTL8188E_PHY_RADIO_A\t\t\t\t\"rtl8188e/RadioA.txt\"\n\t#define RTL8188E_PHY_RADIO_B\t\t\t\t\"rtl8188e/RadioB.txt\"\n\t#define RTL8188E_TXPWR_TRACK\t\t\t\t\"rtl8188e/TxPowerTrack.txt\"\t\t\t\n\t#define RTL8188E_AGC_TAB\t\t\t\t\t\"rtl8188e/AGC_TAB.txt\"\n\t#define RTL8188E_PHY_MACREG \t\t\t\t\"rtl8188e/MAC_REG.txt\"\n\t#define RTL8188E_PHY_REG_PG\t\t\t\t\"rtl8188e/PHY_REG_PG.txt\"\n\t#define RTL8188E_PHY_REG_MP \t\t\t\t\"rtl8188e/PHY_REG_MP.txt\" \n\t#define RTL8188E_TXPWR_LMT\t\t\t\t\"rtl8188e/TXPWR_LMT.txt\" \n\n\t//---------------------------------------------------------------------\n\t//\t\tRTL8188E Power Configuration CMDs for USB/SDIO/PCIE interfaces\n\t//---------------------------------------------------------------------\n\t#define Rtl8188E_NIC_PWR_ON_FLOW\t\t\t\trtl8188E_power_on_flow\n\t#define Rtl8188E_NIC_RF_OFF_FLOW\t\t\t\trtl8188E_radio_off_flow\n\t#define Rtl8188E_NIC_DISABLE_FLOW\t\t\t\trtl8188E_card_disable_flow\n\t#define Rtl8188E_NIC_ENABLE_FLOW\t\t\t\trtl8188E_card_enable_flow\n\t#define Rtl8188E_NIC_SUSPEND_FLOW\t\t\t\trtl8188E_suspend_flow\n\t#define Rtl8188E_NIC_RESUME_FLOW\t\t\t\trtl8188E_resume_flow\n\t#define Rtl8188E_NIC_PDN_FLOW\t\t\t\t\trtl8188E_hwpdn_flow\n\t#define Rtl8188E_NIC_LPS_ENTER_FLOW\t\t\trtl8188E_enter_lps_flow\n\t#define Rtl8188E_NIC_LPS_LEAVE_FLOW\t\t\trtl8188E_leave_lps_flow\n\n\n#if 1 // download firmware related data structure\n#define MAX_FW_8188E_SIZE\t\t\t0x8000 //32768,32k / 16384,16k\n\n#define FW_8188E_SIZE\t\t\t\t0x4000 //16384,16k\n#define FW_8188E_SIZE_2\t\t\t0x8000 //32768,32k \n\n#define FW_8188E_START_ADDRESS\t0x1000\n#define FW_8188E_END_ADDRESS\t\t0x1FFF //0x5FFF\n\n\n#define IS_FW_HEADER_EXIST_88E(_pFwHdr)\t((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0)\n\ntypedef struct _RT_FIRMWARE_8188E {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[MAX_FW_8188E_SIZE];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8188E, *PRT_FIRMWARE_8188E;\n\n//\n// This structure must be cared byte-ordering\n//\n\ntypedef struct _RT_8188E_FIRMWARE_HDR\n{\n\t// 8-byte alinment required\n\n\t//--- LONG WORD 0 ----\n\tu16\t\tSignature;\t// 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n\tu8\t\tCategory;\t// AP/NIC and USB/PCI\n\tu8\t\tFunction;\t// Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n\tu16\t\tVersion;\t\t// FW Version\n\tu8\t\tSubversion;\t// FW Subversion, default 0x00\n\tu16\t\tRsvd1;\n\n\n\t//--- LONG WORD 1 ----\n\tu8\t\tMonth;\t// Release time Month field\n\tu8\t\tDate;\t// Release time Date field\n\tu8\t\tHour;\t// Release time Hour field\n\tu8\t\tMinute;\t// Release time Minute field\n\tu16\t\tRamCodeSize;\t// The size of RAM code\n\tu8\t\tFoundry;\n\tu8\t\tRsvd2;\n\n\t//--- LONG WORD 2 ----\n\tu32\t\tSvnIdx;\t// The SVN entry index\n\tu32\t\tRsvd3;\n\n\t//--- LONG WORD 3 ----\n\tu32\t\tRsvd4;\n\tu32\t\tRsvd5;\n}RT_8188E_FIRMWARE_HDR, *PRT_8188E_FIRMWARE_HDR;\n#endif // download firmware related data structure\n\n\n#define DRIVER_EARLY_INT_TIME_8188E\t\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8188E\t\t0x02\n\n\n//#define MAX_RX_DMA_BUFFER_SIZE_88E\t      0x2400 //9k for 88E nornal chip , //MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24))\n#define RX_DMA_SIZE_88E(__Adapter) ((!IS_VENDOR_8188E_I_CUT_SERIES(__Adapter))?0x2800:0x4000)\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#define RX_DMA_RESERVD_FW_FEATURE\t0x200 /* for tx report (64*8) */\n\n#define MAX_RX_DMA_BUFFER_SIZE_88E(__Adapter) RX_DMA_SIZE_88E(__Adapter)-RX_DMA_RESERVD_FW_FEATURE\n\n#define MAX_TX_REPORT_BUFFER_SIZE\t\t\t0x0400 /* 1k */\n\n// Note: We will divide number of page equally for each queue other than public queue!\n// 22k = 22528 bytes = 176 pages (@page =  128 bytes)\n// must reserved about 7 pages for LPS =>  176-7 = 169 (0xA9)\n// 2*BCN / 1*ps-poll / 1*null-data /1*prob_rsp /1*QOS null-data /1*BT QOS null-data \n\n#define BCNQ_PAGE_NUM_88E\t\t0x08\n\n//For WoWLan , more reserved page\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_88E\t0x00\n#else\n#define WOWLAN_PAGE_NUM_88E\t0x00\n#endif\n\n/* Note: \nTx FIFO Size : previous CUT:22K /I_CUT after:32KB\nTx page Size : 128B\nTotal page numbers : 176(0xB0) / 256(0x100)\n*/\n#define TOTAL_PAGE_NUMBER_88E(_Adapter)\t((IS_VENDOR_8188E_I_CUT_SERIES(_Adapter)?0x100:0xB0) - 1)/* must reserved 1 page for dma issue */\n#define TX_TOTAL_PAGE_NUMBER_88E(_Adapter)\t(TOTAL_PAGE_NUMBER_88E(_Adapter) - BCNQ_PAGE_NUM_88E - WOWLAN_PAGE_NUM_88E)\n#define TX_PAGE_BOUNDARY_88E(_Adapter)\t\t(TX_TOTAL_PAGE_NUMBER_88E(_Adapter) + 1) /* beacon header start address */\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E(_Adapter)\tTX_TOTAL_PAGE_NUMBER_88E(_Adapter)\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_88E(_Adapter)\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_88E(_Adapter) + 1)\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B\n#define NORMAL_PAGE_NUM_HPQ_88E\t\t0x0\n#define NORMAL_PAGE_NUM_LPQ_88E\t\t0x09\n#define NORMAL_PAGE_NUM_NPQ_88E\t\t0x0\n\n// Note: For Normal Chip Setting, modify later\n#define WMM_NORMAL_PAGE_NUM_HPQ_88E\t\t0x29\n#define WMM_NORMAL_PAGE_NUM_LPQ_88E\t\t0x1C\n#define WMM_NORMAL_PAGE_NUM_NPQ_88E\t\t0x1C\n\n\n//-------------------------------------------------------------------------\n//\tChip specific\n//-------------------------------------------------------------------------\n#define CHIP_BONDING_IDENTIFIER(_value)\t(((_value)>>22)&0x3)\n#define CHIP_BONDING_92C_1T2R\t0x1\n#define CHIP_BONDING_88C_USB_MCARD\t0x2\n#define CHIP_BONDING_88C_USB_HP\t0x1\n\n//-------------------------------------------------------------------------\n//\tChannel Plan\n//-------------------------------------------------------------------------\n\n\n#define EFUSE_REAL_CONTENT_LEN\t\t512\n#define EFUSE_MAP_LEN\t\t\t\t128\n#define EFUSE_MAX_SECTION\t\t\t16\n#define EFUSE_IC_ID_OFFSET\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR(addr) \t(addr < EFUSE_REAL_CONTENT_LEN)\n//\n// <Roger_Notes>\n// To prevent out of boundary programming case,\n// leave 1byte and program full section\n// 9bytes + 1byt + 5bytes and pre 1byte.\n// For worst case:\n// | 1byte|----8bytes----|1byte|--5bytes--| \n// |         |            Reserved(14bytes)\t      |\n//\n#define EFUSE_OOB_PROTECT_BYTES \t\t15\t// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.\n\n#define\t\tEFUSE_REAL_CONTENT_LEN_88E\t256\n#define\t\tEFUSE_MAP_LEN_88E\t\t512\n#define\t\tEFUSE_MAX_SECTION_88E\t\t64\n#define\t\tEFUSE_MAX_WORD_UNIT_88E\t\t4\n#define\t\tEFUSE_IC_ID_OFFSET_88E\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define \t\tAVAILABLE_EFUSE_ADDR_88E(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_88E)\n// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section\n// 9bytes + 1byt + 5bytes and pre 1byte.\n// For worst case:\n// | 2byte|----8bytes----|1byte|--7bytes--| //92D\n#define \t\tEFUSE_OOB_PROTECT_BYTES_88E\t18 \t// PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.\n#define\t\tEFUSE_PROTECT_BYTES_BANK_88E\t16\n\n\n//========================================================\n//\t\t\tEFUSE for BT definition\n//========================================================\n#define EFUSE_BT_REAL_CONTENT_LEN\t\t1536\t// 512*3\n#define EFUSE_BT_MAP_LEN\t\t\t\t1024\t// 1k bytes\n#define EFUSE_BT_MAX_SECTION\t\t\t128\t\t// 1024/8\n\n#define EFUSE_PROTECT_BYTES_BANK\t\t16\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n//#define IS_MULTI_FUNC_CHIP(_Adapter)\t(((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE)\n\n//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )\n\n#ifdef CONFIG_PCI_HCI\nvoid InterruptRecognized8188EE(PADAPTER Adapter, PRT_ISR_CONTENT pIsrContent);\nvoid UpdateInterruptMask8188EE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\n#endif\t//CONFIG_PCI_HCI\n\n// rtl8188e_hal_init.c\n\ns32 rtl8188e_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw);\nvoid _8051Reset88E(PADAPTER padapter);\nvoid rtl8188e_InitializeFirmwareVars(PADAPTER padapter);\n\n\ns32 InitLLTTable(PADAPTER padapter, u8 txpktbuf_bndy);\n\n// EFuse\nu8 GetEEPROMSize8188E(PADAPTER padapter);\nvoid Hal_InitPGData88E(PADAPTER padapter);\nvoid Hal_EfuseParseIDCode88E(PADAPTER padapter, u8 *hwinfo);\nvoid Hal_ReadTxPowerInfo88E(PADAPTER padapter,u8* hwinfo,BOOLEAN\tAutoLoadFail);\n\t\nvoid Hal_EfuseParseEEPROMVer88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid rtl8188e_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseCustomerID88E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_ReadAntennaDiversity88E\t(PADAPTER pAdapter,u8*PROMContent,BOOLEAN AutoLoadFail);\nvoid Hal_ReadThermalMeter_88E(PADAPTER\tAdapter,u8* PROMContent,BOOLEAN \tAutoloadFail);\nvoid Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\n\nBOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter);\n\t\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\n\n#ifdef CONFIG_RF_GAIN_OFFSET\nvoid Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\n#endif //CONFIG_RF_GAIN_OFFSET\n\nvoid rtl8188e_init_default_value(_adapter *adapter);\n\nvoid rtl8188e_set_hal_ops(struct hal_ops *pHalFunc);\n\n// register\nvoid SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);\n\nvoid rtl8188e_start_thread(_adapter *padapter);\nvoid rtl8188e_stop_thread(_adapter *padapter);\n\nvoid rtw_IOL_cmd_tx_pkt_buf_dump(ADAPTER *Adapter,int data_len);\n#ifdef CONFIG_IOL_EFUSE_PATCH\ns32 rtl8188e_iol_efuse_patch(PADAPTER padapter);\n#endif//CONFIG_IOL_EFUSE_PATCH\nvoid _InitTransferPageSize(PADAPTER padapter);\n\nvoid SetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\nvoid GetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);\nvoid ResumeTxBeacon(PADAPTER padapter);\nvoid StopTxBeacon(PADAPTER padapter);\nu8\nGetHalDefVar8188E(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tHAL_DEF_VARIABLE\t\teVariable,\n\tIN\tPVOID\t\t\t\t\tpValue\n\t);\n#endif //__RTL8188E_HAL_H__\n\n"
  },
  {
    "path": "include/rtl8188e_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_LED_H__\n#define __RTL8188E_LED_H__\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8188eu_InitSwLeds(PADAPTER padapter);\nvoid rtl8188eu_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8188ee_InitSwLeds(PADAPTER padapter);\nvoid rtl8188ee_DeInitSwLeds(PADAPTER padapter);\n#endif\n#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\nvoid rtl8188es_InitSwLeds(PADAPTER padapter);\nvoid rtl8188es_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8188e_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_RECV_H__\n#define __RTL8188E_RECV_H__\n\n#define RECV_BLK_SZ 512\n#define RECV_BLK_CNT 16\n#define RECV_BLK_TH RECV_BLK_CNT\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t//#define MAX_RECVBUF_SZ (32768) // 32k\n\t\t//#define MAX_RECVBUF_SZ (16384) //16K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K\n\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t#define MAX_RECVBUF_SZ (8192) // 8K\n\t\t#else\n\t\t        #define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t#else\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\n#define MAX_RECVBUF_SZ (10240)\n\n#endif\n\n// Rx smooth factor\n#define\tRx_Smooth_Factor (20)\n\n#define TX_RPT1_PKT_LEN 8\n\ntypedef struct rxreport_8188e\n{\n\t//Offset 0\n\tu32 pktlen:14;\n\tu32 crc32:1;\n\tu32 icverr:1;\n\tu32 drvinfosize:4;\n\tu32 security:3;\n\tu32 qos:1;\n\tu32 shift:2;\n\tu32 physt:1;\n\tu32 swdec:1;\n\tu32 ls:1;\n\tu32 fs:1;\n\tu32 eor:1;\n\tu32 own:1;\n\n\t//Offset 4\n\tu32 macid:5;\n\tu32 tid:4;\n\tu32 hwrsvd:4;\n\tu32 amsdu:1;\n\tu32 paggr:1;\n\tu32 faggr:1;\n\tu32 a1fit:4;\n\tu32 a2fit:4;\n\tu32 pam:1;\n\tu32 pwr:1;\n\tu32 md:1;\n\tu32 mf:1;\n\tu32 type:2;\n\tu32 mc:1;\n\tu32 bc:1;\n\n\t//Offset 8\n\tu32 seq:12;\n\tu32 frag:4;\n\tu32 nextpktlen:14;\n\tu32 nextind:1;\n\tu32 rsvd0831:1;\n\n\t//Offset 12\n\tu32 rxmcs:6;\n\tu32 rxht:1;\n\tu32 gf:1;\n\tu32 splcp:1;\n\tu32 bw:1;\n\tu32 htc:1;\n\tu32 eosp:1;\n\tu32 bssidfit:2;\n\tu32 rpt_sel:2;\n\tu32 rsvd1216:13;\n\tu32 pattern_match:1;\n\tu32 unicastwake:1;\n\tu32 magicwake:1;\n\n\t//Offset 16\n\t/*\n\tu32 pattern0match:1;\n\tu32 pattern1match:1;\n\tu32 pattern2match:1;\n\tu32 pattern3match:1;\n\tu32 pattern4match:1;\n\tu32 pattern5match:1;\n\tu32 pattern6match:1;\n\tu32 pattern7match:1;\n\tu32 pattern8match:1;\n\tu32 pattern9match:1;\n\tu32 patternamatch:1;\n\tu32 patternbmatch:1;\n\tu32 patterncmatch:1;\t\n\tu32 rsvd1613:19;\n\t*/\n\tu32 rsvd16;\n\n\t//Offset 20\n\tu32 tsfl;\n\n\t//Offset 24\n\tu32 bassn:12;\n\tu32 bavld:1;\n\tu32 rsvd2413:19;\n} RXREPORT, *PRXREPORT;\n\n\n#if defined (CONFIG_SDIO_HCI)||defined(CONFIG_GSPI_HCI)\ns32 rtl8188es_init_recv_priv(PADAPTER padapter);\nvoid rtl8188es_free_recv_priv(PADAPTER padapter);\nvoid rtl8188es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\n#endif\n\n#ifdef CONFIG_USB_HCI\nvoid rtl8188eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\ns32 rtl8188eu_init_recv_priv(PADAPTER padapter);\nvoid rtl8188eu_free_recv_priv(PADAPTER padapter);\nvoid rtl8188eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\nvoid rtl8188eu_recv_tasklet(void *priv);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8188ee_init_recv_priv(PADAPTER padapter);\nvoid rtl8188ee_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8188e_query_rx_desc_status(union recv_frame *precvframe, struct recv_stat *prxstat);\n\n#endif /* __RTL8188E_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8188e_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_RF_H__\n#define __RTL8188E_RF_H__\n\n\n\nint\tPHY_RF6052_Config8188E(\tIN\tPADAPTER\t\tAdapter\t);\nvoid\t\trtl8188e_RF_ChangeTxPath(\tIN\tPADAPTER\tAdapter, \n\t\t\t\t\t\t\t\t\t\tIN\tu16\t\tDataRate);\nvoid\t\trtl8188e_PHY_RF6052SetBandwidth(\t\n\t\t\t\t\t\t\t\t\t\tIN\tPADAPTER\t\t\t\tAdapter,\n\t\t\t\t\t\t\t\t\t\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n#endif//__RTL8188E_RF_H__\n\n"
  },
  {
    "path": "include/rtl8188e_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8188E_SPEC_H__\n#define __RTL8188E_SPEC_H__\n\n\n//============================================================\n//       8188E Regsiter offset definition\n//============================================================\n\n\n//============================================================\n//\n//============================================================\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_BB_PAD_CTRL\t\t\t\t0x0064\n#define REG_HMEBOX_E0\t\t\t\t\t0x0088\n#define REG_HMEBOX_E1\t\t\t\t\t0x008A\n#define REG_HMEBOX_E2\t\t\t\t\t0x008C\n#define REG_HMEBOX_E3\t\t\t\t\t0x008E\n#define REG_HMEBOX_EXT_0\t\t\t\t0x01F0\n#define REG_HMEBOX_EXT_1\t\t\t\t0x01F4\n#define REG_HMEBOX_EXT_2\t\t\t\t0x01F8\n#define REG_HMEBOX_EXT_3\t\t\t\t0x01FC\n#define REG_HIMR_88E\t\t\t\t\t0x00B0 //RTL8188E\n#define REG_HISR_88E\t\t\t\t\t0x00B4 //RTL8188E\n#define REG_HIMRE_88E\t\t\t\t\t0x00B8 //RTL8188E\n#define REG_HISRE_88E\t\t\t\t\t0x00BC //RTL8188E\n#define REG_MACID_NO_LINK_0\t\t\t0x0484\n#define REG_MACID_NO_LINK_1\t\t\t0x0488\n#define REG_MACID_PAUSE_0\t\t\t0x048c\n#define REG_MACID_PAUSE_1\t\t\t0x0490\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_PKTBUF_DBG_ADDR \t\t\t(REG_PKTBUF_DBG_CTRL)\n#define REG_RXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+2)\n#define REG_TXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+3)\n#define REG_WOWLAN_WAKE_REASON\t\tREG_MCUTST_WOWLAN\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x01a4\n#define REG_TXPKTBUF_IV_HIGH            0x01a8\n#endif\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#ifdef CONFIG_RF_GAIN_OFFSET\n#define EEPROM_RF_GAIN_OFFSET\t\t\t0xC1\n#define EEPROM_RF_GAIN_VAL\t\t\t\t0xF6\n#define EEPROM_THERMAL_OFFSET\t\t\t0xF5\n#endif //CONFIG_RF_GAIN_OFFSET\n//----------------------------------------------------------------------------\n//       88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits)  \n//----------------------------------------------------------------------------\n//IOL config for REG_FDHM0(Reg0x88)\n#define CMD_INIT_LLT\t\t\t\t\tBIT0\n#define CMD_READ_EFUSE_MAP\t\tBIT1\n#define CMD_EFUSE_PATCH\t\t\tBIT2\n#define CMD_IOCONFIG\t\t\t\tBIT3\n#define CMD_INIT_LLT_ERR\t\t\tBIT4\n#define CMD_READ_EFUSE_MAP_ERR\tBIT5\n#define CMD_EFUSE_PATCH_ERR\t\tBIT6\n#define CMD_IOCONFIG_ERR\t\t\tBIT7\n\n//-----------------------------------------------------\n//\n//\tRedifine register definition for compatibility\n//\n//-----------------------------------------------------\n\n// TODO: use these definition when using REG_xxx naming rule.\n// NOTE: DO NOT Remove these definition. Use later.\n#define ISR_88E\t\t\t\tREG_HISR_88E\n\n#ifdef CONFIG_PCI_HCI\n//#define IMR_RX_MASK\t\t(IMR_ROK_88E|IMR_RDU_88E|IMR_RXFOVW_88E)\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_88E|IMR_VIDOK_88E|IMR_BEDOK_88E|IMR_BKDOK_88E|IMR_MGNTDOK_88E|IMR_HIGHDOK_88E|IMR_BCNDERR0_88E)\n\n#ifdef CONFIG_CONCURRENT_MODE\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E | IMR_BCNDMAINT_E_88E)\n#else\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_88E | IMR_TBDOK_88E | IMR_TBDER_88E)\n#endif\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_88E | IMR_VODOK_88E | IMR_BEDOK_88E|IMR_BKDOK_88E)\n#endif\n\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_88E 64\n#define SEC_CAM_ENT_NUM_88E 32\n#define NSS_NUM_88E 1\n#define BAND_CAP_88E (BAND_CAP_2G)\n#define BW_CAP_88E (BW_CAP_20M | BW_CAP_40M)\n\n//----------------------------------------------------------------------------\n//       8192C EEPROM/EFUSE share register definition.\n//----------------------------------------------------------------------------\n\n#define EFUSE_ACCESS_ON\t\t\t0x69\t// For RTL8723 only.\n#define EFUSE_ACCESS_OFF\t\t\t0x00\t// For RTL8723 only.\n\n#endif /* __RTL8188E_SPEC_H__ */\n\n"
  },
  {
    "path": "include/rtl8188e_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL8188E_SRESET_H_\n#define _RTL8188E_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8188e_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8188e_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8188e_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188E_XMIT_H__\n#define __RTL8188E_XMIT_H__\n\n\n\n\n//For 88e early mode\n#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\n#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value)\n#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value)\n#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value)\n#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value)\n#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value)\n#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value)\n\n//\n//defined for TX DESC Operation\n//\n\n#define MAX_TID (15)\n\n//OFFSET 0\n#define OFFSET_SZ\t0\n#define OFFSET_SHT\t16\n#define BMC\t\tBIT(24)\n#define LSG\t\tBIT(26)\n#define FSG\t\tBIT(27)\n#define OWN \t\tBIT(31)\n\n\n//OFFSET 4\n#define PKT_OFFSET_SZ\t\t0\n#define QSEL_SHT\t\t\t8\n#define RATE_ID_SHT\t\t\t16\n#define NAVUSEHDR\t\t\tBIT(20)\n#define SEC_TYPE_SHT \t\t22\n#define PKT_OFFSET_SHT\t\t26\n\n//OFFSET 8\n#define AGG_EN\t\t\t\tBIT(12)\n#define AGG_BK\t\t\t\t\tBIT(16)\n#define AMPDU_DENSITY_SHT\t20\n#define ANTSEL_A\t\t\tBIT(24)\n#define ANTSEL_B\t\t\tBIT(25)\n#define TX_ANT_CCK_SHT\t\t26\n#define TX_ANTL_SHT\t\t\t28\n#define TX_ANT_HT_SHT\t\t30\n\n//OFFSET 12\n#define SEQ_SHT\t\t\t\t16\n#define EN_HWSEQ\t\t\tBIT(31)\n\n//OFFSET 16\n#define \tQOS                          BIT(6)\n#define\tHW_SSN\t\t\t\tBIT(7)\n#define \tUSERATE\t\t\tBIT(8)\n#define \tDISDATAFB\t\t\tBIT(10)\n#define   CTS_2_SELF\t\t\tBIT(11)\n#define\tRTS_EN\t\t\t\tBIT(12)\n#define\tHW_RTS_EN\t\t\tBIT(13)\n#define \tDATA_SHORT\t\t\tBIT(24)\n#define \tPWR_STATUS_SHT\t15\n#define \tDATA_SC_SHT\t\t20\n#define \tDATA_BW\t\t\tBIT(25)\n\n//OFFSET 20\n#define\tRTY_LMT_EN\t\t\tBIT(17)\n\n\n//OFFSET 20\n#define SGI\t\t\t\t\tBIT(6)\n#define USB_TXAGG_NUM_SHT\t24\n\ntypedef struct txdesc_88e\n{\n\t//Offset 0\n\tu32 pktlen:16;\n\tu32 offset:8;\n\tu32 bmc:1;\n\tu32 htc:1;\n\tu32 ls:1;\n\tu32 fs:1;\n\tu32 linip:1;\n\tu32 noacm:1;\n\tu32 gf:1;\n\tu32 own:1;\n\n\t//Offset 4\n\tu32 macid:6;\n\tu32 rsvd0406:2;\t\n\tu32 qsel:5;\n\tu32 rd_nav_ext:1;\n\tu32 lsig_txop_en:1;\n\tu32 pifs:1;\n\tu32 rate_id:4;\n\tu32 navusehdr:1;\n\tu32 en_desc_id:1;\n\tu32 sectype:2;\n\tu32 rsvd0424:2;\n\tu32 pkt_offset:5;\t// unit: 8 bytes\n\tu32 rsvd0431:1;\n\n\t//Offset 8\n\tu32 rts_rc:6;\n\tu32 data_rc:6;\n\tu32 agg_en:1;\n\tu32 rd_en:1;\n\tu32 bar_rty_th:2;\n\tu32 bk:1;\n\tu32 morefrag:1;\n\tu32 raw:1;\n\tu32 ccx:1;\n\tu32 ampdu_density:3;\n\tu32 bt_null:1;\n\tu32 ant_sel_a:1;\n\tu32 ant_sel_b:1;\n\tu32 tx_ant_cck:2;\n\tu32 tx_antl:2;\n\tu32 tx_ant_ht:2;\n\n\t//Offset 12\n\tu32 nextheadpage:8;\n\tu32 tailpage:8;\n\tu32 seq:12;\n\tu32 cpu_handle:1;\n\tu32 tag1:1;\n\tu32 trigger_int:1;\n\tu32 hwseq_en:1;\n\n\t//Offset 16\n\tu32 rtsrate:5;\n\tu32 ap_dcfe:1;\n\tu32 hwseq_sel:2;\n\tu32 userate:1;\n\tu32 disrtsfb:1;\n\tu32 disdatafb:1;\n\tu32 cts2self:1;\n\tu32 rtsen:1;\n\tu32 hw_rts_en:1;\n\tu32 port_id:1;\t\n\tu32 pwr_status:3;\n\tu32 wait_dcts:1;\n\tu32 cts2ap_en:1;\n\tu32 data_sc:2;\n\tu32 data_stbc:2;\n\tu32 data_short:1;\n\tu32 data_bw:1;\n\tu32 rts_short:1;\n\tu32 rts_bw:1;\n\tu32 rts_sc:2;\n\tu32 vcs_stbc:2;\n\n\t//Offset 20\n\tu32 datarate:6;\n\tu32 sgi:1;\n\tu32 try_rate:1;\n\tu32 data_ratefb_lmt:5;\n\tu32 rts_ratefb_lmt:4;\n\tu32 rty_lmt_en:1;\n\tu32 data_rt_lmt:6;\n\tu32 usb_txagg_num:8;\n\n\t//Offset 24\n\tu32 txagg_a:5;\n\tu32 txagg_b:5;\n\tu32 use_max_len:1;\n\tu32 max_agg_num:5;\n\tu32 mcsg1_max_len:4;\n\tu32 mcsg2_max_len:4;\n\tu32 mcsg3_max_len:4;\n\tu32 mcs7_sgi_max_len:4;\n\n\t//Offset 28\n\tu32 checksum:16;\t// TxBuffSize(PCIe)/CheckSum(USB)\n\tu32 sw0:8; /* offset 30 */\n\tu32 sw1:4;\n\tu32 mcs15_sgi_max_len:4;\n}TXDESC_8188E, *PTXDESC_8188E;\n\n#define txdesc_set_ccx_sw_88e(txdesc, value) \\\n\tdo { \\\n\t\t((struct txdesc_88e *)(txdesc))->sw1 = (((value)>>8) & 0x0f); \\\n\t\t((struct txdesc_88e *)(txdesc))->sw0 = ((value) & 0xff); \\\n\t} while (0)\n\nstruct txrpt_ccx_88e {\n\t/* offset 0 */\n\tu8 tag1:1;\n\tu8 pkt_num:3;\n\tu8 txdma_underflow:1;\n\tu8 int_bt:1;\n\tu8 int_tri:1;\n\tu8 int_ccx:1;\n\n\t/* offset 1 */\n\tu8 mac_id:6;\n\tu8 pkt_ok:1;\n\tu8 bmc:1;\n\n\t/* offset 2 */\n\tu8 retry_cnt:6;\n\tu8 lifetime_over:1;\n\tu8 retry_over:1;\n\n\t/* offset 3 */\n\tu8 ccx_qtime0;\n\tu8 ccx_qtime1;\n\n\t/* offset 5 */\n\tu8 final_data_rate;\n\n\t/* offset 6 */\n\tu8 sw1:4;\n\tu8 qsel:4;\n\n\t/* offset 7 */\n\tu8 sw0;\n};\n\n#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8))\n#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))\n\n#define SET_TX_DESC_SEC_TYPE_8188E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n\nvoid rtl8188e_fill_fake_txdesc(PADAPTER\tpadapter,u8*pDesc,u32 BufferLen,\n\t\tu8 IsPsPoll,u8\tIsBTQosNull, u8 bDataFrame);\nvoid rtl8188e_cal_txdesc_chksum(struct tx_desc\t*ptxdesc);\n\n#if defined(CONFIG_SDIO_HCI)||defined (CONFIG_GSPI_HCI)\ns32 rtl8188es_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188es_free_xmit_priv(PADAPTER padapter);\ns32 rtl8188es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8188es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nthread_return rtl8188es_xmit_thread(thread_context context);\ns32 rtl8188es_xmit_buf_handler(PADAPTER padapter);\n\n#ifdef CONFIG_SDIO_TX_TASKLET\nvoid rtl8188es_xmit_tasklet(void *priv);\n#endif\n#endif\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8188eu_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188eu_free_xmit_priv(PADAPTER padapter);\ns32 rtl8188eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8188eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188eu_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8188eu_xmit_tasklet(void *priv);\ns32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8188ee_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188ee_free_xmit_priv(PADAPTER padapter);\nvoid\trtl8188ee_xmitframe_resume(_adapter *padapter);\ns32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8188ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8188ee_xmit_tasklet(void *priv);\n#endif\n\n\n\n#ifdef CONFIG_TX_EARLY_MODE\nvoid UpdateEarlyModeInfo8188E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf );\n#endif\n\n#ifdef CONFIG_XMIT_ACK\nvoid dump_txrpt_ccx_88e(void *buf);\nvoid handle_txrpt_ccx_88e(_adapter *adapter, u8 *buf);\n#else\n#define dump_txrpt_ccx_88e(buf) do {} while(0)\n#define handle_txrpt_ccx_88e(adapter, buf) do {} while(0)\n#endif //CONFIG_XMIT_ACK\n\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,struct tx_desc *ptxdesc);\n#endif //__RTL8188E_XMIT_H__\n\n"
  },
  {
    "path": "include/rtl8188f_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_CMD_H__\n#define __RTL8188F_CMD_H__\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD DEFINITION    ------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\nenum h2c_cmd_8188F{\n\t//Common Class: 000\n\tH2C_8188F_RSVD_PAGE = 0x00,\n\tH2C_8188F_MEDIA_STATUS_RPT = 0x01,\n\tH2C_8188F_SCAN_ENABLE = 0x02,\n\tH2C_8188F_KEEP_ALIVE = 0x03,\n\tH2C_8188F_DISCON_DECISION = 0x04,\t\n\tH2C_8188F_PSD_OFFLOAD = 0x05,\t\n\tH2C_8188F_AP_OFFLOAD = 0x08,\t\n\tH2C_8188F_BCN_RSVDPAGE = 0x09,\t\n\tH2C_8188F_PROBERSP_RSVDPAGE = 0x0A,\t\n\tH2C_8188F_FCS_RSVDPAGE = 0x10,\t\n\tH2C_8188F_FCS_INFO = 0x11,\t\n\tH2C_8188F_AP_WOW_GPIO_CTRL = 0x13,\n\n\t//PoweSave Class: 001\n\tH2C_8188F_SET_PWR_MODE = 0x20,\n\tH2C_8188F_PS_TUNING_PARA = 0x21,\n\tH2C_8188F_PS_TUNING_PARA2 = 0x22,\n\tH2C_8188F_P2P_LPS_PARAM = 0x23,\t\n\tH2C_8188F_P2P_PS_OFFLOAD = 0x24,\t\n\tH2C_8188F_PS_SCAN_ENABLE = 0x25,\t\n\tH2C_8188F_SAP_PS_ = 0x26,\t\n\tH2C_8188F_INACTIVE_PS_ = 0x27, //Inactive_PS\n\tH2C_8188F_FWLPS_IN_IPS_ = 0x28,\n\t\n\t//Dynamic Mechanism Class: 010\n\tH2C_8188F_MACID_CFG = 0x40,\t\n\tH2C_8188F_TXBF = 0x41,\t\n\tH2C_8188F_RSSI_SETTING = 0x42,\t\n\tH2C_8188F_AP_REQ_TXRPT = 0x43,\t\n\tH2C_8188F_INIT_RATE_COLLECT = 0x44,\t\n\tH2C_8188F_RA_PARA_ADJUST = 0x46,\n\t\n\t//BT Class: 011\n\tH2C_8188F_B_TYPE_TDMA = 0x60,\n\tH2C_8188F_BT_INFO = 0x61,\n\tH2C_8188F_FORCE_BT_TXPWR = 0x62,\n\tH2C_8188F_BT_IGNORE_WLANACT = 0x63,\n\tH2C_8188F_DAC_SWING_VALUE = 0x64,\n\tH2C_8188F_ANT_SEL_RSV = 0x65,\n\tH2C_8188F_WL_OPMODE = 0x66,\n\tH2C_8188F_BT_MP_OPER = 0x67,\n\tH2C_8188F_BT_CONTROL = 0x68,\n\tH2C_8188F_BT_WIFI_CTRL = 0x69,\n\tH2C_8188F_BT_FW_PATCH = 0x6A,\n\tH2C_8188F_BT_WLAN_CALIBRATION = 0x6D,\t\n\t\n\t//WOWLAN Class: 100\n\tH2C_8188F_WOWLAN = 0x80,\n\tH2C_8188F_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_8188F_AOAC_GLOBAL_INFO = 0x82,\t\n\tH2C_8188F_AOAC_RSVD_PAGE = 0x83,\t\n\tH2C_8188F_AOAC_RSVD_PAGE2 = 0x84,\n\tH2C_8188F_D0_SCAN_OFFLOAD_CTRL = 0x85,\n\tH2C_8188F_D0_SCAN_OFFLOAD_INFO = 0x86,\n\tH2C_8188F_CHNL_SWITCH_OFFLOAD = 0x87,\n\tH2C_8188F_P2P_OFFLOAD_RSVD_PAGE = 0x8A,\t\n\tH2C_8188F_P2P_OFFLOAD = 0x8B,\n\n\tH2C_8188F_RESET_TSF = 0xC0,\n\tH2C_8188F_MAXID,\n};\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD CONTENT    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n//_RSVDPAGE_LOC_CMD_0x00\n#define SET_8188F_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8188F_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8188F_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8188F_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD_0x01\n#define SET_8188F_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8188F_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8188F_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8188F_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_KEEP_ALIVE_CMD_0x03\n#define SET_8188F_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8188F_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8188F_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8188F_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n\n//_DISCONNECT_DECISION_CMD_0x04\n#define SET_8188F_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8188F_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8188F_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8188F_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n// _PWR_MOD_CMD_0x20\n#define SET_8188F_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n\n#define GET_8188F_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n// _PS_TUNE_PARAM_CMD_0x21\n#define SET_8188F_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8188F_H2CCMD_PSTUNE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 1, __Value)\n#define SET_8188F_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 1, 7, __Value)\n#define SET_8188F_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n//_MACID_CFG_CMD_0x40\n#define SET_8188F_H2CCMD_MACID_CFG_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_RAID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 5, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_SGI_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 7, 1, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_BW(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 2, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_NO_UPDATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 3, 1, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_VHT_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 4, 2, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_DISPT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 6, 1, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_DISRA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 7, 1, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_RATE_MASK0(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_RATE_MASK1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_RATE_MASK2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+5, 0, 8, __Value)\n#define SET_8188F_H2CCMD_MACID_CFG_RATE_MASK3(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+6, 0, 8, __Value)\n\n//_RSSI_SETTING_CMD_0x42\n#define SET_8188F_H2CCMD_RSSI_SETTING_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_RSSI_SETTING_RSSI(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 7, __Value)\n#define SET_8188F_H2CCMD_RSSI_SETTING_ULDL_STATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n// _AP_REQ_TXRPT_CMD_0x43\n#define SET_8188F_H2CCMD_APREQRPT_PARM_MACID1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8188F_H2CCMD_APREQRPT_PARM_MACID2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n\n// _FORCE_BT_TXPWR_CMD_0x62\n#define SET_8188F_H2CCMD_BT_PWR_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n\n// _FORCE_BT_MP_OPER_CMD_0x67\n#define SET_8188F_H2CCMD_BT_MPOPER_VER(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)\n#define SET_8188F_H2CCMD_BT_MPOPER_REQNUM(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 4, __Value)\n#define SET_8188F_H2CCMD_BT_MPOPER_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8188F_H2CCMD_BT_MPOPER_PARAM1(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)\n#define SET_8188F_H2CCMD_BT_MPOPER_PARAM2(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8188F_H2CCMD_BT_MPOPER_PARAM3(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n\n// _BT_FW_PATCH_0x6A\n#define SET_8188F_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value)\n#define SET_8188F_H2CCMD_BT_FW_PATCH_ADDR0(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) \n#define SET_8188F_H2CCMD_BT_FW_PATCH_ADDR1(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) \n#define SET_8188F_H2CCMD_BT_FW_PATCH_ADDR2(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) \n#define SET_8188F_H2CCMD_BT_FW_PATCH_ADDR3(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)\n\n\n//---------------------------------------------------------------------------------------------------------//\n//-------------------------------------------    Structure    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    Function Statement     --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n// host message to firmware cmd\nvoid rtl8188f_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);\nvoid rtl8188f_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus);\nvoid rtl8188f_set_rssi_cmd(PADAPTER padapter, u8 *param);\nvoid rtl8188f_Add_RateATid(PADAPTER pAdapter, u64 bitmap, u8* arg, u8 rssi_level);\nvoid rtl8188f_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack);\n//s32 rtl8188f_set_lowpwr_lps_cmd(PADAPTER padapter, u8 enable);\nvoid rtl8188f_set_FwPsTuneParam_cmd(PADAPTER padapter);\nvoid rtl8188f_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask);\nvoid rtl8188f_set_FwMediaStatusRpt_cmd(PADAPTER\tpadapter, u8 mstatus, u8 macid);\nvoid rtl8188f_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param);\nvoid rtl8188f_download_rsvd_page(PADAPTER padapter, u8 mstatus);\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8188f_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);\n#endif // CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P\nvoid rtl8188f_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid SetFwRelatedForWoWLAN8188f(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif//CONFIG_WOWLAN\n\n#ifdef CONFIG_P2P_WOWLAN\nvoid rtl8188f_set_p2p_wowlan_offload_cmd(PADAPTER padapter);\n#endif\n\nvoid rtl8188f_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param);\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\nu8 rtl8188f_reset_tsf(_adapter *padapter, u8 reset_port);\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\ns32 FillH2CCmd8188F(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nu8 GetTxBufferRsvdPageNum8188F(_adapter *padapter, bool wowlan);\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_DM_H__\n#define __RTL8188F_DM_H__\n//============================================================\n// Description:\n//\n// This file is for 8188F dynamic mechanism only\n//\n//\n//============================================================\n\n//============================================================\n// structure and define\n//============================================================\n\n//============================================================\n// function prototype\n//============================================================\n\nvoid rtl8188f_init_dm_priv(PADAPTER padapter);\nvoid rtl8188f_deinit_dm_priv(PADAPTER padapter);\n\nvoid rtl8188f_InitHalDm(PADAPTER padapter);\nvoid rtl8188f_HalDmWatchDog(PADAPTER padapter);\nvoid rtl8188f_HalDmWatchDog_in_LPS(PADAPTER padapter);\nvoid rtl8188f_hal_dm_in_lps(PADAPTER padapter);\n\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_HAL_H__\n#define __RTL8188F_HAL_H__\n\n#include \"hal_data.h\"\n\n#include \"rtl8188f_spec.h\"\n#include \"rtl8188f_rf.h\"\n#include \"rtl8188f_dm.h\"\n#include \"rtl8188f_recv.h\"\n#include \"rtl8188f_xmit.h\"\n#include \"rtl8188f_cmd.h\"\n#include \"rtl8188f_led.h\"\n#include \"Hal8188FPwrSeq.h\"\n#include \"Hal8188FPhyReg.h\"\n#include \"Hal8188FPhyCfg.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8188f_sreset.h\"\n#endif\n\n\n//---------------------------------------------------------------------\n//\t\tRTL8188F From file\n//---------------------------------------------------------------------\n\t#define RTL8188F_FW_IMG\t\t\t\t\t\"rtl8188f/FW_NIC.bin\"\n\t#define RTL8188F_FW_WW_IMG\t\t\t\t\"rtl8188f/FW_WoWLAN.bin\"\n\t#define RTL8188F_PHY_REG\t\t\t\t\t\"rtl8188f/PHY_REG.txt\"\n\t#define RTL8188F_PHY_RADIO_A\t\t\t\t\"rtl8188f/RadioA.txt\"\n\t#define RTL8188F_PHY_RADIO_B\t\t\t\t\"rtl8188f/RadioB.txt\"\n\t#define RTL8188F_TXPWR_TRACK\t\t\t\t\"rtl8188f/TxPowerTrack.txt\" \n\t#define RTL8188F_AGC_TAB\t\t\t\t\t\"rtl8188f/AGC_TAB.txt\"\n\t#define RTL8188F_PHY_MACREG \t\t\t\t\"rtl8188f/MAC_REG.txt\"\n\t#define RTL8188F_PHY_REG_PG\t\t\t\t\"rtl8188f/PHY_REG_PG.txt\"\n\t#define RTL8188F_PHY_REG_MP\t\t\t\t\"rtl8188f/PHY_REG_MP.txt\"\n\t#define RTL8188F_TXPWR_LMT \t\t\t\t\"rtl8188f/TXPWR_LMT.txt\"\n\n//---------------------------------------------------------------------\n//\t\tRTL8188F From header\n//---------------------------------------------------------------------\n\n#if MP_DRIVER == 1\n\t#define Rtl8188F_FwBTImgArray\t\t\t\tRtl8188FFwBTImgArray\n\t#define Rtl8188F_FwBTImgArrayLength\t\tRtl8188FFwBTImgArrayLength\n\n\t#define Rtl8188F_FwMPImageArray\t\t\tRtl8188FFwMPImgArray\n\t#define Rtl8188F_FwMPImgArrayLength\t\tRtl8188FMPImgArrayLength\n\n\t#define Rtl8188F_PHY_REG_Array_MP\t\t\tRtl8188F_PHYREG_Array_MP\n\t#define Rtl8188F_PHY_REG_Array_MPLength\tRtl8188F_PHYREG_Array_MPLength\n#endif\n\n\n#define FW_8188F_SIZE\t\t\t0x8000\n#define FW_8188F_START_ADDRESS\t0x1000\n#define FW_8188F_END_ADDRESS\t\t0x1FFF //0x5FFF\n\n#define IS_FW_HEADER_EXIST_8188F(_pFwHdr)\t((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88F0)\n\ntypedef struct _RT_FIRMWARE {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_8188F_SIZE];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8188F, *PRT_FIRMWARE_8188F;\n\n//\n// This structure must be cared byte-ordering\n//\n// Added by tynli. 2009.12.04.\ntypedef struct _RT_8188F_FIRMWARE_HDR\n{\n\t// 8-byte alinment required\n\n\t//--- LONG WORD 0 ----\n\tu16\t\tSignature;\t// 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n\tu8\t\tCategory;\t// AP/NIC and USB/PCI\n\tu8\t\tFunction;\t// Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n\tu16\t\tVersion;\t\t// FW Version\n\tu16\t\tSubversion;\t// FW Subversion, default 0x00\n\n\t//--- LONG WORD 1 ----\n\tu8\t\tMonth;\t// Release time Month field\n\tu8\t\tDate;\t// Release time Date field\n\tu8\t\tHour;\t// Release time Hour field\n\tu8\t\tMinute;\t// Release time Minute field\n\tu16\t\tRamCodeSize;\t// The size of RAM code\n\tu16\t\tRsvd2;\n\n\t//--- LONG WORD 2 ----\n\tu32\t\tSvnIdx;\t// The SVN entry index\n\tu32\t\tRsvd3;\n\n\t//--- LONG WORD 3 ----\n\tu32\t\tRsvd4;\n\tu32\t\tRsvd5;\n}RT_8188F_FIRMWARE_HDR, *PRT_8188F_FIRMWARE_HDR;\n\n#define DRIVER_EARLY_INT_TIME_8188F\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8188F\t\t0x02\n\n// for 8188F\n// TX 32K, RX 16K, Page size 128B for TX, 8B for RX\n#define PAGE_SIZE_TX_8188F\t\t\t128\n#define PAGE_SIZE_RX_8188F\t\t\t8\n\n#define RX_DMA_SIZE_8188F\t\t\t0x4000\t// 16K\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8188F\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8188F\t0x80\t// 128B, reserved for tx report\n#endif\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#define RX_DMA_BOUNDARY_8188F\t\t(RX_DMA_SIZE_8188F - RX_DMA_RESERVED_SIZE_8188F - 1)\n\n// Note: We will divide number of page equally for each queue other than public queue!\n\n//For General Reserved Page Number(Beacon Queue is reserved page)\n//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1\n#define BCNQ_PAGE_NUM_8188F\t\t0x08\n#ifdef CONFIG_CONCURRENT_MODE\n#define BCNQ1_PAGE_NUM_8188F\t\t0x08 // 0x04\n#else\n#define BCNQ1_PAGE_NUM_8188F\t\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef BCNQ1_PAGE_NUM_8188F\n#define BCNQ1_PAGE_NUM_8188F\t\t0x00 // 0x04\n#endif\n\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8188F\t0x07\n#else\n#define WOWLAN_PAGE_NUM_8188F\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef WOWLAN_PAGE_NUM_8188F\n#define WOWLAN_PAGE_NUM_8188F\t0x15\n#endif\n\n#ifdef CONFIG_AP_WOWLAN\n#define AP_WOWLAN_PAGE_NUM_8188F\t0x02\n#endif\n\n#define TX_TOTAL_PAGE_NUMBER_8188F\t(0xFF - BCNQ_PAGE_NUM_8188F - BCNQ1_PAGE_NUM_8188F - WOWLAN_PAGE_NUM_8188F)\n#define TX_PAGE_BOUNDARY_8188F\t\t(TX_TOTAL_PAGE_NUMBER_8188F + 1)\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8188F\tTX_TOTAL_PAGE_NUMBER_8188F\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8188F\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8188F + 1)\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8188F\n#define NORMAL_PAGE_NUM_HPQ_8188F\t\t0x0C\n#define NORMAL_PAGE_NUM_LPQ_8188F\t\t0x02\n#define NORMAL_PAGE_NUM_NPQ_8188F\t\t0x02\n\n// Note: For Normal Chip Setting, modify later\n#define WMM_NORMAL_PAGE_NUM_HPQ_8188F\t\t0x30\n#define WMM_NORMAL_PAGE_NUM_LPQ_8188F\t\t0x20\n#define WMM_NORMAL_PAGE_NUM_NPQ_8188F\t\t0x20\n\n\n#include \"HalVerDef.h\"\n#include \"hal_com.h\"\n\n#define EFUSE_OOB_PROTECT_BYTES \t\t15\n\n#define HAL_EFUSE_MEMORY\n\n#define HWSET_MAX_SIZE_8188F\t\t\t512\n#define EFUSE_REAL_CONTENT_LEN_8188F\t\t512\n#define EFUSE_MAP_LEN_8188F\t\t\t\t512\n#define EFUSE_MAX_SECTION_8188F\t\t\t64\n\n#define EFUSE_IC_ID_OFFSET\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_8188F)\n\n#define EFUSE_ACCESS_ON\t\t\t0x69\t// For RTL8188 only.\n#define EFUSE_ACCESS_OFF\t\t\t0x00\t// For RTL8188 only.\n\n//========================================================\n//\t\t\tEFUSE for BT definition\n//========================================================\n#define EFUSE_BT_REAL_BANK_CONTENT_LEN\t512\n#define EFUSE_BT_REAL_CONTENT_LEN\t\t1536\t// 512*3\n#define EFUSE_BT_MAP_LEN\t\t\t\t1024\t// 1k bytes\n#define EFUSE_BT_MAX_SECTION\t\t\t128\t\t// 1024/8\n\n#define EFUSE_PROTECT_BYTES_BANK\t\t16\n\ntypedef struct _C2H_EVT_HDR\n{\n\tu8\tCmdID;\n\tu8\tCmdLen;\n\tu8\tCmdSeq;\n} __attribute__((__packed__)) C2H_EVT_HDR, *PC2H_EVT_HDR;\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n// rtl8188a_hal_init.c\ns32 rtl8188f_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw);\nvoid rtl8188f_FirmwareSelfReset(PADAPTER padapter);\nvoid rtl8188f_InitializeFirmwareVars(PADAPTER padapter);\n\nvoid rtl8188f_InitAntenna_Selection(PADAPTER padapter);\nvoid rtl8188f_DeinitAntenna_Selection(PADAPTER padapter);\nvoid rtl8188f_CheckAntenna_Selection(PADAPTER padapter);\nvoid rtl8188f_init_default_value(PADAPTER padapter);\n\ns32 rtl8188f_InitLLTTable(PADAPTER padapter);\n\ns32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU);\ns32 CardDisableWithoutHWSM(PADAPTER padapter);\n\n// EFuse\nu8 GetEEPROMSize8188F(PADAPTER padapter);\nvoid Hal_InitPGData(PADAPTER padapter, u8 *PROMContent);\nvoid Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo);\nvoid Hal_EfuseParseTxPowerInfo_8188F(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail);\n/* void Hal_EfuseParseBTCoexistInfo_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail); */\nvoid Hal_EfuseParseEEPROMVer_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseChnlPlan_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseCustomerID_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParsePowerSavingMode_8188F(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseAntennaDiversity_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseXtal_8188F(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail);\nvoid Hal_EfuseParseThermalMeter_8188F(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail);\nvoid Hal_EfuseParseKFreeData_8188F(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nVOID Hal_EfuseParseMacHidden_8188F(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\n\n#if 0 /* Do not need for rtl8188f */\nVOID Hal_EfuseParseVoltage_8188F(PADAPTER pAdapter,u8* hwinfo,BOOLEAN \tAutoLoadFail); \n#endif\n\n#ifdef CONFIG_C2H_PACKET_EN\nvoid rtl8188f_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length);\n#endif\n\nvoid rtl8188f_set_pll_ref_clk_sel(_adapter *adapter, u8 sel);\n\nvoid rtl8188f_set_hal_ops(struct hal_ops *pHalFunc);\nvoid SetHwReg8188F(PADAPTER padapter, u8 variable, u8 *val);\nvoid GetHwReg8188F(PADAPTER padapter, u8 variable, u8 *val);\n#ifdef CONFIG_C2H_PACKET_EN\nvoid SetHwRegWithBuf8188F(PADAPTER padapter, u8 variable, u8 *pbuf, int len);\n#endif // CONFIG_C2H_PACKET_EN\nu8 SetHalDefVar8188F(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\nu8 GetHalDefVar8188F(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\n\n// register\nvoid rtl8188f_InitBeaconParameters(PADAPTER padapter);\nvoid rtl8188f_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode);\nvoid\t_InitBurstPktLen_8188FS(PADAPTER Adapter);\nvoid _8051Reset8188(PADAPTER padapter);\n#ifdef CONFIG_WOWLAN\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\nvoid rtl8188f_start_thread(_adapter *padapter);\nvoid rtl8188f_stop_thread(_adapter *padapter);\n\n#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)\nvoid rtl8188fs_init_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8188fs_free_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8188fs_cancle_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8188fs_hal_check_bt_hang(_adapter * adapter);\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nvoid HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue);\n#endif\n\nint FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\n\nvoid CCX_FwC2HTxRpt_8188f(PADAPTER padapter, u8 *pdata, u8 len);\n#ifdef CONFIG_FW_C2H_DEBUG\nvoid Debug_FwC2H_8188f(PADAPTER padapter, u8 *pdata, u8 len);\n#endif //CONFIG_FW_C2H_DEBUG\ns32 c2h_id_filter_ccx_8188f(u8 *buf);\ns32 c2h_handler_8188f(PADAPTER padapter, u8 *pC2hEvent);\nu8 MRateToHwRate8188F(u8  rate);\nu8 HwRateToMRate8188F(u8\t rate);\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8188FE(PADAPTER Adapter);\nVOID\tUpdateInterruptMask8188FE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_LED_H__\n#define __RTL8188F_LED_H__\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8188fu_InitSwLeds(PADAPTER padapter);\nvoid rtl8188fu_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8188fs_InitSwLeds(PADAPTER padapter);\nvoid rtl8188fs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_GSPI_HCI\nvoid rtl8188fs_InitSwLeds(PADAPTER padapter);\nvoid rtl8188fs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8188fe_InitSwLeds(PADAPTER padapter);\nvoid rtl8188fe_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_RECV_H__\n#define __RTL8188F_RECV_H__\n\n#if defined(CONFIG_USB_HCI)\n\t#ifndef MAX_RECVBUF_SZ\n\t\t#ifdef PLATFORM_OS_CE\n\t\t\t#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t\t#else\n\t\t\t#ifdef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t\t\t#else\n\t\t\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t\t\t#define MAX_RECVBUF_SZ (8192) // 8K\n\t\t\t\t#elif defined(CONFIG_PLATFORM_HISILICON)\n\t\t\t\t\t#define MAX_RECVBUF_SZ (16384) /* 16k */\n\t\t\t\t#else\n\t\t\t\t\t#define MAX_RECVBUF_SZ (32768) /* 32k */\n\t\t\t\t#endif\n\t\t\t\t//#define MAX_RECVBUF_SZ (20480) //20K\n\t\t\t\t//#define MAX_RECVBUF_SZ (10240) //10K \n\t\t\t\t//#define MAX_RECVBUF_SZ (16384) //  16k - 92E RX BUF :16K\n\t\t\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\t\t\n\t\t\t#endif\n\t\t#endif\n\t#endif //!MAX_RECVBUF_SZ\n#elif defined(CONFIG_PCI_HCI)\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n#elif defined(CONFIG_SDIO_HCI)\n\t#define MAX_RECVBUF_SZ (RX_DMA_BOUNDARY_8188F + 1)\n#endif /* CONFIG_SDIO_HCI */\n\n// Rx smooth factor\n#define\tRx_Smooth_Factor (20)\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8188fs_init_recv_priv(PADAPTER padapter);\nvoid rtl8188fs_free_recv_priv(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_USB_HCI\nint rtl8188fu_init_recv_priv(_adapter *padapter);\nvoid rtl8188fu_free_recv_priv (_adapter *padapter);\nvoid rtl8188fu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8188fe_init_recv_priv(PADAPTER padapter);\nvoid rtl8188fe_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8188f_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8188F_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8188f_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_RF_H__\n#define __RTL8188F_RF_H__\n\nint\tPHY_RF6052_Config8188F(\tIN\tPADAPTER\t\tAdapter\t);\n\nVOID\nPHY_RF6052SetBandwidth8188F(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8188F_SPEC_H__\n#define __RTL8188F_SPEC_H__\n\n#include <drv_conf.h>\n\n\n#define HAL_NAV_UPPER_UNIT_8188F\t\t128\t\t// micro-second\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_RSV_CTRL_8188F\t\t\t\t0x001C\t// 3 Byte\n#define REG_BT_WIFI_ANTENNA_SWITCH_8188F\t0x0038\n#define REG_HSISR_8188F\t\t\t\t\t0x005c\n#define REG_PAD_CTRL1_8188F\t\t0x0064\n#define REG_AFE_CTRL_4_8188F\t\t0x0078\n#define REG_HMEBOX_DBG_0_8188F\t0x0088\n#define REG_HMEBOX_DBG_1_8188F\t0x008A\n#define REG_HMEBOX_DBG_2_8188F\t0x008C\n#define REG_HMEBOX_DBG_3_8188F\t0x008E\n#define REG_HIMR0_8188F\t\t\t\t\t0x00B0\n#define REG_HISR0_8188F\t\t\t\t\t0x00B4\n#define REG_HIMR1_8188F\t\t\t\t\t0x00B8\n#define REG_HISR1_8188F\t\t\t\t\t0x00BC\n#define REG_PMC_DBG_CTRL2_8188F\t\t\t0x00CC\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_C2HEVT_CMD_ID_8188F\t0x01A0\n#define REG_C2HEVT_CMD_LEN_8188F\t0x01AE\n#define REG_WOWLAN_WAKE_REASON 0x01C7\n#define REG_WOWLAN_GTK_DBG1\t0x630\n#define REG_WOWLAN_GTK_DBG2\t0x634\n\n#define REG_HMEBOX_EXT0_8188F\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8188F\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8188F\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8188F\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_CONTROL_8188F\t\t0x0286 // Control the RX DMA.\n#define REG_RXDMA_MODE_CTRL_8188F\t\t0x0290\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8188F\t\t0x0300\n#define\tREG_INT_MIG_8188F\t\t\t\t0x0304\t// Interrupt Migration \n#define\tREG_BCNQ_DESA_8188F\t\t\t0x0308\t// TX Beacon Descriptor Address\n#define\tREG_HQ_DESA_8188F\t\t\t\t0x0310\t// TX High Queue Descriptor Address\n#define\tREG_MGQ_DESA_8188F\t\t\t0x0318\t// TX Manage Queue Descriptor Address\n#define\tREG_VOQ_DESA_8188F\t\t\t0x0320\t// TX VO Queue Descriptor Address\n#define\tREG_VIQ_DESA_8188F\t\t\t\t0x0328\t// TX VI Queue Descriptor Address\n#define\tREG_BEQ_DESA_8188F\t\t\t0x0330\t// TX BE Queue Descriptor Address\n#define\tREG_BKQ_DESA_8188F\t\t\t0x0338\t// TX BK Queue Descriptor Address\n#define\tREG_RX_DESA_8188F\t\t\t\t0x0340\t// RX Queue\tDescriptor Address\n#define\tREG_DBI_WDATA_8188F\t\t\t0x0348\t// DBI Write Data\n#define\tREG_DBI_RDATA_8188F\t\t\t0x034C\t// DBI Read Data\n#define\tREG_DBI_ADDR_8188F\t\t\t\t0x0350\t// DBI Address\n#define\tREG_DBI_FLAG_8188F\t\t\t\t0x0352\t// DBI Read/Write Flag\n#define\tREG_MDIO_WDATA_8188F\t\t0x0354\t// MDIO for Write PCIE PHY\n#define\tREG_MDIO_RDATA_8188F\t\t\t0x0356\t// MDIO for Reads PCIE PHY\n#define\tREG_MDIO_CTL_8188F\t\t\t0x0358\t// MDIO for Control\n#define\tREG_DBG_SEL_8188F\t\t\t\t0x0360\t// Debug Selection Register\n#define\tREG_PCIE_HRPWM_8188F\t\t\t0x0361\t//PCIe RPWM\n#define\tREG_PCIE_HCPWM_8188F\t\t\t0x0363\t//PCIe CPWM\n#define\tREG_PCIE_MULTIFET_CTRL_8188F\t0x036A\t//PCIE Multi-Fethc Control\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_TXPKTBUF_BCNQ_BDNY_8188F\t0x0424\n#define REG_TXPKTBUF_MGQ_BDNY_8188F\t0x0425\n#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8188F\t0x045D\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x0484\n#define REG_TXPKTBUF_IV_HIGH            0x0488\n#endif\n#define REG_AMPDU_BURST_MODE_8188F\t0x04BC\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_SECONDARY_CCA_CTRL_8188F\t0x0577\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n\n\n//============================================================\n// SDIO Bus Specification\n//============================================================\n\n//-----------------------------------------------------\n// SDIO CMD Address Mapping\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// I/O bus domain (Host)\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// SDIO register\n//-----------------------------------------------------\n#define SDIO_REG_HIQ_FREEPG_8188F\t\t0x0020\n#define SDIO_REG_MID_FREEPG_8188F\t\t0x0022\n#define SDIO_REG_LOW_FREEPG_8188F\t\t0x0024\n#define SDIO_REG_PUB_FREEPG_8188F\t\t0x0026\n#define SDIO_REG_EXQ_FREEPG_8188F\t\t0x0028\n#define SDIO_REG_AC_OQT_FREEPG_8188F\t0x002A\n#define SDIO_REG_NOAC_OQT_FREEPG_8188F\t0x002B\n\n#define SDIO_REG_HCPWM1_8188F\t\t\t0x0038\n\n/* indirect access */\n#define SDIO_REG_INDIRECT_REG_CFG_8188F\t\t0x40\n#define SET_INDIRECT_REG_ADDR(_cmd, _addr)\tSET_BITS_TO_LE_2BYTE(((u8 *)(_cmd)) + 0, 0, 16, (_addr))\n#define SET_INDIRECT_REG_SIZE_1BYTE(_cmd)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_cmd)) + 2, 0, 2, 0)\n#define SET_INDIRECT_REG_SIZE_2BYTE(_cmd)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_cmd)) + 2, 0, 2, 1)\n#define SET_INDIRECT_REG_SIZE_4BYTE(_cmd)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_cmd)) + 2, 0, 2, 2)\n#define SET_INDIRECT_REG_WRITE(_cmd)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_cmd)) + 2, 2, 1, 1)\n#define SET_INDIRECT_REG_READ(_cmd)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_cmd)) + 2, 3, 1, 1)\n#define GET_INDIRECT_REG_RDY(_cmd)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_cmd)) + 2, 4, 1)\n\n#define SDIO_REG_INDIRECT_REG_DATA_8188F\t0x44\n\n//============================================================================\n//\t8188 Regsiter Bit and Content definition\n//============================================================================\n\n//2 HSISR\n// interrupt mask which needs to clear\n#define MASK_HSISR_CLEAR\t\t(HSISR_GPIO12_0_INT |\\\n\t\t\t\t\t\t\t\tHSISR_SPS_OCP_INT |\\\n\t\t\t\t\t\t\t\tHSISR_RON_INT |\\\n\t\t\t\t\t\t\t\tHSISR_PDNINT |\\\n\t\t\t\t\t\t\t\tHSISR_GPIO9_INT)\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define BIT_USB_RXDMA_AGG_EN\tBIT(31)\n#define RXDMA_AGG_MODE_EN\t\tBIT(1)\n\n#ifdef CONFIG_WOWLAN\n#define RXPKT_RELEASE_POLL\t\tBIT(16)\n#define RXDMA_IDLE\t\t\t\tBIT(17)\n#define RW_RELEASE_EN\t\t\tBIT(18)\n#endif\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n\n//----------------------------------------------------------------------------\n//       8188F REG_CCK_CHECK\t\t\t\t\t\t(offset 0x454)\n//----------------------------------------------------------------------------\n#define BIT_BCN_PORT_SEL\t\tBIT5\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n\n//----------------------------------------------------------------------------\n//       8195 IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8188F\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8188F\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8188F\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8188F\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8188F\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8188F\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8188F\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8188F\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8188F\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8188F\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8188F\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8188F\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8188F\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8188F\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8188F\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8188F\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8188F\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8188F\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8188F\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8188F\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8188F\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8188F\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8188F\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8188F\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8188F\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_BCNDMAINT7_8188F\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8188F\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8188F\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8188F\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8188F\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8188F\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8188F\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8188F\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8188F\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8188F\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8188F\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8188F\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8188F\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8188F\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8188F\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8188F\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8188F\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8188F\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8188F\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n#ifdef CONFIG_PCI_HCI\n//#define IMR_RX_MASK\t\t(IMR_ROK_8188F|IMR_RDU_8188F|IMR_RXFOVW_8188F)\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_8188F|IMR_VIDOK_8188F|IMR_BEDOK_8188F|IMR_BKDOK_8188F|IMR_MGNTDOK_8188F|IMR_HIGHDOK_8188F)\n\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_8188F | IMR_TXBCN0OK_8188F | IMR_TXBCN0ERR_8188F | IMR_BCNDERR0_8188F)\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_8188F | IMR_VODOK_8188F | IMR_BEDOK_8188F|IMR_BKDOK_8188F)\n#endif\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8188F 16\n#define SEC_CAM_ENT_NUM_8188F 16\n#define NSS_NUM_8188F 1\n#define BAND_CAP_8188F (BAND_CAP_2G)\n#define BW_CAP_8188F (BW_CAP_20M | BW_CAP_40M)\n\n#endif /* __RTL8188F_SPEC_H__ */\n\n"
  },
  {
    "path": "include/rtl8188f_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL8188F_SRESET_H_\n#define _RTL8188F_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8188f_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8188f_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8188f_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8188F_XMIT_H__\n#define __RTL8188F_XMIT_H__\n\n\n#define MAX_TID (15)\n\n\n#ifndef __INC_HAL8188FDESC_H\n#define __INC_HAL8188FDESC_H\n\n#define RX_STATUS_DESC_SIZE_8188F\t\t24\n#define RX_DRV_INFO_SIZE_UNIT_8188F 8\n\n\n//DWORD 0\n#define SET_RX_STATUS_DESC_PKT_LEN_8188F(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_8188F(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_8188F(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n#define GET_RX_STATUS_DESC_PKT_LEN_8188F(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICV_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8188F(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_8188F(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_8188F(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_LAST_SEG_8188F(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1)\n#define GET_RX_STATUS_DESC_FIRST_SEG_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1)\n#define GET_RX_STATUS_DESC_EOR_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_OWN_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_8188F(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_TID_8188F(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_AMSDU_8188F(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_8188F(__pRxDesc)\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_8188F(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_A1_FIT_8188F(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4)\n#define GET_RX_STATUS_DESC_CHKERR_8188F(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_IPVER_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_IS_TCPUDP__8188F(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_CHK_VLD_8188F(__pRxDesc) \tLE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_8188F(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_8188F(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_MC_8188F(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_8188F(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_8188F(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#define GET_RX_STATUS_DESC_RX_IS_QOS_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8188F(__pRxStatusDesc) \tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_RPT_SEL_8188F(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_HTC_8188F(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_8188F(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_8188F(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#ifdef CONFIG_USB_RX_AGGREGATION\n#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8188F(__pRxStatusDesc)\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)\n#endif\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_MATCH_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_MATCH_8188F(__pRxDesc) \t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1)\n\n//DWORD 6\n#define GET_RX_STATUS_DESC_SPLCP_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1)\n#define GET_RX_STATUS_DESC_LDPC_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1)\n#define GET_RX_STATUS_DESC_STBC_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1)\n#define GET_RX_STATUS_DESC_BW_8188F(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2)\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_8188F(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n#define GET_RX_STATUS_DESC_BUFF_ADDR_8188F(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\n#define GET_RX_STATUS_DESC_BUFF_ADDR64_8188F(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\n\n#define SET_RX_STATUS_DESC_BUFF_ADDR_8188F(__pRxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\n\n\n// Dword 0\n#define GET_TX_DESC_OWN_8188F(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n\n#define SET_TX_DESC_PKT_SIZE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define SET_TX_DESC_OFFSET_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define SET_TX_DESC_BMC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_FIRST_SEG_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_LINIP_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_NO_ACM_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_OWN_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n\n// Dword 1\n#define SET_TX_DESC_MACID_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n\n\n// Dword 2\n#define SET_TX_DESC_PAID_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_AGG_BREAK_8188F(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define SET_TX_DESC_RAW_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define SET_TX_DESC_SPE_RPT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_INT_8188F(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_8188F(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)\n#define SET_TX_DESC_CHK_EN_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)\n#define SET_TX_DESC_EARLY_MODE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HWSEQ_SEL_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_8188F(__pTxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_CTROL_STBC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_MBSSID_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n#define SET_TX_DESC_ANTSEL_A_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANTSEL_C_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\n#define SET_TX_DESC_ANTSEL_D_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)\n\n// Dword 7\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n#define SET_TX_DESC_TX_BUFFER_SIZE_8188F(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#else\n#define SET_TX_DESC_TX_DESC_CHECKSUM_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#endif\n#define SET_TX_DESC_USB_TXAGG_NUM_8188F(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)\n#if(DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n#define SET_TX_DESC_SDIO_TXSEQ_8188F(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)\n#endif\n\n// Dword 8\n#define SET_TX_DESC_HWSEQ_EN_8188F(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n\n// Dword 9\n#define SET_TX_DESC_SEQ_8188F(__pTxDesc, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n\n// Dword 10\n#define SET_TX_DESC_TX_BUFFER_ADDRESS_8188F(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\n#define GET_TX_DESC_TX_BUFFER_ADDRESS_8188F(__pTxDesc) \tLE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)\n\n// Dword 11\n#define SET_TX_DESC_NEXT_DESC_ADDRESS_8188F(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\n\n\n#define SET_EARLYMODE_PKTNUM_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,\t__Value)\n#define SET_EARLYMODE_LEN3_8188F(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\n#endif\n//-----------------------------------------------------------\n//\n//\tRate\n//\n//-----------------------------------------------------------\n// CCK Rates, TxHT = 0\n#define DESC8188F_RATE1M\t\t\t\t0x00\n#define DESC8188F_RATE2M\t\t\t\t0x01\n#define DESC8188F_RATE5_5M\t\t\t\t0x02\n#define DESC8188F_RATE11M\t\t\t\t0x03\n\n// OFDM Rates, TxHT = 0\n#define DESC8188F_RATE6M\t\t\t\t0x04\n#define DESC8188F_RATE9M\t\t\t\t0x05\n#define DESC8188F_RATE12M\t\t\t\t0x06\n#define DESC8188F_RATE18M\t\t\t\t0x07\n#define DESC8188F_RATE24M\t\t\t\t0x08\n#define DESC8188F_RATE36M\t\t\t\t0x09\n#define DESC8188F_RATE48M\t\t\t\t0x0a\n#define DESC8188F_RATE54M\t\t\t\t0x0b\n\n// MCS Rates, TxHT = 1\n#define DESC8188F_RATEMCS0\t\t\t\t0x0c\n#define DESC8188F_RATEMCS1\t\t\t\t0x0d\n#define DESC8188F_RATEMCS2\t\t\t\t0x0e\n#define DESC8188F_RATEMCS3\t\t\t\t0x0f\n#define DESC8188F_RATEMCS4\t\t\t\t0x10\n#define DESC8188F_RATEMCS5\t\t\t\t0x11\n#define DESC8188F_RATEMCS6\t\t\t\t0x12\n#define DESC8188F_RATEMCS7\t\t\t\t0x13\n#define DESC8188F_RATEMCS8\t\t\t\t0x14\n#define DESC8188F_RATEMCS9\t\t\t\t0x15\n#define DESC8188F_RATEMCS10 \t\t0x16\n#define DESC8188F_RATEMCS11 \t\t0x17\n#define DESC8188F_RATEMCS12 \t\t0x18\n#define DESC8188F_RATEMCS13 \t\t0x19\n#define DESC8188F_RATEMCS14 \t\t0x1a\n#define DESC8188F_RATEMCS15 \t\t0x1b\n#define DESC8188F_RATEVHTSS1MCS0\t\t0x2c\n#define DESC8188F_RATEVHTSS1MCS1\t\t0x2d\n#define DESC8188F_RATEVHTSS1MCS2\t\t0x2e\n#define DESC8188F_RATEVHTSS1MCS3\t\t0x2f\n#define DESC8188F_RATEVHTSS1MCS4\t\t0x30\n#define DESC8188F_RATEVHTSS1MCS5\t\t0x31\n#define DESC8188F_RATEVHTSS1MCS6\t\t0x32\n#define DESC8188F_RATEVHTSS1MCS7\t\t0x33\n#define DESC8188F_RATEVHTSS1MCS8\t\t0x34\n#define DESC8188F_RATEVHTSS1MCS9\t\t0x35\n#define DESC8188F_RATEVHTSS2MCS0\t\t0x36\n#define DESC8188F_RATEVHTSS2MCS1\t\t0x37\n#define DESC8188F_RATEVHTSS2MCS2\t\t0x38\n#define DESC8188F_RATEVHTSS2MCS3\t\t0x39\n#define DESC8188F_RATEVHTSS2MCS4\t\t0x3a\n#define DESC8188F_RATEVHTSS2MCS5\t\t0x3b\n#define DESC8188F_RATEVHTSS2MCS6\t\t0x3c\n#define DESC8188F_RATEVHTSS2MCS7\t\t0x3d\n#define DESC8188F_RATEVHTSS2MCS8\t\t0x3e\n#define DESC8188F_RATEVHTSS2MCS9\t\t0x3f\n\n\n#define \tRX_HAL_IS_CCK_RATE_8188F(pDesc)\\\n\t\t\t(GET_RX_STATUS_DESC_RX_RATE_8188F(pDesc) == DESC8188F_RATE1M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8188F(pDesc) == DESC8188F_RATE2M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8188F(pDesc) == DESC8188F_RATE5_5M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8188F(pDesc) == DESC8188F_RATE11M)\n\n\nvoid rtl8188f_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem);\nvoid rtl8188f_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8188fs_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188fs_free_xmit_priv(PADAPTER padapter);\ns32 rtl8188fs_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188fs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8188fs_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188fs_xmit_buf_handler(PADAPTER padapter);\nthread_return rtl8188fs_xmit_thread(thread_context context);\n#define hal_xmit_handler rtl8188fs_xmit_buf_handler\n#endif\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8188fu_xmit_buf_handler(PADAPTER padapter);\n#define hal_xmit_handler rtl8188fu_xmit_buf_handler\n\n\ns32 rtl8188fu_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188fu_free_xmit_priv(PADAPTER padapter);\ns32 rtl8188fu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188fu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\t rtl8188fu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\n//s32 rtl8812au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8188fu_xmit_tasklet(void *priv);\ns32 rtl8188fu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,struct tx_desc *ptxdesc);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8188fe_init_xmit_priv(PADAPTER padapter);\nvoid rtl8188fe_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8188fe_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid\trtl8188fe_xmitframe_resume(_adapter *padapter);\ns32 rtl8188fe_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8188fe_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8188fe_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8188fe_xmit_tasklet(void *priv);\n#endif\n\nu8\tBWMapping_8188F(PADAPTER Adapter, struct pkt_attrib *pattrib);\nu8\tSCMapping_8188F(PADAPTER Adapter, struct pkt_attrib\t*pattrib);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8192e_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_CMD_H__\n#define __RTL8192E_CMD_H__\n\ntypedef enum _RTL8192E_H2C_CMD \n{\n\tH2C_8192E_RSVDPAGE\t= 0x00,\n\tH2C_8192E_MSRRPT\t= 0x01,\n\tH2C_8192E_SCAN\t\t= 0x02,\n\tH2C_8192E_KEEP_ALIVE_CTRL = 0x03,\n\tH2C_8192E_DISCONNECT_DECISION = 0x04,\n\tH2C_8192E_INIT_OFFLOAD = 0x06,\n\tH2C_8192E_AP_OFFLOAD = 0x08,\n\tH2C_8192E_BCN_RSVDPAGE = 0x09,\n\tH2C_8192E_PROBERSP_RSVDPAGE = 0x0a,\n\n\tH2C_8192E_AP_WOW_GPIO_CTRL = 0x13,\n\t\n\tH2C_8192E_SETPWRMODE = 0x20,\t\t\n\tH2C_8192E_PS_TUNING_PARA = 0x21,\n\tH2C_8192E_PS_TUNING_PARA2 = 0x22,\n\tH2C_8192E_PS_LPS_PARA = 0x23,\n\tH2C_8192E_P2P_PS_OFFLOAD = 0x24,\n\tH2C_8192E_SAP_PS = 0x26,\n\tH2C_8192E_RA_MASK = 0x40,\n\tH2C_8192E_RSSI_REPORT = 0x42,\n\tH2C_8192E_RA_PARA_ADJUST = 0x46,\n\n\tH2C_8192E_WO_WLAN = 0x80,\n\tH2C_8192E_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_8192E_AOAC_GLOBAL_INFO = 0x82,\n\tH2C_8192E_AOAC_RSVDPAGE = 0x83,\n\n\t//Not defined in new 88E H2C CMD Format\n\tH2C_8192E_SELECTIVE_SUSPEND_ROF_CMD,\n\tH2C_8192E_P2P_PS_MODE,\n\tH2C_8192E_PSD_RESULT,\n\tMAX_8192E_H2CCMD\n}RTL8192E_H2C_CMD;\n\nstruct cmd_msg_parm {\n\tu8 eid; //element id\n\tu8 sz; // sz\n\tu8 buf[6];\n};\n\nenum{\n\tPWRS\n};\n\ntypedef struct _SETPWRMODE_PARM {\n\tu8 Mode;//0:Active,1:LPS,2:WMMPS\n\t//u8 RLBM:4;//0:Min,1:Max,2: User define\n\tu8 SmartPS_RLBM;//LPS=0:PS_Poll,1:PS_Poll,2:NullData,WMM=0:PS_Poll,1:NullData\n\tu8 AwakeInterval;\t// unit: beacon interval\n\tu8 bAllQueueUAPSD;\n\tu8 PwrState;//AllON(0x0c),RFON(0x04),RFOFF(0x00)\n} SETPWRMODE_PARM, *PSETPWRMODE_PARM;\n\nstruct H2C_SS_RFOFF_PARAM{\n\tu8 ROFOn; // 1: on, 0:off\n\tu16 gpio_period; // unit: 1024 us\n}__attribute__ ((packed));\n\n\ntypedef struct JOINBSSRPT_PARM_92E{\n\tu8 OpMode;\t// RT_MEDIA_STATUS\n#ifdef CONFIG_WOWLAN\n\tu8 MacID;       // MACID\n#endif //CONFIG_WOWLAN\n}JOINBSSRPT_PARM_92E, *PJOINBSSRPT_PARM_92E;\n\n/* move to hal_com_h2c.h\ntypedef struct _RSVDPAGE_LOC_92E {\n\tu8 LocProbeRsp;\n\tu8 LocPsPoll;\n\tu8 LocNullData;\n\tu8 LocQosNull;\n\tu8 LocBTQosNull;\n} RSVDPAGE_LOC_92E, *PRSVDPAGE_LOC_92E;\n*/\n\n\n//_SETPWRMODE_PARM\n#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n//_P2P_PS_OFFLOAD\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n\n\n// host message to firmware cmd\nvoid rtl8192e_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);\nvoid rtl8192e_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);\nu8 rtl8192e_set_rssi_cmd(PADAPTER padapter, u8 *param);\nvoid rtl8192e_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg);\nvoid rtl8192e_Add_RateATid(PADAPTER padapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\ns32 FillH2CCmd_8192E(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nu8 GetTxBufferRsvdPageNum8192E(_adapter *padapter, bool wowlan);\n//u8 rtl8192c_set_FwSelectSuspend_cmd(PADAPTER padapter, u8 bfwpoll, u16 period);\ns32 c2h_handler_8192e(PADAPTER padapter, u8 *buf);\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8192e_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);\n#endif // CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P_PS\nvoid rtl8192e_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\nvoid rtl8192e_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt );\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\nint reset_tsf(PADAPTER Adapter, u8 reset_port );\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid SetFwRelatedForWoWLAN8192E(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif\n/// TX Feedback Content\n#define \tUSEC_UNIT_FOR_8192E_C2H_TX_RPT_QUEUE_TIME\t\t\t256\n\n#define\tGET_8192E_C2H_TX_RPT_QUEUE_SELECT(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 0, 5)\n#define\tGET_8192E_C2H_TX_RPT_PKT_BROCAST(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 5, 1)\n#define\tGET_8192E_C2H_TX_RPT_LIFE_TIME_OVER(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 6, 1)\n#define\tGET_8192E_C2H_TX_RPT_RETRY_OVER(_Header)\t\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 7, 1)\n#define\tGET_8192E_C2H_TX_RPT_MAC_ID(_Header)\t\t\t\t\tLE_BITS_TO_1BYTE((_Header + 1), 0, 8)\n#define\tGET_8192E_C2H_TX_RPT_DATA_RETRY_CNT(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 2), 0, 6)\n#define\tGET_8192E_C2H_TX_RPT_QUEUE_TIME(_Header)\t\t\t\tLE_BITS_TO_2BYTE((_Header + 3), 0, 16)\t// In unit of 256 microseconds.\n#define\tGET_8192E_C2H_TX_RPT_FINAL_DATA_RATE(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 5), 0, 8)\n\n\n\nvoid C2HContentParsing8192E(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tu1Byte\t\t\tc2hCmdId, \n\tIN\tu1Byte\t\t\tc2hCmdLen,\n\tIN\tpu1Byte \t\t\ttmpBuf\n);\nVOID\nC2HPacketHandler_8192E(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tpu1Byte\t\t\tBuffer,\n\tIN\tu1Byte\t\t\tLength\n);\n\n#endif//__RTL8192E_CMD_H__"
  },
  {
    "path": "include/rtl8192e_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_DM_H__\n#define __RTL8192E_DM_H__\n\n\nvoid rtl8192e_init_dm_priv(IN PADAPTER Adapter);\nvoid rtl8192e_deinit_dm_priv(IN PADAPTER Adapter);\nvoid rtl8192e_InitHalDm(IN PADAPTER Adapter);\nvoid rtl8192e_HalDmWatchDog(IN PADAPTER Adapter);\n\n//VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter);\n\n//void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal);\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nvoid\tAntDivCompare8192e(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\nu8 AntDivBeforeLink8192e(PADAPTER Adapter );\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8192e_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_HAL_H__\n#define __RTL8192E_HAL_H__\n\n//#include \"hal_com.h\"\n\n#include \"hal_data.h\"\n\n//include HAL Related header after HAL Related compiling flags \n#include \"rtl8192e_spec.h\"\n#include \"rtl8192e_rf.h\"\n#include \"rtl8192e_dm.h\"\n#include \"rtl8192e_recv.h\"\n#include \"rtl8192e_xmit.h\"\n#include \"rtl8192e_cmd.h\"\n#include \"rtl8192e_led.h\"\n#include \"Hal8192EPwrSeq.h\"\n#include \"Hal8192EPhyReg.h\"\n#include \"Hal8192EPhyCfg.h\"\n\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8192e_sreset.h\"\n#endif\n\n\n//---------------------------------------------------------------------\n//\t\tRTL8192E From header\n//---------------------------------------------------------------------\n\t#define RTL8192E_FW_IMG\t\t\t\t\t\"rtl8192e/FW_NIC.bin\"\n\t#define RTL8192E_FW_WW_IMG\t\t\t\t\"rtl8192e/FW_WoWLAN.bin\"\n\t#define RTL8192E_PHY_REG\t\t\t\t\t\"rtl8192e/PHY_REG.txt\" \n\t#define RTL8192E_PHY_RADIO_A\t\t\t\t\"rtl8192e/RadioA.txt\"\n\t#define RTL8192E_PHY_RADIO_B\t\t\t\t\"rtl8192e/RadioB.txt\"\n\t#define RTL8192E_TXPWR_TRACK\t\t\t\t\"rtl8192e/TxPowerTrack.txt\"\n\t#define RTL8192E_AGC_TAB\t\t\t\t\t\"rtl8192e/AGC_TAB.txt\"\n\t#define RTL8192E_PHY_MACREG \t\t\t\t\"rtl8192e/MAC_REG.txt\"\n\t#define RTL8192E_PHY_REG_PG\t\t\t\t\"rtl8192e/PHY_REG_PG.txt\"\n\t#define RTL8192E_PHY_REG_MP \t\t\t\t\"rtl8192e/PHY_REG_MP.txt\" \n\t#define RTL8192E_TXPWR_LMT\t\t\t\t\t\"rtl8192e/TXPWR_LMT.txt\"\n\t#define RTL8192E_WIFI_ANT_ISOLATION\t\t\"rtl8192e/wifi_ant_isolation.txt\"\n\n//---------------------------------------------------------------------\n//\t\tRTL8192E Power Configuration CMDs for PCIe interface\n//---------------------------------------------------------------------\n#define Rtl8192E_NIC_PWR_ON_FLOW\t\t\t\trtl8192E_power_on_flow\n#define Rtl8192E_NIC_RF_OFF_FLOW\t\t\t\trtl8192E_radio_off_flow\n#define Rtl8192E_NIC_DISABLE_FLOW\t\t\t\trtl8192E_card_disable_flow\n#define Rtl8192E_NIC_ENABLE_FLOW\t\t\t\trtl8192E_card_enable_flow\n#define Rtl8192E_NIC_SUSPEND_FLOW\t\t\t\trtl8192E_suspend_flow\n#define Rtl8192E_NIC_RESUME_FLOW\t\t\t\trtl8192E_resume_flow\n#define Rtl8192E_NIC_PDN_FLOW\t\t\t\t\trtl8192E_hwpdn_flow\n#define Rtl8192E_NIC_LPS_ENTER_FLOW\t\t\trtl8192E_enter_lps_flow\n#define Rtl8192E_NIC_LPS_LEAVE_FLOW\t\t\trtl8192E_leave_lps_flow\t\n\n\n#if 1 // download firmware related data structure\n#define FW_SIZE_8192E\t\t\t0x8000 // Compatible with RTL8192e Maximal RAM code size 32k\n#define FW_START_ADDRESS\t\t0x1000\n#define FW_END_ADDRESS\t\t\t0x5FFF\n\n\n#define IS_FW_HEADER_EXIST_8192E(_pFwHdr)\t((GET_FIRMWARE_HDR_SIGNATURE_8192E(_pFwHdr) &0xFFF0) ==  0x92E0)\n\n\n\ntypedef struct _RT_FIRMWARE_8192E {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_SIZE_8192E];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8192E, *PRT_FIRMWARE_8192E;\n\n//\n// This structure must be cared byte-ordering\n//\n// Added by tynli. 2009.12.04.\n\n//=====================================================\n//\t\t\t\t\tFirmware Header(8-byte alinment required)\n//=====================================================\n//--- LONG WORD 0 ----\n#define GET_FIRMWARE_HDR_SIGNATURE_8192E(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n#define GET_FIRMWARE_HDR_CATEGORY_8192E(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI\n#define GET_FIRMWARE_HDR_FUNCTION_8192E(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n#define GET_FIRMWARE_HDR_VERSION_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version\n#define GET_FIRMWARE_HDR_SUB_VER_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00\n#define GET_FIRMWARE_HDR_RSVD1_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) \t\t\n\n//--- LONG WORD 1 ----\n#define GET_FIRMWARE_HDR_MONTH_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field\n#define GET_FIRMWARE_HDR_DATE_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field\n#define GET_FIRMWARE_HDR_HOUR_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field\n#define GET_FIRMWARE_HDR_MINUTE_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field\n#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8192E(__FwHdr)\tLE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code\n#define GET_FIRMWARE_HDR_RSVD2_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+12, 16, 16)\n\n//--- LONG WORD 2 ----\n#define GET_FIRMWARE_HDR_SVN_IDX_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index\n#define GET_FIRMWARE_HDR_RSVD3_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+20, 0, 32)\n\n//--- LONG WORD 3 ----\n#define GET_FIRMWARE_HDR_RSVD4_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 0, 32)\n#define GET_FIRMWARE_HDR_RSVD5_8192E(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+28, 0, 32)\n\n#endif // download firmware related data structure\n\n#define DRIVER_EARLY_INT_TIME_8192E\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8192E\t\t0x02\n#define RX_DMA_SIZE_8192E\t\t\t\t\t0x4000\t/* 16K*/\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#ifdef CONFIG_FW_C2H_DEBUG \n\t#define RX_DMA_RESERVED_SIZE_8192E\t0x100\t/* 256B, reserved for c2h debug message*/\n#else\n\t#define RX_DMA_RESERVED_SIZE_8192E\t0x40\t/* 64B, reserved for c2h event(16bytes) or ccx(8 Bytes )*/\n#endif\n#define MAX_RX_DMA_BUFFER_SIZE_8192E\t\t(RX_DMA_SIZE_8192E-RX_DMA_RESERVED_SIZE_8192E)\t/*RX 16K*/\n\n//For General Reserved Page Number(Beacon Queue is reserved page)\n//if (CONFIG_2BCN_EN) Beacon:4, PS-Poll:1, Null Data:1,Prob Rsp:1,Qos Null Data:1\n//Beacon:2, PS-Poll:1, Null Data:1,Prob Rsp:1,Qos Null Data:1\n#define RSVD_PAGE_NUM_8192E\t\t0x08\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8192E\t0x07\n#else\n#define WOWLAN_PAGE_NUM_8192E\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef WOWLAN_PAGE_NUM_8192E\n#define WOWLAN_PAGE_NUM_8192E\t0x0d\n#endif\n\n/* Note: \nTx FIFO Size : 64KB\nTx page Size : 256B\nTotal page numbers : 256(0x100)\n*/\n\n#define\tTOTAL_RSVD_PAGE_NUMBER_8192E \t(RSVD_PAGE_NUM_8192E+WOWLAN_PAGE_NUM_8192E)\n\n#define\tTOTAL_PAGE_NUMBER_8192E\t(0x100) \n#define\tTX_TOTAL_PAGE_NUMBER_8192E\t(TOTAL_PAGE_NUMBER_8192E - TOTAL_RSVD_PAGE_NUMBER_8192E)\n\n#define\tTX_PAGE_BOUNDARY_8192E\t( TX_TOTAL_PAGE_NUMBER_8192E ) /* beacon header start address */\n\n\n#define PAGE_SIZE_TX_92E\tPAGE_SIZE_256\n#define RSVD_PKT_LEN_92E\t(TOTAL_RSVD_PAGE_NUMBER_8192E *PAGE_SIZE_TX_92E)\n\n#define TX_PAGE_LOAD_FW_BOUNDARY_8192E\t\t0x47 //0xA5\n#define TX_PAGE_BOUNDARY_WOWLAN_8192E\t\t0xE0\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C\n\n#define NORMAL_PAGE_NUM_HPQ_8192E\t\t\t0x10\n#define NORMAL_PAGE_NUM_LPQ_8192E\t\t\t0x10\n#define NORMAL_PAGE_NUM_NPQ_8192E\t\t\t0x10\n#define NORMAL_PAGE_NUM_EPQ_8192E\t\t\t0x00\n\n\n//Note: For WMM Normal Chip Setting ,modify later\n#define WMM_NORMAL_PAGE_NUM_HPQ_8192E\t\tNORMAL_PAGE_NUM_HPQ_8192E\n#define WMM_NORMAL_PAGE_NUM_LPQ_8192E\t\tNORMAL_PAGE_NUM_LPQ_8192E\n#define WMM_NORMAL_PAGE_NUM_NPQ_8192E\t\tNORMAL_PAGE_NUM_NPQ_8192E\n\n\n//-------------------------------------------------------------------------\n//\tChip specific\n//-------------------------------------------------------------------------\n\n// pic buffer descriptor\n#define RTL8192EE_SEG_NUM\t\t\tTX_BUFFER_SEG_NUM\n#define TX_DESC_NUM_92E\t\t\t128\n#define RX_DESC_NUM_92E\t\t\t128\n\n//-------------------------------------------------------------------------\n//\tChannel Plan\n//-------------------------------------------------------------------------\n\n#define\t\tHWSET_MAX_SIZE_8192E\t\t\t512\n\n#define\t\tEFUSE_REAL_CONTENT_LEN_8192E\t512\n\n#define\t\tEFUSE_MAP_LEN_8192E\t\t\t512\n#define\t\tEFUSE_MAX_SECTION_8192E\t\t64\n#define\t\tEFUSE_MAX_WORD_UNIT_8192E\t\t4\n#define\t\tEFUSE_IC_ID_OFFSET_8192E\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define \t\tAVAILABLE_EFUSE_ADDR_8192E(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_8192E)\n//\n// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section\n// 9bytes + 1byt + 5bytes and pre 1byte.\n// For worst case:\n// | 1byte|----8bytes----|1byte|--5bytes--| \n// |         |            Reserved(14bytes)\t      |\n//\n#define\t\tEFUSE_OOB_PROTECT_BYTES_8192E \t\t15\t// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.\n\n\n\n//========================================================\n//\t\t\tEFUSE for BT definition\n//========================================================\n#define\t\tEFUSE_BT_REAL_BANK_CONTENT_LEN_8192E\t512\n#define\t\tEFUSE_BT_REAL_CONTENT_LEN_8192E\t\t\t1024\t// 512*2\n#define\t\tEFUSE_BT_MAP_LEN_8192E\t\t\t\t\t1024\t// 1k bytes\n#define\t\tEFUSE_BT_MAX_SECTION_8192E\t\t\t\t128\t\t// 1024/8\n\n#define\t\tEFUSE_PROTECT_BYTES_BANK_8192E\t\t\t16\n#define \t\tEFUSE_MAX_BANK_8192E\t\t\t\t\t3\n//===========================================================\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n//#define IS_MULTI_FUNC_CHIP(_Adapter)\t(((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE)\n\n//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )\n\n// rtl8812_hal_init.c\nvoid\t_8051Reset8192E(PADAPTER padapter);\ns32\tFirmwareDownload8192E(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw);\nvoid\tInitializeFirmwareVars8192E(PADAPTER padapter);\n\ns32\tInitLLTTable8192E(PADAPTER padapter, u8 txpktbuf_bndy);\n\n// EFuse\nu8\tGetEEPROMSize8192E(PADAPTER padapter);\nvoid\thal_InitPGData_8192E(PADAPTER padapter, u8* PROMContent);\nvoid\tHal_EfuseParseIDCode8192E(PADAPTER padapter, u8 *hwinfo);\nvoid\tHal_ReadPROMVersion8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\tHal_ReadPowerSavingMode8192E(PADAPTER padapter, u8*\thwinfo, BOOLEAN\tAutoLoadFail);\nvoid\tHal_ReadTxPowerInfo8192E(PADAPTER padapter,u8* hwinfo,BOOLEAN\tAutoLoadFail);\nvoid\tHal_ReadBoardType8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadThermalMeter_8192E(PADAPTER\tAdapter,u8* PROMContent,BOOLEAN \tAutoloadFail);\nvoid\tHal_ReadChannelPlan8192E(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\tHal_EfuseParseXtal_8192E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadAntennaDiversity8192E(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadPAType_8192E(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_ReadAmplifierType_8192E(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_ReadRFEType_8192E(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_EfuseParseBTCoexistInfo8192E(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail);\nvoid\tHal_EfuseParseKFreeData_8192E(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\n\nu8 Hal_CrystalAFEAdjust(_adapter * Adapter);\n\nBOOLEAN HalDetectPwrDownMode8192E(PADAPTER Adapter);\n\t\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\n/***********************************************************/\n// RTL8192E-MAC Setting\nVOID _InitQueueReservedPage_8192E(IN  PADAPTER Adapter);\nVOID _InitQueuePriority_8192E(IN\tPADAPTER Adapter);\nVOID _InitTxBufferBoundary_8192E(IN PADAPTER Adapter,IN u8 txpktbuf_bndy);\nVOID _InitPageBoundary_8192E(IN PADAPTER Adapter);\n//VOID _InitTransferPageSize_8192E(IN PADAPTER Adapter);\nVOID _InitDriverInfoSize_8192E(IN PADAPTER Adapter,IN u8 drvInfoSize);\nVOID _InitRDGSetting_8192E(PADAPTER Adapter);\nvoid _InitID_8192E(IN  PADAPTER Adapter);\nVOID _InitNetworkType_8192E(IN  PADAPTER Adapter);\nVOID _InitWMACSetting_8192E(IN PADAPTER Adapter);\nVOID _InitAdaptiveCtrl_8192E(IN  PADAPTER Adapter);\nVOID _InitRateFallback_8192E(IN  PADAPTER Adapter);\nVOID _InitEDCA_8192E( IN  PADAPTER Adapter);\nVOID _InitRetryFunction_8192E(\tIN  PADAPTER Adapter);\nVOID _BBTurnOnBlock_8192E(IN\tPADAPTER Adapter);\nVOID _InitBeaconParameters_8192E(IN  PADAPTER Adapter);\nVOID _InitBeaconMaxError_8192E(\n\tIN  PADAPTER\tAdapter,\n\tIN\tBOOLEAN\t\tInfraMode\n\t);\nvoid SetBeaconRelatedRegisters8192E(PADAPTER padapter);\nVOID hal_ReadRFType_8192E(PADAPTER\tAdapter);\n// RTL8192E-MAC Setting\n/***********************************************************/\n\nvoid SetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val);\nvoid GetHwReg8192E(PADAPTER Adapter, u8 variable, u8* val);\nu8\nSetHalDefVar8192E(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tHAL_DEF_VARIABLE\t\teVariable,\n\tIN\tPVOID\t\t\t\t\tpValue\n\t);\nu8\nGetHalDefVar8192E(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tHAL_DEF_VARIABLE\t\teVariable,\n\tIN\tPVOID\t\t\t\t\tpValue\n\t);\n\nvoid rtl8192e_set_hal_ops(struct hal_ops *pHalFunc);\nvoid rtl8192e_init_default_value(_adapter * padapter);\n// register\nvoid SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);\n\nvoid rtl8192e_start_thread(_adapter *padapter);\nvoid rtl8192e_stop_thread(_adapter *padapter);\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8192EE(PADAPTER Adapter);\nu16\tget_txdesc_buf_addr(u16 ff_hwaddr);\n#endif\n\n#ifdef CONFIG_SDIO_HCI\n#ifdef CONFIG_SDIO_TX_ENABLE_AVAL_INT\nvoid _init_available_page_threshold(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);\n#endif\n#endif\n\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8192e_combo_card_WifiOnlyHwInit(PADAPTER Adapter);\n#endif\n\n#endif //__RTL8192E_HAL_H__\n\n"
  },
  {
    "path": "include/rtl8192e_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_LED_H__\n#define __RTL8192E_LED_H__\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8192eu_InitSwLeds(PADAPTER padapter);\nvoid rtl8192eu_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8192ee_InitSwLeds(PADAPTER padapter);\nvoid rtl8192ee_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8192es_InitSwLeds(PADAPTER padapter);\nvoid rtl8192es_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8192e_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_RECV_H__\n#define __RTL8192E_RECV_H__\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifdef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#else\n\t\t#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\t#define MAX_RECVBUF_SZ (rtw_rtkm_get_buff_size()) /*depend rtkm*/\n\t\t#elif defined(CONFIG_PLATFORM_HISILICON)\n\t\t\t#define MAX_RECVBUF_SZ (16384) /* 16k */\n\t\t#else\n\t\t\t#define MAX_RECVBUF_SZ (32768) /* 32k */\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (20480) //20K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K \n\t\t//#define MAX_RECVBUF_SZ (16384) //  16k - 92E RX BUF :16K\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\t\t\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI)\n\n#define MAX_RECVBUF_SZ (16384)\n\n#endif\n\n\n// Rx smooth factor\n#define Rx_Smooth_Factor (20)\n\n//=============\n// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture\n//DWORD 0\n#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value)\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value)\n#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 1, __Value)\n#define SET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 15, __Value)\n\n#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 1)\n#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 15)\n\n\n//DWORD 1\n#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value)\n#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32)\n\n//DWORD 2\n#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value)\n\n//=============\n// [2] Rx Descriptor\n//DWORD 0\n#define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICVERR_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n\n\n#define SET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_TID_92E(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_MACID_VLD_92E(__pRxDesc) \t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 12, 1)\n#define GET_RX_STATUS_DESC_AMSDU_92E(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_92E(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_A1_FITS_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 16, 4)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHKERR_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_IPVER_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_IS_TCPUDP_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHK_VLD_92E(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_MC_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_92E(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#define GET_RX_STATUS_DESC_RX_IS_QOS_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_HWRSVD_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 24, 4)\n#define GET_RX_STATUS_DESC_FCS_OK_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 31, 1)\n#define GET_RX_STATUS_DESC_RPT_SEL_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_HTC_92E(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_92E(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#define GET_RX_STATUS_DESC_DMA_AGG_NUM_92E(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)\n\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_92E(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_92E(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_WAKE_92E(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1)\n\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_92E(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n#define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\n#define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\n\n\n#ifdef CONFIG_SDIO_HCI\ns32 rtl8192es_init_recv_priv(PADAPTER padapter);\nvoid rtl8192es_free_recv_priv(PADAPTER padapter);\nvoid rtl8192es_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\n#endif\n\n#ifdef CONFIG_USB_HCI\nvoid rtl8192eu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\ns32 rtl8192eu_init_recv_priv(PADAPTER padapter);\nvoid rtl8192eu_free_recv_priv(PADAPTER padapter);\nvoid rtl8192eu_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\nvoid rtl8192eu_recv_tasklet(void *priv);\n\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8192ee_init_recv_priv(PADAPTER padapter);\nvoid rtl8192ee_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8192e_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8192E_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8192e_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_RF_H__\n#define __RTL8192E_RF_H__\n\nVOID\nPHY_RF6052SetBandwidth8192E(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n\nint\nPHY_RF6052_Config_8192E(\n\tIN\tPADAPTER\tAdapter\t);\n\n#endif//__RTL8192E_RF_H__\n\n"
  },
  {
    "path": "include/rtl8192e_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8192E_SPEC_H__\n#define __RTL8192E_SPEC_H__\n\n#include <drv_conf.h>\n\n\n//============================================================\n//       8192E Regsiter offset definition\n//============================================================\n\n//============================================================\n//\n//============================================================\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_SYS_SWR_CTRL1_8192E\t\t0x0010\t// 1 Byte        \n#define REG_SYS_SWR_CTRL2_8192E\t\t0x0014\t// 1 Byte      \n#define REG_AFE_CTRL1_8192E\t\t\t0x0024\n#define REG_AFE_CTRL2_8192E\t\t\t0x0028\n#define REG_AFE_CTRL3_8192E\t\t\t0x002c\n\n#define REG_PAD_CTRL1_8192E\t\t\t0x0064           \n#define REG_SDIO_CTRL_8192E\t\t\t0x0070\n#define REG_OPT_CTRL_8192E\t\t\t\t0x0074\n#define REG_RF_B_CTRL_8192E\t\t\t0x0076\n#define REG_AFE_CTRL4_8192E\t\t\t0x0078 \n#define REG_LDO_SWR_CTRL\t\t\t\t0x007C\n#define REG_FW_DRV_MSG_8192E\t\t\t0x0088\n#define REG_HMEBOX_E2_E3_8192E\t\t0x008C\n#define REG_HIMR0_8192E\t\t\t\t0x00B0\n#define REG_HISR0_8192E\t\t\t\t\t0x00B4\n#define REG_HIMR1_8192E\t\t\t\t\t0x00B8\n#define REG_HISR1_8192E\t\t\t\t\t0x00BC\n\n#define REG_SYS_CFG1_8192E\t\t\t\t0x00F0\n#define REG_SYS_CFG2_8192E\t\t\t\t0x00FC \n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_PKTBUF_DBG_ADDR \t\t\t(REG_PKTBUF_DBG_CTRL)\n#define REG_RXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+2)\n#define REG_TXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+3)\n#define REG_WOWLAN_WAKE_REASON\t\tREG_MCUTST_WOWLAN\n\n#define REG_RSVD3_8192E\t\t\t\t\t0x0168\n#define REG_C2HEVT_CMD_SEQ_88XX\t\t0x01A1\n#define REG_C2hEVT_CMD_CONTENT_88XX\t0x01A2\n#define REG_C2HEVT_CMD_LEN_88XX\t\t0x01AE\n\n#define REG_HMEBOX_EXT0_8192E\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8192E\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8192E\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8192E\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_DWBCN0_CTRL             0x0208\n#define REG_DWBCN1_CTRL             0x0228\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_8192E\t\t\t\t\t0x0290\n#define REG_EARLY_MODE_CONTROL_8192E\t\t0x02BC\n\n#define REG_RSVD5_8192E\t\t\t\t\t0x02F0\n#define REG_RSVD6_8192E\t\t\t\t\t0x02F4\n#define REG_RSVD7_8192E\t\t\t\t\t0x02F8\n#define REG_RSVD8_8192E\t\t\t\t\t0x02FC\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8192E\t\t\t0x0300\n#define\tREG_INT_MIG_8192E\t\t\t\t\t0x0304\t// Interrupt Migration \n#define\tREG_BCNQ_TXBD_DESA_8192E\t\t0x0308\t// TX Beacon Descriptor Address\n#define\tREG_MGQ_TXBD_DESA_8192E\t\t\t0x0310\t// TX Manage Queue Descriptor Address\n#define\tREG_VOQ_TXBD_DESA_8192E\t\t\t0x0318\t// TX VO Queue Descriptor Address\n#define\tREG_VIQ_TXBD_DESA_8192E\t\t\t0x0320\t// TX VI Queue Descriptor Address\n#define\tREG_BEQ_TXBD_DESA_8192E\t\t\t0x0328\t// TX BE Queue Descriptor Address\n#define\tREG_BKQ_TXBD_DESA_8192E\t\t\t0x0330\t// TX BK Queue Descriptor Address\n#define\tREG_RXQ_RXBD_DESA_8192E\t\t\t0x0338\t// RX Queue\tDescriptor Address\n#define \tREG_HI0Q_TXBD_DESA_8192E\t\t\t0x0340\n#define \tREG_HI1Q_TXBD_DESA_8192E\t\t\t0x0348\n#define \tREG_HI2Q_TXBD_DESA_8192E\t\t\t0x0350\n#define \tREG_HI3Q_TXBD_DESA_8192E\t\t\t0x0358\n#define\tREG_HI4Q_TXBD_DESA_8192E\t\t\t0x0360\n#define \tREG_HI5Q_TXBD_DESA_8192E\t\t\t0x0368\n#define \tREG_HI6Q_TXBD_DESA_8192E\t\t\t0x0370\n#define \tREG_HI7Q_TXBD_DESA_8192E\t\t\t0x0378\n#define\tREG_MGQ_TXBD_NUM_8192E\t\t\t0x0380\n#define\tREG_RX_RXBD_NUM_8192E\t\t\t0x0382\n#define\tREG_VOQ_TXBD_NUM_8192E\t\t\t0x0384\n#define\tREG_VIQ_TXBD_NUM_8192E\t\t\t0x0386\n#define\tREG_BEQ_TXBD_NUM_8192E\t\t\t0x0388\n#define\tREG_BKQ_TXBD_NUM_8192E\t\t\t0x038A\n#define\tREG_HI0Q_TXBD_NUM_8192E\t\t\t0x038C\n#define\tREG_HI1Q_TXBD_NUM_8192E\t\t\t0x038E\n#define\tREG_HI2Q_TXBD_NUM_8192E\t\t\t0x0390\n#define\tREG_HI3Q_TXBD_NUM_8192E\t\t\t0x0392\n#define\tREG_HI4Q_TXBD_NUM_8192E\t\t\t0x0394\n#define\tREG_HI5Q_TXBD_NUM_8192E\t\t\t0x0396\n#define\tREG_HI6Q_TXBD_NUM_8192E\t\t\t0x0398\n#define\tREG_HI7Q_TXBD_NUM_8192E\t\t\t0x039A\n#define\tREG_TSFTIMER_HCI_8192E\t\t\t0x039C\n\n//Read Write Point\n#define\tREG_VOQ_TXBD_IDX_8192E\t\t\t0x03A0\n#define\tREG_VIQ_TXBD_IDX_8192E\t\t\t0x03A4\n#define\tREG_BEQ_TXBD_IDX_8192E\t\t\t0x03A8\n#define\tREG_BKQ_TXBD_IDX_8192E\t\t\t0x03AC\n#define\tREG_MGQ_TXBD_IDX_8192E\t\t\t0x03B0\n#define\tREG_RXQ_TXBD_IDX_8192E\t\t\t0x03B4\n#define\tREG_HI0Q_TXBD_IDX_8192E\t\t\t0x03B8\n#define\tREG_HI1Q_TXBD_IDX_8192E\t\t\t0x03BC\n#define\tREG_HI2Q_TXBD_IDX_8192E\t\t\t0x03C0\n#define\tREG_HI3Q_TXBD_IDX_8192E\t\t\t0x03C4\n#define\tREG_HI4Q_TXBD_IDX_8192E\t\t\t0x03C8\n#define\tREG_HI5Q_TXBD_IDX_8192E\t\t\t0x03CC\n#define\tREG_HI6Q_TXBD_IDX_8192E\t\t\t0x03D0\n#define\tREG_HI7Q_TXBD_IDX_8192E\t\t\t0x03D4\n\n#define\tREG_PCIE_HCPWM_8192EE\t\t\t0x03D8 // ??????\n#define\tREG_PCIE_HRPWM_8192EE\t\t\t0x03DC\t//PCIe RPWM // ??????\n#define\tREG_DBI_WDATA_V1_8192E\t\t\t0x03E8\n#define\tREG_DBI_RDATA_V1_8192E\t\t\t0x03EC\n#define\tREG_DBI_FLAG_V1_8192E\t\t\t\t0x03F0\n#define \tREG_MDIO_V1_8192E\t\t\t\t\t0x3F4\n#define \tREG_PCIE_MIX_CFG_8192E\t\t\t\t0x3F8\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_TXBF_CTRL_8192E\t\t\t\t0x042C\n#define REG_ARFR0_8192E\t\t\t\t\t0x0444\n#define REG_ARFR1_8192E\t\t\t\t\t0x044C\n#define REG_CCK_CHECK_8192E\t\t\t\t0x0454\n#define REG_AMPDU_MAX_TIME_8192E\t\t\t0x0456\n#define REG_BCNQ1_BDNY_8192E\t\t\t\t0x0457\n\n#define REG_AMPDU_MAX_LENGTH_8192E\t0x0458\n#define REG_WMAC_LBK_BUF_HD_8192E\t\t\t0x045D\n#define REG_NDPA_OPT_CTRL_8192E\t\t0x045F\n#define REG_DATA_SC_8192E\t\t\t\t0x0483\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x0484\n#define REG_TXPKTBUF_IV_HIGH            0x0488\n#endif\n#define REG_ARFR2_8192E\t\t\t\t\t0x048C\n#define REG_ARFR3_8192E\t\t\t\t\t0x0494\n#define REG_TXRPT_START_OFFSET\t\t\t0x04AC\n#define REG_AMPDU_BURST_MODE_8192E\t0x04BC\n#define REG_HT_SINGLE_AMPDU_8192E\t\t0x04C7\n#define REG_MACID_PKT_DROP0_8192E\t\t0x04D0\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_CTWND_8192E\t\t\t\t\t0x0572\n#define REG_SECONDARY_CCA_CTRL_8192E\t0x0577\n#define REG_SCH_TXCMD_8192E\t\t\t0x05F8\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#define REG_MAC_CR_8192E\t\t\t\t0x0600\n\n#define REG_MAC_TX_SM_STATE_8192E\t\t0x06B4\n\n// Power\n#define REG_BFMER0_INFO_8192E\t\t\t0x06E4\n#define REG_BFMER1_INFO_8192E\t\t\t0x06EC\n#define REG_CSI_RPT_PARAM_BW20_8192E\t0x06F4\n#define REG_CSI_RPT_PARAM_BW40_8192E\t0x06F8\n#define REG_CSI_RPT_PARAM_BW80_8192E\t0x06FC\n\n// Hardware Port 2\n#define REG_BFMEE_SEL_8192E\t\t\t\t0x0714\n#define REG_SND_PTCL_CTRL_8192E\t\t0x0718\n\n\n//-----------------------------------------------------\n//\n//\tRedifine register definition for compatibility\n//\n//-----------------------------------------------------\n\n// TODO: use these definition when using REG_xxx naming rule.\n// NOTE: DO NOT Remove these definition. Use later.\n#define\tISR_8192E\t\t\t\t\t\t\tREG_HISR0_8192E\n\n//----------------------------------------------------------------------------\n//       8192E IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8192E\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8192E\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8192E\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8192E\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8192E\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8192E\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8192E\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8192E\t\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8192E\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8192E\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8192E\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8192E\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8192E\t\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8192E\t\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8192E\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8192E\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8192E\t\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8192E\t\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8192E\t\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8192E\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8192E\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8192E\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8192E\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8192E\t\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8192E\t\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_BCNDMAINT7_8192E\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8192E\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8192E\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8192E\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8192E\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8192E\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8192E\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8192E\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8192E\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8192E\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8192E\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8192E\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8192E\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8192E\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8192E\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8192E\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8192E\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8192E\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8192E\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n//----------------------------------------------------------------------------\n//       8192E Auto LLT bits\t\t\t\t\t\t(offset 0x224,  8bits)\n//----------------------------------------------------------------------------\n//224 REG_AUTO_LLT\n// move to hal_com_reg.h\n\n//----------------------------------------------------------------------------\n//       8192E Auto LLT bits\t\t\t\t\t\t(offset 0x290,  32bits)\n//----------------------------------------------------------------------------\n#define BIT_DMA_MODE\t\t\tBIT1\n#define BIT_USB_RXDMA_AGG_EN\tBIT31\n\n//----------------------------------------------------------------------------\n//       8192E REG_SYS_CFG1\t\t\t\t\t\t(offset 0xF0,  32bits)\n//----------------------------------------------------------------------------\n#define BIT_SPSLDO_SEL\t\t\tBIT24\n\n\n//----------------------------------------------------------------------------\n//       8192E REG_CCK_CHECK\t\t\t\t\t\t(offset 0x454,  8bits)\n//----------------------------------------------------------------------------\n#define BIT_BCN_PORT_SEL\t\tBIT5\n\n//============================================================================\n//       Regsiter Bit and Content definition \n//============================================================================\n\n//2 ACMHWCTRL 0x05C0\n#define\tAcmHw_HwEn_8192E\t\t\t\tBIT(0)\n#define\tAcmHw_VoqEn_8192E\t\t\t\tBIT(1)\n#define\tAcmHw_ViqEn_8192E\t\t\t\tBIT(2)\n#define\tAcmHw_BeqEn_8192E\t\t\t\tBIT(3)\n#define\tAcmHw_VoqStatus_8192E\t\t\tBIT(5)\n#define\tAcmHw_ViqStatus_8192E\t\t\tBIT(6)\n#define\tAcmHw_BeqStatus_8192E\t\t\tBIT(7)\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8192E 128\n#define SEC_CAM_ENT_NUM_8192E 64\n#define NSS_NUM_8192E 2\n#define BAND_CAP_8192E (BAND_CAP_2G)\n#define BW_CAP_8192E (BW_CAP_20M | BW_CAP_40M)\n\n#endif //__RTL8192E_SPEC_H__\n\n"
  },
  {
    "path": "include/rtl8192e_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL88812A_SRESET_H_\n#define _RTL8812A_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8192e_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8192e_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8192e_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8192E_XMIT_H__\n#define __RTL8192E_XMIT_H__\n\ntypedef struct txdescriptor_8192e\n{\n\t//Offset 0\n\tu32 pktlen:16;\n\tu32 offset:8;\n\tu32 bmc:1;\n\tu32 htc:1;\n\tu32 ls:1;\n\tu32 fs:1;\n\tu32 linip:1;\n\tu32 noacm:1;\n\tu32 gf:1;\n\tu32 own:1;\n\n\t//Offset 4\n\tu32 macid:6;\n\tu32 rsvd0406:2;\t\n\tu32 qsel:5;\n\tu32 rd_nav_ext:1;\n\tu32 lsig_txop_en:1;\n\tu32 pifs:1;\n\tu32 rate_id:4;\n\tu32 navusehdr:1;\n\tu32 en_desc_id:1;\n\tu32 sectype:2;\n\tu32 rsvd0424:2;\n\tu32 pkt_offset:5;\t// unit: 8 bytes\n\tu32 rsvd0431:1;\n\n\t//Offset 8\n\tu32 rts_rc:6;\n\tu32 data_rc:6;\n\tu32 agg_en:1;\n\tu32 rd_en:1;\n\tu32 bar_rty_th:2;\n\tu32 bk:1;\n\tu32 morefrag:1;\n\tu32 raw:1;\n\tu32 ccx:1;\n\tu32 ampdu_density:3;\n\tu32 bt_null:1;\n\tu32 ant_sel_a:1;\n\tu32 ant_sel_b:1;\n\tu32 tx_ant_cck:2;\n\tu32 tx_antl:2;\n\tu32 tx_ant_ht:2;\n\n\t//Offset 12\n\tu32 nextheadpage:8;\n\tu32 tailpage:8;\n\tu32 seq:12;\n\tu32 cpu_handle:1;\n\tu32 tag1:1;\n\tu32 trigger_int:1;\n\tu32 hwseq_en:1;\n\n\t//Offset 16\n\tu32 rtsrate:5;\n\tu32 ap_dcfe:1;\n\tu32 hwseq_sel:2;\n\tu32 userate:1;\n\tu32 disrtsfb:1;\n\tu32 disdatafb:1;\n\tu32 cts2self:1;\n\tu32 rtsen:1;\n\tu32 hw_rts_en:1;\n\tu32 port_id:1;\t\n\tu32 pwr_status:3;\n\tu32 wait_dcts:1;\n\tu32 cts2ap_en:1;\n\tu32 data_sc:2;\n\tu32 data_stbc:2;\n\tu32 data_short:1;\n\tu32 data_bw:1;\n\tu32 rts_short:1;\n\tu32 rts_bw:1;\n\tu32 rts_sc:2;\n\tu32 vcs_stbc:2;\n\n\t//Offset 20\n\tu32 datarate:6;\n\tu32 sgi:1;\n\tu32 try_rate:1;\n\tu32 data_ratefb_lmt:5;\n\tu32 rts_ratefb_lmt:4;\n\tu32 rty_lmt_en:1;\n\tu32 data_rt_lmt:6;\n\tu32 usb_txagg_num:8;\n\n\t//Offset 24\n\tu32 txagg_a:5;\n\tu32 txagg_b:5;\n\tu32 use_max_len:1;\n\tu32 max_agg_num:5;\n\tu32 mcsg1_max_len:4;\n\tu32 mcsg2_max_len:4;\n\tu32 mcsg3_max_len:4;\n\tu32 mcs7_sgi_max_len:4;\n\n\t//Offset 28\n\tu32 checksum:16;\t// TxBuffSize(PCIe)/CheckSum(USB)\n\tu32 mcsg4_max_len:4;\n\tu32 mcsg5_max_len:4;\n\tu32 mcsg6_max_len:4;\n\tu32 mcs15_sgi_max_len:4;\n}TXDESC_8192E, *PTXDESC_8192E; \n\n\n\n//For 88e early mode\n#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\n#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value)\n#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value)\n#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value)\n#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value)\n#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value)\n#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value)\n\n//\n//defined for TX DESC Operation\n//\n\n#define MAX_TID (15)\n\n//OFFSET 0\n#define OFFSET_SZ\t0\n#define OFFSET_SHT\t16\n#define BMC\t\tBIT(24)\n#define LSG\t\tBIT(26)\n#define FSG\t\tBIT(27)\n#define OWN \t\tBIT(31)\n\n\n//OFFSET 4\n#define PKT_OFFSET_SZ\t\t0\n#define QSEL_SHT\t\t\t8\n#define RATE_ID_SHT\t\t\t16\n#define NAVUSEHDR\t\t\tBIT(20)\n#define SEC_TYPE_SHT \t\t22\n#define PKT_OFFSET_SHT\t\t26\n\n//OFFSET 8\n#define AGG_EN\t\t\t\tBIT(12)\n#define AGG_BK\t\t\t\t\tBIT(16)\n#define AMPDU_DENSITY_SHT\t20\n#define ANTSEL_A\t\t\tBIT(24)\n#define ANTSEL_B\t\t\tBIT(25)\n#define TX_ANT_CCK_SHT\t\t26\n#define TX_ANTL_SHT\t\t\t28\n#define TX_ANT_HT_SHT\t\t30\n\n//OFFSET 12\n#define SEQ_SHT\t\t\t\t16\n#define EN_HWSEQ\t\t\tBIT(31)\n\n//OFFSET 16\n#define \tQOS                          BIT(6)\n#define\tHW_SSN\t\t\t\tBIT(7)\n#define \tUSERATE\t\t\tBIT(8)\n#define \tDISDATAFB\t\t\tBIT(10)\n#define   CTS_2_SELF\t\t\tBIT(11)\n#define\tRTS_EN\t\t\t\tBIT(12)\n#define\tHW_RTS_EN\t\t\tBIT(13)\n#define \tDATA_SHORT\t\t\tBIT(24)\n#define \tPWR_STATUS_SHT\t15\n#define \tDATA_SC_SHT\t\t20\n#define \tDATA_BW\t\t\tBIT(25)\n\n//OFFSET 20\n#define\tRTY_LMT_EN\t\t\tBIT(17)\n\n\n//OFFSET 20\n#define SGI\t\t\t\t\tBIT(6)\n#define USB_TXAGG_NUM_SHT\t24\n\n\n//=====Tx Desc Buffer content\n\n// config element for each tx buffer \n/*\n#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu)\n#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\n*/\n#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu)\n#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)\n\n\n// Dword 0\n#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 14, __Valeu)\n#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 15, __Value)\n#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n// Dword 1\n#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value)\n#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32)\n\n\n// Dword 2\n#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value)\n// Dword 3, RESERVED \n\n\n//=====Tx Desc content\n// Dword 0\n#define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_FIRST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n#define GET_TX_DESC_OWN_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n\n// Dword 1\n#define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n#define SET_TX_DESC_MORE_DATA_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 29, 1, __Value)\n#define SET_TX_DESC_TXOP_PS_CAP_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 30, 1, __Value)\n#define SET_TX_DESC_TXOP_PS_MODE_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 31, 1, __Value)\n\n\n// Dword 2\n#define SET_TX_DESC_PAID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_NULL_0_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 14, 1, __Value)\n#define SET_TX_DESC_NULL_1_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 15, 1, __Value)\n#define SET_TX_DESC_BK_92E(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define SET_TX_DESC_RAW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define GET_TX_DESC_MORE_FRAG_92E(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pTxDesc+8, 17, 1)\n#define SET_TX_DESC_SPE_RPT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_NULL_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)\n#define SET_TX_DESC_CHK_EN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)\n#define SET_TX_DESC_EARLY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HWSEQ_SEL_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_HW_PORT_ID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 14, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_TRY_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 7, 1, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n#define SET_TX_DESC_PCTS_ENABLE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 29, 1, __Value)\n#define SET_TX_DESC_PCTS_MASK_IDX_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 30, 2, __Value)\n\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_92E(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_VCS_STBC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n#define SET_TX_DESC_TX_ANT_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 24, 4, __Value)\n#define SET_TX_DESC_TX_POWER_0_PSET_92E(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 28, 3, __Value)\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_MBSSID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n#define SET_TX_DESC_ANTSEL_A_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANTSEL_C_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\n#define SET_TX_DESC_ANTSEL_D_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)\n\n// Dword 7\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n#define SET_TX_DESC_TX_BUFFER_SIZE_92E(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#else\n#define SET_TX_DESC_TX_DESC_CHECKSUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#endif\n#define SET_TX_DESC_USB_TXAGG_NUM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)\n\n\n//#define SET_TX_DESC_HWSEQ_EN_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n// Dword 8\n\n#define SET_TX_DESC_RTS_RC_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 0, 6, __Value)\n#define SET_TX_DESC_BAR_RTY_TH_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 6, 2, __Value)\n#define SET_TX_DESC_DATA_RC_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 8, 6, __Value)\n#define SET_TX_DESC_EN_HWSEQ_92E(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n#define SET_TX_DESC_NEXT_HEAD_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 16, 8, __Value)\n#define SET_TX_DESC_TAIL_PAGE_92E(__pTxDesc,__Value)(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 24, 8, __Value)\n\n// Dword 9\n#define SET_TX_DESC_PADDING_LENGTH_92E(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 0, 11, __Value)\n#define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value)\n#define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n#define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value)\n\n\n#define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_92E(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_92E(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_92E(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_92E(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,  __Value)\n#define SET_EARLYMODE_LEN3_92E(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\nvoid rtl8192e_cal_txdesc_chksum(u8 *ptxdesc);\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8192eu_init_xmit_priv(PADAPTER padapter);\nvoid rtl8192eu_free_xmit_priv(PADAPTER padapter);\ns32 rtl8192eu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8192eu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8192eu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8192eu_xmit_buf_handler(PADAPTER padapter);\n#define hal_xmit_handler rtl8192eu_xmit_buf_handler\nvoid rtl8192eu_xmit_tasklet(void *priv);\ns32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8192ee_init_xmit_priv(PADAPTER padapter);\nvoid rtl8192ee_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);\ns32\trtl8192ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid\trtl8192ee_xmitframe_resume(_adapter *padapter);\ns32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\nvoid rtl8192ee_xmit_tasklet(void *priv);\n#endif\n\n#if defined(CONFIG_SDIO_HCI)||defined (CONFIG_GSPI_HCI)\ns32 rtl8192es_init_xmit_priv(PADAPTER padapter);\nvoid rtl8192es_free_xmit_priv(PADAPTER padapter);\n\ns32 rtl8192es_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8192es_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8192es_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nthread_return rtl8192es_xmit_thread(thread_context context);\ns32 rtl8192es_xmit_buf_handler(PADAPTER padapter);\n\n#ifdef CONFIG_SDIO_TX_TASKLET\nvoid rtl8192es_xmit_tasklet(void *priv);\n#endif\n#endif\n\nstruct txrpt_ccx_92e {\n\t/* offset 0 */\n\tu8 tag1:1;\n\tu8 pkt_num:3;\n\tu8 txdma_underflow:1;\n\tu8 int_bt:1;\n\tu8 int_tri:1;\n\tu8 int_ccx:1;\n\n\t/* offset 1 */\n\tu8 mac_id:6;\n\tu8 pkt_ok:1;\n\tu8 bmc:1;\n\n\t/* offset 2 */\n\tu8 retry_cnt:6;\n\tu8 lifetime_over:1;\n\tu8 retry_over:1;\n\n\t/* offset 3 */\n\tu8 ccx_qtime0;\n\tu8 ccx_qtime1;\n\n\t/* offset 5 */\n\tu8 final_data_rate;\n\n\t/* offset 6 */\n\tu8 sw1:4;\n\tu8 qsel:4;\n\n\t/* offset 7 */\n\tu8 sw0;\n};\n\n#ifdef CONFIG_TX_EARLY_MODE\nvoid UpdateEarlyModeInfo8192E(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf );\n#endif\n s32\trtl8192e_init_xmit_priv(_adapter *padapter);\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,u8 *ptxdesc);\n\nvoid rtl8192e_fill_fake_txdesc(PADAPTER\tpadapter,u8*pDesc,u32 BufferLen,\n\t\tu8 IsPsPoll,u8\tIsBTQosNull, u8 bDataFrame);\nvoid rtl8192e_cal_txdesc_chksum(u8 *ptxdesc);\n\nu8\tBWMapping_92E(PADAPTER Adapter, struct pkt_attrib *pattrib);\nu8\tSCMapping_92E(PADAPTER Adapter, struct pkt_attrib\t*pattrib);\nvoid fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid fill_txdesc_vcs(struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid rtl8192e_fixed_rate(_adapter *padapter,u8 *ptxdesc);\n\n#endif //__RTL8192E_XMIT_H__\n\n\n"
  },
  {
    "path": "include/rtl8703b_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_CMD_H__\n#define __RTL8703B_CMD_H__\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD DEFINITION    ------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\nenum h2c_cmd_8703B{\n\t//Common Class: 000\n\tH2C_8703B_RSVD_PAGE = 0x00,\n\tH2C_8703B_MEDIA_STATUS_RPT = 0x01,\n\tH2C_8703B_SCAN_ENABLE = 0x02,\n\tH2C_8703B_KEEP_ALIVE = 0x03,\n\tH2C_8703B_DISCON_DECISION = 0x04,\t\n\tH2C_8703B_PSD_OFFLOAD = 0x05,\t\n\tH2C_8703B_AP_OFFLOAD = 0x08,\t\n\tH2C_8703B_BCN_RSVDPAGE = 0x09,\t\n\tH2C_8703B_PROBERSP_RSVDPAGE = 0x0A,\t\n\tH2C_8703B_FCS_RSVDPAGE = 0x10,\t\n\tH2C_8703B_FCS_INFO = 0x11,\t\n\tH2C_8703B_AP_WOW_GPIO_CTRL = 0x13,\n\n\t//PoweSave Class: 001\n\tH2C_8703B_SET_PWR_MODE = 0x20,\n\tH2C_8703B_PS_TUNING_PARA = 0x21,\n\tH2C_8703B_PS_TUNING_PARA2 = 0x22,\n\tH2C_8703B_P2P_LPS_PARAM = 0x23,\t\n\tH2C_8703B_P2P_PS_OFFLOAD = 0x24,\t\n\tH2C_8703B_PS_SCAN_ENABLE = 0x25,\t\n\tH2C_8703B_SAP_PS_ = 0x26,\t\n\tH2C_8703B_INACTIVE_PS_ = 0x27, //Inactive_PS\n\tH2C_8703B_FWLPS_IN_IPS_ = 0x28,\n\t\n\t//Dynamic Mechanism Class: 010\n\tH2C_8703B_MACID_CFG = 0x40,\t\n\tH2C_8703B_TXBF = 0x41,\t\n\tH2C_8703B_RSSI_SETTING = 0x42,\t\n\tH2C_8703B_AP_REQ_TXRPT = 0x43,\t\n\tH2C_8703B_INIT_RATE_COLLECT = 0x44,\t\n\tH2C_8703B_RA_PARA_ADJUST = 0x46,\n\t\n\t//BT Class: 011\n\tH2C_8703B_B_TYPE_TDMA = 0x60,\n\tH2C_8703B_BT_INFO = 0x61,\n\tH2C_8703B_FORCE_BT_TXPWR = 0x62,\n\tH2C_8703B_BT_IGNORE_WLANACT = 0x63,\n\tH2C_8703B_DAC_SWING_VALUE = 0x64,\n\tH2C_8703B_ANT_SEL_RSV = 0x65,\n\tH2C_8703B_WL_OPMODE = 0x66,\n\tH2C_8703B_BT_MP_OPER = 0x67,\n\tH2C_8703B_BT_CONTROL = 0x68,\n\tH2C_8703B_BT_WIFI_CTRL = 0x69,\n\tH2C_8703B_BT_FW_PATCH = 0x6A,\n\tH2C_8703B_BT_WLAN_CALIBRATION = 0x6D,\t\n\t\n\t//WOWLAN Class: 100\n\tH2C_8703B_WOWLAN = 0x80,\n\tH2C_8703B_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_8703B_AOAC_GLOBAL_INFO = 0x82,\t\n\tH2C_8703B_AOAC_RSVD_PAGE = 0x83,\t\n\tH2C_8703B_AOAC_RSVD_PAGE2 = 0x84,\n\tH2C_8703B_D0_SCAN_OFFLOAD_CTRL = 0x85,\n\tH2C_8703B_D0_SCAN_OFFLOAD_INFO = 0x86,\n\tH2C_8703B_CHNL_SWITCH_OFFLOAD = 0x87,\n\tH2C_8703B_P2P_OFFLOAD_RSVD_PAGE = 0x8A,\t\n\tH2C_8703B_P2P_OFFLOAD = 0x8B,\n\n\tH2C_8703B_RESET_TSF = 0xC0,\n\tH2C_8703B_MAXID,\n};\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD CONTENT    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n//_RSVDPAGE_LOC_CMD_0x00\n#define SET_8703B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8703B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8703B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8703B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD_0x01\n#define SET_8703B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8703B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8703B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8703B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_KEEP_ALIVE_CMD_0x03\n#define SET_8703B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8703B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8703B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8703B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n\n//_DISCONNECT_DECISION_CMD_0x04\n#define SET_8703B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8703B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8703B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8703B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n// _PWR_MOD_CMD_0x20\n#define SET_8703B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n\n#define GET_8703B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n// _PS_TUNE_PARAM_CMD_0x21\n#define SET_8703B_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8703B_H2CCMD_PSTUNE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 1, __Value)\n#define SET_8703B_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 1, 7, __Value)\n#define SET_8703B_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n//_MACID_CFG_CMD_0x40\n#define SET_8703B_H2CCMD_MACID_CFG_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_RAID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 5, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_SGI_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 7, 1, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_BW(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 2, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_NO_UPDATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 3, 1, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_VHT_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 4, 2, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_DISPT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 6, 1, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_DISRA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 7, 1, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_RATE_MASK0(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_RATE_MASK1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_RATE_MASK2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+5, 0, 8, __Value)\n#define SET_8703B_H2CCMD_MACID_CFG_RATE_MASK3(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+6, 0, 8, __Value)\n\n//_RSSI_SETTING_CMD_0x42\n#define SET_8703B_H2CCMD_RSSI_SETTING_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_RSSI_SETTING_RSSI(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 7, __Value)\n#define SET_8703B_H2CCMD_RSSI_SETTING_ULDL_STATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n// _AP_REQ_TXRPT_CMD_0x43\n#define SET_8703B_H2CCMD_APREQRPT_PARM_MACID1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8703B_H2CCMD_APREQRPT_PARM_MACID2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n\n// _FORCE_BT_TXPWR_CMD_0x62\n#define SET_8703B_H2CCMD_BT_PWR_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n\n// _FORCE_BT_MP_OPER_CMD_0x67\n#define SET_8703B_H2CCMD_BT_MPOPER_VER(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)\n#define SET_8703B_H2CCMD_BT_MPOPER_REQNUM(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 4, __Value)\n#define SET_8703B_H2CCMD_BT_MPOPER_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8703B_H2CCMD_BT_MPOPER_PARAM1(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)\n#define SET_8703B_H2CCMD_BT_MPOPER_PARAM2(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8703B_H2CCMD_BT_MPOPER_PARAM3(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n\n// _BT_FW_PATCH_0x6A\n#define SET_8703B_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value)\n#define SET_8703B_H2CCMD_BT_FW_PATCH_ADDR0(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) \n#define SET_8703B_H2CCMD_BT_FW_PATCH_ADDR1(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) \n#define SET_8703B_H2CCMD_BT_FW_PATCH_ADDR2(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) \n#define SET_8703B_H2CCMD_BT_FW_PATCH_ADDR3(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)\n\n//---------------------------------------------------------------------------------------------------------//\n//-------------------------------------------    Structure    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    Function Statement     --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n// host message to firmware cmd\nvoid rtl8703b_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);\nvoid rtl8703b_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus);\nvoid rtl8703b_set_rssi_cmd(PADAPTER padapter, u8 *param);\nvoid rtl8703b_Add_RateATid(PADAPTER pAdapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\nvoid rtl8703b_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack);\n//s32 rtl8703b_set_lowpwr_lps_cmd(PADAPTER padapter, u8 enable);\nvoid rtl8703b_set_FwPsTuneParam_cmd(PADAPTER padapter);\nvoid rtl8703b_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask);\nvoid rtl8703b_set_FwMediaStatusRpt_cmd(PADAPTER\tpadapter, u8 mstatus, u8 macid);\nvoid rtl8703b_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param);\nvoid rtl8703b_download_rsvd_page(PADAPTER padapter, u8 mstatus);\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8703b_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);\n#endif // CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P\nvoid rtl8703b_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid SetFwRelatedForWoWLAN8703b(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif//CONFIG_WOWLAN\n\n#ifdef CONFIG_P2P_WOWLAN\nvoid rtl8703b_set_p2p_wowlan_offload_cmd(PADAPTER padapter);\n#endif\n\nvoid rtl8703b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param);\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\nu8 rtl8703b_reset_tsf(_adapter *padapter, u8 reset_port);\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\ns32 FillH2CCmd8703B(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nu8 GetTxBufferRsvdPageNum8703B(_adapter *padapter, bool wowlan);\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_DM_H__\n#define __RTL8703B_DM_H__\n//============================================================\n// Description:\n//\n// This file is for 8703B dynamic mechanism only\n//\n//\n//============================================================\n\n//============================================================\n// structure and define\n//============================================================\n\n//============================================================\n// function prototype\n//============================================================\n\nvoid rtl8703b_init_dm_priv(PADAPTER padapter);\nvoid rtl8703b_deinit_dm_priv(PADAPTER padapter);\n\nvoid rtl8703b_InitHalDm(PADAPTER padapter);\nvoid rtl8703b_HalDmWatchDog(PADAPTER padapter);\nvoid rtl8703b_HalDmWatchDog_in_LPS(PADAPTER padapter);\nvoid rtl8703b_hal_dm_in_lps(PADAPTER padapter);\n\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_HAL_H__\n#define __RTL8703B_HAL_H__\n\n#include \"hal_data.h\"\n\n#include \"rtl8703b_spec.h\"\n#include \"rtl8703b_rf.h\"\n#include \"rtl8703b_dm.h\"\n#include \"rtl8703b_recv.h\"\n#include \"rtl8703b_xmit.h\"\n#include \"rtl8703b_cmd.h\"\n#include \"rtl8703b_led.h\"\n#include \"Hal8703BPwrSeq.h\"\n#include \"Hal8703BPhyReg.h\"\n#include \"Hal8703BPhyCfg.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8703b_sreset.h\"\n#endif\n\n\n//---------------------------------------------------------------------\n//\t\tRTL8703B From file\n//---------------------------------------------------------------------\n\t#define RTL8703B_FW_IMG\t\t\t\t\t\"rtl8703b/FW_NIC.bin\"\n\t#define RTL8703B_FW_WW_IMG\t\t\t\t\"rtl8703b/FW_WoWLAN.bin\"\n\t#define RTL8703B_PHY_REG\t\t\t\t\t\"rtl8703b/PHY_REG.txt\"\n\t#define RTL8703B_PHY_RADIO_A\t\t\t\t\"rtl8703b/RadioA.txt\"\n\t#define RTL8703B_PHY_RADIO_B\t\t\t\t\"rtl8703b/RadioB.txt\"\n\t#define RTL8703B_TXPWR_TRACK\t\t\t\t\"rtl8703b/TxPowerTrack.txt\" \n\t#define RTL8703B_AGC_TAB\t\t\t\t\t\"rtl8703b/AGC_TAB.txt\"\n\t#define RTL8703B_PHY_MACREG \t\t\t\t\"rtl8703b/MAC_REG.txt\"\n\t#define RTL8703B_PHY_REG_PG\t\t\t\t\"rtl8703b/PHY_REG_PG.txt\"\n\t#define RTL8703B_PHY_REG_MP\t\t\t\t\"rtl8703b/PHY_REG_MP.txt\"\n\t#define RTL8703B_TXPWR_LMT \t\t\t\t\"rtl8703b/TXPWR_LMT.txt\"\n\n//---------------------------------------------------------------------\n//\t\tRTL8703B From header\n//---------------------------------------------------------------------\n\n#if MP_DRIVER == 1\n\t#define Rtl8703B_FwBTImgArray\t\t\t\tRtl8703BFwBTImgArray\n\t#define Rtl8703B_FwBTImgArrayLength\t\tRtl8703BFwBTImgArrayLength\n\n\t#define Rtl8703B_PHY_REG_Array_MP\t\t\tRtl8703B_PHYREG_Array_MP\n\t#define Rtl8703B_PHY_REG_Array_MPLength\tRtl8703B_PHYREG_Array_MPLength\n#endif\n\n\n#define FW_8703B_SIZE\t\t\t0x8000\n#define FW_8703B_START_ADDRESS\t0x1000\n#define FW_8703B_END_ADDRESS\t\t0x1FFF //0x5FFF\n\n#define IS_FW_HEADER_EXIST_8703B(_pFwHdr)\t((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x03B0)\n\ntypedef struct _RT_FIRMWARE {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_8703B_SIZE];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8703B, *PRT_FIRMWARE_8703B;\n\n//\n// This structure must be cared byte-ordering\n//\n// Added by tynli. 2009.12.04.\ntypedef struct _RT_8703B_FIRMWARE_HDR\n{\n\t// 8-byte alinment required\n\n\t//--- LONG WORD 0 ----\n\tu16\t\tSignature;\t// 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n\tu8\t\tCategory;\t// AP/NIC and USB/PCI\n\tu8\t\tFunction;\t// Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n\tu16\t\tVersion;\t\t// FW Version\n\tu16\t\tSubversion;\t// FW Subversion, default 0x00\n\n\t//--- LONG WORD 1 ----\n\tu8\t\tMonth;\t// Release time Month field\n\tu8\t\tDate;\t// Release time Date field\n\tu8\t\tHour;\t// Release time Hour field\n\tu8\t\tMinute;\t// Release time Minute field\n\tu16\t\tRamCodeSize;\t// The size of RAM code\n\tu16\t\tRsvd2;\n\n\t//--- LONG WORD 2 ----\n\tu32\t\tSvnIdx;\t// The SVN entry index\n\tu32\t\tRsvd3;\n\n\t//--- LONG WORD 3 ----\n\tu32\t\tRsvd4;\n\tu32\t\tRsvd5;\n}RT_8703B_FIRMWARE_HDR, *PRT_8703B_FIRMWARE_HDR;\n\n#define DRIVER_EARLY_INT_TIME_8703B\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8703B\t\t0x02\n\n// for 8703B\n// TX 32K, RX 16K, Page size 128B for TX, 8B for RX\n#define PAGE_SIZE_TX_8703B\t\t\t128\n#define PAGE_SIZE_RX_8703B\t\t\t8\n\n#define TX_DMA_SIZE_8703B\t\t\t0x8000\t/* 32K(TX) */\n#define RX_DMA_SIZE_8703B\t\t\t0x4000\t/* 16K(RX) */\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8703B\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8703B\t0x80\t// 128B, reserved for tx report\n#endif\n#define RX_DMA_BOUNDARY_8703B\t\t(RX_DMA_SIZE_8703B - RX_DMA_RESERVED_SIZE_8703B - 1)\n\n\n// Note: We will divide number of page equally for each queue other than public queue!\n\n//For General Reserved Page Number(Beacon Queue is reserved page)\n//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1\n#define BCNQ_PAGE_NUM_8703B\t\t0x08\n#ifdef CONFIG_CONCURRENT_MODE\n#define BCNQ1_PAGE_NUM_8703B\t\t0x08 // 0x04\n#else\n#define BCNQ1_PAGE_NUM_8703B\t\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef BCNQ1_PAGE_NUM_8703B\n#define BCNQ1_PAGE_NUM_8703B\t\t0x00 // 0x04\n#endif\n\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8703B\t0x07\n#else\n#define WOWLAN_PAGE_NUM_8703B\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef WOWLAN_PAGE_NUM_8703B\n#define WOWLAN_PAGE_NUM_8703B\t0x15\n#endif\n\n#ifdef CONFIG_AP_WOWLAN\n#define AP_WOWLAN_PAGE_NUM_8703B\t0x02\n#endif\n\n#define TX_TOTAL_PAGE_NUMBER_8703B\t(0xFF - BCNQ_PAGE_NUM_8703B - BCNQ1_PAGE_NUM_8703B - WOWLAN_PAGE_NUM_8703B)\n#define TX_PAGE_BOUNDARY_8703B\t\t(TX_TOTAL_PAGE_NUMBER_8703B + 1)\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8703B\tTX_TOTAL_PAGE_NUMBER_8703B\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8703B\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8703B + 1)\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8703B\n#define NORMAL_PAGE_NUM_HPQ_8703B\t\t0x0C\n#define NORMAL_PAGE_NUM_LPQ_8703B\t\t0x02\n#define NORMAL_PAGE_NUM_NPQ_8703B\t\t0x02\n\n// Note: For Normal Chip Setting, modify later\n#define WMM_NORMAL_PAGE_NUM_HPQ_8703B\t\t0x30\n#define WMM_NORMAL_PAGE_NUM_LPQ_8703B\t\t0x20\n#define WMM_NORMAL_PAGE_NUM_NPQ_8703B\t\t0x20\n\n\n#include \"HalVerDef.h\"\n#include \"hal_com.h\"\n\n#define EFUSE_OOB_PROTECT_BYTES \t\t15\n\n#define HAL_EFUSE_MEMORY\n\n#define HWSET_MAX_SIZE_8703B\t\t\t512\n#define EFUSE_REAL_CONTENT_LEN_8703B\t\t512\n#define EFUSE_MAP_LEN_8703B\t\t\t\t512\n#define EFUSE_MAX_SECTION_8703B\t\t\t64\n\n#define EFUSE_IC_ID_OFFSET\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_8703B)\n\n#define EFUSE_ACCESS_ON\t\t\t0x69\t\n#define EFUSE_ACCESS_OFF\t\t\t0x00\t\n\n//========================================================\n//\t\t\tEFUSE for BT definition\n//========================================================\n#define EFUSE_BT_REAL_BANK_CONTENT_LEN\t512\n#define EFUSE_BT_REAL_CONTENT_LEN\t\t1536\t// 512*3\n#define EFUSE_BT_MAP_LEN\t\t\t\t1024\t// 1k bytes\n#define EFUSE_BT_MAX_SECTION\t\t\t128\t\t// 1024/8\n\n#define EFUSE_PROTECT_BYTES_BANK\t\t16\n\ntypedef struct _C2H_EVT_HDR\n{\n\tu8\tCmdID;\n\tu8\tCmdLen;\n\tu8\tCmdSeq;\n} __attribute__((__packed__)) C2H_EVT_HDR, *PC2H_EVT_HDR;\n\ntypedef enum tag_Package_Definition\n{\n    PACKAGE_DEFAULT,\n    PACKAGE_QFN68,\n    PACKAGE_TFBGA90,\n    PACKAGE_TFBGA80,\n    PACKAGE_TFBGA79\n}PACKAGE_TYPE_E;\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n// rtl8703b_hal_init.c\ns32 rtl8703b_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw);\nvoid rtl8703b_FirmwareSelfReset(PADAPTER padapter);\nvoid rtl8703b_InitializeFirmwareVars(PADAPTER padapter);\n\nvoid rtl8703b_InitAntenna_Selection(PADAPTER padapter);\nvoid rtl8703b_DeinitAntenna_Selection(PADAPTER padapter);\nvoid rtl8703b_CheckAntenna_Selection(PADAPTER padapter);\nvoid rtl8703b_init_default_value(PADAPTER padapter);\n\ns32 rtl8703b_InitLLTTable(PADAPTER padapter);\n\ns32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU);\ns32 CardDisableWithoutHWSM(PADAPTER padapter);\n\n// EFuse\nu8 GetEEPROMSize8703B(PADAPTER padapter);\nvoid Hal_InitPGData(PADAPTER padapter, u8 *PROMContent);\nvoid Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo);\nvoid Hal_EfuseParseTxPowerInfo_8703B(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseBTCoexistInfo_8703B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseEEPROMVer_8703B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseChnlPlan_8703B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseCustomerID_8703B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseAntennaDiversity_8703B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseXtal_8703B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail);\nvoid Hal_EfuseParseThermalMeter_8703B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail);\nVOID Hal_EfuseParsePackageType_8703B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nVOID Hal_EfuseParseVoltage_8703B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN \tAutoLoadFail); \nVOID Hal_EfuseParseBoardType_8703B(PADAPTER Adapter,\tu8*\tPROMContent,BOOLEAN AutoloadFail);\n\n#ifdef CONFIG_C2H_PACKET_EN\nvoid rtl8703b_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length);\n#endif\n\n\nvoid rtl8703b_set_hal_ops(struct hal_ops *pHalFunc);\nvoid SetHwReg8703B(PADAPTER padapter, u8 variable, u8 *val);\nvoid GetHwReg8703B(PADAPTER padapter, u8 variable, u8 *val);\n#ifdef CONFIG_C2H_PACKET_EN\nvoid SetHwRegWithBuf8703B(PADAPTER padapter, u8 variable, u8 *pbuf, int len);\n#endif // CONFIG_C2H_PACKET_EN\nu8 SetHalDefVar8703B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\nu8 GetHalDefVar8703B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\n\n// register\nvoid rtl8703b_InitBeaconParameters(PADAPTER padapter);\nvoid rtl8703b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode);\nvoid\t_InitBurstPktLen_8703BS(PADAPTER Adapter);\nvoid _InitLTECoex_8703BS(PADAPTER Adapter);\nvoid _8051Reset8703(PADAPTER padapter);\n#ifdef CONFIG_WOWLAN\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\nvoid rtl8703b_start_thread(_adapter *padapter);\nvoid rtl8703b_stop_thread(_adapter *padapter);\n\n#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)\nvoid rtl8703bs_init_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8703bs_free_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8703bs_cancle_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8703bs_hal_check_bt_hang(_adapter * adapter);\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nvoid HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue);\n#endif\n\nint FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\n\nvoid CCX_FwC2HTxRpt_8703b(PADAPTER padapter, u8 *pdata, u8 len);\ns32 c2h_id_filter_ccx_8703b(u8 *buf);\ns32 c2h_handler_8703b(PADAPTER padapter, u8 *pC2hEvent);\nu8 MRateToHwRate8703B(u8  rate);\nu8 HwRateToMRate8703B(u8\t rate);\n\nvoid Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8703BE(PADAPTER Adapter);\nVOID\tUpdateInterruptMask8703BE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_LED_H__\n#define __RTL8703B_LED_H__\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8703bu_InitSwLeds(PADAPTER padapter);\nvoid rtl8703bu_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8703bs_InitSwLeds(PADAPTER padapter);\nvoid rtl8703bs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_GSPI_HCI\nvoid rtl8703bs_InitSwLeds(PADAPTER padapter);\nvoid rtl8703bs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8703be_InitSwLeds(PADAPTER padapter);\nvoid rtl8703be_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_RECV_H__\n#define __RTL8703B_RECV_H__\n\n#define RECV_BLK_SZ 512\n#define RECV_BLK_CNT 16\n#define RECV_BLK_TH RECV_BLK_CNT\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t//#define MAX_RECVBUF_SZ (32768) // 32k\n\t\t//#define MAX_RECVBUF_SZ (16384) //16K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K\n\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t#define MAX_RECVBUF_SZ (8192) // 8K\n\t\t#else\n\t\t        #define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t#else\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\n#define MAX_RECVBUF_SZ (10240)\n\n#endif\n\n// Rx smooth factor\n#define\tRx_Smooth_Factor (20)\n\n#ifdef CONFIG_SDIO_HCI\n#ifndef CONFIG_SDIO_RX_COPY\n#undef MAX_RECVBUF_SZ\n#define MAX_RECVBUF_SZ\t(RX_DMA_SIZE_8703B - RX_DMA_RESERVED_SIZE_8703B)\n#endif // !CONFIG_SDIO_RX_COPY\n#endif // CONFIG_SDIO_HCI\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8703bs_init_recv_priv(PADAPTER padapter);\nvoid rtl8703bs_free_recv_priv(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_USB_HCI\nint rtl8703bu_init_recv_priv(_adapter *padapter);\nvoid rtl8703bu_free_recv_priv (_adapter *padapter);\nvoid rtl8703bu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8703be_init_recv_priv(PADAPTER padapter);\nvoid rtl8703be_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8703b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8703B_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8703b_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_RF_H__\n#define __RTL8703B_RF_H__\n\nint\tPHY_RF6052_Config8703B(\tIN\tPADAPTER\t\tAdapter\t);\n\nVOID\nPHY_RF6052SetBandwidth8703B(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8703B_SPEC_H__\n#define __RTL8703B_SPEC_H__\n\n#include <drv_conf.h>\n\n\n#define HAL_NAV_UPPER_UNIT_8703B\t\t128\t\t// micro-second\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_SYS_ISO_CTRL_8703B\t\t\t0x0000\t// 2 Byte\n#define REG_SYS_FUNC_EN_8703B\t\t\t0x0002\t// 2 Byte\n#define REG_APS_FSMCO_8703B\t\t\t0x0004\t// 4 Byte\n#define REG_SYS_CLKR_8703B\t\t\t\t0x0008\t// 2 Byte\n#define REG_9346CR_8703B\t\t\t\t0x000A\t// 2 Byte\n#define REG_EE_VPD_8703B\t\t\t\t0x000C\t// 2 Byte\n#define REG_AFE_MISC_8703B\t\t\t\t0x0010\t// 1 Byte\n#define REG_SPS0_CTRL_8703B\t\t\t\t0x0011\t// 7 Byte\n#define REG_SPS_OCP_CFG_8703B\t\t\t0x0018\t// 4 Byte\n#define REG_RSV_CTRL_8703B\t\t\t\t0x001C\t// 3 Byte\n#define REG_RF_CTRL_8703B\t\t\t\t0x001F\t// 1 Byte\n#define REG_LPLDO_CTRL_8703B\t\t\t0x0023\t// 1 Byte\n#define REG_AFE_XTAL_CTRL_8703B\t\t0x0024\t// 4 Byte\n#define REG_AFE_PLL_CTRL_8703B\t\t\t0x0028\t// 4 Byte\n#define REG_MAC_PLL_CTRL_EXT_8703B\t\t0x002c \t// 4 Byte\n#define REG_EFUSE_CTRL_8703B\t\t\t0x0030\n#define REG_EFUSE_TEST_8703B\t\t\t0x0034\n#define REG_PWR_DATA_8703B\t\t\t\t0x0038\n#define REG_CAL_TIMER_8703B\t\t\t\t0x003C\n#define REG_ACLK_MON_8703B\t\t\t\t0x003E\n#define REG_GPIO_MUXCFG_8703B\t\t\t0x0040\n#define REG_GPIO_IO_SEL_8703B\t\t\t0x0042\n#define REG_MAC_PINMUX_CFG_8703B\t\t0x0043\n#define REG_GPIO_PIN_CTRL_8703B\t\t\t0x0044\n#define REG_GPIO_INTM_8703B\t\t\t\t0x0048\n#define REG_LEDCFG0_8703B\t\t\t\t0x004C\n#define REG_LEDCFG1_8703B\t\t\t\t0x004D\n#define REG_LEDCFG2_8703B\t\t\t\t0x004E\n#define REG_LEDCFG3_8703B\t\t\t\t0x004F\n#define REG_FSIMR_8703B\t\t\t\t\t0x0050\n#define REG_FSISR_8703B\t\t\t\t\t0x0054\n#define REG_HSIMR_8703B\t\t\t\t\t0x0058\n#define REG_HSISR_8703B\t\t\t\t\t0x005c\n#define REG_GPIO_EXT_CTRL\t\t\t\t0x0060\n#define REG_PAD_CTRL1_8703B\t\t0x0064\n#define REG_MULTI_FUNC_CTRL_8703B\t\t0x0068\n#define REG_GPIO_STATUS_8703B\t\t\t0x006C\n#define REG_SDIO_CTRL_8703B\t\t\t\t0x0070\n#define REG_OPT_CTRL_8703B\t\t\t\t0x0074\n#define REG_AFE_CTRL_4_8703B\t\t0x0078\n#define REG_MCUFWDL_8703B\t\t\t\t0x0080\n#define REG_HMEBOX_DBG_0_8703B\t0x0088\n#define REG_HMEBOX_DBG_1_8703B\t0x008A\n#define REG_HMEBOX_DBG_2_8703B\t0x008C\n#define REG_HMEBOX_DBG_3_8703B\t0x008E\n#define REG_HIMR0_8703B\t\t\t\t\t0x00B0\n#define REG_HISR0_8703B\t\t\t\t\t0x00B4\n#define REG_HIMR1_8703B\t\t\t\t\t0x00B8\n#define REG_HISR1_8703B\t\t\t\t\t0x00BC\n#define REG_PMC_DBG_CTRL2_8703B\t\t\t0x00CC\n#define\tREG_EFUSE_BURN_GNT_8703B\t\t0x00CF\n#define REG_HPON_FSM_8703B\t\t\t\t0x00EC\n#define REG_SYS_CFG_8703B\t\t\t\t0x00F0\n#define REG_SYS_CFG1_8703B\t\t\t\t0x00FC\n#define REG_ROM_VERSION\t\t\t\t\t0x00FD\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_C2HEVT_CMD_ID_8703B\t0x01A0\n#define REG_C2HEVT_CMD_SEQ_88XX\t\t0x01A1\n#define REG_C2hEVT_CMD_CONTENT_88XX\t0x01A2\n#define REG_C2HEVT_CMD_LEN_8703B        0x01AE\n#define REG_C2HEVT_CMD_LEN_88XX\t\tREG_C2HEVT_CMD_LEN_8703B\n#define REG_C2HEVT_CLEAR_8703B\t\t\t0x01AF\n#define REG_MCUTST_1_8703B\t\t\t\t0x01C0\n#define REG_WOWLAN_WAKE_REASON 0x01C7\n#define REG_FMETHR_8703B\t\t\t\t0x01C8\n#define REG_HMETFR_8703B\t\t\t\t0x01CC\n#define REG_HMEBOX_0_8703B\t\t\t\t0x01D0\n#define REG_HMEBOX_1_8703B\t\t\t\t0x01D4\n#define REG_HMEBOX_2_8703B\t\t\t\t0x01D8\n#define REG_HMEBOX_3_8703B\t\t\t\t0x01DC\n#define REG_LLT_INIT_8703B\t\t\t\t0x01E0\n#define REG_HMEBOX_EXT0_8703B\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8703B\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8703B\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8703B\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RQPN_8703B\t\t\t\t\t0x0200\n#define REG_FIFOPAGE_8703B\t\t\t\t0x0204\n#define REG_DWBCN0_CTRL_8703B\t\t\tREG_TDECTRL\n#define REG_TXDMA_OFFSET_CHK_8703B\t0x020C\n#define REG_TXDMA_STATUS_8703B\t\t0x0210\n#define REG_RQPN_NPQ_8703B\t\t\t0x0214\n#define REG_DWBCN1_CTRL_8703B\t\t\t0x0228\n\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_AGG_PG_TH_8703B\t\t0x0280\n#define REG_FW_UPD_RDPTR_8703B\t\t0x0284 // FW shall update this register before FW write RXPKT_RELEASE_POLL to 1\n#define REG_RXDMA_CONTROL_8703B\t\t0x0286 // Control the RX DMA.\n#define REG_RXPKT_NUM_8703B\t\t\t0x0287 // The number of packets in RXPKTBUF.\t\n#define REG_RXDMA_STATUS_8703B\t\t\t0x0288\n#define REG_RXDMA_MODE_CTRL_8703B\t\t0x0290\n#define REG_EARLY_MODE_CONTROL_8703B\t0x02BC\n#define REG_RSVD5_8703B\t\t\t\t\t0x02F0\n#define REG_RSVD6_8703B\t\t\t\t\t0x02F4\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8703B\t\t0x0300\n#define\tREG_INT_MIG_8703B\t\t\t\t0x0304\t// Interrupt Migration \n#define\tREG_BCNQ_DESA_8703B\t\t\t0x0308\t// TX Beacon Descriptor Address\n#define\tREG_HQ_DESA_8703B\t\t\t\t0x0310\t// TX High Queue Descriptor Address\n#define\tREG_MGQ_DESA_8703B\t\t\t0x0318\t// TX Manage Queue Descriptor Address\n#define\tREG_VOQ_DESA_8703B\t\t\t0x0320\t// TX VO Queue Descriptor Address\n#define\tREG_VIQ_DESA_8703B\t\t\t\t0x0328\t// TX VI Queue Descriptor Address\n#define\tREG_BEQ_DESA_8703B\t\t\t0x0330\t// TX BE Queue Descriptor Address\n#define\tREG_BKQ_DESA_8703B\t\t\t0x0338\t// TX BK Queue Descriptor Address\n#define\tREG_RX_DESA_8703B\t\t\t\t0x0340\t// RX Queue\tDescriptor Address\n#define\tREG_DBI_WDATA_8703B\t\t\t0x0348\t// DBI Write Data\n#define\tREG_DBI_RDATA_8703B\t\t\t0x034C\t// DBI Read Data\n#define\tREG_DBI_ADDR_8703B\t\t\t\t0x0350\t// DBI Address\n#define\tREG_DBI_FLAG_8703B\t\t\t\t0x0352\t// DBI Read/Write Flag\n#define\tREG_MDIO_WDATA_8703B\t\t0x0354\t// MDIO for Write PCIE PHY\n#define\tREG_MDIO_RDATA_8703B\t\t\t0x0356\t// MDIO for Reads PCIE PHY\n#define\tREG_MDIO_CTL_8703B\t\t\t0x0358\t// MDIO for Control\n#define\tREG_DBG_SEL_8703B\t\t\t\t0x0360\t// Debug Selection Register\n#define\tREG_PCIE_HRPWM_8703B\t\t\t0x0361\t//PCIe RPWM\n#define\tREG_PCIE_HCPWM_8703B\t\t\t0x0363\t//PCIe CPWM\n#define\tREG_PCIE_MULTIFET_CTRL_8703B\t0x036A\t//PCIE Multi-Fethc Control\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_VOQ_INFORMATION_8703B\t\t0x0400\n#define REG_VIQ_INFORMATION_8703B\t\t0x0404\n#define REG_BEQ_INFORMATION_8703B\t\t0x0408\n#define REG_BKQ_INFORMATION_8703B\t\t0x040C\n#define REG_MGQ_INFORMATION_8703B\t\t0x0410\n#define REG_HGQ_INFORMATION_8703B\t\t0x0414\n#define REG_BCNQ_INFORMATION_8703B\t0x0418\n#define REG_TXPKT_EMPTY_8703B\t\t\t0x041A\n\n#define REG_FWHW_TXQ_CTRL_8703B\t\t0x0420\n#define REG_HWSEQ_CTRL_8703B\t\t\t0x0423\n#define REG_TXPKTBUF_BCNQ_BDNY_8703B\t0x0424\n#define REG_TXPKTBUF_MGQ_BDNY_8703B\t0x0425\n#define REG_LIFECTRL_CTRL_8703B\t\t\t0x0426\n#define REG_MULTI_BCNQ_OFFSET_8703B\t0x0427\n#define REG_SPEC_SIFS_8703B\t\t\t\t0x0428\n#define REG_RL_8703B\t\t\t\t\t\t0x042A\n#define REG_TXBF_CTRL_8703B\t\t\t\t0x042C\n#define REG_DARFRC_8703B\t\t\t\t0x0430\n#define REG_RARFRC_8703B\t\t\t\t0x0438\n#define REG_RRSR_8703B\t\t\t\t\t0x0440\n#define REG_ARFR0_8703B\t\t\t\t\t0x0444\n#define REG_ARFR1_8703B\t\t\t\t\t0x044C\n#define REG_CCK_CHECK_8703B\t\t\t\t0x0454\n#define REG_AMPDU_MAX_TIME_8703B\t\t0x0456\n#define REG_TXPKTBUF_BCNQ_BDNY1_8703B\t0x0457\n\n#define REG_AMPDU_MAX_LENGTH_8703B\t0x0458\n#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8703B\t0x045D\n#define REG_NDPA_OPT_CTRL_8703B\t\t0x045F\n#define REG_FAST_EDCA_CTRL_8703B\t\t0x0460\n#define REG_RD_RESP_PKT_TH_8703B\t\t0x0463\n#define REG_DATA_SC_8703B\t\t\t\t0x0483\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x0484\n#define REG_TXPKTBUF_IV_HIGH            0x0488\n#endif\n#define REG_TXRPT_START_OFFSET\t\t0x04AC\n#define REG_POWER_STAGE1_8703B\t\t0x04B4\n#define REG_POWER_STAGE2_8703B\t\t0x04B8\n#define REG_AMPDU_BURST_MODE_8703B\t0x04BC\n#define REG_PKT_VO_VI_LIFE_TIME_8703B\t0x04C0\n#define REG_PKT_BE_BK_LIFE_TIME_8703B\t0x04C2\n#define REG_STBC_SETTING_8703B\t\t\t0x04C4\n#define REG_HT_SINGLE_AMPDU_8703B\t\t0x04C7\n#define REG_PROT_MODE_CTRL_8703B\t\t0x04C8\n#define REG_MAX_AGGR_NUM_8703B\t\t0x04CA\n#define REG_RTS_MAX_AGGR_NUM_8703B\t0x04CB\n#define REG_BAR_MODE_CTRL_8703B\t\t0x04CC\n#define REG_RA_TRY_RATE_AGG_LMT_8703B\t0x04CF\n#define REG_MACID_PKT_DROP0_8703B\t\t0x04D0\n#define REG_MACID_PKT_SLEEP_8703B\t\t0x04D4\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_EDCA_VO_PARAM_8703B\t\t0x0500\n#define REG_EDCA_VI_PARAM_8703B\t\t0x0504\n#define REG_EDCA_BE_PARAM_8703B\t\t0x0508\n#define REG_EDCA_BK_PARAM_8703B\t\t0x050C\n#define REG_BCNTCFG_8703B\t\t\t\t0x0510\n#define REG_PIFS_8703B\t\t\t\t\t0x0512\n#define REG_RDG_PIFS_8703B\t\t\t\t0x0513\n#define REG_SIFS_CTX_8703B\t\t\t\t0x0514\n#define REG_SIFS_TRX_8703B\t\t\t\t0x0516\n#define REG_AGGR_BREAK_TIME_8703B\t\t0x051A\n#define REG_SLOT_8703B\t\t\t\t\t0x051B\n#define REG_TX_PTCL_CTRL_8703B\t\t\t0x0520\n#define REG_TXPAUSE_8703B\t\t\t\t0x0522\n#define REG_DIS_TXREQ_CLR_8703B\t\t0x0523\n#define REG_RD_CTRL_8703B\t\t\t\t0x0524\n//\n// Format for offset 540h-542h:\n//\t[3:0]:   TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT.\n//\t[7:4]:   Reserved.\n//\t[19:8]:  TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet.\n//\t[23:20]: Reserved\n// Description:\n//\t              |\n//     |<--Setup--|--Hold------------>|\n//\t--------------|----------------------\n//                |\n//               TBTT\n// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold.\n// Described by Designer Tim and Bruce, 2011-01-14.\n//\n#define REG_TBTT_PROHIBIT_8703B\t\t\t0x0540\n#define REG_RD_NAV_NXT_8703B\t\t\t0x0544\n#define REG_NAV_PROT_LEN_8703B\t\t\t0x0546\n#define REG_BCN_CTRL_8703B\t\t\t\t0x0550\n#define REG_BCN_CTRL_1_8703B\t\t\t0x0551\n#define REG_MBID_NUM_8703B\t\t\t\t0x0552\n#define REG_DUAL_TSF_RST_8703B\t\t\t0x0553\n#define REG_BCN_INTERVAL_8703B\t\t\t0x0554\n#define REG_DRVERLYINT_8703B\t\t\t0x0558\n#define REG_BCNDMATIM_8703B\t\t\t0x0559\n#define REG_ATIMWND_8703B\t\t\t\t0x055A\n#define REG_USTIME_TSF_8703B\t\t\t0x055C\n#define REG_BCN_MAX_ERR_8703B\t\t\t0x055D\n#define REG_RXTSF_OFFSET_CCK_8703B\t\t0x055E\n#define REG_RXTSF_OFFSET_OFDM_8703B\t0x055F\t\n#define REG_TSFTR_8703B\t\t\t\t\t0x0560\n#define REG_CTWND_8703B\t\t\t\t\t0x0572\n#define REG_SECONDARY_CCA_CTRL_8703B\t0x0577\n#define REG_PSTIMER_8703B\t\t\t\t0x0580\n#define REG_TIMER0_8703B\t\t\t\t0x0584\n#define REG_TIMER1_8703B\t\t\t\t0x0588\n#define REG_ACMHWCTRL_8703B\t\t\t0x05C0\n#define REG_SCH_TXCMD_8703B\t\t\t0x05F8\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#define REG_MAC_CR_8703B\t\t\t\t0x0600\n#define REG_TCR_8703B\t\t\t\t\t0x0604\n#define REG_RCR_8703B\t\t\t\t\t0x0608\n#define REG_RX_PKT_LIMIT_8703B\t\t\t0x060C\n#define REG_RX_DLK_TIME_8703B\t\t\t0x060D\n#define REG_RX_DRVINFO_SZ_8703B\t\t0x060F\n\n#define REG_MACID_8703B\t\t\t\t\t0x0610\n#define REG_BSSID_8703B\t\t\t\t\t0x0618\n#define REG_MAR_8703B\t\t\t\t\t0x0620\n#define REG_MBIDCAMCFG_8703B\t\t\t0x0628\n#define REG_WOWLAN_GTK_DBG1\t0x630\n#define REG_WOWLAN_GTK_DBG2\t0x634\n\n#define REG_USTIME_EDCA_8703B\t\t\t0x0638\n#define REG_MAC_SPEC_SIFS_8703B\t\t0x063A\n#define REG_RESP_SIFP_CCK_8703B\t\t\t0x063C\n#define REG_RESP_SIFS_OFDM_8703B\t\t0x063E\n#define REG_ACKTO_8703B\t\t\t\t\t0x0640\n#define REG_CTS2TO_8703B\t\t\t\t0x0641\n#define REG_EIFS_8703B\t\t\t\t\t0x0642\n\n#define REG_NAV_UPPER_8703B\t\t\t0x0652\t// unit of 128\n#define REG_TRXPTCL_CTL_8703B\t\t\t0x0668\n\n// Security\n#define REG_CAMCMD_8703B\t\t\t\t0x0670\n#define REG_CAMWRITE_8703B\t\t\t\t0x0674\n#define REG_CAMREAD_8703B\t\t\t\t0x0678\n#define REG_CAMDBG_8703B\t\t\t\t0x067C\n#define REG_SECCFG_8703B\t\t\t\t0x0680\n\n// Power\n#define REG_WOW_CTRL_8703B\t\t\t\t0x0690\n#define REG_PS_RX_INFO_8703B\t\t\t0x0692\n#define REG_UAPSD_TID_8703B\t\t\t\t0x0693\n#define REG_WKFMCAM_CMD_8703B\t\t\t0x0698\n#define REG_WKFMCAM_NUM_8703B\t\t\t0x0698\n#define REG_WKFMCAM_RWD_8703B\t\t\t0x069C\n#define REG_RXFLTMAP0_8703B\t\t\t\t0x06A0\n#define REG_RXFLTMAP1_8703B\t\t\t\t0x06A2\n#define REG_RXFLTMAP2_8703B\t\t\t\t0x06A4\n#define REG_BCN_PSR_RPT_8703B\t\t\t0x06A8\n#define REG_BT_COEX_TABLE_8703B\t\t0x06C0\n#define REG_BFMER0_INFO_8703B\t\t\t0x06E4\n#define REG_BFMER1_INFO_8703B\t\t\t0x06EC\n#define REG_CSI_RPT_PARAM_BW20_8703B\t0x06F4\n#define REG_CSI_RPT_PARAM_BW40_8703B\t0x06F8\n#define REG_CSI_RPT_PARAM_BW80_8703B\t0x06FC\n\n// Hardware Port 2\n#define REG_MACID1_8703B\t\t\t\t0x0700\n#define REG_BSSID1_8703B\t\t\t\t0x0708\n#define REG_BFMEE_SEL_8703B\t\t\t\t0x0714\n#define REG_SND_PTCL_CTRL_8703B\t\t0x0718\n\n// LTE_COEX\n#define REG_LTECOEX_CTRL\t\t\t0x07C0\n#define REG_LTECOEX_WRITE_DATA\t\t0x07C4\t\n#define REG_LTECOEX_READ_DATA\t\t0x07C8\n#define REG_LTECOEX_PATH_CONTROL\t0x70\n\n//============================================================\n// SDIO Bus Specification\n//============================================================\n\n//-----------------------------------------------------\n// SDIO CMD Address Mapping\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// I/O bus domain (Host)\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// SDIO register\n//-----------------------------------------------------\n#define SDIO_REG_HCPWM1_8703B\t0x025 // HCI Current Power Mode 1\n\n\n//============================================================================\n//\t8703 Regsiter Bit and Content definition\n//============================================================================\n\n#define BIT_USB_RXDMA_AGG_EN\tBIT(31)\n#define RXDMA_AGG_MODE_EN\t\tBIT(1)\n\n#ifdef CONFIG_WOWLAN\n#define RXPKT_RELEASE_POLL\t\tBIT(16)\n#define RXDMA_IDLE\t\t\t\tBIT(17)\n#define RW_RELEASE_EN\t\t\tBIT(18)\n#endif\n\n//2 HSISR\n// interrupt mask which needs to clear\n#define MASK_HSISR_CLEAR\t\t(HSISR_GPIO12_0_INT |\\\n\t\t\t\t\t\t\t\tHSISR_SPS_OCP_INT |\\\n\t\t\t\t\t\t\t\tHSISR_RON_INT |\\\n\t\t\t\t\t\t\t\tHSISR_PDNINT |\\\n\t\t\t\t\t\t\t\tHSISR_GPIO9_INT)\n\n\n//----------------------------------------------------------------------------\n//       8703B REG_CCK_CHECK\t\t\t\t\t\t(offset 0x454)\n//----------------------------------------------------------------------------\n#define BIT_BCN_PORT_SEL\t\tBIT5\n\n#ifdef CONFIG_RF_GAIN_OFFSET\n\n#ifdef CONFIG_RTL8703B\n#define EEPROM_RF_GAIN_OFFSET\t\t\t0xC1\n#endif\n\n#define EEPROM_RF_GAIN_VAL\t\t\t\t0x1F6\n#endif //CONFIG_RF_GAIN_OFFSET\n\n\n//----------------------------------------------------------------------------\n//       8195 IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8703B\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8703B\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8703B\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8703B\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8703B\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8703B\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8703B\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8703B\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8703B\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8703B\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8703B\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8703B\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8703B\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8703B\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8703B\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8703B\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8703B\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8703B\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8703B\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8703B\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8703B\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8703B\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8703B\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8703B\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8703B\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_BCNDMAINT7_8703B\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8703B\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8703B\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8703B\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8703B\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8703B\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8703B\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8703B\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8703B\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8703B\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8703B\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8703B\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8703B\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8703B\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8703B\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8703B\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8703B\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8703B\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8703B\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n#ifdef CONFIG_PCI_HCI\n//#define IMR_RX_MASK\t\t(IMR_ROK_8703B|IMR_RDU_8703B|IMR_RXFOVW_8703B)\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_8703B|IMR_VIDOK_8703B|IMR_BEDOK_8703B|IMR_BKDOK_8703B|IMR_MGNTDOK_8703B|IMR_HIGHDOK_8703B)\n\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_8703B | IMR_TXBCN0OK_8703B | IMR_TXBCN0ERR_8703B | IMR_BCNDERR0_8703B)\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_8703B | IMR_VODOK_8703B | IMR_BEDOK_8703B|IMR_BKDOK_8703B)\n#endif\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8703B 128\n#define SEC_CAM_ENT_NUM_8703B 16\n#define NSS_NUM_8703B 1\n#define BAND_CAP_8703B (BAND_CAP_2G)\n#define BW_CAP_8703B (BW_CAP_20M | BW_CAP_40M)\n\n#endif /* __RTL8703B_SPEC_H__ */\n\n"
  },
  {
    "path": "include/rtl8703b_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL8703B_SRESET_H_\n#define _RTL8703B_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8703b_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8703b_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8703b_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8703B_XMIT_H__\n#define __RTL8703B_XMIT_H__\n\n\n#define MAX_TID (15)\n\n\n#ifndef __INC_HAL8703BDESC_H\n#define __INC_HAL8703BDESC_H\n\n#define RX_STATUS_DESC_SIZE_8703B\t\t24\n#define RX_DRV_INFO_SIZE_UNIT_8703B 8\n\n\n//DWORD 0\n#define SET_RX_STATUS_DESC_PKT_LEN_8703B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_8703B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_8703B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n#define GET_RX_STATUS_DESC_PKT_LEN_8703B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICV_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8703B(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_8703B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_8703B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_LAST_SEG_8703B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1)\n#define GET_RX_STATUS_DESC_FIRST_SEG_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1)\n#define GET_RX_STATUS_DESC_EOR_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_OWN_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_8703B(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_TID_8703B(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_AMSDU_8703B(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_8703B(__pRxDesc)\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_8703B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_A1_FIT_8703B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4)\n#define GET_RX_STATUS_DESC_CHKERR_8703B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_IPVER_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_IS_TCPUDP__8703B(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_CHK_VLD_8703B(__pRxDesc) \tLE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_8703B(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_8703B(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_MC_8703B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_8703B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_8703B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#define GET_RX_STATUS_DESC_RX_IS_QOS_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8703B(__pRxStatusDesc) \tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_RPT_SEL_8703B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_HTC_8703B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_8703B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_8703B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#ifdef CONFIG_USB_RX_AGGREGATION\n#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8703B(__pRxStatusDesc)\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)\n#endif\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_MATCH_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_MATCH_8703B(__pRxDesc) \t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1)\n\n//DWORD 6\n#define GET_RX_STATUS_DESC_SPLCP_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1)\n#define GET_RX_STATUS_DESC_LDPC_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1)\n#define GET_RX_STATUS_DESC_STBC_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1)\n#define GET_RX_STATUS_DESC_BW_8703B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2)\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_8703B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n#define GET_RX_STATUS_DESC_BUFF_ADDR_8703B(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\n#define GET_RX_STATUS_DESC_BUFF_ADDR64_8703B(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\n\n#define SET_RX_STATUS_DESC_BUFF_ADDR_8703B(__pRxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\n\n\n// Dword 0\n#define GET_TX_DESC_OWN_8703B(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n\n#define SET_TX_DESC_PKT_SIZE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define SET_TX_DESC_OFFSET_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define SET_TX_DESC_BMC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_FIRST_SEG_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_LINIP_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_NO_ACM_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_OWN_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n\n// Dword 1\n#define SET_TX_DESC_MACID_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n\n\n// Dword 2\n#define SET_TX_DESC_PAID_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_AGG_BREAK_8703B(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define SET_TX_DESC_RAW_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define SET_TX_DESC_SPE_RPT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_INT_8703B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_8703B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)\n#define SET_TX_DESC_CHK_EN_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)\n#define SET_TX_DESC_EARLY_MODE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HWSEQ_SEL_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_8703B(__pTxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_CTROL_STBC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_MBSSID_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n#define SET_TX_DESC_ANTSEL_A_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANTSEL_C_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\n#define SET_TX_DESC_ANTSEL_D_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)\n\n// Dword 7\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n#define SET_TX_DESC_TX_BUFFER_SIZE_8703B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#else\n#define SET_TX_DESC_TX_DESC_CHECKSUM_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#endif\n#define SET_TX_DESC_USB_TXAGG_NUM_8703B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)\n#if(DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n#define SET_TX_DESC_SDIO_TXSEQ_8703B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)\n#endif\n\n// Dword 8\n#define SET_TX_DESC_HWSEQ_EN_8703B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n\n// Dword 9\n#define SET_TX_DESC_SEQ_8703B(__pTxDesc, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n\n// Dword 10\n#define SET_TX_DESC_TX_BUFFER_ADDRESS_8703B(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\n#define GET_TX_DESC_TX_BUFFER_ADDRESS_8703B(__pTxDesc) \tLE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)\n\n// Dword 11\n#define SET_TX_DESC_NEXT_DESC_ADDRESS_8703B(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\n\n\n#define SET_EARLYMODE_PKTNUM_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,\t__Value)\n#define SET_EARLYMODE_LEN3_8703B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\n#endif\n//-----------------------------------------------------------\n//\n//\tRate\n//\n//-----------------------------------------------------------\n// CCK Rates, TxHT = 0\n#define DESC8703B_RATE1M\t\t\t\t0x00\n#define DESC8703B_RATE2M\t\t\t\t0x01\n#define DESC8703B_RATE5_5M\t\t\t\t0x02\n#define DESC8703B_RATE11M\t\t\t\t0x03\n\n// OFDM Rates, TxHT = 0\n#define DESC8703B_RATE6M\t\t\t\t0x04\n#define DESC8703B_RATE9M\t\t\t\t0x05\n#define DESC8703B_RATE12M\t\t\t\t0x06\n#define DESC8703B_RATE18M\t\t\t\t0x07\n#define DESC8703B_RATE24M\t\t\t\t0x08\n#define DESC8703B_RATE36M\t\t\t\t0x09\n#define DESC8703B_RATE48M\t\t\t\t0x0a\n#define DESC8703B_RATE54M\t\t\t\t0x0b\n\n// MCS Rates, TxHT = 1\n#define DESC8703B_RATEMCS0\t\t\t\t0x0c\n#define DESC8703B_RATEMCS1\t\t\t\t0x0d\n#define DESC8703B_RATEMCS2\t\t\t\t0x0e\n#define DESC8703B_RATEMCS3\t\t\t\t0x0f\n#define DESC8703B_RATEMCS4\t\t\t\t0x10\n#define DESC8703B_RATEMCS5\t\t\t\t0x11\n#define DESC8703B_RATEMCS6\t\t\t\t0x12\n#define DESC8703B_RATEMCS7\t\t\t\t0x13\n#define DESC8703B_RATEMCS8\t\t\t\t0x14\n#define DESC8703B_RATEMCS9\t\t\t\t0x15\n#define DESC8703B_RATEMCS10 \t\t0x16\n#define DESC8703B_RATEMCS11 \t\t0x17\n#define DESC8703B_RATEMCS12 \t\t0x18\n#define DESC8703B_RATEMCS13 \t\t0x19\n#define DESC8703B_RATEMCS14 \t\t0x1a\n#define DESC8703B_RATEMCS15 \t\t0x1b\n#define DESC8703B_RATEVHTSS1MCS0\t\t0x2c\n#define DESC8703B_RATEVHTSS1MCS1\t\t0x2d\n#define DESC8703B_RATEVHTSS1MCS2\t\t0x2e\n#define DESC8703B_RATEVHTSS1MCS3\t\t0x2f\n#define DESC8703B_RATEVHTSS1MCS4\t\t0x30\n#define DESC8703B_RATEVHTSS1MCS5\t\t0x31\n#define DESC8703B_RATEVHTSS1MCS6\t\t0x32\n#define DESC8703B_RATEVHTSS1MCS7\t\t0x33\n#define DESC8703B_RATEVHTSS1MCS8\t\t0x34\n#define DESC8703B_RATEVHTSS1MCS9\t\t0x35\n#define DESC8703B_RATEVHTSS2MCS0\t\t0x36\n#define DESC8703B_RATEVHTSS2MCS1\t\t0x37\n#define DESC8703B_RATEVHTSS2MCS2\t\t0x38\n#define DESC8703B_RATEVHTSS2MCS3\t\t0x39\n#define DESC8703B_RATEVHTSS2MCS4\t\t0x3a\n#define DESC8703B_RATEVHTSS2MCS5\t\t0x3b\n#define DESC8703B_RATEVHTSS2MCS6\t\t0x3c\n#define DESC8703B_RATEVHTSS2MCS7\t\t0x3d\n#define DESC8703B_RATEVHTSS2MCS8\t\t0x3e\n#define DESC8703B_RATEVHTSS2MCS9\t\t0x3f\n\n\n#define \tRX_HAL_IS_CCK_RATE_8703B(pDesc)\\\n\t\t\t(GET_RX_STATUS_DESC_RX_RATE_8703B(pDesc) == DESC8703B_RATE1M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8703B(pDesc) == DESC8703B_RATE2M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8703B(pDesc) == DESC8703B_RATE5_5M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8703B(pDesc) == DESC8703B_RATE11M)\n\n\nvoid rtl8703b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem);\nvoid rtl8703b_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8703bs_init_xmit_priv(PADAPTER padapter);\nvoid rtl8703bs_free_xmit_priv(PADAPTER padapter);\ns32 rtl8703bs_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8703bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8703bs_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8703bs_xmit_buf_handler(PADAPTER padapter);\nthread_return rtl8703bs_xmit_thread(thread_context context);\n#define hal_xmit_handler rtl8703bs_xmit_buf_handler\n#endif\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8703bu_xmit_buf_handler(PADAPTER padapter);\n#define hal_xmit_handler rtl8703bu_xmit_buf_handler\n\n\ns32 rtl8703bu_init_xmit_priv(PADAPTER padapter);\nvoid rtl8703bu_free_xmit_priv(PADAPTER padapter);\ns32 rtl8703bu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8703bu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\t rtl8703bu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\n//s32 rtl8812au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8703bu_xmit_tasklet(void *priv);\ns32 rtl8703bu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,struct tx_desc *ptxdesc);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8703be_init_xmit_priv(PADAPTER padapter);\nvoid rtl8703be_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8703be_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid\trtl8703be_xmitframe_resume(_adapter *padapter);\ns32 rtl8703be_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8703be_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8703be_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8703be_xmit_tasklet(void *priv);\n#endif\n\nu8\tBWMapping_8703B(PADAPTER Adapter, struct pkt_attrib *pattrib);\nu8\tSCMapping_8703B(PADAPTER Adapter, struct pkt_attrib\t*pattrib);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_CMD_H__\n#define __RTL8723B_CMD_H__\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD DEFINITION    ------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\nenum h2c_cmd_8723B{\n\t//Common Class: 000\n\tH2C_8723B_RSVD_PAGE = 0x00,\n\tH2C_8723B_MEDIA_STATUS_RPT = 0x01,\n\tH2C_8723B_SCAN_ENABLE = 0x02,\n\tH2C_8723B_KEEP_ALIVE = 0x03,\n\tH2C_8723B_DISCON_DECISION = 0x04,\t\n\tH2C_8723B_PSD_OFFLOAD = 0x05,\t\n\tH2C_8723B_AP_OFFLOAD = 0x08,\t\n\tH2C_8723B_BCN_RSVDPAGE = 0x09,\t\n\tH2C_8723B_PROBERSP_RSVDPAGE = 0x0A,\t\n\tH2C_8723B_FCS_RSVDPAGE = 0x10,\t\n\tH2C_8723B_FCS_INFO = 0x11,\t\n\tH2C_8723B_AP_WOW_GPIO_CTRL = 0x13,\n\n\t//PoweSave Class: 001\n\tH2C_8723B_SET_PWR_MODE = 0x20,\n\tH2C_8723B_PS_TUNING_PARA = 0x21,\n\tH2C_8723B_PS_TUNING_PARA2 = 0x22,\n\tH2C_8723B_P2P_LPS_PARAM = 0x23,\t\n\tH2C_8723B_P2P_PS_OFFLOAD = 0x24,\t\n\tH2C_8723B_PS_SCAN_ENABLE = 0x25,\t\n\tH2C_8723B_SAP_PS_ = 0x26,\t\n\tH2C_8723B_INACTIVE_PS_ = 0x27, //Inactive_PS\n\tH2C_8723B_FWLPS_IN_IPS_ = 0x28,\n\t\n\t//Dynamic Mechanism Class: 010\n\tH2C_8723B_MACID_CFG = 0x40,\t\n\tH2C_8723B_TXBF = 0x41,\t\n\tH2C_8723B_RSSI_SETTING = 0x42,\t\n\tH2C_8723B_AP_REQ_TXRPT = 0x43,\t\n\tH2C_8723B_INIT_RATE_COLLECT = 0x44,\t\n\tH2C_8723B_RA_PARA_ADJUST = 0x46,\n\t\n\t//BT Class: 011\n\tH2C_8723B_B_TYPE_TDMA = 0x60,\n\tH2C_8723B_BT_INFO = 0x61,\n\tH2C_8723B_FORCE_BT_TXPWR = 0x62,\n\tH2C_8723B_BT_IGNORE_WLANACT = 0x63,\n\tH2C_8723B_DAC_SWING_VALUE = 0x64,\n\tH2C_8723B_ANT_SEL_RSV = 0x65,\n\tH2C_8723B_WL_OPMODE = 0x66,\n\tH2C_8723B_BT_MP_OPER = 0x67,\n\tH2C_8723B_BT_CONTROL = 0x68,\n\tH2C_8723B_BT_WIFI_CTRL = 0x69,\n\tH2C_8723B_BT_FW_PATCH = 0x6A,\n\tH2C_8723B_BT_WLAN_CALIBRATION = 0x6D,\t\n\t\n\t//WOWLAN Class: 100\n\tH2C_8723B_WOWLAN = 0x80,\n\tH2C_8723B_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_8723B_AOAC_GLOBAL_INFO = 0x82,\t\n\tH2C_8723B_AOAC_RSVD_PAGE = 0x83,\t\n\tH2C_8723B_AOAC_RSVD_PAGE2 = 0x84,\n\tH2C_8723B_D0_SCAN_OFFLOAD_CTRL = 0x85,\n\tH2C_8723B_D0_SCAN_OFFLOAD_INFO = 0x86,\n\tH2C_8723B_CHNL_SWITCH_OFFLOAD = 0x87,\n\tH2C_8723B_P2P_OFFLOAD_RSVD_PAGE = 0x8A,\t\n\tH2C_8723B_P2P_OFFLOAD = 0x8B,\n\n\tH2C_8723B_RESET_TSF = 0xC0,\n\tH2C_8723B_MAXID,\n};\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    H2C CMD CONTENT    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n//_RSVDPAGE_LOC_CMD_0x00\n#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD_0x01\n#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_KEEP_ALIVE_CMD_0x03\n#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n\n//_DISCONNECT_DECISION_CMD_0x04\n#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n// _PWR_MOD_CMD_0x20\n#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n\n#define GET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n// _PS_TUNE_PARAM_CMD_0x21\n#define SET_8723B_H2CCMD_PSTUNE_PARM_BCN_TO_LIMIT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8723B_H2CCMD_PSTUNE_PARM_ADOPT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 1, __Value)\n#define SET_8723B_H2CCMD_PSTUNE_PARM_PS_TIMEOUT(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 1, 7, __Value)\n#define SET_8723B_H2CCMD_PSTUNE_PARM_DTIM_PERIOD(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n//_MACID_CFG_CMD_0x40\n#define SET_8723B_H2CCMD_MACID_CFG_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_RAID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 5, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_SGI_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 7, 1, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_BW(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 2, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_NO_UPDATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 3, 1, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_VHT_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 4, 2, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_DISPT(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 6, 1, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_DISRA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 7, 1, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK0(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+5, 0, 8, __Value)\n#define SET_8723B_H2CCMD_MACID_CFG_RATE_MASK3(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+6, 0, 8, __Value)\n\n//_RSSI_SETTING_CMD_0x42\n#define SET_8723B_H2CCMD_RSSI_SETTING_MACID(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_RSSI_SETTING_RSSI(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 7, __Value)\n#define SET_8723B_H2CCMD_RSSI_SETTING_ULDL_STATE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n\n// _AP_REQ_TXRPT_CMD_0x43\n#define SET_8723B_H2CCMD_APREQRPT_PARM_MACID1(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8723B_H2CCMD_APREQRPT_PARM_MACID2(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n\n// _FORCE_BT_TXPWR_CMD_0x62\n#define SET_8723B_H2CCMD_BT_PWR_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n\n// _FORCE_BT_MP_OPER_CMD_0x67\n#define SET_8723B_H2CCMD_BT_MPOPER_VER(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 4, __Value)\n#define SET_8723B_H2CCMD_BT_MPOPER_REQNUM(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 4, __Value)\n#define SET_8723B_H2CCMD_BT_MPOPER_IDX(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8723B_H2CCMD_BT_MPOPER_PARAM1(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)\n#define SET_8723B_H2CCMD_BT_MPOPER_PARAM2(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+3, 0, 8, __Value)\n#define SET_8723B_H2CCMD_BT_MPOPER_PARAM3(__pH2CCmd, __Value)\t\t\t\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+4, 0, 8, __Value)\n\n// _BT_FW_PATCH_0x6A\n#define SET_8723B_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value)\n#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR0(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) \n#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR1(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) \n#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR2(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) \n#define SET_8723B_H2CCMD_BT_FW_PATCH_ADDR3(__pH2CCmd, __Value) \t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)\n\n//---------------------------------------------------------------------------------------------------------//\n//-------------------------------------------    Structure    --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n\n//---------------------------------------------------------------------------------------------------------//\n//----------------------------------    Function Statement     --------------------------------------------------//\n//---------------------------------------------------------------------------------------------------------//\n\n// host message to firmware cmd\nvoid rtl8723b_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode);\nvoid rtl8723b_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus);\nvoid rtl8723b_set_rssi_cmd(PADAPTER padapter, u8 *param);\nvoid rtl8723b_Add_RateATid(PADAPTER pAdapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\nvoid rtl8723b_fw_try_ap_cmd(PADAPTER padapter, u32 need_ack);\n//s32 rtl8723b_set_lowpwr_lps_cmd(PADAPTER padapter, u8 enable);\nvoid rtl8723b_set_FwPsTuneParam_cmd(PADAPTER padapter);\nvoid rtl8723b_set_FwMacIdConfig_cmd(_adapter* padapter, u8 mac_id, u8 raid, u8 bw, u8 sgi, u32 mask);\nvoid rtl8723b_set_FwMediaStatusRpt_cmd(PADAPTER\tpadapter, u8 mstatus, u8 macid);\nvoid rtl8723b_set_FwBtMpOper_cmd(PADAPTER padapter, u8 idx, u8 ver, u8 reqnum, u8 *param);\nvoid rtl8723b_download_rsvd_page(PADAPTER padapter, u8 mstatus);\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8723b_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);\n#endif // CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P\nvoid rtl8723b_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid SetFwRelatedForWoWLAN8723b(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif//CONFIG_WOWLAN\n\n#ifdef CONFIG_P2P_WOWLAN\nvoid rtl8723b_set_p2p_wowlan_offload_cmd(PADAPTER padapter);\n#endif\n\nvoid rtl8723b_set_FwPwrModeInIPS_cmd(PADAPTER padapter, u8 cmd_param);\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\nu8 rtl8723b_reset_tsf(_adapter *padapter, u8 reset_port);\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\ns32 FillH2CCmd8723B(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nu8 GetTxBufferRsvdPageNum8723B(_adapter *padapter, bool wowlan);\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_DM_H__\n#define __RTL8723B_DM_H__\n//============================================================\n// Description:\n//\n// This file is for 8723B dynamic mechanism only\n//\n//\n//============================================================\n\n//============================================================\n// structure and define\n//============================================================\n\n//============================================================\n// function prototype\n//============================================================\n\nvoid rtl8723b_init_dm_priv(PADAPTER padapter);\nvoid rtl8723b_deinit_dm_priv(PADAPTER padapter);\n\nvoid rtl8723b_InitHalDm(PADAPTER padapter);\nvoid rtl8723b_HalDmWatchDog(PADAPTER padapter);\nvoid rtl8723b_HalDmWatchDog_in_LPS(PADAPTER padapter);\nvoid rtl8723b_hal_dm_in_lps(PADAPTER padapter);\n\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_HAL_H__\n#define __RTL8723B_HAL_H__\n\n#include \"hal_data.h\"\n\n#include \"rtl8723b_spec.h\"\n#include \"rtl8723b_rf.h\"\n#include \"rtl8723b_dm.h\"\n#include \"rtl8723b_recv.h\"\n#include \"rtl8723b_xmit.h\"\n#include \"rtl8723b_cmd.h\"\n#include \"rtl8723b_led.h\"\n#include \"Hal8723BPwrSeq.h\"\n#include \"Hal8723BPhyReg.h\"\n#include \"Hal8723BPhyCfg.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8723b_sreset.h\"\n#endif\n\n\n//---------------------------------------------------------------------\n//\t\tRTL8723B From file\n//---------------------------------------------------------------------\n\t#define RTL8723B_FW_IMG\t\t\t\t\t\"rtl8723b/FW_NIC.bin\"\n\t#define RTL8723B_FW_WW_IMG\t\t\t\t\"rtl8723b/FW_WoWLAN.bin\"\n\t#define RTL8723B_PHY_REG\t\t\t\t\t\"rtl8723b/PHY_REG.txt\"\n\t#define RTL8723B_PHY_RADIO_A\t\t\t\t\"rtl8723b/RadioA.txt\"\n\t#define RTL8723B_PHY_RADIO_B\t\t\t\t\"rtl8723b/RadioB.txt\"\n\t#define RTL8723B_TXPWR_TRACK\t\t\t\t\"rtl8723b/TxPowerTrack.txt\" \n\t#define RTL8723B_AGC_TAB\t\t\t\t\t\"rtl8723b/AGC_TAB.txt\"\n\t#define RTL8723B_PHY_MACREG \t\t\t\t\"rtl8723b/MAC_REG.txt\"\n\t#define RTL8723B_PHY_REG_PG\t\t\t\t\"rtl8723b/PHY_REG_PG.txt\"\n\t#define RTL8723B_PHY_REG_MP\t\t\t\t\"rtl8723b/PHY_REG_MP.txt\"\n\t#define RTL8723B_TXPWR_LMT \t\t\t\t\"rtl8723b/TXPWR_LMT.txt\"\n\n//---------------------------------------------------------------------\n//\t\tRTL8723B From header\n//---------------------------------------------------------------------\n\n#if MP_DRIVER == 1\n\t#define Rtl8723B_FwBTImgArray\t\t\t\tRtl8723BFwBTImgArray\n\t#define Rtl8723B_FwBTImgArrayLength\t\tRtl8723BFwBTImgArrayLength\n\n\t#define Rtl8723B_PHY_REG_Array_MP\t\t\tRtl8723B_PHYREG_Array_MP\n\t#define Rtl8723B_PHY_REG_Array_MPLength\tRtl8723B_PHYREG_Array_MPLength\n#endif\n\n\n#define FW_8723B_SIZE\t\t\t0x8000\n#define FW_8723B_START_ADDRESS\t0x1000\n#define FW_8723B_END_ADDRESS\t\t0x1FFF //0x5FFF\n\n#define IS_FW_HEADER_EXIST_8723B(_pFwHdr)\t((le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x5300)\n\ntypedef struct _RT_FIRMWARE {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_8723B_SIZE];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8723B, *PRT_FIRMWARE_8723B;\n\n//\n// This structure must be cared byte-ordering\n//\n// Added by tynli. 2009.12.04.\ntypedef struct _RT_8723B_FIRMWARE_HDR\n{\n\t// 8-byte alinment required\n\n\t//--- LONG WORD 0 ----\n\tu16\t\tSignature;\t// 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n\tu8\t\tCategory;\t// AP/NIC and USB/PCI\n\tu8\t\tFunction;\t// Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n\tu16\t\tVersion;\t\t// FW Version\n\tu16\t\tSubversion;\t// FW Subversion, default 0x00\n\n\t//--- LONG WORD 1 ----\n\tu8\t\tMonth;\t// Release time Month field\n\tu8\t\tDate;\t// Release time Date field\n\tu8\t\tHour;\t// Release time Hour field\n\tu8\t\tMinute;\t// Release time Minute field\n\tu16\t\tRamCodeSize;\t// The size of RAM code\n\tu16\t\tRsvd2;\n\n\t//--- LONG WORD 2 ----\n\tu32\t\tSvnIdx;\t// The SVN entry index\n\tu32\t\tRsvd3;\n\n\t//--- LONG WORD 3 ----\n\tu32\t\tRsvd4;\n\tu32\t\tRsvd5;\n}RT_8723B_FIRMWARE_HDR, *PRT_8723B_FIRMWARE_HDR;\n\n#define DRIVER_EARLY_INT_TIME_8723B\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8723B\t\t0x02\n\n// for 8723B\n// TX 32K, RX 16K, Page size 128B for TX, 8B for RX\n#define PAGE_SIZE_TX_8723B\t\t\t128\n#define PAGE_SIZE_RX_8723B\t\t\t8\n\n#define TX_DMA_SIZE_8723B\t\t\t0x8000\t/* 32K(TX) */\n#define RX_DMA_SIZE_8723B\t\t\t0x4000\t/* 16K(RX) */\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8723B\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8723B\t0x80\t// 128B, reserved for tx report\n#endif\n#define RX_DMA_BOUNDARY_8723B\t\t(RX_DMA_SIZE_8723B - RX_DMA_RESERVED_SIZE_8723B - 1)\n\n\n// Note: We will divide number of page equally for each queue other than public queue!\n\n//For General Reserved Page Number(Beacon Queue is reserved page)\n//Beacon:2, PS-Poll:1, Null Data:1,Qos Null Data:1,BT Qos Null Data:1\n#define BCNQ_PAGE_NUM_8723B\t\t0x08\n#ifdef CONFIG_CONCURRENT_MODE\n#define BCNQ1_PAGE_NUM_8723B\t\t0x08 // 0x04\n#else\n#define BCNQ1_PAGE_NUM_8723B\t\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef BCNQ1_PAGE_NUM_8723B\n#define BCNQ1_PAGE_NUM_8723B\t\t0x00 // 0x04\n#endif\n\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:2,GTK EXT MEM:2, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8723B\t0x07\n#else\n#define WOWLAN_PAGE_NUM_8723B\t0x00\n#endif\n\n#ifdef CONFIG_PNO_SUPPORT\n#undef WOWLAN_PAGE_NUM_8723B\n#define WOWLAN_PAGE_NUM_8723B\t0x15\n#endif\n\n#ifdef CONFIG_AP_WOWLAN\n#define AP_WOWLAN_PAGE_NUM_8723B\t0x02\n#endif\n\n#define TX_TOTAL_PAGE_NUMBER_8723B\t(0xFF - BCNQ_PAGE_NUM_8723B - BCNQ1_PAGE_NUM_8723B - WOWLAN_PAGE_NUM_8723B)\n#define TX_PAGE_BOUNDARY_8723B\t\t(TX_TOTAL_PAGE_NUMBER_8723B + 1)\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723B\tTX_TOTAL_PAGE_NUMBER_8723B\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8723B\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8723B + 1)\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8723B\n#define NORMAL_PAGE_NUM_HPQ_8723B\t\t0x0C\n#define NORMAL_PAGE_NUM_LPQ_8723B\t\t0x02\n#define NORMAL_PAGE_NUM_NPQ_8723B\t\t0x02\n\n// Note: For Normal Chip Setting, modify later\n#define WMM_NORMAL_PAGE_NUM_HPQ_8723B\t\t0x30\n#define WMM_NORMAL_PAGE_NUM_LPQ_8723B\t\t0x20\n#define WMM_NORMAL_PAGE_NUM_NPQ_8723B\t\t0x20\n\n\n#include \"HalVerDef.h\"\n#include \"hal_com.h\"\n\n#define EFUSE_OOB_PROTECT_BYTES \t\t15\n\n#define HAL_EFUSE_MEMORY\n\n#define HWSET_MAX_SIZE_8723B\t\t\t512\n#define EFUSE_REAL_CONTENT_LEN_8723B\t\t512\n#define EFUSE_MAP_LEN_8723B\t\t\t\t512\n#define EFUSE_MAX_SECTION_8723B\t\t\t64\n\n#define EFUSE_IC_ID_OFFSET\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_8723B)\n\n#define EFUSE_ACCESS_ON\t\t\t0x69\t// For RTL8723 only.\n#define EFUSE_ACCESS_OFF\t\t\t0x00\t// For RTL8723 only.\n\n//========================================================\n//\t\t\tEFUSE for BT definition\n//========================================================\n#define EFUSE_BT_REAL_BANK_CONTENT_LEN\t512\n#define EFUSE_BT_REAL_CONTENT_LEN\t\t1536\t// 512*3\n#define EFUSE_BT_MAP_LEN\t\t\t\t1024\t// 1k bytes\n#define EFUSE_BT_MAX_SECTION\t\t\t128\t\t// 1024/8\n\n#define EFUSE_PROTECT_BYTES_BANK\t\t16\n\ntypedef struct _C2H_EVT_HDR\n{\n\tu8\tCmdID;\n\tu8\tCmdLen;\n\tu8\tCmdSeq;\n} __attribute__((__packed__)) C2H_EVT_HDR, *PC2H_EVT_HDR;\n\ntypedef enum tag_Package_Definition\n{\n    PACKAGE_DEFAULT,\n    PACKAGE_QFN68,\n    PACKAGE_TFBGA90,\n    PACKAGE_TFBGA80,\n    PACKAGE_TFBGA79\n}PACKAGE_TYPE_E;\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n// rtl8723a_hal_init.c\ns32 rtl8723b_FirmwareDownload(PADAPTER padapter, BOOLEAN  bUsedWoWLANFw);\nvoid rtl8723b_FirmwareSelfReset(PADAPTER padapter);\nvoid rtl8723b_InitializeFirmwareVars(PADAPTER padapter);\n\nvoid rtl8723b_InitAntenna_Selection(PADAPTER padapter);\nvoid rtl8723b_DeinitAntenna_Selection(PADAPTER padapter);\nvoid rtl8723b_CheckAntenna_Selection(PADAPTER padapter);\nvoid rtl8723b_init_default_value(PADAPTER padapter);\n\ns32 rtl8723b_InitLLTTable(PADAPTER padapter);\n\ns32 CardDisableHWSM(PADAPTER padapter, u8 resetMCU);\ns32 CardDisableWithoutHWSM(PADAPTER padapter);\n\n// EFuse\nu8 GetEEPROMSize8723B(PADAPTER padapter);\nvoid Hal_InitPGData(PADAPTER padapter, u8 *PROMContent);\nvoid Hal_EfuseParseIDCode(PADAPTER padapter, u8 *hwinfo);\nvoid Hal_EfuseParseTxPowerInfo_8723B(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseBTCoexistInfo_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseEEPROMVer_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseChnlPlan_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseCustomerID_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseAntennaDiversity_8723B(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid Hal_EfuseParseXtal_8723B(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail);\nvoid Hal_EfuseParseThermalMeter_8723B(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail);\nVOID Hal_EfuseParsePackageType_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\nVOID Hal_EfuseParseVoltage_8723B(PADAPTER pAdapter,u8* hwinfo,BOOLEAN \tAutoLoadFail); \nVOID Hal_EfuseParseBoardType_8723B(PADAPTER Adapter,\tu8*\tPROMContent,BOOLEAN AutoloadFail);\n\n#ifdef CONFIG_C2H_PACKET_EN\nvoid rtl8723b_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length);\n#endif\n\n\nvoid rtl8723b_set_hal_ops(struct hal_ops *pHalFunc);\nvoid SetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val);\nvoid GetHwReg8723B(PADAPTER padapter, u8 variable, u8 *val);\n#ifdef CONFIG_C2H_PACKET_EN\nvoid SetHwRegWithBuf8723B(PADAPTER padapter, u8 variable, u8 *pbuf, int len);\n#endif // CONFIG_C2H_PACKET_EN\nu8 SetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\nu8 GetHalDefVar8723B(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\n\n// register\nvoid rtl8723b_InitBeaconParameters(PADAPTER padapter);\nvoid rtl8723b_InitBeaconMaxError(PADAPTER padapter, u8 InfraMode);\nvoid\t_InitBurstPktLen_8723BS(PADAPTER Adapter);\nvoid _8051Reset8723(PADAPTER padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\nvoid rtl8723b_start_thread(_adapter *padapter);\nvoid rtl8723b_stop_thread(_adapter *padapter);\n\n#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)\nvoid rtl8723bs_init_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8723bs_free_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8723bs_cancle_checkbthang_workqueue(_adapter * adapter);\nvoid rtl8723bs_hal_check_bt_hang(_adapter * adapter);\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nvoid HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue);\n#endif\n\nint FirmwareDownloadBT(IN PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\n\nvoid CCX_FwC2HTxRpt_8723b(PADAPTER padapter, u8 *pdata, u8 len);\ns32 c2h_id_filter_ccx_8723b(u8 *buf);\ns32 c2h_handler_8723b(PADAPTER padapter, u8 *pC2hEvent);\nu8 MRateToHwRate8723B(u8  rate);\nu8 HwRateToMRate8723B(u8\t rate);\n\n#ifdef CONFIG_RF_GAIN_OFFSET\nvoid Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);\n#endif //CONFIG_RF_GAIN_OFFSET\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8723BE(PADAPTER Adapter);\nVOID\tUpdateInterruptMask8723BE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_LED_H__\n#define __RTL8723B_LED_H__\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8723bu_InitSwLeds(PADAPTER padapter);\nvoid rtl8723bu_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8723bs_InitSwLeds(PADAPTER padapter);\nvoid rtl8723bs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_GSPI_HCI\nvoid rtl8723bs_InitSwLeds(PADAPTER padapter);\nvoid rtl8723bs_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8723be_InitSwLeds(PADAPTER padapter);\nvoid rtl8723be_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_RECV_H__\n#define __RTL8723B_RECV_H__\n\n#define RECV_BLK_SZ 512\n#define RECV_BLK_CNT 16\n#define RECV_BLK_TH RECV_BLK_CNT\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t//#define MAX_RECVBUF_SZ (32768) // 32k\n\t\t//#define MAX_RECVBUF_SZ (16384) //16K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K\n\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t#define MAX_RECVBUF_SZ (8192) // 8K\n\t\t#else\n\t\t        #define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t#else\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\n#define MAX_RECVBUF_SZ (10240)\n\n#endif\n\n// Rx smooth factor\n#define\tRx_Smooth_Factor (20)\n\n#ifdef CONFIG_SDIO_HCI\n#ifndef CONFIG_SDIO_RX_COPY\n#undef MAX_RECVBUF_SZ\n#define MAX_RECVBUF_SZ\t(RX_DMA_SIZE_8723B - RX_DMA_RESERVED_SIZE_8723B)\n#endif // !CONFIG_SDIO_RX_COPY\n#endif // CONFIG_SDIO_HCI\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8723bs_init_recv_priv(PADAPTER padapter);\nvoid rtl8723bs_free_recv_priv(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_USB_HCI\nint rtl8723bu_init_recv_priv(_adapter *padapter);\nvoid rtl8723bu_free_recv_priv (_adapter *padapter);\nvoid rtl8723bu_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8723be_init_recv_priv(PADAPTER padapter);\nvoid rtl8723be_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8723b_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8723B_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8723b_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_RF_H__\n#define __RTL8723B_RF_H__\n\nint\tPHY_RF6052_Config8723B(\tIN\tPADAPTER\t\tAdapter\t);\n\nVOID\nPHY_RF6052SetBandwidth8723B(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8723B_SPEC_H__\n#define __RTL8723B_SPEC_H__\n\n#include <drv_conf.h>\n\n\n#define HAL_NAV_UPPER_UNIT_8723B\t\t128\t\t// micro-second\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_RSV_CTRL_8723B\t\t\t\t0x001C\t// 3 Byte\n#define REG_BT_WIFI_ANTENNA_SWITCH_8723B\t0x0038\n#define REG_HSISR_8723B\t\t\t\t\t0x005c\n#define REG_PAD_CTRL1_8723B\t\t0x0064\n#define REG_AFE_CTRL_4_8723B\t\t0x0078\n#define REG_HMEBOX_DBG_0_8723B\t0x0088\n#define REG_HMEBOX_DBG_1_8723B\t0x008A\n#define REG_HMEBOX_DBG_2_8723B\t0x008C\n#define REG_HMEBOX_DBG_3_8723B\t0x008E\n#define REG_HIMR0_8723B\t\t\t\t\t0x00B0\n#define REG_HISR0_8723B\t\t\t\t\t0x00B4\n#define REG_HIMR1_8723B\t\t\t\t\t0x00B8\n#define REG_HISR1_8723B\t\t\t\t\t0x00BC\n#define REG_PMC_DBG_CTRL2_8723B\t\t\t0x00CC\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_C2HEVT_CMD_ID_8723B\t0x01A0\n#define REG_C2HEVT_CMD_LEN_8723B\t0x01AE\n#define REG_WOWLAN_WAKE_REASON 0x01C7\n#define REG_WOWLAN_GTK_DBG1\t0x630\n#define REG_WOWLAN_GTK_DBG2\t0x634\n\n#define REG_HMEBOX_EXT0_8723B\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8723B\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8723B\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8723B\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_CONTROL_8723B\t\t0x0286 // Control the RX DMA.\n#define REG_RXDMA_MODE_CTRL_8723B\t\t0x0290\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8723B\t\t0x0300\n#define\tREG_INT_MIG_8723B\t\t\t\t0x0304\t// Interrupt Migration \n#define\tREG_BCNQ_DESA_8723B\t\t\t0x0308\t// TX Beacon Descriptor Address\n#define\tREG_HQ_DESA_8723B\t\t\t\t0x0310\t// TX High Queue Descriptor Address\n#define\tREG_MGQ_DESA_8723B\t\t\t0x0318\t// TX Manage Queue Descriptor Address\n#define\tREG_VOQ_DESA_8723B\t\t\t0x0320\t// TX VO Queue Descriptor Address\n#define\tREG_VIQ_DESA_8723B\t\t\t\t0x0328\t// TX VI Queue Descriptor Address\n#define\tREG_BEQ_DESA_8723B\t\t\t0x0330\t// TX BE Queue Descriptor Address\n#define\tREG_BKQ_DESA_8723B\t\t\t0x0338\t// TX BK Queue Descriptor Address\n#define\tREG_RX_DESA_8723B\t\t\t\t0x0340\t// RX Queue\tDescriptor Address\n#define\tREG_DBI_WDATA_8723B\t\t\t0x0348\t// DBI Write Data\n#define\tREG_DBI_RDATA_8723B\t\t\t0x034C\t// DBI Read Data\n#define\tREG_DBI_ADDR_8723B\t\t\t\t0x0350\t// DBI Address\n#define\tREG_DBI_FLAG_8723B\t\t\t\t0x0352\t// DBI Read/Write Flag\n#define\tREG_MDIO_WDATA_8723B\t\t0x0354\t// MDIO for Write PCIE PHY\n#define\tREG_MDIO_RDATA_8723B\t\t\t0x0356\t// MDIO for Reads PCIE PHY\n#define\tREG_MDIO_CTL_8723B\t\t\t0x0358\t// MDIO for Control\n#define\tREG_DBG_SEL_8723B\t\t\t\t0x0360\t// Debug Selection Register\n#define\tREG_PCIE_HRPWM_8723B\t\t\t0x0361\t//PCIe RPWM\n#define\tREG_PCIE_HCPWM_8723B\t\t\t0x0363\t//PCIe CPWM\n#define\tREG_PCIE_MULTIFET_CTRL_8723B\t0x036A\t//PCIE Multi-Fethc Control\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_TXPKTBUF_BCNQ_BDNY_8723B\t0x0424\n#define REG_TXPKTBUF_MGQ_BDNY_8723B\t0x0425\n#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B\t0x045D\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x0484\n#define REG_TXPKTBUF_IV_HIGH            0x0488\n#endif\n#define REG_AMPDU_BURST_MODE_8723B\t0x04BC\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_SECONDARY_CCA_CTRL_8723B\t0x0577\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n\n\n//============================================================\n// SDIO Bus Specification\n//============================================================\n\n//-----------------------------------------------------\n// SDIO CMD Address Mapping\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// I/O bus domain (Host)\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// SDIO register\n//-----------------------------------------------------\n#define SDIO_REG_HCPWM1_8723B\t0x025 // HCI Current Power Mode 1\n\n\n//============================================================================\n//\t8723 Regsiter Bit and Content definition\n//============================================================================\n\n//2 HSISR\n// interrupt mask which needs to clear\n#define MASK_HSISR_CLEAR\t\t(HSISR_GPIO12_0_INT |\\\n\t\t\t\t\t\t\t\tHSISR_SPS_OCP_INT |\\\n\t\t\t\t\t\t\t\tHSISR_RON_INT |\\\n\t\t\t\t\t\t\t\tHSISR_PDNINT |\\\n\t\t\t\t\t\t\t\tHSISR_GPIO9_INT)\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#undef IS_E_CUT\n#define IS_E_CUT(version)\t\tFALSE\n#undef IS_F_CUT\n#define IS_F_CUT(version)\t\t((GET_CVID_CUT_VERSION(version) == E_CUT_VERSION) ? TRUE : FALSE)\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define BIT_USB_RXDMA_AGG_EN\tBIT(31)\n#define RXDMA_AGG_MODE_EN\t\tBIT(1)\n\n#ifdef CONFIG_WOWLAN\n#define RXPKT_RELEASE_POLL\t\tBIT(16)\n#define RXDMA_IDLE\t\t\t\tBIT(17)\n#define RW_RELEASE_EN\t\t\tBIT(18)\n#endif\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n\n//----------------------------------------------------------------------------\n//       8723B REG_CCK_CHECK\t\t\t\t\t\t(offset 0x454)\n//----------------------------------------------------------------------------\n#define BIT_BCN_PORT_SEL\t\tBIT5\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#ifdef CONFIG_RF_GAIN_OFFSET\n\n#ifdef CONFIG_RTL8723B\n#define EEPROM_RF_GAIN_OFFSET\t\t\t0xC1\n#endif\n\n#define EEPROM_RF_GAIN_VAL\t\t\t\t0x1F6\n#endif //CONFIG_RF_GAIN_OFFSET\n\n\n//----------------------------------------------------------------------------\n//       8195 IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8723B\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8723B\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8723B\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8723B\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8723B\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8723B\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8723B\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8723B\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8723B\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8723B\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8723B\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8723B\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8723B\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8723B\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8723B\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8723B\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8723B\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8723B\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8723B\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8723B\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8723B\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8723B\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8723B\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8723B\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8723B\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_BCNDMAINT7_8723B\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8723B\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8723B\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8723B\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8723B\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8723B\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8723B\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8723B\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8723B\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8723B\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8723B\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8723B\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8723B\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8723B\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8723B\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8723B\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8723B\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8723B\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8723B\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n#ifdef CONFIG_PCI_HCI\n//#define IMR_RX_MASK\t\t(IMR_ROK_8723B|IMR_RDU_8723B|IMR_RXFOVW_8723B)\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_8723B|IMR_VIDOK_8723B|IMR_BEDOK_8723B|IMR_BKDOK_8723B|IMR_MGNTDOK_8723B|IMR_HIGHDOK_8723B)\n\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_8723B | IMR_TXBCN0OK_8723B | IMR_TXBCN0ERR_8723B | IMR_BCNDERR0_8723B)\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_8723B | IMR_VODOK_8723B | IMR_BEDOK_8723B|IMR_BKDOK_8723B)\n#endif\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8723B 128\n#define SEC_CAM_ENT_NUM_8723B 64\n#define NSS_NUM_8723B 1\n#define BAND_CAP_8723B (BAND_CAP_2G)\n#define BW_CAP_8723B (BW_CAP_20M | BW_CAP_40M)\n\n#endif /* __RTL8723B_SPEC_H__ */\n\n"
  },
  {
    "path": "include/rtl8723b_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL8723B_SRESET_H_\n#define _RTL8723B_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8723b_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8723b_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8723b_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8723B_XMIT_H__\n#define __RTL8723B_XMIT_H__\n\n\n#define MAX_TID (15)\n\n\n#ifndef __INC_HAL8723BDESC_H\n#define __INC_HAL8723BDESC_H\n\n#define RX_STATUS_DESC_SIZE_8723B\t\t24\n#define RX_DRV_INFO_SIZE_UNIT_8723B 8\n\n\n//DWORD 0\n#define SET_RX_STATUS_DESC_PKT_LEN_8723B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_8723B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_8723B(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n#define GET_RX_STATUS_DESC_PKT_LEN_8723B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICV_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8723B(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_8723B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_8723B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_LAST_SEG_8723B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1)\n#define GET_RX_STATUS_DESC_FIRST_SEG_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1)\n#define GET_RX_STATUS_DESC_EOR_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_OWN_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_8723B(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_TID_8723B(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_AMSDU_8723B(__pRxDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_8723B(__pRxDesc)\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_8723B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_A1_FIT_8723B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4)\n#define GET_RX_STATUS_DESC_CHKERR_8723B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_IPVER_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_IS_TCPUDP__8723B(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_CHK_VLD_8723B(__pRxDesc) \tLE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_8723B(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_8723B(__pRxDesc) \t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_MC_8723B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_8723B(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_8723B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#define GET_RX_STATUS_DESC_RX_IS_QOS_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8723B(__pRxStatusDesc) \tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_RPT_SEL_8723B(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_HTC_8723B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_8723B(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_8723B(__pRxStatusDesc) \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#ifdef CONFIG_USB_RX_AGGREGATION\n#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8723B(__pRxStatusDesc)\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)\n#endif\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_MATCH_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_MATCH_8723B(__pRxDesc) \t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1)\n\n//DWORD 6\n#define GET_RX_STATUS_DESC_SPLCP_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1)\n#define GET_RX_STATUS_DESC_LDPC_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1)\n#define GET_RX_STATUS_DESC_STBC_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1)\n#define GET_RX_STATUS_DESC_BW_8723B(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2)\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_8723B(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n#define GET_RX_STATUS_DESC_BUFF_ADDR_8723B(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\n#define GET_RX_STATUS_DESC_BUFF_ADDR64_8723B(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\n\n#define SET_RX_STATUS_DESC_BUFF_ADDR_8723B(__pRxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\n\n\n// Dword 0\n#define GET_TX_DESC_OWN_8723B(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n\n#define SET_TX_DESC_PKT_SIZE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define SET_TX_DESC_OFFSET_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define SET_TX_DESC_BMC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_FIRST_SEG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_LINIP_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_NO_ACM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_OWN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n\n// Dword 1\n#define SET_TX_DESC_MACID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n\n\n// Dword 2\n#define SET_TX_DESC_PAID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_AGG_BREAK_8723B(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define SET_TX_DESC_RAW_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define SET_TX_DESC_SPE_RPT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_INT_8723B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_8723B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)\n#define SET_TX_DESC_CHK_EN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)\n#define SET_TX_DESC_EARLY_MODE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HWSEQ_SEL_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_8723B(__pTxDesc, __Value)\tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_CTROL_STBC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_MBSSID_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n#define SET_TX_DESC_ANTSEL_A_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANTSEL_C_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\n#define SET_TX_DESC_ANTSEL_D_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)\n\n// Dword 7\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n#define SET_TX_DESC_TX_BUFFER_SIZE_8723B(__pTxDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#else\n#define SET_TX_DESC_TX_DESC_CHECKSUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#endif\n#define SET_TX_DESC_USB_TXAGG_NUM_8723B(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)\n#if(DEV_BUS_TYPE == RT_SDIO_INTERFACE)\n#define SET_TX_DESC_SDIO_TXSEQ_8723B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)\n#endif\n\n// Dword 8\n#define SET_TX_DESC_HWSEQ_EN_8723B(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n\n// Dword 9\n#define SET_TX_DESC_SEQ_8723B(__pTxDesc, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n\n// Dword 10\n#define SET_TX_DESC_TX_BUFFER_ADDRESS_8723B(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\n#define GET_TX_DESC_TX_BUFFER_ADDRESS_8723B(__pTxDesc) \tLE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)\n\n// Dword 11\n#define SET_TX_DESC_NEXT_DESC_ADDRESS_8723B(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\n\n\n#define SET_EARLYMODE_PKTNUM_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,\t__Value)\n#define SET_EARLYMODE_LEN3_8723B(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\n#endif\n//-----------------------------------------------------------\n//\n//\tRate\n//\n//-----------------------------------------------------------\n// CCK Rates, TxHT = 0\n#define DESC8723B_RATE1M\t\t\t\t0x00\n#define DESC8723B_RATE2M\t\t\t\t0x01\n#define DESC8723B_RATE5_5M\t\t\t\t0x02\n#define DESC8723B_RATE11M\t\t\t\t0x03\n\n// OFDM Rates, TxHT = 0\n#define DESC8723B_RATE6M\t\t\t\t0x04\n#define DESC8723B_RATE9M\t\t\t\t0x05\n#define DESC8723B_RATE12M\t\t\t\t0x06\n#define DESC8723B_RATE18M\t\t\t\t0x07\n#define DESC8723B_RATE24M\t\t\t\t0x08\n#define DESC8723B_RATE36M\t\t\t\t0x09\n#define DESC8723B_RATE48M\t\t\t\t0x0a\n#define DESC8723B_RATE54M\t\t\t\t0x0b\n\n// MCS Rates, TxHT = 1\n#define DESC8723B_RATEMCS0\t\t\t\t0x0c\n#define DESC8723B_RATEMCS1\t\t\t\t0x0d\n#define DESC8723B_RATEMCS2\t\t\t\t0x0e\n#define DESC8723B_RATEMCS3\t\t\t\t0x0f\n#define DESC8723B_RATEMCS4\t\t\t\t0x10\n#define DESC8723B_RATEMCS5\t\t\t\t0x11\n#define DESC8723B_RATEMCS6\t\t\t\t0x12\n#define DESC8723B_RATEMCS7\t\t\t\t0x13\n#define DESC8723B_RATEMCS8\t\t\t\t0x14\n#define DESC8723B_RATEMCS9\t\t\t\t0x15\n#define DESC8723B_RATEMCS10 \t\t0x16\n#define DESC8723B_RATEMCS11 \t\t0x17\n#define DESC8723B_RATEMCS12 \t\t0x18\n#define DESC8723B_RATEMCS13 \t\t0x19\n#define DESC8723B_RATEMCS14 \t\t0x1a\n#define DESC8723B_RATEMCS15 \t\t0x1b\n#define DESC8723B_RATEVHTSS1MCS0\t\t0x2c\n#define DESC8723B_RATEVHTSS1MCS1\t\t0x2d\n#define DESC8723B_RATEVHTSS1MCS2\t\t0x2e\n#define DESC8723B_RATEVHTSS1MCS3\t\t0x2f\n#define DESC8723B_RATEVHTSS1MCS4\t\t0x30\n#define DESC8723B_RATEVHTSS1MCS5\t\t0x31\n#define DESC8723B_RATEVHTSS1MCS6\t\t0x32\n#define DESC8723B_RATEVHTSS1MCS7\t\t0x33\n#define DESC8723B_RATEVHTSS1MCS8\t\t0x34\n#define DESC8723B_RATEVHTSS1MCS9\t\t0x35\n#define DESC8723B_RATEVHTSS2MCS0\t\t0x36\n#define DESC8723B_RATEVHTSS2MCS1\t\t0x37\n#define DESC8723B_RATEVHTSS2MCS2\t\t0x38\n#define DESC8723B_RATEVHTSS2MCS3\t\t0x39\n#define DESC8723B_RATEVHTSS2MCS4\t\t0x3a\n#define DESC8723B_RATEVHTSS2MCS5\t\t0x3b\n#define DESC8723B_RATEVHTSS2MCS6\t\t0x3c\n#define DESC8723B_RATEVHTSS2MCS7\t\t0x3d\n#define DESC8723B_RATEVHTSS2MCS8\t\t0x3e\n#define DESC8723B_RATEVHTSS2MCS9\t\t0x3f\n\n\n#define \tRX_HAL_IS_CCK_RATE_8723B(pDesc)\\\n\t\t\t(GET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE1M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE2M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE5_5M ||\\\n\t\t\tGET_RX_STATUS_DESC_RX_RATE_8723B(pDesc) == DESC8723B_RATE11M)\n\n\nvoid rtl8723b_update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem);\nvoid rtl8723b_fill_fake_txdesc(PADAPTER padapter, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame);\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\ns32 rtl8723bs_init_xmit_priv(PADAPTER padapter);\nvoid rtl8723bs_free_xmit_priv(PADAPTER padapter);\ns32 rtl8723bs_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8723bs_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8723bs_xmit_buf_handler(PADAPTER padapter);\nthread_return rtl8723bs_xmit_thread(thread_context context);\n#define hal_xmit_handler rtl8723bs_xmit_buf_handler\n#endif\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8723bu_xmit_buf_handler(PADAPTER padapter);\n#define hal_xmit_handler rtl8723bu_xmit_buf_handler\n\n\ns32 rtl8723bu_init_xmit_priv(PADAPTER padapter);\nvoid rtl8723bu_free_xmit_priv(PADAPTER padapter);\ns32 rtl8723bu_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8723bu_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\t rtl8723bu_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\n//s32 rtl8812au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8723bu_xmit_tasklet(void *priv);\ns32 rtl8723bu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,struct tx_desc *ptxdesc);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8723be_init_xmit_priv(PADAPTER padapter);\nvoid rtl8723be_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8723be_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid\trtl8723be_xmitframe_resume(_adapter *padapter);\ns32 rtl8723be_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8723be_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8723be_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8723be_xmit_tasklet(void *priv);\n#endif\n\nu8\tBWMapping_8723B(PADAPTER Adapter, struct pkt_attrib *pattrib);\nu8\tSCMapping_8723B(PADAPTER Adapter, struct pkt_attrib\t*pattrib);\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8812a_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_CMD_H__\n#define __RTL8812A_CMD_H__\n\ntypedef enum _RTL8812_H2C_CMD \n{\n\tH2C_8812_RSVDPAGE = 0,\n\tH2C_8812_MSRRPT = 1,\n\tH2C_8812_SCAN = 2,\n\tH2C_8812_KEEP_ALIVE_CTRL = 3,\n\tH2C_8812_DISCONNECT_DECISION = 4,\n\n\tH2C_8812_INIT_OFFLOAD = 6,\t\t\n\tH2C_8812_AP_OFFLOAD = 8,\n\tH2C_8812_BCN_RSVDPAGE = 9,\n\tH2C_8812_PROBERSP_RSVDPAGE = 10,\n\t\n\tH2C_8812_SETPWRMODE = 0x20,\t\t\n\tH2C_8812_PS_TUNING_PARA = 0x21,\n\tH2C_8812_PS_TUNING_PARA2 = 0x22,\n\tH2C_8812_PS_LPS_PARA = 0x23,\n\tH2C_8812_P2P_PS_OFFLOAD = 0x24,\n\tH2C_8812_RA_MASK = 0x40,\n\tH2C_8812_TxBF = 0x41,\n\tH2C_8812_RSSI_REPORT = 0x42,\n\tH2C_8812_IQ_CALIBRATION = 0x45,\n\tH2C_8812_RA_PARA_ADJUST = 0x46,\n\n\tH2C_8812_BT_FW_PATCH = 0x6a,\n\n\tH2C_8812_WO_WLAN = 0x80,\n\tH2C_8812_REMOTE_WAKE_CTRL = 0x81,\n\tH2C_8812_AOAC_GLOBAL_INFO = 0x82,\n\tH2C_8812_AOAC_RSVDPAGE = 0x83,\n\tH2C_8812_FW_SWCHANNL = 0x87,\n\n\tH2C_8812_TSF_RESET = 0xC0,\n\n\tMAX_8812_H2CCMD\n}RTL8812_H2C_CMD;\n\nstruct cmd_msg_parm {\n\tu8 eid; //element id\n\tu8 sz; // sz\n\tu8 buf[6];\n};\n\nenum{\n\tPWRS\n};\n\nstruct H2C_SS_RFOFF_PARAM{\n\tu8 ROFOn; // 1: on, 0:off\n\tu16 gpio_period; // unit: 1024 us\n}__attribute__ ((packed));\n\n\n\n//_RSVDPAGE_LOC_CMD0\n#define SET_8812_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8812_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8812_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8812_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8812_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD1\n#define SET_8812_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8812_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8812_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)\n\n//_SETPWRMODE_PARM\n#define SET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8812_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)\n\n#define GET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n//_P2P_PS_OFFLOAD\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n#define SET_8812_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)\n\n\nvoid\tSet_RA_LDPC_8812(struct sta_info\t*psta, BOOLEAN bLDPC);\n\n// host message to firmware cmd\ns32 FillH2CCmd_8812(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nvoid rtl8812_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode);\nvoid rtl8812_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);\nu8 rtl8812_set_rssi_cmd(PADAPTER padapter, u8 *param);\nvoid rtl8812_set_raid_cmd(PADAPTER padapter, u32 bitmap, u8* arg);\nvoid rtl8812_Add_RateATid(PADAPTER padapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\nvoid rtl8812_set_wowlan_cmd(_adapter* padapter, u8 enable);\ns32 FillH2CCmd_8812(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nu8 GetTxBufferRsvdPageNum8812(_adapter *padapter, bool wowlan);\n\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8812a_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter);\n#endif // CONFIG_BT_COEXIST\n#ifdef CONFIG_P2P_PS\nvoid rtl8812_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\nvoid CheckFwRsvdPageContent(PADAPTER padapter);\nvoid rtl8812_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt );\n\n#ifdef CONFIG_TSF_RESET_OFFLOAD\nint reset_tsf(PADAPTER Adapter, u8 reset_port );\n#endif\t// CONFIG_TSF_RESET_OFFLOAD\n\n#ifdef CONFIG_WOWLAN\nvoid SetFwRelatedForWoWLAN8812(_adapter* padapter, u8 bHostIsGoingtoSleep);\n#endif//CONFIG_WOWLAN\n\n//------------------------------------\n//     C2H format\n//------------------------------------\n\n// TX Beamforming\n#define GET_8812_C2H_TXBF_ORIGINATE(_Header)\t\t\tLE_BITS_TO_1BYTE(_Header, 0, 8)\n#define GET_8812_C2H_TXBF_MACID(_Header)\t\t\t\tLE_BITS_TO_1BYTE((_Header + 1), 0, 8)\n\n\n\n/// TX Feedback Content\n#define \tUSEC_UNIT_FOR_8812_C2H_TX_RPT_QUEUE_TIME\t\t\t256\n\n#define\tGET_8812_C2H_TX_RPT_QUEUE_SELECT(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 0, 5)\n#define\tGET_8812_C2H_TX_RPT_PKT_BROCAST(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 5, 1)\n#define\tGET_8812_C2H_TX_RPT_LIFE_TIME_OVER(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 6, 1)\n#define\tGET_8812_C2H_TX_RPT_RETRY_OVER(_Header)\t\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 7, 1)\n#define\tGET_8812_C2H_TX_RPT_MAC_ID(_Header)\t\t\t\t\tLE_BITS_TO_1BYTE((_Header + 1), 0, 8)\n#define\tGET_8812_C2H_TX_RPT_DATA_RETRY_CNT(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 2), 0, 6)\n#define\tGET_8812_C2H_TX_RPT_QUEUE_TIME(_Header)\t\t\t\tLE_BITS_TO_2BYTE((_Header + 3), 0, 16)\t// In unit of 256 microseconds.\n#define\tGET_8812_C2H_TX_RPT_FINAL_DATA_RATE(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 5), 0, 8)\n\n// BT_FW_PATCH\n#define SET_8812_H2CCMD_BT_FW_PATCH_SIZE(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_2BYTE((pu1Byte)(__pH2CCmd), 0, 16, __Value)\n#define SET_8812_H2CCMD_BT_FW_PATCH_ADDR0(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE((pu1Byte)(__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8812_H2CCMD_BT_FW_PATCH_ADDR1(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE((pu1Byte)(__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8812_H2CCMD_BT_FW_PATCH_ADDR2(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE((pu1Byte)(__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8812_H2CCMD_BT_FW_PATCH_ADDR3(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE((pu1Byte)(__pH2CCmd)+5, 0, 8, __Value)\n\nint\trtl8812_iqk_wait(_adapter* padapter, u32 timeout_ms);\nvoid\trtl8812_iqk_done(_adapter* padapter);\n\ns32\n_C2HContentParsing8812(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tc2hCmdId, \n\tIN\tu8\t\t\tc2hCmdLen,\n\tIN\tu8 \t\t\t*tmpBuf\n);\nvoid\tC2HPacketHandler_8812(PADAPTER Adapter, u8 *Buffer, u8 Length);\n\n#endif//__RTL8812A_CMD_H__\n\n"
  },
  {
    "path": "include/rtl8812a_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_DM_H__\n#define __RTL8812A_DM_H__\n\nvoid rtl8812_init_dm_priv(IN PADAPTER Adapter);\nvoid rtl8812_deinit_dm_priv(IN PADAPTER Adapter);\nvoid rtl8812_InitHalDm(IN PADAPTER Adapter);\nvoid rtl8812_HalDmWatchDog(IN PADAPTER Adapter);\n\n//VOID rtl8192c_dm_CheckTXPowerTracking(IN PADAPTER Adapter);\n\n//void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal);\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nvoid\tAntDivCompare8812(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\nu8 AntDivBeforeLink8812(PADAPTER Adapter );\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8812a_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_HAL_H__\n#define __RTL8812A_HAL_H__\n\n//#include \"hal_com.h\"\n#include \"hal_data.h\"\n\n//include HAL Related header after HAL Related compiling flags \n#include \"rtl8812a_spec.h\"\n#include \"rtl8812a_rf.h\"\n#include \"rtl8812a_dm.h\"\n#include \"rtl8812a_recv.h\"\n#include \"rtl8812a_xmit.h\"\n#include \"rtl8812a_cmd.h\"\n#include \"rtl8812a_led.h\"\n#include \"Hal8812PwrSeq.h\"\n#include \"Hal8821APwrSeq.h\" //for 8821A/8811A\n#include \"Hal8812PhyReg.h\"\n#include \"Hal8812PhyCfg.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8812a_sreset.h\"\n#endif\n\n\n//---------------------------------------------------------------------\n//\t\tRTL8812AU From header\n//---------------------------------------------------------------------\n\t\t#define RTL8812_FW_IMG\t\t\t\t\t\t\"rtl8812a/FW_NIC.bin\"\n\t\t#define RTL8812_FW_WW_IMG\t\t\t\t\"rtl8812a/FW_WoWLAN.bin\"\n\t\t#define RTL8812_PHY_REG\t\t\t\t\t\"rtl8812a/PHY_REG.txt\" \n\t\t#define RTL8812_PHY_RADIO_A\t\t\t\t\"rtl8812a/RadioA.txt\"\n\t\t#define RTL8812_PHY_RADIO_B\t\t\t\t\"rtl8812a/RadioB.txt\"\n\t\t#define RTL8812_TXPWR_TRACK\t\t\t\t\"rtl8812a/TxPowerTrack.txt\"\t\t\t\n\t\t#define RTL8812_AGC_TAB\t\t\t\t\t\"rtl8812a/AGC_TAB.txt\"\n\t\t#define RTL8812_PHY_MACREG \t\t\t\t\"rtl8812a/MAC_REG.txt\"\n\t\t#define RTL8812_PHY_REG_PG\t\t\t\t\t\"rtl8812a/PHY_REG_PG.txt\"\n\t\t#define RTL8812_PHY_REG_MP \t\t\t\t\"rtl8812a/PHY_REG_MP.txt\" \n\t\t#define RTL8812_TXPWR_LMT\t\t\t\t\t\"rtl8812a/TXPWR_LMT.txt\" \n\t\t#define RTL8812_WIFI_ANT_ISOLATION\t\t\"rtl8812a/wifi_ant_isolation.txt\"\n\n//---------------------------------------------------------------------\n//\t\tRTL8821U From file\n//---------------------------------------------------------------------\n\t\t#define RTL8821_FW_IMG\t\t\t\t\t\t\"rtl8821a/FW_NIC.bin\"\n\t\t#define RTL8821_FW_WW_IMG\t\t\t\t\"rtl8821a/FW_WoWLAN.bin\"\n\t\t#define RTL8821_PHY_REG\t\t\t\t\t\"rtl8821a/PHY_REG.txt\" \n\t\t#define RTL8821_PHY_RADIO_A\t\t\t\t\"rtl8821a/RadioA.txt\"\n\t\t#define RTL8821_PHY_RADIO_B\t\t\t\t\"rtl8821a/RadioB.txt\" \n\t\t#define RTL8821_TXPWR_TRACK\t\t\t\t\"rtl8821a/TxPowerTrack.txt\"\t\t\n\t\t#define RTL8821_AGC_TAB\t\t\t\t\t\"rtl8821a/AGC_TAB.txt\"\n\t\t#define RTL8821_PHY_MACREG \t\t\t\t\"rtl8821a/MAC_REG.txt\"\n\t\t#define RTL8821_PHY_REG_PG\t\t\t\t\t\"rtl8821a/PHY_REG_PG.txt\"\n\t\t#define RTL8821_PHY_REG_MP \t\t\t\t\"rtl8821a/PHY_REG_MP.txt\"\n\t\t#define RTL8821_TXPWR_LMT\t\t\t\t\t\"rtl8821a/TXPWR_LMT.txt\" \n\n//---------------------------------------------------------------------\n//\t\tRTL8812 Power Configuration CMDs for PCIe interface\n//---------------------------------------------------------------------\n#define Rtl8812_NIC_PWR_ON_FLOW\t\t\t\trtl8812_power_on_flow\n#define Rtl8812_NIC_RF_OFF_FLOW\t\t\t\trtl8812_radio_off_flow\n#define Rtl8812_NIC_DISABLE_FLOW\t\t\t\trtl8812_card_disable_flow\n#define Rtl8812_NIC_ENABLE_FLOW\t\t\t\trtl8812_card_enable_flow\n#define Rtl8812_NIC_SUSPEND_FLOW\t\t\t\trtl8812_suspend_flow\n#define Rtl8812_NIC_RESUME_FLOW\t\t\t\trtl8812_resume_flow\n#define Rtl8812_NIC_PDN_FLOW\t\t\t\t\trtl8812_hwpdn_flow\n#define Rtl8812_NIC_LPS_ENTER_FLOW\t\t\trtl8812_enter_lps_flow\n#define Rtl8812_NIC_LPS_LEAVE_FLOW\t\t\t\trtl8812_leave_lps_flow\t\t\n\n//---------------------------------------------------------------------\n//\t\tRTL8821 Power Configuration CMDs for PCIe interface\n//---------------------------------------------------------------------\n#define Rtl8821A_NIC_PWR_ON_FLOW\t\t\t\trtl8821A_power_on_flow\n#define Rtl8821A_NIC_RF_OFF_FLOW\t\t\t\trtl8821A_radio_off_flow\n#define Rtl8821A_NIC_DISABLE_FLOW\t\t\t\trtl8821A_card_disable_flow\n#define Rtl8821A_NIC_ENABLE_FLOW\t\t\t\trtl8821A_card_enable_flow\n#define Rtl8821A_NIC_SUSPEND_FLOW\t\t\t\trtl8821A_suspend_flow\n#define Rtl8821A_NIC_RESUME_FLOW\t\t\t\trtl8821A_resume_flow\n#define Rtl8821A_NIC_PDN_FLOW\t\t\t\t\trtl8821A_hwpdn_flow\n#define Rtl8821A_NIC_LPS_ENTER_FLOW\t\t\trtl8821A_enter_lps_flow\n#define Rtl8821A_NIC_LPS_LEAVE_FLOW\t\t\trtl8821A_leave_lps_flow\t\n\n\n#if 1 // download firmware related data structure\n#define FW_SIZE_8812\t\t\t0x8000 // Compatible with RTL8723 Maximal RAM code size 24K.   modified to 32k, TO compatible with 92d maximal fw size 32k\n#define FW_START_ADDRESS\t\t0x1000\n#define FW_END_ADDRESS\t\t0x5FFF\n\n\n\ntypedef struct _RT_FIRMWARE_8812 {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_SIZE_8812];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8812, *PRT_FIRMWARE_8812;\n\n//\n// This structure must be cared byte-ordering\n//\n// Added by tynli. 2009.12.04.\n#define IS_FW_HEADER_EXIST_8812(_pFwHdr)\t((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) ==  0x9500)\n\n#define IS_FW_HEADER_EXIST_8821(_pFwHdr)\t((GET_FIRMWARE_HDR_SIGNATURE_8812(_pFwHdr) &0xFFF0) ==  0x2100)\n//=====================================================\n//\t\t\t\t\tFirmware Header(8-byte alinment required)\n//=====================================================\n//--- LONG WORD 0 ----\n#define GET_FIRMWARE_HDR_SIGNATURE_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 0, 16) // 92C0: test chip; 92C, 88C0: test chip; 88C1: MP A-cut; 92C1: MP A-cut\n#define GET_FIRMWARE_HDR_CATEGORY_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI\n#define GET_FIRMWARE_HDR_FUNCTION_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n#define GET_FIRMWARE_HDR_VERSION_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version\n#define GET_FIRMWARE_HDR_SUB_VER_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00\n#define GET_FIRMWARE_HDR_RSVD1_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) \t\t\n\n//--- LONG WORD 1 ----\n#define GET_FIRMWARE_HDR_MONTH_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 0, 8) // Release time Month field\n#define GET_FIRMWARE_HDR_DATE_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 8, 8) // Release time Date field\n#define GET_FIRMWARE_HDR_HOUR_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 16, 8)// Release time Hour field\n#define GET_FIRMWARE_HDR_MINUTE_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 24, 8)// Release time Minute field\n#define GET_FIRMWARE_HDR_ROMCODE_SIZE_8812(__FwHdr)\tLE_BITS_TO_4BYTE(__FwHdr+12, 0, 16)// The size of RAM code\n#define GET_FIRMWARE_HDR_RSVD2_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+12, 16, 16)\n\n//--- LONG WORD 2 ----\n#define GET_FIRMWARE_HDR_SVN_IDX_8812(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 0, 32)// The SVN entry index\n#define GET_FIRMWARE_HDR_RSVD3_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+20, 0, 32)\n\n//--- LONG WORD 3 ----\n#define GET_FIRMWARE_HDR_RSVD4_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 0, 32)\n#define GET_FIRMWARE_HDR_RSVD5_8812(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+28, 0, 32)\n\n#endif // download firmware related data structure\n\n\n#define DRIVER_EARLY_INT_TIME_8812\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8812\t\t0x02\n\n//for 8812\n// TX 128K, RX 16K, Page size 512B for TX, 128B for RX\n#define MAX_RX_DMA_BUFFER_SIZE_8812\t0x3E80 /* RX 16K */\n\n#ifdef CONFIG_WOWLAN\n#define RESV_FMWF\tWKFMCAM_SIZE*MAX_WKFM_NUM /* 16 entries, for each is 24 bytes*/\n#else\n#define RESV_FMWF\t0\n#endif\n\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8812\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8812\t0x0\t// 0B\n#endif\n#define RX_DMA_BOUNDARY_8812\t\t(MAX_RX_DMA_BUFFER_SIZE_8812 - RX_DMA_RESERVED_SIZE_8812 - 1)\n\n#define BCNQ_PAGE_NUM_8812\t\t0x07\n\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:1,GTK EXT MEM:1, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8812\t0x05\n#else\n#define WOWLAN_PAGE_NUM_8812\t0x00\n#endif\n\n\n#ifdef\tCONFIG_BEAMFORMER_FW_NDPA\n#define FW_NDPA_PAGE_NUM\t0x02\n#else\n#define FW_NDPA_PAGE_NUM\t0x00\n#endif\n\n#define TX_TOTAL_PAGE_NUMBER_8812\t(0xFF - BCNQ_PAGE_NUM_8812 - WOWLAN_PAGE_NUM_8812-FW_NDPA_PAGE_NUM)\n#define TX_PAGE_BOUNDARY_8812\t\t\t(TX_TOTAL_PAGE_NUMBER_8812 + 1)\n\n#define TX_PAGE_BOUNDARY_WOWLAN_8812\t\t(0xFF - BCNQ_PAGE_NUM_8812 - WOWLAN_PAGE_NUM_8812 + 1)\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812\tTX_PAGE_BOUNDARY_8812\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8812\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8812 + 1)\n\n// For Normal Chip Setting\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_8812\n#define NORMAL_PAGE_NUM_LPQ_8812\t\t\t\t0x10\n#define NORMAL_PAGE_NUM_HPQ_8812\t\t\t0x10\n#define NORMAL_PAGE_NUM_NPQ_8812\t\t\t0x00\n\n#define WMM_NORMAL_PAGE_NUM_HPQ_8812\t\t0x30\n#define WMM_NORMAL_PAGE_NUM_LPQ_8812\t\t0x20\n#define WMM_NORMAL_PAGE_NUM_NPQ_8812\t\t0x20\n\n\n// for 8821A\n// TX 64K, RX 16K, Page size 256B for TX, 128B for RX\n#define PAGE_SIZE_TX_8821A\t\t\t\t\t256\n#define PAGE_SIZE_RX_8821A\t\t\t\t\t128\n\n#define MAX_RX_DMA_BUFFER_SIZE_8821\t\t\t0x3E80 /* RX 16K */\n\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8821\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8821\t0x0\t// 0B\n#endif\n#define RX_DMA_BOUNDARY_8821\t\t(MAX_RX_DMA_BUFFER_SIZE_8821 - RX_DMA_RESERVED_SIZE_8821 - 1)\n\n#define BCNQ_PAGE_NUM_8821\t\t0x08\n#ifdef CONFIG_CONCURRENT_MODE\n#define BCNQ1_PAGE_NUM_8821\t\t0x04\n#else\n#define BCNQ1_PAGE_NUM_8821\t\t0x00\n#endif\n\n//For WoWLan , more reserved page\n//ARP Rsp:1, RWC:1, GTK Info:1,GTK RSP:1,GTK EXT MEM:1, PNO: 6\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8821\t0x06\n#else\n#define WOWLAN_PAGE_NUM_8821\t0x00\n#endif\n\n#define TX_TOTAL_PAGE_NUMBER_8821\t(0xFF - BCNQ_PAGE_NUM_8821 - BCNQ1_PAGE_NUM_8821 - WOWLAN_PAGE_NUM_8821)\n#define TX_PAGE_BOUNDARY_8821\t\t\t\t(TX_TOTAL_PAGE_NUMBER_8821 + 1)\n//#define TX_PAGE_BOUNDARY_WOWLAN_8821\t\t0xE0\n\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821\tTX_TOTAL_PAGE_NUMBER_8821\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8821\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8821 + 1)\n\n\n// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER\n#define NORMAL_PAGE_NUM_LPQ_8821\t\t\t0x08//0x10\n#define NORMAL_PAGE_NUM_HPQ_8821\t\t0x08//0x10\n#define NORMAL_PAGE_NUM_NPQ_8821\t\t0x00\n\n#define WMM_NORMAL_PAGE_NUM_HPQ_8821\t\t0x30\n#define WMM_NORMAL_PAGE_NUM_LPQ_8821\t\t0x20\n#define WMM_NORMAL_PAGE_NUM_NPQ_8821\t\t0x20\n\n\n#define\tEFUSE_HIDDEN_812AU\t\t\t\t\t0\n#define\tEFUSE_HIDDEN_812AU_VS\t\t\t\t1\n#define\tEFUSE_HIDDEN_812AU_VL\t\t\t\t2\n#define\tEFUSE_HIDDEN_812AU_VN\t\t\t\t3\n\n#if 0\n#define EFUSE_REAL_CONTENT_LEN_JAGUAR\t\t1024\n#define HWSET_MAX_SIZE_JAGUAR\t\t\t\t\t1024\n#else\n#define EFUSE_REAL_CONTENT_LEN_JAGUAR\t\t512\n#define HWSET_MAX_SIZE_JAGUAR\t\t\t\t\t512\n#endif\n\n#define EFUSE_MAX_BANK_8812A\t\t\t\t\t2\n#define EFUSE_MAP_LEN_JAGUAR\t\t\t\t\t512\n#define EFUSE_MAX_SECTION_JAGUAR\t\t\t\t64\n#define EFUSE_MAX_WORD_UNIT_JAGUAR\t\t\t4\n#define EFUSE_IC_ID_OFFSET_JAGUAR\t\t\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR_8812(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_JAGUAR)\n// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section\n// 9bytes + 1byt + 5bytes and pre 1byte.\n// For worst case:\n// | 2byte|----8bytes----|1byte|--7bytes--| //92D\n#define EFUSE_OOB_PROTECT_BYTES_JAGUAR\t\t18 \t// PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.\n#define EFUSE_PROTECT_BYTES_BANK_JAGUAR\t\t16\n// Added for different registry settings to adjust TxPwr index. added by Roger, 2010.03.09.\ntypedef enum _TX_PWR_PERCENTAGE{\n\tTX_PWR_PERCENTAGE_0 = 0x01, // 12.5%\n\tTX_PWR_PERCENTAGE_1 = 0x02, // 25%\n\tTX_PWR_PERCENTAGE_2 = 0x04, // 50%\n\tTX_PWR_PERCENTAGE_3 = 0x08, //100%, default target output power.\t\n} TX_PWR_PERCENTAGE;\n\n#define INCLUDE_MULTI_FUNC_BT(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_BT)\n#define INCLUDE_MULTI_FUNC_GPS(_Adapter)\t(GET_HAL_DATA(_Adapter)->MultiFunc & RT_MULTI_FUNC_GPS)\n\n//#define IS_MULTI_FUNC_CHIP(_Adapter)\t(((((PHAL_DATA_TYPE)(_Adapter->HalData))->MultiFunc) & (RT_MULTI_FUNC_BT|RT_MULTI_FUNC_GPS)) ? _TRUE : _FALSE)\n\n//#define RT_IS_FUNC_DISABLED(__pAdapter, __FuncBits) ( (__pAdapter)->DisabledFunctions & (__FuncBits) )\n\n// rtl8812_hal_init.c\nvoid\t_8051Reset8812(PADAPTER padapter);\ns32\tFirmwareDownload8812(PADAPTER Adapter, BOOLEAN bUsedWoWLANFw);\nvoid\tInitializeFirmwareVars8812(PADAPTER padapter);\n\ns32\t_LLTWrite_8812A(PADAPTER Adapter, u32 address, u32 data);\ns32\tInitLLTTable8812A(PADAPTER padapter, u8 txpktbuf_bndy);\nvoid InitRDGSetting8812A(PADAPTER padapter);\n\nvoid CheckAutoloadState8812A(PADAPTER padapter);\n\n// EFuse\nu8\tGetEEPROMSize8812A(PADAPTER padapter);\nvoid InitPGData8812A(PADAPTER padapter);\nvoid\tHal_EfuseParseIDCode8812A(PADAPTER padapter, u8 *hwinfo);\nvoid\tHal_ReadPROMVersion8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\tHal_ReadTxPowerInfo8812A(PADAPTER padapter, u8* hwinfo,BOOLEAN\tAutoLoadFail);\nvoid\tHal_ReadBoardType8812A(PADAPTER pAdapter, u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadThermalMeter_8812A(PADAPTER\tAdapter, u8* PROMContent,BOOLEAN \tAutoloadFail);\nvoid\tHal_ReadChannelPlan8812A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\tHal_EfuseParseXtal_8812A(PADAPTER pAdapter, u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadAntennaDiversity8812A(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail);\nvoid\tHal_ReadAntennaDiversity8821A(PADAPTER pAdapter, u8* PROMContent, BOOLEAN AutoLoadFail);\nvoid\tHal_ReadAmplifierType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_ReadPAType_8821A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_ReadRFEType_8812A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail);\nvoid\tHal_EfuseParseBTCoexistInfo8812A(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail);\nvoid\thal_ReadUsbType_8812AU(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\nint \tFirmwareDownloadBT(PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\nvoid\tHal_ReadRemoteWakeup_8812A(PADAPTER padapter, u8* hwinfo, BOOLEAN AutoLoadFail);\n\nBOOLEAN HalDetectPwrDownMode8812(PADAPTER Adapter);\nvoid Hal_EfuseParseKFreeData_8821A(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\n\t\n#ifdef CONFIG_WOWLAN\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\nvoid _InitBeaconParameters_8812A(PADAPTER padapter);\nvoid SetBeaconRelatedRegisters8812A(PADAPTER padapter);\n\nvoid ReadRFType8812A(PADAPTER padapter);\nvoid InitDefaultValue8821A(PADAPTER padapter);\n\nvoid SetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval);\nvoid GetHwReg8812A(PADAPTER padapter, u8 variable, u8 *pval);\nu8 SetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\nu8 GetHalDefVar8812A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\ns32 c2h_id_filter_ccx_8812a(u8 *buf);\nvoid rtl8812_set_hal_ops(struct hal_ops *pHalFunc);\n\n// register\nvoid SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);\n\nvoid rtl8812_start_thread(PADAPTER padapter);\nvoid rtl8812_stop_thread(PADAPTER padapter);\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8812AE(PADAPTER Adapter);\nVOID\tUpdateInterruptMask8812AE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\n#endif\n\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8812a_combo_card_WifiOnlyHwInit(PADAPTER Adapter);\n#endif\n\n\n#endif //__RTL8188E_HAL_H__\n\n"
  },
  {
    "path": "include/rtl8812a_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_LED_H__\n#define __RTL8812A_LED_H__\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8812au_InitSwLeds(PADAPTER padapter);\nvoid rtl8812au_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_PCI_HCI\nvoid rtl8812ae_InitSwLeds(PADAPTER padapter);\nvoid rtl8812ae_DeInitSwLeds(PADAPTER padapter);\n#endif\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8821as_InitSwLeds(PADAPTER padapter);\nvoid rtl8821as_DeInitSwLeds(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8812a_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_RECV_H__\n#define __RTL8812A_RECV_H__\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\t#define MAX_RECVBUF_SZ (rtw_rtkm_get_buff_size()) /*depend rtkm*/\n\t\t#else\n\t\t\t#define MAX_RECVBUF_SZ (32768)  /*32k*/\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (24576) // 24k\n\t\t//#define MAX_RECVBUF_SZ (20480) //20K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K\n\t\t//#define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t\t#ifdef CONFIG_PLATFORM_NOVATEK_NT72668\n\t\t#undef MAX_RECVBUF_SZ\n\t\t#define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t#endif //CONFIG_PLATFORM_NOVATEK_NT72668\n\t#else\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI)\n\n#define MAX_RECVBUF_SZ (RX_DMA_BOUNDARY_8821 + 1)\n\n#endif\n\n\n// Rx smooth factor\n#define Rx_Smooth_Factor (20)\n\n//DWORD 0\n#define SET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n#define GET_RX_STATUS_DESC_PKT_LEN_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICV_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8812(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_LAST_SEG_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1)\n#define GET_RX_STATUS_DESC_FIRST_SEG_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1)\n#define GET_RX_STATUS_DESC_EOR_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_OWN_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_8812(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_TID_8812(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_AMSDU_8812(__pRxDesc) \t\t\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_8812(__pRxDesc)\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_A1_FIT_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 16, 4)\n#define GET_RX_STATUS_DESC_CHKERR_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_IPVER_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_IS_TCPUDP__8812(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_CHK_VLD_8812(__pRxDesc)\t\tLE_BITS_TO_4BYTE(__pRxDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_MC_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_8812(__pRxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_8812(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#define GET_RX_STATUS_DESC_RX_IS_QOS_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8812(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_RPT_SEL_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_HTC_8812(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_8812(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_8812(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#ifdef CONFIG_USB_RX_AGGREGATION\n#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8812(__pRxStatusDesc)\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)\n#endif\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_MATCH_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_MATCH_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+12, 31, 1)\n\n//DWORD 6\n#define GET_RX_STATUS_DESC_SPLCP_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 0, 1)\n#define GET_RX_STATUS_DESC_LDPC_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 1, 1)\n#define GET_RX_STATUS_DESC_STBC_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 2, 1)\n#define GET_RX_STATUS_DESC_BW_8812(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxDesc+16, 4, 2)\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_8812(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n#define GET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)\n#define GET_RX_STATUS_DESC_BUFF_ADDR64_8812(__pRxDesc) \t\tLE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)\n\n#define SET_RX_STATUS_DESC_BUFF_ADDR_8812(__pRxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)\n\n\n#ifdef CONFIG_SDIO_HCI\ns32 InitRecvPriv8821AS(PADAPTER padapter);\nvoid FreeRecvPriv8821AS(PADAPTER padapter);\n#endif // CONFIG_SDIO_HCI\n\n#ifdef CONFIG_USB_HCI\nvoid rtl8812au_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf);\ns32 rtl8812au_init_recv_priv(PADAPTER padapter);\nvoid rtl8812au_free_recv_priv(PADAPTER padapter);\nvoid rtl8812au_recv_hdl(PADAPTER padapter, struct recv_buf *precvbuf);\nvoid rtl8812au_recv_tasklet(void *priv);\n\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8812ae_init_recv_priv(PADAPTER padapter);\nvoid rtl8812ae_free_recv_priv(PADAPTER padapter);\n#endif\n\nvoid rtl8812_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8812A_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8812a_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_RF_H__\n#define __RTL8812A_RF_H__\n\nVOID\nPHY_RF6052SetBandwidth8812(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n\nint\nPHY_RF6052_Config_8812(\n\tIN\tPADAPTER\tAdapter\t);\n\n#endif//__RTL8188E_RF_H__\n\n"
  },
  {
    "path": "include/rtl8812a_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8812A_SPEC_H__\n#define __RTL8812A_SPEC_H__\n\n#include <drv_conf.h>\n\n\n//============================================================\n//       8812 Regsiter offset definition\n//============================================================\n\n//============================================================\n//\n//============================================================\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_SYS_CLKR_8812A\t\t\t\t0x0008\n#define REG_AFE_PLL_CTRL_8812A\t\t0x0028\n#define REG_HSIMR_8812\t\t\t\t\t0x0058\n#define REG_HSISR_8812\t\t\t\t\t0x005c\n#define REG_GPIO_EXT_CTRL\t\t\t\t0x0060\n#define REG_GPIO_STATUS_8812\t\t\t0x006C\n#define REG_SDIO_CTRL_8812\t\t\t\t0x0070\n#define REG_OPT_CTRL_8812\t\t\t\t0x0074\n#define REG_RF_B_CTRL_8812\t\t\t\t0x0076\n#define REG_FW_DRV_MSG_8812\t\t\t0x0088\n#define REG_HMEBOX_E2_E3_8812\t\t\t0x008C\n#define REG_HIMR0_8812\t\t\t\t\t0x00B0\n#define REG_HISR0_8812\t\t\t\t\t0x00B4\n#define REG_HIMR1_8812\t\t\t\t\t0x00B8\n#define REG_HISR1_8812\t\t\t\t\t0x00BC\n#define REG_EFUSE_BURN_GNT_8812\t\t0x00CF\n#define REG_SYS_CFG1_8812\t\t\t\t0x00FC\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_CR_8812A\t\t\t\t\t0x100\n#define REG_PKTBUF_DBG_ADDR \t\t\t(REG_PKTBUF_DBG_CTRL)\n#define REG_RXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+2)\n#define REG_TXPKTBUF_DBG\t\t\t\t(REG_PKTBUF_DBG_CTRL+3)\n#define REG_WOWLAN_WAKE_REASON\t\t\tREG_MCUTST_WOWLAN\n\n#define REG_RSVD3_8812\t\t\t\t\t0x0168\n#define REG_C2HEVT_CMD_SEQ_88XX\t\t0x01A1\n#define REG_C2hEVT_CMD_CONTENT_88XX\t0x01A2\n#define REG_C2HEVT_CMD_LEN_88XX\t\t0x01AE\n\n#define REG_HMEBOX_EXT0_8812\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8812\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8812\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8812\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_DWBCN0_CTRL_8812\t\t\t\tREG_TDECTRL\n#define REG_DWBCN1_CTRL_8812\t\t\t\t0x0228\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_TDECTRL_8812A\t\t\t\t0x0208\n#define REG_RXDMA_CONTROL_8812A\t\t0x0286\t\t/*Control the RX DMA.*/\n#define REG_RXDMA_PRO_8812\t\t\t0x0290\n#define REG_EARLY_MODE_CONTROL_8812\t0x02BC\n#define REG_RSVD5_8812\t\t\t\t\t0x02F0\n#define REG_RSVD6_8812\t\t\t\t\t0x02F4\n#define REG_RSVD7_8812\t\t\t\t\t0x02F8\n#define REG_RSVD8_8812\t\t\t\t\t0x02FC\n\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8812A\t\t0x0300\n#define\tREG_DBI_WDATA_8812\t\t\t0x0348\t// DBI Write Data\n#define\tREG_DBI_RDATA_8812\t\t\t0x034C\t// DBI Read Data\n#define\tREG_DBI_ADDR_8812\t\t\t\t0x0350\t// DBI Address\n#define\tREG_DBI_FLAG_8812\t\t\t\t0x0352\t// DBI Read/Write Flag\n#define\tREG_MDIO_WDATA_8812\t\t\t0x0354\t// MDIO for Write PCIE PHY\n#define\tREG_MDIO_RDATA_8812\t\t\t0x0356\t// MDIO for Reads PCIE PHY\n#define\tREG_MDIO_CTL_8812\t\t\t\t0x0358\t// MDIO for Control \n#define\tREG_PCIE_MULTIFET_CTRL_8812\t0x036A\t//PCIE Multi-Fethc Control\n\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_TXPKT_EMPTY_8812A\t\t\t0x041A\n#define REG_FWHW_TXQ_CTRL_8812A\t\t0x0420\n#define REG_TXBF_CTRL_8812A\t\t\t0x042C\n#define REG_ARFR0_8812\t\t\t\t\t0x0444\n#define REG_ARFR1_8812\t\t\t\t\t0x044C\n#define REG_CCK_CHECK_8812\t\t\t\t0x0454\n#define REG_AMPDU_MAX_TIME_8812\t\t0x0456\n#define REG_TXPKTBUF_BCNQ_BDNY1_8812\t0x0457\n\n#define REG_AMPDU_MAX_LENGTH_8812\t0x0458\n#define REG_TXPKTBUF_WMAC_LBK_BF_HD_8812\t0x045D\n#define REG_NDPA_OPT_CTRL_8812A\t\t0x045F\n#define REG_DATA_SC_8812\t\t\t\t0x0483\n#ifdef CONFIG_WOWLAN\n#define REG_TXPKTBUF_IV_LOW             0x0484\n#define REG_TXPKTBUF_IV_HIGH            0x0488\n#endif\n#define REG_ARFR2_8812\t\t\t\t\t0x048C\n#define REG_ARFR3_8812\t\t\t\t\t0x0494\n#define REG_TXRPT_START_OFFSET\t\t0x04AC\n#define REG_AMPDU_BURST_MODE_8812\t0x04BC\n#define REG_HT_SINGLE_AMPDU_8812\t\t0x04C7\n#define REG_MACID_PKT_DROP0_8812\t\t0x04D0\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_TXPAUSE_8812A\t\t\t\t0x0522\n#define REG_CTWND_8812\t\t\t\t\t0x0572\n#define REG_SECONDARY_CCA_CTRL_8812\t0x0577\n#define REG_SCH_TXCMD_8812A\t\t\t0x05F8\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#define REG_MAC_CR_8812\t\t\t\t0x0600\n\n#define REG_MAC_TX_SM_STATE_8812\t\t0x06B4\n\n// Power\n#define REG_BFMER0_INFO_8812A\t\t\t0x06E4\n#define REG_BFMER1_INFO_8812A\t\t\t0x06EC\n#define REG_CSI_RPT_PARAM_BW20_8812A\t0x06F4\n#define REG_CSI_RPT_PARAM_BW40_8812A\t0x06F8\n#define REG_CSI_RPT_PARAM_BW80_8812A\t0x06FC\n\n// Hardware Port 2\n#define REG_BFMEE_SEL_8812A\t\t\t0x0714\n#define REG_SND_PTCL_CTRL_8812A\t\t0x0718\n\n\n//-----------------------------------------------------\n//\n//\tRedifine register definition for compatibility\n//\n//-----------------------------------------------------\n\n// TODO: use these definition when using REG_xxx naming rule.\n// NOTE: DO NOT Remove these definition. Use later.\n#define\tISR_8812\t\t\t\t\t\t\tREG_HISR0_8812\n\n//----------------------------------------------------------------------------\n//       8195 IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8812\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8812\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8812\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8812\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8812\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8812\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8812\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8812\t\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8812\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8812\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8812\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8812\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8812\t\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8812\t\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8812\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8812\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8812\t\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8812\t\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8812\t\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8812\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8812\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8812\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8812\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8812\t\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8812\t\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_BCNDMAINT7_8812\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8812\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8812\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8812\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8812\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8812\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8812\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8812\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8812\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8812\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8812\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8812\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8812\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8812\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8812\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8812\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8812\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8812\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8812\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n\n#ifdef CONFIG_PCI_HCI\n//#define IMR_RX_MASK\t\t(IMR_ROK_8812|IMR_RDU_8812|IMR_RXFOVW_8812)\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_8812|IMR_VIDOK_8812|IMR_BEDOK_8812|IMR_BKDOK_8812|IMR_MGNTDOK_8812|IMR_HIGHDOK_8812)\n\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_8812 | IMR_TXBCN0OK_8812 | IMR_TXBCN0ERR_8812 | IMR_BCNDERR0_8812)\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_8812 | IMR_VODOK_8812 | IMR_BEDOK_8812|IMR_BKDOK_8812)\n#endif\n\n\n//============================================================================\n//       Regsiter Bit and Content definition \n//============================================================================\n\n//2 ACMHWCTRL 0x05C0\n#define\tAcmHw_HwEn_8812\t\t\t\tBIT(0)\n#define\tAcmHw_VoqEn_8812\t\t\t\tBIT(1)\n#define\tAcmHw_ViqEn_8812\t\t\t\tBIT(2)\n#define\tAcmHw_BeqEn_8812\t\t\t\tBIT(3)\n#define\tAcmHw_VoqStatus_8812\t\t\tBIT(5)\n#define\tAcmHw_ViqStatus_8812\t\t\tBIT(6)\n#define\tAcmHw_BeqStatus_8812\t\t\tBIT(7)\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8812A 128\n#define SEC_CAM_ENT_NUM_8812A 64\n#define NSS_NUM_8812A 2\n#define BAND_CAP_8812A (BAND_CAP_2G | BAND_CAP_5G)\n#define BW_CAP_8812A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)\n\n#endif /* __RTL8812A_SPEC_H__ */\n\n#ifdef CONFIG_RTL8821A\n#include \"rtl8821a_spec.h\"\n#endif /* CONFIG_RTL8821A */\n\n"
  },
  {
    "path": "include/rtl8812a_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL88812A_SRESET_H_\n#define _RTL8812A_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8812_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8812_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8812a_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8812A_XMIT_H__\n#define __RTL8812A_XMIT_H__\n\n\n//For 88e early mode\n#define SET_EARLYMODE_PKTNUM(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 3, __Value)\n#define SET_EARLYMODE_LEN0(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 12, __Value)\n#define SET_EARLYMODE_LEN1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 16, 12, __Value)\n#define SET_EARLYMODE_LEN2_1(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 28, 4, __Value)\n#define SET_EARLYMODE_LEN2_2(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 8, __Value)\n#define SET_EARLYMODE_LEN3(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 8, 12, __Value)\n#define SET_EARLYMODE_LEN4(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr+4, 20, 12, __Value)\n\n//\n//defined for TX DESC Operation\n//\n\n#define MAX_TID (15)\n\n//OFFSET 0\n#define OFFSET_SZ\t0\n#define OFFSET_SHT\t16\n#define BMC\t\t\tBIT(24)\n#define LSG\t\t\tBIT(26)\n#define FSG\t\t\tBIT(27)\n#define OWN \t\tBIT(31)\n\n\n//OFFSET 4\n#define PKT_OFFSET_SZ\t\t0\n#define QSEL_SHT\t\t\t8\n#define RATE_ID_SHT\t\t\t16\n#define NAVUSEHDR\t\t\tBIT(20)\n#define SEC_TYPE_SHT \t\t22\n#define PKT_OFFSET_SHT\t\t26\n\n//OFFSET 8\n#define AGG_EN\t\t\t\tBIT(12)\n#define AGG_BK\t\t\t\tBIT(16)\n#define AMPDU_DENSITY_SHT\t20\n#define ANTSEL_A\t\t\tBIT(24)\n#define ANTSEL_B\t\t\tBIT(25)\n#define TX_ANT_CCK_SHT\t\t26\n#define TX_ANTL_SHT\t\t\t28\n#define TX_ANT_HT_SHT\t\t30\n\n//OFFSET 12\n#define SEQ_SHT\t\t\t\t16\n#define EN_HWSEQ\t\t\tBIT(31)\n\n//OFFSET 16\n#define QOS\t\t\t\t\tBIT(6)\n#define\tHW_SSN\t\t\t\tBIT(7)\n#define USERATE\t\t\t\tBIT(8)\n#define DISDATAFB\t\t\tBIT(10)\n#define CTS_2_SELF\t\t\tBIT(11)\n#define\tRTS_EN\t\t\t\tBIT(12)\n#define\tHW_RTS_EN\t\t\tBIT(13)\n#define DATA_SHORT\t\t\tBIT(24)\n#define PWR_STATUS_SHT\t15\n#define DATA_SC_SHT\t\t20\n#define DATA_BW\t\t\t\tBIT(25)\n\n//OFFSET 20\n#define\tRTY_LMT_EN\t\t\tBIT(17)\n\n//OFFSET 20\n#define SGI\t\t\t\t\tBIT(6)\n#define USB_TXAGG_NUM_SHT\t24\n\ntypedef struct txdescriptor_8812\n{\n\t// Offset 0\n\tu32 pktlen:16;\n\tu32 offset:8;\n\tu32 bmc:1;\n\tu32 htc:1;\n\tu32 ls:1;\n\tu32 fs:1;\n\tu32 linip:1;\n\tu32 noacm:1;\n\tu32 gf:1;\n\tu32 own:1;\n\n\t// Offset 4\n\tu32 macid:6;\n\tu32 rsvd0406:2;\t\n\tu32 qsel:5;\n\tu32 rd_nav_ext:1;\n\tu32 lsig_txop_en:1;\n\tu32 pifs:1;\n\tu32 rate_id:4;\n\tu32 navusehdr:1;\n\tu32 en_desc_id:1;\n\tu32 sectype:2;\n\tu32 rsvd0424:2;\n\tu32 pkt_offset:5;\t// unit: 8 bytes\n\tu32 rsvd0431:1;\n\n\t// Offset 8\n\tu32 rts_rc:6;\n\tu32 data_rc:6;\n\tu32 agg_en:1;\n\tu32 rd_en:1;\n\tu32 bar_rty_th:2;\n\tu32 bk:1;\n\tu32 morefrag:1;\n\tu32 raw:1;\n\tu32 ccx:1;\n\tu32 ampdu_density:3;\n\tu32 bt_null:1;\n\tu32 ant_sel_a:1;\n\tu32 ant_sel_b:1;\n\tu32 tx_ant_cck:2;\n\tu32 tx_antl:2;\n\tu32 tx_ant_ht:2;\n\n\t// Offset 12\n\tu32 nextheadpage:8;\n\tu32 tailpage:8;\n\tu32 seq:12;\n\tu32 cpu_handle:1;\n\tu32 tag1:1;\n\tu32 trigger_int:1;\n\tu32 hwseq_en:1;\n\n\t// Offset 16\n\tu32 rtsrate:5;\n\tu32 ap_dcfe:1;\n\tu32 hwseq_sel:2;\n\tu32 userate:1;\n\tu32 disrtsfb:1;\n\tu32 disdatafb:1;\n\tu32 cts2self:1;\n\tu32 rtsen:1;\n\tu32 hw_rts_en:1;\n\tu32 port_id:1;\t\n\tu32 pwr_status:3;\n\tu32 wait_dcts:1;\n\tu32 cts2ap_en:1;\n\tu32 data_sc:2;\n\tu32 data_stbc:2;\n\tu32 data_short:1;\n\tu32 data_bw:1;\n\tu32 rts_short:1;\n\tu32 rts_bw:1;\n\tu32 rts_sc:2;\n\tu32 vcs_stbc:2;\n\n\t// Offset 20\n\tu32 datarate:6;\n\tu32 sgi:1;\n\tu32 try_rate:1;\n\tu32 data_ratefb_lmt:5;\n\tu32 rts_ratefb_lmt:4;\n\tu32 rty_lmt_en:1;\n\tu32 data_rt_lmt:6;\n\tu32 usb_txagg_num:8;\n\n\t// Offset 24\n\tu32 txagg_a:5;\n\tu32 txagg_b:5;\n\tu32 use_max_len:1;\n\tu32 max_agg_num:5;\n\tu32 mcsg1_max_len:4;\n\tu32 mcsg2_max_len:4;\n\tu32 mcsg3_max_len:4;\n\tu32 mcs7_sgi_max_len:4;\n\n\t// Offset 28\n\tu32 checksum:16;\t// TxBuffSize(PCIe)/CheckSum(USB)\n\tu32 mcsg4_max_len:4;\n\tu32 mcsg5_max_len:4;\n\tu32 mcsg6_max_len:4;\n\tu32 mcs15_sgi_max_len:4;\n\n\t// Offset 32\n\tu32 rsvd32;\n\n\t// Offset 36\n\tu32 rsvd36;\n}TXDESC_8812, *PTXDESC_8812; \n\n\n// Dword 0\n#define GET_TX_DESC_OWN_8812(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n#define SET_TX_DESC_PKT_SIZE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define SET_TX_DESC_OFFSET_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define SET_TX_DESC_BMC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_FIRST_SEG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_LINIP_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_NO_ACM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_OWN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n\n// Dword 1\n#define SET_TX_DESC_MACID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n\n// Dword 2\n#define SET_TX_DESC_PAID_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_AGG_BREAK_8812(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define SET_TX_DESC_RAW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define SET_TX_DESC_SPE_RPT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_INT_8812(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_8812(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 4, __Value)\n#define SET_TX_DESC_CHK_EN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 4, 1, __Value)\n#define SET_TX_DESC_EARLY_MODE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HWSEQ_SEL_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_8812(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_CTROL_STBC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n#define SET_TX_DESC_TX_ANT_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 24, 4, __Value)\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_ANTSEL_A_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANTSEL_C_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 3, __Value)\n#define SET_TX_DESC_ANTSEL_D_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 25, 3, __Value)\n#define SET_TX_DESC_MBSSID_8821(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n\n// Dword 7 \n#define SET_TX_DESC_TX_BUFFER_SIZE_8812(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#define SET_TX_DESC_TX_DESC_CHECKSUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#define SET_TX_DESC_USB_TXAGG_NUM_8812(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value) \n#ifdef CONFIG_SDIO_HCI\n#define SET_TX_DESC_SDIO_TXSEQ_8812(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)\n#endif\n\n// Dword 8\n#define SET_TX_DESC_HWSEQ_EN_8812(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n\n// Dword 9\n#define SET_TX_DESC_SEQ_8812(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n\n// Dword 10\n#define SET_TX_DESC_TX_BUFFER_ADDRESS_8812(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\n#define GET_TX_DESC_TX_BUFFER_ADDRESS_8812(__pTxDesc) \tLE_BITS_TO_4BYTE(__pTxDesc+40, 0, 32)\n\n// Dword 11\n#define SET_TX_DESC_NEXT_DESC_ADDRESS_8812(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)\n\n\n#define SET_EARLYMODE_PKTNUM_8812(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_8812(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_8812(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_8812(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_8812(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,  __Value)\n#define SET_EARLYMODE_LEN3_8812(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\n#ifdef CONFIG_TX_EARLY_MODE\n#define USB_DUMMY_OFFSET\t\t2\n#else\n#define USB_DUMMY_OFFSET\t\t1\n#endif\n#define USB_DUMMY_LENGTH\t\t(USB_DUMMY_OFFSET * PACKET_OFFSET_SZ)\n\n\nvoid rtl8812a_cal_txdesc_chksum(u8 *ptxdesc);\nvoid rtl8812a_fill_fake_txdesc(PADAPTER\tpadapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8\tIsBTQosNull, u8 bDataFrame);\nvoid rtl8812a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid rtl8812a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid rtl8812a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8812au_init_xmit_priv(PADAPTER padapter);\nvoid rtl8812au_free_xmit_priv(PADAPTER padapter);\ns32 rtl8812au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8812au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\t rtl8812au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8812au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8812au_xmit_tasklet(void *priv);\ns32 rtl8812au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8812ae_init_xmit_priv(PADAPTER padapter);\nvoid rtl8812ae_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8812ae_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid\trtl8812ae_xmitframe_resume(_adapter *padapter);\ns32 rtl8812ae_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8812ae_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8812ae_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8812ae_xmit_tasklet(void *priv);\n#endif\n\n#ifdef CONFIG_TX_EARLY_MODE\nvoid UpdateEarlyModeInfo8812(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf );\n#endif\n\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag,u8 *ptxdesc);\n\nu8\tBWMapping_8812(PADAPTER Adapter, struct pkt_attrib *pattrib);\n\nu8\tSCMapping_8812(PADAPTER Adapter, struct pkt_attrib\t*pattrib);\n\n#endif //__RTL8812_XMIT_H__\n\n#ifdef CONFIG_RTL8821A\n#include \"rtl8821a_xmit.h\"\n#endif // CONFIG_RTL8821A\n\n"
  },
  {
    "path": "include/rtl8814a_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_CMD_H__\n#define __RTL8814A_CMD_H__\n#include \"hal_com_h2c.h\"\n\n//_RSVDPAGE_LOC_CMD0\n#define SET_8814A_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8814A_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8814A_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8814A_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8814A_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)\n\n//_MEDIA_STATUS_RPT_PARM_CMD1\n#define SET_8814A_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8814A_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8814A_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)\n#define SET_8814A_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)\n\n//_SETPWRMODE_PARM\n#define SET_8814A_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)\n#define SET_8814A_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)\n\n#define GET_8814A_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd)\t\t\t\t\tLE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)\n\n\n// _WoWLAN PARAM_CMD5\n#define SET_8814A_H2CCMD_WOWLAN_FUNC_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_ALL_PKT_DROP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_GPIO_ACTIVE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_REKEY_WAKE_UP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 7, 1, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_GPIONUM(__pH2CCmd, __Value)\t\t\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8814A_H2CCMD_WOWLAN_GPIO_DURATION(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n\n\n//WLANINFO_PARM\n#define SET_8814A_H2CCMD_WLANINFO_PARM_OPMODE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8814A_H2CCMD_WLANINFO_PARM_CHANNEL(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8814A_H2CCMD_WLANINFO_PARM_BW40MHZ(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n\n// _REMOTE_WAKEUP_CMD7\n#define SET_8814A_H2CCMD_REMOTE_WAKECTRL_ENABLE(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8814A_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8814A_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8814A_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n\n\n// _AP_OFFLOAD_CMD8\n#define SET_8814A_H2CCMD_AP_OFFLOAD_ON(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_8814A_H2CCMD_AP_OFFLOAD_HIDDEN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\n#define SET_8814A_H2CCMD_AP_OFFLOAD_DENYANY(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_8814A_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)\n\n// _PWR_MOD_CMD20\n#define SET_88E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)\n#define SET_88E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)\n#define SET_88E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)\n#define SET_88E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)\n#define SET_88E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)\n#define SET_88E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)\n\n/*BCNHWSEQ*/\n#define SET_8814A_H2CCMD_BCNHWSEQ_EN(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 0, 1, __Value)\n#define SET_8814A_H2CCMD_BCNHWSEQ_BCN_NUMBER(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 1, 3, __Value)\n#define SET_8814A_H2CCMD_BCNHWSEQ_HWSEQ(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 6, 1, __Value)\n#define SET_8814A_H2CCMD_BCNHWSEQ_EXHWSEQ(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd), 7, 1, __Value)\n#define SET_8814A_H2CCMD_BCNHWSEQ_PAGE(__pH2CCmd, __Value)\tSET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)\nvoid rtl8814_fw_update_beacon_cmd(_adapter *padapter);\n\n// TX Beamforming\n#define GET_8814A_C2H_TXBF_ORIGINATE(_Header)\t\t\tLE_BITS_TO_1BYTE(_Header, 0, 8)\n#define GET_8814A_C2H_TXBF_MACID(_Header)\t\t\t\tLE_BITS_TO_1BYTE((_Header + 1), 0, 8)\n\n\n\n/// TX Feedback Content\n#define \tUSEC_UNIT_FOR_8814A_C2H_TX_RPT_QUEUE_TIME\t\t\t256\n\n#define\tGET_8814A_C2H_TX_RPT_QUEUE_SELECT(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 0, 5)\n#define\tGET_8814A_C2H_TX_RPT_PKT_BROCAST(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 5, 1)\n#define\tGET_8814A_C2H_TX_RPT_LIFE_TIME_OVER(_Header)\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 6, 1)\n#define\tGET_8814A_C2H_TX_RPT_RETRY_OVER(_Header)\t\t\t\tLE_BITS_TO_1BYTE((_Header + 0), 7, 1)\n#define\tGET_8814A_C2H_TX_RPT_MAC_ID(_Header)\t\t\t\t\tLE_BITS_TO_1BYTE((_Header + 1), 0, 8)\n#define\tGET_8814A_C2H_TX_RPT_DATA_RETRY_CNT(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 2), 0, 6)\n#define\tGET_8814A_C2H_TX_RPT_QUEUE_TIME(_Header)\t\t\t\tLE_BITS_TO_2BYTE((_Header + 3), 0, 16)\t// In unit of 256 microseconds.\n#define\tGET_8814A_C2H_TX_RPT_FINAL_DATA_RATE(_Header)\t\tLE_BITS_TO_1BYTE((_Header + 5), 0, 8)\n\n\n//_P2P_PS_OFFLOAD\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value)\t\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value)\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)\n#define SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value)\t\t\tSET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)\n\ns32 FillH2CCmd_8814(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer);\nvoid rtl8814_set_raid_cmd(PADAPTER padapter, u64 bitmap, u8* arg);\nvoid rtl8814_Add_RateATid(PADAPTER padapter, u64 rate_bitmap, u8 *arg, u8 rssi_level);\nvoid rtl8814_set_wowlan_cmd(_adapter* padapter, u8 enable);\nvoid rtl8814_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus);\nvoid rtl8814_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt );\nvoid rtl8814_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode);\nu8 GetTxBufferRsvdPageNum8814(_adapter *padapter, bool wowlan);\nu8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param);\n\nvoid\nSet_RA_LDPC_8814(\n\tstruct sta_info\t*psta,\n\tBOOLEAN\t\t\tbLDPC\n\t);\nint rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms);\nvoid rtl8814_iqk_done(_adapter* padapter);\nVOID\nC2HPacketHandler_8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\t*Buffer,\n\tIN\tu8\t\t\tLength\n\t);\n#ifdef CONFIG_P2P_PS\nvoid rtl8814_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state);\n#endif //CONFIG_P2P\n\ns32\n_C2HContentParsing8814(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8\t\t\tc2hCmdId, \n\tIN\tu8\t\t\tc2hCmdLen,\n\tIN\tu8 \t\t\t*tmpBuf\n);\n\n#endif/* __RTL8814A_CMD_H__ */\n\n"
  },
  {
    "path": "include/rtl8814a_dm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_DM_H__\n#define __RTL8814A_DM_H__\n\nvoid rtl8814_init_dm_priv(IN PADAPTER Adapter);\nvoid rtl8814_deinit_dm_priv(IN PADAPTER Adapter);\nvoid rtl8814_InitHalDm(IN PADAPTER Adapter);\nvoid rtl8814_HalDmWatchDog(IN PADAPTER Adapter);\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nvoid AntDivCompare8814(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src);\nu8 AntDivBeforeLink8814(PADAPTER Adapter );\n#endif //CONFIG_ANTENNA_DIVERSITY\n\n#endif\n\n"
  },
  {
    "path": "include/rtl8814a_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_HAL_H__\n#define __RTL8814A_HAL_H__\n\n//#include \"hal_com.h\"\n#include \"hal_data.h\"\n\n//include HAL Related header after HAL Related compiling flags \n#include \"rtl8814a_spec.h\"\n#include \"rtl8814a_rf.h\"\n#include \"rtl8814a_dm.h\"\n#include \"rtl8814a_recv.h\"\n#include \"rtl8814a_xmit.h\"\n#include \"rtl8814a_cmd.h\"\n#include \"rtl8814a_led.h\"\n#include \"Hal8814PwrSeq.h\"\n#include \"Hal8814PhyReg.h\"\n#include \"Hal8814PhyCfg.h\"\n#ifdef DBG_CONFIG_ERROR_DETECT\n#include \"rtl8814a_sreset.h\"\n#endif //DBG_CONFIG_ERROR_DETECT\n\n\ntypedef enum _TX_PWR_PERCENTAGE{\n\tTX_PWR_PERCENTAGE_0 = 0x01, // 12.5%\n\tTX_PWR_PERCENTAGE_1 = 0x02, // 25%\n\tTX_PWR_PERCENTAGE_2 = 0x04, // 50%\n\tTX_PWR_PERCENTAGE_3 = 0x08, //100%, default target output power.\t\n} TX_PWR_PERCENTAGE;\n\n\nenum{\n\t\tVOLTAGE_V25\t\t\t\t\t\t= 0x03,\n\t\tLDOE25_SHIFT\t\t\t\t\t= 28 ,\n\t};\n/* max. iram is 64k , max dmen is 32k. Total = 96k = 0x18000*/\n#define FW_SIZE\t\t\t\t\t\t\t0x18000\n#define FW_START_ADDRESS   0x1000\ntypedef struct _RT_FIRMWARE_8814 {\n\tFIRMWARE_SOURCE\teFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8*\t\t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[FW_SIZE];\n#endif\n\tu32\t\t\tulFwLength;\n} RT_FIRMWARE_8814, *PRT_FIRMWARE_8814;\n\n#define PAGE_SIZE_TX_8814\tPAGE_SIZE_128\n#define BCNQ_PAGE_NUM_8814\t\t0x08\n\n//---------------------------------------------------------------------\n//\t\tRTL8814AU From header\n//---------------------------------------------------------------------\n\t\t#define RTL8814A_FW_IMG\t\t\t\t\t\"rtl8814a/FW_NIC.bin\"\n\t\t#define RTL8814A_FW_WW_IMG\t\t\t\t\"rtl8814a/FW_WoWLAN.bin\"\n\t\t#define RTL8814A_PHY_REG\t\t\t\t\t\"rtl8814a/PHY_REG.txt\" \n\t\t#define RTL8814A_PHY_RADIO_A\t\t\t\t\"rtl8814a/RadioA.txt\"\n\t\t#define RTL8814A_PHY_RADIO_B\t\t\t\t\"rtl8814a/RadioB.txt\"\n\t\t#define RTL8814A_PHY_RADIO_C\t\t\t\t\"rtl8814a/RadioC.txt\"\n\t\t#define RTL8814A_PHY_RADIO_D\t\t\t\t\"rtl8814a/RadioD.txt\"\n\t\t#define RTL8814A_TXPWR_TRACK\t\t\t\t\"rtl8814a/TxPowerTrack.txt\"\t\t\t\n\t\t#define RTL8814A_AGC_TAB\t\t\t\t\t\"rtl8814a/AGC_TAB.txt\"\n\t\t#define RTL8814A_PHY_MACREG \t\t\t\t\"rtl8814a/MAC_REG.txt\"\n\t\t#define RTL8814A_PHY_REG_PG\t\t\t\t\"rtl8814a/PHY_REG_PG.txt\"\n\t\t#define RTL8814A_PHY_REG_MP \t\t\t\t\"rtl8814a/PHY_REG_MP.txt\" \n\t\t#define RTL8814A_TXPWR_LMT\t\t\t\t\"rtl8814a/TXPWR_LMT.txt\" \n\t\t#define RTL8814A_WIFI_ANT_ISOLATION\t\t\"rtl8814a/wifi_ant_isolation.txt\"\n\n#define Rtl8814A_NIC_PWR_ON_FLOW\t\t\t\trtl8814A_power_on_flow\n#define Rtl8814A_NIC_RF_OFF_FLOW\t\t\t\trtl8814A_radio_off_flow\n#define Rtl8814A_NIC_DISABLE_FLOW\t\t\t\trtl8814A_card_disable_flow\n#define Rtl8814A_NIC_ENABLE_FLOW\t\t\t\trtl8814A_card_enable_flow\n#define Rtl8814A_NIC_SUSPEND_FLOW\t\t\t\trtl8814A_suspend_flow\n#define Rtl8814A_NIC_RESUME_FLOW\t\t\t\trtl8814A_resume_flow\n#define Rtl8814A_NIC_PDN_FLOW\t\t\t\t\trtl8814A_hwpdn_flow\n#define Rtl8814A_NIC_LPS_ENTER_FLOW\t\t\trtl8814A_enter_lps_flow\n#define Rtl8814A_NIC_LPS_LEAVE_FLOW\t\t\trtl8814A_leave_lps_flow\t\n\n//=====================================================\n//\t\t\t\tNew\tFirmware Header(8-byte alinment required)\n//=====================================================\n//--- LONG WORD 0 ----\n#define GET_FIRMWARE_HDR_SIGNATURE_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 0, 16) \n#define GET_FIRMWARE_HDR_CATEGORY_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr, 16, 8) // AP/NIC and USB/PCI\n#define GET_FIRMWARE_HDR_FUNCTION_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr, 24, 8) // Reserved for different FW function indcation, for further use when driver needs to download different FW in different conditions\n#define GET_FIRMWARE_HDR_VERSION_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 0, 16)// FW Version\n#define GET_FIRMWARE_HDR_SUB_VER_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 16, 8) // FW Subversion, default 0x00\n#define GET_FIRMWARE_HDR_SUB_IDX_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+4, 24, 8) // FW Subversion Index\n\n//--- LONG WORD 1 ----\n#define GET_FIRMWARE_HDR_SVN_IDX_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+8, 0, 32)// The SVN entry index\n#define GET_FIRMWARE_HDR_RSVD1_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+12, 0, 32)\n\n//--- LONG WORD 2 ----\n#define GET_FIRMWARE_HDR_MONTH_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 0, 8) // Release time Month field\n#define GET_FIRMWARE_HDR_DATE_3081(__FwHdr)\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 8, 8) // Release time Date field\n#define GET_FIRMWARE_HDR_HOUR_3081(__FwHdr)\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 16, 8)// Release time Hour field\n#define GET_FIRMWARE_HDR_MINUTE_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+16, 24, 8)// Release time Minute field\n#define GET_FIRMWARE_HDR_YEAR_3081(__FwHdr)\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+20, 0, 16)// Release time Year field\n#define GET_FIRMWARE_HDR_FOUNDRY_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+20, 16, 8)// Release time Foundry field\n#define GET_FIRMWARE_HDR_RSVD2_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+20, 24, 8)\n\n//--- LONG WORD 3 ----\n#define GET_FIRMWARE_HDR_MEM_UASGE_DL_FROM_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 0, 1)\n#define GET_FIRMWARE_HDR_MEM_UASGE_BOOT_FROM_3081(__FwHdr)\tLE_BITS_TO_4BYTE(__FwHdr+24, 1, 1)\n#define GET_FIRMWARE_HDR_MEM_UASGE_BOOT_LOADER_3081(__FwHdr)LE_BITS_TO_4BYTE(__FwHdr+24, 2, 1)\n#define GET_FIRMWARE_HDR_MEM_UASGE_IRAM_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 3, 1)\n#define GET_FIRMWARE_HDR_MEM_UASGE_ERAM_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 4, 1)\n#define GET_FIRMWARE_HDR_MEM_UASGE_RSVD4_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 5, 3)\n#define GET_FIRMWARE_HDR_RSVD3_3081(__FwHdr)\t\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 8, 8)\n#define GET_FIRMWARE_HDR_BOOT_LOADER_SZ_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+24, 16, 16)\n#define GET_FIRMWARE_HDR_RSVD5_3081(__FwHdr)\t\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+28, 0, 32)\n\n//--- LONG WORD 4 ----\n#define GET_FIRMWARE_HDR_TOTAL_DMEM_SZ_3081(__FwHdr)\tLE_BITS_TO_4BYTE(__FwHdr+36, 0, 32)\n#define GET_FIRMWARE_HDR_FW_CFG_SZ_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+36, 0, 16)\n#define GET_FIRMWARE_HDR_FW_ATTR_SZ_3081(__FwHdr)\t\tLE_BITS_TO_4BYTE(__FwHdr+36, 16, 16)\n\n//--- LONG WORD 5 ----\n#define GET_FIRMWARE_HDR_IROM_3081(__FwHdr)\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+40, 0, 32)\n#define GET_FIRMWARE_HDR_EROM_3081(__FwHdr)\t\t\t\tLE_BITS_TO_4BYTE(__FwHdr+44, 0, 32)\n\n//--- LONG WORD 6 ----\n#define GET_FIRMWARE_HDR_IRAM_SZ_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+48, 0, 32)\n#define GET_FIRMWARE_HDR_ERAM_SZ_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+52, 0, 32)\n\n//--- LONG WORD 7 ----\n#define GET_FIRMWARE_HDR_RSVD6_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+56, 0, 32)\n#define GET_FIRMWARE_HDR_RSVD7_3081(__FwHdr)\t\t\tLE_BITS_TO_4BYTE(__FwHdr+60, 0, 32)\n\n\n\n//\n// 2013/08/16 MH MOve from SDIO.h for common use.\n//\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_USB_HCI)\n#define TRX_SHARE_MODE_8814A\t\t\t\t0\t//TRX Buffer Share Index\n#define BASIC_RXFF_SIZE_8814A\t\t\t\t24576//Basic RXFF Size is 24K = 24*1024 Unit: Byte\n#define TRX_SHARE_BUFF_UNIT_8814A\t\t\t65536//TRX Share Buffer unit Size 64K = 64*1024 Unit: Byte\n#define TRX_SHARE_BUFF_UNIT_PAGE_8814A\tTRX_SHARE_BUFF_UNIT_8814A/PAGE_SIZE_8814A//512 Pages\n\n//Origin: \n#define  HPQ_PGNUM_8814A\t \t\t\t\t0x20\t//High Queue\n#define  LPQ_PGNUM_8814A\t \t\t\t\t0x20\t//Low Queue\n#define  NPQ_PGNUM_8814A\t \t\t\t\t0x20\t//Normal Queue\n#define  EPQ_PGNUM_8814A\t \t\t\t\t0x20\t//Extra Queue\n\n#else\t// #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_USB_HCI)\n\n#define  HPQ_PGNUM_8814A\t\t20\n#define  NPQ_PGNUM_8814A\t\t20\n#define  LPQ_PGNUM_8814A\t\t20 //1972\n#define  EPQ_PGNUM_8814A\t\t20\n#define  BCQ_PGNUM_8814A\t\t32\n\n#endif //#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_USB_HCI)\n\n#ifdef CONFIG_WOWLAN\n#define WOWLAN_PAGE_NUM_8814\t0x00\n#else\n#define WOWLAN_PAGE_NUM_8814\t0x00\n#endif\n\n#define PAGE_SIZE_8814A\t\t\t\t\t\t128//TXFF Page Size, Unit: Byte\n#define MAX_RX_DMA_BUFFER_SIZE_8814A\t\t0x5C00\t//BASIC_RXFF_SIZE_8814A+TRX_SHARE_MODE_8814A*TRX_SHARE_BUFF_UNIT_8814A //Basic RXFF Size + ShareBuffer Size\n#define TX_PAGE_BOUNDARY_8814A\t\t\tTXPKT_PGNUM_8814A\t// Need to enlarge boundary, by KaiYuan\n#define TX_PAGE_BOUNDARY_WOWLAN_8814A\tTXPKT_PGNUM_8814A\t//TODO: 20130415 KaiYuan Check this value later\n\n#ifdef CONFIG_FW_C2H_DEBUG \n#define RX_DMA_RESERVED_SIZE_8814A\t0x100\t// 256B, reserved for c2h debug message\n#else\n#define RX_DMA_RESERVED_SIZE_8814A\t0x0\t// 0B\n#endif\n#define RX_DMA_BOUNDARY_8814A\t\t(MAX_RX_DMA_BUFFER_SIZE_8814A - RX_DMA_RESERVED_SIZE_8814A - 1)\n\n\n\n#define  TOTAL_PGNUM_8814A\t\t2048\n#define  TXPKT_PGNUM_8814A\t\t(2048 - BCNQ_PAGE_NUM_8814-WOWLAN_PAGE_NUM_8814)\n#define  PUB_PGNUM_8814A\t\t(TXPKT_PGNUM_8814A-HPQ_PGNUM_8814A-NPQ_PGNUM_8814A-LPQ_PGNUM_8814A-EPQ_PGNUM_8814A)\n\n//Note: For WMM Normal Chip Setting ,modify later\n#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8814A\tTX_PAGE_BOUNDARY_8814A\n#define WMM_NORMAL_TX_PAGE_BOUNDARY_8814A\t\t(WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8814A + 1)\n\n#define DRIVER_EARLY_INT_TIME_8814\t\t0x05\n#define BCN_DMA_ATIME_INT_TIME_8814\t\t0x02\n\n\n#define MAX_PAGE_SIZE\t\t\t4096\t// @ page : 4k bytes\n\n#define EFUSE_MAX_SECTION_JAGUAR\t\t\t\t64\n\n#define\tHWSET_MAX_SIZE_8814A\t\t\t512\n\n#define\tEFUSE_REAL_CONTENT_LEN_8814A\t1024\n#define\tEFUSE_MAX_BANK_8814A\t\t2\n\n#define\tEFUSE_MAP_LEN_8814A\t\t\t512\n#define\tEFUSE_MAX_SECTION_8814A\t\t64\n#define\tEFUSE_MAX_WORD_UNIT_8814A\t\t4\n#define\tEFUSE_PROTECT_BYTES_BANK_8814A\t\t16\n\n#define\tEFUSE_IC_ID_OFFSET_8814A\t\t506\t//For some inferiority IC purpose. added by Roger, 2009.09.02.\n#define AVAILABLE_EFUSE_ADDR_8814A(addr) \t(addr < EFUSE_REAL_CONTENT_LEN_8814A)\n\n/*-------------------------------------------------------------------------\nChip specific\n-------------------------------------------------------------------------*/\n\n/* pic buffer descriptor */\n#if 1 /* according to the define in the rtw_xmit.h, rtw_recv.h */\n#define RTL8814AE_SEG_NUM  TX_BUFFER_SEG_NUM /* 0:2 seg, 1: 4 seg, 2: 8 seg */\n#define TX_DESC_NUM_8814A  TXDESC_NUM   /* 128 */\n#define RX_DESC_NUM_8814A  PCI_MAX_RX_COUNT /* 128 */\n#ifdef CONFIG_CONCURRENT_MODE\n#define BE_QUEUE_TX_DESC_NUM_8814A  (TXDESC_NUM<<1)    /* 256 */\n#else\n#define BE_QUEUE_TX_DESC_NUM_8814A  (TXDESC_NUM+(TXDESC_NUM>>1)) /* 192 */\n#endif\n#else\n#define RTL8814AE_SEG_NUM  TX_BUFFER_SEG_NUM /* 0:2 seg, 1: 4 seg, 2: 8 seg */\n#define TX_DESC_NUM_8814A  128 /* 1024//2048 change by ylb 20130624 */\n#define RX_DESC_NUM_8814A  128 /* 1024 //512 change by ylb 20130624 */\n#endif\n\n// <Roger_Notes> To prevent out of boundary programming case, leave 1byte and program full section\n// 9bytes + 1byt + 5bytes and pre 1byte.\n// For worst case:\n// | 1byte|----8bytes----|1byte|--5bytes--| \n// |         |            Reserved(14bytes)\t      |\n//\n#define\tEFUSE_OOB_PROTECT_BYTES \t\t15\t// PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.\n\n/* rtl8814_hal_init.c */\ns32 FirmwareDownload8814A( PADAPTER\tAdapter, BOOLEAN bUsedWoWLANFw);\nvoid\tInitializeFirmwareVars8814(PADAPTER padapter);\n\nVOID\nHal_InitEfuseVars_8814A(\n\tIN\tPADAPTER\tAdapter\n\t);\n\ns32 InitLLTTable8814A(\n\tIN\tPADAPTER\tAdapter\n\t);\n\n\nvoid InitRDGSetting8814A(PADAPTER padapter);\n\n//void CheckAutoloadState8812A(PADAPTER padapter);\n\n// EFuse\nu8\tGetEEPROMSize8814A(PADAPTER padapter);\nvoid InitPGData8814A(PADAPTER padapter);\n\nvoid\thal_ReadPROMVersion8814A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\thal_ReadTxPowerInfo8814A(PADAPTER padapter, u8* hwinfo,BOOLEAN\tAutoLoadFail);\nvoid\thal_ReadBoardType8814A(PADAPTER pAdapter, u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\thal_ReadThermalMeter_8814A(PADAPTER\tAdapter, u8* PROMContent,BOOLEAN \tAutoloadFail);\nvoid\thal_ReadChannelPlan8814A(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoadFail);\nvoid\thal_EfuseParseXtal_8814A(PADAPTER pAdapter, u8* hwinfo,BOOLEAN AutoLoadFail);\nvoid\thal_ReadAntennaDiversity8814A(PADAPTER pAdapter,u8* PROMContent,BOOLEAN AutoLoadFail);\nvoid\thal_Read_TRX_antenna_8814A(PADAPTER\tAdapter, u8 *PROMContent, BOOLEAN AutoloadFail);\nVOID hal_ReadAmplifierType_8814A(\n\tIN\tPADAPTER\t\tAdapter\t\n\t);\nVOID hal_ReadPAType_8814A(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu8*\t\t\tPROMContent,\n\tIN\tBOOLEAN\t\tAutoloadFail,\n\tOUT u8*\t\tpPAType, \n\tOUT u8*\t\tpLNAType\n\t);\nvoid hal_GetRxGainOffset_8814A(\n\tPADAPTER\tAdapter,\n\tpu1Byte\t\tPROMContent,\n\tBOOLEAN\t\tAutoloadFail\n\t);\nvoid Hal_EfuseParseKFreeData_8814A(\n\tIN\t\tPADAPTER\t\tAdapter,\n\tIN\t\tu8\t\t\t\t*PROMContent,\n\tIN\t\tBOOLEAN\t\t\tAutoloadFail);\nvoid\thal_ReadRFEType_8814A(PADAPTER Adapter,u8* PROMContent, BOOLEAN AutoloadFail);\nvoid\thal_EfuseParseBTCoexistInfo8814A(PADAPTER Adapter, u8* hwinfo, BOOLEAN AutoLoadFail);\n\n//void\thal_ReadUsbType_8812AU(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);\n//int \tFirmwareDownloadBT(PADAPTER Adapter, PRT_MP_FIRMWARE pFirmware);\nvoid\thal_ReadRemoteWakeup_8814A(PADAPTER padapter, u8* hwinfo, BOOLEAN AutoLoadFail);\nu8\tMgntQuery_NssTxRate(u16 Rate);\n\n//BOOLEAN HalDetectPwrDownMode8812(PADAPTER Adapter);\n\t\n#ifdef CONFIG_WOWLAN\nvoid Hal_DetectWoWMode(PADAPTER pAdapter);\n#endif //CONFIG_WOWLAN\n\nvoid _InitBeaconParameters_8814A(PADAPTER padapter);\nvoid SetBeaconRelatedRegisters8814A(PADAPTER padapter);\n\nvoid ReadRFType8814A(PADAPTER padapter);\nvoid InitDefaultValue8814A(PADAPTER padapter);\n\nvoid SetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval);\nvoid GetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval);\nu8 SetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\nu8 GetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval);\ns32 c2h_id_filter_ccx_8814a(u8 *buf);\nvoid rtl8814_set_hal_ops(struct hal_ops *pHalFunc);\n\n// register\nvoid SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);\nvoid SetBcnCtrlReg(PADAPTER\tAdapter, u8\tSetBits, u8\tClearBits);\nvoid rtl8814_start_thread(PADAPTER padapter);\nvoid rtl8814_stop_thread(PADAPTER padapter);\n\n\n#ifdef CONFIG_PCI_HCI\nBOOLEAN\tInterruptRecognized8814AE(PADAPTER Adapter);\nVOID\tUpdateInterruptMask8814AE(PADAPTER Adapter, u32 AddMSR, u32 AddMSR1, u32 RemoveMSR, u32 RemoveMSR1);\nu16\tget_txbd_idx_addr(u16 ff_hwaddr);\n#endif\n\n#ifdef CONFIG_BT_COEXIST\nvoid rtl8812a_combo_card_WifiOnlyHwInit(PADAPTER Adapter);\n#endif\n\n#endif //__RTL8188E_HAL_H__\n\n"
  },
  {
    "path": "include/rtl8814a_led.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_LED_H__\n#define __RTL8814A_LED_H__\n\n\n//================================================================================\n// Interface to manipulate LED objects.\n//================================================================================\n#ifdef CONFIG_USB_HCI\nvoid rtl8814au_InitSwLeds(PADAPTER padapter);\nvoid rtl8814au_DeInitSwLeds(PADAPTER padapter);\n#endif //CONFIG_USB_HCI\n#ifdef CONFIG_PCI_HCI\nvoid rtl8814ae_InitSwLeds(PADAPTER padapter);\nvoid rtl8814ae_DeInitSwLeds(PADAPTER padapter);\n#endif //CONFIG_PCI_HCI\n#ifdef CONFIG_SDIO_HCI\nvoid rtl8814s_InitSwLeds(PADAPTER padapter);\nvoid rtl8814s_DeInitSwLeds(PADAPTER padapter);\n#endif //CONFIG_SDIO_HCI\n\n#endif //__RTL8814A_LED_H__\n\n"
  },
  {
    "path": "include/rtl8814a_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_RECV_H__\n#define __RTL8814A_RECV_H__\n\n#if defined(CONFIG_USB_HCI)\n\n#ifndef MAX_RECVBUF_SZ\n#ifdef PLATFORM_OS_CE\n#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n#else\n\t#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n\t\t#ifdef CONFIG_PLATFORM_MSTAR\n\t\t\t#define MAX_RECVBUF_SZ (8192) // 8K\n\t\t#else\n\t\t#define MAX_RECVBUF_SZ (32768) // 32k\n\t\t#endif\n\t\t//#define MAX_RECVBUF_SZ (24576) // 24k\n\t\t//#define MAX_RECVBUF_SZ (20480) //20K\n\t\t//#define MAX_RECVBUF_SZ (10240) //10K\n\t\t//#define MAX_RECVBUF_SZ (15360) // 15k < 16k\n\t\t//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k\n\t#else\n\t\t#define MAX_RECVBUF_SZ (4000) // about 4K\n\t#endif\n#endif\n#endif //!MAX_RECVBUF_SZ\n\n#elif defined(CONFIG_PCI_HCI)\n//#ifndef CONFIG_MINIMAL_MEMORY_USAGE\n//\t#define MAX_RECVBUF_SZ (9100)\n//#else\n\t#define MAX_RECVBUF_SZ (4000) // about 4K\n//#endif\n\n\n#elif defined(CONFIG_SDIO_HCI)\n/* temp solution\n#ifdef CONFIG_SDIO_RX_COPY\n#define MAX_RECVBUF_SZ (10240)\n#else // !CONFIG_SDIO_RX_COPY\n#define MAX_RECVBUF_SZ\tMAX_RX_DMA_BUFFER_SIZE_8821\n#endif // !CONFIG_SDIO_RX_COPY\n*/\n#endif\n\n\n/* RX buffer descriptor */\n/* DWORD 0 */\n#define SET_RX_BUFFER_DESC_DATA_LENGTH_8814A(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_BUFFER_DESC_LS_8814A(__pRxStatusDesc, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc, 14, 1, __Value)\n#define SET_RX_BUFFER_DESC_FS_8814A(__pRxStatusDesc, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc, 15, 1, __Value)\n#define SET_RX_BUFFER_DESC_TOTAL_LENGTH_8814A(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc, 16, 16, __Value)\n\n#define GET_RX_BUFFER_DESC_OWN_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc, 31, 1)\n#define GET_RX_BUFFER_DESC_LS_8814A(__pRxStatusDesc)\t\t\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc, 14, 1)\n#define GET_RX_BUFFER_DESC_FS_8814A(__pRxStatusDesc)\t\t\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc, 15, 1)\n#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc, 16, 15)\n\n/* DWORD 1 */\n#define SET_RX_BUFFER_PHYSICAL_LOW_8814A(__pRxStatusDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc+4, 0, 32, __Value)\n#define GET_RX_BUFFER_PHYSICAL_LOW_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 0, 32)\n\n/* DWORD 2 */\n#define SET_RX_BUFFER_PHYSICAL_HIGH_8814A(__pRxStatusDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pRxStatusDesc+8, 0, 32, __Value)\n\n/* DWORD 3*/ /* RESERVED */\n\n\n/*=============\n//RX Info\n==============*/\n//DWORD 0\n#define SET_RX_STATUS_DESC_PKT_LEN_8814A(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)\n#define SET_RX_STATUS_DESC_EOR_8814A(__pRxStatusDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)\n#define SET_RX_STATUS_DESC_OWN_8814AE(__pRxStatusDesc, __Value)\t\tSET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)\n\n#define GET_RX_STATUS_DESC_PKT_LEN_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)\n#define GET_RX_STATUS_DESC_CRC32_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)\n#define GET_RX_STATUS_DESC_ICV_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)\n#define GET_RX_STATUS_DESC_DRVINFO_SIZE_8814A(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 4)\n#define GET_RX_STATUS_DESC_SECURITY_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 20, 3)\n#define GET_RX_STATUS_DESC_QOS_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 23, 1)\n#define GET_RX_STATUS_DESC_SHIFT_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 24, 2)\n#define GET_RX_STATUS_DESC_PHY_STATUS_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)\n#define GET_RX_STATUS_DESC_SWDEC_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)\n#define GET_RX_STATUS_DESC_LAST_SEG_8814AE(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 28, 1)\n#define GET_RX_STATUS_DESC_EOR_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n\n//DWORD 1\n#define GET_RX_STATUS_DESC_MACID_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 0, 7)\n#define GET_RX_STATUS_DESC_EXT_SECTYPE_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 7, 1)/* 20130415 KaiYuan add for 8814 */\n#define GET_RX_STATUS_DESC_TID_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 8, 4)\n#define GET_RX_STATUS_DESC_MACID_VLD_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 12, 1)\n#define GET_RX_STATUS_DESC_AMSDU_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 13, 1)\n#define GET_RX_STATUS_DESC_RXID_MATCH_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+4, 14, 1)\n#define GET_RX_STATUS_DESC_PAGGR_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 15, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHKERR_8814A(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 20, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_IPVER_8814A(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 21, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_IS_TCPUDP_8814A(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 22, 1)\n#define GET_RX_STATUS_DESC_TCPOFFLOAD_CHK_VLD_8814A(__pRxStatusDesc)\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 23, 1)\n#define GET_RX_STATUS_DESC_PAM_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 24, 1)\n#define GET_RX_STATUS_DESC_PWR_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 25, 1)\n#define GET_RX_STATUS_DESC_MORE_DATA_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 26, 1)\n#define GET_RX_STATUS_DESC_MORE_FRAG_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 27, 1)\n#define GET_RX_STATUS_DESC_TYPE_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 28, 2)\n#define GET_RX_STATUS_DESC_FIRST_SEG_8814AE(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 29, 1)\n#define GET_RX_STATUS_DESC_EOR_8814AE(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)\n#define GET_RX_STATUS_DESC_MC_8814A(__pRxStatusDesc)\t\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 30, 1)\n#define GET_RX_STATUS_DESC_BC_8814A(__pRxStatusDesc)\t\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+4, 31, 1)\n\n//DWORD 2\n#define GET_RX_STATUS_DESC_SEQ_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 0, 12)\n#define GET_RX_STATUS_DESC_FRAG_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 12, 4)\n#ifdef CONFIG_USB_RX_AGGREGATION\n#define GET_RX_STATUS_DESC_USB_AGG_PKTNUM_8814A(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 8)\n#else\n#define GET_RX_STATUS_DESC_RX_IS_QOS_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 16, 1)\n#endif\n#define GET_RX_STATUS_DESC_WLANHD_IV_LEN_8814A(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 18, 6)\n#define GET_RX_STATUS_DESC_HWRSVD_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 24, 4)\n#define GET_RX_STATUS_C2H_8814A(__pRxStatusDesc)\t\t\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 28, 1)\n#define GET_RX_STATUS_DESC_FCS_OK_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+8, 31, 1)\n\n//DWORD 3\n#define GET_RX_STATUS_DESC_RX_RATE_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 0, 7)\n#define GET_RX_STATUS_DESC_BSSID_FIT_H_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 7, 3)//20130415 KaiYuan add for 8814\n#define GET_RX_STATUS_DESC_HTC_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 10, 1)\n#define GET_RX_STATUS_DESC_EOSP_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 11, 1)\n#define GET_RX_STATUS_DESC_BSSID_FIT_L_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 12, 2)\n#define GET_RX_STATUS_DESC_DMA_AGG_NUM_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+12, 16, 8)//20130415 KaiYuan Check if it exist anymore\n#define GET_RX_STATUS_DESC_PATTERN_MATCH_8814A(__pRxStatusDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+12, 29, 1)\n#define GET_RX_STATUS_DESC_UNICAST_8814A(__pRxStatusDesc)\t\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+12, 30, 1)\n#define GET_RX_STATUS_DESC_MAGIC_WAKE_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pRxStatusDesc+12, 31, 1)\n\n//DWORD 4\n#define GET_RX_STATUS_DESC_PATTERN_IDX_8814A(__pRxStatusDesc)\t \t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+16, 0, 8)\n#define GET_RX_STATUS_DESC_RX_EOF_8814A(__pRxStatusDesc)\t \t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+16, 8, 1)\n#define GET_RX_STATUS_DESC_RX_SCRAMBLER_8814A(__pRxStatusDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+16, 9, 7)\n#define GET_RX_STATUS_DESC_RX_PRE_NDP_VLD_8814A(__pRxStatusDesc)\t \t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+16, 16, 1)\n#define GET_RX_STATUS_DESC_A1_FIT_8814A(__pRxStatusDesc)\t \t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+16, 24, 5)\n\n\n//DWORD 5\n#define GET_RX_STATUS_DESC_TSFL_8814A(__pRxStatusDesc)\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pRxStatusDesc+20, 0, 32)\n\n\n// Rx smooth factor\n#define Rx_Smooth_Factor (20)\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8814au_init_recv_priv(PADAPTER padapter);\nvoid rtl8814au_free_recv_priv(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8814ae_init_recv_priv(PADAPTER padapter);\nvoid rtl8814ae_free_recv_priv(PADAPTER padapter);\n#endif\n\n/* temp solution\n#ifdef CONFIG_SDIO_HCI\ns32 InitRecvPriv8821AS(PADAPTER padapter);\nvoid FreeRecvPriv8821AS(PADAPTER padapter);\n#endif // CONFIG_SDIO_HCI\n*/\n\nvoid rtl8814_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc);\n\n#endif /* __RTL8814A_RECV_H__ */\n\n"
  },
  {
    "path": "include/rtl8814a_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_RF_H__\n#define __RTL8814A_RF_H__\n\nVOID\nPHY_RF6052SetBandwidth8814A(\n\tIN\tPADAPTER\t\t\t\tAdapter,\n\tIN\tCHANNEL_WIDTH\t\tBandwidth);\n\n\nint\nPHY_RF6052_Config_8814A(\n\tIN\tPADAPTER\tAdapter\t);\n\n#endif//__RTL8188E_RF_H__\n\n"
  },
  {
    "path": "include/rtl8814a_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8814A_SPEC_H__\n#define __RTL8814A_SPEC_H__\n\n#include <drv_conf.h>\n\n\n//============================================================\n//\n//============================================================\n\n//-----------------------------------------------------\n//\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//\n//-----------------------------------------------------\n#define REG_SYS_ISO_CTRL_8814A\t\t\t0x0000\t// 2 Byte\n#define REG_SYS_FUNC_EN_8814A\t\t\t0x0002\t// 2 Byte\n#define REG_SYS_PW_CTRL_8814A\t\t\t0x0004\t// 4 Byte        \n#define REG_SYS_CLKR_8814A\t\t\t\t0x0008\t// 2 Byte\n#define REG_SYS_EEPROM_CTRL_8814A\t\t0x000A\t// 2 Byte        \n#define REG_EE_VPD_8814A\t\t\t\t0x000C\t// 2 Byte\n#define REG_SYS_SWR_CTRL1_8814A\t\t\t0x0010\t// 1 Byte\n#define REG_SPS0_CTRL_8814A\t\t\t\t0x0011\t// 7 Byte\n#define REG_SYS_SWR_CTRL3_8814A\t\t\t0x0018\t// 4 Byte\n#define REG_RSV_CTRL_8814A\t\t\t\t0x001C\t// 3 Byte\n#define REG_RF_CTRL0_8814A\t\t\t\t0x001F\t// 1 Byte\n#define REG_RF_CTRL1_8814A\t\t\t\t0x0020\t// 1 Byte\n#define REG_RF_CTRL2_8814A\t\t\t\t0x0021\t// 1 Byte\n#define REG_LPLDO_CTRL_8814A\t\t\t0x0023\t// 1 Byte\n#define REG_AFE_CTRL1_8814A\t\t\t\t0x0024\t// 4 Byte        \n#define REG_AFE_CTRL2_8814A\t\t\t\t0x0028\t// 4 Byte        \n#define REG_AFE_CTRL3_8814A\t\t\t\t0x002c \t// 4 Byte \n#define REG_EFUSE_CTRL_8814A\t\t\t0x0030\n#define REG_LDO_EFUSE_CTRL_8814A\t\t0x0034 \n#define REG_PWR_DATA_8814A\t\t\t\t0x0038\n#define REG_CAL_TIMER_8814A\t\t\t\t0x003C\n#define REG_ACLK_MON_8814A\t\t\t\t0x003E\n#define REG_GPIO_MUXCFG_8814A\t\t\t0x0040\n#define REG_GPIO_IO_SEL_8814A\t\t\t0x0042\n#define REG_MAC_PINMUX_CFG_8814A\t\t0x0043\n#define REG_GPIO_PIN_CTRL_8814A\t\t\t0x0044\n#define REG_GPIO_INTM_8814A\t\t\t\t0x0048\n#define REG_LEDCFG0_8814A\t\t\t\t0x004C\n#define REG_LEDCFG1_8814A\t\t\t\t0x004D\n#define REG_LEDCFG2_8814A\t\t\t\t0x004E\n#define REG_LEDCFG3_8814A\t\t\t\t0x004F\n#define REG_FSIMR_8814A\t\t\t\t\t0x0050\n#define REG_FSISR_8814A\t\t\t\t\t0x0054\n#define REG_HSIMR_8814A\t\t\t\t\t0x0058\n#define REG_HSISR_8814A\t\t\t\t\t0x005c\n#define REG_GPIO_EXT_CTRL_8814A\t\t\t0x0060\n#define REG_GPIO_STATUS_8814A\t\t\t0x006C\n#define REG_SDIO_CTRL_8814A\t\t\t\t0x0070\n#define REG_HCI_OPT_CTRL_8814A\t\t\t0x0074\n#define REG_RF_CTRL3_8814A\t\t\t\t0x0076\t// 1 Byte\n#define REG_AFE_CTRL4_8814A\t\t\t\t0x0078 \n#define REG_8051FW_CTRL_8814A\t\t\t0x0080 \n#define REG_HIMR0_8814A\t\t\t\t\t0x00B0\n#define REG_HISR0_8814A\t\t\t\t\t0x00B4\n#define REG_HIMR1_8814A\t\t\t\t\t0x00B8\n#define REG_HISR1_8814A\t\t\t\t\t0x00BC\n#define REG_SYS_CFG1_8814A\t\t\t\t0x00F0\n#define REG_SYS_CFG2_8814A\t\t\t\t0x00FC\n#define REG_SYS_CFG3_8814A\t\t\t\t0x1000\n\n//-----------------------------------------------------\n//\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//\n//-----------------------------------------------------\n#define REG_CR_8814A\t\t\t\t\t\t0x0100\n#define REG_PBP_8814A\t\t\t\t\t0x0104\n#define REG_PKT_BUFF_ACCESS_CTRL_8814A\t0x0106\n#define REG_TRXDMA_CTRL_8814A\t\t\t0x010C\n#define REG_TRXFF_BNDY_8814A\t\t\t0x0114\n#define REG_TRXFF_STATUS_8814A\t\t\t0x0118\n#define REG_RXFF_PTR_8814A\t\t\t\t0x011C\n#define REG_CPWM_8814A\t\t\t\t\t0x012F\n#define REG_FWIMR_8814A\t\t\t\t\t0x0130\n#define REG_FWISR_8814A\t\t\t\t\t0x0134\n#define REG_FTIMR_8814A\t\t\t\t\t0x0138\n#define REG_PKTBUF_DBG_CTRL_8814A\t\t0x0140\n#define REG_RXPKTBUF_CTRL_8814A\t\t0x0142\n#define REG_PKTBUF_DBG_DATA_L_8814A\t0x0144\n#define REG_PKTBUF_DBG_DATA_H_8814A\t0x0148\n\n#define REG_TC0_CTRL_8814A\t\t\t\t0x0150\n#define REG_TC1_CTRL_8814A\t\t\t\t0x0154\n#define REG_TC2_CTRL_8814A\t\t\t\t0x0158\n#define REG_TC3_CTRL_8814A\t\t\t\t0x015C\n#define REG_TC4_CTRL_8814A\t\t\t\t0x0160\n#define REG_TCUNIT_BASE_8814A\t\t\t0x0164\n#define REG_RSVD3_8814A\t\t\t\t\t0x0168\n#define REG_C2HEVT_MSG_NORMAL_8814A\t0x01A0\n#define REG_C2HEVT_CLEAR_8814A\t\t\t0x01AF\n#define REG_MCUTST_1_8814A\t\t\t\t0x01C0\n#define REG_MCUTST_WOWLAN_8814A\t\t0x01C7\n#define REG_FMETHR_8814A\t\t\t\t0x01C8\n#define REG_HMETFR_8814A\t\t\t\t0x01CC\n#define REG_HMEBOX_0_8814A\t\t\t\t0x01D0\n#define REG_HMEBOX_1_8814A\t\t\t\t0x01D4\n#define REG_HMEBOX_2_8814A\t\t\t\t0x01D8\n#define REG_HMEBOX_3_8814A\t\t\t\t0x01DC\n#define REG_LLT_INIT_8814A\t\t\t\t0x01E0\n#define REG_LLT_ADDR_8814A\t\t\t\t0x01E4 //20130415 KaiYuan add for 8814\n#define REG_HMEBOX_EXT0_8814A\t\t\t0x01F0\n#define REG_HMEBOX_EXT1_8814A\t\t\t0x01F4\n#define REG_HMEBOX_EXT2_8814A\t\t\t0x01F8\n#define REG_HMEBOX_EXT3_8814A\t\t\t0x01FC\n\n//-----------------------------------------------------\n//\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_FIFOPAGE_CTRL_1_8814A\t\t\t0x0200\n#define REG_FIFOPAGE_CTRL_2_8814A\t\t0x0204\n#define REG_AUTO_LLT_8814A\t\t\t\t\t0x0208\n#define REG_TXDMA_OFFSET_CHK_8814A\t0x020C\n#define REG_TXDMA_STATUS_8814A\t\t\t0x0210\n#define REG_RQPN_NPQ_8814A\t\t\t\t0x0214\n#define REG_TQPNT1_8814A\t\t\t\t\t0x0218\n#define REG_TQPNT2_8814A\t\t\t\t\t0x021C\n#define REG_TQPNT3_8814A\t\t\t\t\t0x0220\n#define REG_TQPNT4_8814A\t\t\t\t\t0x0224\n#define REG_RQPN_CTRL_1_8814A\t\t\t\t0x0228\n#define REG_RQPN_CTRL_2_8814A\t\t\t\t0x022C\n#define REG_FIFOPAGE_INFO_1_8814A\t\t\t0x0230\n#define REG_FIFOPAGE_INFO_2_8814A\t\t\t0x0234\n#define REG_FIFOPAGE_INFO_3_8814A\t\t\t0x0238\n#define REG_FIFOPAGE_INFO_4_8814A\t\t\t0x023C\n#define REG_FIFOPAGE_INFO_5_8814A\t\t\t0x0240\n\n\n//-----------------------------------------------------\n//\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//\n//-----------------------------------------------------\n#define REG_RXDMA_AGG_PG_TH_8814A\t\t0x0280\n#define REG_RXPKT_NUM_8814A\t\t\t\t0x0284 // The number of packets in RXPKTBUF.\n#define REG_RXDMA_CONTROL_8814A\t\t\t0x0286 // ?????? Control the RX DMA.\n#define REG_RXDMA_STATUS_8814A\t\t\t0x0288\n#define REG_RXDMA_MODE_8814A\t\t\t\t0x0290 // ??????\n#define REG_EARLY_MODE_CONTROL_8814A\t0x02BC // ??????\n#define REG_RSVD5_8814A\t\t\t\t\t0x02F0 // ??????\n\n\n//-----------------------------------------------------\n//\n//\t0x0300h ~ 0x03FFh\tPCIe\n//\n//-----------------------------------------------------\n#define\tREG_PCIE_CTRL_REG_8814A\t\t\t0x0300\n#define\tREG_INT_MIG_8814A\t\t\t\t0x0304\t// Interrupt Migration \n#define\tREG_BCNQ_TXBD_DESA_8814A\t\t0x0308\t// TX Beacon Descriptor Address\n#define\tREG_MGQ_TXBD_DESA_8814A\t\t\t0x0310\t// TX Manage Queue Descriptor Address\n#define\tREG_VOQ_TXBD_DESA_8814A\t\t\t0x0318\t// TX VO Queue Descriptor Address\n#define\tREG_VIQ_TXBD_DESA_8814A\t\t\t0x0320\t// TX VI Queue Descriptor Address\n#define\tREG_BEQ_TXBD_DESA_8814A\t\t\t0x0328\t// TX BE Queue Descriptor Address\n#define\tREG_BKQ_TXBD_DESA_8814A\t\t\t0x0330\t// TX BK Queue Descriptor Address\n#define\tREG_RXQ_RXBD_DESA_8814A\t\t\t0x0338\t// RX Queue\tDescriptor Address\n#define REG_HI0Q_TXBD_DESA_8814A\t\t0x0340\n#define REG_HI1Q_TXBD_DESA_8814A\t\t0x0348\n#define REG_HI2Q_TXBD_DESA_8814A\t\t0x0350\n#define REG_HI3Q_TXBD_DESA_8814A\t\t0x0358\n#define REG_HI4Q_TXBD_DESA_8814A\t\t0x0360\n#define REG_HI5Q_TXBD_DESA_8814A\t\t0x0368\n#define REG_HI6Q_TXBD_DESA_8814A\t\t0x0370\n#define REG_HI7Q_TXBD_DESA_8814A\t\t0x0378\n#define\tREG_MGQ_TXBD_NUM_8814A\t\t\t0x0380\n#define\tREG_RX_RXBD_NUM_8814A\t\t\t0x0382\n#define\tREG_VOQ_TXBD_NUM_8814A\t\t\t0x0384\n#define\tREG_VIQ_TXBD_NUM_8814A\t\t\t0x0386\n#define\tREG_BEQ_TXBD_NUM_8814A\t\t\t0x0388\n#define\tREG_BKQ_TXBD_NUM_8814A\t\t\t0x038A\n#define\tREG_HI0Q_TXBD_NUM_8814A\t\t\t0x038C\n#define\tREG_HI1Q_TXBD_NUM_8814A\t\t\t0x038E\n#define\tREG_HI2Q_TXBD_NUM_8814A\t\t\t0x0390\n#define\tREG_HI3Q_TXBD_NUM_8814A\t\t\t0x0392\n#define\tREG_HI4Q_TXBD_NUM_8814A\t\t\t0x0394\n#define\tREG_HI5Q_TXBD_NUM_8814A\t\t\t0x0396\n#define\tREG_HI6Q_TXBD_NUM_8814A\t\t\t0x0398\n#define\tREG_HI7Q_TXBD_NUM_8814A\t\t\t0x039A\n#define\tREG_TSFTIMER_HCI_8814A\t\t\t0x039C\n\n//Read Write Point\n#define\tREG_VOQ_TXBD_IDX_8814A\t\t\t0x03A0\n#define\tREG_VIQ_TXBD_IDX_8814A\t\t\t0x03A4\n#define\tREG_BEQ_TXBD_IDX_8814A\t\t\t0x03A8\n#define\tREG_BKQ_TXBD_IDX_8814A\t\t\t0x03AC\n#define\tREG_MGQ_TXBD_IDX_8814A\t\t\t0x03B0\n#define\tREG_RXQ_TXBD_IDX_8814A\t\t\t0x03B4\n#define\tREG_HI0Q_TXBD_IDX_8814A\t\t\t0x03B8\n#define\tREG_HI1Q_TXBD_IDX_8814A\t\t\t0x03BC\n#define\tREG_HI2Q_TXBD_IDX_8814A\t\t\t0x03C0\n#define\tREG_HI3Q_TXBD_IDX_8814A\t\t\t0x03C4\n#define\tREG_HI4Q_TXBD_IDX_8814A\t\t\t0x03C8\n#define\tREG_HI5Q_TXBD_IDX_8814A\t\t\t0x03CC\n#define\tREG_HI6Q_TXBD_IDX_8814A\t\t\t0x03D0\n#define\tREG_HI7Q_TXBD_IDX_8814A\t\t\t0x03D4\n#define REG_DBG_SEL_V1_8814A\t\t\t\t0x03D8\n#define REG_PCIE_HRPWM1_V1_8814A\t\t\t0x03D9\n#define REG_PCIE_HCPWM1_V1_8814A\t\t\t0x03DA\n#define REG_PCIE_CTRL2_8814A\t\t\t\t0x03DB\n#define REG_PCIE_HRPWM2_V1_8814A\t\t\t0x03DC\n#define REG_PCIE_HCPWM2_V1_8814A\t\t\t0x03DE\n#define REG_PCIE_H2C_MSG_V1_8814A\t\t0x03E0\n#define REG_PCIE_C2H_MSG_V1_8814A\t\t0x03E4\n#define REG_DBI_WDATA_V1_8814A\t\t\t0x03E8\n#define REG_DBI_RDATA_V1_8814A\t\t\t0x03EC\n#define REG_DBI_FLAG_V1_8814A\t\t\t\t0x03F0\n#define REG_MDIO_V1_8814A\t\t\t\t\t0x03F4\n#define REG_PCIE_MIX_CFG_8814A\t\t\t0x03F8\n#define REG_DBG_8814A\t\t\t\t\t\t0x03FC\n//-----------------------------------------------------\n//\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//\n//-----------------------------------------------------\n#define REG_VOQ_INFORMATION_8814A\t\t0x0400\n#define REG_VIQ_INFORMATION_8814A\t\t0x0404\n#define REG_BEQ_INFORMATION_8814A\t\t0x0408\n#define REG_BKQ_INFORMATION_8814A\t\t0x040C\n#define REG_MGQ_INFORMATION_8814A\t\t0x0410\n#define REG_HGQ_INFORMATION_8814A\t\t0x0414\n#define REG_BCNQ_INFORMATION_8814A\t0x0418\n#define REG_TXPKT_EMPTY_8814A\t\t\t0x041A\n#define REG_CPU_MGQ_INFORMATION_8814A\t0x041C\n#define REG_FWHW_TXQ_CTRL_8814A\t\t0x0420\n#define REG_HWSEQ_CTRL_8814A\t\t\t0x0423\n#define REG_TXPKTBUF_BCNQ_BDNY_8814A\t0x0424\n//#define REG_MGQ_BDNY_8814A\t\t\t\t0x0425\n#define REG_LIFETIME_EN_8814A\t\t\t\t0x0426\n//#define REG_FW_FREE_TAIL_8814A\t\t\t0x0427\n#define REG_SPEC_SIFS_8814A\t\t\t\t0x0428\n#define REG_RETRY_LIMIT_8814A\t\t\t\t0x042A\n#define REG_TXBF_CTRL_8814A\t\t\t\t0x042C\n#define REG_DARFRC_8814A\t\t\t\t0x0430\n#define REG_RARFRC_8814A\t\t\t\t0x0438\n#define REG_RRSR_8814A\t\t\t\t\t0x0440\n#define REG_ARFR0_8814A\t\t\t\t\t0x0444\n#define REG_ARFR1_8814A\t\t\t\t\t0x044C\n#define REG_CCK_CHECK_8814A\t\t\t\t0x0454\n#define REG_AMPDU_MAX_TIME_8814A\t\t\t0x0455\n#define REG_TXPKTBUF_BCNQ1_BDNY_8814A\t0x0456\n#define REG_AMPDU_MAX_LENGTH_8814A\t0x0458\n#define REG_ACQ_STOP_8814A\t\t\t\t0x045C\n#define REG_NDPA_RATE_8814A\t\t\t\t0x045D\n#define REG_TX_HANG_CTRL_8814A\t\t\t0x045E\n#define REG_NDPA_OPT_CTRL_8814A\t\t0x045F\n#define REG_FAST_EDCA_CTRL_8814A\t\t0x0460\n#define REG_RD_RESP_PKT_TH_8814A\t\t0x0463\n#define REG_CMDQ_INFO_8814A \t\t\t\t0x0464\n#define REG_Q4_INFO_8814A \t\t\t\t\t0x0468\n#define REG_Q5_INFO_8814A \t\t\t\t\t0x046C\n#define REG_Q6_INFO_8814A \t\t\t\t\t0x0470\n#define REG_Q7_INFO_8814A \t\t\t\t\t0x0474\n#define REG_WMAC_LBK_BUF_HD_8814A\t\t0x0478\n#define REG_MGQ_PGBNDY_8814A \t\t\t\t0x047A\n#define REG_INIRTS_RATE_SEL_8814A \t\t\t0x0480\n#define REG_BASIC_CFEND_RATE_8814A \t\t0x0481\n#define REG_STBC_CFEND_RATE_8814A \t\t0x0482\n#define REG_DATA_SC_8814A\t\t\t\t\t0x0483\n#define REG_MACID_SLEEP3_8814A \t\t\t0x0484\n#define REG_MACID_SLEEP1_8814A \t\t\t0x0488\n#define REG_ARFR2_8814A \t\t\t\t\t0x048C\n#define REG_ARFR3_8814A \t\t\t\t\t0x0494\n#define REG_ARFR4_8814A \t\t\t\t\t0x049C\n#define REG_ARFR5_8814A \t\t\t\t\t0x04A4\n#define REG_TXRPT_START_OFFSET_8814A\t\t0x04AC\n#define REG_TRYING_CNT_TH_8814A \t\t\t0x04B0\n#define REG_POWER_STAGE1_8814A\t\t0x04B4\n#define REG_POWER_STAGE2_8814A\t\t0x04B8\n#define REG_SW_AMPDU_BURST_MODE_CTRL_8814A\t0x04BC\n#define REG_PKT_LIFE_TIME_8814A\t\t\t0x04C0\n#define REG_PKT_BE_BK_LIFE_TIME_8814A\t\t0x04C2 // ??????\n#define REG_STBC_SETTING_8814A\t\t\t0x04C4\n#define REG_STBC_8814A\t\t\t\t\t\t0x04C5\n#define REG_QUEUE_CTRL_8814A \t\t\t\t0x04C6\n#define REG_SINGLE_AMPDU_CTRL_8814A \t\t0x04C7\n#define REG_PROT_MODE_CTRL_8814A\t\t0x04C8\n#define REG_MAX_AGGR_NUM_8814A\t\t0x04CA\n#define REG_RTS_MAX_AGGR_NUM_8814A\t0x04CB\n#define REG_BAR_MODE_CTRL_8814A\t\t0x04CC\n#define REG_RA_TRY_RATE_AGG_LMT_8814A\t0x04CF\n#define REG_MACID_SLEEP2_8814A\t\t\t0x04D0\n#define REG_MACID_SLEEP0_8814A\t\t\t0x04D4\n#define REG_HW_SEQ0_8814A \t\t\t\t0x04D8\n#define REG_HW_SEQ1_8814A \t\t\t\t0x04DA\n#define REG_HW_SEQ2_8814A \t\t\t\t0x04DC\n#define REG_HW_SEQ3_8814A \t\t\t\t0x04DE\n#define REG_NULL_PKT_STATUS_8814A \t\t\t0x04E0\n#define REG_PTCL_ERR_STATUS_8814A \t\t\t0x04E2\n#define REG_DROP_PKT_NUM_8814A \t\t\t0x04EC\n#define REG_PTCL_TX_RPT_8814A \t\t\t\t0x04F0\n#define REG_Dummy_8814A \t\t\t\t\t0x04FC\n\n\n//-----------------------------------------------------\n//\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//\n//-----------------------------------------------------\n#define REG_EDCA_VO_PARAM_8814A\t\t\t0x0500\n#define REG_EDCA_VI_PARAM_8814A\t\t\t0x0504\n#define REG_EDCA_BE_PARAM_8814A\t\t\t0x0508\n#define REG_EDCA_BK_PARAM_8814A\t\t\t0x050C\n#define REG_BCNTCFG_8814A\t\t\t\t\t0x0510\n#define REG_PIFS_8814A\t\t\t\t\t\t0x0512\n#define REG_RDG_PIFS_8814A\t\t\t\t\t0x0513\n#define REG_SIFS_CTX_8814A\t\t\t\t\t0x0514\n#define REG_SIFS_TRX_8814A\t\t\t\t\t0x0516\n#define REG_AGGR_BREAK_TIME_8814A\t\t\t0x051A\n#define REG_SLOT_8814A\t\t\t\t\t\t0x051B\n#define REG_TX_PTCL_CTRL_8814A\t\t\t\t0x0520\n#define REG_TXPAUSE_8814A\t\t\t\t\t0x0522\n#define REG_DIS_TXREQ_CLR_8814A\t\t\t0x0523\n#define REG_RD_CTRL_8814A\t\t\t\t\t0x0524\n//\n// Format for offset 540h-542h:\n//\t[3:0]:   TBTT prohibit setup in unit of 32us. The time for HW getting beacon content before TBTT.\n//\t[7:4]:   Reserved.\n//\t[19:8]:  TBTT prohibit hold in unit of 32us. The time for HW holding to send the beacon packet.\n//\t[23:20]: Reserved\n// Description:\n//\t              |\n//     |<--Setup--|--Hold------------>|\n//\t--------------|----------------------\n//                |\n//               TBTT\n// Note: We cannot update beacon content to HW or send any AC packets during the time between Setup and Hold.\n// Described by Designer Tim and Bruce, 2011-01-14.\n//\n#define REG_TBTT_PROHIBIT_8814A\t\t\t0x0540\n#define REG_RD_NAV_NXT_8814A\t\t\t\t0x0544\n#define REG_NAV_PROT_LEN_8814A\t\t\t0x0546\n#define REG_BCN_CTRL_8814A\t\t\t\t\t0x0550\n#define REG_BCN_CTRL_1_8814A\t\t\t\t0x0551\n#define REG_MBID_NUM_8814A\t\t\t\t0x0552\n#define REG_DUAL_TSF_RST_8814A\t\t\t\t0x0553\n#define REG_MBSSID_BCN_SPACE_8814A\t\t0x0554\n#define REG_DRVERLYINT_8814A\t\t\t\t0x0558\n#define REG_BCNDMATIM_8814A\t\t\t\t0x0559\n#define REG_ATIMWND_8814A\t\t\t\t\t0x055A\n#define REG_USTIME_TSF_8814A\t\t\t\t0x055C\n#define REG_BCN_MAX_ERR_8814A\t\t\t\t0x055D\n#define REG_RXTSF_OFFSET_CCK_8814A\t\t0x055E\n#define REG_RXTSF_OFFSET_OFDM_8814A\t\t0x055F\t\n#define REG_TSFTR_8814A\t\t\t\t\t\t0x0560\n#define REG_CTWND_8814A\t\t\t\t\t0x0572\n#define REG_SECONDARY_CCA_CTRL_8814A\t\t0x0577 // ??????\n#define REG_PSTIMER_8814A\t\t\t\t\t0x0580\n#define REG_TIMER0_8814A\t\t\t\t\t0x0584\n#define REG_TIMER1_8814A\t\t\t\t\t0x0588\n#define REG_BCN_PREDL_ITV_8814A\t\t\t0x058F\t//Pre download beacon interval\n#define REG_ACMHWCTRL_8814A\t\t\t\t0x05C0\n#define REG_P2P_RST_8814A\t\t\t\t0x05F0\n\n//-----------------------------------------------------\n//\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//\n//-----------------------------------------------------\n#define REG_MAC_CR_8814A\t\t\t\t\t0x0600\n#define REG_TCR_8814A\t\t\t\t\t\t0x0604\n#define REG_RCR_8814A\t\t\t\t\t\t0x0608\n#define REG_RX_PKT_LIMIT_8814A\t\t\t\t0x060C\n#define REG_RX_DLK_TIME_8814A\t\t\t\t0x060D\n#define REG_RX_DRVINFO_SZ_8814A\t\t\t0x060F\n\n#define REG_MACID_8814A\t\t\t\t\t0x0610\n#define REG_BSSID_8814A\t\t\t\t\t\t0x0618\n#define REG_MAR_8814A\t\t\t\t\t\t0x0620\n#define REG_MBIDCAMCFG_8814A\t\t\t\t0x0628\n\n#define REG_USTIME_EDCA_8814A\t\t\t\t0x0638\n#define REG_MAC_SPEC_SIFS_8814A\t\t\t0x063A\n#define REG_RESP_SIFP_CCK_8814A\t\t\t0x063C\n#define REG_RESP_SIFS_OFDM_8814A\t\t\t0x063E\n#define REG_ACKTO_8814A\t\t\t\t\t0x0640\n#define REG_CTS2TO_8814A\t\t\t\t\t0x0641\n#define REG_EIFS_8814A\t\t\t\t\t\t0x0642\n\n#define\tREG_NAV_UPPER_8814A\t\t\t\t0x0652\t// unit of 128\n#define REG_TRXPTCL_CTL_8814A\t\t\t\t0x0668\n\n// Security\n#define REG_CAMCMD_8814A\t\t\t\t\t0x0670\n#define REG_CAMWRITE_8814A\t\t\t\t0x0674\n#define REG_CAMREAD_8814A\t\t\t\t\t0x0678\n#define REG_CAMDBG_8814A\t\t\t\t\t0x067C\n#define REG_SECCFG_8814A\t\t\t\t\t0x0680\n\n// Power\n#define REG_WOW_CTRL_8814A\t\t\t\t0x0690\n#define REG_PS_RX_INFO_8814A\t\t\t\t0x0692\n#define REG_UAPSD_TID_8814A\t\t\t\t0x0693\n#define REG_WKFMCAM_NUM_8814A\t\t\t0x0698\n#define REG_RXFLTMAP0_8814A\t\t\t\t0x06A0\n#define REG_RXFLTMAP1_8814A\t\t\t\t0x06A2\n#define REG_RXFLTMAP2_8814A\t\t\t\t0x06A4\n#define REG_BCN_PSR_RPT_8814A\t\t\t\t0x06A8\n#define REG_BT_COEX_TABLE_8814A\t\t\t0x06C0\n#define REG_TX_DATA_RSP_RATE_8814A\t\t0x06DE\n#define REG_ASSOCIATED_BFMER0_INFO_8814A\t0x06E4\n#define REG_ASSOCIATED_BFMER1_INFO_8814A\t0x06EC\n#define REG_CSI_RPT_PARAM_BW20_8814A\t\t0x06F4\n#define REG_CSI_RPT_PARAM_BW40_8814A\t\t0x06F8\n#define REG_CSI_RPT_PARAM_BW80_8814A\t\t0x06FC\n\n// Hardware Port 2\n#define REG_MACID1_8814A\t\t\t\t\t0x0700\n#define REG_BSSID1_8814A\t\t\t\t\t0x0708\n// Hardware Port 3\n#define REG_MACID2_8814A\t\t\t\t\t0x1620\n#define REG_BSSID2_8814A\t\t\t\t\t0x1628\n// Hardware Port 4\n#define REG_MACID3_8814A\t\t\t\t\t0x1630\n#define REG_BSSID3_8814A\t\t\t\t\t0x1638\n// Hardware Port 5\n#define REG_MACID4_8814A\t\t\t\t\t0x1640\n#define REG_BSSID4_8814A\t\t\t\t\t0x1648\n\n#define REG_ASSOCIATED_BFMEE_SEL_8814A\t0x0714\n#define REG_SND_PTCL_CTRL_8814A\t\t\t0x0718\n#define REG_IQ_DUMP_8814A\t\t\t\t\t0x07C0\n\n/**** page 19 ****/\n//TX BeamForming\n#define\tREG_BB_TXBF_ANT_SET_BF1\t\t\t\t0x19ac\n#define\tREG_BB_TXBF_ANT_SET_BF0\t\t\t\t0x19b4\n\n//\t0x1200h ~ 0x12FFh\tDDMA CTRL\n//\n//-----------------------------------------------------\n#define REG_DDMA_CH0SA                   0x1200\n#define REG_DDMA_CH0DA                   0x1204\n#define REG_DDMA_CH0CTRL                0x1208\n#define REG_DDMA_CH1SA                   0x1210\n#define REG_DDMA_CH1DA                \t0x1214\n#define REG_DDMA_CH1CTRL                0x1218\n#define REG_DDMA_CH2SA                   0x1220\n#define REG_DDMA_CH2DA                   0x1224\n#define REG_DDMA_CH2CTRL                0x1228\n#define REG_DDMA_CH3SA                   0x1230\n#define REG_DDMA_CH3DA                   0x1234\n#define REG_DDMA_CH3CTRL                0x1238\n#define REG_DDMA_CH4SA                   0x1240\n#define REG_DDMA_CH4DA                   0x1244\n#define REG_DDMA_CH4CTRL                0x1248\n#define REG_DDMA_CH5SA                   0x1250\n#define REG_DDMA_CH5DA                   0x1254\n#define REG_DDMA_CH5CTRL                0x1258\n#define REG_DDMA_INT_MSK                0x12E0\n#define REG_DDMA_CHSTATUS              0x12E8\n#define REG_DDMA_CHKSUM                 0x12F0\n#define REG_DDMA_MONITER                0x12FC\n\n#define DDMA_LEN_MASK              \t \t0x0001FFFF\n#define FW_CHKSUM_DUMMY_SZ\t\t8\n#define DDMA_CH_CHKSUM_CNT\t\tBIT(24)\n#define DDMA_RST_CHKSUM_STS\t\tBIT(25)\n#define DDMA_MODE_BLOCK_CPU\t\tBIT(26)\n#define DDMA_CHKSUM_FAIL\t\t\tBIT(27)\n#define DDMA_DA_W_DISABLE\t\t\tBIT(28)\n#define DDMA_CHKSUM_EN\t\t\tBIT(29)\n#define DDMA_CH_OWN                 \tBIT(31)\n\n\n//3081 FWDL\n#define FWDL_EN                 BIT0\n#define IMEM_BOOT_DL_RDY        BIT1\n#define IMEM_BOOT_CHKSUM_FAIL   BIT2\n#define IMEM_DL_RDY             BIT3\n#define IMEM_CHKSUM_OK        BIT4\n#define DMEM_DL_RDY             BIT5\n#define DMEM_CHKSUM_OK        BIT6\n#define EMEM_DL_RDY             BIT7\n#define EMEM_CHKSUM_FAIL        BIT8\n#define EMEM_TXBUF_DL_RDY       BIT9\n#define EMEM_TXBUF_CHKSUM_FAIL  BIT10\n#define CPU_CLK_SWITCH_BUSY     BIT11\n#define CPU_CLK_SEL             (BIT12|BIT13)\n#define FWDL_OK                 BIT14\n#define FW_INIT_RDY             BIT15\n#define R_EN_BOOT_FLASH         BIT20\n\n#define OCPBASE_IMEM_3081        0x00000000\n#define OCPBASE_DMEM_3081        0x00200000 \n#define OCPBASE_RPTBUF_3081      0x18660000\n#define OCPBASE_RXBUF2_3081      0x18680000\n#define OCPBASE_RXBUF_3081       0x18700000\n#define OCPBASE_TXBUF_3081       0x18780000\n\n\n#define REG_FAST_EDCA_VOVI_SETTING_8814A 0x1448\n#define REG_FAST_EDCA_BEBK_SETTING_8814A 0x144C\n\n\n//-----------------------------------------------------\n//\n\n\n//-----------------------------------------------------\n//\n//\tRedifine 8192C register definition for compatibility\n//\n//-----------------------------------------------------\n\n// TODO: use these definition when using REG_xxx naming rule.\n// NOTE: DO NOT Remove these definition. Use later.\n#define\tEFUSE_CTRL_8814A\t\t\t\t\tREG_EFUSE_CTRL_8814A\t\t// E-Fuse Control.\n#define\tEFUSE_TEST_8814A\t\t\t\t\tREG_LDO_EFUSE_CTRL_8814A\t\t// E-Fuse Test.\n#define\tMSR_8814A\t\t\t\t\t\t\t(REG_CR_8814A + 2)\t\t// Media Status register\n#define\tISR_8814A\t\t\t\t\t\t\tREG_HISR0_8814A\n#define\tTSFR_8814A\t\t\t\t\t\t\tREG_TSFTR_8814A\t\t\t// Timing Sync Function Timer Register.\n\t\t\t\t\t\n#define PBP_8814A\t\t\t\t\t\t\tREG_PBP_8814A\n\n// Redifine MACID register, to compatible prior ICs.\n#define\tIDR0_8814A\t\t\t\t\t\t\tREG_MACID_8814A\t\t\t// MAC ID Register, Offset 0x0050-0x0053\n#define\tIDR4_8814A\t\t\t\t\t\t\t(REG_MACID_8814A + 4)\t// MAC ID Register, Offset 0x0054-0x0055\n\n\n//\n// 9. Security Control Registers\t(Offset: )\n//\n#define\tRWCAM_8814A\t\t\t\t\t\tREG_CAMCMD_8814A\t\t//IN 8190 Data Sheet is called CAMcmd\n#define\tWCAMI_8814A\t\t\t\t\t\tREG_CAMWRITE_8814A\t\t// Software write CAM input content\n#define\tRCAMO_8814A\t\t\t\t\t\tREG_CAMREAD_8814A\t\t// Software read/write CAM config\n#define\tCAMDBG_8814A\t\t\t\t\t\tREG_CAMDBG_8814A\n#define\tSECR_8814A\t\t\t\t\t\t\tREG_SECCFG_8814A\t\t//Security Configuration Register\n\n\n//----------------------------------------------------------------------------\n//       8195 IMR/ISR bits\t\t\t\t\t\t(offset 0xB0,  8bits)\n//----------------------------------------------------------------------------\n#define\tIMR_DISABLED_8814A\t\t\t\t\t0\n// IMR DW0(0x00B0-00B3) Bit 0-31\n#define\tIMR_TIMER2_8814A\t\t\t\t\tBIT31\t\t// Timeout interrupt 2\n#define\tIMR_TIMER1_8814A\t\t\t\t\tBIT30\t\t// Timeout interrupt 1\t\n#define\tIMR_PSTIMEOUT_8814A\t\t\t\tBIT29\t\t// Power Save Time Out Interrupt\n#define\tIMR_GTINT4_8814A\t\t\t\t\tBIT28\t\t// When GTIMER4 expires, this bit is set to 1\t\n#define\tIMR_GTINT3_8814A\t\t\t\t\tBIT27\t\t// When GTIMER3 expires, this bit is set to 1\t\n#define\tIMR_TXBCN0ERR_8814A\t\t\t\tBIT26\t\t// Transmit Beacon0 Error\t\t\t\n#define\tIMR_TXBCN0OK_8814A\t\t\t\t\tBIT25\t\t// Transmit Beacon0 OK\t\t\t\n#define\tIMR_TSF_BIT32_TOGGLE_8814A\t\tBIT24\t\t// TSF Timer BIT32 toggle indication interrupt\t\t\t\n#define\tIMR_BCNDMAINT0_8814A\t\t\t\tBIT20\t\t// Beacon DMA Interrupt 0\t\t\t\n#define\tIMR_BCNDERR0_8814A\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK0\t\t\t\n#define\tIMR_HSISR_IND_ON_INT_8814A\t\tBIT15\t\t// HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1)\n#define\tIMR_BCNDMAINT_E_8814A\t\t\t\tBIT14\t\t// Beacon DMA Interrupt Extension for Win7\t\t\t\n#define\tIMR_ATIMEND_8814A\t\t\t\t\tBIT12\t\t// CTWidnow End or ATIM Window End\n#define\tIMR_C2HCMD_8814A\t\t\t\t\tBIT10\t\t// CPU to Host Command INT Status, Write 1 clear\t\n#define\tIMR_CPWM2_8814A\t\t\t\t\tBIT9\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_CPWM_8814A\t\t\t\t\t\tBIT8\t\t\t// CPU power Mode exchange INT Status, Write 1 clear\t\n#define\tIMR_HIGHDOK_8814A\t\t\t\t\tBIT7\t\t\t// High Queue DMA OK\t\n#define\tIMR_MGNTDOK_8814A\t\t\t\t\tBIT6\t\t\t// Management Queue DMA OK\t\n#define\tIMR_BKDOK_8814A\t\t\t\t\tBIT5\t\t\t// AC_BK DMA OK\t\t\n#define\tIMR_BEDOK_8814A\t\t\t\t\tBIT4\t\t\t// AC_BE DMA OK\t\n#define\tIMR_VIDOK_8814A\t\t\t\t\tBIT3\t\t\t// AC_VI DMA OK\t\t\n#define\tIMR_VODOK_8814A\t\t\t\t\tBIT2\t\t\t// AC_VO DMA OK\t\n#define\tIMR_RDU_8814A\t\t\t\t\t\tBIT1\t\t\t// Rx Descriptor Unavailable\t\n#define\tIMR_ROK_8814A\t\t\t\t\t\tBIT0\t\t\t// Receive DMA OK\n\n// IMR DW1(0x00B4-00B7) Bit 0-31\n#define\tIMR_MCUERR_8814A\t\t\t\t\t\tBIT28\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT7_8814A\t\t\t\tBIT27\t\t// Beacon DMA Interrupt 7\n#define\tIMR_BCNDMAINT6_8814A\t\t\t\tBIT26\t\t// Beacon DMA Interrupt 6\n#define\tIMR_BCNDMAINT5_8814A\t\t\t\tBIT25\t\t// Beacon DMA Interrupt 5\n#define\tIMR_BCNDMAINT4_8814A\t\t\t\tBIT24\t\t// Beacon DMA Interrupt 4\n#define\tIMR_BCNDMAINT3_8814A\t\t\t\tBIT23\t\t// Beacon DMA Interrupt 3\n#define\tIMR_BCNDMAINT2_8814A\t\t\t\tBIT22\t\t// Beacon DMA Interrupt 2\n#define\tIMR_BCNDMAINT1_8814A\t\t\t\tBIT21\t\t// Beacon DMA Interrupt 1\n#define\tIMR_BCNDOK7_8814A\t\t\t\t\tBIT20\t\t// Beacon Queue DMA OK Interrup 7\n#define\tIMR_BCNDOK6_8814A\t\t\t\t\tBIT19\t\t// Beacon Queue DMA OK Interrup 6\n#define\tIMR_BCNDOK5_8814A\t\t\t\t\tBIT18\t\t// Beacon Queue DMA OK Interrup 5\n#define\tIMR_BCNDOK4_8814A\t\t\t\t\tBIT17\t\t// Beacon Queue DMA OK Interrup 4\n#define\tIMR_BCNDOK3_8814A\t\t\t\t\tBIT16\t\t// Beacon Queue DMA OK Interrup 3\n#define\tIMR_BCNDOK2_8814A\t\t\t\t\tBIT15\t\t// Beacon Queue DMA OK Interrup 2\n#define\tIMR_BCNDOK1_8814A\t\t\t\t\tBIT14\t\t// Beacon Queue DMA OK Interrup 1\n#define\tIMR_ATIMEND_E_8814A\t\t\t\tBIT13\t\t// ATIM Window End Extension for Win7\n#define\tIMR_TXERR_8814A\t\t\t\t\tBIT11\t\t// Tx Error Flag Interrupt Status, write 1 clear.\n#define\tIMR_RXERR_8814A\t\t\t\t\tBIT10\t\t// Rx Error Flag INT Status, Write 1 clear\n#define\tIMR_TXFOVW_8814A\t\t\t\t\tBIT9\t\t\t// Transmit FIFO Overflow\n#define\tIMR_RXFOVW_8814A\t\t\t\t\tBIT8\t\t\t// Receive FIFO Overflow\n\n\n#ifdef CONFIG_PCI_HCI\n#define IMR_TX_MASK\t\t\t(IMR_VODOK_8814A | IMR_VIDOK_8814A | IMR_BEDOK_8814A | IMR_BKDOK_8814A | IMR_MGNTDOK_8814A | IMR_HIGHDOK_8814A)\n\n#define RT_BCN_INT_MASKS\t(IMR_BCNDMAINT0_8814A | IMR_TXBCN0OK_8814A | IMR_TXBCN0ERR_8814A | IMR_BCNDERR0_8814A)\n\n#define RT_AC_INT_MASKS\t(IMR_VIDOK_8814A | IMR_VODOK_8814A | IMR_BEDOK_8814A | IMR_BKDOK_8814A)\n#endif\n\n\n/*===================================================================\n=====================================================================\nHere the register defines are for 92C. When the define is as same with 92C, \nwe will use the 92C's define for the consistency\nSo the following defines for 92C is not entire!!!!!!\n=====================================================================\n=====================================================================*/\n\n\n//-----------------------------------------------------\n//\n//\t0xFE00h ~ 0xFE55h\tUSB Configuration\n//\n//-----------------------------------------------------\n\n//2 Special Option\n#define USB_AGG_EN_8814A\t\t\tBIT(7)\n#define REG_USB_HRPWM_U3\t\t\t0xF052\n\n#define LAST_ENTRY_OF_TX_PKT_BUFFER_8814A       2048-1\t//20130415 KaiYuan add for 8814\n\n#define MACID_NUM_8814A 128\n#define SEC_CAM_ENT_NUM_8814A 64\n#define NSS_NUM_8814A 3\n#define BAND_CAP_8814A (BAND_CAP_2G | BAND_CAP_5G)\n#define BW_CAP_8814A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)\n\n#endif //__RTL8814A_SPEC_H__\n"
  },
  {
    "path": "include/rtl8814a_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL88814A_SRESET_H_\n#define _RTL8814A_SRESET_H_\n\n#include <rtw_sreset.h>\n\n#ifdef DBG_CONFIG_ERROR_DETECT\nextern void rtl8814_sreset_xmit_status_check(_adapter *padapter);\nextern void rtl8814_sreset_linked_status_check(_adapter *padapter);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/rtl8814a_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8814A_XMIT_H__\n#define __RTL8814A_XMIT_H__\n\ntypedef struct txdescriptor_8814\n{\n\t// Offset 0\n\tu32 pktlen:16;\n\tu32 offset:8;\n\tu32 bmc:1;\n\tu32 htc:1;\n\tu32 ls:1;\n}TXDESC_8814, *PTXDESC_8814;\n\n\n#define OFFSET_SZ\t0\n#define OFFSET_SHT\t16\n\n\n\n#ifdef CONFIG_SDIO_HCI\n#define SET_TX_DESC_SDIO_TXSEQ_8814A(__pTxDesc, __Value)\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 16, 8, __Value)\n#endif //CONFIG_SDIO_HCI\n\n//-----------------------------------------------------------------\n//\tRTL8814A TX BUFFER DESC\n//-----------------------------------------------------------------\n/*\n- Each TXBD has 4 segment.\n -- For 32 bit, each segment is 8 bytes.\n -- For 64 bit, each segment is 16 bytes.\n*/\n#if 0\n#if 1 /* 32 bit */\n#define SET_TX_EXTBUFF_DESC_LEN_8814A(__pTxDesc, __Value, __Set) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Set*8), 0, 16, __Value)\n#define SET_TX_EXTBUFF_DESC_ADDR_LOW_8814A(__pTxDesc, __Value, __Set) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Set*8)+4, 0, 32, __Value)\n#else /* 64 bit */\n#define SET_TX_EXTBUFF_DESC_LEN_8814A(__pTxDesc, __Value, __Set) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Set*16), 0, 16, __Value)\n#define SET_TX_EXTBUFF_DESC_ADDR_LOW_8814A(__pTxDesc, __Value, __Set) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Set*16)+4, 0, 32, __Value)\n#endif\n#define SET_TX_EXTBUFF_DESC_ADDR_HIGH_8814A(__pTxDesc, __Value, __Set) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Set*16)+8, 0, 32, __Value)\n#endif\n/*c2h-DWORD 2*/\n#define GET_RX_STATUS_DESC_RPT_SEL_8814A(__pRxDesc)\t\t\tLE_BITS_TO_4BYTE(__pRxDesc+8, 28, 1)\n\n//=========================================================\n// for Txfilldescroptor8814Ae, fill the desc content.\n#if 1 /* 32 bit */\n#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*8), 0, 16, __Valeu)\n#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*8), 31, 1, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*8)+4, 0, 32, __Valeu)\n#else /* 64 bit */\n#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*16), 0, 16, __Valeu)\n#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*16), 31, 1, __Valeu)\n#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*16)+4, 0, 32, __Valeu)\n#endif\n#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+((__Offset)*16)+8, 0, 32, __Valeu)\n\n//=========================================================\n\n//TX buffer \n//=============\n// Dword 0\n#define SET_TX_BUFF_DESC_LEN_0_8814A(__pTxDesc, __Valeu) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Valeu)\n#define SET_TX_BUFF_DESC_PSB_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 15, __Value)\n#define SET_TX_BUFF_DESC_OWN_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n#define GET_TX_BUFF_DESC_OWN_8814A(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE(__pTxDesc, 31, 1)\n\n// Dword 1\n#define SET_TX_BUFF_DESC_ADDR_LOW_0_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value)\n#define GET_TX_BUFF_DESC_ADDR_LOW_0_8814A(__pTxDesc)\t\t\tLE_BITS_TO_4BYTE(__pTxDesc+4, 0, 32)\n// Dword 2\n#define SET_TX_BUFF_DESC_ADDR_HIGH_0_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value)\n#define GET_TX_BUFF_DESC_ADDR_HIGH_0_8814A(__pTxDesc)\t\t\tLE_BITS_TO_4BYTE(__pTxDesc+8, 0, 32)\n// Dword 3 //RESERVED 0\n\n#if 0 /* 64 bit */\n// Dword 4\n#define SET_TX_BUFF_DESC_LEN_1_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 16, __Value)\n#define SET_TX_BUFF_DESC_AMSDU_1_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+16, 31, 1, __Value)\n// Dword 5\n#define SET_TX_BUFF_DESC_ADDR_LOW_1_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 32, __Value)\n// Dword 6\n#define SET_TX_BUFF_DESC_ADDR_HIGH_1_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 32, __Value)\n// Dword 7 //RESERVED 0\n// Dword 8\n#define SET_TX_BUFF_DESC_LEN_2_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 0, 16, __Value)\n#define SET_TX_BUFF_DESC_AMSDU_2_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 31, 1, __Value)\n// Dword 9\n#define SET_TX_BUFF_DESC_ADDR_LOW_2_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 0, 32, __Value)\n// Dword 10\n#define SET_TX_BUFF_DESC_ADDR_HIGH_2_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)\n// Dword 11 //RESERVED 0\n// Dword 12\n#define SET_TX_BUFF_DESC_LEN_3_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 16, __Value)\n#define SET_TX_BUFF_DESC_AMSDU_3_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+48, 31, 1, __Value)\n// Dword 13\n#define SET_TX_BUFF_DESC_ADDR_LOW_3_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+52, 0, 32, __Value)\n// Dword 14\n#define SET_TX_BUFF_DESC_ADDR_HIGH_3_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+56, 0, 32, __Value)\n// Dword 15 //RESERVED 0\n#endif\n\n//=====Desc content\n//TX Info\n//=============\n// Dword 0\n#define SET_TX_DESC_PKT_SIZE_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)\n#define GET_TX_DESC_PKT_SIZE_8814A(__pTxDesc)\t\t\t\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pTxDesc, 0, 16)\n#define SET_TX_DESC_OFFSET_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)\n#define GET_TX_DESC_OFFSET_8814A(__pTxDesc)\t\t\t\t\t\t\t\t\tLE_BITS_TO_4BYTE( __pTxDesc, 16, 8)\n#define SET_TX_DESC_BMC_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)\n#define SET_TX_DESC_HTC_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)\n#define SET_TX_DESC_LAST_SEG_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)\n#define SET_TX_DESC_LINIP_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)\n#define SET_TX_DESC_AMSDU_PAD_EN_8814A(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)\n#define SET_TX_DESC_NO_ACM_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)\n#define SET_TX_DESC_GF_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)\n#define SET_TX_DESC_DISQSELSEQ_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)\n\n// Dword 1\n#define SET_TX_DESC_MACID_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)\n#define SET_TX_DESC_QUEUE_SEL_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 8, 5, __Value)\n#define SET_TX_DESC_RDG_NAV_EXT_8814A(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 13, 1, __Value)\n#define SET_TX_DESC_LSIG_TXOP_EN_8814A(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 14, 1, __Value)\n#define SET_TX_DESC_PIFS_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 15, 1, __Value)\n#define SET_TX_DESC_RATE_ID_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 16, 5, __Value)\n#define SET_TX_DESC_EN_DESC_ID_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 21, 1, __Value)\n#define SET_TX_DESC_SEC_TYPE_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)\n#define SET_TX_DESC_PKT_OFFSET_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 24, 5, __Value)\n#define SET_TX_DESC_MORE_DATA_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 29, 1, __Value)\n#define SET_TX_DESC_TXOP_PS_CAP_8814A(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 30, 1, __Value)\n#define SET_TX_DESC_TXOP_PS_MODE_8814A(__pTxDesc, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+4, 31, 1, __Value)\n\n\n// Dword 2\n#define SET_TX_DESC_PAID_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0,  9, __Value) \n#define SET_TX_DESC_CCA_RTS_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 10, 2, __Value)\n#define SET_TX_DESC_AGG_ENABLE_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 12, 1, __Value)\n#define SET_TX_DESC_RDG_ENABLE_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 13, 1, __Value)\n#define SET_TX_DESC_NULL_0_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 14, 1, __Value)\n#define SET_TX_DESC_NULL_1_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 15, 1, __Value)\n#define SET_TX_DESC_BK_8814A(__pTxDesc, __Value) \t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 16, 1, __Value)\n#define SET_TX_DESC_MORE_FRAG_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 17, 1, __Value)\n#define GET_TX_DESC_MORE_FRAG_8814A(__pTxDesc)\t\t\t\tLE_BITS_TO_4BYTE( __pTxDesc+8, 17, 1)\n#define SET_TX_DESC_RAW_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 18, 1, __Value)\n#define SET_TX_DESC_SPE_RPT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 19, 1, __Value)\n#define SET_TX_DESC_AMPDU_DENSITY_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 20, 3, __Value)\n#define SET_TX_DESC_BT_NULL_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 23, 1, __Value)\n#define SET_TX_DESC_GID_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 24, 6, __Value)\n#define SET_TX_DESC_HW_AES_IV_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+8, 31, 1, __Value)\n\n\n// Dword 3\n#define SET_TX_DESC_WHEADER_LEN_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 0, 5, __Value)\n#define SET_TX_DESC_EARLY_RATE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 5, 1, __Value)\n#define SET_TX_DESC_HW_SSN_SEL_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 6, 2, __Value)\n#define SET_TX_DESC_USE_RATE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 8, 1, __Value)\n#define SET_TX_DESC_DISABLE_RTS_FB_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 9, 1, __Value)\n#define SET_TX_DESC_DISABLE_FB_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 10, 1, __Value)\n#define SET_TX_DESC_CTS2SELF_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 11, 1, __Value)\n#define SET_TX_DESC_RTS_ENABLE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 12, 1, __Value)\n#define SET_TX_DESC_HW_RTS_ENABLE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 13, 1, __Value)\n#define SET_TX_DESC_CHECK_EN_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 14, 1, __Value)\n#define SET_TX_DESC_NAV_USE_HDR_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 15, 1, __Value)\n#define SET_TX_DESC_USE_MAX_LEN_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 16, 1, __Value)\n#define SET_TX_DESC_MAX_AGG_NUM_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+12, 17, 5, __Value)\n#define SET_TX_DESC_NDPA_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 22, 2, __Value)\n#define SET_TX_DESC_AMPDU_MAX_TIME_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+12, 24, 8, __Value)\n\n// Dword 4\n#define SET_TX_DESC_TX_RATE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 0, 7, __Value)\n#define SET_TX_DESC_TRY_RATE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 7, 1, __Value)\n#define SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 8, 5, __Value)\n#define SET_TX_DESC_RTS_RATE_FB_LIMIT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 13, 4, __Value)\n#define SET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 17, 1, __Value)\n#define SET_TX_DESC_DATA_RETRY_LIMIT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 18, 6, __Value)\n#define SET_TX_DESC_RTS_RATE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 24, 5, __Value)\n#define SET_TX_DESC_PCTS_ENABLE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 29, 1, __Value)\n#define SET_TX_DESC_PCTS_MASK_IDX_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 30, 2, __Value)\n\n\n// Dword 5\n#define SET_TX_DESC_DATA_SC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 0, 4, __Value)\n#define SET_TX_DESC_DATA_SHORT_8814A(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+20, 4, 1, __Value)\n#define SET_TX_DESC_DATA_BW_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 5, 2, __Value)\n#define SET_TX_DESC_DATA_LDPC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 7, 1, __Value)\n#define SET_TX_DESC_DATA_STBC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 8, 2, __Value)\n#define SET_TX_DESC_CTROL_STBC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 10, 2, __Value)\n#define SET_TX_DESC_RTS_SHORT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 12, 1, __Value)\n#define SET_TX_DESC_RTS_SC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 13, 4, __Value)\n#define SET_TX_DESC_SIGNALING_TA_PKT_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 17, 1, __Value)\n#define SET_TX_DESC_PORT_ID_8814A(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 21, 3, __Value)//20130415 KaiYuan add for 8814\n#define SET_TX_DESC_TX_ANT_8814A(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 24, 4, __Value)\n#define SET_TX_DESC_TX_POWER_OFFSET_8814A(__pTxDesc,__Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+20, 28, 3, __Value)\n\n// Dword 6\n#define SET_TX_DESC_SW_DEFINE_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 0, 12, __Value)\n#define SET_TX_DESC_MBSSID_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 12, 4, __Value)\n#define SET_TX_DESC_ANTSEL_A_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 16, 3, __Value)\n#define SET_TX_DESC_ANTSEL_B_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 19, 3, __Value)\n#define SET_TX_DESC_ANT_MAPA_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 22, 2, __Value)\n#define SET_TX_DESC_ANT_MAPB_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 24, 2, __Value)\n#define SET_TX_DESC_ANT_MAPC_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 26, 2, __Value)\n#define SET_TX_DESC_ANT_MAPD_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+24, 28, 2, __Value)\n\n\n// Dword 7\n#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)\n#define SET_TX_DESC_TX_BUFFER_SIZE_8814A(__pTxDesc, __Value) \t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#else\n#define SET_TX_DESC_TX_DESC_CHECKSUM_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 0, 16, __Value)\n#endif\n#define SET_TX_DESC_NTX_MAP_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 20, 4, __Value)\n#define SET_TX_DESC_USB_TXAGG_NUM_8814A(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+28, 24, 8, __Value)\n\n\n// Dword 8\n#define SET_TX_DESC_RTS_RC_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 0, 6, __Value)\n#define SET_TX_DESC_BAR_RTY_TH_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 6, 2, __Value)\n#define SET_TX_DESC_DATA_RC_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 8, 6, __Value)\n#define SET_TX_DESC_EN_HWEXSEQ_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 14, 1, __Value)\n#define SET_TX_DESC_HWSEQ_EN_8814A(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 15, 1, __Value)\n#if(DEV_BUS_TYPE != RT_SDIO_INTERFACE)\n#define SET_TX_DESC_NEXT_HEAD_PAGE_L_8814A(__pTxDesc,__Value)(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 16, 8, __Value)\n#else\n#define SET_TX_DESC_SDIO_SEQ_8814A(__pTxDesc,__Value)(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 16, 8, __Value) //20130415 KaiYuan add for 8814AS\n#endif\n#define SET_TX_DESC_TAIL_PAGE_L_8814A(__pTxDesc,__Value)(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+32, 24, 8, __Value)\n\n// Dword 9\n#define SET_TX_DESC_PADDING_LENGTH_8814A(__pTxDesc, __Value) \t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 0, 11, __Value)\n#define SET_TX_DESC_TXBF_PATH_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value)\n#define SET_TX_DESC_SEQ_8814A(__pTxDesc, __Value) \t\t\t\t\t\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)\n#define SET_TX_DESC_NEXT_HEAD_PAGE_H_8814A(__pTxDesc,__Value)(__pTxDesc, __Value) \tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 4, __Value)\n#define SET_TX_DESC_TAIL_PAGE_H_8814A(__pTxDesc,__Value)(__pTxDesc, __Value) \t\t\tSET_BITS_TO_LE_4BYTE(__pTxDesc+36, 28, 4, __Value)\n\n\n\n#define SET_EARLYMODE_PKTNUM_8814A(__pAddr, __Value)\t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)\n#define SET_EARLYMODE_LEN0_8814A(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)\n#define SET_EARLYMODE_LEN1_1_8814A(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr, 19, 13, __Value)\n#define SET_EARLYMODE_LEN1_2_8814A(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 0, 2, __Value)\n#define SET_EARLYMODE_LEN2_8814A(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 2, 15,  __Value)\n#define SET_EARLYMODE_LEN3_8814A(__pAddr, __Value) \t\t\t\t\tSET_BITS_TO_LE_4BYTE(__pAddr+4, 17, 15, __Value)\n\n\nvoid rtl8814a_cal_txdesc_chksum(u8 *ptxdesc);\nvoid rtl8814a_fill_fake_txdesc(PADAPTER\tpadapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8\tIsBTQosNull, u8 bDataFrame);\nvoid rtl8814a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid rtl8814a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\nvoid rtl8814a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc);\n\n#ifdef CONFIG_USB_HCI\ns32 rtl8814au_init_xmit_priv(PADAPTER padapter);\nvoid rtl8814au_free_xmit_priv(PADAPTER padapter);\ns32 rtl8814au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8814au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\t rtl8814au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\ns32 rtl8814au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8814au_xmit_tasklet(void *priv);\ns32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n#endif //CONFIG_USB_HCI\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8814ae_init_xmit_priv(PADAPTER padapter);\nvoid rtl8814ae_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf *rtl8814ae_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid rtl8814ae_xmitframe_resume(_adapter *padapter);\ns32 rtl8814ae_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8814ae_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\trtl8814ae_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtl8814ae_xmit_tasklet(void *priv);\n#endif\n\nvoid _dbg_dump_tx_info(_adapter\t*padapter,int frame_tag, u8 *ptxdesc);\nu8 \nSCMapping_8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tstruct pkt_attrib\t*pattrib\n);\n\nu8 \nBWMapping_8814(\n\tIN\tPADAPTER\t\tAdapter,\n\tIN\tstruct pkt_attrib\t*pattrib\n);\n\n\n#endif /* __RTL8814_XMIT_H__ */\n\n"
  },
  {
    "path": "include/rtl8821a_spec.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#ifndef __RTL8821A_SPEC_H__\n#define __RTL8821A_SPEC_H__\n\n#include <drv_conf.h>\n// This file should based on \"hal_com_reg.h\"\n#include <hal_com_reg.h>\n// Because 8812a and 8821a is the same serial,\n// most of 8821a register definitions are the same as 8812a.\n#include <rtl8812a_spec.h>\n\n\n//============================================================\n//       8821A Regsiter offset definition\n//============================================================\n\n//============================================================\n// MAC register\n//============================================================\n\n//-----------------------------------------------------\n//\t0x0000h ~ 0x00FFh\tSystem Configuration\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0100h ~ 0x01FFh\tMACTOP General Configuration\n//-----------------------------------------------------\n#define REG_WOWLAN_WAKE_REASON          REG_MCUTST_WOWLAN\n\n//-----------------------------------------------------\n//\t0x0200h ~ 0x027Fh\tTXDMA Configuration\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0280h ~ 0x02FFh\tRXDMA Configuration\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0300h ~ 0x03FFh\tPCIe\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0400h ~ 0x047Fh\tProtocol Configuration\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0500h ~ 0x05FFh\tEDCA Configuration\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n//\t0x0600h ~ 0x07FFh\tWMAC Configuration\n//-----------------------------------------------------\n\n\n//============================================================\n// SDIO Bus Specification\n//============================================================\n\n//-----------------------------------------------------\n// SDIO CMD Address Mapping\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// I/O bus domain (Host)\n//-----------------------------------------------------\n\n//-----------------------------------------------------\n// SDIO register\n//-----------------------------------------------------\n#undef SDIO_REG_HCPWM1\n#define SDIO_REG_FREE_TXPG2\t\t0x024\n#define SDIO_REG_HCPWM1\t\t\t0x025\n\n\n//============================================================\n//       Regsiter Bit and Content definition\n//============================================================\n\n//========================================================\n// General definitions\n//========================================================\n\n#define MACID_NUM_8821A 128\n#define SEC_CAM_ENT_NUM_8821A 64\n#define NSS_NUM_8821A 1\n#define BAND_CAP_8821A (BAND_CAP_2G | BAND_CAP_5G)\n#define BW_CAP_8821A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)\n\n#endif /* __RTL8821A_SPEC_H__ */\n\n"
  },
  {
    "path": "include/rtl8821a_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTL8821A_XMIT_H__\n#define __RTL8821A_XMIT_H__\n\n#include <drv_types.h>\n\ntypedef struct txdescriptor_8821a\n{\n\t// Offset 0\n\tu32 pktlen:16;\n\tu32 offset:8;\n\tu32 bmc:1;\n\tu32 htc:1;\n\tu32 rsvd0026:1;\n\tu32 rsvd0027:1;\n\tu32 linip:1;\n\tu32 noacm:1;\n\tu32 gf:1;\n\tu32 rsvd0031:1;\n\n\t// Offset 4\n\tu32 macid:7;\n\tu32 rsvd0407:1;\n\tu32 qsel:5;\n\tu32 rdg_nav_ext:1;\n\tu32 lsig_txop_en:1;\n\tu32 pifs:1;\n\tu32 rate_id:5;\n\tu32 en_desc_id:1;\n\tu32 sectype:2;\n\tu32 pkt_offset:5; // unit: 8 bytes\n\tu32 moredata:1;\n\tu32 txop_ps_cap:1;\n\tu32 txop_ps_mode:1;\n\n\t// Offset 8\n\tu32 p_aid:9;\n\tu32 rsvd0809:1;\n\tu32 cca_rts:2;\n\tu32 agg_en:1;\n\tu32 rdg_en:1;\n\tu32 null_0:1;\n\tu32 null_1:1;\n\tu32 bk:1;\n\tu32 morefrag:1;\n\tu32 raw:1;\n\tu32 spe_rpt:1;\n\tu32 ampdu_density:3;\n\tu32 bt_null:1;\n\tu32 g_id:6;\n\tu32 rsvd0830:2;\n\n\t// Offset 12\n\tu32 wheader_len:4;\n\tu32 chk_en:1;\n\tu32 early_rate:1;\n\tu32 hw_ssn_sel:2;\n\tu32 userate:1;\n\tu32 disrtsfb:1;\n\tu32 disdatafb:1;\n\tu32 cts2self:1;\n\tu32 rtsen:1;\n\tu32 hw_rts_en:1;\n\tu32 port_id:1;\n\tu32 navusehdr:1;\n\tu32 use_max_len:1;\n\tu32 max_agg_num:5;\n\tu32 ndpa:2;\n\tu32 ampdu_max_time:8;\n\n\t// Offset 16\n\tu32 datarate:7;\n\tu32 try_rate:1;\n\tu32 data_ratefb_lmt:5;\n\tu32 rts_ratefb_lmt:4;\n\tu32 rty_lmt_en:1;\n\tu32 data_rt_lmt:6;\n\tu32 rtsrate:5;\n\tu32 pcts_en:1;\n\tu32 pcts_mask_idx:2;\n\n\t// Offset 20\n\tu32 data_sc:4;\n\tu32 data_short:1;\n\tu32 data_bw:2;\n\tu32 data_ldpc:1;\n\tu32 data_stbc:2;\n\tu32 vcs_stbc:2;\n\tu32 rts_short:1;\n\tu32 rts_sc:4;\n\tu32 rsvd2016:7;\n\tu32 tx_ant:4;\n\tu32 txpwr_offset:3;\n\tu32 rsvd2031:1;\n\n\t// Offset 24\n\tu32 sw_define:12;\n\tu32 mbssid:4;\n\tu32 antsel_A:3;\n\tu32 antsel_B:3;\n\tu32 antsel_C:3;\n\tu32 antsel_D:3;\n\tu32 rsvd2428:4;\n\n\t// Offset 28\n\tu32 checksum:16;\n\tu32 rsvd2816:8;\n\tu32 usb_txagg_num:8;\n\n\t// Offset 32\n\tu32 rts_rc:6;\n\tu32 bar_rty_th:2;\n\tu32 data_rc:6;\n\tu32 rsvd3214:1;\n\tu32 en_hwseq:1;\n\tu32 nextneadpage:8;\n\tu32 tailpage:8;\n\n\t// Offset 36\n\tu32 padding_len:11;\n\tu32 txbf_path:1;\n\tu32 seq:12;\n\tu32 final_data_rate:8;\n}TXDESC_8821A, *PTXDESC_8821A;\n\n#ifdef CONFIG_SDIO_HCI\ns32 InitXmitPriv8821AS(PADAPTER padapter);\nvoid FreeXmitPriv8821AS(PADAPTER padapter);\ns32 XmitBufHandler8821AS(PADAPTER padapter);\ns32 MgntXmit8821AS(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32\tHalXmitNoLock8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 HalXmit8821AS(PADAPTER padapter, struct xmit_frame *pxmitframe);\n#ifndef CONFIG_SDIO_TX_TASKLET\nthread_return XmitThread8821AS(thread_context context);\n#endif // !CONFIG_SDIO_TX_TASKLET\n#endif // CONFIG_SDIO_HCI\n\n#if 0\n#ifdef CONFIG_USB_HCI\ns32 rtl8821au_init_xmit_priv(PADAPTER padapter);\nvoid rtl8821au_free_xmit_priv(PADAPTER padapter);\ns32 rtl8821au_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8821au_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\ns32 rtl8821au_hal_xmitframe_enqueue(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8821au_xmit_buf_handler(PADAPTER padapter);\nvoid rtl8821au_xmit_tasklet(void *priv);\ns32 rtl8821au_xmitframe_complete(PADAPTER padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n#endif // CONFIG_USB_HCI\n\n#ifdef CONFIG_PCI_HCI\ns32 rtl8821e_init_xmit_priv(PADAPTER padapter);\nvoid rtl8821e_free_xmit_priv(PADAPTER padapter);\nstruct xmit_buf* rtl8821e_dequeue_xmitbuf(struct rtw_tx_ring *ring);\nvoid rtl8821e_xmitframe_resume(PADAPTER padapter);\ns32 rtl8821e_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);\ns32 rtl8821e_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);\nvoid rtl8821e_xmit_tasklet(void *priv);\n#endif // CONFIG_PCI_HCI\n#endif\n\n#endif //__RTL8821_XMIT_H__\n\n"
  },
  {
    "path": "include/rtw_android.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n \n#ifndef __RTW_ANDROID_H__\n#define __RTW_ANDROID_H__\n\nenum ANDROID_WIFI_CMD {\n\tANDROID_WIFI_CMD_START,\t\t\t\t\n\tANDROID_WIFI_CMD_STOP,\t\t\t\n\tANDROID_WIFI_CMD_SCAN_ACTIVE,\n\tANDROID_WIFI_CMD_SCAN_PASSIVE,\t\t\n\tANDROID_WIFI_CMD_RSSI,\t\n\tANDROID_WIFI_CMD_LINKSPEED,\n\tANDROID_WIFI_CMD_RXFILTER_START,\n\tANDROID_WIFI_CMD_RXFILTER_STOP,\t\n\tANDROID_WIFI_CMD_RXFILTER_ADD,\t\n\tANDROID_WIFI_CMD_RXFILTER_REMOVE,\n\tANDROID_WIFI_CMD_BTCOEXSCAN_START,\n\tANDROID_WIFI_CMD_BTCOEXSCAN_STOP,\n\tANDROID_WIFI_CMD_BTCOEXMODE,\n\tANDROID_WIFI_CMD_SETSUSPENDOPT,\n\tANDROID_WIFI_CMD_P2P_DEV_ADDR,\t\n\tANDROID_WIFI_CMD_SETFWPATH,\t\t\n\tANDROID_WIFI_CMD_SETBAND,\t\t\n\tANDROID_WIFI_CMD_GETBAND,\t\t\t\n\tANDROID_WIFI_CMD_COUNTRY,\t\t\t\n\tANDROID_WIFI_CMD_P2P_SET_NOA,\n\tANDROID_WIFI_CMD_P2P_GET_NOA,\t\n\tANDROID_WIFI_CMD_P2P_SET_PS,\t\n\tANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,\n\n\tANDROID_WIFI_CMD_MIRACAST,\n\n#ifdef CONFIG_PNO_SUPPORT\n\tANDROID_WIFI_CMD_PNOSSIDCLR_SET,\n\tANDROID_WIFI_CMD_PNOSETUP_SET,\n\tANDROID_WIFI_CMD_PNOENABLE_SET,\n\tANDROID_WIFI_CMD_PNODEBUG_SET,\n#endif\n\n\tANDROID_WIFI_CMD_MACADDR,\n\n\tANDROID_WIFI_CMD_BLOCK_SCAN,\n\tANDROID_WIFI_CMD_BLOCK,\n\n\tANDROID_WIFI_CMD_WFD_ENABLE,\n\tANDROID_WIFI_CMD_WFD_DISABLE,\n\t\n\tANDROID_WIFI_CMD_WFD_SET_TCPPORT,\n\tANDROID_WIFI_CMD_WFD_SET_MAX_TPUT,\n\tANDROID_WIFI_CMD_WFD_SET_DEVTYPE,\n\tANDROID_WIFI_CMD_CHANGE_DTIM,\n\tANDROID_WIFI_CMD_HOSTAPD_SET_MACADDR_ACL,\n\tANDROID_WIFI_CMD_HOSTAPD_ACL_ADD_STA,\n\tANDROID_WIFI_CMD_HOSTAPD_ACL_REMOVE_STA,\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0))\t\n\tANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD,\n#endif //CONFIG_GTK_OL\n\tANDROID_WIFI_CMD_P2P_DISABLE,\n\tANDROID_WIFI_CMD_DRIVERVERSION,\n\tANDROID_WIFI_CMD_MAX\n};\n\nint rtw_android_cmdstr_to_num(char *cmdstr);\nint rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);\n\n#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\nint rtw_android_pno_enable(struct net_device *net, int pno_enable);\nint rtw_android_cfg80211_pno_setup(struct net_device *net,\n\t\tstruct cfg80211_ssid *ssid, int n_ssids, int interval);\n#endif\n\n#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)\nint rtw_android_wifictrl_func_add(void);\nvoid rtw_android_wifictrl_func_del(void);\nvoid* wl_android_prealloc(int section, unsigned long size);\n\nint wifi_get_irq_number(unsigned long *irq_flags_ptr);\nint wifi_set_power(int on, unsigned long msec);\nint wifi_get_mac_addr(unsigned char *buf);\nvoid *wifi_get_country_code(char *ccode);\n#else\nstatic int rtw_android_wifictrl_func_add(void) { return 0; }\nstatic void rtw_android_wifictrl_func_del(void) {}\n#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */\n\n#ifdef CONFIG_GPIO_WAKEUP\n#ifdef CONFIG_PLATFORM_INTEL_BYT\nint wifi_configure_gpio(void);\n#endif //CONFIG_PLATFORM_INTEL_BYT\nvoid wifi_free_gpio(unsigned int gpio);\n#endif //CONFIG_GPIO_WAKEUP\n\n\n#endif //__RTW_ANDROID_H__\n\n"
  },
  {
    "path": "include/rtw_ap.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_AP_H_\n#define __RTW_AP_H_\n\n\n#ifdef CONFIG_AP_MODE\n\n//external function\nextern void rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta);\nextern void rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta);\n\n\nvoid init_mlme_ap_info(_adapter *padapter);\nvoid free_mlme_ap_info(_adapter *padapter);\n//void update_BCNTIM(_adapter *padapter);\nvoid rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len);\nvoid rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index);\nvoid _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag);\n#define update_beacon(adapter, ie_id, oui, tx) _update_beacon((adapter), (ie_id), (oui), (tx), __func__)\nvoid add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level);\nvoid expire_timeout_chk(_adapter *padapter);\nvoid update_sta_info_apmode(_adapter *padapter, struct sta_info *psta);\nvoid rtw_start_bss_hdl_after_chbw_decided(_adapter *adapter);\nvoid start_bss_network(_adapter *padapter, struct createbss_parm *parm);\nint rtw_check_beacon_data(_adapter *padapter, u8 *pbuf,  int len);\nvoid rtw_ap_restore_network(_adapter *padapter);\nvoid rtw_set_macaddr_acl(_adapter *padapter, int mode);\nint rtw_acl_add_sta(_adapter *padapter, u8 *addr);\nint rtw_acl_remove_sta(_adapter *padapter, u8 *addr);\n\nu8 rtw_ap_set_pairwise_key(_adapter *padapter, struct sta_info *psta);\nint rtw_ap_set_group_key(_adapter *padapter, u8 *key, u8 alg, int keyid);\nint rtw_ap_set_wep_key(_adapter *padapter, u8 *key, u8 keylen, int keyid, u8 set_tx);\n\n#ifdef CONFIG_NATIVEAP_MLME\nvoid associated_clients_update(_adapter *padapter, u8 updated, u32 sta_info_type);\nvoid bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta);\nu8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta);\nvoid sta_info_update(_adapter *padapter, struct sta_info *psta);\nvoid ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta);\nu8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reason, bool enqueue);\nint rtw_sta_flush(_adapter *padapter, bool enqueue);\nint rtw_ap_inform_ch_switch(_adapter *padapter, u8 new_ch, u8 ch_offset);\nvoid start_ap_mode(_adapter *padapter);\nvoid stop_ap_mode(_adapter *padapter);\n#endif\n\nvoid rtw_ap_update_bss_chbw(_adapter *adapter, WLAN_BSSID_EX *bss, u8 ch, u8 bw, u8 offset);\nbool rtw_ap_chbw_decision(_adapter *adapter, u8 req_ch, u8 req_bw, u8 req_offset, u8 *ch, u8 *bw, u8 *offset);\n\n#ifdef CONFIG_AUTO_AP_MODE\nextern void rtw_start_auto_ap(_adapter *adapter);\n#endif //CONFIG_AUTO_AP_MODE\n\n#endif //end of CONFIG_AP_MODE\n\n#endif\nvoid update_bmc_sta(_adapter *padapter);\n\nvoid rtw_process_ht_action_smps(_adapter *padapter, u8 *ta, u8 ctrl_field);\nvoid rtw_process_public_act_bsscoex(_adapter *padapter, u8 *pframe, uint frame_len);\n\n"
  },
  {
    "path": "include/rtw_beamforming.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_BEAMFORMING_H_\n#define __RTW_BEAMFORMING_H_\n\n#ifdef CONFIG_BEAMFORMING\n\n#if (BEAMFORMING_SUPPORT == 0) /*for diver defined beamforming*/\n#define BEAMFORMING_ENTRY_NUM\t\t2\n#define GET_BEAMFORM_INFO(_pmlmepriv)\t((struct beamforming_info *)(&(_pmlmepriv)->beamforming_info))\n\n\ntypedef enum _BEAMFORMING_ENTRY_STATE\n{\n\tBEAMFORMING_ENTRY_STATE_UNINITIALIZE, \n\tBEAMFORMING_ENTRY_STATE_INITIALIZEING, \n\tBEAMFORMING_ENTRY_STATE_INITIALIZED, \n\tBEAMFORMING_ENTRY_STATE_PROGRESSING, \n\tBEAMFORMING_ENTRY_STATE_PROGRESSED, \n}BEAMFORMING_ENTRY_STATE, *PBEAMFORMING_ENTRY_STATE;\n\n\ntypedef enum _BEAMFORMING_STATE\n{\n\tBEAMFORMING_STATE_IDLE, \n\tBEAMFORMING_STATE_START, \n\tBEAMFORMING_STATE_END,\n}BEAMFORMING_STATE, *PBEAMFORMING_STATE;\n\n\ntypedef enum _BEAMFORMING_CAP\n{\n\tBEAMFORMING_CAP_NONE = 0x0,\n\tBEAMFORMER_CAP_HT_EXPLICIT = 0x1, \n\tBEAMFORMEE_CAP_HT_EXPLICIT = 0x2, \n\tBEAMFORMER_CAP_VHT_SU = 0x4,\t\t\t// Self has er Cap, because Reg er  & peer ee\n\tBEAMFORMEE_CAP_VHT_SU = 0x8, \t\t\t// Self has ee Cap, because Reg ee & peer er \n\tBEAMFORMER_CAP = 0x10,\n\tBEAMFORMEE_CAP = 0x20,\n}BEAMFORMING_CAP, *PBEAMFORMING_CAP;\n\n\ntypedef enum _SOUNDING_MODE\n{\n\tSOUNDING_SW_VHT_TIMER = 0x0,\n\tSOUNDING_SW_HT_TIMER = 0x1, \n\tSOUNDING_STOP_All_TIMER = 0x2, \n\tSOUNDING_HW_VHT_TIMER = 0x3,\t\t\t\n\tSOUNDING_HW_HT_TIMER = 0x4,\n\tSOUNDING_STOP_OID_TIMER = 0x5, \n\tSOUNDING_AUTO_VHT_TIMER = 0x6,\n\tSOUNDING_AUTO_HT_TIMER = 0x7,\n\tSOUNDING_FW_VHT_TIMER = 0x8,\n\tSOUNDING_FW_HT_TIMER = 0x9,\n}SOUNDING_MODE, *PSOUNDING_MODE;\n\nstruct beamforming_entry {\n\tBOOLEAN\tbUsed;\n\tBOOLEAN\tbSound;\n\tu16\taid;\t\t\t// Used to construct AID field of NDPA packet.\n\tu16\tmac_id;\t\t// Used to Set Reg42C in IBSS mode. \n\tu16\tp_aid;\t\t// Used to fill Reg42C & Reg714 to compare with P_AID of Tx DESC. \n\tu16 g_id;\n\tu8\tmac_addr[6];// Used to fill Reg6E4 to fill Mac address of CSI report frame.\n\tCHANNEL_WIDTH\tsound_bw;\t// Sounding BandWidth\n\tu16\tsound_period;\n\tBEAMFORMING_CAP\tbeamforming_entry_cap;\n\tBEAMFORMING_ENTRY_STATE\tbeamforming_entry_state;\n\tu8\t\t\t\tClockResetTimes;\t\t\t/*Modified by Jeffery @2015-04-10*/\n\tu8\t\t\t\tPreLogSeq;\t\t\t\t/*Modified by Jeffery @2015-03-30*/\n\tu8\t\t\t\tLogSeq;\t\t\t\t\t/*Modified by Jeffery @2014-10-29*/\n\tu16\t\t\t\tLogRetryCnt:3;\t\t\t/*Modified by Jeffery @2014-10-29*/\n\tu16\t\t\t\tLogSuccess:2;\t\t\t/*Modified by Jeffery @2014-10-29*/\n\n\tu8\tLogStatusFailCnt;\n\tu8\tPreCsiReport[327];\n\tu8\tDefaultCsiCnt;\n\tBOOLEAN\tbDefaultCSI;\n};\n\nstruct sounding_info {\n\tu8\t\t\t\tsound_idx;\n\tCHANNEL_WIDTH\tsound_bw;\n\tSOUNDING_MODE\tsound_mode; \n\tu16\t\t\t\tsound_period;\n};\n\nstruct beamforming_info {\n\tBEAMFORMING_CAP\t\tbeamforming_cap;\n\tBEAMFORMING_STATE\t\tbeamforming_state;\n\tstruct beamforming_entry\tbeamforming_entry[BEAMFORMING_ENTRY_NUM];\n\tu8\t\t\t\t\t\tbeamforming_cur_idx;\n\tu8\t\t\t\t\t\tbeamforming_in_progress;\n\tu8\t\t\t\t\t\tsounding_sequence;\n\tstruct sounding_info\t\tsounding_info;\n};\n\nstruct rtw_ndpa_sta_info {\n\tu16\taid:12;\t\n\tu16\tfeedback_type:1;\n\tu16\tnc_index:3;\t\n};\n\nBEAMFORMING_CAP beamforming_get_entry_beam_cap_by_mac_id(PVOID pmlmepriv ,u8 mac_id);\nvoid\tbeamforming_notify(PADAPTER adapter);\nBEAMFORMING_CAP beamforming_get_beamform_cap(struct beamforming_info\t*pBeamInfo);\n\nBOOLEAN\tbeamforming_send_ht_ndpa_packet(PADAPTER Adapter, u8 *ra, CHANNEL_WIDTH bw, u8 qidx);\nBOOLEAN\tbeamforming_send_vht_ndpa_packet(PADAPTER Adapter, u8 *ra, u16 aid, CHANNEL_WIDTH bw, u8 qidx);\n\nvoid\tbeamforming_check_sounding_success(PADAPTER Adapter,BOOLEAN status);\n\nvoid\tbeamforming_watchdog(PADAPTER Adapter);\n#endif /*#if (BEAMFORMING_SUPPORT ==0)- for diver defined beamforming*/\n\nenum BEAMFORMING_CTRL_TYPE {\n\tBEAMFORMING_CTRL_ENTER = 0,\n\tBEAMFORMING_CTRL_LEAVE = 1,\n\tBEAMFORMING_CTRL_START_PERIOD = 2,\n\tBEAMFORMING_CTRL_END_PERIOD = 3,\n\tBEAMFORMING_CTRL_SOUNDING_FAIL = 4,\n\tBEAMFORMING_CTRL_SOUNDING_CLK = 5,\n};\nu32\tbeamforming_get_report_frame(PADAPTER\t Adapter, union recv_frame *precv_frame);\nvoid\tbeamforming_get_ndpa_frame(PADAPTER\t Adapter, union recv_frame *precv_frame);\n\nvoid\tbeamforming_wk_hdl(_adapter *padapter, u8 type, u8 *pbuf);\nu8\tbeamforming_wk_cmd(_adapter*padapter, s32 type, u8 *pbuf, s32 size, u8 enqueue);\nvoid update_attrib_txbf_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);\n\n#endif /*#ifdef CONFIG_BEAMFORMING */\n\n#endif /*__RTW_BEAMFORMING_H_*/\n"
  },
  {
    "path": "include/rtw_br_ext.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_BR_EXT_H_\n#define _RTW_BR_EXT_H_\n\n#if 1\t// rtw_wifi_driver\n#define CL_IPV6_PASS    \t1\n#define MACADDRLEN\t\t6\n#define _DEBUG_ERR\t\tDBG_8192C\n#define _DEBUG_INFO\t\t//DBG_8192C\n#define DEBUG_WARN\t\tDBG_8192C\n#define DEBUG_INFO\t\t//DBG_8192C\n#define DEBUG_ERR\t\tDBG_8192C\n//#define GET_MY_HWADDR\t\t((GET_MIB(priv))->dot11OperationEntry.hwaddr)\n#define GET_MY_HWADDR(padapter)\t\t(adapter_mac_addr(padapter))\n#endif\t// rtw_wifi_driver\n\n#define NAT25_HASH_BITS\t\t4\n#define NAT25_HASH_SIZE\t\t(1 << NAT25_HASH_BITS)\n#define NAT25_AGEING_TIME\t300\n\n#ifdef CL_IPV6_PASS\n#define MAX_NETWORK_ADDR_LEN\t17\n#else\n#define MAX_NETWORK_ADDR_LEN\t11\n#endif\n\nstruct nat25_network_db_entry\n{\n\tstruct nat25_network_db_entry\t*next_hash;\n\tstruct nat25_network_db_entry\t**pprev_hash;\n\tatomic_t\t\t\t\t\t\tuse_count;\n\tunsigned char\t\t\t\t\tmacAddr[6];\n\tunsigned long\t\t\t\t\tageing_timer;\n\tunsigned char    \t\t\t\tnetworkAddr[MAX_NETWORK_ADDR_LEN];\n};\n\nenum NAT25_METHOD {\n\tNAT25_MIN,\n\tNAT25_CHECK,\n\tNAT25_INSERT,\n\tNAT25_LOOKUP,\n\tNAT25_PARSE,\n\tNAT25_MAX\n};\n\nstruct br_ext_info {\n\tunsigned int\tnat25_disable;\n\tunsigned int\tmacclone_enable;\n\tunsigned int\tdhcp_bcst_disable;\n\tint\t\taddPPPoETag;\t\t// 1: Add PPPoE relay-SID, 0: disable\n\tunsigned char\tnat25_dmzMac[MACADDRLEN];\n\tunsigned int\tnat25sc_disable;\n};\n\nvoid nat25_db_cleanup(_adapter *priv);\n\n#endif // _RTW_BR_EXT_H_\n\n"
  },
  {
    "path": "include/rtw_bt_mp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\t\t\t\t\t\t\t\t\t\t  \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef __RTW_BT_MP_H\n#define __RTW_BT_MP_H\n\n\n#if(MP_DRIVER == 1)\n\n#pragma pack(1)\n\n// definition for BT_UP_OP_BT_READY\n#define\tMP_BT_NOT_READY\t\t\t\t\t\t0\n#define\tMP_BT_READY\t\t\t\t\t\t\t1\n\n// definition for BT_UP_OP_BT_SET_MODE\ntypedef enum _MP_BT_MODE{\n\tMP_BT_MODE_RF_TXRX_TEST_MODE\t\t\t\t\t\t\t= 0,\n\tMP_BT_MODE_BT20_DUT_TEST_MODE\t\t\t\t\t\t\t= 1,\n\tMP_BT_MODE_BT40_DIRECT_TEST_MODE\t\t\t\t\t\t= 2,\n\tMP_BT_MODE_CONNECT_TEST_MODE\t\t\t\t\t\t\t= 3,\n\tMP_BT_MODE_MAX\n}MP_BT_MODE,*PMP_BT_MODE;\n\n\n// definition for BT_UP_OP_BT_SET_TX_RX_PARAMETER\ntypedef struct _BT_TXRX_PARAMETERS{\n    u1Byte\t\ttxrxChannel;\n    u4Byte\t\ttxrxTxPktCnt;\n    u1Byte\t\ttxrxTxPktInterval;\n\tu1Byte\t\ttxrxPayloadType;\n\tu1Byte\t\ttxrxPktType;\n\tu2Byte\t\ttxrxPayloadLen;\n\tu4Byte\t\ttxrxPktHeader;\n\tu1Byte\t\ttxrxWhitenCoeff;\n\tu1Byte\t\ttxrxBdaddr[6];\n\tu1Byte\t\ttxrxTxGainIndex;\n} BT_TXRX_PARAMETERS, *PBT_TXRX_PARAMETERS;\n\n// txrxPktType\ntypedef enum _MP_BT_PKT_TYPE{\n\tMP_BT_PKT_DH1\t\t\t\t\t\t\t= 0,\n\tMP_BT_PKT_DH3\t\t\t\t\t\t\t= 1,\n\tMP_BT_PKT_DH5\t\t\t\t\t\t\t= 2,\n\tMP_BT_PKT_2DH1\t\t\t\t\t\t\t= 3,\n\tMP_BT_PKT_2DH3\t\t\t\t\t\t\t= 4,\n\tMP_BT_PKT_2DH5\t\t\t\t\t\t\t= 5,\n\tMP_BT_PKT_3DH1\t\t\t\t\t\t\t= 6,\n\tMP_BT_PKT_3DH3\t\t\t\t\t\t\t= 7,\n\tMP_BT_PKT_3DH5\t\t\t\t\t\t\t= 8,\n\tMP_BT_PKT_LE\t\t\t\t\t\t\t= 9,\n\tMP_BT_PKT_MAX\n}MP_BT_PKT_TYPE,*PMP_BT_PKT_TYPE;\n// txrxPayloadType\ntypedef enum _MP_BT_PAYLOAD_TYPE{\n\tMP_BT_PAYLOAD_01010101\t\t\t\t\t= 0,\n\tMP_BT_PAYLOAD_ALL_1\t\t\t\t\t\t= 1,\n\tMP_BT_PAYLOAD_ALL_0\t\t\t\t\t\t= 2,\n\tMP_BT_PAYLOAD_11110000\t\t\t\t\t= 3,\n\tMP_BT_PAYLOAD_PRBS9\t\t\t\t\t\t= 4,\n\tMP_BT_PAYLOAD_MAX\t\t\t\t\t\t= 8,\n}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE;\n\n\n// definition for BT_UP_OP_BT_TEST_CTRL\ntypedef enum _MP_BT_TEST_CTRL{\n\tMP_BT_TEST_STOP_ALL_TESTS\t\t\t\t\t\t= 0,\n\tMP_BT_TEST_START_RX_TEST\t\t\t\t\t\t= 1,\n\tMP_BT_TEST_START_PACKET_TX_TEST\t\t\t\t\t= 2,\n\tMP_BT_TEST_START_CONTINUOUS_TX_TEST \t\t\t= 3,\n\tMP_BT_TEST_START_INQUIRY_SCAN_TEST\t\t\t\t= 4,\n\tMP_BT_TEST_START_PAGE_SCAN_TEST\t\t\t\t\t= 5,\n\tMP_BT_TEST_START_INQUIRY_PAGE_SCAN_TEST\t\t\t= 6,\n\tMP_BT_TEST_START_LEGACY_CONNECT_TEST\t\t\t= 7,\n\tMP_BT_TEST_START_LE_CONNECT_TEST_INITIATOR \t\t= 8,\n\tMP_BT_TEST_START_LE_CONNECT_TEST_ADVERTISER \t= 9,\n\tMP_BT_TEST_MAX\n}MP_BT_TEST_CTRL,*PMP_BT_TEST_CTRL;\n\n\ntypedef enum _RTL_EXT_C2H_EVT\n{\n\tEXT_C2H_WIFI_FW_ACTIVE_RSP = 0,\n\tEXT_C2H_TRIG_BY_BT_FW = 1,\n\tMAX_EXT_C2HEVENT\n}RTL_EXT_C2H_EVT;\n\n\n// return status definition to the user layer\ntypedef enum _BT_CTRL_STATUS{\n\tBT_STATUS_SUCCESS\t\t\t\t\t\t\t\t\t= 0x00, // Success\n\tBT_STATUS_BT_OP_SUCCESS \t\t\t\t\t\t\t= 0x01, // bt fw op execution success\n\tBT_STATUS_H2C_SUCCESS\t\t\t\t\t\t\t\t= 0x02, // H2c success\n\tBT_STATUS_H2C_TIMTOUT\t\t\t\t\t\t\t\t= 0x03, // H2c timeout\n\tBT_STATUS_H2C_BT_NO_RSP \t\t\t\t\t\t\t= 0x04, // H2c sent, bt no rsp\n\tBT_STATUS_C2H_SUCCESS\t\t\t\t\t\t\t\t= 0x05, // C2h success\n\tBT_STATUS_C2H_REQNUM_MISMATCH\t\t\t\t\t\t= 0x06, // bt fw wrong rsp\n\tBT_STATUS_OPCODE_U_VERSION_MISMATCH \t\t\t\t= 0x07, // Upper layer OP code version mismatch.\n\tBT_STATUS_OPCODE_L_VERSION_MISMATCH \t\t\t\t= 0x08, // Lower layer OP code version mismatch.\n\tBT_STATUS_UNKNOWN_OPCODE_U\t\t\t\t\t\t\t= 0x09, // Unknown Upper layer OP code\n\tBT_STATUS_UNKNOWN_OPCODE_L\t\t\t\t\t\t\t= 0x0a, // Unknown Lower layer OP code\n\tBT_STATUS_PARAMETER_FORMAT_ERROR_U\t\t\t\t\t= 0x0b, // Wrong parameters sent by upper layer.\n\tBT_STATUS_PARAMETER_FORMAT_ERROR_L\t\t\t\t\t= 0x0c, // bt fw parameter format is not consistency\n\tBT_STATUS_PARAMETER_OUT_OF_RANGE_U\t\t\t\t\t= 0x0d, // uppery layer parameter value is out of range\n\tBT_STATUS_PARAMETER_OUT_OF_RANGE_L\t\t\t\t\t= 0x0e, // bt fw parameter value is out of range\n\tBT_STATUS_UNKNOWN_STATUS_L\t\t\t\t\t\t\t= 0x0f, // bt returned an defined status code\n\tBT_STATUS_UNKNOWN_STATUS_H\t\t\t\t\t\t\t= 0x10, // driver need to do error handle or not handle-well.\n\tBT_STATUS_WRONG_LEVEL\t\t\t\t\t\t\t\t= 0x11, // should be under passive level\n\tBT_STATUS_MAX\n}BT_CTRL_STATUS,*PBT_CTRL_STATUS;\n\n// OP codes definition between the user layer and driver\ntypedef enum _BT_CTRL_OPCODE_UPPER{\n\tBT_UP_OP_BT_READY\t\t\t\t\t\t\t\t\t\t= 0x00, \n\tBT_UP_OP_BT_SET_MODE\t\t\t\t\t\t\t\t\t= 0x01,\n\tBT_UP_OP_BT_SET_TX_RX_PARAMETER \t\t\t\t\t\t= 0x02,\n\tBT_UP_OP_BT_SET_GENERAL \t\t\t\t\t\t\t\t= 0x03,\n\tBT_UP_OP_BT_GET_GENERAL \t\t\t\t\t\t\t\t= 0x04,\n\tBT_UP_OP_BT_TEST_CTRL\t\t\t\t\t\t\t\t\t= 0x05,\n\tBT_UP_OP_TEST_BT\t\t\t\t\t\t\t\t\t\t= 0x06,\n\tBT_UP_OP_MAX\n}BT_CTRL_OPCODE_UPPER,*PBT_CTRL_OPCODE_UPPER;\n\n\ntypedef enum _BT_SET_GENERAL{\n\tBT_GSET_REG \t\t\t\t\t\t\t\t\t\t\t= 0x00, \n\tBT_GSET_RESET\t\t\t\t\t\t\t\t\t\t\t= 0x01, \n\tBT_GSET_TARGET_BD_ADDR\t\t\t\t\t\t\t\t\t= 0x02, \n\tBT_GSET_TX_PWR_FINETUNE \t\t\t\t\t\t\t\t= 0x03,\n\tBT_SET_TRACKING_INTERVAL\t\t\t\t\t\t\t\t= 0x04,\n\tBT_SET_THERMAL_METER\t\t\t\t\t\t\t\t\t= 0x05,\n\tBT_ENABLE_CFO_TRACKING\t\t\t\t\t\t\t\t\t= 0x06,\t\t\t\t\t\t\t\t\t\n\tBT_GSET_UPDATE_BT_PATCH \t\t\t\t\t\t\t\t= 0x07,\n\tBT_GSET_MAX\n}BT_SET_GENERAL,*PBT_SET_GENERAL;\n\ntypedef enum _BT_GET_GENERAL{\n\tBT_GGET_REG \t\t\t\t\t\t\t\t\t\t\t= 0x00, \n\tBT_GGET_STATUS\t\t\t\t\t\t\t\t\t\t\t= 0x01,\n\tBT_GGET_REPORT\t\t\t\t\t\t\t\t\t\t\t= 0x02,\n\tBT_GGET_AFH_MAP \t\t\t\t\t\t\t\t\t\t= 0x03,\n\tBT_GGET_AFH_STATUS\t\t\t\t\t\t\t\t\t\t= 0x04,\n\tBT_GGET_MAX\n}BT_GET_GENERAL,*PBT_GET_GENERAL;\n\n// definition for BT_UP_OP_BT_SET_GENERAL\ntypedef enum _BT_REG_TYPE{\n\tBT_REG_RF\t\t\t\t\t\t\t\t= 0,\n\tBT_REG_MODEM\t\t\t\t\t\t\t= 1,\n\tBT_REG_BLUEWIZE \t\t\t\t\t\t= 2,\n\tBT_REG_VENDOR\t\t\t\t\t\t\t= 3,\n\tBT_REG_LE\t\t\t\t\t\t\t\t= 4,\n\tBT_REG_MAX\n}BT_REG_TYPE,*PBT_REG_TYPE;\n\n// definition for BT_LO_OP_GET_AFH_MAP\ntypedef enum _BT_AFH_MAP_TYPE{\n\tBT_AFH_MAP_RESULT\t\t\t\t\t\t= 0,\n\tBT_AFH_MAP_WIFI_PSD_ONLY\t\t\t\t= 1,\n\tBT_AFH_MAP_WIFI_CH_BW_ONLY\t\t\t\t= 2,\n\tBT_AFH_MAP_BT_PSD_ONLY\t\t\t\t\t= 3,\n\tBT_AFH_MAP_HOST_CLASSIFICATION_ONLY \t= 4,\n\tBT_AFH_MAP_MAX\n}BT_AFH_MAP_TYPE,*PBT_AFH_MAP_TYPE;\n\n// definition for BT_UP_OP_BT_GET_GENERAL\ntypedef enum _BT_REPORT_TYPE{\n\tBT_REPORT_RX_PACKET_CNT \t\t\t\t= 0,\n\tBT_REPORT_RX_ERROR_BITS \t\t\t\t= 1,\n\tBT_REPORT_RSSI\t\t\t\t\t\t\t= 2,\n\tBT_REPORT_CFO_HDR_QUALITY\t\t\t\t= 3,\n\tBT_REPORT_CONNECT_TARGET_BD_ADDR\t\t= 4,\n\tBT_REPORT_MAX\n}BT_REPORT_TYPE,*PBT_REPORT_TYPE;\n\nVOID\nMPTBT_Test(\n\tIN\tPADAPTER\tAdapter,\n\tIN\tu1Byte\t\topCode,\n\tIN\tu1Byte\t\tbyte1,\n\tIN\tu1Byte\t\tbyte2,\n\tIN\tu1Byte\t\tbyte3\n\t);\n\nNDIS_STATUS\nMPTBT_SendOidBT(\n\tIN\tPADAPTER\t\tpAdapter,\n\tIN\tPVOID\t\t\tInformationBuffer,\n\tIN\tULONG\t\t\tInformationBufferLength,\n\tOUT\tPULONG\t\t\tBytesRead,\n\tOUT\tPULONG\t\t\tBytesNeeded\n\t);\n\nVOID\nMPTBT_FwC2hBtMpCtrl(\n\tPADAPTER\tAdapter,\n\tpu1Byte \ttmpBuf,\n\tu1Byte\t\tlength\n\t);\n\nvoid MPh2c_timeout_handle(void *FunctionContext);\n\nVOID mptbt_BtControlProcess(\n\tPADAPTER\tAdapter,\n\tPVOID\t\tpInBuf\n\t);\n\n#define\tBT_H2C_MAX_RETRY\t\t\t\t\t\t\t\t1\n#define\tBT_MAX_C2H_LEN\t\t\t\t\t\t\t\t20\n\ntypedef struct _BT_REQ_CMD{\n    UCHAR       opCodeVer;\n    UCHAR       OpCode;\n    USHORT      paraLength;\n    UCHAR       pParamStart[100];\n} BT_REQ_CMD, *PBT_REQ_CMD;\n\ntypedef struct _BT_RSP_CMD{\n    USHORT      status;\n    USHORT      paraLength;\n    UCHAR       pParamStart[100];\n} BT_RSP_CMD, *PBT_RSP_CMD;\n\n\ntypedef struct _BT_H2C{\n\tu1Byte\topCodeVer:4;\n\tu1Byte\treqNum:4;\n\tu1Byte\topCode;\n\tu1Byte\tbuf[100];\n}BT_H2C, *PBT_H2C;\n\n\n\ntypedef struct _BT_EXT_C2H{\n\tu1Byte\textendId;\n\tu1Byte\tstatusCode:4;\n\tu1Byte\tretLen:4;\n\tu1Byte\topCodeVer:4;\n\tu1Byte\treqNum:4;\n\tu1Byte\tbuf[100];\n}BT_EXT_C2H, *PBT_EXT_C2H;\n\n\ntypedef enum _BT_OPCODE_STATUS{\n\tBT_OP_STATUS_SUCCESS\t\t\t\t\t\t\t\t\t= 0x00, // Success\n\tBT_OP_STATUS_VERSION_MISMATCH\t\t\t\t\t\t\t= 0x01,\t\n\tBT_OP_STATUS_UNKNOWN_OPCODE\t\t\t\t\t\t\t\t= 0x02,\n\tBT_OP_STATUS_ERROR_PARAMETER\t\t\t\t\t\t\t= 0x03,\n\tBT_OP_STATUS_MAX\n}BT_OPCODE_STATUS,*PBT_OPCODE_STATUS;\n\n\n\n//OP codes definition between driver and bt fw\ntypedef enum _BT_CTRL_OPCODE_LOWER{\n\tBT_LO_OP_GET_BT_VERSION \t\t\t\t\t\t\t\t\t= 0x00, \n\tBT_LO_OP_RESET\t\t\t\t\t\t\t\t\t\t\t\t= 0x01,\n\tBT_LO_OP_TEST_CTRL\t\t\t\t\t\t\t\t\t\t\t= 0x02,\n\tBT_LO_OP_SET_BT_MODE\t\t\t\t\t\t\t\t\t\t= 0x03,\n\tBT_LO_OP_SET_CHNL_TX_GAIN\t\t\t\t\t\t\t\t\t= 0x04,\n\tBT_LO_OP_SET_PKT_TYPE_LEN\t\t\t\t\t\t\t\t\t= 0x05,\n\tBT_LO_OP_SET_PKT_CNT_L_PL_TYPE\t\t\t\t\t\t\t\t= 0x06,\n\tBT_LO_OP_SET_PKT_CNT_H_PKT_INTV \t\t\t\t\t\t\t= 0x07,\n\tBT_LO_OP_SET_PKT_HEADER \t\t\t\t\t\t\t\t\t= 0x08,\n\tBT_LO_OP_SET_WHITENCOEFF\t\t\t\t\t\t\t\t\t= 0x09,\n\tBT_LO_OP_SET_BD_ADDR_L\t\t\t\t\t\t\t\t\t\t= 0x0a,\n\tBT_LO_OP_SET_BD_ADDR_H\t\t\t\t\t\t\t\t\t\t= 0x0b,\n\tBT_LO_OP_WRITE_REG_ADDR \t\t\t\t\t\t\t\t\t= 0x0c,\n\tBT_LO_OP_WRITE_REG_VALUE\t\t\t\t\t\t\t\t\t= 0x0d,\n\tBT_LO_OP_GET_BT_STATUS\t\t\t\t\t\t\t\t\t\t= 0x0e,\n\tBT_LO_OP_GET_BD_ADDR_L\t\t\t\t\t\t\t\t\t\t= 0x0f,\n\tBT_LO_OP_GET_BD_ADDR_H\t\t\t\t\t\t\t\t\t\t= 0x10,\n\tBT_LO_OP_READ_REG\t\t\t\t\t\t\t\t\t\t\t= 0x11,\n\tBT_LO_OP_SET_TARGET_BD_ADDR_L\t\t\t\t\t\t\t\t= 0x12,\n\tBT_LO_OP_SET_TARGET_BD_ADDR_H\t\t\t\t\t\t\t\t= 0x13,\n\tBT_LO_OP_SET_TX_POWER_CALIBRATION\t\t\t\t\t\t\t= 0x14,\n\tBT_LO_OP_GET_RX_PKT_CNT_L\t\t\t\t\t\t\t\t\t= 0x15,\n\tBT_LO_OP_GET_RX_PKT_CNT_H\t\t\t\t\t\t\t\t\t= 0x16,\n\tBT_LO_OP_GET_RX_ERROR_BITS_L\t\t\t\t\t\t\t\t= 0x17,\n\tBT_LO_OP_GET_RX_ERROR_BITS_H\t\t\t\t\t\t\t\t= 0x18,\n\tBT_LO_OP_GET_RSSI\t\t\t\t\t\t\t\t\t\t\t= 0x19,\n\tBT_LO_OP_GET_CFO_HDR_QUALITY_L\t\t\t\t\t\t\t\t= 0x1a,\n\tBT_LO_OP_GET_CFO_HDR_QUALITY_H\t\t\t\t\t\t\t\t= 0x1b,\n\tBT_LO_OP_GET_TARGET_BD_ADDR_L\t\t\t\t\t\t\t\t= 0x1c,\n\tBT_LO_OP_GET_TARGET_BD_ADDR_H\t\t\t\t\t\t\t\t= 0x1d,\n\tBT_LO_OP_GET_AFH_MAP_L\t\t\t\t\t\t\t\t\t\t= 0x1e,\n\tBT_LO_OP_GET_AFH_MAP_M\t\t\t\t\t\t\t\t\t\t= 0x1f,\n\tBT_LO_OP_GET_AFH_MAP_H\t\t\t\t\t\t\t\t\t\t= 0x20,\n\tBT_LO_OP_GET_AFH_STATUS \t\t\t\t\t\t\t\t\t= 0x21,\n\tBT_LO_OP_SET_TRACKING_INTERVAL\t\t\t\t\t\t\t\t= 0x22,\n\tBT_LO_OP_SET_THERMAL_METER\t\t\t\t\t\t\t\t\t= 0x23,\n\tBT_LO_OP_ENABLE_CFO_TRACKING\t\t\t\t\t\t\t\t= 0x24,\n\tBT_LO_OP_MAX\n}BT_CTRL_OPCODE_LOWER,*PBT_CTRL_OPCODE_LOWER;\n\n\n\n\n#endif  /* #if(MP_DRIVER == 1) */\n\n#endif // #ifndef __INC_MPT_BT_H\n\n"
  },
  {
    "path": "include/rtw_btcoex.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_BTCOEX_H__\n#define __RTW_BTCOEX_H__\n\n#include <drv_types.h>\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\n#define NETLINK_USER 31\n#define CONNECT_PORT 30000\n#define CONNECT_PORT_BT 30001\n#define KERNEL_SOCKET_OK 0x01\t\n#define NETLINK_SOCKET_OK 0x02\n\n#define OTHER 0\n#define RX_ATTEND_ACK 1\n#define RX_LEAVE_ACK 2\n#define RX_BT_LEAVE 3\n#define RX_INVITE_REQ 4\n#define RX_ATTEND_REQ 5\n#define RX_INVITE_RSP 6\n\n#define invite_req \"INVITE_REQ\"\n#define invite_rsp \"INVITE_RSP\"\n#define attend_req \"ATTEND_REQ\"\n#define attend_ack \"ATTEND_ACK\"\n#define wifi_leave \"WIFI_LEAVE\"\n#define leave_ack \"LEAVE_ACK\"\n#define bt_leave \"BT_LEAVE\"\n\n#define BT_INFO_NOTIFY_CMD 0x0106\n#define BT_INFO_LEN 8\n\ntypedef struct _HCI_LINK_INFO{\n\tu2Byte\t\t\t\t\tConnectHandle;\n\tu1Byte\t\t\t\t\tIncomingTrafficMode;\n\tu1Byte\t\t\t\t\tOutgoingTrafficMode;\n\tu1Byte\t\t\t\t\tBTProfile;\n\tu1Byte\t\t\t\t\tBTCoreSpec;\n\ts1Byte\t\t\t\t\tBT_RSSI;\n\tu1Byte\t\t\t\t\tTrafficProfile;\n\tu1Byte\t\t\t\t\tlinkRole;\n}HCI_LINK_INFO, *PHCI_LINK_INFO;\n\n#define\tMAX_BT_ACL_LINK_NUM\t\t\t\t8\n\ntypedef struct _HCI_EXT_CONFIG{\n\tHCI_LINK_INFO\t\t\t\taclLink[MAX_BT_ACL_LINK_NUM];\n\tu1Byte\t\t\t\t\tbtOperationCode;\n\tu2Byte\t\t\t\t\tCurrentConnectHandle;\n\tu1Byte\t\t\t\t\tCurrentIncomingTrafficMode;\n\tu1Byte\t\t\t\t\tCurrentOutgoingTrafficMode;\n\n\tu1Byte\t\t\t\t\tNumberOfACL;\n\tu1Byte\t\t\t\t\tNumberOfSCO;\n\tu1Byte\t\t\t\t\tCurrentBTStatus;\n\tu2Byte\t\t\t\t\tHCIExtensionVer;\n\n\tBOOLEAN\t\t\t\t\tbEnableWifiScanNotify;\n}HCI_EXT_CONFIG, *PHCI_EXT_CONFIG;\n\ntypedef struct _HCI_PHY_LINK_BSS_INFO{\n\tu2Byte\t\t\t\t\t\tbdCap;\t\t\t// capability information\n\n\t// Qos related. Added by Annie, 2005-11-01.\n\t//BSS_QOS\t\t\t\t\t\tBssQos;\t\t\n\t\n}HCI_PHY_LINK_BSS_INFO, *PHCI_PHY_LINK_BSS_INFO;\n\ntypedef enum _BT_CONNECT_TYPE{\n\tBT_CONNECT_AUTH_REQ\t\t\t\t\t\t\t\t=0x00,\t\n\tBT_CONNECT_AUTH_RSP\t\t\t\t\t\t\t\t=0x01,\n\tBT_CONNECT_ASOC_REQ\t\t\t\t\t\t\t\t=0x02,\n\tBT_CONNECT_ASOC_RSP\t\t\t\t\t\t\t\t=0x03,\n\tBT_DISCONNECT\t\t\t\t\t\t\t\t\t\t=0x04\n}BT_CONNECT_TYPE,*PBT_CONNECT_TYPE;\n\n\ntypedef struct _PACKET_IRP_HCIEVENT_DATA {\n\t    u8\t\tEventCode;\n\t    u8\t\tLength; //total cmd length = extension event length+1(extension event code length)\n\t    u8\t\tData[1]; // byte1 is extension event code\n} rtw_HCI_event;\n\n\nstruct btinfo_8761ATV {\n\tu8 cid;\n\tu8 len;\n\n\tu8 bConnection:1;\n\tu8 bSCOeSCO:1;\n\tu8 bInQPage:1;\n\tu8 bACLBusy:1;\n\tu8 bSCOBusy:1;\n\tu8 bHID:1;\n\tu8 bA2DP:1;\n\tu8 bFTP:1;\n\n\tu8 retry_cnt:4;\n\tu8 rsvd_34:1;\n\tu8 bPage:1;\n\tu8 TRxMask:1;\n\tu8 Sniff_attempt:1;\n\n\tu8 rssi;\n\n\tu8 A2dp_rate:1;\n\tu8 ReInit:1;\n\tu8 MaxPower:1;\n\tu8 bEnIgnoreWlanAct:1;\n\tu8 TxPowerLow:1;\n\tu8 TxPowerHigh:1;\n\tu8 eSCO_SCO:1;\n\tu8 Master_Slave:1;\n\n\tu8 ACL_TRx_TP_low;\n\tu8 ACL_TRx_TP_high;\n};\n\n#define HCIOPCODE(_OCF, _OGF)     ((_OGF)<<10|(_OCF))\n#define HCIOPCODELOW(_OCF, _OGF)\t(u8)(HCIOPCODE(_OCF, _OGF)&0x00ff)\n#define HCIOPCODEHIGHT(_OCF, _OGF) (u8)(HCIOPCODE(_OCF, _OGF)>>8)\n#define HCI_OGF(opCode)  (unsigned char)((0xFC00 & (opCode)) >> 10)\n#define HCI_OCF(opCode)  ( 0x3FF & (opCode))\n\n\ntypedef enum _HCI_STATUS{\n\tHCI_STATUS_SUCCESS\t\t\t\t\t\t\t\t\t\t=0x00, //Success\n\tHCI_STATUS_UNKNOW_HCI_CMD\t\t\t\t\t\t\t\t=0x01, //Unknown HCI Command\n\tHCI_STATUS_UNKNOW_CONNECT_ID\t\t\t\t\t\t\t=0X02, //Unknown Connection Identifier\n\tHCI_STATUS_HW_FAIL\t\t\t\t\t\t\t\t\t\t=0X03, //Hardware Failure\n\tHCI_STATUS_PAGE_TIMEOUT\t\t\t\t\t\t\t\t\t=0X04, //Page Timeout\n\tHCI_STATUS_AUTH_FAIL\t\t\t\t\t\t\t\t\t\t=0X05, //Authentication Failure\n\tHCI_STATUS_PIN_OR_KEY_MISSING\t\t\t\t\t\t\t=0X06, //PIN or Key Missing\n\tHCI_STATUS_MEM_CAP_EXCEED\t\t\t\t\t\t\t\t=0X07, //Memory Capacity Exceeded\n\tHCI_STATUS_CONNECT_TIMEOUT\t\t\t\t\t\t\t\t=0X08, //Connection Timeout\n\tHCI_STATUS_CONNECT_LIMIT\t\t\t\t\t\t\t\t\t=0X09, //Connection Limit Exceeded\n\tHCI_STATUS_SYN_CONNECT_LIMIT\t\t\t\t\t\t\t\t=0X0a, //Synchronous Connection Limit To A Device Exceeded\n\tHCI_STATUS_ACL_CONNECT_EXISTS\t\t\t\t\t\t\t=0X0b, //ACL Connection Already Exists\n\tHCI_STATUS_CMD_DISALLOW\t\t\t\t\t\t\t\t\t=0X0c, //Command Disallowed\n\tHCI_STATUS_CONNECT_RJT_LIMIT_RESOURCE\t\t\t\t\t=0X0d, //Connection Rejected due to Limited Resources\n\tHCI_STATUS_CONNECT_RJT_SEC_REASON\t\t\t\t\t\t=0X0e, //Connection Rejected Due To Security Reasons\n\tHCI_STATUS_CONNECT_RJT_UNACCEPT_BD_ADDR\t\t\t\t=0X0f, //Connection Rejected due to Unacceptable BD_ADDR\n\tHCI_STATUS_CONNECT_ACCEPT_TIMEOUT\t\t\t\t\t\t=0X10, //Connection Accept Timeout Exceeded\n\tHCI_STATUS_UNSUPPORT_FEATURE_PARA_VALUE\t\t\t\t=0X11, //Unsupported Feature or Parameter Value\n\tHCI_STATUS_INVALID_HCI_CMD_PARA_VALUE\t\t\t\t\t=0X12, //Invalid HCI Command Parameters\n\tHCI_STATUS_REMOTE_USER_TERMINATE_CONNECT\t\t\t\t=0X13, //Remote User Terminated Connection\n\tHCI_STATUS_REMOTE_DEV_TERMINATE_LOW_RESOURCE\t\t\t=0X14, //Remote Device Terminated Connection due to Low Resources\n\tHCI_STATUS_REMOTE_DEV_TERMINATE_CONNECT_POWER_OFF\t=0X15, //Remote Device Terminated Connection due to Power Off\n\tHCI_STATUS_CONNECT_TERMINATE_LOCAL_HOST\t\t\t\t=0X16, //Connection Terminated By Local Host\n\tHCI_STATUS_REPEATE_ATTEMPT\t\t\t\t\t\t\t\t=0X17, //Repeated Attempts\n\tHCI_STATUS_PAIR_NOT_ALLOW\t\t\t\t\t\t\t\t=0X18, //Pairing Not Allowed\n\tHCI_STATUS_UNKNOW_LMP_PDU\t\t\t\t\t\t\t\t=0X19, //Unknown LMP PDU\n\tHCI_STATUS_UNSUPPORT_REMOTE_LMP_FEATURE\t\t\t\t=0X1a, //Unsupported Remote Feature / Unsupported LMP Feature\n\tHCI_STATUS_SOC_OFFSET_REJECT\t\t\t\t\t\t\t\t=0X1b, //SCO Offset Rejected\n\tHCI_STATUS_SOC_INTERVAL_REJECT\t\t\t\t\t\t\t=0X1c, //SCO Interval Rejected\n\tHCI_STATUS_SOC_AIR_MODE_REJECT\t\t\t\t\t\t\t=0X1d,//SCO Air Mode Rejected\n\tHCI_STATUS_INVALID_LMP_PARA\t\t\t\t\t\t\t\t=0X1e, //Invalid LMP Parameters\n\tHCI_STATUS_UNSPECIFIC_ERROR\t\t\t\t\t\t\t\t=0X1f, //Unspecified Error\n\tHCI_STATUS_UNSUPPORT_LMP_PARA_VALUE\t\t\t\t\t=0X20, //Unsupported LMP Parameter Value\n\tHCI_STATUS_ROLE_CHANGE_NOT_ALLOW\t\t\t\t\t\t=0X21, //Role Change Not Allowed\n\tHCI_STATUS_LMP_RESPONSE_TIMEOUT\t\t\t\t\t\t\t=0X22, //LMP Response Timeout\n\tHCI_STATUS_LMP_ERROR_TRANSACTION_COLLISION\t\t\t\t=0X23, //LMP Error Transaction Collision\n\tHCI_STATUS_LMP_PDU_NOT_ALLOW\t\t\t\t\t\t\t=0X24, //LMP PDU Not Allowed\n\tHCI_STATUS_ENCRYPTION_MODE_NOT_ALLOW\t\t\t\t\t=0X25, //Encryption Mode Not Acceptable\n\tHCI_STATUS_LINK_KEY_CAN_NOT_CHANGE\t\t\t\t\t\t=0X26, //Link Key Can Not be Changed\n\tHCI_STATUS_REQUEST_QOS_NOT_SUPPORT\t\t\t\t\t\t=0X27, //Requested QoS Not Supported\n\tHCI_STATUS_INSTANT_PASSED\t\t\t\t\t\t\t\t=0X28, //Instant Passed\n\tHCI_STATUS_PAIRING_UNIT_KEY_NOT_SUPPORT\t\t\t\t\t=0X29, //Pairing With Unit Key Not Supported\n\tHCI_STATUS_DIFFERENT_TRANSACTION_COLLISION\t\t\t\t=0X2a, //Different Transaction Collision\n\tHCI_STATUS_RESERVE_1\t\t\t\t\t\t\t\t\t\t=0X2b, //Reserved\n\tHCI_STATUS_QOS_UNACCEPT_PARA\t\t\t\t\t\t\t=0X2c, //QoS Unacceptable Parameter\n\tHCI_STATUS_QOS_REJECT\t\t\t\t\t\t\t\t\t\t=0X2d, //QoS Rejected\n\tHCI_STATUS_CHNL_CLASSIFICATION_NOT_SUPPORT\t\t\t\t=0X2e, //Channel Classification Not Supported\n\tHCI_STATUS_INSUFFICIENT_SECURITY\t\t\t\t\t\t\t=0X2f, //Insufficient Security\n\tHCI_STATUS_PARA_OUT_OF_RANGE\t\t\t\t\t\t\t=0x30, //Parameter Out Of Mandatory Range\n\tHCI_STATUS_RESERVE_2\t\t\t\t\t\t\t\t\t\t=0X31, //Reserved\n\tHCI_STATUS_ROLE_SWITCH_PENDING\t\t\t\t\t\t\t=0X32, //Role Switch Pending\n\tHCI_STATUS_RESERVE_3\t\t\t\t\t\t\t\t\t\t=0X33, //Reserved\n\tHCI_STATUS_RESERVE_SOLT_VIOLATION\t\t\t\t\t\t=0X34, //Reserved Slot Violation\n\tHCI_STATUS_ROLE_SWITCH_FAIL\t\t\t\t\t\t\t\t=0X35, //Role Switch Failed\n\tHCI_STATUS_EXTEND_INQUIRY_RSP_TOO_LARGE\t\t\t\t=0X36, //Extended Inquiry Response Too Large\n\tHCI_STATUS_SEC_SIMPLE_PAIRING_NOT_SUPPORT\t\t\t\t=0X37, //Secure Simple Pairing Not Supported By Host.\n\tHCI_STATUS_HOST_BUSY_PAIRING\t\t\t\t\t\t\t\t=0X38, //Host Busy - Pairing\n\tHCI_STATUS_CONNECT_REJ_NOT_SUIT_CHNL_FOUND\t\t\t=0X39, //Connection Rejected due to No Suitable Channel Found\n\tHCI_STATUS_CONTROLLER_BUSY\t\t\t\t\t\t\t\t=0X3a  //CONTROLLER BUSY\n}RTW_HCI_STATUS;\n\n#define HCI_EVENT_COMMAND_COMPLETE\t\t\t\t\t0x0e\n\n#define OGF_EXTENSION\t\t\t\t\t\t\t\t\t0X3f\ntypedef enum HCI_EXTENSION_COMMANDS{\n\tHCI_SET_ACL_LINK_DATA_FLOW_MODE\t\t\t\t=0x0010,\n\tHCI_SET_ACL_LINK_STATUS\t\t\t\t\t\t\t=0x0020,\n\tHCI_SET_SCO_LINK_STATUS\t\t\t\t\t\t\t=0x0030,\n\tHCI_SET_RSSI_VALUE\t\t\t\t\t\t\t\t=0x0040,\n\tHCI_SET_CURRENT_BLUETOOTH_STATUS\t\t\t\t=0x0041,\n\n\t//The following is for RTK8723\n\tHCI_EXTENSION_VERSION_NOTIFY\t\t\t\t\t=0x0100,\n\tHCI_LINK_STATUS_NOTIFY\t\t\t\t\t\t\t=0x0101,\n\tHCI_BT_OPERATION_NOTIFY\t\t\t\t\t\t\t=0x0102,\n\tHCI_ENABLE_WIFI_SCAN_NOTIFY \t\t\t\t\t\t=0x0103,\n\tHCI_QUERY_RF_STATUS\t\t\t\t\t\t\t\t=0x0104,\n\tHCI_BT_ABNORMAL_NOTIFY\t\t\t\t\t\t\t=0x0105,\n\tHCI_BT_INFO_NOTIFY\t\t\t\t\t\t\t\t=0x0106,\n\tHCI_BT_COEX_NOTIFY\t\t\t\t\t\t\t\t=0x0107,\n\tHCI_BT_PATCH_VERSION_NOTIFY\t\t\t\t\t\t=0x0108,\n\tHCI_BT_AFH_MAP_NOTIFY\t\t\t\t\t\t\t=0x0109,\n\tHCI_BT_REGISTER_VALUE_NOTIFY\t\t\t\t\t=0x010a,\n\t\n\t//The following is for IVT\n\tHCI_WIFI_CURRENT_CHANNEL\t\t\t\t\t\t=0x0300,\t\n\tHCI_WIFI_CURRENT_BANDWIDTH\t\t\t\t\t\t=0x0301,\t\t\n\tHCI_WIFI_CONNECTION_STATUS\t\t\t\t\t\t=0x0302\n}RTW_HCI_EXT_CMD;\n\n#define HCI_EVENT_EXTENSION_RTK\t\t\t\t\t\t0xfe\ntypedef enum HCI_EXTENSION_EVENT_RTK{\n\tHCI_EVENT_EXT_WIFI_SCAN_NOTIFY\t\t\t\t\t\t\t\t=0x01,\n\tHCI_EVENT_EXT_WIFI_RF_STATUS_NOTIFY\t\t\t\t\t\t=0x02,\n\tHCI_EVENT_EXT_BT_INFO_CONTROL\t\t\t\t\t\t\t\t=0x03,\n\tHCI_EVENT_EXT_BT_COEX_CONTROL\t\t\t\t\t\t\t\t=0x04\n}RTW_HCI_EXT_EVENT;\n\ntypedef enum _BT_TRAFFIC_MODE{\n\tBT_MOTOR_EXT_BE\t\t= 0x00, //Best Effort. Default. for HCRP, PAN, SDP, RFCOMM-based profiles like FTP,OPP, SPP, DUN, etc.\n\tBT_MOTOR_EXT_GUL\t\t= 0x01, //Guaranteed Latency. This type of traffic is used e.g. for HID and AVRCP.\n\tBT_MOTOR_EXT_GUB\t\t= 0X02, //Guaranteed Bandwidth.\n\tBT_MOTOR_EXT_GULB\t= 0X03  //Guaranteed Latency and Bandwidth. for A2DP and VDP.\n} BT_TRAFFIC_MODE;\n\ntypedef enum _BT_TRAFFIC_MODE_PROFILE{\n\tBT_PROFILE_NONE,\t\n\tBT_PROFILE_A2DP,\n\tBT_PROFILE_PAN\t,\n\tBT_PROFILE_HID,\n\tBT_PROFILE_SCO\t\t\n} BT_TRAFFIC_MODE_PROFILE;\n\ntypedef enum _HCI_EXT_BT_OPERATION {\n\tHCI_BT_OP_NONE\t\t\t\t= 0x0,\n\tHCI_BT_OP_INQUIRY_START\t\t= 0x1,\n\tHCI_BT_OP_INQUIRY_FINISH\t\t= 0x2,\n\tHCI_BT_OP_PAGING_START\t\t= 0x3,\n\tHCI_BT_OP_PAGING_SUCCESS\t\t= 0x4,\n\tHCI_BT_OP_PAGING_UNSUCCESS\t= 0x5,\n\tHCI_BT_OP_PAIRING_START\t\t= 0x6,\n\tHCI_BT_OP_PAIRING_FINISH\t\t= 0x7,\n\tHCI_BT_OP_BT_DEV_ENABLE\t\t= 0x8,\n\tHCI_BT_OP_BT_DEV_DISABLE\t\t= 0x9,\n\tHCI_BT_OP_MAX\n} HCI_EXT_BT_OPERATION, *PHCI_EXT_BT_OPERATION;\n\ntypedef struct _BT_MGNT{\n\tBOOLEAN\t\t\t\tbBTConnectInProgress;\n\tBOOLEAN\t\t\t\tbLogLinkInProgress;\n\tBOOLEAN\t\t\t\tbPhyLinkInProgress;\n\tBOOLEAN\t\t\t\tbPhyLinkInProgressStartLL;\n\tu1Byte\t\t\t\tBtCurrentPhyLinkhandle;\n\tu2Byte\t\t\t\tBtCurrentLogLinkhandle;\t\n\tu1Byte\t\t\t\tCurrentConnectEntryNum;\n\tu1Byte\t\t\t\tDisconnectEntryNum;\n\tu1Byte\t\t\t\tCurrentBTConnectionCnt;\n\tBT_CONNECT_TYPE\t\tBTCurrentConnectType;\n\tBT_CONNECT_TYPE\t\tBTReceiveConnectPkt;\t\n\tu1Byte\t\t\t\tBTAuthCount;\n\tu1Byte\t\t\t\tBTAsocCount;\n\tBOOLEAN\t\t\t\tbStartSendSupervisionPkt;\n\tBOOLEAN\t\t\t\tBtOperationOn;\n\tBOOLEAN\t\t\t\tBTNeedAMPStatusChg;\n\tBOOLEAN\t\t\t\tJoinerNeedSendAuth;\n\tHCI_PHY_LINK_BSS_INFO\tbssDesc;\n\tHCI_EXT_CONFIG\t\tExtConfig;\n\tBOOLEAN\t\t\t\tbNeedNotifyAMPNoCap;\n\tBOOLEAN\t\t\t\tbCreateSpportQos;\n\tBOOLEAN\t\t\t\tbSupportProfile;\n\tu1Byte\t\t\t\tBTChannel;\n\tBOOLEAN\t\t\t\tCheckChnlIsSuit;\n\tBOOLEAN\t\t\t\tbBtScan;\n\tBOOLEAN\t\t\t\tbtLogoTest;\n\tBOOLEAN\t\t\t\tbRfStatusNotified;\n\tBOOLEAN\t\t\t\tbBtRsvedPageDownload;\n}BT_MGNT, *PBT_MGNT;\n\nstruct bt_coex_info {\n\t/* For Kernel Socket */\n\tstruct socket *udpsock; \n\tstruct sockaddr_in wifi_sockaddr; /*wifi socket*/\n\tstruct sockaddr_in bt_sockaddr;/* BT socket  */\n\tstruct sock *sk_store;/*back up socket for UDP RX int*/\n\t\n\t/* store which socket is OK */\n\tu8 sock_open;\n\t\t\n\tu8 BT_attend;\n\tu8 is_exist; /* socket exist */\n\tBT_MGNT BtMgnt;\n\tstruct workqueue_struct *btcoex_wq;\n\tstruct delayed_work recvmsg_work;\n};\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n#define\tPACKET_NORMAL\t\t\t0\n#define\tPACKET_DHCP\t\t\t\t1\n#define\tPACKET_ARP\t\t\t\t2\n#define\tPACKET_EAPOL\t\t\t3\n\nvoid rtw_btcoex_Initialize(PADAPTER);\nvoid rtw_btcoex_PowerOnSetting(PADAPTER padapter);\nvoid rtw_btcoex_PreLoadFirmware(PADAPTER padapter);\nvoid rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly);\nvoid rtw_btcoex_IpsNotify(PADAPTER, u8 type);\nvoid rtw_btcoex_LpsNotify(PADAPTER, u8 type);\nvoid rtw_btcoex_ScanNotify(PADAPTER, u8 type);\nvoid rtw_btcoex_ConnectNotify(PADAPTER, u8 action);\nvoid rtw_btcoex_MediaStatusNotify(PADAPTER, u8 mediaStatus);\nvoid rtw_btcoex_SpecialPacketNotify(PADAPTER, u8 pktType);\nvoid rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state);\nvoid rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf);\nvoid rtw_btcoex_SuspendNotify(PADAPTER, u8 state);\nvoid rtw_btcoex_HaltNotify(PADAPTER);\nvoid rtw_btcoex_SwitchBtTRxMask(PADAPTER);\nvoid rtw_btcoex_Switch(PADAPTER, u8 enable);\nu8 rtw_btcoex_IsBtDisabled(PADAPTER);\nvoid rtw_btcoex_Handler(PADAPTER);\ns32 rtw_btcoex_IsBTCoexRejectAMPDU(PADAPTER padapter);\ns32 rtw_btcoex_IsBTCoexCtrlAMPDUSize(PADAPTER);\nu32 rtw_btcoex_GetAMPDUSize(PADAPTER);\nvoid rtw_btcoex_SetManualControl(PADAPTER, u8 bmanual);\nu8 rtw_btcoex_1Ant(PADAPTER);\nu8 rtw_btcoex_IsBtControlLps(PADAPTER);\nu8 rtw_btcoex_IsLpsOn(PADAPTER);\nu8 rtw_btcoex_RpwmVal(PADAPTER);\nu8 rtw_btcoex_LpsVal(PADAPTER);\nvoid rtw_btcoex_SetBTCoexist(PADAPTER, u8 bBtExist);\nvoid rtw_btcoex_SetChipType(PADAPTER, u8 chipType);\nvoid rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum);\nu8 rtw_btcoex_GetPGAntNum(PADAPTER);\nvoid rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);\nu32 rtw_btcoex_GetRaMask(PADAPTER);\nvoid rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen);\nvoid rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);\nvoid rtw_btcoex_SetDBG(PADAPTER, u32 *pDbgModule);\nu32 rtw_btcoex_GetDBG(PADAPTER, u8 *pStrBuf, u32 bufSize);\nu8 rtw_btcoex_IncreaseScanDeviceNum(PADAPTER);\nu8 rtw_btcoex_IsBtLinkExist(PADAPTER);\nvoid rtw_btcoex_BTOffOnNotify(PADAPTER padapter, u8 bBTON);\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\nvoid rtw_btcoex_SetBtPatchVersion(PADAPTER padapter,u16 btHciVer, u16 btPatchVer);\nvoid rtw_btcoex_SetHciVersion(PADAPTER  padapter, u16 hciVersion);\nvoid rtw_btcoex_StackUpdateProfileInfo(void);\nvoid rtw_btcoex_init_socket(_adapter *padapter);\nvoid rtw_btcoex_close_socket(_adapter *padapter);\nvoid rtw_btcoex_dump_tx_msg(u8 *tx_msg, u8 len, u8 *msg_name);\nu8 rtw_btcoex_sendmsgbysocket(_adapter *padapter, u8 *msg, u8 msg_size, bool force);\nu8 rtw_btcoex_create_kernel_socket(_adapter *padapter);\nvoid rtw_btcoex_close_kernel_socket(_adapter *padapter);\nvoid rtw_btcoex_recvmsgbysocket(void *data);\nu16 rtw_btcoex_parse_recv_data(u8 *msg, u8 msg_size);\nu8 rtw_btcoex_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);\nvoid rtw_btcoex_parse_hci_cmd(_adapter *padapter, u8 *cmd, u16 len);\nvoid rtw_btcoex_SendEventExtBtCoexControl(PADAPTER Adapter, u8 bNeedDbgRsp, u8 dataLen, void *pData);\nvoid rtw_btcoex_SendEventExtBtInfoControl(PADAPTER Adapter, u8 dataLen, void *pData);\nvoid rtw_btcoex_SendScanNotify(PADAPTER padapter, u8 scanType);\n#define BT_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData) rtw_btcoex_SendEventExtBtCoexControl(Adapter, bNeedDbgRsp, dataLen, pData)\n#define BT_SendEventExtBtInfoControl(Adapter, dataLen, pData) rtw_btcoex_SendEventExtBtInfoControl(Adapter, dataLen, pData)\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n// ==================================================\n// Below Functions are called by BT-Coex\n// ==================================================\nvoid rtw_btcoex_rx_ampdu_apply(PADAPTER);\nvoid rtw_btcoex_LPS_Enter(PADAPTER);\nvoid rtw_btcoex_LPS_Leave(PADAPTER);\n\n#endif // __RTW_BTCOEX_H__\n\n"
  },
  {
    "path": "include/rtw_byteorder.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTL871X_BYTEORDER_H_\n#define _RTL871X_BYTEORDER_H_\n\n\n#if defined (CONFIG_LITTLE_ENDIAN) && defined (CONFIG_BIG_ENDIAN)\n#error \"Shall be CONFIG_LITTLE_ENDIAN or CONFIG_BIG_ENDIAN, but not both!\\n\"\n#endif\n\n#if defined (CONFIG_LITTLE_ENDIAN)\n#ifndef CONFIG_PLATFORM_MSTAR389\n#  include <byteorder/little_endian.h>\n#endif\n#elif defined (CONFIG_BIG_ENDIAN)\n#  include <byteorder/big_endian.h>\n#else\n#  error \"Must be LITTLE/BIG Endian Host\"\n#endif\n\n#endif /* _RTL871X_BYTEORDER_H_ */\n\n"
  },
  {
    "path": "include/rtw_cmd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_CMD_H_\n#define __RTW_CMD_H_\n\n\n#define C2H_MEM_SZ (16*1024)\n\n#ifndef CONFIG_RTL8711FW\n\n\t#define FREE_CMDOBJ_SZ\t128\n\t\n\t#define MAX_CMDSZ\t1024\n\t#define MAX_RSPSZ\t512\n\t#define MAX_EVTSZ\t1024\n\n#ifdef PLATFORM_OS_CE\n\t#define CMDBUFF_ALIGN_SZ 4\n#else\n\t#define CMDBUFF_ALIGN_SZ 512\n#endif\n\n\tstruct cmd_obj {\n\t\t_adapter *padapter;\n\t\tu16\tcmdcode;\n\t\tu8\tres;\n\t\tu8\t*parmbuf;\n\t\tu32\tcmdsz;\n\t\tu8\t*rsp;\n\t\tu32\trspsz;\n\t\tstruct submit_ctx *sctx;\n\t\t//_sema \tcmd_sem;\n\t\t_list\tlist;\n\t};\n\n\t/* cmd flags */\n\tenum {\n\t\tRTW_CMDF_DIRECTLY = BIT0,\n\t\tRTW_CMDF_WAIT_ACK = BIT1,\n\t};\n\n\tstruct cmd_priv {\n\t\t_sema\tcmd_queue_sema;\n\t\t//_sema\tcmd_done_sema;\n\t\t_sema\tterminate_cmdthread_sema;\t\t\n\t\t_queue\tcmd_queue;\n\t\tu8\tcmd_seq;\n\t\tu8\t*cmd_buf;\t//shall be non-paged, and 4 bytes aligned\n\t\tu8\t*cmd_allocated_buf;\n\t\tu8\t*rsp_buf;\t//shall be non-paged, and 4 bytes aligned\t\t\n\t\tu8\t*rsp_allocated_buf;\n\t\tu32\tcmd_issued_cnt;\n\t\tu32\tcmd_done_cnt;\n\t\tu32\trsp_cnt;\n\t\tATOMIC_T cmdthd_running;\n\t\t//u8 cmdthd_running;\n\t\tu8 stop_req;\n\t\t_adapter *padapter;\n\t\t_mutex sctx_mutex;\n\t};\n\n#ifdef CONFIG_EVENT_THREAD_MODE\n\tstruct evt_obj {\n\t\tu16\tevtcode;\n\t\tu8\tres;\n\t\tu8\t*parmbuf;\n\t\tu32\tevtsz;\t\t\n\t\t_list\tlist;\n\t};\n#endif\n\n\tstruct\tevt_priv {\n#ifdef CONFIG_EVENT_THREAD_MODE\n\t\t_sema\tevt_notify;\n\t\t_sema\tterminate_evtthread_sema;\n\t\t_queue\tevt_queue;\n#endif\n\n#define CONFIG_C2H_WK\n#ifdef CONFIG_C2H_WK\n\t\t_workitem c2h_wk;\n\t\tbool c2h_wk_alive;\n\t\tstruct rtw_cbuf *c2h_queue;\n\t\t#define C2H_QUEUE_MAX_LEN 10\n#endif\n\t\t\n#ifdef CONFIG_H2CLBK\n\t\t_sema\tlbkevt_done;\n\t\tu8\tlbkevt_limit;\n\t\tu8\tlbkevt_num;\n\t\tu8\t*cmdevt_parm;\t\t\n#endif\n\t\tATOMIC_T event_seq;\n\t\tu8\t*evt_buf;\t//shall be non-paged, and 4 bytes aligned\t\t\n\t\tu8\t*evt_allocated_buf;\n\t\tu32\tevt_done_cnt;\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tu8\t*c2h_mem;\n\t\tu8\t*allocated_c2h_mem;\n#ifdef PLATFORM_OS_XP\n\t\tPMDL\tpc2h_mdl;\n#endif\n#endif\n\n\t};\n\n#define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \\\ndo {\\\n\t_rtw_init_listhead(&pcmd->list);\\\n\tpcmd->cmdcode = code;\\\n\tpcmd->parmbuf = (u8 *)(pparm);\\\n\tpcmd->cmdsz = sizeof (*pparm);\\\n\tpcmd->rsp = NULL;\\\n\tpcmd->rspsz = 0;\\\n} while(0)\n\n#define init_h2fwcmd_w_parm_no_parm_rsp(pcmd, code) \\\ndo {\\\n\t_rtw_init_listhead(&pcmd->list);\\\n\tpcmd->cmdcode = code;\\\n\tpcmd->parmbuf = NULL;\\\n\tpcmd->cmdsz = 0;\\\n\tpcmd->rsp = NULL;\\\n\tpcmd->rspsz = 0;\\\n} while(0)\n\nstruct c2h_evt_hdr {\n\tu8 id:4;\n\tu8 plen:4;\n\tu8 seq;\n\tu8 payload[0];\n};\n\nstruct c2h_evt_hdr_88xx {\n\tu8 id;\n\tu8 seq;\n\tu8 payload[12];\n\tu8 plen;\n\tu8 trigger;\n};\n\n#define c2h_evt_valid(c2h_evt) ((c2h_evt)->id || (c2h_evt)->plen)\n\nstruct P2P_PS_Offload_t {\n\tu8 Offload_En:1;\n\tu8 role:1; // 1: Owner, 0: Client\n\tu8 CTWindow_En:1;\n\tu8 NoA0_En:1;\n\tu8 NoA1_En:1;\n\tu8 AllStaSleep:1; // Only valid in Owner\n\tu8 discovery:1;\n\tu8 rsvd:1;\n};\n\nstruct P2P_PS_CTWPeriod_t {\n\tu8 CTWPeriod;\t//TU\n};\n\n#ifdef CONFIG_P2P_WOWLAN\n\nstruct P2P_WoWlan_Offload_t{\n\tu8 Disconnect_Wkup_Drv:1;\n\tu8 role:2;\n\tu8 Wps_Config[2];\n};\n\n#endif //CONFIG_P2P_WOWLAN\n\nextern u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *obj);\nextern struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv);\nextern void rtw_free_cmd_obj(struct cmd_obj *pcmd);\n\n#ifdef CONFIG_EVENT_THREAD_MODE\nextern u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj);\nextern struct evt_obj *rtw_dequeue_evt(_queue *queue);\nextern void rtw_free_evt_obj(struct evt_obj *pcmd);\n#endif\n\nvoid rtw_stop_cmd_thread(_adapter *adapter);\nthread_return rtw_cmd_thread(thread_context context);\n\nextern u32 rtw_init_cmd_priv (struct cmd_priv *pcmdpriv);\nextern void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv);\n\nextern u32 rtw_init_evt_priv (struct evt_priv *pevtpriv);\nextern void rtw_free_evt_priv (struct evt_priv *pevtpriv);\nextern void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv);\nextern void rtw_evt_notify_isr(struct evt_priv *pevtpriv);\n#ifdef CONFIG_P2P\nu8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType );\n#endif //CONFIG_P2P\n\n#else\n\t//#include <ieee80211.h>\n#endif\t/* CONFIG_RTL8711FW */\n\nenum rtw_drvextra_cmd_id\n{\t\n\tNONE_WK_CID,\n\tDYNAMIC_CHK_WK_CID,\n\tDM_CTRL_WK_CID,\n\tPBC_POLLING_WK_CID,\n\tPOWER_SAVING_CTRL_WK_CID,//IPS,AUTOSuspend\n\tLPS_CTRL_WK_CID,\n\tANT_SELECT_WK_CID,\n\tP2P_PS_WK_CID,\n\tP2P_PROTO_WK_CID,\n\tCHECK_HIQ_WK_CID,//for softap mode, check hi queue if empty\n\tINTEl_WIDI_WK_CID,\n\tC2H_WK_CID,\n\tRTP_TIMER_CFG_WK_CID,\n\tRESET_SECURITYPRIV, // add for CONFIG_IEEE80211W, none 11w also can use\n\tFREE_ASSOC_RESOURCES, // add for CONFIG_IEEE80211W, none 11w also can use\n\tDM_IN_LPS_WK_CID,\n\tDM_RA_MSK_WK_CID, //add for STA update RAMask when bandwith change.\n\tBEAMFORMING_WK_CID,\n\tLPS_CHANGE_DTIM_CID,\n\tBTINFO_WK_CID,\n\tDFS_MASTER_WK_CID,\n\tMAX_WK_CID\n};\n\nenum LPS_CTRL_TYPE\n{\n\tLPS_CTRL_SCAN=0,\n\tLPS_CTRL_JOINBSS=1,\n\tLPS_CTRL_CONNECT=2,\n\tLPS_CTRL_DISCONNECT=3,\n\tLPS_CTRL_SPECIAL_PACKET=4,\n\tLPS_CTRL_LEAVE=5,\n\tLPS_CTRL_TRAFFIC_BUSY = 6,\n\tLPS_CTRL_TX_TRAFFIC_LEAVE = 7,\n\tLPS_CTRL_RX_TRAFFIC_LEAVE = 8,\t\n\tLPS_CTRL_ENTER = 9,\n};\n\nenum STAKEY_TYPE\n{\n\tGROUP_KEY\t\t=0,\n\tUNICAST_KEY\t\t=1,\n\tTDLS_KEY\t\t=2,\n};\n\nenum RFINTFS {\n\tSWSI,\n\tHWSI,\n\tHWPI,\n};\n\n/*\nCaller Mode: Infra, Ad-HoC(C)\n\nNotes: To enter USB suspend mode\n\nCommand Mode\n\n*/\nstruct usb_suspend_parm {\n\tu32 action;// 1: sleep, 0:resume\n};\n\n/*\nCaller Mode: Infra, Ad-HoC\n\nNotes: To join a known BSS.\n\nCommand-Event Mode\n\n*/\n\n/*\nCaller Mode: Infra, Ad-Hoc\n\nNotes: To join the specified bss\n\nCommand Event Mode\n\n*/\nstruct joinbss_parm {\n\tWLAN_BSSID_EX network;\n};\n\n/*\nCaller Mode: Infra, Ad-HoC(C)\n\nNotes: To disconnect the current associated BSS\n\nCommand Mode\n\n*/\nstruct disconnect_parm {\n\tu32 deauth_timeout_ms;\n};\n\n/*\nCaller Mode: AP, Ad-HoC(M)\n\nNotes: To create a BSS\n\nCommand Mode\n*/\nstruct createbss_parm {\n\tbool adhoc;\n\n\t/* used by AP mode now */\n\ts16 req_ch;\n\tu8 req_bw;\n\tu8 req_offset;\n};\n\n/*\nCaller Mode: AP, Ad-HoC, Infra\n\nNotes: To set the NIC mode of RTL8711\n\nCommand Mode\n\nThe definition of mode:\n\n#define IW_MODE_AUTO\t0\t// Let the driver decides which AP to join\n#define IW_MODE_ADHOC\t1\t// Single cell network (Ad-Hoc Clients)\n#define IW_MODE_INFRA\t2\t// Multi cell network, roaming, ..\n#define IW_MODE_MASTER\t3\t// Synchronisation master or Access Point\n#define IW_MODE_REPEAT\t4\t// Wireless Repeater (forwarder)\n#define IW_MODE_SECOND\t5\t// Secondary master/repeater (backup)\n#define IW_MODE_MONITOR\t6\t// Passive monitor (listen only)\n\n*/\nstruct\tsetopmode_parm {\n\tu8\tmode;\n\tu8\trsvd[3];\n};\n\n/*\nCaller Mode: AP, Ad-HoC, Infra\n\nNotes: To ask RTL8711 performing site-survey\n\nCommand-Event Mode \n\n*/\n\n#define RTW_SSID_SCAN_AMOUNT 9 // for WEXT_CSCAN_AMOUNT 9\n#define RTW_CHANNEL_SCAN_AMOUNT (14+37)\nstruct sitesurvey_parm {\n\tsint scan_mode;\t//active: 1, passive: 0 \n\t/* sint bsslimit;\t// 1 ~ 48 */\n\tu8 ssid_num;\n\tu8 ch_num;\n\tNDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];\n\tstruct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];\n};\n\n/*\nCaller Mode: Any\n\nNotes: To set the auth type of RTL8711. open/shared/802.1x\n\nCommand Mode\n\n*/\nstruct setauth_parm {\n\tu8 mode;  //0: legacy open, 1: legacy shared 2: 802.1x\n\tu8 _1x;   //0: PSK, 1: TLS\n\tu8 rsvd[2];\n};\n\n/*\nCaller Mode: Infra\n\na. algorithm: wep40, wep104, tkip & aes\nb. keytype: grp key/unicast key\nc. key contents\n\nwhen shared key ==> keyid is the camid\nwhen 802.1x ==> keyid [0:1] ==> grp key\nwhen 802.1x ==> keyid > 2 ==> unicast key\n\n*/\nstruct setkey_parm {\n\tu8\talgorithm;\t// encryption algorithm, could be none, wep40, TKIP, CCMP, wep104\n\tu8\tkeyid;\t\t\n\tu8 \tgrpkey;\t\t// 1: this is the grpkey for 802.1x. 0: this is the unicast key for 802.1x\n\tu8 \tset_tx;\t\t// 1: main tx key for wep. 0: other key.\n\tu8\tkey[16];\t// this could be 40 or 104\n};\n\n/*\nWhen in AP or Ad-Hoc mode, this is used to \nallocate an sw/hw entry for a newly associated sta.\n\nCommand\n\nwhen shared key ==> algorithm/keyid \n\n*/\nstruct set_stakey_parm {\n\tu8\taddr[ETH_ALEN];\n\tu8\talgorithm;\n\tu8\tkeyid;\n\tu8\tkey[16];\n};\n\nstruct set_stakey_rsp {\n\tu8\taddr[ETH_ALEN];\n\tu8\tkeyid;\n\tu8\trsvd;\n};\n\n/*\nCaller Ad-Hoc/AP\n\nCommand -Rsp(AID == CAMID) mode\n\nThis is to force fw to add an sta_data entry per driver's request.\n\nFW will write an cam entry associated with it.\n\n*/\nstruct set_assocsta_parm {\n\tu8\taddr[ETH_ALEN];\n};\n\nstruct set_assocsta_rsp {\n\tu8\tcam_id;\n\tu8\trsvd[3];\n};\n\n/*\n\tCaller Ad-Hoc/AP\n\t\n\tCommand mode\n\t\n\tThis is to force fw to del an sta_data entry per driver's request\n\t\n\tFW will invalidate the cam entry associated with it.\n\n*/\nstruct del_assocsta_parm {\n\tu8  \taddr[ETH_ALEN];\n};\n\n/*\nCaller Mode: AP/Ad-HoC(M)\n\nNotes: To notify fw that given staid has changed its power state\n\nCommand Mode\n\n*/\nstruct setstapwrstate_parm {\n\tu8\tstaid;\n\tu8\tstatus;\n\tu8\thwaddr[6];\n};\n\n/*\nCaller Mode: Any\n\nNotes: To setup the basic rate of RTL8711\n\nCommand Mode\n\n*/\nstruct\tsetbasicrate_parm {\n\tu8\tbasicrates[NumRates];\n};\n\n/*\nCaller Mode: Any\n\nNotes: To read the current basic rate\n\nCommand-Rsp Mode\n\n*/\nstruct getbasicrate_parm {\n\tu32 rsvd;\n};\n\nstruct getbasicrate_rsp {\n\tu8 basicrates[NumRates];\n};\n\n/*\nCaller Mode: Any\n\nNotes: To setup the data rate of RTL8711\n\nCommand Mode\n\n*/\nstruct setdatarate_parm {\n#ifdef MP_FIRMWARE_OFFLOAD\n\tu32\tcurr_rateidx;\n#else\n\tu8\tmac_id;\n\tu8\tdatarates[NumRates];\n#endif\n};\n\n/*\nCaller Mode: Any\n\nNotes: To read the current data rate\n\nCommand-Rsp Mode\n\n*/\nstruct getdatarate_parm {\n\tu32 rsvd;\n\t\n};\nstruct getdatarate_rsp {\n\tu8 datarates[NumRates];\n};\n\n\n/*\nCaller Mode: Any\nAP: AP can use the info for the contents of beacon frame\nInfra: STA can use the info when sitesurveying\nAd-HoC(M): Like AP\nAd-HoC(C): Like STA\n\n\nNotes: To set the phy capability of the NIC\n\nCommand Mode\n\n*/\n\nstruct\tsetphyinfo_parm {\n\tstruct regulatory_class class_sets[NUM_REGULATORYS];\n\tu8\tstatus;\n};\n\nstruct\tgetphyinfo_parm {\n\tu32 rsvd;\n};\n\nstruct\tgetphyinfo_rsp {\n\tstruct regulatory_class class_sets[NUM_REGULATORYS];\n\tu8\tstatus;\n};\n\n/*\nCaller Mode: Any\n\nNotes: To set the channel/modem/band\nThis command will be used when channel/modem/band is changed.\n\nCommand Mode\n\n*/\nstruct\tsetphy_parm {\n\tu8\trfchannel;\n\tu8\tmodem;\n};\n\n/*\nCaller Mode: Any\n\nNotes: To get the current setting of channel/modem/band\n\nCommand-Rsp Mode\n\n*/\nstruct\tgetphy_parm {\n\tu32 rsvd;\n\n};\nstruct\tgetphy_rsp {\n\tu8\trfchannel;\n\tu8\tmodem;\n};\n\nstruct readBB_parm {\n\tu8\toffset;\n};\nstruct readBB_rsp {\n\tu8\tvalue;\n};\n\nstruct readTSSI_parm {\n\tu8\toffset;\n};\nstruct readTSSI_rsp {\n\tu8\tvalue;\n};\n\nstruct readMAC_parm {\n\tu8 len;\n\tu32\taddr;\n};\n\nstruct writeBB_parm {\n\tu8\toffset;\n\tu8\tvalue;\n};\n\nstruct readRF_parm {\n\tu8\toffset;\n};\nstruct readRF_rsp {\n\tu32\tvalue;\n};\n\nstruct writeRF_parm {\n\tu32\toffset;\n\tu32\tvalue;\n};\n\nstruct getrfintfs_parm {\n\tu8\trfintfs;\n};\n\n\nstruct Tx_Beacon_param\n{\n\tWLAN_BSSID_EX network;\n};\n\n/*\n\tNotes: This command is used for H2C/C2H loopback testing\n\n\tmac[0] == 0 \n\t==> CMD mode, return H2C_SUCCESS.\n\tThe following condition must be ture under CMD mode\n\t\tmac[1] == mac[4], mac[2] == mac[3], mac[0]=mac[5]= 0;\n\t\ts0 == 0x1234, s1 == 0xabcd, w0 == 0x78563412, w1 == 0x5aa5def7;\n\t\ts2 == (b1 << 8 | b0);\n\t\n\tmac[0] == 1\n\t==> CMD_RSP mode, return H2C_SUCCESS_RSP\n\t\n\tThe rsp layout shall be:\n\trsp: \t\t\tparm:\n\t\tmac[0]  =   mac[5];\n\t\tmac[1]  =   mac[4];\n\t\tmac[2]  =   mac[3];\n\t\tmac[3]  =   mac[2];\n\t\tmac[4]  =   mac[1];\n\t\tmac[5]  =   mac[0];\n\t\ts0\t\t=   s1;\n\t\ts1\t\t=   swap16(s0);\n\t\tw0\t\t=  \tswap32(w1);\n\t\tb0\t\t= \tb1\n\t\ts2\t\t= \ts0 + s1\n\t\tb1\t\t= \tb0\n\t\tw1\t\t=\tw0\n\t\t\n\tmac[0] == \t2\n\t==> CMD_EVENT mode, return \tH2C_SUCCESS\n\tThe event layout shall be:\n\tevent:\t\t\tparm:\n\t\tmac[0]  =   mac[5];\n\t\tmac[1]  =   mac[4];\n\t\tmac[2]  =   event's sequence number, starting from 1 to parm's marc[3]\n\t\tmac[3]  =   mac[2];\n\t\tmac[4]  =   mac[1];\n\t\tmac[5]  =   mac[0];\n\t\ts0\t\t=   swap16(s0) - event.mac[2];\n\t\ts1\t\t=   s1 + event.mac[2];\n\t\tw0\t\t=  \tswap32(w0);\n\t\tb0\t\t= \tb1\n\t\ts2\t\t= \ts0 + event.mac[2]\n\t\tb1\t\t= \tb0 \n\t\tw1\t\t=\tswap32(w1) - event.mac[2];\t\n\t\n\t\tparm->mac[3] is the total event counts that host requested.\n\t\t\n\t\n\tevent will be the same with the cmd's param.\n\t\t\n*/\n\n#ifdef CONFIG_H2CLBK\n\nstruct seth2clbk_parm {\n\tu8 mac[6];\n\tu16\ts0;\n\tu16\ts1;\n\tu32\tw0;\n\tu8\tb0;\n\tu16  s2;\n\tu8\tb1;\n\tu32\tw1;\n};\n\nstruct geth2clbk_parm {\n\tu32 rsv;\t\n};\n\nstruct geth2clbk_rsp {\n\tu8\tmac[6];\n\tu16\ts0;\n\tu16\ts1;\n\tu32\tw0;\n\tu8\tb0;\n\tu16\ts2;\n\tu8\tb1;\n\tu32\tw1;\n};\n\n#endif\t/* CONFIG_H2CLBK */\n\n// CMD param Formart for driver extra cmd handler\nstruct drvextra_cmd_parm {\n\tint ec_id; //extra cmd id\n\tint type; // Can use this field as the type id or command size\n\tint size; //buffer size\n\tunsigned char *pbuf;\n};\n\n/*------------------- Below are used for RF/BB tunning ---------------------*/\n\nstruct\tsetantenna_parm {\n\tu8\ttx_antset;\t\t\n\tu8\trx_antset;\n\tu8\ttx_antenna;\t\t\n\tu8\trx_antenna;\t\t\n};\n\nstruct\tenrateadaptive_parm {\n\tu32\ten;\n};\n\nstruct settxagctbl_parm {\n\tu32\ttxagc[MAX_RATES_LENGTH];\n};\n\nstruct gettxagctbl_parm {\n\tu32 rsvd;\n};\nstruct gettxagctbl_rsp {\n\tu32\ttxagc[MAX_RATES_LENGTH];\n};\n\nstruct setagcctrl_parm {\n\tu32\tagcctrl;\t\t// 0: pure hw, 1: fw\n};\n\n\nstruct setssup_parm\t{\n\tu32\tss_ForceUp[MAX_RATES_LENGTH];\n};\n\nstruct getssup_parm\t{\n\tu32 rsvd;\n};\nstruct getssup_rsp\t{\n\tu8\tss_ForceUp[MAX_RATES_LENGTH];\n};\n\n\nstruct setssdlevel_parm\t{\n\tu8\tss_DLevel[MAX_RATES_LENGTH];\n};\n\nstruct getssdlevel_parm\t{\n\tu32 rsvd;\n};\nstruct getssdlevel_rsp\t{\n\tu8\tss_DLevel[MAX_RATES_LENGTH];\n};\n\nstruct setssulevel_parm\t{\n\tu8\tss_ULevel[MAX_RATES_LENGTH];\n};\n\nstruct getssulevel_parm\t{\n\tu32 rsvd;\n};\nstruct getssulevel_rsp\t{\n\tu8\tss_ULevel[MAX_RATES_LENGTH];\n};\n\n\nstruct\tsetcountjudge_parm {\n\tu8\tcount_judge[MAX_RATES_LENGTH];\n};\n\nstruct\tgetcountjudge_parm {\n\tu32 rsvd;\n};\nstruct\tgetcountjudge_rsp {\n\tu8\tcount_judge[MAX_RATES_LENGTH];\n};\n\n\nstruct setratable_parm {\n\tu8 ss_ForceUp[NumRates];\n\tu8 ss_ULevel[NumRates];\n\tu8 ss_DLevel[NumRates];\n\tu8 count_judge[NumRates];\n};\n\nstruct getratable_parm {\n                uint rsvd;\n};\nstruct getratable_rsp {\n        u8 ss_ForceUp[NumRates];\n        u8 ss_ULevel[NumRates];\n        u8 ss_DLevel[NumRates];\n        u8 count_judge[NumRates];\n};\n\n\n//to get TX,RX retry count\nstruct gettxretrycnt_parm{\n\tunsigned int rsvd;\n};\nstruct gettxretrycnt_rsp{\n\tunsigned long tx_retrycnt;\n};\n\nstruct getrxretrycnt_parm{\n\tunsigned int rsvd;\n};\nstruct getrxretrycnt_rsp{\n\tunsigned long rx_retrycnt;\n};\n\n//to get BCNOK,BCNERR count\nstruct getbcnokcnt_parm{\n\tunsigned int rsvd;\n};\nstruct getbcnokcnt_rsp{\n\tunsigned long  bcnokcnt;\n};\n\nstruct getbcnerrcnt_parm{\n\tunsigned int rsvd;\n};\nstruct getbcnerrcnt_rsp{\n\tunsigned long bcnerrcnt;\n};\n\n// to get current TX power level\nstruct getcurtxpwrlevel_parm{\n\tunsigned int rsvd;\n};\nstruct getcurtxpwrlevel_rsp{\n\tunsigned short tx_power;\n};\n\nstruct setprobereqextraie_parm {\n\tunsigned char e_id;\n\tunsigned char ie_len;\n\tunsigned char ie[0];\n};\n\nstruct setassocreqextraie_parm {\n\tunsigned char e_id;\n\tunsigned char ie_len;\n\tunsigned char ie[0];\n};\n\nstruct setproberspextraie_parm {\n\tunsigned char e_id;\n\tunsigned char ie_len;\n\tunsigned char ie[0];\n};\n\nstruct setassocrspextraie_parm {\n\tunsigned char e_id;\n\tunsigned char ie_len;\n\tunsigned char ie[0];\n};\n\n\nstruct addBaReq_parm\n{\n \tunsigned int tid;\n\tu8\taddr[ETH_ALEN];\n};\n\n/*H2C Handler index: 46 */\nstruct set_ch_parm {\n\tu8 ch;\n\tu8 bw;\n\tu8 ch_offset;\n};\n\n#ifdef MP_FIRMWARE_OFFLOAD\n/*H2C Handler index: 47 */\nstruct SetTxPower_parm\n{\n\tu8 TxPower;\n};\n\n/*H2C Handler index: 48 */\nstruct SwitchAntenna_parm\n{\n\tu16 antenna_tx;\n\tu16 antenna_rx;\n//\tR_ANTENNA_SELECT_CCK cck_txrx;\n\tu8 cck_txrx;\n};\n\n/*H2C Handler index: 49 */\nstruct SetCrystalCap_parm\n{\n\tu32 curr_crystalcap;\n};\n\n/*H2C Handler index: 50 */\nstruct SetSingleCarrierTx_parm\n{\n\tu8 bStart;\n};\n\n/*H2C Handler index: 51 */\nstruct SetSingleToneTx_parm\n{\n\tu8 bStart;\n\tu8 curr_rfpath;\n};\n\n/*H2C Handler index: 52 */\nstruct SetCarrierSuppressionTx_parm\n{\n\tu8 bStart;\n\tu32 curr_rateidx;\n};\n\n/*H2C Handler index: 53 */\nstruct SetContinuousTx_parm\n{\n\tu8 bStart;\n\tu8 CCK_flag; /*1:CCK 2:OFDM*/\n\tu32 curr_rateidx;\n};\n\n/*H2C Handler index: 54 */\nstruct SwitchBandwidth_parm\n{\n\tu8 curr_bandwidth;\n};\n\n#endif\t/* MP_FIRMWARE_OFFLOAD */\n\n/*H2C Handler index: 59 */ \nstruct SetChannelPlan_param\n{\n\tu8 channel_plan;\n};\n\n/*H2C Handler index: 60 */ \nstruct LedBlink_param\n{\n\tPVOID\t pLed;\n};\n\n/*H2C Handler index: 61 */ \nstruct SetChannelSwitch_param\n{\n\tu8 new_ch_no;\n};\n\n/*H2C Handler index: 62 */ \nstruct TDLSoption_param\n{\n\tu8 addr[ETH_ALEN];\n\tu8 option;\n};\n\n/*H2C Handler index: 64 */\nstruct RunInThread_param\n{\n\tvoid (*func)(void*);\n\tvoid *context;\n};\n\n\n#define GEN_CMD_CODE(cmd)\tcmd ## _CMD_\n\n\n/*\n\nResult: \n0x00: success\n0x01: sucess, and check Response.\n0x02: cmd ignored due to duplicated sequcne number\n0x03: cmd dropped due to invalid cmd code\n0x04: reserved.\n\n*/\n\n#define H2C_RSP_OFFSET\t\t\t512\n\n#define H2C_SUCCESS\t\t\t0x00\n#define H2C_SUCCESS_RSP\t\t\t0x01\n#define H2C_DUPLICATED\t\t\t0x02\n#define H2C_DROPPED\t\t\t0x03\n#define H2C_PARAMETERS_ERROR\t\t0x04\n#define H2C_REJECTED\t\t\t0x05\n#define H2C_CMD_OVERFLOW\t\t0x06\n#define H2C_RESERVED\t\t\t0x07\n\nextern u8 rtw_setassocsta_cmd(_adapter  *padapter, u8 *mac_addr);\nextern u8 rtw_setstandby_cmd(_adapter *padapter, uint action);\nu8 rtw_sitesurvey_cmd(_adapter  *padapter, NDIS_802_11_SSID *ssid, int ssid_num, struct rtw_ieee80211_channel *ch, int ch_num);\n\nu8 rtw_create_ibss_cmd(_adapter *adapter, int flags);\nu8 rtw_startbss_cmd(_adapter *adapter, int flags);\nu8 rtw_change_bss_chbw_cmd(_adapter *adapter, int flags, u8 req_ch, u8 req_bw, u8 req_offset);\n\nextern u8 rtw_setphy_cmd(_adapter  *padapter, u8 modem, u8 ch);\n\nstruct sta_info;\nextern u8 rtw_setstakey_cmd(_adapter  *padapter, struct sta_info *sta, u8 key_type, bool enqueue);\nextern u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue);\n\nextern u8 rtw_joinbss_cmd(_adapter  *padapter, struct wlan_network* pnetwork);\nu8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue);\nextern u8 rtw_setopmode_cmd(_adapter  *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue);\nextern u8 rtw_setdatarate_cmd(_adapter  *padapter, u8 *rateset);\nextern u8 rtw_setbasicrate_cmd(_adapter  *padapter, u8 *rateset);\nextern u8 rtw_getmacreg_cmd(_adapter *padapter, u8 len, u32 addr);\nextern void rtw_usb_catc_trigger_cmd(_adapter *padapter, const char *caller);\nextern u8 rtw_setbbreg_cmd(_adapter * padapter, u8 offset, u8 val);\nextern u8 rtw_setrfreg_cmd(_adapter * padapter, u8 offset, u32 val);\nextern u8 rtw_getbbreg_cmd(_adapter * padapter, u8 offset, u8 * pval);\nextern u8 rtw_getrfreg_cmd(_adapter * padapter, u8 offset, u8 * pval);\nextern u8 rtw_setrfintfs_cmd(_adapter  *padapter, u8 mode);\nextern u8 rtw_setrttbl_cmd(_adapter  *padapter, struct setratable_parm *prate_table);\nextern u8 rtw_getrttbl_cmd(_adapter  *padapter, struct getratable_rsp *pval);\n\nextern u8 rtw_gettssi_cmd(_adapter  *padapter, u8 offset,u8 *pval);\nextern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type);\nextern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type);\n\nextern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr);\n// add for CONFIG_IEEE80211W, none 11w also can use\nextern u8 rtw_reset_securitypriv_cmd(_adapter*padapter);\nextern u8 rtw_free_assoc_resources_cmd(_adapter *padapter);\nextern u8 rtw_dynamic_chk_wk_cmd(_adapter *adapter);\n\nu8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue);\nu8 rtw_dm_in_lps_wk_cmd(_adapter*padapter);\nu8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim);\n\n#if (RATE_ADAPTIVE_SUPPORT==1)\nu8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime);\n#endif\n\n#ifdef CONFIG_ANTENNA_DIVERSITY\nextern  u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue);\n#endif\n\nu8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta);\n\nextern u8 rtw_ps_cmd(_adapter*padapter);\n\n#ifdef CONFIG_AP_MODE\nu8 rtw_chk_hi_queue_cmd(_adapter*padapter);\n#ifdef CONFIG_DFS_MASTER\nu8 rtw_dfs_master_cmd(_adapter *adapter, bool enqueue);\nvoid rtw_dfs_master_timer_hdl(RTW_TIMER_HDL_ARGS);\nvoid rtw_dfs_master_enable(_adapter *adapter, u8 ch, u8 bw, u8 offset);\nvoid rtw_dfs_master_disable(_adapter *adapter, bool ld_sta_in_dfs);\nenum {\n\tMLME_STA_CONNECTING,\n\tMLME_STA_CONNECTED,\n\tMLME_STA_DISCONNECTED,\n\tMLME_AP_STARTED,\n\tMLME_AP_STOPPED,\n};\nvoid rtw_dfs_master_status_apply(_adapter *adapter, u8 self_action);\n#endif /* CONFIG_DFS_MASTER */\n#endif /* CONFIG_AP_MODE */\n\n#ifdef CONFIG_BT_COEXIST\nu8 rtw_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);\n#endif\n\nu8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue);\nu8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig);\nextern u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed);\nextern u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no);\nextern u8 rtw_tdls_cmd(_adapter*padapter, u8 *addr, u8 option);\n\n//#ifdef CONFIG_C2H_PACKET_EN\nextern u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length);\n//#else\nextern u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt);\n//#endif\n\nu8 rtw_run_in_thread_cmd(PADAPTER padapter, void (*func)(void*), void* context);\n\nu8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf);\n\nextern void rtw_survey_cmd_callback(_adapter  *padapter, struct cmd_obj *pcmd);\nextern void rtw_disassoc_cmd_callback(_adapter  *padapter, struct cmd_obj *pcmd);\nextern void rtw_joinbss_cmd_callback(_adapter  *padapter, struct cmd_obj *pcmd);\nvoid rtw_create_ibss_post_hdl(_adapter *padapter, int status);\nextern void rtw_getbbrfreg_cmdrsp_callback(_adapter  *padapter, struct cmd_obj *pcmd);\nextern void rtw_readtssi_cmdrsp_callback(_adapter*\tpadapter,  struct cmd_obj *pcmd);\n\nextern void rtw_setstaKey_cmdrsp_callback(_adapter  *padapter,  struct cmd_obj *pcmd);\nextern void rtw_setassocsta_cmdrsp_callback(_adapter  *padapter,  struct cmd_obj *pcmd);\nextern void rtw_getrttbl_cmdrsp_callback(_adapter  *padapter,  struct cmd_obj *pcmd);\nextern void rtw_getmacreg_cmdrsp_callback(_adapter *padapter,  struct cmd_obj *pcmd);\n\n\nstruct _cmd_callback {\n\tu32\tcmd_code;\n\tvoid (*callback)(_adapter  *padapter, struct cmd_obj *cmd);\n};\n\nenum rtw_h2c_cmd\n{\n\tGEN_CMD_CODE(_Read_MACREG) ,\t/*0*/\n \tGEN_CMD_CODE(_Write_MACREG) ,    \n \tGEN_CMD_CODE(_Read_BBREG) ,  \n \tGEN_CMD_CODE(_Write_BBREG) ,  \n \tGEN_CMD_CODE(_Read_RFREG) ,  \n \tGEN_CMD_CODE(_Write_RFREG) , /*5*/\n \tGEN_CMD_CODE(_Read_EEPROM) ,  \n \tGEN_CMD_CODE(_Write_EEPROM) ,  \n \tGEN_CMD_CODE(_Read_EFUSE) ,  \n \tGEN_CMD_CODE(_Write_EFUSE) , \n \t\n \tGEN_CMD_CODE(_Read_CAM) ,\t/*10*/\n \tGEN_CMD_CODE(_Write_CAM) ,   \n \tGEN_CMD_CODE(_setBCNITV),\n \tGEN_CMD_CODE(_setMBIDCFG),\n \tGEN_CMD_CODE(_JoinBss),   /*14*/\n \tGEN_CMD_CODE(_DisConnect) , /*15*/\n \tGEN_CMD_CODE(_CreateBss) ,\n\tGEN_CMD_CODE(_SetOpMode) , \n\tGEN_CMD_CODE(_SiteSurvey),  /*18*/\n \tGEN_CMD_CODE(_SetAuth) ,\n \t\n \tGEN_CMD_CODE(_SetKey) ,\t/*20*/\n \tGEN_CMD_CODE(_SetStaKey) ,\n \tGEN_CMD_CODE(_SetAssocSta) ,\n \tGEN_CMD_CODE(_DelAssocSta) ,\n \tGEN_CMD_CODE(_SetStaPwrState) , \n \tGEN_CMD_CODE(_SetBasicRate) , /*25*/\n \tGEN_CMD_CODE(_GetBasicRate) ,\n \tGEN_CMD_CODE(_SetDataRate) ,\n \tGEN_CMD_CODE(_GetDataRate) ,\n\tGEN_CMD_CODE(_SetPhyInfo) ,\n\t\n \tGEN_CMD_CODE(_GetPhyInfo) ,\t/*30*/\n\tGEN_CMD_CODE(_SetPhy) ,\n \tGEN_CMD_CODE(_GetPhy) ,\n \tGEN_CMD_CODE(_readRssi) ,\n \tGEN_CMD_CODE(_readGain) ,\n \tGEN_CMD_CODE(_SetAtim) , /*35*/\n \tGEN_CMD_CODE(_SetPwrMode) , \n \tGEN_CMD_CODE(_JoinbssRpt),\n \tGEN_CMD_CODE(_SetRaTable) ,\n \tGEN_CMD_CODE(_GetRaTable) ,  \t\n \t\n \tGEN_CMD_CODE(_GetCCXReport), /*40*/\n \tGEN_CMD_CODE(_GetDTMReport),\n \tGEN_CMD_CODE(_GetTXRateStatistics),\n \tGEN_CMD_CODE(_SetUsbSuspend),\n \tGEN_CMD_CODE(_SetH2cLbk),\n \tGEN_CMD_CODE(_AddBAReq) , /*45*/\n\tGEN_CMD_CODE(_SetChannel), /*46*/\n\tGEN_CMD_CODE(_SetTxPower), \n\tGEN_CMD_CODE(_SwitchAntenna),\n\tGEN_CMD_CODE(_SetCrystalCap),\n\tGEN_CMD_CODE(_SetSingleCarrierTx), /*50*/\n\t\n\tGEN_CMD_CODE(_SetSingleToneTx),/*51*/\n\tGEN_CMD_CODE(_SetCarrierSuppressionTx),\n\tGEN_CMD_CODE(_SetContinuousTx),\n\tGEN_CMD_CODE(_SwitchBandwidth), /*54*/\n\tGEN_CMD_CODE(_TX_Beacon), /*55*/\n\t\n\tGEN_CMD_CODE(_Set_MLME_EVT), /*56*/\n\tGEN_CMD_CODE(_Set_Drv_Extra), /*57*/\n\tGEN_CMD_CODE(_Set_H2C_MSG), /*58*/\n\t\n\tGEN_CMD_CODE(_SetChannelPlan), /*59*/\n\tGEN_CMD_CODE(_LedBlink), /*60*/\n\n\tGEN_CMD_CODE(_SetChannelSwitch), /*61*/\n\tGEN_CMD_CODE(_TDLS), /*62*/\n\tGEN_CMD_CODE(_ChkBMCSleepq), /*63*/\n\n\tGEN_CMD_CODE(_RunInThreadCMD), /*64*/\n\n\tMAX_H2CCMD\n};\n\n#define _GetMACReg_CMD_ _Read_MACREG_CMD_\n#define _SetMACReg_CMD_ _Write_MACREG_CMD_\n#define _GetBBReg_CMD_\t\t_Read_BBREG_CMD_\n#define _SetBBReg_CMD_ \t\t_Write_BBREG_CMD_\n#define _GetRFReg_CMD_ \t\t_Read_RFREG_CMD_\n#define _SetRFReg_CMD_ \t\t_Write_RFREG_CMD_\n\n#ifdef _RTW_CMD_C_\nstruct _cmd_callback \trtw_cmd_callback[] = \n{\n\t{GEN_CMD_CODE(_Read_MACREG), &rtw_getmacreg_cmdrsp_callback}, /*0*/\n\t{GEN_CMD_CODE(_Write_MACREG), NULL}, \n\t{GEN_CMD_CODE(_Read_BBREG), &rtw_getbbrfreg_cmdrsp_callback},\n\t{GEN_CMD_CODE(_Write_BBREG), NULL},\n\t{GEN_CMD_CODE(_Read_RFREG), &rtw_getbbrfreg_cmdrsp_callback},\n\t{GEN_CMD_CODE(_Write_RFREG), NULL}, /*5*/\n\t{GEN_CMD_CODE(_Read_EEPROM), NULL},\n\t{GEN_CMD_CODE(_Write_EEPROM), NULL},\n\t{GEN_CMD_CODE(_Read_EFUSE), NULL},\n\t{GEN_CMD_CODE(_Write_EFUSE), NULL},\n\t\n\t{GEN_CMD_CODE(_Read_CAM),\tNULL},\t/*10*/\n\t{GEN_CMD_CODE(_Write_CAM),\t NULL},\t\n\t{GEN_CMD_CODE(_setBCNITV), NULL},\n \t{GEN_CMD_CODE(_setMBIDCFG), NULL},\n\t{GEN_CMD_CODE(_JoinBss), &rtw_joinbss_cmd_callback},  /*14*/\n\t{GEN_CMD_CODE(_DisConnect), &rtw_disassoc_cmd_callback}, /*15*/\n\t{GEN_CMD_CODE(_CreateBss), NULL},\n\t{GEN_CMD_CODE(_SetOpMode), NULL},\n\t{GEN_CMD_CODE(_SiteSurvey), &rtw_survey_cmd_callback}, /*18*/\n\t{GEN_CMD_CODE(_SetAuth), NULL},\n\t\n\t{GEN_CMD_CODE(_SetKey), NULL},\t/*20*/\n\t{GEN_CMD_CODE(_SetStaKey), &rtw_setstaKey_cmdrsp_callback},\n\t{GEN_CMD_CODE(_SetAssocSta), &rtw_setassocsta_cmdrsp_callback},\n\t{GEN_CMD_CODE(_DelAssocSta), NULL},\t\n\t{GEN_CMD_CODE(_SetStaPwrState), NULL},\t\n\t{GEN_CMD_CODE(_SetBasicRate), NULL}, /*25*/\n\t{GEN_CMD_CODE(_GetBasicRate), NULL},\n\t{GEN_CMD_CODE(_SetDataRate), NULL},\n\t{GEN_CMD_CODE(_GetDataRate), NULL},\n\t{GEN_CMD_CODE(_SetPhyInfo), NULL},\n\t\n\t{GEN_CMD_CODE(_GetPhyInfo), NULL}, /*30*/\n\t{GEN_CMD_CODE(_SetPhy), NULL},\n\t{GEN_CMD_CODE(_GetPhy), NULL},\t\n\t{GEN_CMD_CODE(_readRssi), NULL},\n\t{GEN_CMD_CODE(_readGain), NULL},\n\t{GEN_CMD_CODE(_SetAtim), NULL}, /*35*/\n\t{GEN_CMD_CODE(_SetPwrMode), NULL},\n\t{GEN_CMD_CODE(_JoinbssRpt), NULL},\n\t{GEN_CMD_CODE(_SetRaTable), NULL},\n\t{GEN_CMD_CODE(_GetRaTable) , NULL},\n \t\n\t{GEN_CMD_CODE(_GetCCXReport), NULL}, /*40*/\n \t{GEN_CMD_CODE(_GetDTMReport),\tNULL},\n \t{GEN_CMD_CODE(_GetTXRateStatistics), NULL}, \n \t{GEN_CMD_CODE(_SetUsbSuspend), NULL}, \n \t{GEN_CMD_CODE(_SetH2cLbk), NULL},\n \t{GEN_CMD_CODE(_AddBAReq), NULL}, /*45*/\n\t{GEN_CMD_CODE(_SetChannel), NULL},\t\t/*46*/\n\t{GEN_CMD_CODE(_SetTxPower), NULL},\n\t{GEN_CMD_CODE(_SwitchAntenna), NULL},\n\t{GEN_CMD_CODE(_SetCrystalCap), NULL},\n\t{GEN_CMD_CODE(_SetSingleCarrierTx), NULL},\t/*50*/\n\t\n\t{GEN_CMD_CODE(_SetSingleToneTx), NULL}, /*51*/\n\t{GEN_CMD_CODE(_SetCarrierSuppressionTx), NULL},\n\t{GEN_CMD_CODE(_SetContinuousTx), NULL},\n\t{GEN_CMD_CODE(_SwitchBandwidth), NULL},\t\t/*54*/\n\t{GEN_CMD_CODE(_TX_Beacon), NULL},/*55*/\n\n\t{GEN_CMD_CODE(_Set_MLME_EVT), NULL},/*56*/\n\t{GEN_CMD_CODE(_Set_Drv_Extra), NULL},/*57*/\n\t{GEN_CMD_CODE(_Set_H2C_MSG), NULL},/*58*/\n\t{GEN_CMD_CODE(_SetChannelPlan), NULL},/*59*/\n\t{GEN_CMD_CODE(_LedBlink), NULL},/*60*/\n\t\n\t{GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/\n\t{GEN_CMD_CODE(_TDLS), NULL},/*62*/\n\t{GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/\n\n\t{GEN_CMD_CODE(_RunInThreadCMD), NULL},/*64*/\n};\n#endif\n\n#endif // _CMD_H_\n\n"
  },
  {
    "path": "include/rtw_debug.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_DEBUG_H__\n#define __RTW_DEBUG_H__\n\n\n#define _drv_always_\t\t1\n#define _drv_emerg_\t\t\t2\n#define _drv_alert_\t\t\t3\n#define _drv_crit_\t\t\t4\n#define _drv_err_\t\t\t5\n#define\t_drv_warning_\t\t6\n#define _drv_notice_\t\t7\n#define _drv_info_\t\t\t8\n#define _drv_dump_\t\t\t9\n#define\t_drv_debug_\t\t\t10\n\n\n#define _module_rtl871x_xmit_c_\t\tBIT(0)\n#define _module_xmit_osdep_c_\t\tBIT(1)\n#define _module_rtl871x_recv_c_\t\tBIT(2)\n#define _module_recv_osdep_c_\t\tBIT(3)\n#define _module_rtl871x_mlme_c_\t\tBIT(4)\n#define _module_mlme_osdep_c_\t\tBIT(5)\n#define _module_rtl871x_sta_mgt_c_\t\tBIT(6)\n#define _module_rtl871x_cmd_c_\t\t\tBIT(7)\n#define _module_cmd_osdep_c_\t\tBIT(8)\n#define _module_rtl871x_io_c_\t\t\t\tBIT(9)\n#define _module_io_osdep_c_\t\tBIT(10)\n#define _module_os_intfs_c_\t\t\tBIT(11)\n#define _module_rtl871x_security_c_\t\tBIT(12)\n#define _module_rtl871x_eeprom_c_\t\t\tBIT(13)\n#define _module_hal_init_c_\t\tBIT(14)\n#define _module_hci_hal_init_c_\t\tBIT(15)\n#define _module_rtl871x_ioctl_c_\t\tBIT(16)\n#define _module_rtl871x_ioctl_set_c_\t\tBIT(17)\n#define _module_rtl871x_ioctl_query_c_\tBIT(18)\n#define _module_rtl871x_pwrctrl_c_\t\t\tBIT(19)\n#define _module_hci_intfs_c_\t\t\tBIT(20)\n#define _module_hci_ops_c_\t\t\tBIT(21)\n#define _module_osdep_service_c_\t\t\tBIT(22)\n#define _module_mp_\t\t\tBIT(23)\n#define _module_hci_ops_os_c_\t\t\tBIT(24)\n#define _module_rtl871x_ioctl_os_c\t\tBIT(25)\n#define _module_rtl8712_cmd_c_\t\tBIT(26)\n//#define _module_efuse_\t\t\tBIT(27)\n#define\t_module_rtl8192c_xmit_c_ BIT(28)\n#define _module_hal_xmit_c_\tBIT(28)\n#define _module_efuse_\t\t\tBIT(29)\n#define _module_rtl8712_recv_c_\t\tBIT(30)\n#define _module_rtl8712_led_c_\t\tBIT(31)\n\n#undef _MODULE_DEFINE_\n\n#if defined _RTW_XMIT_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_xmit_c_\n#elif defined _XMIT_OSDEP_C_\n\t#define _MODULE_DEFINE_\t_module_xmit_osdep_c_\n#elif defined _RTW_RECV_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_recv_c_\n#elif defined _RECV_OSDEP_C_\n\t#define _MODULE_DEFINE_\t_module_recv_osdep_c_\n#elif defined _RTW_MLME_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_mlme_c_\n#elif defined _MLME_OSDEP_C_\n\t#define _MODULE_DEFINE_\t_module_mlme_osdep_c_\n#elif defined _RTW_MLME_EXT_C_\n\t#define _MODULE_DEFINE_ 1\n#elif defined _RTW_STA_MGT_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_sta_mgt_c_\n#elif defined _RTW_CMD_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_cmd_c_\n#elif defined _CMD_OSDEP_C_\n\t#define _MODULE_DEFINE_\t_module_cmd_osdep_c_\n#elif defined _RTW_IO_C_\n\t#define _MODULE_DEFINE_\t_module_rtl871x_io_c_\n#elif defined _IO_OSDEP_C_\n\t#define _MODULE_DEFINE_\t_module_io_osdep_c_\n#elif defined _OS_INTFS_C_\n\t#define\t_MODULE_DEFINE_\t_module_os_intfs_c_\n#elif defined _RTW_SECURITY_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_security_c_\n#elif defined _RTW_EEPROM_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_eeprom_c_\n#elif defined _HAL_INTF_C_\n\t#define\t_MODULE_DEFINE_\t_module_hal_init_c_\n#elif (defined _HCI_HAL_INIT_C_) || (defined _SDIO_HALINIT_C_)\n\t#define\t_MODULE_DEFINE_\t_module_hci_hal_init_c_\n#elif defined _RTL871X_IOCTL_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_ioctl_c_\n#elif defined _RTL871X_IOCTL_SET_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_ioctl_set_c_\n#elif defined _RTL871X_IOCTL_QUERY_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_ioctl_query_c_\n#elif defined _RTL871X_PWRCTRL_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_pwrctrl_c_\n#elif defined _RTW_PWRCTRL_C_\n\t#define\t_MODULE_DEFINE_\t1\n#elif defined _HCI_INTF_C_\n\t#define\t_MODULE_DEFINE_\t_module_hci_intfs_c_\n#elif defined _HCI_OPS_C_\n\t#define\t_MODULE_DEFINE_\t_module_hci_ops_c_\n#elif defined _SDIO_OPS_C_\n\t#define\t_MODULE_DEFINE_ 1\n#elif defined _OSDEP_HCI_INTF_C_\n\t#define\t_MODULE_DEFINE_\t_module_hci_intfs_c_\n#elif defined _OSDEP_SERVICE_C_\n\t#define\t_MODULE_DEFINE_\t_module_osdep_service_c_\n#elif defined _HCI_OPS_OS_C_\n\t#define\t_MODULE_DEFINE_\t_module_hci_ops_os_c_\n#elif defined _RTL871X_IOCTL_LINUX_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl871x_ioctl_os_c\n#elif defined _RTL8712_CMD_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl8712_cmd_c_\n#elif defined _RTL8192C_XMIT_C_\n\t#define\t_MODULE_DEFINE_\t1\n#elif defined _RTL8723AS_XMIT_C_\n\t#define\t_MODULE_DEFINE_\t1\n#elif defined _RTL8712_RECV_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl8712_recv_c_\n#elif defined _RTL8192CU_RECV_C_\n\t#define\t_MODULE_DEFINE_\t_module_rtl8712_recv_c_\n#elif defined _RTL871X_MLME_EXT_C_\n\t#define _MODULE_DEFINE_\t_module_mlme_osdep_c_\n#elif defined _RTW_MP_C_\n\t#define\t_MODULE_DEFINE_\t_module_mp_\n#elif defined _RTW_MP_IOCTL_C_\n\t#define\t_MODULE_DEFINE_\t_module_mp_\n#elif defined _RTW_EFUSE_C_\n\t#define\t_MODULE_DEFINE_\t_module_efuse_\n#endif\n\n#ifdef PLATFORM_OS_CE\nextern void rtl871x_cedbg(const char *fmt, ...);\n#endif\n\n#define RT_TRACE(_Comp, _Level, Fmt) do{}while(0)\n#define _func_enter_ do{}while(0)\n#define _func_exit_ do{}while(0)\n#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen) do{}while(0)\n\n#ifdef PLATFORM_WINDOWS\n\t#define DBG_871X do {} while(0)\n\t#define MSG_8192C do {} while(0)\n\t#define DBG_8192C do {} while(0)\n\t#define DBG_871X_LEVEL do {} while(0)\n#else\n\t#define DBG_871X(x, ...) do {} while(0)\n\t#define MSG_8192C(x, ...) do {} while(0)\n\t#define DBG_8192C(x,...) do {} while(0)\n\t#define DBG_871X_LEVEL(x,...) do {} while(0)\n#endif\n\n#undef _dbgdump\n#undef _seqdump\n\n#ifndef _RTL871X_DEBUG_C_\n\textern u32 GlobalDebugLevel;\n\textern u64 GlobalDebugComponents;\n#endif\n\n#if defined(PLATFORM_WINDOWS) && defined(PLATFORM_OS_XP)\n\t#define _dbgdump DbgPrint\n\t#define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg)\n#elif defined(PLATFORM_WINDOWS) && defined(PLATFORM_OS_CE)\n\t#define _dbgdump rtl871x_cedbg\n\t#define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg)\n#elif defined PLATFORM_LINUX\n\t#define _dbgdump printk\n\t#define _seqdump seq_printf\n#elif defined PLATFORM_FREEBSD\n\t#define _dbgdump printf\n\t#define _seqdump(sel, fmt, arg...) _dbgdump(fmt, ##arg)\n#endif\n\n#define DRIVER_PREFIX \"RTL871X: \"\n\n#if defined(_dbgdump)\n\n#define DBG_871X_EXP(level, EXP) do { if (level <= GlobalDebugLevel) EXP; } while (0)\n\n/* with driver-defined prefix */\n#undef DBG_871X_LEVEL\n#define DBG_871X_LEVEL(level, fmt, arg...)     \\\n\tdo {\\\n\t\tif (level <= GlobalDebugLevel) {\\\n\t\t\tif (level <= _drv_err_ && level > _drv_always_) \\\n\t\t\t\t_dbgdump(DRIVER_PREFIX\"ERROR \" fmt, ##arg);\\\n\t\t\telse \\\n\t\t\t\t_dbgdump(DRIVER_PREFIX fmt, ##arg);\\\n\t\t}\\\n\t}while(0)\n\n/* without driver-defined prefix */\n#undef _DBG_871X_LEVEL\n#define _DBG_871X_LEVEL(level, fmt, arg...)\t   \\\n\tdo {\\\n\t\tif (level <= GlobalDebugLevel) {\\\n\t\t\tif (level <= _drv_err_ && level > _drv_always_) \\\n\t\t\t\t_dbgdump(\"ERROR \" fmt, ##arg);\\\n\t\t\telse \\\n\t\t\t\t_dbgdump(fmt, ##arg);\\\n\t\t}\\\n\t}while(0)\n\n#if defined(_seqdump)\n#define RTW_DBGDUMP 0 /* 'stream' for _dbgdump */\n\n/* dump message to selected 'stream' */\n#define DBG_871X_SEL(sel, fmt, arg...) \\\n\tdo {\\\n\t\tif (sel == RTW_DBGDUMP)\\\n\t\t\t_DBG_871X_LEVEL(_drv_always_, fmt, ##arg); \\\n\t\telse {\\\n\t\t\t_seqdump(sel, fmt, ##arg); \\\n\t\t} \\\n\t}while(0)\n\n/* dump message to selected 'stream' with driver-defined prefix */\n#define DBG_871X_SEL_NL(sel, fmt, arg...) \\\n\tdo {\\\n\t\tif (sel == RTW_DBGDUMP)\\\n\t\t\tDBG_871X_LEVEL(_drv_always_, fmt, ##arg); \\\n\t\telse {\\\n\t\t\t_seqdump(sel, fmt, ##arg) /*rtw_warn_on(1)*/; \\\n\t\t} \\\n\t}while(0)\n\n#endif /* defined(_seqdump) */\n\n#endif /* defined(_dbgdump) */\n\n#ifdef CONFIG_DEBUG\n#if\tdefined(_dbgdump)\n\t#undef DBG_871X\n\t#define DBG_871X(...)     do {\\\n\t\t_dbgdump(DRIVER_PREFIX __VA_ARGS__);\\\n\t}while(0)\n\n\t#undef MSG_8192C\n\t#define MSG_8192C(...)     do {\\\n\t\t_dbgdump(DRIVER_PREFIX __VA_ARGS__);\\\n\t}while(0)\n\n\t#undef DBG_8192C\n\t#define DBG_8192C(...)     do {\\\n\t\t_dbgdump(DRIVER_PREFIX __VA_ARGS__);\\\n\t}while(0)\n#endif /* defined(_dbgdump) */\n#endif /* CONFIG_DEBUG */\n\n#ifdef CONFIG_DEBUG_RTL871X\n\n#if\tdefined(_dbgdump) && defined(_MODULE_DEFINE_)\n\n\t#undef RT_TRACE\n\t#define RT_TRACE(_Comp, _Level, Fmt)\\\n\tdo {\\\n\t\tif((_Comp & GlobalDebugComponents) && (_Level <= GlobalDebugLevel)) {\\\n\t\t\t_dbgdump(\"%s [0x%08x,%d]\", DRIVER_PREFIX, (unsigned int)_Comp, _Level);\\\n\t\t\t_dbgdump Fmt;\\\n\t\t}\\\n\t}while(0)\n\n#endif /* defined(_dbgdump) && defined(_MODULE_DEFINE_) */\n\n\n#if\tdefined(_dbgdump)\n\t#undef  _func_enter_\n\t#define _func_enter_ \\\n\tdo {\t\\\n\t\tif (GlobalDebugLevel >= _drv_debug_) \\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_dbgdump(\"\\n %s : %s enters at %d\\n\", DRIVER_PREFIX, __FUNCTION__, __LINE__);\\\n\t\t}\t\t\\\n\t} while(0)\n\n\t#undef  _func_exit_\n\t#define _func_exit_ \\\n\tdo {\t\\\n\t\tif (GlobalDebugLevel >= _drv_debug_) \\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t_dbgdump(\"\\n %s : %s exits at %d\\n\", DRIVER_PREFIX, __FUNCTION__, __LINE__); \\\n\t\t}\t\\\n\t} while(0)\n\n\t#undef RT_PRINT_DATA\n\t#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)\t\t\t\\\n\t\tif(((_Comp) & GlobalDebugComponents) && (_Level <= GlobalDebugLevel))\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\\\n\t\t\tint __i;\t\t\t\t\t\t\t\t\\\n\t\t\tu8\t*ptr = (u8 *)_HexData;\t\t\t\t\\\n\t\t\t_dbgdump(\"%s\", DRIVER_PREFIX);\t\t\t\t\t\t\\\n\t\t\t_dbgdump(_TitleString);\t\t\t\t\t\t\\\n\t\t\tfor( __i=0; __i<(int)_HexDataLen; __i++ )\t\t\t\t\\\n\t\t\t{\t\t\t\t\t\t\t\t\\\n\t\t\t\t_dbgdump(\"%02X%s\", ptr[__i], (((__i + 1) % 4) == 0)?\"  \":\" \");\t\\\n\t\t\t\tif (((__i + 1) % 16) == 0)\t_dbgdump(\"\\n\");\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\t\t\\\n\t\t\t_dbgdump(\"\\n\");\t\t\t\t\t\t\t\\\n\t\t}\n#endif /* defined(_dbgdump) */\n#endif /* CONFIG_DEBUG_RTL871X */\n\n#ifdef CONFIG_DBG_COUNTER\n#define DBG_COUNTER(counter) counter++\n#else\n#define DBG_COUNTER(counter) \n#endif\n\nvoid dump_drv_version(void *sel);\nvoid dump_log_level(void *sel);\nvoid dump_drv_cfg(void *sel);\n\n#ifdef CONFIG_SDIO_HCI\nvoid sd_f0_reg_dump(void *sel, _adapter *adapter);\nvoid sdio_local_reg_dump(void *sel, _adapter *adapter);\n#endif /* CONFIG_SDIO_HCI */\n\nvoid mac_reg_dump(void *sel, _adapter *adapter);\nvoid bb_reg_dump(void *sel, _adapter *adapter);\nvoid rf_reg_dump(void *sel, _adapter *adapter);\n\nbool rtw_fwdl_test_trigger_chksum_fail(void);\nbool rtw_fwdl_test_trigger_wintint_rdy_fail(void);\nbool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void);\n\nu32 rtw_get_wait_hiq_empty_ms(void);\nvoid rtw_sink_rtp_seq_dbg( _adapter *adapter,_pkt *pkt);\n\nstruct sta_info;\nvoid sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta);\n\nstruct dvobj_priv;\nvoid dump_adapters_status(void *sel, struct dvobj_priv *dvobj);\n\nstruct sec_cam_ent;\nvoid dump_sec_cam_ent(void *sel, struct sec_cam_ent *ent, int id);\nvoid dump_sec_cam_ent_title(void *sel, u8 has_id);\nvoid dump_sec_cam(void *sel, _adapter *adapter);\n\n#ifdef CONFIG_PROC_DEBUG\nssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_read_reg(struct seq_file *m, void *v);\nssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_fwstate(struct seq_file *m, void *v);\nint proc_get_sec_info(struct seq_file *m, void *v);\nint proc_get_mlmext_state(struct seq_file *m, void *v);\n#ifdef CONFIG_LAYER2_ROAMING\nint proc_get_roam_flags(struct seq_file *m, void *v);\nssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_roam_param(struct seq_file *m, void *v);\nssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* CONFIG_LAYER2_ROAMING */\nint proc_get_qos_option(struct seq_file *m, void *v);\nint proc_get_ht_option(struct seq_file *m, void *v);\nint proc_get_rf_info(struct seq_file *m, void *v);\nint proc_get_scan_param(struct seq_file *m, void *v);\nssize_t proc_set_scan_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_scan_abort(struct seq_file *m, void *v);\n#ifdef CONFIG_SCAN_BACKOP\nint proc_get_backop_flags_sta(struct seq_file *m, void *v);\nssize_t proc_set_backop_flags_sta(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_backop_flags_ap(struct seq_file *m, void *v);\nssize_t proc_set_backop_flags_ap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* CONFIG_SCAN_BACKOP */\nint proc_get_survey_info(struct seq_file *m, void *v);\nssize_t proc_set_survey_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_ap_info(struct seq_file *m, void *v);\nssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_trx_info(struct seq_file *m, void *v);\nint proc_get_rate_ctl(struct seq_file *m, void *v);\nint proc_get_wifi_spec(struct seq_file *m, void *v);\nssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#ifdef DBG_RX_COUNTER_DUMP\nint proc_get_rx_cnt_dump(struct seq_file *m, void *v);\nssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\t\n#endif\nint proc_get_dis_pwt(struct seq_file *m, void *v);\nssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\t\n\nint proc_get_suspend_resume_info(struct seq_file *m, void *v);\n\nssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nssize_t proc_set_del_rx_ampdu_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#ifdef CONFIG_DFS_MASTER\nint proc_get_dfs_master_test_case(struct seq_file *m, void *v);\nssize_t proc_set_dfs_master_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* CONFIG_DFS_MASTER */\nssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n#ifdef CONFIG_AP_MODE\nint proc_get_all_sta_info(struct seq_file *m, void *v);\n#endif /* CONFIG_AP_MODE */\n\n#ifdef DBG_MEMORY_LEAK\nint proc_get_malloc_cnt(struct seq_file *m, void *v);\n#endif /* DBG_MEMORY_LEAK */\n\n#ifdef CONFIG_FIND_BEST_CHANNEL\nint proc_get_best_channel(struct seq_file *m, void *v);\nssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* CONFIG_FIND_BEST_CHANNEL */\n\nint proc_get_rx_signal(struct seq_file *m, void *v);\nssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_hw_status(struct seq_file *m, void *v);\n\n#ifdef CONFIG_80211N_HT\nint proc_get_ht_enable(struct seq_file *m, void *v);\nssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_bw_mode(struct seq_file *m, void *v);\nssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_ampdu_enable(struct seq_file *m, void *v);\nssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_mac_rptbuf(struct seq_file *m, void *v);\n\nint proc_get_rx_ampdu(struct seq_file *m, void *v);\nssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_rx_stbc(struct seq_file *m, void *v);\nssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n\nint proc_get_rx_ampdu_factor(struct seq_file *m, void *v);\nssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_rx_ampdu_density(struct seq_file *m, void *v);\nssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_tx_ampdu_density(struct seq_file *m, void *v);\nssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* CONFIG_80211N_HT */\n\nint proc_get_en_fwps(struct seq_file *m, void *v);\nssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n//int proc_get_two_path_rssi(struct seq_file *m, void *v);\n//int proc_get_rssi_disp(struct seq_file *m, void *v);\n//ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n#ifdef CONFIG_BT_COEXIST\nint proc_get_btcoex_dbg(struct seq_file *m, void *v);\nssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_btcoex_info(struct seq_file *m, void *v);\n#endif /* CONFIG_BT_COEXIST */\n\n#if defined(DBG_CONFIG_ERROR_DETECT)\nint proc_get_sreset(struct seq_file *m, void *v);\nssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n#endif /* DBG_CONFIG_ERROR_DETECT */\n\nint proc_get_odm_dbg_comp(struct seq_file *m, void *v);\nssize_t proc_set_odm_dbg_comp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_odm_dbg_level(struct seq_file *m, void *v);\nssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\nint proc_get_odm_adaptivity(struct seq_file *m, void *v);\nssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n#ifdef CONFIG_DBG_COUNTER\nint proc_get_rx_logs(struct seq_file *m, void *v);\nint proc_get_tx_logs(struct seq_file *m, void *v);\nint proc_get_int_logs(struct seq_file *m, void *v);\n#endif\n\n#ifdef CONFIG_PCI_HCI\nint proc_get_rx_ring(struct seq_file *m, void *v);\nint proc_get_tx_ring(struct seq_file *m, void *v);\n#endif\n\n#ifdef CONFIG_GPIO_WAKEUP\nint proc_get_wowlan_gpio_info(struct seq_file *m, void *v);\nssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer,\n\t\tsize_t count, loff_t *pos, void *data);\n#endif /*CONFIG_GPIO_WAKEUP*/\n\n#ifdef CONFIG_P2P_WOWLAN\nint proc_get_p2p_wowlan_info(struct seq_file *m, void *v);\n#endif /* CONFIG_P2P_WOWLAN */\n\nint proc_get_new_bcn_max(struct seq_file *m, void *v);\nssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n#ifdef CONFIG_POWER_SAVING\nint proc_get_ps_info(struct seq_file *m, void *v);\n#endif //CONFIG_POWER_SAVING\n\n#ifdef CONFIG_TDLS\nint proc_get_tdls_info(struct seq_file *m, void *v);\n#endif\n\nint proc_get_monitor(struct seq_file *m, void *v);\nssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\nint proc_get_rtkm_info(struct seq_file *m, void *v);\n#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */\n\n#ifdef CONFIG_IEEE80211W\nssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_tx_sa_query(struct seq_file *m, void *v);\nssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_tx_deauth(struct seq_file *m, void *v);\nssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\nint proc_get_tx_auth(struct seq_file *m, void *v);\n#endif /* CONFIG_IEEE80211W */\n\n#endif /* CONFIG_PROC_DEBUG */\n\nint proc_get_efuse_map(struct seq_file *m, void *v);\nssize_t proc_set_efuse_map(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n\n#endif\t//__RTW_DEBUG_H__\n\n"
  },
  {
    "path": "include/rtw_eeprom.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_EEPROM_H__\n#define __RTW_EEPROM_H__\n\n\n#define\tRTL8712_EEPROM_ID\t\t\t0x8712\n//#define\tEEPROM_MAX_SIZE\t\t\t256\n\n#define\tHWSET_MAX_SIZE_128\t\t128\n#define\tHWSET_MAX_SIZE_256\t\t256\n#define\tHWSET_MAX_SIZE_512\t\t512\n#define HWSET_MAX_SIZE_1024\t\t1024\n\n#define\tEEPROM_MAX_SIZE\t\t\tHWSET_MAX_SIZE_1024\n\n#define\tCLOCK_RATE\t\t\t\t\t50\t\t\t//100us\t\t\n\n//- EEPROM opcodes\n#define EEPROM_READ_OPCODE\t\t06\n#define EEPROM_WRITE_OPCODE\t\t05\n#define EEPROM_ERASE_OPCODE\t\t07\n#define EEPROM_EWEN_OPCODE\t\t19      // Erase/write enable\n#define EEPROM_EWDS_OPCODE\t\t16      // Erase/write disable\n\n//Country codes\n#define USA\t\t\t\t\t\t\t0x555320\n#define EUROPE\t\t\t\t\t\t0x1 //temp, should be provided later\t\n#define JAPAN\t\t\t\t\t\t0x2 //temp, should be provided later\n\n//\n// Customer ID, note that: \n// This variable is initiailzed through EEPROM or registry, \n// however, its definition may be different with that in EEPROM for \n// EEPROM size consideration. So, we have to perform proper translation between them.\n// Besides, CustomerID of registry has precedence of that of EEPROM.\n// defined below. 060703, by rcnjko.\n//\ntypedef enum _RT_CUSTOMER_ID\n{\n\tRT_CID_DEFAULT = 0,\n\tRT_CID_8187_ALPHA0 = 1,\n\tRT_CID_8187_SERCOMM_PS = 2,\n\tRT_CID_8187_HW_LED = 3,\n\tRT_CID_8187_NETGEAR = 4,\n\tRT_CID_WHQL = 5,\n\tRT_CID_819x_CAMEO  = 6,\n\tRT_CID_819x_RUNTOP = 7,\n\tRT_CID_819x_Senao = 8,\n\tRT_CID_TOSHIBA = 9,\t// Merge by Jacken, 2008/01/31.\n\tRT_CID_819x_Netcore = 10,\n\tRT_CID_Nettronix = 11,\n\tRT_CID_DLINK = 12,\n\tRT_CID_PRONET = 13,\n\tRT_CID_COREGA = 14,\n\tRT_CID_CHINA_MOBILE = 15,\n\tRT_CID_819x_ALPHA = 16,\n\tRT_CID_819x_Sitecom = 17,\n\tRT_CID_CCX = 18, // It's set under CCX logo test and isn't demanded for CCX functions, but for test behavior like retry limit and tx report. By Bruce, 2009-02-17.\n\tRT_CID_819x_Lenovo = 19,\n\tRT_CID_819x_QMI = 20,\n\tRT_CID_819x_Edimax_Belkin = 21,\n\tRT_CID_819x_Sercomm_Belkin = 22,\n\tRT_CID_819x_CAMEO1 = 23,\n\tRT_CID_819x_MSI = 24,\n\tRT_CID_819x_Acer = 25,\n\tRT_CID_819x_AzWave_ASUS = 26,\n\tRT_CID_819x_AzWave = 27, // For AzWave in PCIe, The ID is AzWave use and not only Asus\n\tRT_CID_819x_HP = 28,\n\tRT_CID_819x_WNC_COREGA = 29,\n\tRT_CID_819x_Arcadyan_Belkin = 30,\n\tRT_CID_819x_SAMSUNG = 31,\n\tRT_CID_819x_CLEVO = 32,\n\tRT_CID_819x_DELL = 33,\n\tRT_CID_819x_PRONETS = 34,\n\tRT_CID_819x_Edimax_ASUS = 35,\n\tRT_CID_NETGEAR = 36,\n\tRT_CID_PLANEX = 37,\n\tRT_CID_CC_C = 38,\n\tRT_CID_819x_Xavi = 39,\n\tRT_CID_LENOVO_CHINA = 40,\n\tRT_CID_INTEL_CHINA = 41,\n\tRT_CID_TPLINK_HPWR = 42,\n\tRT_CID_819x_Sercomm_Netgear = 43,\n\tRT_CID_819x_ALPHA_Dlink = 44,//add by ylb 20121012 for customer led for alpha\n\tRT_CID_WNC_NEC = 45,//add by page for NEC\n\tRT_CID_DNI_BUFFALO = 46,//add by page for NEC\n}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID;\n\nextern void eeprom_write16(_adapter *padapter, u16 reg, u16 data);\nextern u16 eeprom_read16(_adapter *padapter, u16 reg);\nextern void read_eeprom_content(_adapter *padapter);\nextern void eeprom_read_sz(_adapter * padapter, u16 reg,u8* data, u32 sz); \n\nextern void read_eeprom_content_by_attrib(_adapter *\tpadapter\t);\n\n#ifdef PLATFORM_LINUX\n#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\nextern int isAdaptorInfoFileValid(void);\nextern int storeAdaptorInfoFile(char *path, u8 *efuse_data);\nextern int retriveAdaptorInfoFile(char *path, u8 *efuse_data);\n#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE\n#endif //PLATFORM_LINUX\n\n#endif  //__RTL871X_EEPROM_H__\n\n"
  },
  {
    "path": "include/rtw_efuse.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_EFUSE_H__\n#define __RTW_EFUSE_H__\n\n\n#define\tEFUSE_ERROE_HANDLE\t\t1\n\n#define\tPG_STATE_HEADER \t\t0x01\n#define\tPG_STATE_WORD_0\t\t0x02\n#define\tPG_STATE_WORD_1\t\t0x04\n#define\tPG_STATE_WORD_2\t\t0x08\n#define\tPG_STATE_WORD_3\t\t0x10\n#define\tPG_STATE_DATA\t\t\t0x20\n\n#define\tPG_SWBYTE_H\t\t\t0x01\n#define\tPG_SWBYTE_L\t\t\t0x02\n\n#define\tPGPKT_DATA_SIZE\t\t8\n\n#define\tEFUSE_WIFI\t\t\t\t0\n#define\tEFUSE_BT\t\t\t\t1\n\nenum _EFUSE_DEF_TYPE {\n\tTYPE_EFUSE_MAX_SECTION\t\t\t\t= 0,\n\tTYPE_EFUSE_REAL_CONTENT_LEN\t\t\t= 1,\n\tTYPE_AVAILABLE_EFUSE_BYTES_BANK\t\t= 2,\n\tTYPE_AVAILABLE_EFUSE_BYTES_TOTAL\t= 3,\n\tTYPE_EFUSE_MAP_LEN\t\t\t\t\t= 4,\n\tTYPE_EFUSE_PROTECT_BYTES_BANK\t\t= 5,\n\tTYPE_EFUSE_CONTENT_LEN_BANK\t\t\t= 6,\n};\n\n#define\t\tEFUSE_MAX_MAP_LEN\t\t512\n\n#define\t\tEFUSE_MAX_HW_SIZE\t\t512\n#define\t\tEFUSE_MAX_SECTION_BASE\t16\n\n#define EXT_HEADER(header) ((header & 0x1F ) == 0x0F)\n#define ALL_WORDS_DISABLED(wde)\t((wde & 0x0F) == 0x0F)\n#define GET_HDR_OFFSET_2_0(header) ( (header & 0xE0) >> 5)\n\n#define\t\tEFUSE_REPEAT_THRESHOLD_\t\t\t3\n\n#define IS_MASKED_MP(ic, txt, offset) (EFUSE_IsAddressMasked_MP_##ic##txt(offset))\n#define IS_MASKED_TC(ic, txt, offset) (EFUSE_IsAddressMasked_TC_##ic##txt(offset))\n#define GET_MASK_ARRAY_LEN_MP(ic, txt) (EFUSE_GetArrayLen_MP_##ic##txt())\n#define GET_MASK_ARRAY_LEN_TC(ic, txt) (EFUSE_GetArrayLen_TC_##ic##txt())\n#define GET_MASK_ARRAY_MP(ic, txt, offset) (EFUSE_GetMaskArray_MP_##ic##txt(offset))\n#define GET_MASK_ARRAY_TC(ic, txt, offset) (EFUSE_GetMaskArray_TC_##ic##txt(offset))\n\n\n#define IS_MASKED(ic, txt, offset) ( IS_MASKED_MP(ic,txt, offset) )\n#define GET_MASK_ARRAY_LEN(ic, txt) ( GET_MASK_ARRAY_LEN_MP(ic,txt) )\n#define GET_MASK_ARRAY(ic, txt, out) do { GET_MASK_ARRAY_MP(ic,txt, out);} while(0)\n\n//=============================================\n//\tThe following is for BT Efuse definition\n//=============================================\n#define\t\tEFUSE_BT_MAX_MAP_LEN\t\t1024\n#define\t\tEFUSE_MAX_BANK\t\t\t4\n#define\t\tEFUSE_MAX_BT_BANK\t\t(EFUSE_MAX_BANK-1)\n//=============================================\n/*--------------------------Define Parameters-------------------------------*/\n#define\t\tEFUSE_MAX_WORD_UNIT\t\t\t4\n\n/*------------------------------Define structure----------------------------*/ \ntypedef struct PG_PKT_STRUCT_A{\n\tu8 offset;\n\tu8 word_en;\n\tu8 data[8];\t\n\tu8 word_cnts;\n}PGPKT_STRUCT,*PPGPKT_STRUCT;\n\ntypedef enum\n{\n\tERR_SUCCESS = 0,\n\tERR_DRIVER_FAILURE,\n\tERR_IO_FAILURE,\n\tERR_WI_TIMEOUT,\n\tERR_WI_BUSY,\n\tERR_BAD_FORMAT,\n\tERR_INVALID_DATA,\n\tERR_NOT_ENOUGH_SPACE,\n\tERR_WRITE_PROTECT,\n\tERR_READ_BACK_FAIL,\n\tERR_OUT_OF_RANGE\n} ERROR_CODE;\n\n/*------------------------------Define structure----------------------------*/ \ntypedef struct _EFUSE_HAL{\n\tu8\tfakeEfuseBank;\n\tu32\tfakeEfuseUsedBytes;\n\tu8\tfakeEfuseContent[EFUSE_MAX_HW_SIZE];\n\tu8\tfakeEfuseInitMap[EFUSE_MAX_MAP_LEN];\n\tu8\tfakeEfuseModifiedMap[EFUSE_MAX_MAP_LEN];\n\tu32\tEfuseUsedBytes;\n\tu8\tEfuseUsedPercentage;\n\t\n\tu16\tBTEfuseUsedBytes;\n\tu8\tBTEfuseUsedPercentage;\n\tu8\tBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\n\tu8\tBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN];\n\tu8\tBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN];\n\n\tu16\tfakeBTEfuseUsedBytes;\n\tu8\tfakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\n\tu8\tfakeBTEfuseInitMap[EFUSE_BT_MAX_MAP_LEN];\n\tu8\tfakeBTEfuseModifiedMap[EFUSE_BT_MAX_MAP_LEN];\n\n\t// EFUSE Configuration, initialized in HAL_CmnInitPGData().\n\tconst u16  MaxSecNum_WiFi;\n\tconst u16  MaxSecNum_BT;\t\n\tconst u16  WordUnit;\t\n\tconst u16  PhysicalLen_WiFi;\n\tconst u16  PhysicalLen_BT;\t\n\tconst u16  LogicalLen_WiFi;\n\tconst u16  LogicalLen_BT;\t\n\tconst u16  BankSize;\n\tconst u16  TotalBankNum;\n\tconst u16  BankNum_WiFi;\n\tconst u16  BankNum_BT;\t\n\tconst u16  OOBProtectBytes;\n\tconst u16  ProtectBytes;\n\tconst u16  BankAvailBytes;\t\n\tconst u16  TotalAvailBytes_WiFi;\n\tconst u16  TotalAvailBytes_BT;\t\n\tconst u16  HeaderRetry;\t\n\tconst u16  DataRetry;\t\n\n\tERROR_CODE \t  Status;\n\t\n}EFUSE_HAL, *PEFUSE_HAL;\n\nextern u8 maskfileBuffer[32];\n\n/*------------------------Export global variable----------------------------*/\nextern u8 fakeEfuseBank;\nextern u32 fakeEfuseUsedBytes;\nextern u8 fakeEfuseContent[];\nextern u8 fakeEfuseInitMap[];\nextern u8 fakeEfuseModifiedMap[];\n\nextern u32 BTEfuseUsedBytes;\nextern u8 BTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\nextern u8 BTEfuseInitMap[];\nextern u8 BTEfuseModifiedMap[];\n\nextern u32 fakeBTEfuseUsedBytes;\nextern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE];\nextern u8 fakeBTEfuseInitMap[];\nextern u8 fakeBTEfuseModifiedMap[];\n/*------------------------Export global variable----------------------------*/\n\nu8\tefuse_GetCurrentSize(PADAPTER padapter, u16 *size);\nu16\tefuse_GetMaxSize(PADAPTER padapter);\nu8\trtw_efuse_access(PADAPTER padapter, u8 bRead, u16 start_addr, u16 cnts, u8 *data);\nu8\trtw_efuse_mask_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);\nu8\trtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);\nu8\trtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);\nu8\trtw_BT_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);\nu8 \trtw_BT_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data);\n\nu16\tEfuse_GetCurrentSize(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);\nu8\tEfuse_CalculateWordCnts(u8 word_en);\nvoid\tReadEFuseByte(PADAPTER Adapter, u16 _offset, u8 *pbuf, BOOLEAN bPseudoTest) ;\nvoid\tEFUSE_GetEfuseDefinition(PADAPTER pAdapter, u8 efuseType, u8 type, void *pOut, BOOLEAN bPseudoTest);\nu8\tefuse_OneByteRead(PADAPTER pAdapter, u16 addr, u8 *data, BOOLEAN\t bPseudoTest);\nu8\tefuse_OneByteWrite(PADAPTER pAdapter, u16 addr, u8 data, BOOLEAN\t bPseudoTest);\n\nvoid\tBTEfuse_PowerSwitch(PADAPTER pAdapter,u8\tbWrite,u8\t PwrState);\nvoid\tEfuse_PowerSwitch(PADAPTER pAdapter,u8\tbWrite,u8\t PwrState);\nint \tEfuse_PgPacketRead(PADAPTER pAdapter, u8 offset, u8 *data, BOOLEAN bPseudoTest);\nint \tEfuse_PgPacketWrite(PADAPTER pAdapter, u8 offset, u8 word_en, u8 *data, BOOLEAN bPseudoTest);\nvoid\tefuse_WordEnableDataRead(u8 word_en, u8 *sourdata, u8 *targetdata);\nu8\tEfuse_WordEnableDataWrite(PADAPTER pAdapter, u16 efuse_addr, u8 word_en, u8 *data, BOOLEAN bPseudoTest);\n\nu8\tEFUSE_Read1Byte(PADAPTER pAdapter, u16 Address);\nvoid\tEFUSE_ShadowMapUpdate(PADAPTER pAdapter, u8 efuseType, BOOLEAN bPseudoTest);\nvoid\tEFUSE_ShadowRead(PADAPTER pAdapter, u8 Type, u16 Offset, u32 *Value);\nu8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf, u32 len);\n\n#ifdef PLATFORM_LINUX\n#ifdef CONFIG_EFUSE_CONFIG_FILE\nu32 rtw_read_efuse_from_file(const char *path, u8 *buf);\nu32 rtw_read_macaddr_from_file(const char *path, u8 *buf);\n#endif /* CONFIG_EFUSE_CONFIG_FILE */\n#endif /* PLATFORM_LINUX */\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_event.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_EVENT_H_\n#define _RTW_EVENT_H_\n\n#ifdef CONFIG_H2CLBK\n#include <h2clbk.h>\n#endif\n\n/*\nUsed to report a bss has been scanned\n\n*/\nstruct survey_event\t{\n\tWLAN_BSSID_EX bss;\n};\n\n/*\nUsed to report that the requested site survey has been done.\n\nbss_cnt indicates the number of bss that has been reported.\n\n\n*/\nstruct surveydone_event {\n\tunsigned int\tbss_cnt;\t\n\t\n};\n\n/*\nUsed to report the link result of joinning the given bss\n\n\njoin_res:\n-1: authentication fail\n-2: association fail\n> 0: TID\n\n*/\nstruct joinbss_event {\n\tstruct\twlan_network\tnetwork;\n};\n\n/*\nUsed to report a given STA has joinned the created BSS.\nIt is used in AP/Ad-HoC(M) mode.\n\n\n*/\nstruct stassoc_event {\n\tunsigned char macaddr[6];\n\tunsigned char rsvd[2];\n\tint    cam_id;\n\t\n};\n\nstruct stadel_event {\n unsigned char macaddr[6];\n unsigned char rsvd[2]; //for reason\n int mac_id;\n};\n\nstruct addba_event\n{\n \tunsigned int tid;\n};\n\nstruct wmm_event\n{\n \tunsigned char wmm;\n};\n\n#ifdef CONFIG_H2CLBK\nstruct c2hlbk_event{\n\tunsigned char mac[6];\n\tunsigned short\ts0;\n\tunsigned short\ts1;\n\tunsigned int\tw0;\n\tunsigned char\tb0;\n\tunsigned short  s2;\n\tunsigned char\tb1;\n\tunsigned int\tw1;\t\n};\n#endif//CONFIG_H2CLBK\n\n#define GEN_EVT_CODE(event)\tevent ## _EVT_\n\n\n\nstruct fwevent {\n\tu32\tparmsize;\n\tvoid (*event_callback)(_adapter *dev, u8 *pbuf);\n};\n\n\n#define C2HEVENT_SZ\t\t\t32\t\n\nstruct event_node{\n\tunsigned char *node;\n\tunsigned char evt_code;\n\tunsigned short evt_sz;\n\tvolatile int\t*caller_ff_tail;\n\tint\tcaller_ff_sz;\n};\n\nstruct c2hevent_queue {\n\tvolatile int\thead;\n\tvolatile int\ttail;\n\tstruct\tevent_node\tnodes[C2HEVENT_SZ];\n\tunsigned char\tseq;\n};\n\n#define NETWORK_QUEUE_SZ\t4\n\nstruct network_queue {\n\tvolatile int\thead;\n\tvolatile int\ttail;\n\tWLAN_BSSID_EX networks[NETWORK_QUEUE_SZ];\t\n};\n\n\n#endif // _WLANEVENT_H_\n\n"
  },
  {
    "path": "include/rtw_ht.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_HT_H_\n#define _RTW_HT_H_\n\n\nstruct ht_priv\n{\n\tu8\tht_option;\n\tu8\tampdu_enable;//for enable Tx A-MPDU\n\tu8\ttx_amsdu_enable;//for enable Tx A-MSDU\n\tu8\tbss_coexist;//for 20/40 Bss coexist\n\n\t//u8\tbaddbareq_issued[16];\n\tu32\ttx_amsdu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx\n\tu32\trx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback.\n\t\n\tu8 \trx_ampdu_min_spacing;\n\t\n\tu8\tch_offset;//PRIME_CHNL_OFFSET\n\tu8\tsgi_20m;\n\tu8\tsgi_40m;\n\n\t//for processing Tx A-MPDU\n\tu8\tagg_enable_bitmap;\n\t//u8\tADDBA_retry_count;\n\tu8\tcandidate_tid_bitmap;\n\n\tu8\tldpc_cap;\n\tu8\tstbc_cap;\n\tu8\tbeamform_cap;\n\tu8\tsmps_cap; /*spatial multiplexing power save mode. 0:static SMPS, 1:dynamic SMPS, 3:SMPS disabled, 2:reserved*/\n\n\tstruct rtw_ieee80211_ht_cap ht_cap;\n\t\n};\n\ntypedef enum AGGRE_SIZE{\n\tHT_AGG_SIZE_8K = 0,\n\tHT_AGG_SIZE_16K = 1,\n\tHT_AGG_SIZE_32K = 2,\n\tHT_AGG_SIZE_64K = 3,\n\tVHT_AGG_SIZE_128K = 4,\n\tVHT_AGG_SIZE_256K = 5,\n\tVHT_AGG_SIZE_512K = 6,\n\tVHT_AGG_SIZE_1024K = 7,\n}AGGRE_SIZE_E, *PAGGRE_SIZE_E;\n\ntypedef enum _RT_HT_INF0_CAP{\n\tRT_HT_CAP_USE_TURBO_AGGR = 0x01,\n\tRT_HT_CAP_USE_LONG_PREAMBLE = 0x02,\n\tRT_HT_CAP_USE_AMPDU = 0x04,\n\tRT_HT_CAP_USE_WOW = 0x8,\t\n\tRT_HT_CAP_USE_SOFTAP = 0x10,\t\n\tRT_HT_CAP_USE_92SE = 0x20,\n\tRT_HT_CAP_USE_88C_92C = 0x40,\n\tRT_HT_CAP_USE_AP_CLIENT_MODE = 0x80,\t// AP team request to reserve this bit, by Emily\n}RT_HT_INF0_CAPBILITY, *PRT_HT_INF0_CAPBILITY;\n\ntypedef enum _RT_HT_INF1_CAP{\n\tRT_HT_CAP_USE_VIDEO_CLIENT = 0x01,\n\tRT_HT_CAP_USE_JAGUAR_BCUT = 0x02,\n\tRT_HT_CAP_USE_JAGUAR_CCUT = 0x04,\n}RT_HT_INF1_CAPBILITY, *PRT_HT_INF1_CAPBILITY;\n\n#define\tLDPC_HT_ENABLE_RX\t\t\tBIT0\n#define\tLDPC_HT_ENABLE_TX\t\t\tBIT1\n#define\tLDPC_HT_TEST_TX_ENABLE\t\tBIT2\n#define\tLDPC_HT_CAP_TX\t\t\t\tBIT3\n\n#define\tSTBC_HT_ENABLE_RX\t\t\tBIT0\n#define\tSTBC_HT_ENABLE_TX\t\t\tBIT1\n#define\tSTBC_HT_TEST_TX_ENABLE\t\tBIT2\n#define\tSTBC_HT_CAP_TX\t\t\t\tBIT3\n\n#define\tBEAMFORMING_HT_BEAMFORMER_ENABLE\tBIT0\t// Declare our NIC supports beamformer\n#define\tBEAMFORMING_HT_BEAMFORMEE_ENABLE\tBIT1\t// Declare our NIC supports beamformee\n#define\tBEAMFORMING_HT_BEAMFORMER_TEST\t\tBIT2\t// Transmiting Beamforming no matter the target supports it or not\n#define\tBEAMFORMING_HT_BEAMFORMER_STEER_NUM\t\t(BIT4|BIT5)\n#define\tBEAMFORMING_HT_BEAMFORMEE_CHNL_EST_CAP\t(BIT6|BIT7)\n\n//------------------------------------------------------------\n// The HT Control field\n//------------------------------------------------------------\n#define SET_HT_CTRL_CSI_STEERING(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart))+2, 6, 2, _val)\n#define SET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart))+3, 0, 1, _val)\n#define GET_HT_CTRL_NDP_ANNOUNCEMENT(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+3, 0, 1)\n\n// 20/40 BSS Coexist\n#define SET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 0, 1, _val)\n#define GET_EXT_CAPABILITY_ELE_BSS_COEXIST(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 0, 1)\n\n/* HT Capabilities Info field */\n#define HT_CAP_ELE_CAP_INFO(_pEleStart)\t\t\t\t\t((u8 *)(_pEleStart))\n#define GET_HT_CAP_ELE_LDPC_CAP(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 0, 1)\n#define GET_HT_CAP_ELE_CHL_WIDTH(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 1, 1)\n#define GET_HT_CAP_ELE_SM_PS(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 2, 2)\n#define GET_HT_CAP_ELE_GREENFIELD(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 4, 1)\n#define GET_HT_CAP_ELE_SHORT_GI20M(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 5, 1)\n#define GET_HT_CAP_ELE_SHORT_GI40M(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 6, 1)\n#define GET_HT_CAP_ELE_TX_STBC(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 7, 1)\n#define GET_HT_CAP_ELE_RX_STBC(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 0, 2)\n#define GET_HT_CAP_ELE_DELAYED_BA(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 2, 1)\n#define GET_HT_CAP_ELE_MAX_AMSDU_LENGTH(_pEleStart)\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 3, 1)\n#define GET_HT_CAP_ELE_DSSS_CCK_40M(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 4, 1)\n#define GET_HT_CAP_ELE_FORTY_INTOLERANT(_pEleStart)\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 6, 1)\n#define GET_HT_CAP_ELE_LSIG_TXOP_PROTECT(_pEleStart)\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+1, 7, 1)\n\n#define SET_HT_CAP_ELE_LDPC_CAP(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 0, 1, _val)\n#define SET_HT_CAP_ELE_CHL_WIDTH(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 1, 1, _val)\n#define SET_HT_CAP_ELE_SM_PS(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 2, 2, _val)\n#define SET_HT_CAP_ELE_GREENFIELD(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 4, 1, _val)\n#define SET_HT_CAP_ELE_SHORT_GI20M(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 5, 1, _val)\n#define SET_HT_CAP_ELE_SHORT_GI40M(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 6, 1, _val)\n#define SET_HT_CAP_ELE_TX_STBC(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 7, 1, _val)\n#define SET_HT_CAP_ELE_RX_STBC(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 0, 2, _val)\n#define SET_HT_CAP_ELE_DELAYED_BA(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 2, 1, _val)\n#define SET_HT_CAP_ELE_MAX_AMSDU_LENGTH(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 3, 1, _val)\n#define SET_HT_CAP_ELE_DSSS_CCK_40M(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 4, 1, _val)\n#define SET_HT_CAP_ELE_FORTY_INTOLERANT(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 6, 1, _val)\n#define SET_HT_CAP_ELE_LSIG_TXOP_PROTECT(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 7, 1, _val)\n\n/* A-MPDU Parameters field */\n#define HT_CAP_ELE_AMPDU_PARA(_pEleStart)\t\t\t\t(((u8 *)(_pEleStart))+2)\n#define GET_HT_CAP_ELE_MAX_AMPDU_LEN_EXP(_pEleStart)\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+2, 0, 2)\n#define GET_HT_CAP_ELE_MIN_MPDU_S_SPACE(_pEleStart)\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+2, 2, 3)\n\n#define HT_AMPDU_PARA_FMT \"%02x \" \\\n\t\"MAX AMPDU len:%u bytes, MIN MPDU Start Spacing:%u\"\n\n#define HT_AMPDU_PARA_ARG(x) \\\n\t*((u8*)(x)) \\\n\t, (1 << (13+GET_HT_CAP_ELE_MAX_AMPDU_LEN_EXP(((u8*)x)-2)))-1 \\\n\t, GET_HT_CAP_ELE_MIN_MPDU_S_SPACE(((u8*)x)-2)\n\n/* Supported MCS Set field */\n#define HT_CAP_ELE_SUP_MCS_SET(_pEleStart)\t\t\t\t(((u8 *)(_pEleStart))+3)\n#define HT_CAP_ELE_RX_MCS_MAP(_pEleStart)\t\t\t\tHT_CAP_ELE_SUP_MCS_SET(_pEleStart)\n#define GET_HT_CAP_ELE_RX_HIGHEST_DATA_RATE(_pEleStart)\tLE_BITS_TO_2BYTE(((u8 *)(_pEleStart))+13, 0, 10)\n#define GET_HT_CAP_ELE_TX_MCS_DEF(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+15, 0, 1)\n#define GET_HT_CAP_ELE_TRX_MCS_NEQ(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+15, 1, 1)\n#define GET_HT_CAP_ELE_TX_MAX_SS(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+15, 2, 2)\n#define GET_HT_CAP_ELE_TX_UEQM(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart))+15, 4, 1)\n\n#define HT_SUP_MCS_SET_FMT \"%02x %02x %02x %02x %02x%02x%02x%02x%02x%02x\" \\\n\t/* \"\\n%02x%02x%02x%02x%02x%02x\" */\\\n\t\" %uMbps %s%s%s\"\n#define HT_SUP_MCS_SET_ARG(x) ((u8 *)(x))[0], ((u8 *)(x))[1], ((u8 *)(x))[2], ((u8 *)(x))[3], ((u8 *)(x))[4], ((u8 *)(x))[5], \\\n\t((u8 *)(x))[6], ((u8 *)(x))[7], ((u8 *)(x))[8], ((u8 *)(x))[9] \\\n\t/*,((u8 *)(x))[10],((u8 *)(x))[11], ((u8 *)(x))[12],((u8 *)(x))[13],((u8 *)(x))[14],((u8 *)(x))[15] */\\\n\t, GET_HT_CAP_ELE_RX_HIGHEST_DATA_RATE(((u8 *)x)-3) \\\n\t, GET_HT_CAP_ELE_TX_MCS_DEF(((u8 *)x)-3) ? \"TX_MCS_DEF \" : \"\" \\\n\t, GET_HT_CAP_ELE_TRX_MCS_NEQ(((u8 *)x)-3) ? \"TRX_MCS_NEQ \" : \"\" \\\n\t, GET_HT_CAP_ELE_TX_UEQM(((u8 *)x)-3) ? \"TX_UEQM \" : \"\"\n\n//TXBF Capabilities\n#define SET_HT_CAP_TXBF_RECEIVE_NDP_CAP(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 3, 1, ((u8)_val))\n#define SET_HT_CAP_TXBF_TRANSMIT_NDP_CAP(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 4, 1, ((u8)_val))\n#define SET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart, _val)\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 10, 1, ((u8)_val))\n#define SET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart, _val)\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 15, 2, ((u8)_val))\n#define SET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(_pEleStart, _val)\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 23, 2, ((u8)_val))\n#define SET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(_pEleStart, _val)\tSET_BITS_TO_LE_4BYTE(((u8 *)(_pEleStart))+21, 27, 2, ((u8)_val))\n\n\n#define GET_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP(_pEleStart)\t\t\tLE_BITS_TO_4BYTE(((u8 *)(_pEleStart))+21, 10, 1)\n#define GET_HT_CAP_TXBF_EXPLICIT_COMP_FEEDBACK_CAP(_pEleStart)\t\t\tLE_BITS_TO_4BYTE(((u8 *)(_pEleStart))+21, 15, 2)\n#define GET_HT_CAP_TXBF_COMP_STEERING_NUM_ANTENNAS(_pEleStart)\t\tLE_BITS_TO_4BYTE(((u8 *)(_pEleStart))+21, 23, 2)\n#define GET_HT_CAP_TXBF_CHNL_ESTIMATION_NUM_ANTENNAS(_pEleStart)\t\tLE_BITS_TO_4BYTE(((u8 *)(_pEleStart))+21, 27, 2)\n\n/* HT Operation element */\n\n#define GET_HT_OP_ELE_PRI_CHL(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)), 0, 8)\n#define SET_HT_OP_ELE_PRI_CHL(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)), 0, 8, _val)\n\n/* HT Operation Info field */\n#define HT_OP_ELE_OP_INFO(_pEleStart)\t\t\t\t\t\t(((u8 *)(_pEleStart)) + 1)\n#define GET_HT_OP_ELE_2ND_CHL_OFFSET(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 1, 0, 2)\n#define GET_HT_OP_ELE_STA_CHL_WIDTH(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 1, 2, 1)\n#define GET_HT_OP_ELE_RIFS_MODE(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 1, 3, 1)\n#define GET_HT_OP_ELE_HT_PROTECT(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 2, 0, 2)\n#define GET_HT_OP_ELE_NON_GREEN_PRESENT(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 2, 2, 1)\n#define GET_HT_OP_ELE_OBSS_NON_HT_PRESENT(_pEleStart)\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 2, 4, 1)\n#define GET_HT_OP_ELE_DUAL_BEACON(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 4, 6, 1)\n#define GET_HT_OP_ELE_DUAL_CTS(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 4, 7, 1)\n#define GET_HT_OP_ELE_STBC_BEACON(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 5, 0, 1)\n#define GET_HT_OP_ELE_LSIG_TXOP_PROTECT(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 5, 1, 1)\n#define GET_HT_OP_ELE_PCO_ACTIVE(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 5, 2, 1)\n#define GET_HT_OP_ELE_PCO_PHASE(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE(((u8 *)(_pEleStart)) + 5, 3, 1)\n\n#define SET_HT_OP_ELE_2ND_CHL_OFFSET(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 0, 2, _val)\n#define SET_HT_OP_ELE_STA_CHL_WIDTH(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 2, 1, _val)\n#define SET_HT_OP_ELE_RIFS_MODE(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 1, 3, 1, _val)\n#define SET_HT_OP_ELE_HT_PROTECT(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 2, 0, 2, _val)\n#define SET_HT_OP_ELE_NON_GREEN_PRESENT(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 2, 2, 1, _val)\n#define SET_HT_OP_ELE_OBSS_NON_HT_PRESENT(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 2, 4, 1, _val)\n#define SET_HT_OP_ELE_DUAL_BEACON(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 4, 6, 1, _val)\n#define SET_HT_OP_ELE_DUAL_CTS(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 4, 7, 1, _val)\n#define SET_HT_OP_ELE_STBC_BEACON(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 5, 0, 1, _val)\n#define SET_HT_OP_ELE_LSIG_TXOP_PROTECT(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 5, 1, 1, _val)\n#define SET_HT_OP_ELE_PCO_ACTIVE(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 5, 2, 1, _val)\n#define SET_HT_OP_ELE_PCO_PHASE(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(((u8 *)(_pEleStart)) + 5, 3, 1, _val)\n\n#endif\t//_RTL871X_HT_H_\n\n"
  },
  {
    "path": "include/rtw_io.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef _RTW_IO_H_\n#define _RTW_IO_H_\n\n#define NUM_IOREQ\t\t8\n\n#ifdef PLATFORM_WINDOWS\n#define MAX_PROT_SZ\t64\n#endif\n#ifdef PLATFORM_LINUX\n#define MAX_PROT_SZ\t(64-16)\n#endif\n\n#define _IOREADY\t\t\t0\n#define _IO_WAIT_COMPLETE   1\n#define _IO_WAIT_RSP        2\n\n// IO COMMAND TYPE\n#define _IOSZ_MASK_\t\t(0x7F)\n#define _IO_WRITE_\t\tBIT(7)\n#define _IO_FIXED_\t\tBIT(8)\n#define _IO_BURST_\t\tBIT(9)\n#define _IO_BYTE_\t\tBIT(10)\n#define _IO_HW_\t\t\tBIT(11)\n#define _IO_WORD_\t\tBIT(12)\n#define _IO_SYNC_\t\tBIT(13)\n#define _IO_CMDMASK_\t(0x1F80)\n\n\n/* \n\tFor prompt mode accessing, caller shall free io_req\n\tOtherwise, io_handler will free io_req\n*/\n\n\n\n// IO STATUS TYPE\n#define _IO_ERR_\t\tBIT(2)\n#define _IO_SUCCESS_\tBIT(1)\n#define _IO_DONE_\t\tBIT(0)\n\n\n#define IO_RD32\t\t\t(_IO_SYNC_ | _IO_WORD_)\n#define IO_RD16\t\t\t(_IO_SYNC_ | _IO_HW_)\n#define IO_RD8\t\t\t(_IO_SYNC_ | _IO_BYTE_)\n\n#define IO_RD32_ASYNC\t(_IO_WORD_)\n#define IO_RD16_ASYNC\t(_IO_HW_)\n#define IO_RD8_ASYNC\t(_IO_BYTE_)\n\n#define IO_WR32\t\t\t(_IO_WRITE_ | _IO_SYNC_ | _IO_WORD_)\n#define IO_WR16\t\t\t(_IO_WRITE_ | _IO_SYNC_ | _IO_HW_)\n#define IO_WR8\t\t\t(_IO_WRITE_ | _IO_SYNC_ | _IO_BYTE_)\n\n#define IO_WR32_ASYNC\t(_IO_WRITE_ | _IO_WORD_)\n#define IO_WR16_ASYNC\t(_IO_WRITE_ | _IO_HW_)\n#define IO_WR8_ASYNC\t(_IO_WRITE_ | _IO_BYTE_)\n\n/*\n\n\tOnly Sync. burst accessing is provided.\n\n*/\n\n#define IO_WR_BURST(x)\t\t(_IO_WRITE_ | _IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))\n#define IO_RD_BURST(x)\t\t(_IO_SYNC_ | _IO_BURST_ | ( (x) & _IOSZ_MASK_))\n\n\n\n//below is for the intf_option bit defition...\n\n#define _INTF_ASYNC_\tBIT(0)\t//support async io\n\nstruct intf_priv;\nstruct intf_hdl;\nstruct io_queue;\n\nstruct _io_ops\n{\n\t\tu8 (*_read8)(struct intf_hdl *pintfhdl, u32 addr);\n\t\tu16 (*_read16)(struct intf_hdl *pintfhdl, u32 addr);\n\t\tu32 (*_read32)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t\tint (*_write8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\t\tint (*_write16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\t\tint (*_write32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\t\tint (*_writeN)(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);\n\n\t\tint (*_write8_async)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\t\tint (*_write16_async)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\t\tint (*_write32_async)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\n\t\tvoid (*_read_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t\tvoid (*_write_mem)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\n\t\tvoid (*_sync_irp_protocol_rw)(struct io_queue *pio_q);\n\n\t\tu32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);\n\n\t\tu32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\t\tu32 (*_write_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);\n\n\t\tu32 (*_write_scsi)(struct intf_hdl *pintfhdl,u32 cnt, u8 *pmem);\n\n\t\tvoid (*_read_port_cancel)(struct intf_hdl *pintfhdl);\n\t\tvoid (*_write_port_cancel)(struct intf_hdl *pintfhdl);\n\n#ifdef CONFIG_SDIO_HCI\n\t\tu8 (*_sd_f0_read8)(struct intf_hdl *pintfhdl, u32 addr);\n\t\t#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\t\tu8 (*_sd_iread8)(struct intf_hdl *pintfhdl, u32 addr);\n\t\tu16 (*_sd_iread16)(struct intf_hdl *pintfhdl, u32 addr);\n\t\tu32 (*_sd_iread32)(struct intf_hdl *pintfhdl, u32 addr);\n\t\tint (*_sd_iwrite8)(struct intf_hdl *pintfhdl, u32 addr, u8 val);\n\t\tint (*_sd_iwrite16)(struct intf_hdl *pintfhdl, u32 addr, u16 val);\n\t\tint (*_sd_iwrite32)(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n\t\t#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n#endif\n\t\t\n};\n\nstruct io_req {\t\n\t_list\tlist;\n\tu32\taddr;\t\n\tvolatile u32\tval;\n\tu32\tcommand;\n\tu32\tstatus;\n\tu8\t*pbuf;\t\n\t_sema\tsema;\n\n#ifdef PLATFORM_OS_CE\n#ifdef CONFIG_USB_HCI\n\t// URB handler for rtw_write_mem\n\tUSB_TRANSFER usb_transfer_write_mem;\n#endif\n#endif\n\t\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt);\n\tu8 *cnxt;\t\n\n#ifdef PLATFORM_OS_XP\t\n\tPMDL pmdl;\n\tPIRP  pirp; \n\n#ifdef CONFIG_SDIO_HCI\n\tPSDBUS_REQUEST_PACKET sdrp;\n#endif\t\n\n#endif\t\n\n\n};\n\nstruct\tintf_hdl {\n\n/*\t\n\tu32\tintf_option;\n\tu32\tbus_status;\n\tu32\tdo_flush;\n\tu8\t*adapter;\n\tu8\t*intf_dev;\t\n\tstruct intf_priv\t*pintfpriv;\n\tu8\tcnt;\n\tvoid (*intf_hdl_init)(u8 *priv);\n\tvoid (*intf_hdl_unload)(u8 *priv);\n\tvoid (*intf_hdl_open)(u8 *priv);\n\tvoid (*intf_hdl_close)(u8 *priv);\n\tstruct\t_io_ops\tio_ops;\n\t//u8 intf_status;//moved to struct intf_priv\n\tu16 len;\n\tu16 done_len;\t\n*/\n\t_adapter *padapter;\n\tstruct dvobj_priv *pintf_dev;//\tpointer to &(padapter->dvobjpriv);\n\n\tstruct _io_ops\tio_ops;\n\n};\n\nstruct reg_protocol_rd {\n\n#ifdef CONFIG_LITTLE_ENDIAN\t\n\n\t//DW1\n\tu32\t\tNumOfTrans:4;\n\tu32\t\tReserved1:4;\n\tu32\t\tReserved2:24;\n\t//DW2\n\tu32\t\tByteCount:7;\n\tu32\t\tWriteEnable:1;\t\t//0:read, 1:write\n\tu32\t\tFixOrContinuous:1;\t//0:continuous, 1: Fix\n\tu32\t\tBurstMode:1;\n\tu32\t\tByte1Access:1;\n\tu32\t\tByte2Access:1;\n\tu32\t\tByte4Access:1;\n\tu32\t\tReserved3:3;\n\tu32\t\tReserved4:16;\n\t//DW3\n\tu32\t\tBusAddress;\n\t//DW4\n\t//u32\t\tValue;\n#else\n\n\n//DW1\n\tu32 Reserved1  :4;\n\tu32 NumOfTrans :4;\t\n\n\tu32 Reserved2  :24;\t\n\n\t//DW2\n\tu32 WriteEnable : 1;\n\tu32 ByteCount :7;\t\n\n\n\tu32 Reserved3 : 3;\n\tu32 Byte4Access : 1;\t\n\n\tu32 Byte2Access : 1;\n\tu32 Byte1Access : 1;\t\n\tu32 BurstMode :1 ;\t\n\tu32 FixOrContinuous : 1;\t\n\n\tu32 Reserved4 : 16;\n\n\t//DW3\n\tu32\t\tBusAddress;\n\n\t//DW4\n\t//u32\t\tValue;\n\n#endif\n\t\n};\n\n\nstruct reg_protocol_wt {\n\t\n\n#ifdef CONFIG_LITTLE_ENDIAN\n\n\t//DW1\n\tu32\t\tNumOfTrans:4;\n\tu32\t\tReserved1:4;\n\tu32\t\tReserved2:24;\n\t//DW2\n\tu32\t\tByteCount:7;\n\tu32\t\tWriteEnable:1;\t\t//0:read, 1:write\n\tu32\t\tFixOrContinuous:1;\t//0:continuous, 1: Fix\n\tu32\t\tBurstMode:1;\n\tu32\t\tByte1Access:1;\n\tu32\t\tByte2Access:1;\n\tu32\t\tByte4Access:1;\n\tu32\t\tReserved3:3;\n\tu32\t\tReserved4:16;\n\t//DW3\n\tu32\t\tBusAddress;\n\t//DW4\n\tu32\t\tValue;\n\n#else\n\t//DW1\n\tu32 Reserved1  :4;\n\tu32 NumOfTrans :4;\t\n\n\tu32 Reserved2  :24;\t\n\n\t//DW2\n\tu32 WriteEnable : 1;\n\tu32 ByteCount :7;\t\n\t\t\n\tu32 Reserved3 : 3;\n\tu32 Byte4Access : 1;\t\n\n\tu32 Byte2Access : 1;\n\tu32 Byte1Access : 1;\t\n\tu32 BurstMode :1 ;\t\n\tu32 FixOrContinuous : 1;\t\n\n\tu32 Reserved4 : 16;\n\n\t//DW3\n\tu32\t\tBusAddress;\n\n\t//DW4\n\tu32\t\tValue;\n\n#endif\n\n};\n#ifdef CONFIG_PCI_HCI\n#define MAX_CONTINUAL_IO_ERR 4\n#endif\n\n#ifdef CONFIG_USB_HCI\n#define MAX_CONTINUAL_IO_ERR 4\n#endif\n\n#ifdef CONFIG_SDIO_HCI\n#define SD_IO_TRY_CNT (8)\n#define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT\n#endif\n\n#ifdef CONFIG_GSPI_HCI\n#define SD_IO_TRY_CNT (8)\n#define MAX_CONTINUAL_IO_ERR SD_IO_TRY_CNT\n#endif\n\n\nint rtw_inc_and_chk_continual_io_error(struct dvobj_priv *dvobj);\nvoid rtw_reset_continual_io_error(struct dvobj_priv *dvobj);\n\n/*\nBelow is the data structure used by _io_handler\n\n*/\n\nstruct io_queue {\t\n\t_lock\tlock;\t\n\t_list  \tfree_ioreqs;\t\n\t_list\t\tpending;\t\t//The io_req list that will be served in the single protocol read/write.\t\n\t_list\t\tprocessing;\n\tu8\t*free_ioreqs_buf; // 4-byte aligned\n\tu8\t*pallocated_free_ioreqs_buf;\n\tstruct\tintf_hdl\tintf;\n};\n\nstruct io_priv{\n\t\n\t_adapter *padapter;\t\n\t\t\n\tstruct intf_hdl intf;\n\n};\n\nextern uint ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);\nextern void sync_ioreq_enqueue(struct io_req *preq,struct io_queue *ioqueue);\nextern uint sync_ioreq_flush(_adapter *adapter, struct io_queue *ioqueue);\n\n\nextern uint free_ioreq(struct io_req *preq, struct io_queue *pio_queue);\nextern struct io_req *alloc_ioreq(struct io_queue *pio_q);\n\nextern uint register_intf_hdl(u8 *dev, struct intf_hdl *pintfhdl);\nextern void unregister_intf_hdl(struct intf_hdl *pintfhdl);\n\nextern void _rtw_attrib_read(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern void _rtw_attrib_write(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\n\nextern u8 _rtw_read8(_adapter *adapter, u32 addr);\nextern u16 _rtw_read16(_adapter *adapter, u32 addr);\nextern u32 _rtw_read32(_adapter *adapter, u32 addr);\nextern void _rtw_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern void _rtw_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern void _rtw_read_port_cancel(_adapter *adapter);\n\n\nextern int _rtw_write8(_adapter *adapter, u32 addr, u8 val);\nextern int _rtw_write16(_adapter *adapter, u32 addr, u16 val);\nextern int _rtw_write32(_adapter *adapter, u32 addr, u32 val);\nextern int _rtw_writeN(_adapter *adapter, u32 addr, u32 length, u8 *pdata);\n\n#ifdef CONFIG_SDIO_HCI\nu8 _rtw_sd_f0_read8(_adapter *adapter, u32 addr);\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\nu8 _rtw_sd_iread8(_adapter *adapter, u32 addr);\nu16 _rtw_sd_iread16(_adapter *adapter, u32 addr);\nu32 _rtw_sd_iread32(_adapter *adapter, u32 addr);\nint _rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val);\nint _rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val);\nint _rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val);\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n#endif /* CONFIG_SDIO_HCI */\n\nextern int _rtw_write8_async(_adapter *adapter, u32 addr, u8 val);\nextern int _rtw_write16_async(_adapter *adapter, u32 addr, u16 val);\nextern int _rtw_write32_async(_adapter *adapter, u32 addr, u32 val);\n\nextern void _rtw_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern u32 _rtw_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nu32 _rtw_write_port_and_wait(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem, int timeout_ms);\nextern void _rtw_write_port_cancel(_adapter *adapter);\n\n#ifdef DBG_IO\nbool match_read_sniff_ranges(u32 addr, u16 len);\nbool match_write_sniff_ranges(u32 addr, u16 len);\nbool match_rf_read_sniff_ranges(u8 path, u32 addr, u32 mask);\nbool match_rf_write_sniff_ranges(u8 path, u32 addr, u32 mask);\n\nextern u8 dbg_rtw_read8(_adapter *adapter, u32 addr, const char *caller, const int line);\nextern u16 dbg_rtw_read16(_adapter *adapter, u32 addr, const char *caller, const int line);\nextern u32 dbg_rtw_read32(_adapter *adapter, u32 addr, const char *caller, const int line);\n\nextern int dbg_rtw_write8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line);\nextern int dbg_rtw_write16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line);\nextern int dbg_rtw_write32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line);\nextern int dbg_rtw_writeN(_adapter *adapter, u32 addr ,u32 length , u8 *data, const char *caller, const int line);\n\n#ifdef CONFIG_SDIO_HCI\nu8 dbg_rtw_sd_f0_read8(_adapter *adapter, u32 addr, const char *caller, const int line);\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\nu8 dbg_rtw_sd_iread8(_adapter *adapter, u32 addr, const char *caller, const int line);\nu16 dbg_rtw_sd_iread16(_adapter *adapter, u32 addr, const char *caller, const int line);\nu32 dbg_rtw_sd_iread32(_adapter *adapter, u32 addr, const char *caller, const int line);\nint dbg_rtw_sd_iwrite8(_adapter *adapter, u32 addr, u8 val, const char *caller, const int line);\nint dbg_rtw_sd_iwrite16(_adapter *adapter, u32 addr, u16 val, const char *caller, const int line);\nint dbg_rtw_sd_iwrite32(_adapter *adapter, u32 addr, u32 val, const char *caller, const int line);\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n#endif /* CONFIG_SDIO_HCI */\n\n#define rtw_read8(adapter, addr) dbg_rtw_read8((adapter), (addr), __FUNCTION__, __LINE__)\n#define rtw_read16(adapter, addr) dbg_rtw_read16((adapter), (addr), __FUNCTION__, __LINE__)\n#define rtw_read32(adapter, addr) dbg_rtw_read32((adapter), (addr), __FUNCTION__, __LINE__)\n#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))\n#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))\n#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))\n\n#define  rtw_write8(adapter, addr, val) dbg_rtw_write8((adapter), (addr), (val), __FUNCTION__, __LINE__)\n#define  rtw_write16(adapter, addr, val) dbg_rtw_write16((adapter), (addr), (val), __FUNCTION__, __LINE__)\n#define  rtw_write32(adapter, addr, val) dbg_rtw_write32((adapter), (addr), (val), __FUNCTION__, __LINE__)\n#define  rtw_writeN(adapter, addr, length, data) dbg_rtw_writeN((adapter), (addr), (length), (data), __FUNCTION__, __LINE__)\n\n#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))\n#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))\n#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))\n\n#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), addr, cnt, mem)\n#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port(adapter, addr, cnt, mem)\n#define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))\n#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel(adapter)\n\n#ifdef CONFIG_SDIO_HCI\n#define rtw_sd_f0_read8(adapter, addr) dbg_rtw_sd_f0_read8((adapter), (addr), __func__, __LINE__)\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n#define rtw_sd_iread8(adapter, addr) dbg_rtw_sd_iread8((adapter), (addr), __func__, __LINE__)\n#define rtw_sd_iread16(adapter, addr) dbg_rtw_sd_iread16((adapter), (addr), __func__, __LINE__) \n#define rtw_sd_iread32(adapter, addr) dbg_rtw_sd_iread32((adapter), (addr), __func__, __LINE__)\n#define rtw_sd_iwrite8(adapter, addr, val) dbg_rtw_sd_iwrite8((adapter), (addr), (val), __func__, __LINE__)\n#define rtw_sd_iwrite16(adapter, addr, val) dbg_rtw_sd_iwrite16((adapter), (addr), (val), __func__, __LINE__)\n#define rtw_sd_iwrite32(adapter, addr, val) dbg_rtw_sd_iwrite32((adapter), (addr), (val), __func__, __LINE__)\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n#endif /* CONFIG_SDIO_HCI */\n\n#else /* DBG_IO */\n#define match_read_sniff_ranges(addr, len) _FALSE\n#define match_write_sniff_ranges(addr, len) _FALSE\n#define match_rf_read_sniff_ranges(path, addr, mask) _FALSE\n#define match_rf_write_sniff_ranges(path, addr, mask) _FALSE\n#define rtw_read8(adapter, addr) _rtw_read8((adapter), (addr))\n#define rtw_read16(adapter, addr) _rtw_read16((adapter), (addr))\n#define rtw_read32(adapter, addr) _rtw_read32((adapter), (addr))\n#define rtw_read_mem(adapter, addr, cnt, mem) _rtw_read_mem((adapter), (addr), (cnt), (mem))\n#define rtw_read_port(adapter, addr, cnt, mem) _rtw_read_port((adapter), (addr), (cnt), (mem))\n#define rtw_read_port_cancel(adapter) _rtw_read_port_cancel((adapter))\n\n#define  rtw_write8(adapter, addr, val) _rtw_write8((adapter), (addr), (val))\n#define  rtw_write16(adapter, addr, val) _rtw_write16((adapter), (addr), (val))\n#define  rtw_write32(adapter, addr, val) _rtw_write32((adapter), (addr), (val))\n#define  rtw_writeN(adapter, addr, length, data) _rtw_writeN((adapter), (addr), (length), (data))\n\n#define rtw_write8_async(adapter, addr, val) _rtw_write8_async((adapter), (addr), (val))\n#define rtw_write16_async(adapter, addr, val) _rtw_write16_async((adapter), (addr), (val))\n#define rtw_write32_async(adapter, addr, val) _rtw_write32_async((adapter), (addr), (val))\n\n#define rtw_write_mem(adapter, addr, cnt, mem) _rtw_write_mem((adapter), (addr), (cnt), (mem))\n#define rtw_write_port(adapter, addr, cnt, mem) _rtw_write_port((adapter), (addr), (cnt), (mem))\n#define rtw_write_port_and_wait(adapter, addr, cnt, mem, timeout_ms) _rtw_write_port_and_wait((adapter), (addr), (cnt), (mem), (timeout_ms))\n#define rtw_write_port_cancel(adapter) _rtw_write_port_cancel((adapter))\n\n#ifdef CONFIG_SDIO_HCI\n#define rtw_sd_f0_read8(adapter, addr) _rtw_sd_f0_read8((adapter), (addr))\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n#define rtw_sd_iread8(adapter, addr) _rtw_sd_iread8((adapter), (addr))\n#define rtw_sd_iread16(adapter, addr) _rtw_sd_iread16((adapter), (addr)) \n#define rtw_sd_iread32(adapter, addr) _rtw_sd_iread32((adapter), (addr))\n#define rtw_sd_iwrite8(adapter, addr, val) _rtw_sd_iwrite8((adapter), (addr), (val))\n#define rtw_sd_iwrite16(adapter, addr, val) _rtw_sd_iwrite16((adapter), (addr), (val))\n#define rtw_sd_iwrite32(adapter, addr, val) _rtw_sd_iwrite32((adapter), (addr), (val))\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n#endif /* CONFIG_SDIO_HCI */\n\n#endif /* DBG_IO */\n\nextern void rtw_write_scsi(_adapter *adapter, u32 cnt, u8 *pmem);\n\n//ioreq \nextern void ioreq_read8(_adapter *adapter, u32 addr, u8 *pval);\nextern void ioreq_read16(_adapter *adapter, u32 addr, u16 *pval);\t\nextern void ioreq_read32(_adapter *adapter, u32 addr, u32 *pval);\nextern void ioreq_write8(_adapter *adapter, u32 addr, u8 val);\nextern void ioreq_write16(_adapter *adapter, u32 addr, u16 val);\nextern void ioreq_write32(_adapter *adapter, u32 addr, u32 val);\n\n\nextern uint async_read8(_adapter *adapter, u32 addr, u8 *pbuff,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); \nextern uint async_read16(_adapter *adapter, u32 addr,  u8 *pbuff,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); \nextern uint async_read32(_adapter *adapter, u32 addr,  u8 *pbuff,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt); \n\nextern void async_read_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern void async_read_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\n\nextern void async_write8(_adapter *adapter, u32 addr, u8 val,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);\nextern void async_write16(_adapter *adapter, u32 addr, u16 val,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);\nextern void async_write32(_adapter *adapter, u32 addr, u32 val,\n\tvoid (*_async_io_callback)(_adapter *padater, struct io_req *pio_req, u8 *cnxt), u8 *cnxt);\n\nextern void async_write_mem(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\nextern void async_write_port(_adapter *adapter, u32 addr, u32 cnt, u8 *pmem);\n\n\nint rtw_init_io_priv(_adapter *padapter, void (*set_intf_ops)(_adapter *padapter,struct _io_ops *pops));\n\n\nextern uint alloc_io_queue(_adapter *adapter);\nextern void free_io_queue(_adapter *adapter);\nextern void async_bus_io(struct io_queue *pio_q);\nextern void bus_sync_io(struct io_queue *pio_q);\nextern u32 _ioreq2rwmem(struct io_queue *pio_q);\nextern void dev_power_down(_adapter * Adapter, u8 bpwrup);\n\n/*\n#define RTL_R8(reg)\t\trtw_read8(padapter, reg)\n#define RTL_R16(reg)            rtw_read16(padapter, reg)\n#define RTL_R32(reg)            rtw_read32(padapter, reg)\n#define RTL_W8(reg, val8)       rtw_write8(padapter, reg, val8)\n#define RTL_W16(reg, val16)     rtw_write16(padapter, reg, val16)\n#define RTL_W32(reg, val32)     rtw_write32(padapter, reg, val32)\n*/\n\n/*\n#define RTL_W8_ASYNC(reg, val8) rtw_write32_async(padapter, reg, val8)\n#define RTL_W16_ASYNC(reg, val16) rtw_write32_async(padapter, reg, val16)\n#define RTL_W32_ASYNC(reg, val32) rtw_write32_async(padapter, reg, val32)\n\n#define RTL_WRITE_BB(reg, val32)\tphy_SetUsbBBReg(padapter, reg, val32)\n#define RTL_READ_BB(reg)\tphy_QueryUsbBBReg(padapter, reg)\n*/\n\n#define PlatformEFIOWrite1Byte(_a,_b,_c)\t\t\\\n\trtw_write8(_a,_b,_c)\n#define PlatformEFIOWrite2Byte(_a,_b,_c)\t\t\\\n\trtw_write16(_a,_b,_c)\n#define PlatformEFIOWrite4Byte(_a,_b,_c)\t\t\\\n\trtw_write32(_a,_b,_c)\n\n#define PlatformEFIORead1Byte(_a,_b)\t\t\\\n\t\trtw_read8(_a,_b)\n#define PlatformEFIORead2Byte(_a,_b)\t\t\\\n\t\trtw_read16(_a,_b)\n#define PlatformEFIORead4Byte(_a,_b)\t\t\\\n\t\trtw_read32(_a,_b)\n\n#endif\t//_RTL8711_IO_H_\n\n"
  },
  {
    "path": "include/rtw_ioctl.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_IOCTL_H_\n#define _RTW_IOCTL_H_\n\n#ifndef PLATFORM_WINDOWS\n//\t00 - Success\n//\t11 - Error\n#define STATUS_SUCCESS\t\t\t\t(0x00000000L)\n#define STATUS_PENDING\t\t\t\t(0x00000103L)\n\n#define STATUS_UNSUCCESSFUL\t\t\t(0xC0000001L)\n#define STATUS_INSUFFICIENT_RESOURCES\t\t(0xC000009AL)\n#define STATUS_NOT_SUPPORTED\t\t\t(0xC00000BBL)\n\n#define NDIS_STATUS_SUCCESS\t\t\t((NDIS_STATUS)STATUS_SUCCESS)\n#define NDIS_STATUS_PENDING\t\t\t((NDIS_STATUS)STATUS_PENDING)\n#define NDIS_STATUS_NOT_RECOGNIZED\t\t((NDIS_STATUS)0x00010001L)\n#define NDIS_STATUS_NOT_COPIED\t\t\t((NDIS_STATUS)0x00010002L)\n#define NDIS_STATUS_NOT_ACCEPTED\t\t((NDIS_STATUS)0x00010003L)\n#define NDIS_STATUS_CALL_ACTIVE\t\t\t((NDIS_STATUS)0x00010007L)\n\n#define NDIS_STATUS_FAILURE\t\t\t((NDIS_STATUS)STATUS_UNSUCCESSFUL)\n#define NDIS_STATUS_RESOURCES\t\t\t((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)\n#define NDIS_STATUS_CLOSING\t\t\t((NDIS_STATUS)0xC0010002L)\n#define NDIS_STATUS_BAD_VERSION\t\t\t((NDIS_STATUS)0xC0010004L)\n#define NDIS_STATUS_BAD_CHARACTERISTICS\t\t((NDIS_STATUS)0xC0010005L)\n#define NDIS_STATUS_ADAPTER_NOT_FOUND\t\t((NDIS_STATUS)0xC0010006L)\n#define NDIS_STATUS_OPEN_FAILED\t\t\t((NDIS_STATUS)0xC0010007L)\n#define NDIS_STATUS_DEVICE_FAILED\t\t((NDIS_STATUS)0xC0010008L)\n#define NDIS_STATUS_MULTICAST_FULL\t\t((NDIS_STATUS)0xC0010009L)\n#define NDIS_STATUS_MULTICAST_EXISTS\t\t((NDIS_STATUS)0xC001000AL)\n#define NDIS_STATUS_MULTICAST_NOT_FOUND\t\t((NDIS_STATUS)0xC001000BL)\n#define NDIS_STATUS_REQUEST_ABORTED\t\t((NDIS_STATUS)0xC001000CL)\n#define NDIS_STATUS_RESET_IN_PROGRESS\t\t((NDIS_STATUS)0xC001000DL)\n#define NDIS_STATUS_CLOSING_INDICATING\t\t((NDIS_STATUS)0xC001000EL)\n#define NDIS_STATUS_NOT_SUPPORTED\t\t((NDIS_STATUS)STATUS_NOT_SUPPORTED)\n#define NDIS_STATUS_INVALID_PACKET\t\t((NDIS_STATUS)0xC001000FL)\n#define NDIS_STATUS_OPEN_LIST_FULL\t\t((NDIS_STATUS)0xC0010010L)\n#define NDIS_STATUS_ADAPTER_NOT_READY\t\t((NDIS_STATUS)0xC0010011L)\n#define NDIS_STATUS_ADAPTER_NOT_OPEN\t\t((NDIS_STATUS)0xC0010012L)\n#define NDIS_STATUS_NOT_INDICATING\t\t((NDIS_STATUS)0xC0010013L)\n#define NDIS_STATUS_INVALID_LENGTH\t\t((NDIS_STATUS)0xC0010014L)\n#define NDIS_STATUS_INVALID_DATA\t\t((NDIS_STATUS)0xC0010015L)\n#define NDIS_STATUS_BUFFER_TOO_SHORT\t\t((NDIS_STATUS)0xC0010016L)\n#define NDIS_STATUS_INVALID_OID\t\t\t((NDIS_STATUS)0xC0010017L)\n#define NDIS_STATUS_ADAPTER_REMOVED\t\t((NDIS_STATUS)0xC0010018L)\n#define NDIS_STATUS_UNSUPPORTED_MEDIA\t\t((NDIS_STATUS)0xC0010019L)\n#define NDIS_STATUS_GROUP_ADDRESS_IN_USE\t((NDIS_STATUS)0xC001001AL)\n#define NDIS_STATUS_FILE_NOT_FOUND\t\t((NDIS_STATUS)0xC001001BL)\n#define NDIS_STATUS_ERROR_READING_FILE\t\t((NDIS_STATUS)0xC001001CL)\n#define NDIS_STATUS_ALREADY_MAPPED\t\t((NDIS_STATUS)0xC001001DL)\n#define NDIS_STATUS_RESOURCE_CONFLICT\t\t((NDIS_STATUS)0xC001001EL)\n#define NDIS_STATUS_NO_CABLE\t\t\t((NDIS_STATUS)0xC001001FL)\n\n#define NDIS_STATUS_INVALID_SAP\t\t\t((NDIS_STATUS)0xC0010020L)\n#define NDIS_STATUS_SAP_IN_USE\t\t\t((NDIS_STATUS)0xC0010021L)\n#define NDIS_STATUS_INVALID_ADDRESS\t\t((NDIS_STATUS)0xC0010022L)\n#define NDIS_STATUS_VC_NOT_ACTIVATED\t\t((NDIS_STATUS)0xC0010023L)\n#define NDIS_STATUS_DEST_OUT_OF_ORDER\t\t((NDIS_STATUS)0xC0010024L)  // cause 27\n#define NDIS_STATUS_VC_NOT_AVAILABLE\t\t((NDIS_STATUS)0xC0010025L)  // cause 35,45\n#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE\t((NDIS_STATUS)0xC0010026L)  // cause 37\n#define NDIS_STATUS_INCOMPATABLE_QOS\t\t((NDIS_STATUS)0xC0010027L)  // cause 49\n#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED\t((NDIS_STATUS)0xC0010028L)  // cause 93\n#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION\t((NDIS_STATUS)0xC0010029L)  // cause 3\n#endif /* #ifndef PLATFORM_WINDOWS */\n\n\n#ifndef OID_802_11_CAPABILITY\n\t#define OID_802_11_CAPABILITY                   0x0d010122\n#endif\n\n#ifndef OID_802_11_PMKID\n\t#define OID_802_11_PMKID                        0x0d010123\n#endif\n\n\n// For DDK-defined OIDs\n#define OID_NDIS_SEG1\t0x00010100\n#define OID_NDIS_SEG2\t0x00010200\n#define OID_NDIS_SEG3\t0x00020100\n#define OID_NDIS_SEG4\t0x01010100\n#define OID_NDIS_SEG5\t0x01020100\n#define OID_NDIS_SEG6\t0x01020200\n#define OID_NDIS_SEG7\t0xFD010100\n#define OID_NDIS_SEG8\t0x0D010100\n#define OID_NDIS_SEG9\t0x0D010200\n#define OID_NDIS_SEG10\t0x0D020200\n\n#define SZ_OID_NDIS_SEG1\t\t  23\n#define SZ_OID_NDIS_SEG2\t\t    3\n#define SZ_OID_NDIS_SEG3\t\t    6\n#define SZ_OID_NDIS_SEG4\t\t    6\n#define SZ_OID_NDIS_SEG5\t\t    4\n#define SZ_OID_NDIS_SEG6\t\t    8\n#define SZ_OID_NDIS_SEG7\t\t    7\n#define SZ_OID_NDIS_SEG8\t\t  36\n#define SZ_OID_NDIS_SEG9\t\t  24\n#define SZ_OID_NDIS_SEG10\t\t  19\n\n// For Realtek-defined OIDs\n#define OID_MP_SEG1\t\t0xFF871100\n#define OID_MP_SEG2\t\t0xFF818000\n\n#define OID_MP_SEG3\t\t0xFF818700\n#define OID_MP_SEG4\t\t0xFF011100\n\n#define DEBUG_OID(dbg, str)     \t\t\\\n       if((!dbg))\t\t\t\t    \t\t\t\\\n      \t{\t\t\t\t\t    \t\t\t\\\n\t   RT_TRACE(_module_rtl871x_ioctl_c_,_drv_info_,(\"%s(%d): %s\", __FUNCTION__, __LINE__, str));\t\\\n      \t}\t\t\t\n\n\nenum oid_type\n{\n\tQUERY_OID,\n\tSET_OID\n};\n\nstruct oid_funs_node {\n\tunsigned int oid_start; //the starting number for OID\n\tunsigned int oid_end; //the ending number for OID\n\tstruct oid_obj_priv *node_array; \n\tunsigned int array_sz; //the size of node_array\n\tint query_counter; //count the number of query hits for this segment  \n\tint set_counter; //count the number of set hits for this segment  \n};\n\nstruct oid_par_priv\n{\n\tvoid\t\t*adapter_context;\n\tNDIS_OID\toid;\n\tvoid\t\t*information_buf;\n\tu32\t\tinformation_buf_len;\n\tu32\t\t*bytes_rw;\n\tu32\t\t*bytes_needed;\n\tenum oid_type\ttype_of_oid;\n\tu32\t\tdbg;\n};\n\nstruct oid_obj_priv {\n\tunsigned char\tdbg; // 0: without OID debug message  1: with OID debug message \n\tNDIS_STATUS (*oidfuns)(struct oid_par_priv *poid_par_priv);\t\n};\n\n#if (defined(CONFIG_MP_INCLUDED) && defined(_RTW_MP_IOCTL_C_)) || \\\n\t(defined(PLATFORM_WINDOWS) && defined(_RTW_IOCTL_RTL_C_))\nstatic NDIS_STATUS oid_null_function(struct oid_par_priv* poid_par_priv)\n{\n\t_func_enter_;\n\t_func_exit_;\n\treturn NDIS_STATUS_SUCCESS;\n}\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\nint TranslateNdisPsToRtPs(IN NDIS_802_11_POWER_MODE\tndisPsMode);\n\n//OID Handler for Segment 1\nNDIS_STATUS oid_gen_supported_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_hardware_status_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_media_supported_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_media_in_use_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_maximum_lookahead_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_maximum_frame_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_link_speed_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_transmit_buffer_space_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_receive_buffer_space_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_transmit_block_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_receive_block_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_vendor_id_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_vendor_description_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_current_packet_filter_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_current_lookahead_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_driver_version_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_maximum_total_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_protocol_options_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_mac_options_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_media_connect_status_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_maximum_send_packets_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_vendor_driver_version_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//OID Handler for Segment 2\nNDIS_STATUS oid_gen_physical_medium_hdl(struct oid_par_priv* poid_par_priv);\n\n//OID Handler for Segment 3\nNDIS_STATUS oid_gen_xmit_ok_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_rcv_ok_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_xmit_error_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_rcv_error_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_gen_rcv_no_buffer_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//OID Handler for Segment 4\nNDIS_STATUS oid_802_3_permanent_address_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_current_address_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_multicast_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_maximum_list_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_mac_options_hdl(struct oid_par_priv* poid_par_priv);\n\n\n\n//OID Handler for Segment 5\nNDIS_STATUS oid_802_3_rcv_error_alignment_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_one_collision_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_more_collisions_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//OID Handler for Segment 6\nNDIS_STATUS oid_802_3_xmit_deferred_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_max_collisions_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_rcv_overrun_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_underrun_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_heartbeat_failure_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_times_crs_lost_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_3_xmit_late_collisions_hdl(struct oid_par_priv* poid_par_priv);\n\n\n\n//OID Handler for Segment 7\nNDIS_STATUS oid_pnp_capabilities_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_set_power_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_query_power_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_add_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_remove_wake_up_pattern_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_wake_up_pattern_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_pnp_enable_wake_up_hdl(struct oid_par_priv* poid_par_priv);\n\n\n\n//OID Handler for Segment 8\nNDIS_STATUS oid_802_11_bssid_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_ssid_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_infrastructure_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_add_wep_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_remove_wep_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_disassociate_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_authentication_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_privacy_filter_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_bssid_list_scan_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_encryption_status_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_reload_defaults_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_add_key_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_remove_key_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_association_information_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_test_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_media_stream_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_capability_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_pmkid_hdl(struct oid_par_priv* poid_par_priv);\n\n\n\n\n\n//OID Handler for Segment 9\nNDIS_STATUS oid_802_11_network_types_supported_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_network_type_in_use_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_tx_power_level_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_rssi_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_rssi_trigger_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_fragmentation_threshold_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_rts_threshold_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_number_of_antennas_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_rx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_tx_antenna_selected_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_supported_rates_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_desired_rates_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_configuration_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_power_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_802_11_bssid_list_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//OID Handler for Segment 10\nNDIS_STATUS oid_802_11_statistics_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//OID Handler for Segment ED \nNDIS_STATUS oid_rt_mh_vender_id_hdl(struct oid_par_priv* poid_par_priv);\n\nvoid Set_802_3_MULTICAST_LIST(ADAPTER *pAdapter, UCHAR *MCListbuf, ULONG MCListlen, BOOLEAN bAcceptAllMulticast);\n\n#endif// end of PLATFORM_WINDOWS\n\n#if defined(PLATFORM_LINUX) && defined(CONFIG_WIRELESS_EXT)\nextern struct iw_handler_def  rtw_handlers_def;\n#endif\n\nextern void rtw_request_wps_pbc_event(_adapter *padapter);\n\nextern\tNDIS_STATUS drv_query_info(\n\tIN\t_nic_hdl\t\tMiniportAdapterContext,\n\tIN\tNDIS_OID\t\tOid,\n\tIN\tvoid *\t\t\tInformationBuffer,\n\tIN\tu32\t\t\tInformationBufferLength,\n\tOUT\tu32*\t\t\tBytesWritten,\n\tOUT\tu32*\t\t\tBytesNeeded\n\t);\n\nextern\tNDIS_STATUS \tdrv_set_info(\n\tIN\t_nic_hdl\t\tMiniportAdapterContext,\n\tIN\tNDIS_OID\t\tOid,\n\tIN\tvoid *\t\t\tInformationBuffer,\n\tIN\tu32\t\t\tInformationBufferLength,\n\tOUT\tu32*\t\t\tBytesRead,\n\tOUT\tu32*\t\t\tBytesNeeded\n\t);\n\n#endif // #ifndef __INC_CEINFO_\n\n"
  },
  {
    "path": "include/rtw_ioctl_query.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_IOCTL_QUERY_H_\n#define _RTW_IOCTL_QUERY_H_\n\n\n#ifdef PLATFORM_WINDOWS\n\nu8 query_802_11_capability(_adapter*\tpadapter,u8*\tpucBuf,u32 *\tpulOutLen);\nu8 query_802_11_association_information (_adapter * padapter, PNDIS_802_11_ASSOCIATION_INFORMATION pAssocInfo);\n\n#endif\n\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_ioctl_rtl.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_IOCTL_RTL_H_\n#define _RTW_IOCTL_RTL_H_\n\n\n//************** oid_rtl_seg_01_01 ************** \nNDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv* poid_par_priv);//84\nNDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv* poid_par_priv);\t//8a\nNDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv* poid_par_priv);\t//8b\n\nNDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv* poid_par_priv);//93\nNDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv* poid_par_priv);\n\n//**************  oid_rtl_seg_01_03 section start ************** \nNDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv* poid_par_priv);\n\n// oid_rtl_seg_01_11 \nNDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv* poid_par_priv);\n\n//**************  oid_rtl_seg_03_00 section start **************  \nNDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv* poid_par_priv);\n\n\n\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_ioctl_set.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_IOCTL_SET_H_\n#define __RTW_IOCTL_SET_H_\n\n\ntypedef u8 NDIS_802_11_PMKID_VALUE[16];\n\ntypedef struct _BSSIDInfo {\n\tNDIS_802_11_MAC_ADDRESS  BSSID;\n\tNDIS_802_11_PMKID_VALUE  PMKID;\n} BSSIDInfo, *PBSSIDInfo;\n\n\n#ifdef PLATFORM_OS_XP\ntypedef struct _NDIS_802_11_PMKID {\n\tu32\tLength;\n\tu32\tBSSIDInfoCount;\n\tBSSIDInfo BSSIDInfo[1];\n} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID;\n#endif\n\n\n#ifdef PLATFORM_WINDOWS\nu8 rtw_set_802_11_reload_defaults(_adapter * padapter, NDIS_802_11_RELOAD_DEFAULTS reloadDefaults);\nu8 rtw_set_802_11_test(_adapter * padapter, NDIS_802_11_TEST * test);\nu8 rtw_set_802_11_pmkid(_adapter *pdapter, NDIS_802_11_PMKID *pmkid);\n\nu8 rtw_pnp_set_power_sleep(_adapter* padapter);\nu8 rtw_pnp_set_power_wakeup(_adapter* padapter);\n\nvoid rtw_pnp_resume_wk(void *context);\nvoid rtw_pnp_sleep_wk(void * context);\n\n#endif\n\nu8 rtw_set_802_11_add_key(_adapter * padapter, NDIS_802_11_KEY * key);\nu8 rtw_set_802_11_authentication_mode(_adapter *pdapter, NDIS_802_11_AUTHENTICATION_MODE authmode);\nu8 rtw_set_802_11_bssid(_adapter* padapter, u8 *bssid);\nu8 rtw_set_802_11_add_wep(_adapter * padapter, NDIS_802_11_WEP * wep);\nu8 rtw_set_802_11_disassociate(_adapter * padapter);\nu8 rtw_set_802_11_bssid_list_scan(_adapter* padapter, NDIS_802_11_SSID *pssid, int ssid_max_num);\nu8 rtw_set_802_11_infrastructure_mode(_adapter * padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype);\nu8 rtw_set_802_11_remove_wep(_adapter * padapter, u32 keyindex);\nu8 rtw_set_802_11_ssid(_adapter * padapter, NDIS_802_11_SSID * ssid);\nu8 rtw_set_802_11_connect(_adapter* padapter, u8 *bssid, NDIS_802_11_SSID *ssid);\nu8 rtw_set_802_11_remove_key(_adapter * padapter, NDIS_802_11_REMOVE_KEY * key);\n\nu8 rtw_validate_bssid(u8 *bssid);\nu8 rtw_validate_ssid(NDIS_802_11_SSID *ssid);\n\nu16 rtw_get_cur_max_rate(_adapter *adapter);\nint rtw_set_scan_mode(_adapter *adapter, RT_SCAN_TYPE scan_mode);\nint rtw_set_channel_plan(_adapter *adapter, u8 channel_plan);\nint rtw_set_country(_adapter *adapter, const char *country_code);\nint rtw_set_band(_adapter *adapter, u8 band);\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_iol.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_IOL_H_\n#define __RTW_IOL_H_\n\n\nstruct xmit_frame\t*rtw_IOL_accquire_xmit_frame(ADAPTER *adapter);\nint rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len);\nint rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary);\nint rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt);\nbool rtw_IOL_applied(ADAPTER *adapter);\nint rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us);\nint rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms);\nint rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame);\n\n\n#ifdef CONFIG_IOL_NEW_GENERATION\n#define IOREG_CMD_END_LEN\t4\n\nstruct ioreg_cfg{\n\tu8 \tlength;\n\tu8 \tcmd_id;\n\tu16 \taddress;\n\tu32\tdata;\n\tu32  mask;\n};\nenum ioreg_cmd{\n\tIOREG_CMD_LLT \t\t\t= 0x01,\n\tIOREG_CMD_REFUSE \t\t= 0x02,\n\tIOREG_CMD_EFUSE_PATH = 0x03,\n\tIOREG_CMD_WB_REG\t\t= 0x04,\n\tIOREG_CMD_WW_REG\t= 0x05,\n\tIOREG_CMD_WD_REG \t= 0x06,\n\tIOREG_CMD_W_RF \t\t= 0x07,\n\tIOREG_CMD_DELAY_US \t= 0x10,\n\tIOREG_CMD_DELAY_MS\t= 0x11,\n\tIOREG_CMD_END \t\t= 0xFF,\t\t\n};\nvoid read_efuse_from_txpktbuf(ADAPTER *adapter, int bcnhead, u8 *content, u16 *size);\n\nint _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask);\nint _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask);\nint _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask);\nint _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask);\n#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask))\n#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask))\n#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value,mask) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value),(mask))\n#define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value,mask) _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value),(mask))\n\nu8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame);\nvoid  rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf);\n\n#ifdef CONFIG_IOL_IOREG_CFG_DBG\n\tstruct cmd_cmp{\n\t\tu16 addr;\n\t\tu32 value;\n\t};\n#endif\n\n#else //CONFIG_IOL_NEW_GENERATION\n\ntypedef struct _io_offload_cmd {\n\tu8 rsvd0;\n\tu8 cmd;\n\tu16 address;\n\tu32 value;\n} IO_OFFLOAD_CMD, IOL_CMD;\n\n#define IOL_CMD_LLT\t\t\t0x00\n//#define IOL_CMD_R_EFUSE\t0x01\n#define IOL_CMD_WB_REG\t\t0x02\n#define IOL_CMD_WW_REG \t0x03\n#define IOL_CMD_WD_REG\t\t0x04\n//#define IOL_CMD_W_RF\t\t0x05\n#define IOL_CMD_DELAY_US\t0x80\n#define IOL_CMD_DELAY_MS\t0x81\n//#define IOL_CMD_DELAY_S\t0x82\n#define IOL_CMD_END\t\t\t0x83\n\n/*****************************************************\nCMD\t\t\t\t\tAddress\t\t\tValue\n(B1)\t\t\t\t\t(B2/B3:H/L addr)\t(B4:B7 : MSB:LSB)\n******************************************************\nIOL_CMD_LLT\t\t\t-\t\t\t\tB7: PGBNDY\n//IOL_CMD_R_EFUSE\t-\t\t\t\t-\nIOL_CMD_WB_REG\t\t0x0~0xFFFF\t\tB7\nIOL_CMD_WW_REG\t0x0~0xFFFF\t\tB6~B7\nIOL_CMD_WD_REG\t0x0~0xFFFF\t\tB4~B7\n//IOL_CMD_W_RF\t\tRF Reg\t\t\tB5~B7\nIOL_CMD_DELAY_US\t-\t\t\t\tB6~B7\nIOL_CMD_DELAY_MS\t-\t\t\t\tB6~B7\n//IOL_CMD_DELAY_S\t-\t\t\t\tB6~B7\nIOL_CMD_END\t\t-\t\t\t\t-\n******************************************************/\nint _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value);\nint _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value);\nint _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value);\n\n\nint rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms);\nint rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms);\n\n#ifdef DBG_IO\nint dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line);\nint dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line);\nint dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line);\n#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)\n#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)\n#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) dbg_rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), __FUNCTION__, __LINE__)\n#else\n#define rtw_IOL_append_WB_cmd(xmit_frame, addr, value) _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value))\n#define rtw_IOL_append_WW_cmd(xmit_frame, addr, value) _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value))\n#define rtw_IOL_append_WD_cmd(xmit_frame, addr, value) _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value))\n#endif // DBG_IO\n#endif // CONFIG_IOL_NEW_GENERATION\n\n\n\n#endif //__RTW_IOL_H_\n\n"
  },
  {
    "path": "include/rtw_mem.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_MEM_H__\n#define __RTW_MEM_H__\n\n#include <drv_conf.h>\n#include <basic_types.h>\n#include <osdep_service.h>\n\n#ifdef CONFIG_PLATFORM_MSTAR_HIGH\n#define MAX_RTKM_RECVBUF_SZ (31744) /* 31k */\n#else\n#define MAX_RTKM_RECVBUF_SZ (15360) /* 15k */\n#endif /* CONFIG_PLATFORM_MSTAR_HIGH */\n#define MAX_RTKM_NR_PREALLOC_RECV_SKB 16\n\nu16 rtw_rtkm_get_buff_size(void);\nu8 rtw_rtkm_get_nr_recv_skb(void);\nstruct u8* rtw_alloc_revcbuf_premem(void);\nstruct sk_buff *rtw_alloc_skb_premem(u16 in_size);\nint rtw_free_skb_premem(struct sk_buff *pskb);\n\n\n#endif //__RTW_MEM_H__\n\n"
  },
  {
    "path": "include/rtw_mlme.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_MLME_H_\n#define __RTW_MLME_H_\n\n\n#define\tMAX_BSS_CNT\t128\n//#define   MAX_JOIN_TIMEOUT\t2000\n//#define   MAX_JOIN_TIMEOUT\t2500\n#define   MAX_JOIN_TIMEOUT\t6500\n\n//\tCommented by Albert 20101105\n//\tIncrease the scanning timeout because of increasing the SURVEY_TO value.\n\n#define SCANNING_TIMEOUT 8000\n#ifdef CONFIG_SCAN_BACKOP\n#define CONC_SCANNING_TIMEOUT_SINGLE_BAND 10000\n#define CONC_SCANNING_TIMEOUT_DUAL_BAND 15000\n#endif\n\n#ifdef PALTFORM_OS_WINCE\n#define\tSCANQUEUE_LIFETIME 12000000 // unit:us\n#else\n#define\tSCANQUEUE_LIFETIME 20000 // 20sec, unit:msec\n#endif\n\n#define WIFI_NULL_STATE\t\t\t\t\t0x00000000\n#define WIFI_ASOC_STATE\t\t\t\t\t0x00000001 /* Linked */\n#define WIFI_REASOC_STATE\t\t\t\t0x00000002\n#define WIFI_SLEEP_STATE\t\t\t\t0x00000004\n#define WIFI_STATION_STATE\t\t\t\t0x00000008\n#define WIFI_AP_STATE\t\t\t\t\t0x00000010\n#define WIFI_ADHOC_STATE\t\t\t\t0x00000020\n#define WIFI_ADHOC_MASTER_STATE\t\t\t0x00000040\n#define WIFI_UNDER_LINKING\t\t\t\t0x00000080\n#define WIFI_UNDER_WPS\t\t\t\t\t0x00000100\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x00000200*/\n#define WIFI_STA_ALIVE_CHK_STATE\t\t0x00000400\n#define WIFI_SITE_MONITOR\t\t\t\t0x00000800 /* under site surveying */\n#define WIFI_WDS\t\t\t\t\t\t0x00001000\n#define WIFI_WDS_RX_BEACON\t\t\t\t0x00002000 /* already rx WDS AP beacon */\n#define WIFI_AUTOCONF\t\t\t\t\t0x00004000\n#define WIFI_AUTOCONF_IND\t\t\t\t0x00008000\n#define WIFI_MP_STATE\t\t\t\t\t0x00010000\n#define WIFI_MP_CTX_BACKGROUND\t\t\t0x00020000 /* in continuous tx background */\n#define WIFI_MP_CTX_ST\t\t\t\t\t0x00040000 /* in continuous tx with single-tone */\n#define WIFI_MP_CTX_BACKGROUND_PENDING\t0x00080000 /* pending in continuous tx background due to out of skb */\n#define WIFI_MP_CTX_CCK_HW\t\t\t\t0x00100000 /* in continuous tx */\n#define WIFI_MP_CTX_CCK_CS\t\t\t\t0x00200000 /* in continuous tx with carrier suppression */\n#define WIFI_MP_LPBK_STATE\t\t\t\t0x00400000\n#define WIFI_OP_CH_SWITCHING\t\t\t0x00800000\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x01000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x02000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x04000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x08000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x10000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x20000000*/\n/*#define WIFI_UNDEFINED_STATE\t\t\t0x40000000*/\n#define WIFI_MONITOR_STATE\t\t\t\t0x80000000\n\n#define MLME_STATE_FMT \"%s%s%s%s%s%s%s%s%s%s%s%s\"\n#define MLME_STATE_ARG(state) \\\n\t((state) & WIFI_STATION_STATE)?\" STA\":\"\", \\\n\t((state) & WIFI_AP_STATE)?\" AP\":\"\", \\\n\t((state) & WIFI_ADHOC_STATE)?\" ADHOC\":\"\", \\\n\t((state) & WIFI_ADHOC_MASTER_STATE)?\" ADHOC_M\":\"\", \\\n\t((state) & WIFI_MONITOR_STATE)?\" MONITOR\":\"\", \\\n\t((state) & WIFI_MP_STATE)?\" MP\":\"\", \\\n\t((state) & WIFI_SITE_MONITOR)?\" SCAN\":\"\", \\\n\t((state) & WIFI_UNDER_LINKING)?\" LINKING\":\"\", \\\n\t((state) & WIFI_ASOC_STATE)?\" ASOC\":\"\", \\\n\t((state) & WIFI_OP_CH_SWITCHING)?\" OP_CH_SW\":\"\", \\\n\t((state) & WIFI_UNDER_WPS)?\" WPS\":\"\", \\\n\t((state) & WIFI_SLEEP_STATE)?\" SLEEP\":\"\"\n\n#define ADPT_MLME_S_ARG(adapter) MLME_STATE_ARG(get_fwstate(&((adapter)->mlmepriv)))\n\n#define _FW_UNDER_LINKING\tWIFI_UNDER_LINKING\n#define _FW_LINKED\t\t\tWIFI_ASOC_STATE\n#define _FW_UNDER_SURVEY\tWIFI_SITE_MONITOR\n\n\nenum dot11AuthAlgrthmNum {\n dot11AuthAlgrthm_Open = 0,\n dot11AuthAlgrthm_Shared,\n dot11AuthAlgrthm_8021X,\n dot11AuthAlgrthm_Auto,\n dot11AuthAlgrthm_WAPI,\n dot11AuthAlgrthm_MaxNum\n};\n\n// Scan type including active and passive scan.\ntypedef enum _RT_SCAN_TYPE\n{\n\tSCAN_PASSIVE,\n\tSCAN_ACTIVE,\n\tSCAN_MIX,\n}RT_SCAN_TYPE, *PRT_SCAN_TYPE;\n\n#define WIFI_FREQUENCY_BAND_AUTO 0\n#define WIFI_FREQUENCY_BAND_5GHZ 1\n#define WIFI_FREQUENCY_BAND_2GHZ 2\n\n#define rtw_band_valid(band) ((band) <= WIFI_FREQUENCY_BAND_2GHZ)\n\nenum DriverInterface {\n\tDRIVER_WEXT =  1,\n\tDRIVER_CFG80211 = 2\n};\n\nenum SCAN_RESULT_TYPE\n{\n\tSCAN_RESULT_P2P_ONLY = 0,\t\t//\tWill return all the P2P devices.\n\tSCAN_RESULT_ALL = 1,\t\t\t//\tWill return all the scanned device, include AP.\n\tSCAN_RESULT_WFD_TYPE = 2\t\t//\tWill just return the correct WFD device.\n\t\t\t\t\t\t\t\t\t//\tIf this device is Miracast sink device, it will just return all the Miracast source devices.\n};\n\n/*\n\nthere are several \"locks\" in mlme_priv,\nsince mlme_priv is a shared resource between many threads,\nlike ISR/Call-Back functions, the OID handlers, and even timer functions.\n\n\nEach _queue has its own locks, already.\nOther items are protected by mlme_priv.lock.\n\nTo avoid possible dead lock, any thread trying to modifiying mlme_priv\nSHALL not lock up more than one locks at a time!\n\n*/\n\n\n#define traffic_threshold\t10\n#define\ttraffic_scan_period\t500\n\nstruct sitesurvey_ctrl {\n\tu64\tlast_tx_pkts;\n\tuint\tlast_rx_pkts;\n\tsint\ttraffic_busy;\n\t_timer\tsitesurvey_ctrl_timer;\n};\n\ntypedef struct _RT_LINK_DETECT_T{\n\tu32\t\t\t\tNumTxOkInPeriod;\n\tu32\t\t\t\tNumRxOkInPeriod;\n\tu32\t\t\t\tNumRxUnicastOkInPeriod;\n\tBOOLEAN\t\t\tbBusyTraffic;\n\tBOOLEAN\t\t\tbTxBusyTraffic;\n\tBOOLEAN\t\t\tbRxBusyTraffic;\n\tBOOLEAN\t\t\tbHigherBusyTraffic; // For interrupt migration purpose.\n\tBOOLEAN\t\t\tbHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic.\n\tBOOLEAN\t\t\tbHigherBusyTxTraffic; // We may disable Tx interrupt according as Tx traffic.\n\t//u8 TrafficBusyState;\n\tu8 TrafficTransitionCount;\n\tu32 LowPowerTransitionCount;\n}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;\n\nstruct profile_info {\n\tu8\tssidlen;\n\tu8\tssid[ WLAN_SSID_MAXLEN ];\n\tu8\tpeermac[ ETH_ALEN ];\n};\n\nstruct tx_invite_req_info{\n\tu8\t\t\t\t\ttoken;\n\tu8\t\t\t\t\tbenable;\n\tu8\t\t\t\t\tgo_ssid[ WLAN_SSID_MAXLEN ];\n\tu8\t\t\t\t\tssidlen;\n\tu8\t\t\t\t\tgo_bssid[ ETH_ALEN ];\n\tu8\t\t\t\t\tpeer_macaddr[ ETH_ALEN ];\n\tu8\t\t\t\t\toperating_ch;\t//\tThis information will be set by using the p2p_set op_ch=x\n\tu8\t\t\t\t\tpeer_ch;\t\t//\tThe listen channel for peer P2P device\n\n};\n\nstruct tx_invite_resp_info{\n\tu8\t\t\t\t\ttoken;\t//\tUsed to record the dialog token of p2p invitation request frame.\n};\n\n#define MIRACAST_DISABLED 0\n#define MIRACAST_SOURCE 1\n#define MIRACAST_SINK 2\n#define MIRACAST_INVALID 3\n\n#define is_miracast_enabled(mode) \\\n\t(mode == MIRACAST_SOURCE || mode == MIRACAST_SINK)\n\nconst char *get_miracast_mode_str(int mode);\n\n#ifdef CONFIG_WFD\n\nstruct wifi_display_info{\n\tu16\t\t\t\t\t\t\twfd_enable;\t\t\t//\tEanble/Disable the WFD function.\n\tu16\t\t\t\t\t\t\trtsp_ctrlport;\t\t//\tTCP port number at which the this WFD device listens for RTSP messages\n\tu16\t\t\t\t\t\t\tpeer_rtsp_ctrlport;\t//\tTCP port number at which the peer WFD device listens for RTSP messages\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\tThis filed should be filled when receiving the gropu negotiation request\n\n\tu8\t\t\t\t\t\t\tpeer_session_avail;\t//\tWFD session is available or not for the peer wfd device.\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\tThis variable will be set when sending the provisioning discovery request to peer WFD device.\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\tAnd this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command.\n\tu8\t\t\t\t\t\t\tip_address[4];\n\tu8\t\t\t\t\t\t\tpeer_ip_address[4];\n\tu8\t\t\t\t\t\t\twfd_pc;\t\t\t\t//\tWFD preferred connection\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0 -> Prefer to use the P2P for WFD connection on peer side.\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1 -> Prefer to use the TDLS for WFD connection on peer side.\n\t\t\t\t\t\t\t\t\t\t\t\n\tu8\t\t\t\t\t\t\twfd_device_type;\t//\tWFD Device Type\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0 -> WFD Source Device\n\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1 -> WFD Primary Sink Device\n\tenum\tSCAN_RESULT_TYPE\tscan_result_type;\t//\tUsed when P2P is enable. This parameter will impact the scan result.\n\tu8 stack_wfd_mode;\n};\n#endif //CONFIG_WFD\n\nstruct tx_provdisc_req_info{\n\tu16\t\t\t\t\twps_config_method_request;\t//\tUsed when sending the provisioning request frame\n\tu16\t\t\t\t\tpeer_channel_num[2];\t\t//\tThe channel number which the receiver stands.\n\tNDIS_802_11_SSID\tssid;\n\tu8\t\t\t\t\tpeerDevAddr[ ETH_ALEN ];\t\t//\tPeer device address\n\tu8\t\t\t\t\tpeerIFAddr[ ETH_ALEN ];\t\t//\tPeer interface address\n\tu8\t\t\t\t\tbenable;\t\t\t\t\t//\tThis provision discovery request frame is trigger to send or not\n};\n\nstruct rx_provdisc_req_info{\t//When peer device issue prov_disc_req first, we should store the following informations\n\tu8\t\t\t\t\tpeerDevAddr[ ETH_ALEN ];\t\t//\tPeer device address\n\tu8\t\t\t\t\tstrconfig_method_desc_of_prov_disc_req[4];\t//\tdescription for the config method located in the provisioning discovery request frame.\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tThe UI must know this information to know which config method the remote p2p device is requiring.\n};\n\nstruct tx_nego_req_info{\n\tu16\t\t\t\t\tpeer_channel_num[2];\t\t//\tThe channel number which the receiver stands.\n\tu8\t\t\t\t\tpeerDevAddr[ ETH_ALEN ];\t\t//\tPeer device address\n\tu8\t\t\t\t\tbenable;\t\t\t\t\t//\tThis negoitation request frame is trigger to send or not\n\tu8\t\t\t\t\tpeer_ch;\t\t                   /*   The listen channel for peer P2P device    */\n};\n\nstruct group_id_info{\n\tu8\t\t\t\t\tgo_device_addr[ ETH_ALEN ];\t//\tThe GO's device address of this P2P group\n\tu8\t\t\t\t\tssid[ WLAN_SSID_MAXLEN ];\t//\tThe SSID of this P2P group\n};\n\nstruct scan_limit_info{\n\tu8\t\t\t\t\tscan_op_ch_only;\t\t\t//\tWhen this flag is set, the driver should just scan the operation channel\n#ifndef CONFIG_P2P_OP_CHK_SOCIAL_CH\n\tu8\t\t\t\t\toperation_ch[2];\t\t\t\t//\tStore the operation channel of invitation request frame\n#else\n\tu8\t\t\t\t\toperation_ch[5];\t\t\t\t//\tStore additional channel 1,6,11  for Android 4.2 IOT & Nexus 4\n#endif //CONFIG_P2P_OP_CHK_SOCIAL_CH\n};\n\n#ifdef CONFIG_IOCTL_CFG80211\nstruct cfg80211_wifidirect_info{\n\t_timer\t\t\t\t\tremain_on_ch_timer;\n\tu8\t\t\t\t\t\trestore_channel;\n\tstruct ieee80211_channel\tremain_on_ch_channel;\n\tenum nl80211_channel_type\tremain_on_ch_type;\n\tATOMIC_T ro_ch_cookie_gen;\n\tu64 remain_on_ch_cookie;\n\tbool is_ro_ch;\n\tu32 last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */\n};\n#endif //CONFIG_IOCTL_CFG80211\n\n#ifdef CONFIG_P2P_WOWLAN\n\nenum P2P_WOWLAN_RECV_FRAME_TYPE\n{\n\tP2P_WOWLAN_RECV_NEGO_REQ = 0,\n\tP2P_WOWLAN_RECV_INVITE_REQ = 1,\n\tP2P_WOWLAN_RECV_PROVISION_REQ = 2,\n};\n\nstruct p2p_wowlan_info{\n\n\tu8 \t\t\t\t\t\tis_trigger;\n\tenum P2P_WOWLAN_RECV_FRAME_TYPE\twowlan_recv_frame_type;\n\tu8 \t\t\t\t\t\twowlan_peer_addr[ETH_ALEN];\n\tu16\t\t\t\t\t\twowlan_peer_wpsconfig;\n\tu8\t\t\t\t\t\twowlan_peer_is_persistent;\n\tu8\t\t\t\t\t\twowlan_peer_invitation_type;\n};\n\n#endif //CONFIG_P2P_WOWLAN\n\nstruct wifidirect_info{\n\t_adapter*\t\t\t\tpadapter;\n\t_timer\t\t\t\t\tfind_phase_timer;\n\t_timer\t\t\t\t\trestore_p2p_state_timer;\n\t\n\t//\tUsed to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer.\n\t_timer\t\t\t\t\tpre_tx_scan_timer;\n\t_timer\t\t\t\t\treset_ch_sitesurvey;\n\t_timer\t\t\t\t\treset_ch_sitesurvey2;\t//\tJust for resetting the scan limit function by using p2p nego\n#ifdef CONFIG_CONCURRENT_MODE\n\t//\tUsed to switch the channel between legacy AP and listen state.\n\t_timer\t\t\t\t\tap_p2p_switch_timer;\n#endif\n\tstruct tx_provdisc_req_info\ttx_prov_disc_info;\n\tstruct rx_provdisc_req_info rx_prov_disc_info;\n\tstruct tx_invite_req_info\tinvitereq_info;\n\tstruct profile_info\t\t\tprofileinfo[ P2P_MAX_PERSISTENT_GROUP_NUM ];\t//\tStore the profile information of persistent group\n\tstruct tx_invite_resp_info\tinviteresp_info;\n\tstruct tx_nego_req_info\tnego_req_info;\n\tstruct group_id_info\t\tgroupid_info;\t//\tStore the group id information when doing the group negotiation handshake.\n\tstruct scan_limit_info\t\trx_invitereq_info;\t//\tUsed for get the limit scan channel from the Invitation procedure\n\tstruct scan_limit_info\t\tp2p_info;\t\t//\tUsed for get the limit scan channel from the P2P negotiation handshake\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info\t\t*wfd_info;\n#endif\t\n\n#ifdef CONFIG_P2P_WOWLAN\n\tstruct p2p_wowlan_info\t\tp2p_wow_info;\n#endif //CONFIG_P2P_WOWLAN\n\n\tenum P2P_ROLE\t\t\trole;\n\tenum P2P_STATE\t\t\tpre_p2p_state;\n\tenum P2P_STATE\t\t\tp2p_state;\n\tu8 \t\t\t\t\t\tdevice_addr[ETH_ALEN];\t//\tThe device address should be the mac address of this device.\n\tu8\t\t\t\t\t\tinterface_addr[ETH_ALEN];\n\tu8\t\t\t\t\t\tsocial_chan[4];\n\tu8\t\t\t\t\t\tlisten_channel;\n\tu8\t\t\t\t\t\toperating_channel;\n\tu8\t\t\t\t\t\tlisten_dwell;\t\t//\tThis value should be between 1 and 3\n\tu8\t\t\t\t\t\tsupport_rate[8];\n\tu8\t\t\t\t\t\tp2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN];\n\tu8\t\t\t\t\t\tintent;\t\t//\tshould only include the intent value.\n\tu8\t\t\t\t\t\tp2p_peer_interface_addr[ ETH_ALEN ];\n\tu8\t\t\t\t\t\tp2p_peer_device_addr[ ETH_ALEN ];\n\tu8\t\t\t\t\t\tpeer_intent;\t//\tIncluded the intent value and tie breaker value.\n\tu8\t\t\t\t\t\tdevice_name[ WPS_MAX_DEVICE_NAME_LEN ];\t//\tDevice name for displaying on searching device screen\n\tu8\t\t\t\t\t\tdevice_name_len;\n\tu8\t\t\t\t\t\tprofileindex;\t//\tUsed to point to the index of profileinfo array\n\tu8\t\t\t\t\t\tpeer_operating_ch;\n\tu8\t\t\t\t\t\tfind_phase_state_exchange_cnt;\n\tu16\t\t\t\t\t\tdevice_password_id_for_nego;\t//\tThe device password ID for group negotation\n\tu8\t\t\t\t\t\tnegotiation_dialog_token;\n\tu8\t\t\t\t\t\tnego_ssid[ WLAN_SSID_MAXLEN ];\t//\tSSID information for group negotitation\n\tu8\t\t\t\t\t\tnego_ssidlen;\n\tu8 \t\t\t\t\t\tp2p_group_ssid[WLAN_SSID_MAXLEN];\n\tu8 \t\t\t\t\t\tp2p_group_ssid_len;\n\tu8\t\t\t\t\t\tpersistent_supported;\t\t//\tFlag to know the persistent function should be supported or not.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tIn the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0: disable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1: enable\n\tu8\t\t\t\t\t\tsession_available;\t\t\t//\tFlag to set the WFD session available to enable or disable \"by Sigma\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tIn the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0: disable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1: enable\n\n\tu8\t\t\t\t\t\twfd_tdls_enable;\t\t\t//\tFlag to enable or disable the TDLS by WFD Sigma\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0: disable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1: enable\n\tu8\t\t\t\t\t\twfd_tdls_weaksec;\t\t\t//\tFlag to enable or disable the weak security function for TDLS by WFD Sigma\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t0: disable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tIn this case, the driver can't issue the tdsl setup request frame.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\t1: enable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tIn this case, the driver can issue the tdls setup request frame\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\teven the current security is weak security.\n\n\tenum\tP2P_WPSINFO\t\tui_got_wps_info;\t\t\t//\tThis field will store the WPS value (PIN value or PBC) that UI had got from the user.\n\tu16\t\t\t\t\t\tsupported_wps_cm;\t\t\t//\tThis field describes the WPS config method which this driver supported.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tThe value should be the combination of config method defined in page104 of WPS v2.0 spec.\t\n\tu8\t\t\t\t\t\texternal_uuid;\t\t\t\t// UUID flag\n\tu8\t\t\t\t\t\tuuid[16];\t\t\t\t\t// UUID\n\tuint\t\t\t\t\t\tchannel_list_attr_len;\t\t//\tThis field will contain the length of body of P2P Channel List attribute of group negotitation response frame.\n\tu8\t\t\t\t\t\tchannel_list_attr[100];\t\t//\tThis field will contain the body of P2P Channel List attribute of group negotitation response frame.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\tWe will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame.\n\tu8\t\t\t\t\t\tdriver_interface;\t\t\t//\tIndicate DRIVER_WEXT or DRIVER_CFG80211\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tu16\t\t\t\t\t\text_listen_interval;\t//\tThe interval to be available with legacy AP (ms)\n\tu16\t\t\t\t\t\text_listen_period;\t//\tThe time period to be available for P2P listen state (ms)\n#endif\n#ifdef CONFIG_P2P_PS\n\tenum P2P_PS_MODE\t\tp2p_ps_mode; // indicate p2p ps mode\n\tenum P2P_PS_STATE\t\tp2p_ps_state; // indicate p2p ps state\n\tu8\t\t\t\t\t\tnoa_index; // Identifies and instance of Notice of Absence timing.\n\tu8\t\t\t\t\t\tctwindow; // Client traffic window. A period of time in TU after TBTT.\n\tu8\t\t\t\t\t\topp_ps; // opportunistic power save.\n\tu8\t\t\t\t\t\tnoa_num; // number of NoA descriptor in P2P IE.\n\tu8\t\t\t\t\t\tnoa_count[P2P_MAX_NOA_NUM]; // Count for owner, Type of client.\n\tu32\t\t\t\t\t\tnoa_duration[P2P_MAX_NOA_NUM]; // Max duration for owner, preferred or min acceptable duration for client.\n\tu32\t\t\t\t\t\tnoa_interval[P2P_MAX_NOA_NUM]; // Length of interval for owner, preferred or max acceptable interval of client.\n\tu32\t\t\t\t\t\tnoa_start_time[P2P_MAX_NOA_NUM]; // schedule expressed in terms of the lower 4 bytes of the TSF timer.\n#endif // CONFIG_P2P_PS\n};\n\nstruct tdls_ss_record{\t//signal strength record\n\tu8\t\tmacaddr[ETH_ALEN];\n\tu8\t\tRxPWDBAll;\n\tu8\t\tis_tdls_sta;\t// _TRUE: direct link sta, _FALSE: else\n};\n\nstruct tdls_temp_mgmt{\n\tu8\tinitiator;\t// 0: None, 1: we initiate, 2: peer initiate\n\tu8\tpeer_addr[ETH_ALEN];\n};\n\n#ifdef CONFIG_TDLS_CH_SW\nstruct tdls_ch_switch{\n\tu32\tch_sw_state;\n\tATOMIC_T\tchsw_on;\n\tu8\taddr[ETH_ALEN];\n\tu8\toff_ch_num;\n\tu8\tch_offset;\n\tu32\tcur_time;\n\tu8\tdelay_switch_back;\n\tu8\tdump_stack;\n};\n#endif\n\nstruct tdls_info{\n\tu8\t\t\t\t\tap_prohibited;\n\tu8\t\t\t\t\tch_switch_prohibited;\n\tu8\t\t\t\t\tlink_established;\n\tu8\t\t\t\t\tsta_cnt;\n\tu8\t\t\t\t\tsta_maximum;\t/* 1:tdls sta is equal (NUM_STA-1), reach max direct link number; 0: else; */\n\tstruct tdls_ss_record\tss_record;\n#ifdef CONFIG_TDLS_CH_SW\t\n\tstruct tdls_ch_switch\tchsw_info;\n#endif\n\n\tu8\t\t\t\t\tch_sensing;\n\tu8\t\t\t\t\tcur_channel;\n\tu8\t\t\t\t\tcollect_pkt_num[MAX_CHANNEL_NUM];\n\t_lock\t\t\t\tcmd_lock;\n\t_lock\t\t\t\thdl_lock;\n\tu8\t\t\t\t\twatchdog_count;\n\tu8\t\t\t\t\tdev_discovered;\t\t/* WFD_TDLS: for sigma test */\n\tu8\t\t\t\t\ttdls_enable;\n\n\t/* Let wpa_supplicant to setup*/\n\tu8\t\t\t\t\tdriver_setup;\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info\t\t*wfd_info;\n#endif\t\t\n};\n\nstruct tdls_txmgmt {\n\tu8 peer[ETH_ALEN];\n\tu8 action_code;\n\tu8 dialog_token;\n\tu16 status_code;\n\tu8 *buf;\n\tsize_t len;\n};\n\n/* used for mlme_priv.roam_flags */\nenum {\n\tRTW_ROAM_ON_EXPIRED = BIT0,\n\tRTW_ROAM_ON_RESUME = BIT1,\n\tRTW_ROAM_ACTIVE = BIT2,\n};\n\nstruct beacon_keys {\n\tu8 ssid[IW_ESSID_MAX_SIZE];\n\tu32 ssid_len;\n\tu8 bcn_channel;\n\tu16 ht_cap_info;\n\tu8 ht_info_infos_0_sco; // bit0 & bit1 in infos[0] is second channel offset\n\tint encryp_protocol;\n\tint pairwise_cipher;\n\tint group_cipher;\n\tint is_8021x;\n};\n\nstruct mlme_priv {\n\n\t_lock\tlock;\n\tsint\tfw_state;\t//shall we protect this variable? maybe not necessarily...\n\tu8 bScanInProcess;\n\tu8\tto_join; //flag\n\t#ifdef CONFIG_LAYER2_ROAMING\n\tu8 to_roam; /* roaming trying times */\n\tstruct wlan_network *roam_network; /* the target of active roam */\n\tu8 roam_flags;\n\tu8 roam_rssi_diff_th; /* rssi difference threshold for active scan candidate selection */\n\tu32 roam_scan_int_ms; /* scan interval for active roam */\n\tu32 roam_scanr_exp_ms; /* scan result expire time in ms  for roam */\n\tu8 roam_tgt_addr[ETH_ALEN]; /* request to roam to speicific target without other consideration */\n\t#endif\n\n\tu8\t*nic_hdl;\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tu8\tnot_indic_disco;\n\t#endif\n\t_list\t\t*pscanned;\n\t_queue\tfree_bss_pool;\n\t_queue\tscanned_queue;\n\tu8\t\t*free_bss_buf;\n\tu32\tnum_of_scanned;\n\n\tNDIS_802_11_SSID\tassoc_ssid;\n\tu8\tassoc_bssid[6];\n\n\tstruct wlan_network\tcur_network;\n\tstruct wlan_network *cur_network_scanned;\n\n\t// bcn check info\n\tstruct beacon_keys cur_beacon_keys; // save current beacon keys\n\tstruct beacon_keys new_beacon_keys; // save new beacon keys\n\tu8 new_beacon_cnts; // if new_beacon_cnts >= threshold, ap beacon is changed\n\n#ifdef CONFIG_ARP_KEEP_ALIVE\n\t// for arp offload keep alive\n\tu8 bGetGateway;\n\tu8\tgw_mac_addr[6];\n\tu8\tgw_ip[4];\n#endif\n\n\t//uint wireless_mode; no used, remove it\n\n\tu32\tauto_scan_int_ms;\n\n\t_timer assoc_timer;\n\n\tuint assoc_by_bssid;\n\tuint assoc_by_rssi;\n\n\t_timer scan_to_timer; // driver itself handles scan_timeout status.\n\tu32 scan_start_time; // used to evaluate the time spent in scanning\n\n\t#ifdef CONFIG_SET_SCAN_DENY_TIMER\n\t_timer set_scan_deny_timer;\n\tATOMIC_T set_scan_deny; //0: allowed, 1: deny\n\t#endif\n\n\tstruct qos_priv qospriv;\n\n#ifdef CONFIG_80211N_HT\n\n\t/* Number of non-HT AP/stations */\n\tint num_sta_no_ht;\n\n\t/* Number of HT AP/stations 20 MHz */\n\t//int num_sta_ht_20mhz; \n\n\n\tint num_FortyMHzIntolerant;\n\n\tstruct ht_priv\thtpriv;\n\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n\tstruct vht_priv\tvhtpriv;\n#endif\n#ifdef CONFIG_BEAMFORMING\n#if (BEAMFORMING_SUPPORT == 0)/*for driver beamforming*/\n\tstruct beamforming_info\tbeamforming_info;\n#endif\n#endif\n\n#ifdef CONFIG_DFS\n\tu8\thandle_dfs;\n#endif\n#ifdef CONFIG_DFS_MASTER\n\t/* TODO: move to rfctl */\n\t_timer dfs_master_timer;\n#endif\n\n\tRT_LINK_DETECT_T\tLinkDetectInfo;\n\t_timer\tdynamic_chk_timer; //dynamic/periodic check timer\n\n\tu8\tacm_mask; // for wmm acm mask\n\tu8\tChannelPlan;\n\tRT_SCAN_TYPE \tscan_mode; // active: 1, passive: 0\n\n\tu8 *wps_probe_req_ie;\n\tu32 wps_probe_req_ie_len;\n\n\tu8 ext_capab_ie_data[8];/*currently for ap mode only*/\n\tu8 ext_capab_ie_len; \n\t\n#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\t/* Number of associated Non-ERP stations (i.e., stations using 802.11b\n\t * in 802.11g BSS) */\n\tint num_sta_non_erp;\n\n\t/* Number of associated stations that do not support Short Slot Time */\n\tint num_sta_no_short_slot_time;\n\n\t/* Number of associated stations that do not support Short Preamble */\n\tint num_sta_no_short_preamble;\n\n\tint olbc; /* Overlapping Legacy BSS Condition (Legacy b/g)*/\n\n\t/* Number of HT associated stations that do not support greenfield */\n\tint num_sta_ht_no_gf;\n\n\t/* Number of associated non-HT stations */\n\t//int num_sta_no_ht;\n\n\t/* Number of HT associated stations 20 MHz */\n\tint num_sta_ht_20mhz;\n\n\t/* number of associated stations 40MHz intolerant */\n\tint num_sta_40mhz_intolerant;\n\t\n\t/* Overlapping BSS information */\n\tint olbc_ht;\n\t\n#ifdef CONFIG_80211N_HT\n\tint ht_20mhz_width_req; \n\tint ht_intolerant_ch_reported;\t\t\n\tu16 ht_op_mode;\n\tu8 sw_to_20mhz; /*switch to 20Mhz BW*/\n#endif /* CONFIG_80211N_HT */\t\n\n\tu8 *assoc_req;\n\tu32 assoc_req_len;\n\tu8 *assoc_rsp;\n\tu32 assoc_rsp_len;\n\n\tu8 *wps_beacon_ie;\t\n\t//u8 *wps_probe_req_ie;\n\tu8 *wps_probe_resp_ie;\n\tu8 *wps_assoc_resp_ie; // for CONFIG_IOCTL_CFG80211, this IE could include p2p ie / wfd ie\n\n\tu32 wps_beacon_ie_len;\n\t//u32 wps_probe_req_ie_len;\n\tu32 wps_probe_resp_ie_len;\n\tu32 wps_assoc_resp_ie_len; // for CONFIG_IOCTL_CFG80211, this IE len could include p2p ie / wfd ie\n\t\n\tu8 *p2p_beacon_ie;\n\tu8 *p2p_probe_req_ie;\n\tu8 *p2p_probe_resp_ie;\t\n\tu8 *p2p_go_probe_resp_ie; //for GO\t\n\tu8 *p2p_assoc_req_ie;\n\n\tu32 p2p_beacon_ie_len;\n\tu32 p2p_probe_req_ie_len;\n\tu32 p2p_probe_resp_ie_len;\n\tu32 p2p_go_probe_resp_ie_len; //for GO\n\tu32 p2p_assoc_req_ie_len;\n/*\n#if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)\n\t//u8 *wps_p2p_beacon_ie;\n\tu8 *p2p_beacon_ie;\n\tu8 *wps_p2p_probe_resp_ie;\n\tu8 *wps_p2p_assoc_resp_ie;\n\t//u32 wps_p2p_beacon_ie_len;\n\tu32 p2p_beacon_ie_len;\n\tu32 wps_p2p_probe_resp_ie_len;\n\tu32 wps_p2p_assoc_resp_ie_len;\n#endif\n*/\n\t\n\t_lock\tbcn_update_lock;\n\tu8\t\tupdate_bcn;\n\t\n\tu8 ori_ch;\n\tu8 ori_bw;\n\tu8 ori_offset;\n#endif //#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)\n\n#if defined(CONFIG_WFD) && defined(CONFIG_IOCTL_CFG80211)\n\t\n\tu8 *wfd_beacon_ie;\n\tu8 *wfd_probe_req_ie;\n\tu8 *wfd_probe_resp_ie;\t\n\tu8 *wfd_go_probe_resp_ie; //for GO\t\n\tu8 *wfd_assoc_req_ie;\n\n\tu32 wfd_beacon_ie_len;\n\tu32 wfd_probe_req_ie_len;\n\tu32 wfd_probe_resp_ie_len;\n\tu32 wfd_go_probe_resp_ie_len; //for GO\n\tu32 wfd_assoc_req_ie_len;\n\n#endif\n\n#ifdef RTK_DMP_PLATFORM\n\t// DMP kobject_hotplug function  signal need in passive level\n\t_workitem\tLinkup_workitem;\n\t_workitem\tLinkdown_workitem;\n#endif\n\n#ifdef CONFIG_INTEL_WIDI\n\tint\twidi_state;\n\tint\tlisten_state;\n\t_timer\tlisten_timer;\n\tATOMIC_T\trx_probe_rsp; // 1:receive probe respone from RDS source.\n\tu8\t*l2sdTaBuffer;\n\tu8\tchannel_idx;\n\tu8\tgroup_cnt;\t//In WiDi 3.5, they specified another scan algo. for WFD/RDS co-existed\n\tu8\tsa_ext[L2SDTA_SERVICE_VE_LEN];\n\n\tu8\twidi_enable;\n\t/**\n\t * For WiDi 4; upper layer would set\n\t * p2p_primary_device_type_category_id\n\t * p2p_primary_device_type_sub_category_id\n\t * p2p_secondary_device_type_category_id\n\t * p2p_secondary_device_type_sub_category_id\n\t */\n\tu16\tp2p_pdt_cid;\n\tu16\tp2p_pdt_scid;\n\tu8\tnum_p2p_sdt;\n\tu16\tp2p_sdt_cid[MAX_NUM_P2P_SDT];\n\tu16\tp2p_sdt_scid[MAX_NUM_P2P_SDT];\n\tu8\tp2p_reject_disable;\t//When starting NL80211 wpa_supplicant/hostapd, it will call netdev_close\n\t\t\t\t\t\t\t//such that it will cause p2p disabled. Use this flag to reject.\n#endif // CONFIG_INTEL_WIDI\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tu8\tscanning_via_buddy_intf;\n#endif\n\n//\tu8 \tNumOfBcnInfoChkFail;\n//\tu32\ttimeBcnInfoChkStart;\n\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tu32 vendor_ie_mask[WLAN_MAX_VENDOR_IE_NUM];\n\tu8 vendor_ie[WLAN_MAX_VENDOR_IE_NUM][WLAN_MAX_VENDOR_IE_LEN];\n\tu32 vendor_ielen[WLAN_MAX_VENDOR_IE_NUM];\n#endif\n};\n\n#define mlme_set_scan_to_timer(mlme, ms) \\\n\tdo { \\\n\t\t/* DBG_871X(\"%s set_scan_to_timer(%p, %d)\\n\", __FUNCTION__, (mlme), (ms)); */ \\\n\t\t_set_timer(&(mlme)->scan_to_timer, (ms)); \\\n\t} while(0)\n\n#define rtw_mlme_set_auto_scan_int(adapter, ms) \\\n\tdo { \\\n\t\tadapter->mlmepriv.auto_scan_int_ms = ms; \\\n\t} while (0)\n\nvoid rtw_mlme_reset_auto_scan_int(_adapter *adapter);\n\n#ifdef CONFIG_AP_MODE\n\nstruct hostapd_priv\n{\n\t_adapter *padapter;\n\n#ifdef CONFIG_HOSTAPD_MLME\n\tstruct net_device *pmgnt_netdev;\n\tstruct usb_anchor anchored;\n#endif\t\n\t\n};\n\nextern int hostapd_mode_init(_adapter *padapter);\nextern void hostapd_mode_unload(_adapter *padapter);\n#endif\n\n\nextern void rtw_joinbss_event_prehandle(_adapter *adapter, u8 *pbuf);\nextern void rtw_survey_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);\nextern void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf);\n#ifdef CONFIG_IEEE80211W\nvoid rtw_sta_timeout_event_callback(_adapter *adapter, u8 *pbuf);\n#endif /* CONFIG_IEEE80211W */\nextern void rtw_join_timeout_handler(RTW_TIMER_HDL_ARGS);\nextern void _rtw_scan_timeout_handler(RTW_TIMER_HDL_ARGS);\n\nthread_return event_thread(thread_context context);\n\nextern void rtw_free_network_queue(_adapter *adapter,u8 isfreeall);\nextern int rtw_init_mlme_priv(_adapter *adapter);// (struct mlme_priv *pmlmepriv);\n\nextern void rtw_free_mlme_priv (struct mlme_priv *pmlmepriv);\n\n\nextern sint rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv);\nextern sint rtw_set_key(_adapter *adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue);\nextern sint rtw_set_auth(_adapter *adapter,struct security_priv *psecuritypriv);\n\n__inline static u8 *get_bssid(struct mlme_priv *pmlmepriv)\n{\t//if sta_mode:pmlmepriv->cur_network.network.MacAddress=> bssid\n\t// if adhoc_mode:pmlmepriv->cur_network.network.MacAddress=> ibss mac address\n\treturn pmlmepriv->cur_network.network.MacAddress;\n}\n\n__inline static sint check_fwstate(struct mlme_priv *pmlmepriv, sint state)\n{\n\tif (pmlmepriv->fw_state & state)\n\t\treturn _TRUE;\n\n\treturn _FALSE;\n}\n\n__inline static sint get_fwstate(struct mlme_priv *pmlmepriv)\n{\n\treturn pmlmepriv->fw_state;\n}\n\n/*\n * No Limit on the calling context,\n * therefore set it to be the critical section...\n *\n * ### NOTE:#### (!!!!)\n * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock\n */\n__inline static void set_fwstate(struct mlme_priv *pmlmepriv, sint state)\n{\n\tpmlmepriv->fw_state |= state;\n\t//FOR HW integration\n\tif(_FW_UNDER_SURVEY==state){\n\t\tpmlmepriv->bScanInProcess = _TRUE;\n\t}\n}\n\n__inline static void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state)\n{\n\tpmlmepriv->fw_state &= ~state;\n\t//FOR HW integration\n\tif(_FW_UNDER_SURVEY==state){\n\t\tpmlmepriv->bScanInProcess = _FALSE;\n\t}\n}\n\n/*\n * No Limit on the calling context,\n * therefore set it to be the critical section...\n */\n__inline static void clr_fwstate(struct mlme_priv *pmlmepriv, sint state)\n{\n\t_irqL irqL;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t_clr_fwstate_(pmlmepriv, state);\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\n\n__inline static void up_scanned_network(struct mlme_priv *pmlmepriv)\n{\n\t_irqL irqL;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tpmlmepriv->num_of_scanned++;\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\nsint rtw_buddy_adapter_up(_adapter *padapter);\nsint check_buddy_fwstate(_adapter *padapter, sint state);\nu8 rtw_get_buddy_bBusyTraffic(_adapter *padapter);\n#endif //CONFIG_CONCURRENT_MODE\n\n__inline static void down_scanned_network(struct mlme_priv *pmlmepriv)\n{\n\t_irqL irqL;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tpmlmepriv->num_of_scanned--;\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\n\n__inline static void set_scanned_network_val(struct mlme_priv *pmlmepriv, sint val)\n{\n\t_irqL irqL;\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tpmlmepriv->num_of_scanned = val;\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n}\n\nextern u16 rtw_get_capability(WLAN_BSSID_EX *bss);\nextern void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target);\nextern void rtw_disconnect_hdl_under_linked(_adapter* adapter, struct sta_info *psta, u8 free_assoc);\nextern void rtw_generate_random_ibss(u8 *pibss);\nextern struct wlan_network* rtw_find_network(_queue *scanned_queue, u8 *addr);\nextern struct wlan_network* rtw_get_oldest_wlan_network(_queue *scanned_queue);\nstruct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);\nstruct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network);\n\nextern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue);\nextern void rtw_indicate_disconnect(_adapter* adapter);\nextern void rtw_indicate_connect(_adapter* adapter);\nvoid rtw_indicate_scan_done( _adapter *padapter, bool aborted);\n\nvoid rtw_drv_scan_by_self(_adapter *padapter);\nvoid rtw_scan_wait_completed(_adapter *adapter);\nu32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms);\nvoid rtw_scan_abort_no_wait(_adapter *adapter);\nvoid rtw_scan_abort(_adapter *adapter);\n\nextern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len);\nextern int rtw_restruct_wmm_ie(_adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_len, uint initial_out_len);\nextern void rtw_init_registrypriv_dev_network(_adapter *adapter);\n\nextern void rtw_update_registrypriv_dev_network(_adapter *adapter);\n\nextern void rtw_get_encrypt_decrypt_from_registrypriv(_adapter *adapter);\n\nextern void _rtw_join_timeout_handler(_adapter *adapter);\nextern void rtw_scan_timeout_handler(_adapter *adapter);\n\nextern void rtw_dynamic_check_timer_handlder(_adapter *adapter);\n#ifdef CONFIG_SET_SCAN_DENY_TIMER\nbool rtw_is_scan_deny(_adapter *adapter);\nvoid rtw_clear_scan_deny(_adapter *adapter);\nvoid rtw_set_scan_deny_timer_hdl(_adapter *adapter);\nvoid rtw_set_scan_deny(_adapter *adapter, u32 ms);\n#else\n#define rtw_is_scan_deny(adapter) _FALSE\n#define rtw_clear_scan_deny(adapter) do {} while (0)\n#define rtw_set_scan_deny_timer_hdl(adapter) do {} while (0)\n#define rtw_set_scan_deny(adapter, ms) do {} while (0)\n#endif\n\n\nextern int _rtw_init_mlme_priv(_adapter *padapter);\n\nvoid rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv);\n\nextern void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv);\n\nextern int _rtw_enqueue_network(_queue *queue, struct wlan_network *pnetwork);\n\n//extern struct wlan_network* _rtw_dequeue_network(_queue *queue);\n\nextern struct wlan_network* _rtw_alloc_network(struct mlme_priv *pmlmepriv);\n\n\nextern void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall);\nextern void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork);\n\n\nextern struct wlan_network* _rtw_find_network(_queue *scanned_queue, u8 *addr);\n\nextern void _rtw_free_network_queue(_adapter* padapter, u8 isfreeall);\n\nextern sint rtw_if_up(_adapter *padapter);\n\nsint rtw_linked_check(_adapter *padapter);\n\nu8 *rtw_get_capability_from_ie(u8 *ie);\nu8 *rtw_get_timestampe_from_ie(u8 *ie);\nu8 *rtw_get_beacon_interval_from_ie(u8 *ie);\n\n\nvoid rtw_joinbss_reset(_adapter *padapter);\n\n#ifdef CONFIG_80211N_HT\nvoid\trtw_ht_use_default_setting(_adapter *padapter);\nvoid rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len);\nunsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel);\nvoid rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel);\nvoid rtw_issue_addbareq_cmd(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid rtw_append_exented_cap(_adapter *padapter, u8 *out_ie, uint *pout_len);\n#endif\n\nint rtw_is_same_ibss(_adapter *adapter, struct wlan_network *pnetwork);\nint is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature);\n\n#ifdef CONFIG_LAYER2_ROAMING\n#define rtw_roam_flags(adapter) ((adapter)->mlmepriv.roam_flags)\n#define rtw_chk_roam_flags(adapter, flags) ((adapter)->mlmepriv.roam_flags & flags)\n#define rtw_clr_roam_flags(adapter, flags) \\\n\tdo { \\\n\t\t((adapter)->mlmepriv.roam_flags &= ~flags); \\\n\t} while (0)\n\n#define rtw_set_roam_flags(adapter, flags) \\\n\tdo { \\\n\t\t((adapter)->mlmepriv.roam_flags |= flags); \\\n\t} while (0)\n\n#define rtw_assign_roam_flags(adapter, flags) \\\n\tdo { \\\n\t\t((adapter)->mlmepriv.roam_flags = flags); \\\n\t} while (0)\n\nvoid _rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);\nvoid rtw_roaming(_adapter *adapter, struct wlan_network *tgt_network);\nvoid rtw_set_to_roam(_adapter *adapter, u8 to_roam);\nu8 rtw_dec_to_roam(_adapter *adapter);\nu8 rtw_to_roam(_adapter *adapter);\nint rtw_select_roaming_candidate(struct mlme_priv *pmlmepriv);\n#else\n#define rtw_roam_flags(adapter) 0\n#define rtw_chk_roam_flags(adapter, flags) 0\n#define rtw_clr_roam_flags(adapter, flags) do {} while (0)\n#define rtw_set_roam_flags(adapter, flags) do {} while (0)\n#define rtw_assign_roam_flags(adapter, flags) do {} while (0)\n#define _rtw_roaming(adapter, tgt_network) do {} while(0)\n#define rtw_roaming(adapter, tgt_network) do {} while(0)\n#define rtw_set_to_roam(adapter, to_roam) do {} while(0)\n#define rtw_dec_to_roam(adapter) 0\n#define rtw_to_roam(adapter) 0\n#define rtw_select_roaming_candidate(mlme) _FAIL\n#endif /* CONFIG_LAYER2_ROAMING */\n\nbool rtw_adjust_chbw(_adapter *adapter, u8 req_ch, u8 *req_bw, u8 *req_offset);\n\nvoid rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus);\n\n#ifdef CONFIG_INTEL_PROXIM\nvoid rtw_proxim_enable(_adapter *padapter);\nvoid rtw_proxim_disable(_adapter *padapter);\nvoid rtw_proxim_send_packet(_adapter *padapter,u8 *pbuf,u16 len,u8 hw_rate);\n#endif //CONFIG_INTEL_PROXIM\n#endif //__RTL871X_MLME_H_\n\n"
  },
  {
    "path": "include/rtw_mlme_ext.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_MLME_EXT_H_\n#define __RTW_MLME_EXT_H_\n\n\n//\tCommented by Albert 20101105\n//\tIncrease the SURVEY_TO value from 100 to 150  ( 100ms to 150ms )\n//\tThe Realtek 8188CE SoftAP will spend around 100ms to send the probe response after receiving the probe request.\n//\tSo, this driver tried to extend the dwell time for each scanning channel.\n//\tThis will increase the chance to receive the probe response from SoftAP.\n\n#define SURVEY_TO\t\t(100)\n#define REAUTH_TO\t\t(300) //(50)\n#define REASSOC_TO\t\t(300) //(50)\n//#define DISCONNECT_TO\t(3000)\n#define ADDBA_TO\t\t\t(2000)\n\n#define LINKED_TO (1) //unit:2 sec, 1x2=2 sec\n\n#define REAUTH_LIMIT\t(4)\n#define REASSOC_LIMIT\t(4)\n#define READDBA_LIMIT\t(2)\n\n#ifdef CONFIG_GSPI_HCI\n\t#define ROAMING_LIMIT\t5\n#else\n\t#define ROAMING_LIMIT\t8\n#endif\n//#define\tIOCMD_REG0\t\t0x10250370\t\t \t\n//#define\tIOCMD_REG1\t\t0x10250374\n//#define\tIOCMD_REG2\t\t0x10250378\n\n//#define\tFW_DYNAMIC_FUN_SWITCH\t0x10250364\n\n//#define\tWRITE_BB_CMD\t\t0xF0000001\n//#define\tSET_CHANNEL_CMD\t0xF3000000\n//#define\tUPDATE_RA_CMD\t0xFD0000A2\n\n#define _HW_STATE_NOLINK_\t\t0x00\n#define _HW_STATE_ADHOC_\t\t0x01\n#define _HW_STATE_STATION_ \t0x02\n#define _HW_STATE_AP_\t\t\t0x03\n#define _HW_STATE_MONITOR_ 0x04\n\n\n#define\t\t_1M_RATE_\t0\n#define\t\t_2M_RATE_\t1\n#define\t\t_5M_RATE_\t2\n#define\t\t_11M_RATE_\t3\n#define\t\t_6M_RATE_\t4\n#define\t\t_9M_RATE_\t5\n#define\t\t_12M_RATE_\t6\n#define\t\t_18M_RATE_\t7\n#define\t\t_24M_RATE_\t8\n#define\t\t_36M_RATE_\t9\n#define\t\t_48M_RATE_\t10\n#define\t\t_54M_RATE_\t11\n\n/********************************************************\nMCS rate definitions\n*********************************************************/\n#define MCS_RATE_1R\t(0x000000ff)\n#define MCS_RATE_2R\t(0x0000ffff)\n#define MCS_RATE_3R\t(0x00ffffff)\n#define MCS_RATE_4R\t(0xffffffff)\n#define MCS_RATE_2R_13TO15_OFF\t(0x00001fff)\n\n\nextern unsigned char RTW_WPA_OUI[];\nextern unsigned char WMM_OUI[];\nextern unsigned char WPS_OUI[];\nextern unsigned char WFD_OUI[];\nextern unsigned char P2P_OUI[];\n\nextern unsigned char WMM_INFO_OUI[];\nextern unsigned char WMM_PARA_OUI[];\n\ntypedef enum _RT_CHANNEL_DOMAIN\n{\n\t/* ===== 0x00 ~ 0x1F, legacy channel plan ===== */\n\tRTW_CHPLAN_FCC = 0x00,\n\tRTW_CHPLAN_IC = 0x01,\n\tRTW_CHPLAN_ETSI = 0x02,\n\tRTW_CHPLAN_SPAIN = 0x03,\n\tRTW_CHPLAN_FRANCE = 0x04,\n\tRTW_CHPLAN_MKK = 0x05,\n\tRTW_CHPLAN_MKK1 = 0x06,\n\tRTW_CHPLAN_ISRAEL = 0x07,\n\tRTW_CHPLAN_TELEC = 0x08,\n\tRTW_CHPLAN_GLOBAL_DOAMIN = 0x09,\n\tRTW_CHPLAN_WORLD_WIDE_13 = 0x0A,\n\tRTW_CHPLAN_TAIWAN = 0x0B,\n\tRTW_CHPLAN_CHINA = 0x0C,\n\tRTW_CHPLAN_SINGAPORE_INDIA_MEXICO = 0x0D,\n\tRTW_CHPLAN_KOREA = 0x0E,\n\tRTW_CHPLAN_TURKEY = 0x0F,\n\tRTW_CHPLAN_JAPAN = 0x10,\n\tRTW_CHPLAN_FCC_NO_DFS = 0x11,\n\tRTW_CHPLAN_JAPAN_NO_DFS = 0x12,\n\tRTW_CHPLAN_WORLD_WIDE_5G = 0x13,\n\tRTW_CHPLAN_TAIWAN_NO_DFS = 0x14,\n\n\t/* ===== 0x20 ~ 0x7F, new channel plan ===== */\n\tRTW_CHPLAN_WORLD_NULL = 0x20,\n\tRTW_CHPLAN_ETSI1_NULL = 0x21,\n\tRTW_CHPLAN_FCC1_NULL = 0x22,\n\tRTW_CHPLAN_MKK1_NULL = 0x23,\n\tRTW_CHPLAN_ETSI2_NULL = 0x24,\n\tRTW_CHPLAN_FCC1_FCC1 = 0x25,\n\tRTW_CHPLAN_WORLD_ETSI1 = 0x26,\n\tRTW_CHPLAN_MKK1_MKK1 = 0x27,\n\tRTW_CHPLAN_WORLD_KCC1 = 0x28,\n\tRTW_CHPLAN_WORLD_FCC2 = 0x29,\n\tRTW_CHPLAN_FCC2_NULL = 0x2A,\n\tRTW_CHPLAN_WORLD_FCC3 = 0x30,\n\tRTW_CHPLAN_WORLD_FCC4 = 0x31,\n\tRTW_CHPLAN_WORLD_FCC5 = 0x32,\n\tRTW_CHPLAN_WORLD_FCC6 = 0x33,\n\tRTW_CHPLAN_FCC1_FCC7 = 0x34,\n\tRTW_CHPLAN_WORLD_ETSI2 = 0x35,\n\tRTW_CHPLAN_WORLD_ETSI3 = 0x36,\n\tRTW_CHPLAN_MKK1_MKK2 = 0x37,\n\tRTW_CHPLAN_MKK1_MKK3 = 0x38,\n\tRTW_CHPLAN_FCC1_NCC1 = 0x39,\n\tRTW_CHPLAN_FCC1_NCC2 = 0x40,\n\tRTW_CHPLAN_GLOBAL_NULL = 0x41,\n\tRTW_CHPLAN_ETSI1_ETSI4 = 0x42,\n\tRTW_CHPLAN_FCC1_FCC2 = 0x43,\n\tRTW_CHPLAN_FCC1_NCC3 = 0x44,\n\tRTW_CHPLAN_WORLD_ETSI5 = 0x45,\n\tRTW_CHPLAN_FCC1_FCC8 = 0x46,\n\tRTW_CHPLAN_WORLD_ETSI6 = 0x47,\n\tRTW_CHPLAN_WORLD_ETSI7 = 0x48,\n\tRTW_CHPLAN_WORLD_ETSI8 = 0x49,\n\tRTW_CHPLAN_WORLD_ETSI9 = 0x50,\n\tRTW_CHPLAN_WORLD_ETSI10 = 0x51,\n\tRTW_CHPLAN_WORLD_ETSI11 = 0x52,\n\tRTW_CHPLAN_FCC1_NCC4 = 0x53,\n\tRTW_CHPLAN_WORLD_ETSI12 = 0x54,\n\tRTW_CHPLAN_FCC1_FCC9 = 0x55,\n\tRTW_CHPLAN_WORLD_ETSI13 = 0x56,\n\tRTW_CHPLAN_FCC1_FCC10 = 0x57,\n\tRTW_CHPLAN_MKK2_MKK4 = 0x58,\n\tRTW_CHPLAN_WORLD_ETSI14 = 0x59,\n\tRTW_CHPLAN_FCC1_FCC5 = 0x60,\n\n\tRTW_CHPLAN_MAX,\n\tRTW_CHPLAN_REALTEK_DEFINE = 0x7F,\n}RT_CHANNEL_DOMAIN, *PRT_CHANNEL_DOMAIN;\n\ntypedef enum _RT_CHANNEL_DOMAIN_2G\n{\n\tRTW_RD_2G_NULL = 0,\n\tRTW_RD_2G_WORLD = 1,\t/* Worldwird 13 */\n\tRTW_RD_2G_ETSI1 = 2,\t/* Europe */\n\tRTW_RD_2G_FCC1 = 3,\t\t/* US */\n\tRTW_RD_2G_MKK1 = 4,\t\t/* Japan */\n\tRTW_RD_2G_ETSI2 = 5,\t/* France */\n\tRTW_RD_2G_GLOBAL = 6,\t/* Global domain */\n\tRTW_RD_2G_MKK2 = 7,\t\t/* Japan */\n\tRTW_RD_2G_FCC2 = 8,\t\t/* US */\n\n\tRTW_RD_2G_MAX,\n}RT_CHANNEL_DOMAIN_2G, *PRT_CHANNEL_DOMAIN_2G;\n\ntypedef enum _RT_CHANNEL_DOMAIN_5G\n{\n\tRTW_RD_5G_NULL = 0,\t\t/*\t*/\n\tRTW_RD_5G_ETSI1 = 1,\t/* Europe */\n\tRTW_RD_5G_ETSI2 = 2,\t/* Australia, New Zealand */\n\tRTW_RD_5G_ETSI3 = 3,\t/* Russia */\n\tRTW_RD_5G_FCC1 = 4,\t\t/* US */\n\tRTW_RD_5G_FCC2 = 5,\t\t/* FCC w/o DFS Channels */\n\tRTW_RD_5G_FCC3 = 6,\t\t/* Bolivia, Chile, El Salvador, Venezuela */\n\tRTW_RD_5G_FCC4 = 7,\t\t/* Venezuela */\n\tRTW_RD_5G_FCC5 = 8,\t\t/* China */\n\tRTW_RD_5G_FCC6 = 9,\t\t/*\t*/\n\tRTW_RD_5G_FCC7 = 10,\t/* US Canada(w/o Weather radar) */\n\tRTW_RD_5G_KCC1 = 11,\t/* Korea */\n\tRTW_RD_5G_MKK1 = 12,\t/* Japan */\n\tRTW_RD_5G_MKK2 = 13,\t/* Japan (W52, W53) */\n\tRTW_RD_5G_MKK3 = 14,\t/* Japan (W56) */\n\tRTW_RD_5G_NCC1 = 15,\t/* Taiwan, (w/o Weather radar) */\n\tRTW_RD_5G_NCC2 = 16,\t/* Taiwan, Band2, Band4 */\n\tRTW_RD_5G_NCC3 = 17,\t/* Taiwan w/o DFS, Band4 only */\n\tRTW_RD_5G_ETSI4 = 18,\t/* Europe w/o DFS, Band1 only */\n\tRTW_RD_5G_ETSI5 = 19,\t/* Australia, New Zealand(w/o Weather radar) */\n\tRTW_RD_5G_FCC8 = 20,\t/* Latin America */\n\tRTW_RD_5G_ETSI6 = 21,\t/* Israel, Bahrain, Egypt, India, China, Malaysia */\n\tRTW_RD_5G_ETSI7 = 22,\t/* China */\n\tRTW_RD_5G_ETSI8 = 23,\t/* Jordan */\n\tRTW_RD_5G_ETSI9 = 24,\t/* Lebanon */\n\tRTW_RD_5G_ETSI10 = 25,\t/* Qatar */\n\tRTW_RD_5G_ETSI11 = 26,\t/* Russia */\n\tRTW_RD_5G_NCC4 = 27,\t/* Taiwan, (w/o Weather radar) */\n\tRTW_RD_5G_ETSI12 = 28,\t/* Indonesia */\n\tRTW_RD_5G_FCC9 = 29,\t/* (w/o Weather radar) */\n\tRTW_RD_5G_ETSI13 = 30,\t/* (w/o Weather radar) */\n\tRTW_RD_5G_FCC10 = 31,\t/* Argentina(w/o Weather radar) */\n\tRTW_RD_5G_MKK4 = 32,\t/* Japan (W52) */\n\tRTW_RD_5G_ETSI14 = 33,\t/* Russia */\n\n\t/* === Below are driver defined for legacy channel plan compatible, DON'T assign index ==== */\n\tRTW_RD_5G_OLD_FCC1,\n\tRTW_RD_5G_OLD_NCC1,\n\tRTW_RD_5G_OLD_KCC1,\n\n\tRTW_RD_5G_MAX,\n}RT_CHANNEL_DOMAIN_5G, *PRT_CHANNEL_DOMAIN_5G;\n\n#define rtw_is_channel_plan_valid(chplan) ((chplan) < RTW_CHPLAN_MAX || (chplan) == RTW_CHPLAN_REALTEK_DEFINE)\n#define rtw_is_legacy_channel_plan(chplan) ((chplan) < 0x20)\nbool rtw_chplan_is_empty(u8 id);\n\ntypedef struct _RT_CHANNEL_PLAN\n{\n\tunsigned char\tChannel[MAX_CHANNEL_NUM];\n\tunsigned char\tLen;\n}RT_CHANNEL_PLAN, *PRT_CHANNEL_PLAN;\n\ntypedef struct _RT_CHANNEL_PLAN_2G\n{\n\tunsigned char\tChannel[MAX_CHANNEL_NUM_2G];\n\tunsigned char\tLen;\n}RT_CHANNEL_PLAN_2G, *PRT_CHANNEL_PLAN_2G;\n\ntypedef struct _RT_CHANNEL_PLAN_5G\n{\n\tunsigned char\tChannel[MAX_CHANNEL_NUM_5G];\n\tunsigned char\tLen;\n}RT_CHANNEL_PLAN_5G, *PRT_CHANNEL_PLAN_5G;\n\ntypedef struct _RT_CHANNEL_PLAN_MAP\n{\n\tu8 Index2G;\n\tu8 Index5G;\n\tu8 regd; /* value of REGULATION_TXPWR_LMT */\n}RT_CHANNEL_PLAN_MAP, *PRT_CHANNEL_PLAN_MAP;\n\nenum Associated_AP\n{\n\tatherosAP\t= 0,\n\tbroadcomAP\t= 1,\n\tciscoAP\t\t= 2,\n\tmarvellAP\t= 3,\n\tralinkAP\t= 4,\n\trealtekAP\t= 5,\n\tairgocapAP \t= 6,\n\tunknownAP\t= 7,\n\tmaxAP,\n};\n\ntypedef enum _HT_IOT_PEER\n{\n\tHT_IOT_PEER_UNKNOWN \t\t\t= 0,\n\tHT_IOT_PEER_REALTEK \t\t\t= 1,\n\tHT_IOT_PEER_REALTEK_92SE \t\t= 2,\n\tHT_IOT_PEER_BROADCOM \t\t= 3,\n\tHT_IOT_PEER_RALINK \t\t\t= 4,\n\tHT_IOT_PEER_ATHEROS \t\t\t= 5,\n\tHT_IOT_PEER_CISCO \t\t\t\t= 6,\n\tHT_IOT_PEER_MERU \t\t\t\t= 7,\t\n\tHT_IOT_PEER_MARVELL \t\t\t= 8,\n\tHT_IOT_PEER_REALTEK_SOFTAP \t= 9,// peer is RealTek SOFT_AP, by Bohn, 2009.12.17\n\tHT_IOT_PEER_SELF_SOFTAP \t\t= 10, // Self is SoftAP\n\tHT_IOT_PEER_AIRGO \t\t\t\t= 11,\n\tHT_IOT_PEER_INTEL \t\t\t\t= 12, \n\tHT_IOT_PEER_RTK_APCLIENT \t\t= 13, \n\tHT_IOT_PEER_REALTEK_81XX \t\t= 14,\t\n\tHT_IOT_PEER_REALTEK_WOW \t\t= 15,\n\tHT_IOT_PEER_REALTEK_JAGUAR_BCUTAP = 16,\n\tHT_IOT_PEER_REALTEK_JAGUAR_CCUTAP = 17,\n\tHT_IOT_PEER_MAX \t\t\t\t= 18\n}HT_IOT_PEER_E, *PHTIOT_PEER_E;\n\nstruct mlme_handler {\n\tunsigned int   num;\n\tchar* str;\n\tunsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);\n};\n\nstruct action_handler {\n\tunsigned int   num;\n\tchar* str;\n\tunsigned int (*func)(_adapter *padapter, union recv_frame *precv_frame);\n};\n\nenum SCAN_STATE\n{\n\tSCAN_DISABLE = 0,\n\tSCAN_START = 1,\n\tSCAN_PS_ANNC_WAIT = 2,\n\tSCAN_ENTER = 3,\n\tSCAN_PROCESS = 4,\n\n\t/* backop */\n\tSCAN_BACKING_OP = 5,\n\tSCAN_BACK_OP = 6,\n\tSCAN_LEAVING_OP = 7,\n\tSCAN_LEAVE_OP = 8,\n\n\t/* SW antenna diversity (before linked) */\n\tSCAN_SW_ANTDIV_BL = 9,\n\n\t/* legacy p2p */\n\tSCAN_TO_P2P_LISTEN = 10, \n\tSCAN_P2P_LISTEN = 11,\n\n\tSCAN_COMPLETE = 12,\n\tSCAN_STATE_MAX,\n};\n\nconst char *scan_state_str(u8 state);\n\nenum ss_backop_flag {\n\tSS_BACKOP_EN = BIT0, /* backop when linked */\n\tSS_BACKOP_EN_NL = BIT1, /* backop even when no linked */\n\n\tSS_BACKOP_PS_ANNC = BIT4,\n\tSS_BACKOP_TX_RESUME = BIT5,\n};\n\nstruct ss_res {\n\tu8 state;\n\tu8 next_state; /* will set to state on next cmd hdl */\n\tint\tbss_cnt;\n\tint\tchannel_idx;\n\tint\tscan_mode;\n\tu16 scan_ch_ms;\n\tu8 rx_ampdu_accept;\n\tu8 rx_ampdu_size;\n#ifdef CONFIG_SCAN_BACKOP\n\tu8 backop_flags_sta; /* policy for station mode*/\n\tu8 backop_flags_ap; /* policy for ap mode */\n\tu8 backop_flags; /* per backop runtime decision */\n\tu8 scan_cnt;\n\tu8 scan_cnt_max;\n\tu32 backop_time; /* the start time of backop */\n\tu16 backop_ms;\n#endif\n#if defined(CONFIG_ANTENNA_DIVERSITY) || defined(DBG_SCAN_SW_ANTDIV_BL)\n\tu8 is_sw_antdiv_bl_scan;\n#endif\n\tu8 ssid_num;\n\tu8 ch_num;\n\tNDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];\n\tstruct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];\n};\n\n//#define AP_MODE\t\t\t\t0x0C\n//#define STATION_MODE\t0x08\n//#define AD_HOC_MODE\t\t0x04\n//#define NO_LINK_MODE\t0x00\n\n#define \tWIFI_FW_NULL_STATE\t\t\t_HW_STATE_NOLINK_\n#define\tWIFI_FW_STATION_STATE\t\t_HW_STATE_STATION_\n#define\tWIFI_FW_AP_STATE\t\t\t\t_HW_STATE_AP_\n#define\tWIFI_FW_ADHOC_STATE\t\t\t_HW_STATE_ADHOC_\n\n#define\tWIFI_FW_AUTH_NULL\t\t\t0x00000100\n#define\tWIFI_FW_AUTH_STATE\t\t\t0x00000200\n#define\tWIFI_FW_AUTH_SUCCESS\t\t\t0x00000400\n\n#define\tWIFI_FW_ASSOC_STATE\t\t\t0x00002000\n#define\tWIFI_FW_ASSOC_SUCCESS\t\t0x00004000\n\n#define\tWIFI_FW_LINKING_STATE\t\t(WIFI_FW_AUTH_NULL | WIFI_FW_AUTH_STATE | WIFI_FW_AUTH_SUCCESS |WIFI_FW_ASSOC_STATE)\n\n#ifdef CONFIG_TDLS\nenum TDLS_option\n{\n\tTDLS_ESTABLISHED\t= \t1,\n\tTDLS_ISSUE_PTI\t\t\t\t=\t2,\n\tTDLS_CH_SW_RESP\t\t\t=\t3,\n\tTDLS_CH_SW\t\t\t\t=\t4,\n\tTDLS_CH_SW_BACK\t\t\t=\t5,\n\tTDLS_RS_RCR\t\t\t\t=\t6,\n\tTDLS_TEAR_STA\t\t\t\t=\t7,\n\tmaxTDLS,\n};\n\n#endif //CONFIG_TDLS\n\nstruct FW_Sta_Info\n{\n\tstruct sta_info\t*psta;\n\tu32\tstatus;\n\tu32\trx_pkt;\n\tu32\tretry;\n\tNDIS_802_11_RATES_EX  SupportedRates;\n};\n\n/*\n * Usage:\n * When one iface acted as AP mode and the other iface is STA mode and scanning, \n * it should switch back to AP's operating channel periodically.\n * Parameters info:\n * When the driver scanned RTW_SCAN_NUM_OF_CH channels, it would switch back to AP's operating channel for\n * RTW_BACK_OP_CH_MS milliseconds.\n * Example:\n * For chip supports 2.4G + 5GHz and AP mode is operating in channel 1, \n * RTW_SCAN_NUM_OF_CH is 8, RTW_BACK_OP_CH_MS is 300\n * When it's STA mode gets set_scan command, \n * it would \n * 1. Doing the scan on channel 1.2.3.4.5.6.7.8 \n * 2. Back to channel 1 for 300 milliseconds\n * 3. Go through doing site survey on channel 9.10.11.36.40.44.48.52\n * 4. Back to channel 1 for 300 milliseconds\n * 5. ... and so on, till survey done.\n */\n#if defined(CONFIG_ATMEL_RC_PATCH)\n#define RTW_SCAN_NUM_OF_CH 2\n#define RTW_BACK_OP_CH_MS 200\n#else\n#define RTW_SCAN_NUM_OF_CH 3\n#define RTW_BACK_OP_CH_MS 400\n#endif\n\nstruct mlme_ext_info\n{\n\tu32\tstate;\n\tu32\treauth_count;\n\tu32\treassoc_count;\n\tu32\tlink_count;\n\tu32\tauth_seq;\n\tu32\tauth_algo;\t// 802.11 auth, could be open, shared, auto\n\tu32\tauthModeToggle;\n\tu32\tenc_algo;//encrypt algorithm;\n\tu32\tkey_index;\t// this is only valid for legendary wep, 0~3 for key id.\n\tu32\tiv;\n\tu8\tchg_txt[128];\n\tu16\taid;\n\tu16\tbcn_interval;\n\tu16\tcapability;\n\tu8\tassoc_AP_vendor;\n\tu8\tslotTime;\n\tu8\tpreamble_mode;\n\tu8\tWMM_enable;\n\tu8\tERP_enable;\n\tu8\tERP_IE;\n\tu8\tHT_enable;\n\tu8\tHT_caps_enable;\t\n\tu8\tHT_info_enable;\n\tu8\tHT_protection;\n\tu8\tturboMode_cts2self;\n\tu8\tturboMode_rtsen;\n\tu8\tSM_PS;\n\tu8\tagg_enable_bitmap;\n\tu8\tADDBA_retry_count;\n\tu8\tcandidate_tid_bitmap;\n\tu8\tdialogToken;\n\t// Accept ADDBA Request\n\tBOOLEAN bAcceptAddbaReq;\n\tu8\tbwmode_updated;\n\tu8\thidden_ssid_mode;\n\tu8\tVHT_enable;\n\n\tstruct ADDBA_request\t\tADDBA_req;\n\tstruct WMM_para_element\tWMM_param;\n\tstruct HT_caps_element\tHT_caps;\n\tstruct HT_info_element\t\tHT_info;\n\tWLAN_BSSID_EX\t\t\tnetwork;//join network or bss_network, if in ap mode, it is the same to cur_network.network\n\tstruct FW_Sta_Info\t\tFW_sta_info[NUM_STA];\n};\n\n// The channel information about this channel including joining, scanning, and power constraints.\ntypedef struct _RT_CHANNEL_INFO\n{\n\tu8\t\t\t\tChannelNum;\t\t// The channel number.\n\tRT_SCAN_TYPE\tScanType;\t\t// Scan type such as passive or active scan.\n\t//u16\t\t\t\tScanPeriod;\t\t// Listen time in millisecond in this channel.\n\t//s32\t\t\t\tMaxTxPwrDbm;\t// Max allowed tx power.\n\t//u32\t\t\t\tExInfo;\t\t\t// Extended Information for this channel.\n#ifdef CONFIG_FIND_BEST_CHANNEL\n\tu32\t\t\t\trx_count;\n#endif\n#ifdef CONFIG_DFS_MASTER\n\tu32 non_ocp_end_time;\n#endif\n}RT_CHANNEL_INFO, *PRT_CHANNEL_INFO;\n\n#define DFS_MASTER_TIMER_MS 100\n#define CAC_TIME_MS (60*1000)\n#define CAC_TIME_CE_MS (10*60*1000)\n#define NON_OCP_TIME_MS (30*60*1000)\n\n#ifdef CONFIG_DFS_MASTER\nstruct rf_ctl_t;\n#define CH_IS_NON_OCP(rt_ch_info) ((rt_ch_info)->non_ocp_end_time > rtw_get_current_time())\nvoid rtw_rfctl_reset_cac(struct rf_ctl_t *rfctl);\nbool rtw_is_cac_reset_needed(_adapter *adapter);\nbool _rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl, u8 ch, u8 bw, u8 offset);\nbool rtw_rfctl_overlap_radar_detect_ch(struct rf_ctl_t *rfctl);\nbool rtw_rfctl_is_tx_blocked_by_cac(struct rf_ctl_t *rfctl);\nbool rtw_chset_is_ch_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset);\nvoid rtw_chset_update_non_ocp(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset);\nvoid rtw_chset_update_non_ocp_ms(RT_CHANNEL_INFO *ch_set, u8 ch, u8 bw, u8 offset, int ms);\n#else\n#define CH_IS_NON_OCP(rt_ch_info) 0\n#define rtw_chset_is_ch_non_ocp(ch_set, ch, bw, offset) _FALSE\n#define rtw_rfctl_is_tx_blocked_by_cac(rfctl) _FALSE\n#endif\n\nenum {\n\tRTW_CHF_2G = BIT0,\n\tRTW_CHF_5G = BIT1,\n\tRTW_CHF_DFS = BIT2,\n\tRTW_CHF_LONG_CAC = BIT3,\n\tRTW_CHF_NON_DFS = BIT4,\n\tRTW_CHF_NON_LONG_CAC = BIT5,\n};\nbool rtw_choose_available_chbw(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec_bw, u8 *dec_offset, u8 d_flags);\nvoid dump_chplan_id_list(void *sel);\nvoid dump_chplan_test(void *sel);\nvoid dump_chset(void *sel, RT_CHANNEL_INFO *ch_set);\nvoid dump_cur_chset(void *sel, _adapter *adapter);\n\nint rtw_ch_set_search_ch(RT_CHANNEL_INFO *ch_set, const u32 ch);\nbool rtw_mlme_band_check(_adapter *adapter, const u32 ch);\n\n// P2P_MAX_REG_CLASSES - Maximum number of regulatory classes\n#define P2P_MAX_REG_CLASSES 10\n\n// P2P_MAX_REG_CLASS_CHANNELS - Maximum number of channels per regulatory class\n#define P2P_MAX_REG_CLASS_CHANNELS 20\n\n//  struct p2p_channels - List of supported channels\nstruct p2p_channels {\n\t// struct p2p_reg_class - Supported regulatory class\n\tstruct p2p_reg_class {\n\t\t// reg_class - Regulatory class (IEEE 802.11-2007, Annex J)\n\t\tu8 reg_class;\n\n\t\t// channel - Supported channels\n\t\tu8 channel[P2P_MAX_REG_CLASS_CHANNELS];\n\n\t\t// channels - Number of channel entries in use\n\t\tsize_t channels;\n\t} reg_class[P2P_MAX_REG_CLASSES];\n\n\t// reg_classes - Number of reg_class entries in use\n\tsize_t reg_classes;\n};\n\nstruct p2p_oper_class_map {\n\tenum hw_mode {IEEE80211G,IEEE80211A} mode;\n\tu8 op_class;\n\tu8 min_chan;\n\tu8 max_chan;\n\tu8 inc;\n\tenum { BW20, BW40PLUS, BW40MINUS } bw;\n};\n\nstruct mlme_ext_priv\n{\n\t_adapter\t*padapter;\n\tu8\tmlmeext_init;\n\tATOMIC_T\t\tevent_seq;\n\tu16\tmgnt_seq;\n#ifdef CONFIG_IEEE80211W\n\tu16\tsa_query_seq;\n\tu64 mgnt_80211w_IPN;\n\tu64 mgnt_80211w_IPN_rx;\n#endif //CONFIG_IEEE80211W\n\t//struct fw_priv \tfwpriv;\n\t\n\tunsigned char\tcur_channel;\n\tunsigned char\tcur_bwmode;\n\tunsigned char\tcur_ch_offset;//PRIME_CHNL_OFFSET\n\tunsigned char\tcur_wireless_mode;\t// NETWORK_TYPE\n\t\n\tunsigned char\tmax_chan_nums;\n\tRT_CHANNEL_INFO\t\tchannel_set[MAX_CHANNEL_NUM];\n\tstruct p2p_channels channel_list;\n\tunsigned char\tbasicrate[NumRates];\n\tunsigned char\tdatarate[NumRates];\n#ifdef CONFIG_80211N_HT\n\tunsigned char default_supported_mcs_set[16];\n#endif\n\t\n\tstruct ss_res\t\tsitesurvey_res;\t\t\n\tstruct mlme_ext_info\tmlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info.\n                                                     //for ap mode, network includes ap's cap_info\n\t_timer\t\tsurvey_timer;\n\t_timer\t\tlink_timer;\n\n\t//_timer\t\tADDBA_timer;\n\tu32 last_scan_time;\n\tu8\tscan_abort;\n\tu8\ttx_rate; // TXRATE when USERATE is set.\n\n\tu32\tretry; //retry for issue probereq\n\t\n\tu64 TSFValue;\n\n\t//for LPS-32K to adaptive bcn early and timeout\n\tu8 adaptive_tsf_done;\n\tu32 bcn_delay_cnt[9];\n\tu32 bcn_delay_ratio[9];\n\tu32 bcn_cnt;\n\tu8 DrvBcnEarly;\n\tu8 DrvBcnTimeOut;\n\n#ifdef CONFIG_AP_MODE\t\n\tunsigned char bstart_bss;\n#endif\n\n#ifdef CONFIG_80211D\n\tu8 update_channel_plan_by_ap_done;\n#endif\n\t//recv_decache check for Action_public frame \n\tu8 action_public_dialog_token;\n\tu16 \t action_public_rxseq;\n\n//#ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK\n\tu8 active_keep_alive_check;\n//#endif\n#ifdef DBG_FIXED_CHAN\n\tu8 fixed_chan;\n#endif\n\t\n};\n\n#define mlmeext_msr(mlmeext) ((mlmeext)->mlmext_info.state & 0x03)\n#define mlmeext_scan_state(mlmeext) ((mlmeext)->sitesurvey_res.state)\n#define mlmeext_scan_state_str(mlmeext) scan_state_str((mlmeext)->sitesurvey_res.state)\n#define mlmeext_chk_scan_state(mlmeext, _state) ((mlmeext)->sitesurvey_res.state == (_state))\n#define mlmeext_set_scan_state(mlmeext, _state) \\\n\tdo { \\\n\t\t((mlmeext)->sitesurvey_res.state = (_state)); \\\n\t\t((mlmeext)->sitesurvey_res.next_state = (_state)); \\\n\t\t/* DBG_871X(\"set_scan_state:%s\\n\", scan_state_str(_state)); */ \\\n\t} while (0)\n\n#define mlmeext_scan_next_state(mlmeext) ((mlmeext)->sitesurvey_res.next_state)\n#define mlmeext_set_scan_next_state(mlmeext, _state) \\\n\tdo { \\\n\t\t((mlmeext)->sitesurvey_res.next_state = (_state)); \\\n\t\t/* DBG_871X(\"set_scan_next_state:%s\\n\", scan_state_str(_state)); */ \\\n\t} while (0)\n\n#ifdef CONFIG_SCAN_BACKOP\n#define mlmeext_scan_backop_flags(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags)\n#define mlmeext_chk_scan_backop_flags(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags & (flags))\n#define mlmeext_assign_scan_backop_flags(mlmeext, flags) \\\n\t\tdo { \\\n\t\t\t((mlmeext)->sitesurvey_res.backop_flags = (flags)); \\\n\t\t\tDBG_871X(\"assign_scan_backop_flags:0x%02x\\n\", (mlmeext)->sitesurvey_res.backop_flags); \\\n\t\t} while (0)\n\n#define mlmeext_scan_backop_flags_sta(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_sta)\n#define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_sta & (flags))\n#define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) \\\n\tdo { \\\n\t\t((mlmeext)->sitesurvey_res.backop_flags_sta = (flags)); \\\n\t} while (0)\n\n#define mlmeext_scan_backop_flags_ap(mlmeext) ((mlmeext)->sitesurvey_res.backop_flags_ap)\n#define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) ((mlmeext)->sitesurvey_res.backop_flags_ap & (flags))\n#define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) \\\n\tdo { \\\n\t\t((mlmeext)->sitesurvey_res.backop_flags_ap = (flags)); \\\n\t} while (0)\n#else\n#define mlmeext_scan_backop_flags(mlmeext) (0)\n#define mlmeext_chk_scan_backop_flags(mlmeext, flags) (0)\n#define mlmeext_assign_scan_backop_flags(mlmeext, flags) do {} while (0)\n\n#define mlmeext_scan_backop_flags_sta(mlmeext) (0)\n#define mlmeext_chk_scan_backop_flags_sta(mlmeext, flags) (0)\n#define mlmeext_assign_scan_backop_flags_sta(mlmeext, flags) do {} while (0)\n\n#define mlmeext_scan_backop_flags_ap(mlmeext) (0)\n#define mlmeext_chk_scan_backop_flags_ap(mlmeext, flags) (0)\n#define mlmeext_assign_scan_backop_flags_ap(mlmeext, flags) do {} while (0)\n#endif\n\nvoid init_mlme_default_rate_set(_adapter* padapter);\nint init_mlme_ext_priv(_adapter* padapter);\nint init_hw_mlme_ext(_adapter *padapter);\nvoid free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext);\nextern void init_mlme_ext_timer(_adapter *padapter);\nextern void init_addba_retry_timer(_adapter *padapter, struct sta_info *psta);\nextern struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv);\nstruct xmit_frame *alloc_mgtxmitframe_once(struct xmit_priv *pxmitpriv);\n\n//void fill_fwpriv(_adapter * padapter, struct fw_priv *pfwpriv);\n\nunsigned char networktype_to_raid(_adapter *adapter,struct sta_info *psta);\nunsigned char networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta);\n\nu8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);\nvoid get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);\nvoid set_mcs_rate_by_mask(u8 *mcs_set, u32 mask);\nvoid UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS);\nvoid UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);\nvoid change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 ch);\n\n//void Set_NETYPE1_MSR(_adapter *padapter, u8 type);\n//void Set_NETYPE0_MSR(_adapter *padapter, u8 type);\nvoid Set_MSR(_adapter *padapter, u8 type);\n\nu8 rtw_get_oper_ch(_adapter *adapter);\nvoid rtw_set_oper_ch(_adapter *adapter, u8 ch);\nu8 rtw_get_oper_bw(_adapter *adapter);\nvoid rtw_set_oper_bw(_adapter *adapter, u8 bw);\nu8 rtw_get_oper_choffset(_adapter *adapter);\nvoid rtw_set_oper_choffset(_adapter *adapter, u8 offset);\nu8\trtw_get_center_ch(u8 channel, u8 chnl_bw, u8 chnl_offset);\nu32 rtw_get_on_oper_ch_time(_adapter *adapter);\nu32 rtw_get_on_cur_ch_time(_adapter *adapter);\n\nu8 rtw_get_offset_by_ch(u8 channel);\n\nvoid set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char channel_offset, unsigned short bwmode);\nvoid SelectChannel(_adapter *padapter, unsigned char channel);\nvoid SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset);\n\nunsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);\n\nvoid _clear_cam_entry(_adapter *padapter, u8 entry);\nvoid write_cam_from_cache(_adapter *adapter, u8 id);\n\n/* modify both HW and cache */\nvoid write_cam(_adapter *padapter, u8 id, u16 ctrl, u8 *mac, u8 *key);\nvoid clear_cam_entry(_adapter *padapter, u8 id);\n\n/* modify cache only */\nvoid write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key);\nvoid clear_cam_cache(_adapter *adapter, u8 id);\n\nvoid invalidate_cam_all(_adapter *padapter);\nvoid CAM_empty_entry(PADAPTER Adapter, u8 ucIndex);\n\n\nint allocate_fw_sta_entry(_adapter *padapter);\nvoid flush_all_cam_entry(_adapter *padapter);\n\nBOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel);\n\nvoid site_survey(_adapter *padapter, u8 survey_channel, RT_SCAN_TYPE ScanType);\nu8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSID_EX *bssid);\nvoid update_network(WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src, _adapter * padapter, bool update_ie);\n\nint get_bsstype(unsigned short capability);\nu8* get_my_bssid(WLAN_BSSID_EX *pnetwork);\nu16 get_beacon_interval(WLAN_BSSID_EX *bss);\n\nint is_client_associated_to_ap(_adapter *padapter);\nint is_client_associated_to_ibss(_adapter *padapter);\nint is_IBSS_empty(_adapter *padapter);\n\nunsigned char check_assoc_AP(u8 *pframe, uint len);\n\nint WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs\tpIE);\n#ifdef CONFIG_WFD\nint WFD_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs\tpIE);\n#endif\nvoid WMMOnAssocRsp(_adapter *padapter);\n\nvoid HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\nvoid HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\nvoid HTOnAssocRsp(_adapter *padapter);\n\nvoid ERP_IE_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\nvoid VCS_update(_adapter *padapter, struct sta_info *psta);\nvoid\tupdate_ldpc_stbc_cap(struct sta_info *psta);\n\nint rtw_get_bcn_keys(ADAPTER *Adapter, u8 *pframe, u32 packet_len,\n\t\tstruct beacon_keys *recv_beacon);\nvoid rtw_dump_bcn_keys(struct beacon_keys *recv_beacon);\nint rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len);\nvoid update_beacon_info(_adapter *padapter, u8 *pframe, uint len, struct sta_info *psta);\n#ifdef CONFIG_DFS\nvoid process_csa_ie(_adapter *padapter, u8 *pframe, uint len);\n#endif //CONFIG_DFS\nvoid update_capinfo(PADAPTER Adapter, u16 updateCap);\nvoid update_wireless_mode(_adapter * padapter);\nvoid update_tx_basic_rate(_adapter *padapter, u8 modulation);\nvoid update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode);\nint update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx);\n\n//for sta/adhoc mode\nvoid update_sta_info(_adapter *padapter, struct sta_info *psta);\nunsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz);\nunsigned int update_supported_rate(unsigned char *ptn, unsigned int ptn_sz);\nunsigned int update_MCS_rate(struct HT_caps_element *pHT_caps);\nvoid Update_RA_Entry(_adapter *padapter, struct sta_info *psta);\nvoid set_sta_rate(_adapter *padapter, struct sta_info *psta);\n\nunsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason);\n\nunsigned char get_highest_rate_idx(u32 mask);\nint support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps, u8 bwmode);\nunsigned int is_ap_in_tkip(_adapter *padapter);\nunsigned int is_ap_in_wep(_adapter *padapter);\nunsigned int should_forbid_n_rate(_adapter * padapter);\n\ns16 rtw_get_camid(_adapter *adapter, struct sta_info* sta, s16 kid);\nbool _rtw_camctl_chk_cap(_adapter *adapter, u8 cap);\nvoid _rtw_camctl_set_flags(_adapter *adapter, u32 flags);\nvoid rtw_camctl_set_flags(_adapter *adapter, u32 flags);\nvoid _rtw_camctl_clr_flags(_adapter *adapter, u32 flags);\nvoid rtw_camctl_clr_flags(_adapter *adapter, u32 flags);\nbool _rtw_camctl_chk_flags(_adapter *adapter, u32 flags);\n\nstruct sec_cam_bmp;\nvoid dump_sec_cam_map(void *sel, struct sec_cam_bmp *map, u8 max_num);\nvoid rtw_sec_cam_map_clr_all(struct sec_cam_bmp *map);\n\nbool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id);\nbool rtw_camid_is_gk(_adapter *adapter, u8 cam_id);\ns16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid, s8 gk);\ns16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid, bool *used);\nvoid rtw_camid_free(_adapter *adapter, u8 cam_id);\n\nstruct macid_bmp;\nstruct macid_ctl_t;\nvoid dump_macid_map(void *sel, struct macid_bmp *map, u8 max_num);\nbool rtw_macid_is_set(struct macid_bmp *map, u8 id);\nbool rtw_macid_is_used(struct macid_ctl_t *macid_ctl, u8 id);\nbool rtw_macid_is_bmc(struct macid_ctl_t *macid_ctl, u8 id);\ns8 rtw_macid_get_if_g(struct macid_ctl_t *macid_ctl, u8 id);\ns8 rtw_macid_get_ch_g(struct macid_ctl_t *macid_ctl, u8 id);\nvoid rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);\nvoid rtw_release_macid(_adapter *padapter, struct sta_info *psta);\nu8 rtw_search_max_mac_id(_adapter *padapter);\nvoid rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl);\nvoid rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl);\n\nvoid report_join_res(_adapter *padapter, int res);\nvoid report_survey_event(_adapter *padapter, union recv_frame *precv_frame);\nvoid report_surveydone_event(_adapter *padapter);\nvoid report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue);\nvoid report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);\nbool rtw_port_switch_chk(_adapter *adapter);\nvoid report_wmm_edca_update(_adapter *padapter);\n\nvoid beacon_timing_control(_adapter *padapter);\nu8 chk_bmc_sleepq_cmd(_adapter* padapter);\nextern u8 set_tx_beacon_cmd(_adapter*padapter);\nunsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame);\nvoid update_mgnt_tx_rate(_adapter *padapter, u8 rate);\nvoid update_mgntframe_attrib(_adapter *padapter, struct pkt_attrib *pattrib);\nvoid update_mgntframe_attrib_addr(_adapter *padapter, struct xmit_frame *pmgntframe);\nvoid dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe);\ns32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms);\ns32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe);\n\n#ifdef CONFIG_P2P\nvoid issue_probersp_p2p(_adapter *padapter, unsigned char *da);\nvoid issue_p2p_provision_request( _adapter *padapter, u8* pssid, u8 ussidlen, u8* pdev_raddr);\nvoid issue_p2p_GO_request(_adapter *padapter, u8* raddr);\nvoid issue_probereq_p2p(_adapter *padapter, u8 *da);\nint issue_probereq_p2p_ex(_adapter *adapter, u8 *da, int try_cnt, int wait_ms);\nvoid issue_p2p_invitation_response(_adapter *padapter, u8* raddr, u8 dialogToken, u8 success);\nvoid issue_p2p_invitation_request(_adapter *padapter, u8* raddr );\n#endif //CONFIG_P2P\nvoid issue_beacon(_adapter *padapter, int timeout_ms);\nvoid issue_probersp(_adapter *padapter, unsigned char *da, u8 is_valid_p2p_probereq);\nvoid issue_assocreq(_adapter *padapter);\nvoid issue_asocrsp(_adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type);\nvoid issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status);\nvoid issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da);\ns32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, u8 ch, bool append_wps, int try_cnt, int wait_ms);\nint issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);\ns32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da, unsigned int power_mode);\nint issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms);\nint issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason);\nint issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms);\nvoid issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset);\nvoid issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid);\nvoid issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size);\nvoid issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator);\nint issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator, int try_cnt, int wait_ms);\n\n#ifdef CONFIG_IEEE80211W\nvoid issue_action_SA_Query(_adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short tid, u8 key_type);\nint issue_deauth_11w(_adapter *padapter, unsigned char *da, unsigned short reason, u8 key_type);\nextern void init_dot11w_expire_timer(_adapter *padapter, struct sta_info *psta);\n#endif //CONFIG_IEEE80211W\nint issue_action_SM_PS(_adapter *padapter ,  unsigned char *raddr , u8 NewMimoPsMode);\nint issue_action_SM_PS_wait_ack(_adapter *padapter, unsigned char *raddr, u8 NewMimoPsMode, int try_cnt, int wait_ms);\n\nunsigned int send_delba_sta_tid(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force);\nunsigned int send_delba_sta_tid_wait_ack(_adapter *adapter, u8 initiator, struct sta_info *sta, u8 tid, u8 force);\n\nunsigned int send_delba(_adapter *padapter, u8 initiator, u8 *addr);\nunsigned int send_beacon(_adapter *padapter);\n\nvoid start_clnt_assoc(_adapter *padapter);\nvoid start_clnt_auth(_adapter* padapter);\nvoid start_clnt_join(_adapter* padapter);\nvoid start_create_ibss(_adapter* padapter);\n\nunsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAssocRsp(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int DoReserved(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAtim(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAuth(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAuthClient(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction(_adapter *padapter, union recv_frame *precv_frame);\n\nunsigned int on_action_spct(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction_qos(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction_dls(_adapter *padapter, union recv_frame *precv_frame);\n\n#define RX_AMPDU_ACCEPT_INVALID 0xFF\n#define RX_AMPDU_SIZE_INVALID 0xFF\n\nenum rx_ampdu_reason {\n\tRX_AMPDU_DRV_FIXED = 1,\n\tRX_AMPDU_BTCOEX = 2, /* not used, because BTCOEX has its own variable management */\n\tRX_AMPDU_DRV_SCAN = 3,\n};\nu8 rtw_rx_ampdu_size(_adapter *adapter);\nbool rtw_rx_ampdu_is_accept(_adapter *adapter);\nbool rtw_rx_ampdu_set_size(_adapter *adapter, u8 size, u8 reason);\nbool rtw_rx_ampdu_set_accept(_adapter *adapter, u8 accept, u8 reason);\nu8 rx_ampdu_apply_sta_tid(_adapter *adapter, struct sta_info *sta, u8 tid, u8 accept, u8 size);\nu8 rx_ampdu_apply_sta(_adapter *adapter, struct sta_info *sta, u8 accept, u8 size);\nu16 rtw_rx_ampdu_apply(_adapter *adapter);\n\nunsigned int OnAction_back(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int on_action_public(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction_ht(_adapter *padapter, union recv_frame *precv_frame);\n#ifdef CONFIG_IEEE80211W\nunsigned int OnAction_sa_query(_adapter *padapter, union recv_frame *precv_frame);\n#endif //CONFIG_IEEE80211W\nunsigned int OnAction_wmm(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction_vht(_adapter *padapter, union recv_frame *precv_frame);\nunsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame);\n\n\nvoid mlmeext_joinbss_event_callback(_adapter *padapter, int join_res);\nvoid mlmeext_sta_del_event_callback(_adapter *padapter);\nvoid mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta);\n\nvoid linked_status_chk(_adapter *padapter, u8 from_timer);\n\nvoid _linked_info_dump(_adapter *padapter);\n\nvoid survey_timer_hdl (_adapter *padapter);\nvoid link_timer_hdl (_adapter *padapter);\nvoid addba_timer_hdl(struct sta_info *psta);\n#ifdef CONFIG_IEEE80211W\nvoid sa_query_timer_hdl(struct sta_info *psta);\n#endif //CONFIG_IEEE80211W\n//void reauth_timer_hdl(_adapter *padapter);\n//void reassoc_timer_hdl(_adapter *padapter);\n\n#define set_survey_timer(mlmeext, ms) \\\n\tdo { \\\n\t\t/*DBG_871X(\"%s set_survey_timer(%p, %d)\\n\", __FUNCTION__, (mlmeext), (ms));*/ \\\n\t\t_set_timer(&(mlmeext)->survey_timer, (ms)); \\\n\t} while(0)\n\n#define set_link_timer(mlmeext, ms) \\\n\tdo { \\\n\t\t/*DBG_871X(\"%s set_link_timer(%p, %d)\\n\", __FUNCTION__, (mlmeext), (ms));*/ \\\n\t\t_set_timer(&(mlmeext)->link_timer, (ms)); \\\n\t} while(0)\n\nextern int cckrates_included(unsigned char *rate, int ratelen);\nextern int cckratesonly_included(unsigned char *rate, int ratelen);\n\nextern void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr);\n\nextern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);\nextern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext);\nextern void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);\nextern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer);\n\n\n#ifdef CONFIG_CONCURRENT_MODE\nsint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state);\n#endif\n\nvoid rtw_join_done_chk_ch(_adapter *padapter, int join_res);\n\nint rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset);\nint rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset);\nint rtw_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset);\n\nvoid rtw_dev_iface_status(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num\n\t, u8 *ap_num, u8 *ld_ap_num);\nvoid rtw_dev_iface_status_no_self(_adapter *adapter, u8 *sta_num, u8 *ld_sta_num, u8 *lg_sta_num\n\t, u8 *ap_num, u8 *ld_ap_num);\n\nstruct cmd_hdl {\n\tuint\tparmsize;\n\tu8 (*h2cfuns)(struct _ADAPTER *padapter, u8 *pbuf);\t\n};\n\n\nu8 read_macreg_hdl(_adapter *padapter, u8 *pbuf);\nu8 write_macreg_hdl(_adapter *padapter, u8 *pbuf);\nu8 read_bbreg_hdl(_adapter *padapter, u8 *pbuf);\nu8 write_bbreg_hdl(_adapter *padapter, u8 *pbuf);\nu8 read_rfreg_hdl(_adapter *padapter, u8 *pbuf);\nu8 write_rfreg_hdl(_adapter *padapter, u8 *pbuf);\n\n\nu8 NULL_hdl(_adapter *padapter, u8 *pbuf);\nu8 join_cmd_hdl(_adapter *padapter, u8 *pbuf);\nu8 disconnect_hdl(_adapter *padapter, u8 *pbuf);\nu8 createbss_hdl(_adapter *padapter, u8 *pbuf);\nu8 setopmode_hdl(_adapter *padapter, u8 *pbuf);\nu8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf);\t\nu8 setauth_hdl(_adapter *padapter, u8 *pbuf);\nu8 setkey_hdl(_adapter *padapter, u8 *pbuf);\nu8 set_stakey_hdl(_adapter *padapter, u8 *pbuf);\nu8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf);\nu8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf);\nu8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf);\n\nu8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 set_ch_hdl(_adapter *padapter, u8 *pbuf);\nu8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 led_blink_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf);\t//Kurt: Handling DFS channel switch announcement ie.\nu8 tdls_hdl(_adapter *padapter, unsigned char *pbuf);\nu8 run_in_thread_hdl(_adapter *padapter, u8 *pbuf);\nu8 rtw_getmacreg_hdl(_adapter *padapter, u8 *pbuf);\n\n#define GEN_DRV_CMD_HANDLER(size, cmd)\t{size, &cmd ## _hdl},\n#define GEN_MLME_EXT_HANDLER(size, cmd)\t{size, cmd},\n\n#ifdef _RTW_CMD_C_\n\nstruct cmd_hdl wlancmds[] = \n{\n\tGEN_DRV_CMD_HANDLER(sizeof(struct readMAC_parm), rtw_getmacreg) /*0*/\n\tGEN_DRV_CMD_HANDLER(0, NULL)\n\tGEN_DRV_CMD_HANDLER(0, NULL)\n\tGEN_DRV_CMD_HANDLER(0, NULL)\n\tGEN_DRV_CMD_HANDLER(0, NULL)\n\tGEN_DRV_CMD_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL) /*10*/\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\t\t\n\tGEN_MLME_EXT_HANDLER(sizeof (struct joinbss_parm), join_cmd_hdl) /*14*/\n\tGEN_MLME_EXT_HANDLER(sizeof (struct disconnect_parm), disconnect_hdl)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct createbss_parm), createbss_hdl)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setopmode_parm), setopmode_hdl)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct sitesurvey_parm), sitesurvey_cmd_hdl) /*18*/\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setauth_parm), setauth_hdl)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setkey_parm), setkey_hdl) /*20*/\n\tGEN_MLME_EXT_HANDLER(sizeof (struct set_stakey_parm), set_stakey_hdl)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct set_assocsta_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct del_assocsta_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setstapwrstate_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setbasicrate_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct getbasicrate_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setdatarate_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct getdatarate_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setphyinfo_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct getphyinfo_parm), NULL)  /*30*/\n\tGEN_MLME_EXT_HANDLER(sizeof (struct setphy_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof (struct getphy_parm), NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\t/*40*/\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(sizeof(struct addBaReq_parm), add_ba_hdl)\t\n\tGEN_MLME_EXT_HANDLER(sizeof(struct set_ch_parm), set_ch_hdl) /* 46 */\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL) /*50*/\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL)\n\tGEN_MLME_EXT_HANDLER(0, NULL) \n\tGEN_MLME_EXT_HANDLER(sizeof(struct Tx_Beacon_param), tx_beacon_hdl) /*55*/\n\n\tGEN_MLME_EXT_HANDLER(0, mlme_evt_hdl) /*56*/\n\tGEN_MLME_EXT_HANDLER(0, rtw_drvextra_cmd_hdl) /*57*/\n\n\tGEN_MLME_EXT_HANDLER(0, h2c_msg_hdl) /*58*/\n\tGEN_MLME_EXT_HANDLER(sizeof(struct SetChannelPlan_param), set_chplan_hdl) /*59*/\n\tGEN_MLME_EXT_HANDLER(sizeof(struct LedBlink_param), led_blink_hdl) /*60*/\n\n\tGEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/\n\tGEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/\n\tGEN_MLME_EXT_HANDLER(0, chk_bmc_sleepq_hdl) /*63*/\n\tGEN_MLME_EXT_HANDLER(sizeof(struct RunInThread_param), run_in_thread_hdl) /*64*/\n};\n\n#endif\n\nstruct C2HEvent_Header\n{\n\n#ifdef CONFIG_LITTLE_ENDIAN\n\n\tunsigned int len:16;\n\tunsigned int ID:8;\n\tunsigned int seq:8;\n\t\n#elif defined(CONFIG_BIG_ENDIAN)\n\n\tunsigned int seq:8;\n\tunsigned int ID:8;\n\tunsigned int len:16;\n\t\n#else\n\n#  error \"Must be LITTLE or BIG Endian\"\n\n#endif\n\n\tunsigned int rsvd;\n\n};\n\nvoid rtw_dummy_event_callback(_adapter *adapter , u8 *pbuf);\nvoid rtw_fwdbg_event_callback(_adapter *adapter , u8 *pbuf);\n\nenum rtw_c2h_event\n{\n\tGEN_EVT_CODE(_Read_MACREG)=0, /*0*/\n\tGEN_EVT_CODE(_Read_BBREG),\n \tGEN_EVT_CODE(_Read_RFREG),\n \tGEN_EVT_CODE(_Read_EEPROM),\n \tGEN_EVT_CODE(_Read_EFUSE),\n\tGEN_EVT_CODE(_Read_CAM),\t\t\t/*5*/\n \tGEN_EVT_CODE(_Get_BasicRate),  \n \tGEN_EVT_CODE(_Get_DataRate),   \n \tGEN_EVT_CODE(_Survey),\t /*8*/\n \tGEN_EVT_CODE(_SurveyDone),\t /*9*/\n \t\n \tGEN_EVT_CODE(_JoinBss) , /*10*/\n \tGEN_EVT_CODE(_AddSTA),\n \tGEN_EVT_CODE(_DelSTA),\n \tGEN_EVT_CODE(_AtimDone) ,\n \tGEN_EVT_CODE(_TX_Report),  \n\tGEN_EVT_CODE(_CCX_Report),\t\t\t/*15*/\n \tGEN_EVT_CODE(_DTM_Report),\n \tGEN_EVT_CODE(_TX_Rate_Statistics),\n \tGEN_EVT_CODE(_C2HLBK), \n \tGEN_EVT_CODE(_FWDBG),\n\tGEN_EVT_CODE(_C2HFEEDBACK),               /*20*/\n\tGEN_EVT_CODE(_ADDBA),\n\tGEN_EVT_CODE(_C2HBCN),\n\tGEN_EVT_CODE(_ReportPwrState),\t\t//filen: only for PCIE, USB\t\n\tGEN_EVT_CODE(_CloseRF),\t\t\t\t//filen: only for PCIE, work around ASPM\n\tGEN_EVT_CODE(_WMM),\t\t\t\t\t/*25*/\n#ifdef CONFIG_IEEE80211W\n\tGEN_EVT_CODE(_TimeoutSTA),\n#endif /* CONFIG_IEEE80211W */\n \tMAX_C2HEVT\n};\n\n\n#ifdef _RTW_MLME_EXT_C_\t\t\n\nstatic struct fwevent wlanevents[] = \n{\n\t{0, rtw_dummy_event_callback}, \t/*0*/\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, &rtw_survey_event_callback},\t\t/*8*/\n\t{sizeof (struct surveydone_event), &rtw_surveydone_event_callback},\t/*9*/\n\t\t\n\t{0, &rtw_joinbss_event_callback},\t\t/*10*/\n\t{sizeof(struct stassoc_event), &rtw_stassoc_event_callback},\n\t{sizeof(struct stadel_event), &rtw_stadel_event_callback},\t\n\t{0, &rtw_atimdone_event_callback},\n\t{0, rtw_dummy_event_callback},\n\t{0, NULL},\t/*15*/\n\t{0, NULL},\n\t{0, NULL},\n\t{0, NULL},\n\t{0, rtw_fwdbg_event_callback},\n\t{0, NULL},\t /*20*/\n\t{0, NULL},\n\t{0, NULL},\n\t{0, &rtw_cpwm_event_callback},\n\t{0, NULL},\n\t{0, &rtw_wmm_event_callback}, /*25*/\n#ifdef CONFIG_IEEE80211W\n\t{sizeof(struct stadel_event), &rtw_sta_timeout_event_callback},\n#endif /* CONFIG_IEEE80211W */\n\n};\n\n#endif//_RTW_MLME_EXT_C_\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_mp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_MP_H_\n#define _RTW_MP_H_\n\n#define RTWPRIV_VER_INFO\t1\n\n#define MAX_MP_XMITBUF_SZ \t2048\n#define NR_MP_XMITFRAME\t\t8\n\nstruct mp_xmit_frame\n{\n\t_list\tlist;\n\n\tstruct pkt_attrib attrib;\n\n\t_pkt *pkt;\n\n\tint frame_tag;\n\n\t_adapter *padapter;\n\n#ifdef CONFIG_USB_HCI\n\n\t//insert urb, irp, and irpcnt info below...\n\t//max frag_cnt = 8\n\n\tu8 *mem_addr;\n\tu32 sz[8];\n\n#if defined(PLATFORM_OS_XP) || defined(PLATFORM_LINUX)\n\tPURB pxmit_urb[8];\n#endif\n\n#ifdef PLATFORM_OS_XP\n\tPIRP pxmit_irp[8];\n#endif\n\n\tu8 bpending[8];\n\tsint ac_tag[8];\n\tsint last[8];\n\tuint irpcnt;\n\tuint fragcnt;\n#endif /* CONFIG_USB_HCI */\n\n\tuint mem[(MAX_MP_XMITBUF_SZ >> 2)];\n};\n\nstruct mp_wiparam\n{\n\tu32 bcompleted;\n\tu32 act_type;\n\tu32 io_offset;\n\tu32 io_value;\n};\n\ntypedef void(*wi_act_func)(void* padapter);\n\n#ifdef PLATFORM_WINDOWS\nstruct mp_wi_cntx\n{\n\tu8 bmpdrv_unload;\n\n\t// Work Item\n\tNDIS_WORK_ITEM mp_wi;\n\tNDIS_EVENT mp_wi_evt;\n\t_lock mp_wi_lock;\n\tu8 bmp_wi_progress;\n\twi_act_func curractfunc;\n\t// Variable needed in each implementation of CurrActFunc.\n\tstruct mp_wiparam param;\n};\n#endif\n\nstruct mp_tx\n{\n\tu8 stop;\n\tu32 count, sended;\n\tu8 payload;\n\tstruct pkt_attrib attrib;\n\t//struct tx_desc desc;\n\t//u8 resvdtx[7];\n\tu8 desc[TXDESC_SIZE];\n\tu8 *pallocated_buf;\n\tu8 *buf;\n\tu32 buf_size, write_size;\n\t_thread_hdl_ PktTxThread;\n};\n\n#define MP_MAX_LINES\t\t1000\n#define MP_MAX_LINES_BYTES\t256\n#define u1Byte u8\n#define s1Byte s8\n#define u4Byte u32\n#define s4Byte s32\n#define u1Byte\t\tu8\n#define pu1Byte \t\tu8* \n\n#define u2Byte\t\tu16\n#define pu2Byte \t\tu16*\t\t\n\n#define u4Byte\t\tu32\n#define pu4Byte \t\tu32*\t\n\n#define u8Byte\t\tu64\n#define pu8Byte \t\tu64*\n\n#define s1Byte\t\ts8\n#define ps1Byte \t\ts8* \n\n#define s2Byte\t\ts16\n#define ps2Byte \t\ts16*\t\n\n#define s4Byte\t\ts32\n#define ps4Byte \t\ts32*\t\n\n#define s8Byte\t\ts64\n#define ps8Byte \t\ts64*\n\n#define UCHAR u8\n#define USHORT u16\n#define UINT u32\n#define ULONG u32\n#define PULONG u32*\n\ntypedef struct _RT_PMAC_PKT_INFO {\n\tUCHAR\t\t\tMCS;\n\tUCHAR\t\t\tNss;\n\tUCHAR\t\t\tNsts;\n\tUINT\t\t\tN_sym;\n\tUCHAR\t\t\tSIGA2B3;\n} RT_PMAC_PKT_INFO, *PRT_PMAC_PKT_INFO;\n\ntypedef struct _RT_PMAC_TX_INFO {\n\tu8\t\t\tbEnPMacTx:1;\t\t/* 0: Disable PMac 1: Enable PMac */\n\tu8\t\t\tMode:3;\t\t\t\t/* 0: Packet TX 3:Continuous TX */\n\tu8\t\t\tNtx:4;\t\t\t\t/* 0-7 */\n\tu8\t\t\tTX_RATE;\t\t\t/* MPT_RATE_E */\n\tu8\t\t\tTX_RATE_HEX;\n\tu8\t\t\tTX_SC;\n\tu8\t\t\tbSGI:1;\n\tu8\t\t\tbSPreamble:1;\n\tu8\t\t\tbSTBC:1;\n\tu8\t\t\tbLDPC:1;\n\tu8\t\t\tNDP_sound:1;\n\tu8\t\t\tBandWidth:3;\t\t/* 0: 20 1:40 2:80Mhz */\n\tu8\t\t\tm_STBC;\t\t\t/* bSTBC + 1 */\n\tu8\t\t\tPacketPeriod;\n\tUINT\t\tPacketCount;\n\tUINT\t\tPacketLength;\n\tu8\t\t\tPacketPattern;\n\tu32\t\t\tSFD;\n\tu8\t\t\tSignalField;\n\tu8\t\t\tServiceField;\n\tu8\t\t\tLENGTH;\n\tu8\t\t\tCRC16[2];\n\tu8\t\t\tLSIG[3];\n\tu8\t\t\tHT_SIG[6];\n\tu8\t\t\tVHT_SIG_A[6];\n\tu8\t\t\tVHT_SIG_B[4];\n\tu8\t\t\tVHT_SIG_B_CRC;\n\tu8\t\t\tVHT_Delimiter[4];\n\tu8\t\t\tMacAddress[6];\n} RT_PMAC_TX_INFO, *PRT_PMAC_TX_INFO;\n\n\ntypedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter);\ntypedef struct _MPT_CONTEXT\n{\n\t// Indicate if we have started Mass Production Test.\n\tBOOLEAN\t\t\tbMassProdTest;\n\n\t// Indicate if the driver is unloading or unloaded.\n\tBOOLEAN\t\t\tbMptDrvUnload;\n\n\t_sema\t\t\tMPh2c_Sema;\n\t_timer\t\t\tMPh2c_timeout_timer;\n// Event used to sync H2c for BT control\n\n\tBOOLEAN\t\tMptH2cRspEvent;\n\tBOOLEAN\t\tMptBtC2hEvent;\n\tBOOLEAN\t\tbMPh2c_timeout;\n\t\n\t/* 8190 PCI does not support NDIS_WORK_ITEM. */\n\t// Work Item for Mass Production Test.\n\t//NDIS_WORK_ITEM\tMptWorkItem;\n//\tRT_WORK_ITEM\t\tMptWorkItem;\n\t// Event used to sync the case unloading driver and MptWorkItem is still in progress.\n//\tNDIS_EVENT\t\tMptWorkItemEvent;\n\t// To protect the following variables.\n//\tNDIS_SPIN_LOCK\t\tMptWorkItemSpinLock;\n\t// Indicate a MptWorkItem is scheduled and not yet finished.\n\tBOOLEAN\t\t\tbMptWorkItemInProgress;\n\t// An instance which implements function and context of MptWorkItem.\n\tMPT_WORK_ITEM_HANDLER\tCurrMptAct;\n\n\t// 1=Start, 0=Stop from UI.\n\tULONG\t\t\tMptTestStart;\n\t// _TEST_MODE, defined in MPT_Req2.h\n\tULONG\t\t\tMptTestItem;\n\t// Variable needed in each implementation of CurrMptAct.\n\tULONG\t\t\tMptActType; \t// Type of action performed in CurrMptAct.\n\t// The Offset of IO operation is depend of MptActType.\n\tULONG\t\t\tMptIoOffset;\n\t// The Value of IO operation is depend of MptActType.\n\tULONG\t\t\tMptIoValue;\n\t// The RfPath of IO operation is depend of MptActType.\n\tULONG\t\t\tMptRfPath;\n\n\tWIRELESS_MODE\t\tMptWirelessModeToSw;\t// Wireless mode to switch.\n\tu8\t\t\tMptChannelToSw; \t// Channel to switch.\n\tu8\t\t\tMptInitGainToSet; \t// Initial gain to set.\n\t//ULONG\t\t\tbMptAntennaA; \t\t// TRUE if we want to use antenna A.\n\tULONG\t\t\tMptBandWidth;\t\t// bandwidth to switch.\n\tULONG\t\t\tMptRateIndex;\t\t// rate index.\n\t// Register value kept for Single Carrier Tx test.\n\tu8\t\t\tbtMpCckTxPower;\n\t// Register value kept for Single Carrier Tx test.\n\tu8\t\t\tbtMpOfdmTxPower;\n\t// For MP Tx Power index\n\tu8\t\t\tTxPwrLevel[4];\t/* rf-A, rf-B*/\n\tu32\t\t\tRegTxPwrLimit;\n\t// Content of RCR Regsiter for Mass Production Test.\n\tULONG\t\t\tMptRCR;\n\t// TRUE if we only receive packets with specific pattern.\n\tBOOLEAN\t\t\tbMptFilterPattern;\n \t// Rx OK count, statistics used in Mass Production Test.\n \tULONG\t\t\tMptRxOkCnt;\n \t// Rx CRC32 error count, statistics used in Mass Production Test.\n \tULONG\t\t\tMptRxCrcErrCnt;\n\n\tBOOLEAN\t\t\tbCckContTx;\t// TRUE if we are in CCK Continuous Tx test.\n \tBOOLEAN\t\t\tbOfdmContTx;\t// TRUE if we are in OFDM Continuous Tx test.\n\tBOOLEAN\t\t\tbStartContTx; \t// TRUE if we have start Continuous Tx test.\n\t// TRUE if we are in Single Carrier Tx test.\n\tBOOLEAN\t\t\tbSingleCarrier;\n\t// TRUE if we are in Carrier Suppression Tx Test.\n\tBOOLEAN\t\t\tbCarrierSuppression;\n\t//TRUE if we are in Single Tone Tx test.\n\tBOOLEAN\t\t\tbSingleTone;\n\n\t// ACK counter asked by K.Y..\n\tBOOLEAN\t\t\tbMptEnableAckCounter;\n\tULONG\t\t\tMptAckCounter;\n\n\t// SD3 Willis For 8192S to save 1T/2T RF table for ACUT\tOnly fro ACUT delete later ~~~!\n\t//s1Byte\t\tBufOfLines[2][MAX_LINES_HWCONFIG_TXT][MAX_BYTES_LINE_HWCONFIG_TXT];\n\t//s1Byte\t\t\tBufOfLines[2][MP_MAX_LINES][MP_MAX_LINES_BYTES];\n\t//s4Byte\t\t\tRfReadLine[2];\n\n\tu8\t\tAPK_bound[2];\t//for APK\tpath A/path B\n\tBOOLEAN\t\tbMptIndexEven;\n\n\tu8\t\tbackup0xc50;\n\tu8\t\tbackup0xc58;\n\tu8\t\tbackup0xc30;\n\tu8 \t\tbackup0x52_RF_A;\n\tu8 \t\tbackup0x52_RF_B;\n\t\n\tu4Byte\t\t\tbackup0x58_RF_A;\t\n\tu4Byte\t\t\tbackup0x58_RF_B;\n\t\n\tu1Byte\t\t\th2cReqNum;\n\tu1Byte\t\t\tc2hBuf[32];\n\n    u1Byte          btInBuf[100];\n\tULONG\t\t\tmptOutLen;\n    u1Byte          mptOutBuf[100];\n\tRT_PMAC_TX_INFO\tPMacTxInfo;\n\tRT_PMAC_PKT_INFO\tPMacPktInfo;\n\tu8 HWTxmode;\n\n\tBOOLEAN\t\t\tbldpc;\n\tBOOLEAN\t\t\tbstbc;\n}MPT_CONTEXT, *PMPT_CONTEXT;\n//#endif\n\n/* E-Fuse */\n#ifdef CONFIG_RTL8188E\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#ifdef CONFIG_RTL8192E\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#ifdef CONFIG_RTL8723B\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#ifdef CONFIG_RTL8814A\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#ifdef CONFIG_RTL8703B\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n#ifdef CONFIG_RTL8188F\n#define EFUSE_MAP_SIZE\t\t512\n#endif\n\n#if defined(CONFIG_RTL8814A)\n#define EFUSE_MAX_SIZE\t\t1024\n#elif defined(CONFIG_RTL8188E) || defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8703B)\n#define EFUSE_MAX_SIZE\t\t256\n#else\n#define EFUSE_MAX_SIZE\t\t512\n#endif\n/* end of E-Fuse */\n\n//#define RTPRIV_IOCTL_MP \t\t\t\t\t( SIOCIWFIRSTPRIV + 0x17)\nenum {\t  \n\tWRITE_REG = 1,\n\tREAD_REG,\n\tWRITE_RF,\n\tREAD_RF,\n\tMP_START,\n\tMP_STOP,\n\tMP_RATE,\n\tMP_CHANNEL,\n\tMP_BANDWIDTH,\n\tMP_TXPOWER,\n\tMP_ANT_TX,\n\tMP_ANT_RX,\n\tMP_CTX,\n\tMP_QUERY,\n\tMP_ARX,\n\tMP_PSD,\n\tMP_PWRTRK,\n\tMP_THER,\n\tMP_IOCTL,\n\tEFUSE_GET,\n\tEFUSE_SET,\n\tMP_RESET_STATS,\n\tMP_DUMP,\n\tMP_PHYPARA,\n\tMP_SetRFPathSwh,\n\tMP_QueryDrvStats,\n\tMP_SetBT,\n\tCTA_TEST,\n\tMP_DISABLE_BT_COEXIST,\n\tMP_PwrCtlDM,\n\tMP_GETVER,\n\tMP_MON,\n\tEFUSE_MASK,\n\tEFUSE_FILE,\n\tMP_TX,\n\tMP_RX,\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tVENDOR_IE_SET ,\n\tVENDOR_IE_GET ,\n#endif\n#ifdef CONFIG_WOWLAN\n\tMP_WOW_ENABLE,\n\tMP_WOW_SET_PATTERN,\n#endif\n#ifdef CONFIG_AP_WOWLAN\n\tMP_AP_WOW_ENABLE,\n#endif\n\tMP_NULL,\n\tMP_GET_TXPOWER_INX,\n\n\tMP_SD_IREAD,\n\tMP_SD_IWRITE,\n};\n\nstruct mp_priv\n{\n\t_adapter *papdater;\n\n\t//Testing Flag\n\tu32 mode;//0 for normal type packet, 1 for loopback packet (16bytes TXCMD)\n\n\tu32 prev_fw_state;\n\n\t//OID cmd handler\n\tstruct mp_wiparam workparam;\n//\tu8 act_in_progress;\n\n\t//Tx Section\n\tu8 TID;\n\tu32 tx_pktcount;\n\tu32 pktInterval;\n\tu32 pktLength;\n\tstruct mp_tx tx;\n\n\t//Rx Section\n\tu32 rx_bssidpktcount;\n\tu32 rx_pktcount;\n\tu32 rx_pktcount_filter_out;\n\tu32 rx_crcerrpktcount;\n\tu32 rx_pktloss;\n\tBOOLEAN  rx_bindicatePkt;\n\tstruct recv_stat rxstat;\n\n\t//RF/BB relative\n\tu8 channel;\n\tu8 bandwidth;\n\tu8 prime_channel_offset;\n\tu8 txpoweridx;\n\tu8 rateidx;\n\tu32 preamble;\n//\tu8 modem;\n\tu32 CrystalCap;\n//\tu32 curr_crystalcap;\n\n\tu16 antenna_tx;\n\tu16 antenna_rx;\n//\tu8 curr_rfpath;\n\t\n\tu8 check_mp_pkt;\n\n\tu8 bSetTxPower;\n//\tuint ForcedDataRate;\n\tu8 mp_dm;\n\tu8 mac_filter[ETH_ALEN];\n\tu8 bmac_filter;\n\t\n\tstruct wlan_network mp_network;\n\tNDIS_802_11_MAC_ADDRESS network_macaddr;\n\n#ifdef PLATFORM_WINDOWS\n\tu32 rx_testcnt;\n\tu32 rx_testcnt1;\n\tu32 rx_testcnt2;\n\tu32 tx_testcnt;\n\tu32 tx_testcnt1;\n\n\tstruct mp_wi_cntx wi_cntx;\n\n\tu8 h2c_result;\n\tu8 h2c_seqnum;\n\tu16 h2c_cmdcode;\n\tu8 h2c_resp_parambuf[512];\n\t_lock h2c_lock;\n\t_lock wkitm_lock;\n\tu32 h2c_cmdcnt;\n\tNDIS_EVENT h2c_cmd_evt;\n\tNDIS_EVENT c2h_set;\n\tNDIS_EVENT h2c_clr;\n\tNDIS_EVENT cpwm_int;\n\n\tNDIS_EVENT scsir_full_evt;\n\tNDIS_EVENT scsiw_empty_evt;\n#endif\n\n\tu8 *pallocated_mp_xmitframe_buf;\n\tu8 *pmp_xmtframe_buf;\n\t_queue free_mp_xmitqueue;\n\tu32 free_mp_xmitframe_cnt;\n\tBOOLEAN bSetRxBssid;\n\tBOOLEAN bTxBufCkFail;\n\tBOOLEAN bRTWSmbCfg;\n\tMPT_CONTEXT MptCtx;\n\n\tu8\t\t*TXradomBuffer;\n};\n\ntypedef struct _IOCMD_STRUCT_ {\n\tu8\tcmdclass;\n\tu16\tvalue;\n\tu8\tindex;\n}IOCMD_STRUCT;\n\nstruct rf_reg_param {\n\tu32 path;\n\tu32 offset;\n\tu32 value;\n};\n\nstruct bb_reg_param {\n\tu32 offset;\n\tu32 value;\n};\n\ntypedef struct _MP_FIRMWARE {\n\tFIRMWARE_SOURCE eFWSource;\n#ifdef CONFIG_EMBEDDED_FWIMG\n\tu8* \t\tszFwBuffer;\n#else\n\tu8\t\t\tszFwBuffer[0x8000];\n#endif\n\tu32 \t\tulFwLength;\n} RT_MP_FIRMWARE, *PRT_MP_FIRMWARE;\n\n\n\n\n//=======================================================================\n\n#define LOWER \t_TRUE\n#define RAISE\t_FALSE\n\n/* Hardware Registers */\n#if 0\n#if 0\n#define IOCMD_CTRL_REG\t\t\t0x102502C0\n#define IOCMD_DATA_REG\t\t\t0x102502C4\n#else\n#define IOCMD_CTRL_REG\t\t\t0x10250370\n#define IOCMD_DATA_REG\t\t\t0x10250374\n#endif\n\n#define IOCMD_GET_THERMAL_METER\t\t0xFD000028\n\n#define IOCMD_CLASS_BB_RF\t\t0xF0\n#define IOCMD_BB_READ_IDX\t\t0x00\n#define IOCMD_BB_WRITE_IDX\t\t0x01\n#define IOCMD_RF_READ_IDX\t\t0x02\n#define IOCMD_RF_WRIT_IDX\t\t0x03\n#endif\n#define BB_REG_BASE_ADDR\t\t0x800\n\n/* MP variables */\n#if 0\n#define _2MAC_MODE_\t0\n#define _LOOPBOOK_MODE_\t1\n#endif\ntypedef enum _MP_MODE_ {\n\tMP_OFF,\n\tMP_ON,\n\tMP_ERR,\n\tMP_CONTINUOUS_TX,\n\tMP_SINGLE_CARRIER_TX,\n\tMP_CARRIER_SUPPRISSION_TX,\n\tMP_SINGLE_TONE_TX,\n\tMP_PACKET_TX,\n\tMP_PACKET_RX\n} MP_MODE;\n\ntypedef enum _TEST_MODE {\n\tTEST_NONE                 ,\n\tPACKETS_TX                ,\n\tPACKETS_RX                ,\n\tCONTINUOUS_TX             ,\n\tOFDM_Single_Tone_TX       ,\n\tCCK_Carrier_Suppression_TX\n} TEST_MODE;\n\n\ntypedef enum _MPT_BANDWIDTH {\n\tMPT_BW_20MHZ = 0,\n\tMPT_BW_40MHZ_DUPLICATE = 1,\n\tMPT_BW_40MHZ_ABOVE = 2,\n\tMPT_BW_40MHZ_BELOW = 3,\n\tMPT_BW_40MHZ = 4,\n\tMPT_BW_80MHZ = 5,\n\tMPT_BW_80MHZ_20_ABOVE = 6,\n\tMPT_BW_80MHZ_20_BELOW = 7,\n\tMPT_BW_80MHZ_20_BOTTOM = 8,\n\tMPT_BW_80MHZ_20_TOP = 9,\n\tMPT_BW_80MHZ_40_ABOVE = 10,\n\tMPT_BW_80MHZ_40_BELOW = 11,\n} MPT_BANDWIDTHE, *PMPT_BANDWIDTH;\n\n#define MAX_RF_PATH_NUMS\tRF_PATH_MAX\n\n\nextern u8 mpdatarate[NumRates];\n\n/* MP set force data rate base on the definition. */\ntypedef enum _MPT_RATE_INDEX\n{\n\t/* CCK rate. */\n\tMPT_RATE_1M = 1 ,\t/* 0 */\n\tMPT_RATE_2M,\n\tMPT_RATE_55M,\n\tMPT_RATE_11M,\t/* 3 */\n\n\t/* OFDM rate. */\n\tMPT_RATE_6M,\t/* 4 */\n\tMPT_RATE_9M,\n\tMPT_RATE_12M,\n\tMPT_RATE_18M,\n\tMPT_RATE_24M,\n\tMPT_RATE_36M,\n\tMPT_RATE_48M,\n\tMPT_RATE_54M,\t/* 11 */\n\n\t/* HT rate. */\n\tMPT_RATE_MCS0,\t/* 12 */\n\tMPT_RATE_MCS1,\n\tMPT_RATE_MCS2,\n\tMPT_RATE_MCS3,\n\tMPT_RATE_MCS4,\n\tMPT_RATE_MCS5,\n\tMPT_RATE_MCS6,\n\tMPT_RATE_MCS7,\t/* 19 */\n\tMPT_RATE_MCS8,\n\tMPT_RATE_MCS9,\n\tMPT_RATE_MCS10,\n\tMPT_RATE_MCS11,\n\tMPT_RATE_MCS12,\n\tMPT_RATE_MCS13,\n\tMPT_RATE_MCS14,\n\tMPT_RATE_MCS15,\t/* 27 */\n\tMPT_RATE_MCS16,\n\tMPT_RATE_MCS17, // #29\n\tMPT_RATE_MCS18,\n\tMPT_RATE_MCS19,\n\tMPT_RATE_MCS20,\n\tMPT_RATE_MCS21,\n\tMPT_RATE_MCS22, // #34\n\tMPT_RATE_MCS23,\n\tMPT_RATE_MCS24,\n\tMPT_RATE_MCS25,\n\tMPT_RATE_MCS26,\n\tMPT_RATE_MCS27, // #39\n\tMPT_RATE_MCS28, // #40\n\tMPT_RATE_MCS29, // #41\n\tMPT_RATE_MCS30, // #42\n\tMPT_RATE_MCS31, // #43\n\t/* VHT rate. Total: 20*/\n\tMPT_RATE_VHT1SS_MCS0 = 100,/*  #44*/\n\tMPT_RATE_VHT1SS_MCS1, // #\n\tMPT_RATE_VHT1SS_MCS2,\n\tMPT_RATE_VHT1SS_MCS3,\n\tMPT_RATE_VHT1SS_MCS4,\n\tMPT_RATE_VHT1SS_MCS5,\n\tMPT_RATE_VHT1SS_MCS6, // #\n\tMPT_RATE_VHT1SS_MCS7,\n\tMPT_RATE_VHT1SS_MCS8,\n\tMPT_RATE_VHT1SS_MCS9, //#53\n\tMPT_RATE_VHT2SS_MCS0, //#54\n\tMPT_RATE_VHT2SS_MCS1, \n\tMPT_RATE_VHT2SS_MCS2,\n\tMPT_RATE_VHT2SS_MCS3,\n\tMPT_RATE_VHT2SS_MCS4,\n\tMPT_RATE_VHT2SS_MCS5,\n\tMPT_RATE_VHT2SS_MCS6,\n\tMPT_RATE_VHT2SS_MCS7,\n\tMPT_RATE_VHT2SS_MCS8,\n\tMPT_RATE_VHT2SS_MCS9, //#63\n\tMPT_RATE_VHT3SS_MCS0,\n\tMPT_RATE_VHT3SS_MCS1, \n\tMPT_RATE_VHT3SS_MCS2,\n\tMPT_RATE_VHT3SS_MCS3,\n\tMPT_RATE_VHT3SS_MCS4,\n\tMPT_RATE_VHT3SS_MCS5,\n\tMPT_RATE_VHT3SS_MCS6, // #126\n\tMPT_RATE_VHT3SS_MCS7,\n\tMPT_RATE_VHT3SS_MCS8,\n\tMPT_RATE_VHT3SS_MCS9,\n\tMPT_RATE_VHT4SS_MCS0,\n\tMPT_RATE_VHT4SS_MCS1, // #131\n\tMPT_RATE_VHT4SS_MCS2,\n\tMPT_RATE_VHT4SS_MCS3,\n\tMPT_RATE_VHT4SS_MCS4,\n\tMPT_RATE_VHT4SS_MCS5,\n\tMPT_RATE_VHT4SS_MCS6, // #136\n\tMPT_RATE_VHT4SS_MCS7,\n\tMPT_RATE_VHT4SS_MCS8,\n\tMPT_RATE_VHT4SS_MCS9,\n\tMPT_RATE_LAST\n}MPT_RATE_E, *PMPT_RATE_E;\n\n#define MAX_TX_PWR_INDEX_N_MODE 64\t// 0x3F\n\n#define MPT_IS_CCK_RATE(_value)\t\t(MPT_RATE_1M <= _value && _value <= MPT_RATE_11M)\n#define MPT_IS_OFDM_RATE(_value)\t(MPT_RATE_6M <= _value && _value <= MPT_RATE_54M)\n#define MPT_IS_HT_RATE(_value)\t\t(MPT_RATE_MCS0 <= _value && _value <= MPT_RATE_MCS31)\n#define MPT_IS_HT_1S_RATE(_value)\t(MPT_RATE_MCS0 <= _value && _value <= MPT_RATE_MCS7)\n#define MPT_IS_HT_2S_RATE(_value)\t(MPT_RATE_MCS8 <= _value && _value <= MPT_RATE_MCS15)\n#define MPT_IS_HT_3S_RATE(_value)\t(MPT_RATE_MCS16 <= _value && _value <= MPT_RATE_MCS23)\n#define MPT_IS_HT_4S_RATE(_value)\t(MPT_RATE_MCS24 <= _value && _value <= MPT_RATE_MCS31)\n\n#define MPT_IS_VHT_RATE(_value)\t\t(MPT_RATE_VHT1SS_MCS0 <= _value && _value <= MPT_RATE_VHT4SS_MCS9)\n#define MPT_IS_VHT_1S_RATE(_value)\t(MPT_RATE_VHT1SS_MCS0 <= _value && _value <= MPT_RATE_VHT1SS_MCS9)\n#define MPT_IS_VHT_2S_RATE(_value)\t(MPT_RATE_VHT2SS_MCS0 <= _value && _value <= MPT_RATE_VHT2SS_MCS9)\n#define MPT_IS_VHT_3S_RATE(_value)\t(MPT_RATE_VHT3SS_MCS0 <= _value && _value <= MPT_RATE_VHT3SS_MCS9)\n#define MPT_IS_VHT_4S_RATE(_value)\t(MPT_RATE_VHT4SS_MCS0 <= _value && _value <= MPT_RATE_VHT4SS_MCS9)\n\n#define MPT_IS_2SS_RATE(_rate) ((MPT_RATE_MCS8 <= _rate && _rate <= MPT_RATE_MCS15) ||\\\n\t\t\t\t\t\t\t(MPT_RATE_VHT2SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT2SS_MCS9))\n#define MPT_IS_3SS_RATE(_rate) ((MPT_RATE_MCS16 <= _rate && _rate <= MPT_RATE_MCS23) ||\\\n\t\t\t\t\t\t\t(MPT_RATE_VHT3SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT3SS_MCS9))\n#define MPT_IS_4SS_RATE(_rate) ((MPT_RATE_MCS24 <= _rate && _rate <= MPT_RATE_MCS31) ||\\\n\t\t\t\t\t\t\t(MPT_RATE_VHT4SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT4SS_MCS9))\n\ntypedef enum _POWER_MODE_ {\n\tPOWER_LOW = 0,\n\tPOWER_NORMAL\n}POWER_MODE;\n\n// The following enumeration is used to define the value of Reg0xD00[30:28] or JaguarReg0x914[18:16].\ntypedef enum _OFDM_TX_MODE {\n\tOFDM_ALL_OFF\t\t= 0,\t\n\tOFDM_ContinuousTx\t= 1,\n\tOFDM_SingleCarrier\t= 2,\n\tOFDM_SingleTone \t= 4,\n} OFDM_TX_MODE;\n\n\n#define RX_PKT_BROADCAST\t1\n#define RX_PKT_DEST_ADDR\t2\n#define RX_PKT_PHY_MATCH\t3\n\n#define Mac_OFDM_OK \t\t\t0x00000000\n#define Mac_OFDM_Fail\t\t\t0x10000000\n#define Mac_OFDM_FasleAlarm \t0x20000000\n#define Mac_CCK_OK\t\t\t\t0x30000000\n#define Mac_CCK_Fail\t\t\t0x40000000\n#define Mac_CCK_FasleAlarm\t\t0x50000000\n#define Mac_HT_OK\t\t\t\t0x60000000\n#define Mac_HT_Fail \t\t\t0x70000000\n#define Mac_HT_FasleAlarm\t\t0x90000000\n#define Mac_DropPacket\t\t\t0xA0000000\n\ntypedef enum _ENCRY_CTRL_STATE_ {\n\tHW_CONTROL,\t\t//hw encryption& decryption\n\tSW_CONTROL,\t\t//sw encryption& decryption\n\tHW_ENCRY_SW_DECRY,\t//hw encryption & sw decryption\n\tSW_ENCRY_HW_DECRY\t//sw encryption & hw decryption\n}ENCRY_CTRL_STATE;\n\ntypedef enum\t_MPT_TXPWR_DEF{\n\tMPT_CCK,\n\tMPT_OFDM, // L and HT OFDM\n\tMPT_OFDM_AND_HT,\n\tMPT_HT,\n\tMPT_VHT\n}MPT_TXPWR_DEF;\n\n#ifdef CONFIG_RF_GAIN_OFFSET\n\n#if defined(CONFIG_RTL8723B)\n\t#define \tREG_RF_BB_GAIN_OFFSET\t0x7f\n\t#define \tRF_GAIN_OFFSET_MASK \t0xfffff\n#elif defined(CONFIG_RTL8188E)\n\t#define \tREG_RF_BB_GAIN_OFFSET\t0x55\n\t#define \tRF_GAIN_OFFSET_MASK \t0xfffff\n#else\n\t#define \tREG_RF_BB_GAIN_OFFSET\t0x55\n\t#define \tRF_GAIN_OFFSET_MASK \t0xfffff\n#endif\t//CONFIG_RTL8723B\n\n#endif //CONFIG_RF_GAIN_OFFSET\n\n#define IS_MPT_HT_RATE(_rate)\t\t\t(_rate >= MPT_RATE_MCS0 && _rate <= MPT_RATE_MCS31)\n#define IS_MPT_VHT_RATE(_rate)\t\t\t(_rate >= MPT_RATE_VHT1SS_MCS0 && _rate <= MPT_RATE_VHT4SS_MCS9)\n#define IS_MPT_CCK_RATE(_rate)\t\t\t(_rate >= MPT_RATE_1M && _rate <= MPT_RATE_11M)\n#define IS_MPT_OFDM_RATE(_rate)\t\t\t(_rate >= MPT_RATE_6M && _rate <= MPT_RATE_54M)\n//=======================================================================\n//extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv);\n//extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe);\n\nextern s32 init_mp_priv(PADAPTER padapter);\nextern void free_mp_priv(struct mp_priv *pmp_priv);\nextern s32 MPT_InitializeAdapter(PADAPTER padapter, u8 Channel);\nextern void MPT_DeInitAdapter(PADAPTER padapter);\nextern s32 mp_start_test(PADAPTER padapter);\nextern void mp_stop_test(PADAPTER padapter);\n\nextern u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask);\nextern void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val);\n\nextern u32 read_macreg(_adapter *padapter, u32 addr, u32 sz);\nextern void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz);\nextern u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask);\nextern void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val);\nextern u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr);\nextern void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val);\n\nvoid\tSetChannel(PADAPTER pAdapter);\nvoid\tSetBandwidth(PADAPTER pAdapter);\nint\tSetTxPower(PADAPTER pAdapter);\nvoid\tSetAntenna(PADAPTER pAdapter);\nvoid\tSetDataRate(PADAPTER pAdapter);\nvoid\tSetAntenna(PADAPTER pAdapter);\ns32\tSetThermalMeter(PADAPTER pAdapter, u8 target_ther);\nvoid\tGetThermalMeter(PADAPTER pAdapter, u8 *value);\nvoid\tSetContinuousTx(PADAPTER pAdapter, u8 bStart);\nvoid\tSetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);\nvoid\tSetSingleToneTx(PADAPTER pAdapter, u8 bStart);\nvoid\tSetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);\nvoid\tPhySetTxPowerLevel(PADAPTER pAdapter);\nvoid\tfill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc);\nvoid\tSetPacketTx(PADAPTER padapter);\nvoid\tSetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB);\nvoid\tResetPhyRxPktCount(PADAPTER pAdapter);\nu32\tGetPhyRxPktReceived(PADAPTER pAdapter);\nu32\tGetPhyRxPktCRC32Error(PADAPTER pAdapter);\ns32\tSetPowerTracking(PADAPTER padapter, u8 enable);\nvoid\tGetPowerTracking(PADAPTER padapter, u8 *enable);\nu32\tmp_query_psd(PADAPTER pAdapter, u8 *data);\n\n\n\nvoid hal_mpt_SwitchRfSetting(PADAPTER pAdapter);\ns32 hal_mpt_SetPowerTracking(PADAPTER padapter, u8 enable);\nvoid hal_mpt_GetPowerTracking(PADAPTER padapter, u8 *enable);\nvoid hal_mpt_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14);\nvoid hal_mpt_SetChannel(PADAPTER pAdapter);\nvoid hal_mpt_SetBandwidth(PADAPTER pAdapter);\nvoid hal_mpt_SetTxPower(PADAPTER pAdapter);\nvoid hal_mpt_SetDataRate(PADAPTER pAdapter);\nvoid hal_mpt_SetAntenna(PADAPTER pAdapter);\ns32 hal_mpt_SetThermalMeter(PADAPTER pAdapter, u8 target_ther);\nvoid hal_mpt_TriggerRFThermalMeter(PADAPTER pAdapter);\nu8 hal_mpt_ReadRFThermalMeter(PADAPTER pAdapter);\nvoid hal_mpt_GetThermalMeter(PADAPTER pAdapter, u8 *value);\nvoid hal_mpt_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven);\nvoid hal_mpt_SetContinuousTx(PADAPTER pAdapter, u8 bStart);\nvoid hal_mpt_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart);\nvoid hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart);\nvoid hal_mpt_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart);\nvoid hal_mpt_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);\nvoid hal_mpt_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);\nVOID mpt_ProSetPMacTx(PADAPTER\tAdapter);\n\nvoid MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain);\nULONG mpt_ProQueryCalTxPower(PADAPTER\tpAdapter, u8 RfPath);\nvoid MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);\nu8 MptToMgntRate(u32\tMptRateIdx);\nu8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr);\nu32 mp_join(PADAPTER padapter, u8 mode);\nu32 hal_mpt_query_phytxok(PADAPTER\tpAdapter);\n\nvoid\nPMAC_Get_Pkt_Param(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t);\nvoid\nCCK_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t);\nvoid\nPMAC_Nsym_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t);\nvoid\nL_SIG_generator(\n\tUINT\tN_SYM,\t\t/* Max: 750*/\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo\n\t);\n\nvoid HT_SIG_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo);\n\nvoid VHT_SIG_A_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo,\n\tPRT_PMAC_PKT_INFO\tpPMacPktInfo);\n\nvoid VHT_SIG_B_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo);\n\nvoid VHT_Delimiter_generator(\n\tPRT_PMAC_TX_INFO\tpPMacTxInfo);\n\n\nint rtw_mp_write_reg(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_read_reg(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_write_rf(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_read_rf(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_start(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_stop(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_rate(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_channel(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_bandwidth(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_txpower_index(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_txpower(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_txpower(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_ant_tx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_ant_rx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_set_ctx_destAddr(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_ctx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_disable_bt_coexist(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_disable_bt_coexist(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_arx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_trx_query(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_pwrtrk(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_psd(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_thermal(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_reset_stats(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_dump(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_phypara(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_SetRFPath(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_QueryDrv(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_PwrCtlDM(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tstruct iw_point *wrqu, char *extra);\nint rtw_mp_getver(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_mon(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_efuse_mask_file(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_efuse_file_map(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_SetBT(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra);\nint rtw_mp_tx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nint rtw_mp_rx(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wrqu, char *extra);\nu8 HwRateToMPTRate(u8 rate);\n\n#endif //_RTW_MP_H_\n\n"
  },
  {
    "path": "include/rtw_mp_ioctl.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_MP_IOCTL_H_\n#define _RTW_MP_IOCTL_H_\n\n#include <mp_custom_oid.h>\n#include <rtw_mp.h>\n\n#if 0\n#define TESTFWCMDNUMBER\t\t\t1000000\n#define TEST_H2CINT_WAIT_TIME\t\t500\n#define TEST_C2HINT_WAIT_TIME\t\t500\n#define HCI_TEST_SYSCFG_HWMASK\t\t1\n#define _BUSCLK_40M\t\t\t(4 << 2)\n#endif\n//------------------------------------------------------------------------------\ntypedef struct CFG_DBG_MSG_STRUCT {\n\tu32 DebugLevel;\n\tu32 DebugComponent_H32;\n\tu32 DebugComponent_L32;\n}CFG_DBG_MSG_STRUCT,*PCFG_DBG_MSG_STRUCT;\n\ntypedef struct _RW_REG {\n\tu32 offset;\n\tu32 width;\n\tu32 value;\n}mp_rw_reg,RW_Reg, *pRW_Reg;\n\n//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM\ntypedef struct _EEPROM_RW_PARAM {\n\tu32 offset;\n\tu16 value;\n}eeprom_rw_param,EEPROM_RWParam, *pEEPROM_RWParam;\n\ntypedef struct _EFUSE_ACCESS_STRUCT_ {\n\tu16\tstart_addr;\n\tu16\tcnts;\n\tu8\tdata[0];\n}EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT;\n\ntypedef struct _BURST_RW_REG {\n\tu32 offset;\n\tu32 len;\n\tu8 Data[256];\n}burst_rw_reg,Burst_RW_Reg, *pBurst_RW_Reg;\n\ntypedef struct _USB_VendorReq{\n\tu8\tbRequest;\n\tu16\twValue;\n\tu16\twIndex;\n\tu16\twLength;\n\tu8\tu8Dir;//0:OUT, 1:IN\n\tu8\tu8InData;\n}usb_vendor_req, USB_VendorReq, *pUSB_VendorReq;\n\ntypedef struct _DR_VARIABLE_STRUCT_ {\n\tu8 offset;\n\tu32 variable;\n}DR_VARIABLE_STRUCT;\n\n//int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid);\n\n//void _irqlevel_changed_(_irqL *irqlevel, /*BOOLEAN*/unsigned char bLower);\n#ifdef PLATFORM_OS_XP\nstatic void _irqlevel_changed_(_irqL *irqlevel, u8 bLower)\n{\n\n\tif (bLower == LOWER) {\n\t\t*irqlevel = KeGetCurrentIrql();\n\n\t\tif (*irqlevel > PASSIVE_LEVEL) {\n\t\t\tKeLowerIrql(PASSIVE_LEVEL);\n\t\t}\n\t} else {\n\t\tif (KeGetCurrentIrql() == PASSIVE_LEVEL) {\n\t\t\tKeRaiseIrql(DISPATCH_LEVEL, irqlevel);\n\t\t}\n\t}\n\n}\n#else\n#define _irqlevel_changed_(a,b)\n#endif\n\n//oid_rtl_seg_81_80_00\nNDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv* poid_par_priv);\n//oid_rtl_seg_81_80_20\nNDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//oid_rtl_seg_81_87\nNDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//oid_rtl_seg_81_85\nNDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv* poid_par_priv);\n\n\n// oid_rtl_seg_87_11_00\nNDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_write16_eeprom_hdl (struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_wr_attrib_mem_hdl (struct oid_par_priv* poid_par_priv);\nNDIS_STATUS  oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv* poid_par_priv);\n// oid_rtl_seg_87_11_20\nNDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv* poid_par_priv);\n//oid_rtl_seg_87_11_50\nNDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv* poid_par_priv);\n//oid_rtl_seg_87_11_F0\nNDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv* poid_par_priv);\n\n\n//oid_rtl_seg_87_12_00\nNDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv);\nNDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv);\nNDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv);\nNDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv);\nNDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv);\nNDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv);\n\nNDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv* poid_par_priv);\nNDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv* poid_par_priv);\n\nNDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv);\n\n#ifdef _RTW_MP_IOCTL_C_\n\nconst struct oid_obj_priv oid_rtl_seg_81_80_00[] =\n{\n\t{1, &oid_null_function},\t\t\t//0x00\tOID_RT_PRO_RESET_DUT\n\t{1, &oid_rt_pro_set_data_rate_hdl},\t\t//0x01\n\t{1, &oid_rt_pro_start_test_hdl},\t\t//0x02\n\t{1, &oid_rt_pro_stop_test_hdl},\t\t\t//0x03\n\t{1, &oid_null_function},\t\t\t//0x04\tOID_RT_PRO_SET_PREAMBLE\n\t{1, &oid_null_function},\t\t\t//0x05\tOID_RT_PRO_SET_SCRAMBLER\n\t{1, &oid_null_function},\t\t\t//0x06\tOID_RT_PRO_SET_FILTER_BB\n\t{1, &oid_null_function},\t\t\t//0x07\tOID_RT_PRO_SET_MANUAL_DIVERSITY_BB\n\t{1, &oid_rt_pro_set_channel_direct_call_hdl},\t//0x08\n\t{1, &oid_null_function},\t\t\t//0x09\tOID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL\n\t{1, &oid_null_function},\t\t\t//0x0A\tOID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL\n\t{1, &oid_rt_pro_set_continuous_tx_hdl},\t\t//0x0B\tOID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL\n\t{1, &oid_rt_pro_set_single_carrier_tx_hdl},\t//0x0C\tOID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS\n\t{1, &oid_null_function},\t\t\t//0x0D\tOID_RT_PRO_SET_TX_ANTENNA_BB\n\t{1, &oid_rt_pro_set_antenna_bb_hdl},\t\t//0x0E\n\t{1, &oid_null_function},\t\t\t//0x0F\tOID_RT_PRO_SET_CR_SCRAMBLER\n\t{1, &oid_null_function},\t\t\t//0x10\tOID_RT_PRO_SET_CR_NEW_FILTER\n\t{1, &oid_rt_pro_set_tx_power_control_hdl},\t//0x11\tOID_RT_PRO_SET_TX_POWER_CONTROL\n\t{1, &oid_null_function},\t\t\t//0x12\tOID_RT_PRO_SET_CR_TX_CONFIG\n\t{1, &oid_null_function},\t\t\t//0x13\tOID_RT_PRO_GET_TX_POWER_CONTROL\n\t{1, &oid_null_function},\t\t\t//0x14\tOID_RT_PRO_GET_CR_SIGNAL_QUALITY\n\t{1, &oid_null_function},\t\t\t//0x15\tOID_RT_PRO_SET_CR_SETPOINT\n\t{1, &oid_null_function},\t\t\t//0x16\tOID_RT_PRO_SET_INTEGRATOR\n\t{1, &oid_null_function},\t\t\t//0x17\tOID_RT_PRO_SET_SIGNAL_QUALITY\n\t{1, &oid_null_function},\t\t\t//0x18\tOID_RT_PRO_GET_INTEGRATOR\n\t{1, &oid_null_function},\t\t\t//0x19\tOID_RT_PRO_GET_SIGNAL_QUALITY\n\t{1, &oid_null_function},\t\t\t//0x1A\tOID_RT_PRO_QUERY_EEPROM_TYPE\n\t{1, &oid_null_function},\t\t\t//0x1B\tOID_RT_PRO_WRITE_MAC_ADDRESS\n\t{1, &oid_null_function},\t\t\t//0x1C\tOID_RT_PRO_READ_MAC_ADDRESS\n\t{1, &oid_null_function},\t\t\t//0x1D\tOID_RT_PRO_WRITE_CIS_DATA\n\t{1, &oid_null_function},\t\t\t//0x1E\tOID_RT_PRO_READ_CIS_DATA\n\t{1, &oid_null_function}\t\t\t\t//0x1F\tOID_RT_PRO_WRITE_POWER_CONTROL\n\n};\n\nconst struct oid_obj_priv oid_rtl_seg_81_80_20[] =\n{\n\t{1, &oid_null_function},\t\t\t//0x20\tOID_RT_PRO_READ_POWER_CONTROL\n\t{1, &oid_null_function},\t\t\t//0x21\tOID_RT_PRO_WRITE_EEPROM\n\t{1, &oid_null_function},\t\t\t//0x22\tOID_RT_PRO_READ_EEPROM\n\t{1, &oid_rt_pro_reset_tx_packet_sent_hdl},\t//0x23\n\t{1, &oid_rt_pro_query_tx_packet_sent_hdl},\t//0x24\n\t{1, &oid_rt_pro_reset_rx_packet_received_hdl},\t//0x25\n\t{1, &oid_rt_pro_query_rx_packet_received_hdl},\t//0x26\n\t{1, &oid_rt_pro_query_rx_packet_crc32_error_hdl},\t//0x27\n\t{1, &oid_null_function},\t\t\t//0x28\tOID_RT_PRO_QUERY_CURRENT_ADDRESS\n\t{1, &oid_null_function},\t\t\t//0x29\tOID_RT_PRO_QUERY_PERMANENT_ADDRESS\n\t{1, &oid_null_function},\t\t\t//0x2A\tOID_RT_PRO_SET_PHILIPS_RF_PARAMETERS\n\t{1, &oid_rt_pro_set_carrier_suppression_tx_hdl},//0x2B\tOID_RT_PRO_SET_CARRIER_SUPPRESSION_TX\n\t{1, &oid_null_function},\t\t\t//0x2C\tOID_RT_PRO_RECEIVE_PACKET\n\t{1, &oid_null_function},\t\t\t//0x2D\tOID_RT_PRO_WRITE_EEPROM_BYTE\n\t{1, &oid_null_function},\t\t\t//0x2E\tOID_RT_PRO_READ_EEPROM_BYTE\n\t{1, &oid_rt_pro_set_modulation_hdl}\t\t//0x2F\n\n};\n\nconst struct oid_obj_priv oid_rtl_seg_81_80_40[] =\n{\n\t{1, &oid_null_function},\t\t\t//0x40\n\t{1, &oid_null_function},\t\t\t//0x41\n\t{1, &oid_null_function},\t\t\t//0x42\n\t{1, &oid_rt_pro_set_single_tone_tx_hdl},\t//0x43\n\t{1, &oid_null_function},\t\t\t//0x44\n\t{1, &oid_null_function}\t\t\t\t//0x45\n};\n\nconst struct oid_obj_priv oid_rtl_seg_81_80_80[] =\n{\n\t{1, &oid_null_function},\t\t\t//0x80\tOID_RT_DRIVER_OPTION\n\t{1, &oid_null_function},\t\t\t//0x81\tOID_RT_RF_OFF\n\t{1, &oid_null_function}\t\t\t\t//0x82\tOID_RT_AUTH_STATUS\n\n};\n\nconst struct oid_obj_priv oid_rtl_seg_81_85[] =\n{\n\t{1, &oid_rt_wireless_mode_hdl}\t\t\t//0x00\tOID_RT_WIRELESS_MODE\n};\n\nstruct oid_obj_priv oid_rtl_seg_81_87[] =\n{\n\t{1, &oid_null_function},\t\t\t//0x80\tOID_RT_PRO8187_WI_POLL\n\t{1, &oid_rt_pro_write_bb_reg_hdl},\t\t//0x81\n\t{1, &oid_rt_pro_read_bb_reg_hdl},\t\t//0x82\n\t{1, &oid_rt_pro_write_rf_reg_hdl},\t\t//0x82\n\t{1, &oid_rt_pro_read_rf_reg_hdl}\t\t//0x83\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_11_00[] =\n{\n\t{1, &oid_rt_pro8711_join_bss_hdl},\t\t//0x00  //S\n\t{1, &oid_rt_pro_read_register_hdl},\t\t//0x01\n\t{1, &oid_rt_pro_write_register_hdl},\t\t//0x02\n\t{1, &oid_rt_pro_burst_read_register_hdl},\t//0x03\n\t{1, &oid_rt_pro_burst_write_register_hdl},\t//0x04\n\t{1, &oid_rt_pro_write_txcmd_hdl},\t\t//0x05\n\t{1, &oid_rt_pro_read16_eeprom_hdl},\t\t//0x06\n\t{1, &oid_rt_pro_write16_eeprom_hdl},\t\t//0x07\n\t{1, &oid_null_function},\t\t\t//0x08\tOID_RT_PRO_H2C_SET_COMMAND\n\t{1, &oid_null_function},\t\t\t//0x09\tOID_RT_PRO_H2C_QUERY_RESULT\n\t{1, &oid_rt_pro8711_wi_poll_hdl},\t\t//0x0A\n\t{1, &oid_rt_pro8711_pkt_loss_hdl},\t\t//0x0B\n\t{1, &oid_rt_rd_attrib_mem_hdl},\t\t\t//0x0C\n\t{1, &oid_rt_wr_attrib_mem_hdl},\t\t\t//0x0D\n\t{1, &oid_null_function},\t\t\t//0x0E\n\t{1, &oid_null_function},\t\t\t//0x0F\n\t{1, &oid_null_function},\t\t\t//0x10\tOID_RT_PRO_H2C_CMD_MODE\n\t{1, &oid_null_function},\t\t\t//0x11\tOID_RT_PRO_H2C_CMD_RSP_MODE\n\t{1, &oid_null_function},\t\t\t//0X12\tOID_RT_PRO_WAIT_C2H_EVENT\n\t{1, &oid_null_function},\t\t\t//0X13\tOID_RT_PRO_RW_ACCESS_PROTOCOL_TEST\n\t{1, &oid_null_function},\t\t\t//0X14\tOID_RT_PRO_SCSI_ACCESS_TEST\n\t{1, &oid_null_function},\t\t\t//0X15\tOID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT\n\t{1, &oid_null_function},\t\t\t//0X16\tOID_RT_PRO_SCSI_TCPIPOFFLOAD_IN\n\t{1, &oid_null_function},\t\t\t//0X17\tOID_RT_RRO_RX_PKT_VIA_IOCTRL\n\t{1, &oid_null_function},\t\t\t//0X18\tOID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL\n\t{1, &oid_null_function},\t\t\t//0X19\tOID_RT_RPO_SET_PWRMGT_TEST\n\t{1, &oid_null_function},\t\t\t//0X1A\n\t{1, &oid_null_function},\t\t\t//0X1B\tOID_RT_PRO_QRY_PWRMGT_TEST\n\t{1, &oid_null_function},\t\t\t//0X1C\tOID_RT_RPO_ASYNC_RWIO_TEST\n\t{1, &oid_null_function},\t\t\t//0X1D\tOID_RT_RPO_ASYNC_RWIO_POLL\n\t{1, &oid_rt_pro_set_rf_intfs_hdl},\t\t//0X1E\n\t{1, &oid_rt_poll_rx_status_hdl}\t\t\t//0X1F\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_11_20[] =\n{\n\t{1, &oid_rt_pro_cfg_debug_message_hdl},\t\t//0x20\n\t{1, &oid_rt_pro_set_data_rate_ex_hdl},\t\t//0x21\n\t{1, &oid_rt_pro_set_basic_rate_hdl},\t\t//0x22\n\t{1, &oid_rt_pro_read_tssi_hdl},\t\t\t//0x23\n\t{1, &oid_rt_pro_set_power_tracking_hdl}\t\t//0x24\n};\n\n\nstruct oid_obj_priv oid_rtl_seg_87_11_50[] =\n{\n\t{1, &oid_rt_pro_qry_pwrstate_hdl},\t\t//0x50\n\t{1, &oid_rt_pro_set_pwrstate_hdl}\t\t//0x51\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_11_80[] =\n{\n\t{1, &oid_null_function}\t\t\t\t//0x80\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_11_B0[] =\n{\n\t{1, &oid_null_function}\t\t\t\t//0xB0\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_11_F0[] =\n{\n\t{1, &oid_null_function},\t\t\t//0xF0\n\t{1, &oid_null_function},\t\t\t//0xF1\n\t{1, &oid_null_function},\t\t\t//0xF2\n\t{1, &oid_null_function},\t\t\t//0xF3\n\t{1, &oid_null_function},\t\t\t//0xF4\n\t{1, &oid_null_function},\t\t\t//0xF5\n\t{1, &oid_null_function},\t\t\t//0xF6\n\t{1, &oid_null_function},\t\t\t//0xF7\n\t{1, &oid_null_function},\t\t\t//0xF8\n\t{1, &oid_null_function},\t\t\t//0xF9\n\t{1, &oid_null_function},\t\t\t//0xFA\n\t{1, &oid_rt_pro_h2c_set_rate_table_hdl},\t//0xFB\n\t{1, &oid_rt_pro_h2c_get_rate_table_hdl},\t//0xFC\n\t{1, &oid_null_function},\t\t\t//0xFD\n\t{1, &oid_null_function},\t\t\t//0xFE\tOID_RT_PRO_H2C_C2H_LBK_TEST\n\t{1, &oid_null_function}\t\t\t\t//0xFF\n\n};\n\nstruct oid_obj_priv oid_rtl_seg_87_12_00[]=\n{\n\t{1, &oid_rt_pro_encryption_ctrl_hdl},\t\t//0x00\tQ&S\n\t{1, &oid_rt_pro_add_sta_info_hdl},\t\t//0x01\tS\n\t{1, &oid_rt_pro_dele_sta_info_hdl},\t\t//0x02\tS\n\t{1, &oid_rt_pro_query_dr_variable_hdl},\t\t//0x03\tQ\n\t{1, &oid_rt_pro_rx_packet_type_hdl},\t\t//0x04\tQ,S\n\t{1, &oid_rt_pro_read_efuse_hdl},\t\t//0x05\tQ\tOID_RT_PRO_READ_EFUSE\n\t{1, &oid_rt_pro_write_efuse_hdl},\t\t//0x06\tS\tOID_RT_PRO_WRITE_EFUSE\n\t{1, &oid_rt_pro_rw_efuse_pgpkt_hdl},\t\t//0x07\tQ,S\n\t{1, &oid_rt_get_efuse_current_size_hdl},\t//0x08 \tQ\n\t{1, &oid_rt_set_bandwidth_hdl},\t\t\t//0x09\n\t{1, &oid_rt_set_crystal_cap_hdl},\t\t//0x0a\n\t{1, &oid_rt_set_rx_packet_type_hdl},\t\t//0x0b\tS\n\t{1, &oid_rt_get_efuse_max_size_hdl},\t\t//0x0c\n\t{1, &oid_rt_pro_set_tx_agc_offset_hdl},\t\t//0x0d\n\t{1, &oid_rt_pro_set_pkt_test_mode_hdl},\t\t//0x0e\n\t{1, &oid_null_function},\t\t\t//0x0f\t\tOID_RT_PRO_FOR_EVM_TEST_SETTING\n\t{1, &oid_rt_get_thermal_meter_hdl},\t\t//0x10\tQ\tOID_RT_PRO_GET_THERMAL_METER\n\t{1, &oid_rt_reset_phy_rx_packet_count_hdl},\t//0x11\tS\tOID_RT_RESET_PHY_RX_PACKET_COUNT\n\t{1, &oid_rt_get_phy_rx_packet_received_hdl},\t//0x12\tQ\tOID_RT_GET_PHY_RX_PACKET_RECEIVED\n\t{1, &oid_rt_get_phy_rx_packet_crc32_error_hdl},\t//0x13\tQ\tOID_RT_GET_PHY_RX_PACKET_CRC32_ERROR\n\t{1, &oid_rt_set_power_down_hdl},\t\t//0x14\tQ\tOID_RT_SET_POWER_DOWN\n\t{1, &oid_rt_get_power_mode_hdl}\t\t\t//0x15\tQ\tOID_RT_GET_POWER_MODE\n};\n\n#else /* _RTL871X_MP_IOCTL_C_ */\n\nextern struct oid_obj_priv oid_rtl_seg_81_80_00[32];\nextern struct oid_obj_priv oid_rtl_seg_81_80_20[16];\nextern struct oid_obj_priv oid_rtl_seg_81_80_40[6];\nextern struct oid_obj_priv oid_rtl_seg_81_80_80[3];\n\nextern struct oid_obj_priv oid_rtl_seg_81_85[1];\nextern struct oid_obj_priv oid_rtl_seg_81_87[5];\n\nextern struct oid_obj_priv oid_rtl_seg_87_11_00[32];\nextern struct oid_obj_priv oid_rtl_seg_87_11_20[5];\nextern struct oid_obj_priv oid_rtl_seg_87_11_50[2];\nextern struct oid_obj_priv oid_rtl_seg_87_11_80[1];\nextern struct oid_obj_priv oid_rtl_seg_87_11_B0[1];\nextern struct oid_obj_priv oid_rtl_seg_87_11_F0[16];\n\nextern struct oid_obj_priv oid_rtl_seg_87_12_00[32];\n\n#endif /* _RTL871X_MP_IOCTL_C_ */\n\nstruct rwreg_param{\n\tu32 offset;\n\tu32 width;\n\tu32 value;\n};\n\nstruct bbreg_param{\n\tu32 offset;\n\tu32 phymask;\n\tu32 value;\n};\n/*\nstruct rfchannel_param{\n\tu32 ch;\n\tu32 modem;\n};\n*/\nstruct txpower_param{\n\tu32 pwr_index;\n};\n\n\nstruct datarate_param{\n\tu32 rate_index;\n};\n\n\nstruct rfintfs_parm {\n\tu32 rfintfs;\n};\n\ntypedef struct _mp_xmit_parm_ {\n\tu8 enable;\n\tu32 count;\n\tu16 length;\n\tu8 payload_type;\n\tu8 da[ETH_ALEN];\n}MP_XMIT_PARM, *PMP_XMIT_PARM;\n\nstruct mp_xmit_packet {\n\tu32 len;\n\tu32 mem[MAX_MP_XMITBUF_SZ >> 2];\n};\n\nstruct psmode_param {\n\tu32 ps_mode;\n\tu32 smart_ps;\n};\n\n//for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM\nstruct eeprom_rw_param {\n\tu32 offset;\n\tu16 value;\n};\n\nstruct mp_ioctl_handler {\n\tu32 paramsize;\n\tu32 (*handler)(struct oid_par_priv* poid_par_priv);\n\tu32 oid;\n};\n\nstruct mp_ioctl_param{\n\tu32 subcode;\n\tu32 len;\n\tu8 data[0];\n};\n\n#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_\n\nenum RTL871X_MP_IOCTL_SUBCODE {\n\tGEN_MP_IOCTL_SUBCODE(MP_START),\t\t\t/*0*/\n\tGEN_MP_IOCTL_SUBCODE(MP_STOP),\n\tGEN_MP_IOCTL_SUBCODE(READ_REG),\n\tGEN_MP_IOCTL_SUBCODE(WRITE_REG),\n\tGEN_MP_IOCTL_SUBCODE(READ_BB_REG),\n\tGEN_MP_IOCTL_SUBCODE(WRITE_BB_REG),\t\t/*5*/\n\tGEN_MP_IOCTL_SUBCODE(READ_RF_REG),\n\tGEN_MP_IOCTL_SUBCODE(WRITE_RF_REG),\n\tGEN_MP_IOCTL_SUBCODE(SET_CHANNEL),\n\tGEN_MP_IOCTL_SUBCODE(SET_TXPOWER),\n\tGEN_MP_IOCTL_SUBCODE(SET_DATARATE),\t\t/*10*/\n\tGEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH),\n\tGEN_MP_IOCTL_SUBCODE(SET_ANTENNA),\n\tGEN_MP_IOCTL_SUBCODE(CNTU_TX),\n\tGEN_MP_IOCTL_SUBCODE(SC_TX),\n\tGEN_MP_IOCTL_SUBCODE(CS_TX),\t\t\t/*15*/\n\tGEN_MP_IOCTL_SUBCODE(ST_TX),\n\tGEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET),\n\tGEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE),\n\tGEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT),\n\tGEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV),\t/*20*/\n\tGEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR),\n\tGEN_MP_IOCTL_SUBCODE(READ16_EEPROM),\n\tGEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM),\n\tGEN_MP_IOCTL_SUBCODE(EFUSE),\n\tGEN_MP_IOCTL_SUBCODE(EFUSE_MAP),\t\t/*25*/\n\tGEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE),\n\tGEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE),\n\tGEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER),\n\tGEN_MP_IOCTL_SUBCODE(SET_PTM),\n\tGEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN),\t\t/*30*/\n\tGEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO),\n\tGEN_MP_IOCTL_SUBCODE(SET_DM_BT),\t\t/*32*/\n\tGEN_MP_IOCTL_SUBCODE(DEL_BA),\t\t\t/*33*/\n\tGEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS),\t/*34*/\t\n\tMAX_MP_IOCTL_SUBCODE,\n};\n\nu32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv* poid_par_priv);\n\n#ifdef _RTW_MP_IOCTL_C_\n\n#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid},\n\n#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid},\n\n\nstruct mp_ioctl_handler mp_ioctl_hdl[] = {\n\n/*0*/\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG)\n/*5*/\tGEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL)\n/*10*/\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX)\n/*15*/\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX)\n\n\tEXT_MP_IOCTL_HANDLER(0, xmit_packet, 0)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE)\n\tGEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT)\n/*20*/\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0)\n\tGEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0)\n\tGEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE)\n/*25*/\tGEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE)\n\n\tGEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER)\n\tGEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING)\n/*30*/\tGEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN)\n/*31*/\tGEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0)\n\tGEN_MP_IOCTL_HANDLER(0, NULL, 0)\n\tGEN_MP_IOCTL_HANDLER(0, NULL, 0)\n\tGEN_MP_IOCTL_HANDLER(0, NULL, 0)\n};\n\n#else /* _RTW_MP_IOCTL_C_ */\n\nextern struct mp_ioctl_handler mp_ioctl_hdl[];\n\n#endif /* _RTW_MP_IOCTL_C_ */\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_mp_phy_regdef.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*****************************************************************************\n *\n * Module:\t__RTW_MP_PHY_REGDEF_H_\n *\n *\n * Note:\t1. Define PMAC/BB register map\n *\t\t\t2. Define RF register map\n *\t\t\t3. PMAC/BB register bit mask.\n *\t\t\t4. RF reg bit mask.\n *\t\t\t5. Other BB/RF relative definition.\n *\t\t\t\n *\n * Export:\tConstants, macro, functions(API), global variables(None).\n *\n * Abbrev:\t\n *\n * History:\n *\tData\t\t\tWho\t\tRemark \n *\t08/07/2007\tMHC\t\t1. Porting from 9x series PHYCFG.h.\n *\t\t\t\t\t\t2. Reorganize code architecture.\n *\t09/25/2008\tMH\t\t1. Add RL6052 register definition\n * \n *****************************************************************************/\n#ifndef __RTW_MP_PHY_REGDEF_H_\n#define __RTW_MP_PHY_REGDEF_H_\n\n\n/*--------------------------Define Parameters-------------------------------*/\n\n//============================================================\n//       8192S Regsiter offset definition\n//============================================================\n\n//\n// BB-PHY register PMAC 0x100 PHY 0x800 - 0xEFF\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 2. 0x800/0x900/0xA00/0xC00/0xD00/0xE00\n// 3. RF register 0x00-2E\n// 4. Bit Mask for BB/RF register\n// 5. Other defintion for BB/RF R/W\n//\n\n\n//\n// 1. PMAC duplicate register due to connection: RF_Mode, TRxRN, NumOf L-STF\n// 1. Page1(0x100)\n//\n#define\t\trPMAC_Reset\t\t\t\t\t0x100\n#define\t\trPMAC_TxStart\t\t\t\t\t0x104\n#define\t\trPMAC_TxLegacySIG\t\t\t\t0x108\n#define\t\trPMAC_TxHTSIG1\t\t\t\t0x10c\n#define\t\trPMAC_TxHTSIG2\t\t\t\t0x110\n#define\t\trPMAC_PHYDebug\t\t\t\t0x114\n#define\t\trPMAC_TxPacketNum\t\t\t\t0x118\n#define\t\trPMAC_TxIdle\t\t\t\t\t0x11c\n#define\t\trPMAC_TxMACHeader0\t\t\t0x120\n#define\t\trPMAC_TxMACHeader1\t\t\t0x124\n#define\t\trPMAC_TxMACHeader2\t\t\t0x128\n#define\t\trPMAC_TxMACHeader3\t\t\t0x12c\n#define\t\trPMAC_TxMACHeader4\t\t\t0x130\n#define\t\trPMAC_TxMACHeader5\t\t\t0x134\n#define\t\trPMAC_TxDataType\t\t\t\t0x138\n#define\t\trPMAC_TxRandomSeed\t\t\t0x13c\n#define\t\trPMAC_CCKPLCPPreamble\t\t\t0x140\n#define\t\trPMAC_CCKPLCPHeader\t\t\t0x144\n#define\t\trPMAC_CCKCRC16\t\t\t\t0x148\n#define\t\trPMAC_OFDMRxCRC32OK\t\t\t0x170\n#define\t\trPMAC_OFDMRxCRC32Er\t\t\t0x174\n#define\t\trPMAC_OFDMRxParityEr\t\t\t0x178\n#define\t\trPMAC_OFDMRxCRC8Er\t\t\t0x17c\n#define\t\trPMAC_CCKCRxRC16Er\t\t\t0x180\n#define\t\trPMAC_CCKCRxRC32Er\t\t\t0x184\n#define\t\trPMAC_CCKCRxRC32OK\t\t\t0x188\n#define\t\trPMAC_TxStatus\t\t\t\t\t0x18c\n\n//\n// 2. Page2(0x200)\n//\n// The following two definition are only used for USB interface.\n//#define\t\tRF_BB_CMD_ADDR\t\t\t\t0x02c0\t// RF/BB read/write command address.\n//#define\t\tRF_BB_CMD_DATA\t\t\t\t0x02c4\t// RF/BB read/write command data.\n\n//\n// 3. Page8(0x800)\n//\n#define\t\trFPGA0_RFMOD\t\t\t\t0x800\t//RF mode & CCK TxSC // RF BW Setting??\n\n#define\t\trFPGA0_TxInfo\t\t\t\t0x804\t// Status report??\n#define\t\trFPGA0_PSDFunction\t\t\t0x808\n\n#define\t\trFPGA0_TxGainStage\t\t\t0x80c\t// Set TX PWR init gain?\n\n#define\t\trFPGA0_RFTiming1\t\t\t0x810\t// Useless now\n#define\t\trFPGA0_RFTiming2\t\t\t0x814\n//#define rFPGA0_XC_RFTiming        \t\t0x818\n//#define rFPGA0_XD_RFTiming        \t\t0x81c\n\n#define\t\trFPGA0_XA_HSSIParameter1\t\t0x820\t// RF 3 wire register\n#define\t\trFPGA0_XA_HSSIParameter2\t\t0x824\n#define\t\trFPGA0_XB_HSSIParameter1\t\t0x828\n#define\t\trFPGA0_XB_HSSIParameter2\t\t0x82c\n#define\t\trFPGA0_XC_HSSIParameter1\t\t0x830\n#define\t\trFPGA0_XC_HSSIParameter2\t\t0x834\n#define\t\trFPGA0_XD_HSSIParameter1\t\t0x838\n#define\t\trFPGA0_XD_HSSIParameter2\t\t0x83c\n#define\t\trFPGA0_XA_LSSIParameter\t\t0x840\n#define\t\trFPGA0_XB_LSSIParameter\t\t0x844\n#define\t\trFPGA0_XC_LSSIParameter\t\t0x848\n#define\t\trFPGA0_XD_LSSIParameter\t\t0x84c\n\n#define\t\trFPGA0_RFWakeUpParameter\t\t0x850\t// Useless now\n#define\t\trFPGA0_RFSleepUpParameter\t\t0x854\n\n#define\t\trFPGA0_XAB_SwitchControl\t\t0x858\t// RF Channel switch\n#define\t\trFPGA0_XCD_SwitchControl\t\t0x85c\n\n#define\t\trFPGA0_XA_RFInterfaceOE\t\t0x860\t// RF Channel switch\n#define\t\trFPGA0_XB_RFInterfaceOE\t\t0x864\n#define\t\trFPGA0_XC_RFInterfaceOE\t\t0x868\n#define\t\trFPGA0_XD_RFInterfaceOE\t\t0x86c\n\n#define\t\trFPGA0_XAB_RFInterfaceSW\t\t0x870\t// RF Interface Software Control\n#define\t\trFPGA0_XCD_RFInterfaceSW\t\t0x874\n\n#define\t\trFPGA0_XAB_RFParameter\t\t0x878\t// RF Parameter\n#define\t\trFPGA0_XCD_RFParameter\t\t0x87c\n\n#define\t\trFPGA0_AnalogParameter1\t\t0x880\t// Crystal cap setting RF-R/W protection for parameter4??\n#define\t\trFPGA0_AnalogParameter2\t\t0x884\n#define\t\trFPGA0_AnalogParameter3\t\t0x888\t// Useless now\n#define\t\trFPGA0_AnalogParameter4\t\t0x88c\n\n#define\t\trFPGA0_XA_LSSIReadBack\t\t0x8a0\t// Tranceiver LSSI Readback\n#define\t\trFPGA0_XB_LSSIReadBack\t\t0x8a4\n#define\t\trFPGA0_XC_LSSIReadBack\t\t0x8a8\n#define\t\trFPGA0_XD_LSSIReadBack\t\t0x8ac\n\n#define\t\trFPGA0_PSDReport\t\t\t\t0x8b4\t// Useless now\n#define\t\trFPGA0_XAB_RFInterfaceRB\t\t0x8e0\t// Useless now // RF Interface Readback Value\n#define\t\trFPGA0_XCD_RFInterfaceRB\t\t0x8e4\t// Useless now\n\n//\n// 4. Page9(0x900)\n//\n#define\t\trFPGA1_RFMOD\t\t\t\t0x900\t//RF mode & OFDM TxSC // RF BW Setting??\n\n#define\t\trFPGA1_TxBlock\t\t\t\t0x904\t// Useless now\n#define\t\trFPGA1_DebugSelect\t\t\t0x908\t// Useless now\n#define\t\trFPGA1_TxInfo\t\t\t\t0x90c\t// Useless now // Status report??\n#define \trS0S1_PathSwitch\t\t\t0x948\n\n//\n// 5. PageA(0xA00)\n//\n// Set Control channel to upper or lower. These settings are required only for 40MHz\n#define\t\trCCK0_System\t\t\t\t0xa00\n\n#define\t\trCCK0_AFESetting\t\t\t0xa04\t// Disable init gain now // Select RX path by RSSI\n#define\t\trCCK0_CCA\t\t\t\t\t0xa08\t// Disable init gain now // Init gain\n\n#define\t\trCCK0_RxAGC1\t\t\t\t0xa0c \t//AGC default value, saturation level // Antenna Diversity, RX AGC, LNA Threshold, RX LNA Threshold useless now. Not the same as 90 series\n#define\t\trCCK0_RxAGC2\t\t\t\t0xa10 \t//AGC & DAGC\n\n#define\t\trCCK0_RxHP\t\t\t\t\t0xa14\n\n#define\t\trCCK0_DSPParameter1\t\t0xa18\t//Timing recovery & Channel estimation threshold\n#define\t\trCCK0_DSPParameter2\t\t0xa1c\t//SQ threshold\n\n#define\t\trCCK0_TxFilter1\t\t\t\t0xa20\n#define\t\trCCK0_TxFilter2\t\t\t\t0xa24\n#define\t\trCCK0_DebugPort\t\t\t0xa28\t//debug port and Tx filter3\n#define\t\trCCK0_FalseAlarmReport\t\t0xa2c\t//0xa2d\tuseless now 0xa30-a4f channel report\n#define\t\trCCK0_TRSSIReport         \t\t0xa50\n#define\t\trCCK0_RxReport            \t\t0xa54  //0xa57\n#define\t\trCCK0_FACounterLower      \t0xa5c  //0xa5b\n#define\t\trCCK0_FACounterUpper      \t0xa58  //0xa5c\n\n//\n// 6. PageC(0xC00)\n//\n#define\t\trOFDM0_LSTF\t\t\t\t0xc00\n\n#define\t\trOFDM0_TRxPathEnable\t\t0xc04\n#define\t\trOFDM0_TRMuxPar\t\t\t0xc08\n#define\t\trOFDM0_TRSWIsolation\t\t0xc0c\n\n#define\t\trOFDM0_XARxAFE\t\t\t0xc10  //RxIQ DC offset, Rx digital filter, DC notch filter\n#define\t\trOFDM0_XARxIQImbalance    \t0xc14  //RxIQ imblance matrix\n#define\t\trOFDM0_XBRxAFE            \t\t0xc18\n#define\t\trOFDM0_XBRxIQImbalance    \t0xc1c\n#define\t\trOFDM0_XCRxAFE            \t\t0xc20\n#define\t\trOFDM0_XCRxIQImbalance    \t0xc24\n#define\t\trOFDM0_XDRxAFE            \t\t0xc28\n#define\t\trOFDM0_XDRxIQImbalance    \t0xc2c\n\n#define\t\trOFDM0_RxDetector1\t\t\t0xc30  //PD,BW & SBD\t// DM tune init gain\n#define\t\trOFDM0_RxDetector2\t\t\t0xc34  //SBD & Fame Sync. \n#define\t\trOFDM0_RxDetector3\t\t\t0xc38  //Frame Sync.\n#define\t\trOFDM0_RxDetector4\t\t\t0xc3c  //PD, SBD, Frame Sync & Short-GI\n\n#define\t\trOFDM0_RxDSP\t\t\t\t0xc40  //Rx Sync Path\n#define\t\trOFDM0_CFOandDAGC\t\t0xc44  //CFO & DAGC\n#define\t\trOFDM0_CCADropThreshold\t0xc48 //CCA Drop threshold\n#define\t\trOFDM0_ECCAThreshold\t\t0xc4c // energy CCA\n\n#define\t\trOFDM0_XAAGCCore1\t\t\t0xc50\t// DIG  \n#define\t\trOFDM0_XAAGCCore2\t\t\t0xc54\n#define\t\trOFDM0_XBAGCCore1\t\t\t0xc58\n#define\t\trOFDM0_XBAGCCore2\t\t\t0xc5c\n#define\t\trOFDM0_XCAGCCore1\t\t\t0xc60\n#define\t\trOFDM0_XCAGCCore2\t\t\t0xc64\n#define\t\trOFDM0_XDAGCCore1\t\t\t0xc68\n#define\t\trOFDM0_XDAGCCore2\t\t\t0xc6c\n\n#define\t\trOFDM0_AGCParameter1\t\t\t0xc70\n#define\t\trOFDM0_AGCParameter2\t\t\t0xc74\n#define\t\trOFDM0_AGCRSSITable\t\t\t0xc78\n#define\t\trOFDM0_HTSTFAGC\t\t\t\t0xc7c\n\n#define\t\trOFDM0_XATxIQImbalance\t\t0xc80\t// TX PWR TRACK and DIG\n#define\t\trOFDM0_XATxAFE\t\t\t\t0xc84\n#define\t\trOFDM0_XBTxIQImbalance\t\t0xc88\n#define\t\trOFDM0_XBTxAFE\t\t\t\t0xc8c\n#define\t\trOFDM0_XCTxIQImbalance\t\t0xc90\n#define\t\trOFDM0_XCTxAFE            \t\t\t0xc94\n#define\t\trOFDM0_XDTxIQImbalance\t\t0xc98\n#define\t\trOFDM0_XDTxAFE\t\t\t\t0xc9c\n#define\t\trOFDM0_RxIQExtAnta\t\t\t0xca0\n\n#define\t\trOFDM0_RxHPParameter\t\t\t0xce0\n#define\t\trOFDM0_TxPseudoNoiseWgt\t\t0xce4\n#define\t\trOFDM0_FrameSync\t\t\t\t0xcf0\n#define\t\trOFDM0_DFSReport\t\t\t\t0xcf4\n#define\t\trOFDM0_TxCoeff1\t\t\t\t0xca4\n#define\t\trOFDM0_TxCoeff2\t\t\t\t0xca8\n#define\t\trOFDM0_TxCoeff3\t\t\t\t0xcac\n#define\t\trOFDM0_TxCoeff4\t\t\t\t0xcb0\n#define\t\trOFDM0_TxCoeff5\t\t\t\t0xcb4\n#define\t\trOFDM0_TxCoeff6\t\t\t\t0xcb8\n\n\n//\n// 7. PageD(0xD00)\n//\n#define\t\trOFDM1_LSTF\t\t\t\t\t0xd00\n#define\t\trOFDM1_TRxPathEnable\t\t\t0xd04\n\n#define\t\trOFDM1_CFO\t\t\t\t\t\t0xd08\t// No setting now\n#define\t\trOFDM1_CSI1\t\t\t\t\t0xd10\n#define\t\trOFDM1_SBD\t\t\t\t\t\t0xd14\n#define\t\trOFDM1_CSI2\t\t\t\t\t0xd18\n#define\t\trOFDM1_CFOTracking\t\t\t0xd2c\n#define\t\trOFDM1_TRxMesaure1\t\t\t0xd34\n#define\t\trOFDM1_IntfDet\t\t\t\t\t0xd3c\n#define\t\trOFDM1_PseudoNoiseStateAB\t\t0xd50\n#define\t\trOFDM1_PseudoNoiseStateCD\t\t0xd54\n#define\t\trOFDM1_RxPseudoNoiseWgt\t\t0xd58\n\n#define\t\trOFDM_PHYCounter1\t\t\t\t0xda0  //cca, parity fail\n#define\t\trOFDM_PHYCounter2\t\t\t\t0xda4  //rate illegal, crc8 fail\n#define\t\trOFDM_PHYCounter3\t\t\t\t0xda8  //MCS not support\n\n#define\t\trOFDM_ShortCFOAB\t\t\t\t0xdac\t// No setting now\n#define\t\trOFDM_ShortCFOCD\t\t\t\t0xdb0\n#define\t\trOFDM_LongCFOAB\t\t\t\t0xdb4\n#define\t\trOFDM_LongCFOCD\t\t\t\t0xdb8\n#define\t\trOFDM_TailCFOAB\t\t\t\t0xdbc\n#define\t\trOFDM_TailCFOCD\t\t\t\t0xdc0\n#define\t\trOFDM_PWMeasure1          \t\t0xdc4\n#define\t\trOFDM_PWMeasure2          \t\t0xdc8\n#define\t\trOFDM_BWReport\t\t\t\t0xdcc\n#define\t\trOFDM_AGCReport\t\t\t\t0xdd0\n#define\t\trOFDM_RxSNR\t\t\t\t\t0xdd4\n#define\t\trOFDM_RxEVMCSI\t\t\t\t0xdd8\n#define\t\trOFDM_SIGReport\t\t\t\t0xddc\n\n\n//\n// 8. PageE(0xE00)\n//\n#define\t\trTxAGC_Rate18_06\t\t\t\t0xe00\n#define\t\trTxAGC_Rate54_24\t\t\t\t0xe04\n#define\t\trTxAGC_CCK_Mcs32\t\t\t\t0xe08\n#define\t\trTxAGC_Mcs03_Mcs00\t\t\t0xe10\n#define\t\trTxAGC_Mcs07_Mcs04\t\t\t0xe14\n#define\t\trTxAGC_Mcs11_Mcs08\t\t\t0xe18\n#define\t\trTxAGC_Mcs15_Mcs12\t\t\t0xe1c\n\n// Analog- control in RX_WAIT_CCA : REG: EE0 [Analog- Power & Control Register]\n#define \t\trRx_Wait_CCCA\t\t\t\t\t0xe70\n#define\t\trAnapar_Ctrl_BB\t\t\t\t\t0xee0\n\n//\n// 7. RF Register 0x00-0x2E (RF 8256)\n//    RF-0222D 0x00-3F\n//\n//Zebra1\n#define RTL92SE_FPGA_VERIFY 0\n#define\t\trZebra1_HSSIEnable\t\t\t\t0x0\t// Useless now\n#define\t\trZebra1_TRxEnable1\t\t\t\t0x1\n#define\t\trZebra1_TRxEnable2\t\t\t\t0x2\n#define\t\trZebra1_AGC\t\t\t\t\t0x4\n#define\t\trZebra1_ChargePump\t\t\t0x5\n//#if (RTL92SE_FPGA_VERIFY == 1)\n#define\t\trZebra1_Channel\t\t\t\t0x7\t// RF channel switch\n//#else\n\n//#endif\n#define\t\trZebra1_TxGain\t\t\t\t\t0x8\t// Useless now\n#define\t\trZebra1_TxLPF\t\t\t\t\t0x9\n#define\t\trZebra1_RxLPF\t\t\t\t\t0xb\n#define\t\trZebra1_RxHPFCorner\t\t\t0xc\n\n//Zebra4\n#define\t\trGlobalCtrl\t\t\t\t\t\t0\t// Useless now\n#define\t\trRTL8256_TxLPF\t\t\t\t\t19\n#define\t\trRTL8256_RxLPF\t\t\t\t\t11\n\n//RTL8258\n#define\t\trRTL8258_TxLPF\t\t\t\t\t0x11\t// Useless now\n#define\t\trRTL8258_RxLPF\t\t\t\t\t0x13\n#define\t\trRTL8258_RSSILPF\t\t\t\t0xa\n\n//\n// RL6052 Register definition\n//\n#define\t\tRF_AC\t\t\t\t\t\t0x00\t// \n\n#define\t\tRF_IQADJ_G1\t\t\t\t0x01\t// \n#define\t\tRF_IQADJ_G2\t\t\t\t0x02\t// \n#define\t\tRF_POW_TRSW\t\t\t\t0x05\t// \n\n#define\t\tRF_GAIN_RX\t\t\t\t\t0x06\t// \n#define\t\tRF_GAIN_TX\t\t\t\t\t0x07\t// \n\n#define\t\tRF_TXM_IDAC\t\t\t\t0x08\t// \n#define\t\tRF_BS_IQGEN\t\t\t\t0x0F\t// \n\n#define\t\tRF_MODE1\t\t\t\t\t0x10\t// \n#define\t\tRF_MODE2\t\t\t\t\t0x11\t// \n\n#define\t\tRF_RX_AGC_HP\t\t\t\t0x12\t// \n#define\t\tRF_TX_AGC\t\t\t\t\t0x13\t// \n#define\t\tRF_BIAS\t\t\t\t\t\t0x14\t// \n#define\t\tRF_IPA\t\t\t\t\t\t0x15\t// \n#define\t\tRF_TXBIAS\t\t\t\t\t0x16 //\n#define\t\tRF_POW_ABILITY\t\t\t0x17\t// \n#define\t\tRF_MODE_AG\t\t\t\t0x18\t// \n#define\t\trRfChannel\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_CHNLBW\t\t\t\t\t0x18\t// RF channel and BW switch\n#define\t\tRF_TOP\t\t\t\t\t\t0x19\t// \n\n#define\t\tRF_RX_G1\t\t\t\t\t0x1A\t// \n#define\t\tRF_RX_G2\t\t\t\t\t0x1B\t// \n\n#define\t\tRF_RX_BB2\t\t\t\t\t0x1C\t// \n#define\t\tRF_RX_BB1\t\t\t\t\t0x1D\t// \n\n#define\t\tRF_RCK1\t\t\t\t\t0x1E\t// \n#define\t\tRF_RCK2\t\t\t\t\t0x1F\t// \n\n#define\t\tRF_TX_G1\t\t\t\t\t0x20\t// \n#define\t\tRF_TX_G2\t\t\t\t\t0x21\t// \n#define\t\tRF_TX_G3\t\t\t\t\t0x22\t// \n\n#define\t\tRF_TX_BB1\t\t\t\t\t0x23\t// \n\n#define\t\tRF_T_METER\t\t\t\t\t0x24\t// \n\n#define\t\tRF_SYN_G1\t\t\t\t\t0x25\t// RF TX Power control\n#define\t\tRF_SYN_G2\t\t\t\t\t0x26\t// RF TX Power control\n#define\t\tRF_SYN_G3\t\t\t\t\t0x27\t// RF TX Power control\n#define\t\tRF_SYN_G4\t\t\t\t\t0x28\t// RF TX Power control\n#define\t\tRF_SYN_G5\t\t\t\t\t0x29\t// RF TX Power control\n#define\t\tRF_SYN_G6\t\t\t\t\t0x2A\t// RF TX Power control\n#define\t\tRF_SYN_G7\t\t\t\t\t0x2B\t// RF TX Power control\n#define\t\tRF_SYN_G8\t\t\t\t\t0x2C\t// RF TX Power control\n\n#define\t\tRF_RCK_OS\t\t\t\t\t0x30\t// RF TX PA control\n\n#define\t\tRF_TXPA_G1\t\t\t\t\t0x31\t// RF TX PA control\n#define\t\tRF_TXPA_G2\t\t\t\t\t0x32\t// RF TX PA control\n#define\t\tRF_TXPA_G3\t\t\t\t\t0x33\t// RF TX PA control\n\n//\n//Bit Mask\n//\n// 1. Page1(0x100)\n#define\t\tbBBResetB\t\t\t\t\t\t0x100\t// Useless now?\n#define\t\tbGlobalResetB\t\t\t\t\t0x200\n#define\t\tbOFDMTxStart\t\t\t\t\t0x4\n#define\t\tbCCKTxStart\t\t\t\t\t\t0x8\n#define\t\tbCRC32Debug\t\t\t\t\t0x100\n#define\t\tbPMACLoopback\t\t\t\t\t0x10\n#define\t\tbTxLSIG\t\t\t\t\t\t\t0xffffff\n#define\t\tbOFDMTxRate\t\t\t\t\t0xf\n#define\t\tbOFDMTxReserved\t\t\t\t0x10\n#define\t\tbOFDMTxLength\t\t\t\t\t0x1ffe0\n#define\t\tbOFDMTxParity\t\t\t\t\t0x20000\n#define\t\tbTxHTSIG1\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTMCSRate\t\t\t\t\t0x7f\n#define\t\tbTxHTBW\t\t\t\t\t\t0x80\n#define\t\tbTxHTLength\t\t\t\t\t0xffff00\n#define\t\tbTxHTSIG2\t\t\t\t\t\t0xffffff\n#define\t\tbTxHTSmoothing\t\t\t\t\t0x1\n#define\t\tbTxHTSounding\t\t\t\t\t0x2\n#define\t\tbTxHTReserved\t\t\t\t\t0x4\n#define\t\tbTxHTAggreation\t\t\t\t0x8\n#define\t\tbTxHTSTBC\t\t\t\t\t\t0x30\n#define\t\tbTxHTAdvanceCoding\t\t\t0x40\n#define\t\tbTxHTShortGI\t\t\t\t\t0x80\n#define\t\tbTxHTNumberHT_LTF\t\t\t0x300\n#define\t\tbTxHTCRC8\t\t\t\t\t\t0x3fc00\n#define\t\tbCounterReset\t\t\t\t\t0x10000\n#define\t\tbNumOfOFDMTx\t\t\t\t\t0xffff\n#define\t\tbNumOfCCKTx\t\t\t\t\t0xffff0000\n#define\t\tbTxIdleInterval\t\t\t\t\t0xffff\n#define\t\tbOFDMService\t\t\t\t\t0xffff0000\n#define\t\tbTxMACHeader\t\t\t\t\t0xffffffff\n#define\t\tbTxDataInit\t\t\t\t\t\t0xff\n#define\t\tbTxHTMode\t\t\t\t\t\t0x100\n#define\t\tbTxDataType\t\t\t\t\t0x30000\n#define\t\tbTxRandomSeed\t\t\t\t\t0xffffffff\n#define\t\tbCCKTxPreamble\t\t\t\t\t0x1\n#define\t\tbCCKTxSFD\t\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxSIG\t\t\t\t\t\t0xff\n#define\t\tbCCKTxService\t\t\t\t\t0xff00\n#define\t\tbCCKLengthExt\t\t\t\t\t0x8000\n#define\t\tbCCKTxLength\t\t\t\t\t0xffff0000\n#define\t\tbCCKTxCRC16\t\t\t\t\t0xffff\n#define\t\tbCCKTxStatus\t\t\t\t\t0x1\n#define\t\tbOFDMTxStatus\t\t\t\t\t0x2\n\n#define \t\tIS_BB_REG_OFFSET_92S(_Offset)\t\t((_Offset >= 0x800) && (_Offset <= 0xfff))\n\n// 2. Page8(0x800)\n#define\t\tbRFMOD\t\t\t\t\t\t\t0x1\t// Reg 0x800 rFPGA0_RFMOD\n#define\t\tbJapanMode\t\t\t\t\t\t0x2\n#define\t\tbCCKTxSC\t\t\t\t\t\t0x30\n#define\t\tbCCKEn\t\t\t\t\t\t\t0x1000000\n#define\t\tbOFDMEn\t\t\t\t\t\t0x2000000\n\n#define\t\tbOFDMRxADCPhase           \t\t0x10000\t// Useless now\n#define\t\tbOFDMTxDACPhase           \t\t0x40000\n#define\t\tbXATxAGC                  \t\t\t0x3f\n\n#define\t\tbXBTxAGC                  \t\t\t0xf00\t// Reg 80c rFPGA0_TxGainStage\n#define\t\tbXCTxAGC                  \t\t\t0xf000\n#define\t\tbXDTxAGC                  \t\t\t0xf0000\n       \t\t\n#define\t\tbPAStart                  \t\t\t0xf0000000\t// Useless now\n#define\t\tbTRStart                  \t\t\t0x00f00000\n#define\t\tbRFStart                  \t\t\t0x0000f000\n#define\t\tbBBStart                  \t\t\t0x000000f0\n#define\t\tbBBCCKStart               \t\t0x0000000f\n#define\t\tbPAEnd                    \t\t\t0xf          //Reg0x814\n#define\t\tbTREnd                    \t\t\t0x0f000000\n#define\t\tbRFEnd                    \t\t\t0x000f0000\n#define\t\tbCCAMask                  \t\t\t0x000000f0   //T2R\n#define\t\tbR2RCCAMask               \t\t0x00000f00\n#define\t\tbHSSI_R2TDelay            \t\t0xf8000000\n#define\t\tbHSSI_T2RDelay            \t\t0xf80000\n#define\t\tbContTxHSSI               \t\t0x400     //chane gain at continue Tx\n#define\t\tbIGFromCCK                \t\t0x200\n#define\t\tbAGCAddress               \t\t0x3f\n#define\t\tbRxHPTx                   \t\t\t0x7000\n#define\t\tbRxHPT2R                  \t\t\t0x38000\n#define\t\tbRxHPCCKIni               \t\t0xc0000\n#define\t\tbAGCTxCode                \t\t0xc00000\n#define\t\tbAGCRxCode                \t\t0x300000\n\n#define\t\tb3WireDataLength          \t\t0x800\t// Reg 0x820~84f rFPGA0_XA_HSSIParameter1\n#define\t\tb3WireAddressLength       \t\t0x400\n\n#define\t\tb3WireRFPowerDown         \t\t0x1\t// Useless now\n//#define bHWSISelect               \t\t0x8\n#define\t\tb5GPAPEPolarity           \t\t0x40000000\n#define\t\tb2GPAPEPolarity           \t\t0x80000000\n#define\t\tbRFSW_TxDefaultAnt        \t\t0x3\n#define\t\tbRFSW_TxOptionAnt         \t\t0x30\n#define\t\tbRFSW_RxDefaultAnt        \t\t0x300\n#define\t\tbRFSW_RxOptionAnt         \t\t0x3000\n#define\t\tbRFSI_3WireData           \t\t0x1\n#define\t\tbRFSI_3WireClock          \t\t0x2\n#define\t\tbRFSI_3WireLoad           \t\t0x4\n#define\t\tbRFSI_3WireRW             \t\t0x8\n#define\t\tbRFSI_3Wire               \t\t\t0xf\n\n#define\t\tbRFSI_RFENV               \t\t0x10\t// Reg 0x870 rFPGA0_XAB_RFInterfaceSW\n\n#define\t\tbRFSI_TRSW                \t\t0x20\t// Useless now\n#define\t\tbRFSI_TRSWB               \t\t0x40\n#define\t\tbRFSI_ANTSW               \t\t0x100\n#define\t\tbRFSI_ANTSWB              \t\t0x200\n#define\t\tbRFSI_PAPE                \t\t\t0x400\n#define\t\tbRFSI_PAPE5G              \t\t0x800 \n#define\t\tbBandSelect               \t\t\t0x1\n#define\t\tbHTSIG2_GI                \t\t\t0x80\n#define\t\tbHTSIG2_Smoothing         \t\t0x01\n#define\t\tbHTSIG2_Sounding          \t\t0x02\n#define\t\tbHTSIG2_Aggreaton         \t\t0x08\n#define\t\tbHTSIG2_STBC              \t\t0x30\n#define\t\tbHTSIG2_AdvCoding         \t\t0x40\n#define\t\tbHTSIG2_NumOfHTLTF        \t0x300\n#define\t\tbHTSIG2_CRC8              \t\t0x3fc\n#define\t\tbHTSIG1_MCS               \t\t0x7f\n#define\t\tbHTSIG1_BandWidth         \t\t0x80\n#define\t\tbHTSIG1_HTLength          \t\t0xffff\n#define\t\tbLSIG_Rate                \t\t\t0xf\n#define\t\tbLSIG_Reserved            \t\t0x10\n#define\t\tbLSIG_Length              \t\t0x1fffe\n#define\t\tbLSIG_Parity              \t\t\t0x20\n#define\t\tbCCKRxPhase               \t\t0x4\n#if (RTL92SE_FPGA_VERIFY == 1)\n#define\t\tbLSSIReadAddress          \t\t0x3f000000   //LSSI \"Read\" Address\t// Reg 0x824 rFPGA0_XA_HSSIParameter2\n#else\n#define\t\tbLSSIReadAddress          \t\t0x7f800000   // T65 RF\n#endif\n#define\t\tbLSSIReadEdge             \t\t0x80000000   //LSSI \"Read\" edge signal\n#if (RTL92SE_FPGA_VERIFY == 1)\n#define\t\tbLSSIReadBackData         \t\t0xfff\t\t// Reg 0x8a0 rFPGA0_XA_LSSIReadBack\n#else\n#define\t\tbLSSIReadBackData         \t\t0xfffff\t\t// T65 RF\n#endif\n#define\t\tbLSSIReadOKFlag           \t\t0x1000\t// Useless now\n#define\t\tbCCKSampleRate            \t\t0x8       //0: 44MHz, 1:88MHz       \t\t\n#define\t\tbRegulator0Standby        \t\t0x1\n#define\t\tbRegulatorPLLStandby      \t\t0x2\n#define\t\tbRegulator1Standby        \t\t0x4\n#define\t\tbPLLPowerUp               \t\t0x8\n#define\t\tbDPLLPowerUp              \t\t0x10\n#define\t\tbDA10PowerUp              \t\t0x20\n#define\t\tbAD7PowerUp               \t\t0x200\n#define\t\tbDA6PowerUp               \t\t0x2000\n#define\t\tbXtalPowerUp              \t\t0x4000\n#define\t\tb40MDClkPowerUP           \t\t0x8000\n#define\t\tbDA6DebugMode             \t\t0x20000\n#define\t\tbDA6Swing                 \t\t\t0x380000\n\n#define\t\tbADClkPhase               \t\t0x4000000\t// Reg 0x880 rFPGA0_AnalogParameter1 20/40 CCK support switch 40/80 BB MHZ\n\n#define\t\tb80MClkDelay              \t\t0x18000000\t// Useless\n#define\t\tbAFEWatchDogEnable        \t\t0x20000000\n\n#define\t\tbXtalCap01                \t\t\t0xc0000000\t// Reg 0x884 rFPGA0_AnalogParameter2 Crystal cap\n#define\t\tbXtalCap23                \t\t\t0x3\n#define\t\tbXtalCap92x\t\t\t\t\t0x0f000000\n#define \t\tbXtalCap                \t\t\t0x0f000000\n\n#define\t\tbIntDifClkEnable          \t\t0x400\t// Useless\n#define\t\tbExtSigClkEnable         \t \t0x800\n#define\t\tbBandgapMbiasPowerUp      \t0x10000\n#define\t\tbAD11SHGain               \t\t0xc0000\n#define\t\tbAD11InputRange           \t\t0x700000\n#define\t\tbAD11OPCurrent            \t\t0x3800000\n#define\t\tbIPathLoopback            \t\t0x4000000\n#define\t\tbQPathLoopback            \t\t0x8000000\n#define\t\tbAFELoopback              \t\t0x10000000\n#define\t\tbDA10Swing                \t\t0x7e0\n#define\t\tbDA10Reverse              \t\t0x800\n#define\t\tbDAClkSource              \t\t0x1000\n#define\t\tbAD7InputRange            \t\t0x6000\n#define\t\tbAD7Gain                  \t\t\t0x38000\n#define\t\tbAD7OutputCMMode          \t\t0x40000\n#define\t\tbAD7InputCMMode           \t\t0x380000\n#define\t\tbAD7Current               \t\t\t0xc00000\n#define\t\tbRegulatorAdjust          \t\t0x7000000\n#define\t\tbAD11PowerUpAtTx          \t\t0x1\n#define\t\tbDA10PSAtTx               \t\t0x10\n#define\t\tbAD11PowerUpAtRx          \t\t0x100\n#define\t\tbDA10PSAtRx               \t\t0x1000       \t\t\n#define\t\tbCCKRxAGCFormat           \t\t0x200       \t\t\n#define\t\tbPSDFFTSamplepPoint       \t\t0xc000\n#define\t\tbPSDAverageNum            \t\t0x3000\n#define\t\tbIQPathControl            \t\t0xc00\n#define\t\tbPSDFreq                  \t\t\t0x3ff\n#define\t\tbPSDAntennaPath           \t\t0x30\n#define\t\tbPSDIQSwitch              \t\t0x40\n#define\t\tbPSDRxTrigger             \t\t0x400000\n#define\t\tbPSDTxTrigger             \t\t0x80000000\n#define\t\tbPSDSineToneScale        \t\t0x7f000000\n#define\t\tbPSDReport                \t\t\t0xffff\n\n// 3. Page9(0x900)\n#define\t\tbOFDMTxSC                 \t\t0x30000000\t// Useless\n#define\t\tbCCKTxOn                  \t\t\t0x1\n#define\t\tbOFDMTxOn                 \t\t0x2\n#define\t\tbDebugPage                \t\t0xfff  //reset debug page and also HWord, LWord\n#define\t\tbDebugItem                \t\t0xff   //reset debug page and LWord\n#define\t\tbAntL              \t       \t\t0x10\n#define\t\tbAntNonHT           \t      \t\t\t0x100\n#define\t\tbAntHT1               \t\t\t0x1000\n#define\t\tbAntHT2                   \t\t\t0x10000\n#define\t\tbAntHT1S1                 \t\t\t0x100000\n#define\t\tbAntNonHTS1               \t\t0x1000000\n\n// 4. PageA(0xA00)\n#define\t\tbCCKBBMode                \t\t0x3\t// Useless\n#define\t\tbCCKTxPowerSaving         \t\t0x80\n#define\t\tbCCKRxPowerSaving         \t\t0x40\n\n#define\t\tbCCKSideBand              \t\t0x10\t// Reg 0xa00 rCCK0_System 20/40 switch\n\n#define\t\tbCCKScramble              \t\t0x8\t// Useless\n#define\t\tbCCKAntDiversity    \t\t      \t0x8000\n#define\t\tbCCKCarrierRecovery   \t    \t0x4000\n#define\t\tbCCKTxRate           \t\t     \t0x3000\n#define\t\tbCCKDCCancel             \t \t0x0800\n#define\t\tbCCKISICancel             \t\t0x0400\n#define\t\tbCCKMatchFilter           \t\t0x0200\n#define\t\tbCCKEqualizer             \t\t0x0100\n#define\t\tbCCKPreambleDetect       \t \t0x800000\n#define\t\tbCCKFastFalseCCA          \t\t0x400000\n#define\t\tbCCKChEstStart            \t\t0x300000\n#define\t\tbCCKCCACount              \t\t0x080000\n#define\t\tbCCKcs_lim                \t\t\t0x070000\n#define\t\tbCCKBistMode              \t\t0x80000000\n#define\t\tbCCKCCAMask             \t  \t0x40000000\n#define\t\tbCCKTxDACPhase         \t   \t0x4\n#define\t\tbCCKRxADCPhase         \t   \t0x20000000   //r_rx_clk\n#define\t\tbCCKr_cp_mode0         \t   \t0x0100\n#define\t\tbCCKTxDCOffset           \t \t0xf0\n#define\t\tbCCKRxDCOffset           \t \t0xf\n#define\t\tbCCKCCAMode              \t \t0xc000\n#define\t\tbCCKFalseCS_lim           \t\t0x3f00\n#define\t\tbCCKCS_ratio              \t\t0xc00000\n#define\t\tbCCKCorgBit_sel           \t\t0x300000\n#define\t\tbCCKPD_lim                \t\t\t0x0f0000\n#define\t\tbCCKNewCCA                \t\t0x80000000\n#define\t\tbCCKRxHPofIG              \t\t0x8000\n#define\t\tbCCKRxIG                  \t\t\t0x7f00\n#define\t\tbCCKLNAPolarity           \t\t0x800000\n#define\t\tbCCKRx1stGain             \t\t0x7f0000\n#define\t\tbCCKRFExtend              \t\t0x20000000 //CCK Rx Iinital gain polarity\n#define\t\tbCCKRxAGCSatLevel        \t \t0x1f000000\n#define\t\tbCCKRxAGCSatCount       \t  \t0xe0\n#define\t\tbCCKRxRFSettle            \t\t0x1f       //AGCsamp_dly\n#define\t\tbCCKFixedRxAGC           \t \t0x8000\n//#define bCCKRxAGCFormat         \t \t0x4000   //remove to HSSI register 0x824\n#define\t\tbCCKAntennaPolarity      \t \t0x2000\n#define\t\tbCCKTxFilterType          \t\t0x0c00\n#define\t\tbCCKRxAGCReportType   \t   \t0x0300\n#define\t\tbCCKRxDAGCEn              \t\t0x80000000\n#define\t\tbCCKRxDAGCPeriod        \t  \t0x20000000\n#define\t\tbCCKRxDAGCSatLevel     \t   \t0x1f000000\n#define\t\tbCCKTimingRecovery       \t \t0x800000\n#define\t\tbCCKTxC0                  \t\t\t0x3f0000\n#define\t\tbCCKTxC1                  \t\t\t0x3f000000\n#define\t\tbCCKTxC2                  \t\t\t0x3f\n#define\t\tbCCKTxC3                  \t\t\t0x3f00\n#define\t\tbCCKTxC4                  \t\t\t0x3f0000\n#define\t\tbCCKTxC5                  \t\t\t0x3f000000\n#define\t\tbCCKTxC6                  \t\t\t0x3f\n#define\t\tbCCKTxC7                  \t\t\t0x3f00\n#define\t\tbCCKDebugPort             \t\t0xff0000\n#define\t\tbCCKDACDebug              \t\t0x0f000000\n#define\t\tbCCKFalseAlarmEnable      \t\t0x8000\n#define\t\tbCCKFalseAlarmRead        \t\t0x4000\n#define\t\tbCCKTRSSI                 \t\t\t0x7f\n#define\t\tbCCKRxAGCReport           \t\t0xfe\n#define\t\tbCCKRxReport_AntSel       \t\t0x80000000\n#define\t\tbCCKRxReport_MFOff        \t\t0x40000000\n#define\t\tbCCKRxRxReport_SQLoss     \t0x20000000\n#define\t\tbCCKRxReport_Pktloss      \t\t0x10000000\n#define\t\tbCCKRxReport_Lockedbit    \t0x08000000\n#define\t\tbCCKRxReport_RateError    \t0x04000000\n#define\t\tbCCKRxReport_RxRate       \t\t0x03000000\n#define\t\tbCCKRxFACounterLower      \t0xff\n#define\t\tbCCKRxFACounterUpper      \t0xff000000\n#define\t\tbCCKRxHPAGCStart          \t\t0xe000\n#define\t\tbCCKRxHPAGCFinal          \t\t0x1c00       \t\t\n#define\t\tbCCKRxFalseAlarmEnable    \t0x8000\n#define\t\tbCCKFACounterFreeze       \t\t0x4000       \t\t\n#define\t\tbCCKTxPathSel             \t\t0x10000000\n#define\t\tbCCKDefaultRxPath         \t\t0xc000000\n#define\t\tbCCKOptionRxPath          \t\t0x3000000\n\n// 5. PageC(0xC00)\n#define\t\tbNumOfSTF                \t\t\t0x3\t// Useless\n#define\t\tbShift_L                 \t\t\t0xc0\n#define\t\tbGI_TH                   \t\t\t0xc\n#define\t\tbRxPathA                 \t\t\t0x1\n#define\t\tbRxPathB                 \t\t\t0x2\n#define\t\tbRxPathC                 \t\t\t0x4\n#define\t\tbRxPathD                 \t\t\t0x8\n#define\t\tbTxPathA                 \t\t\t0x1\n#define\t\tbTxPathB                 \t\t\t0x2\n#define\t\tbTxPathC                 \t\t\t0x4\n#define\t\tbTxPathD                 \t\t\t0x8\n#define\t\tbTRSSIFreq               \t\t\t0x200\n#define\t\tbADCBackoff              \t\t\t0x3000\n#define\t\tbDFIRBackoff             \t\t\t0xc000\n#define\t\tbTRSSILatchPhase         \t\t0x10000\n#define\t\tbRxIDCOffset             \t\t\t0xff\n#define\t\tbRxQDCOffset             \t\t\t0xff00\n#define\t\tbRxDFIRMode              \t\t0x1800000\n#define\t\tbRxDCNFType              \t\t0xe000000\n#define\t\tbRXIQImb_A               \t\t\t0x3ff\n#define\t\tbRXIQImb_B               \t\t\t0xfc00\n#define\t\tbRXIQImb_C               \t\t\t0x3f0000\n#define\t\tbRXIQImb_D               \t\t\t0xffc00000\n#define\t\tbDC_dc_Notch             \t\t0x60000\n#define\t\tbRxNBINotch              \t\t\t0x1f000000\n#define\t\tbPD_TH                   \t\t\t0xf\n#define\t\tbPD_TH_Opt2              \t\t0xc000\n#define\t\tbPWED_TH                 \t\t\t0x700\n#define\t\tbIfMF_Win_L              \t\t\t0x800\n#define\t\tbPD_Option               \t\t\t0x1000\n#define\t\tbMF_Win_L                \t\t\t0xe000\n#define\t\tbBW_Search_L             \t\t0x30000\n#define\t\tbwin_enh_L               \t\t\t0xc0000\n#define\t\tbBW_TH                   \t\t\t0x700000\n#define\t\tbED_TH2                  \t\t\t0x3800000\n#define\t\tbBW_option               \t\t\t0x4000000\n#define\t\tbRatio_TH                \t\t\t0x18000000\n#define\t\tbWindow_L                \t\t\t0xe0000000\n#define\t\tbSBD_Option              \t\t\t0x1\n#define\t\tbFrame_TH                \t\t\t0x1c\n#define\t\tbFS_Option               \t\t\t0x60\n#define\t\tbDC_Slope_check          \t\t0x80\n#define\t\tbFGuard_Counter_DC_L     \t\t0xe00\n#define\t\tbFrame_Weight_Short      \t\t0x7000\n#define\t\tbSub_Tune                \t\t\t0xe00000\n#define\t\tbFrame_DC_Length         \t\t0xe000000\n#define\t\tbSBD_start_offset        \t\t0x30000000\n#define\t\tbFrame_TH_2              \t\t0x7\n#define\t\tbFrame_GI2_TH            \t\t0x38\n#define\t\tbGI2_Sync_en             \t\t0x40\n#define\t\tbSarch_Short_Early       \t\t0x300\n#define\t\tbSarch_Short_Late        \t\t0xc00\n#define\t\tbSarch_GI2_Late          \t\t0x70000\n#define\t\tbCFOAntSum               \t\t0x1\n#define\t\tbCFOAcc                  \t\t\t0x2\n#define\t\tbCFOStartOffset          \t\t0xc\n#define\t\tbCFOLookBack             \t\t0x70\n#define\t\tbCFOSumWeight            \t\t0x80\n#define\t\tbDAGCEnable              \t\t\t0x10000\n#define\t\tbTXIQImb_A               \t\t\t0x3ff\n#define\t\tbTXIQImb_B               \t\t\t0xfc00\n#define\t\tbTXIQImb_C               \t\t\t0x3f0000\n#define\t\tbTXIQImb_D               \t\t\t0xffc00000\n#define\t\tbTxIDCOffset             \t\t\t0xff\n#define\t\tbTxQDCOffset             \t\t\t0xff00\n#define\t\tbTxDFIRMode              \t\t0x10000\n#define\t\tbTxPesudoNoiseOn         \t\t0x4000000\n#define\t\tbTxPesudoNoise_A         \t\t0xff\n#define\t\tbTxPesudoNoise_B         \t\t0xff00\n#define\t\tbTxPesudoNoise_C         \t\t0xff0000\n#define\t\tbTxPesudoNoise_D         \t\t0xff000000\n#define\t\tbCCADropOption           \t\t0x20000\n#define\t\tbCCADropThres            \t\t0xfff00000\n#define\t\tbEDCCA_H                 \t\t\t0xf\n#define\t\tbEDCCA_L                 \t\t\t0xf0\n#define\t\tbLambda_ED               0x300\n#define\t\tbRxInitialGain           0x7f\n#define\t\tbRxAntDivEn              0x80\n#define\t\tbRxAGCAddressForLNA      0x7f00\n#define\t\tbRxHighPowerFlow         0x8000\n#define\t\tbRxAGCFreezeThres        0xc0000\n#define\t\tbRxFreezeStep_AGC1       0x300000\n#define\t\tbRxFreezeStep_AGC2       0xc00000\n#define\t\tbRxFreezeStep_AGC3       0x3000000\n#define\t\tbRxFreezeStep_AGC0       0xc000000\n#define\t\tbRxRssi_Cmp_En           0x10000000\n#define\t\tbRxQuickAGCEn            0x20000000\n#define\t\tbRxAGCFreezeThresMode    0x40000000\n#define\t\tbRxOverFlowCheckType     0x80000000\n#define\t\tbRxAGCShift              0x7f\n#define\t\tbTRSW_Tri_Only           0x80\n#define\t\tbPowerThres              0x300\n#define\t\tbRxAGCEn                 0x1\n#define\t\tbRxAGCTogetherEn         0x2\n#define\t\tbRxAGCMin                0x4\n#define\t\tbRxHP_Ini                0x7\n#define\t\tbRxHP_TRLNA              0x70\n#define\t\tbRxHP_RSSI               0x700\n#define\t\tbRxHP_BBP1               0x7000\n#define\t\tbRxHP_BBP2               0x70000\n#define\t\tbRxHP_BBP3               0x700000\n#define\t\tbRSSI_H                  0x7f0000     //the threshold for high power\n#define\t\tbRSSI_Gen                0x7f000000   //the threshold for ant diversity\n#define\t\tbRxSettle_TRSW           0x7\n#define\t\tbRxSettle_LNA            0x38\n#define\t\tbRxSettle_RSSI           0x1c0\n#define\t\tbRxSettle_BBP            0xe00\n#define\t\tbRxSettle_RxHP           0x7000\n#define\t\tbRxSettle_AntSW_RSSI     0x38000\n#define\t\tbRxSettle_AntSW          0xc0000\n#define\t\tbRxProcessTime_DAGC      0x300000\n#define\t\tbRxSettle_HSSI           0x400000\n#define\t\tbRxProcessTime_BBPPW     0x800000\n#define\t\tbRxAntennaPowerShift     0x3000000\n#define\t\tbRSSITableSelect         0xc000000\n#define\t\tbRxHP_Final              0x7000000\n#define\t\tbRxHTSettle_BBP          0x7\n#define\t\tbRxHTSettle_HSSI         0x8\n#define\t\tbRxHTSettle_RxHP         0x70\n#define\t\tbRxHTSettle_BBPPW        0x80\n#define\t\tbRxHTSettle_Idle         0x300\n#define\t\tbRxHTSettle_Reserved     0x1c00\n#define\t\tbRxHTRxHPEn              0x8000\n#define\t\tbRxHTAGCFreezeThres      0x30000\n#define\t\tbRxHTAGCTogetherEn       0x40000\n#define\t\tbRxHTAGCMin              0x80000\n#define\t\tbRxHTAGCEn               0x100000\n#define\t\tbRxHTDAGCEn              0x200000\n#define\t\tbRxHTRxHP_BBP            0x1c00000\n#define\t\tbRxHTRxHP_Final          0xe0000000\n#define\t\tbRxPWRatioTH             0x3\n#define\t\tbRxPWRatioEn             0x4\n#define\t\tbRxMFHold                0x3800\n#define\t\tbRxPD_Delay_TH1          0x38\n#define\t\tbRxPD_Delay_TH2          0x1c0\n#define\t\tbRxPD_DC_COUNT_MAX       0x600\n//#define bRxMF_Hold               0x3800\n#define\t\tbRxPD_Delay_TH           0x8000\n#define\t\tbRxProcess_Delay         0xf0000\n#define\t\tbRxSearchrange_GI2_Early 0x700000\n#define\t\tbRxFrame_Guard_Counter_L 0x3800000\n#define\t\tbRxSGI_Guard_L           0xc000000\n#define\t\tbRxSGI_Search_L          0x30000000\n#define\t\tbRxSGI_TH                0xc0000000\n#define\t\tbDFSCnt0                 0xff\n#define\t\tbDFSCnt1                 0xff00\n#define\t\tbDFSFlag                 0xf0000       \t\t\n#define\t\tbMFWeightSum             0x300000\n#define\t\tbMinIdxTH                0x7f000000       \t\t\n#define\t\tbDAFormat                0x40000       \t\t\n#define\t\tbTxChEmuEnable           0x01000000       \t\t\n#define\t\tbTRSWIsolation_A         0x7f\n#define\t\tbTRSWIsolation_B         0x7f00\n#define\t\tbTRSWIsolation_C         0x7f0000\n#define\t\tbTRSWIsolation_D         0x7f000000       \t\t\n#define\t\tbExtLNAGain              0x7c00          \n\n// 6. PageE(0xE00)\n#define\t\tbSTBCEn                  0x4\t// Useless\n#define\t\tbAntennaMapping          0x10\n#define\t\tbNss                     0x20\n#define\t\tbCFOAntSumD              0x200\n#define\t\tbPHYCounterReset         0x8000000\n#define\t\tbCFOReportGet            0x4000000\n#define\t\tbOFDMContinueTx          0x10000000\n#define\t\tbOFDMSingleCarrier       0x20000000\n#define\t\tbOFDMSingleTone          0x40000000\n//#define bRxPath1                 0x01\n//#define bRxPath2                 0x02\n//#define bRxPath3                 0x04\n//#define bRxPath4                 0x08\n//#define bTxPath1                 0x10\n//#define bTxPath2                 0x20\n#define\t\tbHTDetect                0x100\n#define\t\tbCFOEn                   0x10000\n#define\t\tbCFOValue                0xfff00000\n#define\t\tbSigTone_Re              0x3f\n#define\t\tbSigTone_Im              0x7f00\n#define\t\tbCounter_CCA             0xffff\n#define\t\tbCounter_ParityFail      0xffff0000\n#define\t\tbCounter_RateIllegal     0xffff\n#define\t\tbCounter_CRC8Fail        0xffff0000\n#define\t\tbCounter_MCSNoSupport    0xffff\n#define\t\tbCounter_FastSync        0xffff\n#define\t\tbShortCFO                0xfff\n#define\t\tbShortCFOTLength         12   //total\n#define\t\tbShortCFOFLength         11   //fraction\n#define\t\tbLongCFO                 0x7ff\n#define\t\tbLongCFOTLength          11\n#define\t\tbLongCFOFLength          11\n#define\t\tbTailCFO                 0x1fff\n#define\t\tbTailCFOTLength          13\n#define\t\tbTailCFOFLength          12       \t\t\n#define\t\tbmax_en_pwdB             0xffff\n#define\t\tbCC_power_dB             0xffff0000\n#define\t\tbnoise_pwdB              0xffff\n#define\t\tbPowerMeasTLength        10\n#define\t\tbPowerMeasFLength        3\n#define\t\tbRx_HT_BW                0x1\n#define\t\tbRxSC                    0x6\n#define\t\tbRx_HT                   0x8       \t\t\n#define\t\tbNB_intf_det_on          0x1\n#define\t\tbIntf_win_len_cfg        0x30\n#define\t\tbNB_Intf_TH_cfg          0x1c0       \t\t\n#define\t\tbRFGain                  0x3f\n#define\t\tbTableSel                0x40\n#define\t\tbTRSW                    0x80       \t\t\n#define\t\tbRxSNR_A                 0xff\n#define\t\tbRxSNR_B                 0xff00\n#define\t\tbRxSNR_C                 0xff0000\n#define\t\tbRxSNR_D                 0xff000000\n#define\t\tbSNREVMTLength           8\n#define\t\tbSNREVMFLength           1       \t\t\n#define\t\tbCSI1st                  0xff\n#define\t\tbCSI2nd                  0xff00\n#define\t\tbRxEVM1st                0xff0000\n#define\t\tbRxEVM2nd                0xff000000       \t\t\n#define\t\tbSIGEVM                  0xff\n#define\t\tbPWDB                    0xff00\n#define\t\tbSGIEN                   0x10000\n       \t\t\n#define\t\tbSFactorQAM1             0xf\t// Useless\n#define\t\tbSFactorQAM2             0xf0\n#define\t\tbSFactorQAM3             0xf00\n#define\t\tbSFactorQAM4             0xf000\n#define\t\tbSFactorQAM5             0xf0000\n#define\t\tbSFactorQAM6             0xf0000\n#define\t\tbSFactorQAM7             0xf00000\n#define\t\tbSFactorQAM8             0xf000000\n#define\t\tbSFactorQAM9             0xf0000000\n#define\t\tbCSIScheme               0x100000\n       \t\t\n#define\t\tbNoiseLvlTopSet          0x3\t// Useless\n#define\t\tbChSmooth                0x4\n#define\t\tbChSmoothCfg1            0x38\n#define\t\tbChSmoothCfg2            0x1c0\n#define\t\tbChSmoothCfg3            0xe00\n#define\t\tbChSmoothCfg4            0x7000\n#define\t\tbMRCMode                 0x800000\n#define\t\tbTHEVMCfg                0x7000000\n       \t\t\n#define\t\tbLoopFitType             0x1\t// Useless\n#define\t\tbUpdCFO                  0x40\n#define\t\tbUpdCFOOffData           0x80\n#define\t\tbAdvUpdCFO               0x100\n#define\t\tbAdvTimeCtrl             0x800\n#define\t\tbUpdClko                 0x1000\n#define\t\tbFC                      0x6000\n#define\t\tbTrackingMode            0x8000\n#define\t\tbPhCmpEnable             0x10000\n#define\t\tbUpdClkoLTF              0x20000\n#define\t\tbComChCFO                0x40000\n#define\t\tbCSIEstiMode             0x80000\n#define\t\tbAdvUpdEqz               0x100000\n#define\t\tbUChCfg                  0x7000000\n#define\t\tbUpdEqz                  0x8000000\n\n#define\t\tbTxAGCRate18_06\t\t\t0x7f7f7f7f\t// Useless\n#define\t\tbTxAGCRate54_24\t\t\t0x7f7f7f7f\n#define\t\tbTxAGCRateMCS32\t\t\t0x7f\n#define\t\tbTxAGCRateCCK\t\t\t0x7f00\n#define\t\tbTxAGCRateMCS3_MCS0\t\t0x7f7f7f7f\n#define\t\tbTxAGCRateMCS7_MCS4\t\t0x7f7f7f7f\n#define\t\tbTxAGCRateMCS11_MCS8\t0x7f7f7f7f\n#define\t\tbTxAGCRateMCS15_MCS12\t0x7f7f7f7f\n\n//Rx Pseduo noise\n#define\t\tbRxPesudoNoiseOn         0x20000000\t// Useless\n#define\t\tbRxPesudoNoise_A         0xff\n#define\t\tbRxPesudoNoise_B         0xff00\n#define\t\tbRxPesudoNoise_C         0xff0000\n#define\t\tbRxPesudoNoise_D         0xff000000\n#define\t\tbPesudoNoiseState_A      0xffff\n#define\t\tbPesudoNoiseState_B      0xffff0000\n#define\t\tbPesudoNoiseState_C      0xffff\n#define\t\tbPesudoNoiseState_D      0xffff0000\n\n//7. RF Register\n//Zebra1\n#define\t\tbZebra1_HSSIEnable        0x8\t\t// Useless\n#define\t\tbZebra1_TRxControl        0xc00\n#define\t\tbZebra1_TRxGainSetting    0x07f\n#define\t\tbZebra1_RxCorner          0xc00\n#define\t\tbZebra1_TxChargePump      0x38\n#define\t\tbZebra1_RxChargePump      0x7\n#define\t\tbZebra1_ChannelNum        0xf80\n#define\t\tbZebra1_TxLPFBW           0x400\n#define\t\tbZebra1_RxLPFBW           0x600\n\n//Zebra4\n#define\t\tbRTL8256RegModeCtrl1      0x100\t// Useless\n#define\t\tbRTL8256RegModeCtrl0      0x40\n#define\t\tbRTL8256_TxLPFBW          0x18\n#define\t\tbRTL8256_RxLPFBW          0x600\n\n//RTL8258\n#define\t\tbRTL8258_TxLPFBW          0xc\t// Useless\n#define\t\tbRTL8258_RxLPFBW          0xc00\n#define\t\tbRTL8258_RSSILPFBW        0xc0\n\n\n//\n// Other Definition\n//\n\n//byte endable for sb_write\n#define\t\tbByte0                    0x1\t// Useless\n#define\t\tbByte1                    0x2\n#define\t\tbByte2                    0x4\n#define\t\tbByte3                    0x8\n#define\t\tbWord0                    0x3\n#define\t\tbWord1                    0xc\n#define\t\tbDWord                    0xf\n\n//for PutRegsetting & GetRegSetting BitMask\n#define\t\tbMaskByte0\t\t0xff\t// Reg 0xc50 rOFDM0_XAAGCCore~0xC6f\n#define\t\tbMaskByte1\t\t0xff00\n#define\t\tbMaskByte2\t\t0xff0000\n#define\t\tbMaskByte3\t\t0xff000000\n#define\t\tbMaskHWord\t0xffff0000\n#define\t\tbMaskLWord\t\t0x0000ffff\n#define\t\tbMaskDWord\t0xffffffff\n#define\t\tbMaskH4Bits\t\t0xf0000000\n#define\t\tbMaskH3Bytes\t0xffffff00\n#define \t\tbMaskOFDM_D\t0xffc00000\n#define\t\tbMaskCCK\t\t0x3f3f3f3f\n#define\t\tbMask12Bits\t\t0xfff\n\n//for PutRFRegsetting & GetRFRegSetting BitMask\n#if (RTL92SE_FPGA_VERIFY == 1)\n//#define\t\tbMask12Bits               0xfff\t// RF Reg mask bits\n//#define\t\tbMask20Bits               0xfff\t// RF Reg mask bits T65 RF\n#define \t\tbRFRegOffsetMask\t0xfff\t\t\n#else\n//#define\t\tbMask12Bits               0xfffff\t// RF Reg mask bits\n//#define\t\tbMask20Bits               0xfffff\t// RF Reg mask bits T65 RF\n#define \t\tbRFRegOffsetMask\t0xfffff\t\t\n#endif       \t\t\n#define\t\tbEnable                   0x1\t// Useless\n#define\t\tbDisable                  0x0\n       \t\t\n#define\t\tLeftAntenna               0x0\t// Useless\n#define\t\tRightAntenna              0x1\n       \t\t\n#define\t\ttCheckTxStatus            500   //500ms // Useless\n#define\t\ttUpdateRxCounter          100   //100ms\n       \t\t\n#define\t\trateCCK     0\t// Useless\n#define\t\trateOFDM    1\n#define\t\trateHT      2\n\n//define Register-End\n#define\t\tbPMAC_End                 0x1ff\t// Useless\n#define\t\tbFPGAPHY0_End             0x8ff\n#define\t\tbFPGAPHY1_End             0x9ff\n#define\t\tbCCKPHY0_End              0xaff\n#define\t\tbOFDMPHY0_End             0xcff\n#define\t\tbOFDMPHY1_End             0xdff\n\n//define max debug item in each debug page\n//#define bMaxItem_FPGA_PHY0        0x9\n//#define bMaxItem_FPGA_PHY1        0x3\n//#define bMaxItem_PHY_11B          0x16\n//#define bMaxItem_OFDM_PHY0        0x29\n//#define bMaxItem_OFDM_PHY1        0x0\n\n#define\t\tbPMACControl\t0x0\t\t// Useless\n#define\t\tbWMACControl\t0x1\n#define\t\tbWNICControl\t0x2\n\n#if 0\n#define\t\tANTENNA_A\t0x1\t// Useless\n#define\t\tANTENNA_B\t0x2\n#define\t\tANTENNA_AB\t0x3\t// ANTENNA_A|ANTENNA_B\n\n#define\t\tANTENNA_C\t0x4\n#define\t\tANTENNA_D\t0x8\n#endif\n\n#define RCR_AAP\t\t\tBIT(0)\t\t\t\t// accept all physical address\n#define RCR_APM\t\t\tBIT(1)\t\t\t\t// accept physical match\n#define RCR_AM\t\t\tBIT(2)\t\t\t\t// accept multicast\n#define RCR_AB\t\t\tBIT(3)\t\t\t\t// accept broadcast\n#define RCR_ACRC32\t\tBIT(5)\t\t\t\t// accept error packet\n#define RCR_9356SEL\t\tBIT(6)\n#define RCR_AICV\t\tBIT(9)\t\t\t\t// Accept ICV error packet\n#define RCR_RXFTH0\t\t(BIT(13)|BIT(14)|BIT(15))\t// Rx FIFO threshold\n#define RCR_ADF\t\t\tBIT(18)\t\t\t\t// Accept Data(frame type) frame\n#define RCR_ACF\t\t\tBIT(19)\t\t\t\t// Accept control frame\n#define RCR_AMF\t\t\tBIT(20)\t\t\t\t// Accept management frame\n#define RCR_ADD3\t\tBIT(21)\n#define RCR_APWRMGT\t\tBIT(22)\t\t\t\t// Accept power management packet\n#define RCR_CBSSID\t\tBIT(23)\t\t\t\t// Accept BSSID match packet\n#define RCR_ENMARP\t\tBIT(28)\t\t\t\t// enable mac auto reset phy\n#define RCR_EnCS1\t\tBIT(29)\t\t\t\t// enable carrier sense method 1\n#define RCR_EnCS2\t\tBIT(30)\t\t\t\t// enable carrier sense method 2\n#define RCR_OnlyErlPkt\t\tBIT(31)\t\t\t\t// Rx Early mode is performed for packet size greater than 1536\n\n/*--------------------------Define Parameters-------------------------------*/\n\n\n#endif\t//__INC_HAL8192SPHYREG_H\n\n"
  },
  {
    "path": "include/rtw_odm.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_ODM_H__\n#define __RTW_ODM_H__\n\n#include <drv_types.h>\n#include \"../hal/phydm/phydm_types.h\"\n/*\n* This file provides utilities/wrappers for rtw driver to use ODM\n*/\n\nvoid rtw_odm_dbg_comp_msg(void *sel,_adapter *adapter);\nvoid rtw_odm_dbg_comp_set(_adapter *adapter, u64 comps);\nvoid rtw_odm_dbg_level_msg(void *sel,_adapter *adapter);\nvoid rtw_odm_dbg_level_set(_adapter *adapter, u32 level);\n\nvoid rtw_odm_ability_msg(void *sel, _adapter *adapter);\nvoid rtw_odm_ability_set(_adapter *adapter, u32 ability);\n\nvoid rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter);\n\nbool rtw_odm_adaptivity_needed(_adapter *adapter);\nvoid rtw_odm_adaptivity_parm_msg(void *sel,_adapter *adapter);\nvoid rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff, s8 TH_L2H_ini_mode2, s8 TH_EDCCA_HL_diff_mode2, u8 EDCCA_enable);\nvoid rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter);\nvoid rtw_odm_acquirespinlock(_adapter *adapter,\tRT_SPINLOCK_TYPE type);\nvoid rtw_odm_releasespinlock(_adapter *adapter,\tRT_SPINLOCK_TYPE type);\n\n#ifdef CONFIG_DFS_MASTER\nVOID rtw_odm_radar_detect_reset(_adapter *adapter);\nVOID rtw_odm_radar_detect_disable(_adapter *adapter);\nVOID rtw_odm_radar_detect_enable(_adapter *adapter);\nBOOLEAN rtw_odm_radar_detect(_adapter *adapter);\n#endif /* CONFIG_DFS_MASTER */\n#endif // __RTW_ODM_H__\n\n"
  },
  {
    "path": "include/rtw_p2p.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_P2P_H_\n#define __RTW_P2P_H_\n\n\nu32 build_beacon_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_probe_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_prov_disc_request_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr );\nu32 build_assoc_resp_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code);\nu32 build_deauth_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\n#ifdef CONFIG_WFD\nu32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled);\nu32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\nu32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);\n#endif //CONFIG_WFD\n\nu32 process_probe_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);\nu32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta);\nu32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);\nu32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);\nu8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo,  u8 *pframe, uint len);\nu8 process_p2p_provdisc_resp(struct wifidirect_info *pwdinfo,  u8 *pframe);\nu8 process_p2p_group_negotation_req( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );\nu8 process_p2p_group_negotation_resp( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );\nu8 process_p2p_group_negotation_confirm( struct wifidirect_info *pwdinfo, u8 *pframe, uint len );\nu8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint len);\nint process_p2p_cross_connect_ie(PADAPTER padapter, u8 *IEs, u32 IELength);\n\nvoid p2p_protocol_wk_hdl(_adapter *padapter, int intCmdType);\n\n#ifdef CONFIG_P2P_PS\nvoid\tprocess_p2p_ps_ie(PADAPTER padapter, u8 *IEs, u32 IELength);\nvoid\tp2p_ps_wk_hdl(_adapter *padapter, u8 p2p_ps_state);\nu8\tp2p_ps_wk_cmd(_adapter*padapter, u8 p2p_ps_state, u8 enqueue);\n#endif // CONFIG_P2P_PS\n\n#ifdef CONFIG_IOCTL_CFG80211\nvoid rtw_init_cfg80211_wifidirect_info( _adapter*\tpadapter);\nint rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx);\nvoid rtw_append_wfd_ie(_adapter *padapter, u8 *buf, u32 *len);\n#endif //CONFIG_IOCTL_CFG80211\n\nvoid reset_global_wifidirect_info( _adapter* padapter );\nint rtw_init_wifi_display_info(_adapter* padapter);\nvoid rtw_init_wifidirect_timers(_adapter* padapter);\nvoid rtw_init_wifidirect_addrs(_adapter* padapter, u8 *dev_addr, u8 *iface_addr);\nvoid init_wifidirect_info( _adapter* padapter, enum P2P_ROLE role);\nint rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role);\n\nstatic inline void _rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)\n{\n\tif(wdinfo->p2p_state != state) {\n\t\t//wdinfo->pre_p2p_state = wdinfo->p2p_state;\n\t\twdinfo->p2p_state = state;\n\t}\n}\nstatic inline void _rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)\n{\n\tif(wdinfo->pre_p2p_state != state) {\n\t\twdinfo->pre_p2p_state = state;\n\t}\n}\n#if 0\nstatic inline void _rtw_p2p_restore_state(struct wifidirect_info *wdinfo)\n{\n\tif(wdinfo->pre_p2p_state != -1) {\n\t\twdinfo->p2p_state = wdinfo->pre_p2p_state;\n\t\twdinfo->pre_p2p_state = -1;\n\t}\n}\n#endif\nstatic inline void _rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role)\n{\n\tif(wdinfo->role != role) {\n\t\twdinfo->role = role;\n\t}\n}\nstatic inline int _rtw_p2p_state(struct wifidirect_info *wdinfo)\n{\n\treturn wdinfo->p2p_state;\n}\nstatic inline int _rtw_p2p_pre_state(struct wifidirect_info *wdinfo)\n{\n\treturn wdinfo->pre_p2p_state;\n}\nstatic inline int _rtw_p2p_role(struct wifidirect_info *wdinfo)\n{\n\treturn wdinfo->role;\n}\nstatic inline bool _rtw_p2p_chk_state(struct wifidirect_info *wdinfo, enum P2P_STATE state)\n{\n\treturn wdinfo->p2p_state == state;\n}\nstatic inline bool _rtw_p2p_chk_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role)\n{\n\treturn wdinfo->role == role;\n}\n\n#ifdef CONFIG_DBG_P2P\nvoid dbg_rtw_p2p_set_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line);\nvoid dbg_rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo, enum P2P_STATE state, const char *caller, int line);\n//void dbg_rtw_p2p_restore_state(struct wifidirect_info *wdinfo, const char *caller, int line);\nvoid dbg_rtw_p2p_set_role(struct wifidirect_info *wdinfo, enum P2P_ROLE role, const char *caller, int line);\n#define rtw_p2p_set_state(wdinfo, state) dbg_rtw_p2p_set_state(wdinfo, state, __FUNCTION__, __LINE__)\n#define rtw_p2p_set_pre_state(wdinfo, state) dbg_rtw_p2p_set_pre_state(wdinfo, state, __FUNCTION__, __LINE__)\n#define rtw_p2p_set_role(wdinfo, role) dbg_rtw_p2p_set_role(wdinfo, role, __FUNCTION__, __LINE__)\n//#define rtw_p2p_restore_state(wdinfo) dbg_rtw_p2p_restore_state(wdinfo, __FUNCTION__, __LINE__)\n#else //CONFIG_DBG_P2P\n#define rtw_p2p_set_state(wdinfo, state) _rtw_p2p_set_state(wdinfo, state)\n#define rtw_p2p_set_pre_state(wdinfo, state) _rtw_p2p_set_pre_state(wdinfo, state)\n#define rtw_p2p_set_role(wdinfo, role) _rtw_p2p_set_role(wdinfo, role)\n//#define rtw_p2p_restore_state(wdinfo) _rtw_p2p_restore_state(wdinfo)\n#endif //CONFIG_DBG_P2P\n\n#define rtw_p2p_state(wdinfo) _rtw_p2p_state(wdinfo)\n#define rtw_p2p_pre_state(wdinfo) _rtw_p2p_pre_state(wdinfo)\n#define rtw_p2p_role(wdinfo) _rtw_p2p_role(wdinfo)\n#define rtw_p2p_chk_state(wdinfo, state) _rtw_p2p_chk_state(wdinfo, state)\n#define rtw_p2p_chk_role(wdinfo, role) _rtw_p2p_chk_role(wdinfo, role)\n\n#define rtw_p2p_findphase_ex_set(wdinfo, value) \\\n\t(wdinfo)->find_phase_state_exchange_cnt = (value)\n\n#ifdef CONFIG_P2P\n//is this find phase exchange for social channel scan?\n#define rtw_p2p_findphase_ex_is_social(wdinfo)   \\\n\t(wdinfo)->find_phase_state_exchange_cnt >= P2P_FINDPHASE_EX_SOCIAL_FIRST\n\n//should we need find phase exchange anymore?\n#define rtw_p2p_findphase_ex_is_needed(wdinfo) \\\n\t((wdinfo)->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_MAX && \\\n\t(wdinfo)->find_phase_state_exchange_cnt != P2P_FINDPHASE_EX_NONE && \\\n\t!(wdinfo)->rx_invitereq_info.scan_op_ch_only && \\\n\t!(wdinfo)->p2p_info.scan_op_ch_only)\n#else\n#define rtw_p2p_findphase_ex_is_social(wdinfo) 0\n#define rtw_p2p_findphase_ex_is_needed(wdinfo) 0\n#endif /* CONFIG_P2P */\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_pwrctrl.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_PWRCTRL_H_\n#define __RTW_PWRCTRL_H_\n\n\n#define FW_PWR0\t0\t\n#define FW_PWR1 \t1\n#define FW_PWR2 \t2\n#define FW_PWR3 \t3\n\n\n#define HW_PWR0\t7\t\n#define HW_PWR1 \t6\n#define HW_PWR2 \t2\n#define HW_PWR3\t0\n#define HW_PWR4\t8\n\n#define FW_PWRMSK\t0x7\n\n\n#define XMIT_ALIVE\tBIT(0)\n#define RECV_ALIVE\tBIT(1)\n#define CMD_ALIVE\tBIT(2)\n#define EVT_ALIVE\tBIT(3)\n#ifdef CONFIG_BT_COEXIST\n#define BTCOEX_ALIVE\tBIT(4)\n#endif // CONFIG_BT_COEXIST\n\n#ifdef CONFIG_WOWLAN\n#define MAX_WKFM_NUM 16\t/* Frame Mask Cam number for pattern match */\n#define MAX_WKFM_SIZE\t16 /* (16 bytes for WKFM bit mask, 16*8 = 128 bits) */\n#define MAX_WKFM_PATTERN_SIZE\t128\n#define WKFMCAM_ADDR_NUM 6\n#define WKFMCAM_SIZE 24 /* each entry need 6*4 bytes */\nenum pattern_type {\n\tPATTERN_BROADCAST = 0,\n\tPATTERN_MULTICAST,\n\tPATTERN_UNICAST,\n\tPATTERN_VALID,\n\tPATTERN_INVALID,\n};\n\ntypedef struct rtl_priv_pattern {\n\tint len;\n\tchar content[MAX_WKFM_PATTERN_SIZE];\n\tchar mask[MAX_WKFM_SIZE];\n} rtl_priv_pattern_t;\n\nstruct rtl_wow_pattern {\n\tu16\tcrc;\n\tu8\ttype;\n\tu32\tmask[4];\n};\n#endif /* CONFIG_WOWLAN */\n\nenum Power_Mgnt\n{\n\tPS_MODE_ACTIVE\t= 0\t,\n\tPS_MODE_MIN\t\t\t,\n\tPS_MODE_MAX\t\t\t,\n\tPS_MODE_DTIM\t\t\t,\t//PS_MODE_SELF_DEFINED\n\tPS_MODE_VOIP\t\t\t,\n\tPS_MODE_UAPSD_WMM\t,\n\tPS_MODE_UAPSD\t\t\t,\n\tPS_MODE_IBSS\t\t\t,\n\tPS_MODE_WWLAN\t\t,\n\tPM_Radio_Off\t\t\t,\n\tPM_Card_Disable\t\t,\n\tPS_MODE_NUM,\n};\n\n#ifdef CONFIG_PNO_SUPPORT\n#define MAX_PNO_LIST_COUNT 16\n#define MAX_SCAN_LIST_COUNT 14\t//2.4G only\n#define MAX_HIDDEN_AP 8\t\t//8 hidden AP\n#endif\n\n/*\n\tBIT[2:0] = HW state\n\tBIT[3] = Protocol PS state,   0: register active state , 1: register sleep state\n\tBIT[4] = sub-state\n*/\n\n#define PS_DPS\t\t\t\tBIT(0)\n#define PS_LCLK\t\t\t\t(PS_DPS)\n#define PS_RF_OFF\t\t\tBIT(1)\n#define PS_ALL_ON\t\t\tBIT(2)\n#define PS_ST_ACTIVE\t\tBIT(3)\n\n#define PS_ISR_ENABLE\t\tBIT(4)\n#define PS_IMR_ENABLE\t\tBIT(5)\n#define PS_ACK\t\t\t\tBIT(6)\n#define PS_TOGGLE\t\t\tBIT(7)\n\n#define PS_STATE_MASK\t\t(0x0F)\n#define PS_STATE_HW_MASK\t(0x07)\n#define PS_SEQ_MASK\t\t\t(0xc0)\n\n#define PS_STATE(x)\t\t(PS_STATE_MASK & (x))\n#define PS_STATE_HW(x)\t(PS_STATE_HW_MASK & (x))\n#define PS_SEQ(x)\t\t(PS_SEQ_MASK & (x))\n\n#define PS_STATE_S0\t\t(PS_DPS)\n#define PS_STATE_S1\t\t(PS_LCLK)\n#define PS_STATE_S2\t\t(PS_RF_OFF)\n#define PS_STATE_S3\t\t(PS_ALL_ON)\n#define PS_STATE_S4\t\t((PS_ST_ACTIVE) | (PS_ALL_ON))\n\n\n#define PS_IS_RF_ON(x)\t((x) & (PS_ALL_ON))\n#define PS_IS_ACTIVE(x)\t((x) & (PS_ST_ACTIVE))\n#define CLR_PS_STATE(x)\t((x) = ((x) & (0xF0)))\n\n\nstruct reportpwrstate_parm {\n\tunsigned char mode;\n\tunsigned char state; //the CPWM value\n\tunsigned short rsvd;\n}; \n\n\ntypedef _sema _pwrlock;\n\n\n__inline static void _init_pwrlock(_pwrlock *plock)\n{\n\t_rtw_init_sema(plock, 1);\n}\n\n__inline static void _free_pwrlock(_pwrlock *plock)\n{\n\t_rtw_free_sema(plock);\n}\n\n\n__inline static void _enter_pwrlock(_pwrlock *plock)\n{\n\t_rtw_down_sema(plock);\n}\n\n\n__inline static void _exit_pwrlock(_pwrlock *plock)\n{\n\t_rtw_up_sema(plock);\n}\n\n#define LPS_DELAY_TIME\t1*HZ // 1 sec\n\n#define EXE_PWR_NONE\t0x01\n#define EXE_PWR_IPS\t\t0x02\n#define EXE_PWR_LPS\t\t0x04\n\n// RF state.\ntypedef enum _rt_rf_power_state\n{\n\trf_on,\t\t// RF is on after RFSleep or RFOff\n\trf_sleep,\t// 802.11 Power Save mode\n\trf_off,\t\t// HW/SW Radio OFF or Inactive Power Save\n\t//=====Add the new RF state above this line=====//\n\trf_max\n}rt_rf_power_state;\n\n// RF Off Level for IPS or HW/SW radio off\n#define\tRT_RF_OFF_LEVL_ASPM\t\t\tBIT(0)\t// PCI ASPM\n#define\tRT_RF_OFF_LEVL_CLK_REQ\t\tBIT(1)\t// PCI clock request\n#define\tRT_RF_OFF_LEVL_PCI_D3\t\t\tBIT(2)\t// PCI D3 mode\n#define\tRT_RF_OFF_LEVL_HALT_NIC\t\tBIT(3)\t// NIC halt, re-initialize hw parameters\n#define\tRT_RF_OFF_LEVL_FREE_FW\t\tBIT(4)\t// FW free, re-download the FW\n#define\tRT_RF_OFF_LEVL_FW_32K\t\tBIT(5)\t// FW in 32k\n#define\tRT_RF_PS_LEVEL_ALWAYS_ASPM\tBIT(6)\t// Always enable ASPM and Clock Req in initialization.\n#define\tRT_RF_LPS_DISALBE_2R\t\t\tBIT(30)\t// When LPS is on, disable 2R if no packet is received or transmittd.\n#define\tRT_RF_LPS_LEVEL_ASPM\t\t\tBIT(31)\t// LPS with ASPM\n\n#define\tRT_IN_PS_LEVEL(ppsc, _PS_FLAG)\t\t((ppsc->cur_ps_level & _PS_FLAG) ? _TRUE : _FALSE)\n#define\tRT_CLEAR_PS_LEVEL(ppsc, _PS_FLAG)\t(ppsc->cur_ps_level &= (~(_PS_FLAG)))\n#define\tRT_SET_PS_LEVEL(ppsc, _PS_FLAG)\t\t(ppsc->cur_ps_level |= _PS_FLAG)\n\n// ASPM OSC Control bit, added by Roger, 2013.03.29.\n#define\tRT_PCI_ASPM_OSC_IGNORE\t\t0\t // PCI ASPM ignore OSC control in default\n#define\tRT_PCI_ASPM_OSC_ENABLE\t\tBIT0 // PCI ASPM controlled by OS according to ACPI Spec 5.0\n#define\tRT_PCI_ASPM_OSC_DISABLE\t\tBIT1 // PCI ASPM controlled by driver or BIOS, i.e., force enable ASPM\n\n\nenum _PS_BBRegBackup_ {\n\tPSBBREG_RF0 = 0,\n\tPSBBREG_RF1,\n\tPSBBREG_RF2,\n\tPSBBREG_AFE0,\n\tPSBBREG_TOTALCNT\n};\n\nenum { // for ips_mode\n\tIPS_NONE=0,\n\tIPS_NORMAL,\n\tIPS_LEVEL_2,\t\n\tIPS_NUM\n};\n\n// Design for pwrctrl_priv.ips_deny, 32 bits for 32 reasons at most\ntypedef enum _PS_DENY_REASON\n{\n\tPS_DENY_DRV_INITIAL = 0,\n\tPS_DENY_SCAN,\n\tPS_DENY_JOIN,\n\tPS_DENY_DISCONNECT,\n\tPS_DENY_SUSPEND,\n\tPS_DENY_IOCTL,\n\tPS_DENY_MGNT_TX,\n\tPS_DENY_DRV_REMOVE = 30,\n\tPS_DENY_OTHERS = 31\n} PS_DENY_REASON;\n\n#ifdef CONFIG_PNO_SUPPORT\ntypedef struct pno_nlo_info\n{\n\tu32 fast_scan_period;\t\t\t\t//Fast scan period\n\tu8\tssid_num;\t\t\t\t//number of entry\n\tu8\thidden_ssid_num;\n\tu32\tslow_scan_period;\t\t\t//slow scan period\n\tu32\tfast_scan_iterations;\t\t\t//Fast scan iterations\n\tu8\tssid_length[MAX_PNO_LIST_COUNT];\t//SSID Length Array\n\tu8\tssid_cipher_info[MAX_PNO_LIST_COUNT];\t//Cipher information for security\n\tu8\tssid_channel_info[MAX_PNO_LIST_COUNT];\t//channel information\n\tu8\tloc_probe_req[MAX_HIDDEN_AP];\t\t//loc_probeReq\n}pno_nlo_info_t;\n\ntypedef struct pno_ssid {\n\tu32\t\tSSID_len;\n\tu8\t\tSSID[32];\n} pno_ssid_t;\n\ntypedef struct pno_ssid_list {\n\tpno_ssid_t\tnode[MAX_PNO_LIST_COUNT];\n}pno_ssid_list_t;\n\ntypedef struct pno_scan_channel_info\n{\n\tu8\tchannel;\n\tu8\ttx_power;\n\tu8\ttimeout;\n\tu8\tactive;\t\t\t\t//set 1 means active scan, or pasivite scan.\n}pno_scan_channel_info_t;\n\ntypedef struct pno_scan_info\n{\n\tu8\tenableRFE;\t\t\t//Enable RFE\n\tu8\tperiod_scan_time;\t\t//exclusive with fast_scan_period and slow_scan_period\n\tu8\tperiodScan;\t\t\t//exclusive with fast_scan_period and slow_scan_period\n\tu8\torig_80_offset;\t\t\t//original channel 80 offset\n\tu8\torig_40_offset;\t\t\t//original channel 40 offset\n\tu8\torig_bw;\t\t\t//original bandwidth\n\tu8\torig_ch;\t\t\t//original channel\n\tu8\tchannel_num;\t\t\t//number of channel\n\tu64\trfe_type;\t\t\t//rfe_type && 0x00000000000000ff\n\tpno_scan_channel_info_t ssid_channel_info[MAX_SCAN_LIST_COUNT];\n}pno_scan_info_t;\n#endif //CONFIG_PNO_SUPPORT\n\nstruct pwrctrl_priv\n{\n\t_pwrlock\tlock;\n\t_pwrlock\tcheck_32k_lock;\n\tvolatile u8 rpwm; // requested power state for fw\n\tvolatile u8 cpwm; // fw current power state. updated when 1. read from HCPWM 2. driver lowers power level\n\tvolatile u8 tog; // toggling\n\tvolatile u8 cpwm_tog; // toggling\n\n\tu8\tpwr_mode;\n\tu8\tsmart_ps;\n\tu8\tbcn_ant_mode;\n\tu8 \tdtim;\n\n\tu32\talives;\n\t_workitem cpwm_event;\n#ifdef CONFIG_LPS_RPWM_TIMER\n\tu8 brpwmtimeout;\n\t_workitem rpwmtimeoutwi;\n\t_timer pwr_rpwm_timer;\n#endif // CONFIG_LPS_RPWM_TIMER\n\tu8\tbpower_saving; //for LPS/IPS\n\n\tu8\tb_hw_radio_off;\n\tu8\treg_rfoff;\n\tu8\treg_pdnmode; //powerdown mode\n\tu32\trfoff_reason;\n\n\t//RF OFF Level\n\tu32\tcur_ps_level;\n\tu32\treg_rfps_level;\n\n\tuint \tips_enter_cnts;\n\tuint \tips_leave_cnts;\n\tuint \tlps_enter_cnts;\n\tuint \tlps_leave_cnts;\n\n\tu8\tips_mode; \n\tu8\tips_org_mode; \n\tu8\tips_mode_req; // used to accept the mode setting request, will update to ipsmode later\n\tuint bips_processing;\n\tu32 ips_deny_time; /* will deny IPS when system time is smaller than this */\n\tu8 pre_ips_type;// 0: default flow, 1: carddisbale flow\n\n\t// ps_deny: if 0, power save is free to go; otherwise deny all kinds of power save.\n\t// Use PS_DENY_REASON to decide reason.\n\t// Don't access this variable directly without control function,\n\t// and this variable should be protected by lock.\n\tu32 ps_deny;\n\n\tu8 ps_processing; /* temporarily used to mark whether in rtw_ps_processor */\n\n\tu8 fw_psmode_iface_id;\n\tu8\tbLeisurePs;\n\tu8\tLpsIdleCount;\n\tu8\tpower_mgnt;\n\tu8\torg_power_mgnt;\n\tu8\tbFwCurrentInPSMode;\n\tu32\tDelayLPSLastTimeStamp;\n\ts32\t\tpnp_current_pwr_state;\n\tu8\t\tpnp_bstop_trx;\n\n\n\tu8\t\tbInternalAutoSuspend;\n\tu8\t\tbInSuspend;\n#ifdef\tCONFIG_BT_COEXIST\n\tu8\t\tbAutoResume;\n\tu8\t\tautopm_cnt;\n#endif\n\tu8\t\tbSupportRemoteWakeup;\t\n\tu8\t\twowlan_wake_reason;\n\tu8\t\twowlan_ap_mode;\n\tu8\t\twowlan_mode;\n\tu8\t\twowlan_p2p_mode;\n\tu8\t\twowlan_pno_enable;\n#ifdef CONFIG_GPIO_WAKEUP\n\tu8\t\tis_high_active;\n#endif /* CONFIG_GPIO_WAKEUP */\n#ifdef CONFIG_WOWLAN\n\tu8\t\twowlan_txpause_status;\n\tu8\t\twowlan_pattern;\n\tu8\t\twowlan_pattern_idx;\n\tu64\t\twowlan_fw_iv;\n\tstruct rtl_priv_pattern\tpatterns[MAX_WKFM_NUM];\n#ifdef CONFIG_PNO_SUPPORT\n\tu8\t\tpno_in_resume;\n\tu8\t\tpno_inited;\n\tpno_nlo_info_t\t*pnlo_info;\n\tpno_scan_info_t\t*pscan_info;\n\tpno_ssid_list_t\t*pno_ssid_list;\n#endif /* CONFIG_PNO_SUPPORT */\n#endif /* CONFIG_WOWLAN */\n\t_timer \tpwr_state_check_timer;\n\tint\t\tpwr_state_check_interval;\n\tu8\t\tpwr_state_check_cnts;\n\n\tint \t\tps_flag; /* used by autosuspend */\n\t\n\trt_rf_power_state\trf_pwrstate;//cur power state, only for IPS\n\t//rt_rf_power_state \tcurrent_rfpwrstate;\n\trt_rf_power_state\tchange_rfpwrstate;\n\n\tu8\t\tbHWPowerdown; /* power down mode selection. 0:radio off, 1:power down */\n\tu8\t\tbHWPwrPindetect; /* come from registrypriv.hwpwrp_detect. enable power down function. 0:disable, 1:enable */\n\tu8\t\tbkeepfwalive;\n\tu8\t\tbrfoffbyhw;\n\tunsigned long PS_BBRegBackup[PSBBREG_TOTALCNT];\n\n\t#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\tstruct workqueue_struct *rtw_workqueue;\n\t_workitem resume_work;\n\t#endif\n\n\t#ifdef CONFIG_HAS_EARLYSUSPEND\n\tstruct early_suspend early_suspend;\n\tu8 do_late_resume;\n\t#endif //CONFIG_HAS_EARLYSUSPEND\n\t\n\t#ifdef CONFIG_ANDROID_POWER\n\tandroid_early_suspend_t early_suspend;\n\tu8 do_late_resume;\n\t#endif\n\n\t#ifdef CONFIG_INTEL_PROXIM\n\tu8\tstored_power_mgnt;\n\t#endif\n};\n\n#define rtw_get_ips_mode_req(pwrctl) \\\n\t(pwrctl)->ips_mode_req\n\n#define rtw_ips_mode_req(pwrctl, ips_mode) \\\n\t(pwrctl)->ips_mode_req = (ips_mode)\n\n#define RTW_PWR_STATE_CHK_INTERVAL 2000\n\n#define _rtw_set_pwr_state_check_timer(pwrctl, ms) \\\n\tdo { \\\n\t\t/*DBG_871X(\"%s _rtw_set_pwr_state_check_timer(%p, %d)\\n\", __FUNCTION__, (pwrctl), (ms));*/ \\\n\t\t_set_timer(&(pwrctl)->pwr_state_check_timer, (ms)); \\\n\t} while(0)\n\t\n#define rtw_set_pwr_state_check_timer(pwrctl) \\\n\t_rtw_set_pwr_state_check_timer((pwrctl), (pwrctl)->pwr_state_check_interval)\n\nextern void rtw_init_pwrctrl_priv(_adapter *adapter);\nextern void rtw_free_pwrctrl_priv(_adapter * adapter);\n\n#ifdef CONFIG_LPS_LCLK\ns32 rtw_register_task_alive(PADAPTER, u32 task);\nvoid rtw_unregister_task_alive(PADAPTER, u32 task);\nextern s32 rtw_register_tx_alive(PADAPTER padapter);\nextern void rtw_unregister_tx_alive(PADAPTER padapter);\nextern s32 rtw_register_rx_alive(PADAPTER padapter);\nextern void rtw_unregister_rx_alive(PADAPTER padapter);\nextern s32 rtw_register_cmd_alive(PADAPTER padapter);\nextern void rtw_unregister_cmd_alive(PADAPTER padapter);\nextern s32 rtw_register_evt_alive(PADAPTER padapter);\nextern void rtw_unregister_evt_alive(PADAPTER padapter);\nextern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportpwrstate);\nextern void LPS_Leave_check(PADAPTER padapter);\n#endif\n\nextern void LeaveAllPowerSaveMode(PADAPTER Adapter);\nextern void LeaveAllPowerSaveModeDirect(PADAPTER Adapter);\n#ifdef CONFIG_IPS\nvoid _ips_enter(_adapter * padapter);\nvoid ips_enter(_adapter * padapter);\nint _ips_leave(_adapter * padapter);\nint ips_leave(_adapter * padapter);\n#endif\n\nvoid rtw_ps_processor(_adapter*padapter);\n\n#ifdef CONFIG_AUTOSUSPEND\nint autoresume_enter(_adapter* padapter);\n#endif\n#ifdef SUPPORT_HW_RFOFF_DETECTED\nrt_rf_power_state RfOnOffDetect(IN\tPADAPTER pAdapter );\n#endif\n\n\nint rtw_fw_ps_state(PADAPTER padapter);\n\n#ifdef CONFIG_LPS\ns32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms);\nvoid LPS_Enter(PADAPTER padapter, const char *msg);\nvoid LPS_Leave(PADAPTER padapter, const char *msg);\nvoid traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);\nvoid rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);\nvoid rtw_set_fw_in_ips_mode(PADAPTER padapter, u8 enable);\nvoid rtw_set_rpwm(_adapter * padapter, u8 val8);\n#endif\n\n#ifdef CONFIG_RESUME_IN_WORKQUEUE\nvoid rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv);\n#endif //CONFIG_RESUME_IN_WORKQUEUE\n\n#if defined(CONFIG_HAS_EARLYSUSPEND ) || defined(CONFIG_ANDROID_POWER)\nbool rtw_is_earlysuspend_registered(struct pwrctrl_priv *pwrpriv);\nbool rtw_is_do_late_resume(struct pwrctrl_priv *pwrpriv);\nvoid rtw_set_do_late_resume(struct pwrctrl_priv *pwrpriv, bool enable);\nvoid rtw_register_early_suspend(struct pwrctrl_priv *pwrpriv);\nvoid rtw_unregister_early_suspend(struct pwrctrl_priv *pwrpriv);\n#else\n#define rtw_is_earlysuspend_registered(pwrpriv) _FALSE\n#define rtw_is_do_late_resume(pwrpriv) _FALSE\n#define rtw_set_do_late_resume(pwrpriv, enable) do {} while (0)\n#define rtw_register_early_suspend(pwrpriv) do {} while (0)\n#define rtw_unregister_early_suspend(pwrpriv) do {} while (0)\n#endif /* CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER */\n\nu8 rtw_interface_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id,u8* val);\nvoid rtw_set_ips_deny(_adapter *padapter, u32 ms);\nint _rtw_pwr_wakeup(_adapter *padapter, u32 ips_deffer_ms, const char *caller);\n#define rtw_pwr_wakeup(adapter) _rtw_pwr_wakeup(adapter, RTW_PWR_STATE_CHK_INTERVAL, __FUNCTION__)\n#define rtw_pwr_wakeup_ex(adapter, ips_deffer_ms) _rtw_pwr_wakeup(adapter, ips_deffer_ms, __FUNCTION__)\nint rtw_pm_set_ips(_adapter *padapter, u8 mode);\nint rtw_pm_set_lps(_adapter *padapter, u8 mode);\n\nvoid rtw_ps_deny(PADAPTER padapter, PS_DENY_REASON reason);\nvoid rtw_ps_deny_cancel(PADAPTER padapter, PS_DENY_REASON reason);\nu32 rtw_ps_deny_get(PADAPTER padapter);\n\n#if defined(CONFIG_WOWLAN)\nvoid rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip);\nvoid rtw_get_sec_iv(PADAPTER padapter, u8 *pcur_dot11txpn, u8 *StaAddr);\nvoid rtw_set_sec_pn(_adapter *padapter);\nbool rtw_check_pattern_valid(u8 *input, u8 len);\nbool rtw_write_to_frame_mask(_adapter *adapter, u8 idx,\n\t\tstruct rtl_wow_pattern *content);\n\nbool rtw_read_from_frame_mask(_adapter *adapter, u8 idx);\nvoid rtw_dump_priv_pattern(_adapter *adapter, u8 idx);\nvoid rtw_clean_pattern(_adapter *adapter);\n#endif /* CONFIG_WOWLAN */\n#endif  //__RTL871X_PWRCTRL_H_\n\n"
  },
  {
    "path": "include/rtw_qos.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#ifndef _RTW_QOS_H_\n#define _RTW_QOS_H_\n\n\n\nstruct\tqos_priv\t{\n\t\n\tunsigned int\t  qos_option;\t//bit mask option: u-apsd, s-apsd, ts, block ack...\t\t\n\n};\n\n\n#endif\t//_RTL871X_QOS_H_\n\n"
  },
  {
    "path": "include/rtw_recv.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_RECV_H_\n#define _RTW_RECV_H_\n\n#ifdef PLATFORM_OS_XP\n\t#ifdef CONFIG_SDIO_HCI\n\t\t#define NR_RECVBUFF 1024//512//128\n\t#else\n\t\t#define NR_RECVBUFF (16)\n\t#endif\n#elif defined(PLATFORM_OS_CE)\n\t#ifdef CONFIG_SDIO_HCI\n\t\t#define NR_RECVBUFF (128)\n\t#else\n\t\t#define NR_RECVBUFF (4)\n\t#endif\n#else //PLATFORM_LINUX /PLATFORM_BSD\n\n\t#ifdef CONFIG_SINGLE_RECV_BUF\n\t\t#define NR_RECVBUFF (1)\n\t#else\n\t\t#if defined(CONFIG_GSPI_HCI)\n\t\t\t#define NR_RECVBUFF (32)\n\t\t#elif defined(CONFIG_SDIO_HCI)\n\t\t\t#define NR_RECVBUFF (8)\t\n\t\t#else\n\t\t\t#define NR_RECVBUFF (8)\n\t\t#endif\t\n\t#endif //CONFIG_SINGLE_RECV_BUF\n\t#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t#define NR_PREALLOC_RECV_SKB (rtw_rtkm_get_nr_recv_skb()>>1)\n\t#else /*!CONFIG_PREALLOC_RX_SKB_BUFFER */\n\t\t#define NR_PREALLOC_RECV_SKB 8\n\t#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */\n\n#endif\n\n#define NR_RECVFRAME 256\n\n#define RXFRAME_ALIGN\t8\n#define RXFRAME_ALIGN_SZ\t(1<<RXFRAME_ALIGN)\n\n#define DRVINFO_SZ\t4 // unit is 8bytes\n\n#define MAX_RXFRAME_CNT\t512\n#define MAX_RX_NUMBLKS\t\t(32)\n#define RECVFRAME_HDR_ALIGN 128\n#define MAX_CONTINUAL_NORXPACKET_COUNT 1    /*  In MAX_CONTINUAL_NORXPACKET_COUNT*2 sec  , no rx traffict would issue DELBA*/\n\n#define PHY_RSSI_SLID_WIN_MAX\t\t\t\t100\n#define PHY_LINKQUALITY_SLID_WIN_MAX\t\t20\n\n\n#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)\n\n#define RX_MPDU_QUEUE\t\t\t\t0\n#define RX_CMD_QUEUE\t\t\t\t1\n#define RX_MAX_QUEUE\t\t\t\t2\n\nstatic u8 SNAP_ETH_TYPE_IPX[2] = {0x81, 0x37};\n\nstatic u8 SNAP_ETH_TYPE_APPLETALK_AARP[2] = {0x80, 0xf3};\nstatic u8 SNAP_ETH_TYPE_APPLETALK_DDP[2] = {0x80, 0x9b};\nstatic u8 SNAP_ETH_TYPE_TDLS[2] = {0x89, 0x0d};\nstatic u8 SNAP_HDR_APPLETALK_DDP[3] = {0x08, 0x00, 0x07}; // Datagram Delivery Protocol\n\nstatic u8 oui_8021h[] = {0x00, 0x00, 0xf8};\nstatic u8 oui_rfc1042[]= {0x00,0x00,0x00};\n\n#define MAX_SUBFRAME_COUNT\t64\nstatic u8 rtw_rfc1042_header[] =\n{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };\n/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */\nstatic u8 rtw_bridge_tunnel_header[] =\n{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };\n\n//for Rx reordering buffer control\nstruct recv_reorder_ctrl\n{\n\t_adapter\t*padapter;\n\tu8 enable;\n\tu16 indicate_seq;//=wstart_b, init_value=0xffff\n\tu16 wend_b;\n\tu8 wsize_b;\n\tu8 ampdu_size;\n\t_queue pending_recvframe_queue;\n\t_timer reordering_ctrl_timer;\n};\n\nstruct\tstainfo_rxcache\t{\n\tu16 \ttid_rxseq[16];\n/*\n\tunsigned short \ttid0_rxseq;\n\tunsigned short \ttid1_rxseq;\n\tunsigned short \ttid2_rxseq;\n\tunsigned short \ttid3_rxseq;\n\tunsigned short \ttid4_rxseq;\n\tunsigned short \ttid5_rxseq;\n\tunsigned short \ttid6_rxseq;\n\tunsigned short \ttid7_rxseq;\n\tunsigned short \ttid8_rxseq;\n\tunsigned short \ttid9_rxseq;\n\tunsigned short \ttid10_rxseq;\n\tunsigned short \ttid11_rxseq;\n\tunsigned short \ttid12_rxseq;\n\tunsigned short \ttid13_rxseq;\n\tunsigned short \ttid14_rxseq;\n\tunsigned short \ttid15_rxseq;\n*/\n};\n\n\nstruct smooth_rssi_data {\n\tu32\telements[100];\t//array to store values\n\tu32\tindex;\t\t\t//index to current array to store\n\tu32\ttotal_num;\t\t//num of valid elements\n\tu32\ttotal_val;\t\t//sum of valid elements\n};\n\nstruct signal_stat {\n\tu8\tupdate_req;\t\t//used to indicate \n\tu8\tavg_val;\t\t//avg of valid elements\n\tu32\ttotal_num;\t\t//num of valid elements\n\tu32\ttotal_val;\t\t//sum of valid elements\t\n};\n/*\ntypedef struct _ODM_Phy_Status_Info_\n{\n\t//\n\t// Be care, if you want to add any element please insert between \n\t// RxPWDBAll & SignalStrength.\n\t//\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN))\n\tu4Byte\t\tRxPWDBAll;\t\n#else\n\tu1Byte\t\tRxPWDBAll;\t\n#endif\n\n\tu1Byte\t\tSignalQuality;\t \t\t// in 0-100 index. \n\ts1Byte\t\tRxMIMOSignalQuality[4];\t//per-path's EVM\n\tu1Byte\t\tRxMIMOEVMdbm[4]; \t\t//per-path's EVM dbm\n\n\tu1Byte\t\tRxMIMOSignalStrength[4];// in 0~100 index\n\n\tu2Byte\t\tCfo_short[4]; \t\t\t// per-path's Cfo_short\n\tu2Byte\t\tCfo_tail[4];\t\t\t// per-path's Cfo_tail\n\t\n#if (DM_ODM_SUPPORT_TYPE &  (ODM_WIN|ODM_CE))\n\ts1Byte\t\tRxPower;\t\t\t\t// in dBm Translate from PWdB\n\ts1Byte\t\tRecvSignalPower;\t\t// Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures.\n\tu1Byte\t\tBTRxRSSIPercentage;\t\n\tu1Byte\t\tSignalStrength; \t\t// in 0-100 index.\n \n\tu1Byte\t\tRxPwr[4];\t\t\t\t//per-path's pwdb\n#endif\n\tu1Byte\t\tRxSNR[4];\t\t\t\t//per-path's SNR\t\n\tu1Byte\t\tBandWidth;\n\tu1Byte\t\tbtCoexPwrAdjust;\n}ODM_PHY_INFO_T,*PODM_PHY_INFO_T;\n*/\n\nstruct phy_info\n{\t\t\n\tu8\t\t\tRxPWDBAll;\n\tu8\t\t\tSignalQuality;\t\t\t\t/* in 0-100 index. */\n\ts8\t\t\tRxMIMOSignalQuality[4];\t\t/* per-path's EVM */\n\tu8\t\t\tRxMIMOEVMdbm[4];\t\t\t/* per-path's EVM dbm */\n\tu8\t\t\tRxMIMOSignalStrength[4];\t/* in 0~100 index */\n\ts16\t\t\tCfo_short[4];\t\t\t\t/* per-path's Cfo_short */\n\ts16\t\t\tCfo_tail[4];\t\t\t\t\t/* per-path's Cfo_tail */\n\ts8\t\t\tRxPower;\t\t\t\t\t/* in dBm Translate from PWdB */\n\ts8\t\t\tRecvSignalPower;\t\t\t/* Real power in dBm for this packet, no beautification and aggregation. Keep this raw info to be used for the other procedures. */\n\tu8\t\t\tBTRxRSSIPercentage;\t\n\tu8\t\t\tSignalStrength;\t\t\t\t/* in 0-100 index. */\n\ts8\t\t\tRxPwr[4];\t\t\t\t\t/* per-path's pwdb */\n\ts8\t\t\tRxSNR[4];\n#if (RTL8822B_SUPPORT == 1)\n\tu8\t\t\tRxCount:2;\n\tu8\t\t\tBandWidth:2;\n\tu8\t\t\trxsc:4;\n#else\n\tu8\t\t\tBandWidth;\n#endif\n\tu8\t\t\tbtCoexPwrAdjust;\n#if (RTL8822B_SUPPORT == 1)\n\tu8\t\t\tchannel;\t\t\t\t\t\t/* channel number---*/\n\tBOOLEAN\t\tbMuPacket;\t\t\t\t\t/* is MU packet or not---*/\n\tBOOLEAN\t\tbBeamformed;\n#endif\n};\n\nstruct rx_raw_rssi {\n\tu8 data_rate;\n\tu8 pwdball;\n\ts8 pwr_all;\n\t\n\tu8 mimo_signal_strength[4];/* in 0~100 index */\n\tu8 mimo_signal_quality[4];\n\t\n\ts8 ofdm_pwr[4];\n\tu8 ofdm_snr[4];\n};\n\nstruct rx_pkt_attrib\t{\n\tu16\tpkt_len;\n\tu8\tphyst;\n\tu8\tdrvinfo_sz;\n\tu8\tshift_sz;\n\tu8\thdrlen; //the WLAN Header Len\n\tu8 \tto_fr_ds;\n\tu8 \tamsdu;\n\tu8\tqos;\n\tu8\tpriority;\n\tu8\tpw_save;\n\tu8\tmdata;\n\tu16\tseq_num;\n\tu8\tfrag_num;\n\tu8\tmfrag;\n\tu8\torder;\n\tu8\tprivacy; //in frame_ctrl field\n\tu8\tbdecrypted;\n\tu8\tencrypt; //when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith\n\tu8\tiv_len;\n\tu8\ticv_len;\n\tu8\tcrc_err;\n\tu8\ticv_err;\n\n\tu16\teth_type;\n\n\tu8 \tdst[ETH_ALEN];\n\tu8 \tsrc[ETH_ALEN];\n\tu8 \tta[ETH_ALEN];\n\tu8 \tra[ETH_ALEN];\n\tu8 \tbssid[ETH_ALEN];\n\t\n\tu8\tack_policy;\n\t\n//#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX\n\tu8\ttcpchk_valid; // 0: invalid, 1: valid\n\tu8\tip_chkrpt; //0: incorrect, 1: correct\n\tu8\ttcp_chkrpt; //0: incorrect, 1: correct\n//#endif\n\tu8 \tkey_index;\n\n\tu8\tdata_rate;\n\tu8\tbw;\n\tu8\tstbc;\n\tu8\tldpc;\n\tu8 \tsgi;\n\tu8 \tpkt_rpt_type;\n\tu32 tsfl;\n\tu32\tMacIDValidEntry[2];\t// 64 bits present 64 entry.\n\n/*\n\tu8\tsignal_qual;\n\ts8\trx_mimo_signal_qual[2];\n\tu8\tsignal_strength;\n\tu32\tRxPWDBAll;\t\n\ts32\tRecvSignalPower;\n*/\n\tstruct phy_info phy_info;\n};\n\n\n//These definition is used for Rx packet reordering.\n#define SN_LESS(a, b)\t\t(((a-b)&0x800)!=0)\n#define SN_EQUAL(a, b)\t(a == b)\n//#define REORDER_WIN_SIZE\t128\n//#define REORDER_ENTRY_NUM\t128\n#define REORDER_WAIT_TIME\t(50) // (ms)\n\n#define RECVBUFF_ALIGN_SZ 8\n\n#if (defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8814A)) && defined(CONFIG_PCI_HCI)\n#define RXBD_SIZE\tsizeof(struct recv_stat)\t\n#endif\n\n#define RXDESC_SIZE\t24\n#define RXDESC_OFFSET RXDESC_SIZE\n\nstruct recv_stat\n{\n\tunsigned int rxdw0;\n\n\tunsigned int rxdw1;\n\n#if !((defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8814A)) && defined(CONFIG_PCI_HCI))  /* exclude 8192ee, 8814ae */\n\tunsigned int rxdw2;\n\n\tunsigned int rxdw3;\n#endif\n\n#ifndef BUF_DESC_ARCH\n\tunsigned int rxdw4;\n\n\tunsigned int rxdw5;\n\n#ifdef CONFIG_PCI_HCI\n\tunsigned int rxdw6;\n\n\tunsigned int rxdw7;\n#endif\n#endif //if BUF_DESC_ARCH is defined, rx_buf_desc occupy 4 double words\n};\n\n#define EOR BIT(30)\n\n#ifdef CONFIG_PCI_HCI\n#define PCI_MAX_RX_QUEUE\t\t1// MSDU packet queue, Rx Command Queue\n#define PCI_MAX_RX_COUNT\t\t128\n\nstruct rtw_rx_ring {\n\tstruct recv_stat\t*desc;\n\tdma_addr_t\t\tdma;\n\tunsigned int\t\tidx;\n\tstruct sk_buff\t*rx_buf[PCI_MAX_RX_COUNT];\n};\n#endif\n\n\n\n/*\naccesser of recv_priv: rtw_recv_entry(dispatch / passive level); recv_thread(passive) ; returnpkt(dispatch)\n; halt(passive) ;\n\nusing enter_critical section to protect\n*/\nstruct recv_priv\n{\n\t_lock\tlock;\n\n#ifdef CONFIG_RECV_THREAD_MODE\n\t_sema\trecv_sema;\n\t_sema\tterminate_recvthread_sema;\n#endif\n\n\t//_queue\tblk_strms[MAX_RX_NUMBLKS];    // keeping the block ack frame until return ack\n\t_queue\tfree_recv_queue;\n\t_queue\trecv_pending_queue;\n\t_queue\tuc_swdec_pending_queue;\n\n\n\tu8 *pallocated_frame_buf;\n\tu8 *precv_frame_buf;\n\n\tuint free_recvframe_cnt;\n\n\t_adapter\t*adapter;\n\n#ifdef PLATFORM_WINDOWS\n\t_nic_hdl  RxPktPoolHdl;\n\t_nic_hdl  RxBufPoolHdl;\n\n#ifdef PLATFORM_OS_XP\n\tPMDL\tpbytecnt_mdl;\n#endif\n\tuint\tcounter; //record the number that up-layer will return to drv; only when counter==0 can we  release recv_priv\n\tNDIS_EVENT \trecv_resource_evt ;\n#endif\n\n\tu32\tbIsAnyNonBEPkts;\n\tu64\trx_bytes;\n\tu64\trx_pkts;\n\tu64\trx_drop;\n\n\tuint  rx_icv_err;\n\tuint  rx_largepacket_crcerr;\n\tuint  rx_smallpacket_crcerr;\n\tuint  rx_middlepacket_crcerr;\n\n#ifdef CONFIG_USB_HCI\n\t//u8 *pallocated_urb_buf;\n\t_sema allrxreturnevt;\n\tuint\tff_hwaddr;\n\tATOMIC_T\trx_pending_cnt;\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n#ifdef PLATFORM_LINUX\n\tPURB\tint_in_urb;\n#endif\n\n\tu8\t*int_in_buf;\n#endif //CONFIG_USB_INTERRUPT_IN_PIPE\n\n#endif\n#if defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)\n#ifdef PLATFORM_FREEBSD\n\tstruct task irq_prepare_beacon_tasklet;\n\tstruct task recv_tasklet;\n#else //PLATFORM_FREEBSD\n\tstruct tasklet_struct irq_prepare_beacon_tasklet;\n\tstruct tasklet_struct recv_tasklet;\n#endif //PLATFORM_FREEBSD\n\tstruct sk_buff_head free_recv_skb_queue;\n\tstruct sk_buff_head rx_skb_queue;\n#ifdef CONFIG_RX_INDICATE_QUEUE\n\tstruct task rx_indicate_tasklet;\n\tstruct ifqueue rx_indicate_queue;\n#endif\t// CONFIG_RX_INDICATE_QUEUE\n\n#endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)\n\n\tu8 *pallocated_recv_buf;\n\tu8 *precv_buf;    // 4 alignment\n\t_queue\tfree_recv_buf_queue;\n\tu32\tfree_recv_buf_queue_cnt;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_USB_HCI) \n\t_queue\trecv_buf_pending_queue;\n#endif\n\n#ifdef CONFIG_PCI_HCI\n\t// Rx\n\tstruct rtw_rx_ring\trx_ring[PCI_MAX_RX_QUEUE];\n\tint \trxringcount;\n\tu16\trxbuffersize;\n#endif\n\n\t//For display the phy informatiom\n\tu8 is_signal_dbg;\t// for debug\n\tu8 signal_strength_dbg;\t// for debug\n\t\n\tu8 signal_strength;\n\tu8 signal_qual;\n\ts8 rssi;\t//translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);\n\tstruct rx_raw_rssi raw_rssi_info;\n\t//s8 rxpwdb;\t\n\ts16 noise;\t\n\t//int RxSNRdB[2];\n\t//s8 RxRssi[2];\n\t//int FalseAlmCnt_all;\n\t\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\t_timer signal_stat_timer;\n\tu32 signal_stat_sampling_interval;\n\t//u32 signal_stat_converging_constant;\n\tstruct signal_stat signal_qual_data;\n\tstruct signal_stat signal_strength_data;\n#else //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tstruct smooth_rssi_data signal_qual_data;\n\tstruct smooth_rssi_data signal_strength_data;\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\tu16 sink_udpport,pre_rtp_rxseq,cur_rtp_rxseq;\n\n\tBOOLEAN store_law_data_flag;\n};\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n#define rtw_set_signal_stat_timer(recvpriv) _set_timer(&(recvpriv)->signal_stat_timer, (recvpriv)->signal_stat_sampling_interval)\n#endif //CONFIG_NEW_SIGNAL_STAT_PROCESS\n\nstruct sta_recv_priv {\n\n\t_lock\tlock;\n\tsint\toption;\n\n\t//_queue\tblk_strms[MAX_RX_NUMBLKS];\n\t_queue defrag_q;\t //keeping the fragment frame until defrag\n\n\tstruct\tstainfo_rxcache rxcache;\n\n\t//uint\tsta_rx_bytes;\n\t//uint\tsta_rx_pkts;\n\t//uint\tsta_rx_fail;\n\n};\n\n\nstruct recv_buf\n{\n\t_list list;\n\n\t_lock recvbuf_lock;\n\n\tu32\tref_cnt;\n\n\tPADAPTER adapter;\n\n\tu8\t*pbuf;\n\tu8\t*pallocated_buf;\n\n\tu32\tlen;\n\tu8\t*phead;\n\tu8\t*pdata;\n\tu8\t*ptail;\n\tu8\t*pend;\n\n#ifdef CONFIG_USB_HCI\n\n\t#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX)||defined(PLATFORM_FREEBSD)\n\tPURB\tpurb;\n\tdma_addr_t dma_transfer_addr;\t/* (in) dma addr for transfer_buffer */\n\tu32 alloc_sz;\n\t#endif\n\n\t#ifdef PLATFORM_OS_XP\n\tPIRP\t\tpirp;\n\t#endif\n\n\t#ifdef PLATFORM_OS_CE\n\tUSB_TRANSFER\tusb_transfer_read_port;\n\t#endif\n\n\tu8  irp_pending;\n\tint  transfer_len;\n\n#endif\n\n#ifdef PLATFORM_LINUX\n\t_pkt\t*pskb;\n#endif\n#ifdef PLATFORM_FREEBSD //skb solution\n\tstruct sk_buff *pskb;\n#endif //PLATFORM_FREEBSD //skb solution\n};\n\n\n/*\n\thead  ----->\n\n\t\tdata  ----->\n\n\t\t\tpayload\n\n\t\ttail  ----->\n\n\n\tend   ----->\n\n\tlen = (unsigned int )(tail - data);\n\n*/\nstruct recv_frame_hdr\n{\n\t_list\tlist;\n#ifndef CONFIG_BSD_RX_USE_MBUF\n\tstruct sk_buff\t *pkt;\n\tstruct sk_buff\t *pkt_newalloc;\n#else // CONFIG_BSD_RX_USE_MBUF\n\t_pkt\t*pkt;\n\t_pkt *pkt_newalloc;\n#endif // CONFIG_BSD_RX_USE_MBUF\n\n\t_adapter  *adapter;\n\n\tu8 fragcnt;\n\n\tint frame_tag;\n\n\tstruct rx_pkt_attrib attrib;\n\n\tuint  len;\n\tu8 *rx_head;\n\tu8 *rx_data;\n\tu8 *rx_tail;\n\tu8 *rx_end;\n\n\tvoid *precvbuf;\n\n\n\t//\n\tstruct sta_info *psta;\n\n\t//for A-MPDU Rx reordering buffer control\n\tstruct recv_reorder_ctrl *preorder_ctrl;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tu8 UserPriority;\n\tu8 WapiTempPN[16];\n\tu8 WapiSrcAddr[6];\n\tu8 bWapiCheckPNInDecrypt;\n\tu8 bIsWaiPacket;\n#endif\n\n};\n\n\nunion recv_frame{\n\n\tunion{\n\t\t_list list;\n\t\tstruct recv_frame_hdr hdr;\n\t\tuint mem[RECVFRAME_HDR_ALIGN>>2];\n\t}u;\n\n\t//uint mem[MAX_RXSZ>>2];\n\n};\n\ntypedef enum _RX_PACKET_TYPE{\n\tNORMAL_RX,//Normal rx packet\n\tTX_REPORT1,//CCX\n\tTX_REPORT2,//TX RPT\n\tHIS_REPORT,// USB HISR RPT\n\tC2H_PACKET\n}RX_PACKET_TYPE, *PRX_PACKET_TYPE;\n\nextern union recv_frame *_rtw_alloc_recvframe (_queue *pfree_recv_queue);  //get a free recv_frame from pfree_recv_queue\nextern union recv_frame *rtw_alloc_recvframe (_queue *pfree_recv_queue);  //get a free recv_frame from pfree_recv_queue\nextern void rtw_init_recvframe(union recv_frame *precvframe ,struct recv_priv *precvpriv);\nextern int\t rtw_free_recvframe(union recv_frame *precvframe, _queue *pfree_recv_queue);\n\n#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue)\nextern int _rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue);\nextern int rtw_enqueue_recvframe(union recv_frame *precvframe, _queue *queue);\n\nextern void rtw_free_recvframe_queue(_queue *pframequeue,  _queue *pfree_recv_queue);\nu32 rtw_free_uc_swdec_pending_queue(_adapter *adapter);\n\nsint rtw_enqueue_recvbuf_to_head(struct recv_buf *precvbuf, _queue *queue);\nsint rtw_enqueue_recvbuf(struct recv_buf *precvbuf, _queue *queue);\nstruct recv_buf *rtw_dequeue_recvbuf (_queue *queue);\n\nvoid rtw_reordering_ctrl_timeout_handler(void *pcontext);\n\nvoid rx_query_phy_status(union recv_frame *rframe, u8 *phy_stat);\nint rtw_inc_and_chk_continual_no_rx_packet(struct sta_info *sta, int tid_index);\nvoid rtw_reset_continual_no_rx_packet(struct sta_info *sta, int tid_index);\n\n__inline static u8 *get_rxmem(union recv_frame *precvframe)\n{\n\t//always return rx_head...\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\treturn precvframe->u.hdr.rx_head;\n}\n\n__inline static u8 *get_rx_status(union recv_frame *precvframe)\n{\n\n\treturn get_rxmem(precvframe);\n\n}\n\n__inline static u8 *get_recvframe_data(union recv_frame *precvframe)\n{\n\n\t//alwasy return rx_data\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\treturn precvframe->u.hdr.rx_data;\n\n}\n\n__inline static u8 *recvframe_push(union recv_frame *precvframe, sint sz)\n{\n\t// append data before rx_data\n\n\t/* add data to the start of recv_frame\n *\n *      This function extends the used data area of the recv_frame at the buffer\n *      start. rx_data must be still larger than rx_head, after pushing.\n */\n\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\n\tprecvframe->u.hdr.rx_data -= sz ;\n\tif( precvframe->u.hdr.rx_data < precvframe->u.hdr.rx_head )\n\t{\n\t\tprecvframe->u.hdr.rx_data += sz ;\n\t\treturn NULL;\n\t}\n\n\tprecvframe->u.hdr.len +=sz;\n\n\treturn precvframe->u.hdr.rx_data;\n\n}\n\n\n__inline static u8 *recvframe_pull(union recv_frame *precvframe, sint sz)\n{\n\t// rx_data += sz; move rx_data sz bytes  hereafter\n\n\t//used for extract sz bytes from rx_data, update rx_data and return the updated rx_data to the caller\n\n\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\n\tprecvframe->u.hdr.rx_data += sz;\n\n\tif(precvframe->u.hdr.rx_data > precvframe->u.hdr.rx_tail)\n\t{\n\t\tprecvframe->u.hdr.rx_data -= sz;\n\t\treturn NULL;\n\t}\n\n\tprecvframe->u.hdr.len -=sz;\n\n\treturn precvframe->u.hdr.rx_data;\n\n}\n\n__inline static u8 *recvframe_put(union recv_frame *precvframe, sint sz)\n{\n\t// rx_tai += sz; move rx_tail sz bytes  hereafter\n\n\t//used for append sz bytes from ptr to rx_tail, update rx_tail and return the updated rx_tail to the caller\n\t//after putting, rx_tail must be still larger than rx_end.\n \tunsigned char * prev_rx_tail;\n\n\t/* DBG_871X(\"recvframe_put: len=%d\\n\", sz); */\n\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\tprev_rx_tail = precvframe->u.hdr.rx_tail;\n\n\tprecvframe->u.hdr.rx_tail += sz;\n\n\tif(precvframe->u.hdr.rx_tail > precvframe->u.hdr.rx_end)\n\t{\n\t\tprecvframe->u.hdr.rx_tail -= sz;\n\t\treturn NULL;\n\t}\n\n\tprecvframe->u.hdr.len +=sz;\n\n\treturn precvframe->u.hdr.rx_tail;\n\n}\n\n\n\n__inline static u8 *recvframe_pull_tail(union recv_frame *precvframe, sint sz)\n{\n\t// rmv data from rx_tail (by yitsen)\n\n\t//used for extract sz bytes from rx_end, update rx_end and return the updated rx_end to the caller\n\t//after pulling, rx_end must be still larger than rx_data.\n\n\tif(precvframe==NULL)\n\t\treturn NULL;\n\n\tprecvframe->u.hdr.rx_tail -= sz;\n\n\tif(precvframe->u.hdr.rx_tail < precvframe->u.hdr.rx_data)\n\t{\n\t\tprecvframe->u.hdr.rx_tail += sz;\n\t\treturn NULL;\n\t}\n\n\tprecvframe->u.hdr.len -=sz;\n\n\treturn precvframe->u.hdr.rx_tail;\n\n}\n\n\n\n__inline static _buffer * get_rxbuf_desc(union recv_frame *precvframe)\n{\n\t_buffer * buf_desc;\n\n\tif(precvframe==NULL)\n\t\treturn NULL;\n#ifdef PLATFORM_WINDOWS\n\tNdisQueryPacket(precvframe->u.hdr.pkt, NULL, NULL, &buf_desc, NULL);\n#endif\n\n\treturn buf_desc;\n}\n\n\n__inline static union recv_frame *rxmem_to_recvframe(u8 *rxmem)\n{\n\t//due to the design of 2048 bytes alignment of recv_frame, we can reference the union recv_frame\n\t//from any given member of recv_frame.\n\t// rxmem indicates the any member/address in recv_frame\n\n\treturn (union recv_frame*)(((SIZE_PTR)rxmem >> RXFRAME_ALIGN) << RXFRAME_ALIGN);\n\n}\n\n__inline static union recv_frame *pkt_to_recvframe(_pkt *pkt)\n{\n\n\tu8 * buf_star;\n\tunion recv_frame * precv_frame;\n#ifdef PLATFORM_WINDOWS\n\t_buffer * buf_desc;\n\tuint len;\n\n\tNdisQueryPacket(pkt, NULL, NULL, &buf_desc, &len);\n\tNdisQueryBufferSafe(buf_desc, &buf_star, &len, HighPagePriority);\n#endif\n\tprecv_frame = rxmem_to_recvframe((unsigned char*)buf_star);\n\n\treturn precv_frame;\n}\n\n__inline static u8 *pkt_to_recvmem(_pkt *pkt)\n{\n\t// return the rx_head\n\n\tunion recv_frame * precv_frame = pkt_to_recvframe(pkt);\n\n\treturn \tprecv_frame->u.hdr.rx_head;\n\n}\n\n__inline static u8 *pkt_to_recvdata(_pkt *pkt)\n{\n\t// return the rx_data\n\n\tunion recv_frame * precv_frame =pkt_to_recvframe(pkt);\n\n\treturn \tprecv_frame->u.hdr.rx_data;\n\n}\n\n\n__inline static sint get_recvframe_len(union recv_frame *precvframe)\n{\n\treturn precvframe->u.hdr.len;\n}\n\n\n__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)\n{\n\ts32\tSignalPower; // in dBm.\n\n#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\t/* Translate to dBm (x=0.5y-95). */\n\tSignalPower = (s32)((SignalStrengthIndex + 1) >> 1); \n\tSignalPower -= 95; \n#else\n\t/* Translate to dBm (x=y-100) */\n\tSignalPower = SignalStrengthIndex - 100;\n#endif\n\n\treturn SignalPower;\n}\n\n\nstruct sta_info;\n\nextern void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv);\n\nextern void  mgt_dispatcher(_adapter *padapter, union recv_frame *precv_frame);\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_rf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef\t__RTW_RF_H_ \n#define __RTW_RF_H_\n\n\n#define OFDM_PHY\t\t1\n#define MIXED_PHY\t\t2\n#define CCK_PHY\t\t3\n\n#define NumRates\t(13)\n\n// slot time for 11g\n#define SHORT_SLOT_TIME\t\t\t\t\t9\n#define NON_SHORT_SLOT_TIME\t\t\t\t20\n\n#define RTL8711_RF_MAX_SENS 6\n#define RTL8711_RF_DEF_SENS 4\n\n//\n// We now define the following channels as the max channels in each channel plan.\n// 2G, total 14 chnls\n// {1,2,3,4,5,6,7,8,9,10,11,12,13,14}\n// 5G, total 24 chnls\n// {36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,149,153,157,161,165}\n#define\tMAX_CHANNEL_NUM_2G\t\t\t\t14\n#define\tMAX_CHANNEL_NUM_5G\t\t\t\t24\n#define\tMAX_CHANNEL_NUM\t\t\t\t\t38//14+24\n\n#define CENTER_CH_2G_NUM\t\t14\n#define CENTER_CH_5G_20M_NUM\t28\t/* 20M center channels */\n#define CENTER_CH_5G_40M_NUM\t14\t/* 40M center channels */\n#define CENTER_CH_5G_80M_NUM\t7\t/* 80M center channels */\n#define CENTER_CH_5G_ALL_NUM\t(CENTER_CH_5G_20M_NUM + CENTER_CH_5G_40M_NUM + CENTER_CH_5G_80M_NUM)\n\nextern u8 center_ch_5g_20m[CENTER_CH_5G_20M_NUM];\nextern u8 center_ch_5g_40m[CENTER_CH_5G_40M_NUM];\nextern u8 center_ch_5g_80m[CENTER_CH_5G_80M_NUM];\nextern u8 center_ch_5g_all[CENTER_CH_5G_ALL_NUM];\n\nu8 center_chs_5g_num(u8 bw);\nu8 center_chs_5g(u8 bw, u8 id);\n\n//#define NUM_REGULATORYS\t21\n#define NUM_REGULATORYS\t1\n\n//Country codes\n#define USA\t\t\t\t\t\t\t0x555320\n#define EUROPE\t\t\t\t\t\t0x1 //temp, should be provided later\t\n#define JAPAN\t\t\t\t\t\t0x2 //temp, should be provided later\t\n\nstruct\tregulatory_class {\n\tu32\tstarting_freq;\t\t\t\t\t//MHz, \n\tu8\tchannel_set[MAX_CHANNEL_NUM];\n\tu8\tchannel_cck_power[MAX_CHANNEL_NUM];//dbm\n\tu8\tchannel_ofdm_power[MAX_CHANNEL_NUM];//dbm\n\tu8\ttxpower_limit;  \t\t\t\t//dbm\n\tu8\tchannel_spacing;\t\t\t\t//MHz\n\tu8\tmodem;\n};\n\ntypedef enum _CAPABILITY{\n\tcESS\t\t\t= 0x0001,\n\tcIBSS\t\t\t= 0x0002,\n\tcPollable\t\t= 0x0004,\n\tcPollReq\t\t\t= 0x0008,\n\tcPrivacy\t\t= 0x0010,\n\tcShortPreamble\t= 0x0020,\n\tcPBCC\t\t\t= 0x0040,\n\tcChannelAgility\t= 0x0080,\n\tcSpectrumMgnt\t= 0x0100,\n\tcQos\t\t\t= 0x0200,\t// For HCCA, use with CF-Pollable and CF-PollReq\n\tcShortSlotTime\t= 0x0400,\n\tcAPSD\t\t\t= 0x0800,\n\tcRM\t\t\t\t= 0x1000,\t// RRM (Radio Request Measurement)\n\tcDSSS_OFDM\t= 0x2000,\n\tcDelayedBA\t\t= 0x4000,\n\tcImmediateBA\t= 0x8000,\n}CAPABILITY, *PCAPABILITY;\n\nenum\t_REG_PREAMBLE_MODE{\n\tPREAMBLE_LONG\t= 1,\n\tPREAMBLE_AUTO\t= 2,\n\tPREAMBLE_SHORT\t= 3,\n};\n\n\nenum _RTL8712_RF_MIMO_CONFIG_{\n RTL8712_RFCONFIG_1T=0x10,\n RTL8712_RFCONFIG_2T=0x20,\n RTL8712_RFCONFIG_1R=0x01,\n RTL8712_RFCONFIG_2R=0x02,\n RTL8712_RFCONFIG_1T1R=0x11,\n RTL8712_RFCONFIG_1T2R=0x12,\n RTL8712_RFCONFIG_TURBO=0x92,\n RTL8712_RFCONFIG_2T2R=0x22\n};\n\ntypedef enum _RF_PATH {\n\tRF_PATH_A = 0,\n\tRF_PATH_B = 1,\n\tRF_PATH_C = 2,\n\tRF_PATH_D = 3,\n} RF_PATH, *PRF_PATH;\n\n#define rf_path_char(path) (((path) >= RF_PATH_MAX) ? 'X' : 'A' + (path))\n\n// Bandwidth Offset\n#define HAL_PRIME_CHNL_OFFSET_DONT_CARE\t0\n#define HAL_PRIME_CHNL_OFFSET_LOWER\t1\n#define HAL_PRIME_CHNL_OFFSET_UPPER\t2\n\ntypedef enum _BAND_TYPE {\n\tBAND_ON_2_4G = 0,\n\tBAND_ON_5G = 1,\n\tBAND_ON_BOTH = 2,\n\tBAND_MAX = 3,\n} BAND_TYPE, *PBAND_TYPE;\n\nextern const char * const _band_str[];\n#define band_str(band) (((band) >= BAND_MAX) ? _band_str[BAND_MAX] : _band_str[(band)])\n\nextern const u8 _band_to_band_cap[];\n#define band_to_band_cap(band) (((band) >= BAND_MAX) ? _band_to_band_cap[BAND_MAX] : _band_to_band_cap[(band)])\n\n// Represent Channel Width in HT Capabilities\n//\ntypedef enum _CHANNEL_WIDTH{\n\tCHANNEL_WIDTH_20 = 0,\n\tCHANNEL_WIDTH_40 = 1,\n\tCHANNEL_WIDTH_80 = 2,\n\tCHANNEL_WIDTH_160 = 3,\n\tCHANNEL_WIDTH_80_80 = 4,\n\tCHANNEL_WIDTH_MAX = 5,\n}CHANNEL_WIDTH, *PCHANNEL_WIDTH;\n\nextern const char * const _ch_width_str[];\n#define ch_width_str(bw) (((bw) >= CHANNEL_WIDTH_MAX) ? _ch_width_str[CHANNEL_WIDTH_MAX] : _ch_width_str[(bw)])\n\nextern const u8 _ch_width_to_bw_cap[];\n#define ch_width_to_bw_cap(bw) (((bw) >= CHANNEL_WIDTH_MAX) ? _ch_width_to_bw_cap[CHANNEL_WIDTH_MAX] : _ch_width_to_bw_cap[(bw)])\n\n//\n// Represent Extention Channel Offset in HT Capabilities\n// This is available only in 40Mhz mode.\n//\ntypedef enum _EXTCHNL_OFFSET{\n\tEXTCHNL_OFFSET_NO_EXT = 0,\n\tEXTCHNL_OFFSET_UPPER = 1,\n\tEXTCHNL_OFFSET_NO_DEF = 2,\n\tEXTCHNL_OFFSET_LOWER = 3,\n}EXTCHNL_OFFSET, *PEXTCHNL_OFFSET;\n\ntypedef enum _VHT_DATA_SC{\n\tVHT_DATA_SC_DONOT_CARE = 0,\n\tVHT_DATA_SC_20_UPPER_OF_80MHZ = 1,\n\tVHT_DATA_SC_20_LOWER_OF_80MHZ = 2,\n\tVHT_DATA_SC_20_UPPERST_OF_80MHZ = 3,\n\tVHT_DATA_SC_20_LOWEST_OF_80MHZ = 4,\n\tVHT_DATA_SC_20_RECV1 = 5,\n\tVHT_DATA_SC_20_RECV2 = 6,\n\tVHT_DATA_SC_20_RECV3 = 7,\n\tVHT_DATA_SC_20_RECV4 = 8,\n\tVHT_DATA_SC_40_UPPER_OF_80MHZ = 9,\n\tVHT_DATA_SC_40_LOWER_OF_80MHZ = 10,\n}VHT_DATA_SC, *PVHT_DATA_SC_E;\n\ntypedef enum _PROTECTION_MODE{\n\tPROTECTION_MODE_AUTO = 0,\n\tPROTECTION_MODE_FORCE_ENABLE = 1,\n\tPROTECTION_MODE_FORCE_DISABLE = 2,\n}PROTECTION_MODE, *PPROTECTION_MODE;\n\ntypedef\tenum _RT_RF_TYPE_DEFINITION\n{\n\tRF_1T2R = 0,\n\tRF_2T4R = 1,\n\tRF_2T2R = 2,\n\tRF_1T1R = 3,\n\tRF_2T2R_GREEN = 4,\n\tRF_2T3R = 5,\t\n\tRF_3T3R = 6,\n\tRF_3T4R\t= 7,\n\tRF_4T4R\t= 8,\n\n\tRF_MAX_TYPE = 0xF, /* u1Byte */\n}RT_RF_TYPE_DEF_E;\n\nint rtw_ch2freq(int chan);\nint rtw_freq2ch(int freq);\nbool rtw_chbw_to_freq_range(u8 ch, u8 bw, u8 offset, u32 *hi, u32 *lo);\n\nint rtw_get_chplan_from_country(const char *country_code);\n\n#define BB_GAIN_2G 0\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n#define BB_GAIN_5GLB1 1\n#define BB_GAIN_5GLB2 2\n#define BB_GAIN_5GMB1 3\n#define BB_GAIN_5GMB2 4\n#define BB_GAIN_5GHB 5\n#endif\n\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n#define BB_GAIN_NUM 6\n#else\n#define BB_GAIN_NUM 1\n#endif\n\nint rtw_ch_to_bb_gain_sel(int ch);\nvoid rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset);\nvoid rtw_rf_apply_tx_gain_offset(_adapter *adapter, u8 ch);\n\nbool rtw_is_dfs_range(u32 hi, u32 lo);\nbool rtw_is_dfs_ch(u8 ch, u8 bw, u8 offset);\nbool rtw_is_long_cac_range(u32 hi, u32 lo);\nbool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset);\n\n#endif //_RTL8711_RF_H_\n\n"
  },
  {
    "path": "include/rtw_security.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_SECURITY_H_\n#define __RTW_SECURITY_H_\n\n\n#define _NO_PRIVACY_\t\t0x0\n#define _WEP40_\t\t\t\t0x1\n#define _TKIP_\t\t\t\t0x2\n#define _TKIP_WTMIC_\t\t0x3\n#define _AES_\t\t\t\t0x4\n#define _WEP104_\t\t\t0x5\n#define _WEP_WPA_MIXED_\t0x07  // WEP + WPA\n#define _SMS4_\t\t\t\t0x06\n#ifdef CONFIG_IEEE80211W\n#define _BIP_\t\t\t\t0x8\n#endif //CONFIG_IEEE80211W\n/* 802.11W use wrong key */\n#define IEEE80211W_RIGHT_KEY\t0x0\n#define IEEE80211W_WRONG_KEY\t0x1\n#define IEEE80211W_NO_KEY\t\t0x2\n\n#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))\n\nconst char *security_type_str(u8 value);\n\n#define _WPA_IE_ID_\t0xdd\n#define _WPA2_IE_ID_\t0x30\n\n#define SHA256_MAC_LEN 32\n#define AES_BLOCK_SIZE 16\n#define AES_PRIV_SIZE (4 * 44)\n\n#define RTW_KEK_LEN 16\n#define RTW_KCK_LEN 16\n#define RTW_REPLAY_CTR_LEN 8\n\ntypedef enum {\n\tENCRYP_PROTOCOL_OPENSYS,   //open system\n\tENCRYP_PROTOCOL_WEP,       //WEP\n\tENCRYP_PROTOCOL_WPA,       //WPA\n\tENCRYP_PROTOCOL_WPA2,      //WPA2\n\tENCRYP_PROTOCOL_WAPI,      //WAPI: Not support in this version\n\tENCRYP_PROTOCOL_MAX\n}ENCRYP_PROTOCOL_E;\n\n\n#ifndef Ndis802_11AuthModeWPA2\n#define Ndis802_11AuthModeWPA2 (Ndis802_11AuthModeWPANone + 1)\n#endif\n\n#ifndef Ndis802_11AuthModeWPA2PSK\n#define Ndis802_11AuthModeWPA2PSK (Ndis802_11AuthModeWPANone + 2)\n#endif\n\nunion pn48\t{\n\t\n\tu64\tval;\n\t\n#ifdef CONFIG_LITTLE_ENDIAN\n\nstruct {\n  u8 TSC0;\n  u8 TSC1;\n  u8 TSC2;\n  u8 TSC3;\n  u8 TSC4;\n  u8 TSC5;\n  u8 TSC6;\n  u8 TSC7;\n} _byte_;\n \n#elif defined(CONFIG_BIG_ENDIAN)\n\nstruct {\n  u8 TSC7;\n  u8 TSC6;\n  u8 TSC5;\n  u8 TSC4;\n  u8 TSC3;\n  u8 TSC2;\n  u8 TSC1;\n  u8 TSC0;\n} _byte_;\n \n#endif\n\n};\n\nunion Keytype {\n        u8   skey[16];\n        u32    lkey[4];\n};\n\n\ntypedef struct _RT_PMKID_LIST\n{\n\tu8\t\t\t\t\t\tbUsed;\n\tu8 \t\t\t\t\t\tBssid[6];\n\tu8\t\t\t\t\t\tPMKID[16];\n\tu8\t\t\t\t\t\tSsidBuf[33];\n\tu8*\t\t\t\t\t\tssid_octet;\n\tu16 \t\t\t\t\t\tssid_length;\n} RT_PMKID_LIST, *PRT_PMKID_LIST;\n\n\nstruct security_priv\n{\n\tu32\t  dot11AuthAlgrthm;\t\t// 802.11 auth, could be open, shared, 8021x and authswitch \n\tu32\t  dot11PrivacyAlgrthm;\t// This specify the privacy for shared auth. algorithm.\n\n\t/* WEP */\n\tu32\t  dot11PrivacyKeyIndex;\t// this is only valid for legendary wep, 0~3 for key id. (tx key index)\n\tunion Keytype dot11DefKey[4];\t\t\t// this is only valid for def. key\t\n\tu32 \tdot11DefKeylen[4];\n\tu8 \tkey_mask; /* use to restore wep key after hal_init */\n\n\tu32 dot118021XGrpPrivacy;\t// This specify the privacy algthm. used for Grp key \n\tu32\tdot118021XGrpKeyid;\t\t// key id used for Grp Key ( tx key index)\n\tunion Keytype\tdot118021XGrpKey[4];\t// 802.1x Group Key, for inx0 and inx1\t\n\tunion Keytype\tdot118021XGrptxmickey[4];\n\tunion Keytype\tdot118021XGrprxmickey[4];\n\tunion pn48\t\tdot11Grptxpn;\t\t\t// PN48 used for Grp Key xmit.\n\tunion pn48\t\tdot11Grprxpn;\t\t\t// PN48 used for Grp Key recv.\n#ifdef CONFIG_IEEE80211W\n\tu32\tdot11wBIPKeyid;\t\t\t\t\t\t// key id used for BIP Key ( tx key index)\n\tunion Keytype\tdot11wBIPKey[6];\t\t// BIP Key, for index4 and index5\n\tunion pn48\t\tdot11wBIPtxpn;\t\t\t// PN48 used for Grp Key xmit.\n\tunion pn48\t\tdot11wBIPrxpn;\t\t\t// PN48 used for Grp Key recv.\n#endif //CONFIG_IEEE80211W\n#ifdef CONFIG_AP_MODE\n\t//extend security capabilities for AP_MODE \n\tunsigned int dot8021xalg;//0:disable, 1:psk, 2:802.1x\n\tunsigned int wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2\n\tunsigned int wpa_group_cipher;\n\tunsigned int wpa2_group_cipher;\n\tunsigned int wpa_pairwise_cipher;\n\tunsigned int wpa2_pairwise_cipher;\t\n#endif\n\n\tu8 wps_ie[MAX_WPS_IE_LEN];//added in assoc req\n\tint wps_ie_len;\n\t\n\t\n\tu8\tbinstallGrpkey;\n#ifdef CONFIG_GTK_OL\n\tu8\tbinstallKCK_KEK;\n#endif //CONFIG_GTK_OL\n#ifdef CONFIG_IEEE80211W\n\tu8\tbinstallBIPkey;\n#endif //CONFIG_IEEE80211W\n\tu8\tbusetkipkey;\n\t//_timer tkip_timer;\n\tu8\tbcheck_grpkey;\n\tu8\tbgrpkey_handshake;\n\t\n\t//u8\tpacket_cnt;//unused, removed\n\t\n\ts32\tsw_encrypt;//from registry_priv\n\ts32\tsw_decrypt;//from registry_priv\n\t\n\ts32 \thw_decrypted;//if the rx packets is hw_decrypted==_FALSE, it means the hw has not been ready.\n\n\n\t//keeps the auth_type & enc_status from upper layer ioctl(wpa_supplicant or wzc)\n\tu32 ndisauthtype;\t// NDIS_802_11_AUTHENTICATION_MODE\n\tu32 ndisencryptstatus;\t// NDIS_802_11_ENCRYPTION_STATUS\n\n\tNDIS_802_11_WEP ndiswep;\n#ifdef PLATFORM_WINDOWS\n\tu8 KeyMaterial[16];// variable length depending on above field.\n#endif\n\n\tu8 assoc_info[600];\n\tu8 szofcapability[256]; //for wpa2 usage\n\tu8 oidassociation[512]; //for wpa/wpa2 usage\n\tu8 authenticator_ie[256];  //store ap security information element\n\tu8 supplicant_ie[256];  //store sta security information element\n\n\n\t//for tkip countermeasure\n\tu32 last_mic_err_time;\t\n\tu8\tbtkip_countermeasure;\n\tu8\tbtkip_wait_report;\n\tu32 btkip_countermeasure_time;\n\n\t//---------------------------------------------------------------------------\n\t// For WPA2 Pre-Authentication.\n\t//---------------------------------------------------------------------------\n\t//u8\t\t\t\tRegEnablePreAuth;\t\t\t\t// Default value: Pre-Authentication enabled or not, from registry \"EnablePreAuth\". Added by Annie, 2005-11-01.\n\t//u8\t\t\t\tEnablePreAuthentication;\t\t\t// Current Value: Pre-Authentication enabled or not.\n\tRT_PMKID_LIST\t\tPMKIDList[NUM_PMKID_CACHE];\t// Renamed from PreAuthKey[NUM_PRE_AUTH_KEY]. Annie, 2006-10-13.\n\tu8\t\t\t\tPMKIDIndex;\n\t//u32\t\t\t\tPMKIDCount;\t\t\t\t\t\t// Added by Annie, 2006-10-13.\n\t//u8\t\t\t\tszCapability[256];\t\t\t\t// For WPA2-PSK using zero-config, by Annie, 2005-09-20.\n\n\tu8 bWepDefaultKeyIdxSet;\n\n#define DBG_SW_SEC_CNT\n#ifdef DBG_SW_SEC_CNT\n\tu64 wep_sw_enc_cnt_bc;\n\tu64 wep_sw_enc_cnt_mc;\n\tu64 wep_sw_enc_cnt_uc;\n\tu64 wep_sw_dec_cnt_bc;\n\tu64 wep_sw_dec_cnt_mc;\n\tu64 wep_sw_dec_cnt_uc;\n\n\tu64 tkip_sw_enc_cnt_bc;\n\tu64 tkip_sw_enc_cnt_mc;\n\tu64 tkip_sw_enc_cnt_uc;\n\tu64 tkip_sw_dec_cnt_bc;\n\tu64 tkip_sw_dec_cnt_mc;\n\tu64 tkip_sw_dec_cnt_uc;\n\n\tu64 aes_sw_enc_cnt_bc;\n\tu64 aes_sw_enc_cnt_mc;\n\tu64 aes_sw_enc_cnt_uc;\n\tu64 aes_sw_dec_cnt_bc;\n\tu64 aes_sw_dec_cnt_mc;\n\tu64 aes_sw_dec_cnt_uc;\n#endif /* DBG_SW_SEC_CNT */\n};\n\nstruct sha256_state {\n\tu64 length;\n\tu32 state[8], curlen;\n\tu8 buf[64];\n};\n\n#define GET_ENCRY_ALGO(psecuritypriv, psta, encry_algo, bmcst)\\\ndo{\\\n\tswitch(psecuritypriv->dot11AuthAlgrthm)\\\n\t{\\\n\t\tcase dot11AuthAlgrthm_Open:\\\n\t\tcase dot11AuthAlgrthm_Shared:\\\n\t\tcase dot11AuthAlgrthm_Auto:\\\n\t\t\tencry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\\\n\t\t\tbreak;\\\n\t\tcase dot11AuthAlgrthm_8021X:\\\n\t\t\tif(bmcst)\\\n\t\t\t\tencry_algo = (u8)psecuritypriv->dot118021XGrpPrivacy;\\\n\t\t\telse\\\n\t\t\t\tencry_algo =(u8) psta->dot118021XPrivacy;\\\n\t\t\tbreak;\\\n\t     case dot11AuthAlgrthm_WAPI:\\\n\t\t     encry_algo = (u8)psecuritypriv->dot11PrivacyAlgrthm;\\\n\t\t     break;\\\n\t}\\\n}while(0)\n\n#define _AES_IV_LEN_ 8\n\n#define SET_ICE_IV_LEN( iv_len, icv_len, encrypt)\\\ndo{\\\n\tswitch(encrypt)\\\n\t{\\\n\t\tcase _WEP40_:\\\n\t\tcase _WEP104_:\\\n\t\t\tiv_len = 4;\\\n\t\t\ticv_len = 4;\\\n\t\t\tbreak;\\\n\t\tcase _TKIP_:\\\n\t\t\tiv_len = 8;\\\n\t\t\ticv_len = 4;\\\n\t\t\tbreak;\\\n\t\tcase _AES_:\\\n\t\t\tiv_len = 8;\\\n\t\t\ticv_len = 8;\\\n\t\t\tbreak;\\\n\t\tcase _SMS4_:\\\n\t\t\tiv_len = 18;\\\n\t\t\ticv_len = 16;\\\n\t\t\tbreak;\\\n\t\tdefault:\\\n\t\t\tiv_len = 0;\\\n\t\t\ticv_len = 0;\\\n\t\t\tbreak;\\\n\t}\\\n}while(0)\n\n\n#define GET_TKIP_PN(iv,dot11txpn)\\\ndo{\\\n\tdot11txpn._byte_.TSC0=iv[2];\\\n\tdot11txpn._byte_.TSC1=iv[0];\\\n\tdot11txpn._byte_.TSC2=iv[4];\\\n\tdot11txpn._byte_.TSC3=iv[5];\\\n\tdot11txpn._byte_.TSC4=iv[6];\\\n\tdot11txpn._byte_.TSC5=iv[7];\\\n}while(0)\n\n\n#define ROL32( A, n )\t( ((A) << (n)) | ( ((A)>>(32-(n)))  & ( (1UL << (n)) - 1 ) ) )\n#define ROR32( A, n ) \tROL32( (A), 32-(n) )\n\nstruct mic_data\n{\n\tu32  K0, K1;         // Key\n\tu32  L, R;           // Current state\n\tu32  M;              // Message accumulator (single word)\n\tu32     nBytesInM;      // # bytes in M\n};\n\nextern const u32 Te0[256];\nextern const u32 Te1[256];\nextern const u32 Te2[256];\nextern const u32 Te3[256];\nextern const u32 Te4[256];\nextern const u32 Td0[256];\nextern const u32 Td1[256];\nextern const u32 Td2[256];\nextern const u32 Td3[256];\nextern const u32 Td4[256];\nextern const u32 rcon[10];\nextern const u8 Td4s[256];\nextern const u8 rcons[10];\n\n#define RCON(i) (rcons[(i)] << 24)\n\nstatic inline u32 rotr(u32 val, int bits)\n{\n\treturn (val >> bits) | (val << (32 - bits));\n}\n\n#define TE0(i) Te0[((i) >> 24) & 0xff]\n#define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)\n#define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)\n#define TE3(i) rotr(Te0[(i) & 0xff], 24)\n#define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)\n#define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)\n#define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)\n#define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)\n#define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)\n#define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)\n#define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)\n#define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)\n#define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)\n\n#define TD0(i) Td0[((i) >> 24) & 0xff]\n#define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)\n#define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)\n#define TD3(i) rotr(Td0[(i) & 0xff], 24)\n#define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)\n#define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)\n#define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)\n#define TD44(i) (Td4s[(i) & 0xff])\n#define TD0_(i) Td0[(i) & 0xff]\n#define TD1_(i) rotr(Td0[(i) & 0xff], 8)\n#define TD2_(i) rotr(Td0[(i) & 0xff], 16)\n#define TD3_(i) rotr(Td0[(i) & 0xff], 24)\n\n#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \\\n\t\t\t((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))\n\n#define PUTU32(ct, st) { \\\n(ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \\\n(ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }\n\n#define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \\\n\t\t\t (((u32) (a)[2]) << 8) | ((u32) (a)[3]))\n\n#define WPA_PUT_LE16(a, val)\t\t\t\\\n\tdo {\t\t\t\t\t\\\n\t\t(a)[1] = ((u16) (val)) >> 8;\t\\\n\t\t(a)[0] = ((u16) (val)) & 0xff;\t\\\n\t} while (0)\n\n#define WPA_PUT_BE32(a, val)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);\t\\\n\t\t(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);\t\\\n\t\t(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);\t\\\n\t\t(a)[3] = (u8) (((u32) (val)) & 0xff);\t\t\\\n\t} while (0)\n\n#define WPA_PUT_BE64(a, val)\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\\\n\t\t(a)[0] = (u8) (((u64) (val)) >> 56);\t\\\n\t\t(a)[1] = (u8) (((u64) (val)) >> 48);\t\\\n\t\t(a)[2] = (u8) (((u64) (val)) >> 40);\t\\\n\t\t(a)[3] = (u8) (((u64) (val)) >> 32);\t\\\n\t\t(a)[4] = (u8) (((u64) (val)) >> 24);\t\\\n\t\t(a)[5] = (u8) (((u64) (val)) >> 16);\t\\\n\t\t(a)[6] = (u8) (((u64) (val)) >> 8);\t\\\n\t\t(a)[7] = (u8) (((u64) (val)) & 0xff);\t\\\n\t} while (0)\n\t\n/* ===== start - public domain SHA256 implementation ===== */\n\n/* This is based on SHA256 implementation in LibTomCrypt that was released into\n * public domain by Tom St Denis. */\n\n/* the K array */\nstatic const unsigned long K[64] = {\n\t0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,\n\t0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,\n\t0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,\n\t0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,\n\t0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,\n\t0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,\n\t0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,\n\t0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,\n\t0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,\n\t0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,\n\t0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,\n\t0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,\n\t0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL\n};\n\n\n/* Various logical functions */\n#define RORc(x, y) \\\n( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \\\n   ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)\n#define Ch(x,y,z)       (z ^ (x & (y ^ z)))\n#define Maj(x,y,z)      (((x | y) & z) | (x & y)) \n#define S(x, n)         RORc((x), (n))\n#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))\n#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))\n#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))\n#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))\n#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))\n#ifndef MIN\n#define MIN(x, y) (((x) < (y)) ? (x) : (y))\n#endif\n#ifdef CONFIG_IEEE80211W\nint omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac);\n#endif //CONFIG_IEEE80211W\nvoid rtw_secmicsetkey(struct mic_data *pmicdata, u8 * key );\nvoid rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b );\nvoid rtw_secmicappend(struct mic_data *pmicdata, u8 * src, u32 nBytes );\nvoid rtw_secgetmic(struct mic_data *pmicdata, u8 * dst );\n\nvoid rtw_seccalctkipmic(\n\tu8 * key,\n\tu8 *header,\n\tu8 *data,\n\tu32 data_len,\n\tu8 *Miccode,\n\tu8   priority);\n\nu32 rtw_aes_encrypt(_adapter *padapter, u8 *pxmitframe);\nu32 rtw_tkip_encrypt(_adapter *padapter, u8 *pxmitframe);\nvoid rtw_wep_encrypt(_adapter *padapter, u8  *pxmitframe);\n\nu32 rtw_aes_decrypt(_adapter *padapter, u8  *precvframe);\nu32 rtw_tkip_decrypt(_adapter *padapter, u8  *precvframe);\nvoid rtw_wep_decrypt(_adapter *padapter, u8  *precvframe);\n#ifdef CONFIG_IEEE80211W\nu32\trtw_BIP_verify(_adapter *padapter, u8 *precvframe);\n#endif //CONFIG_IEEE80211W\n#ifdef CONFIG_TDLS\nvoid wpa_tdls_generate_tpk(_adapter *padapter, PVOID sta);\nint wpa_tdls_ftie_mic(u8 *kck, u8 trans_seq, \n\t\t\t\t\t\tu8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie,\n\t\t\t\t\t\tu8 *mic);\nint wpa_tdls_teardown_ftie_mic(u8 *kck, u8 *lnkid, u16 reason, \n\tu8 dialog_token, u8 trans_seq, u8 *ftie, u8 *mic);\nint tdls_verify_mic(u8 *kck, u8 trans_seq, \n\t\t\t\t\t\tu8 *lnkid, u8 *rsnie, u8 *timeoutie, u8 *ftie);\n#endif //CONFIG_TDLS\n\nvoid rtw_use_tkipkey_handler(RTW_TIMER_HDL_ARGS);\n\nvoid rtw_sec_restore_wep_key(_adapter *adapter);\nu8 rtw_handle_tkip_countermeasure(_adapter* adapter, const char *caller);\n\n#ifdef CONFIG_WOWLAN\nu16 rtw_calc_crc(u8  *pdata, int length);\n#endif /*CONFIG_WOWLAN*/\n\n#endif\t//__RTL871X_SECURITY_H_\n\n"
  },
  {
    "path": "include/rtw_sreset.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_SRESET_H_\n#define _RTW_SRESET_H_\n\n//#include <drv_types.h>\n\nenum {\n\tSRESET_TGP_NULL = 0,\n\tSRESET_TGP_XMIT_STATUS = 1,\n\tSRESET_TGP_LINK_STATUS = 2,\n};\n\nstruct sreset_priv {\n\t_mutex \tsilentreset_mutex;\n\tu8 \tsilent_reset_inprogress;\n\tu8\tWifi_Error_Status;\n\tunsigned long last_tx_time;\n\tunsigned long last_tx_complete_time;\n\n\ts32 dbg_trigger_point;\n};\n\n\n\n#define\tWIFI_STATUS_SUCCESS \t\t0\n#define\tUSB_VEN_REQ_CMD_FAIL \tBIT0\n#define\tUSB_READ_PORT_FAIL \t\tBIT1\n#define\tUSB_WRITE_PORT_FAIL\t\tBIT2\n#define\tWIFI_MAC_TXDMA_ERROR \tBIT3\t\t\t\n#define   WIFI_TX_HANG\t\t\t\tBIT4\n#define\tWIFI_RX_HANG\t\t\t\tBIT5\n#define \tWIFI_IF_NOT_EXIST\t\t\tBIT6\n\nvoid sreset_init_value(_adapter *padapter);\nvoid sreset_reset_value(_adapter *padapter);\nu8 sreset_get_wifi_status(_adapter *padapter);\nvoid sreset_set_wifi_error_status(_adapter *padapter, u32 status);\nvoid sreset_set_trigger_point(_adapter *padapter, s32 tgp);\nbool sreset_inprogress(_adapter *padapter);\nvoid sreset_reset(_adapter *padapter);\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_tdls.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_TDLS_H_\n#define __RTW_TDLS_H_\n\n\n#ifdef CONFIG_TDLS\n/* TDLS STA state */\n\n\n/* TDLS Diect Link Establishment */\n#define\tTDLS_STATE_NONE\t\t\t\t0x00000000\t\t/* Default state */\n#define\tTDLS_INITIATOR_STATE\t\tBIT(28)\t\t\t/* 0x10000000 */\n#define\tTDLS_RESPONDER_STATE\t\tBIT(29)\t\t\t/* 0x20000000 */\n#define\tTDLS_LINKED_STATE\t\t\tBIT(30)\t\t\t/* 0x40000000 */\n/* TDLS PU Buffer STA */\n#define\tTDLS_WAIT_PTR_STATE\t\t\tBIT(24)\t\t\t/* 0x01000000 */\t/* Waiting peer's TDLS_PEER_TRAFFIC_RESPONSE frame */\n/* TDLS Check ALive */\n#define\tTDLS_ALIVE_STATE\t\t\tBIT(20)\t\t\t/* 0x00100000 */\t/* Check if peer sta is alived. */\n/* TDLS Channel Switch */\n#define\tTDLS_CH_SWITCH_ON_STATE\t\tBIT(16)\t\t\t/* 0x00010000 */\n#define\tTDLS_PEER_AT_OFF_STATE\t\tBIT(17)\t\t\t/* 0x00020000 */\t/* Could send pkt on target ch */\n#define\tTDLS_CH_SW_INITIATOR_STATE\tBIT(18)\t\t\t/* 0x00040000 */\t/* Avoid duplicated or unconditional ch. switch rsp. */\n#define\tTDLS_WAIT_CH_RSP_STATE\t\tBIT(19)\t\t\t/* 0x00080000 */\t/* Wait Ch. response as we are TDLS channel switch initiator */\n\n\n#define\tTPK_RESEND_COUNT\t\t\t1800\t/*Unit: seconds */\n#define\tCH_SWITCH_TIME\t\t\t\t5\n#define\tCH_SWITCH_TIMEOUT\t\t\t20\n#define\tTDLS_SIGNAL_THRESH\t\t\t0x20\n#define\tTDLS_WATCHDOG_PERIOD\t\t10\t/* Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec */\n#define\tTDLS_HANDSHAKE_TIME\t\t\t3000\n#define\tTDLS_PTI_TIME\t\t\t\t7000\n\n#define TDLS_MIC_LEN 16\n#define WPA_NONCE_LEN 32\n#define TDLS_TIMEOUT_LEN 4\n\nstruct wpa_tdls_ftie {\n\tu8 ie_type; /* FTIE */\n\tu8 ie_len;\n\tu8 mic_ctrl[2];\n\tu8 mic[TDLS_MIC_LEN];\n\tu8 Anonce[WPA_NONCE_LEN]; /* Responder Nonce in TDLS */\n\tu8 Snonce[WPA_NONCE_LEN]; /* Initiator Nonce in TDLS */\n\t/* followed by optional elements */\n} ;\n\nstruct wpa_tdls_lnkid {\n\tu8 ie_type; /* Link Identifier IE */\n\tu8 ie_len;\n\tu8 bssid[ETH_ALEN];\n\tu8 init_sta[ETH_ALEN];\n\tu8 resp_sta[ETH_ALEN];\n} ;\n\nstatic u8 TDLS_RSNIE[20]={\t0x01, 0x00,\t/* Version shall be set to 1 */\n\t\t\t\t\t\t\t0x00, 0x0f, 0xac, 0x07,\t/* Group sipher suite */\n\t\t\t\t\t\t\t0x01, 0x00,\t/* Pairwise cipher suite count */\n\t\t\t\t\t\t\t0x00, 0x0f, 0xac, 0x04,\t/* Pairwise cipher suite list; CCMP only */\n\t\t\t\t\t\t\t0x01, 0x00,\t/* AKM suite count */\n\t\t\t\t\t\t\t0x00, 0x0f, 0xac, 0x07,\t/* TPK Handshake */\n\t\t\t\t\t\t\t0x0c, 0x02,\n\t\t\t\t\t\t\t/* PMKID shall not be present */\n\t\t\t\t\t\t};\n\nstatic u8 TDLS_WMMIE[]={0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};\t/* Qos info all set zero */\n\nstatic u8 TDLS_WMM_PARAM_IE[] = {0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x27, 0xa4, 0x00, 0x00, 0x42, 0x43, 0x5e, 0x00, 0x62, 0x32, 0x2f, 0x00};\n\nstatic u8 TDLS_EXT_CAPIE[] = {0x00, 0x00, 0x00, 0x50, 0x20, 0x00, 0x00, 0x00};\t/* bit(28), bit(30), bit(37) */\n\n/* SRC: Supported Regulatory Classes */\nstatic u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1e, 0x20, 0x21 };\n\nint check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len);\nint check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len);\nvoid rtw_reset_tdls_info(_adapter* padapter);\nint rtw_init_tdls_info(_adapter* padapter);\nvoid rtw_free_tdls_info(struct tdls_info *ptdlsinfo);\nint issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);\nvoid rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta);\nvoid\trtw_free_tdls_timer(struct sta_info *psta);\nvoid free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);\n#ifdef CONFIG_WFD\nint issue_tunneled_probe_req(_adapter *padapter);\nint issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);\n#endif /* CONFIG_WFD */\nint issue_tdls_dis_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\nint issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);\nint issue_tdls_setup_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\nint issue_tdls_setup_cfm(_adapter *padapter, struct tdls_txmgmt *ptxmgmt);\nint issue_tdls_dis_rsp(_adapter * padapter, struct tdls_txmgmt *ptxmgmt, u8 privacy);\nint issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack);\nint issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta, struct tdls_txmgmt *ptxmgmt);\nint issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);\nint issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta);\nint issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);\nsint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);\nsint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Setup_Cfm(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Dis_Req(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Teardown(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Peer_Traffic_Indication(_adapter *adapter, union recv_frame *precv_frame);\nint On_TDLS_Peer_Traffic_Rsp(_adapter *adapter, union recv_frame *precv_frame);\n#ifdef CONFIG_TDLS_CH_SW\nsint On_TDLS_Ch_Switch_Req(_adapter *adapter, union recv_frame *precv_frame);\nsint On_TDLS_Ch_Switch_Rsp(_adapter *adapter, union recv_frame *precv_frame);\nvoid rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_ch_switch_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\n#endif\nvoid rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_teardown_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_dis_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_dis_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt, u8 privacy);\nvoid rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tdls_peer_traffic_indication_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt);\nvoid rtw_build_tunneled_probe_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\nvoid rtw_build_tunneled_probe_rsp_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe);\n\nu8\tupdate_sgi_tdls(_adapter *padapter, struct sta_info *psta);\nu32 update_mask_tdls(_adapter *padapter, struct sta_info *psta);\nint rtw_tdls_is_driver_setup(_adapter *padapter);\nvoid rtw_tdls_set_key(_adapter *padapter, struct sta_info *ptdls_sta);\nconst char * rtw_tdls_action_txt(enum TDLS_ACTION_FIELD action);\n#endif /* CONFIG_TDLS */\n\n#endif\n\n"
  },
  {
    "path": "include/rtw_version.h",
    "content": "#define DRIVERVERSION\t\"v4.3.21_17997.20160531\"\n"
  },
  {
    "path": "include/rtw_vht.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_VHT_H_\n#define _RTW_VHT_H_\n\n#define\tLDPC_VHT_ENABLE_RX\t\t\tBIT0\n#define\tLDPC_VHT_ENABLE_TX\t\t\tBIT1\n#define\tLDPC_VHT_TEST_TX_ENABLE\t\tBIT2\n#define\tLDPC_VHT_CAP_TX\t\t\t\tBIT3\n\n#define\tSTBC_VHT_ENABLE_RX\t\t\tBIT0\n#define\tSTBC_VHT_ENABLE_TX\t\t\tBIT1\n#define\tSTBC_VHT_TEST_TX_ENABLE\t\tBIT2\n#define\tSTBC_VHT_CAP_TX\t\t\t\tBIT3\n\n#define\tBEAMFORMING_VHT_BEAMFORMER_ENABLE\tBIT0\t// Declare our NIC supports beamformer\n#define\tBEAMFORMING_VHT_BEAMFORMEE_ENABLE\tBIT1\t// Declare our NIC supports beamformee\n#define\tBEAMFORMING_VHT_MU_MIMO_AP_ENABLE\t\tBIT2\t\t\t/*Declare our NIC support MU-MIMO AP mode*/\n#define\tBEAMFORMING_VHT_MU_MIMO_STA_ENABLE\tBIT3\t\t\t/*Declare our NIC support MU-MIMO STA mode*/\n#define\tBEAMFORMING_VHT_BEAMFORMER_TEST\t\tBIT4\t\t\t/*Transmiting Beamforming no matter the target supports it or not*/\n#define\tBEAMFORMING_VHT_BEAMFORMER_STS_CAP\t\t(BIT8|BIT9|BIT10)\t\t/*Asoc rsp cap*/\n#define\tBEAMFORMING_VHT_BEAMFORMEE_SOUND_DIM\t\t(BIT12|BIT13|BIT14)\t\t/*Asoc rsp cap*/\n\n\n//VHT capability info\n#define SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val)\n#define SET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 2, 2, _val)\n#define SET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 4, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 5, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 6, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+1, 0, 3, _val)\n#define SET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+1, 3, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+1, 4, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_BFER_ANT_SUPP(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+1, 5, 3, _val)\n#define SET_VHT_CAPABILITY_ELE_SOUNDING_DIMENSIONS(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 0, 3, _val)\n\n#define SET_VHT_CAPABILITY_ELE_MU_BFER(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 3, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_MU_BFEE(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 4, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 5, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_HTC_VHT(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 6, 1, _val)\n#define SET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart, _val)\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+2, 7, 3, _val) //B23~B25\n#define SET_VHT_CAPABILITY_ELE_LINK_ADAPTION(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+2, 2, 2, _val)\n#define SET_VHT_CAPABILITY_ELE_MCS_RX_MAP(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+4, 0, 16, _val)   /* B0~B15 indicate Rx MCS MAP, we write 0 to indicate MCS0~7. by page */\n#define SET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+6, 0, 13, _val)  \n#define SET_VHT_CAPABILITY_ELE_MCS_TX_MAP(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+8, 0, 16, _val)   /* B0~B15 indicate Tx MCS MAP, we write 0 to indicate MCS0~7. by page */\n#define SET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart, _val)\t\t\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+10, 0, 13, _val)  \n\n\n#define GET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 0, 2)\n#define GET_VHT_CAPABILITY_ELE_CHL_WIDTH(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 2, 2)\n#define GET_VHT_CAPABILITY_ELE_RX_LDPC(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 4, 1)\n#define GET_VHT_CAPABILITY_ELE_SHORT_GI80M(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 5, 1)\n#define GET_VHT_CAPABILITY_ELE_SHORT_GI160M(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 6, 1)\n#define GET_VHT_CAPABILITY_ELE_TX_STBC(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 7, 1)\n#define GET_VHT_CAPABILITY_ELE_RX_STBC(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE((_pEleStart)+1, 0, 3)\n#define GET_VHT_CAPABILITY_ELE_SU_BFER(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE((_pEleStart)+1, 3, 1)\n#define GET_VHT_CAPABILITY_ELE_SU_BFEE(_pEleStart)\t\t\t\t\tLE_BITS_TO_1BYTE((_pEleStart)+1, 4, 1)\n/*phydm-beamforming*/\n#define GET_VHT_CAPABILITY_ELE_SU_BFEE_STS_CAP(_pEleStart)\tLE_BITS_TO_2BYTE((_pEleStart)+1, 5, 3)\n#define GET_VHT_CAPABILITY_ELE_SU_BFER_SOUND_DIM_NUM(_pEleStart)\tLE_BITS_TO_2BYTE((_pEleStart)+2, 0, 3)\n#define GET_VHT_CAPABILITY_ELE_TXOP_PS(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE((_pEleStart)+2, 5, 1)\n#define GET_VHT_CAPABILITY_ELE_MAX_RXAMPDU_FACTOR(_pEleStart)\tLE_BITS_TO_2BYTE((_pEleStart)+2, 7, 3)\n#define GET_VHT_CAPABILITY_ELE_RX_MCS(_pEleStart)\t\t\t\t\t       ((_pEleStart)+4)\n#define GET_VHT_CAPABILITY_ELE_MCS_RX_HIGHEST_RATE(_pEleStart)\t\t\tLE_BITS_TO_2BYTE((_pEleStart)+6, 0, 13)  \n#define GET_VHT_CAPABILITY_ELE_TX_MCS(_pEleStart)\t\t\t\t\t       ((_pEleStart)+8)\n#define GET_VHT_CAPABILITY_ELE_MCS_TX_HIGHEST_RATE(_pEleStart)\t\t\tLE_BITS_TO_2BYTE((_pEleStart)+10, 0, 13)  \n\n\n//VHT Operation Information Element\n#define SET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 0, 8, _val)\n#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ1(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart+1, 0, 8, _val)\n#define SET_VHT_OPERATION_ELE_CHL_CENTER_FREQ2(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart+2, 0, 8, _val)\n#define SET_VHT_OPERATION_ELE_BASIC_MCS_SET(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_2BYTE((_pEleStart)+3, 0, 16, _val)\n\n#define GET_VHT_OPERATION_ELE_CHL_WIDTH(_pEleStart)\t\tLE_BITS_TO_1BYTE(_pEleStart,0,8)\n#define GET_VHT_OPERATION_ELE_CENTER_FREQ1(_pEleStart)\tLE_BITS_TO_1BYTE((_pEleStart)+1,0,8)\n#define GET_VHT_OPERATION_ELE_CENTER_FREQ2(_pEleStart)     LE_BITS_TO_1BYTE((_pEleStart)+2,0,8)\n\n//VHT Operating Mode \n#define SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart, _val)\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 0, 2, _val)\n#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE(_pEleStart, 4, 3, _val)\n#define SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart, _val)\tSET_BITS_TO_LE_1BYTE(_pEleStart, 7, 1, _val)\n#define GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(_pEleStart)\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 0, 2)\n#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE(_pEleStart, 4, 3)\n#define GET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(_pEleStart)\t\tLE_BITS_TO_1BYTE(_pEleStart, 7, 1)\n\n#define SET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart, _val)\t\t\tSET_BITS_TO_LE_1BYTE((_pEleStart)+7, 6, 1, _val)\n#define GET_EXT_CAPABILITY_ELE_OP_MODE_NOTIF(_pEleStart)\t\t\t\tLE_BITS_TO_1BYTE((_pEleStart)+7, 6, 1)\n\nstruct vht_priv\n{\n\tu8\tvht_option;\n\n\tu8\tldpc_cap;\n\tu8\tstbc_cap;\n\tu16\tbeamform_cap;\n\n\tu8\tsgi_80m;//short GI\n\tu8\tampdu_len;\n\n\tu8\tvht_op_mode_notify;\n\tu8\tvht_highest_rate;\n\tu8\tvht_mcs_map[2];\n\n\tu8\tvht_cap[32];\n};\n\nu8\trtw_get_vht_highest_rate(u8 *pvht_mcs_map);\nu16\trtw_vht_mcs_to_data_rate(u8 bw, u8 short_GI, u8 vht_mcs_rate);\nu64\trtw_vht_rate_to_bitmap(u8 *pVHTRate);\nvoid\trtw_vht_use_default_setting(_adapter *padapter);\nu32\trtw_build_vht_operation_ie(_adapter *padapter, u8 *pbuf, u8 channel);\nu32\trtw_build_vht_op_mode_notify_ie(_adapter *padapter, u8 *pbuf, u8 bw);\nu32\trtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf);\nvoid\tupdate_sta_vht_info_apmode(_adapter *padapter, PVOID psta);\nvoid\tupdate_hw_vht_param(_adapter *padapter);\nvoid\tVHT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\nvoid\tVHT_operation_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\nvoid\trtw_process_vht_op_mode_notify(_adapter *padapter, u8 *pframe, PVOID sta);\nu32\trtw_restructure_vht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len);\nvoid\tVHTOnAssocRsp(_adapter *padapter);\nu8\trtw_vht_mcsmap_to_nss(u8 *pvht_mcs_map);\n\n#endif\t//_RTW_VHT_H_\n\n"
  },
  {
    "path": "include/rtw_wapi.h",
    "content": "#ifndef __INC_WAPI_H\n#define __INC_WAPI_H\n\n\n#define CONFIG_WAPI_SW_SMS4\n#define WAPI_DEBUG\n\n#define SMS4_MIC_LEN                16\n#define WAPI_EXT_LEN                18\n#define MAX_WAPI_IE_LEN\t\t    256\n#define sMacHdrLng\t\t\t\t24\t\t// octets in data header, no WEP\n\n#ifdef WAPI_DEBUG\n\n/* WAPI trace debug */\nextern u32 wapi_debug_component;\n\nstatic inline void dump_buf(u8 *buf, u32 len)\n{\n\tu32 i;\n\tprintk(\"-----------------Len %d----------------\\n\", len);\n\tfor(i=0; i<len; i++)\n\t\tprintk(\"%2.2x-\", *(buf+i));\n\tprintk(\"\\n\");\n}\n\n#define WAPI_TRACE(component, x, args...) \\\ndo { if(wapi_debug_component & (component)) \\\n\tprintk(KERN_DEBUG \"WAPI\" \":\" x \"\" , \\\n\t       ##args);\\\n}while(0);\n\n#define WAPI_DATA(component, x, buf, len) \\\ndo { if(wapi_debug_component & (component)){ \\\n\tprintk(\"%s:\\n\", x);\\\n\tdump_buf((buf), (len));}\\\n}while(0);\n\n#define RT_ASSERT_RET(_Exp)\t\t\t\t\t\t\t\t\\\n\t\tif(!(_Exp))\t\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tprintk(\"RTWLAN: \");\t\t\t\t\t\\\n                \tprintk( \"Assertion failed! %s,%s,line=%d\\n\", \\\n                \t#_Exp,__FUNCTION__,__LINE__);          \\\n\t\t\treturn;\t\t\t\t\t\t\\\n\t\t}\n#define RT_ASSERT_RET_VALUE(_Exp,Ret)\t\t\t\t\t\t\t\t\\\n\t\tif(!(_Exp))\t\t\t\t\t\t\t\t\t\\\n\t\t{\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tprintk(\"RTWLAN: \");\t\t\t\t\t\\\n                \tprintk( \"Assertion failed! %s,%s,line=%d\\n\", \\\n                \t#_Exp,__FUNCTION__,__LINE__);          \\\n\t\t\treturn (Ret);\t\t\t\t\t\t\\\n\t\t}\n\n#else\n#define RT_ASSERT_RET(_Exp) do {} while(0)\n#define RT_ASSERT_RET_VALUE(_Exp,Ret) do {} while(0)\n#define WAPI_TRACE(component, x, args...) do {} while(0)\n#define WAPI_DATA(component, x, buf, len) do {} while(0)\n#endif\n\n\nenum WAPI_DEBUG {\n\tWAPI_INIT\t\t\t\t= 1,\n\tWAPI_API\t\t\t\t= 1<<1,\n\tWAPI_TX\t\t\t\t= 1<<2,\n\tWAPI_RX\t\t\t\t= 1<<3,\n\tWAPI_MLME\t\t\t\t= 1<<4,\n\tWAPI_IOCTL\t\t\t\t= 1<<5,\n\tWAPI_ERR\t\t        \t= 1<<31\n};\n\n#define\t\t\tWAPI_MAX_BKID_NUM\t\t\t\t4\n#define\t\t\tWAPI_MAX_STAINFO_NUM\t\t\t4\n#define\t\t\tWAPI_CAM_ENTRY_NUM\t\t\t14\t// 28/2=14\n\ntypedef struct  _RT_WAPI_BKID\n{\n\tstruct list_head\tlist;\n\tu8\t\t\t\tbkid[16];\n}RT_WAPI_BKID,*PRT_WAPI_BKID;\n\ntypedef struct  _RT_WAPI_KEY\n{\n\tu8\t\t\tdataKey[16];\n\tu8\t\t\tmicKey[16];\n\tu8\t\t\tkeyId;\n\tbool\t\t\tbSet;\n\tbool             bTxEnable;\n}RT_WAPI_KEY,*PRT_WAPI_KEY;\n\ntypedef enum _RT_WAPI_PACKET_TYPE\n{\n\tWAPI_NONE = 0,\n\tWAPI_PREAUTHENTICATE=1,\n\tWAPI_STAKEY_REQUEST=2,\n\tWAPI_AUTHENTICATE_ACTIVE=3,\n\tWAPI_ACCESS_AUTHENTICATE_REQUEST=4,\n\tWAPI_ACCESS_AUTHENTICATE_RESPONSE=5,\n\tWAPI_CERTIFICATE_AUTHENTICATE_REQUEST=6,\n\tWAPI_CERTIFICATE_AUTHENTICATE_RESPONSE=7,\n\tWAPI_USK_REQUEST=8,\n\tWAPI_USK_RESPONSE=9,\n\tWAPI_USK_CONFIRM=10,\n\tWAPI_MSK_NOTIFICATION=11,\n\tWAPI_MSK_RESPONSE=12\n}RT_WAPI_PACKET_TYPE;\n\ntypedef struct\t_RT_WAPI_STA_INFO\n{\n\tstruct list_head\t\tlist;\n\tu8\t\t\t\t\tPeerMacAddr[6];\n\tRT_WAPI_KEY\t\t      wapiUsk;\n\tRT_WAPI_KEY\t\t      wapiUskUpdate;\n\tRT_WAPI_KEY\t\t      wapiMsk;\n\tRT_WAPI_KEY\t\t      wapiMskUpdate;\n\tu8\t\t\t\t\tlastRxUnicastPN[16];\n\tu8\t\t\t\t\tlastTxUnicastPN[16];\n\tu8\t\t\t\t\tlastRxMulticastPN[16];\n\tu8\t\t\t\t\tlastRxUnicastPNBEQueue[16];\n\tu8\t\t\t\t\tlastRxUnicastPNBKQueue[16];\n\tu8\t\t\t\t\tlastRxUnicastPNVIQueue[16];\n\tu8\t\t\t\t\tlastRxUnicastPNVOQueue[16];\n\tbool\t\t\t\t\tbSetkeyOk;\n\tbool\t\t\t\t\tbAuthenticateInProgress;\n\tbool\t\t\t\t\tbAuthenticatorInUpdata;\n}RT_WAPI_STA_INFO,*PRT_WAPI_STA_INFO;\n\n//Added for HW wapi en/decryption\ntypedef struct _RT_WAPI_CAM_ENTRY{\n\t//RT_LIST_ENTRY\t\tlist;\n\tu8\t\t\tIsUsed;\n\tu8\t\t\tentry_idx;//for cam entry\n\tu8\t\t\tkeyidx;\t// 0 or 1,new or old key\n\tu8\t\t\tPeerMacAddr[6];\n\tu8\t\t\ttype;\t//should be 110,wapi\n}RT_WAPI_CAM_ENTRY,*PRT_WAPI_CAM_ENTRY;\n\ntypedef struct _RT_WAPI_T\n{\n//BKID\n\tRT_WAPI_BKID\t\twapiBKID[WAPI_MAX_BKID_NUM];\n\tstruct list_head\t\twapiBKIDIdleList;\n\tstruct list_head  \t\twapiBKIDStoreList;\n//Key for Tx Multicast/Broadcast\n\tRT_WAPI_KEY\t\t      wapiTxMsk;\n\n//sec related\n\tu8\t\t\t\tlastTxMulticastPN[16];\n//STA list\n\tRT_WAPI_STA_INFO\twapiSta[WAPI_MAX_STAINFO_NUM];\n\tstruct list_head\t\twapiSTAIdleList;\n\tstruct list_head\t\twapiSTAUsedList;\n//\n\tbool\t\t\t\tbWapiEnable;\n\n//store WAPI IE\n\tu8\t\t\t\twapiIE[256];\n\tu8\t\t\t\twapiIELength;\n\tbool\t\t\t\tbWapiPSK;\n//last sequece number for wai packet\n\tu16\t\t\t\twapiSeqnumAndFragNum;\n\tint extra_prefix_len;\n\tint extra_postfix_len;\n\n\tRT_WAPI_CAM_ENTRY\twapiCamEntry[WAPI_CAM_ENTRY_NUM];\n}RT_WAPI_T,*PRT_WAPI_T;\n\ntypedef struct _WLAN_HEADER_WAPI_EXTENSION\n{\n    u8      KeyIdx;\n    u8      Reserved;\n    u8      PN[16];\n} WLAN_HEADER_WAPI_EXTENSION, *PWLAN_HEADER_WAPI_EXTENSION;\n\nu32 WapiComparePN(u8 *PN1, u8 *PN2);\n\n\nvoid rtw_wapi_init(_adapter *padapter);\n\nvoid rtw_wapi_free(_adapter *padapter);\n\nvoid rtw_wapi_disable_tx(_adapter *padapter);\n\nu8 rtw_wapi_is_wai_packet(_adapter* padapter,u8 *pkt_data);\n\nvoid rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame);\n\nu8 rtw_wapi_check_for_drop(_adapter *padapter, union recv_frame *precv_frame);\n\nvoid rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);\n\nvoid rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);\n\nvoid rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);\n\nvoid rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);\n\nvoid rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr);\n\nvoid rtw_wapi_return_all_sta_info(_adapter *padapter);\n\nvoid rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr);\n\nvoid rtw_wapi_clear_all_cam_entry(_adapter *padapter);\n\nvoid rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey);\n\nint rtw_wapi_create_event_send(_adapter *padapter, u8 EventId, u8 *MacAddr, u8 *Buff, u16 BufLen);\n\nu32\trtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe);\n\nu32\trtw_sms4_decrypt(_adapter *padapter, u8 *precvframe);\n\nvoid rtw_wapi_get_iv(_adapter *padapter, u8*pRA, u8*IV);\n\nu8 WapiIncreasePN(u8 *PN, u8 AddCount);\n\nbool rtw_wapi_drop_for_key_absent(_adapter *padapter,u8 *pRA);\n\n#endif\n"
  },
  {
    "path": "include/rtw_wifi_regd.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2009-2010  Realtek Corporation.\n *\n *****************************************************************************/\n\n#ifndef __RTW_WIFI_REGD_H__\n#define __RTW_WIFI_REGD_H__\n\nstruct country_code_to_enum_rd {\n\tu16 countrycode;\n\tconst char *iso_name;\n};\n\nenum country_code_type_t {\n\tCOUNTRY_CODE_USER = 0,\n\n\t/*add new channel plan above this line */\n\tCOUNTRY_CODE_MAX\n}; \n\nint rtw_regd_init(_adapter *padapter);\nvoid rtw_reg_notify_by_driver(_adapter *adapter);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))\n#define ieee80211_band nl80211_band\n#define IEEE80211_BAND_2GHZ NL80211_BAND_2GHZ\n#define IEEE80211_BAND_5GHZ NL80211_BAND_5GHZ\n#define IEEE80211_NUM_BANDS NUM_NL80211_BANDS\n#endif\n\n#endif /* __RTW_WIFI_REGD_H__ */\n\n"
  },
  {
    "path": "include/rtw_xmit.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _RTW_XMIT_H_\n#define _RTW_XMIT_H_\n\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n#ifdef CONFIG_TX_AGGREGATION\n#define MAX_XMITBUF_SZ\t(20480)\t// 20k\n//#define SDIO_TX_AGG_MAX\t5\n#else\n#define MAX_XMITBUF_SZ (1664)\n#define SDIO_TX_AGG_MAX\t1\n#endif\n\n#if defined CONFIG_SDIO_HCI\n#define NR_XMITBUFF\t(16)\n#endif\n#if defined(CONFIG_GSPI_HCI)\n#define NR_XMITBUFF\t(128)\n#endif\n\n#elif defined (CONFIG_USB_HCI)\n\n#ifdef CONFIG_USB_TX_AGGREGATION\n\t#if defined(CONFIG_PLATFORM_ARM_SUNxI) || defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I) || defined(CONFIG_PLATFORM_ARM_SUN8I) || defined(CONFIG_PLATFORM_ARM_SUN50IW1P1)\n\t\t#define MAX_XMITBUF_SZ (12288)  //12k 1536*8\n\t#elif defined (CONFIG_PLATFORM_MSTAR)\n\t\t#define MAX_XMITBUF_SZ\t7680\t// 7.5k\n\t#else\n\t#define MAX_XMITBUF_SZ\t(20480)\t// 20k\n\t#endif\n#else\n#define MAX_XMITBUF_SZ\t(2048)\n#endif\n\n#ifdef CONFIG_SINGLE_XMIT_BUF\n#define NR_XMITBUFF\t(1)\n#else\n#define NR_XMITBUFF\t(4)\n#endif //CONFIG_SINGLE_XMIT_BUF\n#elif defined (CONFIG_PCI_HCI)\n#define MAX_XMITBUF_SZ\t(1664)\n#define NR_XMITBUFF\t(128)\n#endif\n\n#ifdef PLATFORM_OS_CE\n#define XMITBUF_ALIGN_SZ 4\n#else\n#ifdef CONFIG_PCI_HCI\n#define XMITBUF_ALIGN_SZ 4\n#else\n#ifdef USB_XMITBUF_ALIGN_SZ\n#define XMITBUF_ALIGN_SZ (USB_XMITBUF_ALIGN_SZ)\n#else\n#define XMITBUF_ALIGN_SZ 512\n#endif\n#endif\n#endif\n\n// xmit extension buff defination\n#define MAX_XMIT_EXTBUF_SZ\t(1536)\n\n#ifdef CONFIG_SINGLE_XMIT_BUF\n#define NR_XMIT_EXTBUFF\t(1)\n#else\n#define NR_XMIT_EXTBUFF\t(32)\n#endif\n\n#ifdef CONFIG_RTL8812A\n#define MAX_CMDBUF_SZ\t(512*12)\n#else\n#define MAX_CMDBUF_SZ\t(5120)\t//(4096)\n#endif\n\n#define MAX_NUMBLKS\t\t(1)\n\n#define XMIT_VO_QUEUE (0)\n#define XMIT_VI_QUEUE (1)\n#define XMIT_BE_QUEUE (2)\n#define XMIT_BK_QUEUE (3)\n\n#define VO_QUEUE_INX\t\t0\n#define VI_QUEUE_INX\t\t1\n#define BE_QUEUE_INX\t\t2\n#define BK_QUEUE_INX\t\t3\n#define BCN_QUEUE_INX\t\t4\n#define MGT_QUEUE_INX\t\t5\n#define HIGH_QUEUE_INX\t\t6\n#define TXCMD_QUEUE_INX\t7\n\n#define HW_QUEUE_ENTRY\t8\n\n#ifdef CONFIG_PCI_HCI\n//#define TXDESC_NUM\t\t\t\t\t\t64\n#define TXDESC_NUM\t\t\t\t\t\t128\n#define TXDESC_NUM_BE_QUEUE\t\t\t128\n#endif\n\n#define WEP_IV(pattrib_iv, dot11txpn, keyidx)\\\ndo{\\\n\tpattrib_iv[0] = dot11txpn._byte_.TSC0;\\\n\tpattrib_iv[1] = dot11txpn._byte_.TSC1;\\\n\tpattrib_iv[2] = dot11txpn._byte_.TSC2;\\\n\tpattrib_iv[3] = ((keyidx & 0x3)<<6);\\\n\tdot11txpn.val = (dot11txpn.val == 0xffffff) ? 0: (dot11txpn.val+1);\\\n}while(0)\n\n\n#define TKIP_IV(pattrib_iv, dot11txpn, keyidx)\\\ndo{\\\n\tpattrib_iv[0] = dot11txpn._byte_.TSC1;\\\n\tpattrib_iv[1] = (dot11txpn._byte_.TSC1 | 0x20) & 0x7f;\\\n\tpattrib_iv[2] = dot11txpn._byte_.TSC0;\\\n\tpattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\\\n\tpattrib_iv[4] = dot11txpn._byte_.TSC2;\\\n\tpattrib_iv[5] = dot11txpn._byte_.TSC3;\\\n\tpattrib_iv[6] = dot11txpn._byte_.TSC4;\\\n\tpattrib_iv[7] = dot11txpn._byte_.TSC5;\\\n\tdot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\\\n}while(0)\n\n#define AES_IV(pattrib_iv, dot11txpn, keyidx)\\\ndo{\\\n\tpattrib_iv[0] = dot11txpn._byte_.TSC0;\\\n\tpattrib_iv[1] = dot11txpn._byte_.TSC1;\\\n\tpattrib_iv[2] = 0;\\\n\tpattrib_iv[3] = BIT(5) | ((keyidx & 0x3)<<6);\\\n\tpattrib_iv[4] = dot11txpn._byte_.TSC2;\\\n\tpattrib_iv[5] = dot11txpn._byte_.TSC3;\\\n\tpattrib_iv[6] = dot11txpn._byte_.TSC4;\\\n\tpattrib_iv[7] = dot11txpn._byte_.TSC5;\\\n\tdot11txpn.val = dot11txpn.val == 0xffffffffffffULL ? 0: (dot11txpn.val+1);\\\n}while(0)\n\n\n#define HWXMIT_ENTRY\t4\n\n// For Buffer Descriptor ring architecture\n#ifdef BUF_DESC_ARCH\t\n#if defined(CONFIG_RTL8192E)\n#define TX_BUFFER_SEG_NUM\t1 /* 0:2 seg, 1: 4 seg, 2: 8 seg. */\n#elif defined(CONFIG_RTL8814A)\n#define TX_BUFFER_SEG_NUM\t1 /* 0:2 seg, 1: 4 seg, 2: 8 seg. */\n#endif\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8703B) || defined(CONFIG_RTL8188F)\n#define TXDESC_SIZE 40\n#else\n#define TXDESC_SIZE 32 /* old IC (ex: 8188E) */\n#endif\n\n#ifdef CONFIG_TX_EARLY_MODE\n#define EARLY_MODE_INFO_SIZE\t8\n#endif\n\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n#define TXDESC_OFFSET TXDESC_SIZE\n#endif\n\n#ifdef CONFIG_USB_HCI\n#ifdef USB_PACKET_OFFSET_SZ\n#define PACKET_OFFSET_SZ (USB_PACKET_OFFSET_SZ)\n#else\n#define PACKET_OFFSET_SZ (8)\n#endif\n#define TXDESC_OFFSET (TXDESC_SIZE + PACKET_OFFSET_SZ)\n#endif\n\n#ifdef CONFIG_PCI_HCI\n#if defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8814A)\n/* this section is defined for buffer descriptor ring architecture */\n#define TX_WIFI_INFO_SIZE (TXDESC_SIZE) /* it may add 802.11 hdr or others... */\n/* tx desc and payload are in the same buf */\n#define TXDESC_OFFSET (TX_WIFI_INFO_SIZE)\n#else\n/* tx desc and payload are NOT in the same buf */\n#define TXDESC_OFFSET (0)\n/* 8188ee/8723be/8812ae/8821ae has extra PCI DMA info in tx desc */\n#define TX_DESC_NEXT_DESC_OFFSET\t(TXDESC_SIZE + 8)\n#endif\n#endif /* CONFIG_PCI_HCI */\n\nenum TXDESC_SC{\n\tSC_DONT_CARE = 0x00,\n\tSC_UPPER= 0x01,\t\n\tSC_LOWER=0x02,\n\tSC_DUPLICATE=0x03\n};\n\n#ifdef CONFIG_PCI_HCI\n#define TXDESC_64_BYTES\n#elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8188F)\n#define TXDESC_40_BYTES\n#endif\n\n#if (defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8814A)) && defined(CONFIG_PCI_HCI) /* 8192ee or 8814ae */\n//8192EE_TODO\nstruct tx_desc\n{\n\tunsigned int txdw0;\n\tunsigned int txdw1;\n\tunsigned int txdw2;\n\tunsigned int txdw3;\n\tunsigned int txdw4;\n\tunsigned int txdw5;\n\tunsigned int txdw6;\n\tunsigned int txdw7;\n};\n#else\nstruct tx_desc\n{\n\tunsigned int txdw0;\n\tunsigned int txdw1;\n\tunsigned int txdw2;\n\tunsigned int txdw3;\n\tunsigned int txdw4;\n\tunsigned int txdw5;\n\tunsigned int txdw6;\n\tunsigned int txdw7;\n\n#if defined(TXDESC_40_BYTES) || defined(TXDESC_64_BYTES)\n\tunsigned int txdw8;\n\tunsigned int txdw9;\n#endif // TXDESC_40_BYTES\n\n#ifdef TXDESC_64_BYTES\n\tunsigned int txdw10;\n\tunsigned int txdw11;\n\n\t// 2008/05/15 MH Because PCIE HW memory R/W 4K limit. And now,  our descriptor\n\t// size is 40 bytes. If you use more than 102 descriptor( 103*40>4096), HW will execute\n\t// memoryR/W CRC error. And then all DMA fetch will fail. We must decrease descriptor\n\t// number or enlarge descriptor size as 64 bytes.\n\tunsigned int txdw12;\n\tunsigned int txdw13;\n\tunsigned int txdw14;\n\tunsigned int txdw15;\n#endif\n};\n#endif\n\nunion txdesc {\n\tstruct tx_desc txdesc;\n\tunsigned int value[TXDESC_SIZE>>2];\n};\n\n#ifdef CONFIG_PCI_HCI\n#define PCI_MAX_TX_QUEUE_COUNT\t8\n\nstruct rtw_tx_ring {\n\tunsigned char\tqid;\n\tstruct tx_desc\t*desc;\n\tdma_addr_t\tdma;\n\tunsigned int\tidx;\n\tunsigned int\tentries;\n\t_queue\t\tqueue;\n\tu32\t\tqlen;\n};\n#endif\n\nstruct\thw_xmit\t{\n\t//_lock xmit_lock;\n\t//_list\tpending;\n\t_queue *sta_queue;\n\t//struct hw_txqueue *phwtxqueue;\n\t//sint\ttxcmdcnt;\n\tint\taccnt;\n};\n\n#if 0\nstruct pkt_attrib\n{\n\tu8\ttype;\n\tu8\tsubtype;\n\tu8\tbswenc;\n\tu8\tdhcp_pkt;\n\tu16\tether_type;\n\tint\tpktlen;\t\t//the original 802.3 pkt raw_data len (not include ether_hdr data)\n\tint\tpkt_hdrlen;\t//the original 802.3 pkt header len\n\tint\thdrlen;\t\t//the WLAN Header Len\n\tint\tnr_frags;\n\tint\tlast_txcmdsz;\n\tint\tencrypt;\t//when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith\n\tu8\tiv[8];\n\tint\tiv_len;\n\tu8\ticv[8];\n\tint\ticv_len;\n\tint\tpriority;\n\tint\tack_policy;\n\tint\tmac_id;\n\tint\tvcs_mode;\t//virtual carrier sense method\n\n\tu8 \tdst[ETH_ALEN];\n\tu8\tsrc[ETH_ALEN];\n\tu8\tta[ETH_ALEN];\n\tu8 \tra[ETH_ALEN];\n\n\tu8\tkey_idx;\n\n\tu8\tqos_en;\n\tu8\tht_en;\n\tu8\traid;//rate adpative id\n\tu8\tbwmode;\n\tu8\tch_offset;//PRIME_CHNL_OFFSET\n\tu8\tsgi;//short GI\n\tu8\tampdu_en;//tx ampdu enable\n\tu8\tmdata;//more data bit\n\tu8\teosp;\n\n\tu8\ttriggered;//for ap mode handling Power Saving sta\n\n\tu32\tqsel;\n\tu16\tseqnum;\n\n\tstruct sta_info * psta;\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\tu8\thw_tcp_csum;\n#endif\n};\n#else\n//reduce size\nstruct pkt_attrib\n{\n\tu8\ttype;\n\tu8\tsubtype;\n\tu8\tbswenc;\n\tu8\tdhcp_pkt;\n\tu16\tether_type;\n\tu16\tseqnum;\n\tu8 \thw_ssn_sel;\t//for HW_SEQ0,1,2,3\n\tu16\tpkt_hdrlen;\t//the original 802.3 pkt header len\n\tu16\thdrlen;\t\t//the WLAN Header Len\n\tu32\tpktlen;\t\t//the original 802.3 pkt raw_data len (not include ether_hdr data)\n\tu32\tlast_txcmdsz;\n\tu8\tnr_frags;\n\tu8\tencrypt;\t//when 0 indicate no encrypt. when non-zero, indicate the encrypt algorith\n\tu8\tiv_len;\n\tu8\ticv_len;\n\tu8\tiv[18];\n\tu8\ticv[16];\n\tu8\tpriority;\n\tu8\tack_policy;\n\tu8\tmac_id;\n\tu8\tvcs_mode;\t//virtual carrier sense method\n\tu8 \tdst[ETH_ALEN];\n\tu8\tsrc[ETH_ALEN];\n\tu8\tta[ETH_ALEN];\n\tu8 \tra[ETH_ALEN];\n\tu8\tkey_idx;\n\tu8\tqos_en;\n\tu8\tht_en;\n\tu8\traid;//rate adpative id\n\tu8\tbwmode;\n\tu8\tch_offset;//PRIME_CHNL_OFFSET\n\tu8\tsgi;//short GI\n\tu8\tampdu_en;//tx ampdu enable\n\tu8\tampdu_spacing; //ampdu_min_spacing for peer sta's rx\n\tu8\tmdata;//more data bit\n\tu8\tpctrl;//per packet txdesc control enable\n\tu8\ttriggered;//for ap mode handling Power Saving sta\n\tu8\tqsel;\n\tu8\torder;//order bit\n\tu8\teosp;\n\tu8\trate;\n\tu8\tintel_proxim;\n\tu8 \tretry_ctrl;\n\tu8   mbssid;\n\tu8\tldpc;\n\tu8\tstbc;\n\tstruct sta_info * psta;\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\tu8\thw_tcp_csum;\n#endif\n\n\tu8 rtsen;\n\tu8 cts2self;\n\tunion Keytype\tdot11tkiptxmickey;\n\t//union Keytype\tdot11tkiprxmickey;\n\tunion Keytype\tdot118021x_UncstKey;\n\n#ifdef CONFIG_TDLS\n\tu8 direct_link;\n\tstruct sta_info *ptdls_sta;\n#endif //CONFIG_TDLS\n\tu8 key_type;\n\n\tu8 icmp_pkt;\n\tu16 txbf_p_aid;/*beamforming Partial_AID*/\n\tu16 txbf_g_id;/*beamforming Group ID*/\n\t\n};\n#endif\n\n#ifdef PLATFORM_FREEBSD\n#define ETH_ALEN\t6\t\t/* Octets in one ethernet addr\t */\n#define ETH_HLEN\t14\t\t/* Total octets in header.\t */\n#define ETH_P_IP\t0x0800\t\t/* Internet Protocol packet\t*/\n\n/*struct rtw_ieee80211_hdr {\n\tuint16_t frame_control;\n\tuint16_t duration_id;\n\tu8 addr1[6];\n\tu8 addr2[6];\n\tu8 addr3[6];\n\tuint16_t seq_ctrl;\n\tu8 addr4[6];\n} ;*/\n#endif //PLATFORM_FREEBSD\n\n#define WLANHDR_OFFSET\t64\n\n#define NULL_FRAMETAG\t\t(0x0)\n#define DATA_FRAMETAG\t\t0x01\n#define L2_FRAMETAG\t\t0x02\n#define MGNT_FRAMETAG\t\t0x03\n#define AMSDU_FRAMETAG\t0x04\n\n#define EII_FRAMETAG\t\t0x05\n#define IEEE8023_FRAMETAG  0x06\n\n#define MP_FRAMETAG\t\t0x07\n\n#define TXAGG_FRAMETAG \t0x08\n\nenum {\n\tXMITBUF_DATA = 0,\n\tXMITBUF_MGNT = 1,\n\tXMITBUF_CMD = 2,\n};\n\nbool rtw_xmit_ac_blocked(_adapter *adapter);\n\nstruct  submit_ctx{\n\tu32 submit_time; /* */\n\tu32 timeout_ms; /* <0: not synchronous, 0: wait forever, >0: up to ms waiting */\n\tint status; /* status for operation */\n#ifdef PLATFORM_LINUX\n\tstruct completion done;\n#endif\n};\n\nenum {\n\tRTW_SCTX_SUBMITTED = -1,\n\tRTW_SCTX_DONE_SUCCESS = 0,\n\tRTW_SCTX_DONE_UNKNOWN,\n\tRTW_SCTX_DONE_TIMEOUT,\n\tRTW_SCTX_DONE_BUF_ALLOC,\n\tRTW_SCTX_DONE_BUF_FREE,\n\tRTW_SCTX_DONE_WRITE_PORT_ERR,\n\tRTW_SCTX_DONE_TX_DESC_NA,\n\tRTW_SCTX_DONE_TX_DENY,\n\tRTW_SCTX_DONE_CCX_PKT_FAIL,\n\tRTW_SCTX_DONE_DRV_STOP,\n\tRTW_SCTX_DONE_DEV_REMOVE,\n\tRTW_SCTX_DONE_CMD_ERROR,\n};\n\n\nvoid rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms);\nint rtw_sctx_wait(struct submit_ctx *sctx, const char *msg);\nvoid rtw_sctx_done_err(struct submit_ctx **sctx, int status);\nvoid rtw_sctx_done(struct submit_ctx **sctx);\n\nstruct xmit_buf\n{\n\t_list\tlist;\n\n\t_adapter *padapter;\n\n\tu8 *pallocated_buf;\n\n\tu8 *pbuf;\n\n\tvoid *priv_data;\n\n\tu16 buf_tag; // 0: Normal xmitbuf, 1: extension xmitbuf, 2:cmd xmitbuf\n\tu16 flags;\n\tu32 alloc_sz;\n\n\tu32  len;\n\n\tstruct submit_ctx *sctx;\n\n#ifdef CONFIG_USB_HCI\n\n\t//u32 sz[8];\n\tu32\tff_hwaddr;\n\n#if defined(PLATFORM_OS_XP)||defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)\n\tPURB\tpxmit_urb[8];\n\tdma_addr_t dma_transfer_addr;\t/* (in) dma addr for transfer_buffer */\n#endif\n\n#ifdef PLATFORM_OS_XP\n\tPIRP\t\tpxmit_irp[8];\n#endif\n\n#ifdef PLATFORM_OS_CE\n\tUSB_TRANSFER\tusb_transfer_write_port;\n#endif\n\n\tu8 bpending[8];\n\n\tsint last[8];\n\n#endif\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tu8 *phead;\n\tu8 *pdata;\n\tu8 *ptail;\n\tu8 *pend;\n\tu32 ff_hwaddr;\n\tu8\tpg_num;\t\n\tu8\tagg_num;\n#ifdef PLATFORM_OS_XP\n\tPMDL pxmitbuf_mdl;\n\tPIRP  pxmitbuf_irp;\n\tPSDBUS_REQUEST_PACKET pxmitbuf_sdrp;\n#endif\n#endif\n\n#ifdef CONFIG_PCI_HCI\n\tstruct tx_desc *desc;\n#endif\n\n#if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)\n\tu8 no;\n#endif\n\n};\n\n\nstruct xmit_frame\n{\n\t_list\tlist;\n\n\tstruct pkt_attrib attrib;\n\n\t_pkt *pkt;\n\n\tint\tframe_tag;\n\n\t_adapter *padapter;\n\n\tu8\t*buf_addr;\n\n\tstruct xmit_buf *pxmitbuf;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tu8\tpg_num;\n\tu8\tagg_num;\n#endif\n\n#ifdef CONFIG_USB_HCI\n#ifdef CONFIG_USB_TX_AGGREGATION\n\tu8\tagg_num;\n#endif\n\ts8\tpkt_offset;\n#endif\n\n#ifdef CONFIG_XMIT_ACK\n\tu8 ack_report;\n#endif\n\n\tu8 *alloc_addr; /* the actual address this xmitframe allocated */\n\tu8 ext_tag; /* 0:data, 1:mgmt */\n\n};\n\nstruct tx_servq {\n\t_list\ttx_pending;\n\t_queue\tsta_pending;\n\tint qcnt;\n};\n\n\nstruct sta_xmit_priv\n{\n\t_lock\tlock;\n\tsint\toption;\n\tsint\tapsd_setting;\t//When bit mask is on, the associated edca queue supports APSD.\n\n\n\t//struct tx_servq blk_q[MAX_NUMBLKS];\n\tstruct tx_servq\tbe_q;\t\t\t//priority == 0,3\n\tstruct tx_servq\tbk_q;\t\t\t//priority == 1,2\n\tstruct tx_servq\tvi_q;\t\t\t//priority == 4,5\n\tstruct tx_servq\tvo_q;\t\t\t//priority == 6,7\n\t_list \tlegacy_dz;\n\t_list  apsd;\n\n\tu16 txseq_tid[16];\n\n\t//uint\tsta_tx_bytes;\n\t//u64\tsta_tx_pkts;\n\t//uint\tsta_tx_fail;\n\n\n};\n\n\nstruct\thw_txqueue\t{\n\tvolatile sint\thead;\n\tvolatile sint\ttail;\n\tvolatile sint \tfree_sz;\t//in units of 64 bytes\n\tvolatile sint      free_cmdsz;\n\tvolatile sint\t txsz[8];\n\tuint\tff_hwaddr;\n\tuint\tcmd_hwaddr;\n\tsint\tac_tag;\n};\n\nstruct agg_pkt_info{\n\tu16 offset;\n\tu16 pkt_len;\n};\n\nenum cmdbuf_type {\n\tCMDBUF_BEACON = 0x00,\n\tCMDBUF_RSVD,\n\tCMDBUF_MAX\n};\n\nu8 rtw_get_hwseq_no(_adapter *padapter);\n\nstruct\txmit_priv\t{\n\n\t_lock\tlock;\n\n\t_sema\txmit_sema;\n\t_sema\tterminate_xmitthread_sema;\n\n\t//_queue\tblk_strms[MAX_NUMBLKS];\n\t_queue\tbe_pending;\n\t_queue\tbk_pending;\n\t_queue\tvi_pending;\n\t_queue\tvo_pending;\n\t_queue\tbm_pending;\n\n\t//_queue\tlegacy_dz_queue;\n\t//_queue\tapsd_queue;\n\n\tu8 *pallocated_frame_buf;\n\tu8 *pxmit_frame_buf;\n\tuint free_xmitframe_cnt;\n\t_queue\tfree_xmit_queue;\n\n\t//uint mapping_addr;\n\t//uint pkt_sz;\n\n\tu8 *xframe_ext_alloc_addr;\n\tu8 *xframe_ext;\n\tuint free_xframe_ext_cnt;\n\t_queue free_xframe_ext_queue;\n\n\t//struct\thw_txqueue\tbe_txqueue;\n\t//struct\thw_txqueue\tbk_txqueue;\n\t//struct\thw_txqueue\tvi_txqueue;\n\t//struct\thw_txqueue\tvo_txqueue;\n\t//struct\thw_txqueue\tbmc_txqueue;\n\n\tuint\tfrag_len;\n\n\t_adapter\t*adapter;\n\n\tu8   vcs_setting;\n\tu8\tvcs;\n\tu8\tvcs_type;\n\t//u16  rts_thresh;\n\n\tu64\ttx_bytes;\n\tu64\ttx_pkts;\n\tu64\ttx_drop;\n\tu64\tlast_tx_pkts;\n\n\tstruct hw_xmit *hwxmits;\n\tu8\thwxmit_entry;\n\n\tu8\twmm_para_seq[4];//sequence for wmm ac parameter strength from large to small. it's value is 0->vo, 1->vi, 2->be, 3->bk.\n\n#ifdef CONFIG_USB_HCI\n\t_sema\ttx_retevt;//all tx return event;\n\tu8\t\ttxirp_cnt;//\n\n#ifdef PLATFORM_OS_CE\n\tUSB_TRANSFER\tusb_transfer_write_port;\n//\tUSB_TRANSFER\tusb_transfer_write_mem;\n#endif\n#ifdef PLATFORM_LINUX\n\tstruct tasklet_struct xmit_tasklet;\n#endif\n#ifdef PLATFORM_FREEBSD\n\tstruct task xmit_tasklet;\n#endif\n\t//per AC pending irp\n\tint beq_cnt;\n\tint bkq_cnt;\n\tint viq_cnt;\n\tint voq_cnt;\n\n#endif\n\n#ifdef CONFIG_PCI_HCI\n\t// Tx\n\tstruct rtw_tx_ring\ttx_ring[PCI_MAX_TX_QUEUE_COUNT];\n\tint\ttxringcount[PCI_MAX_TX_QUEUE_COUNT];\n\tu8 \tbeaconDMAing;\t\t//flag of indicating beacon is transmiting to HW by DMA\n#ifdef PLATFORM_LINUX\n\tstruct tasklet_struct xmit_tasklet;\n#endif\n#endif\n\n#if defined (CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n#ifdef CONFIG_SDIO_TX_TASKLET\n\t#ifdef PLATFORM_LINUX\n\tstruct tasklet_struct xmit_tasklet;\n\t#endif /* PLATFORM_LINUX */\n#else\n\t_thread_hdl_\tSdioXmitThread;\n\t_sema\t\tSdioXmitSema;\n\t_sema\t\tSdioXmitTerminateSema;\n#endif /* CONFIG_SDIO_TX_TASKLET */\n#endif /* CONFIG_SDIO_HCI */\n\n\t_queue free_xmitbuf_queue;\n\t_queue pending_xmitbuf_queue;\n\tu8 *pallocated_xmitbuf;\n\tu8 *pxmitbuf;\n\tuint free_xmitbuf_cnt;\n\n\t_queue free_xmit_extbuf_queue;\n\tu8 *pallocated_xmit_extbuf;\n\tu8 *pxmit_extbuf;\n\tuint free_xmit_extbuf_cnt;\n\n\tstruct xmit_buf\tpcmd_xmitbuf[CMDBUF_MAX];\n\tu8   hw_ssn_seq_no;//mapping to REG_HW_SEQ 0,1,2,3\n\tu16\tnqos_ssn;\n\t#ifdef CONFIG_TX_EARLY_MODE\n\n\t#ifdef CONFIG_SDIO_HCI\n\t#define MAX_AGG_PKT_NUM 20\t\n\t#else\n\t#define MAX_AGG_PKT_NUM 256 //Max tx ampdu coounts\t\t\n\t#endif\n\t\n\tstruct agg_pkt_info agg_pkt[MAX_AGG_PKT_NUM];\n\t#endif\n\n#ifdef CONFIG_XMIT_ACK\n\tint\tack_tx;\n\t_mutex ack_tx_mutex;\n\tstruct submit_ctx ack_tx_ops;\n\tu8 seq_no;\n#endif\n\t_lock lock_sctx;\n};\n\nextern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,\n\t\tenum cmdbuf_type buf_type);\n#define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)\n#if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) \nextern struct xmit_frame *__rtw_alloc_cmdxmitframe_8192ee(struct xmit_priv *pxmitpriv,\n\t\tenum cmdbuf_type buf_type);\n#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe_8192ee(p, CMDBUF_BEACON)\n#else\n#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)\n#endif\n\nextern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);\nextern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n\nextern struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv);\nextern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\n\nvoid rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);\nextern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);\nstatic s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);\nstatic void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);\nextern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);\nextern s32 rtw_put_snap(u8 *data, u16 h_proto);\n\nextern struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv);\nstruct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv);\nstruct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv);\nextern s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe);\nextern void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue);\nstruct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac);\nextern s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);\nextern struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry);\n\nextern s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe);\nextern u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib);\n#define rtw_wlan_pkt_size(f) rtw_calculate_wlan_pkt_size_by_attribue(&f->attrib)\nextern s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);\n#ifdef CONFIG_IEEE80211W\nextern s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe);\n#endif //CONFIG_IEEE80211W\n#ifdef CONFIG_TDLS\nextern struct tdls_txmgmt *ptxmgmt;\ns32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt);\ns32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib);\n#endif\ns32 _rtw_init_hw_txqueue(struct hw_txqueue* phw_txqueue, u8 ac_tag);\nvoid _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv);\n\n\ns32 rtw_txframes_pending(_adapter *padapter);\ns32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib);\nvoid rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry);\n\n\ns32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter);\nvoid _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv);\n\n\nvoid rtw_alloc_hwxmits(_adapter *padapter);\nvoid rtw_free_hwxmits(_adapter *padapter);\n\n\ns32 rtw_xmit(_adapter *padapter, _pkt **pkt);\nbool xmitframe_hiq_filter(struct xmit_frame *xmitframe);\n#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)\nsint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);\nvoid stop_sta_xmit(_adapter *padapter, struct sta_info *psta);\nvoid wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta);\nvoid xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta);\n#endif\n\nu8\tquery_ra_short_GI(struct sta_info *psta);\n\nu8\tqos_acm(u8 acm_mask, u8 priority);\n\n#ifdef CONFIG_XMIT_THREAD_MODE\nvoid\tenqueue_pending_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\nvoid enqueue_pending_xmitbuf_to_head(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);\nstruct xmit_buf*\tdequeue_pending_xmitbuf(struct xmit_priv *pxmitpriv);\nstruct xmit_buf*\tdequeue_pending_xmitbuf_under_survey(struct xmit_priv *pxmitpriv);\nsint\tcheck_pending_xmitbuf(struct xmit_priv *pxmitpriv);\nthread_return\trtw_xmit_thread(thread_context context);\n#endif\n\nstatic void do_queue_select(_adapter * padapter, struct pkt_attrib * pattrib);\nu32\trtw_get_ff_hwaddr(struct xmit_frame\t*pxmitframe);\n\n#ifdef CONFIG_XMIT_ACK\nint rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms);\nvoid rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status);\n#endif //CONFIG_XMIT_ACK\n\n\n//include after declaring struct xmit_buf, in order to avoid warning\n#include <xmit_osdep.h>\n\n#endif\t//_RTL871X_XMIT_H_\n\n"
  },
  {
    "path": "include/sdio_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_HAL_H__\n#define __SDIO_HAL_H__\n\n\nextern u8 sd_hal_bus_init(PADAPTER padapter);\nextern u8 sd_hal_bus_deinit(PADAPTER padapter);\n\nu8 sd_int_isr(PADAPTER padapter);\nvoid sd_int_dpc(PADAPTER padapter);\nu8 rtw_set_hal_ops(_adapter *padapter);\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188es_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8723B\nvoid rtl8723bs_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8821A\nvoid rtl8821as_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8192E\nvoid rtl8192es_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8703B\nvoid rtl8703bs_set_hal_ops(PADAPTER padapter);\n#endif\n\n#ifdef CONFIG_RTL8188F\nvoid rtl8188fs_set_hal_ops(PADAPTER padapter);\n#endif\n\n#endif //__SDIO_HAL_H__\n\n"
  },
  {
    "path": "include/sdio_ops.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_OPS_H__\n#define __SDIO_OPS_H__\n\n\n#ifdef PLATFORM_LINUX\n#include <sdio_ops_linux.h>\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\n#ifdef PLATFORM_OS_XP\n#include <sdio_ops_xp.h>\nstruct async_context\n{\n\tPMDL pmdl;\n\tPSDBUS_REQUEST_PACKET sdrp;\n\tunsigned char* r_buf;\n\tunsigned char* padapter;\n};\n#endif\n\n#ifdef PLATFORM_OS_CE\n#include <sdio_ops_ce.h>\n#endif\n\n#endif // PLATFORM_WINDOWS\n\n\nextern void sdio_set_intf_ops(_adapter *padapter,struct _io_ops *pops);\n\t\n//extern void sdio_func1cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);\n//extern void sdio_func1cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);\nextern u8 SdioLocalCmd52Read1Byte(PADAPTER padapter, u32 addr);\nextern void SdioLocalCmd52Write1Byte(PADAPTER padapter, u32 addr, u8 v);\nextern s32 _sdio_local_read(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);\nextern s32 sdio_local_read(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);\nextern s32 _sdio_local_write(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);\nextern s32 sdio_local_write(PADAPTER padapter, u32 addr, u32 cnt, u8 *pbuf);\n\nu32 _sdio_read32(PADAPTER padapter, u32 addr);\ns32 _sdio_write32(PADAPTER padapter, u32 addr, u32 val);\n\nextern void sd_int_hdl(PADAPTER padapter);\nextern u8 CheckIPSStatus(PADAPTER padapter);\n\n#ifdef CONFIG_RTL8188E\nextern void InitInterrupt8188ESdio(PADAPTER padapter);\nextern void EnableInterrupt8188ESdio(PADAPTER padapter);\nextern void DisableInterrupt8188ESdio(PADAPTER padapter);\nextern void UpdateInterruptMask8188ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);\nextern u8 HalQueryTxBufferStatus8189ESdio(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8189ESdio(PADAPTER padapter);\nextern void ClearInterrupt8188ESdio(PADAPTER padapter);\n#endif // CONFIG_RTL8188E\n\n#ifdef CONFIG_RTL8821A\nextern void InitInterrupt8821AS(PADAPTER padapter);\nextern void EnableInterrupt8821AS(PADAPTER padapter);\nextern void DisableInterrupt8821AS(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8821AS(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8821ASdio(PADAPTER padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nvoid ClearInterrupt8821AS(PADAPTER padapter);\n#endif /* defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) */\n#endif /* CONFIG_RTL8821A */\n\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nextern u8 RecvOnePkt(PADAPTER padapter, u32 size);\n#endif // CONFIG_WOWLAN\n#ifdef CONFIG_RTL8723B\nextern void InitInterrupt8723BSdio(PADAPTER padapter);\nextern void InitSysInterrupt8723BSdio(PADAPTER padapter);\nextern void EnableInterrupt8723BSdio(PADAPTER padapter);\nextern void DisableInterrupt8723BSdio(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8723BSdio(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8723BSdio(PADAPTER padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nextern void DisableInterruptButCpwm28723BSdio(PADAPTER padapter);\nextern void ClearInterrupt8723BSdio(PADAPTER padapter);\n#endif //CONFIG_WOWLAN\n#endif\n\n\n#ifdef CONFIG_RTL8192E\nextern void InitInterrupt8192ESdio(PADAPTER padapter);\nextern void EnableInterrupt8192ESdio(PADAPTER padapter);\nextern void DisableInterrupt8192ESdio(PADAPTER padapter);\nextern void UpdateInterruptMask8192ESdio(PADAPTER padapter, u32 AddMSR, u32 RemoveMSR);\nextern u8 HalQueryTxBufferStatus8192ESdio(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8192ESdio(PADAPTER padapter);\nextern void ClearInterrupt8192ESdio(PADAPTER padapter);\n#endif // CONFIG_RTL8192E\n\n#ifdef CONFIG_RTL8703B\nextern void InitInterrupt8703BSdio(PADAPTER padapter);\nextern void InitSysInterrupt8703BSdio(PADAPTER padapter);\nextern void EnableInterrupt8703BSdio(PADAPTER padapter);\nextern void DisableInterrupt8703BSdio(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8703BSdio(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8703BSdio(PADAPTER padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nextern void DisableInterruptButCpwm28703BSdio(PADAPTER padapter);\nextern void ClearInterrupt8703BSdio(PADAPTER padapter);\n#endif //CONFIG_WOWLAN\n#endif\n\n#ifdef CONFIG_RTL8188F\nextern void InitInterrupt8188FSdio(PADAPTER padapter);\nextern void InitSysInterrupt8188FSdio(PADAPTER padapter);\nextern void EnableInterrupt8188FSdio(PADAPTER padapter);\nextern void DisableInterrupt8188FSdio(PADAPTER padapter);\nextern u8 HalQueryTxBufferStatus8188FSdio(PADAPTER padapter);\nextern u8 HalQueryTxOQTBufferStatus8188FSdio(PADAPTER padapter);\n#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)\nextern void DisableInterruptButCpwm28188FSdio(PADAPTER padapter);\nextern void ClearInterrupt8188FSdio(PADAPTER padapter);\n#endif /* defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) */\n#endif\n\n#endif // !__SDIO_OPS_H__\n\n"
  },
  {
    "path": "include/sdio_ops_ce.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _SDIO_OPS_WINCE_H_\n#define _SDIO_OPS_WINCE_H_\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n#include <osdep_intf.h>\n\n\n#ifdef PLATFORM_OS_CE\n\n\nextern u8 sdbus_cmd52r_ce(struct intf_priv *pintfpriv, u32 addr);\n\n\nextern void sdbus_cmd52w_ce(struct intf_priv *pintfpriv, u32 addr,u8 val8);\n\n\nuint sdbus_read_blocks_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\n\nextern uint sdbus_read_bytes_to_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\n\n\nextern uint sdbus_write_blocks_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async);\n\nextern uint sdbus_write_bytes_from_membuf_ce(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\nextern u8 sdbus_func1cmd52r_ce(struct intf_priv *pintfpriv, u32 addr);\nextern void sdbus_func1cmd52w_ce(struct intf_priv *pintfpriv, u32 addr, u8 val8);\nextern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata);\nextern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata);\nextern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata);\n\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/sdio_ops_linux.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_OPS_LINUX_H__\n#define __SDIO_OPS_LINUX_H__\n\n#define SDIO_ERR_VAL8\t0xEA\n#define SDIO_ERR_VAL16\t0xEAEA\n#define SDIO_ERR_VAL32\t0xEAEAEAEA\n\nu8 sd_f0_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\nvoid sd_f0_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err);\n\ns32 _sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata);\ns32 _sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata);\ns32 sd_cmd52_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata);\ns32 sd_cmd52_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pdata);\n\nu8 _sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\nu8 sd_read8(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\nu16 sd_read16(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\nu32 _sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\nu32 sd_read32(struct intf_hdl *pintfhdl, u32 addr, s32 *err);\ns32 _sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata);\ns32 sd_read(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata);\nvoid sd_write8(struct intf_hdl *pintfhdl, u32 addr, u8 v, s32 *err);\nvoid sd_write16(struct intf_hdl *pintfhdl, u32 addr, u16 v, s32 *err);\nvoid _sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err);\nvoid sd_write32(struct intf_hdl *pintfhdl, u32 addr, u32 v, s32 *err);\ns32 _sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata);\ns32 sd_write(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, void *pdata);\n\n\nvoid rtw_sdio_set_irq_thd(struct dvobj_priv *dvobj, _thread_hdl_ thd_hdl);\n#endif\n\n"
  },
  {
    "path": "include/sdio_ops_xp.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _SDIO_OPS_XP_H_\n#define _SDIO_OPS_XP_H_\n\n#include <drv_conf.h>\n#include <osdep_service.h>\n#include <drv_types.h>\n#include <osdep_intf.h>\n\n\n#ifdef PLATFORM_OS_XP\n\n\nextern u8 sdbus_cmd52r_xp(struct intf_priv *pintfpriv, u32 addr);\n\n\nextern void sdbus_cmd52w_xp(struct intf_priv *pintfpriv, u32 addr,u8 val8);\n\n\nuint sdbus_read_blocks_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\n\nextern uint sdbus_read_bytes_to_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\n\n\nextern uint sdbus_write_blocks_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf,u8 async);\n\nextern uint sdbus_write_bytes_from_membuf_xp(struct intf_priv *pintfpriv, u32 addr, u32 cnt, u8 *pbuf);\nextern u8 sdbus_func1cmd52r_xp(struct intf_priv *pintfpriv, u32 addr);\nextern void sdbus_func1cmd52w_xp(struct intf_priv *pintfpriv, u32 addr, u8 val8);\nextern uint sdbus_read_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata);\nextern uint sdbus_write_reg(struct intf_priv *pintfpriv, u32 addr, u32 cnt,void *pdata);\nextern void sdio_read_int(_adapter *padapter, u32 addr,u8 sz,void *pdata);\n\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/sdio_osintf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __SDIO_OSINTF_H__\n#define __SDIO_OSINTF_H__\n\n\n\nu8 sd_hal_bus_init(PADAPTER padapter);\nu8 sd_hal_bus_deinit(PADAPTER padapter);\nvoid sd_c2h_hdl(PADAPTER padapter);\n\n#ifdef PLATFORM_OS_CE\nextern NDIS_STATUS ce_sd_get_dev_hdl(PADAPTER padapter);\nSD_API_STATUS ce_sd_int_callback(SD_DEVICE_HANDLE hDevice, PADAPTER padapter);\nextern void sd_setup_irs(PADAPTER padapter);\n#endif\n\n#endif\n\n"
  },
  {
    "path": "include/sta_info.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __STA_INFO_H_\n#define __STA_INFO_H_\n\n\n#define IBSS_START_MAC_ID\t2\n#define NUM_STA MACID_NUM_SW_LIMIT\n#define NUM_ACL 16\n\n#ifdef CONFIG_TDLS\n#define MAX_ALLOWED_TDLS_STA_NUM\t4\n#endif\n\nenum sta_info_update_type {\n\tSTA_INFO_UPDATE_NONE = 0, \n\tSTA_INFO_UPDATE_BW = BIT(0), \n\tSTA_INFO_UPDATE_RATE = BIT(1),\t\n\tSTA_INFO_UPDATE_PROTECTION_MODE = BIT(2),\n\tSTA_INFO_UPDATE_CAP = BIT(3),\n\tSTA_INFO_UPDATE_HT_CAP = BIT(4),\n\tSTA_INFO_UPDATE_VHT_CAP = BIT(5),\n\tSTA_INFO_UPDATE_ALL = STA_INFO_UPDATE_BW\n\t\t\t\t\t\t\t|STA_INFO_UPDATE_RATE\n\t\t\t\t\t\t\t|STA_INFO_UPDATE_PROTECTION_MODE\n\t\t\t\t\t\t\t|STA_INFO_UPDATE_CAP\n\t\t\t\t\t\t\t|STA_INFO_UPDATE_HT_CAP\n\t\t\t\t\t\t\t|STA_INFO_UPDATE_VHT_CAP,\n\tSTA_INFO_UPDATE_MAX\n};\n\n//if mode ==0, then the sta is allowed once the addr is hit.\n//if mode ==1, then the sta is rejected once the addr is non-hit.\nstruct rtw_wlan_acl_node {\n        _list\t\t        list;\n        u8       addr[ETH_ALEN];\n        u8       valid;\n};\n\n//mode=0, disable\n//mode=1, accept unless in deny list\n//mode=2, deny unless in accept list\nstruct wlan_acl_pool {\n\tint mode;\n\tint num;\n\tstruct rtw_wlan_acl_node aclnode[NUM_ACL];\n\t_queue\tacl_node_q;\n};\n\ntypedef struct _RSSI_STA{\n\ts32\tUndecoratedSmoothedPWDB;\n\ts32\tUndecoratedSmoothedCCK;\n\ts32\tUndecoratedSmoothedOFDM;\n\tu32\tOFDM_pkt;\n\tu64\tPacketMap;\n\tu8\tValidBit;\n}RSSI_STA, *PRSSI_STA;\n\nstruct\tstainfo_stats\t{\n\n\tu64 rx_mgnt_pkts;\n\t\tu64 rx_beacon_pkts;\n\t\tu64 rx_probereq_pkts;\n\t\tu64 rx_probersp_pkts;\n\t\tu64 rx_probersp_bm_pkts;\n\t\tu64 rx_probersp_uo_pkts;\n\tu64 rx_ctrl_pkts;\n\tu64 rx_data_pkts;\n\tu64 rx_data_qos_pkts[TID_NUM];\n\tu64\tlast_rx_mgnt_pkts;\n\t\tu64 last_rx_beacon_pkts;\n\t\tu64 last_rx_probereq_pkts;\n\t\tu64 last_rx_probersp_pkts;\n\t\tu64 last_rx_probersp_bm_pkts;\n\t\tu64 last_rx_probersp_uo_pkts;\n\tu64\tlast_rx_ctrl_pkts;\n\tu64\tlast_rx_data_pkts;\n\tu64 last_rx_data_qos_pkts[TID_NUM];\n#ifdef CONFIG_TDLS\n\tu64 rx_tdls_disc_rsp_pkts;\n\tu64 last_rx_tdls_disc_rsp_pkts;\n#endif\n\tu64\trx_bytes;\n\tu64\trx_drops;\n\n\tu64\ttx_pkts;\n\tu64\ttx_bytes;\n\tu64  tx_drops;\n};\n\n#ifdef CONFIG_TDLS\nstruct TDLS_PeerKey {\n\tu8 kck[16]; /* TPK-KCK */\n\tu8 tk[16]; /* TPK-TK; only CCMP will be used */\n} ;\n#endif //CONFIG_TDLS\n\n#ifdef DBG_RX_DFRAME_RAW_DATA\nstruct sta_recv_dframe_info {\n\n\tu8 sta_data_rate;\n\tu8 sta_sgi;\n\tu8 sta_bw_mode;\n\ts8 sta_mimo_signal_strength[4];\n\ts8 sta_RxPwr[4];\n\tu8 sta_ofdm_snr[4];\n};\n#endif\n\nstruct sta_info {\n\n\t_lock\tlock;\n\t_list\tlist; //free_sta_queue\n\t_list\thash_list; //sta_hash\n\t//_list asoc_list; //20061114\n\t//_list sleep_list;//sleep_q\n\t//_list wakeup_list;//wakeup_q\n\t_adapter *padapter;\n\t\n\tstruct sta_xmit_priv sta_xmitpriv;\n\tstruct sta_recv_priv sta_recvpriv;\n\t\n#ifdef DBG_RX_DFRAME_RAW_DATA\n\tstruct sta_recv_dframe_info  sta_dframe_info;\n#endif\n\t_queue sleep_q;\n\tunsigned int sleepq_len;\n\t\n\tuint state;\n\tuint aid;\n\tuint mac_id;\n\tuint qos_option;\n\tu8\thwaddr[ETH_ALEN];\n\tu16 hwseq;\n\tu8\tra_rpt_linked;\n\n\tuint\tieee8021x_blocked;\t//0: allowed, 1:blocked \n\tuint\tdot118021XPrivacy; //aes, tkip...\n\tunion Keytype\tdot11tkiptxmickey;\n\tunion Keytype\tdot11tkiprxmickey;\n\tunion Keytype\tdot118021x_UncstKey;\t\n\tunion pn48\t\tdot11txpn;\t\t\t// PN48 used for Unicast xmit\n#ifdef CONFIG_GTK_OL\n\tu8 kek[RTW_KEK_LEN];\n\tu8 kck[RTW_KCK_LEN];\n\tu8 replay_ctr[RTW_REPLAY_CTR_LEN];\n#endif //CONFIG_GTK_OL\n#ifdef CONFIG_IEEE80211W\n\tunion pn48\t\tdot11wtxpn;\t\t\t// PN48 used for Unicast mgmt xmit.\n\t_timer dot11w_expire_timer;\n#endif //CONFIG_IEEE80211W\n\tunion pn48\t\tdot11rxpn;\t\t\t// PN48 used for Unicast recv.\n\n\n\tu8\tbssrateset[16];\n\tu32\tbssratelen;\n\ts32  rssi;\n\ts32\tsignal_quality;\n\t\n\tu8\tcts2self;\n\tu8\trtsen;\n\n\tu8\traid;\n\tu8 \tinit_rate;\n\tu64\tra_mask;\n\tu8\twireless_mode;\t// NETWORK_TYPE\n\tu8\tbw_mode;\n\n\tu8\tldpc;\n\tu8\tstbc;\n\n#ifdef CONFIG_BEAMFORMING\n\tu16 txbf_paid;\n\tu16 txbf_gid;\n#endif\n\t\t\n\tstruct stainfo_stats sta_stats;\n\n#ifdef CONFIG_TDLS\n\tu32\ttdls_sta_state;\n\tu8\tSNonce[32];\n\tu8\tANonce[32];\n\tu32\tTDLS_PeerKey_Lifetime;\n\tu16\tTPK_count;\n\t_timer\tTPK_timer;\n\tstruct TDLS_PeerKey\ttpk;\n#ifdef CONFIG_TDLS_CH_SW\t\n\tu16\tch_switch_time;\n\tu16\tch_switch_timeout;\n\t//u8\toption;\n\t_timer\tch_sw_timer;\n\t_timer\tdelay_timer;\n#endif\t\n\t_timer handshake_timer;\n\tu8 alive_count;\n\t_timer\tpti_timer;\n\tu8\tTDLS_RSNIE[20];\t/* Save peer's RSNIE, used for sending TDLS_SETUP_RSP */\n#endif /* CONFIG_TDLS */\n\n\t//for A-MPDU TX, ADDBA timeout check\t\n\t_timer addba_retry_timer;\n\t\n\t//for A-MPDU Rx reordering buffer control \n\tstruct recv_reorder_ctrl recvreorder_ctrl[TID_NUM];\n\tATOMIC_T continual_no_rx_packet[TID_NUM];\n\t//for A-MPDU Tx\n\t//unsigned char\t\tampdu_txen_bitmap;\n\tu16\tBA_starting_seqctrl[16];\n\t\n\n#ifdef CONFIG_80211N_HT\n\tstruct ht_priv\thtpriv;\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n\tstruct vht_priv\tvhtpriv;\n#endif\n\n\t//Notes:\t\n\t//STA_Mode:\n\t//curr_network(mlme_priv/security_priv/qos/ht) + sta_info: (STA & AP) CAP/INFO\t\n\t//scan_q: AP CAP/INFO\n\n\t//AP_Mode:\n\t//curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO\n\t//sta_info: (AP & STA) CAP/INFO\n\t\t\n#ifdef CONFIG_AP_MODE\n\n\t_list asoc_list;\n\t_list auth_list;\n\t \n\tunsigned int expire_to;\n\tunsigned int auth_seq;\n\tunsigned int authalg;\n\tunsigned char chg_txt[128];\n\n\tu16 capability;\t\n\tint flags;\t\n\n\tint dot8021xalg;//0:disable, 1:psk, 2:802.1x\n\tint wpa_psk;//0:disable, bit(0): WPA, bit(1):WPA2\n\tint wpa_group_cipher;\n\tint wpa2_group_cipher;\n\tint wpa_pairwise_cipher;\n\tint wpa2_pairwise_cipher;\t\n\n\tu8 bpairwise_key_installed;\n\n#ifdef CONFIG_NATIVEAP_MLME\n\tu8 wpa_ie[32];\n\n\tu8 nonerp_set;\n\tu8 no_short_slot_time_set;\n\tu8 no_short_preamble_set;\n\tu8 no_ht_gf_set;\n\tu8 no_ht_set;\n\tu8 ht_20mhz_set;\n\tu8 ht_40mhz_intolerant;\n#endif\t// CONFIG_NATIVEAP_MLME\n\n#ifdef CONFIG_ATMEL_RC_PATCH\n\tu8 flag_atmel_rc;\n#endif\n\n\tu8 qos_info;\n\n\tu8 max_sp_len;\n\tu8 uapsd_bk;//BIT(0): Delivery enabled, BIT(1): Trigger enabled\n\tu8 uapsd_be;\n\tu8 uapsd_vi;\n\tu8 uapsd_vo;\t\n\n\tu8 has_legacy_ac;\n\tunsigned int sleepq_ac_len;\n\n#ifdef CONFIG_P2P\n\t//p2p priv data\n\tu8 is_p2p_device;\n\tu8 p2p_status_code;\n\n\t//p2p client info\n\tu8 dev_addr[ETH_ALEN];\n\t//u8 iface_addr[ETH_ALEN];//= hwaddr[ETH_ALEN]\n\tu8 dev_cap;\n\tu16 config_methods;\n\tu8 primary_dev_type[8];\n\tu8 num_of_secdev_type;\n\tu8 secdev_types_list[32];// 32/8 == 4;\n\tu16 dev_name_len;\n\tu8 dev_name[32];\t\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_TX_MCAST2UNI\n\tu8 under_exist_checking;\n#endif\t// CONFIG_TX_MCAST2UNI\n\t\n\tu8 keep_alive_trycnt;\n\n#ifdef CONFIG_AUTO_AP_MODE\n\tu8 isrc; //this device is rc\n\tu16 pid; // pairing id\n#endif\n\n#endif\t// CONFIG_AP_MODE\t\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tu8 *passoc_req;\n\tu32 assoc_req_len;\n#endif\n\n\t//for DM\n\tRSSI_STA\t rssi_stat;\n\t\n\t//ODM_STA_INFO_T\n\t// ================ODM Relative Info=======================\n\t// Please be care, dont declare too much structure here. It will cost memory * STA support num.\n\t//\n\t//\n\t// 2011/10/20 MH Add for ODM STA info.\t\n\t//\n\t// Driver Write\n\tu8\t\tbValid;\t\t\t\t// record the sta status link or not?\n\t//u8\t\tWirelessMode;\t\t// \n\tu8\t\tIOTPeer;\t\t\t// Enum value.\tHT_IOT_PEER_E\n\t// ODM Write\n\t//1 PHY_STATUS_INFO\n\tu8\t\tRSSI_Path[4];\t\t// \n\tu8\t\tRSSI_Ave;\n\tu8\t\tRXEVM[4];\n\tu8\t\tRXSNR[4];\n\n\tu8\t\trssi_level;\t\t\t//for Refresh RA mask\n\t// ODM Write\n\t//1 TX_INFO (may changed by IC)\n\t//TX_INFO_T\t\tpTxInfo;\t\t\t\t// Define in IC folder. Move lower layer.\n\t//\n\t// ================ODM Relative Info=======================\n\t//\n\n\t/* To store the sequence number of received management frame */\n\tu16 RxMgmtFrameSeqNum;\n};\n\n#define sta_rx_pkts(sta) \\\n\t(sta->sta_stats.rx_mgnt_pkts \\\n\t+ sta->sta_stats.rx_ctrl_pkts \\\n\t+ sta->sta_stats.rx_data_pkts)\n\n#define sta_last_rx_pkts(sta) \\\n\t(sta->sta_stats.last_rx_mgnt_pkts \\\n\t+ sta->sta_stats.last_rx_ctrl_pkts \\\n\t+ sta->sta_stats.last_rx_data_pkts)\n\n#define sta_rx_data_pkts(sta) \\\n\t(sta->sta_stats.rx_data_pkts)\n\n#define sta_rx_data_qos_pkts(sta, i) \\\n\t(sta->sta_stats.rx_data_qos_pkts[i])\n\n#define sta_last_rx_data_pkts(sta) \\\n\t(sta->sta_stats.last_rx_data_pkts)\n\n#define sta_last_rx_data_qos_pkts(sta, i) \\\n\t(sta->sta_stats.last_rx_data_qos_pkts[i])\n\n#define sta_rx_mgnt_pkts(sta) \\\n\t(sta->sta_stats.rx_mgnt_pkts)\n\n#define sta_last_rx_mgnt_pkts(sta) \\\n\t(sta->sta_stats.last_rx_mgnt_pkts)\n\n#define sta_rx_beacon_pkts(sta) \\\n\t(sta->sta_stats.rx_beacon_pkts)\n\n#define sta_last_rx_beacon_pkts(sta) \\\n\t(sta->sta_stats.last_rx_beacon_pkts)\n\n#define sta_rx_probereq_pkts(sta) \\\n\t(sta->sta_stats.rx_probereq_pkts)\n\n#define sta_last_rx_probereq_pkts(sta) \\\n\t(sta->sta_stats.last_rx_probereq_pkts)\n\n#define sta_rx_probersp_pkts(sta) \\\n\t(sta->sta_stats.rx_probersp_pkts)\n\n#define sta_last_rx_probersp_pkts(sta) \\\n\t(sta->sta_stats.last_rx_probersp_pkts)\n\n#define sta_rx_probersp_bm_pkts(sta) \\\n\t(sta->sta_stats.rx_probersp_bm_pkts)\n\n#define sta_last_rx_probersp_bm_pkts(sta) \\\n\t(sta->sta_stats.last_rx_probersp_bm_pkts)\n\n#define sta_rx_probersp_uo_pkts(sta) \\\n\t(sta->sta_stats.rx_probersp_uo_pkts)\n\n#define sta_last_rx_probersp_uo_pkts(sta) \\\n\t(sta->sta_stats.last_rx_probersp_uo_pkts)\n\n#define sta_update_last_rx_pkts(sta) \\\n\tdo { \\\n\t\tsta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \\\n\t\tsta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \\\n\t\tsta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \\\n\t\tsta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \\\n\t\tsta->sta_stats.last_rx_probersp_bm_pkts = sta->sta_stats.rx_probersp_bm_pkts; \\\n\t\tsta->sta_stats.last_rx_probersp_uo_pkts = sta->sta_stats.rx_probersp_uo_pkts; \\\n\t\tsta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \\\n\t\tsta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \\\n\t} while(0)\n\n#define STA_RX_PKTS_ARG(sta) \\\n\tsta->sta_stats.rx_mgnt_pkts \\\n\t, sta->sta_stats.rx_ctrl_pkts \\\n\t, sta->sta_stats.rx_data_pkts\n\n#define STA_LAST_RX_PKTS_ARG(sta) \\\n\tsta->sta_stats.last_rx_mgnt_pkts \\\n\t, sta->sta_stats.last_rx_ctrl_pkts \\\n\t, sta->sta_stats.last_rx_data_pkts\n\n#define STA_RX_PKTS_DIFF_ARG(sta) \\\n\tsta->sta_stats.rx_mgnt_pkts - sta->sta_stats.last_rx_mgnt_pkts \\\n\t, sta->sta_stats.rx_ctrl_pkts - sta->sta_stats.last_rx_ctrl_pkts \\\n\t, sta->sta_stats.rx_data_pkts -sta->sta_stats.last_rx_data_pkts\n\n#define STA_PKTS_FMT \"(m:%llu, c:%llu, d:%llu)\"\n\t\nstruct\tsta_priv {\n\t\n\tu8 *pallocated_stainfo_buf;\n\tu8 *pstainfo_buf;\n\t_queue\tfree_sta_queue;\n\t\n\t_lock sta_hash_lock;\n\t_list   sta_hash[NUM_STA];\n\tint asoc_sta_count;\n\t_queue sleep_q;\n\t_queue wakeup_q;\n\t\n\t_adapter *padapter;\n\t\n\n#ifdef CONFIG_AP_MODE\n\t_list asoc_list;\n\t_list auth_list;\n\t_lock asoc_list_lock;\n\t_lock auth_list_lock;\n\tu8 asoc_list_cnt;\n\tu8 auth_list_cnt;\n\n\tunsigned int auth_to;  //sec, time to expire in authenticating.\n\tunsigned int assoc_to; //sec, time to expire before associating.\n\tunsigned int expire_to; //sec , time to expire after associated.\n\t\n\t/* pointers to STA info; based on allocated AID or NULL if AID free\n\t * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1\n\t * and so on\n\t */\n\tstruct sta_info *sta_aid[NUM_STA];\n\n\tu16 sta_dz_bitmap;//only support 15 stations, staion aid bitmap for sleeping sta.\n\tu16 tim_bitmap;//only support 15 stations, aid=0~15 mapping bit0~bit15\t\n\n\tu16 max_num_sta;\n\n\tstruct wlan_acl_pool acl_list;\n#endif\n\n#ifdef CONFIG_ATMEL_RC_PATCH\n\tu8 atmel_rc_pattern [6];\n#endif\n\n};\n\n\n__inline static u32 wifi_mac_hash(u8 *mac)\n{\n        u32 x;\n\n        x = mac[0];\n        x = (x << 2) ^ mac[1];\n        x = (x << 2) ^ mac[2];\n        x = (x << 2) ^ mac[3];\n        x = (x << 2) ^ mac[4];\n        x = (x << 2) ^ mac[5];\n\n        x ^= x >> 8;\n        x  = x & (NUM_STA - 1);\n\t\t\n        return x;\n}\n\n\nextern u32\t_rtw_init_sta_priv(struct sta_priv *pstapriv);\nextern u32\t_rtw_free_sta_priv(struct sta_priv *pstapriv);\n\n#define stainfo_offset_valid(offset) (offset < NUM_STA && offset >= 0)\nint rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta);\nstruct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset);\n\nextern struct sta_info *rtw_alloc_stainfo(struct\tsta_priv *pstapriv, u8 *hwaddr);\nextern u32\trtw_free_stainfo(_adapter *padapter , struct sta_info *psta);\nextern void rtw_free_all_stainfo(_adapter *padapter);\nextern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr);\nextern u32 rtw_init_bcmc_stainfo(_adapter* padapter);\nextern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter);\nextern u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr);\n\n#endif //_STA_INFO_H_\n\n"
  },
  {
    "path": "include/usb_hal.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __USB_HAL_H__\n#define __USB_HAL_H__\n\nint usb_init_recv_priv(_adapter *padapter, u16 ini_in_buf_sz);\nvoid usb_free_recv_priv (_adapter *padapter, u16 ini_in_buf_sz);\n\nu8 rtw_set_hal_ops(_adapter *padapter);\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188eu_set_hal_ops(_adapter * padapter);\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nvoid rtl8812au_set_hal_ops(_adapter * padapter);\n#endif\n\n#ifdef CONFIG_RTL8192E\nvoid rtl8192eu_set_hal_ops(_adapter * padapter);\n#endif\n\n\n#ifdef CONFIG_RTL8723B\nvoid rtl8723bu_set_hal_ops(_adapter * padapter);\n#endif\n\n#ifdef CONFIG_RTL8814A\nvoid rtl8814au_set_hal_ops(_adapter * padapter);\n#endif /* CONFIG_RTL8814A */\n\n#ifdef CONFIG_RTL8188F\nvoid rtl8188fu_set_hal_ops(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_RTL8703B\nvoid rtl8703bu_set_hal_ops(_adapter *padapter);\n#endif\n\n#ifdef CONFIG_INTEL_PROXIM\t\nextern _adapter  *rtw_usb_get_sw_pointer(void);\n#endif\t//CONFIG_INTEL_PROXIM\n#endif //__USB_HAL_H__\n\n"
  },
  {
    "path": "include/usb_ops.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __USB_OPS_H_\n#define __USB_OPS_H_\n\n\n#define REALTEK_USB_VENQT_READ\t\t0xC0\n#define REALTEK_USB_VENQT_WRITE\t0x40\n#define REALTEK_USB_VENQT_CMD_REQ\t0x05\n#define REALTEK_USB_VENQT_CMD_IDX\t0x00\n#define REALTEK_USB_IN_INT_EP_IDX\t1\n\nenum{\n\tVENDOR_WRITE = 0x00,\n\tVENDOR_READ = 0x01,\n};\n#define ALIGNMENT_UNIT\t\t\t\t16\n#define MAX_VENDOR_REQ_CMD_SIZE\t254\t\t//8188cu SIE Support\n#define MAX_USB_IO_CTL_SIZE\t\t(MAX_VENDOR_REQ_CMD_SIZE +ALIGNMENT_UNIT)\n\n#ifdef PLATFORM_LINUX\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) \n#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size, timeout_ms) \\\n\tusb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), (timeout_ms)) \n#define rtw_usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout_ms) \\\n\tusb_bulk_msg((usb_dev), (pipe), (data), (len), (actual_length), (timeout_ms))\n#else\n#define rtw_usb_control_msg(dev, pipe, request, requesttype, value, index, data, size,timeout_ms) \\\n\tusb_control_msg((dev), (pipe), (request), (requesttype), (value), (index), (data), (size), \\\n\t\t((timeout_ms) == 0) ||((timeout_ms)*HZ/1000>0)?((timeout_ms)*HZ/1000):1) \n#define rtw_usb_bulk_msg(usb_dev, pipe, data, len, actual_length, timeout_ms) \\\n\tusb_bulk_msg((usb_dev), (pipe), (data), (len), (actual_length), \\\n\t\t((timeout_ms) == 0) ||((timeout_ms)*HZ/1000>0)?((timeout_ms)*HZ/1000):1) \n#endif\n#include <usb_ops_linux.h>\n#endif //PLATFORM_LINUX\n\n#ifdef CONFIG_RTL8188E\nvoid rtl8188eu_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8188eu_set_intf_ops(struct _io_ops *pops);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8188eu(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n#endif\n\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\nvoid rtl8812au_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8812au_set_intf_ops(struct _io_ops *pops);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8812au(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n#endif\n\n#ifdef CONFIG_RTL8814A\nvoid rtl8814au_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8814au_set_intf_ops(struct _io_ops\t*pops);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8814au(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n#endif /* CONFIG_RTL8814 */\n\n#ifdef CONFIG_RTL8192E\nvoid rtl8192eu_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8192eu_set_intf_ops(struct _io_ops *pops);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8192eu(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n\n#endif\n\n#ifdef CONFIG_RTL8188F\nvoid rtl8188fu_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8188fu_set_intf_ops(struct _io_ops *pops);\nvoid rtl8188fu_recv_tasklet(void *priv);\nvoid rtl8188fu_xmit_tasklet(void *priv);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8188fu(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n#endif\n\n#ifdef CONFIG_RTL8723B\nvoid rtl8723bu_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8723bu_set_intf_ops(struct _io_ops *pops);\nvoid rtl8723bu_recv_tasklet(void *priv);\nvoid rtl8723bu_xmit_tasklet(void *priv);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8723bu(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif\n#endif\n\n#ifdef CONFIG_RTL8703B\nvoid rtl8703bu_set_hw_type(struct dvobj_priv *pdvobj);\nvoid rtl8703bu_set_intf_ops(struct _io_ops *pops);\nvoid rtl8703bu_recv_tasklet(void *priv);\nvoid rtl8703bu_xmit_tasklet(void *priv);\n#ifdef CONFIG_SUPPORT_USB_INT\nvoid interrupt_handler_8703bu(_adapter *padapter, u16 pkt_len, u8 *pbuf);\n#endif /* CONFIG_SUPPORT_USB_INT */\n#endif /* CONFIG_RTL8703B */\n\nenum RTW_USB_SPEED {\n\tRTW_USB_SPEED_UNKNOWN\t= 0,\n\tRTW_USB_SPEED_1_1\t= 1,\n\tRTW_USB_SPEED_2\t\t= 2,\n\tRTW_USB_SPEED_3\t\t= 3,\n};\n\n#define IS_FULL_SPEED_USB(Adapter)\t(adapter_to_dvobj(Adapter)->usb_speed == RTW_USB_SPEED_1_1)\n#define IS_HIGH_SPEED_USB(Adapter)\t(adapter_to_dvobj(Adapter)->usb_speed == RTW_USB_SPEED_2)\n#define IS_SUPER_SPEED_USB(Adapter)\t(adapter_to_dvobj(Adapter)->usb_speed == RTW_USB_SPEED_3)\n\n#define USB_SUPER_SPEED_BULK_SIZE\t1024\t// usb 3.0\n#define USB_HIGH_SPEED_BULK_SIZE\t512\t\t// usb 2.0\n#define USB_FULL_SPEED_BULK_SIZE\t64\t\t// usb 1.1\n\nstatic inline u8 rtw_usb_bulk_size_boundary(_adapter * padapter,int buf_len)\n{\n\tu8 rst = _TRUE;\n\n\tif (IS_SUPER_SPEED_USB(padapter))\n\t\trst = (0 == (buf_len) % USB_SUPER_SPEED_BULK_SIZE)?_TRUE:_FALSE;\n\tif (IS_HIGH_SPEED_USB(padapter))\n\t\trst = (0 == (buf_len) % USB_HIGH_SPEED_BULK_SIZE)?_TRUE:_FALSE;\t\n\telse\t\n\t\trst = (0 == (buf_len) % USB_FULL_SPEED_BULK_SIZE)?_TRUE:_FALSE;\t\t\n\treturn rst;\n}\n\n\n#endif //__USB_OPS_H_\n\n"
  },
  {
    "path": "include/usb_ops_linux.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __USB_OPS_LINUX_H__\n#define __USB_OPS_LINUX_H__\n\n#define VENDOR_CMD_MAX_DATA_LEN\t254\n#define FW_START_ADDRESS\t0x1000\n\n#define RTW_USB_CONTROL_MSG_TIMEOUT_TEST\t10//ms\n#define RTW_USB_CONTROL_MSG_TIMEOUT\t500//ms\n\n#define RECV_BULK_IN_ADDR\t\t0x80//assign by drv,not real address \n#define RECV_INT_IN_ADDR\t\t0x81//assign by drv,not real address \n\n#define INTERRUPT_MSG_FORMAT_LEN 60\n\n#if defined(CONFIG_VENDOR_REQ_RETRY) && defined(CONFIG_USB_VENDOR_REQ_MUTEX)\n/* vendor req retry should be in the situation when each vendor req is atomically submitted from others */\n#define MAX_USBCTRL_VENDORREQ_TIMES\t10\n#else\n#define MAX_USBCTRL_VENDORREQ_TIMES\t1\n#endif\n\n#define RTW_USB_BULKOUT_TIMEOUT\t5000//ms\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) || (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))\n#define _usbctrl_vendorreq_async_callback(urb, regs)\t_usbctrl_vendorreq_async_callback(urb)\n#define usb_bulkout_zero_complete(purb, regs)\tusb_bulkout_zero_complete(purb)\n#define usb_write_mem_complete(purb, regs)\tusb_write_mem_complete(purb)\n#define usb_write_port_complete(purb, regs)\tusb_write_port_complete(purb)\n#define usb_read_port_complete(purb, regs)\tusb_read_port_complete(purb)\n#define usb_read_interrupt_complete(purb, regs)\tusb_read_interrupt_complete(purb)\n#endif\n\n#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ\nint usb_async_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val);\nint usb_async_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val);\nint usb_async_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val);\n#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */\n\nunsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr);\n\nvoid usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);\nvoid usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);\n\nvoid usb_read_port_cancel(struct intf_hdl *pintfhdl);\n\nu32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem);\nvoid usb_write_port_cancel(struct intf_hdl *pintfhdl);\n\nint usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype);\n#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ\nint _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,\n\tu16 value, u16 index, void *pdata, u16 len, u8 requesttype);\n#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */\n\nu8 usb_read8(struct intf_hdl *pintfhdl, u32 addr);\nu16 usb_read16(struct intf_hdl *pintfhdl, u32 addr);\nu32 usb_read32(struct intf_hdl *pintfhdl, u32 addr);\nint usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val);\nint usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val);\nint usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val);\nint usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata);\nu32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem);\nvoid usb_recv_tasklet(void *priv);\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\nvoid usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs);\nu32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr);\n#endif\n#endif\n\n"
  },
  {
    "path": "include/usb_osintf.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __USB_OSINTF_H\n#define __USB_OSINTF_H\n\n#include <usb_vendor_req.h>\n\n#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3)\n\n\nu8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, RT_USB_BREQUEST brequest, RT_USB_WVALUE wvalue, u8 windex, void* data, u8 datalen, u8 isdirectionin);\n\n\n#endif\n\n"
  },
  {
    "path": "include/usb_vendor_req.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _USB_VENDOR_REQUEST_H_\n#define _USB_VENDOR_REQUEST_H_\n\n//4\tSet/Get Register related wIndex/Data\n#define\tRT_USB_RESET_MASK_OFF\t\t0\n#define\tRT_USB_RESET_MASK_ON\t\t1\n#define\tRT_USB_SLEEP_MASK_OFF\t\t0\n#define\tRT_USB_SLEEP_MASK_ON\t\t1\n#define\tRT_USB_LDO_ON\t\t\t\t1\n#define\tRT_USB_LDO_OFF\t\t\t\t0\n\n//4\tSet/Get SYSCLK related\twValue or Data\n#define\tRT_USB_SYSCLK_32KHZ\t\t0\n#define\tRT_USB_SYSCLK_40MHZ\t\t1\n#define\tRT_USB_SYSCLK_60MHZ\t\t2\n\n\ntypedef enum _RT_USB_BREQUEST {\n\tRT_USB_SET_REGISTER\t\t= 1,\n\tRT_USB_SET_SYSCLK\t\t= 2,\n\tRT_USB_GET_SYSCLK\t\t= 3,\n\tRT_USB_GET_REGISTER\t\t= 4\n} RT_USB_BREQUEST;\n\n\ntypedef enum _RT_USB_WVALUE {\n\tRT_USB_RESET_MASK\t=\t1,\n\tRT_USB_SLEEP_MASK\t=\t2,\n\tRT_USB_USB_HRCPWM\t=\t3,\n\tRT_USB_LDO\t\t\t=\t4,\n\tRT_USB_BOOT_TYPE\t=\t5\n} RT_USB_WVALUE;\n\n\n//BOOLEAN usbvendorrequest(PCE_USB_DEVICE\tCEdevice, RT_USB_BREQUEST bRequest, RT_USB_WVALUE wValue, UCHAR wIndex, PVOID Data, UCHAR DataLength, BOOLEAN isDirectionIn);\n//BOOLEAN CEusbGetStatusRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT Index, PVOID Data);\n//BOOLEAN CEusbFeatureRequest(PCE_USB_DEVICE CEdevice, IN USHORT Op, IN USHORT FeatureSelector, IN USHORT Index);\n//BOOLEAN CEusbGetDescriptorRequest(PCE_USB_DEVICE CEdevice, IN short urbLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageId, IN PVOID  TransferBuffer, IN ULONG TransferBufferLength);\n\n#endif\n\n"
  },
  {
    "path": "include/wifi.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef _WIFI_H_\n#define _WIFI_H_\n\n\n#ifdef BIT\n//#error\t\"BIT define occurred earlier elsewhere!\\n\"\n#undef BIT\n#endif\n#define BIT(x)\t(1 << (x))\n\n\n#define WLAN_ETHHDR_LEN\t\t14\n#define WLAN_ETHADDR_LEN\t6\n#define WLAN_IEEE_OUI_LEN\t3\n#define WLAN_ADDR_LEN\t\t6\n#define WLAN_CRC_LEN\t\t4\n#define WLAN_BSSID_LEN\t\t6\n#define WLAN_BSS_TS_LEN\t\t8\n#define WLAN_HDR_A3_LEN\t\t24\n#define WLAN_HDR_A4_LEN\t\t30\n#define WLAN_HDR_A3_QOS_LEN\t26\n#define WLAN_HDR_A4_QOS_LEN\t32\n#define WLAN_SSID_MAXLEN\t32\n#define WLAN_DATA_MAXLEN\t2312\n\n#define WLAN_A3_PN_OFFSET\t24\n#define WLAN_A4_PN_OFFSET\t30\n\n#define WLAN_MIN_ETHFRM_LEN\t60\n#define WLAN_MAX_ETHFRM_LEN\t1514\n#define WLAN_ETHHDR_LEN\t\t14\n#define WLAN_WMM_LEN\t\t24\n\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n#define WLAN_MAX_VENDOR_IE_LEN 255\n#define WLAN_MAX_VENDOR_IE_NUM 5\n#define WIFI_BEACON_VENDOR_IE_BIT BIT(0)\n#define WIFI_PROBEREQ_VENDOR_IE_BIT BIT(1)\n#define WIFI_PROBERESP_VENDOR_IE_BIT BIT(2)\n#define WIFI_ASSOCREQ_VENDOR_IE_BIT BIT(3)\n#define WIFI_ASSOCRESP_VENDOR_IE_BIT BIT(4)\n#endif\n\n#define P80211CAPTURE_VERSION\t0x80211001\n\n// This value is tested by WiFi 11n Test Plan 5.2.3.\n// This test verifies the WLAN NIC can update the NAV through sending the CTS with large duration.\n#define\tWiFiNavUpperUs\t\t\t\t30000\t// 30 ms\n\n#ifdef GREEN_HILL\n#pragma pack(1)\n#endif\n\nenum WIFI_FRAME_TYPE {\n\tWIFI_MGT_TYPE  =\t(0),\n\tWIFI_CTRL_TYPE =\t(BIT(2)),\n\tWIFI_DATA_TYPE =\t(BIT(3)),\n\tWIFI_QOS_DATA_TYPE\t= (BIT(7)|BIT(3)),\t//!< QoS Data\t\n};\n\nenum WIFI_FRAME_SUBTYPE {\n\n    // below is for mgt frame\n    WIFI_ASSOCREQ       = (0 | WIFI_MGT_TYPE),\n    WIFI_ASSOCRSP       = (BIT(4) | WIFI_MGT_TYPE),\n    WIFI_REASSOCREQ     = (BIT(5) | WIFI_MGT_TYPE),\n    WIFI_REASSOCRSP     = (BIT(5) | BIT(4) | WIFI_MGT_TYPE),\n    WIFI_PROBEREQ       = (BIT(6) | WIFI_MGT_TYPE),\n    WIFI_PROBERSP       = (BIT(6) | BIT(4) | WIFI_MGT_TYPE),\n    WIFI_BEACON         = (BIT(7) | WIFI_MGT_TYPE),\n    WIFI_ATIM           = (BIT(7) | BIT(4) | WIFI_MGT_TYPE),\n    WIFI_DISASSOC       = (BIT(7) | BIT(5) | WIFI_MGT_TYPE),\n    WIFI_AUTH           = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE),\n    WIFI_DEAUTH         = (BIT(7) | BIT(6) | WIFI_MGT_TYPE),\n    WIFI_ACTION         = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE),\n    WIFI_ACTION_NOACK = (BIT(7) | BIT(6) | BIT(5) | WIFI_MGT_TYPE),\n\n    // below is for control frame\n    WIFI_NDPA         = (BIT(6) | BIT(4) | WIFI_CTRL_TYPE),\n    WIFI_PSPOLL         = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE),\n    WIFI_RTS            = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),\n    WIFI_CTS            = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE),\n    WIFI_ACK            = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE),\n    WIFI_CFEND          = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE),\n    WIFI_CFEND_CFACK    = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),\n\n    // below is for data frame\n    WIFI_DATA           = (0 | WIFI_DATA_TYPE),\n    WIFI_DATA_CFACK     = (BIT(4) | WIFI_DATA_TYPE),\n    WIFI_DATA_CFPOLL    = (BIT(5) | WIFI_DATA_TYPE),\n    WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE),\n    WIFI_DATA_NULL      = (BIT(6) | WIFI_DATA_TYPE),\n    WIFI_CF_ACK         = (BIT(6) | BIT(4) | WIFI_DATA_TYPE),\n    WIFI_CF_POLL        = (BIT(6) | BIT(5) | WIFI_DATA_TYPE),\n    WIFI_CF_ACKPOLL     = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE),\n    WIFI_QOS_DATA_NULL\t= (BIT(6) | WIFI_QOS_DATA_TYPE),\n};\n\nenum WIFI_REASON_CODE\t{\n\t_RSON_RESERVED_\t\t\t\t\t= 0,\n\t_RSON_UNSPECIFIED_\t\t\t\t= 1,\n\t_RSON_AUTH_NO_LONGER_VALID_\t\t= 2,\n\t_RSON_DEAUTH_STA_LEAVING_\t\t= 3,\n\t_RSON_INACTIVITY_\t\t\t\t= 4,\n\t_RSON_UNABLE_HANDLE_\t\t\t= 5,\n\t_RSON_CLS2_\t\t\t\t\t\t= 6,\n\t_RSON_CLS3_\t\t\t\t\t\t= 7,\n\t_RSON_DISAOC_STA_LEAVING_\t\t= 8,\n\t_RSON_ASOC_NOT_AUTH_\t\t\t= 9,\n\n\t// WPA reason\n\t_RSON_INVALID_IE_\t\t\t\t= 13,\n\t_RSON_MIC_FAILURE_\t\t\t\t= 14,\n\t_RSON_4WAY_HNDSHK_TIMEOUT_\t\t= 15,\n\t_RSON_GROUP_KEY_UPDATE_TIMEOUT_\t= 16,\n\t_RSON_DIFF_IE_\t\t\t\t\t= 17,\n\t_RSON_MLTCST_CIPHER_NOT_VALID_\t= 18,\n\t_RSON_UNICST_CIPHER_NOT_VALID_\t= 19,\n\t_RSON_AKMP_NOT_VALID_\t\t\t= 20,\n\t_RSON_UNSUPPORT_RSNE_VER_\t\t= 21,\n\t_RSON_INVALID_RSNE_CAP_\t\t\t= 22,\n\t_RSON_IEEE_802DOT1X_AUTH_FAIL_\t= 23,\n\n\t//belowing are Realtek definition\n\t_RSON_PMK_NOT_AVAILABLE_\t\t= 24,\n\t_RSON_TDLS_TEAR_TOOFAR_\t\t\t= 25,\n\t_RSON_TDLS_TEAR_UN_RSN_\t\t\t= 26,\n};\n\n/* Reason codes (IEEE 802.11-2007, 7.3.1.7, Table 7-22) */\n#if 0\n#define WLAN_REASON_UNSPECIFIED 1\n#define WLAN_REASON_PREV_AUTH_NOT_VALID 2\n#define WLAN_REASON_DEAUTH_LEAVING 3\n#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4\n#define WLAN_REASON_DISASSOC_AP_BUSY 5\n#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6\n#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7\n#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8\n#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9\n#endif\n/* IEEE 802.11h */\n#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10\n#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11\n#if 0\n/* IEEE 802.11i */\n#define WLAN_REASON_INVALID_IE 13\n#define WLAN_REASON_MICHAEL_MIC_FAILURE 14\n#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15\n#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16\n#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17\n#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18\n#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19\n#define WLAN_REASON_AKMP_NOT_VALID 20\n#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21\n#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22\n#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23\n#define WLAN_REASON_CIPHER_SUITE_REJECTED 24\n#endif\n\nenum WIFI_STATUS_CODE {\n\t_STATS_SUCCESSFUL_\t\t\t= 0,\n\t_STATS_FAILURE_\t\t\t\t= 1,\n\t_STATS_SEC_DISABLED_\t\t\t= 5,\n\t_STATS_NOT_IN_SAME_BSS_\t\t= 7,\n\t_STATS_CAP_FAIL_\t\t\t= 10,\n\t_STATS_NO_ASOC_\t\t\t\t= 11,\n\t_STATS_OTHER_\t\t\t\t= 12,\n\t_STATS_NO_SUPP_ALG_\t\t\t= 13,\n\t_STATS_OUT_OF_AUTH_SEQ_\t\t= 14,\n\t_STATS_CHALLENGE_FAIL_\t\t= 15,\n\t_STATS_AUTH_TIMEOUT_\t\t= 16,\n\t_STATS_UNABLE_HANDLE_STA_\t= 17,\n\t_STATS_RATE_FAIL_\t\t\t= 18,\n\t_STATS_REFUSED_TEMPORARILY_ = 30,\n\t_STATS_DECLINE_REQ_\t\t\t= 37,\n\t_STATS_INVALID_PARAMETERS_\t= 38,\n\t_STATS_INVALID_RSNIE_\t\t\t= 72,\n};\n\n/* Status codes (IEEE 802.11-2007, 7.3.1.9, Table 7-23) */\n#if 0\n#define WLAN_STATUS_SUCCESS 0\n#define WLAN_STATUS_UNSPECIFIED_FAILURE 1\n#define WLAN_STATUS_CAPS_UNSUPPORTED 10\n#define WLAN_STATUS_REASSOC_NO_ASSOC 11\n#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12\n#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13\n#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14\n#define WLAN_STATUS_CHALLENGE_FAIL 15\n#define WLAN_STATUS_AUTH_TIMEOUT 16\n#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17\n#define WLAN_STATUS_ASSOC_DENIED_RATES 18\n#endif\n//entended \n/* IEEE 802.11b */\n#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19\n#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20\n#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21\n/* IEEE 802.11h */\n#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22\n#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23\n#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24\n/* IEEE 802.11g */\n#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25\n#define WLAN_STATUS_ASSOC_DENIED_NO_ER_PBCC 26\n#define WLAN_STATUS_ASSOC_DENIED_NO_DSSS_OFDM 27\n/* IEEE 802.11w */\n#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30\n#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31\n/* IEEE 802.11i */\n#define WLAN_STATUS_INVALID_IE 40\n#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41\n#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42\n#define WLAN_STATUS_AKMP_NOT_VALID 43\n#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44\n#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45\n#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46\n#define WLAN_STATUS_TS_NOT_CREATED 47\n#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48\n#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49\n#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50\n#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51\n/* IEEE 802.11r */\n#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52\n#define WLAN_STATUS_INVALID_PMKID 53\n#define WLAN_STATUS_INVALID_MDIE 54\n#define WLAN_STATUS_INVALID_FTIE 55\n\n\nenum WIFI_REG_DOMAIN {\n\tDOMAIN_FCC\t\t= 1,\n\tDOMAIN_IC\t\t= 2,\n\tDOMAIN_ETSI\t\t= 3,\n\tDOMAIN_SPAIN\t= 4,\n\tDOMAIN_FRANCE\t= 5,\n\tDOMAIN_MKK\t\t= 6,\n\tDOMAIN_ISRAEL\t= 7,\n\tDOMAIN_MKK1\t\t= 8,\n\tDOMAIN_MKK2\t\t= 9,\n\tDOMAIN_MKK3\t\t= 10,\n\tDOMAIN_MAX\n};\n\n#define _TO_DS_\t\tBIT(8)\n#define _FROM_DS_\tBIT(9)\n#define _MORE_FRAG_\tBIT(10)\n#define _RETRY_\t\tBIT(11)\n#define _PWRMGT_\tBIT(12)\n#define _MORE_DATA_\tBIT(13)\n#define _PRIVACY_\tBIT(14)\n#define _ORDER_\t\t\tBIT(15)\n\n#define SetToDs(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_TO_DS_); \\\n\t} while(0)\n\n#define GetToDs(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_TO_DS_)) != 0)\n\n#define ClearToDs(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_TO_DS_)); \\\n\t} while(0)\n\n#define SetFrDs(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_FROM_DS_); \\\n\t} while(0)\n\n#define GetFrDs(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_FROM_DS_)) != 0)\n\n#define ClearFrDs(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_FROM_DS_)); \\\n\t} while(0)\n\n#define get_tofr_ds(pframe)\t((GetToDs(pframe) << 1) | GetFrDs(pframe))\n\n\n#define SetMFrag(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_FRAG_); \\\n\t} while(0)\n\n#define GetMFrag(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_FRAG_)) != 0)\n\n#define ClearMFrag(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)); \\\n\t} while(0)\n\n#define SetRetry(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_RETRY_); \\\n\t} while(0)\n\n#define GetRetry(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_RETRY_)) != 0)\n\n#define ClearRetry(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_RETRY_)); \\\n\t} while(0)\n\n#define SetPwrMgt(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_PWRMGT_); \\\n\t} while(0)\n\n#define GetPwrMgt(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_PWRMGT_)) != 0)\n\n#define ClearPwrMgt(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)); \\\n\t} while(0)\n\n#define SetMData(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_MORE_DATA_); \\\n\t} while(0)\n\n#define GetMData(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_MORE_DATA_)) != 0)\n\n#define ClearMData(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)); \\\n\t} while(0)\n\n#define SetPrivacy(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_PRIVACY_); \\\n\t} while(0)\n\n#define GetPrivacy(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_PRIVACY_)) != 0)\n\n#define ClearPrivacy(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) &= (~cpu_to_le16(_PRIVACY_)); \\\n\t} while(0)\n\n\n#define GetOrder(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0)\n\n#define GetFrameType(pbuf)\t(le16_to_cpu(*(unsigned short *)(pbuf)) & (BIT(3) | BIT(2)))\n\n#define SetFrameType(pbuf,type)\t\\\n\tdo { \t\\\n\t\t*(unsigned short *)(pbuf) &= __constant_cpu_to_le16(~(BIT(3) | BIT(2))); \\\n\t\t*(unsigned short *)(pbuf) |= __constant_cpu_to_le16(type); \\\n\t} while(0)\n\n#define GetFrameSubType(pbuf)\t(cpu_to_le16(*(unsigned short *)(pbuf)) & (BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)))\n\n#define SetFrameSubType(pbuf,type) \\\n\tdo {    \\\n\t\t*(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))); \\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(type); \\\n\t} while(0)\n\n#define GetSequence(pbuf)\t(cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) >> 4)\n\n#define GetFragNum(pbuf)\t(cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & 0x0f)\n\n#define GetTupleCache(pbuf)\t(cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 22)))\n\n#define SetFragNum(pbuf, num) \\\n\tdo {    \\\n\t\t*(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \\\n\t\t\t((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu(~(0x000f))) | \\\n\t\t\tcpu_to_le16(0x0f & (num));     \\\n\t} while(0)\n\n#define SetSeqNum(pbuf, num) \\\n\tdo {    \\\n\t\t*(unsigned short *)((SIZE_PTR)(pbuf) + 22) = \\\n\t\t\t((*(unsigned short *)((SIZE_PTR)(pbuf) + 22)) & le16_to_cpu((unsigned short)~0xfff0)) | \\\n\t\t\tle16_to_cpu((unsigned short)(0xfff0 & (num << 4))); \\\n\t} while(0)\n\n#define SetDuration(pbuf, dur) \\\n\tdo {    \\\n\t\t*(unsigned short *)((SIZE_PTR)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)); \\\n\t} while(0)\n\n\n#define SetPriority(pbuf, tid)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(tid & 0xf); \\\n\t} while(0)\n\n#define GetPriority(pbuf)\t((le16_to_cpu(*(unsigned short *)(pbuf))) & 0xf)\n\n#define SetEOSP(pbuf, eosp)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16( (eosp & 1) << 4); \\\n\t} while(0)\n\n#define SetAckpolicy(pbuf, ack)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16( (ack & 3) << 5); \\\n\t} while(0)\n\n#define GetAckpolicy(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 5) & 0x3)\n\n#define GetAMsdu(pbuf) (((le16_to_cpu(*(unsigned short *)pbuf)) >> 7) & 0x1)\n\n#define SetAMsdu(pbuf, amsdu)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16( (amsdu & 1) << 7); \\\n\t} while(0)\t\n\n#define GetAid(pbuf)\t(cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + 2)) & 0x3fff)\n\n#define GetTid(pbuf)\t(cpu_to_le16(*(unsigned short *)((SIZE_PTR)(pbuf) + (((GetToDs(pbuf)<<1)|GetFrDs(pbuf))==3?30:24))) & 0x000f)\n\n#define GetAddr1Ptr(pbuf)\t((unsigned char *)((SIZE_PTR)(pbuf) + 4))\n\n#define GetAddr2Ptr(pbuf)\t((unsigned char *)((SIZE_PTR)(pbuf) + 10))\n\n#define GetAddr3Ptr(pbuf)\t((unsigned char *)((SIZE_PTR)(pbuf) + 16))\n\n#define GetAddr4Ptr(pbuf)\t((unsigned char *)((SIZE_PTR)(pbuf) + 24))\n\n#define MacAddr_isBcst(addr) \\\n( \\\n\t( (addr[0] == 0xff) && (addr[1] == 0xff) && \\\n\t\t(addr[2] == 0xff) && (addr[3] == 0xff) && \\\n\t\t(addr[4] == 0xff) && (addr[5] == 0xff) )  ? _TRUE : _FALSE \\\n)\n\n__inline static int IS_MCAST(unsigned char *da)\n{\n\tif ((*da) & 0x01)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n}\n\n__inline static unsigned char * get_ra(unsigned char *pframe)\n{\n\tunsigned char \t*ra;\n\tra = GetAddr1Ptr(pframe);\n\treturn ra;\n}\n__inline static unsigned char * get_ta(unsigned char *pframe)\n{\n\tunsigned char \t*ta;\n\tta = GetAddr2Ptr(pframe);\n\treturn ta;\n}\n\n__inline static unsigned char * get_da(unsigned char *pframe)\n{\n\tunsigned char \t*da;\n\tunsigned int\tto_fr_ds\t= (GetToDs(pframe) << 1) | GetFrDs(pframe);\n\n\tswitch (to_fr_ds) {\n\t\tcase 0x00:\t// ToDs=0, FromDs=0\n\t\t\tda = GetAddr1Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x01:\t// ToDs=0, FromDs=1\n\t\t\tda = GetAddr1Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x02:\t// ToDs=1, FromDs=0\n\t\t\tda = GetAddr3Ptr(pframe);\n\t\t\tbreak;\n\t\tdefault:\t// ToDs=1, FromDs=1\n\t\t\tda = GetAddr3Ptr(pframe);\n\t\t\tbreak;\n\t}\n\n\treturn da;\n}\n\n\n__inline static unsigned char * get_sa(unsigned char *pframe)\n{\n\tunsigned char \t*sa;\n\tunsigned int\tto_fr_ds\t= (GetToDs(pframe) << 1) | GetFrDs(pframe);\n\n\tswitch (to_fr_ds) {\n\t\tcase 0x00:\t// ToDs=0, FromDs=0\n\t\t\tsa = GetAddr2Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x01:\t// ToDs=0, FromDs=1\n\t\t\tsa = GetAddr3Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x02:\t// ToDs=1, FromDs=0\n\t\t\tsa = GetAddr2Ptr(pframe);\n\t\t\tbreak;\n\t\tdefault:\t// ToDs=1, FromDs=1\n\t\t\tsa = GetAddr4Ptr(pframe);\n\t\t\tbreak;\n\t}\n\n\treturn sa;\n}\n\n__inline static unsigned char * get_hdr_bssid(unsigned char *pframe)\n{\n\tunsigned char \t*sa = NULL;\n\tunsigned int\tto_fr_ds\t= (GetToDs(pframe) << 1) | GetFrDs(pframe);\n\n\tswitch (to_fr_ds) {\n\t\tcase 0x00:\t// ToDs=0, FromDs=0\n\t\t\tsa = GetAddr3Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x01:\t// ToDs=0, FromDs=1\n\t\t\tsa = GetAddr2Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x02:\t// ToDs=1, FromDs=0\n\t\t\tsa = GetAddr1Ptr(pframe);\n\t\t\tbreak;\n\t\tcase 0x03:\t// ToDs=1, FromDs=1\n\t\t\tsa = GetAddr1Ptr(pframe);\n\t\t\tbreak;\n\t}\n\n\treturn sa;\n}\n\n\n__inline static int IsFrameTypeCtrl(unsigned char *pframe)\n{\n\tif(WIFI_CTRL_TYPE == GetFrameType(pframe))\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n}\n/*-----------------------------------------------------------------------------\n\t\t\tBelow is for the security related definition\n------------------------------------------------------------------------------*/\n#define _RESERVED_FRAME_TYPE_\t0\n#define _SKB_FRAME_TYPE_\t\t2\n#define _PRE_ALLOCMEM_\t\t\t1\n#define _PRE_ALLOCHDR_\t\t\t3\n#define _PRE_ALLOCLLCHDR_\t\t4\n#define _PRE_ALLOCICVHDR_\t\t5\n#define _PRE_ALLOCMICHDR_\t\t6\n\n#define _SIFSTIME_\t\t\t\t((priv->pmib->dot11BssType.net_work_type&WIRELESS_11A)?16:10)\n#define _ACKCTSLNG_\t\t\t\t14\t//14 bytes long, including crclng\n#define _CRCLNG_\t\t\t\t4\n\n#define _ASOCREQ_IE_OFFSET_\t\t4\t// excluding wlan_hdr\n#define\t_ASOCRSP_IE_OFFSET_\t\t6\n#define _REASOCREQ_IE_OFFSET_\t10\n#define _REASOCRSP_IE_OFFSET_\t6\n#define _PROBEREQ_IE_OFFSET_\t0\n#define\t_PROBERSP_IE_OFFSET_\t12\n#define _AUTH_IE_OFFSET_\t\t6\n#define _DEAUTH_IE_OFFSET_\t\t0\n#define _BEACON_IE_OFFSET_\t\t12\n#define _PUBLIC_ACTION_IE_OFFSET_\t8\n\n#define _FIXED_IE_LENGTH_\t\t\t_BEACON_IE_OFFSET_\n\n#define _SSID_IE_\t\t\t\t0\n#define _SUPPORTEDRATES_IE_\t1\n#define _DSSET_IE_\t\t\t\t3\n#define _TIM_IE_\t\t\t\t\t5\n#define _IBSS_PARA_IE_\t\t\t6\n#define _COUNTRY_IE_\t\t\t7\n#define _CHLGETXT_IE_\t\t\t16\n#define _SUPPORTED_CH_IE_\t\t36\n#define _CH_SWTICH_ANNOUNCE_\t37\t//Secondary Channel Offset\n#define _RSN_IE_2_\t\t\t\t48\n#define _SSN_IE_1_\t\t\t\t\t221\n#define _ERPINFO_IE_\t\t\t42\n#define _EXT_SUPPORTEDRATES_IE_\t50\n\n#define _HT_CAPABILITY_IE_\t\t\t45\n#define _FTIE_\t\t\t\t\t\t55\n#define _TIMEOUT_ITVL_IE_\t\t\t56\n#define _SRC_IE_\t\t\t\t59\n#define _HT_EXTRA_INFO_IE_\t\t\t61\n#define _HT_ADD_INFO_IE_\t\t\t61 //_HT_EXTRA_INFO_IE_\n#define _WAPI_IE_\t\t\t\t\t68\n\n\n//#define EID_BSSCoexistence\t\t\t72 // 20/40 BSS Coexistence\n//#define EID_BSSIntolerantChlReport\t73\n#define _RIC_Descriptor_IE_\t\t\t75\n#ifdef CONFIG_IEEE80211W\n#define _MME_IE_\t\t\t\t\t76 //802.11w Management MIC element\n#endif //CONFIG_IEEE80211W\n#define _LINK_ID_IE_\t\t\t\t\t101\n#define _CH_SWITCH_TIMING_\t\t104\n#define _PTI_BUFFER_STATUS_\t\t106\n#define _EXT_CAP_IE_\t\t\t\t127\n#define _VENDOR_SPECIFIC_IE_\t\t221\n\n#define\t_RESERVED47_\t\t\t\t47\n\ntypedef\tenum _ELEMENT_ID{\n\tEID_SsId\t\t\t\t\t= 0, /* service set identifier (0:32) */\n\tEID_SupRates\t\t\t\t= 1, /* supported rates (1:8) */\n\tEID_FHParms\t\t\t\t= 2, /* FH parameter set (5) */\n\tEID_DSParms\t\t\t\t= 3, /* DS parameter set (1) */\n\tEID_CFParms\t\t\t\t= 4, /* CF parameter set (6) */\n\tEID_Tim\t\t\t\t\t\t= 5, /* Traffic Information Map (4:254) */\n\tEID_IbssParms\t\t\t\t= 6, /* IBSS parameter set (2) */\n\tEID_Country\t\t\t\t\t= 7, /* */\n\n\t// Form 7.3.2: Information elements in 802.11E/D13.0, page 46.\n\tEID_QBSSLoad\t\t\t\t= 11,\n\tEID_EDCAParms\t\t\t\t= 12,\n\tEID_TSpec\t\t\t\t\t= 13,\n\tEID_TClass\t\t\t\t\t= 14,\n\tEID_Schedule\t\t\t\t= 15,\n\t//\n\t\n\tEID_Ctext\t\t\t\t\t= 16, /* challenge text*/\n\tEID_POWER_CONSTRAINT\t\t= 32, /* Power Constraint*/\n\n\t//vivi for WIFITest, 802.11h AP, 20100427\n\t// 2010/12/26 MH The definition we can declare always!!\n\tEID_PowerCap\t\t\t\t= 33,\n\tEID_SupportedChannels\t\t= 36,\n\tEID_ChlSwitchAnnounce\t\t= 37,\n\n\tEID_MeasureRequest\t\t\t= 38, // Measurement Request\n\tEID_MeasureReport\t\t\t= 39, // Measurement Report\n\t\n\tEID_ERPInfo \t\t\t\t= 42,\n\n\t// Form 7.3.2: Information elements in 802.11E/D13.0, page 46.\n\tEID_TSDelay\t\t\t\t= 43,\n\tEID_TCLASProc\t\t\t\t= 44,\n\tEID_HTCapability\t\t\t= 45,\n\tEID_QoSCap\t\t\t\t\t= 46,\n\t//\n\t\n\tEID_WPA2\t\t\t\t\t= 48,\n\tEID_ExtSupRates\t\t\t= 50,\n\n\tEID_FTIE\t\t\t\t\t= 55, // Defined in 802.11r\n\tEID_Timeout\t\t\t\t= 56, // Defined in 802.11r\n\t\n\tEID_SupRegulatory\t\t\t= 59, // Supported Requlatory Classes 802.11y\n\tEID_HTInfo \t\t\t\t\t= 61,\n\tEID_SecondaryChnlOffset\t\t= 62,\n\t\n\tEID_BSSCoexistence\t\t\t= 72, // 20/40 BSS Coexistence\n\tEID_BSSIntolerantChlReport\t= 73,\n\tEID_OBSS\t\t\t\t\t= 74, // Overlapping BSS Scan Parameters\n\t\n\tEID_LinkIdentifier\t\t\t= 101, // Defined in 802.11z\n\tEID_WakeupSchedule\t\t= 102, // Defined in 802.11z\n\tEID_ChnlSwitchTimeing\t\t= 104, // Defined in 802.11z\n\tEID_PTIControl\t\t\t\t= 105, // Defined in 802.11z\n\tEID_PUBufferStatus\t\t\t= 106, // Defined in 802.11z\n\t\n\tEID_EXTCapability\t\t\t= 127, // Extended Capabilities\n\t// From S19:Aironet IE and S21:AP IP address IE in CCX v1.13, p16 and p18.\n\tEID_Aironet\t\t\t\t\t= 133, // 0x85: Aironet Element for Cisco CCX\n\tEID_CiscoIP\t\t\t\t\t= 149, // 0x95: IP Address IE for Cisco CCX\n\n\tEID_CellPwr\t\t\t\t\t= 150, // 0x96: Cell Power Limit IE. Ref. 0x96.\n\n\tEID_CCKM    \t\t\t\t\t= 156, \n\n\tEID_Vendor\t\t\t\t\t= 221, // 0xDD: Vendor Specific\n\n\tEID_WAPI\t\t\t\t\t= 68,\n\tEID_VHTCapability \t\t\t= 191, // Based on 802.11ac D2.0\n\tEID_VHTOperation \t\t\t= 192, // Based on 802.11ac D2.0\n\tEID_AID\t\t\t\t\t\t= 197, /* Based on 802.11ac D4.0 */\n\tEID_OpModeNotification\t\t= 199, // Based on 802.11ac D3.0\n}ELEMENT_ID, *PELEMENT_ID;\n\n/* ---------------------------------------------------------------------------\n\t\t\t\t\tBelow is the fixed elements...\n-----------------------------------------------------------------------------*/\n#define _AUTH_ALGM_NUM_\t\t\t2\n#define _AUTH_SEQ_NUM_\t\t\t2\n#define _BEACON_ITERVAL_\t\t2\n#define _CAPABILITY_\t\t\t2\n#define _CURRENT_APADDR_\t\t6\n#define _LISTEN_INTERVAL_\t\t2\n#define _RSON_CODE_\t\t\t\t2\n#define _ASOC_ID_\t\t\t\t2\n#define _STATUS_CODE_\t\t\t2\n#define _TIMESTAMP_\t\t\t\t8\n\n#define AUTH_ODD_TO\t\t\t\t0\n#define AUTH_EVEN_TO\t\t\t1\n\n#define WLAN_ETHCONV_ENCAP\t\t1\n#define WLAN_ETHCONV_RFC1042\t2\n#define WLAN_ETHCONV_8021h\t\t3\n\n#define cap_ESS BIT(0)\n#define cap_IBSS BIT(1)\n#define cap_CFPollable BIT(2)\n#define cap_CFRequest BIT(3)\n#define cap_Privacy BIT(4)\n#define cap_ShortPremble BIT(5)\n#define cap_PBCC\tBIT(6)\n#define cap_ChAgility\tBIT(7)\n#define cap_SpecMgmt\tBIT(8)\n#define cap_QoS\tBIT(9)\n#define cap_ShortSlot\tBIT(10)\n\n/*-----------------------------------------------------------------------------\n\t\t\t\tBelow is the definition for 802.11i / 802.1x\n------------------------------------------------------------------------------*/\n#define _IEEE8021X_MGT_\t\t\t1\t\t// WPA\n#define _IEEE8021X_PSK_\t\t\t2\t\t// WPA with pre-shared key\n\n/*\n#define _NO_PRIVACY_\t\t\t0\n#define _WEP_40_PRIVACY_\t\t1\n#define _TKIP_PRIVACY_\t\t\t2\n#define _WRAP_PRIVACY_\t\t\t3\n#define _CCMP_PRIVACY_\t\t\t4\n#define _WEP_104_PRIVACY_\t\t5\n#define _WEP_WPA_MIXED_PRIVACY_ 6\t// WEP + WPA\n*/\n\n#ifdef CONFIG_IEEE80211W\n#define _MME_IE_LENGTH_  18\n#endif //CONFIG_IEEE80211W\t\t\t\t\n/*-----------------------------------------------------------------------------\n\t\t\t\tBelow is the definition for WMM\n------------------------------------------------------------------------------*/\n#define _WMM_IE_Length_\t\t\t\t7  // for WMM STA\n#define _WMM_Para_Element_Length_\t\t24\n\n\n/*-----------------------------------------------------------------------------\n\t\t\t\tBelow is the definition for 802.11n \n------------------------------------------------------------------------------*/\n\n//#ifdef CONFIG_80211N_HT\n\n#define SetOrderBit(pbuf)\t\\\n\tdo\t{\t\\\n\t\t*(unsigned short *)(pbuf) |= cpu_to_le16(_ORDER_); \\\n\t} while(0)\n\n#define GetOrderBit(pbuf)\t(((*(unsigned short *)(pbuf)) & le16_to_cpu(_ORDER_)) != 0)\n\n#define ACT_CAT_VENDOR\t\t\t\t0x7F/* 127 */\n\n/**\n * struct rtw_ieee80211_bar - HT Block Ack Request\n *\n * This structure refers to \"HT BlockAckReq\" as\n * described in 802.11n draft section 7.2.1.7.1\n */\n #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW)\nstruct rtw_ieee80211_bar {\n\tunsigned short frame_control;\n\tunsigned short duration;\n\tunsigned char ra[6];\n\tunsigned char ta[6];\n\tunsigned short control;\n\tunsigned short start_seq_num;\n} __attribute__((packed));\n #endif\n\n/* 802.11 BAR control masks */\n#define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL     0x0000\n#define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA  0x0004\n\n\n #if defined(PLATFORM_LINUX) || defined(CONFIG_RTL8712FW) || defined(PLATFORM_FREEBSD)\n\n\n\n /**\n * struct rtw_ieee80211_ht_cap - HT capabilities\n *\n * This structure refers to \"HT capabilities element\" as\n * described in 802.11n draft section 7.3.2.52\n */\n \nstruct rtw_ieee80211_ht_cap {\n\tunsigned short \tcap_info;\n\tunsigned char \tampdu_params_info;\n\tunsigned char \tsupp_mcs_set[16];\n\tunsigned short \textended_ht_cap_info;\n\tunsigned int\t\ttx_BF_cap_info;\n\tunsigned char\t       antenna_selection_info;\n} __attribute__ ((packed));\n\n/**\n * struct rtw_ieee80211_ht_cap - HT additional information\n *\n * This structure refers to \"HT information element\" as\n * described in 802.11n draft section 7.3.2.53\n */\nstruct ieee80211_ht_addt_info {\n\tunsigned char \tcontrol_chan;\n\tunsigned char\t\tht_param;\n\tunsigned short\toperation_mode;\n\tunsigned short\tstbc_param;\n\tunsigned char\t\tbasic_set[16];\n} __attribute__ ((packed));\n\n\nstruct HT_caps_element\n{\n\tunion\n\t{ \n\t\tstruct \n\t\t{ \t\n\t\t\tunsigned short\tHT_caps_info;\n\t\t\tunsigned char\tAMPDU_para;\n\t\t\tunsigned char\tMCS_rate[16];\n\t\t\tunsigned short\tHT_ext_caps;\n\t\t\tunsigned int\tBeamforming_caps;\n\t\t\tunsigned char\tASEL_caps;\n\t\t} HT_cap_element;\n\t\tunsigned char HT_cap[26];\n\t}u;\n} __attribute__ ((packed));\n\nstruct HT_info_element\n{\n\tunsigned char\tprimary_channel;\n\tunsigned char\tinfos[5];\n\tunsigned char\tMCS_rate[16];\n}  __attribute__ ((packed));\n\nstruct AC_param\n{\n\tunsigned char\t\tACI_AIFSN;\n\tunsigned char\t\tCW;\n\tunsigned short\tTXOP_limit;\n}  __attribute__ ((packed));\n\nstruct WMM_para_element\n{\n\tunsigned char\t\tQoS_info;\n\tunsigned char\t\treserved;\n\tstruct AC_param\tac_param[4];\n}  __attribute__ ((packed));\n\nstruct ADDBA_request\n{\n\tunsigned char\t\tdialog_token;\n\tunsigned short\tBA_para_set;\n\tunsigned short\tBA_timeout_value;\n\tunsigned short\tBA_starting_seqctrl;\n}  __attribute__ ((packed));\n\n\n\n#endif\n\n\n#ifdef PLATFORM_WINDOWS\n\n#pragma pack(1)\n\nstruct rtw_ieee80211_ht_cap {\n\tunsigned short \tcap_info;\n\tunsigned char \tampdu_params_info;\n\tunsigned char \tsupp_mcs_set[16];\n\tunsigned short \textended_ht_cap_info;\n\tunsigned int\t\ttx_BF_cap_info;\n\tunsigned char\t       antenna_selection_info;\n};\n\n\nstruct ieee80211_ht_addt_info {\n\tunsigned char \tcontrol_chan;\n\tunsigned char\t\tht_param;\n\tunsigned short\toperation_mode;\n\tunsigned short\tstbc_param;\n\tunsigned char\t\tbasic_set[16];\n};\n\nstruct HT_caps_element\n{\n\tunion\n\t{ \n\t\tstruct \n\t\t{ \t\n\t\t\tunsigned short\tHT_caps_info;\n\t\t\tunsigned char\tAMPDU_para;\n\t\t\tunsigned char\tMCS_rate[16];\n\t\t\tunsigned short\tHT_ext_caps;\n\t\t\tunsigned int\tBeamforming_caps;\n\t\t\tunsigned char\tASEL_caps;\n\t\t} HT_cap_element;\n\t\tunsigned char HT_cap[26];\n\t};\n};\n\nstruct HT_info_element\n{\n\tunsigned char\tprimary_channel;\n\tunsigned char\tinfos[5];\n\tunsigned char\tMCS_rate[16];\n};\n\nstruct AC_param\n{\n\tunsigned char\t\tACI_AIFSN;\n\tunsigned char\t\tCW;\n\tunsigned short\tTXOP_limit;\n};\n\nstruct WMM_para_element\n{\n\tunsigned char\t\tQoS_info;\n\tunsigned char\t\treserved;\n\tstruct AC_param\tac_param[4];\n};\n\nstruct ADDBA_request\n{\n\tunsigned char\t\tdialog_token;\n\tunsigned short\tBA_para_set;\n\tunsigned short\tBA_timeout_value;\n\tunsigned short\tBA_starting_seqctrl;\n};\n\n\n#pragma pack()\n\n#endif\n\ntypedef enum _HT_CAP_AMPDU_FACTOR {\n\tMAX_AMPDU_FACTOR_8K\t\t= 0,\n\tMAX_AMPDU_FACTOR_16K\t= 1,\n\tMAX_AMPDU_FACTOR_32K\t= 2,\n\tMAX_AMPDU_FACTOR_64K\t= 3,\t\n}HT_CAP_AMPDU_FACTOR;\n\n\ntypedef enum _HT_CAP_AMPDU_DENSITY {\n\tAMPDU_DENSITY_VALUE_0 = 0 , /* For no restriction */\n\tAMPDU_DENSITY_VALUE_1 = 1 , /* For 1/4 us */\n\tAMPDU_DENSITY_VALUE_2 = 2 , /* For 1/2 us */\n\tAMPDU_DENSITY_VALUE_3 = 3 , /* For 1 us */\n\tAMPDU_DENSITY_VALUE_4 = 4 , /* For 2 us */\n\tAMPDU_DENSITY_VALUE_5 = 5 , /* For 4 us */\n\tAMPDU_DENSITY_VALUE_6 = 6 , /* For 8 us */\n\tAMPDU_DENSITY_VALUE_7 = 7 , /* For 16 us */\n} HT_CAP_AMPDU_DENSITY;\n\n/* 802.11n HT capabilities masks */\n#define IEEE80211_HT_CAP_LDPC_CODING\t\t0x0001\n#define IEEE80211_HT_CAP_SUP_WIDTH\t\t0x0002\n#define IEEE80211_HT_CAP_SM_PS\t\t\t0x000C\n#define IEEE80211_HT_CAP_GRN_FLD\t\t0x0010\n#define IEEE80211_HT_CAP_SGI_20\t\t\t0x0020\n#define IEEE80211_HT_CAP_SGI_40\t\t\t0x0040\n#define IEEE80211_HT_CAP_TX_STBC\t\t\t0x0080\n#define IEEE80211_HT_CAP_RX_STBC_1R\t\t0x0100\n#define IEEE80211_HT_CAP_RX_STBC_2R\t\t0x0200\n#define IEEE80211_HT_CAP_RX_STBC_3R\t\t0x0300\n#define IEEE80211_HT_CAP_DELAY_BA\t\t0x0400\n#define IEEE80211_HT_CAP_MAX_AMSDU\t\t0x0800\n#define IEEE80211_HT_CAP_DSSSCCK40\t\t0x1000\n#define RTW_IEEE80211_HT_CAP_40MHZ_INTOLERANT\t((u16) BIT(14))\n/* 802.11n HT capability AMPDU settings */\n#define IEEE80211_HT_CAP_AMPDU_FACTOR\t\t0x03\n#define IEEE80211_HT_CAP_AMPDU_DENSITY\t\t0x1C\n/* 802.11n HT capability MSC set */\n#define IEEE80211_SUPP_MCS_SET_UEQM\t\t4\n#define IEEE80211_HT_CAP_MAX_STREAMS\t\t4\n#define IEEE80211_SUPP_MCS_SET_LEN\t\t10\n/* maximum streams the spec allows */\n#define IEEE80211_HT_CAP_MCS_TX_DEFINED\t\t0x01\n#define IEEE80211_HT_CAP_MCS_TX_RX_DIFF\t\t0x02\n#define IEEE80211_HT_CAP_MCS_TX_STREAMS\t\t0x0C\n#define IEEE80211_HT_CAP_MCS_TX_UEQM\t\t0x10\n/* 802.11n HT capability TXBF capability */\n#define IEEE80211_HT_CAP_TXBF_RX_NDP\t\t0x00000008\n#define IEEE80211_HT_CAP_TXBF_TX_NDP\t\t0x00000010\n#define IEEE80211_HT_CAP_TXBF_EXPLICIT_COMP_STEERING_CAP\t0x00000400\n\n/* 802.11n HT IE masks */\n#define IEEE80211_HT_IE_CHA_SEC_OFFSET\t\t0x03\n#define IEEE80211_HT_IE_CHA_SEC_NONE\t \t0x00\n#define IEEE80211_HT_IE_CHA_SEC_ABOVE \t\t0x01\n#define IEEE80211_HT_IE_CHA_SEC_BELOW \t\t0x03\n#define IEEE80211_HT_IE_CHA_WIDTH\t\t0x04\n#define IEEE80211_HT_IE_HT_PROTECTION\t\t0x0003\n#define IEEE80211_HT_IE_NON_GF_STA_PRSNT\t0x0004\n#define IEEE80211_HT_IE_NON_HT_STA_PRSNT\t0x0010\n\n/* block-ack parameters */\n#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002\n#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C\n#define RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0\n#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000\n#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800\n\n/*\n * A-PMDU buffer sizes\n * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)\n */\n#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 0)\n#define IEEE80211_MIN_AMPDU_BUF 0x8\n#define IEEE80211_MAX_AMPDU_BUF 0x40\n#endif\n\n\n/* Spatial Multiplexing Power Save Modes */\n#define WLAN_HT_CAP_SM_PS_STATIC\t\t0\n#define WLAN_HT_CAP_SM_PS_DYNAMIC\t1\n#define WLAN_HT_CAP_SM_PS_INVALID\t2\n#define WLAN_HT_CAP_SM_PS_DISABLED\t3\n\n\n#define OP_MODE_PURE                    0\n#define OP_MODE_MAY_BE_LEGACY_STAS      1\n#define OP_MODE_20MHZ_HT_STA_ASSOCED    2\n#define OP_MODE_MIXED                   3\n\n#define HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK\t((u8) BIT(0) | BIT(1))\n#define HT_INFO_HT_PARAM_SECONDARY_CHNL_ABOVE\t\t((u8) BIT(0))\n#define HT_INFO_HT_PARAM_SECONDARY_CHNL_BELOW\t\t((u8) BIT(0) | BIT(1))\n#define HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH\t\t((u8) BIT(2))\n#define HT_INFO_HT_PARAM_RIFS_MODE\t\t\t((u8) BIT(3))\n#define HT_INFO_HT_PARAM_CTRL_ACCESS_ONLY\t\t((u8) BIT(4))\n#define HT_INFO_HT_PARAM_SRV_INTERVAL_GRANULARITY\t((u8) BIT(5))\n\n#define HT_INFO_OPERATION_MODE_OP_MODE_MASK\t\\\n\t\t((u16) (0x0001 | 0x0002))\n#define HT_INFO_OPERATION_MODE_OP_MODE_OFFSET\t\t0\n#define HT_INFO_OPERATION_MODE_NON_GF_DEVS_PRESENT\t((u8) BIT(2))\n#define HT_INFO_OPERATION_MODE_TRANSMIT_BURST_LIMIT\t((u8) BIT(3))\n#define HT_INFO_OPERATION_MODE_NON_HT_STA_PRESENT\t((u8) BIT(4))\n\n#define HT_INFO_STBC_PARAM_DUAL_BEACON\t\t\t((u16) BIT(6))\n#define HT_INFO_STBC_PARAM_DUAL_STBC_PROTECT\t\t((u16) BIT(7))\n#define HT_INFO_STBC_PARAM_SECONDARY_BCN\t\t((u16) BIT(8))\n#define HT_INFO_STBC_PARAM_LSIG_TXOP_PROTECT_ALLOWED\t((u16) BIT(9))\n#define HT_INFO_STBC_PARAM_PCO_ACTIVE\t\t\t((u16) BIT(10))\n#define HT_INFO_STBC_PARAM_PCO_PHASE\t\t\t((u16) BIT(11))\n\n\n\n//#endif\n\n//\t===============WPS Section===============\n//\tFor WPSv1.0\n#define WPSOUI\t\t\t\t\t\t\t0x0050f204\n//\tWPS attribute ID\n#define WPS_ATTR_VER1\t\t\t\t\t0x104A\n#define WPS_ATTR_SIMPLE_CONF_STATE\t0x1044\n#define WPS_ATTR_RESP_TYPE\t\t\t0x103B\n#define WPS_ATTR_UUID_E\t\t\t\t0x1047\n#define WPS_ATTR_MANUFACTURER\t\t0x1021\n#define WPS_ATTR_MODEL_NAME\t\t\t0x1023\n#define WPS_ATTR_MODEL_NUMBER\t\t0x1024\n#define WPS_ATTR_SERIAL_NUMBER\t\t0x1042\n#define WPS_ATTR_PRIMARY_DEV_TYPE\t0x1054\n#define WPS_ATTR_SEC_DEV_TYPE_LIST\t0x1055\n#define WPS_ATTR_DEVICE_NAME\t\t\t0x1011\n#define WPS_ATTR_CONF_METHOD\t\t\t0x1008\n#define WPS_ATTR_RF_BANDS\t\t\t\t0x103C\n#define WPS_ATTR_DEVICE_PWID\t\t\t0x1012\n#define WPS_ATTR_REQUEST_TYPE\t\t\t0x103A\n#define WPS_ATTR_ASSOCIATION_STATE\t0x1002\n#define WPS_ATTR_CONFIG_ERROR\t\t\t0x1009\n#define WPS_ATTR_VENDOR_EXT\t\t\t0x1049\n#define WPS_ATTR_SELECTED_REGISTRAR\t0x1041\n\n//\tValue of WPS attribute \"WPS_ATTR_DEVICE_NAME\n#define WPS_MAX_DEVICE_NAME_LEN\t\t32\n\n//\tValue of WPS Request Type Attribute\n#define WPS_REQ_TYPE_ENROLLEE_INFO_ONLY\t\t\t0x00\n#define WPS_REQ_TYPE_ENROLLEE_OPEN_8021X\t\t0x01\n#define WPS_REQ_TYPE_REGISTRAR\t\t\t\t\t0x02\n#define WPS_REQ_TYPE_WLAN_MANAGER_REGISTRAR\t0x03\n\n//\tValue of WPS Response Type Attribute\n#define WPS_RESPONSE_TYPE_INFO_ONLY\t0x00\n#define WPS_RESPONSE_TYPE_8021X\t\t0x01\n#define WPS_RESPONSE_TYPE_REGISTRAR\t0x02\n#define WPS_RESPONSE_TYPE_AP\t\t\t0x03\n\n//\tValue of WPS WiFi Simple Configuration State Attribute\n#define WPS_WSC_STATE_NOT_CONFIG\t0x01\n#define WPS_WSC_STATE_CONFIG\t\t\t0x02\n\n//\tValue of WPS Version Attribute\n#define WPS_VERSION_1\t\t\t\t\t0x10\n\n//\tValue of WPS Configuration Method Attribute\n#define WPS_CONFIG_METHOD_FLASH\t\t0x0001\n#define WPS_CONFIG_METHOD_ETHERNET\t0x0002\n#define WPS_CONFIG_METHOD_LABEL\t\t0x0004\n#define WPS_CONFIG_METHOD_DISPLAY\t0x0008\n#define WPS_CONFIG_METHOD_E_NFC\t\t0x0010\n#define WPS_CONFIG_METHOD_I_NFC\t\t0x0020\n#define WPS_CONFIG_METHOD_NFC\t\t0x0040\n#define WPS_CONFIG_METHOD_PBC\t\t0x0080\n#define WPS_CONFIG_METHOD_KEYPAD\t0x0100\n#define WPS_CONFIG_METHOD_VPBC\t\t0x0280\n#define WPS_CONFIG_METHOD_PPBC\t\t0x0480\n#define WPS_CONFIG_METHOD_VDISPLAY\t0x2008\n#define WPS_CONFIG_METHOD_PDISPLAY\t0x4008\n\n//\tValue of Category ID of WPS Primary Device Type Attribute\n#define WPS_PDT_CID_DISPLAYS\t\t\t0x0007\n#define WPS_PDT_CID_MULIT_MEDIA\t\t0x0008\n#define WPS_PDT_CID_RTK_WIDI\t\t\tWPS_PDT_CID_MULIT_MEDIA\n\n//\tValue of Sub Category ID of WPS Primary Device Type Attribute\n#define WPS_PDT_SCID_MEDIA_SERVER\t0x0005\n#define WPS_PDT_SCID_RTK_DMP\t\t\tWPS_PDT_SCID_MEDIA_SERVER\n\n//\tValue of Device Password ID\n#define WPS_DPID_PIN\t\t\t\t\t0x0000\n#define WPS_DPID_USER_SPEC\t\t\t0x0001\n#define WPS_DPID_MACHINE_SPEC\t\t\t0x0002\n#define WPS_DPID_REKEY\t\t\t\t\t0x0003\n#define WPS_DPID_PBC\t\t\t\t\t0x0004\n#define WPS_DPID_REGISTRAR_SPEC\t\t0x0005\n\n//\tValue of WPS RF Bands Attribute\n#define WPS_RF_BANDS_2_4_GHZ\t\t0x01\n#define WPS_RF_BANDS_5_GHZ\t\t0x02\n\n//\tValue of WPS Association State Attribute\n#define WPS_ASSOC_STATE_NOT_ASSOCIATED\t\t\t0x00\n#define WPS_ASSOC_STATE_CONNECTION_SUCCESS\t\t0x01\n#define WPS_ASSOC_STATE_CONFIGURATION_FAILURE\t0x02\n#define WPS_ASSOC_STATE_ASSOCIATION_FAILURE\t\t0x03\n#define WPS_ASSOC_STATE_IP_FAILURE\t\t\t\t0x04\n\n//\t=====================P2P Section=====================\n//\tFor P2P\n#define\tP2POUI\t\t\t\t\t\t\t0x506F9A09\n\n//\tP2P Attribute ID\n#define\tP2P_ATTR_STATUS\t\t\t\t\t0x00\n#define\tP2P_ATTR_MINOR_REASON_CODE\t\t0x01\n#define\tP2P_ATTR_CAPABILITY\t\t\t\t0x02\n#define\tP2P_ATTR_DEVICE_ID\t\t\t\t0x03\n#define\tP2P_ATTR_GO_INTENT\t\t\t\t0x04\n#define\tP2P_ATTR_CONF_TIMEOUT\t\t\t0x05\n#define\tP2P_ATTR_LISTEN_CH\t\t\t\t0x06\n#define\tP2P_ATTR_GROUP_BSSID\t\t\t\t0x07\n#define\tP2P_ATTR_EX_LISTEN_TIMING\t\t0x08\n#define\tP2P_ATTR_INTENTED_IF_ADDR\t\t0x09\n#define\tP2P_ATTR_MANAGEABILITY\t\t\t0x0A\n#define\tP2P_ATTR_CH_LIST\t\t\t\t\t0x0B\n#define\tP2P_ATTR_NOA\t\t\t\t\t\t0x0C\n#define\tP2P_ATTR_DEVICE_INFO\t\t\t\t0x0D\n#define\tP2P_ATTR_GROUP_INFO\t\t\t\t0x0E\n#define\tP2P_ATTR_GROUP_ID\t\t\t\t\t0x0F\n#define\tP2P_ATTR_INTERFACE\t\t\t\t0x10\n#define\tP2P_ATTR_OPERATING_CH\t\t\t0x11\n#define\tP2P_ATTR_INVITATION_FLAGS\t\t0x12\n\n//\tValue of Status Attribute\n#define\tP2P_STATUS_SUCCESS\t\t\t\t\t\t0x00\n#define\tP2P_STATUS_FAIL_INFO_UNAVAILABLE\t\t0x01\n#define\tP2P_STATUS_FAIL_INCOMPATIBLE_PARAM\t\t0x02\n#define\tP2P_STATUS_FAIL_LIMIT_REACHED\t\t\t0x03\n#define\tP2P_STATUS_FAIL_INVALID_PARAM\t\t\t0x04\n#define\tP2P_STATUS_FAIL_REQUEST_UNABLE\t\t\t0x05\n#define\tP2P_STATUS_FAIL_PREVOUS_PROTO_ERR\t\t0x06\n#define\tP2P_STATUS_FAIL_NO_COMMON_CH\t\t\t0x07\n#define\tP2P_STATUS_FAIL_UNKNOWN_P2PGROUP\t\t0x08\n#define\tP2P_STATUS_FAIL_BOTH_GOINTENT_15\t\t0x09\n#define\tP2P_STATUS_FAIL_INCOMPATIBLE_PROVSION\t0x0A\n#define\tP2P_STATUS_FAIL_USER_REJECT\t\t\t\t0x0B\n\n//\tValue of Inviation Flags Attribute\n#define\tP2P_INVITATION_FLAGS_PERSISTENT\t\t\tBIT(0)\n\n#define\tDMP_P2P_DEVCAP_SUPPORT\t(P2P_DEVCAP_SERVICE_DISCOVERY | \\\n\t\t\t\t\t\t\t\t\tP2P_DEVCAP_CLIENT_DISCOVERABILITY | \\\n\t\t\t\t\t\t\t\t\tP2P_DEVCAP_CONCURRENT_OPERATION | \\\n\t\t\t\t\t\t\t\t\tP2P_DEVCAP_INVITATION_PROC)\n\n#define\tDMP_P2P_GRPCAP_SUPPORT\t(P2P_GRPCAP_INTRABSS)\n\n//\tValue of Device Capability Bitmap\n#define\tP2P_DEVCAP_SERVICE_DISCOVERY\t\tBIT(0)\n#define\tP2P_DEVCAP_CLIENT_DISCOVERABILITY\tBIT(1)\n#define\tP2P_DEVCAP_CONCURRENT_OPERATION\tBIT(2)\n#define\tP2P_DEVCAP_INFRA_MANAGED\t\t\tBIT(3)\n#define\tP2P_DEVCAP_DEVICE_LIMIT\t\t\t\tBIT(4)\n#define\tP2P_DEVCAP_INVITATION_PROC\t\t\tBIT(5)\n\n//\tValue of Group Capability Bitmap\n#define\tP2P_GRPCAP_GO\t\t\t\t\t\t\tBIT(0)\n#define\tP2P_GRPCAP_PERSISTENT_GROUP\t\t\tBIT(1)\n#define\tP2P_GRPCAP_GROUP_LIMIT\t\t\t\tBIT(2)\n#define\tP2P_GRPCAP_INTRABSS\t\t\t\t\tBIT(3)\n#define\tP2P_GRPCAP_CROSS_CONN\t\t\t\tBIT(4)\n#define\tP2P_GRPCAP_PERSISTENT_RECONN\t\tBIT(5)\n#define\tP2P_GRPCAP_GROUP_FORMATION\t\t\tBIT(6)\n\n//\tP2P Public Action Frame ( Management Frame )\n#define\tP2P_PUB_ACTION_ACTION\t\t\t\t0x09\n\n//\tP2P Public Action Frame Type\n#define\tP2P_GO_NEGO_REQ\t\t\t\t\t\t0\n#define\tP2P_GO_NEGO_RESP\t\t\t\t\t\t1\n#define\tP2P_GO_NEGO_CONF\t\t\t\t\t\t2\n#define\tP2P_INVIT_REQ\t\t\t\t\t\t\t3\n#define\tP2P_INVIT_RESP\t\t\t\t\t\t\t4\n#define\tP2P_DEVDISC_REQ\t\t\t\t\t\t5\n#define\tP2P_DEVDISC_RESP\t\t\t\t\t\t6\n#define\tP2P_PROVISION_DISC_REQ\t\t\t\t7\n#define\tP2P_PROVISION_DISC_RESP\t\t\t\t8\n\n//\tP2P Action Frame Type\n#define\tP2P_NOTICE_OF_ABSENCE\t0\n#define\tP2P_PRESENCE_REQUEST\t\t1\n#define\tP2P_PRESENCE_RESPONSE\t2\n#define\tP2P_GO_DISC_REQUEST\t\t3\n\n\n#define\tP2P_MAX_PERSISTENT_GROUP_NUM\t\t10\n\n#define\tP2P_PROVISIONING_SCAN_CNT\t\t\t3\n\n#define\tP2P_WILDCARD_SSID_LEN\t\t\t\t7\n\n#define\tP2P_FINDPHASE_EX_NONE\t\t\t\t0\t// default value, used when: (1)p2p disabed or (2)p2p enabled but only do 1 scan phase\n#define\tP2P_FINDPHASE_EX_FULL\t\t\t\t1\t// used when p2p enabled and want to do 1 scan phase and P2P_FINDPHASE_EX_MAX-1 find phase\n#define\tP2P_FINDPHASE_EX_SOCIAL_FIRST\t\t(P2P_FINDPHASE_EX_FULL+1) \n#define\tP2P_FINDPHASE_EX_MAX\t\t\t\t\t4\n#define\tP2P_FINDPHASE_EX_SOCIAL_LAST\t\tP2P_FINDPHASE_EX_MAX\n\n#define\tP2P_PROVISION_TIMEOUT\t\t\t\t5000\t//\t5 seconds timeout for sending the provision discovery request\n#define\tP2P_CONCURRENT_PROVISION_TIMEOUT\t3000\t//\t3 seconds timeout for sending the provision discovery request under concurrent mode\n#define\tP2P_GO_NEGO_TIMEOUT\t\t\t\t\t5000\t//\t5 seconds timeout for receiving the group negotation response\n#define\tP2P_CONCURRENT_GO_NEGO_TIMEOUT\t\t3000\t//\t3 seconds timeout for sending the negotiation request under concurrent mode\n#define\tP2P_TX_PRESCAN_TIMEOUT\t\t\t\t100\t\t//\t100ms\n#define\tP2P_INVITE_TIMEOUT\t\t\t\t\t5000\t//\t5 seconds timeout for sending the invitation request\n#define\tP2P_CONCURRENT_INVITE_TIMEOUT\t\t3000\t//\t3 seconds timeout for sending the invitation request under concurrent mode\n#define\tP2P_RESET_SCAN_CH\t\t\t\t\t\t25000\t//\t25 seconds timeout to reset the scan channel ( based on channel plan )\n#define\tP2P_MAX_INTENT\t\t\t\t\t\t15\n\n#define\tP2P_MAX_NOA_NUM\t\t\t\t\t\t2\n\n//\tWPS Configuration Method\n#define\tWPS_CM_NONE\t\t\t\t\t\t\t0x0000\n#define\tWPS_CM_LABEL\t\t\t\t\t\t\t0x0004\n#define\tWPS_CM_DISPLYA\t\t\t\t\t\t0x0008\n#define\tWPS_CM_EXTERNAL_NFC_TOKEN\t\t\t0x0010\n#define\tWPS_CM_INTEGRATED_NFC_TOKEN\t\t0x0020\n#define\tWPS_CM_NFC_INTERFACE\t\t\t\t\t0x0040\n#define\tWPS_CM_PUSH_BUTTON\t\t\t\t\t0x0080\n#define\tWPS_CM_KEYPAD\t\t\t\t\t\t0x0100\n#define\tWPS_CM_SW_PUHS_BUTTON\t\t\t\t0x0280\n#define\tWPS_CM_HW_PUHS_BUTTON\t\t\t\t0x0480\n#define\tWPS_CM_SW_DISPLAY_PIN\t\t\t\t0x2008\n#define\tWPS_CM_LCD_DISPLAY_PIN\t\t\t\t0x4008\n\nenum P2P_ROLE {\n\tP2P_ROLE_DISABLE = 0,\n\tP2P_ROLE_DEVICE = 1,\n\tP2P_ROLE_CLIENT = 2,\n\tP2P_ROLE_GO = 3\t\n};\n\nenum P2P_STATE {\n\tP2P_STATE_NONE = 0,\t\t\t\t\t\t\t//\tP2P disable\n\tP2P_STATE_IDLE = 1,\t\t\t\t\t\t\t\t//\tP2P had enabled and do nothing\n\tP2P_STATE_LISTEN = 2,\t\t\t\t\t\t\t//\tIn pure listen state\n\tP2P_STATE_SCAN = 3,\t\t\t\t\t\t\t//\tIn scan phase\n\tP2P_STATE_FIND_PHASE_LISTEN = 4,\t\t\t\t//\tIn the listen state of find phase\n\tP2P_STATE_FIND_PHASE_SEARCH = 5,\t\t\t\t//\tIn the search state of find phase\n\tP2P_STATE_TX_PROVISION_DIS_REQ = 6,\t\t\t//\tIn P2P provisioning discovery\n\tP2P_STATE_RX_PROVISION_DIS_RSP = 7,\n\tP2P_STATE_RX_PROVISION_DIS_REQ = 8,\t\n\tP2P_STATE_GONEGO_ING = 9,\t\t\t\t\t\t//\tDoing the group owner negoitation handshake\n\tP2P_STATE_GONEGO_OK = 10,\t\t\t\t\t\t//\tfinish the group negoitation handshake with success\n\tP2P_STATE_GONEGO_FAIL = 11,\t\t\t\t\t//\tfinish the group negoitation handshake with failure\n\tP2P_STATE_RECV_INVITE_REQ_MATCH = 12,\t\t//\treceiving the P2P Inviation request and match with the profile.\n\tP2P_STATE_PROVISIONING_ING = 13,\t\t\t\t//\tDoing the P2P WPS\n\tP2P_STATE_PROVISIONING_DONE = 14,\t\t\t//\tFinish the P2P WPS\n\tP2P_STATE_TX_INVITE_REQ = 15,\t\t\t\t\t//\tTransmit the P2P Invitation request\n\tP2P_STATE_RX_INVITE_RESP_OK = 16,\t\t\t\t//\tReceiving the P2P Invitation response\n\tP2P_STATE_RECV_INVITE_REQ_DISMATCH = 17,\t//\treceiving the P2P Inviation request and dismatch with the profile.\n\tP2P_STATE_RECV_INVITE_REQ_GO = 18,\t\t\t//\treceiving the P2P Inviation request and this wifi is GO.\n\tP2P_STATE_RECV_INVITE_REQ_JOIN = 19,\t\t\t//\treceiving the P2P Inviation request to join an existing P2P Group.\n\tP2P_STATE_RX_INVITE_RESP_FAIL = 20,\t\t\t//\trecveing the P2P Inviation response with failure\n\tP2P_STATE_RX_INFOR_NOREADY = 21, \t\t\t// receiving p2p negoitation response with information is not available\n\tP2P_STATE_TX_INFOR_NOREADY = 22, \t\t\t// sending p2p negoitation response with information is not available\n};\n\nenum P2P_WPSINFO {\n\tP2P_NO_WPSINFO\t\t\t\t\t\t= 0,\n\tP2P_GOT_WPSINFO_PEER_DISPLAY_PIN\t= 1,\n\tP2P_GOT_WPSINFO_SELF_DISPLAY_PIN\t= 2,\n\tP2P_GOT_WPSINFO_PBC\t\t\t\t\t= 3,\n};\n\n#define\tP2P_PRIVATE_IOCTL_SET_LEN\t\t64\n\nenum P2P_PROTO_WK_ID\n{\n\tP2P_FIND_PHASE_WK = 0,\n\tP2P_RESTORE_STATE_WK = 1,\n\tP2P_PRE_TX_PROVDISC_PROCESS_WK = 2,\n\tP2P_PRE_TX_NEGOREQ_PROCESS_WK = 3,\t\n\tP2P_PRE_TX_INVITEREQ_PROCESS_WK = 4,\n\tP2P_AP_P2P_CH_SWITCH_PROCESS_WK =5,\n\tP2P_RO_CH_WK = 6,\n};\n\n#ifdef CONFIG_P2P_PS\nenum P2P_PS_STATE\n{\n\tP2P_PS_DISABLE = 0,\n\tP2P_PS_ENABLE = 1,\n\tP2P_PS_SCAN = 2,\n\tP2P_PS_SCAN_DONE = 3,\n\tP2P_PS_ALLSTASLEEP = 4, // for P2P GO\n};\n\nenum P2P_PS_MODE\n{\n\tP2P_PS_NONE = 0,\n\tP2P_PS_CTWINDOW = 1,\n\tP2P_PS_NOA\t = 2,\n\tP2P_PS_MIX = 3, // CTWindow and NoA\n};\n#endif // CONFIG_P2P_PS\n\n//\t=====================WFD Section=====================\n//\tFor Wi-Fi Display\n#define\tWFD_ATTR_DEVICE_INFO\t\t\t0x00\n#define\tWFD_ATTR_ASSOC_BSSID\t\t\t0x01\n#define\tWFD_ATTR_COUPLED_SINK_INFO\t0x06\n#define\tWFD_ATTR_LOCAL_IP_ADDR\t\t0x08\n#define\tWFD_ATTR_SESSION_INFO\t\t0x09\n#define\tWFD_ATTR_ALTER_MAC\t\t\t0x0a\n\n//\tFor WFD Device Information Attribute\n#define\tWFD_DEVINFO_SOURCE\t\t\t\t\t0x0000\n#define\tWFD_DEVINFO_PSINK\t\t\t\t\t0x0001\n#define\tWFD_DEVINFO_SSINK\t\t\t\t\t0x0002\n#define\tWFD_DEVINFO_DUAL \t\t\t\t\t0x0003\n\n#define\tWFD_DEVINFO_SESSION_AVAIL\t\t\t0x0010\n#define\tWFD_DEVINFO_WSD\t\t\t\t\t\t0x0040\n#define\tWFD_DEVINFO_PC_TDLS\t\t\t\t\t0x0080\n#define\tWFD_DEVINFO_HDCP_SUPPORT\t\t\t0x0100\n\n#ifdef  CONFIG_TX_MCAST2UNI\n#define IP_MCAST_MAC(mac)\t\t((mac[0]==0x01)&&(mac[1]==0x00)&&(mac[2]==0x5e))\n#define ICMPV6_MCAST_MAC(mac)\t((mac[0]==0x33)&&(mac[1]==0x33)&&(mac[2]!=0xff))\n#endif\t// CONFIG_TX_MCAST2UNI\n\n#ifdef CONFIG_IOCTL_CFG80211\n/* Regulatroy Domain */\nstruct regd_pair_mapping {\n\tu16 reg_dmnenum;\n\tu16 reg_5ghz_ctl;\n\tu16 reg_2ghz_ctl;\n};\n\nstruct rtw_regulatory {\n\tchar alpha2[2];\n\tu16 country_code;\n\tu16 max_power_level;\n\tu32 tp_scale;\n\tu16 current_rd;\n\tu16 current_rd_ext;\n\tint16_t power_limit;\n\tstruct regd_pair_mapping *regpair;\n};\n#endif\n\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef IW_AUTH_WAPI_VERSION_1\n#define IW_AUTH_WAPI_VERSION_1\t\t0x00000008\n#endif\n#ifndef IW_AUTH_KEY_MGMT_WAPI_PSK\n#define IW_AUTH_KEY_MGMT_WAPI_PSK\t0x04\n#endif\n#ifndef IW_AUTH_WAPI_ENABLED\n#define IW_AUTH_WAPI_ENABLED\t\t0x20\n#endif\n#ifndef IW_ENCODE_ALG_SM4\n#define IW_ENCODE_ALG_SM4\t\t\t0x20\n#endif\n#endif\n\n#endif // _WIFI_H_\n\n"
  },
  {
    "path": "include/wlan_bssdef.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __WLAN_BSSDEF_H__\n#define __WLAN_BSSDEF_H__\n\n\n#define MAX_IE_SZ\t768\n\n\n#ifdef PLATFORM_LINUX\n\n#define NDIS_802_11_LENGTH_SSID         32\n#define NDIS_802_11_LENGTH_RATES        8\n#define NDIS_802_11_LENGTH_RATES_EX     16\n\ntypedef unsigned char   NDIS_802_11_MAC_ADDRESS[6];\ntypedef long    \t\tNDIS_802_11_RSSI;           // in dBm\ntypedef unsigned char   NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];        // Set of 8 data rates\ntypedef unsigned char   NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];  // Set of 16 data rates\n\n\ntypedef  ULONG  NDIS_802_11_KEY_INDEX;\ntypedef unsigned long long NDIS_802_11_KEY_RSC;\n\n\ntypedef struct _NDIS_802_11_SSID\n{\n  ULONG  SsidLength;\n  UCHAR  Ssid[32];\n} NDIS_802_11_SSID, *PNDIS_802_11_SSID;\n\ntypedef enum _NDIS_802_11_NETWORK_TYPE\n{\n    Ndis802_11FH,\n    Ndis802_11DS,\n    Ndis802_11OFDM5,\n    Ndis802_11OFDM24,\n    Ndis802_11NetworkTypeMax    // not a real type, defined as an upper bound\n} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;\n\ntypedef struct _NDIS_802_11_CONFIGURATION_FH\n{\n    ULONG           Length;             // Length of structure\n    ULONG           HopPattern;         // As defined by 802.11, MSB set\n    ULONG           HopSet;             // to one if non-802.11\n    ULONG           DwellTime;          // units are Kusec\n} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;\n \n\n/*\n\tFW will only save the channel number in DSConfig.\n\tODI Handler will convert the channel number to freq. number.\t\n*/\ntypedef struct _NDIS_802_11_CONFIGURATION\n{\n    ULONG           Length;             // Length of structure\n    ULONG           BeaconPeriod;       // units are Kusec\n    ULONG           ATIMWindow;         // units are Kusec\n\tULONG           DSConfig;           /* channel number */\n    NDIS_802_11_CONFIGURATION_FH    FHConfig;\n} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;\n\n\n\ntypedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE\n{\n    Ndis802_11IBSS,\n    Ndis802_11Infrastructure,\n    Ndis802_11AutoUnknown,\n    Ndis802_11InfrastructureMax,     // Not a real value, defined as upper bound\n\tNdis802_11APMode,\n\tNdis802_11Monitor,\n} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;\n\n\n\n\n\ntypedef struct _NDIS_802_11_FIXED_IEs\n{\n  UCHAR  Timestamp[8];\n  USHORT  BeaconInterval;\n  USHORT  Capabilities;\n} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;\n\n\n\ntypedef struct _NDIS_802_11_VARIABLE_IEs\n{\n  UCHAR  ElementID;\n  UCHAR  Length;\n  UCHAR  data[1];\n} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs;\n\n\n\n/*\n\n\n\nLength is the 4 bytes multiples of the sume of\n\tsizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG)\n+   sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION)\n+   sizeof (NDIS_802_11_RATES_EX) + IELength\n\nExcept the IELength, all other fields are fixed length. Therefore, we can define a marco to present the\npartial sum.\n\n*/\n#if 0\ntypedef struct _NDIS_WLAN_BSSID_EX\n{\n  ULONG  Length;\n  NDIS_802_11_MAC_ADDRESS  MacAddress;\n  UCHAR  Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity;\n  NDIS_802_11_SSID  Ssid;\n  ULONG  Privacy;\n  NDIS_802_11_RSSI  Rssi;\n  NDIS_802_11_NETWORK_TYPE  NetworkTypeInUse;\n  NDIS_802_11_CONFIGURATION  Configuration;\n  NDIS_802_11_NETWORK_INFRASTRUCTURE  InfrastructureMode;\n  NDIS_802_11_RATES_EX  SupportedRates;\n  ULONG  IELength;\n  UCHAR  IEs[MAX_IE_SZ];\t//(timestamp, beacon interval, and capability information)\n} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;\n\n\ntypedef struct _NDIS_802_11_BSSID_LIST_EX\n{\n  ULONG  NumberOfItems;\n  NDIS_WLAN_BSSID_EX  Bssid[1];\n} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;\n#endif\n\ntypedef enum _NDIS_802_11_AUTHENTICATION_MODE\n{\n    Ndis802_11AuthModeOpen,\n    Ndis802_11AuthModeShared,\n    Ndis802_11AuthModeAutoSwitch,\n    Ndis802_11AuthModeWPA,\n    Ndis802_11AuthModeWPAPSK,\n    Ndis802_11AuthModeWPANone,\n    Ndis802_11AuthModeWAPI,\n    Ndis802_11AuthModeMax               // Not a real mode, defined as upper bound\n} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;\n\ntypedef enum _NDIS_802_11_WEP_STATUS\n{\n    Ndis802_11WEPEnabled,\n    Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,\n    Ndis802_11WEPDisabled,\n    Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,\n    Ndis802_11WEPKeyAbsent,\n    Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,\n    Ndis802_11WEPNotSupported,\n    Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,\n    Ndis802_11Encryption2Enabled,\n    Ndis802_11Encryption2KeyAbsent,\n    Ndis802_11Encryption3Enabled,\n    Ndis802_11Encryption3KeyAbsent,\n    Ndis802_11_EncrypteionWAPI\n} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,\n  NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;\n\n\n#define NDIS_802_11_AI_REQFI_CAPABILITIES      1\n#define NDIS_802_11_AI_REQFI_LISTENINTERVAL    2\n#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS  4\n\n#define NDIS_802_11_AI_RESFI_CAPABILITIES      1\n#define NDIS_802_11_AI_RESFI_STATUSCODE        2\n#define NDIS_802_11_AI_RESFI_ASSOCIATIONID     4\n\ntypedef struct _NDIS_802_11_AI_REQFI\n{\n    USHORT Capabilities;\n    USHORT ListenInterval;\n    NDIS_802_11_MAC_ADDRESS  CurrentAPAddress;\n} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;\n\ntypedef struct _NDIS_802_11_AI_RESFI\n{\n    USHORT Capabilities;\n    USHORT StatusCode;\n    USHORT AssociationId;\n} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;\n\ntypedef struct _NDIS_802_11_ASSOCIATION_INFORMATION\n{\n    ULONG                   Length;\n    USHORT                  AvailableRequestFixedIEs;\n    NDIS_802_11_AI_REQFI    RequestFixedIEs;\n    ULONG                   RequestIELength;\n    ULONG                   OffsetRequestIEs;\n    USHORT                  AvailableResponseFixedIEs;\n    NDIS_802_11_AI_RESFI    ResponseFixedIEs;\n    ULONG                   ResponseIELength;\n    ULONG                   OffsetResponseIEs;\n} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;\n\ntypedef enum _NDIS_802_11_RELOAD_DEFAULTS\n{\n   Ndis802_11ReloadWEPKeys\n} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;\n\n\n// Key mapping keys require a BSSID\ntypedef struct _NDIS_802_11_KEY\n{\n    ULONG           Length;             // Length of this structure\n    ULONG           KeyIndex;           \n    ULONG           KeyLength;          // length of key in bytes\n    NDIS_802_11_MAC_ADDRESS BSSID;\n    NDIS_802_11_KEY_RSC KeyRSC;\n    UCHAR           KeyMaterial[32];     // variable length depending on above field\n} NDIS_802_11_KEY, *PNDIS_802_11_KEY;\n\ntypedef struct _NDIS_802_11_REMOVE_KEY\n{\n    ULONG                   Length;        // Length of this structure\n    ULONG                   KeyIndex;           \n    NDIS_802_11_MAC_ADDRESS BSSID;      \n} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;\n\ntypedef struct _NDIS_802_11_WEP\n{\n    ULONG     Length;        // Length of this structure\n    ULONG     KeyIndex;      // 0 is the per-client key, 1-N are the global keys\n    ULONG     KeyLength;     // length of key in bytes\n    UCHAR     KeyMaterial[16];// variable length depending on above field\n} NDIS_802_11_WEP, *PNDIS_802_11_WEP;\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_REQUEST\n{\n    ULONG Length;            // Length of structure\n    NDIS_802_11_MAC_ADDRESS Bssid;\n    ULONG Flags;\n} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST;\n\ntypedef enum _NDIS_802_11_STATUS_TYPE\n{\n\tNdis802_11StatusType_Authentication,\n\tNdis802_11StatusType_MediaStreamMode,\n\tNdis802_11StatusType_PMKID_CandidateList,\t\t\n\tNdis802_11StatusTypeMax    // not a real type, defined as an upper bound\n} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;\n\ntypedef struct _NDIS_802_11_STATUS_INDICATION\n{\n    NDIS_802_11_STATUS_TYPE StatusType;\n} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION;\n\n// mask for authentication/integrity fields\n#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS        0x0f\n#define NDIS_802_11_AUTH_REQUEST_REAUTH\t\t\t0x01\n#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE\t\t0x02\n#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR\t\t0x06\n#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR\t\t0x0E\n\n// MIC check time, 60 seconds.\n#define MIC_CHECK_TIME\t60000000\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_EVENT\n{\n    NDIS_802_11_STATUS_INDICATION       Status;\n    NDIS_802_11_AUTHENTICATION_REQUEST  Request[1];\n} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;\n        \ntypedef struct _NDIS_802_11_TEST\n{\n    ULONG Length;\n    ULONG Type;\n    union\n    {\n        NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;\n        NDIS_802_11_RSSI RssiTrigger;\n    }tt;\n} NDIS_802_11_TEST, *PNDIS_802_11_TEST;\n\n\n#endif //end of #ifdef PLATFORM_LINUX\n\n#ifdef PLATFORM_FREEBSD\n\n#define NDIS_802_11_LENGTH_SSID         32\n#define NDIS_802_11_LENGTH_RATES        8\n#define NDIS_802_11_LENGTH_RATES_EX     16\n\ntypedef unsigned char   NDIS_802_11_MAC_ADDRESS[6];\ntypedef long    \t\tNDIS_802_11_RSSI;           // in dBm\ntypedef unsigned char   NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];        // Set of 8 data rates\ntypedef unsigned char   NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];  // Set of 16 data rates\n\n\ntypedef  ULONG  NDIS_802_11_KEY_INDEX;\ntypedef unsigned long long NDIS_802_11_KEY_RSC;\n\n\ntypedef struct _NDIS_802_11_SSID\n{\n  ULONG  SsidLength;\n  UCHAR  Ssid[32];\n} NDIS_802_11_SSID, *PNDIS_802_11_SSID;\n\ntypedef enum _NDIS_802_11_NETWORK_TYPE\n{\n    Ndis802_11FH,\n    Ndis802_11DS,\n    Ndis802_11OFDM5,\n    Ndis802_11OFDM24,\n    Ndis802_11NetworkTypeMax    // not a real type, defined as an upper bound\n} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;\n\ntypedef struct _NDIS_802_11_CONFIGURATION_FH\n{\n    ULONG           Length;             // Length of structure\n    ULONG           HopPattern;         // As defined by 802.11, MSB set\n    ULONG           HopSet;             // to one if non-802.11\n    ULONG           DwellTime;          // units are Kusec\n} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;\n \n\n/*\n\tFW will only save the channel number in DSConfig.\n\tODI Handler will convert the channel number to freq. number.\t\n*/\ntypedef struct _NDIS_802_11_CONFIGURATION\n{\n    ULONG           Length;             // Length of structure\n    ULONG           BeaconPeriod;       // units are Kusec\n    ULONG           ATIMWindow;         // units are Kusec\n\tULONG           DSConfig;           /* channel number */ \n    NDIS_802_11_CONFIGURATION_FH    FHConfig;\n} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;\n\n\n\ntypedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE\n{\n    Ndis802_11IBSS,\n    Ndis802_11Infrastructure,\n    Ndis802_11AutoUnknown,\n    Ndis802_11InfrastructureMax,     // Not a real value, defined as upper bound\n    Ndis802_11APMode\n} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;\n\n\n\n\n\ntypedef struct _NDIS_802_11_FIXED_IEs\n{\n  UCHAR  Timestamp[8];\n  USHORT  BeaconInterval;\n  USHORT  Capabilities;\n} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;\n\n\n\ntypedef struct _NDIS_802_11_VARIABLE_IEs\n{\n  UCHAR  ElementID;\n  UCHAR  Length;\n  UCHAR  data[1];\n} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs;\n\n\n\n/*\n\n\n\nLength is the 4 bytes multiples of the sume of\n\tsizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG)\n+   sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION)\n+   sizeof (NDIS_802_11_RATES_EX) + IELength\n\nExcept the IELength, all other fields are fixed length. Therefore, we can define a marco to present the\npartial sum.\n\n*/\n#if 0\ntypedef struct _NDIS_WLAN_BSSID_EX\n{\n  ULONG  Length;\n  NDIS_802_11_MAC_ADDRESS  MacAddress;\n  UCHAR  Reserved[2];//[0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity;\n  NDIS_802_11_SSID  Ssid;\n  ULONG  Privacy;\n  NDIS_802_11_RSSI  Rssi;\n  NDIS_802_11_NETWORK_TYPE  NetworkTypeInUse;\n  NDIS_802_11_CONFIGURATION  Configuration;\n  NDIS_802_11_NETWORK_INFRASTRUCTURE  InfrastructureMode;\n  NDIS_802_11_RATES_EX  SupportedRates;\n  ULONG  IELength;\n  UCHAR  IEs[MAX_IE_SZ];\t//(timestamp, beacon interval, and capability information)\n} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;\n\n\ntypedef struct _NDIS_802_11_BSSID_LIST_EX\n{\n  ULONG  NumberOfItems;\n  NDIS_WLAN_BSSID_EX  Bssid[1];\n} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;\n#endif\n\ntypedef enum _NDIS_802_11_AUTHENTICATION_MODE\n{\n    Ndis802_11AuthModeOpen,\n    Ndis802_11AuthModeShared,\n    Ndis802_11AuthModeAutoSwitch,\n    Ndis802_11AuthModeWPA,\n    Ndis802_11AuthModeWPAPSK,\n    Ndis802_11AuthModeWPANone,\n    Ndis802_11AuthModeMax               // Not a real mode, defined as upper bound\n} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;\n\ntypedef enum _NDIS_802_11_WEP_STATUS\n{\n    Ndis802_11WEPEnabled,\n    Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,\n    Ndis802_11WEPDisabled,\n    Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,\n    Ndis802_11WEPKeyAbsent,\n    Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,\n    Ndis802_11WEPNotSupported,\n    Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,\n    Ndis802_11Encryption2Enabled,\n    Ndis802_11Encryption2KeyAbsent,\n    Ndis802_11Encryption3Enabled,\n    Ndis802_11Encryption3KeyAbsent\n} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,\n  NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;\n\n\n#define NDIS_802_11_AI_REQFI_CAPABILITIES      1\n#define NDIS_802_11_AI_REQFI_LISTENINTERVAL    2\n#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS  4\n\n#define NDIS_802_11_AI_RESFI_CAPABILITIES      1\n#define NDIS_802_11_AI_RESFI_STATUSCODE        2\n#define NDIS_802_11_AI_RESFI_ASSOCIATIONID     4\n\ntypedef struct _NDIS_802_11_AI_REQFI\n{\n    USHORT Capabilities;\n    USHORT ListenInterval;\n    NDIS_802_11_MAC_ADDRESS  CurrentAPAddress;\n} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;\n\ntypedef struct _NDIS_802_11_AI_RESFI\n{\n    USHORT Capabilities;\n    USHORT StatusCode;\n    USHORT AssociationId;\n} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;\n\ntypedef struct _NDIS_802_11_ASSOCIATION_INFORMATION\n{\n    ULONG                   Length;\n    USHORT                  AvailableRequestFixedIEs;\n    NDIS_802_11_AI_REQFI    RequestFixedIEs;\n    ULONG                   RequestIELength;\n    ULONG                   OffsetRequestIEs;\n    USHORT                  AvailableResponseFixedIEs;\n    NDIS_802_11_AI_RESFI    ResponseFixedIEs;\n    ULONG                   ResponseIELength;\n    ULONG                   OffsetResponseIEs;\n} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;\n\ntypedef enum _NDIS_802_11_RELOAD_DEFAULTS\n{\n   Ndis802_11ReloadWEPKeys\n} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;\n\n\n// Key mapping keys require a BSSID\ntypedef struct _NDIS_802_11_KEY\n{\n    ULONG           Length;             // Length of this structure\n    ULONG           KeyIndex;           \n    ULONG           KeyLength;          // length of key in bytes\n    NDIS_802_11_MAC_ADDRESS BSSID;\n    NDIS_802_11_KEY_RSC KeyRSC;\n    UCHAR           KeyMaterial[32];     // variable length depending on above field\n} NDIS_802_11_KEY, *PNDIS_802_11_KEY;\n\ntypedef struct _NDIS_802_11_REMOVE_KEY\n{\n    ULONG                   Length;        // Length of this structure\n    ULONG                   KeyIndex;           \n    NDIS_802_11_MAC_ADDRESS BSSID;      \n} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;\n\ntypedef struct _NDIS_802_11_WEP\n{\n    ULONG     Length;        // Length of this structure\n    ULONG     KeyIndex;      // 0 is the per-client key, 1-N are the global keys\n    ULONG     KeyLength;     // length of key in bytes\n    UCHAR     KeyMaterial[16];// variable length depending on above field\n} NDIS_802_11_WEP, *PNDIS_802_11_WEP;\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_REQUEST\n{\n    ULONG Length;            // Length of structure\n    NDIS_802_11_MAC_ADDRESS Bssid;\n    ULONG Flags;\n} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST;\n\ntypedef enum _NDIS_802_11_STATUS_TYPE\n{\n\tNdis802_11StatusType_Authentication,\n\tNdis802_11StatusType_MediaStreamMode,\n\tNdis802_11StatusType_PMKID_CandidateList,\t\t\n\tNdis802_11StatusTypeMax    // not a real type, defined as an upper bound\n} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE;\n\ntypedef struct _NDIS_802_11_STATUS_INDICATION\n{\n    NDIS_802_11_STATUS_TYPE StatusType;\n} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION;\n\n// mask for authentication/integrity fields\n#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS        0x0f\n#define NDIS_802_11_AUTH_REQUEST_REAUTH\t\t\t0x01\n#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE\t\t0x02\n#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR\t\t0x06\n#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR\t\t0x0E\n\n// MIC check time, 60 seconds.\n#define MIC_CHECK_TIME\t60000000\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_EVENT\n{\n    NDIS_802_11_STATUS_INDICATION       Status;\n    NDIS_802_11_AUTHENTICATION_REQUEST  Request[1];\n} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;\n        \ntypedef struct _NDIS_802_11_TEST\n{\n    ULONG Length;\n    ULONG Type;\n    union\n    {\n        NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;\n        NDIS_802_11_RSSI RssiTrigger;\n    }tt;\n} NDIS_802_11_TEST, *PNDIS_802_11_TEST;\n\n\n#endif //PLATFORM_FREEBSD\n#ifndef Ndis802_11APMode\n#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1)\n#endif\n\ntypedef struct _WLAN_PHY_INFO\n{\n\tu8\tSignalStrength;//(in percentage)\n  \tu8\tSignalQuality;//(in percentage)\n  \tu8\tOptimum_antenna;  //for Antenna diversity\n  \tu8  \tReserved_0;\n}WLAN_PHY_INFO,*PWLAN_PHY_INFO;\n\ntypedef struct _WLAN_BCN_INFO\n{\n\t/* these infor get from rtw_get_encrypt_info when\n\t * \t * translate scan to UI */\n\tu8 encryp_protocol;//ENCRYP_PROTOCOL_E: OPEN/WEP/WPA/WPA2/WAPI\n\tint group_cipher; //WPA/WPA2 group cipher\n\tint pairwise_cipher;////WPA/WPA2/WEP pairwise cipher\n\tint is_8021x;\n\n\t/* bwmode 20/40 and ch_offset UP/LOW */\n\tunsigned short \tht_cap_info;\n\tunsigned char\tht_info_infos_0;\n}WLAN_BCN_INFO,*PWLAN_BCN_INFO;\n\n/* temporally add #pragma pack for structure alignment issue of\n*   WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz()\n*/\n#ifdef PLATFORM_WINDOWS\n#pragma pack(push)\n#pragma pack(1)\n#endif\ntypedef struct _WLAN_BSSID_EX\n{\n  ULONG  Length;\n  NDIS_802_11_MAC_ADDRESS  MacAddress;\n  UCHAR  Reserved[2];//[0]: IS beacon frame\n  NDIS_802_11_SSID  Ssid;\n  ULONG  Privacy;\n  NDIS_802_11_RSSI  Rssi;//(in dBM,raw data ,get from PHY)\n  NDIS_802_11_NETWORK_TYPE  NetworkTypeInUse;\n  NDIS_802_11_CONFIGURATION  Configuration;\n  NDIS_802_11_NETWORK_INFRASTRUCTURE  InfrastructureMode;\n  NDIS_802_11_RATES_EX  SupportedRates;\n  WLAN_PHY_INFO\tPhyInfo;\n  ULONG  IELength;\n  UCHAR  IEs[MAX_IE_SZ];\t//(timestamp, beacon interval, and capability information)\n} \n#ifndef PLATFORM_WINDOWS\n__attribute__((packed))\n#endif\nWLAN_BSSID_EX, *PWLAN_BSSID_EX;\n#ifdef PLATFORM_WINDOWS\n#pragma pack(pop)\n#endif\n\n__inline  static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss)\n{\n#if 0\n\tuint t_len;\n\t\n\tt_len = sizeof (ULONG) \n\t\t+ sizeof (NDIS_802_11_MAC_ADDRESS) \n\t\t+ 2 \n\t\t+ sizeof (NDIS_802_11_SSID) \n\t\t+ sizeof (ULONG) \n\t\t+ sizeof (NDIS_802_11_RSSI) \n\t\t+ sizeof (NDIS_802_11_NETWORK_TYPE)\n\t\t+ sizeof (NDIS_802_11_CONFIGURATION)\n\t\t+ sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE)\n\t\t+ sizeof (NDIS_802_11_RATES_EX)\n\t\t//all new member add here\n\t\t+ sizeof(WLAN_PHY_INFO)\n\t\t//all new member add here\n\t\t+ sizeof (ULONG)\n\t\t+ bss->IELength;\t\n\treturn t_len;\n#else\n\treturn (sizeof(WLAN_BSSID_EX) -MAX_IE_SZ + bss->IELength);\n#endif\n}\n\nstruct\twlan_network {\n\t_list\tlist;\t\n\tint\tnetwork_type;\t//refer to ieee80211.h for WIRELESS_11A/B/G\n\tint\tfixed;\t\t\t// set to fixed when not to be removed as site-surveying\n\tunsigned long\tlast_scanned; //timestamp for the network\n\tint\taid;\t\t\t//will only be valid when a BSS is joinned.\n\tint\tjoin_res;\n\tWLAN_BSSID_EX\tnetwork; //must be the last item\n\tWLAN_BCN_INFO\tBcnInfo;\n#ifdef PLATFORM_WINDOWS\t\n\tunsigned char  iebuf[MAX_IE_SZ];\n#endif\n\n};\n\nenum VRTL_CARRIER_SENSE\n{\n    DISABLE_VCS,\t\n    ENABLE_VCS,\t\n    AUTO_VCS\n};\n\nenum VCS_TYPE\n{\n    NONE_VCS,\t\n    RTS_CTS,\n    CTS_TO_SELF \n};\n\n\n\n\n#define PWR_CAM 0\n#define PWR_MINPS 1\n#define PWR_MAXPS 2\n#define PWR_UAPSD 3\n#define PWR_VOIP 4\n\n\nenum UAPSD_MAX_SP\n{\n\tNO_LIMIT,\n       TWO_MSDU,\n       FOUR_MSDU,\n       SIX_MSDU\n};\n\n\n//john\n#define NUM_PRE_AUTH_KEY 16\n#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY\n\n/*\n* \tWPA2\n*/\n\n#ifndef PLATFORM_OS_CE\ntypedef struct _PMKID_CANDIDATE {\n    NDIS_802_11_MAC_ADDRESS BSSID;\n    ULONG Flags;\n} PMKID_CANDIDATE, *PPMKID_CANDIDATE;\n\ntypedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST\n{\n    ULONG Version;       // Version of the structure\n    ULONG NumCandidates; // No. of pmkid candidates\n    PMKID_CANDIDATE CandidateList[1];\n} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST;\n\n\ntypedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION\n{\n\tNDIS_802_11_AUTHENTICATION_MODE AuthModeSupported;\n\tNDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported;\n\t\n} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION;\n\ntypedef struct _NDIS_802_11_CAPABILITY \n{\n\tULONG  Length;\n\tULONG  Version;\n\tULONG  NoOfPMKIDs;\n\tULONG  NoOfAuthEncryptPairsSupported;\n\tNDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];\n\t\n} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;\n#endif\n\n\n#endif //#ifndef WLAN_BSSDEF_H_\n\n"
  },
  {
    "path": "include/xmit_osdep.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __XMIT_OSDEP_H_\n#define __XMIT_OSDEP_H_\n\n\nstruct pkt_file {\n\t_pkt *pkt;\n\tSIZE_T pkt_len;\t //the remainder length of the open_file\n\t_buffer *cur_buffer;\n\tu8 *buf_start;\n\tu8 *cur_addr;\n\tSIZE_T buf_len;\n};\n\n#ifdef PLATFORM_WINDOWS\n\n#ifdef PLATFORM_OS_XP\n#ifdef CONFIG_USB_HCI\n#include <usb.h>\n#include <usbdlib.h>\n#include <usbioctl.h>\n#endif\n#endif\n\n#ifdef CONFIG_GSPI_HCI\n#define NR_XMITFRAME     64\n#else\n#define NR_XMITFRAME     128\n#endif\n\n#define ETH_ALEN\t6\n\nextern NDIS_STATUS rtw_xmit_entry(\nIN _nic_hdl\t\tcnxt,\nIN NDIS_PACKET\t\t*pkt,\nIN UINT\t\t\t\tflags\n);\n\n#endif\n\n#ifdef PLATFORM_FREEBSD\n#define NR_XMITFRAME\t256\nextern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);\nextern void rtw_xmit_entry_wrap (struct ifnet * pifp);\n#endif //PLATFORM_FREEBSD\n\n#ifdef PLATFORM_LINUX\n\n#define NR_XMITFRAME\t256\n\nstruct xmit_priv;\nstruct pkt_attrib;\nstruct sta_xmit_priv;\nstruct xmit_frame;\nstruct xmit_buf;\n\nextern int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);\nextern int rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev);\n\n#endif\n\nvoid rtw_os_xmit_schedule(_adapter *padapter);\n\nint rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz, u8 flag);\nvoid rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf, u32 free_sz, u8 flag);\n\nextern void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib);\n\nextern uint rtw_remainder_len(struct pkt_file *pfile);\nextern void _rtw_open_pktfile(_pkt *pkt, struct pkt_file *pfile);\nextern uint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen);\nextern sint rtw_endofpktfile (struct pkt_file *pfile);\n\nextern void rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt);\nextern void rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe);\n\nvoid rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed);\n\nvoid dump_os_queue(void *sel, _adapter *padapter);\n\n#endif //__XMIT_OSDEP_H_\n\n"
  },
  {
    "path": "os_dep/linux/custom_gpio_linux.c",
    "content": "/******************************************************************************\n * Customer code to add GPIO control during WLAN start/stop\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include \"drv_types.h\"\n\n#ifdef CONFIG_PLATFORM_SPRD\n\n//gspi func & GPIO define\n#include <mach/gpio.h>//0915\n#include <mach/board.h>\n\n#if !(defined ANDROID_2X)\n\n#ifdef CONFIG_RTL8188E\n#include <mach/regulator.h>\n#include <linux/regulator/consumer.h>\n#endif // CONFIG_RTL8188E\n\n#ifndef GPIO_WIFI_POWER\n#define GPIO_WIFI_POWER -1\n#endif // !GPIO_WIFI_POWER\n\n#ifndef GPIO_WIFI_RESET\n#define GPIO_WIFI_RESET -1\n#endif // !GPIO_WIFI_RESET\n\n#ifndef GPIO_WIFI_PWDN\n#define GPIO_WIFI_PWDN -1\n#endif // !GPIO_WIFI_RESET\n#ifdef CONFIG_GSPI_HCI\nextern unsigned int oob_irq;\n#endif // CONFIG_GSPI_HCI\n\n#ifdef CONFIG_SDIO_HCI\nextern int rtw_mp_mode;\n#else // !CONFIG_SDIO_HCI\n#endif // !CONFIG_SDIO_HCI\n\nint rtw_wifi_gpio_init(void)\n{\n#ifdef CONFIG_GSPI_HCI\n\tif (GPIO_WIFI_IRQ > 0) {\n\t\tgpio_request(GPIO_WIFI_IRQ, \"oob_irq\");\n\t\tgpio_direction_input(GPIO_WIFI_IRQ);\n\n\t\toob_irq = gpio_to_irq(GPIO_WIFI_IRQ);\n\n\t\tDBG_8192C(\"%s oob_irq:%d\\n\", __func__, oob_irq);\n\t}\n#endif\n\tif (GPIO_WIFI_RESET > 0)\n\t\tgpio_request(GPIO_WIFI_RESET , \"wifi_rst\");\n\tif (GPIO_WIFI_POWER > 0)\n\t\tgpio_request(GPIO_WIFI_POWER, \"wifi_power\");\n\n#ifdef CONFIG_SDIO_HCI\n#if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) \n\tif(rtw_mp_mode==1){\n\t\tDBG_871X(\"%s GPIO_BT_RESET pin special for mp_test\\n\", __func__);\t\n\t\tif (GPIO_BT_RESET > 0)\n\t\t\tgpio_request(GPIO_BT_RESET , \"bt_rst\");\n\t}\n#endif\n#endif\n\treturn 0;\n}\n\nint rtw_wifi_gpio_deinit(void)\n{\n#ifdef CONFIG_GSPI_HCI\n\tif (GPIO_WIFI_IRQ > 0)\n\t\tgpio_free(GPIO_WIFI_IRQ);\n#endif\n\tif (GPIO_WIFI_RESET > 0)\n\t\tgpio_free(GPIO_WIFI_RESET );\n\tif (GPIO_WIFI_POWER > 0)\n\t\tgpio_free(GPIO_WIFI_POWER);\n\n#ifdef CONFIG_SDIO_HCI\n#if ( defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) \n\tif(rtw_mp_mode==1){\n\t\tDBG_871X(\"%s GPIO_BT_RESET pin special for mp_test\\n\", __func__);\n\t\tif (GPIO_BT_RESET > 0)\n\t\t\tgpio_free(GPIO_BT_RESET);\n\t}\n#endif\n#endif\n\treturn 0;\n}\n\n/* Customer function to control hw specific wlan gpios */\nvoid rtw_wifi_gpio_wlan_ctrl(int onoff)\n{\n\tswitch (onoff)\n\t{\n\t\tcase WLAN_PWDN_OFF:\n\t\t\tDBG_8192C(\"%s: call customer specific GPIO(%d) to set wifi power down pin to 0\\n\",\n\t\t\t\t__FUNCTION__, GPIO_WIFI_RESET);\n\n#ifndef CONFIG_DONT_BUS_SCAN\n\t\t\tif (GPIO_WIFI_RESET > 0)\n\t\t\t\tgpio_direction_output(GPIO_WIFI_RESET , 0);\n#endif\n\t\tbreak;\n\n\t\tcase WLAN_PWDN_ON:\n\t\t\tDBG_8192C(\"%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\\n\",\n\t\t\t\t__FUNCTION__, GPIO_WIFI_RESET);\n\n\t\t\tif (GPIO_WIFI_RESET > 0)\n\t\t\t\tgpio_direction_output(GPIO_WIFI_RESET , 1);\n\t\tbreak;\n\n\t\tcase WLAN_POWER_OFF:\n\t\tbreak;\n\n\t\tcase WLAN_POWER_ON:\n\t\tbreak;\n#ifdef CONFIG_SDIO_HCI\n#if ( defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1) \n\t\tcase WLAN_BT_PWDN_OFF:\n\t\tif(rtw_mp_mode==1)\n\t\t{\n\t\t\tDBG_871X(\"%s: call customer specific GPIO to set wifi power down pin to 0\\n\",\n\t\t\t\t       \t__FUNCTION__);\n\t\t\tif (GPIO_BT_RESET > 0)\n\t\t\t\tgpio_direction_output(GPIO_BT_RESET , 0);\n\t\t}\n\t\tbreak;\n\n\t\tcase WLAN_BT_PWDN_ON:\n\t\tif(rtw_mp_mode==1)\n\t\t{\n\t\t\tDBG_871X(\"%s: callc customer specific GPIO to set wifi power down pin to 1 %x\\n\",\n\t\t\t\t\t__FUNCTION__, GPIO_BT_RESET);\n\n\t\t\tif (GPIO_BT_RESET > 0)\n\t\t\t\tgpio_direction_output(GPIO_BT_RESET , 1);\n\t\t}\n\t\tbreak;\n#endif\n#endif\n\t}\n}\n\n#else //ANDROID_2X\n\n#include <mach/ldo.h>\n\n#ifdef CONFIG_RTL8188E\nextern int sprd_3rdparty_gpio_wifi_power;\n#endif\nextern int sprd_3rdparty_gpio_wifi_pwd;\n#if  defined(CONFIG_RTL8723B)\nextern int sprd_3rdparty_gpio_bt_reset;\n#endif\n\nint rtw_wifi_gpio_init(void)\n{\n#if defined(CONFIG_RTL8723B)\n\tif (sprd_3rdparty_gpio_bt_reset > 0)\n\t\tgpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1);\n#endif\n\n\treturn 0;\n}\n\nint rtw_wifi_gpio_deinit(void)\n{\n\treturn 0;\n}\n\n/* Customer function to control hw specific wlan gpios */\nvoid rtw_wifi_gpio_wlan_ctrl(int onoff)\n{\n\tswitch (onoff)\n\t{\n\t\tcase WLAN_PWDN_OFF:\n\t\t\tDBG_8192C(\"%s: call customer specific GPIO to set wifi power down pin to 0\\n\",\n\t\t\t\t__FUNCTION__);\n\t\t\tif (sprd_3rdparty_gpio_wifi_pwd > 0)\n\t\t\t{\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 0);\n\t\t\t}\n\n\t\t\tif (sprd_3rdparty_gpio_wifi_pwd == 60) {\n\t\t\t\tDBG_8192C(\"%s: turn off VSIM2 2.8V\\n\", __func__);\n\t\t\t\tLDO_TurnOffLDO(LDO_LDO_SIM2);\n\t\t\t}\n\t\tbreak;\n\n\t\tcase WLAN_PWDN_ON:\n\t\t\tDBG_8192C(\"%s: callc customer specific GPIO to set wifi power down pin to 1\\n\",\n\t\t\t\t__FUNCTION__);\n\t\t\tif (sprd_3rdparty_gpio_wifi_pwd == 60) {\n\t\t\t\tDBG_8192C(\"%s: turn on VSIM2 2.8V\\n\", __func__);\n\t\t\t\tLDO_SetVoltLevel(LDO_LDO_SIM2, LDO_VOLT_LEVEL0);\n\t\t\t\tLDO_TurnOnLDO(LDO_LDO_SIM2);\n\t\t\t}\n\t\t\tif (sprd_3rdparty_gpio_wifi_pwd > 0)\n\t\t\t{\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 1);\n\t\t\t}\n\t\tbreak;\n\n\t\tcase WLAN_POWER_OFF:\n#ifdef CONFIG_RTL8188E\n#ifdef CONFIG_WIF1_LDO\n\t\t\tDBG_8192C(\"%s: turn off VDD-WIFI0 1.2V\\n\", __FUNCTION__);\n\t\t\tLDO_TurnOffLDO(LDO_LDO_WIF1);\n#endif //CONFIG_WIF1_LDO\n\n\t\t\tDBG_8192C(\"%s: turn off VDD-WIFI0 3.3V\\n\", __FUNCTION__);\n\t\t\tLDO_TurnOffLDO(LDO_LDO_WIF0);\n\n\t\t\tDBG_8192C(\"%s: call customer specific GPIO(%d) to turn off wifi power\\n\",\n\t\t\t\t__FUNCTION__, sprd_3rdparty_gpio_wifi_power);\n\t\t\tif (sprd_3rdparty_gpio_wifi_power != 65535)\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_wifi_power, 0);\n#endif\n\t\tbreak;\n\n\t\tcase WLAN_POWER_ON:\n#ifdef CONFIG_RTL8188E\n\t\t\tDBG_8192C(\"%s: call customer specific GPIO(%d) to turn on wifi power\\n\",\n\t\t\t\t__FUNCTION__, sprd_3rdparty_gpio_wifi_power);\n\t\t\tif (sprd_3rdparty_gpio_wifi_power != 65535)\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_wifi_power, 1);\n\n\t\t\tDBG_8192C(\"%s: turn on VDD-WIFI0 3.3V\\n\", __FUNCTION__);\n\t\t\tLDO_TurnOnLDO(LDO_LDO_WIF0);\n\t\t\tLDO_SetVoltLevel(LDO_LDO_WIF0,LDO_VOLT_LEVEL1);\n\n#ifdef CONFIG_WIF1_LDO\n\t\t\tDBG_8192C(\"%s: turn on VDD-WIFI1 1.2V\\n\", __func__);\n\t\t\tLDO_TurnOnLDO(LDO_LDO_WIF1);\n\t\t\tLDO_SetVoltLevel(LDO_LDO_WIF1,LDO_VOLT_LEVEL3);\n#endif //CONFIG_WIF1_LDO\n#endif\n\t\tbreak;\n\n\t\tcase WLAN_BT_PWDN_OFF:\n\t\t\tDBG_8192C(\"%s: call customer specific GPIO to set bt power down pin to 0\\n\",\n\t\t\t\t__FUNCTION__);\n#if defined(CONFIG_RTL8723B)\n\t\t\tif (sprd_3rdparty_gpio_bt_reset > 0)\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_bt_reset, 0);\n#endif\n\t\tbreak;\n\n\t\tcase WLAN_BT_PWDN_ON:\n\t\t\tDBG_8192C(\"%s: callc customer specific GPIO to set bt power down pin to 1\\n\",\n\t\t\t\t__FUNCTION__);\n#if defined(CONFIG_RTL8723B)\n\t\t\tif (sprd_3rdparty_gpio_bt_reset > 0)\n\t\t\t\tgpio_set_value(sprd_3rdparty_gpio_bt_reset, 1);\n#endif\n\t\tbreak;\n\t}\n}\n#endif //ANDROID_2X\n\n#elif defined(CONFIG_PLATFORM_ARM_RK3066) \n#include <mach/iomux.h>\n\n#define GPIO_WIFI_IRQ\t\tRK30_PIN2_PC2\nextern unsigned int oob_irq;\nint rtw_wifi_gpio_init(void)\n{\n#ifdef CONFIG_GSPI_HCI\n\tif (GPIO_WIFI_IRQ > 0) {\n\t\trk30_mux_api_set(GPIO2C2_LCDC1DATA18_SMCBLSN1_HSADCDATA5_NAME, GPIO2C_GPIO2C2);//jacky_test\n\t\tgpio_request(GPIO_WIFI_IRQ, \"oob_irq\");\n\t\tgpio_direction_input(GPIO_WIFI_IRQ);\n\n\t\toob_irq = gpio_to_irq(GPIO_WIFI_IRQ);\n\n\t\tDBG_8192C(\"%s oob_irq:%d\\n\", __func__, oob_irq);\n\t}\n#endif\n\treturn 0;\n}\n\n\nint rtw_wifi_gpio_deinit(void)\n{\n#ifdef CONFIG_GSPI_HCI\n\tif (GPIO_WIFI_IRQ > 0)\n\t\tgpio_free(GPIO_WIFI_IRQ);\n#endif\n\treturn 0;\n}\n\nvoid rtw_wifi_gpio_wlan_ctrl(int onoff)\n{\n}\n\n#ifdef CONFIG_GPIO_API\n//this is a demo for extending GPIO pin[7] as interrupt mode\nstruct net_device * rtl_net;\nextern int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level));\nextern int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num);\nvoid gpio_int(u8 is_high)\n{\n\tDBG_8192C(\"%s level=%d\\n\",__func__, is_high);\n}\nint register_net_gpio_init(void)\n{\n\trtl_net = dev_get_by_name(&init_net,\"wlan0\");\n\tif(!rtl_net)\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"rtl_net init fail!\\n\");\n\t\treturn -1;\n\t}\n\treturn rtw_register_gpio_interrupt(rtl_net,7, gpio_int);\n}\nint unregister_net_gpio_init(void)\n{\n\trtl_net = dev_get_by_name(&init_net,\"wlan0\");\n\tif(!rtl_net)\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"rtl_net init fail!\\n\");\n\t\treturn -1;\n\t}\n\treturn rtw_disable_gpio_interrupt(rtl_net,7);\n}\n#endif\n\n#else\n\nint rtw_wifi_gpio_init(void)\n{\n\treturn 0;\n}\n\nvoid rtw_wifi_gpio_wlan_ctrl(int onoff)\n{\n}\n#endif //CONFIG_PLATFORM_SPRD\n"
  },
  {
    "path": "os_dep/linux/ioctl_cfg80211.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define  _IOCTL_CFG80211_C_\n\n#include <drv_types.h>\n\n#ifdef CONFIG_IOCTL_CFG80211\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))\n#define STATION_INFO_SIGNAL\t\tBIT(NL80211_STA_INFO_SIGNAL)\n#define STATION_INFO_TX_BITRATE\t\tBIT(NL80211_STA_INFO_TX_BITRATE)\n#define STATION_INFO_RX_PACKETS\t\tBIT(NL80211_STA_INFO_RX_PACKETS)\n#define STATION_INFO_TX_PACKETS\t\tBIT(NL80211_STA_INFO_TX_PACKETS)\n#define STATION_INFO_ASSOC_REQ_IES\t0\n#endif /* Linux kernel >= 4.0.0 */\n\n#include <rtw_wifi_regd.h>\n\n#define RTW_MAX_MGMT_TX_CNT (8)\n#define RTW_MAX_MGMT_TX_MS_GAS (500)\n\n#define RTW_SCAN_IE_LEN_MAX      2304\n#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms\n#define RTW_MAX_NUM_PMKIDS 4\n\n#define RTW_CH_MAX_2G_CHANNEL               14      /* Max channel in 2G band */\n\n#ifdef CONFIG_WAPI_SUPPORT\n\n#ifndef WLAN_CIPHER_SUITE_SMS4\n#define WLAN_CIPHER_SUITE_SMS4          0x00147201\n#endif\n\n#ifndef WLAN_AKM_SUITE_WAPI_PSK\n#define WLAN_AKM_SUITE_WAPI_PSK         0x000FAC04\n#endif\n\n#ifndef WLAN_AKM_SUITE_WAPI_CERT\n#define WLAN_AKM_SUITE_WAPI_CERT        0x000FAC12\n#endif\n\n#ifndef NL80211_WAPI_VERSION_1\n#define NL80211_WAPI_VERSION_1          (1 << 2)\n#endif\n\n#endif\n\n#ifdef CONFIG_PLATFORM_ARM_SUN8I\n#define BUSY_TRAFFIC_SCAN_DENY_PERIOD\t8000\n#else\n#define BUSY_TRAFFIC_SCAN_DENY_PERIOD\t12000\n#endif\n\nstatic const u32 rtw_cipher_suites[] = {\n\tWLAN_CIPHER_SUITE_WEP40,\n\tWLAN_CIPHER_SUITE_WEP104,\n\tWLAN_CIPHER_SUITE_TKIP,\n\tWLAN_CIPHER_SUITE_CCMP,\n#ifdef CONFIG_WAPI_SUPPORT\n\tWLAN_CIPHER_SUITE_SMS4,\n#endif // CONFIG_WAPI_SUPPORT\n#ifdef CONFIG_IEEE80211W\n\tWLAN_CIPHER_SUITE_AES_CMAC,\n#endif //CONFIG_IEEE80211W\n};\n\n#define RATETAB_ENT(_rate, _rateid, _flags) \\\n\t{\t\t\t\t\t\t\t\t\\\n\t\t.bitrate\t= (_rate),\t\t\t\t\\\n\t\t.hw_value\t= (_rateid),\t\t\t\t\\\n\t\t.flags\t\t= (_flags),\t\t\t\t\\\n\t}\n\n#define CHAN2G(_channel, _freq, _flags) {\t\t\t\\\n\t.band\t\t\t= IEEE80211_BAND_2GHZ,\t\t\\\n\t.center_freq\t\t= (_freq),\t\t\t\\\n\t.hw_value\t\t= (_channel),\t\t\t\\\n\t.flags\t\t\t= (_flags),\t\t\t\\\n\t.max_antenna_gain\t= 0,\t\t\t\t\\\n\t.max_power\t\t= 30,\t\t\t\t\\\n}\n\n#define CHAN5G(_channel, _flags) {\t\t\t\t\\\n\t.band\t\t\t= IEEE80211_BAND_5GHZ,\t\t\\\n\t.center_freq\t\t= 5000 + (5 * (_channel)),\t\\\n\t.hw_value\t\t= (_channel),\t\t\t\\\n\t.flags\t\t\t= (_flags),\t\t\t\\\n\t.max_antenna_gain\t= 0,\t\t\t\t\\\n\t.max_power\t\t= 30,\t\t\t\t\\\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\n/* if wowlan is not supported, kernel generate a disconnect at each suspend\n * cf: /net/wireless/sysfs.c, so register a stub wowlan.\n * Moreover wowlan has to be enabled via a the nl80211_set_wowlan callback.\n * (from user space, e.g. iw phy0 wowlan enable)\n */\nstatic const struct wiphy_wowlan_support wowlan_stub = {\n\t.flags = WIPHY_WOWLAN_ANY,\n\t.n_patterns = 0,\n\t.pattern_max_len = 0,\n\t.pattern_min_len = 0,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))\n\t.max_pkt_offset = 0,\n#endif\n};\n#endif\n\nstatic struct ieee80211_rate rtw_rates[] = {\n\tRATETAB_ENT(10,  0x1,   0),\n\tRATETAB_ENT(20,  0x2,   0),\n\tRATETAB_ENT(55,  0x4,   0),\n\tRATETAB_ENT(110, 0x8,   0),\n\tRATETAB_ENT(60,  0x10,  0),\n\tRATETAB_ENT(90,  0x20,  0),\n\tRATETAB_ENT(120, 0x40,  0),\n\tRATETAB_ENT(180, 0x80,  0),\n\tRATETAB_ENT(240, 0x100, 0),\n\tRATETAB_ENT(360, 0x200, 0),\n\tRATETAB_ENT(480, 0x400, 0),\n\tRATETAB_ENT(540, 0x800, 0),\n};\n\n#define rtw_a_rates\t\t(rtw_rates + 4)\n#define RTW_A_RATES_NUM\t8\n#define rtw_g_rates\t\t(rtw_rates + 0)\n#define RTW_G_RATES_NUM\t12\n\n#define RTW_2G_CHANNELS_NUM 14\n#define RTW_5G_CHANNELS_NUM 37\n\nstatic struct ieee80211_channel rtw_2ghz_channels[] = {\n\tCHAN2G(1, 2412, 0),\n\tCHAN2G(2, 2417, 0),\n\tCHAN2G(3, 2422, 0),\n\tCHAN2G(4, 2427, 0),\n\tCHAN2G(5, 2432, 0),\n\tCHAN2G(6, 2437, 0),\n\tCHAN2G(7, 2442, 0),\n\tCHAN2G(8, 2447, 0),\n\tCHAN2G(9, 2452, 0),\n\tCHAN2G(10, 2457, 0),\n\tCHAN2G(11, 2462, 0),\n\tCHAN2G(12, 2467, 0),\n\tCHAN2G(13, 2472, 0),\n\tCHAN2G(14, 2484, 0),\n};\n\nstatic struct ieee80211_channel rtw_5ghz_a_channels[] = {\n\tCHAN5G(34, 0),\t\tCHAN5G(36, 0),\n\tCHAN5G(38, 0),\t\tCHAN5G(40, 0),\n\tCHAN5G(42, 0),\t\tCHAN5G(44, 0),\n\tCHAN5G(46, 0),\t\tCHAN5G(48, 0),\n\tCHAN5G(52, 0),\t\tCHAN5G(56, 0),\n\tCHAN5G(60, 0),\t\tCHAN5G(64, 0),\n\tCHAN5G(100, 0),\t\tCHAN5G(104, 0),\n\tCHAN5G(108, 0),\t\tCHAN5G(112, 0),\n\tCHAN5G(116, 0),\t\tCHAN5G(120, 0),\n\tCHAN5G(124, 0),\t\tCHAN5G(128, 0),\n\tCHAN5G(132, 0),\t\tCHAN5G(136, 0),\n\tCHAN5G(140, 0),\t\tCHAN5G(149, 0),\n\tCHAN5G(153, 0),\t\tCHAN5G(157, 0),\n\tCHAN5G(161, 0),\t\tCHAN5G(165, 0),\n\tCHAN5G(184, 0),\t\tCHAN5G(188, 0),\n\tCHAN5G(192, 0),\t\tCHAN5G(196, 0),\n\tCHAN5G(200, 0),\t\tCHAN5G(204, 0),\n\tCHAN5G(208, 0),\t\tCHAN5G(212, 0),\n\tCHAN5G(216, 0),\n};\n\n\nvoid rtw_2g_channels_init(struct ieee80211_channel *channels)\n{\n\t_rtw_memcpy((void*)channels, (void*)rtw_2ghz_channels,\n\t\tsizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM\n\t);\n}\n\nvoid rtw_5g_channels_init(struct ieee80211_channel *channels)\n{\n\t_rtw_memcpy((void*)channels, (void*)rtw_5ghz_a_channels,\n\t\tsizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM\n\t);\n}\n\nvoid rtw_2g_rates_init(struct ieee80211_rate *rates)\n{\n\t_rtw_memcpy(rates, rtw_g_rates,\n\t\tsizeof(struct ieee80211_rate)*RTW_G_RATES_NUM\n\t);\n}\n\nvoid rtw_5g_rates_init(struct ieee80211_rate *rates)\n{\n\t_rtw_memcpy(rates, rtw_a_rates,\n\t\tsizeof(struct ieee80211_rate)*RTW_A_RATES_NUM\n\t);\n}\n\nstruct ieee80211_supported_band *rtw_spt_band_alloc(\n\tenum ieee80211_band band\n\t)\n{\n\tstruct ieee80211_supported_band *spt_band = NULL;\n\tint n_channels, n_bitrates;\n\n\tif(band == IEEE80211_BAND_2GHZ)\n\t{\n\t\tn_channels = RTW_2G_CHANNELS_NUM;\n\t\tn_bitrates = RTW_G_RATES_NUM;\n\t}\n\telse if(band == IEEE80211_BAND_5GHZ)\n\t{\n\t\tn_channels = RTW_5G_CHANNELS_NUM;\n\t\tn_bitrates = RTW_A_RATES_NUM;\n\t}\n\telse\n\t{\n\t\tgoto exit;\n\t}\n\n\tspt_band = (struct ieee80211_supported_band *)rtw_zmalloc(\n\t\tsizeof(struct ieee80211_supported_band)\n\t\t+ sizeof(struct ieee80211_channel)*n_channels\n\t\t+ sizeof(struct ieee80211_rate)*n_bitrates\n\t);\n\tif(!spt_band)\n\t\tgoto exit;\n\n\tspt_band->channels = (struct ieee80211_channel*)(((u8*)spt_band)+sizeof(struct ieee80211_supported_band));\n\tspt_band->bitrates= (struct ieee80211_rate*)(((u8*)spt_band->channels)+sizeof(struct ieee80211_channel)*n_channels);\n\tspt_band->band = band;\n\tspt_band->n_channels = n_channels;\n\tspt_band->n_bitrates = n_bitrates;\n\n\tif(band == IEEE80211_BAND_2GHZ)\n\t{\n\t\trtw_2g_channels_init(spt_band->channels);\n\t\trtw_2g_rates_init(spt_band->bitrates);\n\t}\n\telse if(band == IEEE80211_BAND_5GHZ)\n\t{\n\t\trtw_5g_channels_init(spt_band->channels);\n\t\trtw_5g_rates_init(spt_band->bitrates);\n\t}\n\n\t//spt_band.ht_cap\n\t\nexit:\n\n\treturn spt_band;\n}\n\nvoid rtw_spt_band_free(struct ieee80211_supported_band *spt_band)\n{\n\tu32 size = 0;\n\n\tif(!spt_band)\n\t\treturn;\n\t\n\tif(spt_band->band == IEEE80211_BAND_2GHZ)\n\t{\n\t\tsize = sizeof(struct ieee80211_supported_band)\n\t\t\t+ sizeof(struct ieee80211_channel)*RTW_2G_CHANNELS_NUM\n\t\t\t+ sizeof(struct ieee80211_rate)*RTW_G_RATES_NUM;\n\t}\n\telse if(spt_band->band == IEEE80211_BAND_5GHZ)\n\t{\n\t\tsize = sizeof(struct ieee80211_supported_band)\n\t\t\t+ sizeof(struct ieee80211_channel)*RTW_5G_CHANNELS_NUM\n\t\t\t+ sizeof(struct ieee80211_rate)*RTW_A_RATES_NUM;\t\t\n\t}\n\telse\n\t{\n\t\t\n\t}\n\trtw_mfree((u8*)spt_band, size);\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\nstatic const struct ieee80211_txrx_stypes\nrtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {\n\t[NL80211_IFTYPE_ADHOC] = {\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ACTION >> 4)\n\t},\n\t[NL80211_IFTYPE_STATION] = {\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |\n\t\tBIT(IEEE80211_STYPE_PROBE_REQ >> 4)\n\t},\n\t[NL80211_IFTYPE_AP] = {\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_PROBE_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_DISASSOC >> 4) |\n\t\tBIT(IEEE80211_STYPE_AUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_DEAUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_ACTION >> 4)\n\t},\n\t[NL80211_IFTYPE_AP_VLAN] = {\n\t\t/* copy AP */\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_PROBE_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_DISASSOC >> 4) |\n\t\tBIT(IEEE80211_STYPE_AUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_DEAUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_ACTION >> 4)\n\t},\n\t[NL80211_IFTYPE_P2P_CLIENT] = {\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |\n\t\tBIT(IEEE80211_STYPE_PROBE_REQ >> 4)\n\t},\n\t[NL80211_IFTYPE_P2P_GO] = {\n\t\t.tx = 0xffff,\n\t\t.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_PROBE_REQ >> 4) |\n\t\tBIT(IEEE80211_STYPE_DISASSOC >> 4) |\n\t\tBIT(IEEE80211_STYPE_AUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_DEAUTH >> 4) |\n\t\tBIT(IEEE80211_STYPE_ACTION >> 4)\n\t},\n};\n#endif\n\nstatic u64 rtw_get_systime_us(void)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0))\n\tstruct timespec64 ts;\n\tktime_get_boottime_ts64(&ts);\n\treturn ((u64)ts.tv_sec*1000000) + ts.tv_nsec / 1000;\n#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))\n\tstruct timespec ts;\n\tget_monotonic_boottime(&ts);\n\treturn ((u64)ts.tv_sec*1000000) + ts.tv_nsec / 1000;\n#else\n\tstruct timeval tv;\n\tdo_gettimeofday(&tv);\n\treturn ((u64)tv.tv_sec*1000000) + tv.tv_usec;\n#endif\n}\n\n#define MAX_BSSINFO_LEN 1000\nstruct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)\n{\n\tstruct ieee80211_channel *notify_channel;\n\tstruct cfg80211_bss *bss = NULL;\n\t//struct ieee80211_supported_band *band;       \n\tu16 channel;\n\tu32 freq;\n\tu64 notify_timestamp;\n\tu16 notify_capability;\n\tu16 notify_interval;\n\tu8 *notify_ie;\n\tsize_t notify_ielen;\n\ts32 notify_signal;\n\t//u8 buf[MAX_BSSINFO_LEN];\n\n\tu8 *pbuf;\n\tsize_t buf_size = MAX_BSSINFO_LEN;\n\tsize_t len,bssinf_len=0;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tunsigned short *fctrl;\n\tu8\tbc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\t\t\n\tstruct wireless_dev *wdev = padapter->rtw_wdev;\n\tstruct wiphy *wiphy = wdev->wiphy;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tpbuf = rtw_zmalloc(buf_size);\n\tif(pbuf == NULL){\n\t\tDBG_871X(\"%s pbuf allocate failed  !! \\n\",__FUNCTION__);\n\t\treturn bss;\n\t}\n\t\t\n\t//DBG_8192C(\"%s\\n\", __func__);\n\n\tbssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr);\n\tif(bssinf_len > buf_size){\n\t\tDBG_871X(\"%s IE Length too long > %zu byte \\n\",__FUNCTION__,buf_size);\n\t\tgoto exit;\n\t}\n\n#ifndef CONFIG_WAPI_SUPPORT\n\t{\n\t\tu16 wapi_len = 0;\n\t\n\t\tif(rtw_get_wapi_ie(pnetwork->network.IEs, pnetwork->network.IELength, NULL, &wapi_len)>0)\n\t\t{\n\t\t\tif(wapi_len > 0)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, no support wapi!\\n\",__FUNCTION__);\n\t\t\t\tgoto exit;\n\t\t\t}\t\n\t\t}\t\t\n\t}\t\n#endif //!CONFIG_WAPI_SUPPORT\n\n\t//To reduce PBC Overlap rate\n\t//_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\tif(adapter_wdev_data(padapter)->scan_request != NULL)\n\t{\n\t\tu8 *psr=NULL, sr = 0;\n\t\tNDIS_802_11_SSID *pssid = &pnetwork->network.Ssid;\n\t\tstruct cfg80211_scan_request *request = adapter_wdev_data(padapter)->scan_request;\n\t\tstruct cfg80211_ssid *ssids = request->ssids;\n\t\tu32 wpsielen=0;\n\t\tu8 *wpsie=NULL;\t\n\t\t\n\t\twpsie = rtw_get_wps_ie(pnetwork->network.IEs+_FIXED_IE_LENGTH_, pnetwork->network.IELength-_FIXED_IE_LENGTH_, NULL, &wpsielen);\n\t\t\n\t\tif(wpsie && wpsielen>0)\n\t\t\tpsr = rtw_get_wps_attr_content(wpsie,  wpsielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\n\t\t\n\t\tif (sr != 0)\n\t\t{\t\t\t\n\t\t\tif(request->n_ssids == 1 && request->n_channels == 1) // it means under processing WPS\n\t\t\t{\n\t\t\t\tDBG_8192C(\"ssid=%s, len=%d\\n\", pssid->Ssid, pssid->SsidLength);\n\n\t\t\t\tif (ssids[0].ssid_len == 0) {\n\t\t\t\t}\n\t\t\t\telse if(pssid->SsidLength == ssids[0].ssid_len &&\n\t\t\t\t\t_rtw_memcmp(pssid->Ssid, ssids[0].ssid, ssids[0].ssid_len))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s, got sr and ssid match!\\n\", __func__);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(psr !=NULL)\n\t\t\t\t\t\t*psr = 0; //clear sr\n\t\t\t\t\n#if 0\t\t\t\n\t\t\t\t\tWLAN_BSSID_EX  *pselect_network = &pnetwork->network;\n\t\t\t\t\tstruct cfg80211_bss *pselect_bss = NULL;\n\t\t\t\t\tstruct ieee80211_channel *notify_channel = NULL;\n\t\t\t\t\tu32 freq;\n\n\t\t\t\t\tDBG_871X(\"%s, got sr, but ssid mismatch, to remove this bss\\n\", __func__);\n\n\t\t\t\t\tfreq = rtw_ch2freq(pselect_network->Configuration.DSConfig);\n\t\t\t\t\tnotify_channel = ieee80211_get_channel(wiphy, freq);\n\t\t\t\t\tpselect_bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,\n\t\t\t\t\t\t\t\tpselect_network->MacAddress, pselect_network->Ssid.Ssid,\n\t\t\t\t\t\t\t\tpselect_network->Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/, \n\t\t\t\t\t\t\t\t0/*WLAN_CAPABILITY_ESS*/);\n\n\t\t\t\t\tif(pselect_bss)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"%s, got bss for cfg80211 for unlinking bss\\n\", __func__);\n\n\t\t\t\t\t\tcfg80211_unlink_bss(wiphy, pselect_bss);\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\n\t\t\t\t\t\tcfg80211_put_bss(wiphy, pselect_bss);\n#else\n\t\t\t\t\t\tcfg80211_put_bss(pselect_bss);\n#endif\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tgoto exit;\n#endif \t\t\t\t\t\n\t\t\t\t}\t\t\t\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t}\n\t//_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\t\n\n\tchannel = pnetwork->network.Configuration.DSConfig;\n\tfreq = rtw_ch2freq(channel);\n\tnotify_channel = ieee80211_get_channel(wiphy, freq);\n\n\tif (0)\n\t\tnotify_timestamp = le64_to_cpu(*(u64*)rtw_get_timestampe_from_ie(pnetwork->network.IEs));\n\telse\n\t\tnotify_timestamp = rtw_get_systime_us();\n\n\tnotify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));\n\tnotify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs));\t\t\n\n\tnotify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;\n\tnotify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;\n\n\t//We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm)\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&\n\t\tis_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {\n\t\tnotify_signal = 100*translate_percentage_to_dbm(padapter->recvpriv.signal_strength);//dbm\n\t} else {\n\t\tnotify_signal = 100*translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm\n\t}\n\t\t\n\t#if 0\n\tDBG_8192C(\"bssid: \"MAC_FMT\"\\n\", MAC_ARG(pnetwork->network.MacAddress));\n\tDBG_8192C(\"Channel: %d(%d)\\n\", channel, freq);\n\tDBG_8192C(\"Capability: %X\\n\", notify_capability);\n\tDBG_8192C(\"Beacon interval: %d\\n\", notify_interval);\n\tDBG_8192C(\"Signal: %d\\n\", notify_signal);\n\tDBG_8192C(\"notify_timestamp: %llu\\n\", notify_timestamp);\n\t#endif\n\n\t//pbuf = buf;\n\t\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pbuf;\t\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\t\n\n\tSetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/);\n\t//pmlmeext->mgnt_seq++;\n\n\tif (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON\n\t\t_rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);\t\t\n\t\tSetFrameSubType(pbuf, WIFI_BEACON);\n\t} else {\n\t\t_rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN);\n\t\tSetFrameSubType(pbuf, WIFI_PROBERSP);\n\t}\n\n\t_rtw_memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);\n\n\n\t//pbuf += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tlen = sizeof (struct rtw_ieee80211_hdr_3addr);\n\t_rtw_memcpy((pbuf+len), pnetwork->network.IEs, pnetwork->network.IELength);\n\t*((u64*)(pbuf+len)) = cpu_to_le64(notify_timestamp);\n\t\n\tlen += pnetwork->network.IELength;\t\n\n\t//#ifdef CONFIG_P2P\n\t//if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL))\n\t//{\n\t//\tDBG_8192C(\"%s, got p2p_ie\\n\", __func__);\n\t//}\n\t//#endif\n\n#if 1\t\n\tbss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)pbuf,\n\t\tlen, notify_signal, GFP_ATOMIC);\n#else\t\t\t \n\t\t\t\n\tbss = cfg80211_inform_bss(wiphy, notify_channel, (const u8 *)pnetwork->network.MacAddress,\n                notify_timestamp, notify_capability, notify_interval, notify_ie,\n                notify_ielen, notify_signal, GFP_ATOMIC/*GFP_KERNEL*/);\n#endif\n\n\tif (unlikely(!bss)) {\n\t\tDBG_8192C(FUNC_ADPT_FMT\" bss NULL\\n\", FUNC_ADPT_ARG(padapter));\n\t\tgoto exit;\n\t}\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38))\n#ifndef COMPAT_KERNEL_RELEASE\n\t//patch for cfg80211, update beacon ies to information_elements\n\tif (pnetwork->network.Reserved[0] == 1) { // WIFI_BEACON\n\t\n\t\t if(bss->len_information_elements != bss->len_beacon_ies)\n\t\t {\n\t\t\tbss->information_elements = bss->beacon_ies;\t\t\t\n\t\t\tbss->len_information_elements =  bss->len_beacon_ies;\n\t\t }\t\t\n\t}\n#endif //COMPAT_KERNEL_RELEASE\n#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)\n\n/*\t\n\t{\n\t\tif( bss->information_elements == bss->proberesp_ies) \n\t\t{\n\t\t\tif( bss->len_information_elements !=  bss->len_proberesp_ies)\n\t\t\t{\n\t\t\t\tDBG_8192C(\"error!, len_information_elements !=  bss->len_proberesp_ies\\n\");\n\t\t\t}\n\t\t\t\t\t\t\t\n\t\t}\n\t\telse if(bss->len_information_elements <  bss->len_beacon_ies)\n\t\t{\n\t\t\tbss->information_elements = bss->beacon_ies;\t\t\t\n\t\t\tbss->len_information_elements =  bss->len_beacon_ies;\n\t\t}\n\t}\n*/\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\n\tcfg80211_put_bss(wiphy, bss);\n#else\n\tcfg80211_put_bss(bss);\n#endif\n\t\nexit:\n\tif(pbuf)\n\t\trtw_mfree(pbuf, buf_size);\t\n\treturn bss;\n\t\n}\n\n/*\n\tCheck the given bss is valid by kernel API cfg80211_get_bss()\n\t@padapter : the given adapter\n\t\n\treturn _TRUE if bss is valid,  _FALSE for not found.\n*/\nint rtw_cfg80211_check_bss(_adapter *padapter)\n{\n\tWLAN_BSSID_EX  *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);\n\tstruct cfg80211_bss *bss = NULL;\n\tstruct ieee80211_channel *notify_channel = NULL;\n\tu32 freq;\n\n\tif (!(pnetwork) || !(padapter->rtw_wdev))\n\t\treturn _FALSE;\n\n\tfreq = rtw_ch2freq(pnetwork->Configuration.DSConfig);\n\tnotify_channel = ieee80211_get_channel(padapter->rtw_wdev->wiphy, freq);\n\tbss = cfg80211_get_bss(padapter->rtw_wdev->wiphy, notify_channel,\n\t\t\tpnetwork->MacAddress, pnetwork->Ssid.Ssid,\n\t\t\tpnetwork->Ssid.SsidLength,\n\t\t\tWLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\n\tcfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);\n#else\n\tcfg80211_put_bss(bss);\n#endif\n\n\treturn \t(bss!=NULL);\n}\n\nvoid rtw_cfg80211_ibss_indicate_connect(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network  *cur_network = &(pmlmepriv->cur_network);\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n\tstruct cfg80211_bss *bss = NULL;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))\n\tstruct wiphy *wiphy = pwdev->wiphy;\n\tint freq = 2412;\n\tstruct ieee80211_channel *notify_channel;\n#endif\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))\t\n\tfreq = rtw_ch2freq(cur_network->network.Configuration.DSConfig);\n\n\tif (0)\n\t\tDBG_871X(\"chan: %d, freq: %d\\n\", cur_network->network.Configuration.DSConfig, freq);\n#endif\n\n\tif (pwdev->iftype != NL80211_IFTYPE_ADHOC) \n\t{\n\t\treturn;\n\t}\n\n\tif (!rtw_cfg80211_check_bss(padapter)) {\n\t\tWLAN_BSSID_EX  *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);\n\t\tstruct wlan_network *scanned = pmlmepriv->cur_network_scanned;\n\n\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE)\n\t\t{\n\t\t\t\n\t\t\t_rtw_memcpy(&cur_network->network, pnetwork, sizeof(WLAN_BSSID_EX));\n\t\t\tif(cur_network)\n\t\t\t{\n\t\t\t\tif (!rtw_cfg80211_inform_bss(padapter,cur_network))\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" inform fail !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\telse\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" inform success !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"cur_network is not exist!!!\\n\");\n\t\t\t\treturn ;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(scanned == NULL)\n\t\t\t\trtw_warn_on(1);\n\n\t\t\tif (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE\n\t\t\t\t&& _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE\n\t\t\t) {\n\t\t\t\tif (!rtw_cfg80211_inform_bss(padapter,scanned)) {\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" inform fail !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t} else {\n\t\t\t\t\t//DBG_871X(FUNC_ADPT_FMT\" inform success !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDBG_871X(\"scanned & pnetwork compare fail\\n\");\n\t\t\t\trtw_warn_on(1);\n\t\t\t}\n\t\t}\n\n\t\tif (!rtw_cfg80211_check_bss(padapter))\n\t\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" BSS not found !!\\n\", FUNC_ADPT_ARG(padapter));\n\t}\n\t//notify cfg80211 that device joined an IBSS\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))\n\tnotify_channel = ieee80211_get_channel(wiphy, freq);\n\tcfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, notify_channel, GFP_ATOMIC);\n#else\n\tcfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, GFP_ATOMIC);\n#endif\n}\n\nvoid rtw_cfg80211_indicate_connect(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wlan_network  *cur_network = &(pmlmepriv->cur_network);\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif\n\tstruct cfg80211_bss *bss = NULL;\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\tif (pwdev->iftype != NL80211_IFTYPE_STATION\n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t&& pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT\n\t\t#endif\n\t) {\n\t\treturn;\n\t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\treturn;\n\n#ifdef CONFIG_P2P\n\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d, pre_p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));\n\t\t}\n\t}\n#endif //CONFIG_P2P\n\n\t{\n\t\tWLAN_BSSID_EX  *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);\n\t\tstruct wlan_network *scanned = pmlmepriv->cur_network_scanned;\n\n\t\t//DBG_871X(FUNC_ADPT_FMT\" BSS not found\\n\", FUNC_ADPT_ARG(padapter));\n\n\t\tif(scanned == NULL) {\n\t\t\trtw_warn_on(1);\n\t\t\tgoto check_bss;\n\t\t}\n\n\t\tif (_rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE\n\t\t\t&& _rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE\n\t\t) {\n\t\t\tif (!rtw_cfg80211_inform_bss(padapter,scanned)) {\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" inform fail !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t} else {\n\t\t\t\t//DBG_871X(FUNC_ADPT_FMT\" inform success !!\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\t}\n\t\t} else {\n\t\t\tDBG_871X(\"scanned: %s(\"MAC_FMT\"), cur: %s(\"MAC_FMT\")\\n\",\n\t\t\t\tscanned->network.Ssid.Ssid, MAC_ARG(scanned->network.MacAddress),\n\t\t\t\tpnetwork->Ssid.Ssid, MAC_ARG(pnetwork->MacAddress)\n\t\t\t);\n\t\t\trtw_warn_on(1);\n\t\t}\n\t}\n\ncheck_bss:\n\tif (!rtw_cfg80211_check_bss(padapter))\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" BSS not found !!\\n\", FUNC_ADPT_ARG(padapter));\n\n\tif (rtw_to_roam(padapter) > 0) {\n\t\t#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE)\n\t\tstruct wiphy *wiphy = pwdev->wiphy;\n\t\tstruct ieee80211_channel *notify_channel;\n\t\tu32 freq;\n\t\tu16 channel = cur_network->network.Configuration.DSConfig;\n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))\n\t\tstruct cfg80211_roam_info roam_info = {};\n\t\t#endif\n\n\t\tfreq = rtw_ch2freq(channel);\n\t\tnotify_channel = ieee80211_get_channel(wiphy, freq);\n\t\t#endif\n\n\t\tDBG_871X(FUNC_ADPT_FMT\" call cfg80211_roamed\\n\", FUNC_ADPT_ARG(padapter));\n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))\n\t\troam_info.channel = notify_channel;\n\t\troam_info.bssid = cur_network->network.MacAddress;\n\t\troam_info.req_ie =\n\t\t\tpmlmepriv->assoc_req+sizeof(struct ieee80211_hdr_3addr)+2;\n\t\troam_info.req_ie_len =\n\t\t\tpmlmepriv->assoc_req_len-sizeof(struct ieee80211_hdr_3addr)-2;\n\t\troam_info.resp_ie =\n\t\t\tpmlmepriv->assoc_rsp+sizeof(struct ieee80211_hdr_3addr)+6;\n\t\troam_info.resp_ie_len =\n\t\t\tpmlmepriv->assoc_rsp_len-sizeof(struct ieee80211_hdr_3addr)-6;\n\t\tcfg80211_roamed(padapter->pnetdev, &roam_info, GFP_ATOMIC);\n\t\t#else\n\t\tcfg80211_roamed(padapter->pnetdev\n\t\t\t#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE)\n\t\t\t, notify_channel\n\t\t\t#endif\n\t\t\t, cur_network->network.MacAddress\n\t\t\t, pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2\n\t\t\t, pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2\n\t\t\t, pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6\n\t\t\t, pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6\n\t\t\t, GFP_ATOMIC);\n\t\t#endif\n\t}\n\telse\n\t{\n\t#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\t\n\t\tDBG_8192C(\"pwdev->sme_state(b)=%d\\n\", pwdev->sme_state);\n\t#endif\n\t\tcfg80211_connect_result(padapter->pnetdev, cur_network->network.MacAddress\n\t\t\t, pmlmepriv->assoc_req+sizeof(struct rtw_ieee80211_hdr_3addr)+2\n\t\t\t, pmlmepriv->assoc_req_len-sizeof(struct rtw_ieee80211_hdr_3addr)-2\n\t\t\t, pmlmepriv->assoc_rsp+sizeof(struct rtw_ieee80211_hdr_3addr)+6\n\t\t\t, pmlmepriv->assoc_rsp_len-sizeof(struct rtw_ieee80211_hdr_3addr)-6\n\t\t\t, WLAN_STATUS_SUCCESS, GFP_ATOMIC);\n\t#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\t\n\t\tDBG_8192C(\"pwdev->sme_state(a)=%d\\n\", pwdev->sme_state);\n\t#endif\n\t}\n}\n\nvoid rtw_cfg80211_indicate_disconnect(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n\tif (pwdev->iftype != NL80211_IFTYPE_STATION \n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t&& pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT\n\t\t#endif\n\t) {\n\t\treturn;\n\t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\treturn;\n\n#ifdef CONFIG_P2P\t\n\tif( pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\n\t\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d, pre_p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));\n\t\t}\n\t}\n#endif //CONFIG_P2P\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tif (!padapter->mlmepriv.not_indic_disco || padapter->ndev_unregistering) {\n\t#else\n\t{\n\t#endif\t\n\t\t#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)\t\t\t\n\t\tDBG_8192C(\"pwdev->sme_state(b)=%d\\n\", pwdev->sme_state);\n\n\t\tif(pwdev->sme_state==CFG80211_SME_CONNECTING)\n\t\t\tcfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, \n\t\t\t\tWLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/);\n\t\telse if(pwdev->sme_state==CFG80211_SME_CONNECTED)\n\t\t\tcfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);\n\t\t//else\n\t\t\t//DBG_8192C(\"pwdev->sme_state=%d\\n\", pwdev->sme_state);\n\n\t\tDBG_8192C(\"pwdev->sme_state(a)=%d\\n\", pwdev->sme_state);\n\t\t#else\n\n\t\tif (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))\n\t\t\tu8 locally_generated = 1;\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" call cfg80211_disconnected\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tcfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC);\n#else\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" call cfg80211_disconnected\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tcfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);\n#endif\n\t\t} else {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" call cfg80211_connect_result\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tcfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0, \n\t\t\t\tWLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC);\n\t\t}\n\t\t#endif\n\t}\n}\n \t\n\n#ifdef CONFIG_AP_MODE\nstatic int rtw_cfg80211_ap_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)\n{\n\tint ret = 0;\n\tu32 wep_key_idx, wep_key_len,wep_total_len;\n\tstruct sta_info *psta = NULL, *pbcmc_sta = NULL;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_8192C(\"%s\\n\", __FUNCTION__);\n\n\tparam->u.crypt.err = 0;\n\tparam->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\\0';\n\n\t//sizeof(struct ieee_param) = 64 bytes;\n\t//if (param_len !=  (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)\n\tif (param_len !=  sizeof(struct ieee_param) + param->u.crypt.key_len)\n\t{\n\t\tret =  -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\tif (param->u.crypt.idx >= WEP_KEYS\n#ifdef CONFIG_IEEE80211W\n\t\t\t&& param->u.crypt.idx > BIP_MAX_KEYID\n#endif /* CONFIG_IEEE80211W */\n\t\t)\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\t\n\t}\n\telse \n\t{\t\t\n\t\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\t\tif(!psta)\n\t\t{\n\t\t\t//ret = -EINVAL;\n\t\t\tDBG_8192C(\"rtw_set_encryption(), sta has already been removed or never been added\\n\");\n\t\t\tgoto exit;\n\t\t}\t\t\t\n\t}\n\n\tif (strcmp(param->u.crypt.alg, \"none\") == 0 && (psta==NULL))\n\t{\n\t\t//todo:clear default encryption keys\n\n\t\tDBG_8192C(\"clear default encryption keys, keyid=%d\\n\", param->u.crypt.idx);\n\t\t\n\t\tgoto exit;\n\t}\n\n\n\tif (strcmp(param->u.crypt.alg, \"WEP\") == 0 && (psta==NULL))\n\t{\t\t\n\t\tDBG_8192C(\"r871x_set_encryption, crypt.alg = WEP\\n\");\n\t\t\n\t\twep_key_idx = param->u.crypt.idx;\n\t\twep_key_len = param->u.crypt.key_len;\n\t\t\t\t\t\n\t\tDBG_8192C(\"r871x_set_encryption, wep_key_idx=%d, len=%d\\n\", wep_key_idx, wep_key_len);\n\n\t\tif((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0))\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\t\n\t\tif (wep_key_len > 0) \n\t\t{\t\t\t\n\t\t \twep_key_len = wep_key_len <= 5 ? 5 : 13;\n\t\t}\n\t\t\n\t\tif (psecuritypriv->bWepDefaultKeyIdxSet == 0)\n\t\t{\n\t\t\t//wep default key has not been set, so use this key index as default key.\n\n\t\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n\t\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP40_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy=_WEP40_;\n\t\t\t\n\t\t\tif(wep_key_len == 13)\n\t\t\t{\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP104_;\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy=_WEP104_;\n\t\t\t}\n\n\t\t\tpsecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;\n\t\t}\n\t\t\t\n\t\t_rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);\n\t\t\t\t\t\n\t\tpsecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;\n\n\t\trtw_ap_set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx, 1);\n\n\t\tgoto exit;\n\t\t\n\t}\n\n\t\n\tif(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key\n\t{\n\t\tif(param->u.crypt.set_tx == 0) //group key\n\t\t{\n\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t{\n\t\t\t\tDBG_8192C(\"%s, set group_key, WEP\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t{\t\t\t\t\t\t\n\t\t\t\tDBG_8192C(\"%s, set group_key, TKIP\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _TKIP_;\n\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t//set mic key\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t{\n\t\t\t\tDBG_8192C(\"%s, set group_key, CCMP\\n\", __FUNCTION__);\n\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _AES_;\n\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\t\telse if (strcmp(param->u.crypt.alg, \"BIP\") == 0) {\n\t\t\t\tint no;\n\t\t\t\t\n\t\t\t\tDBG_871X(\"BIP key_len=%d , index=%d\\n\", param->u.crypt.key_len, param->u.crypt.idx);\n\t\t\t\t/* save the IGTK key, length 16 bytes */\n\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16:param->u.crypt.key_len));\n\t\t\t\t/* DBG_871X(\"IGTK key below:\\n\");\n\t\t\t\tfor(no=0;no<16;no++)\n\t\t\t\t\tprintk(\" %02x \", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);\n\t\t\t\tDBG_871X(\"\\n\"); */\n\t\t\t\tpadapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;\n\t\t\t\tpadapter->securitypriv.binstallBIPkey = _TRUE;\n\t\t\t\tDBG_871X(\" ~~~~set sta key:IGKT\\n\");\n\t\t\t\tgoto exit;\n\t\t\t}\n#endif /* CONFIG_IEEE80211W */\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_8192C(\"%s, set group_key, none\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\t\t\t}\n\n\t\t\tpsecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;\n\n\t\t\tpsecuritypriv->binstallGrpkey = _TRUE;\n\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!\n\t\t\t\t\t\t\t\t\n\t\t\trtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);\n\t\t\t\n\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\tif(pbcmc_sta)\n\t\t\t{\n\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\tpbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy\t\t\t\n\t\t\t}\t\n\t\t\t\t\t\t\n\t\t}\n\n\t\tgoto exit;\n\t\t\n\t}\t\n\n\tif(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x\n\t{\n\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\t{\n\t\t\tif(param->u.crypt.set_tx ==1) //pairwise key\n\t\t\t{ \n\t\t\t\t_rtw_memcpy(psta->dot118021x_UncstKey.skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"%s, set pairwise key, WEP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _WEP40_;\n\t\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsta->dot118021XPrivacy = _WEP104_;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tDBG_8192C(\"%s, set pairwise key, TKIP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _TKIP_;\n\t\t\t\t\n\t\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t\t//set mic key\n\t\t\t\t\t_rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t_rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t{\n\n\t\t\t\t\tDBG_8192C(\"%s, set pairwise key, CCMP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _AES_;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_8192C(\"%s, set pairwise key, none\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _NO_PRIVACY_;\n\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\trtw_ap_set_pairwise_key(padapter, psta);\n\t\t\t\t\t\n\t\t\t\tpsta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\t\n\t\t\t\tpsta->bpairwise_key_installed = _TRUE;\n\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse//group key???\n\t\t\t{ \n\t\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\t\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _TKIP_;\n\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t\t//set mic key\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t{\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _AES_;\n\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\t\t\t\t}\n\n\t\t\t\tpsecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;\n\n\t\t\t\tpsecuritypriv->binstallGrpkey = _TRUE;\t\n\t\t\t\t\t\t\t\t\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!\n\t\t\t\t\t\t\t\t\n\t\t\t\trtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);\n\t\t\t\n\t\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\t\tif(pbcmc_sta)\n\t\t\t\t{\n\t\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\tpbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy\t\t\t\n\t\t\t\t}\t\t\t\t\t\n\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\t\t\n\t}\n\nexit:\n\n\treturn ret;\n\t\n}\n#endif\n\nstatic int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)\n{\n\tint ret = 0;\n\tu32 wep_key_idx, wep_key_len,wep_total_len;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\t\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info* pwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\n_func_enter_;\n\n\tDBG_8192C(\"%s\\n\", __func__);\n\n\tparam->u.crypt.err = 0;\n\tparam->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\\0';\n\n\tif (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)\n\t{\n\t\tret =  -EINVAL;\t\t\n\t\tgoto exit;\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\tif (param->u.crypt.idx >= WEP_KEYS\n#ifdef CONFIG_IEEE80211W\n\t\t\t&& param->u.crypt.idx > BIP_MAX_KEYID\n#endif //CONFIG_IEEE80211W\n\t\t)\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t} else {\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif (strcmp(param->u.crypt.alg, \"SMS4\"))\n#endif\n\t\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\t}\n\n\tif (strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"wpa_set_encryption, crypt.alg = WEP\\n\"));\n\t\tDBG_8192C(\"wpa_set_encryption, crypt.alg = WEP\\n\");\n\n\t\twep_key_idx = param->u.crypt.idx;\n\t\twep_key_len = param->u.crypt.key_len;\n\n\t\tif ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0))\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (psecuritypriv->bWepDefaultKeyIdxSet == 0)\n\t\t{\n\t\t\t//wep default key has not been set, so use this key index as default key.\n\n\t\t\twep_key_len = wep_key_len <= 5 ? 5 : 13;\n\n\t\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP40_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\n\t\t\tif(wep_key_len==13)\n\t\t\t{\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP104_;\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t}\n\n\t\t\tpsecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;\n\t\t}\n\t\t\t\n\t\t_rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);\n\t\t\t\n\t\tpsecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;\n\t\t\t\n\t\trtw_set_key(padapter, psecuritypriv, wep_key_idx, 0, _TRUE);\n\n\t\tgoto exit;\t\t\n\t}\n\n\tif(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x\n\t{\n\t\tstruct sta_info * psta,*pbcmc_sta;\n\t\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\n\t\t//DBG_8192C(\"%s, : dot11AuthAlgrthm == dot11AuthAlgrthm_8021X \\n\", __func__);\n\n\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode\n\t\t{\n\t\t\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\t\t\t\n\t\t\tif (psta == NULL) {\n\t\t\t\t//DEBUG_ERR( (\"Set wpa_set_encryption: Obtain Sta_info fail \\n\"));\n\t\t\t\tDBG_8192C(\"%s, : Obtain Sta_info fail \\n\", __func__);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Jeff: don't disable ieee8021x_blocked while clearing key\n\t\t\t\tif (strcmp(param->u.crypt.alg, \"none\") != 0) \n\t\t\t\t\tpsta->ieee8021x_blocked = _FALSE;\n\n\t\t\t\t\n\t\t\t\tif((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||\n\t\t\t\t\t\t(padapter->securitypriv.ndisencryptstatus ==  Ndis802_11Encryption3Enabled))\n\t\t\t\t{\n\t\t\t\t\tpsta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\t}\t\t\n\n\t\t\t\tif(param->u.crypt.set_tx ==1)//pairwise key\n\t\t\t\t{ \n\n\t\t\t\t\tDBG_8192C(\"%s, : param->u.crypt.set_tx ==1 \\n\", __func__);\n\t\t\t\t\t\n\t\t\t\t\t_rtw_memcpy(psta->dot118021x_UncstKey.skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\t\tif(strcmp(param->u.crypt.alg, \"TKIP\") == 0)//set mic key\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\t//DEBUG_ERR((\"\\nset key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len));\n\t\t\t\t\t\t_rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t\t_rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\t\tpadapter->securitypriv.busetkipkey=_FALSE;\n\t\t\t\t\t\t//_set_timer(&padapter->securitypriv.tkip_timer, 50);\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tpsta->bpairwise_key_installed = _TRUE;\n\t\t\t\t\t//DEBUG_ERR((\" param->u.crypt.key_len=%d\\n\",param->u.crypt.key_len));\n\t\t\t\t\tDBG_871X(\" ~~~~set sta key:unicastkey\\n\");\n\t\t\t\t\t\n\t\t\t\t\trtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE);\n\t\t\t\t}\n\t\t\t\telse//group key\n\t\t\t\t{\n\t\t\t\t\tif(strcmp(param->u.crypt.alg, \"TKIP\") == 0 || strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8);\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8);\n\t                                        padapter->securitypriv.binstallGrpkey = _TRUE;\t\n\t\t\t\t\t\t//DEBUG_ERR((\" param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len));\n\t\t\t\t\t\tDBG_871X(\" ~~~~set sta key:groupkey\\n\");\n\t\n\t\t\t\t\t\tpadapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;\n\t\t\t\t\t\trtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);\n\t\t\t\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\t\t\t\telse if(strcmp(param->u.crypt.alg, \"BIP\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tint no;\n\t\t\t\t\t\t//DBG_871X(\"BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\\n\", param->u.crypt.key_len, param->u.crypt.idx);\n\t\t\t\t\t\t//save the IGTK key, length 16 bytes\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey,  param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\t/*DBG_871X(\"IGTK key below:\\n\");\n\t\t\t\t\t\tfor(no=0;no<16;no++)\n\t\t\t\t\t\t\tprintk(\" %02x \", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);\n\t\t\t\t\t\tDBG_871X(\"\\n\");*/\n\t\t\t\t\t\tpadapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;\n\t\t\t\t\t\tpadapter->securitypriv.binstallBIPkey = _TRUE;\n\t\t\t\t\t\tDBG_871X(\" ~~~~set sta key:IGKT\\n\");\n\t\t\t\t\t}\n#endif //CONFIG_IEEE80211W\n\t\t\t\t\t\n#ifdef CONFIG_P2P\n\t\t\t\t\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t\t\t\t{\n\t\t\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif //CONFIG_P2P\n\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\n\n\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\tif(pbcmc_sta==NULL)\n\t\t\t{\n\t\t\t\t//DEBUG_ERR( (\"Set OID_802_11_ADD_KEY: bcmc stainfo is null \\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Jeff: don't disable ieee8021x_blocked while clearing key\n\t\t\t\tif (strcmp(param->u.crypt.alg, \"none\") != 0) \n\t\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\n\t\t\t\tif((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||\n\t\t\t\t\t\t(padapter->securitypriv.ndisencryptstatus ==  Ndis802_11Encryption3Enabled))\n\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\tpbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\t\t\t\t\n\t\t}\n\t\telse if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode\n\t\t{\t\t\n\t\t}\t\t\t\n\t}\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif (strcmp(param->u.crypt.alg, \"SMS4\") == 0)\n\t{\n\t\tPRT_WAPI_T\t\t\tpWapiInfo = &padapter->wapiInfo;\n\t\tPRT_WAPI_STA_INFO\tpWapiSta;\n\t\tu8\t\t\t\t\tWapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\t\tu8\t\t\t\t\tWapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\t\tu8 \t\t\t\t\tWapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\n\t\tif(param->u.crypt.set_tx == 1)\n\t\t{\n\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\t\tif(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6))\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\n\t\t\t\t\tpWapiSta->wapiUsk.bSet = true;\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16);\n\t\t\t\t\tpWapiSta->wapiUsk.keyId = param->u.crypt.idx ;\n\t\t\t\t\tpWapiSta->wapiUsk.bTxEnable = true;\n\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = false;\n\t\t\t\t\tpWapiSta->wapiUskUpdate.bSet = false;\n\n\t\t\t\t\tif (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false)\n\t\t\t\t\t{\n\t\t\t\t\t\t//set unicast key for ASUE\n\t\t\t\t\t\trtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\t\tif(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6))\n\t\t\t\t{\n\t\t\t\t\tpWapiSta->wapiMsk.bSet = true;\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16);\n\t\t\t\t\tpWapiSta->wapiMsk.keyId = param->u.crypt.idx ;\n\t\t\t\t\tpWapiSta->wapiMsk.bTxEnable = false;\n\t\t\t\t\tif(!pWapiSta->bSetkeyOk)\n\t\t\t\t\t\tpWapiSta->bSetkeyOk = true;\n\t\t\t\t\tpWapiSta->bAuthenticateInProgress = false;\n\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);\n\n\t\t\t\t\tif (psecuritypriv->sw_decrypt == false)\n\t\t\t\t\t{\n\t\t\t\t\t\t//set rx broadcast key for ASUE\n\t\t\t\t\t\trtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n#endif\n\n\nexit:\n\n\tDBG_8192C(\"%s, ret=%d\\n\", __func__, ret);\n\t\n\t_func_exit_;\n\t\n\treturn ret;\t\n}\n\nstatic int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t\t\tu8 key_index, bool pairwise, const u8 *mac_addr,\n#else\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tu8 key_index, const u8 *mac_addr,\n#endif\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tstruct key_params *params)\n{\n\tchar *alg_name;\n\tu32 param_len;\n\tstruct ieee_param *param = NULL;\t\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct wireless_dev *rtw_wdev = padapter->rtw_wdev;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n#ifdef CONFIG_TDLS\n\tstruct sta_info *ptdls_sta;\n#endif /* CONFIG_TDLS */\n\t\n\tDBG_871X(FUNC_NDEV_FMT\" adding key for %pM\\n\", FUNC_NDEV_ARG(ndev), mac_addr);\n\tDBG_871X(\"cipher=0x%x\\n\", params->cipher);\n\tDBG_871X(\"key_len=0x%x\\n\", params->key_len);\n\tDBG_871X(\"seq_len=0x%x\\n\", params->seq_len);\n\tDBG_871X(\"key_index=%d\\n\", key_index);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\tDBG_871X(\"pairwise=%d\\n\", pairwise);\n#endif\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\n\tparam_len = sizeof(struct ieee_param) + params->key_len;\n\tparam = (struct ieee_param *)rtw_malloc(param_len);\n\tif (param == NULL)\n\t\treturn -1;\n\t\n\t_rtw_memset(param, 0, param_len);\n\n\tparam->cmd = IEEE_CMD_SET_ENCRYPTION;\n\t_rtw_memset(param->sta_addr, 0xff, ETH_ALEN);\n\n\tswitch (params->cipher) {\n\tcase IW_AUTH_CIPHER_NONE:\n\t\t//todo: remove key \n\t\t//remove = 1;\t\n\t\talg_name = \"none\";\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_WEP40:\n\tcase WLAN_CIPHER_SUITE_WEP104:\n\t\talg_name = \"WEP\";\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_TKIP:\n\t\talg_name = \"TKIP\";\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_CCMP:\n\t\talg_name = \"CCMP\";\n\t\tbreak;\n#ifdef CONFIG_IEEE80211W\n\tcase WLAN_CIPHER_SUITE_AES_CMAC:\n\t\talg_name = \"BIP\";\n\t\tbreak;\n#endif //CONFIG_IEEE80211W\n#ifdef CONFIG_WAPI_SUPPORT\n\tcase WLAN_CIPHER_SUITE_SMS4:\n\t\talg_name= \"SMS4\";\n\t\tif(pairwise == NL80211_KEYTYPE_PAIRWISE) {\n\t\t\tif (key_index != 0 && key_index != 1) {\n\t\t\t\tret = -ENOTSUPP;\n\t\t\t\tgoto addkey_end;\n\t\t\t}\n\t\t\t_rtw_memcpy((void*)param->sta_addr, (void*)mac_addr, ETH_ALEN);\n\t\t} else {\n\t\t\tDBG_871X(\"mac_addr is null \\n\");\n\t\t}\n\t\tDBG_871X(\"rtw_wx_set_enc_ext: SMS4 case \\n\");\n\t\tbreak;\n#endif\n\n\tdefault:\t\n\t\tret = -ENOTSUPP;\n\t\tgoto addkey_end;\n\t}\n\t\n\tstrncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);\n\t\n\n\tif (!mac_addr || is_broadcast_ether_addr(mac_addr))\n\t{\n\t\tparam->u.crypt.set_tx = 0; //for wpa/wpa2 group key\n\t} else {\n\t\tparam->u.crypt.set_tx = 1; //for wpa/wpa2 pairwise key\n\t}\n\t\n\t\n\t//param->u.crypt.idx = key_index - 1;\n\tparam->u.crypt.idx = key_index;\n\t\n\tif (params->seq_len && params->seq) \n\t{\t\n\t\t_rtw_memcpy(param->u.crypt.seq, (u8 *)params->seq, params->seq_len);\n\t}\n\n\tif(params->key_len && params->key)\n\t{\n\t\tparam->u.crypt.key_len = params->key_len;\t\t\n\t\t_rtw_memcpy(param->u.crypt.key, (u8 *)params->key, params->key_len);\n\t}\t\n\n\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t{\n#ifdef CONFIG_TDLS\n\t\tif (rtw_tdls_is_driver_setup(padapter) == _FALSE && mac_addr) {\n\t\t\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, (void *)mac_addr);\n\t\t\tif (ptdls_sta != NULL && ptdls_sta->tdls_sta_state) {\n\t\t\t\t_rtw_memcpy(ptdls_sta->tpk.tk, params->key, params->key_len);\n\t\t\t\trtw_tdls_set_key(padapter, ptdls_sta);\n\t\t\t\tgoto addkey_end;\n\t\t\t}\n\t\t}\n#endif /* CONFIG_TDLS */\n\n\t\tret =  rtw_cfg80211_set_encryption(ndev, param, param_len);\t\n\t}\n\telse if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n#ifdef CONFIG_AP_MODE\n\t\tif(mac_addr)\n\t\t\t_rtw_memcpy(param->sta_addr, (void*)mac_addr, ETH_ALEN);\n\t\n\t\tret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);\n#endif\n\t}\n        else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE\n                || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)\n        {\n                //DBG_8192C(\"@@@@@@@@@@ fw_state=0x%x, iftype=%d\\n\", pmlmepriv->fw_state, rtw_wdev->iftype);\n                ret =  rtw_cfg80211_set_encryption(ndev, param, param_len);\n        }\n\telse\n\t{\n\t\tDBG_8192C(\"error! fw_state=0x%x, iftype=%d\\n\", pmlmepriv->fw_state, rtw_wdev->iftype);\n\t\t\n\t}\n\naddkey_end:\n\tif(param)\n\t{\n\t\trtw_mfree((u8*)param, param_len);\n\t}\n\n\treturn ret;\n\n}\n\nstatic int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t\t\tu8 key_index, bool pairwise, const u8 *mac_addr,\n#else\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tu8 key_index, const u8 *mac_addr,\n#endif\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tvoid *cookie,\n\t\t\t\tvoid (*callback)(void *cookie,\n\t\t\t\t\t\t struct key_params*))\n{\n#if 0\n\tstruct iwm_priv *iwm = ndev_to_iwm(ndev);\n\tstruct iwm_key *key = &iwm->keys[key_index];\n\tstruct key_params params;\n\n\tIWM_DBG_WEXT(iwm, DBG, \"Getting key %d\\n\", key_index);\n\n\tmemset(&params, 0, sizeof(params));\n\n\tparams.cipher = key->cipher;\n\tparams.key_len = key->key_len;\n\tparams.seq_len = key->seq_len;\n\tparams.seq = key->seq;\n\tparams.key = key->key;\n\n\tcallback(cookie, &params);\n\n\treturn key->key_len ? 0 : -ENOENT;\n#endif\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t\t\tu8 key_index, bool pairwise, const u8 *mac_addr)\n#else\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\t\t\t\tu8 key_index, const u8 *mac_addr)\n#endif\t// (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\t\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\n\tDBG_871X(FUNC_NDEV_FMT\" key_index=%d\\n\", FUNC_NDEV_ARG(ndev), key_index);\n\n\tif (key_index == psecuritypriv->dot11PrivacyKeyIndex)\n\t{\n\t\t//clear the flag of wep default key set.\n\t\tpsecuritypriv->bWepDefaultKeyIdxSet = 0;\n\t}\n\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_set_default_key(struct wiphy *wiphy,\n\tstruct net_device *ndev, u8 key_index\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\n\t, bool unicast, bool multicast\n\t#endif\n\t)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\t\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\n#define SET_DEF_KEY_PARAM_FMT \" key_index=%d\"\n#define SET_DEF_KEY_PARAM_ARG , key_index\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) || defined(COMPAT_KERNEL_RELEASE)\n\t#define SET_DEF_KEY_PARAM_FMT_2_6_38 \", unicast=%d, multicast=%d\"\n\t#define SET_DEF_KEY_PARAM_ARG_2_6_38 , unicast, multicast\n#else\n\t#define SET_DEF_KEY_PARAM_FMT_2_6_38 \"\"\n\t#define SET_DEF_KEY_PARAM_ARG_2_6_38\n#endif\n\n\tDBG_871X(FUNC_NDEV_FMT\n\t\tSET_DEF_KEY_PARAM_FMT\n\t\tSET_DEF_KEY_PARAM_FMT_2_6_38\n\t\t\"\\n\", FUNC_NDEV_ARG(ndev)\n\t\tSET_DEF_KEY_PARAM_ARG\n\t\tSET_DEF_KEY_PARAM_ARG_2_6_38\n\t);\n\n\tif ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) //set wep default key\n\t{\n\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\n\t\tpsecuritypriv->dot11PrivacyKeyIndex = key_index;\n\n\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP40_;\n\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\t\tif (psecuritypriv->dot11DefKeylen[key_index] == 13)\n\t\t{\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP104_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t}\n\n\t\tpsecuritypriv->bWepDefaultKeyIdxSet = 1; //set the flag to represent that wep default key has been set\n\t}\n\n\treturn 0;\n\n}\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))\nstatic int cfg80211_rtw_set_rekey_data(struct wiphy *wiphy,\n\tstruct net_device *ndev,\n\tstruct cfg80211_gtk_rekey_data *data)\n{\n\t/*int i;*/\n\tstruct sta_info *psta;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv   *pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct security_priv *psecuritypriv = &(padapter->securitypriv);\n\n\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\n\tif (psta == NULL) {\n\t\tDBG_871X(\"%s, : Obtain Sta_info fail\\n\", __func__);\n\t\treturn -1;\n\t}\n\n\t_rtw_memcpy(psta->kek, data->kek, NL80211_KEK_LEN);\n\t/*printk(\"\\ncfg80211_rtw_set_rekey_data KEK:\");\n\tfor(i=0;i<NL80211_KEK_LEN; i++)\n\t\tprintk(\" %02x \", psta->kek[i]);*/\n\t_rtw_memcpy(psta->kck, data->kck, NL80211_KCK_LEN);\n\t/*printk(\"\\ncfg80211_rtw_set_rekey_data KCK:\");\n\tfor(i=0;i<NL80211_KCK_LEN; i++)\n\t\tprintk(\" %02x \", psta->kck[i]);*/\n\t_rtw_memcpy(psta->replay_ctr, data->replay_ctr, NL80211_REPLAY_CTR_LEN);\n\tpsecuritypriv->binstallKCK_KEK = _TRUE;\n\t/*printk(\"\\nREPLAY_CTR: \");\n\tfor(i=0;i<RTW_REPLAY_CTR_LEN; i++)\n\t\tprintk(\" %02x \", psta->replay_ctr[i]);*/\n\n\treturn 0;\n}\n#endif /*CONFIG_GTK_OL*/\nstatic int cfg80211_rtw_get_station(struct wiphy *wiphy,\n\t\t\t\tstruct net_device *ndev,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\n\t\t\t\tu8 *mac, \n#else\n\t\t\t\tconst u8 *mac,\n#endif\n\t\t\t\tstruct station_info *sinfo)\n{\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_info *psta = NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tsinfo->filled = 0;\n\n\tif (!mac) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" mac==%p\\n\", FUNC_NDEV_ARG(ndev), mac);\n\t\tret = -ENOENT;\n\t\tgoto exit;\n\t}\n\n\tpsta = rtw_get_stainfo(pstapriv, (u8 *)mac);\n\tif (psta == NULL) {\n\t\tDBG_8192C(\"%s, sta_info is null\\n\", __func__);\n\t\tret = -ENOENT;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_871X(FUNC_NDEV_FMT\" mac=\"MAC_FMT\"\\n\", FUNC_NDEV_ARG(ndev), MAC_ARG(mac));\n#endif\n\n\t//for infra./P2PClient mode\n\tif(\tcheck_fwstate(pmlmepriv, WIFI_STATION_STATE)\n\t\t&& check_fwstate(pmlmepriv, _FW_LINKED)\n\t)\n\t{\n\t\tstruct wlan_network  *cur_network = &(pmlmepriv->cur_network);\n\n\t\tif (_rtw_memcmp((u8 *)mac, cur_network->network.MacAddress, ETH_ALEN) == _FALSE) {\n\t\t\tDBG_871X(\"%s, mismatch bssid=\"MAC_FMT\"\\n\", __func__, MAC_ARG(cur_network->network.MacAddress));\n\t\t\tret = -ENOENT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tsinfo->filled |= STATION_INFO_SIGNAL;\n\t\tsinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);\n\n\t\tsinfo->filled |= STATION_INFO_TX_BITRATE;\n\t\tsinfo->txrate.legacy = rtw_get_cur_max_rate(padapter);\n\n\t\tsinfo->filled |= STATION_INFO_RX_PACKETS;\n\t\tsinfo->rx_packets = sta_rx_data_pkts(psta);\n\n\t\tsinfo->filled |= STATION_INFO_TX_PACKETS;\n\t\tsinfo->tx_packets = psta->sta_stats.tx_pkts;\n\n\t}\n\n\t//for Ad-Hoc/AP mode\n\tif ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)\n\t\t\t||check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)\n\t\t\t||check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\t&& check_fwstate(pmlmepriv, _FW_LINKED)\n\t)\n\t{\n\t\t//TODO: should acquire station info...\n\t}\n\nexit:\n\treturn ret;\n}\n\nextern int netdev_open(struct net_device *pnetdev);\n#ifdef CONFIG_CONCURRENT_MODE\nextern int netdev_if2_open(struct net_device *pnetdev);\n#endif\n\n/*\nenum nl80211_iftype {\n\tNL80211_IFTYPE_UNSPECIFIED,\n       NL80211_IFTYPE_ADHOC, //1\n       NL80211_IFTYPE_STATION, //2\n       NL80211_IFTYPE_AP, //3\n       NL80211_IFTYPE_AP_VLAN,\n       NL80211_IFTYPE_WDS,\n       NL80211_IFTYPE_MONITOR, //6\n       NL80211_IFTYPE_MESH_POINT,\n       NL80211_IFTYPE_P2P_CLIENT, //8\n\tNL80211_IFTYPE_P2P_GO, //9\n       //keep last \n       NUM_NL80211_IFTYPES,\n       NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1\n};\n*/\nstatic int cfg80211_rtw_change_iface(struct wiphy *wiphy,\n\t\t\t\t     struct net_device *ndev,\n\t\t\t\t     enum nl80211_iftype type,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0))\n\t\t\t\t     u32 *flags,\n#endif\n\t\t\t\t     struct vif_params *params)\n{\n\tenum nl80211_iftype old_type;\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networkType;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct wireless_dev *rtw_wdev = padapter->rtw_wdev;\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif\n\tint ret = 0;\n\tu8 change = _FALSE;\n\n\tDBG_871X(FUNC_NDEV_FMT\" type=%d\\n\", FUNC_NDEV_ARG(ndev), type);\n\n\tif(adapter_to_dvobj(padapter)->processing_dev_remove == _TRUE)\n\t{\n\t\tret= -EPERM;\n\t\tgoto exit;\n\t}\t\t\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->adapter_type == SECONDARY_ADAPTER)\n\t{\n\t\tDBG_871X(FUNC_NDEV_FMT\" call netdev_if2_open\\n\", FUNC_NDEV_ARG(ndev));\n\t\tif(netdev_if2_open(ndev) != 0) {\n\t\t\tDBG_871X(FUNC_NDEV_FMT\" call netdev_if2_open fail\\n\", FUNC_NDEV_ARG(ndev));\n\t\t\tret= -EPERM;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\telse if(padapter->adapter_type == PRIMARY_ADAPTER)\n#endif //CONFIG_CONCURRENT_MODE\n\t{\n\t\tDBG_871X(FUNC_NDEV_FMT\" call netdev_open\\n\", FUNC_NDEV_ARG(ndev));\n\t\tif(netdev_open(ndev) != 0) {\n\t\t\tDBG_871X(FUNC_NDEV_FMT\" call netdev_open fail\\n\", FUNC_NDEV_ARG(ndev));\n\t\t\tret= -EPERM;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" call rtw_pwr_wakeup fail\\n\", FUNC_NDEV_ARG(ndev));\n\t\tret= -EPERM;\n\t\tgoto exit;\n\t}\n\n\told_type = rtw_wdev->iftype;\n\tDBG_871X(FUNC_NDEV_FMT\" old_iftype=%d, new_iftype=%d\\n\",\n\t\tFUNC_NDEV_ARG(ndev), old_type, type);\n\n\tif(old_type != type)\n\t{\n\t\tchange = _TRUE;\n\t\tpmlmeext->action_public_rxseq = 0xffff;\n\t\tpmlmeext->action_public_dialog_token = 0xff;\n\t}\t\n\n\t/* initial default type */\n\tndev->type = ARPHRD_ETHER;\n\n\tswitch (type) {\n\tcase NL80211_IFTYPE_ADHOC:\n\t\tnetworkType = Ndis802_11IBSS;\n\t\tbreak;\n#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))\n\tcase NL80211_IFTYPE_P2P_CLIENT:\n#endif\n\tcase NL80211_IFTYPE_STATION:\n\t\tnetworkType = Ndis802_11Infrastructure;\n\t\t#ifdef CONFIG_P2P\n\t\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\tif(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t\t{\n\t\t\t\t//it means remove GO and change mode from AP(GO) to station(P2P DEVICE)\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);\n\t\t\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n\n\t\t\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d, pre_p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));\n\t\t\t}\n\t\t}\n\t\t#endif //CONFIG_P2P\n\t\tbreak;\n#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))\n\tcase NL80211_IFTYPE_P2P_GO:\n#endif\n\tcase NL80211_IFTYPE_AP:\n\t\tnetworkType = Ndis802_11APMode;\n\t\t#ifdef CONFIG_P2P\n\t\tif(pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\tif(change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t\t{\n\t\t\t\t//it means P2P Group created, we will be GO and change mode from  P2P DEVICE to AP(GO)\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t}\n\t\t}\n\t\t#endif //CONFIG_P2P\n\t\tbreak;\n\tcase NL80211_IFTYPE_MONITOR:\n\t\tnetworkType = Ndis802_11Monitor;\n#if 0\n\t\tndev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */\n#endif\n\t\tndev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */\n\t\tbreak;\n\tdefault:\n\t\tret = -EOPNOTSUPP;\n\t\tgoto exit;\n\t}\n\n\trtw_wdev->iftype = type;\n\t\n\tif (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE)\n\t{\n\t\trtw_wdev->iftype = old_type;\n\t\tret = -EPERM;\n\t\tgoto exit;\n\t}\n\n\trtw_setopmode_cmd(padapter, networkType, _TRUE);\n\t\nexit:\n\n\tDBG_871X(FUNC_NDEV_FMT\" ret:%d\\n\", FUNC_NDEV_ARG(ndev), ret);\n\treturn ret;\n}\n\nvoid rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted)\n{\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);\n\t_irqL\tirqL;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))\n\tstruct cfg80211_scan_info info;\n#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))\n\n\t_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\tif (pwdev_priv->scan_request != NULL) {\n\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(\"%s with scan req\\n\", __FUNCTION__);\n\t\t#endif\n\n\t\t/* avoid WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); */\n\t\tif(pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy)\n\t\t{\n\t\t\tDBG_8192C(\"error wiphy compare\\n\");\n\t\t}\n\t\telse\n\t\t{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))\n\t\t\tmemset(&info, 0, sizeof(info));\n\t\t\tinfo.aborted = aborted;\n\t\t\tcfg80211_scan_done(pwdev_priv->scan_request, &info);\n#else // (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))\n\t\t\tcfg80211_scan_done(pwdev_priv->scan_request, aborted);\n#endif // (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))\n\t\t}\n\n\t\tpwdev_priv->scan_request = NULL;\n\t} else {\n\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(\"%s without scan req\\n\", __FUNCTION__);\n\t\t#endif\n\t}\n\t_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n}\n\nu32 rtw_cfg80211_wait_scan_req_empty(_adapter *adapter, u32 timeout_ms)\n{\n\tstruct rtw_wdev_priv *wdev_priv = adapter_wdev_data(adapter);\n\tu8 empty = _FALSE;\n\tu32 start;\n\tu32 pass_ms;\n\n\tstart = rtw_get_current_time();\n\n\twhile (rtw_get_passing_time_ms(start) <= timeout_ms) {\n\n\t\tif (RTW_CANNOT_RUN(adapter))\n\t\t\tbreak;\n\n\t\tif (!wdev_priv->scan_request) {\n\t\t\tempty = _TRUE;\n\t\t\tbreak;\n\t\t}\n\n\t\trtw_msleep_os(10);\n\t}\n\n\tpass_ms = rtw_get_passing_time_ms(start);\n\n\tif (empty == _FALSE && pass_ms > timeout_ms)\n\t\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" pass_ms:%u, timeout\\n\"\n\t\t\t, FUNC_ADPT_ARG(adapter), pass_ms);\n\n\treturn pass_ms;\n}\n\nvoid rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork)\n{\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n\tstruct wiphy *wiphy = pwdev->wiphy;\n\tstruct cfg80211_bss *bss = NULL;\n\tWLAN_BSSID_EX select_network = pnetwork->network;\n\t\n\tbss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,\n\t\tselect_network.MacAddress, select_network.Ssid.Ssid,\n\t\tselect_network.Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/, \n\t\t0/*WLAN_CAPABILITY_ESS*/);\n\t\n\tif (bss) {\n\t\tcfg80211_unlink_bss(wiphy, bss);\n\t\tDBG_8192C(\"%s(): cfg80211_unlink %s!! () \",__func__,select_network.Ssid.Ssid );\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\n\t\tcfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);\n#else\n\t\tcfg80211_put_bss(bss);\n#endif\n\t}\n\treturn;\n}\n\nvoid rtw_cfg80211_surveydone_event_callback(_adapter *padapter)\n{\n\t_irqL\tirqL;\n\t_list\t\t\t\t\t*plist, *phead;\t\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\t_queue\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\t\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tu32 cnt=0;\n\tu32 wait_for_surveydone;\n\tsint wait_status;\n#ifdef CONFIG_P2P\n\tstruct\twifidirect_info*\tpwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"%s\\n\", __func__);\n#endif\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//report network only if the current channel set contains the channel to which this network belongs\n\t\tif(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0\n\t\t\t&& rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE\n\t\t\t&& _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))\n\t\t)\n\t\t{\t\t\n\t\t\t//ev=translate_scan(padapter, a, pnetwork, ev, stop);\n\t\t\trtw_cfg80211_inform_bss(padapter, pnetwork);\t\t\n\t\t}\n\t\t/* //check ralink testbed RSN IE length\n\t\t{\n\t\t\tif(_rtw_memcmp(pnetwork->network.Ssid.Ssid, \"Ralink_11n_AP\",13))\n\t\t\t{\n\t\t\t\tuint ie_len=0;\n\t\t\t\tu8 *p=NULL;\n\t\t\t\tp = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_));\n\t\t\t\tDBG_871X(\"ie_len=%d\\n\", ie_len);\n\t\t\t}\n\t\t}*/\n\t\tplist = get_next(plist);\n\t\n\t}\n\t\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n}\n\nstatic int rtw_cfg80211_set_probe_req_wpsp2pie(_adapter *padapter, char *buf, int len)\n{\n\tint ret = 0;\n\tuint wps_ielen = 0;\n\tu8 *wps_ie;\n\tu32\tp2p_ielen = 0;\t\n\tu8 *p2p_ie;\n\tu32\twfd_ielen = 0;\t\n\tu8 *wfd_ie;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"%s, ielen=%d\\n\", __func__, len);\n#endif\n\t\n\tif(len>0)\n\t{\n\t\tif((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))\n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"probe_req_wps_ielen=%d\\n\", wps_ielen);\n\t\t\t#endif\n\t\t\t\n\t\t\tif(pmlmepriv->wps_probe_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wps_probe_req_ie_len;\n\t\t\t\tpmlmepriv->wps_probe_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);\n\t\t\t\tpmlmepriv->wps_probe_req_ie = NULL;\t\t\t\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wps_probe_req_ie = rtw_malloc(wps_ielen);\n\t\t\tif ( pmlmepriv->wps_probe_req_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\t_rtw_memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen);\n\t\t\tpmlmepriv->wps_probe_req_ie_len = wps_ielen;\n\t\t}\n\n\t\t//buf += wps_ielen;\n\t\t//len -= wps_ielen;\n\n\t\t#ifdef CONFIG_P2P\n\t\tif((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) \n\t\t{\n\t\t\tstruct wifidirect_info *wdinfo = &padapter->wdinfo;\n\t\t\tu32 attr_contentlen = 0;\n\t\t\tu8 listen_ch_attr[5];\n\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"probe_req_p2p_ielen=%d\\n\", p2p_ielen);\n\t\t\t#endif\n\t\t\t\n\t\t\tif(pmlmepriv->p2p_probe_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->p2p_probe_req_ie_len;\n\t\t\t\tpmlmepriv->p2p_probe_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->p2p_probe_req_ie, free_len);\n\t\t\t\tpmlmepriv->p2p_probe_req_ie = NULL;\n\t\t\t}\t\n\n\t\t\tpmlmepriv->p2p_probe_req_ie = rtw_malloc(p2p_ielen);\n\t\t\tif ( pmlmepriv->p2p_probe_req_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\t_rtw_memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen);\n\t\t\tpmlmepriv->p2p_probe_req_ie_len = p2p_ielen;\n\n\t\t\tif(rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_LISTEN_CH, (u8*)listen_ch_attr, (uint*) &attr_contentlen)\n\t\t\t\t&& attr_contentlen == 5)\n\t\t\t{\n\t\t\t\tif (wdinfo->listen_channel !=  listen_ch_attr[4]) {\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT\" listen channel - country:%c%c%c, class:%u, ch:%u\\n\",\n\t\t\t\t\t\tFUNC_ADPT_ARG(padapter), listen_ch_attr[0], listen_ch_attr[1], listen_ch_attr[2],\n\t\t\t\t\t\tlisten_ch_attr[3], listen_ch_attr[4]);\n\t\t\t\t\twdinfo->listen_channel = listen_ch_attr[4];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#endif //CONFIG_P2P\n\t\t\n\t\t//buf += p2p_ielen;\n\t\t//len -= p2p_ielen;\n\n\t\t#ifdef CONFIG_WFD\n\t\tif(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) \n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"probe_req_wfd_ielen=%d\\n\", wfd_ielen);\n\t\t\t#endif\n\t\t\t\n\t\t\tif(pmlmepriv->wfd_probe_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wfd_probe_req_ie_len;\n\t\t\t\tpmlmepriv->wfd_probe_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wfd_probe_req_ie, free_len);\n\t\t\t\tpmlmepriv->wfd_probe_req_ie = NULL;\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wfd_probe_req_ie = rtw_malloc(wfd_ielen);\n\t\t\tif ( pmlmepriv->wfd_probe_req_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\trtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, &pmlmepriv->wfd_probe_req_ie_len);\t\t\t\n\t\t}\n\t\t#endif //CONFIG_WFD\n\t\t\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int cfg80211_rtw_scan(struct wiphy *wiphy\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))\n\t, struct net_device *ndev\n\t#endif\n\t, struct cfg80211_scan_request *request)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(request->wdev);\n#endif\n\tint i;\n\tu8 _status = _FALSE;\n\tint ret = 0;\t\n\tNDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];\n\tstruct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];\n\t_irqL\tirqL;\n\tu8 *wps_ie=NULL;\n\tuint wps_ielen=0;\t\n\tu8 *p2p_ie=NULL;\n\tuint p2p_ielen=0;\n\tu8 survey_times=3;\n\tu8 survey_times_for_one_ch=6;\n\tstruct cfg80211_ssid *ssids = request->ssids;\n\tint social_channel = 0, j = 0;\n\tbool need_indicate_scan_done = _FALSE;\n\tbool ps_denied = _FALSE;\n\n\t_adapter *padapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\tstruct mlme_priv *pmlmepriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo;\n#endif //CONFIG_P2P\n#ifdef CONFIG_CONCURRENT_MODE\t\n\tPADAPTER pbuddy_adapter = NULL;\n\tstruct mlme_priv *pbuddy_mlmepriv = NULL;\n#endif //CONFIG_CONCURRENT_MODE\n\n\tif (ndev == NULL) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tpadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(padapter);\n\tpmlmepriv= &padapter->mlmepriv;\n#ifdef CONFIG_P2P\n\tpwdinfo= &(padapter->wdinfo);\t\n#endif //CONFIG_P2P\n\n//#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n//#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter) {\n\t\tpbuddy_adapter = padapter->pbuddy_adapter;\n\t\tpbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);\t\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n\n#ifdef CONFIG_MP_INCLUDED\nif (padapter->registrypriv.mp_mode == 1)\n{\n\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block Scan request\\n\", FUNC_ADPT_ARG(padapter));  \n\t\tret = -EPERM;\n\t\tgoto exit;\n}\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter) {\n\t\tif (padapter->pbuddy_adapter->registrypriv.mp_mode == 1)\n\t\t{\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block Scan request\\n\", FUNC_ADPT_ARG(padapter->pbuddy_adapter));\n\t\t\tret = -EPERM;\n\t\t\tgoto exit;\n\t\t}\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n#endif\n\n\t_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\tpwdev_priv->scan_request = request;\n\t_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\n\tif (adapter_wdev_data(padapter)->block_scan == _TRUE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" wdev_priv.block_scan is set\\n\", FUNC_ADPT_ARG(padapter));\n\t\tneed_indicate_scan_done = _TRUE;\n\t\tgoto check_need_indicate_scan_done;\n\t}\n\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(\"%s under WIFI_AP_STATE\\n\", __FUNCTION__);\n#endif\n\n\t\tif (check_fwstate(pmlmepriv, WIFI_UNDER_WPS|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)\n\t\t{\n\t\t\tDBG_8192C(\"%s, fwstate=0x%x\\n\", __func__, pmlmepriv->fw_state);\n\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))\n\t\t\t{\n\t\t\t\tDBG_8192C(\"AP mode process WPS \\n\");\n\t\t\t}\n\t\t\t\n\t\t\tneed_indicate_scan_done = _TRUE;\n\t\t\tgoto check_need_indicate_scan_done;\n\t\t} \n\t}\n\n\trtw_ps_deny(padapter, PS_DENY_SCAN);\n\tps_denied = _TRUE;\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tneed_indicate_scan_done = _TRUE;\n\t\tgoto check_need_indicate_scan_done;\n\t}\n\n\t#ifdef CONFIG_P2P\n\tif( pwdinfo->driver_interface == DRIVER_CFG80211 )\n\t{\n\t\tif(ssids->ssid != NULL\n\t\t\t&& _rtw_memcmp(ssids->ssid, \"DIRECT-\", 7)\n\t\t\t&& rtw_get_p2p_ie((u8 *)request->ie, request->ie_len, NULL, NULL)\n\t\t)\n\t\t{\n\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t\t{\n\t\t\t\trtw_p2p_enable(padapter, P2P_ROLE_DEVICE);\n\t\t\t\tadapter_wdev_data(padapter)->p2p_enabled = _TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));\n\t\t\t\t#endif\n\t\t\t}\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\n\t\t\n\t\t\tif(request->n_channels == 3 &&\n\t\t\t\trequest->channels[0]->hw_value == 1 &&\n\t\t\t\trequest->channels[1]->hw_value == 6 &&\n\t\t\t\trequest->channels[2]->hw_value == 11\n\t\t\t)\n\t\t\t{\n\t\t\t\tsocial_channel = 1;\n\t\t\t}\n\t\t}\n\t}\n\t#endif //CONFIG_P2P\n\n\tif(request->ie && request->ie_len>0)\n\t{\n\t\trtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len );\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tDBG_8192C(\"%s, fwstate=0x%x\\n\", __func__, pmlmepriv->fw_state);\n\t\tneed_indicate_scan_done = _TRUE;\n\t\tgoto check_need_indicate_scan_done;\n\t} else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tDBG_8192C(\"%s, fwstate=0x%x\\n\", __func__, pmlmepriv->fw_state);\n\t\tret = -EBUSY;\n\t\tgoto check_need_indicate_scan_done;\n\t}\n\n\tif (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)\n\t{\n#if 1 // Miracast can't do AP scan\n\t\tstatic u32 lastscantime = 0;\n\t\tu32 passtime;\n\n\t\tpasstime = rtw_get_passing_time_ms(lastscantime);\n\t\tlastscantime = rtw_get_current_time();\n\t\tif (passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD)\n#endif\n\t\t{\n\t\t\tDBG_871X(\"%s: bBusyTraffic == _TRUE\\n\", __FUNCTION__);\n\t\t\tneed_indicate_scan_done = _TRUE;\n\t\t\tgoto check_need_indicate_scan_done;\n\t\t}\n\t}\n\n\tif (rtw_is_scan_deny(padapter)){\n\t\tDBG_871X(FUNC_ADPT_FMT  \": scan deny\\n\", FUNC_ADPT_ARG(padapter));\n\t\tneed_indicate_scan_done = _TRUE;\n\t\tgoto check_need_indicate_scan_done;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(pbuddy_mlmepriv && (pbuddy_mlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE))\t\n\t{\n#if 1 // Miracast can't do AP scan\n\t\tstatic u32 buddylastscantime = 0;\n\t\tu32 passtime;\n\n\t\tpasstime = rtw_get_passing_time_ms(buddylastscantime);\n\t\tbuddylastscantime = rtw_get_current_time();\n\t\tif ((passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD)\n//#ifdef CONFIG_P2P\n//\t\t\t||(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))\n//#endif //CONFIG_P2P\n\t\t)\n#endif\n\t\t{\n\t\t\tDBG_871X(\"%s: bBusyTraffic == _TRUE at buddy_intf\\n\", __FUNCTION__);\n\t\t\tneed_indicate_scan_done = _TRUE;\n\t\t\tgoto check_need_indicate_scan_done;\n\t\t}\n\t}\n\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE) {\n\t\tDBG_871X(\"buddy_intf's mlme state:0x%x\\n\", pbuddy_mlmepriv->fw_state);\n\t\tneed_indicate_scan_done = _TRUE;\n\t\tgoto check_need_indicate_scan_done;\n\n\t} else if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY)) {\n\t\tbool scan_via_buddy = _FALSE;\n\t\tstruct rtw_wdev_priv *buddy_wdev_priv = adapter_wdev_data(pbuddy_adapter);\n\n\t\t_enter_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\t\t_enter_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\t\tif (buddy_wdev_priv->scan_request) {\n\t\t\tDBG_871X(\"scan via buddy\\n\");\n\t\t\tpmlmepriv->scanning_via_buddy_intf = _TRUE;\n\t\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\tset_fwstate(pmlmepriv, _FW_UNDER_SURVEY);\n\t\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\tscan_via_buddy = _TRUE;\n\t\t}\n\t\t_exit_critical_bh(&buddy_wdev_priv->scan_req_lock, &irqL);\n\t\t_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\n\n\t\tif (scan_via_buddy == _FALSE)\n\t\t\tneed_indicate_scan_done = _TRUE;\n\n\t\tgoto check_need_indicate_scan_done;\n\t}\n#endif /* CONFIG_CONCURRENT_MODE */\n\n#ifdef CONFIG_P2P\n\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t{\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\n\t\trtw_free_network_queue(padapter, _TRUE);\n\n\t\tif(social_channel == 0)\n\t\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\n\t\telse\n\t\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\n\t}\n#endif //CONFIG_P2P\n\n\n\t_rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT);\n\t//parsing request ssids, n_ssids\n\tfor (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) {\n\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_8192C(\"ssid=%s, len=%d\\n\", ssids[i].ssid, ssids[i].ssid_len);\n\t\t#endif\n\t\t_rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len);\n\t\tssid[i].SsidLength = ssids[i].ssid_len;\t\n\t}\n\n\t/* parsing channels, n_channels */\n\t_rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT);\n\tfor (i=0;i<request->n_channels && i<RTW_CHANNEL_SCAN_AMOUNT;i++) {\n\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_871X(FUNC_ADPT_FMT CHAN_FMT\"\\n\", FUNC_ADPT_ARG(padapter), CHAN_ARG(request->channels[i]));\n\t\t#endif\n\t\tch[i].hw_value = request->channels[i]->hw_value;\n\t\tch[i].flags = request->channels[i]->flags;\n\t}\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tif (request->n_channels == 1) {\n\t\tfor(i=1;i<survey_times_for_one_ch;i++)\n\t\t\t_rtw_memcpy(&ch[i], &ch[0], sizeof(struct rtw_ieee80211_channel));\n\t\t_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times_for_one_ch);\n\t} else if (request->n_channels <= 4) {\n\t\tfor(j=request->n_channels-1;j>=0;j--)\n\t\t\tfor(i=0;i<survey_times;i++)\n\t\t{\n\t\t\t_rtw_memcpy(&ch[j*survey_times+i], &ch[j], sizeof(struct rtw_ieee80211_channel));\n\t\t}\n\t\t_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * request->n_channels);\n\t} else {\n\t\t_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0);\n\t}\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n\n\tif(_status == _FALSE)\n\t{\n\t\tret = -1;\n\t}\n\ncheck_need_indicate_scan_done:\n\tif (_TRUE == need_indicate_scan_done)\n\t{\n\t\trtw_cfg80211_surveydone_event_callback(padapter);\n\t\trtw_cfg80211_indicate_scan_done(padapter, _FALSE);\n\t}\n\ncancel_ps_deny:\n\tif (ps_denied == _TRUE)\n\t\trtw_ps_deny_cancel(padapter, PS_DENY_SCAN);\n\nexit:\n\treturn ret;\n\t\n}\n\nstatic int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed)\n{\n#if 0\n\tstruct iwm_priv *iwm = wiphy_to_iwm(wiphy);\n\n\tif (changed & WIPHY_PARAM_RTS_THRESHOLD &&\n\t    (iwm->conf.rts_threshold != wiphy->rts_threshold)) {\n\t\tint ret;\n\n\t\tiwm->conf.rts_threshold = wiphy->rts_threshold;\n\n\t\tret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,\n\t\t\t\t\t     CFG_RTS_THRESHOLD,\n\t\t\t\t\t     iwm->conf.rts_threshold);\n\t\tif (ret < 0)\n\t\t\treturn ret;\n\t}\n\n\tif (changed & WIPHY_PARAM_FRAG_THRESHOLD &&\n\t    (iwm->conf.frag_threshold != wiphy->frag_threshold)) {\n\t\tint ret;\n\n\t\tiwm->conf.frag_threshold = wiphy->frag_threshold;\n\n\t\tret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX,\n\t\t\t\t\t     CFG_FRAG_THRESHOLD,\n\t\t\t\t\t     iwm->conf.frag_threshold);\n\t\tif (ret < 0)\n\t\t\treturn ret;\n\t}\n#endif\n\tDBG_8192C(\"%s\\n\", __func__);\n\treturn 0;\n}\n\n\n\nstatic int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version)\n{\t\n\tDBG_8192C(\"%s, wpa_version=%d\\n\", __func__, wpa_version);\n\t\n\tif (!wpa_version) {\t\t\n\t\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;\t\t\n\t\treturn 0;\n\t}\n\n\n\tif (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2))\n\t{\t\t\n\t\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK;\t\t\n\t}\n\n/*\n\tif (wpa_version & NL80211_WPA_VERSION_2)\n\t{\t\t\n\t\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;\n\t}\n*/\n\n\t#ifdef CONFIG_WAPI_SUPPORT\n\tif (wpa_version & NL80211_WAPI_VERSION_1)\n\t{\n\t\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeWAPI;\n\t}\n\t#endif\n\n\treturn 0;\n\n}\n\nstatic int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv,\n\t\t\t     enum nl80211_auth_type sme_auth_type)\n{\n\tDBG_8192C(\"%s, nl80211_auth_type=%d\\n\", __func__, sme_auth_type);\n\n\n\tswitch (sme_auth_type) {\n\tcase NL80211_AUTHTYPE_AUTOMATIC:\n\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n\n\t\tbreak;\n\tcase NL80211_AUTHTYPE_OPEN_SYSTEM:\n\t\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;\n\n\t\tif(psecuritypriv->ndisauthtype>Ndis802_11AuthModeWPA)\n\t\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;\n\t\t\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif(psecuritypriv->ndisauthtype == Ndis802_11AuthModeWAPI)\n\t\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI;\n#endif\n\n\t\tbreak;\n\tcase NL80211_AUTHTYPE_SHARED_KEY:\n\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared;\n\n\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\n\n\t\tbreak;\n\tdefault:\t\t\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;\n\t\t//return -ENOTSUPP;\n\t}\n\n\treturn 0;\n\n}\n\nstatic int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, u32 cipher, bool ucast)\n{\n\tu32 ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\n\tu32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm :\n\t\t&psecuritypriv->dot118021XGrpPrivacy;\n\n\tDBG_8192C(\"%s, ucast=%d, cipher=0x%x\\n\", __func__, ucast, cipher);\n\n\n\tif (!cipher) {\n\t\t*profile_cipher = _NO_PRIVACY_;\n\t\tpsecuritypriv->ndisencryptstatus = ndisencryptstatus;\n\t\treturn 0;\n\t}\n\t\n\tswitch (cipher) {\n\tcase IW_AUTH_CIPHER_NONE:\n\t\t*profile_cipher = _NO_PRIVACY_;\n\t\tndisencryptstatus = Ndis802_11EncryptionDisabled;\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif(psecuritypriv->dot11PrivacyAlgrthm ==_SMS4_ )\n\t\t{\n\t\t\t*profile_cipher = _SMS4_;\n\t\t}\n#endif\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_WEP40:\n\t\t*profile_cipher = _WEP40_;\n\t\tndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_WEP104:\n\t\t*profile_cipher = _WEP104_;\n\t\tndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_TKIP:\n\t\t*profile_cipher = _TKIP_;\n\t\tndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\tbreak;\n\tcase WLAN_CIPHER_SUITE_CCMP:\n\t\t*profile_cipher = _AES_;\n\t\tndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\tbreak;\n#ifdef CONFIG_WAPI_SUPPORT\n\tcase WLAN_CIPHER_SUITE_SMS4:\n\t\t*profile_cipher = _SMS4_;\n\t\tndisencryptstatus = Ndis802_11_EncrypteionWAPI;\n\t\tbreak;\n#endif\n\tdefault:\n\t\tDBG_8192C(\"Unsupported cipher: 0x%x\\n\", cipher);\n\t\treturn -ENOTSUPP;\n\t}\n\n\tif(ucast)\n\t{\n\t\tpsecuritypriv->ndisencryptstatus = ndisencryptstatus;\n\t\t\n\t\t//if(psecuritypriv->dot11PrivacyAlgrthm >= _AES_)\n\t\t//\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;\n\t}\t\n\n\treturn 0;\n}\n\nstatic int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, u32 key_mgt)\n{\n\tDBG_8192C(\"%s, key_mgt=0x%x\\n\", __func__, key_mgt);\n\n\tif (key_mgt == WLAN_AKM_SUITE_8021X)\n\t\t//*auth_type = UMAC_AUTH_TYPE_8021X;\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;\n\telse if (key_mgt == WLAN_AKM_SUITE_PSK) {\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;\n\t}\n#ifdef CONFIG_WAPI_SUPPORT\n\telse if(key_mgt ==WLAN_AKM_SUITE_WAPI_PSK){\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI;\n\t}\n\telse if(key_mgt ==WLAN_AKM_SUITE_WAPI_CERT){\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI;\n\t}\n#endif\n\n\n\telse {\n\t\tDBG_8192C(\"Invalid key mgt: 0x%x\\n\", key_mgt);\n\t\t//return -EINVAL;\n\t}\n\n\treturn 0;\n}\n\nstatic int rtw_cfg80211_set_wpa_ie(_adapter *padapter, u8 *pie, size_t ielen)\n{\n\tu8 *buf=NULL, *pos=NULL;\t\n\tu32 left; \t\n\tint group_cipher = 0, pairwise_cipher = 0;\n\tint ret = 0;\n\tint wpa_ielen=0;\n\tint wpa2_ielen=0;\n\tu8 *pwpa, *pwpa2;\n\tu8 null_addr[]= {0,0,0,0,0,0};\n\n\tif (pie == NULL || !ielen) {\n\t\t/* Treat this as normal case, but need to clear WIFI_UNDER_WPS */\n\t\t_clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\tgoto exit;\n\t}\n\n\tif (ielen > MAX_WPA_IE_LEN+MAX_WPS_IE_LEN+MAX_P2P_IE_LEN) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tbuf = rtw_zmalloc(ielen);\n\tif (buf == NULL){\n\t\tret =  -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memcpy(buf, pie , ielen);\n\n\t//dump\n\t{\n\t\tint i;\n\t\tDBG_8192C(\"set wpa_ie(length:%zu):\\n\", ielen);\n\t\tfor(i=0;i<ielen;i=i+8)\n\t\t\tDBG_8192C(\"0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \\n\",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5],buf[i+6],buf[i+7]);\n\t}\n\n\tpos = buf;\n\tif(ielen < RSN_HEADER_LEN){\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"Ie len too short %d\\n\", ielen));\n\t\tret  = -1;\n\t\tgoto exit;\n\t}\n\n\tpwpa = rtw_get_wpa_ie(buf, &wpa_ielen, ielen);\n\tif(pwpa && wpa_ielen>0)\n\t{\n\t\tif(rtw_parse_wpa_ie(pwpa, wpa_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\tpadapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK;\n\t\t\t_rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], wpa_ielen+2);\n\t\t\t\n\t\t\tDBG_8192C(\"got wpa_ie, wpa_ielen:%u\\n\", wpa_ielen);\n\t\t}\n\t}\n\n\tpwpa2 = rtw_get_wpa2_ie(buf, &wpa2_ielen, ielen);\n\tif(pwpa2 && wpa2_ielen>0)\n\t{\n\t\tif(rtw_parse_wpa2_ie(pwpa2, wpa2_ielen+2, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\tpadapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK;\t\n\t\t\t_rtw_memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], wpa2_ielen+2);\n\n\t\t\tDBG_8192C(\"got wpa2_ie, wpa2_ielen:%u\\n\", wpa2_ielen);\n\t\t}\n\t}\n\n\tif (group_cipher == 0)\n\t{\n\t\tgroup_cipher = WPA_CIPHER_NONE;\n\t}\n\tif (pairwise_cipher == 0)\n\t{\n\t\tpairwise_cipher = WPA_CIPHER_NONE;\n\t}\n\t\n\tswitch(group_cipher)\n\t{\n\t\tcase WPA_CIPHER_NONE:\n\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_WEP40:\n\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_TKIP:\n\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_TKIP_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_CCMP:\n\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_AES_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_WEP104:\t\n\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tbreak;\n\t}\n\n\tswitch(pairwise_cipher)\n\t{\n\t\tcase WPA_CIPHER_NONE:\n\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_WEP40:\n\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_TKIP:\n\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_CCMP:\n\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_AES_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\t\tbreak;\n\t\tcase WPA_CIPHER_WEP104:\t\n\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tbreak;\n\t}\n\t\n\t{/* handle wps_ie */\n\t\tuint wps_ielen;\t\n\t\tu8 *wps_ie;\n\n\t\twps_ie = rtw_get_wps_ie(buf, ielen, NULL, &wps_ielen);\n\t\tif (wps_ie && wps_ielen > 0) {\n\t\t\tDBG_8192C(\"got wps_ie, wps_ielen:%u\\n\", wps_ielen);\n\t\t\tpadapter->securitypriv.wps_ie_len = wps_ielen<MAX_WPS_IE_LEN?wps_ielen:MAX_WPS_IE_LEN;\n\t\t\t_rtw_memcpy(padapter->securitypriv.wps_ie, wps_ie, padapter->securitypriv.wps_ie_len);\n\t\t\tset_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\t} else {\n\t\t\t_clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\t}\n\t}\n\n\t#ifdef CONFIG_P2P\n\t{//check p2p_ie for assoc req; \n\t\tuint p2p_ielen=0;\n\t\tu8 *p2p_ie;\n\t\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\t\tif((p2p_ie=rtw_get_p2p_ie(buf, ielen, NULL, &p2p_ielen)))\n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"%s p2p_assoc_req_ielen=%d\\n\", __FUNCTION__, p2p_ielen);\n\t\t\t#endif\n\n\t\t\tif(pmlmepriv->p2p_assoc_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->p2p_assoc_req_ie_len;\n\t\t\t\tpmlmepriv->p2p_assoc_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->p2p_assoc_req_ie, free_len);\n\t\t\t\tpmlmepriv->p2p_assoc_req_ie = NULL;\n\t\t\t}\n\n\t\t\tpmlmepriv->p2p_assoc_req_ie = rtw_malloc(p2p_ielen);\n\t\t\tif ( pmlmepriv->p2p_assoc_req_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\t_rtw_memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen);\n\t\t\tpmlmepriv->p2p_assoc_req_ie_len = p2p_ielen;\n\t\t}\n\t}\n\t#endif //CONFIG_P2P\n\n\t#ifdef CONFIG_WFD\n\t{//check wfd_ie for assoc req; \n\t\tuint wfd_ielen=0;\n\t\tu8 *wfd_ie;\n\t\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\t\tif(rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen))\n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"%s wfd_assoc_req_ielen=%d\\n\", __FUNCTION__, wfd_ielen);\n\t\t\t#endif\n\n\t\t\tif(pmlmepriv->wfd_assoc_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wfd_assoc_req_ie_len;\n\t\t\t\tpmlmepriv->wfd_assoc_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wfd_assoc_req_ie, free_len);\n\t\t\t\tpmlmepriv->wfd_assoc_req_ie = NULL;\n\t\t\t}\n\n\t\t\tpmlmepriv->wfd_assoc_req_ie = rtw_malloc(wfd_ielen);\n\t\t\tif ( pmlmepriv->wfd_assoc_req_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\trtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, &pmlmepriv->wfd_assoc_req_ie_len);\t\t\t\n\t\t}\n\t}\n\t#endif //CONFIG_WFD\n\n\t//TKIP and AES disallow multicast packets until installing group key\n\tif(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_\n\t\t|| padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_\n\t\t|| padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)\n\t\t//WPS open need to enable multicast\n\t\t//|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE)\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr);\n\n\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t(\"rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\\n\",\n\t\tpairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype));\n\nexit:\n\tif (buf)\n\t\trtw_mfree(buf, ielen);\n\tif (ret)\n\t\t_clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t\t  struct cfg80211_ibss_params *params)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tNDIS_802_11_SSID ndis_ssid;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network));\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))\n\tstruct cfg80211_chan_def *pch_def;\n#endif\n\tstruct ieee80211_channel *pch;\n\tint ret=0;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))\n\tpch_def = (struct cfg80211_chan_def *)(&params->chandef); \n\tpch = (struct ieee80211_channel *) pch_def->chan;\n#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31))\n\tpch = (struct ieee80211_channel *)(params->channel); \n#endif\n\t\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tret= -EPERM;\n\t\tgoto exit;\n\t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\tret = -EPERM;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) {\n\t\tDBG_8192C(\"%s, but buddy_intf is under linking\\n\", __FUNCTION__);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) {\n\t\trtw_scan_abort(padapter->pbuddy_adapter);\n\t}\n#endif //CONFIG_CONCURRENT_MODE\n\t\n\tif (!params->ssid || !params->ssid_len)\n\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (params->ssid_len > IW_ESSID_MAX_SIZE){\n\n\t\tret= -E2BIG;\n\t\tgoto exit;\n\t}\n\t\n\t_rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));\t\t\t\n\tndis_ssid.SsidLength = params->ssid_len;\n\t_rtw_memcpy(ndis_ssid.Ssid, (u8 *)params->ssid, params->ssid_len);\n\n\t//DBG_8192C(\"ssid=%s, len=%zu\\n\", ndis_ssid.Ssid, params->ssid_len);\n\t\n\tpsecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\tpsecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;\n\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system\n\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;\n\t\n\tret = rtw_cfg80211_set_auth_type(psecuritypriv, NL80211_AUTHTYPE_OPEN_SYSTEM);\n\trtw_set_802_11_authentication_mode(padapter, psecuritypriv->ndisauthtype);\n\n\tDBG_871X(\"%s: center_freq = %d\\n\", __func__, pch->center_freq);\n\tpmlmeext->cur_channel = rtw_freq2ch(pch->center_freq);\n\t\n\tif (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) \n\t{\n\t\tret = -1;\n\t\tgoto exit;\n\t}\t\n\t\nexit:\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct wireless_dev *rtw_wdev = padapter->rtw_wdev;\n\tenum nl80211_iftype old_type;\n\tint ret = 0;\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _TRUE;\n\t#endif\n\t\n\told_type = rtw_wdev->iftype;\n\t\n\trtw_set_to_roam(padapter, 0);\n\n\tif(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) \n\t{\n\t\trtw_scan_abort(padapter);\n\t\tLeaveAllPowerSaveMode(padapter);\n\t\t\n\t\trtw_wdev->iftype = NL80211_IFTYPE_STATION;\n\t\t\n\t\tif (rtw_set_802_11_infrastructure_mode(padapter, Ndis802_11Infrastructure) ==_FALSE)\n\t\t{\n\t\t\trtw_wdev->iftype = old_type;\n\t\t\tret = -EPERM;\n\t\t\tgoto leave_ibss;\n\t\t}\n\t\trtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_TRUE);\t\n\t}\n\nleave_ibss:\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _FALSE;\n\t#endif\n\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t\t struct cfg80211_connect_params *sme)\n{\n\tint ret=0;\n\t_irqL irqL;\t\n\t_list *phead;\t\n\tstruct wlan_network *pnetwork = NULL;\n\tNDIS_802_11_AUTHENTICATION_MODE authmode;\t\n\tNDIS_802_11_SSID ndis_ssid;\t\n\tu8 *dst_ssid, *src_ssid;\n\tu8 *dst_bssid, *src_bssid;\n\t//u8 matched_by_bssid=_FALSE;\n\t//u8 matched_by_ssid=_FALSE;\n\tu8 matched=_FALSE;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\t_queue *queue = &pmlmepriv->scanned_queue;\t\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _TRUE;\n\t#endif\n\t\n\tDBG_871X(\"=>\"FUNC_NDEV_FMT\" - Start to Connection\\n\", FUNC_NDEV_ARG(ndev));\n\tDBG_871X(\"privacy=%d, key=%p, key_len=%d, key_idx=%d, auth_type=%d\\n\",\n\t\tsme->privacy, sme->key, sme->key_len, sme->key_idx, sme->auth_type);\n\n\n\tif(adapter_wdev_data(padapter)->block == _TRUE)\n\t{\n\t\tret = -EBUSY;\n\t\tDBG_871X(\"%s wdev_priv.block is set\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_PLATFORM_MSTAR_SCAN_BEFORE_CONNECT\n\tprintk(\"MStar Android!\\n\");\n\tif(adapter_wdev_data(padapter)->bandroid_scan == _FALSE)\n\t{\n#ifdef CONFIG_P2P\n\t\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\t\n\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n#endif //CONFIG_P2P\n\t\t{\n\t\t\tret = -EBUSY;\n\t\t\tprintk(\"Android hasn't attached yet!\\n\");\n\t\t\tgoto exit;\n\t\t}\t\n\t}\n#endif\n\n\trtw_ps_deny(padapter, PS_DENY_JOIN);\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tret= -EPERM;\n\t\tgoto exit;\n\t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\tret = -EPERM;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) {\n\t\tDBG_8192C(\"%s, but buddy_intf is under linking\\n\", __FUNCTION__);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) {\n\t\trtw_scan_abort(padapter->pbuddy_adapter);\n\t}\n#endif\n\n\tif (!sme->ssid || !sme->ssid_len)\n\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (sme->ssid_len > IW_ESSID_MAX_SIZE){\n\n\t\tret= -E2BIG;\n\t\tgoto exit;\n\t}\n\t\n\t_rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));\t\t\t\n\tndis_ssid.SsidLength = sme->ssid_len;\n\t_rtw_memcpy(ndis_ssid.Ssid, (u8 *)sme->ssid, sme->ssid_len);\n\n\tDBG_8192C(\"ssid=%s, len=%zu\\n\", ndis_ssid.Ssid, sme->ssid_len);\n\t\n\n\tif (sme->bssid)\n\t\tDBG_8192C(\"bssid=\"MAC_FMT\"\\n\", MAC_ARG(sme->bssid));\n\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tret = -EBUSY;\n\t\tDBG_8192C(\"%s, fw_state=0x%x, goto exit\\n\", __FUNCTION__, pmlmepriv->fw_state);\n\t\tgoto exit;\t\t\n\t}\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\trtw_scan_abort(padapter);\n\t}\n\n\tpsecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\tpsecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;\n\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system\n\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\t padapter->wapiInfo.bWapiEnable = false;\n#endif\n\n\tret = rtw_cfg80211_set_wpa_version(psecuritypriv, sme->crypto.wpa_versions);\n\tif (ret < 0)\n\t\tgoto exit;\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif(sme->crypto.wpa_versions & NL80211_WAPI_VERSION_1)\n\t{\n\t\tpadapter->wapiInfo.bWapiEnable = true;\n\t\tpadapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;\n\t\tpadapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;\n\t}\n#endif\n\n\tret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type);\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_WAPI)\n\t\tpadapter->mlmeextpriv.mlmext_info.auth_algo = psecuritypriv->dot11AuthAlgrthm;\n#endif\n\n\n\tif (ret < 0)\n\t\tgoto exit;\n\n\tDBG_8192C(\"%s, ie_len=%zu\\n\", __func__, sme->ie_len);\n\t\t\t\n\tret = rtw_cfg80211_set_wpa_ie(padapter, (u8 *)sme->ie, sme->ie_len);\n\tif (ret < 0)\n\t\tgoto exit;\n\n\tif (sme->crypto.n_ciphers_pairwise) {\t\t\n\t\tret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.ciphers_pairwise[0], _TRUE);\n\t\tif (ret < 0)\n\t\t\tgoto exit;\n\t}\n\n\t//For WEP Shared auth\n\tif (sme->key_len > 0 && sme->key)\n\t{\n\t\tu32 wep_key_idx, wep_key_len,wep_total_len;\n\t\tNDIS_802_11_WEP\t *pwep = NULL;\n\t\tDBG_871X(\"%s(): Shared/Auto WEP\\n\",__FUNCTION__);\n\n\t\twep_key_idx = sme->key_idx;\n\t\twep_key_len = sme->key_len;\n\n\t\tif (sme->key_idx > WEP_KEYS) {\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (wep_key_len > 0) \n\t\t{\n\t\t \twep_key_len = wep_key_len <= 5 ? 5 : 13;\n\t\t\twep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);\n\t\t \tpwep =(NDIS_802_11_WEP\t *) rtw_malloc(wep_total_len);\n\t\t\tif(pwep == NULL){\n\t\t\t\tDBG_871X(\" wpa_set_encryption: pwep allocate fail !!!\\n\");\n\t\t\t\tret = -ENOMEM;\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t \t_rtw_memset(pwep, 0, wep_total_len);\n\n\t\t \tpwep->KeyLength = wep_key_len;\n\t\t\tpwep->Length = wep_total_len;\n\n\t\t\tif(wep_key_len==13)\n\t\t\t{\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;\n\t\t\t}\n\t\t}\n\t\telse {\t\t\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tpwep->KeyIndex = wep_key_idx;\n\t\tpwep->KeyIndex |= 0x80000000;\n\n\t\t_rtw_memcpy(pwep->KeyMaterial,  (void *)sme->key, pwep->KeyLength);\n\n\t\tif(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL)\n\t\t{\n\t\t\tret = -EOPNOTSUPP ;\n\t\t}\n\n\t\tif (pwep) {\n\t\t\trtw_mfree((u8 *)pwep,wep_total_len);\t\t\n\t\t}\n\n\t\tif(ret < 0)\n\t\t\tgoto exit;\n\t}\n\n\tret = rtw_cfg80211_set_cipher(psecuritypriv, sme->crypto.cipher_group, _FALSE);\n\tif (ret < 0)\n\t\treturn ret;\n\n\tif (sme->crypto.n_akm_suites) {\n\t\tret = rtw_cfg80211_set_key_mgt(psecuritypriv, sme->crypto.akm_suites[0]);\n\t\tif (ret < 0)\n\t\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_WAPI_SUPPORT\n      if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_PSK){\n\t\tpadapter->wapiInfo.bWapiPSK = true;\n\t}\n\telse if(sme->crypto.akm_suites[0] ==WLAN_AKM_SUITE_WAPI_CERT){\n\t      padapter->wapiInfo.bWapiPSK = false;\n\t}\n#endif\n\n\tauthmode = psecuritypriv->ndisauthtype;\n\trtw_set_802_11_authentication_mode(padapter, authmode);\n\n\t//rtw_set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);\n\n\tif (rtw_set_802_11_connect(padapter, (u8 *)sme->bssid, &ndis_ssid) == _FALSE) {\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\tDBG_8192C(\"set ssid:dot11AuthAlgrthm=%d, dot11PrivacyAlgrthm=%d, dot118021XGrpPrivacy=%d\\n\", psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm, psecuritypriv->dot118021XGrpPrivacy);\n\t\nexit:\n\n\trtw_ps_deny_cancel(padapter, PS_DENY_JOIN);\n\n\tDBG_8192C(\"<=%s, ret %d\\n\",__FUNCTION__, ret);\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _FALSE;\n\t#endif\n\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t\t   u16 reason_code)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\n\tDBG_871X(FUNC_NDEV_FMT\" - Start to Disconnect\\n\", FUNC_NDEV_ARG(ndev));\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _TRUE;\n\t#endif\n\n\trtw_set_to_roam(padapter, 0);\n\n\t//if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))\n\t{\n\t\trtw_scan_abort(padapter);\n\t\tLeaveAllPowerSaveMode(padapter);\n\t\trtw_disassoc_cmd(padapter, 500, _FALSE);\n\t\t\n\t\tDBG_871X(\"%s...call rtw_indicate_disconnect\\n\", __FUNCTION__);\n\t\t\n\t\trtw_indicate_disconnect(padapter);\n\t\t\n\t\trtw_free_assoc_resources(padapter, 1);\n\t\trtw_pwr_wakeup(padapter);\t\t\n\t}\n\n\t#ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42\n\tpadapter->mlmepriv.not_indic_disco = _FALSE;\n\t#endif\n\n\tDBG_871X(FUNC_NDEV_FMT\" return 0\\n\", FUNC_NDEV_ARG(ndev));\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_set_txpower(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))\n\tstruct wireless_dev *wdev,\n#endif\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) || defined(COMPAT_KERNEL_RELEASE)\n\tenum nl80211_tx_power_setting type, int mbm)\n#else\n\tenum tx_power_setting type, int dbm)\n#endif\n{\n#if 0\n\tstruct iwm_priv *iwm = wiphy_to_iwm(wiphy);\n\tint ret;\n\n\tswitch (type) {\n\tcase NL80211_TX_POWER_AUTOMATIC:\n\t\treturn 0;\n\tcase NL80211_TX_POWER_FIXED:\n\t\tif (mbm < 0 || (mbm % 100))\n\t\t\treturn -EOPNOTSUPP;\n\n\t\tif (!test_bit(IWM_STATUS_READY, &iwm->status))\n\t\t\treturn 0;\n\n\t\tret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,\n\t\t\t\t\t      CFG_TX_PWR_LIMIT_USR,\n\t\t\t\t\t      MBM_TO_DBM(mbm) * 2);\n\t\tif (ret < 0)\n\t\t\treturn ret;\n\n\t\treturn iwm_tx_power_trigger(iwm);\n\tdefault:\n\t\tIWM_ERR(iwm, \"Unsupported power type: %d\\n\", type);\n\t\treturn -EOPNOTSUPP;\n\t}\n#endif\n\tDBG_8192C(\"%s\\n\", __func__);\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_get_txpower(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))\n\tstruct wireless_dev *wdev,\n#endif\n\tint *dbm)\n{\n\tDBG_8192C(\"%s\\n\", __func__);\n\n\t*dbm = (12);\n\t\n\treturn 0;\n}\n\ninline bool rtw_cfg80211_pwr_mgmt(_adapter *adapter)\n{\n\tstruct rtw_wdev_priv *rtw_wdev_priv = adapter_wdev_data(adapter);\n\treturn rtw_wdev_priv->power_mgmt;\n}\n\nstatic int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy,\n\t\t\t\t       struct net_device *ndev,\n\t\t\t\t       bool enabled, int timeout)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct rtw_wdev_priv *rtw_wdev_priv = adapter_wdev_data(padapter);\n\t\n\tDBG_871X(FUNC_NDEV_FMT\" enabled:%u, timeout:%d\\n\", FUNC_NDEV_ARG(ndev),\n\t\tenabled, timeout);\n\n\trtw_wdev_priv->power_mgmt = enabled;\n\n\t#ifdef CONFIG_LPS\n\tif (!enabled)\n\t\tLPS_Leave(padapter, \"CFG80211_PWRMGMT\");\n\t#endif\n\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,\n\t\t\t\t  struct net_device *ndev,\n\t\t\t\t  struct cfg80211_pmksa *pmksa)\n{\n\tu8\tindex,blInserted = _FALSE;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv *mlme = &padapter->mlmepriv;\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\tu8\tstrZeroMacAddress[ ETH_ALEN ] = { 0x00 };\n\n\tDBG_871X(FUNC_NDEV_FMT\" \"MAC_FMT\" \"KEY_FMT\"\\n\", FUNC_NDEV_ARG(ndev)\n\t\t, MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\n\n\tif ( _rtw_memcmp((u8 *)pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )\n\t{\n\t\treturn -EINVAL;\n\t}\n\n\tif (check_fwstate(mlme, _FW_LINKED) == _FALSE) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" not set pmksa cause not in linked state\\n\", FUNC_NDEV_ARG(ndev));\n\t\treturn -EINVAL;\n\t}\n\n\tblInserted = _FALSE;\n\t\n\t//overwrite PMKID\n\tfor(index=0 ; index<NUM_PMKID_CACHE; index++)\n\t{\n\t\tif( _rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, (u8 *)pmksa->bssid, ETH_ALEN) ==_TRUE )\n\t\t{ // BSSID is matched, the same AP => rewrite with new PMKID.\n\t\t\tDBG_871X(FUNC_NDEV_FMT\" BSSID exists in the PMKList.\\n\", FUNC_NDEV_ARG(ndev));\n\n\t\t\t_rtw_memcpy( psecuritypriv->PMKIDList[index].PMKID, (u8 *)pmksa->pmkid, WLAN_PMKID_LEN);\n\t\t\tpsecuritypriv->PMKIDList[index].bUsed = _TRUE;\n\t\t\tpsecuritypriv->PMKIDIndex = index+1;\n\t\t\tblInserted = _TRUE;\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\tif(!blInserted)\n\t{\n\t\t// Find a new entry\n\t\tDBG_871X(FUNC_NDEV_FMT\" Use the new entry index = %d for this PMKID.\\n\",\n\t\t\tFUNC_NDEV_ARG(ndev), psecuritypriv->PMKIDIndex );\n\n\t\t_rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, (u8 *)pmksa->bssid, ETH_ALEN);\n\t\t_rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, (u8 *)pmksa->pmkid, WLAN_PMKID_LEN);\n\n\t\tpsecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = _TRUE;\n\t\tpsecuritypriv->PMKIDIndex++ ;\n\t\tif(psecuritypriv->PMKIDIndex==16)\n\t\t{\n\t\t\tpsecuritypriv->PMKIDIndex =0;\n\t\t} \n\t} \n\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,\n\t\t\t\t  struct net_device *ndev,\n\t\t\t\t  struct cfg80211_pmksa *pmksa)\n{\n\tu8\tindex, bMatched = _FALSE;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\n\tDBG_871X(FUNC_NDEV_FMT\" \"MAC_FMT\" \"KEY_FMT\"\\n\", FUNC_NDEV_ARG(ndev)\n\t\t, MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\n\n\tfor(index=0 ; index<NUM_PMKID_CACHE; index++)\n\t{\n\t\tif( _rtw_memcmp(psecuritypriv->PMKIDList[index].Bssid, (u8 *)pmksa->bssid, ETH_ALEN) ==_TRUE )\n\t\t{ // BSSID is matched, the same AP => Remove this PMKID information and reset it. \n\t\t\t_rtw_memset(psecuritypriv->PMKIDList[index].Bssid, 0x00, ETH_ALEN );\n\t\t\t_rtw_memset(psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN );\n\t\t\tpsecuritypriv->PMKIDList[index].bUsed = _FALSE;\n\t\t\tbMatched = _TRUE;\n\t\t\tDBG_871X(FUNC_NDEV_FMT\" clear id:%hhu\\n\", FUNC_NDEV_ARG(ndev), index);\t\t\n\t\t\tbreak;\n\t\t}\t\n\t}\n\n\tif(_FALSE == bMatched)\n\t{\n\t\tDBG_871X(FUNC_NDEV_FMT\" do not have matched BSSID\\n\"\n\t\t\t, FUNC_NDEV_ARG(ndev));\n\t\treturn -EINVAL;\n\t}\n\n\treturn 0;\n}\n\nstatic int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy,\n\t\t\t\t    struct net_device *ndev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\t_rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );\n\tpsecuritypriv->PMKIDIndex = 0;\n\n\treturn 0;\n}\n\n#ifdef CONFIG_AP_MODE\nvoid rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)\n{\n\ts32 freq;\n\tint channel;\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\t\n\tstruct net_device *ndev = padapter->pnetdev;\n\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE)\n\t{\n\t\tstruct station_info sinfo;\n\t\tu8 ie_offset;\n\t\tif (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ)\n\t\t\tie_offset = _ASOCREQ_IE_OFFSET_;\n\t\telse // WIFI_REASSOCREQ\n\t\t\tie_offset = _REASOCREQ_IE_OFFSET_;\n\t\n\t\tmemset(&sinfo, 0, sizeof(sinfo));\n\t\tsinfo.filled = STATION_INFO_ASSOC_REQ_IES;\n\t\tsinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset;\n\t\tsinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset;\n\t\tcfg80211_new_sta(ndev, GetAddr2Ptr(pmgmt_frame), &sinfo, GFP_ATOMIC);\n\t}\n#else /* defined(RTW_USE_CFG80211_STA_EVENT) */\n\tchannel = pmlmeext->cur_channel;\n\tfreq = rtw_ch2freq(channel);\n\n\t#ifdef COMPAT_KERNEL_RELEASE\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);\n\t#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);\n\t#else //COMPAT_KERNEL_RELEASE\n\t{\n\t\t//to avoid WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION)  when calling cfg80211_send_rx_assoc()\n\t\t#ifndef CONFIG_PLATFORM_MSTAR\n\t\tpwdev->iftype = NL80211_IFTYPE_STATION;\n\t\t#endif //CONFIG_PLATFORM_MSTAR\n\t\tDBG_8192C(\"iftype=%d before call cfg80211_send_rx_assoc()\\n\", pwdev->iftype);\n\t\trtw_cfg80211_send_rx_assoc(padapter, NULL, pmgmt_frame, frame_len);\n\t\tDBG_8192C(\"iftype=%d after call cfg80211_send_rx_assoc()\\n\", pwdev->iftype);\n\t\tpwdev->iftype = NL80211_IFTYPE_AP;\n\t\t//cfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);\n\t}\n\t#endif //COMPAT_KERNEL_RELEASE\n#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */\n\n}\n\nvoid rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason)\n{\n\ts32 freq;\n\tint channel;\n\tu8 *pmgmt_frame;\n\tuint frame_len;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tunsigned short *fctrl;\t\n\tu8 mgmt_buf[128] = {0};\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct net_device *ndev = padapter->pnetdev;\n\t\n\tDBG_871X(FUNC_ADPT_FMT\"\\n\", FUNC_ADPT_ARG(padapter));\n\n#if defined(RTW_USE_CFG80211_STA_EVENT) || defined(COMPAT_KERNEL_RELEASE)\n\tcfg80211_del_sta(ndev, da, GFP_ATOMIC);\n#else /* defined(RTW_USE_CFG80211_STA_EVENT) */\n\tchannel = pmlmeext->cur_channel;\n\tfreq = rtw_ch2freq(channel);\n\n\tpmgmt_frame = mgmt_buf;\t\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pmgmt_frame;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, da, ETH_ALEN);\t\n\t_rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pmgmt_frame, WIFI_DEAUTH);\n\n\tpmgmt_frame += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tframe_len = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\treason = cpu_to_le16(reason);\n\tpmgmt_frame = rtw_set_fixed_ie(pmgmt_frame, _RSON_CODE_ , (unsigned char *)&reason, &frame_len);\n\n\t#ifdef COMPAT_KERNEL_RELEASE\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC);\n\t#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) && !defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, GFP_ATOMIC);\n\t#else //COMPAT_KERNEL_RELEASE\n\tcfg80211_send_disassoc(padapter->pnetdev, mgmt_buf, frame_len);\t\n\t//cfg80211_rx_action(padapter->pnetdev, freq, mgmt_buf, frame_len, GFP_ATOMIC);\n\t#endif //COMPAT_KERNEL_RELEASE\n#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */\n}\n\nstatic int rtw_cfg80211_monitor_if_open(struct net_device *ndev)\n{\n\tint ret = 0;\n\n\tDBG_8192C(\"%s\\n\", __func__);\n\t\n\treturn ret;\n}\n\nstatic int rtw_cfg80211_monitor_if_close(struct net_device *ndev)\n{\n\tint ret = 0;\n\n\tDBG_8192C(\"%s\\n\", __func__);\n\t\n\treturn ret;\n}\n\nstatic int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_device *ndev)\n{\t\n\tint ret = 0;\n\tint rtap_len;\n\tint qos_len = 0;\n\tint dot11_hdr_len = 24;\n\tint snap_len = 6;\n\tunsigned char *pdata;\n\tu16 frame_ctl;\n\tunsigned char src_mac_addr[6];\n\tunsigned char dst_mac_addr[6];\n\tstruct ieee80211_hdr *dot11_hdr;\n\tstruct ieee80211_radiotap_header *rtap_hdr;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\t\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\tif (skb)\n\t\trtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize);\n\n\tif (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))\n\t\tgoto fail;\n\n\trtap_hdr = (struct ieee80211_radiotap_header *)skb->data;\n\tif (unlikely(rtap_hdr->it_version))\n\t\tgoto fail;\n\n\trtap_len = ieee80211_get_radiotap_len(skb->data);\n\tif (unlikely(skb->len < rtap_len))\n\t\tgoto fail;\n\n\tif(rtap_len != 14)\n\t{\n\t\tDBG_8192C(\"radiotap len (should be 14): %d\\n\", rtap_len);\n\t\tgoto fail;\n\t}\t\n\n\t/* Skip the ratio tap header */\n\tskb_pull(skb, rtap_len);\n\n\tdot11_hdr = (struct ieee80211_hdr *)skb->data;\n\tframe_ctl = le16_to_cpu(dot11_hdr->frame_control);\n\t/* Check if the QoS bit is set */\n\tif ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {\n\t\t/* Check if this ia a Wireless Distribution System (WDS) frame\n\t\t * which has 4 MAC addresses\n\t\t */\n\t\tif (dot11_hdr->frame_control & 0x0080)\n\t\t\tqos_len = 2;\n\t\tif ((dot11_hdr->frame_control & 0x0300) == 0x0300)\n\t\t\tdot11_hdr_len += 6;\n\n\t\tmemcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr));\n\t\tmemcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr));\n\n\t\t/* Skip the 802.11 header, QoS (if any) and SNAP, but leave spaces for\n\t\t * for two MAC addresses\n\t\t */\n\t\tskb_pull(skb, dot11_hdr_len + qos_len + snap_len - sizeof(src_mac_addr) * 2);\n\t\tpdata = (unsigned char*)skb->data;\n\t\tmemcpy(pdata, dst_mac_addr, sizeof(dst_mac_addr));\n\t\tmemcpy(pdata + sizeof(dst_mac_addr), src_mac_addr, sizeof(src_mac_addr));\n\n\t\tDBG_8192C(\"should be eapol packet\\n\");\n\n\t\t/* Use the real net device to transmit the packet */\n\t\tret = _rtw_xmit_entry(skb, padapter->pnetdev);\n\n\t\treturn ret;\n\n\t}\n\telse if ((frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE))\n\t\t== (RTW_IEEE80211_FTYPE_MGMT|RTW_IEEE80211_STYPE_ACTION)\n\t) \n\t{\n\t\t//only for action frames\n\t\tstruct xmit_frame\t\t*pmgntframe;\n\t\tstruct pkt_attrib\t*pattrib;\n\t\tunsigned char\t*pframe;\t\n\t\t//u8 category, action, OUI_Subtype, dialogToken=0;\n\t\t//unsigned char\t*frame_body;\n\t\tstruct rtw_ieee80211_hdr *pwlanhdr;\t\n\t\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\t\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\t\tu8 *buf = skb->data;\n\t\tu32 len = skb->len;\n\t\tu8 category, action;\n\t\tint type = -1;\n\n\t\tif (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) {\n\t\t\tDBG_8192C(FUNC_NDEV_FMT\" frame_control:0x%x\\n\", FUNC_NDEV_ARG(ndev),\n\t\t\t\tle16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl));\n\t\t\tgoto fail;\n\t\t}\n\t\t\n\t\tDBG_8192C(\"RTW_Tx:da=\"MAC_FMT\" via \"FUNC_NDEV_FMT\"\\n\",\n\t\t\tMAC_ARG(GetAddr1Ptr(buf)), FUNC_NDEV_ARG(ndev));\n\t\t#ifdef CONFIG_P2P\n\t\tif((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0)\n\t\t\tgoto dump;\n\t\t#endif\n\t\tif (category == RTW_WLAN_CATEGORY_PUBLIC)\n\t\t\tDBG_871X(\"RTW_Tx:%s\\n\", action_public_str(action));\n\t\telse\n\t\t\tDBG_871X(\"RTW_Tx:category(%u), action(%u)\\n\", category, action);\n\ndump:\n\t\t//starting alloc mgmt frame to dump it\n\t\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t\t{\t\t\t\n\t\t\tgoto fail;\n\t\t}\n\n\t\t//update attribute\n\t\tpattrib = &pmgntframe->attrib;\n\t\tupdate_mgntframe_attrib(padapter, pattrib);\n\t\tpattrib->retry_ctrl = _FALSE;\n\n\t\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\t\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\t\t_rtw_memcpy(pframe, (void*)buf, len);\n\t\t#ifdef CONFIG_WFD\n\t\tif (type >= 0)\n\t\t{\n\t\t\tstruct wifi_display_info\t\t*pwfd_info;\n\t\t\t\n\t\t\tpwfd_info = padapter->wdinfo.wfd_info;\n\t\t\t\n\t\t\tif ( _TRUE == pwfd_info->wfd_enable )\n\t\t\t{\n\t\t\t\trtw_append_wfd_ie( padapter, pframe, &len );\n\t\t\t}\n\t\t}\n\t\t#endif // CONFIG_WFD\n\t\tpattrib->pktlen = len;\t\n\t\n\t\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\t\t//update seq number\n\t\tpmlmeext->mgnt_seq = GetSequence(pwlanhdr);\n\t\tpattrib->seqnum = pmlmeext->mgnt_seq;\n\t\tpmlmeext->mgnt_seq++;\n\n\t\n\t\tpattrib->last_txcmdsz = pattrib->pktlen;\n\t\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\t\n\t}\n\telse\n\t{\n\t\tDBG_8192C(\"frame_ctl=0x%x\\n\", frame_ctl & (RTW_IEEE80211_FCTL_FTYPE|RTW_IEEE80211_FCTL_STYPE));\n\t}\n\n\t\nfail:\n\t\n\trtw_skb_free(skb);\n\n\treturn 0;\n\t\n}\n\nstatic void rtw_cfg80211_monitor_if_set_multicast_list(struct net_device *ndev)\n{\n\tDBG_8192C(\"%s\\n\", __func__);\n}\n\nstatic int rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr)\n{\n\tint ret = 0;\n\t\n\tDBG_8192C(\"%s\\n\", __func__);\n\t\n\treturn ret;\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\nstatic const struct net_device_ops rtw_cfg80211_monitor_if_ops = {\n\t.ndo_open = rtw_cfg80211_monitor_if_open,\n       .ndo_stop = rtw_cfg80211_monitor_if_close,\n       .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry,\n       #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0))\n       .ndo_set_multicast_list = rtw_cfg80211_monitor_if_set_multicast_list,\n       #endif\n       .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address,       \n};\n#endif\n\nstatic int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct net_device **ndev)\n{\n\tint ret = 0;\n\tstruct net_device* mon_ndev = NULL;\n\tstruct wireless_dev* mon_wdev = NULL;\n\tstruct rtw_netdev_priv_indicator *pnpi;\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);\n\t\t\n\tif (!name) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" without specific name\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -EINVAL;\n\t\tgoto out;\n\t}\n\n\tif (pwdev_priv->pmon_ndev) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" monitor interface exist: \"NDEV_FMT\"\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), NDEV_ARG(pwdev_priv->pmon_ndev));\n\t\tret = -EBUSY;\n\t\tgoto out;\n\t}\n\n\tmon_ndev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));\n\tif (!mon_ndev) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" allocate ndev fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -ENOMEM;\n\t\tgoto out;\n\t}\n\n\tmon_ndev->type = ARPHRD_IEEE80211_RADIOTAP;\n\tstrncpy(mon_ndev->name, name, IFNAMSIZ);\n\tmon_ndev->name[IFNAMSIZ - 1] = 0;\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(4,11,9))\n\tmon_ndev->priv_destructor = rtw_ndev_destructor;\n#else\n\tmon_ndev->destructor = rtw_ndev_destructor;\n#endif\n\t\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\n\tmon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops;\n#else\n\tmon_ndev->open = rtw_cfg80211_monitor_if_open;\n\tmon_ndev->stop = rtw_cfg80211_monitor_if_close;\n\tmon_ndev->hard_start_xmit = rtw_cfg80211_monitor_if_xmit_entry;\n\tmon_ndev->set_mac_address = rtw_cfg80211_monitor_if_set_mac_address;\n#endif\n\n\tpnpi = netdev_priv(mon_ndev);\n\tpnpi->priv = padapter;\n\tpnpi->sizeof_priv = sizeof(_adapter);\n\n\t/*  wdev */\n\tmon_wdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev));\n\tif (!mon_wdev) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" allocate mon_wdev fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -ENOMEM;\n\t\tgoto out;\n\t}\n\n\tmon_wdev->wiphy = padapter->rtw_wdev->wiphy;\n\tmon_wdev->netdev = mon_ndev;\n\tmon_wdev->iftype = NL80211_IFTYPE_MONITOR;\n\tmon_ndev->ieee80211_ptr = mon_wdev;\n\n\tret = register_netdevice(mon_ndev);\n\tif (ret) {\n\t\tgoto out;\n\t}\n\n\t*ndev = pwdev_priv->pmon_ndev = mon_ndev;\n\t_rtw_memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1);\n\nout:\n\tif (ret && mon_wdev) {\n\t\trtw_mfree((u8*)mon_wdev, sizeof(struct wireless_dev));\n\t\tmon_wdev = NULL;\n\t}\n\n\tif (ret && mon_ndev) {\n\t\tfree_netdev(mon_ndev);\n\t\t*ndev = mon_ndev = NULL;\n\t}\n\n\treturn ret;\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\nstatic struct wireless_dev *\n#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\nstatic struct net_device *\n#else\nstatic int\n#endif\n\tcfg80211_rtw_add_virtual_intf(\n\t\tstruct wiphy *wiphy,\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0))\n\t\tconst char *name,\n\t#else\n\t\tchar *name,\n\t#endif\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))\n\t\tunsigned char name_assign_type,\n\t#endif\n\t\tenum nl80211_iftype type,\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0))\n\t\t u32 *flags,\n\t#endif\n\t\tstruct vif_params *params)\n{\n\tint ret = 0;\n\tstruct net_device* ndev = NULL;\n\t_adapter *padapter = wiphy_to_adapter(wiphy);\n\n\tDBG_871X(\"%s wiphy:%s, name:%s, type:%d\\n\",\n\t\t__func__, wiphy_name(wiphy), name, type);\n\n\tswitch (type) {\n\tcase NL80211_IFTYPE_ADHOC:\n\tcase NL80211_IFTYPE_AP_VLAN:\n\tcase NL80211_IFTYPE_WDS:\n\tcase NL80211_IFTYPE_MESH_POINT:\n\t\tret = -ENODEV;\n\t\tbreak;\n\tcase NL80211_IFTYPE_MONITOR:\n\t\tret = rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev);\n\t\tbreak;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\tcase NL80211_IFTYPE_P2P_CLIENT:\n#endif\n\tcase NL80211_IFTYPE_STATION:\n\t\tret = -ENODEV;\n\t\tbreak;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\tcase NL80211_IFTYPE_P2P_GO:\n#endif\n\tcase NL80211_IFTYPE_AP:\n\t\tret = -ENODEV;\n\t\tbreak;\n\tdefault:\n\t\tret = -ENODEV;\n\t\tDBG_871X(\"Unsupported interface type\\n\");\n\t\tbreak;\n\t}\n\n\tDBG_871X(\"%s ndev:%p, ret:%d\\n\", __func__, ndev, ret);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\treturn ndev ? ndev->ieee80211_ptr : ERR_PTR(ret);\n#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\n\treturn ndev ? ndev : ERR_PTR(ret);\n#else\n\treturn ret;\n#endif\n}\n\nstatic int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct wireless_dev *wdev\n#else\n\tstruct net_device *ndev\n#endif\n)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(wdev);\n#endif\n\tint ret = 0;\n\t_adapter *adapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\n\tif (!ndev) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(adapter);\n\n\tunregister_netdevice(ndev);\n\n\tif (ndev == pwdev_priv->pmon_ndev) {\n\t\tpwdev_priv->pmon_ndev = NULL;\n\t\tpwdev_priv->ifname_mon[0] = '\\0';\n\t\tDBG_871X(FUNC_NDEV_FMT\" remove monitor interface\\n\", FUNC_NDEV_ARG(ndev));\n\t}\n\nexit:\n\treturn ret;\n}\n\nstatic int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, const u8 *tail, size_t tail_len)\n{\n\tint ret=0;\n\tu8 *pbuf = NULL;\n\tuint len, wps_ielen=0;\t\n\tuint p2p_ielen=0;\n\tu8 *p2p_ie;\n\tu8 got_p2p_ie = _FALSE;\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n\t//struct sta_priv *pstapriv = &padapter->stapriv;\n\t\n\n\tDBG_8192C(\"%s beacon_head_len=%zu, beacon_tail_len=%zu\\n\", __FUNCTION__, head_len, tail_len);\n\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tif(head_len<24)\n\t\treturn -EINVAL;\n\t\n\n\tpbuf = rtw_zmalloc(head_len+tail_len);\n\tif(!pbuf)\n\t\treturn -ENOMEM;\n\t\n\n\t//_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2);\n\n\t//if((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0))\n\t//\tpstapriv->max_num_sta = NUM_STA;\n\n\t\n\t_rtw_memcpy(pbuf, (void *)head+24, head_len-24);// 24=beacon header len.\n\t_rtw_memcpy(pbuf+head_len-24, (void *)tail, tail_len);\n\n\tlen = head_len+tail_len-24;\n\n\t//check wps ie if inclued\n\tif(rtw_get_wps_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &wps_ielen))\n\t\tDBG_8192C(\"add bcn, wps_ielen=%d\\n\", wps_ielen);\n\n#ifdef CONFIG_P2P\n\tif( adapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t{\n\t\t//check p2p if enable\n\t\tif(rtw_get_p2p_ie(pbuf+_FIXED_IE_LENGTH_, len-_FIXED_IE_LENGTH_, NULL, &p2p_ielen))\n\t\t{\t\t\n\t\t\tstruct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\n\t\t\tstruct wifidirect_info *pwdinfo= &(adapter->wdinfo);\n\n\t\t\tDBG_8192C(\"got p2p_ie, len=%d\\n\", p2p_ielen);\n\t\t\t\n\t\t\tgot_p2p_ie = _TRUE;\t\n\t\t\n\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t\t{\t\t\t\n\t\t\t\tDBG_8192C(\"Enable P2P function for the first time\\n\");\n\t\t\t\trtw_p2p_enable(adapter, P2P_ROLE_GO);\n\t\t\t\tadapter_wdev_data(adapter)->p2p_enabled = _TRUE;\n\t\t\t\t\n\t\t\t\tadapter->stapriv.expire_to = 3; // 3x2 = 6 sec in p2p mode\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_8192C(\"enter GO Mode, p2p_ielen=%d\\n\", p2p_ielen);\n\n\t\t\t\trtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);\n\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);\n\t\t\t\tpwdinfo->intent = 15;\t\t\n\t\t\t}\n\t\t}\n\t}\n#endif // CONFIG_P2P\n\n\t/* pbss_network->IEs will not include p2p_ie, wfd ie */\n\trtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, P2P_OUI, 4);\n\trtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, WFD_OUI, 4);\n\n\tif (rtw_check_beacon_data(adapter, pbuf,  len) == _SUCCESS) \n\t{\n#ifdef  CONFIG_P2P\t\t\n\t\t//check p2p if enable\n\t\tif(got_p2p_ie == _TRUE)\n\t\t{\n\t\t\tstruct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;\n\t\t\tstruct wifidirect_info *pwdinfo= &(adapter->wdinfo);\n\t\t\tpwdinfo->operating_channel = pmlmeext->cur_channel;\t\t\t\n\t\t}\n#endif //CONFIG_P2P\n\t\tret = 0;\n\t}\t\n\telse\n\t{\n\t\tret = -EINVAL;\n\t}\t\n\t\n\n\trtw_mfree(pbuf, head_len+tail_len);\t\n\t\n\treturn ret;\t\n}\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)) && !defined(COMPAT_KERNEL_RELEASE)\nstatic int cfg80211_rtw_add_beacon(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t      struct beacon_parameters *info)\n{\n\tint ret=0;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(ndev);\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\tret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len);\n\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_set_beacon(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t      struct beacon_parameters *info)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);\n\t\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\tpmlmeext->bstart_bss = _TRUE;\n\n\tcfg80211_rtw_add_beacon(wiphy, ndev, info);\n\t\n\treturn 0;\n}\n\nstatic int\tcfg80211_rtw_del_beacon(struct wiphy *wiphy, struct net_device *ndev)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n\treturn 0;\n}\n#else\nstatic int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t\t\t\t\t\tstruct cfg80211_ap_settings *settings)\n{\n\tint ret = 0;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(ndev);\n\t\n\tDBG_871X(FUNC_NDEV_FMT\" hidden_ssid:%d, auth_type:%d\\n\", FUNC_NDEV_ARG(ndev),\n\t\tsettings->hidden_ssid, settings->auth_type);\n\n\tret = rtw_add_beacon(adapter, settings->beacon.head, settings->beacon.head_len,\n\t\tsettings->beacon.tail, settings->beacon.tail_len);\n\n\tadapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = settings->hidden_ssid;\n\t\n\tif (settings->ssid && settings->ssid_len) {\n\t\tWLAN_BSSID_EX *pbss_network = &adapter->mlmepriv.cur_network.network;\n\t\tWLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network;\n\n\t\tif(0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" ssid:(%s,%zu), from ie:(%s,%d)\\n\", FUNC_ADPT_ARG(adapter),\n\t\t\t\tsettings->ssid, settings->ssid_len,\n\t\t\t\tpbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);\n\n\t\t_rtw_memcpy(pbss_network->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len);\n\t\tpbss_network->Ssid.SsidLength = settings->ssid_len;\n\t\t_rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)settings->ssid, settings->ssid_len);\n\t\tpbss_network_ext->Ssid.SsidLength = settings->ssid_len;\n\n\t\tif(0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" after ssid:(%s,%d), (%s,%d)\\n\", FUNC_ADPT_ARG(adapter),\n\t\t\t\tpbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,\n\t\t\t\tpbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);\n\t}\n\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_change_beacon(struct wiphy *wiphy, struct net_device *ndev,\n                                struct cfg80211_beacon_data *info)\n{\n\tint ret = 0;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(ndev);\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\tret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len);\n\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\treturn 0;\n}\n\n#endif //(LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))\n\nstatic int\tcfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\n\t\t\t\tu8 *mac, \n#else\n\t\t\t\tconst u8 *mac,\n#endif\n\t\t\t       struct station_parameters *params)\n{\n\tint ret = 0;\n#ifdef CONFIG_TDLS\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n   \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct sta_info *psta;\n#endif /* CONFIG_TDLS */\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n#ifdef CONFIG_TDLS\n\tpsta = rtw_get_stainfo(pstapriv, mac);\n\tif (psta == NULL) {\n\t\tpsta = rtw_alloc_stainfo(pstapriv, mac);\n\t\tif (psta ==NULL) {\n\t\t\tDBG_871X(\"[%s] Alloc station for \"MAC_FMT\" fail\\n\", __FUNCTION__, MAC_ARG(mac));\n\t\t\tret =-EOPNOTSUPP;\n\t\t\tgoto exit;\n\t\t}\n\t}\n#endif /* CONFIG_TDLS */\n\nexit:\n\treturn ret;\n}\n\nstatic int\tcfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\n\t\t\t\tu8 *mac\n#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0))\n\t\t\t\tconst u8 *mac\n#else\n\t\t\t\tstruct station_del_parameters *params\n#endif\n\t\t\t       )\n{\n\tint ret=0;\t\n\t_irqL irqL;\n\t_list\t*phead, *plist;\n\tu8 updated = _FALSE;\n\tconst u8 *target_mac;\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"+\"FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0))\n\ttarget_mac = mac;\n#else\n\ttarget_mac = params->mac;\n#endif\n\n\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)\t\t\n\t{\n\t\tDBG_8192C(\"%s, fw_state != FW_LINKED|WIFI_AP_STATE\\n\", __func__);\n\t\treturn -EINVAL;\t\t\n\t}\n\n\n\tif (!target_mac)\n\t{\n\t\tDBG_8192C(\"flush all sta, and cam_entry\\n\");\n\n\t\tflush_all_cam_entry(padapter);\t//clear CAM\n\n\t\tret = rtw_sta_flush(padapter, _TRUE);\n\t\t\n\t\treturn ret;\n\t}\t\n\n\n\tDBG_8192C(\"free sta macaddr =\" MAC_FMT \"\\n\", MAC_ARG(target_mac));\n\n\tif (target_mac[0] == 0xff && target_mac[1] == 0xff &&\n\t    target_mac[2] == 0xff && target_mac[3] == 0xff &&\n\t    target_mac[4] == 0xff && target_mac[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\n\t//check asoc_queue\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t{\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\t\n\t\tplist = get_next(plist);\t\n\t\n\t\tif (_rtw_memcmp((u8 *)target_mac, psta->hwaddr, ETH_ALEN))\t\t\n\t\t{\n\t\t\tif(psta->dot8021xalg == 1 && psta->bpairwise_key_installed == _FALSE)\n\t\t\t{\n\t\t\t\tDBG_8192C(\"%s, sta's dot8021xalg = 1 and key_installed = _FALSE\\n\", __func__);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_8192C(\"free psta=%p, aid=%d\\n\", psta, psta->aid);\n\n\t\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\t\tpstapriv->asoc_list_cnt--;\n\n\t\t\t\t//_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\t\tif (check_fwstate(pmlmepriv, (WIFI_AP_STATE)) == _TRUE)\n\t\t\t\t\tupdated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE);\n\t\t\t\telse\n\t\t\t\t\tupdated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, _TRUE);\n\t\t\t\t//_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\t\t\t\tpsta = NULL;\n\n\t\t\t\tbreak;\n\t\t\t}\t\t\n\t\t\t\t\t\n\t\t}\n\t\t\n\t}\n\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n\n\tDBG_871X(\"-\"FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n\treturn ret;\t\n\n}\n\nstatic int\tcfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,16,0))\n\t\t\t\tu8 *mac, \n#else\n\t\t\t\tconst u8 *mac,\n#endif\n\t\t\t\tstruct station_parameters *params)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n\treturn 0;\n}\n\nstruct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv)\n\n{\n\t_list\t*phead, *plist;\n\tstruct sta_info *psta = NULL;\n\tint i = 0;\n\t\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\n\t//check asoc_queue\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\t\n\t{\n\t\tif(idx == i) psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\t\n\t\ti++;\n\t}\n\treturn psta;\n}\n\nstatic int\tcfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t       int idx, u8 *mac, struct station_info *sinfo)\n{\n\n\tint ret = 0;\n\t_irqL irqL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct sta_info *psta = NULL;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tpsta = rtw_sta_info_get_by_idx(idx, pstapriv);\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tif(NULL == psta)\n\t{\n\t\tDBG_871X(\"Station is not found\\n\");\n\t\tret = -ENOENT;\n\t\tgoto exit;\n\t}\n\t_rtw_memcpy(mac, psta->hwaddr, ETH_ALEN);\n\tsinfo->filled = 0;\n\tsinfo->filled |= STATION_INFO_SIGNAL;\n\tsinfo->signal = psta->rssi;\n\t\nexit:\n\treturn ret;\n}\n\nstatic int\tcfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t      struct bss_parameters *params)\n{\n\tu8 i;\n\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n/*\n\tDBG_8192C(\"use_cts_prot=%d\\n\", params->use_cts_prot);\n\tDBG_8192C(\"use_short_preamble=%d\\n\", params->use_short_preamble);\n\tDBG_8192C(\"use_short_slot_time=%d\\n\", params->use_short_slot_time);\n\tDBG_8192C(\"ap_isolate=%d\\n\", params->ap_isolate);\n\n\tDBG_8192C(\"basic_rates_len=%d\\n\", params->basic_rates_len);\n\tfor(i=0; i<params->basic_rates_len; i++)\n\t{\t\t\n\t\tDBG_8192C(\"basic_rates=%d\\n\", params->basic_rates[i]);\n\t\t\n\t}\t\n*/\t\n\treturn 0;\n\t\n}\n\nstatic int\tcfg80211_rtw_set_channel(struct wiphy *wiphy\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\t, struct net_device *ndev\n\t#endif\n\t, struct ieee80211_channel *chan, enum nl80211_channel_type channel_type)\n{\n\tint chan_target = (u8) ieee80211_frequency_to_channel(chan->center_freq);\n\tint chan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tint chan_width = CHANNEL_WIDTH_20;\n\t_adapter *padapter = wiphy_to_adapter(wiphy);\n\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t#endif\n\n\tswitch (channel_type) {\n\tcase NL80211_CHAN_NO_HT:\n\tcase NL80211_CHAN_HT20:\n\t\tchan_width = CHANNEL_WIDTH_20;\n\t\tchan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\tbreak;\n\tcase NL80211_CHAN_HT40MINUS:\n\t\tchan_width = CHANNEL_WIDTH_40;\n\t\tchan_offset = HAL_PRIME_CHNL_OFFSET_UPPER;\n\t\tbreak;\n\tcase NL80211_CHAN_HT40PLUS:\n\t\tchan_width = CHANNEL_WIDTH_40;\n\t\tchan_offset = HAL_PRIME_CHNL_OFFSET_LOWER;\n\t\tbreak;\n\tdefault:\n\t\tchan_width = CHANNEL_WIDTH_20;\n\t\tchan_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\tbreak;\n\t}\n\n\tset_channel_bwmode(padapter, chan_target, chan_offset, chan_width);\n\n\treturn 0;\n}\n\nstatic int\tcfg80211_rtw_auth(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\tstruct cfg80211_auth_request *req)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n\treturn 0;\n}\n\nstatic int\tcfg80211_rtw_assoc(struct wiphy *wiphy, struct net_device *ndev,\n\t\t\t struct cfg80211_assoc_request *req)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\t\n\treturn 0;\n}\n#endif //CONFIG_AP_MODE\n\nvoid rtw_cfg80211_rx_probe_request(_adapter *adapter, u8 *frame, uint frame_len)\n{\n\ts32 freq;\n\tint channel;\n\tstruct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);\t\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);\n\tu8 category, action;\n\n\tchannel = rtw_get_oper_ch(adapter);\n\tfreq = rtw_ch2freq(channel);\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"RTW_Rx: probe request, cur_ch=%d\\n\", channel);\n#endif /* CONFIG_DEBUG_CFG80211 */\n\trtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);\n}\n\nvoid rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)\n{\n\tint type;\n\ts32 freq;\n\tint channel;\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tu8 category, action;\n\n\tchannel = rtw_get_oper_ch(padapter);\n\n\tDBG_8192C(\"RTW_Rx:cur_ch=%d\\n\", channel);\n\t#ifdef CONFIG_P2P\n\ttype = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE);\n\tif (type >= 0)\n\t\tgoto indicate;\n\t#endif\n\trtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action);\n\tDBG_871X(\"RTW_Rx:category(%u), action(%u)\\n\", category, action);\n\nindicate:\n\tfreq = rtw_ch2freq(channel);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);\n#else\n\tcfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);\n#endif\n}\n\nvoid rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len)\n{\n\tint type;\n\ts32 freq;\n\tint channel;\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\tu8 category, action;\n\n\tchannel = rtw_get_oper_ch(padapter);\n\n\tDBG_8192C(\"RTW_Rx:cur_ch=%d\\n\", channel);\n\t#ifdef CONFIG_P2P\n\ttype = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, _FALSE);\n\tif (type >= 0) {\n\t\tswitch (type) {\n\t\tcase P2P_GO_NEGO_CONF:\n\t\tcase P2P_PROVISION_DISC_RESP:\n\t\tcase P2P_INVIT_RESP:\n\t\t\trtw_set_scan_deny(padapter, 2000);\t\t\t\n\t\t\trtw_clear_scan_deny(padapter);\n\t\t}\n\t\tgoto indicate;\n\t}\n\t#endif\n\trtw_action_frame_parse(pmgmt_frame, frame_len, &category, &action);\n\tDBG_871X(\"RTW_Rx:category(%u), action(%u)\\n\", category, action);\n\nindicate:\n\tfreq = rtw_ch2freq(channel);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\trtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, GFP_ATOMIC);\n#else\n\tcfg80211_rx_action(padapter->pnetdev, freq, pmgmt_frame, frame_len, GFP_ATOMIC);\n#endif\n}\n\nvoid rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg)\n{\n\ts32 freq;\n\tint channel;\n\tstruct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);\t\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);\n\tu8 category, action;\n\n\tchannel = rtw_get_oper_ch(adapter);\n\n\trtw_action_frame_parse(frame, frame_len, &category, &action);\n\n\tif (action == ACT_PUBLIC_GAS_INITIAL_REQ) {\n\t\trtw_set_scan_deny(adapter, 200);\n\t\trtw_scan_abort_no_wait(adapter);\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (rtw_buddy_adapter_up(adapter))\n\t\t\trtw_scan_abort_no_wait(adapter->pbuddy_adapter);\n\t\t#endif\n\t}\n\n\tfreq = rtw_ch2freq(channel);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\trtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);\n#else\n\tcfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC);\n#endif\n\n\tDBG_8192C(\"RTW_Rx:cur_ch=%d\\n\", channel);\n\tif (msg)\n\t\tDBG_871X(\"RTW_Rx:%s\\n\", msg);\n\telse\n\t\tDBG_871X(\"RTW_Rx:category(%u), action(%u)\\n\", category, action);\n}\n\n#ifdef CONFIG_P2P\nvoid rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len)\n{\n\tu16\twps_devicepassword_id = 0x0000;\n\tuint\twps_devicepassword_id_len = 0;\n\tu8\t\t\twpsie[ 255 ] = { 0x00 }, p2p_ie[ 255 ] = { 0x00 };\n\tuint\t\t\tp2p_ielen = 0;\n\tuint\t\t\twpsielen = 0;\n\tu32\tdevinfo_contentlen = 0;\n\tu8\tdevinfo_content[64] = { 0x00 };\n\tu16\tcapability = 0;\n\tuint capability_len = 0;\n\t\n\tunsigned char category = RTW_WLAN_CATEGORY_PUBLIC;\n\tu8\t\t\taction = P2P_PUB_ACTION_ACTION;\n\tu8\t\t\tdialogToken = 1;\n\tu32\t\t\tp2poui = cpu_to_be32(P2POUI);\n\tu8\t\t\toui_subtype = P2P_PROVISION_DISC_REQ;\t\n\tu32\t\t\tp2pielen = 0;\n#ifdef CONFIG_WFD\n\tu32\t\t\t\t\twfdielen = 0;\n#endif //CONFIG_WFD\t\t\n\t\n\tstruct xmit_frame\t\t\t*pmgntframe;\n\tstruct pkt_attrib\t\t\t*pattrib;\n\tunsigned char\t\t\t\t\t*pframe;\n\tstruct rtw_ieee80211_hdr\t*pwlanhdr;\n\tunsigned short\t\t\t\t*fctrl;\n\tstruct xmit_priv\t\t\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\t\n\tstruct wifidirect_info *pwdinfo = &(padapter->wdinfo);\n\tu8 *frame_body = (unsigned char *)(buf + sizeof(struct rtw_ieee80211_hdr_3addr));\n\tsize_t frame_body_len = len - sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\n\tDBG_871X( \"[%s] In\\n\", __FUNCTION__ );\n\n\t//prepare for building provision_request frame\t\n\t_rtw_memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, GetAddr1Ptr(buf), ETH_ALEN);\n\t_rtw_memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, GetAddr1Ptr(buf), ETH_ALEN);\n\t\n\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;\n\t\t\n\trtw_get_wps_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, &wpsielen);\n\trtw_get_wps_attr_content( wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);\n\twps_devicepassword_id = be16_to_cpu( wps_devicepassword_id );\n\n\tswitch(wps_devicepassword_id) \n\t{\n\t\tcase WPS_DPID_PIN:\n\t\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL;\n\t\t\tbreak;\n\t\tcase WPS_DPID_USER_SPEC:\n\t\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA;\n\t\t\tbreak;\n\t\tcase WPS_DPID_MACHINE_SPEC:\n\t\t\tbreak;\n\t\tcase WPS_DPID_REKEY:\n\t\t\tbreak;\n\t\tcase WPS_DPID_PBC:\n\t\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;\n\t\t\tbreak;\n\t\tcase WPS_DPID_REGISTRAR_SPEC:\n\t\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\n\tif ( rtw_get_p2p_ie( frame_body + _PUBLIC_ACTION_IE_OFFSET_, frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, p2p_ie, &p2p_ielen ) )\n\t{\t\n\n\t\trtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, devinfo_content, &devinfo_contentlen);\t\t\t\t\t\n\t\trtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&capability, &capability_len);\n\t\t\t\t\t\t\n\t}\n\n\n\t//start to build provision_request frame\t\n\t_rtw_memset(wpsie, 0, sizeof(wpsie));\n\t_rtw_memset(p2p_ie, 0, sizeof(p2p_ie));\n\tp2p_ielen = 0;\t\n\t\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\treturn;\n\t}\n\n\t\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\n\tfctrl = &(pwlanhdr->frame_ctl);\n\t*(fctrl) = 0;\n\n\t_rtw_memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, ETH_ALEN);\n\n\tSetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);\n\tpmlmeext->mgnt_seq++;\n\tSetFrameSubType(pframe, WIFI_ACTION);\n\n\tpframe += sizeof(struct rtw_ieee80211_hdr_3addr);\n\tpattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr);\n\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(category), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(action), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 4, (unsigned char *) &(p2poui), &(pattrib->pktlen));\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(oui_subtype), &(pattrib->pktlen));\t\n\tpframe = rtw_set_fixed_ie(pframe, 1, &(dialogToken), &(pattrib->pktlen));\t\t\n\n\n\t//build_prov_disc_request_p2p_ie\t\n\t//\tP2P OUI\n\tp2pielen = 0;\n\tp2p_ie[ p2pielen++ ] = 0x50;\n\tp2p_ie[ p2pielen++ ] = 0x6F;\n\tp2p_ie[ p2pielen++ ] = 0x9A;\n\tp2p_ie[ p2pielen++ ] = 0x09;\t//\tWFA P2P v1.0\n\n\t//\tCommented by Albert 20110301\n\t//\tAccording to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes\n\t//\t1. P2P Capability\n\t//\t2. Device Info\n\t//\t3. Group ID ( When joining an operating P2P Group )\n\n\t//\tP2P Capability ATTR\n\t//\tType:\t\n\tp2p_ie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;\n\n\t//\tLength:\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 0x0002 );\n\tRTW_PUT_LE16(p2p_ie + p2pielen, 0x0002);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t//\tDevice Capability Bitmap, 1 byte\n\t//\tGroup Capability Bitmap, 1 byte\n\t_rtw_memcpy(p2p_ie + p2pielen, &capability, 2);\n\tp2pielen += 2;\n\t\n\n\t//\tDevice Info ATTR\n\t//\tType:\n\tp2p_ie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;\n\n\t//\tLength:\n\t//\t21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) \n\t//\t+ NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes)\n\t//*(u16*) ( p2pie + p2pielen ) = cpu_to_le16( 21 + pwdinfo->device_name_len );\n\tRTW_PUT_LE16(p2p_ie + p2pielen, devinfo_contentlen);\n\tp2pielen += 2;\n\n\t//\tValue:\n\t_rtw_memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen);\n\tp2pielen += devinfo_contentlen;\n\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, (unsigned char *) p2p_ie, &p2p_ielen);\t\t\t\n\t//p2pielen = build_prov_disc_request_p2p_ie( pwdinfo, pframe, NULL, 0, pwdinfo->tx_prov_disc_info.peerDevAddr);\n\t//pframe += p2pielen;\n\tpattrib->pktlen += p2p_ielen;\n\n\twpsielen = 0;\n\t//\tWPS OUI\n\t*(u32*) ( wpsie ) = cpu_to_be32( WPSOUI );\n\twpsielen += 4;\n\n\t//\tWPS version\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_VER1 );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0001 );\n\twpsielen += 2;\n\n\t//\tValue:\n\twpsie[wpsielen++] = WPS_VERSION_1;\t//\tVersion 1.0\n\n\t//\tConfig Method\n\t//\tType:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( WPS_ATTR_CONF_METHOD );\n\twpsielen += 2;\n\n\t//\tLength:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( 0x0002 );\n\twpsielen += 2;\n\n\t//\tValue:\n\t*(u16*) ( wpsie + wpsielen ) = cpu_to_be16( pwdinfo->tx_prov_disc_info.wps_config_method_request );\n\twpsielen += 2;\n\n\tpframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, (unsigned char *) wpsie, &pattrib->pktlen );\n\n\n#ifdef CONFIG_WFD\n\twfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);\n\tpframe += wfdielen;\n\tpattrib->pktlen += wfdielen;\n#endif //CONFIG_WFD\n\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\t//dump_mgntframe(padapter, pmgntframe);\n\tif (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS)\n\t\tDBG_8192C(\"%s, ack to\\n\", __func__);\n\n\t//if(wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)\n\t//{\n\t//\tDBG_8192C(\"waiting for p2p peer key-in PIN CODE\\n\");\n\t//\trtw_msleep_os(15000); // 15 sec for key in PIN CODE, workaround for GS2 before issuing Nego Req.\n\t//}\t\n\n}\n\nstatic s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct wireless_dev *wdev,\n#else\n\tstruct net_device *ndev,\n#endif\n\tstruct ieee80211_channel * channel,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n\tenum nl80211_channel_type channel_type,\n#endif\n\tunsigned int duration, u64 *cookie)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(wdev);\n#endif\n\ts32 err = 0;\n\tu8 remain_ch = (u8) ieee80211_frequency_to_channel(channel->center_freq);\n\tu8 ready_on_channel = _FALSE;\n\t_adapter *padapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\tstruct mlme_ext_priv *pmlmeext;\n\tstruct wifidirect_info *pwdinfo;\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo;\n\tu8 is_p2p_find = _FALSE;\n\n#ifndef CONFIG_RADIO_WORK\n\t#define RTW_ROCH_DURATION_ENLARGE\n\t#define RTW_ROCH_BACK_OP\n#endif\n\n\tif (ndev == NULL) {\n\t\treturn  -EINVAL;\n\t}\n\n\tpadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(padapter);\n\tpmlmeext = &padapter->mlmeextpriv;\n\tpwdinfo = &padapter->wdinfo;\n\tpcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tis_p2p_find=(duration < (pwdinfo->ext_listen_interval))? _TRUE : _FALSE;\n\t#endif\n\n\t*cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen);\n\t\n\tDBG_871X(FUNC_ADPT_FMT\" ch:%u duration:%d, cookie:0x%llx\\n\", FUNC_ADPT_ARG(padapter), remain_ch, duration, *cookie);\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (padapter->registrypriv.mp_mode == 1) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block remain_on_channel request\\n\", FUNC_ADPT_ARG(padapter)); \n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter) {\n\t\tif (padapter->pbuddy_adapter->registrypriv.mp_mode == 1) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block remain_on_channel request\\n\", FUNC_ADPT_ARG(padapter->pbuddy_adapter));\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t}\n#endif\n#endif\n\n\tif(pcfg80211_wdinfo->is_ro_ch == _TRUE)\n\t{\n\t\tDBG_8192C(\"%s, cancel ro ch timer\\n\", __func__);\n\t\t_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\n\t\t#endif //CONFIG_CONCURRENT_MODE\n\t\tp2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\n\t}\n\n\tpcfg80211_wdinfo->is_ro_ch = _TRUE;\n\tpcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();\n\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\terr = -EFAULT;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, sizeof(struct ieee80211_channel));\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n\tpcfg80211_wdinfo->remain_on_ch_type= channel_type;\n\t#endif\n\tpcfg80211_wdinfo->remain_on_ch_cookie= *cookie;\n\n\trtw_scan_abort(padapter);\n#ifdef CONFIG_CONCURRENT_MODE\t\t\n\tif ((rtw_buddy_adapter_up(padapter)) && is_p2p_find)\t\t//don't scan_abort during p2p_listen.\n\t\trtw_scan_abort(padapter->pbuddy_adapter);\t\t\t\n#endif //CONFIG_CONCURRENT_MODE\n\n\tif (check_fwstate(&padapter->mlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\n\t{\n\t\tDBG_871X(\"mlme state:0x%x\\n\", get_fwstate(&padapter->mlmepriv));\n\t\tremain_ch = padapter->mlmeextpriv.cur_channel;\n\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\n\t{\n\t\tDBG_871X(\"buddy_intf's mlme state:0x%x\\n\", get_fwstate(&(padapter->pbuddy_adapter->mlmepriv)));\n\t\tremain_ch = padapter->pbuddy_adapter->mlmeextpriv.cur_channel;\n\t}\n#endif /* CONFIG_CONCURRENT_MODE */\n\n\t//if(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\trtw_p2p_enable(padapter, P2P_ROLE_DEVICE);\n\t\tadapter_wdev_data(padapter)->p2p_enabled = _TRUE;\n\t\tpadapter->wdinfo.listen_channel = remain_ch;\n\t} else if (rtw_p2p_chk_state(pwdinfo , P2P_STATE_LISTEN)) {\n\t\tpadapter->wdinfo.listen_channel = remain_ch;\n\t} else {\n\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n#ifdef CONFIG_DEBUG_CFG80211\t\t\n\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));\n#endif\n\t}\n\n\n\trtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\n\n\t#ifdef RTW_ROCH_DURATION_ENLARGE\n\tif (duration < 400)\n\t\tduration = duration * 3; /* extend from exper */\n\t#endif\n\n#ifdef RTW_ROCH_BACK_OP\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_LINKED)) {\n\t\tif (is_p2p_find) /* p2p_find , duration<1000 */\n\t\t\tduration = duration + pwdinfo->ext_listen_interval;\n\t\telse /* p2p_listen, duration=5000 */\n\t\t\tduration = pwdinfo->ext_listen_interval + (pwdinfo->ext_listen_interval / 4);\n\t}\n#endif\n#endif /* RTW_ROCH_BACK_OP */\n\n\tpcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter);\n\n\tif(rtw_ch_set_search_ch(pmlmeext->channel_set, remain_ch) >= 0) {\n#ifdef\tCONFIG_CONCURRENT_MODE\n\t\tif ( check_buddy_fwstate(padapter, _FW_LINKED) )\n\t\t{\n\t\t\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\t\t\t\n\t\t\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\t\n\n\t\t\tif((remain_ch != pbuddy_mlmeext->cur_channel) && !check_fwstate(&padapter->mlmepriv, _FW_LINKED))\n\t\t\t{\t\n\t\t\t\tif(ATOMIC_READ(&pwdev_priv->switch_ch_to)==1 ||\n\t\t\t\t\t(remain_ch != pmlmeext->cur_channel))\n\t\t\t\t{\n\t\t\t\t\tif (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE)) {\n\t\t\t\t\t\tDBG_8192C(\"%s, issue nulldata pwrbit=1\\n\", __func__);\n\t\t\t\t\t\tissue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);\n\t\t\t\t\t}\n\n\t\t\t\t\tATOMIC_SET(&pwdev_priv->switch_ch_to, 0);\n\n\t\t\t\t\t#ifdef RTW_ROCH_BACK_OP\n\t\t\t\t\tDBG_8192C(\"%s, set switch ch timer, duration=%d\\n\", __func__, duration-pwdinfo->ext_listen_interval);\n\t\t\t\t\t_set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);\n\t\t\t\t\t#endif\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\n\t\t\tready_on_channel = _TRUE;\n\t\t\t//pmlmeext->cur_channel = remain_ch;\t\t\t\n\t\t\t//set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t}else \n#endif //CONFIG_CONCURRENT_MODE\n\t\tif(remain_ch != rtw_get_oper_ch(padapter) )\n\t\t{\n\t\t\tready_on_channel = _TRUE;\n\t\t\t//pmlmeext->cur_channel = remain_ch;\t\t\t\n\t\t\t//set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t}\n\t} else {\n\t\tDBG_871X(\"%s remain_ch:%u not in channel plan!!!!\\n\", __FUNCTION__, remain_ch);\n\t}\n\t\n\n\t//call this after other things have been done\n#ifdef\tCONFIG_CONCURRENT_MODE\t\n\tif(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 ||\n\t\t(remain_ch != rtw_get_oper_ch(padapter)))\n\t{\n\t\tu8 co_channel = 0xff;\n\t\tATOMIC_SET(&pwdev_priv->ro_ch_to, 0);\n#endif\n\n\t\tif(ready_on_channel == _TRUE)\n\t\t{\t\t\t\n\t\t\tif ( !check_fwstate(&padapter->mlmepriv, _FW_LINKED ) )\n\t\t\t{\n\t\t\t\tpmlmeext->cur_channel = remain_ch;\n\t\t\t\n#ifdef\tCONFIG_CONCURRENT_MODE\n\t\t\t\tco_channel = rtw_get_oper_ch(padapter);\n\n\t\t\t\tif(co_channel !=remain_ch)\n#endif\n\t\t\t\t{\n\t\t\t\t\t//if (!padapter->mlmepriv.LinkDetectInfo.bBusyTraffic)\n\t\t\t\t\tset_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tDBG_8192C(\"%s, set ro ch timer, duration=%d\\n\", __func__, duration);\n\t\t_set_timer( &pcfg80211_wdinfo->remain_on_ch_timer, duration);\n\n#ifdef\tCONFIG_CONCURRENT_MODE\n\t}\n#endif\n\n\trtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, duration, GFP_KERNEL);\n\nexit:\n\tif (err) {\n\t\tpcfg80211_wdinfo->is_ro_ch = _FALSE;\n\t\tpcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();\n\t}\n\n\treturn err;\n}\n\nstatic s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct wireless_dev *wdev,\n#else\n\tstruct net_device *ndev,\n#endif\n\tu64 cookie)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(wdev);\n#endif\n\ts32 err = 0;\n\t_adapter *padapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\tstruct wifidirect_info *pwdinfo;\n\tstruct cfg80211_wifidirect_info *pcfg80211_wdinfo;\n\n\tif (ndev == NULL) {\n\t\terr = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tpadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(padapter);\n\tpwdinfo = &padapter->wdinfo;\n\tpcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n\n\tDBG_871X(FUNC_ADPT_FMT\" cookie:0x%llx\\n\", FUNC_ADPT_ARG(padapter), cookie);\n\n\tif (pcfg80211_wdinfo->is_ro_ch == _TRUE) {\n\t\tDBG_8192C(\"%s, cancel ro ch timer\\n\", __func__);\n\t\t_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\n\t\t#endif\n\t\tp2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\n\t}\n\n\t#if 0\n\t//\tDisable P2P Listen State\n\tif(!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) && !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t{\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);\n\t\t\t_rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info));\n\t\t}\n\t}\n\telse\n\t#endif\n\t{\n\t\trtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));\n#ifdef CONFIG_DEBUG_CFG80211\t\t \n\t\tDBG_8192C(\"%s, role=%d, p2p_state=%d\\n\", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));\n#endif\n\t}\n\n\tpcfg80211_wdinfo->is_ro_ch = _FALSE;\n\tpcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();\n\nexit:\n\treturn err;\n}\n\n#endif //CONFIG_P2P\n\nstatic int _cfg80211_rtw_mgmt_tx(_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len, int wait_ack)\n{\n\tstruct xmit_frame\t*pmgntframe;\n\tstruct pkt_attrib\t*pattrib;\n\tunsigned char\t*pframe;\n\tint ret = _FAIL;\n\tbool ack = _TRUE;\n\tstruct rtw_ieee80211_hdr *pwlanhdr;\n\tstruct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n#ifdef \tCONFIG_P2P\n\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\t//struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\n\n\trtw_set_scan_deny(padapter, 1000);\n\n\trtw_scan_abort(padapter);\n\t#ifdef CONFIG_CONCURRENT_MODE\t\t\n\tif(rtw_buddy_adapter_up(padapter))\t\n\t\trtw_scan_abort(padapter->pbuddy_adapter);\n\t#endif /* CONFIG_CONCURRENT_MODE */\n#ifdef CONFIG_P2P\n\tif (padapter->cfg80211_wdinfo.is_ro_ch == _TRUE) {\n\t\t//DBG_8192C(\"%s, cancel ro ch timer\\n\", __func__);\n\t\t//_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\n\t\t//padapter->cfg80211_wdinfo.is_ro_ch = _FALSE;\n\t\t#ifdef CONFIG_CONCURRENT_MODE\t\t\t\n\t\tif (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))\n\t\t{\n\t\t\tDBG_8192C(\"%s, extend ro ch time\\n\", __func__);\n\t\t\t_set_timer( &padapter->cfg80211_wdinfo.remain_on_ch_timer, pwdinfo->ext_listen_period);\n\t\t}\t\n\t\t#endif //CONFIG_CONCURRENT_MODE\t\t\t\n\t}\n#endif //CONFIG_P2P\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_LINKED )) {\n\t\tu8 co_channel=0xff;\n\t\tPADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\t\t\t\n\t\tstruct mlme_ext_priv *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\t\n\n\t\tco_channel = rtw_get_oper_ch(padapter);\n\n\t\tif (tx_ch != pbuddy_mlmeext->cur_channel) {\n\n\t\t\tu16 ext_listen_period;\n\t\t\t\n\t\t\tif (ATOMIC_READ(&pwdev_priv->switch_ch_to)==1) {\n\t\t\t\tif (check_buddy_fwstate(padapter, WIFI_FW_STATION_STATE)) {\n\t\t\t\t\tDBG_8192C(\"%s, issue nulldata pwrbit=1\\n\", __func__);\n\t\t\t\t\tissue_nulldata(padapter->pbuddy_adapter, NULL, 1, 3, 500);\n\t\t\t\t}\n\n\t\t\t\tATOMIC_SET(&pwdev_priv->switch_ch_to, 0);\n\n\t\t\t\t//DBG_8192C(\"%s, set switch ch timer, period=%d\\n\", __func__, pwdinfo->ext_listen_period);\n\t\t\t\t//_set_timer(&pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period);\n\t\t\t}\n\n\t\t\tif (check_fwstate(&padapter->mlmepriv, _FW_LINKED ))\n\t\t\t{\n\t\t\t\text_listen_period = 500;// 500ms\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\t\t\t\t\n\t\t\t\text_listen_period = pwdinfo->ext_listen_period;\n\t\t\t}\n\n\t\t\tDBG_8192C(\"%s, set switch ch timer, period=%d\\n\", __func__, ext_listen_period);\n\t\t\t_set_timer(&pwdinfo->ap_p2p_switch_timer, ext_listen_period);\t\n\t\t\t\n\t\t}\n\n\t\tif (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))\n\t\t\tpmlmeext->cur_channel = tx_ch;\n\n\t\tif (tx_ch != co_channel)\n\t\t\tset_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t}else \n#endif //CONFIG_CONCURRENT_MODE\n\t//if (tx_ch != pmlmeext->cur_channel) {\n\tif(tx_ch != rtw_get_oper_ch(padapter)) {\n\t\tif (!check_fwstate(&padapter->mlmepriv, _FW_LINKED ))\n\t\t\tpmlmeext->cur_channel = tx_ch;\n\t\tset_channel_bwmode(padapter, tx_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t}\n\n\t//starting alloc mgmt frame to dump it\n\tif ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)\n\t{\n\t\t//ret = -ENOMEM;\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n\n\t//update attribute\n\tpattrib = &pmgntframe->attrib;\n\tupdate_mgntframe_attrib(padapter, pattrib);\n\tpattrib->retry_ctrl = _FALSE;\n\n\t_rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);\n\n\tpframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;\n\n\t_rtw_memcpy(pframe, (void*)buf, len);\n\tpattrib->pktlen = len;\t\n\t\n\tpwlanhdr = (struct rtw_ieee80211_hdr *)pframe;\n\t//update seq number\n\tpmlmeext->mgnt_seq = GetSequence(pwlanhdr);\n\tpattrib->seqnum = pmlmeext->mgnt_seq;\n\tpmlmeext->mgnt_seq++;\n\n#ifdef CONFIG_WFD\n\t{\n\t\tstruct wifi_display_info\t*pwfd_info;\n\t\t\t\n\t\tpwfd_info = padapter->wdinfo.wfd_info;\n\t\t\t\n\t\tif ( _TRUE == pwfd_info->wfd_enable )\n\t\t{\n\t\t\trtw_append_wfd_ie( padapter, pframe, &pattrib->pktlen );\n\t\t}\n\t}\n#endif // CONFIG_WFD\n\t\n\tpattrib->last_txcmdsz = pattrib->pktlen;\n\n\tif (wait_ack) {\n\t\tif (dump_mgntframe_and_wait_ack(padapter, pmgntframe) != _SUCCESS) {\n\t\t\tack = _FALSE;\n\t\t\tret = _FAIL;\n\n#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"%s, ack == _FAIL\\n\", __func__);\n#endif\n\t\t} else {\n\n#ifdef CONFIG_XMIT_ACK\n\t\t\trtw_msleep_os(50);\n#endif\n#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"%s, ack=%d, ok!\\n\", __func__, ack);\n#endif\n\t\t\tret = _SUCCESS;\n\t\t}\n\t} else {\n\t\tdump_mgntframe(padapter, pmgntframe);\n\t\tret = _SUCCESS;\n\t}\nexit:\n\n\t#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"%s, ret=%d\\n\", __func__, ret);\n\t#endif\n\t\n\treturn ret;\t\t\n\t\n}\n\nstatic int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct wireless_dev *wdev,\n#else\n\tstruct net_device *ndev,\n#endif\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) || defined(COMPAT_KERNEL_RELEASE)\n\tstruct ieee80211_channel *chan,\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\n\tbool offchan,\n\t#endif\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n\tenum nl80211_channel_type channel_type,\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\tbool channel_type_valid,\n\t#endif\n\t#endif\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\n\tunsigned int wait,\n\t#endif\n\tconst u8 *buf, size_t len,\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\n\tbool no_cck,\n\t#endif\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))\n\tbool dont_wait_for_ack,\n\t#endif\n#else\n\tstruct cfg80211_mgmt_tx_params *params,\n#endif\n\tu64 *cookie)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(wdev);\n#endif\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) || defined(COMPAT_KERNEL_RELEASE)\n\tstruct ieee80211_channel *chan = params->chan;\n\tbool offchan = params->offchan;\n\tunsigned int wait = params->wait;\n\tconst u8 *buf = params->buf;\n\tsize_t len = params->len;\n\tbool no_cck = params->no_cck;\n\tbool dont_wait_for_ack = params->dont_wait_for_ack;\n#endif\n\tint ret = 0;\n\tint tx_ret;\n\tint wait_ack = 1;\n\tu32 dump_limit = RTW_MAX_MGMT_TX_CNT;\n\tu32 dump_cnt = 0;\n\tbool ack = _TRUE;\n\tu8 tx_ch;\n\tu8 category, action;\n\tu8 frame_styp;\n\tint type = (-1);\n\tu32 start = rtw_get_current_time();\n\t_adapter *padapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\n\tif ((ndev == NULL) || (chan == NULL)) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\ttx_ch = (u8)ieee80211_frequency_to_channel(chan->center_freq);\n\n\tpadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(padapter);\n\n\t/* cookie generation */\n\t*cookie = (unsigned long) buf;\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_871X(FUNC_ADPT_FMT\" len=%zu, ch=%d\"\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n\t\t\", ch_type=%d\"\n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\t\n\t\t\", channel_type_valid=%d\"\n\t\t#endif\n\t#endif\n\t\t\"\\n\", FUNC_ADPT_ARG(padapter),\n\t\tlen, tx_ch\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n\t\t, channel_type\n\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\t\n\t\t, channel_type_valid\n\t\t#endif\n\t#endif\n\t);\n#endif /* CONFIG_DEBUG_CFG80211 */\n\n\t/* indicate ack before issue frame to avoid racing with rsp frame */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\trtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, GFP_KERNEL);\n#elif  (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))\n\tcfg80211_action_tx_status(ndev, *cookie, buf, len, ack, GFP_KERNEL);\n#endif\n\n\tframe_styp = le16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl) & IEEE80211_FCTL_STYPE;\n\tif (IEEE80211_STYPE_PROBE_RESP == frame_styp) {\n#ifdef CONFIG_DEBUG_CFG80211\n\t\tDBG_8192C(\"RTW_Tx: probe_resp tx_ch=%d, da=\"MAC_FMT\"\\n\", tx_ch, MAC_ARG(GetAddr1Ptr(buf)));\n#endif /* CONFIG_DEBUG_CFG80211 */\n\t\twait_ack = 0;\n\t\tgoto dump;\n\t}\n\n\tif (rtw_action_frame_parse(buf, len, &category, &action) == _FALSE) {\n\t\tDBG_8192C(FUNC_ADPT_FMT\" frame_control:0x%x\\n\", FUNC_ADPT_ARG(padapter),\n\t\t\tle16_to_cpu(((struct rtw_ieee80211_hdr_3addr *)buf)->frame_ctl));\n\t\tgoto exit;\n\t}\n\n\tDBG_8192C(\"RTW_Tx:tx_ch=%d, da=\"MAC_FMT\"\\n\", tx_ch, MAC_ARG(GetAddr1Ptr(buf)));\n\t#ifdef CONFIG_P2P\n\tif((type = rtw_p2p_check_frames(padapter, buf, len, _TRUE)) >= 0) {\n\t\tgoto dump;\n\t}\n\t#endif\n\tif (category == RTW_WLAN_CATEGORY_PUBLIC)\n\t\tDBG_871X(\"RTW_Tx:%s\\n\", action_public_str(action));\n\telse\n\t\tDBG_871X(\"RTW_Tx:category(%u), action(%u)\\n\", category, action);\n\ndump:\n\n\trtw_ps_deny(padapter, PS_DENY_MGNT_TX);\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tret = -EFAULT;\n\t\tgoto cancel_ps_deny;\n\t}\n\n\twhile (1) {\n\t\tu32 sleep_ms = 0;\n\t\tu32 retry_guarantee_ms = 0;\n\n\t\tdump_cnt++;\n\t\ttx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len, wait_ack);\n\n\t\tswitch (action) {\n\t\tcase ACT_PUBLIC_GAS_INITIAL_REQ:\n\t\tcase ACT_PUBLIC_GAS_INITIAL_RSP:\n\t\t\tsleep_ms = 50;\n\t\t\tretry_guarantee_ms = RTW_MAX_MGMT_TX_MS_GAS;\n\t\t}\n\n\t\tif (tx_ret == _SUCCESS\n\t\t\t|| (dump_cnt >= dump_limit && rtw_get_passing_time_ms(start) >= retry_guarantee_ms))\n\t\t\t\tbreak;\n\n\t\tif (sleep_ms > 0)\n\t\t\trtw_msleep_os(sleep_ms);\n\t}\n\n\tif (tx_ret != _SUCCESS || dump_cnt > 1) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" %s (%d/%d) in %d ms\\n\", FUNC_ADPT_ARG(padapter),\n\t\t\ttx_ret==_SUCCESS?\"OK\":\"FAIL\", dump_cnt, dump_limit, rtw_get_passing_time_ms(start));\n\t}\n\n\tswitch (type) {\n\tcase P2P_GO_NEGO_CONF:\n\t\trtw_clear_scan_deny(padapter);\n\t\tbreak;\n\tcase P2P_INVIT_RESP:\n\t\tif (pwdev_priv->invit_info.flags & BIT(0)\n\t\t\t&& pwdev_priv->invit_info.status == 0) \n\t\t{\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" agree with invitation of persistent group\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter));\n\t\t\trtw_set_scan_deny(padapter, 5000);\n\t\t\trtw_pwr_wakeup_ex(padapter, 5000);\n\t\t\trtw_clear_scan_deny(padapter);\n\t\t}\n\t\tbreak;\n\t}\t\n\ncancel_ps_deny:\n\trtw_ps_deny_cancel(padapter, PS_DENY_MGNT_TX);\nexit:\n\treturn ret;\n}\n\nstatic void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))\n\tstruct wireless_dev *wdev,\n#else\n\tstruct net_device *ndev,\n#endif\n\tu16 frame_type, bool reg)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))\n\tstruct net_device *ndev = wdev_to_ndev(wdev);\n#endif\n\t_adapter *adapter;\n\n\tstruct rtw_wdev_priv *pwdev_priv;\n\n\tif (ndev == NULL)\n\t\tgoto exit;\n\n\tadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(adapter);\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_871X(FUNC_ADPT_FMT\" frame_type:%x, reg:%d\\n\", FUNC_ADPT_ARG(adapter),\n\t\tframe_type, reg);\n#endif\n\n\t/* Wait QC Verify */\n\treturn;\n\n\tswitch (frame_type) {\n\tcase IEEE80211_STYPE_PROBE_REQ: /* 0x0050 */\n\t\tSET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_PROBE_REQ, reg);\n\t\tbreak;\n\tcase IEEE80211_STYPE_ACTION: /* 0x00D0 */\n\t\tSET_CFG80211_REPORT_MGMT(pwdev_priv, IEEE80211_STYPE_ACTION, reg);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\nexit:\n\treturn;\n}\n\n#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\nstatic int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,\n\tstruct net_device *ndev,\n\tu8 *peer,\n\tu8 action_code,\n\tu8 dialog_token,\n\tu16 status_code,\n\tconst u8 *buf,\n\tsize_t len)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &pmlmeext->mlmext_info;\n\tint ret = 0;\n\tstruct tdls_txmgmt txmgmt;\n\n\tif (rtw_tdls_is_driver_setup(padapter)) {\n\t\tDBG_871X(\"Discard tdls action:%d, let driver to set up direct link\\n\", action_code);\n\t\tgoto discard;\n\t}\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t_rtw_memcpy(txmgmt.peer, peer, ETH_ALEN);\n\ttxmgmt.action_code = action_code;\n\ttxmgmt.dialog_token= dialog_token;\n\ttxmgmt.status_code = status_code;\n\ttxmgmt.len = len;\n\ttxmgmt.buf = (u8 *)rtw_malloc(txmgmt.len);\n\tif (txmgmt.buf == NULL) {\n\t\tret = -ENOMEM;\n\t\tgoto bad;\n\t}\n\t_rtw_memcpy(txmgmt.buf, (void*)buf, txmgmt.len);\n\n/* Debug purpose */\n#if 1\n\tDBG_871X(\"%s %d\\n\", __FUNCTION__, __LINE__);\n\tDBG_871X(\"peer:\"MAC_FMT\", action code:%d, dialog:%d, status code:%d\\n\",\n\t\t\t\tMAC_ARG(txmgmt.peer), txmgmt.action_code, \n\t\t\t\ttxmgmt.dialog_token, txmgmt.status_code);\n\tif (txmgmt.len > 0) {\n\t\tint i=0;\n\t\tfor(;i < len; i++)\n\t\t\tprintk(\"%02x \", *(txmgmt.buf+i));\n\t\t\tDBG_871X(\"len:%d\\n\", txmgmt.len);\n\t}\n#endif\n\n\tswitch (txmgmt.action_code) {\n\tcase TDLS_SETUP_REQUEST:\n\t\tissue_tdls_setup_req(padapter, &txmgmt, _TRUE);\n\t\tbreak;\n\tcase TDLS_SETUP_RESPONSE:\n\t\tissue_tdls_setup_rsp(padapter, &txmgmt);\n\t\tbreak;\n\tcase TDLS_SETUP_CONFIRM:\n\t\tissue_tdls_setup_cfm(padapter, &txmgmt);\n\t\tbreak;\n\tcase TDLS_TEARDOWN:\n\t\tissue_tdls_teardown(padapter, &txmgmt, _TRUE);\n\t\tbreak;\n\tcase TDLS_DISCOVERY_REQUEST:\n\t\tissue_tdls_dis_req(padapter, &txmgmt);\n\t\tbreak;\n\tcase TDLS_DISCOVERY_RESPONSE:\n\t\tissue_tdls_dis_rsp(padapter, &txmgmt, pmlmeinfo->enc_algo? _TRUE : _FALSE);\n\t\tbreak;\n\t}\n\nbad:\n\tif (txmgmt.buf)\n\t\trtw_mfree(txmgmt.buf, txmgmt.len);\n\ndiscard:\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_tdls_oper(struct wiphy *wiphy,\n\tstruct net_device *ndev,\n\tu8 *peer,\n\tenum nl80211_tdls_operation oper)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct tdls_txmgmt\ttxmgmt;\n\tstruct sta_info *ptdls_sta = NULL;\n\n\tDBG_871X(FUNC_NDEV_FMT\", nl80211_tdls_operation:%d\\n\", FUNC_NDEV_ARG(ndev), oper);\n\n#ifdef CONFIG_LPS\n\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);\n#endif //CONFIG_LPS\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tif (peer)\n\t\t_rtw_memcpy(txmgmt.peer, peer, ETH_ALEN);\n\n\tif (rtw_tdls_is_driver_setup(padapter)) {\n\t\t/* these two cases are done by driver itself */\n\t\tif (oper == NL80211_TDLS_ENABLE_LINK || oper == NL80211_TDLS_DISABLE_LINK)\n\t\t\treturn 0;\n\t}\n\n\tswitch (oper) {\n\tcase NL80211_TDLS_DISCOVERY_REQ:\n\t\tissue_tdls_dis_req(padapter, &txmgmt);\n\t\tbreak;\n\tcase NL80211_TDLS_SETUP:\n#ifdef CONFIG_WFD\n\t\tif ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm ) {\n\t\t\tif ( padapter->wdinfo.wfd_tdls_weaksec == _TRUE)\n\t\t\t\tissue_tdls_setup_req(padapter, &txmgmt, _TRUE);\n\t\t\telse\n\t\t\t\tDBG_871X( \"[%s] Current link is not AES, SKIP sending the tdls setup request!!\\n\", __FUNCTION__ );\n\t\t} else\n#endif // CONFIG_WFD\n\t\t{\n\t\t\tissue_tdls_setup_req(padapter, &txmgmt, _TRUE);\n\t\t}\n\t\tbreak;\n\tcase NL80211_TDLS_TEARDOWN:\n\t\tptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);\n\t\tif (ptdls_sta != NULL) {\n\t\t\ttxmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;\n\t\t\tissue_tdls_teardown(padapter, &txmgmt, _TRUE);\n\t\t}else {\n\t\t\tDBG_871X( \"TDLS peer not found\\n\");\n\t\t}\n\t\tbreak;\n\tcase NL80211_TDLS_ENABLE_LINK:\n\t\tDBG_871X(FUNC_NDEV_FMT\", NL80211_TDLS_ENABLE_LINK;mac:\"MAC_FMT\"\\n\", FUNC_NDEV_ARG(ndev), MAC_ARG(peer));\n\t\tptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer);\n\t\tif (ptdls_sta != NULL) {\n\t\t\tptdlsinfo->link_established = _TRUE;\n\t\t\tptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;\n\t\t\tptdls_sta->state |= _FW_LINKED;\n\t\t\trtw_tdls_cmd(padapter, txmgmt.peer, TDLS_ESTABLISHED);\n\t\t}\n\t\tbreak;\n\tcase NL80211_TDLS_DISABLE_LINK:\n\t\tDBG_871X(FUNC_NDEV_FMT\", NL80211_TDLS_DISABLE_LINK;mac:\"MAC_FMT\"\\n\", FUNC_NDEV_ARG(ndev), MAC_ARG(peer));\n\t\tptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer);\n\t\tif (ptdls_sta != NULL) {\n\t\t\trtw_tdls_cmd(padapter, peer, TDLS_TEAR_STA );\n\t\t}\n\t\tbreak;\n\t}\n\treturn 0;\n}\n#endif /* CONFIG_TDLS */\n\n#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\nstatic int cfg80211_rtw_sched_scan_start(struct wiphy *wiphy,\n\t\tstruct net_device *dev,\n\t\tstruct cfg80211_sched_scan_request *request) {\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tu8 ret;\n\n\tif (padapter->bup == _FALSE) {\n\t\tDBG_871X(\"%s: net device is down.\\n\", __func__);\n\t\treturn -EIO;\n\t}\n\n\tif(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE ||\n\t\tcheck_fwstate(pmlmepriv, _FW_LINKED) == _TRUE  ||\n\t\tcheck_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {\n\t\tDBG_871X(\"%s: device is busy.\\n\", __func__);\n\t\trtw_scan_abort(padapter);\n\t}\n\n\tif (request == NULL) {\n\t\tDBG_871X(\"%s: invalid cfg80211_requests parameters.\\n\", __func__);\n\t\treturn -EINVAL;\n\t}\n\n\tret = rtw_android_cfg80211_pno_setup(dev, request->ssids,\n\t\t\trequest->n_ssids, request->interval);\n\n\tif (ret < 0) {\n\t\tDBG_871X(\"%s ret: %d\\n\", __func__, ret);\n\t\tgoto exit;\n\t}\n\n\tret = rtw_android_pno_enable(dev, _TRUE);\n\tif (ret < 0) {\n\t\tDBG_871X(\"%s ret: %d\\n\", __func__, ret);\n\t\tgoto exit;\n\t}\nexit:\n\treturn ret;\n}\n\nstatic int cfg80211_rtw_sched_scan_stop(struct wiphy *wiphy,\n\t\tstruct net_device *dev) {\n\treturn rtw_android_pno_enable(dev, _FALSE);\n}\n#endif /* CONFIG_PNO_SUPPORT */\n\nstatic int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len)\n{\t\n\tint ret = 0;\n\tuint wps_ielen = 0;\n\tu8 *wps_ie;\n\tu32\tp2p_ielen = 0;\n\tu8 wps_oui[8]={0x0,0x50,0xf2,0x04};\t\n\tu8 *p2p_ie;\n\tu32\twfd_ielen = 0;\t\n\tu8 *wfd_ie;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);\n\n\tDBG_871X(FUNC_NDEV_FMT\" ielen=%d\\n\", FUNC_NDEV_ARG(ndev), len);\n\t\n\tif(len>0)\n\t{\n\t\tif((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))\n\t\t{\t\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"bcn_wps_ielen=%d\\n\", wps_ielen);\n\t\t\t#endif\n\t\t\n\t\t\tif(pmlmepriv->wps_beacon_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wps_beacon_ie_len;\n\t\t\t\tpmlmepriv->wps_beacon_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wps_beacon_ie, free_len);\n\t\t\t\tpmlmepriv->wps_beacon_ie = NULL;\t\t\t\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wps_beacon_ie = rtw_malloc(wps_ielen);\n\t\t\tif ( pmlmepriv->wps_beacon_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t_rtw_memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen);\n\t\t\tpmlmepriv->wps_beacon_ie_len = wps_ielen;\n\t\n\t\t\tupdate_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE);\n\n\t\t}\n\n\t\t//buf += wps_ielen;\n\t\t//len -= wps_ielen;\n\n\t\t#ifdef CONFIG_P2P\n\t\tif((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen)))\n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"bcn_p2p_ielen=%d\\n\", p2p_ielen);\n\t\t\t#endif\n\t\t\n\t\t\tif(pmlmepriv->p2p_beacon_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->p2p_beacon_ie_len;\n\t\t\t\tpmlmepriv->p2p_beacon_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->p2p_beacon_ie, free_len);\n\t\t\t\tpmlmepriv->p2p_beacon_ie = NULL;\t\t\t\n\t\t\t}\t\n\n\t\t\tpmlmepriv->p2p_beacon_ie = rtw_malloc(p2p_ielen);\n\t\t\tif ( pmlmepriv->p2p_beacon_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t_rtw_memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen);\n\t\t\tpmlmepriv->p2p_beacon_ie_len = p2p_ielen;\n\t\t\t\n\t\t}\n\t\t#endif //CONFIG_P2P\n\t\t\n\t\t//buf += p2p_ielen;\n\t\t//len -= p2p_ielen;\n\n\t\t#ifdef CONFIG_WFD\n\t\tif(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) \n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"bcn_wfd_ielen=%d\\n\", wfd_ielen);\n\t\t\t#endif\n\t\t\t\n\t\t\tif(pmlmepriv->wfd_beacon_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wfd_beacon_ie_len;\n\t\t\t\tpmlmepriv->wfd_beacon_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wfd_beacon_ie, free_len);\n\t\t\t\tpmlmepriv->wfd_beacon_ie = NULL;\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wfd_beacon_ie = rtw_malloc(wfd_ielen);\n\t\t\tif ( pmlmepriv->wfd_beacon_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\trtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, &pmlmepriv->wfd_beacon_ie_len);\t\t\t\n\t\t}\n\t\t#endif //CONFIG_WFD\n\t\t\n\t\tpmlmeext->bstart_bss = _TRUE;\n\t\t\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *buf, int len)\n{\n\tint ret = 0;\n\tuint wps_ielen = 0;\n\tu8 *wps_ie;\n\tu32\tp2p_ielen = 0;\t\n\tu8 *p2p_ie;\n\tu32\twfd_ielen = 0;\t\n\tu8 *wfd_ie;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"%s, ielen=%d\\n\", __func__, len);\n#endif\n\t\n\tif(len>0)\n\t{\n\t\tif((wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen)))\n\t\t{\t\n\t\t\tuint\tattr_contentlen = 0;\n\t\t\tu16\tuconfig_method, *puconfig_method = NULL;\n\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\t\t\t\n\t\t\tDBG_8192C(\"probe_resp_wps_ielen=%d\\n\", wps_ielen);\n\t\t\t#endif\n\t\t\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_UNDER_WPS))\n\t\t\t{\n\t\t\t\tu8 sr = 0;\n\t\t\t\trtw_get_wps_attr_content(wps_ie,  wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8*)(&sr), NULL);\n\n\t\t\t\tif (sr != 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s, got sr\\n\", __func__);\n\t\t\t\t}\t\n\t\t\t\telse\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tDBG_8192C(\"GO mode process WPS under site-survey,  sr no set\\n\");\n\t\t\t\t\treturn ret;\n\t\t\t\t}\t\n\t\t\t}\t\t\t\n\t\t\n\t\t\tif(pmlmepriv->wps_probe_resp_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wps_probe_resp_ie_len;\n\t\t\t\tpmlmepriv->wps_probe_resp_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wps_probe_resp_ie, free_len);\n\t\t\t\tpmlmepriv->wps_probe_resp_ie = NULL;\t\t\t\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wps_probe_resp_ie = rtw_malloc(wps_ielen);\n\t\t\tif ( pmlmepriv->wps_probe_resp_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//add PUSH_BUTTON config_method by driver self in wpsie of probe_resp at GO Mode \n\t\t\tif ( (puconfig_method = (u16*)rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_CONF_METHOD , NULL, &attr_contentlen)) != NULL )\n\t\t\t{\n\t\t\t\t//struct registry_priv *pregistrypriv = &padapter->registrypriv;\n\t\t\t\tstruct wireless_dev *wdev = padapter->rtw_wdev;\n\t\t\t\t\n\t\t\t\t#ifdef CONFIG_DEBUG_CFG80211\t\t\n\t\t\t\t//printk(\"config_method in wpsie of probe_resp = 0x%x\\n\", be16_to_cpu(*puconfig_method));\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\t//if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\t\t\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\n\t\t\t\tif(wdev->iftype != NL80211_IFTYPE_P2P_GO) //for WIFI-DIRECT LOGO 4.2.2, AUTO GO can't set PUSH_BUTTON flags\n\t\t\t\t{\n\t\t\t\t\tuconfig_method = WPS_CM_PUSH_BUTTON;\n\t\t\t\t\tuconfig_method = cpu_to_be16( uconfig_method );\n\t\t\t\n\t\t\t\t\t*puconfig_method |= uconfig_method;\t\t\t\n\t\t\t\t}\t\n\t\t\t\t#endif\n\t\t\t}\n\t\t\t\n\t\t\t_rtw_memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen);\n\t\t\tpmlmepriv->wps_probe_resp_ie_len = wps_ielen;\n\t\t\t\n\t\t}\n\n\t\t//buf += wps_ielen;\n\t\t//len -= wps_ielen;\n\n\t\t#ifdef CONFIG_P2P\n\t\tif((p2p_ie=rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen))) \n\t\t{\n\t\t\tu8 is_GO = _FALSE;\t\t\t\n\t\t\tu32 attr_contentlen = 0;\n\t\t\tu16 cap_attr=0;\n\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"probe_resp_p2p_ielen=%d\\n\", p2p_ielen);\n\t\t\t#endif\t\t\t\n\n\t\t\t//Check P2P Capability ATTR\n\t\t\tif( rtw_get_p2p_attr_content( p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen) )\n\t\t\t{\n\t\t\t\tu8 grp_cap=0;\n\t\t\t\t//DBG_8192C( \"[%s] Got P2P Capability Attr!!\\n\", __FUNCTION__ );\n\t\t\t\tcap_attr = le16_to_cpu(cap_attr);\n\t\t\t\tgrp_cap = (u8)((cap_attr >> 8)&0xff);\n\t\t\t\t\n\t\t\t\tis_GO = (grp_cap&BIT(0)) ? _TRUE:_FALSE;\n\n\t\t\t\tif(is_GO)\n\t\t\t\t\tDBG_8192C(\"Got P2P Capability Attr, grp_cap=0x%x, is_GO\\n\", grp_cap);\n\t\t\t}\n\n\n\t\t\tif(is_GO == _FALSE)\n\t\t\t{\n\t\t\t\tif(pmlmepriv->p2p_probe_resp_ie)\n\t\t\t\t{\n\t\t\t\t\tu32 free_len = pmlmepriv->p2p_probe_resp_ie_len;\n\t\t\t\t\tpmlmepriv->p2p_probe_resp_ie_len = 0;\n\t\t\t\t\trtw_mfree(pmlmepriv->p2p_probe_resp_ie, free_len);\n\t\t\t\t\tpmlmepriv->p2p_probe_resp_ie = NULL;\t\t\n\t\t\t\t}\t\n\n\t\t\t\tpmlmepriv->p2p_probe_resp_ie = rtw_malloc(p2p_ielen);\n\t\t\t\tif ( pmlmepriv->p2p_probe_resp_ie == NULL) {\n\t\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\t\treturn -EINVAL;\n\t\t\t\t\n\t\t\t\t}\n\t\t\t\t_rtw_memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, p2p_ielen);\n\t\t\t\tpmlmepriv->p2p_probe_resp_ie_len = p2p_ielen;\n\t\t\t}\t\t\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(pmlmepriv->p2p_go_probe_resp_ie)\n\t\t\t\t{\n\t\t\t\t\tu32 free_len = pmlmepriv->p2p_go_probe_resp_ie_len;\n\t\t\t\t\tpmlmepriv->p2p_go_probe_resp_ie_len = 0;\n\t\t\t\t\trtw_mfree(pmlmepriv->p2p_go_probe_resp_ie, free_len);\n\t\t\t\t\tpmlmepriv->p2p_go_probe_resp_ie = NULL;\t\t\t\n\t\t\t\t}\t\n\n\t\t\t\tpmlmepriv->p2p_go_probe_resp_ie = rtw_malloc(p2p_ielen);\n\t\t\t\tif ( pmlmepriv->p2p_go_probe_resp_ie == NULL) {\n\t\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t\t}\n\t\t\t\t_rtw_memcpy(pmlmepriv->p2p_go_probe_resp_ie, p2p_ie, p2p_ielen);\n\t\t\t\tpmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen;\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t#endif //CONFIG_P2P\n\t\t\n\t\t//buf += p2p_ielen;\n\t\t//len -= p2p_ielen;\n\n\t\t#ifdef CONFIG_WFD\n\t\tif(rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) \n\t\t{\n\t\t\t#ifdef CONFIG_DEBUG_CFG80211\n\t\t\tDBG_8192C(\"probe_resp_wfd_ielen=%d\\n\", wfd_ielen);\n\t\t\t#endif\n\t\t\t\n\t\t\tif(pmlmepriv->wfd_probe_resp_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wfd_probe_resp_ie_len;\n\t\t\t\tpmlmepriv->wfd_probe_resp_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wfd_probe_resp_ie, free_len);\n\t\t\t\tpmlmepriv->wfd_probe_resp_ie = NULL;\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wfd_probe_resp_ie = rtw_malloc(wfd_ielen);\n\t\t\tif ( pmlmepriv->wfd_probe_resp_ie == NULL) {\n\t\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\treturn -EINVAL;\n\t\t\t\n\t\t\t}\n\t\t\trtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, &pmlmepriv->wfd_probe_resp_ie_len);\t\t\t\n\t\t}\n\t\t#endif //CONFIG_WFD\n\t\t\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, char *buf, int len)\n{\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\tDBG_8192C(\"%s, ielen=%d\\n\", __func__, len);\n\t\n\tif(len>0)\n\t{\n\t\tif(pmlmepriv->wps_assoc_resp_ie)\n\t\t{\n\t\t\tu32 free_len = pmlmepriv->wps_assoc_resp_ie_len;\n\t\t\tpmlmepriv->wps_assoc_resp_ie_len = 0;\n\t\t\trtw_mfree(pmlmepriv->wps_assoc_resp_ie, free_len);\n\t\t\tpmlmepriv->wps_assoc_resp_ie = NULL;\n\t\t}\t\n\n\t\tpmlmepriv->wps_assoc_resp_ie = rtw_malloc(len);\n\t\tif ( pmlmepriv->wps_assoc_resp_ie == NULL) {\n\t\t\tDBG_8192C(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\treturn -EINVAL;\n\t\t\t\n\t\t}\n\t\t_rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len);\n\t\tpmlmepriv->wps_assoc_resp_ie_len = len;\n\t}\n\n\treturn ret;\n\t\n}\n\nint rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,\n\tint type)\n{\n\tint ret = 0;\n\tuint wps_ielen = 0;\n\tu32\tp2p_ielen = 0;\n\n#ifdef CONFIG_DEBUG_CFG80211\n\tDBG_8192C(\"%s, ielen=%d\\n\", __func__, len);\n#endif\n\n\tif(\t(rtw_get_wps_ie(buf, len, NULL, &wps_ielen) && (wps_ielen>0))\n\t\t#ifdef CONFIG_P2P\n\t\t|| (rtw_get_p2p_ie(buf, len, NULL, &p2p_ielen) && (p2p_ielen>0))\n\t\t#endif\n\t)\t\t\n\t{\t\n\t\tif (net != NULL) \n\t\t{\n\t\t\tswitch (type) \n\t\t\t{\n\t\t\t\tcase 0x1: //BEACON\n\t\t\t\tret = rtw_cfg80211_set_beacon_wpsp2pie(net, buf, len);\n\t\t\t\tbreak;\n\t\t\t\tcase 0x2: //PROBE_RESP\n\t\t\t\tret = rtw_cfg80211_set_probe_resp_wpsp2pie(net, buf, len);\n\t\t\t\tbreak;\n\t\t\t\tcase 0x4: //ASSOC_RESP\n\t\t\t\tret = rtw_cfg80211_set_assoc_resp_wpsp2pie(net, buf, len);\n\t\t\t\tbreak;\n\t\t\t}\t\t\n\t\t}\n\t}\t\n\n\treturn ret;\n\t\n}\n\nstatic void rtw_cfg80211_init_ht_capab_ex(_adapter *padapter, struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type)\n{\n\tstruct registry_priv *pregistrypriv = &padapter->registrypriv;\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct ht_priv\t\t*phtpriv = &pmlmepriv->htpriv;\n\tu8 stbc_rx_enable = _FALSE;\n\n\trtw_ht_use_default_setting(padapter);\n\n\t/* RX LDPC */\n\tif (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX))\n\t\tht_cap->cap |= IEEE80211_HT_CAP_LDPC_CODING;\n\n\t/* TX STBC */\n\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX))\n\t\tht_cap->cap |= IEEE80211_HT_CAP_TX_STBC;\n\n\t/* RX STBC */\n\tif (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) {\n\t\t/*rtw_rx_stbc 0: disable, bit(0):enable 2.4g, bit(1):enable 5g*/\n\t\tif (IEEE80211_BAND_2GHZ == band)\n\t\t\tstbc_rx_enable = (pregistrypriv->rx_stbc & BIT(0))?_TRUE:_FALSE;\n\t\tif (IEEE80211_BAND_5GHZ == band)\n\t\t\tstbc_rx_enable = (pregistrypriv->rx_stbc & BIT(1))?_TRUE:_FALSE;\n\n\t\tif (stbc_rx_enable) {\n\t\t\tswitch (rf_type) {\n\t\t\tcase RF_1T1R:\n\t\t\t\tht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/*RX STBC One spatial stream*/\n\t\t\t\tbreak;\n\n\t\t\tcase RF_2T2R:\n\t\t\tcase RF_1T2R:\n\t\t\t\tht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */\n\t\t\t\tbreak;\n\t\t\tcase RF_3T3R:\n\t\t\tcase RF_3T4R:\n\t\t\tcase RF_4T4R:\n\t\t\t\tht_cap->cap |= IEEE80211_HT_CAP_RX_STBC_1R;/* Only one spatial-stream STBC RX is supported */\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tDBG_871X(\"[warning] rf_type %d is not expected\\n\", rf_type);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic void rtw_cfg80211_init_ht_capab(_adapter *padapter, struct ieee80211_sta_ht_cap *ht_cap, enum ieee80211_band band, u8 rf_type)\n{\n#define MAX_BIT_RATE_40MHZ_MCS23\t450\t/* Mbps */\n#define MAX_BIT_RATE_40MHZ_MCS15\t300\t/* Mbps */\n#define MAX_BIT_RATE_40MHZ_MCS7\t150\t/* Mbps */\n\n\tht_cap->ht_supported = _TRUE;\n\n\tht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |\n\t    \t\t\t\tIEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 |\n\t    \t\t\t\tIEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;\n\trtw_cfg80211_init_ht_capab_ex(padapter, ht_cap, band, rf_type);\n\n\t/*\n\t *Maximum length of AMPDU that the STA can receive.\n\t *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)\n\t */\n\tht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;\n\n\t/*Minimum MPDU start spacing , */\n\tht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;\n\n\tht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;\n\n\t/*\n\t *hw->wiphy->bands[IEEE80211_BAND_2GHZ]\n\t *base on ant_num\n\t *rx_mask: RX mask\n\t *if rx_ant =1 rx_mask[0]=0xff;==>MCS0-MCS7\n\t *if rx_ant =2 rx_mask[1]=0xff;==>MCS8-MCS15\n\t *if rx_ant >=3 rx_mask[2]=0xff;\n\t *if BW_40 rx_mask[4]=0x01;\n\t *highest supported RX rate\n\t */\n\tif (rf_type == RF_1T1R) {\n\t\tht_cap->mcs.rx_mask[0] = 0xFF;\n\n\t\tht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7;\n\t} else if ((rf_type == RF_1T2R) || (rf_type == RF_2T2R) || (rf_type == RF_2T2R_GREEN)) {\n\t\tht_cap->mcs.rx_mask[0] = 0xFF;\n\t\tht_cap->mcs.rx_mask[1] = 0xFF;\n\n\t\tht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15;\n\t} else if ((rf_type == RF_2T3R) || (rf_type == RF_3T3R)) {\n\t\tht_cap->mcs.rx_mask[0] = 0xFF;\n\t\tht_cap->mcs.rx_mask[1] = 0xFF;\n\t\tht_cap->mcs.rx_mask[2] = 0xFF;\n\n\t\tht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS23;\n\t} else {\n\t\trtw_warn_on(1);\n\t\tDBG_8192C(\"%s, error rf_type=%d\\n\", __func__, rf_type);\n\t}\t\n\t\n}\n\nvoid rtw_cfg80211_init_wiphy(_adapter *padapter)\n{\n\tu8 rf_type;\n\tstruct ieee80211_supported_band *bands;\n\tstruct wireless_dev *pwdev = padapter->rtw_wdev;\n\tstruct wiphy *wiphy = pwdev->wiphy;\n\t\n\trtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));\n\n\tDBG_8192C(\"%s:rf_type=%d\\n\", __func__, rf_type);\n\n\tif (IsSupported24G(padapter->registrypriv.wireless_mode)) {\t\n\t\tbands = wiphy->bands[IEEE80211_BAND_2GHZ];\n\t\tif(bands)\n\t\t\trtw_cfg80211_init_ht_capab(padapter, &bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type);\n\t}\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n\tif (IsSupported5G(padapter->registrypriv.wireless_mode)) {\t\n\t\tbands = wiphy->bands[IEEE80211_BAND_5GHZ];\n\t\tif(bands)\n\t\t\trtw_cfg80211_init_ht_capab(padapter, &bands->ht_cap, IEEE80211_BAND_5GHZ, rf_type);\n\t}\n#endif\n\t/* init regulary domain */\n\trtw_regd_init(padapter);\n\n\t/* copy mac_addr to wiphy */\n\t_rtw_memcpy(wiphy->perm_addr, adapter_mac_addr(padapter), ETH_ALEN);\n\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\nstruct ieee80211_iface_limit rtw_limits[] = {\n\t{\t.max = 2,\n\t\t.types = BIT(NL80211_IFTYPE_STATION)\n\t\t\t#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE))\n\t\t\t| BIT(NL80211_IFTYPE_P2P_CLIENT)\n\t\t\t#endif\n\t},\n\t#ifdef CONFIG_AP_MODE\n\t{\t.max = 1,\n\t\t.types = BIT(NL80211_IFTYPE_AP)\n\t\t\t#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) || defined(COMPAT_KERNEL_RELEASE))\n\t\t\t| BIT(NL80211_IFTYPE_P2P_GO)\n\t\t\t#endif\n\t},\n\t#endif\n};\n\nstruct ieee80211_iface_combination rtw_combinations[] = {\n\t{\t.limits = rtw_limits,\n\t\t.n_limits = ARRAY_SIZE(rtw_limits),\n\t\t.max_interfaces = 2,\n\t\t.num_different_channels = 1,\n\t},\n};\n#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) */\n\nstatic void rtw_cfg80211_preinit_wiphy(_adapter *adapter, struct wiphy *wiphy)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct registry_priv *regsty = dvobj_to_regsty(dvobj);\n\n\twiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;\n\n\twiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT;\n\twiphy->max_scan_ie_len = RTW_SCAN_IE_LEN_MAX;\t\n\twiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) || defined(COMPAT_KERNEL_RELEASE)\t \n\twiphy->max_remain_on_channel_duration = RTW_MAX_REMAIN_ON_CHANNEL_DURATION;\n#endif\n\t\n\twiphy->interface_modes =\tBIT(NL80211_IFTYPE_STATION)\n\t\t\t\t\t\t\t\t| BIT(NL80211_IFTYPE_ADHOC)\n#ifdef CONFIG_AP_MODE\n\t\t\t\t\t\t\t\t| BIT(NL80211_IFTYPE_AP)\n\t\t\t\t\t\t\t\t#ifdef CONFIG_WIFI_MONITOR\n\t\t\t\t\t\t\t\t| BIT(NL80211_IFTYPE_MONITOR)\n\t\t\t\t\t\t\t\t#endif\n#endif\n#if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))\n\t\t\t\t\t\t\t\t| BIT(NL80211_IFTYPE_P2P_CLIENT)\n\t\t\t\t\t\t\t\t| BIT(NL80211_IFTYPE_P2P_GO)\n#endif\n\t\t\t\t\t\t\t\t;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\t\n#ifdef CONFIG_AP_MODE\n\twiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes;\n#endif //CONFIG_AP_MODE\t\n#endif\t\t\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\n\t#ifdef CONFIG_WIFI_MONITOR\n\twiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);\n\t#endif\n#endif\n\n\t#if defined(RTW_SINGLE_WIPHY) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\n\twiphy->iface_combinations = rtw_combinations;\n\twiphy->n_iface_combinations = ARRAY_SIZE(rtw_combinations);\n\t#endif\n\n\twiphy->cipher_suites = rtw_cipher_suites;\n\twiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites);\n\n\tif (IsSupported24G(adapter->registrypriv.wireless_mode))\n\t\twiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ);\n\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n\tif (IsSupported5G(adapter->registrypriv.wireless_mode))\n\t\twiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ);\n#endif\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0))\n\twiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS;\n#endif\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))\n\twiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;\n\twiphy->flags |= WIPHY_FLAG_HAVE_AP_SME;\n\t/* remove WIPHY_FLAG_OFFCHAN_TX, because we not support this feature */\n\t/* wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; */\n#endif\n\n#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))\n\twiphy->max_sched_scan_reqs = 1;\n#else\n\twiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;\n#endif\n#ifdef CONFIG_PNO_SUPPORT\n\twiphy->max_sched_scan_ssids = MAX_PNO_LIST_COUNT;\n#endif\n#endif\n\n#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0))\n\twiphy->wowlan = wowlan_stub;\n#else\n\twiphy->wowlan = &wowlan_stub;\n#endif\n#endif\n\n#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\n\twiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;\n#ifndef CONFIG_TDLS_DRIVER_SETUP\n\twiphy->flags |= WIPHY_FLAG_TDLS_EXTERNAL_SETUP;\t//Driver handles key exchange\n\twiphy->flags |= NL80211_ATTR_HT_CAPABILITY;\n#endif //CONFIG_TDLS_DRIVER_SETUP\n#endif /* CONFIG_TDLS */\n\n\tif (regsty->power_mgnt != PS_MODE_ACTIVE)\n\t\twiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;\n\telse\n\t\twiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\n\t//wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;\n#endif\n}\n\nstatic struct cfg80211_ops rtw_cfg80211_ops = {\n\t.change_virtual_intf = cfg80211_rtw_change_iface,\n\t.add_key = cfg80211_rtw_add_key,\n\t.get_key = cfg80211_rtw_get_key,\n\t.del_key = cfg80211_rtw_del_key,\n\t.set_default_key = cfg80211_rtw_set_default_key,\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0))\n\t.set_rekey_data = cfg80211_rtw_set_rekey_data,\n#endif /*CONFIG_GTK_OL*/\n\t.get_station = cfg80211_rtw_get_station,\n\t.scan = cfg80211_rtw_scan,\n\t.set_wiphy_params = cfg80211_rtw_set_wiphy_params,\n\t.connect = cfg80211_rtw_connect,\n\t.disconnect = cfg80211_rtw_disconnect,\n\t.join_ibss = cfg80211_rtw_join_ibss,\n\t.leave_ibss = cfg80211_rtw_leave_ibss,\n\t.set_tx_power = cfg80211_rtw_set_txpower,\n\t.get_tx_power = cfg80211_rtw_get_txpower,\n\t.set_power_mgmt = cfg80211_rtw_set_power_mgmt,\n\t.set_pmksa = cfg80211_rtw_set_pmksa,\n\t.del_pmksa = cfg80211_rtw_del_pmksa,\n\t.flush_pmksa = cfg80211_rtw_flush_pmksa,\n\t\n#ifdef CONFIG_AP_MODE\n\t.add_virtual_intf = cfg80211_rtw_add_virtual_intf,\n\t.del_virtual_intf = cfg80211_rtw_del_virtual_intf,\n\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(COMPAT_KERNEL_RELEASE)\n\t.add_beacon = cfg80211_rtw_add_beacon,\n\t.set_beacon = cfg80211_rtw_set_beacon,\n\t.del_beacon = cfg80211_rtw_del_beacon,\n\t#else\n\t.start_ap = cfg80211_rtw_start_ap,\n\t.change_beacon = cfg80211_rtw_change_beacon,\n\t.stop_ap = cfg80211_rtw_stop_ap,\n\t#endif\n\t\n\t.add_station = cfg80211_rtw_add_station,\n\t.del_station = cfg80211_rtw_del_station,\n\t.change_station = cfg80211_rtw_change_station,\n\t.dump_station = cfg80211_rtw_dump_station,\n\t.change_bss = cfg80211_rtw_change_bss,\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))\n\t.set_channel = cfg80211_rtw_set_channel,\n\t#endif\n\t//.auth = cfg80211_rtw_auth,\n\t//.assoc = cfg80211_rtw_assoc,\t\n#endif //CONFIG_AP_MODE\n\n#ifdef CONFIG_P2P\n\t.remain_on_channel = cfg80211_rtw_remain_on_channel,\n\t.cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,\n#endif\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)\t \n\t.mgmt_tx = cfg80211_rtw_mgmt_tx,\n\t.mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,\n#elif  (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,34) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,35))\n\t.action = cfg80211_rtw_mgmt_tx,\n#endif\n\n#if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))\n\t.tdls_mgmt = cfg80211_rtw_tdls_mgmt,\n\t.tdls_oper = cfg80211_rtw_tdls_oper,\n#endif /* CONFIG_TDLS */\n\n#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\n\t.sched_scan_start = cfg80211_rtw_sched_scan_start,\n\t.sched_scan_stop = cfg80211_rtw_sched_scan_stop,\n#endif /* CONFIG_PNO_SUPPORT */\n};\n\nstruct wiphy *rtw_wiphy_alloc(_adapter *padapter, struct device *dev)\n{\n\tstruct wiphy *wiphy;\n\tstruct rtw_wiphy_data *wiphy_data;\n\n\t/* wiphy */\n\twiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(_adapter*));\n\tif (!wiphy) {\n\t\tDBG_8192C(\"Couldn't allocate wiphy device\\n\");\n\t\tgoto exit;\n\t}\n\tset_wiphy_dev(wiphy, dev);\n\t*((_adapter**)wiphy_priv(wiphy)) = padapter;\n\n\trtw_cfg80211_preinit_wiphy(padapter, wiphy);\n\n\tDBG_871X(FUNC_WIPHY_FMT\"\\n\", FUNC_WIPHY_ARG(wiphy));\n\nexit:\n\treturn wiphy;\n}\n\nvoid rtw_wiphy_free(struct wiphy *wiphy)\n{\n\tif (!wiphy)\n\t\treturn;\n\n\tDBG_871X(FUNC_WIPHY_FMT\"\\n\", FUNC_WIPHY_ARG(wiphy));\n\n\tif (wiphy->bands[IEEE80211_BAND_2GHZ]) {\n\t\trtw_spt_band_free(wiphy->bands[IEEE80211_BAND_2GHZ]);\n\t\twiphy->bands[IEEE80211_BAND_2GHZ] = NULL;\n\t}\n\tif (wiphy->bands[IEEE80211_BAND_5GHZ]) {\n\t\trtw_spt_band_free(wiphy->bands[IEEE80211_BAND_5GHZ]);\n\t\twiphy->bands[IEEE80211_BAND_5GHZ] = NULL;\n\t}\n\n\twiphy_free(wiphy);\n}\n\nint rtw_wiphy_register(struct wiphy *wiphy)\n{\n\tDBG_871X(FUNC_WIPHY_FMT\"\\n\", FUNC_WIPHY_ARG(wiphy));\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\n\trtw_cfgvendor_attach(wiphy);\n#endif\n\n\treturn wiphy_register(wiphy);\n}\n\nvoid rtw_wiphy_unregister(struct wiphy *wiphy)\n{\n\tDBG_871X(FUNC_WIPHY_FMT\"\\n\", FUNC_WIPHY_ARG(wiphy));\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\n\trtw_cfgvendor_detach(wiphy);\n#endif\n\n\treturn wiphy_unregister(wiphy);\n}\n\nint rtw_wdev_alloc(_adapter *padapter, struct wiphy *wiphy)\n{\n\tint ret = 0;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\tstruct wireless_dev *wdev;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\t\n\tDBG_8192C(\"%s(padapter=%p)\\n\", __func__, padapter);\n\n\t/*  wdev */\n\twdev = (struct wireless_dev *)rtw_zmalloc(sizeof(struct wireless_dev));\n\tif (!wdev) {\n\t\tDBG_8192C(\"Couldn't allocate wireless device\\n\");\n\t\tret = -ENOMEM;\n\t\tgoto exit;\n\t}\n\twdev->wiphy = wiphy;\n\twdev->netdev = pnetdev;\n\n\twdev->iftype = NL80211_IFTYPE_STATION; // will be init in rtw_hal_init()\n\t                                       // Must sync with _rtw_init_mlme_priv() \n\t\t\t\t\t\t\t\t\t\t   // pmlmepriv->fw_state = WIFI_STATION_STATE\n\t//wdev->iftype = NL80211_IFTYPE_MONITOR; // for rtw_setopmode_cmd() in cfg80211_rtw_change_iface()\n\tpadapter->rtw_wdev = wdev;\n\tpnetdev->ieee80211_ptr = wdev;\n\n\t//init pwdev_priv\n\tpwdev_priv = adapter_wdev_data(padapter);\n\tpwdev_priv->rtw_wdev = wdev;\n\tpwdev_priv->pmon_ndev = NULL;\n\tpwdev_priv->ifname_mon[0] = '\\0';\n\tpwdev_priv->padapter = padapter;\n\tpwdev_priv->scan_request = NULL;\n\t_rtw_spinlock_init(&pwdev_priv->scan_req_lock);\n\t\t\n\tpwdev_priv->p2p_enabled = _FALSE;\n\tpwdev_priv->provdisc_req_issued = _FALSE;\n\trtw_wdev_invit_info_init(&pwdev_priv->invit_info);\n\trtw_wdev_nego_info_init(&pwdev_priv->nego_info);\n\t\t\n\tpwdev_priv->bandroid_scan = _FALSE;\n\n\tif(padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)\n\t\tpwdev_priv->power_mgmt = _TRUE;\n\telse\n\t\tpwdev_priv->power_mgmt = _FALSE;\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tATOMIC_SET(&pwdev_priv->switch_ch_to, 1);\t\n\tATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\t\n#endif\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_wdev_free(struct wireless_dev *wdev)\n{\n\tDBG_8192C(\"%s(wdev=%p)\\n\", __func__, wdev);\n\n\tif (!wdev)\n\t\treturn;\n\n\trtw_mfree((u8*)wdev, sizeof(struct wireless_dev));\n}\n\nvoid rtw_wdev_unregister(struct wireless_dev *wdev)\n{\n\tstruct net_device *ndev;\n\t_adapter *adapter;\n\tstruct rtw_wdev_priv *pwdev_priv;\n\n\tDBG_8192C(\"%s(wdev=%p)\\n\", __func__, wdev);\n\n\tif (!wdev)\n\t\treturn;\n\n\tif(!(ndev = wdev_to_ndev(wdev)))\n\t\treturn;\n\n\tadapter = (_adapter *)rtw_netdev_priv(ndev);\n\tpwdev_priv = adapter_wdev_data(adapter);\n\n\trtw_cfg80211_indicate_scan_done(adapter, _TRUE);\n\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))\n\tif (wdev->current_bss) {\n\t\tu8 locally_generated = 1;\n\t\tDBG_871X(FUNC_ADPT_FMT\" clear current_bss by cfg80211_disconnected\\n\", FUNC_ADPT_ARG(adapter));\n\t\tcfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC);\n\t}\n\t#elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0))) || defined(COMPAT_KERNEL_RELEASE)\t\n\tif (wdev->current_bss) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" clear current_bss by cfg80211_disconnected\\n\", FUNC_ADPT_ARG(adapter));\n\t\tcfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);\n\t}\n\t#endif\n\n\tif (pwdev_priv->pmon_ndev) {\n\t\tDBG_8192C(\"%s, unregister monitor interface\\n\", __func__);\n\t\tunregister_netdev(pwdev_priv->pmon_ndev);\n\t}\n}\n\nint rtw_cfg80211_ndev_res_alloc(_adapter *adapter)\n{\n\tint ret = _FAIL;\n\n#if !defined(RTW_SINGLE_WIPHY)\n\tstruct wiphy *wiphy;\n\tstruct device *dev = dvobj_to_dev(adapter_to_dvobj(adapter));\n\n\twiphy = rtw_wiphy_alloc(adapter, dev);\n\tif (wiphy == NULL)\n\t\tgoto exit;\n\n\tadapter->wiphy = wiphy;\n#endif\n\n\tif (rtw_wdev_alloc(adapter, adapter_to_wiphy(adapter)) == 0)\n\t\tret = _SUCCESS;\n\n#if !defined(RTW_SINGLE_WIPHY)\n\tif (ret != _SUCCESS) {\n\t\trtw_wiphy_free(wiphy);\n\t\tadapter->wiphy = NULL;\n\t}\n#endif\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_cfg80211_ndev_res_free(_adapter *adapter)\n{\n\trtw_wdev_free(adapter->rtw_wdev);\n#if !defined(RTW_SINGLE_WIPHY)\n\trtw_wiphy_free(adapter_to_wiphy(adapter));\n\tadapter->wiphy = NULL;\n#endif\n}\n\nint rtw_cfg80211_ndev_res_register(_adapter *adapter)\n{\n\tint ret = _FAIL;\n\n#if !defined(RTW_SINGLE_WIPHY)\n\tif (rtw_wiphy_register(adapter_to_wiphy(adapter)) < 0) {\n\t\tDBG_871X(\"%s rtw_wiphy_register fail for if%d\\n\", __func__, (adapter->iface_id+1));\n\t\tgoto exit;\n\t}\n#endif\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_cfg80211_ndev_res_unregister(_adapter *adapter)\n{\n\trtw_wdev_unregister(adapter->rtw_wdev);\n}\n\nint rtw_cfg80211_dev_res_alloc(struct dvobj_priv *dvobj)\n{\n\tint ret = _FAIL;\n\n#if defined(RTW_SINGLE_WIPHY)\n\tstruct wiphy *wiphy;\n\tstruct device *dev = dvobj_to_dev(dvobj);\n\n\twiphy = rtw_wiphy_alloc(dvobj->padapters[IFACE_ID0], dev);\n\tif (wiphy == NULL)\n\t\tgoto exit;\n\n\tdvobj->wiphy = wiphy;\n#endif\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_cfg80211_dev_res_free(struct dvobj_priv *dvobj)\n{\n#if defined(RTW_SINGLE_WIPHY)\n\trtw_wiphy_free(dvobj_to_wiphy(dvobj));\n\tdvobj->wiphy = NULL;\n#endif\n}\n\nint rtw_cfg80211_dev_res_register(struct dvobj_priv *dvobj)\n{\n\tint ret = _FAIL;\n\n#if defined(RTW_SINGLE_WIPHY)\n\tif (rtw_wiphy_register(dvobj_to_wiphy(dvobj)) != 0)\n\t\tgoto exit;\n#endif\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_cfg80211_dev_res_unregister(struct dvobj_priv *dvobj)\n{\n#if defined(RTW_SINGLE_WIPHY)\n\trtw_wiphy_unregister(dvobj_to_wiphy(dvobj));\n#endif\n}\n\n#endif /* CONFIG_IOCTL_CFG80211 */\n\n"
  },
  {
    "path": "os_dep/linux/ioctl_cfg80211.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __IOCTL_CFG80211_H__\n#define __IOCTL_CFG80211_H__ \n\n\n#if defined(RTW_USE_CFG80211_STA_EVENT)\n\t#undef CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER\n#endif\n\nstruct rtw_wdev_invit_info {\n\tu8 state; /* 0: req, 1:rep */\n\tu8 peer_mac[ETH_ALEN];\n\tu8 active;\n\tu8 token;\n\tu8 flags;\n\tu8 status;\n\tu8 req_op_ch;\n\tu8 rsp_op_ch;\n};\n\n#define rtw_wdev_invit_info_init(invit_info) \\\n\tdo { \\\n\t\t(invit_info)->state = 0xff; \\\n\t\t_rtw_memset((invit_info)->peer_mac, 0, ETH_ALEN); \\\n\t\t(invit_info)->active = 0xff; \\\n\t\t(invit_info)->token = 0; \\\n\t\t(invit_info)->flags = 0x00; \\\n\t\t(invit_info)->status = 0xff; \\\n\t\t(invit_info)->req_op_ch = 0; \\\n\t\t(invit_info)->rsp_op_ch = 0; \\\n\t} while (0)\n\nstruct rtw_wdev_nego_info {\n\tu8 state; /* 0: req, 1:rep, 2:conf */\n\tu8 peer_mac[ETH_ALEN];\n\tu8 active;\n\tu8 token;\n\tu8 status;\n\tu8 req_intent;\n\tu8 req_op_ch;\n\tu8 req_listen_ch;\n\tu8 rsp_intent;\n\tu8 rsp_op_ch;\n\tu8 conf_op_ch;\n};\n\n#define rtw_wdev_nego_info_init(nego_info) \\\n\tdo { \\\n\t\t(nego_info)->state = 0xff; \\\n\t\t_rtw_memset((nego_info)->peer_mac, 0, ETH_ALEN); \\\n\t\t(nego_info)->active = 0xff; \\\n\t\t(nego_info)->token = 0; \\\n\t\t(nego_info)->status = 0xff; \\\n\t\t(nego_info)->req_intent = 0xff; \\\n\t\t(nego_info)->req_op_ch = 0; \\\n\t\t(nego_info)->req_listen_ch = 0; \\\n\t\t(nego_info)->rsp_intent = 0xff; \\\n\t\t(nego_info)->rsp_op_ch = 0; \\\n\t\t(nego_info)->conf_op_ch = 0; \\\n\t} while (0)\n\nstruct rtw_wdev_priv\n{\t\n\tstruct wireless_dev *rtw_wdev;\n\t\n\t_adapter *padapter;\n\n\tstruct cfg80211_scan_request *scan_request;\n\t_lock scan_req_lock;\n\n\tstruct net_device *pmon_ndev;//for monitor interface\n\tchar ifname_mon[IFNAMSIZ + 1]; //interface name for monitor interface\n\n\tu8 p2p_enabled;\n\n\tu8 provdisc_req_issued;\n\n\tstruct rtw_wdev_invit_info invit_info;\n\tstruct rtw_wdev_nego_info nego_info;\n\n\tu8 bandroid_scan;\n\tbool block;\n\tbool block_scan;\n\tbool power_mgmt;\n\n\t/* report mgmt_frame registered */\n\tu16 report_mgmt;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tATOMIC_T ro_ch_to;\n\tATOMIC_T switch_ch_to;\t\n#endif\t\n\t\n};\n\n#define wiphy_to_adapter(x) (*((_adapter**)wiphy_priv(x)))\n\n#define wdev_to_ndev(w) ((w)->netdev)\n#define wdev_to_wiphy(w) ((w)->wiphy)\n#define ndev_to_wdev(n) ((n)->ieee80211_ptr)\n\n#define WIPHY_FMT \"%s\"\n#define WIPHY_ARG(wiphy) wiphy_name(wiphy)\n#define FUNC_WIPHY_FMT \"%s(\"WIPHY_FMT\")\"\n#define FUNC_WIPHY_ARG(wiphy) __func__, WIPHY_ARG(wiphy)\n\n#define SET_CFG80211_REPORT_MGMT(w, t, v) (w->report_mgmt |= (v?BIT(t >> 4):0))\n#define GET_CFG80211_REPORT_MGMT(w, t) ((w->report_mgmt & BIT(t >> 4)) > 0)\n\nstruct wiphy *rtw_wiphy_alloc(_adapter *padapter, struct device *dev);\nvoid rtw_wiphy_free(struct wiphy *wiphy);\nint rtw_wiphy_register(struct wiphy *wiphy);\nvoid rtw_wiphy_unregister(struct wiphy *wiphy);\n\nint rtw_wdev_alloc(_adapter *padapter, struct wiphy *wiphy);\nvoid rtw_wdev_free(struct wireless_dev *wdev);\nvoid rtw_wdev_unregister(struct wireless_dev *wdev);\n\nint rtw_cfg80211_ndev_res_alloc(_adapter *adapter);\nvoid rtw_cfg80211_ndev_res_free(_adapter *adapter);\nint rtw_cfg80211_ndev_res_register(_adapter *adapter);\nvoid rtw_cfg80211_ndev_res_unregister(_adapter *adapter);\n\nint rtw_cfg80211_dev_res_alloc(struct dvobj_priv *dvobj);\nvoid rtw_cfg80211_dev_res_free(struct dvobj_priv *dvobj);\nint rtw_cfg80211_dev_res_register(struct dvobj_priv *dvobj);\nvoid rtw_cfg80211_dev_res_unregister(struct dvobj_priv *dvobj);\n\nvoid rtw_cfg80211_init_wiphy(_adapter *padapter);\n\nvoid rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork);\nvoid rtw_cfg80211_surveydone_event_callback(_adapter *padapter);\nstruct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork);\nint rtw_cfg80211_check_bss(_adapter *padapter);\nvoid rtw_cfg80211_ibss_indicate_connect(_adapter *padapter);\nvoid rtw_cfg80211_indicate_connect(_adapter *padapter);\nvoid rtw_cfg80211_indicate_disconnect(_adapter *padapter);\nvoid rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted);\nu32 rtw_cfg80211_wait_scan_req_empty(_adapter *adapter, u32 timeout_ms);\n\n#ifdef CONFIG_AP_MODE\nvoid rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\nvoid rtw_cfg80211_indicate_sta_disassoc(_adapter *padapter, unsigned char *da, unsigned short reason);\n#endif //CONFIG_AP_MODE\n\nvoid rtw_cfg80211_issue_p2p_provision_request(_adapter *padapter, const u8 *buf, size_t len);\nvoid rtw_cfg80211_rx_p2p_action_public(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\nvoid rtw_cfg80211_rx_action_p2p(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\nvoid rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const char*msg);\nvoid rtw_cfg80211_rx_probe_request(_adapter *padapter, u8 *pmgmt_frame, uint frame_len);\n\nint rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, int type);\n\nbool rtw_cfg80211_pwr_mgmt(_adapter *adapter);\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))  && !defined(COMPAT_KERNEL_RELEASE)\n#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, buf, len, gfp)\n#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\n#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->pnetdev, freq, sig_dbm, buf, len, gfp)\n#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0))\n#define rtw_cfg80211_rx_mgmt(adapter, freq, sig_dbm, buf, len, gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev, freq, sig_dbm, buf, len, gfp)\n#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3 , 18 , 0))\n#define rtw_cfg80211_rx_mgmt(adapter , freq , sig_dbm , buf , len , gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev , freq , sig_dbm , buf , len , 0 , gfp)\n#else\n#define rtw_cfg80211_rx_mgmt(adapter , freq , sig_dbm , buf , len , gfp) cfg80211_rx_mgmt((adapter)->rtw_wdev , freq , sig_dbm , buf , len , 0)\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))  && !defined(COMPAT_KERNEL_RELEASE)\n#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, buf, len)\n#else\n#define rtw_cfg80211_send_rx_assoc(adapter, bss, buf, len) cfg80211_send_rx_assoc((adapter)->pnetdev, bss, buf, len)\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\n#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->pnetdev, cookie, buf, len, ack, gfp)\n#else\n#define rtw_cfg80211_mgmt_tx_status(adapter, cookie, buf, len, ack, gfp) cfg80211_mgmt_tx_status((adapter)->rtw_wdev, cookie, buf, len, ack, gfp)\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0))\n#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->pnetdev, cookie, chan, channel_type, duration, gfp)\n#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->pnetdev, cookie, chan, chan_type, gfp)\n#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0))\n#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, channel_type, duration, gfp)\n#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, chan_type, gfp)\n#else\n#define rtw_cfg80211_ready_on_channel(adapter, cookie, chan, channel_type, duration, gfp)  cfg80211_ready_on_channel((adapter)->rtw_wdev, cookie, chan, duration, gfp)\n#define rtw_cfg80211_remain_on_channel_expired(adapter, cookie, chan, chan_type, gfp) cfg80211_remain_on_channel_expired((adapter)->rtw_wdev, cookie, chan, gfp)\n#endif\n\n#include \"rtw_cfgvendor.h\"\n\n#endif //__IOCTL_CFG80211_H__\n\n"
  },
  {
    "path": "os_dep/linux/ioctl_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _IOCTL_LINUX_C_\n\n#include <drv_types.h>\n#include <rtw_mp.h>\n#include <rtw_mp_ioctl.h>\n#include \"../../hal/phydm/phydm_precomp.h\"\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))\n#define  iwe_stream_add_event(a, b, c, d, e)  iwe_stream_add_event(b, c, d, e)\n#define  iwe_stream_add_point(a, b, c, d, e)  iwe_stream_add_point(b, c, d, e)\n#endif\n\n#ifdef CONFIG_80211N_HT\nextern int rtw_ht_enable;\n#endif\n\n\n#define RTL_IOCTL_WPA_SUPPLICANT\tSIOCIWFIRSTPRIV+30\n\n#define SCAN_ITEM_SIZE 768\n#define MAX_CUSTOM_LEN 64\n#define RATE_COUNT 4\n\n#ifdef CONFIG_GLOBAL_UI_PID\nextern int ui_pid[3];\n#endif\n\n// combo scan\n#define WEXT_CSCAN_AMOUNT 9\n#define WEXT_CSCAN_BUF_LEN\t\t360\n#define WEXT_CSCAN_HEADER\t\t\"CSCAN S\\x01\\x00\\x00S\\x00\"\n#define WEXT_CSCAN_HEADER_SIZE\t\t12\n#define WEXT_CSCAN_SSID_SECTION\t\t'S'\n#define WEXT_CSCAN_CHANNEL_SECTION\t'C'\n#define WEXT_CSCAN_NPROBE_SECTION\t'N'\n#define WEXT_CSCAN_ACTV_DWELL_SECTION\t'A'\n#define WEXT_CSCAN_PASV_DWELL_SECTION\t'P'\n#define WEXT_CSCAN_HOME_DWELL_SECTION\t'H'\n#define WEXT_CSCAN_TYPE_SECTION\t\t'T'\n\n\nextern u8 key_2char2num(u8 hch, u8 lch);\nextern u8 str_2char2num(u8 hch, u8 lch);\nextern void macstr2num(u8 *dst, u8 *src);\nextern u8 convert_ip_addr(u8 hch, u8 mch, u8 lch);\n\nu32 rtw_rates[] = {1000000,2000000,5500000,11000000,\n\t6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};\n\nstatic const char * const iw_operation_mode[] = \n{ \n\t\"Auto\", \"Ad-Hoc\", \"Managed\",  \"Master\", \"Repeater\", \"Secondary\", \"Monitor\" \n};\n\nstatic int hex2num_i(char c)\n{\n\tif (c >= '0' && c <= '9')\n\t\treturn c - '0';\n\tif (c >= 'a' && c <= 'f')\n\t\treturn c - 'a' + 10;\n\tif (c >= 'A' && c <= 'F')\n\t\treturn c - 'A' + 10;\n\treturn -1;\n}\n\nstatic int hex2byte_i(const char *hex)\n{\n\tint a, b;\n\ta = hex2num_i(*hex++);\n\tif (a < 0)\n\t\treturn -1;\n\tb = hex2num_i(*hex++);\n\tif (b < 0)\n\t\treturn -1;\n\treturn (a << 4) | b;\n}\n\n/**\n * hwaddr_aton - Convert ASCII string to MAC address\n * @txt: MAC address as a string (e.g., \"00:11:22:33:44:55\")\n * @addr: Buffer for the MAC address (ETH_ALEN = 6 bytes)\n * Returns: 0 on success, -1 on failure (e.g., string not a MAC address)\n */\nstatic int hwaddr_aton_i(const char *txt, u8 *addr)\n{\n\tint i;\n\n\tfor (i = 0; i < 6; i++) {\n\t\tint a, b;\n\n\t\ta = hex2num_i(*txt++);\n\t\tif (a < 0)\n\t\t\treturn -1;\n\t\tb = hex2num_i(*txt++);\n\t\tif (b < 0)\n\t\t\treturn -1;\n\t\t*addr++ = (a << 4) | b;\n\t\tif (i < 5 && *txt++ != ':')\n\t\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nstatic void indicate_wx_custom_event(_adapter *padapter, char *msg)\n{\n\tu8 *buff, *p;\n\tunion iwreq_data wrqu;\n\n\tif (strlen(msg) > IW_CUSTOM_MAX) {\n\t\tDBG_871X(\"%s strlen(msg):%zu > IW_CUSTOM_MAX:%u\\n\", __FUNCTION__ , strlen(msg), IW_CUSTOM_MAX);\n\t\treturn;\n\t}\n\n\tbuff = rtw_zmalloc(IW_CUSTOM_MAX+1);\n\tif(!buff)\n\t\treturn;\n\n\t_rtw_memcpy(buff, msg, strlen(msg));\n\t\t\n\t_rtw_memset(&wrqu,0,sizeof(wrqu));\n\twrqu.data.length = strlen(msg);\n\n\tDBG_871X(\"%s %s\\n\", __FUNCTION__, buff);\t\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff);\n#endif\n\n\trtw_mfree(buff, IW_CUSTOM_MAX+1);\n\n}\n\n\nstatic void request_wps_pbc_event(_adapter *padapter)\n{\n\tu8 *buff, *p;\n\tunion iwreq_data wrqu;\n\n\n\tbuff = rtw_malloc(IW_CUSTOM_MAX);\n\tif(!buff)\n\t\treturn;\n\t\t\n\t_rtw_memset(buff, 0, IW_CUSTOM_MAX);\n\t\t\n\tp=buff;\n\t\t\n\tp+=sprintf(p, \"WPS_PBC_START.request=TRUE\");\n\t\t\n\t_rtw_memset(&wrqu,0,sizeof(wrqu));\n\t\t\n\twrqu.data.length = p-buff;\n\t\t\n\twrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\t\t\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, IWEVCUSTOM, &wrqu, buff);\n#endif\n\n\tif(buff)\n\t{\n\t\trtw_mfree(buff, IW_CUSTOM_MAX);\n\t}\n\n}\n\n#ifdef CONFIG_SUPPORT_HW_WPS_PBC\nvoid rtw_request_wps_pbc_event(_adapter *padapter)\n{\n#ifdef RTK_DMP_PLATFORM\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\n\tkobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC);\n#else\n\tkobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC);\n#endif\n#else\n\n\tif ( padapter->pid[0] == 0 )\n\t{\t//\t0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver.\n\t\treturn;\n\t}\n\n\trtw_signal_process(padapter->pid[0], SIGUSR1);\n\n#endif\n\n\trtw_led_control(padapter, LED_CTL_START_WPS_BOTTON);\n}\n#endif//#ifdef CONFIG_SUPPORT_HW_WPS_PBC\n\nvoid indicate_wx_scan_complete_event(_adapter *padapter)\n{\t\n\tunion iwreq_data wrqu;\n\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\t\n\n\t_rtw_memset(&wrqu, 0, sizeof(union iwreq_data));\n\n\t//DBG_871X(\"+rtw_indicate_wx_scan_complete_event\\n\");\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, SIOCGIWSCAN, &wrqu, NULL);\n#endif\n}\n\n\nvoid rtw_indicate_wx_assoc_event(_adapter *padapter)\n{\t\n\tunion iwreq_data wrqu;\n\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tWLAN_BSSID_EX\t\t*pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));\n\n\t_rtw_memset(&wrqu, 0, sizeof(union iwreq_data));\n\t\n\twrqu.ap_addr.sa_family = ARPHRD_ETHER;\t\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE )\n\t\t_rtw_memcpy(wrqu.ap_addr.sa_data, pnetwork->MacAddress, ETH_ALEN);\n\telse\n\t\t_rtw_memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN);\n\n\tDBG_871X_LEVEL(_drv_always_, \"assoc success\\n\");\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);\n#endif\n}\n\nvoid rtw_indicate_wx_disassoc_event(_adapter *padapter)\n{\t\n\tunion iwreq_data wrqu;\n\n\t_rtw_memset(&wrqu, 0, sizeof(union iwreq_data));\n\n\twrqu.ap_addr.sa_family = ARPHRD_ETHER;\n\t_rtw_memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);\n\n#ifndef CONFIG_IOCTL_CFG80211\n\tDBG_871X_LEVEL(_drv_always_, \"indicate disassoc\\n\");\n\twireless_send_event(padapter->pnetdev, SIOCGIWAP, &wrqu, NULL);\n#endif\n}\n\n/*\nuint\trtw_is_cckrates_included(u8 *rate)\n{\t\n\t\tu32\ti = 0;\t\t\t\n\n\t\twhile(rate[i]!=0)\n\t\t{\t\t\n\t\t\tif  (  (((rate[i]) & 0x7f) == 2)\t|| (((rate[i]) & 0x7f) == 4) ||\t\t\n\t\t\t(((rate[i]) & 0x7f) == 11)  || (((rate[i]) & 0x7f) == 22) )\t\t\n\t\t\treturn _TRUE;\t\n\t\t\ti++;\n\t\t}\n\t\t\n\t\treturn _FALSE;\n}\n\nuint\trtw_is_cckratesonly_included(u8 *rate)\n{\n\tu32 i = 0;\n\n\twhile(rate[i]!=0)\n\t{\n\t\t\tif  (  (((rate[i]) & 0x7f) != 2) && (((rate[i]) & 0x7f) != 4) &&\n\t\t\t\t(((rate[i]) & 0x7f) != 11)  && (((rate[i]) & 0x7f) != 22) )\n\t\t\treturn _FALSE;\t\t\n\t\t\ti++;\n\t}\n\t\n\treturn _TRUE;\n}\n*/\n\nstatic int search_p2p_wfd_ie(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop)\n{\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info\t*pwdinfo = &padapter->wdinfo;\n#ifdef CONFIG_WFD\n\tif ( SCAN_RESULT_ALL == pwdinfo->wfd_info->scan_result_type )\n\t{\n\n\t}\n\telse if ( ( SCAN_RESULT_P2P_ONLY == pwdinfo->wfd_info->scan_result_type ) || \n\t\t      ( SCAN_RESULT_WFD_TYPE == pwdinfo->wfd_info->scan_result_type ) )\n#endif // CONFIG_WFD\n\t{\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\tu32\tblnGotP2PIE = _FALSE;\n\t\t\t\n\t\t\t//\tUser is doing the P2P device discovery\n\t\t\t//\tThe prefix of SSID should be \"DIRECT-\" and the IE should contains the P2P IE.\n\t\t\t//\tIf not, the driver should ignore this AP and go to the next AP.\n\n\t\t\t//\tVerifying the SSID\n\t\t\tif ( _rtw_memcmp( pnetwork->network.Ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN ) )\n\t\t\t{\n\t\t\t\tu32\tp2pielen = 0;\n\n\t\t\t\t//\tVerifying the P2P IE\n\t\t\t\tif (rtw_get_p2p_ie_from_scan_queue(&pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])) \n\t\t\t\t{\n\t\t\t\t\tblnGotP2PIE = _TRUE;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( blnGotP2PIE == _FALSE )\n\t\t\t{\n\t\t\t\treturn _FALSE;\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\n#ifdef CONFIG_WFD\n\tif ( SCAN_RESULT_WFD_TYPE == pwdinfo->wfd_info->scan_result_type )\n\t{\n\t\tu32\tblnGotWFD = _FALSE;\n\t\tu8\twfd_ie[ 128 ] = { 0x00 };\n\t\tuint\twfd_ielen = 0;\n\t\t\n\t\tif ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )\n\t\t{\n\t\t\tu8\twfd_devinfo[ 6 ] = { 0x00 };\n\t\t\tuint\twfd_devlen = 6;\n\t\t\t\n\t\t\tif ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen) )\n\t\t\t{\n\t\t\t\tif ( pwdinfo->wfd_info->wfd_device_type == WFD_DEVINFO_PSINK )\n\t\t\t\t{\n\t\t\t\t\t//\tthe first two bits will indicate the WFD device type\n\t\t\t\t\tif ( ( wfd_devinfo[ 1 ] & 0x03 ) == WFD_DEVINFO_SOURCE )\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tIf this device is Miracast PSink device, the scan reuslt should just provide the Miracast source.\n\t\t\t\t\t\tblnGotWFD = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( pwdinfo->wfd_info->wfd_device_type == WFD_DEVINFO_SOURCE )\n\t\t\t\t{\n\t\t\t\t\t//\tthe first two bits will indicate the WFD device type\n\t\t\t\t\tif ( ( wfd_devinfo[ 1 ] & 0x03 ) == WFD_DEVINFO_PSINK )\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tIf this device is Miracast source device, the scan reuslt should just provide the Miracast PSink.\n\t\t\t\t\t\t//\tTodo: How about the SSink?!\n\t\t\t\t\t\tblnGotWFD = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( blnGotWFD == _FALSE )\n\t\t{\n\t\t\treturn _FALSE;\n\t\t}\n\t}\n#endif // CONFIG_WFD\n\n#endif //CONFIG_P2P\n\treturn _TRUE;\n}\n static inline char *iwe_stream_mac_addr_proess(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\t\n\t/*  AP MAC address  */\n\tiwe->cmd = SIOCGIWAP;\n\tiwe->u.ap_addr.sa_family = ARPHRD_ETHER;\n\n\t_rtw_memcpy(iwe->u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);\n\tstart = iwe_stream_add_event(info, start, stop, iwe, IW_EV_ADDR_LEN);\t\n\treturn start;\n}\n static inline char * iwe_stream_essid_proess(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n\t\n\t/* Add the ESSID */\n\tiwe->cmd = SIOCGIWESSID;\n\tiwe->u.data.flags = 1;\t\n\tiwe->u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);\n\tstart = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);\t\t\n\treturn start;\n}\n\n static inline char * iwe_stream_chan_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n\tif(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)\n\t\tpnetwork->network.Configuration.DSConfig = 1;\n\n\t /* Add frequency/channel */\n\tiwe->cmd = SIOCGIWFREQ;\n\tiwe->u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;\n\tiwe->u.freq.e = 1;\n\tiwe->u.freq.i = pnetwork->network.Configuration.DSConfig;\n\tstart = iwe_stream_add_event(info, start, stop, iwe, IW_EV_FREQ_LEN);\n\treturn start;\n}\n static inline char * iwe_stream_mode_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe,u16 cap)\n{\n\t/* Add mode */\n\tif(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){\n\t\tiwe->cmd = SIOCGIWMODE;\n\t\tif (cap & WLAN_CAPABILITY_BSS)\n\t\t\tiwe->u.mode = IW_MODE_MASTER;\n\t\telse\n\t\t\tiwe->u.mode = IW_MODE_ADHOC;\n\n\t\tstart = iwe_stream_add_event(info, start, stop, iwe, IW_EV_UINT_LEN);\n\t}\n\treturn start;\n }\n static inline char * iwe_stream_encryption_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe,u16 cap)\n{\t\n\n\t/* Add encryption capability */\n\tiwe->cmd = SIOCGIWENCODE;\n\tif (cap & WLAN_CAPABILITY_PRIVACY)\n\t\tiwe->u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;\n\telse\n\t\tiwe->u.data.flags = IW_ENCODE_DISABLED;\n\tiwe->u.data.length = 0;\n\tstart = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);\n\treturn start;\n\n}\t\n\n static inline char * iwe_stream_protocol_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n {\n \tu16 ht_cap=_FALSE,vht_cap = _FALSE;\n\tu32 ht_ielen = 0, vht_ielen = 0;\n\tchar *p;\n\tu8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);// Probe Request\t\n\t\t\n\t//parsing HT_CAP_IE\t\n\tp = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-ie_offset);\t\n\tif(p && ht_ielen>0)\t\t\n\t\tht_cap = _TRUE;\t\t\t\n\n\t#ifdef CONFIG_80211AC_VHT\n\t//parsing VHT_CAP_IE\n\tp = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength-ie_offset);\n\tif(p && vht_ielen>0)\n\t\tvht_cap = _TRUE;\t\n\t#endif\n\t /* Add the protocol name */\n\tiwe->cmd = SIOCGIWNAME;\n\tif ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)\t\t\n\t{\n\t\tif(ht_cap == _TRUE)\n\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11bn\");\n\t\telse\n\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11b\");\n\t}\t\n\telse if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)\t\n\t{\n\t\tif(ht_cap == _TRUE)\n\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11bgn\");\n\t\telse\n\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11bg\");\n\t}\t\n\telse\n\t{\n\t\tif(pnetwork->network.Configuration.DSConfig > 14)\n\t\t{\n\t\t\t#ifdef CONFIG_80211AC_VHT\n\t\t\tif(vht_cap == _TRUE){\n\t\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11AC\");\n\t\t\t}\n\t\t\telse \n\t\t\t#endif\t\n\t\t\t{\n\t\t\t\tif(ht_cap == _TRUE)\n\t\t\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11an\");\n\t\t\t\telse\n\t\t\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11a\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(ht_cap == _TRUE)\n\t\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11gn\");\n\t\t\telse\n\t\t\t\tsnprintf(iwe->u.name, IFNAMSIZ, \"IEEE 802.11g\");\n\t\t}\n\t}\n\tstart = iwe_stream_add_event(info, start, stop, iwe, IW_EV_CHAR_LEN);\n\treturn start;\n }\n\t\t\t\t\n static inline char * iwe_stream_rate_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n\tu32 ht_ielen = 0, vht_ielen = 0;\n\tchar *p;\n\tu16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;\n\tu32 i = 0;\t\t\n\tu8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;\n\tu16 mcs_rate=0, vht_data_rate=0;\n\tchar custom[MAX_CUSTOM_LEN]={0};\n\tu8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);// Probe Request\t\n \t\n\t//parsing HT_CAP_IE\t\n\tp = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-ie_offset);\t\n\tif(p && ht_ielen>0)\n\t{\n\t\tstruct rtw_ieee80211_ht_cap *pht_capie;\n\t\tht_cap = _TRUE;\t\t\t\n\t\tpht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);\t\t\n\t\t_rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);\n\t\tbw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;\n\t\tshort_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;\n\t}\n\n#ifdef CONFIG_80211AC_VHT\n\t//parsing VHT_CAP_IE\n\tp = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength-ie_offset);\n\tif(p && vht_ielen>0)\n\t{\n\t\tu8\tmcs_map[2];\n\n\t\tvht_cap = _TRUE;\t\t\n\t\tbw_160MHz = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p+2);\n\t\tif(bw_160MHz)\n\t\t\tshort_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI160M(p+2);\n\t\telse\n\t\t\tshort_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p+2);\n\n\t\t_rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p+2), 2);\n\n\t\tvht_highest_rate = rtw_get_vht_highest_rate(mcs_map);\n\t\tvht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);\n\t}\n#endif\t\n\t\n\t/*Add basic and extended rates */\t\n\tp = custom;\n\tp += snprintf(p, MAX_CUSTOM_LEN - (p - custom), \" Rates (Mb/s): \");\n\twhile(pnetwork->network.SupportedRates[i]!=0)\n\t{\n\t\trate = pnetwork->network.SupportedRates[i]&0x7F; \n\t\tif (rate > max_rate)\n\t\t\tmax_rate = rate;\n\t\tp += snprintf(p, MAX_CUSTOM_LEN - (p - custom),\n\t\t\t      \"%d%s \", rate >> 1, (rate & 1) ? \".5\" : \"\");\n\t\ti++;\n\t}\n#ifdef CONFIG_80211AC_VHT\n\tif(vht_cap == _TRUE) {\n\t\tmax_rate = vht_data_rate;\n\t}\n\telse\n#endif\t\t\n\tif(ht_cap == _TRUE)\n\t{\n\t\tif(mcs_rate&0x8000)//MCS15\n\t\t{\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);\n\t\t\t\n\t\t}\n\t\telse if(mcs_rate&0x0080)//MCS7\n\t\t{\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);\n\t\t}\n\t\telse//default MCS7\n\t\t{\n\t\t\t//DBG_871X(\"wx_get_scan, mcs_rate_bitmap=0x%x\\n\", mcs_rate);\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);\n\t\t}\n\n\t\tmax_rate = max_rate*2;//Mbps/2;\t\t\n\t}\n\n\tiwe->cmd = SIOCGIWRATE;\n\tiwe->u.bitrate.fixed = iwe->u.bitrate.disabled = 0;\n\tiwe->u.bitrate.value = max_rate * 500000;\n\tstart =iwe_stream_add_event(info, start, stop, iwe, IW_EV_PARAM_LEN);\n\treturn start ;\n}\n\nstatic inline char * iwe_stream_wpa_wpa2_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n\tint buf_size = MAX_WPA_IE_LEN*2;\n\t//u8 pbuf[buf_size]={0};\t\n\tu8 *pbuf = rtw_zmalloc(buf_size);\n\n\tu8 wpa_ie[255]={0},rsn_ie[255]={0};\n\tu16 i, wpa_len=0,rsn_len=0;\n\tu8 *p;\n\tsint out_len=0;\n\t\t\n\t\n\tif(pbuf){\n\t\tp=pbuf;\t\n\t\n\t\t//parsing WPA/WPA2 IE\n\t\tif (pnetwork->network.Reserved[0] != 2) // Probe Request\n\t\t{\t\n\t\t\tout_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\t\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: wpa_len=%d rsn_len=%d\\n\",wpa_len,rsn_len));\n\n\t\t\tif (wpa_len > 0){\n\t\t\t\t\n\t\t\t\t_rtw_memset(pbuf, 0, buf_size);\n\t\t\t\tp += sprintf(p, \"wpa_ie=\");\n\t\t\t\tfor (i = 0; i < wpa_len; i++) {\n\t\t\t\t\tp += sprintf(p, \"%02x\", wpa_ie[i]);\n\t\t\t\t}\n\n\t\t\t\tif (wpa_len > 100) {\n\t\t\t\t\tprintk(\"-----------------Len %d----------------\\n\", wpa_len);\n\t\t\t\t\tfor (i = 0; i < wpa_len; i++) {\n\t\t\t\t\t\tprintk(\"%02x \", wpa_ie[i]);\n\t\t\t\t\t}\n\t\t\t\t\tprintk(\"\\n\");\n\t\t\t\t\tprintk(\"-----------------Len %d----------------\\n\", wpa_len);\n\t\t\t\t}\n\t\t\n\t\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\t\tiwe->cmd = IWEVCUSTOM;\n\t\t\t\tiwe->u.data.length = strlen(pbuf);\n\t\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe,pbuf);\n\t\t\t\t\n\t\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\t\tiwe->cmd =IWEVGENIE;\n\t\t\t\tiwe->u.data.length = wpa_len;\n\t\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe, wpa_ie);\t\t\t\n\t\t\t}\n\t\t\tif (rsn_len > 0){\n\t\t\t\t\n\t\t\t\t_rtw_memset(pbuf, 0, buf_size);\n\t\t\t\tp += sprintf(p, \"rsn_ie=\");\n\t\t\t\tfor (i = 0; i < rsn_len; i++) {\n\t\t\t\t\tp += sprintf(p, \"%02x\", rsn_ie[i]);\n\t\t\t\t}\n\t\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\t\tiwe->cmd = IWEVCUSTOM;\n\t\t\t\tiwe->u.data.length = strlen(pbuf);\n\t\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe,pbuf);\n\t\t\t\n\t\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\t\tiwe->cmd =IWEVGENIE;\n\t\t\t\tiwe->u.data.length = rsn_len;\n\t\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe, rsn_ie);\t\t\n\t\t\t}\n\t\t}\n\t\n\t\trtw_mfree(pbuf, buf_size);\t\n\t}\n\treturn start;\n}\n\nstatic inline char * iwe_stream_wps_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\t\n \t//parsing WPS IE\n\tuint cnt = 0,total_ielen;\t\n\tu8 *wpsie_ptr=NULL;\n\tuint wps_ielen = 0;\t\t\n\tu8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);\n\t\n\tu8 *ie_ptr = pnetwork->network.IEs + ie_offset;\n\ttotal_ielen= pnetwork->network.IELength - ie_offset;\n\n\tif (pnetwork->network.Reserved[0] == 2) // Probe Request\n\t{\n\t\tie_ptr = pnetwork->network.IEs;\n\t\ttotal_ielen = pnetwork->network.IELength;\n\t}\n\telse     // Beacon or Probe Respones\n\t{\n\t\tie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_;\n\t\ttotal_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;\n\t}    \n\twhile(cnt < total_ielen)\n\t{\n\t\tif(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))\t\t\t\n\t\t{\n\t\t\twpsie_ptr = &ie_ptr[cnt];\n\t\t\tiwe->cmd =IWEVGENIE;\n\t\t\tiwe->u.data.length = (u16)wps_ielen;\n\t\t\tstart = iwe_stream_add_point(info, start, stop,iwe, wpsie_ptr);\t\t\t\t\t\t\n\t\t}\t\t\t\n\t\tcnt+=ie_ptr[cnt+1]+2; //goto next\n\t}\n\treturn start;\n}\n\nstatic inline char * iwe_stream_wapi_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n#ifdef CONFIG_WAPI_SUPPORT\n\tchar *p;\n\t\t\n\tif (pnetwork->network.Reserved[0] != 2) // Probe Request\n\t{\t\t\n\t\tsint out_len_wapi=0;\n\t\t/* here use static for stack size */\n\t\tstatic u8 buf_wapi[MAX_WAPI_IE_LEN*2]={0};\n\t\tstatic u8 wapi_ie[MAX_WAPI_IE_LEN]={0};\n\t\tu16 wapi_len=0;\n\t\tu16  i;\n\n\t\tout_len_wapi=rtw_get_wapi_ie(pnetwork->network.IEs ,pnetwork->network.IELength,wapi_ie,&wapi_len);\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: wapi_len=%d \\n\",wapi_len));\n\n\t\tDBG_871X(\"rtw_wx_get_scan: %s \",pnetwork->network.Ssid.Ssid);\n\t\tDBG_871X(\"rtw_wx_get_scan: ssid = %d \",wapi_len);\n\n\n\t\tif (wapi_len > 0)\n\t\t{\n\t\t\tp=buf_wapi;\n\t\t\t//_rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);\n\t\t\tp += sprintf(p, \"wapi_ie=\");\n\t\t\tfor (i = 0; i < wapi_len; i++) {\n\t\t\t\tp += sprintf(p, \"%02x\", wapi_ie[i]);\n\t\t\t}\n\n\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\tiwe->cmd = IWEVCUSTOM;\n\t\t\tiwe->u.data.length = strlen(buf_wapi);\n\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe,buf_wapi);\n\n\t\t\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\t\t\tiwe->cmd =IWEVGENIE;\n\t\t\tiwe->u.data.length = wapi_len;\n\t\t\tstart = iwe_stream_add_point(info, start, stop, iwe, wapi_ie);\n\t\t}\n\t}\n#endif//#ifdef CONFIG_WAPI_SUPPORT\n\treturn start;\n}\n\nstatic inline char *  iwe_stream_rssi_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\n\tu8 ss, sq;\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\n\t/* Add quality statistics */\n\tiwe->cmd = IWEVQUAL;\n\tiwe->u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED \n\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t\t| IW_QUAL_NOISE_UPDATED\n\t#else\n\t\t| IW_QUAL_NOISE_INVALID\n\t#endif\n\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\t\t| IW_QUAL_DBM\n\t#endif\n\t;\n\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&\n\t\tis_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)){\n\t\tss = padapter->recvpriv.signal_strength;\n\t\tsq = padapter->recvpriv.signal_qual;\n\t} else {\n\t\tss = pnetwork->network.PhyInfo.SignalStrength;\n\t\tsq = pnetwork->network.PhyInfo.SignalQuality;\n\t}\n\t\n\t\n\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\tiwe->u.qual.level = (u8) translate_percentage_to_dbm(ss); /* dbm */\n\t#else\n\t#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\tiwe->u.qual.level = (u8)ss; /* % */\n\t#else\n\t{\n\t\t/* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */\n\t\t\n\t\tHAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);\n\t\t\n\t\tiwe->u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);\n\t}\t\n\t#endif\n\t#endif\n\t\n\tiwe->u.qual.qual = (u8)sq;   // signal quality\n\n\t#ifdef CONFIG_PLATFORM_ROCKCHIPS\n\tiwe->u.qual.noise = -100; // noise level suggest by zhf@rockchips\n\t#else \n\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t{\n\t\ts16 tmp_noise=0;\n\t\trtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));\n\t\tiwe->u.qual.noise = tmp_noise ;\n\t}\n\t#else\n\tiwe->u.qual.noise = 0; // noise level\n\t#endif\t\n\t#endif //CONFIG_PLATFORM_ROCKCHIPS\n\t\n\t//DBG_871X(\"iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\\n\", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);\n\n\tstart = iwe_stream_add_event(info, start, stop, iwe, IW_EV_QUAL_LEN);\n\treturn start;\n}\n\nstatic inline char *  iwe_stream_net_rsv_process(_adapter *padapter,\n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop,struct iw_event *iwe)\n{\t\n\tu8 buf[32] = {0};\n\tu8 * p,*pos;\n\tint len;\n\tp = buf;\n\tpos = pnetwork->network.Reserved;\n\t\n\tp += sprintf(p, \"fm=%02X%02X\", pos[1], pos[0]);\n\t_rtw_memset(iwe, 0, sizeof(*iwe));\n\tiwe->cmd = IWEVCUSTOM;\n\tiwe->u.data.length = strlen(buf);\n\tstart = iwe_stream_add_point(info, start, stop,iwe, buf);\n\treturn start;\n}\n\n#if 1\nstatic char *translate_scan(_adapter *padapter, \n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop)\n{\t\n\tstruct iw_event iwe;\n\tu16 cap = 0;\n\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\n\tif(_FALSE == search_p2p_wfd_ie(padapter,info,pnetwork,start,stop))\n\t\treturn start;\n\n\tstart = iwe_stream_mac_addr_proess(padapter,info,pnetwork,start,stop,&iwe);\t\n\tstart = iwe_stream_essid_proess(padapter,info,pnetwork,start,stop,&iwe);\t\n\tstart = iwe_stream_protocol_process(padapter,info,pnetwork,start,stop,&iwe);\n\tif (pnetwork->network.Reserved[0] == 2) // Probe Request\n\t{\n\t\tcap = 0;\n\t}\n\telse\n\t{\n\t\t_rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);\n\t\tcap = le16_to_cpu(cap);\n\t}\n\n\tstart = iwe_stream_mode_process(padapter,info,pnetwork,start,stop,&iwe,cap);\t\n\tstart = iwe_stream_chan_process(padapter,info,pnetwork,start,stop,&iwe);\t\n\tstart = iwe_stream_encryption_process(padapter,info,pnetwork,start,stop,&iwe,cap);\t\n\tstart = iwe_stream_rate_process(padapter,info,pnetwork,start,stop,&iwe);\t\n\tstart = iwe_stream_wpa_wpa2_process(padapter,info,pnetwork,start,stop,&iwe);\n\tstart = iwe_stream_wps_process(padapter,info,pnetwork,start,stop,&iwe);\n\tstart = iwe_stream_wapi_process(padapter,info,pnetwork,start,stop,&iwe);\n\tstart = iwe_stream_rssi_process(padapter,info,pnetwork,start,stop,&iwe);\n\tstart = iwe_stream_net_rsv_process(padapter,info,pnetwork,start,stop,&iwe);\t\n\t\n\treturn start;\t\n}\n#else\nstatic char *translate_scan(_adapter *padapter, \n\t\t\t\tstruct iw_request_info* info, struct wlan_network *pnetwork,\n\t\t\t\tchar *start, char *stop)\n{\n\tstruct iw_event iwe;\n\tu16 cap;\n\tu32 ht_ielen = 0, vht_ielen = 0;\n\tchar custom[MAX_CUSTOM_LEN];\n\tchar *p;\n\tu16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;\n\tu32 i = 0;\t\n\tchar\t*current_val;\n\tlong rssi;\n\tu8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;\n\tu16 mcs_rate=0, vht_data_rate=0;\n\tu8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);\n\tstruct registry_priv *pregpriv = &padapter->registrypriv;\n\t\n\tif(_FALSE == search_p2p_wfd_ie(padapter,info,pnetwork,start,stop))\n\t\treturn start;\n\n\t/*  AP MAC address  */\n\tiwe.cmd = SIOCGIWAP;\n\tiwe.u.ap_addr.sa_family = ARPHRD_ETHER;\n\n\t_rtw_memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);\n\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);\n\t\n\t/* Add the ESSID */\n\tiwe.cmd = SIOCGIWESSID;\n\tiwe.u.data.flags = 1;\t\n\tiwe.u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);\n\tstart = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);\n\n\t//parsing HT_CAP_IE\n\tif (pnetwork->network.Reserved[0] == 2) // Probe Request\n\t{\n\t\tp = rtw_get_ie(&pnetwork->network.IEs[0], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength);\n\t}\n\telse\n\t{\n\t\tp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-12);\n\t}\n\tif(p && ht_ielen>0)\n\t{\n\t\tstruct rtw_ieee80211_ht_cap *pht_capie;\n\t\tht_cap = _TRUE;\t\t\t\n\t\tpht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);\t\t\n\t\t_rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);\n\t\tbw_40MHz = (pht_capie->cap_info&IEEE80211_HT_CAP_SUP_WIDTH) ? 1:0;\n\t\tshort_GI = (pht_capie->cap_info&(IEEE80211_HT_CAP_SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1:0;\n\t}\n\n#ifdef CONFIG_80211AC_VHT\n\t//parsing VHT_CAP_IE\n\tp = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength-ie_offset);\n\tif(p && vht_ielen>0)\n\t{\n\t\tu8\tmcs_map[2];\n\n\t\tvht_cap = _TRUE;\t\t\n\t\tbw_160MHz = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p+2);\n\t\tif(bw_160MHz)\n\t\t\tshort_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI160M(p+2);\n\t\telse\n\t\t\tshort_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p+2);\n\n\t\t_rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p+2), 2);\n\n\t\tvht_highest_rate = rtw_get_vht_highest_rate(mcs_map);\n\t\tvht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);\n\t}\n#endif\n\n\t/* Add the protocol name */\n\tiwe.cmd = SIOCGIWNAME;\n\tif ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)\t\t\n\t{\n\t\tif(ht_cap == _TRUE)\n\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11bn\");\n\t\telse\n\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11b\");\n\t}\t\n\telse if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)\t\n\t{\n\t\tif(ht_cap == _TRUE)\n\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11bgn\");\n\t\telse\n\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11bg\");\n\t}\t\n\telse\n\t{\n\t\tif(pnetwork->network.Configuration.DSConfig > 14)\n\t\t{\n\t\t\tif(vht_cap == _TRUE)\n\t\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11AC\");\n\t\t\telse if(ht_cap == _TRUE)\n\t\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11an\");\n\t\t\telse\n\t\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11a\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(ht_cap == _TRUE)\n\t\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11gn\");\n\t\t\telse\n\t\t\t\tsnprintf(iwe.u.name, IFNAMSIZ, \"IEEE 802.11g\");\n\t\t}\n\t}\t\n\n\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);\n\n\t  /* Add mode */\n\tif (pnetwork->network.Reserved[0] == 2) // Probe Request\n\t{\n\t\tcap = 0;\n\t}\n\telse\n\t{\n        iwe.cmd = SIOCGIWMODE;\n\t\t_rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);\n\t\tcap = le16_to_cpu(cap);\n\t}\n\n\tif(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){\n\t\tif (cap & WLAN_CAPABILITY_BSS)\n\t\t\tiwe.u.mode = IW_MODE_MASTER;\n\t\telse\n\t\t\tiwe.u.mode = IW_MODE_ADHOC;\n\n\t\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN);\n\t}\n\n\tif(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)\n\t\tpnetwork->network.Configuration.DSConfig = 1;\n\n\t /* Add frequency/channel */\n\tiwe.cmd = SIOCGIWFREQ;\n\tiwe.u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;\n\tiwe.u.freq.e = 1;\n\tiwe.u.freq.i = pnetwork->network.Configuration.DSConfig;\n\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN);\n\n\t/* Add encryption capability */\n\tiwe.cmd = SIOCGIWENCODE;\n\tif (cap & WLAN_CAPABILITY_PRIVACY)\n\t\tiwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;\n\telse\n\t\tiwe.u.data.flags = IW_ENCODE_DISABLED;\n\tiwe.u.data.length = 0;\n\tstart = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);\n\n\t/*Add basic and extended rates */\n\tmax_rate = 0;\n\tp = custom;\n\tp += snprintf(p, MAX_CUSTOM_LEN - (p - custom), \" Rates (Mb/s): \");\n\twhile(pnetwork->network.SupportedRates[i]!=0)\n\t{\n\t\trate = pnetwork->network.SupportedRates[i]&0x7F; \n\t\tif (rate > max_rate)\n\t\t\tmax_rate = rate;\n\t\tp += snprintf(p, MAX_CUSTOM_LEN - (p - custom),\n\t\t\t      \"%d%s \", rate >> 1, (rate & 1) ? \".5\" : \"\");\n\t\ti++;\n\t}\n\n\tif(vht_cap == _TRUE) {\n\t\tmax_rate = vht_data_rate;\n\t}\n\telse if(ht_cap == _TRUE)\n\t{\n\t\tif(mcs_rate&0x8000)//MCS15\n\t\t{\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);\n\t\t\t\n\t\t}\n\t\telse if(mcs_rate&0x0080)//MCS7\n\t\t{\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);\n\t\t}\n\t\telse//default MCS7\n\t\t{\n\t\t\t//DBG_871X(\"wx_get_scan, mcs_rate_bitmap=0x%x\\n\", mcs_rate);\n\t\t\tmax_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);\n\t\t}\n\n\t\tmax_rate = max_rate*2;//Mbps/2;\t\t\n\t}\n\n\tiwe.cmd = SIOCGIWRATE;\n\tiwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;\n\tiwe.u.bitrate.value = max_rate * 500000;\n\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN);\n\n\t//parsing WPA/WPA2 IE\n\tif (pnetwork->network.Reserved[0] != 2) // Probe Request\n\t{\n\t\tu8 buf[MAX_WPA_IE_LEN*2];\n\t\tu8 wpa_ie[255],rsn_ie[255];\n\t\tu16 wpa_len=0,rsn_len=0;\n\t\tu8 *p;\n\t\tsint out_len=0;\n\t\tout_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: wpa_len=%d rsn_len=%d\\n\",wpa_len,rsn_len));\n\n\t\tif (wpa_len > 0)\n\t\t{\n\t\t\tp=buf;\n\t\t\t_rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);\n\t\t\tp += sprintf(p, \"wpa_ie=\");\n\t\t\tfor (i = 0; i < wpa_len; i++) {\n\t\t\t\tp += sprintf(p, \"%02x\", wpa_ie[i]);\n\t\t\t}\n\n\t\t\tif (wpa_len > 100) {\n\t\t\t\tprintk(\"-----------------Len %d----------------\\n\", wpa_len);\n\t\t\t\tfor (i = 0; i < wpa_len; i++) {\n\t\t\t\t\tprintk(\"%02x \", wpa_ie[i]);\n\t\t\t\t}\n\t\t\t\tprintk(\"\\n\");\n\t\t\t\tprintk(\"-----------------Len %d----------------\\n\", wpa_len);\n\t\t\t}\n\t\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd = IWEVCUSTOM;\n\t\t\tiwe.u.data.length = strlen(buf);\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe,buf);\n\t\t\t\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd =IWEVGENIE;\n\t\t\tiwe.u.data.length = wpa_len;\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe, wpa_ie);\t\t\t\n\t\t}\n\t\tif (rsn_len > 0)\n\t\t{\n\t\t\tp = buf;\n\t\t\t_rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);\n\t\t\tp += sprintf(p, \"rsn_ie=\");\n\t\t\tfor (i = 0; i < rsn_len; i++) {\n\t\t\t\tp += sprintf(p, \"%02x\", rsn_ie[i]);\n\t\t\t}\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd = IWEVCUSTOM;\n\t\t\tiwe.u.data.length = strlen(buf);\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe,buf);\n\t\t\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd =IWEVGENIE;\n\t\t\tiwe.u.data.length = rsn_len;\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie);\t\t\n\t\t}\n\t}\n\n\t{ //parsing WPS IE\n\t\tuint cnt = 0,total_ielen;\t\n\t\tu8 *wpsie_ptr=NULL;\n\t\tuint wps_ielen = 0;\t\t\n\n\t\tu8 *ie_ptr = pnetwork->network.IEs + ie_offset;\n\t\ttotal_ielen= pnetwork->network.IELength - ie_offset;\n\n\t\tif (pnetwork->network.Reserved[0] == 2) // Probe Request\n\t\t{\n\t\t\tie_ptr = pnetwork->network.IEs;\n\t\t\ttotal_ielen = pnetwork->network.IELength;\n\t\t}\n\t\telse     // Beacon or Probe Respones\n\t\t{\n\t\t\tie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_;\n\t\t\ttotal_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;\n\t\t}\n        \n\t\twhile(cnt < total_ielen)\n\t\t{\n\t\t\tif(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))\t\t\t\n\t\t\t{\n\t\t\t\twpsie_ptr = &ie_ptr[cnt];\n\t\t\t\tiwe.cmd =IWEVGENIE;\n\t\t\t\tiwe.u.data.length = (u16)wps_ielen;\n\t\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe, wpsie_ptr);\t\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\tcnt+=ie_ptr[cnt+1]+2; //goto next\n\t\t}\n\t}\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif (pnetwork->network.Reserved[0] != 2) // Probe Request\n\t{\n\t\tsint out_len_wapi=0;\n\t\t/* here use static for stack size */\n\t\tstatic u8 buf_wapi[MAX_WAPI_IE_LEN*2];\n\t\tstatic u8 wapi_ie[MAX_WAPI_IE_LEN];\n\t\tu16 wapi_len=0;\n\t\tu16  i;\n\n\t\t_rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN);\n\t\t_rtw_memset(wapi_ie, 0, MAX_WAPI_IE_LEN);\n\n\t\tout_len_wapi=rtw_get_wapi_ie(pnetwork->network.IEs ,pnetwork->network.IELength,wapi_ie,&wapi_len);\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: ssid=%s\\n\",pnetwork->network.Ssid.Ssid));\n\t\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan: wapi_len=%d \\n\",wapi_len));\n\n\t\tDBG_871X(\"rtw_wx_get_scan: %s \",pnetwork->network.Ssid.Ssid);\n\t\tDBG_871X(\"rtw_wx_get_scan: ssid = %d \",wapi_len);\n\n\n\t\tif (wapi_len > 0)\n\t\t{\n\t\t\tp=buf_wapi;\n\t\t\t_rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);\n\t\t\tp += sprintf(p, \"wapi_ie=\");\n\t\t\tfor (i = 0; i < wapi_len; i++) {\n\t\t\t\tp += sprintf(p, \"%02x\", wapi_ie[i]);\n\t\t\t}\n\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd = IWEVCUSTOM;\n\t\t\tiwe.u.data.length = strlen(buf_wapi);\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe,buf_wapi);\n\n\t\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\t\tiwe.cmd =IWEVGENIE;\n\t\t\tiwe.u.data.length = wapi_len;\n\t\t\tstart = iwe_stream_add_point(info, start, stop, &iwe, wapi_ie);\n\t\t}\n\t}\n#endif\n\n{\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu8 ss, sq;\n\t\n\t/* Add quality statistics */\n\tiwe.cmd = IWEVQUAL;\n\tiwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED \n\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t\t| IW_QUAL_NOISE_UPDATED\n\t#else\n\t\t| IW_QUAL_NOISE_INVALID\n\t#endif\n\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\t\t| IW_QUAL_DBM\n\t#endif\n\t;\n\n\tif ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&\n\t\tis_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)){\n\t\tss = padapter->recvpriv.signal_strength;\n\t\tsq = padapter->recvpriv.signal_qual;\n\t} else {\n\t\tss = pnetwork->network.PhyInfo.SignalStrength;\n\t\tsq = pnetwork->network.PhyInfo.SignalQuality;\n\t}\n\t\n\t\n\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\tiwe.u.qual.level = (u8) translate_percentage_to_dbm(ss); /* dbm */\n\t#else\n\t#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\tiwe.u.qual.level = (u8)ss; /* % */\n\t#else\n\t{\n\t\t/* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */\n\t\t\n\t\tHAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);\n\t\t\n\t\tiwe.u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);\n\t}\n\t#endif\n\t#endif\n\t\n\tiwe.u.qual.qual = (u8)sq;   // signal quality\n\n\t#ifdef CONFIG_PLATFORM_ROCKCHIPS\n\tiwe.u.qual.noise = -100; // noise level suggest by zhf@rockchips\n\t#else \n\t#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)\n\t{\n\t\ts16 tmp_noise=0;\n\t\trtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));\n\t\tiwe.u.qual.noise = tmp_noise ;\n\t}\n\t#else\n\tiwe.u.qual.noise = 0; // noise level\n\t#endif\t\n\t#endif //CONFIG_PLATFORM_ROCKCHIPS\n\t\n\t//DBG_871X(\"iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\\n\", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);\n\n\tstart = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);\n}\n\n\t{\n\t\tu8 buf[MAX_WPA_IE_LEN];\n\t\tu8 * p,*pos;\n\t\tint len;\n\t\tp = buf;\n\t\tpos = pnetwork->network.Reserved;\n\t\t_rtw_memset(buf, 0, MAX_WPA_IE_LEN);\n\t\tp += sprintf(p, \"fm=%02X%02X\", pos[1], pos[0]);\n\t\t_rtw_memset(&iwe, 0, sizeof(iwe));\n\t\tiwe.cmd = IWEVCUSTOM;\n\t\tiwe.u.data.length = strlen(buf);\n\t\tstart = iwe_stream_add_point(info, start, stop, &iwe, buf);\n\t}\n\t\n\treturn start;\t\n}\n#endif\n\nstatic int wpa_set_auth_algs(struct net_device *dev, u32 value)\n{\t\n\t_adapter *padapter = (_adapter *) rtw_netdev_priv(dev);\n\tint ret = 0;\n\n\tif ((value & AUTH_ALG_SHARED_KEY)&&(value & AUTH_ALG_OPEN_SYSTEM))\n\t{\n\t\tDBG_871X(\"wpa_set_auth_algs, AUTH_ALG_SHARED_KEY and  AUTH_ALG_OPEN_SYSTEM [value:0x%x]\\n\",value);\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;\n\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n\t} \n\telse if (value & AUTH_ALG_SHARED_KEY)\n\t{\n\t\tDBG_871X(\"wpa_set_auth_algs, AUTH_ALG_SHARED_KEY  [value:0x%x]\\n\",value);\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\n#ifdef CONFIG_PLATFORM_MT53XX\n\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;\n\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n#else\n\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeShared;\n\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Shared;\n#endif\n\t} \n\telse if(value & AUTH_ALG_OPEN_SYSTEM)\n\t{\n\t\tDBG_871X(\"wpa_set_auth_algs, AUTH_ALG_OPEN_SYSTEM\\n\");\n\t\t//padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\t\tif(padapter->securitypriv.ndisauthtype < Ndis802_11AuthModeWPAPSK)\n\t\t{\n#ifdef CONFIG_PLATFORM_MT53XX\n\t\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeAutoSwitch;\n\t\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n#else\n\t\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;\n \t\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open;\n#endif\n\t\t}\n\t\t\n\t}\n\telse if(value & AUTH_ALG_LEAP)\n\t{\n\t\tDBG_871X(\"wpa_set_auth_algs, AUTH_ALG_LEAP\\n\");\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"wpa_set_auth_algs, error!\\n\");\n\t\tret = -EINVAL;\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int wpa_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)\n{\n\tint ret = 0;\n\tu32 wep_key_idx, wep_key_len,wep_total_len;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\t\t\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info* pwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\n_func_enter_;\n\n\tparam->u.crypt.err = 0;\n\tparam->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\\0';\n\n\tif (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)\n\t{\n\t\tret =  -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\n\t\tif (param->u.crypt.idx >= WEP_KEYS\n#ifdef CONFIG_IEEE80211W\n\t\t\t&& param->u.crypt.idx > BIP_MAX_KEYID\n#endif //CONFIG_IEEE80211W\n\t\t\t)\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t} \n\telse \n\t{\n#ifdef CONFIG_WAPI_SUPPORT\n\t\tif (strcmp(param->u.crypt.alg, \"SMS4\"))\n#endif\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tif (strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"wpa_set_encryption, crypt.alg = WEP\\n\"));\n\t\tDBG_871X(\"wpa_set_encryption, crypt.alg = WEP\\n\");\n\n\t\twep_key_idx = param->u.crypt.idx;\n\t\twep_key_len = param->u.crypt.key_len;\n\n\t\tif ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0))\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (psecuritypriv->bWepDefaultKeyIdxSet == 0) {\n\t\t\t/* wep default key has not been set, so use this key index as default key.*/\n\n\t\t\twep_key_len = wep_key_len <= 5 ? 5 : 13;\n\n\t\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP40_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\n\t\t\tif (wep_key_len == 13)\n\t\t\t{\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _WEP104_;\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t}\n\n\t\t\tpsecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;\n\t\t}\n\t\t\t\n\t\t_rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);\n\t\t\t\n\t\tpsecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;\n\n\t\tpsecuritypriv->key_mask |= BIT(wep_key_idx);\n\n\t\tgoto exit;\t\t\n\t}\n\n\tif(padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) // 802_1x\n\t{\n\t\tstruct sta_info * psta,*pbcmc_sta;\n\t\tstruct sta_priv * pstapriv = &padapter->stapriv;\n\n\t\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == _TRUE) //sta mode\n\t\t{\n\t\t\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\t\t\t\t\n\t\t\tif (psta == NULL) {\n\t\t\t\t//DEBUG_ERR( (\"Set wpa_set_encryption: Obtain Sta_info fail \\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Jeff: don't disable ieee8021x_blocked while clearing key\n\t\t\t\tif (strcmp(param->u.crypt.alg, \"none\") != 0) \n\t\t\t\t\tpsta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\n\t\t\t\tif((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||\n\t\t\t\t\t\t(padapter->securitypriv.ndisencryptstatus ==  Ndis802_11Encryption3Enabled))\n\t\t\t\t{\n\t\t\t\t\tpsta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\t}\t\t\n\n\t\t\t\tif(param->u.crypt.set_tx ==1)//pairwise key\n\t\t\t\t{ \n\t\t\t\t\t_rtw_memcpy(psta->dot118021x_UncstKey.skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\t\tif(strcmp(param->u.crypt.alg, \"TKIP\") == 0)//set mic key\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\t//DEBUG_ERR((\"\\nset key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len));\n\t\t\t\t\t\t_rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t\t_rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\t\tpadapter->securitypriv.busetkipkey=_FALSE;\n\t\t\t\t\t\t//_set_timer(&padapter->securitypriv.tkip_timer, 50);\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\t//DEBUG_ERR((\" param->u.crypt.key_len=%d\\n\",param->u.crypt.key_len));\n\t\t\t\t\tDBG_871X(\" ~~~~set sta key:unicastkey\\n\");\n\t\t\t\t\t\n\t\t\t\t\trtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE);\n\t\t\t\t\t\n\t\t\t\t\tpsta->bpairwise_key_installed = _TRUE;\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse//group key\n\t\t\t\t{ \t\t\t\t\t\n\t\t\t\t\tif(strcmp(param->u.crypt.alg, \"TKIP\") == 0 || strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\t//only TKIP group key need to install this\n\t\t\t\t\t\tif(param->u.crypt.key_len > 16)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[16]),8);\n\t\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey,&(param->u.crypt.key[24]),8);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpadapter->securitypriv.binstallGrpkey = _TRUE;\t\n\t\t\t\t\t\t//DEBUG_ERR((\" param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len));\n\t\t\t\t\t\tDBG_871X(\" ~~~~set sta key:groupkey\\n\");\n\t\n\t\t\t\t\t\tpadapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;\n\t\n\t\t\t\t\t\trtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);\n\t\t\t\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\t\t\t\telse if(strcmp(param->u.crypt.alg, \"BIP\") == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tint no;\n\t\t\t\t\t\t//printk(\"BIP key_len=%d , index=%d @@@@@@@@@@@@@@@@@@\\n\", param->u.crypt.key_len, param->u.crypt.idx);\n\t\t\t\t\t\t//save the IGTK key, length 16 bytes\n\t\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey,  param->u.crypt.key,(param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\t/*printk(\"IGTK key below:\\n\");\n\t\t\t\t\t\tfor(no=0;no<16;no++)\n\t\t\t\t\t\t\tprintk(\" %02x \", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);\n\t\t\t\t\t\tprintk(\"\\n\");*/\n\t\t\t\t\t\tpadapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;\n\t\t\t\t\t\tpadapter->securitypriv.binstallBIPkey = _TRUE;\n\t\t\t\t\t\tDBG_871X(\" ~~~~set sta key:IGKT\\n\");\n\t\t\t\t\t}\n#endif //CONFIG_IEEE80211W\n\t\t\t\t\t\n#ifdef CONFIG_P2P\n\t\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE);\n\t\t\t\t\t}\n#endif //CONFIG_P2P\n\t\t\t\t\t\n\t\t\t\t}\t\t\t\t\t\t\n\t\t\t}\n\n\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\tif(pbcmc_sta==NULL)\n\t\t\t{\n\t\t\t\t//DEBUG_ERR( (\"Set OID_802_11_ADD_KEY: bcmc stainfo is null \\n\"));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t//Jeff: don't disable ieee8021x_blocked while clearing key\n\t\t\t\tif (strcmp(param->u.crypt.alg, \"none\") != 0) \n\t\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\n\t\t\t\tif((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled)||\n\t\t\t\t\t\t(padapter->securitypriv.ndisencryptstatus ==  Ndis802_11Encryption3Enabled))\n\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\tpbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\t\t\t\t\n\t\t}\n\t\telse if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) //adhoc mode\n\t\t{\t\t\n\t\t}\t\t\t\n\t}\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif (strcmp(param->u.crypt.alg, \"SMS4\") == 0)\n\t{\n\t\tPRT_WAPI_T\t\t\tpWapiInfo = &padapter->wapiInfo;\n\t\tPRT_WAPI_STA_INFO\tpWapiSta;\n\t\tu8\t\t\t\t\tWapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\t\tu8\t\t\t\t\tWapiAEPNInitialValueSrc[16] = {0x37,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\t\tu8 \t\t\t\t\tWapiAEMultiCastPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ;\n\n\t\tif(param->u.crypt.set_tx == 1)\n\t\t{\n\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\t\tif(_rtw_memcmp(pWapiSta->PeerMacAddr,param->sta_addr,6))\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastTxUnicastPN,WapiASUEPNInitialValueSrc,16);\n\n\t\t\t\t\tpWapiSta->wapiUsk.bSet = true;\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiUsk.dataKey,param->u.crypt.key,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiUsk.micKey,param->u.crypt.key+16,16);\n\t\t\t\t\tpWapiSta->wapiUsk.keyId = param->u.crypt.idx ;\n\t\t\t\t\tpWapiSta->wapiUsk.bTxEnable = true;\n\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxUnicastPN,WapiAEPNInitialValueSrc,16);\n\t\t\t\t\tpWapiSta->wapiUskUpdate.bTxEnable = false;\n\t\t\t\t\tpWapiSta->wapiUskUpdate.bSet = false;\n\n\t\t\t\t\tif (psecuritypriv->sw_encrypt== false || psecuritypriv->sw_decrypt == false)\n\t\t\t\t\t{\n\t\t\t\t\t\t//set unicast key for ASUE\n\t\t\t\t\t\trtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlist_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {\n\t\t\t\tif(_rtw_memcmp(pWapiSta->PeerMacAddr,get_bssid(pmlmepriv),6))\n\t\t\t\t{\n\t\t\t\t\tpWapiSta->wapiMsk.bSet = true;\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiMsk.dataKey,param->u.crypt.key,16);\n\t\t\t\t\t_rtw_memcpy(pWapiSta->wapiMsk.micKey,param->u.crypt.key+16,16);\n\t\t\t\t\tpWapiSta->wapiMsk.keyId = param->u.crypt.idx ;\n\t\t\t\t\tpWapiSta->wapiMsk.bTxEnable = false;\n\t\t\t\t\tif(!pWapiSta->bSetkeyOk)\n\t\t\t\t\t\tpWapiSta->bSetkeyOk = true;\n\t\t\t\t\tpWapiSta->bAuthenticateInProgress = false;\n\n\t\t\t\t\t_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);\n\n\t\t\t\t\tif (psecuritypriv->sw_decrypt == false)\n\t\t\t\t\t{\n\t\t\t\t\t\t//set rx broadcast key for ASUE\n\t\t\t\t\t\trtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n#endif\n\nexit:\n\t\n_func_exit_;\n\n\treturn ret;\t\n}\n\nstatic int rtw_set_wpa_ie(_adapter *padapter, char *pie, unsigned short ielen)\n{\n\tu8 *buf=NULL, *pos=NULL;\t\n\tu32 left; \t\n\tint group_cipher = 0, pairwise_cipher = 0;\n\tint ret = 0;\n\tu8 null_addr[]= {0,0,0,0,0,0};\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info* pwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\n\tif((ielen > MAX_WPA_IE_LEN) || (pie == NULL)){\n\t\t_clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\tif(pie == NULL)\t\n\t\t\treturn ret;\n\t\telse\n\t\t\treturn -EINVAL;\n\t}\n\n\tif(ielen)\n\t{\t\t\n\t\tbuf = rtw_zmalloc(ielen);\n\t\tif (buf == NULL){\n\t\t\tret =  -ENOMEM;\n\t\t\tgoto exit;\n\t\t}\n\t\n\t\t_rtw_memcpy(buf, pie , ielen);\n\n\t\t//dump\n\t\t{\n\t\t\tint i;\n\t\t\tDBG_871X(\"\\n wpa_ie(length:%d):\\n\", ielen);\n\t\t\tfor(i=0;i<ielen;i=i+8)\n\t\t\t\tDBG_871X(\"0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x \\n\",buf[i],buf[i+1],buf[i+2],buf[i+3],buf[i+4],buf[i+5],buf[i+6],buf[i+7]);\n\t\t}\n\t\n\t\tpos = buf;\n\t\tif(ielen < RSN_HEADER_LEN){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"Ie len too short %d\\n\", ielen));\n\t\t\tret  = -1;\n\t\t\tgoto exit;\n\t\t}\n\n#if 0\n\t\tpos += RSN_HEADER_LEN;\n\t\tleft  = ielen - RSN_HEADER_LEN;\n\t\t\n\t\tif (left >= RSN_SELECTOR_LEN){\n\t\t\tpos += RSN_SELECTOR_LEN;\n\t\t\tleft -= RSN_SELECTOR_LEN;\n\t\t}\t\t\n\t\telse if (left > 0){\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"Ie length mismatch, %u too much \\n\", left));\n\t\t\tret =-1;\n\t\t\tgoto exit;\n\t\t}\n#endif\t\t\n\t\t\n\t\tif(rtw_parse_wpa_ie(buf, ielen, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\tpadapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPAPSK;\n\t\t\t_rtw_memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen);\t\n\t\t}\n\t\n\t\tif(rtw_parse_wpa2_ie(buf, ielen, &group_cipher, &pairwise_cipher, NULL) == _SUCCESS)\n\t\t{\n\t\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X;\n\t\t\tpadapter->securitypriv.ndisauthtype=Ndis802_11AuthModeWPA2PSK;\t\n\t\t\t_rtw_memcpy(padapter->securitypriv.supplicant_ie, &buf[0], ielen);\t\n\t\t}\n\t\t\t\n\t\tif (group_cipher == 0)\n\t\t{\n\t\t\tgroup_cipher = WPA_CIPHER_NONE;\n\t\t}\n\t\tif (pairwise_cipher == 0)\n\t\t{\n\t\t\tpairwise_cipher = WPA_CIPHER_NONE;\n\t\t}\n\t\t\t\n\t\tswitch(group_cipher)\n\t\t{\n\t\t\tcase WPA_CIPHER_NONE:\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_WEP40:\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_TKIP:\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_TKIP_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_CCMP:\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_AES_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_WEP104:\t\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tswitch(pairwise_cipher)\n\t\t{\n\t\t\tcase WPA_CIPHER_NONE:\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus=Ndis802_11EncryptionDisabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_WEP40:\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_TKIP:\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_TKIP_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_CCMP:\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_AES_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\t\t\tbreak;\n\t\t\tcase WPA_CIPHER_WEP104:\t\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\t_clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\t{//set wps_ie\t\n\t\t\tu16 cnt = 0;\t\n\t\t\tu8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};\n\t\t\t \n\t\t\twhile( cnt < ielen )\n\t\t\t{\n\t\t\t\teid = buf[cnt];\n\t\t\n\t\t\t\tif((eid==_VENDOR_SPECIFIC_IE_)&&(_rtw_memcmp(&buf[cnt+2], wps_oui, 4)==_TRUE))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"SET WPS_IE\\n\");\n\n\t\t\t\t\tpadapter->securitypriv.wps_ie_len = ((buf[cnt+1]+2) < MAX_WPS_IE_LEN) ? (buf[cnt+1]+2):MAX_WPS_IE_LEN;\n\n\t\t\t\t\t_rtw_memcpy(padapter->securitypriv.wps_ie, &buf[cnt], padapter->securitypriv.wps_ie_len);\n\t\t\t\t\t\n\t\t\t\t\tset_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);\n\t\t\t\t\t\n#ifdef CONFIG_P2P\n\t\t\t\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_OK))\n\t\t\t\t\t{\n\t\t\t\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_ING);\n\t\t\t\t\t}\n#endif //CONFIG_P2P\n\t\t\t\t\tcnt += buf[cnt+1]+2;\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tcnt += buf[cnt+1]+2; //goto next\t\n\t\t\t\t}\t\t\t\t\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t}\n\t\n\t//TKIP and AES disallow multicast packets until installing group key\n        if(padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_\n                || padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_\n                || padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)\n                //WPS open need to enable multicast\n                //|| check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == _TRUE)\n                rtw_hal_set_hwreg(padapter, HW_VAR_OFF_RCR_AM, null_addr);\n\t\n\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t (\"rtw_set_wpa_ie: pairwise_cipher=0x%08x padapter->securitypriv.ndisencryptstatus=%d padapter->securitypriv.ndisauthtype=%d\\n\",\n\t\t  pairwise_cipher, padapter->securitypriv.ndisencryptstatus, padapter->securitypriv.ndisauthtype));\n \t\nexit:\n\n\tif (buf) rtw_mfree(buf, ielen);\n\n\treturn ret;\n}\n\nstatic int rtw_wx_get_name(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu16 cap;\n\tu32 ht_ielen = 0;\n\tchar *p;\n\tu8 ht_cap=_FALSE, vht_cap=_FALSE;\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;\n\tNDIS_802_11_RATES_EX* prates = NULL;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"cmd_code=%x\\n\", info->cmd));\n\n\t_func_enter_;\t\n\n\tif (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == _TRUE)\n\t{\n\t\t//parsing HT_CAP_IE\n\t\tp = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength-12);\n\t\tif(p && ht_ielen>0)\n\t\t{\n\t\t\tht_cap = _TRUE;\n\t\t}\n\n#ifdef CONFIG_80211AC_VHT\n\t\tif(pmlmepriv->vhtpriv.vht_option == _TRUE)\n\t\t\tvht_cap = _TRUE;\n#endif\n\n\t\tprates = &pcur_bss->SupportedRates;\n\n\t\tif (rtw_is_cckratesonly_included((u8*)prates) == _TRUE)\n\t\t{\n\t\t\tif(ht_cap == _TRUE)\n\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11bn\");\n\t\t\telse\n\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11b\");\n\t\t}\n\t\telse if ((rtw_is_cckrates_included((u8*)prates)) == _TRUE)\n\t\t{\n\t\t\tif(ht_cap == _TRUE)\n\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11bgn\");\n\t\t\telse\n\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11bg\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(pcur_bss->Configuration.DSConfig > 14)\n\t\t\t{\n\t\t\t#ifdef CONFIG_80211AC_VHT\n\t\t\t\tif(vht_cap == _TRUE){\n\t\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11AC\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t#endif\n\t\t\t\t{\n\t\t\t\t\tif(ht_cap == _TRUE)\n\t\t\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11an\");\n\t\t\t\t\telse\n\t\t\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11a\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(ht_cap == _TRUE)\n\t\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11gn\");\n\t\t\t\telse\n\t\t\t\t\tsnprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11g\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t//prates = &padapter->registrypriv.dev_network.SupportedRates;\n\t\t//snprintf(wrqu->name, IFNAMSIZ, \"IEEE 802.11g\");\n\t\tsnprintf(wrqu->name, IFNAMSIZ, \"unassociated\");\n\t}\n\n\t_func_exit_;\n\n\treturn 0;\n}\n\nstatic int rtw_wx_set_freq(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\t\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tstruct wlan_network  *cur_network = &(pmlmepriv->cur_network);\n\tint exp = 1, freq = 0, div = 0;\n\n\t_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, (\"+rtw_wx_set_freq\\n\"));\n\n\tif (wrqu->freq.m <= 1000) {\n\t\tif (wrqu->freq.flags == IW_FREQ_AUTO) {\n\t\t\tpadapter->mlmeextpriv.cur_channel = 1;\n\t\t\tDBG_871X(\"%s: channel is auto, set to channel 1\\n\", __func__);\n\t\t} else {\n\t\t\tpadapter->mlmeextpriv.cur_channel = wrqu->freq.m;\n\t\t\tDBG_871X(\"%s: set to channel %d\\n\", __func__, padapter->mlmeextpriv.cur_channel);\n\t\t}\n\t} else {\n\t\twhile (wrqu->freq.e) {\n\t\t\texp *= 10;\n\t\t\twrqu->freq.e--;\n\t\t}\n\n\t\tfreq = wrqu->freq.m;\n\t\twhile (!(freq%10)) {\n\t\t\tfreq /= 10;\n\t\t\texp *= 10;\n\t\t}\n\n\t\t/* freq unit is MHz here */\n\t\tdiv = 1000000/exp;\n\n\t\tif (div)\n\t\t\tfreq /= div;\n\t\telse {\n\t\t\tdiv = exp/1000000;\n\t\t\tfreq *= div;\n\t\t}\n\n\t\t/* If freq is invalid, rtw_freq2ch() will return channel 1 */\n\t\tpadapter->mlmeextpriv.cur_channel = rtw_freq2ch(freq);\n\t\tDBG_871X(\"%s: set to channel %d\\n\", __func__, padapter->mlmeextpriv.cur_channel);\n\t}\n\n\t_func_exit_;\n\t\n\treturn 0;\n}\n\nstatic int rtw_wx_get_freq(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;\n\t\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)\n\t{\n\t\t//wrqu->freq.m = ieee80211_wlan_frequencies[pcur_bss->Configuration.DSConfig-1] * 100000;\n\t\twrqu->freq.m = rtw_ch2freq(pcur_bss->Configuration.DSConfig) * 100000;\n\t\twrqu->freq.e = 1;\n\t\twrqu->freq.i = pcur_bss->Configuration.DSConfig;\n\n\t}\n\telse{\n\t\twrqu->freq.m = rtw_ch2freq(padapter->mlmeextpriv.cur_channel) * 100000;\n\t\twrqu->freq.e = 1;\n\t\twrqu->freq.i = padapter->mlmeextpriv.cur_channel;\n\t}\n\n\treturn 0;\n}\n\nstatic int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a,\n\t\t\t     union iwreq_data *wrqu, char *b)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networkType ;\n\tint ret = 0;\n\t\n\t_func_enter_;\n\t\n\tif(_FAIL == rtw_pwr_wakeup(padapter)) {\n\t\tret= -EPERM;\n\t\tgoto exit;\n\t}\n\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tret = -EPERM;\n\t\tgoto exit;\n\t}\n\n\t/* initial default type */\n\tdev->type = ARPHRD_ETHER;\n\n\tswitch(wrqu->mode)\n\t{\n\t\tcase IW_MODE_MONITOR:\n\t\t\tnetworkType = Ndis802_11Monitor;\n#if 0\n\t\t\tdev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */\n#endif\n\t\t\tdev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */\n\t\t\tDBG_871X(\"set_mode = IW_MODE_MONITOR\\n\");\n\t\t\tbreak;\n\n\t\tcase IW_MODE_AUTO:\n\t\t\tnetworkType = Ndis802_11AutoUnknown;\n\t\t\tDBG_871X(\"set_mode = IW_MODE_AUTO\\n\");\t\n\t\t\tbreak;\t\t\t\t\n\t\tcase IW_MODE_ADHOC:\t\t\n\t\t\tnetworkType = Ndis802_11IBSS;\n\t\t\tDBG_871X(\"set_mode = IW_MODE_ADHOC\\n\");\t\t\t\n\t\t\tbreak;\n\t\tcase IW_MODE_MASTER:\t\t\n\t\t\tnetworkType = Ndis802_11APMode;\n\t\t\tDBG_871X(\"set_mode = IW_MODE_MASTER\\n\");\n                        //rtw_setopmode_cmd(padapter, networkType,_TRUE);\t\n\t\t\tbreak;\t\t\t\t\n\t\tcase IW_MODE_INFRA:\n\t\t\tnetworkType = Ndis802_11Infrastructure;\n\t\t\tDBG_871X(\"set_mode = IW_MODE_INFRA\\n\");\t\t\t\n\t\t\tbreak;\n\t\n\t\tdefault :\n\t\t\tret = -EINVAL;;\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"\\n Mode: %s is not supported  \\n\", iw_operation_mode[wrqu->mode]));\n\t\t\tgoto exit;\n\t}\n\t\n/*\t\n\tif(Ndis802_11APMode == networkType)\n\t{\n\t\trtw_setopmode_cmd(padapter, networkType,_TRUE);\n\t}\t\n\telse\n\t{\n\t\trtw_setopmode_cmd(padapter, Ndis802_11AutoUnknown,_TRUE);\t\n\t}\n*/\n\t\n\tif (rtw_set_802_11_infrastructure_mode(padapter, networkType) ==_FALSE){\n\n\t\tret = -EPERM;\n\t\tgoto exit;\n\n\t}\n\n\trtw_setopmode_cmd(padapter, networkType,_TRUE);\n\nexit:\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_wx_get_mode(struct net_device *dev, struct iw_request_info *a,\n\t\t\t     union iwreq_data *wrqu, char *b)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\" rtw_wx_get_mode \\n\"));\n\n\t_func_enter_;\n\t\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)\n\t{\n\t\twrqu->mode = IW_MODE_INFRA;\n\t}\n\telse if  ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||\n\t\t       (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))\n\t\t\n\t{\n\t\twrqu->mode = IW_MODE_ADHOC;\n\t}\n\telse if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t{\n\t\twrqu->mode = IW_MODE_MASTER;\n\t}\n\telse\n\t{\n\t\twrqu->mode = IW_MODE_AUTO;\n\t}\n\n\t_func_exit_;\n\t\n\treturn 0;\n\t\n}\n\n\nstatic int rtw_wx_set_pmkid(struct net_device *dev,\n\t                     struct iw_request_info *a,\n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8          j,blInserted = _FALSE;\n\tint         intReturn = _FALSE;\n\tstruct mlme_priv  *pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n        struct iw_pmksa*  pPMK = ( struct iw_pmksa* ) extra;\n        u8     strZeroMacAddress[ ETH_ALEN ] = { 0x00 };\n        u8     strIssueBssid[ ETH_ALEN ] = { 0x00 };\n        \n/*\n        struct iw_pmksa\n        {\n            __u32   cmd;\n            struct sockaddr bssid;\n            __u8    pmkid[IW_PMKID_LEN];   //IW_PMKID_LEN=16\n        }\n        There are the BSSID information in the bssid.sa_data array.\n        If cmd is IW_PMKSA_FLUSH, it means the wpa_suppplicant wants to clear all the PMKID information.\n        If cmd is IW_PMKSA_ADD, it means the wpa_supplicant wants to add a PMKID/BSSID to driver.\n        If cmd is IW_PMKSA_REMOVE, it means the wpa_supplicant wants to remove a PMKID/BSSID from driver.\n        */\n\n\t_rtw_memcpy( strIssueBssid, pPMK->bssid.sa_data, ETH_ALEN);\n        if ( pPMK->cmd == IW_PMKSA_ADD )\n        {\n                DBG_871X( \"[rtw_wx_set_pmkid] IW_PMKSA_ADD!\\n\" );\n                if ( _rtw_memcmp( strIssueBssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )\n                {\n                    return( intReturn );\n                }\n                else\n                {\n                    intReturn = _TRUE;\n                }\n\t\tblInserted = _FALSE;\n\t\t\n\t\t//overwrite PMKID\n\t\tfor(j=0 ; j<NUM_PMKID_CACHE; j++)\n\t\t{\n\t\t\tif( _rtw_memcmp( psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN) ==_TRUE )\n\t\t\t{ // BSSID is matched, the same AP => rewrite with new PMKID.\n                                \n                                DBG_871X( \"[rtw_wx_set_pmkid] BSSID exists in the PMKList.\\n\" );\n\n\t\t\t\t_rtw_memcpy( psecuritypriv->PMKIDList[j].PMKID, pPMK->pmkid, IW_PMKID_LEN);\n                                psecuritypriv->PMKIDList[ j ].bUsed = _TRUE;\n\t\t\t\tpsecuritypriv->PMKIDIndex = j+1;\n\t\t\t\tblInserted = _TRUE;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t        }\n\n\t        if(!blInserted)\n                {\n\t\t    // Find a new entry\n                    DBG_871X( \"[rtw_wx_set_pmkid] Use the new entry index = %d for this PMKID.\\n\",\n                            psecuritypriv->PMKIDIndex );\n\n\t            _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].Bssid, strIssueBssid, ETH_ALEN);\n\t\t    _rtw_memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].PMKID, pPMK->pmkid, IW_PMKID_LEN);\n\n                    psecuritypriv->PMKIDList[ psecuritypriv->PMKIDIndex ].bUsed = _TRUE;\n\t\t    psecuritypriv->PMKIDIndex++ ;\n\t\t    if(psecuritypriv->PMKIDIndex==16)\n                    {\n\t\t        psecuritypriv->PMKIDIndex =0;\n                    }\n\t\t}\n        }\n        else if ( pPMK->cmd == IW_PMKSA_REMOVE )\n        {\n                DBG_871X( \"[rtw_wx_set_pmkid] IW_PMKSA_REMOVE!\\n\" );\n                intReturn = _TRUE;\n\t\tfor(j=0 ; j<NUM_PMKID_CACHE; j++)\n\t\t{\n\t\t\tif( _rtw_memcmp( psecuritypriv->PMKIDList[j].Bssid, strIssueBssid, ETH_ALEN) ==_TRUE )\n\t\t\t{ // BSSID is matched, the same AP => Remove this PMKID information and reset it. \n                                _rtw_memset( psecuritypriv->PMKIDList[ j ].Bssid, 0x00, ETH_ALEN );\n                                psecuritypriv->PMKIDList[ j ].bUsed = _FALSE;\n\t\t\t\tbreak;\n\t\t\t}\t\n\t        }\n        }\n        else if ( pPMK->cmd == IW_PMKSA_FLUSH ) \n        {\n            DBG_871X( \"[rtw_wx_set_pmkid] IW_PMKSA_FLUSH!\\n\" );\n            _rtw_memset( &psecuritypriv->PMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );\n            psecuritypriv->PMKIDIndex = 0;\n            intReturn = _TRUE;\n        }\n    return( intReturn );\n}\n\nstatic int rtw_wx_get_sens(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t#ifdef CONFIG_PLATFORM_ROCKCHIPS\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv); \n\t\n\t/*\n\t*  20110311 Commented by Jeff\n\t*  For rockchip platform's wpa_driver_wext_get_rssi\n\t*/\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\t//wrqu->sens.value=-padapter->recvpriv.signal_strength;\n\t\twrqu->sens.value=-padapter->recvpriv.rssi;\n\t\t//DBG_871X(\"%s: %d\\n\", __FUNCTION__, wrqu->sens.value);\n\t\twrqu->sens.fixed = 0; /* no auto select */ \n\t} else \n\t#endif\n\t{\n\t\twrqu->sens.value = 0;\n\t\twrqu->sens.fixed = 0;\t/* no auto select */\n\t\twrqu->sens.disabled = 1;\n\t}\n\treturn 0;\n}\n\nstatic int rtw_wx_get_range(struct net_device *dev, \n\t\t\t\tstruct iw_request_info *info, \n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tstruct iw_range *range = (struct iw_range *)extra;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tu16 val;\n\tint i;\n\t\n\t_func_enter_;\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_range. cmd_code=%x\\n\", info->cmd));\n\n\twrqu->data.length = sizeof(*range);\n\t_rtw_memset(range, 0, sizeof(*range));\n\n\t/* Let's try to keep this struct in the same order as in\n\t * linux/include/wireless.h\n\t */\n\n\t/* TODO: See what values we can set, and remove the ones we can't\n\t * set, or fill them with some default data.\n\t */\n\n\t/* ~5 Mb/s real (802.11b) */\n\trange->throughput = 5 * 1000 * 1000;     \n\n\t// TODO: Not used in 802.11b?\n//\trange->min_nwid;\t/* Minimal NWID we are able to set */\n\t// TODO: Not used in 802.11b?\n//\trange->max_nwid;\t/* Maximal NWID we are able to set */\n\n        /* Old Frequency (backward compat - moved lower ) */\n//\trange->old_num_channels; \n//\trange->old_num_frequency;\n//\trange->old_freq[6]; /* Filler to keep \"version\" at the same offset */\n\n\t/* signal level threshold range */\n\n\t/* Quality of link & SNR stuff */\n\t/* Quality range (link, level, noise)\n\t * If the quality is absolute, it will be in the range [0 ; max_qual],\n\t * if the quality is dBm, it will be in the range [max_qual ; 0].\n\t * Don't forget that we use 8 bit arithmetics...\n\t *\n\t * If percentage range is 0~100\n\t * Signal strength dbm range logical is -100 ~ 0\n\t * but usually value is -90 ~ -20\n\t * When CONFIG_SIGNAL_SCALE_MAPPING is defined, dbm range is -95 ~ -45\n\t */\n\trange->max_qual.qual = 100;\n#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\trange->max_qual.level = (u8)-100;\n\trange->max_qual.noise = (u8)-100;\n\trange->max_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */\n\trange->max_qual.updated |= IW_QUAL_DBM;\n#else /* !CONFIG_SIGNAL_DISPLAY_DBM */\n\t//percent values between 0 and 100.\n\trange->max_qual.level = 100;\n\trange->max_qual.noise = 100;\n\trange->max_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */\n#endif /* !CONFIG_SIGNAL_DISPLAY_DBM */\n\n\t/* This should contain the average/typical values of the quality\n\t * indicator. This should be the threshold between a \"good\" and\n\t * a \"bad\" link (example : monitor going from green to orange).\n\t * Currently, user space apps like quality monitors don't have any\n\t * way to calibrate the measurement. With this, they can split\n\t * the range between 0 and max_qual in different quality level\n\t * (using a geometric subdivision centered on the average).\n\t * I expect that people doing the user space apps will feedback\n\t * us on which value we need to put in each driver... */\n\trange->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */\n#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\t/* TODO: Find real 'good' to 'bad' threshold value for RSSI */\n\trange->avg_qual.level = (u8)-70;\n\trange->avg_qual.noise = 0;\n\trange->avg_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */\n\trange->avg_qual.updated |= IW_QUAL_DBM;\n#else /* !CONFIG_SIGNAL_DISPLAY_DBM */\n\t/* TODO: Find real 'good' to 'bad' threshol value for RSSI */\n\trange->avg_qual.level = 30;\n\trange->avg_qual.noise = 100;\n\trange->avg_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */\n#endif /* !CONFIG_SIGNAL_DISPLAY_DBM */\n\n\trange->num_bitrates = RATE_COUNT;\n\n\tfor (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {\n\t\trange->bitrate[i] = rtw_rates[i];\n\t}\n\n\trange->min_frag = MIN_FRAG_THRESHOLD;\n\trange->max_frag = MAX_FRAG_THRESHOLD;\n\n\trange->pm_capa = 0;\n\n\trange->we_version_compiled = WIRELESS_EXT;\n\trange->we_version_source = 16;\n\n//\trange->retry_capa;\t/* What retry options are supported */\n//\trange->retry_flags;\t/* How to decode max/min retry limit */\n//\trange->r_time_flags;\t/* How to decode max/min retry life */\n//\trange->min_retry;\t/* Minimal number of retries */\n//\trange->max_retry;\t/* Maximal number of retries */\n//\trange->min_r_time;\t/* Minimal retry lifetime */\n//\trange->max_r_time;\t/* Maximal retry lifetime */\n\n\tfor (i = 0, val = 0; i < MAX_CHANNEL_NUM; i++) {\n\n\t\t// Include only legal frequencies for some countries\n\t\tif(pmlmeext->channel_set[i].ChannelNum != 0)\n\t\t{\n\t\t\trange->freq[val].i = pmlmeext->channel_set[i].ChannelNum;\n\t\t\trange->freq[val].m = rtw_ch2freq(pmlmeext->channel_set[i].ChannelNum) * 100000;\n\t\t\trange->freq[val].e = 1;\n\t\t\tval++;\n\t\t}\n\n\t\tif (val == IW_MAX_FREQUENCIES)\n\t\t\tbreak;\n\t}\n\n\trange->num_channels = val;\n\trange->num_frequency = val;\n\n// Commented by Albert 2009/10/13\n// The following code will proivde the security capability to network manager.\n// If the driver doesn't provide this capability to network manager,\n// the WPA/WPA2 routers can't be choosen in the network manager.\n\n/*\n#define IW_SCAN_CAPA_NONE\t\t0x00\n#define IW_SCAN_CAPA_ESSID\t\t0x01\n#define IW_SCAN_CAPA_BSSID\t\t0x02\n#define IW_SCAN_CAPA_CHANNEL\t0x04\n#define IW_SCAN_CAPA_MODE\t\t0x08\n#define IW_SCAN_CAPA_RATE\t\t0x10\n#define IW_SCAN_CAPA_TYPE\t\t0x20\n#define IW_SCAN_CAPA_TIME\t\t0x40\n*/\n\n#if WIRELESS_EXT > 17\n\trange->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|\n\t\t\t  IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;\n#endif\n\n#ifdef IW_SCAN_CAPA_ESSID //WIRELESS_EXT > 21\n\trange->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE |IW_SCAN_CAPA_BSSID|\n\t\t\t\t\tIW_SCAN_CAPA_CHANNEL|IW_SCAN_CAPA_MODE|IW_SCAN_CAPA_RATE;\n#endif\n\n\n\t_func_exit_;\n\n\treturn 0;\n\n}\n\n//set bssid flow\n//s1. rtw_set_802_11_infrastructure_mode()\n//s2. rtw_set_802_11_authentication_mode()\n//s3. set_802_11_encryption_mode()\n//s4. rtw_set_802_11_bssid()\nstatic int rtw_wx_set_wap(struct net_device *dev,\n\t\t\t struct iw_request_info *info,\n\t\t\t union iwreq_data *awrq,\n\t\t\t char *extra)\n{\n\t_irqL\tirqL;\n\tuint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct sockaddr *temp = (struct sockaddr *)awrq;\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t_list\t*phead;\n\tu8 *dst_bssid, *src_bssid;\n\t_queue\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tNDIS_802_11_AUTHENTICATION_MODE\tauthmode;\n\n\t_func_enter_;\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type > PRIMARY_IFACE)\n\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n#endif\t\n*/\t\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)\n\t{\n\t\tDBG_871X(\"set bssid, but buddy_intf is under scanning or linking\\n\");\n\n\t\tret = -EINVAL;\n\n\t\tgoto exit;\n\t}\n#endif\n\n\trtw_ps_deny(padapter, PS_DENY_JOIN);\n\tif(_FAIL == rtw_pwr_wakeup(padapter))\n\t{\n\t\tret= -1;\n\t\tgoto exit;\n\t}\n\t\n\tif(!padapter->bup){\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\t\n\tif (temp->sa_family != ARPHRD_ETHER){\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tauthmode = padapter->securitypriv.ndisauthtype;\n\t_enter_critical_bh(&queue->lock, &irqL);\n       phead = get_list_head(queue);\n       pmlmepriv->pscanned = get_next(phead);\n\n\twhile (1)\n\t {\n\t\t\t\n\t\tif ((rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) == _TRUE)\n\t\t{\n#if 0\t\t\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)\n\t\t\t{\n\t            \t\trtw_set_802_11_bssid(padapter, temp->sa_data);\n\t    \t\t\tgoto exit;                    \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tret = -EINVAL;\n\t\t\t\tgoto exit;\n\t\t\t}\n#endif\n\n\t\t\tbreak;\n\t\t}\n\t\n\t\tpnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);\n\n\t\tpmlmepriv->pscanned = get_next(pmlmepriv->pscanned);\n\n\t\tdst_bssid = pnetwork->network.MacAddress;\n\n\t\tsrc_bssid = temp->sa_data;\n\n\t\tif ((_rtw_memcmp(dst_bssid, src_bssid, ETH_ALEN)) == _TRUE)\n\t\t{\t\t\t\n\t\t\tif(!rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode))\n\t\t\t{\n\t\t\t\tret = -1;\n\t\t\t\t_exit_critical_bh(&queue->lock, &irqL);\n\t\t\t\tgoto exit;\n\t\t\t}\n\n\t\t\t\tbreak;\t\t\t\n\t\t}\n\n\t}\t\t\n\t_exit_critical_bh(&queue->lock, &irqL);\n\t\n\trtw_set_802_11_authentication_mode(padapter, authmode);\n\t//set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);\n\tif (rtw_set_802_11_bssid(padapter, temp->sa_data) == _FALSE) {\n\t\tret = -1;\n\t\tgoto exit;\t\t\n\t}\t\n\t\nexit:\n\t\n\trtw_ps_deny_cancel(padapter, PS_DENY_JOIN);\n\n\t_func_exit_;\n\t\n\treturn ret;\t\n}\n\nstatic int rtw_wx_get_wap(struct net_device *dev, \n\t\t\t    struct iw_request_info *info, \n\t\t\t    union iwreq_data *wrqu, char *extra)\n{\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;\t\n\t\n\twrqu->ap_addr.sa_family = ARPHRD_ETHER;\n\t\n\t_rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);\n\t\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_wap\\n\"));\n\n\t_func_enter_;\n\n\tif  ( ((check_fwstate(pmlmepriv, _FW_LINKED)) == _TRUE) || \n\t\t\t((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) == _TRUE) ||\n\t\t\t((check_fwstate(pmlmepriv, WIFI_AP_STATE)) == _TRUE) )\n\t{\n\n\t\t_rtw_memcpy(wrqu->ap_addr.sa_data, pcur_bss->MacAddress, ETH_ALEN);\n\t}\n\telse\n\t{\n\t \t_rtw_memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);\n\t}\t\t\n\n\t_func_exit_;\n\t\n\treturn 0;\n\t\n}\n\nstatic int rtw_wx_set_mlme(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n#if 0\n/* SIOCSIWMLME data */\nstruct\tiw_mlme\n{\n\t__u16\t\tcmd; /* IW_MLME_* */\n\t__u16\t\treason_code;\n\tstruct sockaddr\taddr;\n};\n#endif\n\n\tint ret=0;\n\tu16 reason;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_mlme *mlme = (struct iw_mlme *) extra;\n\n\n\tif(mlme==NULL)\n\t\treturn -1;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\treason = cpu_to_le16(mlme->reason_code);\n\n\n\tDBG_871X(\"%s, cmd=%d, reason=%d\\n\", __FUNCTION__, mlme->cmd, reason);\n\t\n\n\tswitch (mlme->cmd) \n\t{\n\t\tcase IW_MLME_DEAUTH:\n\t\t\t\tif(!rtw_set_802_11_disassociate(padapter))\n\t\t\t\t\tret = -1;\n\t\t\t\tbreak;\n\n\t\tcase IW_MLME_DISASSOC:\n\t\t\t\tif(!rtw_set_802_11_disassociate(padapter))\n\t\t\t\t\tret = -1;\n\n\t\t\t\tbreak;\n\n\t\tdefault:\n\t\t\treturn -EOPNOTSUPP;\n\t}\n\n\treturn ret;\n}\n\nstatic int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a,\n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\tu8 _status = _FALSE;\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv= &padapter->mlmepriv;\n\tNDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];\n\t_irqL\tirqL;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\t\n#endif //CONFIG_P2P\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_set_scan\\n\"));\n\n_func_enter_;\n\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d\\n\",__FUNCTION__, __LINE__);\n\t#endif\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type > PRIMARY_IFACE)\n\t{\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n#endif\n*/\n#ifdef CONFIG_MP_INCLUDED\n\t\tif (padapter->registrypriv.mp_mode == 1)\n\t\t{\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block Scan request\\n\", FUNC_ADPT_ARG(padapter));\t\n\t\t\t\tret = -1;\n\t\t\t\tgoto exit;\n\t\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (padapter->pbuddy_adapter) {\n\t\t\t\tif (padapter->pbuddy_adapter->registrypriv.mp_mode == 1)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(FUNC_ADPT_FMT \": MP mode block Scan request\\n\", FUNC_ADPT_ARG(padapter->pbuddy_adapter));\n\t\t\t\t\tret = -1;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t}\n#endif //CONFIG_CONCURRENT_MODE\n#endif\n\n\trtw_ps_deny(padapter, PS_DENY_SCAN);\n\tif(_FAIL == rtw_pwr_wakeup(padapter))\n\t{\n\t\tret= -1;\n\t\tgoto exit;\n\t}\n\n\tif (rtw_is_drv_stopped(padapter)) {\n\t\tDBG_871X(\"%s bDriverStopped=_TRUE\\n\", __func__);\n\t\tret= -1;\n\t\tgoto exit;\n\t}\n\t\n\tif(!padapter->bup){\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\t\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n#ifndef CONFIG_DOSCAN_IN_BUSYTRAFFIC\n\t// When Busy Traffic, driver do not site survey. So driver return success.\n\t// wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout.\n\t// modify by thomas 2011-02-22.\n\tif (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE\n#ifdef CONFIG_CONCURRENT_MODE\n\t|| rtw_get_buddy_bBusyTraffic(padapter) == _TRUE\n#endif //CONFIG_CONCURRENT_MODE\n\t)\n\t{\n\t\tindicate_wx_scan_complete_event(padapter);\n\t\tgoto exit;\n\t}\n#endif\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)\n\t{\n\t\tindicate_wx_scan_complete_event(padapter);\n\t\tgoto exit;\n\t} \n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter,\n\t\t_FW_UNDER_SURVEY|_FW_UNDER_LINKING|WIFI_UNDER_WPS) == _TRUE)\n\t{\n\t\tindicate_wx_scan_complete_event(padapter);\n\t\tgoto exit;\n\t}\n#endif\n\n#ifdef CONFIG_P2P\n\tif ( pwdinfo->p2p_state != P2P_STATE_NONE )\n\t{\n\t\trtw_p2p_set_pre_state( pwdinfo, rtw_p2p_state( pwdinfo ) );\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\n\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_FULL);\n\t\trtw_free_network_queue(padapter, _TRUE);\n\t}\n#endif //CONFIG_P2P\n\n\t_rtw_memset(ssid, 0, sizeof(NDIS_802_11_SSID)*RTW_SSID_SCAN_AMOUNT);\n\n#if WIRELESS_EXT >= 17\n\tif (wrqu->data.length == sizeof(struct iw_scan_req)) \n\t{\n\t\tstruct iw_scan_req *req = (struct iw_scan_req *)extra;\n\t\n\t\tif (wrqu->data.flags & IW_SCAN_THIS_ESSID)\n\t\t{\n\t\t\tint len = min((int)req->essid_len, IW_ESSID_MAX_SIZE);\n\n\t\t\t_rtw_memcpy(ssid[0].Ssid, req->essid, len);\n\t\t\tssid[0].SsidLength = len;\t\n\n\t\t\tDBG_871X(\"IW_SCAN_THIS_ESSID, ssid=%s, len=%d\\n\", req->essid, req->essid_len);\n\t\t\n\t\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\t\t\t\t\n\t\t\n\t\t\t_status = rtw_sitesurvey_cmd(padapter, ssid, 1, NULL, 0);\n\t\t\n\t\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\t\t\t\n\t\t}\n\t\telse if (req->scan_type == IW_SCAN_TYPE_PASSIVE)\n\t\t{\n\t\t\tDBG_871X(\"rtw_wx_set_scan, req->scan_type == IW_SCAN_TYPE_PASSIVE\\n\");\n\t\t}\n\t\t\n\t}\n\telse\n#endif\n\n\tif(\twrqu->data.length >= WEXT_CSCAN_HEADER_SIZE\n\t\t&& _rtw_memcmp(extra, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE) == _TRUE\n\t)\n\t{\n\t\tint len = wrqu->data.length -WEXT_CSCAN_HEADER_SIZE;\n\t\tchar *pos = extra+WEXT_CSCAN_HEADER_SIZE;\n\t\tchar section;\n\t\tchar sec_len;\n\t\tint ssid_index = 0;\n\n\t\t//DBG_871X(\"%s COMBO_SCAN header is recognized\\n\", __FUNCTION__);\n\t\t\n\t\twhile(len >= 1) {\n\t\t\tsection = *(pos++); len-=1;\n\n\t\t\tswitch(section) {\n\t\t\t\tcase WEXT_CSCAN_SSID_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_SSID_SECTION\\n\");\n\t\t\t\t\tif(len < 1) {\n\t\t\t\t\t\tlen = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tsec_len = *(pos++); len-=1;\n\n\t\t\t\t\tif(sec_len>0 && sec_len<=len) {\n\t\t\t\t\t\tssid[ssid_index].SsidLength = sec_len;\n\t\t\t\t\t\t_rtw_memcpy(ssid[ssid_index].Ssid, pos, ssid[ssid_index].SsidLength);\n\t\t\t\t\t\t//DBG_871X(\"%s COMBO_SCAN with specific ssid:%s, %d\\n\", __FUNCTION__\n\t\t\t\t\t\t//\t, ssid[ssid_index].Ssid, ssid[ssid_index].SsidLength);\n\t\t\t\t\t\tssid_index++;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tpos+=sec_len; len-=sec_len;\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\tcase WEXT_CSCAN_CHANNEL_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_CHANNEL_SECTION\\n\");\n\t\t\t\t\tpos+=1; len-=1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase WEXT_CSCAN_ACTV_DWELL_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_ACTV_DWELL_SECTION\\n\");\n\t\t\t\t\tpos+=2; len-=2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase WEXT_CSCAN_PASV_DWELL_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_PASV_DWELL_SECTION\\n\");\n\t\t\t\t\tpos+=2; len-=2;\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase WEXT_CSCAN_HOME_DWELL_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_HOME_DWELL_SECTION\\n\");\n\t\t\t\t\tpos+=2; len-=2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase WEXT_CSCAN_TYPE_SECTION:\n\t\t\t\t\t//DBG_871X(\"WEXT_CSCAN_TYPE_SECTION\\n\");\n\t\t\t\t\tpos+=1; len-=1;\n\t\t\t\t\tbreak;\n\t\t\t\t#if 0\n\t\t\t\tcase WEXT_CSCAN_NPROBE_SECTION:\n\t\t\t\t\tDBG_871X(\"WEXT_CSCAN_NPROBE_SECTION\\n\");\n\t\t\t\t\tbreak;\n\t\t\t\t#endif\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\t//DBG_871X(\"Unknown CSCAN section %c\\n\", section);\n\t\t\t\t\tlen = 0; // stop parsing\n\t\t\t}\n\t\t\t//DBG_871X(\"len:%d\\n\", len);\n\t\t\t\n\t\t}\n\t\t\n\t\t//jeff: it has still some scan paramater to parse, we only do this now...\n\t\t_status = rtw_set_802_11_bssid_list_scan(padapter, ssid, RTW_SSID_SCAN_AMOUNT);\n\t\t\n\t} else\n\t\n\t{\n\t\t_status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0);\n\t}\n\n\tif(_status == _FALSE)\n\t\tret = -1;\n\nexit:\n\n\trtw_ps_deny_cancel(padapter, PS_DENY_SCAN);\n\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d return %d\\n\",__FUNCTION__, __LINE__, ret);\n\t#endif\n\n_func_exit_;\n\n\treturn ret;\t\n}\n\nstatic int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,\n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_irqL\tirqL;\n\t_list\t\t\t\t\t*plist, *phead;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\t_queue\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tchar *ev = extra;\n\tchar *stop = ev + wrqu->data.length;\n\tu32 ret = 0;\n\tu32 cnt=0;\n\tu32 wait_for_surveydone;\n\tsint wait_status;\n#ifdef CONFIG_CONCURRENT_MODE\n\t//PADAPTER pbuddy_adapter = padapter->pbuddy_adapter;\n\t//struct mlme_priv *pbuddy_mlmepriv = &(pbuddy_adapter->mlmepriv);\t\n#endif\n#ifdef CONFIG_P2P\n\tstruct\twifidirect_info*\tpwdinfo = &padapter->wdinfo;\n#endif //CONFIG_P2P\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_scan\\n\"));\n\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_, (\" Start of Query SIOCGIWSCAN .\\n\"));\n\n\t_func_enter_;\n\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d\\n\",__FUNCTION__, __LINE__);\n\t#endif\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type > PRIMARY_IFACE)\n\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n#endif\n*/\t\n\tif (adapter_to_pwrctl(padapter)->brfoffbyhw && rtw_is_drv_stopped(padapter)) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n  \n#ifdef CONFIG_P2P\n\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\twait_for_surveydone = 200;\n\t}\n\telse\n\t{\n\t\t//\tP2P is disabled\n\t\twait_for_surveydone = 100;\n\t}\n#else\n\t{\n\t\twait_for_surveydone = 100;\n\t}\n#endif //CONFIG_P2P\n\n#if 1 // Wireless Extension use EAGAIN to try\n\twait_status = _FW_UNDER_SURVEY\n#ifndef CONFIG_ANDROID\n\t\t| _FW_UNDER_LINKING\n#endif\n\t;\n\n\twhile (check_fwstate(pmlmepriv, wait_status) == _TRUE)\n\t{\n\t\treturn -EAGAIN;\n\t}\n#else\n\twait_status = _FW_UNDER_SURVEY\n\t\t#ifndef CONFIG_ANDROID\n\t\t|_FW_UNDER_LINKING\n\t\t#endif\n\t;\n\n \twhile(check_fwstate(pmlmepriv, wait_status) == _TRUE)\n\t{\t\n\t\trtw_msleep_os(30);\n\t\tcnt++;\n\t\tif(cnt > wait_for_surveydone )\n\t\t\tbreak;\n\t}\n#endif\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tif((stop - ev) < SCAN_ITEM_SIZE) {\n\t\t\tret = -E2BIG;\n\t\t\tbreak;\n\t\t}\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//report network only if the current channel set contains the channel to which this network belongs\n\t\tif(rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.Configuration.DSConfig) >= 0\n\t\t\t&& rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE\n\t\t\t&& _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))\n\t\t)\n\t\t{\n\t\t\tev=translate_scan(padapter, a, pnetwork, ev, stop);\n\t\t}\n\n\t\tplist = get_next(plist);\n\t\n\t}        \n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n       wrqu->data.length = ev-extra;\n\twrqu->data.flags = 0;\n\t\nexit:\t\t\n\t\n\t_func_exit_;\t\n\t\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d return %d\\n\",__FUNCTION__, __LINE__, ret);\n\t#endif\n\t\n\treturn ret ;\n\t\n}\n\n//set ssid flow\n//s1. rtw_set_802_11_infrastructure_mode()\n//s2. set_802_11_authenticaion_mode()\n//s3. set_802_11_encryption_mode()\n//s4. rtw_set_802_11_ssid()\nstatic int rtw_wx_set_essid(struct net_device *dev, \n\t\t\t      struct iw_request_info *a,\n\t\t\t      union iwreq_data *wrqu, char *extra)\n{\n\t_irqL irqL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_queue *queue = &pmlmepriv->scanned_queue;\n\t_list *phead;\n\ts8 status = _TRUE;\n\tstruct wlan_network *pnetwork = NULL;\n\tNDIS_802_11_AUTHENTICATION_MODE authmode;\t\n\tNDIS_802_11_SSID ndis_ssid;\t\n\tu8 *dst_ssid, *src_ssid;\n\n\tuint ret = 0, len;\n\n\t_func_enter_;\n\t\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d\\n\",__FUNCTION__, __LINE__);\n\t#endif\n\t#ifdef CONFIG_WEXT_DONT_JOIN_BYSSID\n\tDBG_871X(\"%s: CONFIG_WEXT_DONT_JOIN_BYSSID be defined!! only allow bssid joining\\n\", __func__);\n\treturn -EPERM;\n\t#endif\n/*\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->iface_type > PRIMARY_IFACE)\n\t{\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n#endif\n*/\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)\n\t{\t\t\n\t\tDBG_871X(\"set ssid, but buddy_intf is under scanning or linking\\n\");\n\t\t\n\t\tret = -EINVAL;\n\t\t\n\t\tgoto exit;\n\t}\n#endif\n\n\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t (\"+rtw_wx_set_essid: fw_state=0x%08x\\n\", get_fwstate(pmlmepriv)));\n\n\trtw_ps_deny(padapter, PS_DENY_JOIN);\n\tif(_FAIL == rtw_pwr_wakeup(padapter))\n\t{\t\t\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\tif(!padapter->bup){\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n#if WIRELESS_EXT <= 20\n\tif ((wrqu->essid.length-1) > IW_ESSID_MAX_SIZE){\n#else\n\tif (wrqu->essid.length > IW_ESSID_MAX_SIZE){\n#endif\n\t\tret= -E2BIG;\n\t\tgoto exit;\n\t}\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\tret = -1;\n\t\tgoto exit;\n\t}\t\t\n\t\n\tauthmode = padapter->securitypriv.ndisauthtype;\n\tDBG_871X(\"=>%s\\n\",__FUNCTION__);\n\tif (wrqu->essid.flags && wrqu->essid.length)\n\t{\n\t\t// Commented by Albert 20100519\n\t\t// We got the codes in \"set_info\" function of iwconfig source code.\n\t\t//\t=========================================\n\t\t//\twrq.u.essid.length = strlen(essid) + 1;\n\t  \t//\tif(we_kernel_version > 20)\n\t\t//\t\twrq.u.essid.length--;\n\t\t//\t=========================================\n\t\t//\tThat means, if the WIRELESS_EXT less than or equal to 20, the correct ssid len should subtract 1.\n#if WIRELESS_EXT <= 20\n\t\tlen = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE;\n#else\n\t\tlen = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : IW_ESSID_MAX_SIZE;\n#endif\n\n\t\tif( wrqu->essid.length != 33 )\n\t\t\tDBG_871X(\"ssid=%s, len=%d\\n\", extra, wrqu->essid.length);\n\n\t\t_rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));\n\t\tndis_ssid.SsidLength = len;\n\t\t_rtw_memcpy(ndis_ssid.Ssid, extra, len);\t\t\n\t\tsrc_ssid = ndis_ssid.Ssid;\n\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, (\"rtw_wx_set_essid: ssid=[%s]\\n\", src_ssid));\n\t\t_enter_critical_bh(&queue->lock, &irqL);\n\t       phead = get_list_head(queue);\n              pmlmepriv->pscanned = get_next(phead);\n\n\t\twhile (1)\n\t\t{\t\t\t\n\t\t\tif (rtw_end_of_queue_search(phead, pmlmepriv->pscanned) == _TRUE)\n\t\t\t{\n#if 0\t\t\t\n\t\t\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)\n\t\t\t\t{\n\t            \t\t\trtw_set_802_11_ssid(padapter, &ndis_ssid);\n\n\t\t    \t\t\tgoto exit;                    \n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,(\"rtw_wx_set_ssid(): scanned_queue is empty\\n\"));\n\t\t\t\t\tret = -EINVAL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n#endif\t\t\t\n\t\t\t        RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_warning_,\n\t\t\t\t\t (\"rtw_wx_set_essid: scan_q is empty, set ssid to check if scanning again!\\n\"));\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\n\t\t\tpnetwork = LIST_CONTAINOR(pmlmepriv->pscanned, struct wlan_network, list);\n\n\t\t\tpmlmepriv->pscanned = get_next(pmlmepriv->pscanned);\n\n\t\t\tdst_ssid = pnetwork->network.Ssid.Ssid;\n\n\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t\t\t (\"rtw_wx_set_essid: dst_ssid=%s\\n\",\n\t\t\t\t  pnetwork->network.Ssid.Ssid));\n\n\t\t\tif ((_rtw_memcmp(dst_ssid, src_ssid, ndis_ssid.SsidLength) == _TRUE) &&\n\t\t\t\t(pnetwork->network.Ssid.SsidLength==ndis_ssid.SsidLength))\n\t\t\t{\n\t\t\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t\t\t\t (\"rtw_wx_set_essid: find match, set infra mode\\n\"));\n\t\t\t\t\n\t\t\t\tif(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)\n\t\t\t\t{\n\t\t\t\t\tif(pnetwork->network.InfrastructureMode != pmlmepriv->cur_network.network.InfrastructureMode)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t}\t\n\t\t\t\t\t\n\t\t\t\tif (rtw_set_802_11_infrastructure_mode(padapter, pnetwork->network.InfrastructureMode) == _FALSE)\n\t\t\t\t{\n\t\t\t\t\tret = -1;\n\t\t\t\t\t_exit_critical_bh(&queue->lock, &irqL);\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\n\t\t\t\tbreak;\t\t\t\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&queue->lock, &irqL);\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t\t (\"set ssid: set_802_11_auth. mode=%d\\n\", authmode));\n\t\trtw_set_802_11_authentication_mode(padapter, authmode);\n\t\t//set_802_11_encryption_mode(padapter, padapter->securitypriv.ndisencryptstatus);\n\t\tif (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE) {\n\t\t\tret = -1;\n\t\t\tgoto exit;\n\t\t}\t\n\t}\t\t\t\n\t\nexit:\n\n\trtw_ps_deny_cancel(padapter, PS_DENY_JOIN);\n\n\tDBG_871X(\"<=%s, ret %d\\n\",__FUNCTION__, ret);\n\t\n\t#ifdef DBG_IOCTL\n\tDBG_871X(\"DBG_IOCTL %s:%d return %d\\n\",__FUNCTION__, __LINE__, ret);\n\t#endif\n\t\n\t_func_exit_;\n\t\n\treturn ret;\t\n}\n\nstatic int rtw_wx_get_essid(struct net_device *dev, \n\t\t\t      struct iw_request_info *a,\n\t\t\t      union iwreq_data *wrqu, char *extra)\n{\n\tu32 len,ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\tWLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\"rtw_wx_get_essid\\n\"));\n\n\t_func_enter_;\n\n\tif ( (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||\n\t      (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))\n\t{\n\t\tlen = pcur_bss->Ssid.SsidLength;\n\n\t\twrqu->essid.length = len;\n\t\t\t\n\t\t_rtw_memcpy(extra, pcur_bss->Ssid.Ssid, len);\n\n\t\twrqu->essid.flags = 1;\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\nexit:\n\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_wx_set_rate(struct net_device *dev, \n\t\t\t      struct iw_request_info *a,\n\t\t\t      union iwreq_data *wrqu, char *extra)\n{\n\tint\ti, ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8\tdatarates[NumRates];\n\tu32\ttarget_rate = wrqu->bitrate.value;\n\tu32\tfixed = wrqu->bitrate.fixed;\n\tu32\tratevalue = 0;\n\t u8 mpdatarate[NumRates]={11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0xff};\n\n_func_enter_;\n\n\tRT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,(\" rtw_wx_set_rate \\n\"));\n\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,(\"target_rate = %d, fixed = %d\\n\",target_rate,fixed));\n\t\n\tif(target_rate == -1){\n\t\tratevalue = 11;\n\t\tgoto set_rate;\n\t}\n\ttarget_rate = target_rate/100000;\n\n\tswitch(target_rate){\n\t\tcase 10:\n\t\t\tratevalue = 0;\n\t\t\tbreak;\n\t\tcase 20:\n\t\t\tratevalue = 1;\n\t\t\tbreak;\n\t\tcase 55:\n\t\t\tratevalue = 2;\n\t\t\tbreak;\n\t\tcase 60:\n\t\t\tratevalue = 3;\n\t\t\tbreak;\n\t\tcase 90:\n\t\t\tratevalue = 4;\n\t\t\tbreak;\n\t\tcase 110:\n\t\t\tratevalue = 5;\n\t\t\tbreak;\n\t\tcase 120:\n\t\t\tratevalue = 6;\n\t\t\tbreak;\n\t\tcase 180:\n\t\t\tratevalue = 7;\n\t\t\tbreak;\n\t\tcase 240:\n\t\t\tratevalue = 8;\n\t\t\tbreak;\n\t\tcase 360:\n\t\t\tratevalue = 9;\n\t\t\tbreak;\n\t\tcase 480:\n\t\t\tratevalue = 10;\n\t\t\tbreak;\n\t\tcase 540:\n\t\t\tratevalue = 11;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tratevalue = 11;\n\t\t\tbreak;\n\t}\n\nset_rate:\n\n\tfor(i=0; i<NumRates; i++)\n\t{\n\t\tif(ratevalue==mpdatarate[i])\n\t\t{\n\t\t\tdatarates[i] = mpdatarate[i];\n\t\t\tif(fixed == 0)\n\t\t\t\tbreak;\n\t\t}\n\t\telse{\n\t\t\tdatarates[i] = 0xff;\n\t\t}\n\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,(\"datarate_inx=%d\\n\",datarates[i]));\n\t}\n\n\tif( rtw_setdatarate_cmd(padapter, datarates) !=_SUCCESS){\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"rtw_wx_set_rate Fail!!!\\n\"));\n\t\tret = -1;\n\t}\n\n_func_exit_;\n\n\treturn ret;\n}\n\nstatic int rtw_wx_get_rate(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\t\n\tu16 max_rate = 0;\n\n\tmax_rate = rtw_get_cur_max_rate((_adapter *)rtw_netdev_priv(dev));\n\n\tif(max_rate == 0)\n\t\treturn -EPERM;\n\t\n\twrqu->bitrate.fixed = 0;\t/* no auto select */\n\twrqu->bitrate.value = max_rate * 100000;\n\n\treturn 0;\n}\n\nstatic int rtw_wx_set_rts(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\t_func_enter_;\n\t\n\tif (wrqu->rts.disabled)\n\t\tpadapter->registrypriv.rts_thresh = 2347;\n\telse {\n\t\tif (wrqu->rts.value < 0 ||\n\t\t    wrqu->rts.value > 2347)\n\t\t\treturn -EINVAL;\n\t\t\n\t\tpadapter->registrypriv.rts_thresh = wrqu->rts.value;\n\t}\n\n\tDBG_871X(\"%s, rts_thresh=%d\\n\", __func__, padapter->registrypriv.rts_thresh);\n\t\n\t_func_exit_;\n\t\n\treturn 0;\n\n}\n\nstatic int rtw_wx_get_rts(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\t_func_enter_;\n\n\tDBG_871X(\"%s, rts_thresh=%d\\n\", __func__, padapter->registrypriv.rts_thresh);\t\n\t\n\twrqu->rts.value = padapter->registrypriv.rts_thresh;\n\twrqu->rts.fixed = 0;\t/* no auto select */\n\t//wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);\n\t\n\t_func_exit_;\n\t\n\treturn 0;\n}\n\nstatic int rtw_wx_set_frag(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\t_func_enter_;\n\t\n\tif (wrqu->frag.disabled)\n\t\tpadapter->xmitpriv.frag_len = MAX_FRAG_THRESHOLD;\n\telse {\n\t\tif (wrqu->frag.value < MIN_FRAG_THRESHOLD ||\n\t\t    wrqu->frag.value > MAX_FRAG_THRESHOLD)\n\t\t\treturn -EINVAL;\n\t\t\n\t\tpadapter->xmitpriv.frag_len = wrqu->frag.value & ~0x1;\n\t}\n\n\tDBG_871X(\"%s, frag_len=%d\\n\", __func__, padapter->xmitpriv.frag_len);\n\t\n\t_func_exit_;\n\t\n\treturn 0;\n\t\n}\n\nstatic int rtw_wx_get_frag(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\t_func_enter_;\n\n\tDBG_871X(\"%s, frag_len=%d\\n\", __func__, padapter->xmitpriv.frag_len);\n\t\n\twrqu->frag.value = padapter->xmitpriv.frag_len;\n\twrqu->frag.fixed = 0;\t/* no auto select */\n\t//wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);\n\t\n\t_func_exit_;\n\t\n\treturn 0;\n}\n\nstatic int rtw_wx_get_retry(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t//_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\t\n\twrqu->retry.value = 7;\n\twrqu->retry.fixed = 0;\t/* no auto select */\n\twrqu->retry.disabled = 1;\n\t\n\treturn 0;\n\n}\t\n\n#if 0\n#define IW_ENCODE_INDEX\t\t0x00FF\t/* Token index (if needed) */\n#define IW_ENCODE_FLAGS\t\t0xFF00\t/* Flags defined below */\n#define IW_ENCODE_MODE\t\t0xF000\t/* Modes defined below */\n#define IW_ENCODE_DISABLED\t0x8000\t/* Encoding disabled */\n#define IW_ENCODE_ENABLED\t0x0000\t/* Encoding enabled */\n#define IW_ENCODE_RESTRICTED\t0x4000\t/* Refuse non-encoded packets */\n#define IW_ENCODE_OPEN\t\t0x2000\t/* Accept non-encoded packets */\n#define IW_ENCODE_NOKEY\t\t0x0800  /* Key is write only, so not present */\n#define IW_ENCODE_TEMP\t\t0x0400  /* Temporary key */\n/*\niwconfig wlan0 key on -> flags = 0x6001 -> maybe it means auto\niwconfig wlan0 key off -> flags = 0x8800\niwconfig wlan0 key open -> flags = 0x2800\niwconfig wlan0 key open 1234567890 -> flags = 0x2000\niwconfig wlan0 key restricted -> flags = 0x4800\niwconfig wlan0 key open [3] 1234567890 -> flags = 0x2003\niwconfig wlan0 key restricted [2] 1234567890 -> flags = 0x4002\niwconfig wlan0 key open [3] -> flags = 0x2803\niwconfig wlan0 key restricted [2] -> flags = 0x4802\n*/\n#endif\n\nstatic int rtw_wx_set_enc(struct net_device *dev, \n\t\t\t    struct iw_request_info *info, \n\t\t\t    union iwreq_data *wrqu, char *keybuf)\n{\t\n\tu32 key, ret = 0;\n\tu32 keyindex_provided;\n\tNDIS_802_11_WEP\t wep;\t\n\tNDIS_802_11_AUTHENTICATION_MODE authmode;\n\n\tstruct iw_point *erq = &(wrqu->encoding);\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tDBG_871X(\"+rtw_wx_set_enc, flags=0x%x\\n\", erq->flags);\n\n\t_rtw_memset(&wep, 0, sizeof(NDIS_802_11_WEP));\n\t\n\tkey = erq->flags & IW_ENCODE_INDEX;\n\t\n\t_func_enter_;\t\n\n\tif (erq->flags & IW_ENCODE_DISABLED)\n\t{\n\t\tDBG_871X(\"EncryptionDisabled\\n\");\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system\n  \t\tauthmode = Ndis802_11AuthModeOpen;\n\t\tpadapter->securitypriv.ndisauthtype=authmode;\n     \t\t\n\t\tgoto exit;\n\t}\n\n\tif (key) {\n\t\tif (key > WEP_KEYS)\n\t\t\treturn -EINVAL;\n\t\tkey--;\n\t\tkeyindex_provided = 1;\n\t} \n\telse\n\t{\n\t\tkeyindex_provided = 0;\n\t\tkey = padapter->securitypriv.dot11PrivacyKeyIndex;\n\t\tDBG_871X(\"rtw_wx_set_enc, key=%d\\n\", key);\n\t}\n\t\n\t//set authentication mode\t\n\tif(erq->flags & IW_ENCODE_OPEN)\n\t{\n\t\tDBG_871X(\"rtw_wx_set_enc():IW_ENCODE_OPEN\\n\");\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;//Ndis802_11EncryptionDisabled;\n\n#ifdef CONFIG_PLATFORM_MT53XX\n\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n#else\n\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open;\n#endif\n\n\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n  \t\tauthmode = Ndis802_11AuthModeOpen;\n\t\tpadapter->securitypriv.ndisauthtype=authmode;\n\t}\t\n\telse if(erq->flags & IW_ENCODE_RESTRICTED)\n\t{\t\t\n\t\tDBG_871X(\"rtw_wx_set_enc():IW_ENCODE_RESTRICTED\\n\");\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\n#ifdef CONFIG_PLATFORM_MT53XX\n\t\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n#else\n\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Shared;\n#endif\n\n\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;\n\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;\t\t\t\n\t\tauthmode = Ndis802_11AuthModeShared;\n\t\tpadapter->securitypriv.ndisauthtype=authmode;\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"rtw_wx_set_enc():erq->flags=0x%x\\n\", erq->flags);\n\n\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;//Ndis802_11EncryptionDisabled;\n\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system\n\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n  \t\tauthmode = Ndis802_11AuthModeOpen;\n\t\tpadapter->securitypriv.ndisauthtype=authmode;\n\t}\n\t\n\twep.KeyIndex = key;\n\tif (erq->length > 0)\n\t{\n\t\twep.KeyLength = erq->length <= 5 ? 5 : 13;\n\n\t\twep.Length = wep.KeyLength + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);\n\t}\n\telse\n\t{\n\t\twep.KeyLength = 0 ;\n\t\t\n\t\tif(keyindex_provided == 1)// set key_id only, no given KeyMaterial(erq->length==0).\n\t\t{\n\t\t\tpadapter->securitypriv.dot11PrivacyKeyIndex = key;\n\n\t\t\tDBG_871X(\"(keyindex_provided == 1), keyid=%d, key_len=%d\\n\", key, padapter->securitypriv.dot11DefKeylen[key]);\n\n\t\t\tswitch(padapter->securitypriv.dot11DefKeylen[key])\n\t\t\t{\n\t\t\t\tcase 5:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\t\n\t\t\tgoto exit;\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\twep.KeyIndex |= 0x80000000;\n\n\t_rtw_memcpy(wep.KeyMaterial, keybuf, wep.KeyLength);\n\t\n\tif (rtw_set_802_11_add_wep(padapter, &wep) == _FALSE) {\n\t\tif(rf_on == pwrpriv->rf_pwrstate )\n\t\t\tret = -EOPNOTSUPP;\n\t\tgoto exit;\n\t}\t\n\nexit:\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_wx_get_enc(struct net_device *dev, \n\t\t\t    struct iw_request_info *info, \n\t\t\t    union iwreq_data *wrqu, char *keybuf)\n{\n\tuint key, ret =0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_point *erq = &(wrqu->encoding);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\n\n\t_func_enter_;\n\t\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE)\n\t{\n\t\t if(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != _TRUE)\n\t\t {\n\t\terq->length = 0;\n\t\terq->flags |= IW_ENCODE_DISABLED;\n\t\treturn 0;\n\t}\t\n\t}\t\n\n\t\n\tkey = erq->flags & IW_ENCODE_INDEX;\n\n\tif (key) {\n\t\tif (key > WEP_KEYS)\n\t\t\treturn -EINVAL;\n\t\tkey--;\n\t} else\n\t{\n\t\tkey = padapter->securitypriv.dot11PrivacyKeyIndex;\n\t}\t\n\n\terq->flags = key + 1;\n\n\t//if(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeOpen)\n\t//{\n\t//      erq->flags |= IW_ENCODE_OPEN;\n\t//}\t  \n\t\n\tswitch(padapter->securitypriv.ndisencryptstatus)\n\t{\n\t\tcase Ndis802_11EncryptionNotSupported:\n\t\tcase Ndis802_11EncryptionDisabled:\n\n\t\terq->length = 0;\n\t\terq->flags |= IW_ENCODE_DISABLED;\n\t\n\t\tbreak;\n\t\t\n\t\tcase Ndis802_11Encryption1Enabled:\t\t\t\t\t\n\t\t\n\t\terq->length = padapter->securitypriv.dot11DefKeylen[key];\t\t\n\n\t\tif(erq->length)\n\t\t{\n\t\t\t_rtw_memcpy(keybuf, padapter->securitypriv.dot11DefKey[key].skey, padapter->securitypriv.dot11DefKeylen[key]);\n\t\t\n\t\terq->flags |= IW_ENCODE_ENABLED;\n\n\t\t\tif(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeOpen)\n\t\t\t{\n\t     \t\t\terq->flags |= IW_ENCODE_OPEN;\n\t\t\t}\n\t\t\telse if(padapter->securitypriv.ndisauthtype == Ndis802_11AuthModeShared)\n\t\t\t{\n\t\terq->flags |= IW_ENCODE_RESTRICTED;\n\t\t\t}\t\n\t\t}\t\n\t\telse\n\t\t{\n\t\t\terq->length = 0;\n\t\t\terq->flags |= IW_ENCODE_DISABLED;\n\t\t}\n\n\t\tbreak;\n\n\t\tcase Ndis802_11Encryption2Enabled:\n\t\tcase Ndis802_11Encryption3Enabled:\n\n\t\terq->length = 16;\n\t\terq->flags |= (IW_ENCODE_ENABLED | IW_ENCODE_OPEN | IW_ENCODE_NOKEY);\n\n\t\tbreak;\n\t\n\t\tdefault:\n\t\terq->length = 0;\n\t\terq->flags |= IW_ENCODE_DISABLED;\n\n\t\tbreak;\n\t\t\n\t}\n\t\n\t_func_exit_;\n\t\n\treturn ret;\n\t\n}\t\t\t\t     \n\nstatic int rtw_wx_get_power(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t//_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\twrqu->power.value = 0;\n\twrqu->power.fixed = 0;\t/* no auto select */\n\twrqu->power.disabled = 1;\n\t\n\treturn 0;\n\n}\n\nstatic int rtw_wx_set_gen_ie(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\tint ret;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n       ret = rtw_set_wpa_ie(padapter, extra, wrqu->data.length);\n\t   \n\treturn ret;\n}\t\n\nstatic int rtw_wx_set_auth(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_param *param = (struct iw_param*)&(wrqu->param);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tu32 value = param->value;\n\tint ret = 0;\n\t\n\tswitch (param->flags & IW_AUTH_INDEX) {\n\n\tcase IW_AUTH_WPA_VERSION:\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef CONFIG_IOCTL_CFG80211\n\t\t padapter->wapiInfo.bWapiEnable = false;\n\t\t if(value == IW_AUTH_WAPI_VERSION_1)\n\t\t {\n\t\t\tpadapter->wapiInfo.bWapiEnable = true;\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = _SMS4_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _SMS4_;\n\t\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_WAPI;\n\t\t\tpmlmeinfo->auth_algo = psecuritypriv->dot11AuthAlgrthm;\n\t\t\tpadapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;\n\t\t\tpadapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;\n\t\t}\n#endif\n#endif\n\t\tbreak;\n\tcase IW_AUTH_CIPHER_PAIRWISE:\n\t\t\n\t\tbreak;\n\tcase IW_AUTH_CIPHER_GROUP:\n\t\t\n\t\tbreak;\n\tcase IW_AUTH_KEY_MGMT:\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef CONFIG_IOCTL_CFG80211\n\t\tDBG_871X(\"rtw_wx_set_auth: IW_AUTH_KEY_MGMT case \\n\");\n\t\tif(value == IW_AUTH_KEY_MGMT_WAPI_PSK)\n\t\t\tpadapter->wapiInfo.bWapiPSK = true;\n\t\telse\n\t\t\tpadapter->wapiInfo.bWapiPSK = false;\n\t\tDBG_871X(\"rtw_wx_set_auth: IW_AUTH_KEY_MGMT bwapipsk %d \\n\",padapter->wapiInfo.bWapiPSK);\n#endif\n#endif\n\t\t/*\n\t\t *  ??? does not use these parameters\n\t\t */\n\t\tbreak;\n\n\tcase IW_AUTH_TKIP_COUNTERMEASURES:\n        {\n\t    if ( param->value )\n            {  // wpa_supplicant is enabling the tkip countermeasure.\n               padapter->securitypriv.btkip_countermeasure = _TRUE; \n            }\n            else\n            {  // wpa_supplicant is disabling the tkip countermeasure.\n               padapter->securitypriv.btkip_countermeasure = _FALSE; \n            }\n\t\tbreak;\n        }\n\tcase IW_AUTH_DROP_UNENCRYPTED:\n\t\t{\n\t\t\t/* HACK:\n\t\t\t *\n\t\t\t * wpa_supplicant calls set_wpa_enabled when the driver\n\t\t\t * is loaded and unloaded, regardless of if WPA is being\n\t\t\t * used.  No other calls are made which can be used to\n\t\t\t * determine if encryption will be used or not prior to\n\t\t\t * association being expected.  If encryption is not being\n\t\t\t * used, drop_unencrypted is set to false, else true -- we\n\t\t\t * can use this to determine if the CAP_PRIVACY_ON bit should\n\t\t\t * be set.\n\t\t\t */\n\n\t\t\tif(padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption1Enabled)\n\t\t\t{\n\t\t\t\tbreak;//it means init value, or using wep, ndisencryptstatus = Ndis802_11Encryption1Enabled, \n\t\t\t\t\t\t// then it needn't reset it;\n\t\t\t}\n\t\t\t\n\t\t\tif(param->value){\n\t\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\t\t\t\tpadapter->securitypriv.dot11PrivacyAlgrthm=_NO_PRIVACY_;\n\t\t\t\tpadapter->securitypriv.dot118021XGrpPrivacy=_NO_PRIVACY_;\n\t\t\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_Open; //open system\n\t\t\t\tpadapter->securitypriv.ndisauthtype=Ndis802_11AuthModeOpen;\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\n\tcase IW_AUTH_80211_AUTH_ALG:\n\n\t\t#if defined(CONFIG_ANDROID) || 1\n\t\t/*\n\t\t *  It's the starting point of a link layer connection using wpa_supplicant\n\t\t*/\n\t\tif(check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {\n\t\t\tLeaveAllPowerSaveMode(padapter);\n\t\t\trtw_disassoc_cmd(padapter, 500, _FALSE);\n\t\t\tDBG_871X(\"%s...call rtw_indicate_disconnect\\n \",__FUNCTION__);\n\t\t\trtw_indicate_disconnect(padapter);\n\t\t\trtw_free_assoc_resources(padapter, 1);\n\t\t}\n\t\t#endif\n\n\n\t\tret = wpa_set_auth_algs(dev, (u32)param->value);\t\t\n\t\n\t\tbreak;\n\n\tcase IW_AUTH_WPA_ENABLED:\n\n\t\t//if(param->value)\n\t\t//\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; //802.1x\n\t\t//else\n\t\t//\tpadapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_Open;//open system\n\t\t\n\t\t//_disassociate(priv);\n\t\t\n\t\tbreak;\n\n\tcase IW_AUTH_RX_UNENCRYPTED_EAPOL:\n\t\t//ieee->ieee802_1x = param->value;\n\t\tbreak;\n\n\tcase IW_AUTH_PRIVACY_INVOKED:\n\t\t//ieee->privacy_invoked = param->value;\n\t\tbreak;\n\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef CONFIG_IOCTL_CFG80211\n\tcase IW_AUTH_WAPI_ENABLED:\n\t\tbreak;\n#endif\n#endif\n\n\tdefault:\n\t\treturn -EOPNOTSUPP;\n\t\t\n\t}\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_wx_set_enc_ext(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\n\tchar *alg_name;\n\tu32 param_len;\n\tstruct ieee_param *param = NULL;\n\tstruct iw_point *pencoding = &wrqu->encoding;\n \tstruct iw_encode_ext *pext = (struct iw_encode_ext *)extra;\n\tint ret=0;\n\n\tparam_len = sizeof(struct ieee_param) + pext->key_len;\n\tparam = (struct ieee_param *)rtw_malloc(param_len);\n\tif (param == NULL)\n\t\treturn -1;\n\t\n\t_rtw_memset(param, 0, param_len);\n\n\tparam->cmd = IEEE_CMD_SET_ENCRYPTION;\n\t_rtw_memset(param->sta_addr, 0xff, ETH_ALEN);\n\n\n\tswitch (pext->alg) {\n\tcase IW_ENCODE_ALG_NONE:\n\t\t//todo: remove key \n\t\t//remove = 1;\t\n\t\talg_name = \"none\";\n\t\tbreak;\n\tcase IW_ENCODE_ALG_WEP:\n\t\talg_name = \"WEP\";\n\t\tbreak;\n\tcase IW_ENCODE_ALG_TKIP:\n\t\talg_name = \"TKIP\";\n\t\tbreak;\n\tcase IW_ENCODE_ALG_CCMP:\n\t\talg_name = \"CCMP\";\n\t\tbreak;\n#ifdef CONFIG_IEEE80211W\n\tcase IW_ENCODE_ALG_AES_CMAC:\n\t\talg_name = \"BIP\";\n\t\tbreak;\n#endif //CONFIG_IEEE80211W\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef CONFIG_IOCTL_CFG80211\n\tcase IW_ENCODE_ALG_SM4:\n\t\talg_name= \"SMS4\";\n\t\t_rtw_memcpy(param->sta_addr, pext->addr.sa_data, ETH_ALEN);\n\t\tDBG_871X(\"rtw_wx_set_enc_ext: SMS4 case \\n\");\n\t\tbreak;\n#endif\n#endif\n\tdefault:\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\tstrncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);\n\n\tif (pext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)\n\t{\n\t\tparam->u.crypt.set_tx = 1;\n\t}\n\n\t/* cliW: WEP does not have group key\n\t * just not checking GROUP key setting \n\t */\n\tif ((pext->alg != IW_ENCODE_ALG_WEP) &&\n\t\t((pext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)\n#ifdef CONFIG_IEEE80211W\n\t\t|| (pext->ext_flags & IW_ENCODE_ALG_AES_CMAC)\n#endif //CONFIG_IEEE80211W\n\t))\n\t{\n\t\tparam->u.crypt.set_tx = 0;\n\t}\n\n\tparam->u.crypt.idx = (pencoding->flags&0x00FF) -1 ;\n\n\tif (pext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID)\n\t{\n#ifdef CONFIG_WAPI_SUPPORT\n#ifndef CONFIG_IOCTL_CFG80211\n\t\tif(pext->alg == IW_ENCODE_ALG_SM4)\n\t\t\t_rtw_memcpy(param->u.crypt.seq, pext->rx_seq, 16);\n\t\telse\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_WAPI_SUPPORT\n\t\t_rtw_memcpy(param->u.crypt.seq, pext->rx_seq, 8);\n\t}\n\n\tif(pext->key_len)\n\t{\n\t\tparam->u.crypt.key_len = pext->key_len;\n\t\t//_rtw_memcpy(param + 1, pext + 1, pext->key_len);\n\t\t_rtw_memcpy(param->u.crypt.key, pext + 1, pext->key_len);\n\t}\n\n\tif (pencoding->flags & IW_ENCODE_DISABLED)\n\t{\n\t\t//todo: remove key \n\t\t//remove = 1;\n\t}\n\n\tret =  wpa_set_encryption(dev, param, param_len);\n\nexit:\n\tif(param)\n\t{\n\t\trtw_mfree((u8*)param, param_len);\n\t}\n\n\treturn ret;\n}\n\n\nstatic int rtw_wx_get_nick(struct net_device *dev, \n\t\t\t     struct iw_request_info *info, \n\t\t\t     union iwreq_data *wrqu, char *extra)\n{\t\n\t//_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t //struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t //struct security_priv *psecuritypriv = &padapter->securitypriv;\n\n\tif(extra)\n\t{\n\t\twrqu->data.length = 14;\n\t\twrqu->data.flags = 1;\n\t\t_rtw_memcpy(extra, \"<WIFI@REALTEK>\", 14);\n\t}\n\n\t//rtw_signal_process(pid, SIGUSR1); //for test\n\n\t//dump debug info here\t\n/*\n\tu32 dot11AuthAlgrthm;\t\t// 802.11 auth, could be open, shared, and 8021x\n\tu32 dot11PrivacyAlgrthm;\t// This specify the privacy for shared auth. algorithm.\n\tu32 dot118021XGrpPrivacy;\t// This specify the privacy algthm. used for Grp key \n\tu32 ndisauthtype;\n\tu32 ndisencryptstatus;\n*/\n\n\t//DBG_871X(\"auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\\n\", \n\t//\t\tpsecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,\n\t//\t\tpsecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);\n\t\n\t//DBG_871X(\"enc_alg=0x%x\\n\", psecuritypriv->dot11PrivacyAlgrthm);\n\t//DBG_871X(\"auth_type=0x%x\\n\", psecuritypriv->ndisauthtype);\n\t//DBG_871X(\"enc_type=0x%x\\n\", psecuritypriv->ndisencryptstatus);\n\n#if 0\n\tDBG_871X(\"dbg(0x210)=0x%x\\n\", rtw_read32(padapter, 0x210));\n\tDBG_871X(\"dbg(0x608)=0x%x\\n\", rtw_read32(padapter, 0x608));\n\tDBG_871X(\"dbg(0x280)=0x%x\\n\", rtw_read32(padapter, 0x280));\n\tDBG_871X(\"dbg(0x284)=0x%x\\n\", rtw_read32(padapter, 0x284));\n\tDBG_871X(\"dbg(0x288)=0x%x\\n\", rtw_read32(padapter, 0x288));\n\t\n\tDBG_871X(\"dbg(0x664)=0x%x\\n\", rtw_read32(padapter, 0x664));\n\n\n\tDBG_871X(\"\\n\");\n\n\tDBG_871X(\"dbg(0x430)=0x%x\\n\", rtw_read32(padapter, 0x430));\n\tDBG_871X(\"dbg(0x438)=0x%x\\n\", rtw_read32(padapter, 0x438));\n\n\tDBG_871X(\"dbg(0x440)=0x%x\\n\", rtw_read32(padapter, 0x440));\n\t\n\tDBG_871X(\"dbg(0x458)=0x%x\\n\", rtw_read32(padapter, 0x458));\n\t\n\tDBG_871X(\"dbg(0x484)=0x%x\\n\", rtw_read32(padapter, 0x484));\n\tDBG_871X(\"dbg(0x488)=0x%x\\n\", rtw_read32(padapter, 0x488));\n\t\n\tDBG_871X(\"dbg(0x444)=0x%x\\n\", rtw_read32(padapter, 0x444));\n\tDBG_871X(\"dbg(0x448)=0x%x\\n\", rtw_read32(padapter, 0x448));\n\tDBG_871X(\"dbg(0x44c)=0x%x\\n\", rtw_read32(padapter, 0x44c));\n\tDBG_871X(\"dbg(0x450)=0x%x\\n\", rtw_read32(padapter, 0x450));\n#endif\n\t\n\treturn 0;\n\n}\n\nstatic int rtw_wx_read32(struct net_device *dev,\n                            struct iw_request_info *info,\n                            union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter;\n\tstruct iw_point *p;\n\tu16 len;\n\tu32 addr;\n\tu32 data32;\n\tu32 bytes;\n\tu8 *ptmp;\n\tint ret;\n\n\n\tret = 0;\n\tpadapter = (PADAPTER)rtw_netdev_priv(dev);\n\tp = &wrqu->data;\n\tlen = p->length;\n\tif (0 == len)\n\t\treturn -EINVAL;\n\n\tptmp = (u8*)rtw_malloc(len);\n\tif (NULL == ptmp)\n\t\treturn -ENOMEM;\n\n\tif (copy_from_user(ptmp, p->pointer, len)) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\n\tbytes = 0;\n\taddr = 0;\n\tsscanf(ptmp, \"%d,%x\", &bytes, &addr);\n\n\tswitch (bytes) {\n\t\tcase 1:\n\t\t\tdata32 = rtw_read8(padapter, addr);\n\t\t\tsprintf(extra, \"0x%02X\", data32);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tdata32 = rtw_read16(padapter, addr);\n\t\t\tsprintf(extra, \"0x%04X\", data32);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tdata32 = rtw_read32(padapter, addr);\n\t\t\tsprintf(extra, \"0x%08X\", data32);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(KERN_INFO \"%s: usage> read [bytes],[address(hex)]\\n\", __func__);\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t}\n\tDBG_871X(KERN_INFO \"%s: addr=0x%08X data=%s\\n\", __func__, addr, extra);\n\nexit:\n\trtw_mfree(ptmp, len);\n\n\treturn 0;\n}\n\nstatic int rtw_wx_write32(struct net_device *dev,\n                            struct iw_request_info *info,\n                            union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);\n\n\tu32 addr;\n\tu32 data32;\n\tu32 bytes;\n\n\n\tbytes = 0;\n\taddr = 0;\n\tdata32 = 0;\n\tsscanf(extra, \"%d,%x,%x\", &bytes, &addr, &data32);\n\n\tswitch (bytes) {\n\t\tcase 1:\n\t\t\trtw_write8(padapter, addr, (u8)data32);\n\t\t\tDBG_871X(KERN_INFO \"%s: addr=0x%08X data=0x%02X\\n\", __func__, addr, (u8)data32);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\trtw_write16(padapter, addr, (u16)data32);\n\t\t\tDBG_871X(KERN_INFO \"%s: addr=0x%08X data=0x%04X\\n\", __func__, addr, (u16)data32);\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\trtw_write32(padapter, addr, data32);\n\t\t\tDBG_871X(KERN_INFO \"%s: addr=0x%08X data=0x%08X\\n\", __func__, addr, data32);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(KERN_INFO \"%s: usage> write [bytes],[address(hex)],[data(hex)]\\n\", __func__);\n\t\t\treturn -EINVAL;\n\t}\n\n\treturn 0;\n}\n\nstatic int rtw_wx_read_rf(struct net_device *dev,\n                            struct iw_request_info *info,\n                            union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu32 path, addr, data32;\n\n\n\tpath = *(u32*)extra;\n\taddr = *((u32*)extra + 1);\n\tdata32 = rtw_hal_read_rfreg(padapter, path, addr, 0xFFFFF);\n//\tDBG_871X(\"%s: path=%d addr=0x%02x data=0x%05x\\n\", __func__, path, addr, data32);\n\t/*\n\t * IMPORTANT!!\n\t * Only when wireless private ioctl is at odd order,\n\t * \"extra\" would be copied to user space.\n\t */\n\tsprintf(extra, \"0x%05x\", data32);\n\n\treturn 0;\n}\n\nstatic int rtw_wx_write_rf(struct net_device *dev,\n                            struct iw_request_info *info,\n                            union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu32 path, addr, data32;\n\n\n\tpath = *(u32*)extra;\n\taddr = *((u32*)extra + 1);\n\tdata32 = *((u32*)extra + 2);\n//\tDBG_871X(\"%s: path=%d addr=0x%02x data=0x%05x\\n\", __func__, path, addr, data32);\n\trtw_hal_write_rfreg(padapter, path, addr, 0xFFFFF, data32);\n\n\treturn 0;\n}\n\nstatic int rtw_wx_priv_null(struct net_device *dev, struct iw_request_info *a,\n\t\t union iwreq_data *wrqu, char *b)\n{\n\treturn -1;\n}\n\nstatic int dummy(struct net_device *dev, struct iw_request_info *a,\n\t\t union iwreq_data *wrqu, char *b)\n{\n\t//_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\t//struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\n\t//DBG_871X(\"cmd_code=%x, fwstate=0x%x\\n\", a->cmd, get_fwstate(pmlmepriv));\n\t\n\treturn -1;\n\t\n}\n\nstatic int rtw_wx_set_channel_plan(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tu8 channel_plan_req = (u8) (*((int *)wrqu));\n\n\tif (_SUCCESS != rtw_set_channel_plan(padapter, channel_plan_req))\n\t\treturn -EPERM;\n\n\treturn 0;\n}\n\nstatic int rtw_wx_set_mtk_wps_probe_ie(struct net_device *dev,\n\t\tstruct iw_request_info *a,\n\t\tunion iwreq_data *wrqu, char *b)\n{\n#ifdef CONFIG_PLATFORM_MT53XX\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_,\n\t\t (\"WLAN IOCTL: cmd_code=%x, fwstate=0x%x\\n\",\n\t\t  a->cmd, get_fwstate(pmlmepriv)));\n#endif\n\treturn 0;\n}\n\nstatic int rtw_wx_get_sensitivity(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *buf)\n{\n#ifdef CONFIG_PLATFORM_MT53XX\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\t//\tModified by Albert 20110914\n\t//\tThis is in dbm format for MTK platform.\n\twrqu->qual.level = padapter->recvpriv.rssi;\n\tDBG_871X(\" level = %u\\n\",  wrqu->qual.level );\n#endif\n\treturn 0;\n}\n\nstatic int rtw_wx_set_mtk_wps_ie(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n#ifdef CONFIG_PLATFORM_MT53XX\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\treturn rtw_set_wpa_ie(padapter, wrqu->data.pointer, wrqu->data.length);\n#else\n\treturn 0;\n#endif\n}\n\n/*\ntypedef int (*iw_handler)(struct net_device *dev, struct iw_request_info *info,\n\t\t\t  union iwreq_data *wrqu, char *extra);\n*/\n/*\n *\tFor all data larger than 16 octets, we need to use a\n *\tpointer to memory allocated in user space.\n */\nstatic  int rtw_drvext_hdl(struct net_device *dev, struct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\n #if 0\nstruct\tiw_point\n{\n  void __user\t*pointer;\t/* Pointer to the data  (in user space) */\n  __u16\t\tlength;\t\t/* number of fields or size in bytes */\n  __u16\t\tflags;\t\t/* Optional params */\n};\n #endif\n\n#ifdef CONFIG_DRVEXT_MODULE\n\tu8 res;\n\tstruct drvext_handler *phandler;\t\n\tstruct drvext_oidparam *poidparam;\t\t\n\tint ret;\n\tu16 len;\n\tu8 *pparmbuf, bset;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_point *p = &wrqu->data;\n\n\tif( (!p->length) || (!p->pointer)){\n\t\tret = -EINVAL;\n\t\tgoto _rtw_drvext_hdl_exit;\n\t}\n\t\n\t\n\tbset = (u8)(p->flags&0xFFFF);\n\tlen = p->length;\n\tpparmbuf = (u8*)rtw_malloc(len);\n\tif (pparmbuf == NULL){\n\t\tret = -ENOMEM;\n\t\tgoto _rtw_drvext_hdl_exit;\n\t}\n\t\n\tif(bset)//set info\n\t{\n\t\tif (copy_from_user(pparmbuf, p->pointer,len)) {\n\t\t\trtw_mfree(pparmbuf, len);\n\t\t\tret = -EFAULT;\n\t\t\tgoto _rtw_drvext_hdl_exit;\n\t\t}\t\t\n\t}\n\telse//query info\n\t{\n\t\n\t}\n\n\t\n\t//\n\tpoidparam = (struct drvext_oidparam *)pparmbuf;\t\n\t\n\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,(\"drvext set oid subcode [%d], len[%d], InformationBufferLength[%d]\\r\\n\",\n        \t\t\t\t\t poidparam->subcode, poidparam->len, len));\n\n\n\t//check subcode\t\n\tif ( poidparam->subcode >= MAX_DRVEXT_HANDLERS)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"no matching drvext handlers\\r\\n\"));\t\t\n\t\tret = -EINVAL;\n\t\tgoto _rtw_drvext_hdl_exit;\n\t}\n\n\n\tif ( poidparam->subcode >= MAX_DRVEXT_OID_SUBCODES)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"no matching drvext subcodes\\r\\n\"));\t\t\n\t\tret = -EINVAL;\n\t\tgoto _rtw_drvext_hdl_exit;\n\t}\n\n\n\tphandler = drvextoidhandlers + poidparam->subcode;\n\n\tif (poidparam->len != phandler->parmsize)\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(\"no matching drvext param size %d vs %d\\r\\n\",\t\t\t\n\t\t\t\t\t\tpoidparam->len , phandler->parmsize));\t\t\n\t\tret = -EINVAL;\t\t\n\t\tgoto _rtw_drvext_hdl_exit;\n\t}\n\n\n\tres = phandler->handler(&padapter->drvextpriv, bset, poidparam->data);\n\n\tif(res==0)\n\t{\n\t\tret = 0;\n\t\t\t\n\t\tif (bset == 0x00) {//query info\n\t\t\t//_rtw_memcpy(p->pointer, pparmbuf, len);\n\t\t\tif (copy_to_user(p->pointer, pparmbuf, len))\n\t\t\t\tret = -EFAULT;\n\t\t}\t\t\n\t}\t\t\n\telse\n\t\tret = -EFAULT;\n\n\t\n_rtw_drvext_hdl_exit:\t\n\t\n\treturn ret;\t\n\t\n#endif\n\n\treturn 0;\n\n}\n\nstatic void rtw_dbg_mode_hdl(_adapter *padapter, u32 id, u8 *pdata, u32 len)\n{\n\tpRW_Reg \tRegRWStruct;\n\tstruct rf_reg_param *prfreg;\n\tu8 path;\n\tu8 offset;\n\tu32 value;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tswitch(id)\n\t{\n\t\tcase GEN_MP_IOCTL_SUBCODE(MP_START):\n\t\t\tDBG_871X(\"871x_driver is only for normal mode, can't enter mp mode\\n\");\n\t\t\tbreak;\n\t\tcase GEN_MP_IOCTL_SUBCODE(READ_REG):\n\t\t\tRegRWStruct = (pRW_Reg)pdata;\n\t\t\tswitch (RegRWStruct->width)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tRegRWStruct->value = rtw_read8(padapter, RegRWStruct->offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tRegRWStruct->value = rtw_read16(padapter, RegRWStruct->offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tRegRWStruct->value = rtw_read32(padapter, RegRWStruct->offset);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\t\tbreak;\n\t\tcase GEN_MP_IOCTL_SUBCODE(WRITE_REG):\n\t\t\tRegRWStruct = (pRW_Reg)pdata;\n\t\t\tswitch (RegRWStruct->width)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\trtw_write8(padapter, RegRWStruct->offset, (u8)RegRWStruct->value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\trtw_write16(padapter, RegRWStruct->offset, (u16)RegRWStruct->value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\trtw_write32(padapter, RegRWStruct->offset, (u32)RegRWStruct->value);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\t\t\t\t\t\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\t\n\t\t\tbreak;\n\t\tcase GEN_MP_IOCTL_SUBCODE(READ_RF_REG):\n\n\t\t\tprfreg = (struct rf_reg_param *)pdata;\n\n\t\t\tpath = (u8)prfreg->path;\t\t\n\t\t\toffset = (u8)prfreg->offset;\t\n\n\t\t\tvalue = rtw_hal_read_rfreg(padapter, path, offset, 0xffffffff);\n\n\t\t\tprfreg->value = value;\n\n\t\t\tbreak;\t\t\t\n\t\tcase GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG):\n\n\t\t\tprfreg = (struct rf_reg_param *)pdata;\n\n\t\t\tpath = (u8)prfreg->path;\n\t\t\toffset = (u8)prfreg->offset;\t\n\t\t\tvalue = prfreg->value;\n\n\t\t\trtw_hal_write_rfreg(padapter, path, offset, 0xffffffff, value);\n\t\t\t\n\t\t\tbreak;\t\t\t\n                case GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO):\n\t\t\tDBG_871X(\"==> trigger gpio 0\\n\");\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_TRIGGER_GPIO_0, 0);\n\t\t\tbreak;\t\n#ifdef CONFIG_BT_COEXIST\n\t\tcase GEN_MP_IOCTL_SUBCODE(SET_DM_BT):\t\t\t\n\t\t\tDBG_871X(\"==> set dm_bt_coexist:%x\\n\",*(u8 *)pdata);\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BT_SET_COEXIST, pdata);\n\t\t\tbreak;\n\t\tcase GEN_MP_IOCTL_SUBCODE(DEL_BA):\n\t\t\tDBG_871X(\"==> delete ba:%x\\n\",*(u8 *)pdata);\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_BT_ISSUE_DELBA, pdata);\n\t\t\tbreak;\n#endif\n#ifdef DBG_CONFIG_ERROR_DETECT\n\t\tcase GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS):\t\t\t\t\t\t\t\n\t\t\t*pdata = rtw_hal_sreset_get_wifi_status(padapter);                   \n\t\t\tbreak;\n#endif\n\t\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\t\n}\n\nstatic int rtw_mp_ioctl_hdl(struct net_device *dev, struct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\tu32 BytesRead, BytesWritten, BytesNeeded;\n\tstruct oid_par_priv\toid_par;\n\tstruct mp_ioctl_handler\t*phandler;\n\tstruct mp_ioctl_param\t*poidparam;\n\tuint status=0;\n\tu16 len;\n\tu8 *pparmbuf = NULL, bset;\n\tPADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);\n\tstruct iw_point *p = &wrqu->data;\n\n\t//DBG_871X(\"+rtw_mp_ioctl_hdl\\n\");\n\n\t//mutex_lock(&ioctl_mutex);\n\n\tif ((!p->length) || (!p->pointer)) {\n\t\tret = -EINVAL;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n\tpparmbuf = NULL;\n\tbset = (u8)(p->flags & 0xFFFF);\n\tlen = p->length;\n\tpparmbuf = (u8*)rtw_malloc(len);\n\tif (pparmbuf == NULL){\n\t\tret = -ENOMEM;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n\tif (copy_from_user(pparmbuf, p->pointer, len)) {\n\t\tret = -EFAULT;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n\tpoidparam = (struct mp_ioctl_param *)pparmbuf;\n\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,\n\t\t (\"rtw_mp_ioctl_hdl: subcode [%d], len[%d], buffer_len[%d]\\r\\n\",\n\t\t  poidparam->subcode, poidparam->len, len));\n\n\tif (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) {\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_, (\"no matching drvext subcodes\\r\\n\"));\n\t\tret = -EINVAL;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n\t//DBG_871X(\"%s: %d\\n\", __func__, poidparam->subcode);\n#ifdef CONFIG_MP_INCLUDED \nif (padapter->registrypriv.mp_mode == 1)\n{\t\n\tphandler = mp_ioctl_hdl + poidparam->subcode;\n\n\tif ((phandler->paramsize != 0) && (poidparam->len < phandler->paramsize))\n\t{\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,\n\t\t\t (\"no matching drvext param size %d vs %d\\r\\n\",\n\t\t\t  poidparam->len, phandler->paramsize));\n\t\tret = -EINVAL;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n\tif (phandler->handler)\n\t{\n\t\toid_par.adapter_context = padapter;\n\t\toid_par.oid = phandler->oid;\n\t\toid_par.information_buf = poidparam->data;\n\t\toid_par.information_buf_len = poidparam->len;\n\t\toid_par.dbg = 0;\n\n\t\tBytesWritten = 0;\n\t\tBytesNeeded = 0;\n\n\t\tif (bset) {\n\t\t\toid_par.bytes_rw = &BytesRead;\n\t\t\toid_par.bytes_needed = &BytesNeeded;\n\t\t\toid_par.type_of_oid = SET_OID;\n\t\t} else {\n\t\t\toid_par.bytes_rw = &BytesWritten;\n\t\t\toid_par.bytes_needed = &BytesNeeded;\n\t\t\toid_par.type_of_oid = QUERY_OID;\n\t\t}\n\n\t\tstatus = phandler->handler(&oid_par);\n\n\t\t//todo:check status, BytesNeeded, etc.\n\t}\n\telse {\n\t\tDBG_871X(\"rtw_mp_ioctl_hdl(): err!, subcode=%d, oid=%d, handler=%p\\n\", \n\t\t\tpoidparam->subcode, phandler->oid, phandler->handler);\n\t\tret = -EFAULT;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n}\nelse\n#endif\n{\n\trtw_dbg_mode_hdl(padapter, poidparam->subcode, poidparam->data, poidparam->len);\n}\n\n\tif (bset == 0x00) {//query info\n\t\tif (copy_to_user(p->pointer, pparmbuf, len))\n\t\t\tret = -EFAULT;\n\t}\n\n\tif (status) {\n\t\tret = -EFAULT;\n\t\tgoto _rtw_mp_ioctl_hdl_exit;\n\t}\n\n_rtw_mp_ioctl_hdl_exit:\n\n\tif (pparmbuf)\n\t\trtw_mfree(pparmbuf, len);\n\n\t//mutex_unlock(&ioctl_mutex);\n\n\treturn ret;\n}\n\nstatic int rtw_get_ap_info(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint bssid_match, ret = 0;\n\tu32 cnt=0, wpa_ielen;\n\t_irqL\tirqL;\n\t_list\t*plist, *phead;\n\tunsigned char *pbuf;\n\tu8 bssid[ETH_ALEN];\n\tchar data[32];\n\tstruct wlan_network *pnetwork = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\t_queue *queue = &(pmlmepriv->scanned_queue);\n\tstruct iw_point *pdata = &wrqu->data;\t\n\n\tDBG_871X(\"+rtw_get_aplist_info\\n\");\n\n\tif (rtw_is_drv_stopped(padapter) || (pdata == NULL)) {\n\t\tret= -EINVAL;\n\t\tgoto exit;\n\t}\t\t\n  \n \twhile((check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))) == _TRUE)\n\t{\t\n\t\trtw_msleep_os(30);\n\t\tcnt++;\n\t\tif(cnt > 100)\n\t\t\tbreak;\n\t}\n\t\n\n\t//pdata->length = 0;//?\t\n\tpdata->flags = 0;\n\tif(pdata->length>=32)\n\t{\n\t\tif(copy_from_user(data, pdata->pointer, 32))\n\t\t{\n\t\t\tret= -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t}\t\n\telse\n\t{\n\t\tret= -EINVAL;\n\t\tgoto exit;\n\t}\t\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//if(hwaddr_aton_i(pdata->pointer, bssid)) \n\t\tif(hwaddr_aton_i(data, bssid)) \n\t\t{\t\t\t\n\t\t\tDBG_871X(\"Invalid BSSID '%s'.\\n\", (u8*)data);\n\t\t\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\t\t\treturn -EINVAL;\n\t\t}\t\t\n\t\t\n\t\n\t\tif(_rtw_memcmp(bssid, pnetwork->network.MacAddress, ETH_ALEN) == _TRUE)//BSSID match, then check if supporting wpa/wpa2\n\t\t{\n\t\t\tDBG_871X(\"BSSID:\" MAC_FMT \"\\n\", MAC_ARG(bssid));\n\t\t\t\n\t\t\tpbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);\t\t\t\t\n\t\t\tif(pbuf && (wpa_ielen>0))\n\t\t\t{\n\t\t\t\tpdata->flags = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tpbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength-12);\n\t\t\tif(pbuf && (wpa_ielen>0))\n\t\t\t{\n\t\t\t\tpdata->flags = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tplist = get_next(plist);\t\t\n\t\n\t}        \n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif(pdata->length>=34)\n\t{\n\t\tif(copy_to_user((u8*)pdata->pointer+32, (u8*)&pdata->flags, 1))\n\t\t{\n\t\t\tret= -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t}\t\n\t\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_set_pid(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = rtw_netdev_priv(dev);\t\n\tint *pdata = (int *)wrqu;\n\tint selector;\n\n\tif (rtw_is_drv_stopped(padapter) || (pdata == NULL)) {\n\t\tret= -EINVAL;\n\t\tgoto exit;\n\t}\t\t\n  \n\tselector = *pdata;\n\tif(selector < 3 && selector >=0) {\n\t\tpadapter->pid[selector] = *(pdata+1);\n\t\t#ifdef CONFIG_GLOBAL_UI_PID\n\t\tui_pid[selector] = *(pdata+1);\n\t\t#endif\n\t\tDBG_871X(\"%s set pid[%d]=%d\\n\", __FUNCTION__, selector ,padapter->pid[selector]);\n\t}\n\telse\n\t\tDBG_871X(\"%s selector %d error\\n\", __FUNCTION__, selector);\n\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_wps_start(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tu32   u32wps_start = 0;\n        unsigned int uintRet = 0;\n\n\tif (RTW_CANNOT_RUN(padapter) || (NULL == pdata)) {\n\t\tret= -EINVAL;\n\t\tgoto exit;\n\t}\t\t\n\n\tuintRet = copy_from_user( ( void* ) &u32wps_start, pdata->pointer, 4 );\n\tif ( u32wps_start == 0 )\n\t{\n\t\tu32wps_start = *extra;\n\t}\n\n\tDBG_871X( \"[%s] wps_start = %d\\n\", __FUNCTION__, u32wps_start );\n\n\tif ( u32wps_start == 1 ) // WPS Start\n\t{\n\t\trtw_led_control(padapter, LED_CTL_START_WPS);\n\t}\n\telse if ( u32wps_start == 2 ) // WPS Stop because of wps success\n\t{\n\t\trtw_led_control(padapter, LED_CTL_STOP_WPS);\n\t}\n\telse if ( u32wps_start == 3 ) // WPS Stop because of wps fail\n\t{\n\t\trtw_led_control(padapter, LED_CTL_STOP_WPS_FAIL);\n\t}\n\n#ifdef CONFIG_INTEL_WIDI\n\tprocess_intel_widi_wps_status(padapter, u32wps_start);\n#endif //CONFIG_INTEL_WIDI\n\t\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\n#ifdef CONFIG_P2P\nstatic int rtw_wext_p2p_enable(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tenum P2P_ROLE init_role = P2P_ROLE_DISABLE;\n\n\tif(*extra == '0' )\n\t\tinit_role = P2P_ROLE_DISABLE;\n\telse if(*extra == '1')\n\t\tinit_role = P2P_ROLE_DEVICE;\n\telse if(*extra == '2')\n\t\tinit_role = P2P_ROLE_CLIENT;\n\telse if(*extra == '3')\n\t\tinit_role = P2P_ROLE_GO;\n\n\tif(_FAIL == rtw_p2p_enable(padapter, init_role))\n\t{\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\n\t//set channel/bandwidth\n\tif(init_role != P2P_ROLE_DISABLE) \n\t{\t\n\t\tu8 channel, ch_offset;\n\t\tu16 bwmode;\n\n\t\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN))\n\t\t{\n\t\t\t//\tStay at the listen state and wait for discovery.\n\t\t\tchannel = pwdinfo->listen_channel;\n\t\t\tpwdinfo->operating_channel = pwdinfo->listen_channel;\n\t\t\tch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\t\t\tbwmode = CHANNEL_WIDTH_20;\n\t\t}\n#ifdef CONFIG_CONCURRENT_MODE\n\t\telse if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\n\t\t{\n\t\t\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\t\t\t//struct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\t\t\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\t\t\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n\t\t\t\n\t\t\t_set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_interval );\n\t\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t\t{\n\t\t\t\tpwdinfo->operating_channel = pbuddy_mlmeext->cur_channel;\n\t\t\t\t//\tHow about the ch_offset and bwmode ??\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpwdinfo->operating_channel = pwdinfo->listen_channel;\n\t\t\t}\n\n\t\t\tchannel = pbuddy_mlmeext->cur_channel;\n\t\t\tch_offset = pbuddy_mlmeext->cur_ch_offset;\n\t\t\tbwmode = pbuddy_mlmeext->cur_bwmode;\n\t\t}\n#endif\n\t\telse\n\t\t{\n\t\t\tpwdinfo->operating_channel = pmlmeext->cur_channel;\n\t\t\n\t\t\tchannel = pwdinfo->operating_channel;\n\t\t\tch_offset = pmlmeext->cur_ch_offset;\n\t\t\tbwmode = pmlmeext->cur_bwmode;\t\t\t\t\t\t\n\t\t}\n\n\t\tset_channel_bwmode(padapter, channel, ch_offset, bwmode);\n\t}\n\nexit:\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_go_nego_ssid(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\tDBG_871X( \"[%s] ssid = %s, len = %zu\\n\", __FUNCTION__, extra, strlen( extra ) );\n\t_rtw_memcpy( pwdinfo->nego_ssid, extra, strlen( extra ) );\n\tpwdinfo->nego_ssidlen = strlen( extra );\n\t\n\treturn ret;\n\t\t\n}\n\n\nstatic int rtw_p2p_set_intent(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint \t\t\t\t\t\t\tret = 0;\n\t_adapter \t\t\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info \t\t\t*pwdinfo= &(padapter->wdinfo);\n\tu8\t\t\t\t\t\t\tintent = pwdinfo->intent;\n\n\textra[ wrqu->data.length ] = 0x00;\n\n\tintent = rtw_atoi( extra );\n\n\tif ( intent <= 15 )\n\t{\n\t\tpwdinfo->intent= intent;\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t}\n\t\n\tDBG_871X( \"[%s] intent = %d\\n\", __FUNCTION__, intent);\n\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_listen_ch(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\tu8\tlisten_ch = pwdinfo->listen_channel;\t//\tListen channel number\n\n\textra[ wrqu->data.length ] = 0x00;\n\tlisten_ch = rtw_atoi( extra );\n\n\tif ( ( listen_ch == 1 ) || ( listen_ch == 6 ) || ( listen_ch == 11 ) )\n\t{\n\t\tpwdinfo->listen_channel = listen_ch;\n\t\tset_channel_bwmode(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t}\n\t\n\tDBG_871X( \"[%s] listen_ch = %d\\n\", __FUNCTION__, pwdinfo->listen_channel );\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_op_ch(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n//\tCommented by Albert 20110524\n//\tThis function is used to set the operating channel if the driver will become the group owner\n\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\tu8\top_ch = pwdinfo->operating_channel;\t//\tOperating channel number\n\n\textra[ wrqu->data.length ] = 0x00;\n\n\top_ch = ( u8 ) rtw_atoi( extra );\n\tif ( op_ch > 0 )\n\t{\n\t\tpwdinfo->operating_channel = op_ch;\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t}\n\t\n\tDBG_871X( \"[%s] op_ch = %d\\n\", __FUNCTION__, pwdinfo->operating_channel );\n\t\n\treturn ret;\n\n}\n\n\nstatic int rtw_p2p_profilefound(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\t//\tComment by Albert 2010/10/13\n\t//\tInput data format:\n\t//\tEx:  0\n\t//\tEx:  1XX:XX:XX:XX:XX:XXYYSSID\n\t//\t0 => Reflush the profile record list.\n\t//\t1 => Add the profile list\n\t//\tXX:XX:XX:XX:XX:XX => peer's MAC Address ( ex: 00:E0:4C:00:00:01 )\n\t//\tYY => SSID Length\n\t//\tSSID => SSID for persistence group\n\n\tDBG_871X( \"[%s] In value = %s, len = %d \\n\", __FUNCTION__, extra, wrqu->data.length -1);\n\n\t\n\t//\tThe upper application should pass the SSID to driver by using this rtw_p2p_profilefound function.\n\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\tif ( extra[ 0 ] == '0' )\n\t\t{\n\t\t\t//\tRemove all the profile information of wifidirect_info structure.\n\t\t\t_rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );\n\t\t\tpwdinfo->profileindex = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ( pwdinfo->profileindex >= P2P_MAX_PERSISTENT_GROUP_NUM )\n\t\t{\n\t\t\t\tret = -1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t\tint jj, kk;\n\t\t\t\t\n\t\t\t\t//\tAdd this profile information into pwdinfo->profileinfo\n\t\t\t\t//\tEx:  1XX:XX:XX:XX:XX:XXYYSSID\n\t\t\t\tfor( jj = 0, kk = 1; jj < ETH_ALEN; jj++, kk += 3 )\n\t\t\t\t{\n\t\t\t\t\tpwdinfo->profileinfo[ pwdinfo->profileindex ].peermac[ jj ] = key_2char2num(extra[ kk ], extra[ kk+ 1 ]);\n\t\t\t\t}\n\n\t\t\t\t//pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen = ( extra[18] - '0' ) * 10 + ( extra[ 19 ] - '0' );\n\t\t\t\t//_rtw_memcpy( pwdinfo->profileinfo[ pwdinfo->profileindex ].ssid, &extra[ 20 ], pwdinfo->profileinfo[ pwdinfo->profileindex ].ssidlen );\n\t\t\t\tpwdinfo->profileindex++;\n\t\t\t}\n\t\t}\n\t}\t\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_setDN(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\t_rtw_memset( pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN );\n\t_rtw_memcpy( pwdinfo->device_name, extra, wrqu->data.length - 1 );\n\tpwdinfo->device_name_len = wrqu->data.length - 1;\n\n\treturn ret;\n\t\t\n}\n\n\nstatic int rtw_p2p_get_status(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct wifidirect_info\t*pbuddy_wdinfo = &pbuddy_adapter->wdinfo;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\t\n#endif\n\t\n\tif ( padapter->bShowGetP2PState )\n\t{\n\t\tDBG_871X( \"[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\\n\", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),\n\t\t\t\tpwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],\n\t\t\t\tpwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);\n\t}\n\n\t//\tCommented by Albert 2010/10/12\n\t//\tBecause of the output size limitation, I had removed the \"Role\" information.\n\t//\tAbout the \"Role\" information, we will use the new private IOCTL to get the \"Role\" information.\n\tsprintf( extra, \"\\n\\nStatus=%.2d\\n\", rtw_p2p_state(pwdinfo) );\n\twrqu->data.length = strlen( extra );\n\n\treturn ret;\n\t\t\n}\n\n//\tCommented by Albert 20110520\n//\tThis function will return the config method description \n//\tThis config method description will show us which config method the remote P2P device is intented to use\n//\tby sending the provisioning discovery request frame.\n\nstatic int rtw_p2p_get_req_cm(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tsprintf( extra, \"\\n\\nCM=%s\\n\", pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req );\n\twrqu->data.length = strlen( extra );\n\treturn ret;\n\t\t\n}\n\n\nstatic int rtw_p2p_get_role(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\t\n\tDBG_871X( \"[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\\n\", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);\n\n\tsprintf( extra, \"\\n\\nRole=%.2d\\n\", rtw_p2p_role(pwdinfo) );\n\twrqu->data.length = strlen( extra );\n\treturn ret;\n\t\t\n}\n\n\nstatic int rtw_p2p_get_peer_ifaddr(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\n\tDBG_871X( \"[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\\n\", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);\n\n\tsprintf( extra, \"\\nMAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 0 ], pwdinfo->p2p_peer_interface_addr[ 1 ], pwdinfo->p2p_peer_interface_addr[ 2 ],\n\t\t\tpwdinfo->p2p_peer_interface_addr[ 3 ], pwdinfo->p2p_peer_interface_addr[ 4 ], pwdinfo->p2p_peer_interface_addr[ 5 ]);\n\twrqu->data.length = strlen( extra );\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_peer_devaddr(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tDBG_871X( \"[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\\n\", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),\n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 0 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 1 ], \n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 2 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 3 ],\n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 4 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 5 ]);\n\tsprintf( extra, \"\\n%.2X%.2X%.2X%.2X%.2X%.2X\",\n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 0 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 1 ], \n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 2 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 3 ],\n\t\t\tpwdinfo->rx_prov_disc_info.peerDevAddr[ 4 ], pwdinfo->rx_prov_disc_info.peerDevAddr[ 5 ]);\n\twrqu->data.length = strlen( extra );\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_peer_devaddr_by_invitation(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tDBG_871X( \"[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\\n\", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),\n\t\t\tpwdinfo->p2p_peer_device_addr[ 0 ], pwdinfo->p2p_peer_device_addr[ 1 ], \n\t\t\tpwdinfo->p2p_peer_device_addr[ 2 ], pwdinfo->p2p_peer_device_addr[ 3 ],\n\t\t\tpwdinfo->p2p_peer_device_addr[ 4 ], pwdinfo->p2p_peer_device_addr[ 5 ]);\n\tsprintf( extra, \"\\nMAC %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\n\t\t\tpwdinfo->p2p_peer_device_addr[ 0 ], pwdinfo->p2p_peer_device_addr[ 1 ], \n\t\t\tpwdinfo->p2p_peer_device_addr[ 2 ], pwdinfo->p2p_peer_device_addr[ 3 ],\n\t\t\tpwdinfo->p2p_peer_device_addr[ 4 ], pwdinfo->p2p_peer_device_addr[ 5 ]);\n\twrqu->data.length = strlen( extra );\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_groupid(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tsprintf( extra, \"\\n%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s\",\n\t\t\tpwdinfo->groupid_info.go_device_addr[ 0 ], pwdinfo->groupid_info.go_device_addr[ 1 ], \n\t\t\tpwdinfo->groupid_info.go_device_addr[ 2 ], pwdinfo->groupid_info.go_device_addr[ 3 ],\n\t\t\tpwdinfo->groupid_info.go_device_addr[ 4 ], pwdinfo->groupid_info.go_device_addr[ 5 ],\n\t\t\tpwdinfo->groupid_info.ssid);\n\twrqu->data.length = strlen( extra );\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_op_ch(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\t\n\tDBG_871X( \"[%s] Op_ch = %02x\\n\", __FUNCTION__, pwdinfo->operating_channel);\n\t\n\tsprintf( extra, \"\\n\\nOp_ch=%.2d\\n\", pwdinfo->operating_channel );\n\twrqu->data.length = strlen( extra );\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_wps_configmethod(struct net_device *dev,\n\t\t\t\t\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra, char *subcmd)\n{ \n\t\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 peerMAC[ETH_ALEN] = { 0x00 };\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_irqL irqL;\n\t_list * plist,*phead;\n\t_queue *queue = &(pmlmepriv->scanned_queue);\n\tstruct wlan_network *pnetwork = NULL;\n\tu8 blnMatch = 0;\n\tu16\tattr_content = 0;\n\tuint attr_contentlen = 0;\n\tu8\tattr_content_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };\n\n\t//\tCommented by Albert 20110727\n\t//\tThe input data is the MAC address which the application wants to know its WPS config method.\n\t//\tAfter knowing its WPS config method, the application can decide the config method for provisioning discovery.\n\t//\tFormat: iwpriv wlanx p2p_get_wpsCM 00:E0:4C:00:00:05\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, subcmd);\n\n\tmacstr2num(peerMAC, subcmd);\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE) break;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))\n\t\t{\n\t\t\tu8 *wpsie;\n\t\t\tuint\twpsie_len = 0;\n\n\t\t\t//\tThe mac address is matched.\n\n\t\t\tif ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) )\n\t\t\t{\n\t\t\t\trtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_CONF_METHOD, (u8 *)&attr_content, &attr_contentlen);\n\t\t\t\tif (attr_contentlen)\n\t\t\t\t{\n\t\t\t\t\tattr_content = be16_to_cpu(attr_content);\n\t\t\t\t\tsprintf(attr_content_str, \"\\n\\nM=%.4d\", attr_content);\n\t\t\t\t\tblnMatch = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tplist = get_next(plist);\n\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif (!blnMatch)\n\t{\n\t\tsprintf(attr_content_str, \"\\n\\nM=0000\");\n\t}\n\n\twrqu->data.length = strlen(attr_content_str);\n\t_rtw_memcpy(extra, attr_content_str, wrqu->data.length);\n\n\treturn ret; \n\t\t\n}\n\n#ifdef CONFIG_WFD\nstatic int rtw_p2p_get_peer_wfd_port(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tDBG_871X( \"[%s] p2p_state = %d\\n\", __FUNCTION__, rtw_p2p_state(pwdinfo) );\n\n\tsprintf( extra, \"\\n\\nPort=%d\\n\", pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\tDBG_871X( \"[%s] remote port = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_rtsp_ctrlport );\n\t\n\twrqu->data.length = strlen( extra );\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_peer_wfd_preferred_connection(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tsprintf( extra, \"\\n\\nwfd_pc=%d\\n\", pwdinfo->wfd_info->wfd_pc );\n\tDBG_871X( \"[%s] wfd_pc = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->wfd_pc );\n\n\twrqu->data.length = strlen( extra );\n\tpwdinfo->wfd_info->wfd_pc = _FALSE;\t//\tReset the WFD preferred connection to P2P\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get_peer_wfd_session_available(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\n\tsprintf( extra, \"\\n\\nwfd_sa=%d\\n\", pwdinfo->wfd_info->peer_session_avail );\n\tDBG_871X( \"[%s] wfd_sa = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->peer_session_avail );\n\n\twrqu->data.length = strlen( extra );\n\tpwdinfo->wfd_info->peer_session_avail = _TRUE;\t//\tReset the WFD session available\n\treturn ret;\n\t\t\n}\n\n#endif // CONFIG_WFD\n\nstatic int rtw_p2p_get_go_device_address(struct net_device *dev,\n\t\t\t\t\t\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t\t\t\t\t\t union iwreq_data *wrqu, char *extra, char *subcmd)\n{\n\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 peerMAC[ETH_ALEN] = { 0x00 };\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_irqL irqL;\n\t_list *plist, *phead;\n\t_queue *queue\t= &(pmlmepriv->scanned_queue);\n\tstruct wlan_network *pnetwork = NULL;\n\tu8 blnMatch = 0;\n\tu8 *p2pie;\n\tuint p2pielen = 0, attr_contentlen = 0;\n\tu8 attr_content[100] = { 0x00 };\n\tu8 go_devadd_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };\n\n\t//\tCommented by Albert 20121209\n\t//\tThe input data is the GO's interface address which the application wants to know its device address.\n\t//\tFormat: iwpriv wlanx p2p_get2 go_devadd=00:E0:4C:00:00:05\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, subcmd);\n\n\tmacstr2num(peerMAC, subcmd);\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE) break;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))\n\t\t{\n\t\t\t//\tCommented by Albert 2011/05/18\n\t\t\t//\tMatch the device address located in the P2P IE\n\t\t\t//\tThis is for the case that the P2P device address is not the same as the P2P interface address.\n\n\t\t\tif ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))\n\t\t\t{\n\t\t\t\twhile (p2pie)\n\t\t\t\t{\n\t\t\t\t\t//\tThe P2P Device ID attribute is included in the Beacon frame.\n\t\t\t\t\t//\tThe P2P Device Info attribute is included in the probe response frame.\n\n\t\t\t\t\t_rtw_memset(attr_content, 0x00, 100);\n\t\t\t\t\tif (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen))\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tHandle the P2P Device ID attribute of Beacon first\n\t\t\t\t\t\tblnMatch = 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t} else if (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen))\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tHandle the P2P Device Info attribute of probe response\n\t\t\t\t\t\tblnMatch = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t//Get the next P2P IE\n\t\t\t\t\tp2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tplist = get_next(plist);\n\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif (!blnMatch)\n\t{\n\t\tsprintf(go_devadd_str, \"\\n\\ndev_add=NULL\");\n\t} else\n\t{\n\t\tsprintf(go_devadd_str, \"\\n\\ndev_add=%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\n\t\t\t\tattr_content[0], attr_content[1], attr_content[2], attr_content[3], attr_content[4], attr_content[5]);\n\t}\n\n\twrqu->data.length = strlen(go_devadd_str);\n\t_rtw_memcpy(extra, go_devadd_str, wrqu->data.length);\n\n\treturn ret; \n\t\t\n}\n\nstatic int rtw_p2p_get_device_type(struct net_device *dev,\n\t\t\t\t\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t\t\t\t\t   union iwreq_data *wrqu, char *extra, char *subcmd)\n{ \n\t\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 peerMAC[ETH_ALEN] = { 0x00 };\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_irqL irqL;\n\t_list *plist, *phead;\n\t_queue *queue = &(pmlmepriv->scanned_queue);\n\tstruct wlan_network *pnetwork = NULL;\n\tu8 blnMatch = 0;\n\tu8 dev_type[8] = { 0x00 };\n\tuint dev_type_len = 0;\n\tu8 dev_type_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };    // +9 is for the str \"dev_type=\", we have to clear it at wrqu->data.pointer\n\n\t//\tCommented by Albert 20121209\n\t//\tThe input data is the MAC address which the application wants to know its device type.\n\t//\tSuch user interface could know the device type.\n\t//\tFormat: iwpriv wlanx p2p_get2 dev_type=00:E0:4C:00:00:05\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, subcmd);\n\n\tmacstr2num(peerMAC, subcmd);\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE) break;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))\n\t\t{\n\t\t\tu8 *wpsie;\n\t\t\tuint\twpsie_len = 0;\n\n\t\t\t//\tThe mac address is matched.\n\n\t\t\tif ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) )\n\t\t\t{\n\t\t\t\trtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_PRIMARY_DEV_TYPE, dev_type, &dev_type_len);\n\t\t\t\tif (dev_type_len)\n\t\t\t\t{\n\t\t\t\t\tu16\ttype = 0;\n\n\t\t\t\t\t_rtw_memcpy(&type, dev_type, 2);\n\t\t\t\t\ttype = be16_to_cpu(type);\n\t\t\t\t\tsprintf(dev_type_str, \"\\n\\nN=%.2d\", type);\n\t\t\t\t\tblnMatch = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tplist = get_next(plist);\n\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif (!blnMatch)\n\t{\n\t\tsprintf(dev_type_str, \"\\n\\nN=00\");\n\t}\n\n\twrqu->data.length = strlen(dev_type_str);\n\t_rtw_memcpy(extra, dev_type_str, wrqu->data.length);\n\n\treturn ret; \n\t\t\n}\n\nstatic int rtw_p2p_get_device_name(struct net_device *dev,\n\t\t\t\t\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t\t\t\t\t   union iwreq_data *wrqu, char *extra, char *subcmd)\n{ \n\t\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 peerMAC[ETH_ALEN] = { 0x00 };\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_irqL irqL;\n\t_list *plist, *phead;\n\t_queue *queue = &(pmlmepriv->scanned_queue);\n\tstruct wlan_network *pnetwork = NULL;\n\tu8 blnMatch = 0;\n\tu8 dev_name[WPS_MAX_DEVICE_NAME_LEN] = { 0x00 };\n\tuint dev_len = 0;\n\tu8 dev_name_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };\n\n\t//\tCommented by Albert 20121225\n\t//\tThe input data is the MAC address which the application wants to know its device name.\n\t//\tSuch user interface could show peer device's device name instead of ssid.\n\t//\tFormat: iwpriv wlanx p2p_get2 devN=00:E0:4C:00:00:05\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, subcmd);\n\n\tmacstr2num(peerMAC, subcmd);\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE) break;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))\n\t\t{\n\t\t\tu8 *wpsie;\n\t\t\tuint\twpsie_len = 0;\n\n\t\t\t//\tThe mac address is matched.\n\n\t\t\tif ( (wpsie=rtw_get_wps_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &wpsie_len, pnetwork->network.Reserved[0])) )\n\t\t\t{\n\t\t\t\trtw_get_wps_attr_content(wpsie, wpsie_len, WPS_ATTR_DEVICE_NAME, dev_name, &dev_len);\n\t\t\t\tif (dev_len)\n\t\t\t\t{\n\t\t\t\t\tsprintf(dev_name_str, \"\\n\\nN=%s\", dev_name);\n\t\t\t\t\tblnMatch = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tplist = get_next(plist);\n\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif (!blnMatch)\n\t{\n\t\tsprintf(dev_name_str, \"\\n\\nN=0000\");\n\t}\n\n\twrqu->data.length = strlen(dev_name_str);\n\t_rtw_memcpy(extra, dev_name_str, wrqu->data.length);\n\n\treturn ret; \n\t\t\n}\n\nstatic int rtw_p2p_get_invitation_procedure(struct net_device *dev,\n\t\t\t\t\t\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra, char *subcmd)\n{\n\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 peerMAC[ETH_ALEN] = { 0x00 };\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t_irqL irqL;\n\t_list *plist, *phead;\n\t_queue *queue\t= &(pmlmepriv->scanned_queue);\n\tstruct wlan_network *pnetwork = NULL;\n\tu8 blnMatch = 0;\n\tu8 *p2pie;\n\tuint p2pielen = 0, attr_contentlen = 0;\n\tu8 attr_content[2] = { 0x00 };\n\tu8 inv_proc_str[P2P_PRIVATE_IOCTL_SET_LEN] = { 0x00 };\n\n\t//\tCommented by Ouden 20121226\n\t//\tThe application wants to know P2P initation procedure is support or not.\n\t//\tFormat: iwpriv wlanx p2p_get2 InvProc=00:E0:4C:00:00:05\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, subcmd);\n\n\tmacstr2num(peerMAC, subcmd);\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n\n\twhile (1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead, plist) == _TRUE) break;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif (_rtw_memcmp(pnetwork->network.MacAddress, peerMAC, ETH_ALEN))\n\t\t{\n\t\t\t//\tCommented by Albert 20121226\n\t\t\t//\tMatch the device address located in the P2P IE\n\t\t\t//\tThis is for the case that the P2P device address is not the same as the P2P interface address.\n\n\t\t\tif ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))\n\t\t\t{\n\t\t\t\twhile (p2pie)\n\t\t\t\t{\n\t\t\t\t\t//_rtw_memset( attr_content, 0x00, 2);\n\t\t\t\t\tif (rtw_get_p2p_attr_content(p2pie, p2pielen, P2P_ATTR_CAPABILITY, attr_content, &attr_contentlen))\n\t\t\t\t\t{\n\t\t\t\t\t\t//\tHandle the P2P capability attribute\n\t\t\t\t\t\tblnMatch = 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//Get the next P2P IE\n\t\t\t\t\tp2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tplist = get_next(plist);\n\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif (!blnMatch)\n\t{\n\t\tsprintf(inv_proc_str, \"\\nIP=-1\");\n\t} else\n\t{\n\t\tif ((attr_content[0] & 0x20) == 0x20)\n\t\t\tsprintf(inv_proc_str, \"\\nIP=1\");\n\t\telse\n\t\t\tsprintf(inv_proc_str, \"\\nIP=0\");\n\t}\n\n\twrqu->data.length = strlen(inv_proc_str);\n\t_rtw_memcpy(extra, inv_proc_str, wrqu->data.length);\n\n\treturn ret; \n\t\t\n}\n\nstatic int rtw_p2p_connect(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\t\t\t\t\tpeerMAC[ ETH_ALEN ] = { 0x00 };\n\tint \t\t\t\t\tjj,kk;\n\tu8   \t\t\t\t\tpeerMACStr[ ETH_ALEN * 2 ] = { 0x00 };\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\t_irqL\t\t\t\tirqL;\n\t_list\t\t\t\t\t*plist, *phead;\n\t_queue\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tuint\t\t\t\t\tuintPeerChannel = 0;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif // CONFIG_CONCURRENT_MODE\t\n\n\t//\tCommented by Albert 20110304\n\t//\tThe input data contains two informations.\n\t//\t1. First information is the MAC address which wants to formate with\n\t//\t2. Second information is the WPS PINCode or \"pbc\" string for push button method\n\t//\tFormat: 00:E0:4C:00:00:05\n\t//\tFormat: 00:E0:4C:00:00:05\n\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif ( pwdinfo->p2p_state == P2P_STATE_NONE )\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\n#ifdef CONFIG_INTEL_WIDI\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\tDBG_871X( \"[%s] WiFi is under survey!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n#endif //CONFIG_INTEL_WIDI\t\n\n\tif ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )\n\t{\n\t\treturn -1;\n\t}\n\t\n\tfor( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )\n\t{\n\t\tpeerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );\n\t}\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\t\tif ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) )\n\t\t{\n\t\t\tif (pnetwork->network.Configuration.DSConfig != 0)\n\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\telse if (pwdinfo->nego_req_info.peer_ch != 0)\n\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig = pwdinfo->nego_req_info.peer_ch;\n\t\t\telse{\n\t\t\t\t/* Unexpected case */\n\t\t\t\tuintPeerChannel = 0;\n\t\t\t\tDBG_871X(\"%s  uintPeerChannel = 0\\n\", __func__);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tplist = get_next(plist);\n\t\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif ( uintPeerChannel )\n\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\t_rtw_memset( &pwdinfo->nego_req_info, 0x00, sizeof( struct tx_nego_req_info ) );\n\t\t_rtw_memset( &pwdinfo->groupid_info, 0x00, sizeof( struct group_id_info ) );\n\t\t\n\t\tpwdinfo->nego_req_info.peer_channel_num[ 0 ] = uintPeerChannel;\n\t\t_rtw_memcpy( pwdinfo->nego_req_info.peerDevAddr, pnetwork->network.MacAddress, ETH_ALEN );\n\t\tpwdinfo->nego_req_info.benable = _TRUE;\n\n\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\tif ( rtw_p2p_state(pwdinfo) != P2P_STATE_GONEGO_OK )\n\t\t{\n\t\t\t//\tRestore to the listen state if the current p2p state is not nego OK\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN );\n\t\t}\n\n\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t//\tHave to enter the power saving with the AP\n\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\n\t\t\tissue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\tDBG_871X( \"[%s] Start PreTx Procedure!\\n\", __FUNCTION__ );\n\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_GO_NEGO_TIMEOUT );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_GO_NEGO_TIMEOUT );\n\t\t}\n#else\n\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_GO_NEGO_TIMEOUT );\n#endif // CONFIG_CONCURRENT_MODE\t\t\n\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] Not Found in Scanning Queue~\\n\", __FUNCTION__ );\n#ifdef CONFIG_INTEL_WIDI\n\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\n\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\n\t\trtw_free_network_queue(padapter, _TRUE);\n\t\t/** \n\t\t * For WiDi, if we can't find candidate device in scanning queue,\n\t\t * driver will do scanning itself\n\t\t */\n\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\t\trtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);\n\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n#endif //CONFIG_INTEL_WIDI \n\t\tret = -1;\n\t}\nexit:\t\n\treturn ret;\n}\n\nstatic int rtw_p2p_invite_req(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point \t\t\t*pdata = &wrqu->data;\n\tstruct wifidirect_info\t\t*pwdinfo = &( padapter->wdinfo );\n\tint \t\t\t\t\t\tjj,kk;\n\tu8   \t\t\t\t\t\tpeerMACStr[ ETH_ALEN * 2 ] = { 0x00 };\n\tstruct mlme_priv\t\t\t*pmlmepriv = &padapter->mlmepriv;\n\t_list\t\t\t\t\t\t*plist, *phead;\n\t_queue\t\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t\t*pnetwork = NULL;\n\tuint\t\t\t\t\t\tuintPeerChannel = 0;\n\tu8\t\t\t\t\t\tattr_content[50] = { 0x00 }, _status = 0;\n\tu8 \t\t\t\t\t\t*p2pie;\n\tuint\t\t\t\t\t\tp2pielen = 0, attr_contentlen = 0;\n\t_irqL\t\t\t\t\tirqL;\n\tstruct tx_invite_req_info*\tpinvite_req_info = &pwdinfo->invitereq_info;\n\tu8 ie_offset = 12;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_priv\t\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif // CONFIG_CONCURRENT_MODE\n\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info*\tpwfd_info = pwdinfo->wfd_info;\n#endif // CONFIG_WFD\n\t\n\t//\tCommented by Albert 20120321\n\t//\tThe input data contains two informations.\n\t//\t1. First information is the P2P device address which you want to send to.\t\n\t//\t2. Second information is the group id which combines with GO's mac address, space and GO's ssid.\n\t//\tCommand line sample: iwpriv wlan0 p2p_set invite=\"00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy\"\n\t//\tFormat: 00:11:22:33:44:55 00:E0:4C:00:00:05 DIRECT-xy\n\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif ( wrqu->data.length <=  37 )\n\t{\n\t\tDBG_871X( \"[%s] Wrong format!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\telse\n\t{\n\t\t//\tReset the content of struct tx_invite_req_info\n\t\tpinvite_req_info->benable = _FALSE;\n\t\t_rtw_memset( pinvite_req_info->go_bssid, 0x00, ETH_ALEN );\n\t\t_rtw_memset( pinvite_req_info->go_ssid, 0x00, WLAN_SSID_MAXLEN );\n\t\tpinvite_req_info->ssidlen = 0x00;\n\t\tpinvite_req_info->operating_ch = pwdinfo->operating_channel;\n\t\t_rtw_memset( pinvite_req_info->peer_macaddr, 0x00, ETH_ALEN );\n\t\tpinvite_req_info->token = 3;\n\t}\n\t\n\tfor( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )\n\t{\n\t\tpinvite_req_info->peer_macaddr[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );\n\t}\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//\tCommented by Albert 2011/05/18\n\t\t//\tMatch the device address located in the P2P IE\n\t\t//\tThis is for the case that the P2P device address is not the same as the P2P interface address.\n\n\t\tie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);\n\t\tif ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))\n\t\t{\n\t\t\t//\tThe P2P Device ID attribute is included in the Beacon frame.\n\t\t\t//\tThe P2P Device Info attribute is included in the probe response frame.\n\n\t\t\tif ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )\n\t\t\t{\n\t\t\t\t//\tHandle the P2P Device ID attribute of Beacon first\n\t\t\t\tif ( _rtw_memcmp( attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN ) )\n\t\t\t\t{\n\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )\n\t\t\t{\n\t\t\t\t//\tHandle the P2P Device Info attribute of probe response\n\t\t\t\tif ( _rtw_memcmp( attr_content, pinvite_req_info->peer_macaddr, ETH_ALEN ) )\n\t\t\t\t{\n\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tplist = get_next(plist);\n\t\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n#ifdef CONFIG_WFD\n\tif ( uintPeerChannel )\n\t{\n\t\tu8\twfd_ie[ 128 ] = { 0x00 };\n\t\tuint\twfd_ielen = 0;\n\t\t\n\t\tif ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )\n\t\t{\n\t\t\tu8\twfd_devinfo[ 6 ] = { 0x00 };\n\t\t\tuint\twfd_devlen = 6;\n\n\t\t\tDBG_871X( \"[%s] Found WFD IE!\\n\", __FUNCTION__ );\n\t\t\tif ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )\n\t\t\t{\n\t\t\t\tu16\twfd_devinfo_field = 0;\n\t\t\t\t\n\t\t\t\t//\tCommented by Albert 20120319\n\t\t\t\t//\tThe first two bytes are the WFD device information field of WFD device information subelement.\n\t\t\t\t//\tIn big endian format.\n\t\t\t\twfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);\n\t\t\t\tif ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL )\n\t\t\t\t{\n\t\t\t\t\tpwfd_info->peer_session_avail = _TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpwfd_info->peer_session_avail = _FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( _FALSE == pwfd_info->peer_session_avail )\n\t\t{\n\t\t\tDBG_871X( \"[%s] WFD Session not avaiable!\\n\", __FUNCTION__ );\n\t\t\tgoto exit;\n\t\t}\n\t}\n#endif // CONFIG_WFD\n\n\tif ( uintPeerChannel )\n\t{\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\t\t//\tStore the GO's bssid\n\t\tfor( jj = 0, kk = 18; jj < ETH_ALEN; jj++, kk += 3 )\n\t\t{\n\t\t\tpinvite_req_info->go_bssid[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );\n\t\t}\n\n\t\t//\tStore the GO's ssid\n\t\tpinvite_req_info->ssidlen = wrqu->data.length - 36;\n\t\t_rtw_memcpy( pinvite_req_info->go_ssid, &extra[ 36 ], (u32) pinvite_req_info->ssidlen );\n\t\tpinvite_req_info->benable = _TRUE;\n\t\tpinvite_req_info->peer_ch = uintPeerChannel;\n\n\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INVITE_REQ);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t//\tHave to enter the power saving with the AP\n\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\n\t\t\tissue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tset_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t}\n#else\n\t\tset_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n#endif\n\n\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_INVITE_TIMEOUT );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_INVITE_TIMEOUT );\n\t\t}\n#else\n\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_INVITE_TIMEOUT );\n#endif // CONFIG_CONCURRENT_MODE\t\t\n\n\t\t\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] NOT Found in the Scanning Queue!\\n\", __FUNCTION__ );\n\t}\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_persistent(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point \t\t\t*pdata = &wrqu->data;\n\tstruct wifidirect_info\t\t*pwdinfo = &( padapter->wdinfo );\n\tint \t\t\t\t\t\tjj,kk;\n\tu8   \t\t\t\t\t\tpeerMACStr[ ETH_ALEN * 2 ] = { 0x00 };\n\tstruct mlme_priv\t\t\t*pmlmepriv = &padapter->mlmepriv;\n\t_list\t\t\t\t\t\t*plist, *phead;\n\t_queue\t\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t\t*pnetwork = NULL;\n\tuint\t\t\t\t\t\tuintPeerChannel = 0;\n\tu8\t\t\t\t\t\tattr_content[50] = { 0x00 }, _status = 0;\n\tu8 \t\t\t\t\t\t*p2pie;\n\tuint\t\t\t\t\t\tp2pielen = 0, attr_contentlen = 0;\n\t_irqL\t\t\t\t\tirqL;\n\tstruct tx_invite_req_info*\tpinvite_req_info = &pwdinfo->invitereq_info;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_priv\t\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif // CONFIG_CONCURRENT_MODE\n\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info*\tpwfd_info = pwdinfo->wfd_info;\n#endif // CONFIG_WFD\n\t\n\t//\tCommented by Albert 20120328\n\t//\tThe input data is 0 or 1\n\t//\t0: disable persistent group functionality\n\t//\t1: enable persistent group founctionality\n\t\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\telse\n\t{\n\t\tif ( extra[ 0 ] == '0' )\t//\tDisable the persistent group function.\n\t\t{\n\t\t\tpwdinfo->persistent_supported = _FALSE;\n\t\t}\n\t\telse if ( extra[ 0 ] == '1' )\t//\tEnable the persistent group function.\n\t\t{\n\t\t\tpwdinfo->persistent_supported = _TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpwdinfo->persistent_supported = _FALSE;\n\t\t}\n\t}\n\tprintk( \"[%s] persistent_supported = %d\\n\", __FUNCTION__, pwdinfo->persistent_supported );\n\t\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int hexstr2bin(const char *hex, u8 *buf, size_t len)\n{\n\tsize_t i;\n\tint a;\n\tconst char *ipos = hex;\n\tu8 *opos = buf;\n\n\tfor (i = 0; i < len; i++) {\n\t\ta = hex2byte_i(ipos);\n\t\tif (a < 0)\n\t\t\treturn -1;\n\t\t*opos++ = a;\n\t\tipos += 2;\n\t}\n\treturn 0;\n}\n\nstatic int uuid_str2bin(const char *str, u8 *bin)\n{\n\tconst char *pos;\n\tu8 *opos;\n\n\tpos = str;\n\topos = bin;\n\n\tif (hexstr2bin(pos, opos, 4))\n\t\treturn -1;\n\tpos += 8;\n\topos += 4;\n\n\tif (*pos++ != '-' || hexstr2bin(pos, opos, 2))\n\t\treturn -1;\n\tpos += 4;\n\topos += 2;\n\n\tif (*pos++ != '-' || hexstr2bin(pos, opos, 2))\n\t\treturn -1;\n\tpos += 4;\n\topos += 2;\n\n\tif (*pos++ != '-' || hexstr2bin(pos, opos, 2))\n\t\treturn -1;\n\tpos += 4;\n\topos += 2;\n\n\tif (*pos++ != '-' || hexstr2bin(pos, opos, 6))\n\t\treturn -1;\n\n\treturn 0;\n}\n\nstatic int rtw_p2p_set_wps_uuid(struct net_device *dev,\n\tstruct iw_request_info *info,\n\tunion iwreq_data *wrqu, char *extra)\n{\n\n\tint ret = 0;\n\t_adapter\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info\t\t\t*pwdinfo = &(padapter->wdinfo);\n\n\tDBG_871X(\"[%s] data = %s\\n\", __FUNCTION__, extra);\n\n\tif ((36 == strlen(extra)) && (uuid_str2bin(extra, pwdinfo->uuid) == 0)) \n\t{\n\t\tpwdinfo->external_uuid = 1;\n\t} else {\n\t\tpwdinfo->external_uuid = 0;\n\t\tret = -EINVAL;\n\t}\n\n\treturn ret;\n\n}\n#ifdef CONFIG_WFD\nstatic int rtw_p2p_set_pc(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point \t\t*pdata = &wrqu->data;\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\t\t\t\t\tpeerMAC[ ETH_ALEN ] = { 0x00 };\n\tint \t\t\t\t\tjj,kk;\n\tu8   \t\t\t\t\tpeerMACStr[ ETH_ALEN * 2 ] = { 0x00 };\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\t_list\t\t\t\t\t*plist, *phead;\n\t_queue\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tu8\t\t\t\t\tattr_content[50] = { 0x00 }, _status = 0;\n\tu8 *p2pie;\n\tuint\t\t\t\t\tp2pielen = 0, attr_contentlen = 0;\n\t_irqL\t\t\t\tirqL;\n\tuint\t\t\t\t\tuintPeerChannel = 0;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif // CONFIG_CONCURRENT_MODE\t\n\t\n\tstruct wifi_display_info*\tpwfd_info = pwdinfo->wfd_info;\n\t\n\t//\tCommented by Albert 20120512\n\t//\t1. Input information is the MAC address which wants to know the Preferred Connection bit (PC bit)\n\t//\tFormat: 00:E0:4C:00:00:05\n\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\t\n\tfor( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )\n\t{\n\t\tpeerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );\n\t}\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//\tCommented by Albert 2011/05/18\n\t\t//\tMatch the device address located in the P2P IE\n\t\t//\tThis is for the case that the P2P device address is not the same as the P2P interface address.\n\n\t\tif ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))\n\t\t{\n\t\t\t//\tThe P2P Device ID attribute is included in the Beacon frame.\n\t\t\t//\tThe P2P Device Info attribute is included in the probe response frame.\n\t\t\tprintk( \"[%s] Got P2P IE\\n\", __FUNCTION__ );\n\t\t\tif ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )\n\t\t\t{\n\t\t\t\t//\tHandle the P2P Device ID attribute of Beacon first\n\t\t\t\tprintk( \"[%s] P2P_ATTR_DEVICE_ID \\n\", __FUNCTION__ );\n\t\t\t\tif ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )\n\t\t\t\t{\n\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )\n\t\t\t{\n\t\t\t\t//\tHandle the P2P Device Info attribute of probe response\n\t\t\t\tprintk( \"[%s] P2P_ATTR_DEVICE_INFO \\n\", __FUNCTION__ );\n\t\t\t\tif ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )\n\t\t\t\t{\n\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\t\t\t\t\n\t\t\t}\n\n\t\t}\n\n\t\tplist = get_next(plist);\n\t\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\tprintk( \"[%s] channel = %d\\n\", __FUNCTION__, uintPeerChannel );\n\n\tif ( uintPeerChannel )\n\t{\n\t\tu8\twfd_ie[ 128 ] = { 0x00 };\n\t\tuint\twfd_ielen = 0;\n\t\tu8 ie_offset = (pnetwork->network.Reserved[0] == 2 ? 0:12);\n\n\t\tif ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )\n\t\t{\n\t\t\tu8\twfd_devinfo[ 6 ] = { 0x00 };\n\t\t\tuint\twfd_devlen = 6;\n\n\t\t\tDBG_871X( \"[%s] Found WFD IE!\\n\", __FUNCTION__ );\n\t\t\tif ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )\n\t\t\t{\n\t\t\t\tu16\twfd_devinfo_field = 0;\n\t\t\t\t\n\t\t\t\t//\tCommented by Albert 20120319\n\t\t\t\t//\tThe first two bytes are the WFD device information field of WFD device information subelement.\n\t\t\t\t//\tIn big endian format.\n\t\t\t\twfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);\n\t\t\t\tif ( wfd_devinfo_field & WFD_DEVINFO_PC_TDLS )\n\t\t\t\t{\n\t\t\t\t\tpwfd_info->wfd_pc = _TRUE;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpwfd_info->wfd_pc = _FALSE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\t\n\telse\n\t{\n\t\tDBG_871X( \"[%s] NOT Found in the Scanning Queue!\\n\", __FUNCTION__ );\n\t}\n\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_wfd_device_type(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point \t\t\t*pdata = &wrqu->data;\n\tstruct wifidirect_info\t\t*pwdinfo = &( padapter->wdinfo );\n\tstruct wifi_display_info\t\t*pwfd_info = pwdinfo->wfd_info;\n\t\n\t//\tCommented by Albert 20120328\n\t//\tThe input data is 0 or 1\n\t//\t0: specify to Miracast source device\n\t//\t1 or others: specify to Miracast sink device (display device)\n\t\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif ( extra[ 0 ] == '0' )\t//\tSet to Miracast source device.\n\t{\n\t\tpwfd_info->wfd_device_type = WFD_DEVINFO_SOURCE;\n\t}\n\telse\t\t\t\t\t//\tSet to Miracast sink device.\n\t{\n\t\tpwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;\n\t}\n\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_wfd_enable(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n//\tCommented by Kurt 20121206\n//\tThis function is used to set wfd enabled\n\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\tif(*extra == '0' )\n\t\tpwdinfo->wfd_info->wfd_enable = _FALSE;\n\telse if(*extra == '1')\n\t\tpwdinfo->wfd_info->wfd_enable = _TRUE;\n\n\tDBG_871X( \"[%s] wfd_enable = %d\\n\", __FUNCTION__, pwdinfo->wfd_info->wfd_enable );\n\t\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_set_driver_iface(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n//\tCommented by Kurt 20121206\n//\tThis function is used to set driver iface is WEXT or CFG80211\n\tint ret = 0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\n\tif(*extra == '1' )\n\t{\n\t\tpwdinfo->driver_interface = DRIVER_WEXT;\n\t\tDBG_871X( \"[%s] driver_interface = WEXT\\n\", __FUNCTION__);\n\t}\n\telse if(*extra == '2')\n\t{\n\t\tpwdinfo->driver_interface = DRIVER_CFG80211;\n\t\tDBG_871X( \"[%s] driver_interface = CFG80211\\n\", __FUNCTION__);\n\t}\n\t\n\treturn ret;\n\t\t\n}\n\n//\tTo set the WFD session available to enable or disable\nstatic int rtw_p2p_set_sa(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct iw_point \t\t\t*pdata = &wrqu->data;\n\tstruct wifidirect_info\t\t*pwdinfo = &( padapter->wdinfo );\n\tstruct wifi_display_info\t\t*pwfd_info = pwdinfo->wfd_info;\n\t\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif( 0 )\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\telse\n\t{\n\t\tif ( extra[ 0 ] == '0' )\t//\tDisable the session available.\n\t\t{\n\t\t\tpwdinfo->session_available = _FALSE;\n\t\t}\n\t\telse if ( extra[ 0 ] == '1' )\t//\tEnable the session available.\n\t\t{\n\t\t\tpwdinfo->session_available = _TRUE;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpwdinfo->session_available = _FALSE;\n\t\t}\n\t}\n\tprintk( \"[%s] session available = %d\\n\", __FUNCTION__, pwdinfo->session_available );\n\t\nexit:\n\t\n\treturn ret;\n\t\t\n}\n#endif // CONFIG_WFD\n\nstatic int rtw_p2p_prov_disc(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\t\n\t_adapter \t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\tu8\t\t\t\t\tpeerMAC[ ETH_ALEN ] = { 0x00 };\n\tint \t\t\t\t\tjj,kk;\n\tu8   \t\t\t\t\tpeerMACStr[ ETH_ALEN * 2 ] = { 0x00 };\n\tstruct mlme_priv\t\t*pmlmepriv = &padapter->mlmepriv;\n\t_list\t\t\t\t\t*plist, *phead;\n\t_queue\t\t\t\t*queue\t= &(pmlmepriv->scanned_queue);\n\tstruct\twlan_network\t*pnetwork = NULL;\n\tuint\t\t\t\t\tuintPeerChannel = 0;\n\tu8\t\t\t\t\tattr_content[100] = { 0x00 }, _status = 0;\n\tu8 *p2pie;\n\tuint\t\t\t\t\tp2pielen = 0, attr_contentlen = 0;\n\t_irqL\t\t\t\tirqL;\n\tu8 \t\t\t\t\tie_offset = 12;\n#ifdef CONFIG_CONCURRENT_MODE\n\t_adapter\t\t\t\t*pbuddy_adapter = padapter->pbuddy_adapter;\n\tstruct mlme_priv\t\t*pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;\n#endif // CONFIG_CONCURRENT_MODE\t\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info*\tpwfd_info = pwdinfo->wfd_info;\n#endif // CONFIG_WFD\n\n\t//\tCommented by Albert 20110301\n\t//\tThe input data contains two informations.\n\t//\t1. First information is the MAC address which wants to issue the provisioning discovery request frame.\n\t//\t2. Second information is the WPS configuration method which wants to discovery\n\t//\tFormat: 00:E0:4C:00:00:05_display\n\t//\tFormat: 00:E0:4C:00:00:05_keypad\n\t//\tFormat: 00:E0:4C:00:00:05_pbc\n\t//\tFormat: 00:E0:4C:00:00:05_label\n\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\n\tif ( pwdinfo->p2p_state == P2P_STATE_NONE )\n\t{\n\t\tDBG_871X( \"[%s] WiFi Direct is disable!\\n\", __FUNCTION__ );\n\t\treturn ret;\n\t}\n\telse\n\t{\n#ifdef CONFIG_INTEL_WIDI\n\t\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {\n\t\t\tDBG_871X( \"[%s] WiFi is under survey!\\n\", __FUNCTION__ );\n\t\t\treturn ret;\n\t\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t\t//\tReset the content of struct tx_provdisc_req_info excluded the wps_config_method_request.\n\t\t_rtw_memset( pwdinfo->tx_prov_disc_info.peerDevAddr, 0x00, ETH_ALEN );\n\t\t_rtw_memset( pwdinfo->tx_prov_disc_info.peerIFAddr, 0x00, ETH_ALEN );\n\t\t_rtw_memset( &pwdinfo->tx_prov_disc_info.ssid, 0x00, sizeof( NDIS_802_11_SSID ) );\t\t\n\t\tpwdinfo->tx_prov_disc_info.peer_channel_num[ 0 ] = 0;\n\t\tpwdinfo->tx_prov_disc_info.peer_channel_num[ 1 ] = 0;\n\t\tpwdinfo->tx_prov_disc_info.benable = _FALSE;\n\t}\n\t\n\tfor( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )\n\t{\n\t\tpeerMAC[ jj ] = key_2char2num( extra[kk], extra[kk+ 1] );\n\t}\n\n\tif ( _rtw_memcmp( &extra[ 18 ], \"display\", 7 ) )\n\t{\n\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA;\n\t}\n\telse if ( _rtw_memcmp( &extra[ 18 ], \"keypad\", 7 ) )\n\t{\n\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_KEYPAD;\n\t}\n\telse if ( _rtw_memcmp( &extra[ 18 ], \"pbc\", 3 ) )\n\t{\n\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_PUSH_BUTTON;\n\t}\n\telse if ( _rtw_memcmp( &extra[ 18 ], \"label\", 5 ) )\n\t{\n\t\tpwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_LABEL;\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] Unknown WPS config methodn\", __FUNCTION__ );\n\t\treturn( ret );\n\t}\n\n\t_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tphead = get_list_head(queue);\n\tplist = get_next(phead);\n       \n\twhile(1)\n\t{\n\t\tif (rtw_end_of_queue_search(phead,plist)== _TRUE)\n\t\t\tbreak;\n\n\t\tif( uintPeerChannel != 0 )\n\t\t\tbreak;\n\n\t\tpnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);\n\n\t\t//\tCommented by Albert 2011/05/18\n\t\t//\tMatch the device address located in the P2P IE\n\t\t//\tThis is for the case that the P2P device address is not the same as the P2P interface address.\n\n\t\tie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);\n\t\tif ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))\n\t\t{\n\t\t\twhile ( p2pie )\n\t\t\t{\n\t\t\t\t//\tThe P2P Device ID attribute is included in the Beacon frame.\n\t\t\t\t//\tThe P2P Device Info attribute is included in the probe response frame.\n\n\t\t\t\tif ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_ID, attr_content, &attr_contentlen) )\n\t\t\t\t{\n\t\t\t\t\t//\tHandle the P2P Device ID attribute of Beacon first\n\t\t\t\t\tif ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if ( rtw_get_p2p_attr_content( p2pie, p2pielen, P2P_ATTR_DEVICE_INFO, attr_content, &attr_contentlen) )\n\t\t\t\t{\n\t\t\t\t\t//\tHandle the P2P Device Info attribute of probe response\n\t\t\t\t\tif ( _rtw_memcmp( attr_content, peerMAC, ETH_ALEN ) )\n\t\t\t\t\t{\n\t\t\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\t//Get the next P2P IE\n\t\t\t\tp2pie = rtw_get_p2p_ie(p2pie+p2pielen, pnetwork->network.IELength - ie_offset -(p2pie -&pnetwork->network.IEs[ie_offset] + p2pielen), NULL, &p2pielen);\n\t\t\t}\n\n\t\t}\n\n#ifdef CONFIG_INTEL_WIDI\n\t\t// Some Intel WiDi source may not provide P2P IE, \n\t\t// so we could only compare mac addr by 802.11 Source Address\n\t\tif( pmlmepriv->widi_state == INTEL_WIDI_STATE_WFD_CONNECTION \n\t\t\t&& uintPeerChannel == 0 )\n\t\t{\n\t\t\tif ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) )\n\t\t\t{\n\t\t\t\tuintPeerChannel = pnetwork->network.Configuration.DSConfig;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif //CONFIG_INTEL_WIDI\n\n\t\tplist = get_next(plist);\n\t\n\t}\n\n\t_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);\n\n\tif ( uintPeerChannel )\n\t{\n#ifdef CONFIG_WFD\n\t\t{\n\t\t\tu8\twfd_ie[ 128 ] = { 0x00 };\n\t\t\tuint\twfd_ielen = 0;\n\t\t\t\n\t\t\tif ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )\n\t\t\t{\n\t\t\t\tu8\twfd_devinfo[ 6 ] = { 0x00 };\n\t\t\t\tuint\twfd_devlen = 6;\n\n\t\t\t\tDBG_871X( \"[%s] Found WFD IE!\\n\", __FUNCTION__ );\n\t\t\t\tif ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )\n\t\t\t\t{\n\t\t\t\t\tu16\twfd_devinfo_field = 0;\n\t\t\t\t\t\n\t\t\t\t\t//\tCommented by Albert 20120319\n\t\t\t\t\t//\tThe first two bytes are the WFD device information field of WFD device information subelement.\n\t\t\t\t\t//\tIn big endian format.\n\t\t\t\t\twfd_devinfo_field = RTW_GET_BE16(wfd_devinfo);\n\t\t\t\t\tif ( wfd_devinfo_field & WFD_DEVINFO_SESSION_AVAIL )\n\t\t\t\t\t{\n\t\t\t\t\t\tpwfd_info->peer_session_avail = _TRUE;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpwfd_info->peer_session_avail = _FALSE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( _FALSE == pwfd_info->peer_session_avail )\n\t\t\t{\n\t\t\t\tDBG_871X( \"[%s] WFD Session not avaiable!\\n\", __FUNCTION__ );\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n#endif // CONFIG_WFD\n\t\t\n\t\tDBG_871X( \"[%s] peer channel: %d!\\n\", __FUNCTION__, uintPeerChannel );\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );\n\t\t}\n#endif // CONFIG_CONCURRENT_MODE\n\t\t_rtw_memcpy( pwdinfo->tx_prov_disc_info.peerIFAddr, pnetwork->network.MacAddress, ETH_ALEN );\n\t\t_rtw_memcpy( pwdinfo->tx_prov_disc_info.peerDevAddr, peerMAC, ETH_ALEN );\n\t\tpwdinfo->tx_prov_disc_info.peer_channel_num[0] = ( u16 ) uintPeerChannel;\n\t\tpwdinfo->tx_prov_disc_info.benable = _TRUE;\n\t\trtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ);\n\n\t\tif(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))\n\t\t{\n\t\t\t_rtw_memcpy( &pwdinfo->tx_prov_disc_info.ssid, &pnetwork->network.Ssid, sizeof( NDIS_802_11_SSID ) );\n\t\t}\n\t\telse if(rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))\n\t\t{\n\t\t\t_rtw_memcpy( pwdinfo->tx_prov_disc_info.ssid.Ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN );\n\t\t\tpwdinfo->tx_prov_disc_info.ssid.SsidLength= P2P_WILDCARD_SSID_LEN;\n\t\t}\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t//\tHave to enter the power saving with the AP\n\t\t\tset_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);\n\t\t\t\n\t\t\tissue_nulldata(pbuddy_adapter, NULL, 1, 3, 500);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tset_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n\t\t}\n#else\n\t\tset_channel_bwmode(padapter, uintPeerChannel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);\n#endif\n\n\t\t_set_timer( &pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT );\n\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif ( check_fwstate( pbuddy_mlmepriv, _FW_LINKED ) )\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_CONCURRENT_PROVISION_TIMEOUT );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );\n\t\t}\n#else\n\t\t_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );\n#endif // CONFIG_CONCURRENT_MODE\t\t\n\t\t\n\t}\n\telse\n\t{\n\t\tDBG_871X( \"[%s] NOT Found in the Scanning Queue!\\n\", __FUNCTION__ );\n#ifdef CONFIG_INTEL_WIDI\n\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\n\t\trtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\n\t\trtw_free_network_queue(padapter, _TRUE);\t\t\n\t\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\t\t\t\t\n\t\trtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);\n\t\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n#endif //CONFIG_INTEL_WIDI\n\t}\nexit:\n\t\n\treturn ret;\n\t\t\n}\n\n//\tAdded by Albert 20110328\n//\tThis function is used to inform the driver the user had specified the pin code value or pbc\n//\tto application.\n\nstatic int rtw_p2p_got_wpsinfo(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t_adapter \t\t\t\t*padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct wifidirect_info\t*pwdinfo = &( padapter->wdinfo );\n\t\n\n\tDBG_871X( \"[%s] data = %s\\n\", __FUNCTION__, extra );\n\t//\tAdded by Albert 20110328\n\t//\tif the input data is P2P_NO_WPSINFO -> reset the wpsinfo\n\t//\tif the input data is P2P_GOT_WPSINFO_PEER_DISPLAY_PIN -> the utility just input the PIN code got from the peer P2P device.\n\t//\tif the input data is P2P_GOT_WPSINFO_SELF_DISPLAY_PIN -> the utility just got the PIN code from itself.\n\t//\tif the input data is P2P_GOT_WPSINFO_PBC -> the utility just determine to use the PBC\n\t\n\tif ( *extra == '0' )\n\t{\n\t\tpwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;\n\t}\n\telse if ( *extra == '1' )\n\t{\n\t\tpwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PEER_DISPLAY_PIN;\n\t}\n\telse if ( *extra == '2' )\n\t{\n\t\tpwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_SELF_DISPLAY_PIN;\n\t}\n\telse if ( *extra == '3' )\n\t{\n\t\tpwdinfo->ui_got_wps_info = P2P_GOT_WPSINFO_PBC;\n\t}\n\telse\n\t{\n\t\tpwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;\n\t}\n\t\n\treturn ret;\n\t\t\n}\n\n#endif //CONFIG_P2P\n\nstatic int rtw_p2p_set(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\n#ifdef CONFIG_P2P\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tDBG_871X( \"[%s] extra = %s\\n\", __FUNCTION__, extra );\n\n\tif ( _rtw_memcmp( extra, \"enable=\", 7 ) )\n\t{\n\t\trtw_wext_p2p_enable( dev, info, wrqu, &extra[7] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"setDN=\", 6 ) )\n\t{\n\t\twrqu->data.length -= 6;\n\t\trtw_p2p_setDN( dev, info, wrqu, &extra[6] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"profilefound=\", 13 ) )\n\t{\n\t\twrqu->data.length -= 13;\n\t\trtw_p2p_profilefound( dev, info, wrqu, &extra[13] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"prov_disc=\", 10 ) )\n\t{\n\t\twrqu->data.length -= 10;\n\t\trtw_p2p_prov_disc( dev, info, wrqu, &extra[10] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"nego=\", 5 ) )\n\t{\n\t\twrqu->data.length -= 5;\n\t\trtw_p2p_connect( dev, info, wrqu, &extra[5] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"intent=\", 7 ) )\n\t{\n\t\t//\tCommented by Albert 2011/03/23\n\t\t//\tThe wrqu->data.length will include the null character\n\t\t//\tSo, we will decrease 7 + 1\n\t\twrqu->data.length -= 8;\n\t\trtw_p2p_set_intent( dev, info, wrqu, &extra[7] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"ssid=\", 5 ) )\n\t{\n\t\twrqu->data.length -= 5;\n\t\trtw_p2p_set_go_nego_ssid( dev, info, wrqu, &extra[5] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"got_wpsinfo=\", 12 ) )\n\t{\n\t\twrqu->data.length -= 12;\n\t\trtw_p2p_got_wpsinfo( dev, info, wrqu, &extra[12] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"listen_ch=\", 10 ) )\n\t{\n\t\t//\tCommented by Albert 2011/05/24\n\t\t//\tThe wrqu->data.length will include the null character\n\t\t//\tSo, we will decrease (10 + 1)\t\n\t\twrqu->data.length -= 11;\n\t\trtw_p2p_set_listen_ch( dev, info, wrqu, &extra[10] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"op_ch=\", 6 ) )\n\t{\n\t\t//\tCommented by Albert 2011/05/24\n\t\t//\tThe wrqu->data.length will include the null character\n\t\t//\tSo, we will decrease (6 + 1)\t\n\t\twrqu->data.length -= 7;\n\t\trtw_p2p_set_op_ch( dev, info, wrqu, &extra[6] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"invite=\", 7 ) )\n\t{\n\t\twrqu->data.length -= 8;\n\t\trtw_p2p_invite_req( dev, info, wrqu, &extra[7] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"persistent=\", 11 ) )\n\t{\n\t\twrqu->data.length -= 11;\n\t\trtw_p2p_set_persistent( dev, info, wrqu, &extra[11] );\n\t}\n\telse if ( _rtw_memcmp ( extra, \"uuid=\", 5) )\n\t{\n\t\twrqu->data.length -= 5;\n\t\tret = rtw_p2p_set_wps_uuid( dev, info, wrqu, &extra[5] );\n\t}\n#ifdef CONFIG_WFD\n\telse if ( _rtw_memcmp( extra, \"sa=\", 3 ) )\n\t{\n\t\t//\tsa: WFD Session Available information\n\t\twrqu->data.length -= 3;\n\t\trtw_p2p_set_sa( dev, info, wrqu, &extra[3] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"pc=\", 3 ) )\n\t{\n\t\t//\tpc: WFD Preferred Connection\n\t\twrqu->data.length -= 3;\n\t\trtw_p2p_set_pc( dev, info, wrqu, &extra[3] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"wfd_type=\", 9 ) )\n\t{\n\t\t//\tpc: WFD Preferred Connection\n\t\twrqu->data.length -= 9;\n\t\trtw_p2p_set_wfd_device_type( dev, info, wrqu, &extra[9] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"wfd_enable=\", 11 ) )\n\t{\n\t\twrqu->data.length -= 11;\n\t\trtw_p2p_set_wfd_enable( dev, info, wrqu, &extra[11] );\n\t}\n\telse if ( _rtw_memcmp( extra, \"driver_iface=\", 13 ) )\n\t{\n\t\twrqu->data.length -= 13;\n\t\trtw_p2p_set_driver_iface( dev, info, wrqu, &extra[13] );\n\t}\n#endif //CONFIG_WFD\n\n#endif //CONFIG_P2P\n\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\t\n#ifdef CONFIG_P2P\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct iw_point *pdata = &wrqu->data;\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\n\tif ( padapter->bShowGetP2PState )\n\t{\n\t\tDBG_871X( \"[%s] extra = %s\\n\", __FUNCTION__, (char*) wrqu->data.pointer );\n\t}\n\n\tif ( _rtw_memcmp( wrqu->data.pointer, \"status\", 6 ) )\n\t{\n\t\trtw_p2p_get_status( dev, info, wrqu, extra );\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"role\", 4 ) )\n\t{\n\t\trtw_p2p_get_role( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"peer_ifa\", 8 ) )\n\t{\n\t\trtw_p2p_get_peer_ifaddr( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"req_cm\", 6 ) )\n\t{\n\t\trtw_p2p_get_req_cm( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"peer_deva\", 9 ) )\n\t{\n\t\t//\tGet the P2P device address when receiving the provision discovery request frame.\n\t\trtw_p2p_get_peer_devaddr( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"group_id\", 8 ) )\n\t{\n\t\trtw_p2p_get_groupid( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"inv_peer_deva\", 13 ) )\n\t{\n\t\t//\tGet the P2P device address when receiving the P2P Invitation request frame.\n\t\trtw_p2p_get_peer_devaddr_by_invitation( dev, info, wrqu, extra);\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"op_ch\", 5 ) )\n\t{\n\t\trtw_p2p_get_op_ch( dev, info, wrqu, extra);\n\t}\n#ifdef CONFIG_WFD\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"peer_port\", 9 ) )\n\t{\n\t\trtw_p2p_get_peer_wfd_port( dev, info, wrqu, extra );\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"wfd_sa\", 6 ) )\n\t{\n\t\trtw_p2p_get_peer_wfd_session_available( dev, info, wrqu, extra );\n\t}\n\telse if ( _rtw_memcmp( wrqu->data.pointer, \"wfd_pc\", 6 ) )\n\t{\n\t\trtw_p2p_get_peer_wfd_preferred_connection( dev, info, wrqu, extra );\n\t}\n#endif // CONFIG_WFD\t\n\t\n#endif //CONFIG_P2P\n\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_p2p_get2(struct net_device *dev,\n\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\n\tint ret = 0;\n\n#ifdef CONFIG_P2P\n\n\tint length = wrqu->data.length;\n\tchar *buffer = (u8 *)rtw_malloc(length);\n\n\tif (buffer == NULL)\n\t{\n\t\tret = -ENOMEM;\n\t\tgoto bad;\n\t}\n\n\tif (copy_from_user(buffer, wrqu->data.pointer, wrqu->data.length))\n\t{\n\t\tret = -EFAULT;\n\t\tgoto bad;\n\t}\n\n\tDBG_871X(\"[%s] buffer = %s\\n\", __FUNCTION__, buffer);\n\n\tif (_rtw_memcmp(buffer, \"wpsCM=\", 6))\n\t{\n\t\tret = rtw_p2p_get_wps_configmethod(dev, info, wrqu, extra, &buffer[6]);\n\t} else if (_rtw_memcmp(buffer, \"devN=\", 5))\n\t{\n\t\tret = rtw_p2p_get_device_name(dev, info, wrqu, extra, &buffer[5]);\n\t} else if (_rtw_memcmp(buffer, \"dev_type=\", 9))\n\t{\n\t\tret = rtw_p2p_get_device_type(dev, info, wrqu, extra, &buffer[9]);\n\t} else if (_rtw_memcmp(buffer, \"go_devadd=\", 10))\n\t{\n\t\tret = rtw_p2p_get_go_device_address(dev, info, wrqu, extra, &buffer[10]);\n\t} else if (_rtw_memcmp(buffer, \"InvProc=\", 8))\n\t{\n\t\tret = rtw_p2p_get_invitation_procedure(dev, info, wrqu, extra, &buffer[8]);\n\t} else\n\t{\n\t\tsnprintf(extra, sizeof(\"Command not found.\"), \"Command not found.\");\n\t\twrqu->data.length = strlen(extra);\n\t}\n\nbad:\n\tif (buffer)\n\t{\n\t\trtw_mfree(buffer, length);\n\t}\n\n#endif //CONFIG_P2P\n\n\treturn ret;\n\n}\n\nstatic int rtw_cta_test_start(struct net_device *dev,\n\t\t\t\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t\t\t\t   union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\t_adapter\t*padapter = (_adapter *)rtw_netdev_priv(dev);\n\tDBG_871X(\"%s %s\\n\", __func__, extra);\n\tif (!strcmp(extra, \"1\"))\n\t\tpadapter->in_cta_test = 1;\n\telse\n\t\tpadapter->in_cta_test = 0;\n\n\tif(padapter->in_cta_test)\n\t{\n\t\tu32 v = rtw_read32(padapter, REG_RCR);\n\t\tv &= ~(RCR_CBSSID_DATA | RCR_CBSSID_BCN );//| RCR_ADF\n\t\trtw_write32(padapter, REG_RCR, v);\n\t\tDBG_871X(\"enable RCR_ADF\\n\");\n\t}\n\telse\n\t{\n\t\tu32 v = rtw_read32(padapter, REG_RCR);\n\t\tv |= RCR_CBSSID_DATA | RCR_CBSSID_BCN ;//| RCR_ADF\n\t\trtw_write32(padapter, REG_RCR, v);\n\t\tDBG_871X(\"disable RCR_ADF\\n\");\n\t}\n\treturn ret;\n}\n\n\nextern int rtw_change_ifname(_adapter *padapter, const char *ifname);\nstatic int rtw_rereg_nd_name(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\t\n\t_adapter *padapter = rtw_netdev_priv(dev);\n\tstruct rereg_nd_name_data *rereg_priv = &padapter->rereg_nd_name_priv;\n\tchar new_ifname[IFNAMSIZ];\n\n\tif(rereg_priv->old_ifname[0] == 0) {\n\t\tchar *reg_ifname;\n#ifdef CONFIG_CONCURRENT_MODE \n\t\tif (padapter->isprimary)\n\t\t\treg_ifname = padapter->registrypriv.ifname;\n\t\telse\n#endif\n\t\treg_ifname = padapter->registrypriv.if2name;\n\n\t\tstrncpy(rereg_priv->old_ifname, reg_ifname, IFNAMSIZ);\n\t\trereg_priv->old_ifname[IFNAMSIZ-1] = 0;\n\t}\n\n\t//DBG_871X(\"%s wrqu->data.length:%d\\n\", __FUNCTION__, wrqu->data.length);\n\tif(wrqu->data.length > IFNAMSIZ)\n\t\treturn -EFAULT;\n\n\tif ( copy_from_user(new_ifname, wrqu->data.pointer, IFNAMSIZ) ) {\n\t\treturn -EFAULT;\n\t}\n\n\tif( 0 == strcmp(rereg_priv->old_ifname, new_ifname) ) {\n\t\treturn ret;\n\t}\n\n\tDBG_871X(\"%s new_ifname:%s\\n\", __FUNCTION__, new_ifname);\n\tif( 0 != (ret = rtw_change_ifname(padapter, new_ifname)) ) {\n\t\tgoto exit;\n\t}\n\n\tif(_rtw_memcmp(rereg_priv->old_ifname, \"disable%d\", 9) == _TRUE) {\n\t\tpadapter->ledpriv.bRegUseLed= rereg_priv->old_bRegUseLed;\n\t\trtw_hal_sw_led_init(padapter);\n\t\t//rtw_ips_mode_req(&padapter->pwrctrlpriv, rereg_priv->old_ips_mode);\n\t}\n\n\tstrncpy(rereg_priv->old_ifname, new_ifname, IFNAMSIZ);\n\trereg_priv->old_ifname[IFNAMSIZ-1] = 0;\n\t\n\tif(_rtw_memcmp(new_ifname, \"disable%d\", 9) == _TRUE) {\n\n\t\tDBG_871X(\"%s disable\\n\", __FUNCTION__);\n\t\t// free network queue for Android's timming issue\n\t\trtw_free_network_queue(padapter, _TRUE);\n\t\t\n\t\t// close led\n\t\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\t\trereg_priv->old_bRegUseLed = padapter->ledpriv.bRegUseLed;\n\t\tpadapter->ledpriv.bRegUseLed= _FALSE;\n\t\trtw_hal_sw_led_deinit(padapter);\n\t\t\n\t\t// the interface is being \"disabled\", we can do deeper IPS\n\t\t//rereg_priv->old_ips_mode = rtw_get_ips_mode_req(&padapter->pwrctrlpriv);\n\t\t//rtw_ips_mode_req(&padapter->pwrctrlpriv, IPS_NORMAL);\n\t}\nexit:\n\treturn ret;\n\n}\n\n#ifdef CONFIG_IOL\n#include <rtw_iol.h>\n#endif\n\n#ifdef DBG_CMD_QUEUE\nu8 dump_cmd_id=0;\n#endif\nstatic int rtw_dbg_port(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\t\n\t_irqL irqL;\n\tint ret = 0;\n\tu8 major_cmd, minor_cmd;\n\tu16 arg;\n\tu32 extra_arg, *pdata, val32;\n\tstruct sta_info *psta;\t\t\t\t\t\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\tstruct wlan_network *cur_network = &(pmlmepriv->cur_network);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\n\n\tpdata = (u32*)&wrqu->data;\t\n\n\tval32 = *pdata;\n\targ = (u16)(val32&0x0000ffff);\n\tmajor_cmd = (u8)(val32>>24);\n\tminor_cmd = (u8)((val32>>16)&0x00ff);\n\n\textra_arg = *(pdata+1);\n\t\n\tswitch(major_cmd)\n\t{\n\t\tcase 0x70://read_reg\n\t\t\tswitch(minor_cmd)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tDBG_871X(\"rtw_read8(0x%x)=0x%02x\\n\", arg, rtw_read8(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tDBG_871X(\"rtw_read16(0x%x)=0x%04x\\n\", arg, rtw_read16(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tDBG_871X(\"rtw_read32(0x%x)=0x%08x\\n\", arg, rtw_read32(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\tbreak;\n\t\tcase 0x71://write_reg\n\t\t\tswitch(minor_cmd)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\trtw_write8(padapter, arg, extra_arg);\n\t\t\t\t\tDBG_871X(\"rtw_write8(0x%x)=0x%02x\\n\", arg, rtw_read8(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\trtw_write16(padapter, arg, extra_arg);\n\t\t\t\t\tDBG_871X(\"rtw_write16(0x%x)=0x%04x\\n\", arg, rtw_read16(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\trtw_write32(padapter, arg, extra_arg);\n\t\t\t\t\tDBG_871X(\"rtw_write32(0x%x)=0x%08x\\n\", arg, rtw_read32(padapter, arg));\n\t\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\tbreak;\n\t\tcase 0x72://read_bb\n\t\t\tDBG_871X(\"read_bbreg(0x%x)=0x%x\\n\", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff));\n\t\t\tbreak;\n\t\tcase 0x73://write_bb\n\t\t\trtw_hal_write_bbreg(padapter, arg, 0xffffffff, extra_arg);\n\t\t\tDBG_871X(\"write_bbreg(0x%x)=0x%x\\n\", arg, rtw_hal_read_bbreg(padapter, arg, 0xffffffff));\n\t\t\tbreak;\n\t\tcase 0x74://read_rf\n\t\t\tDBG_871X(\"read RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\\n\",minor_cmd,arg,rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff));\t\n\t\t\tbreak;\n\t\tcase 0x75://write_rf\n\t\t\trtw_hal_write_rfreg(padapter, minor_cmd, arg, 0xffffffff, extra_arg);\n\t\t\tDBG_871X(\"write RF_reg path(0x%02x),offset(0x%x),value(0x%08x)\\n\",minor_cmd,arg, rtw_hal_read_rfreg(padapter, minor_cmd, arg, 0xffffffff));\n\t\t\tbreak;\t\n\n\t\tcase 0x76:\n\t\t\tswitch(minor_cmd)\n\t\t\t{\n\t\t\t\tcase 0x00: //normal mode, \n\t\t\t\t\tpadapter->recvpriv.is_signal_dbg = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x01: //dbg mode\n\t\t\t\t\tpadapter->recvpriv.is_signal_dbg = 1;\n\t\t\t\t\textra_arg = extra_arg>100?100:extra_arg;\n\t\t\t\t\tpadapter->recvpriv.signal_strength_dbg=extra_arg;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x78: //IOL test\n\t\t\tswitch(minor_cmd)\n\t\t\t{\n\t\t\t\t#ifdef CONFIG_IOL\n\t\t\t\tcase 0x04: //LLT table initialization test\n\t\t\t\t{\n\t\t\t\t\tu8 page_boundary = 0xf9;\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_frame\t*xmit_frame;\n\n\t\t\t\t\t\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {\n\t\t\t\t\t\t\tret = -ENOMEM;\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\trtw_IOL_append_LLT_cmd(xmit_frame, page_boundary);\n\n\n\t\t\t\t\t\tif(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 500,0) )\n\t\t\t\t\t\t\tret = -EPERM;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x05: //blink LED test\n\t\t\t\t{\n\t\t\t\t\tu16 reg = 0x4c;\n\t\t\t\t\tu32 blink_num = 50;\n\t\t\t\t\tu32 blink_delay_ms = 200;\n\t\t\t\t\tint i;\n\t\t\t\t\t\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_frame\t*xmit_frame;\n\n\t\t\t\t\t\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {\n\t\t\t\t\t\t\tret = -ENOMEM;\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor(i=0;i<blink_num;i++){\n\t\t\t\t\t\t\t#ifdef CONFIG_IOL_NEW_GENERATION\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, 0x00,0xff);\n\t\t\t\t\t\t\trtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, 0x08,0xff);\n\t\t\t\t\t\t\trtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, 0x00);\n\t\t\t\t\t\t\trtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, 0x08);\n\t\t\t\t\t\t\trtw_IOL_append_DELAY_MS_cmd(xmit_frame, blink_delay_ms);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, (blink_delay_ms*blink_num*2)+200,0) )\n\t\t\t\t\t\t\tret = -EPERM;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 0x06: //continuous wirte byte test\n\t\t\t\t{\n\t\t\t\t\tu16 reg = arg;\n\t\t\t\t\tu16 start_value = 0;\n\t\t\t\t\tu32 write_num = extra_arg;\n\t\t\t\t\tint i;\n\t\t\t\t\tu8 final;\n\t\t\t\t\t\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_frame\t*xmit_frame;\n\n\t\t\t\t\t\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {\n\t\t\t\t\t\t\tret = -ENOMEM;\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor(i=0;i<write_num;i++){\n\t\t\t\t\t\t\t#ifdef CONFIG_IOL_NEW_GENERATION\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, i+start_value,0xFF);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\trtw_IOL_append_WB_cmd(xmit_frame, reg, i+start_value);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(_SUCCESS != rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000,0))\n\t\t\t\t\t\t\tret = -EPERM;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(start_value+write_num-1 == (final=rtw_read8(padapter, reg)) ) {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WB_REG to 0x%x %u times Success, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WB_REG to 0x%x %u times Fail, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 0x07: //continuous wirte word test\n\t\t\t\t{\n\t\t\t\t\tu16 reg = arg;\n\t\t\t\t\tu16 start_value = 200;\n\t\t\t\t\tu32 write_num = extra_arg;\n\t\t\t\t\n\t\t\t\t\tint i;\n\t\t\t\t\tu16 final;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_frame\t*xmit_frame;\n\n\t\t\t\t\t\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {\n\t\t\t\t\t\t\tret = -ENOMEM;\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor(i=0;i<write_num;i++){\n\t\t\t\t\t\t\t#ifdef CONFIG_IOL_NEW_GENERATION\n\t\t\t\t\t\t\trtw_IOL_append_WW_cmd(xmit_frame, reg, i+start_value,0xFFFF);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\trtw_IOL_append_WW_cmd(xmit_frame, reg, i+start_value);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(_SUCCESS !=rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000,0))\n\t\t\t\t\t\t\tret = -EPERM;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(start_value+write_num-1 == (final=rtw_read16(padapter, reg)) ) {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WW_REG to 0x%x %u times Success, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WW_REG to 0x%x %u times Fail, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase 0x08: //continuous wirte dword test\n\t\t\t\t{\n\t\t\t\t\tu16 reg = arg;\n\t\t\t\t\tu32 start_value = 0x110000c7;\n\t\t\t\t\tu32 write_num = extra_arg;\n\t\t\t\t\n\t\t\t\t\tint i;\n\t\t\t\t\tu32 final;\n\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_frame\t*xmit_frame;\n\n\t\t\t\t\t\tif((xmit_frame=rtw_IOL_accquire_xmit_frame(padapter)) == NULL) {\n\t\t\t\t\t\t\tret = -ENOMEM;\t\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor(i=0;i<write_num;i++){\n\t\t\t\t\t\t\t#ifdef CONFIG_IOL_NEW_GENERATION\n\t\t\t\t\t\t\trtw_IOL_append_WD_cmd(xmit_frame, reg, i+start_value,0xFFFFFFFF);\n\t\t\t\t\t\t\t#else\n\t\t\t\t\t\t\trtw_IOL_append_WD_cmd(xmit_frame, reg, i+start_value);\n\t\t\t\t\t\t\t#endif\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(_SUCCESS !=rtw_IOL_exec_cmds_sync(padapter, xmit_frame, 5000,0))\n\t\t\t\t\t\t\tret = -EPERM;\n\t\t\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif(start_value+write_num-1 == (final=rtw_read32(padapter, reg)) ) {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WD_REG to 0x%x %u times Success, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDBG_871X(\"continuous IOL_CMD_WD_REG to 0x%x %u times Fail, start:%u, final:%u\\n\", reg, write_num, start_value, final);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t#endif //CONFIG_IOL\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x79:\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t* dbg 0x79000000 [value], set RESP_TXAGC to + value, value:0~15\n\t\t\t\t* dbg 0x79010000 [value], set RESP_TXAGC to - value, value:0~15\n\t\t\t\t*/\n\t\t\t\tu8 value =  extra_arg & 0x0f;\n\t\t\t\tu8 sign = minor_cmd;\n\t\t\t\tu16 write_value = 0;\n\n\t\t\t\tDBG_871X(\"%s set RESP_TXAGC to %s %u\\n\", __func__, sign?\"minus\":\"plus\", value);\n\n\t\t\t\tif (sign)\n\t\t\t\t\tvalue = value | 0x10;\n\n\t\t\t\twrite_value = value | (value << 5);\n\t\t\t\trtw_write16(padapter, 0x6d9, write_value);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x7a:\n\t\t\treceive_disconnect(padapter, pmlmeinfo->network.MacAddress\n\t\t\t\t, WLAN_REASON_EXPIRATION_CHK);\n\t\t\tbreak;\n\t\tcase 0x7F:\n\t\t\tswitch(minor_cmd)\n\t\t\t{\n\t\t\t\tcase 0x0:\n\t\t\t\t\tDBG_871X(\"fwstate=0x%x\\n\", get_fwstate(pmlmepriv));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x01:\n\t\t\t\t\tDBG_871X(\"auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\\n\", \n\t\t\t\t\t\tpsecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,\n\t\t\t\t\t\tpsecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x02:\n\t\t\t\t\tDBG_871X(\"pmlmeinfo->state=0x%x\\n\", pmlmeinfo->state);\n\t\t\t\t\tDBG_871X(\"DrvBcnEarly=%d\\n\", pmlmeext->DrvBcnEarly);\n\t\t\t\t\tDBG_871X(\"DrvBcnTimeOut=%d\\n\", pmlmeext->DrvBcnTimeOut);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x03:\n\t\t\t\t\tDBG_871X(\"qos_option=%d\\n\", pmlmepriv->qospriv.qos_option);\n#ifdef CONFIG_80211N_HT\n\t\t\t\t\tDBG_871X(\"ht_option=%d\\n\", pmlmepriv->htpriv.ht_option);\n#endif //CONFIG_80211N_HT\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x04:\n\t\t\t\t\tDBG_871X(\"cur_ch=%d\\n\", pmlmeext->cur_channel);\n\t\t\t\t\tDBG_871X(\"cur_bw=%d\\n\", pmlmeext->cur_bwmode);\n\t\t\t\t\tDBG_871X(\"cur_ch_off=%d\\n\", pmlmeext->cur_ch_offset);\n\n\t\t\t\t\tDBG_871X(\"oper_ch=%d\\n\", rtw_get_oper_ch(padapter));\n\t\t\t\t\tDBG_871X(\"oper_bw=%d\\n\", rtw_get_oper_bw(padapter));\n\t\t\t\t\tDBG_871X(\"oper_ch_offet=%d\\n\", rtw_get_oper_choffset(padapter));\n\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x05:\n\t\t\t\t\tpsta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);\n\t\t\t\t\tif(psta)\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"SSID=%s\\n\", cur_network->network.Ssid.Ssid);\n\t\t\t\t\t\tDBG_871X(\"sta's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(psta->hwaddr));\n\t\t\t\t\t\tDBG_871X(\"cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\\n\", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);\n\t\t\t\t\t\tDBG_871X(\"rtsen=%d, cts2slef=%d\\n\", psta->rtsen, psta->cts2self);\n\t\t\t\t\t\tDBG_871X(\"state=0x%x, aid=%d, macid=%d, raid=%d\\n\", psta->state, psta->aid, psta->mac_id, psta->raid);\n#ifdef CONFIG_80211N_HT\n\t\t\t\t\t\tDBG_871X(\"qos_en=%d, ht_en=%d, init_rate=%d\\n\", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);\n\t\t\t\t\t\tDBG_871X(\"bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\\n\", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);\n\t\t\t\t\t\tDBG_871X(\"ampdu_enable = %d\\n\", psta->htpriv.ampdu_enable);\t\n\t\t\t\t\t\tDBG_871X(\"agg_enable_bitmap=%x, candidate_tid_bitmap=%x\\n\", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);\n#endif //CONFIG_80211N_HT\n\n\t\t\t\t\t\tsta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t\tDBG_871X(\"can't get sta's macaddr, cur_network's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(cur_network->network.MacAddress));\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x06:\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x07:\n\t\t\t\t\tDBG_871X(\"bSurpriseRemoved=%s, bDriverStopped=%s\\n\"\n\t\t\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x08:\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\t\t\t\t\t\tstruct recv_priv  *precvpriv = &padapter->recvpriv;\n\t\t\t\t\t\t\n\t\t\t\t\t\tDBG_871X(\"free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\"\n\t\t\t\t\t\t\t\", free_xmit_extbuf_cnt=%d, free_xframe_ext_cnt=%d\"\n\t\t\t\t\t\t\t\", free_recvframe_cnt=%d\\n\",\n\t\t\t\t\t\t\tpxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt,\n\t\t\t\t\t\t\tpxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt,\n\t\t\t\t\t\t\tprecvpriv->free_recvframe_cnt);\n\t\t\t\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\t\t\t\tDBG_871X(\"rx_urb_pending_cn=%d\\n\", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));\n\t\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\t\n\t\t\t\tcase 0x09:\n\t\t\t\t\t{\n\t\t\t\t\t\tint i;\n\t\t\t\t\t\t_list\t*plist, *phead;\n\t\t\t\t\t\t\n#ifdef CONFIG_AP_MODE\n\t\t\t\t\t\tDBG_871X(\"sta_dz_bitmap=0x%x, tim_bitmap=0x%x\\n\", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);\n#endif\t\t\t\t\t\t\n\t\t\t\t\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\t\t\t\t\tfor(i=0; i< NUM_STA; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tphead = &(pstapriv->sta_hash[i]);\n\t\t\t\t\t\t\tplist = get_next(phead);\n\t\t\n\t\t\t\t\t\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\n\t\t\t\t\t\t\t\tplist = get_next(plist);\n\n\t\t\t\t\t\t\t\tif(extra_arg == psta->aid)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tDBG_871X(\"sta's macaddr:\" MAC_FMT \"\\n\", MAC_ARG(psta->hwaddr));\n\t\t\t\t\t\t\t\t\tDBG_871X(\"rtsen=%d, cts2slef=%d\\n\", psta->rtsen, psta->cts2self);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"state=0x%x, aid=%d, macid=%d, raid=%d\\n\", psta->state, psta->aid, psta->mac_id, psta->raid);\n#ifdef CONFIG_80211N_HT\n\t\t\t\t\t\t\t\t\tDBG_871X(\"qos_en=%d, ht_en=%d, init_rate=%d\\n\", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);\t\n\t\t\t\t\t\t\t\t\tDBG_871X(\"bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\\n\", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"ampdu_enable = %d\\n\", psta->htpriv.ampdu_enable);\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tDBG_871X(\"agg_enable_bitmap=%x, candidate_tid_bitmap=%x\\n\", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);\n#endif //CONFIG_80211N_HT\n\t\t\t\t\t\t\t\t\t\n#ifdef CONFIG_AP_MODE\n\t\t\t\t\t\t\t\t\tDBG_871X(\"capability=0x%x\\n\", psta->capability);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"flags=0x%x\\n\", psta->flags);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"wpa_psk=0x%x\\n\", psta->wpa_psk);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"wpa2_group_cipher=0x%x\\n\", psta->wpa2_group_cipher);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"wpa2_pairwise_cipher=0x%x\\n\", psta->wpa2_pairwise_cipher);\n\t\t\t\t\t\t\t\t\tDBG_871X(\"qos_info=0x%x\\n\", psta->qos_info);\n#endif\n\t\t\t\t\t\t\t\t\tDBG_871X(\"dot118021XPrivacy=0x%x\\n\", psta->dot118021XPrivacy);\n\n\t\t\t\t\t\t\t\t\tsta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta);\n\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0a:\n\t\t\t\t\t{\n\t\t\t\t\t\tint max_mac_id = 0;\n\t\t\t\t\t\tmax_mac_id = rtw_search_max_mac_id( padapter);\n\t\t\t\t\t\tprintk(\"%s ==> max_mac_id = %d \\n\",__FUNCTION__,max_mac_id);\n\t\t\t\t\t}\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0b: //Enable=1, Disable=0 driver control vrtl_carrier_sense.\n\t\t\t\t\t{\n\t\t\t\t\t\t//u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.\n\t\t\t\t\t\t//u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.\n\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"disable driver ctrl vcs\\n\");\t\t\t\t\t\t\n\t\t\t\t\t\t\tpadapter->driver_vcs_en = 0;\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"enable driver ctrl vcs = %d\\n\", extra_arg);\n\t\t\t\t\t\t\tpadapter->driver_vcs_en = 1;\n\t\n\t\t\t\t\t\t\tif(extra_arg>2)\n\t\t\t\t\t\t\t\tpadapter->driver_vcs_type = 1;\t\t\t\t\t\t\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpadapter->driver_vcs_type = extra_arg;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0c://dump rx/tx packet\n\t\t\t\t\t{\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"dump rx packet (%d)\\n\",extra_arg);\t\t\t\t\t\t\n\t\t\t\t\t\t\t//pHalData->bDumpRxPkt =extra_arg;\t\t\t\t\t\t\n\t\t\t\t\t\t\trtw_hal_set_def_var(padapter, HAL_DEF_DBG_DUMP_RXPKT, &(extra_arg));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg==1){\n\t\t\t\t\t\t\tDBG_871X(\"dump tx packet (%d)\\n\",extra_arg);\t\t\t\t\t\t\n\t\t\t\t\t\t\trtw_hal_set_def_var(padapter, HAL_DEF_DBG_DUMP_TXPKT, &(extra_arg));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0e:\n\t\t\t\t\t{\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"disable driver ctrl rx_ampdu_factor\\n\");\t\t\t\t\t\t\n\t\t\t\t\t\t\tpadapter->driver_rx_ampdu_factor = 0xFF;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"enable driver ctrl rx_ampdu_factor = %d\\n\", extra_arg);\t\n\t\n\t\t\t\t\t\t\tif(extra_arg > 0x03)\n\t\t\t\t\t\t\t\tpadapter->driver_rx_ampdu_factor = 0xFF;\t\t\t\t\t\t\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpadapter->driver_rx_ampdu_factor = extra_arg;\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t#ifdef DBG_CONFIG_ERROR_DETECT\n\t\t\t\tcase 0x0f:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(extra_arg == 0){\t\n\t\t\t\t\t\t\t\tDBG_871X(\"###### silent reset test.......#####\\n\");\n\t\t\t\t\t\t\t\trtw_hal_sreset_reset(padapter);\t\t\t\t\t\t\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\t\t\t\t\t\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n\t\t\t\t\t\t\t\tpsrtpriv->dbg_trigger_point = extra_arg;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x15:\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\t\t\t\t\t\tDBG_871X(\"==>silent resete cnts:%d\\n\",pwrpriv->ips_enter_cnts);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\t\n\t\t\t\t\t\n\t\t#endif\t\n\n\t\t\t\tcase 0x10:// driver version display\n\t\t\t\t\tdump_drv_version(RTW_DBGDUMP);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x11://dump linked status\n\t\t\t\t\t{\n\t\t\t\t\t\tint pre_mode;\n\t\t\t\t\t\tpre_mode=padapter->bLinkInfoDump;\n\t\t\t\t\t\t// linked_info_dump(padapter,extra_arg);\n\t\t\t\t\t\t if(extra_arg==1 || (extra_arg==0 && pre_mode==1) ) //not consider pwr_saving 0:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpadapter->bLinkInfoDump = extra_arg;\t\n\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if( (extra_arg==2 ) || (extra_arg==0 && pre_mode==2))//consider power_saving\n\t\t\t\t\t\t{\t\t\n\t\t\t\t\t\t//DBG_871X(\"linked_info_dump =%s \\n\", (padapter->bLinkInfoDump)?\"enable\":\"disable\")\n\t\t\t\t\t\t\tlinked_info_dump(padapter,extra_arg);\t\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t \n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\tbreak;\n#ifdef CONFIG_80211N_HT\n\t\t\t\tcase 0x12: //set rx_stbc\n\t\t\t\t{\n\t\t\t\t\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\t\t\t\t\t// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, 0x3: enable both 2.4g and 5g\n\t\t\t\t\t//default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ\n\t\t\t\t\tif( pregpriv && (extra_arg == 0 || extra_arg == 1|| extra_arg == 2 || extra_arg == 3))\n\t\t\t\t\t{\n\t\t\t\t\t\tpregpriv->rx_stbc= extra_arg;\n\t\t\t\t\t\tDBG_871X(\"set rx_stbc=%d\\n\",pregpriv->rx_stbc);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBG_871X(\"get rx_stbc=%d\\n\",pregpriv->rx_stbc);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\tcase 0x13: //set ampdu_enable\n\t\t\t\t{\n\t\t\t\t\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\t\t\t\t\t// 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)\n\t\t\t\t\tif( pregpriv && extra_arg < 3 )\n\t\t\t\t\t{\n\t\t\t\t\t\tpregpriv->ampdu_enable= extra_arg;\n\t\t\t\t\t\tDBG_871X(\"set ampdu_enable=%d\\n\",pregpriv->ampdu_enable);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tDBG_871X(\"get ampdu_enable=%d\\n\",pregpriv->ampdu_enable);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif\n\t\t\t\tcase 0x14: //get wifi_spec\n\t\t\t\t{\n\t\t\t\t\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\t\t\t\t\tDBG_871X(\"get wifi_spec=%d\\n\",pregpriv->wifi_spec);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\tcase 0x16:\n\t\t\t\t{\n\t\t\t\t\tif(arg == 0xff){\n\t\t\t\t\t\trtw_odm_dbg_comp_msg(RTW_DBGDUMP,padapter);\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tu64 dbg_comp = (u64)extra_arg;\n\t\t\t\t\t\trtw_odm_dbg_comp_set(padapter, dbg_comp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\tbreak;\n#ifdef DBG_FIXED_CHAN\n\t\t\t\tcase 0x17:\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\t\t\t\t\t\t\n\t\t\t\t\t\tprintk(\"===>  Fixed channel to %d \\n\",extra_arg);\n\t\t\t\t\t\tpmlmeext->fixed_chan = extra_arg;\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#endif\n#ifdef CONFIG_80211N_HT\t\t\t\n\t\t\t\tcase 0x19:\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\t\t\t\t\t\t// extra_arg :\n\t\t\t\t\t\t// BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, \n\t\t\t\t\t\t// BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"driver disable LDPC\\n\");\t\t\t\t\t\t\n\t\t\t\t\t\t\tpregistrypriv->ldpc_cap = 0x00;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"driver set LDPC cap = 0x%x\\n\", extra_arg);\n\t\t\t\t\t\t\tpregistrypriv->ldpc_cap = (u8)(extra_arg&0x33);\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n                                        break;\n\t\t\t\tcase 0x1a:\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\t\t\t\t\t\t// extra_arg :\n\t\t\t\t\t\t// BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, \n\t\t\t\t\t\t// BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"driver disable STBC\\n\");\t\t\t\t\t\t\n\t\t\t\t\t\t\tpregistrypriv->stbc_cap = 0x00;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"driver set STBC cap = 0x%x\\n\", extra_arg);\n\t\t\t\t\t\t\tpregistrypriv->stbc_cap = (u8)(extra_arg&0x33);\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t}\n                                        break;\n#endif //CONFIG_80211N_HT\n\t\t\t\tcase 0x1b:\n\t\t\t\t\t{\t\n\t\t\t\t\t\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"disable driver ctrl max_rx_rate, reset to default_rate_set\\n\");\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tinit_mlme_default_rate_set(padapter);\n#ifdef CONFIG_80211N_HT\t\t\t\t\t\t\n\t\t\t\t\t\t\tpregistrypriv->ht_enable = (u8)rtw_ht_enable;\n#endif //CONFIG_80211N_HT\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\n\n\t\t\t\t\t\t\tint i;\n\t\t\t\t\t\t\tu8 max_rx_rate;\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"enable driver ctrl max_rx_rate = 0x%x\\n\", extra_arg);\t\n\n\t\t\t\t\t\t\tmax_rx_rate = (u8)extra_arg;\n\n\t\t\t\t\t\t\tif(max_rx_rate < 0xc) // max_rx_rate < MSC0 -> B or G -> disable HT\n\t\t\t\t\t\t\t{\n#ifdef CONFIG_80211N_HT\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tpregistrypriv->ht_enable = 0;\n#endif //CONFIG_80211N_HT\n\t\t\t\t\t\t\t\tfor(i=0; i<NumRates; i++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif(pmlmeext->datarate[i] > max_rx_rate)\n\t\t\t\t\t\t\t\t\t\tpmlmeext->datarate[i] = 0xff;\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\t\n\n\t\t\t\t\t\t\t}\n#ifdef CONFIG_80211N_HT\t\n\t\t\t\t\t\t\telse if(max_rx_rate < 0x1c) // mcs0~mcs15\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tu32 mcs_bitmap=0x0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tfor(i=0; i<((max_rx_rate+1)-0xc); i++)\n\t\t\t\t\t\t\t\t\tmcs_bitmap |= BIT(i);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tset_mcs_rate_by_mask(pmlmeext->default_supported_mcs_set, mcs_bitmap);\n\t\t\t\t\t\t\t}\n#endif //CONFIG_80211N_HT\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t}\n                                        break;\n\t\t\t\tcase 0x1c: //enable/disable driver control AMPDU Density for peer sta's rx\n\t\t\t\t\t{\n\t\t\t\t\t\tif(arg == 0){\n\t\t\t\t\t\t\tDBG_871X(\"disable driver ctrl ampdu density\\n\");\t\t\t\t\t\t\n\t\t\t\t\t\t\tpadapter->driver_ampdu_spacing = 0xFF;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(arg == 1){\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tDBG_871X(\"enable driver ctrl ampdu density = %d\\n\", extra_arg);\t\n\t\n\t\t\t\t\t\t\tif(extra_arg > 0x07)\n\t\t\t\t\t\t\t\tpadapter->driver_ampdu_spacing = 0xFF;\t\t\t\t\t\t\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tpadapter->driver_ampdu_spacing = extra_arg;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#ifdef CONFIG_BACKGROUND_NOISE_MONITOR\n\t\t\t\tcase 0x1e:\n\t\t\t\t\t{\n\t\t\t\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\t\t\t\tPDM_ODM_T pDM_Odm = &pHalData->odmpriv;\n\t\t\t\t\t\tu8 chan = rtw_get_oper_ch(padapter);\n\t\t\t\t\t\tDBG_871X(\"===========================================\\n\");\n\t\t\t\t\t\tODM_InbandNoise_Monitor(pDM_Odm,_TRUE,0x1e,100);\n\t\t\t\t\t\tDBG_871X(\"channel(%d),noise_a = %d, noise_b = %d , noise_all:%d \\n\", \n\t\t\t\t\t\t\tchan,pDM_Odm->noise_level.noise[ODM_RF_PATH_A], \n\t\t\t\t\t\t\tpDM_Odm->noise_level.noise[ODM_RF_PATH_B],\n\t\t\t\t\t\t\tpDM_Odm->noise_level.noise_all);\n\t\t\t\t\t\tDBG_871X(\"===========================================\\n\");\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#endif\n\t\t\t\tcase 0x23:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"turn %s the bNotifyChannelChange Variable\\n\",(extra_arg==1)?\"on\":\"off\");\n\t\t\t\t\t\tpadapter->bNotifyChannelChange = extra_arg;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase 0x24:\n\t\t\t\t\t{\n#ifdef CONFIG_P2P\n\t\t\t\t\t\tDBG_871X(\"turn %s the bShowGetP2PState Variable\\n\",(extra_arg==1)?\"on\":\"off\");\n\t\t\t\t\t\tpadapter->bShowGetP2PState = extra_arg;\n#endif // CONFIG_P2P\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\n\t\t\t\t\t}\n#ifdef CONFIG_GPIO_API              \n\t\t            case 0x25: //Get GPIO register\n\t\t                    {\n\t\t\t                    /*\n\t\t\t                    * dbg 0x7f250000 [gpio_num], Get gpio value, gpio_num:0~7\n\t\t\t                    */                \n                              \n\t\t\t                    u8 value;\n\t\t\t                    DBG_871X(\"Read GPIO Value  extra_arg = %d\\n\",extra_arg);\n\t\t\t                    value = rtw_hal_get_gpio(padapter,extra_arg);\n\t\t\t                    DBG_871X(\"Read GPIO Value = %d\\n\",value);                                        \n\t\t\t                    break;\n\t\t                    }\n\t\t            case 0x26: //Set GPIO direction\n\t\t                    {\n                                       \t\t\t\t\t\t\n\t\t\t                    /* dbg 0x7f26000x [y], Set gpio direction, \n\t\t\t                    * x: gpio_num,4~7  y: indicate direction, 0~1  \n\t\t\t                    */ \n                                        \n\t\t\t                    int value;\n\t\t\t                    DBG_871X(\"Set GPIO Direction! arg = %d ,extra_arg=%d\\n\",arg ,extra_arg);\n\t\t\t                    value = rtw_hal_config_gpio(padapter, arg, extra_arg);\n\t\t\t                    DBG_871X(\"Set GPIO Direction %s \\n\",(value==-1)?\"Fail!!!\":\"Success\");\n\t\t\t                    break;\n\t\t\t\t\t}\n\t\t\t\tcase 0x27: //Set GPIO output direction value\n\t\t\t\t\t{\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t* dbg 0x7f27000x [y], Set gpio output direction value, \n \t\t\t\t\t\t* x: gpio_num,4~7  y: indicate direction, 0~1  \n\t\t\t\t\t\t*/ \n                                        \n\t\t\t\t\t\tint value;\n\t\t\t\t\t\tDBG_871X(\"Set GPIO Value! arg = %d ,extra_arg=%d\\n\",arg ,extra_arg);\n\t\t\t\t\t\tvalue = rtw_hal_set_gpio_output_value(padapter,arg,extra_arg);\n\t\t\t\t\t\tDBG_871X(\"Set GPIO Value %s \\n\",(value==-1)?\"Fail!!!\":\"Success\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#endif          \n#ifdef DBG_CMD_QUEUE\n\t\t\t\tcase 0x28:\n\t\t\t\t\t{\n\t\t\t\t\t\tdump_cmd_id = extra_arg;\n\t\t\t\t\t\tDBG_871X(\"dump_cmd_id:%d\\n\",dump_cmd_id);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n#endif //DBG_CMD_QUEUE\n\t\t\t\tcase 0xaa:\n\t\t\t\t\t{\n\t\t\t\t\t\tif((extra_arg & 0x7F)> 0x3F) extra_arg = 0xFF;\n\t\t\t\t\t\tDBG_871X(\"chang data rate to :0x%02x\\n\",extra_arg);\n\t\t\t\t\t\tpadapter->fix_rate = extra_arg;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\t\n\t\t\t\tcase 0xdd://registers dump , 0 for mac reg,1 for bb reg, 2 for rf reg\n\t\t\t\t\t{\n\t\t\t\t\t\tif(extra_arg==0){\n\t\t\t\t\t\t\tmac_reg_dump(RTW_DBGDUMP, padapter);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(extra_arg==1){\n\t\t\t\t\t\t\tbb_reg_dump(RTW_DBGDUMP, padapter);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(extra_arg==2){\n\t\t\t\t\t\t\trf_reg_dump(RTW_DBGDUMP, padapter);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\t\t\n\n\t\t\t\tcase 0xee:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\" === please control /proc  to trun on/off PHYDM func === \\n\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 0xfd:\n\t\t\t\t\trtw_write8(padapter, 0xc50, arg);\n\t\t\t\t\tDBG_871X(\"wr(0xc50)=0x%x\\n\", rtw_read8(padapter, 0xc50));\n\t\t\t\t\trtw_write8(padapter, 0xc58, arg);\n\t\t\t\t\tDBG_871X(\"wr(0xc58)=0x%x\\n\", rtw_read8(padapter, 0xc58));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xfe:\n\t\t\t\t\tDBG_871X(\"rd(0xc50)=0x%x\\n\", rtw_read8(padapter, 0xc50));\n\t\t\t\t\tDBG_871X(\"rd(0xc58)=0x%x\\n\", rtw_read8(padapter, 0xc58));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0xff:\n\t\t\t\t\t{\n\t\t\t\t\t\tDBG_871X(\"dbg(0x210)=0x%x\\n\", rtw_read32(padapter, 0x210));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x608)=0x%x\\n\", rtw_read32(padapter, 0x608));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x280)=0x%x\\n\", rtw_read32(padapter, 0x280));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x284)=0x%x\\n\", rtw_read32(padapter, 0x284));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x288)=0x%x\\n\", rtw_read32(padapter, 0x288));\n\t\n\t\t\t\t\t\tDBG_871X(\"dbg(0x664)=0x%x\\n\", rtw_read32(padapter, 0x664));\n\n\n\t\t\t\t\t\tDBG_871X(\"\\n\");\n\t\t\n\t\t\t\t\t\tDBG_871X(\"dbg(0x430)=0x%x\\n\", rtw_read32(padapter, 0x430));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x438)=0x%x\\n\", rtw_read32(padapter, 0x438));\n\n\t\t\t\t\t\tDBG_871X(\"dbg(0x440)=0x%x\\n\", rtw_read32(padapter, 0x440));\n\t\n\t\t\t\t\t\tDBG_871X(\"dbg(0x458)=0x%x\\n\", rtw_read32(padapter, 0x458));\n\t\n\t\t\t\t\t\tDBG_871X(\"dbg(0x484)=0x%x\\n\", rtw_read32(padapter, 0x484));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x488)=0x%x\\n\", rtw_read32(padapter, 0x488));\n\t\n\t\t\t\t\t\tDBG_871X(\"dbg(0x444)=0x%x\\n\", rtw_read32(padapter, 0x444));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x448)=0x%x\\n\", rtw_read32(padapter, 0x448));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x44c)=0x%x\\n\", rtw_read32(padapter, 0x44c));\n\t\t\t\t\t\tDBG_871X(\"dbg(0x450)=0x%x\\n\", rtw_read32(padapter, 0x450));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDBG_871X(\"error dbg cmd!\\n\");\n\t\t\tbreak;\t\n\t}\n\t\n\n\treturn ret;\n\n}\n\nstatic int wpa_set_param(struct net_device *dev, u8 name, u32 value)\n{\n\tuint ret=0;\n\tu32 flags;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t\n\tswitch (name){\n\tcase IEEE_PARAM_WPA_ENABLED:\n\n\t\tpadapter->securitypriv.dot11AuthAlgrthm= dot11AuthAlgrthm_8021X; //802.1x\n\t\t\n\t\t//ret = ieee80211_wpa_enable(ieee, value);\n\t\t\n\t\tswitch((value)&0xff)\n\t\t{\n\t\t\tcase 1 : //WPA\n\t\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPAPSK; //WPA_PSK\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled;\n\t\t\t\tbreak;\n\t\t\tcase 2: //WPA2\n\t\t\tpadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPA2PSK; //WPA2_PSK\n\t\t\tpadapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tRT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,(\"wpa_set_param:padapter->securitypriv.ndisauthtype=%d\\n\", padapter->securitypriv.ndisauthtype));\n\t\t\n\t\tbreak;\n\n\tcase IEEE_PARAM_TKIP_COUNTERMEASURES:\n\t\t//ieee->tkip_countermeasures=value;\n\t\tbreak;\n\n\tcase IEEE_PARAM_DROP_UNENCRYPTED: \n\t{\n\t\t/* HACK:\n\t\t *\n\t\t * wpa_supplicant calls set_wpa_enabled when the driver\n\t\t * is loaded and unloaded, regardless of if WPA is being\n\t\t * used.  No other calls are made which can be used to\n\t\t * determine if encryption will be used or not prior to\n\t\t * association being expected.  If encryption is not being\n\t\t * used, drop_unencrypted is set to false, else true -- we\n\t\t * can use this to determine if the CAP_PRIVACY_ON bit should\n\t\t * be set.\n\t\t */\n\t\t \n#if 0\t \n\t\tstruct ieee80211_security sec = {\n\t\t\t.flags = SEC_ENABLED,\n\t\t\t.enabled = value,\n\t\t};\n \t\tieee->drop_unencrypted = value;\n\t\t/* We only change SEC_LEVEL for open mode. Others\n\t\t * are set by ipw_wpa_set_encryption.\n\t\t */\n\t\tif (!value) {\n\t\t\tsec.flags |= SEC_LEVEL;\n\t\t\tsec.level = SEC_LEVEL_0;\n\t\t}\n\t\telse {\n\t\t\tsec.flags |= SEC_LEVEL;\n\t\t\tsec.level = SEC_LEVEL_1;\n\t\t}\n\t\tif (ieee->set_security)\n\t\t\tieee->set_security(ieee->dev, &sec);\n#endif\t\t\n\t\tbreak;\n\n\t}\n\tcase IEEE_PARAM_PRIVACY_INVOKED:\t\n\t\t\n\t\t//ieee->privacy_invoked=value;\n\t\t\n\t\tbreak;\n\n\tcase IEEE_PARAM_AUTH_ALGS:\n\t\t\n\t\tret = wpa_set_auth_algs(dev, value);\n\t\t\n\t\tbreak;\n\n\tcase IEEE_PARAM_IEEE_802_1X:\n\t\t\n\t\t//ieee->ieee802_1x=value;\t\t\n\t\t\n\t\tbreak;\n\t\t\n\tcase IEEE_PARAM_WPAX_SELECT:\n\t\t\n\t\t// added for WPA2 mixed mode\n\t\t//DBG_871X(KERN_WARNING \"------------------------>wpax value = %x\\n\", value);\n\t\t/*\n\t\tspin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);\n\t\tieee->wpax_type_set = 1;\n\t\tieee->wpax_type_notify = value;\n\t\tspin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);\n\t\t*/\n\t\t\n\t\tbreak;\n\n\tdefault:\t\t\n\n\n\t\t\n\t\tret = -EOPNOTSUPP;\n\n\t\t\n\t\tbreak;\n\t\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int wpa_mlme(struct net_device *dev, u32 command, u32 reason)\n{\t\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tswitch (command)\n\t{\n\t\tcase IEEE_MLME_STA_DEAUTH:\n\n\t\t\tif(!rtw_set_802_11_disassociate(padapter))\n\t\t\t\tret = -1;\t\t\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase IEEE_MLME_STA_DISASSOC:\n\t\t\n\t\t\tif(!rtw_set_802_11_disassociate(padapter))\n\t\t\t\tret = -1;\t\t\n\t\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tret = -EOPNOTSUPP;\n\t\t\tbreak;\n\t}\n\n\treturn ret;\n\t\n}\n\nstatic int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p)\n{\n\tstruct ieee_param *param;\n\tuint ret=0;\n\n\t//down(&ieee->wx_sem);\t\n\n\tif (p->length < sizeof(struct ieee_param) || !p->pointer){\n\t\tret = -EINVAL;\n\t\tgoto out;\n\t}\n\t\n\tparam = (struct ieee_param *)rtw_malloc(p->length);\n\tif (param == NULL)\n\t{\n\t\tret = -ENOMEM;\n\t\tgoto out;\n\t}\n\t\n\tif (copy_from_user(param, p->pointer, p->length))\n\t{\n\t\trtw_mfree((u8*)param, p->length);\n\t\tret = -EFAULT;\n\t\tgoto out;\n\t}\n\n\tswitch (param->cmd) {\n\n\tcase IEEE_CMD_SET_WPA_PARAM:\n\t\tret = wpa_set_param(dev, param->u.wpa_param.name, param->u.wpa_param.value);\n\t\tbreak;\n\n\tcase IEEE_CMD_SET_WPA_IE:\n\t\t//ret = wpa_set_wpa_ie(dev, param, p->length);\n\t\tret =  rtw_set_wpa_ie((_adapter *)rtw_netdev_priv(dev), (char*)param->u.wpa_ie.data, (u16)param->u.wpa_ie.len);\n\t\tbreak;\n\n\tcase IEEE_CMD_SET_ENCRYPTION:\n\t\tret = wpa_set_encryption(dev, param, p->length);\n\t\tbreak;\n\n\tcase IEEE_CMD_MLME:\n\t\tret = wpa_mlme(dev, param->u.mlme.command, param->u.mlme.reason_code);\n\t\tbreak;\n\n\tdefault:\n\t\tDBG_871X(\"Unknown WPA supplicant request: %d\\n\", param->cmd);\n\t\tret = -EOPNOTSUPP;\n\t\tbreak;\n\t\t\n\t}\n\n\tif (ret == 0 && copy_to_user(p->pointer, param, p->length))\n\t\tret = -EFAULT;\n\n\trtw_mfree((u8 *)param, p->length);\n\t\nout:\n\t\n\t//up(&ieee->wx_sem);\n\t\n\treturn ret;\n\t\n}\n\n#ifdef CONFIG_AP_MODE\nstatic int rtw_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)\n{\n\tint ret = 0;\n\tu32 wep_key_idx, wep_key_len,wep_total_len;\n\tNDIS_802_11_WEP\t *pwep = NULL;\n\tstruct sta_info *psta = NULL, *pbcmc_sta = NULL;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tparam->u.crypt.err = 0;\n\tparam->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\\0';\n\n\t//sizeof(struct ieee_param) = 64 bytes;\n\t//if (param_len !=  (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len)\n\tif (param_len !=  sizeof(struct ieee_param) + param->u.crypt.key_len)\n\t{\n\t\tret =  -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\tif (param->u.crypt.idx >= WEP_KEYS\n#ifdef CONFIG_IEEE80211W\n\t\t\t&& param->u.crypt.idx > BIP_MAX_KEYID\n#endif /* CONFIG_IEEE80211W */\n\t\t\t)\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\t\n\t}\n\telse \n\t{\t\t\n\t\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\t\tif(!psta)\n\t\t{\n\t\t\t//ret = -EINVAL;\n\t\t\tDBG_871X(\"rtw_set_encryption(), sta has already been removed or never been added\\n\");\n\t\t\tgoto exit;\n\t\t}\t\t\t\n\t}\n\n\tif (strcmp(param->u.crypt.alg, \"none\") == 0 && (psta==NULL))\n\t{\n\t\t//todo:clear default encryption keys\n\n\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;\n\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;\n\t\tpsecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;\n\t\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\n\t\tDBG_871X(\"clear default encryption keys, keyid=%d\\n\", param->u.crypt.idx);\n\t\t\n\t\tgoto exit;\n\t}\n\n\n\tif (strcmp(param->u.crypt.alg, \"WEP\") == 0 && (psta==NULL))\n\t{\t\t\n\t\tDBG_871X(\"r871x_set_encryption, crypt.alg = WEP\\n\");\n\t\t\n\t\twep_key_idx = param->u.crypt.idx;\n\t\twep_key_len = param->u.crypt.key_len;\n\t\t\t\t\t\n\t\tDBG_871X(\"r871x_set_encryption, wep_key_idx=%d, len=%d\\n\", wep_key_idx, wep_key_len);\n\n\t\tif((wep_key_idx >= WEP_KEYS) || (wep_key_len<=0))\n\t\t{\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\t\t\n\n\t\tif (wep_key_len > 0) \n\t\t{\t\t\t\n\t\t \twep_key_len = wep_key_len <= 5 ? 5 : 13;\n\t\t\twep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);\n\t\t \tpwep =(NDIS_802_11_WEP *)rtw_malloc(wep_total_len);\n\t\t\tif(pwep == NULL){\n\t\t\t\tDBG_871X(\" r871x_set_encryption: pwep allocate fail !!!\\n\");\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\t\n\t\t \t_rtw_memset(pwep, 0, wep_total_len);\n\t\t\n\t\t \tpwep->KeyLength = wep_key_len;\n\t\t\tpwep->Length = wep_total_len;\n\t\t\t\n\t\t}\n\t\t\n\t\tpwep->KeyIndex = wep_key_idx;\n\n\t\t_rtw_memcpy(pwep->KeyMaterial,  param->u.crypt.key, pwep->KeyLength);\n\n\t\tif(param->u.crypt.set_tx)\n\t\t{\n\t\t\tDBG_871X(\"wep, set_tx=1\\n\");\n\n\t\t\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;\n\t\t\tpsecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP40_;\n\t\t\tpsecuritypriv->dot118021XGrpPrivacy=_WEP40_;\n\t\t\t\n\t\t\tif(pwep->KeyLength==13)\n\t\t\t{\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm=_WEP104_;\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy=_WEP104_;\n\t\t\t}\n\n\t\t\n\t\t\tpsecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;\n\t\t\t\n\t\t\t_rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);\n\n\t\t\tpsecuritypriv->dot11DefKeylen[wep_key_idx]=pwep->KeyLength;\n\n\t\t\trtw_ap_set_wep_key(padapter, pwep->KeyMaterial, pwep->KeyLength, wep_key_idx, 1);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"wep, set_tx=0\\n\");\n\t\t\t\n\t\t\t//don't update \"psecuritypriv->dot11PrivacyAlgrthm\" and \n\t\t\t//\"psecuritypriv->dot11PrivacyKeyIndex=keyid\", but can rtw_set_key to cam\n\t\t\t\t\t\n\t\t      _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);\n\n\t\t\tpsecuritypriv->dot11DefKeylen[wep_key_idx] = pwep->KeyLength;\t\t\t\n\n\t\t\trtw_ap_set_wep_key(padapter, pwep->KeyMaterial, pwep->KeyLength, wep_key_idx, 0);\n\t\t}\n\n\t\tgoto exit;\n\t\t\n\t}\n\n\t\n\tif(!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) // //group key\n\t{\n\t\tif(param->u.crypt.set_tx ==1)\n\t\t{\n\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, set group_key, WEP\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t{\t\t\t\t\t\t\n\t\t\t\tDBG_871X(\"%s, set group_key, TKIP\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _TKIP_;\n\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t//set mic key\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, set group_key, CCMP\\n\", __FUNCTION__);\n\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _AES_;\n\n\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t}\n#ifdef CONFIG_IEEE80211W\n\t\t\telse if (strcmp(param->u.crypt.alg, \"BIP\") == 0) {\n\t\t\t\tint no;\n\t\t\t\t\n\t\t\t\tDBG_871X(\"BIP key_len=%d , index=%d\\n\", param->u.crypt.key_len, param->u.crypt.idx);\n\t\t\t\t/* save the IGTK key, length 16 bytes */\n\t\t\t\t_rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16:param->u.crypt.key_len));\n\t\t\t\t/* DBG_871X(\"IGTK key below:\\n\");\n\t\t\t\tfor(no=0;no<16;no++)\n\t\t\t\t\tprintk(\" %02x \", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);\n\t\t\t\tDBG_871X(\"\\n\"); */\n\t\t\t\tpadapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;\n\t\t\t\tpadapter->securitypriv.binstallBIPkey = _TRUE;\n\t\t\t\tDBG_871X(\" ~~~~set sta key:IGKT\\n\");\n\t\t\t\tgoto exit;\n\t\t\t}\n#endif /* CONFIG_IEEE80211W */\n\t\t\telse\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s, set group_key, none\\n\", __FUNCTION__);\n\t\t\t\t\n\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\t\t\t}\n\n\t\t\tpsecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;\n\n\t\t\tpsecuritypriv->binstallGrpkey = _TRUE;\n\n\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!\n\t\t\t\t\t\t\t\t\n\t\t\trtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);\n\t\t\t\n\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\tif(pbcmc_sta)\n\t\t\t{\n\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\tpbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy\t\t\t\n\t\t\t}\t\n\t\t\t\t\t\t\n\t\t}\n\n\t\tgoto exit;\n\t\t\n\t}\t\n\n\tif(psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) // psk/802_1x\n\t{\n\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE))\n\t\t{\n\t\t\tif(param->u.crypt.set_tx ==1)\n\t\t\t{ \n\t\t\t\t_rtw_memcpy(psta->dot118021x_UncstKey.skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s, set pairwise key, WEP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _WEP40_;\n\t\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsta->dot118021XPrivacy = _WEP104_;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tDBG_871X(\"%s, set pairwise key, TKIP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _TKIP_;\n\t\t\t\t\n\t\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t\t//set mic key\n\t\t\t\t\t_rtw_memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t_rtw_memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t{\n\n\t\t\t\t\tDBG_871X(\"%s, set pairwise key, CCMP\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _AES_;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s, set pairwise key, none\\n\", __FUNCTION__);\n\t\t\t\t\t\n\t\t\t\t\tpsta->dot118021XPrivacy = _NO_PRIVACY_;\n\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\trtw_ap_set_pairwise_key(padapter, psta);\n\t\t\t\t\t\n\t\t\t\tpsta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\n\t\t\t\tpsta->bpairwise_key_installed = _TRUE;\n\t\t\t\t\t\n\t\t\t}\t\t\t\n\t\t\telse//group key???\n\t\t\t{ \n\t\t\t\tif(strcmp(param->u.crypt.alg, \"WEP\") == 0)\n\t\t\t\t{\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP40_;\n\t\t\t\t\tif(param->u.crypt.key_len==13)\n\t\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _WEP104_;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"TKIP\") == 0)\n\t\t\t\t{\t\t\t\t\t\t\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _TKIP_;\n\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t\n\t\t\t\t\t//DEBUG_ERR(\"set key length :param->u.crypt.key_len=%d\\n\", param->u.crypt.key_len);\n\t\t\t\t\t//set mic key\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8);\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8);\n\n\t\t\t\t\tpsecuritypriv->busetkipkey = _TRUE;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse if(strcmp(param->u.crypt.alg, \"CCMP\") == 0)\n\t\t\t\t{\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _AES_;\n\n\t\t\t\t\t_rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\t\t\t\t}\n\n\t\t\t\tpsecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;\n\n\t\t\t\tpsecuritypriv->binstallGrpkey = _TRUE;\t\n\t\t\t\t\t\t\t\t\n\t\t\t\tpsecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy;//!!!\n\t\t\t\t\t\t\t\t\n\t\t\t\trtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx);\n\t\t\t\n\t\t\t\tpbcmc_sta=rtw_get_bcmc_stainfo(padapter);\n\t\t\t\tif(pbcmc_sta)\n\t\t\t\t{\n\t\t\t\t\tpbcmc_sta->ieee8021x_blocked = _FALSE;\n\t\t\t\t\tpbcmc_sta->dot118021XPrivacy= psecuritypriv->dot118021XGrpPrivacy;//rx will use bmc_sta's dot118021XPrivacy\t\t\t\n\t\t\t\t}\t\t\t\t\t\n\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\t\t\n\t}\n\nexit:\n\n\tif(pwep)\n\t{\n\t\trtw_mfree((u8 *)pwep, wep_total_len);\t\t\n\t}\t\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_set_beacon(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tunsigned char *pbuf = param->u.bcn_ie.buf;\n\n\n\tDBG_871X(\"%s, len=%d\\n\", __FUNCTION__, len);\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\t_rtw_memcpy(&pstapriv->max_num_sta, param->u.bcn_ie.reserved, 2);\n\n\tif((pstapriv->max_num_sta>NUM_STA) || (pstapriv->max_num_sta<=0))\n\t\tpstapriv->max_num_sta = NUM_STA;\n\n\n\tif(rtw_check_beacon_data(padapter, pbuf,  (len-12-2)) == _SUCCESS)// 12 = param header, 2:no packed\n\t\tret = 0;\n\telse\n\t\tret = -EINVAL;\n\t\n\n\treturn ret;\n\t\n}\n\nstatic int rtw_hostapd_sta_flush(struct net_device *dev)\n{\n\t//_irqL irqL;\n\t//_list\t*phead, *plist;\n\tint ret=0;\t\n\t//struct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\t//struct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tflush_all_cam_entry(padapter);\t//clear CAM\n\n\tret = rtw_sta_flush(padapter, _TRUE);\n\n\treturn ret;\n\n}\n\nstatic int rtw_add_sta(struct net_device *dev, struct ieee_param *param)\n{\n\t_irqL irqL;\n\tint ret=0;\t\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"rtw_add_sta(aid=%d)=\" MAC_FMT \"\\n\", param->u.add_sta.aid, MAC_ARG(param->sta_addr));\n\t\n\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)\t\n\t{\n\t\treturn -EINVAL;\t\t\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n/*\n\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\tif(psta)\n\t{\n\t\tDBG_871X(\"rtw_add_sta(), free has been added psta=%p\\n\", psta);\n\t\t//_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\t\t\n\t\trtw_free_stainfo(padapter,  psta);\t\t\n\t\t//_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\n\n\t\tpsta = NULL;\n\t}\t\n*/\n\t//psta = rtw_alloc_stainfo(pstapriv, param->sta_addr);\n\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\tif(psta)\n\t{\n\t\tint flags = param->u.add_sta.flags;\t\t\t\n\t\t\n\t\t//DBG_871X(\"rtw_add_sta(), init sta's variables, psta=%p\\n\", psta);\n\t\t\n\t\tpsta->aid = param->u.add_sta.aid;//aid=1~2007\n\n\t\t_rtw_memcpy(psta->bssrateset, param->u.add_sta.tx_supp_rates, 16);\n\t\t\n\t\t\n\t\t//check wmm cap.\n\t\tif(WLAN_STA_WME&flags)\n\t\t\tpsta->qos_option = 1;\n\t\telse\n\t\t\tpsta->qos_option = 0;\n\n\t\tif(pmlmepriv->qospriv.qos_option == 0)\t\n\t\t\tpsta->qos_option = 0;\n\n\t\t\n#ifdef CONFIG_80211N_HT\t\t\n\t\t//chec 802.11n ht cap.\n\t\tif(WLAN_STA_HT&flags)\n\t\t{\n\t\t\tpsta->htpriv.ht_option = _TRUE;\n\t\t\tpsta->qos_option = 1;\n\t\t\t_rtw_memcpy((void*)&psta->htpriv.ht_cap, (void*)&param->u.add_sta.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));\n\t\t}\n\t\telse\t\t\n\t\t{\n\t\t\tpsta->htpriv.ht_option = _FALSE;\n\t\t}\n\t\t\n\t\tif(pmlmepriv->htpriv.ht_option == _FALSE)\t\n\t\t\tpsta->htpriv.ht_option = _FALSE;\n#endif\t\t\n\n\n\t\tupdate_sta_info_apmode(padapter, psta);\n\t\t\n\t\t\n\t}\n\telse\n\t{\n\t\tret = -ENOMEM;\n\t}\t\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_del_sta(struct net_device *dev, struct ieee_param *param)\n{\n\t_irqL irqL;\n\tint ret=0;\t\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"rtw_del_sta=\" MAC_FMT \"\\n\", MAC_ARG(param->sta_addr));\n\t\t\n\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)\t\t\n\t{\n\t\treturn -EINVAL;\t\t\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\tif(psta)\n\t{\n\t\tu8 updated=_FALSE;\n\t\n\t\t//DBG_871X(\"free psta=%p, aid=%d\\n\", psta, psta->aid);\n\n\t\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\tif(rtw_is_list_empty(&psta->asoc_list)==_FALSE)\n\t\t{\t\t\t\n\t\t\trtw_list_delete(&psta->asoc_list);\n\t\t\tpstapriv->asoc_list_cnt--;\n\t\t\tupdated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, _TRUE);\n\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\t\t\n\t\tassociated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);\n\t\n\t\tpsta = NULL;\n\t\t\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"rtw_del_sta(), sta has already been removed or never been added\\n\");\n\t\t\n\t\t//ret = -1;\n\t}\n\t\n\t\n\treturn ret;\n\t\n}\n\nstatic int rtw_ioctl_get_sta_data(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\t\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct ieee_param_ex *param_ex = (struct ieee_param_ex *)param;\n\tstruct sta_data *psta_data = (struct sta_data *)param_ex->data;\n\n\tDBG_871X(\"rtw_ioctl_get_sta_info, sta_addr: \" MAC_FMT \"\\n\", MAC_ARG(param_ex->sta_addr));\n\n\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)\t\t\n\t{\n\t\treturn -EINVAL;\t\t\n\t}\n\n\tif (param_ex->sta_addr[0] == 0xff && param_ex->sta_addr[1] == 0xff &&\n\t    param_ex->sta_addr[2] == 0xff && param_ex->sta_addr[3] == 0xff &&\n\t    param_ex->sta_addr[4] == 0xff && param_ex->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\tpsta = rtw_get_stainfo(pstapriv, param_ex->sta_addr);\n\tif(psta)\n\t{\n#if 0\n\t\tstruct {\n\t\t\tu16 aid;\n\t\t\tu16 capability;\n\t\t\tint flags;\n\t\t\tu32 sta_set;\n\t\t\tu8 tx_supp_rates[16];\t\n\t\t\tu32 tx_supp_rates_len;\n\t\t\tstruct rtw_ieee80211_ht_cap ht_cap;\n\t\t\tu64\trx_pkts;\n\t\t\tu64\trx_bytes;\n\t\t\tu64\trx_drops;\n\t\t\tu64\ttx_pkts;\n\t\t\tu64\ttx_bytes;\n\t\t\tu64\ttx_drops;\n\t\t} get_sta;\t\t\n#endif\n\t\tpsta_data->aid = (u16)psta->aid;\n\t\tpsta_data->capability = psta->capability;\n\t\tpsta_data->flags = psta->flags;\n\n/*\n\t\tnonerp_set : BIT(0)\n\t\tno_short_slot_time_set : BIT(1)\n\t\tno_short_preamble_set : BIT(2)\n\t\tno_ht_gf_set : BIT(3)\n\t\tno_ht_set : BIT(4)\n\t\tht_20mhz_set : BIT(5)\n*/\n\n\t\tpsta_data->sta_set =((psta->nonerp_set) |\n\t\t\t\t\t\t\t(psta->no_short_slot_time_set <<1) |\n\t\t\t\t\t\t\t(psta->no_short_preamble_set <<2) |\n\t\t\t\t\t\t\t(psta->no_ht_gf_set <<3) |\n\t\t\t\t\t\t\t(psta->no_ht_set <<4) |\n\t\t\t\t\t\t\t(psta->ht_20mhz_set <<5));\n\n\t\tpsta_data->tx_supp_rates_len =  psta->bssratelen;\n\t\t_rtw_memcpy(psta_data->tx_supp_rates, psta->bssrateset, psta->bssratelen);\n#ifdef CONFIG_80211N_HT\n\t\t_rtw_memcpy(&psta_data->ht_cap, &psta->htpriv.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));\n#endif //CONFIG_80211N_HT\n\t\tpsta_data->rx_pkts = psta->sta_stats.rx_data_pkts;\n\t\tpsta_data->rx_bytes = psta->sta_stats.rx_bytes;\n\t\tpsta_data->rx_drops = psta->sta_stats.rx_drops;\n\n\t\tpsta_data->tx_pkts = psta->sta_stats.tx_pkts;\n\t\tpsta_data->tx_bytes = psta->sta_stats.tx_bytes;\n\t\tpsta_data->tx_drops = psta->sta_stats.tx_drops;\n\t\t\n\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t}\n\n\treturn ret;\n\n}\n\nstatic int rtw_get_sta_wpaie(struct net_device *dev, struct ieee_param *param)\n{\n\tint ret=0;\t\n\tstruct sta_info *psta = NULL;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tDBG_871X(\"rtw_get_sta_wpaie, sta_addr: \" MAC_FMT \"\\n\", MAC_ARG(param->sta_addr));\n\n\tif(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) != _TRUE)\t\t\n\t{\n\t\treturn -EINVAL;\t\t\n\t}\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\tpsta = rtw_get_stainfo(pstapriv, param->sta_addr);\n\tif(psta)\n\t{\n\t\tif((psta->wpa_ie[0] == WLAN_EID_RSN) || (psta->wpa_ie[0] == WLAN_EID_GENERIC))\n\t\t{\n\t\t\tint wpa_ie_len;\n\t\t\tint copy_len;\n\n\t\t\twpa_ie_len = psta->wpa_ie[1];\n\t\t\t\n\t\t\tcopy_len = ((wpa_ie_len+2) > sizeof(psta->wpa_ie)) ? (sizeof(psta->wpa_ie)):(wpa_ie_len+2);\n\t\t\t\t\n\t\t\tparam->u.wpa_ie.len = copy_len;\n\n\t\t\t_rtw_memcpy(param->u.wpa_ie.reserved, psta->wpa_ie, copy_len);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//ret = -1;\n\t\t\tDBG_871X(\"sta's wpa_ie is NONE\\n\");\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tret = -1;\n\t}\n\n\treturn ret;\n\n}\n\nstatic int rtw_set_wps_beacon(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\tunsigned char wps_oui[4]={0x0,0x50,0xf2,0x04};\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &(padapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tint ie_len;\n\n\tDBG_871X(\"%s, len=%d\\n\", __FUNCTION__, len);\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tie_len = len-12-2;// 12 = param header, 2:no packed\n\n\n\tif(pmlmepriv->wps_beacon_ie)\n\t{\n\t\trtw_mfree(pmlmepriv->wps_beacon_ie, pmlmepriv->wps_beacon_ie_len);\n\t\tpmlmepriv->wps_beacon_ie = NULL;\t\t\t\n\t}\t\n\n\tif(ie_len>0)\n\t{\n\t\tpmlmepriv->wps_beacon_ie = rtw_malloc(ie_len);\n\t\tpmlmepriv->wps_beacon_ie_len = ie_len;\n\t\tif ( pmlmepriv->wps_beacon_ie == NULL) {\n\t\t\tDBG_871X(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\treturn -EINVAL;\n\t\t}\n\n\t\t_rtw_memcpy(pmlmepriv->wps_beacon_ie, param->u.bcn_ie.buf, ie_len);\n\n\t\tupdate_beacon(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, _TRUE);\n\t\t\n\t\tpmlmeext->bstart_bss = _TRUE;\n\t\t\n\t}\n\t\n\t\n\treturn ret;\t\t\n\n}\n\nstatic int rtw_set_wps_probe_resp(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tint ie_len;\n\n\tDBG_871X(\"%s, len=%d\\n\", __FUNCTION__, len);\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tie_len = len-12-2;// 12 = param header, 2:no packed\n\n\n\tif(pmlmepriv->wps_probe_resp_ie)\n\t{\n\t\trtw_mfree(pmlmepriv->wps_probe_resp_ie, pmlmepriv->wps_probe_resp_ie_len);\n\t\tpmlmepriv->wps_probe_resp_ie = NULL;\t\t\t\n\t}\t\n\n\tif(ie_len>0)\n\t{\n\t\tpmlmepriv->wps_probe_resp_ie = rtw_malloc(ie_len);\n\t\tpmlmepriv->wps_probe_resp_ie_len = ie_len;\n\t\tif ( pmlmepriv->wps_probe_resp_ie == NULL) {\n\t\t\tDBG_871X(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\treturn -EINVAL;\n\t\t}\n\t\t_rtw_memcpy(pmlmepriv->wps_probe_resp_ie, param->u.bcn_ie.buf, ie_len);\t\t\n\t}\n\t\n\t\n\treturn ret;\n\n}\n\nstatic int rtw_set_wps_assoc_resp(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tint ie_len;\n\n\tDBG_871X(\"%s, len=%d\\n\", __FUNCTION__, len);\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tie_len = len-12-2;// 12 = param header, 2:no packed\n\n\n\tif(pmlmepriv->wps_assoc_resp_ie)\n\t{\n\t\trtw_mfree(pmlmepriv->wps_assoc_resp_ie, pmlmepriv->wps_assoc_resp_ie_len);\n\t\tpmlmepriv->wps_assoc_resp_ie = NULL;\t\t\t\n\t}\t\n\n\tif(ie_len>0)\n\t{\n\t\tpmlmepriv->wps_assoc_resp_ie = rtw_malloc(ie_len);\n\t\tpmlmepriv->wps_assoc_resp_ie_len = ie_len;\n\t\tif ( pmlmepriv->wps_assoc_resp_ie == NULL) {\n\t\t\tDBG_871X(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\treturn -EINVAL;\n\t\t}\n\t\t\n\t\t_rtw_memcpy(pmlmepriv->wps_assoc_resp_ie, param->u.bcn_ie.buf, ie_len);\t\t\n\t}\n\t\n\t\n\treturn ret;\n\n}\n\nstatic int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *mlmepriv = &(adapter->mlmepriv);\n\tstruct mlme_ext_priv\t*mlmeext = &(adapter->mlmeextpriv);\n\tstruct mlme_ext_info\t*mlmeinfo = &(mlmeext->mlmext_info);\n\tint ie_len;\n\tu8 *ssid_ie;\n\tchar ssid[NDIS_802_11_LENGTH_SSID + 1];\n\tsint ssid_len = 0;\n\tu8 ignore_broadcast_ssid;\n\n\tif(check_fwstate(mlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EPERM;\n\n\tif (param->u.bcn_ie.reserved[0] != 0xea)\n\t\treturn -EINVAL;\n\n\tmlmeinfo->hidden_ssid_mode = ignore_broadcast_ssid = param->u.bcn_ie.reserved[1];\n\n\tie_len = len-12-2;// 12 = param header, 2:no packed\n\tssid_ie = rtw_get_ie(param->u.bcn_ie.buf,  WLAN_EID_SSID, &ssid_len, ie_len);\n\n\tif (ssid_ie && ssid_len > 0 && ssid_len <= NDIS_802_11_LENGTH_SSID) {\n\t\tWLAN_BSSID_EX *pbss_network = &mlmepriv->cur_network.network;\n\t\tWLAN_BSSID_EX *pbss_network_ext = &mlmeinfo->network;\n\n\t\t_rtw_memcpy(ssid, ssid_ie+2, ssid_len);\n\t\tssid[ssid_len] = 0x0;\n\n\t\tif(0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\\n\", FUNC_ADPT_ARG(adapter),\n\t\t\t\tssid, ssid_len,\n\t\t\t\tpbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,\n\t\t\t\tpbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);\n\n\t\t_rtw_memcpy(pbss_network->Ssid.Ssid, (void *)ssid, ssid_len);\n\t\tpbss_network->Ssid.SsidLength = ssid_len;\n\t\t_rtw_memcpy(pbss_network_ext->Ssid.Ssid, (void *)ssid, ssid_len);\n\t\tpbss_network_ext->Ssid.SsidLength = ssid_len;\n\n\t\tif(0)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" after ssid:(%s,%d), (%s,%d)\\n\", FUNC_ADPT_ARG(adapter),\n\t\t\t\tpbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,\n\t\t\t\tpbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);\n\t}\n\n\tDBG_871X(FUNC_ADPT_FMT\" ignore_broadcast_ssid:%d, %s,%d\\n\", FUNC_ADPT_ARG(adapter),\n\t\tignore_broadcast_ssid, ssid, ssid_len);\n\n\treturn ret;\n}\n\nstatic int rtw_ioctl_acl_remove_sta(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\t\n\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\tret = rtw_acl_remove_sta(padapter, param->sta_addr);\t\n\n\treturn ret;\t\t\n\n}\n\nstatic int rtw_ioctl_acl_add_sta(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\n\n\tif (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&\n\t    param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&\n\t    param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) \n\t{\n\t\treturn -EINVAL;\t\n\t}\n\n\tret = rtw_acl_add_sta(padapter, param->sta_addr);\t\n\n\treturn ret;\t\t\n\n}\n\nstatic int rtw_ioctl_set_macaddr_acl(struct net_device *dev, struct ieee_param *param, int len)\n{\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\t\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\n\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)\n\t\treturn -EINVAL;\t\n\t\n\trtw_set_macaddr_acl(padapter, param->u.mlme.command);\t\n\n\treturn ret;\n}\n\nstatic int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p)\n{\n\tstruct ieee_param *param;\n\tint ret=0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\t/*\n\t* this function is expect to call in master mode, which allows no power saving\n\t* so, we just check hw_init_completed\n\t*/\n\n\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tret = -EPERM;\n\t\tgoto out;\n\t}\n\n\n\t//if (p->length < sizeof(struct ieee_param) || !p->pointer){\n\tif(!p->pointer){\n\t\tret = -EINVAL;\n\t\tgoto out;\n\t}\n\t\n\tparam = (struct ieee_param *)rtw_malloc(p->length);\n\tif (param == NULL)\n\t{\n\t\tret = -ENOMEM;\n\t\tgoto out;\n\t}\n\t\n\tif (copy_from_user(param, p->pointer, p->length))\n\t{\n\t\trtw_mfree((u8*)param, p->length);\n\t\tret = -EFAULT;\n\t\tgoto out;\n\t}\n\n\t//DBG_871X(\"%s, cmd=%d\\n\", __FUNCTION__, param->cmd);\n\n\tswitch (param->cmd) \n\t{\t\n\t\tcase RTL871X_HOSTAPD_FLUSH:\n\n\t\t\tret = rtw_hostapd_sta_flush(dev);\n\n\t\t\tbreak;\n\t\n\t\tcase RTL871X_HOSTAPD_ADD_STA:\t\n\t\t\t\n\t\t\tret = rtw_add_sta(dev, param);\t\t\t\t\t\n\t\t\t\n\t\t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_REMOVE_STA:\n\n\t\t\tret = rtw_del_sta(dev, param);\n\n\t\t\tbreak;\n\t\n\t\tcase RTL871X_HOSTAPD_SET_BEACON:\n\n\t\t\tret = rtw_set_beacon(dev, param, p->length);\n\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTL871X_SET_ENCRYPTION:\n\n\t\t\tret = rtw_set_encryption(dev, param, p->length);\n\t\t\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTL871X_HOSTAPD_GET_WPAIE_STA:\n\n\t\t\tret = rtw_get_sta_wpaie(dev, param);\n\t\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTL871X_HOSTAPD_SET_WPS_BEACON:\n\n\t\t\tret = rtw_set_wps_beacon(dev, param, p->length);\n\n\t\t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_SET_WPS_PROBE_RESP:\n\n\t\t\tret = rtw_set_wps_probe_resp(dev, param, p->length);\n\t\t\t\n\t \t\tbreak;\n\t\t\t\n\t\tcase RTL871X_HOSTAPD_SET_WPS_ASSOC_RESP:\n\n\t\t\tret = rtw_set_wps_assoc_resp(dev, param, p->length);\n\t\t\t\n\t \t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_SET_HIDDEN_SSID:\n\n\t\t\tret = rtw_set_hidden_ssid(dev, param, p->length);\n\n\t\t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_GET_INFO_STA:\n\n\t\t\tret = rtw_ioctl_get_sta_data(dev, param, p->length);\n\n\t\t\tbreak;\n\t\t\t\n\t\tcase RTL871X_HOSTAPD_SET_MACADDR_ACL:\n\n\t\t\tret = rtw_ioctl_set_macaddr_acl(dev, param, p->length);\n\n\t\t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_ACL_ADD_STA:\n\n\t\t\tret = rtw_ioctl_acl_add_sta(dev, param, p->length);\n\n\t\t\tbreak;\n\n\t\tcase RTL871X_HOSTAPD_ACL_REMOVE_STA:\n\n\t\t\tret = rtw_ioctl_acl_remove_sta(dev, param, p->length);\n\n\t\t\tbreak;\n\t\t\t\n\t\tdefault:\n\t\t\tDBG_871X(\"Unknown hostapd request: %d\\n\", param->cmd);\n\t\t\tret = -EOPNOTSUPP;\n\t\t\tbreak;\n\t\t\n\t}\n\n\tif (ret == 0 && copy_to_user(p->pointer, param, p->length))\n\t\tret = -EFAULT;\n\n\n\trtw_mfree((u8 *)param, p->length);\n\t\nout:\n\t\t\n\treturn ret;\n\t\n}\n#endif\n\nstatic int rtw_wx_set_priv(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *awrq,\n\t\t\t\tchar *extra)\n{\n\n#ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV\n\tchar *ext_dbg;\n#endif\n\n\tint ret = 0;\n\tint len = 0;\n\tchar *ext;\n\tint i;\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct iw_point *dwrq = (struct iw_point*)awrq;\n\n\t//RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_, (\"+rtw_wx_set_priv\\n\"));\n\tif(dwrq->length == 0)\n\t\treturn -EFAULT;\n\t\n\tlen = dwrq->length;\n\tif (!(ext = rtw_vmalloc(len)))\n\t\treturn -ENOMEM;\n\n\tif (copy_from_user(ext, dwrq->pointer, len)) {\n\t\trtw_vmfree(ext, len);\n\t\treturn -EFAULT;\n\t}\n\n\n\t//RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_notice_,\n\t//\t (\"rtw_wx_set_priv: %s req=%s\\n\",\n\t//\t  dev->name, ext));\n\n\t#ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV\t\n\tif (!(ext_dbg = rtw_vmalloc(len)))\n\t{\n\t\trtw_vmfree(ext, len);\n\t\treturn -ENOMEM;\n\t}\t\n\t\n\t_rtw_memcpy(ext_dbg, ext, len);\n\t#endif\n\n\t//added for wps2.0 @20110524\n\tif(dwrq->flags == 0x8766 && len > 8)\n\t{\n\t\tu32 cp_sz;\t\t\n\t\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\t\tu8 *probereq_wpsie = ext;\n\t\tint probereq_wpsie_len = len;\n\t\tu8 wps_oui[4]={0x0,0x50,0xf2,0x04};\t\t\n\t\n\t\tif((_VENDOR_SPECIFIC_IE_ == probereq_wpsie[0]) &&\n\t\t\t(_rtw_memcmp(&probereq_wpsie[2], wps_oui, 4) ==_TRUE))\n\t\t{\n\t\t\tcp_sz = probereq_wpsie_len>MAX_WPS_IE_LEN ? MAX_WPS_IE_LEN:probereq_wpsie_len;\n\n\t\t\tif(pmlmepriv->wps_probe_req_ie)\n\t\t\t{\n\t\t\t\tu32 free_len = pmlmepriv->wps_probe_req_ie_len;\n\t\t\t\tpmlmepriv->wps_probe_req_ie_len = 0;\n\t\t\t\trtw_mfree(pmlmepriv->wps_probe_req_ie, free_len);\n\t\t\t\tpmlmepriv->wps_probe_req_ie = NULL;\t\t\t\n\t\t\t}\t\n\n\t\t\tpmlmepriv->wps_probe_req_ie = rtw_malloc(cp_sz);\n\t\t\tif ( pmlmepriv->wps_probe_req_ie == NULL) {\n\t\t\t\tprintk(\"%s()-%d: rtw_malloc() ERROR!\\n\", __FUNCTION__, __LINE__);\n\t\t\t\tret =  -EINVAL;\n\t\t\t\tgoto FREE_EXT;\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t_rtw_memcpy(pmlmepriv->wps_probe_req_ie, probereq_wpsie, cp_sz);\n\t\t\tpmlmepriv->wps_probe_req_ie_len = cp_sz;\t\t\t\t\t\n\t\t\t\n\t\t}\t\n\t\t\n\t\tgoto FREE_EXT;\n\t\t\n\t}\n\n\tif(\tlen >= WEXT_CSCAN_HEADER_SIZE\n\t\t&& _rtw_memcmp(ext, WEXT_CSCAN_HEADER, WEXT_CSCAN_HEADER_SIZE) == _TRUE\n\t){\n\t\tret = rtw_wx_set_scan(dev, info, awrq, ext);\n\t\tgoto FREE_EXT;\n\t}\n\t\n#ifdef CONFIG_ANDROID\n\t//DBG_871X(\"rtw_wx_set_priv: %s req=%s\\n\", dev->name, ext);\n\n\ti = rtw_android_cmdstr_to_num(ext);\n\n\tswitch(i) {\n\t\tcase ANDROID_WIFI_CMD_START :\n\t\t\tindicate_wx_custom_event(padapter, \"START\");\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_STOP :\n\t\t\tindicate_wx_custom_event(padapter, \"STOP\");\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_RSSI :\n\t\t\t{\n\t\t\t\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\t\t\t\tstruct\twlan_network\t*pcur_network = &pmlmepriv->cur_network;\n\n\t\t\t\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\t\t\t\tsprintf(ext, \"%s rssi %d\", pcur_network->network.Ssid.Ssid, padapter->recvpriv.rssi);\n\t\t\t\t} else {\n\t\t\t\t\tsprintf(ext, \"OK\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_LINKSPEED :\n\t\t\t{\n\t\t\t\tu16 mbps = rtw_get_cur_max_rate(padapter)/10;\n\t\t\t\tsprintf(ext, \"LINKSPEED %d\", mbps);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_MACADDR :\n\t\t\tsprintf(ext, \"MACADDR = \" MAC_FMT, MAC_ARG(dev->dev_addr));\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_SCAN_ACTIVE :\n\t\t\t{\n\t\t\t\t//rtw_set_scan_mode(padapter, SCAN_ACTIVE);\n\t\t\t\tsprintf(ext, \"OK\");\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ANDROID_WIFI_CMD_SCAN_PASSIVE :\n\t\t\t{\n\t\t\t\t//rtw_set_scan_mode(padapter, SCAN_PASSIVE);\n\t\t\t\tsprintf(ext, \"OK\");\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase ANDROID_WIFI_CMD_COUNTRY :\n\t\t\t{\n\t\t\t\tchar country_code[10];\n\t\t\t\tsscanf(ext, \"%*s %s\", country_code);\n\t\t\t\trtw_set_country(padapter, country_code);\n\t\t\t\tsprintf(ext, \"OK\");\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault :\n\t\t\t#ifdef  CONFIG_DEBUG_RTW_WX_SET_PRIV\n\t\t\tDBG_871X(\"%s: %s unknowned req=%s\\n\", __FUNCTION__,\n\t\t\t\tdev->name, ext_dbg);\n\t\t\t#endif\n\n\t\t\tsprintf(ext, \"OK\");\n\t\t\n\t}\n\n\tif (copy_to_user(dwrq->pointer, ext, min(dwrq->length, (u16)(strlen(ext)+1)) ) )\n\t\tret = -EFAULT;\n\n\t#ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV\n\tDBG_871X(\"%s: %s req=%s rep=%s dwrq->length=%d, strlen(ext)+1=%d\\n\", __FUNCTION__,\n\t\tdev->name, ext_dbg ,ext, dwrq->length, (u16)(strlen(ext)+1));\n\t#endif\n#endif //end of CONFIG_ANDROID\n\n\nFREE_EXT:\n\n\trtw_vmfree(ext, len);\n\t#ifdef CONFIG_DEBUG_RTW_WX_SET_PRIV\n\trtw_vmfree(ext_dbg, len);\n\t#endif\n\n\t//DBG_871X(\"rtw_wx_set_priv: (SIOCSIWPRIV) %s ret=%d\\n\", \n\t//\t\tdev->name, ret);\n\n\treturn ret;\n\t\n}\n#ifdef CONFIG_WOWLAN\nstatic int rtw_wowlan_ctrl(struct net_device *dev,\n\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter =  (_adapter *)rtw_netdev_priv(dev);\n\tstruct wowlan_ioctl_param poidparam;\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\t\n#endif\n\tstruct sta_info\t*psta = NULL;\n\tint ret = 0;\n\tu32 start_time = rtw_get_current_time();\n\tpoidparam.subcode = 0;\n\n\tDBG_871X(\"+rtw_wowlan_ctrl: %s\\n\", extra);\n\t\n\tif (!check_fwstate(pmlmepriv, _FW_LINKED) && \n\t\t\tcheck_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n#ifdef CONFIG_PNO_SUPPORT\n\t\t\tpwrctrlpriv->wowlan_pno_enable = _TRUE;\n#else\n\t\t\tDBG_871X(\"[%s] WARNING: Please Connect With AP First!!\\n\", __func__);\n\t\t\tgoto _rtw_wowlan_ctrl_exit_free;\n#endif //CONFIG_PNO_SUPPORT\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))\n\t\trtw_scan_abort(padapter);\n\n\tif (_rtw_memcmp(extra, \"enable\", 6)) {\n\n\t\tpadapter->registrypriv.mp_mode = 1;\n\n\t\trtw_suspend_common(padapter);\n\n\t} else if (_rtw_memcmp(extra, \"disable\", 7)) {\n#ifdef CONFIG_USB_HCI\n\t\tRTW_ENABLE_FUNC(padapter, DF_RX_BIT);\n\t\tRTW_ENABLE_FUNC(padapter, DF_TX_BIT);\n#endif\n\t\trtw_resume_common(padapter);\n\n#ifdef CONFIG_PNO_SUPPORT\n\t\tpwrctrlpriv->wowlan_pno_enable = _FALSE;\n#endif //CONFIG_PNO_SUPPORT\n\n\t\tpadapter->registrypriv.mp_mode = 0;\n\t} else {\n\t\tDBG_871X(\"[%s] Invalid Parameter.\\n\", __func__);\n\t\tgoto _rtw_wowlan_ctrl_exit_free;\n\t}\n\t//mutex_lock(&ioctl_mutex);\n_rtw_wowlan_ctrl_exit_free:\n\tDBG_871X(\"-rtw_wowlan_ctrl( subcode = %d)\\n\", poidparam.subcode);\n\tDBG_871X_LEVEL(_drv_always_, \"%s in %d ms\\n\", __func__,\n\t\t\trtw_get_passing_time_ms(start_time));\n_rtw_wowlan_ctrl_exit:\n\treturn ret;\n}\n\nstatic bool rtw_wowlan_parser_pattern_cmd(u8 *input, char *pattern,\n\t\t\t\t\t  int *pattern_len, char *bit_mask)\n{\n\tchar *cp = NULL, *end = NULL;\n\tsize_t len = 0;\n\tint pos = 0, temp = 0, mask_pos = 0, res = 0;\n\tu8 member[2] = {0};\n\n\tcp = strchr(input, '=');\n\tif (cp) {\n\t\t*cp = 0;\n\t\tcp++;\n\t}\n\n\tinput = cp;\n\n\twhile (1) {\n\t\tcp = strchr(input, ':');\n\n\t\tif (cp) {\n\t\t\tlen = strlen(input) - strlen(cp);\n\t\t\t*cp = 0;\n\t\t\tcp++;\n\t\t} else {\n\t\t\tlen = 2;\n\t\t}\n\n\t\tif (bit_mask && (strcmp(input, \"-\") == 0 ||\n\t\t\t\t strcmp(input, \"xx\") == 0 ||\n\t\t\t\t strcmp(input, \"--\") == 0)) {\n\t\t\t/* skip this byte and leave mask bit unset */\n\t\t} else {\n\t\t\tstrncpy(member, input, len);\n\t\t\tif (!rtw_check_pattern_valid(member, sizeof(member))) {\n\t\t\t\tDBG_871X(\"%s:[ERROR] pattern is invalid!!\\n\",\n\t\t\t\t\t __func__);\n\t\t\t\tgoto error;\n\t\t\t}\n\t\t\tres = sscanf(member, \"%02x\", &temp);\n\t\t\tif (temp < 0 || temp > 256)\n\t\t\t\tgoto error;\n\t\t\tpattern[pos] = temp;\n\t\t\tmask_pos = pos / 8;\n\t\t\tif (bit_mask)\n\t\t\t\tbit_mask[mask_pos] |= 1 << (pos % 8);\n\t\t}\n\n\t\tpos++;\n\t\tif (!cp)\n\t\t\tbreak;\n\t\tinput = cp;\n\t}\n\n\t(*pattern_len) = pos;\n\n\treturn _TRUE;\nerror:\n\treturn _FALSE;\n}\n\n/*\n * IP filter This pattern if for a frame containing a ip packet:\n * AA:AA:AA:AA:AA:AA:BB:BB:BB:BB:BB:BB:CC:CC:DD:-:-:-:-:-:-:-:-:EE:-:-:FF:FF:FF:FF:GG:GG:GG:GG:HH:HH:II:II\n *\n * A: Ethernet destination address\n * B: Ethernet source address\n * C: Ethernet protocol type\n * D: IP header VER+Hlen, use: 0x45 (4 is for ver 4, 5 is for len 20)\n * E: IP protocol\n * F: IP source address ( 192.168.0.4: C0:A8:00:2C )\n * G: IP destination address ( 192.168.0.4: C0:A8:00:2C )\n * H: Source port (1024: 04:00)\n * I: Destination port (1024: 04:00) \n */\n\nstatic int rtw_wowlan_set_pattern(struct net_device *dev,\n\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter =  (_adapter *)rtw_netdev_priv(dev);\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct wowlan_ioctl_param poidparam;\n\tint ret = 0, len = 0, i = 0;\n\tu32 start_time = rtw_get_current_time();\n\tu8 input[wrqu->data.length];\n\tu8 index = 0;\n\n\tpoidparam.subcode = 0;\n\n\tif (!check_fwstate(pmlmepriv, _FW_LINKED) &&\n\t\t\tcheck_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n\t\tret = -EFAULT;\n\t\tDBG_871X(\"Please Connect With AP First!!\\n\");\n\t\tgoto _rtw_wowlan_set_pattern_exit;\n\t}\n\n\tif (wrqu->data.length <= 0) {\n\t\tret = -EFAULT;\n\t\tDBG_871X(\"ERROR: parameter length <= 0\\n\");\n\t\tgoto _rtw_wowlan_set_pattern_exit;\n\t} else {\n\t\t/* set pattern */\n\t\tif (copy_from_user(input,\n\t\t\t\t   wrqu->data.pointer, wrqu->data.length))\n\t\t\treturn -EFAULT;\n\t\t/* leave PS first */\n\t\trtw_ps_deny(padapter, PS_DENY_IOCTL);\n\t\tLeaveAllPowerSaveModeDirect(padapter);\n\t\tif (strncmp(input, \"pattern=\", 8) == 0) {\n\t\t\tif (pwrpriv->wowlan_pattern_idx >= MAX_WKFM_NUM) {\n\t\t\t\tDBG_871X(\"WARNING: priv-pattern is full(%d)\\n\",\n\t\t\t\t\t\tMAX_WKFM_NUM);\n\t\t\t\tDBG_871X(\"WARNING: please clean priv-pattern first\\n\");\n\t\t\t\tret = -EINVAL;\n\t\t\t\tgoto _rtw_wowlan_set_pattern_exit;\n\t\t\t} else {\n\t\t\t\tindex = pwrpriv->wowlan_pattern_idx;\n\n\t\t\t\tret = rtw_wowlan_parser_pattern_cmd(input,\n\t\t\t\t\tpwrpriv->patterns[index].content,\n\t\t\t\t\t&pwrpriv->patterns[index].len,\n\t\t\t\t\tpwrpriv->patterns[index].mask);\n\n\t\t\t\tif (ret) {\n\t\t\t\t\tpwrpriv->wowlan_pattern_idx++;\n\t\t\t\t\tpwrpriv->wowlan_pattern = _TRUE;\n\t\t\t\t} else {\n\t\t\t\t\tgoto _rtw_wowlan_set_pattern_exit;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (strncmp(input, \"clean\", 5) == 0) {\n\t\t\tpoidparam.subcode = WOWLAN_PATTERN_CLEAN;\n\t\t\trtw_hal_set_hwreg(padapter,\n\t\t\t\t\tHW_VAR_WOWLAN, (u8 *)&poidparam);\n\t\t\tpwrpriv->wowlan_pattern = _FALSE;\n\t\t} else if (strncmp(input, \"show\", 4) == 0) {\n\t\t\tfor (i = 0 ; i < MAX_WKFM_NUM ; i++) {\n\t\t\t\tDBG_871X(\"=======[%d]=======\\n\", i);\n\t\t\t\trtw_read_from_frame_mask(padapter, i);\n\t\t\t}\n\n\t\t\tDBG_871X(\"********[RTK priv-patterns]*********\\n\");\n\t\t\tfor (i = 0 ; i < MAX_WKFM_NUM ; i++)\n\t\t\t\trtw_dump_priv_pattern(padapter, i);\n\t\t} else {\n\t\t\tDBG_871X(\"ERROR: incorrect parameter!\\n\");\n\t\t\tret = -EINVAL;\n\t\t}\n\t\trtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);\n\t}\n_rtw_wowlan_set_pattern_exit:\n\treturn ret;\n}\n#endif //CONFIG_WOWLAN\n\n#ifdef CONFIG_AP_WOWLAN\nstatic int rtw_ap_wowlan_ctrl(struct net_device *dev,\n\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\t_adapter *padapter =  (_adapter *)rtw_netdev_priv(dev);\n\tstruct wowlan_ioctl_param poidparam;\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_info\t*psta = NULL;\n\tint ret = 0;\n\tu32 start_time = rtw_get_current_time();\n\tpoidparam.subcode = 0;\n\n\tDBG_871X(\"+rtw_ap_wowlan_ctrl: %s\\n\", extra);\n\n#ifndef CONFIG_USB_HCI\n\tif(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){\n\t\tret = -EPERM;\n\t\tDBG_871X(\"+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\\n\");\n\t\tgoto _rtw_ap_wowlan_ctrl_exit_free;\n\t}\n#endif\n\n\tif (!check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\tDBG_871X(\"[%s] It is not AP mode!!\\n\", __func__);\n\t\tgoto _rtw_ap_wowlan_ctrl_exit_free;\n\t}\n\n\tif (_rtw_memcmp(extra, \"enable\", 6)) {\n\n\t\tpwrctrlpriv->wowlan_ap_mode = _TRUE;\n\n\t\trtw_suspend_common(padapter);\n\t} else if (_rtw_memcmp(extra, \"disable\", 7)) {\n#ifdef CONFIG_USB_HCI\n\t\tRTW_ENABLE_FUNC(padapter, DF_RX_BIT);\n\t\tRTW_ENABLE_FUNC(padapter, DF_TX_BIT);\n#endif\n\t\trtw_resume_common(padapter);\n\t} else {\n\t\tDBG_871X(\"[%s] Invalid Parameter.\\n\", __func__);\n\t\tgoto _rtw_ap_wowlan_ctrl_exit_free;\n\t}\n\t//mutex_lock(&ioctl_mutex);\n_rtw_ap_wowlan_ctrl_exit_free:\n\tDBG_871X(\"-rtw_ap_wowlan_ctrl( subcode = %d)\\n\", poidparam.subcode);\n\tDBG_871X_LEVEL(_drv_always_, \"%s in %d ms\\n\", __func__,\n\t\t\trtw_get_passing_time_ms(start_time));\n_rtw_ap_wowlan_ctrl_exit:\n\treturn ret;\n}\n#endif //CONFIG_AP_WOWLAN\n\nstatic int rtw_pm_set(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\tunsigned\tmode = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X( \"[%s] extra = %s\\n\", __FUNCTION__, extra );\n\n\tif ( _rtw_memcmp( extra, \"lps=\", 4 ) )\n\t{\n\t\tsscanf(extra+4, \"%u\", &mode);\t\n\t\tret = rtw_pm_set_lps(padapter,mode);\n\t}\n\telse if ( _rtw_memcmp( extra, \"ips=\", 4 ) )\n\t{\n\t\tsscanf(extra+4, \"%u\", &mode);\n\t\tret = rtw_pm_set_ips(padapter,mode);\n\t}\n\telse{\n\t\tret = -EINVAL;\n\t}\n\n\treturn ret;\n}\n\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\nint rtw_vendor_ie_get(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0, vendor_ie_num = 0 , j , len = 0 , cmdlen;\n\tchar *pstring;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tstruct iw_point *p;\n\tu8 *ptmp;\n\tu32 vendor_ie_mask = 0;\n\n\tp = &wrqu->data;\n\tcmdlen = p->length;\n\tif (0 == cmdlen)\n\t\treturn -EINVAL;\n\n\tptmp = (u8 *)rtw_malloc(cmdlen);\n\tif (NULL == ptmp)\n\t\treturn -ENOMEM;\n\n\tif (copy_from_user(ptmp, p->pointer, cmdlen)) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\tret = sscanf(ptmp , \"%d\", &vendor_ie_num);\n\tif (vendor_ie_num > WLAN_MAX_VENDOR_IE_NUM - 1) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\tvendor_ie_mask = pmlmepriv->vendor_ie_mask[vendor_ie_num];\n\tpstring = extra;\n\tpstring += sprintf(pstring , \"\\nVendor IE num %d , Mask:%x \" , vendor_ie_num , vendor_ie_mask);\n\n\tif (vendor_ie_mask & WIFI_BEACON_VENDOR_IE_BIT)\n\t\tpstring += sprintf(pstring , \"[Beacon]\");\n\tif (vendor_ie_mask & WIFI_PROBEREQ_VENDOR_IE_BIT)\n\t\tpstring += sprintf(pstring , \"[Probe Req]\");\n\tif (vendor_ie_mask & WIFI_PROBERESP_VENDOR_IE_BIT)\n\t\tpstring += sprintf(pstring , \"[Probe Resp]\");\n\tif (vendor_ie_mask & WIFI_ASSOCREQ_VENDOR_IE_BIT)\n\t\tpstring += sprintf(pstring , \"[Assoc Req]\");\n\tif (vendor_ie_mask & WIFI_ASSOCRESP_VENDOR_IE_BIT)\n\t\tpstring += sprintf(pstring , \"[Assoc Resp]\");\n\n\tpstring += sprintf(pstring , \"\\nVendor IE:\\n\");\n\tfor (j = 0 ; j < pmlmepriv->vendor_ielen[vendor_ie_num]  ; j++)\n\t\tpstring += sprintf(pstring , \"%02x\" , pmlmepriv->vendor_ie[vendor_ie_num][j]);\n\n\twrqu->data.length = pstring - extra;\n\nexit:\n\trtw_mfree(ptmp, cmdlen);\n\n\treturn 0;\n}\n\nint rtw_vendor_ie_set(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0, i , len = 0 , totoal_ie_len = 0 , total_ie_len_byte = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\n\tu32 vendor_ie_mask = 0;\n\tu32 vendor_ie_num = 0;\n\tu32 id, elen;\n\n\tret = sscanf(extra, \"%d,%x,%*s\", &vendor_ie_num , &vendor_ie_mask);\n\tif (strrchr(extra , ','))\n\t\textra = strrchr(extra , ',') + 1;\n\telse\n\t\treturn -EINVAL;\n\ttotoal_ie_len = strlen(extra);\n\tDBG_871X(\"[%s] vendor_ie_num = %d , vendor_ie_mask = %x , vendor_ie = %s , len = %d\\n\", __func__ , vendor_ie_num , vendor_ie_mask , extra  , totoal_ie_len);\n\n\tif (vendor_ie_num  > WLAN_MAX_VENDOR_IE_NUM - 1) {\n\t\tDBG_871X(\"[%s] only support %d vendor ie\\n\", __func__ , WLAN_MAX_VENDOR_IE_NUM);\n\t\treturn -EFAULT;\n\t}\n\n\tif (totoal_ie_len > WLAN_MAX_VENDOR_IE_LEN) {\n\t\tDBG_871X(\"[%s] Fail , not support ie length extend %d\\n\", __func__ , WLAN_MAX_VENDOR_IE_LEN);\n\t\treturn -EFAULT;\n\t}\n\n\tif (vendor_ie_mask == 0) {\n\t\tDBG_871X(\"[%s] Clear vendor_ie_num %d group\\n\", __func__ , vendor_ie_num);\n\t\tgoto _clear_path;\n\t}\n\n\tif (totoal_ie_len % 2 != 0) {\n\t\tDBG_871X(\"[%s]  Fail , IE length = %zu is odd\\n\" , __func__ , strlen(extra));\n\t\treturn -EFAULT;\n\t}\n\n\tif (totoal_ie_len > 0) {\n\t\tfor (i = 0  ; i < strlen(extra) ; i += 2) {\n\t\t\tpmlmepriv->vendor_ie[vendor_ie_num][len] = key_2char2num(extra[i] , extra[i + 1]);\n\t\t\tif (len == 0) {\n\t\t\t\tid = pmlmepriv->vendor_ie[vendor_ie_num][len];\n\t\t\t\tif (id != WLAN_EID_VENDOR_SPECIFIC) {\n\t\t\t\t\tDBG_871X(\"[%s] Fail , VENDOR SPECIFIC IE ID \\\"%x\\\" was not correct\\n\", __func__ , id);\n\t\t\t\t\tgoto _clear_path;\n\t\t\t\t}\n\t\t\t} else if (len == 1) {\n\t\t\t\ttotal_ie_len_byte = (totoal_ie_len / 2) - 2;\n\t\t\t\telen = pmlmepriv->vendor_ie[vendor_ie_num][len];\n\t\t\t\tif (elen != total_ie_len_byte) {\n\t\t\t\t\tDBG_871X(\"[%s] Fail , Input IE length = \\\"%d\\\"(hex:%x) bytes , not match input total IE context length \\\"%d\\\" bytes\\n\", __func__ , elen , elen ,\n\t\t\t\t\t\t total_ie_len_byte);\n\t\t\t\t\tgoto _clear_path;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlen++;\n\t\t}\n\t\tpmlmepriv->vendor_ielen[vendor_ie_num] = len;\n\t} else\n\t\tpmlmepriv->vendor_ielen[vendor_ie_num] = 0;\n\n\n\n\tif (vendor_ie_mask & WIFI_BEACON_VENDOR_IE_BIT)\n\t\tDBG_871X(\"[%s] Beacon append vendor ie\\n\", __func__);\n\tif (vendor_ie_mask & WIFI_PROBEREQ_VENDOR_IE_BIT)\n\t\tDBG_871X(\"[%s] Probe Req append vendor ie\\n\", __func__);\n\tif (vendor_ie_mask & WIFI_PROBERESP_VENDOR_IE_BIT)\n\t\tDBG_871X(\"[%s] Probe Resp  append vendor ie\\n\", __func__);\n\tif (vendor_ie_mask & WIFI_ASSOCREQ_VENDOR_IE_BIT)\n\t\tDBG_871X(\"[%s] Assoc Req append vendor ie\\n\", __func__);\n\tif (vendor_ie_mask & WIFI_ASSOCRESP_VENDOR_IE_BIT)\n\t\tDBG_871X(\"[%s] Assoc Resp append vendor ie\\n\", __func__);\n\n\tpmlmepriv->vendor_ie_mask[vendor_ie_num] = vendor_ie_mask;\n\n\treturn ret;\n\n_clear_path:\n\t_rtw_memset(pmlmepriv->vendor_ie[vendor_ie_num] , 0 , sizeof(u32) * WLAN_MAX_VENDOR_IE_LEN);\n\tpmlmepriv->vendor_ielen[vendor_ie_num] = 0;\n\tpmlmepriv->vendor_ie_mask[vendor_ie_num] = 0;\n\treturn -EFAULT;\n}\n#endif\n\nstatic int rtw_mp_efuse_get(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wdata, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\n\tPEFUSE_HAL pEfuseHal;\n\tstruct iw_point *wrqu;\n\t\n\tu8\t*PROMContent = pHalData->efuse_eeprom_data;\n\tu8 ips_mode = IPS_NUM; // init invalid value\n\tu8 lps_mode = PS_MODE_NUM; // init invalid value\n\tstruct pwrctrl_priv *pwrctrlpriv ;\n\tu8 *data = NULL;\n\tu8 *rawdata = NULL;\n\tchar *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};\n\tu16 i=0, j=0, mapLen=0, addr=0, cnts=0;\n\tu16 max_available_size=0, raw_cursize=0, raw_maxsize=0;\n\tint err;\n\t#ifdef CONFIG_IOL\n\tu8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed\n\t#endif\n\t\n\twrqu = (struct iw_point*)wdata;\n\tpwrctrlpriv = adapter_to_pwrctl(padapter);\n\tpEfuseHal = &pHalData->EfuseHal;\n\n\terr = 0;\n\tdata = rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN);\n\tif (data == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\trawdata = rtw_zmalloc(EFUSE_BT_MAX_MAP_LEN);\n\tif (rawdata == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\tif (copy_from_user(extra, wrqu->pointer, wrqu->length))\n\t{\n\t\terr = -EFAULT;\n\t\tgoto exit;\n\t}\n\t#ifdef CONFIG_LPS\n\tlps_mode = pwrctrlpriv->power_mgnt;//keep org value\n\trtw_pm_set_lps(padapter,PS_MODE_ACTIVE);\n\t#endif\t\n\t\n\t#ifdef CONFIG_IPS\t\n\tips_mode = pwrctrlpriv->ips_mode;//keep org value\n\trtw_pm_set_ips(padapter,IPS_NONE);\n\t#endif\t\n\t\n\tpch = extra;\n\tDBG_871X(\"%s: in=%s\\n\", __FUNCTION__, extra);\n\n\ti = 0;\n\t//mac 16 \"00e04c871200\" rmap,00,2\n\twhile ((token = strsep(&pch, \",\")) != NULL)\n\t{\n\t\tif (i > 2) break;\n\t\ttmp[i] = token;\n\t\ti++;\n\t}\n\t#ifdef CONFIG_IOL\n\tpadapter->registrypriv.fw_iol = 0;// 0:Disable, 1:enable, 2:by usb speed\n\t#endif\n\t\n\tif(strcmp(tmp[0], \"status\") == 0){\n\t\tsprintf(extra, \"Load File efuse=%s,Load File MAC=%s\"\n\t\t\t, pHalData->efuse_file_status == EFUSE_FILE_FAILED ? \"FAIL\" : \"OK\"\n\t\t\t, pHalData->macaddr_file_status == MACADDR_FILE_FAILED ? \"FAIL\" : \"OK\"\n\t\t);\n\t\t  goto exit;\n\t}\n\telse if (strcmp(tmp[0], \"drvmap\") == 0)\n\t{\n\t\tmapLen = EFUSE_MAP_SIZE;\n\t\t\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i = 0; i < EFUSE_MAP_SIZE; i += 16)\n\t\t{\n//\t\t\tDBG_871X(\"0x%02x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%02x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, PROMContent[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra, \"%s\\t\", extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, PROMContent[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra,\"%s\\n\",extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"realmap\") == 0)\n\t{\n\t\tmapLen = EFUSE_MAP_SIZE;\n\t\tif (rtw_efuse_mask_map_read(padapter, EFUSE_WIFI , mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: read realmap Fail!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i = 0; i < EFUSE_MAP_SIZE; i += 16)\n\t\t{\n//\t\t\tDBG_871X(\"0x%02x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%02x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra, \"%s\\t\", extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra,\"%s\\n\",extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"rmap\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\tDBG_871X(\"%s: rmap Fail!! Parameters error!\\n\", __FUNCTION__);\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// rmap addr cnts\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\tDBG_871X(\"%s: addr=%x\\n\", __FUNCTION__, addr);\n\n\t\tcnts = simple_strtoul(tmp[2], &ptmp, 10);\n\t\tif (cnts == 0)\n\t\t{\n\t\t\tDBG_871X(\"%s: rmap Fail!! cnts error!\\n\", __FUNCTION__);\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr+ cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_mask_map_read error!\\n\", __func__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"%s: data={\", __FUNCTION__);\n\t\t*extra = 0;\n\t\tfor (i=0; i<cnts; i++) {\n//\t\t\tDBG_871X(\"0x%02x \", data[i]);\n\t\t\tsprintf(extra, \"%s0x%02X \", extra, data[i]);\n\t\t}\n//\t\tDBG_871X(\"}\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"realraw\") == 0)\n\t{\n\t\taddr = 0;\n\t\tmapLen = EFUSE_MAX_SIZE;\n\t\tDBG_871X(\"EFUSE_MAX_SIZE = %d\\n\", EFUSE_MAX_SIZE);\n\n\t\tif (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL) {\n\t\t\tDBG_871X(\"%s: rtw_efuse_access Fail!!\\n\", __func__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (mapLen >= 512)\n\t\t\tmapLen = 512;\n\n\t\t_rtw_memset(extra,'\\0',strlen(extra));\n\n\t\tsprintf(extra, \"\\n0x00\\t\");\n\n\t\tfor (i = 0; i < mapLen ; i++) {\n\t\t\tsprintf(extra, \"%s%02X\", extra, rawdata[i]);\n\t\t\tif ((i & 0xF) == 0xF) {\n\t\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t\t\tsprintf(extra, \"%s0x%02x\\t\", extra, i+1);\n\t\t\t} else if ((i & 0x7) == 0x7) {\n\t\t\t\tsprintf(extra, \"%s \\t\", extra);\n\t\t\t} else {\n\t\t\t\tsprintf(extra, \"%s \", extra);\n\t\t\t}\n\t\t}\n\n\t} else if (strcmp(tmp[0], \"realrawb\") == 0) {\n\t\taddr = 0;\n\t\tmapLen = EFUSE_MAX_SIZE;\n\t\tDBG_871X(\"EFUSE_MAX_SIZE =%d\\n\", EFUSE_MAX_SIZE);\n\t\tif (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_access Fail!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\t_rtw_memset(extra,'\\0',strlen(extra));\n\t\t//\t\tDBG_871X(\"%s: realraw={\\n\", __FUNCTION__);\n\t\t\t\tsprintf(extra, \"\\n0x00\\t\");\n\t\t\t\tfor (i= 512; i< mapLen; i++)\n\t\t\t\t{\n\t\t//\t\t\tDBG_871X(\"%02X\", rawdata[i]);\n\t\t\t\t\tsprintf(extra, \"%s%02X\", extra, rawdata[i]);\n\t\t\t\t\tif ((i & 0xF) == 0xF) {\n\t\t//\t\t\t\tDBG_871X(\"\\n\");\n\t\t\t\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t\t\t\t\tsprintf(extra, \"%s0x%02x\\t\", extra, i+1);\n\t\t\t\t\t}\n\t\t\t\t\telse if ((i & 0x7) == 0x7){\n\t\t//\t\t\t\tDBG_871X(\"\\t\");\n\t\t\t\t\t\tsprintf(extra, \"%s \\t\", extra);\n\t\t\t\t\t} else {\n\t\t//\t\t\t\tDBG_871X(\" \");\n\t\t\t\t\t\tsprintf(extra, \"%s \", extra);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t//\t\tDBG_871X(\"}\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"mac\") == 0)\n\t{\t\t\n\t\tif (hal_efuse_macaddr_offset(padapter) == -1) {\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\taddr = hal_efuse_macaddr_offset(padapter);\n\t\tcnts = 6;\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr + cnts) > max_available_size) {\n\t\t\tDBG_871X(\"%s: addr(0x%02x)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_mask_map_read error!\\n\", __func__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"%s: MAC address={\", __FUNCTION__);\n\t\t*extra = 0;\n\t\tfor (i=0; i<cnts; i++)\n\t\t{\n//\t\t\tDBG_871X(\"%02X\", data[i]);\n\t\t\tsprintf(extra, \"%s%02X\", extra, data[i]);\n\t\t\tif (i != (cnts-1))\n\t\t\t{\n//\t\t\t\tDBG_871X(\":\");\n\t\t\t\tsprintf(extra,\"%s:\",extra);\n\t\t\t}\n\t\t}\n//\t\tDBG_871X(\"}\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"vidpid\") == 0)\n\t{\n\t\t#ifdef CONFIG_RTL8188E\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_88EU;\n\t\t\t#endif\n\t\t\t#ifdef CONFIG_PCI_HCI\n\t\t\taddr = EEPROM_VID_88EE;\n\t\t\t#endif\n\t\t#endif // CONFIG_RTL8188E\n\n\t\t#ifdef CONFIG_RTL8192E\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_8192EU;\n\t\t\t#endif\n\t\t\t#ifdef CONFIG_PCI_HCI\n\t\t\taddr = EEPROM_VID_8192EE;\n\t\t\t#endif\n\t\t#endif // CONFIG_RTL8192E\n\t\t#ifdef CONFIG_RTL8723B\n\t\taddr = EEPROM_VID_8723BU;\n\t\t#endif // CONFIG_RTL8192E\n\n\t\t#ifdef CONFIG_RTL8188F\n\t\taddr = EEPROM_VID_8188FU;\n\t\t#endif /* CONFIG_RTL8188F */\n\n\t\t#ifdef CONFIG_RTL8703B\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_8703BU;\n\t\t\t#endif\n\t\t#endif /* CONFIG_RTL8703B */\n\n\t\tcnts = 4;\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr + cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%02x)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\tif (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_access error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"%s: {VID,PID}={\", __FUNCTION__);\n\t\t*extra = 0;\n\t\tfor (i=0; i<cnts; i++)\n\t\t{\n//\t\t\tDBG_871X(\"0x%02x\", data[i]);\n\t\t\tsprintf(extra, \"%s0x%02X\", extra, data[i]);\n\t\t\tif (i != (cnts-1))\n\t\t\t{\n//\t\t\t\tDBG_871X(\",\");\n\t\t\t\tsprintf(extra,\"%s,\",extra);\n\t\t\t}\n\t\t}\n//\t\tDBG_871X(\"}\\n\");\n\t}\n\telse if (strcmp(tmp[0], \"ableraw\") == 0)\n\t{\n\t\tefuse_GetCurrentSize(padapter,&raw_cursize);\n\t\traw_maxsize = efuse_GetMaxSize(padapter);\n\t\tsprintf(extra, \"[available raw size]= %d bytes\", raw_maxsize-raw_cursize);\n\t}\n\telse if (strcmp(tmp[0], \"btfmap\") == 0)\n\t{\n\t\tBTEfuse_PowerSwitch(padapter,1,_TRUE);\n\t\t\t\t\n\t\tmapLen = EFUSE_BT_MAX_MAP_LEN;\n\t\tif (rtw_BT_efuse_map_read(padapter, 0, mapLen, pEfuseHal->BTEfuseInitMap) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_read Fail!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i=0; i<512; i+=16) // set 512 because the iwpriv's extra size have limit 0x7FF\n\t\t{\n//\t\t\tDBG_871X(\"0x%03x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%03x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra,\"%s\\t\",extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0],\"btbmap\") == 0)\n\t{\n\t\tBTEfuse_PowerSwitch(padapter,1,_TRUE);\n\t\t\n\t\tmapLen = EFUSE_BT_MAX_MAP_LEN;\n\t\tif (rtw_BT_efuse_map_read(padapter, 0, mapLen, pEfuseHal->BTEfuseInitMap) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_read Fail!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i=512; i<1024 ; i+=16)\n\t\t{\n//\t\t\tDBG_871X(\"0x%03x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%03x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++)\n\t\t\t{\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra,\"%s\\t\",extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", data[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->BTEfuseInitMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0],\"btrmap\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tBTEfuse_PowerSwitch(padapter,1,_TRUE);\n\t\t\n\t\t// rmap addr cnts\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\n\t\tcnts = simple_strtoul(tmp[2], &ptmp, 10);\n\t\tif (cnts == 0)\n\t\t{\n\t\t\tDBG_871X(\"%s: btrmap Fail!! cnts error!\\n\", __FUNCTION__);\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr + cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_BT_efuse_map_read(padapter, addr, cnts, data) == _FAIL) \n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_read error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t*extra = 0;\n//\t\tDBG_871X(\"%s: bt efuse data={\", __FUNCTION__);\n\t\tfor (i=0; i<cnts; i++)\n\t\t{\n//\t\t\tDBG_871X(\"0x%02x \", data[i]);\n\t\t\tsprintf(extra, \"%s 0x%02X \", extra, data[i]);\n\t\t}\n//\t\tDBG_871X(\"}\\n\");\n\t\tDBG_871X(FUNC_ADPT_FMT \": BT MAC=[%s]\\n\", FUNC_ADPT_ARG(padapter), extra);\n\t}\n\telse if (strcmp(tmp[0], \"btffake\") == 0)\n\t{\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i=0; i<512; i+=16)\n\t\t{\n//\t\t\tDBG_871X(\"0x%03x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%03x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra, \"%s\\t\", extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0],\"btbfake\") == 0)\n\t{\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i=512; i<1024; i+=16)\n\t\t{\n//\t\t\tDBG_871X(\"0x%03x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%03x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra, \"%s\\t\", extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\t}\n\telse if (strcmp(tmp[0],\"wlrfkmap\")== 0)\n\t{\n//\t\tDBG_871X(\"OFFSET\\tVALUE(hex)\\n\");\n\t\tsprintf(extra, \"\\n\");\n\t\tfor (i=0; i<EFUSE_MAP_SIZE; i+=16)\n\t\t{\n//\t\t\tDBG_871X(\"\\t0x%02x\\t\", i);\n\t\t\tsprintf(extra, \"%s0x%02x\\t\", extra, i);\n\t\t\tfor (j=0; j<8; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s%02X \", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\t\");\n\t\t\tsprintf(extra, \"%s\\t\", extra);\n\t\t\tfor (; j<16; j++) {\n//\t\t\t\tDBG_871X(\"%02X \", pEfuseHal->fakeEfuseModifiedMap[i+j]);\n\t\t\t\tsprintf(extra, \"%s %02X\", extra, pEfuseHal->fakeEfuseModifiedMap[i+j]);\n\t\t\t}\n//\t\t\tDBG_871X(\"\\n\");\n\t\t\tsprintf(extra, \"%s\\n\", extra);\n\t\t}\n//\t\tDBG_871X(\"\\n\");\n\n\t}\n\telse if (strcmp(tmp[0],\"wlrfkrmap\")== 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: rmap Fail!! Parameters error!\\n\", __FUNCTION__);\n\t\t\t\t\terr = -EINVAL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\t// rmap addr cnts\n\t\t\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\t\t\tDBG_871X(\"%s: addr=%x\\n\", __FUNCTION__, addr);\n\t\t\n\t\t\t\tcnts = simple_strtoul(tmp[2], &ptmp, 10);\n\t\t\t\tif (cnts == 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: rmap Fail!! cnts error!\\n\", __FUNCTION__);\n\t\t\t\t\terr = -EINVAL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\t\n\t\t//\t\tDBG_871X(\"%s: data={\", __FUNCTION__);\n\t\t\t*extra = 0;\n\t\t\tfor (i=0; i<cnts; i++) {\n\t\t\t\t\tDBG_871X(\"wlrfkrmap = 0x%02x \\n\", pEfuseHal->fakeEfuseModifiedMap[addr+i]);\n\t\t\t\t\tsprintf(extra, \"%s0x%02X \", extra, pEfuseHal->fakeEfuseModifiedMap[addr+i]);\n\t\t\t}\n\t}\n\telse if (strcmp(tmp[0],\"btrfkrmap\")== 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: rmap Fail!! Parameters error!\\n\", __FUNCTION__);\n\t\t\t\t\terr = -EINVAL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\t// rmap addr cnts\n\t\t\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\t\t\tDBG_871X(\"%s: addr=%x\\n\", __FUNCTION__, addr);\n\t\t\n\t\t\t\tcnts = simple_strtoul(tmp[2], &ptmp, 10);\n\t\t\t\tif (cnts == 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: rmap Fail!! cnts error!\\n\", __FUNCTION__);\n\t\t\t\t\terr = -EINVAL;\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\t\n\t\t//\t\tDBG_871X(\"%s: data={\", __FUNCTION__);\n\t\t\t*extra = 0;\n\t\t\tfor (i=0; i<cnts; i++) {\n\t\t\t\t\tDBG_871X(\"wlrfkrmap = 0x%02x \\n\", pEfuseHal->fakeBTEfuseModifiedMap[addr+i]);\n\t\t\t\t\tsprintf(extra, \"%s0x%02X \", extra, pEfuseHal->fakeBTEfuseModifiedMap[addr+i]);\n\t\t\t}\n\t}\n\telse\n\t{\n\t\t sprintf(extra, \"Command not found!\");\n\t}\n\nexit:\n\tif (data)\n\t\trtw_mfree(data, EFUSE_BT_MAX_MAP_LEN);\n\tif (rawdata)\n\t\trtw_mfree(rawdata, EFUSE_BT_MAX_MAP_LEN);\n\tif (!err)\n\t\twrqu->length = strlen(extra);\n\t\n\tif (padapter->registrypriv.mp_mode == 0)\n\t{\n\t#ifdef CONFIG_IPS\t\t\n\trtw_pm_set_ips(padapter, ips_mode);\n#endif // CONFIG_IPS\n\n\t#ifdef CONFIG_LPS\t\n\trtw_pm_set_lps(padapter, lps_mode);\n#endif // CONFIG_LPS\n\t}\n\n\t#ifdef CONFIG_IOL\n\tpadapter->registrypriv.fw_iol = org_fw_iol;// 0:Disable, 1:enable, 2:by usb speed\n\t#endif\n\treturn err;\n}\n\nstatic int rtw_mp_efuse_set(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wdata, char *extra)\n{\n\tstruct iw_point *wrqu;\n\tPADAPTER padapter;\n\tstruct pwrctrl_priv *pwrctrlpriv ;\n\tPHAL_DATA_TYPE pHalData;\n\tPEFUSE_HAL pEfuseHal;\n\n\tu8 ips_mode = IPS_NUM; // init invalid value\n\tu8 lps_mode = PS_MODE_NUM; // init invalid value\n\tu32 i=0,j=0, jj, kk;\n\tu8 *setdata = NULL;\n\tu8 *ShadowMapBT = NULL;\n\tu8 *ShadowMapWiFi = NULL;\n\tu8 *setrawdata = NULL;\n\tchar *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};\n\tu16 addr=0xFF, cnts=0, BTStatus=0 , max_available_size=0;\n\tint err;\n\n\twrqu = (struct iw_point*)wdata;\n\tpadapter = rtw_netdev_priv(dev);\n\tpwrctrlpriv = adapter_to_pwrctl(padapter);\n\tpHalData = GET_HAL_DATA(padapter);\n\tpEfuseHal = &pHalData->EfuseHal;\n\terr = 0;\n\t\n\tif (copy_from_user(extra, wrqu->pointer, wrqu->length))\n\t\t\treturn -EFAULT;\n\t\t\t\n\tsetdata = rtw_zmalloc(1024);\n\tif (setdata == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\tShadowMapBT = rtw_malloc(EFUSE_BT_MAX_MAP_LEN);\n\tif (ShadowMapBT == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\tShadowMapWiFi = rtw_malloc(EFUSE_MAP_SIZE);\n\tif (ShadowMapWiFi == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\tsetrawdata = rtw_malloc(EFUSE_MAX_SIZE);\n\tif (setrawdata == NULL)\n\t{\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\t#ifdef CONFIG_LPS\n\tlps_mode = pwrctrlpriv->power_mgnt;//keep org value\n\trtw_pm_set_lps(padapter,PS_MODE_ACTIVE);\n\t#endif\t\n\t\n\t#ifdef CONFIG_IPS\t\n\tips_mode = pwrctrlpriv->ips_mode;//keep org value\n\trtw_pm_set_ips(padapter,IPS_NONE);\n\t#endif\t\n\t\t\t\n\tpch = extra;\n\tDBG_871X(\"%s: in=%s\\n\", __FUNCTION__, extra);\n\t\n\ti = 0;\n\twhile ((token = strsep(&pch, \",\")) != NULL)\n\t{\n\t\tif (i > 2) break;\n\t\ttmp[i] = token;\n\t\ti++;\n\t}\n\n\t// tmp[0],[1],[2]\n\t// wmap,addr,00e04c871200\n\tif (strcmp(tmp[0], \"wmap\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n#if 1\n\t\t// unknown bug workaround, need to fix later\n\t\taddr=0x1ff;\n\t\trtw_write8(padapter, EFUSE_CTRL+1, (addr & 0xff));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+2, ((addr >> 8) & 0x03));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+3, 0x72);\n\t\trtw_msleep_os(10);\n\t\trtw_read8(padapter, EFUSE_CTRL);\n#endif\n\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\taddr &= 0xFFF;\n\n\t\tcnts = strlen(tmp[2]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: map data=%s\\n\", __FUNCTION__, tmp[2]);\n\t\t\t\t\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tsetdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);\n\t\t}\n#ifndef CONFIG_RTL8188E\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n#else\n\t\t//Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256.\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE);\n#endif\n\t\tif ((addr+cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_map_write error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\t*extra = 0;\n\t\tDBG_871X(\"%s: after rtw_efuse_map_write to _rtw_memcmp\\n\", __func__);\n\t\tif (rtw_efuse_mask_map_read(padapter, addr, cnts, ShadowMapWiFi) == _SUCCESS)\n\t\t{\n\t\t\tif (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts))\n\t\t\t{ \n\t\t\t\tDBG_871X(\"%s: WiFi write map afterf compare success\\n\", __FUNCTION__);\n\t\t\t\tsprintf(extra, \"WiFi write map compare OK\\n\");\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsprintf(extra, \"WiFi write map compare FAIL\\n\");\n\t\t\t\tDBG_871X(\"%s: WiFi write map compare Fail\\n\", __FUNCTION__);\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"wraw\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\taddr = simple_strtoul( tmp[1], &ptmp, 16 );\n\t\taddr &= 0xFFF;\n\n\t\tcnts = strlen(tmp[2]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: raw data=%s\\n\", __FUNCTION__, tmp[2]);\n\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tsetrawdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);\n\t\t}\n\n\t\tif (rtw_efuse_access(padapter, _TRUE, addr, cnts, setrawdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_access error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"mac\") == 0)\n\t{\n\t\tif (tmp[1]==NULL)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t//mac,00e04c871200\n\t\t\n\t\tif (hal_efuse_macaddr_offset(padapter) == -1) {\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\taddr = hal_efuse_macaddr_offset(padapter);\n\t\tcnts = strlen(tmp[1]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tif (cnts > 6)\n\t\t{\n\t\t\tDBG_871X(\"%s: error data for mac addr=\\\"%s\\\"\\n\", __FUNCTION__, tmp[1]);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: MAC address=%s\\n\", __FUNCTION__, tmp[1]);\n\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tsetdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);\n\t\t}\n#ifndef CONFIG_RTL8188E\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n#else\n\t\t//Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256.\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE);\n#endif\n\t\tif ((addr+cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_map_write error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"vidpid\") == 0)\n\t{\n\t\tif (tmp[1]==NULL)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t// pidvid,da0b7881\t\t\n\t\t#ifdef CONFIG_RTL8188E\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_88EU;\n\t\t\t#endif\n\t\t\t#ifdef CONFIG_PCI_HCI\n\t\t\taddr = EEPROM_VID_88EE;\n\t\t\t#endif\n\t\t#endif // CONFIG_RTL8188E\n\n\t\t#ifdef CONFIG_RTL8192E\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_8192EU;\n\t\t\t#endif\n\t\t\t#ifdef CONFIG_PCI_HCI\n\t\t\taddr = EEPROM_VID_8192EE;\n\t\t\t#endif\n\t\t#endif // CONFIG_RTL8188E\n\n\t\t#ifdef CONFIG_RTL8723B\n\t\taddr = EEPROM_VID_8723BU;\n\t\t#endif\n\n\t\t#ifdef CONFIG_RTL8188F\n\t\taddr = EEPROM_VID_8188FU;\n\t\t#endif\n\n\t\t#ifdef CONFIG_RTL8703B\n\t\t\t#ifdef CONFIG_USB_HCI\n\t\t\taddr = EEPROM_VID_8703BU;\n\t\t\t#endif /* CONFIG_USB_HCI */\n\t\t#endif /* CONFIG_RTL8703B */\n\n\t\tcnts = strlen(tmp[1]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: VID/PID=%s\\n\", __FUNCTION__, tmp[1]);\n\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tsetdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);\n\t\t}\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr+cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_map_write error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t}\n        else if (strcmp(tmp[0], \"wldumpfake\") == 0)\n\t{\n\t\tif (rtw_efuse_mask_map_read(padapter, 0, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) {\n\t\t\tDBG_871X(\"%s: WiFi hw efuse dump to Fake map success\\n\", __func__);\n\t\t} else {\n\t\t\tDBG_871X(\"%s: WiFi hw efuse dump to Fake map Fail\\n\", __func__);\n\t\t\terr = -EFAULT;\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"btwmap\") == 0)\n\t{\n\t\trtw_write8(padapter, 0xa3, 0x05); //For 8723AB ,8821S ?\n\t\tBTStatus=rtw_read8(padapter, 0xa0);\n\t\tDBG_871X(\"%s: btwmap before read 0xa0 BT Status =0x%x \\n\", __FUNCTION__,BTStatus);\n\t\tif (BTStatus != 0x04)\n\t\t{\n\t\t\tsprintf(extra, \"BT Status not Active Write FAIL\\n\");\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tBTEfuse_PowerSwitch(padapter,1,_TRUE);\n\t\t\n\t\taddr=0x1ff;\n\t\trtw_write8(padapter, EFUSE_CTRL+1, (addr & 0xff));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+2, ((addr >> 8) & 0x03));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+3, 0x72);\n\t\trtw_msleep_os(10);\n\t\trtw_read8(padapter, EFUSE_CTRL);\n\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\taddr &= 0xFFF;\n\n\t\tcnts = strlen(tmp[2]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: BT data=%s\\n\", __FUNCTION__, tmp[2]);\n\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tsetdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);\n\t\t}\n\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif ((addr+cnts) > max_available_size)\n\t\t{\n\t\t\tDBG_871X(\"%s: addr(0x%X)+cnts(%d) parameter error!\\n\", __FUNCTION__, addr, cnts);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_BT_efuse_map_write(padapter, addr, cnts, setdata) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_write error!!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\t*extra = 0;\n\t\tDBG_871X(\"%s: after rtw_BT_efuse_map_write to _rtw_memcmp \\n\", __FUNCTION__);\n\t\tif ( (rtw_BT_efuse_map_read(padapter, addr, cnts, ShadowMapBT ) == _SUCCESS ) )\n\t\t{\n\t\t\tif (_rtw_memcmp((void*)ShadowMapBT ,(void*)setdata,cnts))\n\t\t\t{ \n\t\t\t\tDBG_871X(\"%s: BT write map compare OK BTStatus=0x%x\\n\", __FUNCTION__,BTStatus);\n\t\t\t\tsprintf(extra, \"BT write map compare OK\");\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsprintf(extra, \"BT write map compare FAIL\");\n\t\t\t\tDBG_871X(\"%s: BT write map compare FAIL BTStatus=0x%x\\n\", __FUNCTION__,BTStatus);\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"btwfake\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\taddr &= 0xFFF;\n\n\t\tcnts = strlen(tmp[2]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: BT tmp data=%s\\n\", __FUNCTION__, tmp[2]);\n\t\t\t\t\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tpEfuseHal->fakeBTEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"btdumpfake\") == 0)\n\t{\n\t\tif (rtw_BT_efuse_map_read(padapter, 0, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _SUCCESS) {\n\t\t\tDBG_871X(\"%s: BT read all map success\\n\", __FUNCTION__);\n\t\t} else {\n\t\t\tDBG_871X(\"%s: BT read all map Fail!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"btfk2map\") == 0)\n\t{\n\t\trtw_write8(padapter, 0xa3, 0x05);\n\t\tBTStatus=rtw_read8(padapter, 0xa0);\n\t\tDBG_871X(\"%s: btwmap before read 0xa0 BT Status =0x%x \\n\", __FUNCTION__,BTStatus);\n\t\tif (BTStatus != 0x04)\n\t\t{\n\t\t\tsprintf(extra, \"BT Status not Active Write FAIL\\n\");\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tBTEfuse_PowerSwitch(padapter,1,_TRUE);\n\n\t\taddr=0x1ff;\n\t\trtw_write8(padapter, EFUSE_CTRL+1, (addr & 0xff));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+2, ((addr >> 8) & 0x03));\n\t\trtw_msleep_os(10);\n\t\trtw_write8(padapter, EFUSE_CTRL+3, 0x72);\n\t\trtw_msleep_os(10);\n\t\trtw_read8(padapter, EFUSE_CTRL);\n\n\t\t_rtw_memcpy(pEfuseHal->BTEfuseModifiedMap, pEfuseHal->fakeBTEfuseModifiedMap, EFUSE_BT_MAX_MAP_LEN);\n\t\t\t\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\t\n\t\tif (max_available_size < 1)\n\t\t{\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tif (rtw_BT_efuse_map_write(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_write error!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\t\n\t\tDBG_871X(\"pEfuseHal->fakeBTEfuseModifiedMap OFFSET\\tVALUE(hex)\\n\");\n\t\tfor (i = 0; i < EFUSE_BT_MAX_MAP_LEN; i += 16)\n\t\t{\n\t\t\tprintk(\"0x%02x\\t\", i);\n\t\t\tfor (j=0; j<8; j++) {\n\t\t\t\tprintk(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n\t\t\tprintk(\"\\t\");\n\n\t\t\tfor (; j<16; j++) {\n\t\t\t\tprintk(\"%02X \", pEfuseHal->fakeBTEfuseModifiedMap[i+j]);\n\t\t\t}\n\t\t\tprintk(\"\\n\");\n\t\t}\n\t\tprintk(\"\\n\");\n#if 1\t\t\n\t\terr = -EFAULT;\n\t\tDBG_871X(\"%s: rtw_BT_efuse_map_read _rtw_memcmp \\n\", __FUNCTION__);\n\t\tif ( (rtw_BT_efuse_map_read(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseInitMap) == _SUCCESS ) )\n\t\t{ \n\t\t\tif (_rtw_memcmp((void*)pEfuseHal->fakeBTEfuseModifiedMap,(void*)pEfuseHal->fakeBTEfuseInitMap,EFUSE_BT_MAX_MAP_LEN))\n\t\t\t{ \n\t\t\t\tsprintf(extra, \"BT write map compare OK\");\n\t\t\t\tDBG_871X(\"%s: BT write map afterf compare success BTStatus=0x%x \\n\", __FUNCTION__,BTStatus);\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsprintf(extra, \"BT write map compare FAIL\");\n\t\t\t\tif (rtw_BT_efuse_map_write(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _FAIL)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"%s: rtw_BT_efuse_map_write compare error,retry = %d!\\n\", __FUNCTION__,i);\n\t\t\t\t}\n\n\t\t\t\tif (rtw_BT_efuse_map_read(padapter, EFUSE_BT, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseInitMap) == _SUCCESS)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X(\"pEfuseHal->fakeBTEfuseInitMap OFFSET\\tVALUE(hex)\\n\");\n\n\t\t\t\t\tfor (i = 0; i < EFUSE_BT_MAX_MAP_LEN; i += 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tprintk(\"0x%02x\\t\", i);\n\t\t\t\t\t\tfor (j=0; j<8; j++) {\n\t\t\t\t\t\t\tprintk(\"%02X \", pEfuseHal->fakeBTEfuseInitMap[i+j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprintk(\"\\t\");\n\t\t\t\t\t\tfor (; j<16; j++) {\n\t\t\t\t\t\t\tprintk(\"%02X \", pEfuseHal->fakeBTEfuseInitMap[i+j]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprintk(\"\\n\");\n\t\t\t\t\t}\n\t\t\t\t\tprintk(\"\\n\"); \n\t\t\t\t}\n\t\t\t\tDBG_871X(\"%s: BT write map afterf compare not match to write efuse try write Map again , BTStatus=0x%x\\n\", __FUNCTION__,BTStatus);\t\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n#endif\n\n\t}\n\telse if (strcmp(tmp[0], \"wlfk2map\") == 0)\n\t{\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\t\t\t\t\t\n\t\tif (max_available_size < 1)\n\t\t{\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\tif (rtw_efuse_map_write(padapter, 0x00, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _FAIL)\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_efuse_map_write fakeEfuseModifiedMap error!\\n\", __FUNCTION__);\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\t*extra = 0;\n\t\tDBG_871X(\"%s: after rtw_BT_efuse_map_write to _rtw_memcmp\\n\", __func__);\n\t\tif (rtw_efuse_mask_map_read(padapter, 0x00, EFUSE_MAP_SIZE, ShadowMapWiFi) == _SUCCESS)\n\t\t{\n\t\t\tif (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts))\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s: WiFi write map afterf compare OK\\n\", __FUNCTION__);\n\t\t\t\tsprintf(extra, \"WiFi write map compare OK\\n\");\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsprintf(extra, \"WiFi write map compare FAIL\\n\");\n\t\t\t\tDBG_871X(\"%s: WiFi write map compare Fail\\n\", __FUNCTION__);\n\t\t\t\terr = 0;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t}\n\t}\n\telse if (strcmp(tmp[0], \"wlwfake\") == 0)\n\t{\n\t\tif ((tmp[1]==NULL) || (tmp[2]==NULL))\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\taddr = simple_strtoul(tmp[1], &ptmp, 16);\n\t\taddr &= 0xFFF;\n\n\t\tcnts = strlen(tmp[2]);\n\t\tif (cnts%2)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t\tcnts /= 2;\n\t\tif (cnts == 0)\n\t\t{\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tDBG_871X(\"%s: addr=0x%X\\n\", __FUNCTION__, addr);\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __FUNCTION__, cnts);\n\t\tDBG_871X(\"%s: map tmp data=%s\\n\", __FUNCTION__, tmp[2]);\n\n\t\tfor (jj=0, kk=0; jj<cnts; jj++, kk+=2)\n\t\t{\n\t\t\tpEfuseHal->fakeEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);\n\t\t}\n\t\t_rtw_memset(extra, '\\0', strlen(extra));\n\t\tsprintf(extra, \"wlwfake OK\\n\");\n\t}\n\nexit:\n\tif (setdata)\n\t\trtw_mfree(setdata, 1024);\n\tif (ShadowMapBT)\n\t\trtw_mfree(ShadowMapBT, EFUSE_BT_MAX_MAP_LEN);\n\tif (ShadowMapWiFi)\n\t\trtw_mfree(ShadowMapWiFi, EFUSE_MAP_SIZE);\n\tif (setrawdata)\n\t\trtw_mfree(setrawdata, EFUSE_MAX_SIZE);\n\t\n\twrqu->length = strlen(extra);\n\n\tif (padapter->registrypriv.mp_mode == 0)\n\t{\n\t#ifdef CONFIG_IPS\t\t\n\trtw_pm_set_ips(padapter, ips_mode);\n        #endif // CONFIG_IPS\n\n\t#ifdef CONFIG_LPS\t\n\trtw_pm_set_lps(padapter, lps_mode);\n        #endif // CONFIG_LPS\n\t}\n\n\treturn err;\n}\n\n\n#ifdef CONFIG_MP_INCLUDED\n\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n#define DBG_MP_SDIO_INDIRECT_ACCESS 1\nstatic int rtw_mp_sd_iread(struct net_device *dev\n\t, struct iw_request_info *info\n\t, struct iw_point *wrqu\n\t, char *extra)\n{\n\tchar input[16];\n\tu8 width;\n\tunsigned long addr;\n\tu32 ret = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\tif (wrqu->length > 16) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" wrqu->length:%d\\n\", FUNC_ADPT_ARG(padapter), wrqu->length);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" copy_from_user fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tif (sscanf(input, \"%hhu,%lx\", &width, &addr) != 2) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" sscanf fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (addr > 0x3FFF) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" addr:0x%lx\\n\", FUNC_ADPT_ARG(padapter), addr);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (DBG_MP_SDIO_INDIRECT_ACCESS)\n\t\tDBG_871X(FUNC_ADPT_FMT\" width:%u, addr:0x%lx\\n\", FUNC_ADPT_ARG(padapter), width, addr);\n\n\tswitch (width) {\n\tcase 1:\n\t\tsprintf(extra, \"0x%02x\", rtw_sd_iread8(padapter, addr));\n\t\twrqu->length = strlen(extra);\n\t\tbreak;\n\tcase 2:\n\t\tsprintf(extra, \"0x%04x\", rtw_sd_iread16(padapter, addr));\n\t\twrqu->length = strlen(extra);\n\t\tbreak;\n\tcase 4:\n\t\tsprintf(extra, \"0x%08x\", rtw_sd_iread32(padapter, addr));\n\t\twrqu->length = strlen(extra);\n\t\tbreak;\n\tdefault:\n\t\twrqu->length = 0;\n\t\tret = -EINVAL;\n\t\tbreak;\n\t}\n\nexit:\n\treturn ret;\n}\n\nstatic int rtw_mp_sd_iwrite(struct net_device *dev\n\t, struct iw_request_info *info\n\t, struct iw_point *wrqu\n\t, char *extra)\n{\n\tchar width;\n\tunsigned long addr, data;\n\tint ret = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar input[32];\n\n\tif (wrqu->length > 32) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" wrqu->length:%d\\n\", FUNC_ADPT_ARG(padapter), wrqu->length);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" copy_from_user fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\t\t\t\t \n\t_rtw_memset(extra, 0, wrqu->length);\t\n\n\tif (sscanf(input, \"%hhu,%lx,%lx\", &width, &addr, &data) != 3) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" sscanf fail\\n\", FUNC_ADPT_ARG(padapter));\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (addr > 0x3FFF) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" addr:0x%lx\\n\", FUNC_ADPT_ARG(padapter), addr);\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\n\tif (DBG_MP_SDIO_INDIRECT_ACCESS)\n\t\tDBG_871X(FUNC_ADPT_FMT\" width:%u, addr:0x%lx, data:0x%lx\\n\", FUNC_ADPT_ARG(padapter), width, addr, data);\n\n\tswitch (width) {\n\tcase 1:\n\t\tif (data > 0xFF) {\n\t\t\tret = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\trtw_sd_iwrite8(padapter, addr, data);\n\t\tbreak;\n\tcase 2:\n\t\tif (data > 0xFFFF) {\n\t\t\tret = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\trtw_sd_iwrite16(padapter, addr, data);\n\t\tbreak;\n\tcase 4:\n\t\trtw_sd_iwrite32(padapter, addr, data);\n\t\tbreak;\n\tdefault:\n\t\twrqu->length = 0;\n\t\tret = -EINVAL;\n\t\tbreak;\n\t}\n\nexit:\n\treturn ret;\n}\n#endif /* CONFIG_SDIO_INDIRECT_ACCESS */\n\nstatic int rtw_mp_set(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wdata, char *extra)\n{\n\tstruct iw_point *wrqu = (struct iw_point *)wdata;\n\tu32 subcmd = wrqu->flags;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\tif (padapter == NULL)\n\t{\n\t\treturn -ENETDOWN;\n\t}\n\n\tif((padapter->bup == _FALSE ))\n\t{\n\t\tDBG_871X(\" %s fail =>(padapter->bup == _FALSE )\\n\",__FUNCTION__);\n\t\treturn -ENETDOWN;\n\t}\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"%s fail =>(bSurpriseRemoved == _TRUE) || ( bDriverStopped == _TRUE)\\n\", __func__);\n\t\treturn -ENETDOWN;\n       }\n\n\t\n\t//_rtw_memset(extra, 0x00, IW_PRIV_SIZE_MASK);\n\n\tif (extra == NULL)\n\t{\n\t\twrqu->length = 0;\n\t\treturn -EIO;\n\t}\n\n\tswitch(subcmd)\n\t{\n\tcase MP_START:\n\t\t\tDBG_871X(\"set case mp_start \\n\");\n\t\t\trtw_mp_start (dev,info,wrqu,extra);\n\t\t\t break; \n\t\t\t \n\tcase MP_STOP:\n\t\t\tDBG_871X(\"set case mp_stop \\n\");\n\t\t\trtw_mp_stop (dev,info,wrqu,extra);\n\t\t\t break; \n\t\t\t \n\tcase MP_BANDWIDTH:\n\t\t\tDBG_871X(\"set case mp_bandwidth \\n\");\n\t\t\trtw_mp_bandwidth (dev,info,wrqu,extra);\n\t\t\tbreak;\n\t\t\t\t\n\tcase MP_RESET_STATS:\n\t\t\tDBG_871X(\"set case MP_RESET_STATS \\n\");\n\t\t\trtw_mp_reset_stats\t(dev,info,wrqu,extra);\n\t\t\tbreak;\n\tcase MP_SetRFPathSwh:\t\t\n\t\t\tDBG_871X(\"set MP_SetRFPathSwitch \\n\");\n\t\t\trtw_mp_SetRFPath  (dev,info,wdata,extra);\n\t\t\tbreak;\n\tcase CTA_TEST:\n\t\t\tDBG_871X(\"set CTA_TEST\\n\");\n\t\t\trtw_cta_test_start (dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase MP_DISABLE_BT_COEXIST:\n\t\t\tDBG_871X(\"set case MP_DISABLE_BT_COEXIST \\n\");\n\t\t\trtw_mp_disable_bt_coexist(dev, info, wdata, extra);\n\t\tbreak;\n#ifdef CONFIG_WOWLAN\n\tcase MP_WOW_ENABLE:\n\t\t\tDBG_871X(\"set case MP_WOW_ENABLE: %s\\n\", extra);\n\t\t\t\n\t\t\trtw_wowlan_ctrl(dev, info, wdata, extra);\n\tbreak;\n\tcase MP_WOW_SET_PATTERN:\n\t\t\tDBG_871X(\"set case MP_WOW_SET_PATTERN: %s\\n\", extra);\n\t\t\trtw_wowlan_set_pattern(dev, info, wdata, extra);\n\tbreak;\n#endif\n#ifdef CONFIG_AP_WOWLAN\n\tcase MP_AP_WOW_ENABLE:\n\t\t\tDBG_871X(\"set case MP_AP_WOW_ENABLE: %s\\n\", extra);\n\t\t\trtw_ap_wowlan_ctrl(dev, info, wdata, extra);\n\tbreak;\n#endif\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tcase VENDOR_IE_SET:\n\t\tDBG_871X(\"set case VENDOR_IE_SET\\n\");\n\t\trtw_vendor_ie_set(dev , info , wdata , extra);\n\t\tbreak;\n#endif\n\tdefault:\n\t\treturn -EIO;\n\t}\n\n\t  \n\treturn 0;\t\t\n}\n\n\nstatic int rtw_mp_get(struct net_device *dev,\n\t\t\tstruct iw_request_info *info,\n\t\t\tunion iwreq_data *wdata, char *extra)\n{\n\tstruct iw_point *wrqu = (struct iw_point *)wdata;\n\tu32 subcmd = wrqu->flags;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\t//DBG_871X(\"in mp_get extra= %s \\n\",extra);\n\n\tif (padapter == NULL)\n\t{\n\t\treturn -ENETDOWN;\n\t}\n\tif((padapter->bup == _FALSE ))\n\t{\n\t\tDBG_871X(\" %s fail =>(padapter->bup == _FALSE )\\n\",__FUNCTION__);\n\t\treturn -ENETDOWN;\n\t}\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"%s fail =>(padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)\\n\", __func__);\n\t\treturn -ENETDOWN;\n       }\n\t\n\tif (extra == NULL) {\n\t\twrqu->length = 0;\n\t\treturn -EIO;\n\t}\n\t\n\tswitch (subcmd) {\n\tcase WRITE_REG:\n\t\t\trtw_mp_write_reg(dev, info, wrqu, extra);\n\t\t\t break;\n\t\t\t \n\tcase WRITE_RF:\n\t\t\trtw_mp_write_rf(dev, info, wrqu, extra);\n\t\t\t break; \n\t\t\t \n\tcase MP_PHYPARA:\n\t\t\tDBG_871X(\"mp_get  MP_PHYPARA\\n\");\n\t\t\trtw_mp_phypara(dev, info, wrqu, extra);\n\t\t\tbreak;\n\n\tcase MP_CHANNEL:\n\t\t\tDBG_871X(\"set case mp_channel\\n\");\n\t\t\trtw_mp_channel(dev , info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase READ_REG:\n\t\t\tDBG_871X(\"mp_get  READ_REG\\n\");\n\t\t\trtw_mp_read_reg(dev, info, wrqu, extra);\n\t\t\t break; \n\tcase READ_RF:\n\t\t\tDBG_871X(\"mp_get  READ_RF\\n\");\n\t\t\trtw_mp_read_rf(dev, info, wrqu, extra);\n\t\t\tbreak; \n\t\t\t\n\tcase MP_RATE:\n\t\t\tDBG_871X(\"set case mp_rate\\n\");\n\t\t\trtw_mp_rate(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase MP_TXPOWER:\n\t\t\tDBG_871X(\"set case MP_TXPOWER\\n\");\n\t\t\trtw_mp_txpower(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase MP_ANT_TX:\n\t\t\tDBG_871X(\"set case MP_ANT_TX\\n\");\n\t\t\trtw_mp_ant_tx(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase MP_ANT_RX:\n\t\t\tDBG_871X(\"set case MP_ANT_RX\\n\");\n\t\t\trtw_mp_ant_rx(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase MP_QUERY:\n\t\t\trtw_mp_trx_query(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\t\t\n\tcase MP_CTX:\n\t\t\tDBG_871X(\"set case MP_CTX\\n\");\n\t\t\trtw_mp_ctx(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\t\t\n\tcase MP_ARX:\n\t\t\tDBG_871X(\"set case MP_ARX\\n\");\n\t\t\trtw_mp_arx(dev, info, wrqu, extra);\n\t\t\tbreak;\n\t\t\t\n\tcase EFUSE_GET:\n\t\t\tDBG_871X(\"efuse get EFUSE_GET\\n\");\n\t\t\trtw_mp_efuse_get(dev, info, wdata, extra);\n\t\t break; \n\t\t \n\tcase MP_DUMP:\n\t\t\tDBG_871X(\"set case MP_DUMP\\n\");\n\t\t\trtw_mp_dump(dev, info, wrqu, extra);\n\t\t break; \n\tcase MP_PSD:\n\t\t\tDBG_871X(\"set case MP_PSD\\n\");\n\t\t\trtw_mp_psd(dev, info, wrqu, extra);\n\t\t break;\n\tcase MP_THER:\n\t\t\tDBG_871X(\"set case MP_THER\\n\");\n\t\t\trtw_mp_thermal(dev, info, wrqu, extra);\n\t\tbreak;\n\tcase MP_PwrCtlDM:\n\t\t\tDBG_871X(\"set MP_PwrCtlDM\\n\");\n\t\t\trtw_mp_PwrCtlDM(dev, info, wrqu, extra);\n\t\tbreak;\n\tcase MP_QueryDrvStats:\t\t\n\t\t\tDBG_871X(\"mp_get MP_QueryDrvStats\\n\");\n\t\t\trtw_mp_QueryDrv(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase MP_PWRTRK:\n\t\t\tDBG_871X(\"set case MP_PWRTRK\\n\");\n\t\t\trtw_mp_pwrtrk(dev, info, wrqu, extra);\n\t\t\tbreak;\t\t\t \n\tcase EFUSE_SET:\n\t\t\tDBG_871X(\"set case efuse set\\n\");\n\t\t\trtw_mp_efuse_set(dev, info, wdata, extra);\n\t\t\tbreak;\t\t\t \n\tcase MP_GET_TXPOWER_INX:\n\t\t\tDBG_871X(\"mp_get MP_GET_TXPOWER_INX\\n\");\n\t\t\trtw_mp_txpower_index(dev, info, wrqu, extra);\n\t\t\tbreak;\n\tcase MP_GETVER:\n\t\t\tDBG_871X(\"mp_get MP_GETVER\\n\");\n\t\t\trtw_mp_getver(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase MP_MON:\n\t\t\tDBG_871X(\"mp_get MP_MON\\n\");\n\t\t\trtw_mp_mon(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase EFUSE_MASK:\n\t\t\tDBG_871X(\"mp_get EFUSE_MASK\\n\");\n\t\t\trtw_efuse_mask_file(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase  EFUSE_FILE:\n\t\t\tDBG_871X(\"mp_get EFUSE_FILE\\n\");\n\t\t\trtw_efuse_file_map(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase  MP_TX:\n\t\t\tDBG_871X(\"mp_get MP_TX\\n\");\n\t\t\trtw_mp_tx(dev, info, wdata, extra);\n\t\t\tbreak;\n\tcase  MP_RX:\n\t\t\tDBG_871X(\"mp_get MP_RX\\n\");\n\t\t\trtw_mp_rx(dev, info, wdata, extra);\n\t\t\tbreak;\n#if defined(CONFIG_RTL8723B)\n\tcase MP_SetBT:\t\t\n\t\t\tDBG_871X(\"set MP_SetBT\\n\");\n\t\t\trtw_mp_SetBT(dev, info, wdata, extra);\n\t\t\tbreak;\t\t \n#endif\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\tcase MP_SD_IREAD:\n\t\trtw_mp_sd_iread(dev, info, wrqu, extra);\n\t\tbreak;\n\tcase MP_SD_IWRITE:\n\t\trtw_mp_sd_iwrite(dev, info, wrqu, extra);\n\t\tbreak;\n#endif\n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\tcase VENDOR_IE_GET:\n\t\tDBG_871X(\"get case VENDOR_IE_GET\\n\");\n\t\trtw_vendor_ie_get(dev , info , wdata , extra);\n\t\tbreak;\n#endif\n\tdefault:\n\t\treturn -EIO;\n\t}\n\n\trtw_msleep_os(10); //delay 5ms for sending pkt before exit adb shell operation\nreturn 0;\t\n}\n\n#endif /*#if defined(CONFIG_MP_INCLUDED)*/\n\nstatic int rtw_wfd_tdls_enable(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_WFD\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tif ( extra[ 0 ] == '0' )\n\t\tpadapter->wdinfo.wfd_tdls_enable = 0;\n\telse\n\t\tpadapter->wdinfo.wfd_tdls_enable = 1;\n\n#endif /* CONFIG_WFD */\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\nstatic int rtw_tdls_weaksec(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\n\tu8 i, j;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tif ( extra[ 0 ] == '0' )\n\t\tpadapter->wdinfo.wfd_tdls_weaksec = 0;\n\telse\n\t\tpadapter->wdinfo.wfd_tdls_weaksec = 1;\n\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\n\nstatic int rtw_tdls_enable(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info\t*ptdlsinfo = &padapter->tdlsinfo;\n\t_irqL\t irqL;\n\t_list\t*plist, *phead;\n\ts32\tindex;\n\tstruct sta_info *psta = NULL;\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tu8 tdls_sta[NUM_STA][ETH_ALEN];\n\tu8 empty_hwaddr[ETH_ALEN] = { 0x00 };\n\tstruct tdls_txmgmt txmgmt;\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\t_rtw_memset(tdls_sta, 0x00, sizeof(tdls_sta));\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\n\tif (extra[ 0 ] == '0') {\n\t\tptdlsinfo->tdls_enable = 0;\n\n\t\tif(pstapriv->asoc_sta_count==1)\n\t\t\treturn ret;\n\n\t\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\t\tfor (index=0; index< NUM_STA; index++) {\n\t\t\tphead = &(pstapriv->sta_hash[index]);\n\t\t\tplist = get_next(phead);\n\t\t\t\n\t\t\twhile (rtw_end_of_queue_search(phead, plist) == _FALSE) {\n\t\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);\n\n\t\t\t\tplist = get_next(plist);\n\n\t\t\t\tif (psta->tdls_sta_state != TDLS_STATE_NONE) {\n\t\t\t\t\t_rtw_memcpy(tdls_sta[index], psta->hwaddr, ETH_ALEN);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\t\tfor (index=0; index< NUM_STA; index++) {\n\t\t\tif (!_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN)) {\n\t\t\t\tDBG_871X(\"issue tear down to \"MAC_FMT\"\\n\", MAC_ARG(tdls_sta[index]));\n\t\t\t\ttxmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;\n\t\t\t\t_rtw_memcpy(txmgmt.peer, tdls_sta[index], ETH_ALEN);\n\t\t\t\tissue_tdls_teardown(padapter, &txmgmt, _TRUE);\n\t\t\t}\n\t\t}\n\t\trtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR);\n\t\trtw_reset_tdls_info(padapter);\n\t}\telse if (extra[0] == '1') {\n\t\tptdlsinfo->tdls_enable = 1;\n\t}\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\nstatic int rtw_tdls_setup(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n#ifdef CONFIG_TDLS\n\tu8 i, j;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_txmgmt txmgmt;\n#ifdef CONFIG_WFD\n\tstruct wifidirect_info *pwdinfo= &(padapter->wdinfo);\n#endif /* CONFIG_WFD */\n\n\tDBG_871X(\"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1);\n\n\tif (wrqu->data.length - 1 != 17) {\n\t\tDBG_871X(\"[%s] length:%d != 17\\n\", __FUNCTION__, (wrqu->data.length -1));\n\t\treturn ret;\n\t}\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tfor( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){\n\t\ttxmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\t}\n\n#ifdef CONFIG_WFD\n\tif (_AES_ != padapter->securitypriv.dot11PrivacyAlgrthm) {\n\t\t/* Weak Security situation with AP. */\n\t\tif (0 == pwdinfo->wfd_tdls_weaksec) \t{\n\t\t\t/* Can't send the tdls setup request out!! */\n\t\t\tDBG_871X(\"[%s] Current link is not AES, \"\n\t\t\t\t\"SKIP sending the tdls setup request!!\\n\", __FUNCTION__);\n\t\t} else {\n\t\t\tissue_tdls_setup_req(padapter, &txmgmt, _TRUE);\n\t\t}\n\t} else\n#endif /* CONFIG_WFD */\n\t{\n\t\tissue_tdls_setup_req(padapter, &txmgmt, _TRUE);\n\t}\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\nstatic int rtw_tdls_teardown(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\n\tu8 i,j;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct sta_info *ptdls_sta = NULL;\n\tstruct tdls_txmgmt txmgmt;\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tif (wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19) {\n\t\tDBG_871X(\"[%s] length:%d != 17 or 19\\n\",\n\t\t\t__FUNCTION__, (wrqu->data.length -1));\n\t\treturn ret;\n\t}\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tfor (i=0, j=0; i < ETH_ALEN; i++, j+=3)\n\t\ttxmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\n\tptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);\n\t\n\tif (ptdls_sta != NULL) {\n\t\ttxmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;\n\t\tif (wrqu->data.length - 1 == 19)\n\t\t\tissue_tdls_teardown(padapter, &txmgmt, _FALSE);\n\t\telse \n\t\t\tissue_tdls_teardown(padapter, &txmgmt, _TRUE);\n\t} else {\n\t\tDBG_871X( \"TDLS peer not found\\n\");\n\t}\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\nstatic int rtw_tdls_discovery(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_txmgmt\ttxmgmt;\n\tint i = 0, j=0;\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\tfor( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){\n\t\ttxmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\t}\n\n\tissue_tdls_dis_req(padapter, &txmgmt);\n\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_ch_switch(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\tu8 i, j;\n\tstruct sta_info *ptdls_sta = NULL;\n\n\tDBG_8192C( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\n\t\tDBG_871X(\"Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\\n\");\n\t\treturn ret;\n\t}\n\n\tfor( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){\n\t\tpchsw_info->addr[i] = key_2char2num(*(extra+j), *(extra+j+1));\n\t}\n\n\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, pchsw_info->addr);\n\tif( ptdls_sta == NULL )\n\t\treturn ret;\n\n\tpchsw_info->ch_sw_state |= TDLS_CH_SW_INITIATOR_STATE;\n\n\tif (ptdls_sta != NULL) {\n\t\tif (pchsw_info->off_ch_num == 0)\n\t\t\tpchsw_info->off_ch_num = 11;\n\t}else {\n\t\tDBG_871X( \"TDLS peer not found\\n\");\n\t}\n\n\t\n\t//issue_tdls_ch_switch_req(padapter, ptdls_sta);\n\t/* DBG_871X(\"issue tdls ch switch req\\n\"); */\n\n#endif /* CONFIG_TDLS_CH_SW */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_ch_switch_off(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\t\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;\n\tu8 i, j, mac_addr[ETH_ALEN];\n\tstruct sta_info *ptdls_sta = NULL;\n\tstruct tdls_txmgmt txmgmt;\n\n\t_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));\n\t\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tif (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)\n\t{\n\t\tDBG_871X(\"Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\\n\");\n\t\treturn ret;\n\t}\n\n\tif (wrqu->data.length >= 17) {\n\t\tfor (i=0, j=0 ; i < ETH_ALEN; i++, j+=3)\n\t\tmac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\t\t\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);\n\t}\n\n\tif (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) {\t\n\t\tSelectChannel(padapter, padapter->mlmeextpriv.cur_channel);\n\t}\n\n\tpchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE |\n\t\t\t\t\t\t\t\tTDLS_CH_SWITCH_ON_STATE |\n\t\t\t\t\t\t\t\tTDLS_PEER_AT_OFF_STATE);\n\tATOMIC_SET(&pchsw_info->chsw_on, _FALSE);\n\t_rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN);\n\n\tif (ptdls_sta != NULL) {\n\t\tptdls_sta->ch_switch_time = 0;\n\t\tptdls_sta->ch_switch_timeout = 0;\n\t\t_cancel_timer_ex(&ptdls_sta->ch_sw_timer);\n\t\t_cancel_timer_ex(&ptdls_sta->delay_timer);\n\t}\n\n#endif /* CONFIG_TDLS_CH_SW */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_dump_ch(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tDBG_8192C(\"[%s] dump_stack:%s\\n\", __FUNCTION__, extra);\n\n\textra[ wrqu->data.length ] = 0x00;\n\tptdlsinfo->chsw_info.dump_stack = rtw_atoi( extra );\n\n\treturn ret;\n\n#endif\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_off_ch_num(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tDBG_8192C(\"[%s] off_ch_num:%s\\n\", __FUNCTION__, extra);\n\n\textra[ wrqu->data.length ] = 0x00;\n\tptdlsinfo->chsw_info.off_ch_num = rtw_atoi(extra);\n\n\treturn ret;\n\t\n#endif\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_ch_offset(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_TDLS_CH_SW\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tDBG_8192C(\"[%s] ch_offset:%s\\n\", __FUNCTION__, extra);\n\n\textra[ wrqu->data.length ] = 0x00;\n\tptdlsinfo->chsw_info.ch_offset = rtw_atoi( extra );\n\n\treturn ret;\n\n#endif\n#endif /* CONFIG_TDLS */\n\n\t\treturn ret;\n}\n\t\nstatic int rtw_tdls_pson(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 i, j, mac_addr[ETH_ALEN];\n\tstruct sta_info *ptdls_sta = NULL;\n\n\tDBG_871X( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tfor (i=0, j=0; i < ETH_ALEN; i++, j+=3)\n\t\tmac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\n\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);\n\n\tissue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 3, 500);\n\n#endif /* CONFIG_TDLS */\n\n\t\treturn ret;\n}\n\t\nstatic int rtw_tdls_psoff(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 i, j, mac_addr[ETH_ALEN];\n\tstruct sta_info *ptdls_sta = NULL;\n\t\n\tDBG_8192C( \"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length -1  );\n\n\tfor (i=0, j=0; i < ETH_ALEN; i++, j+=3)\n\t\tmac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));\n\n\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);\n\n\tif(ptdls_sta)\n\t\tissue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 500);\n\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_setip(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_WFD\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;\n\tu8 i=0, j=0, k=0, tag=0;\n\n\tDBG_871X(\"[%s] %s %d\\n\", __FUNCTION__, extra, wrqu->data.length - 1);\n\n\twhile (i < 4) {\n\t\tfor (j=0; j < 4; j++) {\n\t\t\tif (*( extra + j + tag ) == '.' || *( extra + j + tag ) == '\\0') {\n\t\t\t\tif( j == 1 )\n\t\t\t\t\tpwfd_info->ip_address[i]=convert_ip_addr( '0', '0', *(extra+(j-1)+tag));\n\t\t\t\tif( j == 2 )\n\t\t\t\t\tpwfd_info->ip_address[i]=convert_ip_addr( '0', *(extra+(j-2)+tag), *(extra+(j-1)+tag));\n\t\t\t\tif( j == 3 )\n\t\t\t\t\tpwfd_info->ip_address[i]=convert_ip_addr( *(extra+(j-3)+tag), *(extra+(j-2)+tag), *(extra+(j-1)+tag));\t\n\n\t\t\t\ttag += j + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\tDBG_871X( \"[%s] Set IP = %u.%u.%u.%u \\n\", __FUNCTION__, \n\t\tptdlsinfo->wfd_info->ip_address[0],\n\t\tptdlsinfo->wfd_info->ip_address[1],\n\t\tptdlsinfo->wfd_info->ip_address[2],\n\t\tptdlsinfo->wfd_info->ip_address[3]);\n\n#endif /* CONFIG_WFD */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_getip(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_WFD\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;\n\t\n\tDBG_871X( \"[%s]\\n\", __FUNCTION__);\n\n\tsprintf( extra, \"\\n\\n%u.%u.%u.%u\\n\", \n\t\tpwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], \n\t\tpwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]);\n\n\tDBG_871X( \"[%s] IP=%u.%u.%u.%u\\n\", __FUNCTION__,\n\t\tpwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], \n\t\tpwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]);\n\t\n\twrqu->data.length = strlen( extra );\n\n#endif /* CONFIG_WFD */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\nstatic int rtw_tdls_getport(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_WFD\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\tstruct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;\n\n\tDBG_871X( \"[%s]\\n\", __FUNCTION__);\n\n\tsprintf( extra, \"\\n\\n%d\\n\", pwfd_info->peer_rtsp_ctrlport );\n\tDBG_871X( \"[%s] remote port = %d\\n\",\n\t\t__FUNCTION__, pwfd_info->peer_rtsp_ctrlport );\n\t\n\twrqu->data.length = strlen( extra );\n\n#endif /* CONFIG_WFD */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n\t\t\n}\n\n/* WFDTDLS, for sigma test */\nstatic int rtw_tdls_dis_result(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\n#ifdef CONFIG_TDLS\n#ifdef CONFIG_WFD\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tDBG_871X( \"[%s]\\n\", __FUNCTION__);\n\n\tif (ptdlsinfo->dev_discovered == _TRUE) {\n\t\tsprintf( extra, \"\\n\\nDis=1\\n\" );\n\t\tptdlsinfo->dev_discovered = _FALSE;\n\t}\n\t\n\twrqu->data.length = strlen( extra );\n\n#endif /* CONFIG_WFD */\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n\t\t\n}\n\n/* WFDTDLS, for sigma test */\nstatic int rtw_wfd_tdls_status(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\t\n\tint ret = 0;\t\n\n#ifdef CONFIG_TDLS\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct tdls_info *ptdlsinfo = &padapter->tdlsinfo;\n\n\tDBG_871X(\"[%s]\\n\", __FUNCTION__);\n\n\tsprintf( extra, \"\\nlink_established:%d \\n\"\n\t\t\"sta_cnt:%d \\n\"\n\t\t\"sta_maximum:%d \\n\"\n\t\t\"cur_channel:%d \\n\"\n\t\t\"tdls_enable:%d\"\n#ifdef CONFIG_TDLS_CH_SW\n\t\t\"ch_sw_state:%08x\\n\"\n\t\t\"chsw_on:%d\\n\"\n\t\t\"off_ch_num:%d\\n\"\n\t\t\"cur_time:%d\\n\"\n\t\t\"ch_offset:%d\\n\"\n\t\t\"delay_swtich_back:%d\"\n#endif\n\t\t,\n\t\tptdlsinfo->link_established, ptdlsinfo->sta_cnt,\n\t\tptdlsinfo->sta_maximum, ptdlsinfo->cur_channel, \n\t\tptdlsinfo->tdls_enable\n#ifdef CONFIG_TDLS_CH_SW\n,\n\t\tptdlsinfo->chsw_info.ch_sw_state,\n\t\tATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on),\n\t\tptdlsinfo->chsw_info.off_ch_num,\n\t\tptdlsinfo->chsw_info.cur_time,\n\t\tptdlsinfo->chsw_info.ch_offset,\n\t\tptdlsinfo->chsw_info.delay_switch_back\n#endif\n);\n\n\twrqu->data.length = strlen( extra );\n\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n\t\t\n\t}\n\nstatic int rtw_tdls_getsta(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n\t{\n\t\n\tint ret = 0;\n#ifdef CONFIG_TDLS\n\tu8 i, j;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 addr[ETH_ALEN] = {0};\n\tchar charmac[17];\n\tstruct sta_info *ptdls_sta = NULL;\n\n\tDBG_871X(\"[%s] %s %d\\n\", __FUNCTION__,\n\t\t(char *)wrqu->data.pointer, wrqu->data.length -1);\n\n\tif(copy_from_user(charmac, wrqu->data.pointer+9, 17)){\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\t\n\tDBG_871X(\"[%s] %d, charmac:%s\\n\", __FUNCTION__, __LINE__, charmac);\n\tfor (i=0, j=0 ; i < ETH_ALEN; i++, j+=3)\n\t\taddr[i]=key_2char2num(*(charmac+j), *(charmac+j+1));\n\n\tDBG_871X(\"[%s] %d, charmac:%s, addr:\"MAC_FMT\"\\n\",\n\t\t__FUNCTION__, __LINE__, charmac, MAC_ARG(addr));\n\tptdls_sta = rtw_get_stainfo(&padapter->stapriv, addr);\t\n\tif(ptdls_sta) {\n\t\tsprintf(extra, \"\\n\\ntdls_sta_state=0x%08x\\n\", ptdls_sta->tdls_sta_state);\n\t\tDBG_871X(\"\\n\\ntdls_sta_state=%d\\n\", ptdls_sta->tdls_sta_state);\n\t} else {\n\t\tsprintf(extra, \"\\n\\nNot found this sta\\n\");\n\t\tDBG_871X(\"\\n\\nNot found this sta\\n\");\n\t}\n\twrqu->data.length = strlen( extra );\n\n#endif /* CONFIG_TDLS */\nexit:\n\treturn ret;\n\t\t\n}\n\nstatic int rtw_tdls_get_best_ch(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n#ifdef CONFIG_FIND_BEST_CHANNEL\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tu32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;\n\n\tfor (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {\n\t\tif (pmlmeext->channel_set[i].ChannelNum == 1)\n\t\t\tindex_24G = i;\n\t\tif (pmlmeext->channel_set[i].ChannelNum == 36)\n\t\t\tindex_5G = i;\n\t}\n\t\n\tfor (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {\n\t\t/* 2.4G */\n\t\tif (pmlmeext->channel_set[i].ChannelNum == 6 || pmlmeext->channel_set[i].ChannelNum == 11) {\n\t\t\tif (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) {\n\t\t\t\tindex_24G = i;\n\t\t\t\tbest_channel_24G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n\n\t\t/* 5G */\n\t\tif (pmlmeext->channel_set[i].ChannelNum >= 36\n\t\t\t&& pmlmeext->channel_set[i].ChannelNum < 140) {\n\t\t\t /* Find primary channel */\n\t\t\tif (((pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)\n\t\t\t\t&& (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {\n\t\t\t\tindex_5G = i;\n\t\t\t\tbest_channel_5G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n\n\t\tif (pmlmeext->channel_set[i].ChannelNum >= 149\n\t\t\t&& pmlmeext->channel_set[i].ChannelNum < 165) {\n\t\t\t /* Find primary channel */\n\t\t\tif (((pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)\n\t\t\t\t&& (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {\n\t\t\t\tindex_5G = i;\n\t\t\t\tbest_channel_5G = pmlmeext->channel_set[i].ChannelNum;\n\t\t\t}\n\t\t}\n#if 1 /* debug */\n\t\tDBG_871X(\"The rx cnt of channel %3d = %d\\n\", \n\t\t\t\t\tpmlmeext->channel_set[i].ChannelNum,\n\t\t\t\t\tpmlmeext->channel_set[i].rx_count);\n#endif\n\t}\n\t\n\tsprintf( extra, \"\\nbest_channel_24G = %d\\n\", best_channel_24G );\n\tDBG_871X(\"best_channel_24G = %d\\n\", best_channel_24G);\n\n\tif (index_5G != 0) {\n\t\tsprintf(extra, \"best_channel_5G = %d\\n\", best_channel_5G);\n\t\tDBG_871X(\"best_channel_5G = %d\\n\", best_channel_5G);\n\t}\n\n\twrqu->data.length = strlen( extra );\n\n#endif\n\n\treturn 0;\n\n}\n\nstatic int rtw_tdls(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tDBG_871X( \"[%s] extra = %s\\n\", __FUNCTION__, extra );\n\t/* WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now! */\n\tif (_rtw_memcmp(extra, \"wfdenable=\", 10)) {\n\t\twrqu->data.length -=10;\n\t\trtw_wfd_tdls_enable( dev, info, wrqu, &extra[10] );\n\t\treturn ret;\n\t} else if (_rtw_memcmp(extra, \"weaksec=\", 8)) {\n\t\twrqu->data.length -=8;\n\t\trtw_tdls_weaksec( dev, info, wrqu, &extra[8] );\n\t\treturn ret;\n\t} else if (_rtw_memcmp( extra, \"tdlsenable=\", 11)) {\n\t\twrqu->data.length -=11;\n\t\trtw_tdls_enable( dev, info, wrqu, &extra[11] );\n\t\treturn ret;\n\t}\n\n\tif (padapter->tdlsinfo.tdls_enable == 0) {\n\t\tDBG_871X(\"tdls haven't enabled\\n\");\n\t\treturn 0;\n\t}\n\n\tif (_rtw_memcmp(extra, \"setup=\", 6)) {\n\t\twrqu->data.length -=6;\n\t\trtw_tdls_setup( dev, info, wrqu, &extra[6] );\n\t} else if (_rtw_memcmp(extra, \"tear=\", 5)) {\n\t\twrqu->data.length -= 5;\n\t\trtw_tdls_teardown( dev, info, wrqu, &extra[5] );\n\t} else if (_rtw_memcmp(extra, \"dis=\", 4)) {\n\t\twrqu->data.length -= 4;\n\t\trtw_tdls_discovery( dev, info, wrqu, &extra[4] );\n\t} else if (_rtw_memcmp(extra, \"swoff=\", 6)) {\n\t\twrqu->data.length -= 6;\n\t\trtw_tdls_ch_switch_off(dev, info, wrqu, &extra[6]);\n\t} else if (_rtw_memcmp(extra, \"sw=\", 3)) {\n\t\twrqu->data.length -= 3;\n\t\trtw_tdls_ch_switch( dev, info, wrqu, &extra[3] );\n\t} else if (_rtw_memcmp(extra, \"dumpstack=\", 10)) {\n\t\twrqu->data.length -= 10;\n\t\trtw_tdls_dump_ch(dev, info, wrqu, &extra[10]);\n\t} else if (_rtw_memcmp(extra, \"offchnum=\", 9)) {\n\t\twrqu->data.length -= 9;\n\t\trtw_tdls_off_ch_num(dev, info, wrqu, &extra[9]);\n\t} else if (_rtw_memcmp(extra, \"choffset=\", 9)) {\n\t\twrqu->data.length -= 9;\n\t\trtw_tdls_ch_offset(dev, info, wrqu, &extra[9]);\n\t} else if (_rtw_memcmp(extra, \"pson=\", 5)) {\n\t\twrqu->data.length -= 5;\n\t\trtw_tdls_pson( dev, info, wrqu, &extra[5] );\n\t} else if (_rtw_memcmp(extra, \"psoff=\", 6)) {\n\t\twrqu->data.length -= 6;\n\t\trtw_tdls_psoff( dev, info, wrqu, &extra[6] );\n\t}\n#ifdef CONFIG_WFD\n\telse if (_rtw_memcmp(extra, \"setip=\", 6)) {\n\t\twrqu->data.length -= 6;\n\t\trtw_tdls_setip( dev, info, wrqu, &extra[6] );\n\t} else if (_rtw_memcmp(extra, \"tprobe=\", 6)) {\n\t\tissue_tunneled_probe_req((_adapter *)rtw_netdev_priv(dev));\n\t}\n#endif /* CONFIG_WFD */\n\n#endif /* CONFIG_TDLS */\n\t\n\treturn ret;\n}\n\n\nstatic int rtw_tdls_get(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_TDLS\n\n\tDBG_871X( \"[%s] extra = %s\\n\", __FUNCTION__, (char*) wrqu->data.pointer );\n\n\tif ( _rtw_memcmp( wrqu->data.pointer, \"ip\", 2 ) )\n\t\trtw_tdls_getip( dev, info, wrqu, extra );\n\telse if (_rtw_memcmp(wrqu->data.pointer, \"port\", 4))\n\t\trtw_tdls_getport( dev, info, wrqu, extra );\n\t/* WFDTDLS, for sigma test */\n\telse if ( _rtw_memcmp(wrqu->data.pointer, \"dis\", 3))\n\t\trtw_tdls_dis_result( dev, info, wrqu, extra );\n\telse if ( _rtw_memcmp(wrqu->data.pointer, \"status\", 6))\n\t\trtw_wfd_tdls_status( dev, info, wrqu, extra );\n\telse if ( _rtw_memcmp(wrqu->data.pointer, \"tdls_sta=\", 9))\n\t\trtw_tdls_getsta( dev, info, wrqu, extra );\n\telse if (_rtw_memcmp(wrqu->data.pointer, \"best_ch\", 7))\n\t\trtw_tdls_get_best_ch(dev, info, wrqu, extra);\n#endif /* CONFIG_TDLS */\n\n\treturn ret;\n}\n\n\n\n\n\n#ifdef CONFIG_INTEL_WIDI\nstatic int rtw_widi_set(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint ret = 0;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tprocess_intel_widi_cmd(padapter, extra);\n\n\treturn ret;\n}\n\nstatic int rtw_widi_set_probe_request(struct net_device *dev,\n                               struct iw_request_info *info,\n                               union iwreq_data *wrqu, char *extra)\n{\n\tint\tret = 0;\n\tu8\t*pbuf = NULL;\n\t_adapter\t*padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tpbuf = rtw_malloc(sizeof(l2_msg_t));\n\tif(pbuf)\n\t{\n\t\tif ( copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length) )\n\t\t\tret = -EFAULT;\n\t\t//_rtw_memcpy(pbuf, wrqu->data.pointer, wrqu->data.length);\n\n\t\tif( wrqu->data.flags == 0 )\n\t\t\tintel_widi_wk_cmd(padapter, INTEL_WIDI_ISSUE_PROB_WK, pbuf, sizeof(l2_msg_t));\n\t\telse if( wrqu->data.flags == 1 )\n\t\t\trtw_set_wfd_rds_sink_info( padapter, (l2_msg_t *)pbuf );\n\t}\n\treturn ret;\n}\n#endif // CONFIG_INTEL_WIDI\n\n#ifdef CONFIG_MAC_LOOPBACK_DRIVER\n\n#if defined(CONFIG_RTL8188E)\n#include <rtl8188e_hal.h>\nextern void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc);\n#define cal_txdesc_chksum rtl8188e_cal_txdesc_chksum\n#ifdef CONFIG_SDIO_HCI || defined(CONFIG_GSPI_HCI)\nextern void rtl8188es_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);\n#define fill_default_txdesc rtl8188es_fill_default_txdesc\n#endif // CONFIG_SDIO_HCI\n#endif // CONFIG_RTL8188E\n#if defined(CONFIG_RTL8723B)\nextern void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc);\n#define cal_txdesc_chksum rtl8723b_cal_txdesc_chksum\nextern void rtl8723b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);\n#define fill_default_txdesc rtl8723b_fill_default_txdesc\n#endif // CONFIG_RTL8723B\n\n#if defined(CONFIG_RTL8703B)\n/* extern void rtl8703b_cal_txdesc_chksum(struct tx_desc *ptxdesc); */\n#define cal_txdesc_chksum rtl8703b_cal_txdesc_chksum\n/* extern void rtl8703b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf); */\n#define fill_default_txdesc rtl8703b_fill_default_txdesc\n#endif /* CONFIG_RTL8703B */\n\n#if defined(CONFIG_RTL8192E)\nextern void rtl8192e_cal_txdesc_chksum(struct tx_desc *ptxdesc);\n#define cal_txdesc_chksum rtl8192e_cal_txdesc_chksum\n#ifdef CONFIG_SDIO_HCI || defined(CONFIG_GSPI_HCI)\nextern void rtl8192es_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);\n#define fill_default_txdesc rtl8192es_fill_default_txdesc\n#endif // CONFIG_SDIO_HCI\n#endif //CONFIG_RTL8192E\n\nstatic s32 initLoopback(PADAPTER padapter)\n{\n\tPLOOPBACKDATA ploopback;\n\n\n\tif (padapter->ploopback == NULL) {\n\t\tploopback = (PLOOPBACKDATA)rtw_zmalloc(sizeof(LOOPBACKDATA));\n\t\tif (ploopback == NULL) return -ENOMEM;\n\n\t\t_rtw_init_sema(&ploopback->sema, 0);\n\t\tploopback->bstop = _TRUE;\n\t\tploopback->cnt = 0;\n\t\tploopback->size = 300;\n\t\t_rtw_memset(ploopback->msg, 0, sizeof(ploopback->msg));\n\n\t\tpadapter->ploopback = ploopback;\n\t}\n\n\treturn 0;\n}\n\nstatic void freeLoopback(PADAPTER padapter)\n{\n\tPLOOPBACKDATA ploopback;\n\n\n\tploopback = padapter->ploopback;\n\tif (ploopback) {\n\t\trtw_mfree((u8*)ploopback, sizeof(LOOPBACKDATA));\n\t\tpadapter->ploopback = NULL;\n\t}\n}\n\nstatic s32 initpseudoadhoc(PADAPTER padapter)\n{\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networkType;\n\ts32 err;\n\n\tnetworkType = Ndis802_11IBSS;\n\terr = rtw_set_802_11_infrastructure_mode(padapter, networkType);\n\tif (err == _FALSE) return _FAIL;\n\n\terr = rtw_setopmode_cmd(padapter, networkType,_TRUE);\n\tif (err == _FAIL) return _FAIL;\n\n\treturn _SUCCESS;\n}\n\nstatic s32 createpseudoadhoc(PADAPTER padapter)\n{\n\tNDIS_802_11_AUTHENTICATION_MODE authmode;\n\tstruct mlme_priv *pmlmepriv;\n\tNDIS_802_11_SSID *passoc_ssid;\n\tWLAN_BSSID_EX *pdev_network;\n\tu8 *pibss;\n\tu8 ssid[] = \"pseduo_ad-hoc\";\n\ts32 err;\n\t_irqL irqL;\n\n\n\tpmlmepriv = &padapter->mlmepriv;\n\n\tauthmode = Ndis802_11AuthModeOpen;\n\terr = rtw_set_802_11_authentication_mode(padapter, authmode);\n\tif (err == _FALSE) return _FAIL;\n\n\tpassoc_ssid = &pmlmepriv->assoc_ssid;\n\t_rtw_memset(passoc_ssid, 0, sizeof(NDIS_802_11_SSID));\n\tpassoc_ssid->SsidLength = sizeof(ssid) - 1;\n\t_rtw_memcpy(passoc_ssid->Ssid, ssid, passoc_ssid->SsidLength);\n\n\tpdev_network = &padapter->registrypriv.dev_network;\n\tpibss = padapter->registrypriv.dev_network.MacAddress;\n\t_rtw_memcpy(&pdev_network->Ssid, passoc_ssid, sizeof(NDIS_802_11_SSID));\n\n\trtw_update_registrypriv_dev_network(padapter);\n\trtw_generate_random_ibss(pibss);\n\n\t_enter_critical_bh(&pmlmepriv->lock, &irqL);\n\tpmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;\n\t_exit_critical_bh(&pmlmepriv->lock, &irqL);\n\n#if 0\n\terr = rtw_create_ibss_cmd(padapter, 0);\n\tif (err == _FAIL) return _FAIL;\n#else\n{\n\tstruct wlan_network *pcur_network;\n\tstruct sta_info *psta;\n\n\t//3  create a new psta\n\tpcur_network = &pmlmepriv->cur_network;\n\n\t//clear psta in the cur_network, if any\n\tpsta = rtw_get_stainfo(&padapter->stapriv, pcur_network->network.MacAddress);\n\tif (psta) rtw_free_stainfo(padapter, psta);\n\n\tpsta = rtw_alloc_stainfo(&padapter->stapriv, pibss);\n\tif (psta == NULL) return _FAIL;\n\n\t//3  join psudo AdHoc\n\tpcur_network->join_res = 1;\n\tpcur_network->aid = psta->aid = 1;\n\t_rtw_memcpy(&pcur_network->network, pdev_network, get_WLAN_BSSID_EX_sz(pdev_network));\n\n\t// set msr to WIFI_FW_ADHOC_STATE\n#if 0\n\tSet_NETYPE0_MSR(padapter, WIFI_FW_ADHOC_STATE);\n#else\n\t{\n\t\tu8 val8;\n\n\t\tval8 = rtw_read8(padapter, MSR);\n\t\tval8 &= 0xFC; // clear NETYPE0\n\t\tval8 |= WIFI_FW_ADHOC_STATE & 0x3;\n\t\trtw_write8(padapter, MSR, val8);\n\t}\n#endif\n}\n#endif\n\n\treturn _SUCCESS;\n}\n\nstatic struct xmit_frame* createloopbackpkt(PADAPTER padapter, u32 size)\n{\n\tstruct xmit_priv *pxmitpriv;\n\tstruct xmit_frame *pframe;\n\tstruct xmit_buf *pxmitbuf;\n\tstruct pkt_attrib *pattrib;\n\tstruct tx_desc *desc;\n\tu8 *pkt_start, *pkt_end, *ptr;\n\tstruct rtw_ieee80211_hdr *hdr;\n\ts32 bmcast;\n\t_irqL irqL;\n\n\n\tif ((TXDESC_SIZE + WLANHDR_OFFSET + size) > MAX_XMITBUF_SZ) return NULL;\n\n\tpxmitpriv = &padapter->xmitpriv;\n\tpframe = NULL;\n\n\t//2 1. allocate xmit frame\n\tpframe = rtw_alloc_xmitframe(pxmitpriv);\n\tif (pframe == NULL) return NULL;\n\tpframe->padapter = padapter;\n\n\t//2 2. allocate xmit buffer\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\tpxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n\tif (pxmitbuf == NULL) {\n\t\trtw_free_xmitframe(pxmitpriv, pframe);\n\t\treturn NULL;\n\t}\n\n\tpframe->pxmitbuf = pxmitbuf;\n\tpframe->buf_addr = pxmitbuf->pbuf;\n\tpxmitbuf->priv_data = pframe;\n\n\t//2 3. update_attrib()\n\tpattrib = &pframe->attrib;\n\n\t// init xmitframe attribute\n\t_rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));\n\n\tpattrib->ether_type = 0x8723;\n\t_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);\n\t_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);\n\t_rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);\n\t_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);\n\n//\tpattrib->dhcp_pkt = 0;\n//\tpattrib->pktlen = 0;\n\tpattrib->ack_policy = 0;\n//\tpattrib->pkt_hdrlen = ETH_HLEN;\n\tpattrib->hdrlen = WLAN_HDR_A3_LEN;\n\tpattrib->subtype = WIFI_DATA;\n\tpattrib->priority = 0;\n\tpattrib->qsel = pattrib->priority;\n//\tdo_queue_select(padapter, pattrib);\n\tpattrib->nr_frags = 1;\n\tpattrib->encrypt = 0;\n\tpattrib->bswenc = _FALSE;\n\tpattrib->qos_en = _FALSE;\n\n\tbmcast = IS_MCAST(pattrib->ra);\n\tif (bmcast) {\n\t\tpattrib->mac_id = 1;\n\t\tpattrib->psta = rtw_get_bcmc_stainfo(padapter);\n\t} else {\n\t\tpattrib->mac_id = 0;\n\t\tpattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));\n\t}\n\n\tpattrib->pktlen = size;\n\tpattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;\n\n\t//2 4. fill TX descriptor\n\tdesc = (struct tx_desc*)pframe->buf_addr;\n\t_rtw_memset(desc, 0, TXDESC_SIZE);\n\n\tfill_default_txdesc(pframe, (u8*)desc);\n\n\t// Hw set sequence number\n\t((PTXDESC)desc)->hwseq_en = 0; // HWSEQ_EN, 0:disable, 1:enable\n//\t((PTXDESC)desc)->hwseq_sel = 0; // HWSEQ_SEL\n\n\t((PTXDESC)desc)->disdatafb = 1;\n\n\t// convert to little endian\n\tdesc->txdw0 = cpu_to_le32(desc->txdw0);\n\tdesc->txdw1 = cpu_to_le32(desc->txdw1);\n\tdesc->txdw2 = cpu_to_le32(desc->txdw2);\n\tdesc->txdw3 = cpu_to_le32(desc->txdw3);\n\tdesc->txdw4 = cpu_to_le32(desc->txdw4);\n\tdesc->txdw5 = cpu_to_le32(desc->txdw5);\n\tdesc->txdw6 = cpu_to_le32(desc->txdw6);\n\tdesc->txdw7 = cpu_to_le32(desc->txdw7);\n#ifdef CONFIG_PCI_HCI\n\tdesc->txdw8 = cpu_to_le32(desc->txdw8);\n\tdesc->txdw9 = cpu_to_le32(desc->txdw9);\n\tdesc->txdw10 = cpu_to_le32(desc->txdw10);\n\tdesc->txdw11 = cpu_to_le32(desc->txdw11);\n\tdesc->txdw12 = cpu_to_le32(desc->txdw12);\n\tdesc->txdw13 = cpu_to_le32(desc->txdw13);\n\tdesc->txdw14 = cpu_to_le32(desc->txdw14);\n\tdesc->txdw15 = cpu_to_le32(desc->txdw15);\n#endif\n\n\tcal_txdesc_chksum(desc);\n\n\t//2 5. coalesce\n\tpkt_start = pframe->buf_addr + TXDESC_SIZE;\n\tpkt_end = pkt_start + pattrib->last_txcmdsz;\n\n\t//3 5.1. make wlan header, make_wlanhdr()\n\thdr = (struct rtw_ieee80211_hdr *)pkt_start;\n\tSetFrameSubType(&hdr->frame_ctl, pattrib->subtype);\n\t_rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); // DA\n\t_rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); // SA\n\t_rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); // RA, BSSID\n\n\t//3 5.2. make payload\n\tptr = pkt_start + pattrib->hdrlen;\n\tget_random_bytes(ptr, pkt_end - ptr);\n\n\tpxmitbuf->len = TXDESC_SIZE + pattrib->last_txcmdsz;\n\tpxmitbuf->ptail += pxmitbuf->len;\n\n\treturn pframe;\n}\n\nstatic void freeloopbackpkt(PADAPTER padapter, struct xmit_frame *pframe)\n{\n\tstruct xmit_priv *pxmitpriv;\n\tstruct xmit_buf *pxmitbuf;\n\n\n\tpxmitpriv = &padapter->xmitpriv;\n\tpxmitbuf = pframe->pxmitbuf;\n\n\trtw_free_xmitframe(pxmitpriv, pframe);\n\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n}\n\nstatic void printdata(u8 *pbuf, u32 len)\n{\n\tu32 i, val;\n\n\n\tfor (i = 0; (i+4) <= len; i+=4) {\n\t\tprintk(\"%08X\", *(u32*)(pbuf + i));\n\t\tif ((i+4) & 0x1F) printk(\" \");\n\t\telse printk(\"\\n\");\n\t}\n\n\tif (i < len)\n\t{\n#ifdef CONFIG_BIG_ENDIAN\n\t\tfor (; i < len, i++)\n\t\t\tprintk(\"%02X\", pbuf+i);\n#else // CONFIG_LITTLE_ENDIAN\n#if 0\n\t\tval = 0;\n\t\t_rtw_memcpy(&val, pbuf + i, len - i);\n\t\tprintk(\"%8X\", val);\n#else\n\t\tu8 str[9];\n\t\tu8 n;\n\t\tval = 0;\n\t\tn = len - i;\n\t\t_rtw_memcpy(&val, pbuf+i, n);\n\t\tsprintf(str, \"%08X\", val);\n\t\tn = (4 - n) * 2;\n\t\tprintk(\"%8s\", str+n);\n#endif\n#endif // CONFIG_LITTLE_ENDIAN\n\t}\n\tprintk(\"\\n\");\n}\n\nstatic u8 pktcmp(PADAPTER padapter, u8 *txbuf, u32 txsz, u8 *rxbuf, u32 rxsz)\n{\n\tPHAL_DATA_TYPE phal;\n\tstruct recv_stat *prxstat;\n\tstruct recv_stat report;\n\tPRXREPORT prxreport;\n\tu32 drvinfosize;\n\tu32 rxpktsize;\n\tu8 fcssize;\n\tu8 ret = _FALSE;\n\n\tprxstat = (struct recv_stat*)rxbuf;\n\treport.rxdw0 = le32_to_cpu(prxstat->rxdw0);\n\treport.rxdw1 = le32_to_cpu(prxstat->rxdw1);\n\treport.rxdw2 = le32_to_cpu(prxstat->rxdw2);\n\treport.rxdw3 = le32_to_cpu(prxstat->rxdw3);\n\treport.rxdw4 = le32_to_cpu(prxstat->rxdw4);\n\treport.rxdw5 = le32_to_cpu(prxstat->rxdw5);\n\n\tprxreport = (PRXREPORT)&report;\n\tdrvinfosize = prxreport->drvinfosize << 3;\n\trxpktsize = prxreport->pktlen;\n\n\tphal = GET_HAL_DATA(padapter);\n\tif (phal->ReceiveConfig & RCR_APPFCS) fcssize = IEEE80211_FCS_LEN;\n\telse fcssize = 0;\n\n\tif ((txsz - TXDESC_SIZE) != (rxpktsize - fcssize)) {\n\t\tDBG_8192C(\"%s: ERROR! size not match tx/rx=%d/%d !\\n\",\n\t\t\t__func__, txsz - TXDESC_SIZE, rxpktsize - fcssize);\n\t\tret = _FALSE;\n\t} else {\n\t\tret = _rtw_memcmp(txbuf + TXDESC_SIZE,\\\n\t\t\t\t\t\t  rxbuf + RXDESC_SIZE + drvinfosize,\\\n\t\t\t\t\t\t  txsz - TXDESC_SIZE);\n\t\tif (ret == _FALSE) {\n\t\t\tDBG_8192C(\"%s: ERROR! pkt content mismatch!\\n\", __func__);\n\t\t}\n\t}\n\n\tif (ret == _FALSE)\n\t{\n\t\tDBG_8192C(\"\\n%s: TX PKT total=%d, desc=%d, content=%d\\n\",\n\t\t\t__func__, txsz, TXDESC_SIZE, txsz - TXDESC_SIZE);\n\t\tDBG_8192C(\"%s: TX DESC size=%d\\n\", __func__, TXDESC_SIZE);\n\t\tprintdata(txbuf, TXDESC_SIZE);\n\t\tDBG_8192C(\"%s: TX content size=%d\\n\", __func__, txsz - TXDESC_SIZE);\n\t\tprintdata(txbuf + TXDESC_SIZE, txsz - TXDESC_SIZE);\n\n\t\tDBG_8192C(\"\\n%s: RX PKT read=%d offset=%d(%d,%d) content=%d\\n\",\n\t\t\t__func__, rxsz, RXDESC_SIZE + drvinfosize, RXDESC_SIZE, drvinfosize, rxpktsize);\n\t\tif (rxpktsize != 0)\n\t\t{\n\t\t\tDBG_8192C(\"%s: RX DESC size=%d\\n\", __func__, RXDESC_SIZE);\n\t\t\tprintdata(rxbuf, RXDESC_SIZE);\n\t\t\tDBG_8192C(\"%s: RX drvinfo size=%d\\n\", __func__, drvinfosize);\n\t\t\tprintdata(rxbuf + RXDESC_SIZE, drvinfosize);\n\t\t\tDBG_8192C(\"%s: RX content size=%d\\n\", __func__, rxpktsize);\n\t\t\tprintdata(rxbuf + RXDESC_SIZE + drvinfosize, rxpktsize);\n\t\t} else {\n\t\t\tDBG_8192C(\"%s: RX data size=%d\\n\", __func__, rxsz);\n\t\t\tprintdata(rxbuf, rxsz);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nthread_return lbk_thread(thread_context context)\n{\n\ts32 err;\n\tPADAPTER padapter;\n\tPLOOPBACKDATA ploopback;\n\tstruct xmit_frame *pxmitframe;\n\tu32 cnt, ok, fail, headerlen;\n\tu32 pktsize;\n\tu32 ff_hwaddr;\n\n\n\tpadapter = (PADAPTER)context;\n\tploopback = padapter->ploopback;\n\tif (ploopback == NULL) return -1;\n\tcnt = 0;\n\tok = 0;\n\tfail = 0;\n\n\tdaemonize(\"%s\", \"RTW_LBK_THREAD\");\n\tallow_signal(SIGTERM);\n\n\tdo {\n\t\tif (ploopback->size == 0) {\n\t\t\tget_random_bytes(&pktsize, 4);\n\t\t\tpktsize = (pktsize % 1535) + 1; // 1~1535\n\t\t} else\n\t\t\tpktsize = ploopback->size;\n\t\t\n\t\tpxmitframe = createloopbackpkt(padapter, pktsize);\n\t\tif (pxmitframe == NULL) {\n\t\t\tsprintf(ploopback->msg, \"loopback FAIL! 3. create Packet FAIL!\");\n\t\t\tbreak;\n\t\t}\n\n\t\tploopback->txsize = TXDESC_SIZE + pxmitframe->attrib.last_txcmdsz;\n\t\t_rtw_memcpy(ploopback->txbuf, pxmitframe->buf_addr, ploopback->txsize);\n\t\tff_hwaddr = rtw_get_ff_hwaddr(pxmitframe);\n\t\tcnt++;\n\t\tDBG_8192C(\"%s: wirte port cnt=%d size=%d\\n\", __func__, cnt, ploopback->txsize);\n\t\tpxmitframe->pxmitbuf->pdata = ploopback->txbuf;\n\t\trtw_write_port(padapter, ff_hwaddr, ploopback->txsize, (u8 *)pxmitframe->pxmitbuf);\n\n\t\t// wait for rx pkt\n\t\t_rtw_down_sema(&ploopback->sema);\n\n\t\terr = pktcmp(padapter, ploopback->txbuf, ploopback->txsize, ploopback->rxbuf, ploopback->rxsize);\n\t\tif (err == _TRUE)\n\t\t\tok++;\n\t\telse\n\t\t\tfail++;\n\n\t\tploopback->txsize = 0;\n\t\t_rtw_memset(ploopback->txbuf, 0, 0x8000);\n\t\tploopback->rxsize = 0;\n\t\t_rtw_memset(ploopback->rxbuf, 0, 0x8000);\n\n\t\tfreeloopbackpkt(padapter, pxmitframe);\n\t\tpxmitframe = NULL;\n\n\t\tif (signal_pending(current)) {\n\t\t\tflush_signals(current);\n\t\t}\n\n\t\tif ((ploopback->bstop == _TRUE) ||\n\t\t\t((ploopback->cnt != 0) && (ploopback->cnt == cnt)))\n\t\t{\n\t\t\tu32 ok_rate, fail_rate, all;\n\t\t\tall = cnt;\n\t\t\tok_rate = (ok*100)/all;\n\t\t\tfail_rate = (fail*100)/all;\n\t\t\tsprintf(ploopback->msg,\\\n\t\t\t\t\t\"loopback result: ok=%d%%(%d/%d),error=%d%%(%d/%d)\",\\\n\t\t\t\t\tok_rate, ok, all, fail_rate, fail, all);\n\t\t\tbreak;\n\t\t}\n\t} while (1);\n\n\tploopback->bstop = _TRUE;\n\n\tthread_exit();\n}\n\nstatic void loopbackTest(PADAPTER padapter, u32 cnt, u32 size, u8* pmsg)\n{\n\tPLOOPBACKDATA ploopback;\n\tu32 len;\n\ts32 err;\n\n\n\tploopback = padapter->ploopback;\n\n\tif (ploopback)\n\t{\n\t\tif (ploopback->bstop == _FALSE) {\n\t\t\tploopback->bstop = _TRUE;\n\t\t\t_rtw_up_sema(&ploopback->sema);\n\t\t}\n\t\tlen = 0;\n\t\tdo {\n\t\t\tlen = strlen(ploopback->msg);\n\t\t\tif (len) break;\n\t\t\trtw_msleep_os(1);\n\t\t} while (1);\n\t\t_rtw_memcpy(pmsg, ploopback->msg, len+1);\n\t\tfreeLoopback(padapter);\n\n\t\treturn;\n\t}\n\n\t// disable dynamic algorithm\t\n\trtw_phydm_ability_backup(padapter);\n\trtw_phydm_func_disable_all(padapter);\n\n\t// create pseudo ad-hoc connection\n\terr = initpseudoadhoc(padapter);\n\tif (err == _FAIL) {\n\t\tsprintf(pmsg, \"loopback FAIL! 1.1 init ad-hoc FAIL!\");\n\t\treturn;\n\t}\n\n\terr = createpseudoadhoc(padapter);\n\tif (err == _FAIL) {\n\t\tsprintf(pmsg, \"loopback FAIL! 1.2 create ad-hoc master FAIL!\");\n\t\treturn;\n\t}\n\n\terr = initLoopback(padapter);\n\tif (err) {\n\t\tsprintf(pmsg, \"loopback FAIL! 2. init FAIL! error code=%d\", err);\n\t\treturn;\n\t}\n\n\tploopback = padapter->ploopback;\n\n\tploopback->bstop = _FALSE;\n\tploopback->cnt = cnt;\n\tploopback->size = size;\n\tploopback->lbkthread = kthread_run(lbk_thread, padapter, \"RTW_LBK_THREAD\");\n\tif (IS_ERR(padapter->lbkthread))\n\t{\n\t\tfreeLoopback(padapter);\n\t\tsprintf(pmsg, \"loopback start FAIL! cnt=%d\", cnt);\n\t\treturn;\n\t}\n\n\tsprintf(pmsg, \"loopback start! cnt=%d\", cnt);\n}\n#endif // CONFIG_MAC_LOOPBACK_DRIVER\n\nstatic int rtw_test(\n\tstruct net_device *dev,\n\tstruct iw_request_info *info,\n\tunion iwreq_data *wrqu, char *extra)\n{\n\tu32 len;\n\tu8 *pbuf, *pch;\n\tchar *ptmp;\n\tu8 *delim = \",\";\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\n\tDBG_871X(\"+%s\\n\", __func__);\n\tlen = wrqu->data.length;\n\n\tpbuf = (u8*)rtw_zmalloc(len);\n\tif (pbuf == NULL) {\n\t\tDBG_871X(\"%s: no memory!\\n\", __func__);\n\t\treturn -ENOMEM;\n\t}\n\n\tif (copy_from_user(pbuf, wrqu->data.pointer, len)) {\n\t\trtw_mfree(pbuf, len);\n\t\tDBG_871X(\"%s: copy from user fail!\\n\", __func__);\n\t\treturn -EFAULT;\n\t}\n\tDBG_871X(\"%s: string=\\\"%s\\\"\\n\", __func__, pbuf);\n\n\tptmp = (char*)pbuf;\n\tpch = strsep(&ptmp, delim);\n\tif ((pch == NULL) || (strlen(pch) == 0)) {\n\t\trtw_mfree(pbuf, len);\n\t\tDBG_871X(\"%s: parameter error(level 1)!\\n\", __func__);\n\t\treturn -EFAULT;\n\t}\n\n#ifdef CONFIG_MAC_LOOPBACK_DRIVER\n\tif (strcmp(pch, \"loopback\") == 0)\n\t{\n\t\ts32 cnt = 0;\n\t\tu32 size = 64;\n\n\t\tpch = strsep(&ptmp, delim);\n\t\tif ((pch == NULL) || (strlen(pch) == 0)) {\n\t\t\trtw_mfree(pbuf, len);\n\t\t\tDBG_871X(\"%s: parameter error(level 2)!\\n\", __func__);\n\t\t\treturn -EFAULT;\n\t\t}\n\n\t\tsscanf(pch, \"%d\", &cnt);\n\t\tDBG_871X(\"%s: loopback cnt=%d\\n\", __func__, cnt);\n\n\t\tpch = strsep(&ptmp, delim);\n\t\tif ((pch == NULL) || (strlen(pch) == 0)) {\n\t\t\trtw_mfree(pbuf, len);\n\t\t\tDBG_871X(\"%s: parameter error(level 2)!\\n\", __func__);\n\t\t\treturn -EFAULT;\n\t\t}\n\n\t\tsscanf(pch, \"%d\", &size);\n\t\tDBG_871X(\"%s: loopback size=%d\\n\", __func__, size);\n\n\t\tloopbackTest(padapter, cnt, size, extra);\n\t\twrqu->data.length = strlen(extra) + 1;\n\n\t\tgoto free_buf;\n\t}\n#endif\n\n\n#ifdef CONFIG_BT_COEXIST\n\tif (strcmp(pch, \"bton\") == 0) {\n\t\trtw_btcoex_SetManualControl(padapter, _FALSE);\n\t\tgoto free_buf;\n\t} else if (strcmp(pch, \"btoff\") == 0) {\n\t\trtw_btcoex_SetManualControl(padapter, _TRUE);\n\t\tgoto free_buf;\n\t}\n#endif\n\n\tif (strcmp(pch, \"h2c\") == 0) {\n\t\tu8 param[8];\n\t\tu8 count = 0;\n\t\tu32 tmp;\n\t\tu8 i;\n\t\tu32 pos;\n\t\ts32 ret;\n\n\t\tdo {\n\t\t\tpch = strsep(&ptmp, delim);\n\t\t\tif ((pch == NULL) || (strlen(pch) == 0))\n\t\t\t\tbreak;\n\n\t\t\tsscanf(pch, \"%x\", &tmp);\n\t\t\tparam[count++] = (u8)tmp;\n\t\t} while (count < 8);\n\n\t\tif (count == 0) {\n\t\t\trtw_mfree(pbuf, len);\n\t\t\tDBG_871X(\"%s: parameter error(level 2)!\\n\", __func__);\n\t\t\treturn -EFAULT;\n\t\t}\n\n\t\tret = rtw_hal_fill_h2c_cmd(padapter, param[0], count-1, &param[1]);\n\n\t\tpos = sprintf(extra, \"H2C ID=0x%02x content=\", param[0]);\n\t\tfor (i=1; i<count; i++) {\n\t\t\tpos += sprintf(extra+pos, \"%02x,\", param[i]);\n\t\t}\n\t\textra[pos] = 0;\n\t\tpos--;\n\t\tpos += sprintf(extra+pos, \" %s\", ret==_FAIL?\"FAIL\":\"OK\");\n\n\t\twrqu->data.length = strlen(extra) + 1;\n\n\t\tgoto free_buf;\n\t}\n\nfree_buf:\n\trtw_mfree(pbuf, len);\n\treturn 0;\n}\n\nstatic iw_handler rtw_handlers[] =\n{\n\tNULL,\t\t\t\t\t/* SIOCSIWCOMMIT */\n\trtw_wx_get_name,\t\t/* SIOCGIWNAME */\n\tdummy,\t\t\t\t\t/* SIOCSIWNWID */\n\tdummy,\t\t\t\t\t/* SIOCGIWNWID */\n\trtw_wx_set_freq,\t\t/* SIOCSIWFREQ */\n\trtw_wx_get_freq,\t\t/* SIOCGIWFREQ */\n\trtw_wx_set_mode,\t\t/* SIOCSIWMODE */\n\trtw_wx_get_mode,\t\t/* SIOCGIWMODE */\n\tdummy,\t\t\t\t\t/* SIOCSIWSENS */\n\trtw_wx_get_sens,\t\t/* SIOCGIWSENS */\n\tNULL,\t\t\t\t\t/* SIOCSIWRANGE */\n\trtw_wx_get_range,\t\t/* SIOCGIWRANGE */\n\trtw_wx_set_priv,\t\t/* SIOCSIWPRIV */\n\tNULL,\t\t\t\t\t/* SIOCGIWPRIV */\n\tNULL,\t\t\t\t\t/* SIOCSIWSTATS */\n\tNULL,\t\t\t\t\t/* SIOCGIWSTATS */\n\tdummy,\t\t\t\t\t/* SIOCSIWSPY */\n\tdummy,\t\t\t\t\t/* SIOCGIWSPY */\n\tNULL,\t\t\t\t\t/* SIOCGIWTHRSPY */\n\tNULL,\t\t\t\t\t/* SIOCWIWTHRSPY */\n\trtw_wx_set_wap,\t\t/* SIOCSIWAP */\n\trtw_wx_get_wap,\t\t/* SIOCGIWAP */\n\trtw_wx_set_mlme,\t\t/* request MLME operation; uses struct iw_mlme */\n\tdummy,\t\t\t\t\t/* SIOCGIWAPLIST -- depricated */\n\trtw_wx_set_scan,\t\t/* SIOCSIWSCAN */\n\trtw_wx_get_scan,\t\t/* SIOCGIWSCAN */\n\trtw_wx_set_essid,\t\t/* SIOCSIWESSID */\n\trtw_wx_get_essid,\t\t/* SIOCGIWESSID */\n\tdummy,\t\t\t\t\t/* SIOCSIWNICKN */\n\trtw_wx_get_nick,\t\t/* SIOCGIWNICKN */\n\tNULL,\t\t\t\t\t/* -- hole -- */\n\tNULL,\t\t\t\t\t/* -- hole -- */\n\trtw_wx_set_rate,\t\t/* SIOCSIWRATE */\n\trtw_wx_get_rate,\t\t/* SIOCGIWRATE */\n\trtw_wx_set_rts,\t\t\t/* SIOCSIWRTS */\n\trtw_wx_get_rts,\t\t\t/* SIOCGIWRTS */\n\trtw_wx_set_frag,\t\t/* SIOCSIWFRAG */\n\trtw_wx_get_frag,\t\t/* SIOCGIWFRAG */\n\tdummy,\t\t\t\t\t/* SIOCSIWTXPOW */\n\tdummy,\t\t\t\t\t/* SIOCGIWTXPOW */\n\tdummy,\t\t\t\t\t/* SIOCSIWRETRY */\n\trtw_wx_get_retry,\t\t/* SIOCGIWRETRY */\n\trtw_wx_set_enc,\t\t\t/* SIOCSIWENCODE */\n\trtw_wx_get_enc,\t\t\t/* SIOCGIWENCODE */\n\tdummy,\t\t\t\t\t/* SIOCSIWPOWER */\n\trtw_wx_get_power,\t\t/* SIOCGIWPOWER */\n\tNULL,\t\t\t\t\t/*---hole---*/\n\tNULL,\t\t\t\t\t/*---hole---*/\n\trtw_wx_set_gen_ie,\t\t/* SIOCSIWGENIE */\n\tNULL,\t\t\t\t\t/* SIOCGWGENIE */\n\trtw_wx_set_auth,\t\t/* SIOCSIWAUTH */\n\tNULL,\t\t\t\t\t/* SIOCGIWAUTH */\n\trtw_wx_set_enc_ext,\t\t/* SIOCSIWENCODEEXT */\n\tNULL,\t\t\t\t\t/* SIOCGIWENCODEEXT */\n\trtw_wx_set_pmkid,\t\t/* SIOCSIWPMKSA */\n\tNULL,\t\t\t\t\t/*---hole---*/\n}; \n\n\nstatic const struct iw_priv_args rtw_private_args[] = {\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x0,\n\t\tIW_PRIV_TYPE_CHAR | 0x7FF, 0, \"write\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x1,\n\t\tIW_PRIV_TYPE_CHAR | 0x7FF,\n\t\tIW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, \"read\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x2, 0, 0, \"driver_ext\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x3, 0, 0, \"mp_ioctl\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x4,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"apinfo\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x5,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, \"setpid\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x6,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wps_start\"\n\t},\n//for PLATFORM_MT53XX\t\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x7,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"get_sensitivity\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x8,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wps_prob_req_ie\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x9,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"wps_assoc_req_ie\"\n\t},\n\n//for RTK_DMP_PLATFORM\t\n\t{\n\t\tSIOCIWFIRSTPRIV + 0xA,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, \"channel_plan\"\n\t},\n\n\t{\n\t\tSIOCIWFIRSTPRIV + 0xB,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, \"dbg\"\n\t},\t\n\t{\n\t\tSIOCIWFIRSTPRIV + 0xC,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, \"rfw\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0xD,\n\t\tIW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, \"rfr\"\n\t},\n#if 0\n\t{\n\t\tSIOCIWFIRSTPRIV + 0xE,0,0, \"wowlan_ctrl\"\n\t},\n#endif\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x10,\n\t\tIW_PRIV_TYPE_CHAR | 1024, 0, \"p2p_set\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x11,\n\t\tIW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , \"p2p_get\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x12, 0, 0, \"NULL\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x13,\n\t\tIW_PRIV_TYPE_CHAR | 64, IW_PRIV_TYPE_CHAR | 64 , \"p2p_get2\"\n\t},\t\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x14,\n\t\tIW_PRIV_TYPE_CHAR  | 64, 0, \"tdls\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x15,\n\t\tIW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 , \"tdls_get\"\n\t},\t\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x16,\n\t\tIW_PRIV_TYPE_CHAR | 64, 0, \"pm_set\"\n\t},\n\n\t{SIOCIWFIRSTPRIV + 0x18, IW_PRIV_TYPE_CHAR | IFNAMSIZ , 0 , \"rereg_nd_name\"},\n#ifdef CONFIG_MP_INCLUDED\n\t{SIOCIWFIRSTPRIV + 0x1A, IW_PRIV_TYPE_CHAR | 1024, 0,  \"NULL\"},\n\t{SIOCIWFIRSTPRIV + 0x1B, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"NULL\"},\n#else\n\t{SIOCIWFIRSTPRIV + 0x1A, IW_PRIV_TYPE_CHAR | 1024, 0, \"efuse_set\"},\n\t{SIOCIWFIRSTPRIV + 0x1B, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"efuse_get\"},\n#endif\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x1D,\n\t\tIW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 0x7FF, \"test\"\n\t},\n\n#ifdef CONFIG_INTEL_WIDI\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x1E,\n\t\tIW_PRIV_TYPE_CHAR | 1024, 0, \"widi_set\"\n\t},\n\t{\n\t\tSIOCIWFIRSTPRIV + 0x1F,\n\t\tIW_PRIV_TYPE_CHAR | 128, 0, \"widi_prob_req\"\n\t},\n#endif // CONFIG_INTEL_WIDI\n\n#ifdef CONFIG_MP_INCLUDED\n\t{ SIOCIWFIRSTPRIV + 0x0E, IW_PRIV_TYPE_CHAR | 1024, 0 , \"\"},  //set \n\t{ SIOCIWFIRSTPRIV + 0x0F, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , \"\"},//get\n/* --- sub-ioctls definitions --- */   \n#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE\n\t{ VENDOR_IE_SET, IW_PRIV_TYPE_CHAR | 1024 , 0 , \"vendor_ie_set\" },\n\t{ VENDOR_IE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"vendor_ie_get\" },\n#endif\n\t\t{ MP_START , IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_start\" }, //set\n\t\t{ MP_PHYPARA, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_phypara\" },//get\n\t\t{ MP_STOP , IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_stop\" }, //set\n\t\t{ MP_CHANNEL , IW_PRIV_TYPE_CHAR | 1024 , IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_channel\" },//get\n\t\t{ MP_BANDWIDTH , IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_bandwidth\"}, //set\n\t\t{ MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_rate\" },//get\n\t\t{ MP_RESET_STATS , IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_reset_stats\"},\n\t\t{ MP_QUERY , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , \"mp_query\"}, //get\n\t\t{ READ_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"read_reg\" },\n\t\t{ MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_rate\" },\n\t\t{ READ_RF , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"read_rf\" },\n\t\t{ MP_PSD , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_psd\"}, \n\t\t{ MP_DUMP, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_dump\" },\n\t\t{ MP_TXPOWER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_txpower\"},\n\t\t{ MP_ANT_TX , IW_PRIV_TYPE_CHAR | 1024,  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_ant_tx\"},\n\t\t{ MP_ANT_RX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_ant_rx\"},\n\t\t{ WRITE_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"write_reg\" },\n\t\t{ WRITE_RF , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"write_rf\" },\n\t\t{ MP_CTX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_ctx\"},\n\t\t{ MP_ARX , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_arx\"},\n\t\t{ MP_THER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_ther\"},\n\t\t{ EFUSE_SET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"efuse_set\" },\n\t\t{ EFUSE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"efuse_get\" },\n\t\t{ MP_PWRTRK , IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_pwrtrk\"},\n\t\t{ MP_QueryDrvStats, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_drvquery\" },\n\t\t{ MP_IOCTL, IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_ioctl\"}, // mp_ioctl\t\n\t\t{ MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_setrfpath\" },\t\t\n\t\t{ MP_PwrCtlDM, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_pwrctldm\" },\t\t\n\t\t{ MP_GET_TXPOWER_INX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_get_txpower\" },\n\t\t{ MP_GETVER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_priv_ver\" },\n\t\t{ MP_MON, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_mon\" },\n\t\t{ EFUSE_MASK, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"efuse_mask\" },\n\t\t{ EFUSE_FILE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"efuse_file\" },\n\t\t{ MP_TX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_tx\" },\n\t\t{ MP_RX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_rx\" },\n#if defined(CONFIG_RTL8723B)\n\t\t{ MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"mp_setbt\" },\n        { MP_DISABLE_BT_COEXIST, IW_PRIV_TYPE_CHAR | 1024, 0, \"mp_disa_btcoex\"},\n#endif\n\t\t{ CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, \"cta_test\"},\n#endif\n#ifdef CONFIG_WOWLAN\n\t\t{ MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, \"wow_mode\" },\n\t\t{ MP_WOW_SET_PATTERN , IW_PRIV_TYPE_CHAR | 1024, 0, \"wow_set_pattern\" },\n#endif\n#ifdef CONFIG_AP_WOWLAN\n\t\t{ MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, \"ap_wow_mode\" }, //set \n#endif\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\t\t{ MP_SD_IREAD, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"sd_iread\" },\n\t\t{ MP_SD_IWRITE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, \"sd_iwrite\" },\n#endif\n};\n\nstatic iw_handler rtw_private_handler[] = \n{\n\trtw_wx_write32,\t\t\t\t\t//0x00\n\trtw_wx_read32,\t\t\t\t\t//0x01\n\trtw_drvext_hdl,\t\t\t\t\t//0x02\n\trtw_mp_ioctl_hdl,\t\t\t\t//0x03\n\n// for MM DTV platform\n\trtw_get_ap_info,\t\t\t\t\t//0x04\n\n\trtw_set_pid,\t\t\t\t\t\t//0x05\n\trtw_wps_start,\t\t\t\t\t//0x06\n\n// for PLATFORM_MT53XX\n\trtw_wx_get_sensitivity,\t\t\t//0x07\n\trtw_wx_set_mtk_wps_probe_ie,\t//0x08\n\trtw_wx_set_mtk_wps_ie,\t\t\t//0x09\n\n// for RTK_DMP_PLATFORM\n// Set Channel depend on the country code\n\trtw_wx_set_channel_plan,\t\t//0x0A\n\n\trtw_dbg_port,\t\t\t\t\t//0x0B\n\trtw_wx_write_rf,\t\t\t\t\t//0x0C\n\trtw_wx_read_rf,\t\t\t\t\t//0x0D\n#ifdef CONFIG_MP_INCLUDED\n\trtw_mp_set,\t\t\t\t\t//0x0E\n\trtw_mp_get,\t\t\t\t\t//0x0F\n#else\n\trtw_wx_priv_null,\t\t\t\t//0x0E\n\trtw_wx_priv_null,\t\t\t\t//0x0F\n#endif\n\trtw_p2p_set,\t\t\t\t\t//0x10\n\trtw_p2p_get,\t\t\t\t\t//0x11\n\tNULL,\t\t\t\t\t\t\t//0x12\n\trtw_p2p_get2,\t\t\t\t\t//0x13\n\n\trtw_tdls,\t\t\t\t\t\t//0x14\n\trtw_tdls_get,\t\t\t\t\t//0x15\n\n\trtw_pm_set,\t\t\t\t\t\t//0x16\n\trtw_wx_priv_null,\t\t\t\t//0x17\n\trtw_rereg_nd_name,\t\t\t\t//0x18\n\trtw_wx_priv_null,\t\t\t\t//0x19\n#ifdef CONFIG_MP_INCLUDED\n\trtw_wx_priv_null,\t\t\t\t//0x1A\n\trtw_wx_priv_null,\t\t\t\t//0x1B\n#else\n\trtw_mp_efuse_set,\t\t\t\t//0x1A\n\trtw_mp_efuse_get,\t\t\t\t//0x1B\n#endif\n\tNULL,\t\t\t\t\t\t\t// 0x1C is reserved for hostapd\n\trtw_test,\t\t\t\t\t\t// 0x1D\n#ifdef CONFIG_INTEL_WIDI\n\trtw_widi_set,\t\t\t\t\t//0x1E\n\trtw_widi_set_probe_request,\t\t//0x1F\n#endif // CONFIG_INTEL_WIDI\n};\n\n\n#if WIRELESS_EXT >= 17\t\nstatic struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)\n{\n       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\t   struct iw_statistics *piwstats=&padapter->iwstats;\n\tint tmp_level = 0;\n\tint tmp_qual = 0;\n\tint tmp_noise = 0;\n\n\tif (check_fwstate(&padapter->mlmepriv, _FW_LINKED) != _TRUE)\n\t{\n\t\tpiwstats->qual.qual = 0;\n\t\tpiwstats->qual.level = 0;\n\t\tpiwstats->qual.noise = 0;\n\t\t//DBG_871X(\"No link  level:%d, qual:%d, noise:%d\\n\", tmp_level, tmp_qual, tmp_noise);\n\t}\n\telse{\n\t\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\t\ttmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); \n\t\t#else\n\t\t#ifdef CONFIG_SIGNAL_SCALE_MAPPING\n\t\ttmp_level = padapter->recvpriv.signal_strength;\n\t\t#else\n\t\t{\n\t\t\t/* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */\n\t\t\t\n\t\t\tHAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);\n\t\t\t\n\t\t\ttmp_level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);\n\t\t}\n\t\t#endif\n\t\t#endif\n\t\t\n\t\ttmp_qual = padapter->recvpriv.signal_qual;\n\t\trtw_get_noise(padapter);\n\t\ttmp_noise = padapter->recvpriv.noise;\n\t\t//DBG_871X(\"level:%d, qual:%d, noise:%d, rssi (%d)\\n\", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);\n\n\t\tpiwstats->qual.level = tmp_level;\n\t\tpiwstats->qual.qual = tmp_qual;\n\t\tpiwstats->qual.noise = tmp_noise;\n\t}\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14))\n\tpiwstats->qual.updated = IW_QUAL_ALL_UPDATED ;//|IW_QUAL_DBM;\n#else\n#ifdef RTK_DMP_PLATFORM\n\t//IW_QUAL_DBM= 0x8, if driver use this flag, wireless extension will show value of dbm.\n\t//remove this flag for show percentage 0~100\n\tpiwstats->qual.updated = 0x07;\n#else\n\tpiwstats->qual.updated = 0x0f;\n#endif\n#endif\n\n\t#ifdef CONFIG_SIGNAL_DISPLAY_DBM\n\tpiwstats->qual.updated = piwstats->qual.updated | IW_QUAL_DBM;\n\t#endif\n\n\treturn &padapter->iwstats;\n}\n#endif\n\n#ifdef CONFIG_WIRELESS_EXT\nstruct iw_handler_def rtw_handlers_def =\n{\n\t.standard = rtw_handlers,\n\t.num_standard = sizeof(rtw_handlers) / sizeof(iw_handler),\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)) || defined(CONFIG_WEXT_PRIV)\n\t.private = rtw_private_handler,\n\t.private_args = (struct iw_priv_args *)rtw_private_args,\n\t.num_private = sizeof(rtw_private_handler) / sizeof(iw_handler),\n \t.num_private_args = sizeof(rtw_private_args) / sizeof(struct iw_priv_args),\n#endif\n#if WIRELESS_EXT >= 17\n\t.get_wireless_stats = rtw_get_wireless_stats,\n#endif\n};\n#endif\n\n// copy from net/wireless/wext.c start\n/* ---------------------------------------------------------------- */\n/*\n * Calculate size of private arguments\n */\nstatic const char iw_priv_type_size[] = {\n\t0,                              /* IW_PRIV_TYPE_NONE */\n\t1,                              /* IW_PRIV_TYPE_BYTE */\n\t1,                              /* IW_PRIV_TYPE_CHAR */\n\t0,                              /* Not defined */\n\tsizeof(__u32),                  /* IW_PRIV_TYPE_INT */\n\tsizeof(struct iw_freq),         /* IW_PRIV_TYPE_FLOAT */\n\tsizeof(struct sockaddr),        /* IW_PRIV_TYPE_ADDR */\n\t0,                              /* Not defined */\n};\n\nstatic int get_priv_size(__u16 args)\n{\n\tint num = args & IW_PRIV_SIZE_MASK;\n\tint type = (args & IW_PRIV_TYPE_MASK) >> 12;\n\n\treturn num * iw_priv_type_size[type];\n}\n// copy from net/wireless/wext.c end\n\n\nstatic int _rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_data)\n{\n\tint err = 0;\n\tu8 *input = NULL;\n\tu32 input_len = 0;\n\tconst char delim[] = \" \";\n\tu8 *output = NULL;\n\tu32 output_len = 0;\n\tu32 count = 0;\n\tu8 *buffer= NULL;\n\tu32 buffer_len = 0;\n\tchar *ptr = NULL;\n\tu8 cmdname[17] = {0}; // IFNAMSIZ+1\n\tu32 cmdlen;\n\ts32 len;\n\tu8 *extra = NULL;\n\tu32 extra_size = 0;\n\n\ts32 k;\n\tconst iw_handler *priv;\t\t/* Private ioctl */\n\tconst struct iw_priv_args *priv_args;\t/* Private ioctl description */\n\tu32 num_priv;\t\t\t\t/* Number of ioctl */\n\tu32 num_priv_args;\t\t\t/* Number of descriptions */\n\tiw_handler handler;\n\tint temp;\n\tint subcmd = 0;\t\t\t\t/* sub-ioctl index */\n\tint offset = 0;\t\t\t\t/* Space for sub-ioctl index */\n\n\tunion iwreq_data wdata;\n\n\t_rtw_memcpy(&wdata, wrq_data, sizeof(wdata));\n\n\tinput_len = wdata.data.length;\n\tinput = rtw_zmalloc(input_len);\n\tif (NULL == input || input_len == 0)\n\t\treturn -ENOMEM;\n\tif (copy_from_user(input, wdata.data.pointer, input_len)) {\n\t\terr = -EFAULT;\n\t\tgoto exit;\n\t}\n\tinput[input_len - 1] = '\\0';\n\tptr = input;\n\tlen = input_len;\n\tsscanf(ptr, \"%16s\", cmdname);\n\tcmdlen = strlen(cmdname);\n\tDBG_871X(\"%s: cmd=%s\\n\", __func__, cmdname);\n\n\t// skip command string\n\tif (cmdlen > 0)\n\t\tcmdlen += 1; // skip one space\n\tptr += cmdlen;\n\tlen -= cmdlen;\n\tDBG_871X(\"%s: parameters=%s\\n\", __func__, ptr);\n\n\tpriv = rtw_private_handler;\n\tpriv_args = rtw_private_args;\n\tnum_priv = sizeof(rtw_private_handler) / sizeof(iw_handler);\n\tnum_priv_args = sizeof(rtw_private_args) / sizeof(struct iw_priv_args);\n\n\tif (num_priv_args == 0) {\n\t\terr = -EOPNOTSUPP;\n\t\tgoto exit;\n\t}\n\n\t/* Search the correct ioctl */\n\tk = -1;\n\twhile((++k < num_priv_args) && strcmp(priv_args[k].name, cmdname));\n\n\t/* If not found... */\n\tif (k == num_priv_args) {\n\t\terr = -EOPNOTSUPP;\n\t\tgoto exit;\n\t}\n\n\t/* Watch out for sub-ioctls ! */\n\tif (priv_args[k].cmd < SIOCDEVPRIVATE)\n\t{\n\t\tint j = -1;\n\n\t\t/* Find the matching *real* ioctl */\n\t\twhile ((++j < num_priv_args) && ((priv_args[j].name[0] != '\\0') ||\n\t\t\t(priv_args[j].set_args != priv_args[k].set_args) ||\n\t\t\t(priv_args[j].get_args != priv_args[k].get_args)));\n\n\t\t/* If not found... */\n\t\tif (j == num_priv_args) {\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\n\t\t/* Save sub-ioctl number */\n\t\tsubcmd = priv_args[k].cmd;\n\t\t/* Reserve one int (simplify alignment issues) */\n\t\toffset = sizeof(__u32);\n\t\t/* Use real ioctl definition from now on */\n\t\tk = j;\n\t}\n\n\tbuffer = rtw_zmalloc(4096);\n\tif (NULL == buffer) {\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\t/* If we have to set some data */\n\tif ((priv_args[k].set_args & IW_PRIV_TYPE_MASK) &&\n\t\t(priv_args[k].set_args & IW_PRIV_SIZE_MASK))\n\t{\n\t\tu8 *str;\n\n\t\tswitch (priv_args[k].set_args & IW_PRIV_TYPE_MASK)\n\t\t{\n\t\t\tcase IW_PRIV_TYPE_BYTE:\n\t\t\t\t/* Fetch args */\n\t\t\t\tcount = 0;\n\t\t\t\tdo {\n\t\t\t\t\tstr = strsep(&ptr, delim);\n\t\t\t\t\tif (NULL == str) break;\n\t\t\t\t\tsscanf(str, \"%i\", &temp);\n\t\t\t\t\tbuffer[count++] = (u8)temp;\n\t\t\t\t} while (1);\n\t\t\t\tbuffer_len = count;\n\n\t\t\t\t/* Number of args to fetch */\n\t\t\t\twdata.data.length = count;\n\t\t\t\tif (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))\n\t\t\t\t\twdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;\n\n\t\t\t\tbreak;\n\n\t\t\tcase IW_PRIV_TYPE_INT:\n\t\t\t\t/* Fetch args */\n\t\t\t\tcount = 0;\n\t\t\t\tdo {\n\t\t\t\t\tstr = strsep(&ptr, delim);\n\t\t\t\t\tif (NULL == str) break;\n\t\t\t\t\tsscanf(str, \"%i\", &temp);\n\t\t\t\t\t((s32*)buffer)[count++] = (s32)temp;\n\t\t\t\t} while (1);\n\t\t\t\tbuffer_len = count * sizeof(s32);\n\n\t\t\t\t/* Number of args to fetch */\n\t\t\t\twdata.data.length = count;\n\t\t\t\tif (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))\n\t\t\t\t\twdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;\n\n\t\t\t\tbreak;\n\n\t\t\tcase IW_PRIV_TYPE_CHAR:\n\t\t\t\tif (len > 0)\n\t\t\t\t{\n\t\t\t\t\t/* Size of the string to fetch */\n\t\t\t\t\twdata.data.length = len;\n\t\t\t\t\tif (wdata.data.length > (priv_args[k].set_args & IW_PRIV_SIZE_MASK))\n\t\t\t\t\t\twdata.data.length = priv_args[k].set_args & IW_PRIV_SIZE_MASK;\n\n\t\t\t\t\t/* Fetch string */\n\t\t\t\t\t_rtw_memcpy(buffer, ptr, wdata.data.length);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\twdata.data.length = 1;\n\t\t\t\t\tbuffer[0] = '\\0';\n\t\t\t\t}\n\t\t\t\tbuffer_len = wdata.data.length;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBG_8192C(\"%s: Not yet implemented...\\n\", __func__);\n\t\t\t\terr = -1;\n\t\t\t\tgoto exit;\n\t\t}\n\n\t\tif ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&\n\t\t\t(wdata.data.length != (priv_args[k].set_args & IW_PRIV_SIZE_MASK)))\n\t\t{\n\t\t\tDBG_8192C(\"%s: The command %s needs exactly %d argument(s)...\\n\",\n\t\t\t\t\t__func__, cmdname, priv_args[k].set_args & IW_PRIV_SIZE_MASK);\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t}   /* if args to set */\n\telse\n\t{\n\t\twdata.data.length = 0L;\n\t}\n\n\t/* Those two tests are important. They define how the driver\n\t* will have to handle the data */\n\tif ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&\n\t\t((get_priv_size(priv_args[k].set_args) + offset) <= IFNAMSIZ))\n\t{\n\t\t/* First case : all SET args fit within wrq */\n\t\tif (offset)\n\t\t\twdata.mode = subcmd;\n\t\t_rtw_memcpy(wdata.name + offset, buffer, IFNAMSIZ - offset);\n\t}\n\telse\n\t{\n\t\tif ((priv_args[k].set_args == 0) &&\n\t\t\t(priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&\n\t\t\t(get_priv_size(priv_args[k].get_args) <= IFNAMSIZ))\n\t\t{\n\t\t\t/* Second case : no SET args, GET args fit within wrq */\n\t\t\tif (offset)\n\t\t\t\twdata.mode = subcmd;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Third case : args won't fit in wrq, or variable number of args */\n\t\t\tif (copy_to_user(wdata.data.pointer, buffer, buffer_len)) {\n\t\t\t\terr = -EFAULT;\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\twdata.data.flags = subcmd;\n\t\t}\n\t}\n\n\trtw_mfree(input, input_len);\n\tinput = NULL;\n\n\textra_size = 0;\n\tif (IW_IS_SET(priv_args[k].cmd))\n\t{\n\t\t/* Size of set arguments */\n\t\textra_size = get_priv_size(priv_args[k].set_args);\n\n\t\t/* Does it fits in iwr ? */\n\t\tif ((priv_args[k].set_args & IW_PRIV_SIZE_FIXED) &&\n\t\t\t((extra_size + offset) <= IFNAMSIZ))\n\t\t\textra_size = 0;\n\t} else {\n\t\t/* Size of get arguments */\n\t\textra_size = get_priv_size(priv_args[k].get_args);\n\n\t\t/* Does it fits in iwr ? */\n\t\tif ((priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&\n\t\t\t(extra_size <= IFNAMSIZ))\n\t\t\textra_size = 0;\n\t}\n\n\tif (extra_size == 0) {\n\t\textra = (u8*)&wdata;\n\t\trtw_mfree(buffer, 4096);\n\t\tbuffer = NULL;\n\t} else\n\t\textra = buffer;\n\n\thandler = priv[priv_args[k].cmd - SIOCIWFIRSTPRIV];\n\terr = handler(dev, NULL, &wdata, extra);\n\n\t/* If we have to get some data */\n\tif ((priv_args[k].get_args & IW_PRIV_TYPE_MASK) &&\n\t\t(priv_args[k].get_args & IW_PRIV_SIZE_MASK))\n\t{\n\t\tint j;\n\t\tint n = 0;\t/* number of args */\n\t\tu8 str[20] = {0};\n\n\t\t/* Check where is the returned data */\n\t\tif ((priv_args[k].get_args & IW_PRIV_SIZE_FIXED) &&\n\t\t\t(get_priv_size(priv_args[k].get_args) <= IFNAMSIZ))\n\t\t\tn = priv_args[k].get_args & IW_PRIV_SIZE_MASK;\n\t\telse\n\t\t\tn = wdata.data.length;\n\n\t\toutput = rtw_zmalloc(4096);\n\t\tif (NULL == output) {\n\t\t\terr =  -ENOMEM;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tswitch (priv_args[k].get_args & IW_PRIV_TYPE_MASK)\n\t\t{\n\t\t\tcase IW_PRIV_TYPE_BYTE:\n\t\t\t\t/* Display args */\n\t\t\t\tfor (j = 0; j < n; j++)\n\t\t\t\t{\n\t\t\t\t\tsprintf(str, \"%d  \", extra[j]);\n\t\t\t\t\tlen = strlen(str);\n\t\t\t\t\toutput_len = strlen(output);\n\t\t\t\t\tif ((output_len + len + 1) > 4096) {\n\t\t\t\t\t\terr = -E2BIG;\n\t\t\t\t\t\tgoto exit;\n\t\t\t\t\t}\n\t\t\t\t\t_rtw_memcpy(output+output_len, str, len);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IW_PRIV_TYPE_INT:\n\t\t\t\t/* Display args */\n\t\t\t\tfor (j = 0; j < n; j++)\n\t\t\t\t{\n\t\t\t\t\tsprintf(str, \"%d  \", ((__s32*)extra)[j]);\n\t\t\t\t\tlen = strlen(str);\n\t\t\t\t\toutput_len = strlen(output);\n\t\t\t\t\tif ((output_len + len + 1) > 4096) {\n\t\t\t\t\t\terr = -E2BIG;\n\t\t\t\t\t\tgoto exit;\n\t\t\t\t\t}\n\t\t\t\t\t_rtw_memcpy(output+output_len, str, len);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase IW_PRIV_TYPE_CHAR:\n\t\t\t\t/* Display args */\n\t\t\t\t_rtw_memcpy(output, extra, n);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tDBG_8192C(\"%s: Not yet implemented...\\n\", __func__);\n\t\t\t\terr = -1;\n\t\t\t\tgoto exit;\n\t\t}\n\n\t\toutput_len = strlen(output) + 1;\n\t\twrq_data->data.length = output_len;\n\t\tif (copy_to_user(wrq_data->data.pointer, output, output_len)) {\n\t\t\terr = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t}   /* if args to set */\n\telse\n\t{\n\t\twrq_data->data.length = 0;\n\t}\n\nexit:\n\tif (input)\n\t\trtw_mfree(input, input_len);\n\tif (buffer)\n\t\trtw_mfree(buffer, 4096);\n\tif (output)\n\t\trtw_mfree(output, 4096);\n\n\treturn err;\n}\n\n#ifdef CONFIG_COMPAT\nstatic int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *rq)\n{\n\tstruct compat_iw_point iwp_compat;\n\tunion iwreq_data wrq_data;\n\tint err = 0;\n\tDBG_871X(\"%s:...\\n\", __func__);\n\tif (copy_from_user(&iwp_compat, rq->ifr_ifru.ifru_data, sizeof(struct compat_iw_point)))\n\t\t\treturn -EFAULT;\n\t\n\twrq_data.data.pointer = compat_ptr(iwp_compat.pointer);\n\twrq_data.data.length = iwp_compat.length;\n\twrq_data.data.flags = iwp_compat.flags;\n\n\terr = _rtw_ioctl_wext_private(dev, &wrq_data);\n\n\tiwp_compat.pointer = ptr_to_compat(wrq_data.data.pointer);\n\tiwp_compat.length = wrq_data.data.length;\n\tiwp_compat.flags = wrq_data.data.flags;\n\tif (copy_to_user(rq->ifr_ifru.ifru_data, &iwp_compat, sizeof(struct compat_iw_point)))\n\t\t\treturn -EFAULT;\n\n\treturn err;\n}\n#endif // CONFIG_COMPAT\n\nstatic int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq)\n{\n\tstruct iw_point *iwp;\n\tstruct ifreq ifrq;\n\tunion iwreq_data wrq_data;\n\tint err = 0;\n\tiwp = &wrq_data.data;\n\tDBG_871X(\"%s:...\\n\", __func__);\n\tif (copy_from_user(iwp, rq->ifr_ifru.ifru_data, sizeof(struct iw_point)))\n\t\treturn -EFAULT;\n\n\terr = _rtw_ioctl_wext_private(dev, &wrq_data);\n\n\tif (copy_to_user(rq->ifr_ifru.ifru_data, iwp, sizeof(struct iw_point)))\n\t\treturn -EFAULT;\n\n\treturn err;\n}\n \nstatic int rtw_ioctl_wext_private(struct net_device *dev, struct ifreq *rq)\n{\n#ifdef CONFIG_COMPAT\n#ifdef in_compat_syscall\n    if(in_compat_syscall())\n#else\n\tif(is_compat_task())\n#endif\n\t\treturn rtw_ioctl_compat_wext_private( dev, rq );\n\telse\n#endif // CONFIG_COMPAT\n\t\treturn rtw_ioctl_standard_wext_private( dev, rq );\n}\n\nint rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)\n{\n\tstruct iwreq *wrq = (struct iwreq *)rq;\n\tint ret=0;\n\n\tswitch (cmd)\n\t{\n\t\tcase RTL_IOCTL_WPA_SUPPLICANT:\n\t\t\tret = wpa_supplicant_ioctl(dev, &wrq->u.data);\n\t\t\tbreak;\n#ifdef CONFIG_AP_MODE\n\t\tcase RTL_IOCTL_HOSTAPD:\n\t\t\tret = rtw_hostapd_ioctl(dev, &wrq->u.data);\n\t\t\tbreak;\n#ifdef CONFIG_WIRELESS_EXT\n\t\tcase SIOCSIWMODE:\n\t\t\tret = rtw_wx_set_mode(dev, NULL, &wrq->u, NULL);\n\t\t\tbreak;\n#endif\n#endif // CONFIG_AP_MODE\n\t\tcase SIOCDEVPRIVATE:\t\t\t\t\n\t\t\t ret = rtw_ioctl_wext_private(dev, rq);\n\t\t\tbreak;\n\t\tcase (SIOCDEVPRIVATE+1):\n\t\t\tret = rtw_android_priv_cmd(dev, rq, cmd);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tret = -EOPNOTSUPP;\n\t\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\n\n"
  },
  {
    "path": "os_dep/linux/ioctl_mp.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#if defined(CONFIG_MP_INCLUDED)\n\n#include <drv_types.h>\n#include <rtw_mp.h>\n#include <rtw_mp_ioctl.h>\n#include \"../../hal/phydm/phydm_precomp.h\"\n\n\n#if defined(CONFIG_RTL8723B)\n#include <rtw_bt_mp.h>\n#endif\n\n/*\n * Input Format: %s,%d,%d\n *\t%s is width, could be\n *\t\t\"b\" for 1 byte\n *\t\t\"w\" for WORD (2 bytes)\n *\t\t\"dw\" for DWORD (4 bytes)\n *\t1st %d is address(offset)\n *\t2st %d is data to write\n */\nint rtw_mp_write_reg(struct net_device *dev,\n\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tchar *pch, *pnext, *ptmp;\n\tchar *width_str;\n\tchar width, buf[5];\n\tu32 addr, data;\n\tint ret;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar input[wrqu->length];\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tpch = input;\n\n\tpnext = strpbrk(pch, \" ,.-\");\n\tif (pnext == NULL)\n\t\treturn -EINVAL;\n\t*pnext = 0;\n\twidth_str = pch;\n\n\tpch = pnext + 1;\n\tpnext = strpbrk(pch, \" ,.-\");\n\tif (pnext == NULL)\n\t\treturn -EINVAL;\n\t*pnext = 0;\n\t/*addr = simple_strtoul(pch, &ptmp, 16);\n\t_rtw_memset(buf, '\\0', sizeof(buf));\n\t_rtw_memcpy(buf, pch, pnext-pch);\n\tret = kstrtoul(buf, 16, &addr);*/\n\tret = sscanf(pch, \"%x\", &addr);\n\tif (addr > 0x3FFF)\n\t\treturn -EINVAL;\n\n\tpch = pnext + 1;\n\tpnext = strpbrk(pch, \" ,.-\");\n\tif ((pch - input) >= wrqu->length)\n\t\treturn -EINVAL;\n\t/*data = simple_strtoul(pch, &ptmp, 16);*/\n\tret = sscanf(pch, \"%x\", &data);\n\tDBG_871X(\"data=%x,addr=%x\\n\", (u32)data, (u32)addr);\n\tret = 0;\n\twidth = width_str[0];\n\tswitch (width) {\n\tcase 'b':\n\t\t/* 1 byte*/\n\t\tif (data > 0xFF) {\n\t\t\tret = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\trtw_write8(padapter, addr, data);\n\t\tbreak;\n\tcase 'w':\n\t\t/* 2 bytes*/\n\t\tif (data > 0xFFFF) {\n\t\t\tret = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t\trtw_write16(padapter, addr, data);\n\t\tbreak;\n\tcase 'd':\n\t\t/* 4 bytes*/\n\t\trtw_write32(padapter, addr, data);\n\t\tbreak;\n\tdefault:\n\t\tret = -EINVAL;\n\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\n\n/*\n * Input Format: %s,%d\n *\t%s is width, could be\n *\t\t\"b\" for 1 byte\n *\t\t\"w\" for WORD (2 bytes)\n *\t\t\"dw\" for DWORD (4 bytes)\n *\t%d is address(offset)\n *\n * Return:\n *\t%d for data readed\n */\nint rtw_mp_read_reg(struct net_device *dev,\n\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\tchar input[wrqu->length];\n\tchar *pch, *pnext, *ptmp;\n\tchar *width_str;\n\tchar width;\n\tchar data[20], tmp[20], buf[3];\n\tu32 addr = 0, strtout = 0;\n\tu32 i = 0, j = 0, ret = 0, data32 = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\n\tif (wrqu->length > 128)\n\t\treturn -EFAULT;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\t_rtw_memset(data, '\\0', sizeof(data));\n\t_rtw_memset(tmp, '\\0', sizeof(tmp));\n\tpch = input;\n\tpnext = strpbrk(pch, \" ,.-\");\n\tif (pnext == NULL)\n\t\treturn -EINVAL;\n\t*pnext = 0;\n\twidth_str = pch;\n\n\tpch = pnext + 1;\n\n\tret = sscanf(pch, \"%x\", &addr);\n\tif (addr > 0x3FFF)\n\t\treturn -EINVAL;\n\n\tret = 0;\n\twidth = width_str[0];\n\n\tswitch (width) {\n\tcase 'b':\n\t\t\tdata32 = rtw_read8(padapter, addr);\n\t\t\tDBG_871X(\"%x\\n\", data32);\n\t\t\tsprintf(extra, \"%d\", data32);\n\t\t\twrqu->length = strlen(extra);\n\t\t\tbreak;\n\tcase 'w':\n\t\t\t/* 2 bytes*/\n\t\t\tsprintf(data, \"%04x\\n\", rtw_read16(padapter, addr));\n\n\t\t\tfor (i = 0 ; i <= strlen(data) ; i++) {\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\ttmp[j] = ' ';\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (data[i] != '\\0')\n\t\t\t\t\ttmp[j] = data[i];\n\n\t\t\t\tj++;\n\t\t\t}\n\t\t\tpch = tmp;\n\t\t\tDBG_871X(\"pch=%s\", pch);\n\n\t\t\twhile (*pch != '\\0') {\n\t\t\t\tpnext = strpbrk(pch, \" \");\n\t\t\t\tif (!pnext || ((pnext - tmp) > 4))\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tpnext++;\n\t\t\t\tif (*pnext != '\\0') {\n\t\t\t\t\t/*strtout = simple_strtoul(pnext , &ptmp, 16);*/\n\t\t\t\t\tret = sscanf(pnext, \"%x\", &strtout);\n\t\t\t\t\tsprintf(extra, \"%s %d\" , extra , strtout);\n\t\t\t\t} else\n\t\t\t\t\tbreak;\n\t\t\t\tpch = pnext;\n\t\t\t}\n\t\t\twrqu->length = strlen(extra);\n\t\t\tbreak;\n\tcase 'd':\n\t\t\t/* 4 bytes */\n\t\t\tsprintf(data, \"%08x\", rtw_read32(padapter, addr));\n\t\t\t/*add read data format blank*/\n\t\t\tfor (i = 0 ; i <= strlen(data) ; i++) {\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\ttmp[j] = ' ';\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tif (data[i] != '\\0')\n\t\t\t\t\ttmp[j] = data[i];\n\n\t\t\t\tj++;\n\t\t\t}\n\t\t\tpch = tmp;\n\t\t\tDBG_871X(\"pch=%s\", pch);\n\n\t\t\twhile (*pch != '\\0') {\n\t\t\t\tpnext = strpbrk(pch, \" \");\n\t\t\t\tif (!pnext)\n\t\t\t\t\tbreak;\n\n\t\t\t\tpnext++;\n\t\t\t\tif (*pnext != '\\0') {\n\t\t\t\t\tret = sscanf(pnext, \"%x\", &strtout);\n\t\t\t\t\tsprintf(extra, \"%s %d\" , extra , strtout);\n\t\t\t\t} else\n\t\t\t\t\tbreak;\n\t\t\t\tpch = pnext;\n\t\t\t}\n\t\t\twrqu->length = strlen(extra);\n\t\t\tbreak;\n\n\tdefault:\n\t\t\twrqu->length = 0;\n\t\t\tret = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\n\treturn ret;\n}\n\n\n/*\n * Input Format: %d,%x,%x\n *\t%d is RF path, should be smaller than MAX_RF_PATH_NUMS\n *\t1st %x is address(offset)\n *\t2st %x is data to write\n */\nint rtw_mp_write_rf(struct net_device *dev,\n\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\n\tu32 path, addr, data;\n\tint ret;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar input[wrqu->length];\n\n\n\t_rtw_memset(input, 0, wrqu->length);\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\n\tret = sscanf(input, \"%d,%x,%x\", &path, &addr, &data);\n\tif (ret < 3)\n\t\treturn -EINVAL;\n\n\tif (path >= GET_HAL_RFPATH_NUM(padapter))\n\t\treturn -EINVAL;\n\tif (addr > 0xFF)\n\t\treturn -EINVAL;\n\tif (data > 0xFFFFF)\n\t\treturn -EINVAL;\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\twrite_rfreg(padapter, path, addr, data);\n\n\tsprintf(extra, \"write_rf completed\\n\");\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\n/*\n * Input Format: %d,%x\n *\t%d is RF path, should be smaller than MAX_RF_PATH_NUMS\n *\t%x is address(offset)\n *\n * Return:\n *\t%d for data readed\n */\nint rtw_mp_read_rf(struct net_device *dev,\n\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tchar input[wrqu->length];\n\tchar *pch, *pnext, *ptmp;\n\tchar data[20], tmp[20], buf[3];\n\tu32 path, addr, strtou;\n\tu32 ret, i = 0 , j = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\t\n\tif (wrqu->length > 128)\n\t\treturn -EFAULT;\n\t_rtw_memset(input, 0, wrqu->length);\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tret = sscanf(input, \"%d,%x\", &path, &addr);\n\tif (ret < 2)\n\t\treturn -EINVAL;\n\n\tif (path >= GET_HAL_RFPATH_NUM(padapter))\n\t\treturn -EINVAL;\n\tif (addr > 0xFF)\n\t\treturn -EINVAL;\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tsprintf(data, \"%08x\", read_rfreg(padapter, path, addr));\n\t/*add read data format blank*/\n\tfor (i = 0 ; i <= strlen(data) ; i++) {\n\t\tif (i % 2 == 0) {\n\t\t\ttmp[j] = ' ';\n\t\t\tj++;\n\t\t}\n\t\ttmp[j] = data[i];\n\t\tj++;\n\t}\n\tpch = tmp;\n\tDBG_871X(\"pch=%s\", pch);\n\n\twhile (*pch != '\\0') {\n\t\tpnext = strpbrk(pch, \" \");\n\t\tif (!pnext)\n\t\t\tbreak;\n\t\tpnext++;\n\t\tif (*pnext != '\\0') {\n\t\t\t/*strtou =simple_strtoul(pnext , &ptmp, 16);*/\n\t\t\tret = sscanf(pnext, \"%x\", &strtou);\n\t\t\tsprintf(extra, \"%s %d\" , extra , strtou);\n\t\t} else\n\t\t\tbreak;\n\t\tpch = pnext;\n\t}\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\nint rtw_mp_start(struct net_device *dev,\n\t\t\t\t struct iw_request_info *info,\n\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tu8 val8;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\n\trtw_pm_set_ips(padapter, IPS_NONE);\n\tLeaveAllPowerSaveMode(padapter);\n\n\tif (padapter->registrypriv.mp_mode == 0) {\n\t\trtw_hal_deinit(padapter);\n\t\tpadapter->registrypriv.mp_mode = 1;\n\t\t#ifdef CONFIG_RF_GAIN_OFFSET\n\t\tif (!IS_HARDWARE_TYPE_8814A(padapter))\n\t\t\tpadapter->registrypriv.RegRfKFreeEnable = 1;\n\t\trtw_hal_read_chip_info(padapter);\n\t\t#endif /*CONFIG_RF_GAIN_OFFSET*/\n\t\trtw_hal_init(padapter);\n\t}\n\n\tif (padapter->registrypriv.mp_mode == 0)\n\t\treturn -EPERM;\n\n\tif (padapter->mppriv.mode == MP_OFF) {\n\t\tif (mp_start_test(padapter) == _FAIL)\n\t\t\treturn -EPERM;\n\t\tpadapter->mppriv.mode = MP_ON;\n\t\tMPT_PwrCtlDM(padapter, 0);\n\t}\n\tpadapter->mppriv.bmac_filter = _FALSE;\n#ifdef CONFIG_RTL8723B\n#ifdef CONFIG_USB_HCI\n\trtw_write32(padapter, 0x765, 0x0000);\n\trtw_write32(padapter, 0x948, 0x0280);\n#else\n\trtw_write32(padapter, 0x765, 0x0000);\n\trtw_write32(padapter, 0x948, 0x0000);\n#endif\n#ifdef CONFIG_FOR_RTL8723BS_VQ0\n\trtw_write32(padapter, 0x765, 0x0000);\n\trtw_write32(padapter, 0x948, 0x0280);\n#endif\n\trtw_write8(padapter, 0x66, 0x27); /*Open BT uart Log*/\n\trtw_write8(padapter, 0xc50, 0x20); /*for RX init Gain*/\n#endif\n\tODM_Write_DIG(&pHalData->odmpriv, 0x20);\n\n\treturn 0;\n}\n\n\n\nint rtw_mp_stop(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\n\tif (padapter->registrypriv.mp_mode == 1) {\n\n\t\tMPT_DeInitAdapter(padapter);\n\t\tpHalFunc->hal_deinit(padapter);\n\t\tpadapter->registrypriv.mp_mode = 0;\n\t\tpHalFunc->hal_init(padapter);\n\t}\n\n\tif (padapter->mppriv.mode != MP_OFF) {\n\t\tmp_stop_test(padapter);\n\t\tpadapter->mppriv.mode = MP_OFF;\n\t}\n\n\treturn 0;\n}\n\n\nint rtw_mp_rate(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\tu32 rate = MPT_RATE_1M;\n\tu8\t\tinput[wrqu->length];\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tPMPT_CONTEXT\t\tpMptCtx = &(padapter->mppriv.MptCtx);\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\trate = rtw_mpRateParseFunc(padapter, input);\n\tpadapter->mppriv.rateidx = rate;\n\n\tif (rate == 0 && strcmp(input, \"1M\") != 0) {\n\t\trate = rtw_atoi(input);\n\t\tpadapter->mppriv.rateidx = MRateToHwRate(rate);\n\t\t/*if (rate <= 0x7f)\n\t\t\trate = wifirate2_ratetbl_inx((u8)rate);\n\t\telse if (rate < 0xC8)\n\t\t\trate = (rate - 0x79 + MPT_RATE_MCS0);\n\t\tHT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159\n\t\tVHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179\n\t\tVHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199\n\t\telse\n\t\tVHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153\n\t\trate =(rate - MPT_RATE_VHT1SS_MCS0);\n\t\t*/\n\t}\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tsprintf(extra, \"Set data rate to %s index %d\" , input, padapter->mppriv.rateidx);\n\tDBG_871X(\"%s: %s rate index=%d\\n\", __func__, input, padapter->mppriv.rateidx);\n\n\tif (padapter->mppriv.rateidx >= DESC_RATEVHTSS4MCS9)\n\t\treturn -EINVAL;\n\n\tpMptCtx->MptRateIndex = HwRateToMPTRate(padapter->mppriv.rateidx);\n\tSetDataRate(padapter);\n\n\twrqu->length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_mp_channel(struct net_device *dev,\n\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\tu8\t\tinput[wrqu->length];\n\tu32\tchannel = 1;\n\tint cur_ch_offset;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tchannel = rtw_atoi(input);\n\t/*DBG_871X(\"%s: channel=%d\\n\", __func__, channel);*/\n\t_rtw_memset(extra, 0, wrqu->length);\n\tsprintf(extra, \"Change channel %d to channel %d\", padapter->mppriv.channel , channel);\n\tpadapter->mppriv.channel = channel;\n\tSetChannel(padapter);\n\tpHalData->CurrentChannel = channel;\n\n\twrqu->length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_mp_bandwidth(struct net_device *dev,\n\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tu32 bandwidth = 0, sg = 0;\n\tint cur_ch_offset;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\n\tif (sscanf(extra, \"40M=%d,shortGI=%d\", &bandwidth, &sg) > 0)\n\t\tDBG_871X(\"%s: bw=%d sg=%d\\n\", __func__, bandwidth , sg);\n\n\tif (bandwidth == 1)\n\t\tbandwidth = CHANNEL_WIDTH_40;\n\telse if (bandwidth == 2)\n\t\tbandwidth = CHANNEL_WIDTH_80;\n\n\tpadapter->mppriv.bandwidth = (u8)bandwidth;\n\tpadapter->mppriv.preamble = sg;\n\n\tSetBandwidth(padapter);\n\tpHalData->CurrentChannelBW = bandwidth;\n\t/*cur_ch_offset =  rtw_get_offset_by_ch(padapter->mppriv.channel);*/\n\t/*set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, bandwidth);*/\n\n\treturn 0;\n}\n\n\nint rtw_mp_txpower_index(struct net_device *dev,\n\t\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar input[wrqu->length];\n\tu32 rfpath;\n\tu32 txpower_inx;\n\n\tif (wrqu->length > 128)\n\t\treturn -EFAULT;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\trfpath = rtw_atoi(input);\n\ttxpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);\n\tsprintf(extra, \" %d\", txpower_inx);\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\nint rtw_mp_txpower(struct net_device *dev,\n\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tu32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0, status = 0;\n\tint MsetPower = 1;\n\tu8\t\tinput[wrqu->length];\n\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tPMPT_CONTEXT\t\tpMptCtx = &(padapter->mppriv.MptCtx);\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tMsetPower = strncmp(input, \"off\", 3);\n\tif (MsetPower == 0) {\n\t\tpadapter->mppriv.bSetTxPower = 0;\n\t\tsprintf(extra, \"MP Set power off\");\n\t} else {\n\t\tif (sscanf(input, \"patha=%d,pathb=%d,pathc=%d,pathd=%d\", &idx_a, &idx_b, &idx_c, &idx_d) < 3)\n\t\t\tDBG_871X(\"Invalid format on line %s ,patha=%d,pathb=%d,pathc=%d,pathd=%d\\n\", input , idx_a , idx_b , idx_c , idx_d);\n\n\t\tsprintf(extra, \"Set power level path_A:%d path_B:%d path_C:%d path_D:%d\", idx_a , idx_b , idx_c , idx_d);\n\t\tpadapter->mppriv.txpoweridx = (u8)idx_a;\n\n\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)idx_a;\n\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)idx_b;\n\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)idx_c;\n\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_D]  = (u8)idx_d;\n\t\tpadapter->mppriv.bSetTxPower = 1;\n\n\t\tSetTxPower(padapter);\n\t}\n\n\twrqu->length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_mp_ant_tx(struct net_device *dev,\n\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t  struct iw_point *wrqu, char *extra)\n{\n\tu8 i;\n\tu8\t\tinput[wrqu->length];\n\tu16 antenna = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tsprintf(extra, \"switch Tx antenna to %s\", input);\n\n\tfor (i = 0; i < strlen(input); i++) {\n\t\tswitch (input[i]) {\n\t\tcase 'a':\n\t\t\tantenna |= ANTENNA_A;\n\t\t\tbreak;\n\t\tcase 'b':\n\t\t\tantenna |= ANTENNA_B;\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tantenna |= ANTENNA_C;\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\tantenna |= ANTENNA_D;\n\t\t\tbreak;\n\t\t}\n\t}\n\t/*antenna |= BIT(extra[i]-'a');*/\n\tDBG_871X(\"%s: antenna=0x%x\\n\", __func__, antenna);\n\tpadapter->mppriv.antenna_tx = antenna;\n\tpadapter->mppriv.antenna_rx = antenna;\n\t/*DBG_871X(\"%s:mppriv.antenna_rx=%d\\n\", __func__, padapter->mppriv.antenna_tx);*/\n\tpHalData->AntennaTxPath = antenna;\n\n\tSetAntenna(padapter);\n\n\twrqu->length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_mp_ant_rx(struct net_device *dev,\n\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t  struct iw_point *wrqu, char *extra)\n{\n\tu8 i;\n\tu16 antenna = 0;\n\tu8\t\tinput[wrqu->length];\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\t/*DBG_871X(\"%s: input=%s\\n\", __func__, input);*/\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tsprintf(extra, \"switch Rx antenna to %s\", input);\n\n\tfor (i = 0; i < strlen(input); i++) {\n\t\tswitch (input[i]) {\n\t\tcase 'a':\n\t\t\tantenna |= ANTENNA_A;\n\t\t\tbreak;\n\t\tcase 'b':\n\t\t\tantenna |= ANTENNA_B;\n\t\t\tbreak;\n\t\tcase 'c':\n\t\t\tantenna |= ANTENNA_C;\n\t\t\tbreak;\n\t\tcase 'd':\n\t\t\tantenna |= ANTENNA_D;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDBG_871X(\"%s: antenna=0x%x\\n\", __func__, antenna);\n\tpadapter->mppriv.antenna_tx = antenna;\n\tpadapter->mppriv.antenna_rx = antenna;\n\tpHalData->AntennaRxPath = antenna;\n\t/*DBG_871X(\"%s:mppriv.antenna_rx=%d\\n\", __func__, padapter->mppriv.antenna_rx);*/\n\tSetAntenna(padapter);\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\nint rtw_set_ctx_destAddr(struct net_device *dev,\n\t\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tint jj, kk = 0;\n\n\tstruct pkt_attrib *pattrib;\n\tstruct mp_priv *pmp_priv;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\t\n\tpmp_priv = &padapter->mppriv;\n\tpattrib = &pmp_priv->tx.attrib;\n\n\tif (strlen(extra) < 5)\n\t\treturn _FAIL;\n\n\tDBG_871X(\"%s: in=%s\\n\", __func__, extra);\n\tfor (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3)\n\t\tpattrib->dst[jj] = key_2char2num(extra[kk], extra[kk + 1]);\n\n\tDBG_871X(\"pattrib->dst:%x %x %x %x %x %x\\n\", pattrib->dst[0], pattrib->dst[1], pattrib->dst[2], pattrib->dst[3], pattrib->dst[4], pattrib->dst[5]);\n\treturn 0;\n}\n\n\n\nint rtw_mp_ctx(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tu32 pkTx = 1;\n\tint countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1;\n\tu32 bStartTest = 1;\n\tu32 count = 0, pktinterval = 0, pktlen = 0;\n\tu8 status;\n\tstruct mp_priv *pmp_priv;\n\tstruct pkt_attrib *pattrib;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tpmp_priv = &padapter->mppriv;\n\tpattrib = &pmp_priv->tx.attrib;\n\n\tif (copy_from_user(extra, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tDBG_871X(\"%s: in=%s\\n\", __func__, extra);\n\n\tcountPkTx = strncmp(extra, \"count=\", 5); /* strncmp TRUE is 0*/\n\tcotuTx = strncmp(extra, \"background\", 20);\n\tCarrSprTx = strncmp(extra, \"background,cs\", 20);\n\tscTx = strncmp(extra, \"background,sc\", 20);\n\tsgleTx = strncmp(extra, \"background,stone\", 20);\n\tpkTx = strncmp(extra, \"background,pkt\", 20);\n\tstop = strncmp(extra, \"stop\", 4);\n\tif (sscanf(extra, \"count=%d,pkt\", &count) > 0)\n\t\tDBG_871X(\"count= %d\\n\", count);\n\tif (sscanf(extra, \"pktinterval=%d\", &pktinterval) > 0)\n\t\tDBG_871X(\"pktinterval= %d\\n\", pktinterval);\n\n\tif (sscanf(extra, \"pktlen=%d\", &pktlen) > 0)\n\t\tDBG_871X(\"pktlen= %d\\n\", pktlen);\n\n\tif (_rtw_memcmp(extra, \"destmac=\", 8)) {\n\t\twrqu->length -= 8;\n\t\trtw_set_ctx_destAddr(dev, info, wrqu, &extra[8]);\n\t\tsprintf(extra, \"Set dest mac OK !\\n\");\n\t\treturn 0;\n\t}\n\n\t/*DBG_871X(\"%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\\n\", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop);*/\n\t_rtw_memset(extra, '\\0', strlen(extra));\n\n\tif (pktinterval != 0) {\n\t\tsprintf(extra, \"Pkt Interval = %d\", pktinterval);\n\t\tpadapter->mppriv.pktInterval = pktinterval;\n\t\twrqu->length = strlen(extra);\n\t\treturn 0;\n\t}\n\tif (pktlen != 0) {\n\t\tsprintf(extra, \"Pkt len = %d\", pktlen);\n\t\tpattrib->pktlen = pktlen;\n\t\twrqu->length = strlen(extra);\n\t\treturn 0;\n\t}\n\tif (stop == 0) {\n\t\tbStartTest = 0; /* To set Stop*/\n\t\tpmp_priv->tx.stop = 1;\n\t\tsprintf(extra, \"Stop continuous Tx\");\n\t} else {\n\t\tbStartTest = 1;\n\t\tif (pmp_priv->mode != MP_ON) {\n\t\t\tif (pmp_priv->tx.stop != 1) {\n\t\t\t\tDBG_871X(\"%s: MP_MODE != ON %d\\n\", __func__, pmp_priv->mode);\n\t\t\t\treturn\t-EFAULT;\n\t\t\t}\n\t\t}\n\t}\n\n\tpmp_priv->tx.count = count;\n\n\tif (pkTx == 0 || countPkTx == 0)\n\t\tpmp_priv->mode = MP_PACKET_TX;\n\tif (sgleTx == 0)\n\t\tpmp_priv->mode = MP_SINGLE_TONE_TX;\n\tif (cotuTx == 0)\n\t\tpmp_priv->mode = MP_CONTINUOUS_TX;\n\tif (CarrSprTx == 0)\n\t\tpmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;\n\tif (scTx == 0)\n\t\tpmp_priv->mode = MP_SINGLE_CARRIER_TX;\n\n\tstatus = rtw_mp_pretx_proc(padapter, bStartTest, extra);\n\n\twrqu->length = strlen(extra);\n\treturn status;\n}\n\n\n\nint rtw_mp_disable_bt_coexist(struct net_device *dev,\n\t\t\t\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\n\tu8 input[wrqu->data.length];\n\tu32 bt_coexist;\n\n\tif (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\n\tbt_coexist = rtw_atoi(input);\n\n\tif (bt_coexist == 0) {\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t\t (\"Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\\n\"));\n\t\tDBG_871X(\"Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\\n\");\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_HaltNotify(padapter);\n\t\trtw_btcoex_SetManualControl(padapter, _TRUE);\n\t\t/* Force to switch Antenna to WiFi*/\n\t\trtw_write16(padapter, 0x870, 0x300);\n\t\trtw_write16(padapter, 0x860, 0x110);\n#endif \n\t\t/* CONFIG_BT_COEXIST */\n\t} else {\n\t\tRT_TRACE(_module_mp_, _drv_info_,\n\t\t\t\t (\"Set OID_RT_SET_DISABLE_BT_COEXIST: enable BT_COEXIST\\n\"));\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_SetManualControl(padapter, _FALSE);\n#endif\n\t}\n\n\treturn 0;\n}\n\n\nint rtw_mp_arx(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tint bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0;\n\tint bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0;\n\tu8\t\tinput[wrqu->length];\n\tchar *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00};\n\tu32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, ret;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tstruct mp_priv *pmppriv = &padapter->mppriv;\n\tstruct dbg_rx_counter rx_counter;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tDBG_871X(\"%s: %s\\n\", __func__, input);\n\n\tbStartRx = (strncmp(input, \"start\", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/\n\tbStopRx = (strncmp(input, \"stop\", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/\n\tbQueryPhy = (strncmp(input, \"phy\", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/\n\tbQueryMac = (strncmp(input, \"mac\", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/\n\tbSetBssid = (strncmp(input, \"setbssid=\", 8) == 0) ? 1 : 0; /* strncmp TRUE is 0*/\n\t/*bfilter_init = (strncmp(input, \"filter_init\",11)==0)?1:0;*/\n\tbmac_filter = (strncmp(input, \"accept_mac\", 10) == 0) ? 1 : 0;\n\tbmon = (strncmp(input, \"mon=\", 4) == 0) ? 1 : 0;\n\tbSmpCfg = (strncmp(input , \"smpcfg=\" , 7) == 0) ? 1 : 0;\n\n\tif (bSetBssid == 1) {\n\t\tpch = input;\n\t\twhile ((token = strsep(&pch, \"=\")) != NULL) {\n\t\t\tif (i > 1)\n\t\t\t\tbreak;\n\t\t\ttmp[i] = token;\n\t\t\ti++;\n\t\t}\n\t\tif ((tmp[0] != NULL) && (tmp[1] != NULL)) {\n\t\t\tcnts = strlen(tmp[1]) / 2;\n\t\t\tif (cnts < 1)\n\t\t\t\treturn -EFAULT;\n\t\t\tDBG_871X(\"%s: cnts=%d\\n\", __func__, cnts);\n\t\t\tDBG_871X(\"%s: data=%s\\n\", __func__, tmp[1]);\n\t\t\tfor (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {\n\t\t\t\tpmppriv->network_macaddr[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);\n\t\t\t\tDBG_871X(\"network_macaddr[%d]=%x\\n\", jj, pmppriv->network_macaddr[jj]);\n\t\t\t} \n\t\t} else\n\t\t\treturn -EFAULT;\n\t\t\t\n\t\tpmppriv->bSetRxBssid = _TRUE;\n\t}\n\n\tif (bmac_filter) {\n\t\tpmppriv->bmac_filter = bmac_filter;\n\t\tpch = input;\n\t\twhile ((token = strsep(&pch, \"=\")) != NULL) {\n\t\t\tif (i > 1)\n\t\t\t\tbreak;\n\t\t\ttmp[i] = token;\n\t\t\ti++;\n\t\t}\n\t\tif ((tmp[0] != NULL) && (tmp[1] != NULL)) {\n\t\t\tcnts = strlen(tmp[1]) / 2;\n\t\t\tif (cnts < 1)\n\t\t\t\treturn -EFAULT;\n\t\t\tDBG_871X(\"%s: cnts=%d\\n\", __func__, cnts);\n\t\t\tDBG_871X(\"%s: data=%s\\n\", __func__, tmp[1]);\n\t\t\tfor (jj = 0, kk = 0; jj < cnts ; jj++, kk += 2) {\n\t\t\t\tpmppriv->mac_filter[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);\n\t\t\t\tDBG_871X(\"%s mac_filter[%d]=%x\\n\", __func__, jj, pmppriv->mac_filter[jj]);\n\t\t\t} \n\t\t} else \n\t\t\treturn -EFAULT;\n\n\t}\n\n\tif (bStartRx) {\n\t\tsprintf(extra, \"start\");\n\t\tSetPacketRx(padapter, bStartRx, _FALSE);\n\t} else if (bStopRx) {\n\t\tSetPacketRx(padapter, bStartRx, _FALSE);\n\t\tpmppriv->bmac_filter = _FALSE;\n\t\tsprintf(extra, \"Received packet OK:%d CRC error:%d ,Filter out:%d\", padapter->mppriv.rx_pktcount, padapter->mppriv.rx_crcerrpktcount, padapter->mppriv.rx_pktcount_filter_out);\n\t} else if (bQueryPhy) {\n\t\t_rtw_memset(&rx_counter, 0, sizeof(struct dbg_rx_counter));\n\t\trtw_dump_phy_rx_counters(padapter, &rx_counter);\n\n\t\tDBG_871X(\"%s: OFDM_FA =%d\\n\", __func__, rx_counter.rx_ofdm_fa);\n\t\tDBG_871X(\"%s: CCK_FA =%d\\n\", __func__, rx_counter.rx_cck_fa);\n\t\tsprintf(extra, \"Phy Received packet OK:%d CRC error:%d FA Counter: %d\", rx_counter.rx_pkt_ok, rx_counter.rx_pkt_crc_error, rx_counter.rx_cck_fa + rx_counter.rx_ofdm_fa);\n\n\n\t} else if (bQueryMac) {\n\t\t_rtw_memset(&rx_counter, 0, sizeof(struct dbg_rx_counter));\n\t\trtw_dump_mac_rx_counters(padapter, &rx_counter);\n\t\tsprintf(extra, \"Mac Received packet OK: %d , CRC error: %d , Drop Packets: %d\\n\",\n\t\t\t\trx_counter.rx_pkt_ok, rx_counter.rx_pkt_crc_error, rx_counter.rx_pkt_drop);\n\n\t}\n\n\tif (bmon == 1) {\n\t\tret = sscanf(input, \"mon=%d\", &bmon);\n\n\t\tif (bmon == 1) {\n\t\t\tpmppriv->rx_bindicatePkt = _TRUE;\n\t\t\tsprintf(extra, \"Indicating Receive Packet to network start\\n\");\n\t\t} else {\n\t\t\tpmppriv->rx_bindicatePkt = _FALSE;\n\t\t\tsprintf(extra, \"Indicating Receive Packet to network Stop\\n\");\n\t\t}\n\t}\n\tif (bSmpCfg == 1) {\n\t\tret = sscanf(input, \"smpcfg=%d\", &bSmpCfg);\n\n\t\tif (bSmpCfg == 1) {\n\t\t\tpmppriv->bRTWSmbCfg = _TRUE;\n\t\t\tsprintf(extra , \"Indicate By Simple Config Format\\n\");\n\t\t\tSetPacketRx(padapter, _TRUE, _TRUE);\n\t\t} else {\n\t\t\tpmppriv->bRTWSmbCfg = _FALSE;\n\t\t\tsprintf(extra , \"Indicate By Normal Format\\n\");\n\t\t\tSetPacketRx(padapter, _TRUE, _FALSE);\n\t\t}\n\t}\n\n\twrqu->length = strlen(extra) + 1;\n\n\treturn 0;\n}\n\n\nint rtw_mp_trx_query(struct net_device *dev,\n\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t struct iw_point *wrqu, char *extra)\n{\n\tu32 txok, txfail, rxok, rxfail, rxfilterout;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tPMPT_CONTEXT\tpMptCtx\t\t=\t&(padapter->mppriv.MptCtx);\n\tRT_PMAC_TX_INFO\tPMacTxInfo\t=\tpMptCtx->PMacTxInfo;\n\n\tif (PMacTxInfo.bEnPMacTx == TRUE)\n\t\t\ttxok = hal_mpt_query_phytxok(padapter);\n\telse\n\t\t\ttxok = padapter->mppriv.tx.sended;\n\n\ttxfail = 0;\n\trxok = padapter->mppriv.rx_pktcount;\n\trxfail = padapter->mppriv.rx_crcerrpktcount;\n\trxfilterout = padapter->mppriv.rx_pktcount_filter_out;\n\n\t_rtw_memset(extra, '\\0', 128);\n\n\tsprintf(extra, \"Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ,Rx Filter out:%d\\n\", txok, txfail, rxok, rxfail, rxfilterout);\n\n\twrqu->length = strlen(extra) + 1;\n\n\treturn 0;\n}\n\n\nint rtw_mp_pwrtrk(struct net_device *dev,\n\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t  struct iw_point *wrqu, char *extra)\n{\n\tu8 enable;\n\tu32 thermal;\n\ts32 ret;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t\t\t*pHalData = GET_HAL_DATA(padapter);\n\tu8\t\tinput[wrqu->length];\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\t_rtw_memset(extra, 0, wrqu->length);\n\n\tenable = 1;\n\tif (wrqu->length > 1) {\n\t\t/* not empty string*/\n\t\tif (strncmp(input, \"stop\", 4) == 0) {\n\t\t\tenable = 0;\n\t\t\tsprintf(extra, \"mp tx power tracking stop\");\n\t\t} else if (sscanf(input, \"ther=%d\", &thermal) == 1) {\n\t\t\tret = SetThermalMeter(padapter, (u8)thermal);\n\t\t\tif (ret == _FAIL)\n\t\t\t\treturn -EPERM;\n\t\t\tsprintf(extra, \"mp tx power tracking start,target value=%d ok\", thermal);\n\t\t} else\n\t\t\treturn -EINVAL;\n\t}\n\n\tret = SetPowerTracking(padapter, enable);\n\tif (ret == _FAIL)\n\t\treturn -EPERM;\n\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\n\nint rtw_mp_psd(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tu8\t\tinput[wrqu->length];\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tstrcpy(extra, input);\n\n\twrqu->length = mp_query_psd(padapter, extra);\n\n\treturn 0;\n}\n\n\nint rtw_mp_thermal(struct net_device *dev,\n\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tu8 val;\n\tint bwrite = 1;\n\n#ifdef CONFIG_RTL8188E\n\tu16 addr = EEPROM_THERMAL_METER_88E;\n#endif\n#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A)\n\tu16 addr = EEPROM_THERMAL_METER_8812;\n#endif\n#ifdef CONFIG_RTL8192E\n\tu16 addr = EEPROM_THERMAL_METER_8192E;\n#endif\n#ifdef CONFIG_RTL8723B\n\tu16 addr = EEPROM_THERMAL_METER_8723B;\n#endif\n#ifdef CONFIG_RTL8703B\n\tu16 addr = EEPROM_THERMAL_METER_8703B;\n#endif\n#ifdef CONFIG_RTL8188F\n\tu16 addr = EEPROM_THERMAL_METER_8188F;\n#endif\n\tu16 cnt = 1;\n\tu16 max_available_size = 0;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\tif (copy_from_user(extra, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tbwrite = strncmp(extra, \"write\", 6);/* strncmp TRUE is 0*/\n\n\tGetThermalMeter(padapter, &val);\n\n\tif (bwrite == 0) {\n\t\t/*DBG_871X(\"to write val:%d\",val);*/\n\t\tEFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);\n\t\tif (2 > max_available_size) {\n\t\t\tDBG_871X(\"no available efuse!\\n\");\n\t\t\treturn -EFAULT;\n\t\t}\n\t\tif (rtw_efuse_map_write(padapter, addr, cnt, &val) == _FAIL) {\n\t\t\tDBG_871X(\"rtw_efuse_map_write error\\n\");\n\t\t\treturn -EFAULT;\n\t\t}\n\t\tsprintf(extra, \" efuse write ok :%d\", val);\n\t} else\n\t\tsprintf(extra, \"%d\", val);\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\n\nint rtw_mp_reset_stats(struct net_device *dev,\n\t\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\tstruct mp_priv *pmp_priv;\n\tstruct pkt_attrib *pattrib;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\tpmp_priv = &padapter->mppriv;\n\n\tpmp_priv->tx.sended = 0;\n\tpmp_priv->tx_pktcount = 0;\n\tpmp_priv->rx_pktcount = 0;\n\tpmp_priv->rx_pktcount_filter_out = 0;\n\tpmp_priv->rx_crcerrpktcount = 0;\n\n\trtw_reset_phy_rx_counters(padapter);\n\trtw_reset_mac_rx_counters(padapter);\n\n\treturn 0;\n}\n\n\nint rtw_mp_dump(struct net_device *dev,\n\t\t\t\tstruct iw_request_info *info,\n\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\tstruct mp_priv *pmp_priv;\n\tstruct pkt_attrib *pattrib;\n\tu32 value;\n\tu8\t\tinput[wrqu->length];\n\tu8 rf_type, path_nums = 0;\n\tu32 i, j = 1, path;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\n\tpmp_priv = &padapter->mppriv;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tif (strncmp(input, \"all\", 4) == 0) {\n\t\tmac_reg_dump(RTW_DBGDUMP, padapter);\n\t\tbb_reg_dump(RTW_DBGDUMP, padapter);\n\t\trf_reg_dump(RTW_DBGDUMP, padapter);\n\t}\n\treturn 0;\n}\n\n\nint rtw_mp_phypara(struct net_device *dev,\n\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t   struct iw_point *wrqu, char *extra)\n{\n\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\tchar\tinput[wrqu->length];\n\tu32\t\tvalxcap, ret;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tDBG_871X(\"%s:iwpriv in=%s\\n\", __func__, input);\n\n\tret = sscanf(input, \"xcap=%d\", &valxcap);\n\n\tpHalData->CrystalCap = (u8)valxcap;\n\thal_set_crystal_cap(padapter , valxcap);\n\n\tsprintf(extra, \"Set xcap=%d\", valxcap);\n\twrqu->length = strlen(extra) + 1;\n\n\treturn 0;\n\n}\n\n\nint rtw_mp_SetRFPath(struct net_device *dev,\n\t\t\t\t\t struct iw_request_info *info,\n\t\t\t\t\t union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar\tinput[wrqu->data.length];\n\tint\t\tbMain = 1, bTurnoff = 1;\n\n\tif (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\tDBG_871X(\"%s:iwpriv in=%s\\n\", __func__, input);\n\n\tbMain = strncmp(input, \"1\", 2); /* strncmp TRUE is 0*/\n\tbTurnoff = strncmp(input, \"0\", 3); /* strncmp TRUE is 0*/\n\n\tif (bMain == 0) {\n\t\tMP_PHY_SetRFPathSwitch(padapter, _TRUE);\n\t\tDBG_871X(\"%s:PHY_SetRFPathSwitch=TRUE\\n\", __func__);\n\t} else if (bTurnoff == 0) {\n\t\tMP_PHY_SetRFPathSwitch(padapter, _FALSE);\n\t\tDBG_871X(\"%s:PHY_SetRFPathSwitch=FALSE\\n\", __func__);\n\t}\n\n\treturn 0;\n}\n\n\nint rtw_mp_QueryDrv(struct net_device *dev,\n\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tchar\tinput[wrqu->data.length];\n\tint\tqAutoLoad = 1;\n\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n\n\tif (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\tDBG_871X(\"%s:iwpriv in=%s\\n\", __func__, input);\n\n\tqAutoLoad = strncmp(input, \"autoload\", 8); /* strncmp TRUE is 0*/\n\n\tif (qAutoLoad == 0) {\n\t\tDBG_871X(\"%s:qAutoLoad\\n\", __func__);\n\n\t\tif (pHalData->bautoload_fail_flag)\n\t\t\tsprintf(extra, \"fail\");\n\t\telse\n\t\t\tsprintf(extra, \"ok\");\n\t}\n\twrqu->data.length = strlen(extra) + 1;\n\treturn 0;\n}\n\n\nint rtw_mp_PwrCtlDM(struct net_device *dev,\n\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\tstruct iw_point *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tu8\t\tinput[wrqu->length];\n\tint\t\tbstart = 1;\n\n\tif (copy_from_user(input, wrqu->pointer, wrqu->length))\n\t\treturn -EFAULT;\n\n\tbstart = strncmp(input, \"start\", 5); /* strncmp TRUE is 0*/\n\tif (bstart == 0) {\n\t\tsprintf(extra, \"PwrCtlDM start\\n\");\n\t\tMPT_PwrCtlDM(padapter, 1);\n\t} else {\n\t\tsprintf(extra, \"PwrCtlDM stop\\n\");\n\t\tMPT_PwrCtlDM(padapter, 0);\n\t}\n\twrqu->length = strlen(extra);\n\n\treturn 0;\n}\n\n\nint rtw_mp_getver(struct net_device *dev,\n\t\t\t\t  struct iw_request_info *info,\n\t\t\t\t  union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tstruct mp_priv *pmp_priv;\n\n\tpmp_priv = &padapter->mppriv;\n\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\n\tsprintf(extra, \"rtwpriv=%d\\n\", RTWPRIV_VER_INFO);\n\twrqu->data.length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_mp_mon(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\tNDIS_802_11_NETWORK_INFRASTRUCTURE networkType;\n\tint bstart = 1, bstop = 1;\n\t\n\tnetworkType = Ndis802_11Infrastructure;\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\n\trtw_pm_set_ips(padapter, IPS_NONE);\n\tLeaveAllPowerSaveMode(padapter);\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (init_mp_priv(padapter) == _FAIL)\n\t\tDBG_871X(\"%s: initialize MP private data Fail!\\n\", __func__);\n\tpadapter->mppriv.channel = 6;\n\n\tbstart = strncmp(extra, \"start\", 5); /* strncmp TRUE is 0*/\n\tbstop = strncmp(extra, \"stop\", 4); /* strncmp TRUE is 0*/\n\tif (bstart == 0) {\n\t\tmp_join(padapter, WIFI_FW_ADHOC_STATE);\n\t\tSetPacketRx(padapter, _TRUE, _FALSE);\n\t\tSetChannel(padapter);\n\t\tpmp_priv->rx_bindicatePkt = _TRUE;\n\t\tpmp_priv->bRTWSmbCfg = _TRUE;\n\t\tsprintf(extra, \"monitor mode start\\n\");\n\t} else if (bstop == 0) {\n\t\tSetPacketRx(padapter, _FALSE, _FALSE);\n\t\tpmp_priv->rx_bindicatePkt = _FALSE;\n\t\tpmp_priv->bRTWSmbCfg = _FALSE;\n\t\tpadapter->registrypriv.mp_mode = 1;\n\t\tpHalFunc->hal_deinit(padapter);\n\t\tpadapter->registrypriv.mp_mode = 0;\n\t\tpHalFunc->hal_init(padapter);\n\t\t/*rtw_disassoc_cmd(padapter, 0, _TRUE);*/\n\t\tif (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\n\t\t\trtw_disassoc_cmd(padapter, 500, _TRUE);\n\t\t\trtw_indicate_disconnect(padapter);\n\t\t\t/*rtw_free_assoc_resources(padapter, 1);*/\n\t\t}\n\t\trtw_pm_set_ips(padapter, IPS_NORMAL);\n\t\tsprintf(extra, \"monitor mode Stop\\n\");\n\t}\n#endif\n\twrqu->data.length = strlen(extra);\n\treturn 0;\n}\n\nint rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra)\n{\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tPMPT_CONTEXT\t\tpMptCtx = &(padapter->mppriv.MptCtx);\n\n\t\tswitch (pmp_priv->mode) {\n\n\t\tcase MP_PACKET_TX:\n\t\t\t\t\t\tif (bStartTest == 0) {\n\t\t\t\t\t\t\tpmp_priv->tx.stop = 1;\n\t\t\t\t\t\t\tpmp_priv->mode = MP_ON;\n\t\t\t\t\t\t\tsprintf(extra, \"Stop continuous Tx\");\n\t\t\t\t\t\t} else if (pmp_priv->tx.stop == 1) {\n\t\t\t\t\t\t\tsprintf(extra, \"%s\\nStart continuous DA=ffffffffffff len=1500 count=%u\\n\", extra, pmp_priv->tx.count);\n\t\t\t\t\t\t\tpmp_priv->tx.stop = 0;\n\t\t\t\t\t\t\tSetPacketTx(padapter);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn -EFAULT;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 0;\n\t\tcase MP_SINGLE_TONE_TX:\n\t\t\t\t\t\tif (bStartTest != 0)\n\t\t\t\t\t\t\tsprintf(extra, \"%s\\nStart continuous DA=ffffffffffff len=1500\\n infinite=yes.\", extra);\n\t\t\t\t\t\tSetSingleToneTx(padapter, (u8)bStartTest);\n\t\t\t\t\t\tbreak;\n\t\tcase MP_CONTINUOUS_TX:\n\t\t\t\t\t\tif (bStartTest != 0)\n\t\t\t\t\t\t\tsprintf(extra, \"%s\\nStart continuous DA=ffffffffffff len=1500\\n infinite=yes.\", extra);\n\t\t\t\t\t\tSetContinuousTx(padapter, (u8)bStartTest);\n\t\t\t\t\t\tbreak;\n\t\tcase MP_CARRIER_SUPPRISSION_TX:\n\t\t\t\t\t\tif (bStartTest != 0) {\n\t\t\t\t\t\t\tif (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M)\n\t\t\t\t\t\t\t\tsprintf(extra, \"%s\\nStart continuous DA=ffffffffffff len=1500\\n infinite=yes.\", extra);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsprintf(extra, \"%s\\nSpecify carrier suppression but not CCK rate\", extra);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tSetCarrierSuppressionTx(padapter, (u8)bStartTest);\n\t\t\t\t\t\tbreak;\n\t\tcase MP_SINGLE_CARRIER_TX:\n\t\t\t\t\tif (bStartTest != 0)\n\t\t\t\t\t\t\tsprintf(extra, \"%s\\nStart continuous DA=ffffffffffff len=1500\\n infinite=yes.\", extra);\n\t\t\t\t\t\tSetSingleCarrierTx(padapter, (u8)bStartTest);\n\t\t\t\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t\t\t\tsprintf(extra, \"Error! Continuous-Tx is not on-going.\");\n\t\t\t\t\t\treturn -EFAULT;\n\t\t}\n\n\t\tif (bStartTest == 1 && pmp_priv->mode != MP_ON) {\n\t\t\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\n\t\t\tif (pmp_priv->tx.stop == 0) {\n\t\t\t\tpmp_priv->tx.stop = 1;\n\t\t\t\trtw_msleep_os(5);\n\t\t\t}\n#ifdef CONFIG_80211N_HT\n\t\t\tpmp_priv->tx.attrib.ht_en = 1;\n#endif\n\t\t\tpmp_priv->tx.stop = 0;\n\t\t\tpmp_priv->tx.count = 1;\n\t\t\tSetPacketTx(padapter);\n\t\t} else\n\t\t\tpmp_priv->mode = MP_ON;\n\n#if defined(CONFIG_RTL8812A)\n\t\t\tif (IS_HARDWARE_TYPE_8812AU(padapter)) {\n\t\t\t\t/* <20130425, Kordan> Turn off OFDM Rx to prevent from CCA causing Tx hang.*/\n\t\t\t\tif (pmp_priv->mode == MP_PACKET_TX)\n\t\t\t\t\tPHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 1);\n\t\t\t\telse\n\t\t\t\t\tPHY_SetBBReg(padapter, rCCAonSec_Jaguar, BIT3, 0);\n\t\t\t}\n#endif\n\n\treturn 0;\n}\n\n\nint rtw_mp_tx(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu, char *extra)\n{\n\t\tPADAPTER padapter = rtw_netdev_priv(dev);\n\t\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\t\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\t\tPMPT_CONTEXT\t\tpMptCtx = &(padapter->mppriv.MptCtx);\n\t\tstruct registry_priv\t*pregistrypriv = &padapter->registrypriv;\n\n\t\tu32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0;\n\t\tu8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0;\n\t\tu16 antenna = 0;\n\n\t\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\t\treturn -EFAULT;\n\t\tDBG_871X(\"extra = %s\\n\", extra);\n\n\t\tif (strncmp(extra, \"stop\", 3) == 0) {\n\t\t\tbStartTest = 0; /* To set Stop*/\n\t\t\tpmp_priv->tx.stop = 1;\n\t\t\tsprintf(extra, \"Stop continuous Tx\");\n\t\t\tstatus = rtw_mp_pretx_proc(padapter, bStartTest, extra);\n\t\t\twrqu->data.length = strlen(extra);\n\t\t\treturn status;\n\t\t} else if (strncmp(extra, \"count\", 5) == 0) {\n\t\t\t\tif (sscanf(extra, \"count=%d\", &count) < 1)\n\t\t\t\t\tDBG_871X(\"Got Count=%d]\\n\", count);\n\t\t\t\tpmp_priv->tx.count = count;\n\t\t\t\treturn 0;\n\t\t} else if (strncmp(extra, \"setting\", 7) == 0) {\n\t\t\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\t\t\tsprintf(extra, \"Current Setting :\\n Channel:%d\", pmp_priv->channel);\n\t\t\t\tsprintf(extra, \"%s\\n Bandwidth:%d\", extra, pmp_priv->bandwidth);\n\t\t\t\tsprintf(extra, \"%s\\n Rate index:%d\", extra, pmp_priv->rateidx);\n\t\t\t\tsprintf(extra, \"%s\\n TxPower index:%d\", extra, pmp_priv->txpoweridx);\n\t\t\t\tsprintf(extra, \"%s\\n Antenna TxPath:%d\", extra, pmp_priv->antenna_tx);\n\t\t\t\tsprintf(extra, \"%s\\n Antenna RxPath:%d\", extra, pmp_priv->antenna_rx);\n\t\t\t\tsprintf(extra, \"%s\\n MP Mode:%d\", extra, pmp_priv->mode);\n\t\t\t\twrqu->data.length = strlen(extra);\n\t\t\t\treturn 0;\n#ifdef CONFIG_MP_VHT_HW_TX_MODE\n\t\t} else if (strncmp(extra, \"pmact\", 5) == 0) {\n\t\t\t\tif (strncmp(extra, \"pmact=\", 6) == 0) {\n\t\t\t\t\t_rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(pMptCtx->PMacTxInfo));\n\t\t\t\t\tif (strncmp(extra, \"pmact=start\", 11) == 0) {\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.bEnPMacTx = _TRUE;\n\t\t\t\t\t\tsprintf(extra, \"Set PMac Tx Mode start\\n\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.bEnPMacTx = _FALSE;\n\t\t\t\t\t\tsprintf(extra, \"Set PMac Tx Mode Stop\\n\");\n\t\t\t\t\t}\n\t\t\t\t\tif (pMptCtx->bldpc == TRUE)\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.bLDPC = _TRUE;\n\n\t\t\t\t\tif (pMptCtx->bstbc == TRUE)\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.bSTBC = _TRUE;\n\n\t\t\t\t\tpMptCtx->PMacTxInfo.bSPreamble = pmp_priv->preamble;\n\t\t\t\t\tpMptCtx->PMacTxInfo.bSGI = pmp_priv->preamble;\n\t\t\t\t\tpMptCtx->PMacTxInfo.BandWidth = pmp_priv->bandwidth;\n\t\t\t\t\tpMptCtx->PMacTxInfo.TX_RATE = HwRateToMPTRate(pmp_priv->rateidx);\n\n\t\t\t\t\tpMptCtx->PMacTxInfo.Mode = pMptCtx->HWTxmode;\n\n\t\t\t\t\tpMptCtx->PMacTxInfo.NDP_sound = FALSE;/*(Adapter.PacketType == NDP_PKT)?TRUE:FALSE;*/\n\n\t\t\t\t\tif (padapter->mppriv.pktInterval == 0)\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.PacketPeriod = 100;\n\t\t\t\t\telse\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.PacketPeriod = padapter->mppriv.pktInterval;\n\n\t\t\t\t\tif (padapter->mppriv.pktLength < 1000)\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.PacketLength = 1000;\n\t\t\t\t\telse\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.PacketLength = padapter->mppriv.pktLength;\n\n\t\t\t\t\tpMptCtx->PMacTxInfo.PacketPattern  = rtw_random32() % 0xFF;\n\n\t\t\t\t\tif (padapter->mppriv.tx_pktcount != 0)\n\t\t\t\t\t\tpMptCtx->PMacTxInfo.PacketCount = padapter->mppriv.tx_pktcount;\n\n\t\t\t\t\tpMptCtx->PMacTxInfo.Ntx = 0;\n\t\t\t\t\tfor (Idx = 16; Idx < 20; Idx++) {\n\t\t\t\t\t\ttmpU1B = (padapter->mppriv.antenna_tx >> Idx) & 1;\n\t\t\t\t\t\tif (tmpU1B)\n\t\t\t\t\t\t\tpMptCtx->PMacTxInfo.Ntx++;\n\t\t\t\t\t}\n\n\t\t\t\t\t_rtw_memset(pMptCtx->PMacTxInfo.MacAddress, 0xFF, ETH_ALEN);\n\n\t\t\t\t\tPMAC_Get_Pkt_Param(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\n\t\t\t\t\tif (MPT_IS_CCK_RATE(pMptCtx->PMacTxInfo.TX_RATE)) {\n\n\t\t\t\t\t\tCCK_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tPMAC_Nsym_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\t\t\t\t\t\t/* 24 BIT*/\n\t\t\t\t\t\tL_SIG_generator(pMptCtx->PMacPktInfo.N_sym, &pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\t\t\t\t\t}\n\t\t\t\t\t/*\t48BIT*/\n\t\t\t\t\tif (MPT_IS_HT_RATE(pMptCtx->PMacTxInfo.TX_RATE))\n\t\t\t\t\t\tHT_SIG_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\t\t\t\t\telse if (MPT_IS_VHT_RATE(pMptCtx->PMacTxInfo.TX_RATE)) {\n\t\t\t\t\t\t/*\t48BIT*/\n\t\t\t\t\t\tVHT_SIG_A_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo);\n\n\t\t\t\t\t\t/*\t26/27/29 BIT  & CRC 8 BIT*/\n\t\t\t\t\t\tVHT_SIG_B_generator(&pMptCtx->PMacTxInfo);\n\n\t\t\t\t\t\t/* 32 BIT*/\n\t\t\t\t\t\tVHT_Delimiter_generator(&pMptCtx->PMacTxInfo);\n\t\t\t\t\t}\n\n\t\t\t\t\tmpt_ProSetPMacTx(padapter);\n\n\t\t\t\t} else if (strncmp(extra, \"pmact,mode=\", 11) == 0) {\n\t\t\t\t\t\tint txmode = 0;\n\n\t\t\t\t\t\tif (sscanf(extra, \"pmact,mode=%d\", &txmode) > 0) {\n\t\t\t\t\t\t\tif (txmode == 1) {\n\t\t\t\t\t\t\t\tpMptCtx->HWTxmode = CONTINUOUS_TX;\n\t\t\t\t\t\t\t\tsprintf(extra, \"\\t Config HW Tx mode = CONTINUOUS_TX\\n\");\n\t\t\t\t\t\t\t} else if (txmode == 2) {\n\t\t\t\t\t\t\t\tpMptCtx->HWTxmode = OFDM_Single_Tone_TX;\n\t\t\t\t\t\t\t\tsprintf(extra, \"\\t Config HW Tx mode = OFDM_Single_Tone_TX\\n\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpMptCtx->HWTxmode = PACKETS_TX;\n\t\t\t\t\t\t\t\tsprintf(extra, \"\\t Config HW Tx mode = PACKETS_TX\\n\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpMptCtx->HWTxmode = PACKETS_TX;\n\t\t\t\t\t\t\tsprintf(extra, \"\\t Config HW Tx mode=\\n 0 = PACKETS_TX\\n 1 = CONTINUOUS_TX\\n 2 = OFDM_Single_Tone_TX\");\n\t\t\t\t\t\t}\n\t\t\t\t} else if (strncmp(extra, \"pmact,\", 6) == 0) {\n\t\t\t\t\tint PacketPeriod = 0, PacketLength = 0, PacketCout = 0;\n\t\t\t\t\tint bldpc = 0, bstbc = 0;\n\n\t\t\t\t\tif (sscanf(extra, \"pmact,period=%d\", &PacketPeriod) > 0) {\n\t\t\t\t\t\t\tpadapter->mppriv.pktInterval = PacketPeriod;\n\t\t\t\t\t\t\tDBG_871X(\"PacketPeriod=%d\\n\", padapter->mppriv.pktInterval);\n\t\t\t\t\t\t\tsprintf(extra, \"PacketPeriod [1~255]= %d\\n\", padapter->mppriv.pktInterval);\n\n\t\t\t\t\t} else if (sscanf(extra, \"pmact,length=%d\", &PacketLength) > 0) {\n\t\t\t\t\t\t\tpadapter->mppriv.pktLength = PacketLength;\n\t\t\t\t\t\t\tDBG_871X(\"PacketPeriod=%d\\n\", padapter->mppriv.pktLength);\n\t\t\t\t\t\t\tsprintf(extra, \"PacketLength[~65535]=%d\\n\", padapter->mppriv.pktLength);\n\n\t\t\t\t\t} else if (sscanf(extra, \"pmact,count=%d\", &PacketCout) > 0) {\n\t\t\t\t\t\t\tpadapter->mppriv.tx_pktcount = PacketCout;\n\t\t\t\t\t\t\tDBG_871X(\"Packet Cout =%d\\n\", padapter->mppriv.tx_pktcount);\n\t\t\t\t\t\t\tsprintf(extra, \"Packet Cout =%d\\n\", padapter->mppriv.tx_pktcount);\n\n\t\t\t\t\t} else if (sscanf(extra, \"pmact,ldpc=%d\", &bldpc) > 0) {\n\t\t\t\t\t\t\tpMptCtx->bldpc = bldpc;\n\t\t\t\t\t\t\tDBG_871X(\"Set LDPC =%d\\n\", pMptCtx->bldpc);\n\t\t\t\t\t\t\tsprintf(extra, \"Set LDPC =%d\\n\", pMptCtx->bldpc);\n\n\t\t\t\t\t} else if (sscanf(extra, \"pmact,stbc=%d\", &bstbc) > 0) {\n\t\t\t\t\t\t\tpMptCtx->bstbc = bstbc;\n\t\t\t\t\t\t\tDBG_871X(\"Set STBC =%d\\n\", pMptCtx->bstbc);\n\t\t\t\t\t\t\tsprintf(extra, \"Set STBC =%d\\n\", pMptCtx->bstbc);\n\t\t\t\t\t} else\n\t\t\t\t\t\tsprintf(extra, \"\\n period={1~255}\\n length={1000~65535}\\n count={0~}\\n ldpc={0/1}\\n stbc={0/1}\");\n\n\t\t\t\t}\n\n\t\t\t\twrqu->data.length = strlen(extra);\n\t\t\t\treturn 0;\n#endif\n\t\t} else {\n\n\t\t\tif (sscanf(extra, \"ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) {\n\t\t\t\t\tDBG_871X(\"Invalid format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\\n\", channel, bandwidth, rate, txpower, ant, txmode);\n\t\t\t\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\t\t\t\tsprintf(extra, \"\\n Please input correct format as bleow:\\n\");\n\t\t\t\t\tsprintf(extra, \"%s\\t ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d\\n\", extra, channel, bandwidth, rate, txpower, ant, txmode);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ ch : BGN = <1~14> , A or AC = <36~165> ]\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ rate :\tCCK: 1 2 5.5 11M X 2 = < 2 4 11 22 >]\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [\t\tOFDM: 6 9 12 18 24 36 48 54M X 2 = < 12 18 24 36 48 72 96 108>\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [\t\tHT 1S2SS MCS0 ~ MCS15 : < [MCS0]=128 ~ [MCS7]=135 ~ [MCS15]=143 >\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [\t\tHT 3SS MCS16 ~ MCS32 : < [MCS16]=144 ~ [MCS23]=151 ~ [MCS32]=159 >\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [\t\tVHT 1SS MCS0 ~ MCS9 : < [MCS0]=160 ~ [MCS9]=169 >\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ txpower : 1~63 power index\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12\", extra);\n\t\t\t\t\tsprintf(extra, \"%s\\n [ txmode : < 0 = CONTINUOUS_TX, 1 = PACKET_TX, 2 = SINGLE_TONE_TX, 3 = CARRIER_SUPPRISSION_TX, 4 = SINGLE_CARRIER_TX>\\n\", extra);\n\t\t\t\t\twrqu->data.length = strlen(extra);\n\t\t\t\t\treturn status;\n\n\t\t\t} else {\n\t\t\t\tDBG_871X(\"Got format [ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d]\\n\", channel, bandwidth, rate, txpower, ant, txmode);\n\t\t\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\t\t\tsprintf(extra, \"Change Current channel %d to channel %d\", padapter->mppriv.channel , channel);\n\t\t\t\tpadapter->mppriv.channel = channel;\n\t\t\t\tSetChannel(padapter);\n\t\t\t\tpHalData->CurrentChannel = channel;\n\n\t\t\t\tif (bandwidth == 1)\n\t\t\t\t\tbandwidth = CHANNEL_WIDTH_40;\n\t\t\t\telse if (bandwidth == 2)\n\t\t\t\t\tbandwidth = CHANNEL_WIDTH_80;\n\t\t\t\tsprintf(extra, \"%s\\nChange Current Bandwidth %d to Bandwidth %d\", extra, padapter->mppriv.bandwidth , bandwidth);\n\t\t\t\tpadapter->mppriv.bandwidth = (u8)bandwidth;\n\t\t\t\tpadapter->mppriv.preamble = sg;\n\t\t\t\tSetBandwidth(padapter);\n\t\t\t\tpHalData->CurrentChannelBW = bandwidth;\n\n\t\t\t\tsprintf(extra, \"%s\\nSet power level :%d\", extra, txpower);\n\t\t\t\tpadapter->mppriv.txpoweridx = (u8)txpower;\n\t\t\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)txpower;\n\t\t\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_B] = (u8)txpower;\n\t\t\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_C] = (u8)txpower;\n\t\t\t\tpMptCtx->TxPwrLevel[ODM_RF_PATH_D]  = (u8)txpower;\n\n\t\t\t\tDBG_871X(\"%s: bw=%d sg=%d\\n\", __func__, bandwidth, sg);\n\n\t\t\t\tif (rate <= 0x7f)\n\t\t\t\t\trate = wifirate2_ratetbl_inx((u8)rate);\n\t\t\t\telse if (rate < 0xC8)\n\t\t\t\t\trate = (rate - 0x80 + MPT_RATE_MCS0);\n\t\t\t\t\t/*HT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159\n\t\t\t\t\tVHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179\n\t\t\t\t\tVHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199\n\t\t\t\t\telse\n\t\t\t\t\tVHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153\n\t\t\t\t\trate =(rate - MPT_RATE_VHT1SS_MCS0);\n\t\t\t\t\t*/\n\t\t\t\tDBG_871X(\"%s: rate index=%d\\n\", __func__, rate);\n\t\t\t\tif (rate >= MPT_RATE_LAST)\n\t\t\t\t\treturn -EINVAL;\n\t\t\t\tsprintf(extra, \"%s\\nSet data rate to %d index %d\", extra, padapter->mppriv.rateidx, rate);\n\n\t\t\t\tpadapter->mppriv.rateidx = rate;\n\t\t\t\tpMptCtx->MptRateIndex = rate;\n\t\t\t\tSetDataRate(padapter);\n\n\t\t\t\tsprintf(extra, \"%s\\nSet Antenna Path :%d\",  extra, ant);\n\t\t\t\tswitch (ant) {\n\t\t\t\tcase 1:\n\t\t\t\t\tantenna = ANTENNA_A;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tantenna = ANTENNA_B;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tantenna = ANTENNA_C;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\tantenna = ANTENNA_D;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tantenna = ANTENNA_AB;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\tantenna = ANTENNA_AC;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9:\n\t\t\t\t\tantenna = ANTENNA_AD;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\t\tantenna = ANTENNA_BC;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 10:\n\t\t\t\t\tantenna = ANTENNA_BD;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 12:\n\t\t\t\t\tantenna = ANTENNA_CD;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 7:\n\t\t\t\t\tantenna = ANTENNA_ABC;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 14:\n\t\t\t\t\tantenna = ANTENNA_BCD;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 11:\n\t\t\t\t\tantenna = ANTENNA_ABD;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 15:\n\t\t\t\t\tantenna = ANTENNA_ABCD;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tDBG_871X(\"%s: antenna=0x%x\\n\", __func__, antenna);\n\t\t\t\tpadapter->mppriv.antenna_tx = antenna;\n\t\t\t\tpadapter->mppriv.antenna_rx = antenna;\n\t\t\t\tpHalData->AntennaTxPath = antenna;\n\t\t\t\tSetAntenna(padapter);\n\n\t\t\t\tif (txmode == 0) {\n\t\t\t\t\tpmp_priv->mode = MP_CONTINUOUS_TX;\n\t\t\t\t} else if (txmode == 1) {\n\t\t\t\t\tpmp_priv->mode = MP_PACKET_TX;\n\t\t\t\t\tpmp_priv->tx.count = count;\n\t\t\t\t} else if (txmode == 2) {\n\t\t\t\t\tpmp_priv->mode = MP_SINGLE_TONE_TX;\n\t\t\t\t} else if (txmode == 3) {\n\t\t\t\t\tpmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;\n\t\t\t\t} else if (txmode == 4) {\n\t\t\t\t\tpmp_priv->mode = MP_SINGLE_CARRIER_TX;\n\t\t\t\t}\n\n\t\t\tstatus = rtw_mp_pretx_proc(padapter, bStartTest, extra);\n\t\t\t}\n\n\t\t}\n\n\t\twrqu->data.length = strlen(extra);\n\t\treturn status;\n}\n\n\nint rtw_mp_rx(struct net_device *dev,\n\t\t\t   struct iw_request_info *info,\n\t\t\t   union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData\t= GET_HAL_DATA(padapter);\n\tstruct mp_priv *pmp_priv = &padapter->mppriv;\n\tPMPT_CONTEXT\t\tpMptCtx = &(padapter->mppriv.MptCtx);\n\n\tu32 bandwidth = 0, sg = 0, channel = 6, ant = 0;\n\tu16 antenna = 0;\n\tu8 bStartRx = 0;\n\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\t\treturn -EFAULT;\n\n\tif (strncmp(extra, \"stop\", 4) == 0) {\n\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\tSetPacketRx(padapter, bStartRx, _FALSE);\n\t\tpmp_priv->bmac_filter = _FALSE;\n\t\tsprintf(extra, \"Received packet OK:%d CRC error:%d ,Filter out:%d\", padapter->mppriv.rx_pktcount, padapter->mppriv.rx_crcerrpktcount, padapter->mppriv.rx_pktcount_filter_out);\n\t\twrqu->data.length = strlen(extra);\n\t\treturn 0;\n\n\t} else if (sscanf(extra, \"ch=%d,bw=%d,ant=%d\", &channel, &bandwidth, &ant) < 3) {\n\t\tDBG_871X(\"Invalid format [ch=%d,bw=%d,ant=%d]\\n\", channel, bandwidth, ant);\n\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\tsprintf(extra, \"\\n Please input correct format as bleow:\\n\");\n\t\tsprintf(extra, \"%s\\t ch=%d,bw=%d,ant=%d\\n\", extra, channel, bandwidth, ant);\n\t\tsprintf(extra, \"%s\\n [ ch : BGN = <1~14> , A or AC = <36~165> ]\", extra);\n\t\tsprintf(extra, \"%s\\n [ bw : Bandwidth: 0 = 20M, 1 = 40M, 2 = 80M ]\", extra);\n\t\tsprintf(extra, \"%s\\n [ ant : <A = 1, B = 2, C = 4, D = 8> ,2T ex: AB=3 BC=6 CD=12\", extra);\n\t\twrqu->data.length = strlen(extra);\n\t\treturn 0;\n\n\t} else {\n\t\tbStartRx = 1;\n\t\tDBG_871X(\"Got format [ch=%d,bw=%d,ant=%d]\\n\", channel, bandwidth, ant);\n\t\t_rtw_memset(extra, 0, wrqu->data.length);\n\t\tsprintf(extra, \"Change Current channel %d to channel %d\", padapter->mppriv.channel , channel);\n\t\tpadapter->mppriv.channel = channel;\n\t\tSetChannel(padapter);\n\t\tpHalData->CurrentChannel = channel;\n\n\t\tif (bandwidth == 1)\n\t\t\tbandwidth = CHANNEL_WIDTH_40;\n\t\telse if (bandwidth == 2)\n\t\t\tbandwidth = CHANNEL_WIDTH_80;\n\t\tsprintf(extra, \"%s\\nChange Current Bandwidth %d to Bandwidth %d\", extra, padapter->mppriv.bandwidth , bandwidth);\n\t\tpadapter->mppriv.bandwidth = (u8)bandwidth;\n\t\tpadapter->mppriv.preamble = sg;\n\t\tSetBandwidth(padapter);\n\t\tpHalData->CurrentChannelBW = bandwidth;\n\n\t\tsprintf(extra, \"%s\\nSet Antenna Path :%d\",  extra, ant);\n\t\tswitch (ant) {\n\t\tcase 1:\n\t\t\tantenna = ANTENNA_A;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tantenna = ANTENNA_B;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tantenna = ANTENNA_C;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tantenna = ANTENNA_D;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tantenna = ANTENNA_AB;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tantenna = ANTENNA_AC;\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\tantenna = ANTENNA_AD;\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tantenna = ANTENNA_BC;\n\t\t\tbreak;\n\t\tcase 10:\n\t\t\tantenna = ANTENNA_BD;\n\t\t\tbreak;\n\t\tcase 12:\n\t\t\tantenna = ANTENNA_CD;\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tantenna = ANTENNA_ABC;\n\t\t\tbreak;\n\t\tcase 14:\n\t\t\tantenna = ANTENNA_BCD;\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\tantenna = ANTENNA_ABD;\n\t\t\tbreak;\n\t\tcase 15:\n\t\t\tantenna = ANTENNA_ABCD;\n\t\t\tbreak;\n\t\t}\n\t\tDBG_871X(\"%s: antenna=0x%x\\n\", __func__, antenna);\n\t\tpadapter->mppriv.antenna_tx = antenna;\n\t\tpadapter->mppriv.antenna_rx = antenna;\n\t\tpHalData->AntennaTxPath = antenna;\n\t\tSetAntenna(padapter);\n\n\t\tsprintf(extra, \"%s\\nstart Rx\", extra);\n\t\tSetPacketRx(padapter, bStartRx, _FALSE);\n\t}\n\twrqu->data.length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_efuse_mask_file(struct net_device *dev,\n\t\t\t\t\t\tstruct iw_request_info *info,\n\t\t\t\t\t\tunion iwreq_data *wrqu, char *extra)\n{\n\tchar *rtw_efuse_mask_file_path;\n\tu8 Status;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\t\n\t_rtw_memset(maskfileBuffer, 0x00, sizeof(maskfileBuffer));\n\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\n\tif (strncmp(extra, \"off\", 3) == 0 && strlen(extra) < 4) {\n\t\tpadapter->registrypriv.boffefusemask = 1;\n\t\tsprintf(extra, \"Turn off Efuse Mask\\n\");\n\t\twrqu->data.length = strlen(extra);\n\t\treturn 0;\n\t}\n\tif (strncmp(extra, \"on\", 2) == 0 && strlen(extra) < 3) {\n\t\tpadapter->registrypriv.boffefusemask = 0;\n\t\tsprintf(extra, \"Turn on Efuse Mask\\n\");\n\t\twrqu->data.length = strlen(extra);\n\t\treturn 0;\n\t}\n\trtw_efuse_mask_file_path = extra;\n\n\tif (rtw_is_file_readable(rtw_efuse_mask_file_path) == _TRUE) {\n\t\tDBG_871X(\"%s do rtw_efuse_mask_file_read = %s! ,sizeof maskfileBuffer %zu\\n\", __func__, rtw_efuse_mask_file_path, sizeof(maskfileBuffer));\n\t\tStatus = rtw_efuse_file_read(padapter, rtw_efuse_mask_file_path, maskfileBuffer, sizeof(maskfileBuffer));\n\t\tif (Status == _TRUE)\n\t\t\tpadapter->registrypriv.bFileMaskEfuse = _TRUE;\n\t\tsprintf(extra, \"efuse mask file read OK\\n\");\n\t} else {\n\t\tpadapter->registrypriv.bFileMaskEfuse = _FALSE;\n\t\tsprintf(extra, \"efuse mask file readable FAIL\\n\");\n\t\tDBG_871X(\"%s rtw_is_file_readable fail!\\n\", __func__);\n\t}\n\twrqu->data.length = strlen(extra);\n\treturn 0;\n}\n\n\nint rtw_efuse_file_map(struct net_device *dev,\n\t\t\t\t\t   struct iw_request_info *info,\n\t\t\t\t\t   union iwreq_data *wrqu, char *extra)\n{\n\tchar *rtw_efuse_file_map_path;\n\tu8 Status;\n\tPEFUSE_HAL pEfuseHal;\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\n\tpEfuseHal = &pHalData->EfuseHal;\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\n\trtw_efuse_file_map_path = extra;\n\n\tif (rtw_is_file_readable(rtw_efuse_file_map_path) == _TRUE) {\n\t\tDBG_871X(\"%s do rtw_efuse_mask_file_read = %s!\\n\", __func__, rtw_efuse_file_map_path);\n\t\tStatus = rtw_efuse_file_read(padapter, rtw_efuse_file_map_path, pEfuseHal->fakeEfuseModifiedMap, sizeof(pEfuseHal->fakeEfuseModifiedMap));\n\t\tif (Status == _TRUE)\n\t\t\tsprintf(extra, \"efuse file file_read OK\\n\");\n\t\telse\n\t\t\tsprintf(extra, \"efuse file file_read FAIL\\n\");\n\t} else {\n\t\tsprintf(extra, \"efuse file readable FAIL\\n\");\n\t\tDBG_871X(\"%s rtw_is_file_readable fail!\\n\", __func__);\n\t}\n\twrqu->data.length = strlen(extra);\n\treturn 0;\n}\n\n#if defined(CONFIG_RTL8723B)\nint rtw_mp_SetBT(struct net_device *dev,\n\t\t\t\t struct iw_request_info *info,\n\t\t\t\t union iwreq_data *wrqu, char *extra)\n{\n\tPADAPTER padapter = rtw_netdev_priv(dev);\n\tstruct hal_ops *pHalFunc = &padapter->HalFunc;\n\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\n\tBT_REQ_CMD\tBtReq;\n\tPMPT_CONTEXT\tpMptCtx = &(padapter->mppriv.MptCtx);\n\tPBT_RSP_CMD\tpBtRsp = (PBT_RSP_CMD)&pMptCtx->mptOutBuf[0];\n\tchar\tinput[128];\n\tchar *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00};\n\tu8 setdata[100];\n\tu8 resetbt = 0x00;\n\tu8 tempval, BTStatus;\n\tu8 H2cSetbtmac[6];\n\tu8 u1H2CBtMpOperParm[4] = {0x01};\n\tint testmode = 1, ready = 1, trxparam = 1, setgen = 1, getgen = 1, testctrl = 1, testbt = 1, readtherm = 1, setbtmac = 1;\n\tu32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, status = 0;\n\tPRT_MP_FIRMWARE pBTFirmware = NULL;\n\n\tif (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))\n\t\treturn -EFAULT;\n\tif (strlen(extra) < 1)\n\t\treturn -EFAULT;\n\n\tDBG_871X(\"%s:iwpriv in=%s\\n\", __func__, extra);\n\tready = strncmp(extra, \"ready\", 5);\n\ttestmode = strncmp(extra, \"testmode\", 8); /* strncmp TRUE is 0*/\n\ttrxparam = strncmp(extra, \"trxparam\", 8);\n\tsetgen = strncmp(extra, \"setgen\", 6);\n\tgetgen = strncmp(extra, \"getgen\", 6);\n\ttestctrl = strncmp(extra, \"testctrl\", 8);\n\ttestbt = strncmp(extra, \"testbt\", 6);\n\treadtherm = strncmp(extra, \"readtherm\", 9);\n\tsetbtmac = strncmp(extra, \"setbtmac\", 8);\n\n\tif (strncmp(extra, \"dlbt\", 4) == 0) {\n\t\tpHalData->LastHMEBoxNum = 0;\n\t\tpadapter->bBTFWReady = _FALSE;\n\t\trtw_write8(padapter, 0xa3, 0x05);\n\t\tBTStatus = rtw_read8(padapter, 0xa0);\n\t\tDBG_871X(\"%s: btwmap before read 0xa0 BT Status =0x%x\\n\", __func__, BTStatus);\n\t\tif (BTStatus != 0x04) {\n\t\t\tsprintf(extra, \"BT Status not Active DLFW FAIL\\n\");\n\t\t\tgoto exit;\n\t\t}\n\n\t\ttempval = rtw_read8(padapter, 0x6B);\n\t\ttempval |= BIT7;\n\t\trtw_write8(padapter, 0x6B, tempval);\n\n\t\t/* Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay*/\n\t\t/* So don't write 0x6A[14]=1 and 0x6A[15]=0 together!*/\n\t\trtw_usleep_os(100);\n\t\t/* disable BT power cut*/\n\t\t/* 0x6A[14] = 0*/\n\t\ttempval = rtw_read8(padapter, 0x6B);\n\t\ttempval &= ~BIT6;\n\t\trtw_write8(padapter, 0x6B, tempval);\n\t\trtw_usleep_os(100);\n\t\tMPT_PwrCtlDM(padapter, 0);\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));\n\t\trtw_msleep_os(600);\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));\n\t\trtw_msleep_os(1200);\n\t\tpBTFirmware = (PRT_MP_FIRMWARE)rtw_zmalloc(sizeof(RT_MP_FIRMWARE));\n\t\tif (pBTFirmware == NULL)\n\t\t\tgoto exit;\n\t\tpadapter->bBTFWReady = _FALSE;\n\t\tFirmwareDownloadBT(padapter, pBTFirmware);\n\t\tif (pBTFirmware)\n\t\t\trtw_mfree((u8 *)pBTFirmware, sizeof(RT_MP_FIRMWARE));\n\n\t\tDBG_871X(\"Wait for FirmwareDownloadBT fw boot!\\n\");\n\t\trtw_msleep_os(2000);\n\t\t_rtw_memset(extra, '\\0', wrqu->data.length);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 0;\n\t\tBtReq.paraLength = 0;\n\t\tmptbt_BtControlProcess(padapter, &BtReq);\n\t\trtw_msleep_os(100);\n\n\t\tDBG_8192C(\"FirmwareDownloadBT ready = 0x%x 0x%x\", pMptCtx->mptOutBuf[4], pMptCtx->mptOutBuf[5]);\n\t\tif ((pMptCtx->mptOutBuf[4] == 0x00) && (pMptCtx->mptOutBuf[5] == 0x00)) {\n\n\t\t\tif (padapter->mppriv.bTxBufCkFail == _TRUE)\n\t\t\t\tsprintf(extra, \"check TxBuf Fail.\\n\");\n\t\t\telse\n\t\t\t\tsprintf(extra, \"download FW Fail.\\n\");\n\t\t} else {\n\t\t\tsprintf(extra, \"download FW OK.\\n\");\n\t\t\tgoto exit;\n\t\t}\n\t\tgoto exit;\n\t}\n\tif (strncmp(extra, \"dlfw\", 4) == 0) {\n\t\tpHalData->LastHMEBoxNum = 0;\n\t\tpadapter->bBTFWReady = _FALSE;\n\t\trtw_write8(padapter, 0xa3, 0x05);\n\t\tBTStatus = rtw_read8(padapter, 0xa0);\n\t\tDBG_871X(\"%s: btwmap before read 0xa0 BT Status =0x%x\\n\", __func__, BTStatus);\n\t\tif (BTStatus != 0x04) {\n\t\t\tsprintf(extra, \"BT Status not Active DLFW FAIL\\n\");\n\t\t\tgoto exit;\n\t\t}\n\n\t\ttempval = rtw_read8(padapter, 0x6B);\n\t\ttempval |= BIT7;\n\t\trtw_write8(padapter, 0x6B, tempval);\n\n\t\t/* Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay*/\n\t\t/* So don't write 0x6A[14]=1 and 0x6A[15]=0 together!*/\n\t\trtw_usleep_os(100);\n\t\t/* disable BT power cut*/\n\t\t/* 0x6A[14] = 0*/\n\t\ttempval = rtw_read8(padapter, 0x6B);\n\t\ttempval &= ~BIT6;\n\t\trtw_write8(padapter, 0x6B, tempval);\n\t\trtw_usleep_os(100);\n\n\t\tMPT_PwrCtlDM(padapter, 0);\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));\n\t\trtw_msleep_os(600);\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));\n\t\trtw_msleep_os(1200);\n\n#if defined(CONFIG_PLATFORM_SPRD) && (MP_DRIVER == 1)\n\t\t/* Pull up BT reset pin.*/\n\t\tDBG_871X(\"%s: pull up BT reset pin when bt start mp test\\n\", __func__);\n\t\trtw_wifi_gpio_wlan_ctrl(WLAN_BT_PWDN_ON);\n#endif\n\t\tDBG_871X(\" FirmwareDownload!\\n\");\n\n#if defined(CONFIG_RTL8723B)\n\t\tstatus = rtl8723b_FirmwareDownload(padapter, _FALSE);\n#endif\n\t\tDBG_871X(\"Wait for FirmwareDownloadBT fw boot!\\n\");\n\t\trtw_msleep_os(1000);\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_HaltNotify(padapter);\n\t\tDBG_871X(\"SetBT btcoex HaltNotify !\\n\");\n\t\t/*hal_btcoex1ant_SetAntPath(padapter);*/\n\t\trtw_btcoex_SetManualControl(padapter, _TRUE);\n#endif\n\t\t_rtw_memset(extra, '\\0', wrqu->data.length);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 0;\n\t\tBtReq.paraLength = 0;\n\t\tmptbt_BtControlProcess(padapter, &BtReq);\n\t\trtw_msleep_os(200);\n\n\t\tDBG_8192C(\"FirmwareDownloadBT ready = 0x%x 0x%x\", pMptCtx->mptOutBuf[4], pMptCtx->mptOutBuf[5]);\n\t\tif ((pMptCtx->mptOutBuf[4] == 0x00) && (pMptCtx->mptOutBuf[5] == 0x00)) {\n\t\t\tif (padapter->mppriv.bTxBufCkFail == _TRUE)\n\t\t\t\tsprintf(extra, \"check TxBuf Fail.\\n\");\n\t\t\telse\n\t\t\t\tsprintf(extra, \"download FW Fail.\\n\");\n\t\t} else {\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_SwitchBtTRxMask(padapter);\n#endif\n\t\t\trtw_msleep_os(200);\n\t\t\tsprintf(extra, \"download FW OK.\\n\");\n\t\t\tgoto exit;\n\t\t}\n\t\tgoto exit;\n\t}\n\n\tif (strncmp(extra, \"down\", 4) == 0) {\n\t\tDBG_871X(\"SetBT down for to hal_init !\\n\");\n#ifdef CONFIG_BT_COEXIST\n\t\trtw_btcoex_SetManualControl(padapter, _FALSE);\n\t\trtw_btcoex_Initialize(padapter);\n#endif\n\t\tpHalFunc->read_adapter_info(padapter);\n\t\tpHalFunc->hal_deinit(padapter);\n\t\tpHalFunc->hal_init(padapter);\n\t\trtw_pm_set_ips(padapter, IPS_NONE);\n\t\tLeaveAllPowerSaveMode(padapter);\n\t\tMPT_PwrCtlDM(padapter, 0);\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) | 0x00000004));\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) & 0xFFFFFFEF));\n\t\trtw_msleep_os(600);\n\t\t/*rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE));*/\n\t\trtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b) | 0x00000010));\n\t\trtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc) & 0xFFFFFFFB));\n\t\trtw_msleep_os(1200);\n\t\tgoto exit;\n\t}\n\tif (strncmp(extra, \"disable\", 7) == 0) {\n\t\tDBG_871X(\"SetBT disable !\\n\");\n\t\trtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a) & 0xFFFFFFFB));\n\t\trtw_msleep_os(500);\n\t\tgoto exit;\n\t}\n\tif (strncmp(extra, \"enable\", 6) == 0) {\n\t\tDBG_871X(\"SetBT enable !\\n\");\n\t\trtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a) | 0x00000004));\n\t\trtw_msleep_os(500);\n\t\tgoto exit;\n\t}\n\tif (strncmp(extra, \"h2c\", 3) == 0) {\n\t\tDBG_871X(\"SetBT h2c !\\n\");\n\t\tpadapter->bBTFWReady = _TRUE;\n\t\trtw_hal_fill_h2c_cmd(padapter, 0x63, 1, u1H2CBtMpOperParm);\n\t\tgoto exit;\n\t}\n\tif (strncmp(extra, \"2ant\", 4) == 0) {\n\t\tDBG_871X(\"Set BT 2ant use!\\n\");\n\t\tPHY_SetMacReg(padapter, 0x67, BIT5, 0x1);\n\t\trtw_write32(padapter, 0x948, 0000);\n\n\t\tgoto exit;\n\t}\n\n\tif (ready != 0 && testmode != 0 && trxparam != 0 && setgen != 0 && getgen != 0 && testctrl != 0 && testbt != 0 && readtherm != 0 && setbtmac != 0)\n\t\treturn -EFAULT;\n\n\tif (testbt == 0) {\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 6;\n\t\tBtReq.paraLength = cnts / 2;\n\t\tgoto todo;\n\t}\n\tif (ready == 0) {\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 0;\n\t\tBtReq.paraLength = 0;\n\t\tgoto todo;\n\t}\n\n\tpch = extra;\n\ti = 0;\n\twhile ((token = strsep(&pch, \",\")) != NULL) {\n\t\tif (i > 1)\n\t\t\tbreak;\n\t\ttmp[i] = token;\n\t\ti++;\n\t}\n\n\tif ((tmp[0] != NULL) && (tmp[1] != NULL)) {\n\t\tcnts = strlen(tmp[1]);\n\t\tif (cnts < 1)\n\t\t\treturn -EFAULT;\n\n\t\tDBG_871X(\"%s: cnts=%d\\n\", __func__, cnts);\n\t\tDBG_871X(\"%s: data=%s\\n\", __func__, tmp[1]);\n\n\t\tfor (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) {\n\t\t\tBtReq.pParamStart[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]);\n\t\t\t/*\t\t\tDBG_871X(\"BtReq.pParamStart[%d]=0x%02x\\n\", jj, BtReq.pParamStart[jj]);*/\n\t\t}\n\t} else \n\t\treturn -EFAULT;\n\t\t\n\tif (testmode == 0) {\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 1;\n\t\tBtReq.paraLength = 1;\n\t}\n\tif (trxparam == 0) {\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 2;\n\t\tBtReq.paraLength = cnts / 2;\n\t}\n\tif (setgen == 0) {\n\t\tDBG_871X(\"%s: BT_SET_GENERAL\\n\", __func__);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 3;/*BT_SET_GENERAL\t3*/\n\t\tBtReq.paraLength = cnts / 2;\n\t}\n\tif (getgen == 0) {\n\t\tDBG_871X(\"%s: BT_GET_GENERAL\\n\", __func__);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 4;/*BT_GET_GENERAL\t4*/\n\t\tBtReq.paraLength = cnts / 2;\n\t}\n\tif (readtherm == 0) {\n\t\tDBG_871X(\"%s: BT_GET_GENERAL\\n\", __func__);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 4;/*BT_GET_GENERAL\t4*/\n\t\tBtReq.paraLength = cnts / 2;\n\t}\n\n\tif (testctrl == 0) {\n\t\tDBG_871X(\"%s: BT_TEST_CTRL\\n\", __func__);\n\t\tBtReq.opCodeVer = 1;\n\t\tBtReq.OpCode = 5;/*BT_TEST_CTRL\t5*/\n\t\tBtReq.paraLength = cnts / 2;\n\t}\n\n\tDBG_871X(\"%s: Req opCodeVer=%d OpCode=%d paraLength=%d\\n\",\n\t\t\t __func__, BtReq.opCodeVer, BtReq.OpCode, BtReq.paraLength);\n\n\tif (BtReq.paraLength < 1)\n\t\tgoto todo;\n\tfor (i = 0; i < BtReq.paraLength; i++) {\n\t\tDBG_871X(\"%s: BtReq.pParamStart[%d] = 0x%02x\\n\",\n\t\t\t\t __func__, i, BtReq.pParamStart[i]);\n\t}\n\ntodo:\n\t_rtw_memset(extra, '\\0', wrqu->data.length);\n\n\tif (padapter->bBTFWReady == _FALSE) {\n\t\tsprintf(extra, \"BTFWReady = FALSE.\\n\");\n\t\tgoto exit;\n\t}\n\n\tmptbt_BtControlProcess(padapter, &BtReq);\n\n\tif (readtherm == 0) {\n\t\tsprintf(extra, \"BT thermal=\");\n\t\tfor (i = 4; i < pMptCtx->mptOutLen; i++) {\n\t\t\tif ((pMptCtx->mptOutBuf[i] == 0x00) && (pMptCtx->mptOutBuf[i + 1] == 0x00))\n\t\t\t\tgoto exit;\n\n\t\t\tsprintf(extra, \"%s %d \", extra, (pMptCtx->mptOutBuf[i] & 0x1f));\n\t\t}\n\t} else {\n\t\tfor (i = 4; i < pMptCtx->mptOutLen; i++)\n\t\t\tsprintf(extra, \"%s 0x%x \", extra, pMptCtx->mptOutBuf[i]);\n\t}\n\nexit:\n\twrqu->data.length = strlen(extra) + 1;\n\tDBG_871X(\"-%s: output len=%d data=%s\\n\", __func__, wrqu->data.length, extra);\n\n\treturn status;\n}\n\n#endif /*#ifdef CONFIG_RTL8723B*/\n\n#endif\n"
  },
  {
    "path": "os_dep/linux/mlme_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#define _MLME_OSDEP_C_\n\n#include <drv_types.h>\n\n\n#ifdef RTK_DMP_PLATFORM\nvoid Linkup_workitem_callback(struct work_struct *work)\n{\n\tstruct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkup_workitem);\n\t_adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mlme_osdep_c_,_drv_info_,(\"+ Linkup_workitem_callback\\n\"));\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\n\tkobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKUP);\n#else\n\tkobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKUP);\n#endif\n\n_func_exit_;\n}\n\nvoid Linkdown_workitem_callback(struct work_struct *work)\n{\n\tstruct mlme_priv *pmlmepriv = container_of(work, struct mlme_priv, Linkdown_workitem);\n\t_adapter *padapter = container_of(pmlmepriv, _adapter, mlmepriv);\n\n_func_enter_;\n\n\tRT_TRACE(_module_mlme_osdep_c_,_drv_info_,(\"+ Linkdown_workitem_callback\\n\"));\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\n\tkobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_LINKDOWN);\n#else\n\tkobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_LINKDOWN);\n#endif\n\n_func_exit_;\n}\n#endif\n\n\n/*\nvoid sitesurvey_ctrl_handler(void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\n\t_sitesurvey_ctrl_handler(adapter);\n\n\t_set_timer(&adapter->mlmepriv.sitesurveyctrl.sitesurvey_ctrl_timer, 3000);\n}\n*/\n\nvoid rtw_join_timeout_handler (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\t_rtw_join_timeout_handler(adapter);\n}\n\n\nvoid _rtw_scan_timeout_handler (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\trtw_scan_timeout_handler(adapter);\n}\n\n\nvoid _dynamic_check_timer_handlder (void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\n\n#if (MP_DRIVER == 1)\n\tif (adapter->registrypriv.mp_mode == 1 && adapter->mppriv.mp_dm ==0) //for MP ODM dynamic Tx power tracking\n\t{\n\t\t//DBG_871X(\"_dynamic_check_timer_handlder mp_dm =0 return \\n\");\n\t\t_set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000);\n\t\treturn;\n\t}\n#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(adapter->pbuddy_adapter)\n\t\trtw_dynamic_check_timer_handlder(adapter->pbuddy_adapter);\n#endif //CONFIG_CONCURRENT_MODE\n\n\trtw_dynamic_check_timer_handlder(adapter);\n\t\n\t_set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000);\n}\n\n#ifdef CONFIG_SET_SCAN_DENY_TIMER\nvoid _rtw_set_scan_deny_timer_hdl(void *FunctionContext)\n{\n\t_adapter *adapter = (_adapter *)FunctionContext;\t \n\trtw_set_scan_deny_timer_hdl(adapter);\n}\n#endif\n\n\nvoid rtw_init_mlme_timer(_adapter *padapter)\n{\n\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\t_init_timer(&(pmlmepriv->assoc_timer), padapter->pnetdev, rtw_join_timeout_handler, padapter);\n\t//_init_timer(&(pmlmepriv->sitesurveyctrl.sitesurvey_ctrl_timer), padapter->pnetdev, sitesurvey_ctrl_handler, padapter);\n\t_init_timer(&(pmlmepriv->scan_to_timer), padapter->pnetdev, _rtw_scan_timeout_handler, padapter);\n\n\t#ifdef CONFIG_DFS_MASTER\n\t_init_timer(&(pmlmepriv->dfs_master_timer), padapter->pnetdev, rtw_dfs_master_timer_hdl, padapter);\n\t#endif\n\n\t_init_timer(&(pmlmepriv->dynamic_chk_timer), padapter->pnetdev, _dynamic_check_timer_handlder, padapter);\n\n\t#ifdef CONFIG_SET_SCAN_DENY_TIMER\n\t_init_timer(&(pmlmepriv->set_scan_deny_timer), padapter->pnetdev, _rtw_set_scan_deny_timer_hdl, padapter);\n\t#endif\n\n#ifdef RTK_DMP_PLATFORM\n\t_init_workitem(&(pmlmepriv->Linkup_workitem), Linkup_workitem_callback, padapter);\n\t_init_workitem(&(pmlmepriv->Linkdown_workitem), Linkdown_workitem_callback, padapter);\n#endif\n\n}\n\nextern void rtw_indicate_wx_assoc_event(_adapter *padapter);\nextern void rtw_indicate_wx_disassoc_event(_adapter *padapter);\n\nvoid rtw_os_indicate_connect(_adapter *adapter)\n{\n\tstruct mlme_priv *pmlmepriv = &(adapter->mlmepriv);\n_func_enter_;\t\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) || \n\t\t(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )\n\t{\n\t\trtw_cfg80211_ibss_indicate_connect(adapter);\n\t}\n\telse\n\t\trtw_cfg80211_indicate_connect(adapter);\n#endif //CONFIG_IOCTL_CFG80211\n\n\trtw_indicate_wx_assoc_event(adapter);\n\tnetif_carrier_on(adapter->pnetdev);\n\n\tif(adapter->pid[2] !=0)\n\t\trtw_signal_process(adapter->pid[2], SIGALRM);\n\n#ifdef RTK_DMP_PLATFORM\n\t_set_workitem(&adapter->mlmepriv.Linkup_workitem);\n#endif\n\n_func_exit_;\t\n\n}\n\nextern void indicate_wx_scan_complete_event(_adapter *padapter);\nvoid rtw_os_indicate_scan_done( _adapter *padapter, bool aborted)\n{\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_indicate_scan_done(padapter, aborted);\n#endif\n\tindicate_wx_scan_complete_event(padapter);\n}\n\nstatic RT_PMKID_LIST   backupPMKIDList[ NUM_PMKID_CACHE ];\nvoid rtw_reset_securitypriv( _adapter *adapter )\n{\n\tu8\tbackupPMKIDIndex = 0;\n\tu8\tbackupTKIPCountermeasure = 0x00;\n\tu32\tbackupTKIPcountermeasure_time = 0;\n\t// add for CONFIG_IEEE80211W, none 11w also can use\n\t_irqL irqL;\n\tstruct mlme_ext_priv\t*pmlmeext = &adapter->mlmeextpriv;\n\t\n\t_enter_critical_bh(&adapter->security_key_mutex, &irqL);\n\t\n\tif(adapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)//802.1x\n\t{\t\t \n\t\t// Added by Albert 2009/02/18\n\t\t// We have to backup the PMK information for WiFi PMK Caching test item.\n\t\t//\n\t\t// Backup the btkip_countermeasure information.\n\t\t// When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds.\n\n\t\t_rtw_memset( &backupPMKIDList[ 0 ], 0x00, sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );\n\n\t\t_rtw_memcpy( &backupPMKIDList[ 0 ], &adapter->securitypriv.PMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );\n\t\tbackupPMKIDIndex = adapter->securitypriv.PMKIDIndex;\n\t\tbackupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure;\n\t\tbackupTKIPcountermeasure_time = adapter->securitypriv.btkip_countermeasure_time;\t\t\n#ifdef CONFIG_IEEE80211W\n\t\t//reset RX BIP packet number\n\t\tpmlmeext->mgnt_80211w_IPN_rx = 0;\n#endif //CONFIG_IEEE80211W\n\t\t_rtw_memset((unsigned char *)&adapter->securitypriv, 0, sizeof (struct security_priv));\n\t\t//_init_timer(&(adapter->securitypriv.tkip_timer),adapter->pnetdev, rtw_use_tkipkey_handler, adapter);\n\n\t\t// Added by Albert 2009/02/18\n\t\t// Restore the PMK information to securitypriv structure for the following connection.\n\t\t_rtw_memcpy( &adapter->securitypriv.PMKIDList[ 0 ], &backupPMKIDList[ 0 ], sizeof( RT_PMKID_LIST ) * NUM_PMKID_CACHE );\n\t\tadapter->securitypriv.PMKIDIndex = backupPMKIDIndex;\n\t\tadapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure;\n\t\tadapter->securitypriv.btkip_countermeasure_time = backupTKIPcountermeasure_time;\t\t\n\n\t\tadapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen;\n\t\tadapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled;\n\n\t}\n\telse //reset values in securitypriv \n\t{\n\t\t//if(adapter->mlmepriv.fw_state & WIFI_STATION_STATE)\n\t\t//{\n\t\tstruct security_priv *psec_priv=&adapter->securitypriv;\n\n\t\tpsec_priv->dot11AuthAlgrthm =dot11AuthAlgrthm_Open;  //open system\n\t\tpsec_priv->dot11PrivacyAlgrthm = _NO_PRIVACY_;\n\t\tpsec_priv->dot11PrivacyKeyIndex = 0;\n\n\t\tpsec_priv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\t\tpsec_priv->dot118021XGrpKeyid = 1;\n\n\t\tpsec_priv->ndisauthtype = Ndis802_11AuthModeOpen;\n\t\tpsec_priv->ndisencryptstatus = Ndis802_11WEPDisabled;\n\t\t//}\n\t}\n\t// add for CONFIG_IEEE80211W, none 11w also can use\n\t_exit_critical_bh(&adapter->security_key_mutex, &irqL);\n\n\tDBG_871X(FUNC_ADPT_FMT\" - End to Disconnect\\n\", FUNC_ADPT_ARG(adapter));\n}\n\nvoid rtw_os_indicate_disconnect( _adapter *adapter )\n{\n\t//RT_PMKID_LIST   backupPMKIDList[ NUM_PMKID_CACHE ];\n\n_func_enter_;\n\n\tnetif_carrier_off(adapter->pnetdev); // Do it first for tx broadcast pkt after disconnection issue!\n\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_indicate_disconnect(adapter);\n#endif //CONFIG_IOCTL_CFG80211\n\n\trtw_indicate_wx_disassoc_event(adapter);\n\n#ifdef RTK_DMP_PLATFORM\n\t_set_workitem(&adapter->mlmepriv.Linkdown_workitem);\n#endif\n\t //modify for CONFIG_IEEE80211W, none 11w also can use the same command\n\t rtw_reset_securitypriv_cmd(adapter);\n\n_func_exit_;\n\n}\n\nvoid rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie)\n{\n\tuint\tlen;\n\tu8\t*buff,*p,i;\n\tunion iwreq_data wrqu;\n\n_func_enter_;\n\n\tRT_TRACE(_module_mlme_osdep_c_,_drv_info_,(\"+rtw_report_sec_ie, authmode=%d\\n\", authmode));\n\n\tbuff = NULL;\n\tif(authmode==_WPA_IE_ID_)\n\t{\n\t\tRT_TRACE(_module_mlme_osdep_c_,_drv_info_,(\"rtw_report_sec_ie, authmode=%d\\n\", authmode));\n\n\t\tbuff = rtw_zmalloc(IW_CUSTOM_MAX);\n\t\tif (NULL == buff) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": alloc memory FAIL!!\\n\",\n\t\t\t\tFUNC_ADPT_ARG(adapter));\n\t\t\treturn;\n\t\t}\n\t\tp = buff;\n\n\t\tp+=sprintf(p,\"ASSOCINFO(ReqIEs=\");\n\n\t\tlen = sec_ie[1]+2;\n\t\tlen = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;\n\t\t\t\n\t\tfor(i=0;i<len;i++){\n\t\t\tp+=sprintf(p,\"%02x\",sec_ie[i]);\n\t\t}\n\n\t\tp+=sprintf(p,\")\");\n\n\t\t_rtw_memset(&wrqu,0,sizeof(wrqu));\n\n\t\twrqu.data.length=p-buff;\n\n\t\twrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;\n\n#ifndef CONFIG_IOCTL_CFG80211\n\t\twireless_send_event(adapter->pnetdev,IWEVCUSTOM,&wrqu,buff);\n#endif\n\n\t\trtw_mfree(buff, IW_CUSTOM_MAX);\n\t}\n\nexit:\n\n_func_exit_;\n\n}\n\nvoid _survey_timer_hdl (void *FunctionContext)\n{\n\t_adapter *padapter = (_adapter *)FunctionContext;\n\t\n\tsurvey_timer_hdl(padapter);\n}\n\nvoid _link_timer_hdl (void *FunctionContext)\n{\n\t_adapter *padapter = (_adapter *)FunctionContext;\n\tlink_timer_hdl(padapter);\n}\n\nvoid _addba_timer_hdl(void *FunctionContext)\n{\n\tstruct sta_info *psta = (struct sta_info *)FunctionContext;\n\taddba_timer_hdl(psta);\n}\n\n#ifdef CONFIG_IEEE80211W\n\nvoid _sa_query_timer_hdl (void *FunctionContext)\n{\n\tstruct sta_info *psta = (struct sta_info *)FunctionContext;\n\t\n\tsa_query_timer_hdl(psta);\n}\n\nvoid init_dot11w_expire_timer(_adapter *padapter, struct sta_info *psta)\n{\n\t_init_timer(&psta->dot11w_expire_timer, padapter->pnetdev, _sa_query_timer_hdl, psta);\n}\n\n#endif //CONFIG_IEEE80211W\n\nvoid init_addba_retry_timer(_adapter *padapter, struct sta_info *psta)\n{\n\n\t_init_timer(&psta->addba_retry_timer, padapter->pnetdev, _addba_timer_hdl, psta);\n}\n\n/*\nvoid _reauth_timer_hdl(void *FunctionContext)\n{\n\t_adapter *padapter = (_adapter *)FunctionContext;\n\treauth_timer_hdl(padapter);\n}\n\nvoid _reassoc_timer_hdl(void *FunctionContext)\n{\n\t_adapter *padapter = (_adapter *)FunctionContext;\n\treassoc_timer_hdl(padapter);\n}\n*/\n\nvoid init_mlme_ext_timer(_adapter *padapter)\n{\t\n\tstruct\tmlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\n\t_init_timer(&pmlmeext->survey_timer, padapter->pnetdev, _survey_timer_hdl, padapter);\n\t_init_timer(&pmlmeext->link_timer, padapter->pnetdev, _link_timer_hdl, padapter);\n\n\t//_init_timer(&pmlmeext->ADDBA_timer, padapter->pnetdev, _addba_timer_hdl, padapter);\n\n\t//_init_timer(&pmlmeext->reauth_timer, padapter->pnetdev, _reauth_timer_hdl, padapter);\n\t//_init_timer(&pmlmeext->reassoc_timer, padapter->pnetdev, _reassoc_timer_hdl, padapter);\n}\n\n#ifdef CONFIG_AP_MODE\n\nvoid rtw_indicate_sta_assoc_event(_adapter *padapter, struct sta_info *psta)\n{\n\tunion iwreq_data wrqu;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tif(psta==NULL)\n\t\treturn;\n\n\tif(psta->aid > NUM_STA)\n\t\treturn;\n\n\tif(pstapriv->sta_aid[psta->aid - 1] != psta)\n\t\treturn;\n\t\n\t\n\twrqu.addr.sa_family = ARPHRD_ETHER;\t\n\t\n\t_rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);\n\n\tDBG_871X(\"+rtw_indicate_sta_assoc_event\\n\");\n\t\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, IWEVREGISTERED, &wrqu, NULL);\n#endif\n\n}\n\nvoid rtw_indicate_sta_disassoc_event(_adapter *padapter, struct sta_info *psta)\n{\n\tunion iwreq_data wrqu;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\n\tif(psta==NULL)\n\t\treturn;\n\n\tif(psta->aid > NUM_STA)\n\t\treturn;\n\n\tif(pstapriv->sta_aid[psta->aid - 1] != psta)\n\t\treturn;\n\t\n\t\n\twrqu.addr.sa_family = ARPHRD_ETHER;\t\n\t\n\t_rtw_memcpy(wrqu.addr.sa_data, psta->hwaddr, ETH_ALEN);\n\n\tDBG_871X(\"+rtw_indicate_sta_disassoc_event\\n\");\n\t\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event(padapter->pnetdev, IWEVEXPIRED, &wrqu, NULL);\n#endif\n\t\n}\n\n\n#ifdef CONFIG_HOSTAPD_MLME\n\nstatic int mgnt_xmit_entry(struct sk_buff *skb, struct net_device *pnetdev)\n{\n\tstruct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);\n\t_adapter *padapter = (_adapter *)phostapdpriv->padapter;\n\n\t//DBG_871X(\"%s\\n\", __FUNCTION__);\n\n\treturn rtw_hal_hostap_mgnt_xmit_entry(padapter, skb);\n}\n\nstatic int mgnt_netdev_open(struct net_device *pnetdev)\n{\n\tstruct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);\n\n\tDBG_871X(\"mgnt_netdev_open: MAC Address:\" MAC_FMT \"\\n\", MAC_ARG(pnetdev->dev_addr));\n\n\n\tinit_usb_anchor(&phostapdpriv->anchored);\n\t\n\trtw_netif_wake_queue(pnetdev);\n\n\tnetif_carrier_on(pnetdev);\n\t\t\n\t//rtw_write16(phostapdpriv->padapter, 0x0116, 0x0100);//only excluding beacon \n\t\t\n\treturn 0;\t\n}\nstatic int mgnt_netdev_close(struct net_device *pnetdev)\n{\n\tstruct hostapd_priv *phostapdpriv = rtw_netdev_priv(pnetdev);\n\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\n\tusb_kill_anchored_urbs(&phostapdpriv->anchored);\n\n\tnetif_carrier_off(pnetdev);\n\n\trtw_netif_stop_queue(pnetdev);\n\n\t//rtw_write16(phostapdpriv->padapter, 0x0116, 0x3f3f);\n\t\n\treturn 0;\t\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\nstatic const struct net_device_ops rtl871x_mgnt_netdev_ops = {\n\t.ndo_open = mgnt_netdev_open,\n       .ndo_stop = mgnt_netdev_close,\n       .ndo_start_xmit = mgnt_xmit_entry,\n       //.ndo_set_mac_address = r871x_net_set_mac_address,\n       //.ndo_get_stats = r871x_net_get_stats,\n       //.ndo_do_ioctl = r871x_mp_ioctl,\n};\n#endif\n\nint hostapd_mode_init(_adapter *padapter)\n{\n\tunsigned char mac[ETH_ALEN];\n\tstruct hostapd_priv *phostapdpriv;\n\tstruct net_device *pnetdev;\n\t\n\tpnetdev = rtw_alloc_etherdev(sizeof(struct hostapd_priv));\t\n\tif (!pnetdev)\n\t   return -ENOMEM;\n\n\t//SET_MODULE_OWNER(pnetdev);\n       ether_setup(pnetdev);\n\n\t//pnetdev->type = ARPHRD_IEEE80211;\n\t\n\tphostapdpriv = rtw_netdev_priv(pnetdev);\n\tphostapdpriv->pmgnt_netdev = pnetdev;\n\tphostapdpriv->padapter= padapter;\n\tpadapter->phostapdpriv = phostapdpriv;\n\t\n\t//pnetdev->init = NULL;\n\t\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\n\n\tDBG_871X(\"register rtl871x_mgnt_netdev_ops to netdev_ops\\n\");\n\n\tpnetdev->netdev_ops = &rtl871x_mgnt_netdev_ops;\n\t\n#else\n\n\tpnetdev->open = mgnt_netdev_open;\n\n\tpnetdev->stop = mgnt_netdev_close;\t\n\t\n\tpnetdev->hard_start_xmit = mgnt_xmit_entry;\n\t\n\t//pnetdev->set_mac_address = r871x_net_set_mac_address;\n\t\n\t//pnetdev->get_stats = r871x_net_get_stats;\n\n\t//pnetdev->do_ioctl = r871x_mp_ioctl;\n\t\n#endif\n\n\tpnetdev->watchdog_timeo = HZ; /* 1 second timeout */\t\n\n\t//pnetdev->wireless_handlers = NULL;\n\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\tpnetdev->features |= NETIF_F_IP_CSUM;\n#endif\t\n\n\t\n\t\n\tif(dev_alloc_name(pnetdev,\"mgnt.wlan%d\") < 0)\n\t{\n\t\tDBG_871X(\"hostapd_mode_init(): dev_alloc_name, fail! \\n\");\t\t\n\t}\n\n\n\t//SET_NETDEV_DEV(pnetdev, pintfpriv->udev);\n\n\n\tmac[0]=0x00;\n\tmac[1]=0xe0;\n\tmac[2]=0x4c;\n\tmac[3]=0x87;\n\tmac[4]=0x11;\n\tmac[5]=0x12;\n\t\t\t\t\n\t_rtw_memcpy(pnetdev->dev_addr, mac, ETH_ALEN);\n\t\n\n\tnetif_carrier_off(pnetdev);\n\n\n\t/* Tell the network stack we exist */\n\tif (register_netdev(pnetdev) != 0)\n\t{\n\t\tDBG_871X(\"hostapd_mode_init(): register_netdev fail!\\n\");\n\t\t\n\t\tif(pnetdev)\n      \t\t{\t \n\t\t\trtw_free_netdev(pnetdev);\n      \t\t}\n\t}\n\t\n\treturn 0;\n\t\n}\n\nvoid hostapd_mode_unload(_adapter *padapter)\n{\n\tstruct hostapd_priv *phostapdpriv = padapter->phostapdpriv;\n\tstruct net_device *pnetdev = phostapdpriv->pmgnt_netdev;\n\n\tunregister_netdev(pnetdev);\n\trtw_free_netdev(pnetdev);\n\t\n}\n\n#endif\n#endif\n\n"
  },
  {
    "path": "os_dep/linux/os_intfs.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _OS_INTFS_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n\n#error \"Shall be Linux or Windows, but not both!\\n\"\n\n#endif\n\n\nMODULE_LICENSE(\"GPL\");\nMODULE_DESCRIPTION(\"Realtek Wireless Lan Driver\");\nMODULE_AUTHOR(\"Realtek Semiconductor Corp.\");\nMODULE_VERSION(DRIVERVERSION);\n\n/* module param defaults */\nint rtw_chip_version = 0x00;\nint rtw_rfintfs = HWPI;\nint rtw_lbkmode = 0;//RTL8712_AIR_TRX;\n\n\nint rtw_network_mode = Ndis802_11IBSS;//Ndis802_11Infrastructure;//infra, ad-hoc, auto\n//NDIS_802_11_SSID\tssid;\nint rtw_channel = 1;//ad-hoc support requirement\nint rtw_wireless_mode = WIRELESS_MODE_MAX;\nint rtw_vrtl_carrier_sense = AUTO_VCS;\nint rtw_vcs_type = RTS_CTS;//*\nint rtw_rts_thresh = 2347;//*\nint rtw_frag_thresh = 2346;//*\nint rtw_preamble = PREAMBLE_LONG;//long, short, auto\nint rtw_scan_mode = 1;//active, passive\nint rtw_adhoc_tx_pwr = 1;\nint rtw_soft_ap = 0;\n//int smart_ps = 1;\n#ifdef CONFIG_POWER_SAVING\nint rtw_power_mgnt = PS_MODE_MAX;\n#ifdef CONFIG_IPS_LEVEL_2\nint rtw_ips_mode = IPS_LEVEL_2;\n#else\nint rtw_ips_mode = IPS_NORMAL;\n#endif\n#else\nint rtw_power_mgnt = PS_MODE_ACTIVE;\nint rtw_ips_mode = IPS_NONE;\n#endif\nmodule_param(rtw_ips_mode, int, 0644);\nMODULE_PARM_DESC(rtw_ips_mode,\"The default IPS mode\");\n\nint rtw_smart_ps = 2;\n\nint rtw_check_fw_ps = 1;\n\n#ifdef CONFIG_TX_EARLY_MODE\nint rtw_early_mode=1;\n#endif\n\nint rtw_usb_rxagg_mode = 2;//USB_RX_AGG_DMA =1,USB_RX_AGG_USB=2\nmodule_param(rtw_usb_rxagg_mode, int, 0644);\n\nint rtw_radio_enable = 1;\nint rtw_long_retry_lmt = 7;\nint rtw_short_retry_lmt = 7;\nint rtw_busy_thresh = 40;\n//int qos_enable = 0; //*\nint rtw_ack_policy = NORMAL_ACK;\n\nint rtw_mp_mode = 0;\n\nint rtw_software_encrypt = 0;\nint rtw_software_decrypt = 0;\n\nint rtw_acm_method = 0;// 0:By SW 1:By HW.\n\nint rtw_wmm_enable = 1;// default is set to enable the wmm.\nint rtw_uapsd_enable = 0;\nint rtw_uapsd_max_sp = NO_LIMIT;\nint rtw_uapsd_acbk_en = 0;\nint rtw_uapsd_acbe_en = 0;\nint rtw_uapsd_acvi_en = 0;\nint rtw_uapsd_acvo_en = 0;\n#ifdef CONFIG_RTL8814A\nint rtw_rfkfree_enable = 2; /* disable kfree */\n#else\nint rtw_rfkfree_enable = 0; /* Default Enalbe kfree by efuse config */\n#endif\n#ifdef CONFIG_80211N_HT\nint rtw_ht_enable = 1;\n// 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160MHz, 4: 80+80MHz\n// 2.4G use bit 0 ~ 3, 5G use bit 4 ~ 7\n// 0x21 means enable 2.4G 40MHz & 5G 80MHz\nint rtw_bw_mode = 0x21;\nint rtw_ampdu_enable = 1;//for enable tx_ampdu ,// 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)\nint rtw_rx_stbc = 3;// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ\nint rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on\n// Short GI support Bit Map\n// BIT0 - 20MHz, 0: non-support, 1: support\n// BIT1 - 40MHz, 0: non-support, 1: support\n// BIT2 - 80MHz, 0: non-support, 1: support\n// BIT3 - 160MHz, 0: non-support, 1: support\nint rtw_short_gi = 0xf;\n// BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx, BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx\nint rtw_ldpc_cap = 0x33;\n// BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx, BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx\nint rtw_stbc_cap = 0x33;\n// BIT0: Enable VHT Beamformer, BIT1: Enable VHT Beamformee, BIT4: Enable HT Beamformer, BIT5: Enable HT Beamformee\nint rtw_beamform_cap = 0x2;\nint rtw_bfer_rf_number = 0; /*BeamformerCapRfNum Rf path number, 0 for auto, others for manual*/\nint rtw_bfee_rf_number = 0; /*BeamformeeCapRfNum  Rf path number, 0 for auto, others for manual*/\n\n#endif //CONFIG_80211N_HT\n\n#ifdef CONFIG_80211AC_VHT\nint rtw_vht_enable = 1; //0:disable, 1:enable, 2:force auto enable\nint rtw_ampdu_factor = 7;\nint rtw_vht_rate_sel = 0;\n#endif //CONFIG_80211AC_VHT\n\nint rtw_lowrate_two_xmit = 1;//Use 2 path Tx to transmit MCS0~7 and legacy mode\n\n//int rf_config = RF_1T2R;  // 1T2R\nint rtw_rf_config = RF_MAX_TYPE;  //auto\n\nint rtw_low_power = 0;\n#ifdef CONFIG_WIFI_TEST\nint rtw_wifi_spec = 1;//for wifi test\n#else\nint rtw_wifi_spec = 0;\n#endif\n\nint rtw_special_rf_path = 0; //0: 2T2R ,1: only turn on path A 1T1R\n\nint rtw_channel_plan = RTW_CHPLAN_MAX;\n\n#ifdef CONFIG_BT_COEXIST\nint rtw_btcoex_enable = 1;\nmodule_param(rtw_btcoex_enable, int, 0644);\nMODULE_PARM_DESC(rtw_btcoex_enable, \"Enable BT co-existence mechanism\");\nint rtw_bt_iso = 2;// 0:Low, 1:High, 2:From Efuse\nint rtw_bt_sco = 3;// 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy\nint rtw_bt_ampdu =1 ;// 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU.\nint rtw_ant_num = -1; // <0: undefined, >0: Antenna number\nmodule_param(rtw_ant_num, int, 0644);\nMODULE_PARM_DESC(rtw_ant_num, \"Antenna number setting\");\n#endif\n\nint rtw_AcceptAddbaReq = _TRUE;// 0:Reject AP's Add BA req, 1:Accept AP's Add BA req.\n\nint rtw_antdiv_cfg = 2; // 0:OFF , 1:ON, 2:decide by Efuse config\nint rtw_antdiv_type = 0 ; //0:decide by efuse  1: for 88EE, 1Tx and 1RxCG are diversity.(2 Ant with SPDT), 2:  for 88EE, 1Tx and 2Rx are diversity.( 2 Ant, Tx and RxCG are both on aux port, RxCS is on main port ), 3: for 88EE, 1Tx and 1RxCG are fixed.(1Ant, Tx and RxCG are both on aux port)\n\n/* 0: doesn't switch, 1: switch from usb2.0 to usb 3.0 2: switch from usb3.0 to usb 2.0 */\nint rtw_switch_usb_mode = 0;\n\n#ifdef CONFIG_USB_AUTOSUSPEND\nint rtw_enusbss = 1;//0:disable,1:enable\n#else\nint rtw_enusbss = 0;//0:disable,1:enable\n#endif\n\nint rtw_hwpdn_mode=2;//0:disable,1:enable,2: by EFUSE config\n\n#ifdef CONFIG_HW_PWRP_DETECTION\nint rtw_hwpwrp_detect = 1;\n#else\nint rtw_hwpwrp_detect = 0; //HW power  ping detect 0:disable , 1:enable\n#endif\n\n#ifdef CONFIG_USB_HCI\nint rtw_hw_wps_pbc = 1;\n#else\nint rtw_hw_wps_pbc = 0;\n#endif\n\n#ifdef CONFIG_TX_MCAST2UNI\nint rtw_mc2u_disable = 0;\n#endif\t// CONFIG_TX_MCAST2UNI\n\n#ifdef CONFIG_80211D\nint rtw_80211d = 0;\n#endif\n\n#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\nint rtw_force_ant = 2;//0 :normal, 1:Main ant, 2:Aux ant\nint rtw_force_igi =0;//0 :normal\nmodule_param(rtw_force_ant, int, 0644);\nmodule_param(rtw_force_igi, int, 0644);\n#endif\n\n#ifdef CONFIG_QOS_OPTIMIZATION\nint rtw_qos_opt_enable=1;//0: disable,1:enable\n#else\nint rtw_qos_opt_enable=0;//0: disable,1:enable\n#endif\nmodule_param(rtw_qos_opt_enable,int,0644);\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\nint rtw_acs_mode = 1; /*0:disable, 1:enable*/\nmodule_param(rtw_acs_mode, int, 0644);\n\nint rtw_acs_auto_scan = 0; /*0:disable, 1:enable*/\nmodule_param(rtw_acs_auto_scan, int, 0644);\n\n#endif\n\nchar* ifname = \"wlan%d\";\nmodule_param(ifname, charp, 0644);\nMODULE_PARM_DESC(ifname, \"The default name to allocate for first interface\");\n\n#ifdef CONFIG_PLATFORM_ANDROID\nchar* if2name = \"p2p%d\";\n#else //CONFIG_PLATFORM_ANDROID\nchar* if2name = \"wlan%d\";\n#endif //CONFIG_PLATFORM_ANDROID\nmodule_param(if2name, charp, 0644);\nMODULE_PARM_DESC(if2name, \"The default name to allocate for second interface\");\n\nchar* rtw_initmac = 0;  // temp mac address if users want to use instead of the mac address in Efuse\n\n#ifdef CONFIG_MULTI_VIR_IFACES\nint rtw_ext_iface_num  = 1;//primary/secondary iface is excluded\nmodule_param(rtw_ext_iface_num, int, 0644);\n#endif //CONFIG_MULTI_VIR_IFACES\n\nmodule_param(rtw_rfkfree_enable, int, 0644);\nmodule_param(rtw_initmac, charp, 0644);\nmodule_param(rtw_channel_plan, int, 0644);\nmodule_param(rtw_special_rf_path, int, 0644);\nmodule_param(rtw_chip_version, int, 0644);\nmodule_param(rtw_rfintfs, int, 0644);\nmodule_param(rtw_lbkmode, int, 0644);\nmodule_param(rtw_network_mode, int, 0644);\nmodule_param(rtw_channel, int, 0644);\nmodule_param(rtw_mp_mode, int, 0644);\nmodule_param(rtw_wmm_enable, int, 0644);\nmodule_param(rtw_vrtl_carrier_sense, int, 0644);\nmodule_param(rtw_vcs_type, int, 0644);\nmodule_param(rtw_busy_thresh, int, 0644);\n\n#ifdef CONFIG_80211N_HT\nmodule_param(rtw_ht_enable, int, 0644);\nmodule_param(rtw_bw_mode, int, 0644);\nmodule_param(rtw_ampdu_enable, int, 0644);\nmodule_param(rtw_rx_stbc, int, 0644);\nmodule_param(rtw_ampdu_amsdu, int, 0644);\n#endif //CONFIG_80211N_HT\n#ifdef CONFIG_80211AC_VHT\nmodule_param(rtw_vht_enable, int, 0644);\n#endif //CONFIG_80211AC_VHT\n#ifdef CONFIG_BEAMFORMING\nmodule_param(rtw_beamform_cap, int, 0644);\n#endif\nmodule_param(rtw_lowrate_two_xmit, int, 0644);\n\nmodule_param(rtw_rf_config, int, 0644);\nmodule_param(rtw_power_mgnt, int, 0644);\nmodule_param(rtw_smart_ps, int, 0644);\nmodule_param(rtw_low_power, int, 0644);\nmodule_param(rtw_wifi_spec, int, 0644);\n\nmodule_param(rtw_antdiv_cfg, int, 0644);\nmodule_param(rtw_antdiv_type, int, 0644);\n\nmodule_param(rtw_switch_usb_mode, int, 0644);\n\nmodule_param(rtw_enusbss, int, 0644);\nmodule_param(rtw_hwpdn_mode, int, 0644);\nmodule_param(rtw_hwpwrp_detect, int, 0644);\n\nmodule_param(rtw_hw_wps_pbc, int, 0644);\n\n#ifdef CONFIG_TX_EARLY_MODE\nmodule_param(rtw_early_mode, int, 0644);\n#endif\n#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\nchar *rtw_adaptor_info_caching_file_path= \"/data/misc/wifi/rtw_cache\";\nmodule_param(rtw_adaptor_info_caching_file_path, charp, 0644);\nMODULE_PARM_DESC(rtw_adaptor_info_caching_file_path, \"The path of adapter info cache file\");\n#endif //CONFIG_ADAPTOR_INFO_CACHING_FILE\n\n#ifdef CONFIG_LAYER2_ROAMING\nuint rtw_max_roaming_times=2;\nmodule_param(rtw_max_roaming_times, uint, 0644);\nMODULE_PARM_DESC(rtw_max_roaming_times,\"The max roaming times to try\");\n#endif //CONFIG_LAYER2_ROAMING\n\n#ifdef CONFIG_IOL\nint rtw_fw_iol=1;\nmodule_param(rtw_fw_iol, int, 0644);\nMODULE_PARM_DESC(rtw_fw_iol, \"FW IOL. 0:Disable, 1:enable, 2:by usb speed\");\n#endif //CONFIG_IOL\n\n#ifdef CONFIG_FILE_FWIMG\nchar *rtw_fw_file_path = \"/system/etc/firmware/rtlwifi/FW_NIC.BIN\";\nmodule_param(rtw_fw_file_path, charp, 0644);\nMODULE_PARM_DESC(rtw_fw_file_path, \"The path of fw image\");\n\nchar *rtw_fw_wow_file_path = \"/system/etc/firmware/rtlwifi/FW_WoWLAN.BIN\";\nmodule_param(rtw_fw_wow_file_path, charp, 0644);\nMODULE_PARM_DESC(rtw_fw_wow_file_path, \"The path of fw for Wake on Wireless image\");\n\n#ifdef CONFIG_MP_INCLUDED\nchar *rtw_fw_mp_bt_file_path = \"\";\nmodule_param(rtw_fw_mp_bt_file_path, charp, 0644);\nMODULE_PARM_DESC(rtw_fw_mp_bt_file_path, \"The path of fw for MP-BT image\");\n#endif // CONFIG_MP_INCLUDED\n#endif // CONFIG_FILE_FWIMG\n\n#ifdef CONFIG_TX_MCAST2UNI\nmodule_param(rtw_mc2u_disable, int, 0644);\n#endif\t// CONFIG_TX_MCAST2UNI\n\n#ifdef CONFIG_80211D\nmodule_param(rtw_80211d, int, 0644);\nMODULE_PARM_DESC(rtw_80211d, \"Enable 802.11d mechanism\");\n#endif\n\nuint rtw_notch_filter = RTW_NOTCH_FILTER;\nmodule_param(rtw_notch_filter, uint, 0644);\nMODULE_PARM_DESC(rtw_notch_filter, \"0:Disable, 1:Enable, 2:Enable only for P2P\");\n\nuint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;\nmodule_param(rtw_hiq_filter, uint, 0644);\nMODULE_PARM_DESC(rtw_hiq_filter, \"0:allow all, 1:allow special, 2:deny all\");\n\nuint rtw_adaptivity_en = CONFIG_RTW_ADAPTIVITY_EN;\nmodule_param(rtw_adaptivity_en, uint, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_en, \"0:disable, 1:enable\");\n\nuint rtw_adaptivity_mode = CONFIG_RTW_ADAPTIVITY_MODE;\nmodule_param(rtw_adaptivity_mode, uint, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_mode, \"0:normal, 1:carrier sense\");\n\nuint rtw_adaptivity_dml = CONFIG_RTW_ADAPTIVITY_DML;\nmodule_param(rtw_adaptivity_dml, uint, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_dml, \"0:disable, 1:enable\");\n\nuint rtw_adaptivity_dc_backoff = CONFIG_RTW_ADAPTIVITY_DC_BACKOFF;\nmodule_param(rtw_adaptivity_dc_backoff, uint, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_dc_backoff, \"DC backoff for Adaptivity\");\n\nint rtw_adaptivity_th_l2h_ini = CONFIG_RTW_ADAPTIVITY_TH_L2H_INI;\nmodule_param(rtw_adaptivity_th_l2h_ini, int, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_th_l2h_ini, \"TH_L2H_ini for Adaptivity\");\n\nint rtw_adaptivity_th_edcca_hl_diff = CONFIG_RTW_ADAPTIVITY_TH_EDCCA_HL_DIFF;\nmodule_param(rtw_adaptivity_th_edcca_hl_diff, int, 0644);\nMODULE_PARM_DESC(rtw_adaptivity_th_edcca_hl_diff, \"TH_EDCCA_HL_diff for Adaptivity\");\n\nuint rtw_amplifier_type_2g = CONFIG_RTW_AMPLIFIER_TYPE_2G;\nmodule_param(rtw_amplifier_type_2g, uint, 0644);\nMODULE_PARM_DESC(rtw_amplifier_type_2g, \"BIT3:2G ext-PA, BIT4:2G ext-LNA\");\n\nuint rtw_amplifier_type_5g = CONFIG_RTW_AMPLIFIER_TYPE_5G;\nmodule_param(rtw_amplifier_type_5g, uint, 0644);\nMODULE_PARM_DESC(rtw_amplifier_type_5g, \"BIT6:5G ext-PA, BIT7:5G ext-LNA\");\n\nuint rtw_RFE_type = CONFIG_RTW_RFE_TYPE;\nmodule_param(rtw_RFE_type, uint, 0644);\nMODULE_PARM_DESC(rtw_RFE_type, \"default init value:64\");\n\nuint rtw_GLNA_type = CONFIG_RTW_GLNA_TYPE;\nmodule_param(rtw_GLNA_type, uint, 0644);\nMODULE_PARM_DESC(rtw_GLNA_type, \"default init value:0\");\n\nuint rtw_TxBBSwing_2G = 0xFF;\nmodule_param(rtw_TxBBSwing_2G, uint, 0644);\nMODULE_PARM_DESC(rtw_TxBBSwing_2G, \"default init value:0xFF\");\n\nuint rtw_TxBBSwing_5G = 0xFF;\nmodule_param(rtw_TxBBSwing_5G, uint, 0644);\nMODULE_PARM_DESC(rtw_TxBBSwing_5G, \"default init value:0xFF\");\n\nuint rtw_OffEfuseMask = 0;\nmodule_param(rtw_OffEfuseMask, uint, 0644);\nMODULE_PARM_DESC(rtw_OffEfuseMask, \"default open Efuse Mask value:0\");\n\nuint rtw_FileMaskEfuse = 0;\nmodule_param(rtw_FileMaskEfuse, uint, 0644);\nMODULE_PARM_DESC(rtw_FileMaskEfuse, \"default drv Mask Efuse value:0\");\n\nuint rtw_kfree = 0;\nmodule_param(rtw_kfree, uint, 0644);\nMODULE_PARM_DESC(rtw_kfree, \"default kfree config value:0\");\n\nuint rtw_rxgain_offset_2g = 0;\nmodule_param(rtw_rxgain_offset_2g, uint, 0644);\nMODULE_PARM_DESC(rtw_rxgain_offset_2g, \"default RF Gain 2G Offset value:0\");\n\nuint rtw_rxgain_offset_5gl = 0;\nmodule_param(rtw_rxgain_offset_5gl, uint, 0644);\nMODULE_PARM_DESC(rtw_rxgain_offset_5gl, \"default RF Gain 5GL Offset value:0\");\n\nuint rtw_rxgain_offset_5gm = 0;\nmodule_param(rtw_rxgain_offset_5gm, uint, 0644);\nMODULE_PARM_DESC(rtw_rxgain_offset_5gm, \"default RF Gain 5GM Offset value:0\");\n\nuint rtw_rxgain_offset_5gh = 0;\nmodule_param(rtw_rxgain_offset_5gh, uint, 0644);\nMODULE_PARM_DESC(rtw_rxgain_offset_5gm, \"default RF Gain 5GL Offset value:0\");\n\n\nuint rtw_pll_ref_clk_sel = CONFIG_RTW_PLL_REF_CLK_SEL;\nmodule_param(rtw_pll_ref_clk_sel, uint, 0644);\nMODULE_PARM_DESC(rtw_pll_ref_clk_sel, \"force pll_ref_clk_sel, 0xF:use autoload value\");\n\n#if defined(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY) //eFuse: Regulatory selection=1\nint rtw_tx_pwr_lmt_enable = 1;\nint rtw_tx_pwr_by_rate = 1;\n#elif defined(CONFIG_CALIBRATE_TX_POWER_TO_MAX)//eFuse: Regulatory selection=0\nint rtw_tx_pwr_lmt_enable = 0;\nint rtw_tx_pwr_by_rate = 1;\n#else //eFuse: Regulatory selection=2\n#ifdef CONFIG_PCI_HCI\nint rtw_tx_pwr_lmt_enable = 2; // 2- Depend on efuse\nint rtw_tx_pwr_by_rate = 2;// 2- Depend on efuse\n#else // USB & SDIO\nint rtw_tx_pwr_lmt_enable = 0;\nint rtw_tx_pwr_by_rate = 0;\n#endif \n#endif\n\nmodule_param(rtw_tx_pwr_lmt_enable, int, 0644);\nMODULE_PARM_DESC(rtw_tx_pwr_lmt_enable,\"0:Disable, 1:Enable, 2: Depend on efuse\");\n\nmodule_param(rtw_tx_pwr_by_rate, int, 0644);\nMODULE_PARM_DESC(rtw_tx_pwr_by_rate,\"0:Disable, 1:Enable, 2: Depend on efuse\");\n\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\nchar *rtw_phy_file_path = REALTEK_CONFIG_PATH;\nmodule_param(rtw_phy_file_path, charp, 0644);\nMODULE_PARM_DESC(rtw_phy_file_path, \"The path of phy parameter\");\n// PHY FILE Bit Map\n// BIT0 - MAC,\t\t\t\t0: non-support, 1: support\n// BIT1 - BB,\t\t\t\t\t0: non-support, 1: support\n// BIT2 - BB_PG,\t\t\t\t0: non-support, 1: support\n// BIT3 - BB_MP,\t\t\t\t0: non-support, 1: support\n// BIT4 - RF,\t\t\t\t\t0: non-support, 1: support\n// BIT5 - RF_TXPWR_TRACK,\t0: non-support, 1: support\n// BIT6 - RF_TXPWR_LMT,\t\t0: non-support, 1: support\nint rtw_load_phy_file = (BIT2|BIT6);\nmodule_param(rtw_load_phy_file, int, 0644);\nMODULE_PARM_DESC(rtw_load_phy_file,\"PHY File Bit Map\");\nint rtw_decrypt_phy_file = 0;\nmodule_param(rtw_decrypt_phy_file, int, 0644);\nMODULE_PARM_DESC(rtw_decrypt_phy_file,\"Enable Decrypt PHY File\");\n#endif\n\nint _netdev_open(struct net_device *pnetdev);\nint netdev_open (struct net_device *pnetdev);\nstatic int netdev_close (struct net_device *pnetdev);\n#ifdef CONFIG_PLATFORM_INTEL_BYT\nextern int rtw_sdio_set_power(int on);\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\nuint loadparam(_adapter *padapter)\n{\n\tuint status = _SUCCESS;\n\tstruct registry_priv  *registry_par = &padapter->registrypriv;\n\n_func_enter_;\n\n\tregistry_par->chip_version = (u8)rtw_chip_version;\n\tregistry_par->rfintfs = (u8)rtw_rfintfs;\n\tregistry_par->lbkmode = (u8)rtw_lbkmode;\n\t//registry_par->hci = (u8)hci;\n\tregistry_par->network_mode  = (u8)rtw_network_mode;\n\n\t_rtw_memcpy(registry_par->ssid.Ssid, \"ANY\", 3);\n\tregistry_par->ssid.SsidLength = 3;\n\n\tregistry_par->channel = (u8)rtw_channel;\n\tregistry_par->wireless_mode = (u8)rtw_wireless_mode;\n\n\tif (IsSupported24G(registry_par->wireless_mode) && (!IsSupported5G(registry_par->wireless_mode))\n\t\t&& (registry_par->channel > 14)) {\n\t\tregistry_par->channel = 1;\n\t}\n\telse if (IsSupported5G(registry_par->wireless_mode) && (!IsSupported24G(registry_par->wireless_mode))\n\t\t&& (registry_par->channel <= 14)) {\n\t\tregistry_par->channel = 36;\n\t}\n\t\n\tregistry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense ;\n\tregistry_par->vcs_type = (u8)rtw_vcs_type;\n\tregistry_par->rts_thresh=(u16)rtw_rts_thresh;\n\tregistry_par->frag_thresh=(u16)rtw_frag_thresh;\n\tregistry_par->preamble = (u8)rtw_preamble;\n\tregistry_par->scan_mode = (u8)rtw_scan_mode;\n\tregistry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr;\n\tregistry_par->soft_ap=  (u8)rtw_soft_ap;\n\tregistry_par->smart_ps =  (u8)rtw_smart_ps;\n\tregistry_par->check_fw_ps = (u8)rtw_check_fw_ps;\n\tregistry_par->power_mgnt = (u8)rtw_power_mgnt;\n\tregistry_par->ips_mode = (u8)rtw_ips_mode;\n\tregistry_par->radio_enable = (u8)rtw_radio_enable;\n\tregistry_par->long_retry_lmt = (u8)rtw_long_retry_lmt;\n\tregistry_par->short_retry_lmt = (u8)rtw_short_retry_lmt;\n  \tregistry_par->busy_thresh = (u16)rtw_busy_thresh;\n  \t//registry_par->qos_enable = (u8)rtw_qos_enable;\n\tregistry_par->ack_policy = (u8)rtw_ack_policy;\n\tregistry_par->mp_mode = (u8)rtw_mp_mode;\n\tregistry_par->software_encrypt = (u8)rtw_software_encrypt;\n\tregistry_par->software_decrypt = (u8)rtw_software_decrypt;\n\n\tregistry_par->acm_method = (u8)rtw_acm_method;\n\tregistry_par->usb_rxagg_mode = (u8)rtw_usb_rxagg_mode;\n\n\t //UAPSD\n\tregistry_par->wmm_enable = (u8)rtw_wmm_enable;\n\tregistry_par->uapsd_enable = (u8)rtw_uapsd_enable;\n\tregistry_par->uapsd_max_sp = (u8)rtw_uapsd_max_sp;\n\tregistry_par->uapsd_acbk_en = (u8)rtw_uapsd_acbk_en;\n\tregistry_par->uapsd_acbe_en = (u8)rtw_uapsd_acbe_en;\n\tregistry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en;\n\tregistry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en;\n\n\tregistry_par->RegRfKFreeEnable = (u8)rtw_rfkfree_enable;\n\t\n#ifdef CONFIG_80211N_HT\n\tregistry_par->ht_enable = (u8)rtw_ht_enable;\n\tregistry_par->bw_mode = (u8)rtw_bw_mode;\n\tregistry_par->ampdu_enable = (u8)rtw_ampdu_enable;\n\tregistry_par->rx_stbc = (u8)rtw_rx_stbc;\n\tregistry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu;\n\tregistry_par->short_gi = (u8)rtw_short_gi;\n\tregistry_par->ldpc_cap = (u8)rtw_ldpc_cap;\n\tregistry_par->stbc_cap = (u8)rtw_stbc_cap;\n\tregistry_par->beamform_cap = (u8)rtw_beamform_cap;\n\tregistry_par->beamformer_rf_num = (u8)rtw_bfer_rf_number;\n\tregistry_par->beamformee_rf_num = (u8)rtw_bfee_rf_number;\n#endif\n\n#ifdef CONFIG_80211AC_VHT\n\tregistry_par->vht_enable = (u8)rtw_vht_enable;\n\tregistry_par->ampdu_factor = (u8)rtw_ampdu_factor;\n\tregistry_par->vht_rate_sel = (u8)rtw_vht_rate_sel;\n#endif\n\n#ifdef CONFIG_TX_EARLY_MODE\n\tregistry_par->early_mode = (u8)rtw_early_mode;\n#endif\n\tregistry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit;\n\tregistry_par->rf_config = (u8)rtw_rf_config;\n\tregistry_par->low_power = (u8)rtw_low_power;\n\n\n\tregistry_par->wifi_spec = (u8)rtw_wifi_spec;\n\n\tregistry_par->channel_plan = (u8)rtw_channel_plan;\n\tregistry_par->special_rf_path = (u8)rtw_special_rf_path;\n\n#ifdef CONFIG_BT_COEXIST\n\tregistry_par->btcoex = (u8)rtw_btcoex_enable;\n\tregistry_par->bt_iso = (u8)rtw_bt_iso;\n\tregistry_par->bt_sco = (u8)rtw_bt_sco;\n\tregistry_par->bt_ampdu = (u8)rtw_bt_ampdu;\n\tregistry_par->ant_num = (s8)rtw_ant_num;\n#endif\n\n\tregistry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq;\n\n\tregistry_par->antdiv_cfg = (u8)rtw_antdiv_cfg;\n\tregistry_par->antdiv_type = (u8)rtw_antdiv_type;\n\t\n\tregistry_par->switch_usb_mode = (u8)rtw_switch_usb_mode;\n\n#ifdef CONFIG_AUTOSUSPEND\n\tregistry_par->usbss_enable = (u8)rtw_enusbss;//0:disable,1:enable\n#endif\n#ifdef SUPPORT_HW_RFOFF_DETECTED\n\tregistry_par->hwpdn_mode = (u8)rtw_hwpdn_mode;//0:disable,1:enable,2:by EFUSE config\n\tregistry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect;//0:disable,1:enable\n#endif\n\n\tregistry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc;\n\n#ifdef CONFIG_ADAPTOR_INFO_CACHING_FILE\n\tsnprintf(registry_par->adaptor_info_caching_file_path, PATH_LENGTH_MAX, \"%s\", rtw_adaptor_info_caching_file_path);\n\tregistry_par->adaptor_info_caching_file_path[PATH_LENGTH_MAX-1]=0;\n#endif\n\n#ifdef CONFIG_LAYER2_ROAMING\n\tregistry_par->max_roaming_times = (u8)rtw_max_roaming_times;\n#ifdef CONFIG_INTEL_WIDI\n\tregistry_par->max_roaming_times = (u8)rtw_max_roaming_times + 2;\n#endif // CONFIG_INTEL_WIDI\n#endif\n\n#ifdef CONFIG_IOL\n\tregistry_par->fw_iol = rtw_fw_iol;\n#endif\n\n#ifdef CONFIG_80211D\n\tregistry_par->enable80211d = (u8)rtw_80211d;\n#endif\n\n\tsnprintf(registry_par->ifname, 16, \"%s\", ifname);\n\tsnprintf(registry_par->if2name, 16, \"%s\", if2name);\n\n\tregistry_par->notch_filter = (u8)rtw_notch_filter;\n\n#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV\n\tregistry_par->force_ant = (u8)rtw_force_ant;\n\tregistry_par->force_igi = (u8)rtw_force_igi;\n#endif\n\n#ifdef CONFIG_MULTI_VIR_IFACES\n\tregistry_par->ext_iface_num = (u8)rtw_ext_iface_num;\n#endif //CONFIG_MULTI_VIR_IFACES\n\n\tregistry_par->pll_ref_clk_sel = (u8)rtw_pll_ref_clk_sel;\n\n\tregistry_par->RegEnableTxPowerLimit = (u8)rtw_tx_pwr_lmt_enable;\n\tregistry_par->RegEnableTxPowerByRate = (u8)rtw_tx_pwr_by_rate;\n\n\tregistry_par->RegPowerBase = 14;\n\tregistry_par->TxBBSwing_2G = (s8)rtw_TxBBSwing_2G;\n\tregistry_par->TxBBSwing_5G = (s8)rtw_TxBBSwing_5G;\n\tregistry_par->bEn_RFE = 1;\n\tregistry_par->RFE_Type = (u8)rtw_RFE_type;\n\tregistry_par->AmplifierType_2G = (u8)rtw_amplifier_type_2g;\n\tregistry_par->AmplifierType_5G = (u8)rtw_amplifier_type_5g;\n\tregistry_par->GLNA_Type = (u8)rtw_GLNA_type;\n#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE\n\tregistry_par->load_phy_file = (u8)rtw_load_phy_file;\n\tregistry_par->RegDecryptCustomFile = (u8)rtw_decrypt_phy_file;\n#endif\n\tregistry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;\n\n\tregistry_par->hiq_filter = (u8)rtw_hiq_filter;\n\n\tregistry_par->adaptivity_en = (u8)rtw_adaptivity_en;\n\tregistry_par->adaptivity_mode = (u8)rtw_adaptivity_mode;\n\tregistry_par->adaptivity_dml = (u8)rtw_adaptivity_dml;\n\tregistry_par->adaptivity_dc_backoff = (u8)rtw_adaptivity_dc_backoff;\n\tregistry_par->adaptivity_th_l2h_ini = (s8)rtw_adaptivity_th_l2h_ini;\n\tregistry_par->adaptivity_th_edcca_hl_diff = (s8)rtw_adaptivity_th_edcca_hl_diff;\n\n\tregistry_par->boffefusemask = (u8)rtw_OffEfuseMask;\n\tregistry_par->bFileMaskEfuse = (u8)rtw_FileMaskEfuse;\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\tregistry_par->acs_mode = (u8)rtw_acs_mode;\n\tregistry_par->acs_auto_scan = (u8)rtw_acs_auto_scan;\n#endif\n\tregistry_par->reg_rxgain_offset_2g = (u32) rtw_rxgain_offset_2g;\n\tregistry_par->reg_rxgain_offset_5gl = (u32) rtw_rxgain_offset_5gl;\n\tregistry_par->reg_rxgain_offset_5gm = (u32) rtw_rxgain_offset_5gm;\n\tregistry_par->reg_rxgain_offset_5gh = (u32) rtw_rxgain_offset_5gh;\n_func_exit_;\n\treturn status;\n}\n\n/**\n * rtw_net_set_mac_address\n * This callback function is used for the Media Access Control address\n * of each net_device needs to be changed.\n *\n * Arguments:\n * @pnetdev: net_device pointer.\n * @addr: new MAC address.\n *\n * Return:\n * ret = 0: Permit to change net_device's MAC address.\n * ret = -1 (Default): Operation not permitted.\n *\n * Auther: Arvin Liu\n * Date: 2015/05/29\n */\nstatic int rtw_net_set_mac_address(struct net_device *pnetdev, void *addr)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct sockaddr *sa = (struct sockaddr *)addr;\n\tint ret = -1;\n\n\t/* only the net_device is in down state to permit modifying mac addr */\n\tif ((pnetdev->flags & IFF_UP) == _TRUE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\": The net_device's is not in down state\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter));\n\n\t\treturn ret;\n\t}\n\n\t/* if the net_device is linked, it's not permit to modify mac addr */\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) ||\n\t\tcheck_fwstate(pmlmepriv, _FW_LINKED) ||\n\t\tcheck_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\": The net_device's is not idle currently\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter));\n\n\t\treturn ret;\n\t}\n\n\t/* check whether the input mac address is valid to permit modifying mac addr */\n\tif (rtw_check_invalid_mac_address(sa->sa_data, _FALSE) == _TRUE) {\n\t\tDBG_871X(FUNC_ADPT_FMT\": Invalid Mac Addr for \"MAC_FMT\"\\n\"\n\t\t\t, FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));\n\n\t\treturn ret;\n\t}\n\n\t_rtw_memcpy(adapter_mac_addr(padapter), sa->sa_data, ETH_ALEN); /* set mac addr to adapter */\n\t_rtw_memcpy(pnetdev->dev_addr, sa->sa_data, ETH_ALEN); /* set mac addr to net_device */\n\n\trtw_ps_deny(padapter, PS_DENY_IOCTL);\n\tLeaveAllPowerSaveModeDirect(padapter); /* leave PS mode for guaranteeing to access hw register successfully */\n\trtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, sa->sa_data); /* set mac addr to mac register */\n\trtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);\n\n\tDBG_871X(FUNC_ADPT_FMT\": Set Mac Addr to \"MAC_FMT\" Successfully\\n\"\n\t\t, FUNC_ADPT_ARG(padapter), MAC_ARG(sa->sa_data));\n\n\tret = 0;\n\n\treturn ret;\n}\n\nstatic struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct xmit_priv *pxmitpriv = &(padapter->xmitpriv);\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\n\tpadapter->stats.tx_packets = pxmitpriv->tx_pkts;//pxmitpriv->tx_pkts++;\n\tpadapter->stats.rx_packets = precvpriv->rx_pkts;//precvpriv->rx_pkts++;\n\tpadapter->stats.tx_dropped = pxmitpriv->tx_drop;\n\tpadapter->stats.rx_dropped = precvpriv->rx_drop;\n\tpadapter->stats.tx_bytes = pxmitpriv->tx_bytes;\n\tpadapter->stats.rx_bytes = precvpriv->rx_bytes;\n\n\treturn &padapter->stats;\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n/*\n * AC to queue mapping\n *\n * AC_VO -> queue 0\n * AC_VI -> queue 1\n * AC_BE -> queue 2\n * AC_BK -> queue 3\n */\nstatic const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };\n\n/* Given a data frame determine the 802.1p/1d tag to use. */\nunsigned int rtw_classify8021d(struct sk_buff *skb)\n{\n\tunsigned int dscp;\n\n\t/* skb->priority values from 256->263 are magic values to\n\t * directly indicate a specific 802.1d priority.  This is used\n\t * to allow 802.1d priority to be passed directly in from VLAN\n\t * tags, etc.\n\t */\n\tif (skb->priority >= 256 && skb->priority <= 263)\n\t\treturn skb->priority - 256;\n\n\tswitch (skb->protocol) {\n\tcase htons(ETH_P_IP):\n\t\tdscp = ip_hdr(skb)->tos & 0xfc;\n\t\tbreak;\n\tdefault:\n\t\treturn 0;\n\t}\n\n\treturn dscp >> 5;\n}\n\n \nstatic u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)\n\t\t\t\t, struct net_device *accel_priv\n#else\n\t\t\t\t, void *accel_priv\n#endif\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)\n#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)\n\t\t\t\t, select_queue_fallback_t fallback\n#endif\n#endif\n)\n{\n\t_adapter\t*padapter = rtw_netdev_priv(dev);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\n\tskb->priority = rtw_classify8021d(skb);\n\n\tif(pmlmepriv->acm_mask != 0)\n\t{\n\t\tskb->priority = qos_acm(pmlmepriv->acm_mask, skb->priority);\n\t}\n\n\treturn rtw_1d_to_queue[skb->priority];\n}\n\nu16 rtw_recv_select_queue(struct sk_buff *skb)\n{\n\tstruct iphdr *piphdr;\n\tunsigned int dscp;\n\tu16\teth_type;\n\tu32 priority;\n\tu8 *pdata = skb->data;\n\n\t_rtw_memcpy(&eth_type, pdata+(ETH_ALEN<<1), 2);\n\n\tswitch (eth_type) {\n\t\tcase htons(ETH_P_IP):\n\n\t\t\tpiphdr = (struct iphdr *)(pdata+ETH_HLEN);\n\n\t\t\tdscp = piphdr->tos & 0xfc;\n\n\t\t\tpriority = dscp >> 5;\n\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpriority = 0;\n\t}\n\n\treturn rtw_1d_to_queue[priority];\n\n}\n\n#endif\nstatic int rtw_ndev_notifier_call(struct notifier_block * nb, unsigned long state, void *ptr)\n{\t\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(3,11,0))\n\tstruct net_device *dev = netdev_notifier_info_to_dev(ptr);\n#else\n\tstruct net_device *dev = ptr;\n#endif\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\n\tif (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl)\n#else\n\tif (dev->do_ioctl != rtw_ioctl)\n#endif\n\t\treturn NOTIFY_DONE;\n\n\tDBG_871X_LEVEL(_drv_info_, FUNC_NDEV_FMT\" state:%lu\\n\", FUNC_NDEV_ARG(dev), state);\n\n\tswitch (state) {\n\tcase NETDEV_CHANGENAME:\n\t\trtw_adapter_proc_replace(dev);\n\t\tbreak;\n\t}\n\n\treturn NOTIFY_DONE;\n}\n\nstatic struct notifier_block rtw_ndev_notifier = {\n\t.notifier_call = rtw_ndev_notifier_call,\n};\n\nint rtw_ndev_notifier_register(void)\n{\n\treturn register_netdevice_notifier(&rtw_ndev_notifier);\n}\n\nvoid rtw_ndev_notifier_unregister(void)\n{\n\tunregister_netdevice_notifier(&rtw_ndev_notifier);\n}\n\n\nint rtw_ndev_init(struct net_device *dev)\n{\n\t_adapter *adapter = rtw_netdev_priv(dev);\n\n\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" if%d mac_addr=\"MAC_FMT\"\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), (adapter->iface_id+1), MAC_ARG(dev->dev_addr));\n\tstrncpy(adapter->old_ifname, dev->name, IFNAMSIZ);\n\tadapter->old_ifname[IFNAMSIZ-1] = '\\0';\n\trtw_adapter_proc_init(dev);\n\n\treturn 0;\n}\n\nvoid rtw_ndev_uninit(struct net_device *dev)\n{\n\t_adapter *adapter = rtw_netdev_priv(dev);\n\n\tDBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT\" if%d\\n\"\n\t\t, FUNC_ADPT_ARG(adapter), (adapter->iface_id+1));\n\trtw_adapter_proc_deinit(dev);\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\nstatic const struct net_device_ops rtw_netdev_ops = {\n\t.ndo_init = rtw_ndev_init,\n\t.ndo_uninit = rtw_ndev_uninit,\n\t.ndo_open = netdev_open,\n\t.ndo_stop = netdev_close,\n\t.ndo_start_xmit = rtw_xmit_entry,\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t.ndo_select_queue\t= rtw_select_queue,\n#endif\n\t.ndo_set_mac_address = rtw_net_set_mac_address,\n\t.ndo_get_stats = rtw_net_get_stats,\n\t.ndo_do_ioctl = rtw_ioctl,\n};\n#endif\n\nint rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname)\n{\n\t_adapter *padapter = rtw_netdev_priv(pnetdev);\n\n#ifdef CONFIG_EASY_REPLACEMENT\n\tstruct net_device\t*TargetNetdev = NULL;\n\t_adapter\t\t\t*TargetAdapter = NULL;\n\tstruct net \t\t*devnet = NULL;\n\n\tif(padapter->bDongle == 1)\n\t{\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n\t\tTargetNetdev = dev_get_by_name(\"wlan0\");\n#else\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))\n\t\tdevnet = pnetdev->nd_net;\n\t#else\n\t\tdevnet = dev_net(pnetdev);\n\t#endif\n\t\tTargetNetdev = dev_get_by_name(devnet, \"wlan0\");\n#endif\n\t\tif(TargetNetdev) {\n\t\t\tDBG_871X(\"Force onboard module driver disappear !!!\\n\");\n\t\t\tTargetAdapter = rtw_netdev_priv(TargetNetdev);\n\t\t\tTargetAdapter->DriverState = DRIVER_DISAPPEAR;\n\n\t\t\tpadapter->pid[0] = TargetAdapter->pid[0];\n\t\t\tpadapter->pid[1] = TargetAdapter->pid[1];\n\t\t\tpadapter->pid[2] = TargetAdapter->pid[2];\n\n\t\t\tdev_put(TargetNetdev);\n\t\t\tunregister_netdev(TargetNetdev);\n\n\t\t\tpadapter->DriverState = DRIVER_REPLACE_DONGLE;\n\t\t}\n\t}\n#endif //CONFIG_EASY_REPLACEMENT\n\n\tif(dev_alloc_name(pnetdev, ifname) < 0)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"dev_alloc_name, fail! \\n\"));\n\t}\n\n\tnetif_carrier_off(pnetdev);\n\t//rtw_netif_stop_queue(pnetdev);\n\n\treturn 0;\n}\n\nvoid rtw_hook_if_ops(struct net_device *ndev)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))\n\tndev->netdev_ops = &rtw_netdev_ops;\n#else\n\tndev->init = rtw_ndev_init;\n\tndev->uninit = rtw_ndev_uninit;\n\tndev->open = netdev_open;\n\tndev->stop = netdev_close;\n\tndev->hard_start_xmit = rtw_xmit_entry;\n\tndev->set_mac_address = rtw_net_set_mac_address;\n\tndev->get_stats = rtw_net_get_stats;\n\tndev->do_ioctl = rtw_ioctl;\n#endif\n}\n\nstruct net_device *rtw_init_netdev(_adapter *old_padapter)\n{\n\t_adapter *padapter;\n\tstruct net_device *pnetdev;\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+init_net_dev\\n\"));\n\n\tif(old_padapter != NULL)\n\t\tpnetdev = rtw_alloc_etherdev_with_old_priv(sizeof(_adapter), (void *)old_padapter);\n\telse\n\t\tpnetdev = rtw_alloc_etherdev(sizeof(_adapter));\n\n\tif (!pnetdev)\n\t\treturn NULL;\n\n\tpadapter = rtw_netdev_priv(pnetdev);\n\tpadapter->pnetdev = pnetdev;\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)\n\tSET_MODULE_OWNER(pnetdev);\n#endif\n\n\trtw_hook_if_ops(pnetdev);\n\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\tpnetdev->features |= NETIF_F_IP_CSUM;\n#endif\n\n\t//pnetdev->tx_timeout = NULL;\n\tpnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */\n\n#ifdef CONFIG_WIRELESS_EXT\n\tpnetdev->wireless_handlers = (struct iw_handler_def *)&rtw_handlers_def;\n#endif\n\n#ifdef WIRELESS_SPY\n\t//priv->wireless_data.spy_data = &priv->spy_data;\n\t//pnetdev->wireless_data = &priv->wireless_data;\n#endif\n\n\treturn pnetdev;\n}\n\nint rtw_os_ndev_alloc(_adapter *adapter)\n{\n\tint ret = _FAIL;\n\tstruct net_device *ndev = NULL;\n\n\tndev = rtw_init_netdev(adapter);\n\tif (ndev == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\t#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)\n\tSET_NETDEV_DEV(ndev, dvobj_to_dev(adapter_to_dvobj(adapter)));\n\t#endif\n\n\t#ifdef CONFIG_PCI_HCI\n\tif (adapter_to_dvobj(adapter)->bdma64)\n\t\tndev->features |= NETIF_F_HIGHDMA;\n\tndev->irq = adapter_to_dvobj(adapter)->irq;\n\t#endif\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (rtw_cfg80211_ndev_res_alloc(adapter) != _SUCCESS) {\n\t\trtw_warn_on(1);\n\t\tgoto free_ndev;\n\t}\n#endif\n\n\tret = _SUCCESS;\n\nfree_ndev:\n\tif (ret != _SUCCESS && ndev)\n\t\trtw_free_netdev(ndev);\nexit:\n\treturn ret;\n}\n\nvoid rtw_os_ndev_free(_adapter *adapter)\n{\n#if defined(CONFIG_IOCTL_CFG80211)\n\trtw_cfg80211_ndev_res_free(adapter);\n#endif\n\n\tif (adapter->pnetdev) {\n\t\trtw_free_netdev(adapter->pnetdev);\n\t\tadapter->pnetdev = NULL;\n\t}\n}\n\nint rtw_os_ndev_register(_adapter *adapter, char *name)\n{\n\tint ret = _SUCCESS;\n\tstruct net_device *ndev = adapter->pnetdev;\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (rtw_cfg80211_ndev_res_register(adapter) != _SUCCESS) {\n\t\trtw_warn_on(1);\n\t\tret = _FAIL;\n\t\tgoto exit;\n\t}\n#endif\n\n\t/* alloc netdev name */\n\trtw_init_netdev_name(ndev, name);\n\n\t_rtw_memcpy(ndev->dev_addr, adapter_mac_addr(adapter), ETH_ALEN);\n\n\t/* Tell the network stack we exist */\n\tif (register_netdev(ndev) != 0) {\n\t\tDBG_871X(FUNC_NDEV_FMT\" if%d Failed!\\n\", FUNC_NDEV_ARG(ndev), (adapter->iface_id+1));\n\t\tret = _FAIL;\n\t}\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (ret != _SUCCESS) {\n\t\trtw_cfg80211_ndev_res_unregister(adapter);\n\t\t#if !defined(RTW_SINGLE_WIPHY)\n\t\trtw_wiphy_unregister(adapter_to_wiphy(adapter));\n\t\t#endif\n\t}\n#endif\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_os_ndev_unregister(_adapter *adapter)\n{\n\tstruct net_device *netdev = NULL;\n\n\tif (adapter == NULL)\n\t\treturn;\n\n\tadapter->ndev_unregistering = 1;\n\n\tnetdev = adapter->pnetdev;\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\trtw_cfg80211_ndev_res_unregister(adapter);\n#endif\n\n\tif ((adapter->DriverState != DRIVER_DISAPPEAR) && netdev)\n\t\tunregister_netdev(netdev); /* will call netdev_close() */\n\n#if defined(CONFIG_IOCTL_CFG80211) && !defined(RTW_SINGLE_WIPHY)\n\trtw_wiphy_unregister(adapter_to_wiphy(adapter));\n#endif\n\n\tadapter->ndev_unregistering = 0;\n}\n\n/**\n * rtw_os_ndev_init - Allocate and register OS layer net device and relating structures for @adapter\n * @adapter: the adapter on which this function applies\n * @name: the requesting net device name\n *\n * Returns:\n * _SUCCESS or _FAIL\n */\nint rtw_os_ndev_init(_adapter *adapter, char *name)\n{\n\tint ret = _FAIL;\n\n\tif (rtw_os_ndev_alloc(adapter) != _SUCCESS)\n\t\tgoto exit;\n\n\tif (rtw_os_ndev_register(adapter, name) != _SUCCESS)\n\t\tgoto os_ndev_free;\n\n\tret = _SUCCESS;\n\nos_ndev_free:\n\tif (ret != _SUCCESS)\n\t\trtw_os_ndev_free(adapter);\nexit:\n\treturn ret;\n}\n\n/**\n * rtw_os_ndev_deinit - Unregister and free OS layer net device and relating structures for @adapter\n * @adapter: the adapter on which this function applies\n */\nvoid rtw_os_ndev_deinit(_adapter *adapter)\n{\n\trtw_os_ndev_unregister(adapter);\n\trtw_os_ndev_free(adapter);\n}\n\nint rtw_os_ndevs_alloc(struct dvobj_priv *dvobj)\n{\n\tint i, status = _SUCCESS;\n\t_adapter *adapter;\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (rtw_cfg80211_dev_res_alloc(dvobj) != _SUCCESS) {\n\t\trtw_warn_on(1);\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n#endif\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\n\t\tif (i >= IFACE_ID_MAX) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s %d >= IFACE_ID_MAX\\n\", __func__, i);\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tadapter = dvobj->padapters[i];\n\t\tif (adapter && !adapter->pnetdev) {\n\t\t\tstatus = rtw_os_ndev_alloc(adapter);\n\t\t\tif (status != _SUCCESS) {\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (status != _SUCCESS) {\n\t\tfor (; i >= 0; i--) {\n\t\t\tadapter = dvobj->padapters[i];\n\t\t\tif (adapter && adapter->pnetdev)\n\t\t\t\trtw_os_ndev_free(adapter);\n\t\t}\n\t}\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (status != _SUCCESS)\n\t\trtw_cfg80211_dev_res_free(dvobj);\n#endif\nexit:\n\treturn status;\n}\n\nvoid rtw_os_ndevs_free(struct dvobj_priv *dvobj)\n{\n\tint i;\n\t_adapter *adapter = NULL;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\n\t\tif (i >= IFACE_ID_MAX) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s %d >= IFACE_ID_MAX\\n\", __func__, i);\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tadapter = dvobj->padapters[i];\n\n\t\tif (adapter == NULL)\n\t\t\tcontinue;\n\n\t\trtw_os_ndev_free(adapter);\n\t}\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\trtw_cfg80211_dev_res_free(dvobj);\n#endif\n}\n\nu32 rtw_start_drv_threads(_adapter *padapter)\n{\n\tu32 _status = _SUCCESS;\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+rtw_start_drv_threads\\n\"));\n\n#ifdef CONFIG_XMIT_THREAD_MODE\n#if defined(CONFIG_SDIO_HCI)\n\tif (is_primary_adapter(padapter))\n#endif\t\t\n\t{\n\t\tpadapter->xmitThread = kthread_run(rtw_xmit_thread, padapter, \"RTW_XMIT_THREAD\");\n\t\tif(IS_ERR(padapter->xmitThread))\n\t\t\t_status = _FAIL;\n\t}\n#endif //#ifdef CONFIG_XMIT_THREAD_MODE\n\n#ifdef CONFIG_RECV_THREAD_MODE\n\tpadapter->recvThread = kthread_run(rtw_recv_thread, padapter, \"RTW_RECV_THREAD\");\n\tif(IS_ERR(padapter->recvThread))\n\t\t_status = _FAIL;\n#endif\n\n\tif (is_primary_adapter(padapter)) {\n\t\tpadapter->cmdThread = kthread_run(rtw_cmd_thread, padapter, \"RTW_CMD_THREAD\");\n\t        if(IS_ERR(padapter->cmdThread))\n\t\t\t_status = _FAIL;\n\t\telse\n\t\t\t_rtw_down_sema(&padapter->cmdpriv.terminate_cmdthread_sema); //wait for cmd_thread to run\n\t}\n\n\n#ifdef CONFIG_EVENT_THREAD_MODE\n\tpadapter->evtThread = kthread_run(event_thread, padapter, \"RTW_EVENT_THREAD\");\n\tif(IS_ERR(padapter->evtThread))\n\t\t_status = _FAIL;\n#endif\n\n\trtw_hal_start_thread(padapter);\n\treturn _status;\n\n}\n\nvoid rtw_stop_drv_threads (_adapter *padapter)\n{\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+rtw_stop_drv_threads\\n\"));\n\n\tif (is_primary_adapter(padapter))\n\t\trtw_stop_cmd_thread(padapter);\n\n#ifdef CONFIG_EVENT_THREAD_MODE\n        _rtw_up_sema(&padapter->evtpriv.evt_notify);\n\tif(padapter->evtThread){\n\t\t_rtw_down_sema(&padapter->evtpriv.terminate_evtthread_sema);\n\t}\n#endif\n\n#ifdef CONFIG_XMIT_THREAD_MODE\n\t// Below is to termindate tx_thread...\n#if defined(CONFIG_SDIO_HCI) \n\t// Only wake-up primary adapter\n\tif (is_primary_adapter(padapter))\n#endif  /*SDIO_HCI */\n\t{\n\t\t_rtw_up_sema(&padapter->xmitpriv.xmit_sema);\n\t\t_rtw_down_sema(&padapter->xmitpriv.terminate_xmitthread_sema);\n\t}\n\tRT_TRACE(_module_os_intfs_c_, _drv_info_, (\"\\n drv_halt: rtw_xmit_thread can be terminated !\\n\"));\n#endif\n\n#ifdef CONFIG_RECV_THREAD_MODE\n\t// Below is to termindate rx_thread...\n\t_rtw_up_sema(&padapter->recvpriv.recv_sema);\n\t_rtw_down_sema(&padapter->recvpriv.terminate_recvthread_sema);\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"\\n drv_halt:recv_thread can be terminated! \\n\"));\n#endif\n\n\trtw_hal_stop_thread(padapter);\n}\n\nu8 rtw_init_default_value(_adapter *padapter);\nu8 rtw_init_default_value(_adapter *padapter)\n{\n\tu8 ret  = _SUCCESS;\n\tstruct registry_priv* pregistrypriv = &padapter->registrypriv;\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct mlme_priv *pmlmepriv= &padapter->mlmepriv;\n\tstruct security_priv *psecuritypriv = &padapter->securitypriv;\n\n\t//xmit_priv\n\tpxmitpriv->vcs_setting = pregistrypriv->vrtl_carrier_sense;\n\tpxmitpriv->vcs = pregistrypriv->vcs_type;\n\tpxmitpriv->vcs_type = pregistrypriv->vcs_type;\n\t//pxmitpriv->rts_thresh = pregistrypriv->rts_thresh;\n\tpxmitpriv->frag_len = pregistrypriv->frag_thresh;\n\n\t//recv_priv\n\n\t//mlme_priv\n\tpmlmepriv->scan_mode = SCAN_ACTIVE;\n\n\t//qos_priv\n\t//pmlmepriv->qospriv.qos_option = pregistrypriv->wmm_enable;\n\n\t//ht_priv\n#ifdef CONFIG_80211N_HT\n\tpmlmepriv->htpriv.ampdu_enable = _FALSE;//set to disabled\n#endif\n\n\t//security_priv\n\t//rtw_get_encrypt_decrypt_from_registrypriv(padapter);\n\tpsecuritypriv->binstallGrpkey = _FAIL;\n#ifdef CONFIG_GTK_OL\n\tpsecuritypriv->binstallKCK_KEK = _FAIL;\n#endif //CONFIG_GTK_OL\n\tpsecuritypriv->sw_encrypt=pregistrypriv->software_encrypt;\n\tpsecuritypriv->sw_decrypt=pregistrypriv->software_decrypt;\n\n\tpsecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system\n\tpsecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;\n\n\tpsecuritypriv->dot11PrivacyKeyIndex = 0;\n\n\tpsecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;\n\tpsecuritypriv->dot118021XGrpKeyid = 1;\n\n\tpsecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;\n\tpsecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled;\n\n\n\t//pwrctrl_priv\n\n\n\t//registry_priv\n\trtw_init_registrypriv_dev_network(padapter);\n\trtw_update_registrypriv_dev_network(padapter);\n\n\n\t//hal_priv\n\trtw_hal_def_value_init(padapter);\n\n\t//misc.\n\tRTW_ENABLE_FUNC(padapter, DF_RX_BIT);\n\tRTW_ENABLE_FUNC(padapter, DF_TX_BIT);\n\tpadapter->bLinkInfoDump = 0;\n\tpadapter->bNotifyChannelChange = _FALSE;\n#ifdef CONFIG_P2P\n\tpadapter->bShowGetP2PState = 1;\n#endif\n\n\t//for debug purpose\n\tpadapter->fix_rate = 0xFF;\n\tpadapter->data_fb = 0;\n\tpadapter->driver_ampdu_spacing = 0xFF;\n\tpadapter->driver_rx_ampdu_factor =  0xFF;\n\tpadapter->driver_rx_ampdu_spacing = 0xFF;\n\tpadapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;\n\tpadapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;\n#ifdef DBG_RX_COUNTER_DUMP\n\tpadapter->dump_rx_cnt_mode = 0;\n\tpadapter->drv_rx_cnt_ok = 0;\n\tpadapter->drv_rx_cnt_crcerror = 0;\n\tpadapter->drv_rx_cnt_drop = 0;\n#endif\t\n\treturn ret;\n}\n\nstruct dvobj_priv *devobj_init(void)\n{\n\tstruct dvobj_priv *pdvobj = NULL;\n\n\tif ((pdvobj = (struct dvobj_priv*)rtw_zmalloc(sizeof(*pdvobj))) == NULL) \n\t{\n\t\treturn NULL;\n\t}\n\n\t_rtw_mutex_init(&pdvobj->hw_init_mutex);\n\t_rtw_mutex_init(&pdvobj->h2c_fwcmd_mutex);\n\t_rtw_mutex_init(&pdvobj->setch_mutex);\n\t_rtw_mutex_init(&pdvobj->setbw_mutex);\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\t_rtw_mutex_init(&pdvobj->sd_indirect_access_mutex);\n#endif\n\n\tpdvobj->processing_dev_remove = _FALSE;\n\n\tATOMIC_SET(&pdvobj->disable_func, 0);\n\n\trtw_macid_ctl_init(&pdvobj->macid_ctl);\n\t_rtw_spinlock_init(&pdvobj->cam_ctl.lock);\n\t_rtw_mutex_init(&pdvobj->cam_ctl.sec_cam_access_mutex);\n\n\treturn pdvobj;\n\n}\n\nvoid devobj_deinit(struct dvobj_priv *pdvobj)\n{\n\tif(!pdvobj)\n\t\treturn;\n\n\t/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */\n#if defined(CONFIG_IOCTL_CFG80211)\n\trtw_cfg80211_dev_res_free(pdvobj);\n#endif\n\n\t_rtw_mutex_free(&pdvobj->hw_init_mutex);\n\t_rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex);\n\t_rtw_mutex_free(&pdvobj->setch_mutex);\n\t_rtw_mutex_free(&pdvobj->setbw_mutex);\n#ifdef CONFIG_SDIO_INDIRECT_ACCESS\n\t_rtw_mutex_free(&pdvobj->sd_indirect_access_mutex);\n#endif\n\n\trtw_macid_ctl_deinit(&pdvobj->macid_ctl);\n\t_rtw_spinlock_free(&pdvobj->cam_ctl.lock);\n\t_rtw_mutex_free(&pdvobj->cam_ctl.sec_cam_access_mutex);\n\n\trtw_mfree((u8*)pdvobj, sizeof(*pdvobj));\n}\t\n\nu8 rtw_reset_drv_sw(_adapter *padapter)\n{\n\tu8\tret8=_SUCCESS;\n\tstruct mlme_priv *pmlmepriv= &padapter->mlmepriv;\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\t//hal_priv\n\tif( is_primary_adapter(padapter))\n\t\trtw_hal_def_value_init(padapter);\n\n\tRTW_ENABLE_FUNC(padapter, DF_RX_BIT);\n\tRTW_ENABLE_FUNC(padapter, DF_TX_BIT);\n\tpadapter->bLinkInfoDump = 0;\n\n\tpadapter->xmitpriv.tx_pkts = 0;\n\tpadapter->recvpriv.rx_pkts = 0;\n\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;\n\n\t//pmlmepriv->LinkDetectInfo.TrafficBusyState = _FALSE;\n\tpmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;\n\tpmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;\n\n\t_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY |_FW_UNDER_LINKING);\n\n#ifdef CONFIG_AUTOSUSPEND\n\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))\n\t\tadapter_to_dvobj(padapter)->pusbdev->autosuspend_disabled = 1;//autosuspend disabled by the user\n\t#endif\n#endif\n\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tif (is_primary_adapter(padapter))\n\t\trtw_hal_sreset_reset_value(padapter);\n#endif\n\tpwrctrlpriv->pwr_state_check_cnts = 0;\n\n\t//mlmeextpriv\n\tmlmeext_set_scan_state(&padapter->mlmeextpriv, SCAN_DISABLE);\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\trtw_set_signal_stat_timer(&padapter->recvpriv);\n#endif\n\n\treturn ret8;\n}\n\n\nu8 rtw_init_drv_sw(_adapter *padapter)\n{\n\n\tu8\tret8=_SUCCESS;\n\n_func_enter_;\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+rtw_init_drv_sw\\n\"));\n\n\tret8 = rtw_init_default_value(padapter);\n\n\tif ((rtw_init_cmd_priv(&padapter->cmdpriv)) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't init cmd_priv\\n\"));\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tpadapter->cmdpriv.padapter=padapter;\n\n\tif ((rtw_init_evt_priv(&padapter->evtpriv)) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't init evt_priv\\n\"));\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n\n\tif (rtw_init_mlme_priv(padapter) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't init mlme_priv\\n\"));\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_P2P\n\trtw_init_wifidirect_timers(padapter);\n\tinit_wifidirect_info(padapter, P2P_ROLE_DISABLE);\n\treset_global_wifidirect_info(padapter);\n\t#ifdef CONFIG_IOCTL_CFG80211\n\trtw_init_cfg80211_wifidirect_info(padapter);\n\t#endif\n#ifdef CONFIG_WFD\n\tif(rtw_init_wifi_display_info(padapter) == _FAIL)\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't init init_wifi_display_info\\n\"));\n#endif\n#endif /* CONFIG_P2P */\n\n\tif(init_mlme_ext_priv(padapter) == _FAIL)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't init mlme_ext_priv\\n\"));\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_TDLS\n\tif(rtw_init_tdls_info(padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"Can't rtw_init_tdls_info\\n\");\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n#endif //CONFIG_TDLS\n\n\tif(_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"Can't _rtw_init_xmit_priv\\n\");\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tif(_rtw_init_recv_priv(&padapter->recvpriv, padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"Can't _rtw_init_recv_priv\\n\");\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\t// add for CONFIG_IEEE80211W, none 11w also can use\n\t_rtw_spinlock_init(&padapter->security_key_mutex);\n\t\n\t// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().\n\t//_rtw_memset((unsigned char *)&padapter->securitypriv, 0, sizeof (struct security_priv));\n\n\t//_init_timer(&(padapter->securitypriv.tkip_timer), padapter->pifp, rtw_use_tkipkey_handler, padapter);\n\n\tif(_rtw_init_sta_priv(&padapter->stapriv) == _FAIL)\n\t{\n\t\tDBG_871X(\"Can't _rtw_init_sta_priv\\n\");\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n\n\tpadapter->stapriv.padapter = padapter;\n\tpadapter->setband = WIFI_FREQUENCY_BAND_AUTO;\n\tpadapter->fix_rate = 0xFF;\n\tpadapter->data_fb = 0;\n\tpadapter->fix_rx_ampdu_accept = RX_AMPDU_ACCEPT_INVALID;\n\tpadapter->fix_rx_ampdu_size = RX_AMPDU_SIZE_INVALID;\n#ifdef DBG_RX_COUNTER_DUMP\n\tpadapter->dump_rx_cnt_mode = 0;\n\tpadapter->drv_rx_cnt_ok = 0;\n\tpadapter->drv_rx_cnt_crcerror = 0;\n\tpadapter->drv_rx_cnt_drop = 0;\n#endif\t\n\trtw_init_bcmc_stainfo(padapter);\n\n\trtw_init_pwrctrl_priv(padapter);\n\n\t//_rtw_memset((u8 *)&padapter->qospriv, 0, sizeof (struct qos_priv));//move to mlme_priv\n\n#ifdef CONFIG_MP_INCLUDED\n\tif (init_mp_priv(padapter) == _FAIL) {\n\t\tDBG_871X(\"%s: initialize MP private data Fail!\\n\", __func__);\n\t}\n#endif\n\n\trtw_hal_dm_init(padapter);\n#ifdef CONFIG_SW_LED\n\trtw_hal_sw_led_init(padapter);\n#endif\n#ifdef DBG_CONFIG_ERROR_DETECT\n\trtw_hal_sreset_init(padapter);\n#endif\n\n#ifdef CONFIG_INTEL_WIDI\n\tif(rtw_init_intel_widi(padapter) == _FAIL)\n\t{\n\t\tDBG_871X(\"Can't rtw_init_intel_widi\\n\");\n\t\tret8=_FAIL;\n\t\tgoto exit;\n\t}\n#endif //CONFIG_INTEL_WIDI\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tpadapter->WapiSupport = true; //set true temp, will revise according to Efuse or Registry value later.\n\trtw_wapi_init(padapter);\n#endif\n\n#ifdef CONFIG_BR_EXT\n\t_rtw_spinlock_init(&padapter->br_ext_lock);\n#endif\t// CONFIG_BR_EXT\n\nexit:\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"-rtw_init_drv_sw\\n\"));\n\n\t_func_exit_;\n\n\treturn ret8;\n\n}\n\n#ifdef CONFIG_WOWLAN\nvoid rtw_cancel_dynamic_chk_timer(_adapter *padapter)\n{\n\t_cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer);\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"rtw_cancel_all_timer:cancel dynamic_chk_timer! \\n\"));\n}\n#endif\n\nvoid rtw_cancel_all_timer(_adapter *padapter)\n{\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+rtw_cancel_all_timer\\n\"));\n\n\t_cancel_timer_ex(&padapter->mlmepriv.assoc_timer);\n\tRT_TRACE(_module_os_intfs_c_, _drv_info_, (\"rtw_cancel_all_timer:cancel association timer complete!\\n\"));\n\n\t#if 0\n\t_cancel_timer_ex(&padapter->securitypriv.tkip_timer);\n\tRT_TRACE(_module_os_intfs_c_, _drv_info_, (\"rtw_cancel_all_timer:cancel tkip_timer!\\n\"));\n\t#endif\n\n\t_cancel_timer_ex(&padapter->mlmepriv.scan_to_timer);\n\tRT_TRACE(_module_os_intfs_c_, _drv_info_, (\"rtw_cancel_all_timer:cancel scan_to_timer!\\n\"));\n\n\t#ifdef CONFIG_DFS_MASTER\n\t_cancel_timer_ex(&padapter->mlmepriv.dfs_master_timer);\n\t#endif\n\n\t_cancel_timer_ex(&padapter->mlmepriv.dynamic_chk_timer);\n\tRT_TRACE(_module_os_intfs_c_, _drv_info_, (\"rtw_cancel_all_timer:cancel dynamic_chk_timer!\\n\"));\n\n\t// cancel sw led timer\n\trtw_hal_sw_led_deinit(padapter);\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"rtw_cancel_all_timer:cancel DeInitSwLeds! \\n\"));\n\n\t_cancel_timer_ex(&(adapter_to_pwrctl(padapter)->pwr_state_check_timer));\n\n#ifdef CONFIG_IOCTL_CFG80211\n#ifdef CONFIG_P2P\n\t_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\n#endif //CONFIG_P2P\n#endif //CONFIG_IOCTL_CFG80211\n\n#ifdef CONFIG_SET_SCAN_DENY_TIMER\n\t_cancel_timer_ex(&padapter->mlmepriv.set_scan_deny_timer);\n\trtw_clear_scan_deny(padapter);\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"rtw_cancel_all_timer:cancel set_scan_deny_timer! \\n\"));\n#endif\n\n#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS\n\t_cancel_timer_ex(&padapter->recvpriv.signal_stat_timer);\n#endif\n\t//cancel dm timer\n\trtw_hal_dm_deinit(padapter);\n\n#ifdef CONFIG_PLATFORM_FS_MX61\n\tmsleep(50);\n#endif\n}\n\nu8 rtw_free_drv_sw(_adapter *padapter)\n{\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"==>rtw_free_drv_sw\"));\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_wapi_free(padapter);\n#endif\n\n\t//we can call rtw_p2p_enable here, but:\n\t// 1. rtw_p2p_enable may have IO operation\n\t// 2. rtw_p2p_enable is bundled with wext interface\n\t#ifdef CONFIG_P2P\n\t{\n\t\tstruct wifidirect_info *pwdinfo = &padapter->wdinfo;\n\t\tif(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))\n\t\t{\n\t\t\t_cancel_timer_ex( &pwdinfo->find_phase_timer );\n\t\t\t_cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );\n\t\t\t_cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t\t_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer );\n#endif // CONFIG_CONCURRENT_MODE\n\t\t\trtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);\n\t\t}\n\t}\n\t#endif\n\t// add for CONFIG_IEEE80211W, none 11w also can use\n\t_rtw_spinlock_free(&padapter->security_key_mutex);\n\t\n#ifdef CONFIG_BR_EXT\n\t_rtw_spinlock_free(&padapter->br_ext_lock);\n#endif\t// CONFIG_BR_EXT\n\n#ifdef CONFIG_INTEL_WIDI\n\trtw_free_intel_widi(padapter);\n#endif //CONFIG_INTEL_WIDI\n\n\tfree_mlme_ext_priv(&padapter->mlmeextpriv);\n\n#ifdef CONFIG_TDLS\n\t//rtw_free_tdls_info(&padapter->tdlsinfo);\n#endif //CONFIG_TDLS\n\n\trtw_free_cmd_priv(&padapter->cmdpriv);\n\n\trtw_free_evt_priv(&padapter->evtpriv);\n\n\trtw_free_mlme_priv(&padapter->mlmepriv);\n\n\t//free_io_queue(padapter);\n\n\t_rtw_free_xmit_priv(&padapter->xmitpriv);\n\n\t_rtw_free_sta_priv(&padapter->stapriv); //will free bcmc_stainfo here\n\n\t_rtw_free_recv_priv(&padapter->recvpriv);\n\n\trtw_free_pwrctrl_priv(padapter);\n\n\t//rtw_mfree((void *)padapter, sizeof (padapter));\n\n#ifdef CONFIG_DRVEXT_MODULE\n\tfree_drvext(&padapter->drvextpriv);\n#endif\n\n\trtw_hal_free_data(padapter);\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"<==rtw_free_drv_sw\\n\"));\n\n\t//free the old_pnetdev\n\tif(padapter->rereg_nd_name_priv.old_pnetdev) {\n\t\tfree_netdev(padapter->rereg_nd_name_priv.old_pnetdev);\n\t\tpadapter->rereg_nd_name_priv.old_pnetdev = NULL;\n\t}\n\n\t// clear pbuddy_adapter to avoid access wrong pointer.\n\tif(padapter->pbuddy_adapter != NULL) {\n\t\tpadapter->pbuddy_adapter->pbuddy_adapter = NULL;\n\t}\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"-rtw_free_drv_sw\\n\"));\n\n\treturn _SUCCESS;\n\n}\n\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_MULTI_VIR_IFACES\nint _netdev_vir_if_open(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\t_adapter *primary_padapter = GET_PRIMARY_ADAPTER(padapter);\n\n\tDBG_871X(FUNC_NDEV_FMT\" enter\\n\", FUNC_NDEV_ARG(pnetdev));\n\n\tif(!primary_padapter)\n\t\tgoto _netdev_virtual_iface_open_error;\n\n\tif (primary_padapter->bup == _FALSE || !rtw_is_hw_init_completed(primary_padapter))\n\t\t_netdev_open(primary_padapter->pnetdev);\n\n\tif(padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&\n\t\trtw_is_hw_init_completed(primary_padapter))\n\t{\n\t\tpadapter->bFWReady = primary_padapter->bFWReady;\n\n\t\tif(rtw_start_drv_threads(padapter) == _FAIL)\n\t\t{\n\t\t\tgoto _netdev_virtual_iface_open_error;\n\t\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\trtw_cfg80211_init_wiphy(padapter);\n#endif\n\n\t\tpadapter->bup = _TRUE;\n\n\t}\n\n\tpadapter->net_closed = _FALSE;\n\n\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n\n\trtw_netif_wake_queue(pnetdev);\n\n\tDBG_871X(FUNC_NDEV_FMT\" exit\\n\", FUNC_NDEV_ARG(pnetdev));\n\treturn 0;\n\n_netdev_virtual_iface_open_error:\n\n\tpadapter->bup = _FALSE;\n\n\tnetif_carrier_off(pnetdev);\n\trtw_netif_stop_queue(pnetdev);\n\n\treturn (-1);\n\n}\n\nint netdev_vir_if_open(struct net_device *pnetdev)\n{\n\tint ret;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\tret = _netdev_vir_if_open(pnetdev);\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\n#ifdef CONFIG_AUTO_AP_MODE\n\t//if(padapter->iface_id == 2)\n\t//\trtw_start_auto_ap(padapter);\n#endif\n\n\treturn ret;\n}\n\nstatic int netdev_vir_if_close(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\n\tpadapter->net_closed = _TRUE;\n\n\tif(pnetdev)\n\t{\n\t\trtw_netif_stop_queue(pnetdev);\n\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_scan_abort(padapter);\n\trtw_cfg80211_wait_scan_req_empty(padapter, 200);\n\tadapter_wdev_data(padapter)->bandroid_scan = _FALSE;\n#endif\n\n\treturn 0;\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\nstatic const struct net_device_ops rtw_netdev_vir_if_ops = {\n\t .ndo_open = netdev_vir_if_open,\n        .ndo_stop = netdev_vir_if_close,\n        .ndo_start_xmit = rtw_xmit_entry,\n        .ndo_set_mac_address = rtw_net_set_mac_address,\n        .ndo_get_stats = rtw_net_get_stats,\n        .ndo_do_ioctl = rtw_ioctl,\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t.ndo_select_queue\t= rtw_select_queue,\n#endif\n};\n#endif\n\nvoid rtw_hook_vir_if_ops(struct net_device *ndev)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))\n\tndev->netdev_ops = &rtw_netdev_vir_if_ops;\n#else\n\tndev->open = netdev_vir_if_open;\n\tndev->stop = netdev_vir_if_close;\n\tndev->set_mac_address = rtw_net_set_mac_address;\n#endif\n}\n\n_adapter *rtw_drv_add_vir_if(_adapter *primary_padapter,\n\tvoid (*set_intf_ops)(_adapter *primary_padapter,struct _io_ops *pops))\n{\n\tint res = _FAIL;\n\t_adapter *padapter = NULL;\n\tstruct dvobj_priv *pdvobjpriv;\n\tu8 mac[ETH_ALEN];\n\n/*\n\tif((primary_padapter->bup == _FALSE) ||\n\t\t(rtw_buddy_adapter_up(primary_padapter) == _FALSE))\n\t\tgoto exit;\n*/\n\n\t/****** init adapter ******/\n\tpadapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));\n\tif (padapter == NULL)\n\t\tgoto exit;\n\n\tif (loadparam(padapter) != _SUCCESS)\n\t\tgoto free_adapter;\n\n\t_rtw_memcpy(padapter, primary_padapter, sizeof(_adapter));\n\n\t//\n\tpadapter->bup = _FALSE;\n\tpadapter->net_closed = _TRUE;\n\tpadapter->dir_dev = NULL;\n\tpadapter->dir_odm = NULL;\n\n\n\t//set adapter_type/iface type\n\tpadapter->isprimary = _FALSE;\n\tpadapter->adapter_type = MAX_ADAPTER;\n\tpadapter->pbuddy_adapter = primary_padapter;\n#if 0\n#ifndef CONFIG_HWPORT_SWAP\t//Port0 -> Pri , Port1 -> Sec\n\tpadapter->iface_type = IFACE_PORT1;\n#else\n\tpadapter->iface_type = IFACE_PORT0;\n#endif  //CONFIG_HWPORT_SWAP\n#else\n\t//extended virtual interfaces always are set to port0\n\tpadapter->iface_type = IFACE_PORT0;\n#endif\n\n\t/****** hook vir if into dvobj ******/\n\tpdvobjpriv = adapter_to_dvobj(padapter);\n\tpadapter->iface_id = pdvobjpriv->iface_nums;\n\tpdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;\n\n\tpadapter->intf_start = NULL;\n\tpadapter->intf_stop = NULL;\n\n\t//step init_io_priv\n\tif ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"\\n Can't init io_reqs\\n\"));\n\t\tgoto free_adapter;\n\t}\n\n\t//init drv data\n\tif(rtw_init_drv_sw(padapter)!= _SUCCESS)\n\t\tgoto free_drv_sw;\n\n\n\t//get mac address from primary_padapter\n\t_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);\n\n\t/*\n\t* If the BIT1 is 0, the address is universally administered.\n\t* If it is 1, the address is locally administered\n\t*/\n#if 1 /* needs enable MBSSID CAM */\n\tmac[0] |= BIT(1);\n\tmac[0] |= (padapter->iface_id-1)<<4;\n#endif\n\n\t_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);\n\n\tres = _SUCCESS;\n\nfree_drv_sw:\n\tif (res != _SUCCESS && padapter)\n\t\trtw_free_drv_sw(padapter);\nfree_adapter:\n\tif (res != _SUCCESS && padapter) {\n\t\trtw_vmfree((u8 *)padapter, sizeof(*padapter));\n\t\tpadapter = NULL;\n\t}\nexit:\n\treturn padapter;\n}\n\nvoid rtw_drv_stop_vir_if(_adapter *padapter)\n{\n\tstruct net_device *pnetdev=NULL;\n\n\tif (padapter == NULL)\n\t\treturn;\n\n\tpnetdev = padapter->pnetdev;\n\n\n\tif (padapter->bup == _TRUE)\n\t{\n\t\t#ifdef CONFIG_XMIT_ACK\n\t\tif (padapter->xmitpriv.ack_tx)\n\t\t\trtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);\n\t\t#endif\n\n\t\tif (padapter->intf_stop)\n\t\t{\n\t\t\tpadapter->intf_stop(padapter);\n\t\t}\n\n\t\trtw_stop_drv_threads(padapter);\n\n\t\tpadapter->bup = _FALSE;\n\t}\n\n\t/* cancel timer after thread stop */\n\trtw_cancel_all_timer(padapter);\n}\n\nvoid rtw_drv_free_vir_if(_adapter *padapter)\n{\n\tif (padapter == NULL)\n\t\treturn;\n\n\tpadapter->pbuddy_adapter = NULL;\n\n\trtw_free_drv_sw(padapter);\n\n\t/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */\n\trtw_os_ndev_free(padapter);\n\n\trtw_vmfree((u8 *)padapter, sizeof(_adapter));\n}\n\nvoid rtw_drv_stop_vir_ifaces(struct dvobj_priv *dvobj)\n{\n\tint i;\n\t//struct dvobj_priv *dvobj = primary_padapter->dvobj;\n\n\tfor(i=2;i<dvobj->iface_nums;i++)\n\t{\n\t\trtw_drv_stop_vir_if(dvobj->padapters[i]);\n\t}\n}\n\nvoid rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj)\n{\n\tint i;\n\t//struct dvobj_priv *dvobj = primary_padapter->dvobj;\n\n\tfor(i=2;i<dvobj->iface_nums;i++)\n\t{\n\t\trtw_drv_free_vir_if(dvobj->padapters[i]);\n\t}\n}\n\nvoid rtw_drv_del_vir_if(_adapter *padapter)\n{\n\trtw_drv_stop_vir_if(padapter);\n\trtw_drv_free_vir_if(padapter);\n}\n\nvoid rtw_drv_del_vir_ifaces(_adapter *primary_padapter)\n{\n\tint i;\n\tstruct dvobj_priv *dvobj = primary_padapter->dvobj;\n\n\tfor(i=2;i<dvobj->iface_nums;i++)\n\t{\n\t\trtw_drv_del_vir_if(dvobj->padapters[i]);\n\t}\n}\n#endif //CONFIG_MULTI_VIR_IFACES\n\nint _netdev_if2_open(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\t_adapter *primary_padapter = padapter->pbuddy_adapter;\n\n\tDBG_871X(\"+871x_drv - if2_open, bup=%d\\n\", padapter->bup);\n\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\tif (padapter->bup == _FALSE)\n\t{\n\t\tu8 mac[ETH_ALEN];\n\n\t\t/* get mac address from primary_padapter */\n\t\tif (primary_padapter->bup == _FALSE)\n\t\t\trtw_macaddr_cfg(adapter_mac_addr(primary_padapter), get_hal_mac_addr(primary_padapter));\n\n\t\t_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);\n\n\t\t/*\n\t\t* If the BIT1 is 0, the address is universally administered.\n\t\t* If it is 1, the address is locally administered\n\t\t*/\n\t\tmac[0] |= BIT(1);\n\n\t\t_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);\n\t\trtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));\n\t\t_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);\n\t}\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\n\tif (primary_padapter->bup == _FALSE || !rtw_is_hw_init_completed(primary_padapter))\n\t\t_netdev_open(primary_padapter->pnetdev);\n\n\tif(padapter->bup == _FALSE && primary_padapter->bup == _TRUE &&\n\t\trtw_is_hw_init_completed(primary_padapter))\n\t{\n\t\tpadapter->bFWReady = primary_padapter->bFWReady;\n\n\t\t//if (init_mlme_ext_priv(padapter) == _FAIL)\n\t\t//\tgoto netdev_if2_open_error;\n\n\n\t\tif (rtw_start_drv_threads(padapter) == _FAIL)\n\t\t{\n\t\t\tgoto netdev_if2_open_error;\n\t\t}\n\n\n\t\tif (padapter->intf_start)\n\t\t{\n\t\t\tpadapter->intf_start(padapter);\n\t\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\trtw_cfg80211_init_wiphy(padapter);\n#endif\n\n\t\tpadapter->bup = _TRUE;\n\n\t}\n\n\tpadapter->net_closed = _FALSE;\n\n\t//execute dynamic_chk_timer only on primary interface\n\t// secondary interface shares the timer with primary interface.\n\t//_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n\n\trtw_netif_wake_queue(pnetdev);\n\n\tDBG_871X(\"-871x_drv - if2_open, bup=%d\\n\", padapter->bup);\n\treturn 0;\n\nnetdev_if2_open_error:\n\n\tpadapter->bup = _FALSE;\n\n\tnetif_carrier_off(pnetdev);\n\trtw_netif_stop_queue(pnetdev);\n\n\treturn (-1);\n\n}\n\nint netdev_if2_open(struct net_device *pnetdev)\n{\n\tint ret;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\tif (pwrctrlpriv->bInSuspend == _TRUE)\n\t{\n\t\tDBG_871X(\"+871x_drv - netdev_if2_open, bInSuspend=%d\\n\", pwrctrlpriv->bInSuspend);\n\t\treturn 0;\n\t}\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\tret = _netdev_if2_open(pnetdev);\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\n#ifdef CONFIG_AUTO_AP_MODE\n\t//if(padapter->iface_id == 2)\n\t\trtw_start_auto_ap(padapter);\n#endif\n\n\treturn ret;\n}\n\nstatic int netdev_if2_close(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\n\tpadapter->net_closed = _TRUE;\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;\n\n\tif(pnetdev)\n\t{\n\t\trtw_netif_stop_queue(pnetdev);\n\t}\n\n#ifdef CONFIG_P2P\n\tif (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))\n\t\trtw_p2p_enable(padapter, P2P_ROLE_DISABLE);\n#endif\n\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_scan_abort(padapter);\n\trtw_cfg80211_wait_scan_req_empty(padapter, 200);\n\tadapter_wdev_data(padapter)->bandroid_scan = _FALSE;\n#endif\n\n\treturn 0;\n}\n\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29))\nstatic const struct net_device_ops rtw_netdev_if2_ops = {\n\t.ndo_init = rtw_ndev_init,\n\t.ndo_uninit = rtw_ndev_uninit,\n\t.ndo_open = netdev_if2_open,\n\t.ndo_stop = netdev_if2_close,\n\t.ndo_start_xmit = rtw_xmit_entry,\n\t.ndo_set_mac_address = rtw_net_set_mac_address,\n\t.ndo_get_stats = rtw_net_get_stats,\n\t.ndo_do_ioctl = rtw_ioctl,\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t.ndo_select_queue\t= rtw_select_queue,\n#endif\n};\n#endif\n\nvoid rtw_hook_if2_ops(struct net_device *ndev)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29))\n\tndev->netdev_ops = &rtw_netdev_if2_ops;\n#else\n\tndev->init = rtw_ndev_init;\n\tndev->uninit = rtw_ndev_uninit;\n\tndev->open = netdev_if2_open;\n\tndev->stop = netdev_if2_close;\n\tndev->set_mac_address = rtw_net_set_mac_address;\n#endif\n}\n\n_adapter *rtw_drv_if2_init(_adapter *primary_padapter, \n\tvoid (*set_intf_ops)(_adapter *primary_padapter,struct _io_ops *pops))\n{\n\tint res = _FAIL;\n\t_adapter *padapter = NULL;\n\tstruct dvobj_priv *pdvobjpriv;\n\tu8 mac[ETH_ALEN];\n\n\t/****** init adapter ******/\n\tpadapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));\n\tif (padapter == NULL)\n\t\tgoto exit;\n\n\tif (loadparam(padapter) != _SUCCESS)\n\t\tgoto free_adapter;\n\n\t_rtw_memcpy(padapter, primary_padapter, sizeof(*padapter));\n\n\t//\n\tpadapter->bup = _FALSE;\n\tpadapter->net_closed = _TRUE;\n\tpadapter->dir_dev = NULL;\n\tpadapter->dir_odm = NULL;\n\n\t//set adapter_type/iface type\n\tpadapter->isprimary = _FALSE;\n\tpadapter->adapter_type = SECONDARY_ADAPTER;\n\tpadapter->pbuddy_adapter = primary_padapter;\n\tpadapter->iface_id = IFACE_ID1;\n#ifndef CONFIG_HWPORT_SWAP\t\t\t//Port0 -> Pri , Port1 -> Sec\n\tpadapter->iface_type = IFACE_PORT1;\n#else\n\tpadapter->iface_type = IFACE_PORT0;\n#endif  //CONFIG_HWPORT_SWAP\n\n\t/****** hook if2 into dvobj ******/\n\tpdvobjpriv = adapter_to_dvobj(padapter);\n\tpdvobjpriv->padapters[pdvobjpriv->iface_nums++] = padapter;\n\n\t//\n\tpadapter->intf_start = primary_padapter->intf_start;\n\tpadapter->intf_stop = primary_padapter->intf_stop;\n\n\t//step init_io_priv\n\tif ((rtw_init_io_priv(padapter, set_intf_ops)) == _FAIL) {\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"\\n Can't init io_reqs\\n\"));\n\t\tgoto free_adapter;\n\t}\n\n\t//init drv data\n\tif(rtw_init_drv_sw(padapter)!= _SUCCESS)\n\t\tgoto free_drv_sw;\n\n\n\t/* get mac address from primary_padapter */\n\t_rtw_memcpy(mac, adapter_mac_addr(primary_padapter), ETH_ALEN);\n\n\t/*\n\t* If the BIT1 is 0, the address is universally administered.\n\t* If it is 1, the address is locally administered\n\t*/\n\tmac[0] |= BIT(1);\n\n\t_rtw_memcpy(adapter_mac_addr(padapter), mac, ETH_ALEN);\n\trtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));\n\n\tprimary_padapter->pbuddy_adapter = padapter;\n\n\tres = _SUCCESS;\n\nfree_drv_sw:\n\tif (res != _SUCCESS && padapter)\n\t\trtw_free_drv_sw(padapter);\nfree_adapter:\n\tif (res != _SUCCESS && padapter) {\n\t\trtw_vmfree((u8 *)padapter, sizeof(*padapter));\n\t\tpadapter = NULL;\n\t}\nexit:\n\treturn padapter;\n}\n\nvoid rtw_drv_if2_free(_adapter *if2)\n{\n\t_adapter *padapter = if2;\n\n\tif (padapter == NULL)\n\t\treturn;\n\n\trtw_free_drv_sw(padapter);\n\n\t/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */\n\trtw_os_ndev_free(padapter);\n\n\trtw_vmfree((u8 *)padapter, sizeof(_adapter));\n}\n\nvoid rtw_drv_if2_stop(_adapter *if2)\n{\n\t_adapter *padapter = if2;\n\tstruct net_device *pnetdev = NULL;\n\n\tif (padapter == NULL)\n\t\treturn;\n\n\n\tif (padapter->bup == _TRUE) {\n\t\t#ifdef CONFIG_XMIT_ACK\n\t\tif (padapter->xmitpriv.ack_tx)\n\t\t\trtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);\n\t\t#endif\n\n\t\tif (padapter->intf_stop)\n\t\t{\n\t\t\tpadapter->intf_stop(padapter);\n\t\t}\n\n\t\trtw_stop_drv_threads(padapter);\n\n\t\tpadapter->bup = _FALSE;\n\t}\n\n\t/* cancel timer after thread stop */\n\trtw_cancel_all_timer(padapter);\n}\n#endif //end of CONFIG_CONCURRENT_MODE\n\nint rtw_os_ndevs_register(struct dvobj_priv *dvobj)\n{\n\tint i, status = _SUCCESS;\n\tstruct registry_priv *regsty = dvobj_to_regsty(dvobj);\n\t_adapter *adapter;\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (rtw_cfg80211_dev_res_register(dvobj) != _SUCCESS) {\n\t\trtw_warn_on(1);\n\t\tstatus = _FAIL;\n\t\tgoto exit;\n\t}\n#endif\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\n\t\tif (i >= IFACE_ID_MAX) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, \"%s %d >= IFACE_ID_MAX\\n\", __func__, i);\n\t\t\trtw_warn_on(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tadapter = dvobj->padapters[i];\n\t\tif (adapter) {\n\t\t\tchar *name;\n\n\t\t\tif (adapter->iface_id == IFACE_ID0)\n\t\t\t\tname = regsty->ifname;\n\t\t\telse if (adapter->iface_id == IFACE_ID1)\n\t\t\t\tname = regsty->if2name;\n\t\t\telse\n\t\t\t\tname = \"wlan%d\";\n\n\t\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\t\tswitch (adapter->adapter_type) {\n\t\t\tcase SECONDARY_ADAPTER:\n\t\t\t\trtw_hook_if2_ops(adapter->pnetdev);\n\t\t\t\tbreak;\n\t\t\t#ifdef CONFIG_MULTI_VIR_IFACES\n\t\t\tcase MAX_ADAPTER:\n\t\t\t\trtw_hook_vir_if_ops(adapter->pnetdev);\n\t\t\t\tbreak;\n\t\t\t#endif\n\t\t\t}\n\t\t\t#endif /* CONFIG_CONCURRENT_MODE */\n\n\t\t\tstatus = rtw_os_ndev_register(adapter, name);\n\n\t\t\tif (status != _SUCCESS) {\n\t\t\t\trtw_warn_on(1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (status != _SUCCESS) {\n\t\tfor (; i >= 0; i--) {\n\t\t\tadapter = dvobj->padapters[i];\n\t\t\tif (adapter)\n\t\t\t\trtw_os_ndev_unregister(adapter);\n\t\t}\n\t}\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\tif (status != _SUCCESS)\n\t\trtw_cfg80211_dev_res_unregister(dvobj);\n#endif\nexit:\n\treturn status;\n}\n\nvoid rtw_os_ndevs_unregister(struct dvobj_priv *dvobj)\n{\n\tint i;\n\t_adapter *adapter = NULL;\n\n\tfor (i = 0; i < dvobj->iface_nums; i++) {\n\t\tadapter = dvobj->padapters[i];\n\n\t\tif (adapter == NULL)\n\t\t\tcontinue;\n\n\t\trtw_os_ndev_unregister(adapter);\n\t}\n\n#if defined(CONFIG_IOCTL_CFG80211)\n\trtw_cfg80211_dev_res_unregister(dvobj);\n#endif\n}\n\n/**\n * rtw_os_ndevs_init - Allocate and register OS layer net devices and relating structures for @dvobj\n * @dvobj: the dvobj on which this function applies\n *\n * Returns:\n * _SUCCESS or _FAIL\n */\nint rtw_os_ndevs_init(struct dvobj_priv *dvobj)\n{\n\tint ret = _FAIL;\n\n\tif (rtw_os_ndevs_alloc(dvobj) != _SUCCESS)\n\t\tgoto exit;\n\n\tif (rtw_os_ndevs_register(dvobj) != _SUCCESS)\n\t\tgoto os_ndevs_free;\n\n\tret = _SUCCESS;\n\nos_ndevs_free:\n\tif (ret != _SUCCESS)\n\t\trtw_os_ndevs_free(dvobj);\nexit:\n\treturn ret;\n}\n\n/**\n * rtw_os_ndevs_deinit - Unregister and free OS layer net devices and relating structures for @dvobj\n * @dvobj: the dvobj on which this function applies\n */\nvoid rtw_os_ndevs_deinit(struct dvobj_priv *dvobj)\n{\n\trtw_os_ndevs_unregister(dvobj);\n\trtw_os_ndevs_free(dvobj);\n}\n\n#ifdef CONFIG_BR_EXT\nvoid netdev_br_init(struct net_device *netdev)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\trcu_read_lock();\n#endif\t// (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\n\t//if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)\n\t{\n\t\t//struct net_bridge\t*br = netdev->br_port->br;//->dev->dev_addr;\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\tif (netdev->br_port)\n#else   // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\tif (rcu_dereference(adapter->pnetdev->rx_handler_data))\n#endif  // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\t{\n\t\t\tstruct net_device *br_netdev;\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n\t\t\tbr_netdev = dev_get_by_name(CONFIG_BR_EXT_BRNAME);\n#else\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n\t\t\tstruct net *devnet = NULL;\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))\n\t\t\tdevnet = netdev->nd_net;\n#else\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))\n\t\t\tdevnet = dev_net(netdev);\n#endif\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))\n\n\t\t\tbr_netdev = dev_get_by_name(devnet, CONFIG_BR_EXT_BRNAME);\n#endif\t// (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n\n\t\t\tif (br_netdev) {\n\t\t\t\tmemcpy(adapter->br_mac, br_netdev->dev_addr, ETH_ALEN);\n\t\t\t\tdev_put(br_netdev);\n\t\t\t} else\n\t\t\t\tprintk(\"%s()-%d: dev_get_by_name(%s) failed!\", __FUNCTION__, __LINE__, CONFIG_BR_EXT_BRNAME);\n\t\t}\n\n\t\tadapter->ethBrExtInfo.addPPPoETag = 1;\n\t}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n\trcu_read_unlock();\n#endif\t// (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 35))\n}\n#endif //CONFIG_BR_EXT\n\nint _netdev_open(struct net_device *pnetdev)\n{\n\tuint status;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(padapter);\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+871x_drv - dev_open\\n\"));\n\tDBG_871X(\"+871x_drv - drv_open, bup=%d\\n\", padapter->bup);\n\n\tpadapter->netif_up = _TRUE;\n\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\trtw_sdio_set_power(1);\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\n\tif(pwrctrlpriv->ps_flag == _TRUE){\n\t\tpadapter->net_closed = _FALSE;\n\t\tgoto netdev_open_normal_process;\n\t}\n\n\tif(padapter->bup == _FALSE)\n\t{\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\t\trtw_macaddr_cfg(adapter_mac_addr(padapter),  get_hal_mac_addr(padapter));\n\t\trtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));\n\t\t_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\n\t\trtw_clr_surprise_removed(padapter);\n\t\trtw_clr_drv_stopped(padapter);\n\n\t\tstatus = rtw_hal_init(padapter);\n\t\tif (status ==_FAIL)\n\t\t{\n\t\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"rtl871x_hal_init(): Can't init h/w!\\n\"));\n\t\t\tgoto netdev_open_error;\n\t\t}\n\n\t\tDBG_871X(\"MAC Address = \"MAC_FMT\"\\n\", MAC_ARG(pnetdev->dev_addr));\n\n\t\tstatus=rtw_start_drv_threads(padapter);\n\t\tif(status ==_FAIL)\n\t\t{\n\t\t\tDBG_871X(\"Initialize driver software resource Failed!\\n\");\n\t\t\tgoto netdev_open_error;\n\t\t}\n\n#ifdef CONFIG_DRVEXT_MODULE\n\t\tinit_drvext(padapter);\n#endif\n\n\t\tif (padapter->intf_start)\n\t\t{\n\t\t\tpadapter->intf_start(padapter);\n\t\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\t\trtw_cfg80211_init_wiphy(padapter);\n#endif\n\n\t\trtw_led_control(padapter, LED_CTL_NO_LINK);\n\n\t\tpadapter->bup = _TRUE;\n\t\tpwrctrlpriv->bips_processing = _FALSE;\n\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n#ifdef CONFIG_BT_COEXIST\t\n\t\trtw_btcoex_IpsNotify(padapter, IPS_NONE);\n#endif // CONFIG_BT_COEXIST\n#endif //CONFIG_PLATFORM_INTEL_BYT\t\t\n\t}\n\tpadapter->net_closed = _FALSE;\n\n\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n\n#ifndef CONFIG_IPS_CHECK_IN_WD\n\trtw_set_pwr_state_check_timer(pwrctrlpriv);\n#endif \n\n\t//netif_carrier_on(pnetdev);//call this func when rtw_joinbss_event_callback return success\n\trtw_netif_wake_queue(pnetdev);\n\n#ifdef CONFIG_BR_EXT\n\tnetdev_br_init(pnetdev);\n#endif\t// CONFIG_BR_EXT\n\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tif(is_primary_adapter(padapter) &&  _TRUE == pHalData->EEPROMBluetoothCoexist)\n\t{\n\t\trtw_btcoex_init_socket(padapter);\n\t\tpadapter->coex_info.BtMgnt.ExtConfig.HCIExtensionVer = 0x04;\n\t\trtw_btcoex_SetHciVersion(padapter,0x04);\n\t}\n\telse\n\t\tDBG_871X(\"CONFIG_BT_COEXIST: SECONDARY_ADAPTER\\n\");\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n\nnetdev_open_normal_process:\n\n\t#ifdef CONFIG_CONCURRENT_MODE\n\t{\n\t\t_adapter *sec_adapter = padapter->pbuddy_adapter;\n\t\tif(sec_adapter && (sec_adapter->bup == _FALSE))\n\t\t\t_netdev_if2_open(sec_adapter->pnetdev);\n\t}\n\t#endif\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"-871x_drv - dev_open\\n\"));\n\tDBG_871X(\"-871x_drv - drv_open, bup=%d\\n\", padapter->bup);\n\n\treturn 0;\n\nnetdev_open_error:\n\n\tpadapter->bup = _FALSE;\n\n\tnetif_carrier_off(pnetdev);\n\trtw_netif_stop_queue(pnetdev);\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"-871x_drv - dev_open, fail!\\n\"));\n\tDBG_871X(\"-871x_drv - drv_open fail, bup=%d\\n\", padapter->bup);\n\n\treturn (-1);\n\n}\n\nint netdev_open(struct net_device *pnetdev)\n{\n\tint ret;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);\n\n\tif (pwrctrlpriv->bInSuspend == _TRUE)\n\t{\n\t\tDBG_871X(\"+871x_drv - drv_open, bInSuspend=%d\\n\", pwrctrlpriv->bInSuspend);\n\t\treturn 0;\n\t}\n\n\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\tret = _netdev_open(pnetdev);\n\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\n\treturn ret;\n}\n\n#ifdef CONFIG_IPS\nint  ips_netdrv_open(_adapter *padapter)\n{\n\tint status = _SUCCESS;\n\t//struct pwrctrl_priv\t*pwrpriv = adapter_to_pwrctl(padapter);\n\t\n\tpadapter->net_closed = _FALSE;\n\n\tDBG_871X(\"===> %s.........\\n\",__FUNCTION__);\n\n\n\trtw_clr_drv_stopped(padapter);\n\t//padapter->bup = _TRUE;\n\n\tstatus = rtw_hal_init(padapter);\n\tif (status ==_FAIL)\n\t{\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"ips_netdrv_open(): Can't init h/w!\\n\"));\n\t\tgoto netdev_open_error;\n\t}\n\n\tif (padapter->intf_start)\n\t{\n\t\tpadapter->intf_start(padapter);\n\t}\n\n#ifndef CONFIG_IPS_CHECK_IN_WD\n\trtw_set_pwr_state_check_timer(adapter_to_pwrctl(padapter));\n#endif\t\t\n  \t_set_timer(&padapter->mlmepriv.dynamic_chk_timer,2000);\n\n\t return _SUCCESS;\n\nnetdev_open_error:\n\t//padapter->bup = _FALSE;\n\tDBG_871X(\"-ips_netdrv_open - drv_open failure, bup=%d\\n\", padapter->bup);\n\n\treturn _FAIL;\n}\n\n\nint rtw_ips_pwr_up(_adapter *padapter)\n{\n\tint result;\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n#endif//#ifdef DBG_CONFIG_ERROR_DETECT\n\tu32 start_time = rtw_get_current_time();\n\tDBG_871X(\"===>  rtw_ips_pwr_up..............\\n\");\n\n#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tif (psrtpriv->silent_reset_inprogress == _TRUE)\n#endif//#ifdef DBG_CONFIG_ERROR_DETECT\t\t\n#endif //defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)\n\t\trtw_reset_drv_sw(padapter);\n\n\tresult = ips_netdrv_open(padapter);\n\n\trtw_led_control(padapter, LED_CTL_NO_LINK);\n\n \tDBG_871X(\"<===  rtw_ips_pwr_up.............. in %dms\\n\", rtw_get_passing_time_ms(start_time));\n\treturn result;\n\n}\n\nvoid rtw_ips_pwr_down(_adapter *padapter)\n{\n\tu32 start_time = rtw_get_current_time();\n\tDBG_871X(\"===> rtw_ips_pwr_down...................\\n\");\n\n\tpadapter->net_closed = _TRUE;\n\n\trtw_ips_dev_unload(padapter);\n\tDBG_871X(\"<=== rtw_ips_pwr_down..................... in %dms\\n\", rtw_get_passing_time_ms(start_time));\n}\n#endif\nvoid rtw_ips_dev_unload(_adapter *padapter)\n{\n\tstruct net_device *pnetdev= (struct net_device*)padapter->pnetdev;\n\tstruct xmit_priv\t*pxmitpriv = &(padapter->xmitpriv);\n\tPHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);\n#ifdef DBG_CONFIG_ERROR_DETECT\t\n\tstruct sreset_priv *psrtpriv = &pHalData->srestpriv;\n#endif//#ifdef DBG_CONFIG_ERROR_DETECT\n\tDBG_871X(\"====> %s...\\n\",__FUNCTION__);\n\n\n#if defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)\n#ifdef DBG_CONFIG_ERROR_DETECT\n\tif (psrtpriv->silent_reset_inprogress == _TRUE)\n#endif //#ifdef DBG_CONFIG_ERROR_DETECT\t\t\n#endif //defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_FWLPS_IN_IPS)\n\t{\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, 0);\n\n\t\tif (padapter->intf_stop)\n\t\t{\n\t\t\tpadapter->intf_stop(padapter);\n\t\t}\n\t}\n\n\tif (!rtw_is_surprise_removed(padapter))\n\t\trtw_hal_deinit(padapter);\n\n}\n\n\nint pm_netdev_open(struct net_device *pnetdev,u8 bnormal)\n{\n\tint status = 0;\n\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\n\tif (_TRUE == bnormal)\n\t{\n\t\t_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\t\tstatus = _netdev_open(pnetdev);\n\t\t_exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);\n\t}\t\n#ifdef CONFIG_IPS\n\telse\n\t\tstatus =  (_SUCCESS == ips_netdrv_open(padapter))?(0):(-1);\n#endif\n\n\treturn status;\n}\n\nstatic int netdev_close(struct net_device *pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tHAL_DATA_TYPE\t\t*pHalData = GET_HAL_DATA(padapter);\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"+871x_drv - drv_close\\n\"));\n\n#ifndef CONFIG_PLATFORM_INTEL_BYT\n\tif(pwrctl->bInternalAutoSuspend == _TRUE)\n\t{\n\t\t//rtw_pwr_wakeup(padapter);\n\t\tif(pwrctl->rf_pwrstate == rf_off)\n\t\t\tpwrctl->ps_flag = _TRUE;\n\t}\n\tpadapter->net_closed = _TRUE;\n\tpadapter->netif_up = _FALSE;\n\tpmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;\n\n/*\tif (!rtw_is_hw_init_completed(padapter)) {\n\t\tDBG_871X(\"(1)871x_drv - drv_close, bup=%d, hw_init_completed=%s\\n\", padapter->bup, rtw_is_hw_init_completed(padapter)?\"_TRUE\":\"_FALSE\");\n\n\t\trtw_set_drv_stopped(padapter);\n\n\t\trtw_dev_unload(padapter);\n\t}\n\telse*/\n\tif(pwrctl->rf_pwrstate == rf_on){\n\t\tDBG_871X(\"(2)871x_drv - drv_close, bup=%d, hw_init_completed=%s\\n\", padapter->bup, rtw_is_hw_init_completed(padapter)?\"_TRUE\":\"_FALSE\");\n\n\t\t//s1.\n\t\tif(pnetdev)\n\t\t{\n\t\t\trtw_netif_stop_queue(pnetdev);\n\t\t}\n\n#ifndef CONFIG_ANDROID\n\t\t//s2.\n\t\tLeaveAllPowerSaveMode(padapter);\n\t\trtw_disassoc_cmd(padapter, 500, _FALSE);\n\t\t//s2-2.  indicate disconnect to os\n\t\trtw_indicate_disconnect(padapter);\n\t\t//s2-3.\n\t\trtw_free_assoc_resources(padapter, 1);\n\t\t//s2-4.\n\t\trtw_free_network_queue(padapter,_TRUE);\n#endif\n\t\t// Close LED\n\t\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\t}\n\n#ifdef CONFIG_BR_EXT\n\t//if (OPMODE & (WIFI_STATION_STATE | WIFI_ADHOC_STATE))\n\t{\n\t\t//void nat25_db_cleanup(_adapter *priv);\n\t\tnat25_db_cleanup(padapter);\n\t}\n#endif\t// CONFIG_BR_EXT\n\n#ifdef CONFIG_P2P\n\tif (!rtw_p2p_chk_role(&padapter->wdinfo, P2P_ROLE_DISABLE))\n\t\trtw_p2p_enable(padapter, P2P_ROLE_DISABLE);\n#endif //CONFIG_P2P\n\n#ifdef CONFIG_IOCTL_CFG80211\n\trtw_scan_abort(padapter);\n\trtw_cfg80211_wait_scan_req_empty(padapter, 200);\n\tadapter_wdev_data(padapter)->bandroid_scan = _FALSE;\n\t//padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR; //set this at the end\n#endif //CONFIG_IOCTL_CFG80211\n\n#ifdef CONFIG_WAPI_SUPPORT\n\trtw_wapi_disable_tx(padapter);\n#endif\n#ifdef CONFIG_BT_COEXIST_SOCKET_TRX\n\tif(is_primary_adapter(padapter) &&  _TRUE == pHalData->EEPROMBluetoothCoexist)\n\t\trtw_btcoex_close_socket(padapter);\n\telse\n\t\tDBG_871X(\"CONFIG_BT_COEXIST: SECONDARY_ADAPTER\\n\");\n#endif //CONFIG_BT_COEXIST_SOCKET_TRX\n#else //!CONFIG_PLATFORM_INTEL_BYT\n\n\tif (pwrctl->bInSuspend == _TRUE)\n\t{\n\t\tDBG_871X(\"+871x_drv - drv_close, bInSuspend=%d\\n\", pwrctl->bInSuspend);\n\t\treturn 0;\n\t}\n\n\trtw_scan_abort(padapter); // stop scanning process before wifi is going to down\n\t#ifdef CONFIG_IOCTL_CFG80211\n\trtw_cfg80211_wait_scan_req_empty(padapter, 200);\n\t#endif\n\n\tDBG_871X(\"netdev_close, bips_processing=%d\\n\", pwrctl->bips_processing);\n\twhile (pwrctl->bips_processing == _TRUE) // waiting for ips_processing done before call rtw_dev_unload()\n\t\trtw_msleep_os(1);\t\n\n\trtw_dev_unload(padapter);\n\trtw_sdio_set_power(0);\n\n#endif //!CONFIG_PLATFORM_INTEL_BYT\n\n\tRT_TRACE(_module_os_intfs_c_,_drv_info_,(\"-871x_drv - drv_close\\n\"));\n\tDBG_871X(\"-871x_drv - drv_close, bup=%d\\n\", padapter->bup);\n\n\treturn 0;\n\n}\n\nint pm_netdev_close(struct net_device *pnetdev,u8 bnormal)\n{\n\tint status = 0;\n\n\tstatus = netdev_close(pnetdev);\n\n\treturn status;\n}\n\nvoid rtw_ndev_destructor(struct net_device *ndev)\n{\n\tDBG_871X(FUNC_NDEV_FMT\"\\n\", FUNC_NDEV_ARG(ndev));\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif (ndev->ieee80211_ptr)\n\t\trtw_mfree((u8 *)ndev->ieee80211_ptr, sizeof(struct wireless_dev));\n#endif\n\tfree_netdev(ndev);\n}\n\n#ifdef CONFIG_ARP_KEEP_ALIVE\nstruct route_info {\n    struct in_addr dst_addr;\n    struct in_addr src_addr;\n    struct in_addr gateway;\n    unsigned int dev_index;\n};\n\nstatic void parse_routes(struct nlmsghdr *nl_hdr, struct route_info *rt_info)\n{\n    struct rtmsg *rt_msg;\n    struct rtattr *rt_attr;\n    int rt_len;\n\n    rt_msg = (struct rtmsg *) NLMSG_DATA(nl_hdr);\n    if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN))\n        return;\n\n    rt_attr = (struct rtattr *) RTM_RTA(rt_msg);\n    rt_len = RTM_PAYLOAD(nl_hdr);\n\n    for (; RTA_OK(rt_attr, rt_len); rt_attr = RTA_NEXT(rt_attr, rt_len)) \n\t{\n        switch (rt_attr->rta_type) {\n        case RTA_OIF:\n\t\trt_info->dev_index = *(int *) RTA_DATA(rt_attr);\n            break;\n        case RTA_GATEWAY:\n            rt_info->gateway.s_addr = *(u_int *) RTA_DATA(rt_attr);\n            break;\n        case RTA_PREFSRC:\n            rt_info->src_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);\n            break;\n        case RTA_DST:\n            rt_info->dst_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);\n            break;\n        }\n    }\n}\n\nstatic int route_dump(u32 *gw_addr ,int* gw_index)\n{\n\tint err = 0;\n\tstruct socket *sock;\n\tstruct {\n\t\tstruct nlmsghdr nlh;\n\t\tstruct rtgenmsg g;\n\t} req;\n\tstruct msghdr msg;\n\tstruct iovec iov;\n\tstruct sockaddr_nl nladdr;\n\tmm_segment_t oldfs;\n\tchar *pg;\n\tint size = 0;\n\n\terr = sock_create(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE, &sock);\n\tif (err)\n\t{\n\t\tprintk( \": Could not create a datagram socket, error = %d\\n\", -ENXIO);\n\t\treturn err;\n\t}\n\t\n\tmemset(&nladdr, 0, sizeof(nladdr));\n\tnladdr.nl_family = AF_NETLINK;\n\n\treq.nlh.nlmsg_len = sizeof(req);\n\treq.nlh.nlmsg_type = RTM_GETROUTE;\n\treq.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;\n\treq.nlh.nlmsg_pid = 0;\n\treq.g.rtgen_family = AF_INET;\n\n\tiov.iov_base = &req;\n\tiov.iov_len = sizeof(req);\n\n\tmsg.msg_name = &nladdr;\n\tmsg.msg_namelen = sizeof(nladdr);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))\n\t/* referece:sock_xmit in kernel code\n\t * WRITE for sock_sendmsg, READ for sock_recvmsg\n\t * third parameter for msg_iovlen\n\t * last parameter for iov_len\n\t */\n\tiov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));\n#else\n\tmsg.msg_iov = &iov;\n\tmsg.msg_iovlen = 1;\n#endif\n\tmsg.msg_control = NULL;\n\tmsg.msg_controllen = 0;\n\tmsg.msg_flags = MSG_DONTWAIT;\n\n\toldfs = get_fs(); set_fs(KERNEL_DS);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))\n\terr = sock_sendmsg(sock, &msg);\n#else\n\terr = sock_sendmsg(sock, &msg, sizeof(req));\n#endif\n\tset_fs(oldfs);\n\n\tif (err < 0)\n\t\tgoto out_sock;\n\n\tpg = (char *) __get_free_page(GFP_KERNEL);\n\tif (pg == NULL) {\n\t\terr = -ENOMEM;\n\t\tgoto out_sock;\n\t}\n\n#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)\nrestart:\n#endif\n\n\tfor (;;) \n\t{\n\t\tstruct nlmsghdr *h;\n\n\t\tiov.iov_base = pg;\n\t\tiov.iov_len = PAGE_SIZE;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))\n\t\tiov_iter_init(&msg.msg_iter, READ, &iov, 1, PAGE_SIZE);\n#endif\n\n\t\toldfs = get_fs(); set_fs(KERNEL_DS);\n\t\terr = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);\n\t\tset_fs(oldfs);\n\n\t\tif (err < 0)\n\t\t\tgoto out_sock_pg;\n\n\t\tif (msg.msg_flags & MSG_TRUNC) {\n\t\t\terr = -ENOBUFS;\n\t\t\tgoto out_sock_pg;\n\t\t}\n\n\t\th = (struct nlmsghdr*) pg;\n\t\t\n\t\twhile (NLMSG_OK(h, err)) \n\t\t{\n\t\t\tstruct route_info rt_info;\n\t\t\tif (h->nlmsg_type == NLMSG_DONE) {\n\t\t\t\terr = 0;\n\t\t\t\tgoto done;\n\t\t\t}\n\n\t\t\tif (h->nlmsg_type == NLMSG_ERROR) {\n\t\t\t\tstruct nlmsgerr *errm = (struct nlmsgerr*) NLMSG_DATA(h);\n\t\t\t\terr = errm->error;\n\t\t\t\tprintk( \"NLMSG error: %d\\n\", errm->error);\n\t\t\t\tgoto done;\n\t\t\t}\n\n\t\t\tif (h->nlmsg_type == RTM_GETROUTE)\n\t\t\t{\n\t\t\t\tprintk( \"RTM_GETROUTE: NLMSG: %d\\n\", h->nlmsg_type);\n\t\t\t}\n\t\t\tif (h->nlmsg_type != RTM_NEWROUTE) {\n\t\t\t\tprintk( \"NLMSG: %d\\n\", h->nlmsg_type);\n\t\t\t\terr = -EINVAL;\n\t\t\t\tgoto done;\n\t\t\t}\n\n\t\t\tmemset(&rt_info, 0, sizeof(struct route_info));\n\t\t\tparse_routes(h, &rt_info);\n\t\t\tif(!rt_info.dst_addr.s_addr && rt_info.gateway.s_addr && rt_info.dev_index)\n\t\t\t{\n\t\t\t\t*gw_addr = rt_info.gateway.s_addr;\n\t\t\t\t*gw_index = rt_info.dev_index;\n\t\t\t\t \t\n\t\t\t}\n\t\t\th = NLMSG_NEXT(h, err);\n\t\t}\n\n\t\tif (err) \n\t\t{\n\t\t\tprintk( \"!!!Remnant of size %d %d %d\\n\", err, h->nlmsg_len, h->nlmsg_type);\n\t\t\terr = -EINVAL;\n\t\t\tbreak;\n\t\t}\n\t}\n\ndone:\n#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)\n\tif (!err && req.g.rtgen_family == AF_INET) {\n\t\treq.g.rtgen_family = AF_INET6;\n\n\t\tiov.iov_base = &req;\n\t\tiov.iov_len = sizeof(req);\n\n\t\tmsg.msg_name = &nladdr;\n\t\tmsg.msg_namelen = sizeof(nladdr);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0))\n\t\tiov_iter_init(&msg.msg_iter, WRITE, &iov, 1, sizeof(req));\n#else\n\t\tmsg.msg_iov = &iov;\n\t\tmsg.msg_iovlen = 1;\n#endif\n\t\tmsg.msg_control = NULL;\n\t\tmsg.msg_controllen = 0;\n\t\tmsg.msg_flags=MSG_DONTWAIT;\n\n\t\toldfs = get_fs(); set_fs(KERNEL_DS);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))\n\t\terr = sock_sendmsg(sock, &msg);\n#else\n\t\terr = sock_sendmsg(sock, &msg, sizeof(req));\n#endif\n\t\tset_fs(oldfs);\n\n\t\tif (err > 0)\n\t\t\tgoto restart;\n\t}\n#endif\n\nout_sock_pg:\n\tfree_page((unsigned long) pg);\n\nout_sock:\n\tsock_release(sock);\n\treturn err;\n}\n\nstatic int arp_query(unsigned char *haddr, u32 paddr,\n             struct net_device *dev)\n{\n\tstruct neighbour *neighbor_entry;\n\tint\tret = 0;\n\n\tneighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);\n\n\tif (neighbor_entry != NULL) {\n\t\tneighbor_entry->used = jiffies;\n\t\tif (neighbor_entry->nud_state & NUD_VALID) {\n\t\t\t_rtw_memcpy(haddr, neighbor_entry->ha, dev->addr_len);\n\t\t\tret = 1;\n\t\t}\n\t\tneigh_release(neighbor_entry);\n\t}\n\treturn ret;\n}\n\nstatic int get_defaultgw(u32 *ip_addr ,char mac[])\n{\n\tint gw_index = 0; // oif device index\n\tstruct net_device *gw_dev = NULL; //oif device\n\t\n\troute_dump(ip_addr, &gw_index);\n\n\tif( !(*ip_addr) || !gw_index )\n\t{\n\t\t//DBG_871X(\"No default GW \\n\");\n\t\treturn -1;\n\t}\n\n\tgw_dev = dev_get_by_index(&init_net, gw_index);\n\n\tif(gw_dev == NULL)\n\t{\n\t\t//DBG_871X(\"get Oif Device Fail \\n\");\n\t\treturn -1;\n\t}\n\t\n\tif(!arp_query(mac, *ip_addr, gw_dev))\n\t{\n\t\t//DBG_871X( \"arp query failed\\n\");\n\t\tdev_put(gw_dev);\n\t\treturn -1;\n\t\t\n\t}\n\tdev_put(gw_dev);\n\t\n\treturn 0;\n}\n\nint\trtw_gw_addr_query(_adapter *padapter)\n{\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tu32 gw_addr = 0; // default gw address\n\tunsigned char gw_mac[32] = {0}; // default gw mac\n\tint i;\n\tint res;\n\n\tres = get_defaultgw(&gw_addr, gw_mac);\n\tif(!res)\n\t{\n\t\tpmlmepriv->gw_ip[0] = gw_addr&0xff;\n\t\tpmlmepriv->gw_ip[1] = (gw_addr&0xff00)>>8;\n\t\tpmlmepriv->gw_ip[2] = (gw_addr&0xff0000)>>16;\n\t\tpmlmepriv->gw_ip[3] = (gw_addr&0xff000000)>>24;\n\t\t_rtw_memcpy(pmlmepriv->gw_mac_addr, gw_mac, 6);\n\t\tDBG_871X(\"%s Gateway Mac:\\t\" MAC_FMT \"\\n\", __FUNCTION__, MAC_ARG(pmlmepriv->gw_mac_addr));\n\t\tDBG_871X(\"%s Gateway IP:\\t\" IP_FMT \"\\n\", __FUNCTION__, IP_ARG(pmlmepriv->gw_ip));\n\t}\n\telse\n\t{\n\t\tDBG_871X(\"Get Gateway IP/MAC fail!\\n\");\n\t}\n\n\treturn res;\n}\n#endif\n\nvoid rtw_dev_unload(PADAPTER padapter)\n{\n\tstruct net_device *pnetdev = (struct net_device*)padapter->pnetdev;\t\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *pobjpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &pobjpriv->drv_dbg;\n\tstruct cmd_priv *pcmdpriv = &padapter->cmdpriv;\n\tu8 cnt = 0;\n\n\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"+%s\\n\",__FUNCTION__));\n\n\tif (padapter->bup == _TRUE)\n\t{\n\t\tDBG_871X(\"===> %s\\n\",__FUNCTION__);\n\n\t\trtw_set_drv_stopped(padapter);\n\t\t#ifdef CONFIG_XMIT_ACK\n\t\tif (padapter->xmitpriv.ack_tx)\n\t\t\trtw_ack_tx_done(&padapter->xmitpriv, RTW_SCTX_DONE_DRV_STOP);\n\t\t#endif\n\n\t\tif (padapter->intf_stop)\n\t\t\tpadapter->intf_stop(padapter);\n\t\t\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"@ rtw_dev_unload: stop intf complete!\\n\"));\n\n\t\tif (!pwrctl->bInternalAutoSuspend)\n\t\t\trtw_stop_drv_threads(padapter);\n\n\t\twhile(ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _TRUE){\n\t\t\tif (cnt > 5) {\n\t\t\t\tDBG_871X(\"stop cmdthd timeout\\n\");\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tcnt ++;\n\t\t\t\tDBG_871X(\"cmdthd is running(%d)\\n\", cnt);\n\t\t\t\trtw_msleep_os(10);\n\t\t\t}\n\t\t}\n\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"@ %s: stop thread complete!\\n\",__FUNCTION__));\n\n\t\t//check the status of IPS\n\t\tif(rtw_hal_check_ips_status(padapter) == _TRUE || pwrctl->rf_pwrstate == rf_off) { //check HW status and SW state\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: driver in IPS-FWLPS\\n\", __func__);\n\t\t\tpdbgpriv->dbg_dev_unload_inIPS_cnt++;\n\t\t} else {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: driver not in IPS\\n\", __func__);\n\t\t}\n\n\t\tif (!rtw_is_surprise_removed(padapter)) {\n#ifdef CONFIG_BT_COEXIST\n\t\t\trtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);\n#endif\n#ifdef CONFIG_WOWLAN\n\t\t\tif (pwrctl->bSupportRemoteWakeup == _TRUE && \n\t\t\t\tpwrctl->wowlan_mode ==_TRUE) {\n\t\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s bSupportRemoteWakeup==_TRUE  do not run rtw_hal_deinit()\\n\",__FUNCTION__);\n\t\t\t}\n\t\t\telse\n#endif\n\t\t\t{\n\t\t\t\t//amy modify 20120221 for power seq is different between driver open and ips\n\t\t\t\trtw_hal_deinit(padapter);\n\t\t\t}\n\t\t\trtw_set_surprise_removed(padapter);\n\t\t}\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"@ %s: deinit hal complelt!\\n\",__FUNCTION__));\n\n\t\tpadapter->bup = _FALSE;\n\n\t\tDBG_871X(\"<=== %s\\n\",__FUNCTION__);\n\t}\n\telse {\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"%s: bup==_FALSE\\n\",__FUNCTION__));\n\t\tDBG_871X(\"%s: bup==_FALSE\\n\",__FUNCTION__);\n\t}\n\n\t/* cancel timer after thread stop */\n\trtw_cancel_all_timer(padapter);\n\tRT_TRACE(_module_hci_intfs_c_, _drv_notice_, (\"-%s\\n\",__FUNCTION__));\n}\n\nint rtw_suspend_free_assoc_resource(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n#ifdef CONFIG_P2P\n\tstruct wifidirect_info*\tpwdinfo = &padapter->wdinfo;\n#endif // CONFIG_P2P\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\n\tif (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {\n\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE)\n\t\t\t&& check_fwstate(pmlmepriv, _FW_LINKED)\n#ifdef CONFIG_P2P\n\t\t\t&& rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)\n#endif // CONFIG_P2P\n\t\t\t)\n\t\t{\n\t\t\tDBG_871X(\"%s %s(\" MAC_FMT \"), length:%d assoc_ssid.length:%d\\n\",__FUNCTION__,\n\t\t\t\t\tpmlmepriv->cur_network.network.Ssid.Ssid,\n\t\t\t\t\tMAC_ARG(pmlmepriv->cur_network.network.MacAddress),\n\t\t\t\t\tpmlmepriv->cur_network.network.Ssid.SsidLength,\n\t\t\t\t\tpmlmepriv->assoc_ssid.SsidLength);\n\t\t\trtw_set_to_roam(padapter, 1);\n\t\t}\n\t}\n\n\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED))\n\t{\t\n\t\trtw_disassoc_cmd(padapter, 0, _FALSE);\t\n\t\t//s2-2.  indicate disconnect to os\n\t\trtw_indicate_disconnect(padapter);\n\t}\n\t#ifdef CONFIG_AP_MODE\n\telse if(check_fwstate(pmlmepriv, WIFI_AP_STATE))\t\n\t{\n\t\trtw_sta_flush(padapter, _TRUE);\n\t}\n\t#endif\n\t\t\n\t//s2-3.\n\trtw_free_assoc_resources(padapter, 1);\n\n\t//s2-4.\n#ifdef CONFIG_AUTOSUSPEND\n\tif(is_primary_adapter(padapter) && (!adapter_to_pwrctl(padapter)->bInternalAutoSuspend ))\n#endif\n\t\trtw_free_network_queue(padapter, _TRUE);\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: fw_under_survey\\n\", __func__);\n\t\trtw_indicate_scan_done(padapter, 1);\n\t\tclr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);\n\t}\n\n\tif (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: fw_under_linking\\n\", __FUNCTION__);\n\t\trtw_indicate_disconnect(padapter);\n\t}\n\t\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n\treturn _SUCCESS;\n}\n\n#ifdef CONFIG_WOWLAN\nint rtw_suspend_wow(_adapter *padapter)\n{\n\tu8 ch, bw, offset;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\t\n\t#endif\t\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\t\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct wowlan_ioctl_param poidparam;\n\tu8 ps_mode;\n\tint ret = _SUCCESS;\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\n\n\tDBG_871X(\"wowlan_mode: %d\\n\", pwrpriv->wowlan_mode);\n\tDBG_871X(\"wowlan_pno_enable: %d\\n\", pwrpriv->wowlan_pno_enable);\n#ifdef CONFIG_P2P_WOWLAN\n\tDBG_871X(\"wowlan_p2p_enable: %d\\n\", pwrpriv->wowlan_p2p_enable);\n#endif\n\t\n\tif (pwrpriv->wowlan_mode == _TRUE) {\n\t\t\n\t\tif(pnetdev)\n\t\t\trtw_netif_stop_queue(pnetdev);\t\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(pbuddy_netdev){\n\t\t\tnetif_carrier_off(pbuddy_netdev);\n\t\t\trtw_netif_stop_queue(pbuddy_netdev);\n\t\t}\n\t\t#endif//CONFIG_CONCURRENT_MODE\n\t\t// 0. Power off LED\n\t\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\t\t// 1. stop thread\n\t\trtw_set_drv_stopped(padapter);\t/*for stop thread*/\n\t\trtw_stop_drv_threads(padapter);\n\t\t#ifdef CONFIG_CONCURRENT_MODE\t\n\t\tif (rtw_buddy_adapter_up(padapter))\n\t\t\trtw_stop_drv_threads(padapter->pbuddy_adapter);\n\t\t#endif /*CONFIG_CONCURRENT_MODE*/\n\t\trtw_clr_drv_stopped(padapter);\t/*for 32k command*/\n\n\t\t//#ifdef CONFIG_LPS\n\t\t//rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, \"WOWLAN\");\n\t\t//#endif\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\t// 2. disable interrupt\n\t\tif (padapter->intf_stop) {\n\t\t\tpadapter->intf_stop(padapter);\n\t\t}\n\n\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource\n\t\t\tpadapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);\n\t\t}\n\t\t#endif\n\n\t\t// 2.1 clean interupt\n\t\trtw_hal_clear_interrupt(padapter);\n#endif //CONFIG_SDIO_HCI\n\n\t\t// 2.2 free irq\n\t\t//sdio_free_irq(adapter_to_dvobj(padapter));\n\t\tif(padapter->intf_free_irq)\n\t\t\tpadapter->intf_free_irq(adapter_to_dvobj(padapter));\n\n\t\t#ifdef CONFIG_RUNTIME_PORT_SWITCH\n\t\tif (rtw_port_switch_chk(padapter)) {\n\t\t\tDBG_871X(\" ### PORT SWITCH ### \\n\");\n\t\t\trtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);\n\t\t}\n\t\t#endif\n\n\t\tpoidparam.subcode = WOWLAN_ENABLE;\n\t\trtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);\n\t\tif (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {\n\t\t\tif(check_fwstate(pmlmepriv, WIFI_STATION_STATE)\n\t\t\t\t&& check_fwstate(pmlmepriv, _FW_LINKED))\n\t\t\t{\n\t\t\t\tDBG_871X(\"%s %s(\" MAC_FMT \"), length:%d assoc_ssid.length:%d\\n\",__FUNCTION__,\n\t\t\t\t\t\tpmlmepriv->cur_network.network.Ssid.Ssid,\n\t\t\t\t\t\tMAC_ARG(pmlmepriv->cur_network.network.MacAddress),\n\t\t\t\t\t\tpmlmepriv->cur_network.network.Ssid.SsidLength,\n\t\t\t\t\t\tpmlmepriv->assoc_ssid.SsidLength);\n\n\t\t\t\trtw_set_to_roam(padapter, 0);\n\t\t\t}\n\t\t}\n\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: wowmode suspending\\n\", __func__);\n\n\t\tif (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)\n\t\t{\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: fw_under_survey\\n\", __func__);\n\t\t\trtw_indicate_scan_done(padapter, 1);\n\t\t\tclr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);\n\t\t}\n\t\t\n\t\tif (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t\t}\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif(rtw_buddy_adapter_up(padapter)){ //free buddy adapter's resource\n\t\t\trtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);\n\t\t}\n\t\t#endif\t\n\n\t\tif(pwrpriv->wowlan_pno_enable) {\n\t\t\tDBG_871X_LEVEL(_drv_always_, \"%s: pno: %d\\n\", __func__,\n\t\t\t\t\tpwrpriv->wowlan_pno_enable);\n#ifdef CONFIG_FWLPS_IN_IPS\n\t\t\trtw_set_fw_in_ips_mode(padapter, _TRUE);\n#endif\n\t\t}\n\t\t#ifdef CONFIG_LPS\n\t\telse\n\t\t\trtw_set_ps_mode(padapter, PS_MODE_MAX, 0, 0, \"WOWLAN\");\n\t\t#endif //#ifdef CONFIG_LPS\n\n\t}\n\telse\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: ### ERROR ### wowlan_mode=%d\\n\", __FUNCTION__, pwrpriv->wowlan_mode);\t\n\t}\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n\treturn ret;\n}\n#endif //#ifdef CONFIG_WOWLAN\n\n#ifdef CONFIG_AP_WOWLAN\nint rtw_suspend_ap_wow(_adapter *padapter)\n{\n\tu8 ch, bw, offset;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev;\n\t#endif\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct wowlan_ioctl_param poidparam;\n\tu8 ps_mode;\n\tint ret = _SUCCESS;\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\t\n\tpwrpriv->wowlan_ap_mode = _TRUE;\n\t\n\tDBG_871X(\"wowlan_ap_mode: %d\\n\", pwrpriv->wowlan_ap_mode);\n\t\n\tif(pnetdev)\n\t\trtw_netif_stop_queue(pnetdev);\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) {\n\t\tpbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\n\t\tif (pbuddy_netdev)\n\t\trtw_netif_stop_queue(pbuddy_netdev);\n\t}\n\t#endif//CONFIG_CONCURRENT_MODE\n\t// 0. Power off LED\n\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\t// 1. stop thread\n\trtw_set_drv_stopped(padapter);\t/*for stop thread*/\n\trtw_stop_drv_threads(padapter);\n\t#ifdef CONFIG_CONCURRENT_MODE\t\n\tif (rtw_buddy_adapter_up(padapter))\n\t\trtw_stop_drv_threads(padapter->pbuddy_adapter);\n\t#endif /* CONFIG_CONCURRENT_MODE */\n\trtw_clr_drv_stopped(padapter);\t/*for 32k command*/\n\n#ifdef CONFIG_SDIO_HCI\n\t// 2. disable interrupt\n\trtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.\n\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource\n\t\tpadapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);\n\t}\n\t#endif\n\n\t// 2.1 clean interupt\n\trtw_hal_clear_interrupt(padapter);\n#endif //CONFIG_SDIO_HCI\n\n\t// 2.2 free irq\n\tif(padapter->intf_free_irq)\n\t\tpadapter->intf_free_irq(adapter_to_dvobj(padapter));\n\n\t#ifdef CONFIG_RUNTIME_PORT_SWITCH\n\tif (rtw_port_switch_chk(padapter)) {\n\t\tDBG_871X(\" ### PORT SWITCH ### \\n\");\n\t\trtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);\n\t}\n\t#endif\n\n\tpoidparam.subcode = WOWLAN_AP_ENABLE;\n\trtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);\n\n\tDBG_871X_LEVEL(_drv_always_, \"%s: wowmode suspending\\n\", __func__);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {\n\t\tif (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter->pbuddy_adapter), ch, bw, offset);\n\t\t\tset_channel_bwmode(padapter->pbuddy_adapter, ch, offset, bw);\n\t\t}\n\t\trtw_suspend_free_assoc_resource(padapter);\n\t} else {\n\t\tif (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t\t}\n\t\trtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);\n\t}\n#else\n\tif (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t}\n#endif\n\n#ifdef CONFIG_LPS\n\trtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0, \"AP-WOWLAN\");\n#endif\n\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n\treturn ret;\n}\n#endif //#ifdef CONFIG_AP_WOWLAN\n\n\nint rtw_suspend_normal(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\t\n\t#endif\t\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tint ret = _SUCCESS;\t\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\t\t\t\n\tif(pnetdev){\n\t\tnetif_carrier_off(pnetdev);\n\t\trtw_netif_stop_queue(pnetdev);\n\t}\t\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(rtw_buddy_adapter_up(padapter)){\n\t\tpbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\n\t\tnetif_carrier_off(pbuddy_netdev);\n\t\trtw_netif_stop_queue(pbuddy_netdev);\n\t}\n#endif\t\n\n\trtw_suspend_free_assoc_resource(padapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(rtw_buddy_adapter_up(padapter)){\n\t\trtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);\n\t}\n#endif\n\trtw_led_control(padapter, LED_CTL_POWER_OFF);\n\n\tif ((rtw_hal_check_ips_status(padapter) == _TRUE)\n\t\t|| (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))\n\t{\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: ### ERROR #### driver in IPS ####ERROR###!!!\\n\", __FUNCTION__);\t\n\t\t\n\t}\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(rtw_buddy_adapter_up(padapter)){\n\t\trtw_dev_unload(padapter->pbuddy_adapter);\n\t}\n#endif\n\trtw_dev_unload(padapter);\n\n\t//sdio_deinit(adapter_to_dvobj(padapter));\n\tif(padapter->intf_deinit)\n\t\tpadapter->intf_deinit(adapter_to_dvobj(padapter));\n\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n\treturn ret;\n}\n\nint rtw_suspend_common(_adapter *padapter)\n{\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tstruct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\n\tint ret = 0;\n\tu32 start_time = rtw_get_current_time();\n\n\tDBG_871X_LEVEL(_drv_always_, \" suspend start\\n\");\n\tDBG_871X(\"==> %s (%s:%d)\\n\",__FUNCTION__, current->comm, current->pid);\n\t\n\tpdbgpriv->dbg_suspend_cnt++;\n\t\n\tpwrpriv->bInSuspend = _TRUE;\n\t\n\twhile (pwrpriv->bips_processing == _TRUE)\n\t\trtw_msleep_os(1);\t\t\n\n#ifdef CONFIG_IOL_READ_EFUSE_MAP\n\tif(!padapter->bup){\n\t\tu8 bMacPwrCtrlOn = _FALSE;\n\t\trtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);\n\t\tif(bMacPwrCtrlOn)\n\t\t\trtw_hal_power_off(padapter);\n\t}\n#endif\n\n\tif ((!padapter->bup) || RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"%s bup=%d bDriverStopped=%s bSurpriseRemoved = %s\\n\", __func__\n\t\t\t, padapter->bup\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\tpdbgpriv->dbg_suspend_error_cnt++;\n\t\tgoto exit;\n\t}\n\trtw_ps_deny(padapter, PS_DENY_SUSPEND);\n\n\trtw_cancel_all_timer(padapter);\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (padapter->pbuddy_adapter){\n\t\trtw_cancel_all_timer(padapter->pbuddy_adapter);\n\t}\n#endif // CONFIG_CONCURRENT_MODE\n\n\tLeaveAllPowerSaveModeDirect(padapter);\n\n\trtw_stop_cmd_thread(padapter);\n\t\n#ifdef CONFIG_BT_COEXIST\n\t// wait for the latest FW to remove this condition.\n\tif (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {\n\t\trtw_btcoex_SuspendNotify(padapter, 0);\n\t\tDBG_871X(\"WIFI_AP_STATE\\n\");\n#ifdef CONFIG_CONCURRENT_MODE\n\t} else if (check_buddy_fwstate(padapter, WIFI_AP_STATE)) {\n\t\trtw_btcoex_SuspendNotify(padapter, 0);\n\t\tDBG_871X(\"P2P_ROLE_GO\\n\");\n#endif //CONFIG_CONCURRENT_MODE\n\t} else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) {\n\t\trtw_btcoex_SuspendNotify(padapter, 1);\n\t\tDBG_871X(\"STATION\\n\");\n\t}\n#endif // CONFIG_BT_COEXIST\n\n\trtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);\n\n\tif (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE\n#endif\n\t) {\n\t#ifdef CONFIG_WOWLAN\n\t\tif (check_fwstate(pmlmepriv, _FW_LINKED)) {\n\t\t\tpwrpriv->wowlan_mode = _TRUE;\n\t\t} else if (pwrpriv->wowlan_pno_enable == _TRUE) {\n\t\t\tpwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;\n\t\t}\n\n\t#ifdef CONFIG_P2P_WOWLAN\n\t\tif(!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE) || P2P_ROLE_DISABLE != padapter->wdinfo.role)\n\t\t{\n\t\t\tpwrpriv->wowlan_p2p_mode = _TRUE;\n\t\t}\n\t\tif(_TRUE == pwrpriv->wowlan_p2p_mode)\n\t\t\tpwrpriv->wowlan_mode |= pwrpriv->wowlan_p2p_mode;\n\t#endif //CONFIG_P2P_WOWLAN\n\n\t\tif (pwrpriv->wowlan_mode == _TRUE)\n\t\t\trtw_suspend_wow(padapter);\n\t\telse\n\t\t\trtw_suspend_normal(padapter);\n\t\t\n\t#else //CONFIG_WOWLAN\n\t\trtw_suspend_normal(padapter);\n\t#endif //CONFIG_WOWLAN\n\t} else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE\n#endif\n\t) {\n\t#ifdef CONFIG_AP_WOWLAN\n\t\trtw_suspend_ap_wow(padapter);\n\t#else\n\t\trtw_suspend_normal(padapter);\n\t#endif //CONFIG_AP_WOWLAN\n#ifdef CONFIG_CONCURRENT_MODE\n\t} else if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {\n\t#ifdef CONFIG_AP_WOWLAN\n\t\trtw_suspend_ap_wow(padapter);\n\t#else\n\t\trtw_suspend_normal(padapter);\n\t#endif //CONFIG_AP_WOWLAN\n#endif\n\t} else {\n\t\trtw_suspend_normal(padapter);\n\t}\n\n\n\tDBG_871X_LEVEL(_drv_always_, \"rtw suspend success in %d ms\\n\",\n\t\trtw_get_passing_time_ms(start_time));\n\nexit:\n\tDBG_871X(\"<===  %s return %d.............. in %dms\\n\", __FUNCTION__\n\t\t, ret, rtw_get_passing_time_ms(start_time));\n\n\treturn ret;\t\n}\n\n#ifdef CONFIG_WOWLAN\nint rtw_resume_process_wow(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev;\t\n\t#endif\t\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tstruct wowlan_ioctl_param poidparam;\n\tstruct sta_info\t*psta = NULL;\n\tint ret = _SUCCESS;\n_func_enter_;\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\t\n\tif (padapter) {\n\t\tpnetdev = padapter->pnetdev;\n\t\tpwrpriv = adapter_to_pwrctl(padapter);\n\t} else {\n\t\tpdbgpriv->dbg_resume_error_cnt++;\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\tif (RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"%s pdapter %p bDriverStopped %s bSurpriseRemoved %s\\n\"\n\t\t\t\t, __func__, padapter\n\t\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\tgoto exit;\n\t}\n\n#ifdef CONFIG_PNO_SUPPORT\n\tpwrpriv->pno_in_resume = _TRUE;\n#ifdef CONFIG_FWLPS_IN_IPS\n\tif(pwrpriv->wowlan_pno_enable)\n\t\trtw_set_fw_in_ips_mode(padapter, _FALSE);\n#endif //CONFIG_FWLPS_IN_IPS\n#endif//CONFIG_PNO_SUPPORT\n\n\tif (pwrpriv->wowlan_mode == _TRUE){\n#ifdef CONFIG_LPS\n\t\trtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, \"WOWLAN\");\n#endif //CONFIG_LPS\n\n\t\tpwrpriv->bFwCurrentInPSMode = _FALSE;\n\n#ifdef CONFIG_SDIO_HCI\n\t\tif (padapter->intf_stop) {\n\t\t\tpadapter->intf_stop(padapter);\n\t\t}\n\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource\n\t\t\tpadapter->pbuddy_adapter->intf_stop(padapter->pbuddy_adapter);\n\t\t}\n\t\t#endif\n\n\t\trtw_hal_clear_interrupt(padapter);\n#endif //CONFIG_SDIO_HCI\n\n\t\t//if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {\t\t\n\t\tif((padapter->intf_alloc_irq) && (padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)){\n\t\t\tret = -1;\n\t\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"%s: sdio_alloc_irq Failed!!\\n\", __FUNCTION__));\n\t\t\tgoto exit;\n\t\t}\n\n\t\t//Disable WOW, set H2C command\n\t\tpoidparam.subcode=WOWLAN_DISABLE;\n\t\trtw_hal_set_hwreg(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);\n\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\trtw_reset_drv_sw(padapter->pbuddy_adapter);\n\t\t#endif\t\t\n\n\t\tpsta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));\n\t\tif (psta) {\n\t\t\tset_sta_rate(padapter, psta);\n\t\t}\n\n\t\n\t\trtw_clr_drv_stopped(padapter);\n\t\tDBG_871X(\"%s: wowmode resuming, DriverStopped:%s\\n\", __func__, rtw_is_drv_stopped(padapter)?\"True\":\"False\");\n\t\trtw_start_drv_threads(padapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (padapter->pbuddy_adapter)\n\t\t\trtw_start_drv_threads(padapter->pbuddy_adapter);\n#endif /* CONFIG_CONCURRENT_MODE*/\n\n\t\tif (padapter->intf_start) {\n\t\t\tpadapter->intf_start(padapter);\n\t\t}\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\tif (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource\n\t\t\tpadapter->pbuddy_adapter->intf_start(padapter->pbuddy_adapter);\n\t\t}\n\n\t\tif (rtw_buddy_adapter_up(padapter)) {\n\t\t\tpbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\n\n\t\t\tif(pbuddy_netdev){\n\t\t\t\tnetif_device_attach(pbuddy_netdev);\n\t\t\t\tnetif_carrier_on(pbuddy_netdev);\n\t\t\t}\n\t\t}\n\t\t#endif\n\n\t\t// start netif queue\n\t\tif (pnetdev) {\n\t\t\trtw_netif_wake_queue(pnetdev);\n\t\t}\n\t}\n\telse{\n\n\t\tDBG_871X_LEVEL(_drv_always_, \"%s: ### ERROR ### wowlan_mode=%d\\n\", __FUNCTION__, pwrpriv->wowlan_mode);\t\t\n\t} \n\n\tif( padapter->pid[1]!=0) {\n\t\tDBG_871X(\"pid[1]:%d\\n\",padapter->pid[1]);\n\t\trtw_signal_process(padapter->pid[1], SIGUSR2);\n\t}\t\n\n\tif (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {\n\t\tif (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect ||\n\t\t\tpwrpriv->wowlan_wake_reason == Rx_DisAssoc ||\n\t\t\tpwrpriv->wowlan_wake_reason == Rx_DeAuth) {\n\n\t\t\tDBG_871X(\"%s: disconnect reason: %02x\\n\", __func__,\n\t\t\t\t\t\tpwrpriv->wowlan_wake_reason);\n\t\t\trtw_indicate_disconnect(padapter);\n\n\t\t\trtw_sta_media_status_rpt(padapter,\n\t\t\t\trtw_get_stainfo(&padapter->stapriv,\n\t\t\t\t\tget_bssid(&padapter->mlmepriv)), 0);\n\n\t\t\trtw_free_assoc_resources(padapter, 1);\n\t\t\tpmlmeinfo->state = WIFI_FW_NULL_STATE;\n\n\t\t} else {\n\t\t\tDBG_871X(\"%s: do roaming\\n\", __func__);\n\t\t\trtw_roaming(padapter, NULL);\n\t\t}\n\t}\n\n\tif (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) {\n\t\trtw_lock_ext_suspend_timeout(2000);\n\t}\n\n\tif (pwrpriv->wowlan_wake_reason == Rx_GTK ||\n\t\tpwrpriv->wowlan_wake_reason == Rx_DisAssoc ||\n\t\tpwrpriv->wowlan_wake_reason == Rx_DeAuth) {\n\t\trtw_lock_ext_suspend_timeout(8000);\n\t}\n\n\tif (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {\n#ifdef CONFIG_IOCTL_CFG80211\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))\n\t\t\tu8 locally_generated = 1;\n\n\t\t\tcfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC);\n#else\n\t\t\tcfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);\n#endif\n#endif /* CONFIG_IOCTL_CFG80211 */\n\t\trtw_lock_ext_suspend_timeout(10000);\n\t}\n\n\tif (pwrpriv->wowlan_mode == _TRUE) {\n\t\tpwrpriv->bips_processing = _FALSE;\n\t\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n#ifndef CONFIG_IPS_CHECK_IN_WD\n\t\trtw_set_pwr_state_check_timer(pwrpriv);\n#endif\n\t} else {\n\t\tDBG_871X_LEVEL(_drv_always_, \"do not reset timer\\n\");\n\t}\n\n\tpwrpriv->wowlan_mode =_FALSE;\n\n\t// Power On LED\n#ifdef CONFIG_SW_LED\n\n\tif(pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||\n\t\tpwrpriv->wowlan_wake_reason == Rx_DeAuth ||\n\t\tpwrpriv->wowlan_wake_reason == FWDecisionDisconnect)\n\t\trtw_led_control(padapter, LED_CTL_NO_LINK);\n\telse\n\t\trtw_led_control(padapter, LED_CTL_LINK);\n#endif\n\t//clean driver side wake up reason.\n\tpwrpriv->wowlan_wake_reason = 0;\n\nexit:\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n_func_exit_;\n\treturn ret;\n}\n#endif //#ifdef CONFIG_WOWLAN\n\n#ifdef CONFIG_AP_WOWLAN\nint rtw_resume_process_ap_wow(_adapter *padapter)\n{\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev;\t\n\t#endif\t\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *psdpriv = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &psdpriv->drv_dbg;\n\tstruct wowlan_ioctl_param poidparam;\n\tstruct sta_info\t*psta = NULL;\n\tint ret = _SUCCESS;\n\tu8 ch, bw, offset;\n_func_enter_;\n\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\t\n\tif (padapter) {\n\t\tpnetdev = padapter->pnetdev;\n\t\tpwrpriv = adapter_to_pwrctl(padapter);\n\t} else {\n\t\tpdbgpriv->dbg_resume_error_cnt++;\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\n\n#ifdef CONFIG_LPS\n\trtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, \"AP-WOWLAN\");\n#endif //CONFIG_LPS\n\n\tpwrpriv->bFwCurrentInPSMode = _FALSE;\n\n\trtw_hal_disable_interrupt(padapter);\n\n\trtw_hal_clear_interrupt(padapter);\n\t\t\n\t//if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {\t\t\n\tif((padapter->intf_alloc_irq) && (padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)){\n\t\tret = -1;\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"%s: sdio_alloc_irq Failed!!\\n\", __FUNCTION__));\n\t\tgoto exit;\n\t}\n\n\t//Disable WOW, set H2C command\n\tpoidparam.subcode = WOWLAN_AP_DISABLE;\n\trtw_hal_set_hwreg(padapter, HW_VAR_WOWLAN, (u8 *)&poidparam);\n\tpwrpriv->wowlan_ap_mode = _FALSE;\n\n\trtw_clr_drv_stopped(padapter);\n\tDBG_871X(\"%s: wowmode resuming, DriverStopped:%s\\n\", __func__, rtw_is_drv_stopped(padapter)?\"True\":\"False\");\n\trtw_start_drv_threads(padapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter))\n\t\trtw_start_drv_threads(padapter->pbuddy_adapter);\n#endif /* CONFIG_CONCURRENT_MODE */\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) {\n\t\tif (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter->pbuddy_adapter), ch, bw, offset);\n\t\t\tset_channel_bwmode(padapter->pbuddy_adapter, ch, offset, bw);\n\t\t}\n\t} else {\n\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t\trtw_reset_drv_sw(padapter->pbuddy_adapter);\n\t}\n#else\n\tif (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" back to linked/linking union - ch:%u, bw:%u, offset:%u\\n\",\n\t\t\tFUNC_ADPT_ARG(padapter), ch, bw, offset);\n\t\tset_channel_bwmode(padapter, ch, offset, bw);\n\t}\n#endif\n\n\tif (padapter->intf_start) {\n\t\tpadapter->intf_start(padapter);\n\t}\n\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) { //free buddy adapter's resource\n\t\tpadapter->pbuddy_adapter->intf_start(padapter->pbuddy_adapter);\n\t}\n\t#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif (rtw_buddy_adapter_up(padapter)) {\t\t\t\n\t\tpbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\t\t\t\n\t\tif(pbuddy_netdev){\n\t\t\trtw_netif_wake_queue(pbuddy_netdev);\n\t\t}\n\t}\n#endif\n\t\n\t// start netif queue\n\tif (pnetdev) {\n\t\trtw_netif_wake_queue(pnetdev);\n\t}\n\n\tif( padapter->pid[1]!=0) {\n\t\tDBG_871X(\"pid[1]:%d\\n\",padapter->pid[1]);\n\t\trtw_signal_process(padapter->pid[1], SIGUSR2);\n\t}\t\n\n\t#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\t//rtw_unlock_suspend();\n\t#endif //CONFIG_RESUME_IN_WORKQUEUE\n\n\tif (pwrpriv->wowlan_wake_reason == AP_WakeUp)\n\t\trtw_lock_ext_suspend_timeout(8000);\n\n\tpwrpriv->bips_processing = _FALSE;\n\t_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);\n#ifndef CONFIG_IPS_CHECK_IN_WD\n\trtw_set_pwr_state_check_timer(pwrpriv);\n#endif\n\t//clean driver side wake up reason.\n\tpwrpriv->wowlan_wake_reason = 0;\n\n\t// Power On LED\n#ifdef CONFIG_SW_LED\n\n\trtw_led_control(padapter, LED_CTL_LINK);\n#endif\nexit:\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n_func_exit_;\n\treturn ret;\n}\n#endif //#ifdef CONFIG_APWOWLAN\n\nint rtw_resume_process_normal(_adapter *padapter)\n{\n\tstruct net_device *pnetdev;\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tstruct net_device *pbuddy_netdev;\t\n\t#endif\t\n\tstruct pwrctrl_priv *pwrpriv;\n\tstruct mlme_priv *pmlmepriv;\n\tstruct dvobj_priv *psdpriv;\n\tstruct debug_priv *pdbgpriv;\t\n\t\n\tint ret = _SUCCESS;\n_func_enter_;\n\t\n\tif (!padapter) {\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n\t\n\tpnetdev = padapter->pnetdev;\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\tpmlmepriv = &padapter->mlmepriv;\t\n\tpsdpriv = padapter->dvobj;\n\tpdbgpriv = &psdpriv->drv_dbg;\n\t\n\tDBG_871X(\"==> \"FUNC_ADPT_FMT\" entry....\\n\", FUNC_ADPT_ARG(padapter));\n\t// interface init\n\t//if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)\n\tif((padapter->intf_init)&& (padapter->intf_init(adapter_to_dvobj(padapter)) != _SUCCESS))\n\t{\n\t\tret = -1;\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"%s: initialize SDIO Failed!!\\n\", __FUNCTION__));\n\t\tgoto exit;\n\t}\n\trtw_hal_disable_interrupt(padapter);\n\t//if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)\n\tif ((padapter->intf_alloc_irq)&&(padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS))\n\t{\n\t\tret = -1;\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"%s: sdio_alloc_irq Failed!!\\n\", __FUNCTION__));\n\t\tgoto exit;\n\t}\n\n\trtw_reset_drv_sw(padapter);\n\t#ifdef CONFIG_CONCURRENT_MODE\n\trtw_reset_drv_sw(padapter->pbuddy_adapter);\n\t#endif\n\t\n\tpwrpriv->bkeepfwalive = _FALSE;\n\n\tDBG_871X(\"bkeepfwalive(%x)\\n\",pwrpriv->bkeepfwalive);\n\tif(pm_netdev_open(pnetdev,_TRUE) != 0) {\n\t\tret = -1;\n\t\tpdbgpriv->dbg_resume_error_cnt++;\n\t\tgoto exit;\n\t}\n\n\tnetif_device_attach(pnetdev);\n\tnetif_carrier_on(pnetdev);\n\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif(rtw_buddy_adapter_up(padapter)){\t\t\t\n\t\tpbuddy_netdev = padapter->pbuddy_adapter->pnetdev;\t\t\t\t\n\t\t\n\t\tnetif_device_attach(pbuddy_netdev);\n\t\tnetif_carrier_on(pbuddy_netdev);\t\n\t}\n\t#endif\n\t\n\n\tif( padapter->pid[1]!=0) {\n\t\tDBG_871X(\"pid[1]:%d\\n\",padapter->pid[1]);\n\t\trtw_signal_process(padapter->pid[1], SIGUSR2);\n\t}\t\n\n\n\tif (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_STATION_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));\n\n\t\tif (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME))\n\t\t\trtw_roaming(padapter, NULL);\n\t\t\n\t} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_AP_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));\n\t\trtw_ap_restore_network(padapter);\n\t} else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_ADHOC_STATE\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));\n\t} else {\n\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - ???\\n\", FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));\n\t}\n\n\t#ifdef CONFIG_CONCURRENT_MODE\n\tif(rtw_buddy_adapter_up(padapter))\n\t{\t\n\t\t_adapter *buddy = padapter->pbuddy_adapter;\n\t\tstruct mlme_priv *buddy_mlme = &padapter->pbuddy_adapter->mlmepriv;\n\t\tif (check_fwstate(buddy_mlme, WIFI_STATION_STATE)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_STATION_STATE\\n\", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));\n\n\t\t\tif (rtw_chk_roam_flags(buddy, RTW_ROAM_ON_RESUME))\n\t\t\t\trtw_roaming(buddy, NULL);\n\t\t\n\t\t} else if (check_fwstate(buddy_mlme, WIFI_AP_STATE)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_AP_STATE\\n\", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));\n\t\t\trtw_ap_restore_network(buddy);\n\t\t} else if (check_fwstate(buddy_mlme, WIFI_ADHOC_STATE)) {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - WIFI_ADHOC_STATE\\n\", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));\n\t\t} else {\n\t\t\tDBG_871X(FUNC_ADPT_FMT\" fwstate:0x%08x - ???\\n\", FUNC_ADPT_ARG(buddy), get_fwstate(buddy_mlme));\n\t\t}\n\t}\n\t#endif\n\n#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\t//rtw_unlock_suspend();\n#endif //CONFIG_RESUME_IN_WORKQUEUE\n\tDBG_871X(\"<== \"FUNC_ADPT_FMT\" exit....\\n\", FUNC_ADPT_ARG(padapter));\n\nexit:\t\n_func_exit_;\n\treturn ret;\t\n}\n\nint rtw_resume_common(_adapter *padapter)\n{\n\tint ret = 0;\n\tu32 start_time = rtw_get_current_time();\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\n\t_func_enter_;\n\n\tif (pwrpriv->bInSuspend == _FALSE)\n\t\treturn 0;\n\n\tDBG_871X_LEVEL(_drv_always_, \"resume start\\n\");\n\tDBG_871X(\"==> %s (%s:%d)\\n\",__FUNCTION__, current->comm, current->pid);\t\n\n\tif (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE\n#endif\n\t) {\n\t#ifdef CONFIG_WOWLAN\n\t\tif (pwrpriv->wowlan_mode == _TRUE)\n\t\t\trtw_resume_process_wow(padapter);\n\t\telse\n\t\t\trtw_resume_process_normal(padapter);\n\t#else\n\t\trtw_resume_process_normal(padapter);\n\t#endif\n\n\t} else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE\n#ifdef CONFIG_CONCURRENT_MODE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _FALSE\n#endif\n\t) {\n\t#ifdef CONFIG_AP_WOWLAN\n\t\trtw_resume_process_ap_wow(padapter);\n\t#else\n\t\trtw_resume_process_normal(padapter);\n\t#endif //CONFIG_AP_WOWLAN\n#ifdef CONFIG_CONCURRENT_MODE\n\t} else if (check_fwstate(pmlmepriv,WIFI_STATION_STATE) == _TRUE\n\t\t&& check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {\n\t#ifdef CONFIG_AP_WOWLAN\n\t\trtw_resume_process_ap_wow(padapter);\n\t#else\n\t\trtw_resume_process_normal(padapter);\n\t#endif //CONFIG_AP_WOWLAN\n#endif\n\t} else {\n\t\trtw_resume_process_normal(padapter);\n\t}\n\n\t#ifdef CONFIG_BT_COEXIST\n\trtw_btcoex_SuspendNotify(padapter, 0);\n\t#endif // CONFIG_BT_COEXIST\n\n\tif (pwrpriv) {\n\t\tpwrpriv->bInSuspend = _FALSE;\n\t#ifdef CONFIG_PNO_SUPPORT\n\t\tpwrpriv->pno_in_resume = _FALSE;\n\t#endif\n\t}\n\tDBG_871X_LEVEL(_drv_always_, \"%s:%d in %d ms\\n\", __FUNCTION__ ,ret,\n\t\trtw_get_passing_time_ms(start_time));\n\n\t_func_exit_;\n\t\n\treturn ret;\n}\n\n#ifdef CONFIG_GPIO_API\nu8 rtw_get_gpio(struct net_device *netdev, u8 gpio_num)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\n\treturn rtw_hal_get_gpio(adapter, gpio_num);\n}\nEXPORT_SYMBOL(rtw_get_gpio);\n\nint  rtw_set_gpio_output_value(struct net_device *netdev, u8 gpio_num, bool isHigh)\n{\n\tu8 direction = 0;\n\tu8 res = -1;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\n\treturn rtw_hal_set_gpio_output_value(adapter, gpio_num,isHigh);\n}\nEXPORT_SYMBOL(rtw_set_gpio_output_value);\n\nint rtw_config_gpio(struct net_device *netdev, u8 gpio_num, bool isOutput)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\t\n\treturn rtw_hal_config_gpio(adapter,gpio_num,isOutput);\t\n}\nEXPORT_SYMBOL(rtw_config_gpio);\nint rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level))\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\n\treturn rtw_hal_register_gpio_interrupt(adapter,gpio_num,callback);\n}\nEXPORT_SYMBOL(rtw_register_gpio_interrupt);\n\nint rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);\n\treturn rtw_hal_disable_gpio_interrupt(adapter,gpio_num);\n}\nEXPORT_SYMBOL(rtw_disable_gpio_interrupt);\n\n#endif //#ifdef CONFIG_GPIO_API \n\n"
  },
  {
    "path": "os_dep/linux/recv_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _RECV_OSDEP_C_\n\n#include <drv_types.h>\n\nint rtw_os_alloc_recvframe(_adapter *padapter, union recv_frame *precvframe, u8 *pdata, _pkt *pskb)\n{\n\tint res = _SUCCESS;\n\tu8\tshift_sz = 0;\n\tu32\tskb_len, alloc_sz;\n\t_pkt\t *pkt_copy = NULL;\t\n\tstruct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;\n\n\n\tif(pdata == NULL)\n\t{\t\t\n\t\tprecvframe->u.hdr.pkt = NULL;\n\t\tres = _FAIL;\n\t\treturn res;\n\t}\t\n\n\n\t//\tModified by Albert 20101213\n\t//\tFor 8 bytes IP header alignment.\n\tshift_sz = pattrib->qos ? 6:0;//\tQos data, wireless lan header length is 26\n\n\tskb_len = pattrib->pkt_len;\n\n\t// for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.\n\t// modify alloc_sz for recvive crc error packet by thomas 2011-06-02\n\tif((pattrib->mfrag == 1)&&(pattrib->frag_num == 0))\n\t{\n\t\t//alloc_sz = 1664;\t//1664 is 128 alignment.\n\t\talloc_sz = (skb_len <= 1650) ? 1664:(skb_len + 14);\t\t\n\t}\n\telse \n\t{\n\t\talloc_sz = skb_len;\n\t\t//\t6 is for IP header 8 bytes alignment in QoS packet case.\n\t\t//\t8 is for skb->data 4 bytes alignment.\n\t\talloc_sz += 14;\n\t}\t\n\n\tpkt_copy = rtw_skb_alloc(alloc_sz);\n\n\tif(pkt_copy)\n\t{\n\t\tpkt_copy->dev = padapter->pnetdev;\n\t\tprecvframe->u.hdr.pkt = pkt_copy;\n\t\tprecvframe->u.hdr.rx_head = pkt_copy->data;\n\t\tprecvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz;\n\t\tskb_reserve(pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data) & 7 ));//force pkt_copy->data at 8-byte alignment address\n\t\tskb_reserve(pkt_copy, shift_sz);//force ip_hdr at 8-byte alignment address according to shift_sz.\n\t\t_rtw_memcpy(pkt_copy->data, pdata, skb_len);\n\t\tprecvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data;\n\t}\n\telse\n\t{\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t\tDBG_871X(\"%s:can not allocate memory for skb copy\\n\", __FUNCTION__);\n\n\t\tprecvframe->u.hdr.pkt = NULL;\n\n\t\t//rtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t//goto _exit_recvbuf2recvframe;\n\n\t\tres = _FAIL;\t\n#else\n\t\tif((pattrib->mfrag == 1)&&(pattrib->frag_num == 0))\n\t\t{\t\t\t\t\n\t\t\tDBG_871X(\"%s: alloc_skb fail , drop frag frame \\n\", __FUNCTION__);\n\t\t\t//rtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t\tres = _FAIL;\n\t\t\tgoto exit_rtw_os_recv_resource_alloc;\n\t\t}\n\n\t\tif(pskb == NULL)\n\t\t{\n\t\t\tres = _FAIL;\n\t\t\tgoto exit_rtw_os_recv_resource_alloc;\n\t\t}\n\t\t\t\n\t\tprecvframe->u.hdr.pkt = rtw_skb_clone(pskb);\n\t\tif(precvframe->u.hdr.pkt)\n\t\t{\n\t\t\tprecvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pdata;\n\t\t\tprecvframe->u.hdr.rx_end =  pdata + alloc_sz;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"%s: rtw_skb_clone fail\\n\", __FUNCTION__);\n\t\t\t//rtw_free_recvframe(precvframe, pfree_recv_queue);\n\t\t\t//goto _exit_recvbuf2recvframe;\n\t\t\tres = _FAIL;\n\t\t}\n#endif\t\t\t\n\t}\t\t\n\nexit_rtw_os_recv_resource_alloc:\n\n\treturn res;\n\n}\n\nvoid rtw_os_free_recvframe(union recv_frame *precvframe)\n{\n\tif(precvframe->u.hdr.pkt)\n\t{\n\t\trtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver\n\n\t\tprecvframe->u.hdr.pkt = NULL;\n\t}\n}\n\n//init os related resource in struct recv_priv\nint rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter)\n{\n\tint\tres=_SUCCESS;\n\n\treturn res;\n}\n\n//alloc os related resource in union recv_frame\nint rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe)\n{\n\tint\tres=_SUCCESS;\n\t\n\tprecvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL;\n\n\treturn res;\n}\n\n//free os related resource in union recv_frame\nvoid rtw_os_recv_resource_free(struct recv_priv *precvpriv)\n{\n\tsint i;\n\tunion recv_frame *precvframe;\n\tprecvframe = (union recv_frame*) precvpriv->precv_frame_buf;\n\n\tfor(i=0; i < NR_RECVFRAME; i++)\n\t{\n\t\tif(precvframe->u.hdr.pkt)\n\t\t{\n\t\t\trtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver\n\t\t\tprecvframe->u.hdr.pkt = NULL;\n\t\t}\n\t\tprecvframe++;\n\t}\n}\n\n//alloc os related resource in struct recv_buf\nint rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf)\n{\n\tint res=_SUCCESS;\n\n#ifdef CONFIG_USB_HCI\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct usb_device\t*pusbd = pdvobjpriv->pusbdev;\n\n\tprecvbuf->irp_pending = _FALSE;\n\tprecvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);\n\tif(precvbuf->purb == NULL){\n\t\tres = _FAIL;\n\t}\n\n\tprecvbuf->pskb = NULL;\n\n\tprecvbuf->pallocated_buf  = precvbuf->pbuf = NULL;\n\n\tprecvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL;\n\n\tprecvbuf->transfer_len = 0;\n\n\tprecvbuf->len = 0;\n\n\t#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\tprecvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, &precvbuf->dma_transfer_addr);\n\tprecvbuf->pbuf = precvbuf->pallocated_buf;\n\tif(precvbuf->pallocated_buf == NULL)\n\t\treturn _FAIL;\n\t#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\n\t\n#endif //CONFIG_USB_HCI\n\n\treturn res;\n}\n\n//free os related resource in struct recv_buf\nint rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)\n{\n\tint ret = _SUCCESS;\n\n#ifdef CONFIG_USB_HCI\n\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct usb_device\t*pusbd = pdvobjpriv->pusbdev;\n\n\trtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr);\n\tprecvbuf->pallocated_buf =  NULL;\n\tprecvbuf->dma_transfer_addr = 0;\n\n#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n\tif(precvbuf->purb)\n\t{\n\t\t//usb_kill_urb(precvbuf->purb);\n\t\tusb_free_urb(precvbuf->purb);\n\t}\n\n#endif //CONFIG_USB_HCI\n\n\n\tif(precvbuf->pskb)\n\t{\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\tif(rtw_free_skb_premem(precvbuf->pskb)!=0)\n#endif\n\t\trtw_skb_free(precvbuf->pskb);\n\t}\n\treturn ret;\n\n}\n\n_pkt *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, u16 nSubframe_Length, u8 *pdata)\n{\n\tu16\teth_type;\n\tu8\t*data_ptr;\n\t_pkt *sub_skb;\n\tstruct rx_pkt_attrib *pattrib;\n\n\tpattrib = &prframe->u.hdr.attrib;\n\n#ifdef CONFIG_SKB_COPY\n\tsub_skb = rtw_skb_alloc(nSubframe_Length + 12);\n\tif(sub_skb)\n\t{\n\t\tskb_reserve(sub_skb, 12);\n\t\tdata_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);\n\t\t_rtw_memcpy(data_ptr, (pdata + ETH_HLEN), nSubframe_Length);\n\t}\n\telse\n#endif // CONFIG_SKB_COPY\n\t{\n\t\tsub_skb = rtw_skb_clone(prframe->u.hdr.pkt);\n\t\tif(sub_skb)\n\t\t{\n\t\t\tsub_skb->data = pdata + ETH_HLEN;\n\t\t\tsub_skb->len = nSubframe_Length;\n\t\t\tskb_set_tail_pointer(sub_skb, nSubframe_Length);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDBG_871X(\"%s(): rtw_skb_clone() Fail!!!\\n\",__FUNCTION__);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\teth_type = RTW_GET_BE16(&sub_skb->data[6]);\n\n\tif (sub_skb->len >= 8 &&\n\t\t((_rtw_memcmp(sub_skb->data, rtw_rfc1042_header, SNAP_SIZE) &&\n\t\t  eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||\n\t\t _rtw_memcmp(sub_skb->data, rtw_bridge_tunnel_header, SNAP_SIZE) )) {\n\t\t/* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */\n\t\tskb_pull(sub_skb, SNAP_SIZE);\n\t\t_rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);\n\t\t_rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);\n\t} else {\n\t\tu16 len;\n\t\t/* Leave Ethernet header part of hdr and full payload */\n\t\tlen = htons(sub_skb->len);\n\t\t_rtw_memcpy(skb_push(sub_skb, 2), &len, 2);\n\t\t_rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);\n\t\t_rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);\n\t}\n\n\treturn sub_skb;\n}\n\n#ifdef DBG_UDP_PKT_LOSE_11AC\n#define PAYLOAD_LEN_LOC_OF_IP_HDR 0x10 /*ethernet payload length location of ip header (DA+SA+eth_type+(version&hdr_len)) */\t\n#endif\n\nvoid rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attrib *pattrib)\n{\n\tstruct mlme_priv*pmlmepriv = &padapter->mlmepriv;\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n#ifdef CONFIG_BR_EXT\n\tvoid *br_port = NULL;\n#endif\n\tint ret;\n\n\t/* Indicat the packets to upper layer */\n\tif (pkt) {\n\t\tif(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\n\t\t{\n\t\t \t_pkt *pskb2=NULL;\n\t\t \tstruct sta_info *psta = NULL;\n\t\t \tstruct sta_priv *pstapriv = &padapter->stapriv;\n\t\t\tint bmcast = IS_MCAST(pattrib->dst);\n\n\t\t\t//DBG_871X(\"bmcast=%d\\n\", bmcast);\n\n\t\t\tif (_rtw_memcmp(pattrib->dst, adapter_mac_addr(padapter), ETH_ALEN) == _FALSE)\n\t\t\t{\n\t\t\t\t//DBG_871X(\"not ap psta=%p, addr=%pM\\n\", psta, pattrib->dst);\n\n\t\t\t\tif(bmcast)\n\t\t\t\t{\n\t\t\t\t\tpsta = rtw_get_bcmc_stainfo(padapter);\n\t\t\t\t\tpskb2 = rtw_skb_clone(pkt);\n\t\t\t\t} else {\n\t\t\t\t\tpsta = rtw_get_stainfo(pstapriv, pattrib->dst);\n\t\t\t\t}\n\n\t\t\t\tif(psta)\n\t\t\t\t{\n\t\t\t\t\tstruct net_device *pnetdev= (struct net_device*)padapter->pnetdev;\t\t\t\n\n\t\t\t\t\t//DBG_871X(\"directly forwarding to the rtw_xmit_entry\\n\");\n\n\t\t\t\t\t//skb->ip_summed = CHECKSUM_NONE;\n\t\t\t\t\tpkt->dev = pnetdev;\t\t\t\t\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\t\t\t\tskb_set_queue_mapping(pkt, rtw_recv_select_queue(pkt));\n#endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)\n\n\t\t\t\t\t_rtw_xmit_entry(pkt, pnetdev);\n\n\t\t\t\t\tif(bmcast && (pskb2 != NULL) ) {\n\t\t\t\t\t\tpkt = pskb2;\n\t\t\t\t\t\tDBG_COUNTER(padapter->rx_logs.os_indicate_ap_mcast);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDBG_COUNTER(padapter->rx_logs.os_indicate_ap_forward);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse// to APself\n\t\t\t{\n\t\t\t\t//DBG_871X(\"to APSelf\\n\");\n\t\t\t\tDBG_COUNTER(padapter->rx_logs.os_indicate_ap_self);\n\t\t\t}\n\t\t}\n\t\t\n#ifdef CONFIG_BR_EXT\n\t\t// Insert NAT2.5 RX here!\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\tbr_port = padapter->pnetdev->br_port;\n#else   // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\t\trcu_read_lock();\n\t\tbr_port = rcu_dereference(padapter->pnetdev->rx_handler_data);\n\t\trcu_read_unlock();\n#endif  // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))\n\n\n\t\tif( br_port && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )\n\t\t{\n\t\t\tint nat25_handle_frame(_adapter *priv, struct sk_buff *skb);\n\t\t\tif (nat25_handle_frame(padapter, pkt) == -1) {\n\t\t\t\t//priv->ext_stats.rx_data_drops++;\n\t\t\t\t//DEBUG_ERR(\"RX DROP: nat25_handle_frame fail!\\n\");\n\t\t\t\t//return FAIL;\n\t\t\t\t\n#if 1\n\t\t\t\t// bypass this frame to upper layer!!\n#else\n\t\t\t\trtw_skb_free(sub_skb);\n\t\t\t\tcontinue;\n#endif\n\t\t\t}\t\t\t\t\t\t\t\n\t\t}\n#endif\t// CONFIG_BR_EXT\n\t\tif( precvpriv->sink_udpport > 0)\n\t\t\trtw_sink_rtp_seq_dbg(padapter,pkt);\n#ifdef DBG_UDP_PKT_LOSE_11AC\n\t\t/* After eth_type_trans process , pkt->data pointer will move from ethrnet header to ip header ,  \n\t\t*\twe have to check ethernet type , so this debug must be print before eth_type_trans\n\t\t*/\n\t\tif (*((unsigned short *)(pkt->data+ETH_ALEN*2)) == htons(ETH_P_ARP)) {\n\t\t\t/* ARP Payload length will be 42bytes or 42+18(tailer)=60bytes*/\n\t\t\tif (pkt->len != 42 && pkt->len != 60) \n\t\t\t\tDBG_871X(\"Error !!%s,ARP Payload length %u not correct\\n\" , __func__ , pkt->len);\n\t\t} else if (*((unsigned short *)(pkt->data+ETH_ALEN*2)) == htons(ETH_P_IP)) { \n\t\t\tif (be16_to_cpu(*((u16 *)(pkt->data+PAYLOAD_LEN_LOC_OF_IP_HDR))) != (pkt->len)-ETH_HLEN) {\n\t\t\t\tDBG_871X(\"Error !!%s,Payload length not correct\\n\" , __func__);\n\t\t\t\tDBG_871X(\"%s, IP header describe Total length=%u\\n\" , __func__ , be16_to_cpu(*((u16 *)(pkt->data+PAYLOAD_LEN_LOC_OF_IP_HDR))));\n\t\t\t\tDBG_871X(\"%s, Pkt real length=%u\\n\" , __func__ , (pkt->len)-ETH_HLEN);\n\t\t\t} \n\t\t}\n#endif\n\t\t/* After eth_type_trans process , pkt->data pointer will move from ethrnet header to ip header */\n\t\tpkt->protocol = eth_type_trans(pkt, padapter->pnetdev);\n\t\tpkt->dev = padapter->pnetdev;\n\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX\n\t\tif ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) {\n\t\t\tpkt->ip_summed = CHECKSUM_UNNECESSARY;\n\t\t} else {\n\t\t\tpkt->ip_summed = CHECKSUM_NONE;\n\t\t}\n#else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */\n\t\tpkt->ip_summed = CHECKSUM_NONE;\n#endif //CONFIG_TCP_CSUM_OFFLOAD_RX\n\n\t\tret = rtw_netif_rx(padapter->pnetdev, pkt);\n\t\tif (ret == NET_RX_SUCCESS)\n\t\t\tDBG_COUNTER(padapter->rx_logs.os_netif_ok);\n\t\telse\n\t\t\tDBG_COUNTER(padapter->rx_logs.os_netif_err);\n\t}\n}\n\nvoid rtw_handle_tkip_mic_err(_adapter *padapter, struct sta_info *sta, u8 bgroup)\n{\n#ifdef CONFIG_IOCTL_CFG80211\n\tenum nl80211_key_type key_type = 0;\n#endif\n\tunion iwreq_data wrqu;\n\tstruct iw_michaelmicfailure    ev;\n\tstruct mlme_priv*              pmlmepriv  = &padapter->mlmepriv;\n\tstruct security_priv\t*psecuritypriv = &padapter->securitypriv;\t\n\tu32 cur_time = 0;\n\n\tif( psecuritypriv->last_mic_err_time == 0 )\n\t{\n\t\tpsecuritypriv->last_mic_err_time = rtw_get_current_time();\n\t}\n\telse\n\t{\n\t\tcur_time = rtw_get_current_time();\n\n\t\tif( cur_time - psecuritypriv->last_mic_err_time < 60*HZ )\n\t\t{\n\t\t\tpsecuritypriv->btkip_countermeasure = _TRUE;\n\t\t\tpsecuritypriv->last_mic_err_time = 0;\n\t\t\tpsecuritypriv->btkip_countermeasure_time = cur_time;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpsecuritypriv->last_mic_err_time = rtw_get_current_time();\n\t\t}\n\t}\n\n#ifdef CONFIG_IOCTL_CFG80211\n\tif ( bgroup )\n\t{\n\t\tkey_type |= NL80211_KEYTYPE_GROUP;\n\t}\n\telse\n\t{\n\t\tkey_type |= NL80211_KEYTYPE_PAIRWISE;\n\t}\n\n\tcfg80211_michael_mic_failure(padapter->pnetdev, sta->hwaddr, key_type, -1, NULL, GFP_ATOMIC);\n#endif\n\n\t_rtw_memset( &ev, 0x00, sizeof( ev ) );\n\tif ( bgroup )\n\t{\n\t    ev.flags |= IW_MICFAILURE_GROUP;\n\t}\n\telse\n\t{\n\t    ev.flags |= IW_MICFAILURE_PAIRWISE;\n\t}\n\n\tev.src_addr.sa_family = ARPHRD_ETHER;\n\t_rtw_memcpy(ev.src_addr.sa_data, sta->hwaddr, ETH_ALEN);\n\n\t_rtw_memset( &wrqu, 0x00, sizeof( wrqu ) );\n\twrqu.data.length = sizeof( ev );\n\n#ifndef CONFIG_IOCTL_CFG80211\n\twireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev );\n#endif\n}\n\nvoid rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame)\n{\n#ifdef CONFIG_HOSTAPD_MLME\n\t_pkt *skb;\n\tstruct hostapd_priv *phostapdpriv  = padapter->phostapdpriv;\n\tstruct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev;\n\n\tRT_TRACE(_module_recv_osdep_c_, _drv_info_, (\"+rtw_hostapd_mlme_rx\\n\"));\n\n\tskb = precv_frame->u.hdr.pkt;\n\n\tif (skb == NULL)\n\t\treturn;\n\n\tskb->data = precv_frame->u.hdr.rx_data;\n\tskb->tail = precv_frame->u.hdr.rx_tail;\n\tskb->len = precv_frame->u.hdr.len;\n\n\t//pskb_copy = rtw_skb_copy(skb);\n//\tif(skb == NULL) goto _exit;\n\n\tskb->dev = pmgnt_netdev;\n\tskb->ip_summed = CHECKSUM_NONE;\n\tskb->pkt_type = PACKET_OTHERHOST;\n\t//skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/\n\tskb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/\n\n\t//DBG_871X(\"(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\\n\", skb->data, skb->head, skb->tail, skb->mac_header, skb->len);\n\n\t//skb->mac.raw = skb->data;\n\tskb_reset_mac_header(skb);\n\n       //skb_pull(skb, 24);\n       _rtw_memset(skb->cb, 0, sizeof(skb->cb));\n\n\trtw_netif_rx(pmgnt_netdev, skb);\n\n\tprecv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call rtw_netif_rx()\n#endif\n}\n\n#ifdef CONFIG_AUTO_AP_MODE\nstatic void rtw_os_ksocket_send(_adapter *padapter, union recv_frame *precv_frame)\n{\t\n\t_pkt *skb = precv_frame->u.hdr.pkt;\t\n\tstruct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;\n\tstruct sta_info *psta = precv_frame->u.hdr.psta;\n\t\t\n\tDBG_871X(\"eth rx: got eth_type=0x%x\\n\", pattrib->eth_type);\t\t\t\t\t\n\t\t\n\tif (psta && psta->isrc && psta->pid>0)\n\t{\n\t\tu16 rx_pid;\n\n\t\trx_pid = *(u16*)(skb->data+ETH_HLEN);\n\t\t\t\n\t\tDBG_871X(\"eth rx(pid=0x%x): sta(\"MAC_FMT\") pid=0x%x\\n\", \n\t\t\trx_pid, MAC_ARG(psta->hwaddr), psta->pid);\n\n\t\tif(rx_pid == psta->pid)\n\t\t{\n\t\t\tint i;\n\t\t\tu16 len = *(u16*)(skb->data+ETH_HLEN+2);\n\t\t\t//u16 ctrl_type = *(u16*)(skb->data+ETH_HLEN+4);\n\n\t\t\t//DBG_871X(\"eth, RC: len=0x%x, ctrl_type=0x%x\\n\", len, ctrl_type); \n\t\t\tDBG_871X(\"eth, RC: len=0x%x\\n\", len);\n\n\t\t\tfor(i=0;i<len;i++)\n\t\t\t\tDBG_871X(\"0x%x\\n\", *(skb->data+ETH_HLEN+4+i));\n\t\t\t\t//DBG_871X(\"0x%x\\n\", *(skb->data+ETH_HLEN+6+i));\n\n\t\t\tDBG_871X(\"eth, RC-end\\n\"); \n\n#if 0\n\t\t\t//send_sz = ksocket_send(padapter->ksock_send, &padapter->kaddr_send, (skb->data+ETH_HLEN+2), len);\t\t\t\t\n\t\t\trtw_recv_ksocket_send_cmd(padapter, (skb->data+ETH_HLEN+2), len);\n\n\t\t\t//DBG_871X(\"ksocket_send size=%d\\n\", send_sz); \n#endif\t\t\t\n\t\t}\n\t\t\n\t}\t\t\n\n}\n#endif //CONFIG_AUTO_AP_MODE\n\nint rtw_recv_monitor(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tint ret = _FAIL;\n\tstruct recv_priv *precvpriv;\n\t_queue\t*pfree_recv_queue;\n\t_pkt *skb;\n\tstruct mlme_priv *pmlmepriv = &padapter->mlmepriv;\n\tstruct rx_pkt_attrib *pattrib;\n\n\tif (NULL == precv_frame)\n\t\tgoto _recv_drop;\n\n\tpattrib = &precv_frame->u.hdr.attrib;\n\tprecvpriv = &(padapter->recvpriv);\n\tpfree_recv_queue = &(precvpriv->free_recv_queue);\n\n\tskb = precv_frame->u.hdr.pkt;\n\tif (skb == NULL) {\n\t\tDBG_871X(\"%s :skb==NULL something wrong!!!!\\n\", __func__);\n\t\tgoto _recv_drop;\n\t}\n\n\tskb->data = precv_frame->u.hdr.rx_data;\n\tskb_set_tail_pointer(skb, precv_frame->u.hdr.len);\n\tskb->len = precv_frame->u.hdr.len;\n\tskb->ip_summed = CHECKSUM_NONE;\n\tskb->pkt_type = PACKET_OTHERHOST;\n\tskb->protocol = htons(0x0019); /* ETH_P_80211_RAW */\n\n\trtw_netif_rx(padapter->pnetdev, skb);\n\n\t/* pointers to NULL before rtw_free_recvframe() */\n\tprecv_frame->u.hdr.pkt = NULL;\n\n\tret = _SUCCESS;\n\n_recv_drop:\n\n\t/* enqueue back to free_recv_queue */\n\tif (precv_frame)\n\t\trtw_free_recvframe(precv_frame, pfree_recv_queue);\n\n\treturn ret;\n\n}\n\nint rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)\n{\n\tstruct recv_priv *precvpriv;\n\t_queue\t*pfree_recv_queue;\n\t_pkt *skb;\n\tstruct mlme_priv*pmlmepriv = &padapter->mlmepriv;\n\tstruct rx_pkt_attrib *pattrib;\n\t\n\tif(NULL == precv_frame)\n\t\tgoto _recv_indicatepkt_drop;\n\n\tDBG_COUNTER(padapter->rx_logs.os_indicate);\n\tpattrib = &precv_frame->u.hdr.attrib;\n\tprecvpriv = &(padapter->recvpriv);\n\tpfree_recv_queue = &(precvpriv->free_recv_queue);\n\n#ifdef CONFIG_DRVEXT_MODULE\n\tif (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS)\n\t{\n\t\tgoto _recv_indicatepkt_drop;\n\t}\n#endif\n\n#ifdef CONFIG_WAPI_SUPPORT\n\tif (rtw_wapi_check_for_drop(padapter,precv_frame))\n\t{\n\t\tWAPI_TRACE(WAPI_ERR, \"%s(): Rx Reorder Drop case!!\\n\", __FUNCTION__);\n\t\tgoto _recv_indicatepkt_drop;\n\t}\n#endif\n\n\tskb = precv_frame->u.hdr.pkt;\n\tif(skb == NULL)\n\t{\n\t\tRT_TRACE(_module_recv_osdep_c_,_drv_err_,(\"rtw_recv_indicatepkt():skb==NULL something wrong!!!!\\n\"));\n\t\tgoto _recv_indicatepkt_drop;\n\t}\n\n\tRT_TRACE(_module_recv_osdep_c_,_drv_info_,(\"rtw_recv_indicatepkt():skb != NULL !!!\\n\"));\t\t\n\tRT_TRACE(_module_recv_osdep_c_,_drv_info_,(\"rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p  precv_frame->hdr.rx_data=%p\\n\", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data));\n\tRT_TRACE(_module_recv_osdep_c_,_drv_info_,(\"precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \\n\", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len));\n\n\tskb->data = precv_frame->u.hdr.rx_data;\n\n\tskb_set_tail_pointer(skb, precv_frame->u.hdr.len);\n\n\tskb->len = precv_frame->u.hdr.len;\n\n\tRT_TRACE(_module_recv_osdep_c_,_drv_info_,(\"\\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\\n\", skb->head, skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), skb->len));\n\n\tif (pattrib->eth_type == 0x888e)\n\t\tDBG_871X_LEVEL(_drv_always_, \"recv eapol packet\\n\");\n\n#ifdef CONFIG_AUTO_AP_MODE\t\n#if 1 //for testing\n#if 1\n\tif (0x8899 == pattrib->eth_type)\n\t{\n\t\trtw_os_ksocket_send(padapter, precv_frame);\n\n\t\t//goto _recv_indicatepkt_drop;\n\t}\n#else\n\tif (0x8899 == pattrib->eth_type)\n\t{\n\t\trtw_auto_ap_mode_rx(padapter, precv_frame);\n\t\t\n\t\tgoto _recv_indicatepkt_end;\n\t}\n#endif\n#endif\n#endif //CONFIG_AUTO_AP_MODE\n\n\trtw_os_recv_indicate_pkt(padapter, skb, pattrib);\n\n_recv_indicatepkt_end:\n\n\tprecv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe()\n\n\trtw_free_recvframe(precv_frame, pfree_recv_queue);\n\n\tRT_TRACE(_module_recv_osdep_c_,_drv_info_,(\"\\n rtw_recv_indicatepkt :after rtw_os_recv_indicate_pkt!!!!\\n\"));\n\n\n        return _SUCCESS;\n\n_recv_indicatepkt_drop:\n\n\t //enqueue back to free_recv_queue\n\t if(precv_frame)\n\t\t rtw_free_recvframe(precv_frame, pfree_recv_queue);\n\n\t DBG_COUNTER(padapter->rx_logs.os_indicate_err);\n\n\t return _FAIL;\n\n}\n\nvoid rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf)\n{\n\tstruct recv_priv *precvpriv = &padapter->recvpriv;\n\n#ifdef CONFIG_USB_HCI\n\n\tprecvbuf->ref_cnt--;\n\n\t//free skb in recv_buf\n\trtw_skb_free(precvbuf->pskb);\n\n\tprecvbuf->pskb = NULL;\n\n\tif(precvbuf->irp_pending == _FALSE)\n\t{\n\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\n\t}\n\n\n#endif\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\t\tprecvbuf->pskb = NULL;\n#endif\n\n}\nvoid _rtw_reordering_ctrl_timeout_handler (void *FunctionContext);\nvoid _rtw_reordering_ctrl_timeout_handler (void *FunctionContext)\n{\n\tstruct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext;\n\trtw_reordering_ctrl_timeout_handler(preorder_ctrl);\n}\n\nvoid rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)\n{\n\t_adapter *padapter = preorder_ctrl->padapter;\n\n\t_init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl);\n\n}\n\n"
  },
  {
    "path": "os_dep/linux/rtw_android.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifdef CONFIG_GPIO_WAKEUP\n#include <linux/gpio.h>\n#endif\n\n#include <drv_types.h>\n\n#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)\n#include <linux/platform_device.h>\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))\n#include <linux/wlan_plat.h>\n#else\n#include <linux/wifi_tiwlan.h>\n#endif\n#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0))\n#define strnicmp\tstrncasecmp\n#endif /* Linux kernel >= 4.0.0 */\n\n#ifdef CONFIG_GPIO_WAKEUP\n#include <linux/interrupt.h>\n#include <linux/irq.h>\n#endif\n\n#include \"rtw_version.h\"\n\nextern void macstr2num(u8 *dst, u8 *src);\n\nconst char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {\n\t\"START\",\n\t\"STOP\",\n\t\"SCAN-ACTIVE\",\n\t\"SCAN-PASSIVE\",\n\t\"RSSI\",\n\t\"LINKSPEED\",\n\t\"RXFILTER-START\",\n\t\"RXFILTER-STOP\",\n\t\"RXFILTER-ADD\",\n\t\"RXFILTER-REMOVE\",\n\t\"BTCOEXSCAN-START\",\n\t\"BTCOEXSCAN-STOP\",\n\t\"BTCOEXMODE\",\n\t\"SETSUSPENDOPT\",\n\t\"P2P_DEV_ADDR\",\n\t\"SETFWPATH\",\n\t\"SETBAND\",\n\t\"GETBAND\",\n\t\"COUNTRY\",\n\t\"P2P_SET_NOA\",\n\t\"P2P_GET_NOA\",\n\t\"P2P_SET_PS\",\n\t\"SET_AP_WPS_P2P_IE\",\n\n\t\"MIRACAST\",\n\n#ifdef CONFIG_PNO_SUPPORT\n\t\"PNOSSIDCLR\",\n\t\"PNOSETUP\",\n\t\"PNOFORCE\",\n\t\"PNODEBUG\",\n#endif\n\n\t\"MACADDR\",\n\n\t\"BLOCK_SCAN\",\n\t\"BLOCK\",\n\t\"WFD-ENABLE\",\n\t\"WFD-DISABLE\",\n\t\"WFD-SET-TCPPORT\",\n\t\"WFD-SET-MAXTPUT\",\n\t\"WFD-SET-DEVTYPE\",\n\t\"SET_DTIM\",\n\t\"HOSTAPD_SET_MACADDR_ACL\",\n\t\"HOSTAPD_ACL_ADD_STA\",\n\t\"HOSTAPD_ACL_REMOVE_STA\",\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0))\n\t\"GTK_REKEY_OFFLOAD\",\n#endif //CONFIG_GTK_OL\n/*\tPrivate command for\tP2P disable*/\n\t\"P2P_DISABLE\",\n\t\"DRIVER_VERSION\"\n};\n\n#ifdef CONFIG_PNO_SUPPORT\n#define PNO_TLV_PREFIX\t\t\t'S'\n#define PNO_TLV_VERSION\t\t\t'1'\n#define PNO_TLV_SUBVERSION \t\t'2'\n#define PNO_TLV_RESERVED\t\t'0'\n#define PNO_TLV_TYPE_SSID_IE\t'S'\n#define PNO_TLV_TYPE_TIME\t\t'T'\n#define PNO_TLV_FREQ_REPEAT\t\t'R'\n#define PNO_TLV_FREQ_EXPO_MAX\t'M'\n\ntypedef struct cmd_tlv {\n\tchar prefix;\n\tchar version;\n\tchar subver;\n\tchar reserved;\n} cmd_tlv_t;\n\n#ifdef CONFIG_PNO_SET_DEBUG\nchar pno_in_example[] = {\n\t\t'P', 'N', 'O', 'S', 'E', 'T', 'U', 'P', ' ',\n\t\t'S', '1', '2', '0',\n\t\t'S',\t//1\n\t\t0x05,\n\t\t'd', 'l', 'i', 'n', 'k',\n\t\t'S',\t//2\n\t\t0x06,\n\t\t'B', 'U', 'F', 'B', 'U','F',\n\t\t'S',\t//3\n\t\t0x20,\n\t\t'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '!', '@', '#', '$', '%', '^',\n\t\t'S',\t//4\n\t\t0x0a,\n\t\t'!', '@', '#', '$', '%', '^', '&', '*', '(', ')',\n\t\t'T',\n\t\t'0', '5',\n\t\t'R',\n\t\t'2',\n\t\t'M',\n\t\t'2',\n\t\t0x00\n\t\t};\n#endif /* CONFIG_PNO_SET_DEBUG */\n#endif /* PNO_SUPPORT */\n\ntypedef struct android_wifi_priv_cmd {\n\tchar *buf;\n\tint used_len;\n\tint total_len;\n} android_wifi_priv_cmd;\n\n#ifdef CONFIG_COMPAT\ntypedef struct compat_android_wifi_priv_cmd {\n\tcompat_uptr_t buf;\n\tint used_len;\n\tint total_len;\n} compat_android_wifi_priv_cmd;\n#endif /* CONFIG_COMPAT */\n\n/**\n * Local (static) functions and variables\n */\n\n/* Initialize g_wifi_on to 1 so dhd_bus_start will be called for the first\n * time (only) in dhd_open, subsequential wifi on will be handled by\n * wl_android_wifi_on\n */\nstatic int g_wifi_on = _TRUE;\n\nunsigned int oob_irq = 0;\nunsigned int oob_gpio = 0;\n\n#ifdef CONFIG_PNO_SUPPORT\n/* \n * rtw_android_pno_setup\n * Description: \n * This is used for private command.\n * \n * Parameter:\n * net: net_device\n * command: parameters from private command\n * total_len: the length of the command.\n *\n * */\nstatic int rtw_android_pno_setup(struct net_device *net, char *command, int total_len) {\n\tpno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];\n\tint res = -1;\n\tint nssid = 0;\n\tcmd_tlv_t *cmd_tlv_temp;\n\tchar *str_ptr;\n\tint tlv_size_left;\n\tint pno_time = 0;\n\tint pno_repeat = 0;\n\tint pno_freq_expo_max = 0;\n\tint cmdlen = strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_PNOSETUP_SET]) + 1; \n\n#ifdef CONFIG_PNO_SET_DEBUG\n\tint i;\n\tchar *p;\n\tp = pno_in_example;\n\n\ttotal_len = sizeof(pno_in_example);\n\tstr_ptr = p + cmdlen;\n#else\n\tstr_ptr = command + cmdlen;\n#endif\n\n\tif (total_len < (cmdlen + sizeof(cmd_tlv_t))) {\n\t\tDBG_871X(\"%s argument=%d less min size\\n\", __func__, total_len);\n\t\tgoto exit_proc;\n\t}\n\n\ttlv_size_left = total_len - cmdlen;\n\n\tcmd_tlv_temp = (cmd_tlv_t *)str_ptr;\n\tmemset(pno_ssids_local, 0, sizeof(pno_ssids_local));\n\n\tif ((cmd_tlv_temp->prefix == PNO_TLV_PREFIX) &&\n\t\t(cmd_tlv_temp->version == PNO_TLV_VERSION) &&\n\t\t(cmd_tlv_temp->subver == PNO_TLV_SUBVERSION)) {\n\n\t\tstr_ptr += sizeof(cmd_tlv_t);\n\t\ttlv_size_left -= sizeof(cmd_tlv_t);\n\n\t\tif ((nssid = rtw_parse_ssid_list_tlv(&str_ptr, pno_ssids_local,\n\t\t\tMAX_PNO_LIST_COUNT, &tlv_size_left)) <= 0) {\n\t\t\tDBG_871X(\"SSID is not presented or corrupted ret=%d\\n\", nssid);\n\t\t\tgoto exit_proc;\n\t\t} else {\n\t\t\tif ((str_ptr[0] != PNO_TLV_TYPE_TIME) || (tlv_size_left <= 1)) {\n\t\t\t\tDBG_871X(\"%s scan duration corrupted field size %d\\n\",\n\t\t\t\t\t__func__, tlv_size_left);\n\t\t\t\tgoto exit_proc;\n\t\t\t}\n\t\t\tstr_ptr++;\n\t\t\tpno_time = simple_strtoul(str_ptr, &str_ptr, 16);\n\t\t\tDBG_871X(\"%s: pno_time=%d\\n\", __func__, pno_time);\n\n\t\t\tif (str_ptr[0] != 0) {\n\t\t\t\tif ((str_ptr[0] != PNO_TLV_FREQ_REPEAT)) {\n\t\t\t\t\tDBG_871X(\"%s pno repeat : corrupted field\\n\",\n\t\t\t\t\t\t__func__);\n\t\t\t\t\tgoto exit_proc;\n\t\t\t\t}\n\t\t\t\tstr_ptr++;\n\t\t\t\tpno_repeat = simple_strtoul(str_ptr, &str_ptr, 16);\n\t\t\t\tDBG_871X(\"%s :got pno_repeat=%d\\n\", __FUNCTION__, pno_repeat);\n\t\t\t\tif (str_ptr[0] != PNO_TLV_FREQ_EXPO_MAX) {\n\t\t\t\t\tDBG_871X(\"%s FREQ_EXPO_MAX corrupted field size\\n\",\n\t\t\t\t\t\t__func__);\n\t\t\t\t\tgoto exit_proc;\n\t\t\t\t}\n\t\t\t\tstr_ptr++;\n\t\t\t\tpno_freq_expo_max = simple_strtoul(str_ptr, &str_ptr, 16);\n\t\t\t\tDBG_871X(\"%s: pno_freq_expo_max=%d\\n\",\n\t\t\t\t\t__func__, pno_freq_expo_max);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDBG_871X(\"%s get wrong TLV command\\n\", __FUNCTION__);\n\t\tgoto exit_proc;\n\t}\n\n\tres = rtw_dev_pno_set(net, pno_ssids_local, nssid, pno_time, pno_repeat, pno_freq_expo_max);\n\n#ifdef CONFIG_PNO_SET_DEBUG\n\trtw_dev_pno_debug(net);\n#endif\n\nexit_proc:\n\treturn res;\n}\n\n/* \n * rtw_android_cfg80211_pno_setup\n * Description: \n * This is used for cfg80211 sched_scan.\n * \n * Parameter:\n * net: net_device\n * request: cfg80211_request\n * */\n\nint rtw_android_cfg80211_pno_setup(struct net_device *net,\n\t\tstruct cfg80211_ssid *ssids, int n_ssids, int interval) {\n\tint res = -1;\n\tint nssid = 0;\n\tint pno_time = 0;\n\tint pno_repeat = 0;\n\tint pno_freq_expo_max = 0;\n\tint index = 0;\n\tpno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];\n\n\tif (n_ssids > MAX_PNO_LIST_COUNT || n_ssids < 0) {\n\t\tDBG_871X(\"%s: nssids(%d) is invalid.\\n\", __func__, n_ssids);\n\t\treturn -EINVAL;\n\t}\n\n\tmemset(pno_ssids_local, 0, sizeof(pno_ssids_local));\n\n\tnssid = n_ssids;\n\n\tfor (index = 0 ; index < nssid ; index++) {\n\t\tpno_ssids_local[index].SSID_len = ssids[index].ssid_len;\n\t\tmemcpy(pno_ssids_local[index].SSID, ssids[index].ssid,\n\t\t\t\tssids[index].ssid_len);\n\t}\n\n\tpno_time = (interval / 1000);\n\n\tDBG_871X(\"%s: nssids: %d, pno_time=%d\\n\", __func__, nssid, pno_time);\n\n\tres = rtw_dev_pno_set(net, pno_ssids_local, nssid, pno_time,\n\t\t\tpno_repeat, pno_freq_expo_max);\n\nexit_proc:\n\treturn res;\n}\n\nint rtw_android_pno_enable(struct net_device *net, int pno_enable) {\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);\n\n\tif (pwrctl) {\n\t\tpwrctl->wowlan_pno_enable = pno_enable;\n\t\tDBG_871X(\"%s: wowlan_pno_enable: %d\\n\", __func__, pwrctl->wowlan_pno_enable);\n\t\tif (pwrctl->wowlan_pno_enable == 0) {\n\t\t\tif (pwrctl->pnlo_info != NULL) {\n\t\t\t\trtw_mfree((u8 *)pwrctl->pnlo_info, sizeof(pno_nlo_info_t));\n\t\t\t\tpwrctl->pnlo_info = NULL;\n\t\t\t}\n\t\t\tif (pwrctl->pno_ssid_list != NULL) {\n\t\t\t\trtw_mfree((u8 *)pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));\n\t\t\t\tpwrctl->pno_ssid_list = NULL;\n\t\t\t}\n\t\t\tif (pwrctl->pscan_info != NULL) {\n\t\t\t\trtw_mfree((u8 *)pwrctl->pscan_info, sizeof(pno_scan_info_t));\n\t\t\t\tpwrctl->pscan_info = NULL;\n\t\t\t}\n\t\t} \n\t\treturn 0;\n\t} else {\n\t\treturn -1;\n\t}\n}\n#endif //CONFIG_PNO_SUPPORT\n\nint rtw_android_cmdstr_to_num(char *cmdstr)\n{\n\tint cmd_num;\n\tfor(cmd_num=0 ; cmd_num<ANDROID_WIFI_CMD_MAX; cmd_num++)\n\t\tif(0 == strnicmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )\n\t\t\tbreak;\n\n\treturn cmd_num;\n}\n\nint rtw_android_get_rssi(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct\twlan_network\t*pcur_network = &pmlmepriv->cur_network;\n\tint bytes_written = 0;\n\n\tif(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {\t\n\t\tbytes_written += snprintf(&command[bytes_written], total_len, \"%s rssi %d\", \n\t\t\tpcur_network->network.Ssid.Ssid, padapter->recvpriv.rssi);\n\t}\n\n\treturn bytes_written;\n}\n\nint rtw_android_get_link_speed(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct\tmlme_priv\t*pmlmepriv = &(padapter->mlmepriv);\t\n\tstruct\twlan_network\t*pcur_network = &pmlmepriv->cur_network;\n\tint bytes_written = 0;\n\tu16 link_speed = 0;\n\n\tlink_speed = rtw_get_cur_max_rate(padapter)/10;\n\tbytes_written = snprintf(command, total_len, \"LinkSpeed %d\", link_speed);\n\n\treturn bytes_written;\n}\n\nint rtw_android_get_macaddr(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tint bytes_written = 0;\n\t\n\tbytes_written = snprintf(command, total_len, \"Macaddr = \"MAC_FMT, MAC_ARG(net->dev_addr));\n\treturn bytes_written;\n}\n\nint rtw_android_set_country(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tchar *country_code = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_COUNTRY]) + 1;\n\tint ret = _FAIL;\n\t\n\tret = rtw_set_country(adapter, country_code);\n\n\treturn (ret==_SUCCESS)?0:-1;\n}\n\nint rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int total_len)\n{\n\tint bytes_written = 0;\n\n\t//We use the same address as our HW MAC address\n\t_rtw_memcpy(command, net->dev_addr, ETH_ALEN);\n\t\n\tbytes_written = ETH_ALEN;\n\treturn bytes_written;\n}\n\nint rtw_android_set_block_scan(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tchar *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK_SCAN]) + 1;\n\n\t#ifdef CONFIG_IOCTL_CFG80211\n\tadapter_wdev_data(adapter)->block_scan = (*block_value == '0')?_FALSE:_TRUE;\n\t#endif\n\n\treturn 0;\n}\n\nint rtw_android_set_block(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tchar *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK]) + 1;\n\n\t#ifdef CONFIG_IOCTL_CFG80211\n\tadapter_wdev_data(adapter)->block = (*block_value=='0')?_FALSE:_TRUE;\n\t#endif\n\t\n\treturn 0;\n}\n\nint rtw_android_setband(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tchar *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_SETBAND]) + 1;\n\tu32 band = WIFI_FREQUENCY_BAND_AUTO;\n\tint ret = _FAIL;\n\n\tif (sscanf(arg, \"%u\", &band) >= 1)\n\t\tret = rtw_set_band(adapter, band);\n\n\treturn (ret==_SUCCESS)?0:-1;\n}\n\nint rtw_android_getband(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tint bytes_written = 0;\n\n\tbytes_written = snprintf(command, total_len, \"%u\", adapter->setband);\n\n\treturn bytes_written;\n}\n\n#ifdef CONFIG_WFD\nint rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct wifi_display_info *wfd_info = &adapter->wfd_info;\n\tchar *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;\n\tu8 mode;\n\tint num;\n\tint ret = _FAIL;\n\n\tnum = sscanf(arg, \"%hhu\", &mode);\n\n\tif (num >= 1) {\n\t\twfd_info->stack_wfd_mode = mode;\n\t\tDBG_871X(\"Miracast mode: %s(%u)\\n\", get_miracast_mode_str(wfd_info->stack_wfd_mode), wfd_info->stack_wfd_mode);\n\t\tret = _SUCCESS;\n\t}\n\n\treturn (ret == _SUCCESS)?0:-1;\n}\n#endif /* CONFIG_WFD */\n\nint get_int_from_command( char* pcmd )\n{\n\tint i = 0;\n\n\tfor( i = 0; i < strlen( pcmd ); i++ )\n\t{\n\t\tif ( pcmd[ i ] == '=' )\n\t\t{\n\t\t\t//\tSkip the '=' and space characters.\n\t\t\ti += 2;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn ( rtw_atoi( pcmd + i ) );\n}\n\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0))\nint rtw_gtk_offload(struct net_device *net, u8 *cmd_ptr)\n{\n\tint i;\n\t//u8 *cmd_ptr = priv_cmd.buf;\n\tstruct sta_info * psta;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(net);\n\tstruct mlme_priv \t*pmlmepriv = &padapter->mlmepriv;\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tpsta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\n\t\n\t\n\tif (psta == NULL) \n\t{\n\t\tDBG_8192C(\"%s, : Obtain Sta_info fail \\n\", __func__);\n\t}\n\telse\n\t{\n\t\t//string command length of \"GTK_REKEY_OFFLOAD\"\n\t\tcmd_ptr += 18;\n\t\t\n\t\t_rtw_memcpy(psta->kek, cmd_ptr, RTW_KEK_LEN);\n\t\tcmd_ptr += RTW_KEK_LEN;\n\t\t/*\n\t\tprintk(\"supplicant KEK: \");\n\t\tfor(i=0;i<RTW_KEK_LEN; i++)\n\t\t\tprintk(\" %02x \", psta->kek[i]);\n\t\tprintk(\"\\n supplicant KCK: \");\n\t\t*/\n\t\t_rtw_memcpy(psta->kck, cmd_ptr, RTW_KCK_LEN);\n\t\tcmd_ptr += RTW_KCK_LEN;\n\t\t/*\n\t\tfor(i=0;i<RTW_KEK_LEN; i++)\n\t\t\tprintk(\" %02x \", psta->kck[i]);\n\t\t*/\n\t\t_rtw_memcpy(psta->replay_ctr, cmd_ptr, RTW_REPLAY_CTR_LEN);\n\t\tpsecuritypriv->binstallKCK_KEK = _TRUE;\n\t\t\n\t\t//printk(\"\\nREPLAY_CTR: \");\n\t\t//for(i=0;i<RTW_REPLAY_CTR_LEN; i++)\n\t\t\t//printk(\" %02x \", psta->replay_ctr[i]);\n\t}\n\n\treturn _SUCCESS;\n}\n#endif //CONFIG_GTK_OL\n\nint rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)\n{\n\tint ret = 0;\n\tchar *command = NULL;\n\tint cmd_num;\n\tint bytes_written = 0;\n#ifdef CONFIG_PNO_SUPPORT\n\tuint cmdlen = 0;\n\tuint pno_enable = 0;\n#endif\n\tandroid_wifi_priv_cmd priv_cmd;\n\t_adapter*\tpadapter = ( _adapter * ) rtw_netdev_priv(net);\n#ifdef CONFIG_WFD\n\tstruct wifi_display_info\t\t*pwfd_info;\n#endif\n\n\trtw_lock_suspend();\n\n\tif (!ifr->ifr_data) {\n\t\tret = -EINVAL;\n\t\tgoto exit;\n\t}\n\tif (padapter->registrypriv.mp_mode == 1) {\n\t\t\tret = -EINVAL;\n\t\t\tgoto exit;\n\t}\n#ifdef CONFIG_COMPAT\n#ifdef in_compat_syscall\n    if (in_compat_syscall())\n#else\n\tif (is_compat_task())\n#endif\n\t{\n\t\t/* User space is 32-bit, use compat ioctl */\n\t\tcompat_android_wifi_priv_cmd compat_priv_cmd;\n\n\t\tif (copy_from_user(&compat_priv_cmd, ifr->ifr_data, sizeof(compat_android_wifi_priv_cmd))) {\n\t\t\tret = -EFAULT;\n\t\t\tgoto exit;\n\t\t}\n\t\tpriv_cmd.buf = compat_ptr(compat_priv_cmd.buf);\n\t\tpriv_cmd.used_len = compat_priv_cmd.used_len;\n\t\tpriv_cmd.total_len = compat_priv_cmd.total_len;\n\t} else\n#endif /* CONFIG_COMPAT */\n\tif (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\tif ( padapter->registrypriv.mp_mode == 1) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\t/*DBG_871X(\"%s priv_cmd.buf=%p priv_cmd.total_len=%d  priv_cmd.used_len=%d\\n\",__func__,priv_cmd.buf,priv_cmd.total_len,priv_cmd.used_len);*/\n\tcommand = rtw_zmalloc(priv_cmd.total_len);\n\tif (!command)\n\t{\n\t\tDBG_871X(\"%s: failed to allocate memory\\n\", __FUNCTION__);\n\t\tret = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0))\n\tif (!access_ok(priv_cmd.buf, priv_cmd.total_len)){\n#else\n\tif (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)){\n#endif\n\t \tDBG_871X(\"%s: failed to access memory\\n\", __FUNCTION__);\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t }\n\tif (copy_from_user(command, (void *)priv_cmd.buf, priv_cmd.total_len)) {\n\t\tret = -EFAULT;\n\t\tgoto exit;\n\t}\n\n\tDBG_871X(\"%s: Android private cmd \\\"%s\\\" on %s\\n\"\n\t\t, __FUNCTION__, command, ifr->ifr_name);\n\n\tcmd_num = rtw_android_cmdstr_to_num(command);\n\t\n\tswitch(cmd_num) {\n\tcase ANDROID_WIFI_CMD_START:\n\t\t//bytes_written = wl_android_wifi_on(net);\n\t\tgoto response;\n\tcase ANDROID_WIFI_CMD_SETFWPATH:\n\t\tgoto response;\n\t}\n\n\tif (!g_wifi_on) {\n\t\tDBG_871X(\"%s: Ignore private cmd \\\"%s\\\" - iface %s is down\\n\"\n\t\t\t,__FUNCTION__, command, ifr->ifr_name);\n\t\tret = 0;\n\t\tgoto exit;\n\t}\n\n\tswitch(cmd_num) {\n\n\tcase ANDROID_WIFI_CMD_STOP:\n\t\t//bytes_written = wl_android_wifi_off(net);\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_SCAN_ACTIVE:\n\t\t//rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_ACTIVE);\n#ifdef CONFIG_PLATFORM_MSTAR\n#ifdef CONFIG_IOCTL_CFG80211\n\t\tadapter_wdev_data((_adapter *)rtw_netdev_priv(net))->bandroid_scan = _TRUE;\n#endif //CONFIG_IOCTL_CFG80211\n#endif //CONFIG_PLATFORM_MSTAR\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_SCAN_PASSIVE:\n\t\t//rtw_set_scan_mode((_adapter *)rtw_netdev_priv(net), SCAN_PASSIVE);\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_RSSI:\n\t\tbytes_written = rtw_android_get_rssi(net, command, priv_cmd.total_len);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_LINKSPEED:\n\t\tbytes_written = rtw_android_get_link_speed(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_MACADDR:\n\t\tbytes_written = rtw_android_get_macaddr(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_BLOCK_SCAN:\n\t\tbytes_written = rtw_android_set_block_scan(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_BLOCK:\n\t\tbytes_written = rtw_android_set_block(net, command, priv_cmd.total_len);\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_RXFILTER_START:\n\t\t//bytes_written = net_os_set_packet_filter(net, 1);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_RXFILTER_STOP:\n\t\t//bytes_written = net_os_set_packet_filter(net, 0);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_RXFILTER_ADD:\n\t\t//int filter_num = *(command + strlen(CMD_RXFILTER_ADD) + 1) - '0';\n\t\t//bytes_written = net_os_rxfilter_add_remove(net, TRUE, filter_num);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_RXFILTER_REMOVE:\n\t\t//int filter_num = *(command + strlen(CMD_RXFILTER_REMOVE) + 1) - '0';\n\t\t//bytes_written = net_os_rxfilter_add_remove(net, FALSE, filter_num);\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_BTCOEXSCAN_START:\n\t\t/* TBD: BTCOEXSCAN-START */\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_BTCOEXSCAN_STOP:\n\t\t/* TBD: BTCOEXSCAN-STOP */\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_BTCOEXMODE:\n\t\t#if 0\n\t\tuint mode = *(command + strlen(CMD_BTCOEXMODE) + 1) - '0';\n\t\tif (mode == 1)\n\t\t\tnet_os_set_packet_filter(net, 0); /* DHCP starts */\n\t\telse\n\t\t\tnet_os_set_packet_filter(net, 1); /* DHCP ends */\n#ifdef WL_CFG80211\n\t\tbytes_written = wl_cfg80211_set_btcoex_dhcp(net, command);\n#endif\n\t\t#endif\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_SETSUSPENDOPT:\n\t\t//bytes_written = wl_android_set_suspendopt(net, command, priv_cmd.total_len);\n\t\tbreak;\n\t\t\n\tcase ANDROID_WIFI_CMD_SETBAND:\n\t\tbytes_written = rtw_android_setband(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_GETBAND:\n\t\tbytes_written = rtw_android_getband(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_COUNTRY:\n\t\tbytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);\n\t\tbreak;\n\t\t\n#ifdef CONFIG_PNO_SUPPORT\n\tcase ANDROID_WIFI_CMD_PNOSSIDCLR_SET:\n\t\t//bytes_written = dhd_dev_pno_reset(net);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_PNOSETUP_SET:\n\t\tbytes_written = rtw_android_pno_setup(net, command, priv_cmd.total_len);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_PNOENABLE_SET:\n\t\tcmdlen = strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_PNOENABLE_SET]);\n\t\tpno_enable = *(command + cmdlen + 1) - '0';\n\t\tbytes_written = rtw_android_pno_enable(net, pno_enable);\n\t\tbreak;\n#endif\n\n\tcase ANDROID_WIFI_CMD_P2P_DEV_ADDR:\n\t\tbytes_written = rtw_android_get_p2p_dev_addr(net, command, priv_cmd.total_len);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_P2P_SET_NOA:\n\t\t//int skip = strlen(CMD_P2P_SET_NOA) + 1;\n\t\t//bytes_written = wl_cfg80211_set_p2p_noa(net, command + skip, priv_cmd.total_len - skip);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_P2P_GET_NOA:\n\t\t//bytes_written = wl_cfg80211_get_p2p_noa(net, command, priv_cmd.total_len);\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_P2P_SET_PS:\n\t\t//int skip = strlen(CMD_P2P_SET_PS) + 1;\n\t\t//bytes_written = wl_cfg80211_set_p2p_ps(net, command + skip, priv_cmd.total_len - skip);\n\t\tbreak;\n\t\t\n#ifdef CONFIG_IOCTL_CFG80211\n\tcase ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE:\n\t{\n\t\tint skip = strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE]) + 3;\n\t\tbytes_written = rtw_cfg80211_set_mgnt_wpsp2pie(net, command + skip, priv_cmd.total_len - skip, *(command + skip - 2) - '0');\n\t\tbreak;\n\t}\n#endif //CONFIG_IOCTL_CFG80211\n\n#ifdef CONFIG_WFD\n\n\tcase ANDROID_WIFI_CMD_MIRACAST:\n\t\tbytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);\n\t\tbreak;\n\n\tcase ANDROID_WIFI_CMD_WFD_ENABLE:\n\t{\n\t\t//\tCommented by Albert 2012/07/24\n\t\t//\tWe can enable the WFD function by using the following command:\n\t\t//\twpa_cli driver wfd-enable\n\n\t\tpwfd_info = &padapter->wfd_info;\n\t\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t\t\tpwfd_info->wfd_enable = _TRUE;\n\t\tbreak;\n\t}\n\n\tcase ANDROID_WIFI_CMD_WFD_DISABLE:\n\t{\n\t\t//\tCommented by Albert 2012/07/24\n\t\t//\tWe can disable the WFD function by using the following command:\n\t\t//\twpa_cli driver wfd-disable\n\n\t\tpwfd_info = &padapter->wfd_info;\n\t\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t\t\tpwfd_info->wfd_enable = _FALSE;\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_WFD_SET_TCPPORT:\n\t{\n\t\t//\tCommented by Albert 2012/07/24\n\t\t//\tWe can set the tcp port number by using the following command:\n\t\t//\twpa_cli driver wfd-set-tcpport = 554\n\n\t\tpwfd_info = &padapter->wfd_info;\n\t\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\tpwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );\n\t}\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:\n\t{\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_WFD_SET_DEVTYPE:\n\t{\n\t\t//\tCommented by Albert 2012/08/28\n\t\t//\tSpecify the WFD device type ( WFD source/primary sink )\n\n\t\tpwfd_info = &padapter->wfd_info;\n\t\tif( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )\n\t\t{\n\t\t\tpwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf );\n\t\t\tpwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;\n\t\t}\n\t\tbreak;\n\t}\n#endif\n\tcase ANDROID_WIFI_CMD_CHANGE_DTIM:\n\t\t{\n#ifdef CONFIG_LPS\n\t\t\tu8 dtim;\n\t\t\tu8 *ptr =(u8 *) &priv_cmd.buf;\n\t\t\t\n\t\t\tptr += 9;//string command length of  \"SET_DTIM\";\n\n\t\t\tdtim = rtw_atoi(ptr);\n\n\t\t\tDBG_871X(\"DTIM=%d\\n\", dtim);\n\n\t\t\trtw_lps_change_dtim_cmd(padapter, dtim);\t\t\t\n#endif\t\t\t\n\t\t}\t\t\n\t\tbreak;\n\tcase ANDROID_WIFI_CMD_HOSTAPD_SET_MACADDR_ACL:\n\t{\n\t\tpadapter->stapriv.acl_list.mode = ( u8 ) get_int_from_command(command);\n\t\tDBG_871X(\"%s ANDROID_WIFI_CMD_HOSTAPD_SET_MACADDR_ACL mode:%d\\n\", __FUNCTION__, padapter->stapriv.acl_list.mode);\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_HOSTAPD_ACL_ADD_STA:\n\t{\n\t\tu8 addr[ETH_ALEN] = {0x00};\n\t\tmacstr2num(addr, command+strlen(\"HOSTAPD_ACL_ADD_STA\")+3);\t// 3 is space bar + \"=\" + space bar these 3 chars\n\t\trtw_acl_add_sta(padapter, addr);\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_HOSTAPD_ACL_REMOVE_STA:\n\t{\n\t\tu8 addr[ETH_ALEN] = {0x00};\n\t\tmacstr2num(addr, command+strlen(\"HOSTAPD_ACL_REMOVE_STA\")+3);\t// 3 is space bar + \"=\" + space bar these 3 chars\n\t\trtw_acl_remove_sta(padapter, addr);\n\t\tbreak;\n\t}\n#if defined(CONFIG_GTK_OL) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0))\n\tcase ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD:\n\t\trtw_gtk_offload(net, (u8*)command);\n\t\tbreak;\n#endif //CONFIG_GTK_OL\t\t\n\tcase ANDROID_WIFI_CMD_P2P_DISABLE:\n\t{\n#ifdef CONFIG_P2P\n\t\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\t\n\t\tu8 channel, ch_offset;\n\t\tu16 bwmode;\n\n\t\trtw_p2p_enable(padapter, P2P_ROLE_DISABLE);\n#endif // CONFIG_P2P\n\t\tbreak;\n\t}\n\tcase ANDROID_WIFI_CMD_DRIVERVERSION:\n\t{\n\t\tbytes_written = strlen(DRIVERVERSION);\n\t\tsnprintf(command, bytes_written+1, DRIVERVERSION);\n\t\tbreak;\n\t}\n\tdefault:\n\t\tDBG_871X(\"Unknown PRIVATE command %s - ignored\\n\", command);\n\t\tsnprintf(command, 3, \"OK\");\n\t\tbytes_written = strlen(\"OK\");\n\t}\n\nresponse:\n\tif (bytes_written >= 0) {\n\t\tif ((bytes_written == 0) && (priv_cmd.total_len > 0))\n\t\t\tcommand[0] = '\\0';\n\t\tif (bytes_written >= priv_cmd.total_len) {\n\t\t\tDBG_871X(\"%s: bytes_written = %d\\n\", __FUNCTION__, bytes_written);\n\t\t\tbytes_written = priv_cmd.total_len;\n\t\t} else {\n\t\t\tbytes_written++;\n\t\t}\n\t\tpriv_cmd.used_len = bytes_written;\n\t\tif (copy_to_user((void *)priv_cmd.buf, command, bytes_written)) {\n\t\t\tDBG_871X(\"%s: failed to copy data to user buffer\\n\", __FUNCTION__);\n\t\t\tret = -EFAULT;\n\t\t}\n\t}\n\telse {\n\t\tret = bytes_written;\n\t}\n\nexit:\n\trtw_unlock_suspend();\n\tif (command) {\n\t\trtw_mfree(command, priv_cmd.total_len);\n\t}\n\n\treturn ret;\n}\n\n\n/**\n * Functions for Android WiFi card detection\n */\n#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)\n\nstatic int g_wifidev_registered = 0;\nstatic struct semaphore wifi_control_sem;\nstatic struct wifi_platform_data *wifi_control_data = NULL;\nstatic struct resource *wifi_irqres = NULL;\n\nstatic int wifi_add_dev(void);\nstatic void wifi_del_dev(void);\n\nint rtw_android_wifictrl_func_add(void)\n{\n\tint ret = 0;\n\tsema_init(&wifi_control_sem, 0);\n\n\tret = wifi_add_dev();\n\tif (ret) {\n\t\tDBG_871X(\"%s: platform_driver_register failed\\n\", __FUNCTION__);\n\t\treturn ret;\n\t}\n\tg_wifidev_registered = 1;\n\n\t/* Waiting callback after platform_driver_register is done or exit with error */\n\tif (down_timeout(&wifi_control_sem,  msecs_to_jiffies(1000)) != 0) {\n\t\tret = -EINVAL;\n\t\tDBG_871X(\"%s: platform_driver_register timeout\\n\", __FUNCTION__);\n\t}\n\n\treturn ret;\n}\n\nvoid rtw_android_wifictrl_func_del(void)\n{\n\tif (g_wifidev_registered)\n\t{\n\t\twifi_del_dev();\n\t\tg_wifidev_registered = 0;\n\t}\n}\n\nvoid *wl_android_prealloc(int section, unsigned long size)\n{\n\tvoid *alloc_ptr = NULL;\n\tif (wifi_control_data && wifi_control_data->mem_prealloc) {\n\t\talloc_ptr = wifi_control_data->mem_prealloc(section, size);\n\t\tif (alloc_ptr) {\n\t\t\tDBG_871X(\"success alloc section %d\\n\", section);\n\t\t\tif (size != 0L)\n\t\t\t\tmemset(alloc_ptr, 0, size);\n\t\t\treturn alloc_ptr;\n\t\t}\n\t}\n\n\tDBG_871X(\"can't alloc section %d\\n\", section);\n\treturn NULL;\n}\n\nint wifi_get_irq_number(unsigned long *irq_flags_ptr)\n{\n\tif (wifi_irqres) {\n\t\t*irq_flags_ptr = wifi_irqres->flags & IRQF_TRIGGER_MASK;\n\t\treturn (int)wifi_irqres->start;\n\t}\n#ifdef CUSTOM_OOB_GPIO_NUM\n\treturn CUSTOM_OOB_GPIO_NUM;\n#else\n\treturn -1;\n#endif\n}\n\nint wifi_set_power(int on, unsigned long msec)\n{\n\tDBG_871X(\"%s = %d\\n\", __FUNCTION__, on);\n\tif (wifi_control_data && wifi_control_data->set_power) {\n\t\twifi_control_data->set_power(on);\n\t}\n\tif (msec)\n\t\tmsleep(msec);\n\treturn 0;\n}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))\nint wifi_get_mac_addr(unsigned char *buf)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\tif (!buf)\n\t\treturn -EINVAL;\n\tif (wifi_control_data && wifi_control_data->get_mac_addr) {\n\t\treturn wifi_control_data->get_mac_addr(buf);\n\t}\n\treturn -EOPNOTSUPP;\n}\n#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)) */\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) || defined(COMPAT_KERNEL_RELEASE)\nvoid *wifi_get_country_code(char *ccode)\n{\n\tDBG_871X(\"%s\\n\", __FUNCTION__);\n\tif (!ccode)\n\t\treturn NULL;\n\tif (wifi_control_data && wifi_control_data->get_country_code) {\n\t\treturn wifi_control_data->get_country_code(ccode);\n\t}\n\treturn NULL;\n}\n#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)) */\n\nstatic int wifi_set_carddetect(int on)\n{\n\tDBG_871X(\"%s = %d\\n\", __FUNCTION__, on);\n\tif (wifi_control_data && wifi_control_data->set_carddetect) {\n\t\twifi_control_data->set_carddetect(on);\n\t}\n\treturn 0;\n}\n\nstatic int wifi_probe(struct platform_device *pdev)\n{\n\tstruct wifi_platform_data *wifi_ctrl =\n\t\t(struct wifi_platform_data *)(pdev->dev.platform_data);\n\tint wifi_wake_gpio = 0;\n\n\tDBG_871X(\"## %s\\n\", __FUNCTION__);\n\twifi_irqres = platform_get_resource_byname(pdev, IORESOURCE_IRQ, \"bcmdhd_wlan_irq\");\n\n\tif (wifi_irqres == NULL)\n\t\twifi_irqres = platform_get_resource_byname(pdev,\n\t\t\tIORESOURCE_IRQ, \"bcm4329_wlan_irq\");\n\telse\n\t\twifi_wake_gpio = wifi_irqres->start;\n\n#ifdef CONFIG_GPIO_WAKEUP\n\tprintk(\"%s: gpio:%d wifi_wake_gpio:%d\\n\", __func__,\n\t\t\twifi_irqres->start, wifi_wake_gpio);\n\n\tif (wifi_wake_gpio > 0) {\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\t\twifi_configure_gpio();\n#else //CONFIG_PLATFORM_INTEL_BYT\n\t\tgpio_request(wifi_wake_gpio, \"oob_irq\");\n\t\tgpio_direction_input(wifi_wake_gpio);\n\t\toob_irq = gpio_to_irq(wifi_wake_gpio);\n#endif //CONFIG_PLATFORM_INTEL_BYT\n\t\tprintk(\"%s oob_irq:%d\\n\", __func__, oob_irq);\n\t}\n\telse if(wifi_irqres)\n\t{\n\t\toob_irq = wifi_irqres->start;\n\t\tprintk(\"%s oob_irq:%d\\n\", __func__, oob_irq);\n\t}\n#endif\n\twifi_control_data = wifi_ctrl;\n\n\twifi_set_power(1, 0);\t/* Power On */\n\twifi_set_carddetect(1);\t/* CardDetect (0->1) */\n\n\tup(&wifi_control_sem);\n\treturn 0;\n}\n\n#ifdef RTW_SUPPORT_PLATFORM_SHUTDOWN\nextern PADAPTER g_test_adapter;\n\nstatic void shutdown_card(void)\n{\n\tu32 addr;\n\tu8 tmp8, cnt=0;\n\n\tif (NULL == g_test_adapter)\n\t{\n\t\tDBG_871X(\"%s: padapter==NULL\\n\", __FUNCTION__);\n\t\treturn;\n\t}\n\n#ifdef CONFIG_FWLPS_IN_IPS\n\tLeaveAllPowerSaveMode(g_test_adapter);\n#endif // CONFIG_FWLPS_IN_IPS\n\n\t// Leave SDIO HCI Suspend\n\taddr = 0x10250086;\n\trtw_write8(g_test_adapter, addr, 0);\n\tdo {\n\t\ttmp8 = rtw_read8(g_test_adapter, addr);\n\t\tcnt++;\n\t\tDBG_871X(FUNC_ADPT_FMT \": polling SDIO_HSUS_CTRL(0x%x)=0x%x, cnt=%d\\n\",\n\t\t\tFUNC_ADPT_ARG(g_test_adapter), addr, tmp8, cnt);\n\n\t\tif (tmp8 & BIT(1))\n\t\t\tbreak;\n\n\t\tif (cnt >= 100)\n\t\t{\n\t\t\tDBG_871X(FUNC_ADPT_FMT \": polling 0x%x[1]==1 FAIL!!\\n\",\n\t\t\t\tFUNC_ADPT_ARG(g_test_adapter), addr);\n\t\t\tbreak;\n\t\t}\n\n\t\trtw_mdelay_os(10);\n\t} while (1);\n\n\t// unlock register I/O\n\trtw_write8(g_test_adapter, 0x1C, 0);\n\n\t// enable power down function\n\t// 0x04[4] = 1\n\t// 0x05[7] = 1\n\taddr = 0x04;\n\ttmp8 = rtw_read8(g_test_adapter, addr);\n\ttmp8 |= BIT(4);\n\trtw_write8(g_test_adapter, addr, tmp8);\n\tDBG_871X(FUNC_ADPT_FMT \": read after write 0x%x=0x%x\\n\",\n\t\tFUNC_ADPT_ARG(g_test_adapter), addr, rtw_read8(g_test_adapter, addr));\n\n\taddr = 0x05;\n\ttmp8 = rtw_read8(g_test_adapter, addr);\n\ttmp8 |= BIT(7);\n\trtw_write8(g_test_adapter, addr, tmp8);\n\tDBG_871X(FUNC_ADPT_FMT \": read after write 0x%x=0x%x\\n\",\n\t\tFUNC_ADPT_ARG(g_test_adapter), addr, rtw_read8(g_test_adapter, addr));\n\n\t// lock register page0 0x0~0xB read/write\n\trtw_write8(g_test_adapter, 0x1C, 0x0E);\n\n\trtw_set_surprise_removed(g_test_adapter);\n\tDBG_871X(FUNC_ADPT_FMT \": bSurpriseRemoved=%s\\n\",\n\t\tFUNC_ADPT_ARG(g_test_adapter), rtw_is_surprise_removed(g_test_adapter)?\"True\":\"False\");\n}\n#endif // RTW_SUPPORT_PLATFORM_SHUTDOWN\n\nstatic int wifi_remove(struct platform_device *pdev)\n{\n\tstruct wifi_platform_data *wifi_ctrl =\n\t\t(struct wifi_platform_data *)(pdev->dev.platform_data);\n\n\tDBG_871X(\"## %s\\n\", __FUNCTION__);\n\twifi_control_data = wifi_ctrl;\n\n\twifi_set_power(0, 0);\t/* Power Off */\n\twifi_set_carddetect(0);\t/* CardDetect (1->0) */\n\n\tup(&wifi_control_sem);\n\treturn 0;\n}\n\n#ifdef RTW_SUPPORT_PLATFORM_SHUTDOWN\nstatic void wifi_shutdown(struct platform_device *pdev)\n{\n\tstruct wifi_platform_data *wifi_ctrl =\n\t\t(struct wifi_platform_data *)(pdev->dev.platform_data);\n\t\n\n\tDBG_871X(\"## %s\\n\", __FUNCTION__);\n\n\twifi_control_data = wifi_ctrl;\n\n\tshutdown_card();\n\twifi_set_power(0, 0);\t/* Power Off */\n\twifi_set_carddetect(0);\t/* CardDetect (1->0) */\n}\n#endif // RTW_SUPPORT_PLATFORM_SHUTDOWN\n\nstatic int wifi_suspend(struct platform_device *pdev, pm_message_t state)\n{\n\tDBG_871X(\"##> %s\\n\", __FUNCTION__);\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY)\n\tbcmsdh_oob_intr_set(0);\n#endif\n\treturn 0;\n}\n\nstatic int wifi_resume(struct platform_device *pdev)\n{\n\tDBG_871X(\"##> %s\\n\", __FUNCTION__);\n#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 39)) && defined(OOB_INTR_ONLY)\n\tif (dhd_os_check_if_up(bcmsdh_get_drvdata()))\n\t\tbcmsdh_oob_intr_set(1);\n#endif\n\treturn 0;\n}\n\n/* temporarily use these two */\nstatic struct platform_driver wifi_device = {\n\t.probe          = wifi_probe,\n\t.remove         = wifi_remove,\n\t.suspend        = wifi_suspend,\n\t.resume         = wifi_resume,\n#ifdef RTW_SUPPORT_PLATFORM_SHUTDOWN\n\t.shutdown       = wifi_shutdown,\n#endif // RTW_SUPPORT_PLATFORM_SHUTDOWN\n\t.driver         = {\n\t.name   = \"bcmdhd_wlan\",\n\t}\n};\n\nstatic struct platform_driver wifi_device_legacy = {\n\t.probe          = wifi_probe,\n\t.remove         = wifi_remove,\n\t.suspend        = wifi_suspend,\n\t.resume         = wifi_resume,\n\t.driver         = {\n\t.name   = \"bcm4329_wlan\",\n\t}\n};\n\nstatic int wifi_add_dev(void)\n{\n\tDBG_871X(\"## Calling platform_driver_register\\n\");\n\tplatform_driver_register(&wifi_device);\n\tplatform_driver_register(&wifi_device_legacy);\n\treturn 0;\n}\n\nstatic void wifi_del_dev(void)\n{\n\tDBG_871X(\"## Unregister platform_driver_register\\n\");\n\tplatform_driver_unregister(&wifi_device);\n\tplatform_driver_unregister(&wifi_device_legacy);\n}\n#endif /* defined(RTW_ENABLE_WIFI_CONTROL_FUNC) */\n\n#ifdef CONFIG_GPIO_WAKEUP\n#ifdef CONFIG_PLATFORM_INTEL_BYT\nint wifi_configure_gpio(void)\n{\n\tif (gpio_request(oob_gpio, \"oob_irq\")) {\n\t\tDBG_871X(\"## %s Cannot request GPIO\\n\", __FUNCTION__);\n\t\treturn -1;\n\t}\n\tgpio_export(oob_gpio, 0);\n\tif (gpio_direction_input(oob_gpio)) {\n\t\tDBG_871X(\"## %s Cannot set GPIO direction input\\n\", __FUNCTION__);\n\t\treturn -1;\n\t}\n\tif ((oob_irq = gpio_to_irq(oob_gpio)) < 0) {\n\t\tDBG_871X(\"## %s Cannot convert GPIO to IRQ\\n\", __FUNCTION__);\n\t\treturn -1;\n\t}\n\n\tDBG_871X(\"## %s OOB_IRQ=%d\\n\", __FUNCTION__, oob_irq);\n\n\treturn 0;\n}\n#endif //CONFIG_PLATFORM_INTEL_BYT\nvoid wifi_free_gpio(unsigned int gpio)\n{\n#ifdef CONFIG_PLATFORM_INTEL_BYT\n\tif(gpio)\n\t\tgpio_free(gpio);\n#endif //CONFIG_PLATFORM_INTEL_BYT\n}\n#endif //CONFIG_GPIO_WAKEUP\n"
  },
  {
    "path": "os_dep/linux/rtw_cfgvendor.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n\n#ifdef CONFIG_IOCTL_CFG80211\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\n\n/*\n#include <linux/kernel.h>\n#include <linux/if_arp.h>\n#include <asm/uaccess.h>\n\n#include <linux/kernel.h>\n#include <linux/kthread.h>\n#include <linux/netdevice.h>\n#include <linux/sched.h>\n#include <linux/etherdevice.h>\n#include <linux/wireless.h>\n#include <linux/ieee80211.h>\n#include <linux/wait.h>\n#include <net/cfg80211.h>\n*/\n\n#include <net/rtnetlink.h>\n\n#ifdef DBG_MEM_ALLOC\nextern bool match_mstat_sniff_rules(const enum mstat_f flags, const size_t size);\nstruct sk_buff *dbg_rtw_cfg80211_vendor_event_alloc(struct wiphy *wiphy, int len, int event_id, gfp_t gfp\n\t, const enum mstat_f flags, const char *func, const int line)\n{\n\t_adapter *padapter = wiphy_to_adapter(wiphy);\n\tstruct wireless_dev *wdev = padapter->rtw_wdev;\n\n\tstruct sk_buff *skb;\n\tunsigned int truesize = 0;\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0))\n\tskb = cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp);\n#else\n\tskb = cfg80211_vendor_event_alloc(wiphy, wdev, len, event_id, gfp);\n#endif\n\n\tif(skb)\n\t\ttruesize = skb->truesize;\n\n\tif(!skb || truesize < len || match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\\n\", func, line, __FUNCTION__, len, skb, truesize);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, truesize\n\t);\n\n\treturn skb;\n}\n\nvoid dbg_rtw_cfg80211_vendor_event(struct sk_buff *skb, gfp_t gfp\n\t, const enum mstat_f flags, const char *func, const int line)\n{\n\tunsigned int truesize = skb->truesize;\n\n\tif(match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s, truesize=%u\\n\", func, line, __FUNCTION__, truesize);\n\n\tcfg80211_vendor_event(skb, gfp);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, truesize\n\t);\n}\n\nstruct sk_buff *dbg_rtw_cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len\n\t, const enum mstat_f flags, const char *func, const int line)\n{\n\tstruct sk_buff *skb;\n\tunsigned int truesize = 0;\n\n\tskb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);\n\n\tif(skb)\n\t\ttruesize = skb->truesize;\n\n\tif(!skb || truesize < len || match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\\n\", func, line, __FUNCTION__, len, skb, truesize);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, truesize\n\t);\n\n\treturn skb;\n}\n\nint dbg_rtw_cfg80211_vendor_cmd_reply(struct sk_buff *skb\n\t, const enum mstat_f flags, const char *func, const int line)\n{\n\tunsigned int truesize = skb->truesize;\n\tint ret;\n\n\tif(match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s, truesize=%u\\n\", func, line, __FUNCTION__, truesize);\n\n\tret = cfg80211_vendor_cmd_reply(skb);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, truesize\n\t);\n\n\treturn ret;\n}\n\n#define rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp) \\\n\tdbg_rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n\t\n#define rtw_cfg80211_vendor_event(skb, gfp) \\\n\tdbg_rtw_cfg80211_vendor_event(skb, gfp, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n\t\n#define rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \\\n\tdbg_rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n\n#define rtw_cfg80211_vendor_cmd_reply(skb) \\\n\t\tdbg_rtw_cfg80211_vendor_cmd_reply(skb, MSTAT_FUNC_CFG_VENDOR|MSTAT_TYPE_SKB, __FUNCTION__, __LINE__)\n#else\n\nstruct sk_buff *rtw_cfg80211_vendor_event_alloc(\n\t\tstruct wiphy *wiphy, int len, int event_id, gfp_t gfp)\n{\n\t_adapter *padapter = wiphy_to_adapter(wiphy);\n\tstruct wireless_dev *wdev = padapter->rtw_wdev;\n\tstruct sk_buff *skb;\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0))\n\tskb = cfg80211_vendor_event_alloc(wiphy, len, event_id, gfp);\n#else\n\tskb = cfg80211_vendor_event_alloc(wiphy, wdev, len, event_id, gfp);\n#endif\n\treturn skb;\n}\n\n#define rtw_cfg80211_vendor_event(skb, gfp) \\\n\tcfg80211_vendor_event(skb, gfp)\n\t\n#define rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \\\n\tcfg80211_vendor_cmd_alloc_reply_skb(wiphy, len)\n\n#define rtw_cfg80211_vendor_cmd_reply(skb) \\\n\tcfg80211_vendor_cmd_reply(skb)\n#endif /* DBG_MEM_ALLOC */\n\n/*\n * This API is to be used for asynchronous vendor events. This\n * shouldn't be used in response to a vendor command from its\n * do_it handler context (instead rtw_cfgvendor_send_cmd_reply should\n * be used).\n */\nint rtw_cfgvendor_send_async_event(struct wiphy *wiphy,\n\tstruct net_device *dev, int event_id, const void  *data, int len)\n{\n\tu16 kflags;\n\tstruct sk_buff *skb;\n\n\tkflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;\n\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_event_alloc(wiphy, len, event_id, kflags);\n\tif (!skb) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" skb alloc failed\", FUNC_NDEV_ARG(dev));\n\t\treturn -ENOMEM;\n\t}\n\n\t/* Push the data to the skb */\n\tnla_put_nohdr(skb, len, data);\n\n\trtw_cfg80211_vendor_event(skb, kflags);\n\n\treturn 0;\n}\n\nstatic int rtw_cfgvendor_send_cmd_reply(struct wiphy *wiphy,\n\tstruct net_device *dev, const void  *data, int len)\n{\n\tstruct sk_buff *skb;\n\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);\n\tif (unlikely(!skb)) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" skb alloc failed\", FUNC_NDEV_ARG(dev));\n\t\treturn -ENOMEM;\n\t}\n\n\t/* Push the data to the skb */\n\tnla_put_nohdr(skb, len, data);\n\n\treturn rtw_cfg80211_vendor_cmd_reply(skb);\n}\n\n#define WIFI_FEATURE_INFRA              0x0001      /* Basic infrastructure mode        */\n#define WIFI_FEATURE_INFRA_5G           0x0002      /* Support for 5 GHz Band           */\n#define WIFI_FEATURE_HOTSPOT            0x0004      /* Support for GAS/ANQP             */\n#define WIFI_FEATURE_P2P                0x0008      /* Wifi-Direct                      */\n#define WIFI_FEATURE_SOFT_AP            0x0010      /* Soft AP                          */\n#define WIFI_FEATURE_GSCAN              0x0020      /* Google-Scan APIs                 */\n#define WIFI_FEATURE_NAN                0x0040      /* Neighbor Awareness Networking    */\n#define WIFI_FEATURE_D2D_RTT            0x0080      /* Device-to-device RTT             */\n#define WIFI_FEATURE_D2AP_RTT           0x0100      /* Device-to-AP RTT                 */\n#define WIFI_FEATURE_BATCH_SCAN         0x0200      /* Batched Scan (legacy)            */\n#define WIFI_FEATURE_PNO                0x0400      /* Preferred network offload        */\n#define WIFI_FEATURE_ADDITIONAL_STA     0x0800      /* Support for two STAs             */\n#define WIFI_FEATURE_TDLS               0x1000      /* Tunnel directed link setup       */\n#define WIFI_FEATURE_TDLS_OFFCHANNEL    0x2000      /* Support for TDLS off channel     */\n#define WIFI_FEATURE_EPR                0x4000      /* Enhanced power reporting         */\n#define WIFI_FEATURE_AP_STA             0x8000      /* Support for AP STA Concurrency   */\n\n#define MAX_FEATURE_SET_CONCURRRENT_GROUPS  3\n\n#include <hal_data.h>\nint rtw_dev_get_feature_set(struct net_device *dev)\n{\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);\n\tHAL_VERSION *hal_ver = &HalData->VersionID;\n\n\tint feature_set = 0;\n\n\tfeature_set |= WIFI_FEATURE_INFRA;\n\n\tif (IS_8814A_SERIES(*hal_ver) || IS_8812_SERIES(*hal_ver) ||\n\t\t\tIS_8821_SERIES(*hal_ver))\n\t\tfeature_set |= WIFI_FEATURE_INFRA_5G;\n\n\tfeature_set |= WIFI_FEATURE_P2P;\n\tfeature_set |= WIFI_FEATURE_SOFT_AP;\n\n\tfeature_set |= WIFI_FEATURE_ADDITIONAL_STA;\n\n\treturn feature_set;\n}\n\nint *rtw_dev_get_feature_set_matrix(struct net_device *dev, int *num)\n{\n\tint feature_set_full, mem_needed;\n\tint *ret;\n\n\t*num = 0;\n\tmem_needed = sizeof(int) * MAX_FEATURE_SET_CONCURRRENT_GROUPS;\n\tret = (int *)rtw_malloc(mem_needed);\n\n\tif (!ret) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" failed to allocate %d bytes\\n\"\n\t\t\t, FUNC_NDEV_ARG(dev), mem_needed);\n\t\treturn ret;\n\t}\n\n\tfeature_set_full = rtw_dev_get_feature_set(dev);\n\n\tret[0] = (feature_set_full & WIFI_FEATURE_INFRA) |\n\t         (feature_set_full & WIFI_FEATURE_INFRA_5G) |\n\t         (feature_set_full & WIFI_FEATURE_NAN) |\n\t         (feature_set_full & WIFI_FEATURE_D2D_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_D2AP_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_PNO) |\n\t         (feature_set_full & WIFI_FEATURE_BATCH_SCAN) |\n\t         (feature_set_full & WIFI_FEATURE_GSCAN) |\n\t         (feature_set_full & WIFI_FEATURE_HOTSPOT) |\n\t         (feature_set_full & WIFI_FEATURE_ADDITIONAL_STA) |\n\t         (feature_set_full & WIFI_FEATURE_EPR);\n\n\tret[1] = (feature_set_full & WIFI_FEATURE_INFRA) |\n\t         (feature_set_full & WIFI_FEATURE_INFRA_5G) |\n\t         /* Not yet verified NAN with P2P */\n\t         /* (feature_set_full & WIFI_FEATURE_NAN) | */\n\t         (feature_set_full & WIFI_FEATURE_P2P) |\n\t         (feature_set_full & WIFI_FEATURE_D2AP_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_D2D_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_EPR);\n\n\tret[2] = (feature_set_full & WIFI_FEATURE_INFRA) |\n\t         (feature_set_full & WIFI_FEATURE_INFRA_5G) |\n\t         (feature_set_full & WIFI_FEATURE_NAN) |\n\t         (feature_set_full & WIFI_FEATURE_D2D_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_D2AP_RTT) |\n\t         (feature_set_full & WIFI_FEATURE_TDLS) |\n\t         (feature_set_full & WIFI_FEATURE_TDLS_OFFCHANNEL) |\n\t         (feature_set_full & WIFI_FEATURE_EPR);\n\t*num = MAX_FEATURE_SET_CONCURRRENT_GROUPS;\n\n\treturn ret;\n}\n\nstatic int rtw_cfgvendor_get_feature_set(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tint reply;\n\n\treply = rtw_dev_get_feature_set(wdev_to_ndev(wdev));\n\n\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), &reply, sizeof(int));\n\n\tif (unlikely(err))\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" Vendor Command reply failed ret:%d \\n\"\n\t\t\t, FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);\n\n\treturn err;\n}\n\nstatic int rtw_cfgvendor_get_feature_set_matrix(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct sk_buff *skb;\n\tint *reply;\n\tint num, mem_needed, i;\n\n\treply = rtw_dev_get_feature_set_matrix(wdev_to_ndev(wdev), &num);\n\n\tif (!reply) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" Could not get feature list matrix\\n\"\n\t\t\t, FUNC_NDEV_ARG(wdev_to_ndev(wdev)));\n\t\terr = -EINVAL;\n\t\treturn err;\n\t}\n\n\tmem_needed = VENDOR_REPLY_OVERHEAD + (ATTRIBUTE_U32_LEN * num) +\n\t             ATTRIBUTE_U32_LEN;\n\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);\n\tif (unlikely(!skb)) {\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" skb alloc failed\", FUNC_NDEV_ARG(wdev_to_ndev(wdev)));\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\tnla_put_u32(skb, ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET, num);\n\tfor (i = 0; i < num; i++) {\n\t\tnla_put_u32(skb, ANDR_WIFI_ATTRIBUTE_FEATURE_SET, reply[i]);\n\t}\n\n\terr =  rtw_cfg80211_vendor_cmd_reply(skb);\n\n\tif (unlikely(err))\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\" Vendor Command reply failed ret:%d \\n\"\n\t\t\t, FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);\nexit:\n\trtw_mfree((u8*)reply, sizeof(int)*num);\n\treturn err;\n}\n\n#if defined(GSCAN_SUPPORT) && 0\nint wl_cfgvendor_send_hotlist_event(struct wiphy *wiphy,\n\tstruct net_device *dev, void  *data, int len, wl_vendor_event_t event)\n{\n\tu16 kflags;\n\tconst void *ptr;\n\tstruct sk_buff *skb;\n\tint malloc_len, total, iter_cnt_to_send, cnt;\n\tgscan_results_cache_t *cache = (gscan_results_cache_t *)data;\n\n\ttotal = len/sizeof(wifi_gscan_result_t);\n\twhile (total > 0) {\n\t\tmalloc_len = (total * sizeof(wifi_gscan_result_t)) + VENDOR_DATA_OVERHEAD;\n\t\tif (malloc_len > NLMSG_DEFAULT_SIZE) {\n\t\t\tmalloc_len = NLMSG_DEFAULT_SIZE;\n\t\t}\n\t\titer_cnt_to_send =\n\t\t   (malloc_len - VENDOR_DATA_OVERHEAD)/sizeof(wifi_gscan_result_t);\n\t\ttotal = total - iter_cnt_to_send;\n\n\t\tkflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;\n\n\t\t/* Alloc the SKB for vendor_event */\n\t\tskb = rtw_cfg80211_vendor_event_alloc(wiphy, malloc_len, event, kflags);\n\t\tif (!skb) {\n\t\t\tWL_ERR((\"skb alloc failed\"));\n\t\t\treturn -ENOMEM;\n\t\t}\n\n\t\twhile (cache && iter_cnt_to_send) {\n\t\t\tptr = (const void *) &cache->results[cache->tot_consumed];\n\n\t\t\tif (iter_cnt_to_send < (cache->tot_count - cache->tot_consumed))\n\t\t\t\tcnt = iter_cnt_to_send;\n\t\t\telse\n\t\t\t\tcnt = (cache->tot_count - cache->tot_consumed);\n\n\t\t\titer_cnt_to_send -= cnt;\n\t\t\tcache->tot_consumed += cnt;\n\t\t\t/* Push the data to the skb */\n\t\t\tnla_append(skb, cnt * sizeof(wifi_gscan_result_t), ptr);\n\t\t\tif (cache->tot_consumed == cache->tot_count)\n\t\t\t\tcache = cache->next;\n\n\t\t}\n\n\t\trtw_cfg80211_vendor_event(skb, kflags);\n\t}\n\n\treturn 0;\n}\n\n\nstatic int wl_cfgvendor_gscan_get_capabilities(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tdhd_pno_gscan_capabilities_t *reply = NULL;\n\tuint32 reply_len = 0;\n\n\n\treply = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t   DHD_PNO_GET_CAPABILITIES, NULL, &reply_len);\n\tif (!reply) {\n\t\tWL_ERR((\"Could not get capabilities\\n\"));\n\t\terr = -EINVAL;\n\t\treturn err;\n\t}\n\n\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),\n\t        reply, reply_len);\n\n\tif (unlikely(err))\n\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\n\n\tkfree(reply);\n\treturn err;\n}\n\nstatic int wl_cfgvendor_gscan_get_channel_list(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0, type, band;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tuint16 *reply = NULL;\n\tuint32 reply_len = 0, num_channels, mem_needed;\n\tstruct sk_buff *skb;\n\n\ttype = nla_type(data);\n\n\tif (type == GSCAN_ATTRIBUTE_BAND) {\n\t\tband = nla_get_u32(data);\n\t} else {\n\t\treturn -1;\n\t}\n\n\treply = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t   DHD_PNO_GET_CHANNEL_LIST, &band, &reply_len);\n\n\tif (!reply) {\n\t\tWL_ERR((\"Could not get channel list\\n\"));\n\t\terr = -EINVAL;\n\t\treturn err;\n\t}\n\tnum_channels =  reply_len/ sizeof(uint32);\n\tmem_needed = reply_len + VENDOR_REPLY_OVERHEAD + (ATTRIBUTE_U32_LEN * 2);\n\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);\n\tif (unlikely(!skb)) {\n\t\tWL_ERR((\"skb alloc failed\"));\n\t\terr = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\tnla_put_u32(skb, GSCAN_ATTRIBUTE_NUM_CHANNELS, num_channels);\n\tnla_put(skb, GSCAN_ATTRIBUTE_CHANNEL_LIST, reply_len, reply);\n\n\terr =  rtw_cfg80211_vendor_cmd_reply(skb);\n\n\tif (unlikely(err))\n\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\nexit:\n\tkfree(reply);\n\treturn err;\n}\n\nstatic int wl_cfgvendor_gscan_get_batch_results(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tgscan_results_cache_t *results, *iter;\n\tuint32 reply_len, complete = 0, num_results_iter;\n\tint32 mem_needed;\n\twifi_gscan_result_t *ptr;\n\tuint16 num_scan_ids, num_results;\n\tstruct sk_buff *skb;\n\tstruct nlattr *scan_hdr;\n\n\tdhd_dev_wait_batch_results_complete(bcmcfg_to_prmry_ndev(cfg));\n\tdhd_dev_pno_lock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));\n\tresults = dhd_dev_pno_get_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t             DHD_PNO_GET_BATCH_RESULTS, NULL, &reply_len);\n\n\tif (!results) {\n\t\tWL_ERR((\"No results to send %d\\n\", err));\n\t\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),\n\t\t        results, 0);\n\n\t\tif (unlikely(err))\n\t\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\n\t\tdhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));\n\t\treturn err;\n\t}\n\tnum_scan_ids = reply_len & 0xFFFF;\n\tnum_results = (reply_len & 0xFFFF0000) >> 16;\n\tmem_needed = (num_results * sizeof(wifi_gscan_result_t)) +\n\t             (num_scan_ids * GSCAN_BATCH_RESULT_HDR_LEN) +\n\t             VENDOR_REPLY_OVERHEAD + SCAN_RESULTS_COMPLETE_FLAG_LEN;\n\n\tif (mem_needed > (int32)NLMSG_DEFAULT_SIZE) {\n\t\tmem_needed = (int32)NLMSG_DEFAULT_SIZE;\n\t\tcomplete = 0;\n\t} else {\n\t\tcomplete = 1;\n\t}\n\n\tWL_TRACE((\"complete %d mem_needed %d max_mem %d\\n\", complete, mem_needed,\n\t\t(int)NLMSG_DEFAULT_SIZE));\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, mem_needed);\n\tif (unlikely(!skb)) {\n\t\tWL_ERR((\"skb alloc failed\"));\n\t\tdhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));\n\t\treturn -ENOMEM;\n\t}\n\titer = results;\n\n\tnla_put_u32(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE, complete);\n\n\tmem_needed = mem_needed - (SCAN_RESULTS_COMPLETE_FLAG_LEN + VENDOR_REPLY_OVERHEAD);\n\n\twhile (iter && ((mem_needed - GSCAN_BATCH_RESULT_HDR_LEN)  > 0)) {\n\t\tscan_hdr = nla_nest_start(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS);\n\t\tnla_put_u32(skb, GSCAN_ATTRIBUTE_SCAN_ID, iter->scan_id);\n\t\tnla_put_u8(skb, GSCAN_ATTRIBUTE_SCAN_FLAGS, iter->flag);\n\t\tnum_results_iter =\n\t\t    (mem_needed - GSCAN_BATCH_RESULT_HDR_LEN)/sizeof(wifi_gscan_result_t);\n\n\t\tif ((iter->tot_count - iter->tot_consumed) < num_results_iter)\n\t\t\tnum_results_iter = iter->tot_count - iter->tot_consumed;\n\n\t\tnla_put_u32(skb, GSCAN_ATTRIBUTE_NUM_OF_RESULTS, num_results_iter);\n\t\tif (num_results_iter) {\n\t\t\tptr = &iter->results[iter->tot_consumed];\n\t\t\titer->tot_consumed += num_results_iter;\n\t\t\tnla_put(skb, GSCAN_ATTRIBUTE_SCAN_RESULTS,\n\t\t\t num_results_iter * sizeof(wifi_gscan_result_t), ptr);\n\t\t}\n\t\tnla_nest_end(skb, scan_hdr);\n\t\tmem_needed -= GSCAN_BATCH_RESULT_HDR_LEN +\n\t\t    (num_results_iter * sizeof(wifi_gscan_result_t));\n\t\titer = iter->next;\n\t}\n\n\tdhd_dev_gscan_batch_cache_cleanup(bcmcfg_to_prmry_ndev(cfg));\n\tdhd_dev_pno_unlock_access_batch_results(bcmcfg_to_prmry_ndev(cfg));\n\n\treturn rtw_cfg80211_vendor_cmd_reply(skb);\n}\n\nstatic int wl_cfgvendor_initiate_gscan(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tint type, tmp = len;\n\tint run = 0xFF;\n\tint flush = 0;\n\tconst struct nlattr *iter;\n\n\tnla_for_each_attr(iter, data, len, tmp) {\n\t\ttype = nla_type(iter);\n\t\tif (type == GSCAN_ATTRIBUTE_ENABLE_FEATURE)\n\t\t\trun = nla_get_u32(iter);\n\t\telse if (type == GSCAN_ATTRIBUTE_FLUSH_FEATURE)\n\t\t\tflush = nla_get_u32(iter);\n\t}\n\n\tif (run != 0xFF) {\n\t\terr = dhd_dev_pno_run_gscan(bcmcfg_to_prmry_ndev(cfg), run, flush);\n\n\t\tif (unlikely(err))\n\t\t\tWL_ERR((\"Could not run gscan:%d \\n\", err));\n\t\treturn err;\n\t} else {\n\t\treturn -1;\n\t}\n\n\n}\n\nstatic int wl_cfgvendor_enable_full_scan_result(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tint type;\n\tbool real_time = FALSE;\n\n\ttype = nla_type(data);\n\n\tif (type == GSCAN_ATTRIBUTE_ENABLE_FULL_SCAN_RESULTS) {\n\t\treal_time = nla_get_u32(data);\n\n\t\terr = dhd_dev_pno_enable_full_scan_result(bcmcfg_to_prmry_ndev(cfg), real_time);\n\n\t\tif (unlikely(err))\n\t\t\tWL_ERR((\"Could not run gscan:%d \\n\", err));\n\n\t} else {\n\t\terr = -1;\n\t}\n\n\treturn err;\n}\n\nstatic int wl_cfgvendor_set_scan_cfg(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tgscan_scan_params_t *scan_param;\n\tint j = 0;\n\tint type, tmp, tmp1, tmp2, k = 0;\n\tconst struct nlattr *iter, *iter1, *iter2;\n\tstruct dhd_pno_gscan_channel_bucket  *ch_bucket;\n\n\tscan_param = kzalloc(sizeof(gscan_scan_params_t), GFP_KERNEL);\n\tif (!scan_param) {\n\t\tWL_ERR((\"Could not set GSCAN scan cfg, mem alloc failure\\n\"));\n\t\terr = -EINVAL;\n\t\treturn err;\n\n\t}\n\n\tscan_param->scan_fr = PNO_SCAN_MIN_FW_SEC;\n\tnla_for_each_attr(iter, data, len, tmp) {\n\t\ttype = nla_type(iter);\n\n\t\tif (j >= GSCAN_MAX_CH_BUCKETS)\n\t\t\tbreak;\n\n\t\tswitch (type) {\n\t\t\tcase GSCAN_ATTRIBUTE_BASE_PERIOD:\n\t\t\t\tscan_param->scan_fr = nla_get_u32(iter)/1000;\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_NUM_BUCKETS:\n\t\t\t\tscan_param->nchannel_buckets = nla_get_u32(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_1:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_2:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_3:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_4:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_5:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_6:\n\t\t\tcase GSCAN_ATTRIBUTE_CH_BUCKET_7:\n\t\t\t\tnla_for_each_nested(iter1, iter, tmp1) {\n\t\t\t\t\ttype = nla_type(iter1);\n\t\t\t\t\tch_bucket =\n\t\t\t\t\tscan_param->channel_bucket;\n\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BUCKET_ID:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BUCKET_PERIOD:\n\t\t\t\t\t\t\tch_bucket[j].bucket_freq_multiple =\n\t\t\t\t\t\t\t    nla_get_u32(iter1)/1000;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS:\n\t\t\t\t\t\t\tch_bucket[j].num_channels =\n\t\t\t\t\t\t\t     nla_get_u32(iter1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BUCKET_CHANNELS:\n\t\t\t\t\t\t\tnla_for_each_nested(iter2, iter1, tmp2) {\n\t\t\t\t\t\t\t\tif (k >= PFN_SWC_RSSI_WINDOW_MAX)\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tch_bucket[j].chan_list[k] =\n\t\t\t\t\t\t\t\t     nla_get_u32(iter2);\n\t\t\t\t\t\t\t\tk++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tk = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BUCKETS_BAND:\n\t\t\t\t\t\t\tch_bucket[j].band = (uint16)\n\t\t\t\t\t\t\t     nla_get_u32(iter1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_REPORT_EVENTS:\n\t\t\t\t\t\t\tch_bucket[j].report_flag = (uint8)\n\t\t\t\t\t\t\t     nla_get_u32(iter1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t     DHD_PNO_SCAN_CFG_ID, scan_param, 0) < 0) {\n\t\tWL_ERR((\"Could not set GSCAN scan cfg\\n\"));\n\t\terr = -EINVAL;\n\t}\n\n\tkfree(scan_param);\n\treturn err;\n\n}\n\nstatic int wl_cfgvendor_hotlist_cfg(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tgscan_hotlist_scan_params_t *hotlist_params;\n\tint tmp, tmp1, tmp2, type, j = 0, dummy;\n\tconst struct nlattr *outer, *inner, *iter;\n\tuint8 flush = 0;\n\tstruct bssid_t *pbssid;\n\n\thotlist_params = (gscan_hotlist_scan_params_t *)kzalloc(len, GFP_KERNEL);\n\tif (!hotlist_params) {\n\t\tWL_ERR((\"Cannot Malloc mem to parse config commands size - %d bytes \\n\", len));\n\t\treturn -1;\n\t}\n\n\thotlist_params->lost_ap_window = GSCAN_LOST_AP_WINDOW_DEFAULT;\n\n\tnla_for_each_attr(iter, data, len, tmp2) {\n\t\ttype = nla_type(iter);\n\t\tswitch (type) {\n\t\t\tcase GSCAN_ATTRIBUTE_HOTLIST_BSSIDS:\n\t\t\t\tpbssid = hotlist_params->bssid;\n\t\t\t\tnla_for_each_nested(outer, iter, tmp) {\n\t\t\t\t\tnla_for_each_nested(inner, outer, tmp1) {\n\t\t\t\t\t\ttype = nla_type(inner);\n\n\t\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BSSID:\n\t\t\t\t\t\t\t\tmemcpy(&(pbssid[j].macaddr),\n\t\t\t\t\t\t\t\t  nla_data(inner), ETHER_ADDR_LEN);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_RSSI_LOW:\n\t\t\t\t\t\t\t\tpbssid[j].rssi_reporting_threshold =\n\t\t\t\t\t\t\t\t         (int8) nla_get_u8(inner);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_RSSI_HIGH:\n\t\t\t\t\t\t\t\tdummy = (int8) nla_get_u8(inner);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\thotlist_params->nbssid = j;\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_HOTLIST_FLUSH:\n\t\t\t\tflush = nla_get_u8(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE:\n\t\t\t\thotlist_params->lost_ap_window = nla_get_u32(iter);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t}\n\n\tif (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t      DHD_PNO_GEOFENCE_SCAN_CFG_ID, hotlist_params, flush) < 0) {\n\t\tWL_ERR((\"Could not set GSCAN HOTLIST cfg\\n\"));\n\t\terr = -EINVAL;\n\t\tgoto exit;\n\t}\nexit:\n\tkfree(hotlist_params);\n\treturn err;\n}\nstatic int wl_cfgvendor_set_batch_scan_cfg(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0, tmp, type;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tgscan_batch_params_t batch_param;\n\tconst struct nlattr *iter;\n\n\tbatch_param.mscan = batch_param.bestn = 0;\n\tbatch_param.buffer_threshold = GSCAN_BATCH_NO_THR_SET;\n\n\tnla_for_each_attr(iter, data, len, tmp) {\n\t\ttype = nla_type(iter);\n\n\t\tswitch (type) {\n\t\t\tcase GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN:\n\t\t\t\tbatch_param.bestn = nla_get_u32(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE:\n\t\t\t\tbatch_param.mscan = nla_get_u32(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_REPORT_THRESHOLD:\n\t\t\t\tbatch_param.buffer_threshold = nla_get_u32(iter);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t       DHD_PNO_BATCH_SCAN_CFG_ID, &batch_param, 0) < 0) {\n\t\tWL_ERR((\"Could not set batch cfg\\n\"));\n\t\terr = -EINVAL;\n\t\treturn err;\n\t}\n\n\treturn err;\n}\n\nstatic int wl_cfgvendor_significant_change_cfg(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tgscan_swc_params_t *significant_params;\n\tint tmp, tmp1, tmp2, type, j = 0;\n\tconst struct nlattr *outer, *inner, *iter;\n\tuint8 flush = 0;\n\twl_pfn_significant_bssid_t *pbssid;\n\n\tsignificant_params = (gscan_swc_params_t *) kzalloc(len, GFP_KERNEL);\n\tif (!significant_params) {\n\t\tWL_ERR((\"Cannot Malloc mem to parse config commands size - %d bytes \\n\", len));\n\t\treturn -1;\n\t}\n\n\n\tnla_for_each_attr(iter, data, len, tmp2) {\n\t\ttype = nla_type(iter);\n\n\t\tswitch (type) {\n\t\t\tcase GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_FLUSH:\n\t\t\tflush = nla_get_u8(iter);\n\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE:\n\t\t\t\tsignificant_params->rssi_window = nla_get_u16(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE:\n\t\t\t\tsignificant_params->lost_ap_window = nla_get_u16(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_MIN_BREACHING:\n\t\t\t\tsignificant_params->swc_threshold = nla_get_u16(iter);\n\t\t\t\tbreak;\n\t\t\tcase GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS:\n\t\t\t\tpbssid = significant_params->bssid_elem_list;\n\t\t\t\tnla_for_each_nested(outer, iter, tmp) {\n\t\t\t\t\tnla_for_each_nested(inner, outer, tmp1) {\n\t\t\t\t\t\t\tswitch (nla_type(inner)) {\n\t\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_BSSID:\n\t\t\t\t\t\t\t\tmemcpy(&(pbssid[j].macaddr),\n\t\t\t\t\t\t\t\t     nla_data(inner),\n\t\t\t\t\t\t\t\t     ETHER_ADDR_LEN);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_RSSI_HIGH:\n\t\t\t\t\t\t\t\tpbssid[j].rssi_high_threshold =\n\t\t\t\t\t\t\t\t       (int8) nla_get_u8(inner);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tcase GSCAN_ATTRIBUTE_RSSI_LOW:\n\t\t\t\t\t\t\t\tpbssid[j].rssi_low_threshold =\n\t\t\t\t\t\t\t\t      (int8) nla_get_u8(inner);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tj++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tsignificant_params->nbssid = j;\n\n\tif (dhd_dev_pno_set_cfg_gscan(bcmcfg_to_prmry_ndev(cfg),\n\t    DHD_PNO_SIGNIFICANT_SCAN_CFG_ID, significant_params, flush) < 0) {\n\t\tWL_ERR((\"Could not set GSCAN significant cfg\\n\"));\n\t\terr = -EINVAL;\n\t\tgoto exit;\n\t}\nexit:\n\tkfree(significant_params);\n\treturn err;\n}\n#endif /* GSCAN_SUPPORT */\n\n#if defined(RTT_SUPPORT) && 0\nvoid wl_cfgvendor_rtt_evt(void *ctx, void *rtt_data)\n{\n\tstruct wireless_dev *wdev = (struct wireless_dev *)ctx;\n\tstruct wiphy *wiphy;\n\tstruct sk_buff *skb;\n\tuint32 tot_len = NLMSG_DEFAULT_SIZE, entry_len = 0;\n\tgfp_t kflags;\n\trtt_report_t *rtt_report = NULL;\n\trtt_result_t *rtt_result = NULL;\n\tstruct list_head *rtt_list;\n\twiphy = wdev->wiphy;\n\n\tWL_DBG((\"In\\n\"));\n\t/* Push the data to the skb */\n\tif (!rtt_data) {\n\t\tWL_ERR((\"rtt_data is NULL\\n\"));\n\t\tgoto exit;\n\t}\n\trtt_list = (struct list_head *)rtt_data;\n\tkflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;\n\t/* Alloc the SKB for vendor_event */\n\tskb = rtw_cfg80211_vendor_event_alloc(wiphy, tot_len, GOOGLE_RTT_COMPLETE_EVENT, kflags);\n\tif (!skb) {\n\t\tWL_ERR((\"skb alloc failed\"));\n\t\tgoto exit;\n\t}\n\t/* fill in the rtt results on each entry */\n\tlist_for_each_entry(rtt_result, rtt_list, list) {\n\t\tentry_len = 0;\n\t\tif (rtt_result->TOF_type == TOF_TYPE_ONE_WAY) {\n\t\t\tentry_len = sizeof(rtt_report_t);\n\t\t\trtt_report = kzalloc(entry_len, kflags);\n\t\t\tif (!rtt_report) {\n\t\t\t\tWL_ERR((\"rtt_report alloc failed\"));\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\trtt_report->addr = rtt_result->peer_mac;\n\t\t\trtt_report->num_measurement = 1; /* ONE SHOT */\n\t\t\trtt_report->status = rtt_result->err_code;\n\t\t\trtt_report->type = (rtt_result->TOF_type == TOF_TYPE_ONE_WAY) ? RTT_ONE_WAY: RTT_TWO_WAY;\n\t\t\trtt_report->peer = rtt_result->target_info->peer;\n\t\t\trtt_report->channel = rtt_result->target_info->channel;\n\t\t\trtt_report->rssi = rtt_result->avg_rssi;\n\t\t\t/* tx_rate */\n\t\t\trtt_report->tx_rate = rtt_result->tx_rate;\n\t\t\t/* RTT */\n\t\t\trtt_report->rtt = rtt_result->meanrtt;\n\t\t\trtt_report->rtt_sd = rtt_result->sdrtt;\n\t\t\t/* convert to centi meter */\n\t\t\tif (rtt_result->distance != 0xffffffff)\n\t\t\t\trtt_report->distance = (rtt_result->distance >> 2) * 25;\n\t\t\telse /* invalid distance */\n\t\t\t\trtt_report->distance = -1;\n\n\t\t\trtt_report->ts = rtt_result->ts;\n\t\t\tnla_append(skb, entry_len, rtt_report);\n\t\t\tkfree(rtt_report);\n\t\t}\n\t}\n\trtw_cfg80211_vendor_event(skb, kflags);\nexit:\n\treturn;\n}\n\nstatic int wl_cfgvendor_rtt_set_config(struct wiphy *wiphy, struct wireless_dev *wdev,\n\t\t\t\t\tconst void *data, int len) {\n\tint err = 0, rem, rem1, rem2, type;\n\trtt_config_params_t rtt_param;\n\trtt_target_info_t* rtt_target = NULL;\n\tconst struct nlattr *iter, *iter1, *iter2;\n\tint8 eabuf[ETHER_ADDR_STR_LEN];\n\tint8 chanbuf[CHANSPEC_STR_LEN];\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\n\tWL_DBG((\"In\\n\"));\n\terr = dhd_dev_rtt_register_noti_callback(wdev->netdev, wdev, wl_cfgvendor_rtt_evt);\n\tif (err < 0) {\n\t\tWL_ERR((\"failed to register rtt_noti_callback\\n\"));\n\t\tgoto exit;\n\t}\n\tmemset(&rtt_param, 0, sizeof(rtt_param));\n\tnla_for_each_attr(iter, data, len, rem) {\n\t\ttype = nla_type(iter);\n\t\tswitch (type) {\n\t\tcase RTT_ATTRIBUTE_TARGET_CNT:\n\t\t\trtt_param.rtt_target_cnt = nla_get_u8(iter);\n\t\t\tif (rtt_param.rtt_target_cnt > RTT_MAX_TARGET_CNT) {\n\t\t\t\tWL_ERR((\"exceed max target count : %d\\n\",\n\t\t\t\t\trtt_param.rtt_target_cnt));\n\t\t\t\terr = BCME_RANGE;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RTT_ATTRIBUTE_TARGET_INFO:\n\t\t\trtt_target = rtt_param.target_info;\n\t\t\tnla_for_each_nested(iter1, iter, rem1) {\n\t\t\t\tnla_for_each_nested(iter2, iter1, rem2) {\n\t\t\t\t\ttype = nla_type(iter2);\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_MAC:\n\t\t\t\t\t\tmemcpy(&rtt_target->addr, nla_data(iter2), ETHER_ADDR_LEN);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_TYPE:\n\t\t\t\t\t\trtt_target->type = nla_get_u8(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_PEER:\n\t\t\t\t\t\trtt_target->peer= nla_get_u8(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_CHAN:\n\t\t\t\t\t\tmemcpy(&rtt_target->channel, nla_data(iter2),\n\t\t\t\t\t\t\tsizeof(rtt_target->channel));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_MODE:\n\t\t\t\t\t\trtt_target->continuous = nla_get_u8(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_INTERVAL:\n\t\t\t\t\t\trtt_target->interval = nla_get_u32(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_NUM_MEASUREMENT:\n\t\t\t\t\t\trtt_target->measure_cnt = nla_get_u32(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_NUM_PKT:\n\t\t\t\t\t\trtt_target->ftm_cnt = nla_get_u32(iter2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase RTT_ATTRIBUTE_TARGET_NUM_RETRY:\n\t\t\t\t\t\trtt_target->retry_cnt = nla_get_u32(iter2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* convert to chanspec value */\n\t\t\t\trtt_target->chanspec = dhd_rtt_convert_to_chspec(rtt_target->channel);\n\t\t\t\tif (rtt_target->chanspec == 0) {\n\t\t\t\t\tWL_ERR((\"Channel is not valid \\n\"));\n\t\t\t\t\tgoto exit;\n\t\t\t\t}\n\t\t\t\tWL_INFORM((\"Target addr %s, Channel : %s for RTT \\n\",\n\t\t\t\t\tbcm_ether_ntoa((const struct ether_addr *)&rtt_target->addr, eabuf),\n\t\t\t\t\twf_chspec_ntoa(rtt_target->chanspec, chanbuf)));\n\t\t\t\trtt_target++;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\tWL_DBG((\"leave :target_cnt : %d\\n\", rtt_param.rtt_target_cnt));\n\tif (dhd_dev_rtt_set_cfg(bcmcfg_to_prmry_ndev(cfg), &rtt_param) < 0) {\n\t\tWL_ERR((\"Could not set RTT configuration\\n\"));\n\t\terr = -EINVAL;\n\t}\nexit:\n\treturn err;\n}\n\nstatic int wl_cfgvendor_rtt_cancel_config(struct wiphy *wiphy, struct wireless_dev *wdev,\n\t\t\t\t\tconst void *data, int len)\n{\n\tint err = 0, rem, type, target_cnt = 0;\n\tconst struct nlattr *iter;\n\tstruct ether_addr *mac_list = NULL, *mac_addr = NULL;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\n\tnla_for_each_attr(iter, data, len, rem) {\n\t\ttype = nla_type(iter);\n\t\tswitch (type) {\n\t\tcase RTT_ATTRIBUTE_TARGET_CNT:\n\t\t\ttarget_cnt = nla_get_u8(iter);\n\t\t\tmac_list = (struct ether_addr *)kzalloc(target_cnt * ETHER_ADDR_LEN , GFP_KERNEL);\n\t\t\tif (mac_list == NULL) {\n\t\t\t\tWL_ERR((\"failed to allocate mem for mac list\\n\"));\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\tmac_addr = &mac_list[0];\n\t\t\tbreak;\n\t\tcase RTT_ATTRIBUTE_TARGET_MAC:\n\t\t\tif (mac_addr)\n\t\t\t\tmemcpy(mac_addr++, nla_data(iter), ETHER_ADDR_LEN);\n\t\t\telse {\n\t\t\t\tWL_ERR((\"mac_list is NULL\\n\"));\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tif (dhd_dev_rtt_cancel_cfg(bcmcfg_to_prmry_ndev(cfg), mac_list, target_cnt) < 0) {\n\t\t\tWL_ERR((\"Could not cancel RTT configuration\\n\"));\n\t\t\terr = -EINVAL;\n\t\t\tgoto exit;\n\t\t}\n\t}\nexit:\n\tif (mac_list)\n\t\tkfree(mac_list);\n\treturn err;\n}\nstatic int wl_cfgvendor_rtt_get_capability(struct wiphy *wiphy, struct wireless_dev *wdev,\n\t\t\t\t\tconst void *data, int len)\n{\n\tint err = 0;\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\trtt_capabilities_t capability;\n\n\terr = dhd_dev_rtt_capability(bcmcfg_to_prmry_ndev(cfg), &capability);\n\tif (unlikely(err)) {\n\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\n\t\tgoto exit;\n\t}\n\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),\n\t        &capability, sizeof(capability));\n\n\tif (unlikely(err)) {\n\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\n\t}\nexit:\n\treturn err;\n}\n\n#endif /* RTT_SUPPORT */\nstatic int wl_cfgvendor_priv_string_handler(struct wiphy *wiphy,\n\tstruct wireless_dev *wdev, const void  *data, int len)\n{\n\tint err = 0;\n\tu8 resp[1] = {'\\0'};\n\n\tDBG_871X_LEVEL(_drv_always_, FUNC_NDEV_FMT\" %s\\n\", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);\n\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), resp, 1);\n\tif (unlikely(err))\n\t\tDBG_871X_LEVEL(_drv_err_, FUNC_NDEV_FMT\"Vendor Command reply failed ret:%d \\n\"\n\t\t\t, FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);\n\n\treturn err;\n#if 0\n\tstruct bcm_cfg80211 *cfg = wiphy_priv(wiphy);\n\tint err = 0;\n\tint data_len = 0;\n\n\tbzero(cfg->ioctl_buf, WLC_IOCTL_MAXLEN);\n\n\tif (strncmp((char *)data, BRCM_VENDOR_SCMD_CAPA, strlen(BRCM_VENDOR_SCMD_CAPA)) == 0) {\n\t\terr = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), \"cap\", NULL, 0,\n\t\t\tcfg->ioctl_buf, WLC_IOCTL_MAXLEN, &cfg->ioctl_buf_sync);\n\t\tif (unlikely(err)) {\n\t\t\tWL_ERR((\"error (%d)\\n\", err));\n\t\t\treturn err;\n\t\t}\n\t\tdata_len = strlen(cfg->ioctl_buf);\n\t\tcfg->ioctl_buf[data_len] = '\\0';\n\t}\n\n\terr =  rtw_cfgvendor_send_cmd_reply(wiphy, bcmcfg_to_prmry_ndev(cfg),\n\t\tcfg->ioctl_buf, data_len+1);\n\tif (unlikely(err))\n\t\tWL_ERR((\"Vendor Command reply failed ret:%d \\n\", err));\n\telse\n\t\tWL_INFORM((\"Vendor Command reply sent successfully!\\n\"));\n\n\treturn err;\n#endif\n}\n\nstatic const struct wiphy_vendor_command rtw_vendor_cmds [] = {\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_BRCM,\n\t\t\t.subcmd = BRCM_VENDOR_SCMD_PRIV_STR\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_priv_string_handler\n\t},\n#if defined(GSCAN_SUPPORT) && 0\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_GET_CAPABILITIES\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_gscan_get_capabilities\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_SET_CONFIG\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_set_scan_cfg\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_SET_SCAN_CONFIG\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_set_batch_scan_cfg\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_ENABLE_GSCAN\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_initiate_gscan\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_enable_full_scan_result\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_SET_HOTLIST\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_hotlist_cfg\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_significant_change_cfg\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_GET_SCAN_RESULTS\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_gscan_get_batch_results\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = GSCAN_SUBCMD_GET_CHANNEL_LIST\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_gscan_get_channel_list\n\t},\n#endif /* GSCAN_SUPPORT */\n#if defined(RTT_SUPPORT) && 0\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = RTT_SUBCMD_SET_CONFIG\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_rtt_set_config\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = RTT_SUBCMD_CANCEL_CONFIG\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_rtt_cancel_config\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = RTT_SUBCMD_GETCAPABILITY\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = wl_cfgvendor_rtt_get_capability\n\t},\n#endif /* RTT_SUPPORT */\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = ANDR_WIFI_SUBCMD_GET_FEATURE_SET\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = rtw_cfgvendor_get_feature_set\n\t},\n\t{\n\t\t{\n\t\t\t.vendor_id = OUI_GOOGLE,\n\t\t\t.subcmd = ANDR_WIFI_SUBCMD_GET_FEATURE_SET_MATRIX\n\t\t},\n\t\t.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,\n\t\t.doit = rtw_cfgvendor_get_feature_set_matrix\n\t}\n};\n\nstatic const struct  nl80211_vendor_cmd_info rtw_vendor_events [] = {\n\t\t{ OUI_BRCM, BRCM_VENDOR_EVENT_UNSPEC },\n\t\t{ OUI_BRCM, BRCM_VENDOR_EVENT_PRIV_STR },\n#if defined(GSCAN_SUPPORT) && 0\n\t\t{ OUI_GOOGLE, GOOGLE_GSCAN_SIGNIFICANT_EVENT },\n\t\t{ OUI_GOOGLE, GOOGLE_GSCAN_GEOFENCE_FOUND_EVENT },\n\t\t{ OUI_GOOGLE, GOOGLE_GSCAN_BATCH_SCAN_EVENT },\n\t\t{ OUI_GOOGLE, GOOGLE_SCAN_FULL_RESULTS_EVENT },\n#endif /* GSCAN_SUPPORT */\n#if defined(RTT_SUPPORT) && 0\n\t\t{ OUI_GOOGLE, GOOGLE_RTT_COMPLETE_EVENT },\n#endif /* RTT_SUPPORT */\n#if defined(GSCAN_SUPPORT) && 0\n\t\t{ OUI_GOOGLE, GOOGLE_SCAN_COMPLETE_EVENT },\n\t\t{ OUI_GOOGLE, GOOGLE_GSCAN_GEOFENCE_LOST_EVENT }\n#endif /* GSCAN_SUPPORT */\n};\n\nint rtw_cfgvendor_attach(struct wiphy *wiphy)\n{\n\n\tDBG_871X(\"Register RTW cfg80211 vendor cmd(0x%x) interface \\n\", NL80211_CMD_VENDOR);\n\n\twiphy->vendor_commands\t= rtw_vendor_cmds;\n\twiphy->n_vendor_commands = ARRAY_SIZE(rtw_vendor_cmds);\n\twiphy->vendor_events\t= rtw_vendor_events;\n\twiphy->n_vendor_events\t= ARRAY_SIZE(rtw_vendor_events);\n\n\treturn 0;\n}\n\nint rtw_cfgvendor_detach(struct wiphy *wiphy)\n{\n\tDBG_871X(\"Vendor: Unregister RTW cfg80211 vendor interface \\n\");\n\n\twiphy->vendor_commands  = NULL;\n\twiphy->vendor_events    = NULL;\n\twiphy->n_vendor_commands = 0;\n\twiphy->n_vendor_events  = 0;\n\n\treturn 0;\n}\n#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) */\n\n#endif /* CONFIG_IOCTL_CFG80211 */\n\n"
  },
  {
    "path": "os_dep/linux/rtw_cfgvendor.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2014 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#ifndef _RTW_CFGVENDOR_H_\n#define _RTW_CFGVENDOR_H_\n\n#define OUI_BRCM    0x001018\n#define OUI_GOOGLE  0x001A11\n#define BRCM_VENDOR_SUBCMD_PRIV_STR\t1\n#define ATTRIBUTE_U32_LEN                  (NLA_HDRLEN  + 4)\n#define VENDOR_ID_OVERHEAD                 ATTRIBUTE_U32_LEN\n#define VENDOR_SUBCMD_OVERHEAD             ATTRIBUTE_U32_LEN\n#define VENDOR_DATA_OVERHEAD               (NLA_HDRLEN)\n\n#define SCAN_RESULTS_COMPLETE_FLAG_LEN       ATTRIBUTE_U32_LEN\n#define SCAN_INDEX_HDR_LEN                   (NLA_HDRLEN)\n#define SCAN_ID_HDR_LEN                      ATTRIBUTE_U32_LEN\n#define SCAN_FLAGS_HDR_LEN                   ATTRIBUTE_U32_LEN\n#define GSCAN_NUM_RESULTS_HDR_LEN            ATTRIBUTE_U32_LEN\n#define GSCAN_RESULTS_HDR_LEN                (NLA_HDRLEN)\n#define GSCAN_BATCH_RESULT_HDR_LEN  (SCAN_INDEX_HDR_LEN + SCAN_ID_HDR_LEN + \\\n\t\t\t\t\t\t\t\t\tSCAN_FLAGS_HDR_LEN + \\\n\t\t\t\t\t\t\t        GSCAN_NUM_RESULTS_HDR_LEN + \\\n\t\t\t\t\t\t\t\t\tGSCAN_RESULTS_HDR_LEN)\n\n#define VENDOR_REPLY_OVERHEAD       (VENDOR_ID_OVERHEAD + \\\n\t\t\t\t\t\t\t\t\tVENDOR_SUBCMD_OVERHEAD + \\\n\t\t\t\t\t\t\t\t\tVENDOR_DATA_OVERHEAD)\ntypedef enum {\n\t/* don't use 0 as a valid subcommand */\n\tVENDOR_NL80211_SUBCMD_UNSPECIFIED,\n\n\t/* define all vendor startup commands between 0x0 and 0x0FFF */\n\tVENDOR_NL80211_SUBCMD_RANGE_START = 0x0001,\n\tVENDOR_NL80211_SUBCMD_RANGE_END   = 0x0FFF,\n\n\t/* define all GScan related commands between 0x1000 and 0x10FF */\n\tANDROID_NL80211_SUBCMD_GSCAN_RANGE_START = 0x1000,\n\tANDROID_NL80211_SUBCMD_GSCAN_RANGE_END   = 0x10FF,\n\n\t/* define all NearbyDiscovery related commands between 0x1100 and 0x11FF */\n\tANDROID_NL80211_SUBCMD_NBD_RANGE_START = 0x1100,\n\tANDROID_NL80211_SUBCMD_NBD_RANGE_END   = 0x11FF,\n\n\t/* define all RTT related commands between 0x1100 and 0x11FF */\n\tANDROID_NL80211_SUBCMD_RTT_RANGE_START = 0x1100,\n\tANDROID_NL80211_SUBCMD_RTT_RANGE_END   = 0x11FF,\n\n\tANDROID_NL80211_SUBCMD_LSTATS_RANGE_START = 0x1200,\n\tANDROID_NL80211_SUBCMD_LSTATS_RANGE_END   = 0x12FF,\n\n\tANDROID_NL80211_SUBCMD_TDLS_RANGE_START = 0x1300,\n\tANDROID_NL80211_SUBCMD_TDLS_RANGE_END\t= 0x13FF,\n\t/* This is reserved for future usage */\n\n} ANDROID_VENDOR_SUB_COMMAND;\n\nenum wl_vendor_subcmd {\n\tBRCM_VENDOR_SCMD_UNSPEC,\n\tBRCM_VENDOR_SCMD_PRIV_STR,\n\tGSCAN_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_GSCAN_RANGE_START,\n\tGSCAN_SUBCMD_SET_CONFIG,\n\tGSCAN_SUBCMD_SET_SCAN_CONFIG,\n\tGSCAN_SUBCMD_ENABLE_GSCAN,\n\tGSCAN_SUBCMD_GET_SCAN_RESULTS,\n\tGSCAN_SUBCMD_SCAN_RESULTS,\n\tGSCAN_SUBCMD_SET_HOTLIST,\n\tGSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG,\n\tGSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS,\n\tGSCAN_SUBCMD_GET_CHANNEL_LIST,\n\tANDR_WIFI_SUBCMD_GET_FEATURE_SET,\n\tANDR_WIFI_SUBCMD_GET_FEATURE_SET_MATRIX,\n\tRTT_SUBCMD_SET_CONFIG = ANDROID_NL80211_SUBCMD_RTT_RANGE_START,\n\tRTT_SUBCMD_CANCEL_CONFIG,\n\tRTT_SUBCMD_GETCAPABILITY,\n    /* Add more sub commands here */\n    VENDOR_SUBCMD_MAX\n};\n\nenum gscan_attributes {\n    GSCAN_ATTRIBUTE_NUM_BUCKETS = 10,\n    GSCAN_ATTRIBUTE_BASE_PERIOD,\n    GSCAN_ATTRIBUTE_BUCKETS_BAND,\n    GSCAN_ATTRIBUTE_BUCKET_ID,\n    GSCAN_ATTRIBUTE_BUCKET_PERIOD,\n    GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS,\n    GSCAN_ATTRIBUTE_BUCKET_CHANNELS,\n    GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN,\n    GSCAN_ATTRIBUTE_REPORT_THRESHOLD,\n    GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE,\n    GSCAN_ATTRIBUTE_BAND = GSCAN_ATTRIBUTE_BUCKETS_BAND,\n\n    GSCAN_ATTRIBUTE_ENABLE_FEATURE = 20,\n    GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE,\n    GSCAN_ATTRIBUTE_FLUSH_FEATURE,\n    GSCAN_ATTRIBUTE_ENABLE_FULL_SCAN_RESULTS,\n    GSCAN_ATTRIBUTE_REPORT_EVENTS,\n    /* remaining reserved for additional attributes */\n    GSCAN_ATTRIBUTE_NUM_OF_RESULTS = 30,\n    GSCAN_ATTRIBUTE_FLUSH_RESULTS,\n    GSCAN_ATTRIBUTE_SCAN_RESULTS,                       /* flat array of wifi_scan_result */\n    GSCAN_ATTRIBUTE_SCAN_ID,                            /* indicates scan number */\n    GSCAN_ATTRIBUTE_SCAN_FLAGS,                         /* indicates if scan was aborted */\n    GSCAN_ATTRIBUTE_AP_FLAGS,                           /* flags on significant change event */\n    GSCAN_ATTRIBUTE_NUM_CHANNELS,\n    GSCAN_ATTRIBUTE_CHANNEL_LIST,\n\n\t/* remaining reserved for additional attributes */\n\n    GSCAN_ATTRIBUTE_SSID = 40,\n    GSCAN_ATTRIBUTE_BSSID,\n    GSCAN_ATTRIBUTE_CHANNEL,\n    GSCAN_ATTRIBUTE_RSSI,\n    GSCAN_ATTRIBUTE_TIMESTAMP,\n    GSCAN_ATTRIBUTE_RTT,\n    GSCAN_ATTRIBUTE_RTTSD,\n\n    /* remaining reserved for additional attributes */\n\n    GSCAN_ATTRIBUTE_HOTLIST_BSSIDS = 50,\n    GSCAN_ATTRIBUTE_RSSI_LOW,\n    GSCAN_ATTRIBUTE_RSSI_HIGH,\n    GSCAN_ATTRIBUTE_HOSTLIST_BSSID_ELEM,\n    GSCAN_ATTRIBUTE_HOTLIST_FLUSH,\n\n    /* remaining reserved for additional attributes */\n    GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE = 60,\n    GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE,\n    GSCAN_ATTRIBUTE_MIN_BREACHING,\n    GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS,\n    GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_FLUSH,\n    GSCAN_ATTRIBUTE_MAX\n};\n\nenum gscan_bucket_attributes {\n\tGSCAN_ATTRIBUTE_CH_BUCKET_1,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_2,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_3,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_4,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_5,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_6,\n\tGSCAN_ATTRIBUTE_CH_BUCKET_7\n};\n\nenum gscan_ch_attributes {\n\tGSCAN_ATTRIBUTE_CH_ID_1,\n\tGSCAN_ATTRIBUTE_CH_ID_2,\n\tGSCAN_ATTRIBUTE_CH_ID_3,\n\tGSCAN_ATTRIBUTE_CH_ID_4,\n\tGSCAN_ATTRIBUTE_CH_ID_5,\n\tGSCAN_ATTRIBUTE_CH_ID_6,\n\tGSCAN_ATTRIBUTE_CH_ID_7\n};\n\nenum rtt_attributes {\n\tRTT_ATTRIBUTE_TARGET_CNT,\n\tRTT_ATTRIBUTE_TARGET_INFO,\n\tRTT_ATTRIBUTE_TARGET_MAC,\n\tRTT_ATTRIBUTE_TARGET_TYPE,\n\tRTT_ATTRIBUTE_TARGET_PEER,\n\tRTT_ATTRIBUTE_TARGET_CHAN,\n\tRTT_ATTRIBUTE_TARGET_MODE,\n\tRTT_ATTRIBUTE_TARGET_INTERVAL,\n\tRTT_ATTRIBUTE_TARGET_NUM_MEASUREMENT,\n\tRTT_ATTRIBUTE_TARGET_NUM_PKT,\n\tRTT_ATTRIBUTE_TARGET_NUM_RETRY\n};\n\ntypedef enum wl_vendor_event {\n\tBRCM_VENDOR_EVENT_UNSPEC,\n\tBRCM_VENDOR_EVENT_PRIV_STR,\n\tGOOGLE_GSCAN_SIGNIFICANT_EVENT,\n\tGOOGLE_GSCAN_GEOFENCE_FOUND_EVENT,\n\tGOOGLE_GSCAN_BATCH_SCAN_EVENT,\n\tGOOGLE_SCAN_FULL_RESULTS_EVENT,\n\tGOOGLE_RTT_COMPLETE_EVENT,\n\tGOOGLE_SCAN_COMPLETE_EVENT,\n\tGOOGLE_GSCAN_GEOFENCE_LOST_EVENT\n} wl_vendor_event_t;\n\nenum andr_wifi_feature_set_attr {\n    ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET,\n    ANDR_WIFI_ATTRIBUTE_FEATURE_SET\n};\n\ntypedef enum wl_vendor_gscan_attribute {\n\tATTR_START_GSCAN,\n\tATTR_STOP_GSCAN,\n\tATTR_SET_SCAN_BATCH_CFG_ID, /* set batch scan params */\n\tATTR_SET_SCAN_GEOFENCE_CFG_ID, /* set list of bssids to track */\n\tATTR_SET_SCAN_SIGNIFICANT_CFG_ID, /* set list of bssids, rssi threshold etc.. */\n\tATTR_SET_SCAN_CFG_ID, /* set common scan config params here */\n\tATTR_GET_GSCAN_CAPABILITIES_ID,\n    /* Add more sub commands here */\n    ATTR_GSCAN_MAX\n} wl_vendor_gscan_attribute_t;\n\ntypedef enum gscan_batch_attribute {\n\tATTR_GSCAN_BATCH_BESTN,\n\tATTR_GSCAN_BATCH_MSCAN,\n\tATTR_GSCAN_BATCH_BUFFER_THRESHOLD\n} gscan_batch_attribute_t;\n\ntypedef enum gscan_geofence_attribute {\n\tATTR_GSCAN_NUM_HOTLIST_BSSID,\n\tATTR_GSCAN_HOTLIST_BSSID\n} gscan_geofence_attribute_t;\n\ntypedef enum gscan_complete_event {\n\tWIFI_SCAN_BUFFER_FULL,\n\tWIFI_SCAN_COMPLETE\n} gscan_complete_event_t;\n\n/* Capture the BRCM_VENDOR_SUBCMD_PRIV_STRINGS* here */\n#define BRCM_VENDOR_SCMD_CAPA\t\"cap\"\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT)\nextern int rtw_cfgvendor_attach(struct wiphy *wiphy);\nextern int rtw_cfgvendor_detach(struct wiphy *wiphy);\nextern int rtw_cfgvendor_send_async_event(struct wiphy *wiphy,\n                  struct net_device *dev, int event_id, const void  *data, int len);\n#if defined(GSCAN_SUPPORT) && 0\nextern int wl_cfgvendor_send_hotlist_event(struct wiphy *wiphy,\n                struct net_device *dev, void  *data, int len, wl_vendor_event_t event);\n#endif\n#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) */\n\n#endif /* _RTW_CFGVENDOR_H_ */\n\n"
  },
  {
    "path": "os_dep/linux/rtw_proc.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n#include <drv_types.h>\n#include <hal_data.h>\n#include \"rtw_proc.h\"\n\n#ifdef CONFIG_PROC_DEBUG\n\nstatic struct proc_dir_entry *rtw_proc = NULL;\n\ninline struct proc_dir_entry *get_rtw_drv_proc(void)\n{\n\treturn rtw_proc;\n}\n\n#define RTW_PROC_NAME DRV_NAME\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))\n#define file_inode(file) ((file)->f_dentry->d_inode)\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0))\n#define PDE_DATA(inode) PDE((inode))->data\n#define proc_get_parent_data(inode) PDE((inode))->parent->data\n#endif\n\n#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))\n#define get_proc_net proc_net\n#else\n#define get_proc_net init_net.proc_net\n#endif\n\ninline struct proc_dir_entry *rtw_proc_create_dir(const char *name, struct proc_dir_entry *parent, void *data)\n{\n\tstruct proc_dir_entry *entry;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0))\n\tentry = proc_mkdir_data(name, S_IRUGO|S_IXUGO, parent, data);\n#else\n\t//entry = proc_mkdir_mode(name, S_IRUGO|S_IXUGO, parent);\n\tentry = proc_mkdir(name, parent);\n\tif (entry)\n\t\tentry->data = data;\n#endif\n\n\treturn entry;\n}\n\ninline struct proc_dir_entry *rtw_proc_create_entry(const char *name, struct proc_dir_entry *parent, \n\tconst struct file_operations *fops, void * data)\n{\n\tstruct proc_dir_entry *entry;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))\n\tentry = proc_create_data(name,  S_IFREG|S_IRUGO|S_IWUGO, parent, fops, data);\n#else\n\tentry = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUGO, parent);\n\tif (entry) {\n\t\tentry->data = data;\n\t\tentry->proc_fops = fops;\n\t}\n#endif\n\n\treturn entry;\n}\n\nstatic int proc_get_dummy(struct seq_file *m, void *v)\n{\n\treturn 0;\n}\n\nstatic int proc_get_drv_version(struct seq_file *m, void *v)\n{\n\tdump_drv_version(m);\n\treturn 0;\n}\n\nstatic int proc_get_log_level(struct seq_file *m, void *v)\n{\n\tdump_log_level(m);\n\treturn 0;\n}\n\nstatic int proc_get_drv_cfg(struct seq_file *m, void *v)\n{\n\tdump_drv_cfg(m);\n\treturn 0;\n}\n\nstatic ssize_t proc_set_log_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tchar tmp[32];\n\tint log_level;\n\n\tif (count < 1)\n\t\treturn -EINVAL;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d \", &log_level);\n\n\t\tif( log_level >= _drv_always_ && log_level <= _drv_debug_ )\n\t\t{\n\t\t\tGlobalDebugLevel= log_level;\n\t\t\tprintk(\"%d\\n\", GlobalDebugLevel);\n\t\t}\n\t} else {\n\t\treturn -EFAULT;\n\t}\n\t\n\treturn count;\n}\n\n#ifdef DBG_MEM_ALLOC\nstatic int proc_get_mstat(struct seq_file *m, void *v)\n{\t\n\trtw_mstat_dump(m);\n\treturn 0;\n}\n#endif /* DBG_MEM_ALLOC */\n\nstatic int proc_get_chplan_id_list(struct seq_file *m, void *v)\n{\n\tdump_chplan_id_list(m);\n\treturn 0;\n}\n\nstatic int proc_get_chplan_test(struct seq_file *m, void *v)\n{\n\tdump_chplan_test(m);\n\treturn 0;\n}\n\n/*\n* rtw_drv_proc:\n* init/deinit when register/unregister driver\n*/\nconst struct rtw_proc_hdl drv_proc_hdls [] = {\n\t{\"ver_info\", proc_get_drv_version, NULL},\n\t{\"log_level\", proc_get_log_level, proc_set_log_level},\n\t{\"drv_cfg\", proc_get_drv_cfg, NULL},\n#ifdef DBG_MEM_ALLOC\n\t{\"mstat\", proc_get_mstat, NULL},\n#endif /* DBG_MEM_ALLOC */\n\t{\"chplan_id_list\", proc_get_chplan_id_list, NULL},\n\t{\"chplan_test\", proc_get_chplan_test, NULL},\n};\n\nconst int drv_proc_hdls_num = sizeof(drv_proc_hdls) / sizeof(struct rtw_proc_hdl);\n\nstatic int rtw_drv_proc_open(struct inode *inode, struct file *file)\n{\n\t//struct net_device *dev = proc_get_parent_data(inode);\n\tssize_t index = (ssize_t)PDE_DATA(inode);\n\tconst struct rtw_proc_hdl *hdl = drv_proc_hdls+index;\n       return single_open(file, hdl->show, NULL);\n}\n\nstatic ssize_t rtw_drv_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)\n{\n\tssize_t index = (ssize_t)PDE_DATA(file_inode(file));\n\tconst struct rtw_proc_hdl *hdl = drv_proc_hdls+index;\n\tssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;\n\t\n\tif (write)\n\t\treturn write(file, buffer, count, pos, NULL);\n\n\treturn -EROFS;\n}\n\nstatic const struct file_operations rtw_drv_proc_fops = {\n\t.owner = THIS_MODULE,\n\t.open = rtw_drv_proc_open,\n\t.read = seq_read,\n\t.llseek = seq_lseek,\n\t.release = single_release,\n\t.write = rtw_drv_proc_write,\n};\n\nint rtw_drv_proc_init(void)\n{\n\tint ret = _FAIL;\n\tssize_t i;\n\tstruct proc_dir_entry *entry = NULL;\n\n\tif (rtw_proc != NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\trtw_proc = rtw_proc_create_dir(RTW_PROC_NAME, get_proc_net, NULL);\n\n\tif (rtw_proc == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tfor (i=0;i<drv_proc_hdls_num;i++) {\n\t\tentry = rtw_proc_create_entry(drv_proc_hdls[i].name, rtw_proc, &rtw_drv_proc_fops, (void *)i);\n\t\tif (!entry) {\n\t\t\trtw_warn_on(1);\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\tret = _SUCCESS;\n\nexit:\n\treturn ret;\n}\n\nvoid rtw_drv_proc_deinit(void)\n{\n\tint i;\n\n\tif (rtw_proc == NULL)\n\t\treturn;\n\n\tfor (i=0;i<drv_proc_hdls_num;i++)\n\t\tremove_proc_entry(drv_proc_hdls[i].name, rtw_proc);\n\n\tremove_proc_entry(RTW_PROC_NAME, get_proc_net);\n\trtw_proc = NULL;\n}\n\n#ifdef CONFIG_SDIO_HCI\nstatic int proc_get_sd_f0_reg_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tsd_f0_reg_dump(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_sdio_local_reg_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tsdio_local_reg_dump(m, adapter);\n\n\treturn 0;\n}\n#endif /* CONFIG_SDIO_HCI */\n\nstatic int proc_get_mac_reg_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tmac_reg_dump(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_bb_reg_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tbb_reg_dump(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_rf_reg_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trf_reg_dump(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_dump_adapters_status(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_adapters_status(m, adapter_to_dvobj(adapter));\n\n\treturn 0;\n}\n\n//gpio setting\n#ifdef CONFIG_GPIO_API\nstatic ssize_t proc_set_config_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32]={0}; \n\tint num=0,gpio_pin=0,gpio_mode=0;//gpio_mode:0 input  1:output;\n\t\n\tif (count < 2)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tnum\t=sscanf(tmp, \"%d %d\",&gpio_pin,&gpio_mode);\n\t\tDBG_871X(\"num=%d gpio_pin=%d mode=%d\\n\",num,gpio_pin,gpio_mode);\n      \t\tpadapter->pre_gpio_pin=gpio_pin;\n\n\t\tif(gpio_mode==0 || gpio_mode==1  )\n\t\t\trtw_hal_config_gpio(padapter, gpio_pin,gpio_mode);\t\n\t}\n\treturn count;\n\n}\nstatic ssize_t proc_set_gpio_output_value(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32]={0}; \n\tint num=0,gpio_pin=0,pin_mode=0;//pin_mode: 1 high         0:low\n\t\n\tif (count < 2)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tnum\t=sscanf(tmp, \"%d %d\",&gpio_pin,&pin_mode);\n\t\tDBG_871X(\"num=%d gpio_pin=%d pin_high=%d\\n\",num,gpio_pin,pin_mode);\n\t\tpadapter->pre_gpio_pin=gpio_pin;\n\t\t\n\t\tif(pin_mode==0 || pin_mode==1  )\n\t\t\trtw_hal_set_gpio_output_value(padapter, gpio_pin,pin_mode);\t\n\t}\n\treturn count;\n}\nstatic int proc_get_gpio(struct seq_file *m, void *v)\n{\n\tu8 gpioreturnvalue=0;\n\tstruct net_device *dev = m->private;\n\t\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tif(!padapter)\t\n\t\treturn -EFAULT;\n\tgpioreturnvalue = rtw_hal_get_gpio(padapter, padapter->pre_gpio_pin);\n\tDBG_871X_SEL_NL(m, \"get_gpio %d:%d \\n\",padapter->pre_gpio_pin ,gpioreturnvalue);\n\t\n\treturn 0;\n\n}\nstatic ssize_t proc_set_gpio(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32]={0}; \n\tint num=0,gpio_pin=0;\n\t\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tnum\t=sscanf(tmp, \"%d\",&gpio_pin);\n\t\tDBG_871X(\"num=%d gpio_pin=%d\\n\",num,gpio_pin);\n\t\tpadapter->pre_gpio_pin=gpio_pin;\n\t\t\n\t}\n\t\treturn count;\n}\n#endif\nstatic ssize_t proc_set_rx_info_msg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\tchar tmp[32] = {0};\n\tint phy_info_flag = 0;\n\n\tif (!padapter)\n\t\treturn -EFAULT;\n\n\tif (count < 1) {\n\t\tDBG_871X(\"argument size is less than 1\\n\");\n\t\treturn -EFAULT;\n\t}\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tint num = sscanf(tmp, \"%d\", &phy_info_flag);\n\n\t\tprecvpriv->store_law_data_flag = (BOOLEAN) phy_info_flag;\n\n\t\t/*RTW_INFO(\"precvpriv->store_law_data_flag = %d\\n\",( BOOLEAN )(precvpriv->store_law_data_flag));*/\n\t}\n\treturn count;\n}\nstatic int proc_get_rx_info_msg(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_hal_set_odm_var(padapter, HAL_ODM_RX_Dframe_INFO, m, _FALSE);\n\treturn 0;\n}\nstatic int proc_get_tx_info_msg(struct seq_file *m, void *v)\n{\n\t_irqL irqL;\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tstruct sta_info *psta;\n\tu8 bc_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu8 null_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct sta_priv *pstapriv = &padapter->stapriv;\n\tint i;\n\t_list\t*plist, *phead;\n\tu8 current_rate_id = 0, current_sgi = 0;\n\n\tchar *BW, *status;\n\n\t_enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\tif (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE))\n\t\tstatus = \"station mode\";\n\telse if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE))\n\t\tstatus = \"AP mode\";\n\telse\n\t\tstatus = \" \";\n\tDBG_871X_SEL_NL(m, \"status=%s\\n\", status);\n\tfor (i = 0; i < NUM_STA; i++) {\n\t\tphead = &(pstapriv->sta_hash[i]);\n\t\tplist = get_next(phead);\n\n\t\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\n\t\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\n\n\t\t\tplist = get_next(plist);\n\n\t\t\tif ((_rtw_memcmp(psta->hwaddr, bc_addr, 6)  !=  _TRUE)\n\t\t\t\t&& (_rtw_memcmp(psta->hwaddr, null_addr, 6) != _TRUE)\n\t\t\t\t&& (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(padapter), 6) != _TRUE)) {\n\n\t\t\t\tswitch (psta->bw_mode) {\n\n\t\t\t\tcase CHANNEL_WIDTH_20:\n\t\t\t\t\tBW = \"20M\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CHANNEL_WIDTH_40:\n\t\t\t\t\tBW = \"40M\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CHANNEL_WIDTH_80:\n\t\t\t\t\tBW = \"80M\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CHANNEL_WIDTH_160:\n\t\t\t\t\tBW = \"160M\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tBW = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcurrent_rate_id = rtw_get_current_tx_rate(adapter, psta->mac_id);\n\t\t\t\tcurrent_sgi = rtw_get_current_tx_sgi(adapter, psta->mac_id);\n\n\t\t\t\tDBG_871X_SEL_NL(m, \"==============================\\n\");\n\t\t\t\tDBG_871X_SEL_NL(m, \"macaddr=\" MAC_FMT\"\\n\", MAC_ARG(psta->hwaddr));\n\t\t\t\tDBG_871X_SEL_NL(m, \"Tx_Data_Rate=%s\\n\", HDATA_RATE(current_rate_id));\n\t\t\t\tDBG_871X_SEL_NL(m, \"BW=%s,sgi=%u\\n\", BW, current_sgi);\n\n\t\t\t}\n\t\t}\n\t}\n\n\t_exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\n\n\treturn 0;\n\n}\n\n\nstatic int proc_get_linked_info_dump(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tif(padapter)\t\n\t\tDBG_871X_SEL_NL(m, \"linked_info_dump :%s \\n\", (padapter->bLinkInfoDump)?\"enable\":\"disable\");\n\t\n\treturn 0;\n}\n\nstatic ssize_t proc_set_linked_info_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tchar tmp[32]={0}; \n\tint mode=0,pre_mode=0;\n\tint num=0;\t\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tpre_mode=padapter->bLinkInfoDump;\n\tDBG_871X(\"pre_mode=%d\\n\", pre_mode);\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tnum\t=sscanf(tmp, \"%d \", &mode);\n\t\tDBG_871X(\"num=%d mode=%d\\n\",num,mode);\n\n\t\tif(num!=1)\n\t\t{\n\t\t\tDBG_871X(\"argument number is wrong\\n\");\n\t\t\t\treturn -EFAULT;\n\t\t}\n\t\n\t\tif(mode==1 || (mode==0 && pre_mode==1) ) //not consider pwr_saving 0:\n\t\t{\n\t\t\tpadapter->bLinkInfoDump = mode;\t\n\t\t\n\t\t}\n\t\telse if( (mode==2 ) || (mode==0 && pre_mode==2))//consider power_saving\n\t\t{\t\t\n\t\t\t//DBG_871X(\"linked_info_dump =%s \\n\", (padapter->bLinkInfoDump)?\"enable\":\"disable\")\n\t\t\tlinked_info_dump(padapter,mode);\t\n\t\t}\n\t}\n\treturn count;\n}\n\nstatic int proc_get_mac_qinfo(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_hal_get_hwreg(adapter, HW_VAR_DUMP_MAC_QUEUE_INFO, (u8 *)m);\n\n\treturn 0;\n}\n\nint proc_get_wifi_spec(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct registry_priv\t*pregpriv = &padapter->registrypriv;\n\t\n\tDBG_871X_SEL_NL(m,\"wifi_spec=%d\\n\",pregpriv->wifi_spec);\n\treturn 0;\n}\n\nstatic int proc_get_chan_plan(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_cur_chset(m, adapter);\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu8 chan_plan = RTW_CHPLAN_MAX;\n\n\tif (!padapter)\n\t\treturn -EFAULT;\n\n\tif (count < 1)\n\t{\n\t\tDBG_871X(\"argument size is less than 1\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &chan_plan);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_871X(\"invalid read_reg parameter!\\n\");\n\t\t\treturn count;\n\t\t}\n\n\t}\n\n\trtw_set_channel_plan(padapter, chan_plan);\n\n\treturn count;\n}\n\n#ifdef CONFIG_DFS_MASTER\nssize_t proc_set_update_non_ocp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *mlme = &adapter->mlmepriv;\n\tstruct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;\n\tchar tmp[32];\n\tu8 ch, bw = CHANNEL_WIDTH_20, offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\tint ms = -1;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu %hhu %hhu %d\", &ch, &bw, &offset, &ms);\n\n\t\tif (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))\n\t\t\tgoto exit;\n\n\t\tif (bw == CHANNEL_WIDTH_20)\n\t\t\trtw_chset_update_non_ocp_ms(mlmeext->channel_set\n\t\t\t\t, ch, bw, HAL_PRIME_CHNL_OFFSET_DONT_CARE, ms);\n\t\telse\n\t\t\trtw_chset_update_non_ocp_ms(mlmeext->channel_set\n\t\t\t\t, ch, bw, offset, ms);\n\t}\n\nexit:\n\treturn count;\n}\n\nssize_t proc_set_radar_detect(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);\n\tchar tmp[32];\n\tu8 fake_radar_detect_cnt = 0;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu\", &fake_radar_detect_cnt);\n\n\t\tif (num < 1)\n\t\t\tgoto exit;\n\n\t\trfctl->dbg_dfs_master_fake_radar_detect_cnt = fake_radar_detect_cnt;\n\t}\n\nexit:\n\treturn count;\n}\n#endif /* CONFIG_DFS_MASTER */\n\nstatic int proc_get_udpport(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\n\tDBG_871X_SEL_NL(m,\"%d\\n\",precvpriv->sink_udpport);\t\n\treturn 0;\n}\nstatic ssize_t proc_set_udpport(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct recv_priv *precvpriv = &(padapter->recvpriv);\n\tint sink_udpport = 0;\t\n\tchar tmp[32];\n\t\n\t\n\tif (!padapter)\n\t\treturn -EFAULT;\n\n\tif (count < 1)\n\t{\n\t\tDBG_871X(\"argument size is less than 1\\n\");\n\t\treturn -EFAULT;\n\t}\t\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%d\", &sink_udpport);\n\n\t\tif (num !=  1) {\n\t\t\tDBG_871X(\"invalid input parameter number!\\n\");\n\t\t\treturn count;\n\t\t}\n\n\t}\n\tprecvpriv->sink_udpport = sink_udpport;\n\t\n\treturn count;\n\n}\n\nstatic int proc_get_macid_info(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);\n\tu8 i;\n\n\tDBG_871X_SEL_NL(m, \"max_num:%u\\n\", macid_ctl->num);\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\tDBG_871X_SEL_NL(m, \"used:\\n\");\n\tdump_macid_map(m, &macid_ctl->used, macid_ctl->num);\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\tDBG_871X_SEL_NL(m, \"%-3s %-3s %-4s %-4s\"\n\t\t\"\\n\"\n\t\t, \"id\", \"bmc\", \"if_g\", \"ch_g\"\n\t);\n\n\tfor (i=0;i<macid_ctl->num;i++) {\n\t\tif (rtw_macid_is_used(macid_ctl, i))\n\t\t\tDBG_871X_SEL_NL(m, \"%3u %3u %4d %4d\"\n\t\t\t\t\"\\n\"\n\t\t\t\t, i\n\t\t\t\t, rtw_macid_is_bmc(macid_ctl, i)\n\t\t\t\t, rtw_macid_get_if_g(macid_ctl, i)\n\t\t\t\t, rtw_macid_get_ch_g(macid_ctl, i)\n\t\t\t);\n\t}\n\n\treturn 0;\n}\n\nstatic int proc_get_sec_cam(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\n\tDBG_871X_SEL_NL(m, \"sec_cap:0x%02x\\n\", cam_ctl->sec_cap);\n\tDBG_871X_SEL_NL(m, \"flags:0x%08x\\n\", cam_ctl->flags);\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\tDBG_871X_SEL_NL(m, \"max_num:%u\\n\", cam_ctl->num);\n\tDBG_871X_SEL_NL(m, \"used:\\n\");\n\tdump_sec_cam_map(m, &cam_ctl->used, cam_ctl->num);\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\tDBG_871X_SEL_NL(m, \"reg_scr:0x%04x\\n\", rtw_read16(adapter, 0x680));\n\tDBG_871X_SEL_NL(m, \"\\n\");\n\n\tdump_sec_cam(m, adapter);\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_sec_cam(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\tchar tmp[32] = {0};\n\tchar cmd[4];\n\tu8 id;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\t/* c <id>: clear specific cam entry */\n\t\t/* wfc <id>: write specific cam entry from cam cache */\n\n\t\tint num = sscanf(tmp, \"%s %hhu\", cmd, &id);\n\n\t\tif (num < 2)\n\t\t\treturn count;\n\n\t\tif (id >= cam_ctl->num) {\n\t\t\tDBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT\" invalid id:%u\\n\", FUNC_ADPT_ARG(adapter), id);\n\t\t\treturn count;\n\t\t}\n\n\t\tif (strcmp(\"c\", cmd) == 0) {\n\t\t\t_clear_cam_entry(adapter, id);\n\t\t\tadapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */\n\t\t} else if (strcmp(\"wfc\", cmd) == 0) {\n\t\t\twrite_cam_from_cache(adapter, id);\n\t\t}\n\t}\n\n\treturn count;\n}\n\nstatic int proc_get_sec_cam_cache(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(adapter);\n\tstruct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;\n\tu8 i;\n\n\tDBG_871X_SEL_NL(m, \"SW sec cam cache:\\n\");\n\tdump_sec_cam_ent_title(m, 1);\n\tfor (i = 0; i < cam_ctl->num; i++) {\n\t\tif (dvobj->cam_cache[i].ctrl != 0)\n\t\t\tdump_sec_cam_ent(m, &dvobj->cam_cache[i], i);\n\t}\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_change_bss_chbw(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct mlme_priv *mlme = &(adapter->mlmepriv);\n\tstruct mlme_ext_priv *mlmeext = &(adapter->mlmeextpriv);\n\tchar tmp[32];\n\tu8 ch, bw = CHANNEL_WIDTH_20, offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu %hhu %hhu\", &ch, &bw, &offset);\n\n\t\tif (num < 1 || (bw != CHANNEL_WIDTH_20 && num < 3))\n\t\t\tgoto exit;\n\n\t\tif (check_fwstate(mlme, WIFI_AP_STATE) && check_fwstate(mlme, WIFI_ASOC_STATE))\n\t\t\trtw_change_bss_chbw_cmd(adapter, RTW_CMDF_WAIT_ACK, ch, bw, offset);\n\t}\n\nexit:\n\treturn count;\n}\n\nstatic int proc_get_tx_power_by_rate_base(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_tx_power_by_rate_base(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_tx_power_by_rate(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_tx_power_by_rate(m, adapter);\n\n\treturn 0;\n}\n\nstatic int proc_get_tx_power_limit(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_tx_power_limit(m, adapter);\n\n\treturn 0;\n}\n\n#ifdef CONFIG_RF_GAIN_OFFSET\nstatic int proc_get_kfree_flag(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\n\tDBG_871X_SEL_NL(m, \"0x%02x\\n\", kfree_data->flag);\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_kfree_flag(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\tchar tmp[32] = {0};\n\tu8 flag;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhx\", &flag);\n\n\t\tif (num < 1)\n\t\t\treturn count;\n\n\t\tkfree_data->flag = flag;\n\t}\n\n\treturn count;\n}\n\nstatic int proc_get_kfree_bb_gain(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\tu8 i, j;\n\n\t for (i = 0; i < BB_GAIN_NUM; i++) {\n\t\tif (i == 0)\n\t\t\tDBG_871X_SEL(m, \"2G: \");\n\t\telse if (i == 1)\n\t\t\tDBG_871X_SEL(m, \"5GLB1: \");\n\t\telse if (i == 2)\n\t\t\tDBG_871X_SEL(m, \"5GLB2: \");\n\t\telse if (i == 3)\n\t\t\tDBG_871X_SEL(m, \"5GMB1: \");\n\t\telse if (i == 4)\n\t\t\tDBG_871X_SEL(m, \"5GMB2: \");\n\t\telse if (i == 5)\n\t\t\tDBG_871X_SEL(m, \"5GHB: \");\n\n\t\tfor (j = 0; j < hal_data->NumTotalRFPath; j++)\n\t\t\tDBG_871X_SEL(m, \"%d \", kfree_data->bb_gain[i][j]);\n\t\tDBG_871X_SEL(m, \"\\n\");\n\t}\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_kfree_bb_gain(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tHAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\tchar tmp[BB_GAIN_NUM * RF_PATH_MAX] = {0};\n\tu8 path, chidx;\n\ts8 bb_gain[BB_GAIN_NUM];\n\tchar ch_band_Group[6];\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tchar *c, *next;\n\t\tint i = 0;\n\n\t\tnext = tmp;\n\t\tc = strsep(&next, \" \\t\");\n\n\t\tif (sscanf(c, \"%s\", ch_band_Group) != 1) {\n\t\t\tDBG_871X(\"Error Head Format, channel Group select\\n,Please input:\\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\\n\");\n\t\t\treturn count;\n\t\t}\n\t\tif (strcmp(\"2G\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_2G;\n#ifdef CONFIG_IEEE80211_BAND_5GHZ\n\t\telse if (strcmp(\"5GLB1\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_5GLB1;\n\t\telse if (strcmp(\"5GLB2\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_5GLB2;\n\t\telse if (strcmp(\"5GMB1\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_5GMB1;\n\t\telse if (strcmp(\"5GMB2\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_5GMB2;\n\t\telse if (strcmp(\"5GHB\", ch_band_Group) == 0)\n\t\t\tchidx = BB_GAIN_5GHB;\n#endif /*CONFIG_IEEE80211_BAND_5GHZ*/\n\t\telse {\n\t\t\tDBG_871X(\"Error Head Format, channel Group select\\n,Please input:\\t 2G , 5GLB1 , 5GLB2 , 5GMB1 , 5GMB2 , 5GHB\\n\");\n\t\t\treturn count;\n\t\t}\n\t\tc = strsep(&next, \" \\t\");\n\n\t\twhile (c != NULL) {\n\t\t\tif (sscanf(c, \"%hhx\", &bb_gain[i]) != 1)\n\t\t\t\tbreak;\n\n\t\t\tkfree_data->bb_gain[chidx][i] = bb_gain[i];\n\t\t\tDBG_871X(\"%s,kfree_data->bb_gain[%d][%d]=%x\\n\", __func__, chidx, i, kfree_data->bb_gain[chidx][i]);\n\n\t\t\tc = strsep(&next, \" \\t\");\n\t\t\ti++;\n\t\t}\n\n\t}\n\n\treturn count;\n\n}\n\nstatic int proc_get_kfree_thermal(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\n\tDBG_871X_SEL(m, \"%d\\n\", kfree_data->thermal);\n\n\treturn 0;\n}\n\nstatic ssize_t proc_set_kfree_thermal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tstruct kfree_data_t *kfree_data = GET_KFREE_DATA(adapter);\n\tchar tmp[32] = {0};\n\ts8 thermal;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhd\", &thermal);\n\n\t\tif (num < 1)\n\t\t\treturn count;\n\n\t\tkfree_data->thermal = thermal;\n\t}\n\n\treturn count;\n}\n\nstatic ssize_t proc_set_tx_gain_offset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter;\n\tchar tmp[32] = {0};\n\tu8 rf_path;\n\ts8 offset;\n\n\tadapter = (_adapter *)rtw_netdev_priv(dev);\n\tif (!adapter)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tu8 write_value;\n\t\tint num = sscanf(tmp, \"%hhu %hhd\", &rf_path, &offset);\n\n\t\tif (num < 2)\n\t\t\treturn count;\n\n\t\tDBG_871X(\"write rf_path:%u tx gain offset:%d\\n\", rf_path, offset);\n\t\trtw_rf_set_tx_gain_offset(adapter, rf_path, offset);\n\t}\n\n\treturn count;\n}\n#endif /* CONFIG_RF_GAIN_OFFSET */\n\n#ifdef CONFIG_BT_COEXIST\nssize_t proc_set_btinfo_evt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu8 btinfo[8];\n\n\tif (count < 6)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tint num = 0;\n\n\t\t_rtw_memset(btinfo, 0, 8);\n\t\t\n\t\tnum = sscanf(tmp, \"%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx\"\n\t\t\t, &btinfo[0], &btinfo[1], &btinfo[2], &btinfo[3]\n\t\t\t, &btinfo[4], &btinfo[5], &btinfo[6], &btinfo[7]);\n\n\t\tif (num < 6)\n\t\t\treturn -EINVAL;\n\n\t\tbtinfo[1] = num-2;\n\n\t\trtw_btinfo_cmd(padapter, btinfo, btinfo[1]+2);\n\t}\n\t\n\treturn count;\n}\n#endif\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\nstatic int proc_get_best_chan(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tu8 best_24g_ch = 0, best_5g_ch = 0;\n\n\trtw_hal_get_odm_var(adapter, HAL_ODM_AUTO_CHNL_SEL, &(best_24g_ch), &(best_5g_ch));\n\n\tDBG_871X_SEL_NL(m, \"Best 2.4G CH:%u\\n\", best_24g_ch);\n\tDBG_871X_SEL_NL(m, \"Best 5G CH:%u\\n\", best_5g_ch);\n\treturn 0;\n}\n\nstatic ssize_t  proc_set_acs(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu8 acs_satae = 0;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%hhu\", &acs_satae);\n\t\t\n\t\tif (num < 1)\n\t\t\treturn -EINVAL;\n\n\t\tif (1 == acs_satae)\n\t\t\trtw_acs_start(padapter, _TRUE);\n\t\telse\n\t\t\trtw_acs_start(padapter, _FALSE);\n\n\t}\n\treturn count;\n}\n#endif\n\nstatic int proc_get_hal_spec(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\tdump_hal_spec(m, adapter);\n\treturn 0;\n}\n\n/*\n* rtw_adapter_proc:\n* init/deinit when register/unregister net_device\n*/\nconst struct rtw_proc_hdl adapter_proc_hdls [] = {\n\t{\"write_reg\", proc_get_dummy, proc_set_write_reg},\n\t{\"read_reg\", proc_get_read_reg, proc_set_read_reg},\n\t{\"adapters_status\", proc_get_dump_adapters_status, NULL},\n\t{\"fwstate\", proc_get_fwstate, NULL},\n\t{\"sec_info\", proc_get_sec_info, NULL},\n\t{\"mlmext_state\", proc_get_mlmext_state, NULL},\n\t{\"qos_option\", proc_get_qos_option, NULL},\n\t{\"ht_option\", proc_get_ht_option, NULL},\n\t{\"rf_info\", proc_get_rf_info, NULL},\n\t{\"scan_param\", proc_get_scan_param, proc_set_scan_param},\n\t{\"scan_abort\", proc_get_scan_abort, NULL},\t\n#ifdef CONFIG_SCAN_BACKOP\n\t{\"backop_flags_sta\", proc_get_backop_flags_sta, proc_set_backop_flags_sta},\n\t{\"backop_flags_ap\", proc_get_backop_flags_ap, proc_set_backop_flags_ap},\n#endif\n\t{\"survey_info\", proc_get_survey_info, proc_set_survey_info},\n\t{\"ap_info\", proc_get_ap_info, NULL},\n\t{\"trx_info\", proc_get_trx_info, proc_reset_trx_info},\n\t{\"rate_ctl\", proc_get_rate_ctl, proc_set_rate_ctl},\n\t{\"dis_pwt_ctl\", proc_get_dis_pwt, proc_set_dis_pwt},\n\t{\"mac_qinfo\", proc_get_mac_qinfo, NULL},\n\t{\"macid_info\", proc_get_macid_info, NULL},\n\t{\"sec_cam\", proc_get_sec_cam, proc_set_sec_cam},\n\t{\"sec_cam_cache\", proc_get_sec_cam_cache, NULL},\n\t{\"suspend_info\", proc_get_suspend_resume_info, NULL},\n\t{\"wifi_spec\",proc_get_wifi_spec,NULL},\n#ifdef CONFIG_LAYER2_ROAMING\n\t{\"roam_flags\", proc_get_roam_flags, proc_set_roam_flags},\n\t{\"roam_param\", proc_get_roam_param, proc_set_roam_param},\n\t{\"roam_tgt_addr\", proc_get_dummy, proc_set_roam_tgt_addr},\n#endif /* CONFIG_LAYER2_ROAMING */\n\n#ifdef CONFIG_SDIO_HCI\n\t{\"sd_f0_reg_dump\", proc_get_sd_f0_reg_dump, NULL},\n\t{\"sdio_local_reg_dump\", proc_get_sdio_local_reg_dump, NULL},\n#endif /* CONFIG_SDIO_HCI */\n\n\t{\"fwdl_test_case\", proc_get_dummy, proc_set_fwdl_test_case},\n\t{\"del_rx_ampdu_test_case\", proc_get_dummy, proc_set_del_rx_ampdu_test_case},\n\t{\"wait_hiq_empty\", proc_get_dummy, proc_set_wait_hiq_empty},\n\n\t{\"mac_reg_dump\", proc_get_mac_reg_dump, NULL},\n\t{\"bb_reg_dump\", proc_get_bb_reg_dump, NULL},\n\t{\"rf_reg_dump\", proc_get_rf_reg_dump, NULL},\n\t\n#ifdef CONFIG_AP_MODE\n\t{\"all_sta_info\", proc_get_all_sta_info, NULL},\n#endif /* CONFIG_AP_MODE */\n\n#ifdef DBG_MEMORY_LEAK\n\t{\"_malloc_cnt\", proc_get_malloc_cnt, NULL},\n#endif /* DBG_MEMORY_LEAK */\n\n#ifdef CONFIG_FIND_BEST_CHANNEL\n\t{\"best_channel\", proc_get_best_channel, proc_set_best_channel},\n#endif\n\n\t{\"rx_signal\", proc_get_rx_signal, proc_set_rx_signal},\n\t{\"hw_info\", proc_get_hw_status, NULL},\n\n#ifdef CONFIG_80211N_HT\n\t{\"ht_enable\", proc_get_ht_enable, proc_set_ht_enable},\n\t{\"bw_mode\", proc_get_bw_mode, proc_set_bw_mode},\n\t{\"ampdu_enable\", proc_get_ampdu_enable, proc_set_ampdu_enable},\n\t{\"rx_stbc\", proc_get_rx_stbc, proc_set_rx_stbc},\n\t{\"rx_ampdu\", proc_get_rx_ampdu, proc_set_rx_ampdu},\n\t{\"rx_ampdu_factor\",proc_get_rx_ampdu_factor,proc_set_rx_ampdu_factor},\n\t{\"rx_ampdu_density\",proc_get_rx_ampdu_density,proc_set_rx_ampdu_density},\n\t{\"tx_ampdu_density\",proc_get_tx_ampdu_density,proc_set_tx_ampdu_density},\t \n#endif /* CONFIG_80211N_HT */\n\n\t{\"en_fwps\", proc_get_en_fwps, proc_set_en_fwps},\n\t{\"mac_rptbuf\", proc_get_mac_rptbuf, NULL},\n\n\t//{\"path_rssi\", proc_get_two_path_rssi, NULL},\n//\t{\"rssi_disp\",proc_get_rssi_disp, proc_set_rssi_disp},\n\n#ifdef CONFIG_BT_COEXIST\n\t{\"btcoex_dbg\", proc_get_btcoex_dbg, proc_set_btcoex_dbg},\n\t{\"btcoex\", proc_get_btcoex_info, NULL},\n\t{\"btinfo_evt\", proc_get_dummy, proc_set_btinfo_evt},\n#endif /* CONFIG_BT_COEXIST */\n\n#if defined(DBG_CONFIG_ERROR_DETECT)\n\t{\"sreset\", proc_get_sreset, proc_set_sreset},\n#endif /* DBG_CONFIG_ERROR_DETECT */\n\t{\"linked_info_dump\",proc_get_linked_info_dump,proc_set_linked_info_dump},\n\t{\"tx_info_msg\", proc_get_tx_info_msg, NULL},\n\t{\"rx_info_msg\", proc_get_rx_info_msg, proc_set_rx_info_msg},\n#ifdef CONFIG_GPIO_API\n\t{\"gpio_info\",proc_get_gpio,proc_set_gpio},\n\t{\"gpio_set_output_value\",proc_get_dummy,proc_set_gpio_output_value},\n\t{\"gpio_set_direction\",proc_get_dummy,proc_set_config_gpio},\n#endif\n\n#ifdef CONFIG_DBG_COUNTER\n\t{\"rx_logs\", proc_get_rx_logs, NULL},\n\t{\"tx_logs\", proc_get_tx_logs, NULL},\n\t{\"int_logs\", proc_get_int_logs, NULL},\n#endif\n\n#ifdef CONFIG_PCI_HCI\n\t{\"rx_ring\", proc_get_rx_ring, NULL},\n\t{\"tx_ring\", proc_get_tx_ring, NULL},\n#endif\n#ifdef CONFIG_GPIO_WAKEUP\n\t{\"wowlan_gpio_info\", proc_get_wowlan_gpio_info,\n\t\tproc_set_wowlan_gpio_info},\n#endif\n#ifdef CONFIG_P2P_WOWLAN\n\t{\"p2p_wowlan_info\", proc_get_p2p_wowlan_info, NULL},\n#endif\n\t{\"chan_plan\",proc_get_chan_plan,proc_set_chan_plan},\n#ifdef CONFIG_DFS_MASTER\n\t{\"dfs_master_test_case\", proc_get_dfs_master_test_case, proc_set_dfs_master_test_case},\n\t{\"update_non_ocp\", proc_get_dummy, proc_set_update_non_ocp},\n\t{\"radar_detect\", proc_get_dummy, proc_set_radar_detect},\n#endif\n\t{\"new_bcn_max\", proc_get_new_bcn_max, proc_set_new_bcn_max},\n\t{\"sink_udpport\",proc_get_udpport,proc_set_udpport},\n#ifdef DBG_RX_COUNTER_DUMP\n\t{\"dump_rx_cnt_mode\",proc_get_rx_cnt_dump,proc_set_rx_cnt_dump},\n#endif\t\n\t{\"change_bss_chbw\", NULL, proc_set_change_bss_chbw},\n\t{\"tx_power_by_rate_base\", proc_get_tx_power_by_rate_base, NULL},\n\t{\"tx_power_by_rate\", proc_get_tx_power_by_rate, NULL},\n\t{\"tx_power_limit\", proc_get_tx_power_limit, NULL},\n#ifdef CONFIG_RF_GAIN_OFFSET\n\t{\"tx_gain_offset\", proc_get_dummy, proc_set_tx_gain_offset},\n\t{\"kfree_flag\", proc_get_kfree_flag, proc_set_kfree_flag},\n\t{\"kfree_bb_gain\", proc_get_kfree_bb_gain, proc_set_kfree_bb_gain},\n\t{\"kfree_thermal\", proc_get_kfree_thermal, proc_set_kfree_thermal},\n#endif\n#ifdef CONFIG_POWER_SAVING\n\t{\"ps_info\",proc_get_ps_info, NULL},\n#endif\n#ifdef CONFIG_TDLS\n\t{\"tdls_info\", proc_get_tdls_info, NULL},\n#endif\n\t{\"monitor\", proc_get_monitor, proc_set_monitor},\n\n#ifdef CONFIG_AUTO_CHNL_SEL_NHM\n\t{\"acs\", proc_get_best_chan, proc_set_acs},\n#endif\n#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t{\"rtkm_info\", proc_get_rtkm_info, NULL}\n#endif\n\t{\"efuse_map\", proc_get_efuse_map, NULL},\n#ifdef CONFIG_IEEE80211W\n\t{\"11w_tx_sa_query\", proc_get_tx_sa_query, proc_set_tx_sa_query},\n\t{\"11w_tx_deauth\", proc_get_tx_deauth, proc_set_tx_deauth},\n\t{\"11w_tx_auth\", proc_get_tx_auth, proc_set_tx_auth},\n#endif /* CONFIG_IEEE80211W */\n\t{\"hal_spec\", proc_get_hal_spec, NULL},\n};\n\nconst int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);\n\nstatic int rtw_adapter_proc_open(struct inode *inode, struct file *file)\n{\n\tssize_t index = (ssize_t)PDE_DATA(inode);\n\tconst struct rtw_proc_hdl *hdl = adapter_proc_hdls+index;\n\n\treturn single_open(file, hdl->show, proc_get_parent_data(inode));\n}\n\nstatic ssize_t rtw_adapter_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)\n{\n\tssize_t index = (ssize_t)PDE_DATA(file_inode(file));\n\tconst struct rtw_proc_hdl *hdl = adapter_proc_hdls+index;\n\tssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;\n\n\tif (write)\n\t\treturn write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);\n\n\treturn -EROFS;\n}\n\nstatic const struct file_operations rtw_adapter_proc_fops = {\n\t.owner = THIS_MODULE,\n\t.open = rtw_adapter_proc_open,\n\t.read = seq_read,\n\t.llseek = seq_lseek,\n\t.release = single_release,\n\t.write = rtw_adapter_proc_write,\n};\n\nint proc_get_odm_dbg_comp(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_odm_dbg_comp_msg(m, adapter);\n\n\treturn 0;\n}\n\nssize_t proc_set_odm_dbg_comp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\n\tu64 dbg_comp;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%llx\", &dbg_comp);\n\n\t\tif (num != 1)\n\t\t\treturn count;\n\n\t\trtw_odm_dbg_comp_set(adapter, dbg_comp);\n\t}\n\n\treturn count;\n}\n\nint proc_get_odm_dbg_level(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_odm_dbg_level_msg(m, adapter);\n\n\treturn 0;\n}\n\nssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\n\tu32 dbg_level;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%u\", &dbg_level);\n\n\t\tif (num != 1)\n\t\t\treturn count;\n\n\t\trtw_odm_dbg_level_set(adapter, dbg_level);\n\t}\n\n\treturn count;\n}\n\nint proc_get_odm_ability(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_odm_ability_msg(m, adapter);\n\n\treturn 0;\n}\n\nssize_t proc_set_odm_ability(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *adapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\n\tu32 ability;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x\", &ability);\n\n\t\tif (num != 1)\n\t\t\treturn count;\n\n\t\trtw_odm_ability_set(adapter, ability);\n\t}\n\n\treturn count;\n}\n\nint proc_get_odm_adaptivity(struct seq_file *m, void *v)\n{\n\tstruct net_device *dev = m->private;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\n\trtw_odm_adaptivity_parm_msg(m, padapter);\n\n\treturn 0;\n}\n\nssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *dev = data;\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);\n\tchar tmp[32];\n\tu32 TH_L2H_ini;\n\tu32 TH_L2H_ini_mode2;\n\ts8 TH_EDCCA_HL_diff;\n\ts8 TH_EDCCA_HL_diff_mode2;\n\tu8 EDCCA_enable;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp)) {\n\t\trtw_warn_on(1);\n\t\treturn -EFAULT;\n\t}\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\n\t\tint num = sscanf(tmp, \"%x %hhd %x %hhd %hhu\", &TH_L2H_ini, &TH_EDCCA_HL_diff, &TH_L2H_ini_mode2, &TH_EDCCA_HL_diff_mode2, &EDCCA_enable);\n\n\t\tif (num != 5)\n\t\t\treturn count;\n\n\t\trtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)TH_L2H_ini_mode2, TH_EDCCA_HL_diff_mode2, EDCCA_enable);\n\t}\n\t\n\treturn count;\n}\n\nstatic char *phydm_msg = NULL;\n#define PHYDM_MSG_LEN\t80*24\n\nint proc_get_phydm_cmd(struct seq_file *m, void *v)\n{\n\tstruct net_device *netdev;\n\tPADAPTER padapter;\n\tPHAL_DATA_TYPE pHalData;\n\tPDM_ODM_T phydm;\n\n\n\tnetdev = m->private;\n\tpadapter = (PADAPTER)rtw_netdev_priv(netdev);\n\tpHalData = GET_HAL_DATA(padapter);\n\tphydm = &pHalData->odmpriv;\n\n\tif (NULL == phydm_msg) {\n\t\tphydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);\n\t\tif (NULL == phydm_msg)\n\t\t\treturn -ENOMEM;\n\n\t\tphydm_cmd(phydm, NULL, 0, 0, phydm_msg, PHYDM_MSG_LEN);\n\t}\n\n\tDBG_871X_SEL(m, \"%s\\n\", phydm_msg);\n\n\trtw_mfree(phydm_msg, PHYDM_MSG_LEN);\n\tphydm_msg = NULL;\n\n\treturn 0;\n}\n\nssize_t proc_set_phydm_cmd(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)\n{\n\tstruct net_device *netdev;\n\tPADAPTER padapter;\n\tPHAL_DATA_TYPE pHalData;\n\tPDM_ODM_T phydm;\n\tchar tmp[64] = {0};\n\n\n\tnetdev = (struct net_device*)data;\n\tpadapter = (PADAPTER)rtw_netdev_priv(netdev);\n\tpHalData = GET_HAL_DATA(padapter);\n\tphydm = &pHalData->odmpriv;\n\n\tif (count < 1)\n\t\treturn -EFAULT;\n\n\tif (count > sizeof(tmp))\n\t\treturn -EFAULT;\n\n\tif (buffer && !copy_from_user(tmp, buffer, count)) {\n\t\tif (NULL == phydm_msg) {\n\t\t\tphydm_msg = rtw_zmalloc(PHYDM_MSG_LEN);\n\t\t\tif (NULL == phydm_msg)\n\t\t\t\treturn -ENOMEM;\n\t\t} else {\n\t\t\t_rtw_memset(phydm_msg, 0, PHYDM_MSG_LEN);\n\t\t}\n\n\t\tphydm_cmd(phydm, tmp, count, 1, phydm_msg, PHYDM_MSG_LEN);\n\n\t\tif (strlen(phydm_msg) == 0) {\n\t\t\trtw_mfree(phydm_msg, PHYDM_MSG_LEN);\n\t\t\tphydm_msg = NULL;\n\t\t}\n\t}\n\n\treturn count;\n}\n\n/*\n* rtw_odm_proc:\n* init/deinit when register/unregister net_device, along with rtw_adapter_proc\n*/\nconst struct rtw_proc_hdl odm_proc_hdls [] = {\n\t{\"dbg_comp\", proc_get_odm_dbg_comp, proc_set_odm_dbg_comp},\n\t{\"dbg_level\", proc_get_odm_dbg_level, proc_set_odm_dbg_level},\n\t{\"ability\", proc_get_odm_ability, proc_set_odm_ability},\n\t{\"adaptivity\", proc_get_odm_adaptivity, proc_set_odm_adaptivity},\n\t{\"cmd\", proc_get_phydm_cmd, proc_set_phydm_cmd},\n};\n\nconst int odm_proc_hdls_num = sizeof(odm_proc_hdls) / sizeof(struct rtw_proc_hdl);\n\nstatic int rtw_odm_proc_open(struct inode *inode, struct file *file)\n{\n\tssize_t index = (ssize_t)PDE_DATA(inode);\n\tconst struct rtw_proc_hdl *hdl = odm_proc_hdls+index;\n\n\treturn single_open(file, hdl->show, proc_get_parent_data(inode));\n}\n\nstatic ssize_t rtw_odm_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)\n{\n\tssize_t index = (ssize_t)PDE_DATA(file_inode(file));\n\tconst struct rtw_proc_hdl *hdl = odm_proc_hdls+index;\n\tssize_t (*write)(struct file *, const char __user *, size_t, loff_t *, void *) = hdl->write;\n\t\n\tif (write)\n\t\treturn write(file, buffer, count, pos, ((struct seq_file *)file->private_data)->private);\n\n\treturn -EROFS;\n}\n\nstatic const struct file_operations rtw_odm_proc_fops = {\n\t.owner = THIS_MODULE,\n\t.open = rtw_odm_proc_open,\n\t.read = seq_read,\n\t.llseek = seq_lseek,\n\t.release = single_release,\n\t.write = rtw_odm_proc_write,\n};\n\nstruct proc_dir_entry *rtw_odm_proc_init(struct net_device *dev)\n{\n\tstruct proc_dir_entry *dir_odm = NULL;\n\tstruct proc_dir_entry *entry = NULL;\n\t_adapter\t*adapter = rtw_netdev_priv(dev);\n\tssize_t i;\n\n\tif (adapter->dir_dev == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (adapter->dir_odm != NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tdir_odm = rtw_proc_create_dir(\"odm\", adapter->dir_dev, dev);\n\tif (dir_odm == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tadapter->dir_odm = dir_odm;\n\n\tfor (i=0;i<odm_proc_hdls_num;i++) {\n\t\tentry = rtw_proc_create_entry(odm_proc_hdls[i].name, dir_odm, &rtw_odm_proc_fops, (void *)i);\n\t\tif (!entry) {\n\t\t\trtw_warn_on(1);\n\t\t\tgoto exit;\n\t\t}\n\t}\n\nexit:\n\treturn dir_odm;\n}\n\nvoid rtw_odm_proc_deinit(_adapter\t*adapter)\n{\n\tstruct proc_dir_entry *dir_odm = NULL;\n\tint i;\n\n\tdir_odm = adapter->dir_odm;\n\n\tif (dir_odm == NULL) {\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tfor (i=0;i<odm_proc_hdls_num;i++)\n\t\tremove_proc_entry(odm_proc_hdls[i].name, dir_odm);\n\n\tremove_proc_entry(\"odm\", adapter->dir_dev);\n\n\tadapter->dir_odm = NULL;\n\n\tif (phydm_msg) {\n\t\trtw_mfree(phydm_msg, PHYDM_MSG_LEN);\n\t\tphydm_msg = NULL;\n\t}\n}\n\nstruct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev)\n{\n\tstruct proc_dir_entry *drv_proc = get_rtw_drv_proc();\n\tstruct proc_dir_entry *dir_dev = NULL;\n\tstruct proc_dir_entry *entry = NULL;\n\t_adapter *adapter = rtw_netdev_priv(dev);\n\tu8 rf_type;\n\tssize_t i;\n\n\tif (drv_proc == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tif (adapter->dir_dev != NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tdir_dev = rtw_proc_create_dir(dev->name, drv_proc, dev);\n\tif (dir_dev == NULL) {\n\t\trtw_warn_on(1);\n\t\tgoto exit;\n\t}\n\n\tadapter->dir_dev = dir_dev;\n\n\tfor (i=0;i<adapter_proc_hdls_num;i++) {\n\t\tentry = rtw_proc_create_entry(adapter_proc_hdls[i].name, dir_dev, &rtw_adapter_proc_fops, (void *)i);\n\t\tif (!entry) {\n\t\t\trtw_warn_on(1);\n\t\t\tgoto exit;\n\t\t}\n\t}\n\n\trtw_odm_proc_init(dev);\n\nexit:\n\treturn dir_dev;\n}\n\nvoid rtw_adapter_proc_deinit(struct net_device *dev)\n{\n\tstruct proc_dir_entry *drv_proc = get_rtw_drv_proc();\n\tstruct proc_dir_entry *dir_dev = NULL;\n\t_adapter *adapter = rtw_netdev_priv(dev);\n\tint i;\n\n\tdir_dev = adapter->dir_dev;\n\n\tif (dir_dev == NULL) {\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tfor (i=0;i<adapter_proc_hdls_num;i++)\n\t\tremove_proc_entry(adapter_proc_hdls[i].name, dir_dev);\n\n\trtw_odm_proc_deinit(adapter);\n\n\tremove_proc_entry(dev->name, drv_proc);\n\n\tadapter->dir_dev = NULL;\n}\n\nvoid rtw_adapter_proc_replace(struct net_device *dev)\n{\n\tstruct proc_dir_entry *drv_proc = get_rtw_drv_proc();\n\tstruct proc_dir_entry *dir_dev = NULL;\n\t_adapter *adapter = rtw_netdev_priv(dev);\n\tint i;\n\n\tdir_dev = adapter->dir_dev;\n\n\tif (dir_dev == NULL) {\n\t\trtw_warn_on(1);\n\t\treturn;\n\t}\n\n\tfor (i=0;i<adapter_proc_hdls_num;i++)\n\t\tremove_proc_entry(adapter_proc_hdls[i].name, dir_dev);\n\n\trtw_odm_proc_deinit(adapter);\n\n\tremove_proc_entry(adapter->old_ifname, drv_proc);\n\n\tadapter->dir_dev = NULL;\n\n\trtw_adapter_proc_init(dev);\n\n}\n\n#endif /* CONFIG_PROC_DEBUG */\n\n"
  },
  {
    "path": "os_dep/linux/rtw_proc.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __RTW_PROC_H__\n#define __RTW_PROC_H__\n\n#include <linux/proc_fs.h>\n#include <linux/seq_file.h>\n\nstruct rtw_proc_hdl {\n\tchar *name;\n\tint (*show)(struct seq_file *, void *);\n\tssize_t (*write)(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);\n};\n\n#ifdef CONFIG_PROC_DEBUG\n\nstruct proc_dir_entry *get_rtw_drv_proc(void);\nint rtw_drv_proc_init(void);\nvoid rtw_drv_proc_deinit(void);\nstruct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev);\nvoid rtw_adapter_proc_deinit(struct net_device *dev);\nvoid rtw_adapter_proc_replace(struct net_device *dev);\n\n#else //!CONFIG_PROC_DEBUG\n\n#define get_rtw_drv_proc() NULL\n#define rtw_drv_proc_init() 0\n#define rtw_drv_proc_deinit() do {} while (0)\n#define rtw_adapter_proc_init(dev) NULL\n#define rtw_adapter_proc_deinit(dev) do {} while (0)\n#define rtw_adapter_proc_replace(dev) do {} while (0)\n\n#endif //!CONFIG_PROC_DEBUG\n\n#endif //__RTW_PROC_H__\n"
  },
  {
    "path": "os_dep/linux/usb_intf.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _HCI_INTF_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n\n#include <platform_ops.h>\n\n#ifndef CONFIG_USB_HCI\n#error \"CONFIG_USB_HCI shall be on!\\n\"\n#endif\n\n#if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)\n#error \"Shall be Linux or Windows, but not both!\\n\"\n#endif\n\n#ifdef CONFIG_80211N_HT\nextern int rtw_ht_enable;\nextern int rtw_bw_mode;\nextern int rtw_ampdu_enable;//for enable tx_ampdu\n#endif\n\n#ifdef CONFIG_GLOBAL_UI_PID\nint ui_pid[3] = {0, 0, 0};\n#endif\n\n\nextern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal);\nstatic int rtw_suspend(struct usb_interface *intf, pm_message_t message);\nstatic int rtw_resume(struct usb_interface *intf);\n\n\nstatic int rtw_drv_init(struct usb_interface *pusb_intf,const struct usb_device_id *pdid);\nstatic void rtw_dev_remove(struct usb_interface *pusb_intf);\n\nstatic void rtw_dev_shutdown(struct device *dev)\n{\n\tstruct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev);\n\tstruct dvobj_priv *dvobj = NULL;\n\t_adapter *adapter = NULL;\n\tint i;\n\n\tDBG_871X(\"%s\\n\", __func__);\n\n\tif(usb_intf)\n\t{\n\t\tdvobj = usb_get_intfdata(usb_intf);\n\t\tif (dvobj)\n\t\t{\n\t\t\trtw_set_surprise_removed(dvobj->padapters[IFACE_ID0]);\n\t\t\tATOMIC_SET(&dvobj->continual_io_error, MAX_CONTINUAL_IO_ERR+1);\n\t\t}\n\t}\n}\n\n#if (LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,23))\n/* Some useful macros to use to create struct usb_device_id */\n #define USB_DEVICE_ID_MATCH_VENDOR \t\t\t 0x0001\n #define USB_DEVICE_ID_MATCH_PRODUCT\t\t\t 0x0002\n #define USB_DEVICE_ID_MATCH_DEV_LO \t\t\t 0x0004\n #define USB_DEVICE_ID_MATCH_DEV_HI \t\t\t 0x0008\n #define USB_DEVICE_ID_MATCH_DEV_CLASS\t\t\t 0x0010\n #define USB_DEVICE_ID_MATCH_DEV_SUBCLASS\t\t 0x0020\n #define USB_DEVICE_ID_MATCH_DEV_PROTOCOL\t\t 0x0040\n #define USB_DEVICE_ID_MATCH_INT_CLASS\t\t\t 0x0080\n #define USB_DEVICE_ID_MATCH_INT_SUBCLASS\t\t 0x0100\n #define USB_DEVICE_ID_MATCH_INT_PROTOCOL\t\t 0x0200\n #define USB_DEVICE_ID_MATCH_INT_NUMBER \t\t 0x0400\n\n\n#define USB_DEVICE_ID_MATCH_INT_INFO \\\n\t\t\t\t (USB_DEVICE_ID_MATCH_INT_CLASS | \\\n\t\t\t\t USB_DEVICE_ID_MATCH_INT_SUBCLASS | \\\n\t\t\t\t USB_DEVICE_ID_MATCH_INT_PROTOCOL)\n\n\n#define USB_DEVICE_AND_INTERFACE_INFO(vend, prod, cl, sc, pr) \\\n\t\t .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \\\n\t\t\t\t | USB_DEVICE_ID_MATCH_DEVICE, \\\n\t\t .idVendor = (vend), \\\n\t\t .idProduct = (prod), \\\n\t\t .bInterfaceClass = (cl), \\\n\t\t .bInterfaceSubClass = (sc), \\\n\t\t .bInterfaceProtocol = (pr)\n\n /**\n  * USB_VENDOR_AND_INTERFACE_INFO - describe a specific usb vendor with a class of usb interfaces\n  * @vend: the 16 bit USB Vendor ID\n  * @cl: bInterfaceClass value\n  * @sc: bInterfaceSubClass value\n  * @pr: bInterfaceProtocol value\n  *\n  * This macro is used to create a struct usb_device_id that matches a\n  * specific vendor with a specific class of interfaces.\n  *\n  * This is especially useful when explicitly matching devices that have\n  * vendor specific bDeviceClass values, but standards-compliant interfaces.\n  */\n#define USB_VENDOR_AND_INTERFACE_INFO(vend, cl, sc, pr) \\\n\t\t .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \\\n\t\t\t\t | USB_DEVICE_ID_MATCH_VENDOR, \\\n\t\t .idVendor = (vend), \\\n\t\t .bInterfaceClass = (cl), \\\n\t\t .bInterfaceSubClass = (sc), \\\n\t\t .bInterfaceProtocol = (pr)\n\n/* ----------------------------------------------------------------------- */\n#endif\n\n\n#define USB_VENDER_ID_REALTEK\t\t0x0BDA\n\n\n/* DID_USB_v916_20130116 */\nstatic struct usb_device_id rtw_usb_id_tbl[] ={\n#ifdef CONFIG_RTL8188E\n\t/*=== Realtek demoboard ===*/\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179),.driver_info = RTL8188E}, /* 8188EUS */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179),.driver_info = RTL8188E}, /* 8188ETV */\n\t/*=== Customer ID ===*/\n\t/****** 8188EUS ********/\n\t{USB_DEVICE(0x07B8, 0x8179),.driver_info = RTL8188E}, /* Abocom - Abocom */\n#endif\n\n#ifdef CONFIG_RTL8812A\n\t/*=== Realtek demoboard ===*/\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8812),.driver_info = RTL8812},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881A),.driver_info = RTL8812},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881B),.driver_info = RTL8812},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x881C),.driver_info = RTL8812},/* Default ID */\n\t/*=== Customer ID ===*/\n\t{USB_DEVICE(0x050D, 0x1106),.driver_info = RTL8812}, /* Belkin - sercomm */\n\t{USB_DEVICE(0x2001, 0x330E),.driver_info = RTL8812}, /* D-Link - ALPHA */\n\t{USB_DEVICE(0x7392, 0xA822),.driver_info = RTL8812}, /* Edimax - Edimax */\n\t{USB_DEVICE(0x0DF6, 0x0074),.driver_info = RTL8812}, /* Sitecom - Edimax */\n\t{USB_DEVICE(0x04BB, 0x0952),.driver_info = RTL8812}, /* I-O DATA - Edimax */\n\t{USB_DEVICE(0x0789, 0x016E),.driver_info = RTL8812}, /* Logitec - Edimax */\n\t{USB_DEVICE(0x0409, 0x0408),.driver_info = RTL8812}, /* NEC - */\n\t{USB_DEVICE(0x0B05, 0x17D2),.driver_info = RTL8812}, /* ASUS - Edimax */\n\t{USB_DEVICE(0x0E66, 0x0022),.driver_info = RTL8812}, /* HAWKING - Edimax */\n\t{USB_DEVICE(0x0586, 0x3426),.driver_info = RTL8812}, /* ZyXEL - */\n\t{USB_DEVICE(0x2001, 0x3313),.driver_info = RTL8812}, /* D-Link - ALPHA */\n\t{USB_DEVICE(0x1058, 0x0632),.driver_info = RTL8812}, /* WD - Cybertan*/\n\t{USB_DEVICE(0x1740, 0x0100),.driver_info = RTL8812}, /* EnGenius - EnGenius */\n\t{USB_DEVICE(0x2019, 0xAB30),.driver_info = RTL8812}, /* Planex - Abocom */\n\t{USB_DEVICE(0x07B8, 0x8812),.driver_info = RTL8812}, /* Abocom - Abocom */\n\t{USB_DEVICE(0x2001, 0x3315),.driver_info = RTL8812}, /* D-Link - Cameo */\n\t{USB_DEVICE(0x2001, 0x3316),.driver_info = RTL8812}, /* D-Link - Cameo */\n#endif\n\n#ifdef CONFIG_RTL8821A\n        /*=== Realtek demoboard ===*/\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0811),.driver_info = RTL8821},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0821),.driver_info = RTL8821},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8822),.driver_info = RTL8821},/* Default ID */\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xA811) , .driver_info = RTL8821},/* Default ID */\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0820,0xff,0xff,0xff),.driver_info = RTL8821}, /* 8821AU */\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0823,0xff,0xff,0xff),.driver_info = RTL8821}, /* 8821AU */\n\t/*=== Customer ID ===*/\n\t{USB_DEVICE(0x7392, 0xA811),.driver_info = RTL8821}, /* Edimax - Edimax */\n\t{USB_DEVICE(0x04BB, 0x0953),.driver_info = RTL8821}, /* I-O DATA - Edimax */\n\t{USB_DEVICE(0x2001, 0x3314),.driver_info = RTL8821}, /* D-Link - Cameo */\n\t{USB_DEVICE(0x2001, 0x3318),.driver_info = RTL8821}, /* D-Link - Cameo */\n\t{USB_DEVICE(0x0E66, 0x0023),.driver_info = RTL8821}, /* HAWKING - Edimax */\n\t{USB_DEVICE(0x056E, 0x400E) , .driver_info = RTL8821}, /* ELECOM -  ELECOM */\n\t{USB_DEVICE(0x056E, 0x400F) , .driver_info = RTL8821}, /* ELECOM -  ELECOM */\n#endif\n\n#ifdef CONFIG_RTL8192E\n\t/*=== Realtek demoboard ===*/\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x818B,0xff,0xff,0xff),.driver_info = RTL8192E},/* Default ID */\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x818C,0xff,0xff,0xff),.driver_info = RTL8192E},/* Default ID */\n#endif\n\n#ifdef CONFIG_RTL8723B\n\t//*=== Realtek demoboard ===*/\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB720,0xff,0xff,0xff),.driver_info = RTL8723B}, /* 8723BU 1*1 */\n\t//{USB_DEVICE(USB_VENDER_ID_REALTEK, 0xB720),.driver_info = RTL8723B}, /* 8723BU */\n#endif\n\n#ifdef CONFIG_RTL8703B\n\t/*=== Realtek demoboard ===*/\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB703, 0xff, 0xff, 0xff), .driver_info = RTL8703B}, /* 8723CU 1*1 */\n\t/* {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xB703), .driver_info = RTL723C}, */ /* 8723CU 1*1 */\n#endif /* CONFIG_RTL8703B */\n\n#ifdef CONFIG_RTL8814A\n\t\n\t{USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8813),.driver_info = RTL8814A},\n\t{USB_DEVICE(0x2001, 0x331a), .driver_info = RTL8814A}, /* D-Link - D-Link */\n\t{USB_DEVICE(0x0b05, 0x1817), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */\n\t{USB_DEVICE(0x0b05, 0x1852), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */\n\t{USB_DEVICE(0x0b05, 0x1853), .driver_info = RTL8814A}, /* ASUS - ASUSTeK */\n\t{USB_DEVICE(0x056E, 0x400B), .driver_info = RTL8814A}, /* ELECOM - ELECOM */\n\t{USB_DEVICE(0x056E, 0x400D), .driver_info = RTL8814A}, /* ELECOM - ELECOM */\n\t{USB_DEVICE(0x7392, 0xA833), .driver_info = RTL8814A}, /* Edimax - Edimax */\n\t{USB_DEVICE(0x7392, 0xA834), .driver_info = RTL8814A}, /* Edimax - Edimax */\n\t{USB_DEVICE(0x20f4, 0x809a), .driver_info = RTL8814A}, /* TRENDnet - TRENDnet */\n\t{USB_DEVICE(0x20f4, 0x809b), .driver_info = RTL8814A}, /* TRENDnet TEW-809UB */\n\t{USB_DEVICE(0x2357, 0x0106), .driver_info = RTL8814A}, /* TP-LINK Archer T9UH */\n\t{USB_DEVICE(0x0846, 0x9054), .driver_info = RTL8814A}, /* Netgear A7000 */\n#endif /* CONFIG_RTL8814A */\n\n#ifdef CONFIG_RTL8188F\n\t/*=== Realtek demoboard ===*/\n\t{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xF179, 0xff, 0xff, 0xff), .driver_info = RTL8188F}, /* 8188FU 1*1 */\n#endif\n\n\t{}\t/* Terminating entry */\n};\n\nMODULE_DEVICE_TABLE(usb, rtw_usb_id_tbl);\n\nint const rtw_usb_id_len = sizeof(rtw_usb_id_tbl) / sizeof(struct usb_device_id);\n\nstatic struct specific_device_id specific_device_id_tbl[] = {\n\t{.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8177, .flags=SPEC_DEV_ID_DISABLE_HT},//8188cu 1*1 dongole, (b/g mode only)\n\t{.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x817E, .flags=SPEC_DEV_ID_DISABLE_HT},//8188CE-VAU USB minCard (b/g mode only)\n\t{.idVendor=0x0b05, .idProduct=0x1791, .flags=SPEC_DEV_ID_DISABLE_HT},\n\t{.idVendor=0x13D3, .idProduct=0x3311, .flags=SPEC_DEV_ID_DISABLE_HT},\n\t{.idVendor=0x13D3, .idProduct=0x3359, .flags=SPEC_DEV_ID_DISABLE_HT},//Russian customer -Azwave (8188CE-VAU  g mode)\n#ifdef RTK_DMP_PLATFORM\n\t{.idVendor=USB_VENDER_ID_REALTEK, .idProduct=0x8111, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // Realtek 5G dongle for WiFi Display\n\t{.idVendor=0x2019, .idProduct=0xAB2D, .flags=SPEC_DEV_ID_ASSIGN_IFNAME}, // PCI-Abocom 5G dongle for WiFi Display\n#endif /* RTK_DMP_PLATFORM */\n\t{}\n};\n\nstruct rtw_usb_drv {\n\tstruct usb_driver usbdrv;\n\tint drv_registered;\n\tu8 hw_type;\n};\n\nstruct rtw_usb_drv usb_drv = {\n\t.usbdrv.name =(char*)DRV_NAME,\n\t.usbdrv.probe = rtw_drv_init,\n\t.usbdrv.disconnect = rtw_dev_remove,\n\t.usbdrv.id_table = rtw_usb_id_tbl,\n\t.usbdrv.suspend =  rtw_suspend,\n\t.usbdrv.resume = rtw_resume,\n\t#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 22))\n  \t.usbdrv.reset_resume   = rtw_resume,\n\t#endif\n\t#ifdef CONFIG_AUTOSUSPEND\n\t.usbdrv.supports_autosuspend = 1,\n\t#endif\n\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))\n\t.usbdrv.drvwrap.driver.shutdown = rtw_dev_shutdown,\n\t#else\n\t.usbdrv.driver.shutdown = rtw_dev_shutdown,\n\t#endif\n};\n\nstatic inline int RT_usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)\n{\n\treturn ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);\n}\n\nstatic inline int RT_usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd)\n{\n\treturn ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);\n}\n\nstatic inline int RT_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd)\n{\n\treturn ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT);\n}\n\nstatic inline int RT_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd)\n{\n \treturn ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK);\n}\n\nstatic inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd)\n{\n\treturn (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_in(epd));\n}\n\nstatic inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd)\n{\n\treturn (RT_usb_endpoint_xfer_bulk(epd) && RT_usb_endpoint_dir_out(epd));\n}\n\nstatic inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd)\n{\n\treturn (RT_usb_endpoint_xfer_int(epd) && RT_usb_endpoint_dir_in(epd));\n}\n\nstatic inline int RT_usb_endpoint_num(const struct usb_endpoint_descriptor *epd)\n{\n\treturn epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;\n}\n\nstatic u8 rtw_init_intf_priv(struct dvobj_priv *dvobj)\n{\n\tu8 rst = _SUCCESS;\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_MUTEX\n\t_rtw_mutex_init(&dvobj->usb_vendor_req_mutex);\n\t#endif\n\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC\n\tdvobj->usb_alloc_vendor_req_buf = rtw_zmalloc(MAX_USB_IO_CTL_SIZE);\n\tif (dvobj->usb_alloc_vendor_req_buf == NULL) {\n\t\tDBG_871X(\"alloc usb_vendor_req_buf failed... /n\");\n\t\trst = _FAIL;\n\t\tgoto exit;\n\t}\n\tdvobj->usb_vendor_req_buf  =\n\t\t(u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(dvobj->usb_alloc_vendor_req_buf ), ALIGNMENT_UNIT);\nexit:\n\t#endif\n\n\treturn rst;\n\n}\n\nstatic u8 rtw_deinit_intf_priv(struct dvobj_priv *dvobj)\n{\n\tu8 rst = _SUCCESS;\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC\n\tif(dvobj->usb_vendor_req_buf)\n\t\trtw_mfree(dvobj->usb_alloc_vendor_req_buf, MAX_USB_IO_CTL_SIZE);\n\t#endif\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_MUTEX\n\t_rtw_mutex_free(&dvobj->usb_vendor_req_mutex);\n\t#endif\n\n\treturn rst;\n}\nstatic void rtw_decide_chip_type_by_usb_info(struct dvobj_priv *pdvobjpriv, const struct usb_device_id *pdid)\n{\n\tpdvobjpriv->chip_type = pdid->driver_info;\n\n\t#ifdef CONFIG_RTL8188E\n\tif (pdvobjpriv->chip_type == RTL8188E)\n\t\trtl8188eu_set_hw_type(pdvobjpriv);\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif (pdvobjpriv->chip_type == RTL8812 || pdvobjpriv->chip_type == RTL8821)\n\t\trtl8812au_set_hw_type(pdvobjpriv);\n\t#endif\n\n\t#ifdef CONFIG_RTL8192E\n\tif (pdvobjpriv->chip_type == RTL8192E)\n\t\trtl8192eu_set_hw_type(pdvobjpriv);\n\t#endif\n\n\t#ifdef CONFIG_RTL8723B\n\tif (pdvobjpriv->chip_type == RTL8723B)\n\t\trtl8723bu_set_hw_type(pdvobjpriv);\n\t#endif\n\t\n\t#ifdef CONFIG_RTL8814A\n\tif (pdvobjpriv->chip_type == RTL8814A)\n\t\trtl8814au_set_hw_type(pdvobjpriv);\n\t#endif /* CONFIG_RTL8814A */\n\n\t#ifdef CONFIG_RTL8188F\n\tif (pdvobjpriv->chip_type == RTL8188F)\n\t\trtl8188fu_set_hw_type(pdvobjpriv);\n\t#endif\n\n\t#ifdef CONFIG_RTL8703B\n\tif (pdvobjpriv->chip_type == RTL8703B)\n\t\trtl8703bu_set_hw_type(pdvobjpriv);\n\t#endif /* CONFIG_RTL8703B */\n\n}\n\nstatic struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf, const struct usb_device_id *pdid)\n{\n\tint\ti;\n\tu8\tval8;\n\tint\tstatus = _FAIL;\n\tstruct dvobj_priv *pdvobjpriv;\n\tstruct usb_device_descriptor \t*pdev_desc;\n\tstruct usb_host_config\t\t\t*phost_conf;\n\tstruct usb_config_descriptor\t\t*pconf_desc;\n\tstruct usb_host_interface\t\t*phost_iface;\n\tstruct usb_interface_descriptor\t*piface_desc;\n\tstruct usb_host_endpoint\t\t*phost_endp;\n\tstruct usb_endpoint_descriptor\t*pendp_desc;\n\tstruct usb_device\t\t\t\t*pusbd;\n\n_func_enter_;\n\n\n\tif((pdvobjpriv = devobj_init()) == NULL) {\n\t\tgoto exit;\n\t}\n\n\n\tpdvobjpriv->pusbintf = usb_intf ;\n\tpusbd = pdvobjpriv->pusbdev = interface_to_usbdev(usb_intf);\n\tusb_set_intfdata(usb_intf, pdvobjpriv);\n\n\tpdvobjpriv->RtNumInPipes = 0;\n\tpdvobjpriv->RtNumOutPipes = 0;\n\n\t//padapter->EepromAddressSize = 6;\n\t//pdvobjpriv->nr_endpoint = 6;\n\n\tpdev_desc = &pusbd->descriptor;\n\n#if 0\n\tDBG_871X(\"\\n8712_usb_device_descriptor:\\n\");\n\tDBG_871X(\"bLength=%x\\n\", pdev_desc->bLength);\n\tDBG_871X(\"bDescriptorType=%x\\n\", pdev_desc->bDescriptorType);\n\tDBG_871X(\"bcdUSB=%x\\n\", pdev_desc->bcdUSB);\n\tDBG_871X(\"bDeviceClass=%x\\n\", pdev_desc->bDeviceClass);\n\tDBG_871X(\"bDeviceSubClass=%x\\n\", pdev_desc->bDeviceSubClass);\n\tDBG_871X(\"bDeviceProtocol=%x\\n\", pdev_desc->bDeviceProtocol);\n\tDBG_871X(\"bMaxPacketSize0=%x\\n\", pdev_desc->bMaxPacketSize0);\n\tDBG_871X(\"idVendor=%x\\n\", pdev_desc->idVendor);\n\tDBG_871X(\"idProduct=%x\\n\", pdev_desc->idProduct);\n\tDBG_871X(\"bcdDevice=%x\\n\", pdev_desc->bcdDevice);\n\tDBG_871X(\"iManufacturer=%x\\n\", pdev_desc->iManufacturer);\n\tDBG_871X(\"iProduct=%x\\n\", pdev_desc->iProduct);\n\tDBG_871X(\"iSerialNumber=%x\\n\", pdev_desc->iSerialNumber);\n\tDBG_871X(\"bNumConfigurations=%x\\n\", pdev_desc->bNumConfigurations);\n#endif\n\n\tphost_conf = pusbd->actconfig;\n\tpconf_desc = &phost_conf->desc;\n\n#if 0\n\tDBG_871X(\"\\n8712_usb_configuration_descriptor:\\n\");\n\tDBG_871X(\"bLength=%x\\n\", pconf_desc->bLength);\n\tDBG_871X(\"bDescriptorType=%x\\n\", pconf_desc->bDescriptorType);\n\tDBG_871X(\"wTotalLength=%x\\n\", pconf_desc->wTotalLength);\n\tDBG_871X(\"bNumInterfaces=%x\\n\", pconf_desc->bNumInterfaces);\n\tDBG_871X(\"bConfigurationValue=%x\\n\", pconf_desc->bConfigurationValue);\n\tDBG_871X(\"iConfiguration=%x\\n\", pconf_desc->iConfiguration);\n\tDBG_871X(\"bmAttributes=%x\\n\", pconf_desc->bmAttributes);\n\tDBG_871X(\"bMaxPower=%x\\n\", pconf_desc->bMaxPower);\n#endif\n\n\t//DBG_871X(\"\\n/****** num of altsetting = (%d) ******/\\n\", pusb_interface->num_altsetting);\n\n\tphost_iface = &usb_intf->altsetting[0];\n\tpiface_desc = &phost_iface->desc;\n\n#if 0\n\tDBG_871X(\"\\n8712_usb_interface_descriptor:\\n\");\n\tDBG_871X(\"bLength=%x\\n\", piface_desc->bLength);\n\tDBG_871X(\"bDescriptorType=%x\\n\", piface_desc->bDescriptorType);\n\tDBG_871X(\"bInterfaceNumber=%x\\n\", piface_desc->bInterfaceNumber);\n\tDBG_871X(\"bAlternateSetting=%x\\n\", piface_desc->bAlternateSetting);\n\tDBG_871X(\"bNumEndpoints=%x\\n\", piface_desc->bNumEndpoints);\n\tDBG_871X(\"bInterfaceClass=%x\\n\", piface_desc->bInterfaceClass);\n\tDBG_871X(\"bInterfaceSubClass=%x\\n\", piface_desc->bInterfaceSubClass);\n\tDBG_871X(\"bInterfaceProtocol=%x\\n\", piface_desc->bInterfaceProtocol);\n\tDBG_871X(\"iInterface=%x\\n\", piface_desc->iInterface);\n#endif\n\n\tpdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces;\n\tpdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber;\n\tpdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints;\n\n\t//DBG_871X(\"\\ndump usb_endpoint_descriptor:\\n\");\n\n\tfor (i = 0; i < pdvobjpriv->nr_endpoint; i++)\n\t{\n\t\tphost_endp = phost_iface->endpoint + i;\n\t\tif (phost_endp)\n\t\t{\n\t\t\tpendp_desc = &phost_endp->desc;\n\n\t\t\tDBG_871X(\"\\nusb_endpoint_descriptor(%d):\\n\", i);\n\t\t\tDBG_871X(\"bLength=%x\\n\",pendp_desc->bLength);\n\t\t\tDBG_871X(\"bDescriptorType=%x\\n\",pendp_desc->bDescriptorType);\n\t\t\tDBG_871X(\"bEndpointAddress=%x\\n\",pendp_desc->bEndpointAddress);\n\t\t\t//DBG_871X(\"bmAttributes=%x\\n\",pendp_desc->bmAttributes);\n\t\t\tDBG_871X(\"wMaxPacketSize=%d\\n\",le16_to_cpu(pendp_desc->wMaxPacketSize));\n\t\t\tDBG_871X(\"bInterval=%x\\n\",pendp_desc->bInterval);\n\t\t\t//DBG_871X(\"bRefresh=%x\\n\",pendp_desc->bRefresh);\n\t\t\t//DBG_871X(\"bSynchAddress=%x\\n\",pendp_desc->bSynchAddress);\n\n\t\t\tif (RT_usb_endpoint_is_bulk_in(pendp_desc))\n\t\t\t{\n\t\t\t\tDBG_871X(\"RT_usb_endpoint_is_bulk_in = %x\\n\", RT_usb_endpoint_num(pendp_desc));\n\t\t\t\tpdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = RT_usb_endpoint_num(pendp_desc);\n\t\t\t\tpdvobjpriv->RtNumInPipes++;\n\t\t\t}\n\t\t\telse if (RT_usb_endpoint_is_int_in(pendp_desc))\n\t\t\t{\n\t\t\t\tDBG_871X(\"RT_usb_endpoint_is_int_in = %x, Interval = %x\\n\", RT_usb_endpoint_num(pendp_desc),pendp_desc->bInterval);\n\t\t\t\tpdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = RT_usb_endpoint_num(pendp_desc);\n\t\t\t\tpdvobjpriv->RtNumInPipes++;\n\t\t\t}\n\t\t\telse if (RT_usb_endpoint_is_bulk_out(pendp_desc))\n\t\t\t{\n\t\t\t\tDBG_871X(\"RT_usb_endpoint_is_bulk_out = %x\\n\", RT_usb_endpoint_num(pendp_desc));\n\t\t\t\tpdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] = RT_usb_endpoint_num(pendp_desc);\n\t\t\t\tpdvobjpriv->RtNumOutPipes++;\n\t\t\t}\n\t\t\tpdvobjpriv->ep_num[i] = RT_usb_endpoint_num(pendp_desc);\n\t\t}\n\t}\n\n\tDBG_871X(\"nr_endpoint=%d, in_num=%d, out_num=%d\\n\\n\", pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes);\n\n\tswitch(pusbd->speed) {\n\t\tcase USB_SPEED_LOW:\n\t\t\tDBG_871X(\"USB_SPEED_LOW\\n\");\n\t\t\tpdvobjpriv->usb_speed = RTW_USB_SPEED_1_1;\n\t\t\tbreak;\n\t\tcase USB_SPEED_FULL:\n\t\t\tDBG_871X(\"USB_SPEED_FULL\\n\");\n\t\t\tpdvobjpriv->usb_speed = RTW_USB_SPEED_1_1;\n\t\t\tbreak;\n\t\tcase USB_SPEED_HIGH:\n\t\t\tDBG_871X(\"USB_SPEED_HIGH\\n\");\n\t\t\tpdvobjpriv->usb_speed = RTW_USB_SPEED_2;\n\t\t\tbreak;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))\n\t\tcase USB_SPEED_SUPER:\n\t\t\tDBG_871X(\"USB_SPEED_SUPER\\n\");\n\t\t\tpdvobjpriv->usb_speed = RTW_USB_SPEED_3;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tDBG_871X(\"USB_SPEED_UNKNOWN(%x)\\n\",pusbd->speed);\n\t\t\tpdvobjpriv->usb_speed = RTW_USB_SPEED_UNKNOWN;\n\t\t\tbreak;\n\t}\n\n\tif (pdvobjpriv->usb_speed == RTW_USB_SPEED_UNKNOWN) {\n\t\tDBG_871X(\"UNKNOWN USB SPEED MODE, ERROR !!!\\n\");\n\t\tgoto free_dvobj;\n\t}\n\n\tif (rtw_init_intf_priv(pdvobjpriv) == _FAIL) {\n\t\tRT_TRACE(_module_os_intfs_c_,_drv_err_,(\"\\n Can't INIT rtw_init_intf_priv\\n\"));\n\t\tgoto free_dvobj;\n\t}\n\n\t/*step 1-1., decide the chip_type via driver_info*/\n\tpdvobjpriv->interface_type = RTW_USB;\n\trtw_decide_chip_type_by_usb_info(pdvobjpriv, pdid);\n\n\t//.3 misc\n\t_rtw_init_sema(&(pdvobjpriv->usb_suspend_sema), 0);\n\trtw_reset_continual_io_error(pdvobjpriv);\n\n\tusb_get_dev(pusbd);\n\n\tstatus = _SUCCESS;\n\nfree_dvobj:\n\tif (status != _SUCCESS && pdvobjpriv) {\n\t\tusb_set_intfdata(usb_intf, NULL);\n\t\t\n\t\tdevobj_deinit(pdvobjpriv);\n\t\t\n\t\tpdvobjpriv = NULL;\n\t}\nexit:\n_func_exit_;\n\treturn pdvobjpriv;\n}\n\nstatic void usb_dvobj_deinit(struct usb_interface *usb_intf)\n{\n\tstruct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);\n\n_func_enter_;\n\n\tusb_set_intfdata(usb_intf, NULL);\n\tif (dvobj) {\n\t\t//Modify condition for 92DU DMDP 2010.11.18, by Thomas\n\t\tif ((dvobj->NumInterfaces != 2 && dvobj->NumInterfaces != 3)\n\t\t\t|| (dvobj->InterfaceNumber == 1)) {\n\t\t\tif (interface_to_usbdev(usb_intf)->state != USB_STATE_NOTATTACHED) {\n\t\t\t\t//If we didn't unplug usb dongle and remove/insert modlue, driver fails on sitesurvey for the first time when device is up .\n\t\t\t\t//Reset usb port for sitesurvey fail issue. 2009.8.13, by Thomas\n\t\t\t\tDBG_871X(\"usb attached..., try to reset usb device\\n\");\n\t\t\t\tusb_reset_device(interface_to_usbdev(usb_intf));\n\t\t\t}\n\t\t}\n\n\t\trtw_deinit_intf_priv(dvobj);\n\t\n\t\tdevobj_deinit(dvobj);\t\t\n\t}\n\n\t//DBG_871X(\"%s %d\\n\", __func__, ATOMIC_READ(&usb_intf->dev.kobj.kref.refcount));\n\tusb_put_dev(interface_to_usbdev(usb_intf));\n\n_func_exit_;\n}\n\nstatic int usb_reprobe_to_usb3(PADAPTER Adapter)\n{\n\tstruct registry_priv  *registry_par = &Adapter->registrypriv;\n\tu8 ret = _FALSE;\n\n\trtw_hal_set_hwreg(Adapter, HW_VAR_USB_MODE, &ret);\n\n\treturn ret;\n}\n\nu8 rtw_set_hal_ops(_adapter *padapter)\n{\n\t//alloc memory for HAL DATA\n\tif (rtw_hal_data_init(padapter) == _FAIL)\n\t\treturn _FAIL;\n\n\t#ifdef CONFIG_RTL8188E\n\tif (rtw_get_chip_type(padapter) == RTL8188E)\n\t\trtl8188eu_set_hal_ops(padapter);\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif (rtw_get_chip_type(padapter) == RTL8812 || rtw_get_chip_type(padapter) == RTL8821)\n\t\trtl8812au_set_hal_ops(padapter);\n\t#endif\n\n\t#ifdef CONFIG_RTL8192E\n\tif (rtw_get_chip_type(padapter) == RTL8192E)\n\t\trtl8192eu_set_hal_ops(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8723B\n\tif (rtw_get_chip_type(padapter) == RTL8723B)\n\t\trtl8723bu_set_hal_ops(padapter);\n\t#endif\n\t#ifdef CONFIG_RTL8814A\n\tif (rtw_get_chip_type(padapter) == RTL8814A)\n\t\trtl8814au_set_hal_ops(padapter);\n\t#endif /* CONFIG_RTL8814A */\n\n\t#ifdef CONFIG_RTL8188F\n\tif (rtw_get_chip_type(padapter) == RTL8188F)\n\t\trtl8188fu_set_hal_ops(padapter);\n\t#endif\n\n\t#ifdef CONFIG_RTL8703B\n\tif (rtw_get_chip_type(padapter) == RTL8703B)\n\t\trtl8703bu_set_hal_ops(padapter);\n\t#endif /* CONFIG_RTL8703B */\n\n\tif (_FAIL == rtw_hal_ops_check(padapter) )\n\t\treturn _FAIL;\n\n\treturn _SUCCESS;\n}\n\nvoid usb_set_intf_ops(_adapter *padapter,struct _io_ops *pops)\n{\n\t#ifdef CONFIG_RTL8188E\n\tif (rtw_get_chip_type(padapter) == RTL8188E)\n\t\trtl8188eu_set_intf_ops(pops);\n\t#endif\n\n\t#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)\n\tif (rtw_get_chip_type(padapter) == RTL8812 || rtw_get_chip_type(padapter) == RTL8821)\n\t\trtl8812au_set_intf_ops(pops);\n\t#endif\n\n\t#ifdef CONFIG_RTL8192E\n\tif (rtw_get_chip_type(padapter) == RTL8192E)\n\t\trtl8192eu_set_intf_ops(pops);\n\t#endif\n\n\t#ifdef CONFIG_RTL8723B\n\tif (rtw_get_chip_type(padapter) == RTL8723B)\n\t\trtl8723bu_set_intf_ops(pops);\n\t#endif\n\t\n\t#ifdef CONFIG_RTL8814A\n\tif (rtw_get_chip_type(padapter) == RTL8814A)\n\t\trtl8814au_set_intf_ops(pops);\n\t#endif /* CONFIG_RTL8814A */\n\n\t#ifdef CONFIG_RTL8188F\n\tif (rtw_get_chip_type(padapter) == RTL8188F)\n\t\trtl8188fu_set_intf_ops(pops);\n\t#endif\n\n\t#ifdef CONFIG_RTL8703B\n\tif (rtw_get_chip_type(padapter) == RTL8703B)\n\t\trtl8703bu_set_intf_ops(pops);\n\t#endif /* CONFIG_RTL8703B */\n}\n\n\nstatic void usb_intf_start(_adapter *padapter)\n{\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"+usb_intf_start\\n\"));\n\n\trtw_hal_inirp_init(padapter);\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"-usb_intf_start\\n\"));\n\n}\n\nstatic void usb_intf_stop(_adapter *padapter)\n{\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"+usb_intf_stop\\n\"));\n\n\t//disabel_hw_interrupt\n\tif (!rtw_is_surprise_removed(padapter)) {\n\t\t//device still exists, so driver can do i/o operation\n\t\t//TODO:\n\t\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"SurpriseRemoved==_FALSE\\n\"));\n\t}\n\n\t//cancel in irp\n\trtw_hal_inirp_deinit(padapter);\n\n\t//cancel out irp\n\trtw_write_port_cancel(padapter);\n\n\t//todo:cancel other irps\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"-usb_intf_stop\\n\"));\n\n}\n\nstatic void process_spec_devid(const struct usb_device_id *pdid)\n{\n\tu16 vid, pid;\n\tu32 flags;\n\tint i;\n\tint num = sizeof(specific_device_id_tbl)/sizeof(struct specific_device_id);\n\n\tfor(i=0; i<num; i++)\n\t{\n\t\tvid = specific_device_id_tbl[i].idVendor;\n\t\tpid = specific_device_id_tbl[i].idProduct;\n\t\tflags = specific_device_id_tbl[i].flags;\n\n#ifdef CONFIG_80211N_HT\n\t\tif((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_DISABLE_HT))\n\t\t{\n\t\t\t rtw_ht_enable = 0;\n\t\t\t rtw_bw_mode = 0;\n\t\t\t rtw_ampdu_enable = 0;\n\t\t}\n#endif\n\n#ifdef RTK_DMP_PLATFORM\n\t\t// Change the ifname to wlan10 when PC side WFD dongle plugin on DMP platform.\n\t\t// It is used to distinguish between normal and PC-side wifi dongle/module.\n\t\tif((pdid->idVendor==vid) && (pdid->idProduct==pid) && (flags&SPEC_DEV_ID_ASSIGN_IFNAME))\n\t\t{\n\t\t\textern char* ifname;\n\t\t\tstrncpy(ifname, \"wlan10\", 6);\n\t\t\t//DBG_871X(\"%s()-%d: ifname=%s, vid=%04X, pid=%04X\\n\", __FUNCTION__, __LINE__, ifname, vid, pid);\n\t\t}\n#endif /* RTK_DMP_PLATFORM */\n\n\t}\n}\n\n#ifdef SUPPORT_HW_RFOFF_DETECTED\nint rtw_hw_suspend(_adapter *padapter )\n{\n\tstruct pwrctrl_priv *pwrpriv;\n\tstruct usb_interface *pusb_intf;\n\tstruct net_device *pnetdev;\n\n\t_func_enter_;\n\tif(NULL==padapter)\n\t\tgoto error_exit;\n\n\tif ((_FALSE == padapter->bup) || RTW_CANNOT_RUN(padapter)) {\n\t\tDBG_871X(\"padapter->bup=%d bDriverStopped=%s bSurpriseRemoved = %s\\n\"\n\t\t\t, padapter->bup\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\tgoto error_exit;\n\t}\n\t\n\tpwrpriv = adapter_to_pwrctl(padapter);\n\tpusb_intf = adapter_to_dvobj(padapter)->pusbintf;\n\tpnetdev = padapter->pnetdev;\n\t\n\tLeaveAllPowerSaveMode(padapter);\n\n\tDBG_871X(\"==> rtw_hw_suspend\\n\");\n\t_enter_pwrlock(&pwrpriv->lock);\n\tpwrpriv->bips_processing = _TRUE;\n\t//padapter->net_closed = _TRUE;\n\t//s1.\n\tif(pnetdev)\n\t{\n\t\tnetif_carrier_off(pnetdev);\n\t\trtw_netif_stop_queue(pnetdev);\n\t}\n\n\t//s2.\n\trtw_disassoc_cmd(padapter, 500, _FALSE);\n\n\t//s2-2.  indicate disconnect to os\n\t//rtw_indicate_disconnect(padapter);\n\t{\n\t\tstruct\tmlme_priv *pmlmepriv = &padapter->mlmepriv;\n\t\tif(check_fwstate(pmlmepriv, _FW_LINKED))\n\t\t{\n\t\t\t_clr_fwstate_(pmlmepriv, _FW_LINKED);\n\t\t\trtw_led_control(padapter, LED_CTL_NO_LINK);\n\n\t\t\trtw_os_indicate_disconnect(padapter);\n\n\t\t\t#ifdef CONFIG_LPS\n\t\t\t//donnot enqueue cmd\n\t\t\trtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 0);\n\t\t\t#endif\n\t\t}\n\t}\n\t//s2-3.\n\trtw_free_assoc_resources(padapter, 1);\n\n\t//s2-4.\n\trtw_free_network_queue(padapter,_TRUE);\n\t#ifdef CONFIG_IPS\n\trtw_ips_dev_unload(padapter);\n\t#endif\n\tpwrpriv->rf_pwrstate = rf_off;\n\tpwrpriv->bips_processing = _FALSE;\n\t_exit_pwrlock(&pwrpriv->lock);\n\t\n\t_func_exit_;\n\treturn 0;\n\nerror_exit:\n\tDBG_871X(\"%s, failed \\n\",__FUNCTION__);\n\treturn (-1);\n\n}\n\nint rtw_hw_resume(_adapter *padapter)\n{\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct usb_interface *pusb_intf = adapter_to_dvobj(padapter)->pusbintf;\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\n\t_func_enter_;\t\n\tDBG_871X(\"==> rtw_hw_resume\\n\");\n\t_enter_pwrlock(&pwrpriv->lock);\n\tpwrpriv->bips_processing = _TRUE;\n\trtw_reset_drv_sw(padapter);\n\n\tif(pm_netdev_open(pnetdev,_FALSE) != 0)\n\t{\n\t\t_exit_pwrlock(&pwrpriv->lock);\n\t\tgoto error_exit;\n\t}\n\n\tnetif_device_attach(pnetdev);\n\tnetif_carrier_on(pnetdev);\n\n\trtw_netif_wake_queue(pnetdev);\n\n\tpwrpriv->bkeepfwalive = _FALSE;\n\tpwrpriv->brfoffbyhw = _FALSE;\n\n\tpwrpriv->rf_pwrstate = rf_on;\n\tpwrpriv->bips_processing = _FALSE;\n\t_exit_pwrlock(&pwrpriv->lock);\n\n\t_func_exit_;\n\n\treturn 0;\nerror_exit:\n\tDBG_871X(\"%s, Open net dev failed \\n\",__FUNCTION__);\n\treturn (-1);\n}\n#endif\n\nstatic int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)\n{\n\tstruct dvobj_priv *dvobj;\n\tstruct pwrctrl_priv *pwrpriv;\n\tstruct debug_priv *pdbgpriv;\n\tPADAPTER padapter;\n\tint ret = 0;\n\n\n\tdvobj = usb_get_intfdata(pusb_intf);\n\tpwrpriv = dvobj_to_pwrctl(dvobj);\n\tpdbgpriv = &dvobj->drv_dbg;\n\tpadapter = dvobj->padapters[IFACE_ID0];\n\n\tif (pwrpriv->bInSuspend == _TRUE) {\n\t\tDBG_871X(\"%s bInSuspend = %d\\n\", __FUNCTION__, pwrpriv->bInSuspend);\n\t\tpdbgpriv->dbg_suspend_error_cnt++;\n\t\tgoto exit;\n\t}\n\n\tif ((padapter->bup) || !rtw_is_drv_stopped(padapter) || !rtw_is_surprise_removed(padapter)) {\n#ifdef CONFIG_AUTOSUSPEND\n\t\tif(pwrpriv->bInternalAutoSuspend ){\n\n\t\t\t#ifdef SUPPORT_HW_RFOFF_DETECTED\n\t\t\t// The FW command register update must after MAC and FW init ready.\n\t\t\tif((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect ) && (padapter->registrypriv.usbss_enable ))\n\t\t\t{\n\t\t\t\tu8 bOpen = _TRUE;\n\t\t\t\trtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);\n\t\t\t}\n\t\t\t#endif//SUPPORT_HW_RFOFF_DETECTED\n\t\t}\n#endif//CONFIG_AUTOSUSPEND\n\t}\n\n\tret =  rtw_suspend_common(padapter);\n\nexit:\n\treturn ret;\n}\n\nint rtw_resume_process(_adapter *padapter)\n{\n\tint ret,pm_cnt = 0;\n\tstruct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);\n\tstruct dvobj_priv *pdvobj = padapter->dvobj;\n\tstruct debug_priv *pdbgpriv = &pdvobj->drv_dbg;\n\n\n\tif (pwrpriv->bInSuspend == _FALSE)\n\t{\n\t\tpdbgpriv->dbg_resume_error_cnt++;\n\t\tDBG_871X(\"%s bInSuspend = %d\\n\", __FUNCTION__, pwrpriv->bInSuspend);\n\t\treturn -1;\n\t}\n\n#if defined(CONFIG_BT_COEXIST) && defined(CONFIG_AUTOSUSPEND) //add by amy for 8723as-vau\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))\n\tDBG_871X(\"%s...pm_usage_cnt(%d)  pwrpriv->bAutoResume=%x.  ....\\n\",__func__,atomic_read(&(adapter_to_dvobj(padapter)->pusbintf->pm_usage_cnt)),pwrpriv->bAutoResume);\n\tpm_cnt=atomic_read(&(adapter_to_dvobj(padapter)->pusbintf->pm_usage_cnt));\n#else // kernel < 2.6.32\n\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", adapter_to_dvobj(padapter)->pusbintf->pm_usage_cnt);\n\tpm_cnt = adapter_to_dvobj(padapter)->pusbintf->pm_usage_cnt;\n#endif // kernel < 2.6.32\n\n\tDBG_871X(\"pwrpriv->bAutoResume (%x)\\n\",pwrpriv->bAutoResume );\n\tif( _TRUE == pwrpriv->bAutoResume ){\n\t\tpwrpriv->bInternalAutoSuspend = _FALSE;\n\t\tpwrpriv->bAutoResume=_FALSE;\n\t\tDBG_871X(\"pwrpriv->bAutoResume (%x)  pwrpriv->bInternalAutoSuspend(%x)\\n\",pwrpriv->bAutoResume,pwrpriv->bInternalAutoSuspend );\n\n\t}\n#endif //#ifdef CONFIG_BT_COEXIST &CONFIG_AUTOSUSPEND&\n\n#if defined (CONFIG_WOWLAN) || defined (CONFIG_AP_WOWLAN)\n\t/*\n\t * Due to usb wow suspend flow will cancel read/write port via intf_stop and\n\t * bReadPortCancel and bWritePortCancel are set _TRUE in intf_stop.\n\t * But they will not be clear in intf_start during wow resume flow. \n\t * It should move to os_intf in the feature.\n\t */\n\tRTW_ENABLE_FUNC(padapter, DF_RX_BIT);\n\tRTW_ENABLE_FUNC(padapter, DF_TX_BIT);\n#endif\n\n\tret =  rtw_resume_common(padapter);\n\n\t#ifdef CONFIG_AUTOSUSPEND\n\tif(pwrpriv->bInternalAutoSuspend )\n\t{\n\t\t#ifdef SUPPORT_HW_RFOFF_DETECTED\n\t\t\t// The FW command register update must after MAC and FW init ready.\n\t\tif((padapter->bFWReady) && (pwrpriv->bHWPwrPindetect) && (padapter->registrypriv.usbss_enable ))\n\t\t{\n\t\t\tu8 bOpen = _FALSE;\n\t\t\trtw_interface_ps_func(padapter,HAL_USB_SELECT_SUSPEND,&bOpen);\n\t\t}\t\n\t\t#endif\n\t\t#ifdef CONFIG_BT_COEXIST // for 8723as-vau\n\t\tDBG_871X(\"pwrpriv->bAutoResume (%x)\\n\",pwrpriv->bAutoResume );\n\t\tif( _TRUE == pwrpriv->bAutoResume ){\n\t\tpwrpriv->bInternalAutoSuspend = _FALSE;\n\t\t\tpwrpriv->bAutoResume=_FALSE;\n\t\t\tDBG_871X(\"pwrpriv->bAutoResume (%x)  pwrpriv->bInternalAutoSuspend(%x)\\n\",pwrpriv->bAutoResume,pwrpriv->bInternalAutoSuspend );\n\t\t}\n\n\t\t#else\t//#ifdef CONFIG_BT_COEXIST\n\t\tpwrpriv->bInternalAutoSuspend = _FALSE;\n\t\t#endif\t//#ifdef CONFIG_BT_COEXIST\n\t\tpwrpriv->brfoffbyhw = _FALSE;\n\t}\n\t#endif//CONFIG_AUTOSUSPEND\n\n\n\treturn ret;\n}\n\nstatic int rtw_resume(struct usb_interface *pusb_intf)\n{\n\tstruct dvobj_priv *dvobj;\n\tstruct pwrctrl_priv *pwrpriv;\n\tstruct debug_priv *pdbgpriv;\n\tPADAPTER padapter;\n\tstruct mlme_ext_priv *pmlmeext;\n\tint ret = 0;\n\n\n\tdvobj = usb_get_intfdata(pusb_intf);\n\tpwrpriv = dvobj_to_pwrctl(dvobj);\n\tpdbgpriv = &dvobj->drv_dbg;\n\tpadapter = dvobj->padapters[IFACE_ID0];\n\tpmlmeext = &padapter->mlmeextpriv;\n\n\tDBG_871X(\"==> %s (%s:%d)\\n\", __FUNCTION__, current->comm, current->pid);\n\tpdbgpriv->dbg_resume_cnt++;\n\n\tif(pwrpriv->bInternalAutoSuspend)\n\t{\n \t\tret = rtw_resume_process(padapter);\n\t}\n\telse\n\t{\n\t\tif(pwrpriv->wowlan_mode || pwrpriv->wowlan_ap_mode)\n\t\t{\n\t\t\trtw_resume_lock_suspend();\t\t\t\n\t\t\tret = rtw_resume_process(padapter);\n\t\t\trtw_resume_unlock_suspend();\n\t\t}\n\t\telse\n\t\t{\n#ifdef CONFIG_RESUME_IN_WORKQUEUE\n\t\t\trtw_resume_in_workqueue(pwrpriv);\n#else\t\t\t\n\t\t\tif (rtw_is_earlysuspend_registered(pwrpriv))\n\t\t\t{\n\t\t\t\t/* jeff: bypass resume here, do in late_resume */\n\t\t\t\trtw_set_do_late_resume(pwrpriv, _TRUE);\n\t\t\t}\t\n\t\t\telse\n\t\t\t{\n\t\t\t\trtw_resume_lock_suspend();\t\t\t\n\t\t\t\tret = rtw_resume_process(padapter);\n\t\t\t\trtw_resume_unlock_suspend();\n\t\t\t}\n#endif\n\t\t}\n\t}\n\n\tpmlmeext->last_scan_time = rtw_get_current_time();\n\tDBG_871X(\"<========  %s return %d\\n\", __FUNCTION__, ret);\n\n\treturn ret;\n}\n\n\n\n#ifdef CONFIG_AUTOSUSPEND\nvoid autosuspend_enter(_adapter* padapter)\n{\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);\n\n\tDBG_871X(\"==>autosuspend_enter...........\\n\");\n\n\tpwrpriv->bInternalAutoSuspend = _TRUE;\n\tpwrpriv->bips_processing = _TRUE;\n\n\tif(rf_off == pwrpriv->change_rfpwrstate )\n\t{\n#ifndef\tCONFIG_BT_COEXIST\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\tusb_enable_autosuspend(dvobj->pusbdev);\n\t\t#else\n\t\tdvobj->pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user\n\t\t#endif\n\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tusb_autopm_put_interface(dvobj->pusbintf);\n\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\n\t\t\tusb_autopm_enable(dvobj->pusbintf);\n\t\t#else\n\t\t\tusb_autosuspend_device(dvobj->pusbdev, 1);\n\t\t#endif\n#else\t//#ifndef\tCONFIG_BT_COEXIST\n\t\tif(1==pwrpriv->autopm_cnt){\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\tusb_enable_autosuspend(dvobj->pusbdev);\n\t\t#else\n\t\tdvobj->pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user\n\t\t#endif\n\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tusb_autopm_put_interface(dvobj->pusbintf);\n\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\n\t\t\tusb_autopm_enable(dvobj->pusbintf);\n\t\t#else\n\t\t\tusb_autosuspend_device(dvobj->pusbdev, 1);\n\t\t#endif\n\t\t\tpwrpriv->autopm_cnt --;\n\t\t}\n\t\telse\n\t\tDBG_871X(\"0!=pwrpriv->autopm_cnt[%d]   didn't usb_autopm_put_interface\\n\", pwrpriv->autopm_cnt);\n\n#endif\t//#ifndef\tCONFIG_BT_COEXIST\n\t}\n\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))\n\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));\n\t#else\n\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", dvobj->pusbintf->pm_usage_cnt);\n\t#endif\n\n}\n\nint autoresume_enter(_adapter* padapter)\n{\n\tint result = _SUCCESS;\n\tstruct security_priv* psecuritypriv=&(padapter->securitypriv);\n\tstruct mlme_ext_priv\t*pmlmeext = &padapter->mlmeextpriv;\n\tstruct mlme_ext_info\t*pmlmeinfo = &(pmlmeext->mlmext_info);\n\tstruct dvobj_priv *dvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(dvobj);\n\n\tDBG_871X(\"====> autoresume_enter \\n\");\n\n\tif(rf_off == pwrpriv->rf_pwrstate )\n\t{\n\t\tpwrpriv->ps_flag = _FALSE;\n#ifndef\tCONFIG_BT_COEXIST\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tif (usb_autopm_get_interface(dvobj->pusbintf) < 0)\n\t\t\t{\n\t\t\t\tDBG_871X( \"can't get autopm: %d\\n\", result);\n\t\t\t\tresult = _FAIL;\n\t\t\t\tgoto error_exit;\n\t\t\t}\n\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\n\t\t\tusb_autopm_disable(dvobj->pusbintf);\n\t\t#else\n\t\t\tusb_autoresume_device(dvobj->pusbdev, 1);\n\t\t#endif\n\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))\n\t\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));\n\t\t#else\n\t\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", dvobj->pusbintf->pm_usage_cnt);\n\t\t#endif\n#else\t//#ifndef\tCONFIG_BT_COEXIST\n\t\tpwrpriv->bAutoResume=_TRUE;\n\t\tif(0==pwrpriv->autopm_cnt){\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tif (usb_autopm_get_interface(dvobj->pusbintf) < 0)\n\t\t\t{\n\t\t\t\tDBG_871X( \"can't get autopm: %d\\n\", result);\n\t\t\t\tresult = _FAIL;\n\t\t\t\tgoto error_exit;\n\t\t\t}\n\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\n\t\t\tusb_autopm_disable(dvobj->pusbintf);\n\t\t#else\n\t\t\tusb_autoresume_device(dvobj->pusbdev, 1);\n\t\t#endif\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))\n\t\t\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", atomic_read(&(dvobj->pusbintf->pm_usage_cnt)));\n\t\t#else\n\t\t\tDBG_871X(\"...pm_usage_cnt(%d).....\\n\", dvobj->pusbintf->pm_usage_cnt);\n\t\t#endif\n\t\t\tpwrpriv->autopm_cnt++;\n\t\t}\n\t\telse\n\t\t\tDBG_871X(\"0!=pwrpriv->autopm_cnt[%d]   didn't usb_autopm_get_interface\\n\",pwrpriv->autopm_cnt);\n#endif //#ifndef\tCONFIG_BT_COEXIST\n\t}\n\tDBG_871X(\"<==== autoresume_enter \\n\");\nerror_exit:\n\n\treturn result;\n}\n#endif\n\n#ifdef CONFIG_PLATFORM_RTD2880B\nextern void rtd2885_wlan_netlink_sendMsg(char *action_string, char *name);\n#endif\n\n/*\n * drv_init() - a device potentially for us\n *\n * notes: drv_init() is called when the bus driver has located a card for us to support.\n *        We accept the new device by returning 0.\n*/\n\n_adapter  *rtw_sw_export = NULL;\n\n_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,\n\tstruct usb_interface *pusb_intf)\n{\n\t_adapter *padapter = NULL;\n\tint status = _FAIL;\n\n\tpadapter = (_adapter *)rtw_zvmalloc(sizeof(*padapter));\n\tif (padapter == NULL)\n\t\tgoto exit;\n\n\tif (loadparam(padapter) != _SUCCESS)\n\t\tgoto free_adapter;\n\n\tpadapter->dvobj = dvobj;\n\n\n\trtw_set_drv_stopped(padapter);/*init*/\n\n\tdvobj->padapters[dvobj->iface_nums++] = padapter;\n\tpadapter->iface_id = IFACE_ID0;\n\n#if defined(CONFIG_CONCURRENT_MODE) \n\t//set adapter_type/iface type for primary padapter\n\tpadapter->isprimary = _TRUE;\n\tpadapter->adapter_type = PRIMARY_ADAPTER;\n\t#ifndef CONFIG_HWPORT_SWAP\n\tpadapter->iface_type = IFACE_PORT0;\n\t#else\n\tpadapter->iface_type = IFACE_PORT1;\n\t#endif\n#endif\n\n\t//step 2. hook HalFunc, allocate HalData\n\t//hal_set_hal_ops(padapter);\n\tif(rtw_set_hal_ops(padapter) ==_FAIL) \n\t\tgoto free_hal_data;\n\t\n\n\tpadapter->intf_start=&usb_intf_start;\n\tpadapter->intf_stop=&usb_intf_stop;\n\n\t//step init_io_priv\n\tif( rtw_init_io_priv(padapter,usb_set_intf_ops) ==_FAIL)\n\t\tgoto free_hal_data;\n\n\t//step read_chip_version\n\trtw_hal_read_chip_version(padapter);\n\n\t//step usb endpoint mapping\n\trtw_hal_chip_configure(padapter);\n\n#ifdef CONFIG_BT_COEXIST\n\trtw_btcoex_Initialize(padapter);\n#endif // CONFIG_BT_COEXIST\n\n\t//step read efuse/eeprom data and get mac_addr\n\trtw_hal_read_chip_info(padapter);\n\n\t//step 5.\n\tif(rtw_init_drv_sw(padapter) ==_FAIL) {\n\t\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"Initialize driver software resource Failed!\\n\"));\n\t\tgoto free_hal_data;\n\t}\n\n#ifdef CONFIG_PM\n#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))\n\tif(dvobj_to_pwrctl(dvobj)->bSupportRemoteWakeup)\n\t{\n\t\tdvobj->pusbdev->do_remote_wakeup=1;\n\t\tpusb_intf->needs_remote_wakeup = 1;\n\t\tdevice_init_wakeup(&pusb_intf->dev, 1);\n\t\tDBG_871X(\"pwrctrlpriv.bSupportRemoteWakeup~~~~~~\\n\");\n\t\tDBG_871X(\"pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\\n\",device_may_wakeup(&pusb_intf->dev));\n\t}\n#endif\n#endif\n\n#ifdef CONFIG_AUTOSUSPEND\n\tif( padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE )\n\t{\n\t\tif(padapter->registrypriv.usbss_enable ){ \t/* autosuspend (2s delay) */\n\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,38))\n\t\t\tdvobj->pusbdev->dev.power.autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time\n\t\t\t#else\n\t\t\tdvobj->pusbdev->autosuspend_delay = 0 * HZ;//15 * HZ; idle-delay time\n\t\t\t#endif\n\n\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\t\t\tusb_enable_autosuspend(dvobj->pusbdev);\n\t\t\t#elif  (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,22) && LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,34))\n\t\t\tpadapter->bDisableAutosuspend = dvobj->pusbdev->autosuspend_disabled ;\n\t\t\tdvobj->pusbdev->autosuspend_disabled = 0;//autosuspend disabled by the user\n\t\t\t#endif\n\n\t\t\t//usb_autopm_get_interface(adapter_to_dvobj(padapter)->pusbintf );//init pm_usage_cnt ,let it start from 1\n\n\t\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,32))\n\t\t\tDBG_871X(\"%s...pm_usage_cnt(%d).....\\n\",__FUNCTION__,atomic_read(&(dvobj->pusbintf ->pm_usage_cnt)));\n\t\t\t#else\n\t\t\tDBG_871X(\"%s...pm_usage_cnt(%d).....\\n\",__FUNCTION__,dvobj->pusbintf ->pm_usage_cnt);\n\t\t\t#endif\n\t\t}\n\t}\n#endif\n\t//2012-07-11 Move here to prevent the 8723AS-VAU BT auto suspend influence\n\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tif (usb_autopm_get_interface(pusb_intf) < 0)\n\t\t\t\t{\n\t\t\t\t\tDBG_871X( \"can't get autopm: \\n\");\n\t\t\t\t}\n\t#endif\n#ifdef\tCONFIG_BT_COEXIST\n\tdvobj_to_pwrctl(dvobj)->autopm_cnt=1;\n#endif\n\n\t// set mac addr\n\trtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter));\n#ifdef CONFIG_P2P\t\n\trtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter));\n#endif // CONFIG_P2P\n\tDBG_871X(\"bDriverStopped:%s, bSurpriseRemoved:%s, bup:%d, hw_init_completed:%d\\n\"\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t, padapter->bup\n\t\t, rtw_get_hw_init_completed(padapter)\n\t);\n\n\tstatus = _SUCCESS;\n\nfree_hal_data:\n\tif (status != _SUCCESS && padapter->HalData)\n\t\trtw_hal_free_data(padapter);\nfree_adapter:\n\tif (status != _SUCCESS && padapter) {\n\t\trtw_vmfree((u8 *)padapter, sizeof(*padapter));\n\t\tpadapter = NULL;\n\t}\nexit:\n\treturn padapter;\n}\n\nstatic void rtw_usb_if1_deinit(_adapter *if1)\n{\n\tstruct pwrctrl_priv *pwrctl = adapter_to_pwrctl(if1);\n\tstruct mlme_priv *pmlmepriv= &if1->mlmepriv;\n\n\tif(check_fwstate(pmlmepriv, _FW_LINKED))\n\t\trtw_disassoc_cmd(if1, 0, _FALSE);\n\n\n#ifdef CONFIG_AP_MODE\n\tfree_mlme_ap_info(if1);\n\t#ifdef CONFIG_HOSTAPD_MLME\n\thostapd_mode_unload(if1);\n\t#endif\n#endif\n\n#ifdef CONFIG_WOWLAN\n\tpwrctl->wowlan_mode=_FALSE;\n#endif //CONFIG_WOWLAN\n\n\trtw_dev_unload(if1);\n\n\tDBG_871X(\"+r871xu_dev_remove, hw_init_completed=%d\\n\", rtw_get_hw_init_completed(if1));\n\n#ifdef CONFIG_BT_COEXIST\n\tif(1 == pwrctl->autopm_cnt){\n\t\t#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,33))\n\t\t\tusb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf);\n\t\t#elif (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,20))\n\t\t\tusb_autopm_enable(adapter_to_dvobj(if1)->pusbintf);\n\t\t#else\n\t\t\tusb_autosuspend_device(adapter_to_dvobj(if1)->pusbdev, 1);\n\t\t#endif\n\t\tpwrctl->autopm_cnt --;\n\t}\n#endif\n\n\trtw_free_drv_sw(if1);\n\n\t/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */\n\trtw_os_ndev_free(if1);\n\n\trtw_vmfree((u8 *)if1, sizeof(_adapter));\n\n#ifdef CONFIG_PLATFORM_RTD2880B\n\tDBG_871X(\"wlan link down\\n\");\n\trtd2885_wlan_netlink_sendMsg(\"linkdown\", \"8712\");\n#endif\n\n}\n\nstatic int rtw_drv_init(struct usb_interface *pusb_intf, const struct usb_device_id *pdid)\n{\n\t_adapter *if1 = NULL, *if2 = NULL;\n\tint status = _FAIL;\n\tstruct dvobj_priv *dvobj;\n#ifdef CONFIG_MULTI_VIR_IFACES\n\tint i;\n#endif //CONFIG_MULTI_VIR_IFACES\n\n\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"+rtw_drv_init\\n\"));\n\t//DBG_871X(\"+rtw_drv_init\\n\");\n\n\t//step 0.\n\tprocess_spec_devid(pdid);\n\n\t/* Initialize dvobj_priv */\n\tif ((dvobj = usb_dvobj_init(pusb_intf, pdid)) == NULL) {\n\t\tRT_TRACE(_module_hci_intfs_c_, _drv_err_, (\"initialize device object priv Failed!\\n\"));\n\t\tgoto exit;\n\t}\n\n\tif ((if1 = rtw_usb_if1_init(dvobj, pusb_intf)) == NULL) {\n\t\tDBG_871X(\"rtw_usb_if1_init Failed!\\n\");\n\t\tgoto free_dvobj;\n\t}\n\t\n\tif (usb_reprobe_to_usb3(if1) == _TRUE)\n\t\tgoto free_if1;\n\t\n#ifdef CONFIG_CONCURRENT_MODE\n\tif((if2 = rtw_drv_if2_init(if1, usb_set_intf_ops)) == NULL) {\n\t\tgoto free_if1;\n\t}\n#ifdef CONFIG_MULTI_VIR_IFACES\n\tfor(i=0; i<if1->registrypriv.ext_iface_num;i++)\n\t{\n\t\tif(rtw_drv_add_vir_if(if1, usb_set_intf_ops) == NULL)\n\t\t{\n\t\t\tDBG_871X(\"rtw_drv_add_iface failed! (%d)\\n\", i);\n\t\t\tgoto free_if2;\n\t\t}\n\t}\n#endif //CONFIG_MULTI_VIR_IFACES\n#endif\n\n#ifdef CONFIG_INTEL_PROXIM\n\trtw_sw_export=if1;\n#endif\n\n#ifdef CONFIG_GLOBAL_UI_PID\n\tif(ui_pid[1]!=0) {\n\t\tDBG_871X(\"ui_pid[1]:%d\\n\",ui_pid[1]);\n\t\trtw_signal_process(ui_pid[1], SIGUSR2);\n\t}\n#endif\n\n\t//dev_alloc_name && register_netdev\n\tif (rtw_os_ndevs_init(dvobj) != _SUCCESS)\n\t\tgoto free_if2;\n\n#ifdef CONFIG_HOSTAPD_MLME\n\thostapd_mode_init(if1);\n#endif\n\n#ifdef CONFIG_PLATFORM_RTD2880B\n\tDBG_871X(\"wlan link up\\n\");\n\trtd2885_wlan_netlink_sendMsg(\"linkup\", \"8712\");\n#endif\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"-871x_drv - drv_init, success!\\n\"));\n\n\tstatus = _SUCCESS;\n\n#if 0 /* not used now */\nos_ndevs_deinit:\n\tif (status != _SUCCESS)\n\t\trtw_os_ndevs_deinit(dvobj);\n#endif\nfree_if2:\n\tif(status != _SUCCESS && if2) {\n\t\t#ifdef CONFIG_CONCURRENT_MODE\n\t\trtw_drv_if2_stop(if2);\n\t\trtw_drv_if2_free(if2);\n\t\t#endif\n\t}\nfree_if1:\n\tif (status != _SUCCESS && if1) {\n\t\trtw_usb_if1_deinit(if1);\n\t}\nfree_dvobj:\n\tif (status != _SUCCESS)\n\t\tusb_dvobj_deinit(pusb_intf);\nexit:\n\treturn status == _SUCCESS?0:-ENODEV;\n}\n\n/*\n * dev_remove() - our device is being removed\n*/\n//rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both\nstatic void rtw_dev_remove(struct usb_interface *pusb_intf)\n{\n\tstruct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(dvobj);\n\t_adapter *padapter = dvobj->padapters[IFACE_ID0];\n\tstruct net_device *pnetdev = padapter->pnetdev;\n\tstruct mlme_priv *pmlmepriv= &padapter->mlmepriv;\n\n_func_enter_;\n\n\tDBG_871X(\"+rtw_dev_remove\\n\");\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"+dev_remove()\\n\"));\n\n\tdvobj->processing_dev_remove = _TRUE;\n\n\t/* TODO: use rtw_os_ndevs_deinit instead at the first stage of driver's dev deinit function */\n\trtw_os_ndevs_unregister(dvobj);\n\n\tif(usb_drv.drv_registered == _TRUE)\n\t{\n\t\t//DBG_871X(\"r871xu_dev_remove():padapter->bSurpriseRemoved == _TRUE\\n\");\n\t\trtw_set_surprise_removed(padapter);\n\t}\n\t/*else\n\t{\n\t\t//DBG_871X(\"r871xu_dev_remove():module removed\\n\");\n\t\tpadapter->HalData->hw_init_completed = _FALSE;\n\t}*/\n\n\n#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)\n\trtw_unregister_early_suspend(pwrctl);\n#endif\n\n\tif (padapter->bFWReady == _TRUE) {\n\t\trtw_pm_set_ips(padapter, IPS_NONE);\n\t\trtw_pm_set_lps(padapter, PS_MODE_ACTIVE);\n\n\t\tLeaveAllPowerSaveMode(padapter);\n\t}\n\trtw_set_drv_stopped(padapter);\t/*for stop thread*/\n\n\t/* stop cmd thread */\n\trtw_stop_cmd_thread(padapter);\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_MULTI_VIR_IFACES\n\trtw_drv_stop_vir_ifaces(dvobj);\n#endif //CONFIG_MULTI_VIR_IFACES\n\trtw_drv_if2_stop(dvobj->padapters[IFACE_ID1]);\n#endif //CONFIG_CONCURRENT_MODE\n\n\t#ifdef CONFIG_BT_COEXIST\n\trtw_btcoex_HaltNotify(padapter);\n\t#endif\n\n\trtw_usb_if1_deinit(padapter);\n\n#ifdef CONFIG_CONCURRENT_MODE\n#ifdef CONFIG_MULTI_VIR_IFACES\n\trtw_drv_free_vir_ifaces(dvobj);\n#endif //CONFIG_MULTI_VIR_IFACES\n\trtw_drv_if2_free(dvobj->padapters[IFACE_ID1]);\n#endif //CONFIG_CONCURRENT_MODE\n\n\tusb_dvobj_deinit(pusb_intf);\n\n\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"-dev_remove()\\n\"));\n\tDBG_871X(\"-r871xu_dev_remove, done\\n\");\n\n\n#ifdef CONFIG_INTEL_PROXIM\n\trtw_sw_export=NULL;\n#endif\n\n_func_exit_;\n\n\treturn;\n\n}\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))\nextern int console_suspend_enabled;\n#endif\n\nstatic int __init rtw_drv_entry(void)\n{\n\tint ret = 0;\n\n\tDBG_871X_LEVEL(_drv_always_, \"module init start\\n\");\n\tdump_drv_version(RTW_DBGDUMP);\n#ifdef BTCOEXVERSION\n\tDBG_871X_LEVEL(_drv_always_, DRV_NAME\" BT-Coex version = %s\\n\", BTCOEXVERSION);\n#endif // BTCOEXVERSION\n\n\tret = platform_wifi_power_on();\n\tif(ret != 0)\n\t{\n\t\tDBG_871X(\"%s: power on failed!!(%d)\\n\", __FUNCTION__, ret);\n\t\tret = -1;\n\t\tgoto exit;\n\t}\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))\n\t//console_suspend_enabled=0;\n#endif\n\n\tusb_drv.drv_registered = _TRUE;\n\trtw_suspend_lock_init();\n\trtw_drv_proc_init();\n\trtw_ndev_notifier_register();\n\n\tret = usb_register(&usb_drv.usbdrv);\n\n\tif (ret != 0) {\n\t\tusb_drv.drv_registered = _FALSE;\n\t\trtw_suspend_lock_uninit();\n\t\trtw_drv_proc_deinit();\n\t\trtw_ndev_notifier_unregister();\n\t\tgoto exit;\n\t}\n\nexit:\n\tDBG_871X_LEVEL(_drv_always_, \"module init ret=%d\\n\", ret);\n\treturn ret;\n}\n\nstatic void __exit rtw_drv_halt(void)\n{\n\tDBG_871X_LEVEL(_drv_always_, \"module exit start\\n\");\n\n\tusb_drv.drv_registered = _FALSE;\n\n\tusb_deregister(&usb_drv.usbdrv);\n\n\tplatform_wifi_power_off();\n\n\trtw_suspend_lock_uninit();\n\trtw_drv_proc_deinit();\n\trtw_ndev_notifier_unregister();\n\n\tDBG_871X_LEVEL(_drv_always_, \"module exit success\\n\");\n\n\trtw_mstat_dump(RTW_DBGDUMP);\n}\n\n\nmodule_init(rtw_drv_entry);\nmodule_exit(rtw_drv_halt);\n\n#ifdef CONFIG_INTEL_PROXIM\n_adapter  *rtw_usb_get_sw_pointer(void)\n{\n\treturn rtw_sw_export;\n}\nEXPORT_SYMBOL(rtw_usb_get_sw_pointer);\n#endif\t//CONFIG_INTEL_PROXIM\n\n"
  },
  {
    "path": "os_dep/linux/usb_ops_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *******************************************************************************/\n#define _USB_OPS_LINUX_C_\n\n#include <drv_types.h>\n#include <hal_data.h>\n#include <rtw_sreset.h>\n\nstruct rtw_async_write_data {\n\tu8 data[VENDOR_CMD_MAX_DATA_LEN];\n\tstruct usb_ctrlrequest dr;\n};\n\t\nint usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)\n{\n\t_adapter\t*padapter = pintfhdl->padapter;\n\tstruct dvobj_priv  *pdvobjpriv = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobjpriv);\n\tstruct usb_device *udev=pdvobjpriv->pusbdev;\n\n\tunsigned int pipe;\n\tint status = 0;\n\tu32 tmp_buflen=0;\n\tu8 reqtype;\n\tu8 *pIo_buf;\n\tint vendorreq_times = 0;\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE\n\tu8 *tmp_buf;\n\t#else // use stack memory\n\tu8 tmp_buf[MAX_USB_IO_CTL_SIZE];\n\t#endif\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->adapter_type > PRIMARY_ADAPTER)\n\t{\n\t\tpadapter = padapter->pbuddy_adapter;\n\t\tpdvobjpriv = adapter_to_dvobj(padapter);\n\t\tudev = pdvobjpriv->pusbdev;\n\t}\n#endif\n\n\t//DBG_871X(\"%s %s:%d\\n\",__FUNCTION__, current->comm, current->pid);\n\n\tif (RTW_CANNOT_IO(padapter)){\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usbctrl_vendorreq:(RTW_CANNOT_IO)!!!\\n\"));\n\t\tstatus = -EPERM; \n\t\tgoto exit;\n\t}\t\n\n\tif(len>MAX_VENDOR_REQ_CMD_SIZE){\n\t\tDBG_8192C( \"[%s] Buffer len error ,vendor request failed\\n\", __FUNCTION__ );\n\t\tstatus = -EINVAL;\n\t\tgoto exit;\n\t}\t\n\n\t#ifdef CONFIG_USB_VENDOR_REQ_MUTEX\n\t_enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);\n\t#endif\t\n\n\t\n\t// Acquire IO memory for vendorreq\n#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC\n\tpIo_buf = pdvobjpriv->usb_vendor_req_buf;\n#else\n\t#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE\n\ttmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT);\n\ttmp_buflen =  (u32)len + ALIGNMENT_UNIT;\n\t#else // use stack memory\n\ttmp_buflen = MAX_USB_IO_CTL_SIZE;\n\t#endif\n\n\t// Added by Albert 2010/02/09\n\t// For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment.\n\t// Trying to fix it here.\n\tpIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f );\t\n#endif\n\n\tif ( pIo_buf== NULL) {\n\t\tDBG_8192C( \"[%s] pIo_buf == NULL \\n\", __FUNCTION__ );\n\t\tstatus = -ENOMEM;\n\t\tgoto release_mutex;\n\t}\n\t\n\twhile(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES)\n\t{\n\t\t_rtw_memset(pIo_buf, 0, len);\n\t\t\n\t\tif (requesttype == 0x01)\n\t\t{\n\t\t\tpipe = usb_rcvctrlpipe(udev, 0);//read_in\n\t\t\treqtype =  REALTEK_USB_VENQT_READ;\t\t\n\t\t} \n\t\telse \n\t\t{\n\t\t\tpipe = usb_sndctrlpipe(udev, 0);//write_out\n\t\t\treqtype =  REALTEK_USB_VENQT_WRITE;\t\t\n\t\t\t_rtw_memcpy( pIo_buf, pdata, len);\n\t\t}\t\t\n\t\n\t\tstatus = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT);\n\t\t\n\t\tif ( status == len)   // Success this control transfer.\n\t\t{\n\t\t\trtw_reset_continual_io_error(pdvobjpriv);\n\t\t\tif ( requesttype == 0x01 )\n\t\t\t{   // For Control read transfer, we have to copy the read data from pIo_buf to pdata.\n\t\t\t\t_rtw_memcpy( pdata, pIo_buf,  len );\n\t\t\t}\n\t\t}\n\t\telse { // error cases\n\t\t\tDBG_8192C(\"reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\\n\"\n\t\t\t\t, value,(requesttype == 0x01)?\"read\":\"write\" , len, status, *(u32*)pdata, vendorreq_times);\n\t\t\t\n\t\t\tif (status < 0) {\n\t\t\t\tif(status == (-ESHUTDOWN)\t|| status == -ENODEV\t)\n\t\t\t\t{\t\t\t\n\t\t\t\t\trtw_set_surprise_removed(padapter);\n\t\t\t\t} else {\n\t\t\t\t\t#ifdef DBG_CONFIG_ERROR_DETECT\n\t\t\t\t\t{\n\t\t\t\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\t\t\t\tpHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL;\n\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t}\n\t\t\telse // status != len && status >= 0\n\t\t\t{\n\t\t\t\tif(status > 0) {\n\t\t\t\t\tif ( requesttype == 0x01 )\n\t\t\t\t\t{   // For Control read transfer, we have to copy the read data from pIo_buf to pdata.\n\t\t\t\t\t\t_rtw_memcpy( pdata, pIo_buf,  len );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(rtw_inc_and_chk_continual_io_error(pdvobjpriv) == _TRUE ){\n\t\t\t\trtw_set_surprise_removed(padapter);\n\t\t\t\tbreak;\n\t\t\t}\n\t\n\t\t}\n\t\n\t\t// firmware download is checksumed, don't retry\n\t\tif( (value >= FW_START_ADDRESS ) || status == len )\n\t\t\tbreak;\n\t\n\t}\n\n\t// release IO memory used by vendorreq\n\t#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE\n\trtw_mfree(tmp_buf, tmp_buflen);\n\t#endif\n\nrelease_mutex:\n\t#ifdef CONFIG_USB_VENDOR_REQ_MUTEX\n\t_exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);\n\t#endif\nexit:\n\treturn status;\n\n}\n\n#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ\nstatic void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs)\n{\n\tif (urb) {\n\t\tif (urb->context) {\n\t\t\trtw_mfree(urb->context, sizeof(struct rtw_async_write_data));\n\t\t}\n\t\tusb_free_urb(urb);\n\t}\n}\n\nint _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,\n\tu16 value, u16 index, void *pdata, u16 len, u8 requesttype)\n{\n\tint rc;\n\tunsigned int pipe;\n\tu8 reqtype;\n\tstruct usb_ctrlrequest *dr;\n\tstruct urb *urb;\n\tstruct rtw_async_write_data *buf;\n\n\n\tif (requesttype == VENDOR_READ) {\n\t\tpipe = usb_rcvctrlpipe(udev, 0);//read_in\n\t\treqtype =  REALTEK_USB_VENQT_READ;\n\t}\n\telse {\n\t\tpipe = usb_sndctrlpipe(udev, 0);//write_out\n\t\treqtype =  REALTEK_USB_VENQT_WRITE;\n\t}\n\t\n\tbuf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf));\n\tif (!buf) {\n\t\trc = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\turb = usb_alloc_urb(0, GFP_ATOMIC);\n\tif (!urb) {\n\t\trtw_mfree((u8*)buf, sizeof(*buf));\n\t\trc = -ENOMEM;\n\t\tgoto exit;\n\t}\n\n\tdr = &buf->dr;\n\n\tdr->bRequestType = reqtype;\n\tdr->bRequest = request;\n\tdr->wValue = cpu_to_le16(value);\n\tdr->wIndex = cpu_to_le16(index);\n\tdr->wLength = cpu_to_le16(len);\n\n\t_rtw_memcpy(buf, pdata, len);\n\n\tusb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len,\n\t\t_usbctrl_vendorreq_async_callback, buf);\n\n\trc = usb_submit_urb(urb, GFP_ATOMIC);\n\tif (rc < 0) {\n\t\trtw_mfree((u8*)buf, sizeof(*buf));\n\t\tusb_free_urb(urb);\n\t}\n\nexit:\n\treturn rc;\n}\n\n\n#endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */\n\nunsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)\n{\n\tunsigned int pipe=0, ep_num=0;\n\tstruct usb_device *pusbd = pdvobj->pusbdev;\t\n\n\tif (addr == RECV_BULK_IN_ADDR) {\t\n\t\tpipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]);\n\t\t\n\t} else if (addr == RECV_INT_IN_ADDR) {\t\n\t\tpipe=usb_rcvintpipe(pusbd, pdvobj->RtInPipe[1]);\n\t\t\n\t} else if (addr < HW_QUEUE_ENTRY) {\n\t\tep_num = pdvobj->Queue2Pipe[addr];\n\t\tpipe = usb_sndbulkpipe(pusbd, ep_num);\n\t}\n\n\treturn pipe;\n}\n\nstruct zero_bulkout_context{\n\tvoid *pbuf;\n\tvoid *purb;\n\tvoid *pirp;\n\tvoid *padapter;\n};\n\nstatic void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs)\n{\t\n\tstruct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context;\n\n\t//DBG_8192C(\"+usb_bulkout_zero_complete\\n\");\n\t\n\tif(pcontext)\n\t{\n\t\tif(pcontext->pbuf)\n\t\t{\t\t\t\n\t\t\trtw_mfree(pcontext->pbuf, sizeof(int));\t\n\t\t}\t\n\n\t\tif(pcontext->purb && (pcontext->purb==purb))\n\t\t{\n\t\t\tusb_free_urb(pcontext->purb);\n\t\t}\n\n\t\n\t\trtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context));\t\n\t}\t\n\t\n\n}\n\nstatic u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)\n{\t\n\tint pipe, status, len;\n\tu32 ret;\n\tunsigned char *pbuf;\n\tstruct zero_bulkout_context *pcontext;\n\tPURB\tpurb = NULL;\t\n\t_adapter *padapter = (_adapter *)pintfhdl->padapter;\n\tstruct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\n\tstruct usb_device *pusbd = pdvobj->pusbdev;\n\n\t//DBG_871X(\"%s\\n\", __func__);\n\t\n\t\t\n\tif (RTW_CANNOT_TX(padapter))\n\t{\t\t\n\t\treturn _FAIL;\n\t}\n\t\n\n\tpcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context));\n\tif (pcontext == NULL) {\n\t\treturn _FAIL;\n\t}\n\n\tpbuf = (unsigned char *)rtw_zmalloc(sizeof(int));\t\n    \tpurb = usb_alloc_urb(0, GFP_ATOMIC);\n\n\t//translate DMA FIFO addr to pipehandle\n\tpipe = ffaddr2pipehdl(pdvobj, addr);\n\n\tlen = 0;\n\tpcontext->pbuf = pbuf;\n\tpcontext->purb = purb;\n\tpcontext->pirp = NULL;\n\tpcontext->padapter = padapter;\n\n\t\n\t//translate DMA FIFO addr to pipehandle\n\t//pipe = ffaddr2pipehdl(pdvobj, addr);\t\n\n\tusb_fill_bulk_urb(purb, pusbd, pipe, \n       \t\t\t\tpbuf,\n              \t\t\tlen,\n              \t\t\tusb_bulkout_zero_complete,\n              \t\t\tpcontext);//context is pcontext\n\n\tstatus = usb_submit_urb(purb, GFP_ATOMIC);\n\n\tif (!status)\n\t{\t\t\n\t\tret= _SUCCESS;\n\t}\n\telse\n\t{\n\t\tret= _FAIL;\n\t}\n\t\n\t\n\treturn _SUCCESS;\n\n}\n\nvoid usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)\n{\n\t\n}\n\nvoid usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)\n{\n\t\n}\n\n\nvoid usb_read_port_cancel(struct intf_hdl *pintfhdl)\n{\n\tint i;\t\n\tstruct recv_buf *precvbuf;\t\n\t_adapter\t*padapter = pintfhdl->padapter;\n\tprecvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf;\n\n\tDBG_871X(\"%s\\n\", __func__);\n\n\tfor (i=0; i < NR_RECVBUFF ; i++) {\n\n\t\tif (precvbuf->purb)\t {\n\t\t\t//DBG_8192C(\"usb_read_port_cancel : usb_kill_urb \\n\");\n\t\t\tusb_kill_urb(precvbuf->purb);\n\t\t}\t\t\n\t\tprecvbuf++;\n\t}\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\n\tusb_kill_urb(padapter->recvpriv.int_in_urb);\n#endif\n}\n\nstatic void usb_write_port_complete(struct urb *purb, struct pt_regs *regs)\n{\n\t_irqL irqL;\n\tint i;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context;\n\t//struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;\n\t//_adapter\t\t\t*padapter = pxmitframe->padapter;\n\t_adapter\t*padapter = pxmitbuf->padapter;\n       struct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\t\t\n\t//struct pkt_attrib *pattrib = &pxmitframe->attrib;\n\t   \n_func_enter_;\n\n\tswitch(pxmitbuf->flags)\n\t{\n\t\tcase VO_QUEUE_INX:\n\t\t\tpxmitpriv->voq_cnt--;\t\t\t\n\t\t\tbreak;\n\t\tcase VI_QUEUE_INX:\n\t\t\tpxmitpriv->viq_cnt--;\t\t\n\t\t\tbreak;\n\t\tcase BE_QUEUE_INX:\n\t\t\tpxmitpriv->beq_cnt--;\t\t\t\n\t\t\tbreak;\n\t\tcase BK_QUEUE_INX:\n\t\t\tpxmitpriv->bkq_cnt--;\t\t\t\n\t\t\tbreak;\n\t\tdefault:\t\t\t\n\t\t\tbreak;\n\t}\n\t\t\n\n/*\n\t_enter_critical(&pxmitpriv->lock, &irqL);\n\n\tpxmitpriv->txirp_cnt--;\n\t\n\tswitch(pattrib->priority) \n\t{\n\t\tcase 1:\t\t\t\t\n\t\tcase 2:\n\t\t\tpxmitpriv->bkq_cnt--;\n\t\t\t//DBG_8192C(\"pxmitpriv->bkq_cnt=%d\\n\", pxmitpriv->bkq_cnt);\n\t\t\tbreak;\n\t\tcase 4:\n\t\tcase 5:\n\t\t\tpxmitpriv->viq_cnt--;\n\t\t\t//DBG_8192C(\"pxmitpriv->viq_cnt=%d\\n\", pxmitpriv->viq_cnt);\n\t\t\tbreak;\n\t\tcase 6:\n\t\tcase 7:\n\t\t\tpxmitpriv->voq_cnt--;\n\t\t\t//DBG_8192C(\"pxmitpriv->voq_cnt=%d\\n\", pxmitpriv->voq_cnt);\n\t\t\tbreak;\n\t\tcase 0:\n\t\tcase 3:\t\t\t\n\t\tdefault:\n\t\t\tpxmitpriv->beq_cnt--;\n\t\t\t//DBG_8192C(\"pxmitpriv->beq_cnt=%d\\n\", pxmitpriv->beq_cnt);\n\t\t\tbreak;\n\t\t\t\n\t}\t\n\t\n\t_exit_critical(&pxmitpriv->lock, &irqL);\n\t\n\t\n\tif(pxmitpriv->txirp_cnt==0)\n\t{\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\\n\"));\t\t\n\t\t_rtw_up_sema(&(pxmitpriv->tx_retevt));\n\t}\n*/\n        //rtw_free_xmitframe(pxmitpriv, pxmitframe);\n\t\n\tif (RTW_CANNOT_TX(padapter))\n\t{\n\t\tDBG_8192C(\"%s(): TX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s) pxmitbuf->buf_tag(%x)\\n\"\n\t\t, __func__\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\"\n\t\t, pxmitbuf->buf_tag);\t\n\n\t\tgoto check_completion;\n\t}\n\n\n\tif (purb->status==0) {\n\t\n\t} else {\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete : purb->status(%d) != 0 \\n\", purb->status));\n\t\tDBG_871X(\"###=> urb_write_port_complete status(%d)\\n\",purb->status);\n\t\tif((purb->status==-EPIPE)||(purb->status==-EPROTO))\n\t\t{\n\t\t\t//usb_clear_halt(pusbdev, purb->pipe);\t\n\t\t\t//msleep(10);\n\t\t\tsreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL);\n\t\t} else if (purb->status == -EINPROGRESS) {\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete: EINPROGESS\\n\"));\n\t\t\tgoto check_completion;\n\n\t\t} else if (purb->status == -ENOENT) {\n\t\t\tDBG_871X(\"%s: -ENOENT\\n\", __func__);\n\t\t\tgoto check_completion;\n\t\t\t\n\t\t} else if (purb->status == -ECONNRESET) {\n\t\t\tDBG_871X(\"%s: -ECONNRESET\\n\", __func__);\n\t\t\tgoto check_completion;\n\n\t\t} else if (purb->status == -ESHUTDOWN) {\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete: ESHUTDOWN\\n\"));\n\t\t\trtw_set_drv_stopped(padapter);\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete:bDriverStopped=TRUE\\n\"));\n\n\t\t\tgoto check_completion;\n\t\t}\n\t\telse\n\t\t{\t\t\t\t\t\n\t\t\trtw_set_surprise_removed(padapter);\n\t\t\tDBG_8192C(\"bSurpriseRemoved=TRUE\\n\");\n \t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port_complete:bSurpriseRemoved=TRUE\\n\"));\n\n\t\t\tgoto check_completion;\n\t\t}\n\t}\n\n\t#ifdef DBG_CONFIG_ERROR_DETECT\n\t{\t\n\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\tpHalData->srestpriv.last_tx_complete_time = rtw_get_current_time();\t\t\n\t}\n\t#endif\n\ncheck_completion:\n\t_enter_critical(&pxmitpriv->lock_sctx, &irqL);\n\trtw_sctx_done_err(&pxmitbuf->sctx,\n\tpurb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS);\n\t_exit_critical(&pxmitpriv->lock_sctx, &irqL);\n\n\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n\n\t//if(rtw_txframes_pending(padapter))\t\n\t{\n\t\ttasklet_hi_schedule(&pxmitpriv->xmit_tasklet);\n\t}\n\t\n_func_exit_;\t\n\n}\n\nu32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)\n{    \n\t_irqL irqL;\n\tunsigned int pipe;\n\tint status;\n\tu32 ret = _FAIL, bwritezero = _FALSE;\n\tPURB\tpurb = NULL;\n\t_adapter *padapter = (_adapter *)pintfhdl->padapter;\n\tstruct dvobj_priv\t*pdvobj = adapter_to_dvobj(padapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\n\tstruct xmit_priv\t*pxmitpriv = &padapter->xmitpriv;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem;\n\tstruct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;\n\tstruct usb_device *pusbd = pdvobj->pusbdev;\n\tstruct pkt_attrib *pattrib = &pxmitframe->attrib;\n\t\n_func_enter_;\t\n\t\n\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"+usb_write_port\\n\"));\n\n\tif (RTW_CANNOT_TX(padapter)) {\n\t\t#ifdef DBG_TX\n\t\tDBG_871X(\" DBG_TX %s:%d bDriverStopped%s, bSurpriseRemoved:%s\\n\", __func__, __LINE__\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\t#endif\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved )!!!\\n\"));\n\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY);\n\t\tgoto exit;\n\t}\n\t\n\t_enter_critical(&pxmitpriv->lock, &irqL);\n\n\tswitch(addr)\n\t{\n\t\tcase VO_QUEUE_INX:\n\t\t\tpxmitpriv->voq_cnt++;\n\t\t\tpxmitbuf->flags = VO_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase VI_QUEUE_INX:\n\t\t\tpxmitpriv->viq_cnt++;\n\t\t\tpxmitbuf->flags = VI_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase BE_QUEUE_INX:\n\t\t\tpxmitpriv->beq_cnt++;\n\t\t\tpxmitbuf->flags = BE_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase BK_QUEUE_INX:\n\t\t\tpxmitpriv->bkq_cnt++;\n\t\t\tpxmitbuf->flags = BK_QUEUE_INX;\n\t\t\tbreak;\n\t\tcase HIGH_QUEUE_INX:\n\t\t\tpxmitbuf->flags = HIGH_QUEUE_INX;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tpxmitbuf->flags = MGT_QUEUE_INX;\n\t\t\tbreak;\n\t}\n\t\t\n\t_exit_critical(&pxmitpriv->lock, &irqL);\n\t\t\n\tpurb\t= pxmitbuf->pxmit_urb[0];\n\n\t//translate DMA FIFO addr to pipehandle\n\tpipe = ffaddr2pipehdl(pdvobj, addr);\t\n\n#ifdef CONFIG_REDUCE_USB_TX_INT\t\n\tif ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0)\n\t\t|| (pxmitbuf->buf_tag > XMITBUF_DATA) )\n\t{\n\t\tpurb->transfer_flags  &=  (~URB_NO_INTERRUPT);\n\t} else {\n\t\tpurb->transfer_flags  |=  URB_NO_INTERRUPT;\n\t\t//DBG_8192C(\"URB_NO_INTERRUPT \");\n\t}\n#endif\n\n\n\tusb_fill_bulk_urb(purb, pusbd, pipe, \n       \t\t\t\tpxmitframe->buf_addr, //= pxmitbuf->pbuf\n              \t\t\tcnt,\n              \t\t\tusb_write_port_complete,\n              \t\t\tpxmitbuf);//context is pxmitbuf\n              \t\t\t\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\tpurb->transfer_dma = pxmitbuf->dma_transfer_addr;\n\tpurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;\n\tpurb->transfer_flags |= URB_ZERO_PACKET;\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_TX\n\n#ifdef USB_PACKET_OFFSET_SZ\n#if (USB_PACKET_OFFSET_SZ == 0)\n\tpurb->transfer_flags |= URB_ZERO_PACKET;\n#endif\n#endif\n\n#if 0\n\tif (bwritezero)\n        {\n            purb->transfer_flags |= URB_ZERO_PACKET;           \n        }\t\t\t\n#endif\n\n\tstatus = usb_submit_urb(purb, GFP_ATOMIC);\n\tif (!status) {\n\t\t#ifdef DBG_CONFIG_ERROR_DETECT\t\n\t\t{\t\n\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\tpHalData->srestpriv.last_tx_time = rtw_get_current_time();\t\t\n\t\t}\n\t\t#endif\n\t} else {\n\t\trtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);\n\t\tDBG_871X(\"usb_write_port, status=%d\\n\", status);\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_write_port(): usb_submit_urb, status=%x\\n\", status));\n\t\t\n\t\tswitch (status) {\n\t\tcase -ENODEV:\n\t\t\trtw_set_drv_stopped(padapter);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tgoto exit;\n\t}\n\n\tret= _SUCCESS;\n\n//   Commented by Albert 2009/10/13\n//   We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically.\n/*\t\n\tif(bwritezero == _TRUE)\n\t{\n\t\tusb_bulkout_zero(pintfhdl, addr);\n\t}\n*/\n\n\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"-usb_write_port\\n\"));\n\nexit:\n\tif (ret != _SUCCESS)\n\t\trtw_free_xmitbuf(pxmitpriv, pxmitbuf);\n_func_exit_;\n\treturn ret;\n\n}\n\nvoid usb_write_port_cancel(struct intf_hdl *pintfhdl)\n{\n\tint i, j;\n\t_adapter\t*padapter = pintfhdl->padapter;\n\tstruct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf;\n\n\tDBG_871X(\"%s \\n\", __func__);\n\n\tfor (i=0; i<NR_XMITBUFF; i++) {\n\t\tfor (j=0; j<8; j++) {\n\t\t\tif (pxmitbuf->pxmit_urb[j]) {\n\t\t\t\tusb_kill_urb(pxmitbuf->pxmit_urb[j]);\n\t\t\t}\n\t\t}\n\t\tpxmitbuf++;\n\t}\n\t\n\tpxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf;\n\tfor (i = 0; i < NR_XMIT_EXTBUFF ; i++) {\t\n\t\tfor (j=0; j<8; j++) {\n\t\t\tif(pxmitbuf->pxmit_urb[j]) {\n\t\t\t\tusb_kill_urb(pxmitbuf->pxmit_urb[j]);\n\t\t\t}\n\t\t}\n\t\tpxmitbuf++;\n\t}\n}\n\nvoid usb_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf)\n{\n\n\tprecvbuf->transfer_len = 0;\n\n\tprecvbuf->len = 0;\n\n\tprecvbuf->ref_cnt = 0;\n\n\tif(precvbuf->pbuf)\n\t{\n\t\tprecvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf;\n\t\tprecvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;\n\t}\n\n}\n\nint recvbuf2recvframe(PADAPTER padapter, void *ptr);\n\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\nvoid usb_recv_tasklet(void *priv)\n{\t\n\tstruct recv_buf *precvbuf = NULL;\n\t_adapter\t*padapter = (_adapter*)priv;\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\n\twhile (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))\n\t{\n\t\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\tDBG_8192C(\"recv_tasklet => bDriverStopped or bSurpriseRemoved\\n\");\n\t\t\tbreak;\n\t\t}\n\t\t\n\n\t\trecvbuf2recvframe(padapter, precvbuf);\n\n\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\n\t}\t\n\t\n}\n\nvoid usb_read_port_complete(struct urb *purb, struct pt_regs *regs)\n{\t\n\tstruct recv_buf\t*precvbuf = (struct recv_buf *)purb->context;\t\n\t_adapter \t\t\t*padapter =(_adapter *)precvbuf->adapter;\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\n\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete!!!\\n\"));\n\t\n\tATOMIC_DEC(&(precvpriv->rx_pending_cnt));\n\t\t\n\tif (RTW_CANNOT_RX(padapter))\n\t{\n\t\tDBG_8192C(\"%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\\n\"\n\t\t, __func__\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\tgoto exit;\n\t}\n\n\tif(purb->status==0)//SUCCESS\n\t{\n\t\tif ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))\n\t\t{\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\\n\"));\n\n\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\n\t\t}\n\t\telse \n\t\t{\t\t\t\n\t\t\trtw_reset_continual_io_error(adapter_to_dvobj(padapter));\n\t\t\t\n\t\t\tprecvbuf->transfer_len = purb->actual_length;\t\n\n\t\t\t//rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf);\t\t\t\n\t\t\trtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);\n\n\t\t\ttasklet_schedule(&precvpriv->recv_tasklet);\t\t\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete : purb->status(%d) != 0 \\n\", purb->status));\n\t\n\t\tDBG_8192C(\"###=> usb_read_port_complete => urb status(%d)\\n\", purb->status);\n\n\t\tif (rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE)\n\t\t\trtw_set_surprise_removed(padapter);\n\n\t\tswitch(purb->status) {\n\t\t\tcase -EINVAL:\n\t\t\tcase -EPIPE:\t\t\t\n\t\t\tcase -ENODEV:\n\t\t\tcase -ESHUTDOWN:\n\t\t\t\t/*rtw_set_surprise_removed(padapter);*/\n\t\t\t\t//RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete:bSurpriseRemoved=TRUE\\n\"));\n\t\t\tcase -ENOENT:\n\t\t\t\trtw_set_drv_stopped(padapter);\n\t\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete:bDriverStopped=TRUE\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase -EPROTO:\n\t\t\tcase -EILSEQ:\n\t\t\tcase -ETIME:\n\t\t\tcase -ECOMM:\n\t\t\tcase -EOVERFLOW:\n\t\t\t\t#ifdef DBG_CONFIG_ERROR_DETECT\t\n\t\t\t\t{\t\n\t\t\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\t\t\tpHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;\t\t\t\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase -EINPROGRESS:\n\t\t\t\tDBG_8192C(\"ERROR: URB IS IN PROGRESS!/n\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\t\t\n\t}\t\n\nexit:\t\n\t\n_func_exit_;\n}\n\nu32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)\n{\t\t\n\tint err;\n\tunsigned int pipe;\n\tu32 ret = _SUCCESS;\n\tPURB purb = NULL;\t\n\tstruct recv_buf\t*precvbuf = (struct recv_buf *)rmem;\n\t_adapter\t\t*adapter = pintfhdl->padapter;\n\tstruct dvobj_priv\t*pdvobj = adapter_to_dvobj(adapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\n\tstruct recv_priv\t*precvpriv = &adapter->recvpriv;\n\tstruct usb_device\t*pusbd = pdvobj->pusbdev;\n\n_func_enter_;\n\t\n\tif (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))\n\t{\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\\n\"));\n\t\treturn _FAIL;\n\t}\n\n\tusb_init_recvbuf(adapter, precvbuf);\n\n\tif(precvbuf->pbuf)\n\t{\t\t\t\n\t\tATOMIC_INC(&(precvpriv->rx_pending_cnt));\n\t\tpurb = precvbuf->purb;\t\t\n\n\t\t//translate DMA FIFO addr to pipehandle\n\t\tpipe = ffaddr2pipehdl(pdvobj, addr);\t\n\n\t\tusb_fill_bulk_urb(purb, pusbd, pipe, \n\t\t\t\t\tprecvbuf->pbuf,\n            \t\t\t\tMAX_RECVBUF_SZ,\n            \t\t\t\tusb_read_port_complete,\n            \t\t\t\tprecvbuf);//context is precvbuf\n\n\t\tpurb->transfer_dma = precvbuf->dma_transfer_addr;\n\t\tpurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;\t\t\t\t\t\t\t\t\n\n\t\terr = usb_submit_urb(purb, GFP_ATOMIC);\t\n\t\tif((err) && (err != (-EPERM)))\n\t\t{\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x\", err, purb->status));\n\t\t\tDBG_8192C(\"cannot submit rx in-token(err = 0x%08x),urb_status = %d\\n\",err,purb->status);\n\t\t\tret = _FAIL;\n\t\t}\n\t\t\n\t}\n\n_func_exit_;\n\n\treturn ret;\n}\n#else\t// CONFIG_USE_USB_BUFFER_ALLOC_RX\n\nvoid usb_recv_tasklet(void *priv)\n{\n\t_pkt\t\t\t*pskb;\n\t_adapter\t\t*padapter = (_adapter*)priv;\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\n\tstruct recv_buf\t*precvbuf = NULL;\n\n\twhile (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) {\n\n\t\tif (RTW_CANNOT_RUN(padapter)) {\n\t\t\tDBG_8192C(\"recv_tasklet => bDriverStopped or bSurpriseRemoved\\n\");\n\t\t\t#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\tif (rtw_free_skb_premem(pskb) != 0)\n\t\t\t#endif //CONFIG_PREALLOC_RX_SKB_BUFFER\n\t\t\t\trtw_skb_free(pskb);\n\t\t\tbreak;\n\t\t}\n\n\t\trecvbuf2recvframe(padapter, pskb);\n\n\t\tskb_reset_tail_pointer(pskb);\n\t\tpskb->len = 0;\n\n\t\tskb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);\n\n\t\tif (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) {\n\t\t\tprecvbuf->pskb = NULL;\n\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\n\t\t}\n\t}\n}\n\nvoid usb_read_port_complete(struct urb *purb, struct pt_regs *regs)\n{\n\tstruct recv_buf\t*precvbuf = (struct recv_buf *)purb->context;\t\n\t_adapter \t\t\t*padapter =(_adapter *)precvbuf->adapter;\n\tstruct recv_priv\t*precvpriv = &padapter->recvpriv;\t\n\t\n\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete!!!\\n\"));\n\t\t\n\tATOMIC_DEC(&(precvpriv->rx_pending_cnt));\n\t\n\tif(RTW_CANNOT_RX(padapter))\n\t{\n\t\tDBG_8192C(\"%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\\n\"\n\t\t\t, __func__\n\t\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\t\tgoto exit;\n\t}\n\n\tif(purb->status==0)//SUCCESS\n\t{\n\t\tif ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))\n\t\t{\n\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete: (purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE)\\n\"));\n\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\n\t\t\tDBG_8192C(\"%s()-%d: RX Warning!\\n\", __FUNCTION__, __LINE__);\t\n\t\t}\n\t\telse \n\t\t{\t\n\t\t\trtw_reset_continual_io_error(adapter_to_dvobj(padapter));\n\t\t\t\n\t\t\tprecvbuf->transfer_len = purb->actual_length;\t\t\t\n\t\t\tskb_put(precvbuf->pskb, purb->actual_length);\t\n\t\t\tskb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);\n\n\t\t\t#ifndef CONFIG_FIX_NR_BULKIN_BUFFER\n\t\t\tif (skb_queue_len(&precvpriv->rx_skb_queue)<=1)\n\t\t\t#endif\n\t\t\t\ttasklet_schedule(&precvpriv->recv_tasklet);\n\n\t\t\tprecvbuf->pskb = NULL;\n\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\t\t\t\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete : purb->status(%d) != 0 \\n\", purb->status));\n\t\n\t\tDBG_8192C(\"###=> usb_read_port_complete => urb status(%d)\\n\", purb->status);\n\n\t\tif (rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE)\n\t\t\trtw_set_surprise_removed(padapter);\n\n\n\t\tswitch(purb->status) {\n\t\t\tcase -EINVAL:\n\t\t\tcase -EPIPE:\t\t\t\n\t\t\tcase -ENODEV:\n\t\t\tcase -ESHUTDOWN:\n\t\t\t\t/*rtw_set_surprise_removed(padapter);*/\n\t\t\t\t//RT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete:bSurpriseRemoved=TRUE\\n\"));\n\t\t\tcase -ENOENT:\n\t\t\t\trtw_set_drv_stopped(padapter);\n\t\t\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port_complete:bDriverStopped=TRUE\\n\"));\n\t\t\t\tbreak;\n\t\t\tcase -EPROTO:\n\t\t\tcase -EILSEQ:\n\t\t\tcase -ETIME:\n\t\t\tcase -ECOMM:\n\t\t\tcase -EOVERFLOW:\n\t\t\t\t#ifdef DBG_CONFIG_ERROR_DETECT\t\n\t\t\t\t{\t\n\t\t\t\t\tHAL_DATA_TYPE\t*pHalData = GET_HAL_DATA(padapter);\n\t\t\t\t\tpHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;\t\t\t\n\t\t\t\t}\n\t\t\t\t#endif\n\t\t\t\trtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase -EINPROGRESS:\n\t\t\t\tDBG_8192C(\"ERROR: URB IS IN PROGRESS!/n\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\t\t\t\t\n\t\t}\n\t\t\n\t}\t\n\nexit:\t\n\t\n_func_exit_;\n\t\n}\n\nu32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)\n{\n\tint err;\n\tunsigned int pipe;\n\tu32 ret = _FAIL;\n\tPURB purb = NULL;\n\tstruct recv_buf\t*precvbuf = (struct recv_buf *)rmem;\n\t_adapter\t\t*adapter = pintfhdl->padapter;\n\tstruct dvobj_priv\t*pdvobj = adapter_to_dvobj(adapter);\n\tstruct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);\n\tstruct recv_priv\t*precvpriv = &adapter->recvpriv;\n\tstruct usb_device\t*pusbd = pdvobj->pusbdev;\n\n_func_enter_;\n\n\tif (RTW_CANNOT_RX(adapter) || (precvbuf == NULL)) {\n\t\tRT_TRACE(_module_hci_ops_os_c_,_drv_err_,(\"usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\\n\"));\n\t\tgoto exit;\n\t}\n\n\tusb_init_recvbuf(adapter, precvbuf);\n\n\tif (precvbuf->pskb == NULL) {\n\t\tSIZE_PTR tmpaddr = 0;\n\t\tSIZE_PTR alignment = 0;\n\n\t\tif (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue)))\n\t\t\tgoto recv_buf_hook;\n\n\t\t#ifndef CONFIG_FIX_NR_BULKIN_BUFFER\n\t\tprecvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);\n\t\t#endif\n\n\t\tif (precvbuf->pskb == NULL) {\n\t\t\tif (0)\n\t\t\t\tDBG_871X(\"usb_read_port() enqueue precvbuf=%p \\n\", precvbuf);\n\t\t\t/* enqueue precvbuf and wait for free skb */\n\t\t\trtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);\n\t\t\tgoto exit;\n\t\t}\n\n\t\ttmpaddr = (SIZE_PTR)precvbuf->pskb->data;\n\t\talignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\n\t\tskb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));\n\t}\n\nrecv_buf_hook:\n\tprecvbuf->phead = precvbuf->pskb->head;\n\tprecvbuf->pdata = precvbuf->pskb->data;\n\tprecvbuf->ptail = skb_tail_pointer(precvbuf->pskb);\n\tprecvbuf->pend = skb_end_pointer(precvbuf->pskb);\n\tprecvbuf->pbuf = precvbuf->pskb->data;\n\n\tpurb = precvbuf->purb;\n\n\t/* translate DMA FIFO addr to pipehandle */\n\tpipe = ffaddr2pipehdl(pdvobj, addr);\n\n\tusb_fill_bulk_urb(purb, pusbd, pipe,\n\t\tprecvbuf->pbuf,\n\t\tMAX_RECVBUF_SZ,\n\t\tusb_read_port_complete,\n\t\tprecvbuf);\n\n\terr = usb_submit_urb(purb, GFP_ATOMIC);\n\tif (err && err != (-EPERM)) {\n\t\tDBG_871X(\"cannot submit rx in-token(err = 0x%08x),urb_status = %d\\n\"\n\t\t\t, err, purb->status);\n\t\tgoto exit;\n\t}\n\n\tATOMIC_INC(&(precvpriv->rx_pending_cnt));\n\tret = _SUCCESS;\n\nexit:\n\n_func_exit_;\n\n\treturn ret;\n}\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_RX\n\n#ifdef CONFIG_USB_INTERRUPT_IN_PIPE\nvoid usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs)\n{\n\tint\terr;\n\t_adapter\t*padapter = (_adapter *)purb->context;\n\n\tif (RTW_CANNOT_RX(padapter)) {\n\t\tDBG_8192C(\"%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\\n\"\n\t\t, __func__\n\t\t, rtw_is_drv_stopped(padapter)?\"True\":\"False\"\n\t\t, rtw_is_surprise_removed(padapter)?\"True\":\"False\");\n\n\t\treturn;\n\t}\n\n\tif (purb->status == 0) {/*SUCCESS*/\n\t\tif (purb->actual_length > INTERRUPT_MSG_FORMAT_LEN)\n\t\t\tDBG_8192C(\"usb_read_interrupt_complete: purb->actual_length > INTERRUPT_MSG_FORMAT_LEN(%d)\\n\", INTERRUPT_MSG_FORMAT_LEN);\n\n\t\trtw_hal_interrupt_handler(padapter, purb->actual_length, purb->transfer_buffer);\n\n\t\terr = usb_submit_urb(purb, GFP_ATOMIC);\n\t\tif ((err) && (err != (-EPERM)))\n\t\t\tDBG_8192C(\"cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\\n\", err, purb->status);\n\t} else {\n\t\tDBG_8192C(\"###=> usb_read_interrupt_complete => urb status(%d)\\n\", purb->status);\n\n\t\tswitch (purb->status) {\n\t\tcase -EINVAL:\n\t\tcase -EPIPE:\n\t\tcase -ENODEV:\n\t\tcase -ESHUTDOWN:\n\t\t\t/*rtw_set_surprise_removed(padapter);*/\n\t\t\t/*RT_TRACE(_module_hci_ops_os_c_, _drv_err_, (\"usb_read_port_complete:bSurpriseRemoved=TRUE\\n\"));*/\n\t\tcase -ENOENT:\n\t\t\trtw_set_drv_stopped(padapter);\n\t\t\tRT_TRACE(_module_hci_ops_os_c_, _drv_err_, (\"usb_read_port_complete:bDriverStopped=TRUE\\n\"));\n\t\t\tbreak;\n\t\tcase -EPROTO:\n\t\t\tbreak;\n\t\tcase -EINPROGRESS:\n\t\t\tDBG_8192C(\"ERROR: URB IS IN PROGRESS!/n\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nu32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr)\n{\n\tint\terr;\n\tunsigned int pipe;\n\tu32\tret = _SUCCESS;\n\t_adapter\t\t\t*adapter = pintfhdl->padapter;\n\tstruct dvobj_priv\t*pdvobj = adapter_to_dvobj(adapter);\n\tstruct recv_priv\t*precvpriv = &adapter->recvpriv;\n\tstruct usb_device\t*pusbd = pdvobj->pusbdev;\n\n_func_enter_;\n\n\tif (RTW_CANNOT_RX(adapter)) {\n\t\tRT_TRACE(_module_hci_ops_os_c_, _drv_err_, (\"usb_read_interrupt:( RTW_CANNOT_RX )!!!\\n\"));\n\t\treturn _FAIL;\n\t}\n\n\t/*translate DMA FIFO addr to pipehandle*/\n\tpipe = ffaddr2pipehdl(pdvobj, addr);\n\n\tusb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe,\n\t\t\t\t\t\tprecvpriv->int_in_buf,\n\t\t\t\t\t\tINTERRUPT_MSG_FORMAT_LEN,\n\t\t\t\t\t\tusb_read_interrupt_complete,\n\t\t\t\t\t\tadapter,\n\t\t\t\t\t\t1);\n\n\terr = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC);\n\tif ((err) && (err != (-EPERM))) {\n\t\tDBG_8192C(\"cannot submit interrupt in-token(err = 0x%08x), urb_status = %d\\n\", err, precvpriv->int_in_urb->status);\n\t\tret = _FAIL;\n\t}\n\n_func_exit_;\n\treturn ret;\n}\n#endif /* CONFIG_USB_INTERRUPT_IN_PIPE */\n\n"
  },
  {
    "path": "os_dep/linux/wifi_regd.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2009-2010  Realtek Corporation.\n *\n *****************************************************************************/\n\n#include <drv_types.h>\n\n#ifdef CONFIG_IOCTL_CFG80211\n\n#include <rtw_wifi_regd.h>\n\nstatic struct country_code_to_enum_rd allCountries[] = {\n\t{COUNTRY_CODE_USER, \"RD\"},\n};\n\n/* \n * REG_RULE(freq start, freq end, bandwidth, max gain, eirp, reg_flags)\n */\n\n/*\n *Only these channels all allow active\n *scan on all world regulatory domains\n */\n\n/* 2G chan 01 - chan 11 */\n#define RTW_2GHZ_CH01_11\t\\\n\tREG_RULE(2412-10, 2462+10, 40, 0, 20, 0)\n\n/*\n *We enable active scan on these a case\n *by case basis by regulatory domain\n */\n\n/* 2G chan 12 - chan 13, PASSIV SCAN */\n#define RTW_2GHZ_CH12_13\t\\\n\tREG_RULE(2467-10, 2472+10, 40, 0, 20,\t\\\n\tNL80211_RRF_PASSIVE_SCAN)\n\n/* 2G chan 14, PASSIVS SCAN, NO OFDM (B only) */\n#define RTW_2GHZ_CH14\t\\\n\tREG_RULE(2484-10, 2484+10, 40, 0, 20,\t\\\n\tNL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)\n\n/* 5G chan 36 - chan 64 */\n#define RTW_5GHZ_5150_5350\t\\\n\tREG_RULE(5150-10, 5350+10, 40, 0, 30,\t\\\n\tNL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)\n\n/* 5G chan 100 - chan 165 */\n#define RTW_5GHZ_5470_5850\t\\\n\tREG_RULE(5470-10, 5850+10, 40, 0, 30, \\\n\tNL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)\n\n/* 5G chan 149 - chan 165 */\n#define RTW_5GHZ_5725_5850\t\\\n\tREG_RULE(5725-10, 5850+10, 40, 0, 30, \\\n\tNL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)\n\n/* 5G chan 36 - chan 165 */\n#define RTW_5GHZ_5150_5850\t\\\n\tREG_RULE(5150-10, 5850+10, 40, 0, 30,\t\\\n\tNL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)\n\nstatic const struct ieee80211_regdomain rtw_regdom_rd = {\n\t.n_reg_rules = 3,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_2GHZ_CH12_13,\n\t\t      RTW_5GHZ_5150_5850,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_11 = {\n\t.n_reg_rules = 1,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_12_13 = {\n\t.n_reg_rules = 2,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_2GHZ_CH12_13,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_no_midband = {\n\t.n_reg_rules = 3,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_5GHZ_5150_5350,\n\t\t      RTW_5GHZ_5725_5850,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_60_64 = {\n\t.n_reg_rules = 3,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_2GHZ_CH12_13,\n\t\t      RTW_5GHZ_5725_5850,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_14_60_64 = {\n\t.n_reg_rules = 4,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_2GHZ_CH12_13,\n\t\t      RTW_2GHZ_CH14,\n\t\t      RTW_5GHZ_5725_5850,\n\t\t      }\n};\n\nstatic const struct ieee80211_regdomain rtw_regdom_14 = {\n\t.n_reg_rules = 3,\n\t.alpha2 = \"99\",\n\t.reg_rules = {\n\t\t      RTW_2GHZ_CH01_11,\n\t\t      RTW_2GHZ_CH12_13,\n\t\t      RTW_2GHZ_CH14,\n\t\t      }\n};\n\n#if 0\nstatic struct rtw_regulatory *rtw_regd;\n#endif\n\nstatic bool _rtw_is_radar_freq(u16 center_freq)\n{\n\treturn (center_freq >= 5260 && center_freq <= 5700);\n}\n\n#if 0 // not_yet\nstatic void _rtw_reg_apply_beaconing_flags(struct wiphy *wiphy,\n\t\t\t\t\t   enum nl80211_reg_initiator initiator)\n{\n\tenum ieee80211_band band;\n\tstruct ieee80211_supported_band *sband;\n\tconst struct ieee80211_reg_rule *reg_rule;\n\tstruct ieee80211_channel *ch;\n\tunsigned int i;\n\tu32 bandwidth = 0;\n\tint r;\n\n\tfor (band = 0; band < IEEE80211_NUM_BANDS; band++) {\n\n\t\tif (!wiphy->bands[band])\n\t\t\tcontinue;\n\n\t\tsband = wiphy->bands[band];\n\n\t\tfor (i = 0; i < sband->n_channels; i++) {\n\t\t\tch = &sband->channels[i];\n\t\t\tif (_rtw_is_radar_freq(ch->center_freq) ||\n\t\t\t    (ch->flags & IEEE80211_CHAN_RADAR))\n\t\t\t\tcontinue;\n\t\t\tif (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {\n\t\t\t\tr = freq_reg_info(wiphy, ch->center_freq,\n\t\t\t\t\t\t  bandwidth, &reg_rule);\n\t\t\t\tif (r)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t/*\n\t\t\t\t *If 11d had a rule for this channel ensure\n\t\t\t\t *we enable adhoc/beaconing if it allows us to\n\t\t\t\t *use it. Note that we would have disabled it\n\t\t\t\t *by applying our static world regdomain by\n\t\t\t\t *default during init, prior to calling our\n\t\t\t\t *regulatory_hint().\n\t\t\t\t */\n\n\t\t\t\tif (!(reg_rule->flags & NL80211_RRF_NO_IBSS))\n\t\t\t\t\tch->flags &= ~IEEE80211_CHAN_NO_IBSS;\n\t\t\t\tif (!\n\t\t\t\t    (reg_rule->flags &\n\t\t\t\t     NL80211_RRF_PASSIVE_SCAN))\n\t\t\t\t\tch->flags &=\n\t\t\t\t\t    ~IEEE80211_CHAN_PASSIVE_SCAN;\n\t\t\t} else {\n\t\t\t\tif (ch->beacon_found)\n\t\t\t\t\tch->flags &= ~(IEEE80211_CHAN_NO_IBSS |\n\t\t\t\t\t\t       IEEE80211_CHAN_PASSIVE_SCAN);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Allows active scan scan on Ch 12 and 13 */\nstatic void _rtw_reg_apply_active_scan_flags(struct wiphy *wiphy,\n\t\t\t\t\t     enum nl80211_reg_initiator\n\t\t\t\t\t     initiator)\n{\n\tstruct ieee80211_supported_band *sband;\n\tstruct ieee80211_channel *ch;\n\tconst struct ieee80211_reg_rule *reg_rule;\n\tu32 bandwidth = 0;\n\tint r;\n\n\tif (!wiphy->bands[IEEE80211_BAND_2GHZ])\n\t\treturn;\n\tsband = wiphy->bands[IEEE80211_BAND_2GHZ];\n\n\t/*\n\t * If no country IE has been received always enable active scan\n\t * on these channels. This is only done for specific regulatory SKUs\n\t */\n\tif (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {\n\t\tch = &sband->channels[11];\t/* CH 12 */\n\t\tif (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)\n\t\t\tch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;\n\t\tch = &sband->channels[12];\t/* CH 13 */\n\t\tif (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)\n\t\t\tch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;\n\t\treturn;\n\t}\n\n\t/*\n\t * If a country IE has been received check its rule for this\n\t * channel first before enabling active scan. The passive scan\n\t * would have been enforced by the initial processing of our\n\t * custom regulatory domain.\n\t */\n\n\tch = &sband->channels[11];\t/* CH 12 */\n\tr = freq_reg_info(wiphy, ch->center_freq, bandwidth, &reg_rule);\n\tif (!r) {\n\t\tif (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))\n\t\t\tif (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)\n\t\t\t\tch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;\n\t}\n\n\tch = &sband->channels[12];\t/* CH 13 */\n\tr = freq_reg_info(wiphy, ch->center_freq, bandwidth, &reg_rule);\n\tif (!r) {\n\t\tif (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))\n\t\t\tif (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)\n\t\t\t\tch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;\n\t}\n}\n#endif\n\n/*\n * Always apply Radar/DFS rules on\n * freq range 5260 MHz - 5700 MHz\n */\nstatic void _rtw_reg_apply_radar_flags(struct wiphy *wiphy)\n{\n\tstruct ieee80211_supported_band *sband;\n\tstruct ieee80211_channel *ch;\n\tunsigned int i;\n\n\tif (!wiphy->bands[IEEE80211_BAND_5GHZ])\n\t\treturn;\n\n\tsband = wiphy->bands[IEEE80211_BAND_5GHZ];\n\n\tfor (i = 0; i < sband->n_channels; i++) {\n\t\tch = &sband->channels[i];\n\t\tif (!_rtw_is_radar_freq(ch->center_freq))\n\t\t\tcontinue;\n#ifdef CONFIG_DFS\n\t\t#if defined(CONFIG_DFS_MASTER) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))\n\t\tif (!(ch->flags & IEEE80211_CHAN_DISABLED)) {\n\t\t\tch->flags |= IEEE80211_CHAN_RADAR;\n\t\t\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))\n\t\t\tch->flags |= (IEEE80211_CHAN_NO_IBSS|IEEE80211_CHAN_PASSIVE_SCAN);\n\t\t\t#else\n\t\t\tch->flags |= IEEE80211_CHAN_NO_IR;\n\t\t\t#endif\n\t\t}\n\t\t#endif\n#endif //CONFIG_DFS\n\n#if 0\n\t\t/*\n\t\t * We always enable radar detection/DFS on this\n\t\t * frequency range. Additionally we also apply on\n\t\t * this frequency range:\n\t\t * - If STA mode does not yet have DFS supports disable\n\t\t *  active scanning\n\t\t * - If adhoc mode does not support DFS yet then disable\n\t\t *  adhoc in the frequency.\n\t\t * - If AP mode does not yet support radar detection/DFS\n\t\t *  do not allow AP mode\n\t\t */\n\t\tif (!(ch->flags & IEEE80211_CHAN_DISABLED))\n\t\t\tch->flags |= IEEE80211_CHAN_RADAR |\n\t\t\t    IEEE80211_CHAN_NO_IBSS |\n\t\t\t    IEEE80211_CHAN_PASSIVE_SCAN;\n#endif\n\t}\n}\n\nstatic void _rtw_reg_apply_flags(struct wiphy *wiphy)\n{\n#if 1\t\t\t\t// by channel plan\n\t_adapter *padapter = wiphy_to_adapter(wiphy);\n\tu8 channel_plan = padapter->mlmepriv.ChannelPlan;\n\tstruct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;\n\tRT_CHANNEL_INFO *channel_set = pmlmeext->channel_set;\n\tu8 max_chan_nums = pmlmeext->max_chan_nums;\n\n\tstruct ieee80211_supported_band *sband;\n\tstruct ieee80211_channel *ch;\n\tunsigned int i, j;\n\tu16 channel;\n\tu32 freq;\n\n\t// all channels disable\n\tfor (i = 0; i < IEEE80211_NUM_BANDS; i++) {\n\t\tsband = wiphy->bands[i];\n\n\t\tif (sband) {\n\t\t\tfor (j = 0; j < sband->n_channels; j++) {\n\t\t\t\tch = &sband->channels[j];\n\n\t\t\t\tif (ch)\n\t\t\t\t\tch->flags = IEEE80211_CHAN_DISABLED;\n\t\t\t}\n\t\t}\n\t}\n\n\t// channels apply by channel plans.\n\tfor (i = 0; i < max_chan_nums; i++) {\n\t\tchannel = channel_set[i].ChannelNum;\n\t\tfreq = rtw_ch2freq(channel);\n\n\t\tch = ieee80211_get_channel(wiphy, freq);\n\t\tif (ch) {\n\t\t\tif (channel_set[i].ScanType == SCAN_PASSIVE) {\n\t\t\t\t#if defined(CONFIG_DFS_MASTER) && (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))\n\t\t\t\tch->flags = 0;\n\t\t\t\t#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))\n\t\t\t\tch->flags = (IEEE80211_CHAN_NO_IBSS|IEEE80211_CHAN_PASSIVE_SCAN);\n\t\t\t\t#else\n\t\t\t\tch->flags = IEEE80211_CHAN_NO_IR;\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse {\n\t\t\t\tch->flags = 0;\n\t\t\t}\n\t\t}\n\t}\n\n#else\n\tstruct ieee80211_supported_band *sband;\n\tstruct ieee80211_channel *ch;\n\tunsigned int i, j;\n\tu16 channels[37] =\n\t    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56,\n\t\t60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,\n\t\t149, 153,\n\t\t157, 161, 165\n\t};\n\tu16 channel;\n\tu32 freq;\n\n\tfor (i = 0; i < IEEE80211_NUM_BANDS; i++) {\n\t\tsband = wiphy->bands[i];\n\n\t\tif (sband)\n\t\t\tfor (j = 0; j < sband->n_channels; j++) {\n\t\t\t\tch = &sband->channels[j];\n\n\t\t\t\tif (ch)\n\t\t\t\t\tch->flags = IEEE80211_CHAN_DISABLED;\n\t\t\t}\n\t}\n\n\tfor (i = 0; i < 37; i++) {\n\t\tchannel = channels[i];\n\t\tfreq = rtw_ch2freq(channel);\n\n\t\tch = ieee80211_get_channel(wiphy, freq);\n\t\tif (ch) {\n\t\t\tif (channel <= 11)\n\t\t\t\tch->flags = 0;\n\t\t\telse\n\t\t\t\tch->flags = 0;\t//IEEE80211_CHAN_PASSIVE_SCAN;\n\t\t}\n\t\t//printk(\"%s: freq %d(%d) flag 0x%02X \\n\", __func__, freq, channel, ch->flags);\n\t}\n#endif\n}\n\nstatic void _rtw_reg_apply_world_flags(struct wiphy *wiphy,\n\t\t\t\t       enum nl80211_reg_initiator initiator,\n\t\t\t\t       struct rtw_regulatory *reg)\n{\n\t//_rtw_reg_apply_beaconing_flags(wiphy, initiator);\n\t//_rtw_reg_apply_active_scan_flags(wiphy, initiator);\n\treturn;\n}\n\nstatic int _rtw_reg_notifier_apply(struct wiphy *wiphy,\n\t\t\t\t   struct regulatory_request *request,\n\t\t\t\t   struct rtw_regulatory *reg)\n{\n\n\t/* Hard code flags */\n\t_rtw_reg_apply_flags(wiphy);\n\n\t/* We always apply this */\n\t_rtw_reg_apply_radar_flags(wiphy);\n\n\tswitch (request->initiator) {\n\tcase NL80211_REGDOM_SET_BY_DRIVER:\n\t\tDBG_8192C(\"%s: %s\\n\", __func__, \"NL80211_REGDOM_SET_BY_DRIVER\");\n\t\t_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,\n\t\t\t\t\t   reg);\n\t\tbreak;\n\tcase NL80211_REGDOM_SET_BY_CORE:\n\t\tDBG_8192C(\"%s: %s\\n\", __func__,\n\t\t\t  \"NL80211_REGDOM_SET_BY_CORE to DRV\");\n\t\t_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,\n\t\t\t\t\t   reg);\n\t\tbreak;\n\tcase NL80211_REGDOM_SET_BY_USER:\n\t\tDBG_8192C(\"%s: %s\\n\", __func__,\n\t\t\t  \"NL80211_REGDOM_SET_BY_USER to DRV\");\n\t\t_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,\n\t\t\t\t\t   reg);\n\t\tbreak;\n\tcase NL80211_REGDOM_SET_BY_COUNTRY_IE:\n\t\tDBG_8192C(\"%s: %s\\n\", __func__,\n\t\t\t  \"NL80211_REGDOM_SET_BY_COUNTRY_IE\");\n\t\t_rtw_reg_apply_world_flags(wiphy, request->initiator, reg);\n\t\tbreak;\n\t}\n\n\treturn 0;\n}\n\nstatic const struct ieee80211_regdomain *_rtw_regdomain_select(struct\n\t\t\t\t\t\t\t       rtw_regulatory\n\t\t\t\t\t\t\t       *reg)\n{\n#if 0\n\tswitch (reg->country_code) {\n\tcase COUNTRY_CODE_USER:\n\tdefault:\n\t\treturn &rtw_regdom_rd;\n\t}\n#else\n\treturn &rtw_regdom_rd;\n#endif\n}\n\nvoid _rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)\n{\n\tstruct rtw_regulatory *reg = NULL;\n\n\tDBG_8192C(\"%s\\n\", __func__);\n\n\t_rtw_reg_notifier_apply(wiphy, request, reg);\n}\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))\nint rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)\n#else\nvoid rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)\n#endif\n{\n\t_rtw_reg_notifier(wiphy, request);\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0))\n\treturn 0;\n\t#endif\n}\n\nvoid rtw_reg_notify_by_driver(_adapter *adapter)\n{\n\tif ((adapter->rtw_wdev != NULL) && (adapter->rtw_wdev->wiphy)) {\n\t\tstruct regulatory_request request;\n\t\trequest.initiator = NL80211_REGDOM_SET_BY_DRIVER;\n\t\trtw_reg_notifier(adapter->rtw_wdev->wiphy, &request);\n\t}\n}\n\nstatic void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy)\n{\n\tconst struct ieee80211_regdomain *regd;\n\n\twiphy->reg_notifier = rtw_reg_notifier;\n\n\t#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0))\n\twiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;\n\twiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY;\n\twiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS;\n\t#else\n\twiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;\n\twiphy->regulatory_flags &= ~REGULATORY_STRICT_REG;\n\twiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS;\n\t#endif\n\t\n\tregd = _rtw_regdomain_select(reg);\n\twiphy_apply_custom_regulatory(wiphy, regd);\n\n\t/* Hard code flags */\n\t_rtw_reg_apply_flags(wiphy);\n\t_rtw_reg_apply_radar_flags(wiphy);\n\t_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);\n}\n\nstatic struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)\n{\n\tint i;\n\n\tfor (i = 0; i < ARRAY_SIZE(allCountries); i++) {\n\t\tif (allCountries[i].countrycode == countrycode)\n\t\t\treturn &allCountries[i];\n\t}\n\treturn NULL;\n}\n\nint rtw_regd_init(_adapter * padapter)\n{\n\tstruct wiphy *wiphy = padapter->rtw_wdev->wiphy;\n\n#if 0\n\tif (rtw_regd == NULL) {\n\t\trtw_regd = (struct rtw_regulatory *)\n\t\t    rtw_malloc(sizeof(struct rtw_regulatory));\n\n\t\trtw_regd->alpha2[0] = '9';\n\t\trtw_regd->alpha2[1] = '9';\n\n\t\trtw_regd->country_code = COUNTRY_CODE_USER;\n\t}\n\n\tDBG_8192C(\"%s: Country alpha2 being used: %c%c\\n\",\n\t\t  __func__, rtw_regd->alpha2[0], rtw_regd->alpha2[1]);\n#endif\n\n\t_rtw_regd_init_wiphy(NULL, wiphy);\n\n\treturn 0;\n}\n#endif //CONFIG_IOCTL_CFG80211\n\n"
  },
  {
    "path": "os_dep/linux/xmit_linux.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#define _XMIT_OSDEP_C_\n\n#include <drv_types.h>\n\n#define DBG_DUMP_OS_QUEUE_CTL 0\n\nuint rtw_remainder_len(struct pkt_file *pfile)\n{\n\treturn (pfile->buf_len - ((SIZE_PTR)(pfile->cur_addr) - (SIZE_PTR)(pfile->buf_start)));\n}\n\nvoid _rtw_open_pktfile (_pkt *pktptr, struct pkt_file *pfile)\n{\n_func_enter_;\n\n\tpfile->pkt = pktptr;\n\tpfile->cur_addr = pfile->buf_start = pktptr->data;\n\tpfile->pkt_len = pfile->buf_len = pktptr->len;\n\n\tpfile->cur_buffer = pfile->buf_start ;\n\t\n_func_exit_;\n}\n\nuint _rtw_pktfile_read (struct pkt_file *pfile, u8 *rmem, uint rlen)\n{\t\n\tuint\tlen = 0;\n\t\n_func_enter_;\n\n       len =  rtw_remainder_len(pfile);\n      \tlen = (rlen > len)? len: rlen;\n\n       if(rmem)\n\t  skb_copy_bits(pfile->pkt, pfile->buf_len-pfile->pkt_len, rmem, len);\n\n       pfile->cur_addr += len;\n       pfile->pkt_len -= len;\n\t   \n_func_exit_;\t       \t\t\n\n\treturn len;\t\n}\n\nsint rtw_endofpktfile(struct pkt_file *pfile)\n{\n_func_enter_;\n\n\tif (pfile->pkt_len == 0) {\n_func_exit_;\n\t\treturn _TRUE;\n\t}\n\n_func_exit_;\n\n\treturn _FALSE;\n}\n\nvoid rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib)\n{\n\n#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX\n\tstruct sk_buff *skb = (struct sk_buff *)pkt;\n\tpattrib->hw_tcp_csum = 0;\n\t\n\tif (skb->ip_summed == CHECKSUM_PARTIAL) {\n\t\tif (skb_shinfo(skb)->nr_frags == 0)\n\t\t{\t\n                        const struct iphdr *ip = ip_hdr(skb);\n                        if (ip->protocol == IPPROTO_TCP) {\n                                // TCP checksum offload by HW\n                                DBG_871X(\"CHECKSUM_PARTIAL TCP\\n\");\n                                pattrib->hw_tcp_csum = 1;\n                                //skb_checksum_help(skb);\n                        } else if (ip->protocol == IPPROTO_UDP) {\n                                //DBG_871X(\"CHECKSUM_PARTIAL UDP\\n\");\n#if 1                       \n                                skb_checksum_help(skb);\n#else\n                                // Set UDP checksum = 0 to skip checksum check\n                                struct udphdr *udp = skb_transport_header(skb);\n                                udp->check = 0;\n#endif\n                        } else {\n\t\t\t\tDBG_871X(\"%s-%d TCP CSUM offload Error!!\\n\", __FUNCTION__, __LINE__);\n                                WARN_ON(1);     /* we need a WARN() */\n\t\t\t    }\n\t\t}\n\t\telse { // IP fragmentation case\n\t\t\tDBG_871X(\"%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\\n\", __FUNCTION__, __LINE__);\n                \tskb_checksum_help(skb);\n\t\t}\t\t\n\t}\n#endif\t\n\t\n}\n\nint rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz, u8 flag)\n{\n\tif (alloc_sz > 0) {\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\t\tstruct usb_device\t*pusbd = pdvobjpriv->pusbdev;\n\n\t\tpxmitbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)alloc_sz, &pxmitbuf->dma_transfer_addr);\n\t\tpxmitbuf->pbuf = pxmitbuf->pallocated_buf;\n\t\tif(pxmitbuf->pallocated_buf == NULL)\n\t\t\treturn _FAIL;\n#else // CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t\t\n\t\tpxmitbuf->pallocated_buf = rtw_zmalloc(alloc_sz);\n\t\tif (pxmitbuf->pallocated_buf == NULL)\n\t\t{\n\t\t\treturn _FAIL;\n\t\t}\n\n\t\tpxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ);\n\n#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t}\n\n\tif (flag) {\n#ifdef CONFIG_USB_HCI\n\t\tint i;\n\t\tfor(i=0; i<8; i++)\n\t      \t{\n\t      \t\tpxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);\n\t             if(pxmitbuf->pxmit_urb[i] == NULL) \n\t             {\n\t             \tDBG_871X(\"pxmitbuf->pxmit_urb[i]==NULL\");\n\t\t       \treturn _FAIL;\t \n\t             }\n\t      \t}\n#endif\n\t}\n\n\treturn _SUCCESS;\t\n}\n\nvoid rtw_os_xmit_resource_free(_adapter *padapter, struct xmit_buf *pxmitbuf,u32 free_sz, u8 flag)\n{\n\tif (flag) {\n#ifdef CONFIG_USB_HCI\n\t\tint i;\n\n\t\tfor(i=0; i<8; i++)\n\t\t{\n\t\t\tif(pxmitbuf->pxmit_urb[i])\n\t\t\t{\n\t\t\t\t//usb_kill_urb(pxmitbuf->pxmit_urb[i]);\n\t\t\t\tusb_free_urb(pxmitbuf->pxmit_urb[i]);\n\t\t\t}\n\t\t}\n#endif\n\t}\n\n\tif (free_sz > 0 ) {\n#ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t\tstruct dvobj_priv\t*pdvobjpriv = adapter_to_dvobj(padapter);\n\t\tstruct usb_device\t*pusbd = pdvobjpriv->pusbdev;\n\n\t\trtw_usb_buffer_free(pusbd, (size_t)free_sz, pxmitbuf->pallocated_buf, pxmitbuf->dma_transfer_addr);\n\t\tpxmitbuf->pallocated_buf =  NULL;\n\t\tpxmitbuf->dma_transfer_addr = 0;\n#else\t// CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t\tif(pxmitbuf->pallocated_buf)\n\t\t\trtw_mfree(pxmitbuf->pallocated_buf, free_sz);\n#endif\t// CONFIG_USE_USB_BUFFER_ALLOC_TX\n\t}\n}\n\nvoid dump_os_queue(void *sel, _adapter *padapter)\n{\n\tstruct net_device *ndev = padapter->pnetdev;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tint i;\n\n\tfor (i=0;i<4;i++) {\n\t\tDBG_871X_SEL_NL(sel, \"os_queue[%d]:%s\\n\"\n\t\t\t, i, __netif_subqueue_stopped(ndev, i)?\"stopped\":\"waked\");\n\t}\n#else\n\tDBG_871X_SEL_NL(sel, \"os_queue:%s\\n\"\n\t\t\t, netif_queue_stopped(ndev)?\"stopped\":\"waked\");\n#endif\n}\n\n#define WMM_XMIT_THRESHOLD\t(NR_XMITFRAME*2/5)\n\ninline static bool rtw_os_need_wake_queue(_adapter *padapter, u16 qidx)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\n\tif (padapter->registrypriv.wifi_spec) {\n\t\tif (pxmitpriv->hwxmits[qidx].accnt < WMM_XMIT_THRESHOLD)\n\t\t\treturn _TRUE;\n\t} else {\n\t\treturn _TRUE;\n\t}\n\treturn _FALSE;\n#else\n\treturn _TRUE;\n#endif\n}\n\ninline static bool rtw_os_need_stop_queue(_adapter *padapter, u16 qidx)\n{\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tif (padapter->registrypriv.wifi_spec) {\n\t\t/* No free space for Tx, tx_worker is too slow */\n\t\tif (pxmitpriv->hwxmits[qidx].accnt > WMM_XMIT_THRESHOLD)\n\t\t\treturn _TRUE;\n\t} else {\n\t\tif(pxmitpriv->free_xmitframe_cnt<=4)\n\t\t\treturn _TRUE;\n\t}\n#else\n\tif(pxmitpriv->free_xmitframe_cnt<=4)\n\t\treturn _TRUE;\n#endif\n\treturn _FALSE;\n}\n\nvoid rtw_os_pkt_complete(_adapter *padapter, _pkt *pkt)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tu16\tqidx;\n\n\tqidx = skb_get_queue_mapping(pkt);\n\tif (rtw_os_need_wake_queue(padapter, qidx)) {\n\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_wake_subqueue[%d]\\n\", FUNC_ADPT_ARG(padapter), qidx);\n\t\tnetif_wake_subqueue(padapter->pnetdev, qidx);\n\t}\n#else\n\tif (rtw_os_need_wake_queue(padapter, 0)) {\n\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_wake_queue\\n\", FUNC_ADPT_ARG(padapter));\n\t\tnetif_wake_queue(padapter->pnetdev);\n\t}\n#endif\n\n\trtw_skb_free(pkt);\n}\n\nvoid rtw_os_xmit_complete(_adapter *padapter, struct xmit_frame *pxframe)\n{\n\tif(pxframe->pkt)\n\t\trtw_os_pkt_complete(padapter, pxframe->pkt);\n\n\tpxframe->pkt = NULL;\n}\n\nvoid rtw_os_xmit_schedule(_adapter *padapter)\n{\n\t_adapter *pri_adapter = padapter;\n\n#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\n\tif(!padapter)\n\t\treturn;\n\n#ifdef CONFIG_CONCURRENT_MODE\n\tif(padapter->adapter_type > PRIMARY_ADAPTER)\n\t\tpri_adapter = padapter->pbuddy_adapter;\n#endif\n\n\tif (_rtw_queue_empty(&padapter->xmitpriv.pending_xmitbuf_queue) == _FALSE)\n\t\t_rtw_up_sema(&pri_adapter->xmitpriv.xmit_sema);\n\n\n#else\n\t_irqL  irqL;\n\tstruct xmit_priv *pxmitpriv;\n\n\tif(!padapter)\n\t\treturn;\n\n\tpxmitpriv = &padapter->xmitpriv;\n\n\t_enter_critical_bh(&pxmitpriv->lock, &irqL);\n\n\tif(rtw_txframes_pending(padapter))\t\n\t{\n\t\ttasklet_hi_schedule(&pxmitpriv->xmit_tasklet);\n\t}\n\n\t_exit_critical_bh(&pxmitpriv->lock, &irqL);\n#endif\n}\n\nstatic bool rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)\n{\n\tbool busy = _FALSE;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\tu16\tqidx;\n\n\tqidx = skb_get_queue_mapping(pkt);\n\tif (rtw_os_need_stop_queue(padapter, qidx)) {\n\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_stop_subqueue[%d]\\n\", FUNC_ADPT_ARG(padapter), qidx);\n\t\tnetif_stop_subqueue(padapter->pnetdev, qidx);\n\t\tbusy = _TRUE;\n\t}\n#else\n\tif (rtw_os_need_stop_queue(padapter, 0)) {\n\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_stop_queue\\n\", FUNC_ADPT_ARG(padapter));\n\t\trtw_netif_stop_queue(padapter->pnetdev);\n\t\tbusy = _TRUE;\n\t}\n#endif\n\treturn busy;\n}\n\nvoid rtw_os_wake_queue_at_free_stainfo(_adapter *padapter, int *qcnt_freed)\n{\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tint i;\n\n\tfor (i=0;i<4;i++) {\n\t\tif (qcnt_freed[i] == 0)\n\t\t\tcontinue;\n\n\t\tif(rtw_os_need_wake_queue(padapter, i)) {\n\t\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_wake_subqueue[%d]\\n\", FUNC_ADPT_ARG(padapter), i);\n\t\t\tnetif_wake_subqueue(padapter->pnetdev, i);\n\t\t}\n\t}\n#else\n\tif (qcnt_freed[0] || qcnt_freed[1] || qcnt_freed[2] || qcnt_freed[3]) {\n\t\tif(rtw_os_need_wake_queue(padapter, 0)) {\n\t\t\tif (DBG_DUMP_OS_QUEUE_CTL)\n\t\t\t\tDBG_871X(FUNC_ADPT_FMT\": netif_wake_queue\\n\", FUNC_ADPT_ARG(padapter));\n\t\t\tnetif_wake_queue(padapter->pnetdev);\n\t\t}\n\t}\n#endif\n}\n\n#ifdef CONFIG_TX_MCAST2UNI\nint rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)\n{\n\tstruct\tsta_priv *pstapriv = &padapter->stapriv;\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n\t_irqL\tirqL;\n\t_list\t*phead, *plist;\n\tstruct sk_buff *newskb;\n\tstruct sta_info *psta = NULL;\n\tu8 chk_alive_num = 0;\n\tchar chk_alive_list[NUM_STA];\n\tu8 bc_addr[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n\tu8 null_addr[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\n\tint i;\n\ts32\tres;\n\n\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u);\n\n\t_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\tphead = &pstapriv->asoc_list;\n\tplist = get_next(phead);\n\t\n\t//free sta asoc_queue\n\twhile ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {\n\t\tint stainfo_offset;\n\t\tpsta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);\n\t\tplist = get_next(plist);\n\n\t\tstainfo_offset = rtw_stainfo_offset(pstapriv, psta);\n\t\tif (stainfo_offset_valid(stainfo_offset)) {\n\t\t\tchk_alive_list[chk_alive_num++] = stainfo_offset;\n\t\t}\n\t}\n\t_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\n\n\tfor (i = 0; i < chk_alive_num; i++) {\n\t\tpsta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);\n\t\tif(!(psta->state &_FW_LINKED))\n\t\t{\n\t\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_fw_linked);\n\t\t\tcontinue;\t\t\n\t\t}\n\t\t\n\t\t/* avoid come from STA1 and send back STA1 */ \n\t\tif (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE\n\t\t\t|| _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE\n\t\t\t|| _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE\n\t\t)\n\t\t{\n\t\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);\n\t\t\tcontinue;\n\t\t}\n\n\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry);\n\n\t\tnewskb = rtw_skb_copy(skb);\n\n\t\tif (newskb) {\n\t\t\t_rtw_memcpy(newskb->data, psta->hwaddr, 6);\n\t\t\tres = rtw_xmit(padapter, &newskb);\n\t\t\tif (res < 0) {\n\t\t\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);\n\t\t\t\tDBG_871X(\"%s()-%d: rtw_xmit() return error! res=%d\\n\", __FUNCTION__, __LINE__, res);\n\t\t\t\tpxmitpriv->tx_drop++;\n\t\t\t\trtw_skb_free(newskb);\n\t\t\t}\n\t\t} else {\n\t\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_skb);\n\t\t\tDBG_871X(\"%s-%d: rtw_skb_copy() failed!\\n\", __FUNCTION__, __LINE__);\n\t\t\tpxmitpriv->tx_drop++;\n\t\t\t//rtw_skb_free(skb);\n\t\t\treturn _FALSE;\t// Caller shall tx this multicast frame via normal way.\n\t\t}\n\t}\n\n\trtw_skb_free(skb);\n\treturn _TRUE;\n}\n#endif\t// CONFIG_TX_MCAST2UNI\n\n\nint _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)\n{\n\t_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);\n\tstruct xmit_priv *pxmitpriv = &padapter->xmitpriv;\n#ifdef CONFIG_TX_MCAST2UNI\n\tstruct mlme_priv\t*pmlmepriv = &padapter->mlmepriv;\n\textern int rtw_mc2u_disable;\n#endif\t// CONFIG_TX_MCAST2UNI\t\n\ts32 res = 0;\n#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))\n\tu16 queue;\n#endif\n\n_func_enter_;\n\n\tif(padapter->registrypriv.mp_mode)\n\t{\n\t\tDBG_871X(\"MP_TX_DROP_OS_FRAME\\n\");\n\t\tgoto drop_packet;\n\t}\n\tDBG_COUNTER(padapter->tx_logs.os_tx);\n\tRT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, (\"+xmit_enry\\n\"));\n\n\tif (rtw_if_up(padapter) == _FALSE) {\n\t\tDBG_COUNTER(padapter->tx_logs.os_tx_err_up);\n\t\tRT_TRACE(_module_xmit_osdep_c_, _drv_err_, (\"rtw_xmit_entry: rtw_if_up fail\\n\"));\n\t\t#ifdef DBG_TX_DROP_FRAME\n\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s if_up fail\\n\", __FUNCTION__);\n\t\t#endif\n\t\tgoto drop_packet;\n\t}\n\n\trtw_check_xmit_resource(padapter, pkt);\n\n#ifdef CONFIG_TX_MCAST2UNI\n\tif ( !rtw_mc2u_disable\n\t\t&& check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE\n\t\t&& ( IP_MCAST_MAC(pkt->data)\n\t\t\t|| ICMPV6_MCAST_MAC(pkt->data)\n\t\t\t#ifdef CONFIG_TX_BCAST2UNI\n\t\t\t|| is_broadcast_mac_addr(pkt->data)\n\t\t\t#endif\n\t\t\t)\n\t\t&& (padapter->registrypriv.wifi_spec == 0)\n\t\t)\n\t{\n\t\tif ( pxmitpriv->free_xmitframe_cnt > (NR_XMITFRAME/4) ) {\n\t\t\tres = rtw_mlcst2unicst(padapter, pkt);\n\t\t\tif (res == _TRUE) {\n\t\t\t\tgoto exit;\n\t\t\t}\n\t\t} else {\n\t\t\t//DBG_871X(\"Stop M2U(%d, %d)! \", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);\n\t\t\t//DBG_871X(\"!m2u );\n\t\t\tDBG_COUNTER(padapter->tx_logs.os_tx_m2u_stop);\n\t\t}\n\t}\t\n#endif\t// CONFIG_TX_MCAST2UNI\t\n\n\tres = rtw_xmit(padapter, &pkt);\n\tif (res < 0) {\n\t\t#ifdef DBG_TX_DROP_FRAME\n\t\tDBG_871X(\"DBG_TX_DROP_FRAME %s rtw_xmit fail\\n\", __FUNCTION__);\n\t\t#endif\n\t\tgoto drop_packet;\n\t}\n\n\tRT_TRACE(_module_xmit_osdep_c_, _drv_info_, (\"rtw_xmit_entry: tx_pkts=%d\\n\", (u32)pxmitpriv->tx_pkts));\n\tgoto exit;\n\ndrop_packet:\n\tpxmitpriv->tx_drop++;\n\trtw_os_pkt_complete(padapter, pkt);\n\tRT_TRACE(_module_xmit_osdep_c_, _drv_notice_, (\"rtw_xmit_entry: drop, tx_drop=%d\\n\", (u32)pxmitpriv->tx_drop));\n\nexit:\n\n_func_exit_;\n\n\treturn 0;\n}\n\nint rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)\n{\n\tint ret = 0;\n\n\tif (pkt) {\n\t\trtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, pkt->truesize);\n\t\tret = _rtw_xmit_entry(pkt, pnetdev);\n\t}\n\n\treturn ret;\n}\n\n"
  },
  {
    "path": "os_dep/osdep_service.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\n *                                        \n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n\n\n#define _OSDEP_SERVICE_C_\n\n#include <drv_types.h>\n\n#define RT_TAG\t'1178'\n\n#ifdef DBG_MEMORY_LEAK\n#ifdef PLATFORM_LINUX\natomic_t _malloc_cnt = ATOMIC_INIT(0);\natomic_t _malloc_size = ATOMIC_INIT(0);\n#endif\n#endif /* DBG_MEMORY_LEAK */\n\n\n#if defined(PLATFORM_LINUX)\n/*\n* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE\n* @return: one of RTW_STATUS_CODE\n*/\ninline int RTW_STATUS_CODE(int error_code){\n\tif(error_code >=0)\n\t\treturn _SUCCESS;\n\n\tswitch(error_code) {\n\t\t//case -ETIMEDOUT:\n\t\t//\treturn RTW_STATUS_TIMEDOUT;\n\t\tdefault:\n\t\t\treturn _FAIL;\n\t}\n}\n#else\ninline int RTW_STATUS_CODE(int error_code){\n\treturn error_code;\n}\n#endif\n\nu32 rtw_atoi(u8* s)\n{\n\n\tint num=0,flag=0;\n\tint i;\n\tfor(i=0;i<=strlen(s);i++)\n\t{\n\t  if(s[i] >= '0' && s[i] <= '9')\n\t\t num = num * 10 + s[i] -'0';\n\t  else if(s[0] == '-' && i==0) \n\t\t flag =1;\n\t  else \n\t\t  break;\n\t }\n\n\tif(flag == 1)\n\t   num = num * -1;\n\n\t return(num); \n\n}\n\ninline u8* _rtw_vmalloc(u32 sz)\n{\n\tu8 \t*pbuf;\n#ifdef PLATFORM_LINUX\t\n\tpbuf = vmalloc(sz);\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tpbuf = malloc(sz,M_DEVBUF,M_NOWAIT);\t\n#endif\t\n\t\n#ifdef PLATFORM_WINDOWS\n\tNdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);\t\n#endif\n\n#ifdef DBG_MEMORY_LEAK\n#ifdef PLATFORM_LINUX\n\tif ( pbuf != NULL) {\n\t\tatomic_inc(&_malloc_cnt);\n\t\tatomic_add(sz, &_malloc_size);\n\t}\n#endif\n#endif /* DBG_MEMORY_LEAK */\n\n\treturn pbuf;\t\n}\n\ninline u8* _rtw_zvmalloc(u32 sz)\n{\n\tu8 \t*pbuf;\n#ifdef PLATFORM_LINUX\n\tpbuf = _rtw_vmalloc(sz);\n\tif (pbuf != NULL)\n\t\tmemset(pbuf, 0, sz);\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tpbuf = malloc(sz,M_DEVBUF,M_ZERO|M_NOWAIT);\t\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\tNdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);\n\tif (pbuf != NULL)\n\t\tNdisFillMemory(pbuf, sz, 0);\n#endif\n\n\treturn pbuf;\t\n}\n\ninline void _rtw_vmfree(u8 *pbuf, u32 sz)\n{\n#ifdef\tPLATFORM_LINUX\n\tvfree(pbuf);\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tfree(pbuf,M_DEVBUF);\t\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\tNdisFreeMemory(pbuf,sz, 0);\n#endif\n\n#ifdef DBG_MEMORY_LEAK\n#ifdef PLATFORM_LINUX\n\tatomic_dec(&_malloc_cnt);\n\tatomic_sub(sz, &_malloc_size);\n#endif\n#endif /* DBG_MEMORY_LEAK */\n}\n\nu8* _rtw_malloc(u32 sz)\n{\n\n\tu8 \t*pbuf=NULL;\n\n#ifdef PLATFORM_LINUX\n#ifdef RTK_DMP_PLATFORM\n\tif(sz > 0x4000)\n\t\tpbuf = (u8 *)dvr_malloc(sz);\n\telse\n#endif\t\t\n\t\tpbuf = kmalloc(sz,in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); \t\t\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tpbuf = malloc(sz,M_DEVBUF,M_NOWAIT);\t\n#endif\t\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisAllocateMemoryWithTag(&pbuf,sz, RT_TAG);\n\n#endif\n\n#ifdef DBG_MEMORY_LEAK\n#ifdef PLATFORM_LINUX\n\tif ( pbuf != NULL) {\n\t\tatomic_inc(&_malloc_cnt);\n\t\tatomic_add(sz, &_malloc_size);\n\t}\n#endif\n#endif /* DBG_MEMORY_LEAK */\n\n\treturn pbuf;\t\n\t\n}\n\n\nu8* _rtw_zmalloc(u32 sz)\n{\n#ifdef PLATFORM_FREEBSD\n\treturn malloc(sz,M_DEVBUF,M_ZERO|M_NOWAIT);\n#else // PLATFORM_FREEBSD\n\tu8 \t*pbuf = _rtw_malloc(sz);\n\n\tif (pbuf != NULL) {\n\n#ifdef PLATFORM_LINUX\n\t\tmemset(pbuf, 0, sz);\n#endif\t\n\t\n#ifdef PLATFORM_WINDOWS\n\t\tNdisFillMemory(pbuf, sz, 0);\n#endif\n\n\t}\n\n\treturn pbuf;\t\n#endif // PLATFORM_FREEBSD\n}\n\nvoid\t_rtw_mfree(u8 *pbuf, u32 sz)\n{\n\n#ifdef\tPLATFORM_LINUX\n#ifdef RTK_DMP_PLATFORM\n\tif(sz > 0x4000)\n\t\tdvr_free(pbuf);\n\telse\n#endif\n\t\tkfree(pbuf);\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tfree(pbuf,M_DEVBUF);\t\n#endif\t\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisFreeMemory(pbuf,sz, 0);\n\n#endif\n\t\n#ifdef DBG_MEMORY_LEAK\n#ifdef PLATFORM_LINUX\n\tatomic_dec(&_malloc_cnt);\n\tatomic_sub(sz, &_malloc_size);\n#endif\n#endif /* DBG_MEMORY_LEAK */\n\t\n}\n\n#ifdef PLATFORM_FREEBSD\n//review again\nstruct sk_buff * dev_alloc_skb(unsigned int size)\n{\n\tstruct sk_buff *skb=NULL;\n    \tu8 *data=NULL;\n\t\n\t//skb = (struct sk_buff *)_rtw_zmalloc(sizeof(struct sk_buff)); // for skb->len, etc.\n\tskb = (struct sk_buff *)_rtw_malloc(sizeof(struct sk_buff));\n\tif(!skb)\n\t\tgoto out;\n\tdata = _rtw_malloc(size);\n\tif(!data)\n\t\tgoto nodata;\n\n\tskb->head = (unsigned char*)data;\n\tskb->data = (unsigned char*)data;\n\tskb->tail = (unsigned char*)data;\n\tskb->end = (unsigned char*)data + size;\n\tskb->len = 0;\n\t//printf(\"%s()-%d: skb=%p, skb->head = %p\\n\", __FUNCTION__, __LINE__, skb, skb->head);\n\nout:\n\treturn skb;\nnodata:\n\t_rtw_mfree((u8 *)skb, sizeof(struct sk_buff));\n\tskb = NULL;\ngoto out;\n\t\n}\n\nvoid dev_kfree_skb_any(struct sk_buff *skb)\n{\n\t//printf(\"%s()-%d: skb->head = %p\\n\", __FUNCTION__, __LINE__, skb->head);\n\tif(skb->head)\n\t\t_rtw_mfree(skb->head, 0);\n\t//printf(\"%s()-%d: skb = %p\\n\", __FUNCTION__, __LINE__, skb);\n\tif(skb)\n\t\t_rtw_mfree((u8 *)skb, 0);\n}\nstruct sk_buff *skb_clone(const struct sk_buff *skb)\n{\n\treturn NULL;\n}\n\n#endif /* PLATFORM_FREEBSD */\n\ninline struct sk_buff *_rtw_skb_alloc(u32 sz)\n{\n#ifdef PLATFORM_LINUX\n\treturn __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\treturn dev_alloc_skb(sz);\n#endif /* PLATFORM_FREEBSD */\n}\n\ninline void _rtw_skb_free(struct sk_buff *skb)\n{\n\tdev_kfree_skb_any(skb);\n}\n\ninline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb)\n{\n#ifdef PLATFORM_LINUX\n\treturn skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\treturn NULL;\n#endif /* PLATFORM_FREEBSD */\n}\n\ninline struct sk_buff *_rtw_skb_clone(struct sk_buff *skb)\n{\n#ifdef PLATFORM_LINUX\n\treturn skb_clone(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\treturn skb_clone(skb);\n#endif /* PLATFORM_FREEBSD */\n}\n\ninline int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb)\n{\n#ifdef PLATFORM_LINUX\n\tskb->dev = ndev;\n\treturn netif_rx(skb);\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\treturn (*ndev->if_input)(ndev, skb);\n#endif /* PLATFORM_FREEBSD */\n}\n\nvoid _rtw_skb_queue_purge(struct sk_buff_head *list)\n{\n\tstruct sk_buff *skb;\n\n\twhile ((skb = skb_dequeue(list)) != NULL)\n\t\t_rtw_skb_free(skb);\n}\n\n#ifdef CONFIG_USB_HCI\ninline void *_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma)\n{\n#ifdef PLATFORM_LINUX\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\treturn usb_alloc_coherent(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\n#else\n\treturn usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\n#endif\n#endif /* PLATFORM_LINUX */\n\t\n#ifdef PLATFORM_FREEBSD\n\treturn (malloc(size, M_USBDEV, M_NOWAIT | M_ZERO));\n#endif /* PLATFORM_FREEBSD */\n}\ninline void _rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma)\n{\n#ifdef PLATFORM_LINUX\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tusb_free_coherent(dev, size, addr, dma); \n#else\n\tusb_buffer_free(dev, size, addr, dma);\n#endif\n#endif /* PLATFORM_LINUX */\n\n#ifdef PLATFORM_FREEBSD\n\tfree(addr, M_USBDEV);\n#endif /* PLATFORM_FREEBSD */\n}\n#endif /* CONFIG_USB_HCI */\n\n#if defined(DBG_MEM_ALLOC)\n\nstruct rtw_mem_stat {\n\tATOMIC_T alloc; // the memory bytes we allocate currently\n\tATOMIC_T peak; // the peak memory bytes we allocate \n\tATOMIC_T alloc_cnt; // the alloc count for alloc currently\n\tATOMIC_T alloc_err_cnt; // the error times we fail to allocate memory\n};\n\nstruct rtw_mem_stat rtw_mem_type_stat[mstat_tf_idx(MSTAT_TYPE_MAX)];\n#ifdef RTW_MEM_FUNC_STAT\nstruct rtw_mem_stat rtw_mem_func_stat[mstat_ff_idx(MSTAT_FUNC_MAX)];\n#endif\n\nchar *MSTAT_TYPE_str[] = {\n\t\"VIR\",\n\t\"PHY\",\n\t\"SKB\",\n\t\"USB\",\n};\n\n#ifdef RTW_MEM_FUNC_STAT\nchar *MSTAT_FUNC_str[] = {\n\t\"UNSP\",\n\t\"IO\",\n\t\"TXIO\",\n\t\"RXIO\",\n\t\"TX\",\n\t\"RX\",\n};\n#endif\n\nvoid rtw_mstat_dump(void *sel)\n{\n\tint i;\n\tint value_t[4][mstat_tf_idx(MSTAT_TYPE_MAX)];\n#ifdef RTW_MEM_FUNC_STAT\n\tint value_f[4][mstat_ff_idx(MSTAT_FUNC_MAX)];\n#endif\n\t\n\tint vir_alloc, vir_peak, vir_alloc_err, phy_alloc, phy_peak, phy_alloc_err;\n\tint tx_alloc, tx_peak, tx_alloc_err, rx_alloc, rx_peak, rx_alloc_err;\n\n\tfor(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {\n\t\tvalue_t[0][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc));\n\t\tvalue_t[1][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].peak));\n\t\tvalue_t[2][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_cnt));\n\t\tvalue_t[3][i] = ATOMIC_READ(&(rtw_mem_type_stat[i].alloc_err_cnt));\n\t}\n\n\t#ifdef RTW_MEM_FUNC_STAT\n\tfor(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {\n\t\tvalue_f[0][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc));\n\t\tvalue_f[1][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].peak));\n\t\tvalue_f[2][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_cnt));\n\t\tvalue_f[3][i] = ATOMIC_READ(&(rtw_mem_func_stat[i].alloc_err_cnt));\n\t}\n\t#endif\n\n\tDBG_871X_SEL_NL(sel, \"===================== MSTAT =====================\\n\");\n\tDBG_871X_SEL_NL(sel, \"%4s %10s %10s %10s %10s\\n\", \"TAG\", \"alloc\", \"peak\", \"aloc_cnt\", \"err_cnt\");\n\tDBG_871X_SEL_NL(sel, \"-------------------------------------------------\\n\");\n\tfor(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {\n\t\tDBG_871X_SEL_NL(sel, \"%4s %10d %10d %10d %10d\\n\", MSTAT_TYPE_str[i], value_t[0][i], value_t[1][i], value_t[2][i], value_t[3][i]);\n\t}\n\t#ifdef RTW_MEM_FUNC_STAT\n\tDBG_871X_SEL_NL(sel, \"-------------------------------------------------\\n\");\n\tfor(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {\n\t\tDBG_871X_SEL_NL(sel, \"%4s %10d %10d %10d %10d\\n\", MSTAT_FUNC_str[i], value_f[0][i], value_f[1][i], value_f[2][i], value_f[3][i]);\n\t}\n\t#endif\n}\n\nvoid rtw_mstat_update(const enum mstat_f flags, const MSTAT_STATUS status, u32 sz)\n{\n\tstatic u32 update_time = 0;\n\tint peak, alloc;\n\tint i;\n\n\t/* initialization */\n\tif(!update_time) {\n\t\tfor(i=0;i<mstat_tf_idx(MSTAT_TYPE_MAX);i++) {\n\t\t\tATOMIC_SET(&(rtw_mem_type_stat[i].alloc), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_type_stat[i].peak), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_type_stat[i].alloc_cnt), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_type_stat[i].alloc_err_cnt), 0);\n\t\t}\n\t\t#ifdef RTW_MEM_FUNC_STAT\n\t\tfor(i=0;i<mstat_ff_idx(MSTAT_FUNC_MAX);i++) {\n\t\t\tATOMIC_SET(&(rtw_mem_func_stat[i].alloc), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_func_stat[i].peak), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_func_stat[i].alloc_cnt), 0);\n\t\t\tATOMIC_SET(&(rtw_mem_func_stat[i].alloc_err_cnt), 0);\n\t\t}\n\t\t#endif\n\t}\n\n\tswitch(status) {\n\t\tcase MSTAT_ALLOC_SUCCESS:\n\t\t\tATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));\n\t\t\talloc = ATOMIC_ADD_RETURN(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);\n\t\t\tpeak=ATOMIC_READ(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak));\n\t\t\tif (peak<alloc)\n\t\t\t\tATOMIC_SET(&(rtw_mem_type_stat[mstat_tf_idx(flags)].peak), alloc);\n\n\t\t\t#ifdef RTW_MEM_FUNC_STAT\n\t\t\tATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));\n\t\t\talloc = ATOMIC_ADD_RETURN(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);\n\t\t\tpeak=ATOMIC_READ(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak));\n\t\t\tif (peak<alloc)\n\t\t\t\tATOMIC_SET(&(rtw_mem_func_stat[mstat_ff_idx(flags)].peak), alloc);\n\t\t\t#endif\n\t\t\tbreak;\n\n\t\tcase MSTAT_ALLOC_FAIL:\n\t\t\tATOMIC_INC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_err_cnt));\n\t\t\t#ifdef RTW_MEM_FUNC_STAT\n\t\t\tATOMIC_INC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_err_cnt));\n\t\t\t#endif\n\t\t\tbreak;\n\n\t\tcase MSTAT_FREE:\n\t\t\tATOMIC_DEC(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc_cnt));\n\t\t\tATOMIC_SUB(&(rtw_mem_type_stat[mstat_tf_idx(flags)].alloc), sz);\n\t\t\t#ifdef RTW_MEM_FUNC_STAT\n\t\t\tATOMIC_DEC(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc_cnt));\n\t\t\tATOMIC_SUB(&(rtw_mem_func_stat[mstat_ff_idx(flags)].alloc), sz);\n\t\t\t#endif\n\t\t\tbreak;\n\t};\n\n\t//if (rtw_get_passing_time_ms(update_time) > 5000) {\n\t//\trtw_mstat_dump(RTW_DBGDUMP);\n\t\tupdate_time=rtw_get_current_time();\n\t//}\n}\n\n#ifndef SIZE_MAX\n\t#define SIZE_MAX (~(size_t)0)\n#endif\n\nstruct mstat_sniff_rule {\n\tenum mstat_f flags;\n\tsize_t lb;\n\tsize_t hb;\n};\n\nstruct mstat_sniff_rule mstat_sniff_rules[] = {\n\t{MSTAT_TYPE_PHY, 4097, SIZE_MAX},\n};\n\nint mstat_sniff_rule_num = sizeof(mstat_sniff_rules)/sizeof(struct mstat_sniff_rule);\n\nbool match_mstat_sniff_rules(const enum mstat_f flags, const size_t size)\n{\n\tint i;\n\tfor (i = 0; i<mstat_sniff_rule_num; i++) {\n\t\tif (mstat_sniff_rules[i].flags == flags\n\t\t\t\t&& mstat_sniff_rules[i].lb <= size\n\t\t\t\t&& mstat_sniff_rules[i].hb >= size)\n\t\t\treturn _TRUE;\n\t}\n\n\treturn _FALSE;\n}\n\ninline u8* dbg_rtw_vmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)\n{\n\tu8  *p;\n\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\t\n\tp=_rtw_vmalloc((sz));\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, sz\n\t);\n\t\n\treturn p;\n}\n\ninline u8* dbg_rtw_zvmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)\n{\n\tu8 *p;\n\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\n\tp=_rtw_zvmalloc((sz)); \n\n\trtw_mstat_update(\n\t\tflags\n\t\t, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, sz\n\t);\n\n\treturn p;\n}\n\ninline void dbg_rtw_vmfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)\n{\n\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\n\t_rtw_vmfree((pbuf), (sz)); \n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, sz\n\t);\n}\n\ninline u8* dbg_rtw_malloc(u32 sz, const enum mstat_f flags, const char *func, const int line) \n{\n\tu8 *p;\n\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\n\tp=_rtw_malloc((sz));\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, sz\n\t);\n\n\treturn p;\n}\n\ninline u8* dbg_rtw_zmalloc(u32 sz, const enum mstat_f flags, const char *func, const int line)\n{\n\tu8 *p;\n\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\n\tp = _rtw_zmalloc((sz));\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, sz\n\t);\n\n\treturn p;\n}\n\ninline void dbg_rtw_mfree(u8 *pbuf, u32 sz, const enum mstat_f flags, const char *func, const int line)\n{\n\tif (match_mstat_sniff_rules(flags, sz))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d)\\n\", func, line, __FUNCTION__, (sz));\n\n\t_rtw_mfree((pbuf), (sz));\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, sz\n\t);\n}\n\ninline struct sk_buff * dbg_rtw_skb_alloc(unsigned int size, const enum mstat_f flags, const char *func, int line)\n{\n\tstruct sk_buff *skb;\n\tunsigned int truesize = 0;\n\n\tskb = _rtw_skb_alloc(size);\n\n\tif(skb)\n\t\ttruesize = skb->truesize;\n\n\tif(!skb || truesize < size || match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%d), skb:%p, truesize=%u\\n\", func, line, __FUNCTION__, size, skb, truesize);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, skb ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, truesize\n\t);\n\n\treturn skb;\n}\n\ninline void dbg_rtw_skb_free(struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)\n{\n\tunsigned int truesize = skb->truesize;\n\n\tif(match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s, truesize=%u\\n\", func, line, __FUNCTION__, truesize);\n\n\t_rtw_skb_free(skb);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, truesize\n\t);\n}\n\ninline struct sk_buff *dbg_rtw_skb_copy(const struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)\n{\n\tstruct sk_buff *skb_cp;\n\tunsigned int truesize = skb->truesize;\n\tunsigned int cp_truesize = 0;\n\t\n\tskb_cp = _rtw_skb_copy(skb);\n\tif(skb_cp)\n\t\tcp_truesize = skb_cp->truesize;\n\n\tif(!skb_cp || cp_truesize < truesize || match_mstat_sniff_rules(flags, cp_truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%u), skb_cp:%p, cp_truesize=%u\\n\", func, line, __FUNCTION__, truesize, skb_cp, cp_truesize);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, skb_cp ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, truesize\n\t);\n\n\treturn skb_cp;\n}\n\ninline struct sk_buff *dbg_rtw_skb_clone(struct sk_buff *skb, const enum mstat_f flags, const char *func, const int line)\n{\n\tstruct sk_buff *skb_cl;\n\tunsigned int truesize = skb->truesize;\n\tunsigned int cl_truesize = 0;\n\n\tskb_cl = _rtw_skb_clone(skb);\n\tif(skb_cl)\n\t\tcl_truesize = skb_cl->truesize;\n\n\tif(!skb_cl || cl_truesize < truesize || match_mstat_sniff_rules(flags, cl_truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%u), skb_cl:%p, cl_truesize=%u\\n\", func, line, __FUNCTION__, truesize, skb_cl, cl_truesize);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, skb_cl ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, truesize\n\t);\n\n\treturn skb_cl;\n}\n\ninline int dbg_rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb, const enum mstat_f flags, const char *func, int line)\n{\n\tint ret;\n\tunsigned int truesize = skb->truesize;\n\n\tif(match_mstat_sniff_rules(flags, truesize))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s, truesize=%u\\n\", func, line, __FUNCTION__, truesize);\n\n\tret = _rtw_netif_rx(ndev, skb);\n\t\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, truesize\n\t);\n\n\treturn ret;\n}\n\ninline void dbg_rtw_skb_queue_purge(struct sk_buff_head *list, enum mstat_f flags, const char *func, int line)\n{\n\tstruct sk_buff *skb;\n\n\twhile ((skb = skb_dequeue(list)) != NULL)\n\t\tdbg_rtw_skb_free(skb, flags, func, line);\n}\n\n#ifdef CONFIG_USB_HCI\ninline void *dbg_rtw_usb_buffer_alloc(struct usb_device *dev, size_t size, dma_addr_t *dma, const enum mstat_f flags, const char *func, int line)\n{\n\tvoid *p;\n\n\tif(match_mstat_sniff_rules(flags, size))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%zu)\\n\", func, line, __FUNCTION__, size);\n\n\tp = _rtw_usb_buffer_alloc(dev, size, dma);\n\t\n\trtw_mstat_update(\n\t\tflags\n\t\t, p ? MSTAT_ALLOC_SUCCESS : MSTAT_ALLOC_FAIL\n\t\t, size\n\t);\n\n\treturn p;\n}\n\ninline void dbg_rtw_usb_buffer_free(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma, const enum mstat_f flags, const char *func, int line)\n{\n\n\tif(match_mstat_sniff_rules(flags, size))\n\t\tDBG_871X(\"DBG_MEM_ALLOC %s:%d %s(%zu)\\n\", func, line, __FUNCTION__, size);\n\n\t_rtw_usb_buffer_free(dev, size, addr, dma);\n\n\trtw_mstat_update(\n\t\tflags\n\t\t, MSTAT_FREE\n\t\t, size\n\t);\n}\n#endif /* CONFIG_USB_HCI */\n\n#endif /* defined(DBG_MEM_ALLOC) */\n\nvoid* rtw_malloc2d(int h, int w, size_t size)\n{\n\tint j;\n\n\tvoid **a = (void **) rtw_zmalloc( h*sizeof(void *) + h*w*size );\n\tif(a == NULL)\n\t{\n\t\tDBG_871X(\"%s: alloc memory fail!\\n\", __FUNCTION__);\n\t\treturn NULL;\n\t}\n\n\tfor( j=0; j<h; j++ )\n\t\ta[j] = ((char *)(a+h)) + j*w*size;\n\n\treturn a;\n}\n\nvoid rtw_mfree2d(void *pbuf, int h, int w, int size)\n{\n\trtw_mfree((u8 *)pbuf, h*sizeof(void*) + w*h*size);\n}\n\nvoid _rtw_memcpy(void *dst, const void *src, u32 sz)\n{\n\n#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)\n\n\tmemcpy(dst, src, sz);\n\n#endif\t\n\n#ifdef PLATFORM_WINDOWS\n\n\tNdisMoveMemory(dst, src, sz);\n\n#endif\n\n}\n\nint\t_rtw_memcmp(void *dst, void *src, u32 sz)\n{\n\n#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)\n//under Linux/GNU/GLibc, the return value of memcmp for two same mem. chunk is 0\n\n\tif (!(memcmp(dst, src, sz)))\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n#endif\n\n\n#ifdef PLATFORM_WINDOWS\n//under Windows, the return value of NdisEqualMemory for two same mem. chunk is 1\n\t\n\tif (NdisEqualMemory (dst, src, sz))\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n\n#endif\t\n\t\n\t\n\t\n}\n\nvoid _rtw_memset(void *pbuf, int c, u32 sz)\n{\n\n#if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD)\n\n        memset(pbuf, c, sz);\n\n#endif\n\n#ifdef PLATFORM_WINDOWS\n#if 0\n\tNdisZeroMemory(pbuf, sz);\n\tif (c != 0) memset(pbuf, c, sz);\n#else\n\tNdisFillMemory(pbuf, sz, c);\n#endif\n#endif\n\n}\n\n#ifdef PLATFORM_FREEBSD\nstatic inline void __list_add(_list *pnew, _list *pprev, _list *pnext)\n {\n         pnext->prev = pnew;\n         pnew->next = pnext;\n         pnew->prev = pprev;\n         pprev->next = pnew;\n}\n#endif /* PLATFORM_FREEBSD */\n\n\nvoid _rtw_init_listhead(_list *list)\n{\n\n#ifdef PLATFORM_LINUX\n\n        INIT_LIST_HEAD(list);\n\n#endif\n\n#ifdef PLATFORM_FREEBSD\n         list->next = list;\n         list->prev = list;\n#endif\n#ifdef PLATFORM_WINDOWS\n\n        NdisInitializeListHead(list);\n\n#endif\n\n}\n\n\n/*\nFor the following list_xxx operations, \ncaller must guarantee the atomic context.\nOtherwise, there will be racing condition.\n*/\nu32\trtw_is_list_empty(_list *phead)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tif (list_empty(phead))\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\n\tif (phead->next == phead)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n\n#endif\n\n\n#ifdef PLATFORM_WINDOWS\n\n\tif (IsListEmpty(phead))\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n\n#endif\n\n\t\n}\n\nvoid rtw_list_insert_head(_list *plist, _list *phead)\n{\n\n#ifdef PLATFORM_LINUX\n\tlist_add(plist, phead);\n#endif\n\n#ifdef PLATFORM_FREEBSD\n\t__list_add(plist, phead, phead->next);\n#endif\n\n#ifdef PLATFORM_WINDOWS\n\tInsertHeadList(phead, plist);\n#endif\n}\n\nvoid rtw_list_insert_tail(_list *plist, _list *phead)\n{\n\n#ifdef PLATFORM_LINUX\t\n\t\n\tlist_add_tail(plist, phead);\n\t\n#endif\n#ifdef PLATFORM_FREEBSD\n\t\n\t__list_add(plist, phead->prev, phead);\n\t\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n  InsertTailList(phead, plist);\n\n#endif\t\t\n\t\n}\n\nvoid rtw_init_timer(_timer *ptimer, void *padapter, void *pfunc)\n{\n\t_adapter *adapter = (_adapter *)padapter;\t\n\n#ifdef PLATFORM_LINUX\n\t_init_timer(ptimer, adapter->pnetdev, pfunc, adapter);\n#endif\n#ifdef PLATFORM_FREEBSD\n\t_init_timer(ptimer, adapter->pifp, pfunc, adapter->mlmepriv.nic_hdl);\n#endif\n#ifdef PLATFORM_WINDOWS\n\t_init_timer(ptimer, adapter->hndis_adapter, pfunc, adapter->mlmepriv.nic_hdl);\n#endif\n}\n\n/*\n\nCaller must check if the list is empty before calling rtw_list_delete\n\n*/\n\n\nvoid _rtw_init_sema(_sema\t*sema, int init_val)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tsema_init(sema, init_val);\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tsema_init(sema, init_val, \"rtw_drv\");\n#endif\n#ifdef PLATFORM_OS_XP\n\n\tKeInitializeSemaphore(sema, init_val,  SEMA_UPBND); // count=0;\n\n#endif\n\t\n#ifdef PLATFORM_OS_CE\n\tif(*sema == NULL)\n\t\t*sema = CreateSemaphore(NULL, init_val, SEMA_UPBND, NULL);\n#endif\n\n}\n\nvoid _rtw_free_sema(_sema\t*sema)\n{\n#ifdef PLATFORM_FREEBSD\n\tsema_destroy(sema);\n#endif\n#ifdef PLATFORM_OS_CE\n\tCloseHandle(*sema);\n#endif\n\n}\n\nvoid _rtw_up_sema(_sema\t*sema)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tup(sema);\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tsema_post(sema);\n#endif\n#ifdef PLATFORM_OS_XP\n\n\tKeReleaseSemaphore(sema, IO_NETWORK_INCREMENT, 1,  FALSE );\n\n#endif\n\n#ifdef PLATFORM_OS_CE\n\tReleaseSemaphore(*sema,  1,  NULL );\n#endif\n}\n\nu32 _rtw_down_sema(_sema *sema)\n{\n\n#ifdef PLATFORM_LINUX\n\t\n\tif (down_interruptible(sema))\n\t\treturn _FAIL;\n\telse\n\t\treturn _SUCCESS;\n\n#endif    \t\n#ifdef PLATFORM_FREEBSD\n\tsema_wait(sema);\n\treturn  _SUCCESS;\n#endif\n#ifdef PLATFORM_OS_XP\n\n\tif(STATUS_SUCCESS == KeWaitForSingleObject(sema, Executive, KernelMode, TRUE, NULL))\n\t\treturn  _SUCCESS;\n\telse\n\t\treturn _FAIL;\n#endif\n\n#ifdef PLATFORM_OS_CE\n\tif(WAIT_OBJECT_0 == WaitForSingleObject(*sema, INFINITE ))\n\t\treturn _SUCCESS; \n\telse\n\t\treturn _FAIL;\n#endif\n}\n\n\n\nvoid\t_rtw_mutex_init(_mutex *pmutex)\n{\n#ifdef PLATFORM_LINUX\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\tmutex_init(pmutex);\n#else\n\tinit_MUTEX(pmutex);\n#endif\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tmtx_init(pmutex, \"\", NULL, MTX_DEF|MTX_RECURSE);\n#endif\n#ifdef PLATFORM_OS_XP\n\n\tKeInitializeMutex(pmutex, 0);\n\n#endif\n\n#ifdef PLATFORM_OS_CE\n\t*pmutex =  CreateMutex( NULL, _FALSE, NULL);\n#endif\n}\n\nvoid\t_rtw_mutex_free(_mutex *pmutex);\nvoid\t_rtw_mutex_free(_mutex *pmutex)\n{\n#ifdef PLATFORM_LINUX\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))\n\tmutex_destroy(pmutex);\n#else\t\n#endif\n\n#ifdef PLATFORM_FREEBSD\n\tsema_destroy(pmutex);\n#endif\n\n#endif\n\n#ifdef PLATFORM_OS_XP\n\n#endif\n\n#ifdef PLATFORM_OS_CE\n\n#endif\n}\n\nvoid\t_rtw_spinlock_init(_lock *plock)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tspin_lock_init(plock);\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\t\tmtx_init(plock, \"\", NULL, MTX_DEF|MTX_RECURSE);\n#endif\n#ifdef PLATFORM_WINDOWS\n\n\tNdisAllocateSpinLock(plock);\n\n#endif\n\t\n}\n\nvoid\t_rtw_spinlock_free(_lock *plock)\n{\n#ifdef PLATFORM_FREEBSD\n\t mtx_destroy(plock);\n#endif\n\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisFreeSpinLock(plock);\n\n#endif\n\t\n}\n#ifdef PLATFORM_FREEBSD\nextern PADAPTER prtw_lock;\n\nvoid rtw_mtx_lock(_lock *plock){\n\tif(prtw_lock){\n\t\tmtx_lock(&prtw_lock->glock);\n\t}\n\telse{\n\t\tprintf(\"%s prtw_lock==NULL\",__FUNCTION__);\n\t}\n}\nvoid rtw_mtx_unlock(_lock *plock){\n\tif(prtw_lock){\n\t\tmtx_unlock(&prtw_lock->glock);\n\t}\n\telse{\n\t\tprintf(\"%s prtw_lock==NULL\",__FUNCTION__);\n\t}\n\t\n}\n#endif //PLATFORM_FREEBSD\n\n\nvoid\t_rtw_spinlock(_lock\t*plock)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tspin_lock(plock);\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tmtx_lock(plock);\n#endif\n#ifdef PLATFORM_WINDOWS\n\n\tNdisAcquireSpinLock(plock);\n\n#endif\n\t\n}\n\nvoid\t_rtw_spinunlock(_lock *plock)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tspin_unlock(plock);\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tmtx_unlock(plock);\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisReleaseSpinLock(plock);\n\n#endif\n}\n\n\nvoid\t_rtw_spinlock_ex(_lock\t*plock)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tspin_lock(plock);\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tmtx_lock(plock);\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisDprAcquireSpinLock(plock);\n\n#endif\n\t\n}\n\nvoid\t_rtw_spinunlock_ex(_lock *plock)\n{\n\n#ifdef PLATFORM_LINUX\n\n\tspin_unlock(plock);\n\n#endif\n#ifdef PLATFORM_FREEBSD\n\tmtx_unlock(plock);\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisDprReleaseSpinLock(plock);\n\n#endif\n}\n\n\n\nvoid\t_rtw_init_queue(_queue\t*pqueue)\n{\n\n\t_rtw_init_listhead(&(pqueue->queue));\n\n\t_rtw_spinlock_init(&(pqueue->lock));\n\n}\n\nu32\t  _rtw_queue_empty(_queue\t*pqueue)\n{\n\treturn (rtw_is_list_empty(&(pqueue->queue)));\n}\n\n\nu32 rtw_end_of_queue_search(_list *head, _list *plist)\n{\n\tif (head == plist)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n}\n\n\nu32\trtw_get_current_time(void)\n{\n\t\n#ifdef PLATFORM_LINUX\n\treturn jiffies;\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tstruct timeval tvp;\n\tgetmicrotime(&tvp);\n\treturn tvp.tv_sec;\n#endif\n#ifdef PLATFORM_WINDOWS\n\tLARGE_INTEGER\tSystemTime;\n\tNdisGetCurrentSystemTime(&SystemTime);\n\treturn (u32)(SystemTime.LowPart);// count of 100-nanosecond intervals \n#endif\n}\n\ninline u32 rtw_systime_to_ms(u32 systime)\n{\n#ifdef PLATFORM_LINUX\n\treturn systime * 1000 / HZ;\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\treturn systime * 1000;\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\treturn systime / 10000 ; \n#endif\n}\n\ninline u32 rtw_ms_to_systime(u32 ms)\n{\n#ifdef PLATFORM_LINUX\n\treturn ms * HZ / 1000;\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\treturn ms /1000;\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\treturn ms * 10000 ; \n#endif\n}\n\n// the input parameter start use the same unit as returned by rtw_get_current_time\ninline s32 rtw_get_passing_time_ms(u32 start)\n{\n#ifdef PLATFORM_LINUX\n\treturn rtw_systime_to_ms(jiffies-start);\n#endif\n#ifdef PLATFORM_FREEBSD\n\treturn rtw_systime_to_ms(rtw_get_current_time());\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\tLARGE_INTEGER\tSystemTime;\n\tNdisGetCurrentSystemTime(&SystemTime);\n\treturn rtw_systime_to_ms((u32)(SystemTime.LowPart) - start) ;\n#endif\n}\n\ninline s32 rtw_get_time_interval_ms(u32 start, u32 end)\n{\n#ifdef PLATFORM_LINUX\n\treturn rtw_systime_to_ms(end-start);\n#endif\n#ifdef PLATFORM_FREEBSD\n\treturn rtw_systime_to_ms(rtw_get_current_time());\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\treturn rtw_systime_to_ms(end-start);\n#endif\n}\n\t\n\nvoid rtw_sleep_schedulable(int ms)\t\n{\n\n#ifdef PLATFORM_LINUX\n\n    u32 delta;\n    \n    delta = (ms * HZ)/1000;//(ms)\n    if (delta == 0) {\n        delta = 1;// 1 ms\n    }\n    set_current_state(TASK_INTERRUPTIBLE);\n    if (schedule_timeout(delta) != 0) {\n        return ;\n    }\n    return;\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tDELAY(ms*1000);\n\treturn ;\n#endif\t\n\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisMSleep(ms*1000); //(us)*1000=(ms)\n\n#endif\n\n}\n\n\nvoid rtw_msleep_os(int ms)\n{\n\n#ifdef PLATFORM_LINUX\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36))\n\tif (ms < 20) {\n\t\tunsigned long us = ms * 1000UL;\n\t\tusleep_range(us, us + 1000UL);\n\t} else\n\t#endif\n  \tmsleep((unsigned int)ms);\n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n       //Delay for delay microseconds \n\tDELAY(ms*1000);\n\treturn ;\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisMSleep(ms*1000); //(us)*1000=(ms)\n\n#endif\n\n\n}\nvoid rtw_usleep_os(int us)\n{\n#ifdef PLATFORM_LINUX\n\n\t// msleep((unsigned int)us);\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36))\n\tusleep_range(us, us + 1);\t\n\t#else\n\tif ( 1 < (us/1000) )\n      \t\tmsleep(1);\n      else\n\t\tmsleep( (us/1000) + 1);\n\t#endif\n#endif\n\n#ifdef PLATFORM_FREEBSD\n\t//Delay for delay microseconds \n\tDELAY(us);\n\n\treturn ;\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisMSleep(us); //(us)\n\n#endif\n\n\n}\n\n\n#ifdef DBG_DELAY_OS\nvoid _rtw_mdelay_os(int ms, const char *func, const int line)\n{\n\t#if 0\n\tif(ms>10)\n\t\tDBG_871X(\"%s:%d %s(%d)\\n\", func, line, __FUNCTION__, ms);\n\t\trtw_msleep_os(ms);\n\treturn;\n\t#endif\n\n\n\tDBG_871X(\"%s:%d %s(%d)\\n\", func, line, __FUNCTION__, ms);\n\n#if defined(PLATFORM_LINUX)\n\n   \tmdelay((unsigned long)ms); \n\n#elif defined(PLATFORM_WINDOWS)\n\n\tNdisStallExecution(ms*1000); //(us)*1000=(ms)\n\n#endif\n\n\n}\nvoid _rtw_udelay_os(int us, const char *func, const int line)\n{\n\n\t#if 0\n\tif(us > 1000) {\n\tDBG_871X(\"%s:%d %s(%d)\\n\", func, line, __FUNCTION__, us);\n\t\trtw_usleep_os(us);\n\t\treturn;\n\t}\n\t#endif \n\n\n\tDBG_871X(\"%s:%d %s(%d)\\n\", func, line, __FUNCTION__, us);\n\t\n\t\n#if defined(PLATFORM_LINUX)\n\n      udelay((unsigned long)us); \n\n#elif defined(PLATFORM_WINDOWS)\n\n\tNdisStallExecution(us); //(us)\n\n#endif\n\n}\n#else\nvoid rtw_mdelay_os(int ms)\n{\n\n#ifdef PLATFORM_LINUX\n\n   \tmdelay((unsigned long)ms); \n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\tDELAY(ms*1000);\n\treturn ;\n#endif\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisStallExecution(ms*1000); //(us)*1000=(ms)\n\n#endif\n\n\n}\nvoid rtw_udelay_os(int us)\n{\n\n#ifdef PLATFORM_LINUX\n\n      udelay((unsigned long)us); \n\n#endif\t\n#ifdef PLATFORM_FREEBSD\n\t//Delay for delay microseconds \n\tDELAY(us);\n\treturn ;\n#endif\t\t\n#ifdef PLATFORM_WINDOWS\n\n\tNdisStallExecution(us); //(us)\n\n#endif\n\n}\n#endif\n\nvoid rtw_yield_os(void)\n{\n#ifdef PLATFORM_LINUX\n\tyield();\n#endif\n#ifdef PLATFORM_FREEBSD\n\tyield();\n#endif\n#ifdef PLATFORM_WINDOWS\n\tSwitchToThread();\n#endif\n}\n\n#define RTW_SUSPEND_LOCK_NAME \"rtw_wifi\"\n#define RTW_SUSPEND_EXT_LOCK_NAME \"rtw_wifi_ext\"\n#define RTW_SUSPEND_RX_LOCK_NAME \"rtw_wifi_rx\"\n#define RTW_SUSPEND_TRAFFIC_LOCK_NAME \"rtw_wifi_traffic\"\n#define RTW_SUSPEND_RESUME_LOCK_NAME \"rtw_wifi_resume\"\n#define RTW_RESUME_SCAN_LOCK_NAME \"rtw_wifi_scan\"\n#ifdef CONFIG_WAKELOCK\nstatic struct wake_lock rtw_suspend_lock;\nstatic struct wake_lock rtw_suspend_ext_lock;\nstatic struct wake_lock rtw_suspend_rx_lock;\nstatic struct wake_lock rtw_suspend_traffic_lock;\nstatic struct wake_lock rtw_suspend_resume_lock;\nstatic struct wake_lock rtw_resume_scan_lock;\n#elif defined(CONFIG_ANDROID_POWER)\nstatic android_suspend_lock_t rtw_suspend_lock ={\n\t.name = RTW_SUSPEND_LOCK_NAME\n};\nstatic android_suspend_lock_t rtw_suspend_ext_lock ={\n\t.name = RTW_SUSPEND_EXT_LOCK_NAME\n};\nstatic android_suspend_lock_t rtw_suspend_rx_lock ={\n\t.name = RTW_SUSPEND_RX_LOCK_NAME\n};\nstatic android_suspend_lock_t rtw_suspend_traffic_lock ={\n\t.name = RTW_SUSPEND_TRAFFIC_LOCK_NAME\n};\nstatic android_suspend_lock_t rtw_suspend_resume_lock ={\n\t.name = RTW_SUSPEND_RESUME_LOCK_NAME\n};\nstatic android_suspend_lock_t rtw_resume_scan_lock ={\n\t.name = RTW_RESUME_SCAN_LOCK_NAME\n};\n#endif\n\ninline void rtw_suspend_lock_init(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_init(&rtw_suspend_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_LOCK_NAME);\n\twake_lock_init(&rtw_suspend_ext_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_EXT_LOCK_NAME);\n\twake_lock_init(&rtw_suspend_rx_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_RX_LOCK_NAME);\n\twake_lock_init(&rtw_suspend_traffic_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_TRAFFIC_LOCK_NAME);\n\twake_lock_init(&rtw_suspend_resume_lock, WAKE_LOCK_SUSPEND, RTW_SUSPEND_RESUME_LOCK_NAME);\n\twake_lock_init(&rtw_resume_scan_lock, WAKE_LOCK_SUSPEND, RTW_RESUME_SCAN_LOCK_NAME);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_init_suspend_lock(&rtw_suspend_lock);\n\tandroid_init_suspend_lock(&rtw_suspend_ext_lock);\n\tandroid_init_suspend_lock(&rtw_suspend_rx_lock);\n\tandroid_init_suspend_lock(&rtw_suspend_traffic_lock);\n\tandroid_init_suspend_lock(&rtw_suspend_resume_lock);\n\tandroid_init_suspend_lock(&rtw_resume_scan_lock);\n\t#endif\n}\n\ninline void rtw_suspend_lock_uninit(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_destroy(&rtw_suspend_lock);\n\twake_lock_destroy(&rtw_suspend_ext_lock);\n\twake_lock_destroy(&rtw_suspend_rx_lock);\n\twake_lock_destroy(&rtw_suspend_traffic_lock);\n\twake_lock_destroy(&rtw_suspend_resume_lock);\n\twake_lock_destroy(&rtw_resume_scan_lock);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_uninit_suspend_lock(&rtw_suspend_lock);\n\tandroid_uninit_suspend_lock(&rtw_suspend_ext_lock);\n\tandroid_uninit_suspend_lock(&rtw_suspend_rx_lock);\n\tandroid_uninit_suspend_lock(&rtw_suspend_traffic_lock);\n\tandroid_uninit_suspend_lock(&rtw_suspend_resume_lock);\n\tandroid_uninit_suspend_lock(&rtw_resume_scan_lock);\n\t#endif\n}\n\ninline void rtw_lock_suspend(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock(&rtw_suspend_lock);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend(&rtw_suspend_lock);\n\t#endif\n\n\t#if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)\n\t//DBG_871X(\"####%s: suspend_lock_count:%d####\\n\", __FUNCTION__, rtw_suspend_lock.stat.count);\n\t#endif\n}\n\ninline void rtw_unlock_suspend(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_unlock(&rtw_suspend_lock);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_unlock_suspend(&rtw_suspend_lock);\n\t#endif\n\n\t#if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)\n\t//DBG_871X(\"####%s: suspend_lock_count:%d####\\n\", __FUNCTION__, rtw_suspend_lock.stat.count);\n\t#endif\n}\n\ninline void rtw_resume_lock_suspend(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock(&rtw_suspend_resume_lock);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend(&rtw_suspend_resume_lock);\n\t#endif\n\n\t#if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)\n\t//DBG_871X(\"####%s: suspend_lock_count:%d####\\n\", __FUNCTION__, rtw_suspend_lock.stat.count);\n\t#endif\n}\n\ninline void rtw_resume_unlock_suspend(void)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_unlock(&rtw_suspend_resume_lock);\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_unlock_suspend(&rtw_suspend_resume_lock);\n\t#endif\n\n\t#if  defined(CONFIG_WAKELOCK) || defined(CONFIG_ANDROID_POWER)\n\t//DBG_871X(\"####%s: suspend_lock_count:%d####\\n\", __FUNCTION__, rtw_suspend_lock.stat.count);\n\t#endif\n}\n\ninline void rtw_lock_suspend_timeout(u32 timeout_ms)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_timeout(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms));\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend_auto_expire(&rtw_suspend_lock, rtw_ms_to_systime(timeout_ms));\n\t#endif\n}\n\ninline void rtw_lock_ext_suspend_timeout(u32 timeout_ms)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_timeout(&rtw_suspend_ext_lock, rtw_ms_to_systime(timeout_ms));\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend_auto_expire(&rtw_suspend_ext_lock, rtw_ms_to_systime(timeout_ms));\n\t#endif\n\t//DBG_871X(\"EXT lock timeout:%d\\n\", timeout_ms);\n}\n\ninline void rtw_lock_rx_suspend_timeout(u32 timeout_ms)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_timeout(&rtw_suspend_rx_lock, rtw_ms_to_systime(timeout_ms));\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend_auto_expire(&rtw_suspend_rx_lock, rtw_ms_to_systime(timeout_ms));\n\t#endif\n\t//DBG_871X(\"RX lock timeout:%d\\n\", timeout_ms);\n}\n\n\ninline void rtw_lock_traffic_suspend_timeout(u32 timeout_ms)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_timeout(&rtw_suspend_traffic_lock, rtw_ms_to_systime(timeout_ms));\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend_auto_expire(&rtw_suspend_traffic_lock, rtw_ms_to_systime(timeout_ms));\n\t#endif\n\t//DBG_871X(\"traffic lock timeout:%d\\n\", timeout_ms);\n}\n\ninline void rtw_lock_resume_scan_timeout(u32 timeout_ms)\n{\n\t#ifdef CONFIG_WAKELOCK\n\twake_lock_timeout(&rtw_resume_scan_lock, rtw_ms_to_systime(timeout_ms));\n\t#elif defined(CONFIG_ANDROID_POWER)\n\tandroid_lock_suspend_auto_expire(&rtw_resume_scan_lock, rtw_ms_to_systime(timeout_ms));\n\t#endif\n\t//DBG_871X(\"resume scan lock:%d\\n\", timeout_ms);\n}\n\ninline void ATOMIC_SET(ATOMIC_T *v, int i)\n{\n\t#ifdef PLATFORM_LINUX\n\tatomic_set(v,i);\n\t#elif defined(PLATFORM_WINDOWS)\n\t*v=i;// other choice????\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_set_int(v,i);\n\t#endif\n}\n\ninline int ATOMIC_READ(ATOMIC_T *v)\n{\n\t#ifdef PLATFORM_LINUX\n\treturn atomic_read(v);\n\t#elif defined(PLATFORM_WINDOWS)\n\treturn *v; // other choice????\n\t#elif defined(PLATFORM_FREEBSD)\n\treturn atomic_load_acq_32(v);\n\t#endif\n}\n\ninline void ATOMIC_ADD(ATOMIC_T *v, int i)\n{\n\t#ifdef PLATFORM_LINUX\n\tatomic_add(i,v);\n\t#elif defined(PLATFORM_WINDOWS)\n\tInterlockedAdd(v,i);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_add_int(v,i);\n\t#endif\n}\ninline void ATOMIC_SUB(ATOMIC_T *v, int i)\n{\n\t#ifdef PLATFORM_LINUX\n\tatomic_sub(i,v);\n\t#elif defined(PLATFORM_WINDOWS)\n\tInterlockedAdd(v,-i);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_subtract_int(v,i);\n\t#endif\n}\n\ninline void ATOMIC_INC(ATOMIC_T *v)\n{\n\t#ifdef PLATFORM_LINUX\n\tatomic_inc(v);\n\t#elif defined(PLATFORM_WINDOWS)\n\tInterlockedIncrement(v);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_add_int(v,1);\n\t#endif\n}\n\ninline void ATOMIC_DEC(ATOMIC_T *v)\n{\n\t#ifdef PLATFORM_LINUX\n\tatomic_dec(v);\n\t#elif defined(PLATFORM_WINDOWS)\n\tInterlockedDecrement(v);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_subtract_int(v,1);\n\t#endif\n}\n\ninline int ATOMIC_ADD_RETURN(ATOMIC_T *v, int i)\n{\n\t#ifdef PLATFORM_LINUX\n\treturn atomic_add_return(i,v);\n\t#elif defined(PLATFORM_WINDOWS)\n\treturn InterlockedAdd(v,i);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_add_int(v,i);\n\treturn atomic_load_acq_32(v);\n\t#endif\n}\n\ninline int ATOMIC_SUB_RETURN(ATOMIC_T *v, int i)\n{\n\t#ifdef PLATFORM_LINUX\n\treturn atomic_sub_return(i,v);\n\t#elif defined(PLATFORM_WINDOWS)\n\treturn InterlockedAdd(v,-i);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_subtract_int(v,i);\n\treturn atomic_load_acq_32(v);\n\t#endif\n}\n\ninline int ATOMIC_INC_RETURN(ATOMIC_T *v)\n{\n\t#ifdef PLATFORM_LINUX\n\treturn atomic_inc_return(v);\n\t#elif defined(PLATFORM_WINDOWS)\n\treturn InterlockedIncrement(v);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_add_int(v,1);\n\treturn atomic_load_acq_32(v);\n\t#endif\n}\n\ninline int ATOMIC_DEC_RETURN(ATOMIC_T *v)\n{\n\t#ifdef PLATFORM_LINUX\n\treturn atomic_dec_return(v);\n\t#elif defined(PLATFORM_WINDOWS)\n\treturn InterlockedDecrement(v);\n\t#elif defined(PLATFORM_FREEBSD)\n\tatomic_subtract_int(v,1);\n\treturn atomic_load_acq_32(v);\n\t#endif\n}\n\n\n#ifdef PLATFORM_LINUX\n/*\n* Open a file with the specific @param path, @param flag, @param mode\n* @param fpp the pointer of struct file pointer to get struct file pointer while file opening is success\n* @param path the path of the file to open\n* @param flag file operation flags, please refer to linux document\n* @param mode please refer to linux document\n* @return Linux specific error code\n*/\nstatic int openFile(struct file **fpp, char *path, int flag, int mode) \n{ \n\tstruct file *fp; \n \n\tfp=filp_open(path, flag, mode); \n\tif(IS_ERR(fp)) {\n\t\t*fpp=NULL;\n\t\treturn PTR_ERR(fp);\n\t}\n\telse {\n\t\t*fpp=fp; \n\t\treturn 0;\n\t}\t\n}\n\n/*\n* Close the file with the specific @param fp\n* @param fp the pointer of struct file to close\n* @return always 0\n*/\nstatic int closeFile(struct file *fp) \n{ \n\tfilp_close(fp,NULL);\n\treturn 0; \n}\n\nstatic int readFile(struct file *fp,char *buf,int len) \n{ \n\tint rlen=0, sum=0;\n\t\n\tif (!fp->f_op || !fp->f_op->read) \n\t\treturn -EPERM;\n\n\twhile(sum<len) {\n\t\trlen=fp->f_op->read(fp,buf+sum,len-sum, &fp->f_pos);\n\t\tif(rlen>0)\n\t\t\tsum+=rlen;\n\t\telse if(0 != rlen)\n\t\t\treturn rlen;\n\t\telse\n\t\t\tbreak;\n\t}\n\t\n\treturn  sum;\n\n}\n\nstatic int writeFile(struct file *fp,char *buf,int len) \n{ \n\tint wlen=0, sum=0;\n\t\n\tif (!fp->f_op || !fp->f_op->write) \n\t\treturn -EPERM; \n\n\twhile(sum<len) {\n\t\twlen=fp->f_op->write(fp,buf+sum,len-sum, &fp->f_pos);\n\t\tif(wlen>0)\n\t\t\tsum+=wlen;\n\t\telse if(0 != wlen)\n\t\t\treturn wlen;\n\t\telse\n\t\t\tbreak;\n\t}\n\n\treturn sum;\n\n}\n\n/*\n* Test if the specifi @param path is a file and readable\n* @param path the path of the file to test\n* @return Linux specific error code\n*/\nstatic int isFileReadable(char *path)\n{ \n\tstruct file *fp;\n\tint ret = 0;\n\tmm_segment_t oldfs;\n\tchar buf;\n \n\tfp=filp_open(path, O_RDONLY, 0); \n\tif(IS_ERR(fp)) {\n\t\tret = PTR_ERR(fp);\n\t}\n\telse {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0))\n\t\toldfs = get_fs(); set_fs(KERNEL_DS);\n#else\n\t\toldfs = get_fs(); set_fs(get_ds());\n#endif\n\t\t\n\t\tif(1!=readFile(fp, &buf, 1))\n\t\t\tret = PTR_ERR(fp);\n\t\t\n\t\tset_fs(oldfs);\n\t\tfilp_close(fp,NULL);\n\t}\t\n\treturn ret;\n}\n\n/*\n* Open the file with @param path and retrive the file content into memory starting from @param buf for @param sz at most\n* @param path the path of the file to open and read\n* @param buf the starting address of the buffer to store file content\n* @param sz how many bytes to read at most\n* @return the byte we've read, or Linux specific error code\n*/\nstatic int retriveFromFile(char *path, u8* buf, u32 sz)\n{\n\tint ret =-1;\n\tmm_segment_t oldfs;\n\tstruct file *fp;\n\n\tif(path && buf) {\n\t\tif( 0 == (ret=openFile(&fp,path, O_RDONLY, 0)) ){\n\t\t\tDBG_871X(\"%s openFile path:%s fp=%p\\n\",__FUNCTION__, path ,fp);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0))\n\t\t\toldfs = get_fs(); set_fs(KERNEL_DS);\n#else\n\t\t\toldfs = get_fs(); set_fs(get_ds());\n#endif\n\t\t\tret=readFile(fp, buf, sz);\n\t\t\tset_fs(oldfs);\n\t\t\tcloseFile(fp);\n\t\t\t\n\t\t\tDBG_871X(\"%s readFile, ret:%d\\n\",__FUNCTION__, ret);\n\t\t\t\n\t\t} else {\n\t\t\tDBG_871X(\"%s openFile path:%s Fail, ret:%d\\n\",__FUNCTION__, path, ret);\n\t\t}\n\t} else {\n\t\tDBG_871X(\"%s NULL pointer\\n\",__FUNCTION__);\n\t\tret =  -EINVAL;\n\t}\n\treturn ret;\n}\n\n/*\n* Open the file with @param path and wirte @param sz byte of data starting from @param buf into the file\n* @param path the path of the file to open and write\n* @param buf the starting address of the data to write into file\n* @param sz how many bytes to write at most\n* @return the byte we've written, or Linux specific error code\n*/\nstatic int storeToFile(char *path, u8* buf, u32 sz)\n{\n\tint ret =0;\n\tmm_segment_t oldfs;\n\tstruct file *fp;\n\t\n\tif(path && buf) {\n\t\tif( 0 == (ret=openFile(&fp, path, O_CREAT|O_WRONLY, 0666)) ) {\n\t\t\tDBG_871X(\"%s openFile path:%s fp=%p\\n\",__FUNCTION__, path ,fp);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0))\n\t\t\toldfs = get_fs(); set_fs(KERNEL_DS);\n#else\n\t\t\toldfs = get_fs(); set_fs(get_ds());\n#endif\n\t\t\tret=writeFile(fp, buf, sz);\n\t\t\tset_fs(oldfs);\n\t\t\tcloseFile(fp);\n\n\t\t\tDBG_871X(\"%s writeFile, ret:%d\\n\",__FUNCTION__, ret);\n\t\t\t\n\t\t} else {\n\t\t\tDBG_871X(\"%s openFile path:%s Fail, ret:%d\\n\",__FUNCTION__, path, ret);\n\t\t}\t\n\t} else {\n\t\tDBG_871X(\"%s NULL pointer\\n\",__FUNCTION__);\n\t\tret =  -EINVAL;\n\t}\n\treturn ret;\n}\n#endif //PLATFORM_LINUX\n\n/*\n* Test if the specifi @param path is a file and readable\n* @param path the path of the file to test\n* @return _TRUE or _FALSE\n*/\nint rtw_is_file_readable(char *path)\n{\n#ifdef PLATFORM_LINUX\n\tif(isFileReadable(path) == 0)\n\t\treturn _TRUE;\n\telse\n\t\treturn _FALSE;\n#else\n\t//Todo...\n\treturn _FALSE;\n#endif\n}\n\n/*\n* Open the file with @param path and retrive the file content into memory starting from @param buf for @param sz at most\n* @param path the path of the file to open and read\n* @param buf the starting address of the buffer to store file content\n* @param sz how many bytes to read at most\n* @return the byte we've read\n*/\nint rtw_retrieve_from_file(char *path, u8 *buf, u32 sz)\n{\n#ifdef PLATFORM_LINUX\n\tint ret =retriveFromFile(path, buf, sz);\n\treturn ret>=0?ret:0;\n#else\n\t//Todo...\n\treturn 0;\n#endif\n}\n\n/*\n* Open the file with @param path and wirte @param sz byte of data starting from @param buf into the file\n* @param path the path of the file to open and write\n* @param buf the starting address of the data to write into file\n* @param sz how many bytes to write at most\n* @return the byte we've written\n*/\nint rtw_store_to_file(char *path, u8* buf, u32 sz)\n{\n#ifdef PLATFORM_LINUX\n\tint ret =storeToFile(path, buf, sz);\n\treturn ret>=0?ret:0;\n#else\n\t//Todo...\n\treturn 0;\n#endif\n}\n\n#ifdef PLATFORM_LINUX\nstruct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv)\n{\n\tstruct net_device *pnetdev;\n\tstruct rtw_netdev_priv_indicator *pnpi;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tpnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);\n#else\n\tpnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));\n#endif\n\tif (!pnetdev)\n\t\tgoto RETURN;\n\t\n\tpnpi = netdev_priv(pnetdev);\n\tpnpi->priv=old_priv;\n\tpnpi->sizeof_priv=sizeof_priv;\n\nRETURN:\n\treturn pnetdev;\n}\n\nstruct net_device *rtw_alloc_etherdev(int sizeof_priv)\n{\n\tstruct net_device *pnetdev;\n\tstruct rtw_netdev_priv_indicator *pnpi;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))\n\tpnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);\n#else\n\tpnetdev = alloc_etherdev(sizeof(struct rtw_netdev_priv_indicator));\n#endif\n\tif (!pnetdev)\n\t\tgoto RETURN;\n\t\n\tpnpi = netdev_priv(pnetdev);\n\t\n\tpnpi->priv = rtw_zvmalloc(sizeof_priv);\n\tif (!pnpi->priv) {\n\t\tfree_netdev(pnetdev);\n\t\tpnetdev = NULL;\n\t\tgoto RETURN;\n\t}\n\t\n\tpnpi->sizeof_priv=sizeof_priv;\nRETURN:\n\treturn pnetdev;\n}\n\nvoid rtw_free_netdev(struct net_device * netdev)\n{\n\tstruct rtw_netdev_priv_indicator *pnpi;\n\t\n\tif(!netdev)\n\t\tgoto RETURN;\n\t\n\tpnpi = netdev_priv(netdev);\n\n\tif(!pnpi->priv)\n\t\tgoto RETURN;\n\n\tfree_netdev(netdev);\n\nRETURN:\n\treturn;\n}\n\n/*\n* Jeff: this function should be called under ioctl (rtnl_lock is accquired) while \n* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)\n*/\nint rtw_change_ifname(_adapter *padapter, const char *ifname)\n{\n\tstruct net_device *pnetdev;\n\tstruct net_device *cur_pnetdev;\n\tstruct rereg_nd_name_data *rereg_priv;\n\tint ret;\n\n\tif(!padapter)\n\t\tgoto error;\n\n\tcur_pnetdev = padapter->pnetdev;\n\trereg_priv = &padapter->rereg_nd_name_priv;\n\t\n\t//free the old_pnetdev\n\tif(rereg_priv->old_pnetdev) {\n\t\tfree_netdev(rereg_priv->old_pnetdev);\n\t\trereg_priv->old_pnetdev = NULL;\n\t}\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))\n\tif(!rtnl_is_locked())\n\t\tunregister_netdev(cur_pnetdev);\n\telse\n#endif\n\t\tunregister_netdevice(cur_pnetdev);\n\n\trereg_priv->old_pnetdev=cur_pnetdev;\n\n\tpnetdev = rtw_init_netdev(padapter);\n\tif (!pnetdev)  {\n\t\tret = -1;\n\t\tgoto error;\n\t}\n\n\tSET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter)));\n\n\trtw_init_netdev_name(pnetdev, ifname);\n\n\t_rtw_memcpy(pnetdev->dev_addr, adapter_mac_addr(padapter), ETH_ALEN);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26))\n\tif(!rtnl_is_locked())\n\t\tret = register_netdev(pnetdev);\n\telse\n#endif\n\t\tret = register_netdevice(pnetdev);\n\n\tif ( ret != 0) {\n\t\tRT_TRACE(_module_hci_intfs_c_,_drv_err_,(\"register_netdev() failed\\n\"));\n\t\tgoto error;\n\t}\n\n\treturn 0;\n\nerror:\n\t\n\treturn -1;\n\t\n}\n#endif\n\n#ifdef PLATFORM_FREEBSD\n/*\n * Copy a buffer from userspace and write into kernel address \n * space.\n *\n * This emulation just calls the FreeBSD copyin function (to \n * copy data from user space buffer into a kernel space buffer)\n * and is designed to be used with the above io_write_wrapper.\n *\n * This function should return the number of bytes not copied.\n * I.e. success results in a zero value. \n * Negative error values are not returned.\n */\nunsigned long\ncopy_from_user(void *to, const void *from, unsigned long n)\n{      \n        if ( copyin(from, to, n) != 0 ) {\n                /* Any errors will be treated as a failure\n                   to copy any of the requested bytes */\n                return n;\n        }\n\n        return 0;\n}\n\nunsigned long\ncopy_to_user(void *to, const void *from, unsigned long n)\n{\n\tif ( copyout(from, to, n) != 0 ) {\n\t\t/* Any errors will be treated as a failure\n\t\t   to copy any of the requested bytes */\n\t\treturn n;\n\t}\n\n\treturn 0;\n}\n\n\n/*\n * The usb_register and usb_deregister functions are used to register\n * usb drivers with the usb subsystem. In this compatibility layer\n * emulation a list of drivers (struct usb_driver) is maintained\n * and is used for probing/attaching etc.\n *\n * usb_register and usb_deregister simply call these functions.\n */\nint \nusb_register(struct usb_driver *driver)\n{\n        rtw_usb_linux_register(driver);\n        return 0;\n}\n\n\nint \nusb_deregister(struct usb_driver *driver)\n{\n        rtw_usb_linux_deregister(driver);\n        return 0;\n}\n\nvoid module_init_exit_wrapper(void *arg)\n{\n        int (*func)(void) = arg;\n        func();\n        return;\n}\n\n#endif //PLATFORM_FREEBSD\n\n#ifdef CONFIG_PLATFORM_SPRD\n#ifdef do_div\n#undef do_div\n#endif\n#include <asm-generic/div64.h>\n#endif\n\nu64 rtw_modular64(u64 x, u64 y)\n{\n#ifdef PLATFORM_LINUX\n\treturn do_div(x, y);\n#elif defined(PLATFORM_WINDOWS)\n\treturn (x % y);\n#elif defined(PLATFORM_FREEBSD)\n\treturn (x %y);\n#endif\n}\n\nu64 rtw_division64(u64 x, u64 y)\n{\n#ifdef PLATFORM_LINUX\n\tdo_div(x, y);\n\treturn x;\n#elif defined(PLATFORM_WINDOWS)\n\treturn (x / y);\n#elif defined(PLATFORM_FREEBSD)\n\treturn (x / y);\n#endif\n}\n\ninline u32 rtw_random32(void)\n{\n#ifdef PLATFORM_LINUX\n\t#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0))\n\treturn prandom_u32();\n\t#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,18))\n\tu32 random_int;\n\tget_random_bytes( &random_int , 4 );\n\treturn random_int;\n\t#else\n\treturn random32();\n\t#endif\n#elif defined(PLATFORM_WINDOWS)\n\t#error \"to be implemented\\n\"\n#elif defined(PLATFORM_FREEBSD)\n\t#error \"to be implemented\\n\"\n#endif\n}\n\nvoid rtw_buf_free(u8 **buf, u32 *buf_len)\n{\n\tu32 ori_len;\n\n\tif (!buf || !buf_len)\n\t\treturn;\n\n\tori_len = *buf_len;\n\n\tif (*buf) {\n\t\tu32 tmp_buf_len = *buf_len;\n\t\t*buf_len = 0;\n\t\trtw_mfree(*buf, tmp_buf_len);\n\t\t*buf = NULL;\n\t}\n}\n\nvoid rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)\n{\n\tu32 ori_len = 0, dup_len = 0;\n\tu8 *ori = NULL;\n\tu8 *dup = NULL;\n\n\tif (!buf || !buf_len)\n\t\treturn;\n\n\tif (!src || !src_len)\n\t\tgoto keep_ori;\n\n\t/* duplicate src */\n\tdup = rtw_malloc(src_len);\n\tif (dup) {\n\t\tdup_len = src_len;\n\t\t_rtw_memcpy(dup, src, dup_len);\n\t}\n\nkeep_ori:\n\tori = *buf;\n\tori_len = *buf_len;\n\n\t/* replace buf with dup */\n\t*buf_len = 0;\n\t*buf = dup;\n\t*buf_len = dup_len;\n\n\t/* free ori */\n\tif (ori && ori_len > 0)\n\t\trtw_mfree(ori, ori_len);\n}\n\n\n/**\n * rtw_cbuf_full - test if cbuf is full\n * @cbuf: pointer of struct rtw_cbuf\n *\n * Returns: _TRUE if cbuf is full\n */\ninline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)\n{\n\treturn (cbuf->write == cbuf->read-1)? _TRUE : _FALSE;\n}\n\n/**\n * rtw_cbuf_empty - test if cbuf is empty\n * @cbuf: pointer of struct rtw_cbuf\n *\n * Returns: _TRUE if cbuf is empty\n */\ninline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)\n{\n\treturn (cbuf->write == cbuf->read)? _TRUE : _FALSE;\n}\n\n/**\n * rtw_cbuf_push - push a pointer into cbuf\n * @cbuf: pointer of struct rtw_cbuf\n * @buf: pointer to push in\n *\n * Lock free operation, be careful of the use scheme\n * Returns: _TRUE push success\n */\nbool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)\n{\n\tif (rtw_cbuf_full(cbuf))\n\t\treturn _FAIL;\n\n\tif (0)\n\t\tDBG_871X(\"%s on %u\\n\", __func__, cbuf->write);\n\tcbuf->bufs[cbuf->write] = buf;\n\tcbuf->write = (cbuf->write+1)%cbuf->size;\n\n\treturn _SUCCESS;\n}\n\n/**\n * rtw_cbuf_pop - pop a pointer from cbuf\n * @cbuf: pointer of struct rtw_cbuf\n *\n * Lock free operation, be careful of the use scheme\n * Returns: pointer popped out\n */\nvoid *rtw_cbuf_pop(struct rtw_cbuf *cbuf)\n{\n\tvoid *buf;\n\tif (rtw_cbuf_empty(cbuf))\n\t\treturn NULL;\n\n\tif (0)\n\t\tDBG_871X(\"%s on %u\\n\", __func__, cbuf->read);\n\tbuf = cbuf->bufs[cbuf->read];\n\tcbuf->read = (cbuf->read+1)%cbuf->size;\n\n\treturn buf;\n}\n\n/**\n * rtw_cbuf_alloc - allocte a rtw_cbuf with given size and do initialization\n * @size: size of pointer\n *\n * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure\n */\nstruct rtw_cbuf *rtw_cbuf_alloc(u32 size)\n{\n\tstruct rtw_cbuf *cbuf;\n\n\tcbuf = (struct rtw_cbuf *)rtw_malloc(sizeof(*cbuf) + sizeof(void*)*size);\n\n\tif (cbuf) {\n\t\tcbuf->write = cbuf->read = 0;\n\t\tcbuf->size = size;\n\t}\n\n\treturn cbuf;\n}\n\n/**\n * rtw_cbuf_free - free the given rtw_cbuf\n * @cbuf: pointer of struct rtw_cbuf to free\n */\nvoid rtw_cbuf_free(struct rtw_cbuf *cbuf)\n{\n\trtw_mfree((u8*)cbuf, sizeof(*cbuf) + sizeof(void*)*cbuf->size);\n}\n\n"
  },
  {
    "path": "platform/platform_ARM_SUN50IW1P1_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*\n * Description:\n *\tThis file can be applied to following platforms:\n *\tCONFIG_PLATFORM_ARM_SUN50IW1P1\n */\n#include <drv_types.h>\n#ifdef CONFIG_GPIO_WAKEUP\n#include <linux/gpio.h>\n#endif\n\n#ifdef CONFIG_MMC\n#if defined(CONFIG_PLATFORM_ARM_SUN50IW1P1)\nextern void sunxi_mmc_rescan_card(unsigned ids);\nextern void sunxi_wlan_set_power(int on);\nextern int sunxi_wlan_get_bus_index(void);\nextern int sunxi_wlan_get_oob_irq(void);\nextern int sunxi_wlan_get_oob_irq_flags(void);\n#endif\n#ifdef CONFIG_GPIO_WAKEUP\nextern unsigned int oob_irq;\n#endif\n#endif // CONFIG_MMC\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers: power on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_MMC\n{\n\n#if defined(CONFIG_PLATFORM_ARM_SUN50IW1P1)\n\tint wlan_bus_index = sunxi_wlan_get_bus_index();\n\tif(wlan_bus_index < 0)\n\t\treturn wlan_bus_index;\n\n\tsunxi_wlan_set_power(1);\n\tmdelay(100);\n\tsunxi_mmc_rescan_card(wlan_bus_index);\n#endif\n\tDBG_871X(\"%s: power up, rescan card.\\n\", __FUNCTION__);\n\n#ifdef CONFIG_GPIO_WAKEUP\n#if defined(CONFIG_PLATFORM_ARM_SUN50IW1P1)\n\toob_irq = sunxi_wlan_get_oob_irq();\n#endif\n#endif // CONFIG_GPIO_WAKEUP\n}\n#endif // CONFIG_MMC\n\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n#ifdef CONFIG_MMC\n#if defined(CONFIG_PLATFORM_ARM_SUN50IW1P1)\n\tint wlan_bus_index = sunxi_wlan_get_bus_index();\n\tif(wlan_bus_index < 0)\n\t\treturn;\n\n\tsunxi_mmc_rescan_card(wlan_bus_index);\n\tmdelay(100);\n\tsunxi_wlan_set_power(0);\n#endif\n\tDBG_871X(\"%s: remove card, power off.\\n\", __FUNCTION__);\n#endif // CONFIG_MMC\n}\n"
  },
  {
    "path": "platform/platform_ARM_SUNnI_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*\n * Description:\n *\tThis file can be applied to following platforms:\n *\tCONFIG_PLATFORM_ARM_SUN6I\n *\tCONFIG_PLATFORM_ARM_SUN7I\n *\tCONFIG_PLATFORM_ARM_SUN8I\n */\n#include <drv_types.h>\n#include <mach/sys_config.h>\n#ifdef CONFIG_GPIO_WAKEUP\n#include <linux/gpio.h>\n#endif\n\n#ifdef CONFIG_MMC\nstatic int sdc_id = -1;\nstatic signed int gpio_eint_wlan = -1;\nstatic u32 eint_wlan_handle = 0;\n\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\nextern void sw_mci_rescan_card(unsigned id, unsigned insert);\n#elif defined(CONFIG_PLATFORM_ARM_SUN8I)\nextern void sunxi_mci_rescan_card(unsigned id, unsigned insert);\n#endif\n\n#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1\nextern int get_rf_mod_type(void);\n#else\nextern int wifi_pm_get_mod_type(void);\n#endif\n\nextern void wifi_pm_power(int on);\n#ifdef CONFIG_GPIO_WAKEUP\nextern unsigned int oob_irq;\n#endif\n#endif // CONFIG_MMC\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers: power on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_MMC\n{\n\tscript_item_u val;\n\tscript_item_value_type_e type;\n\n#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1\n\tunsigned int mod_sel = get_rf_mod_type();\n#else\n\tunsigned int mod_sel = wifi_pm_get_mod_type();\n#endif\n\n\ttype = script_get_item(\"wifi_para\", \"wifi_sdc_id\", &val);\n\tif (SCIRPT_ITEM_VALUE_TYPE_INT!=type) {\n\t\tDBG_871X(\"get wifi_sdc_id failed\\n\");\n\t\tret = -1;\n\t} else {\n\t\tsdc_id = val.val;\n\t\tDBG_871X(\"----- %s sdc_id: %d, mod_sel: %d\\n\", __FUNCTION__, sdc_id, mod_sel);\n\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\n\t\tsw_mci_rescan_card(sdc_id, 1);\n#elif defined(CONFIG_PLATFORM_ARM_SUN8I)\n\t\tsunxi_mci_rescan_card(sdc_id, 1);\n#endif\n\t\tmdelay(100);\n\t\twifi_pm_power(1);\n\n\t\tDBG_871X(\"%s: power up, rescan card.\\n\", __FUNCTION__);\n\t}\n\n#ifdef CONFIG_GPIO_WAKEUP\n#ifdef CONFIG_PLATFORM_ARM_SUN8I_W5P1\n\ttype = script_get_item(\"wifi_para\", \"wl_host_wake\", &val);\n#else\n#ifdef CONFIG_RTL8723B\n\ttype = script_get_item(\"wifi_para\", \"rtl8723bs_wl_host_wake\", &val);\n#endif\n#ifdef CONFIG_RTL8188E\n\ttype = script_get_item(\"wifi_para\", \"rtl8189es_host_wake\", &val);\n#endif\n#endif /* CONFIG_PLATFORM_ARM_SUN8I_W5P1 */\n\tif (SCIRPT_ITEM_VALUE_TYPE_PIO != type) {\n\t\tDBG_871X(\"No definition of wake up host PIN\\n\");\n\t\tret = -1;\n\t} else {\n\t\tgpio_eint_wlan = val.gpio.gpio;\n#ifdef CONFIG_PLATFORM_ARM_SUN8I\n\t\toob_irq = gpio_to_irq(gpio_eint_wlan);\n#endif\n\t}\n#endif // CONFIG_GPIO_WAKEUP\n}\n#endif // CONFIG_MMC\n\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n#ifdef CONFIG_MMC\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) ||defined(CONFIG_PLATFORM_ARM_SUN7I)\n\tsw_mci_rescan_card(sdc_id, 0);\n#elif defined(CONFIG_PLATFORM_ARM_SUN8I)\n\tsunxi_mci_rescan_card(sdc_id, 0);\n#endif\n\tmdelay(100);\n\twifi_pm_power(0);\n\n\tDBG_871X(\"%s: remove card, power off.\\n\", __FUNCTION__);\n#endif // CONFIG_MMC\n}\n"
  },
  {
    "path": "platform/platform_ARM_SUNxI_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include <drv_types.h>\n\n#ifdef CONFIG_MMC_SUNXI_POWER_CONTROL\n#ifdef CONFIG_WITS_EVB_V13\n#define SDIOID\t0\n#else // !CONFIG_WITS_EVB_V13\n#define SDIOID (CONFIG_CHIP_ID==1123 ? 3 : 1)\n#endif // !CONFIG_WITS_EVB_V13\n\n#define SUNXI_SDIO_WIFI_NUM_RTL8189ES  10\nextern void sunximmc_rescan_card(unsigned id, unsigned insert);\nextern int mmc_pm_get_mod_type(void);\nextern int mmc_pm_gpio_ctrl(char* name, int level);\n/*\n *\trtl8189es_shdn\t= port:PH09<1><default><default><0>\n *\trtl8189es_wakeup\t= port:PH10<1><default><default><1>\n *\trtl8189es_vdd_en  = port:PH11<1><default><default><0>\n *\trtl8189es_vcc_en  = port:PH12<1><default><default><0>\n */\n\nint rtl8189es_sdio_powerup(void)\n{\n\tmmc_pm_gpio_ctrl(\"rtl8189es_vdd_en\", 1);\n\tudelay(100);\n\tmmc_pm_gpio_ctrl(\"rtl8189es_vcc_en\", 1);\n\tudelay(50);\n\tmmc_pm_gpio_ctrl(\"rtl8189es_shdn\", 1);\n\treturn 0;\n}\n\nint rtl8189es_sdio_poweroff(void)\n{\n\tmmc_pm_gpio_ctrl(\"rtl8189es_shdn\", 0);\n\tmmc_pm_gpio_ctrl(\"rtl8189es_vcc_en\", 0);\n\tmmc_pm_gpio_ctrl(\"rtl8189es_vdd_en\", 0);\n\treturn 0;\n}\n#endif // CONFIG_MMC_SUNXI_POWER_CONTROL\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers:\tpower on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n#ifdef CONFIG_MMC_SUNXI_POWER_CONTROL\n\tunsigned int mod_sel = mmc_pm_get_mod_type();\n#endif // CONFIG_MMC_SUNXI_POWER_CONTROL\n\n\n#ifdef CONFIG_MMC_SUNXI_POWER_CONTROL\n\tif (mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8189ES) {\n\t\trtl8189es_sdio_powerup();\n\t\tsunximmc_rescan_card(SDIOID, 1);\n\t\tprintk(\"[rtl8189es] %s: power up, rescan card.\\n\", __FUNCTION__);\n\t} else {\n\t\tret = -1;\n\t\tprintk(\"[rtl8189es] %s: mod_sel = %d is incorrect.\\n\", __FUNCTION__, mod_sel);\n\t}\n#endif // CONFIG_MMC_SUNXI_POWER_CONTROL\n\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n#ifdef CONFIG_MMC_SUNXI_POWER_CONTROL\n\tsunximmc_rescan_card(SDIOID, 0);\n#ifdef CONFIG_RTL8188E\n\trtl8189es_sdio_poweroff();\n\tprintk(\"[rtl8189es] %s: remove card, power off.\\n\", __FUNCTION__);\n#endif // CONFIG_RTL8188E\n#endif // CONFIG_MMC_SUNXI_POWER_CONTROL\n}\n"
  },
  {
    "path": "platform/platform_ARM_SUNxI_usb.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*\n * Description:\n *\tThis file can be applied to following platforms:\n *\tCONFIG_PLATFORM_ARM_SUNXI Series platform \n *\t\n */\n \n#include <drv_types.h>\n#include <mach/sys_config.h>\n\n#ifdef CONFIG_PLATFORM_ARM_SUNxI\nextern int sw_usb_disable_hcd(__u32 usbc_no);\nextern int sw_usb_enable_hcd(__u32 usbc_no);\nstatic int usb_wifi_host = 2;\n#endif\n\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\nextern int sw_usb_disable_hcd(__u32 usbc_no);\nextern int sw_usb_enable_hcd(__u32 usbc_no);\nextern void wifi_pm_power(int on);\nstatic script_item_u item;\n#endif\n\n#ifdef CONFIG_PLATFORM_ARM_SUN8I\nextern int sunxi_usb_disable_hcd(__u32 usbc_no);\nextern int sunxi_usb_enable_hcd(__u32 usbc_no);\nextern void wifi_pm_power(int on);\nstatic script_item_u item;\n#endif\n\n\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_PLATFORM_ARM_SUNxI\n#ifndef CONFIG_RTL8723A\n\t{\n\t\t/* ----------get usb_wifi_usbc_num------------- */\n\t\tret = script_parser_fetch(\"usb_wifi_para\", \"usb_wifi_usbc_num\", (int *)&usb_wifi_host, 64);\n\t\tif(ret != 0){\n\t\t\tDBG_8192C(\"ERR: script_parser_fetch usb_wifi_usbc_num failed\\n\");\n\t\t\tret = -ENOMEM;\n\t\t\tgoto exit;\n\t\t}\n\t\tDBG_8192C(\"sw_usb_enable_hcd: usbc_num = %d\\n\", usb_wifi_host);\n\t\tsw_usb_enable_hcd(usb_wifi_host);\n\t}\n#endif //CONFIG_RTL8723A\n#endif //CONFIG_PLATFORM_ARM_SUNxI\n\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\n\t{\n\t\tscript_item_value_type_e type;\n\n\t\ttype = script_get_item(\"wifi_para\", \"wifi_usbc_id\", &item);\n\t\tif(SCIRPT_ITEM_VALUE_TYPE_INT != type){\n\t\t\tprintk(\"ERR: script_get_item wifi_usbc_id failed\\n\");\n\t\t\tret = -ENOMEM;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tprintk(\"sw_usb_enable_hcd: usbc_num = %d\\n\", item.val);\n\t\twifi_pm_power(1);\n\t\tmdelay(10);\n\t\n\t\t#if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B))\n\t\tsw_usb_enable_hcd(item.val);\n\t\t#endif\n\t}\n#endif //defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\n\n#if defined(CONFIG_PLATFORM_ARM_SUN8I)\n\t{\n\t\tscript_item_value_type_e type;\n\n\t\ttype = script_get_item(\"wifi_para\", \"wifi_usbc_id\", &item);\n\t\tif(SCIRPT_ITEM_VALUE_TYPE_INT != type){\n\t\t\tprintk(\"ERR: script_get_item wifi_usbc_id failed\\n\");\n\t\t\tret = -ENOMEM;\n\t\t\tgoto exit;\n\t\t}\n\n\t\tprintk(\"sw_usb_enable_hcd: usbc_num = %d\\n\", item.val);\n\t\twifi_pm_power(1);\n\t\tmdelay(10);\n\t\n\t\t#if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B))\n\t\tsunxi_usb_enable_hcd(item.val);\n\t\t#endif\n\t}\n#endif //CONFIG_PLATFORM_ARM_SUN8I\n\nexit:\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n\n#ifdef CONFIG_PLATFORM_ARM_SUNxI\n#ifndef CONFIG_RTL8723A\n\tDBG_8192C(\"sw_usb_disable_hcd: usbc_num = %d\\n\", usb_wifi_host);\n\tsw_usb_disable_hcd(usb_wifi_host);\n#endif //ifndef CONFIG_RTL8723A\n#endif\t//CONFIG_PLATFORM_ARM_SUNxI\n\n#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\n\t#if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B))\n\tsw_usb_disable_hcd(item.val);\n\t#endif\n\twifi_pm_power(0);\n#endif //defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)\n\n#if defined(CONFIG_PLATFORM_ARM_SUN8I)\n\t#if !(defined(CONFIG_RTL8723A)) && !(defined(CONFIG_RTL8723B))\n\tsunxi_usb_disable_hcd(item.val);\n\t#endif\n\twifi_pm_power(0);\n#endif //defined(CONFIG_PLATFORM_ARM_SUN8I) \n\n}\n\n"
  },
  {
    "path": "platform/platform_ARM_WMT_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include <drv_types.h>\n#include <mach/wmt_iomux.h>\n#include <linux/gpio.h>\n\nextern void wmt_detect_sdio2(void);\nextern void force_remove_sdio2(void);\n\nint platform_wifi_power_on(void)\n{\n\tint err = 0;\n\terr = gpio_request(WMT_PIN_GP62_SUSGPIO1, \"wifi_chip_en\");\n\tif (err < 0){\n\t\tprintk(\"request gpio for rtl8188eu failed!\\n\");\n\t\treturn err;\n\t}\n\tgpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 0);//pull sus_gpio1 to 0 to open vcc_wifi.\n\tprintk(\"power on rtl8189.\\n\");\n\tmsleep(500);\n\twmt_detect_sdio2();\n\tprintk(\"[rtl8189es] %s: new card, power on.\\n\", __FUNCTION__);\n\treturn err;\n}\n\nvoid platform_wifi_power_off(void)\n{\n\tforce_remove_sdio2();\n\n\tgpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 1);//pull sus_gpio1 to 1 to close vcc_wifi.\n\tprintk(\"power off rtl8189.\\n\");\n\tgpio_free(WMT_PIN_GP62_SUSGPIO1);\n\tprintk(\"[rtl8189es] %s: remove card, power off.\\n\", __FUNCTION__);\n}\n"
  },
  {
    "path": "platform/platform_RTK_DMP_usb.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include <drv_types.h>\n\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\tu32 tmp;\n\ttmp=readl((volatile unsigned int*)0xb801a608);\n\ttmp &= 0xffffff00;\n\ttmp |= 0x55;\n\twritel(tmp,(volatile unsigned int*)0xb801a608);//write dummy register for 1055\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n}\n\n"
  },
  {
    "path": "platform/platform_arm_act_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n/*\n * Description:\n *\tThis file can be applied to following platforms:\n *    CONFIG_PLATFORM_ACTIONS_ATM703X\n */\n#include <drv_types.h>\n\n#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X\nextern int acts_wifi_init(void);\nextern void acts_wifi_cleanup(void);\n#endif\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers: power on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X\n\tret = acts_wifi_init();\n\tif (unlikely(ret < 0)) {\n\t\tpr_err(\"%s Failed to register the power control driver.\\n\", __FUNCTION__);\n\t\tgoto exit;\n\t}\n#endif\n\nexit:\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n#ifdef CONFIG_PLATFORM_ACTIONS_ATM705X\n\tacts_wifi_cleanup();\n#endif\n}\n"
  },
  {
    "path": "platform/platform_ops.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef CONFIG_PLATFORM_OPS\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers: power on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n}\n#endif // !CONFIG_PLATFORM_OPS\n"
  },
  {
    "path": "platform/platform_ops.h",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#ifndef __PLATFORM_OPS_H__\n#define __PLATFORM_OPS_H__\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers: power on failed\n */\nint platform_wifi_power_on(void);\nvoid platform_wifi_power_off(void);\n\n#endif // __PLATFORM_OPS_H__\n"
  },
  {
    "path": "platform/platform_sprd_sdio.c",
    "content": "/******************************************************************************\n *\n * Copyright(c) 2013 Realtek Corporation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of version 2 of the GNU General Public License as\n * published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\n *\n *\n ******************************************************************************/\n#include <drv_types.h>\n\nextern void sdhci_bus_scan(void);\n#ifndef ANDROID_2X\nextern int sdhci_device_attached(void);\n#endif\n\n/*\n * Return:\n *\t0:\tpower on successfully\n *\tothers:\tpower on failed\n */\nint platform_wifi_power_on(void)\n{\n\tint ret = 0;\n\n\n#ifdef CONFIG_RTL8188E\n\trtw_wifi_gpio_wlan_ctrl(WLAN_POWER_ON);\n#endif // CONFIG_RTL8188E\n\n\t/* Pull up pwd pin, make wifi leave power down mode. */\n\trtw_wifi_gpio_init();\n\trtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_ON);\n\n#if (MP_DRIVER == 1) && (defined(CONFIG_RTL8723A)||defined(CONFIG_RTL8723B))\n\t// Pull up BT reset pin.\n\trtw_wifi_gpio_wlan_ctrl(WLAN_BT_PWDN_ON);\n#endif\n\trtw_mdelay_os(5);\n\n\tsdhci_bus_scan();\n#ifdef CONFIG_RTL8723B\n\t//YJ,test,130305\n\trtw_mdelay_os(1000);\n#endif\n#ifdef ANDROID_2X\n\trtw_mdelay_os(200);\n#else // !ANDROID_2X\n\tif (1) {\n\t\tint i = 0;\n\n\t\tfor (i = 0; i <= 50; i++) {\n\t\t\tmsleep(10);\n\t\t\tif (sdhci_device_attached())\n\t\t\t\tbreak;\n\t\t\tprintk(\"%s delay times:%d\\n\", __func__, i);\n\t\t}\n\t}\n#endif // !ANDROID_2X\n\n\treturn ret;\n}\n\nvoid platform_wifi_power_off(void)\n{\n\t/* Pull down pwd pin, make wifi enter power down mode. */\n\trtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_OFF);\n\trtw_mdelay_os(5);\n\trtw_wifi_gpio_deinit();\n\n#ifdef CONFIG_RTL8188E\n\trtw_wifi_gpio_wlan_ctrl(WLAN_POWER_OFF);\n#endif // CONFIG_RTL8188E\n\n#ifdef CONFIG_WOWLAN\n\tif(mmc_host)\n\t\tmmc_host->pm_flags &= ~MMC_PM_KEEP_POWER;\n#endif // CONFIG_WOWLAN\n}\n"
  },
  {
    "path": "runwpa",
    "content": "#!/bin/bash\n\nif [ \"`which iwconfig`\" = \"\" ] ; then \n\techo \"WARNING:Wireless tool not exist!\"\n\techo \"        Please install it!\"\n\texit\nelse\n\tif [ `uname -r | cut -d. -f2` -eq 4 ]; then\n\t\twpa_supplicant -D ipw -c wpa1.conf -i wlan0\t\n\telse\n\tif [ `iwconfig -v |awk '{print $4}' | head -n 1` -lt  18 ] ; then\n\t\twpa_supplicant -D ipw -c wpa1.conf -i wlan0  \n\telse\t  \n\t\twpa_supplicant -D wext -c wpa1.conf -i wlan0 \n\tfi\n\n\tfi\nfi\n\n\n"
  },
  {
    "path": "wlan0dhcp",
    "content": "#!/bin/bash\n\nvar0=`ps aux|awk '/dhclient wlan0/'|awk '$11!=\"awk\"{print $2}'`\n\nkill $var0\ncp ifcfg-wlan0 /etc/sysconfig/network-scripts/\n\ndhclient wlan0\n\nvar1=`ifconfig wlan0 |awk '/inet/{print $2}'|awk -F: '{print $2}'`\n\n\nrm -f /etc/sysconfig/network-scripts/ifcfg-wlan0\n\necho \"get ip: $var1\"\n\n"
  }
]